找回密码
 register

QQ登录

只需一步,快速开始

查看: 1063|回复: 0

[游戏教程] 解决一处洛阳锁场景的BUG [XUEWU-BUG-644]

[复制链接]

[游戏教程] 解决一处洛阳锁场景的BUG [XUEWU-BUG-644]

[复制链接]
  • 打卡等级:热心大叔
  • 打卡总天数:94
  • 打卡月天数:17
  • 打卡总奖励:94
  • 最近打卡:2025-01-18 01:28:20
Waylee

主题

0

回帖

1万

积分

仙帝

积分
12364
Waylee 2023-6-23 15:37 | 显示全部楼层 |阅读模式

马上注册,查看网站隐藏内容!!

您需要 登录 才可以下载或查看,没有账号?register

×
日志信息:[XUEWU-BUG-644]
修复时间:2023-6-23 15:41:13
版本信息:新武侠世界
锁场景日志参考:

SceneID=0 Dead Lock! (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4490)
0: 986261 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4490)
1: 986261 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4490)
2: 986261 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4490)
3: 986261 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4490)
4: 986261 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4490)
5: 986260 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4490)
6: 986260 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4490)
7: 986260 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4490)
8: 986260 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4490)
9: 986260 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4490)
10: 986260 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4490)
11: 986260 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4490)
12: 1 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4490)
13: 1 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4490)
14: 1 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4500)
15: 1 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4500)
16: 0 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4500)
17: 0 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4500)
18: 0 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4500)
19: 0 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4500)
20: 0 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4500)
21: 0 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4500)
22: 1 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4500)
23: 1 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4500)
24: 1 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4500)
25: 1 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4500)
26: 1 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4500)
27: 986260 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4500)
28: 986260 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4500)
29: 986260 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4500)
30: 986260 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4500)
31: 986260 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4500)
32: 986260 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4500)
33: 986260 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4500)
34: 986260 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4500)
35: 986260 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4500)
36: 986260 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4500)
37: 986260 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4500)
38: 986260 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4500)
39: 986260 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4500)
40: 986260 (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4500)
End (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4500)
SceneID=128 Dead Lock! (-146646464)(T0=2023-6-23_15:24:54 T1=49615.4500)



这里锁场景是染色时装代码死循环导致:
出错函数:
--时装染色
function x900007_OnDressPaint_OK( sceneId, selfId, pos,isAuto)
        if not pos or pos < 0 or pos > BAG_DAOJU then
            return
        end
        local nItemId = GetItemTableIndexByIndex(sceneId, selfId, pos)
        local EquipPoint = GetItemEquipPoint( nItemId )
        local index = 0
        if EquipPoint ~= 2 then
                x900007_NotifyTip( sceneId, selfId, "#{SZPR_091023_17}" ) --只有时装才能进行这个操作
                return
        end
        local ret = LuaFnIsItemAvailable( sceneId, selfId, pos )
        if ret ~= 1 then
                x900007_NotifyTip( sceneId, selfId, "#{SZPR_091023_18}" ) --对不起,该时装不符合染色要求。                
                return
        end
        if LuaFnGetAvailableItemCount(sceneId, selfId, x900007_HongYaoShiItemID) < 1 then
                if isAuto == 1 then
                        x900007_NotifyTip( sceneId, selfId, "#{YJRS_140613_13}" ) --你的虹耀石数量不足,自动染色结束,请前往元宝商店购买虹耀石。        
                else
                        x900007_NotifyTip( sceneId, selfId, "#{SZPR_091023_21}" ) --你缺少虹耀石
                end
                return
        end
        local PlayerMoney = GetMoney( sceneId, selfId ) +  GetMoneyJZ(sceneId, selfId)
        if PlayerMoney < x900007_DressPraint then
                if isAuto == 1 then
                        x900007_NotifyTip( sceneId, selfId, "#{YJRS_140613_14}" ) --金钱不足,自动染色结束。
                else
                        x900007_NotifyTip( sceneId, selfId, "#{JXSQ_170804_44}" ) --金钱不足,无法进行开蒙神器育灵!
                end
                return
        end
        --重写的部分
        --nColorRate_Table 0 未染色时装 1 普通染色 2 高级染色 3 更高级染色[部分时装无] 4 稀有染色 5 绝版染色
        --1 100
        --2 50
        --3 30
        --4 1
        --5 0.1
        if x900007_DressColor[nItemId] == nil then
                x900007_NotifyTip( sceneId, selfId, "#{SZPR_091023_18}")
                return
        end
        local nNormalID,nHighID,nHighExID,nSepcialID,nBoomID = {},{},{},{},{}
        for i = 1,getn(x900007_DressColor[nItemId]) do
                local nColorRate = x900007_DressColor[nItemId][i][2]
                local nColorID = x900007_DressColor[nItemId][i][1]
                if nColorRate == 1 then
                        tinsert(nNormalID,nColorID)
                end
                if nColorRate == 2 then
                        tinsert(nHighID,nColorID)
                end
                if nColorRate == 3 then
                        tinsert(nHighExID,nColorID)
                end
                if nColorRate == 4 then
                        tinsert(nSepcialID,nColorID)
                end
                if nColorRate == 5 then
                        tinsert(nBoomID,nColorID)
                end
        end
        local nIsSepcial = 0
        local nRandom = random(1,1000)
        local nFinalTable = {}
        if nRandom <= 1000 then
                nFinalTable = nNormalID
        end
        if nRandom <= 300 then
                nFinalTable = nHighID
        end
        if nRandom <= 200 then
                nFinalTable = nHighExID
        end
        if nRandom <= 10 then
                nFinalTable = nSepcialID
        end
        if nRandom == 1 then
                nFinalTable = nBoomID
                nIsSepcial = 1
        end
        if getn(nFinalTable) == nil or getn(nFinalTable) == 0 then
                x900007_NotifyTip( sceneId, selfId, "染色失败!非常可惜哦!")
                return
        end

        local nFinalRandom = nFinalTable[random(1,getn(nFinalTable))]
        local _,nEquipData = LuaFnGetItemCreator( sceneId, selfId,pos)
        if nEquipData ~= nil then
                local nPos1,nPos2,nColorId = strfind(nEquipData,"&CO(%w%w%w%w)")
                if nPos1 ~= nil and nPos2 ~= nil then
                        if tonumber(nColorId) == nFinalRandom then
                                while nFinalRandom == tonumber(nColorId) do
                                        nFinalRandom = nFinalTable[random(1,getn(nFinalTable))]
                                end
                        end
                end
        end
        if nFinalRandom ~= 0 then
                nFinalRandom = format("%04d",nFinalRandom)
                local nColorCode = "&CO"..nFinalRandom
                local nFinalData = ""
                
                if nEquipData == nil then
                        nFinalData = nColorCode
                else
                        local nPos1,nPos2,nColorId = strfind(nEquipData,"&CO(%w%w%w%w)")
                        if nPos1 ~= nil and nPos2 ~= nil then
                                nFinalData = gsub(nEquipData,"&CO(%w%w%w%w)",nColorCode)
                        else
                                nFinalData = nColorCode..nEquipData
                        end
                end
                -- 异常处理,检查是否有多个&CO
                local _, count = gsub(nFinalData, "&CO", "")
                if count > 1 then
                        -- 如果有多个&CO,则将多余的&CO替换为""
                        nFinalData = gsub(nFinalData, "&CO", "", count-1)
                end
        
                LuaFnDelAvailableItem(sceneId,selfId,x900007_HongYaoShiItemID,1) --材料扣除
                LuaFnCostMoneyWithPriority(sceneId, selfId, x900007_DressPraint) --扣钱
                LuaFnSetItemCreator( sceneId, selfId,pos,nFinalData)
                LuaFnSendSpecificImpactToUnit(sceneId, selfId, selfId, selfId, 151, 0)
                x900007_NotifyTip( sceneId, selfId, "恭喜,时装染色成功")
                
                BeginUICommand( sceneId )
                        UICommand_AddInt( sceneId, nFinalRandom ) --visualid
                        UICommand_AddInt( sceneId, pos ) --pos
                        UICommand_AddInt( sceneId, nIsSepcial)
                EndUICommand( sceneId )
                DispatchUICommand( sceneId, selfId, 1000000011 )
                return
        end
end



在你的脚本中,你希望染出的颜色(nFinalRandom)和装备原有的颜色(nColorId)不同,为此你使用了一个while循环。然而,这种做法有一定的风险,因为如果nFinalTable中所有的元素都和nColorId相同,那么这个循环就会无限进行下去。
一个可能的解决方案是在循环中设置一个最大尝试次数,这样可以确保在不可能找到新颜色的情况下,循环能够终止。下面是一个改进后的代码片段:


local maxAttempts = getn(nFinalTable)
local attempts = 0
while nFinalRandom == tonumber(nColorId) and attempts < maxAttempts do
    nFinalRandom = nFinalTable[random(1,getn(nFinalTable))]
    attempts = attempts + 1
end


在这个代码中,maxAttempts是最大尝试次数,它被设置为nFinalTable的长度。这样,如果nFinalTable中所有的颜色都已经尝试过了,循环就会终止。



您需要登录后才可以回帖 登录 | register

本版积分规则

雪舞知识库 | 浙ICP备15015590号-1 | 萌ICP备20232229号|浙公网安备33048102000118号 |天天打卡

GMT+8, 2025-1-20 07:09 , Processed in 0.097212 second(s), 8 queries , Redis On.

Powered by XueWu Licensed

Copyright © Tencent Cloud.

快速回复 返回顶部 返回列表