201 lines
7.0 KiB
Lua
Raw Normal View History

2025-01-04 23:00:19 +08:00
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