以下是一个使用 Java 编写的 Bukkit 插件,可以实现玩家对准箱子按下 SHIFT+右键 时打开 GUI 界面。如果箱子变成大箱子后,GUI 界面只能打开一个。

import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.block.Chest;
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.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.java.JavaPlugin;

import java.util.HashMap;
import java.util.Map;

public class ChestGUIPlugin extends JavaPlugin implements Listener {
    private Map<Player, Inventory> playerInventories;

    @Override
    public void onEnable() {
        playerInventories = new HashMap<>();
        Bukkit.getPluginManager().registerEvents(this, this);
    }

    @EventHandler
    public void onPlayerInteract(PlayerInteractEvent event) {
        Player player = event.getPlayer();
        if (event.getAction() == Action.RIGHT_CLICK_BLOCK && player.isSneaking()) {
            Block block = event.getClickedBlock();
            if (block != null && block.getType() == Material.CHEST) {
                Chest chest = (Chest) block.getState();
                if (chest.getInventory().getSize() == 54) {
                    // Large chest
                    if (playerInventories.containsKey(player)) {
                        player.sendMessage('You can only open one GUI at a time.');
                        event.setCancelled(true);
                        return;
                    }
                    Inventory inventory = Bukkit.createInventory(null, 27, 'Chest GUI');
                    inventory.setContents(chest.getInventory().getContents());
                    playerInventories.put(player, inventory);
                    player.openInventory(inventory);
                    event.setCancelled(true);
                } else {
                    // Normal chest
                    InventoryHolder holder = chest.getInventory().getHolder();
                    if (holder instanceof BlockState) {
                        BlockState state = (BlockState) holder;
                        state.update(true, false);
                    }
                }
            }
        }
    }

    @EventHandler
    public void onInventoryClose(org.bukkit.event.inventory.InventoryCloseEvent event) {
        Player player = (Player) event.getPlayer();
        if (playerInventories.containsKey(player)) {
            Inventory inventory = playerInventories.get(player);
            Chest chest = (Chest) event.getInventory().getHolder();
            chest.getInventory().setContents(inventory.getContents());
            playerInventories.remove(player);
        }
    }
}

请确保在项目中包含 Bukkit API 的库文件,并将此代码保存为 ChestGUIPlugin.java。然后将其编译为插件 jar 文件,并将其放置在 Bukkit 服务器的插件目录中。

这个插件会监听玩家与方块的交互事件。当玩家按下 SHIFT 键并右键点击一个箱子时,如果箱子是大箱子,插件会创建一个 27 格的 GUI 界面,并将箱子的内容复制到 GUI 界面中。如果玩家已经打开了一个 GUI 界面,将无法打开另一个 GUI 界面。

当玩家关闭 GUI 界面时,插件会将 GUI 界面中的物品复制回原来的箱子中。

请注意,该插件仅适用于 Bukkit 1.20.1 版本。

Bukkit 1.20.1 玩家对准箱子 SHIFT+右键 打开 GUI 界面插件

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

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