【问题标题】:Why is the inventory updating?为什么要更新库存?
【发布时间】:2015-06-10 23:30:01
【问题描述】:

我正在使用带有 Java 7 的 Bukkit API 1.8。

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

当我使用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);
}

【问题讨论】:

    标签: java algorithm bukkit inventory


    【解决方案1】:

    如果更换盔甲会重置玩家的弓,你可以通过只改变加入的玩家的盔甲来解决这个问题,而不是使用弓或在 EntityShootBowEvent 之后。

    要查看玩家是否在使用弓,请使用:

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

    【讨论】:

      【解决方案2】:

      在对此进行了更多测试之后,我能够重现弓形并发症的唯一方法是调用您说已删除的已弃用 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);
      }  
      

      【讨论】:

      • createItemStack() 对我来说只是一种更简单的方法,可以用更少的代码制作 itemstacks。通常使用声明创建 ItemStacks。第一个参数:材质,第二个:数量,第三个:显示名称,第四个:lore。但是,您的代码运行 0、6。我的运行 6、6。
      • scheduleSyncRepeatingTask 方法中的第一个长参数是延迟,而第二个参数是周期或任务被调用的频率 (javaminecraft.com/bukkitapi/org/bukkit/scheduler/…)。我只是立即开始任务,而您的插件等待大约四分之一秒才能开始。这不应该影响弓箭射击,但只是为了确保我也尝试了 6 刻延迟并且它有效。我们可以看看你的 createItemStack 方法吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-01
      • 1970-01-01
      相关资源
      最近更新 更多