From 4c3f5caae62afc493e3186af73b23ce51c9cf30b Mon Sep 17 00:00:00 2001 From: OLEGSHA Date: Mon, 30 Nov 2020 23:07:15 +0300 Subject: [PATCH] Working on #3 - Implemented entity ticking --- .../progressia/server/world/ChunkLogic.java | 12 ++++++++++++ .../server/world/MutableBlockTickContext.java | 2 +- .../server/world/TickAndUpdateUtil.java | 19 +++++++++++++++++++ .../server/world/tasks/TickChunk.java | 5 ++++- 4 files changed, 36 insertions(+), 2 deletions(-) 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 938d960..d4f54d5 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/ChunkLogic.java +++ b/src/main/java/ru/windcorp/progressia/server/world/ChunkLogic.java @@ -15,10 +15,13 @@ import ru.windcorp.progressia.client.world.tile.TileLocation; import ru.windcorp.progressia.common.world.ChunkData; import ru.windcorp.progressia.common.world.Coordinates; import ru.windcorp.progressia.common.world.block.BlockFace; +import ru.windcorp.progressia.common.world.entity.EntityData; 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.entity.EntityLogic; +import ru.windcorp.progressia.server.world.entity.EntityLogicRegistry; import ru.windcorp.progressia.server.world.tasks.TickChunk; import ru.windcorp.progressia.server.world.tile.TickableTile; import ru.windcorp.progressia.server.world.tile.TileLogic; @@ -119,6 +122,15 @@ public class ChunkLogic { }); } + public void forEachEntity(BiConsumer action) { + getData().forEachEntity(data -> { + action.accept( + EntityLogicRegistry.getInstance().get(data.getId()), + data + ); + }); + } + public BlockLogic getBlock(Vec3i blockInChunk) { return BlockLogicRegistry.getInstance().get( getData().getBlock(blockInChunk).getId() diff --git a/src/main/java/ru/windcorp/progressia/server/world/MutableBlockTickContext.java b/src/main/java/ru/windcorp/progressia/server/world/MutableBlockTickContext.java index 5a9de50..893d1e8 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/MutableBlockTickContext.java +++ b/src/main/java/ru/windcorp/progressia/server/world/MutableBlockTickContext.java @@ -32,7 +32,7 @@ implements BlockTickContext { public void init(Server server, Vec3i blockInWorld) { setServer(server); - setCoordsInWorld(blockInWorld); + if (blockInWorld != null) setCoordsInWorld(blockInWorld); } } diff --git a/src/main/java/ru/windcorp/progressia/server/world/TickAndUpdateUtil.java b/src/main/java/ru/windcorp/progressia/server/world/TickAndUpdateUtil.java index 47aaffb..534cf97 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/TickAndUpdateUtil.java +++ b/src/main/java/ru/windcorp/progressia/server/world/TickAndUpdateUtil.java @@ -5,11 +5,14 @@ import java.util.List; import glm.vec._3.i.Vec3i; import ru.windcorp.progressia.common.util.crash.CrashReports; import ru.windcorp.progressia.common.world.block.BlockFace; +import ru.windcorp.progressia.common.world.entity.EntityData; import ru.windcorp.progressia.server.Server; import ru.windcorp.progressia.server.world.block.BlockLogic; import ru.windcorp.progressia.server.world.block.BlockTickContext; import ru.windcorp.progressia.server.world.block.TickableBlock; import ru.windcorp.progressia.server.world.block.UpdateableBlock; +import ru.windcorp.progressia.server.world.entity.EntityLogic; +import ru.windcorp.progressia.server.world.entity.EntityLogicRegistry; import ru.windcorp.progressia.server.world.tile.TickableTile; import ru.windcorp.progressia.server.world.tile.TileLogic; import ru.windcorp.progressia.server.world.tile.TileTickContext; @@ -111,6 +114,18 @@ public class TickAndUpdateUtil { } } + public static void tickEntity(EntityLogic logic, EntityData data, TickContext context) { + try { + logic.tick(data, context); + } catch (Exception e) { + CrashReports.report(e, "Could not tick entity {}", logic); + } + } + + public static void tickEntity(EntityData data, Server server) { + tickEntity(EntityLogicRegistry.getInstance().get(data.getId()), data, getTickContext(server)); + } + public static BlockTickContext getBlockTickContext( Server server, Vec3i blockInWorld @@ -131,6 +146,10 @@ public class TickAndUpdateUtil { return result; } + public static TickContext getTickContext(Server server) { + return getBlockTickContext(server, null); + } + private TickAndUpdateUtil() {} } 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 56cb035..e7b1f60 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 @@ -6,6 +6,7 @@ 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.TickAndUpdateUtil; import ru.windcorp.progressia.server.world.block.TickableBlock; import ru.windcorp.progressia.server.world.ticking.Evaluation; import ru.windcorp.progressia.server.world.tile.TickableTile; @@ -65,7 +66,9 @@ public class TickChunk extends Evaluation { } private void tickEntities(Server server) { - // TODO Implement + chunk.getData().forEachEntity(entity -> { + TickAndUpdateUtil.tickEntity(entity, server); + }); } @Override