Working on #3 - Implemented entity ticking

This commit is contained in:
OLEGSHA 2020-11-30 23:07:15 +03:00
parent 9dbeeb7e8d
commit 4c3f5caae6
4 changed files with 36 additions and 2 deletions

View File

@ -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.ChunkData;
import ru.windcorp.progressia.common.world.Coordinates; import ru.windcorp.progressia.common.world.Coordinates;
import ru.windcorp.progressia.common.world.block.BlockFace; 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.common.world.tile.TileData;
import ru.windcorp.progressia.server.world.block.BlockLogic; import ru.windcorp.progressia.server.world.block.BlockLogic;
import ru.windcorp.progressia.server.world.block.BlockLogicRegistry; import ru.windcorp.progressia.server.world.block.BlockLogicRegistry;
import ru.windcorp.progressia.server.world.block.TickableBlock; 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.tasks.TickChunk;
import ru.windcorp.progressia.server.world.tile.TickableTile; import ru.windcorp.progressia.server.world.tile.TickableTile;
import ru.windcorp.progressia.server.world.tile.TileLogic; import ru.windcorp.progressia.server.world.tile.TileLogic;
@ -119,6 +122,15 @@ public class ChunkLogic {
}); });
} }
public void forEachEntity(BiConsumer<EntityLogic, EntityData> action) {
getData().forEachEntity(data -> {
action.accept(
EntityLogicRegistry.getInstance().get(data.getId()),
data
);
});
}
public BlockLogic getBlock(Vec3i blockInChunk) { public BlockLogic getBlock(Vec3i blockInChunk) {
return BlockLogicRegistry.getInstance().get( return BlockLogicRegistry.getInstance().get(
getData().getBlock(blockInChunk).getId() getData().getBlock(blockInChunk).getId()

View File

@ -32,7 +32,7 @@ implements BlockTickContext {
public void init(Server server, Vec3i blockInWorld) { public void init(Server server, Vec3i blockInWorld) {
setServer(server); setServer(server);
setCoordsInWorld(blockInWorld); if (blockInWorld != null) setCoordsInWorld(blockInWorld);
} }
} }

View File

@ -5,11 +5,14 @@ import java.util.List;
import glm.vec._3.i.Vec3i; import glm.vec._3.i.Vec3i;
import ru.windcorp.progressia.common.util.crash.CrashReports; import ru.windcorp.progressia.common.util.crash.CrashReports;
import ru.windcorp.progressia.common.world.block.BlockFace; 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.Server;
import ru.windcorp.progressia.server.world.block.BlockLogic; import ru.windcorp.progressia.server.world.block.BlockLogic;
import ru.windcorp.progressia.server.world.block.BlockTickContext; import ru.windcorp.progressia.server.world.block.BlockTickContext;
import ru.windcorp.progressia.server.world.block.TickableBlock; import ru.windcorp.progressia.server.world.block.TickableBlock;
import ru.windcorp.progressia.server.world.block.UpdateableBlock; 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.TickableTile;
import ru.windcorp.progressia.server.world.tile.TileLogic; import ru.windcorp.progressia.server.world.tile.TileLogic;
import ru.windcorp.progressia.server.world.tile.TileTickContext; 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( public static BlockTickContext getBlockTickContext(
Server server, Server server,
Vec3i blockInWorld Vec3i blockInWorld
@ -131,6 +146,10 @@ public class TickAndUpdateUtil {
return result; return result;
} }
public static TickContext getTickContext(Server server) {
return getBlockTickContext(server, null);
}
private TickAndUpdateUtil() {} private TickAndUpdateUtil() {}
} }

View File

@ -6,6 +6,7 @@ import ru.windcorp.progressia.server.Server;
import ru.windcorp.progressia.server.world.ChunkLogic; import ru.windcorp.progressia.server.world.ChunkLogic;
import ru.windcorp.progressia.server.world.MutableBlockTickContext; import ru.windcorp.progressia.server.world.MutableBlockTickContext;
import ru.windcorp.progressia.server.world.MutableTileTickContext; 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.block.TickableBlock;
import ru.windcorp.progressia.server.world.ticking.Evaluation; import ru.windcorp.progressia.server.world.ticking.Evaluation;
import ru.windcorp.progressia.server.world.tile.TickableTile; import ru.windcorp.progressia.server.world.tile.TickableTile;
@ -65,7 +66,9 @@ public class TickChunk extends Evaluation {
} }
private void tickEntities(Server server) { private void tickEntities(Server server) {
// TODO Implement chunk.getData().forEachEntity(entity -> {
TickAndUpdateUtil.tickEntity(entity, server);
});
} }
@Override @Override