Nametag zeigt Nickname und echten Namen an

Wenn ihr bei eurem Plugin nicht weiter kommt, könnt ihr hier euer Problem beschreiben und um Hilfe bitten.

Nametag zeigt Nickname und echten Namen an

Beitragvon binnepizza » Mi 17. Aug 2016, 09:38

Hallo, ich habe ein Nickplugin programmiert, welches mir beim Joinen auf den Server einen automatischen Nicknamen gibt. Dieser Nickname wird als Displayname gesetzt und in der Tablist angezeigt. Das habe ich alles mit Scoreboards geregelt. Nun zum Problem; Es wird als Nametag nicht nur der Nickname, sondern auch der echte Name dahinter angezeigt. Logischerweise sollte da nur der Nickname stehen. Das habe ich auch mit Scoreboards gemacht. Liegt der Fehler darin, dass ich das mit Scoreboards mache, also den Nametag ändere? Spigot 1.8 ist die Serverversion.
Benutzeravatar
binnepizza
 
Beiträge: 5
Registriert: Mi 17. Aug 2016, 09:31

Re: Nametag zeigt Nickname und echten Namen an

Beitragvon Letsplaybar » Mi 17. Aug 2016, 11:30

Nickname setztman a durch p.setDisplayname und p.setPlayerListName(); oder b) mit Packets wo man das Gameprofile ändert. Das Scoreboard würde ich nur für die Prefixe vervenden...
Bild
Helfe Wo ich kann.
Mein MinecraftServer: Letsplaybaro.de - Suchen Developer/Bilder

I hacked 127.0.0.1!!! :)
Benutzeravatar
Letsplaybar
 
Beiträge: 195
Registriert: Mo 1. Feb 2016, 17:21
Wohnort: Berlin

Re: Nametag zeigt Nickname und echten Namen an

Beitragvon binnepizza » Mi 17. Aug 2016, 11:51

Habe mich falsch ausgedrückt. Den Displayname habe ich mit p.setDisplayname() gesetzt. Gibt es nicht eine Möglichkeit, nur den Nametag zu ändern?
Benutzeravatar
binnepizza
 
Beiträge: 5
Registriert: Mi 17. Aug 2016, 09:31

Re: Nametag zeigt Nickname und echten Namen an

Beitragvon Knadda » Mi 17. Aug 2016, 13:17

Schick einfach mal den code, da du anscheinend ein anderen Fehler hast. Die Methoden die Letsplaybar dir geschrieben hat, müssten funktionieren.
Benutzeravatar
Knadda
 
Beiträge: 49
Registriert: Mo 1. Aug 2016, 07:06

Re: Nametag zeigt Nickname und echten Namen an

Beitragvon binnepizza » Mi 17. Aug 2016, 14:16

Den Code kann ich erst später posten, wenn ich das mit dem GameProfile verwenden würde, hätte das dann auch Einfluss auf die Tablist oder würde das nur den Nametag verändern? Denn ich hätte es gerne so, wie es jetzt ist, denn es wird ja wie gesagt alles geändert, außer der Nametag, denn da ist ja der Nickname und der echte Name.
Benutzeravatar
binnepizza
 
Beiträge: 5
Registriert: Mi 17. Aug 2016, 09:31

Re: Nametag zeigt Nickname und echten Namen an

Beitragvon Knadda » Mi 17. Aug 2016, 15:39

Das Problem in diesem fall ist ja, dass du sowohl den Namen über dem Kopf als auch den Namen in der Tablist per Scoreboard ändern willst. Das Scoreboard ändert allerdings nur den Prefix und den Suffix eines ScoreboardTeams. Den Namen ansich kannst du dadurch nicht ändern.
Ich nehme an, dass du den ScoreboardTeam-Prefix zum Nickname gesetzt hast. Demnach wird auch der Nickname und der Realname angezeigt.
Ohne den Prefix zu setzen musst du die Methode p.setDisplayName() nutzen um seinen Tag zu ändern.
Wenn du Skype kannst mich ja adden: Tobias Meding (mit der JavaTasse)
Benutzeravatar
Knadda
 
Beiträge: 49
Registriert: Mo 1. Aug 2016, 07:06

Re: Nametag zeigt Nickname und echten Namen an

Beitragvon binnepizza » Mi 17. Aug 2016, 21:10

Ich habe das mit dem Nametag nun über Packets gelöst, jedoch wird nur beim JoinEvent der Nickname als Nametag gesetzt, nicht wenn ich mir einen neuen Nickname setze oder den Nickname entferne. Wenn ich versuche, mir einen neuen Nicknamen zu setzen, bleibt als Nametag der Nickname, den ich beim Joinen bekommen habe und vor diesem steht im Nametag der neue Nickname, den ich durch das Ändern mit dem Item bekomme habe. Wie kann ich nun machen, dass beim Rechtsklick mit einem Item sich auch der Nametag demensprechend in den Nickname ändert? In der Konsole erscheinen keine Fehler.
Zuletzt geändert von binnepizza am Fr 19. Aug 2016, 08:52, insgesamt 2-mal geändert.
Benutzeravatar
binnepizza
 
Beiträge: 5
Registriert: Mi 17. Aug 2016, 09:31

Re: Nametag zeigt Nickname und echten Namen an

Beitragvon Knadda » Mi 17. Aug 2016, 21:37

Mir sind jetzt beim überfliegen der Klassen ist mir ein kleiner Fehler aufgefallen. Allerdings habe ich noch nicht erkannt, warum der nick nicht gesetzt wird.

1. SystemInterface.nickSet(Player player) Setzt du deine 30 namen jedes mal erneut in die liste ein. (1tes mal 30 namen, 2tes mal 60 namen, ....)
Benutzeravatar
Knadda
 
Beiträge: 49
Registriert: Mo 1. Aug 2016, 07:06

Re: Nametag zeigt Nickname und echten Namen an

Beitragvon Knadda » Do 18. Aug 2016, 01:13

Ich hab mal deine Nick-Klasse etwas umgeschrieben und jetzt funktioniert es einwandfrei ;)
Der Skin wird auch geändert, sofern der Spieler existiert. :D
Das mit dem Scoreboard hab ich in diesem Fall weggelassen, da ich den sinn hinter dieser anwendung nicht finden konnte. :D
Code: Alles auswählen
  1. public class SystemInterface {
  2.    private static HashMap<UUID, GameProfile> nickedPlayers = Maps.newHashMap();
  3.    private static final Map<String, GameProfile> BY_NAME = Maps.newHashMap();
  4.    private static final Map<UUID, GameProfile> BY_UUID = Maps.newHashMap();
  5.    
  6.    private static ArrayList<String> Names = new ArrayList<String>();
  7.    
  8.     public static void nameAdd(final String Name) {
  9.         if(Name.length() < 17) {
  10.             Names.add(Name);
  11.         } else {
  12.            
  13.         }
  14.     }
  15.     public static void nameRemove(final String Name) {
  16.         if(Names.contains(Name)) {
  17.             Names.remove(Name);
  18.         }
  19.     }
  20.     static {
  21.         Names.add("AirFusion");
  22.         Names.add("AmazingHuh");
  23.         Names.add("aranamor");
  24.         Names.add("atomic7732");
  25.         Names.add("Carmelpop");
  26.         Names.add("catlover2011");
  27.         Names.add("Chan14551");
  28.         Names.add("Zoarium");
  29.         Names.add("Chzydeath");
  30.         Names.add("CoolBlueJ");
  31.         Names.add("DaBomb");
  32.         Names.add("Darvince");
  33.         Names.add("DaSnipeKid");
  34.         Names.add("Dawnofdusk");
  35.         Names.add("De_n00bWOLF");
  36.         Names.add("DeepDarkSamu");
  37.         Names.add("DefaultStu");
  38.         Names.add("diamond146");
  39.         Names.add("DirtDog");
  40.         Names.add("DivinityV2");
  41.         Names.add("F0R1");
  42.         Names.add("faloxx");
  43.         Names.add("fire3232");
  44.         Names.add("firehawk729");
  45.         Names.add("Firestix");
  46.         Names.add("Fixin");
  47.         Names.add("For_the_lol");
  48.         Names.add("FoxHound42");
  49.         Names.add("Entophobia");
  50.         Names.add("Erak606");
  51.     }
  52.     public static void setNick(final Player player) {
  53.         final int zufall = new Random().nextInt(Names.size());
  54.         final String nick = Names.get(zufall);
  55.         final GameProfile profile = getProfile(player);
  56.         if (profile != null) {
  57.            if (nickedPlayers.containsKey(player.getUniqueId()) == false) {
  58.               nickedPlayers.put(player.getUniqueId(), profile);
  59.            }
  60.             final GameProfile profile2 = getProfile(nick, player.getUniqueId());
  61.             if (profile2 != null) {
  62.                 setProfile(player, profile2);
  63.             }
  64.             player.setDisplayName(nick);
  65.             player.setPlayerListName(nick);
  66.             for(final Player players : Bukkit.getOnlinePlayers()) {
  67.                if (players.equals(player) == false) {
  68.                   players.hidePlayer(player);
  69.                   players.showPlayer(player);
  70.                }
  71.             }
  72.         }
  73.     }
  74.     private static GameProfile getProfile(final Player player) {
  75.         final String version = Bukkit.getServer().getClass().getPackage().getName().substring(23);
  76.         try {
  77.          return (GameProfile) Class.forName("org.bukkit.craftbukkit."+version+".entity.CraftPlayer").getDeclaredMethod("getProfile").invoke(player);
  78.       } catch (final Exception e) {
  79.          e.printStackTrace();
  80.       }
  81.       return null;
  82.    }
  83.    public static String getRealName(final Player player) {
  84.       if (nickedPlayers.containsKey(player.getUniqueId())) {
  85.          return nickedPlayers.get(player.getUniqueId()).getName();
  86.       }
  87.       return player.getName();
  88.    }
  89.    public static void removeNick(final Player player) {
  90.         if (nickedPlayers.containsKey(player.getUniqueId())) {
  91.            setProfile(player, nickedPlayers.get(player.getUniqueId()));
  92.            nickedPlayers.remove(player.getUniqueId());
  93.             player.setDisplayName(player.getName());
  94.             player.setPlayerListName(player.getName());
  95.             for(final Player players : Bukkit.getOnlinePlayers()) {
  96.                if (players.equals(player) == false) {
  97.                   players.hidePlayer(player);
  98.                   players.showPlayer(player);
  99.                }
  100.             }
  101.         }
  102.        
  103.     }
  104.    private static void setProfile(final Player player, final GameProfile profile) {
  105.         final String version = Bukkit.getServer().getClass().getPackage().getName().substring(23);
  106.         try {
  107.            final Class<?> clazz = Class.forName("org.bukkit.craftbukkit."+version+".entity.CraftPlayer");
  108.            final Field field = getField(Class.forName("net.minecraft.server."+version+".EntityPlayer"));
  109.            if (field != null) {
  110.               field.set(clazz.getMethod("getHandle").invoke(player), profile);
  111.            }
  112.       } catch (final Exception e) {
  113.          e.printStackTrace();
  114.       }
  115.    }
  116.    private static Field getField(final Class<?> clazz) {
  117.       Field field = null;
  118.       for (final Field f : clazz.getDeclaredFields()) {
  119.          f.setAccessible(true);
  120.          if (f.getType().equals(GameProfile.class)) {
  121.             field = f;
  122.          }
  123.       }
  124.       if (field == null) {
  125.          for (final Field f : clazz.getFields()) {
  126.             f.setAccessible(true);
  127.             if (f.getType().equals(GameProfile.class)) {
  128.                field = f;
  129.             }
  130.          }
  131.       }
  132.       if (clazz.getSuperclass() != null && field == null) {
  133.          field = getField(clazz.getSuperclass());
  134.       }
  135.       return field;
  136.    }
  137.    public static boolean hasNick(final Player player) {
  138.       return nickedPlayers.containsKey(player.getUniqueId());
  139.    }
  140.    public static GameProfile getProfile(final String name, final UUID realUniqueId) {
  141.       if (BY_NAME.containsKey(name)) {
  142.          return BY_NAME.get(name);
  143.       }
  144.         try {
  145.             final URL url = new URL("https://api.mojang.com/users/profiles/minecraft/" + name);
  146.             final InputStream is = url.openStream();
  147.             final BufferedReader br = new BufferedReader(new InputStreamReader(is));
  148.             String line;
  149.             UUID id = null;
  150.             while((line = br.readLine()) != null) {
  151.                 final JsonObject json = (JsonObject) new JsonParser().parse(line);
  152.                 id = UUIDTypeAdapter.fromString(json.get("id").getAsString());
  153.             }
  154.             if (id != null) {
  155.                return getProfile(id, realUniqueId);
  156.             } else {
  157.                final GameProfile profile = new GameProfile(realUniqueId, name);
  158.                BY_NAME.put(name, profile);
  159.                 return profile;
  160.             }
  161.         } catch (final Exception e) {
  162.          e.printStackTrace();
  163.         }
  164.         return null;
  165.     }
  166.    public static GameProfile getProfile(final UUID uuid, final UUID realUniqueId) {
  167.       if (BY_UUID.containsKey(uuid)) {
  168.          return BY_UUID.get(uuid);
  169.       }
  170.         try {
  171.             final URL url1 = new URL("https://sessionserver.mojang.com/session/minecraft/profile/" + uuid.toString().replace("-", "")+"?unsigned=false");
  172.             final InputStream is1 = url1.openStream();
  173.             final BufferedReader br1 = new BufferedReader(new InputStreamReader(is1));
  174.             String line1;
  175.             String name;
  176.             while((line1 = br1.readLine()) != null) {
  177.                 final JsonObject json = (JsonObject) new JsonParser().parse(line1);
  178.                 name = json.get("name").getAsString();
  179.                 final JsonArray array = json.getAsJsonArray("properties");
  180.                 final JsonElement element = array.get(0);
  181.                 if (element.isJsonObject()) {
  182.                    final JsonObject object = element.getAsJsonObject();
  183.                    final Property property = new Property(object.get("name").getAsString(), object.get("value").getAsString(), object.get("signature").getAsString());
  184.                    final GameProfile profile = new GameProfile(realUniqueId, name);
  185.                    profile.getProperties().put(property.getName(), property);
  186.                    BY_UUID.put(uuid, profile);
  187.                    BY_NAME.put(name, profile);
  188.                    return profile;
  189.                 }
  190.          }
  191.             br1.close();
  192.             is1.close();
  193.         } catch (final Exception e) {
  194.          e.printStackTrace();
  195.         }
  196.         return null;
  197.     }
  198. }
Benutzeravatar
Knadda
 
Beiträge: 49
Registriert: Mo 1. Aug 2016, 07:06

Re: Nametag zeigt Nickname und echten Namen an

Beitragvon binnepizza » Do 18. Aug 2016, 14:09

So vielen lieben Dank, dass du dir die Mühe gemacht hast, diese Klasse umzuschreiben. :D Ich habe das ganze nun einem lokalen Server getestet, funktioniert einwandfrei, wie du es erwähnt. :) Ich habe auch ein lokales Bungeecord-Netzwerk und bei diesem darf ja nur der Proxy online-mode= true haben. Wenn ich auf den Lobby-Server connecte (in dem Fall der Haupt-Server des Netzwerkes), wird beispielsweise der Skin nicht geändert. Das liegt ja sicher daran, dass dieser Server online-mode=false hat. Muss man dann das Plugin auf einem Server verwenden, der online-mode=true hat? Oder gibt es da doch noch andere Möglichkeiten?

//EDIT

Ich habe vergessen, beim Proxy ip_forward auf true zu stellen und beim Lobby-Server in der spigot.yml bungeecord auf true. Nun klappt alles genauso, wie auf einem Server, der online-mode=true hat.
Nochmal ein fettes Dankeschön an alle, die hier geholfen haben :D Thema wäre somit beendet
Zuletzt geändert von binnepizza am Do 18. Aug 2016, 16:23, insgesamt 1-mal geändert.
Benutzeravatar
binnepizza
 
Beiträge: 5
Registriert: Mi 17. Aug 2016, 09:31

Nächste

Zurück zu Hilfe und Support

Wer ist online?

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

cron