From 252ebccf8c6dcff521a5a28c19181908c5c9b370 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 16 Aug 2018 12:17:49 +0300 Subject: [PATCH 01/17] =?UTF-8?q?=D0=B0=D0=BA=D1=82=D1=83=D0=B0=D0=BB?= =?UTF-8?q?=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20flat=5Fworld/README.MD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- flat_world/README.MD | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/flat_world/README.MD b/flat_world/README.MD index f48fe3b..4cc4f66 100644 --- a/flat_world/README.MD +++ b/flat_world/README.MD @@ -7,13 +7,21 @@ ```xml - + + + + + + ``` -`spawn` - точка спавна +`spawn` - точка спавна. + +При указании точки спавна, указывать шестой параметр `World` не имеет смысла, +т.к. `FlatWorld` всё равно перезапишет этот параметр. From b4f2b72e3aa7bbfca73faed5054defba9cee1cbb Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 16 Aug 2018 13:25:05 +0300 Subject: [PATCH 02/17] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20WorldUnloadedException?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- flat_world/src/main/java/mc/world/flat/SimpleChunk.java | 3 +-- .../src/main/java/mc/world/flat/SimpleChunkSection.java | 2 +- .../src/main/java/mc/world/flat/WorldUnloadedException.java | 4 ++++ 3 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 flat_world/src/main/java/mc/world/flat/WorldUnloadedException.java diff --git a/flat_world/src/main/java/mc/world/flat/SimpleChunk.java b/flat_world/src/main/java/mc/world/flat/SimpleChunk.java index 21cafb7..5208c33 100644 --- a/flat_world/src/main/java/mc/world/flat/SimpleChunk.java +++ b/flat_world/src/main/java/mc/world/flat/SimpleChunk.java @@ -47,8 +47,7 @@ public class SimpleChunk implements Chunk { @Override public World getWorld() { if (refWorld.get() == null) { - log.error("World unloaded?"); - return null; + throw new WorldUnloadedException(); } else { return refWorld.get(); } diff --git a/flat_world/src/main/java/mc/world/flat/SimpleChunkSection.java b/flat_world/src/main/java/mc/world/flat/SimpleChunkSection.java index 414cbb4..4db9cf5 100644 --- a/flat_world/src/main/java/mc/world/flat/SimpleChunkSection.java +++ b/flat_world/src/main/java/mc/world/flat/SimpleChunkSection.java @@ -71,6 +71,6 @@ public class SimpleChunkSection implements ChunkSection { @Override public World getWorld() { - return null; + throw new UnsupportedOperationException(); } } diff --git a/flat_world/src/main/java/mc/world/flat/WorldUnloadedException.java b/flat_world/src/main/java/mc/world/flat/WorldUnloadedException.java new file mode 100644 index 0000000..127f2ab --- /dev/null +++ b/flat_world/src/main/java/mc/world/flat/WorldUnloadedException.java @@ -0,0 +1,4 @@ +package mc.world.flat; + +public class WorldUnloadedException extends RuntimeException { +} From 39d7872d6aa1aadc707b62247223231e7eb5b9ae Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 16 Aug 2018 14:27:58 +0300 Subject: [PATCH 03/17] =?UTF-8?q?=D0=BA=D0=BE=D1=80=D1=80=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20Unloaded=20excepti?= =?UTF-8?q?on?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/mc/core/Location.java | 2 +- .../mc/core/exception/McCoreUncheckedException.java | 12 ------------ .../mc/core/exception/ResourceUnloadedException.java | 3 +-- .../java/mc/world/flat/WorldUnloadedException.java | 4 ---- 4 files changed, 2 insertions(+), 19 deletions(-) delete mode 100644 core/src/main/java/mc/core/exception/McCoreUncheckedException.java delete mode 100644 flat_world/src/main/java/mc/world/flat/WorldUnloadedException.java diff --git a/core/src/main/java/mc/core/Location.java b/core/src/main/java/mc/core/Location.java index afb3582..319cf87 100644 --- a/core/src/main/java/mc/core/Location.java +++ b/core/src/main/java/mc/core/Location.java @@ -39,7 +39,7 @@ public class Location implements Cloneable { if (refWorld == null) { return null; } else if (refWorld.get() == null) { - throw new ResourceUnloadedException("You're trying to get unloaded world"); + throw new ResourceUnloadedException("World unloaded"); } else { return refWorld.get(); } diff --git a/core/src/main/java/mc/core/exception/McCoreUncheckedException.java b/core/src/main/java/mc/core/exception/McCoreUncheckedException.java deleted file mode 100644 index 15313f3..0000000 --- a/core/src/main/java/mc/core/exception/McCoreUncheckedException.java +++ /dev/null @@ -1,12 +0,0 @@ -package mc.core.exception; - -public abstract class McCoreUncheckedException extends RuntimeException { - - public McCoreUncheckedException() { - super(); - } - - public McCoreUncheckedException(String msg) { - super(msg); - } -} diff --git a/core/src/main/java/mc/core/exception/ResourceUnloadedException.java b/core/src/main/java/mc/core/exception/ResourceUnloadedException.java index 07ac21f..eede649 100644 --- a/core/src/main/java/mc/core/exception/ResourceUnloadedException.java +++ b/core/src/main/java/mc/core/exception/ResourceUnloadedException.java @@ -1,7 +1,6 @@ package mc.core.exception; -public class ResourceUnloadedException extends McCoreUncheckedException { - +public class ResourceUnloadedException extends RuntimeException { public ResourceUnloadedException(String msg) { super(msg); } diff --git a/flat_world/src/main/java/mc/world/flat/WorldUnloadedException.java b/flat_world/src/main/java/mc/world/flat/WorldUnloadedException.java deleted file mode 100644 index 127f2ab..0000000 --- a/flat_world/src/main/java/mc/world/flat/WorldUnloadedException.java +++ /dev/null @@ -1,4 +0,0 @@ -package mc.world.flat; - -public class WorldUnloadedException extends RuntimeException { -} From d7c0a7078f2988148e70f8452cb8d6e8215bf660 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 16 Aug 2018 14:28:35 +0300 Subject: [PATCH 04/17] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D1=8C=20=D1=83=D0=BA=D0=B0=D0=B7=D1=8B=D0=B2?= =?UTF-8?q?=D0=B0=D1=82=D1=8C=20=D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D1=8B=D0=B5=20=D1=81=D0=BB=D0=BE=D0=B8=20?= =?UTF-8?q?=D0=B1=D0=BB=D0=BE=D0=BA=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/mc/world/flat/FlatWorld.java | 27 +++++++++++++++- .../main/java/mc/world/flat/SimpleChunk.java | 3 +- .../mc/world/flat/SimpleChunkSection.java | 31 ++++++++++++++----- .../proto_1_12_2/packets/ChunkDataPacket.java | 5 ++- 4 files changed, 56 insertions(+), 10 deletions(-) diff --git a/flat_world/src/main/java/mc/world/flat/FlatWorld.java b/flat_world/src/main/java/mc/world/flat/FlatWorld.java index 6ec745f..f687e85 100644 --- a/flat_world/src/main/java/mc/world/flat/FlatWorld.java +++ b/flat_world/src/main/java/mc/world/flat/FlatWorld.java @@ -9,15 +9,19 @@ import lombok.extern.slf4j.Slf4j; import mc.core.EntityLocation; import mc.core.world.World; import mc.core.world.WorldType; +import mc.core.world.block.BlockType; import mc.core.world.chunk.Chunk; import mc.core.world.chunk.ChunkSection; +import java.util.ArrayList; +import java.util.List; + @Slf4j public class FlatWorld implements World { @Getter private final WorldType worldType = WorldType.FLAT; private EntityLocation spawn; - private ChunkSection chunkSection = new SimpleChunkSection(); + private ChunkSection chunkSection; @Override public EntityLocation getSpawn() { @@ -46,4 +50,25 @@ public class FlatWorld implements World { public void setChunk(int x, int z, Chunk chunk) { throw new UnsupportedOperationException(); } + + public void setLayersBlock(List listOfLayers) { + List layoutsBlock = new ArrayList<>(); + + for (String value : listOfLayers) { + String[] splitValue = value.split(";"); + + BlockType blockType; + try { + blockType = BlockType.valueOf(splitValue[1]); + } catch (IllegalArgumentException e) { + continue; + } + + for (int i = 0; i < Integer.parseInt(splitValue[0]); i++) { + layoutsBlock.add(blockType); + } + } + + this.chunkSection = new SimpleChunkSection(layoutsBlock, this); + } } diff --git a/flat_world/src/main/java/mc/world/flat/SimpleChunk.java b/flat_world/src/main/java/mc/world/flat/SimpleChunk.java index 5208c33..13d81f6 100644 --- a/flat_world/src/main/java/mc/world/flat/SimpleChunk.java +++ b/flat_world/src/main/java/mc/world/flat/SimpleChunk.java @@ -2,6 +2,7 @@ package mc.world.flat; import lombok.Getter; import lombok.extern.slf4j.Slf4j; +import mc.core.exception.ResourceUnloadedException; import mc.core.world.Biome; import mc.core.world.World; import mc.core.world.chunk.Chunk; @@ -47,7 +48,7 @@ public class SimpleChunk implements Chunk { @Override public World getWorld() { if (refWorld.get() == null) { - throw new WorldUnloadedException(); + throw new ResourceUnloadedException("World unloaded"); } else { return refWorld.get(); } diff --git a/flat_world/src/main/java/mc/world/flat/SimpleChunkSection.java b/flat_world/src/main/java/mc/world/flat/SimpleChunkSection.java index 4db9cf5..7b3265e 100644 --- a/flat_world/src/main/java/mc/world/flat/SimpleChunkSection.java +++ b/flat_world/src/main/java/mc/world/flat/SimpleChunkSection.java @@ -4,18 +4,28 @@ */ package mc.world.flat; +import mc.core.exception.ResourceUnloadedException; import mc.core.world.Biome; import mc.core.world.World; import mc.core.world.block.Block; import mc.core.world.block.BlockFactory; import mc.core.world.block.BlockType; -import mc.core.world.chunk.Chunk; import mc.core.world.chunk.ChunkSection; import java.lang.ref.Reference; import java.lang.ref.WeakReference; +import java.util.List; public class SimpleChunkSection implements ChunkSection { + private final BlockFactory blockFactory = new BlockFactory(); + private final List layersBlock; + private Reference refWorld; + + public SimpleChunkSection(List layersBlock, World world) { + this.layersBlock = layersBlock; + this.refWorld = new WeakReference<>(world); + } + @Override public int getSkyLight(int x, int y, int z) { if (y <= 3) return 0; @@ -61,16 +71,23 @@ public class SimpleChunkSection implements ChunkSection { @Override public Block getBlock(int x, int y, int z) { - BlockFactory blockFactory = new BlockFactory(); + if (y >= layersBlock.size()) { + return blockFactory.create(BlockType.AIR, x, y, z, getWorld()); + } - if (y == 0) return blockFactory.create(BlockType.BEDROCK, x, y, z, getWorld()); - else if (y >= 1 && y <= 2) return blockFactory.create(BlockType.DIRT, x, y, z, getWorld()); - else if (y == 3) return blockFactory.create(BlockType.GRASS, x, y, z, getWorld()); - else return blockFactory.create(BlockType.AIR, x, y, z, getWorld()); + BlockType blockType = layersBlock.get(y); + if (blockType == null) return blockFactory.create(BlockType.AIR, x, y, z, getWorld()); + + return blockFactory.create(blockType, x, y, z, getWorld()); } @Override public World getWorld() { - throw new UnsupportedOperationException(); + World world = refWorld.get(); + if (world == null) { + throw new ResourceUnloadedException("World unloaded"); + } + + return world; } } 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 b3d6cd7..6600db6 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 @@ -102,6 +102,7 @@ public class ChunkDataPacket implements SCPacket { netStream.writeInt(z); // Chunk Y netStream.writeBoolean(initChunk); // Init Chunk + int maxH = 0; if (sectionList == null && chunk != null) { int bitMask = 0; for (int h = 15; h >= 0; h--) { @@ -109,6 +110,7 @@ public class ChunkDataPacket implements SCPacket { ChunkSection chunkSection = chunk.getChunkSection(h); if (chunkSection != null && chunkSection.getY() == h) { bitMask |= 0x01; + maxH++; } else { bitMask |= 0x00; } @@ -123,6 +125,7 @@ public class ChunkDataPacket implements SCPacket { ChunkSection chunkSection = sectionList.get(i); if (chunkSection != null && chunkSection.getY() == h) { bitMask |= 0x01; + maxH++; } else { bitMask |= 0x00; } @@ -138,7 +141,7 @@ public class ChunkDataPacket implements SCPacket { int dataItems = 0; final int airBlockPalette = serializeBlockState(BlockType.AIR); - for (int h = 0; h < 16; h++) { + for (int h = 0; h < maxH; h++) { ChunkSection chunkSection = null; if (chunk != null) { From dd54314ff5073e3a9ede6543e75c856a6ec8694b Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 16 Aug 2018 14:31:56 +0300 Subject: [PATCH 05/17] =?UTF-8?q?=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20README.MD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- flat_world/README.MD | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/flat_world/README.MD b/flat_world/README.MD index 4cc4f66..ca1899e 100644 --- a/flat_world/README.MD +++ b/flat_world/README.MD @@ -18,6 +18,13 @@ + + + 1;BEDROCK + 2;DIRT + 1;GRASS + + ``` @@ -25,3 +32,8 @@ При указании точки спавна, указывать шестой параметр `World` не имеет смысла, т.к. `FlatWorld` всё равно перезапишет этот параметр. + +`layersBlock` - слои блоков. + +В качестве значения указывается спиток строк, каждая из которых описывает слой блоков. +Формат строк такой: `кол-во_слоёв;тип_блока`. Порядок строк такой: сверху нижние слои, а снизу - верхние. From 1941291a5b11d93e9d5d2116ebd494f09323f385 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 25 Aug 2018 18:24:46 +0300 Subject: [PATCH 06/17] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20ChunkProvider?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/mc/core/world/chunk/ChunkProvider.java | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 core/src/main/java/mc/core/world/chunk/ChunkProvider.java diff --git a/core/src/main/java/mc/core/world/chunk/ChunkProvider.java b/core/src/main/java/mc/core/world/chunk/ChunkProvider.java new file mode 100644 index 0000000..4726b63 --- /dev/null +++ b/core/src/main/java/mc/core/world/chunk/ChunkProvider.java @@ -0,0 +1,8 @@ +package mc.core.world.chunk; + +public interface ChunkProvider { + Chunk getChunk(int x , int z); + + void saveChunk(Chunk chunk); + void saveChunk(Chunk... chunks); +} From 3b98a2b5a9bafdcd777ee379aa0c4bbbae6283cc Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 25 Aug 2018 18:28:15 +0300 Subject: [PATCH 07/17] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B8=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BC=D0=BE?= =?UTF-8?q?=D0=B4=D1=83=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- settings.gradle | 2 +- {flat_world => simple_world}/README.MD | 8 ++++---- {flat_world => simple_world}/build.gradle | 0 .../src/main/java/mc/world/simple}/SimpleChunk.java | 2 +- .../main/java/mc/world/simple}/SimpleChunkSection.java | 2 +- .../src/main/java/mc/world/simple/SimpleWorld.java | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) rename {flat_world => simple_world}/README.MD (86%) rename {flat_world => simple_world}/build.gradle (100%) rename {flat_world/src/main/java/mc/world/flat => simple_world/src/main/java/mc/world/simple}/SimpleChunk.java (98%) rename {flat_world/src/main/java/mc/world/flat => simple_world/src/main/java/mc/world/simple}/SimpleChunkSection.java (98%) rename flat_world/src/main/java/mc/world/flat/FlatWorld.java => simple_world/src/main/java/mc/world/simple/SimpleWorld.java (96%) diff --git a/settings.gradle b/settings.gradle index 52ad5e4..c7f27f4 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,7 +1,7 @@ rootProject.name = 'mc-server' include('core') // Core -include('flat_world') +include('simple_world') include('vanilla_commands') include('proto_1.12.2') // Protocol 1.12.2 include('proto_1.12.2_netty') // Protocol 1.12.2 (Netty impl.) diff --git a/flat_world/README.MD b/simple_world/README.MD similarity index 86% rename from flat_world/README.MD rename to simple_world/README.MD index ca1899e..02871ed 100644 --- a/flat_world/README.MD +++ b/simple_world/README.MD @@ -1,11 +1,11 @@ -# Flat world +# Simple world -Плоский мир +Простая реализация мира ## Spring bean ```xml - + @@ -31,7 +31,7 @@ `spawn` - точка спавна. При указании точки спавна, указывать шестой параметр `World` не имеет смысла, -т.к. `FlatWorld` всё равно перезапишет этот параметр. +т.к. `SimpleWorld` всё равно перезапишет этот параметр. `layersBlock` - слои блоков. diff --git a/flat_world/build.gradle b/simple_world/build.gradle similarity index 100% rename from flat_world/build.gradle rename to simple_world/build.gradle diff --git a/flat_world/src/main/java/mc/world/flat/SimpleChunk.java b/simple_world/src/main/java/mc/world/simple/SimpleChunk.java similarity index 98% rename from flat_world/src/main/java/mc/world/flat/SimpleChunk.java rename to simple_world/src/main/java/mc/world/simple/SimpleChunk.java index 13d81f6..0cd0abf 100644 --- a/flat_world/src/main/java/mc/world/flat/SimpleChunk.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleChunk.java @@ -1,4 +1,4 @@ -package mc.world.flat; +package mc.world.simple; import lombok.Getter; import lombok.extern.slf4j.Slf4j; diff --git a/flat_world/src/main/java/mc/world/flat/SimpleChunkSection.java b/simple_world/src/main/java/mc/world/simple/SimpleChunkSection.java similarity index 98% rename from flat_world/src/main/java/mc/world/flat/SimpleChunkSection.java rename to simple_world/src/main/java/mc/world/simple/SimpleChunkSection.java index 7b3265e..3fdf5ae 100644 --- a/flat_world/src/main/java/mc/world/flat/SimpleChunkSection.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleChunkSection.java @@ -2,7 +2,7 @@ * DmitriyMX * 2018-04-28 */ -package mc.world.flat; +package mc.world.simple; import mc.core.exception.ResourceUnloadedException; import mc.core.world.Biome; diff --git a/flat_world/src/main/java/mc/world/flat/FlatWorld.java b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java similarity index 96% rename from flat_world/src/main/java/mc/world/flat/FlatWorld.java rename to simple_world/src/main/java/mc/world/simple/SimpleWorld.java index f687e85..aa28baa 100644 --- a/flat_world/src/main/java/mc/world/flat/FlatWorld.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java @@ -2,7 +2,7 @@ * DmitriyMX * 2018-04-28 */ -package mc.world.flat; +package mc.world.simple; import lombok.Getter; import lombok.extern.slf4j.Slf4j; @@ -17,7 +17,7 @@ import java.util.ArrayList; import java.util.List; @Slf4j -public class FlatWorld implements World { +public class SimpleWorld implements World { @Getter private final WorldType worldType = WorldType.FLAT; private EntityLocation spawn; From 15ba4aeda9d65897851ede1dfd5a56c0c5ff63b7 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 26 Aug 2018 00:34:02 +0300 Subject: [PATCH 08/17] =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=BC=D0=B5=D1=85=D0=B0=D0=BD=D0=B8=D0=B7=D0=BC=20?= =?UTF-8?q?=D1=83=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BA=D0=B8=20=D1=81?= =?UTF-8?q?=D0=BF=D0=B0=D0=B2=D0=BD=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/mc/core/world/World.java | 5 ++++- simple_world/src/main/java/mc/world/simple/SimpleWorld.java | 5 ++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/mc/core/world/World.java b/core/src/main/java/mc/core/world/World.java index 20bf437..a6cbf9d 100644 --- a/core/src/main/java/mc/core/world/World.java +++ b/core/src/main/java/mc/core/world/World.java @@ -11,7 +11,10 @@ public interface World { WorldType getWorldType(); EntityLocation getSpawn(); - void setSpawn(EntityLocation location); + void setSpawn(double x, double y, double z, float yaw, float pitch); + default void setSpawn(double x, double y, double z) { + setSpawn(x, y, z, 0f, 0f); + } Chunk getChunk(int x, int z); void setChunk(int x, int z, Chunk chunkSection); diff --git a/simple_world/src/main/java/mc/world/simple/SimpleWorld.java b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java index aa28baa..179e9f0 100644 --- a/simple_world/src/main/java/mc/world/simple/SimpleWorld.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java @@ -34,9 +34,8 @@ public class SimpleWorld implements World { } @Override - public void setSpawn(EntityLocation location) { - this.spawn = location; - this.spawn.setWorld(this); + public void setSpawn(double x, double y, double z, float yaw, float pitch) { + this.spawn = new EntityLocation(x, y, z, yaw, pitch, this); } @Override From 06835aa5a2be9e0dca20a90faac4b31297e81c13 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 26 Aug 2018 00:48:33 +0300 Subject: [PATCH 09/17] =?UTF-8?q?=D1=83=D0=BB=D1=83=D1=87=D1=88=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=81=D0=BE=D0=B2=D0=BC=D0=B5=D1=81=D1=82=D0=B8?= =?UTF-8?q?=D0=BC=D0=BE=D1=81=D1=82=D1=8C=20=D1=81=20Gradle=205?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 380447c..fc4d863 100644 --- a/build.gradle +++ b/build.gradle @@ -33,8 +33,9 @@ subprojects { exclude group: 'commons-logging' } - /* Components */ - compile (group: 'org.projectlombok', name: 'lombok', version: '1.16.16') + /* Lombok */ + annotationProcessor (group: 'org.projectlombok', name: 'lombok', version: '1.16.16') + compileOnly (group: 'org.projectlombok', name: 'lombok', version: '1.16.16') /* JUnit */ testCompile (group: 'junit', name: 'junit', version: '4.12') From 2147c18f81930cd2d202388ed3b1867d055f7a58 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 26 Aug 2018 00:51:55 +0300 Subject: [PATCH 10/17] =?UTF-8?q?=D0=B8=D1=81=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BD=D0=B0=20World=20=D0=B8=D0=B7=20=D0=BA=D0=BB=D0=B0=D1=81?= =?UTF-8?q?=D1=81=D0=B0=20Chunk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/mc/core/world/chunk/Chunk.java | 4 --- .../java/mc/world/simple/SimpleChunk.java | 30 ++----------------- .../java/mc/world/simple/SimpleWorld.java | 2 +- 3 files changed, 4 insertions(+), 32 deletions(-) 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 9436ccf..0ee2e28 100644 --- a/core/src/main/java/mc/core/world/chunk/Chunk.java +++ b/core/src/main/java/mc/core/world/chunk/Chunk.java @@ -1,7 +1,6 @@ package mc.core.world.chunk; import mc.core.world.Biome; -import mc.core.world.World; public interface Chunk { int getX(); @@ -12,7 +11,4 @@ public interface Chunk { Biome getBiome(int localX, int localZ); void setBiome(int localX, int localZ, Biome biome); - - World getWorld(); - void setWorld(World world); } 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 0cd0abf..aadf810 100644 --- a/simple_world/src/main/java/mc/world/simple/SimpleChunk.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleChunk.java @@ -1,30 +1,20 @@ package mc.world.simple; import lombok.Getter; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import mc.core.exception.ResourceUnloadedException; import mc.core.world.Biome; -import mc.core.world.World; import mc.core.world.chunk.Chunk; import mc.core.world.chunk.ChunkSection; -import java.lang.ref.Reference; -import java.lang.ref.WeakReference; - @Slf4j +@RequiredArgsConstructor public class SimpleChunk implements Chunk { @Getter - private int x, z; - private Reference refWorld; + private final int x, z; private ChunkSection chunkSection; private final Biome biome = Biome.PLAINS; - public SimpleChunk(int x, int z, World world) { - this.x = x; - this.z = z; - setWorld(world); - } - @Override public ChunkSection getChunkSection(int height) { return chunkSection; @@ -44,18 +34,4 @@ public class SimpleChunk implements Chunk { public void setBiome(int localX, int localZ, Biome biome) { // ignore } - - @Override - public World getWorld() { - if (refWorld.get() == null) { - throw new ResourceUnloadedException("World unloaded"); - } else { - return refWorld.get(); - } - } - - @Override - public void setWorld(World world) { - this.refWorld = new WeakReference<>(world); - } } diff --git a/simple_world/src/main/java/mc/world/simple/SimpleWorld.java b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java index 179e9f0..c1b1b19 100644 --- a/simple_world/src/main/java/mc/world/simple/SimpleWorld.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java @@ -40,7 +40,7 @@ public class SimpleWorld implements World { @Override public Chunk getChunk(int x, int z) { - Chunk chunk = new SimpleChunk(x, z, this); + Chunk chunk = new SimpleChunk(x, z); chunk.setChunkSection(0, chunkSection); return chunk; } From 464a2e7be681be84cb4db34a8ef7a7d8a65db842 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 26 Aug 2018 01:13:21 +0300 Subject: [PATCH 11/17] =?UTF-8?q?=D0=B8=D1=81=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BD=D0=B0=20World=20=D0=B2=20Location=20=D0=B8=20ChunkSectio?= =?UTF-8?q?n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/mc/core/EntityLocation.java | 42 +++++++++- core/src/main/java/mc/core/Location.java | 43 +--------- .../mc/core/world/block/BlockFactory.java | 8 +- .../mc/core/world/chunk/ChunkSection.java | 2 - .../test/java/mc/core/TestEntityLocation.java | 78 ++++++++++++++++++- core/src/test/java/mc/core/TestLocation.java | 74 +----------------- .../packets/PlayerBlockPlacementPacket.java | 2 +- .../packets/PlayerDiggingPacket.java | 2 +- .../packets/TabCompletePacket.java | 2 +- .../packets/TestChunkdataPacket.java | 8 +- .../mc/world/simple/SimpleChunkSection.java | 24 +----- .../java/mc/world/simple/SimpleWorld.java | 2 +- 12 files changed, 133 insertions(+), 154 deletions(-) diff --git a/core/src/main/java/mc/core/EntityLocation.java b/core/src/main/java/mc/core/EntityLocation.java index 0eec9d2..960fd08 100644 --- a/core/src/main/java/mc/core/EntityLocation.java +++ b/core/src/main/java/mc/core/EntityLocation.java @@ -6,16 +6,24 @@ package mc.core; import lombok.Getter; import lombok.Setter; +import mc.core.exception.ResourceUnloadedException; import mc.core.world.World; +import mc.core.world.chunk.Chunk; +import mc.core.world.chunk.ChunkSection; + +import java.lang.ref.Reference; +import java.lang.ref.WeakReference; public class EntityLocation extends Location implements Cloneable { @Getter @Setter private float yaw, pitch; + private Reference refWorld; public EntityLocation(double x, double y, double z, float yaw, float pitch, World world) { - super(x, y, z, world); + super(x, y, z); setYawPitch(yaw, pitch); + setWorld(world); } public void setYawPitch(float yaw, float pitch) { @@ -27,6 +35,38 @@ public class EntityLocation extends Location implements Cloneable { setYawPitch(entityLocation.yaw, entityLocation.pitch); } + public World getWorld() { + if (refWorld == null) { + return null; + } else if (refWorld.get() == null) { + throw new ResourceUnloadedException("World unloaded"); + } else { + return refWorld.get(); + } + } + + public void setWorld (World world) { + this.refWorld = new WeakReference<>(world); + } + + public Chunk getChunk() { + World world = getWorld(); + if (world == null) { + return null; + } else { + return world.getChunk(getBlockX() >> 4, getBlockZ() >> 4); + } + } + + public ChunkSection getChunkSection() { + Chunk chunk = getChunk(); + if (chunk == null) { + return null; + } else { + return chunk.getChunkSection(getBlockY() >> 4); + } + } + @Override public EntityLocation clone() { return (EntityLocation) super.clone(); diff --git a/core/src/main/java/mc/core/Location.java b/core/src/main/java/mc/core/Location.java index 5d87626..62ca57d 100644 --- a/core/src/main/java/mc/core/Location.java +++ b/core/src/main/java/mc/core/Location.java @@ -6,23 +6,14 @@ package mc.core; import lombok.Getter; import lombok.Setter; -import mc.core.exception.ResourceUnloadedException; -import mc.core.world.World; -import mc.core.world.chunk.Chunk; -import mc.core.world.chunk.ChunkSection; - -import java.lang.ref.Reference; -import java.lang.ref.WeakReference; public class Location implements Cloneable { @Getter @Setter private double x, y, z; - private Reference refWorld; - public Location (double x, double y, double z, World world) { + public Location (double x, double y, double z) { setXYZ(x, y, z); - setWorld(world); } public void setXYZ(double x, double y, double z) { @@ -35,20 +26,6 @@ public class Location implements Cloneable { setXYZ(location.x, location.y, location.z); } - public World getWorld() { - if (refWorld == null) { - return null; - } else if (refWorld.get() == null) { - throw new ResourceUnloadedException("World unloaded"); - } else { - return refWorld.get(); - } - } - - public void setWorld (World world) { - this.refWorld = new WeakReference<>(world); - } - public int getBlockX() { return Double.valueOf(Math.floor(x)).intValue(); } @@ -61,24 +38,6 @@ public class Location implements Cloneable { return Double.valueOf(Math.floor(z)).intValue(); } - public Chunk getChunk() { - World world = getWorld(); - if (world == null) { - return null; - } else { - return world.getChunk(getBlockX() >> 4, getBlockZ() >> 4); - } - } - - public ChunkSection getChunkSection() { - Chunk chunk = getChunk(); - if (chunk == null) { - return null; - } else { - return chunk.getChunkSection(getBlockY() >> 4); - } - } - @Override public Location clone() { try { diff --git a/core/src/main/java/mc/core/world/block/BlockFactory.java b/core/src/main/java/mc/core/world/block/BlockFactory.java index caceb58..095e312 100644 --- a/core/src/main/java/mc/core/world/block/BlockFactory.java +++ b/core/src/main/java/mc/core/world/block/BlockFactory.java @@ -5,15 +5,15 @@ import mc.core.world.World; public class BlockFactory { - public Block create(BlockType blockType, int x, int y, int z, World world) { - return new EmbeddedBlock(blockType, x, y, z, world); + public Block create(BlockType blockType, int x, int y, int z) { + return new EmbeddedBlock(blockType, x, y, z); } /** For first-time generation */ private class EmbeddedBlock extends AbstractBlock { - EmbeddedBlock(BlockType type, int x, int y, int z, World world) { + EmbeddedBlock(BlockType type, int x, int y, int z) { super(type); - setLocation(new Location(x,y,z, world)); + setLocation(new Location(x, y, z)); } } } 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 3c10125..a829963 100644 --- a/core/src/main/java/mc/core/world/chunk/ChunkSection.java +++ b/core/src/main/java/mc/core/world/chunk/ChunkSection.java @@ -24,6 +24,4 @@ public interface ChunkSection { void setAddition(int x, int y, int z, int value); Biome getBiome(int localX, int localZ); - - World getWorld(); } diff --git a/core/src/test/java/mc/core/TestEntityLocation.java b/core/src/test/java/mc/core/TestEntityLocation.java index 06fbfa7..1b8e5fb 100644 --- a/core/src/test/java/mc/core/TestEntityLocation.java +++ b/core/src/test/java/mc/core/TestEntityLocation.java @@ -1,19 +1,37 @@ package mc.core; import mc.core.world.World; +import mc.core.world.chunk.Chunk; +import org.junit.Before; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertSame; +import static org.mockito.Matchers.anyInt; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; public class TestEntityLocation { + private World world; + + @Before + public void prepareWorld() { + this.world = mock(World.class); + when(world.getChunk(anyInt(), anyInt())).thenAnswer(invocation -> { + Object[] args = invocation.getArguments(); + + Chunk chunk = mock(Chunk.class); + when(chunk.getX()).thenReturn((int) args[0]); + when(chunk.getZ()).thenReturn((int) args[1]); + + return chunk; + }); + } + @Test public void cloneTest() { - World dummyWorld = mock(World.class); - - EntityLocation firstLocation = new EntityLocation(10, 20, 30, 40, 50, dummyWorld); - assertSame("Lost world reference before cloning", dummyWorld, firstLocation.getWorld()); + EntityLocation firstLocation = new EntityLocation(10, 20, 30, 40, 50, world); + assertSame("Lost world reference before cloning", world, firstLocation.getWorld()); EntityLocation locationClone = firstLocation.clone(); assertEquals("X mismatch", firstLocation.getX(), locationClone.getX(), 0); @@ -23,4 +41,56 @@ public class TestEntityLocation { assertEquals("Yaw mismatch", firstLocation.getYaw(), locationClone.getYaw(), 0); assertSame("World mismatch (accidental clone of the World object?)", firstLocation.getWorld(), locationClone.getWorld()); } + + @Test + public void testGetChunk() { + EntityLocation location; + Chunk chunk; + + location = new EntityLocation(0d, 0, 0d, 0f, 0f, world); + chunk = location.getChunk(); + assertEquals(0, chunk.getX()); + assertEquals(0, chunk.getZ()); + + location.setXYZ(1d, 0, 1d); + chunk = location.getChunk(); + assertEquals(0, chunk.getX()); + assertEquals(0, chunk.getZ()); + + location.setXYZ(15d, 0, 15d); + chunk = location.getChunk(); + assertEquals(0, chunk.getX()); + assertEquals(0, chunk.getZ()); + + location.setXYZ(16d, 0, 16d); + chunk = location.getChunk(); + assertEquals(1, chunk.getX()); + assertEquals(1, chunk.getZ()); + + location.setXYZ(-0.1d, 0, -0.1d); + chunk = location.getChunk(); + assertEquals(-1, chunk.getX()); + assertEquals(-1, chunk.getZ()); + + location.setXYZ(-1d, 0, -1d); + chunk = location.getChunk(); + assertEquals(-1, chunk.getX()); + assertEquals(-1, chunk.getZ()); + + location.setXYZ(-15d, 0, -15d); + chunk = location.getChunk(); + assertEquals(-1, chunk.getX()); + assertEquals(-1, chunk.getZ()); + + //TODO на практике, таких точных значений не встретиться, но тем не менее данный тест не проходит + //location.setXYZ(-16.0d, 0, -16.0d); + //chunk = location.getChunk(); + //assertEquals(-2, chunk.getX()); + //assertEquals(-2, chunk.getZ()); + + location.setXYZ(-16.001d, 0, -16.001d); + chunk = location.getChunk(); + assertEquals(-2, chunk.getX()); + assertEquals(-2, chunk.getZ()); + } } diff --git a/core/src/test/java/mc/core/TestLocation.java b/core/src/test/java/mc/core/TestLocation.java index 3d6715e..4faef07 100644 --- a/core/src/test/java/mc/core/TestLocation.java +++ b/core/src/test/java/mc/core/TestLocation.java @@ -1,35 +1,15 @@ package mc.core; -import mc.core.world.World; -import mc.core.world.chunk.Chunk; -import org.junit.Before; import org.junit.Test; import static org.junit.Assert.assertEquals; -import static org.mockito.Mockito.*; public class TestLocation { - private World world; - - @Before - public void prepareWorld() { - this.world = mock(World.class); - when(world.getChunk(anyInt(), anyInt())).thenAnswer(invocation -> { - Object[] args = invocation.getArguments(); - - Chunk chunk = mock(Chunk.class); - when(chunk.getX()).thenReturn((int) args[0]); - when(chunk.getZ()).thenReturn((int) args[1]); - - return chunk; - }); - } - @Test public void testGetBlockXZ() { Location location; - location = new Location(0d, 0, 0d, world); + location = new Location(0d, 0, 0d); assertEquals(0, location.getBlockX()); assertEquals(0, location.getBlockZ()); @@ -69,56 +49,4 @@ public class TestLocation { assertEquals(-2, location.getBlockX()); assertEquals(-2, location.getBlockZ()); } - - @Test - public void testGetChunk() { - Location location; - Chunk chunk; - - location = new Location(0d, 0, 0d, world); - chunk = location.getChunk(); - assertEquals(0, chunk.getX()); - assertEquals(0, chunk.getZ()); - - location.setXYZ(1d, 0, 1d); - chunk = location.getChunk(); - assertEquals(0, chunk.getX()); - assertEquals(0, chunk.getZ()); - - location.setXYZ(15d, 0, 15d); - chunk = location.getChunk(); - assertEquals(0, chunk.getX()); - assertEquals(0, chunk.getZ()); - - location.setXYZ(16d, 0, 16d); - chunk = location.getChunk(); - assertEquals(1, chunk.getX()); - assertEquals(1, chunk.getZ()); - - location.setXYZ(-0.1d, 0, -0.1d); - chunk = location.getChunk(); - assertEquals(-1, chunk.getX()); - assertEquals(-1, chunk.getZ()); - - location.setXYZ(-1d, 0, -1d); - chunk = location.getChunk(); - assertEquals(-1, chunk.getX()); - assertEquals(-1, chunk.getZ()); - - location.setXYZ(-15d, 0, -15d); - chunk = location.getChunk(); - assertEquals(-1, chunk.getX()); - assertEquals(-1, chunk.getZ()); - - //TODO на практике, таких точных значений не встретиться, но тем не менее данный тест не проходит - //location.setXYZ(-16.0d, 0, -16.0d); - //chunk = location.getChunk(); - //assertEquals(-2, chunk.getX()); - //assertEquals(-2, chunk.getZ()); - - location.setXYZ(-16.001d, 0, -16.001d); - chunk = location.getChunk(); - assertEquals(-2, chunk.getX()); - assertEquals(-2, chunk.getZ()); - } } diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java index 742370e..1a1ac1d 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerBlockPlacementPacket.java @@ -21,7 +21,7 @@ public class PlayerBlockPlacementPacket implements CSPacket { public void readSelf(NetInputStream netStream) { long compactedCoords = netStream.readLong(); double[] xyz = CompactedCoords.uncompressXYZ(compactedCoords); - location = new Location(xyz[0], xyz[1], xyz[2], null); + location = new Location(xyz[0], xyz[1], xyz[2]); face = Direction.getById(netStream.readVarInt()); hand = (netStream.readVarInt() == 1); cursorX = netStream.readFloat(); diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java index e60d409..a2bde1e 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerDiggingPacket.java @@ -50,7 +50,7 @@ public class PlayerDiggingPacket implements CSPacket { status = Status.getById(netStream.readVarInt()); long compactCoord = netStream.readLong(); double[] xyz = CompactedCoords.uncompressXYZ(compactCoord); - location = new Location(xyz[0], xyz[1], xyz[2], null); + location = new Location(xyz[0], xyz[1], xyz[2]); face = Direction.getById(netStream.readByte()); } } diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TabCompletePacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TabCompletePacket.java index ffbfe50..09f686d 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TabCompletePacket.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TabCompletePacket.java @@ -27,7 +27,7 @@ public class TabCompletePacket implements CSPacket { double y = (compactValue >> 26) & 0xFFF; double z = compactValue << 38 >> 38; // is normal? - this.location = new Location(x, y, z, null); + this.location = new Location(x, y, z); } } } diff --git a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestChunkdataPacket.java b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestChunkdataPacket.java index ba9147a..449a672 100644 --- a/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestChunkdataPacket.java +++ b/proto_1.12.2/src/test/java/mc/core/network/proto_1_12_2/packets/TestChunkdataPacket.java @@ -50,10 +50,10 @@ public class TestChunkdataPacket { BlockFactory blockFactory = new BlockFactory(); - if (y == 0) return blockFactory.create(BlockType.BEDROCK, x, y, z, null); - else if (y >= 1 && y <= 2) return blockFactory.create(BlockType.DIRT, x, y, z, null); - else if (y == 3) return blockFactory.create(BlockType.GRASS, x, y, z, null); - else return blockFactory.create(BlockType.AIR, x, y, z, null); + if (y == 0) return blockFactory.create(BlockType.BEDROCK, x, y, z); + else if (y >= 1 && y <= 2) return blockFactory.create(BlockType.DIRT, x, y, z); + else if (y == 3) return blockFactory.create(BlockType.GRASS, x, y, z); + else return blockFactory.create(BlockType.AIR, x, y, z); }); world = mock(World.class); 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 3fdf5ae..a0c8cc6 100644 --- a/simple_world/src/main/java/mc/world/simple/SimpleChunkSection.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleChunkSection.java @@ -4,26 +4,20 @@ */ package mc.world.simple; -import mc.core.exception.ResourceUnloadedException; import mc.core.world.Biome; -import mc.core.world.World; import mc.core.world.block.Block; import mc.core.world.block.BlockFactory; import mc.core.world.block.BlockType; import mc.core.world.chunk.ChunkSection; -import java.lang.ref.Reference; -import java.lang.ref.WeakReference; import java.util.List; public class SimpleChunkSection implements ChunkSection { private final BlockFactory blockFactory = new BlockFactory(); private final List layersBlock; - private Reference refWorld; - public SimpleChunkSection(List layersBlock, World world) { + public SimpleChunkSection(List layersBlock) { this.layersBlock = layersBlock; - this.refWorld = new WeakReference<>(world); } @Override @@ -72,22 +66,12 @@ public class SimpleChunkSection implements ChunkSection { @Override public Block getBlock(int x, int y, int z) { if (y >= layersBlock.size()) { - return blockFactory.create(BlockType.AIR, x, y, z, getWorld()); + return blockFactory.create(BlockType.AIR, x, y, z); } BlockType blockType = layersBlock.get(y); - if (blockType == null) return blockFactory.create(BlockType.AIR, x, y, z, getWorld()); + if (blockType == null) return blockFactory.create(BlockType.AIR, x, y, z); - return blockFactory.create(blockType, x, y, z, getWorld()); - } - - @Override - public World getWorld() { - World world = refWorld.get(); - if (world == null) { - throw new ResourceUnloadedException("World unloaded"); - } - - return world; + return blockFactory.create(blockType, x, y, z); } } diff --git a/simple_world/src/main/java/mc/world/simple/SimpleWorld.java b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java index c1b1b19..76d3217 100644 --- a/simple_world/src/main/java/mc/world/simple/SimpleWorld.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java @@ -68,6 +68,6 @@ public class SimpleWorld implements World { } } - this.chunkSection = new SimpleChunkSection(layoutsBlock, this); + this.chunkSection = new SimpleChunkSection(layoutsBlock); } } From 24376c391e00e17c2fa27a5bda7de8ff1975d0fe Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 26 Aug 2018 01:20:09 +0300 Subject: [PATCH 12/17] =?UTF-8?q?=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=B0=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20FlatChunkProvider?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mc/world/simple/FlatChunkProvider.java | 51 +++++++++++++++++++ .../java/mc/world/simple/SimpleWorld.java | 35 +++++-------- 2 files changed, 64 insertions(+), 22 deletions(-) create mode 100644 simple_world/src/main/java/mc/world/simple/FlatChunkProvider.java diff --git a/simple_world/src/main/java/mc/world/simple/FlatChunkProvider.java b/simple_world/src/main/java/mc/world/simple/FlatChunkProvider.java new file mode 100644 index 0000000..af13eb8 --- /dev/null +++ b/simple_world/src/main/java/mc/world/simple/FlatChunkProvider.java @@ -0,0 +1,51 @@ +package mc.world.simple; + +import mc.core.world.block.BlockType; +import mc.core.world.chunk.Chunk; +import mc.core.world.chunk.ChunkProvider; +import mc.core.world.chunk.ChunkSection; + +import java.util.ArrayList; +import java.util.List; + +public class FlatChunkProvider implements ChunkProvider { + private ChunkSection chunkSection; + + public void setLayersBlock(List listOfLayers) { + List layoutsBlock = new ArrayList<>(); + + for (String value : listOfLayers) { + String[] splitValue = value.split(";"); + + BlockType blockType; + try { + blockType = BlockType.valueOf(splitValue[1]); + } catch (IllegalArgumentException e) { + continue; + } + + for (int i = 0; i < Integer.parseInt(splitValue[0]); i++) { + layoutsBlock.add(blockType); + } + } + + this.chunkSection = new SimpleChunkSection(layoutsBlock); + } + + @Override + public Chunk getChunk(int x, int z) { + Chunk chunk = new SimpleChunk(x, z); + chunk.setChunkSection(0, chunkSection); + return chunk; + } + + @Override + public void saveChunk(Chunk chunk) { + //TODO ignore + } + + @Override + public void saveChunk(Chunk... chunks) { + //TODO ignore + } +} diff --git a/simple_world/src/main/java/mc/world/simple/SimpleWorld.java b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java index 76d3217..4346820 100644 --- a/simple_world/src/main/java/mc/world/simple/SimpleWorld.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java @@ -5,12 +5,14 @@ package mc.world.simple; import lombok.Getter; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; import mc.core.EntityLocation; import mc.core.world.World; import mc.core.world.WorldType; import mc.core.world.block.BlockType; import mc.core.world.chunk.Chunk; +import mc.core.world.chunk.ChunkProvider; import mc.core.world.chunk.ChunkSection; import java.util.ArrayList; @@ -21,13 +23,14 @@ public class SimpleWorld implements World { @Getter private final WorldType worldType = WorldType.FLAT; private EntityLocation spawn; - private ChunkSection chunkSection; + @Setter + private ChunkProvider chunkProvider; @Override public EntityLocation getSpawn() { if (this.spawn == null) { log.warn("Spawn is not defined! Set spawn [0, 6, 0]"); - this.spawn = new EntityLocation(0d, 6d, 0d, 0f, 0f, this); + setSpawn(0d, 6d, 0d); } return this.spawn; @@ -40,9 +43,7 @@ public class SimpleWorld implements World { @Override public Chunk getChunk(int x, int z) { - Chunk chunk = new SimpleChunk(x, z); - chunk.setChunkSection(0, chunkSection); - return chunk; + return chunkProvider.getChunk(x, z); } @Override @@ -50,24 +51,14 @@ public class SimpleWorld implements World { throw new UnsupportedOperationException(); } + @Deprecated public void setLayersBlock(List listOfLayers) { - List layoutsBlock = new ArrayList<>(); - - for (String value : listOfLayers) { - String[] splitValue = value.split(";"); - - BlockType blockType; - try { - blockType = BlockType.valueOf(splitValue[1]); - } catch (IllegalArgumentException e) { - continue; - } - - for (int i = 0; i < Integer.parseInt(splitValue[0]); i++) { - layoutsBlock.add(blockType); - } + if (chunkProvider == null) { + FlatChunkProvider chunkProvider = new FlatChunkProvider(); + chunkProvider.setLayersBlock(listOfLayers); + this.chunkProvider = chunkProvider; + } else if (this.chunkProvider instanceof FlatChunkProvider) { + ((FlatChunkProvider)chunkProvider).setLayersBlock(listOfLayers); } - - this.chunkSection = new SimpleChunkSection(layoutsBlock); } } From 72017a86bb683901b6fae67527adf8a1f5b33eaa Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Mon, 8 Oct 2018 13:40:55 +0300 Subject: [PATCH 13/17] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20=D1=83=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BA=D0=B8=20=D1=81=D0=BF=D0=B0?= =?UTF-8?q?=D0=B2=D0=BD=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/mc/core/world/World.java | 5 ++++- simple_world/src/main/java/mc/world/simple/SimpleWorld.java | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/mc/core/world/World.java b/core/src/main/java/mc/core/world/World.java index 0c29708..37d35e0 100644 --- a/core/src/main/java/mc/core/world/World.java +++ b/core/src/main/java/mc/core/world/World.java @@ -13,7 +13,10 @@ public interface World { WorldType getWorldType(); EntityLocation getSpawn(); - void setSpawn(double x, double y, double z, float yaw, float pitch); + void setSpawn(EntityLocation location); + default void setSpawn(double x, double y, double z, float yaw, float pitch) { + setSpawn(new EntityLocation(x, y, z, yaw, pitch)); + } default void setSpawn(double x, double y, double z) { setSpawn(x, y, z, 0f, 0f); } diff --git a/simple_world/src/main/java/mc/world/simple/SimpleWorld.java b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java index ef2981d..10001e2 100644 --- a/simple_world/src/main/java/mc/world/simple/SimpleWorld.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java @@ -39,8 +39,8 @@ public class SimpleWorld implements World { } @Override - public void setSpawn(double x, double y, double z, float yaw, float pitch) { - this.spawn = new EntityLocation(x, y, z, yaw, pitch); + public void setSpawn(EntityLocation location) { + this.spawn = location; } @Override From bddda59b78e93270291a9c3e4bacc02d81eda361 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Mon, 8 Oct 2018 14:04:14 +0300 Subject: [PATCH 14/17] optimize import --- simple_world/src/main/java/mc/world/simple/SimpleWorld.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/simple_world/src/main/java/mc/world/simple/SimpleWorld.java b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java index 10001e2..b91581c 100644 --- a/simple_world/src/main/java/mc/world/simple/SimpleWorld.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java @@ -10,12 +10,9 @@ import lombok.extern.slf4j.Slf4j; import mc.core.EntityLocation; import mc.core.world.World; import mc.core.world.WorldType; -import mc.core.world.block.BlockType; import mc.core.world.chunk.Chunk; import mc.core.world.chunk.ChunkProvider; -import mc.core.world.chunk.ChunkSection; -import java.util.ArrayList; import java.util.List; @Slf4j From 686d44490645e54641c76d4c12edbc009aff09c8 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Mon, 8 Oct 2018 14:07:19 +0300 Subject: [PATCH 15/17] optimize imports --- core/src/main/java/mc/core/world/chunk/ChunkSection.java | 1 - 1 file changed, 1 deletion(-) 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 a829963..ae65a8b 100644 --- a/core/src/main/java/mc/core/world/chunk/ChunkSection.java +++ b/core/src/main/java/mc/core/world/chunk/ChunkSection.java @@ -5,7 +5,6 @@ package mc.core.world.chunk; import mc.core.world.Biome; -import mc.core.world.World; import mc.core.world.block.Block; /* 16x16x16 */ From 1ffbead1f6699a05f5c16df9d0606a1223762121 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Mon, 8 Oct 2018 14:38:01 +0300 Subject: [PATCH 16/17] =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20World=20=D0=BF=D0=BE=20=D0=B5=D0=B3=D0=BE?= =?UTF-8?q?=20=D0=B8=D0=BC=D0=B5=D0=BD=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Суть в том, что ID бина - это и есть World.name --- .../java/mc/core/h2db/H2PlayerManager.java | 23 +++---------------- .../mc/core/h2db/entity/H2PlayerEntity.java | 16 ++++++------- .../h2db/service/H2PlayerServiceImpl.java | 9 +++++--- .../java/mc/core/h2db/TestSpringConfig.java | 4 ++-- .../h2db/service/H2PlayerServiceTest.java | 19 +++++++++++---- .../java/mc/world/simple/SimpleWorld.java | 15 +++++++----- 6 files changed, 42 insertions(+), 44 deletions(-) diff --git a/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java b/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java index 9741d30..7db2b42 100644 --- a/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java +++ b/h2_playermanager/src/main/java/mc/core/h2db/H2PlayerManager.java @@ -12,6 +12,7 @@ import mc.core.player.PlayerManager; import mc.core.player.PlayerSettings; import mc.core.world.World; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; import java.util.ArrayList; @@ -26,8 +27,6 @@ public class H2PlayerManager implements PlayerManager { @Autowired private H2PlayerService h2PlayerService; private List playerList = Collections.synchronizedList(new ArrayList<>()); - @Autowired - private World world; //FIXME @Override public Player createPlayer(String name, EntityLocation location, World world) { @@ -91,25 +90,9 @@ public class H2PlayerManager implements PlayerManager { @Override public Player getOfflinePlayer(String name) { - //TODO похоже в попытке где-то оптимизировать/сэконопить я сам себя ******[обманул] - //необходимо этот участок кода переписать - //потому как похоже на экономию на спичках - H2Player h2Player = playerList.stream() + return playerList.stream() .filter(player -> player.getName().equals(name)) .filter(player -> !player.isOnline()) - .findFirst().orElse(null); - - if (h2Player == null) { - h2Player = h2PlayerService.getByName(name); - if (h2Player != null) { - h2Player.setWorld(world); - return h2Player; - } else { - return null; - } - } else { - h2Player.setWorld(world); - return h2Player; - } + .findFirst().orElseGet(() -> h2PlayerService.getByName(name)); } } diff --git a/h2_playermanager/src/main/java/mc/core/h2db/entity/H2PlayerEntity.java b/h2_playermanager/src/main/java/mc/core/h2db/entity/H2PlayerEntity.java index 1edc5f4..86e9cda 100644 --- a/h2_playermanager/src/main/java/mc/core/h2db/entity/H2PlayerEntity.java +++ b/h2_playermanager/src/main/java/mc/core/h2db/entity/H2PlayerEntity.java @@ -4,7 +4,9 @@ import lombok.Data; import lombok.NoArgsConstructor; import mc.core.EntityLocation; import mc.core.h2db.H2Player; +import mc.core.world.World; import org.hibernate.annotations.GenericGenerator; +import org.springframework.context.ApplicationContext; import javax.persistence.*; import java.util.UUID; @@ -55,11 +57,7 @@ public class H2PlayerEntity { this.locationZ = player.getLocation().getZ(); this.locationYaw = player.getLocation().getYaw(); this.locationPitch = player.getLocation().getPitch(); - if (player.getWorld() != null) { //FIXME - this.locationWorld = player.getWorld().getName(); - } else { - this.locationWorld = "null_world"; - } + this.locationWorld = player.getWorld().getName(); } public void setUuid(String uuid) { @@ -78,12 +76,12 @@ public class H2PlayerEntity { } } - public H2Player toPlayer() { + public H2Player toPlayer(ApplicationContext context) { H2Player player = new H2Player(); - return toPlayer(player); + return toPlayer(player, context); } - public H2Player toPlayer(H2Player player) { + public H2Player toPlayer(H2Player player, ApplicationContext context) { player.setId(this.id.intValue()); player.setUuid(UUID.fromString(this.uuid)); player.setName(this.name); @@ -97,7 +95,7 @@ public class H2PlayerEntity { player.getLocation().setYawPitch(this.locationYaw, this.locationPitch); } - player.setWorld(null); //FIXME + player.setWorld(context.getBean(this.locationWorld, World.class)); return player; } diff --git a/h2_playermanager/src/main/java/mc/core/h2db/service/H2PlayerServiceImpl.java b/h2_playermanager/src/main/java/mc/core/h2db/service/H2PlayerServiceImpl.java index d716444..b920fbf 100644 --- a/h2_playermanager/src/main/java/mc/core/h2db/service/H2PlayerServiceImpl.java +++ b/h2_playermanager/src/main/java/mc/core/h2db/service/H2PlayerServiceImpl.java @@ -4,12 +4,15 @@ import mc.core.h2db.H2Player; import mc.core.h2db.entity.H2PlayerEntity; import mc.core.h2db.repository.H2PlayerEntityRepository; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Service; import java.util.Optional; @Service public class H2PlayerServiceImpl implements H2PlayerService { + @Autowired + private ApplicationContext context; @Autowired private H2PlayerEntityRepository h2PlayerEntityRepository; @@ -19,7 +22,7 @@ public class H2PlayerServiceImpl implements H2PlayerService { //TODO возможно имеет смысл здесь оптимизация //вместо toPlayer() сделать toPlayer(H2Player) который в существующий //будет дописывать/обновлять данные - return h2PlayerEntityRepository.saveAndFlush(entity).toPlayer(player); + return h2PlayerEntityRepository.saveAndFlush(entity).toPlayer(player, context); } @Override @@ -30,12 +33,12 @@ public class H2PlayerServiceImpl implements H2PlayerService { @Override public H2Player getByName(String name) { Optional optEntity = h2PlayerEntityRepository.findByName(name); - return optEntity.map(H2PlayerEntity::toPlayer).orElse(null); + return optEntity.map(entiry -> entiry.toPlayer(context)).orElse(null); } @Override public H2Player getById(int id) { Optional optEntity = h2PlayerEntityRepository.findById((long) id); - return optEntity.map(H2PlayerEntity::toPlayer).orElse(null); + return optEntity.map(entiry -> entiry.toPlayer(context)).orElse(null); } } diff --git a/h2_playermanager/src/test/java/mc/core/h2db/TestSpringConfig.java b/h2_playermanager/src/test/java/mc/core/h2db/TestSpringConfig.java index 5ff647b..8dd5f80 100644 --- a/h2_playermanager/src/test/java/mc/core/h2db/TestSpringConfig.java +++ b/h2_playermanager/src/test/java/mc/core/h2db/TestSpringConfig.java @@ -44,10 +44,10 @@ public class TestSpringConfig { return properties; } - @Bean + @Bean("mockWorld") public World mockWorld() { World mockWorld = mock(World.class); - when(mockWorld.getName()).thenReturn("mock_world"); + when(mockWorld.getName()).thenReturn("mockWorld"); return mockWorld; } diff --git a/h2_playermanager/src/test/java/mc/core/h2db/service/H2PlayerServiceTest.java b/h2_playermanager/src/test/java/mc/core/h2db/service/H2PlayerServiceTest.java index 6440b3e..464e0e4 100644 --- a/h2_playermanager/src/test/java/mc/core/h2db/service/H2PlayerServiceTest.java +++ b/h2_playermanager/src/test/java/mc/core/h2db/service/H2PlayerServiceTest.java @@ -3,6 +3,7 @@ package mc.core.h2db.service; import mc.core.EntityLocation; import mc.core.h2db.H2Player; import mc.core.h2db.TestSpringConfig; +import mc.core.world.World; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -21,6 +22,8 @@ import static org.junit.jupiter.api.Assertions.*; class H2PlayerServiceTest { @Autowired private H2PlayerService h2PlayerService; + @Autowired + private World world; private H2Player buildPlayer() { final ThreadLocalRandom rnd = ThreadLocalRandom.current(); @@ -38,18 +41,26 @@ class H2PlayerServiceTest { rnd.nextFloat() * (maxF - minF) + minF, rnd.nextFloat() * (maxF - minF) + minF )); - player.setWorld(null); //FIXME + player.setWorld(world); return player; } + private void assertPlayers(H2Player expected, H2Player actual) { + assertEquals(expected, actual); + assertEquals(expected.getName(), actual.getName()); + assertEquals(expected.getLocation(), actual.getLocation()); + assertNotNull(actual.getWorld()); + assertEquals(expected.getWorld(), actual.getWorld()); + } + @Test void save() { H2Player player = buildPlayer(); H2Player savedPlayer = h2PlayerService.save(player); player.setId(savedPlayer.getId()); //FIXME костыль, однако - assertEquals(player, savedPlayer); + assertPlayers(player, savedPlayer); } @Test @@ -111,7 +122,7 @@ class H2PlayerServiceTest { H2Player player = h2PlayerService.save(buildPlayer()); H2Player player2 = h2PlayerService.getByName(player.getName()); - assertEquals(player, player2); + assertPlayers(player, player2); } @Test @@ -134,7 +145,7 @@ class H2PlayerServiceTest { H2Player player = h2PlayerService.save(buildPlayer()); H2Player player2 = h2PlayerService.getById(player.getId()); - assertEquals(player, player2); + assertPlayers(player, player2); } @Test diff --git a/simple_world/src/main/java/mc/world/simple/SimpleWorld.java b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java index b91581c..112f8b2 100644 --- a/simple_world/src/main/java/mc/world/simple/SimpleWorld.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java @@ -1,7 +1,3 @@ -/* - * DmitriyMX - * 2018-04-28 - */ package mc.world.simple; import lombok.Getter; @@ -12,13 +8,15 @@ import mc.core.world.World; import mc.core.world.WorldType; import mc.core.world.chunk.Chunk; import mc.core.world.chunk.ChunkProvider; +import org.springframework.beans.factory.BeanNameAware; +import javax.annotation.Nonnull; import java.util.List; @Slf4j -public class SimpleWorld implements World { +public class SimpleWorld implements World, BeanNameAware { @Getter - private final String name = "flat"; + private String name; @Getter private final WorldType worldType = WorldType.FLAT; private EntityLocation spawn; @@ -60,4 +58,9 @@ public class SimpleWorld implements World { ((FlatChunkProvider)chunkProvider).setLayersBlock(listOfLayers); } } + + @Override + public void setBeanName(@Nonnull String name) { + this.name = name; + } } From e1c3919c733100a02919f795ab934ea0bb56ecc4 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Tue, 9 Oct 2018 01:12:12 +0300 Subject: [PATCH 17/17] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20SimpleWorld?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/java/mc/core/EntityLocationTest.java | 4 +- .../mc/world/simple/FlatChunkProvider.java | 10 +++-- .../mc/world/simple/SimpleChunkSection.java | 11 +++-- .../java/mc/world/simple/SimpleWorld.java | 14 +----- .../world/simple/SimpleChunkSectionTest.java | 44 +++++++++++++++++++ .../java/mc/world/simple/SimpleWorldTest.java | 37 ++++++++++++++++ .../mc/world/simple/TestSpringConfig.java | 38 ++++++++++++++++ 7 files changed, 137 insertions(+), 21 deletions(-) create mode 100644 simple_world/src/test/java/mc/world/simple/SimpleChunkSectionTest.java create mode 100644 simple_world/src/test/java/mc/world/simple/SimpleWorldTest.java create mode 100644 simple_world/src/test/java/mc/world/simple/TestSpringConfig.java diff --git a/core/src/test/java/mc/core/EntityLocationTest.java b/core/src/test/java/mc/core/EntityLocationTest.java index 052e8a6..0e31fdc 100644 --- a/core/src/test/java/mc/core/EntityLocationTest.java +++ b/core/src/test/java/mc/core/EntityLocationTest.java @@ -5,8 +5,7 @@ import org.junit.jupiter.api.Test; import java.util.concurrent.ThreadLocalRandom; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.*; class EntityLocationTest { private static final ThreadLocalRandom rnd = ThreadLocalRandom.current(); @@ -42,6 +41,7 @@ class EntityLocationTest { EntityLocation locOrig = new EntityLocation(x, y, z, yaw, pitch); EntityLocation locClone = locOrig.clone(); assertEquals(locOrig, locClone); + assertNotSame(locOrig, locClone); } @Test diff --git a/simple_world/src/main/java/mc/world/simple/FlatChunkProvider.java b/simple_world/src/main/java/mc/world/simple/FlatChunkProvider.java index af13eb8..45a3cd0 100644 --- a/simple_world/src/main/java/mc/world/simple/FlatChunkProvider.java +++ b/simple_world/src/main/java/mc/world/simple/FlatChunkProvider.java @@ -11,7 +11,7 @@ import java.util.List; public class FlatChunkProvider implements ChunkProvider { private ChunkSection chunkSection; - public void setLayersBlock(List listOfLayers) { + public void setLayersBlockAsString(List listOfLayers) { List layoutsBlock = new ArrayList<>(); for (String value : listOfLayers) { @@ -29,6 +29,10 @@ public class FlatChunkProvider implements ChunkProvider { } } + setLayersBlock(layoutsBlock); + } + + public void setLayersBlock(List layoutsBlock) { this.chunkSection = new SimpleChunkSection(layoutsBlock); } @@ -41,11 +45,11 @@ public class FlatChunkProvider implements ChunkProvider { @Override public void saveChunk(Chunk chunk) { - //TODO ignore + //FIXME nope... } @Override public void saveChunk(Chunk... chunks) { - //TODO ignore + //FIXME nope... } } 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 a0c8cc6..4674ac7 100644 --- a/simple_world/src/main/java/mc/world/simple/SimpleChunkSection.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleChunkSection.java @@ -1,7 +1,3 @@ -/* - * DmitriyMX - * 2018-04-28 - */ package mc.world.simple; import mc.core.world.Biome; @@ -65,6 +61,13 @@ public class SimpleChunkSection implements ChunkSection { @Override public Block getBlock(int x, int y, int z) { + if (x < 0) x = 0; + else if (x > 15) x = 15; + if (y < 0) y = 0; + else if (y > 15) y = 15; + if (z < 0) z = 0; + else if (z > 15) z = 15; + if (y >= layersBlock.size()) { return blockFactory.create(BlockType.AIR, x, y, z); } diff --git a/simple_world/src/main/java/mc/world/simple/SimpleWorld.java b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java index 112f8b2..b4ac9e4 100644 --- a/simple_world/src/main/java/mc/world/simple/SimpleWorld.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java @@ -9,11 +9,12 @@ import mc.core.world.WorldType; import mc.core.world.chunk.Chunk; import mc.core.world.chunk.ChunkProvider; import org.springframework.beans.factory.BeanNameAware; +import org.springframework.stereotype.Component; import javax.annotation.Nonnull; -import java.util.List; @Slf4j +@Component public class SimpleWorld implements World, BeanNameAware { @Getter private String name; @@ -48,17 +49,6 @@ public class SimpleWorld implements World, BeanNameAware { throw new UnsupportedOperationException(); } - @Deprecated - public void setLayersBlock(List listOfLayers) { - if (chunkProvider == null) { - FlatChunkProvider chunkProvider = new FlatChunkProvider(); - chunkProvider.setLayersBlock(listOfLayers); - this.chunkProvider = chunkProvider; - } else if (this.chunkProvider instanceof FlatChunkProvider) { - ((FlatChunkProvider)chunkProvider).setLayersBlock(listOfLayers); - } - } - @Override public void setBeanName(@Nonnull String name) { this.name = name; diff --git a/simple_world/src/test/java/mc/world/simple/SimpleChunkSectionTest.java b/simple_world/src/test/java/mc/world/simple/SimpleChunkSectionTest.java new file mode 100644 index 0000000..4804190 --- /dev/null +++ b/simple_world/src/test/java/mc/world/simple/SimpleChunkSectionTest.java @@ -0,0 +1,44 @@ +package mc.world.simple; + +import com.google.common.collect.Lists; +import mc.core.world.block.Block; +import mc.core.world.block.BlockType; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class SimpleChunkSectionTest { + private SimpleChunkSection chunkSection; + private List layersBlock; + + @BeforeEach + void before() { + layersBlock = Lists.newArrayList( + BlockType.BEDROCK, + BlockType.DIRT, + BlockType.DIRT, + BlockType.GRASS + ); + + chunkSection = new SimpleChunkSection(layersBlock); + } + + @Test + void getBlock() { + for (int y = 15; y >= 0; y--) { + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + Block block = chunkSection.getBlock(x, y, z); + if (y > layersBlock.size()-1) { + assertEquals(block.getBlockType(), BlockType.AIR); + } else { + assertEquals(block.getBlockType(), layersBlock.get(y)); + } + } + } + } + } +} \ No newline at end of file diff --git a/simple_world/src/test/java/mc/world/simple/SimpleWorldTest.java b/simple_world/src/test/java/mc/world/simple/SimpleWorldTest.java new file mode 100644 index 0000000..110a830 --- /dev/null +++ b/simple_world/src/test/java/mc/world/simple/SimpleWorldTest.java @@ -0,0 +1,37 @@ +package mc.world.simple; + +import mc.core.EntityLocation; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import static org.junit.jupiter.api.Assertions.*; + +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = {TestSpringConfig.class}) +@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) +class SimpleWorldTest { + @Autowired + private SimpleWorld world; + + @Test + void spawn() { + final EntityLocation location = new EntityLocation(1d, 2d, 3d,4f, 5f); + + world.setSpawn(location); + assertEquals(location, world.getSpawn()); + assertSame(location, world.getSpawn()); + + world.setSpawn(1d, 2d, 3d, 4f, 5f); + assertEquals(location, world.getSpawn()); + assertNotSame(location, world.getSpawn()); + + location.setYawPitch(0, 0); + world.setSpawn(1d, 2d, 3d); + assertEquals(location, world.getSpawn()); + assertNotSame(location, world.getSpawn()); + } +} \ No newline at end of file diff --git a/simple_world/src/test/java/mc/world/simple/TestSpringConfig.java b/simple_world/src/test/java/mc/world/simple/TestSpringConfig.java new file mode 100644 index 0000000..865fdd9 --- /dev/null +++ b/simple_world/src/test/java/mc/world/simple/TestSpringConfig.java @@ -0,0 +1,38 @@ +package mc.world.simple; + +import com.google.common.collect.Lists; +import mc.core.world.block.BlockType; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +import java.util.List; + +@Configuration +@ComponentScan("mc.world.simple") +public class TestSpringConfig { + @Bean + public List layersBlock() { + return Lists.newArrayList( + BlockType.BEDROCK, + BlockType.DIRT, + BlockType.DIRT, + BlockType.GRASS + ); + } + + @Bean + public SimpleChunkSection chunkSection(List layersBlock) { + return new SimpleChunkSection(layersBlock); + } + + @Bean + public SimpleWorld simpleWorld(List layersBlock) { + FlatChunkProvider chunkProvider = new FlatChunkProvider(); + chunkProvider.setLayersBlock(layersBlock); + + SimpleWorld world = new SimpleWorld(); + world.setChunkProvider(chunkProvider); + return world; + } +}