Actionbar.java

AKL City ยท akl-city.git

Branches > main > 3f7228d > 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());
  }
}