193 lines
7.8 KiB
Lua
193 lines
7.8 KiB
Lua
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 |