From 708bf13afd5d146c2b4f6b8d7711caaad1f04935 Mon Sep 17 00:00:00 2001 From: fullwall Date: Sun, 20 Oct 2024 17:09:19 +0800 Subject: [PATCH] Trial removing Player NPCs from the paper per-player mob limits --- .../java/net/citizensnpcs/npc/CitizensNPC.java | 5 +++++ .../nms/v1_16_R3/entity/EntityHumanNPC.java | 11 +++++++++++ .../citizensnpcs/nms/v1_16_R3/util/NMSImpl.java | 1 + .../nms/v1_17_R1/entity/EntityHumanNPC.java | 11 +++++++++++ .../citizensnpcs/nms/v1_17_R1/util/NMSImpl.java | 1 + .../nms/v1_18_R2/entity/EntityHumanNPC.java | 11 +++++++++++ .../nms/v1_18_R2/entity/HumanController.java | 4 +--- .../citizensnpcs/nms/v1_18_R2/util/NMSImpl.java | 1 + .../nms/v1_19_R3/entity/EntityHumanNPC.java | 11 +++++++++++ .../nms/v1_19_R3/entity/HumanController.java | 4 +--- .../citizensnpcs/nms/v1_19_R3/util/NMSImpl.java | 1 + .../nms/v1_20_R4/entity/EntityHumanNPC.java | 11 +++++++++++ .../nms/v1_20_R4/entity/HumanController.java | 4 +--- .../citizensnpcs/nms/v1_20_R4/util/NMSImpl.java | 3 ++- .../nms/v1_21_R1/entity/EntityHumanNPC.java | 11 +++++++++++ .../nms/v1_21_R1/entity/HumanController.java | 4 +--- .../citizensnpcs/nms/v1_21_R1/util/NMSImpl.java | 14 ++++++++------ 17 files changed, 89 insertions(+), 19 deletions(-) diff --git a/main/src/main/java/net/citizensnpcs/npc/CitizensNPC.java b/main/src/main/java/net/citizensnpcs/npc/CitizensNPC.java index e202aa61f..45de9a50e 100644 --- a/main/src/main/java/net/citizensnpcs/npc/CitizensNPC.java +++ b/main/src/main/java/net/citizensnpcs/npc/CitizensNPC.java @@ -282,6 +282,11 @@ public class CitizensNPC extends AbstractNPC { getOrAddTrait(SneakTrait.class).setSneaking(sneaking); } + @Override + public boolean shouldRemoveFromPlayerList() { + return data().get(NPC.Metadata.REMOVE_FROM_PLAYERLIST, Setting.REMOVE_PLAYERS_FROM_PLAYER_LIST.asBoolean()); + } + @Override public boolean shouldRemoveFromTabList() { return data().get(NPC.Metadata.REMOVE_FROM_TABLIST, Setting.DISABLE_TABLIST.asBoolean()); diff --git a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/EntityHumanNPC.java b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/EntityHumanNPC.java index 0ac8e4c13..b973e8999 100644 --- a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/EntityHumanNPC.java +++ b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/EntityHumanNPC.java @@ -375,6 +375,17 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable if (!npc.hasTrait(EntityPoseTrait.class) || npc.getTraitNullable(EntityPoseTrait.class).getPose() == null) { eu(); } + if (NMSImpl.PAPER_PLAYER_MOB_COUNTS != null && npc.shouldRemoveFromPlayerList()) { + int[] counts; + try { + counts = (int[]) NMSImpl.PAPER_PLAYER_MOB_COUNTS.invoke(this); + for (int i = 0; i < counts.length; i++) { + counts[i] = 0; + } + } catch (Throwable e) { + e.printStackTrace(); + } + } } private void updatePackets(boolean navigating) { diff --git a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/NMSImpl.java b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/NMSImpl.java index a2ae216a4..4eb6d0533 100644 --- a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/NMSImpl.java +++ b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/NMSImpl.java @@ -2367,6 +2367,7 @@ public class NMSImpl implements NMSBridge { private static final MethodHandle NAVIGATION_S = NMS.getFinalSetter(NavigationAbstract.class, "s"); private static final MethodHandle NAVIGATION_WORLD_FIELD = NMS.getSetter(NavigationAbstract.class, "b"); public static final Location PACKET_CACHE_LOCATION = new Location(null, 0, 0, 0); + public static final MethodHandle PAPER_PLAYER_MOB_COUNTS = NMS.getGetter(EntityPlayer.class, "mobCounts"); private static final MethodHandle PLAYER_CHUNK_MAP_VIEW_DISTANCE_GETTER = NMS.getGetter(PlayerChunkMap.class, "viewDistance"); private static final MethodHandle PLAYER_CHUNK_MAP_VIEW_DISTANCE_SETTER = NMS.getSetter(PlayerChunkMap.class, diff --git a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/EntityHumanNPC.java b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/EntityHumanNPC.java index b3181aa4a..af7e157f3 100644 --- a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/EntityHumanNPC.java +++ b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/EntityHumanNPC.java @@ -366,6 +366,17 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable Bukkit.getServer().getPluginManager().unsubscribeFromPermission("bukkit.broadcast.user", getBukkitEntity()); updatePackets(npc.getNavigator().isNavigating()); npc.update(); + if (NMSImpl.PAPER_PLAYER_MOB_COUNTS != null && npc.shouldRemoveFromPlayerList()) { + int[] counts; + try { + counts = (int[]) NMSImpl.PAPER_PLAYER_MOB_COUNTS.invoke(this); + for (int i = 0; i < counts.length; i++) { + counts[i] = 0; + } + } catch (Throwable e) { + e.printStackTrace(); + } + } } @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 ee6615719..bfd572aa9 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 @@ -2345,6 +2345,7 @@ public class NMSImpl implements NMSBridge { 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); + public static final MethodHandle PAPER_PLAYER_MOB_COUNTS = NMS.getGetter(ServerPlayer.class, "mobCounts"); private static final MethodHandle PLAYER_CHUNK_MAP_VIEW_DISTANCE_GETTER = NMS.getGetter(ChunkMap.class, "J"); private static final MethodHandle PLAYER_CHUNK_MAP_VIEW_DISTANCE_SETTER = NMS.getSetter(ChunkMap.class, "J"); private static final MethodHandle PUFFERFISH_C = NMS.getSetter(Pufferfish.class, "bU"); diff --git a/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/entity/EntityHumanNPC.java b/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/entity/EntityHumanNPC.java index 8a850bd50..dfe610196 100644 --- a/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/entity/EntityHumanNPC.java +++ b/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/entity/EntityHumanNPC.java @@ -363,6 +363,17 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable Bukkit.getServer().getPluginManager().unsubscribeFromPermission("bukkit.broadcast.user", getBukkitEntity()); updatePackets(npc.getNavigator().isNavigating()); npc.update(); + if (NMSImpl.PAPER_PLAYER_MOB_COUNTS != null && npc.shouldRemoveFromPlayerList()) { + int[] counts; + try { + counts = (int[]) NMSImpl.PAPER_PLAYER_MOB_COUNTS.invoke(this); + for (int i = 0; i < counts.length; i++) { + counts[i] = 0; + } + } catch (Throwable e) { + e.printStackTrace(); + } + } } @Override diff --git a/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/entity/HumanController.java b/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/entity/HumanController.java index 656df879c..e6273189f 100644 --- a/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/entity/HumanController.java +++ b/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/entity/HumanController.java @@ -48,9 +48,7 @@ public class HumanController extends AbstractEntityController { if (getBukkitEntity() == null || !getBukkitEntity().isValid() || getBukkitEntity() != handle.getBukkitEntity()) return; - boolean removeFromPlayerList = npc.data().get(NPC.Metadata.REMOVE_FROM_PLAYERLIST, - Setting.REMOVE_PLAYERS_FROM_PLAYER_LIST.asBoolean()); - NMS.addOrRemoveFromPlayerList(getBukkitEntity(), removeFromPlayerList); + NMS.addOrRemoveFromPlayerList(getBukkitEntity(), npc.shouldRemoveFromPlayerList()); }, 20); handle.getBukkitEntity().setSleepingIgnored(true); return handle.getBukkitEntity(); diff --git a/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/util/NMSImpl.java b/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/util/NMSImpl.java index 05a772103..1c6d81eeb 100644 --- a/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/util/NMSImpl.java +++ b/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/util/NMSImpl.java @@ -2394,6 +2394,7 @@ public class NMSImpl implements NMSBridge { 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); + public static final MethodHandle PAPER_PLAYER_MOB_COUNTS = NMS.getGetter(ServerPlayer.class, "mobCounts"); private static final MethodHandle PLAYER_CHUNK_MAP_VIEW_DISTANCE_GETTER = NMS.getGetter(ChunkMap.class, "N"); private static final MethodHandle PLAYER_CHUNK_MAP_VIEW_DISTANCE_SETTER = NMS.getSetter(ChunkMap.class, "N"); private static MethodHandle PORTAL_ENTRANCE_POS_GETTER = NMS.getGetter(Entity.class, "ai"); diff --git a/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/EntityHumanNPC.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/EntityHumanNPC.java index 81ca15c41..cab05e2d3 100644 --- a/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/EntityHumanNPC.java +++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/EntityHumanNPC.java @@ -372,6 +372,17 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable Bukkit.getServer().getPluginManager().unsubscribeFromPermission("bukkit.broadcast.user", getBukkitEntity()); updatePackets(npc.getNavigator().isNavigating()); npc.update(); + if (NMSImpl.PAPER_PLAYER_MOB_COUNTS != null && npc.shouldRemoveFromPlayerList()) { + int[] counts; + try { + counts = (int[]) NMSImpl.PAPER_PLAYER_MOB_COUNTS.invoke(this); + for (int i = 0; i < counts.length; i++) { + counts[i] = 0; + } + } catch (Throwable e) { + e.printStackTrace(); + } + } } @Override diff --git a/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/HumanController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/HumanController.java index ecd8a15fc..54b525b69 100644 --- a/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/HumanController.java +++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/HumanController.java @@ -48,9 +48,7 @@ public class HumanController extends AbstractEntityController { if (getBukkitEntity() == null || !getBukkitEntity().isValid() || getBukkitEntity() != handle.getBukkitEntity()) return; - boolean removeFromPlayerList = npc.data().get(NPC.Metadata.REMOVE_FROM_PLAYERLIST, - Setting.REMOVE_PLAYERS_FROM_PLAYER_LIST.asBoolean()); - NMS.addOrRemoveFromPlayerList(getBukkitEntity(), removeFromPlayerList); + NMS.addOrRemoveFromPlayerList(getBukkitEntity(), npc.shouldRemoveFromPlayerList()); }, 20); handle.getBukkitEntity().setSleepingIgnored(true); return handle.getBukkitEntity(); diff --git a/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/NMSImpl.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/NMSImpl.java index 7ab2b5616..2317576c7 100644 --- a/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/NMSImpl.java +++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/NMSImpl.java @@ -2632,6 +2632,7 @@ public class NMSImpl implements NMSBridge { private static final MethodHandle NAVIGATION_PATHFINDER = NMS.getFirstFinalSetter(PathNavigation.class, PathFinder.class); private static final MethodHandle NAVIGATION_WORLD_FIELD = NMS.getFirstSetter(PathNavigation.class, Level.class); + public static final MethodHandle PAPER_PLAYER_MOB_COUNTS = NMS.getGetter(ServerPlayer.class, "mobCounts"); private static final MethodHandle PLAYER_CHUNK_MAP_VIEW_DISTANCE_GETTER = NMS.getFirstGetter(ChunkMap.class, int.class); private static final MethodHandle PLAYER_CHUNK_MAP_VIEW_DISTANCE_SETTER = NMS.getFirstSetter(ChunkMap.class, diff --git a/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/EntityHumanNPC.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/EntityHumanNPC.java index c8ff437ab..73b548099 100644 --- a/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/EntityHumanNPC.java +++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/EntityHumanNPC.java @@ -377,6 +377,17 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable Bukkit.getServer().getPluginManager().unsubscribeFromPermission("bukkit.broadcast.user", getBukkitEntity()); updatePackets(npc.getNavigator().isNavigating()); npc.update(); + if (NMSImpl.PAPER_PLAYER_MOB_COUNTS != null && npc.shouldRemoveFromPlayerList()) { + int[] counts; + try { + counts = (int[]) NMSImpl.PAPER_PLAYER_MOB_COUNTS.invoke(this); + for (int i = 0; i < counts.length; i++) { + counts[i] = 0; + } + } catch (Throwable e) { + e.printStackTrace(); + } + } } @Override diff --git a/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/HumanController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/HumanController.java index ced4d551e..dabcf6ced 100644 --- a/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/HumanController.java +++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/HumanController.java @@ -50,9 +50,7 @@ public class HumanController extends AbstractEntityController { if (getBukkitEntity() == null || !getBukkitEntity().isValid() || getBukkitEntity() != handle.getBukkitEntity()) return; - boolean removeFromPlayerList = npc.data().get(NPC.Metadata.REMOVE_FROM_PLAYERLIST, - Setting.REMOVE_PLAYERS_FROM_PLAYER_LIST.asBoolean()); - NMS.addOrRemoveFromPlayerList(getBukkitEntity(), removeFromPlayerList); + NMS.addOrRemoveFromPlayerList(getBukkitEntity(), npc.shouldRemoveFromPlayerList()); }, 20); handle.getBukkitEntity().setSleepingIgnored(true); return handle.getBukkitEntity(); diff --git a/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/NMSImpl.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/NMSImpl.java index 8fa7e704c..294b49b44 100644 --- a/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/NMSImpl.java +++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/NMSImpl.java @@ -2723,9 +2723,10 @@ public class NMSImpl implements NMSBridge { private static final MethodHandle NAVIGATION_PATHFINDER = NMS.getFirstFinalSetter(PathNavigation.class, PathFinder.class); private static final MethodHandle NAVIGATION_WORLD_FIELD = NMS.getFirstSetter(PathNavigation.class, Level.class); + public static final MethodHandle PAPER_PLAYER_MOB_COUNTS = NMS.getGetter(ServerPlayer.class, "mobCounts"); + private static final MethodHandle PLAYER_INFO_ENTRIES_LIST = NMS .getFirstFinalSetter(ClientboundPlayerInfoUpdatePacket.class, List.class); - private static final MethodHandle PLAYERINFO_ENTRIES = PLAYER_INFO_ENTRIES_LIST; private static final MethodHandle PORTAL_ENTRANCE_POS_GETTER = NMS.getGetter(Entity.class, "ay"); private static final MethodHandle PORTAL_ENTRANCE_POS_SETTER = NMS.getSetter(Entity.class, "ay"); diff --git a/v1_21_R1/src/main/java/net/citizensnpcs/nms/v1_21_R1/entity/EntityHumanNPC.java b/v1_21_R1/src/main/java/net/citizensnpcs/nms/v1_21_R1/entity/EntityHumanNPC.java index a71f04cb5..c9fc3d80a 100644 --- a/v1_21_R1/src/main/java/net/citizensnpcs/nms/v1_21_R1/entity/EntityHumanNPC.java +++ b/v1_21_R1/src/main/java/net/citizensnpcs/nms/v1_21_R1/entity/EntityHumanNPC.java @@ -376,6 +376,17 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable Bukkit.getServer().getPluginManager().unsubscribeFromPermission("bukkit.broadcast.user", getBukkitEntity()); updatePackets(npc.getNavigator().isNavigating()); npc.update(); + if (NMSImpl.PAPER_PLAYER_MOB_COUNTS != null && npc.shouldRemoveFromPlayerList()) { + int[] counts; + try { + counts = (int[]) NMSImpl.PAPER_PLAYER_MOB_COUNTS.invoke(this); + for (int i = 0; i < counts.length; i++) { + counts[i] = 0; + } + } catch (Throwable e) { + e.printStackTrace(); + } + } } @Override diff --git a/v1_21_R1/src/main/java/net/citizensnpcs/nms/v1_21_R1/entity/HumanController.java b/v1_21_R1/src/main/java/net/citizensnpcs/nms/v1_21_R1/entity/HumanController.java index b973c34e0..309c122d8 100644 --- a/v1_21_R1/src/main/java/net/citizensnpcs/nms/v1_21_R1/entity/HumanController.java +++ b/v1_21_R1/src/main/java/net/citizensnpcs/nms/v1_21_R1/entity/HumanController.java @@ -50,9 +50,7 @@ public class HumanController extends AbstractEntityController { if (getBukkitEntity() == null || !getBukkitEntity().isValid() || getBukkitEntity() != handle.getBukkitEntity()) return; - boolean removeFromPlayerList = npc.data().get(NPC.Metadata.REMOVE_FROM_PLAYERLIST, - Setting.REMOVE_PLAYERS_FROM_PLAYER_LIST.asBoolean()); - NMS.addOrRemoveFromPlayerList(getBukkitEntity(), removeFromPlayerList); + NMS.addOrRemoveFromPlayerList(getBukkitEntity(), npc.shouldRemoveFromPlayerList()); }, 20); handle.getBukkitEntity().setSleepingIgnored(true); return handle.getBukkitEntity(); diff --git a/v1_21_R1/src/main/java/net/citizensnpcs/nms/v1_21_R1/util/NMSImpl.java b/v1_21_R1/src/main/java/net/citizensnpcs/nms/v1_21_R1/util/NMSImpl.java index 826d01db2..3ca7d53af 100644 --- a/v1_21_R1/src/main/java/net/citizensnpcs/nms/v1_21_R1/util/NMSImpl.java +++ b/v1_21_R1/src/main/java/net/citizensnpcs/nms/v1_21_R1/util/NMSImpl.java @@ -612,6 +612,12 @@ public class NMSImpl implements NMSBridge { return NMSBoundingBox.wrap(getHandle(handle).getBoundingBox()); } + @Override + public BoundingBox getCollisionBox(Object data) { + return NMSBoundingBox.wrap(((CraftBlockData) data).getState() + .getCollisionShape(EmptyBlockGetter.INSTANCE, BlockPos.ZERO, CollisionContext.empty()).bounds()); + } + @Override public BoundingBox getCollisionBox(org.bukkit.block.Block block) { ServerLevel world = ((CraftWorld) block.getWorld()).getHandle(); @@ -619,12 +625,6 @@ public class NMSImpl implements NMSBridge { return shape.isEmpty() ? BoundingBox.EMPTY : NMSBoundingBox.wrap(shape.bounds()); } - @Override - public BoundingBox getCollisionBox(Object data) { - return NMSBoundingBox.wrap(((CraftBlockData) data).getState() - .getCollisionShape(EmptyBlockGetter.INSTANCE, BlockPos.ZERO, CollisionContext.empty()).bounds()); - } - @Override public Map getComponentMap(org.bukkit.inventory.ItemStack item) { if (META_COMPOUND_TAG == null) { @@ -2651,6 +2651,7 @@ public class NMSImpl implements NMSBridge { private static final MethodHandle ATTRIBUTE_SUPPLIER = NMS.getFirstGetter(AttributeMap.class, AttributeSupplier.class); + private static final MethodHandle AVAILABLE_BEHAVIORS_BY_PRIORITY = NMS.getGetter(Brain.class, "f"); 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, @@ -2704,6 +2705,7 @@ public class NMSImpl implements NMSBridge { private static final MethodHandle NAVIGATION_PATHFINDER = NMS.getFirstFinalSetter(PathNavigation.class, PathFinder.class); private static final MethodHandle NAVIGATION_WORLD_FIELD = NMS.getFirstSetter(PathNavigation.class, Level.class); + public static final MethodHandle PAPER_PLAYER_MOB_COUNTS = NMS.getGetter(ServerPlayer.class, "mobCounts"); private static final MethodHandle PLAYER_INFO_ENTRIES_LIST = NMS .getFirstFinalSetter(ClientboundPlayerInfoUpdatePacket.class, List.class); private static final MethodHandle PLAYERINFO_ENTRIES = PLAYER_INFO_ENTRIES_LIST;