Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Posted

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

 

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

 

 

  • 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.

  • 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.

  • 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.

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...

Important Information

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.