• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

Lebensanzeige Plugin

Darkblader24

Kuhfänger
Registriert
22 August 2012
Beiträge
79
Alter
32
Diamanten
300
Minecraft
Darkblader24
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 :)
 

MrFlieder

Braumeister
Registriert
30 Dezember 2011
Beiträge
332
Diamanten
0
Minecraft
MrFlieder
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?
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.
 

Benni1000

Ehemaliges Teammitglied
Ehem. Teammitglied
Registriert
4 Mai 2012
Beiträge
1.396
Diamanten
0
Hallo
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.

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:

Darkblader24

Kuhfänger
Registriert
22 August 2012
Beiträge
79
Alter
32
Diamanten
300
Minecraft
Darkblader24
Du kannst dir den Schaden den dieser Schlag verursacht so holen:
Code:
ev.getDamage();

Dan 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.

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);
        }
 

Darkblader24

Kuhfänger
Registriert
22 August 2012
Beiträge
79
Alter
32
Diamanten
300
Minecraft
Darkblader24
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
 

Darkblader24

Kuhfänger
Registriert
22 August 2012
Beiträge
79
Alter
32
Diamanten
300
Minecraft
Darkblader24
Der Eventhandler braucht eine höhere Priorität.

Code:
[COLOR=#7587A6][FONT=Bitstream Vera Sans Mono]@EventHandler(priority = EventPriority.HIGH)[/FONT][/COLOR]

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: ❤
 

Darkblader24

Kuhfänger
Registriert
22 August 2012
Beiträge
79
Alter
32
Diamanten
300
Minecraft
Darkblader24
Ich würde mal sagen, du checkst die Leben des Spielers und vergleichst dies mit ev.getDamage();.

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?
 
X

|| xX [DEV][LP] Ms. DivaCraft Xx ||

Guest
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)
 

Darkblader24

Kuhfänger
Registriert
22 August 2012
Beiträge
79
Alter
32
Diamanten
300
Minecraft
Darkblader24
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?
 
Oben