楼兰寻宝恶人谷无法参加修复教程
1. 问题
线上反馈新门派 恶人谷 不能进楼兰寻宝。
活动脚本:
/home/ubuntu/Game2/services/scripts/event/huodong/seek_treasure.lua
现场表现是:
- 队伍人数够
- 等级够
- 人都在附近
- 点进入时还是被拦
实际卡在成员检查这一段,不是副本创建失败,也不是活动时间问题。
2. 先看拦截点
入口流程在 OnDefaultEvent:
local ret, msg = self:CheckEnterCondition(selfId)
if ret == 0 then
self:RetDlg(selfId, targetId, msg)
return
end
if self:CheckMemberInfo(selfId, targetId) ~= 1 then
return
end
self:MakeCopyScene(selfId)
真正把人拦掉的是 CheckMemberInfo。
原代码里有这一句:
local bXinfaOK = self:CheckXinfaLevel(selfId,40)
这句放在队员循环里,本来就不对。循环里拿到了当前队员 objId,结果这里还是用的 selfId。
3. 这次实际查到的两个问题
3.1 队员检查写错对象了
原逻辑:
for i = 1, teamSize do
local objId = self:GetNearTeamMember(selfId, i)
local level = self:LuaFnGetLevel(objId)
local bXinfaOK = self:CheckXinfaLevel(selfId,40)
这里应该检查当前成员 objId,不是队长 selfId。
这个问题会带来一个结果:
- 队伍里谁能进,心法判断有时候看的是队长,不是当前成员
所以这个地方必须先改。
正确写法:
local bXinfaOK = self:CheckXinfaLevel(objId,40)
3.2 恶人谷心法编号不是旧公式那一套
CheckXinfaLevel 旧代码是按门派公式去推心法 ID:
function seek_treasure:CheckXinfaLevel(selfId, level)
local nMenpai = self:GetMenPai(selfId)
if nMenpai == 9 then return 0 end
for i = 1, 6 do
local xinfa
if nMenpai < 9 then
xinfa = nMenpai * 6 + i
else
xinfa = nMenpai * 6 + (i + 3)
end
local nXinfaLevel = self:LuaFnGetXinFaLevel(selfId, xinfa)
if nXinfaLevel < level then
return 0
end
end
return 1
end
这个公式对老门派基本能用,对曼陀也刚好没出问题,但对恶人谷不对。
恶人谷入门脚本在这里:
/home/ubuntu/Game2/services/scripts/obj/erengu/erengu_duanyanqing.lua
里面实际发的 6 本基础心法是:
self:LuaFnSetXinFaLevel(selfId,81,10)
self:LuaFnSetXinFaLevel(selfId,82,1)
self:LuaFnSetXinFaLevel(selfId,83,1)
self:LuaFnSetXinFaLevel(selfId,84,10)
self:LuaFnSetXinFaLevel(selfId,85,10)
self:LuaFnSetXinFaLevel(selfId,86,1)
也就是恶人谷实际基础心法是:
81 82 83 84 85 86
但旧公式按门派 ID 11 算出来的是:
70 71 72 73 74 75
所以恶人谷角色一进 CheckXinfaLevel,读的就是一组错误的心法 ID,自然会被判不满足。
这就是这次恶人谷进不了楼兰寻宝的主因。
4. 修改方法
本次只动 seek_treasure.lua,不去改副本其他逻辑。
4.1 先把队员检查对象改对
把:
local bXinfaOK = self:CheckXinfaLevel(selfId,40)
改成:
local bXinfaOK = self:CheckXinfaLevel(objId,40)
4.2 单独给恶人谷返回正确的心法列表
我这里没有继续硬套原公式,而是在这个脚本里补了一个门派心法列表函数:
function seek_treasure:GetMenpaiXinfaList(nMenpai)
if nMenpai == define.MENPAI_ATTRIBUTE.MATTRIBUTE_ERENGU then
return {81, 82, 83, 84, 85, 86}
end
local xinfaList = {}
for i = 1, 6 do
if nMenpai < 9 then
xinfaList[i] = nMenpai * 6 + i
else
xinfaList[i] = nMenpai * 6 + (i + 3)
end
end
return xinfaList
end
然后把 CheckXinfaLevel 改成按列表检查:
function seek_treasure:CheckXinfaLevel(selfId, level)
local nMenpai = self:GetMenPai(selfId)
if nMenpai == 9 then return 0 end
local xinfaList = self:GetMenpaiXinfaList(nMenpai)
for i = 1, #xinfaList do
local xinfa = xinfaList[i]
local nXinfaLevel = self:LuaFnGetXinFaLevel(selfId, xinfa)
if nXinfaLevel < level then
return 0
end
end
return 1
end
这样改的好处是:
- 恶人谷先单独兜住
- 老门派逻辑不动
- 改动面小,回归简单
5. 本次改动文件
/home/ubuntu/Game2/services/scripts/event/huodong/seek_treasure.lua
实际改了 3 处:
CheckMemberInfo 里把 selfId 改成 objId
- 新增
GetMenpaiXinfaList
CheckXinfaLevel 改成读取心法列表
6. 为什么曼陀没报这个问题
顺手说一下,避免后面排查时又绕回去。
曼陀门派虽然也是后加的,但它的基础心法正好是:
64 65 66 67 68 69
旧公式对门派 ID 10 算出来也正好是这组,所以它没暴露。
恶人谷不一样,恶人谷基础心法直接跳到了 81-86,所以旧代码一到这里就挂。
7. 回归怎么测
这个问题不用测太花,按下面几组过一下就够了。
7.1 恶人谷正常进场
条件:
- 三人组队
- 全员在附近
- 恶人谷角色等级
>= 75
- 恶人谷 6 本基础心法
81-86 都 >= 40
预期:
可以正常进入楼兰寻宝
7.2 恶人谷心法不足
把任意一本恶人谷基础心法降到 39。
预期:
成员检查里显示心法不满足,不能进入
7.3 混合队伍
找一个恶人谷队员,再找两个其他门派角色。
分别测两种情况:
- 队长达标,恶人谷队员不达标
- 队长不达标,恶人谷队员达标
预期:
谁不达标就拦谁,不再只跟着队长结果走
7.4 老门派回归
至少补测:
- 少林
- 逍遥
- 曼陀
预期:
原来能进的,改完后还是能进
8. 后面如果再碰到同类问题,优先搜这几种写法
如果别的活动也有“新门派进不去”“心法不足误判”这类问题,优先搜下面几种代码:
nMenpai * 6 + i
nMenpai * 6 + (i + 3)
local bXinfaOK = self:CheckXinfaLevel(selfId,...
重点查两件事:
- 心法 ID 是不是还在套老公式
- 队员循环里是不是又把成员写成队长了
9. 结论
这次不是楼兰寻宝活动本身有问题,是准入校验没跟上新门派。
根因就两条:
- 恶人谷基础心法实际是
81-86,旧公式算错了
- 成员检查里误用了
selfId
按上面的改法处理后,恶人谷已经可以正常参加楼兰寻宝。