以下是一个基于Bukkit 1.20和HolographicDisplays 3.0.3的Java代码示例,实现了当玩家Shift+右键箱子时,在该箱子上方显示HolographicDisplays文字。当两个箱子合并时,文字只显示一条,即合并后的箱子上方。

import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.plugin.java.JavaPlugin;

import com.gmail.filoghost.holographicdisplays.api.Hologram;
import com.gmail.filoghost.holographicdisplays.api.HologramsAPI;

public class ChestHologramPlugin extends JavaPlugin implements Listener {

    @Override
    public void onEnable() {
        // 注册事件监听器
        getServer().getPluginManager().registerEvents(this, this);
    }

    @EventHandler
    public void onPlayerInteract(PlayerInteractEvent event) {
        Player player = event.getPlayer();
        
        // 检查玩家是否按下了Shift和右键
        if (event.getAction() == Action.RIGHT_CLICK_BLOCK && player.isSneaking()) {
            Block clickedBlock = event.getClickedBlock();
            
            // 检查点击的方块是否为箱子
            if (clickedBlock.getType() == Material.CHEST || clickedBlock.getType() == Material.TRAPPED_CHEST) {
                // 获取箱子上方的方块
                Block aboveBlock = clickedBlock.getRelative(BlockFace.UP);
                
                // 获取或创建HolographicDisplays的Hologram
                Hologram hologram = HologramsAPI.createHologram(this, aboveBlock.getLocation().add(0.5, 1.0, 0.5));
                
                // 设置Hologram的文本
                hologram.clearLines();
                hologram.appendTextLine("这是一个箱子");
                
                // 将Hologram绑定到箱子上
                hologram.getVisibilityManager().setVisibleByDefault(false);
                hologram.getVisibilityManager().showTo(player);
                hologram.getVisibilityManager().setVisibleByDefault(true);
                hologram.getVisibilityManager().hideTo(player);
                
                // 将Hologram与箱子关联
                HologramUtil.linkHologramToBlock(hologram, clickedBlock);
            }
        }
    }

    @Override
    public void onDisable() {
        // 删除所有Hologram
        HologramsAPI.getHolograms(this).forEach(Hologram::delete);
    }
    
    public static class HologramUtil {
        // 将Hologram与方块关联
        public static void linkHologramToBlock(Hologram hologram, Block block) {
            String blockKey = getBlockKey(block);
            hologram.getMetadata().set("linkedBlock", blockKey);
        }
        
        // 获取方块的唯一标识
        public static String getBlockKey(Block block) {
            return block.getWorld().getName() + ";" + block.getX() + ";" + block.getY() + ";" + block.getZ();
        }
        
        // 获取与方块关联的Hologram
        public static Hologram getHologramLinkedToBlock(Block block) {
            String blockKey = getBlockKey(block);
            return HologramsAPI.getHolograms(plugin).stream()
                    .filter(hologram -> hologram.getMetadata().has("linkedBlock"))
                    .filter(hologram -> hologram.getMetadata().getString("linkedBlock").equals(blockKey))
                    .findFirst().orElse(null);
        }
    }
}

请确保已正确安装HolographicDisplays 3.0.3插件,并将插件文件放置在服务器的plugins文件夹中。然后,使用Java编译器编译并运行该插件。

用Java写一个Bukkit120基于HolographicDisplays303的 玩家Shift+右键箱子可以让该箱子上方显示hd文字两个箱子合并后文字只显示一条存在多个箱子

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

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