RPGItemBinder

RPGItemBinder.java v1.0
实现RPG物品可指令绑定、找回,物品显示绑定者并禁止他人使用
作者: ScriptIrc Engine

命令列表

  • bind手持物品绑定到自己
  • recall找回已绑定物品到背包
package com.mcsir.scriptirc.rpgitembind;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
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.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.persistence.PersistentDataType;
import org.bukkit.NamespacedKey;
import java.util.*;

/**
 * @pluginName RPGItemBinder
 * @author ScriptIrc Engine
 * @version 1.0
 * @description 实现RPG物品可指令绑定、找回,物品显示绑定者并禁止他人使用
 * [command]bind|手持物品绑定到自己[/command]
 * [command]recall|找回已绑定物品到背包[/command]
 */
public class RPGItemBinder extends JavaPlugin implements Listener {
    // 用于标记绑定信息的key
    private NamespacedKey bindUUIDKey;
    private NamespacedKey bindNameKey;
    // 玩家UUID与绑定物品唯一id的映射,用于找回
    private Map<UUID, ItemStack> playerBoundItems; // 内存缓存

    @Override
    public void onEnable() {
        bindUUIDKey = new NamespacedKey(this, "binder_uuid");
        bindNameKey = new NamespacedKey(this, "binder_name");
        playerBoundItems = new HashMap<>();
        getServer().getPluginManager().registerEvents(this, this);
        getLogger().info("RPGItemBinder loaded!");
    }

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

    // 绑定/找回 指令处理
    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if (!(sender instanceof Player)) {
            sender.sendMessage("该命令只能玩家执行");
            return true;
        }
        Player p = (Player) sender;
        String cmd = command.getName().toLowerCase();
        if (cmd.equals("bind")) {
            ItemStack inHand = p.getInventory().getItemInMainHand();
            if (inHand == null || !inHand.hasItemMeta()) {
                p.sendMessage(ChatColor.RED + "你必须手持物品才能绑定!");
                return true;
            }
            ItemMeta meta = inHand.getItemMeta();
            // 检查是否已绑定
            if (meta.getPersistentDataContainer().has(bindUUIDKey, PersistentDataType.STRING)) {
                p.sendMessage(ChatColor.YELLOW + "此物品已绑定:" + meta.getPersistentDataContainer().get(bindNameKey, PersistentDataType.STRING));
                return true;
            }
            // 执行绑定
            meta.getPersistentDataContainer().set(bindUUIDKey, PersistentDataType.STRING, p.getUniqueId().toString());
            meta.getPersistentDataContainer().set(bindNameKey, PersistentDataType.STRING, p.getName());
            // 修改物品lore,展示绑定者信息
            List<String> lore = meta.hasLore() ? meta.getLore() : new ArrayList<>();
            lore.add(ChatColor.GRAY + "绑定者: " + ChatColor.AQUA + p.getName());
            meta.setLore(lore);
            inHand.setItemMeta(meta);
            playerBoundItems.put(p.getUniqueId(), inHand.clone());
            p.sendMessage(ChatColor.GREEN + "已成功绑定物品并记录,可用/recall 指令找回!");
            return true;
        } else if (cmd.equals("recall")) {
            ItemStack bound = playerBoundItems.get(p.getUniqueId());
            if (bound == null || bound.getType().isAir()) {
                p.sendMessage(ChatColor.RED + "你还没有绑定记录!请先用/bind绑定物品。");
                return true;
            }
            // 判断背包是否有空位
            HashMap<Integer, ItemStack> left = p.getInventory().addItem(bound.clone());
            if (!left.isEmpty()) {
                p.sendMessage(ChatColor.RED + "你的背包没有空位,物品发放失败!");
                return true;
            }
            p.sendMessage(ChatColor.GREEN + "物品已找回到你的背包。");
            return true;
        }
        return false;
    }

    // 使用或交互事件阻止非本人使用已绑定物品
    @EventHandler
    public void onInteract(PlayerInteractEvent e) {
        Player p = e.getPlayer();
        ItemStack item = e.getItem();
        if (item == null || !item.hasItemMeta()) return;
        ItemMeta meta = item.getItemMeta();
        if (meta == null) return;
        if (meta.getPersistentDataContainer().has(bindUUIDKey, PersistentDataType.STRING)) {
            String uuid = meta.getPersistentDataContainer().get(bindUUIDKey, PersistentDataType.STRING);
            if (!uuid.equals(p.getUniqueId().toString())) {
                // 禁止操作
                e.setCancelled(true);
                p.sendMessage(ChatColor.RED + "此物品已被" + meta.getPersistentDataContainer().get(bindNameKey, PersistentDataType.STRING) + "绑定,你无法使用!");
            }
        }
    }

    // 玩家上线自动登记已绑定物品到映射(防止重启丢失,本插件只做内存,不做落盘持久化,若需持久请加配置保存)
    @EventHandler
    public void onJoin(PlayerJoinEvent e) {
        Player p = e.getPlayer();
        for (ItemStack is : p.getInventory().getContents()) {
            if (is == null || !is.hasItemMeta()) continue;
            ItemMeta meta = is.getItemMeta();
            if (meta == null) continue;
            if (meta.getPersistentDataContainer().has(bindUUIDKey, PersistentDataType.STRING)) {
                String uuid = meta.getPersistentDataContainer().get(bindUUIDKey, PersistentDataType.STRING);
                if (uuid.equals(p.getUniqueId().toString())) {
                    playerBoundItems.put(p.getUniqueId(), is.clone());
                    break;
                }
            }
        }
    }
}
上一篇: GiftPack下一篇: GiftPack

举报内容

意见反馈