From 740ebc0c1df756181c8e433b6f713d2bf13adb95 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Fri, 3 Feb 2023 17:59:58 +0100 Subject: [PATCH 1/8] Add click callback for REntityServer --- .../src/de/steamwar/entity/REntityServer.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java b/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java index 70a5fee..5359b4a 100644 --- a/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java +++ b/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java @@ -19,8 +19,10 @@ package de.steamwar.entity; +import com.comphenix.tinyprotocol.Reflection; import com.comphenix.tinyprotocol.TinyProtocol; import de.steamwar.core.Core; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -33,7 +35,9 @@ import org.bukkit.event.player.PlayerQuitEvent; import java.util.HashMap; import java.util.HashSet; import java.util.Set; +import java.util.concurrent.atomic.AtomicReference; import java.util.function.BiConsumer; +import java.util.function.BiFunction; import java.util.function.Consumer; @@ -42,13 +46,41 @@ public class REntityServer implements Listener { private static final HashSet emptyEntities = new HashSet<>(0); private static final HashSet emptyPlayers = new HashSet<>(0); + private static final Class useEntity = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInUseEntity"); + 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 final HashMap entityMap = new HashMap<>(); private final HashMap> entities = new HashMap<>(); private final HashMap> players = new HashMap<>(); private final HashMap lastLocation = new HashMap<>(); private final HashMap viewDistance = new HashMap<>(); + private EntityActionListener callback = null; + + private BiFunction filter = (player, packet) -> { + if (callback == null) return packet; + int target = useEntityTarget.get(packet); + if (!entityMap.containsKey(target)) return packet; + + REntity entity = entityMap.get(target); + int action = useEntityAction.get(packet); + if (action == 2) action = 0; + int finalAction = action; + + Bukkit.getScheduler().runTaskLater(Core.getInstance(), () -> { + callback.onAction(player, entity, finalAction == 0 ? EntityAction.INTERACT : EntityAction.ATTACK); + }, 0); + return null; + }; + public REntityServer() { Core.getInstance().getServer().getPluginManager().registerEvents(this, Core.getInstance()); + TinyProtocol.instance.addFilter(useEntity, filter); + } + + public void setCallback(EntityActionListener callback) { + this.callback = callback; } public void addPlayer(Player player) { @@ -64,6 +96,7 @@ public class REntityServer implements Listener { } public void close() { + TinyProtocol.instance.removeFilter(useEntity, filter); for(Player player : lastLocation.keySet().toArray(new Player[0])) { removePlayer(player); } @@ -71,6 +104,7 @@ public class REntityServer implements Listener { } void addEntity(REntity entity) { + entityMap.put(entity.entityId, entity); addEntityToChunk(entity); entity.spawn(packet -> updateEntity(entity, packet)); } @@ -104,6 +138,7 @@ public class REntityServer implements Listener { void removeEntity(REntity entity) { entity.despawn(packet -> updateEntity(entity, packet)); removeEntityFromChunk(entity); + entityMap.put(entity.entityId, entity); } private void addEntityToChunk(REntity entity) { @@ -226,4 +261,13 @@ public class REntityServer implements Listener { private long chunkToId(int x, int z) { return ((long) x << 32) + z; } + + public enum EntityAction { + INTERACT, + ATTACK, + } + + public interface EntityActionListener { + void onAction(Player player, REntity entity, EntityAction action); + } } From 6c461fc38f5b77a8c93038cbffa9437bbf9f3b39 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Sat, 4 Feb 2023 11:55:36 +0100 Subject: [PATCH 2/8] Hotfix CommonCore (CommandFramework) --- CommonCore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CommonCore b/CommonCore index 9ea02eb..89b0c14 160000 --- a/CommonCore +++ b/CommonCore @@ -1 +1 @@ -Subproject commit 9ea02ebcd4620e7baa6980cd88e1a4dabd59e50c +Subproject commit 89b0c14da664589a7c9699d73bf72028cdf9dd0d From 495e33b195ee85d24ad347f7811468a407adf500 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Sat, 4 Feb 2023 14:37:04 +0100 Subject: [PATCH 3/8] Rebuild --- SpigotCore_Main/src/de/steamwar/entity/REntityServer.java | 1 - 1 file changed, 1 deletion(-) diff --git a/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java b/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java index 5359b4a..f0cf1eb 100644 --- a/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java +++ b/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java @@ -35,7 +35,6 @@ import org.bukkit.event.player.PlayerQuitEvent; import java.util.HashMap; import java.util.HashSet; import java.util.Set; -import java.util.concurrent.atomic.AtomicReference; import java.util.function.BiConsumer; import java.util.function.BiFunction; import java.util.function.Consumer; From b2122d24e8271ef3ad700db87d5d634cf53809a8 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Sat, 4 Feb 2023 14:39:28 +0100 Subject: [PATCH 4/8] Fix removeEntity --- 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 f0cf1eb..68b2a11 100644 --- a/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java +++ b/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java @@ -137,7 +137,7 @@ public class REntityServer implements Listener { void removeEntity(REntity entity) { entity.despawn(packet -> updateEntity(entity, packet)); removeEntityFromChunk(entity); - entityMap.put(entity.entityId, entity); + entityMap.remove(entity.entityId); } private void addEntityToChunk(REntity entity) { From b1dea856fc602ecee1601b2f97a48de75b375ce5 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Sat, 4 Feb 2023 18:20:40 +0100 Subject: [PATCH 5/8] Add REntity x,y,z getters --- .../src/de/steamwar/entity/REntity.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/SpigotCore_Main/src/de/steamwar/entity/REntity.java b/SpigotCore_Main/src/de/steamwar/entity/REntity.java index d6ace1a..2d95c9b 100644 --- a/SpigotCore_Main/src/de/steamwar/entity/REntity.java +++ b/SpigotCore_Main/src/de/steamwar/entity/REntity.java @@ -20,13 +20,17 @@ package de.steamwar.entity; import com.comphenix.tinyprotocol.Reflection; -import de.steamwar.core.*; +import de.steamwar.core.BountifulWrapper; +import de.steamwar.core.Core; +import de.steamwar.core.FlatteningWrapper; +import de.steamwar.core.ProtocolWrapper; import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntList; import lombok.Getter; import org.bukkit.Location; import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; +import org.bukkit.util.Vector; import java.util.*; import java.util.function.Consumer; @@ -214,6 +218,18 @@ public class REntity { } } + public double getX() { + return x; + } + + public double getY() { + return y; + } + + public double getZ() { + return z; + } + private static int spawnPacketOffset() { switch (Core.getVersion()) { case 8: From b5a9b3d068dc27bac29e94ba608173bc1a21e7ea Mon Sep 17 00:00:00 2001 From: yoyosource Date: Sat, 4 Feb 2023 19:56:04 +0100 Subject: [PATCH 6/8] Fix pr stuff --- SpigotCore_Main/src/de/steamwar/entity/REntityServer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java b/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java index 68b2a11..7ebb46a 100644 --- a/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java +++ b/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java @@ -67,9 +67,9 @@ public class REntityServer implements Listener { if (action == 2) action = 0; int finalAction = action; - Bukkit.getScheduler().runTaskLater(Core.getInstance(), () -> { + Bukkit.getScheduler().runTask(Core.getInstance(), () -> { callback.onAction(player, entity, finalAction == 0 ? EntityAction.INTERACT : EntityAction.ATTACK); - }, 0); + }); return null; }; From c02d7c2c7d975b3e94f1438f41e7a8ea1ae259e7 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Sat, 4 Feb 2023 20:24:24 +0100 Subject: [PATCH 7/8] Fix pr stuff --- .../src/de/steamwar/entity/REntityServer.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java b/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java index 7ebb46a..ecc59c7 100644 --- a/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java +++ b/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java @@ -35,6 +35,7 @@ import org.bukkit.event.player.PlayerQuitEvent; import java.util.HashMap; import java.util.HashSet; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import java.util.function.BiConsumer; import java.util.function.BiFunction; import java.util.function.Consumer; @@ -49,7 +50,7 @@ public class REntityServer implements Listener { 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 final HashMap entityMap = new HashMap<>(); + private final ConcurrentHashMap entityMap = new ConcurrentHashMap<>(); private final HashMap> entities = new HashMap<>(); private final HashMap> players = new HashMap<>(); private final HashMap lastLocation = new HashMap<>(); @@ -60,26 +61,23 @@ public class REntityServer implements Listener { private BiFunction filter = (player, packet) -> { if (callback == null) return packet; int target = useEntityTarget.get(packet); - if (!entityMap.containsKey(target)) return packet; - REntity entity = entityMap.get(target); - int action = useEntityAction.get(packet); - if (action == 2) action = 0; - int finalAction = action; + if (entity == null) return packet; + EntityAction action = useEntityAction.get(packet) == 1 ? EntityAction.ATTACK : EntityAction.INTERACT; Bukkit.getScheduler().runTask(Core.getInstance(), () -> { - callback.onAction(player, entity, finalAction == 0 ? EntityAction.INTERACT : EntityAction.ATTACK); + callback.onAction(player, entity, action); }); return null; }; public REntityServer() { Core.getInstance().getServer().getPluginManager().registerEvents(this, Core.getInstance()); - TinyProtocol.instance.addFilter(useEntity, filter); } public void setCallback(EntityActionListener callback) { this.callback = callback; + TinyProtocol.instance.addFilter(useEntity, filter); } public void addPlayer(Player player) { From e39e128aa69635c2c4c888c5fbd86c7d5602d092 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Sun, 5 Feb 2023 19:17:25 +0100 Subject: [PATCH 8/8] prevent double filter --- SpigotCore_Main/src/de/steamwar/entity/REntityServer.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java b/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java index ecc59c7..a718c41 100644 --- a/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java +++ b/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java @@ -76,8 +76,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) {