Working on #3 - implemented chunk ticking in general and regular ticks

This commit is contained in:
OLEGSHA 2020-11-28 00:29:40 +03:00
parent 2d322e83bc
commit 9dbeeb7e8d
3 changed files with 89 additions and 1 deletions

View File

@ -132,7 +132,7 @@ public class Server {
}
private void scheduleChunkTicks(Server server) {
server.getWorld().getChunks().forEach(chunk -> requestEvaluation(chunk.getTickTask()));
}
}

View File

@ -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<Vec3i> tickingBlocks = new ArrayList<>();
private final Collection<TileLocation> tickingTiles = new ArrayList<>();
private final TickChunk tickTask = new TickChunk(this);
private final Map<List<TileData>, List<TileLogic>> 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();
}
@ -142,4 +149,8 @@ public class ChunkLogic {
);
}
public TickChunk getTickTask() {
return tickTask;
}
}

View File

@ -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);
}
}