[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 » Mi 18. Feb 2015, 21:39

Oben in dem Code wird doch das dataNameField mit profile.getName() gesetzt, dann habe ich einen weißen Namen, aber ich will ja den Display-Name in die Tablist setzten und dann auch noch über dem Kopf.
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 18. Feb 2015, 22:51

Mein Code sieht vor, dass du eine HashMap<Spieler UUID, Profil des Zunickenden Spielers> hast. Wenn du einen farbigen Namen willst, musst du ihn halt in dem Profil direkt verändern.
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 ilouHD » Mi 18. Feb 2015, 23:10

Jofkos hat geschrieben:Mein Code sieht vor, dass du eine HashMap<Spieler UUID, Profil des Zunickenden Spielers> hast. Wenn du einen farbigen Namen willst, musst du ihn halt in dem Profil direkt verändern.


Würde das setzen eines Scoreboard-Teams auch funktionieren, um einen farbigen Namen zu setzen?
Bild
Benutzeravatar
ilouHD
 
Beiträge: 1733
Registriert: Do 9. Jan 2014, 14:49

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

Beitragvon Twister_21 » Do 19. Feb 2015, 16:29

Hatte gerade ebend hier noch ein paar Fehler geschrieben, jetzt funktioniert es aber doch alles problemfrei, dann nochmal ein Danke :D
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 Flyingspirit » Do 19. Feb 2015, 23:25

ilouHD hat geschrieben:
Jofkos hat geschrieben:Mein Code sieht vor, dass du eine HashMap<Spieler UUID, Profil des Zunickenden Spielers> hast. Wenn du einen farbigen Namen willst, musst du ihn halt in dem Profil direkt verändern.


Würde das setzen eines Scoreboard-Teams auch funktionieren, um einen farbigen Namen zu setzen?


Ja.
Flyingspirit
 

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

Beitragvon Twister_21 » Fr 20. Feb 2015, 07:06

Das Problem damit ist ja bloß, dass man den Namen nicht vollständig verändern kann.
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 Twister_21 » Fr 20. Feb 2015, 21:18

Noch eine Frage: Wie kann man mit dem Code:

Code: Alles auswählen
  1.       EntityPlayer entity = ((CraftPlayer) e.getPlayer()).getHandle();
  2.       Channel playerChannel = Reflect.get(channelField, entity.playerConnection.networkManager);
  3.          playerChannel.pipeline().addAfter("encoder", "nick_listener", new MessageToMessageEncoder<Packet>() {
  4.             @Override
  5.             protected void encode(ChannelHandlerContext chc, Packet packet, List<Object> out) throws Exception {
  6.                if (packet instanceof PacketPlayOutPlayerInfo) {
  7.                   PacketPlayOutPlayerInfo infoPacket = (PacketPlayOutPlayerInfo) packet;
  8.                  
  9.                   List<PlayerInfoData> info = Reflect.get(dataField, infoPacket); // Liste mit PlayerInfoData, die die zu spawnenden Spieler enthält
  10.                   EnumPlayerInfoAction action = Reflect.get(actionField, infoPacket); // Aktion vom Packet getten
  11.                  
  12.                   if (!info.isEmpty() && action == EnumPlayerInfoAction.ADD_PLAYER) {
  13.                      for (PlayerInfoData data : info) {
  14.                         if (!nicks.containsKey(data.a().getId())) continue;
  15.                        
  16.                         GameProfile profile = nicks.get(data.a().getId()); // Nick Profile für den Namen getten
  17.                         Reflect.set(idField, profile, data.a().getId()); // Player UUID im Profile ersetzen
  18.                         Reflect.set(dataGameprofileField, data, profile); // GameProfile in PlayerInfoData aktualisieren
  19.                        
  20.                        
  21.                         IChatBaseComponent name = CraftChatMessage.fromString(Bukkit.getPlayer(data.a().getId()).getDisplayName())[0];
  22.                         Reflect.set(dataNameField, data, name); // Name in PlayerInfoData aktualisieren
  23.                      }
  24.                   }
  25.                  
  26.                }
  27.                out.add(packet); // Packet weitergeben
  28.             }
  29.            
  30.          });


es so machen, dass ein bestimmter User beim Joinen den User nicht bekommt? Also sodass er für ihn nicht da ist.
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 » Sa 21. Feb 2015, 10:47

Twister_21 hat geschrieben:Noch eine Frage: Wie kann man mit dem Code:

Code: Alles auswählen
  1.       EntityPlayer entity = ((CraftPlayer) e.getPlayer()).getHandle();
  2.       Channel playerChannel = Reflect.get(channelField, entity.playerConnection.networkManager);
  3.          playerChannel.pipeline().addAfter("encoder", "nick_listener", new MessageToMessageEncoder<Packet>() {
  4.             @Override
  5.             protected void encode(ChannelHandlerContext chc, Packet packet, List<Object> out) throws Exception {
  6.                if (packet instanceof PacketPlayOutPlayerInfo) {
  7.                   PacketPlayOutPlayerInfo infoPacket = (PacketPlayOutPlayerInfo) packet;
  8.                  
  9.                   List<PlayerInfoData> info = Reflect.get(dataField, infoPacket); // Liste mit PlayerInfoData, die die zu spawnenden Spieler enthält
  10.                   EnumPlayerInfoAction action = Reflect.get(actionField, infoPacket); // Aktion vom Packet getten
  11.                  
  12.                   if (!info.isEmpty() && action == EnumPlayerInfoAction.ADD_PLAYER) {
  13.                      for (PlayerInfoData data : info) {
  14.                         if (!nicks.containsKey(data.a().getId())) continue;
  15.                        
  16.                         GameProfile profile = nicks.get(data.a().getId()); // Nick Profile für den Namen getten
  17.                         Reflect.set(idField, profile, data.a().getId()); // Player UUID im Profile ersetzen
  18.                         Reflect.set(dataGameprofileField, data, profile); // GameProfile in PlayerInfoData aktualisieren
  19.                        
  20.                        
  21.                         IChatBaseComponent name = CraftChatMessage.fromString(Bukkit.getPlayer(data.a().getId()).getDisplayName())[0];
  22.                         Reflect.set(dataNameField, data, name); // Name in PlayerInfoData aktualisieren
  23.                      }
  24.                   }
  25.                  
  26.                }
  27.                out.add(packet); // Packet weitergeben
  28.             }
  29.            
  30.          });


es so machen, dass ein bestimmter User beim Joinen den User nicht bekommt? Also sodass er für ihn nicht da ist.

Wie nicht da? Unsichtbar oder was?
Dann müsstest du das PacketPlayOutPlayerInfo und PacketPlayOutNamedEntitySpawn einfach nicht weitergeben (an die "out" Liste)
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 » Sa 21. Feb 2015, 12:04

Ok, jetzt habe ich beim unnicken ein Problem, hab das so gemacht:

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.                GameProfile prof = GameProfileBuilder.fetch(UUIDFetcher.getUUID(ChatColor.stripColor(name)));
  8.                nameField.set(prof, name);
  9.               
  10.                EntityPlayer entity = ((CraftPlayer) p).getHandle();
  11.               
  12.                PacketPlayOutEntityDestroy despawn = new PacketPlayOutEntityDestroy(entity.getId());
  13.               
  14.                PacketPlayOutPlayerInfo removeProfile = new PacketPlayOutPlayerInfo();
  15.                setInfo(removeProfile, EnumPlayerInfoAction.REMOVE_PLAYER, new PlayerInfoData(removeProfile, GameProfileBuilder.fetch(UUIDFetcher.getUUID(ChatColor.stripColor(p.getDisplayName()))), -1, null, null));
  16.               
  17.                PacketPlayOutPlayerInfo info = new PacketPlayOutPlayerInfo();
  18.                setInfo(info, EnumPlayerInfoAction.ADD_PLAYER, new PlayerInfoData(info, prof, entity.ping, entity.playerInteractManager.getGameMode(), CraftChatMessage.fromString(name)[0]));
  19.               
  20.                PacketPlayOutNamedEntitySpawn spawn = new PacketPlayOutNamedEntitySpawn(entity);
  21.                playerUuidField.set(spawn, prof.getId());
  22.               
  23.                List<Player> players = (List<Player>) Bukkit.getOnlinePlayers();
  24.               
  25.                synchronized (players) {
  26.                   for (Player player : players) {
  27.                      if (player == p) continue;
  28.                     
  29.                      PlayerConnection connection = ((CraftPlayer) player).getHandle().playerConnection;
  30.                     
  31.                      connection.sendPacket(despawn);
  32.                      connection.sendPacket(removeProfile);
  33.                   }
  34.                }
  35.               
  36.                synchronized (this) {
  37.                   wait(50L);                 
  38.                }
  39.               
  40.                synchronized (players) {
  41.                   for (Player player : players) {
  42.                      if (player == p) continue;
  43.                     
  44.                      PlayerConnection connection = ((CraftPlayer) player).getHandle().playerConnection;
  45.                     
  46.                      connection.sendPacket(info);
  47.                      connection.sendPacket(spawn);
  48.                   }
  49.                }
  50.             } catch (Exception e) {
  51.                e.printStackTrace();
  52.             }
  53.          }
  54.       });
  55.    }


Und das wird dann hier ausgeführt:

Code: Alles auswählen
  1.                             if(main.getInstance().TeamD.contains(players)) {
  2.                                Bukkit.broadcastMessage("test7");
  3.                               String name = players.getName();
  4.                               String newname;
  5.                               if(name.length() > 14) {
  6.                                  name = name.substring(0, 14);
  7.                               }
  8.                               newname = "§b" + name;
  9.                               Bukkit.getScheduler().scheduleSyncDelayedTask(main.getInstance(), new Runnable() {
  10.                               
  11.                               @Override
  12.                               public void run() {
  13.                                  Tag.unnick(players, newname);
  14.                                  
  15.                               }
  16.                            }, 3);
  17.                               players.setPlayerListName(newname);
  18.                               players.setDisplayName(newname);
  19.                             }


Aber es passiert gar nichts, der Nick bleibt immer noch.

Und weißt du wovon es abhängt, ob der Spieler seinen eigenen genickten Skin sieht? Habe auf zwei Servern die gleiche Klasse, auf dem einen ist das so, auf dem anderen nicht.
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 » Sa 21. Feb 2015, 15:35

Twister_21 hat geschrieben:Ok, jetzt habe ich beim unnicken ein Problem, hab das so gemacht:

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.                GameProfile prof = GameProfileBuilder.fetch(UUIDFetcher.getUUID(ChatColor.stripColor(name)));
  8.                nameField.set(prof, name);
  9.               
  10.                EntityPlayer entity = ((CraftPlayer) p).getHandle();
  11.               
  12.                PacketPlayOutEntityDestroy despawn = new PacketPlayOutEntityDestroy(entity.getId());
  13.               
  14.                PacketPlayOutPlayerInfo removeProfile = new PacketPlayOutPlayerInfo();
  15.                setInfo(removeProfile, EnumPlayerInfoAction.REMOVE_PLAYER, new PlayerInfoData(removeProfile, GameProfileBuilder.fetch(UUIDFetcher.getUUID(ChatColor.stripColor(p.getDisplayName()))), -1, null, null));
  16.               
  17.                PacketPlayOutPlayerInfo info = new PacketPlayOutPlayerInfo();
  18.                setInfo(info, EnumPlayerInfoAction.ADD_PLAYER, new PlayerInfoData(info, prof, entity.ping, entity.playerInteractManager.getGameMode(), CraftChatMessage.fromString(name)[0]));
  19.               
  20.                PacketPlayOutNamedEntitySpawn spawn = new PacketPlayOutNamedEntitySpawn(entity);
  21.                playerUuidField.set(spawn, prof.getId());
  22.               
  23.                List<Player> players = (List<Player>) Bukkit.getOnlinePlayers();
  24.               
  25.                synchronized (players) {
  26.                   for (Player player : players) {
  27.                      if (player == p) continue;
  28.                     
  29.                      PlayerConnection connection = ((CraftPlayer) player).getHandle().playerConnection;
  30.                     
  31.                      connection.sendPacket(despawn);
  32.                      connection.sendPacket(removeProfile);
  33.                   }
  34.                }
  35.               
  36.                synchronized (this) {
  37.                   wait(50L);                 
  38.                }
  39.               
  40.                synchronized (players) {
  41.                   for (Player player : players) {
  42.                      if (player == p) continue;
  43.                     
  44.                      PlayerConnection connection = ((CraftPlayer) player).getHandle().playerConnection;
  45.                     
  46.                      connection.sendPacket(info);
  47.                      connection.sendPacket(spawn);
  48.                   }
  49.                }
  50.             } catch (Exception e) {
  51.                e.printStackTrace();
  52.             }
  53.          }
  54.       });
  55.    }


Und das wird dann hier ausgeführt:

Code: Alles auswählen
  1.                             if(main.getInstance().TeamD.contains(players)) {
  2.                                Bukkit.broadcastMessage("test7");
  3.                               String name = players.getName();
  4.                               String newname;
  5.                               if(name.length() > 14) {
  6.                                  name = name.substring(0, 14);
  7.                               }
  8.                               newname = "§b" + name;
  9.                               Bukkit.getScheduler().scheduleSyncDelayedTask(main.getInstance(), new Runnable() {
  10.                               
  11.                               @Override
  12.                               public void run() {
  13.                                  Tag.unnick(players, newname);
  14.                                  
  15.                               }
  16.                            }, 3);
  17.                               players.setPlayerListName(newname);
  18.                               players.setDisplayName(newname);
  19.                             }


Aber es passiert gar nichts, der Nick bleibt immer noch.


Ich weiss leider nicht in welchem Kontext du diesen Code ausführst. Wenn du, auch hier, mit PacketListenern arbeitest, genügt es den Spieler mit dem neuen GameProfile in die HashMap einzufügen, und dann einfach ein Destroy, TabListRemove, TablistAdd (unmodifiziert, übernimmt der PacketListener) und Spawn Packet zu senden.
Twister_21 hat geschrieben:Und weißt du wovon es abhängt, ob der Spieler seinen eigenen genickten Skin sieht? Habe auf zwei Servern die gleiche Klasse, auf dem einen ist das so, auf dem anderen nicht.

Ich vermute mal, dass wenn du die Packets immer modifizierst (auch das erste, was dem Spieler gesendet wird), sieht ein Spieler seinen eigenen genickten Skin.
Jofkos

...........

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

VorherigeNächste

Zurück zu Anleitungen

Wer ist online?

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

cron