FriendBox.java v1.31
好友箱子支持好友申请由目标玩家用GUI点击同意/拒绝,无需手动命令
命令列表
- friendadd添加好友:/friendadd <玩家名>
package cn.yourdomain.friendplugin;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.OfflinePlayer;
import org.bukkit.Sound;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
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.*;
/**
* @pluginName FriendBox
* @author ScriptircEngine
* @version 1.31
* @description 好友箱子支持好友申请由目标玩家用GUI点击同意/拒绝,无需手动命令
* [command]friendadd|添加好友:/friendadd <玩家名>[/command]
* [Permission]friend.admin|管理插件所有功能的权限[/Permission]
*/
public class FriendBox extends JavaPlugin implements Listener {
// 模拟数据库:只关注申请流程,完整业务请自己补全数据持久化逻辑
private final Map<UUID, Set<UUID>> friendMap = new HashMap<>();
// 存储等待目标玩家处理的好友请求【key=目标玩家, value=申请人】
private final Map<UUID, UUID> pendingFriendRequests = new HashMap<>();
@Override
public void onEnable() {
getServer().getPluginManager().registerEvents(this, this);
getLogger().info("[FriendBox] 插件已启用");
}
@Override
public void onDisable() {
getLogger().info("[FriendBox] 插件已卸载");
}
// 判断两人是否好友
public boolean isFriend(UUID player, UUID friend) {
return friendMap.getOrDefault(player, new HashSet<>()).contains(friend);
}
// 添加为好友(双向)
public void addFriend(UUID player, UUID friend) {
friendMap.computeIfAbsent(player, k -> new HashSet<>()).add(friend);
friendMap.computeIfAbsent(friend, k -> new HashSet<>()).add(player);
}
// 删除好友
public void removeFriend(UUID player, UUID friend) {
friendMap.getOrDefault(player, new HashSet<>()).remove(friend);
friendMap.getOrDefault(friend, new HashSet<>()).remove(player);
}
/**
* 添加好友命令
*/
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
String cmd = command.getName().toLowerCase();
if (cmd.equals("friendadd")) {
if (!(sender instanceof Player)) {
sender.sendMessage("§c只有玩家可以添加好友!");
return true;
}
Player player = (Player) sender;
if (args.length < 1) {
player.sendMessage("§e用法: /friendadd <玩家名>");
return true;
}
String tgtName = args[0];
if (tgtName.equalsIgnoreCase(player.getName())) {
player.sendMessage("§c不能添加自己为好友!");
return true;
}
Player target = Bukkit.getPlayerExact(tgtName);
if (target == null) {
player.sendMessage("§c目标玩家不在线,需其上线后再申请或灵活处理。");
return true;
}
if (isFriend(player.getUniqueId(), target.getUniqueId())) {
player.sendMessage("§e你们已经是好友!");
return true;
}
// 发送好友申请GUI
sendFriendRequestWithGUI(player, target);
player.sendMessage("§a已发送好友申请给 " + target.getName() + ",请等待其通过GUI同意。");
return true;
}
return false;
}
/**
* 发送好友申请并弹出目标玩家的同意/拒绝GUI
*/
private void sendFriendRequestWithGUI(Player from, Player to) {
UUID toId = to.getUniqueId();
UUID fromId = from.getUniqueId();
// 保存等待同意
pendingFriendRequests.put(toId, fromId);
// 构造9格GUI:按钮0=同意、8=拒绝
Inventory inv = Bukkit.createInventory(to, 9, "§b好友申请处理");
inv.setItem(0, buildItem(Material.LIME_WOOL, "§a同意好友请求", Arrays.asList("§f点击同意来自 " + from.getName() + " 的申请")));
inv.setItem(8, buildItem(Material.RED_WOOL, "§c拒绝好友请求", Arrays.asList("§7点击拒绝并忽略本次申请")));
to.openInventory(inv);
to.sendMessage("§e收到 " + from.getName() + " 的好友申请,请在弹窗处理!");
to.playSound(to.getLocation(), Sound.UI_TOAST_CHALLENGE_COMPLETE, 1F, 1F);
}
/**
* 简单通用的构建物品工具方法
*/
private static ItemStack buildItem(Material mat, String name, List<String> lore) {
ItemStack item = new ItemStack(mat);
ItemMeta meta = item.getItemMeta();
meta.setDisplayName(name);
if (lore != null) meta.setLore(lore);
item.setItemMeta(meta);
return item;
}
@EventHandler
public void onInventoryClick(InventoryClickEvent event) {
HumanEntity entity = event.getWhoClicked();
if (!(entity instanceof Player)) return;
Player clicker = (Player) entity;
String title = event.getView().getTitle();
if (!title.equals("§b好友申请处理")) return; // 只处理我们定制的GUI
event.setCancelled(true);
ItemStack item = event.getCurrentItem();
if (item == null || !item.hasItemMeta()) return;
// 判断是同意还是拒绝
UUID clickerId = clicker.getUniqueId();
UUID fromId = pendingFriendRequests.remove(clickerId);
if (fromId == null) {
clicker.closeInventory();
clicker.sendMessage("§c无可处理的好友申请");
return;
}
Player fromPlayer = Bukkit.getPlayer(fromId);
if (item.getType() == Material.LIME_WOOL && item.getItemMeta().getDisplayName().contains("同意")) {
// 同意申请:加好友,提示双方
addFriend(clickerId, fromId);
clicker.sendMessage("§a你已同意 " + (fromPlayer != null ? fromPlayer.getName() : "对方") + " 的好友请求!");
if (fromPlayer != null) {
fromPlayer.sendMessage("§a你的好友申请被 " + clicker.getName() + " 同意啦,成为好朋友了!");
}
} else if (item.getType() == Material.RED_WOOL && item.getItemMeta().getDisplayName().contains("拒绝")) {
// 拒绝申请:通知双方
clicker.sendMessage("§7你已拒绝此好友申请");
if (fromPlayer != null) {
fromPlayer.sendMessage("§c你的好友申请被 " + clicker.getName() + " 拒绝了。");
}
}
clicker.closeInventory();
}
}