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