Jump to content

[1.8.8]Schützen eines Projektils herausfinden


loupix_
 Share

Recommended Posts

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
Link to comment
Share on other sites

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
Link to comment
Share on other sites

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_
Link to comment
Share on other sites

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 to comment
Share on other sites

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 to comment
Share on other sites

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 to comment
Share on other sites

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_
Link to comment
Share on other sites

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_
Link to comment
Share on other sites

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 to comment
Share on other sites

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
Link to comment
Share on other sites

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
 Share

×
×
  • Create New...
B