当前位置: 首页 > 知识库问答 >
问题:

共享健康插件布基特

微生信鸿
2023-03-14

在for循环中,我的目标是破坏其他没有被破坏的玩家。所以,我做了一个新的事件,它的原因是自杀,这样当它破坏玩家时,这个方法就不会被再次调用,最终杀死玩家。我做了我的研究,发现了调用一个新的实体损坏事件EntityDamageEve=new EntityDamageEv(p,DamageCause.SUICIDE,(int)event.getDamage());Bukkit.getServer(). getPluginManager(). all事件(e);来损坏玩家,但它似乎不起作用。我需要一种替代的方法来损坏我的玩家,但不要一次又一次地调用这个事件。

<code>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);
                }
            }
            
            
        }

注释代码有效,但当它达到负数时,它不会杀死玩家,它只是将玩家的生命值设置为负数。

共有2个答案

百里业
2023-03-14

将玩家存储到一个集合是一个好主意,但我认为你错过了一些东西。

假设:参与人1 =甜甜圈;玩家2 =煎饼

假设甜甜圈受到损害:

damaged = donut
if(!donut.equals(donut))
false
if(!donut.equals(pancake))
true 
   if(!playerSet.contains(pancake))
   true
      playerset.add(pancake);
      pancake.damage(event.getDamage());

我们现在损坏了煎饼并将其存储在playerSet中,因为煎饼损坏了,此事件将再次调用

damaged = pancake
if (!pancake.equals(donut))
true
   if (!playerSet.contains(donut))
   true 
      playerSet.add(donut);
      donut.damage(event.getDamage());

然后它继续。。。

由于损坏的播放器被损坏了两次,因此需要更好的解决方案。

我偶然发现了这个解决方案,添加了playerSet.add(损坏)

@EventHandler
    public void onPlayerDamage(EntityDamageEvent event) {
        if(event.getEntity() instanceof Player) {
            Player damaged =  (Player) event.getEntity();
            playerSet.add(damaged);
            for(Player p :Bukkit.getOnlinePlayers()) {
                if(!damaged.equals(p)) {
                    if(!playerSet.contains(p)) {
                        playerSet.add(p);
                        p.damage(event.getDamage());
                    }
                    else {
                        playerSet.remove(p);
                    }
                }
            }   
        }
    }

我仍然没有检查此代码中是否有错误,因此请随时指出谢谢。

邢博文
2023-03-14

调用伤害事件不会伤害玩家。事件用于在发生某些事情时通知插件,事件本身不会使任何事情发生。

Damagable#setHealth方法不会调用损坏事件,因此您可以在不重复调用事件的情况下使用它。作为javadocs状态,如果健康小于0,该方法将抛出IllegalArgumentExc的异常,因此只需添加检查即可。

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);
        }
    }
}
 类似资料:
  • 在设置ELB健康检查的对话框中,它会声明: 如果实例未通过健康检查,它将自动从负载均衡器中删除。自定义健康检查以满足您的特定需要。 当健康检查失败时,将从ELB后面删除实例。我的问题是围绕“健康门槛”设置。当你悬停在帮助上时,它会说: 在声明EC2实例健康之前连续运行状况检查成功的次数。 如果实例声明为健康的,它是否被拉回负载平衡组?

  • Spring Cloud Stream为粘合剂提供健康指标。它以binders的名义注册,可以通过设置management.health.binders.enabled属性启用或禁用。

  • SOFABoot 为 Spring Boot 的健康检查能力增加了 Readiness Check 的能力。如果你需要使用 SOFA 中间件,那么建议使用 SOFABoot 的健康检查能力的扩展,来更优雅的上线应用实例 引入健康检查扩展 要引入 SOFABoot 的健康检查能力的扩展,只需要引入以下的 Starter 即可: <dependency> <groupId>com.alipay

  • 健康检测是对应用进行check,判定应用是否在正常运行。 健康检测有三种方案 只对tcp端口进行检测 只通过http的方式check需要提供path地址 以上两种结合

  • 健康资讯是基于医药吧网开放的 API 健康一问手机平台,该软件完全基于 Sencha Touch 开发。 健康资讯是医药吧网旗下的网站,网站提供免费的 API 接口。同时也提供健康一问、健康知识等。 手机客户运行效果: 也可以通过浏览器访问:http://app.yi18.net/news/index.html Apk下载地址:news_yi18.apk 健康资讯:http://www.oschi