From 6a4e83bc28196ca5c0e4e65ab3eae65e608c8c81 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Tue, 23 Jun 2020 22:19:18 +0200 Subject: [PATCH] fix some reconnecting bugs, todo for position (1 coordinate buggy) --- src/main/java/de/bixilon/minosoft/Minosoft.java | 1 + .../minosoft/protocol/network/Connection.java | 15 +++++++++++---- .../minosoft/protocol/network/Network.java | 3 ++- .../minosoft/protocol/protocol/InByteBuffer.java | 15 ++++++++++++++- .../minosoft/protocol/protocol/PacketHandler.java | 2 -- 5 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/Minosoft.java b/src/main/java/de/bixilon/minosoft/Minosoft.java index 89c067bbb..628264c75 100644 --- a/src/main/java/de/bixilon/minosoft/Minosoft.java +++ b/src/main/java/de/bixilon/minosoft/Minosoft.java @@ -48,6 +48,7 @@ public class Minosoft { Log.info(String.format("Loaded config file (version=%s)", config.getInteger(GameConfiguration.CONFIG_VERSION))); // set log level from config Log.setLevel(LogLevel.byName(config.getString(GameConfiguration.GENERAL_LOG_LEVEL))); + Log.info(String.format("Logging info with level: %s", Log.getLevel().name())); checkClientToken(); diff --git a/src/main/java/de/bixilon/minosoft/protocol/network/Connection.java b/src/main/java/de/bixilon/minosoft/protocol/network/Connection.java index cd520ed67..4f0598bd0 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/network/Connection.java +++ b/src/main/java/de/bixilon/minosoft/protocol/network/Connection.java @@ -35,8 +35,8 @@ public class Connection { private final int port; private final Network network; private final PacketHandler handler; - private final PluginChannelHandler pluginChannelHandler; private final ArrayList handlingQueue; + private PluginChannelHandler pluginChannelHandler; Thread handleThread; ProtocolVersion version = ProtocolVersion.VERSION_1_7_10; // default private Player player; @@ -49,14 +49,13 @@ public class Connection { network = new Network(this); handlingQueue = new ArrayList<>(); handler = new PacketHandler(this); - pluginChannelHandler = new PluginChannelHandler(this); - registerDefaultChannels(); } /** * Sends an server ping to the server (player count, motd, ...) */ public void ping() { + Log.info(String.format("Pinging server: %s:%d", host, port)); reason = ConnectionReason.PING; network.connect(); } @@ -65,6 +64,7 @@ public class Connection { * Tries to connect to the server and login */ public void connect() { + Log.info(String.format("Connecting to server: %s:%d", host, port)); if (reason == null) { // first get version, then login reason = ConnectionReason.GET_VERSION; @@ -97,7 +97,7 @@ public class Connection { network.startPacketThread(); startHandlingThread(); ConnectionState next = ((reason == ConnectionReason.CONNECT) ? ConnectionState.LOGIN : ConnectionState.STATUS); - network.sendPacket(new PacketHandshake(getHost(), getPort(), next, next == ConnectionState.STATUS ? -1 : getVersion().getVersion())); + network.sendPacket(new PacketHandshake(getHost(), getPort(), next, (next == ConnectionState.STATUS) ? -1 : getVersion().getVersion())); // after sending it, switch to next state setConnectionState(next); break; @@ -108,7 +108,14 @@ public class Connection { break; case LOGIN: network.sendPacket(new PacketLoginStart(player)); + pluginChannelHandler = new PluginChannelHandler(this); + registerDefaultChannels(); break; + case DISCONNECTED: + if (reason == ConnectionReason.GET_VERSION) { + setReason(ConnectionReason.CONNECT); + connect(); + } } } 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 c88201deb..ce204d11d 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/network/Network.java +++ b/src/main/java/de/bixilon/minosoft/protocol/network/Network.java @@ -43,6 +43,7 @@ public class Network { private Cipher cipherEncrypt; private Cipher cipherDecrypt; private Thread packetThread; + Thread socketThread; private boolean connected; public Network(Connection c) { @@ -60,7 +61,7 @@ public class Network { // everything sent for now, waiting for data // add to queue // Could not connect - Thread socketThread = new Thread(() -> { + socketThread = new Thread(() -> { try { socket = new Socket(connection.getHost(), connection.getPort()); connected = true; diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.java b/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.java index 15671bdf4..da90cfd6a 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.java +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.java @@ -176,8 +176,21 @@ public class InByteBuffer { } public BlockPosition readPosition() { + //ToDo: here is something wrong with z :( Long raw = readLong(); - return new BlockPosition(Long.valueOf(raw >>> 38).intValue(), Long.valueOf(raw & 0xFFF).shortValue(), Long.valueOf(raw << 26 >>> 38).intValue()); + int x = (int) (raw >> 38); + short y = (short) (raw & 0xFFF); + int z = (int) (raw >> 12) & 0x3FFFFFF; + if (x >= (2 ^ 25)) { + x -= 2 ^ 26; + } + if (y >= (2 ^ 11)) { + y -= 2 ^ 12; + } + if (z >= (2 ^ 25)) { + z -= 2 ^ 26; + } + return new BlockPosition(x, y, z); } @Override 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 6b9582add..77e33e6c1 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java @@ -67,8 +67,6 @@ public class PacketHandler { // reconnect... connection.disconnect(); Log.info(String.format("Server is running on version %s, reconnecting...", connection.getVersion().getName())); - connection.setReason(ConnectionReason.CONNECT); - connection.connect(); break; case CONNECT: // do nothing