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

152 lines
5.3 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_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
UGCSystemLibrary.RespawnPlayer(PlayerController.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