Seite 7 von 21

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

BeitragVerfasst: Mi 11. Feb 2015, 14:19
von Twister_21
Ich hab irgendwie noch ein kleines Problem: Ich habe mir durch die Jenkins Seite von Jofkos die aktuellste 1.8 besorgt. Wenn jetzt jemand mit der 1.8.1 joint und in die Tabliste schaut sieht er seinen Namen mit der Farbe, wenn jetzt aber jemand mit der 1.8 joint und in die Tabliste schaut sieht er seinen Namen in weiß, die anderen sieht er farbig. Außerdem sehen die anderen Spieler wenn sie ihre Tabliste öffnen ihn auch in Farbe, nur der 1.8 Spieler selbst sieht seinen Namen in der Tabliste weiß. Weiß wer woran das liegt?

Ich setzte den Tab-Namen mit p.setPlayerListName().

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

BeitragVerfasst: Fr 13. Feb 2015, 19:50
von Twister_21
Noch eine andere Frage/Fehler: Manchmal passiert es, dass beim Joinen dieser Fehler kommt:
Code: Alles auswählen
  1. [19:48:43 WARN]: java.io.IOException: TooManyRequestsException: The client has sent too many requests within a certain amount of time
  2. [19:48:43 WARN]:        at api.GameProfileBuilder.fetch(GameProfileBuilder.java:85)
  3. [19:48:43 WARN]:        at api.GameProfileBuilder.fetch(GameProfileBuilder.java:54)
  4. [19:48:43 WARN]:        at api.Tag$1.run(Tag.java:56)
  5. [19:48:43 WARN]:        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
  6. [19:48:43 WARN]:        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
  7. [19:48:43 WARN]:        at java.lang.Thread.run(Thread.java:745)


Dann ist der Tag weiß. Ich das mit der Zeit nicht anders möglich?

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

BeitragVerfasst: Fr 13. Feb 2015, 22:07
von Jofkos
Twister_21 hat geschrieben:Noch eine andere Frage/Fehler: Manchmal passiert es, dass beim Joinen dieser Fehler kommt:
Code: Alles auswählen
  1. [19:48:43 WARN]: java.io.IOException: TooManyRequestsException: The client has sent too many requests within a certain amount of time
Laut wiki.vg kann man das gleiche GameProfile einmal pro Minute requesten.
hinzu kommt noch
wiki.vg hat geschrieben: All public APIs are rate limited so you are expected to cache the results. This is currently set at 600 requests per 10 minutes but this may change.

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

BeitragVerfasst: Fr 13. Feb 2015, 23:07
von Twister_21
Also muss man, um den Fehler zu beheben ein Cache einbauen?

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

BeitragVerfasst: So 15. Feb 2015, 00:25
von Jofkos
Die klasse hat schon einen Cache. Werden die Anfragen von verschiedenen Servern gesendet? Der cache ist dann für jeden server neu...

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

BeitragVerfasst: So 15. Feb 2015, 09:50
von Twister_21
Die Klasse wird auf jedem Server eingesetzt. Dann ist es mal passiert, dass ein Spieler auf einen Server joint und dann kam dieser Zeit-Fehler.

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

BeitragVerfasst: So 15. Feb 2015, 14:13
von Jofkos
Dann müsstest du irgendwie einen globalen Cache für alle Server machen.

z.B. ein extra Programm, dass für das Caching zuständig ist und von dem
die anderen Server die GameProfiles bekommen

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

BeitragVerfasst: So 15. Feb 2015, 14:38
von Twister_21
Ok, hab jetzt aber immer noch ein Problem: Wenn jemand joint sieht er die gesetzten Tags der anderen nicht und wenn ich das so mache:
Code: Alles auswählen
  1. for(Player players: Bukkit.getOnlinePlayers()) {
  2. setTag(players, players.getDisplayName());
  3. }


, dann buggt es. Wie kriegt ich es hin, dass der Spieler der joint die vorher gesetzten Tags der spieler sieht, ohne dass es buggt. Wie kan ich denn die Packets abfangen, davon hattest du doch mal was gesagt.

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

BeitragVerfasst: So 15. Feb 2015, 16:01
von Jofkos
Möglichkeit 1: Packets abfangen mit einer dafür vorgesehenen Lib (wie z.B. ProtocolLib)
Möglichkeit 2: Direkt Netty injizieren
Code: Alles auswählen
  1. @EventHandler
  2. public void onJoin(PlayerJoinEvent e) {
  3.    EntityPlayer entity = ((CraftPlayer) e.getPlayer()).getHandle();
  4.    Channel playerChannel = Reflect.get(channelField, entity.playerConnection.networkManager);
  5.    playerChannel.pipeline().addAfter("encoder", "nick_listener", new MessageToMessageEncoder<Packet>() {
  6.       @Override
  7.       protected void encode(ChannelHandlerContext chc, Packet packet, List<Object> out) throws Exception {
  8.          if (packet instanceof PacketPlayOutPlayerInfo) {
  9.             PacketPlayOutPlayerInfo infoPacket = (PacketPlayOutPlayerInfo) packet;
  10.             // packet verändern
  11.          }
  12.          out.add(packet);
  13.       }
  14.    });
  15. }
erklärungen gibts hier.

So wird, direkt wenn das PacketPlayOutPlayerInfo gesendet wird, dieses durch das mit dem "Nicknamepacket" ersetzt.

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

BeitragVerfasst: So 15. Feb 2015, 16:06
von Twister_21
Cool, danke für den Codeschnipsel, muss dann nur noch schauen, was ich mit dem Packet mache.

EDIT: Was ist "Reflect"? und was ist mit "MessageToMessageDecoder in die Pipeline einfügen, nach 'decoder'" gemeint? Womit soll man nick_listener ersetzten?

Weiß auch noch nicht ganz was ich mit dem Packet infoPacket machen soll, hab das noch nie gemacht

Er soll ja die Tags der Spieler bekommen und dann den Tag wie den DisplayName setzen und dann noch den Skin.