Jump to content

[1.11.2][Unsolved]Getting Villagers to Avoid a Certain Player


Recommended Posts

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);
        }
    }
}

 

Link to comment
Share on other sites

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);
        }
    }
}

 

 

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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	


 

Link to comment
Share on other sites

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.