loupix_ Posted April 23, 2016 Posted April 23, 2016 (edited) Hallo Minecraftforum! Kurz und simpel gefragt: Wie erhält man den Schützen eines Projektils, dass das EntityDamageEvent auslöst? Ich programmiere momentan ein Team-Plugin und möchte daher Bogen-, Angel-, Und Schlagschaden des Teampatners cancellen sodass sie sich durch die drei dinge nicht mehr töten können. LG Loupix P.S.: Den normalen Schlagschaden kannn ich schon mithilfe des EntityDamageByEntityEvents blockieren. Edited April 24, 2016 by loupix_ Titel vergessen
Derya001 Posted April 23, 2016 Posted April 23, 2016 (edited) Der Schadensverurascher wird bei solchen Events normalerweise direkt mitgeliefert. Guck dir mal die Methoden an, die du vom Event ansprechen kannst und was Sie zurückgeben. Edit: Da hast dus doch schon, beim EntityDamageByEntityEvent lässt sich doch der Verursacher und der geschädigte separieren. Das müsste doch auch bei Pfeilen usw funktionieren. Edited April 23, 2016 by Derya001
loupix_ Posted April 23, 2016 Author Posted April 23, 2016 (edited) Bei EntityDamageEvent wird NUR mit getCause der Verursacher mitgeliefert z.B PROJECTILE Aber in dem Falle nicht wer das "PROJECTILE" geschossen hat, wie zum Beispiel beim EntityDamageByEntityEvent mit getDamager() Edited April 23, 2016 by loupix_
loupix_ Posted April 23, 2016 Author Posted April 23, 2016 Hab es gerade ausprobiert und als ich einen Spieler geschlagen habe, würde es nicht gecancelled und ein Fehler in der Konsole sagte mir das man ein HumanEntity nicht in einen Arrow casten kann :/ Hat da jemand eine Lösung?
boomer41 Posted April 23, 2016 Posted April 23, 2016 Natürlich musst du vorher auch checken ob der Damager auch wirklich ein Pfeil ist.
loupix_ Posted April 24, 2016 Author Posted April 24, 2016 (edited) Okay, werde ich versuchen. Edited April 24, 2016 by loupix_
loupix_ Posted April 24, 2016 Author Posted April 24, 2016 (edited) Ich habe mit getCause() überprüfen lassen ob ein PROJECTILE den Spieler getroffen hat und es wurde mir trortdem der Fehler ausgeworfen :/ Was wäre diesmal der Fehler?? Edited April 24, 2016 by loupix_
BloodSKreaper Posted April 24, 2016 Posted April 24, 2016 Guten Tag, es wäre hilfreich, wenn du mal deinen ganzen Code, der das mit dem Pfeil betrifft, hier rein kopierst. Da würde sich die Fehlersuche um einiges erleichtern. Freundliche Grüße BloodSKreaper
loupix_ Posted April 24, 2016 Author Posted April 24, 2016 (edited) | | \/ Edited April 24, 2016 by loupix_
loupix_ Posted April 24, 2016 Author Posted April 24, 2016 Also: @EventHandler public void onDamage(EntityDamageByEntityEvent e){ if(e.getCause() == DamageCause.ENTITY_ATTACK){ if((TeamYML.getTeams().getString("players." + e.getDamager().getName() + ".team") != null) && (TeamYML.getTeams().getString("players." + e.getEntity().getName() + ".team") != null)){ if(TeamYML.getTeams().getString("players." + e.getDamager().getName() + ".team") == TeamYML.getTeams().getString("players." + e.getEntity().getName() + ".team")){ e.setCancelled(true); } } } else if(e.getCause() == DamageCause.PROJECTILE){ if((TeamYML.getTeams().getString("players." + ((Arrow)e.getDamager()).getShooter() + ".team") != null) && (TeamYML.getTeams().getString("players." + e.getEntity().getName() + ".team") != null)){ if(TeamYML.getTeams().getString("players." + ((Arrow)e.getDamager()).getShooter() + ".team") == TeamYML.getTeams().getString("players." + e.getEntity().getName() + ".team")){ e.setCancelled(true); } } } }
Derya001 Posted April 25, 2016 Posted April 25, 2016 Ein Projektil ist doch nicht zwangsläufig ein Pfeil, oder sehe ich das falsch? if(e.getDamager instanceof Arrow) String player=((Arrow)e.getDamager()).getShooter(); Damit sollte sichergestellt werden dass es sich tatsächlich um einen Pfeil handelt, bevor du den Damager als Arrow ausweist. LG, Derya001
loupix_ Posted April 25, 2016 Author Posted April 25, 2016 (edited) Ist mir vor ein paar Minuten auch aufgefallen. Das Komische ist, dass der Fehler auch auftritt wenn man wirklich mit dem Bogen schiesst Edited April 25, 2016 by loupix_
Derya001 Posted April 25, 2016 Posted April 25, 2016 Bau die if-Abfrage trotzdem mal ein. Bekommst du dann immer noch eine Fehlermeldung, kann der Damager nicht abgefragt werden und wir sind schonmal einen Schritt weiter.
loupix_ Posted April 25, 2016 Author Posted April 25, 2016 (edited) Jetzt erscheint keine Fehlermeldung mehr und nach ein bisschen Rumprobieren hat sich ergeben, dass beide If-Abfragen nicht zutreffen. Da der TeamYml-Code in den Abfragen ziemlich sicher richtig ist(habe ihn auch schon in anderen Teilen meines Plugins verwendet) gehe ich davon aus, dass es an ((Arrow)e.getDamager()).getShooter() liegt Edited April 25, 2016 by loupix_
loupix_ Posted April 26, 2016 Author Posted April 26, 2016 (edited) Ich glaube ich habe den Fehler gefunden(noch nicht ausprobiert). ((Arrow)e.getDamager).getShooter(); gibt ja keinen String zurück, sondern einen Spieler. Deshalb wird ja auch nicht in der Confi nach z.B. Players.irgendeinspieler.team gesucht sondern nach etwas anderem. Die Lösung wäre meines Wissens ein .toString(); hingendran zuhängen. Edited April 26, 2016 by loupix_
Derya001 Posted April 26, 2016 Posted April 26, 2016 mach es lieber so: ((Arrow)e.getDamager).getShooter() .getName;
loupix_ Posted April 26, 2016 Author Posted April 26, 2016 Existiert ziemlich sicher nicht kann aber trotzdem nochmal nachschauen
Derya001 Posted April 26, 2016 Posted April 26, 2016 Wenn es sich um einen Player/HumanEntity handelt gibt es auf jeden Fall die Methode *.getName();
loupix_ Posted April 28, 2016 Author Posted April 28, 2016 Okay habe einfach den Spieler in eine Variable gespeichert: Player damager = (Player)((Arrow)e.getDamager()).getShooter(); und überall wo ich den Namen des Schützen haben wollte einach: damager.getName(); benutzt. Nun funktioniert alles! Danke für eure Hilfe!
Derya001 Posted April 28, 2016 Posted April 28, 2016 (edited) Siehst du, klappt doch alles EDIT: Wenn du es schön übersichtlich haben möchtest, kannst du dir auch einfach eine Methode schreiben die du jederzeit abfragen kannst: public String getShooterName(EntityDamageByEntityEvent e){ return ((Arrow)e.getDamager()).getShooter().getName(); } Edited April 28, 2016 by Derya001
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now