local DailySignin_Model = {} local private = {} local EventSystem = require('Event/EventSystem') local daily_signin_pb = require("Proto/daily_signin_pb") DailySignin_Model.SigninType = { DayType = daily_signin_pb.DayType, -- 每日签到 MonthType = daily_signin_pb.MonthType, -- 每月累计签到 RepairType = daily_signin_pb.repairType, -- 补签 AccRewardType = daily_signin_pb.AccRewardType -- 领取累签奖励 } ---------- start 辅助相关 start ---------- -- 维护领取数组 使用增量方式 减少重新赋值的扩容 function private.RefreshTb(tab, dataList) local index = 1 for _, v in ipairs(dataList) do tab[index] = v index = index + 1 end for i = #tab, index, -1 do table.remove(tab, i) end end ---------- end 辅助相关 end ---------- function DailySignin_Model.OnStartup() NetManager.RegisterMsgCB(MessageEnums.MessageDailySignin, private.DailySigninResponse) private.repairCount = 0 -- 当月补签次数 private.isRepair = false -- 当日是否进行过补签(一天最多可以补签一次) private.monthDaysCount = 0 -- 月积累签到次数 private.addUpDaysCount = 0 -- 总积累签到次数 private.canRepairTime = 0 -- 就是创建角色时间,之后大于这个时间才可以补签 private.dailyGifts = {} -- 当月每日签到过数组(如:1、2、5,表示当月第1、2、5天进行过签到) private.monthGifts = {} -- 当月累积签到奖励领取数组(如:2、7、10,表示领取过当月累积签到 2、7、10天的奖励) private.addUpGifts = {} -- 总累积签到奖励领取数组(如:80、90,表示领取过总累积签到80、90天的奖励) end ---------- start 协议相关 start ---------- function DailySignin_Model.DailySigninRequest(signinType, singinDay) local msg = daily_signin_pb.DailySigninReq() msg.signinTyp = signinType msg.signinDay = singinDay NetManager.SendMessage(MessageEnums.MessageDailySignin, msg) end function private.DailySigninResponse(msgResp) EventSystem.Dispatch(EventID.UI_WelfareBase_RefreshRedPoint) end function DailySignin_Model.SyncSigninInfo(signinInfo) private.repairCount = signinInfo.repairCount private.isRepair = signinInfo.isRepair private.monthDaysCount = signinInfo.monthDaysCount private.addUpDaysCount = signinInfo.addUpDaysCount -- 维护领取数组 使用增量方式 减少重新赋值的扩容 private.RefreshTb(private.dailyGifts, signinInfo.dailyGifts) private.RefreshTb(private.monthGifts, signinInfo.monthGifts) private.RefreshTb(private.addUpGifts, signinInfo.addUpGifts) table.sort(private.addUpGifts) -- 刷新界面 EventSystem.Dispatch(EventID.UI_DailySignin_Refresh) end function DailySignin_Model.SyncCanRepairTime(createTime) private.canRepairTime = createTime end ---------- end 协议相关 end ---------- ---------- Start 数据相关 Start ---------- -- 获取当月剩余可补签次数 & 当月最大可补签次数 function DailySignin_Model.GetRepairCount() return private.repairCount end function DailySignin_Model.GetAddUpDaysCount() return private.addUpDaysCount end function DailySignin_Model.GetMonthDaysCount() return private.monthDaysCount end -- 获取该天是否领取过奖励 function DailySignin_Model.IsReceiveDailyGiftsByDailyDay(dailyDay) for _, v in ipairs(private.dailyGifts) do if v == dailyDay then return true end end return false end -- 获取该月累计登陆天数是否领取过奖励 function DailySignin_Model.IsReceiveDailyGiftsByMonthlyDay(monthlyDay) for _, v in ipairs(private.monthGifts) do if v == monthlyDay then return true end end return false end -- 获取该总累积登录天数是否领取过奖励 function DailySignin_Model.IsReceiveAddUpGiftsByAccumulatedDay(accumulatedDay) for _, v in ipairs(private.addUpGifts) do if v == accumulatedDay then return true end end return false end -- 是否还可以补签次数(当月补签次数 < 最大补签次数 且当前未进行过补签 且活跃度 > 配置值 且时间大于可补签时间) function DailySignin_Model.CanRepairSignin(curYear, curMonth, curDay) if private.repairCount > 0 and not private.isRepair then local timestamp = UTL.Time.GetOsTimestamp(curYear, curMonth,curDay, 5, 0, 0) + UTL.Time.GetDisplayDiffLocalTimeZone() return (timestamp + UTL.Time.TotalSecondsOneDay) >= private.canRepairTime end return false end -- 总累计签到是否有可领取奖励 function DailySignin_Model.HasAddUpSigninReward() local addUpDaysJCount = DailySignin_Model.GetAddUpDaysCount() local lastUnloackReward = private.addUpGifts[#private.addUpGifts] or 0 for i, v in DataSheetManager.AccumulatedSignin:GetEnumerator() do local accmulatedDay = v.AccumulatedDay -- 先检查玩家是否把之前可以领取的奖励全部领取 if private.addUpGifts[i] and accmulatedDay < private.addUpGifts[i] then return true elseif accmulatedDay > lastUnloackReward and accmulatedDay <= addUpDaysJCount then -- 如果之前的奖励都领取完了再检查最新解锁的奖励是否领取 return true end end return false end -- 是否有可领取的奖励(显示红点) function DailySignin_Model.HaveCanReceiveReward() if MDL.Unlock.IsUnlock(MDL.Unlock.FunctionType.DailySignin) then local curMonth, curDay, curMonthMaxDay, curYear = UTL.Time.GetCurDay() -- 判断当天是否有可领取奖励 if not DailySignin_Model.IsReceiveDailyGiftsByDailyDay(curDay) then return true end -- 判断知否可补签 for i = 1, curDay - 1 do if not DailySignin_Model.IsReceiveDailyGiftsByDailyDay(i) then if DailySignin_Model.CanRepairSignin(curYear, curMonth, i) then return true end end end -- 判断当月累积签到时候有可领取奖励 local monthGiftsDataList = CTL.DailySignin.GetCurMonthGiftsDataList(curMonthMaxDay) for _, v in ipairs(monthGiftsDataList) do if v.MonthlyDay <= private.monthDaysCount then if not DailySignin_Model.IsReceiveDailyGiftsByMonthlyDay(v.MonthlyDay) then return true end end end --判断总累计签到是否有可领取奖励 if DailySignin_Model.HasAddUpSigninReward() then return true end end return false end ---------- end 数据相关 end ---------- return DailySignin_Model