All source projects

MrUltimateLibrary Source

Standalone source project / 68 files

MrUltimateLibrary is the backbone of all my plugins; it offers features that facilitate plugin creation, maintenance, and updates.

java

MrUltimateLibrary/src/main/java/eu/mrneznamy/mrultimatelibrary/actionbar/MrLibActionBar.java

JAVA · Read-only source

package eu.mrneznamy.mrultimatelibrary.actionbar;

import eu.mrneznamy.mrultimatelibrary.scheduler.MrLibScheduler;
import eu.mrneznamy.mrultimatelibrary.utils.MrLibColors;


import net.md_5.bungee.api.ChatMessageType;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.function.Function;

/**
 * ActionBar display system
 */
public class MrLibActionBar {
    
    private final JavaPlugin plugin;
    private final Map<UUID, ActionBarTask> tasks = new HashMap<>();
    
    public MrLibActionBar(JavaPlugin plugin) {
        this.plugin = plugin;
    }
    
    /**
     * Show message once
     */
    public void show(Player player, String message) {
        clearTask(player);
        player.spigot().sendMessage(ChatMessageType.ACTION_BAR, 
            TextComponent.fromLegacyText(MrLibColors.colorize(message, player)));
    }
    
    /**
     * Show message for X ticks
     */
    public void showTicks(Player player, String message, long ticks) {
        clearTask(player);
        
        ActionBarTask task = new ActionBarTask(player, message, ticks, false);
        tasks.put(player.getUniqueId(), task);
        task.start(plugin);
    }
    
    /**
     * Show message for X seconds
     */
    public void showSeconds(Player player, String message, int seconds) {
        showTicks(player, message, seconds * 20L);
    }
    
    /**
     * Show dynamic message (updates every tick)
     */
    public void showDynamic(Player player, Function<Player, String> messageProvider, long durationTicks) {
        clearTask(player);
        
        ActionBarTask task = new ActionBarTask(player, messageProvider, durationTicks);
        tasks.put(player.getUniqueId(), task);
        task.start(plugin);
    }
    
    /**
     * Clear actionbar for player
     */
    public void clear(Player player) {
        clearTask(player);
        player.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(""));
    }
    
    /**
     * Clear all active actionbars
     */
    public void clearAll() {
        tasks.values().forEach(ActionBarTask::cancel);
        tasks.clear();
    }
    
    private void clearTask(Player player) {
        ActionBarTask task = tasks.remove(player.getUniqueId());
        if (task != null) {
            task.cancel();
        }
    }
    
    /**
     * Internal task handler
     */
    private class ActionBarTask implements Runnable {
        private final Player player;
        private String staticMessage;
        private Function<Player, String> dynamicMessage;
        private long remainingTicks;
        private MrLibScheduler.MrLibTask task;
        
        
        public ActionBarTask(Player player, String message, long ticks, boolean unused) {
            this.player = player;
            this.staticMessage = message;
            this.remainingTicks = ticks;
        }
        
        
        public ActionBarTask(Player player, Function<Player, String> messageProvider, long ticks) {
            this.player = player;
            this.dynamicMessage = messageProvider;
            this.remainingTicks = ticks;
        }
        
        public void start(JavaPlugin plugin) {
            task = MrLibScheduler.runTaskTimer(plugin, this, 0L, 1L);
        }
        
        @Override
        public void run() {
            if (!player.isOnline() || remainingTicks <= 0) {
                cancel();
                tasks.remove(player.getUniqueId());
                return;
            }
            
            String message = dynamicMessage != null 
                ? dynamicMessage.apply(player) 
                : staticMessage;
            
            player.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(MrLibColors.colorize(message, player)));
            
            remainingTicks--;
        }
        
        public void cancel() {
            if (task != null) {
                task.cancel();
            }
        }
    }
}

144 linesGNU GENERAL PUBLIC LICENSE · Version 3, 29 June 2007 · UTF-8 · Read only