package aroma1997.betterchests.upgrades.impl; import gnu.trove.map.TObjectIntMap; import gnu.trove.map.hash.TObjectIntHashMap; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.passive.EntityAnimal; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.DamageSource; import net.minecraft.util.EntityDamageSource; import net.minecraft.util.math.AxisAlignedBB; import aroma1997.betterchests.Config; import aroma1997.betterchests.api.IUpgradableBlock; import aroma1997.betterchests.api.UpgradableBlockType; import aroma1997.betterchests.api.UpgradeHelper; import aroma1997.betterchests.upgrades.BasicUpgrade; import aroma1997.betterchests.upgrades.DummyUpgradeType; import static aroma1997.betterchests.upgrades.impl.UpgradeBreeding.RADIUS; public class UpgradeKilling extends BasicUpgrade { private static final String DAMAGE_DESC = "betterchests:damagesource.killingUpgrade"; private static final DamageSource DAMAGE_SOURCE = new DamageSource(DAMAGE_DESC); private static final int ANIMALS_TO_KEEP_ALIVE = 2; public UpgradeKilling() { super(true, 1, new UpgradableBlockType[]{UpgradableBlockType.CHEST, UpgradableBlockType.BARREL}); } @Override public void update(IUpgradableBlock chest, ItemStack stack) { if (UpgradeHelper.INSTANCE.getFrequencyTick(chest, stack, 100) != 0) { return; } AxisAlignedBB bb = new AxisAlignedBB(chest.getPosition()).grow(RADIUS); TObjectIntMap<Class<? extends EntityLiving>> map = new TObjectIntHashMap<>(); for (EntityLiving entity : chest.getWorldObj().getEntitiesWithinAABB(EntityLiving.class, bb)) { if (entity.isDead) { continue; } if (entity instanceof EntityAnimal) { EntityAnimal animal = (EntityAnimal) entity; if (entity.isChild()) { continue; } int currentAnimals = map.get(animal.getClass()); if (currentAnimals < ANIMALS_TO_KEEP_ALIVE) { map.put(animal.getClass(), currentAnimals + 1); continue; } } if (hasUpgradeOperationCost(chest)) { EntityPlayer source = null; if (chest.isUpgradeInstalled(DummyUpgradeType.AI.getStack())) { source = chest.getFakePlayer(); } entity.attackEntityFrom(getDamageSource(source), 10); drawUpgradeOperationCode(chest); } } } public static DamageSource getDamageSource(EntityPlayer source) { return source == null ? DAMAGE_SOURCE : new EntityDamageSource(DAMAGE_DESC, source); } @Override public int getUpgradeOperationCost() { return Config.INSTANCE.energyKilling; } }