Por lo tanto, yo estoy tratando de hacer un plugin de equipos, donde cada equipo tiene una jugador1 y jugador2. Ahora quería añadir friendyfire utilizando el EntityDamageByEntityEvent, pero o mi código no funciona, o el evento no se activan. Soy bastante nuevo en plugins, por lo que podría ser que mi código es un poco estúpida. Por cierto, "teams2" es un ArrayList con objetos "equipo" en él, cada uno contiene jugador1, jugador2 y la teamname.
Esta es la función:
public void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
if (((event.getEntity() instanceof Player)) && ((event.getDamager() instanceof Player))) {
Player player = (Player)event.getEntity();
Player damager = (Player)event.getDamager();
for(int i = 0; i < teams2.size(); i++){
if((teams2.get(i).player1 == player || teams2.get(i).player2 == player) && (teams2.get(i).player1 == damager || teams2.get(i).player2 == damager)){
event.setCancelled(true);
}
}
}
else if (((event.getEntity() instanceof Arrow)) && ((event.getDamager() instanceof Player))) {
Entity arrow = event.getEntity();
if ((((Projectile)arrow).getShooter() instanceof Player)) {
Player player = (Player)arrow;
Player damager = (Player)event.getDamager();
for(int i = 0; i < teams2.size(); i++){
if((teams2.get(i).player1 == player || teams2.get(i).player2 == player) && (teams2.get(i).player1 == damager || teams2.get(i).player2 == damager)){
event.setCancelled(true);
}
}
}
}
}
Se debe cancelar el evento, por lo que los jugadores del mismo equipo no pueden atacar a los demás, pero eso no es el caso. ¿Por qué? También puede sugerir otras maneras de crear una función FriendlyFire.
Puesto que no publique toda su código fuente Voy a comenzar con una simple pregunta que muchas personas nuevas a la programación Bukkit consiguen mal hecho (incluso me sucede algunas veces): ¿Te has registrado tus eventos?
public class YourPlugin extends JavaPlugin {
@Override
public void onEnable() {
super.onEnable();
Bukkit.getServer().getPluginManager().registerEvents(listener, this);
}
}
listener
es una instancia de la clase de escucha. Así que si usted tiene este código que envió en su pregunta en sus MainClass que debería tener este aspecto:
public class YourPlugin extends JavaPlugin implements Listener {
@Override
public void onEnable() {
super.onEnable();
Bukkit.getServer().getPluginManager().registerEvents(this, this);
}
@EventHandler
public void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
//your event
}
}
y si usted tiene una clase separada que debe tener este aspecto:
public class YourPlugin extends JavaPlugin {
@Override
public void onEnable() {
super.onEnable();
Bukkit.getServer().getPluginManager().registerEvents(new YourListener(), this);
}
}
public class YourListener implements Listener {
@EventHandler
public void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
//your event
}
}
Es muy importante que usted pone este @EventHandler
una línea por encima de su EntityDamageByEntntyEvent
. Esto también podría ser un problema por las que su caso no funciona.
Miré a través de su oyente y debería funcionar totalmente bien. Me tomó el tiempo para apretarlo un poco:
@EventHandler
public void onEntityDamageByEntity(EntityDamageByEntityEvent e) {
if (!(e.getEntity() instanceof Player)) return;
Player player = (Player) e.getEntity();
Player damager;
if (e.getDamager() instanceof Arrow) {
Arrow a = (Arrow) e.getDamager();
if (!(a.getShooter() instanceof Player)) return;
damager = (Player) a.getShooter();
} else {
if (!(e.getDamager() instanceof Player)) return;
damager = (Player) e.getDamager();
}
for (Team t : teams2) {
if ((t.player1 == player || t.player2 == player) && (t.player1 == damager || t.player2 == damager)) {
e.setCancelled(true);
}
}
}
No sé qué clase se almacena en teams2
pero me tomó una suposición sería Team
lo que podría tener el cambio que si se toma alguna otra clase y nombre que le gustaría probar mi código.