package net.lomeli.ec.core.handler;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.monster.EntityCreeper;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.nbt.NBTTagString;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.DamageSource;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.StatCollector;
import net.minecraftforge.event.entity.living.LivingDeathEvent;
import net.minecraftforge.event.entity.living.LivingHurtEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.lomeli.lomlib.util.LangUtil;
import net.lomeli.lomlib.util.EntityUtil;
import net.lomeli.ec.ElementalCreepers;
import net.lomeli.ec.client.CreeperEntry;
import net.lomeli.ec.entity.*;
import net.lomeli.ec.lib.ModVars;
public class EventHandler {
@SubscribeEvent
public void entityHurt(LivingHurtEvent event) {
EntityLivingBase entity = event.entityLiving;
DamageSource source = event.source;
if (entity != null && source != null) {
if (entity instanceof EntitySpringCreeper) {
EntitySpringCreeper creeper = (EntitySpringCreeper) entity;
if (source == DamageSource.fall && creeper.isSprung() && !creeper.worldObj.isRemote) {
creeper.worldObj.createExplosion(creeper, creeper.posX, creeper.posY - 2, creeper.posZ, creeper.getExplosionRadius() * ((event.ammount < 6 ? 6 : event.ammount) / 6), creeper.worldObj.getGameRules().getBoolean("mobGriefing"));
creeper.setDead();
}
}
}
}
@SubscribeEvent
public void onEntityDeath(LivingDeathEvent event) {
boolean activate = EntityUtil.damageFromPlayer(event.source);
Entity source = EntityUtil.getSourceOfDamage(event.source);
if (activate && event.entityLiving != null && (event.entityLiving instanceof EntityCreeper || event.entityLiving instanceof EntityFriendlyCreeper || event.entityLiving instanceof EntityBigBadCreep)) {
if (source instanceof EntityPlayer && registerCreep((EntityPlayer) source, event.entityLiving.getClass()))
((EntityPlayer) source).addChatComponentMessage(new ChatComponentText(String.format(EnumChatFormatting.GREEN + StatCollector.translateToLocal("book.entry.newEntry"), event.entityLiving.getName())));
if (!(event.entityLiving instanceof EntityGhostCreeper) && !(event.entityLiving instanceof EntityFriendlyCreeper)) {
if (event.entityLiving instanceof IIllusion) {
if (((IIllusion) event.entityLiving).isIllusion())
return;
}
if (event.entityLiving.worldObj.rand.nextInt(100) < ModVars.ghostCreeperChance) {
EntityGhostCreeper ghost = new EntityGhostCreeper(event.entityLiving.worldObj);
ghost.setLocationAndAngles(event.entityLiving.posX, event.entityLiving.posY, event.entityLiving.posZ, event.entityLiving.rotationYaw, event.entityLiving.rotationPitch);
event.entityLiving.worldObj.spawnEntityInWorld(ghost);
}
}
}
}
private boolean registerCreep(EntityPlayer player, Class<? extends Entity> creep) {
ItemStack stack = null;
int slot = -1;
for (int i = 0; i < player.inventory.getSizeInventory(); i++) {
ItemStack item = player.inventory.getStackInSlot(i);
if (item != null && item.getItem() == ElementalCreepers.creepapedia) {
stack = item;
slot = i;
break;
}
}
if (stack != null) {
NBTTagCompound tag = new NBTTagCompound();
if (stack.hasTagCompound())
tag = stack.getTagCompound();
NBTTagList list = new NBTTagList();
boolean flag = true;
if (tag.hasKey("creepers", 9)) {
list = tag.getTagList("creepers", 8);
for (int i = 0; i < list.tagCount(); i++) {
String clazzString = ((NBTTagString) list.get(i)).getString();
if (clazzString.equals(creep.getCanonicalName())) {
flag = false;
break;
}
}
}
if (flag)
list.appendTag(new NBTTagString(creep.getCanonicalName()));
tag.setTag("creepers", list);
stack.setTagCompound(tag);
player.inventory.setInventorySlotContents(slot, stack);
if (!tag.getBoolean("complete") && list.tagCount() >= CreeperEntry.entryList.size()) {
tag.setBoolean("complete", true);
player.addChatComponentMessage(new ChatComponentText(LangUtil.translate("book.entry.allentries")));
}
return flag;
}
return false;
}
}