以下是一个使用Java编写的Bukkit插件,用于在玩家长时间不移动时,在其头顶显示一个基于HolographicDisplays的文字消息。当玩家退出或插件被重载时,将删除此消息。

import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitRunnable;

public class AFKPlugin extends JavaPlugin {
    private HologramManager hologramManager;

    @Override
    public void onEnable() {
        hologramManager = new HologramManager();

        // 注册玩家移动事件监听器
        getServer().getPluginManager().registerEvents(new PlayerMoveListener(), this);

        // 注册插件重载事件监听器
        getServer().getPluginManager().registerEvents(new PluginReloadListener(), this);
    }

    @Override
    public void onDisable() {
        // 删除所有Hologram消息
        hologramManager.removeAllHolograms();
    }

    private class PlayerMoveListener implements org.bukkit.event.Listener {
        @org.bukkit.event.EventHandler
        public void onPlayerMove(org.bukkit.event.player.PlayerMoveEvent event) {
            Player player = event.getPlayer();

            // 检查玩家是否移动
            if (event.getFrom().getBlockX() != event.getTo().getBlockX()
                    || event.getFrom().getBlockY() != event.getTo().getBlockY()
                    || event.getFrom().getBlockZ() != event.getTo().getBlockZ()) {
                // 玩家移动,取消显示Hologram消息
                hologramManager.removeHologram(player);
            } else {
                // 玩家未移动,显示或更新Hologram消息
                hologramManager.showOrUpdateHologram(player, "AFK");
            }
        }
    }

    private class PluginReloadListener implements org.bukkit.event.Listener {
        @org.bukkit.event.EventHandler
        public void onPluginReload(org.bukkit.event.server.PluginEnableEvent event) {
            // 删除所有Hologram消息
            hologramManager.removeAllHolograms();
        }
    }

    private class HologramManager {
        private final ItemStack HOLOGRAM_ITEM;

        public HologramManager() {
            // 创建HolographicDisplays的物品
            HOLOGRAM_ITEM = new ItemStack(Material.PAPER);
            ItemMeta itemMeta = HOLOGRAM_ITEM.getItemMeta();
            itemMeta.setDisplayName("AFK");
            HOLOGRAM_ITEM.setItemMeta(itemMeta);
        }

        public void showOrUpdateHologram(Player player, String message) {
            // 获取玩家当前的Hologram
            Hologram hologram = HologramsAPI.createHologram(AFKPlugin.this, player.getLocation().add(0, 2, 0));
            hologram.appendItemLine(HOLOGRAM_ITEM);

            // 设置Hologram文本内容
            hologram.removeLine(0);
            hologram.insertTextLine(0, message);

            // 安排一个任务,在一定时间后取消显示Hologram消息
            new BukkitRunnable() {
                @Override
                public void run() {
                    if (hologram.isDeleted()) {
                        return;
                    }

                    hologram.delete();
                }
            }.runTaskLater(AFKPlugin.this, 200); // 200表示在10秒后取消显示Hologram消息
        }

        public void removeHologram(Player player) {
            // 获取玩家当前的Hologram
            Hologram hologram = HologramsAPI.createHologram(AFKPlugin.this, player.getLocation().add(0, 2, 0));

            // 删除Hologram
            if (!hologram.isDeleted()) {
                hologram.delete();
            }
        }

        public void removeAllHolograms() {
            // 删除所有Hologram
            for (Player player : Bukkit.getOnlinePlayers()) {
                removeHologram(player);
            }
        }
    }
}

请注意,以上代码使用了HolographicDisplays插件的API,因此需要确保已在项目中添加了HolographicDisplays的依赖库。此外,需要安装与Bukkit版本1.20.1兼容的HolographicDisplays插件

用Java写一个Bukkit1201 玩家长时间不移动 头顶显示一个基于HolographicDisplays的文字消息玩家退出插件重载的时候将删除此消息

原文地址: https://www.cveoy.top/t/topic/ioo7 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录