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/core/src/main/java/mc/core/world/World.java b/core/src/main/java/mc/core/world/World.java index aa69161..37d35e0 100644 --- a/core/src/main/java/mc/core/world/World.java +++ b/core/src/main/java/mc/core/world/World.java @@ -14,6 +14,12 @@ public interface World { EntityLocation getSpawn(); 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); + } Chunk getChunk(int x, int z); void setChunk(int x, int z, Chunk chunkSection); 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/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); +} 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..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 */ @@ -24,6 +23,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/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/flat_world/README.MD b/flat_world/README.MD deleted file mode 100644 index f48fe3b..0000000 --- a/flat_world/README.MD +++ /dev/null @@ -1,19 +0,0 @@ -# Flat world - -Плоский мир - -## Spring bean - -```xml - - - - - - - - - -``` - -`spawn` - точка спавна 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/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 ae0ab8d..38db3cc 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 @@ -100,6 +100,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--) { @@ -107,6 +108,7 @@ public class ChunkDataPacket implements SCPacket { ChunkSection chunkSection = chunk.getChunkSection(h); if (chunkSection != null && chunkSection.getY() == h) { bitMask |= 0x01; + maxH++; } else { bitMask |= 0x00; } @@ -121,6 +123,7 @@ public class ChunkDataPacket implements SCPacket { ChunkSection chunkSection = sectionList.get(i); if (chunkSection != null && chunkSection.getY() == h) { bitMask |= 0x01; + maxH++; } else { bitMask |= 0x00; } @@ -136,7 +139,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) { diff --git a/settings.gradle b/settings.gradle index f9dbb2c..f49bc91 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('h2_playermanager') include('vanilla_commands') include('proto_1.12.2') // Protocol 1.12.2 diff --git a/simple_world/README.MD b/simple_world/README.MD new file mode 100644 index 0000000..02871ed --- /dev/null +++ b/simple_world/README.MD @@ -0,0 +1,39 @@ +# Simple world + +Простая реализация мира + +## Spring bean + +```xml + + + + + + + + + + + + + + + + 1;BEDROCK + 2;DIRT + 1;GRASS + + + +``` + +`spawn` - точка спавна. + +При указании точки спавна, указывать шестой параметр `World` не имеет смысла, +т.к. `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/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..45a3cd0 --- /dev/null +++ b/simple_world/src/main/java/mc/world/simple/FlatChunkProvider.java @@ -0,0 +1,55 @@ +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 setLayersBlockAsString(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); + } + } + + setLayersBlock(layoutsBlock); + } + + public void setLayersBlock(List layoutsBlock) { + 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) { + //FIXME nope... + } + + @Override + public void saveChunk(Chunk... chunks) { + //FIXME nope... + } +} 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 54% 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 21cafb7..aadf810 100644 --- a/flat_world/src/main/java/mc/world/flat/SimpleChunk.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleChunk.java @@ -1,29 +1,20 @@ -package mc.world.flat; +package mc.world.simple; import lombok.Getter; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; 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; @@ -43,19 +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) { - log.error("World unloaded?"); - return null; - } else { - return refWorld.get(); - } - } - - @Override - public void setWorld(World world) { - this.refWorld = new WeakReference<>(world); - } } 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 58% 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 4c5b8a8..4674ac7 100644 --- a/flat_world/src/main/java/mc/world/flat/SimpleChunkSection.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleChunkSection.java @@ -1,17 +1,21 @@ -/* - * DmitriyMX - * 2018-04-28 - */ -package mc.world.flat; +package mc.world.simple; 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.util.List; + public class SimpleChunkSection implements ChunkSection { + private final BlockFactory blockFactory = new BlockFactory(); + private final List layersBlock; + + public SimpleChunkSection(List layersBlock) { + this.layersBlock = layersBlock; + } + @Override public int getSkyLight(int x, int y, int z) { if (y <= 3) return 0; @@ -57,16 +61,20 @@ public class SimpleChunkSection implements ChunkSection { @Override public Block getBlock(int x, int y, int z) { - BlockFactory blockFactory = new BlockFactory(); + 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 == 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); - } + if (y >= layersBlock.size()) { + return blockFactory.create(BlockType.AIR, x, y, z); + } - @Override - public World getWorld() { - return null; + BlockType blockType = layersBlock.get(y); + if (blockType == null) return blockFactory.create(BlockType.AIR, x, y, z); + + return blockFactory.create(blockType, x, y, z); } } 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 53% 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 7739827..b4ac9e4 100644 --- a/flat_world/src/main/java/mc/world/flat/FlatWorld.java +++ b/simple_world/src/main/java/mc/world/simple/SimpleWorld.java @@ -1,8 +1,4 @@ -/* - * DmitriyMX - * 2018-04-28 - */ -package mc.world.flat; +package mc.world.simple; import lombok.Getter; import lombok.Setter; @@ -11,37 +7,50 @@ import mc.core.EntityLocation; import mc.core.world.World; import mc.core.world.WorldType; import mc.core.world.chunk.Chunk; -import mc.core.world.chunk.ChunkSection; +import mc.core.world.chunk.ChunkProvider; +import org.springframework.beans.factory.BeanNameAware; +import org.springframework.stereotype.Component; + +import javax.annotation.Nonnull; @Slf4j -public class FlatWorld implements World { +@Component +public class SimpleWorld implements World, BeanNameAware { @Getter - private final String name = "flat"; + private String name; @Getter private final WorldType worldType = WorldType.FLAT; - @Setter private EntityLocation spawn; - private ChunkSection chunkSection = new SimpleChunkSection(); + @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); + setSpawn(0d, 6d, 0d); } return this.spawn; } + @Override + public void setSpawn(EntityLocation location) { + this.spawn = location; + } + @Override public Chunk getChunk(int x, int z) { - Chunk chunk = new SimpleChunk(x, z, this); - chunk.setChunkSection(0, chunkSection); - return chunk; + return chunkProvider.getChunk(x, z); } @Override public void setChunk(int x, int z, Chunk chunk) { throw new UnsupportedOperationException(); } + + @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; + } +}