2016-07-16 21 views
3

Ich bin wieder zurück.
Heute habe ich eine Frage, die viele Leute schon einmal gestellt haben. Der Grund, warum ich wieder frage, ist, dass ich in all meinen 90 Minuten Suche keine aktualisierte Antwort finden konnte. Viele Antworten sagen mir iTAG/TagAPI zu verwenden, aber ich stieß auf einige Probleme, die versuchen, das zu verwenden, daher würde ich iTag/TagAPI nicht verwenden möchten. Ich versuche, Pakete zu verwenden, und ich fand eine Antwort, aber auch sie war veraltet.Bukkit - Spielername über Kopf ändern?

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)); 
} 

Hier ist dieser Thread ich weg gehen wurde: https://bukkit.org/threads/change-player-name-above-head.162356/

Jede Hilfe ist willkommen!

+1

Werfen Sie einen Blick auf dieses https://www.spigotmc.org/threads/change-name-above-head-spigot-1-8.66314/ – Kerooker

Antwort

2

Dies ist in 1.8 möglich. Aus praktischen Gründen habe ich ProtocolLib und PacketWrapper verwendet.

Seit dem 1.8-Update, das NamedEntitySpawn Paket wurde geändert und der Name ändert Spieler durch das Modifizieren wurde nicht mehr unterstützt (ref)

Aber this post gab eine Referenz. Wir Paket PlayerInfoData verwenden können. Ich habe einige Tests, und hier ist das Ergebnis (getestet gegen 1.9.2):

der Code Ist hier:

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); 
} 

Erläuterung:

  • Wir ProtocolLib verwenden, um die PlayerInfoData Pakete, die von der zu modifizieren Server, um den Anzeigenamen des Players zu ändern. (Sie können sehen, dass Namensschild und Tablistenname sogar zwei verschiedene Werte sein können!)
  • hidePlayer, showPlayer und REMOVE_PLAYER werden verwendet, um den Namen des Spielers sofort zu aktualisieren (andernfalls muss er sich aus- und wieder anmelden). Bisher habe ich keine bessere Methode gefunden. Wenn Sie eine haben, sagen Sie es :)
+0

Die Sache ist Um ProtocolLib zu verwenden, muss ich eine Version finden, die mit 1.7 Protocol Hack Build 1469 kompatibel ist. Aus diesem Grund verwende ich nicht TagAPI oder iTag. Dies wird leider nicht funktionieren. – Kaelinator

+0

@Kaelinator Ich glaube nicht, dass es möglich ist, dass sowohl 1.7 als auch 1.8 Spieler die Namensänderung mit demselben Codeschnipsel machen. Es gibt verschiedene Mechanismen. Sie müssen zwei verschiedene Arten von Paketen jeweils für 1,7 und 1,8 Benutzer senden, wenn Sie wirklich Protokoll hack über 1.7 und 1.8 haben wollen. – Cnly