业务说明:批量回收多余装备,返还金币/强化材料/洗练材料;支持单选、批量勾选;绑定装备可单独配置是否允许回收;回收产出按配表加权,支持多产出、保底。
1. 配置表 equip_recycle_cfg.csv
| 1 | 10001 | 10100 | 1 | 100 | [] | 白装回收 |
| 2 | 10001 | 10100 | 2 | 300 | [{"item":2001, "num":1}] | 蓝装回收 |
| 3 | 10001 | 10100 | 3 | 800 | [{"item":2001, "num":2},{"item":2002,"num":1}] | 紫装回收 |
reward_list:json数组,回收额外材料;quality=品质,0白1绿2蓝3紫4橙
2. proto3 协议
// 请求,批量回收装备uid列表
message C2S_EquipRecycle {
repeated uint64 equip_uid_list = 1;
}
message S2C_EquipRecycle {
int32 ret = 1;
uint64 get_gold = 2;
repeated ItemInfo items = 3;
}
message ItemInfo {
uint32 item_id = 1;
uint32 num = 2;
}
3. 错误码
local EquipErr = {
SUCCESS = 0,
ERR_EMPTY_LIST = -1, — 回收列表为空
ERR_EQUIP_NOT_EXIST = -2, — 装备不存在
ERR_CANNOT_RECYCLE = -3, — 该装备禁止回收(特殊装备、已穿戴)
ERR_IN_BAG_LOCK = -4, — 物品锁定
}
4. EquipMgr 核心函数
— 单装备获取回收奖励
function EquipMgr:GetEquipRecycleReward(equip)
local item_cfg = ConfigMgr:GetItemCfg(equip.item_id)
if not item_cfg then
return nil
end
local cfg = ConfigMgr:GetEquipRecycleCfg(item_cfg.quality)
if not cfg then
return nil
end
local reward = {
gold = cfg.recycle_gold,
items = {}
}
for _,v in ipairs(cfg.reward_list or {}) do
table.insert(reward.items, {item_id = v.item, num = v.num})
end
return reward
end
— 批量回收
function EquipMgr:EquipRecycle(player, uid_list)
if not uid_list or #uid_list <= 0 then
return EquipErr.ERR_EMPTY_LIST, 0, {}
end
local total_gold = 0
local total_items = {}
local recycle_uids = {}
for _,uid in ipairs(uid_list) do
local equip = player.bag_data[uid]
if not equip then
return EquipErr.ERR_EQUIP_NOT_EXIST, total_gold, total_items
end
local item_cfg = ConfigMgr:GetItemCfg(equip.item_id)
— 规则:已穿戴、标记不可回收、锁定装备拦截
if equip.is_wear or item_cfg.not_recycle == 1 or equip.lock == 1 then
return EquipErr.ERR_CANNOT_RECYCLE, total_gold, total_items
end
local reward = self:GetEquipRecycleReward(equip)
if not reward then
return EquipErr.ERR_CANNOT_RECYCLE, total_gold, total_items
end
total_gold = total_gold + reward.gold
— 合并材料
for _,it in ipairs(reward.items) do
local find = false
for _,t in ipairs(total_items) do
if t.item_id == it.item_id then
t.num = t.num + it.num
find = true
break
end
end
if not find then
table.insert(total_items, {item_id = it.item_id, num = it.num})
end
end
table.insert(recycle_uids, uid)
end
— 删除背包里回收掉的装备
for _,uid in ipairs(recycle_uids) do
BagMgr:DelItem(player, uid, "equip_recycle")
end
— 发金币
if total_gold > 0 then
PlayerMgr:AddGold(player, total_gold, "equip_recycle")
end
— 发材料
for _,it in ipairs(total_items) do
BagMgr:AddItem(player, it.item_id, it.num, "equip_recycle")
end
LogMgr:LogEquip(player.uid, "recycle", recycle_uids)
EventMgr:Fire(EventDefine.EQUIP_RECYCLE, player, recycle_uids, total_gold, total_items)
return EquipErr.SUCCESS, total_gold, total_items
end
5. 消息注册
function EquipMgr:RegisterMsg()
MsgMgr:Register("C2S_EquipRecycle", function(player, req)
local ret, gold, items = EquipMgr:EquipRecycle(player, req.equip_uid_list)
local resp = {
ret = ret,
get_gold = gold,
items = items
}
player:SendMsg("S2C_EquipRecycle", resp)
end)
end
6. GM指令
GMMgr:RegisterCmd("equip_recycle", {
perm = 3,
help = "/equip_recycle uid equip_uid1,equip_uid2",
func = function(player, args)
local tar_uid = tonumber(args[1])
local tar_player = PlayerMgr:GetPlayer(tar_uid)
local uid_list = {}
for i=2,#args do
table.insert(uid_list, tonumber(args[i]))
end
local ret, gold, items = EquipMgr:EquipRecycle(tar_player, uid_list)
local str = ret == 0 and string.format("回收成功,金币:%d", gold) or ("回收失败:"..ret)
return str
end
})




