2017-12-11 6 views
1

Ich mache ein Spigot-Plugin (Version 1.8.8) mit einer Funktion, von der ich weiß, dass sie funktioniert, weil sie fehlerfrei über meinen Befehl ausgelöst wird. Wenn ich es jedoch am Ende eines PlayerExpChangeEvents anrufe, scheint es so, als ob vanilla levelling den Balken außer Kraft setzt und es so viel höher geht, wie es sollte. Wenn der Befehl/die Funktion ausgeführt wird, nachdem dies passiert ist, wird der Balken wieder so angezeigt, wie er sein soll. Ich habe versucht, die Priorität meines Ereignisses auf höchste (und wenn das nicht funktioniert, auf niedrigste) zu setzen, aber egal, was meine Funktion scheint vollständig ignoriert zu werden, wenn innerhalb des Ereignisses aufgerufen. HierSpigot - Ein Teil meines PlayerExpChangeEvent wird von Vanille überschrieben

ist ein Code:

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

Und hier ist die Funktion selbst. Beachten Sie, dass es funktioniert, wenn es durch einen Befehl und nicht durch ein Ereignis aufgerufen wird. Es dient dazu, die Gesamt-EP des Spielers zu verwenden, um die Stufe und den Balken einzustellen. Weder im Ereignis richtig eingestellt noch es umfasst stattdessen Vanille-Nivellierung.

Der Befehl, bei dem die Funktion ordnungsgemäß funktioniert, ist ein einfacher Aufruf der Funktion und muss hier nicht erwähnt werden. Weiß jemand, wie ich mein Ereignis dazu bringen kann, den Gewinn von Vanille XP aufzuheben? Das Update funktioniert über den Befehl, nur nicht natürliche XP-Verstärkung. Es ist bereits bestätigt, dass das Event ausgelöst wird, da der Rest des Events den internen XP-Wert ändert, aber die visuellen Effekte werden von Vanille überschrieben. Kann jemand helfen? Vielen Dank.

+0

gewonnen setzen Sie das Ereignis so stornieren dass eine Veränderung nicht passiert, bevor Sie den Rest erledigen, vielleicht ist das genug – Kerooker

+0

@Kerooker Die Veranstaltung abbrechen? Das klingt, als ob ich das brauche, aber was ist das? (Vielleicht geben Sie es in einer Antwort, damit ich Ihre Antwort akzeptieren kann) – hjk321

+0

@Kerooker Das PlayerExpChangeEvent hat keine .setcancelled() -Methode. – hjk321

Antwort

4

Nur die Einstellung des EXP des Spielers wird nicht für das gewünschte Verhalten ausreichen. Das Verhalten von Vanilla wird immer noch abgeschlossen, da Sie nicht ändern, wie das Ereignis EXP zum Player hinzufügen wird.

Derzeit Ihre Veranstaltung wird wie folgt arbeiten:

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.

Und PlayerExpGainEvent ist nicht stornierbar, so kann man es Zusatz von EXP nicht rückgängig gemacht werden.

Was Sie stattdessen tun können, ist stellen Sie die EXP das Ereignis wird 0 hinzufügen, daher nicht die EXP des Spielers nach Ihrer Interception zu ändern.

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

ich Ihre Veranstaltung zu einer hohen Priorität setzen würde empfehlen, so dass andere Ereignisse, die auf Erfahrungsgewinn abhängen werden nicht ausgelöst, wenn Sie den Betrag auf 0

Verwandte Themen