EntityDeathEvent?

Brockdish  03.11.2020, 20:56

Was willst du mit

Bukkit.getEntity(null)

und

player.getPlayer()

erreichen?

Firstmine 
Fragesteller
 03.11.2020, 21:04

Mit dem

Bukkit.getEntity(null)

wollte ich das Mob im Chat ausgeben und mit dem

player.getPlayer()

den Killer quasi

Ich weiß ich habe viel falsch gemacht kannst du mir evtl. helfen?

Till

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

Ich schreibe dir mal eine verkürzte verbesserte Variante auf, wie ich es machen würde:

@EventHandler void onEDeath(EntityDeathEvent e) {
    
    Entity dead = e.getEntity();
    
    if (dead.getKiller() == null && !( dead.getKiller() instanceof Player)) return;
    
    Player killer = dead.getKiller();
    Bukkit.broadcastMessage( Till.getPrefix() + " §9" + dead.getName() + " §bwurde von §9" + player.getName() + " §bgetötet!");
    
}

( ⬇️ Das fett markierte ist zur Fehlerbehebung und alles andere, um den Code zu verkürzen ⬇️ )

"@EventHandler" und "void onEDeath(...) {" kann man in eine Zeile schreiben und dieses "public" ist nicht nötig.

Dann würde ich zuerst die e.getEntity() getten und erst nach der if-Abfrage diese Entität zum Spieler casten, weil es ja sein könnte, dass ein Spieler zum Beispiel ein Huhn tötet, und da kommt eine Fehlermeldung.

"&&" testet einfach, ob die Bedingung vor UND hinter dem "&&" true sind.

Bei einer if-Abfrage bevorzuge ich lieber if-Zeilen, statt if-Pyramiden, also kann man, wenn man nur einen Befehl in der if-Abfrage ausführen will (in diesem Fall "return;") , dann kann man alles in eine Zeile quetschen.

"return;" returnt einfach nichts. Der Listener ist ja ein void, also braucht er nicht unbedingt einen return-Wert. "return;" bricht außerdem auch den Code im Listener ab, das heißt, der Code, der dahinter steht, wird nicht ausgeführt. In diesem Fall ist es ja nur so, wenn die if-Abfrage erfüllt wird. Wenn die if-Abfrage false ist, wird "return;" nicht ausgeführt und der Code hinter der if-Abfrage wird ausgeführt.

Statt "ChatColor.BLUE" empfehle ich, "§9" zu schreiben, da es viel kürzer ist und das gleiche bedeutet. "ChatColor.AQUA" ist dann "§b". Hier siehst du, welche Farbe welchen Farbcode hat.

"Bukkit.getEntity(null)" bedeutet, du willst die nicht existierende Entität getten, aber das geht ja nicht. Stattdessen müsstest du einfach "dead" schreiben, oder wie du die Entität benennen willst. Aber da du ja nicht eine ganze Entität in eine Nachricht packen kannst, sondern nur den Namen der Entität, musst du "dead.getName()" schreiben.

Das gleiche auch mit dem Player, du musst "player.getName()" statt "player.getPlayer()" schreiben.

Außerdem ist "player.getPlayer()" das selbe wie "player" , und "player.getPlayer().getPlayer().getPlayer().getPlayer().getPlayer()..." (damit gettest du also sich selbst von sich selbst von sich selbst von sich selbst von sich selbst eines Spielers xD keine Ahnung, wieso man sowas machen kann xD) ist auch das gleiche wie "player" .

Versteng alles?

Ich habe manches vielleicht zu kompliziert beschrieben, aber es ist eigentlich recht simpel.

Bei Fragen einfach zurück schreiben.

Woher ich das weiß:Hobby – Habe ich in 2015-2022 gezockt aber ark ist besser
Firstmine 
Fragesteller
 04.11.2020, 09:01

Hey Brockdish,

danke vielmals für deine ausführliche Antwort.

Ich habe alles verstanden habe es so wie du 2 - 3 mal gemacht und habe es jz so abgespeichert. Du hast recht sehr simpel wenn man es erstmal versteht.

Vielen Dank

Till

0