Instant Respawn

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

Instant Respawn

Beitragvon RedstoneGmbH » So 16. Jun 2013, 08:31

Im Folgenden werden ich euch zeigen wie ihr mithilfe von ProtocolLib einen "Instant Respawn" programmieren könnt.
Dies ist vor Allem dann praktisch, wenn man ein PvP-Plugin programmiert und die Spieler wiederbeleben will, ohne dass sie die RespawnGui sehen.

Zunächst mal laden wir uns ProtocolLib runter und binden es in den Build Path ein.
Danach bauen wir in unsere plugin.yml die folgende Zeile ein:
Code: Alles auswählen
  1. depend: [ProtocolLib]

hiermit lädt sich unser Plugin nur noch dann, wenn ProtocolLib installiert ist.
Alternativ kann man auch soft-depend nehmen, allerdings muss man dann einen weiteren Lösungsweg dafür bauen, falls ProtocolLib nicht installiert ist, im Folgenden gehe ich nur auf den Fall ein, in dem ProtocolLib installiert ist.

Damit es für uns etwas einfacher wird, binden wir noch zwei Klassen des PacketWrappers ein, die es uns deutlich einfacher machen unseren Respawn zu programmieren.
Es handelt sich hierbei um das AbstractPacket, das man für jedes der Packets braucht und um PacketCDClientStatuses, das dann den eigentlich Respawn durchführt.
Wenn man PacketWrapper ohnehin installiert hat, kann man diesen Schritt auch weglassen.

Jetzt kommen wir zum eigentlich RespawnListener:
Code: Alles auswählen
  1.    MyPlugin plugin;
  2.    public RespawnListener(MyPlugin plugin) {
  3.       this.plugin = plugin;
  4.    }
  5.    @EventHandler
  6.    public void onDeath(PlayerDeathEvent event) {
  7.       Bukkit.getScheduler().scheduleSyncDelayedTask(this.plugin, new Runnable() {
  8.             @Override
  9.             public void run() {
  10.             }
  11.          });
  12.    }


Wie man hier sieht verwende ich einen Scheduler, dieser ist unbedingt nötig, damit der Respawn erst nach dem Tod ausgeführt wird, anderenfalls funktioniert es nicht.

Momentan macht der Scheduler noch nichts, also passe ich ihn noch etwas an:
Code: Alles auswählen
  1. @EventHandler
  2.    public void onDeath(PlayerDeathEvent event) {
  3.       final Player player = event.getEntity();
  4.          Bukkit.getScheduler().scheduleSyncDelayedTask(this.plugin, new Runnable() {
  5.             @Override
  6.             public void run() {
  7.                PacketCDClientStatuses respawn = new PacketCDClientStatuses();
  8.                respawn.setPayload(Payloads.RESPAWN_AFTER_DEATH);
  9.                try {
  10.                   ProtocolLibrary.getProtocolManager().recieveClientPacket(player, respawn.getHandle());
  11.                } catch (Exception e) {
  12.                   e.printStackTrace();
  13.                }   
  14.             }
  15.          });
  16.       }
  17.    }


Ich erstelle also in der run-Methode ein Packet und gebe ihm den RESPAWN_AFTER_DEATH Payload, damit es als Respawn interpretiert wird.
Danach simuliere ich, dass das Packet vom Spieler gesendet worden ist (auf keinen Fall senden, sonst fliegt der Spieler raus), hierdurch wird der Spieler wiederbelebt.
Den try-catch-Block verwende ich, um eventuellen Fehlern vorzubeugen, da der Spieler manchmal direkt beim Sterben rausfliegt.

Zuletzt registriere ich noch das Event in unser Hauptklasse MyPlugin:
Code: Alles auswählen
  1. @Override
  2. public void onEnable() {
  3.    Bukkit.getServer().getPluginManager().registerEvents(new RespawnListener(this), this);
  4. }



Ich hoffe ihr konntet etwas mit dieser kleinen Anleitung anfangen, ich freue mich auf Feedback und Kritik.
Benutzeravatar
RedstoneGmbH
 
Beiträge: 9
Registriert: Sa 15. Jun 2013, 17:43

Re: Instant Respawn

Beitragvon EvilCodes » So 16. Jun 2013, 12:06

Hey!

Das ist ja nett, dass du dir so viel Arbeit machst beim Schreiben dieser Anleitung, aber ich wollte dir auch gerne noch einen einfacheren Weg zeigen ;)

Man sendet einfach das "Respawnscreen"-Paket nicht :D

Code: Alles auswählen
  1.       Packet205ClientCommand packet = new Packet205ClientCommand();
  2.       packet.a = 1;
  3.       ((CraftPlayer) player).getHandle().playerConnection.a(packet);


Als Imports braucht man dann noch:

Code: Alles auswählen
  1. import net.minecraft.server.v1_5_R3.Packet205ClientCommand;
  2. import org.bukkit.craftbukkit.v1_5_R3.entity.CraftPlayer;


Und fertig wäre das ganze ^^
Man muss nur den 2. Import immerwieder anpassen, da sich die Bukkitversion da ja immerwieder ändert...
Benutzeravatar
EvilCodes
 
Beiträge: 7
Registriert: Sa 15. Jun 2013, 21:53
Wohnort: Köln

Re: Instant Respawn

Beitragvon RedstoneGmbH » So 16. Jun 2013, 12:13

Deine Variante ist in keinster Weise einfacher, da sie genau das gleiche ausführt.
Dank ProtocolLib muss man nicht mehr selber auf die Safeguard-Benennungen von Bukkit achten oder mit Reflections arbeiten, weil das alles bereits von ProtocolLib übernommen wird.
Benutzeravatar
RedstoneGmbH
 
Beiträge: 9
Registriert: Sa 15. Jun 2013, 17:43

Re: Instant Respawn

Beitragvon EvilCodes » So 16. Jun 2013, 13:12

RedstoneGmbH hat geschrieben:Deine Variante ist in keinster Weise einfacher, da sie genau das gleiche ausführt.
Dank ProtocolLib muss man nicht mehr selber auf die Safeguard-Benennungen von Bukkit achten oder mit Reflections arbeiten, weil das alles bereits von ProtocolLib übernommen wird.


Nun ja, das meinte ich damit auch nicht.
Aber man braucht kein weiteres Plugin und die Methode ist auch nicht so groß.
Benutzeravatar
EvilCodes
 
Beiträge: 7
Registriert: Sa 15. Jun 2013, 21:53
Wohnort: Köln

Re: Instant Respawn

Beitragvon PostCrafter » So 16. Jun 2013, 13:42

evil_dr3am hat geschrieben:
RedstoneGmbH hat geschrieben:Deine Variante ist in keinster Weise einfacher, da sie genau das gleiche ausführt.
Dank ProtocolLib muss man nicht mehr selber auf die Safeguard-Benennungen von Bukkit achten oder mit Reflections arbeiten, weil das alles bereits von ProtocolLib übernommen wird.


Nun ja, das meinte ich damit auch nicht.
Aber man braucht kein weiteres Plugin und die Methode ist auch nicht so groß.

Wie er bereits schrieb, liegt der Vorteil bei seiner Variante darin, dass man es versionübergreifend verwenden kann.

evil_dr3am hat geschrieben:Man sendet einfach das "Respawnscreen"-Paket nicht :D

Das ist nicht ganz korrekt, auch hier simuliert man ein eintreffen des "RespawnButtonPressPackets" (so heißt es natürlich nicht), wodurch der Server denkt, dass der Spieler gerade respawnen wollte.
TeamSpeak-Server zur freien Nutzung: postcrafter.de
Benutzeravatar
PostCrafter
Administrator
 
Beiträge: 1443
Registriert: Do 6. Jun 2013, 19:16
Wohnort: Ebersberg

Re: Instant Respawn

Beitragvon gutsfeld » So 16. Jun 2013, 17:27

Nice Tutorial wäre ich nicht draufgekommen, habe sowieso noch nie mit Protocol Lib gearbeitet ^^ werde mich nach meinem derzeitigen Projekt auch mal damit auseinandersetzen.
Gruss gutsfeld

LöL
Benutzeravatar
gutsfeld
 
Beiträge: 127
Registriert: So 16. Jun 2013, 12:58

Re: Instant Respawn

Beitragvon _Ungefickt » Mo 17. Jun 2013, 12:05

Könnte man das PlayerDeathEvent nicht theoretisch canceln, und den Player teleportieren?
Bild
Benutzeravatar
_Ungefickt
 
Beiträge: 31
Registriert: So 16. Jun 2013, 09:20

Re: Instant Respawn

Beitragvon PostCrafter » Mo 17. Jun 2013, 14:40

CrazyiPodFreak hat geschrieben:Könnte man das PlayerDeathEvent nicht theoretisch canceln, und den Player teleportieren?

Könnte man meinen, da aber Bukkit das PlayerDeathEvent nicht das Cancellable Interface implementieren lässt, gibt es auch keine setCancelled-Methode.
TeamSpeak-Server zur freien Nutzung: postcrafter.de
Benutzeravatar
PostCrafter
Administrator
 
Beiträge: 1443
Registriert: Do 6. Jun 2013, 19:16
Wohnort: Ebersberg

Re: Instant Respawn

Beitragvon Summerfeeling » Mo 17. Jun 2013, 15:21

PostCrafter hat geschrieben:
CrazyiPodFreak hat geschrieben:Könnte man das PlayerDeathEvent nicht theoretisch canceln, und den Player teleportieren?

Könnte man meinen, da aber Bukkit das PlayerDeathEvent nicht das Cancellable Interface implementieren lässt, gibt es auch keine setCancelled-Methode.

Man könnte theoretisch, bei 0 Herzen direkt 20 Leben setzen, Feuerticks aus, Essen setzen etc.. Würde doch auch gehen oder nicht
Grüße
Summerfeeling | Timo
Benutzeravatar
Summerfeeling
 
Beiträge: 1300
Registriert: Sa 15. Jun 2013, 18:43
Wohnort: Viersen

Re: Instant Respawn

Beitragvon gutsfeld » Mo 17. Jun 2013, 15:58

Natürlich ist es möglich bei einem death event die herzen einfach wieder auf 20 zu setzen und somit, dass der Spieler dann weiter lebt.
ProtocolLib oder soweit ichs mir jetzt vorstelle respawnt den jeweiligen spieler ohne irgendwelche Leben wieder auf 20 zu setzen.
Nach einem tod wird man ja gewissermassen in den "respawnbildschrim" geleitet und protocol lib sorgt dafür, dass bei einem Game als bsp. jetzt nicht immer wieder einer auf "Wiederbeleben" drücken muss.
Das weitere beim respawnen wird von minecraft dann geleitet.
Gruss gutsfeld

LöL
Benutzeravatar
gutsfeld
 
Beiträge: 127
Registriert: So 16. Jun 2013, 12:58

Nächste

Zurück zu Anleitungen

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron