我正在制作一个水龙头插件(版本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覆盖。有人能帮忙吗?谢谢。
仅设置玩家的EXP不足以满足您的期望行为。香草行为仍然会完成,因为您没有更改事件将如何为玩家添加EXP。
目前,您的活动是这样工作的:
并且PlayerEXGainEvent
是不可取消的,因此您无法撤消它添加的EXP。
你可以做的是设置EXP事件将增加到0,因此在你拦截后不会改变玩家的EXP。
event.setAmount(0); //Cancelling the EXP addition
我建议将您的事件设置为高优先级,以便在您将获得的金额设置为0时不会触发其他依赖于经验增益的事件。