local GuildEscort_Model = {} local private = {} local EventSystem = require('Event/EventSystem') local add_role_screen_pb = require("Proto/add_role_screen_pb") local escort_reqresp_pb = require("Proto/escort_reqresp_pb") local escort_push_pb = require("Proto/escort_push_pb") local escort_enum_pb = require("Proto/escort_enum_pb") local GuildEscortItemData = { [12011] = true, -- 低级辎重包裹 [12012] = true, -- 普通辎重包裹 [12013] = true, -- 高级辎重包裹 [12014] = true, -- 完美辎重包裹 } GuildEscort_Model.EscortType = { Transport = 1, CutOut = 2, } GuildEscort_Model.PrepareState = { None = 1, Agent = 2, Refused = 3, } GuildEscort_Model.EscortLogRobResult = { NotRob = 0, RobSucceed = 1, RobFail = 2, } GuildEscort_Model.AdvancedEscort = 3 GuildEscort_Model.PerfectEscort = 4 local function PairsSelfValue(tab, i) i = i + 1 local data = tab[i] if data then local selfAcid = BattleDataGetter.GetAcID() for _, v in ipairs(data.escortInfo.headers) do if v.acid == selfAcid then return i, data end end return PairsSelfValue(tab, i) -- 递归遍历下一个 else return nil end end function GuildEscort_Model.OnStartup() private.escortNum = 0 -- 最大可押镖次数 private.cutEscortNum = 0 -- 最大可劫镖次数 private.escortRefreshFree = 0 -- 最大可刷新次数 private.refreshCount = 0 -- 当天的刷新次数 private.residueEscortNum = 0 -- 剩余押镖次数 private.residueCutEscortNum = 0 -- 剩余劫镖次数 private.residueEscortRefreshFree = 0 -- 剩余免费刷新次数 private.curLevelEscort = 0 -- 当前镖车等级 注意 仅仅在接取任务之前有效,接去任务之后 服务器将刷新为 最初始状态 private.curMatchLevelEscort = 0 -- 当前匹配镖车等级 注意 仅仅匹配界面可以使用 private.escortPreparePersonalRewards = {} -- 准备界面奖励信息 private.escortRivals = {} -- 被劫镖过的人 private.escortGetRewardId = 0 -- 劫镖奖励包裹ID private.escortLogs = { [GuildEscort_Model.EscortType.Transport] = {}, [GuildEscort_Model.EscortType.CutOut] = {} } EventSystem.Regist(EventID.GuildEscort_MyCartIsFar, private.MyCartIsFar) EventSystem.Regist(EventID.SyncEscort_SendBattleResult, private.EscortSendBattleResult) NetManager.RegisterMsgCB(MessageEnums.MessageS2CDistanceWarning, private.SyncDistanceWarning) NetManager.RegisterMsgCB(MessageEnums.MessageS2CDistanceRecovery, private.SyncDistanceRecovery) NetManager.RegisterMsgCB(MessageEnums.MessageG2CGiveUpEscortTask, private.G2CGiveUpEscortTask) NetManager.RegisterMsgCB(MessageEnums.MessageCartRefresh, private.CartRefreshResponse) NetManager.RegisterMsgCB(MessageEnums.MessageEscortPrepareInfo, private.EscortPrepareInfoResponse) NetManager.RegisterMsgCB(MessageEnums.MessageEscortStatusCheck, private.EscortStatusCheckResponse) NetManager.RegisterMsgCB(MessageEnums.MessageEscortPreBattle, private.EscortPreBattleResponse) NetManager.RegisterMsgCB(MessageEnums.MessageEscortStart, private.EscortStartResponse) NetManager.RegisterMsgCB(MessageEnums.MessageGetEscortBattleLog, private.GetEscortBattleLogResponse) NetManager.RegisterMsgCB(MessageEnums.MessageG2CPushEscortResult, private.G2CPushEscortResult) NetManager.RegisterMsgCB(MessageEnums.MessageG2CPushEscortBeRobBattleInfo, private.G2CPushEscortBeRobBattleInfo) NetManager.RegisterMsgCB(MessageEnums.MessageG2CPushEscortBattleResult, private.G2CPushEscortBattleResult) NetManager.RegisterMsgCB(MessageEnums.MessageG2CCancelTeamConfirmPanel, private.G2CCancelTeamConfirmPanel) end ---------- start 协议相关 start ---------- -- 场景加载完毕,通知服务器 function GuildEscort_Model.EscortMapLoadComplete() local msg = add_role_screen_pb.C2SEscortMapLoadComplete() msg.SceneId = LevelManager.CurUniqueSceneID NetManager.SendMessage(MessageEnums.MessageC2SEscortMapLoadComplete,msg) end -- Start 同步押镖任务信息 function GuildEscort_Model.SyncEscortBase(msg) -- 押镖 private.escortNum = msg.escortFinishCountMx -- 最大次数 private.residueEscortNum = private.escortNum - msg.escortFinishCount -- 剩余次数 -- 劫镖 private.cutEscortNum = msg.robHighFinishCountMax -- 最大次数 private.residueCutEscortNum = private.cutEscortNum - msg.robHighFinishCount -- 剩余次数 CTL.GuildEscort.SetActivityRedPoint() end -- End 同步押镖任务信息 -- Start 同步镖车信息 function GuildEscort_Model.SyncEscortCart(msg) private.curLevelEscort = msg.rarity -- 镖车品质 private.refreshCount = msg.refreshCount -- 当天刷新次数 -- 这里需要根据开服天数重新计算一次当天最大免费次数 local serverDayCount = MDL.Player.GetServerDayCount() for _, v in DataSheetManager.SeverTimeConst:GetEnumerator() do if serverDayCount >= v.ID then private.escortRefreshFree = v.RefreshFreeNum -- 最大次数 end end private.residueEscortRefreshFree = private.escortRefreshFree - private.refreshCount -- 剩余次数 end -- End 同步镖车信息 -- Start 同步被劫镖过的人信息 function GuildEscort_Model.SyncEscortRivals(msg) private.escortRivals = {} -- 因为escortRivals是变化的 所以需要前清除一下 for i, v in ipairs(msg.acids) do private.escortRivals[v] = true -- true用作占位没有特殊意义 end end -- End 同步被劫镖过的人信息 -- Start 状态检查 -- 运镖时如果有队伍target传teamid,如果没有传自身acid function GuildEscort_Model.EscortStatusCheckRequest(escortType, callBack) CTL.GuildEscort.JudgeTeamLeader(function() if private.escortStatusCheckCallBack ~= nil then return end local msg = escort_reqresp_pb.EscortStatusCheckReq() msg.escortType = escortType msg.target = MDL.Team.GetTeamMemberNumbers() > 0 and MDL.Team.GetMyTeamId() or BattleDataGetter.GetAcID() private.escortStatusCheckCallBack = callBack NetManager.SendMessage(MessageEnums.MessageEscortStatusCheck, msg) end) end function private.EscortStatusCheckResponse(msgResp) if msgResp.Resp.Code == 0 then if private.escortStatusCheckCallBack ~= nil then private.escortStatusCheckCallBack() end end -- 无论成功与否都要清除 private.escortStatusCheckCallBack private.escortStatusCheckCallBack = nil end -- End 状态检查 -- Start 刷新镖车 function GuildEscort_Model.CartRefreshRequest(isPerfect) CTL.GuildEscort.JudgeTeamLeader(function() GuildEscort_Model.EscortStatusCheckRequest(GuildEscort_Model.EscortType.Transport, function() local msg = escort_reqresp_pb.CartRefreshReq() msg.isPerfect = isPerfect NetManager.SendMessage(MessageEnums.MessageCartRefresh, msg) end) end) end function private.CartRefreshResponse(msgResp) if msgResp.Resp.Code == 0 then private.curLevelEscort = msgResp.rarity private.refreshCount = msgResp.refreshCount private.residueEscortRefreshFree = private.escortRefreshFree - private.refreshCount EventSystem.Dispatch(EventID.GuildEscort_RefreshCart) if private.curLevelEscort == GuildEscort_Model.PerfectEscort then CTL.Tips.AddTipsMsg(UIUtils.GetLocalizedTxt(Const_IDS.IDS_Escort_GotTheBest)) end end end -- End 刷新镖车 -- Start 运镖准备面板 function GuildEscort_Model.EscortPrepareInfoRequest() CTL.GuildEscort.JudgeTeamLeader(function() local msg = escort_reqresp_pb.EscortPrepareInfoReq() msg.escortType = GuildEscort_Model.EscortType.Transport NetManager.SendMessage(MessageEnums.MessageEscortPrepareInfo, msg) end) end function private.EscortPrepareInfoResponse(msgResp) if msgResp.Resp.Code == 0 then if UIManager.IsViewOpened(Const_UI_Lua.UIEnum.UIGuildEscortStart) then UIManager.CloseView(Const_UI_Lua.UIEnum.UIGuildEscortStart) end if UIManager.IsViewOpened(Const_UI_Lua.UIEnum.UIGuildEscortMainPanel) then UIManager.CloseView(Const_UI_Lua.UIEnum.UIGuildEscortMainPanel) UIManager.RecoverView() end end end function GuildEscort_Model.SyncEscortPrepareInfo(msg) private.curMatchLevelEscort = msg.cartRarity for i, v in ipairs(msg.personalRewards) do private.escortPreparePersonalRewards[i] = v end for i = #private.escortPreparePersonalRewards, #msg.personalRewards + 1, -1 do private.escortPreparePersonalRewards[i] = nil end end -- End 运镖准备面板 -- Start 劫镖界面信息请求 function GuildEscort_Model.EscortPreBattleRequest(objectSceneBasic) if private.objectSceneBasic ~= nil then return end local msg = escort_reqresp_pb.EscortPreBattleReq() msg.targetAcid = objectSceneBasic.ownerAcid msg.quality = objectSceneBasic.cartInfo.quality private.objectSceneBasic = objectSceneBasic NetManager.SendMessage(MessageEnums.MessageEscortPreBattle, msg) end function private.EscortPreBattleResponse(msgResp) if msgResp.Resp.Code == 0 and private.objectSceneBasic ~= nil then local context = {ObjectSceneBasic = private.objectSceneBasic, CutEscort = msgResp} if UIManager.IsViewOpened(Const_UI_Lua.UIEnum.UIGuildEscortListPanel) then EventSystem.Dispatch(EventID.GuildEscort_RefreshEscortListPanel, context) else UIManager.OpenView(Const_UI_Lua.UIEnum.UIGuildEscortListPanel, context) end end -- 无论成功与否都要清除 private.objectSceneBasic private.objectSceneBasic = nil end -- End 劫镖界面信息请求 -- Start 劫镖开始 function GuildEscort_Model.EscortStartRequest(uniqId) CTL.GuildEscort.JudgeTeamLeader(function() local msg = escort_reqresp_pb.EscortStartReq() msg.escortType = GuildEscort_Model.EscortType.CutOut msg.uniqId = uniqId NetManager.SendMessage(MessageEnums.MessageEscortStart, msg) end) end function private.EscortStartResponse() end -- End 劫镖开始 -- Start 押镖战报 function GuildEscort_Model.GetEscortBattleLogRequest(escortType) local msg = escort_reqresp_pb.GetEscortBattleLogReq() msg.escortType = escortType NetManager.SendMessage(MessageEnums.MessageGetEscortBattleLog, msg) end function private.GetEscortBattleLogResponse(msgResp) if msgResp.Resp.Code == 0 then local escortLogList = private.escortLogs[msgResp.escortType] for i, v in ipairs(msgResp.logs) do escortLogList[i] = v end for i = #msgResp.logs + 1, #escortLogList do table.remove(escortLogList) end EventSystem.Dispatch(EventID.GuildEscort_RefreshReport) end end -- End 押镖战报 -- Start 放弃任务 function GuildEscort_Model.NoticeC2GGiveUpEscortTask() local msg = escort_push_pb.C2GGiveUpEscortTask() NetManager.SendMessage(MessageEnums.MessageC2GGiveUpEscortTask, msg) end function private.G2CGiveUpEscortTask(msg) if msg.acid == BattleDataGetter.GetAcID() then CTL.Tips.AddTipsMsg(UIUtils.GetLocalizedTxt(Const_IDS.IDS_Escort_HaveQuitEscort2)) else CTL.Tips.AddTipsMsg(string.FormatByIdsId(Const_IDS.IDS_Escort_HaveQuitEscort, msg.name)) end end -- End 放弃任务 -- Start 运镖结算 function private.G2CPushEscortResult(msg) if not UIManager.IsViewOpened(Const_UI_Lua.UIEnum.UIGuildEscortSuccess) then UIManager.OpenView(Const_UI_Lua.UIEnum.UIGuildEscortSuccess, {GuildIntegral = msg.guildScore, PersonalRewards = msg.personalRewards}) end end -- End 运镖结算 -- Start 劫镖进入战斗消息 function private.G2CPushEscortBeRobBattleInfo(msg) if not UIManager.IsViewOpened(Const_UI_Lua.UIEnum.UIGuildEscortFighting) then UIManager.OpenView(Const_UI_Lua.UIEnum.UIGuildEscortFighting, {BeRobBattleInfo = msg}) end end -- End 劫镖进入战斗消息 -- 发送劫镖战斗结算协议 function private.EscortSendBattleResult(msg) NetManager.SendMessage(MessageEnums.MessageC2GUploadEscortResult, msg) end -- Start 劫镖结算消息 function private.G2CPushEscortBattleResult(msg) if not UIManager.IsViewOpened(Const_UI_Lua.UIEnum.UIGuildEscortBattleOverPanel) then UIManager.OpenView(Const_UI_Lua.UIEnum.UIGuildEscortBattleOverPanel, {BattleResult = msg}) end -- 设置奖励道具 for i, v in ipairs(msg.personalRewards) do if GuildEscortItemData[v.ItemId] then private.escortGetRewardId = v.ItemId end end end -- End 劫镖结算消息 -- Start 关闭确认面板 function private.G2CCancelTeamConfirmPanel(msg) if UIManager.IsViewOpened(Const_UI_Lua.UIEnum.UIGuildEscortMatchPanel) then UIManager.CloseView(Const_UI_Lua.UIEnum.UIGuildEscortMatchPanel) end if msg.Code ~= 0 then NetManager.DealingWithMsgCode(msg.Code, msg.MsgOK) end end -- End 关闭确认面板 -- Start 距离过远 function private.NoticeC2SDistanceWarning(npcUniqId) local msg = add_role_screen_pb.C2SDistanceWarning() msg.npcUniqId = npcUniqId NetManager.SendMessage(MessageEnums.MessageC2SDistanceWarning, msg) end function private.SyncDistanceWarning(msg) local roleId = msg.roleId local timeLeft = msg.timeLeft if BattleDataGetter.GetAcID() == roleId then CTL.Tips.AddTipsMsg(string.FormatByIdsId(Const_IDS.IDS_Escort_DistanceWaring3, timeLeft)) else local name = MDL.Team.GetMemberNameById(roleId) CTL.Tips.AddTipsMsg(string.FormatByIdsId(Const_IDS.IDS_Escort_DistanceWaring1, name, timeLeft)) end end -- End 距离过远 -- Start 距离恢复 function private.NoticeC2SDistanceRecovery(npcUniqId) local msg = add_role_screen_pb.C2SDistanceRecovery() msg.npcUniqId = npcUniqId NetManager.SendMessage(MessageEnums.MessageC2SDistanceRecovery, msg) end function private.SyncDistanceRecovery(msg) end -- End 距离恢复 ---------- end 协议相关 end ---------- function GuildEscort_Model.GetEscortNumLimit() return private.residueEscortNum, private.escortNum end function GuildEscort_Model.GetCutEscortNumLimit() return private.residueCutEscortNum, private.cutEscortNum end function GuildEscort_Model.GetEscortRefreshFreeLimit() return private.residueEscortRefreshFree, private.escortRefreshFree, private.refreshCount end function GuildEscort_Model.GetCurLevelEscort() if CTL.GuildEscort.IsTransport() then return BattleDataGetter.GetGuildEscortQuality() else return private.curLevelEscort -- 这个值仅仅在接去任务之前生效 end end function GuildEscort_Model.GetCurMatchLevelEscort() return private.curMatchLevelEscort end function GuildEscort_Model.GetEscortPreparePersonalRewards() return ipairs(private.escortPreparePersonalRewards) end function GuildEscort_Model.GetEscortGetReward() return private.escortGetRewardId end function GuildEscort_Model.CancelEscortGetReward() private.escortGetRewardId = 0 end function GuildEscort_Model.GetEscortLogsIterator(escortType, isPersonal) if isPersonal then return PairsSelfValue, private.escortLogs[escortType], 0 else return ipairs(private.escortLogs[escortType]) end end -- 玩家N天内对当前玩家进行过劫镖,或为当前玩家的仇人 function GuildEscort_Model.IsShowPlayerRival(acid) if MDL.Friend.IsPlayerRival(acid) then return true end if private.escortRivals[acid] then return true end return false end -- 发送进入/退出镖车范围 function private.MyCartIsFar(npcUniqId, isFar) if isFar then private.NoticeC2SDistanceWarning(npcUniqId) else private.NoticeC2SDistanceRecovery(npcUniqId) end end --获取拍卖池奖励 function GuildEscort_Model.GetAuctionPoolRewardArray(fightThroneGuildRankData) local isWarZoneOpen = CTL.WarZone.IsWarZoneOpen() if isWarZoneOpen then if fightThroneGuildRankData.CrossSeverRewardPoolID > 0 then return MDL.GuildAuction.GetAuctionRewardsShowList(fightThroneGuildRankData.CrossSeverRewardPoolID, LuaConst.ActivityType.GuildEscort, true) end else if fightThroneGuildRankData.RewardPoolID > 0 then return MDL.GuildAuction.GetAuctionRewardsShowList(fightThroneGuildRankData.RewardPoolID, LuaConst.ActivityType.GuildEscort, true) end end return nil end return GuildEscort_Model