2016-07-17 11 views
0

私はプレイヤーの名前(頭より上のタグ)を変更する方法を試してきました。私は多くのことを試してみたが、私が得た最も近いが、このコードでいた:Field.setを使ってGameProfileを設定する(プレイヤーの名前を変更する)

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.EntityHuman内の "bH"という名前のGameProfileオブジェクトです。これは、基本的に、プレイヤーの名前を変更するために変更する必要があるものです。パケットについて心配しないで、私はそれがすべて働いている。

私の問題は、「EntityPlayerの名前タグを変更するにはどうすればいいですか?」でした。私はBukitフォーラムから得たコードが古くなっていることに気付きました。 GameProfileはもはやEntityPlayerではなくEntityHumanに保存されました。ですから、私の質問は、 "GameProfile"フィールド "bH"を正しく変更する方法です。

net.minecraft.server.v1_8_R3.EntityHuman内にいくつかのコードを示します。 private final GameProfile bH;また、GameProfileはUUIDとStringという名前を取り入れるため、これを変更する必要があります。

ので、エラーに私が取得しています:

[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

すべてのヘルプは高く評価され、感謝!

+0

フィールドが最終です。修飾子を最初に変更します。 – Cnly

答えて

1

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

にそれが動作するようになりました:D

関連する問題