From 58334591d0bd1e0e185818f9023d53d78c8c0c73 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 28 Oct 2018 20:45:47 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5?= =?UTF-8?q?=D0=B9=D1=81=D0=BE=D0=B2=20=D0=BF=D0=B0=D0=BA=D0=B5=D1=82=D0=B0?= =?UTF-8?q?=20mc.core.world.*?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit выделены методы для локальных и глобальных координат + добавлена документация --- core/src/main/java/mc/core/world/World.java | 20 ++-- .../main/java/mc/core/world/chunk/Chunk.java | 58 +++++++++- .../mc/core/world/chunk/ChunkProvider.java | 6 ++ .../mc/core/world/chunk/ChunkSection.java | 100 ++++++++++++++++-- .../proto_1_12_2/packets/ChunkDataPacket.java | 6 +- .../java/mc/world/simple/SimpleChunk.java | 4 +- .../mc/world/simple/SimpleChunkSection.java | 8 +- 7 files changed, 176 insertions(+), 26 deletions(-) diff --git a/core/src/main/java/mc/core/world/World.java b/core/src/main/java/mc/core/world/World.java index 37d35e0..a50ecac 100644 --- a/core/src/main/java/mc/core/world/World.java +++ b/core/src/main/java/mc/core/world/World.java @@ -1,7 +1,3 @@ -/* - * DmitriyMX - * 2018-04-15 - */ package mc.core.world; import mc.core.EntityLocation; @@ -21,14 +17,26 @@ public interface World { setSpawn(x, y, z, 0f, 0f); } + /** + * Получить чанк по координатам + * @param x глобальный X + * @param z глобальный Z + * @return {@link mc.core.world.chunk.Chunk} + */ Chunk getChunk(int x, int z); - void setChunk(int x, int z, Chunk chunkSection); default Chunk getChunk(BlockLocation location) { return getChunk(location.getX() >> 4, location.getZ() >> 4); } - default Chunk getChunk(EntityLocation location) { return getChunk(location.getBlockX() >> 4, location.getBlockZ() >> 4); } + + /** + * Установить чанк по координатам + * @param x глобальный X + * @param z глобальный Z + * @param chunk {@link mc.core.world.chunk.Chunk} + */ + void setChunk(int x, int z, Chunk chunk); } diff --git a/core/src/main/java/mc/core/world/chunk/Chunk.java b/core/src/main/java/mc/core/world/chunk/Chunk.java index 0ee2e28..0f24f23 100644 --- a/core/src/main/java/mc/core/world/chunk/Chunk.java +++ b/core/src/main/java/mc/core/world/chunk/Chunk.java @@ -2,13 +2,67 @@ package mc.core.world.chunk; import mc.core.world.Biome; +/* 16x256x16 */ public interface Chunk { + /** + * Глобальная координата X + * @return + */ int getX(); + + /** + * Глобальная координата Z + * @return + */ int getZ(); + /** + * Получить секцию чанка + * @param height высота (0-15) + * @return {@link mc.core.world.chunk.ChunkSection} + */ ChunkSection getChunkSection(int height); + + /** + * Установить секцию чанка + * @param height высота (0-15) + * @param chunkSection {@link mc.core.world.chunk.ChunkSection} + */ void setChunkSection(int height, ChunkSection chunkSection); - Biome getBiome(int localX, int localZ); - void setBiome(int localX, int localZ, Biome biome); + /** + * Получиь данные по биому + * @param x глобальный X + * @param z глобальный Z + * @return + */ + default Biome getBiome(int x, int z) { + return getBiomeLocal(x >> 4, z >> 4); + } + + /** + * Получиь данные по биому + * @param x локальный X (0-15) + * @param z локальный Z (0-15) + * @return + */ + Biome getBiomeLocal(int x, int z); + + /** + * Указать данные по биому + * @param x глобальный X + * @param z глобальный Z + * @param biome {@link mc.core.world.Biome} + */ + default void setBiome(int x, int z, Biome biome) { + setBiomeLocal(x >> 4, z >> 4, biome); + } + + /** + * Указать данные по биому + * @param x локальный X (0-15) + * @param z локальный Z (0-15) + * @param biome {@link mc.core.world.Biome} + */ + void setBiomeLocal(int x, int z, Biome biome); } diff --git a/core/src/main/java/mc/core/world/chunk/ChunkProvider.java b/core/src/main/java/mc/core/world/chunk/ChunkProvider.java index 4726b63..d363fdb 100644 --- a/core/src/main/java/mc/core/world/chunk/ChunkProvider.java +++ b/core/src/main/java/mc/core/world/chunk/ChunkProvider.java @@ -1,6 +1,12 @@ package mc.core.world.chunk; public interface ChunkProvider { + /** + * Получить чанк по координатам + * @param x глобальный X + * @param z глобальный Z + * @return {@link mc.core.world.chunk.Chunk} + */ Chunk getChunk(int x , int z); void saveChunk(Chunk chunk); diff --git a/core/src/main/java/mc/core/world/chunk/ChunkSection.java b/core/src/main/java/mc/core/world/chunk/ChunkSection.java index 149c092..de91971 100644 --- a/core/src/main/java/mc/core/world/chunk/ChunkSection.java +++ b/core/src/main/java/mc/core/world/chunk/ChunkSection.java @@ -5,26 +5,108 @@ import mc.core.world.block.Block; /* 16x16x16 */ public interface ChunkSection { + /** + * Глобальная координата X + * @return + */ int getX(); + + /** + * Высота + * @return + */ int getY(); + + /** + * Глобальная координата Z + * @return + */ int getZ(); + /** + * Получить блок + * @param x глобальный X + * @param y глобальный Y + * @param z глобальный Z + * @return {@link mc.core.world.block.Block} + */ + default Block getBlock(int x, int y, int z) { + return getBlockLocal(x >> 4, y >> 4, z >> 4); + } + + /** + * Получить блок + * @param x локальный X (0-15) + * @param y локальный Y (0-15) + * @param z локальный Z (0-15) + * @return {@link mc.core.world.block.Block} + */ + Block getBlockLocal(int x, int y, int z); + + /** + * Установить блок + * @param block {@link mc.core.world.block.Block} + */ void setBlock(Block block); /** - * Получить блок по внутренним координатам - * @param x X - * @param y Y - * @param z Z - * @return {@link mc.core.world.block.Block} + * Получить данные о естественной подсветке + * @param x глобальный X + * @param y глобальный Y + * @param z глобальный Z + * @return integer значение 0-15, где 0 - это света нет, а 15 - получает прямой солнечный свет */ - Block getBlock(int x, int y, int z); + default int getSkyLight(int x, int y, int z) { + return getSkyLightLocal(x >> 4, y >> 4, z >> 4); + } - int getSkyLight(int x, int y, int z); - void setSkyLight(int x, int y, int z, int lightLevel); + /** + * Получить данные о естественной подсветке + * @param x локальный X (0-15) + * @param y локальный Y (0-15) + * @param z локальный Z (0-15) + * @return integer значение 0-15, где 0 - это света нет, а 15 - получает прямой солнечный свет + */ + int getSkyLightLocal(int x, int y, int z); + + /** + * Указать данные о естественной подсветке + * @param x глобальный X + * @param y глобальный Y + * @param z глобальный Z + * @param lightLevel значение 0-15, где 0 - это света нет, а 15 - получает прямой солнечный свет + */ + default void setSkyLight(int x, int y, int z, int lightLevel) { + setSkyLightLocal(x >> 4, y >> 4, z >> 4, lightLevel); + } + + /** + * Указать данные о естественной подсветке + * @param x локальный X (0-15) + * @param y локальный Y (0-15) + * @param z локальный Z (0-15) + * @param lightLevel значение 0-15, где 0 - это света нет, а 15 - получает прямой солнечный свет + */ + void setSkyLightLocal(int x, int y, int z, int lightLevel); int getAddition(int x, int y, int z); void setAddition(int x, int y, int z, int value); - Biome getBiome(int localX, int localZ); + /** + * Получиь данные по биому + * @param x глобальный X + * @param z глобальный Z + * @return + */ + default Biome getBiome(int x, int z) { + return getBiomeLocal(x >> 4, z >> 4); + } + + /** + * Получиь данные по биому + * @param x локальный X (0-15) + * @param z локальный Z (0-15) + * @return + */ + Biome getBiomeLocal(int x, int z); } diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChunkDataPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChunkDataPacket.java index 6b880fc..e6cf050 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChunkDataPacket.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChunkDataPacket.java @@ -150,11 +150,11 @@ public class ChunkDataPacket implements SCPacket { for (int y = 0; y < 16; y++) { for (int z = 0; z < 16; z++) { for (int x = 0; x < 16; x++) { - palettedChunkSection.addBlock(chunkSection.getBlock(x, y, z)); - palettedChunkSection.addSkyLight(chunkSection.getSkyLight(x, y, z)); + palettedChunkSection.addBlock(chunkSection.getBlockLocal(x, y, z)); + palettedChunkSection.addSkyLight(chunkSection.getSkyLightLocal(x, y, z)); if (biomeWrite) { - biomes.writeByte(chunkSection.getBiome(x, z).getId()); + biomes.writeByte(chunkSection.getBiomeLocal(x, z).getId()); if (x == 15 && z == 15) { biomeWrite = false; } diff --git a/simple_world/src/main/java/mc/world/simple/SimpleChunk.java b/simple_world/src/main/java/mc/world/simple/SimpleChunk.java index aadf810..55c8f71 100644 --- a/simple_world/src/main/java/mc/world/simple/SimpleChunk.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleChunk.java @@ -26,12 +26,12 @@ public class SimpleChunk implements Chunk { } @Override - public Biome getBiome(int localX, int localZ) { + public Biome getBiomeLocal(int x, int z) { return biome; } @Override - public void setBiome(int localX, int localZ, Biome biome) { + public void setBiomeLocal(int x, int z, Biome biome) { // ignore } } diff --git a/simple_world/src/main/java/mc/world/simple/SimpleChunkSection.java b/simple_world/src/main/java/mc/world/simple/SimpleChunkSection.java index 4674ac7..a7fb197 100644 --- a/simple_world/src/main/java/mc/world/simple/SimpleChunkSection.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleChunkSection.java @@ -17,13 +17,13 @@ public class SimpleChunkSection implements ChunkSection { } @Override - public int getSkyLight(int x, int y, int z) { + public int getSkyLightLocal(int x, int y, int z) { if (y <= 3) return 0; else return 15; } @Override - public void setSkyLight(int x, int y, int z, int lightLevel) { + public void setSkyLightLocal(int x, int y, int z, int lightLevel) { } @Override @@ -36,7 +36,7 @@ public class SimpleChunkSection implements ChunkSection { } @Override - public Biome getBiome(int localX, int localZ) { + public Biome getBiomeLocal(int x, int z) { return Biome.PLAINS; } @@ -60,7 +60,7 @@ public class SimpleChunkSection implements ChunkSection { } @Override - public Block getBlock(int x, int y, int z) { + public Block getBlockLocal(int x, int y, int z) { if (x < 0) x = 0; else if (x > 15) x = 15; if (y < 0) y = 0;