From aae20352078fd59502b10dda0a0e0037b23c1e93 Mon Sep 17 00:00:00 2001 From: Forwolk Date: Wed, 11 Jul 2018 18:38:37 +0300 Subject: [PATCH 1/7] Location implements cloneable --- core/src/main/java/mc/core/Location.java | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/mc/core/Location.java b/core/src/main/java/mc/core/Location.java index fa1e00b..474ab1d 100644 --- a/core/src/main/java/mc/core/Location.java +++ b/core/src/main/java/mc/core/Location.java @@ -9,15 +9,17 @@ import lombok.Data; @AllArgsConstructor @Data -public class Location { +public class Location implements Cloneable { private double x, y, z; public static Location copyOf(Location location) { - return new Location( - location.x, - location.y, - location.z - ); + return location.clone(); + } + + public Location (Location location) { + this.x = location.getX(); + this.y = location.getY(); + this.z = location.getZ(); } public void set(Location location) { @@ -45,4 +47,13 @@ public class Location { public int getBlockZ() { return (int) z; } + + @Override + protected Location clone() { + try { + return (Location) super.clone(); + } catch (CloneNotSupportedException e) { + return null; + } + } } From 6143c88b52b5dd9387626d48a4f47df6f037512f Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 11 Jul 2018 19:59:26 +0300 Subject: [PATCH 2/7] =?UTF-8?q?=D0=97=D0=B0=D1=87=D0=B5=D0=BC=20=D0=BD?= =?UTF-8?q?=D0=B0=D0=BC=20Location.copyOf(),=20=D0=BA=D0=BE=D0=B3=D0=B4?= =?UTF-8?q?=D0=B0=20=D0=B5=D1=81=D1=82=D1=8C=20clone()=3F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/mc/core/Location.java | 6 +----- .../java/mc/core/network/proto_1_12_2/TeleportManager.java | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/mc/core/Location.java b/core/src/main/java/mc/core/Location.java index 474ab1d..438efd9 100644 --- a/core/src/main/java/mc/core/Location.java +++ b/core/src/main/java/mc/core/Location.java @@ -12,10 +12,6 @@ import lombok.Data; public class Location implements Cloneable { private double x, y, z; - public static Location copyOf(Location location) { - return location.clone(); - } - public Location (Location location) { this.x = location.getX(); this.y = location.getY(); @@ -49,7 +45,7 @@ public class Location implements Cloneable { } @Override - protected Location clone() { + public Location clone() { try { return (Location) super.clone(); } catch (CloneNotSupportedException e) { 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 31424bd..90c735f 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 @@ -38,7 +38,7 @@ public class TeleportManager { teleportId = RAND.nextInt(9999); } while (teleportMap.containsKey(teleportId)); - teleportMap.put(teleportId, new TpData(player, Location.copyOf(location))); + teleportMap.put(teleportId, new TpData(player, location.clone())); return teleportId; } From 83de8629e1f289b76e4af24af93675d5d6af431f Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 8 Aug 2018 13:17:56 +0300 Subject: [PATCH 3/7] refactory Location & Look --- .../src/main/java/mc/core/EntityLocation.java | 34 +++++++++++ core/src/main/java/mc/core/Location.java | 60 +++++++------------ core/src/main/java/mc/core/player/Look.java | 21 ------- 3 files changed, 54 insertions(+), 61 deletions(-) create mode 100644 core/src/main/java/mc/core/EntityLocation.java delete mode 100644 core/src/main/java/mc/core/player/Look.java diff --git a/core/src/main/java/mc/core/EntityLocation.java b/core/src/main/java/mc/core/EntityLocation.java new file mode 100644 index 0000000..edb92a3 --- /dev/null +++ b/core/src/main/java/mc/core/EntityLocation.java @@ -0,0 +1,34 @@ +/* + * DmitriyMX + * 2018-08-08 + */ +package mc.core; + +import lombok.Getter; +import lombok.Setter; +import mc.core.world.World; + +public class EntityLocation extends Location implements Cloneable { + @Getter + @Setter + 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 void setYawPitch(float yaw, float pitch) { + this.yaw = yaw; + this.pitch = pitch; + } + + public void setYawPitch(EntityLocation entityLocation) { + setYawPitch(entityLocation.yaw, entityLocation.pitch); + } + + @Override + public EntityLocation clone() { + return (EntityLocation) super.clone(); //TODO need test + } +} diff --git a/core/src/main/java/mc/core/Location.java b/core/src/main/java/mc/core/Location.java index adc1dc3..09e6c19 100644 --- a/core/src/main/java/mc/core/Location.java +++ b/core/src/main/java/mc/core/Location.java @@ -1,56 +1,43 @@ /* * DmitriyMX - * 2018-04-15 + * 2018-08-08 */ package mc.core; -import lombok.AllArgsConstructor; -import lombok.Data; +import lombok.Getter; +import lombok.Setter; +import mc.core.world.World; import java.io.Serializable; +import java.lang.ref.WeakReference; -@AllArgsConstructor -@Data -public class Location implements Serializable, Cloneable{ +public class Location implements Serializable, Cloneable { + @Getter + @Setter private double x, y, z; + private WeakReference refWorld; - private static int floor_double(double value) { - int i = (int)value; - return value < (double)i ? i - 1 : i; + public Location(double x, double y, double z, World world) { + setXYZ(x, y, z); + setWorld(world); } - public static Location startPointLocation () { - return new Location(0,10,0); - } - - public Location(long compactValue) { - set(compactValue); - } - - public void set(double x, double y, double z) { + public void setXYZ(double x, double y, double z) { this.x = x; this.y = y; this.z = z; } - public void set(Location location) { - this.x = location.x; - this.y = location.y; - this.z = location.z; + public void setXYZ(Location location) { + setXYZ(location.x, location.y, location.z); } - public void set(long compactValue) { - this.x = compactValue >> 38; - this.y = (compactValue >> 26) & 0xFFF; - this.z = compactValue << 38 >> 38; // is normal? + public World getWorld() { + return refWorld.get(); } - public Location diff(Location location) { - return new Location( - this.x - location.x, - this.y - location.y, - this.z - location.z - ); + public void setWorld(World world) { + this.refWorld = new WeakReference<>(world); } public int getBlockX() { @@ -65,18 +52,11 @@ public class Location implements Serializable, Cloneable{ return (int) z; } - - public long toLong() { - return ((floor_double(x) & 0x3FFFFFF) << 38) - | ((floor_double(y) & 0xFFF) << 26) - | (floor_double(z) & 0x3FFFFFF); - } - @Override public Location clone() { try { return (Location) super.clone(); - } catch (CloneNotSupportedException e) { + } catch (CloneNotSupportedException e) { // такое в нашем случае вообще возможно? return null; } } diff --git a/core/src/main/java/mc/core/player/Look.java b/core/src/main/java/mc/core/player/Look.java deleted file mode 100644 index 1c0f7f4..0000000 --- a/core/src/main/java/mc/core/player/Look.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * DmitriyMX - * 2018-04-22 - */ -package mc.core.player; - -import lombok.AllArgsConstructor; -import lombok.Data; - -import java.io.Serializable; - -@Data -@AllArgsConstructor -public class Look implements Serializable{ - private float yaw, pitch; - - public void set(Look look) { - this.yaw = look.yaw; - this.pitch = look.pitch; - } -} From a0f91730d004bf654fb6d4673a734aad48e346ba Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 8 Aug 2018 13:19:45 +0300 Subject: [PATCH 4/7] apply upgraded Location & EntityLocation --- core/src/main/java/mc/core/WarpPosition.java | 14 ------------ .../mc/core/embedded/FakePlayerManager.java | 5 ++--- .../java/mc/core/events/PlayerLookEvent.java | 4 ++-- .../mc/core/player/InMemoryPlayerManager.java | 7 +++--- core/src/main/java/mc/core/player/Player.java | 5 ++--- .../java/mc/core/player/PlayerManager.java | 3 ++- .../java/mc/core/player/SimplePlayer.java | 13 +++++------ core/src/main/java/mc/core/world/World.java | 6 ++--- .../mc/core/world/block/BlockFactory.java | 2 +- .../main/java/mc/world/flat/FlatWorld.java | 6 ++--- .../serialization/WorldReaderWriter.java | 4 ++-- .../generated_world/world/CubicWorld.java | 15 ++++++------- .../network/proto_1_12_2/TeleportManager.java | 8 ++++--- .../packets/PlayerPositionAndLookPacket.java | 22 ++++++++----------- .../packets/SpawnPositionPacket.java | 13 ++++++++++- .../packets/TabCompletePacket.java | 8 ++++++- .../netty/handlers/LoginHandler.java | 7 ++---- .../netty/handlers/PlayHandler.java | 4 ++-- 18 files changed, 69 insertions(+), 77 deletions(-) delete mode 100644 core/src/main/java/mc/core/WarpPosition.java diff --git a/core/src/main/java/mc/core/WarpPosition.java b/core/src/main/java/mc/core/WarpPosition.java deleted file mode 100644 index 6e1aacf..0000000 --- a/core/src/main/java/mc/core/WarpPosition.java +++ /dev/null @@ -1,14 +0,0 @@ -package mc.core; - -import lombok.AllArgsConstructor; -import lombok.Data; -import mc.core.player.Look; - -import java.io.Serializable; - -@Data -@AllArgsConstructor -public class WarpPosition implements Serializable { - private Location location; - private Look look; -} diff --git a/core/src/main/java/mc/core/embedded/FakePlayerManager.java b/core/src/main/java/mc/core/embedded/FakePlayerManager.java index 10a8ea5..d3e4f55 100644 --- a/core/src/main/java/mc/core/embedded/FakePlayerManager.java +++ b/core/src/main/java/mc/core/embedded/FakePlayerManager.java @@ -4,11 +4,10 @@ */ package mc.core.embedded; -import mc.core.Location; +import mc.core.EntityLocation; import mc.core.chat.MessageType; import mc.core.network.NetChannel; import mc.core.network.SCPacket; -import mc.core.player.Look; import mc.core.player.Player; import mc.core.player.PlayerManager; import mc.core.text.Text; @@ -52,7 +51,7 @@ public class FakePlayerManager implements PlayerManager { private static final NetChannel FAKE_NET_CHANNEL = new FakeNetChannet(); @Override - public Player createPlayer(String name, Location defaultLocation, Look defaultLook) { + public Player createPlayer(String name, EntityLocation defaultLocation) { return null; } diff --git a/core/src/main/java/mc/core/events/PlayerLookEvent.java b/core/src/main/java/mc/core/events/PlayerLookEvent.java index 2d03b0b..7506530 100644 --- a/core/src/main/java/mc/core/events/PlayerLookEvent.java +++ b/core/src/main/java/mc/core/events/PlayerLookEvent.java @@ -7,7 +7,7 @@ package mc.core.events; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; -import mc.core.player.Look; +import mc.core.EntityLocation; import mc.core.player.Player; @RequiredArgsConstructor @@ -15,5 +15,5 @@ import mc.core.player.Player; @Setter public class PlayerLookEvent extends EventBase { private final Player player; - private Look newLook; + private EntityLocation newLook; } diff --git a/core/src/main/java/mc/core/player/InMemoryPlayerManager.java b/core/src/main/java/mc/core/player/InMemoryPlayerManager.java index 0ba717c..a72c114 100644 --- a/core/src/main/java/mc/core/player/InMemoryPlayerManager.java +++ b/core/src/main/java/mc/core/player/InMemoryPlayerManager.java @@ -7,6 +7,7 @@ package mc.core.player; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import mc.core.Config; +import mc.core.EntityLocation; import mc.core.Location; import mc.core.network.BroadcastNetChannel; import mc.core.network.NetChannel; @@ -31,13 +32,13 @@ public class InMemoryPlayerManager implements PlayerManager, Runnable { } @Override - public Player createPlayer(String name, Location defaultLocation, Look defaultLook) { + public Player createPlayer(String name, EntityLocation defaultLocation) { SimplePlayer player = new SimplePlayer(); player.setId(rand.nextInt(10000)); player.setUUID(UUID.nameUUIDFromBytes(name.getBytes())); player.setName(name); - player.getLocation().set(defaultLocation); - player.getLook().set(defaultLook); + player.getLocation().setXYZ(defaultLocation); + player.getLocation().setYawPitch(defaultLocation); 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 0b0e2c2..c2358f2 100644 --- a/core/src/main/java/mc/core/player/Player.java +++ b/core/src/main/java/mc/core/player/Player.java @@ -4,6 +4,7 @@ */ package mc.core.player; +import mc.core.EntityLocation; import mc.core.Location; import mc.core.network.NetChannel; @@ -18,9 +19,7 @@ public interface Player { NetChannel getChannel(); void setChannel(NetChannel channel); - Location getLocation(); - - Look getLook(); + EntityLocation getLocation(); 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 8dd1c7a..6269f91 100644 --- a/core/src/main/java/mc/core/player/PlayerManager.java +++ b/core/src/main/java/mc/core/player/PlayerManager.java @@ -4,6 +4,7 @@ */ package mc.core.player; +import mc.core.EntityLocation; import mc.core.Location; import mc.core.network.NetChannel; @@ -11,7 +12,7 @@ import java.util.List; import java.util.Optional; public interface PlayerManager { - Player createPlayer(String name, Location defaultLocation, Look defaultLook); + Player createPlayer(String name, EntityLocation defaultLocation); 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 f841595..b45eacd 100644 --- a/core/src/main/java/mc/core/player/SimplePlayer.java +++ b/core/src/main/java/mc/core/player/SimplePlayer.java @@ -5,6 +5,7 @@ package mc.core.player; import lombok.Data; +import mc.core.EntityLocation; import mc.core.Location; import mc.core.network.NetChannel; @@ -17,17 +18,13 @@ public class SimplePlayer implements Player { private String name; private boolean online = false; private NetChannel channel; - private Location location = new Location(0, 0, 0); - private Look look = new Look(0, 0); + private EntityLocation location = new EntityLocation(0d, 0d, 0d, 0f, 0f, null); private boolean flying = false; private PlayerSettings settings; - public void setLocation(Location location) { - this.location.set(location); - } - - public void setLook(Look look) { - this.look.set(look); + public void setLocation(EntityLocation location) { + this.location.setXYZ(location); + this.location.setYawPitch(location); } @Override diff --git a/core/src/main/java/mc/core/world/World.java b/core/src/main/java/mc/core/world/World.java index 0bde5b1..c19a9c5 100644 --- a/core/src/main/java/mc/core/world/World.java +++ b/core/src/main/java/mc/core/world/World.java @@ -4,7 +4,7 @@ */ package mc.core.world; -import mc.core.WarpPosition; +import mc.core.EntityLocation; import mc.core.nbt.Taggable; import mc.core.world.chunk.Chunk; @@ -46,8 +46,8 @@ public interface World extends Taggable, Serializable{ UUID getWorldId(); IWorldType getWorldType(); - WarpPosition getSpawn(); - void setSpawn(WarpPosition location); + EntityLocation getSpawn(); + void setSpawn(EntityLocation location); Chunk getChunk(int x, int y, int z); void setChunk(int x, int y, int z, Chunk chunk); 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 868eb52..1c80548 100644 --- a/core/src/main/java/mc/core/world/block/BlockFactory.java +++ b/core/src/main/java/mc/core/world/block/BlockFactory.java @@ -22,7 +22,7 @@ public class BlockFactory { private class EmbeddedBlock extends AbstractBlock { EmbeddedBlock(BlockType type, int meta, int x, int y, int z) { super(type, meta); - super.setLocation(new Location(x,y,z)); + super.setLocation(new Location(x,y,z, null)); } } } 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 8813b51..302ac1b 100644 --- a/flat_world/src/main/java/mc/world/flat/FlatWorld.java +++ b/flat_world/src/main/java/mc/world/flat/FlatWorld.java @@ -7,9 +7,7 @@ package mc.world.flat; import com.flowpowered.nbt.Tag; import lombok.Getter; import lombok.Setter; -import mc.core.Location; -import mc.core.WarpPosition; -import mc.core.player.Look; +import mc.core.EntityLocation; import mc.core.world.*; import mc.core.world.chunk.Chunk; @@ -27,7 +25,7 @@ public class FlatWorld implements World { @Getter @Setter - private WarpPosition spawn = new WarpPosition(new Location(0, 6, 0), new Look(0, 0)); + private EntityLocation spawn = new EntityLocation(0d, 6d, 0d, 0f, 0f, this); private Chunk chunk = new SimpleChunk(0, 0, 0); //FIXME temporary dummy @Override diff --git a/generated_world/src/main/java/mc/world/generated_world/serialization/WorldReaderWriter.java b/generated_world/src/main/java/mc/world/generated_world/serialization/WorldReaderWriter.java index 485c98f..9aa127e 100644 --- a/generated_world/src/main/java/mc/world/generated_world/serialization/WorldReaderWriter.java +++ b/generated_world/src/main/java/mc/world/generated_world/serialization/WorldReaderWriter.java @@ -2,7 +2,7 @@ package mc.world.generated_world.serialization; import lombok.Data; import lombok.extern.slf4j.Slf4j; -import mc.core.WarpPosition; +import mc.core.EntityLocation; import mc.core.world.World; import mc.world.generated_world.world.CubicWorld; @@ -55,7 +55,7 @@ public class WorldReaderWriter { @Data public static class WorldInfo implements Serializable { - private WarpPosition spawn; + private EntityLocation spawn; private String name; private int seed; } diff --git a/generated_world/src/main/java/mc/world/generated_world/world/CubicWorld.java b/generated_world/src/main/java/mc/world/generated_world/world/CubicWorld.java index d7f1724..d5c8d34 100644 --- a/generated_world/src/main/java/mc/world/generated_world/world/CubicWorld.java +++ b/generated_world/src/main/java/mc/world/generated_world/world/CubicWorld.java @@ -4,10 +4,9 @@ import com.flowpowered.nbt.Tag; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; +import mc.core.EntityLocation; import mc.core.Location; -import mc.core.WarpPosition; import mc.core.world.block.BlockType; -import mc.core.player.Look; import mc.core.world.chunk.Chunk; import mc.core.world.IWorldType; import mc.core.world.Region; @@ -27,7 +26,7 @@ public class CubicWorld implements World { @Getter private final UUID worldId; private final int seed; - private volatile WarpPosition warpPosition; + private volatile EntityLocation warpPosition; private final transient Object spawnLocationLock = new Object(); private final Map> nbtTagMap = new HashMap<>(); @Autowired @@ -61,20 +60,20 @@ public class CubicWorld implements World { } @Override - public WarpPosition getSpawn() { + public EntityLocation getSpawn() { if (warpPosition == null) { synchronized (spawnLocationLock) { if (warpPosition == null) { log.warn("Spawn location is not defined. Trying to select best location"); - warpPosition = new WarpPosition(Location.startPointLocation(), new Look(0, 0)); + warpPosition = new EntityLocation(0d, 10d, 0d, 0f, 0f, this); for (int y = WORLD_MAX_HEIGHT; y > 0; y --) { Chunk chunk = getChunk(0,y / WORLD_CHUNK_SIZE, 0); if (chunk.getBlock(0, y, 0).getBlockType() != BlockType.AIR) { - warpPosition = new WarpPosition(new Location(0, y + 1, 0), new Look(0, 0)); + warpPosition = new EntityLocation(0d, y + 1d, 0d, 0f, 0f, this); break; } } - warpPosition = new WarpPosition(Location.startPointLocation(), new Look(0,0)); + warpPosition = new EntityLocation(0d, 10d, 0d, 0f, 0f, this); } } } @@ -82,7 +81,7 @@ public class CubicWorld implements World { } @Override - public void setSpawn(WarpPosition warpPosition) { + public void setSpawn(EntityLocation warpPosition) { synchronized (spawnLocationLock) { this.warpPosition = warpPosition; } 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 90c735f..a411848 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 @@ -5,6 +5,7 @@ package mc.core.network.proto_1_12_2; import lombok.AllArgsConstructor; +import mc.core.EntityLocation; import mc.core.Location; import mc.core.player.Player; @@ -22,7 +23,7 @@ public class TeleportManager { @AllArgsConstructor private class TpData { public Player player; - public Location newLocation; + public EntityLocation newLocation; // TODO необходимо добавить TimeStamp, что бы понимать, когда клиент отвергнул телепортацию // т.е. идея такова: долгое молчание клиента знак отвержения телепортации. } @@ -32,7 +33,7 @@ public class TeleportManager { private TeleportManager() {} - public int append(Player player, Location location) { + public int append(Player player, EntityLocation location) { int teleportId; do { teleportId = RAND.nextInt(9999); @@ -45,7 +46,8 @@ public class TeleportManager { public void apply(int teleportId) { if (teleportMap.containsKey(teleportId)) { TpData data = teleportMap.remove(teleportId); - data.player.getLocation().set(data.newLocation); + data.player.getLocation().setXYZ(data.newLocation); + data.player.getLocation().setYawPitch(data.newLocation); } } 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 4133bbe..f2b0750 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 @@ -8,17 +8,15 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; -import mc.core.Location; +import mc.core.EntityLocation; import mc.core.network.*; -import mc.core.player.Look; @NoArgsConstructor @Getter @Setter @ToString public class PlayerPositionAndLookPacket implements SCPacket, CSPacket { - private Location location; - private Look look; + private EntityLocation location; private int teleportId; private boolean onGround = false; @@ -27,9 +25,9 @@ public class PlayerPositionAndLookPacket implements SCPacket, CSPacket { netStream.writeDouble(location.getX()); netStream.writeDouble(location.getY()); netStream.writeDouble(location.getZ()); - netStream.writeFloat(look.getYaw()); - netStream.writeFloat(look.getPitch()); - netStream.writeByte(0); // It's a bitfield, X/Y/Z/Y_ROT/X_ROT. If X is set, the x value is relative and not absolute. + netStream.writeFloat(location.getYaw()); + netStream.writeFloat(location.getPitch()); + netStream.writeByte(0); // It's a bitfield, X/Y/Z/Y_ROT/X_ROT. If X is setXYZ, the x value is relative and not absolute. /* X - 0x01 * Y - 0x02 * Z - 0x04 @@ -41,15 +39,13 @@ public class PlayerPositionAndLookPacket implements SCPacket, CSPacket { @Override public void readSelf(NetInputStream netStream) { - this.location = new Location( + this.location = new EntityLocation( + netStream.readDouble(), netStream.readDouble(), netStream.readDouble(), - netStream.readDouble() - ); - - this.look = new Look( netStream.readFloat(), - netStream.readFloat() + netStream.readFloat(), + null ); this.onGround = netStream.readBoolean(); diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/SpawnPositionPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/SpawnPositionPacket.java index 8b11502..ee18ebd 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/SpawnPositionPacket.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/SpawnPositionPacket.java @@ -19,8 +19,19 @@ import mc.core.network.SCPacket; public class SpawnPositionPacket implements SCPacket { private Location location; + private int floor_double(double value) { + int i = (int)value; + return value < (double)i ? i - 1 : i; + } + + private long location2long(Location location) { + return ((floor_double(location.getX()) & 0x3FFFFFF) << 38) + | ((floor_double(location.getY()) & 0xFFF) << 26) + | (floor_double(location.getZ()) & 0x3FFFFFF); + } + @Override public void writeSelf(NetOutputStream netStream) { - netStream.writeLong(location.toLong()); + netStream.writeLong(location2long(location)); } } 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 3251bbb..ffbfe50 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 @@ -21,7 +21,13 @@ public class TabCompletePacket implements CSPacket { this.hasPosition = netStream.readBoolean(); if (this.hasPosition) { - this.location = new Location(netStream.readLong()); + long compactValue = netStream.readLong(); + + double x = compactValue >> 38; + double y = (compactValue >> 26) & 0xFFF; + double z = compactValue << 38 >> 38; // is normal? + + this.location = new Location(x, y, z, null); } } } 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 efc67d3..6f0b90b 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 @@ -10,7 +10,6 @@ import mc.core.network.proto_1_12_2.State; import mc.core.network.proto_1_12_2.TeleportManager; import mc.core.network.proto_1_12_2.netty.wrappers.WrapperNetChannel; import mc.core.network.proto_1_12_2.packets.*; -import mc.core.player.Look; import mc.core.player.Player; import mc.core.player.PlayerManager; import mc.core.player.PlayerMode; @@ -48,8 +47,7 @@ public class LoginHandler extends AbstractStateHandler implements LoginStateHand Player player = playerManager.getPlayer(packet.getPlayerName()) .orElseGet(() -> playerManager.createPlayer( packet.getPlayerName(), - world.getSpawn().getLocation(), - new Look(0f, 0f))); + world.getSpawn())); channel.writeAndFlush(new LoginSuccessPacket( player.getUUID(), @@ -68,7 +66,7 @@ public class LoginHandler extends AbstractStateHandler implements LoginStateHand // Spawn Position SpawnPositionPacket pkt2 = new SpawnPositionPacket(); - pkt2.setLocation(world.getSpawn().getLocation()); + pkt2.setLocation(world.getSpawn()); channel.write(pkt2); // Player Abilities @@ -91,7 +89,6 @@ public class LoginHandler extends AbstractStateHandler implements LoginStateHand // Player Position And Look PlayerPositionAndLookPacket pkt4 = new PlayerPositionAndLookPacket(); pkt4.setLocation(player.getLocation()); - pkt4.setLook(player.getLook()); pkt4.setTeleportId(TeleportManager.getInstance().append(player, player.getLocation())); channel.writeAndFlush(pkt4); 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 2d789f9..4c5d96f 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 @@ -52,8 +52,8 @@ public class PlayHandler extends AbstractStateHandler implements PlayStateHandle @Handler public void onPositionAndLook(Channel channel, PlayerPositionAndLookPacket packet) { Player player = channel.attr(ATTR_PLAYER).get(); - player.getLocation().set(packet.getLocation()); - player.getLook().set(packet.getLook()); + player.getLocation().setXYZ(packet.getLocation()); + player.getLocation().setYawPitch(packet.getLocation()); } @Handler From 9b35c633339e81a3f8e5b71afef2c1f7832f364c Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 8 Aug 2018 13:23:40 +0300 Subject: [PATCH 5/7] optimize imports --- core/src/main/java/mc/core/player/InMemoryPlayerManager.java | 1 - core/src/main/java/mc/core/player/Player.java | 1 - core/src/main/java/mc/core/player/PlayerManager.java | 1 - core/src/main/java/mc/core/player/SimplePlayer.java | 1 - flat_world/src/main/java/mc/world/flat/FlatWorld.java | 5 ++++- .../main/java/mc/world/generated_world/world/CubicWorld.java | 5 ++--- .../java/mc/core/network/proto_1_12_2/TeleportManager.java | 1 - .../proto_1_12_2/packets/PlayerPositionAndLookPacket.java | 5 ++++- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/mc/core/player/InMemoryPlayerManager.java b/core/src/main/java/mc/core/player/InMemoryPlayerManager.java index a72c114..e0c511a 100644 --- a/core/src/main/java/mc/core/player/InMemoryPlayerManager.java +++ b/core/src/main/java/mc/core/player/InMemoryPlayerManager.java @@ -8,7 +8,6 @@ import lombok.Setter; import lombok.extern.slf4j.Slf4j; import mc.core.Config; import mc.core.EntityLocation; -import mc.core.Location; import mc.core.network.BroadcastNetChannel; import mc.core.network.NetChannel; import org.springframework.beans.factory.annotation.Autowired; diff --git a/core/src/main/java/mc/core/player/Player.java b/core/src/main/java/mc/core/player/Player.java index c2358f2..faf7877 100644 --- a/core/src/main/java/mc/core/player/Player.java +++ b/core/src/main/java/mc/core/player/Player.java @@ -5,7 +5,6 @@ package mc.core.player; import mc.core.EntityLocation; -import mc.core.Location; import mc.core.network.NetChannel; import java.util.UUID; diff --git a/core/src/main/java/mc/core/player/PlayerManager.java b/core/src/main/java/mc/core/player/PlayerManager.java index 6269f91..8e07d6e 100644 --- a/core/src/main/java/mc/core/player/PlayerManager.java +++ b/core/src/main/java/mc/core/player/PlayerManager.java @@ -5,7 +5,6 @@ package mc.core.player; import mc.core.EntityLocation; -import mc.core.Location; import mc.core.network.NetChannel; import java.util.List; diff --git a/core/src/main/java/mc/core/player/SimplePlayer.java b/core/src/main/java/mc/core/player/SimplePlayer.java index b45eacd..990e64f 100644 --- a/core/src/main/java/mc/core/player/SimplePlayer.java +++ b/core/src/main/java/mc/core/player/SimplePlayer.java @@ -6,7 +6,6 @@ package mc.core.player; import lombok.Data; import mc.core.EntityLocation; -import mc.core.Location; import mc.core.network.NetChannel; import java.util.UUID; 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 302ac1b..29ea78f 100644 --- a/flat_world/src/main/java/mc/world/flat/FlatWorld.java +++ b/flat_world/src/main/java/mc/world/flat/FlatWorld.java @@ -8,7 +8,10 @@ import com.flowpowered.nbt.Tag; import lombok.Getter; import lombok.Setter; import mc.core.EntityLocation; -import mc.core.world.*; +import mc.core.world.IWorldType; +import mc.core.world.Region; +import mc.core.world.World; +import mc.core.world.WorldType; import mc.core.world.chunk.Chunk; import java.util.UUID; diff --git a/generated_world/src/main/java/mc/world/generated_world/world/CubicWorld.java b/generated_world/src/main/java/mc/world/generated_world/world/CubicWorld.java index d5c8d34..e649b23 100644 --- a/generated_world/src/main/java/mc/world/generated_world/world/CubicWorld.java +++ b/generated_world/src/main/java/mc/world/generated_world/world/CubicWorld.java @@ -5,12 +5,11 @@ import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import mc.core.EntityLocation; -import mc.core.Location; -import mc.core.world.block.BlockType; -import mc.core.world.chunk.Chunk; import mc.core.world.IWorldType; import mc.core.world.Region; import mc.core.world.World; +import mc.core.world.block.BlockType; +import mc.core.world.chunk.Chunk; import org.springframework.beans.factory.annotation.Autowired; import java.util.HashMap; 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 a411848..951f098 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 @@ -6,7 +6,6 @@ package mc.core.network.proto_1_12_2; import lombok.AllArgsConstructor; import mc.core.EntityLocation; -import mc.core.Location; import mc.core.player.Player; import java.util.HashMap; 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 f2b0750..4c5ebaf 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 @@ -9,7 +9,10 @@ import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; import mc.core.EntityLocation; -import mc.core.network.*; +import mc.core.network.CSPacket; +import mc.core.network.NetInputStream; +import mc.core.network.NetOutputStream; +import mc.core.network.SCPacket; @NoArgsConstructor @Getter From 039b055260f8b43c9c7e17de7d34e8e55fab49ea Mon Sep 17 00:00:00 2001 From: Daniil Date: Fri, 10 Aug 2018 16:17:32 +0700 Subject: [PATCH 6/7] EntityLocation.clone() unit test --- .../src/main/java/mc/core/EntityLocation.java | 2 +- .../test/java/mc/core/EntityLocationTest.java | 100 ++++++++++++++++++ 2 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 core/src/test/java/mc/core/EntityLocationTest.java diff --git a/core/src/main/java/mc/core/EntityLocation.java b/core/src/main/java/mc/core/EntityLocation.java index edb92a3..0eec9d2 100644 --- a/core/src/main/java/mc/core/EntityLocation.java +++ b/core/src/main/java/mc/core/EntityLocation.java @@ -29,6 +29,6 @@ public class EntityLocation extends Location implements Cloneable { @Override public EntityLocation clone() { - return (EntityLocation) super.clone(); //TODO need test + return (EntityLocation) super.clone(); } } diff --git a/core/src/test/java/mc/core/EntityLocationTest.java b/core/src/test/java/mc/core/EntityLocationTest.java new file mode 100644 index 0000000..7e77fdc --- /dev/null +++ b/core/src/test/java/mc/core/EntityLocationTest.java @@ -0,0 +1,100 @@ +package mc.core; + +import com.flowpowered.nbt.Tag; +import mc.core.world.ChunkSection; +import mc.core.world.IWorldType; +import mc.core.world.Region; +import mc.core.world.World; +import org.junit.Assert; +import org.junit.Test; + +import java.util.UUID; +import java.util.stream.Stream; + +public class EntityLocationTest { + @Test + public void cloneTest() { + World dummyWorld = new World() { + @Override + public UUID getWorldId() { + return null; + } + + @Override + public IWorldType getWorldType() { + return null; + } + + @Override + public EntityLocation getSpawn() { + return null; + } + + @Override + public void setSpawn(EntityLocation location) { + + } + + @Override + public ChunkSection getChunk(int x, int y, int z) { + return null; + } + + @Override + public void setChunk(int x, int y, int z, ChunkSection chunkSection) { + + } + + @Override + public Region getRegion(int x, int z) { + return null; + } + + @Override + public void setRegion(int x, int z, Region region) { + + } + + @Override + public int getSeed() { + return 0; + } + + @Override + public String getName() { + return null; + } + + @Override + public void setName(String name) { + + } + + @Override + public Tag getTag(String name) { + return null; + } + + @Override + public void setTag(Tag tag) { + + } + + @Override + public Stream> tagStream() { + return null; + } + }; + + EntityLocation firstLocation = new EntityLocation(10, 20, 30, 40, 50, dummyWorld); + EntityLocation locationClone = firstLocation.clone(); + + Assert.assertEquals("X mismatch", firstLocation.getX(), locationClone.getX(), 0); + Assert.assertEquals("Y mismatch", firstLocation.getY(), locationClone.getY(), 0); + Assert.assertEquals("Z mismatch", firstLocation.getZ(), locationClone.getZ(), 0); + Assert.assertEquals("Pitch mismatch", firstLocation.getPitch(), locationClone.getPitch(), 0); + Assert.assertEquals("Yaw mismatch", firstLocation.getYaw(), locationClone.getYaw(), 0); + Assert.assertEquals("World mismatch", firstLocation.getWorld(), locationClone.getWorld()); + + } +} From 00aa03e4238e5759bb29fb33a3918c7895515c4d Mon Sep 17 00:00:00 2001 From: Daniil Date: Fri, 10 Aug 2018 16:29:16 +0700 Subject: [PATCH 7/7] Fixed ambiguous world checks --- core/src/test/java/mc/core/EntityLocationTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/test/java/mc/core/EntityLocationTest.java b/core/src/test/java/mc/core/EntityLocationTest.java index 7e77fdc..11727d4 100644 --- a/core/src/test/java/mc/core/EntityLocationTest.java +++ b/core/src/test/java/mc/core/EntityLocationTest.java @@ -87,6 +87,7 @@ public class EntityLocationTest { }; EntityLocation firstLocation = new EntityLocation(10, 20, 30, 40, 50, dummyWorld); + Assert.assertSame("Lost world reference before cloning", dummyWorld, firstLocation.getWorld()); EntityLocation locationClone = firstLocation.clone(); Assert.assertEquals("X mismatch", firstLocation.getX(), locationClone.getX(), 0); @@ -94,7 +95,6 @@ public class EntityLocationTest { Assert.assertEquals("Z mismatch", firstLocation.getZ(), locationClone.getZ(), 0); Assert.assertEquals("Pitch mismatch", firstLocation.getPitch(), locationClone.getPitch(), 0); Assert.assertEquals("Yaw mismatch", firstLocation.getYaw(), locationClone.getYaw(), 0); - Assert.assertEquals("World mismatch", firstLocation.getWorld(), locationClone.getWorld()); - + Assert.assertSame("World mismatch (accidental clone of the World object?)", firstLocation.getWorld(), locationClone.getWorld()); } }