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

193 lines
7.8 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_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