以下是一个使用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版本。

用Java写一个Bukkit1201 玩家对准箱子SHIFT+右键可以打开一个GUI界面如果箱子变成大箱子后则GUI界面只能打开一个

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

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