Jump to content

[1.8.8]Schützen eines Projektils herausfinden


Empfohlene Beiträge

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 von loupix_
Titel vergessen
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Derya001
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von loupix_
Link zu diesem Kommentar
Auf anderen Seiten teilen

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

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

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 von loupix_
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von loupix_
Link zu diesem Kommentar
Auf anderen Seiten teilen

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!

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

}

bearbeitet von Derya001
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...
B
B