我正在开发一个小的个人API,以便能够通过spigot(用于创建插件的修改后的服务器)自定义Minecraft服务器列表ping。 https://wiki.vg/Server_List_Ping
问题在于,每个版本的spigot软件包都更改了名称,我必须避免创建许多做相同事情的不同类。为了实现我的目标,我必须创建一个以ServerPing对象初始化的PacketStatusOutServerInfo对象。这个部分混淆的ServerPing对象由不同的类组成,这些类具有用于构建它的不同方法,并且其中一个允许对它进行反序列化以获得json。我将重写此方法,以便与其反序列化该类,不直接返回自己的json。这是经过反编译的ServerPing类,其中带有需要覆盖的注释:https://hastebin.com/urarohejak.java
这是我尝试过的:
Class<?> serverPingClass = Reflection.getClass("{nms}.ServerPing");
JsonElement exampleResponse = new JsonParser().parse("{\"description\":{\"text\":\"A Minecraft Server\"}," +
"\"players\":{\"max\":20,\"online\":0},\"version\":{\"name\":\"Paper 1.12.2\",\"protocol\":340}}");
Class<?> serverPingSerializerClone = new ByteBuddy()
.subclass(ServerPing.Serializer.class)
.method(ElementMatchers.named("a")
.and(ElementMatchers.returns(JsonElement.class)
.and(ElementMatchers.takesArguments(3))))
.intercept(FixedValue.value(exampleResponse))
.make()
.load(Core.class.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER).getLoaded();
但是我想要的是其中包含serverPingSerializerClone而不是默认值的serverPingClone。