2025-01-07 21:25:05 +08:00

222 lines
7.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_RoundBegin = {
GameTime = 0;
--- 准备阶段时间
PreparationTime = 0;
GameEndEvent = -1;
}
-- 触发器激活时将执行Action的Execute
function EventAction_RoundBegin:Execute(...)
if not UGCGameSystem.IsServer() then return end
self.DoOnceEnableMove = false
-- 初始化游戏时间
self.GameTimeInst = self.GameTime + math.max(self.PreparationTime, 0)
-- 新回合
UGCGameSystem.GameState:AddNewRound()
-- 显示战斗界面
UGCGameSystem.GameState:ShowSimplePlayModeUI(WidgetConfig.EUIType.FightPanel)
-- 设置当前游戏模式
UGCGameSystem.GameState:SetGameStateType(CustomEnum.EGameState.Playing)
-- 清空死亡盒子、可拾取物、投掷物
UGCSystemLibrary.RemoveActorFromClassName("PlayerTombBox")
UGCSystemLibrary.RemoveActorFromClassName("PickUpWrapperActor")
UGCSystemLibrary.RemoveActorFromClassName("EliteProjectile")
-- 设置准备阶段参数
if self.PreparationTime > 0 then
--UGCGameSystem.GameState:SetIsPreparationTime(true)
--- 存在准备阶段
-- 设置所有玩家不可移动
if not GlobalConfigs.GameSetting.ReadyCanMove then
UGCSystemLibrary.SetAllPlayerIsMovable(false)
end
else
--- 不存在准备阶段
self.DoOnceEnableMove = true
end
-- 玩法逻辑
self:ExecuteOtherLogic()
-- 重置所有玩家,需要放在所有逻辑最后边
self:RespawnAllPlayers()
self.bEnableActionTick = true
UGCLogSystem.Log("[EventAction_RoundBegin_Execute] Finish")
return true
end
function EventAction_RoundBegin:RespawnAllPlayers()
UGCLogSystem.Log("[EventAction_RoundBegin_RespawnAllPlayers]")
--UGCGameSystem.SendModeCustomEvent("ResetAllPlayers")
local AllPK = UGCSystemLibrary.GetAllPlayerKeys()
for i, PlayerKey in pairs(AllPK) do
UGCSystemLibrary.RespawnPlayer(PlayerKey)
end
end
function EventAction_RoundBegin:RoundFinish()
self.bEnableActionTick = false
self:RoundFinishOtherLogic()
if self.GameEndEvent then
-- 发送回合结束事件
UGCEventSystem.SendEvent(self.GameEndEvent)
end
end
function EventAction_RoundBegin:Update(DeltaSeconds)
if not self.bEnableActionTick then
return
end
self.GameTimeInst = self.GameTimeInst - DeltaSeconds
-- 判断准备阶段是否结束
if self.GameTimeInst <= self.GameTime and not self.DoOnceEnableMove then
self.DoOnceEnableMove = true
self:EndOfPreparationTime()
end
-- 设置游戏时间
UGCGameSystem.GameState:SetGameTime(math.clamp(math.floor(self.GameTimeInst), 0, self.GameTime + self.PreparationTime))
if self.GameTimeInst <= 0 then
self:RoundFinish()
end
self:UpdateOtherLogic(DeltaSeconds)
end
function EventAction_RoundBegin:EndOfPreparationTime()
--UGCGameSystem.GameState:SetIsPreparationTime(false)
local AllPCs = UGCGameSystem.GetAllPlayerController()
--for i, v in pairs(AllPCs) do
-- v:UpdatePlayerBackPack()
--end
UGCLogSystem.Log("[EventAction_RoundBegin_EndOfPreparationTime]")
if not GlobalConfigs.GameSetting.ReadyCanMove then
UGCSystemLibrary.SetAllPlayerIsMovable(true)
end
-- 发送准备时间结束到客户端
UGCSendRPCSystem.RPCEvent(nil, EventEnum.RoundReadyFinish)
self:OtherEndOfPreparationTimeLogic()
end
--根据工程的修改而改变的逻辑 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- 根据工程的修改而改变的开始执行逻辑
function EventAction_RoundBegin:ExecuteOtherLogic()
-- 判断玩家是否死亡
local AllPC = UGCGameSystem.GetAllPlayerController()
for i, PC in pairs(AllPC) do
if not UE.IsValid(PC.Pawn) or not PC.Pawn:IsAlive() then
UGCGameSystem.RespawnPlayer(PC.PlayerKey)
end
-- 新增一个增益
PC:AddCanObtainIncreaseCount()
local MaxScore = UGCGameSystem.GameState:GetMaxTeamScore()
if MaxScore == GlobalConfigs.GameSetting.MaxRound // 2 then
-- 赛点额外增加一个增益
PC:AddCanObtainIncreaseCount()
end
end
-- 绑定玩家死亡
UGCEventSystem.AddListener(EventEnum.PlayerDeathInfo, self.PlayerDeath, self)
-- 切换玩家出生点
-- 开始缩圈
-- UGCBlueprintFunctionLibrary.TogglePoisonCircle(UGCGameSystem.GameState, true);
SignalCircleConfig.TogglePoisonCircle()
-- 重置载具
UGCLogSystem.Log("[EventAction_RoundBegin_ExecuteOtherLogic] ResetAllSavedVehicle")
MyVehicleSystem.ResetAllSavedVehicle()
end
-- 根据工程的修改而改变的准备阶段结束逻辑
function EventAction_RoundBegin:OtherEndOfPreparationTimeLogic()
UGCLogSystem.Log("[EventAction_RoundBegin_OtherEndOfPreparationTimeLogic]")
end
-- 根据工程的修改而改变的Tick逻辑
function EventAction_RoundBegin:UpdateOtherLogic(DeltaSeconds)
-- 每2秒检测一方玩家是否已全部阵亡
self.CheckTeamPlayerLastTime = self.CheckTeamPlayerLastTime and self.CheckTeamPlayerLastTime + DeltaSeconds or 0
if self.CheckTeamPlayerLastTime > 2 then
self.CheckTeamPlayerLastTime = 0
self.CheckTeamPlayerLastTime = self.CheckTeamPlayerLastTime + DeltaSeconds
self:CheckTeamPlayer()
end
end
-- 根据工程的修改而改变的结束逻辑
function EventAction_RoundBegin:RoundFinishOtherLogic()
-- 移除绑定玩家死亡,判断是否有胜利方
UGCEventSystem.RemoveListener(EventEnum.PlayerDeathInfo, self.PlayerDeath, self)
-- 销毁载具
MyVehicleSystem.DestroyAllSavedVehicle()
-- 增加回合胜利玩家的得分
end
-- 有玩家死亡
function EventAction_RoundBegin:PlayerDeath(PlayerKey)
UGCLogSystem.Log("[EventAction_RoundBegin_PlayerDeath]")
-- 判断是否有胜利方
self:CheckTeamPlayer()
local PC = UGCGameSystem.GetPlayerControllerByPlayerKey(PlayerKey)
if UE.IsValid(PC) then
UGCLogSystem.Log("[EventAction_RoundBegin_PlayerDeath] 观战")
-- 让观战自己的队友观战别人
UGCGameSystem.MyObserversChangeTarget(PC)
--进入观战
UGCGameSystem.EnterSpectating(PC)
end
end
-- 检测一方玩家是否已全部阵亡
function EventAction_RoundBegin:CheckTeamPlayer()
local CTTeamAlive, TTeamAlive = false, false
local CTPlayers = UGCTeamSystem.GetPlayerKeysByTeamID(TeamConfig.TeamType.CT)
local TPlayers = UGCTeamSystem.GetPlayerKeysByTeamID(TeamConfig.TeamType.T)
for i, v in pairs(CTPlayers) do
local TempPawn = UGCGameSystem.GetPlayerPawnByPlayerKey(v)
if TempPawn and TempPawn:IsAlive() then
CTTeamAlive = true
break
end
end
for i, v in pairs(TPlayers) do
local TempPawn = UGCGameSystem.GetPlayerPawnByPlayerKey(v)
if TempPawn and TempPawn:IsAlive() then
TTeamAlive = true
break
end
end
if CTTeamAlive == false then
UGCGameSystem.GameState:SetWinningTeam(TeamConfig.TeamType.T)
self:RoundFinish()
elseif TTeamAlive == false then
UGCGameSystem.GameState:SetWinningTeam(TeamConfig.TeamType.CT)
self:RoundFinish()
end
end
return EventAction_RoundBegin