201 lines
7.0 KiB
Lua
201 lines
7.0 KiB
Lua
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 |