为什么库存会更新?

时间:2015-06-10 23:30:01

标签: java algorithm bukkit inventory

我正在使用Bukkit API 1.8和Java 7。

我有一个重复的任务,循环通过服务器上的所有玩家,并将他们的盔甲随机设置为皮革,锁子甲等......

当我使用setHelmetsetChestplate等方法时...我会像往常一样更新他们的库存,但由于此任务每6个刻度运行一次,因此运行速度很快。因此,当玩家试图射弓时,每次执行此任务时弓都会重置其力量。

由于我知道更新广告资源存在问题,因此我尝试删除updateInventory方法。

这样做之后,护甲仍然被穿上并更换,但每次任务运行时弓仍然被重置。

在保持任务运行的同时,如何防止重置?

我的代码:

@SuppressWarnings("deprecation")
public static void repeatEffect()
{
    main.getServer().getScheduler().scheduleAsyncRepeatingTask(main, new Runnable()
    {
    @Override
        public void run()
        {
          for(Player o : Bukkit.getOnlinePlayers())
          {
            Material M1 = Material.WOOL;
            int num = rainbow.get(o.getName());
            if(num==1)
            {
               M1 = Material.LEATHER_HELMET;
            }
            else if(num==2)
            {
               M1 = Material.CHAINMAIL_HELMET;
            }
            else if(num==3)
            {
               M1 = Material.GOLD_HELMET;
            }
            else if(num==4)
            {
               M1 = Material.IRON_HELMET;
            }
            else if(num==5)
            {
               M1 = Material.DIAMOND_HELMET;
            }
            rainbow.put(o.getName(), num+1);
            if(rainbow.get(o.getName())>5)
            {
               rainbow.put(o.getName(), 1);
            }
            ItemStack rrhelm = createItemStack(M1, 1, "§a§lR§b§la§c§li§d§ln§e§lb§f§lo§a§lw §c§lH§d§le§e§ll§f§lm§a§le§b§lt", "§7Very special piece of armor");
            o.getInventory().setHelmet(rrhelm);
          }
        }
    }
    , 6, 6);
}

2 个答案:

答案 0 :(得分:0)

经过多次测试之后,我能够重现弓复杂化的唯一方法是调用你说你删除的已弃用的updateInventory()方法。我相当肯定你在代码中的某个地方仍然有这个方法因为我找不到任何会导致弓行为的东西(我仍然可以解雇弓但是动画看起来很毛躁而且力量很大箭头有时是不正确的。)

我的代码之间的唯一区别是我使用new ItemStack(M1)而不是您的createItemStack()方法来实例化头盔(也尝试更改名称,传说和数量)。我仍然能够射弓很好。重置弓/库存是否与您的createItemStack方法有关?

您没有理由异步运行此任务。您正在从异步任务或a big no-no的不同线程访问Bukkit API,并且可能导致各种棘手的问题。使用scheduleSyncRepeatingTask方法在同一个线程中运行任务。

为了简单起见,我每6个刻度随机设置一个单一的装甲槽(也尝试了全部四个)皮革或铁。似乎没有干涉弓。我们能看到你的代码吗?这是我的:

public void onEnable() {
    this.getServer().getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {
        public void run() {
            for (World world : Bukkit.getWorlds()) {
                for (Player player : world.getPlayers()) {
                    if (Math.random() < 0.5) {
                        player.getInventory().setBoots(new ItemStack(Material.IRON_BOOTS));
                    } else {
                        player.getInventory().setBoots(new ItemStack(Material.LEATHER_BOOTS));
                    }
                }
            }
        }
    }, 0, 6);
}  

答案 1 :(得分:0)

如果更换护甲会重置玩家弓箭,你可以通过改变正在加入的玩家的护甲,而不是挥动弓箭或仅在EntityShootBowEvent之后来解决它。

要查看玩家是否挥动弓箭,请使用:

org.bukkit.Bukkit.entity.Player player = ...;
boolean hasBowEquiped = player.getEquipment().getItemInHand().getData().getItemType().equals(Material.BOW);