Lebensanzeige Plugin

Dieses Thema im Forum "Programmierung" wurde erstellt von Darkblader24, 30. November 2012.

    Darkblader24, 30. November 2012
  1. Darkblader24
    Offline

    Darkblader24 Kuhfänger

    Hallo
    ich weiß, es gab vor kurzem einen Tread dazu, aber ich dachte mir, ich mache einen neuen auf.
    Und zwar möchte ich ein Plugin schreiben, mit dem die Herzen des Gegners im Chat angezeigt werden. Der Grundcode ist von Benni1000, doch ich habe noch ein paar Fragen dazu.

    Code: http://pastebin.com/bNKaZURG

    Wie müsste man den Code umschreiben, sodass das Leben des Gegners erst nach dem Abzug des Schadens angezeigt wird? Denn bis jetzt zeigt es nur das Leben vor dem Schlag an und das bringt den Spielern ja nicht viel.

    Und ich habe es jetzt auch so geschrieben, dass es auch Treffer mit Pfeilen und Schadenstränken anzeigt. Jedoch habe ich es in zwei verschiedene if-Abfragen gepackt welche bei den beiden Varianten jeweils das gleiche ausführen. Geht es auch, dass ich es in eine gemeinsame if-Abfrage packen kann, oder dass man es einfacher schreiben kann?

    Danke :)
    #1
  2. TimBone, 30. November 2012
  3. TimBone
    Offline

    TimBone Guest

    Füge einen Bukkit Sheduler ein. Der könnte die Anzeige um ein oder zwei Sekunden verzögern.
    #2
  4. MrFlieder, 30. November 2012
  5. MrFlieder
    Offline

    MrFlieder Braumeister

    Eine neue Methode erstellen und an den entsprechenden Stellen aufrufen.
    Code:
    public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args)
    {
        bla();
        return false;
    }
    
    public void bla()
    {
        if(DEINE IF-ABFRAGE)
        {
            // CODE
        }
    }
    
    An den Stellen, wo du deine If-Abfrage brauchst, kannst du diese dann aufrufen.
    #3
  6. Benni1000, 30. November 2012
  7. Benni1000
    Offline

    Benni1000 Enderdragonjäger

    Du kannst dir den Schaden den dieser Schlag verursacht so holen:
    Code:
    ev.getDamage();
    Dann kannst du einfach das aktuelle Leben des Spielers in eine variable stecken, diesen wert abzeiehen,
    und dann nicht mit pl.getHealth() sondern mit der variable rechnen.
    Zuletzt bearbeitet: 30. November 2012
    #4
  8. Darkblader24, 30. November 2012
  9. Darkblader24
    Offline

    Darkblader24 Kuhfänger

    Danke Benni, das klappt jetzt super :)
    Nur jetzt ist noch ein Problem, dass ich in no-PvP Zonen den Schaden sehe, den der Schlag gemacht hätte. Jedoch möchte ich, dass wenn er in der no-PvP-Zone steht, ich sein derzeites Leben sehe, wenn ich versuche ihn anzugreifen.
    Also wenn kein tatsächlicher Schaden zugefügt werden kann, dass es dafür das jetztige Leben des anderen anzeigt.

    Der Code den ich jetzt habe:

    Code:
            if (ev.getDamager() instanceof Player && ev.getEntity() instanceof Player) {            Player pl = (Player)ev.getEntity();
                Player to = (Player)ev.getDamager();
                String toPlayer = "";
                if((pl.getHealth()-ev.getDamage())%2 != 0) {
                    for(int i = 0; i < ((pl.getHealth()-ev.getDamage())-1)/2; i++) {
                        toPlayer = toPlayer + "❤";
                    }
                    toPlayer = toPlayer + "♥";
                }
                else {
                    for(int i = 0; i < (pl.getHealth()-ev.getDamage())/2; i++) {
                        toPlayer = toPlayer + "❤";
                    }
                }
                ChatColor prefix;
                if(toPlayer.length() > 7)
                    prefix = ChatColor.GREEN;
                else if(toPlayer.length() > 4)
                    prefix = ChatColor.YELLOW;
                else
                    prefix = ChatColor.RED;
                to.sendMessage(ChatColor.GOLD+"Leben von "+ChatColor.DARK_GREEN+pl.getName()+ChatColor.GOLD+": "+prefix+toPlayer);
            }
    #5
  10. manf, 30. November 2012
  11. manf
    Online

    manf Entwicklungsscheuche Administrator Entwickler

    füg ein Event.isCanceled() ein, damit wird überprüft ob das Event nicht schon abgebrochen wurde, dann solltest du die Priorität auch hoch stellen.
    #6
  12. Darkblader24, 30. November 2012
  13. Darkblader24
    Offline

    Darkblader24 Kuhfänger

    Sorry, bin noch Anfänger im Programmieren. :)
    Wo und wie kann ich denn das Event.isCanceled() einfügen?
    #7
  14. manf, 30. November 2012
  15. manf
    Online

    manf Entwicklungsscheuche Administrator Entwickler

    Code:
    if(ev.isCancled()){
     //Kein Schaden vorhanden
     return;
    }
    #8
  16. Darkblader24, 30. November 2012
  17. Darkblader24
    Offline

    Darkblader24 Kuhfänger

    So ich hab jetzt mal eine Weile herumgetestet, aber irgendwie klappt es noch nicht so ganz.
    Ich hab es jetzt in 2 Teile unterteilt: eines wenn das Event klappt und einmal wenn nicht. Jedoch klappt das Event irgendwie immer und der erste Teil wird immer übersprungen. Obwohl ja im no-PvP das Event ja nicht klappen dürfte. Wo liegt hier der Fehler?

    http://pastie.org/5460342
    #9
  18. Benni1000, 30. November 2012
  19. Benni1000
    Offline

    Benni1000 Enderdragonjäger

    Ersetze
    Code:
    [LEFT][COLOR=#FFFFFF]if(ev.isCancled()){[/COLOR][/LEFT]
    mit
    Code:
    [LEFT][COLOR=#FFFFFF]if(!ev.isCancled()){[/COLOR][/LEFT]
    #10
  20. Darkblader24, 1. Dezember 2012
  21. Darkblader24
    Offline

    Darkblader24 Kuhfänger

    Mmmh, mit if(ev.isCancelled(){ wird der zweite Teil einfach übersprungen.
    #11
  22. manf, 1. Dezember 2012
  23. manf
    Online

    manf Entwicklungsscheuche Administrator Entwickler

    Der Eventhandler braucht eine höhere Priorität.

    Code:
    [COLOR=#7587A6][FONT=Bitstream Vera Sans Mono]@EventHandler(priority = EventPriority.HIGH)[/FONT][/COLOR]
    #12
  24. Darkblader24, 1. Dezember 2012
  25. Darkblader24
    Offline

    Darkblader24 Kuhfänger

    Jaa danke, damit klappt es jetzt :)

    Noch etwas: Gibt es eine Möglichkeit um zu checken, ob der Spieler den Schaden auch wirklich schon bekommen hat?
    Sodass es nicht immer so im Chat aussieht wenn man schnell oft draufhaut:

    Leben von Bla: ❤❤❤❤❤
    Leben von Bla: ❤❤❤❤❤
    Leben von Bla: ❤❤❤❤❤
    Leben von Bla: ❤❤❤
    Leben von Bla: ❤❤❤
    Leben von Bla: ❤
    Leben von Bla: ❤
    Leben von Bla: ❤
    #13
  26. MrFlieder, 1. Dezember 2012
  27. MrFlieder
    Offline

    MrFlieder Braumeister

    Ich würde mal sagen, du checkst die Leben des Spielers und vergleichst dies mit ev.getDamage();.
    #14
  28. Darkblader24, 2. Dezember 2012
  29. Darkblader24
    Offline

    Darkblader24 Kuhfänger

    Auf die Idee bin ich auch schon gekommen, aber das geht leider nicht. Weil der Schaden, auch wenn er abgebrochen wird, trotzdem da ist.
    Ich hab es so probiert:

    if(pl.getHealth()-ev.getDamage != pl.getHealth()) {...

    Gibt es eine andere Möglichkeit?
    #15
  30. manf, 2. Dezember 2012
  31. manf
    Online

    manf Entwicklungsscheuche Administrator Entwickler

    Du könntest mit ev.setCanceled(true) das Event abbrechen, dann wäre aber der schaden ganz weg und irgendwie müsstest du ihn den Schaden geben. einfach player.damage... würde nicht gehen.

    Daher würde ich die Spieler in einer HashMap speichern mit dem Leben und dem Schaden und dieses nochmal vor dem schlagen überprüfen.

    HashMap<String,Integer> damage = new HashMap<String,Integer>();

    if(damage.contains(playername)){
    if(damage.get(playername) == playerhealth-playerdmg){
    return;
    }
    }


    //Save
    damage.put(playername,playerhealth-playerdmg);

    Das eine musst du halt Vorher und das andere nachher. (Würde sagen nach der Überprüfung ob das Event abgebrochen ist)
    #16
  32. Darkblader24, 2. Dezember 2012
  33. Darkblader24
    Offline

    Darkblader24 Kuhfänger

    Oha schwierig schwierig :)
    Danke ich probiers mal ^^
    #17
  34. Darkblader24, 2. Dezember 2012
  35. Darkblader24
    Offline

    Darkblader24 Kuhfänger

    Mir ist gerade noch etwas aufgefallen:
    das Leben wird nicht korrekt berechnet,wenn der Gegner eine Rüstung anhat. Wie bekomme ich heraus, wie viel Schaden die Rüstung abhält?
    #18
  36. manf, 2. Dezember 2012
  37. manf
    Online

    manf Entwicklungsscheuche Administrator Entwickler

  38. Darkblader24, 2. Dezember 2012
  39. Darkblader24
    Offline

    Darkblader24 Kuhfänger

    Ok danke. Ich habe den Code jetzt in eine neue Klasse reingepackt, aber jetzt weiß ich nicht, wie ich sie in den bisherigen Code einbinden soll. Muss das alles in eine neue Klasse oder sollte ich das direkt in den Code einbinden? Und wie kann ich dann den damage oder das getArmorReduce und getEnchantmentsReducement, das da ausgeworfen wird (denke ich zumindest), verwenden?
    #20