diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/backend/VertexBufferObject.java b/src/main/java/ru/windcorp/progressia/client/graphics/backend/VertexBufferObject.java index 1039cde..ce301b7 100644 --- a/src/main/java/ru/windcorp/progressia/client/graphics/backend/VertexBufferObject.java +++ b/src/main/java/ru/windcorp/progressia/client/graphics/backend/VertexBufferObject.java @@ -192,6 +192,7 @@ public class VertexBufferObject implements OpenGLDeletable { return usage; } + @Override public int getHandle() { return handle; } diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/backend/shaders/Shader.java b/src/main/java/ru/windcorp/progressia/client/graphics/backend/shaders/Shader.java index 1f8f6d3..394c32f 100644 --- a/src/main/java/ru/windcorp/progressia/client/graphics/backend/shaders/Shader.java +++ b/src/main/java/ru/windcorp/progressia/client/graphics/backend/shaders/Shader.java @@ -91,6 +91,7 @@ public class Shader implements OpenGLDeletable { ); } + @Override public int getHandle() { return handle; } diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/gui/GUILayer.java b/src/main/java/ru/windcorp/progressia/client/graphics/gui/GUILayer.java index 5f53652..90aa557 100755 --- a/src/main/java/ru/windcorp/progressia/client/graphics/gui/GUILayer.java +++ b/src/main/java/ru/windcorp/progressia/client/graphics/gui/GUILayer.java @@ -24,6 +24,7 @@ import ru.windcorp.progressia.client.graphics.input.bus.Input; public abstract class GUILayer extends AssembledFlatLayer { private final Component root = new Component("Root") { + @Override protected void handleReassemblyRequest() { GUILayer.this.invalidate(); } diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/model/ShapeRenderProgram.java b/src/main/java/ru/windcorp/progressia/client/graphics/model/ShapeRenderProgram.java index aa24489..83213ea 100644 --- a/src/main/java/ru/windcorp/progressia/client/graphics/model/ShapeRenderProgram.java +++ b/src/main/java/ru/windcorp/progressia/client/graphics/model/ShapeRenderProgram.java @@ -264,6 +264,7 @@ public class ShapeRenderProgram extends Program { private final List vertices = new ArrayList<>(); + @Override public VertexBuilder addVertex( float x, float y, float z, float r, float g, float b, @@ -278,6 +279,7 @@ public class ShapeRenderProgram extends Program { return this; } + @Override public VertexBuilder addVertex( Vec3 position, Vec3 colorMultiplier, @@ -292,6 +294,7 @@ public class ShapeRenderProgram extends Program { return this; } + @Override public ByteBuffer assemble() { ByteBuffer result = BufferUtils.createByteBuffer( DEFAULT_BYTES_PER_VERTEX * vertices.size() diff --git a/src/main/java/ru/windcorp/progressia/client/localization/MutableString.java b/src/main/java/ru/windcorp/progressia/client/localization/MutableString.java index 1aff3b3..f0a01e8 100644 --- a/src/main/java/ru/windcorp/progressia/client/localization/MutableString.java +++ b/src/main/java/ru/windcorp/progressia/client/localization/MutableString.java @@ -55,6 +55,7 @@ public abstract class MutableString { return data; } + @Override public String toString() { return get(); } diff --git a/src/main/java/ru/windcorp/progressia/client/world/ChunkRender.java b/src/main/java/ru/windcorp/progressia/client/world/ChunkRender.java index dee73cb..9c512c5 100644 --- a/src/main/java/ru/windcorp/progressia/client/world/ChunkRender.java +++ b/src/main/java/ru/windcorp/progressia/client/world/ChunkRender.java @@ -18,8 +18,11 @@ package ru.windcorp.progressia.client.world; import java.util.Collection; +import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.WeakHashMap; import java.util.stream.Collectors; import glm.mat._4.Mat4; @@ -38,11 +41,20 @@ import ru.windcorp.progressia.client.world.cro.ChunkRenderOptimizerSupplier; import ru.windcorp.progressia.client.world.cro.ChunkRenderOptimizers; import ru.windcorp.progressia.client.world.tile.TileRender; import ru.windcorp.progressia.client.world.tile.TileRenderRegistry; +import ru.windcorp.progressia.client.world.tile.TileRenderStack; import ru.windcorp.progressia.common.world.ChunkData; import ru.windcorp.progressia.common.world.block.BlockFace; +import ru.windcorp.progressia.common.world.generic.GenericChunk; import ru.windcorp.progressia.common.world.tile.TileData; +import ru.windcorp.progressia.common.world.tile.TileDataStack; -public class ChunkRender { +public class ChunkRender +implements GenericChunk< + ChunkRender, + BlockRender, + TileRender, + TileRenderStack +> { private final WorldRender world; private final ChunkData data; @@ -50,11 +62,43 @@ public class ChunkRender { private boolean needsUpdate; private Model model = null; + private final Map tileRenderLists = + Collections.synchronizedMap(new WeakHashMap<>()); + public ChunkRender(WorldRender world, ChunkData data) { this.world = world; this.data = data; } + @Override + public Vec3i getPosition() { + return getData().getPosition(); + } + + @Override + public BlockRender getBlock(Vec3i posInChunk) { + return BlockRenderRegistry.getInstance().get( + getData().getBlock(posInChunk).getId() + ); + } + + @Override + public TileRenderStack getTiles(Vec3i blockInChunk, BlockFace face) { + return getTileStackWrapper(getData().getTiles(blockInChunk, face)); + } + + @Override + public boolean hasTiles(Vec3i blockInChunk, BlockFace face) { + return getData().hasTiles(blockInChunk, face); + } + + private TileRenderStack getTileStackWrapper(TileDataStack tileDataList) { + return tileRenderLists.computeIfAbsent( + tileDataList, + TileRenderStackImpl::new + ); + } + public WorldRender getWorld() { return world; } @@ -71,12 +115,6 @@ public class ChunkRender { return needsUpdate; } - public BlockRender getBlock(Vec3i posInChunk) { - return BlockRenderRegistry.getInstance().get( - getData().getBlock(posInChunk).getId() - ); - } - public void render(ShapeRenderHelper renderer) { if (model == null || needsUpdate()) { buildModel(); @@ -232,5 +270,45 @@ public class ChunkRender { new Mat4().identity().translate(pos) ); } + + private class TileRenderStackImpl extends TileRenderStack { + + private final TileDataStack parent; + + public TileRenderStackImpl(TileDataStack parent) { + this.parent = parent; + } + + @Override + public Vec3i getBlockInChunk(Vec3i output) { + return parent.getBlockInChunk(output); + } + + @Override + public ChunkRender getChunk() { + return ChunkRender.this; + } + + @Override + public BlockFace getFace() { + return parent.getFace(); + } + + @Override + public TileRender get(int index) { + return TileRenderRegistry.getInstance().get(parent.get(index).getId()); + } + + @Override + public int size() { + return parent.size(); + } + + @Override + public TileDataStack getData() { + return parent; + } + + } } diff --git a/src/main/java/ru/windcorp/progressia/client/world/WorldRender.java b/src/main/java/ru/windcorp/progressia/client/world/WorldRender.java index 49b8272..71acda9 100644 --- a/src/main/java/ru/windcorp/progressia/client/world/WorldRender.java +++ b/src/main/java/ru/windcorp/progressia/client/world/WorldRender.java @@ -26,15 +26,26 @@ import java.util.WeakHashMap; import glm.vec._3.i.Vec3i; import ru.windcorp.progressia.client.graphics.backend.FaceCulling; import ru.windcorp.progressia.client.graphics.model.ShapeRenderHelper; +import ru.windcorp.progressia.client.world.block.BlockRender; import ru.windcorp.progressia.client.world.entity.EntityRenderRegistry; import ru.windcorp.progressia.client.world.entity.EntityRenderable; +import ru.windcorp.progressia.client.world.tile.TileRender; +import ru.windcorp.progressia.client.world.tile.TileRenderStack; import ru.windcorp.progressia.common.world.ChunkData; import ru.windcorp.progressia.common.world.ChunkDataListeners; import ru.windcorp.progressia.common.world.WorldData; import ru.windcorp.progressia.common.world.WorldDataListener; import ru.windcorp.progressia.common.world.entity.EntityData; +import ru.windcorp.progressia.common.world.generic.GenericWorld; -public class WorldRender { +public class WorldRender +implements GenericWorld< + BlockRender, + TileRender, + TileRenderStack, + ChunkRender, + EntityRenderable +> { private final WorldData data; @@ -67,14 +78,21 @@ public class WorldRender { return chunks.get(chunkData); } + @Override public ChunkRender getChunk(Vec3i pos) { return chunks.get(getData().getChunk(pos)); } + @Override public Collection getChunks() { return chunks.values(); } + @Override + public Collection getEntities() { + return entityModels.values(); + } + public void render(ShapeRenderHelper renderer) { for (ChunkRender chunk : getChunks()) { chunk.render(renderer); diff --git a/src/main/java/ru/windcorp/progressia/client/world/block/BlockRender.java b/src/main/java/ru/windcorp/progressia/client/world/block/BlockRender.java index b7e8de5..66dd99b 100644 --- a/src/main/java/ru/windcorp/progressia/client/world/block/BlockRender.java +++ b/src/main/java/ru/windcorp/progressia/client/world/block/BlockRender.java @@ -19,9 +19,10 @@ package ru.windcorp.progressia.client.world.block; import ru.windcorp.progressia.client.graphics.model.ShapeRenderHelper; import ru.windcorp.progressia.common.util.namespaces.Namespaced; +import ru.windcorp.progressia.common.world.generic.GenericBlock; import ru.windcorp.progressia.client.graphics.model.Renderable; -public abstract class BlockRender extends Namespaced { +public abstract class BlockRender extends Namespaced implements GenericBlock { public BlockRender(String id) { super(id); diff --git a/src/main/java/ru/windcorp/progressia/client/world/cro/ChunkRenderOptimizerCube.java b/src/main/java/ru/windcorp/progressia/client/world/cro/ChunkRenderOptimizerCube.java index 4ee0bae..161012c 100644 --- a/src/main/java/ru/windcorp/progressia/client/world/cro/ChunkRenderOptimizerCube.java +++ b/src/main/java/ru/windcorp/progressia/client/world/cro/ChunkRenderOptimizerCube.java @@ -18,8 +18,8 @@ package ru.windcorp.progressia.client.world.cro; import static ru.windcorp.progressia.common.world.ChunkData.BLOCKS_PER_CHUNK; -import static ru.windcorp.progressia.common.world.tile.GenericTileStack.TILES_PER_FACE; import static ru.windcorp.progressia.common.world.block.BlockFace.BLOCK_FACE_COUNT; +import static ru.windcorp.progressia.common.world.generic.GenericTileStack.TILES_PER_FACE; import java.util.ArrayList; import java.util.Collection; diff --git a/src/main/java/ru/windcorp/progressia/client/world/entity/EntityRenderable.java b/src/main/java/ru/windcorp/progressia/client/world/entity/EntityRenderable.java index e7e8466..067b640 100644 --- a/src/main/java/ru/windcorp/progressia/client/world/entity/EntityRenderable.java +++ b/src/main/java/ru/windcorp/progressia/client/world/entity/EntityRenderable.java @@ -3,8 +3,9 @@ package ru.windcorp.progressia.client.world.entity; import glm.vec._3.Vec3; import ru.windcorp.progressia.client.graphics.model.Renderable; import ru.windcorp.progressia.common.world.entity.EntityData; +import ru.windcorp.progressia.common.world.generic.GenericEntity; -public abstract class EntityRenderable implements Renderable { +public abstract class EntityRenderable implements Renderable, GenericEntity { private final EntityData data; @@ -16,6 +17,16 @@ public abstract class EntityRenderable implements Renderable { return data; } + @Override + public Vec3 getPosition() { + return getData().getPosition(); + } + + @Override + public String getId() { + return getData().getId(); + } + public void getViewPoint(Vec3 output) { output.set(0, 0, 0); } diff --git a/src/main/java/ru/windcorp/progressia/client/world/tile/TileRender.java b/src/main/java/ru/windcorp/progressia/client/world/tile/TileRender.java index 65cf3a2..3e78ee9 100644 --- a/src/main/java/ru/windcorp/progressia/client/world/tile/TileRender.java +++ b/src/main/java/ru/windcorp/progressia/client/world/tile/TileRender.java @@ -5,8 +5,9 @@ import ru.windcorp.progressia.client.graphics.model.Renderable; import ru.windcorp.progressia.client.world.cro.ChunkRenderOptimizer; import ru.windcorp.progressia.common.util.namespaces.Namespaced; import ru.windcorp.progressia.common.world.block.BlockFace; +import ru.windcorp.progressia.common.world.generic.GenericTile; -public class TileRender extends Namespaced { +public class TileRender extends Namespaced implements GenericTile { public TileRender(String id) { super(id); diff --git a/src/main/java/ru/windcorp/progressia/client/world/tile/TileRenderStack.java b/src/main/java/ru/windcorp/progressia/client/world/tile/TileRenderStack.java new file mode 100644 index 0000000..2d81c11 --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/client/world/tile/TileRenderStack.java @@ -0,0 +1,16 @@ +package ru.windcorp.progressia.client.world.tile; + +import ru.windcorp.progressia.client.world.ChunkRender; +import ru.windcorp.progressia.common.world.generic.GenericTileStack; +import ru.windcorp.progressia.common.world.tile.TileDataStack; + +public abstract class TileRenderStack +extends GenericTileStack< + TileRenderStack, + TileRender, + ChunkRender +> { + + public abstract TileDataStack getData(); + +} diff --git a/src/main/java/ru/windcorp/progressia/common/state/OptimizedStateStorage.java b/src/main/java/ru/windcorp/progressia/common/state/OptimizedStateStorage.java index ed6213b..234e399 100644 --- a/src/main/java/ru/windcorp/progressia/common/state/OptimizedStateStorage.java +++ b/src/main/java/ru/windcorp/progressia/common/state/OptimizedStateStorage.java @@ -8,10 +8,12 @@ public class OptimizedStateStorage extends StateStorage { this.ints = new int[sizes.getInts()]; } + @Override public int getInt(int index) { return ints[index]; } + @Override public void setInt(int index, int value) { ints[index] = value; } diff --git a/src/main/java/ru/windcorp/progressia/common/util/ByteBufferInputStream.java b/src/main/java/ru/windcorp/progressia/common/util/ByteBufferInputStream.java index fee39a9..bdb1f14 100644 --- a/src/main/java/ru/windcorp/progressia/common/util/ByteBufferInputStream.java +++ b/src/main/java/ru/windcorp/progressia/common/util/ByteBufferInputStream.java @@ -32,6 +32,7 @@ public class ByteBufferInputStream extends InputStream { this.buffer = buffer; } + @Override public int read() { if (!buffer.hasRemaining()) { return -1; @@ -39,6 +40,7 @@ public class ByteBufferInputStream extends InputStream { return buffer.get() & 0xFF; } + @Override public int read(byte[] bytes, int off, int len) { if (!buffer.hasRemaining()) { return -1; diff --git a/src/main/java/ru/windcorp/progressia/common/util/ByteBufferOutputStream.java b/src/main/java/ru/windcorp/progressia/common/util/ByteBufferOutputStream.java index e4f891c..1f1323e 100644 --- a/src/main/java/ru/windcorp/progressia/common/util/ByteBufferOutputStream.java +++ b/src/main/java/ru/windcorp/progressia/common/util/ByteBufferOutputStream.java @@ -30,6 +30,7 @@ public class ByteBufferOutputStream extends OutputStream { this.buffer = buffer; } + @Override public void write(int b) throws IOException { try { buffer.put((byte) b); @@ -38,6 +39,7 @@ public class ByteBufferOutputStream extends OutputStream { } } + @Override public void write(byte[] bytes, int off, int len) throws IOException { try { buffer.put(bytes, off, len); diff --git a/src/main/java/ru/windcorp/progressia/common/util/SizeLimitedList.java b/src/main/java/ru/windcorp/progressia/common/util/SizeLimitedList.java index 09c3f26..83645a0 100644 --- a/src/main/java/ru/windcorp/progressia/common/util/SizeLimitedList.java +++ b/src/main/java/ru/windcorp/progressia/common/util/SizeLimitedList.java @@ -44,6 +44,7 @@ public class SizeLimitedList extends ForwardingList { return standardAddAll(index, elements); } + @Override public boolean add(E e) { checkMaxSize(); return delegate().add(e); diff --git a/src/main/java/ru/windcorp/progressia/common/util/VectorUtil.java b/src/main/java/ru/windcorp/progressia/common/util/VectorUtil.java index 2b42481..eaa02ed 100644 --- a/src/main/java/ru/windcorp/progressia/common/util/VectorUtil.java +++ b/src/main/java/ru/windcorp/progressia/common/util/VectorUtil.java @@ -22,7 +22,7 @@ public class VectorUtil { public static void forEachVectorInCuboid( int x0, int y0, int z0, int x1, int y1, int z1, - Consumer action + Consumer action ) { Vec3i cursor = Vectors.grab3i(); diff --git a/src/main/java/ru/windcorp/progressia/common/world/ChunkData.java b/src/main/java/ru/windcorp/progressia/common/world/ChunkData.java index 863d990..ed5e5d6 100644 --- a/src/main/java/ru/windcorp/progressia/common/world/ChunkData.java +++ b/src/main/java/ru/windcorp/progressia/common/world/ChunkData.java @@ -33,12 +33,19 @@ import ru.windcorp.progressia.common.util.VectorUtil; import ru.windcorp.progressia.common.world.block.BlockData; import ru.windcorp.progressia.common.world.block.BlockFace; import ru.windcorp.progressia.common.world.entity.EntityData; +import ru.windcorp.progressia.common.world.generic.GenericChunk; import ru.windcorp.progressia.common.world.tile.TileData; import ru.windcorp.progressia.common.world.tile.TileDataStack; import ru.windcorp.progressia.common.world.tile.TileReference; import ru.windcorp.progressia.common.world.tile.TileStackIsFullException; -public class ChunkData { +public class ChunkData +implements GenericChunk< + ChunkData, + BlockData, + TileData, + TileDataStack +> { public static final int BLOCKS_PER_CHUNK = Coordinates.CHUNK_SIZE; @@ -65,6 +72,12 @@ public class ChunkData { this.world = world; } + @Override + public Vec3i getPosition() { + return position; + } + + @Override public BlockData getBlock(Vec3i posInChunk) { return blocks[getBlockIndex(posInChunk)]; } @@ -81,6 +94,7 @@ public class ChunkData { } } + @Override public TileDataStack getTilesOrNull(Vec3i blockInChunk, BlockFace face) { return tiles[getTileIndex(blockInChunk, face)]; } @@ -98,10 +112,12 @@ public class ChunkData { this.tiles[getTileIndex(blockInChunk, face)] = tiles; } + @Override public boolean hasTiles(Vec3i blockInChunk, BlockFace face) { return getTilesOrNull(blockInChunk, face) != null; } + @Override public TileDataStack getTiles(Vec3i blockInChunk, BlockFace face) { int index = getTileIndex(blockInChunk, face); @@ -206,22 +222,6 @@ public class ChunkData { public void forEachEntity(Consumer action) { getEntities().forEach(action); } - - public int getX() { - return position.x; - } - - public int getY() { - return position.y; - } - - public int getZ() { - return position.z; - } - - public Vec3i getPosition() { - return position; - } public WorldData getWorld() { return world; diff --git a/src/main/java/ru/windcorp/progressia/common/world/WorldData.java b/src/main/java/ru/windcorp/progressia/common/world/WorldData.java index d719f20..1924487 100644 --- a/src/main/java/ru/windcorp/progressia/common/world/WorldData.java +++ b/src/main/java/ru/windcorp/progressia/common/world/WorldData.java @@ -30,9 +30,19 @@ import ru.windcorp.progressia.common.collision.CollisionModel; import ru.windcorp.progressia.common.util.CoordinatePacker; import ru.windcorp.progressia.common.world.block.BlockData; import ru.windcorp.progressia.common.world.entity.EntityData; +import ru.windcorp.progressia.common.world.generic.GenericWorld; +import ru.windcorp.progressia.common.world.tile.TileData; +import ru.windcorp.progressia.common.world.tile.TileDataStack; import ru.windcorp.progressia.test.TestContent; -public class WorldData { +public class WorldData +implements GenericWorld< + BlockData, + TileData, + TileDataStack, + ChunkData, + EntityData +>{ private final TLongObjectMap chunksByPos = new TSynchronizedLongObjectMap<>(new TLongObjectHashMap<>(), this); @@ -55,6 +65,21 @@ public class WorldData { } + @Override + public ChunkData getChunk(Vec3i pos) { + return chunksByPos.get(CoordinatePacker.pack3IntsIntoLong(pos)); + } + + @Override + public Collection getChunks() { + return chunks; + } + + @Override + public Collection getEntities() { + return entities; + } + public void tmp_generate() { final int size = 10; Vec3i cursor = new Vec3i(0, 0, 0); @@ -112,21 +137,6 @@ public class WorldData { return CoordinatePacker.pack3IntsIntoLong(chunk.getPosition()); } - public ChunkData getChunk(Vec3i pos) { - return chunksByPos.get(CoordinatePacker.pack3IntsIntoLong(pos)); - } - - public ChunkData getChunkByBlock(Vec3i blockInWorld) { - return getChunk(Coordinates.convertInWorldToChunk(blockInWorld, null)); - } - - public BlockData getBlock(Vec3i blockInWorld) { - ChunkData chunk = getChunkByBlock(blockInWorld); - if (chunk == null) return null; - - return chunk.getBlock(Coordinates.convertInWorldToInChunk(blockInWorld, null)); - } - public void setBlock(Vec3i blockInWorld, BlockData block, boolean notify) { ChunkData chunk = getChunkByBlock(blockInWorld); if (chunk == null) @@ -139,10 +149,6 @@ public class WorldData { chunk.setBlock(Coordinates.convertInWorldToInChunk(blockInWorld, null), block, notify); } - public Collection getChunks() { - return chunks; - } - public TLongSet getChunkKeys() { return chunksByPos.keySet(); } @@ -151,10 +157,6 @@ public class WorldData { return entitiesById.get(entityId); } - public Collection getEntities() { - return entities; - } - public float getTime() { return time; } diff --git a/src/main/java/ru/windcorp/progressia/common/world/block/BlockData.java b/src/main/java/ru/windcorp/progressia/common/world/block/BlockData.java index 87feb5e..0e0cefb 100644 --- a/src/main/java/ru/windcorp/progressia/common/world/block/BlockData.java +++ b/src/main/java/ru/windcorp/progressia/common/world/block/BlockData.java @@ -20,8 +20,9 @@ package ru.windcorp.progressia.common.world.block; import ru.windcorp.progressia.common.collision.AABB; import ru.windcorp.progressia.common.collision.CollisionModel; import ru.windcorp.progressia.common.util.namespaces.Namespaced; +import ru.windcorp.progressia.common.world.generic.GenericBlock; -public class BlockData extends Namespaced { +public class BlockData extends Namespaced implements GenericBlock { public BlockData(String id) { super(id); diff --git a/src/main/java/ru/windcorp/progressia/common/world/entity/EntityData.java b/src/main/java/ru/windcorp/progressia/common/world/entity/EntityData.java index c7eda54..af3da1e 100644 --- a/src/main/java/ru/windcorp/progressia/common/world/entity/EntityData.java +++ b/src/main/java/ru/windcorp/progressia/common/world/entity/EntityData.java @@ -2,13 +2,12 @@ package ru.windcorp.progressia.common.world.entity; import glm.vec._2.Vec2; import glm.vec._3.Vec3; -import glm.vec._3.i.Vec3i; import ru.windcorp.progressia.common.collision.Collideable; import ru.windcorp.progressia.common.collision.CollisionModel; import ru.windcorp.progressia.common.state.StatefulObject; -import ru.windcorp.progressia.common.world.Coordinates; +import ru.windcorp.progressia.common.world.generic.GenericEntity; -public class EntityData extends StatefulObject implements Collideable { +public class EntityData extends StatefulObject implements Collideable, GenericEntity { private final Vec3 position = new Vec3(); private final Vec3 velocity = new Vec3(); @@ -25,20 +24,11 @@ public class EntityData extends StatefulObject implements Collideable { super(EntityDataRegistry.getInstance(), id); } + @Override public Vec3 getPosition() { return position; } - public Vec3i getBlockInWorld(Vec3i output) { - if (output == null) output = new Vec3i(); - return position.round(output); - } - - public Vec3i getChunkCoords(Vec3i output) { - output = getBlockInWorld(output); - return Coordinates.convertInWorldToChunk(output, output); - } - public void setPosition(Vec3 position) { move(position.sub_(getPosition())); } diff --git a/src/main/java/ru/windcorp/progressia/common/world/generic/GenericBlock.java b/src/main/java/ru/windcorp/progressia/common/world/generic/GenericBlock.java new file mode 100644 index 0000000..b0a6e2d --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/common/world/generic/GenericBlock.java @@ -0,0 +1,7 @@ +package ru.windcorp.progressia.common.world.generic; + +public interface GenericBlock { + + String getId(); + +} diff --git a/src/main/java/ru/windcorp/progressia/common/world/generic/GenericChunk.java b/src/main/java/ru/windcorp/progressia/common/world/generic/GenericChunk.java new file mode 100644 index 0000000..8dc3cf8 --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/common/world/generic/GenericChunk.java @@ -0,0 +1,85 @@ +package ru.windcorp.progressia.common.world.generic; + +import java.util.function.Consumer; + +import glm.vec._3.i.Vec3i; +import ru.windcorp.progressia.common.util.VectorUtil; +import ru.windcorp.progressia.common.util.Vectors; +import ru.windcorp.progressia.common.world.Coordinates; +import ru.windcorp.progressia.common.world.block.BlockFace; + +public interface GenericChunk< + Self extends GenericChunk, + B extends GenericBlock, + T extends GenericTile, + TS extends GenericTileStack +> { + + public static final int BLOCKS_PER_CHUNK = Coordinates.CHUNK_SIZE; + + Vec3i getPosition(); + + B getBlock(Vec3i blockInChunk); + TS getTiles(Vec3i blockInChunk, BlockFace face); + boolean hasTiles(Vec3i blockInChunk, BlockFace face); + + default int getX() { + return getPosition().x; + } + + default int getY() { + return getPosition().y; + } + + default int getZ() { + return getPosition().z; + } + + default boolean containsBiC(Vec3i blockInChunk) { + return + blockInChunk.x >= 0 && blockInChunk.x < BLOCKS_PER_CHUNK && + blockInChunk.y >= 0 && blockInChunk.y < BLOCKS_PER_CHUNK && + blockInChunk.z >= 0 && blockInChunk.z < BLOCKS_PER_CHUNK; + } + + default boolean containsBiW(Vec3i blockInWorld) { + Vec3i v = Vectors.grab3i(); + + v = Coordinates.getInWorld(getPosition(), Vectors.ZERO_3i, v); + v = blockInWorld.sub(v, v); + + boolean result = containsBiC(v); + + Vectors.release(v); + return result; + } + + default void forEachBiC(Consumer action) { + VectorUtil.forEachVectorInCuboid( + 0, 0, 0, + BLOCKS_PER_CHUNK, BLOCKS_PER_CHUNK, BLOCKS_PER_CHUNK, + action + ); + } + + default void forEachBiW(Consumer action) { + VectorUtil.forEachVectorInCuboid( + Coordinates.getInWorld(getX(), 0), + Coordinates.getInWorld(getY(), 0), + Coordinates.getInWorld(getZ(), 0), + BLOCKS_PER_CHUNK, + BLOCKS_PER_CHUNK, + BLOCKS_PER_CHUNK, + action + ); + } + + default TS getTilesOrNull(Vec3i blockInChunk, BlockFace face) { + if (hasTiles(blockInChunk, face)) { + return getTiles(blockInChunk, face); + } + + return null; + } + +} diff --git a/src/main/java/ru/windcorp/progressia/common/world/generic/GenericEntity.java b/src/main/java/ru/windcorp/progressia/common/world/generic/GenericEntity.java new file mode 100644 index 0000000..ac8ca36 --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/common/world/generic/GenericEntity.java @@ -0,0 +1,22 @@ +package ru.windcorp.progressia.common.world.generic; + +import glm.vec._3.Vec3; +import glm.vec._3.i.Vec3i; +import ru.windcorp.progressia.common.world.Coordinates; + +public interface GenericEntity { + + String getId(); + Vec3 getPosition(); + + default Vec3i getBlockInWorld(Vec3i output) { + if (output == null) output = new Vec3i(); + return getPosition().round(output); + } + + default Vec3i getChunkCoords(Vec3i output) { + output = getBlockInWorld(output); + return Coordinates.convertInWorldToChunk(output, output); + } + +} diff --git a/src/main/java/ru/windcorp/progressia/common/world/generic/GenericTile.java b/src/main/java/ru/windcorp/progressia/common/world/generic/GenericTile.java new file mode 100644 index 0000000..f674391 --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/common/world/generic/GenericTile.java @@ -0,0 +1,7 @@ +package ru.windcorp.progressia.common.world.generic; + +public interface GenericTile { + + String getId(); + +} diff --git a/src/main/java/ru/windcorp/progressia/common/world/tile/GenericTileStack.java b/src/main/java/ru/windcorp/progressia/common/world/generic/GenericTileStack.java similarity index 84% rename from src/main/java/ru/windcorp/progressia/common/world/tile/GenericTileStack.java rename to src/main/java/ru/windcorp/progressia/common/world/generic/GenericTileStack.java index e22cc8b..476ba31 100644 --- a/src/main/java/ru/windcorp/progressia/common/world/tile/GenericTileStack.java +++ b/src/main/java/ru/windcorp/progressia/common/world/generic/GenericTileStack.java @@ -1,4 +1,4 @@ -package ru.windcorp.progressia.common.world.tile; +package ru.windcorp.progressia.common.world.generic; import java.util.AbstractList; import java.util.Objects; @@ -6,11 +6,14 @@ import java.util.RandomAccess; import java.util.function.Consumer; import glm.vec._3.i.Vec3i; -import ru.windcorp.progressia.common.util.namespaces.Namespaced; import ru.windcorp.progressia.common.world.Coordinates; import ru.windcorp.progressia.common.world.block.BlockFace; -public abstract class GenericTileStack +public abstract class GenericTileStack< + Self extends GenericTileStack, + T extends GenericTile, + C extends GenericChunk +> extends AbstractList implements RandomAccess { @@ -21,13 +24,12 @@ implements RandomAccess { public static final int TILES_PER_FACE = 8; public abstract Vec3i getBlockInChunk(Vec3i output); - protected abstract Vec3i getChunkPos(); public abstract C getChunk(); public abstract BlockFace getFace(); public Vec3i getBlockInWorld(Vec3i output) { // This is safe - return Coordinates.getInWorld(getChunkPos(), getBlockInChunk(output), output); + return Coordinates.getInWorld(getChunk().getPosition(), getBlockInChunk(output), output); } public boolean isFull() { diff --git a/src/main/java/ru/windcorp/progressia/common/world/generic/GenericWorld.java b/src/main/java/ru/windcorp/progressia/common/world/generic/GenericWorld.java new file mode 100644 index 0000000..79746ed --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/common/world/generic/GenericWorld.java @@ -0,0 +1,176 @@ +package ru.windcorp.progressia.common.world.generic; + +import java.util.Collection; +import java.util.function.Consumer; + +import glm.Glm; +import glm.vec._3.Vec3; +import glm.vec._3.i.Vec3i; +import ru.windcorp.progressia.common.util.Vectors; +import ru.windcorp.progressia.common.world.Coordinates; +import ru.windcorp.progressia.common.world.block.BlockFace; + +public interface GenericWorld< + B extends GenericBlock, + T extends GenericTile, + TS extends GenericTileStack, + C extends GenericChunk, + E extends GenericEntity +> { + + Collection getChunks(); + C getChunk(Vec3i pos); + + Collection getEntities(); + + /* + * Chunks + */ + + default C getChunkByBlock(Vec3i blockInWorld) { + Vec3i chunkCoords = Vectors.grab3i(); + chunkCoords = Coordinates.convertInWorldToChunk(blockInWorld, chunkCoords); + C result = getChunk(chunkCoords); + Vectors.release(chunkCoords); + return result; + } + + default B getBlock(Vec3i blockInWorld) { + Vec3i v = Vectors.grab3i(); + B result; + + C chunk = getChunk(Coordinates.convertInWorldToChunk(blockInWorld, v)); + if (chunk == null) { + result = null; + } else { + result = chunk.getBlock(Coordinates.convertInWorldToInChunk(blockInWorld, v)); + } + + Vectors.release(v); + return result; + } + + default TS getTiles(Vec3i blockInWorld, BlockFace face) { + Vec3i v = Vectors.grab3i(); + TS result; + + C chunk = getChunk(Coordinates.convertInWorldToChunk(blockInWorld, v)); + if (chunk == null) { + result = null; + } else { + result = chunk.getTiles(Coordinates.convertInWorldToInChunk(blockInWorld, v), face); + } + + Vectors.release(v); + return result; + } + + default TS getTilesOrNull(Vec3i blockInWorld, BlockFace face) { + Vec3i v = Vectors.grab3i(); + TS result; + + C chunk = getChunk(Coordinates.convertInWorldToChunk(blockInWorld, v)); + if (chunk == null) { + result = null; + } else { + result = chunk.getTilesOrNull(Coordinates.convertInWorldToInChunk(blockInWorld, v), face); + } + + Vectors.release(v); + return result; + } + + default boolean hasTiles(Vec3i blockInWorld, BlockFace face) { + Vec3i v = Vectors.grab3i(); + boolean result; + + C chunk = getChunk(Coordinates.convertInWorldToChunk(blockInWorld, v)); + if (chunk == null) { + result = false; + } else { + result = chunk.hasTiles(Coordinates.convertInWorldToInChunk(blockInWorld, v), face); + } + + Vectors.release(v); + return result; + } + + default T getTile(Vec3i blockInWorld, BlockFace face, int layer) { + TS stack = getTilesOrNull(blockInWorld, face); + if (stack == null || stack.size() <= layer) return null; + return stack.get(layer); + } + + default boolean isChunkLoaded(Vec3i pos) { + return getChunk(pos) != null; + } + + default boolean isBlockLoaded(Vec3i blockInWorld) { + return getChunkByBlock(blockInWorld) != null; + } + + default void forEachChunk(Consumer action) { + getChunks().forEach(action); + } + + /* + * Entities + */ + + default void forEachEntity(Consumer action) { + getEntities().forEach(action); + } + + default void forEachEntityIn(Vec3i min, Vec3i max, Consumer action) { + forEachEntity(e -> { + Vec3 pos = e.getPosition(); + if (pos.x < min.x || pos.y < min.y || pos.z < min.z || pos.x > max.x || pos.y > max.y || pos.z > max.z) { + action.accept(e); + } + }); + } + + default void forEachEntityIn(Vec3 min, Vec3 max, Consumer action) { + forEachEntity(e -> { + Vec3 pos = e.getPosition(); + if (pos.x < min.x || pos.y < min.y || pos.z < min.z || pos.x > max.x || pos.y > max.y || pos.z > max.z) { + action.accept(e); + } + }); + } + + default void forEachEntityInChunk(Vec3i pos, Consumer action) { + Vec3i v = Vectors.grab3i(); + + forEachEntity(e -> { + e.getChunkCoords(v); + if (Glm.equals(v, pos)) { + action.accept(e); + } + }); + + Vectors.release(v); + } + + default void forEachEntityInChunk(C chunk, Consumer action) { + Vec3i v = Vectors.grab3i(); + + forEachEntity(e -> { + e.getChunkCoords(v); + if (Glm.equals(v, chunk.getPosition())) { + action.accept(e); + } + }); + + Vectors.release(v); + } + + default void forEachEntityWithId(String id, Consumer action) { + forEachEntity(e -> { + if (id.equals(e.getId())) { + action.accept(e); + } + }); + } + +} diff --git a/src/main/java/ru/windcorp/progressia/common/world/tile/TileData.java b/src/main/java/ru/windcorp/progressia/common/world/tile/TileData.java index d3354f6..a08edf7 100644 --- a/src/main/java/ru/windcorp/progressia/common/world/tile/TileData.java +++ b/src/main/java/ru/windcorp/progressia/common/world/tile/TileData.java @@ -18,8 +18,9 @@ package ru.windcorp.progressia.common.world.tile; import ru.windcorp.progressia.common.util.namespaces.Namespaced; +import ru.windcorp.progressia.common.world.generic.GenericTile; -public class TileData extends Namespaced { +public class TileData extends Namespaced implements GenericTile { public TileData(String id) { super(id); diff --git a/src/main/java/ru/windcorp/progressia/common/world/tile/TileDataStack.java b/src/main/java/ru/windcorp/progressia/common/world/tile/TileDataStack.java index 489a5ca..f0f7609 100644 --- a/src/main/java/ru/windcorp/progressia/common/world/tile/TileDataStack.java +++ b/src/main/java/ru/windcorp/progressia/common/world/tile/TileDataStack.java @@ -1,10 +1,15 @@ package ru.windcorp.progressia.common.world.tile; -import glm.vec._3.i.Vec3i; import ru.windcorp.progressia.common.world.ChunkData; import ru.windcorp.progressia.common.world.block.BlockData; +import ru.windcorp.progressia.common.world.generic.GenericTileStack; -public abstract class TileDataStack extends GenericTileStack { +public abstract class TileDataStack +extends GenericTileStack< + TileDataStack, + TileData, + ChunkData +> { /** * Inserts the specified tile at the specified position in this stack. @@ -54,15 +59,6 @@ public abstract class TileDataStack extends GenericTileStack { private final WorldLogic world; private final ChunkData data; @@ -43,31 +49,36 @@ public class ChunkLogic { this.world = world; this.data = data; - generateTickLists(); + tmp_generateTickLists(); } - private void generateTickLists() { - ChunkTickContext context = TickContextMutable.start().withChunk(this).build(); - - context.forEachBlock(bctxt -> { - BlockLogic block = bctxt.getBlock(); - - if (!(block instanceof TickableBlock)) return; - - if (((TickableBlock) block).getTickingPolicy(bctxt) == TickingPolicy.REGULAR) { - tickingBlocks.add(Coordinates.convertInWorldToInChunk(bctxt.getBlockInWorld(), null)); - } - - bctxt.forEachFace(fctxt -> fctxt.forEachTile(tctxt -> { - TileLogic tile = tctxt.getTile(); - - if (!(tile instanceof TickableTile)) return; - - if (((TickableTile) tile).getTickingPolicy(tctxt) == TickingPolicy.REGULAR) { - tickingTiles.add(tctxt.getReference()); - } - })); - }); + @Override + public Vec3i getPosition() { + return getData().getPosition(); + } + + @Override + public BlockLogic getBlock(Vec3i blockInChunk) { + return BlockLogicRegistry.getInstance().get( + getData().getBlock(blockInChunk).getId() + ); + } + + @Override + public TileLogicStack getTiles(Vec3i blockInChunk, BlockFace face) { + return getTileStackWrapper(getData().getTiles(blockInChunk, face)); + } + + @Override + public boolean hasTiles(Vec3i blockInChunk, BlockFace face) { + return getData().hasTiles(blockInChunk, face); + } + + private TileLogicStack getTileStackWrapper(TileDataStack tileDataList) { + return tileLogicLists.computeIfAbsent( + tileDataList, + TileLogicStackImpl::new + ); } public WorldLogic getWorld() { @@ -78,10 +89,6 @@ public class ChunkLogic { return data; } - public Vec3i getPosition() { - return getData().getPosition(); - } - public boolean hasTickingBlocks() { return !tickingBlocks.isEmpty(); } @@ -114,29 +121,6 @@ public class ChunkLogic { }); } - public BlockLogic getBlock(Vec3i blockInChunk) { - return BlockLogicRegistry.getInstance().get( - getData().getBlock(blockInChunk).getId() - ); - } - - public TileLogicStack getTiles(Vec3i blockInChunk, BlockFace face) { - return getTileStackWrapper(getData().getTiles(blockInChunk, face)); - } - - public TileLogicStack getTilesOrNull(Vec3i blockInChunk, BlockFace face) { - TileDataStack tiles = getData().getTilesOrNull(blockInChunk, face); - if (tiles == null) return null; - return getTileStackWrapper(tiles); - } - - private TileLogicStack getTileStackWrapper(TileDataStack tileDataList) { - return tileLogicLists.computeIfAbsent( - tileDataList, - TileLogicStackImpl::new - ); - } - public TickChunk getTickTask() { return tickTask; } @@ -154,11 +138,6 @@ public class ChunkLogic { return parent.getBlockInChunk(output); } - @Override - public Vec3i getChunkPos() { - return ChunkLogic.this.getPosition(); - } - @Override public ChunkLogic getChunk() { return ChunkLogic.this; @@ -185,5 +164,29 @@ public class ChunkLogic { } } + + private void tmp_generateTickLists() { + ChunkTickContext context = TickContextMutable.start().withChunk(this).build(); + + context.forEachBlock(bctxt -> { + BlockLogic block = bctxt.getBlock(); + + if (!(block instanceof TickableBlock)) return; + + if (((TickableBlock) block).getTickingPolicy(bctxt) == TickingPolicy.REGULAR) { + tickingBlocks.add(Coordinates.convertInWorldToInChunk(bctxt.getBlockInWorld(), null)); + } + + bctxt.forEachFace(fctxt -> fctxt.forEachTile(tctxt -> { + TileLogic tile = tctxt.getTile(); + + if (!(tile instanceof TickableTile)) return; + + if (((TickableTile) tile).getTickingPolicy(tctxt) == TickingPolicy.REGULAR) { + tickingTiles.add(tctxt.getReference()); + } + })); + }); + } } diff --git a/src/main/java/ru/windcorp/progressia/server/world/TickContextMutable.java b/src/main/java/ru/windcorp/progressia/server/world/TickContextMutable.java index 5ed3ef1..f5ce2db 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/TickContextMutable.java +++ b/src/main/java/ru/windcorp/progressia/server/world/TickContextMutable.java @@ -8,7 +8,7 @@ import glm.vec._3.i.Vec3i; 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.tile.GenericTileStack; +import ru.windcorp.progressia.common.world.generic.GenericTileStack; import ru.windcorp.progressia.common.world.tile.TileDataStack; import ru.windcorp.progressia.common.world.tile.TileReference; import ru.windcorp.progressia.server.Server; @@ -87,7 +87,7 @@ public abstract class TickContextMutable implements BlockTickContext, TSTickCont public static interface World extends Builder { Chunk withChunk(Vec3i chunk); Block withBlock(Vec3i blockInWorld); - TileStack withTS(GenericTileStack tileStack); + TileStack withTS(GenericTileStack tileStack); default Builder.Chunk withChunk(ChunkData chunk) { Objects.requireNonNull(chunk, "chunk"); @@ -237,7 +237,7 @@ public abstract class TickContextMutable implements BlockTickContext, TSTickCont } @Override - public TileStack withTS(GenericTileStack tileStack) { + public TileStack withTS(GenericTileStack tileStack) { Objects.requireNonNull(tileStack, "tileStack"); return withBlock(tileStack.getBlockInWorld(this.blockInWorld)).withFace(tileStack.getFace()); diff --git a/src/main/java/ru/windcorp/progressia/server/world/WorldLogic.java b/src/main/java/ru/windcorp/progressia/server/world/WorldLogic.java index ca745a7..0142c08 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/WorldLogic.java +++ b/src/main/java/ru/windcorp/progressia/server/world/WorldLogic.java @@ -2,22 +2,29 @@ package ru.windcorp.progressia.server.world; import java.util.Collection; import java.util.HashMap; -import java.util.List; import java.util.Map; import glm.vec._3.i.Vec3i; import ru.windcorp.progressia.common.world.ChunkData; import ru.windcorp.progressia.common.world.ChunkDataListeners; -import ru.windcorp.progressia.common.world.Coordinates; import ru.windcorp.progressia.common.world.WorldData; import ru.windcorp.progressia.common.world.WorldDataListener; -import ru.windcorp.progressia.common.world.block.BlockFace; +import ru.windcorp.progressia.common.world.entity.EntityData; +import ru.windcorp.progressia.common.world.generic.GenericWorld; import ru.windcorp.progressia.server.Server; import ru.windcorp.progressia.server.world.block.BlockLogic; import ru.windcorp.progressia.server.world.tile.TileLogic; +import ru.windcorp.progressia.server.world.tile.TileLogicStack; import ru.windcorp.progressia.test.TestChunkSender; -public class WorldLogic { +public class WorldLogic +implements GenericWorld< + BlockLogic, + TileLogic, + TileLogicStack, + ChunkLogic, + EntityData // not using EntityLogic because it is stateless +> { private final WorldData data; private final Server server; @@ -44,6 +51,21 @@ public class WorldLogic { data.addListener(new TestChunkSender(server)); } + @Override + public ChunkLogic getChunk(Vec3i pos) { + return chunks.get(getData().getChunk(pos)); + } + + @Override + public Collection getChunks() { + return chunks.values(); + } + + @Override + public Collection getEntities() { + return getData().getEntities(); + } + public Server getServer() { return server; } @@ -55,53 +77,5 @@ public class WorldLogic { public ChunkLogic getChunk(ChunkData chunkData) { return chunks.get(chunkData); } - - public ChunkLogic getChunk(Vec3i pos) { - return chunks.get(getData().getChunk(pos)); - } - - public ChunkLogic getChunkByBlock(Vec3i blockInWorld) { - return getChunk(Coordinates.convertInWorldToChunk(blockInWorld, null)); - } - - public BlockLogic getBlock(Vec3i blockInWorld) { - ChunkLogic chunk = getChunkByBlock(blockInWorld); - if (chunk == null) return null; - - return chunk.getBlock(Coordinates.convertInWorldToInChunk(blockInWorld, null)); - } - - public List getTiles(Vec3i blockInWorld, BlockFace face) { - return getTilesImpl(blockInWorld, face, true); - } - - public List getTilesOrNull(Vec3i blockInWorld, BlockFace face) { - return getTilesImpl(blockInWorld, face, false); - } - - private List getTilesImpl(Vec3i blockInWorld, BlockFace face, boolean createIfMissing) { - ChunkLogic chunk = getChunkByBlock(blockInWorld); - if (chunk == null) return null; - - Vec3i blockInChunk = Coordinates.convertInWorldToInChunk(blockInWorld, null); - - List result = - createIfMissing - ? chunk.getTiles(blockInChunk, face) - : chunk.getTilesOrNull(blockInChunk, face); - - return result; - } - - public TileLogic getTile(Vec3i blockInWorld, BlockFace face, int layer) { - List tiles = getTilesOrNull(blockInWorld, face); - if (tiles == null || tiles.size() <= layer) return null; - - return tiles.get(layer); - } - - public Collection getChunks() { - return chunks.values(); - } } diff --git a/src/main/java/ru/windcorp/progressia/server/world/block/BlockLogic.java b/src/main/java/ru/windcorp/progressia/server/world/block/BlockLogic.java index 045e707..cb8fa6d 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/block/BlockLogic.java +++ b/src/main/java/ru/windcorp/progressia/server/world/block/BlockLogic.java @@ -2,8 +2,9 @@ package ru.windcorp.progressia.server.world.block; import ru.windcorp.progressia.common.util.namespaces.Namespaced; import ru.windcorp.progressia.common.world.block.BlockFace; +import ru.windcorp.progressia.common.world.generic.GenericBlock; -public class BlockLogic extends Namespaced { +public class BlockLogic extends Namespaced implements GenericBlock { public BlockLogic(String id) { super(id); diff --git a/src/main/java/ru/windcorp/progressia/server/world/tile/TileLogic.java b/src/main/java/ru/windcorp/progressia/server/world/tile/TileLogic.java index c44ec7e..3521143 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/tile/TileLogic.java +++ b/src/main/java/ru/windcorp/progressia/server/world/tile/TileLogic.java @@ -2,8 +2,9 @@ package ru.windcorp.progressia.server.world.tile; import ru.windcorp.progressia.common.util.namespaces.Namespaced; import ru.windcorp.progressia.common.world.block.BlockFace; +import ru.windcorp.progressia.common.world.generic.GenericTile; -public class TileLogic extends Namespaced { +public class TileLogic extends Namespaced implements GenericTile { public TileLogic(String id) { super(id); diff --git a/src/main/java/ru/windcorp/progressia/server/world/tile/TileLogicStack.java b/src/main/java/ru/windcorp/progressia/server/world/tile/TileLogicStack.java index ea5789b..6c0b6ec 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/tile/TileLogicStack.java +++ b/src/main/java/ru/windcorp/progressia/server/world/tile/TileLogicStack.java @@ -1,12 +1,15 @@ package ru.windcorp.progressia.server.world.tile; -import ru.windcorp.progressia.common.world.tile.GenericTileStack; +import ru.windcorp.progressia.common.world.generic.GenericTileStack; import ru.windcorp.progressia.common.world.tile.TileDataStack; import ru.windcorp.progressia.server.world.ChunkLogic; -public abstract class TileLogicStack extends GenericTileStack { - - // TODO add @Deprecated or smth similar to all modification methods +public abstract class TileLogicStack +extends GenericTileStack< + TileLogicStack, + TileLogic, + ChunkLogic +> { public abstract TileDataStack getData();