146 lines
5.2 KiB
Lua
Raw Normal View History

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