From dcef09c1d5615d1adfaa935b571e428deeddbfe9 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Tue, 12 Jun 2018 16:37:23 +0300 Subject: [PATCH] =?UTF-8?q?=D1=83=D1=81=D0=BF=D0=B5=D1=88=D0=BD=D1=8B?= =?UTF-8?q?=D0=B9=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/mc/core/network/NetStream.java | 3 +- .../mc/core/player/InMemoryPlayerManager.java | 1 + core/src/main/java/mc/core/player/Player.java | 3 + .../main/java/mc/core/player/PlayerMode.java | 4 +- .../java/mc/core/player/SimplePlayer.java | 12 ++++ .../network/proto_125/NetStream_p125.java | 5 ++ .../ByteArrayOutputNetStream.java | 5 ++ .../mc/core/network/proto_1_12_2/State.java | 30 +++++++--- .../packets/ClientSettingsPacket.java | 48 ++++++++++++++++ .../packets/DisconnectPacket.java | 2 +- .../proto_1_12_2/packets/JoinGamePacket.java | 36 ++++++++++++ .../packets/LoginSuccessPacket.java | 31 ++++++++++ .../packets/PlayerAbilitiesPacket.java | 38 +++++++++++++ .../packets/PlayerPositionAndLookPacket.java | 43 ++++++++++++++ .../packets/PluginMessagePacket.java | 38 +++++++++++++ .../packets/SpawnPositionPacket.java | 27 +++++++++ .../packets/TeleportConfirmPacket.java | 21 +++++++ .../serializers/LocationSerializer.java | 27 +++++++++ .../{ => serializers}/TextSerializer.java | 2 +- .../proto_1_12_2/netty/PacketDecoder.java | 1 + .../proto_1_12_2/netty/PacketHandler.java | 56 ++++++++++++++++++- .../netty/wrappers/WrapperNetStream.java | 5 ++ 22 files changed, 425 insertions(+), 13 deletions(-) create mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ClientSettingsPacket.java create mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/JoinGamePacket.java create mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/LoginSuccessPacket.java create mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerAbilitiesPacket.java create mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerPositionAndLookPacket.java create mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PluginMessagePacket.java create mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/SpawnPositionPacket.java create mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TeleportConfirmPacket.java create mode 100644 proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/serializers/LocationSerializer.java rename proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/{ => serializers}/TextSerializer.java (96%) diff --git a/core/src/main/java/mc/core/network/NetStream.java b/core/src/main/java/mc/core/network/NetStream.java index e947393..1709f4e 100644 --- a/core/src/main/java/mc/core/network/NetStream.java +++ b/core/src/main/java/mc/core/network/NetStream.java @@ -10,7 +10,7 @@ import lombok.Setter; public abstract class NetStream { @Getter @Setter - private int expectedSize; + private int dataSize; public abstract boolean readBoolean(); public abstract byte readByte(); @@ -27,6 +27,7 @@ public abstract class NetStream { public abstract void writeBoolean(boolean value); public abstract void writeByte(int value); + public abstract void writeUnsignedByte(int value); public abstract void writeBytes(byte[] buffer); public abstract void writeShort(int value); public abstract void writeInt(int value); diff --git a/core/src/main/java/mc/core/player/InMemoryPlayerManager.java b/core/src/main/java/mc/core/player/InMemoryPlayerManager.java index 10b1b0e..a9ef55e 100644 --- a/core/src/main/java/mc/core/player/InMemoryPlayerManager.java +++ b/core/src/main/java/mc/core/player/InMemoryPlayerManager.java @@ -34,6 +34,7 @@ public class InMemoryPlayerManager implements PlayerManager, Runnable { public Player createPlayer(String name, Location defaultLocation, Look defaultLook) { 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); diff --git a/core/src/main/java/mc/core/player/Player.java b/core/src/main/java/mc/core/player/Player.java index 84e894e..f63c729 100644 --- a/core/src/main/java/mc/core/player/Player.java +++ b/core/src/main/java/mc/core/player/Player.java @@ -7,8 +7,11 @@ package mc.core.player; import mc.core.Location; import mc.core.network.NetChannel; +import java.util.UUID; + public interface Player { int getId(); + UUID getUUID(); String getName(); boolean isOnline(); diff --git a/core/src/main/java/mc/core/player/PlayerMode.java b/core/src/main/java/mc/core/player/PlayerMode.java index 3ee2048..cd6d1ed 100644 --- a/core/src/main/java/mc/core/player/PlayerMode.java +++ b/core/src/main/java/mc/core/player/PlayerMode.java @@ -11,7 +11,9 @@ import lombok.RequiredArgsConstructor; @Getter public enum PlayerMode { SURVIVAL(0), - CREATIVE(1); + CREATIVE(1), + ADVENTURE(2), + SPECTATOR(3); private final int id; } diff --git a/core/src/main/java/mc/core/player/SimplePlayer.java b/core/src/main/java/mc/core/player/SimplePlayer.java index 430fac2..18d6caa 100644 --- a/core/src/main/java/mc/core/player/SimplePlayer.java +++ b/core/src/main/java/mc/core/player/SimplePlayer.java @@ -8,9 +8,12 @@ import lombok.Data; import mc.core.Location; import mc.core.network.NetChannel; +import java.util.UUID; + @Data public class SimplePlayer implements Player { private int id; + private UUID uuid; private String name; private boolean online = false; private NetChannel channel; @@ -25,4 +28,13 @@ public class SimplePlayer implements Player { public void setLook(Look look) { this.look.set(look); } + + @Override + public UUID getUUID() { + return uuid; + } + + public void setUUID(UUID uuid) { + this.uuid = uuid; + } } diff --git a/proto125/src/main/java/mc/core/network/proto_125/NetStream_p125.java b/proto125/src/main/java/mc/core/network/proto_125/NetStream_p125.java index 917d8ab..548f07a 100644 --- a/proto125/src/main/java/mc/core/network/proto_125/NetStream_p125.java +++ b/proto125/src/main/java/mc/core/network/proto_125/NetStream_p125.java @@ -52,4 +52,9 @@ public abstract class NetStream_p125 extends NetStream { public long readLong() { return 0; //FIXME } + + @Override + public void writeUnsignedByte(int value) { + writeByte(value); //FIXME + } } diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/ByteArrayOutputNetStream.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/ByteArrayOutputNetStream.java index b757282..99b2d5a 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/ByteArrayOutputNetStream.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/ByteArrayOutputNetStream.java @@ -69,6 +69,11 @@ public class ByteArrayOutputNetStream extends NetStream_p340 { baos.write(value); } + @Override + public void writeUnsignedByte(int value) { + baos.write((byte)(value & 0xFF)); + } + @Override public void writeBytes(byte[] buffer) { baos.write(buffer, 0, buffer.length); diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/State.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/State.java index 7e9e2bd..8699e10 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/State.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/State.java @@ -19,26 +19,41 @@ public enum State { UNKNOWN(-1, null, null), HANDSHAKE(0, ImmutableBiMap.>builder() - .put(0, HandshakePacket.class) + .put(0x00, HandshakePacket.class) .build(), null ), STATUS(1, ImmutableBiMap.>builder() - .put(0, StatusRequestPacket.class) - .put(1, PingPacket.class) + .put(0x00, StatusRequestPacket.class) + .put(0x01, PingPacket.class) .build(), ImmutableBiMap., Integer>builder() - .put(StatusResponsePacket.class, 0) - .put(PingPacket.class, 1) + .put(StatusResponsePacket.class, 0x00) + .put(PingPacket.class, 0x01) .build() ), LOGIN(2, ImmutableBiMap.>builder() - .put(0, LoginStartPacket.class) + .put(0x00, LoginStartPacket.class) .build(), ImmutableBiMap., Integer>builder() - .put(DisconnectPacket.class, 0) + .put(DisconnectPacket.class, 0x00) + .put(LoginSuccessPacket.class, 0x02) + .build() + ), + PLAY(3, + ImmutableBiMap.>builder() + .put(0x00, TeleportConfirmPacket.class) + .put(0x04, ClientSettingsPacket.class) + .put(0x09, PluginMessagePacket.class) + .build(), + ImmutableBiMap., Integer>builder() + .put(PluginMessagePacket.class, 0x18) + .put(JoinGamePacket.class, 0x23) + .put(SpawnPositionPacket.class, 0x46) + .put(PlayerAbilitiesPacket.class, 0x2C) + .put(PlayerPositionAndLookPacket.class, 0x2F) .build() ); @@ -46,6 +61,7 @@ public enum State { if (id == 0) return HANDSHAKE; else if (id == 1) return STATUS; else if (id == 2) return LOGIN; + else if (id == 3) return PLAY; else { log.warn("Unknown state: {}", id); return UNKNOWN; diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ClientSettingsPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ClientSettingsPacket.java new file mode 100644 index 0000000..8a2072d --- /dev/null +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ClientSettingsPacket.java @@ -0,0 +1,48 @@ +/* + * DmitriyMX + * 2018-06-11 + */ +package mc.core.network.proto_1_12_2.packets; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.ToString; +import mc.core.network.CSPacket; +import mc.core.network.NetStream; + +@NoArgsConstructor +@Getter +@ToString +public class ClientSettingsPacket implements CSPacket { + private String locale; + private int viewDistance; + private int chatMode; + private boolean chatColors; + private boolean capeEnabled, + jacketEnabled, + leftSleeveEnabled, + rightSleeveEnabled, + leftPantsLegEnabled, + rightPantsLegEnabled, + hatEnabled; + private int mainHand; + + @Override + public void readSelf(NetStream netStream) { + locale = netStream.readString(); + viewDistance = netStream.readByte(); + chatMode = netStream.readVarInt(); + chatColors = netStream.readBoolean(); + + int bitmask = netStream.readUnsignedByte(); + capeEnabled = (bitmask & 0x01) > 0; + jacketEnabled = (bitmask & 0x02) > 0; + leftSleeveEnabled = (bitmask & 0x04) > 0; + rightSleeveEnabled = (bitmask & 0x08) > 0; + leftPantsLegEnabled = (bitmask & 0x10) > 0; + rightPantsLegEnabled = (bitmask & 0x20) > 0; + hatEnabled = (bitmask & 0x40) > 0; + + mainHand = netStream.readVarInt(); + } +} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/DisconnectPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/DisconnectPacket.java index 8ce508b..7eb15c1 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/DisconnectPacket.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/DisconnectPacket.java @@ -9,7 +9,7 @@ import lombok.NoArgsConstructor; import lombok.Setter; import mc.core.network.SCPacket; import mc.core.network.proto_1_12_2.ByteArrayOutputNetStream; -import mc.core.network.proto_1_12_2.TextSerializer; +import mc.core.network.proto_1_12_2.serializers.TextSerializer; import mc.core.text.Text; @AllArgsConstructor diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/JoinGamePacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/JoinGamePacket.java new file mode 100644 index 0000000..c5023e2 --- /dev/null +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/JoinGamePacket.java @@ -0,0 +1,36 @@ +/* + * DmitriyMX + * 2018-06-11 + */ +package mc.core.network.proto_1_12_2.packets; + +import lombok.NoArgsConstructor; +import lombok.Setter; +import mc.core.network.SCPacket; +import mc.core.network.proto_1_12_2.ByteArrayOutputNetStream; +import mc.core.player.PlayerMode; + +@NoArgsConstructor +@Setter +public class JoinGamePacket implements SCPacket { + private int entityId; + private PlayerMode mode; + private int dimension; + private int difficulty; + private String levelType; + + @Override + public byte[] toByteArray() { + ByteArrayOutputNetStream netStream = new ByteArrayOutputNetStream(); + + netStream.writeInt(entityId); + netStream.writeUnsignedByte(mode.getId()); + netStream.writeInt(dimension); + netStream.writeUnsignedByte(difficulty); + netStream.writeUnsignedByte(0); // Max Players, unused + netStream.writeString(levelType); + netStream.writeBoolean(false); // Reduced Debug Info + + return netStream.toByteArray(); + } +} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/LoginSuccessPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/LoginSuccessPacket.java new file mode 100644 index 0000000..06d5130 --- /dev/null +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/LoginSuccessPacket.java @@ -0,0 +1,31 @@ +/* + * DmitriyMX + * 2018-06-11 + */ +package mc.core.network.proto_1_12_2.packets; + +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Setter; +import mc.core.network.SCPacket; +import mc.core.network.proto_1_12_2.ByteArrayOutputNetStream; + +import java.util.UUID; + +@AllArgsConstructor +@NoArgsConstructor +@Setter +public class LoginSuccessPacket implements SCPacket { + private UUID uuid; + private String playerName; + + @Override + public byte[] toByteArray() { + ByteArrayOutputNetStream netStream = new ByteArrayOutputNetStream(); + + netStream.writeString(uuid.toString()); + netStream.writeString(playerName); + + return netStream.toByteArray(); + } +} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerAbilitiesPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerAbilitiesPacket.java new file mode 100644 index 0000000..1a70c8e --- /dev/null +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerAbilitiesPacket.java @@ -0,0 +1,38 @@ +/* + * DmitriyMX + * 2018-06-11 + */ +package mc.core.network.proto_1_12_2.packets; + +import lombok.NoArgsConstructor; +import lombok.Setter; +import mc.core.network.SCPacket; +import mc.core.network.proto_1_12_2.ByteArrayOutputNetStream; + +@NoArgsConstructor +@Setter +public class PlayerAbilitiesPacket implements SCPacket { + private boolean godMode = false; + private boolean flying = false; + private boolean canFly = false; + private boolean instantDestroyBlocks = false; + private float flyingSpeed = 0.05f; + private float fieldOfView = flyingSpeed; + + @Override + public byte[] toByteArray() { + ByteArrayOutputNetStream netStream = new ByteArrayOutputNetStream(); + + byte flag = 0; + if (godMode) flag = (byte)(flag | 0x01); + if (flying) flag = (byte)(flag | 0x02); + if (canFly) flag = (byte)(flag | 0x04); + if (instantDestroyBlocks) flag = (byte)(flag | 0x08); + + netStream.writeByte(flag); + netStream.writeFloat(flyingSpeed); + netStream.writeFloat(fieldOfView); + + return netStream.toByteArray(); + } +} 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 new file mode 100644 index 0000000..584fb1c --- /dev/null +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PlayerPositionAndLookPacket.java @@ -0,0 +1,43 @@ +/* + * DmitriyMX + * 2018-06-11 + */ +package mc.core.network.proto_1_12_2.packets; + +import lombok.NoArgsConstructor; +import lombok.Setter; +import mc.core.Location; +import mc.core.network.SCPacket; +import mc.core.network.proto_1_12_2.ByteArrayOutputNetStream; +import mc.core.player.Look; + +import java.util.Random; + +@NoArgsConstructor +@Setter +public class PlayerPositionAndLookPacket implements SCPacket { + private static Random RANDOM = new Random(); + private Location location; + private Look look; + + @Override + public byte[] toByteArray() { + ByteArrayOutputNetStream netStream = new ByteArrayOutputNetStream(); + + 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. + /* X - 0x01 + * Y - 0x02 + * Z - 0x04 + * Y_ROT - 0x08 + * X_ROT - 0x10 + */ + netStream.writeVarInt(RANDOM.nextInt()); // Client should confirm this packet with Teleport Confirm containing the same Teleport ID + + return netStream.toByteArray(); + } +} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PluginMessagePacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PluginMessagePacket.java new file mode 100644 index 0000000..0187f03 --- /dev/null +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/PluginMessagePacket.java @@ -0,0 +1,38 @@ +/* + * DmitriyMX + * 2018-06-11 + */ +package mc.core.network.proto_1_12_2.packets; + +import lombok.*; +import mc.core.network.CSPacket; +import mc.core.network.NetStream; +import mc.core.network.SCPacket; +import mc.core.network.proto_1_12_2.ByteArrayOutputNetStream; + +@AllArgsConstructor +@NoArgsConstructor +@Getter +@Setter +@ToString +public class PluginMessagePacket implements SCPacket, CSPacket { + private String channelName; + private byte[] data; + + @Override + public void readSelf(NetStream netStream) { + channelName = netStream.readString(); + data = new byte[netStream.getDataSize() - channelName.getBytes().length - 1]; + netStream.readBytes(data); + } + + @Override + public byte[] toByteArray() { + ByteArrayOutputNetStream netStream = new ByteArrayOutputNetStream(); + + netStream.writeString(channelName); + netStream.writeBytes(data); + + return netStream.toByteArray(); + } +} 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 new file mode 100644 index 0000000..d011cad --- /dev/null +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/SpawnPositionPacket.java @@ -0,0 +1,27 @@ +/* + * DmitriyMX + * 2018-06-11 + */ +package mc.core.network.proto_1_12_2.packets; + +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.Setter; +import mc.core.Location; +import mc.core.network.SCPacket; +import mc.core.network.proto_1_12_2.ByteArrayOutputNetStream; +import mc.core.network.proto_1_12_2.serializers.LocationSerializer; + +@AllArgsConstructor +@NoArgsConstructor +@Setter +public class SpawnPositionPacket implements SCPacket { + private Location location; + + @Override + public byte[] toByteArray() { + ByteArrayOutputNetStream netStream = new ByteArrayOutputNetStream(); + netStream.writeLong(LocationSerializer.serialize(location)); + return netStream.toByteArray(); + } +} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TeleportConfirmPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TeleportConfirmPacket.java new file mode 100644 index 0000000..a1fe944 --- /dev/null +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/TeleportConfirmPacket.java @@ -0,0 +1,21 @@ +/* + * DmitriyMX + * 2018-06-12 + */ +package mc.core.network.proto_1_12_2.packets; + +import lombok.Getter; +import lombok.ToString; +import mc.core.network.CSPacket; +import mc.core.network.NetStream; + +@Getter +@ToString +public class TeleportConfirmPacket implements CSPacket { + private int teleportId; + + @Override + public void readSelf(NetStream netStream) { + teleportId = netStream.readVarInt(); + } +} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/serializers/LocationSerializer.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/serializers/LocationSerializer.java new file mode 100644 index 0000000..3fd1318 --- /dev/null +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/serializers/LocationSerializer.java @@ -0,0 +1,27 @@ +/* + * DmitriyMX + * 2018-06-11 + */ +package mc.core.network.proto_1_12_2.serializers; + +import mc.core.Location; + +public class LocationSerializer { + private static int floor_double(double value) { + int i = (int)value; + return value < (double)i ? i - 1 : i; + } + + public static long serialize(Location location) { + return ((floor_double(location.getX()) & 0x3FFFFFF) << 38) + | ((floor_double(location.getY()) & 0xFFF) << 26) + | (floor_double(location.getZ()) & 0x3FFFFFF); + } + + public static Location deserialize(long location) { + return new Location( + location >> 38, + (location >> 26) & 0xFFF, + location << 38 >> 38); + } +} diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/TextSerializer.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/serializers/TextSerializer.java similarity index 96% rename from proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/TextSerializer.java rename to proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/serializers/TextSerializer.java index b7f8b3a..9fb9fb3 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/TextSerializer.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/serializers/TextSerializer.java @@ -2,7 +2,7 @@ * DmitriyMX * 2018-06-11 */ -package mc.core.network.proto_1_12_2; +package mc.core.network.proto_1_12_2.serializers; import com.google.gson.JsonArray; import com.google.gson.JsonObject; diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketDecoder.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketDecoder.java index fb996a4..4ff49b3 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketDecoder.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketDecoder.java @@ -51,6 +51,7 @@ public class PacketDecoder extends ByteToMessageDecoder { log.warn("Unknown packet: {}:{}", state.name(), packetId); in.skipBytes(packetSize - rb); } else { + netStream.setDataSize(packetSize - rb); CSPacket packet = packetClass.newInstance(); packet.readSelf(netStream); log.debug("Known packet: {}:{}", state.name(), packet.toString()); diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketHandler.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketHandler.java index a46c265..3dc3255 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketHandler.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketHandler.java @@ -5,6 +5,7 @@ package mc.core.network.proto_1_12_2.netty; import io.netty.channel.Channel; +import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.util.AttributeKey; @@ -14,11 +15,12 @@ import mc.core.chat.ChatProcessor; import mc.core.network.CSPacket; import mc.core.network.proto_1_12_2.State; 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; import mc.core.text.Text; import mc.core.text.TextColor; -import mc.core.text.TextStyle; import mc.core.world.World; import org.springframework.beans.factory.annotation.Autowired; @@ -92,6 +94,56 @@ public class PacketHandler extends SimpleChannelInboundHandler { private void onLoginStart(Channel channel, LoginStartPacket packet) { if (!channel.attr(ATTR_STATE).get().equals(State.LOGIN)) return; - channel.writeAndFlush(new DisconnectPacket(Text.of("Server is not ready :(", null, TextStyle.ITALIC))); + + Optional optPlayer = playerManager.getPlayer(packet.getPlayerName()); + if (optPlayer.isPresent() && optPlayer.get().isOnline()) { + channel.writeAndFlush(new DisconnectPacket( + Text.builder("Player \"") + .append(Text.of(packet.getPlayerName(), TextColor.YELLOW)) + .append(Text.of("\" is online", TextColor.WHITE)) + .build())) + .addListener(ChannelFutureListener.CLOSE); + } else { + Player player = playerManager.getPlayer(packet.getPlayerName()) + .orElseGet(() -> playerManager.createPlayer( + packet.getPlayerName(), + world.getSpawn(), + new Look(0f, 0f))); + + channel.writeAndFlush(new LoginSuccessPacket( + player.getUUID(), + packet.getPlayerName())); + channel.attr(ATTR_PLAYER).set(player); + channel.attr(ATTR_STATE).set(State.PLAY); + + // Join Game + JoinGamePacket pkt1 = new JoinGamePacket(); + pkt1.setEntityId(player.getId()); + pkt1.setMode(PlayerMode.CREATIVE); + pkt1.setDimension(0/*Overworld*/); + pkt1.setDifficulty(0/*Peaceful*/); + pkt1.setLevelType("flat"); + channel.write(pkt1); + + // Spawn Position + SpawnPositionPacket pkt2 = new SpawnPositionPacket(); + pkt2.setLocation(world.getSpawn()); + channel.write(pkt2); + + // Player Abilities + PlayerAbilitiesPacket pkt3 = new PlayerAbilitiesPacket(); + pkt3.setCanFly(true); + pkt3.setFlying(true); + pkt3.setGodMode(true); + pkt3.setInstantDestroyBlocks(true); + channel.write(pkt2); + channel.flush(); + + // Player Position And Look + PlayerPositionAndLookPacket pkt4 = new PlayerPositionAndLookPacket(); + pkt4.setLocation(player.getLocation()); + pkt4.setLook(player.getLook()); + channel.writeAndFlush(pkt4); + } } } diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/wrappers/WrapperNetStream.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/wrappers/WrapperNetStream.java index d782e4b..19d688c 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/wrappers/WrapperNetStream.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/wrappers/WrapperNetStream.java @@ -74,6 +74,11 @@ public class WrapperNetStream extends NetStream_p340 { byteBuf.writeByte(value); } + @Override + public void writeUnsignedByte(int value) { + byteBuf.writeByte((byte)(value & 0xFF)); + } + @Override public void writeBytes(byte[] buffer) { byteBuf.writeBytes(buffer);