From d85b6703e1855d1eb61a16f69b3739a2b083e730 Mon Sep 17 00:00:00 2001 From: Raycoms Date: Tue, 24 Feb 2026 20:00:48 +0100 Subject: [PATCH 1/3] synchronize access --- .../handlers/placement/PlacementHandlers.java | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/ldtteam/structurize/placement/handlers/placement/PlacementHandlers.java b/src/main/java/com/ldtteam/structurize/placement/handlers/placement/PlacementHandlers.java index 458b2f4b7..cc71ad2c4 100644 --- a/src/main/java/com/ldtteam/structurize/placement/handlers/placement/PlacementHandlers.java +++ b/src/main/java/com/ldtteam/structurize/placement/handlers/placement/PlacementHandlers.java @@ -30,6 +30,7 @@ import org.jetbrains.annotations.Nullable; import java.util.*; +import java.util.concurrent.locks.Lock; import static com.ldtteam.structurize.api.constants.Constants.UPDATE_FLAG; @@ -43,6 +44,7 @@ public final class PlacementHandlers { public static final List handlers = new ArrayList<>(); + static { handlers.add(new AirPlacementHandler()); @@ -76,15 +78,18 @@ public final class PlacementHandlers */ public static void add(IPlacementHandler handler, Class override) { - for (int i = 0; i < handlers.size(); i++) + synchronized (handlers) { - if (override.isInstance(handlers.get(i))) + for (int i = 0; i < handlers.size(); i++) { - handlers.set(i, handler); - return; + if (override == handlers.get(i).getClass()) + { + handlers.set(i, handler); + return; + } } + add(handler); } - add(handler); } /** @@ -95,8 +100,11 @@ public static void add(IPlacementHandler handler, Class override) */ public static void add(IPlacementHandler handler) { - handlers.add(1, handler); - handlerCache.clear(); + synchronized (handlers) + { + handlers.add(1, handler); + handlerCache.clear(); + } } /** @@ -134,6 +142,7 @@ public static IPlacementHandler getHandler(final Level world, Log.getLogger().error("Unable to find any PlacementHandler for {}; this should be impossible.", newState.toString()); return new GeneralBlockPlacementHandler(); } + /** * Private constructor to hide implicit one. */ From f350838d3b0a6e1ce8b7c91e135075be00157a9c Mon Sep 17 00:00:00 2001 From: Raycoms Date: Tue, 24 Feb 2026 20:07:53 +0100 Subject: [PATCH 2/3] Add a new addtype too --- .../handlers/placement/PlacementHandlers.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/main/java/com/ldtteam/structurize/placement/handlers/placement/PlacementHandlers.java b/src/main/java/com/ldtteam/structurize/placement/handlers/placement/PlacementHandlers.java index cc71ad2c4..b938ba5c7 100644 --- a/src/main/java/com/ldtteam/structurize/placement/handlers/placement/PlacementHandlers.java +++ b/src/main/java/com/ldtteam/structurize/placement/handlers/placement/PlacementHandlers.java @@ -45,6 +45,12 @@ public final class PlacementHandlers { public static final List handlers = new ArrayList<>(); + public enum AddType { + BEFORE, + AFTER, + REPLACE + } + static { handlers.add(new AirPlacementHandler()); @@ -92,6 +98,39 @@ public static void add(IPlacementHandler handler, Class override) } } + /** + * Allows for Adding a Handler before, after or instead of another one. + * @param handler the new handler to add + * @param override the class to match. + * @param addType if before/after/replace. + */ + public static void add(IPlacementHandler handler, Class override, final AddType addType) + { + synchronized (handlers) + { + for (int i = 0; i < handlers.size(); i++) + { + if (override == handlers.get(i).getClass()) + { + switch (addType) + { + case BEFORE: + handlers.add(i - 1, handler); + break; + case AFTER: + handlers.add(i, handler); + break; + case REPLACE: + handlers.set(i, handler); + break; + } + return; + } + } + add(handler); + } + } + /** * Adds a handler to the start of the handlers list, * effectively overriding existing ones with similar From 5d8598a560d7f9007422a5204ab14d2a2111df6c Mon Sep 17 00:00:00 2001 From: Raycoms Date: Wed, 25 Feb 2026 08:45:06 +0100 Subject: [PATCH 3/3] move index to 3, fix order --- .../handlers/placement/PlacementHandlers.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/ldtteam/structurize/placement/handlers/placement/PlacementHandlers.java b/src/main/java/com/ldtteam/structurize/placement/handlers/placement/PlacementHandlers.java index b938ba5c7..2fec37a4c 100644 --- a/src/main/java/com/ldtteam/structurize/placement/handlers/placement/PlacementHandlers.java +++ b/src/main/java/com/ldtteam/structurize/placement/handlers/placement/PlacementHandlers.java @@ -115,10 +115,10 @@ public static void add(IPlacementHandler handler, Class override, final AddTy switch (addType) { case BEFORE: - handlers.add(i - 1, handler); + handlers.add(i, handler); break; case AFTER: - handlers.add(i, handler); + handlers.add(i+1, handler); break; case REPLACE: handlers.set(i, handler); @@ -132,16 +132,15 @@ public static void add(IPlacementHandler handler, Class override, final AddTy } /** - * Adds a handler to the start of the handlers list, - * effectively overriding existing ones with similar - * 'canHandle' functions because this one will evaluate before them + * Adds a handler to the start of the handlers list, right after the air, solid and light placeholder handlers. + * This may effectively override existing ones with similar 'canHandle' functions because this one will evaluate before them. * @param handler */ public static void add(IPlacementHandler handler) { synchronized (handlers) { - handlers.add(1, handler); + handlers.add(3, handler); handlerCache.clear(); } }