1.8.8 Mobs won't rotate correct at high speed

Discussion in 'Spigot Plugin Development' started by Jens00, Jan 13, 2020.

  1. Hello, I'm working on a tower defence plugin but when the speed of the mobs are to high the mobs seem to change lines wich cauces them to get stuck on a wall or to walk in a direction they don't need to go to.

    In the video below you can see the villager is crashing into a wall and the wolf is changing lines wich causes it to crash into a wall.
    Video of the bugg:

    Does anyone know how I can solve this ?

    Code (Java):
    public class MoveStraightPath extends PathfinderGoal {
            EntityInsentient e;
            private int a;
            private boolean GoOn;
            double speed;
            int x;
            int z;

            public MoveStraightPath(final EntityInsentient e, final double speed) {
                this.x = -1000000;
                this.z = -1000000;
                this.e = e;
                this.a = 0;
                this.GoOn = true;
                this.speed = speed;

                Entity eb = this.e.getBukkitEntity();
                final NPCRegistry registry = CitizensAPI.getNPCRegistry();
                final NPC npc = registry.getNPC(eb);
                npc.setName(ColorCodes.cc("&a&l||||||||||||||||||||"));
            }

            public boolean a() {
                return this.GoOn;
            }

            public void e() {
                final Entity eb = this.e.getBukkitEntity();
                if (!eb.isValid()) {
                    Arena.enemies.remove(CitizensAPI.getNPCRegistry().getNPC(eb));
                }else {
                    final NPCRegistry registry = CitizensAPI.getNPCRegistry();
                    final NPC npc = registry.getNPC(eb);
                    CheckHealth(eb, npc);
                }
                if (this.a <= 0) {
                    final Location st = eb.getLocation().add(0.0, -3.0, 0.0);
                    if(st.getBlock().getType() == Material.OBSIDIAN) {
                        if(st.clone().add(0, 1, 0).getBlock().getType() == Material.WOOL) {
                            Arena arena = ArenaManager.getManager().getArena(st.getWorld().getName());
                            if(arena == null) {
                                return;
                            }

                            String mobName = e.getBukkitEntity().getType().toString().substring(0, 1) + e.getBukkitEntity().getType().toString().substring(1).toLowerCase();

                            if(st.clone().add(0, 1, 0).getBlock().getData() == 3 || st.clone().subtract(0, 1, 0).getBlock().getData() == 11) {
                                arena.DamageCastle("Blue", info.getDouble("Mobs." +mobName + ".Damage"));
                            }else if(st.clone().subtract(0, 1, 0).getBlock().getData() == 14) {
                                arena.DamageCastle("Red", info.getDouble("Mobs." + mobName + ".Damage"));
                            }
                        }
                    }else {
                        final Location loc1 = eb.getLocation().getDirection().multiply(1.7).toLocation(this.e.getBukkitEntity().getWorld());
                        Location loc2 = eb.getLocation().add(loc1);

                        if (loc2.getBlock().getType() != Material.AIR) {
                            if (loc2.clone().add(0.0, 1.0, 0.0).getBlock().getType() == Material.AIR) {
                                loc2.add(0.0, 1.0, 0.0);
                                this.a = 10;
                            }
                        } else if (loc2.clone().subtract(0.0, 1.0, 0.0).getBlock().getType() == Material.AIR && loc2.clone().subtract(0.0, 2.0, 0.0).getBlock().getType() != Material.AIR) {
                            loc2.add(0.0, -2.0, 0.0);
                            this.a = 10;
                        }

                        final PathEntity pathEntity = this.e.getNavigation().a(loc2.getX(), loc2.getY(), loc2.getZ());
                        this.e.getNavigation().a(pathEntity, this.speed);
                        final AttributeInstance attributes1 = ((EntityInsentient) this.e.getBukkitEntity().getHandle()).getAttributeInstance(GenericAttributes.FOLLOW_RANGE);
                        attributes1.setValue(200.0);
                        if (st.getBlock().getType() == Material.COBBLESTONE_STAIRS && (this.x != st.getBlockX() || this.z != st.getBlockZ())) {
                            Location lr = new Location(eb.getWorld(), eb.getLocation().getBlockX(), eb.getLocation().getBlockY(), eb.getLocation().getBlockZ());
                            //noinspection deprecation
                            if (st.getBlock().getData() == 0) {
                                lr = new Location(eb.getWorld(), eb.getLocation().getBlockX(), eb.getLocation().getBlockY(), eb.getLocation().getBlockZ(), -90.0f, 0.0f);
                            }
                            //noinspection deprecation
                            if (st.getBlock().getData() == 1) {
                                //lr = new Location(st.getWorld(), st.getBlockX(), eb.getLocation().getBlockY(), st.getBlockZ(), 90, 0);
                                lr = new Location(eb.getWorld(), eb.getLocation().getBlockX(), eb.getLocation().getBlockY(), eb.getLocation().getBlockZ(), 90.0f, 0.0f);
                            }
                            //noinspection deprecation
                            if (st.getBlock().getData() == 2) {
                                if (eb.getLocation().getYaw() > 70 && eb.getLocation().getYaw() < 110) {
                                    lr = new Location(eb.getWorld(), eb.getLocation().getBlockX() + 1, eb.getLocation().getBlockY(), eb.getLocation().getBlockZ(), 0.0f, 0.0f);
                                } else {
                                    lr = new Location(eb.getWorld(), eb.getLocation().getBlockX(), eb.getLocation().getBlockY(), eb.getLocation().getBlockZ(), 0.0f, 0.0f);
                                }
                            }
                            //noinspection deprecation
                            if (st.getBlock().getData() == 3) {
                                lr = new Location(eb.getWorld(), eb.getLocation().getBlockX(), eb.getLocation().getBlockY(), eb.getLocation().getBlockZ(), -180.0f, 0.0f);
                            }
                            eb.teleport(lr);
                            this.x = st.getBlockX();
                            this.z = st.getBlockZ();
                        }
                    }
                } else {
                    --this.a;
                }
            }
        }
     
  2. I guess nms pathfinding code is just not built for extreme speeds.
     
  3. I don't think it's something to do with the speed, but as you see in the video the mobs walk diagonal and I believe there is something wrong with the way I rotate them ?