java - 共享健康插件 Bukkit

标签 java minecraft bukkit

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

相关文章:

java - 操作栏上的向上导航会关闭 Android 中的应用程序。无效输入连接

java - Java Bukkit 插件上的 RegisteredListener.callEvent 错误

c# - 我如何计算在体素游戏中应该首先加载哪些 block ?

java - 反编译MCP报错(9.18版)返回 'Decompile Failed' 1

java - Bukkit 自定义元素消耗

java - Bukkit 将玩家皮肤从服务器更改为 png(无效签名)

java - 迭代所有相同类型的连接 block

java - 测试中未使用/已使用的常量

java - HK2 IterableProvider 命名方法找不到实现

java - 如何自定义 keycloak AccountPages?