EntityDeathEvent?
Hallo,
ich möchte in mein Plugin miteinbauen das wenn ein Monster gekillt wird eine Nachricht an den Server gesendet wird wer welches Mob gekillt hat.
Das ist mein Code:
public class MobDeath implements Listener {
@EventHandler
public void onEDeath(EntityDeathEvent e) {
if (e.getEntity().getKiller() !=null) {
Player player = (Player) e.getEntity();
Player mob = e.getEntity().getKiller();
Bukkit.broadcastMessage(Till.getPrefix() + " " + ChatColor.BLUE + Bukkit.getEntity(null) + ChatColor.AQUA + "wurde von " + ChatColor.BLUE + player.getPlayer() + ChatColor.AQUA + "getötet!");
}
}
}
Heraus kam wenn ich einen z.B. Creeper killte nur eine riesen Fehlermeldung in der Konsole.
Kann mir wer helfen?
Till
Was willst du mit
Bukkit.getEntity(null)
und
player.getPlayer()
erreichen?
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
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.
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