From 09c7626c2dd9b37fbebeb991c9d51318134c4117 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 8 Sep 2018 05:25:24 +0300 Subject: [PATCH] refactory Location's --- .../main/java/mc/core/CoreEventListener.java | 10 +- .../src/main/java/mc/core/EntityLocation.java | 53 +++++--- core/src/main/java/mc/core/Location.java | 91 -------------- .../mc/core/embedded/FakePlayerManager.java | 5 +- .../mc/core/player/InMemoryPlayerManager.java | 8 +- core/src/main/java/mc/core/player/Player.java | 4 +- .../java/mc/core/player/PlayerManager.java | 3 +- .../java/mc/core/player/SimplePlayer.java | 28 ++++- core/src/main/java/mc/core/world/World.java | 9 ++ .../mc/core/world/block/AbstractBlock.java | 3 +- .../main/java/mc/core/world/block/Block.java | 3 +- .../mc/core/world/block/BlockFactory.java | 11 +- .../mc/core/world/block/BlockLocation.java | 26 ++++ .../test/java/mc/core/TestBlockLocation.java | 40 ++++++ .../test/java/mc/core/TestEntityLocation.java | 102 +++++++++++---- core/src/test/java/mc/core/TestLocation.java | 119 ------------------ .../main/java/mc/world/flat/FlatWorld.java | 10 +- .../mc/world/flat/SimpleChunkSection.java | 12 +- .../network/proto_1_12_2/TeleportManager.java | 3 +- .../packets/PlayerBlockPlacementPacket.java | 6 +- .../packets/PlayerDiggingPacket.java | 6 +- .../packets/PlayerPositionAndLookPacket.java | 3 +- .../packets/TabCompletePacket.java | 6 +- .../packets/TestChunkdataPacket.java | 8 +- .../netty/PlayerEventListener.java | 2 +- .../netty/handlers/LoginHandler.java | 11 +- .../netty/handlers/PlayHandler.java | 6 +- 27 files changed, 269 insertions(+), 319 deletions(-) delete mode 100644 core/src/main/java/mc/core/Location.java create mode 100644 core/src/main/java/mc/core/world/block/BlockLocation.java create mode 100644 core/src/test/java/mc/core/TestBlockLocation.java delete mode 100644 core/src/test/java/mc/core/TestLocation.java diff --git a/core/src/main/java/mc/core/CoreEventListener.java b/core/src/main/java/mc/core/CoreEventListener.java index 070ae5b..201b60e 100644 --- a/core/src/main/java/mc/core/CoreEventListener.java +++ b/core/src/main/java/mc/core/CoreEventListener.java @@ -24,10 +24,10 @@ public class CoreEventListener { log.trace("(GameLoop) playerMoveEventHandler()"); Chunk chunk; - chunk = event.getOldLocation().getChunk(); // Old chunk + chunk = event.getPlayer().getWorld().getChunk(event.getOldLocation()); // Old chunk int ccX = chunk.getX(); int ccZ = chunk.getZ(); - chunk = event.getNewLocation().getChunk(); // Next chunk + chunk = event.getPlayer().getWorld().getChunk(event.getNewLocation()); // Next chunk int ncX = chunk.getX(); int ncZ = chunk.getZ(); @@ -71,7 +71,11 @@ public class CoreEventListener { } } - event.getPlayer().getLocation().setXYZ(event.getNewLocation()); + event.getPlayer().getLocation().setXYZ( + event.getNewLocation().getX(), + event.getNewLocation().getY(), + event.getNewLocation().getZ() + ); // TODO отсылать клиенту только(!) для корректировки позиции // SC_PlayerMoveEvent nextEvent = new SC_PlayerMoveEvent(event.getPlayer()); diff --git a/core/src/main/java/mc/core/EntityLocation.java b/core/src/main/java/mc/core/EntityLocation.java index 0eec9d2..0b4e237 100644 --- a/core/src/main/java/mc/core/EntityLocation.java +++ b/core/src/main/java/mc/core/EntityLocation.java @@ -1,21 +1,29 @@ -/* - * DmitriyMX - * 2018-08-08 - */ package mc.core; -import lombok.Getter; -import lombok.Setter; -import mc.core.world.World; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; -public class EntityLocation extends Location implements Cloneable { - @Getter - @Setter +@NoArgsConstructor +@AllArgsConstructor +@Data +public class EntityLocation implements Cloneable { + private double x, y, z; private float yaw, pitch; - public EntityLocation(double x, double y, double z, float yaw, float pitch, World world) { - super(x, y, z, world); - setYawPitch(yaw, pitch); + public static EntityLocation ZERO() { + return new EntityLocation(0d,0d,0d,0f,0f); + } + + public void set(EntityLocation location) { + setXYZ(location.x, location.y, location.z); + setYawPitch(location.yaw, location.pitch); + } + + public void setXYZ(double x, double y, double z) { + this.x = x; + this.y = y; + this.z = z; } public void setYawPitch(float yaw, float pitch) { @@ -23,12 +31,25 @@ public class EntityLocation extends Location implements Cloneable { this.pitch = pitch; } - public void setYawPitch(EntityLocation entityLocation) { - setYawPitch(entityLocation.yaw, entityLocation.pitch); + public int getBlockX() { + return Double.valueOf(Math.floor(x)).intValue(); + } + + public int getBlockY() { + return Double.valueOf(Math.floor(y)).intValue(); + } + + public int getBlockZ() { + return Double.valueOf(Math.floor(z)).intValue(); } @Override public EntityLocation clone() { - return (EntityLocation) super.clone(); + try { + return (EntityLocation) super.clone(); + } catch (CloneNotSupportedException e) { + e.printStackTrace(); + return null; + } } } diff --git a/core/src/main/java/mc/core/Location.java b/core/src/main/java/mc/core/Location.java deleted file mode 100644 index 4a4c1b4..0000000 --- a/core/src/main/java/mc/core/Location.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * DmitriyMX - * 2018-08-08 - */ -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) { - setXYZ(x, y, z); - setWorld(world); - } - - public void setXYZ(double x, double y, double z) { - this.x = x; - this.y = y; - this.z = z; - } - - public void setXYZ(Location location) { - setXYZ(location.x, location.y, location.z); - } - - public World getWorld() { - if (refWorld == null) { - return null; - } else if (refWorld.get() == null) { - throw new ResourceUnloadedException("You're trying to get unloaded world"); - } else { - return refWorld.get(); - } - } - - public void setWorld (World world) { - this.refWorld = new WeakReference<>(world); - } - - public int getBlockX() { - return Double.valueOf(Math.floor(x)).intValue(); - } - - public int getBlockY() { - return Double.valueOf(Math.floor(y)).intValue(); - } - - public int getBlockZ() { - 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 { - return (Location) super.clone(); - } catch (CloneNotSupportedException e) { // такое в нашем случае вообще возможно? - e.printStackTrace(); - return null; - } - } -} diff --git a/core/src/main/java/mc/core/embedded/FakePlayerManager.java b/core/src/main/java/mc/core/embedded/FakePlayerManager.java index 612de62..a1932e3 100644 --- a/core/src/main/java/mc/core/embedded/FakePlayerManager.java +++ b/core/src/main/java/mc/core/embedded/FakePlayerManager.java @@ -12,8 +12,7 @@ import mc.core.player.Player; import mc.core.player.PlayerManager; import mc.core.text.Text; import mc.core.text.Title; -import mc.core.world.chunk.Chunk; -import mc.core.world.chunk.ChunkSection; +import mc.core.world.World; import java.util.Collections; import java.util.List; @@ -53,7 +52,7 @@ public class FakePlayerManager implements PlayerManager { private static final NetChannel FAKE_NET_CHANNEL = new FakeNetChannet(); @Override - public Player createPlayer(String name, EntityLocation defaultLocation) { + public Player createPlayer(String name, EntityLocation location, World world) { return null; } diff --git a/core/src/main/java/mc/core/player/InMemoryPlayerManager.java b/core/src/main/java/mc/core/player/InMemoryPlayerManager.java index d373c59..765201e 100644 --- a/core/src/main/java/mc/core/player/InMemoryPlayerManager.java +++ b/core/src/main/java/mc/core/player/InMemoryPlayerManager.java @@ -10,6 +10,7 @@ import mc.core.Config; import mc.core.EntityLocation; import mc.core.network.BroadcastNetChannel; import mc.core.network.NetChannel; +import mc.core.world.World; import org.springframework.beans.factory.annotation.Autowired; import java.util.*; @@ -31,14 +32,13 @@ public class InMemoryPlayerManager implements PlayerManager, Runnable { } @Override - public Player createPlayer(String name, EntityLocation defaultLocation) { + public Player createPlayer(String name, EntityLocation location, World world) { SimplePlayer player = new SimplePlayer(); player.setId(rand.nextInt(10000)); player.setUUID(UUID.nameUUIDFromBytes(name.getBytes())); player.setName(name); - player.getLocation().setXYZ(defaultLocation); - player.getLocation().setYawPitch(defaultLocation); - player.getLocation().setWorld(defaultLocation.getWorld()); + player.getLocation().set(location); + player.setWorld(world); player.setSettings(new PlayerSettings()); synchronized (lock) { diff --git a/core/src/main/java/mc/core/player/Player.java b/core/src/main/java/mc/core/player/Player.java index 11c41a3..175b0cf 100644 --- a/core/src/main/java/mc/core/player/Player.java +++ b/core/src/main/java/mc/core/player/Player.java @@ -6,6 +6,7 @@ package mc.core.player; import mc.core.EntityLocation; import mc.core.network.NetChannel; +import mc.core.world.World; import java.util.List; import java.util.UUID; @@ -23,7 +24,8 @@ public interface Player { void setChannel(NetChannel channel); EntityLocation getLocation(); - //TODO надо определиться - нужно ли здесь setLocation() или нет + World getWorld(); + void setWorld(World world); boolean isFlying(); void setFlying(boolean value); diff --git a/core/src/main/java/mc/core/player/PlayerManager.java b/core/src/main/java/mc/core/player/PlayerManager.java index 8e07d6e..1ac8543 100644 --- a/core/src/main/java/mc/core/player/PlayerManager.java +++ b/core/src/main/java/mc/core/player/PlayerManager.java @@ -6,12 +6,13 @@ package mc.core.player; import mc.core.EntityLocation; import mc.core.network.NetChannel; +import mc.core.world.World; import java.util.List; import java.util.Optional; public interface PlayerManager { - Player createPlayer(String name, EntityLocation defaultLocation); + Player createPlayer(String name, EntityLocation location, World world); void joinServer(Player player); void leftServer(Player player); Optional getPlayer(String name); diff --git a/core/src/main/java/mc/core/player/SimplePlayer.java b/core/src/main/java/mc/core/player/SimplePlayer.java index 2472758..8fb40b6 100644 --- a/core/src/main/java/mc/core/player/SimplePlayer.java +++ b/core/src/main/java/mc/core/player/SimplePlayer.java @@ -6,8 +6,12 @@ package mc.core.player; import lombok.Data; import mc.core.EntityLocation; +import mc.core.exception.ResourceUnloadedException; import mc.core.network.NetChannel; +import mc.core.world.World; +import java.lang.ref.Reference; +import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -19,21 +23,33 @@ public class SimplePlayer implements Player { private String name; private boolean online = false; private NetChannel channel; - private EntityLocation location = new EntityLocation(0d, 0d, 0d, 0f, 0f, null); + private EntityLocation location = EntityLocation.ZERO(); + private Reference $refWorld; private boolean flying = false; private PlayerSettings settings; private List loadedChunks = new ArrayList<>(); - public void setLocation(EntityLocation location) { - this.location.setXYZ(location); - this.location.setYawPitch(location); - } - @Override public UUID getUUID() { return uuid; } + @Override + public World getWorld() { + if ($refWorld == null) { + return null; + } else if ($refWorld.get() == null) { + throw new ResourceUnloadedException("You're trying to get unloaded world"); + } else { + return $refWorld.get(); + } + } + + @Override + public void setWorld(World world) { + this.$refWorld = new WeakReference<>(world); + } + public void setUUID(UUID uuid) { this.uuid = uuid; } diff --git a/core/src/main/java/mc/core/world/World.java b/core/src/main/java/mc/core/world/World.java index 20bf437..85f79cb 100644 --- a/core/src/main/java/mc/core/world/World.java +++ b/core/src/main/java/mc/core/world/World.java @@ -5,6 +5,7 @@ package mc.core.world; import mc.core.EntityLocation; +import mc.core.world.block.BlockLocation; import mc.core.world.chunk.Chunk; public interface World { @@ -15,4 +16,12 @@ public interface World { Chunk getChunk(int x, int z); void setChunk(int x, int z, Chunk chunkSection); + + default Chunk getChunk(BlockLocation location) { + return getChunk(location.getX() >> 4, location.getZ() >> 4); + } + + default Chunk getChunk(EntityLocation location) { + return getChunk(location.getBlockX() >> 4, location.getBlockZ() >> 4); + } } diff --git a/core/src/main/java/mc/core/world/block/AbstractBlock.java b/core/src/main/java/mc/core/world/block/AbstractBlock.java index 0c6d90b..b00b8af 100644 --- a/core/src/main/java/mc/core/world/block/AbstractBlock.java +++ b/core/src/main/java/mc/core/world/block/AbstractBlock.java @@ -3,7 +3,6 @@ package mc.core.world.block; import com.flowpowered.nbt.Tag; import lombok.Getter; import lombok.Setter; -import mc.core.Location; import java.util.HashMap; import java.util.Map; @@ -12,7 +11,7 @@ import java.util.stream.Stream; public abstract class AbstractBlock implements Block { @Getter @Setter - private Location location; + private BlockLocation location; @Getter private int light = 0; @Getter diff --git a/core/src/main/java/mc/core/world/block/Block.java b/core/src/main/java/mc/core/world/block/Block.java index d1a392f..b54a7d0 100644 --- a/core/src/main/java/mc/core/world/block/Block.java +++ b/core/src/main/java/mc/core/world/block/Block.java @@ -1,11 +1,10 @@ package mc.core.world.block; -import mc.core.Location; import mc.core.nbt.Taggable; public interface Block extends Taggable{ int getLight(); void setLight(int light); BlockType getBlockType(); - Location getLocation(); + BlockLocation getLocation(); } 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..04d039f 100644 --- a/core/src/main/java/mc/core/world/block/BlockFactory.java +++ b/core/src/main/java/mc/core/world/block/BlockFactory.java @@ -1,19 +1,16 @@ package mc.core.world.block; -import mc.core.Location; -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 BlockLocation(x, y, z)); } } } diff --git a/core/src/main/java/mc/core/world/block/BlockLocation.java b/core/src/main/java/mc/core/world/block/BlockLocation.java new file mode 100644 index 0000000..cabccaa --- /dev/null +++ b/core/src/main/java/mc/core/world/block/BlockLocation.java @@ -0,0 +1,26 @@ +package mc.core.world.block; + +import lombok.*; + +@NoArgsConstructor +@AllArgsConstructor +@Data +public class BlockLocation implements Cloneable { + private int x, y, z; + + public void setXYZ(int x, int y, int z) { + this.x = x; + this.y = y; + this.z = z; + } + + @Override + public BlockLocation clone() { + try { + return (BlockLocation) super.clone(); + } catch (CloneNotSupportedException e) { + e.printStackTrace(); + return null; + } + } +} diff --git a/core/src/test/java/mc/core/TestBlockLocation.java b/core/src/test/java/mc/core/TestBlockLocation.java new file mode 100644 index 0000000..620919f --- /dev/null +++ b/core/src/test/java/mc/core/TestBlockLocation.java @@ -0,0 +1,40 @@ +package mc.core; + +import mc.core.world.block.BlockLocation; +import org.junit.Before; +import org.junit.Test; + +import java.util.concurrent.ThreadLocalRandom; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; + +public class TestBlockLocation { + private static final ThreadLocalRandom rnd = ThreadLocalRandom.current(); + private static final int minI = 0, maxI = 10; + private int x, y, z; + + @Before + public void before() { + x = rnd.nextInt(minI, maxI); + y = rnd.nextInt(minI, maxI); + z = rnd.nextInt(minI, maxI); + } + + @Test + public void testEquals() { + BlockLocation loc1 = new BlockLocation(x, y, z); + BlockLocation loc2 = new BlockLocation(x, y, z); + assertEquals(loc1, loc2); + + loc2 = new BlockLocation(x+1, y+2, z-3); + assertNotEquals(loc1, loc2); + } + + @Test + public void testClone() { + BlockLocation locOrig = new BlockLocation(x, y, z); + BlockLocation locClone = locOrig.clone(); + assertEquals(locOrig, locClone); + } +} diff --git a/core/src/test/java/mc/core/TestEntityLocation.java b/core/src/test/java/mc/core/TestEntityLocation.java index 5a09623..c6b1c62 100644 --- a/core/src/test/java/mc/core/TestEntityLocation.java +++ b/core/src/test/java/mc/core/TestEntityLocation.java @@ -1,35 +1,91 @@ package mc.core; -import mc.core.world.World; +import org.junit.Before; import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import java.util.concurrent.ThreadLocalRandom; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertSame; -import static org.mockito.Mockito.mock; +import static org.junit.Assert.assertNotEquals; -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = SpringConfig.class) public class TestEntityLocation { - @Autowired - @Qualifier("simpleMockWorld") - private World mockWorld; + private static final ThreadLocalRandom rnd = ThreadLocalRandom.current(); + private static final double minD = 0.0d, maxD = 10.0d; + private static final float minF = 0.0f, maxF = 359.9f; + private double x, y, z; + private float yaw, pitch; + + @Before + public void before() { + x = rnd.nextDouble(minD, maxD); + y = rnd.nextDouble(minD, maxD); + z = rnd.nextDouble(minD, maxD); + yaw = rnd.nextFloat() * (maxF - minF) + minF; + pitch = rnd.nextFloat() * (maxF - minF) + minF; + } @Test - public void cloneTest() { - EntityLocation firstLocation = new EntityLocation(10, 20, 30, 40, 50, mockWorld); - assertSame("Lost world reference before cloning", mockWorld, firstLocation.getWorld()); - EntityLocation locationClone = firstLocation.clone(); + public void testEquals() { + EntityLocation loc1 = new EntityLocation(x, y, z, yaw, pitch); + EntityLocation loc2 = new EntityLocation(x, y, z, yaw, pitch); + assertEquals(loc1, loc2); - assertEquals("X mismatch", firstLocation.getX(), locationClone.getX(), 0); - assertEquals("Y mismatch", firstLocation.getY(), locationClone.getY(), 0); - assertEquals("Z mismatch", firstLocation.getZ(), locationClone.getZ(), 0); - assertEquals("Pitch mismatch", firstLocation.getPitch(), locationClone.getPitch(), 0); - assertEquals("Yaw mismatch", firstLocation.getYaw(), locationClone.getYaw(), 0); - assertSame("World mismatch (accidental clone of the World object?)", firstLocation.getWorld(), locationClone.getWorld()); + loc2 = new EntityLocation(x+1, y+2, z-3, yaw, pitch); + assertNotEquals(loc1, loc2); + + loc2 = new EntityLocation(x, y, z, yaw-1, pitch+2); + assertNotEquals(loc1, loc2); + } + + @Test + public void testClone() { + EntityLocation locOrig = new EntityLocation(x, y, z, yaw, pitch); + EntityLocation locClone = locOrig.clone(); + assertEquals(locOrig, locClone); + } + + @Test + public void testGetBlockXZ() { + EntityLocation location; + + location = new EntityLocation(0d, 0, 0d, 0f, 0f); + assertEquals(0, location.getBlockX()); + assertEquals(0, location.getBlockZ()); + + location.setXYZ(0.1d, 0, 0.1d); + assertEquals(0, location.getBlockX()); + assertEquals(0, location.getBlockZ()); + + location.setXYZ(0.5d, 0, 0.5d); + assertEquals(0, location.getBlockX()); + assertEquals(0, location.getBlockZ()); + + location.setXYZ(0.9d, 0, 0.9d); + assertEquals(0, location.getBlockX()); + assertEquals(0, location.getBlockZ()); + + location.setXYZ(1d, 0, 1d); + assertEquals(1, location.getBlockX()); + assertEquals(1, location.getBlockZ()); + + location.setXYZ(-0.1d, 0, -0.1d); + assertEquals(-1, location.getBlockX()); + assertEquals(-1, location.getBlockZ()); + + location.setXYZ(-0.5d, 0, -0.5d); + assertEquals(-1, location.getBlockX()); + assertEquals(-1, location.getBlockZ()); + + location.setXYZ(-0.9d, 0, -0.9d); + assertEquals(-1, location.getBlockX()); + assertEquals(-1, location.getBlockZ()); + + location.setXYZ(-1d, 0, -1d); + assertEquals(-1, location.getBlockX()); + assertEquals(-1, location.getBlockZ()); + + location.setXYZ(-1.1d, 0, -1.1d); + assertEquals(-2, location.getBlockX()); + assertEquals(-2, location.getBlockZ()); } } diff --git a/core/src/test/java/mc/core/TestLocation.java b/core/src/test/java/mc/core/TestLocation.java deleted file mode 100644 index eafd792..0000000 --- a/core/src/test/java/mc/core/TestLocation.java +++ /dev/null @@ -1,119 +0,0 @@ -package mc.core; - -import mc.core.world.World; -import mc.core.world.chunk.Chunk; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -import static org.junit.Assert.assertEquals; -import static org.mockito.Mockito.*; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = SpringConfig.class) -public class TestLocation { - @Autowired - @Qualifier("chunkedMockWorld") - private World world; - - @Test - public void testGetBlockXZ() { - Location location; - - location = new Location(0d, 0, 0d, world); - assertEquals(0, location.getBlockX()); - assertEquals(0, location.getBlockZ()); - - location.setXYZ(0.1d, 0, 0.1d); - assertEquals(0, location.getBlockX()); - assertEquals(0, location.getBlockZ()); - - location.setXYZ(0.5d, 0, 0.5d); - assertEquals(0, location.getBlockX()); - assertEquals(0, location.getBlockZ()); - - location.setXYZ(0.9d, 0, 0.9d); - assertEquals(0, location.getBlockX()); - assertEquals(0, location.getBlockZ()); - - location.setXYZ(1d, 0, 1d); - assertEquals(1, location.getBlockX()); - assertEquals(1, location.getBlockZ()); - - location.setXYZ(-0.1d, 0, -0.1d); - assertEquals(-1, location.getBlockX()); - assertEquals(-1, location.getBlockZ()); - - location.setXYZ(-0.5d, 0, -0.5d); - assertEquals(-1, location.getBlockX()); - assertEquals(-1, location.getBlockZ()); - - location.setXYZ(-0.9d, 0, -0.9d); - assertEquals(-1, location.getBlockX()); - assertEquals(-1, location.getBlockZ()); - - location.setXYZ(-1d, 0, -1d); - assertEquals(-1, location.getBlockX()); - assertEquals(-1, location.getBlockZ()); - - location.setXYZ(-1.1d, 0, -1.1d); - 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/flat_world/src/main/java/mc/world/flat/FlatWorld.java b/flat_world/src/main/java/mc/world/flat/FlatWorld.java index 6ec745f..ca5d1db 100644 --- a/flat_world/src/main/java/mc/world/flat/FlatWorld.java +++ b/flat_world/src/main/java/mc/world/flat/FlatWorld.java @@ -5,6 +5,7 @@ package mc.world.flat; import lombok.Getter; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; import mc.core.EntityLocation; import mc.core.world.World; @@ -16,6 +17,7 @@ import mc.core.world.chunk.ChunkSection; public class FlatWorld implements World { @Getter private final WorldType worldType = WorldType.FLAT; + @Setter private EntityLocation spawn; private ChunkSection chunkSection = new SimpleChunkSection(); @@ -23,18 +25,12 @@ public class FlatWorld implements World { 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); + this.spawn = new EntityLocation(0d, 6d, 0d, 0f, 0f); } return this.spawn; } - @Override - public void setSpawn(EntityLocation location) { - this.spawn = location; - this.spawn.setWorld(this); - } - @Override public Chunk getChunk(int x, int z) { Chunk chunk = new SimpleChunk(x, z, this); 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..4c5b8a8 100644 --- a/flat_world/src/main/java/mc/world/flat/SimpleChunkSection.java +++ b/flat_world/src/main/java/mc/world/flat/SimpleChunkSection.java @@ -9,12 +9,8 @@ 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; - public class SimpleChunkSection implements ChunkSection { @Override public int getSkyLight(int x, int y, int z) { @@ -63,10 +59,10 @@ public class SimpleChunkSection implements ChunkSection { public Block getBlock(int x, int y, int z) { BlockFactory blockFactory = new BlockFactory(); - 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()); + 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); } @Override diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/TeleportManager.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/TeleportManager.java index 951f098..ba9cd07 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/TeleportManager.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/TeleportManager.java @@ -45,8 +45,7 @@ public class TeleportManager { public void apply(int teleportId) { if (teleportMap.containsKey(teleportId)) { TpData data = teleportMap.remove(teleportId); - data.player.getLocation().setXYZ(data.newLocation); - data.player.getLocation().setYawPitch(data.newLocation); + data.player.getLocation().set(data.newLocation); } } 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..3586c01 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 @@ -2,7 +2,7 @@ package mc.core.network.proto_1_12_2.packets; import lombok.Getter; import lombok.ToString; -import mc.core.Location; +import mc.core.world.block.BlockLocation; import mc.core.network.CSPacket; import mc.core.network.NetInputStream; import mc.core.network.proto_1_12_2.Direction; @@ -11,7 +11,7 @@ import mc.core.utils.CompactedCoords; @Getter @ToString public class PlayerBlockPlacementPacket implements CSPacket { - private Location location; + private BlockLocation location; private Direction face; /** true - main hand; false - off hand */ private boolean hand; @@ -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 BlockLocation((int)xyz[0], (int)xyz[1], (int)xyz[2]); //FIXME 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..2081e7c 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 @@ -3,7 +3,7 @@ package mc.core.network.proto_1_12_2.packets; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.ToString; -import mc.core.Location; +import mc.core.world.block.BlockLocation; import mc.core.network.CSPacket; import mc.core.network.NetInputStream; import mc.core.network.proto_1_12_2.Direction; @@ -42,7 +42,7 @@ public class PlayerDiggingPacket implements CSPacket { } private Status status; - private Location location; + private BlockLocation location; private Direction face; @Override @@ -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 BlockLocation((int)xyz[0], (int)xyz[1], (int)xyz[2]); //FIXME face = Direction.getById(netStream.readByte()); } } diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerPositionAndLookPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerPositionAndLookPacket.java index 985d8df..3c783a7 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerPositionAndLookPacket.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerPositionAndLookPacket.java @@ -48,8 +48,7 @@ public class PlayerPositionAndLookPacket implements SCPacket, CSPacket { netStream.readDouble(), netStream.readDouble(), netStream.readFloat(), - netStream.readFloat(), - null + netStream.readFloat() ); this.onGround = netStream.readBoolean(); 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..558e8dc 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 @@ -4,7 +4,7 @@ */ package mc.core.network.proto_1_12_2.packets; -import mc.core.Location; +import mc.core.world.block.BlockLocation; import mc.core.network.CSPacket; import mc.core.network.NetInputStream; @@ -12,7 +12,7 @@ public class TabCompletePacket implements CSPacket { private String text; private boolean assumeCommand; private boolean hasPosition; - private Location location; + private BlockLocation location; @Override public void readSelf(NetInputStream netStream) { @@ -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 BlockLocation((int)x, (int)y, (int)z); //FIXME } } } 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/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java index bcfe393..4c7e533 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PlayerEventListener.java @@ -29,7 +29,7 @@ class PlayerEventListener { public void playerChunkLoadHandler(SC_ChunkLoadEvent event) { for(Integer compressXZ : event.getNeedLoadChunks()) { int[] xz = CompactedCoords.uncompressXZ(compressXZ); - Chunk chunk = event.getPlayer().getLocation().getWorld().getChunk(xz[0], xz[1]); + Chunk chunk = event.getPlayer().getWorld().getChunk(xz[0], xz[1]); ChunkDataPacket packet = new ChunkDataPacket(); packet.setX(xz[0]); diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java index 771b1c3..d38af9c 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/LoginHandler.java @@ -20,6 +20,7 @@ import mc.core.text.TextColor; import mc.core.text.TextStyle; import mc.core.utils.CompactedCoords; import mc.core.world.World; +import mc.core.world.chunk.Chunk; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -50,7 +51,8 @@ public class LoginHandler extends AbstractStateHandler implements LoginStateHand Player player = playerManager.getPlayer(packet.getPlayerName()) .orElseGet(() -> playerManager.createPlayer( packet.getPlayerName(), - world.getSpawn())); + world.getSpawn(), + world)); channel.writeAndFlush(new LoginSuccessPacket( player.getUUID(), @@ -83,9 +85,10 @@ public class LoginHandler extends AbstractStateHandler implements LoginStateHand // First Chunk ChunkDataPacket pkt8 = new ChunkDataPacket(); - pkt8.setX(player.getLocation().getChunk().getX()); - pkt8.setZ(player.getLocation().getChunk().getZ()); - pkt8.setChunk(player.getLocation().getChunk()); + Chunk chunk = player.getWorld().getChunk(player.getLocation()); + pkt8.setX(chunk.getX()); + pkt8.setZ(chunk.getZ()); + pkt8.setChunk(chunk); pkt8.setInitChunk(true); channel.writeAndFlush(pkt8); player.getLoadedChunks().add(CompactedCoords.compressXZ(0, 0)); diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java index d7636e3..d132486 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/handlers/PlayHandler.java @@ -55,8 +55,7 @@ public class PlayHandler extends AbstractStateHandler implements PlayStateHandle @Handler public void onPositionAndLook(Channel channel, PlayerPositionAndLookPacket packet) { Player player = channel.attr(ATTR_PLAYER).get(); - player.getLocation().setXYZ(packet.getLocation()); - player.getLocation().setYawPitch(packet.getLocation()); + player.getLocation().set(packet.getLocation()); } @Handler @@ -82,8 +81,7 @@ public class PlayHandler extends AbstractStateHandler implements PlayStateHandle event.setNewLocation(new EntityLocation( packet.getX(), packet.getY(), packet.getZ(), player.getLocation().getYaw(), - player.getLocation().getPitch(), - player.getLocation().getWorld() + player.getLocation().getPitch() )); EventBusGetter.getInstance().post(event); }