local ServerGameData = require "app/server/server_game_data" local ServerDataManager = {} function ServerDataManager:init() self.ServerFormationManager = require("app/server/manager/server_formation_manager") self.ServerHeroManager = require("app/server/manager/server_hero_manager") self.ServerChapterManager = require("app/server/manager/server_chapter_manager") self.ServerTutorialManager = require("app/server/manager/server_tutorial_manager") end function ServerDataManager:saveData() ServerGameData:saveData() end function ServerDataManager:randomReward(rewardsArr, count, callback) local maxWeight = 0 local reward for i = 1, count do reward = rewardsArr[i] maxWeight = maxWeight + reward.weight end local randomWeight if callback then randomWeight = callback(1, maxWeight) else randomWeight = math.random(1, maxWeight) end local idx for i = 1, count do if randomWeight <= rewardsArr[i].weight then idx = i break else randomWeight = randomWeight - rewardsArr[i].weight end end return idx end function ServerDataManager:dataOperate(behavior, params, callback) local opFunc = ServerDataManager.OP_FUNC[behavior] if opFunc then opFunc(params, function(result) if callback then callback(result) end end) -- TODO临时处理 ServerGameData:saveData() else Logger.logError("Undefined data operation function, please check :%s", behavior) end end function ServerDataManager:onSyncData(params, callback) -- 初始化本地数据 ServerGameData:initData() local data = ServerGameData:getData() if callback then callback(data) end end ServerDataManager.OP_FUNC = { [GConst.ServerDataConst.DATA_OP_BEHAVIOR.SYNC_DATA] = function (...) ServerDataManager:onSyncData(...) end, [GConst.ServerDataConst.DATA_OP_BEHAVIOR.UPDATE_FORMATION] = function (...) ServerDataManager.ServerFormationManager:updateFormation(...) end, [GConst.ServerDataConst.DATA_OP_BEHAVIOR.UPGRADE_HERO] = function (...) ServerDataManager.ServerHeroManager:onUpgradeHero(...) end, [GConst.ServerDataConst.DATA_OP_BEHAVIOR.END_FIGHT] = function(...) ServerDataManager.ServerChapterManager:endFight(...) end, [GConst.ServerDataConst.DATA_OP_BEHAVIOR.OPEN_CHAPTER_BOX] = function(...) ServerDataManager.ServerChapterManager:openBox(...) end, [GConst.ServerDataConst.DATA_OP_BEHAVIOR.MARK_GUIDE] = function(...) ServerDataManager.ServerTutorialManager:markGuide(...) end, } function ServerDataManager:dealGM(params, callback) if IS_PUBLISH then return end if not params or not params.args then return end local args = params.args if args[1] == "add_item" then local id = tonumber(args[2]) local count = tonumber(args[3]) if not id or not count then return end ServerGameData.BagData.ItemData:addItem(id, count) ServerGameData.BagData.ItemData:saveLocalData() if id == GConst.ItemConst.ITEM_ID_EXP then ServerGameData.PlayerData:addExp(count) end elseif args[1] == "add_items" then local cfg = ConfigManager:getConfig("item") local count = tonumber(args[2]) if not count then for k, v in pairs(cfg) do if k == GConst.ItemConst.ITEM_ID_GOLD then ServerGameData.BagData.ItemData:addItem(k, 99999999) else ServerGameData.BagData.ItemData:addItem(k, 2000) end if k == GConst.ItemConst.ITEM_ID_EXP then ServerGameData.PlayerData:addExp(1000) end end else for k, v in pairs(cfg) do ServerGameData.BagData:addItem(k, count) if k == GConst.ItemConst.ITEM_ID_EXP then ServerGameData.PlayerData:addExp(count) end end end elseif args[1] == "del_item" then local id = tonumber(args[2]) local count = tonumber(args[3]) if not id or not count then return end ServerGameData.BagData.ItemData:addItem(id, -count) if id == GConst.ItemConst.ITEM_ID_EXP then ServerGameData.PlayerData:addExp(-count) end elseif args[1] == "clear_item" then local items = ServerGameData.BagData.ItemData:getAllItems() for k, v in pairs(items) do v.count = 0 end elseif args[1] == "add_hero" then local id = tonumber(args[2]) if not id then return end local hero = ServerGameData.HeroData:getHeroByCfgId(id) if hero == nil or hero.lv <= 0 then local heroCfg = ConfigManager:getConfig("hero") local heroLvCfg = ConfigManager:getConfig("hero_level") local heroInfo = heroCfg[id] if heroInfo then local costKey = "cost_" .. heroInfo.qlt for k, v in ipairs(heroLvCfg) do if v[costKey] then -- 第一个有值的就是解锁所需的数量 ServerGameData.HeroData:addHero(id, k) break end end end end elseif args[1] == "pass_chapter" then local id = tonumber(args[2]) if not id then return end ServerGameData.ChapterData.data.maxChapterId = id end ServerGameData:saveData() if callback then callback() end end function ServerDataManager:getServerGameData() return ServerGameData end return ServerDataManager