local EventAction_Play = { GameTime = 0; GameEndEvent = -1; } -- 触发器激活时,将执行Action的Execute function EventAction_Play:Execute(...) if not UGCGameSystem.IsServer() then return end self.bEnableActionTick = true -- 设置当前游戏模式 UGCGameSystem.GameState:SetGameStateType(CustomEnum.EGameState.Playing) -- 重置所有玩家 位置及游戏得分信息等 local AllPawn = UGCGameSystem.GetAllPlayerPawn() for _, PlayerPawn in pairs(AllPawn) do if UE.IsValid(PlayerPawn) then if PlayerPawn.PlayerKey then UGCLogSystem.Log("[EventAction_Play_Execute] DestroyPlayer:%s", tostring(PlayerPawn.PlayerKey)) else UGCLogSystem.LogError("[EventAction_Play_Execute] PlayerKey is nil. ObjName:%s", KismetSystemLibrary.GetObjectName(PlayerPawn)) end PlayerPawn:K2_DestroyActor() end end local TempPlayerControllers = UGCGameSystem.GetAllPlayerController() for _,PlayerController in pairs(TempPlayerControllers) do -- if UE.IsValid(PlayerController.Pawn) then PlayerController.Pawn:K2_DestroyActor() end UGCGameSystem.GetRespawnComponent():AddRespawnPlayer(PlayerController.PlayerKey, 0) -- UGCGameSystem.RespawnPlayer(PlayerController.PlayerKey) --UGCGameSystem.RespawnPlayer(self.PlayerKey) UGCLogSystem.Log("[EventAction_Play_Execute] ResSpawnSucceed Key: %d", PlayerController.PlayerKey) end -- 更新得分信息 UGCGameSystem.GameState:UpdateAllPlayerScoreDatas() -- 重置梯度等级 UGCGameSystem.GameState:ResetAllPlayerGrade() -- 重置队伍得分 UGCGameSystem.GameState:ResetTeamScore() -- 绑定游戏结束事件 UGCEventSystem.AddListener(EventEnum.GameStateChange, self.GameFinish, self) -- 初始化游戏时间 self.GameStartTime = UGCSystemLibrary.GetGameTime(); self.LastUpdateRemainTime = self.GameTime self.LastCheckGameEndTime = self.GameTime UGCGameSystem.GameState:SetGameTime(self.GameTime) -- 重置击杀数 local AllPS = UGCGameSystem.GetAllPlayerState() for i, PS in pairs(AllPS) do PS.Kills =0; PS.KillPlayerNum = 0, DOREPONCE(PS,"Kills") DOREPONCE(PS,"KillPlayerNum") end UGCLogSystem.Log("[EventAction_Play_Execute] Finish") return true end function EventAction_Play:GameFinish(GameStateType) if GameStateType == CustomEnum.EGameState.End then self.bEnableActionTick = false if self.GameEndEvent then -- 发送游戏结束事件 UGCEventSystem.SendEvent(self.GameEndEvent) else UGCLogSystem.Log("[EventAction_Play_GameFinish] GameEndEvent is nil") end UGCEventSystem.RemoveListener(EventEnum.GameStateChange, self.GameFinish, self) end end function EventAction_Play: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 UGCGameSystem.GameState:GameFinish() else self.LastUpdateRemainTime = CurrentUpdateRemainTime end UGCGameSystem.GameState:SetGameTime(self.LastUpdateRemainTime) -- UGCLogSystem.Log("[EventAction_Play_Update] WaitTime: %d", self.LastUpdateRemainTime) end -- 检测游戏完整性 if self.LastCheckGameEndTime - CurrentUpdateRemainTime >= 5 then self.LastCheckGameEndTime = CurrentUpdateRemainTime UGCLogSystem.Log("[EventAction_Play_Update]") if self:CheckGameEnd() then UGCGameSystem.GameState:GameFinish() end UGCLogSystem.Log("[EventAction_Play_Update] Finish") end end --- 检查玩法人数是否足够 function EventAction_Play: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_Play