Jump to content

Recommended Posts

Posted (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 by loupix_
Titel vergessen
Posted (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 by Derya001
Posted (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 by loupix_
Posted

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?

Posted (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 by loupix_
Posted

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

 

Posted

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

 

Posted

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

 

 

Posted (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 by loupix_
Posted

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.

 

Posted (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 by loupix_
Posted (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 by loupix_
Posted

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! :D

 

Danke für eure Hilfe!

 

Posted (edited)

Siehst du, klappt doch alles :P 

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 by Derya001

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...
B
B