local EventAction_RoundBegining = { GameTime = 0; --- 准备阶段时间 PreparationTime = 0; GameEndEvent = -1; } -- 触发器激活时,将执行Action的Execute function EventAction_RoundBegining:Execute(...) if not UGCGameSystem.IsServer() then return end self.DoOnceEnableMove = false -- 初始化游戏时间 self.GameTimeInst = self.GameTime + self.PreparationTime -- 更新回合的防线信息 UGCGameSystem.GameState:UpdateNumOfBreakingThroughDefenseLine() -- 获取防守玩家 self.DefenderPlayerKey = UGCGameSystem.GameState:GetNowDefender() -- 开启防守玩家的呼吸回血 UGCGameSystem.GameState:SetRespiratoryRegurgitationPlayers({self.DefenderPlayerKey}) -- 当前玩家的地图代码 local MapCode = UGCGameSystem.GameState:GetNowDefenderSelectMap() UGCLogSystem.Log("[EventAction_RoundBegining_Execute] MapCode:%s", MapCode) PlacementModeConfig.GetPlaceManager():ImportPlacementCode(self.DefenderPlayerKey, MapCode) local AllPC = UGCGameSystem.GetAllPlayerController() for i, v in pairs(AllPC) do if v.PlayerKey == self.DefenderPlayerKey then UGCGameSystem.GameState:SetPlayerWeaponCombination(v.PlayerKey, WeaponSelectionCombinationConfig.ECombinationType.Combination2) UGCSendRPCSystem.ClientShowUI(v.PlayerKey, WidgetConfig.EUIType.TeamChangeTip, true, false, true) else UGCGameSystem.GameState:SetPlayerWeaponCombination(v.PlayerKey, WeaponSelectionCombinationConfig.ECombinationType.Combination1) UGCSendRPCSystem.ClientShowUI(v.PlayerKey, WidgetConfig.EUIType.TeamChangeTip, true, false, false) end UGCGameSystem.GameState:ShowPlayerSelectWeaponWidget(v.PlayerKey) end -- 刷新出生点 UGCEventSystem.SendEvent(EventEnum.UpdatePlayerStartList) -- 显示战斗界面 UGCGameSystem.GameState:ShowSimplePlayModeUI(WidgetConfig.EUIType.FightPanel) -- 设置当前游戏模式 UGCGameSystem.GameState:SetGameStateType(CustomEnum.EGameState.Playing) -- 清空死亡盒子和可拾取物 UGCSystemLibrary.RemoveActorFromClassName("PlayerTombBox") UGCSystemLibrary.RemoveActorFromClassName("PickUpWrapperActor") -- 重置所有玩家 self:RespawnAllPlayers() -- 设置所有玩家不可移动 UGCSystemLibrary.SetAllPlayerIsMovable(false) self.bEnableActionTick = true UGCLogSystem.Log("[EventAction_RoundBegining_Execute] Finish") return true end function EventAction_RoundBegining:RespawnAllPlayers() UGCGameSystem.SendModeCustomEvent("ResetAllPlayers") end function EventAction_RoundBegining:RoundFinish(bAttackSucceed) self.bEnableActionTick = false -- 增加防守成功玩家的得分 if not bAttackSucceed then PlayerScoreSystem.AddPlayerScoreData(self.DefenderPlayerKey, PlacementModeConfig.AddScoreType.DefendSucceedAddScore, 1) -- 发送得分信息 UGCSendRPCSystem.RPCEvent(self.DefenderPlayerKey, EventEnum.AddTip, TipConfig.TipType.AddScore, PlacementModeConfig.AddScoreType.DefendSucceedAddScore) end if self.GameEndEvent then -- 发送回合结束事件 UGCEventSystem.SendEvent(self.GameEndEvent) UGCEventSystem.RemoveListener(EventEnum.PlayerEnterLineOfDefense, self.PlayerEnterLineOfDefense, self) end end function EventAction_RoundBegining: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)) if self.GameTimeInst <= 0 then self:RoundFinish(false) end end function EventAction_RoundBegining:EndOfPreparationTime() UGCLogSystem.Log("[EventAction_RoundBegining_EndOfPreparationTime]") UGCSystemLibrary.SetAllPlayerIsMovable(true) -- 发送准备时间结束到客户端 UGCSendRPCSystem.RPCEvent(nil, EventEnum.RoundReadyFinish) UGCEventSystem.AddListener(EventEnum.PlayerEnterLineOfDefense, self.PlayerEnterLineOfDefense, self) end -- 玩家进入防线 function EventAction_RoundBegining:PlayerEnterLineOfDefense(PlayerKey) -- 判断是否为防守玩家 if PlayerKey == self.DefenderPlayerKey then return end UGCGameSystem.GameState:AddBreakThroughNum() -- 增加得分 PlayerScoreSystem.AddPlayerScoreData(PlayerKey, PlacementModeConfig.AddScoreType.EnterDefenseLineAddScore, 1) -- 发送得分信息 UGCSendRPCSystem.RPCEvent(PlayerKey, EventEnum.AddTip, TipConfig.TipType.AddScore, PlacementModeConfig.AddScoreType.EnterDefenseLineAddScore) local AllPK = UGCSystemLibrary.GetAllPlayerKeys() for i, OtherPlayerKey in pairs(AllPK) do if OtherPlayerKey ~= PlayerKey then UGCSendRPCSystem.RPCEvent(OtherPlayerKey, EventEnum.AddTip, TipConfig.TipType.PlayerBreakthrough, PlayerKey) end end if UGCGameSystem.GameState:IsAttackSucceed() then self:RoundFinish(true) else UGCSystemLibrary.RespawnPlayer(PlayerKey) end end return EventAction_RoundBegining