用Java写一个Bukkit1201 玩家长时间不移动 头顶显示一个基于HolographicDisplays的文字消息玩家退出插件重载的时候将删除此消息
以下是一个使用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插件
原文地址: https://www.cveoy.top/t/topic/ioo7 著作权归作者所有。请勿转载和采集!