2016-07-16 4 views
3

私はまた戻ってきました。
今日私は多くの人々が以前に尋ねた質問があります。私が再度尋ねる理由は、90分の検索のすべてで、私は更新された答えを見つけることができなかったからです。多くの答えはiTag/TagAPIの使用を教えていますが、それを使用しようとするといくつかの問題が発生しました。したがって、私はiTag/TagAPIを使用しません。私はパケットを使用しようとしていますが、私は1つの答えを見つけましたが、それも時代遅れでした。Bukkit - 頭の上にプレーヤーの名前を変更しますか?

EntityPlayer entityP = ((CraftPlayer) p).getHandle(); 
entityP.displayName = args[0]; 


for (Player a: Bukkit.getOnlinePlayers()) { 

    if (!p.getUniqueId().equals(a.getUniqueId())) 
    ((CraftPlayer) a).getHandle().playerConnection.sendPacket(new PacketPlayOutNamedEntitySpawn(entityP)); 
} 

ここで私はのオフに行っていた、そのスレッドです:https://bukkit.org/threads/change-player-name-above-head.162356/

すべてのヘルプは歓迎です!

+1

事がある。この https://www.spigotmc.org/threads/change-name-above-head-spigot-1-8.66314/ – Kerooker

答えて

2

これは1.8で可能です。便宜上、ProtocolLibとPacketWrapperを使用しました。

1.8アップデートので、NamedEntitySpawnパケットが変更されていると、それはもはやサポートされている変更しないことにより、プレイヤーの名前を変更する(ref

しかしthis postは、参照を与えた:私たちは、パケットPlayerInfoDataを使用することができます。私はいくつかのテストをした、とここ(1.9.2に対してテスト)の結果です:コードここ

です:

Player theGuyToChangeNameFor = Bukkit.getPlayer("theguy"); 

PlayerInfoData pid = new PlayerInfoData(WrappedGameProfile.fromPlayer(theGuyToChangeNameFor), 1, 
             EnumWrappers.NativeGameMode.SURVIVAL, 
             WrappedChatComponent.fromText("whatever_string")); 
WrapperPlayServerPlayerInfo wpspi = new WrapperPlayServerPlayerInfo(); 
wpspi.setAction(EnumWrappers.PlayerInfoAction.REMOVE_PLAYER); 
wpspi.setData(Collections.singletonList(pid)); 
for(Player p : Bukkit.getOnlinePlayers()) 
{ 
    if(p.equals(theGuyToChangeNameFor)) 
    { 
     continue; 
    } 
    p.hidePlayer(theGuyToChangeNameFor); 
    wpspi.sendPacket(p); 
} 

ProtocolLibrary.getProtocolManager().addPacketListener(
     new PacketAdapter(this, PacketType.Play.Server.PLAYER_INFO) 
     { 

      @Override 
      public void onPacketSending(PacketEvent event) 
      { 

       if(event.getPacket().getPlayerInfoAction().read(0) != EnumWrappers.PlayerInfoAction.ADD_PLAYER) 
       { 
        return; 
       } 

       PlayerInfoData pid = event.getPacket().getPlayerInfoDataLists().read(0).get(0); 

       if(!pid.getProfile().getName().toLowerCase().equals("theguy")) // Here you can do something to ensure you're changing the name of the correct guy 
       { 
        return; 
       } 

       PlayerInfoData newPid = new PlayerInfoData(pid.getProfile().withName("HEAD_NAME"), pid.getPing(), pid.getGameMode(), 
                  WrappedChatComponent.fromText("TAB_LIST_NAME")); 
       event.getPacket().getPlayerInfoDataLists().write(0, Collections.singletonList(newPid)); 

      } 
     } 
); 

for(Player p : Bukkit.getOnlinePlayers()) 
{ 
    if(p.equals(theGuyToChangeNameFor)) 
    { 
     continue; 
    } 
    p.showPlayer(theGuyToChangeNameFor); 
} 

説明:私たちは、ProtocolLibがからPlayerInfoDataパケットを変更するために使用

  • サーバーを使用して、プレーヤーの表示名を変更します。
  • hidePlayershowPlayerおよびは、プレーヤーの名前をすぐにリフレッシュするために使用されます(そうしないと、ログアウトや再入力が必要になります)。これまでのところ、より良い方法は見つかっていません。あなたは1を持っている場合は、それを言う:)
+0

を見てみましょうProtocolLibを使用するためには、1.7 Protocol Hack Build 1469と互換性のあるバージョンを見つけなければなりません。これがTagAPIまたはiTagを使用しない理由です。これは残念ながらうまくいきません。 – Kaelinator

+0

@ Kaelinator私は、1.7と1.8の両方のプレイヤーに同じコードスニペットで名前変更をさせることはできないと思います。さまざまなメカニズムがあります。本当に1.7と1.8の間でプロトコルのハッキングが必要な場合は、それぞれ1.7と1.8のユーザーに対して2種類のパケットを送信する必要があります。 – Cnly

関連する問題