Finished basic connection process

This commit is contained in:
Nanit
2020-11-26 10:42:18 +02:00
parent 78dc64f636
commit 011a48724d
19 changed files with 277 additions and 33 deletions

View File

@@ -4,8 +4,8 @@ import ru.nanit.limbo.protocol.registry.Version;
public interface Packet {
void encode(ByteMessage msg, Direction direction, Version version);
void encode(ByteMessage msg, Version version);
void decode(ByteMessage msg, Direction direction, Version version);
void decode(ByteMessage msg, Version version);
}

View File

@@ -5,7 +5,7 @@ import ru.nanit.limbo.protocol.registry.Version;
public interface PacketIn extends Packet {
@Override
default void encode(ByteMessage msg, Direction direction, Version version) {
default void encode(ByteMessage msg, Version version) {
// Can be ignored for incoming packets
}

View File

@@ -5,7 +5,7 @@ import ru.nanit.limbo.protocol.registry.Version;
public interface PacketOut extends Packet {
@Override
default void decode(ByteMessage msg, Direction direction, Version version) {
default void decode(ByteMessage msg, Version version) {
// Can be ignored for outgoing packets
}

View File

@@ -2,7 +2,6 @@ package ru.nanit.limbo.protocol.packets;
import ru.nanit.limbo.protocol.ByteMessage;
import ru.nanit.limbo.protocol.Packet;
import ru.nanit.limbo.protocol.Direction;
import ru.nanit.limbo.protocol.registry.Version;
public class PacketHandshake implements Packet {
@@ -45,7 +44,7 @@ public class PacketHandshake implements Packet {
}
@Override
public void encode(ByteMessage msg, Direction direction, Version version) {
public void encode(ByteMessage msg, Version version) {
msg.writeVarInt(this.version.getProtocolNumber());
msg.writeString(host);
msg.writeShort(port);
@@ -53,7 +52,7 @@ public class PacketHandshake implements Packet {
}
@Override
public void decode(ByteMessage msg, Direction direction, Version version) {
public void decode(ByteMessage msg, Version version) {
this.version = Version.of(msg.readVarInt());
this.host = msg.readString();
this.port = msg.readUnsignedShort();

View File

@@ -1,7 +1,6 @@
package ru.nanit.limbo.protocol.packets.login;
import ru.nanit.limbo.protocol.ByteMessage;
import ru.nanit.limbo.protocol.Direction;
import ru.nanit.limbo.protocol.PacketOut;
import ru.nanit.limbo.protocol.registry.Version;
@@ -14,7 +13,7 @@ public class PacketDisconnect implements PacketOut {
}
@Override
public void encode(ByteMessage msg, Direction direction, Version version) {
public void encode(ByteMessage msg, Version version) {
msg.writeString(String.format("{\"text\": \"%s\"}", reason));
}

View File

@@ -12,7 +12,7 @@ public class PacketLoginStart implements PacketIn {
}
@Override
public void decode(ByteMessage msg, Direction direction, Version version) {
public void decode(ByteMessage msg, Version version) {
this.username = msg.readString();
}

View File

@@ -1,7 +1,6 @@
package ru.nanit.limbo.protocol.packets.login;
import ru.nanit.limbo.protocol.ByteMessage;
import ru.nanit.limbo.protocol.Direction;
import ru.nanit.limbo.protocol.PacketOut;
import ru.nanit.limbo.protocol.registry.Version;
@@ -21,7 +20,7 @@ public class PacketLoginSuccess implements PacketOut {
}
@Override
public void encode(ByteMessage msg, Direction direction, Version version) {
public void encode(ByteMessage msg, Version version) {
msg.writeUuid(uuid);
msg.writeString(username);
}

View File

@@ -2,20 +2,16 @@ package ru.nanit.limbo.protocol.packets.play;
import net.kyori.adventure.nbt.CompoundBinaryTag;
import ru.nanit.limbo.protocol.ByteMessage;
import ru.nanit.limbo.protocol.Direction;
import ru.nanit.limbo.protocol.PacketOut;
import ru.nanit.limbo.protocol.registry.Version;
import java.util.List;
public class PacketJoinGame implements PacketOut {
private int entityId;
private boolean isHardcore = false;
private int gameMode = 2;
private int previousGameMode = -1;
private int worldCount = 1;
private List<String> worldNames;
private String[] worldNames;
private CompoundBinaryTag dimensionCodec;
private CompoundBinaryTag dimension;
private String worldName;
@@ -43,11 +39,7 @@ public class PacketJoinGame implements PacketOut {
this.previousGameMode = previousGameMode;
}
public void setWorldCount(int worldCount) {
this.worldCount = worldCount;
}
public void setWorldNames(List<String> worldNames) {
public void setWorldNames(String... worldNames) {
this.worldNames = worldNames;
}
@@ -92,8 +84,22 @@ public class PacketJoinGame implements PacketOut {
}
@Override
public void encode(ByteMessage msg, Direction direction, Version version) {
public void encode(ByteMessage msg, Version version) {
msg.writeInt(entityId);
msg.writeBoolean(isHardcore);
msg.writeByte(gameMode);
msg.writeByte(previousGameMode);
msg.writeStringsArray(worldNames);
msg.writeCompoundTag(dimensionCodec);
msg.writeCompoundTag(dimension);
msg.writeString(worldName);
msg.writeLong(hashedSeed);
msg.writeVarInt(maxPlayers);
msg.writeVarInt(viewDistance);
msg.writeBoolean(reducedDebugInfo);
msg.writeBoolean(enableRespawnScreen);
msg.writeBoolean(isDebug);
msg.writeBoolean(isFlat);
}
}

View File

@@ -0,0 +1,56 @@
package ru.nanit.limbo.protocol.packets.play;
import ru.nanit.limbo.protocol.ByteMessage;
import ru.nanit.limbo.protocol.PacketOut;
import ru.nanit.limbo.protocol.registry.Version;
public class PacketPlayerPositionAndLook implements PacketOut {
private double x;
private double y;
private double z;
private float yaw;
private float pitch;
private byte flags = 0x01;
private int teleportId;
public void setX(double x) {
this.x = x;
}
public void setY(double y) {
this.y = y;
}
public void setZ(double z) {
this.z = z;
}
public void setYaw(float yaw) {
this.yaw = yaw;
}
public void setPitch(float pitch) {
this.pitch = pitch;
}
public void setFlags(byte flags) {
this.flags = flags;
}
public void setTeleportId(int teleportId) {
this.teleportId = teleportId;
}
@Override
public void encode(ByteMessage msg, Version version) {
msg.writeDouble(x);
msg.writeDouble(y);
msg.writeDouble(z);
msg.writeFloat(yaw);
msg.writeFloat(pitch);
msg.writeByte(flags);
msg.writeVarInt(teleportId);
}
}

View File

@@ -0,0 +1,26 @@
package ru.nanit.limbo.protocol.packets.play;
import ru.nanit.limbo.protocol.ByteMessage;
import ru.nanit.limbo.protocol.PacketOut;
import ru.nanit.limbo.protocol.registry.Version;
public class PacketUpdateViewPos implements PacketOut {
private int chunkX;
private int chunkY;
public void setChunkX(int chunkX) {
this.chunkX = chunkX;
}
public void setChunkY(int chunkY) {
this.chunkY = chunkY;
}
@Override
public void encode(ByteMessage msg, Version version) {
msg.writeVarInt(chunkX);
msg.writeVarInt(chunkY);
}
}

View File

@@ -2,7 +2,6 @@ package ru.nanit.limbo.protocol.packets.status;
import ru.nanit.limbo.protocol.ByteMessage;
import ru.nanit.limbo.protocol.Packet;
import ru.nanit.limbo.protocol.Direction;
import ru.nanit.limbo.protocol.registry.Version;
public class PacketStatusPing implements Packet {
@@ -10,12 +9,12 @@ public class PacketStatusPing implements Packet {
private long randomId;
@Override
public void encode(ByteMessage msg, Direction direction, Version version) {
public void encode(ByteMessage msg, Version version) {
msg.writeLong(randomId);
}
@Override
public void decode(ByteMessage msg, Direction direction, Version version) {
public void decode(ByteMessage msg, Version version) {
this.randomId = msg.readLong();
}

View File

@@ -6,7 +6,7 @@ import ru.nanit.limbo.protocol.registry.Version;
public class PacketStatusRequest implements PacketIn {
@Override
public void decode(ByteMessage msg, Direction direction, Version version) {
public void decode(ByteMessage msg, Version version) {
}

View File

@@ -9,7 +9,7 @@ public class PacketStatusResponse implements PacketOut {
private static final String TEMPLATE = "{ \"version\": { \"name\": \"%s\", \"protocol\": %d }, \"players\": { \"max\": %d, \"online\": %d, \"sample\": [] }, \"description\": %s }";
@Override
public void encode(ByteMessage msg, Direction direction, Version version) {
public void encode(ByteMessage msg, Version version) {
String ver = LimboConfig.getPingData().getVersion();
String desc = LimboConfig.getPingData().getDescription();
String json = getResponseJson(ver, version.getProtocolNumber(), LimboConfig.getMaxPlayers(), 0, desc);

View File

@@ -30,7 +30,7 @@ public class PacketDecoder extends MessageToMessageDecoder<ByteBuf> {
if (packet != null){
try {
packet.decode(msg, Direction.SERVER, mappings.getVersion());
packet.decode(msg, mappings.getVersion());
} catch (Exception e){
Logger.warning("Cannot decode packet 0x%s: %s", Integer.toHexString(packetId), e.getMessage());
}

View File

@@ -5,7 +5,6 @@ import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;
import ru.nanit.limbo.protocol.ByteMessage;
import ru.nanit.limbo.protocol.Packet;
import ru.nanit.limbo.protocol.Direction;
import ru.nanit.limbo.protocol.registry.Version;
import ru.nanit.limbo.protocol.registry.State;
import ru.nanit.limbo.util.Logger;
@@ -35,7 +34,7 @@ public class PacketEncoder extends MessageToByteEncoder<Packet> {
msg.writeVarInt(packetId);
try {
packet.encode(msg, Direction.CLIENT, version);
packet.encode(msg, version);
} catch (Exception e){
Logger.warning("Cannot encode packet 0x%s: %s", Integer.toHexString(packetId), e.getMessage());
}

View File

@@ -4,6 +4,8 @@ import ru.nanit.limbo.protocol.Packet;
import ru.nanit.limbo.protocol.packets.*;
import ru.nanit.limbo.protocol.packets.login.*;
import ru.nanit.limbo.protocol.packets.play.PacketJoinGame;
import ru.nanit.limbo.protocol.packets.play.PacketPlayerPositionAndLook;
import ru.nanit.limbo.protocol.packets.play.PacketUpdateViewPos;
import ru.nanit.limbo.protocol.packets.status.PacketStatusPing;
import ru.nanit.limbo.protocol.packets.status.PacketStatusRequest;
import ru.nanit.limbo.protocol.packets.status.PacketStatusResponse;
@@ -37,6 +39,8 @@ public enum State {
PLAY(3){
{
clientBound.register(Version.V1_16_4, 0x24, PacketJoinGame::new);
clientBound.register(Version.V1_16_4, 0x34, PacketPlayerPositionAndLook::new);
clientBound.register(Version.V1_16_4, 0x40, PacketUpdateViewPos::new);
}
};