[TUT] Making a LivingEntity walk to a specific tile.

Discussion in 'Resources' started by Ivan, Apr 3, 2013.

Thread Status:
Not open for further replies.
  1. Offline


    That looks pretty wierd, I've tried it :p
  2. Offline


    through lots of trying out new things i cant get pig zombies to walk to tiles, also, when i remove all the pathfinding goals from a pig zombie, they still seem to wander around. but very slowly, unlike zombies that just sit facing the same direction and stay in a big bunch.
  3. Offline


    Try this in yuor custom Zombie class:
    1. @Override
    2. public boolean bk() {
    3. return false;
    4. }

    It works with bats for me.
  4. Offline


  5. Offline

    ZeusAllMighty11 Retired Staff

    For anyone that has an issue where their mob will attempt to move every couple moments as opposed to constantly move to the tile, on the tick boolean (I believe it's tick?) set it to true, but above that make sure to call the navigate method.
  6. Offline


    is there i way i could use thes to check if a moch CAN walk to ta tile
  7. Offline


    Okay I'm a little confused...
    I'm getting an error that UnsafeList isn't the correct type for the field.
    See here

    1. package de.apfel.npc;
    3. import java.lang.reflect.Field;
    5. import org.bukkit.craftbukkit.v1_7_R3.util.UnsafeList;
    7. import net.minecraft.server.v1_7_R3.EntityInsentient;
    8. import net.minecraft.server.v1_7_R3.EntityVillager;
    9. import net.minecraft.server.v1_7_R3.PathfinderGoalLookAtPlayer;
    10. import net.minecraft.server.v1_7_R3.World;
    12. public class CustomVillager extends EntityVillager {
    14. public CustomVillager(World w, int job) {
    15. super(w,job);
    17. try{
    19. Field gsa = net.minecraft.server.v1_7_R3.PathfinderGoalSelector.class.getDeclaredField("a");
    20. gsa.setAccessible(true);
    22. gsa.set(this.goalSelector, new UnsafeList());
    24. } catch (SecurityException e) {
    25. e.printStackTrace();
    26. } catch (NoSuchFieldException e) {
    27. e.printStackTrace();
    28. e.printStackTrace();
    29. } catch (IllegalAccessException e) {
    30. e.printStackTrace();
    31. }
    33. this.goalSelector.a(10, new PathfinderGoalLookAtPlayer(this, EntityInsentient.class, 8.0F));
    34. }
    35. }

    This is the whole class.
    I'm just trying to remove everything except for the villager to look at the player.

    I hope someone knows why it doesn't accept UnsafeList.

  8. Offline


    Nixodas In your error log it says that net.minecraft.server.v1_7_R3.PathfinderGoalSelector.a is an (final) logger field and not an unsafe list. Maybe the obfuscation changed and the field you are looking for has another name?
  9. Offline


    I also thought so but
    1. this.goalSelector.a(...)

    doesn't throw any errors.

    And it's the same field I'm editing, right?
    Or did I mix something up?
  10. Offline


    Nixodas Maybe. I do not know what "this.goalSelector" is. It could be another type then "net.minecraft.server.v1_7_R3.PathfinderGoalSelector". Do you checked that?

    Nixodas But wait... I think in your reflection you call the field(!) a and in your last line you call a method(!). Maybe that is the problem?

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
    Last edited by a moderator: May 31, 2016
  11. Offline


    It's the method called in the original EntityVillager class to add the diffrent pathfinders, which is inherited to my CustomVillager class and the NMS says it's of the type PathfingerGoalSelector

    sorry I saw the second post to late.
    And yes I just looked it up the obfuscation changed it.
    Stupid me just looked up if it still contains a field a, not if it is the correct type ^^

    Thank you very much


    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
    Last edited by a moderator: May 31, 2016
  12. Offline


    Nixodas I am happy that I could help somehow :D
  13. How can I make the entity walk along a path?
  14. Offline


    What tick boolean are you referencing? Can anyone else help me with them not constantly walking to the tile?
    Here's my code:

    public class PathfinderGoalMoveToBlock extends PathfinderGoal {
    private float speed;
    private EntityCreature entitycreature;
    private PathEntity path;
    private World world;
    private double x;
    private double y;
    private double z;
    public PathfinderGoalMoveToBlock(EntityCreature entitycreature, float speed, Location location) {
    this.speed = speed;
    this.entitycreature = entitycreature;
    this.world = location.getWorld();
    this.x = location.getX();
    this.y = location.getY();
    this.z = location.getZ();
    public boolean a() {
    Location targetLocation = new Location(world, x, y, z);
    boolean flag = this.entitycreature.getNavigation().c();
    this.path = this.entitycreature.getNavigation().a(targetLocation.getX(), targetLocation.getY(), targetLocation.getZ());
    return this.path != null;
    public void c() { 
    this.entitycreature.getNavigation().a(this.path, (double) this.speed);
  15. Offline


    Can you make an example. I dont know how i could make the EntityZombie move or even spawn now
  16. Offline


    If you're still interested, hit me up through PM and I'll help you out, and will aswell update the topic with the current NMS variables
  17. Offline


    Awesome tutorial, but I have just one question. What would a good speed be? What is the float value for the speed at which a zombie or a skeleton walks or runs?
  18. Offline


  19. Offline


    I have written both a custom entity and custom pathGoal class. I can get the custom entity to spawn and despawn correctly. However all it does is stand there saying moo. The PathGoal class is a modified version of PathGoalFollowOwner class. Here is the code for both classes:
    CustomEntityCow (open)

    package me.grandpamizery;
    import java.lang.reflect.Field;
    import org.bukkit.craftbukkit.v1_8_R1.util.UnsafeList;
    import org.bukkit.entity.Player;
    import net.minecraft.server.v1_8_R1.EntityCow;
    import net.minecraft.server.v1_8_R1.GenericAttributes;
    import net.minecraft.server.v1_8_R1.Navigation;
    import net.minecraft.server.v1_8_R1.PathfinderGoalFloat;
    import net.minecraft.server.v1_8_R1.PathfinderGoalRandomStroll;
    import net.minecraft.server.v1_8_R1.PathfinderGoalSelector;
    import net.minecraft.server.v1_8_R1.World;
    public class CustomEntityCow extends EntityCow {
        private final Player owner;
        public CustomEntityCow(World world, Player player) {
            this.owner = player;
            this.ageLocked = true;
            try {
                Field bField = PathfinderGoalSelector.class.getDeclaredField("b");
                Field cField = PathfinderGoalSelector.class.getDeclaredField("c");
                bField.set(goalSelector, new UnsafeList<PathfinderGoalSelector>());
                bField.set(targetSelector, new UnsafeList<PathfinderGoalSelector>());
                cField.set(goalSelector, new UnsafeList<PathfinderGoalSelector>());
                cField.set(targetSelector, new UnsafeList<PathfinderGoalSelector>());
            } catch (Exception exc) {
            a(0.9F, 1.3F);
            this.goalSelector.a(0, new PathfinderGoalFloat(this));
            this.goalSelector.a(1, new PetGoalFollowOwner(this, 1.0D, 10.0F, 2.0F));
            this.goalSelector.a(2, new PathfinderGoalRandomStroll(this, 1.0D));
        protected void aW() {
        public Player getOwner() {
            return owner;
        public boolean isBaby() {
            return true;

    PetGoalFollowOwner (open)

    package me.grandpamizery;
    import net.minecraft.server.v1_8_R1.BlockPosition;
    import net.minecraft.server.v1_8_R1.EntityLiving;
    import net.minecraft.server.v1_8_R1.MathHelper;
    import net.minecraft.server.v1_8_R1.Navigation;
    import net.minecraft.server.v1_8_R1.NavigationAbstract;
    import net.minecraft.server.v1_8_R1.PathfinderGoal;
    import net.minecraft.server.v1_8_R1.World;
    import org.bukkit.craftbukkit.v1_8_R1.entity.CraftPlayer;
    public class PetGoalFollowOwner extends PathfinderGoal{
        private CustomEntityCow pet;                   //d
        private EntityLiving owner;                    //e
        World world;                                   //a
        private double start;                          //f
        private NavigationAbstract nav;                //g
        private int h;                                 //h
        float teleport;                                //b
        float stop;                                    //c
        private boolean i;                             //i
        public PetGoalFollowOwner(CustomEntityCow cow, double startDistance, float stopDistance, float teleportDistance) {
            pet = cow;
            world = pet.world;
            start = startDistance;
            stop = stopDistance;
            teleport = teleportDistance;
            nav = pet.getNavigation();
        public boolean a() {
            EntityLiving localOwner = ((CraftPlayer) this.pet.getOwner()).getHandle();
            if(localOwner == null) return false;
            if(this.pet.h(localOwner) < this.stop * this.stop) return false;
            owner = localOwner;
            return true;
        public boolean b() {
            return(!this.nav.m()) && (this.pet.h(this.owner) > this.teleport * this.teleport);
        public void c() {
            this.h = 0;
            this.i = ((Navigation) this.pet.getNavigation()).e();
            ((Navigation) this.pet.getNavigation()).a(true);
        public void d() {
            this.owner = null;
        public void e() {
            this.pet.getControllerLook().a(owner, 10.0f, this.pet.bP());
            if(--this.h >0) return;
            this.h = 10;
            if(this.nav.a(owner, start)) return;
            if(this.pet.cb()) return;
            if(this.pet.h(this.owner) < 144.0D) return;
            int j = MathHelper.floor(this.pet.locX) - 2;
            int k = MathHelper.floor(this.pet.locZ) - 2;
            int m = MathHelper.floor(this.pet.getBoundingBox().b);
            for(int n = 0; n <= 4; n++)
                for(int i1 = 0; i1 <= 4; i1++)
                    if((n < 1) || (i1 < 1) || (n > 3) || (i1 > 3)) {
                        if((World.a(this.world, new BlockPosition(j + n, m - 1, k + i1)))
                                && (!this.world.getType(new BlockPosition(j + n, m, k + i1)).getBlock().d())
                                && (!this.world.getType(new BlockPosition(j + n, m + 1, k + i1)).getBlock().d())) {
                            this.pet.setPositionRotation(j + n + 0.5F, m, k + i1 + 0.5F, this.pet.yaw, this.pet.pitch);

    The cow doesn't even randomly stroll. I am sure it is a stupid mistake, but any help would be appreciated.
Thread Status:
Not open for further replies.

Share This Page