Seite 19 von 21

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

BeitragVerfasst: Fr 23. Okt 2015, 23:07
von Twister_21
Das wurde jetzt vermutlich zum dritten oder vierten mal gefragt.

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

BeitragVerfasst: So 8. Nov 2015, 13:12
von chaoskiller99
geht das auch für BungeeCord

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

BeitragVerfasst: So 8. Nov 2015, 14:53
von IcySkill
BungeeCord verfügt von sich aus nicht über die packets von Bukkit/Spigot. Aber es gibt da glaube ich eine API, die das kann - muss aber nicht sein.

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

BeitragVerfasst: So 8. Nov 2015, 20:00
von IcySkill
Hey,

ich versuche jetzt zum 2. Mal diese Klasse zum laufen zu bekommen, jedoch will es einfach nicht. Hier mein Code, welcher bis zur Debug-nachricht "91" ausgeführt wird:

Code: Alles auswählen
  1. package de.icyskill.core.manager;
  2. import com.mojang.authlib.GameProfile;
  3. import de.icyskill.core.misc.GameProfileBuilder;
  4. import de.icyskill.core.misc.UUIDFetcher;
  5. import java.lang.reflect.Field;
  6. import java.lang.reflect.Modifier;
  7. import java.util.Arrays;
  8. import java.util.Collection;
  9. import java.util.concurrent.ExecutorService;
  10. import java.util.concurrent.Executors;
  11. import net.minecraft.server.v1_8_R3.EntityPlayer;
  12. import net.minecraft.server.v1_8_R3.PacketPlayOutEntityDestroy;
  13. import net.minecraft.server.v1_8_R3.PacketPlayOutNamedEntitySpawn;
  14. import net.minecraft.server.v1_8_R3.PacketPlayOutPlayerInfo;
  15. import net.minecraft.server.v1_8_R3.PacketPlayOutPlayerInfo.EnumPlayerInfoAction;
  16. import net.minecraft.server.v1_8_R3.PacketPlayOutPlayerInfo.PlayerInfoData;
  17. import net.minecraft.server.v1_8_R3.PlayerConnection;
  18. import org.bukkit.Bukkit;
  19. import org.bukkit.ChatColor;
  20. import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer;
  21. import org.bukkit.craftbukkit.v1_8_R3.util.CraftChatMessage;
  22. import org.bukkit.entity.Player;
  23. public class NickManager {
  24.     private static ExecutorService pool = Executors.newCachedThreadPool();
  25.     private static Field modifiers = getField(Field.class, "modifiers");
  26.     private static Field playerUuidField = getField(PacketPlayOutNamedEntitySpawn.class, "b");
  27.     private static Field actionField = getField(PacketPlayOutPlayerInfo.class, "a");
  28.     private static Field dataField = getField(PacketPlayOutPlayerInfo.class, "b");
  29.     private static Field nameField = getField(GameProfile.class, "name");
  30.     public static void nick(final Player player, final String name) {
  31.         pool.execute(new Runnable() {
  32.             @Override
  33.             public void run() {
  34.                 try {
  35.                     GameProfile prof = GameProfileBuilder.fetch(UUIDFetcher.getUUID(ChatColor.stripColor(name)));
  36.                     System.out.println("42");
  37.                     nameField.set(prof, name);
  38.                     System.out.println("44");
  39.                     EntityPlayer entity = ((CraftPlayer) player).getHandle();
  40.                     System.out.println("46");
  41.                     PacketPlayOutEntityDestroy despawn = new PacketPlayOutEntityDestroy(entity.getId());
  42.                     System.out.println("48");
  43.                     PacketPlayOutPlayerInfo removeProfile = new PacketPlayOutPlayerInfo();
  44.                     System.out.println("50");
  45.                     setInfo(removeProfile, EnumPlayerInfoAction.REMOVE_PLAYER, removeProfile.new PlayerInfoData(entity.getProfile(), -1, null, null));
  46.                     System.out.println("52");
  47.                     PacketPlayOutPlayerInfo info = new PacketPlayOutPlayerInfo();
  48.                     System.out.println("54");
  49.                     setInfo(info, EnumPlayerInfoAction.ADD_PLAYER, info.new PlayerInfoData(prof, entity.ping, entity.playerInteractManager.getGameMode(), CraftChatMessage.fromString(name)[0]));
  50.                     System.out.println("56");
  51.                     PacketPlayOutNamedEntitySpawn spawn = new PacketPlayOutNamedEntitySpawn(entity);
  52.                     System.out.println("58");
  53.                     playerUuidField.set(spawn, prof.getId());
  54.                     System.out.println("60");
  55.                     Collection<? extends Player> players = Bukkit.getOnlinePlayers();
  56.                     System.out.println("62");
  57.                     synchronized(players) {
  58.                         System.out.println("64");
  59.                         for(Player player : players) {
  60.                             System.out.println("66");
  61.                             if(player == player) {
  62.                                 System.out.println("68");
  63.                                 continue;
  64.                             }
  65.                             System.out.println("70");
  66.                             PlayerConnection connection = ((CraftPlayer) player).getHandle().playerConnection;
  67.                             System.out.println("73");
  68.                             connection.sendPacket(despawn);
  69.                             System.out.println("75");
  70.                             connection.sendPacket(removeProfile);
  71.                             System.out.println("77");
  72.                         }
  73.                     }
  74.                     synchronized(this) {
  75.                         System.out.println("82");
  76.                         wait(50L);
  77.                         System.out.println("84");
  78.                     }
  79.                     synchronized(players) {
  80.                         System.out.println("87");
  81.                         for(Player player : players) {
  82.                             System.out.println("89");
  83.                             if(player == player) {
  84.                                 System.out.println("91");
  85.                                 continue;
  86.                             }
  87.                             System.out.println("93");
  88.                             PlayerConnection connection = ((CraftPlayer) player).getHandle().playerConnection;
  89.                             System.out.println("95");
  90.                             connection.sendPacket(info);
  91.                             System.out.println("97");
  92.                             connection.sendPacket(spawn);
  93.                             System.out.println("99");
  94.                         }
  95.                     }
  96.                 } catch (Exception e) {
  97.                     e.printStackTrace();
  98.                 }
  99.             }
  100.         });
  101.     }
  102.     private static PacketPlayOutPlayerInfo setInfo(PacketPlayOutPlayerInfo packet, EnumPlayerInfoAction action, PlayerInfoData... data) {
  103.         try {
  104.             actionField.set(packet, action);
  105.             dataField.set(packet, Arrays.asList(data));
  106.         } catch(Exception e) {
  107.             e.printStackTrace();
  108.         }
  109.         return packet;
  110.     }
  111.     private static Field getField(Class<?> clazz, String name) {
  112.         try {
  113.             Field field = clazz.getDeclaredField(name);
  114.             field.setAccessible(true);
  115.             if(Modifier.isFinal(field.getModifiers())) {
  116.                 modifiers.set(field, field.getModifiers() & ~Modifier.FINAL);
  117.             }
  118.             return field;
  119.         } catch(Exception e) {
  120.             e.printStackTrace();
  121.         }
  122.         return null;
  123.     }
  124. }


Ich hoffe, jemand kann mir helfen bzw. sagen, was ich denn falsch mache.

Vielen Dank im Voraus!

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

BeitragVerfasst: So 8. Nov 2015, 22:25
von PostCrafter
Weißt du überhaupt was du da machst?!

Code: Alles auswählen
  1.                             if(player == player) {
  2.                                 System.out.println("91");
  3.                                 continue;
  4.                             }


Deine Abfrage ergibt immer true, wenn player nicht player wäre, ist irgendetwas richtig schief gelaufen.

Danach verwendest du continue, was diesen Durchlauf der for-Schleife abbricht und in den nächsten Eintrag weiter springt - der folgende Code der Schleife wird also nie ausgeführt.

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

BeitragVerfasst: Mo 9. Nov 2015, 11:23
von IcySkill
@Postcrafter
Dieser Code ist 1:1 dieser Code hier aus diesem Thread auf der ersten Seite. Diese Abfrage dient dazu, das nur die anderen Spieler den Spieler als genickt sehen und der Spieler sich selbst als "sich selbst". Das heißt wenn kein anderer Spieler online ist, dann hört der Code dort auf, aber zu meinem Testzeitpunkt war ein zweiter Spieler online, also müsste die Abfrage bei dem Spieler, der genickt werden soll true ergeben und diesen Spieler in der Abfrage überspringen und ersten mit dem nächsten Spieler der online ist weiter machen.

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

BeitragVerfasst: Mo 9. Nov 2015, 11:33
von Ch4t4r
Nein. Dort steht if(player == p), es werden also zwei unterschiedliche Objekte verglichen. Du machst if (player == player) , vergleichst das Objekt also mit sich selbst was immer true ist. Die schleife läuft also nie durch, wenn es wirklich so da steht.

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

BeitragVerfasst: Mo 9. Nov 2015, 14:17
von IcySkill
Eine weitere Frage: Zum unnicken benötige ich ja das GameProfile, das zum nicken erstellt wurde. Dieses muss ich zusammen mit der UUID des genickten Spielers abspeichern, aber wie entferne ich den Genickten namen aus der Tablist? Dazu benötige ich ja eine Entity-ID ... bekomme ich die aus dem GameProfile, das mit der UUID abgespeichert wurde?

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

BeitragVerfasst: Mo 9. Nov 2015, 17:12
von PostCrafter
Im Zweifelsfall sollte diese doch über Bukkit.getPlayer(uuid).getEntityId() zu bekommen sein, wobei uuid die UUID ist, die du sowieso verwendest um ihr ein GameProfile zuzuweisen.

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

BeitragVerfasst: Mo 9. Nov 2015, 17:33
von IcySkill
Ich habe da ein neues Problem: Und zwar möchte ich den Spielern den Rang des Spielers in der Tabliste anzeigen lassen. Hierzu wollte ich den PlayerListName des Spielers ändern, was aber ja nicht viel bringt, da er genickt ist und der Rang in der Tablist dann entsprechend nur dem Spieler angezeigt wird. Wie kann ich den Tablist-Namen eines genickten Spielers für alle ändern?

EDIT: Gelöst ... habe mir Teams erstellt und dann den Nicknamen anstatt den Spielernamen hinzugefügt.