[Anleitung] Spieler Nicken - Name und Skin ändern - 1.8.8

Hier könnt ihr anderen Leuten helfen, indem ihr Anleitungen oder praktische Codesegmente zur Verfügung stellt.

Re: [Anleitung] Spieler Nicken - Name und Skin ändern - 1.8+

Beitragvon Twister_21 » Di 24. Feb 2015, 14:41

Hab gerade noch mal etwas ausprobiert und es so gemacht, dass wenn ein Spieler ohne Nick joint ich entity.getProfile() genommen habe. Dann hat aber nicht mal mehr /tp [Spielername] funktioniert. Wenn ich sein Profile über den GameProfileFetcher besorgt habe ging es noch. Wollte das mal so ausprobieren, damit ich die Zeit bei Spielern dessen GameProfile ich sowieso nicht neu fetchen muss sparen kann, scheint aber irgendwie nicht zu klappen. Weißt du wieso das so ist?

Dann kam als Join-Message: "[Spielername] (formerly known as [Farbe + Spielername]) joined the game"

Und ich hab noch eine Frage:

Wenn ich ein NamedEntity so spawne:
Code: Alles auswählen
  1. PacketPlayOutNamedEntitySpawn spawn = new PacketPlayOutNamedEntitySpawn(entity);
  2. playerUuidField.set(spawn, prof.getId());


Dann kann ich es so nicht entfernen:
Code: Alles auswählen
  1. PacketPlayOutEntityDestroy despawn = new PacketPlayOutEntityDestroy(prof.getId());


Wie kann ich es sonst machen?
Mit freundlichen Grüßen
Twister21
Benutzeravatar
Twister_21
 
Beiträge: 652
Registriert: Mi 11. Jun 2014, 05:51
Wohnort: Deutschland

Re: [Anleitung] Spieler Nicken - Name und Skin ändern - 1.8+

Beitragvon Jofkos » Di 24. Feb 2015, 19:23

Was genau nicht funktioniert ("/tp [spielername]) kann ich dir so, ohne code, nicht sagen.

Dein zweites Problem ist: du brauchst die EntityId, nicht die UUID
Jofkos

...........

..Bild
Benutzeravatar
Jofkos
 
Beiträge: 1537
Registriert: So 16. Jun 2013, 22:45

Re: [Anleitung] Spieler Nicken - Name und Skin ändern - 1.8+

Beitragvon Twister_21 » Di 24. Feb 2015, 19:47

1. Problem: Ich hab ja nichts verändert, außer aus GameProfileBuilder.fetch(...), entity.getProfile() gemacht.

2. Problem: Kann ich das aus einem GameProfile bekommen? Ich will den Spieler entnicken und deswegen das alte NamedEntitySpawn-Packet entfernen.
Mit freundlichen Grüßen
Twister21
Benutzeravatar
Twister_21
 
Beiträge: 652
Registriert: Mi 11. Jun 2014, 05:51
Wohnort: Deutschland

Re: [Anleitung] Spieler Nicken - Name und Skin ändern - 1.8+

Beitragvon Jofkos » Di 24. Feb 2015, 19:58

Twister_21 hat geschrieben:1. Problem: Ich hab ja nichts verändert, außer aus GameProfileBuilder.fetch(...), entity.getProfile() gemacht.

2. Problem: Kann ich das aus einem GameProfile bekommen? Ich will den Spieler entnicken und deswegen das alte NamedEntitySpawn-Packet entfernen.


1: schick trotzdem mal den kontext

2: ne aber die id vom genickten spieler ändert sich ja nicht
Jofkos

...........

..Bild
Benutzeravatar
Jofkos
 
Beiträge: 1537
Registriert: So 16. Jun 2013, 22:45

Re: [Anleitung] Spieler Nicken - Name und Skin ändern - 1.8+

Beitragvon Twister_21 » Mi 25. Feb 2015, 15:52

Ok,

Nr 1: Hier die nicht funktionierende Funktion die beim joinen aufgerufen wird und der Spieler dann irgendwie nicht mehr existiert (habe ich mit dem Minecraft-TP-Befehl getestet). Eigentlich wird bei der Methode nur die Art geändert, um das GameProfile zu fetchen:

Code: Alles auswählen
  1. public static void setTag(final Player p, final String name) {
  2.           pool.execute(new Runnable() {
  3.              @SuppressWarnings("unchecked")
  4.          @Override
  5.              public void run() {
  6.                 try {
  7.                   
  8.                   p.setDisplayName(name);
  9.                  p.setPlayerListName(name);
  10.                   
  11.                    EntityPlayer entity = ((CraftPlayer) p).getHandle();
  12.                   
  13.                    if(!profiles.containsKey(entity.getUniqueID())) {
  14.                       profiles.put(entity.getUniqueID(), entity.getProfile()); //Hier wird das GameProfile gefetcht und gespeichert, wenn ich es mit GameProfileBuilder.fetch(UUIDFetcher.getUUID(p.getName())) mache geht es
  15.                    }
  16.                   
  17.                    GameProfile prof = profiles.get(entity.getUniqueID());
  18.                   
  19.                    nameField.set(prof, name);
  20.                   
  21.                    PacketPlayOutEntityDestroy despawn = new PacketPlayOutEntityDestroy(entity.getId());
  22.                   
  23.                    PacketPlayOutPlayerInfo removeProfile = new PacketPlayOutPlayerInfo();
  24.                    setInfo(removeProfile, EnumPlayerInfoAction.REMOVE_PLAYER, new PlayerInfoData(removeProfile, prof, -1, null, null));
  25.                   
  26.                    PacketPlayOutPlayerInfo info = new PacketPlayOutPlayerInfo();
  27.                    setInfo(info, EnumPlayerInfoAction.ADD_PLAYER, new PlayerInfoData(info, prof, entity.ping, entity.playerInteractManager.getGameMode(), CraftChatMessage.fromString(name)[0]));
  28.                   
  29.                    PacketPlayOutNamedEntitySpawn spawn = new PacketPlayOutNamedEntitySpawn(entity);
  30.                    playerUuidField.set(spawn, prof.getId());
  31.                   
  32.                    List<Player> players = (List<Player>) Bukkit.getOnlinePlayers();
  33.                   
  34.                    synchronized (players) {
  35.                       for (Player player : players) {
  36.                          if (player == p) continue;
  37.                         
  38.                          PlayerConnection connection = ((CraftPlayer) player).getHandle().playerConnection;
  39.                         
  40.                          connection.sendPacket(despawn);
  41.                          connection.sendPacket(removeProfile);
  42.                       }
  43.                    }
  44.                   
  45.                    synchronized (this) {
  46.                       wait(50L);                 
  47.                    }
  48.                   
  49.                    synchronized (players) {
  50.                       for (Player player : players) {
  51.                          if (player == p) continue;
  52.                         
  53.                          PlayerConnection connection = ((CraftPlayer) player).getHandle().playerConnection;
  54.                         
  55.                          connection.sendPacket(info);
  56.                          connection.sendPacket(spawn);
  57.                       }
  58.                    }
  59.                 } catch (Exception e) {
  60.                    e.printStackTrace();
  61.                 }
  62.              }
  63.           });
  64.        }


2.Das war mein Versuch der Unnick-Methode, aber es funktioniert nur die setPlayerListName() und setDisplayName-Methode, mit den Packets funktioniert das nicht:

Code: Alles auswählen
  1. public static void unnick(final Player p, final String name) {
  2.       pool.execute(new Runnable() {
  3.          @SuppressWarnings("unchecked")
  4.          @Override
  5.          public void run() {
  6.             try {
  7.               
  8.               p.setDisplayName(name);
  9.              p.setPlayerListName(name);
  10.               
  11.                GameProfile prof = GameProfileBuilder.fetch(p.getUniqueId());
  12.                nameField.set(prof, name);
  13.               
  14.                EntityPlayer entity = ((CraftPlayer) p).getHandle();
  15.               
  16.                PacketPlayOutEntityDestroy despawn = new PacketPlayOutEntityDestroy(entity.getId());
  17.               
  18.                PacketPlayOutPlayerInfo removeProfile = new PacketPlayOutPlayerInfo();
  19.                setInfo(removeProfile, EnumPlayerInfoAction.REMOVE_PLAYER, new PlayerInfoData(removeProfile, profiles.get(p.getUniqueId()), -1, null, null));
  20.               
  21.                PacketPlayOutPlayerInfo info = new PacketPlayOutPlayerInfo();
  22.                setInfo(info, EnumPlayerInfoAction.ADD_PLAYER, new PlayerInfoData(info, prof, entity.ping, entity.playerInteractManager.getGameMode(), CraftChatMessage.fromString(name)[0]));
  23.               
  24.                PacketPlayOutNamedEntitySpawn spawn = new PacketPlayOutNamedEntitySpawn(entity);
  25.                playerUuidField.set(spawn, prof.getId());
  26.               
  27.                List<Player> players = (List<Player>) Bukkit.getOnlinePlayers();
  28.               
  29.                synchronized (players) {
  30.                   for (Player player : players) {
  31.                      if (player == p) continue;
  32.                     
  33.                      PlayerConnection connection = ((CraftPlayer) player).getHandle().playerConnection;
  34.                     
  35.                      connection.sendPacket(despawn);
  36.                      connection.sendPacket(removeProfile);
  37.                   }
  38.                }
  39.               
  40.                synchronized (this) {
  41.                   wait(50L);                 
  42.                }
  43.               
  44.                synchronized (players) {
  45.                   for (Player player : players) {
  46.                      if (player == p) continue;
  47.                     
  48.                      PlayerConnection connection = ((CraftPlayer) player).getHandle().playerConnection;
  49.                     
  50.                      connection.sendPacket(info);
  51.                      connection.sendPacket(spawn);
  52.                   }
  53.                }
  54.             } catch (Exception e) {
  55.                e.printStackTrace();
  56.             }
  57.          }
  58.       });
  59.    }
Mit freundlichen Grüßen
Twister21
Benutzeravatar
Twister_21
 
Beiträge: 652
Registriert: Mi 11. Jun 2014, 05:51
Wohnort: Deutschland

Re: [Anleitung] Spieler Nicken - Name und Skin ändern - 1.8+

Beitragvon Jofkos » Mi 25. Feb 2015, 18:38

Gib mal das GameProfile aus, das du in die Map speicherst. Es ist möglich, dass dieses an der Stelle noch null ist.
Jofkos

...........

..Bild
Benutzeravatar
Jofkos
 
Beiträge: 1537
Registriert: So 16. Jun 2013, 22:45

Re: [Anleitung] Spieler Nicken - Name und Skin ändern - 1.8+

Beitragvon Twister_21 » Do 26. Feb 2015, 21:16

Ok, dann teste ich das mal. Hast du noch eine Idee zu zweitens? Also warum der Spieler nicht entnickt wird?
Mit freundlichen Grüßen
Twister21
Benutzeravatar
Twister_21
 
Beiträge: 652
Registriert: Mi 11. Jun 2014, 05:51
Wohnort: Deutschland

Re: [Anleitung] Spieler Nicken - Name und Skin ändern - 1.8+

Beitragvon Jofkos » Do 26. Feb 2015, 21:19

Twister_21 hat geschrieben:Ok, dann teste ich das mal. Hast du noch eine Idee zu zweitens? Also warum der Spieler nicht entnickt wird?

Zum entnicken einfach destroy, removeTabList, addTabList (new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.ADD_PLAYER, new EntityPlayer[] { derSpieler });) und dann spawn.
Du musst da gar nichts fetchen oder so
Jofkos

...........

..Bild
Benutzeravatar
Jofkos
 
Beiträge: 1537
Registriert: So 16. Jun 2013, 22:45

Re: [Anleitung] Spieler Nicken - Name und Skin ändern - 1.8+

Beitragvon DerFreys » Sa 28. Feb 2015, 00:29

Habe einen kleinen Bug entdeckt, und zwar wenn der genickte Spieler in eine andere Welt teleportiert wird, wird er unsichtbar :D
Wie kann ich das beheben?
Benutzeravatar
DerFreys
 
Beiträge: 26
Registriert: Sa 28. Feb 2015, 00:28

Re: [Anleitung] Spieler Nicken - Name und Skin ändern - 1.8+

Beitragvon Twister_21 » Sa 28. Feb 2015, 11:03

Zu meinen Problemen:

den 1.Fehler habe ich gefunden, wieso entity.getProfile() nicht geht. Das liegt daran, dass ich dann nicht mehr Twister_21, sondern §4Twister_21 für den Server heiße. So funktioniert das: new GameProfile(entity.getUniqueID(), ChatColor.stripColor(name)). Ist das denn effektiver als den GameProfileBuilder zu nehmen oder ist das das Gleiche? Und ist das new GameProfile oder entity.getProfile() (wenn es gehen würde) besser?

Aber bei new GameProfile gibt es doch glaube ich auch keinen Delay den man warten muss, bevor man sich erneut das GameProfile holen kann, oder?

EDIT: Mir ist gerade aufgefallen, dass ja bei new GameProfile wieder der Skin falsch ist. Gibt es denn eine Möglich entity.getProfile() zu nehmen und dann den Namen zu verändern? Also z.B. mit ChatColor.stripColor()?
Mit freundlichen Grüßen
Twister21
Benutzeravatar
Twister_21
 
Beiträge: 652
Registriert: Mi 11. Jun 2014, 05:51
Wohnort: Deutschland

VorherigeNächste

Zurück zu Anleitungen

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste