Interact FakePlayer

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

Interact FakePlayer

Beitragvon Admiral_Zott » Mo 26. Jan 2015, 17:08

Hallo,
Ich möchte gerne so eine Art Citizens Plugin schreiben und nun will ich mit einem "FakePlayer" interagieren. Wie mach ich das? Geht das einfach im PlayerInteractEntityEvent?
MFG
Benutzeravatar
Admiral_Zott
 
Beiträge: 220
Registriert: Do 10. Apr 2014, 11:56
Wohnort: Zu Hause

Re: Interact FakePlayer

Beitragvon Sep2703 » Mo 26. Jan 2015, 17:31

Hängt davon ab, ob der "FakePlayer" wirklich auf dem Server existent ist, oder ob du nur ein paar Packets an die Spieler gesendet hast.
Du möchtest programmieren lernen oder dein Bukkit-/Spigot-Wissen erweitern?
Hier habe ich für dich kostenlose Tutorials: https://youtube.com/janhektor
Benutzeravatar
Sep2703
 
Beiträge: 677
Registriert: Mi 8. Jan 2014, 15:13
Wohnort: 127.0.0.1

Re: Interact FakePlayer

Beitragvon Admiral_Zott » Mo 26. Jan 2015, 17:48

Ich habe das mit der Methode von Summerfeeling gemacht in seinem Tutorial :)
Benutzeravatar
Admiral_Zott
 
Beiträge: 220
Registriert: Do 10. Apr 2014, 11:56
Wohnort: Zu Hause

Re: Interact FakePlayer

Beitragvon ImGameboy » Mo 26. Jan 2015, 17:50

Am leichtesten ist es mit ProtocolLib und einem "Packetlistener"
Lückenstopfer ^^
Benutzeravatar
ImGameboy
 
Beiträge: 210
Registriert: Mi 17. Sep 2014, 15:25

Re: Interact FakePlayer

Beitragvon Admiral_Zott » Mo 26. Jan 2015, 18:12

Ich möchte es ja nicht mit ProtocolLib machen, ich will es selber machen und lernen.
Benutzeravatar
Admiral_Zott
 
Beiträge: 220
Registriert: Do 10. Apr 2014, 11:56
Wohnort: Zu Hause

Re: Interact FakePlayer

Beitragvon Jofkos » Mo 26. Jan 2015, 18:17

Dann musste die Packets mit Netty abfangen :)
Sollte das Use Entity Packet sein.
Jofkos

...........

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

Re: Interact FakePlayer

Beitragvon Admiral_Zott » Di 27. Jan 2015, 18:18

Und wie mache ich das? Sorry, habe noch nicht so viel mit Packets gemacht. :)
Benutzeravatar
Admiral_Zott
 
Beiträge: 220
Registriert: Do 10. Apr 2014, 11:56
Wohnort: Zu Hause

Re: Interact FakePlayer

Beitragvon Jofkos » Di 27. Jan 2015, 19:44

Du musst einfach der ChannelPipeline deinen "listener" hinzufügen.
Dazu brauchst du den Channel vom Spieler, an den wir (momentan) nur über Reflections rankommen.

Hier gehe ich einfach alle Felder vom NetworkManager durch, da die Namen der einzelnen Felder sich ständig ändern.
Code: Alles auswählen
  1.    private static Field channelField;
  2.    
  3.    static {
  4.       try {
  5.          for (Field field : NetworkManager.class.getDeclaredFields()) { // Alle Felder durchgehen
  6.             if (field.getType().isAssignableFrom(Channel.class)) { // wenns 'n Channel ist
  7.                channelField = field; // lokal speichern
  8.                channelField.setAccessible(true); // und accessible machen
  9.                break; // fertig.
  10.             }
  11.          }
  12.       } catch (Exception e) {
  13.          e.printStackTrace();
  14.       }
  15.    }

Dann füge ich den Spielern einfach im JoinEvent einen MessageToMessageDecoder in ihre ChannelPipeline ein.
Die Pipeline ist so aufgebaut:
timeout-handler -> query-handler -> packet-splitter -> packet-decoder -> packet-prepender -> packet-encoder -> packet-handler
In Netty haben die alle Namen:
timeout -> legacy_query -> splitter -> decoder -> prepender -> encoder -> packet_handler

Ich habe den "Listener" nach dem 'decoder' eingefügt:
Code: Alles auswählen
  1.    @EventHandler
  2.    public void onJoin(PlayerJoinEvent e) {
  3.       Channel playerChannel = Reflect.get(channelField, ((CraftPlayer)e.getPlayer()).getHandle().playerConnection.networkManager); // Channel vom Spieler getten, mit dem oben gespeicherten Feld
  4.       
  5.       playerChannel.pipeline().addAfter("decoder", "tooler_listener", new MessageToMessageDecoder<Packet>() { // MessageToMessageDecoder in die Pipeline einfügen, nach 'decoder'
  6.          @Override
  7.          protected void decode(ChannelHandlerContext chc, Packet packet, List<Object> out) throws Exception { // Packet: Das packet, out: was rauskommt
  8.             
  9.             if (packet instanceof PacketPlayInUseEntity)
  10.                System.out.println(packet); // ein EntityInteractPacket ist angekommen. Hier kannst du es abfangen. Ich würde es evlt gar nicht an "out" weitergeben.
  11.             
  12.             out.add(packet); // packet wird unverändert weitergegeben
  13.          }
  14.          
  15.       });
  16.    }



Mehr zu ChannelPipelines wird in den Docs von Netty erklärt: ChannelPipeline
Jofkos

...........

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


Zurück zu Hilfe und Support

Wer ist online?

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

cron