Mirror von
https://github.com/ViaVersion/ViaVersion.git
synchronisiert 2024-10-03 08:41:05 +02:00
Optimise reflection in some cases where method isn't cached.
Dieser Commit ist enthalten in:
Ursprung
f33d22531b
Commit
c4bab6c9af
@ -3,11 +3,10 @@ package us.myles.ViaVersion.bukkit.handlers;
|
|||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
import io.netty.channel.ChannelHandlerContext;
|
import io.netty.channel.ChannelHandlerContext;
|
||||||
import io.netty.handler.codec.MessageToByteEncoder;
|
import io.netty.handler.codec.MessageToByteEncoder;
|
||||||
import us.myles.ViaVersion.ViaVersionPlugin;
|
|
||||||
import us.myles.ViaVersion.api.PacketWrapper;
|
import us.myles.ViaVersion.api.PacketWrapper;
|
||||||
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.type.Type;
|
import us.myles.ViaVersion.api.type.Type;
|
||||||
|
import us.myles.ViaVersion.bukkit.util.NMSUtil;
|
||||||
import us.myles.ViaVersion.exception.CancelException;
|
import us.myles.ViaVersion.exception.CancelException;
|
||||||
import us.myles.ViaVersion.packets.Direction;
|
import us.myles.ViaVersion.packets.Direction;
|
||||||
import us.myles.ViaVersion.protocols.base.ProtocolInfo;
|
import us.myles.ViaVersion.protocols.base.ProtocolInfo;
|
||||||
@ -17,6 +16,16 @@ import java.lang.reflect.Field;
|
|||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
|
||||||
public class BukkitEncodeHandler extends MessageToByteEncoder {
|
public class BukkitEncodeHandler extends MessageToByteEncoder {
|
||||||
|
private static Field versionField = null;
|
||||||
|
|
||||||
|
static {
|
||||||
|
try {
|
||||||
|
versionField = NMSUtil.nms("PacketEncoder").getDeclaredField("version");
|
||||||
|
versionField.setAccessible(true);
|
||||||
|
} catch (Exception e){
|
||||||
|
// Not compat version
|
||||||
|
}
|
||||||
|
}
|
||||||
private final UserConnection info;
|
private final UserConnection info;
|
||||||
private final MessageToByteEncoder minecraftEncoder;
|
private final MessageToByteEncoder minecraftEncoder;
|
||||||
|
|
||||||
@ -28,10 +37,8 @@ public class BukkitEncodeHandler extends MessageToByteEncoder {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void encode(final ChannelHandlerContext ctx, Object o, final ByteBuf bytebuf) throws Exception {
|
protected void encode(final ChannelHandlerContext ctx, Object o, final ByteBuf bytebuf) throws Exception {
|
||||||
if (((ViaVersionPlugin) Via.getPlatform()).isCompatSpigotBuild()) {
|
if (versionField != null) {
|
||||||
Field ver = minecraftEncoder.getClass().getDeclaredField("version");
|
versionField.set(minecraftEncoder, versionField.get(this));
|
||||||
ver.setAccessible(true);
|
|
||||||
ver.set(minecraftEncoder, ver.get(this));
|
|
||||||
}
|
}
|
||||||
// handle the packet type
|
// handle the packet type
|
||||||
if (!(o instanceof ByteBuf)) {
|
if (!(o instanceof ByteBuf)) {
|
||||||
|
@ -43,11 +43,11 @@ public class BukkitViaBulkChunkTranslator extends BulkChunkTranslatorProvider {
|
|||||||
if (Via.getConfig().isAntiXRay() && ((ViaVersionPlugin) Via.getPlatform()).isSpigot()) { //Spigot anti-xray patch
|
if (Via.getConfig().isAntiXRay() && ((ViaVersionPlugin) Via.getPlatform()).isSpigot()) { //Spigot anti-xray patch
|
||||||
try {
|
try {
|
||||||
Object world = mapChunkBulkRef.getFieldValue("world", packet, Object.class);
|
Object world = mapChunkBulkRef.getFieldValue("world", packet, Object.class);
|
||||||
|
|
||||||
for (int i = 0; i < xcoords.length; ++i) {
|
|
||||||
Object spigotConfig = ReflectionUtil.getPublic(world, "spigotConfig", Object.class);
|
Object spigotConfig = ReflectionUtil.getPublic(world, "spigotConfig", Object.class);
|
||||||
Object antiXrayInstance = ReflectionUtil.getPublic(spigotConfig, "antiXrayInstance", Object.class);
|
Object antiXrayInstance = ReflectionUtil.getPublic(spigotConfig, "antiXrayInstance", Object.class);
|
||||||
|
|
||||||
|
for (int i = 0; i < xcoords.length; ++i) {
|
||||||
|
// TODO: Possibly optimise this
|
||||||
Object b = ReflectionUtil.get(chunkMaps[i], "b", Object.class);
|
Object b = ReflectionUtil.get(chunkMaps[i], "b", Object.class);
|
||||||
Object a = ReflectionUtil.get(chunkMaps[i], "a", Object.class);
|
Object a = ReflectionUtil.get(chunkMaps[i], "a", Object.class);
|
||||||
|
|
||||||
|
@ -28,7 +28,6 @@ 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.protocols.base.ProtocolInfo;
|
||||||
import us.myles.ViaVersion.util.GsonUtil;
|
import us.myles.ViaVersion.util.GsonUtil;
|
||||||
import us.myles.ViaVersion.util.ReflectionUtil;
|
|
||||||
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
@ -39,11 +38,26 @@ import java.util.UUID;
|
|||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
public class BungeePlugin extends Plugin implements ViaPlatform, Listener {
|
public class BungeePlugin extends Plugin implements ViaPlatform, Listener {
|
||||||
|
private static Method getPendingConnection;
|
||||||
|
private static Method getHandshake;
|
||||||
|
private static Method setProtocol;
|
||||||
|
|
||||||
private BungeeViaAPI api;
|
private BungeeViaAPI api;
|
||||||
private BungeeConfigAPI config;
|
private BungeeConfigAPI config;
|
||||||
private BungeeCommandHandler commandHandler;
|
private BungeeCommandHandler commandHandler;
|
||||||
|
|
||||||
|
static {
|
||||||
|
try {
|
||||||
|
getPendingConnection = Class.forName("net.md_5.bungee.UserConnection").getDeclaredMethod("getPendingConnection");
|
||||||
|
getHandshake = Class.forName("net.md_5.bungee.connection.InitialHandler").getDeclaredMethod("getHandshake");
|
||||||
|
setProtocol = Class.forName("net.md_5.bungee.protocol.packet.Handshake").getDeclaredMethod("setProtocolVersion", int.class);
|
||||||
|
} catch (NoSuchMethodException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (ClassNotFoundException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onLoad() {
|
public void onLoad() {
|
||||||
api = new BungeeViaAPI();
|
api = new BungeeViaAPI();
|
||||||
@ -179,13 +193,11 @@ public class BungeePlugin extends Plugin implements ViaPlatform, Listener {
|
|||||||
|
|
||||||
// Check if ViaVersion can support that version
|
// Check if ViaVersion can support that version
|
||||||
try {
|
try {
|
||||||
Object pendingConnection = ReflectionUtil.invoke(e.getPlayer(), "getPendingConnection");
|
Object pendingConnection = getPendingConnection.invoke(e.getPlayer());
|
||||||
Object handshake = ReflectionUtil.invoke(pendingConnection, "getHandshake");
|
Object handshake = getHandshake.invoke(pendingConnection);
|
||||||
Method setProtocol = handshake.getClass().getDeclaredMethod("setProtocolVersion", int.class);
|
|
||||||
setProtocol.invoke(handshake, protocols == null ? user.get(ProtocolInfo.class).getProtocolVersion() : protocolId);
|
setProtocol.invoke(handshake, protocols == null ? user.get(ProtocolInfo.class).getProtocolVersion() : protocolId);
|
||||||
} catch (NoSuchMethodException | InvocationTargetException e1) {
|
} catch (InvocationTargetException e1) {
|
||||||
e1.printStackTrace();
|
e1.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -20,8 +20,9 @@ import us.myles.ViaVersion.exception.CancelException;
|
|||||||
import us.myles.ViaVersion.packets.Direction;
|
import us.myles.ViaVersion.packets.Direction;
|
||||||
import us.myles.ViaVersion.protocols.base.ProtocolInfo;
|
import us.myles.ViaVersion.protocols.base.ProtocolInfo;
|
||||||
import us.myles.ViaVersion.util.PipelineUtil;
|
import us.myles.ViaVersion.util.PipelineUtil;
|
||||||
import us.myles.ViaVersion.util.ReflectionUtil;
|
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ChannelHandler.Sharable
|
@ChannelHandler.Sharable
|
||||||
@ -128,13 +129,34 @@ public class BungeeEncodeHandler extends MessageToMessageEncoder<ByteBuf> {
|
|||||||
protocol.init(viaConnection);
|
protocol.init(viaConnection);
|
||||||
}
|
}
|
||||||
|
|
||||||
Object wrapper = ReflectionUtil.get(player, "ch", Object.class);
|
Object wrapper = channelWrapper.get(player);
|
||||||
wrapper.getClass().getDeclaredMethod("setVersion", int.class).invoke(wrapper, protocolId);
|
setVersion.invoke(wrapper, protocolId);
|
||||||
|
|
||||||
Object entityMap = Class.forName("net.md_5.bungee.entitymap.EntityMap").getDeclaredMethod("getEntityMap", int.class).invoke(null, protocolId);
|
Object entityMap = getEntityMap.invoke(null, protocolId);
|
||||||
ReflectionUtil.set(player, "entityRewrite", entityMap);
|
entityRewrite.set(player, entityMap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
private static Method getEntityMap = null;
|
||||||
|
private static Method setVersion = null;
|
||||||
|
private static Field entityRewrite = null;
|
||||||
|
private static Field channelWrapper = null;
|
||||||
|
|
||||||
|
static {
|
||||||
|
try {
|
||||||
|
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);
|
||||||
|
channelWrapper = Class.forName("net.md_5.bungee.UserConnection").getDeclaredField("ch");
|
||||||
|
channelWrapper.setAccessible(true);
|
||||||
|
entityRewrite = Class.forName("net.md_5.bungee.UserConnection").getDeclaredField("entityRewrite");
|
||||||
|
entityRewrite.setAccessible(true);
|
||||||
|
} catch (NoSuchMethodException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (ClassNotFoundException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (NoSuchFieldException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,17 +2,14 @@ package us.myles.ViaVersion.bungee.service;
|
|||||||
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import net.md_5.bungee.api.Callback;
|
import net.md_5.bungee.api.Callback;
|
||||||
import net.md_5.bungee.api.ProxyServer;
|
|
||||||
import net.md_5.bungee.api.ServerPing;
|
import net.md_5.bungee.api.ServerPing;
|
||||||
import net.md_5.bungee.api.config.ServerInfo;
|
import net.md_5.bungee.api.config.ServerInfo;
|
||||||
import us.myles.ViaVersion.BungeePlugin;
|
import us.myles.ViaVersion.BungeePlugin;
|
||||||
import us.myles.ViaVersion.api.Via;
|
import us.myles.ViaVersion.api.Via;
|
||||||
import us.myles.ViaVersion.bungee.platform.BungeeConfigAPI;
|
import us.myles.ViaVersion.bungee.platform.BungeeConfigAPI;
|
||||||
import us.myles.ViaVersion.bungee.providers.BungeeVersionProvider;
|
import us.myles.ViaVersion.bungee.providers.BungeeVersionProvider;
|
||||||
import us.myles.ViaVersion.util.ReflectionUtil;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren