3
0
Mirror von https://github.com/ViaVersion/ViaVersion.git synchronisiert 2024-12-26 00:00:28 +01:00

Rewrite bungeecord relay messages

Dieser Commit ist enthalten in:
creeper123123321 2018-08-04 07:37:33 -03:00
Ursprung d8885f9156
Commit 9b42094273
Es konnte kein GPG-Schlüssel zu dieser Signatur gefunden werden
GPG-Schlüssel-ID: 0AC57D54786721D1

Datei anzeigen

@ -1,11 +1,14 @@
package us.myles.ViaVersion.bungee.handlers; package us.myles.ViaVersion.bungee.handlers;
import com.google.common.base.Joiner;
import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.event.ServerConnectEvent; import net.md_5.bungee.api.event.ServerConnectEvent;
import net.md_5.bungee.api.event.ServerConnectedEvent; import net.md_5.bungee.api.event.ServerConnectedEvent;
import net.md_5.bungee.api.plugin.Listener; import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.event.EventHandler; import net.md_5.bungee.event.EventHandler;
import net.md_5.bungee.event.EventPriority; import net.md_5.bungee.event.EventPriority;
import net.md_5.bungee.protocol.packet.Handshake;
import net.md_5.bungee.protocol.packet.PluginMessage;
import us.myles.ViaVersion.api.Pair; import us.myles.ViaVersion.api.Pair;
import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.Via;
import us.myles.ViaVersion.api.boss.BossBar; import us.myles.ViaVersion.api.boss.BossBar;
@ -13,19 +16,24 @@ import us.myles.ViaVersion.api.data.UserConnection;
import us.myles.ViaVersion.api.protocol.Protocol; import us.myles.ViaVersion.api.protocol.Protocol;
import us.myles.ViaVersion.api.protocol.ProtocolPipeline; import us.myles.ViaVersion.api.protocol.ProtocolPipeline;
import us.myles.ViaVersion.api.protocol.ProtocolRegistry; import us.myles.ViaVersion.api.protocol.ProtocolRegistry;
import us.myles.ViaVersion.api.protocol.ProtocolVersion;
import us.myles.ViaVersion.bungee.service.ProtocolDetectorService; import us.myles.ViaVersion.bungee.service.ProtocolDetectorService;
import us.myles.ViaVersion.bungee.storage.BungeeStorage; import us.myles.ViaVersion.bungee.storage.BungeeStorage;
import us.myles.ViaVersion.protocols.base.ProtocolInfo; import us.myles.ViaVersion.protocols.base.ProtocolInfo;
import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.Protocol1_13To1_12_2;
import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.packets.InventoryPackets;
import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.EntityTracker; import us.myles.ViaVersion.protocols.protocol1_9to1_8.storage.EntityTracker;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.nio.charset.StandardCharsets;
import java.util.List; import java.util.List;
public class BungeeServerHandler implements Listener { public class BungeeServerHandler implements Listener {
private static Method getPendingConnection; //private static Method getPendingConnection;
private static Method getHandshake; private static Method getHandshake;
private static Method getRelayMessages;
private static Method setProtocol; private static Method setProtocol;
private static Method getEntityMap = null; private static Method getEntityMap = null;
private static Method setVersion = null; private static Method setVersion = null;
@ -34,8 +42,9 @@ public class BungeeServerHandler implements Listener {
static { static {
try { try {
getPendingConnection = Class.forName("net.md_5.bungee.UserConnection").getDeclaredMethod("getPendingConnection"); //getPendingConnection = Class.forName("net.md_5.bungee.UserConnection").getDeclaredMethod("getPendingConnection");
getHandshake = Class.forName("net.md_5.bungee.connection.InitialHandler").getDeclaredMethod("getHandshake"); getHandshake = Class.forName("net.md_5.bungee.connection.InitialHandler").getDeclaredMethod("getHandshake");
getRelayMessages = Class.forName("net.md_5.bungee.connection.InitialHandler").getDeclaredMethod("getRelayMessages");
setProtocol = Class.forName("net.md_5.bungee.protocol.packet.Handshake").getDeclaredMethod("setProtocolVersion", int.class); setProtocol = Class.forName("net.md_5.bungee.protocol.packet.Handshake").getDeclaredMethod("setProtocolVersion", int.class);
getEntityMap = Class.forName("net.md_5.bungee.entitymap.EntityMap").getDeclaredMethod("getEntityMap", int.class); getEntityMap = Class.forName("net.md_5.bungee.entitymap.EntityMap").getDeclaredMethod("getEntityMap", int.class);
setVersion = Class.forName("net.md_5.bungee.netty.ChannelWrapper").getDeclaredMethod("setVersion", int.class); setVersion = Class.forName("net.md_5.bungee.netty.ChannelWrapper").getDeclaredMethod("setVersion", int.class);
@ -62,8 +71,8 @@ public class BungeeServerHandler implements Listener {
// Check if ViaVersion can support that version // Check if ViaVersion can support that version
try { try {
Object pendingConnection = getPendingConnection.invoke(e.getPlayer()); //Object pendingConnection = getPendingConnection.invoke(e.getPlayer());
Object handshake = getHandshake.invoke(pendingConnection); Object handshake = getHandshake.invoke(e.getPlayer().getPendingConnection());
setProtocol.invoke(handshake, protocols == null ? user.get(ProtocolInfo.class).getProtocolVersion() : protocolId); setProtocol.invoke(handshake, protocols == null ? user.get(ProtocolInfo.class).getProtocolVersion() : protocolId);
} catch (InvocationTargetException | IllegalAccessException e1) { } catch (InvocationTargetException | IllegalAccessException e1) {
e1.printStackTrace(); e1.printStackTrace();
@ -103,6 +112,8 @@ public class BungeeServerHandler implements Listener {
int protocolId = ProtocolDetectorService.getProtocolId(serverName); int protocolId = ProtocolDetectorService.getProtocolId(serverName);
ProtocolInfo info = user.get(ProtocolInfo.class); ProtocolInfo info = user.get(ProtocolInfo.class);
int previousServerProtocol = info.getServerProtocolVersion();
// Refresh the pipes // Refresh the pipes
List<Pair<Integer, Protocol>> protocols = ProtocolRegistry.getProtocolPath(info.getProtocolVersion(), protocolId); List<Pair<Integer, Protocol>> protocols = ProtocolRegistry.getProtocolPath(info.getProtocolVersion(), protocolId);
ProtocolPipeline pipeline = user.get(ProtocolInfo.class).getPipeline(); ProtocolPipeline pipeline = user.get(ProtocolInfo.class).getPipeline();
@ -121,6 +132,45 @@ public class BungeeServerHandler implements Listener {
// Add version-specific base Protocol // Add version-specific base Protocol
pipeline.add(ProtocolRegistry.getBaseProtocol(protocolId)); pipeline.add(ProtocolRegistry.getBaseProtocol(protocolId));
// Workaround 1.13 server change
Object relayMessages = getRelayMessages.invoke(e.getPlayer().getPendingConnection());
if (relayMessages instanceof List) {
for (Object message : (List) relayMessages) {
if (message instanceof PluginMessage) {
PluginMessage plMsg = (PluginMessage) message;
String channel = plMsg.getTag();
if (previousServerProtocol != -1) {
if (previousServerProtocol < ProtocolVersion.v1_13.getId()
&& protocolId >= ProtocolVersion.v1_13.getId()) {
channel = InventoryPackets.getNewPluginChannelId(channel);
if (channel.equals("minecraft:register")) {
String[] channels = new String(plMsg.getData(), StandardCharsets.UTF_8).split("\0");
for (int i = 0; i < channels.length; i++) {
channels[i] = InventoryPackets.getNewPluginChannelId(channels[i]);
}
plMsg.setData(Joiner.on('\0').join(channels).getBytes(StandardCharsets.UTF_8));
}
} else if (previousServerProtocol >= ProtocolVersion.v1_13.getId()
&& protocolId < ProtocolVersion.v1_13.getId()) {
channel = InventoryPackets.getOldPluginChannelId(channel);
if (channel.equals("REGISTER")) {
String[] channels = new String(plMsg.getData(), StandardCharsets.UTF_8).split("\0");
for (int i = 0; i < channels.length; i++) {
channels[i] = InventoryPackets.getOldPluginChannelId(channels[i]);
}
plMsg.setData(Joiner.on('\0').join(channels).getBytes(StandardCharsets.UTF_8));
}
}
}
plMsg.setTag(channel);
} else {
Via.getPlatform().getLogger().warning("relayMessages contains a element that isn't a Handshake " + message);
}
}
} else {
Via.getPlatform().getLogger().warning("relayMessages isn't a List! " + relayMessages);
}
user.put(info); user.put(info);
user.put(storage); user.put(storage);