使用 Field.set 设置游戏配置文件(更改玩家名称)



我一直在努力研究如何更改玩家的名字(他们头顶的标签)。我已经尝试了很多东西,但我得到的最接近的是这段代码:

EntityHuman eh = ((CraftPlayer) p).getHandle();
PacketPlayOutEntityDestroy p29 = new PacketPlayOutEntityDestroy(new int[] {
  p.getEntityId()
});
PacketPlayOutNamedEntitySpawn p20 = new PacketPlayOutNamedEntitySpawn(eh);
try {
  Field profileField = eh.getClass().getSuperclass.getDeclaredField("bH");
  profileField.setAccessible(true);
  profileField.set(eh.getClass().getSuperclass, new GameProfile(p.getUniqueId(), newName));
} catch (Exception e) {
  e.printStackTrace();
  Bukkit.broadcastMessage("Not Work!");
}

我将在一点点内进入它打印的堆栈跟踪...所以我发现人们使用的旧方法由于某些文件移动等而不再有效。在代码中挖掘了一段时间后,我终于找到了我需要找到的东西,那就是net.minecraft.server.v1_8_R3中名为"bH"的 GameProfile 对象。实体人类。这基本上是需要更改才能更改玩家名称的内容。不用担心数据包,我已经准备好了。

我的问题是,"如何更改EntityPlayer的名称标签?"我意识到我从Bukkit论坛获得的代码已经过时了。GameProfile不再存储在EntityPlayer中,而是存储在EntityHuman中。所以,我现在的问题是,如何正确更改游戏配置文件字段"bH"?

我将在net.minecraft.server.v1_8_R3中向您展示一些代码。实体人; private final GameProfile bH; 同样,这是需要更改的内容,因为游戏配置文件会接收UUID和字符串名称。

因此,对于我得到的错误:

[19:10:23 WARN]: java.lang.IllegalArgumentException: Can not set final com.mojang.authlib.GameProfile field net.minecraft.server.v1_8_R3.EntityHuman.bH to java.lang.Class
[19:10:23 WARN]:        at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
[19:10:23 WARN]:        at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
[19:10:23 WARN]:        at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(Unknown Source)
[19:10:23 WARN]:        at sun.reflect.UnsafeQualifiedObjectFieldAccessorImpl.set(Unknown Source)
[19:10:23 WARN]:        at java.lang.reflect.Field.set(Unknown Source)
[19:10:23 WARN]:        at yt.Kaelinator.commands.Rename.disguisePlayer(Rename.java:117)
[19:10:23 WARN]:        at yt.Kaelinator.commands.Rename.onCommand(Rename.java:70)
[19:10:23 WARN]:        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44)
[19:10:23 WARN]:        at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:140)
[19:10:23 WARN]:        at org.bukkit.craftbukkit.v1_8_R3.CraftServer.dispatchCommand(CraftServer.java:620)
[19:10:23 WARN]:        at net.minecraft.server.v1_8_R3.PlayerConnection.handleCommand(PlayerConnection.java:1106)
[19:10:23 WARN]:        at net.minecraft.server.v1_8_R3.PlayerConnection.a(PlayerConnection.java:966)
[19:10:23 WARN]:        at net.minecraft.server.v1_8_R3.PacketPlayInChat.a(SourceFile:37)
[19:10:23 WARN]:        at net.minecraft.server.v1_8_R3.PacketPlayInChat.a(SourceFile:9)
[19:10:23 WARN]:        at net.minecraft.server.v1_8_R3.PlayerConnectionUtils$1.run(SourceFile:13)
[19:10:23 WARN]:        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
[19:10:23 WARN]:        at java.util.concurrent.FutureTask.run(Unknown Source)
[19:10:23 WARN]:        at net.minecraft.server.v1_8_R3.SystemUtils.a(SourceFile:44)
[19:10:23 WARN]:        at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:673)
[19:10:23 WARN]:        at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:335)
[19:10:23 WARN]:        at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:629)
[19:10:23 WARN]:        at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:537)
[19:10:23 WARN]:        at java.lang.Thread.run(Unknown Source)

[19:10:23 WARN]: java.lang.IllegalArgumentException: Can not set final com.mojang.authlib.GameProfile field net.minecraft.server.v1_8_R3.EntityHuman.bH to java.lang.Class行特别有趣,但我不太确定如何阅读它。

我已经做了一些测试,导致这种情况的确切行是profileField.set(eh.getClass(), new GameProfile(p.getUniqueId(), newName));,因为当我在 try/catch 中获取此特定行时,没有错误。我可以对这一行做些什么来"修复"这个问题?

注意:我无法使用ProtocolLib/iTag/TagAPI

任何帮助不胜感激,谢谢!

更改
profileField.set(eh.getClass().getSuperclass, new GameProfile(p.getUniqueId(), newName));profileField.set(eh, new GameProfile(p.getUniqueId(), newName));

它现在可以工作:D

最新更新