---@class DataManager local DataManager = { initByServer = false } function DataManager:init() self.cdCallBack = {} self._cacheManager = {} self:initManager("GameSettingData", "app/userdata/game_setting/game_setting_data") self:initManager("BattleData", "app/userdata/battle/battle_data") self:initManager("PlayerData", "app/userdata/player/player_data") self:initManager("BagData", "app/userdata/bag/bag_data") self:initManager("SummonData", "app/userdata/summon/summon_data") self:initManager("MallActData", "app/userdata/shop/mall_act_data") self:initManager("MallDailyData", "app/userdata/shop/mall_daily_data") self:initManager("MallRechargeData", "app/userdata/shop/mall_recharge_data") self:initManager("HeroData", "app/userdata/hero/hero_data") self:initManager("ShopData","app/userdata/shop/shop_data") self:initManager("MasteryData", "app/userdata/mastery/mastery_data") self:initManager("FightInfoData","app/userdata/fight_info/fight_info_data") self:initManager("MiningData","app/userdata/mining/mining_data") self:initManager("ChapterData", "app/userdata/chapter/chapter_data") self:initManager("ResearchData", "app/userdata/research/research_data") self:initManager("DungeonData", "app/userdata/dungeon/dungeon_data") self:initManager("ArenaData", "app/userdata/arena/arena_data") self:initManager("IdleData", "app/userdata/idle/idle_data") self:initManager("DailyTaskData", "app/userdata/activity/daily_task/daily_task_data") self:initManager("SevenDayData", "app/userdata/activity/seven_day/seven_day_data") self:initManager("TutorialTaskData", "app/userdata/tutorial/tutorial_task_data") self:initManager("TutorialData", "app/userdata/tutorial/tutorial_data") self:initManager("BlessingData", "app/userdata/blessing/blessing_data") self:initManager("AccelerationData", "app/userdata/acceleration/acceleration_data") self:initManager("BountyData", "app/userdata/bounty/bounty_data") self:initManager("CollectionData", "app/userdata/collection/collection_data") self:initManager("MailData", "app/userdata/mail/mail_data") self:initManager("FundChapterData", "app/userdata/fund/fund_chapter_data") if EDITOR_MODE then self:initDataForLazy() end end function DataManager:initManager(name, path) if self[name] then self._cacheManager[name] = self[name] end self[name] = require(path):create() end function DataManager:checkDataBind() local changeBindFunc = function(baseData, curBaseData) local data = baseData.data if data then local bindList = baseData.bindList if bindList then for fieldName, list in pairs(bindList) do for _, v in ipairs(list) do if v.binder.unBind then v.binder:unBind(baseData, fieldName) end if v.binder.bind then if baseData.data[fieldName] ~= curBaseData.data[fieldName] then v.binder:bind(curBaseData, fieldName, v.bindFunc, true) else v.binder:bind(curBaseData, fieldName, v.bindFunc) end end end end end baseData:clearBindAll() end end if self._cacheManager then -- 如果已经存在就检查一下绑定 for name, baseData in pairs(self._cacheManager) do if name == "BagData" then changeBindFunc(baseData.ItemData, self[name].ItemData) changeBindFunc(baseData.EquipData, self[name].EquipData) changeBindFunc(baseData.LegacyData, self[name].LegacyData) changeBindFunc(baseData.RuneData, self[name].RuneData) else changeBindFunc(baseData, self[name]) end end end end function DataManager:clear() self.initWithServer = false if self.cacheTimer then SchedulerManager:unscheduleGlobal(self.cacheTimer) self.cacheTimer = nil end self.cdCallBack = {} self.BattleData:clear() self.MasteryData:clear() self.DailyTaskData:clear() self.SevenDayData:clear() self.TutorialTaskData:clear() self.TutorialData:clear() self.AccelerationData:clear() self.BountyData:clear() self.MailData:clear() self.PlayerData:clear() ModuleManager.TaskManager:clear() end function DataManager:initWithServerData(data) self:init() Logger.logHighlight("------------------initWithServerData-----------------------") Logger.printTable(data) Time:setServerTimeZone(0) Time:updateServerTime(data.now_ts) Time:updateServerTimeToday(data.today_ts) self.initWithServer = true self.signInfo = data.sign self.todayFirstLogin = data.today_first_login self.serverAttr = data.attrs self.registerTs = (data.stat.register_ts or 0) // 1000 data.heros = { {cfg_id = 60001, lv = 4, curHid = 60001} } self.PlayerData:init(data.basic_info) self.BagData:init(data.bag) self.ResearchData:init(data.mine) self.FightInfoData:init(data.fight_info) self.ShopData:init(data.mall) self.SummonData:init(data.summon) self.MasteryData:initData(data.mastery) self.MiningData:init(data.mine) self.ChapterData:init(data.chapter) self.BattleData:init() self.DungeonData:init(data.dungeon_info) self.ArenaData:init(data.arena_info) self.DailyTaskData:init(data.task_daily, true) self.IdleData:init(data.idle) self.SevenDayData:init(data.seven_day, true) self.TutorialTaskData:init(data.task_tutor, true) self.BlessingData:init(data.blessing) self.CollectionData:init(data.collection) -- 属性计算 依赖部分数据初始化 self.HeroData:init(data.heros) self.TutorialData:init(data.guide) self.AccelerationData:init(data.acceleration) self.BountyData:init(data.battle_pass, true) self.FundChapterData:init(data.fund) -- self.MailData:init(data.mail_info) -- self._cacheManager["HeroData"]:init(data.items) --self.loginCount = data.loginCount or 1 --self.createPlayerTime = GFunc.formatTimeStep(data.infoData.registerTime or Time:getServerTime()) ----********** init start ******************* --self.crossDayTS = Time:getOverOfServerToday() self:scheduleGlobal() self:checkDataBind() -- 检查属性是否和服务器一致 GFunc.checkAttrWhitServerAttr() end function DataManager:onServerTimeBack(serverTime, loginCount, loginTime) self.loginCount = loginCount or 1 self.loginTime = loginTime or Time:getServerTime() self:scheduleGlobal() end -- 是否首次登录 function DataManager:getIsFirstLogin() local nowTime = Time:getServerTime() if self.registerTs%86400 == nowTime %8640 and self:getIsTodayFirstLogin() then return true end return false end function DataManager:getIsTodayFirstLogin() return self.todayFirstLogin or false end function DataManager:getIsInitWithServer() return self.initWithServer end function DataManager:getLoginTime() return self.loginTime or 0 end function DataManager:registerDataCd(dataName) if not dataName then return end for k, v in ipairs(self.cdCallBack) do if v == dataName then return end end table.insert(self.cdCallBack, dataName) end function DataManager:unregisterDataCd(dataName) if not dataName then return end for k, v in ipairs(self.cdCallBack) do if v == dataName then table.remove(self.cdCallBack, k) break end end end function DataManager:registerCrossDayFunc(bindId, func) if not bindId or not func then return end if not self.crossDayCallbacks then self.crossDayCallbacks = {} end for i, info in ipairs(self.crossDayCallbacks) do if info.bindId == bindId then self.crossDayCallbacks[i].func = func self.crossDayCallbacks[i].open = true return end end table.insert(self.crossDayCallbacks,{ bindId = bindId, func = func, open = true }) end function DataManager:unregisterCrossDayFunc(bindId) if not bindId then return end if not self.crossDayCallbacks then return end for i, info in ipairs(self.crossDayCallbacks) do if info.bindId == bindId then self.crossDayCallbacks[i].open = false return end end end function DataManager:scheduleGlobal() if self.cacheTimer then return end self.crossDayTS = Time:getOverOfServerToday() self.cacheTimer = SchedulerManager:scheduleGlobal(function (inter) for k, v in ipairs(self.cdCallBack) do if self[v] and self[v].updateCd then self[v]:updateCd() end end if Time:getServerTime() > self.crossDayTS then self.crossDayTS = Time:getOverOfServerToday() if self.crossDayCallbacks then for i, info in ipairs(self.crossDayCallbacks) do if info.func and info.open then info.func() end end end ModuleManager.TaskManager:addTaskProgress(GConst.TaskConst.TASK_TYPE.X_LOGIN_DAY) end end, 1) end -- 获取登录天数 function DataManager:getLoginCount() return self.loginCount or 1 end function DataManager:getSignInfo() local nowTime = Time:getServerTime() local lastSignTime = self.signInfo.latest_at // 1000 local todayBeginTime = nowTime - nowTime % 86400 local canSign = lastSignTime < todayBeginTime if not ModuleManager:getIsOpen(ModuleManager.MODULE_KEY.SIGNIN) then canSign = false end return self.signInfo.count or 0, canSign, self.hasSigned end function DataManager:setSignCount(count) self.hasSigned = true self.signInfo.count = count self.signInfo.latest_at = Time:getServerTime() * 1000 --Logger.logHighlight("签到成功次数:"..count) end function DataManager:resetSignInInfo() self.hasSigned = false end function DataManager:setLoginSuccess(success) self.loginSuccess = success end function DataManager:getLoginSuccess() return self.loginSuccess end -- 获取建号时间 function DataManager:getCreatePlayerTime() return self.createPlayerTime or Time:getServerTime() end -- 记录sync了多少次数据,如果以后游戏中要回到登录界面,则此值应当被清除 function DataManager:markSyncDataCount() if not self.syncDataCount then self.syncDataCount = 1 else self.syncDataCount = self.syncDataCount + 1 end end function DataManager:getSyncDataCount() return self.syncDataCount or 0 end function DataManager:needDealGm() return self:getSyncDataCount() >= 2 end ---方便检索,仅编辑器模式使用 function DataManager:initDataForLazy() ---@type BagData self.BagData = self:getManager("BagData") ---@type PlayerData self.PlayerData = self:getManager("PlayerData") ---@type SummonData self.SummonData = self:getManager("SummonData") ---@type MallActData self.MallActData = self:getManager("MallActData") ---@type MallDailyData self.MallDailyData = self:getManager("MallDailyData") ---@type MallRechargeData self.MallRechargeData = self:getManager("MallRechargeData") ---@type ShopData self.ShopData = self:getManager("ShopData") ---@type MiningData self.MiningData = self:getManager("MiningData") ---@type ResearchData self.ResearchData = self:getManager("ResearchData") ---@type DungeonData self.DungeonData = self:getManager("DungeonData") ---@type ChapterData self.ChapterData = self:getManager("ChapterData") ---@type ArenaData self.ArenaData = self:getManager("ArenaData") ---@type FundChapterData self.FundChapterData = self:getManager("FundChapterData") end function DataManager:getManager(name, path) if self[name] then return self[name] end self[name] = require(path):create() return self[name] end return DataManager