gpt4 book ai didi

java - 共享健康插件 Bukkit

转载 作者:行者123 更新时间:2023-12-01 14:16:43 33 4
gpt4 key购买 nike

在 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/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com