Plugin gesucht!

Dieses Thema im Forum "Server Plugins" wurde erstellt von J-R-L, 30. September 2013.

  1. J-R-L
    Offline

    J-R-L

    Registriert seit:
    4. Januar 2013
    Beiträge:
    212
    Ort:
    Schaffhausen
    Minecraft:
    JoniTaki
    Hey Leute
    Ich suche ein Plugin mit dem Man machen kann das wenn man stirbt nicht auf Wiederbeleben Klicken muss sondern direkt am Multiverse-Core Spawn spawnt.
     
    #1
  2. Das geht nicht. Das ''Du bist gestorben'' -Menü kann man nicht steuern, da müsstest du schon einen Clienten verändern.
     
    #2
  3. Chrisliebaer
    Online

    Chrisliebaer

    Klar kann man. Das Fenster beim Client bekommt man zwar nicht weg, jedenfalls nicht so weit ich weiß. Man kann aber einfach gar kein DeathEvent schicken. Die Frage ist natürlich, was du machen willst, aber grundsätzlich spricht nichts dagegen, dass man z.B. das Todesevent abfängt und den Spieler mit voller HP an den Spawn schickt. Das Inventar kann man natürlich trozdem leeren. Und wenn man es richtig darauf anlegt, dann könnte man immerhoch ein eigenes Todesevent durch die Eventbus schicken und somit alle Plugins dazu bringen, ihren Code durch den Spieler auszuführen.

    Ob es dazu nun auch ein Plugin gibt, ist eine andere Frage...

    Edit: Das Todesevent kann man nicht canceln. Dann müsste man halt das letzte Schadensevent abfangen.
     
    #3
  4. Festus
    Offline

    Festus

    Registriert seit:
    28. Juli 2012
    Beiträge:
    6
    Ich kenne zwar kein Plugin das das macht, aber es ist möglich den Todesscreen überspringen zu lassen, indem man Packets verwendet, wie auf einigen großen Servern auch zu sehen ist. Das DeathEvent zu umgehen wäre extrems unschön, da es Probleme in anderen Plugins verursachen kann, z.B. wenn auf dem Server ein Plugin läuft das Kills zählt wird dies dann nicht mehr funktionieren, da der Spieler technisch gesehen ja nie stirbt.

    Mfg
     
    #4
  5. Chrisliebaer
    Online

    Chrisliebaer

    Ansonsten: Ja, wenn man die Packete abfängt und dann entsprechend sich etwas darum baut, dann ginge das natürlich auch. Das mit den Packeten ist aber schonmal deutlich komplizierter, als das Abfangen der Schadensevents. Es ging mir eigentlich auch eher um das Widerlegen der aussagen, dass es nicht möglich sei.
     
    #5
  6. ScaryHutman
    Offline

    ScaryHutman

    Registriert seit:
    1. Januar 2013
    Beiträge:
    205
    Ort:
    NRW
    Minecraft:
    Scary_Hutman
    Um das letzte Schaden-Event abzubrechen kannst du folgenden Code verwenden:

    Code (Text):
    1.  
    2.     @EventHandler
    3.     public void PlayerDamgEvent(EntityDamageEvent event) {
    4.         if(!(event.getEntity() instanceof Player)) {
    5.             return;
    6.         }
    7.         Player p = (Player)event.getEntity();
    8.         if((p.getHealth() - event.getDamage()) < 1) {
    9.             p.setHealth(20);
    10.             event.setCancelled(true);
    11.            
    12.         }
    13.     }
    14.  
    Du müsstest ihn nur ein wenig anpassen. ;)

    Scary_Hutman
     
    #6
  7. Festus
    Offline

    Festus

    Registriert seit:
    28. Juli 2012
    Beiträge:
    6
    Der Code für die Packets ist eig recht simpel:
    Code (Text):
    1. Packet205ClientCommand packet = new Packet205ClientCommand();
    2.                      packet.a = 1;
    3.                      ((CraftPlayer) p).getHandle().playerConnection.a(packet);
     
    #7
  8. ThunderFlo
    Offline

    ThunderFlo

    Registriert seit:
    22. September 2013
    Beiträge:
    53
    Natürlic geht das :) Ich würde dir jetzt eine Server-Ip hierhinschreiben, aber da das nicht erlaubt ist mache ich es nicht. Vllt. kennst du ja, aber den Spielmodus FalldownPvP. Könntest du ja evtl. auch mal googeln dann findest du schon denn Server und dann kannste das Spiel mal spieeln udn du wirst sehen es geht ;-D
     
    #8
  9. tobi20
    Offline

    tobi20

    Registriert seit:
    7. Januar 2013
    Beiträge:
    2
    Wenn ein Spieler noch 4 Leben hat, also 2 "Herzen", und er mit einem Diamantschwert, dass bekanntermaßen 7 Schaden, also 3,5 "Herzen", geschlagen wird, wäre er ja nach deinem Code Tod. Das Problem ist halt, wenn er eine Rüstung trägt, zum Beispiel eine Diamantrüstung, die 80% allen Schadens absorbiert, würde er nicht sterben, aber darauf nimmt dein Code keine Rücksicht. Zudem würde der getötete Spieler weiterhin an seiner alten Stelle sein und nicht am Multiverse-Core Spawn.


    Meine Idee:

    Code (Text):
    1.     @EventHandler
    2.     public void PlayerDamgEvent(EntityDamageEvent event) {
    3.             p.setHealth(20);
    4.     }
    Das alleine Funktioniert schon. Dabei ist nur das Problem, dass der Spieler dann an der alten Position steht.

    Also sollte der Code wie folgt aussehen:

    Code (Text):
    1.     @EventHandler
    2.     public void PlayerDamgEvent(EntityDamageEvent event) {
    3.             p.setHealth(20);
    4.                         Location spawn = getServer().getWorld(Name der Welt).getSpawnLocation();
    5.                         p.teleport(spawn);
    6.     }
    P.S: Könnte sein, dass sich ein paar Fehler eingeschlichen haben ^^
     
    #9
  10. Chrisliebaer
    Online

    Chrisliebaer

    Die Gesundheit wird inzwischen als double gespeichert.

    Wer also EntityDamageEvent.getDamage() < 1 vergleicht dürfte lustige Dinge erleben.
     
    #10
  11. ScaryHutman
    Offline

    ScaryHutman

    Registriert seit:
    1. Januar 2013
    Beiträge:
    205
    Ort:
    NRW
    Minecraft:
    Scary_Hutman
    Moment! Wenn der Spieler Schaden erhält, wird er zurück an den Spawn teleportiert? Außerdem habe ich geschrieben, dass er den Code anpassen muss.

    @Chrisliebaer
    "Lustige" Dinge habe ich nicht erlebt.

    Scary_Hutman
     
    #11
  12. Chrisliebaer
    Online

    Chrisliebaer

    Dann würde ich das schnell fixen, denn es ist schlicht fehlerhaft. Double kennt auch Werte zwischen 0-1 und du weißt nicht, was die Zukunft für Sachadensarten bringt.
     
    #12
  13. Festus
    Offline

    Festus

    Registriert seit:
    28. Juli 2012
    Beiträge:
    6
    Alle Ansätzte hier sind ja ganz schön, werden aber jedes Plugin das das PlayerDeathEvent benutzt inkompatibel zu dem erstelltem Plugin machen. Das ganze liegt einfach daran, dass , indem man dem Spieler kurz bevor dieser stirbt wieder volles live gibt, das PlayerDeathEvent nie ausgelöst wird. Das einfachst ist, man löst dies über packets, indem man diesen Code in das PlayerDeathEvent packt:
    Code (Text):
    1.  
    2. Packet205ClientCommand packet = new Packet205ClientCommand();
    3.                      packet.a = 1;                      
    4. ((CraftPlayer) p).getHandle().playerConnection.a(packet);
    5.  
    Um das ganze noch etwa schöner zu machen könnte man das ganze etwas verzögern, mithilfe des Bukkitscheduler. Das sähe dann so aus:
    Code (Text):
    1.  
    2.  Bukkit.getScheduler().scheduleSyncDelayedTask(SuperCraftBros.getInstance(), new Runnable() {
    3.                      @Override
    4.                      public void run() {
    5.                      Packet205ClientCommand packet = new Packet205ClientCommand();
    6.                      packet.a = 1;
    7.                      ((CraftPlayer) p).getHandle().playerConnection.a(packet);
    8.                      }
    9.                      }, 20L); //Hier kann man die verzögerung in Ticks (20 Ticks = 1 sec) angeben.
    10.  
    Mit dem Code würde der Spieler das Todesfenster genau 1 sec lang sehen bevor der respawn ausgelöst wird.

    Mfg
     
    #13