Posted May 5, 20178 yr I am working on a way to get villagers to run away from players that have a villager rep lower than negative 5. Currently, I am using a variation of entityAIAvoidEntity class, I've almost everything done except on how to recognize said hostile player. I get an error if I use <T>getEntitiesWithinAABB as the original code has and I can't find an alternative. Secondly, how to get a players name to compare with the villageObj's rep? import com.google.common.base.Predicate; import com.google.common.base.Predicates; import java.util.List; import javax.annotation.Nullable; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityCreature; import net.minecraft.entity.ai.EntityAIBase; import net.minecraft.entity.ai.RandomPositionGenerator; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.pathfinding.Path; import net.minecraft.pathfinding.PathNavigate; import net.minecraft.util.EntitySelectors; import net.minecraft.util.math.Vec3d; import net.minecraft.village.Village; public class VillagerAvoidEvilPlayer<T extends Entity> extends EntityAIBase { private final Predicate<Entity> canBeSeenSelector; /** The entity we are attached to */ protected EntityCreature theEntity; private final double farSpeed; private final double nearSpeed; protected T closestLivingEntity; protected Village villageObj; private final float avoidDistance; /** The PathEntity of our entity */ private Path entityPathEntity; /** The PathNavigate of our entity */ private final PathNavigate entityPathNavigate; /** Class of entity this behavior seeks to avoid */ private final Class<EntityPlayer> classToAvoid; private final Predicate <? super T > avoidTargetSelector; public VillagerAvoidEvilPlayer(EntityCreature theEntityIn, float avoidDistanceIn, double farSpeedIn, double nearSpeedIn, Village villageobj) { this(theEntityIn, EntityPlayer.class, Predicates.<T>alwaysTrue(), avoidDistanceIn, farSpeedIn, nearSpeedIn, villageobj); } public VillagerAvoidEvilPlayer(EntityCreature theEntityIn, Class<EntityPlayer> classToAvoidIn, Predicate <? super T > avoidTargetSelectorIn, float avoidDistanceIn, double farSpeedIn, double nearSpeedIn, Village villageobj) { this.canBeSeenSelector = new Predicate<Entity>() { public boolean apply(@Nullable Entity p_apply_1_) { return p_apply_1_.isEntityAlive() && VillagerAvoidEvilPlayer.this.theEntity.getEntitySenses().canSee(p_apply_1_) && !VillagerAvoidEvilPlayer.this.theEntity.isOnSameTeam(p_apply_1_); } }; this.theEntity = theEntityIn; this.classToAvoid = classToAvoidIn; this.avoidTargetSelector = avoidTargetSelectorIn; this.avoidDistance = avoidDistanceIn; this.farSpeed = farSpeedIn; this.villageObj = villageobj; this.nearSpeed = nearSpeedIn; this.entityPathNavigate = theEntityIn.getNavigator(); this.setMutexBits(1); } /** * Returns whether the EntityAIBase should begin execution. */ public boolean shouldExecute() { List<T> list = this.theEntity.world.<T>getEntitiesWithinAABB(this.classToAvoid, this.theEntity.getEntityBoundingBox().expand((double)this.avoidDistance, 3.0D, (double)this.avoidDistance), Predicates.and(new Predicate[] {EntitySelectors.CAN_AI_TARGET, this.canBeSeenSelector, this.avoidTargetSelector})); //Issue here if (this.villageObj.getPlayerReputation(this.classToAvoid.) < -5){ //Issue here if (list.isEmpty()) { return false; } else { this.closestLivingEntity = list.get(0); Vec3d vec3d = RandomPositionGenerator.findRandomTargetBlockAwayFrom(this.theEntity, 16, 7, new Vec3d(this.closestLivingEntity.posX, this.closestLivingEntity.posY, this.closestLivingEntity.posZ)); if (vec3d == null) { return false; } else if (this.closestLivingEntity.getDistanceSq(vec3d.xCoord, vec3d.yCoord, vec3d.zCoord) < this.closestLivingEntity.getDistanceSqToEntity(this.theEntity)) { return false; } else { this.entityPathEntity = this.entityPathNavigate.getPathToXYZ(vec3d.xCoord, vec3d.yCoord, vec3d.zCoord); return this.entityPathEntity != null; } } } else { return false; } } /** * Returns whether an in-progress EntityAIBase should continue executing */ public boolean continueExecuting() { return !this.entityPathNavigate.noPath(); } /** * Execute a one shot task or start executing a continuous task */ public void startExecuting() { this.entityPathNavigate.setPath(this.entityPathEntity, this.farSpeed); } /** * Resets the task */ public void resetTask() { this.closestLivingEntity = null; } /** * Updates the task */ public void updateTask() { if (this.theEntity.getDistanceSqToEntity(this.closestLivingEntity) < 49.0D) { this.theEntity.getNavigator().setSpeed(this.nearSpeed); } else { this.theEntity.getNavigator().setSpeed(this.farSpeed); } } }
May 6, 20178 yr Author Okay, I've made the necessary changes but the villagers don't seem to run away from me when testing after murdering enough villagers next to a bunch of "houses". I made a println after the worldisremote check but it doesn't println anything. public class VillagerAvoidEvilPlayer<T extends Entity> extends EntityAIBase { private final Predicate<Entity> canBeSeenSelector; /** The entity we are attached to */ protected EntityCreature theEntity; private final double farSpeed; private final double nearSpeed; protected EntityPlayer closestLivingEntity; protected Village villageObj; private final float avoidDistance; /** The PathEntity of our entity */ private Path entityPathEntity; /** The PathNavigate of our entity */ private final PathNavigate entityPathNavigate; /** Class of entity this behavior seeks to avoid */ private final Class<EntityPlayer> classToAvoid; private final Predicate <? super T > avoidTargetSelector; public VillagerAvoidEvilPlayer(EntityCreature theEntityIn, float avoidDistanceIn, double farSpeedIn, double nearSpeedIn, Village villageobj) { this(theEntityIn, EntityPlayer.class, Predicates.<T>alwaysTrue(), avoidDistanceIn, farSpeedIn, nearSpeedIn, villageobj); } public VillagerAvoidEvilPlayer(EntityCreature theEntityIn, Class<EntityPlayer> classToAvoidIn, Predicate <? super T > avoidTargetSelectorIn, float avoidDistanceIn, double farSpeedIn, double nearSpeedIn, Village villageobj) { this.canBeSeenSelector = new Predicate<Entity>() { public boolean apply(@Nullable Entity p_apply_1_) { return p_apply_1_.isEntityAlive() && VillagerAvoidEvilPlayer.this.theEntity.getEntitySenses().canSee(p_apply_1_) && !VillagerAvoidEvilPlayer.this.theEntity.isOnSameTeam(p_apply_1_); } }; this.theEntity = theEntityIn; this.classToAvoid = classToAvoidIn; this.avoidTargetSelector = avoidTargetSelectorIn; this.avoidDistance = avoidDistanceIn; this.farSpeed = farSpeedIn; this.villageObj = villageobj; this.nearSpeed = nearSpeedIn; this.entityPathNavigate = theEntityIn.getNavigator(); this.setMutexBits(1); } /** * Returns whether the EntityAIBase should begin execution. */ public boolean shouldExecute() { List<EntityPlayer> list = this.theEntity.world.<EntityPlayer>getEntitiesWithinAABB(this.classToAvoid, this.theEntity.getEntityBoundingBox().expand((double)this.avoidDistance, 3.0D, (double)this.avoidDistance), Predicates.and(new Predicate[] {EntitySelectors.CAN_AI_TARGET, this.canBeSeenSelector, this.avoidTargetSelector})); if (list.isEmpty()) { return false; } else { if (this.theEntity.world.isRemote == false){ System.out.println(this.villageObj.getPlayerReputation(this.classToAvoid.getName())); //This does not print. if (this.villageObj.getPlayerReputation(this.classToAvoid.getName()) < -8){ this.closestLivingEntity = list.get(0); Vec3d vec3d = RandomPositionGenerator.findRandomTargetBlockAwayFrom(this.theEntity, 16, 7, new Vec3d(this.closestLivingEntity.posX, this.closestLivingEntity.posY, this.closestLivingEntity.posZ)); if (vec3d == null) { return false; } else if (this.closestLivingEntity.getDistanceSq(vec3d.xCoord, vec3d.yCoord, vec3d.zCoord) < this.closestLivingEntity.getDistanceSqToEntity(this.theEntity)) { return false; } else { this.entityPathEntity = this.entityPathNavigate.getPathToXYZ(vec3d.xCoord, vec3d.yCoord, vec3d.zCoord); return this.entityPathEntity != null; } } else{ return false; } } else { return false; } } } /** * Returns whether an in-progress EntityAIBase should continue executing */ public boolean continueExecuting() { return !this.entityPathNavigate.noPath(); } /** * Execute a one shot task or start executing a continuous task */ public void startExecuting() { this.entityPathNavigate.setPath(this.entityPathEntity, this.farSpeed); } /** * Resets the task */ public void resetTask() { this.closestLivingEntity = null; } /** * Updates the task */ public void updateTask() { if (this.theEntity.getDistanceSqToEntity(this.closestLivingEntity) < 49.0D) { this.theEntity.getNavigator().setSpeed(this.nearSpeed); } else { this.theEntity.getNavigator().setSpeed(this.farSpeed); } } }
May 6, 20178 yr Author I tried to use the debugger but I get "URLClassPath.check(URL)line: not available" error and then the debugger tries to go through all of the null pointer exceptions with that.
May 7, 20178 yr Author 14 hours ago, diesieben07 said: Where do you get that error? What do you mean by " the debugger tries to go through all of the null pointer exceptions with that"? I get said that nullpoinerexception when starting up MC and at "[14:16:24] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.relauncher.CoreModManager$FMLPluginWrapper" I get that error, I press resume and I get that same error and it highlights arg0 and java.net.url = random numbers that go up (76, then 92, etc) everytime I press resume. I'll try to get a screen shot.
May 7, 20178 yr Author 6 minutes ago, diesieben07 said: Why did you put a breakpoint there then? Put a breakpoint on the first line of shouldExecute, nowhere else. I did not put any breakpoints outside of shouldExecute(), I checked the breakpoint tab to confirm this. I did a copy stack and got the error list, Thread [main] (Suspended (exception NullPointerException)) URLClassPath.check(URL) line: not available URLClassPath$Loader.findResource(String, boolean) line: not available URLClassPath.findResource(String, boolean) line: not available URLClassLoader$2.run() line: not available URLClassLoader$2.run() line: not available AccessController.doPrivileged(PrivilegedAction<T>, AccessControlContext) line: not available [native method] LaunchClassLoader(URLClassLoader).findResource(String) line: not available LaunchClassLoader(ClassLoader).getResource(String) line: not available LaunchClassLoader(URLClassLoader).getResourceAsStream(String) line: not available Class<T>.getResourceAsStream(String) line: not available ClassPatchManager.setup(Side) line: 173 FMLSanityChecker.injectData(Map<String,Object>) line: 188 CoreModManager$FMLPluginWrapper.injectIntoClassLoader(LaunchClassLoader) line: 165 Launch.launch(String[]) line: 115 Launch.main(String[]) line: 28 NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method] NativeMethodAccessorImpl.invoke(Object, Object[]) line: not available DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: not available Method.invoke(Object, Object...) line: not available GradleStart(GradleStartCommon).launch(String[]) line: 97 GradleStart.main(String[]) line: 26
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.