以下是一个使用 Java 编写的示例代码,实现了基于 VexView 2.5.6 的 HUD 喇叭功能,多个玩家使用喇叭发送文字时不重叠 Y 轴,并且喇叭可以共存的功能。请确保已经正确导入 VexView 库。

import lk.vexview.api.VexViewAPI;
import lk.vexview.hud.VexRectangle;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.HashMap;
import java.util.Map;

public class ExamplePlugin extends JavaPlugin {
    private Map<Player, Integer> playerHudIds = new HashMap<>();

    @Override
    public void onEnable() {
        // 注册 VexViewAPI 监听器
        Bukkit.getPluginManager().registerEvents(new VexViewAPIListener(), this);
    }

    // 通过 VexView 创建一个 HUD 喇叭
    public void createHud(Player player, String message) {
        int y = 0;
        int height = 15;
        int width = 100;
        int duration = 5; // 喇叭显示时间(秒)

        // 获取当前玩家喇叭的 Y 轴位置
        if (playerHudIds.containsKey(player)) {
            y = playerHudIds.get(player) + height;
        }

        // 创建 HUD 喇叭
        VexRectangle hud = new VexRectangle(0, y, width, height, ChatColor.translateAlternateColorCodes('&', message));
        playerHudIds.put(player, y);

        // 将 HUD 添加到玩家的 VexView 界面
        VexViewAPI.addHUD(player, hud);

        // 创建一个定时任务,在一定时间后移除 HUD 喇叭
        new BukkitRunnable() {
            @Override
            public void run() {
                VexViewAPI.removeHUD(player, hud);
                playerHudIds.remove(player);
            }
        }.runTaskLater(this, duration * 20); // 将时间转换为 20 ticks 为单位
    }

    // 通过命令发送喇叭消息
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if (command.getName().equalsIgnoreCase("horn")) {
            if (sender instanceof Player) {
                Player player = (Player) sender;
                if (args.length > 0) {
                    String message = String.join(" ", args);
                    createHud(player, message);
                    return true;
                } else {
                    player.sendMessage(ChatColor.RED + "请输入消息内容!");
                }
            } else {
                sender.sendMessage(ChatColor.RED + "该命令只能由玩家执行!");
            }
        }
        return false;
    }
}

// VexViewAPI 监听器,用于处理当玩家关闭 VexView 界面时移除 HUD 喇叭
class VexViewAPIListener implements Listener {
    @EventHandler
    public void onVexViewClose(VexViewCloseEvent event) {
        Player player = event.getPlayer();
        if (player != null) {
            // 移除玩家的所有 HUD 喇叭
            for (Map.Entry<Player, Integer> entry : playerHudIds.entrySet()) {
                Player p = entry.getKey();
                if (p.equals(player)) {
                    int hudId = entry.getValue();
                    VexViewAPI.removeHUD(player, hudId);
                }
            }
            // 清除玩家的 HUD 喇叭记录
            playerHudIds.remove(player);
        }
    }
}

通过在插件的onCommand方法中注册/horn命令,可以让玩家使用喇叭发送消息。喇叭的显示时间可以通过duration参数调整。每个玩家的喇叭消息会按照 Y 轴逐个显示,以避免重叠。当玩家关闭 VexView 界面时,HUD 喇叭会自动移除。

请注意,以上代码仅为示例,可能需要根据实际需要进行修改和调整。


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

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