From f5a56ba8f84e28b87ec6c16368c875b8aa270b03 Mon Sep 17 00:00:00 2001 From: fullwall Date: Wed, 23 Jun 2021 23:49:11 +0800 Subject: [PATCH] Fix blazes, and some issues with paper compat --- .../nms/v1_17_R1/entity/BlazeController.java | 2 +- .../nms/v1_17_R1/util/NMSImpl.java | 45 +++++++++++-------- .../nms/v1_17_R1/util/PlayerNavigation.java | 9 +++- .../nms/v1_17_R1/util/PlayerPathfinder.java | 6 +++ 4 files changed, 41 insertions(+), 21 deletions(-) diff --git a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/BlazeController.java b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/BlazeController.java index 5ea55eb18..3d28c3cc1 100644 --- a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/BlazeController.java +++ b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/BlazeController.java @@ -25,7 +25,7 @@ import net.minecraft.world.level.Level; public class BlazeController extends MobEntityController { public BlazeController() { - super(BlazeNPC.class); + super(EntityBlazeNPC.class); } @Override diff --git a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/NMSImpl.java b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/NMSImpl.java index 8803ff0a3..6e11f0b80 100644 --- a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/NMSImpl.java +++ b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/NMSImpl.java @@ -560,22 +560,16 @@ public class NMSImpl implements NMSBridge { })); Node last = list.size() > 0 ? list.get(list.size() - 1) : null; final Path path = new Path(list, last != null ? new BlockPos(last.x, last.y, last.z) : null, true); - return getTargetNavigator(entity, params, new Function() { - @Override - public Boolean apply(PathNavigation input) { - return input.moveTo(path, params.speed()); - } + return getTargetNavigator(entity, params, (input) -> { + return input.moveTo(path, params.speed()); }); } @Override public MCNavigator getTargetNavigator(final org.bukkit.entity.Entity entity, final Location dest, final NavigatorParameters params) { - return getTargetNavigator(entity, params, new Function() { - @Override - public Boolean apply(PathNavigation input) { - return input.moveTo(dest.getX(), dest.getY(), dest.getZ(), params.speed()); - } + return getTargetNavigator(entity, params, (input) -> { + return input.moveTo(dest.getX(), dest.getY(), dest.getZ(), params.speed()); }); } @@ -613,10 +607,11 @@ public class NMSImpl implements NMSBridge { @Override public void stop() { - if (params.debug() && navigation.getPath() != null) { + Path path = getPathEntity(navigation); + if (params.debug() && path != null) { for (Player player : Bukkit.getOnlinePlayers()) { - for (int i = 0; i < navigation.getPath().getNodeCount(); i++) { - Node pp = navigation.getPath().getNode(i); + for (int i = 0; i < path.getNodeCount(); i++) { + Node pp = path.getNode(i); org.bukkit.block.Block block = new Vector(pp.x, pp.y, pp.z).toLocation(player.getWorld()) .getBlock(); player.sendBlockChange(block.getLocation(), block.getBlockData()); @@ -667,9 +662,10 @@ public class NMSImpl implements NMSBridge { } if (params.debug() && !NMSImpl.isNavigationFinished(navigation)) { BlockData data = Material.DANDELION.createBlockData(); + Path path = getPathEntity(navigation); for (Player player : Bukkit.getOnlinePlayers()) { - for (int i = 0; i < navigation.getPath().getNodeCount(); i++) { - Node pp = navigation.getPath().getNode(i); + for (int i = 0; i < path.getNodeCount(); i++) { + Node pp = path.getNode(i); player.sendBlockChange(new Vector(pp.x, pp.y, pp.z).toLocation(player.getWorld()), data); } } @@ -1410,9 +1406,10 @@ public class NMSImpl implements NMSBridge { @Override public Iterator iterator() { - final int npoints = navigation.getPath() == null ? 0 : navigation.getPath().getNodeCount(); + Path path = getPathEntity(navigation); + final int npoints = path == null ? 0 : path.getNodeCount(); return new Iterator() { - Node curr = npoints > 0 ? navigation.getPath().getNode(0) : null; + Node curr = npoints > 0 ? path.getNode(0) : null; int i = 0; @Override @@ -1423,7 +1420,7 @@ public class NMSImpl implements NMSBridge { @Override public Vector next() { Node old = curr; - curr = i + 1 < npoints ? navigation.getPath().getNode(++i) : null; + curr = i + 1 < npoints ? path.getNode(++i) : null; return new Vector(old.x, old.y, old.z); } @@ -1631,6 +1628,16 @@ public class NMSImpl implements NMSBridge { : handle instanceof EntityHumanNPC ? ((EntityHumanNPC) handle).getNavigation() : null; } + private static Path getPathEntity(PathNavigation nav) { + try { + return nav instanceof PlayerNavigation ? ((PlayerNavigation) nav).getPathEntity() + : (Path) NAVIGATION_PATH.invoke(nav); + } catch (Throwable e) { + e.printStackTrace(); + return null; + } + } + public static EntityDataAccessor getRabbitTypeField() { return RABBIT_TYPE_DATAWATCHER; } @@ -1854,6 +1861,7 @@ public class NMSImpl implements NMSBridge { } private static final MethodHandle ADVANCEMENTS_PLAYER_FIELD = NMS.getFinalSetter(ServerPlayer.class, "cr"); + private static final Set BAD_CONTROLLER_LOOK = EnumSet.of(EntityType.POLAR_BEAR, EntityType.BEE, EntityType.SILVERFISH, EntityType.SHULKER, EntityType.ENDERMITE, EntityType.ENDER_DRAGON, EntityType.BAT, EntityType.SLIME, EntityType.DOLPHIN, EntityType.MAGMA_CUBE, EntityType.HORSE, EntityType.GHAST, @@ -1880,6 +1888,7 @@ public class NMSImpl implements NMSBridge { "makeRequest", true, URL.class, Object.class, Class.class); private static final MethodHandle NAVIGATION_CREATE_PATHFINDER = NMS.getMethodHandle(PathNavigation.class, "a", true, int.class); + private static MethodHandle NAVIGATION_PATH = NMS.getGetter(PathNavigation.class, "c"); private static final MethodHandle NAVIGATION_PATHFINDER = NMS.getFinalSetter(PathNavigation.class, "t"); private static final MethodHandle NAVIGATION_WORLD_FIELD = NMS.getFirstSetter(PathNavigation.class, Level.class); public static final Location PACKET_CACHE_LOCATION = new Location(null, 0, 0, 0); diff --git a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/PlayerNavigation.java b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/PlayerNavigation.java index 2552d0115..7d024513c 100644 --- a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/PlayerNavigation.java +++ b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/PlayerNavigation.java @@ -306,6 +306,10 @@ public class PlayerNavigation extends PathNavigation { return this.path; } + public Path getPathEntity() { + return this.path; + } + private int getSurfaceY() { if (!this.mob.isInWater() || !canFloat()) return Mth.floor(this.mob.getY() + 0.5D); @@ -370,7 +374,7 @@ public class PlayerNavigation extends PathNavigation { @Override public boolean moveTo(double var0, double var2, double var4, double var6) { - return moveTo(createPath(var0, var2, var4, 1), var6); + return moveTo(createPath(new BlockPos(var0, var2, var4), 1), var6); } @Override @@ -506,8 +510,9 @@ public class PlayerNavigation extends PathNavigation { @Override public void tick() { this.tick++; - if (this.hasDelayedRecomputation) + if (this.hasDelayedRecomputation) { recomputePath(); + } if (isDone()) return; if (canUpdatePath()) { diff --git a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/PlayerPathfinder.java b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/PlayerPathfinder.java index 35852f743..065114f5f 100644 --- a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/PlayerPathfinder.java +++ b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/PlayerPathfinder.java @@ -32,6 +32,12 @@ public class PlayerPathfinder extends PathFinder { private final PlayerNodeEvaluator nodeEvaluator; private final BinaryHeap openSet = new BinaryHeap(); + public PlayerPathfinder() { + super(null, 768); + this.nodeEvaluator = new PlayerNodeEvaluator(); + this.maxVisitedNodes = 768; + } + public PlayerPathfinder(PlayerNodeEvaluator var0, int var1) { super(var0, var1); this.nodeEvaluator = var0;