local MiniGameMode_DoNotFallDown = { IsGameEnd = false; -- 给玩家结算添加的得分{[PlayerKey] = AddScore, ...} PlayerAddScore = {}; bIsInGame = false; LastCheckPlayerBackPack = 0.; MiniGameScore = {}; PlayerGravityScale = 1; DefaultBackPack = {}; StarManagerPath = ""; RespawnList = {}; } --- 游戏初始化 function MiniGameMode_DoNotFallDown:Init() self.DefaultBackPack = MiniGameConfig.MiniGameInfo[MiniGameConfig.MiniGameType.DoNotFallDown].GameParam.DefaultBackPack self.PlayerGravityScale = MiniGameConfig.MiniGameInfo[MiniGameConfig.MiniGameType.DoNotFallDown].GameParam.GravityScale self.MoveSpeedScale = MiniGameConfig.MiniGameInfo[MiniGameConfig.MiniGameType.DoNotFallDown].GameParam.MoveSpeedScale self.LaunchFloorManagerPath = MiniGameConfig.MiniGameInfo[MiniGameConfig.MiniGameType.DoNotFallDown].GameParam.LaunchFloorManagerPath self.LaunchFloorManager = UGCSystemLibrary.GetUniqueInstanceFromPath(self.LaunchFloorManagerPath) UGCEventSystem.AddListener(EventEnum.PlayerDropMiniGameKillBox, self.PlayerDropTrap, self) end --- 准备时间结束游戏开始 function MiniGameMode_DoNotFallDown:GameBegin() self.bIsInGame = true -- 二次赋值 if not UE.IsValid(self.LaunchFloorManager) then self.LaunchFloorManager = UGCSystemLibrary.GetUniqueInstanceFromPath(self.LaunchFloorManagerPath) end self.LaunchFloorManager:SetAllFloorActive(true) UGCEventSystem.SendEvent(EventEnum.UpdateBlockFloorCollision, false) UGCLogSystem.Log("[MiniGameMode_DoNotFallDown_GameBegin]") end function MiniGameMode_DoNotFallDown:Update(DeltaTime) -- 判断该玩法是否已结束 if self.IsGameEnd then return end -- Update逻辑 -- 验证背包 self.LastCheckPlayerBackPack = self.LastCheckPlayerBackPack + DeltaTime if self.LastCheckPlayerBackPack >= 1. then self.LastCheckPlayerBackPack = 0. self:CheckBackPack() end -- Update逻辑 End end --- 设置游戏结束,手动触发会结束该玩法,倒计时结束将自动触发该函数 function MiniGameMode_DoNotFallDown:SetMiniGameModeEnd() if not self.IsGameEnd then self.IsGameEnd = true self:MiniGameEnd() end end --- 获取当前回合游戏结算, ---@return "{[PlayerKey] = AddScore, ...}" function MiniGameMode_DoNotFallDown:GetPlayerAddScore() return self.PlayerAddScore end --- 外层调用,判断该玩法是否已结束 function MiniGameMode_DoNotFallDown:CheckGameFinish() return self.IsGameEnd end --- 结束触发 function MiniGameMode_DoNotFallDown:MiniGameEnd() for i, v in pairs(self.RespawnList) do UGCEventSystem.StopTimer(v) end self.RespawnList = {} self.PlayerAddScore = UGCGameSystem.GameState:GetPlayerMiniGameAddScore() self.LaunchFloorManager:SetAllFloorActive(false) UGCEventSystem.RemoveListener(EventEnum.PlayerDropMiniGameKillBox, self.PlayerDropTrap, self) end ------------------------------------------ Player ------------------------------------------ --- 玩家死亡 function MiniGameMode_DoNotFallDown:PlayerDead(VictimKey, CauserKey, WeaponID, DamageType, IsHeadShotDamage, Distance, DamageValue, Assister) UGCGameSystem.GameState:PlayerAddMiniGameScore(VictimKey, -1) if CauserKey then UGCGameSystem.GameState:PlayerAddMiniGameScore(CauserKey, 1) MiniGameConfig.CheckPlayerTask(CauserKey, MiniGameConfig.MiniGameType.DoNotFallDown, UGCGameSystem.GameState:GetPlayerMiniGameScore(CauserKey), false) end -- 复活死者 self:RespawnPlayer(VictimKey) end --- 玩家伤害修改 function MiniGameMode_DoNotFallDown:PlayerDamageModify(DamageAmount, VictimPawn, CauserPC) if self.bIsInGame then return DamageAmount else return 0. end end --- 玩家受控时 function MiniGameMode_DoNotFallDown:PlayerPossessed(PlayerKey) end --- 玩家BeginPlay触发 function MiniGameMode_DoNotFallDown:PlayerBeginPlay(PlayerPawn) PlayerPawn:SetGravityScale(self.PlayerGravityScale) UGCEventSystem.SetTimer(UGCGameSystem.GameState, function() if UE.IsValid(PlayerPawn) then PlayerPawn:SetGravityScale(self.PlayerGravityScale) UGCPawnAttrSystem.SetSpeedScale(PlayerPawn, self.MoveSpeedScale) UGCLogSystem.Log("[MiniGameMode_AvoidingSpikeStick_PlayerBeginPlay]") end end, 1) end ---------------------------------------- Player End ---------------------------------------- --- 验证背包 function MiniGameMode_DoNotFallDown:CheckBackPack() local AllPawn = UGCGameSystem.GetAllPlayerPawn() for _, PlayerPawn in pairs(AllPawn) do for i, ItemID in pairs(self.DefaultBackPack) do if ItemID > 0 and UGCBackPackSystem.GetItemCount(PlayerPawn, ItemID) == 0 then UGCBackPackSystem.AddItem(PlayerPawn, ItemID, 1) end end end end function MiniGameMode_DoNotFallDown:PlayerDropTrap(PlayerKey) UGCGameSystem.GameState:PlayerAddMiniGameScore(PlayerKey, -1) local PP = UGCGameSystem.GetPlayerPawnByPlayerKey(PlayerKey) UGCPawnAttrSystem.SetHealth(PP, -1); end function MiniGameMode_DoNotFallDown:RespawnPlayer(PlayerKey) -- 复活死者 self.RespawnList[PlayerKey] = UGCEventSystem.SetTimer(UGCGameSystem.GameState, function() if not self.IsGameEnd then UGCGameSystem.RespawnPlayer(PlayerKey) end self.RespawnList[PlayerKey] = nil end, MiniGameConfig.MiniGameInfo[MiniGameConfig.MiniGameType.DoNotFallDown].GameParam.RespawnTime ) end return MiniGameMode_DoNotFallDown