package choonster.testmod3.entity; import net.minecraft.entity.ai.EntityAIAvoidEntity; import net.minecraft.entity.ai.EntityAINearestAttackableTarget; import net.minecraft.entity.monster.EntityCreeper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.world.World; import javax.annotation.Nullable; /** * A creeper that avoids players holding an item in their off hand. * <p> * Test for this thread: * http://www.minecraftforum.net/forums/mapping-and-modding/minecraft-mods/modification-development/2782263-how-to-make-a-creeper-avoid-certain-players * * @author Choonster */ public class EntityPlayerAvoidingCreeper extends EntityCreeper { public EntityPlayerAvoidingCreeper(World worldIn) { super(worldIn); } @Override protected void initEntityAI() { super.initEntityAI(); // Remove the EntityAINearestAttackableTarget task added by EntityCreeper so it can be replaced targetTasks.taskEntries.stream() .filter(taskEntry -> taskEntry.action instanceof EntityAINearestAttackableTarget) .findFirst() .ifPresent(taskEntry -> targetTasks.removeTask(taskEntry.action)); // Avoid players if they have an item in their off hand tasks.addTask(3, new EntityAIAvoidEntity<>(this, EntityPlayer.class, this::shouldAvoidPlayer, 6.0F, 1.0D, 1.2D)); // Only attack players without an item in their off hand targetTasks.addTask(1, new EntityAINearestAttackableTarget<>(this, EntityPlayer.class, 10, true, false, (player) -> !shouldAvoidPlayer(player))); } /** * Should this creeper avoid the specified player? * * @param player The player * @return True if the player has an item in their off hand */ private boolean shouldAvoidPlayer(@Nullable EntityPlayer player) { return player != null && !player.getHeldItemOffhand().isEmpty(); } }