local GuildAllies_Model = {} local private = {} local EventSystem = require('Event/EventSystem') local guild_power_oper = require 'Proto/guild_power_oper_pb' local IsRequestGuildAlliesInfo = false local AllyOprMax = DataSheetManager.ConstData:GetDataByID("GuildAlliesDailyAllanceTimesForEachAllies").IntValue ----------------------- 系统函数 -------------------------- function GuildAllies_Model.OnStartup() NetManager.RegisterMsgCB(MessageEnums.MessageAcquireGuildPowerInfo, private.ResponseEnterGuildAllies) NetManager.RegisterMsgCB(MessageEnums.MessageAcquirePowerInfo, private.ResponseGuildAllies) NetManager.RegisterMsgCB(MessageEnums.MessageGuidePowerVisit, private.ResponseGuildAlliesVisit) NetManager.RegisterMsgCB(MessageEnums.MessageGuidePowerAdvise, private.ResponseGuildAlliesTalkAndParty) NetManager.RegisterMsgCB(MessageEnums.MessageGuidePowerUnion, private.ResponseGuildAlliesAlly) NetManager.RegisterMsgCB(MessageEnums.MessageSetGuildTarget, private.ResponseSetGuildTarget) private.guildAlliesShowList = {} -- 势力列表显示 private.myGuildAllies = nil -- 军团盟友缓存 private.myGuildAlliesCount = 0 -- 当前军团结盟势力个数 private.alliesTargetCount = 0 -- 当前军团设置势力目标个数 private.partyCount = 0 -- 当前势力可宴请操作次数 private.guildAlliesMembers = {} -- 当前势力成员排行 private.myGuildAlliesMember = nil -- 当前势力下本军团信息 private.myGuildAlliesMemberIndex = 0-- 当前势力下本军团排行 private.visitStrategyChosens = nil -- 当前势力策略选择标记 private.perfectStrategyID = 0 -- 当前势力策略完美ID private.changeGuildCount = 0 -- 切换势力次数 private.curShowPowerID = 0 -- 当前显示的势力ID private.selectPowerID = 0 end function GuildAllies_Model.OnShutdown() private.guildAlliesShowList = nil private.myGuildAllies = nil private.guildAlliesMembers = nil private.myGuildAlliesMember = nil private.visitStrategyChosens = nil end ----------------------------------------------------------- ----------------------- 配置表相关 ------------------------- function private.SortGuildAlliesByWeight(a, b) if a.isTarget and not b.isTarget then return true end if not a.isTarget and b.isTarget then return false end if MDL.GuildAllies.IsMyAllyByPowerId(a.ID) and not MDL.GuildAllies.IsMyAllyByPowerId(b.ID) then return true end if not MDL.GuildAllies.IsMyAllyByPowerId(a.ID) and MDL.GuildAllies.IsMyAllyByPowerId(b.ID) then return false end return a.Weight > b.Weight end function GuildAllies_Model.GetGuildAlliesShowList() if #private.guildAlliesShowList == 0 then for _, data in DataSheetManager.GuildAlliesData:GetEnumerator() do table.insert(private.guildAlliesShowList, setmetatable({isTarget = false, remainAllyOprCount = AllyOprMax, allyOprCDTimeStamp = 0, friendliness = 0}, {__index = data})) end end return private.guildAlliesShowList end function GuildAllies_Model.GetGuildAlliesByPos(pos) if not pos or pos == 0 then return nil end if private.guildAlliesShowList then return private.guildAlliesShowList[pos] end return nil end function GuildAllies_Model.GetGuildAlliesAndPosByID(id) if not id or id == 0 then return nil, -1 end for i, v in ipairs (private.guildAlliesShowList) do if v.ID == id then return v, i end end return nil, -1 end ----------------------------------------------------------- --------------------- 协议相关 --------------------------- -- 进入势力活动功能 function GuildAllies_Model.RequestEnterGuildAllies() local msg = guild_power_oper.AcquireGuildPowerInfoReq() NetManager.SendMessage(MessageEnums.MessageAcquireGuildPowerInfo, msg) end function private.ResponseEnterGuildAllies(msgResp) -- logging.log(LTAG.LOG, "ResponseEnterGuildAliies", msgResp) private.HandlePersonalGuildPowerInfo(msgResp.Resp.PlayerChange) private.HandleGuildPowerInfo(msgResp.guildPowerInfo) -- 势力显示排序 table.sort(private.guildAlliesShowList, private.SortGuildAlliesByWeight) EventSystem.Dispatch(EventID.UI_GuildAlliesMapView_Refresh) EventSystem.Dispatch(EventID.UI_GuildAlliesMainPanelNew_Refresh) EventSystem.Dispatch(EventID.UI_GuildAlliesMyAllies_Refresh) end -- 请求当前势力数据 function GuildAllies_Model.RequestGuildAllies(powerID, isRequest) IsRequestGuildAlliesInfo = isRequest local msg = guild_power_oper.AcquirePowerInfoReq() msg.powerID = powerID NetManager.SendMessage(MessageEnums.MessageAcquirePowerInfo, msg) end function private.ResponseGuildAllies(msgResp) -- logging.log(LTAG.LOG, "ResponseGuildAllies", msgResp) private.HandlePersonalGuildPowerInfo(msgResp.Resp.PlayerChange) private.HandlePowerInfo(msgResp.powerInfo) -- 查询显示的势力数据 if IsRequestGuildAlliesInfo then IsRequestGuildAlliesInfo = false private.curShowPowerID = msgResp.powerID for _, v in ipairs (private.guildAlliesShowList) do if v.ID == msgResp.powerID then EventSystem.Dispatch(EventID.UI_GuildAlliesMainPanelNew_Refresh, v) break end end else EventSystem.Dispatch(EventID.UI_GuildAlliesMainPanelNew_Refresh) end EventSystem.Dispatch(EventID.UI_GuildAlliesLobby_Refresh) EventSystem.Dispatch(EventID.UI_GuildAlliesBadBlood_Refresh) EventSystem.Dispatch(EventID.UI_GuildAlliesAlign_Refresh) end -- 势力游说 function GuildAllies_Model.RequestGuildAlliesVisit(times, powerID, visitType, visitStrategy) if not CTL.GuildAllies.IsUnlockOpr() then return end local msg = guild_power_oper.GuidePowerVisitReq() msg.powerID = powerID msg.visitType = visitType msg.visitStrategy = visitStrategy msg.times = tonumber(times) or 1 NetManager.SendMessage(MessageEnums.MessageGuidePowerVisit, msg) end function private.ResponseGuildAlliesVisit(msgResp) -- logging.log(LTAG.LOG, "ResponseGuildAlliesVisit", msgResp) private.HandlePersonalGuildPowerInfo(msgResp.Resp.PlayerChange) CTL.GuildAllies.TriggerVisitResult(msgResp) GuildAllies_Model.RequestEnterGuildAllies() GuildAllies_Model.RequestGuildAllies(msgResp.powerID) end -- 势力离间 function GuildAllies_Model.RequestGuildAlliesTalk(times, powerID, targetGuildID, type, allyIndex) if not CTL.GuildAllies.IsUnlockOpr() then return end local msg = guild_power_oper.GuidePowerAdviseReq() msg.powerID = powerID msg.targetGuildID = targetGuildID msg.type = type msg.allyIndex = allyIndex msg.times = tonumber(times) or 1 NetManager.SendMessage(MessageEnums.MessageGuidePowerAdvise, msg) end function private.ResponseGuildAlliesTalkAndParty(msgResp) -- logging.log(LTAG.LOG, "ResponseGuildAlliesTalkAndParty", msgResp) if msgResp.result == guild_power_oper.GPSuccess then private.HandlePersonalGuildPowerInfo(msgResp.Resp.PlayerChange) CTL.GuildAllies.TriggerTalkAndPartyResult(msgResp) else -- 提示操作失败 CTL.Tips.AddTipsMsg(Const_IDS["IDS_InfoChange"]) end GuildAllies_Model.RequestEnterGuildAllies() GuildAllies_Model.RequestGuildAllies(msgResp.powerID) end -- 势力结盟 function GuildAllies_Model.RequestGuildAlliesAlly(powerID, targetGuildID, allyIndex, successRatio) if not CTL.GuildAllies.IsUnlockOpr() then return end local msg = guild_power_oper.GuidePowerUnionReq() msg.type = guild_power_oper.Union msg.powerID = powerID msg.targetGuildID = targetGuildID msg.allyIndex = allyIndex msg.successRatio = successRatio NetManager.SendMessage(MessageEnums.MessageGuidePowerUnion, msg) end -- 势力解盟 function GuildAllies_Model.RequestCancelGuildAlliesAlly(powerID, allyIndex) if not CTL.GuildAllies.IsUnlockOpr() then return end local msg = guild_power_oper.GuidePowerUnionReq() msg.type = guild_power_oper.Cancel msg.powerID = powerID msg.targetGuildID = "0" msg.allyIndex = allyIndex msg.successRatio = 0 NetManager.SendMessage(MessageEnums.MessageGuidePowerUnion, msg) end function private.ResponseGuildAlliesAlly(msgResp) -- logging.log(LTAG.LOG, "ResponseGuildAlliesAlly", msgResp) private.HandlePersonalGuildPowerInfo(msgResp.Resp.PlayerChange) if msgResp.unionResult == guild_power_oper.GPSuccess or msgResp.unionResult == guild_power_oper.Fail then CTL.GuildAllies.TriggerAllyResult(msgResp) elseif msgResp.unionResult == guild_power_oper.UnionTime then local limitRemainTimeStr = UTL.Time.FormatTimeBySecondsToHour(msgResp.unionTime - UTL.Time.GetServerTimestamp()) CTL.Tips.AddTipsMsg(string.FormatByIdsId(Const_IDS["IDS_GamexMerge_GuildAlliesCDHint"], limitRemainTimeStr)) else -- 提示操作失败 CTL.Tips.AddTipsMsg(Const_IDS["IDS_InfoChange"]) end MDL.Guild.GetGuildInfoReq() GuildAllies_Model.RequestEnterGuildAllies() GuildAllies_Model.RequestGuildAllies(msgResp.powerID) end -- 设置势力目标 function GuildAllies_Model.RequestSetGuildTarget(powerID) if not CTL.GuildAllies.IsUnlockOpr() then return end local msg = guild_power_oper.SetGuildTargetReq() msg.oper = guild_power_oper.SetTarget msg.powerID = powerID NetManager.SendMessage(MessageEnums.MessageSetGuildTarget, msg) end function GuildAllies_Model.RequestCancelGuildTarget(powerID) if not CTL.GuildAllies.IsUnlockOpr() then return end local msg = guild_power_oper.SetGuildTargetReq() msg.oper = guild_power_oper.CancelTarget msg.powerID = powerID NetManager.SendMessage(MessageEnums.MessageSetGuildTarget, msg) end function private.ResponseSetGuildTarget(msgResp) -- logging.log(LTAG.LOG, "ResponseSetGuildTarget", msgResp) private.HandleSetGuildTargetResp(msgResp) GuildAllies_Model.RequestEnterGuildAllies() end ----------------------------------------------------------- -------------------- 缓存信息 -------------------------- function private.HandleGuildPowerInfo(guildPowerInfo) GuildAllies_Model.GetGuildAlliesShowList() if not guildPowerInfo then private.myGuildAllies = nil private.myGuildAlliesCount = 0 return end -- 处理军团盟友势力 private.myGuildAllies = guildPowerInfo.allyGuildInfo table.sort(private.myGuildAllies, private.SortMyGuildAlliesByWeight) private.myGuildAlliesCount = guildPowerInfo.allyGuildInfo and #guildPowerInfo.allyGuildInfo or 0 -- 处理军团选择目标势力 private.alliesTargetCount = guildPowerInfo.powerTarget and #guildPowerInfo.powerTarget or 0 local curUnionCnt = 0 local amountUnionCnt = guildPowerInfo.unionCnt and #guildPowerInfo.unionCnt or 0 local curFailInfo = 0 local amountFailInfo = guildPowerInfo.unionFailInfo and #guildPowerInfo.unionFailInfo or 0 for _, v in ipairs (private.guildAlliesShowList) do -- 设置选中目标 v.isTarget = false if private.alliesTargetCount > 0 then for _, powerID in ipairs (guildPowerInfo.powerTarget) do if powerID == v.ID then v.isTarget = true break end end end for _, guildInfo in ipairs (guildPowerInfo.allGuildInfo) do if guildInfo.powerID == v.ID then v.friendliness = guildInfo.friendliness break end end -- 设置剩余结盟次数remainAllyOprCount if curUnionCnt < amountUnionCnt then v.remainAllyOprCount = AllyOprMax for _, unionCnt in ipairs (guildPowerInfo.unionCnt) do if unionCnt.powerId == v.ID then curUnionCnt = curUnionCnt + 1 v.remainAllyOprCount = AllyOprMax - unionCnt.unionCnt break end end else v.remainAllyOprCount = AllyOprMax end -- 设置结盟CD时间 if curFailInfo < amountFailInfo then v.allyOprCDTimeStamp = 0 for _, failInfo in ipairs (guildPowerInfo.unionFailInfo) do if failInfo.powerId == v.ID then curFailInfo = curFailInfo + 1 v.allyOprCDTimeStamp = failInfo.time break end end else v.allyOprCDTimeStamp = 0 end end end function private.SortMyGuildAlliesByWeight(a, b) local aCfg = DataSheetManager.GuildAlliesData:GetDataByID(a.powerID) if not aCfg then return false end local bCfg = DataSheetManager.GuildAlliesData:GetDataByID(b.powerID) if not bCfg then return true end return aCfg.Weight > bCfg.Weight end function private.HandlePowerInfo(powerInfo) if not powerInfo then return end private.guildAlliesMembers = powerInfo.allyInfo private.myGuildAlliesMember = nil private.myGuildAlliesMemberIndex = 0 local myGuildId = MDL.Guild.GetMyGuildInfo().guildId for i, v in ipairs (private.guildAlliesMembers) do if v.guildId == myGuildId then private.myGuildAlliesMember = v private.myGuildAlliesMemberIndex = i break end end private.perfectStrategyID = powerInfo.goodStrategyID end function private.HandlePersonalGuildPowerInfo(playerChange) if not playerChange or not playerChange.personalGPowerInfo then return end private.partyCount = playerChange.personalGPowerInfo.entertainCount and playerChange.personalGPowerInfo.entertainCount or private.partyCount private.changeGuildCount = playerChange.personalGPowerInfo.changeGuildCount and playerChange.personalGPowerInfo.changeGuildCount or private.changeGuildCount private.visitStrategyChosens = (playerChange.personalGPowerInfo.isChosen and #playerChange.personalGPowerInfo.isChosen > 0) and playerChange.personalGPowerInfo.isChosen or private.visitStrategyChosens end -- 势力目标相关 function private.HandleSetGuildTargetResp(msgResp) if not msgResp then return end if msgResp.unionResult == guild_power_oper.GPSuccess then private.alliesTargetCount = msgResp.oper == guild_power_oper.SetTarget and private.alliesTargetCount + 1 or private.alliesTargetCount - 1 if msgResp.oper == guild_power_oper.SetTarget then CTL.Tips.AddTipsMsg(Const_IDS["IDS_GuildAllies_SetTargetSucceed"]) end for i, v in ipairs(private.guildAlliesShowList) do if v.ID == msgResp.powerID then v.isTarget = msgResp.oper == guild_power_oper.SetTarget -- 势力显示排序 table.sort(private.guildAlliesShowList, private.SortGuildAlliesByWeight) break end end -- 查找势力滑动项下标 for i, v in ipairs(private.guildAlliesShowList) do if v.ID == msgResp.powerID then EventSystem.Dispatch(EventID.UI_GuildAlliesMainPanelNew_RefreshTarget, i) break end end else -- 提示操作失败 CTL.Tips.AddTipsMsg(Const_IDS["IDS_InfoChange"]) end end function GuildAllies_Model.GetCurTargetCount() return private.alliesTargetCount end -- --获取首席盟友 function GuildAllies_Model.GetFirstSeat() if private.myGuildAllies ==nil then return nil end for _, v in pairs (private.myGuildAllies) do if v.allyIndex == 1 then local guildAllies = GuildAllies_Model.GetGuildAlliesAndPosByID(v.powerID) if guildAllies.BigAllies == 1 then return v end end end return nil end -- 势力结盟相关 function GuildAllies_Model.GetGuildAllyByPos(pos) if not pos or not private.myGuildAllies then return nil end if private.myGuildAllies[pos] then return private.myGuildAllies[pos] end return nil end function GuildAllies_Model.IsMyAllyByPowerId(powerID) if not powerID then return false end for _, v in pairs (private.myGuildAllies) do if v.powerID == powerID then return true end end return false end function GuildAllies_Model.GetCurAllyCount() return private.myGuildAlliesCount end function GuildAllies_Model.GetCurShowPowerID() return private.curShowPowerID end -- -- 势力成员相关 function GuildAllies_Model.GetGuildAllyMembers() return private.guildAlliesMembers end function GuildAllies_Model.GetGuildAllyMemberByPos(pos) if not pos then return nil end return private.guildAlliesMembers[pos] end function GuildAllies_Model.GetGuildAllyMemberByID(id) if not id then return nil end for _, v in ipairs (private.guildAlliesMembers) do if id == v.guildId then return v end end return nil end function GuildAllies_Model.GetMyGuildMember() return private.myGuildAlliesMember end function GuildAllies_Model.GetMyGuildMemberIndex() return private.myGuildAlliesMemberIndex end -- 刷新当前选中目标信息 function GuildAllies_Model.RefreshSelectTarget(selectTarget) if not selectTarget then return nil end return GuildAllies_Model.GetGuildAllyMemberByID(selectTarget.guildId) end -- -- 势力拜访相关 function GuildAllies_Model.GetVisitBtnIsChooseByPos(pos) if not pos then return false end if private.visitStrategyChosens then return private.visitStrategyChosens[pos] end return false end -- 是否为最佳策略 function GuildAllies_Model.GetVisitBtnIsPerfectByPos(pos) if not pos then return false end return private.perfectStrategyID == pos end --获取当前策略结果类型 function GuildAllies_Model.GetCurrentStrategyResultType(selectStrategyIndex) if not MDL.GuildAllies.GetVisitBtnIsChooseByPos(selectStrategyIndex) then return CTL.GuildAllies.StrategyResultType.Unknown else if MDL.GuildAllies.GetVisitBtnIsPerfectByPos(selectStrategyIndex) then return CTL.GuildAllies.StrategyResultType.Perfect else return CTL.GuildAllies.StrategyResultType.Normal end end end -- 势力宴请相关 function GuildAllies_Model.GetPartyCount() return private.partyCount end function GuildAllies_Model.GetPartyUnlockTriggers() local unlockCfg = DataSheetManager.FuctionUnlock:GetDataByFucID(405) return MDL.Unlock.IsComplete(unlockCfg.Unlock_Table[1].UnlockCondition, unlockCfg.Unlock_Table[1].UnlockConditionParam), unlockCfg.Unlock_Table[1].UnlockConditionParam end -- -- 获取当前玩家切换势力次数 function GuildAllies_Model.GetChangeGuildCount() return private.changeGuildCount end ---------------------------------------------------------- return GuildAllies_Model