FriendBox

FriendBox.java v1.31
好友箱子支持好友申请由目标玩家用GUI点击同意/拒绝,无需手动命令
作者: ScriptircEngine

命令列表

  • friendadd添加好友:/friendadd <玩家名>

权限列表

  • friend.admin管理插件所有功能的权限
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();
    }
}
上一篇: UIPosts下一篇: GiftPack

举报内容

意见反馈