用Java写一个Bukkit1201 玩家对准箱子SHIFT+右键可以打开一个GUI界面如果箱子变成大箱子后则GUI界面只能打开一个
以下是一个使用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版本。
原文地址: https://www.cveoy.top/t/topic/ifUv 著作权归作者所有。请勿转载和采集!