diff --git a/src/main/java/ru/windcorp/progressia/common/world/context/BlockDataContext.java b/src/main/java/ru/windcorp/progressia/common/world/context/BlockDataContext.java index 9667eac..36e7dbe 100644 --- a/src/main/java/ru/windcorp/progressia/common/world/context/BlockDataContext.java +++ b/src/main/java/ru/windcorp/progressia/common/world/context/BlockDataContext.java @@ -46,7 +46,7 @@ public interface BlockDataContext @Override default BlockDataContext pushRelative(AbsRelation direction) { - return push(direction.getVector()); + return push(getLocation().add_(direction.getVector())); } @Override diff --git a/src/main/java/ru/windcorp/progressia/common/world/context/BlockDataContextRO.java b/src/main/java/ru/windcorp/progressia/common/world/context/BlockDataContextRO.java index 7d35ec3..8d75845 100644 --- a/src/main/java/ru/windcorp/progressia/common/world/context/BlockDataContextRO.java +++ b/src/main/java/ru/windcorp/progressia/common/world/context/BlockDataContextRO.java @@ -45,7 +45,7 @@ public interface BlockDataContextRO @Override default BlockDataContextRO pushRelative(AbsRelation direction) { - return push(direction.getVector()); + return push(getLocation().add_(direction.getVector())); } @Override diff --git a/src/main/java/ru/windcorp/progressia/common/world/generic/context/AbstractContextRO.java b/src/main/java/ru/windcorp/progressia/common/world/generic/context/AbstractContextRO.java index 29e3127..0657a3e 100644 --- a/src/main/java/ru/windcorp/progressia/common/world/generic/context/AbstractContextRO.java +++ b/src/main/java/ru/windcorp/progressia/common/world/generic/context/AbstractContextRO.java @@ -58,7 +58,8 @@ public abstract class AbstractContextRO< throw new IllegalStateException("Cannot pop(): already top frame"); } - frame = frameStack.pop(); + frameStack.pop(); + frame = frameStack.peek(); } @Override diff --git a/src/main/java/ru/windcorp/progressia/common/world/generic/context/BlockGenericContextRO.java b/src/main/java/ru/windcorp/progressia/common/world/generic/context/BlockGenericContextRO.java index 842fd0a..cacbe45 100644 --- a/src/main/java/ru/windcorp/progressia/common/world/generic/context/BlockGenericContextRO.java +++ b/src/main/java/ru/windcorp/progressia/common/world/generic/context/BlockGenericContextRO.java @@ -149,7 +149,7 @@ public interface BlockGenericContextRO< @Override default BlockGenericContextRO pushRelative(AbsRelation direction) { - return push(direction.getVector()); + return push(getLocation().add_(direction.getVector())); } @Override diff --git a/src/main/java/ru/windcorp/progressia/common/world/generic/context/BlockGenericContextWO.java b/src/main/java/ru/windcorp/progressia/common/world/generic/context/BlockGenericContextWO.java index 97ec62d..c1fa216 100644 --- a/src/main/java/ru/windcorp/progressia/common/world/generic/context/BlockGenericContextWO.java +++ b/src/main/java/ru/windcorp/progressia/common/world/generic/context/BlockGenericContextWO.java @@ -92,7 +92,7 @@ public interface BlockGenericContextWO< @Override default BlockGenericContextWO pushRelative(AbsRelation direction) { - return push(direction.getVector()); + return push(getLocation().add_(direction.getVector())); } @Override diff --git a/src/main/java/ru/windcorp/progressia/common/world/generic/context/WorldContexts.java b/src/main/java/ru/windcorp/progressia/common/world/generic/context/WorldContexts.java index bfc85bb..30b85ce 100644 --- a/src/main/java/ru/windcorp/progressia/common/world/generic/context/WorldContexts.java +++ b/src/main/java/ru/windcorp/progressia/common/world/generic/context/WorldContexts.java @@ -146,7 +146,7 @@ class WorldContexts { * @see #pop() */ default Block pushRelative(AbsRelation direction) { - return push(direction.getVector()); + return push(getLocation().add_(direction.getVector())); } /** diff --git a/src/main/java/ru/windcorp/progressia/server/world/context/ServerBlockContext.java b/src/main/java/ru/windcorp/progressia/server/world/context/ServerBlockContext.java index c8bdf0b..6b66ba0 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/context/ServerBlockContext.java +++ b/src/main/java/ru/windcorp/progressia/server/world/context/ServerBlockContext.java @@ -41,7 +41,7 @@ public interface ServerBlockContext extends BlockDataContext, ServerWorldContext @Override default ServerBlockContext.Logic pushRelative(AbsRelation direction) { - return push(direction.getVector()); + return push(getLocation().add_(direction.getVector())); } @Override @@ -71,7 +71,7 @@ public interface ServerBlockContext extends BlockDataContext, ServerWorldContext @Override default ServerBlockContext pushRelative(AbsRelation direction) { - return push(direction.getVector()); + return push(getLocation().add_(direction.getVector())); } @Override diff --git a/src/main/java/ru/windcorp/progressia/server/world/context/ServerBlockContextRO.java b/src/main/java/ru/windcorp/progressia/server/world/context/ServerBlockContextRO.java index eefa195..8ef355e 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/context/ServerBlockContextRO.java +++ b/src/main/java/ru/windcorp/progressia/server/world/context/ServerBlockContextRO.java @@ -46,7 +46,7 @@ public interface ServerBlockContextRO extends ServerWorldContextRO, BlockDataCon @Override default ServerBlockContextRO.Logic pushRelative(AbsRelation direction) { - return push(direction.getVector()); + return push(getLocation().add_(direction.getVector())); } @Override @@ -76,7 +76,7 @@ public interface ServerBlockContextRO extends ServerWorldContextRO, BlockDataCon @Override default ServerBlockContextRO pushRelative(AbsRelation direction) { - return push(direction.getVector()); + return push(getLocation().add_(direction.getVector())); } @Override diff --git a/src/main/java/ru/windcorp/progressia/server/world/context/impl/DefaultServerContextBuilders.java b/src/main/java/ru/windcorp/progressia/server/world/context/impl/DefaultServerContextBuilders.java index 8069db8..cb182ce 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/context/impl/DefaultServerContextBuilders.java +++ b/src/main/java/ru/windcorp/progressia/server/world/context/impl/DefaultServerContextBuilders.java @@ -29,7 +29,7 @@ public interface DefaultServerContextBuilders { DefaultServerContext build(); - public interface Empty /* does not extend RSCB */ { + public interface Empty /* does not extend DSCB */ { WithWorld in(Server server, WorldData world); diff --git a/src/main/java/ru/windcorp/progressia/server/world/context/impl/DefaultServerContextImpl.java b/src/main/java/ru/windcorp/progressia/server/world/context/impl/DefaultServerContextImpl.java index 77e5551..ec89e47 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/context/impl/DefaultServerContextImpl.java +++ b/src/main/java/ru/windcorp/progressia/server/world/context/impl/DefaultServerContextImpl.java @@ -150,7 +150,7 @@ class DefaultServerContextImpl extends DefaultServerContext switch (getRole()) { case TILE: result = String.format( - "ServerTileContext[x=%d, y=%d, z=%d, %s, index=%d]", + "ServerTileContext [x=%+4d, y=%+4d, z=%+4d, %s, index=%d]", frame.location.x, frame.location.y, frame.location.z, @@ -160,16 +160,16 @@ class DefaultServerContextImpl extends DefaultServerContext break; case TILE_STACK: result = String - .format("ServerBlockFaceContext[x=%d, y=%d, z=%d, %s]", frame.location.x, frame.location.y, frame.location.z, frame.face); + .format("ServerBlockFaceContext [x=%+4d, y=%+4d, z=%+4d, %s]", frame.location.x, frame.location.y, frame.location.z, frame.face); break; case LOCATION: - result = String.format("ServerBlockContext[x=%d, y=%d, z=%d]", frame.location.x, frame.location.y, frame.location.z); + result = String.format("ServerBlockContext [x=%+4d, y=%+4d, z=%+4d]", frame.location.x, frame.location.y, frame.location.z); break; case WORLD: - result = String.format("ServerWorldContext"); + result = "ServerWorldContext"; break; default: - result = "Uninitialized ReusableServerContext"; + result = "Uninitialized DefaultServerContext"; break; } @@ -188,7 +188,6 @@ class DefaultServerContextImpl extends DefaultServerContext public Empty reuse() { server = null; -// worldLogic = null; world = null; while (isSubcontexting()) { diff --git a/src/main/java/ru/windcorp/progressia/server/world/context/impl/FilterServerContext.java b/src/main/java/ru/windcorp/progressia/server/world/context/impl/FilterServerContext.java index 40927c3..b7b5ff5 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/context/impl/FilterServerContext.java +++ b/src/main/java/ru/windcorp/progressia/server/world/context/impl/FilterServerContext.java @@ -51,6 +51,11 @@ public abstract class FilterServerContext implements ServerTileContext { public ServerTileContext getParent() { return parent; } + + @Override + public String toString() { + return getClass().getSimpleName() + " [" + parent + "]"; + } @Override public int getLayer() { diff --git a/src/main/java/ru/windcorp/progressia/server/world/tasks/TickChunk.java b/src/main/java/ru/windcorp/progressia/server/world/tasks/TickChunk.java index d7fabc1..4ed21f1 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/tasks/TickChunk.java +++ b/src/main/java/ru/windcorp/progressia/server/world/tasks/TickChunk.java @@ -178,12 +178,16 @@ public class TickChunk extends Evaluation { ServerTileContext tileContext = context.push(i); TileLogic logic = tileContext.logic().getTile(); - if (!(logic instanceof TickableTile)) - return; + if (!(logic instanceof TickableTile)) { + tileContext.pop(); + continue; + } TickableTile tickable = (TickableTile) logic; - if (tickable.getTickingPolicy(tileContext) != TickingPolicy.RANDOM) - return; + if (tickable.getTickingPolicy(tileContext) != TickingPolicy.RANDOM) { + tileContext.pop(); + continue; + } tickable.tick(tileContext); tileContext.pop(); diff --git a/src/main/java/ru/windcorp/progressia/server/world/tile/HangingTileLogic.java b/src/main/java/ru/windcorp/progressia/server/world/tile/HangingTileLogic.java index f916a24..87a5c07 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/tile/HangingTileLogic.java +++ b/src/main/java/ru/windcorp/progressia/server/world/tile/HangingTileLogic.java @@ -49,9 +49,7 @@ public class HangingTileLogic extends TileLogic implements UpdateableTile { context.pushOpposite(); BlockLogic complHost = context.logic().getBlock(); - boolean result = complHost == null || !complHost.isSolid(context, context.getFace()); - context.pop(); - return result; + return context.popAndReturn(complHost == null || !complHost.isSolid(context, context.getFace())); } public boolean canBeSquashed(ServerTileContextRO context) { diff --git a/src/main/java/ru/windcorp/progressia/test/TestTileLogicGrass.java b/src/main/java/ru/windcorp/progressia/test/TestTileLogicGrass.java index b41f5a7..bfe438f 100644 --- a/src/main/java/ru/windcorp/progressia/test/TestTileLogicGrass.java +++ b/src/main/java/ru/windcorp/progressia/test/TestTileLogicGrass.java @@ -50,7 +50,7 @@ public class TestTileLogicGrass extends HangingTileLogic implements TickableTile @Override public void tick(ServerTileContext context) { if (!isLocationSuitable(context)) { -// context.removeThisTile(); + context.removeTile(); } }