local FriendRecharge_Model = {} local private = {} local EventSystem = require('Event/EventSystem') local friend_recharge_opt_pb = require('Proto/friend_recharge_opt_pb') local friend_recharge_info_pb = require('Proto/friend_recharge_info_pb') local FriendRechargePurchaseState = "FriendRechargePurchaseState" -- 购买类型 FriendRecharge_Model.RechargeType = { FRNone = friend_recharge_info_pb.FRNone, -- 未购买 FRTeam = friend_recharge_info_pb.FRTeam, -- 金兰 FRSingle = friend_recharge_info_pb.FRSingle, -- 独行 } -- 任务类型 FriendRecharge_Model.TaskType = { Team = 1, Solo = 2, Common = 3, } FriendRecharge_Model.FriendOptType = { FRInvite = friend_recharge_opt_pb.FRInvite, -- 邀请 FRCancelInvite = friend_recharge_opt_pb.FRCancelInvite, -- 取消邀请 FRAccept = friend_recharge_opt_pb.FRAccept, -- 接受邀请 FRRefuse = friend_recharge_opt_pb.FRRefuse, -- 拒绝邀请 FRDisband = friend_recharge_opt_pb.FRDisband, -- 解约 } function FriendRecharge_Model.OnStartup() NetManager.RegisterMsgCB(MessageEnums.MessageGetFriendRechargeFriendInfo, private.GetFriendRechargeFriendInfoResp) NetManager.RegisterMsgCB(MessageEnums.MessageFriendRechargeFriendOpt, private.FriendRechargeFriendOptResp) NetManager.RegisterMsgCB(MessageEnums.MessageSubOrderBuyLv, nil) NetManager.RegisterMsgCB(MessageEnums.MessageG2CPushFriendRechargeFriendOpt, private.G2CPushFriendRechargeFriendOpt) EventSystem.Regist(EventID.UI_OACommon_RedPointChanged, private.RefreshTaskRedPoint) EventSystem.Regist(EventID.UI_OACommon_TaskRewardClaim, private.RefreshTaskRedPoint) EventSystem.Regist(EventID.UI_OACommon_TaskInfoRefresh, private.RefreshTaskRedPoint) private.ActivityType = MDL.OperationActivity.ActivityType.FriendRecharge private.activityId = 0 private.FriendRechargeInfo = {} private.InvitationList = {} -- 我邀请的列表 private.InvitedList = {} -- 邀请我的列表 private.FriendRechargeFriendInfo = {} -- 好友金兰数据 private.FriendRechargeGuildInfo = {} -- 势力金兰数据 FriendRecharge_Model.ShowPurchaseView = false private.SelectRechargeType = FriendRecharge_Model.RechargeType.FRTeam private.oldLevel = 0 FriendRecharge_Model.SelectFriendRechargeTabIndex = 0 FriendRecharge_Model.SelectFriendRechargeTaskTabIndex = -1 private.IsInit = true end function FriendRecharge_Model.GetFriendRechargeActivityID() return private.activityId end ---@public 本期活动是否开启 function FriendRecharge_Model.GetCurFriendRechargeIsOpen() local activityInfo = MDL.OperationActivity.GetOperationActivityInfo(private.ActivityType, private.activityId) return activityInfo.endTime - UTL.Time.GetServerTimestamp() > 0 end -- 活动基础数据 function FriendRecharge_Model.GetRechargeBaseInfo() return private.FriendRechargeInfo[private.activityId] end -- 邀请我的列表 function FriendRecharge_Model.GetInvitedList() return private.InvitedList end -- 是否达成金兰 function FriendRecharge_Model.GetPurchaseState() return private.FriendRechargeInfo[private.activityId].isUnlock and private.FriendRechargeInfo[private.activityId].rechargeType ~= FriendRecharge_Model.RechargeType.FRNone end -- 当前选中的充值类型 function FriendRecharge_Model.SetRechargeType(rechargeType) private.SelectRechargeType = rechargeType end -- 当前选中的充值类型 function FriendRecharge_Model.GetRechargeType() if private.FriendRechargeInfo[private.activityId].completedAcid and private.FriendRechargeInfo[private.activityId].completedAcid ~= 0 then return private.SelectRechargeType else return FriendRecharge_Model.RechargeType.FRTeam end end -- 是否被我邀请 function FriendRecharge_Model.GetIsMyInvitationByAcid(acid) for k,v in ipairs(private.InvitationList) do if v == acid then return true end end return false end -- 是否邀请我 function FriendRecharge_Model.GetIsInvitationMyByAcid(acid) if private.InvitedList then for k,v in ipairs(private.InvitedList) do if v == acid then return true end end end return false end -- 是否被其他人邀请 function FriendRecharge_Model.GetIsOthersInvitationInfoByAcid(acid, type) for k,v in ipairs(private.FriendRechargeFriendInfo) do if v.acid == acid then return v end end for k,v in ipairs(private.FriendRechargeGuildInfo) do if v.acid == acid then return v end end return nil end -- 队友的playerInfo function FriendRecharge_Model.GetMemberPlayerInfo(acid) if string.isNilOrEmpty(acid) then return nil else local friendPlayerInfo = MDL.Friend.GetPlayerInListType(acid, MDL.Friend.ListType.Friend) if friendPlayerInfo then return friendPlayerInfo end if MDL.Guild.IsHasGuild() then local guildPlayerInfo = MDL.Guild.GetMemberData(acid) if guildPlayerInfo then return guildPlayerInfo.roleInfo end end end return nil end -- 队友的金兰数据 function FriendRecharge_Model.GetFriendRechargeInfo(acid) for k,v in ipairs(private.FriendRechargeFriendInfo) do if v.acid == acid then return v end end for k,v in ipairs(private.FriendRechargeGuildInfo) do if v.acid == acid then return v end end return nil end -- 等级奖励状态 function FriendRecharge_Model.GetLevelState(level) local curLevel = private.FriendRechargeInfo[private.activityId].friendRechargeLv if level > curLevel then return MDL.OACommon.ActivityTaskState.UnDone else for k,v in ipairs(private.FriendRechargeInfo[private.activityId].commonRewards) do if v == level then return MDL.OACommon.ActivityTaskState.Commit end end return MDL.OACommon.ActivityTaskState.Done end return MDL.OACommon.ActivityTaskState.UnDone end -- 当前可领奖励的索引 function FriendRecharge_Model.GetLevelRewardMoveIndex() local maxLevel = MDL.OperationActivity.FriendRechargeReward:GetDataLengthByActivityID(private.activityId) for level = 1, maxLevel do if FriendRecharge_Model.GetLevelState(level) == MDL.OACommon.ActivityTaskState.Done then return level - 1 end end return private.FriendRechargeInfo[private.activityId].friendRechargeLv end -- 本地记录是否弹出过 金兰弹窗 function FriendRecharge_Model.SetFriendRechargePurchaseState() PersistentData.PlayerData:Set(FriendRechargePurchaseState..private.activityId, true, true) FriendRecharge_Model.ShowPurchaseView = false end --region ---------------------- 红点 ------------------------------ function FriendRecharge_Model.SetPurchaseState(redPoint) if redPoint then CTL.RedPoint.AddRedPoint(CTL.RedPoint.RedPointKey.FriendRecharge_Invite) end end function private.RefreshLevelRedPoint() local maxLevel = MDL.OperationActivity.FriendRechargeReward:GetDataLengthByActivityID(private.activityId) for level = 1, maxLevel do if FriendRecharge_Model.GetLevelState(level) == MDL.OACommon.ActivityTaskState.Done and private.FriendRechargeInfo[private.activityId].isUnlock then CTL.RedPoint.AddRedPoint(CTL.RedPoint.RedPointKey.FriendRecharge_Level) return end end CTL.RedPoint.RemoveRedPoint(CTL.RedPoint.RedPointKey.FriendRecharge_Level) end function private.RefreshTaskRedPoint() CTL.RedPoint.RemoveRedPoint(CTL.RedPoint.RedPointKey.FriendRecharge_Task) if CTL.OACommon.IsHasTaskRedPoint(private.activityId) then CTL.RedPoint.AddRedPoint(CTL.RedPoint.RedPointKey.FriendRecharge_Task) return end end --endregion ---------------------- 红点 ------------------------------ --region ---------------------- 金兰邀约协议 ------------------------------ -- EnterWorld、PlayerChange 同步信息 function FriendRecharge_Model.SyncFriendRechargeInfo(msgResp) -- logging.error(LTAG.ERROR, "SyncFriendRechargeInfo", msgResp) if private.IsInit then -- 红点需要先请求任务数据,只有登录主动请求一次 MDL.OACommon.OATaskInfoReq(msgResp.activityId) private.IsInit = false end local oldInfo = private.FriendRechargeInfo[private.activityId] private.activityId = msgResp.activityId private.FriendRechargeInfo[private.activityId] = { friendRechargeLv = msgResp.friendRechargeLv, friendRechargeExp = msgResp.friendRechargeExp, isUnlock = msgResp.isUnlock, commonRewards = msgResp.commonRewards, completedAcid = msgResp.completedAcid, rechargeType = msgResp.rechargeType } private.SelectRechargeType = msgResp.rechargeType or FriendRecharge_Model.RechargeType.FRTeam private.RefreshLevelRedPoint() if msgResp.isUnlock and not PersistentData.PlayerData:Get(FriendRechargePurchaseState..private.activityId) then FriendRecharge_Model.ShowPurchaseView = true EventSystem.Dispatch(EventID.UI_FriendRecharger_Purchase) end if msgResp.friendRechargeLv > private.oldLevel then EventSystem.Dispatch(EventID.UI_FriendRecharger_LevelUp, private.oldLevel, msgResp.friendRechargeLv) end if oldInfo then if oldInfo.isUnlock ~= msgResp.isUnlock or oldInfo.completedAcid ~= msgResp.completedAcid or oldInfo.rechargeType ~= msgResp.rechargeType then EventSystem.Dispatch(EventID.UI_FriendRecharger_RefreshInviteList) end end private.oldLevel = msgResp.friendRechargeLv end -- 查看金兰之义 function FriendRecharge_Model.GetFriendRechargeFriendInfoRequest(activityID) local msg = friend_recharge_opt_pb.GetFriendRechargeFriendInfoReq() msg.activityId = activityID NetManager.SendMessage(MessageEnums.MessageGetFriendRechargeFriendInfo, msg) end function private.GetFriendRechargeFriendInfoResp(msgResp) --logging.error(LTAG.ERROR, "GetFriendRechargeFriendInfoResp", msgResp) if msgResp.activityId == private.activityId then private.FriendRechargeFriendInfo = msgResp.friendInfo -- 好友金兰数据 private.FriendRechargeGuildInfo = msgResp.guildInfo -- 势力金兰数据 private.InvitationList = {} for k,v in ipairs(msgResp.myInfo.invitationList) do table.insert(private.InvitationList, v) end private.InvitedList = {} for k,v in ipairs(msgResp.myInfo.invitedList) do table.insert(private.InvitedList, v) end EventSystem.Dispatch(EventID.UI_FriendRecharger_OpenView) end end -- 金兰之义好友操作 function FriendRecharge_Model.FriendRechargeFriendOptRequest(activityID, opt, targetId) local msg = friend_recharge_opt_pb.FriendRechargeFriendOptReq() msg.activityId = activityID msg.opt = opt msg.targetId = targetId NetManager.SendMessage(MessageEnums.MessageFriendRechargeFriendOpt, msg) end function private.FriendRechargeFriendOptResp(msgResp) --logging.error(LTAG.ERROR, "FriendRechargeFriendOptResp", msgResp) if msgResp.Resp.Code == 0 then if msgResp.activityId == private.activityId then private.InvitationList = {} private.InvitedList = {} for k,v in ipairs(msgResp.myInfo.invitationList) do table.insert(private.InvitationList, v) end for k,v in ipairs(msgResp.myInfo.invitedList) do table.insert(private.InvitedList, v) end for k,v in ipairs(private.FriendRechargeFriendInfo) do if v.acid == msgResp.targetInfo.acid then v.rechargeType = msgResp.targetInfo.rechargeType v.completedAcid = msgResp.targetInfo.completedAcid v.isUnlock = msgResp.targetInfo.isUnlock end end for k,v in ipairs(private.FriendRechargeGuildInfo) do if v.acid == msgResp.targetInfo.acid then v.rechargeType = msgResp.targetInfo.rechargeType v.completedAcid = msgResp.targetInfo.completedAcid v.isUnlock = msgResp.targetInfo.isUnlock end end if msgResp.opt == FriendRecharge_Model.FriendOptType.FRInvite then CTL.Tips.AddTipsMsg(Const_IDS.IDS_FriendRecharge_Invitation_Hint11) -- 邀请 elseif msgResp.opt == FriendRecharge_Model.FriendOptType.FRCancelInvite then CTL.Tips.AddTipsMsg(Const_IDS.IDS_FriendRecharge_Invitation_Hint2) -- 取消邀请 elseif msgResp.opt == FriendRecharge_Model.FriendOptType.FRAccept then CTL.Tips.AddTipsMsg(Const_IDS.IDS_FriendRecharge_Invitation_Hint14) -- 接受邀请 elseif msgResp.opt == FriendRecharge_Model.FriendOptType.FRRefuse then CTL.Tips.AddTipsMsg(Const_IDS.IDS_FriendRecharge_Invitation_Hint15) -- 拒绝邀请 elseif msgResp.opt == FriendRecharge_Model.FriendOptType.FRDisband then CTL.Tips.AddTipsMsg(Const_IDS.IDS_FriendRecharge_Invitation_Hint2) -- 解约 end EventSystem.Dispatch(EventID.UI_FriendRecharger_RefreshInviteList) end else if msgResp.myInfo then private.InvitedList = {} for k,v in ipairs(msgResp.myInfo.invitedList) do table.insert(private.InvitedList, v) end EventSystem.Dispatch(EventID.UI_FriendRecharger_RefreshInviteList) end end end -- 好友操作推送, 接受邀请/拒绝邀请 function private.G2CPushFriendRechargeFriendOpt(msgResp) --logging.error(LTAG.ERROR, "G2CPushFriendRechargeFriendOpt", msgResp) if msgResp.activityId == private.activityId then if msgResp.opt == FriendRecharge_Model.FriendOptType.FRInvite then -- 邀请我 table.insert(private.InvitedList, msgResp.acid) CTL.RedPoint.AddRedPoint(CTL.RedPoint.RedPointKey.FriendRecharge_Invite) elseif msgResp.opt == FriendRecharge_Model.FriendOptType.FRAccept then private.FriendRechargeInfo.completedAcid = msgResp.acid CTL.RedPoint.AddRedPoint(CTL.RedPoint.RedPointKey.FriendRecharge_Invited) UIManager.CloseView(Const_UI_Lua.UIEnum.UIFriendRechargeInviteList) elseif msgResp.opt == FriendRecharge_Model.FriendOptType.FRCancelInvite or msgResp.opt == FriendRecharge_Model.FriendOptType.FRRefuse then -- 取消对我的邀请 for k,v in ipairs(private.InvitedList) do if v == msgResp.acid then private.InvitedList[k] = nil end end for k,v in ipairs(private.InvitationList) do if v == msgResp.acid then private.InvitationList[k] = nil end end CTL.RedPoint.RemoveRedPoint(CTL.RedPoint.RedPointKey.FriendRecharge_Invited) elseif msgResp.opt == FriendRecharge_Model.FriendOptType.FRDisband then private.FriendRechargeInfo.completedAcid = nil end EventSystem.Dispatch(EventID.UI_FriendRecharger_RefreshInviteList) end end -- 购买等级 function FriendRecharge_Model.SubOrderBuyLvRequest(activityID, buyNum) local msg = friend_recharge_opt_pb.SubOrderBuyLvReq() msg.activityID = activityID msg.buyNum = buyNum private.oldLevel = private.FriendRechargeInfo[private.activityId].friendRechargeLv NetManager.SendMessage(MessageEnums.MessageSubOrderBuyLv, msg) end --endregion ---------------------- 金兰邀约协议 ------------------------------ return FriendRecharge_Model