193 lines
7.8 KiB
Lua
Raw Normal View History

2025-01-04 23:00:19 +08:00
local EventAction_MiniGameStart = {
GameTime = 0;
--- 准备阶段时间
PreparationTime = 0;
GameEndEvent = -1;
}
-- 触发器激活时将执行Action的Execute
function EventAction_MiniGameStart:Execute(...)
if not UGCGameSystem.IsServer() then return end
self.bEnableActionTick = true
UGCSendRPCSystem.RPCEvent(nil, EventEnum.MiniGameStart)
-- New一个当前玩法
self.MiniGameType = UGCGameSystem.GameState:GetNowMiniGameType()
UGCLogSystem.Log("[EventAction_MiniGameStart_Execute] MiniGameType:%s", tostring(self.MiniGameType))
local RequireFile = require(MiniGameConfig.MiniGameInfo[self.MiniGameType].MiniGameModeAction)
---@type MiniGameMode_Template
self.MiniGameInst = setmetatable({}, { __index = RequireFile, __metatable = RequireFile })
--self.MiniGameInst = TableHelper.DeepCopy(require(MiniGameConfig.MiniGameInfo[self.MiniGameType].MiniGameModeAction))
-- 小玩法初始化
self.MiniGameInst:Init()
self.MiniGameInst.MiniGameType = self.MiniGameType;
-- 玩法事件绑定
UGCEventSystem.AddListener(EventEnum.PlayerDeathInfo, self.MiniGameInst.PlayerDead, self.MiniGameInst)
UGCEventSystem.AddListener(EventEnum.PlayerPossessed, self.MiniGameInst.PlayerPossessed, self.MiniGameInst)
UGCEventSystem.AddListener(EventEnum.PlayerBeginPlay, self.MiniGameInst.PlayerBeginPlay, self.MiniGameInst)
UGCEventSystem.AddListener(EventEnum.PlayerPossessed, self.PlayerPossessed, self)
-- 显示小玩法模式的UI
self.MiniGameWidgetType = MiniGameConfig.MiniGameInfo[UGCGameSystem.GameState:GetNowMiniGameType()].DefaultWidget
if self.MiniGameWidgetType and WidgetConfig.Configs[self.MiniGameWidgetType] then
-- UGCSendRPCSystem.ClientShowUI(nil, self.MiniGameWidgetType)
UGCGameSystem.GameState:SetMutuallyExclusiveUI(self.MiniGameWidgetType)
else
UGCGameSystem.GameState:SetMutuallyExclusiveUI(-1)
end
-- 初始化游戏时间
self.GameStartTime = UGCSystemLibrary.GetGameTime()
self.GameTime = MiniGameConfig.MiniGameInfo[self.MiniGameType].MaxGameTime + self.PreparationTime
-- 设置GameMode时间
UGCGameSystem.GameState:SetGameTime(self.GameTime)
-- 设置游戏开始时间
UGCGameSystem.GameState:RoundStart()
-- 刷新玩家出生点
UGCEventSystem.SendEvent(EventEnum.UpdatePlayerSpawnPoint)
-- 重置所有玩家
--local AllPawn = UGCGameSystem.GetAllPlayerPawn()
--for i, v in pairs(AllPawn) do
-- v:K2_DestroyActor()
--end
UGCGameSystem.SendModeCustomEvent("ResetAllPlayer")
local TempPlayerControllers = UGCGameSystem.GetAllPlayerController()
for _,PlayerController in pairs(TempPlayerControllers) do
-- UGCGameSystem.GetRespawnComponent():AddRespawnPlayer(PlayerController.PlayerKey, 0)
PlayerController.PlayerState:ResetInjuryInfo()
-- 开启电影模式,禁止玩家移动
-- PlayerController:SetCinematicMode(true, false, false, true, false)
end
-- 禁止玩家移动 27版本更新后设置禁止Pawn移动的函数就有问题了改用设置为电影模式
UGCSystemLibrary.SetAllPlayerIsMovable(false)
-- 设置为准备状态
UGCGameSystem.GameState:SetIsReadyState(true)
-- 客户端发送回合重置事件
UGCSendRPCSystem.RPCEvent(nil, EventEnum.RoundBegining)
UGCLogSystem.Log("[EventAction_MiniGameStart_Execute] Finish")
return true
end
function EventAction_MiniGameStart:PlayerPossessed(PlayerKey)
local PlayerPawn = UGCGameSystem.GetPlayerPawnByPlayerKey(PlayerKey)
if PlayerPawn then
PlayerPawn:AddModifyDamageDelegationFun(self.MiniGameInst.PlayerDamageModify, self.MiniGameInst)
else
UGCLogSystem.LogError("[EventAction_MiniGameStart_PlayerPossessed] PlayerPawn is nil. PlayerKey:%s", tostring(PlayerPawn))
end
end
function EventAction_MiniGameStart:RoundFinish()
self.bEnableActionTick = false
if self.GameEndEvent then
UGCSystemLibrary.ClearAllPlayerWeapon()
local PlayerAddScore = self.MiniGameInst:GetPlayerAddScore()
local MaxScore = math.max(table.unpack(table.getValues(PlayerAddScore)))
local MVPPlayers = {}
for i, v in pairs(UGCGameSystem.GetAllPlayerPawn()) do
UGCSystemLibrary.SetPlayerPawnMovable(v, false)
end
for i, v in pairs(PlayerAddScore) do
UGCGameSystem.GameState:AddScore(i, v)
-- MVP玩家跳舞
if v == MaxScore then
MVPPlayers[#MVPPlayers + 1] = i
local MVPPawn = UGCGameSystem.GetPlayerPawnByPlayerKey(i)
if UE.IsValid(MVPPawn) and MVPPawn:IsAlive() then
SkillConfig.ExeSkill(SkillConfig.ESkillType.Dance, MVPPawn)
end
end
end
local PlayerRankInfo = UGCGameSystem.GameState:GetMiniGameScoreRank()
UGCLogSystem.LogTree("[EventAction_MiniGameStart_RoundFinish]", PlayerRankInfo)
-- UGCSendRPCSystem.ClientShowUI(nil, WidgetConfig.EUIType.MiniGameFinish, true, true, PlayerRankInfo)
local MiniGameScore = UGCGameSystem.GameState:GetMiniGameScore()
UGCGameSystem.GameState:SetMutuallyExclusiveUI(WidgetConfig.EUIType.MiniGameFinish, {PlayerRankInfo, MiniGameScore, MVPPlayers})
-- 发送回合结束事件
UGCEventSystem.SendEvent(self.GameEndEvent)
UGCEventSystem.RemoveListener(EventEnum.PlayerDeathInfo, self.MiniGameInst.PlayerDead, self.MiniGameInst)
UGCEventSystem.RemoveListener(EventEnum.PlayerPossessed, self.MiniGameInst.PlayerPossessed, self.MiniGameInst)
UGCEventSystem.RemoveListener(EventEnum.PlayerBeginPlay, self.MiniGameInst.PlayerBeginPlay, self.MiniGameInst)
UGCEventSystem.RemoveListener(EventEnum.PlayerPossessed, self.PlayerPossessed, self)
-- 关闭小玩法模式的UI
if self.MiniGameWidgetType then
-- UGCSendRPCSystem.ClientShowUI(nil, self.MiniGameWidgetType, false, false)
end
UGCSendRPCSystem.RPCEvent(nil, EventEnum.MiniGameEnd)
end
end
function EventAction_MiniGameStart:Update(DeltaSeconds)
self.MiniGameInst:Update(DeltaSeconds)
local NowTime = UGCSystemLibrary.GetGameTime()
self.GameTime = self.GameTime - DeltaSeconds
-- 判断是否存在获胜队伍
if self.MiniGameInst:CheckGameFinish() then
UGCGameSystem.GameState:SetGameTime(0)
self:RoundFinish()
return
end
-- 判断游戏时间是否已结束
if self.GameTime <= 0 then
-- 自动触发玩法结束函数
self.MiniGameInst:SetMiniGameModeEnd()
self:RoundFinish()
UGCGameSystem.GameState:SetGameTime(0)
else
UGCGameSystem.GameState:SetGameTime(math.ceil(self.GameTime))
end
if NowTime - self.GameStartTime >= self.PreparationTime and self.DoOnceDisHouseBlock == nil then
self.DoOnceDisHouseBlock = true
self:ReadyFinish()
end
end
function EventAction_MiniGameStart:ReadyFinish()
-- 若准备阶段不能行动则设置玩家移动速度缩放
if GlobalConfigs.GameSetting.ReadyCanNotMove then
UGCGameSystem.GameState:SetIsReadyState(false)
--local AllPC = UGCGameSystem.GetAllPlayerController()
--for i, v in pairs(AllPC) do
-- -- 关闭电影模式,启用玩家移动
-- v:SetCinematicMode(false, false, false, true, false)
--end
end
-- 启用玩家移动 27版本更新后设置禁止Pawn移动的函数就有问题了改用设置为电影模式
UGCSystemLibrary.SetAllPlayerIsMovable(true)
UGCGameSystem.GameState:ReadyTimeFinish()
UGCLogSystem.Log("[EventAction_MiniGameStart:ReadyFinish] 执行")
self.MiniGameInst:GameBegin()
UGCEventSystem.SendEvent(EventEnum.RoundReadyFinish)
-- 发送准备时间结束到客户端
UGCSendRPCSystem.RPCEvent(nil, EventEnum.RoundReadyFinish)
end
return EventAction_MiniGameStart