2025-01-04 23:00:19 +08:00

201 lines
7.0 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_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