package net.minecraftforge.test; import com.google.common.base.Predicate; import net.minecraft.command.ICommandSender; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.util.math.Vec3d; import net.minecraft.util.text.TextComponentString; import net.minecraftforge.fml.common.IEntitySelectorFactory; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.registry.GameRegistry; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.Collections; import java.util.List; import java.util.Map; /** * You can verify that this test is working fine by following these steps. * Spawn a few cows and a few sheep and then use "/kill @e[forge:min_health=!10]" * All entities with less than 10 health points (current, not max) should die. * This should include the sheep, but not the (healthy) cows. * */ @Mod(modid = "customentityselectortest", name = "Custom Entity Selector Test", version = "1.0", acceptableRemoteVersions = "*") public class CustomEntitySelectorTest { @Mod.EventHandler public void init(FMLInitializationEvent event) { GameRegistry.registerEntitySelector(new EntitySelectorFactory(), "forge:min_health"); } private class EntitySelectorFactory implements IEntitySelectorFactory { @Nonnull @Override public List<Predicate<Entity>> createPredicates(Map<String, String> arguments, String mainSelector, ICommandSender sender, Vec3d position) { String health = arguments.get("forge:min_health"); //If our selector is used in this command create a Predicate otherwise return an empty list. if (health != null) { final boolean invert = health.startsWith("!"); if (invert) { health = health.substring(1); } try { final int value = Integer.parseInt(health); //Return a list of predicates. All these predicates have to apply for any entity to be selected. return Collections.<Predicate<Entity>>singletonList(new Predicate<Entity>() { @Override public boolean apply(@Nullable Entity input) { if (!(input instanceof EntityLivingBase)) return false; return (((EntityLivingBase) input).getHealth() >= value)!=invert; } }); } catch (NumberFormatException e) { sender.sendMessage(new TextComponentString("Entity selector 'forge:min_health' has to be an integer")); } } return Collections.emptyList(); } } }