diff --git a/src/main/java/org/adde0109/ambassador/AmbassadorConfig.java b/src/main/java/org/adde0109/ambassador/AmbassadorConfig.java index 6eddaf6..eca6c0e 100644 --- a/src/main/java/org/adde0109/ambassador/AmbassadorConfig.java +++ b/src/main/java/org/adde0109/ambassador/AmbassadorConfig.java @@ -25,10 +25,14 @@ public class AmbassadorConfig { @Expose private boolean bypassModCheck = false; - private AmbassadorConfig(boolean silenceWarnings, boolean bypassRegistryCheck, boolean bypassModCheck) { + @Expose + private boolean debugMode = false; + + private AmbassadorConfig(boolean silenceWarnings, boolean bypassRegistryCheck, boolean bypassModCheck, boolean debugMode) { this.silenceWarnings = silenceWarnings; this.bypassRegistryCheck = bypassRegistryCheck; this.bypassModCheck = bypassModCheck; + this.debugMode = debugMode; }; public static AmbassadorConfig read(Path path) throws IOException { @@ -74,7 +78,9 @@ public class AmbassadorConfig { boolean bypassModCheck = config.getOrElse("bypass-mod-checks", false); - return new AmbassadorConfig(bypassRegistryCheck, bypassModCheck, silenceWarnings); + boolean debugMode = config.getOrElse("debug-mode", false); + + return new AmbassadorConfig(bypassRegistryCheck, bypassModCheck, silenceWarnings, debugMode); } public int getServerSwitchCancellationTime() { @@ -92,4 +98,8 @@ public class AmbassadorConfig { public boolean isBypassModCheck() { return bypassModCheck; } + + public boolean isDebugMode() { + return debugMode; + } } diff --git a/src/main/java/org/adde0109/ambassador/forge/VelocityForgeBackendConnectionPhase.java b/src/main/java/org/adde0109/ambassador/forge/VelocityForgeBackendConnectionPhase.java index d3afe91..6143c77 100644 --- a/src/main/java/org/adde0109/ambassador/forge/VelocityForgeBackendConnectionPhase.java +++ b/src/main/java/org/adde0109/ambassador/forge/VelocityForgeBackendConnectionPhase.java @@ -8,6 +8,8 @@ import com.velocitypowered.proxy.network.Connections; import com.velocitypowered.proxy.protocol.ProtocolUtils; import com.velocitypowered.proxy.protocol.packet.AvailableCommands; import com.velocitypowered.proxy.protocol.packet.PluginMessage; +import net.kyori.adventure.identity.Identity; +import net.kyori.adventure.text.Component; import org.adde0109.ambassador.Ambassador; import org.adde0109.ambassador.forge.packet.*; import org.adde0109.ambassador.forge.pipeline.CommandDecoderErrorCatcher; @@ -85,6 +87,12 @@ public enum VelocityForgeBackendConnectionPhase implements BackendConnectionPhas } else { if (message instanceof ModListPacket modListPacket) { remainingRegistries = new CountDownLatch(modListPacket.getRegistries().size()); + + if (Ambassador.getInstance().config.isDebugMode()) + player.sendMessage(Component.text("Expecting " + modListPacket.getRegistries().size() + + " packets from server " + server.getServer().getServerInfo().getName())); + + long time = System.currentTimeMillis(); CompletableFuture.runAsync(() -> { try { remainingRegistries.await(); @@ -92,10 +100,20 @@ public enum VelocityForgeBackendConnectionPhase implements BackendConnectionPhas throw new RuntimeException(e); } }).thenAcceptAsync((v) -> { + + if(Ambassador.getInstance().config.isDebugMode()) { + player.sendMessage(Component.text("Handshake took: " + (System.currentTimeMillis()-time)/1000 + " seconds")); + player.sendMessage(Component.text("Avg packet time" + + ((System.currentTimeMillis()-time)/1000)/modListPacket.getRegistries().size() + " seconds")); + } + if (Ambassador.getInstance().config.isBypassRegistryCheck() || clientPhase.forgeHandshake.isCompatible(handshake)) { server.ensureConnected().write(clientPhase.forgeHandshake.getModListReplyPacket()); } else { + Ambassador.getInstance().logger.error("Unable to switch due to the registries of " + + server.getServer().getServerInfo().getName() + " being different from the registries of " + + player.getConnectedServer().getServer().getServerInfo().getName()); server.disconnect(); } }, server.ensureConnected().eventLoop()); diff --git a/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java b/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java index b7f7989..8c62006 100644 --- a/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java +++ b/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java @@ -14,6 +14,7 @@ import com.velocitypowered.proxy.protocol.packet.LoginPluginMessage; import com.velocitypowered.proxy.protocol.packet.PluginMessage; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; +import net.kyori.adventure.text.Component; import org.adde0109.ambassador.Ambassador; import org.adde0109.ambassador.forge.packet.Context; import org.adde0109.ambassador.forge.packet.IForgeLoginWrapperPacket; @@ -197,9 +198,17 @@ public enum VelocityForgeClientConnectionPhase implements ClientConnectionPhase COMPLETE.onTransitionToNewPhase(player); COMPLETE.forgeHandshake = forgeHandshake; } + + if (Ambassador.getInstance().config.isDebugMode()) { + player.sendMessage(Component.text("Forge handshake complete")); + player.sendMessage(Component.text(resettable ? "Resettable" : "Non-resettable")); + } } private boolean isResettable(ConnectedPlayer player) { + if (Ambassador.getInstance().config.isDebugMode()) { + player.sendMessage(Component.text("Scanning modlist for client reset mods")); + } if (player.getModInfo().isPresent()) { return player.getModInfo().get().getMods().stream().anyMatch((mod -> mod.getId().equals("clientresetpacket"))); } diff --git a/src/main/resources/default-ambassador.toml b/src/main/resources/default-ambassador.toml index 3a24bec..a0e3922 100644 --- a/src/main/resources/default-ambassador.toml +++ b/src/main/resources/default-ambassador.toml @@ -15,4 +15,7 @@ bypass-registry-checks = false # Allow player to switch without reset when the server's mods don't match. Even more unstable than bypassRegistryCheck. # Warning: This is a safety measure for when bypassRegistryCheck is true. Setting this to also true can cause crashes. -bypass-mod-checks = false \ No newline at end of file +bypass-mod-checks = false + +#Only for debug/troubleshooting +debug-mode = false \ No newline at end of file