以下是一个用Java编写的Bukkit插件示例代码,可以实现你描述的功能:\n\njava\nimport org.bukkit.Bukkit;\nimport org.bukkit.ChatColor;\nimport org.bukkit.Material;\nimport org.bukkit.block.Block;\nimport org.bukkit.block.BlockState;\nimport org.bukkit.block.Chest;\nimport org.bukkit.command.Command;\nimport org.bukkit.command.CommandSender;\nimport org.bukkit.entity.Player;\nimport org.bukkit.event.EventHandler;\nimport org.bukkit.event.Listener;\nimport org.bukkit.event.block.Action;\nimport org.bukkit.event.player.PlayerInteractEvent;\nimport org.bukkit.event.inventory.InventoryClickEvent;\nimport org.bukkit.inventory.Inventory;\nimport org.bukkit.inventory.ItemStack;\nimport org.bukkit.inventory.meta.ItemMeta;\nimport org.bukkit.plugin.java.JavaPlugin;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\npublic class ChestOwnershipPlugin extends JavaPlugin implements Listener {\n private Map<Block, String> chestOwners = new HashMap<>();\n\n @Override\n public void onEnable() {\n Bukkit.getPluginManager().registerEvents(this, this);\n }\n\n @Override\n public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {\n if (command.getName().equalsIgnoreCase("setowner")) {\n if (args.length < 2) {\n sender.sendMessage(ChatColor.RED + "正确用法: /setowner <玩家名字> <箱子坐标>");\n return true;\n }\n\n Player player = Bukkit.getPlayer(args[0]);\n if (player == null) {\n sender.sendMessage(ChatColor.RED + "玩家不在线");\n return true;\n }\n\n Block block = getPlayerTargetedChest(player);\n if (block == null) {\n sender.sendMessage(ChatColor.RED + "你必须对准一个箱子");\n return true;\n }\n\n chestOwners.put(block, player.getName());\n sender.sendMessage(ChatColor.GREEN + "箱子的主人设置为: " + player.getName());\n return true;\n }\n return false;\n }\n\n @EventHandler\n public void onPlayerInteract(PlayerInteractEvent event) {\n Player player = event.getPlayer();\n if (event.getAction() == Action.RIGHT_CLICK_BLOCK && player.isSneaking()) {\n Block block = event.getClickedBlock();\n if (block.getType() == Material.CHEST) {\n String owner = chestOwners.get(block);\n if (owner != null && !owner.equals(player.getName())) {\n event.setCancelled(true);\n player.sendMessage(ChatColor.RED + "你无权打开这个箱子!");\n return;\n }\n\n openGUI(player, block);\n }\n }\n }\n\n @EventHandler\n public void onInventoryClick(InventoryClickEvent event) {\n if (event.getView().getTitle().equals("箱子主人设置")) {\n event.setCancelled(true);\n\n Inventory inventory = event.getInventory();\n Player player = (Player) event.getWhoClicked();\n ItemStack clickedItem = event.getCurrentItem();\n\n if (clickedItem != null && clickedItem.getType() == Material.PLAYER_HEAD) {\n ItemMeta itemMeta = clickedItem.getItemMeta();\n if (itemMeta != null) {\n String owner = itemMeta.getDisplayName();\n Block block = getPlayerTargetedChest(player);\n\n if (block != null) {\n chestOwners.put(block, owner);\n player.sendMessage(ChatColor.GREEN + "箱子的主人设置为: " + owner);\n } else {\n player.sendMessage(ChatColor.RED + "你必须对准一个箱子");\n }\n }\n }\n\n player.closeInventory();\n }\n }\n\n private void openGUI(Player player, Block chestBlock) {\n Inventory inventory = Bukkit.createInventory(null, 9, "箱子主人设置");\n\n for (Player onlinePlayer : Bukkit.getOnlinePlayers()) {\n ItemStack playerHead = new ItemStack(Material.PLAYER_HEAD);\n ItemMeta itemMeta = playerHead.getItemMeta();\n if (itemMeta != null) {\n itemMeta.setDisplayName(onlinePlayer.getName());\n playerHead.setItemMeta(itemMeta);\n inventory.addItem(playerHead);\n }\n }\n\n player.openInventory(inventory);\n }\n\n private Block getPlayerTargetedChest(Player player) {\n Block targetBlock = player.getTargetBlock(null, 5);\n BlockState targetBlockState = targetBlock.getState();\n if (targetBlockState instanceof Chest) {\n return targetBlock;\n }\n return null;\n }\n}\n\n\n你可以将上述代码保存为一个Java文件,然后使用Maven或其他构建工具进行编译和构建,生成一个可在Bukkit 1.20服务器上运行的插件。在服务器上运行插件后,玩家可以使用/setowner命令来设置箱子的主人,然后在SNEAK(SHIFT) + 右键点击箱子时,如果不是箱子的主人,将无法打开箱子并收到一条禁止消息。当玩家SNEAK + 右键点击箱子时,还会弹出一个GUI界面,玩家可以从中选择箱子的新主人。


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

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