RPGItemBinder.java v1.0
实现RPG物品可指令绑定、找回,物品显示绑定者并禁止他人使用
命令列表
- 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;
}
}
}
}
}