From 9dbeeb7e8d4519ad09bee557dbf8808a2c5a2e34 Mon Sep 17 00:00:00 2001 From: OLEGSHA Date: Sat, 28 Nov 2020 00:29:40 +0300 Subject: [PATCH] Working on #3 - implemented chunk ticking in general and regular ticks --- .../ru/windcorp/progressia/server/Server.java | 2 +- .../progressia/server/world/ChunkLogic.java | 11 +++ .../server/world/tasks/TickChunk.java | 77 +++++++++++++++++++ 3 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 src/main/java/ru/windcorp/progressia/server/world/tasks/TickChunk.java diff --git a/src/main/java/ru/windcorp/progressia/server/Server.java b/src/main/java/ru/windcorp/progressia/server/Server.java index 066cb26..67d1239 100644 --- a/src/main/java/ru/windcorp/progressia/server/Server.java +++ b/src/main/java/ru/windcorp/progressia/server/Server.java @@ -132,7 +132,7 @@ public class Server { } private void scheduleChunkTicks(Server server) { - + server.getWorld().getChunks().forEach(chunk -> requestEvaluation(chunk.getTickTask())); } } diff --git a/src/main/java/ru/windcorp/progressia/server/world/ChunkLogic.java b/src/main/java/ru/windcorp/progressia/server/world/ChunkLogic.java index 33a7d85..938d960 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/ChunkLogic.java +++ b/src/main/java/ru/windcorp/progressia/server/world/ChunkLogic.java @@ -19,6 +19,7 @@ import ru.windcorp.progressia.common.world.tile.TileData; import ru.windcorp.progressia.server.world.block.BlockLogic; import ru.windcorp.progressia.server.world.block.BlockLogicRegistry; import ru.windcorp.progressia.server.world.block.TickableBlock; +import ru.windcorp.progressia.server.world.tasks.TickChunk; import ru.windcorp.progressia.server.world.tile.TickableTile; import ru.windcorp.progressia.server.world.tile.TileLogic; import ru.windcorp.progressia.server.world.tile.TileLogicRegistry; @@ -31,6 +32,8 @@ public class ChunkLogic { private final Collection tickingBlocks = new ArrayList<>(); private final Collection tickingTiles = new ArrayList<>(); + private final TickChunk tickTask = new TickChunk(this); + private final Map, List> tileLogicLists = Collections.synchronizedMap(new WeakHashMap<>()); @@ -89,6 +92,10 @@ public class ChunkLogic { return data; } + public Vec3i getPosition() { + return getData().getPosition(); + } + public boolean hasTickingBlocks() { return !tickingBlocks.isEmpty(); } @@ -141,5 +148,9 @@ public class ChunkLogic { data -> TileLogicRegistry.getInstance().get(data.getId()) ); } + + public TickChunk getTickTask() { + return tickTask; + } } 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 new file mode 100644 index 0000000..56cb035 --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/server/world/tasks/TickChunk.java @@ -0,0 +1,77 @@ +package ru.windcorp.progressia.server.world.tasks; + +import glm.vec._3.i.Vec3i; +import ru.windcorp.progressia.common.world.Coordinates; +import ru.windcorp.progressia.server.Server; +import ru.windcorp.progressia.server.world.ChunkLogic; +import ru.windcorp.progressia.server.world.MutableBlockTickContext; +import ru.windcorp.progressia.server.world.MutableTileTickContext; +import ru.windcorp.progressia.server.world.block.TickableBlock; +import ru.windcorp.progressia.server.world.ticking.Evaluation; +import ru.windcorp.progressia.server.world.tile.TickableTile; + +public class TickChunk extends Evaluation { + + private final ChunkLogic chunk; + + public TickChunk(ChunkLogic chunk) { + this.chunk = chunk; + } + + @Override + public void evaluate(Server server) { + tickRegulars(server); + tickRandom(server); + tickEntities(server); + } + + private void tickRegulars(Server server) { + tickRegularBlocks(server); + tickRegularTiles(server); + } + + private void tickRegularBlocks(Server server) { + if (!chunk.hasTickingBlocks()) return; + + MutableBlockTickContext context = new MutableBlockTickContext(); + Vec3i blockInWorld = new Vec3i(); + + chunk.forEachTickingBlock((blockInChunk, block) -> { + + Coordinates.getInWorld(chunk.getPosition(), blockInChunk, blockInWorld); + context.init(server, blockInWorld); + ((TickableBlock) block).tick(context); + + }); + } + + private void tickRegularTiles(Server server) { + if (!chunk.hasTickingTiles()) return; + + MutableTileTickContext context = new MutableTileTickContext(); + Vec3i blockInWorld = new Vec3i(); + + chunk.forEachTickingTile((loc, tile) -> { + + Coordinates.getInWorld(chunk.getPosition(), loc.pos, blockInWorld); + context.init(server, blockInWorld, loc.face, loc.layer); + ((TickableTile) tile).tick(context); + + }); + } + + private void tickRandom(Server server) { + // TODO Implement + } + + private void tickEntities(Server server) { + // TODO Implement + } + + @Override + public void getRelevantChunk(Vec3i output) { + Vec3i p = chunk.getData().getPosition(); + output.set(p.x, p.y, p.z); + } + +}