[Klasse] PacketCamera - Entities spectaten

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

[Klasse] PacketCamera - Entities spectaten

Beitragvon Overload » Mo 17. Nov 2014, 16:48

Hallo,

heute will ich einmal zeigen wie man einem Spieler (wie in der 1.8 im Spectator Mode) in eine Entity hineinversetzt!
Ob man den Spieler nun einen anderen Spieler oder eine beliebe andere Entity spectaten lassen will, kann man natürlich
selber entscheiden ;D

Alles was wir benötigen ist der neuste Spigot Build (am besten mit dem neustem Patch) und alles was man halt sonst so zum
programmieren benötigt.

Also dann zur Klasse. Vorab sei gesagt das Vorkenntnisse in Sachen Packet dringend empfohlen sind, da es sich hier um nichts
anderes handelt. Außerdem ist dieses Packet nicht anders aufgebaut wie die im Minecraft Server Code.

Packet erstellen und registrieren

Also dann:

Code: Alles auswählen
  1. public class PacketCamera extends Packet {
  2.    
  3.    private int entityID;
  4.    
  5.    public PacketCamera(int entityID) {
  6.       this.entityID = entityID;
  7.    }
  8.    @Override
  9.    public void a(PacketDataSerializer packetDataSerializer) throws IOException {
  10.       this.entityID = packetDataSerializer.a();
  11.    }
  12.    @Override
  13.    public void b(PacketDataSerializer packetDataSerializer) throws IOException {
  14.       packetDataSerializer.b(this.entityID);
  15.    }
  16.    @Override
  17.    public void handle(PacketListener packetListener) {}
  18.    
  19. }


Dies ist die Packet Klasse die man natürlich auch anders nennen kann (wenn man will z.B PacketPlayOutCamera o.ä.).
Diese bringt uns so aber noch nicht viel, denn wir müssen sie (so wie es bei allen anderen Packets bereits vorher der Fall ist) registrieren.
Dies machen wir am besten mit Reflection:

Code: Alles auswählen
  1. public void registerPacket(EnumProtocol protocol, boolean serverbound, int packetId, Class<? extends Packet> packetClass) {
  2.       try {
  3.          Method method = ProtocolInjector.class.getDeclaredMethods()[1];
  4.          method.setAccessible(true);
  5.          method.invoke(ProtocolInjector.class, protocol, serverbound, packetId, packetClass);
  6.       } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | SecurityException e) {
  7.          e.printStackTrace();
  8.       }
  9.    }


Dies ist meine Methode die Packets zu registrieren, dabei rufe ich die Methode aus dem Spigot ProtocolInjector auf mit der die Spigot Packets auch
registriert werden.
Nun muss nur noch diese Methode aufgerufen werden. Das machen wir am besten im onEnable() Teil unseres Plugins!

Code: Alles auswählen
  1. registerPacket(EnumProtocol.PLAY, true, 67, PacketCamera.class);


Da dieses Packet unter der Kategorie Play steht (siehe wiki.vg) und außerdem Serverside ist (siehe wiki.vg) und noch dazu die ID 67 hat (siehe ihr wisst schon),
müssen wir die Methode mit diesen Parametern ausführen. Als letzten Parameter geben wir nun noch unseren Klassennamen des Packets mit einem .class am Ende
an und Voila, unser Packet ist einsatzbereich!

Bonus: Packet senden

Für jeden der schonmal mit Packets gearbeitet hat und sich besser auskennt sollte nun klar sein wie es weiter geht. Für alle anderen jetzt noch wie man das Packet
sendet.

Code: Alles auswählen
  1. ((CraftPlayer) p).getHandle().playerConnection.sendPacket(new PacketCamera(e.getEntityId()));


e ist in diesem Fall die zu spectatene Entity und p der Spieler der spectaten soll.
(Natürlich nicht vergessen vorher zu testen ob der Spieler die 1.8 verwendet, denn sonst wird es zu Problemen kommen!)

Und das wars auch schon! So schwer ist es eigentlich garnicht schwieriger wird es bei dem WorldBorder Packet oder ähnlichem...
Aber für heute reicht es erstmal xD

Bis zum nächsten mal,
LG 1999mani

PS: Bei Fehlern oder Kritik bitte Feedback posten
Zuletzt geändert von Overload am Mo 17. Nov 2014, 18:07, insgesamt 1-mal geändert.
Benutzeravatar
Overload
 
Beiträge: 95
Registriert: Fr 7. Mär 2014, 16:43

Re: [Klasse] PacketCamera - Entities spectaten

Beitragvon ilouHD » Mo 17. Nov 2014, 17:49

Nice. Schön aufgebaut.

Nur das WorlBorder-Packet ist auch nicht sooo kompliziert.
Bild
Benutzeravatar
ilouHD
 
Beiträge: 1733
Registriert: Do 9. Jan 2014, 14:49

Re: [Klasse] PacketCamera - Entities spectaten

Beitragvon ImGameboy » Mo 17. Nov 2014, 17:53

Bei mir wird der PacketManager unterkringelt... habe ich etwas vergessen?
Ich habe das Packet registrieren in den onEnable()-Teil gepackt.
Er kennt PacketManager aber nicht... WAS IST DAS?
Lückenstopfer ^^
Benutzeravatar
ImGameboy
 
Beiträge: 210
Registriert: Mi 17. Sep 2014, 15:25

Re: [Klasse] PacketCamera - Entities spectaten

Beitragvon Overload » Mo 17. Nov 2014, 18:06

Achso ja der PacketManager war eine Klasse von mir wo die Methode drin war, einfach weg lassen ;D
Korrigiere es schnell

Und das WorldBorder Packet ist im Vergleich hier zur schon schwerer finde ich xD
Benutzeravatar
Overload
 
Beiträge: 95
Registriert: Fr 7. Mär 2014, 16:43

Re: [Klasse] PacketCamera - Entities spectaten

Beitragvon ImGameboy » Mo 17. Nov 2014, 18:30

Geht aber immer noch nicht :D
Kannste das vielleicht nochmal korrigieren? :D
Lückenstopfer ^^
Benutzeravatar
ImGameboy
 
Beiträge: 210
Registriert: Mi 17. Sep 2014, 15:25

Re: [Klasse] PacketCamera - Entities spectaten

Beitragvon Overload » Mo 17. Nov 2014, 18:32

Schick mal deinen Code und ggf. den Stacktrace
Benutzeravatar
Overload
 
Beiträge: 95
Registriert: Fr 7. Mär 2014, 16:43

Re: [Klasse] PacketCamera - Entities spectaten

Beitragvon ImGameboy » Mo 17. Nov 2014, 18:42

Code: Alles auswählen
  1. private int entityID;
  2.    
  3.     public PacketCamera(int entityID) {
  4.        this.entityID = entityID;
  5.     }
  6.     @Override
  7.     public void a(PacketDataSerializer packetDataSerializer) throws IOException {
  8.        this.entityID = packetDataSerializer.a();
  9.     }
  10.     @Override
  11.     public void b(PacketDataSerializer packetDataSerializer) throws IOException {
  12.        packetDataSerializer.b(this.entityID);
  13.     }
  14.     @Override
  15.     public void handle(PacketListener packetListener) {}
  16.    
  17.     public void registerPacket(EnumProtocol protocol, boolean serverbound, int packetId, Class<? extends Packet> packetClass) {
  18.            Method method = ProtocolInjector.class.getDeclaredMethods()[1];
  19.            method.setAccessible(true);
  20.            try {
  21.          method.invoke(ProtocolInjector.class, protocol, serverbound, packetId, packetClass);
  22.       } catch (IllegalAccessException e) {
  23.          e.printStackTrace();
  24.       } catch (IllegalArgumentException e) {
  25.          e.printStackTrace();
  26.       } catch (InvocationTargetException e) {
  27.          e.printStackTrace();
  28.       }
  29.      }


onEnable:

Code: Alles auswählen
  1. registerPacket(EnumProtocol.PLAY, true, 67, PacketCamera.class);


Er kringelt mir das registerPacket an und sagt: "The method registerPacket(EnumProtocol, boolean, int, Class<PacketCamera>) is undefined for the type main"
Lückenstopfer ^^
Benutzeravatar
ImGameboy
 
Beiträge: 210
Registriert: Mi 17. Sep 2014, 15:25

Re: [Klasse] PacketCamera - Entities spectaten

Beitragvon Overload » Mo 17. Nov 2014, 18:46

Pack die registerPacket Methode in die Main ;D
Benutzeravatar
Overload
 
Beiträge: 95
Registriert: Fr 7. Mär 2014, 16:43

Re: [Klasse] PacketCamera - Entities spectaten

Beitragvon ImGameboy » Mo 17. Nov 2014, 19:02

Ähmmm... Der onEnable-Teil ist bei mir immer in der main.java....
Wenn ich meine Main zu Main.java umbenenne, macht das auch keinen Unterschied...
Lückenstopfer ^^
Benutzeravatar
ImGameboy
 
Beiträge: 210
Registriert: Mi 17. Sep 2014, 15:25

Re: [Klasse] PacketCamera - Entities spectaten

Beitragvon Overload » Mo 17. Nov 2014, 19:10

Also, ich hoffe mal das du nicht alle Codesegmente zusammen in den onEnable Teil getan hast... Die Methode (Nicht der Methodenaufruf) außerhalb des onEnable Teil... So und ich bin mir nicht sicher ob du wirklich schonmal mit Packets gearbeitet hast ;)
Benutzeravatar
Overload
 
Beiträge: 95
Registriert: Fr 7. Mär 2014, 16:43

Nächste

Zurück zu Anleitungen

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 1 Gast

cron