因此,我正在尝试制作一个球队插件,其中每个球队都有一个player1和player2。 现在,我想使用EntityDamageByEntityEvent添加Friendyfire,但是我的代码不起作用,或者事件未激活。我是Plugins的新手,所以我的代码可能有点愚蠢。 顺便说一句,“ teams2”是一个包含“ Team”对象的ArrayList,每个对象都包含player1,player2和组名。
这是功能:
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);
}
}
}
}
}
它应该取消该事件,以使同一团队的玩家无法互相攻击,但事实并非如此。为什么?您还可以建议其他方法来创建FriendlyFire函数。
答案 0 :(得分:1)
由于您没有发布整个源代码,所以我将首先提出一个简单的问题,即许多不熟悉Bukkit编程的人做错了(甚至在我身上有时发生过):您是否注册了事件?
public class YourPlugin extends JavaPlugin {
@Override
public void onEnable() {
super.onEnable();
Bukkit.getServer().getPluginManager().registerEvents(listener, this);
}
}
listener
是您的Listener类的实例。因此,如果您有此代码,并在MainClass的问题中发布了该代码,则该代码应如下所示:
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
}
}
如果您有一个单独的类,它应该像这样:
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
}
}
将@EventHandler
放在EntityDamageByEntntyEvent
上方一行非常重要。这也可能是您的活动不起作用的原因。
我通过您的侦听器查看,它应该可以正常工作。我只是花些时间将其收紧:
@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);
}
}
}
我不知道teams2
中存储了什么类,但是我大胆地猜测它将是Team
,因此如果您采用其他一些类名,则可能需要更改它喜欢尝试我的代码。