diff --git a/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java b/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java index 787eeebeb..8ac11c171 100644 --- a/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java +++ b/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java @@ -1569,13 +1569,14 @@ public void pathto(CommandContext args, CommandSender sender, NPC npc) { permission = "citizens.npc.playerlist") @Requirements(selected = true, ownership = true, types = EntityType.PLAYER) public void playerlist(CommandContext args, CommandSender sender, NPC npc) { - boolean remove = !npc.data().get("removefromplayerlist", Setting.REMOVE_PLAYERS_FROM_PLAYER_LIST.asBoolean()); + boolean remove = !npc.data().get(NPC.REMOVE_FROM_PLAYERLIST_METADATA, + Setting.REMOVE_PLAYERS_FROM_PLAYER_LIST.asBoolean()); if (args.hasFlag('a')) { remove = false; } else if (args.hasFlag('r')) { remove = true; } - npc.data().setPersistent("removefromplayerlist", remove); + npc.data().setPersistent(NPC.REMOVE_FROM_PLAYERLIST_METADATA, remove); if (npc.isSpawned()) { npc.despawn(DespawnReason.PENDING_RESPAWN); npc.spawn(npc.getOrAddTrait(CurrentLocation.class).getLocation(), SpawnReason.RESPAWN); diff --git a/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/entity/EntityHumanNPC.java b/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/entity/EntityHumanNPC.java index 896d22ac3..43986ece3 100644 --- a/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/entity/EntityHumanNPC.java +++ b/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/entity/EntityHumanNPC.java @@ -235,7 +235,7 @@ public NPC getNPC() { @Override public IChatBaseComponent getPlayerListName() { - if (Setting.REMOVE_PLAYERS_FROM_PLAYER_LIST.asBoolean()) { + if (npc.data().get(NPC.REMOVE_FROM_PLAYERLIST_METADATA, Setting.REMOVE_PLAYERS_FROM_PLAYER_LIST.asBoolean())) { return new ChatComponentText(""); } return super.getPlayerListName(); diff --git a/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/entity/EntityHumanNPC.java b/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/entity/EntityHumanNPC.java index 6c15a01ba..5b060b072 100644 --- a/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/entity/EntityHumanNPC.java +++ b/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/entity/EntityHumanNPC.java @@ -255,7 +255,7 @@ public NPC getNPC() { @Override public IChatBaseComponent getPlayerListName() { - if (Setting.REMOVE_PLAYERS_FROM_PLAYER_LIST.asBoolean()) { + if (npc.data().get(NPC.REMOVE_FROM_PLAYERLIST_METADATA, Setting.REMOVE_PLAYERS_FROM_PLAYER_LIST.asBoolean())) { return new ChatComponentText(""); } return super.getPlayerListName(); diff --git a/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/entity/EntityHumanNPC.java b/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/entity/EntityHumanNPC.java index d96ed24ae..88bf57544 100644 --- a/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/entity/EntityHumanNPC.java +++ b/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/entity/EntityHumanNPC.java @@ -238,7 +238,7 @@ public NPC getNPC() { @Override public IChatBaseComponent getPlayerListName() { - if (Setting.REMOVE_PLAYERS_FROM_PLAYER_LIST.asBoolean()) { + if (npc.data().get(NPC.REMOVE_FROM_PLAYERLIST_METADATA, Setting.REMOVE_PLAYERS_FROM_PLAYER_LIST.asBoolean())) { return new ChatComponentText(""); } return super.getPlayerListName(); diff --git a/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/entity/EntityHumanNPC.java b/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/entity/EntityHumanNPC.java index 891c8e8e2..9d1dfe8c0 100644 --- a/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/entity/EntityHumanNPC.java +++ b/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/entity/EntityHumanNPC.java @@ -229,7 +229,7 @@ public NPC getNPC() { @Override public IChatBaseComponent getPlayerListName() { - if (Setting.REMOVE_PLAYERS_FROM_PLAYER_LIST.asBoolean()) { + if (npc.data().get(NPC.REMOVE_FROM_PLAYERLIST_METADATA, Setting.REMOVE_PLAYERS_FROM_PLAYER_LIST.asBoolean())) { return new ChatComponentText(""); } return super.getPlayerListName(); diff --git a/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/util/NMSImpl.java b/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/util/NMSImpl.java index 646160dd4..568cd33a5 100644 --- a/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/util/NMSImpl.java +++ b/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/util/NMSImpl.java @@ -308,6 +308,13 @@ public void addOrRemoveFromPlayerList(org.bukkit.entity.Entity entity, boolean r } else if (!handle.world.getPlayers().contains(handle)) { ((List) handle.world.getPlayers()).add(handle); } + + try { + CHUNKMAP_UPDATE_PLAYER_STATUS.invoke(((WorldServer) handle.world).getChunkProvider().playerChunkMap, handle, + !remove); + } catch (Throwable e) { + e.printStackTrace(); + } // PlayerUpdateTask.addOrRemove(entity, remove); } @@ -1834,10 +1841,13 @@ public static void updateNavigation(NavigationAbstract navigation) { EntityType.SHULKER, EntityType.ENDERMITE, EntityType.ENDER_DRAGON, EntityType.BAT, EntityType.SLIME, EntityType.DOLPHIN, EntityType.MAGMA_CUBE, EntityType.HORSE, EntityType.GHAST, EntityType.SHULKER, EntityType.PHANTOM); + private static final MethodHandle BEHAVIOR_MAP = NMS.getGetter(BehaviorController.class, "c"); private static final MethodHandle BLOCK_POSITION_B_D = NMS.getMethodHandle(BlockPosition.PooledBlockPosition.class, "c", false, double.class, double.class, double.class); private static final MethodHandle BUKKITENTITY_FIELD_SETTER = NMS.getSetter(Entity.class, "bukkitEntity"); + private static final MethodHandle CHUNKMAP_UPDATE_PLAYER_STATUS = NMS.getMethodHandle(PlayerChunkMap.class, "a", + true, EntityPlayer.class, boolean.class); private static final Map, EntityTypes> CITIZENS_ENTITY_TYPES = Maps.newHashMap(); private static final MethodHandle CRAFT_BOSSBAR_HANDLE_FIELD = NMS.getSetter(CraftBossBar.class, "handle"); private static final float DEFAULT_SPEED = 1F; diff --git a/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/entity/EntityHumanNPC.java b/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/entity/EntityHumanNPC.java index ec42ea83c..c48b501e2 100644 --- a/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/entity/EntityHumanNPC.java +++ b/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/entity/EntityHumanNPC.java @@ -222,7 +222,7 @@ public NPC getNPC() { @Override public IChatBaseComponent getPlayerListName() { - if (Setting.REMOVE_PLAYERS_FROM_PLAYER_LIST.asBoolean()) { + if (npc.data().get(NPC.REMOVE_FROM_PLAYERLIST_METADATA, Setting.REMOVE_PLAYERS_FROM_PLAYER_LIST.asBoolean())) { return new ChatComponentText(""); } return super.getPlayerListName(); diff --git a/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/util/NMSImpl.java b/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/util/NMSImpl.java index 329881af4..8d9c8246d 100644 --- a/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/util/NMSImpl.java +++ b/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/util/NMSImpl.java @@ -312,6 +312,13 @@ public void addOrRemoveFromPlayerList(org.bukkit.entity.Entity entity, boolean r } else if (!handle.world.getPlayers().contains(handle)) { ((List) handle.world.getPlayers()).add(handle); } + + try { + CHUNKMAP_UPDATE_PLAYER_STATUS.invoke(((WorldServer) handle.world).getChunkProvider().playerChunkMap, handle, + !remove); + } catch (Throwable e) { + e.printStackTrace(); + } // PlayerUpdateTask.addOrRemove(entity, remove); } @@ -1888,8 +1895,11 @@ public static void updateNavigation(NavigationAbstract navigation) { EntityType.SILVERFISH, EntityType.SHULKER, EntityType.ENDERMITE, EntityType.ENDER_DRAGON, EntityType.BAT, EntityType.SLIME, EntityType.DOLPHIN, EntityType.MAGMA_CUBE, EntityType.HORSE, EntityType.GHAST, EntityType.SHULKER, EntityType.PHANTOM); + private static final MethodHandle BEHAVIOR_MAP = NMS.getGetter(BehaviorController.class, "c"); private static final MethodHandle BUKKITENTITY_FIELD_SETTER = NMS.getSetter(Entity.class, "bukkitEntity"); + private static final MethodHandle CHUNKMAP_UPDATE_PLAYER_STATUS = NMS.getMethodHandle(PlayerChunkMap.class, "a", + true, EntityPlayer.class, boolean.class); private static final Map, EntityTypes> CITIZENS_ENTITY_TYPES = Maps.newHashMap(); private static final MethodHandle CRAFT_BOSSBAR_HANDLE_FIELD = NMS.getSetter(CraftBossBar.class, "handle"); private static final float DEFAULT_SPEED = 1F; 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 38c5ad4a0..f4f7ae1e1 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 @@ -235,7 +235,7 @@ public NPC getNPC() { @Override public IChatBaseComponent getPlayerListName() { - if (Setting.REMOVE_PLAYERS_FROM_PLAYER_LIST.asBoolean()) { + if (npc.data().get(NPC.REMOVE_FROM_PLAYERLIST_METADATA, Setting.REMOVE_PLAYERS_FROM_PLAYER_LIST.asBoolean())) { return new ChatComponentText(""); } return super.getPlayerListName(); 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 597426571..872d30ae4 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 @@ -319,6 +319,13 @@ public void addOrRemoveFromPlayerList(org.bukkit.entity.Entity entity, boolean r } else if (!handle.world.getPlayers().contains(handle)) { ((List) handle.world.getPlayers()).add(handle); } + + try { + CHUNKMAP_UPDATE_PLAYER_STATUS.invoke(((WorldServer) handle.world).getChunkProvider().playerChunkMap, handle, + !remove); + } catch (Throwable e) { + e.printStackTrace(); + } // PlayerUpdateTask.addOrRemove(entity, remove); } @@ -1859,12 +1866,15 @@ public static void updateNavigation(NavigationAbstract navigation) { private static final MethodHandle ADVANCEMENT_PLAYER_FIELD = NMS.getFinalSetter(EntityPlayer.class, "advancementDataPlayer"); + 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, EntityType.SHULKER, EntityType.PHANTOM); private static final MethodHandle BEHAVIOR_MAP = NMS.getGetter(BehaviorController.class, "e"); private static final MethodHandle BUKKITENTITY_FIELD_SETTER = NMS.getSetter(Entity.class, "bukkitEntity"); + private static final MethodHandle CHUNKMAP_UPDATE_PLAYER_STATUS = NMS.getMethodHandle(PlayerChunkMap.class, "a", + true, EntityPlayer.class, boolean.class); private static final Map, EntityTypes> CITIZENS_ENTITY_TYPES = Maps.newHashMap(); private static final MethodHandle CRAFT_BOSSBAR_HANDLE_FIELD = NMS.getSetter(CraftBossBar.class, "handle"); private static MethodHandle CRAFTSOUND_GETSOUND = NMS.getMethodHandle(CraftSound.class, "getSound", false, 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 fe9cdfc9b..15887cf7f 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 @@ -285,7 +285,7 @@ public ServerStatsCounter getStats() { @Override public Component getTabListDisplayName() { - if (Setting.REMOVE_PLAYERS_FROM_PLAYER_LIST.asBoolean()) { + if (npc.data().get(NPC.REMOVE_FROM_PLAYERLIST_METADATA, Setting.REMOVE_PLAYERS_FROM_PLAYER_LIST.asBoolean())) { return new TextComponent(""); } return super.getTabListDisplayName(); 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 ca3be9828..e116a30f8 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 @@ -319,6 +319,13 @@ public void addOrRemoveFromPlayerList(org.bukkit.entity.Entity entity, boolean r } else if (!handle.level.players().contains(handle)) { ((List) handle.level.players()).add(handle); } + + try { + CHUNKMAP_UPDATE_PLAYER_STATUS.invoke( + ((ServerChunkCache) ((ServerLevel) handle.level).getChunkSource()).chunkMap, handle, !remove); + } catch (Throwable e) { + e.printStackTrace(); + } // PlayerUpdateTask.addOrRemove(entity, remove); } @@ -1868,12 +1875,15 @@ public static void updateNavigation(PathNavigation navigation) { } 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, EntityType.SHULKER, EntityType.PHANTOM); private static final MethodHandle BEHAVIOR_MAP = NMS.getGetter(Brain.class, "f"); private static final MethodHandle BUKKITENTITY_FIELD_SETTER = NMS.getSetter(Entity.class, "bukkitEntity"); + private static final MethodHandle CHUNKMAP_UPDATE_PLAYER_STATUS = NMS.getMethodHandle(ChunkMap.class, "a", true, + ServerPlayer.class, boolean.class); private static final Map, net.minecraft.world.entity.EntityType> CITIZENS_ENTITY_TYPES = Maps .newHashMap(); private static final MethodHandle CRAFT_BOSSBAR_HANDLE_FIELD = NMS.getSetter(CraftBossBar.class, "handle"); diff --git a/v1_18_R1/src/main/java/net/citizensnpcs/nms/v1_18_R1/entity/EntityHumanNPC.java b/v1_18_R1/src/main/java/net/citizensnpcs/nms/v1_18_R1/entity/EntityHumanNPC.java index 47fff7f63..3d9bedb88 100644 --- a/v1_18_R1/src/main/java/net/citizensnpcs/nms/v1_18_R1/entity/EntityHumanNPC.java +++ b/v1_18_R1/src/main/java/net/citizensnpcs/nms/v1_18_R1/entity/EntityHumanNPC.java @@ -285,7 +285,7 @@ public ServerStatsCounter getStats() { @Override public Component getTabListDisplayName() { - if (Setting.REMOVE_PLAYERS_FROM_PLAYER_LIST.asBoolean()) { + if (npc.data().get(NPC.REMOVE_FROM_PLAYERLIST_METADATA, Setting.REMOVE_PLAYERS_FROM_PLAYER_LIST.asBoolean())) { return new TextComponent(""); } return super.getTabListDisplayName(); @@ -489,7 +489,6 @@ public void tick() { Bukkit.getServer().getPluginManager().unsubscribeFromPermission("bukkit.broadcast.user", getBukkitEntity()); updatePackets(npc.getNavigator().isNavigating()); - npc.update(); } diff --git a/v1_18_R1/src/main/java/net/citizensnpcs/nms/v1_18_R1/entity/HumanController.java b/v1_18_R1/src/main/java/net/citizensnpcs/nms/v1_18_R1/entity/HumanController.java index ce8e96c01..61a1797f2 100644 --- a/v1_18_R1/src/main/java/net/citizensnpcs/nms/v1_18_R1/entity/HumanController.java +++ b/v1_18_R1/src/main/java/net/citizensnpcs/nms/v1_18_R1/entity/HumanController.java @@ -62,7 +62,7 @@ public void run() { if (getBukkitEntity() == null || !getBukkitEntity().isValid() || getBukkitEntity() != handle.getBukkitEntity()) return; - boolean removeFromPlayerList = npc.data().get("removefromplayerlist", + boolean removeFromPlayerList = npc.data().get(NPC.REMOVE_FROM_PLAYERLIST_METADATA, Setting.REMOVE_PLAYERS_FROM_PLAYER_LIST.asBoolean()); NMS.addOrRemoveFromPlayerList(getBukkitEntity(), removeFromPlayerList); } diff --git a/v1_18_R1/src/main/java/net/citizensnpcs/nms/v1_18_R1/util/NMSImpl.java b/v1_18_R1/src/main/java/net/citizensnpcs/nms/v1_18_R1/util/NMSImpl.java index 943c4af57..9efd037bf 100644 --- a/v1_18_R1/src/main/java/net/citizensnpcs/nms/v1_18_R1/util/NMSImpl.java +++ b/v1_18_R1/src/main/java/net/citizensnpcs/nms/v1_18_R1/util/NMSImpl.java @@ -319,6 +319,13 @@ public void addOrRemoveFromPlayerList(org.bukkit.entity.Entity entity, boolean r } else if (!handle.level.players().contains(handle)) { ((List) handle.level.players()).add(handle); } + + try { + CHUNKMAP_UPDATE_PLAYER_STATUS.invoke(((ServerLevel) handle.level).getChunkSource().chunkMap, handle, + !remove); + } catch (Throwable e) { + e.printStackTrace(); + } // PlayerUpdateTask.addOrRemove(entity, remove); } @@ -1291,7 +1298,7 @@ public boolean tick(org.bukkit.entity.Entity next) { throw new ReportedException(crashreport); } } - boolean removeFromPlayerList = ((NPCHolder) entity).getNPC().data().get("removefromplayerlist", + boolean removeFromPlayerList = ((NPCHolder) entity).getNPC().data().get(NPC.REMOVE_FROM_PLAYERLIST_METADATA, Setting.REMOVE_PLAYERS_FROM_PLAYER_LIST.asBoolean()); if (!entity.isAlive()) { ((ServerLevel) entity.level).getChunkSource().removeEntity(entity); @@ -1868,12 +1875,16 @@ public static void updateNavigation(PathNavigation navigation) { } private static final MethodHandle ADVANCEMENTS_PLAYER_FIELD = NMS.getFinalSetter(ServerPlayer.class, "cs"); + 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, EntityType.SHULKER, EntityType.PHANTOM); + private static final MethodHandle BEHAVIOR_TREE_MAP = NMS.getGetter(Brain.class, "f"); private static final MethodHandle BUKKITENTITY_FIELD_SETTER = NMS.getSetter(Entity.class, "bukkitEntity"); + private static final MethodHandle CHUNKMAP_UPDATE_PLAYER_STATUS = NMS.getMethodHandle(ChunkMap.class, "a", true, + ServerPlayer.class, boolean.class); private static final Map, net.minecraft.world.entity.EntityType> CITIZENS_ENTITY_TYPES = Maps .newHashMap(); private static final MethodHandle CRAFT_BOSSBAR_HANDLE_FIELD = NMS.getSetter(CraftBossBar.class, "handle"); diff --git a/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/entity/HumanController.java b/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/entity/HumanController.java index e46335531..916565f5b 100644 --- a/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/entity/HumanController.java +++ b/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/entity/HumanController.java @@ -65,7 +65,7 @@ public void run() { if (getBukkitEntity() == null || !getBukkitEntity().isValid() || getBukkitEntity() != handle.getBukkitEntity()) return; - boolean removeFromPlayerList = npc.data().get("removefromplayerlist", + boolean removeFromPlayerList = npc.data().get(NPC.REMOVE_FROM_PLAYERLIST_METADATA, Setting.REMOVE_PLAYERS_FROM_PLAYER_LIST.asBoolean()); NMS.addOrRemoveFromPlayerList(getBukkitEntity(), removeFromPlayerList); }