More descriptive disconnect messages for outdated Java servers

This commit is contained in:
Camotoy 2022-03-18 10:51:22 -04:00
parent 0829b5cd4e
commit 607e97f988
No known key found for this signature in database
GPG Key ID: 7EEFB66FE798081F
3 changed files with 38 additions and 18 deletions

View File

@ -100,7 +100,7 @@ public class GeyserSession {
}
public void login() {
this.handle.login();
throw new UnsupportedOperationException();
}
public void authenticate(String username) {
@ -120,7 +120,7 @@ public class GeyserSession {
}
public void close() {
this.handle.close();
throw new UnsupportedOperationException();
}
public void executeInEventLoop(Runnable runnable) {

View File

@ -625,17 +625,6 @@ public class GeyserSession implements GeyserConnection, CommandSender {
upstream.sendPacket(gamerulePacket);
}
public void login() {
if (this.remoteAuthType != AuthType.ONLINE) {
if (this.remoteAuthType == AuthType.OFFLINE) {
geyser.getLogger().info(GeyserLocale.getLocaleStringLog("geyser.auth.login.offline"));
} else {
geyser.getLogger().info(GeyserLocale.getLocaleStringLog("geyser.auth.login.floodgate"));
}
authenticate(authData.name());
}
}
public void authenticate(String username) {
authenticate(username, "");
}
@ -1046,10 +1035,6 @@ public class GeyserSession implements GeyserConnection, CommandSender {
closed = true;
}
public void close() {
disconnect(GeyserLocale.getPlayerLocaleString("geyser.network.close", getClientData().getLanguageCode()));
}
/**
* Executes a task and prints a stack trace if an error occurs.
*/

View File

@ -26,7 +26,13 @@
package org.geysermc.geyser.translator.protocol.java;
import com.github.steveice10.mc.protocol.packet.login.clientbound.ClientboundLoginDisconnectPacket;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.TranslatableComponent;
import org.geysermc.common.PlatformType;
import org.geysermc.geyser.network.MinecraftProtocol;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.text.GeyserLocale;
import org.geysermc.geyser.translator.protocol.PacketTranslator;
import org.geysermc.geyser.translator.protocol.Translator;
import org.geysermc.geyser.translator.text.MessageTranslator;
@ -36,8 +42,37 @@ public class JavaLoginDisconnectTranslator extends PacketTranslator<ClientboundL
@Override
public void translate(GeyserSession session, ClientboundLoginDisconnectPacket packet) {
Component disconnectReason = packet.getReason();
boolean isOutdatedMessage;
if (disconnectReason instanceof TranslatableComponent component) {
String key = component.key();
isOutdatedMessage = "multiplayer.disconnect.incompatible".equals(key) ||
// Legacy string (starting from at least 1.15.2)
"multiplayer.disconnect.outdated_server".equals(key)
// Reproduced on 1.15.2 server with ViaVersion 4.0.0-21w20a with 1.18.2 Java client
|| key.startsWith("Outdated server!");
} else {
// Reproduced with vanilla 1.8.8 server and 1.18.2 Java client
isOutdatedMessage = disconnectReason instanceof TextComponent component
&& component.content().startsWith("Outdated server!");
}
String serverDisconnectMessage = MessageTranslator.convertMessage(disconnectReason, session.getLocale());
String disconnectMessage;
if (isOutdatedMessage) {
String locale = session.getLocale();
PlatformType platform = session.getGeyser().getPlatformType();
String outdatedType = (platform == PlatformType.BUNGEECORD || platform == PlatformType.VELOCITY) ?
"geyser.network.remote.outdated.proxy" : "geyser.network.remote.outdated.server";
disconnectMessage = GeyserLocale.getPlayerLocaleString(outdatedType, locale, MinecraftProtocol.getJavaVersions().get(0)) + '\n'
+ GeyserLocale.getPlayerLocaleString("geyser.network.remote.original_disconnect_message", locale, serverDisconnectMessage);
} else {
disconnectMessage = serverDisconnectMessage;
}
// The client doesn't manually get disconnected so we have to do it ourselves
session.disconnect(MessageTranslator.convertMessage(packet.getReason(), session.getLocale()));
session.disconnect(disconnectMessage);
}
@Override