Merge pull request #45 from RaphiMC/main

Added 1.7.x support
This commit is contained in:
Max 2022-12-11 13:20:52 +02:00 committed by GitHub
commit 8fee9a4426
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 109 additions and 76 deletions

View File

@ -22,6 +22,7 @@ The general features:
Symbol `X` means all minor versions. Symbol `X` means all minor versions.
- [x] 1.7.X
- [x] 1.8.X - [x] 1.8.X
- [x] 1.9.X - [x] 1.9.X
- [x] 1.10.X - [x] 1.10.X

View File

@ -46,6 +46,7 @@ import java.security.InvalidKeyException;
import java.security.MessageDigest; import java.security.MessageDigest;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;
public class ClientConnection extends ChannelInboundHandlerAdapter { public class ClientConnection extends ChannelInboundHandlerAdapter {
@ -123,41 +124,48 @@ public class ClientConnection extends ChannelInboundHandlerAdapter {
return; return;
} }
writePacket(PacketSnapshots.PACKET_LOGIN_SUCCESS); sendPacket(PacketSnapshots.PACKET_LOGIN_SUCCESS);
updateState(State.PLAY); updateState(State.PLAY);
server.getConnections().addConnection(this); server.getConnections().addConnection(this);
writePacket(PacketSnapshots.PACKET_JOIN_GAME); Runnable sendPlayPackets = () -> {
writePacket(PacketSnapshots.PACKET_PLAYER_ABILITIES); writePacket(PacketSnapshots.PACKET_JOIN_GAME);
writePacket(PacketSnapshots.PACKET_PLAYER_POS); writePacket(PacketSnapshots.PACKET_PLAYER_ABILITIES);
if (clientVersion.moreOrEqual(Version.V1_19_3)) { writePacket(PacketSnapshots.PACKET_PLAYER_POS);
writePacket(PacketSnapshots.PACKET_SPAWN_POSITION);
if (clientVersion.moreOrEqual(Version.V1_19_3))
writePacket(PacketSnapshots.PACKET_SPAWN_POSITION);
if (server.getConfig().isUsePlayerList() || clientVersion.equals(Version.V1_16_4))
writePacket(PacketSnapshots.PACKET_PLAYER_INFO);
if (clientVersion.moreOrEqual(Version.V1_13)) {
writePacket(PacketSnapshots.PACKET_DECLARE_COMMANDS);
if (PacketSnapshots.PACKET_PLUGIN_MESSAGE != null)
writePacket(PacketSnapshots.PACKET_PLUGIN_MESSAGE);
}
if (PacketSnapshots.PACKET_BOSS_BAR != null && clientVersion.moreOrEqual(Version.V1_9))
writePacket(PacketSnapshots.PACKET_BOSS_BAR);
if (PacketSnapshots.PACKET_JOIN_MESSAGE != null)
writePacket(PacketSnapshots.PACKET_JOIN_MESSAGE);
if (PacketSnapshots.PACKET_TITLE_TITLE != null && clientVersion.moreOrEqual(Version.V1_8))
writeTitle();
if (PacketSnapshots.PACKET_HEADER_AND_FOOTER != null && clientVersion.moreOrEqual(Version.V1_8))
writePacket(PacketSnapshots.PACKET_HEADER_AND_FOOTER);
sendKeepAlive();
};
if (clientVersion.lessOrEqual(Version.V1_7_6)) {
this.channel.eventLoop().schedule(sendPlayPackets, 100, TimeUnit.MILLISECONDS);
} else {
sendPlayPackets.run();
} }
if (server.getConfig().isUsePlayerList() || clientVersion.equals(Version.V1_16_4))
writePacket(PacketSnapshots.PACKET_PLAYER_INFO);
if (clientVersion.moreOrEqual(Version.V1_13)) {
writePacket(PacketSnapshots.PACKET_DECLARE_COMMANDS);
if (PacketSnapshots.PACKET_PLUGIN_MESSAGE != null)
writePacket(PacketSnapshots.PACKET_PLUGIN_MESSAGE);
}
if (PacketSnapshots.PACKET_BOSS_BAR != null && clientVersion.moreOrEqual(Version.V1_9))
writePacket(PacketSnapshots.PACKET_BOSS_BAR);
if (PacketSnapshots.PACKET_JOIN_MESSAGE != null)
writePacket(PacketSnapshots.PACKET_JOIN_MESSAGE);
if (PacketSnapshots.PACKET_TITLE_TITLE != null)
writeTitle();
if (PacketSnapshots.PACKET_HEADER_AND_FOOTER != null)
writePacket(PacketSnapshots.PACKET_HEADER_AND_FOOTER);
sendKeepAlive();
} }
public void disconnectLogin(String reason) { public void disconnectLogin(String reason) {

View File

@ -40,8 +40,10 @@ public class PacketLoginSuccess implements PacketOut {
public void encode(ByteMessage msg, Version version) { public void encode(ByteMessage msg, Version version) {
if (version.moreOrEqual(Version.V1_16)) { if (version.moreOrEqual(Version.V1_16)) {
msg.writeUuid(uuid); msg.writeUuid(uuid);
} else { } else if (version.moreOrEqual(Version.V1_7_6)) {
msg.writeString(uuid.toString()); msg.writeString(uuid.toString());
} else {
msg.writeString(uuid.toString().replace("-", ""));
} }
msg.writeString(username); msg.writeString(username);
if (version.moreOrEqual(Version.V1_19)) { if (version.moreOrEqual(Version.V1_19)) {

View File

@ -46,11 +46,9 @@ public class PacketChatMessage implements PacketOut {
msg.writeString(jsonData); msg.writeString(jsonData);
if (version.moreOrEqual(Version.V1_19_1)) { if (version.moreOrEqual(Version.V1_19_1)) {
msg.writeBoolean(position.index == PositionLegacy.ACTION_BAR.index); msg.writeBoolean(position.index == PositionLegacy.ACTION_BAR.index);
} } else if (version.moreOrEqual(Version.V1_19)) {
else if (version.moreOrEqual(Version.V1_19)) {
msg.writeVarInt(position.index); msg.writeVarInt(position.index);
} } else if (version.moreOrEqual(Version.V1_8)) {
else {
msg.writeByte(position.index); msg.writeByte(position.index);
} }

View File

@ -99,6 +99,14 @@ public class PacketJoinGame implements PacketOut {
public void encode(ByteMessage msg, Version version) { public void encode(ByteMessage msg, Version version) {
msg.writeInt(entityId); msg.writeInt(entityId);
if (version.fromTo(Version.V1_7_2, Version.V1_7_6)) {
msg.writeByte(gameMode == 3 ? 1 : gameMode);
msg.writeByte(dimensionRegistry.getDefaultDimension_1_16().getId());
msg.writeByte(0); // Difficulty
msg.writeByte(maxPlayers);
msg.writeString("flat"); // Level type
}
if (version.fromTo(Version.V1_8, Version.V1_9)) { if (version.fromTo(Version.V1_8, Version.V1_9)) {
msg.writeByte(gameMode); msg.writeByte(gameMode);
msg.writeByte(dimensionRegistry.getDefaultDimension_1_16().getId()); msg.writeByte(dimensionRegistry.getDefaultDimension_1_16().getId());

View File

@ -37,8 +37,10 @@ public class PacketKeepAlive implements Packet {
public void encode(ByteMessage msg, Version version) { public void encode(ByteMessage msg, Version version) {
if (version.moreOrEqual(Version.V1_12_2)) { if (version.moreOrEqual(Version.V1_12_2)) {
msg.writeLong(id); msg.writeLong(id);
} else { } else if (version.moreOrEqual(Version.V1_8)) {
msg.writeVarInt((int) id); msg.writeVarInt((int) id);
} else {
msg.writeInt((int) id);
} }
} }
@ -46,8 +48,10 @@ public class PacketKeepAlive implements Packet {
public void decode(ByteMessage msg, Version version) { public void decode(ByteMessage msg, Version version) {
if (version.moreOrEqual(Version.V1_12_2)) { if (version.moreOrEqual(Version.V1_12_2)) {
this.id = msg.readLong(); this.id = msg.readLong();
} else { } else if (version.moreOrEqual(Version.V1_8)) {
this.id = msg.readVarInt(); this.id = msg.readVarInt();
} else {
this.id = msg.readInt();
} }
} }

View File

@ -47,39 +47,44 @@ public class PacketPlayerInfo implements PacketOut {
@Override @Override
public void encode(ByteMessage msg, Version version) { public void encode(ByteMessage msg, Version version) {
if (version.moreOrEqual(Version.V1_19_3)) { if (version.less(Version.V1_8)) {
EnumSet<Action> actions = EnumSet.noneOf(Action.class); msg.writeString(username);
actions.add(Action.ADD_PLAYER); msg.writeBoolean(true); // Is online
actions.add(Action.UPDATE_LISTED); msg.writeShort(0);
actions.add(Action.UPDATE_GAMEMODE); } else {
msg.writeEnumSet(actions, Action.class); if (version.moreOrEqual(Version.V1_19_3)) {
EnumSet<Action> actions = EnumSet.noneOf(Action.class);
actions.add(Action.ADD_PLAYER);
actions.add(Action.UPDATE_LISTED);
actions.add(Action.UPDATE_GAMEMODE);
msg.writeEnumSet(actions, Action.class);
msg.writeVarInt(1); // Array length (1 element) msg.writeVarInt(1); // Array length (1 element)
msg.writeUuid(uuid); // UUID msg.writeUuid(uuid); // UUID
msg.writeString(username); //Username msg.writeString(username); //Username
msg.writeVarInt(0); //Properties (0 is empty) msg.writeVarInt(0); //Properties (0 is empty)
msg.writeBoolean(true); //Update listed msg.writeBoolean(true); //Update listed
msg.writeVarInt(gameMode); //Gamemode
msg.writeVarInt(gameMode); //Gamemode return;
}
return;
} msg.writeVarInt(0); // Add player action
msg.writeVarInt(0); // Add player action msg.writeVarInt(1);
msg.writeVarInt(1); msg.writeUuid(uuid);
msg.writeUuid(uuid); msg.writeString(username);
msg.writeString(username); msg.writeVarInt(0);
msg.writeVarInt(0); msg.writeVarInt(gameMode);
msg.writeVarInt(gameMode); msg.writeVarInt(60);
msg.writeVarInt(60);
msg.writeBoolean(false);
if (version.moreOrEqual(Version.V1_19)) {
msg.writeBoolean(false); msg.writeBoolean(false);
if (version.moreOrEqual(Version.V1_19)) {
msg.writeBoolean(false);
}
} }
} }
public static enum Action { public static enum Action {
ADD_PLAYER, ADD_PLAYER,
INITIALIZE_CHAT, INITIALIZE_CHAT,
UPDATE_GAMEMODE, UPDATE_GAMEMODE,

View File

@ -62,15 +62,18 @@ public class PacketPlayerPositionAndLook implements PacketOut {
@Override @Override
public void encode(ByteMessage msg, Version version) { public void encode(ByteMessage msg, Version version) {
msg.writeDouble(x); msg.writeDouble(x);
msg.writeDouble(y); msg.writeDouble(y + (version.less(Version.V1_8) ? 1.62F : 0));
msg.writeDouble(z); msg.writeDouble(z);
msg.writeFloat(yaw); msg.writeFloat(yaw);
msg.writeFloat(pitch); msg.writeFloat(pitch);
if (version.less(Version.V1_9)) { if (version.moreOrEqual(Version.V1_8)) {
msg.writeBoolean(true); // On ground
} else {
msg.writeByte(flags); msg.writeByte(flags);
} else {
msg.writeBoolean(true);
}
if (version.moreOrEqual(Version.V1_9)) {
msg.writeVarInt(teleportId); msg.writeVarInt(teleportId);
} }

View File

@ -77,7 +77,7 @@ public enum State {
PLAY(3) { PLAY(3) {
{ {
serverBound.register(PacketKeepAlive::new, serverBound.register(PacketKeepAlive::new,
map(0x00, V1_8, V1_8), map(0x00, V1_7_2, V1_8),
map(0x0B, V1_9, V1_11_1), map(0x0B, V1_9, V1_11_1),
map(0x0C, V1_12, V1_12), map(0x0C, V1_12, V1_12),
map(0x0B, V1_12_1, V1_12_2), map(0x0B, V1_12_1, V1_12_2),
@ -100,7 +100,7 @@ public enum State {
map(0x0E, V1_19_3, V1_19_3) map(0x0E, V1_19_3, V1_19_3)
); );
clientBound.register(PacketJoinGame::new, clientBound.register(PacketJoinGame::new,
map(0x01, V1_8, V1_8), map(0x01, V1_7_2, V1_8),
map(0x23, V1_9, V1_12_2), map(0x23, V1_9, V1_12_2),
map(0x25, V1_13, V1_14_4), map(0x25, V1_13, V1_14_4),
map(0x26, V1_15, V1_15_2), map(0x26, V1_15, V1_15_2),
@ -123,7 +123,7 @@ public enum State {
map(0x15, V1_19_3, V1_19_3) map(0x15, V1_19_3, V1_19_3)
); );
clientBound.register(PacketPlayerAbilities::new, clientBound.register(PacketPlayerAbilities::new,
map(0x39, V1_8, V1_8), map(0x39, V1_7_2, V1_8),
map(0x2B, V1_9, V1_12), map(0x2B, V1_9, V1_12),
map(0x2C, V1_12_1, V1_12_2), map(0x2C, V1_12_1, V1_12_2),
map(0x2E, V1_13, V1_13_2), map(0x2E, V1_13, V1_13_2),
@ -137,7 +137,7 @@ public enum State {
map(0x30, V1_19_3, V1_19_3) map(0x30, V1_19_3, V1_19_3)
); );
clientBound.register(PacketPlayerPositionAndLook::new, clientBound.register(PacketPlayerPositionAndLook::new,
map(0x08, V1_8, V1_8), map(0x08, V1_7_2, V1_8),
map(0x2E, V1_9, V1_12), map(0x2E, V1_9, V1_12),
map(0x2F, V1_12_1, V1_12_2), map(0x2F, V1_12_1, V1_12_2),
map(0x32, V1_13, V1_13_2), map(0x32, V1_13, V1_13_2),
@ -151,7 +151,7 @@ public enum State {
map(0x38, V1_19_3, V1_19_3) map(0x38, V1_19_3, V1_19_3)
); );
clientBound.register(PacketKeepAlive::new, clientBound.register(PacketKeepAlive::new,
map(0x00, V1_8, V1_8), map(0x00, V1_7_2, V1_8),
map(0x1F, V1_9, V1_12_2), map(0x1F, V1_9, V1_12_2),
map(0x21, V1_13, V1_13_2), map(0x21, V1_13, V1_13_2),
map(0x20, V1_14, V1_14_4), map(0x20, V1_14, V1_14_4),
@ -164,7 +164,7 @@ public enum State {
map(0x1F, V1_19_3, V1_19_3) map(0x1F, V1_19_3, V1_19_3)
); );
clientBound.register(PacketChatMessage::new, clientBound.register(PacketChatMessage::new,
map(0x02, V1_8, V1_8), map(0x02, V1_7_2, V1_8),
map(0x0F, V1_9, V1_12_2), map(0x0F, V1_9, V1_12_2),
map(0x0E, V1_13, V1_14_4), map(0x0E, V1_13, V1_14_4),
map(0x0F, V1_15, V1_15_2), map(0x0F, V1_15, V1_15_2),
@ -182,7 +182,7 @@ public enum State {
map(0x0A, V1_19, V1_19_3) map(0x0A, V1_19, V1_19_3)
); );
clientBound.register(PacketPlayerInfo::new, clientBound.register(PacketPlayerInfo::new,
map(0x38, V1_8, V1_8), map(0x38, V1_7_2, V1_8),
map(0x2D, V1_9, V1_12), map(0x2D, V1_9, V1_12),
map(0x2E, V1_12_1, V1_12_2), map(0x2E, V1_12_1, V1_12_2),
map(0x30, V1_13, V1_13_2), map(0x30, V1_13, V1_13_2),

View File

@ -23,6 +23,10 @@ import java.util.Map;
public enum Version { public enum Version {
UNDEFINED(-1), UNDEFINED(-1),
V1_7_2(4),
// 1.7.2-1.7.5 has same protocol numbers
V1_7_6(5),
// 1.7.6-1.7.10 has same protocol numbers
V1_8(47), V1_8(47),
// 1.8-1.8.8 has same protocol numbers // 1.8-1.8.8 has same protocol numbers
V1_9(107), V1_9(107),
@ -120,7 +124,7 @@ public enum Version {
} }
public static Version getMin() { public static Version getMin() {
return V1_8; return V1_7_2;
} }
public static Version getMax() { public static Version getMax() {