欢迎光临
我们一直在努力

装备回收系统

业务说明:批量回收多余装备,返还金币/强化材料/洗练材料;支持单选、批量勾选;绑定装备可单独配置是否允许回收;回收产出按配表加权,支持多产出、保底。

1. 配置表 equip_recycle_cfg.csv

iditem_id_minitem_id_maxqualityrecycle_goldreward_listtip
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
})

7. 业务规则补充

  • 穿戴中的装备、锁定装备、特殊标记装备禁止回收;
  • 只回收背包内装备,仓库装备走单独仓库回收接口;
  • 批量回收原子性:任意一件校验失败,整批不回收;
  • 产出自动合并,下发给客户端展示收益预览;
  • 可扩展:回收预览接口(只算奖励不删除装备)。

  • 赞(0)
    未经允许不得转载:171主机测评 » 装备回收系统
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址