local EventAction_TestPlaceMap = { PassagewayTestIndex = 0; ActivePassageway = nil; AllPassagewayBlock = {}; NowMapType = 1; BreakThroughTestTime = 1; StartTestTime = 0; IsNewTestRound = false; PreparationTime = 3; } -- 触发器激活时,将执行Action的Execute function EventAction_TestPlaceMap:Execute(...) UGCLogSystem.Log("[EventAction_TestPlaceMap_Execute]") if not UGCGameSystem.IsServer() then return end -- 设置进入跑图测试UI UGCGameSystem.GameState:ShowSimplePlaceModeUI(WidgetConfig.EUIType.RunMapTest) -- 当前地图 self.NowMapType = PlacementModeConfig.GetPlaceManager():GetNowMap() -- 跑图测试的时间上限 self.BreakThroughTestTime = PlacementModeConfig.MapInfo[self.NowMapType].BreakThroughTestTime -- 获取测试玩家 local AllPC = UGCGameSystem.GetAllPlayerController() self.SimplePC = AllPC[1] -- 设置玩家的出生点类型 self.SimplePC:SetStartPointType(EPlayerStartType.Attacker) -- 获取通道阻挡 local PassagewayBlockClass = UE.LoadClass(PlacementModeConfig.PassagewayBlockPath) local TempAllPassagewayBlock = GameplayStatics.GetAllActorsOfClass(UGCGameSystem.GameState, PassagewayBlockClass); self.AllPassagewayBlock = {} for i, v in pairs(TempAllPassagewayBlock) do self.AllPassagewayBlock[#self.AllPassagewayBlock + 1] = v v:SetShowType(CustomEnum.EPassagewayShowType.Close) end UGCLogSystem.Log("[EventAction_TestPlaceMap_Execute] AllPassagewayBlockNum:%s", tostring(#self.AllPassagewayBlock)) -- 设置准备阶段的时间 UGCSystemLibrary.SetPreparationTime(self.PreparationTime) -- 绑定玩家到达防线 UGCEventSystem.AddListener(EventEnum.PlayerEnterLineOfDefense, self.PlayerEnterLineOfDefense, self) -- 绑定玩家重置回合测试 UGCEventSystem.AddListener(EventEnum.RerunNowRound, self.PassagewayTestReset, self) -- 绑定玩家回退到放置模式 UGCEventSystem.AddListener(EventEnum.BackToPlaceMode, self.BreakToPlaceMode, self) -- 绑定玩家保存成功 UGCEventSystem.AddListener(EventEnum.SaveRunMap, self.SaveRunMap, self) -- 开启跑图测试 self:EnableNextPassagewayTest() -- 开启Tick self.bEnableActionTick = true UGCLogSystem.Log("[EventAction_TestPlaceMap_Execute] Finish") return true end function EventAction_TestPlaceMap:Update(DeltaSeconds) local NowTime = UGCSystemLibrary.GetGameTime() -- 更新测试时间 local ShowTime = math.ceil(math.clamp(self.BreakThroughTestTime - NowTime + self.StartTestTime, 0, self.BreakThroughTestTime)) UGCGameSystem.GameState:SetGameTime(ShowTime) -- 判断该轮跑图测试是否到时间 if self.IsNewTestRound then if NowTime - self.StartTestTime >= self.BreakThroughTestTime then -- 判断测试失败 self:PassagewayTestRoundFinish(false) end end end -- 进入下一轮测试 function EventAction_TestPlaceMap:EnableNextPassagewayTest() if self.ActivePassageway then -- 关闭上一轮的测试通道 self.ActivePassageway:SetShowType(CustomEnum.EPassagewayShowType.Close) end -- 获取当前轮数的测试通道 self.PassagewayTestIndex = self.PassagewayTestIndex + 1 self.ActivePassageway = self.AllPassagewayBlock[self.PassagewayTestIndex] -- 开启当前测试通道 self.ActivePassageway:SetShowType(CustomEnum.EPassagewayShowType.Open) -- 开启测试 self:EnterTest() end -- 开启测试 function EventAction_TestPlaceMap:EnterTest() -- 设置为准备状态 UGCSystemLibrary.EnterPreparationState() -- 重置玩家 UGCSystemLibrary.RespawnPlayer(self.SimplePC.PlayerKey) -- 设置测试起始时间 self.StartTestTime = UGCSystemLibrary.GetGameTime() + self.PreparationTime -- 显示准备时间 UGCSendRPCSystem.ClientShowUI(self.SimplePC.PlayerKey, WidgetConfig.EUIType.Countdown, true, false, self.PreparationTime) -- 设置新一轮开始 self.IsNewTestRound = true -- 激活所有放置机关 PlacementModeConfig.ActiveAllPlaceItem(true) end -- 玩家到达防线 function EventAction_TestPlaceMap:PlayerEnterLineOfDefense() if UGCSystemLibrary.GetGameTime() - self.StartTestTime <= self.BreakThroughTestTime then self:PassagewayTestRoundFinish(true) end end -- 一轮跑图测试结束阶段 function EventAction_TestPlaceMap:PassagewayTestRoundFinish(IsSucceed) -- 关闭所有机关的激活 PlacementModeConfig.ActiveAllPlaceItem(false) -- 设置次轮测试已完成 self.IsNewTestRound = false -- 判断测试是否成功 if IsSucceed then -- 判断是否完成测试 if self.PassagewayTestIndex >= #self.AllPassagewayBlock then -- 完成测试则进入保存界面 UGCGameSystem.GameState:ShowSimplePlaceModeUI(WidgetConfig.EUIType.SaveMap) else -- 进入下一轮测试 self:EnableNextPassagewayTest() end else -- 询问玩家是否要重新跑还是退回到编辑模式 UGCGameSystem.GameState:ShowSimplePlaceModeUI(WidgetConfig.EUIType.RunMapFailure) end end -- 重置本轮测试 function EventAction_TestPlaceMap:PassagewayTestReset() if UGCSystemLibrary.GetGameTime() - self.StartTestTime > 0 then -- 设置为跑图界面 UGCGameSystem.GameState:ShowSimplePlaceModeUI(WidgetConfig.EUIType.RunMapTest) self:EnterTest() end end -- 回退到放置模式 function EventAction_TestPlaceMap:BreakToPlaceMode() UGCGameSystem.GameState:ShowSimplePlaceModeUI(WidgetConfig.EUIType.PlaceMode) self:ExitPassagewayTest() end -- 保存地图成功,回到主页面 function EventAction_TestPlaceMap:SaveRunMap(MapName) local Code = PlacementModeConfig.GetPlaceManager():ExportPlacementCode() UGCGameSystem.GameState:AddSavePlaceMap(self.SimplePC.PlayerKey, MapName, Code) UGCGameSystem.GameState:ShowSimplePlaceModeUI(WidgetConfig.EUIType.PlaceModeMainMenu) self:ExitPassagewayTest() end -- 退出测试 function EventAction_TestPlaceMap:ExitPassagewayTest() -- 关闭更新时间 self.IsNewTestRound = false -- 关闭该EventAction self.bEnableActionTick = false -- 重置玩家的出生点类型 self.SimplePC:SetStartPointType(EPlayerStartType.Defender) -- 重置玩家 UGCSystemLibrary.RespawnPlayer(self.SimplePC.PlayerKey) -- 隐藏通道阻挡墙 for i, v in pairs(self.AllPassagewayBlock) do v:SetShowType(CustomEnum.EPassagewayShowType.Hide) end -- 移除玩家到达防线 UGCEventSystem.RemoveListener(EventEnum.PlayerEnterLineOfDefense, self.PlayerEnterLineOfDefense, self) -- 移除玩家重置回合测试 UGCEventSystem.RemoveListener(EventEnum.RerunNowRound, self.PassagewayTestReset, self) -- 移除玩家回退到放置模式 UGCEventSystem.RemoveListener(EventEnum.BackToPlaceMode, self.BreakToPlaceMode, self) -- 移除玩家保存成功 UGCEventSystem.RemoveListener(EventEnum.SaveRunMap, self.SaveRunMap, self) end return EventAction_TestPlaceMap