Actionbar.java
AKL City ยท akl-city.git
Branches > main > 09ec71f > files / src / main / java / dev / grahp / aklcity / Actionbar.java
// Interface for displaying and updating a persistent actionbar for the player
package dev.grahp.aklcity;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.event.Listener;
import org.bukkit.event.EventHandler;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitTask;
import net.kyori.adventure.text.Component;
import java.util.Map;
import java.util.HashMap;
import java.util.UUID;
public class Actionbar implements Listener {
private final JavaPlugin plugin;
public Actionbar(JavaPlugin plugin) {
this.plugin = plugin;
}
// Join/leave to clean everything up!
static Map<UUID, Component> actionbars = new HashMap<>();
static Map<UUID, BukkitTask> tasks = new HashMap<>();
void start(Player p) {
var uuid = p.getUniqueId();
actionbars.put(uuid, Component.empty());
tasks.put(p.getUniqueId(),
// If player is offline, then stop this task but don't clear the actionbar?
Bukkit.getScheduler().runTaskTimer(plugin, () -> {
if (p.isOnline()) {
p.sendActionBar(actionbars.get(uuid));
} else {
clear(p);
}
}, 0L, 10L));
}
public void clear(Player p) {
var uuid = p.getUniqueId();
var task = tasks.remove(uuid);
if (task != null) {
task.cancel();
}
actionbars.remove(uuid);
}
public void set(Player p, Component c) {
var uuid = p.getUniqueId();
if (!(tasks.containsKey(uuid))) {
start(p);
}
}
@EventHandler
public void onQuit(PlayerQuitEvent e) {
clear(e.getPlayer());
}
}