下面是一个使用Java编写的Bukkit插件,可以实现你所描述的功能:

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
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.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.java.JavaPlugin;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

public class ChestProtectionPlugin extends JavaPlugin implements Listener {

    private Map<Block, UUID> chestOwners;

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

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if (command.getName().equalsIgnoreCase("setowner")) {
            if (args.length < 2) {
                sender.sendMessage(ChatColor.RED + "用法: /setowner <玩家名字> <箱子坐标>");
                return true;
            }

            Player player = Bukkit.getPlayer(args[0]);
            if (player == null) {
                sender.sendMessage(ChatColor.RED + "找不到玩家 " + args[0]);
                return true;
            }

            Block block = getBlockFromArgs(sender, args[1]);
            if (block == null) {
                return true;
            }

            chestOwners.put(block, player.getUniqueId());
            sender.sendMessage(ChatColor.GREEN + "已将箱子的主人设置为玩家 " + player.getName());
            return true;
        }
        return false;
    }

    @EventHandler
    public void onPlayerInteract(PlayerInteractEvent event) {
        if (event.getAction() != Action.RIGHT_CLICK_BLOCK || !event.getPlayer().isSneaking()) {
            return;
        }

        Block block = event.getClickedBlock();
        if (block == null || block.getType() != Material.CHEST) {
            return;
        }

        Player player = event.getPlayer();
        UUID chestOwner = chestOwners.get(block);
        if (chestOwner == null || !chestOwner.equals(player.getUniqueId())) {
            event.setCancelled(true);
            player.sendMessage(ChatColor.RED + "你没有权限打开这个箱子!");
        } else {
            Inventory gui = createGui(player, block);
            player.openInventory(gui);
        }
    }

    @Override
    public void onDisable() {
        chestOwners.clear();
    }

    private Block getBlockFromArgs(CommandSender sender, String arg) {
        String[] parts = arg.split(",");
        if (parts.length != 3) {
            sender.sendMessage(ChatColor.RED + "无效的坐标格式!");
            return null;
        }

        int x, y, z;
        try {
            x = Integer.parseInt(parts[0]);
            y = Integer.parseInt(parts[1]);
            z = Integer.parseInt(parts[2]);
        } catch (NumberFormatException e) {
            sender.sendMessage(ChatColor.RED + "无效的坐标!");
            return null;
        }

        Block block = sender.getServer().getWorlds().get(0).getBlockAt(x, y, z);
        if (block.getType() != Material.CHEST) {
            sender.sendMessage(ChatColor.RED + "这个坐标不是箱子!");
            return null;
        }

        return block;
    }

    public static ItemStack createGuiItem(Material material, String name, String... lore) {
        ItemStack item = new ItemStack(material);
        ItemMeta meta = item.getItemMeta();
        meta.setDisplayName(ChatColor.RESET + name);
        meta.setLore(Arrays.asList(lore));
        item.setItemMeta(meta);
        return item;
    }

    public static Inventory createGui(Player player, Block block) {
        Inventory gui = Bukkit.createInventory(player, 9, "箱子设置");

        UUID chestOwner = chestOwners.get(block);
        String ownerName = (chestOwner != null) ? Bukkit.getPlayer(chestOwner).getName() : "无";

        gui.setItem(4, createGuiItem(Material.CHEST, "箱子主人", "当前主人: ' + ownerName));

        return gui;
    }
}

这段代码实现了一个Bukkit插件,当玩家按住SHIFT键并右键点击箱子时,如果玩家是箱子的主人,将打开一个GUI界面,可以设置箱子的主人。如果玩家不是箱子的主人,将禁止打开箱子并显示禁止消息。

要使用这个插件,你需要在一个Java开发环境中创建一个新的Java项目,将这段代码保存为一个名为ChestProtectionPlugin.java的文件,并将其添加到项目中。然后,使用适当的方法编译和打包插件,并将生成的JAR文件放入你的Bukkit服务器的插件文件夹中。

在游戏中,你可以使用/setowner <玩家名字> <箱子坐标>命令来设置箱子的主人。然后,当玩家按住SHIFT键并右键点击箱子时,将打开一个GUI界面,可以查看和修改箱子的主人。

使用说明:

  1. 将代码保存为ChestProtectionPlugin.java文件。
  2. 编译并打包插件,生成JAR文件。
  3. 将JAR文件放入Bukkit服务器的插件文件夹中。
  4. 在游戏中使用/setowner <玩家名字> <箱子坐标>命令设置箱子主人。
  5. 按住SHIFT键并右键点击箱子,打开GUI界面设置或查看主人信息。

注意事项:

  • 坐标格式为X,Y,Z
  • 确保插件已正确加载和启用。
  • 该插件仅提供基本功能,你可以根据需要进行扩展和修改。

示例:

  • 设置玩家Player1为坐标10,64,15处的箱子的主人:/setowner Player1 10,64,15
  • 玩家Player2尝试打开该箱子,但没有权限,会收到禁止消息。
  • 玩家Player1按住SHIFT键并右键点击该箱子,会打开GUI界面,可以查看和修改主人信息。

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

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