local CountryNightBoss_Model = {} local EventSystem = require('Event/EventSystem') local country_NightBoss_Def = require('Proto.country_boss_def_pb') local country_NightBoss_pb = require('Proto.country_boss_pb') local private = {} CountryNightBoss_Model.BossTotalCount = DataSheetManager.CountryNightBoss:GetDataCount() CountryNightBoss_Model.N_FACTOR = DataSheetManager.ConstData:GetDataByID("CountryBossHPLowLmt").IntValue CountryNightBoss_Model.DamageCountryFactor = DataSheetManager.ConstData:GetDataByID("CountryBossSameCountryAddition").IntValue CountryNightBoss_Model.DamageCountryLimitFactor = DataSheetManager.ConstData:GetDataByID("CountryBossEachBossDamageLowLmt").IntValue CountryNightBoss_Model.CountryBossRankType = { Damage = country_NightBoss_Def.damage, -- 伤害 Kill = country_NightBoss_Def.kill, -- 击杀 Help = country_NightBoss_Def.help, -- 助攻 FinalDmg = country_NightBoss_Def.finalDmg, -- 伤害 } CountryNightBoss_Model.BossState = { UnShown = country_NightBoss_Def.UnShown, -- 0 未生成 Fighting = country_NightBoss_Def.OnFight,-- 1 战斗中 TimeOut = country_NightBoss_Def.RunAway, -- 2 逃离时间到(未死) Die = country_NightBoss_Def.Defeated, -- 3 击败 } -- BOSS进度信息排序 local function SortByBossInfo(dataA, dataB) local isSameState = (dataA.bossState >= CountryNightBoss_Model.BossState.TimeOut and dataB.bossState >= CountryNightBoss_Model.BossState.TimeOut) or (dataA.bossState < CountryNightBoss_Model.BossState.TimeOut and dataB.bossState < CountryNightBoss_Model.BossState.TimeOut) if isSameState then return dataA.position < dataB.position else -- 存活的 return dataA.bossState < dataB.bossState end end function CountryNightBoss_Model.OnStartup() NetManager.RegisterMsgCB(MessageEnums.MessageS2CAllCountryBossInfo, private.S2CAllCountryBossInfo) NetManager.RegisterMsgCB(MessageEnums.MessageG2CAllCountryBossInfo, private.G2CAllCountryBossInfo) NetManager.RegisterMsgCB(MessageEnums.MessageG2CPushCountryBossMainPanelInfo, private.G2CPushCountryBossMainPanelInfo) NetManager.RegisterMsgCB(MessageEnums.MessageG2CPushEnterCountryNightBoss, private.SyncInBattleInfo) NetManager.RegisterMsgCB(MessageEnums.MessageG2CCountryBossBalanceMessage, private.G2CCountryBossBalanceMessage) NetManager.RegisterMsgCB(MessageEnums.MessageCountryBossBalanceInfo, private.CountryBossBalanceInfoResp) NetManager.RegisterMsgCB(MessageEnums.MessageCountryBossBalanceFinal, private.CountryBossBalanceFinalResp) NetManager.RegisterMsgCB(MessageEnums.MessageCountryBossFightDetail, private.CountryBossFightDetailResp) NetManager.RegisterMsgCB(MessageEnums.MessageCountryBossInfoConsist, private.CountryBossInfoConsistResp) NetManager.RegisterMsgCB(MessageEnums.MessageCountryBossEnterFight, private.CountryBossEnterFightResp) NetManager.RegisterMsgCB(MessageEnums.MessageCountryNightBossCallMember, private.CountryNightBossCallMemberResp) EventSystem.Regist(EventID.CountryEveningBoss_SendResult, private.SendCountryEveningBossBossResult) -- BossInfo数据结构 --[[{ -- bossId = bossInfo.bossId, -- position = bossInfo.position, -- bossHp = bossInfo.bossHp, -- bossState = bossInfo.bossState, -- sceneId = bossInfo.sceneId, -- lineId = bossInfo.lineId, -- startTime = bossInfo.startTime, -- totalBossHp = bossInfo.totalBossHp, -- CountryScoreRank = {}, -- PlayerScoreRank = {}, --}]] private.sceneInfoDic = {} --场景信息,key是元素ID,value是展示的npcInfo -- 晚间boss private.BossInfos = {} -- 单一boss所有玩家伤害排行信息 private.PlayerBossRankList = {} -- 实时国家伤害总榜 private.CountryDamageRankTotalList = {} -- 战斗结算结果数据缓存 private.BattleSummaryResult = {} -- 国家总榜奖励组成 private.CountryRewardConsistDic = { [1] = 0, [2] = 0, [3] = 0, [4] = 0, } -- 进入战斗同步基本信息 private.EnterBossBattleInitInfo = {} end --region ******************* 模块数据操作 ******************* function CountryNightBoss_Model.GetEnterBossBattleInitInfo() return private.EnterBossBattleInitInfo end ---@return list 获取战斗内右侧玩家伤害排行信息 function CountryNightBoss_Model.GetPlayerBossRankInfo() for _, v in ipairs(private.PlayerBossRankList) do if v.acid == BattleDataGetter.GetAcID() then return private.PlayerBossRankList, v end end return private.PlayerBossRankList, nil end function CountryNightBoss_Model.GetBossInfoDic() return private.BossInfos end --- Boss是否已结束 function CountryNightBoss_Model.IsBossOver(bossID) return private.BossInfos[bossID].bossState >= CountryNightBoss_Model.BossState.TimeOut end function CountryNightBoss_Model.GetBossInfoByID(bossID) return private.BossInfos[bossID] end function CountryNightBoss_Model.GetBossLeftTimeByID(bossID) local bossInfo = CountryNightBoss_Model.GetBossInfoByID(bossID) local leftTime = 0 if bossInfo and not CountryNightBoss_Model.IsBossOver(bossID) then local levelID = DataSheetManager.CountryNightBoss:GetDataByID(bossID).LevelID local duration = FP.tonumberV1(DataSheetManager.LevelInfoData:GetDataByLevelID(levelID).Timer) leftTime = bossInfo.startTime + duration - UTL.Time.GetServerTimestamp() end return leftTime <= 0 and 0 or leftTime end ---@return 返回国家伤害总伤害排行 function CountryNightBoss_Model.GetCountryTotalDamageRank() return private.CountryDamageRankTotalList end ---@return 获取排序后的boss列表 function CountryNightBoss_Model.GetSortedBossInfoList() local sortedList = {} for bossID, bossInfo in pairs(private.BossInfos) do table.insert(sortedList, bossInfo) end table.sort(sortedList, SortByBossInfo) return sortedList end --- 获取该元素下各个Npc的状态信息 function CountryNightBoss_Model.GetSceneBossInfoList() return private.sceneInfoDic end --- 更新boss信息辅助函数 function private.UpdateBossInfo(bossInfoList) table.clear(private.BossInfos) for _, bossInfo in ipairs(bossInfoList) do if not private.BossInfos[bossInfo.bossId] then private.BossInfos[bossInfo.bossId] = {} end local tb = private.BossInfos[bossInfo.bossId] tb.bossId = bossInfo.bossId tb.position = bossInfo.position tb.bossHp = bossInfo.bossHp tb.bossState = bossInfo.bossState tb.sceneId = bossInfo.sceneId tb.lineId = bossInfo.lineId tb.startTime = bossInfo.startTime tb.totalBossHp = bossInfo.totalBossHp tb.topCountryId = bossInfo.topCountryId or 0 tb.levelItemID = DataSheetManager.CountryNightBossPoint:GetDataByBossPoint(bossInfo.position).LevelItemID end end function CountryNightBoss_Model.SetLineUpCountryLimits(info, isInit) private.lineUpCountryLimitInfo = info if isInit == false then EventSystem.Dispatch(EventID.UI_CountryNightBoss_LineUpInfoChanged) end end function CountryNightBoss_Model.GetLineUpCountryLimits() return private.lineUpCountryLimitInfo.countryId end --endregion ****************************************** --region ******************* 网络消息接口 ******************* function private.SendCountryEveningBossBossResult(msg) NetManager.SendMessage(MessageEnums.MessageC2GUploadCountryNightBossResult, msg) end --- C->S 主界面打开通知服务器开始推送boss信息 function CountryNightBoss_Model.C2GCountryBossMainPanelChange(isOpen) local msg = country_NightBoss_pb.C2GCountryBossMainPanelChange() msg.mainPanelOpen = isOpen NetManager.SendMessage(MessageEnums.MessageC2GCountryBossMainPanelChange, msg) end -- 3个服务端推送 --- S->C Scene 推送场景服所有boss状态,用来刷新场景内显示的boss信息 function private.S2CAllCountryBossInfo(msg) logging.crit(LTAG.CRIT, "[S2CAllCountryBossInfo]") -- 在场景内活动结束 if not IsServerDataNotNil(msg.boss) then CTL.CountryNightBoss.OnEndActivityView() else -- 更新boss信息 private.UpdateBossInfo(msg.boss) -- 更新场景内 国家积分排行 for _, countryScoreSceneInfo in ipairs(msg.countryScoreRank) do private.BossInfos[countryScoreSceneInfo.bossId].CountryScoreRank = countryScoreSceneInfo.rankInfo end -- 进入场景、更新场景内 EventSystem.Dispatch(EventID.Update_CountryNightBoss_SceneInfo, LuaConst.ActivityType.CountryNightBoss, msg.boss) EventSystem.Dispatch(EventID.UI_CountryNightBoss_UpdateBossInfo) end end --- G->C推送战斗内所有boss状态,用来刷新战斗内显示的boss信息 function private.G2CAllCountryBossInfo(msg) logging.crit(LTAG.CRIT, "[G2CAllCountryBossInfo]") -- 更新boss信息 private.UpdateBossInfo(msg.boss) -- 国家伤害总排行 private.CountryDamageRankTotalList = msg.countryScoreRank private.PlayerBossRankList = msg.playerRank EventSystem.Dispatch(EventID.UI_CountryNightBoss_UpdateBossInfo) end --- 主界面信息推送 function private.G2CPushCountryBossMainPanelInfo(msg) -- 更新boss信息 private.UpdateBossInfo(msg.boss) EventSystem.Dispatch(EventID.UI_CountryNightBoss_UpdateBossInfo) -- 更新两个排行信息 EventSystem.Dispatch(EventID.UI_CountryNightBoss_MainRankUpdate, msg.countryScoreRank, msg.countryPlayerRank) end --- 获取主界面Boss结算界面信息(req) function CountryNightBoss_Model.CountryBossBalanceInfoReq(bossID) local msg = country_NightBoss_pb.CountryBossBalanceInfoReq() msg.bossId = bossID NetManager.SendMessage(MessageEnums.MessageCountryBossBalanceInfo, msg) end function private.CountryBossBalanceInfoResp(msg) private.BattleSummaryResult = { finalScoreRank = msg.finalScoreRank, finalPlayerRank = msg.finalPlayerRank, playerScoreRank = msg.playerScoreRank, DamageLimit = msg.DamageLimit } private.BattleSummaryResult.myRank = msg.myRankIdx == -1 and nil or private.BattleSummaryResult.playerScoreRank[msg.myRankIdx] EventSystem.Dispatch(EventID.UI_CountryNightBoss_UpdateBossResult, private.BattleSummaryResult) end --- 战斗内结算界面推送 function private.G2CCountryBossBalanceMessage(msg) -- 打开结算界面 CTL.CountryNightBoss.OpenBattleSummaryPanel(private.EnterBossBattleInitInfo.bossId) private.BattleSummaryResult = { finalScoreRank = msg.finalScoreRank, finalPlayerRank = msg.finalPlayerRank, playerScoreRank = msg.playerScoreRank, DamageLimit = msg.DamageLimit } for _, v in ipairs(msg.playerScoreRank) do if v.acid == BattleDataGetter.GetAcID() then private.BattleSummaryResult.myRank = v break end end EventSystem.Dispatch(EventID.UI_CountryNightBoss_UpdateBossResult, private.BattleSummaryResult) end --- 获取战斗统计信息,界面1(req) function CountryNightBoss_Model.CountryBossBalanceFinalReq() local msg = country_NightBoss_pb.CountryBossBalanceFinalReq() NetManager.SendMessage(MessageEnums.MessageCountryBossBalanceFinal, msg) end function private.CountryBossBalanceFinalResp(msg) EventSystem.Dispatch(EventID.UI_CountryNightBoss_UpdateFightDetailAndBalance, msg.ScoreRank, msg.myDamage, msg.DamageLimit) end --- 获取战斗统计信息,界面2(req) function CountryNightBoss_Model.CountryBossFightDetailReq() local msg = country_NightBoss_pb.CountryBossBalanceFinalReq() NetManager.SendMessage(MessageEnums.MessageCountryBossFightDetail, msg) end function private.CountryBossFightDetailResp(msg) local myRankData = msg.playerInfo[msg.myRankIdx] EventSystem.Dispatch(EventID.UI_CountryNightBoss_UpdateFightDetailAndBalance, msg.playerInfo, myRankData) end --- 获取积分组成和奖励组成请求 function CountryNightBoss_Model.CountryBossInfoConsistReq(countryId) local msg = country_NightBoss_pb.CountryBossInfoConsistReq() msg.countryId = countryId private.requestedCountryID = countryId NetManager.SendMessage(MessageEnums.MessageCountryBossInfoConsist, msg) end function private.CountryBossInfoConsistResp(msg) EventSystem.Dispatch(EventID.UI_CountryNightBoss_UpdateConsistInfo, private.requestedCountryID, msg.ScoreConsist, msg.JoinConsist) end --- 进入战斗协议 ---@param bossID CountryNightBoss主键 function CountryNightBoss_Model.CountryBossEnterFightReq(bossID) local msg = country_NightBoss_pb.CountryBossEnterFightReq() msg.bossId = bossID NetManager.SendMessage(MessageEnums.MessageCountryBossEnterFight, msg) end function private.CountryBossEnterFightResp(msg) if msg.Resp.Code == 0 then logging.log(LTAG.LOG, "CountryBossEnterFightResp") end end --- 发送召集请求 function CountryNightBoss_Model.CountryNightBossCallMemberReq() if CTL.CountryNightBoss.HasRecruitPermission() then local msg = country_NightBoss_pb.CountryNightBossCallMemberReq() NetManager.SendMessage(MessageEnums.MessageCountryNightBossCallMember, msg) else CTL.Tips.AddTipsMsg(Const_IDS["IDS_ERRORCODE_2827_InfoCode_CountryNightBoss_JobChange"]) end end function private.CountryNightBossCallMemberResp(msg) end --- 进入战斗初始化信息 function private.SyncInBattleInfo(msg) private.EnterBossBattleInitInfo = msg end --endregion ******************* 网络消息接口 ******************* return CountryNightBoss_Model