java - 为什么这个法术能给施法者带来满血?

标签 java bukkit

我使用自定义法术插件运行服务器。下面这个函数是一个单一的咒语。它应该做的是,对它击中的任何物体给予 2 颗心,并治愈施法者 2 颗心(每个目标命中)。然而,它总是将施法者设置为十颗心!

public void onPlayerInteractBlockLifeSteal(final Player player) {
    if (worldChecker(player)){
            if (player.getFoodLevel() > 12){
                List<Block> targets = player.getLineOfSight((Set)null, 20);
                float pathway = 0;
                for (final Block target : targets){
                    Bukkit.getScheduler().runTaskLater(MagictgCraft.that, new Runnable(){
                        @Override
                        public void run(){
                            int count = 0;
                            if (target.getType() != Material.AIR){
                                player.getWorld().playSound(target.getLocation(), Sound.SUCCESSFUL_HIT, 10, 1);
                            }
                            while (count < 5){
                                player.getWorld().playEffect(target.getLocation().clone().add(0.5,0.5,0.5), Effect.WITCH_MAGIC, 10);
                                player.getWorld().playEffect(target.getLocation().clone().add(0.5,0.5,0.5), Effect.SMOKE, 10);
                                count = count + 1;
                            }
                            List<Entity> victims = (List<Entity>) target.getWorld().getNearbyEntities(target.getLocation(),1,1,1);
                            for (Entity victim2 : victims){
                                if (victim2 instanceof LivingEntity){
                                    LivingEntity victim = (LivingEntity) victim2;
                                    if (victim != player){
                                        victim.damage(4,player);
                                        double health = player.getHealth();
                                        health = health + 4;
                                        if (health > 20){
                                            health = 20;
                                        }
                                            player.setHealth(health);
                                    }
                                }
                            }
                        }
                    },(long) pathway);
                    pathway = (float) (pathway + 0.5);
                }
                int manaused = player.getFoodLevel();
                manaused = manaused - 12;
                player.setFoodLevel(manaused);
        }
    }
}

任何人都可以看到任何问题吗?

最佳答案

List<Block> targets = player.getLineOfSight((Set)null, 20);

for (final Block target : targets)

这里,这个循环调用 Runnable 的次数与可见 block 的数量一样多。因此,他们每次施法都会得到多次治疗,自然会达到十心上限,因为你设置了这么宽的视线。

关于java - 为什么这个法术能给施法者带来满血?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32547247/

相关文章:

java - 在 Weblogic 12.1.3.0 上部署 Spring 应用程序时出错

java - 预增量与后增量 - for 循环速度

java - 龙头改变染色粘土颜色

java - 插口 | PersistantDataContainer() 表示无法解析

java - Bukkit 服务器 "unsupported major minor version 51.0"错误

java - 设置 LayoutParams 时出现 NullPointerException

java - 带有 ADT 插件的 Eclipse - 布局编辑器不显示内容(卡在 "Loading editor"上)

java - 为什么这不起作用? Java 新手。 (布基特)

java - 如何改变活塞方向?

java - JPA + Datanucleus + 连接池 : connections are opened/closed with each statement