154 lines
5.4 KiB
Lua
154 lines
5.4 KiB
Lua
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 |