-- One-shot, read-only Beta Client lookup for the active CW route/stage rows. -- IDs passed to these lookups come from the active GridFightStage objects. do local state = _G.__gacCwActiveTableRows1 or { done = false } _G.__gacCwActiveTableRows1 = state if not state.done then local lines = {} local function add(s) if #lines < 24 then lines[#lines + 1] = tostring(s) end end local function getField(obj, name, flags) if not obj then return nil end local fs = obj:GetType():GetFields(flags) for i = 0, math.min(fs.Length - 1, 95) do if fs[i].Name == name then return fs[i]:GetValue(obj) end end end local function row(name, id, getter) local ok, value = pcall(getter) if not ok then add('ROW_ERROR ' .. name .. ' id=' .. tostring(id) .. ' ' .. tostring(value)); return end if not value then add('ROW_EMPTY ' .. name .. ' id=' .. tostring(id)); return end local encodedOK, encoded = pcall(function() return CS.Newtonsoft.Json.JsonConvert.SerializeObject(value) end) if encodedOK and #tostring(encoded) <= 20000 then add('ROW ' .. name .. ' id=' .. tostring(id) .. ' ' .. tostring(encoded)) elseif encodedOK then add('ROW_TOO_LARGE ' .. name .. ' id=' .. tostring(id) .. ' chars=' .. tostring(#tostring(encoded))) else add('ROW_SERIALIZE_ERROR ' .. name .. ' id=' .. tostring(id) .. ' ' .. tostring(encoded)) end end local ok, err = pcall(function() local flags = CS.System.Enum.ToObject(typeof(CS.System.Reflection.BindingFlags), 60) local session = CS.RPG.Client.GlobalVars.s_ModuleManager.GridFightModule.CurGameSession if not session then add('NO_SESSION'); return end local stage local fs = session:GetType():GetFields(flags) for i = 0, math.min(fs.Length - 1, 79) do if fs[i].FieldType.FullName == 'RPG.Client.GridFightStage' then stage = fs[i]:GetValue(session); break end end if not stage or not stage.CurNode then add('NO_ACTIVE_NODE'); return end local node = stage.CurNode local stageID, routeID = node.StageID, stage.RouteID local battle = getField(node, '_BattleNodeInfo', flags) local battleAuxA = getField(battle, 'INGNOGNLFBC', flags) local battleAuxB = getField(battle, 'LFGIGDPIGJE', flags) add('RUN route=' .. tostring(routeID) .. ' section=' .. tostring(stage.SectionID) .. ' stage=' .. tostring(stageID) .. ' level=' .. tostring(stage.CurMonsterLevel) .. ' battle_aux=' .. tostring(battleAuxA) .. ',' .. tostring(battleAuxB)) local routeNode = getField(node, '_RouteNode', flags) local nodeParam = getField(node, '_NodeParam', flags) local nodeInfo = getField(node, '_NodeInfo', flags) local displayRow = getField(node, '_DisplayRow', flags) local routeDisplay = getField(routeNode, 'NMABHKCOLCM', flags) local routeID = stage.RouteID row('StageExcelTable', stageID, function() return CS.RPG.GameCore.StageExcelTable.GetData(stageID) end) row('GridFightStageRouteConfigExcelTable', routeID, function() return CS.RPG.GameCore.GridFightStageRouteConfigExcelTable.GetData(routeID) end) row('GridFightEnemyDifficultyLvConfigExcelTable(candidate_aux_b)', battleAuxB, function() return CS.RPG.GameCore.GridFightEnemyDifficultyLvConfigExcelTable.GetData(battleAuxB) end) for label, obj in pairs({nodeParam = nodeParam, nodeInfo = nodeInfo, displayRow = displayRow, routeNode = routeNode, routeDisplay = routeDisplay}) do if obj then local encodedOK, encoded = pcall(function() return CS.Newtonsoft.Json.JsonConvert.SerializeObject(obj) end) if encodedOK and #tostring(encoded) <= 12000 then add('OBJECT ' .. label .. ' ' .. tostring(encoded)) else add('OBJECT ' .. label .. ' TYPE=' .. tostring(obj:GetType().FullName) .. ' serialize=' .. tostring(encoded)) end else add('OBJECT ' .. label .. ' nil') end end end) if not ok then add('ERROR ' .. tostring(err)) end CS.UnityEngine.Debug.Log('[GAC_CW_ACTIVE_TABLE_ROWS]\n' .. table.concat(lines, '\n')) state.done = true end end