在 for 循环中,我的目标是伤害其他未被伤害的玩家。因此,我创建了一个新事件,其原因是自杀,这样当它对玩家造成伤害时,就不会再次调用此方法,最终杀死玩家。我进行了研究,发现有关调用新实体损坏事件的信息 EntityDamageEvent e = new EntityDamageEvent(p, DamageCause.SUICIDE,(int)event.getDamage()); Bukkit.getServer().getPluginManager().callEvent(e);
损坏播放器,但它似乎不起作用。我需要一种替代方法来损坏我的播放器,但又不会一遍又一遍地调用此事件。
p.Damage(event.getDamage());
当放在里面时,事件循环。
@EventHandler
public void onPlayerDamage(EntityDamageEvent event) {
if(event.getEntity() instanceof Player && event.getCause() != DamageCause.SUICIDE ) {
Player damaged = (Player) event.getEntity();
for(Player p :Bukkit.getOnlinePlayers()) {
if(!p.getName().equalsIgnoreCase(damaged.getName())) {
EntityDamageEvent e = new EntityDamageEvent(p, DamageCause.SUICIDE,(int)event.getDamage());
Bukkit.getServer().getPluginManager().callEvent(e);
//double cHealth =p.getHealth()-event.getDamage();
//p.setHealth(cHealth);
}
}
}
注释代码有效,但当它达到负数时,它不会杀死玩家,它只会将玩家的生命值设置为负数。
最佳答案
调用伤害事件不会伤害玩家。事件用于在发生某些事情时通知插件,事件本身不会使任何事情发生。
Damageable#setHealth方法不会调用损坏事件,因此您可以在不重复调用事件的情况下使用它。正如 javadocs 所述,如果健康状况小于 0,该方法将抛出 IllegalArgumentException,因此只需为其添加检查即可。
double cHealth = p.getHealth() - event.getDamage();
p.setHealth(cHealth < 0 ? 0 : cHealth);
但是,我不推荐使用 setHealth 方法,因为它不会考虑护甲。使用 Damageable#damage在不重复调用损坏事件的情况下,您可以将玩家添加到集合中并检查玩家是否在集合中。
private Set<Player> playerSet = new HashSet<>();
@EventHandler
public void onPlayerDamage(EntityDamageEvent event) {
if (event.getEntity() instanceof Player) {
Player damaged = (Player) event.getEntity();
if (!playerSet.contains(damaged)) {
for (Player p : Bukkit.getOnlinePlayers()) {
if (!damaged.equals(p)) {
playerSet.add(p);
p.damage(event.getDamage());
}
}
} else {
playerSet.remove(damaged);
}
}
}
关于java - 共享健康插件 Bukkit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62708196/