From 82872c7cf3e1f1a5730b083b26df8987700468fa Mon Sep 17 00:00:00 2001 From: OLEGSHA Date: Sun, 15 Aug 2021 23:54:25 +0300 Subject: [PATCH] Fixed RotatingServerContext - RotatingServerContext now rotates coordinates, too - Fixed a bug caused by the implementation of push methods by TransformingServerContext - Fixed unbounded recursion in WorldGenericRO.hasTile(Vec3i, BlockFace, int) --- .../common/world/generic/WorldGenericRO.java | 3 +- .../context/impl/RotatingServerContext.java | 9 ++++-- .../impl/TransformingServerContext.java | 30 +++++++++++++------ 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/src/main/java/ru/windcorp/progressia/common/world/generic/WorldGenericRO.java b/src/main/java/ru/windcorp/progressia/common/world/generic/WorldGenericRO.java index eac2a0c..826396f 100644 --- a/src/main/java/ru/windcorp/progressia/common/world/generic/WorldGenericRO.java +++ b/src/main/java/ru/windcorp/progressia/common/world/generic/WorldGenericRO.java @@ -137,7 +137,8 @@ public interface WorldGenericRO< * @return {@code true} iff the tile exists */ default boolean hasTile(Vec3i location, BlockFace face, int layer) { - return hasTile(location, face, layer); + TS stack = getTilesOrNull(location, face); + return stack != null && stack.size() > layer; } default boolean isChunkLoaded(Vec3i chunkPos) { diff --git a/src/main/java/ru/windcorp/progressia/server/world/context/impl/RotatingServerContext.java b/src/main/java/ru/windcorp/progressia/server/world/context/impl/RotatingServerContext.java index 2ccc86c..c6459c4 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/context/impl/RotatingServerContext.java +++ b/src/main/java/ru/windcorp/progressia/server/world/context/impl/RotatingServerContext.java @@ -19,6 +19,7 @@ package ru.windcorp.progressia.server.world.context.impl; import glm.vec._3.i.Vec3i; import ru.windcorp.progressia.common.world.rels.AbsFace; +import ru.windcorp.progressia.common.world.rels.AxisRotations; import ru.windcorp.progressia.common.world.rels.RelFace; import ru.windcorp.progressia.server.world.context.ServerTileContext; @@ -30,15 +31,19 @@ public class RotatingServerContext extends TransformingServerContext { super(parent); this.up = up; } + + public AbsFace getUp() { + return up; + } @Override protected void transform(Vec3i userLocation, Vec3i output) { - output.set(userLocation.x, userLocation.y, userLocation.z); + AxisRotations.resolve(userLocation, up, output); } @Override protected void untransform(Vec3i parentLocation, Vec3i output) { - output.set(parentLocation.x, parentLocation.y, parentLocation.z); + AxisRotations.relativize(parentLocation, up, output); } @Override diff --git a/src/main/java/ru/windcorp/progressia/server/world/context/impl/TransformingServerContext.java b/src/main/java/ru/windcorp/progressia/server/world/context/impl/TransformingServerContext.java index 7305876..1fb387e 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/context/impl/TransformingServerContext.java +++ b/src/main/java/ru/windcorp/progressia/server/world/context/impl/TransformingServerContext.java @@ -35,7 +35,7 @@ public abstract class TransformingServerContext extends FilterServerContext { private final Vec3i location = new Vec3i(); private boolean isLocationValid = false; - private RelFace face; + private RelFace face = null; private final List vectorCache = new ArrayList<>(1); @@ -107,28 +107,40 @@ public abstract class TransformingServerContext extends FilterServerContext { @Override public ServerBlockContext push(Vec3i userLocation) { - transform(userLocation, location); + Vec3i parentLocation = grabVector(userLocation); + super.push(parentLocation); + releaseVector(parentLocation); + + location.set(userLocation.x, userLocation.y, userLocation.z); isLocationValid = true; - super.push(location); face = null; + return this; } @Override public ServerTileStackContext push(Vec3i userLocation, RelFace userFace) { - transform(userLocation, location); + Vec3i parentLocation = grabVector(userLocation); + super.push(parentLocation, transform(userFace)); + releaseVector(parentLocation); + + location.set(userLocation.x, userLocation.y, userLocation.z); isLocationValid = true; - face = transform(userFace); - super.push(location, face); + face = userFace; + return this; } @Override public ServerTileContext push(Vec3i userLocation, RelFace userFace, int layer) { - transform(userLocation, location); + Vec3i parentLocation = grabVector(userLocation); + super.push(parentLocation, transform(userFace), layer); + releaseVector(parentLocation); + + location.set(userLocation.x, userLocation.y, userLocation.z); isLocationValid = true; - face = transform(userFace); - super.push(location, face, layer); + face = userFace; + return this; }