loupix_ Geschrieben 23. April 2016 Share Geschrieben 23. April 2016 (bearbeitet) 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. bearbeitet 24. April 2016 von loupix_ Titel vergessen Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Derya001 Geschrieben 23. April 2016 Share Geschrieben 23. April 2016 (bearbeitet) 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. bearbeitet 23. April 2016 von Derya001 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
loupix_ Geschrieben 23. April 2016 Autor Share Geschrieben 23. April 2016 (bearbeitet) 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() bearbeitet 23. April 2016 von loupix_ Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
boomer41 Geschrieben 23. April 2016 Share Geschrieben 23. April 2016 ((Arrow) event.getDamager()).getShooter() Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
loupix_ Geschrieben 23. April 2016 Autor Share Geschrieben 23. April 2016 Danke Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
loupix_ Geschrieben 23. April 2016 Autor Share Geschrieben 23. April 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? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
boomer41 Geschrieben 23. April 2016 Share Geschrieben 23. April 2016 Natürlich musst du vorher auch checken ob der Damager auch wirklich ein Pfeil ist. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
loupix_ Geschrieben 24. April 2016 Autor Share Geschrieben 24. April 2016 (bearbeitet) Okay, werde ich versuchen. bearbeitet 24. April 2016 von loupix_ Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
loupix_ Geschrieben 24. April 2016 Autor Share Geschrieben 24. April 2016 (bearbeitet) 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?? bearbeitet 24. April 2016 von loupix_ Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
BloodSKreaper Geschrieben 24. April 2016 Share Geschrieben 24. April 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 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
loupix_ Geschrieben 24. April 2016 Autor Share Geschrieben 24. April 2016 (bearbeitet) | | \/ bearbeitet 24. April 2016 von loupix_ Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
loupix_ Geschrieben 24. April 2016 Autor Share Geschrieben 24. April 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); } } } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Derya001 Geschrieben 25. April 2016 Share Geschrieben 25. April 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 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
loupix_ Geschrieben 25. April 2016 Autor Share Geschrieben 25. April 2016 (bearbeitet) Ist mir vor ein paar Minuten auch aufgefallen. Das Komische ist, dass der Fehler auch auftritt wenn man wirklich mit dem Bogen schiesst bearbeitet 25. April 2016 von loupix_ Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Derya001 Geschrieben 25. April 2016 Share Geschrieben 25. April 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. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
loupix_ Geschrieben 25. April 2016 Autor Share Geschrieben 25. April 2016 (bearbeitet) 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 bearbeitet 25. April 2016 von loupix_ Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
loupix_ Geschrieben 26. April 2016 Autor Share Geschrieben 26. April 2016 (bearbeitet) 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. bearbeitet 26. April 2016 von loupix_ Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Derya001 Geschrieben 26. April 2016 Share Geschrieben 26. April 2016 mach es lieber so: ((Arrow)e.getDamager).getShooter() .getName; Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
loupix_ Geschrieben 26. April 2016 Autor Share Geschrieben 26. April 2016 Existiert ziemlich sicher nicht kann aber trotzdem nochmal nachschauen Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Derya001 Geschrieben 26. April 2016 Share Geschrieben 26. April 2016 Wenn es sich um einen Player/HumanEntity handelt gibt es auf jeden Fall die Methode *.getName(); Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
loupix_ Geschrieben 28. April 2016 Autor Share Geschrieben 28. April 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! Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Derya001 Geschrieben 28. April 2016 Share Geschrieben 28. April 2016 (bearbeitet) 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(); } bearbeitet 28. April 2016 von Derya001 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde dich hier an.
Jetzt anmelden