From db772aaf62b8346edf5a107daeb64ae12c8b9923 Mon Sep 17 00:00:00 2001 From: Helvetica Volubi Date: Tue, 23 Dec 2025 10:07:28 +0800 Subject: [PATCH] fix: fix waypoint module --- ...onfig-to-enable-waypoint-command-bar.patch | 20 +++++++---- .../concurrent/AbstractConcurrentTable.java | 2 ++ .../utils/concurrent/ConcurrentTable.java | 12 ++++++- .../concurrent/OptimizedConcurrentTable.java | 34 +++++++++++++++++-- .../lophine/utils/concurrent/TableEntry.java | 6 +++- 5 files changed, 63 insertions(+), 11 deletions(-) diff --git a/lophine-server/minecraft-patches/features/0007-Add-config-to-enable-waypoint-command-bar.patch b/lophine-server/minecraft-patches/features/0007-Add-config-to-enable-waypoint-command-bar.patch index 01e5a80..58f5602 100644 --- a/lophine-server/minecraft-patches/features/0007-Add-config-to-enable-waypoint-command-bar.patch +++ b/lophine-server/minecraft-patches/features/0007-Add-config-to-enable-waypoint-command-bar.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Add config to enable waypoint command & bar use concurrent method to fix it (now, they are thread safe) diff --git a/net/minecraft/commands/Commands.java b/net/minecraft/commands/Commands.java -index b9dc7dd77aeb6e3b59b6903cb5094b7eadee4d2d..b049520cca9f365282493d7c442bbcd3075d78ac 100644 +index 23f047a47cdccc90a96153cc52bdedf91cd15db9..9cfcac44b4d51cb5f122d7e1fa980791a23dd38f 100644 --- a/net/minecraft/commands/Commands.java +++ b/net/minecraft/commands/Commands.java @@ -270,7 +270,11 @@ public class Commands { @@ -23,7 +23,7 @@ index b9dc7dd77aeb6e3b59b6903cb5094b7eadee4d2d..b049520cca9f365282493d7c442bbcd3 WorldBorderCommand.register(this.dispatcher); if (JvmProfiler.INSTANCE.isAvailable()) { diff --git a/net/minecraft/server/waypoints/ServerWaypointManager.java b/net/minecraft/server/waypoints/ServerWaypointManager.java -index 1cbc46e480cc7d109c6128f109a1a9e38bf1a193..9492698541bfe704a1075a8fb58a9d7624895e48 100644 +index 1cbc46e480cc7d109c6128f109a1a9e38bf1a193..d2c0b532200f274e44f18147d294dfe5d3f52d1d 100644 --- a/net/minecraft/server/waypoints/ServerWaypointManager.java +++ b/net/minecraft/server/waypoints/ServerWaypointManager.java @@ -16,22 +16,31 @@ import net.minecraft.world.waypoints.WaypointManager; @@ -130,8 +130,12 @@ index 1cbc46e480cc7d109c6128f109a1a9e38bf1a193..9492698541bfe704a1075a8fb58a9d76 } public void remakeConnections(WaypointTransmitter waypoint) { -@@ -86,10 +129,15 @@ public class ServerWaypointManager implements WaypointManager { +- this.connections.put(player, waypoint, connection); ++ this.connections.putOrUpdate(player, waypoint, connection); connection.connect(); }, () -> { - WaypointTransmitter.Connection connection = this.connections.remove(player, waypoint); @@ -150,8 +154,12 @@ index 1cbc46e480cc7d109c6128f109a1a9e38bf1a193..9492698541bfe704a1075a8fb58a9d76 }); } } -@@ -106,7 +154,8 @@ public class ServerWaypointManager implements WaypointManager { + connection1.connect(); +- this.connections.put(player, waypoint, connection1); ++ this.connections.putOrUpdate(player, waypoint, connection1); }, () -> { connection.disconnect(); - this.connections.remove(player, waypoint); diff --git a/lophine-server/src/main/java/fun/bm/lophine/utils/concurrent/AbstractConcurrentTable.java b/lophine-server/src/main/java/fun/bm/lophine/utils/concurrent/AbstractConcurrentTable.java index 7a886d8..f187916 100644 --- a/lophine-server/src/main/java/fun/bm/lophine/utils/concurrent/AbstractConcurrentTable.java +++ b/lophine-server/src/main/java/fun/bm/lophine/utils/concurrent/AbstractConcurrentTable.java @@ -4,6 +4,8 @@ import java.util.List; import java.util.Map; public abstract class AbstractConcurrentTable { + public abstract void putOrUpdate(X x, Y y, Z z); + public abstract void put(X x, Y y, Z z); public abstract void remove(X x, Y y, Z z); diff --git a/lophine-server/src/main/java/fun/bm/lophine/utils/concurrent/ConcurrentTable.java b/lophine-server/src/main/java/fun/bm/lophine/utils/concurrent/ConcurrentTable.java index 5733c83..9965f35 100644 --- a/lophine-server/src/main/java/fun/bm/lophine/utils/concurrent/ConcurrentTable.java +++ b/lophine-server/src/main/java/fun/bm/lophine/utils/concurrent/ConcurrentTable.java @@ -10,9 +10,19 @@ import java.util.function.Predicate; public class ConcurrentTable extends AbstractConcurrentTable { protected final ConcurrentLinkedDeque> data = new ConcurrentLinkedDeque<>(); + @Override + public void putOrUpdate(X x, Y y, Z z) { + for (TableEntry entry : data) { + if (entry.getX().equals(x) && entry.getY().equals(y)) { + entry.setZ(z); + return; + } + } + this.put(x, y, z); + } + @Override public void put(X x, Y y, Z z) { - if (true) return; // TODO: because of some bug, we disabled it data.add(new TableEntry<>(x, y, z)); } diff --git a/lophine-server/src/main/java/fun/bm/lophine/utils/concurrent/OptimizedConcurrentTable.java b/lophine-server/src/main/java/fun/bm/lophine/utils/concurrent/OptimizedConcurrentTable.java index b8168b2..6744131 100644 --- a/lophine-server/src/main/java/fun/bm/lophine/utils/concurrent/OptimizedConcurrentTable.java +++ b/lophine-server/src/main/java/fun/bm/lophine/utils/concurrent/OptimizedConcurrentTable.java @@ -11,9 +11,30 @@ public class OptimizedConcurrentTable extends ConcurrentTable private final ConcurrentHashMap>> zxIndex = new ConcurrentHashMap<>(); @Override - public void put(X x, Y y, Z z) { - if (true) return; // TODO: because of some bug, we disabled it - super.put(x, y, z); + public void putOrUpdate(X x, Y y, Z z) { + boolean updated = false; + + for (TableEntry entry : data) { + if (entry.getX().equals(x) && entry.getY().equals(y)) { + removeFromIndex(xyIndex, entry.getX(), entry.getY(), entry.getZ()); + removeFromIndex(yzIndex, entry.getY(), entry.getZ(), entry.getX()); + removeFromIndex(zxIndex, entry.getZ(), entry.getX(), entry.getY()); + + entry.setZ(z); + + putData(x, y, z); + + updated = true; + break; + } + } + + if (!updated) { + this.put(x, y, z); + } + } + + private void putData(X x, Y y, Z z) { xyIndex.computeIfAbsent(x, k -> new ConcurrentHashMap<>()) .computeIfAbsent(y, k -> ConcurrentHashMap.newKeySet()).add(z); yzIndex.computeIfAbsent(y, k -> new ConcurrentHashMap<>()) @@ -22,6 +43,13 @@ public class OptimizedConcurrentTable extends ConcurrentTable .computeIfAbsent(x, k -> ConcurrentHashMap.newKeySet()).add(y); } + + @Override + public void put(X x, Y y, Z z) { + super.put(x, y, z); + putData(x, y, z); + } + @Override public void remove(X x, Y y, Z z) { super.remove(x, y, z); diff --git a/lophine-server/src/main/java/fun/bm/lophine/utils/concurrent/TableEntry.java b/lophine-server/src/main/java/fun/bm/lophine/utils/concurrent/TableEntry.java index 391ee37..3fd7200 100644 --- a/lophine-server/src/main/java/fun/bm/lophine/utils/concurrent/TableEntry.java +++ b/lophine-server/src/main/java/fun/bm/lophine/utils/concurrent/TableEntry.java @@ -3,7 +3,7 @@ package fun.bm.lophine.utils.concurrent; public class TableEntry { private final X x; private final Y y; - private final Z z; + private Z z; public TableEntry(X x, Y y, Z z) { this.x = x; @@ -22,4 +22,8 @@ public class TableEntry { public Z getZ() { return z; } + + public void setZ(Z z) { + this.z = z; + } }