142 lines
4.8 KiB
Lua
142 lines
4.8 KiB
Lua
local EventAction_RoundEnd = {
|
||
GameTime = 0;
|
||
GameEndEvent = -1;
|
||
NewRoundEvent = -1
|
||
}
|
||
|
||
-- 触发器激活时,将执行Action的Execute
|
||
function EventAction_RoundEnd:Execute(...)
|
||
if not UGCGameSystem.IsServer() then return end
|
||
self.bEnableActionTick = true
|
||
|
||
-- 关闭观战
|
||
local AllController = UGCGameSystem.GetAllPlayerController()
|
||
for i, PC in pairs(AllController) do
|
||
UGCGameSystem.LeaveSpectating(PC)
|
||
end
|
||
|
||
-- 获取当前MVP玩家
|
||
local MVPPlayer = UGCGameSystem.GameState:GetMVPPlayer()
|
||
if MVPPlayer > 0 then
|
||
UGCGameSystem.GameState:AddPlayerCoin(MVPPlayer, GlobalConfigs.GameSetting.MVPPlayerAddCoin)
|
||
end
|
||
-- 停止更新钥匙持有时间
|
||
UGCGameSystem.GameState:StopUpdateTeamKeyTime()
|
||
-- 根据获胜方及回合数等因素,增加所有玩家的金币数
|
||
UGCGameSystem.GameState:RoundFinishAddCoin()
|
||
-- 显示获胜方
|
||
UGCSendRPCSystem.ClientShowUI(nil, WidgetConfig.EUIType.Winner, true, false, UGCGameSystem.GameState:GetWinner(), MVPPlayer)
|
||
-- 初始化游戏时间
|
||
self.GameStartTime = UGCSystemLibrary.GetGameTime();
|
||
self.LastUpdateRemainTime = self.GameTime
|
||
|
||
if UGCGameSystem.GameState:GetRoundNum() == GlobalConfigs.GameSetting.MaxRound // 2 then
|
||
self.bSwaped = true
|
||
UGCEventSystem.SendEvent(EventEnum.SwapBornPoint)
|
||
end
|
||
|
||
-- 设置无敌状态
|
||
local AllPawn = UGCGameSystem.GetAllPlayerPawn()
|
||
for i, v in pairs(AllPawn) do
|
||
UGCPawnSystem.SetIsInvincible(v, true)
|
||
end
|
||
|
||
-- 发送回合结束事件到客户端
|
||
UGCSendRPCSystem.RPCEvent(nil, EventEnum.RoundEnd)
|
||
UGCLogSystem.Log("[EventAction_RoundEnd_Execute] Finish")
|
||
return true
|
||
end
|
||
|
||
function EventAction_RoundEnd:GameFinish()
|
||
self.bEnableActionTick = false
|
||
|
||
-- 隐藏获胜方UI
|
||
UGCSendRPCSystem.ClientShowUI(nil, WidgetConfig.EUIType.Winner, false)
|
||
|
||
local CTScore = UGCGameSystem.GameState:GetTeamScore(TeamConfig.TeamType.CT)
|
||
local TScore = UGCGameSystem.GameState:GetTeamScore(TeamConfig.TeamType.T)
|
||
-- 剩余轮次
|
||
local RemainingRounds = GlobalConfigs.GameSetting.MaxRound - UGCGameSystem.GameState:GetRoundNum()
|
||
-- 达到最大轮次或剩余轮次不足以支持一方获胜
|
||
if RemainingRounds <= 0 or RemainingRounds < math.abs(CTScore - TScore) or self:CheckGameEnd() then
|
||
UGCGameSystem.GameState:GameFinish()
|
||
-- 发送游戏结束事件
|
||
UGCEventSystem.SendEvent(self.GameEndEvent)
|
||
else
|
||
-- 记录存活玩家的背包武器及配件信息
|
||
UGCGameSystem.GameState:RecordPlayerBackpackInfo()
|
||
-- 触发新的回合事件
|
||
UGCEventSystem.SendEvent(self.NewRoundEvent)
|
||
end
|
||
|
||
if self.bSwaped then
|
||
UGCSendRPCSystem.RPCEvent(nil, EventEnum.AddTip, TipConfig.TipType.SwapBronPoint)
|
||
end
|
||
end
|
||
|
||
function EventAction_RoundEnd:Update(DeltaSeconds)
|
||
local CurrentRealTime = UGCSystemLibrary.GetGameTime();
|
||
local RemainTime = self.GameTime - (CurrentRealTime - self.GameStartTime);
|
||
local CurrentUpdateRemainTime = math.ceil(RemainTime)
|
||
|
||
-- 更新游戏时间
|
||
if self.LastUpdateRemainTime - CurrentUpdateRemainTime >= 1 then
|
||
-- 判断游戏时间是否已结束
|
||
if CurrentUpdateRemainTime <= 0 then
|
||
self.LastUpdateRemainTime = 0
|
||
self:GameFinish()
|
||
else
|
||
self.LastUpdateRemainTime = CurrentUpdateRemainTime
|
||
end
|
||
end
|
||
end
|
||
|
||
|
||
--- 检查玩法人数是否足够
|
||
function EventAction_RoundEnd:CheckGameEnd()
|
||
|
||
local PlayerNum = #UGCGameSystem.GetAllPlayerController()
|
||
if PlayerNum == 0 then
|
||
return true
|
||
end
|
||
|
||
local TeamModeType = GlobalConfigs.GameModeSetting.TeamModeType
|
||
if TeamModeType == CustomEnum.ETeamMode.PersonalWarfare then
|
||
if PlayerNum <= 1 then
|
||
return true
|
||
end
|
||
elseif TeamModeType == CustomEnum.ETeamMode.PartyMode then
|
||
return false
|
||
elseif TeamModeType == CustomEnum.ETeamMode.TeamSports or TeamModeType == CustomEnum.ETeamMode.BurstMode then
|
||
local TeamIDs = UGCTeamSystem.GetTeamIDs()
|
||
if #TeamIDs <= 1 then
|
||
return true
|
||
end
|
||
local Team1Player = UGCTeamSystem.GetPlayerKeysByTeamID(1)
|
||
local Team2Player = UGCTeamSystem.GetPlayerKeysByTeamID(2)
|
||
local Team1HasPlayer, Team2HasPlayer = false, false
|
||
for i, v in pairs(Team1Player) do
|
||
if UGCGameSystem.GetPlayerControllerByPlayerKey(v) then
|
||
Team1HasPlayer = true
|
||
break
|
||
end
|
||
end
|
||
if not Team1HasPlayer then
|
||
return true
|
||
end
|
||
for i, v in pairs(Team2Player) do
|
||
if UGCGameSystem.GetPlayerControllerByPlayerKey(v) then
|
||
Team2HasPlayer = true
|
||
break
|
||
end
|
||
end
|
||
if not Team2HasPlayer then
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
|
||
|
||
return EventAction_RoundEnd |