From 0e15e83cecfa51c2f9a095450873fb3c3b14646a Mon Sep 17 00:00:00 2001 From: MineFact Date: Tue, 12 Mar 2024 15:00:15 +0100 Subject: [PATCH 1/7] set environment on Expression clone --- .../com/sk89q/worldedit/internal/expression/Expression.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/expression/Expression.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/expression/Expression.java index b7ce1acf33..5a330cfd6a 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/expression/Expression.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/expression/Expression.java @@ -199,7 +199,9 @@ public void setEnvironment(ExpressionEnvironment environment) { //FAWE start public Expression clone() { - return new Expression(initialExpression, new HashSet<>(providedSlots)); + Expression expression = new Expression(initialExpression, new HashSet<>(providedSlots)); + expression.setEnvironment(getEnvironment()); + return expression; } //FAWE end From c217f68c0aca695ed4348e483ca74fd66d4a341a Mon Sep 17 00:00:00 2001 From: MineFact Date: Tue, 12 Mar 2024 22:45:17 +0100 Subject: [PATCH 2/7] clone environment as well --- .../com/sk89q/worldedit/internal/expression/Expression.java | 3 ++- .../worldedit/internal/expression/ExpressionEnvironment.java | 1 + .../regions/shape/WorldEditExpressionEnvironment.java | 5 ++++- .../worldedit/internal/expression/BaseExpressionTest.java | 5 +++++ 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/expression/Expression.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/expression/Expression.java index 5a330cfd6a..23ba96a88c 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/expression/Expression.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/expression/Expression.java @@ -24,6 +24,7 @@ import com.sk89q.worldedit.antlr.ExpressionLexer; import com.sk89q.worldedit.antlr.ExpressionParser; import com.sk89q.worldedit.internal.expression.invoke.ExpressionCompiler; +import com.sk89q.worldedit.regions.shape.WorldEditExpressionEnvironment; import org.antlr.v4.runtime.CharStream; import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CommonTokenStream; @@ -200,7 +201,7 @@ public void setEnvironment(ExpressionEnvironment environment) { //FAWE start public Expression clone() { Expression expression = new Expression(initialExpression, new HashSet<>(providedSlots)); - expression.setEnvironment(getEnvironment()); + expression.setEnvironment(getEnvironment().clone()); return expression; } //FAWE end diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/expression/ExpressionEnvironment.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/expression/ExpressionEnvironment.java index 061a520a9a..58ec3bc4c7 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/expression/ExpressionEnvironment.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/expression/ExpressionEnvironment.java @@ -36,4 +36,5 @@ public interface ExpressionEnvironment { int getBlockDataRel(double x, double y, double z); + ExpressionEnvironment clone(); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/shape/WorldEditExpressionEnvironment.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/shape/WorldEditExpressionEnvironment.java index 15e93c7dbd..1efe98fb9f 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/shape/WorldEditExpressionEnvironment.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/shape/WorldEditExpressionEnvironment.java @@ -94,10 +94,13 @@ public void setCurrentBlock(int x, int y, int z) { public Vector3 toWorldRel(double x, double y, double z) { return current.add(x, y, z); } + + public WorldEditExpressionEnvironment clone() { + return new WorldEditExpressionEnvironment(extent, unit, zero2); + } //FAWe end public void setCurrentBlock(Vector3 current) { this.current = current; } - } diff --git a/worldedit-core/src/test/java/com/sk89q/worldedit/internal/expression/BaseExpressionTest.java b/worldedit-core/src/test/java/com/sk89q/worldedit/internal/expression/BaseExpressionTest.java index 3491347a4b..3c8ba65d69 100644 --- a/worldedit-core/src/test/java/com/sk89q/worldedit/internal/expression/BaseExpressionTest.java +++ b/worldedit-core/src/test/java/com/sk89q/worldedit/internal/expression/BaseExpressionTest.java @@ -114,6 +114,11 @@ public int getBlockTypeRel(double x, double y, double z) { public int getBlockDataRel(double x, double y, double z) { return (int) y * 100; } + + @Override + public ExpressionEnvironment clone() { + return this; + } }); return expression.evaluate(); From 7b7357e6e4ab48b96a023ebebb52d04246a41f6d Mon Sep 17 00:00:00 2001 From: MineFact Date: Wed, 13 Mar 2024 08:15:57 +0100 Subject: [PATCH 3/7] subtract the unoffset before cloning --- .../regions/shape/WorldEditExpressionEnvironment.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/shape/WorldEditExpressionEnvironment.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/shape/WorldEditExpressionEnvironment.java index 1efe98fb9f..247f86c352 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/shape/WorldEditExpressionEnvironment.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/shape/WorldEditExpressionEnvironment.java @@ -28,6 +28,8 @@ public class WorldEditExpressionEnvironment implements ExpressionEnvironment { + private final Vector3 UN_OFFSET = Vector3.at(0.5, 0.5, 0.5); + private final Vector3 unit; private final Vector3 zero2; //FAWE start - MutableVector3 @@ -42,7 +44,7 @@ public WorldEditExpressionEnvironment(EditSession editSession, Vector3 unit, Vec public WorldEditExpressionEnvironment(Extent extent, Vector3 unit, Vector3 zero) { this.extent = extent; this.unit = unit; - this.zero2 = zero.add(0.5, 0.5, 0.5); + this.zero2 = zero.add(UN_OFFSET); } public BlockVector3 toWorld(double x, double y, double z) { @@ -96,7 +98,7 @@ public Vector3 toWorldRel(double x, double y, double z) { } public WorldEditExpressionEnvironment clone() { - return new WorldEditExpressionEnvironment(extent, unit, zero2); + return new WorldEditExpressionEnvironment(extent, unit, zero2.subtract(UN_OFFSET)); } //FAWe end From fdc8cff62550dd288cb3d9aa782bf8de9c810960 Mon Sep 17 00:00:00 2001 From: MineFact Date: Thu, 14 Mar 2024 19:26:24 +0100 Subject: [PATCH 4/7] added FAWE comments --- .../worldedit/internal/expression/ExpressionEnvironment.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/expression/ExpressionEnvironment.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/expression/ExpressionEnvironment.java index 58ec3bc4c7..1587c177cc 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/expression/ExpressionEnvironment.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/expression/ExpressionEnvironment.java @@ -36,5 +36,7 @@ public interface ExpressionEnvironment { int getBlockDataRel(double x, double y, double z); + // FAWE start ExpressionEnvironment clone(); + // FAWE end } From b99d22bb6252d47d37d4df42cf12826037302a06 Mon Sep 17 00:00:00 2001 From: MineFact Date: Thu, 14 Mar 2024 19:26:49 +0100 Subject: [PATCH 5/7] renamed UN_OFFSET to BLOCK_CENTER_OFFSET --- .../regions/shape/WorldEditExpressionEnvironment.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/shape/WorldEditExpressionEnvironment.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/shape/WorldEditExpressionEnvironment.java index 247f86c352..e2372db2c5 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/shape/WorldEditExpressionEnvironment.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/shape/WorldEditExpressionEnvironment.java @@ -28,7 +28,7 @@ public class WorldEditExpressionEnvironment implements ExpressionEnvironment { - private final Vector3 UN_OFFSET = Vector3.at(0.5, 0.5, 0.5); + private final Vector3 BLOCK_CENTER_OFFSET = Vector3.at(0.5, 0.5, 0.5); private final Vector3 unit; private final Vector3 zero2; @@ -44,7 +44,7 @@ public WorldEditExpressionEnvironment(EditSession editSession, Vector3 unit, Vec public WorldEditExpressionEnvironment(Extent extent, Vector3 unit, Vector3 zero) { this.extent = extent; this.unit = unit; - this.zero2 = zero.add(UN_OFFSET); + this.zero2 = zero.add(BLOCK_CENTER_OFFSET); } public BlockVector3 toWorld(double x, double y, double z) { @@ -98,7 +98,7 @@ public Vector3 toWorldRel(double x, double y, double z) { } public WorldEditExpressionEnvironment clone() { - return new WorldEditExpressionEnvironment(extent, unit, zero2.subtract(UN_OFFSET)); + return new WorldEditExpressionEnvironment(extent, unit, zero2.subtract(BLOCK_CENTER_OFFSET)); } //FAWe end From 1f9f666f2b1c0271ac887a7fde1108f7206a4ddf Mon Sep 17 00:00:00 2001 From: MineFact Date: Thu, 14 Mar 2024 20:08:27 +0100 Subject: [PATCH 6/7] make BLOCK_CENTER_OFFSET static --- .../worldedit/regions/shape/WorldEditExpressionEnvironment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/shape/WorldEditExpressionEnvironment.java b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/shape/WorldEditExpressionEnvironment.java index e2372db2c5..4b87ebcc6d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/regions/shape/WorldEditExpressionEnvironment.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/regions/shape/WorldEditExpressionEnvironment.java @@ -28,7 +28,7 @@ public class WorldEditExpressionEnvironment implements ExpressionEnvironment { - private final Vector3 BLOCK_CENTER_OFFSET = Vector3.at(0.5, 0.5, 0.5); + private static final Vector3 BLOCK_CENTER_OFFSET = Vector3.at(0.5, 0.5, 0.5); private final Vector3 unit; private final Vector3 zero2; From e71f00e0aa2eceebbefa95f8c580177fe82a9fe2 Mon Sep 17 00:00:00 2001 From: MineFact Date: Thu, 14 Mar 2024 20:11:53 +0100 Subject: [PATCH 7/7] make ExpressionEnvironment extend Cloneable --- .../worldedit/internal/expression/ExpressionEnvironment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/expression/ExpressionEnvironment.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/expression/ExpressionEnvironment.java index 1587c177cc..5e44d9da1b 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/expression/ExpressionEnvironment.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/expression/ExpressionEnvironment.java @@ -22,7 +22,7 @@ /** * Represents a way to access blocks in a world. Has to accept non-rounded coordinates. */ -public interface ExpressionEnvironment { +public interface ExpressionEnvironment extends Cloneable { int getBlockType(double x, double y, double z);