local SignData = class("SignData", require("DataBase")) local _toOpenUISign = 0; --0:哪个都不开启,1是开启UISign,2是开启UISign2,3是刷新签到界面 local _backPanelId = 0; --要返回得界面得id,签到界面可以返回主城和冒险两个界面 local _circle = 30; --签到周期,一个周期30天 local _getDataCb; --收到签到数据返回之后的回调 function SignData:ctor() self.data = {} end function SignData:RegisterNetEvents() --签到数据请求 ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_SIGN_UP_INFO_ACK, self.SCSignUpInfoAck, self) ManagerContainer.NetManager:NetRegister(ProtoMsgId.SC_SIGN_UP_ACK, self.ScSignUpAck, self) end function SignData:Clear() end function SignData:Destroy() if self.Clear then self:Clear() end self:UnRegisterNetEvents() end function SignData:UnRegisterNetEvents() ManagerContainer.NetManager:UnRegisterPbIdCallback(ProtoMsgId.SC_SIGN_UP_INFO_ACK) ManagerContainer.NetManager:UnRegisterPbIdCallback(ProtoMsgId.SC_SIGN_UP_ACK) end -------------------custom code start------------------ function SignData:ScSignUpAck(_data) ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.AFTER_SIGN_UP_ACK, _data); end --判断是否播放过签到动画 function SignData:PlayedAnimation() end --向服务器请求签到的消息,传进来的参数 0:哪个都不开启,1是开启UISign,2是开启UISign2,3是刷新签到界面 function SignData:CSSignUpReq(_openPanelIndex, _backlId, _cb) local _isUnLock = self:GetIsUnLocked(); if not _isUnLock then return; end _toOpenUISign = _openPanelIndex or 0; _backPanelId = _backlId or Enum.UIPageName.UIMainCity1; _getDataCb = _cb; ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_SIGN_UP_INFO_REQ); end --收到了请求的服务器的签到数据 function SignData:SCSignUpInfoAck(_data) local _isUnLock = self:GetIsUnLocked(); if not _isUnLock then return; end if _data.error ~= Enum.NetErrorCode.ERROR_OK then LogError("获取签到信息错误,错误码:", _data.error); return; end self:SendData(_data); end --分发签到数据 function SignData:SendData(_data) if _toOpenUISign == 0 then --哪个界面都不想打开,就是显示一下红点 local _canSign = self:JudgeCanSign(_data.sign_info.cur_sign_info.last_sign or 0); ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.RED_POINT_MGR_NOTICE, Enum.RPNotifyType.SignIn, _canSign); else --显示及一下红点 local _canSign = self:JudgeCanSign(_data.sign_info.cur_sign_info.last_sign or 0); ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.RED_POINT_MGR_NOTICE, Enum.RPNotifyType.SignIn, _canSign); --整理数据 self:TidyData(_data); if _toOpenUISign == 1 then --打开签到界面 self:OpenSign(_backPanelId); elseif _toOpenUISign == 2 and _canSign then --打开签到的动画界面,动画播放完之后才会开启签到界面,这波操作只有当可签到的时候才会走到 if ManagerContainer.LuaUIMgr:HasOpenPage(Enum.UIPageName.UIBattle) then ManagerContainer.LuaUIMgr:Hide(Enum.UIPageName.UIBattle); ManagerContainer.LuaUIMgr:Open(Enum.UIPageName.UISign2); end --记录播放时间到玩家本地数据 --local _timeSecond = ManagerContainer.LuaTimerMgr:GetTimeSecond(); --UnityEngine.PlayerPrefs.SetInt("SignInAnimationState", _timeSecond) elseif _toOpenUISign == 3 then --刷新签到页面 ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.REFRESH_SIGN_UP_ACK); end end end --开启签到界面 function SignData:OpenSign(_id) local _backId = Enum.UIPageName.UIMainCity1; if _id ~= 0 then _backId = _id end ManagerContainer.LuaUIMgr:Open(Enum.UIPageName.UISignIn, nil, _backPanelId) if _getDataCb then _getDataCb(); _getDataCb = nil; end end --判断是否可播放签到前的动画 function SignData:JudgeCanPlay() local _state = UnityEngine.PlayerPrefs.GetInt("SignInAnimationState") or 0; --这个存放的是上次签到的时间的转换成秒的数值 local _canSign = self:JudgeCanSign(_state); return _canSign; end --整理签到数据 function SignData:TidyData(_data) self._data = {}; --记录数据 self._data._curSignDay = _data.cur_sign_day or 1; --累计签到的下一天 self._data._curDay = _data.sign_info.cur_day or 0; --当前签到的累计天数 self._data._lastSign = 0; --上次签到的时间 if _data.sign_info.cur_sign_info then self._data._lastSign = _data.sign_info.cur_sign_info.last_sign; end --根据记录的数据进行整理 self._data._cfgData = {}; self._data._canSign = self:JudgeCanSign(self._data._lastSign); local _startDay, _endDay; local _fmod = math.fmod(self._data._curDay, _circle); if _fmod == 0 then if self._data._canSign then local _modf = math.modf(self._data._curSignDay / _circle); _startDay = _modf * _circle + 1; _endDay = (_modf + 1) * _circle; else local _modf = math.modf(self._data._curDay / _circle) - 1; _startDay = _modf * _circle + 1; _endDay = (_modf + 1) * _circle; end else local _modf = math.modf(self._data._curDay / _circle); _startDay = _modf * _circle + 1; _endDay = (_modf + 1) * _circle; end for _i = _startDay, _endDay do local _cfgData = ManagerContainer.CfgMgr:GetSignInCfg(_i); table.insert(self._data._cfgData, _cfgData); end end --获取已经整理好的数据 function SignData:GetData() return self._data; end --获取签到界面关闭的时候要返回的界面的id function SignData:GetBackPanelId() return _backPanelId; end --判断是否能签到 function SignData:JudgeCanSign(_lastSign) local _canSign = false; --当前是否能够签到 local _fiveOClickSecond = self:GetCurDayInFiveOClock(); local _lastFiveOClickSecond = _fiveOClickSecond - Constant.OneDaySeconds local _curTime = ManagerContainer.LuaTimerMgr:GetTimeSecond(); if _lastSign < _lastFiveOClickSecond then --上次签到在昨天五点之前 _canSign = true; else --上次签到在昨天五点之后 if _lastSign >= _fiveOClickSecond then --上次签到在今天五点之后,你就别签到了,已经签到过了 _canSign = false; else if _curTime > _fiveOClickSecond then --当前时间在今天五点之后 _canSign = true; end end end return _canSign; end --获取当天五点的时间戳,以秒为单位 function SignData:GetCurDayInFiveOClock() local _second = CommonUtil.GetTodayTimeStamp(5); return _second; end --获取当前签到功能是否解锁 function SignData:GetIsUnLocked() local _isUnLock = ManagerContainer.UIFuncUnlockMgr:GetFuncLockStatusById(30); return _isUnLock; end --获取周期 function SignData:GetCircle() return _circle; end --TODO:临时代码,以后删除,所有跟_keepDialogue相关的都要删除 function SignData:KeepDialogue() self._keepDialogue = true; end function SignData:GetKeepDialogue() return self._keepDialogue; end -------------------custom code end-------------------- return SignData