ro-webgl/Assets/Lua/Managers/LuaBossBattleMgr.lua
2021-12-21 09:40:39 +08:00

335 lines
12 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local LuaBossBattleMgr = class("LuaBossBattleMgr")
function LuaBossBattleMgr:ctor()
self.battleMode = BattleSubMode.None
self.isLoading = false
self.isBattleEnd = false
self.ShowSkip = false
self:RegisterNetEvents();
end
function LuaBossBattleMgr:Destroy()
self:UnRegisterNetEvents();
if tolua.getpeer(self) ~= nil then
tolua.setpeer(self, nil)
end
end
function LuaBossBattleMgr:RegisterNetEvents()
end
function LuaBossBattleMgr:UnRegisterNetEvents()
end
function LuaBossBattleMgr:Enter(mode)
if mode == nil then
LogError("请设置Boss战的类型")
return
end
self.isBattleEnd = false
self.battleMode = mode
if self.battleMode == BattleSubMode.WorldBoss then
self:RegisterWorldBossEvents()
ManagerContainer.LuaUIMgr:Open(Enum.UIPageName.UIWorldBossBattle)
end
end
function LuaBossBattleMgr:OpenNewbieBattleUI()
if self.battleMode == BattleSubMode.NewbieBoss then
ManagerContainer.LuaUIMgr:Open(Enum.UIPageName.UINewbieBattle)
end
end
function LuaBossBattleMgr:Exit()
if self.battleMode == BattleSubMode.WorldBoss then
self:UnRegisterWorldBossEvents()
end
self.battleMode = BattleSubMode.None
self.isBattleEnd = true
self.ShowSkip = false
end
--boss召唤出来
function LuaBossBattleMgr:OnBossSpawned(bossName,life,maxLife,skillParam)
self.bossName = bossName
self.bossMaxLife = maxLife
self.bossSkillParam = skillParam
end
--boss召唤出来显示warning
function LuaBossBattleMgr:OnShowBossWarning()
end
--战斗失败
function LuaBossBattleMgr:OnBattleFailed()
-- LogError("LuaBossBattleMgr:OnBattleFailed")
end
--战斗胜利
function LuaBossBattleMgr:OnBattleWin()
-- LogError("LuaBossBattleMgr:OnBattleWin")
end
--- 战斗结束
---@param flag integer 1:boss死亡2自己死亡
function LuaBossBattleMgr:OnBattleEnd(flag)
-- LogError("LuaBossBattleMgr:OnBattleEnd " .. tostring(flag))
if self.isBattleEnd then return end
self.isBattleEnd = true
if self.battleMode == BattleSubMode.WorldBoss then
ManagerContainer.DataMgr.WorldBossData:SendLeaveChallengeBossRequest()
self:ExitFromWorldBossBattle(flag)
elseif self.battleMode == BattleSubMode.NewbieBoss then
ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_ROLE_GUIDE_NTF, {guide_id = 1})
local cb = function()
ManagerContainer.LuaGameMgr:ShutDownBattle()
ManagerContainer.LuaGameMgr:EnterBattle(false)
end
RegisterDelayStep(cb)
end
end
--同步boss伤害
function LuaBossBattleMgr:OnSyncBossDamage(damage)
-- LogError("[wboy] CS_PLAYER_CHALLENGE_HP_REQ " .. Inspect(damage))
if self.isBattleEnd then return end
if self.battleMode == BattleSubMode.WorldBoss then
ManagerContainer.DataMgr.WorldBossData:RecordBossDamage(damage)
end
end
--剩余多长时间进入狂暴状态
function LuaBossBattleMgr:OnShowBossRageLeftTime(leftTime)
end
--boss进入狂暴状态
function LuaBossBattleMgr:OnBossInRage()
end
--开始进行加载
function LuaBossBattleMgr:OnLoadBegin()
self.isLoading = true
ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.EID_Loading_Begin);
if self.battleMode == BattleSubMode.WorldBoss then
ManagerContainer.DataMgr.WorldBossData:WorldBossBattleLoadBegin()
end
end
--加载进度的刷新
function LuaBossBattleMgr:OnLoadProgress(progress)
ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.EID_Loading_Progress,progress);
end
--加载完成
function LuaBossBattleMgr:OnLoadComplete()
self.isLoading = false
ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.EID_Loading_Complete);
if self.battleMode == BattleSubMode.WorldBoss then
ManagerContainer.DataMgr.WorldBossData:WorldBossBattleLoadComplete()
end
end
function LuaBossBattleMgr:RegisterWorldBossEvents()
ManagerContainer.LuaEventMgr:RegisterEvent(UIEventNames.WORLD_BOSS_HP_CHANGED, self, self.OnWorldBossHpChanged)
ManagerContainer.LuaEventMgr:RegisterEvent(UIEventNames.WORLD_BOSS_PLAYER_CHANGED, self, self.OnWorldBossPlayerChanged)
ManagerContainer.LuaEventMgr:RegisterEvent(UIEventNames.WORLD_BOSS_SERVER_KICKOUT_BATTLE, self, self.OnWorldBossServerKickoutBattle)
ManagerContainer.LuaEventMgr:RegisterEvent(UIEventNames.WORLD_BOSS_ROLL_POINT_LIST_CHANGED, self, self.OnWorldBossRollPointList)
ManagerContainer.LuaEventMgr:RegisterEvent(UIEventNames.UI_CLOSE_COMPELETED, self, self.OnUICloseCompleted)
end
function LuaBossBattleMgr:UnRegisterWorldBossEvents()
ManagerContainer.LuaEventMgr:UnregisterEvent(UIEventNames.WORLD_BOSS_HP_CHANGED, self, self.OnWorldBossHpChanged)
ManagerContainer.LuaEventMgr:UnregisterEvent(UIEventNames.WORLD_BOSS_PLAYER_CHANGED, self, self.OnWorldBossPlayerChanged)
ManagerContainer.LuaEventMgr:UnregisterEvent(UIEventNames.WORLD_BOSS_SERVER_KICKOUT_BATTLE, self, self.OnWorldBossServerKickoutBattle)
ManagerContainer.LuaEventMgr:UnregisterEvent(UIEventNames.WORLD_BOSS_ROLL_POINT_LIST_CHANGED, self, self.OnWorldBossRollPointList)
ManagerContainer.LuaEventMgr:UnregisterEvent(UIEventNames.UI_CLOSE_COMPELETED, self, self.OnUICloseCompleted)
if self.playerChangeDeltaTimer and self.playerChangeDeltaTimer.running then
self.playerChangeDeltaTimer:Stop()
end
self.playerChangeDeltaTimer = nil
if self.waitRollTimer and self.waitRollTimer.running then
self.waitRollTimer:Stop()
end
self.waitRollTimer = nil
end
function LuaBossBattleMgr:OnWorldBossHpChanged()
local curHp = ManagerContainer.DataMgr.WorldBossData:GetCurHp()
LuaBattleBridge.SyncWorldBossLife(curHp)
end
function LuaBossBattleMgr:OnWorldBossPlayerChanged(enters, exits)
for i = 1, #exits do
local uid = exits[i]
LuaBattleBridge.SetActorDead(uid)
end
if not self.playerChangeDeltaTimer then
self.playerChangeDeltaTimer = Timer.New(function()
self:WorldBossPlayerChanged()
end, 0.5, -1)
end
if self.playerChangeDeltaTimer.running then
self:WorldBossPlayerChanged(true)
end
self.playerChangeDeltaTimer.time = 0.5
self.playerChangeDeltaTimer.enters = enters
self.playerChangeDeltaTimer.exits = exits
self.playerChangeDeltaTimer:Start()
end
function LuaBossBattleMgr:WorldBossPlayerChanged(force)
if not self.playerChangeDeltaTimer then
return
end
local enters = self.playerChangeDeltaTimer.enters
local exits = self.playerChangeDeltaTimer.exits
for i = 1, #exits do
local uid = exits[i]
LuaBattleBridge.RemoveActorFromBattle(uid)
end
for i = 1, #enters do
local enter = enters[i]
local uid = enter.uid
local actorSystem = enter.data
if actorSystem then
local actorParam = actorSystem:GetPlayerActorParam()
if actorParam then
if nil ~= actorSystem.userData.change_play_id and actorSystem.userData.change_play_id>0 then
actorParam = actorSystem:CreatePetBossActor(actorSystem.userData.change_play_id)
actorParam.ID = uid
end
LuaBattleBridge.AddActorToBattle(actorParam)
end
end
end
self.playerChangeDeltaTimer.enters = nil
self.playerChangeDeltaTimer.exits = nil
if not force then
self.playerChangeDeltaTimer:Stop()
end
end
--- 服务器强制踢出世界boss战斗
---@param result 1胜利
function LuaBossBattleMgr:OnWorldBossServerKickoutBattle(result)
-- 设置boss血量为0走战斗结束流程
LuaBattleBridge.SyncWorldBossLife(0)
end
function LuaBossBattleMgr:ExitFromWorldBossBattle(flag)
-- 不退出等待Roll点界面
if not self.waitRollTimer then
-- 请求超时60秒退出战斗
self.waitRollTimer = Timer.New(function()
self:ExitWorldBossBattle()
end, 60, 1)
end
self.waitRollTimer:Start()
return nil
end
function LuaBossBattleMgr:ExitWorldBossBattle()
-- 清理数据,避免干扰其它战斗
local actorSystemMap = ManagerContainer.DataMgr.WorldBossData:GetActorSystem()
for uid,_ in pairs(actorSystemMap) do
LuaBattleBridge.RemoveActorFromBattle(uid)
end
ManagerContainer.LuaGameMgr:ShutDownBattle()
ManagerContainer.FSMMgr:ChangeState(Enum.StateEnum.IdleState.stateId)
ManagerContainer.DataMgr.WorldBossData:ExitWorldBossBattle()
local data = require('ExecuteSequenceData'):new()
data:AppendFunc(false, ManagerContainer.LuaUIMgr, ManagerContainer.LuaUIMgr.Open, Enum.UIPageName.UIMain)
data:AppendUIListener(Enum.UIPageName.UIMain, UIEventNames.UI_FILLCONTENT_COMPELETED, 5)
data:AppendUIViewFunc(false, Enum.UIPageName.UIMain, 'ChangePageMsg', Enum.MainViewPageType.Town)
data:AppendUIListener(Enum.UIPageName.UIMainCity1, UIEventNames.UI_FILLCONTENT_COMPELETED, 5)
data:AppendUIViewFunc(false, Enum.UIPageName.UIMainCity1, 'OpenWorldBoss')
ManagerContainer.ExecuteSequenceMgr:Execute(data)
end
function LuaBossBattleMgr:OnWorldBossRollPointList()
local worldBossData = ManagerContainer.DataMgr.WorldBossData
if not worldBossData:HasWorldBossPointInfo() then
self:ExitWorldBossBattle()
return
end
if ManagerContainer.LuaUIMgr:HasOpenPage(Enum.UIPageName.UIWorldBossReward) then
return
end
ManagerContainer.LuaUIMgr:Open(Enum.UIPageName.UIWorldBossReward)
if self.waitRollTimer then
self.waitRollTimer:Stop()
end
end
function LuaBossBattleMgr:OnUICloseCompleted(owner)
if owner.uiData.id ~= Enum.UIPageName.UIWorldBossReward then
return
end
self:ExitWorldBossBattle()
end
--同步战斗内玩家信息
function LuaBossBattleMgr:OnFighterLifeChanged(isBoss,actorId,life,maxLife)
if isBoss then
ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.EID_Refresh_Boss_Life,life,maxLife)
else
ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.EID_Refresh_Fighter_Life,actorId,life,maxLife)
end
end
function LuaBossBattleMgr:OnFighterEnergyChanged(actorId,sp,maxSp)
ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.EID_Refresh_Fighter_Sp,actorId,sp,maxSp)
end
function LuaBossBattleMgr:OnFighterCastSkill(skillParam)
if skillParam.isBoss then
ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.EID_Refresh_Boss_Skill,skillParam)
else
ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.EID_Refresh_Cast_Skill,skillParam)
end
end
function LuaBossBattleMgr:OnShowBossBuff(actorId,isBoss,buffIcon,num,isPlayeRecord)
if isBoss then
ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.EID_Refresh_Boss_Buff,buffIcon,num)
else
ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.EID_Refresh_Player_Buff,actorId, buffIcon,num)
end
end
function LuaBossBattleMgr:OnRemoveBossBuff(actorId,isBoss,buffIcon)
if isBoss then
ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.EID_Refresh_Boss_Remove_Buff,buffIcon)
else
ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.EID_Remove_Player_Buff, actorId, buffIcon)
end
end
function LuaBossBattleMgr:OnShowFighter(actorId)
ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.EID_Show_Fighter,actorId)
end
function LuaBossBattleMgr:ShowSkipBattle()
self.ShowSkip = true
ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.EID_SHOW_SKIP_BATTLE)
end
function LuaBossBattleMgr:SetUINodeVis(nodePath)
ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.EID_Set_UINode_Vis,nodePath)
end
function LuaBossBattleMgr:HeroChangeProfessionSuccess()
ManagerContainer.DataMgr.UserData:RoleChangeJobAttrSuccess()
end
return LuaBossBattleMgr