From f839be6079550747a8e063c63928fbfd7c5b9fdc Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Thu, 19 Apr 2018 08:18:00 +0300 Subject: [PATCH] SpawnPosition --- .../proto_125/netty/PacketHandler.java | 35 +++++++------------ .../proto_125/packets/PacketManager.java | 1 + .../packets/SpawnPositionPacket.java | 28 +++++++++++++++ 3 files changed, 41 insertions(+), 23 deletions(-) create mode 100644 src/main/java/mc/core/network/proto_125/packets/SpawnPositionPacket.java diff --git a/src/main/java/mc/core/network/proto_125/netty/PacketHandler.java b/src/main/java/mc/core/network/proto_125/netty/PacketHandler.java index 353479d..5d67500 100644 --- a/src/main/java/mc/core/network/proto_125/netty/PacketHandler.java +++ b/src/main/java/mc/core/network/proto_125/netty/PacketHandler.java @@ -3,24 +3,6 @@ * 2018-04-10 */ -/* -http://wiki.vg/index.php?title=Protocol_FAQ&oldid=76 --- -- -- -C - Client -S - Server --- -- -- -C -> S : Connects -C -> S : Sends handshake -S -> C : Sends handshake response -C -> S : After authenticating (if needed), sends the login packet -S -> C : Either kicks (invalid login) or sends a login response -S -> C : Sends pre-chunks and chunks and entities -S -> C : Sends spawn position -S -> C : Sends inventory [Need to verify this since inventory changed] (beta 1.1_02: looks like Window items with type=0, then a Set slot with window id = -1 and slot = -1) -S -> C : Tell the client they're ready to spawn by sending a position + look packet. Note: The stance and Y should be swapped when the server sends it to the client -C -> S : Sends a position + look packet to confirm the spawn position, with the stance and Y swapped back to the correct positions -*/ - package mc.core.network.proto_125.netty; import io.netty.channel.Channel; @@ -77,19 +59,26 @@ public class PacketHandler extends SimpleChannelInboundHandler { public void onLoginPacket(Channel channel, LoginPacket packet) { int pId = random.nextInt(9999); + Location spawnLoc = new Location(0, 65, 0); + NettyPlayer player = new NettyPlayer(); + player.setId(pId); + player.setName(packet.getPlayerName()); + player.setChannel(new WrapperNetChannel(channel)); + + // Response login packet.setPlayerId(pId); - packet.setLevelType("FLAT"); + packet.setLevelType("flat"); packet.setServerMode(1/*creative*/); packet.setDimension(0/*Overworld*/); packet.setDifficulty(0/*Peaceful*/); packet.setMaxPlayers(config.getMaxPlayers()); channel.write(packet); - NettyPlayer player = new NettyPlayer(); - player.setId(pId); - player.setName(packet.getPlayerName()); - player.setChannel(new WrapperNetChannel(channel)); + // send Spawn position + SpawnPositionPacket spawnPkt = new SpawnPositionPacket(); + spawnPkt.setLocation(spawnLoc); + channel.write(spawnPkt); PositionAndLookPacket pkt = new PositionAndLookPacket(); pkt.setLocation(new Location(0, 0, 0)); diff --git a/src/main/java/mc/core/network/proto_125/packets/PacketManager.java b/src/main/java/mc/core/network/proto_125/packets/PacketManager.java index 1a5e41e..59fe8bd 100644 --- a/src/main/java/mc/core/network/proto_125/packets/PacketManager.java +++ b/src/main/java/mc/core/network/proto_125/packets/PacketManager.java @@ -14,6 +14,7 @@ public class PacketManager { private static final BiMap> packetMap = ImmutableBiMap.>builder() .put(0x01, LoginPacket.class) .put(0x02, HandshakePacket.class) + .put(0x06, SpawnPositionPacket.class) .put(0x0D, PositionAndLookPacket.class) .put(0xFE, PingPacket.class) .put(0xFF, KickPacket.class) diff --git a/src/main/java/mc/core/network/proto_125/packets/SpawnPositionPacket.java b/src/main/java/mc/core/network/proto_125/packets/SpawnPositionPacket.java new file mode 100644 index 0000000..c5e0c0c --- /dev/null +++ b/src/main/java/mc/core/network/proto_125/packets/SpawnPositionPacket.java @@ -0,0 +1,28 @@ +/* + * DmitriyMX + * 2018-04-19 + */ +package mc.core.network.proto_125.packets; + +import lombok.Setter; +import lombok.ToString; +import mc.core.Location; +import mc.core.network.SCPacket; +import mc.core.network.proto_125.ByteArrayOutputNetStream; + +@Setter +@ToString +public class SpawnPositionPacket implements SCPacket { + private Location location; + + @Override + public byte[] toByteArray() { + ByteArrayOutputNetStream netStream = new ByteArrayOutputNetStream(); + + netStream.writeInt((int) location.getX()); + netStream.writeInt((int) location.getY()); + netStream.writeInt((int) location.getZ()); + + return netStream.toByteArray(); + } +}