2025-01-04 23:00:19 +08:00
|
|
|
|
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
|
|
|
|
|
--- 存在准备阶段
|
|
|
|
|
-- 设置所有玩家不可移动
|
|
|
|
|
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()
|
|
|
|
|
--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()
|
|
|
|
|
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()
|
2025-02-02 16:26:56 +08:00
|
|
|
|
-- 选出下一个挑战者
|
|
|
|
|
UGCGameSystem.GameState:SelectNextChallenge()
|
2025-01-04 23:00:19 +08:00
|
|
|
|
|
|
|
|
|
-- 判断玩家是否死亡,死亡则重生
|
|
|
|
|
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()
|
|
|
|
|
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
|