379 lines
11 KiB
Lua
379 lines
11 KiB
Lua
---@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 |