From c032f55d2e140f4654815d3c21c8f5c4d2fc1154 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Fri, 10 Feb 2023 16:20:43 +0100 Subject: [PATCH 1/9] Fix REntityServer click listener --- .../src/de/steamwar/entity/REntityServer.java | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java b/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java index ecc59c7..df18398 100644 --- a/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java +++ b/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java @@ -47,8 +47,17 @@ public class REntityServer implements Listener { private static final HashSet emptyPlayers = new HashSet<>(0); private static final Class useEntity = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInUseEntity"); + private static final Class useEntityEnumAction = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInUseEntity$EnumEntityUseAction"); private static final Reflection.FieldAccessor useEntityTarget = Reflection.getField(useEntity, int.class, 0); - private static final Reflection.FieldAccessor useEntityAction = Reflection.getField(useEntity, int.class, 1); + private static final Reflection.FieldAccessor useEntityAction = (Reflection.FieldAccessor) Reflection.getField(useEntity, useEntityEnumAction, 0); + private static final Reflection.MethodInvoker useEntityGetAction; + static { + if (useEntityEnumAction.isEnum()) { + useEntityGetAction = null; + } else { + useEntityGetAction = Reflection.getMethod(useEntity, "a"); + } + } private final ConcurrentHashMap entityMap = new ConcurrentHashMap<>(); private final HashMap> entities = new HashMap<>(); @@ -64,7 +73,15 @@ public class REntityServer implements Listener { REntity entity = entityMap.get(target); if (entity == null) return packet; - EntityAction action = useEntityAction.get(packet) == 1 ? EntityAction.ATTACK : EntityAction.INTERACT; + Object entityAction = useEntityAction.get(packet); + int entityActionOrdinal; + if (useEntityEnumAction.isEnum()) { + entityActionOrdinal = ((Enum) entityAction).ordinal(); + } else { + entityActionOrdinal = ((Enum) useEntityGetAction.invoke(entityAction)).ordinal(); + } + + EntityAction action = entityActionOrdinal == 1 ? EntityAction.ATTACK : EntityAction.INTERACT; Bukkit.getScheduler().runTask(Core.getInstance(), () -> { callback.onAction(player, entity, action); }); From 833e6f58184880317e5ad4c338f96af8ee17030e Mon Sep 17 00:00:00 2001 From: yoyosource Date: Thu, 23 Feb 2023 11:03:36 +0100 Subject: [PATCH 2/9] Fix stuff from merge --- SpigotCore_Main/src/de/steamwar/entity/REntityServer.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java b/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java index df18398..f40e3a9 100644 --- a/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java +++ b/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java @@ -22,6 +22,7 @@ package de.steamwar.entity; import com.comphenix.tinyprotocol.Reflection; import com.comphenix.tinyprotocol.TinyProtocol; import de.steamwar.core.Core; +import de.steamwar.core.FlatteningWrapper; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Player; @@ -93,8 +94,11 @@ public class REntityServer implements Listener { } public void setCallback(EntityActionListener callback) { + boolean uninitialized = this.callback == null; this.callback = callback; - TinyProtocol.instance.addFilter(useEntity, filter); + + if(uninitialized) + TinyProtocol.instance.addFilter(useEntity, filter); } public void addPlayer(Player player) { @@ -261,7 +265,7 @@ public class REntityServer implements Listener { } private int viewRadius(Player player) { - return player.getClientViewDistance() / 2; + return FlatteningWrapper.impl.getViewDistance(player) / 2; } private long entityToId(REntity entity) { From 26f267cc287105a7438a5ccd58811bac2439c772 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Thu, 23 Feb 2023 14:26:16 +0100 Subject: [PATCH 3/9] Update CommonCore --- CommonCore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CommonCore b/CommonCore index aa70f42..95b46f3 160000 --- a/CommonCore +++ b/CommonCore @@ -1 +1 @@ -Subproject commit aa70f423d87e9f6534ad2dd1f20a5122179c423f +Subproject commit 95b46f3a9a83eb63f5770552134967a1921ae159 From ad9b2465ee7140696b56eb1710b2205e2b032642 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Thu, 23 Feb 2023 16:59:36 +0100 Subject: [PATCH 4/9] Simplify REntityFilter --- .../src/de/steamwar/entity/REntityServer.java | 37 +++++++------------ 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java b/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java index f40e3a9..7c60ad4 100644 --- a/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java +++ b/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java @@ -40,6 +40,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.function.BiConsumer; import java.util.function.BiFunction; import java.util.function.Consumer; +import java.util.function.Function; public class REntityServer implements Listener { @@ -48,15 +49,16 @@ public class REntityServer implements Listener { private static final HashSet emptyPlayers = new HashSet<>(0); private static final Class useEntity = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInUseEntity"); - private static final Class useEntityEnumAction = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInUseEntity$EnumEntityUseAction"); private static final Reflection.FieldAccessor useEntityTarget = Reflection.getField(useEntity, int.class, 0); - private static final Reflection.FieldAccessor useEntityAction = (Reflection.FieldAccessor) Reflection.getField(useEntity, useEntityEnumAction, 0); - private static final Reflection.MethodInvoker useEntityGetAction; + private static final Class useEntityEnumAction = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInUseEntity$EnumEntityUseAction"); + private static final Reflection.FieldAccessor useEntityAction = Reflection.getField(useEntity, useEntityEnumAction, 0); + private static final Function getEntityAction; static { - if (useEntityEnumAction.isEnum()) { - useEntityGetAction = null; + if(Core.getVersion() > 15) { + Reflection.MethodInvoker useEntityGetAction = Reflection.getMethod(useEntity, "a"); + getEntityAction = value -> ((Enum) useEntityGetAction.invoke(value)).ordinal(); } else { - useEntityGetAction = Reflection.getMethod(useEntity, "a"); + getEntityAction = value -> ((Enum) value).ordinal(); } } @@ -68,24 +70,13 @@ public class REntityServer implements Listener { private EntityActionListener callback = null; - private BiFunction filter = (player, packet) -> { - if (callback == null) return packet; - int target = useEntityTarget.get(packet); - REntity entity = entityMap.get(target); - if (entity == null) return packet; + private final BiFunction filter = (player, packet) -> { + REntity entity = entityMap.get(useEntityTarget.get(packet)); + if (entity == null) + return packet; - Object entityAction = useEntityAction.get(packet); - int entityActionOrdinal; - if (useEntityEnumAction.isEnum()) { - entityActionOrdinal = ((Enum) entityAction).ordinal(); - } else { - entityActionOrdinal = ((Enum) useEntityGetAction.invoke(entityAction)).ordinal(); - } - - EntityAction action = entityActionOrdinal == 1 ? EntityAction.ATTACK : EntityAction.INTERACT; - Bukkit.getScheduler().runTask(Core.getInstance(), () -> { - callback.onAction(player, entity, action); - }); + EntityAction action = getEntityAction.apply(useEntityAction.get(packet)) == 1 ? EntityAction.ATTACK : EntityAction.INTERACT; + Bukkit.getScheduler().runTask(Core.getInstance(), () -> callback.onAction(player, entity, action)); return null; }; From 1fbc3c883568569293aadca331a42ffefbcbebca Mon Sep 17 00:00:00 2001 From: Lixfel Date: Thu, 23 Feb 2023 17:01:12 +0100 Subject: [PATCH 5/9] Fix build --- .../src/de/steamwar/core/events/PlayerJoinedEvent.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/SpigotCore_Main/src/de/steamwar/core/events/PlayerJoinedEvent.java b/SpigotCore_Main/src/de/steamwar/core/events/PlayerJoinedEvent.java index aae2000..fe342bd 100644 --- a/SpigotCore_Main/src/de/steamwar/core/events/PlayerJoinedEvent.java +++ b/SpigotCore_Main/src/de/steamwar/core/events/PlayerJoinedEvent.java @@ -35,10 +35,7 @@ public class PlayerJoinedEvent implements Listener{ @EventHandler(priority = EventPriority.LOWEST) private void onJoin(PlayerJoinEvent event) { Player player = event.getPlayer(); - if(!Statement.productionDatabase()) { - SteamwarUser.createOrUpdateUsername(player.getUniqueId(), player.getName()); - } - SteamwarUser user = SteamwarUser.get(player.getUniqueId()); + SteamwarUser user = Statement.productionDatabase() ? SteamwarUser.get(player.getUniqueId()) : SteamwarUser.getOrCreate(player.getUniqueId(), player.getName(), uuid -> {}, (oldName, newName) -> {}); if(user.getUserGroup() != UserGroup.Member) { UserGroup group = user.getUserGroup(); From 4ec767e9225cad64e3386bcc12a6c1635eec456a Mon Sep 17 00:00:00 2001 From: Lixfel Date: Thu, 23 Feb 2023 17:20:55 +0100 Subject: [PATCH 6/9] Hotfix SWUser Init --- CommonCore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CommonCore b/CommonCore index 95b46f3..3778d6c 160000 --- a/CommonCore +++ b/CommonCore @@ -1 +1 @@ -Subproject commit 95b46f3a9a83eb63f5770552134967a1921ae159 +Subproject commit 3778d6c1f943bb87025e4a3ab23f76c25e6325b6 From 5e6b86f2ba0dded68a4589ac76285e1a17e07137 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Thu, 23 Feb 2023 17:22:38 +0100 Subject: [PATCH 7/9] Hotfix REntityServer --- SpigotCore_Main/src/de/steamwar/entity/REntityServer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java b/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java index 7c60ad4..d01a64f 100644 --- a/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java +++ b/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java @@ -55,7 +55,7 @@ public class REntityServer implements Listener { private static final Function getEntityAction; static { if(Core.getVersion() > 15) { - Reflection.MethodInvoker useEntityGetAction = Reflection.getMethod(useEntity, "a"); + Reflection.MethodInvoker useEntityGetAction = Reflection.getMethod(useEntityEnumAction, "a"); getEntityAction = value -> ((Enum) useEntityGetAction.invoke(value)).ordinal(); } else { getEntityAction = value -> ((Enum) value).ordinal(); From 02d756137e437f0f2a6fd228eb030505469ce341 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Thu, 23 Feb 2023 17:56:25 +0100 Subject: [PATCH 8/9] Fix Memory Leak --- .../src/de/steamwar/entity/REntityServer.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java b/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java index d01a64f..b2bec15 100644 --- a/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java +++ b/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java @@ -197,11 +197,18 @@ public class REntityServer implements Listener { @EventHandler public void onQuit(PlayerQuitEvent e) { Player player = e.getPlayer(); + viewDistance.remove(player); Location location = lastLocation.remove(player); if(location == null) return; - forChunkInView(player, location, (x, z) -> players.get(chunkToId(x, z)).remove(player)); + forChunkInView(player, location, (x, z) -> { + long id = chunkToId(x, z); + Set playersInChunk = players.get(id); + playersInChunk.remove(player); + if(playersInChunk.isEmpty()) + players.remove(id); + }); } private void onMissing(Set of, Set in, Consumer> packetProvider) { @@ -237,7 +244,12 @@ public class REntityServer implements Listener { private void removePlayerFromChunk(Player player, int x, int z) { long id = chunkToId(x, z); - players.get(id).remove(player); + + Set playersInChunk = players.get(id); + playersInChunk.remove(player); + if(playersInChunk.isEmpty()) + players.remove(id); + for(REntity entity : entities.getOrDefault(id, emptyEntities)) { entity.despawn(packet -> TinyProtocol.instance.sendPacket(player, packet)); } From 40d52d23550c4e8d9cee6533cf053fc8bb85c329 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Thu, 23 Feb 2023 18:01:17 +0100 Subject: [PATCH 9/9] Fix Memory Leak2 --- SpigotCore_Main/src/de/steamwar/entity/REntityServer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java b/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java index b2bec15..1ed4c6f 100644 --- a/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java +++ b/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java @@ -197,7 +197,6 @@ public class REntityServer implements Listener { @EventHandler public void onQuit(PlayerQuitEvent e) { Player player = e.getPlayer(); - viewDistance.remove(player); Location location = lastLocation.remove(player); if(location == null) return; @@ -209,6 +208,7 @@ public class REntityServer implements Listener { if(playersInChunk.isEmpty()) players.remove(id); }); + viewDistance.remove(player); } private void onMissing(Set of, Set in, Consumer> packetProvider) {