Working on #3 - implemented chunk ticking in general and regular ticks
This commit is contained in:
parent
2d322e83bc
commit
9dbeeb7e8d
@ -132,7 +132,7 @@ public class Server {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void scheduleChunkTicks(Server server) {
|
private void scheduleChunkTicks(Server server) {
|
||||||
|
server.getWorld().getChunks().forEach(chunk -> requestEvaluation(chunk.getTickTask()));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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.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.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;
|
||||||
import ru.windcorp.progressia.server.world.tile.TileLogicRegistry;
|
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<Vec3i> tickingBlocks = new ArrayList<>();
|
||||||
private final Collection<TileLocation> tickingTiles = new ArrayList<>();
|
private final Collection<TileLocation> tickingTiles = new ArrayList<>();
|
||||||
|
|
||||||
|
private final TickChunk tickTask = new TickChunk(this);
|
||||||
|
|
||||||
private final Map<List<TileData>, List<TileLogic>> tileLogicLists =
|
private final Map<List<TileData>, List<TileLogic>> tileLogicLists =
|
||||||
Collections.synchronizedMap(new WeakHashMap<>());
|
Collections.synchronizedMap(new WeakHashMap<>());
|
||||||
|
|
||||||
@ -89,6 +92,10 @@ public class ChunkLogic {
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Vec3i getPosition() {
|
||||||
|
return getData().getPosition();
|
||||||
|
}
|
||||||
|
|
||||||
public boolean hasTickingBlocks() {
|
public boolean hasTickingBlocks() {
|
||||||
return !tickingBlocks.isEmpty();
|
return !tickingBlocks.isEmpty();
|
||||||
}
|
}
|
||||||
@ -142,4 +149,8 @@ public class ChunkLogic {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public TickChunk getTickTask() {
|
||||||
|
return tickTask;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Reference in New Issue
Block a user