Fix turtle navigation between biomes

This commit is contained in:
fullwall 2020-02-21 23:50:35 +08:00
parent e52f616a4b
commit de94185133
5 changed files with 76 additions and 37 deletions

View File

@ -276,6 +276,7 @@ public class CitizensNavigator implements Navigator, Runnable {
executing.stop();
}
executing = null;
localParams = defaultParams;
stationaryTicks = 0;
if (npc.isSpawned()) {

View File

@ -1,6 +1,5 @@
package net.citizensnpcs.nms.v1_13_R2.entity;
import net.minecraft.server.v1_13_R2.*;
import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_13_R2.CraftServer;
import org.bukkit.craftbukkit.v1_13_R2.entity.CraftEntity;
@ -15,6 +14,18 @@ import net.citizensnpcs.nms.v1_13_R2.util.NMSImpl;
import net.citizensnpcs.npc.CitizensNPC;
import net.citizensnpcs.npc.ai.NPCHolder;
import net.citizensnpcs.util.Util;
import net.minecraft.server.v1_13_R2.BlockPosition;
import net.minecraft.server.v1_13_R2.ControllerJump;
import net.minecraft.server.v1_13_R2.ControllerMove;
import net.minecraft.server.v1_13_R2.DamageSource;
import net.minecraft.server.v1_13_R2.EntityInsentient;
import net.minecraft.server.v1_13_R2.EntityTurtle;
import net.minecraft.server.v1_13_R2.IBlockData;
import net.minecraft.server.v1_13_R2.NBTTagCompound;
import net.minecraft.server.v1_13_R2.Navigation;
import net.minecraft.server.v1_13_R2.NavigationAbstract;
import net.minecraft.server.v1_13_R2.SoundEffect;
import net.minecraft.server.v1_13_R2.World;
public class TurtleController extends MobEntityController {
public TurtleController() {
@ -43,18 +54,6 @@ public class TurtleController extends MobEntityController {
}
}
static class EmptyControllerJump extends ControllerJump {
public EmptyControllerJump(EntityInsentient var1) {
super(var1);
}
@Override
public void b() {
this.a = false;
}
}
@Override
protected void a(double d0, boolean flag, IBlockData block, BlockPosition blockposition) {
if (npc == null || !npc.isFlyable()) {
@ -71,6 +70,14 @@ public class TurtleController extends MobEntityController {
}
}
@Override
protected NavigationAbstract b(World world) {
if (npc == null) {
return super.b(world);
}
return new Navigation(this, world);
}
@Override
public void c(float f, float f1) {
if (npc == null || !npc.isFlyable()) {
@ -190,6 +197,17 @@ public class TurtleController extends MobEntityController {
return false;
}
}
static class EmptyControllerJump extends ControllerJump {
public EmptyControllerJump(EntityInsentient var1) {
super(var1);
}
@Override
public void b() {
this.a = false;
}
}
}
public static class TurtleNPC extends CraftTurtle implements NPCHolder {

View File

@ -23,6 +23,8 @@ import net.minecraft.server.v1_14_R1.EntityTurtle;
import net.minecraft.server.v1_14_R1.EntityTypes;
import net.minecraft.server.v1_14_R1.IBlockData;
import net.minecraft.server.v1_14_R1.NBTTagCompound;
import net.minecraft.server.v1_14_R1.Navigation;
import net.minecraft.server.v1_14_R1.NavigationAbstract;
import net.minecraft.server.v1_14_R1.SoundEffect;
import net.minecraft.server.v1_14_R1.Vec3D;
import net.minecraft.server.v1_14_R1.World;
@ -68,6 +70,14 @@ public class TurtleController extends MobEntityController {
}
}
@Override
protected NavigationAbstract b(World world) {
if (npc == null) {
return super.b(world);
}
return new Navigation(this, world);
}
@Override
protected void checkDespawn() {
if (npc == null) {

View File

@ -23,6 +23,8 @@ import net.minecraft.server.v1_15_R1.EntityTurtle;
import net.minecraft.server.v1_15_R1.EntityTypes;
import net.minecraft.server.v1_15_R1.IBlockData;
import net.minecraft.server.v1_15_R1.NBTTagCompound;
import net.minecraft.server.v1_15_R1.Navigation;
import net.minecraft.server.v1_15_R1.NavigationAbstract;
import net.minecraft.server.v1_15_R1.SoundEffect;
import net.minecraft.server.v1_15_R1.Vec3D;
import net.minecraft.server.v1_15_R1.World;
@ -69,6 +71,14 @@ public class TurtleController extends MobEntityController {
return false;
}
@Override
protected NavigationAbstract b(World world) {
if (npc == null) {
return super.b(world);
}
return new Navigation(this, world);
}
@Override
public void checkDespawn() {
if (npc == null) {
@ -112,28 +122,6 @@ public class TurtleController extends MobEntityController {
}
}
@Override
public void h(double x, double y, double z) {
if (npc == null) {
super.h(x, y, z);
return;
}
if (NPCPushEvent.getHandlerList().getRegisteredListeners().length == 0) {
if (!npc.data().get(NPC.DEFAULT_PROTECTED_METADATA, true))
super.h(x, y, z);
return;
}
Vector vector = new Vector(x, y, z);
NPCPushEvent event = Util.callPushEvent(npc, vector);
if (!event.isCancelled()) {
vector = event.getCollisionVector();
super.h(vector.getX(), vector.getY(), vector.getZ());
}
// when another entity collides, this method is called to push the
// NPC so we prevent it from doing anything if the event is
// cancelled.
}
@Override
public CraftEntity getBukkitEntity() {
if (npc != null && !(super.getBukkitEntity() instanceof NPCHolder)) {
@ -162,6 +150,28 @@ public class TurtleController extends MobEntityController {
return NMSImpl.getSoundEffect(npc, super.getSoundHurt(damagesource), NPC.HURT_SOUND_METADATA);
}
@Override
public void h(double x, double y, double z) {
if (npc == null) {
super.h(x, y, z);
return;
}
if (NPCPushEvent.getHandlerList().getRegisteredListeners().length == 0) {
if (!npc.data().get(NPC.DEFAULT_PROTECTED_METADATA, true))
super.h(x, y, z);
return;
}
Vector vector = new Vector(x, y, z);
NPCPushEvent event = Util.callPushEvent(npc, vector);
if (!event.isCancelled()) {
vector = event.getCollisionVector();
super.h(vector.getX(), vector.getY(), vector.getZ());
}
// when another entity collides, this method is called to push the
// NPC so we prevent it from doing anything if the event is
// cancelled.
}
@Override
public boolean isClimbing() {
if (npc == null || !npc.isFlyable()) {
@ -193,7 +203,6 @@ public class TurtleController extends MobEntityController {
}
static class EmptyControllerJump extends ControllerJump {
public EmptyControllerJump(EntityInsentient var1) {
super(var1);
}

View File

@ -578,7 +578,8 @@ public class NMSImpl implements NMSBridge {
if (params.speed() != lastSpeed) {
if (Messaging.isDebugging()) {
Messaging.debug(
"Repathfinding " + ((NPCHolder) entity).getNPC().getId() + " due to speed change");
"Repathfinding " + ((NPCHolder) entity).getNPC().getId() + " due to speed change from",
lastSpeed, "to", params.speed());
}
Entity handle = getHandle(entity);
EntitySize size = null;