UGCProjects/GZJ/Script/gamemode/Action_GameReady.lua
2025-01-08 22:46:12 +08:00

99 lines
3.5 KiB
Lua

local Action_GameReady = {
}
function Action_GameReady:Execute(...)
local GameState = UGCGameSystem.GameState
GameState.GameStage = EGameStage.GameReady
-- 应用默认属性
GameState:ApplyDefaultAttributes()
self.EnterStateTime = GameplayStatics.GetRealTimeSeconds(self)
UE.Log("[Action_GameReady:Execute] EnterStateTime = %.2f", self.EnterStateTime)
self.GameStageConfig = TableHelper.DeepCopyTable(Tables.GameReadyStageConfig)
table.sort(self.GameStageConfig, function(a, b) return a.Stage < b.Stage end)
self.EventTimeLine = {}
local TotalWaitTime = self.EnterStateTime + 0.5
for Index, Config in pairs(self.GameStageConfig) do
self.EventTimeLine[Index] = TotalWaitTime
TotalWaitTime = TotalWaitTime + tonumber(Config.WaitTime)
UE.Log("[Action_GameReady:Execute] StageConfig1: Index = %d, Stage = %d, WaitTime = %.2f; EventTime = %.2f", Index, Config.Stage, Config.WaitTime, self.EventTimeLine[Index])
end
self.EventIndex = 1
self.LastConfigCheckFunction = ""
self.LastConfigTriggerUI = -1
self.CurWaitTime = -1
self.LastUpdateRemainTime = -1
self.bEnableActionTick = true
UGCGameSystem.GameState:CloseNoticeUI()
return true
end
function Action_GameReady:Update(DeltaSeconds)
local CurrentRealTime = GameplayStatics.GetRealTimeSeconds(self)
if self.CurWaitTime > 0 then
local RemainTime = self.CurWaitTime - (CurrentRealTime - self.EnterStateTime);
RemainTime = RemainTime >= 0 and RemainTime or 0
local CurrentUpdateRemainTime = math.ceil(RemainTime)
if self.LastUpdateRemainTime - CurrentUpdateRemainTime >= 1 then
self.LastUpdateRemainTime = CurrentUpdateRemainTime
end
end
UGCGameSystem.GameState.GameReadyStageRemainTime = math.ceil(self.LastUpdateRemainTime)
if self.EventTimeLine[self.EventIndex] and math.isNearlyEqual(CurrentRealTime, self.EventTimeLine[self.EventIndex], 0.1) then
self:FinishLastEvent()
self:DispatchEvent(self.EventIndex)
self.EventIndex = self.EventIndex + 1
end
end
function Action_GameReady:DispatchEvent(InIndex)
local Config = self.GameStageConfig[InIndex]
UE.Log("[Action_GameReady:DispatchEvent] InIndex = %d, DispatchEvent: Stage = %d, CurTime = %.2f", InIndex, Config.Stage, GameplayStatics.GetRealTimeSeconds(self))
UGCGameSystem.GameState.GameReadyStage = Config.Stage;
DOREPONCE(UGCGameSystem.GameState, "GameReadyStage");
self.LastConfigCheckFunction = Config.CheckFunction
self.LastConfigTriggerUI = Config.TriggerUI
self.CurWaitTime = Config.WaitTime
self.LastUpdateRemainTime = self.CurWaitTime
self.EnterStateTime = GameplayStatics.GetRealTimeSeconds(self)
if next(self.GameStageConfig, InIndex) == nil then
UE.Log("[Action_GameReady:DispatchEvent] Final Index = %d", InIndex)
EventSystem.SetTimer(self, function()
self:FinishLastEvent()
UGCGameSystem.GameState:CheckAllPlayersDefaultWeaponSelection()
UGCGameSystem.GameState.GameReadyStageRemainTime = -1
UGCGameSystem.SendModeCustomEvent("EnterGameFightStage")
self.bEnableActionTick = false
end, Config.WaitTime)
end
end
function Action_GameReady:FinishLastEvent()
if self.LastConfigCheckFunction ~= "" then
UGCGameSystem.GameState[self.LastConfigCheckFunction](UGCGameSystem.GameState)
end
if self.LastConfigTriggerUI ~= -1 then
NoticeTipsTools.MulticastClosePanel(self.LastConfigTriggerUI)
end
end
return Action_GameReady