我的PlayerExpChangeEvent的一部分被香草

时间:2017-12-11 03:32:37

标签: plugins minecraft bukkit

我正在制作一个插件插件(版本1.8.8),它具有我知道的功能,因为它可以通过我的命令完美地启动。但是,当我在PlayerExpChangeEvent结束时调用它时,看起来像vanilla的水平覆盖了条形图,使其上升得更多。在这种情况发生之后运行命令/功能会使条形回到原来的状态。 我已经尝试将我的事件的优先级设置为最高(当这不起作用时,最低)但是无论在事件内部调用时我的功能似乎都被完全忽略。

以下是一些代码:

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

这是功能本身。请记住,通过命令而不是事件调用它时工作正常。它的目的是使用玩家的总XP来设置等级和条形。在事件中没有正确设置;它取而代之的是香草流平。

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

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

1 个答案:

答案 0 :(得分:4)

仅设置播放器的EXP将不足以满足您的预期行为。香草行为仍将完成,因为您没有更改事件将EXP添加到播放器的方式。

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

Flow of an Experience event. Starting at a Player getting EXP, which leads to a PlayerExpGainEvent being fired. When the event completes, the EXP is added to the player, not mattering if there's an Interception.

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

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

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

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