Search code examples
javaminecraftbukkit

How do you run an event after a advancement is completed?


I'm trying to code a plugin where the border follows a player and doubles everytime they get an advancement. The problem is I don't know how to detect when someone gets an advancement and keep it in the same class. Here is the current code.

survivalBorders.class

package sc458.survivalborders;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.WorldBorder;
import org.bukkit.entity.Player;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerAdvancementDoneEvent;
import org.bukkit.event.player.PlayerEvent;
import org.bukkit.plugin.java.JavaPlugin;

public class survivalBorders extends JavaPlugin {
    public void onEnable() {
        World world = Bukkit.getWorld("survival");
        WorldBorder border = world.getWorldBorder();
        double borderSize = border.getSize();

        while(true) {
            if(PlayerAdvancementDoneEvent) {
                border.setSize(borderSize*2);
            }
        }
    }
    public void onDisable() {

    }
}

MoveEvent.class

package sc458.survivalborders;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.WorldBorder;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerMoveEvent;

public class MoveEvent implements Listener {
    public void onMove(PlayerMoveEvent e) {
        Player p = e.getPlayer();
        World world = Bukkit.getWorld("survival");
        WorldBorder border = world.getWorldBorder();
        int locX = p.getLocation().getBlockX();
        int locZ = p.getLocation().getBlockZ();
        border.setCenter(locX, locZ);
    }
}

Solution

  • Try to call the PlayerMoveEvent with a Listener and then you can just everytime he moves (event gets triggered) -> set the border again. So basically when his coordinates change, the border will immediantly follow you.

    public class MoveEvent implements Listener {
       @EventHandler
       public void onMove(PlayerMoveEvent e) {
         Player p = e.getPlayer();
         WorldBorder border = world.getWorldBorder();
         int locX = p.getLocation().getBlockX();
         int locZ = p.getLocation().getBlockZ();
         border.setCenter(locX, locZ);
       }
    }