Bukkit 1.12.2 VexView HUD 喇叭功能实现:防止消息重叠,支持多玩家共存
以下是一个使用 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 著作权归作者所有。请勿转载和采集!