Mirror von
https://github.com/ViaVersion/ViaVersion.git
synchronisiert 2024-10-05 01:31:05 +02:00
Fix Bukkit config NPE, only change the protocol id if ViaVersion can support it and support unsupported Bungee protocol ids (Not working correctly yet)
Dieser Commit ist enthalten in:
Ursprung
b4976bd302
Commit
f53c8c67e2
@ -41,8 +41,6 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaPlatform {
|
|||||||
private List<Runnable> asyncQueuedTasks = new ArrayList<>();
|
private List<Runnable> asyncQueuedTasks = new ArrayList<>();
|
||||||
|
|
||||||
public ViaVersionPlugin() {
|
public ViaVersionPlugin() {
|
||||||
// Config magic
|
|
||||||
conf = new BukkitConfigAPI();
|
|
||||||
// Command handler
|
// Command handler
|
||||||
commandHandler = new BukkitCommandHandler();
|
commandHandler = new BukkitCommandHandler();
|
||||||
// Init platform
|
// Init platform
|
||||||
@ -52,6 +50,8 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaPlatform {
|
|||||||
.injector(new BukkitViaInjector())
|
.injector(new BukkitViaInjector())
|
||||||
.loader(new BukkitViaLoader(this))
|
.loader(new BukkitViaLoader(this))
|
||||||
.build());
|
.build());
|
||||||
|
// Config magic
|
||||||
|
conf = new BukkitConfigAPI();
|
||||||
// For compatibility
|
// For compatibility
|
||||||
ViaVersion.setInstance(this);
|
ViaVersion.setInstance(this);
|
||||||
|
|
||||||
|
@ -9,6 +9,7 @@ import net.md_5.bungee.api.event.ServerConnectEvent;
|
|||||||
import net.md_5.bungee.api.plugin.Listener;
|
import net.md_5.bungee.api.plugin.Listener;
|
||||||
import net.md_5.bungee.api.plugin.Plugin;
|
import net.md_5.bungee.api.plugin.Plugin;
|
||||||
import net.md_5.bungee.event.EventHandler;
|
import net.md_5.bungee.event.EventHandler;
|
||||||
|
import us.myles.ViaVersion.api.Pair;
|
||||||
import us.myles.ViaVersion.api.Via;
|
import us.myles.ViaVersion.api.Via;
|
||||||
import us.myles.ViaVersion.api.ViaAPI;
|
import us.myles.ViaVersion.api.ViaAPI;
|
||||||
import us.myles.ViaVersion.api.ViaVersionConfig;
|
import us.myles.ViaVersion.api.ViaVersionConfig;
|
||||||
@ -17,6 +18,8 @@ import us.myles.ViaVersion.api.configuration.ConfigurationProvider;
|
|||||||
import us.myles.ViaVersion.api.data.UserConnection;
|
import us.myles.ViaVersion.api.data.UserConnection;
|
||||||
import us.myles.ViaVersion.api.platform.TaskId;
|
import us.myles.ViaVersion.api.platform.TaskId;
|
||||||
import us.myles.ViaVersion.api.platform.ViaPlatform;
|
import us.myles.ViaVersion.api.platform.ViaPlatform;
|
||||||
|
import us.myles.ViaVersion.api.protocol.Protocol;
|
||||||
|
import us.myles.ViaVersion.api.protocol.ProtocolRegistry;
|
||||||
import us.myles.ViaVersion.bungee.commands.BungeeCommand;
|
import us.myles.ViaVersion.bungee.commands.BungeeCommand;
|
||||||
import us.myles.ViaVersion.bungee.commands.BungeeCommandHandler;
|
import us.myles.ViaVersion.bungee.commands.BungeeCommandHandler;
|
||||||
import us.myles.ViaVersion.bungee.commands.BungeeCommandSender;
|
import us.myles.ViaVersion.bungee.commands.BungeeCommandSender;
|
||||||
@ -24,6 +27,7 @@ import us.myles.ViaVersion.bungee.platform.*;
|
|||||||
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.dump.PluginInfo;
|
import us.myles.ViaVersion.dump.PluginInfo;
|
||||||
|
import us.myles.ViaVersion.protocols.base.ProtocolInfo;
|
||||||
import us.myles.ViaVersion.util.GsonUtil;
|
import us.myles.ViaVersion.util.GsonUtil;
|
||||||
import us.myles.ViaVersion.util.ReflectionUtil;
|
import us.myles.ViaVersion.util.ReflectionUtil;
|
||||||
|
|
||||||
@ -174,15 +178,19 @@ public class BungeePlugin extends Plugin implements ViaPlatform, Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int protocolId = ProtocolDetectorService.getProtocolId(e.getTarget().getName());
|
int protocolId = ProtocolDetectorService.getProtocolId(e.getTarget().getName());
|
||||||
try {
|
List<Pair<Integer, Protocol>> protocols = ProtocolRegistry.getProtocolPath(user.get(ProtocolInfo.class).getProtocolVersion(), protocolId);
|
||||||
Object pendingConnection = ReflectionUtil.invoke(e.getPlayer(), "getPendingConnection");
|
|
||||||
Object handshake = ReflectionUtil.invoke(pendingConnection, "getHandshake");
|
// Check if ViaVersion can support that version
|
||||||
Method setProtocol = handshake.getClass().getDeclaredMethod("setProtocolVersion", int.class);
|
if (protocols != null) {
|
||||||
setProtocol.invoke(handshake, protocolId);
|
try {
|
||||||
} catch (NoSuchMethodException e1) {
|
Object pendingConnection = ReflectionUtil.invoke(e.getPlayer(), "getPendingConnection");
|
||||||
e1.printStackTrace();
|
Object handshake = ReflectionUtil.invoke(pendingConnection, "getHandshake");
|
||||||
} catch (InvocationTargetException e1) {
|
Method setProtocol = handshake.getClass().getDeclaredMethod("setProtocolVersion", int.class);
|
||||||
e1.printStackTrace();
|
setProtocol.invoke(handshake, protocolId);
|
||||||
|
System.out.println("Changed server protocol id " + protocolId + " clientProtocol:" + user.get(ProtocolInfo.class).getProtocolVersion() + " path:" + protocols);
|
||||||
|
} catch (NoSuchMethodException | InvocationTargetException e1) {
|
||||||
|
e1.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -98,6 +98,8 @@ public class BungeeEncodeHandler extends MessageToMessageEncoder<ByteBuf> {
|
|||||||
|
|
||||||
if (player.getServer() != null) {
|
if (player.getServer() != null) {
|
||||||
if (player.getServer() != null && !player.getServer().getInfo().getName().equals(storage.getCurrentServer())) {
|
if (player.getServer() != null && !player.getServer().getInfo().getName().equals(storage.getCurrentServer())) {
|
||||||
|
|
||||||
|
System.out.println("Server change " + player.getServer().getInfo().getName());
|
||||||
String serverName = player.getServer().getInfo().getName();
|
String serverName = player.getServer().getInfo().getName();
|
||||||
|
|
||||||
storage.setCurrentServer(serverName);
|
storage.setCurrentServer(serverName);
|
||||||
@ -110,21 +112,34 @@ public class BungeeEncodeHandler extends MessageToMessageEncoder<ByteBuf> {
|
|||||||
|
|
||||||
int protocolId = ProtocolDetectorService.getProtocolId(serverName);
|
int protocolId = ProtocolDetectorService.getProtocolId(serverName);
|
||||||
|
|
||||||
Object wrapper = ReflectionUtil.get(player, "ch", Object.class);
|
UserConnection viaConnection = Via.getManager().getConnection(player.getUniqueId());
|
||||||
wrapper.getClass().getDeclaredMethod("setVersion", int.class).invoke(wrapper, protocolId);
|
|
||||||
|
|
||||||
us.myles.ViaVersion.api.data.UserConnection viaConnection = Via.getManager().getConnection(player.getUniqueId());
|
|
||||||
ProtocolInfo info = viaConnection.get(ProtocolInfo.class);
|
ProtocolInfo info = viaConnection.get(ProtocolInfo.class);
|
||||||
// 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);
|
||||||
|
System.out.println(info.getProtocolVersion() + ">" + protocolId + " " + protocols);
|
||||||
ProtocolPipeline pipeline = viaConnection.get(ProtocolInfo.class).getPipeline();
|
ProtocolPipeline pipeline = viaConnection.get(ProtocolInfo.class).getPipeline();
|
||||||
if (protocols != null) {
|
if (protocols != null) {
|
||||||
|
viaConnection.clearStoredObjects();
|
||||||
pipeline.cleanPipes();
|
pipeline.cleanPipes();
|
||||||
|
|
||||||
for (Pair<Integer, Protocol> prot : protocols) {
|
for (Pair<Integer, Protocol> prot : protocols) {
|
||||||
pipeline.add(prot.getValue());
|
pipeline.add(prot.getValue());
|
||||||
}
|
}
|
||||||
|
viaConnection.put(info);
|
||||||
|
viaConnection.setActive(true);
|
||||||
|
|
||||||
|
// Init all protocols TODO check if this can get moved up to the previous for loop, and doesn't require the pipeline to already exist.
|
||||||
|
for (Pair<Integer, Protocol> protocol : protocols) {
|
||||||
|
protocol.getValue().init(viaConnection);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Object wrapper = ReflectionUtil.get(player, "ch", Object.class);
|
||||||
|
wrapper.getClass().getDeclaredMethod("setVersion", int.class).invoke(wrapper, protocolId);
|
||||||
|
ReflectionUtil.invoke(player, "init");
|
||||||
|
} else {
|
||||||
|
viaConnection.setActive(false);
|
||||||
}
|
}
|
||||||
ReflectionUtil.invoke(player, "init");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,9 @@ import us.myles.ViaVersion.BungeePlugin;
|
|||||||
import us.myles.ViaVersion.api.Via;
|
import us.myles.ViaVersion.api.Via;
|
||||||
import us.myles.ViaVersion.api.platform.ViaPlatformLoader;
|
import us.myles.ViaVersion.api.platform.ViaPlatformLoader;
|
||||||
import us.myles.ViaVersion.bungee.providers.BungeeMovementTransmitter;
|
import us.myles.ViaVersion.bungee.providers.BungeeMovementTransmitter;
|
||||||
|
import us.myles.ViaVersion.bungee.providers.BungeeVersionProvider;
|
||||||
import us.myles.ViaVersion.bungee.service.ProtocolDetectorService;
|
import us.myles.ViaVersion.bungee.service.ProtocolDetectorService;
|
||||||
|
import us.myles.ViaVersion.protocols.base.VersionProvider;
|
||||||
import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.MovementTransmitterProvider;
|
import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.MovementTransmitterProvider;
|
||||||
|
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
@ -17,6 +19,7 @@ public class BungeeViaLoader implements ViaPlatformLoader {
|
|||||||
@Override
|
@Override
|
||||||
public void load() {
|
public void load() {
|
||||||
Via.getManager().getProviders().use(MovementTransmitterProvider.class, new BungeeMovementTransmitter());
|
Via.getManager().getProviders().use(MovementTransmitterProvider.class, new BungeeMovementTransmitter());
|
||||||
|
Via.getManager().getProviders().use(VersionProvider.class, new BungeeVersionProvider());
|
||||||
|
|
||||||
plugin.getProxy().getScheduler().schedule(plugin, new ProtocolDetectorService(plugin), 0, 1, TimeUnit.MINUTES);
|
plugin.getProxy().getScheduler().schedule(plugin, new ProtocolDetectorService(plugin), 0, 1, TimeUnit.MINUTES);
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,50 @@
|
|||||||
|
package us.myles.ViaVersion.bungee.providers;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
import us.myles.ViaVersion.api.data.UserConnection;
|
||||||
|
import us.myles.ViaVersion.protocols.base.ProtocolInfo;
|
||||||
|
import us.myles.ViaVersion.protocols.base.VersionProvider;
|
||||||
|
import us.myles.ViaVersion.util.ReflectionUtil;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class BungeeVersionProvider extends VersionProvider {
|
||||||
|
private static Class<?> ref;
|
||||||
|
|
||||||
|
public BungeeVersionProvider() {
|
||||||
|
try {
|
||||||
|
ref = Class.forName("net.md_5.bungee.protocol.ProtocolConstants");
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.out.println("Could not detect the ProtocolConstants class");
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getServerProtocol(UserConnection user) throws Exception {
|
||||||
|
if (ref == null)
|
||||||
|
return super.getServerProtocol(user);
|
||||||
|
// TODO Have one constant list forever until restart? (Might limit plugins if they change this)
|
||||||
|
List<Integer> list = ReflectionUtil.getStatic(ref, "SUPPORTED_VERSION_IDS", List.class);
|
||||||
|
|
||||||
|
ProtocolInfo info = user.get(ProtocolInfo.class);
|
||||||
|
|
||||||
|
// Bungee supports it
|
||||||
|
if (list.contains(info.getProtocolVersion()))
|
||||||
|
return info.getProtocolVersion();
|
||||||
|
|
||||||
|
// Older than bungee supports, get the lowest version
|
||||||
|
if (info.getProtocolVersion() < list.get(0)) {
|
||||||
|
return list.get(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Loop through all protocols to get the closest protocol id that bungee supports
|
||||||
|
for (Integer protocol : Lists.reverse(list)) {
|
||||||
|
if (info.getProtocolVersion() > protocol)
|
||||||
|
return protocol;
|
||||||
|
}
|
||||||
|
|
||||||
|
System.out.println("Panic, no protocol id found for " + info.getProtocolVersion());
|
||||||
|
return info.getProtocolVersion();
|
||||||
|
}
|
||||||
|
}
|
@ -66,6 +66,14 @@ public class UserConnection {
|
|||||||
storedObjects.put(object.getClass(), object);
|
storedObjects.put(object.getClass(), object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear all the stored objects
|
||||||
|
* Used for bungee when switching servers.
|
||||||
|
*/
|
||||||
|
public void clearStoredObjects() {
|
||||||
|
storedObjects.clear();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send a raw packet to the player
|
* Send a raw packet to the player
|
||||||
*
|
*
|
||||||
|
@ -11,6 +11,7 @@ import us.myles.ViaVersion.api.PacketWrapper;
|
|||||||
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.data.UserConnection;
|
import us.myles.ViaVersion.api.data.UserConnection;
|
||||||
|
import us.myles.ViaVersion.api.platform.providers.ViaProviders;
|
||||||
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;
|
||||||
@ -53,7 +54,9 @@ public class BaseProtocol extends Protocol {
|
|||||||
if (ProtocolRegistry.SERVER_PROTOCOL == -1) // Set the Server protocol if the detection on startup failed
|
if (ProtocolRegistry.SERVER_PROTOCOL == -1) // Set the Server protocol if the detection on startup failed
|
||||||
ProtocolRegistry.SERVER_PROTOCOL = protocolVersion;
|
ProtocolRegistry.SERVER_PROTOCOL = protocolVersion;
|
||||||
|
|
||||||
List<Pair<Integer, Protocol>> protocols = ProtocolRegistry.getProtocolPath(info.getProtocolVersion(), ProtocolRegistry.SERVER_PROTOCOL);
|
int protocol = Via.getManager().getProviders().get(VersionProvider.class).getServerProtocol(wrapper.user());
|
||||||
|
List<Pair<Integer, Protocol>> protocols = ProtocolRegistry.getProtocolPath(info.getProtocolVersion(), protocol);
|
||||||
|
|
||||||
if (protocols != null) {
|
if (protocols != null) {
|
||||||
if (protocolVersion != 9999) {
|
if (protocolVersion != 9999) {
|
||||||
//Fix ServerListPlus
|
//Fix ServerListPlus
|
||||||
@ -137,13 +140,14 @@ public class BaseProtocol extends Protocol {
|
|||||||
ProtocolInfo info = wrapper.user().get(ProtocolInfo.class);
|
ProtocolInfo info = wrapper.user().get(ProtocolInfo.class);
|
||||||
info.setProtocolVersion(protVer);
|
info.setProtocolVersion(protVer);
|
||||||
// Choose the pipe
|
// Choose the pipe
|
||||||
List<Pair<Integer, Protocol>> protocols = ProtocolRegistry.getProtocolPath(info.getProtocolVersion(), ProtocolRegistry.SERVER_PROTOCOL);
|
int protocol = Via.getManager().getProviders().get(VersionProvider.class).getServerProtocol(wrapper.user());
|
||||||
|
List<Pair<Integer, Protocol>> protocols = ProtocolRegistry.getProtocolPath(info.getProtocolVersion(), protocol);
|
||||||
ProtocolPipeline pipeline = wrapper.user().get(ProtocolInfo.class).getPipeline();
|
ProtocolPipeline pipeline = wrapper.user().get(ProtocolInfo.class).getPipeline();
|
||||||
if (protocols != null) {
|
if (protocols != null) {
|
||||||
for (Pair<Integer, Protocol> prot : protocols) {
|
for (Pair<Integer, Protocol> prot : protocols) {
|
||||||
pipeline.add(prot.getValue());
|
pipeline.add(prot.getValue());
|
||||||
}
|
}
|
||||||
wrapper.set(Type.VAR_INT, 0, ProtocolRegistry.SERVER_PROTOCOL);
|
wrapper.set(Type.VAR_INT, 0, protocol);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Change state
|
// Change state
|
||||||
@ -196,6 +200,11 @@ public class BaseProtocol extends Protocol {
|
|||||||
// Nothing gets added, ProtocolPipeline handles ProtocolInfo
|
// Nothing gets added, ProtocolPipeline handles ProtocolInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void register(ViaProviders providers) {
|
||||||
|
providers.register(VersionProvider.class, new VersionProvider());
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void transform(Direction direction, State state, PacketWrapper packetWrapper) throws Exception {
|
public void transform(Direction direction, State state, PacketWrapper packetWrapper) throws Exception {
|
||||||
super.transform(direction, state, packetWrapper);
|
super.transform(direction, state, packetWrapper);
|
||||||
|
@ -0,0 +1,12 @@
|
|||||||
|
package us.myles.ViaVersion.protocols.base;
|
||||||
|
|
||||||
|
import us.myles.ViaVersion.api.data.UserConnection;
|
||||||
|
import us.myles.ViaVersion.api.platform.providers.Provider;
|
||||||
|
import us.myles.ViaVersion.api.protocol.ProtocolRegistry;
|
||||||
|
|
||||||
|
public class VersionProvider implements Provider {
|
||||||
|
|
||||||
|
public int getServerProtocol(UserConnection connection) throws Exception {
|
||||||
|
return ProtocolRegistry.SERVER_PROTOCOL;
|
||||||
|
}
|
||||||
|
}
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren