diff --git a/src/main/java/de/bixilon/minosoft/objects/Difficulty.java b/src/main/java/de/bixilon/minosoft/objects/Difficulty.java new file mode 100644 index 000000000..1b943e6f3 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/objects/Difficulty.java @@ -0,0 +1,27 @@ +package de.bixilon.minosoft.objects; + +public enum Difficulty { + PEACEFUL(0), + EASY(1), + NORMAL(2), + HARD(3); + + int id; + + Difficulty(int id) { + this.id = id; + } + + public static Difficulty byId(int id) { + for (Difficulty g : values()) { + if (g.getId() == id) { + return g; + } + } + return null; + } + + public int getId() { + return id; + } +} diff --git a/src/main/java/de/bixilon/minosoft/objects/Dimension.java b/src/main/java/de/bixilon/minosoft/objects/Dimension.java new file mode 100644 index 000000000..660be6946 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/objects/Dimension.java @@ -0,0 +1,26 @@ +package de.bixilon.minosoft.objects; + +public enum Dimension { + NETHER(-1), + OVERWORLD(0), + END(1); + + int id; + + Dimension(int id) { + this.id = id; + } + + public static Dimension byId(int id) { + for (Dimension g : values()) { + if (g.getId() == id) { + return g; + } + } + return null; + } + + public int getId() { + return id; + } +} diff --git a/src/main/java/de/bixilon/minosoft/objects/GameMode.java b/src/main/java/de/bixilon/minosoft/objects/GameMode.java new file mode 100644 index 000000000..22b3640d0 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/objects/GameMode.java @@ -0,0 +1,27 @@ +package de.bixilon.minosoft.objects; + +public enum GameMode { + SURVIVAL(0), + CREATIVE(1), + ADVENTURE(3), + SPECTATOR(4); + + int id; + + GameMode(int id) { + this.id = id; + } + + public static GameMode byId(int id) { + for (GameMode g : values()) { + if (g.getId() == id) { + return g; + } + } + return null; + } + + public int getId() { + return id; + } +} diff --git a/src/main/java/de/bixilon/minosoft/objects/LevelType.java b/src/main/java/de/bixilon/minosoft/objects/LevelType.java new file mode 100644 index 000000000..0d7b532cf --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/objects/LevelType.java @@ -0,0 +1,30 @@ +package de.bixilon.minosoft.objects; + +public enum LevelType { + DEFAULT("default"), + FLAT("flat"), + LARGE_BIOMES("largeBiomes"), + AMPLIFIED("amplified"), + DEFAULT_1_1("default_1_1"), + CUSTOMIZED("customized"), + BUFFET("buffet"); + + String type; + + LevelType(String type) { + this.type = type; + } + + public static LevelType byType(String type) { + for (LevelType g : values()) { + if (g.getId().equals(type)) { + return g; + } + } + return null; + } + + public String getId() { + return type; + } +} diff --git a/src/main/java/de/bixilon/minosoft/protocol/network/Network.java b/src/main/java/de/bixilon/minosoft/protocol/network/Network.java index a3fe1799a..63f9a6039 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/network/Network.java +++ b/src/main/java/de/bixilon/minosoft/protocol/network/Network.java @@ -7,9 +7,7 @@ import de.bixilon.minosoft.protocol.packets.serverbound.login.PacketEncryptionRe import de.bixilon.minosoft.protocol.protocol.*; import de.bixilon.minosoft.util.Util; -import javax.crypto.BadPaddingException; import javax.crypto.Cipher; -import javax.crypto.IllegalBlockSizeException; import javax.crypto.SecretKey; import java.io.DataInputStream; import java.io.DataOutputStream; @@ -124,24 +122,16 @@ public class Network { byte[] raw = p.write(connection.getVersion()).getOutBytes(); if (encryptionEnabled) { // encrypt - byte[] encrypted; - try { - encrypted = cipherEncrypt.doFinal(raw); - } catch (IllegalBlockSizeException | BadPaddingException e) { - Log.fatal("Failed to encrypt!"); - e.printStackTrace(); - binQueue.remove(0); - continue; - } + byte[] encrypted = cipherEncrypt.update(raw); binQueue.add(encrypted); } else { + if (p instanceof PacketEncryptionResponse) { + // enable encryption + enableEncryption(((PacketEncryptionResponse) p).getSecretKey()); + } binQueue.add(raw); } queue.remove(0); - if (p instanceof PacketEncryptionResponse) { - // enable encryption - enableEncryption(((PacketEncryptionResponse) p).getSecretKey()); - } } while (binQueueIn.size() > 0) { @@ -150,23 +140,16 @@ public class Network { InPacketBuffer inPacketBuffer; if (encryptionEnabled) { // decrypt - byte[] decrypted; - try { - decrypted = cipherDecrypt.doFinal(raw); - } catch (IllegalBlockSizeException | BadPaddingException e) { - Log.fatal("Failed to decrypt!"); - e.printStackTrace(); - binQueueIn.remove(0); - continue; - } + byte[] decrypted = cipherDecrypt.update(raw); inPacketBuffer = new InPacketBuffer(decrypted); } else { inPacketBuffer = new InPacketBuffer(raw); } - Class clazz = Protocol.getPacketByPacket(connection.getVersion().getProtocol().getPacketByCommand(connection.getConnectionState(), inPacketBuffer.getCommand())); + Packets.Clientbound p = connection.getVersion().getProtocol().getPacketByCommand(connection.getConnectionState(), inPacketBuffer.getCommand()); + Class clazz = Protocol.getPacketByPacket(p); if (clazz == null) { - Log.warn("[IN] Unknown packet with command " + inPacketBuffer.getCommand()); + Log.warn(String.format("[IN] Unknown packet with command %x (%s)", inPacketBuffer.getCommand(), ((p != null) ? p.name() : "UNKNOWN"))); binQueueIn.remove(0); continue; } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketJoinGame.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketJoinGame.java new file mode 100644 index 000000000..46829dc07 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketJoinGame.java @@ -0,0 +1,53 @@ +package de.bixilon.minosoft.protocol.packets.clientbound.play; + +import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.objects.Difficulty; +import de.bixilon.minosoft.objects.Dimension; +import de.bixilon.minosoft.objects.GameMode; +import de.bixilon.minosoft.objects.LevelType; +import de.bixilon.minosoft.protocol.packets.ClientboundPacket; +import de.bixilon.minosoft.protocol.protocol.InPacketBuffer; +import de.bixilon.minosoft.protocol.protocol.PacketHandler; +import de.bixilon.minosoft.protocol.protocol.ProtocolVersion; +import de.bixilon.minosoft.util.BitByte; + +public class PacketJoinGame implements ClientboundPacket { + int entityId; + boolean hardcore; + GameMode gameMode; + Dimension dimension; + Difficulty difficulty; + int maxPlayers; + LevelType levelType; + + + @Override + public void read(InPacketBuffer buffer, ProtocolVersion v) { + switch (v) { + case VERSION_1_7_10: + this.entityId = buffer.readInteger(); + byte gameModeRaw = buffer.readByte(); + hardcore = BitByte.isBitSet(gameModeRaw, 3); + // remove hardcore bit and get gamemode + gameModeRaw &= ~0x8; + gameMode = GameMode.byId(gameModeRaw); + + dimension = Dimension.byId(buffer.readByte()); + difficulty = Difficulty.byId(buffer.readByte()); + maxPlayers = buffer.readByte(); + levelType = LevelType.byType(buffer.readString()); + break; + } + log(); + } + + @Override + public void log() { + Log.protocol(String.format("Receiving join game packet (entityId=%s, gameMode=%s, dimension=%s, difficulty=%s)", entityId, gameMode.name(), dimension.name(), difficulty.name())); + } + + @Override + public void handle(PacketHandler h) { + h.handle(this); + } +} diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java b/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java index 63d241f23..ab7fd7c36 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java @@ -4,6 +4,7 @@ import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.clientbound.login.PacketEncryptionKeyRequest; import de.bixilon.minosoft.protocol.packets.clientbound.login.PacketLoginSuccess; +import de.bixilon.minosoft.protocol.packets.clientbound.play.PacketJoinGame; import de.bixilon.minosoft.protocol.packets.clientbound.status.PacketStatusPong; import de.bixilon.minosoft.protocol.packets.clientbound.status.PacketStatusResponse; import de.bixilon.minosoft.protocol.packets.serverbound.login.PacketEncryptionResponse; @@ -44,4 +45,7 @@ public class PacketHandler { // now we are playing connection.setConnectionState(ConnectionState.PLAY); } + + public void handle(PacketJoinGame pkg) { + } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol.java b/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol.java index c67e2a32a..584e9774f 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol.java +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol.java @@ -3,6 +3,7 @@ package de.bixilon.minosoft.protocol.protocol; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.packets.clientbound.login.PacketEncryptionKeyRequest; import de.bixilon.minosoft.protocol.packets.clientbound.login.PacketLoginSuccess; +import de.bixilon.minosoft.protocol.packets.clientbound.play.PacketJoinGame; import de.bixilon.minosoft.protocol.packets.clientbound.status.PacketStatusPong; import de.bixilon.minosoft.protocol.packets.clientbound.status.PacketStatusResponse; @@ -30,5 +31,7 @@ public interface Protocol { packetClassMapping.put(Packets.Clientbound.STATUS_PONG, PacketStatusPong.class); packetClassMapping.put(Packets.Clientbound.LOGIN_ENCRYPTION_REQUEST, PacketEncryptionKeyRequest.class); packetClassMapping.put(Packets.Clientbound.LOGIN_LOGIN_SUCCESS, PacketLoginSuccess.class); + + packetClassMapping.put(Packets.Clientbound.PLAY_JOIN_GAME, PacketJoinGame.class); } } \ No newline at end of file diff --git a/src/main/java/de/bixilon/minosoft/util/BitByte.java b/src/main/java/de/bixilon/minosoft/util/BitByte.java new file mode 100644 index 000000000..061107452 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/util/BitByte.java @@ -0,0 +1,10 @@ +package de.bixilon.minosoft.util; + +public class BitByte { + public static boolean isBitSet(byte in, int pos) { + boolean bitSet; + int mask = 1 << pos; + bitSet = ((in & mask) == mask); + return bitSet; + } +}