2025-01-04 23:00:19 +08:00

199 lines
7.9 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 EventAction_RoundBegining = {
GameTime = 0;
--- 准备阶段时间
PreparationTime = 0;
GameEndEvent = -1;
}
-- 触发器激活时将执行Action的Execute
function EventAction_RoundBegining:Execute(...)
if not UGCGameSystem.IsServer() then return end
self.bEnableActionTick = true
-- 初始化游戏时间
self.GameStartTime = UGCSystemLibrary.GetGameTime()
self.LastUpdateRemainTime = self.GameTime
self.RoundCurrentGameTime = 0.
UGCGameSystem.GameState:SetGameTime(self.GameTime)
-- 设置当前游戏模式
UGCGameSystem.GameState:SetGameStateType(CustomEnum.EGameState.Playing)
-- 设置为下一个回合
UGCGameSystem.GameState:NewRound()
-- 准备阶段启用房间阻挡
UGCGameSystem.GameState:EnableHouseBlock(true)
-- 重置钥匙
if UGCGameSystem.GameState:GetRoundNum() > 1 then
UGCGameSystem.GameState:ResetKey()
else
UGCGameSystem.GameState:ResetReadKey()
end
-- 重置队伍钥匙持有时间
UGCGameSystem.GameState:ResetHoldsTheKeyTime()
-- 循环更新钥匙持有时间
UGCGameSystem.GameState:LoopUpdateTeamKeyTime()
-- 给予上轮未死亡玩家的背包物品
UGCGameSystem.GameState:EnableLoopAddPlayerRecordBackpack()
-- 清空死亡盒子和可拾取物
UGCSystemLibrary.RemoveActorFromClassName("PlayerTombBox")
UGCSystemLibrary.RemoveActorFromClassName("PickUpWrapperActor")
-- 记录当前玩家的隐藏分
UGCGameSystem.GameState:RecordPlayerScore()
-- 重置所有玩家
local TempPlayerControllers = UGCGameSystem.GetAllPlayerController()
--UGCLogSystem.LogTree("[EventAction_RoundBegining_Execute]1", UGCGameSystem.GetAllPlayerController(true))
--UGCLogSystem.LogTree("[EventAction_RoundBegining_Execute]2", UGCGameSystem.GetAllPlayerController())
for _,PlayerController in pairs(TempPlayerControllers) do
if UE.IsValid(PlayerController.Pawn) then
UGCGameSystem.MyObserversChangeTarget(PlayerController)
-- Test
-- PlayerController.Pawn:K2_DestroyActor()
end
UGCGameSystem.LeaveSpectating(PlayerController)
-- UGCGameSystem.GetRespawnComponent():AddRespawnPlayer(PlayerController.PlayerKey, 0)
-- UGCGameSystem.RespawnPlayer(PlayerController.PlayerKey)
PlayerController.PlayerState:ResetInjuryInfo()
--所有玩家进入战斗状态
PlayerController:Fight();
end
-- 清除观战Handle
UGCGameSystem.GameState:CleanSpectateHandle()
-- 设置所有玩家不可移动
-- UGCSystemLibrary.SetAllPlayerIsMoveable(false)
-- 隔帧复活所有玩家
UGCEventSystem.SetTimer(UGCGameSystem.GameState, function() self:RespawnAllPlayer() end, 0.1)
-- 显示控制UI
UGCSendRPCSystem.ActorRPCNotify(nil, UGCGameSystem.GameState, "ShowControlPanel")
-- 显示回合准备UI
-- UGCSendRPCSystem.ClientShowUI(nil, WidgetConfig.EUIType.RoundReady)
-- 客户端发送回合重置事件
UGCSendRPCSystem.RPCEvent(nil, EventEnum.RoundBegining)
UGCLogSystem.Log("[EventAction_RoundBegining_Execute] Finish")
return true
end
function EventAction_RoundBegining:RespawnAllPlayer()
--local TempPlayerControllers = UGCGameSystem.GetAllPlayerController()
--for _,PlayerController in pairs(TempPlayerControllers) do
-- UGCGameSystem.RespawnPlayer(PlayerController.PlayerKey)
--end
-- Test
UGCGameSystem.SendModeCustomEvent("ResetAllPlayer")
end
function EventAction_RoundBegining:RoundFinish()
self.bEnableActionTick = false
if self.GameEndEvent then
-- 发送回合结束事件
UGCEventSystem.SendEvent(self.GameEndEvent)
end
end
function EventAction_RoundBegining:Update(DeltaSeconds)
local CurrentRealTime = UGCSystemLibrary.GetGameTime();
self.RoundCurrentGameTime = CurrentRealTime - self.GameStartTime
local RemainTime = self.GameTime - self.RoundCurrentGameTime;
local CurrentUpdateRemainTime = math.ceil(RemainTime)
-- 判断是否存在获胜队伍
if self:DetectionWinner() then
self:RoundFinish()
return
end
-- 更新游戏时间
if self.LastUpdateRemainTime - CurrentUpdateRemainTime >= 1 then
-- 判断游戏时间是否已结束
if CurrentUpdateRemainTime <= 0 then
self.LastUpdateRemainTime = 0
self:RoundFinish()
else
self.LastUpdateRemainTime = CurrentUpdateRemainTime
end
UGCGameSystem.GameState:SetGameTime(self.LastUpdateRemainTime)
if self.RoundCurrentGameTime >= self.PreparationTime and self.DoOnceDisHouseBlock == nil then
self.DoOnceDisHouseBlock = true
self:EndOfPreparationTime()
end
end
end
function EventAction_RoundBegining:EndOfPreparationTime()
UGCLogSystem.Log("[EventAction_RoundBegining_EndOfPreparationTime]")
-- 准备阶段结束关闭房间阻挡
UGCGameSystem.GameState:EnableHouseBlock(false)
UGCGameSystem.GameState:ReadyTimeFinish()
-- 若准备阶段不能行动则设置玩家移动速度缩放
if GlobalConfigs.GameSetting.ReadyCanNotMove then
local AllPlayerPawn = UGCGameSystem.GetAllPlayerPawn()
for i, v in pairs(AllPlayerPawn) do
v:SetCanActionable(true)
end
--UGCSystemLibrary.SetAllPlayerIsMoveable(true)
end
-- 刷新所有玩家观战
local TempPlayerControllers = UGCGameSystem.GetAllPlayerController()
for _,PlayerController in pairs(TempPlayerControllers) do
UGCGameSystem.MyObserversChangeTarget(PlayerController)
UGCGameSystem.LeaveSpectating(PlayerController)
end
-- 发送准备时间结束到客户端
UGCSendRPCSystem.RPCEvent(nil, EventEnum.RoundReadyFinish)
end
function EventAction_RoundBegining:DetectionWinner()
if self.RoundCurrentGameTime >= self.PreparationTime then
local CTTeamAlive, TTeamAlive = false, false
local CTPlayers = UGCTeamSystem.GetPlayerKeysByTeamID(TeamConfig.TeamType.CT)
local TPlayers = UGCTeamSystem.GetPlayerKeysByTeamID(TeamConfig.TeamType.T)
for i, v in pairs(CTPlayers) do
local TempPawn = UGCGameSystem.GetPlayerPawnByPlayerKey(v)
if TempPawn and TempPawn:IsAlive() then
CTTeamAlive = true
break
end
end
for i, v in pairs(TPlayers) do
local TempPawn = UGCGameSystem.GetPlayerPawnByPlayerKey(v)
if TempPawn and TempPawn:IsAlive() then
TTeamAlive = true
break
end
end
--UGCLogSystem.Log("[EventAction_RoundBegining_DetectionWinner] CTTeamAlive:%s, TTeamAlive:%s", tostring(CTTeamAlive), tostring(TTeamAlive))
if CTTeamAlive and TTeamAlive then
local CTHoldsTheKeyTime = UGCGameSystem.GameState:GetTeamHoldsTheKeyTimeFormTeamID(TeamConfig.TeamType.CT)
local THoldsTheKeyTime = UGCGameSystem.GameState:GetTeamHoldsTheKeyTimeFormTeamID(TeamConfig.TeamType.T)
--UGCLogSystem.Log("[EventAction_RoundBegining_DetectionWinner] CTHoldsTheKeyTime:%s, THoldsTheKeyTime:%s", tostring(CTHoldsTheKeyTime), tostring(THoldsTheKeyTime))
if math.max(CTHoldsTheKeyTime, THoldsTheKeyTime) >= GlobalConfigs.GameSetting.TeamNeedHoldsTheKeyTime then
if CTHoldsTheKeyTime > THoldsTheKeyTime then
UGCGameSystem.GameState:SetWinner(TeamConfig.TeamType.CT)
else
UGCGameSystem.GameState:SetWinner(TeamConfig.TeamType.T)
end
else
return false
end
elseif CTTeamAlive then
UGCGameSystem.GameState:SetWinner(TeamConfig.TeamType.CT)
elseif TTeamAlive then
UGCGameSystem.GameState:SetWinner(TeamConfig.TeamType.T)
end
UGCLogSystem.Log("[EventAction_RoundBegining_DetectionWinner] Finish")
return true
end
end
return EventAction_RoundBegining