提问者:小点点

我的部分PlayerOutChangeEvent被香草覆盖


我正在制作一个水龙头插件(版本1.8.8),它有一个我知道可以工作的函数,因为它通过我的命令完美地触发。然而,当我在PlayerOutChangeEvent结束时调用它时,它似乎像香草调平覆盖了酒吧,使它比预期的上升得更多。在此之后运行命令/函数会使酒吧回到它应该是的样子。我尝试将事件的优先级设置为最高(当这不起作用时,设置为最低),但无论我的函数在事件内部调用时似乎都被完全忽略。

这是一些代码:

@EventHandler(priority=EventPriority.HIGHEST)
  public void onXpGain(PlayerExpChangeEvent event)
  {
// Load custom levels from config
    ArrayList<String> levelList = new ArrayList<String>(plugin.getConfig().getStringList("levels"));
    if (!((String)levelList.get(0)).equals("none"))
    {
      Player player = event.getPlayer();
      Iterator<String> var4 = levelList.iterator();
      while (var4.hasNext())
      {
        String s = (String)var4.next();
        String[] splits = s.split(" ");
        int levelCompare = Integer.parseInt(splits[0]);
        int playerLvl = player.getLevel();

        // Detect if on correct tier, else continue iteration
        if (playerLvl == levelCompare - 1)
        {
          // Calculate the player's new XP amount
          int totalXp = player.getTotalExperience() + event.getAmount();
          player.setTotalExperience(totalXp);
          updateBar(event.getPlayer()); // <-- THIS IS THE FUNCTION
          return;
      }
    }
      // At max level
      player.setTotalExperience(player.getTotalExperience() + event.getAmount());
      player.setLevel(getHighestLevel(levelList));
      player.setExp(1.0f);
   }
  }

这是函数本身。请记住,当通过命令而不是事件调用时,它可以正常工作。它的目的是使用玩家的总经验值来设置关卡和条形图。两者都没有在事件中正确设置;相反,它采用香草关卡。

public static void updateBar(Player player) {

    ArrayList<String> levelList = new ArrayList<String>(plugin.getConfig().getStringList("levels"));
    int totalXp = player.getTotalExperience();

        player.setLevel(getHighestLevelForXp(totalXp, levelList));

        if (player.getLevel() < getHighestLevel(levelList)) {

            int lvlDiff = getTotalXpToLevel(player.getLevel() + 1,levelList) - getTotalXpToLevel(player.getLevel(),levelList);
            int xpDiff = totalXp - getTotalXpToLevel(player.getLevel(),levelList);

            player.setExp((float)xpDiff/lvlDiff);
        } else {
            player.setLevel(getHighestLevel(levelList));
            player.setExp(0.0f);
        }
    return;
  }

函数正常工作的命令是对函数的基本调用,这里不需要提及。有人知道如何让我的事件覆盖vanilla xp增益吗?更新通过命令工作,只是不是自然xp增益。已经确认事件确实触发,因为事件的其余部分更改了内部xp量,但视觉效果被vanilla覆盖。有人能帮忙吗?谢谢。


共1个答案

匿名用户

仅设置玩家的EXP不足以满足您的期望行为。香草行为仍然会完成,因为您没有更改事件将如何为玩家添加EXP。

目前,您的活动是这样工作的:

并且PlayerEXGainEvent是不可取消的,因此您无法撤消它添加的EXP。

你可以做的是设置EXP事件将增加到0,因此在你拦截后不会改变玩家的EXP。

event.setAmount(0);    //Cancelling the EXP addition

我建议将您的事件设置为高优先级,以便在您将获得的金额设置为0时不会触发其他依赖于经验增益的事件。