我正在制作一个插件插件(版本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量,但视觉效果被香草覆盖。有人可以帮忙吗?感谢。