154 lines
5.4 KiB
Lua
Raw Permalink Normal View History

2025-01-04 23:00:19 +08:00
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