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
|