---@type MiniGameMode_AvoidingSpikeStick local MiniGameMode_AvoidingSpikeStick = { IsGameEnd = false; bIsInGame = false; -- 给玩家结算添加的得分{[PlayerKey] = AddScore, ...} PlayerAddScore = {}; SpikeStickPath = UGCGameSystem.GetUGCResourcesFullPath('Asset/Blueprint/MiniLevelActor/AvoidingSpikeStick/BP_AvoidingSpikeStick.BP_AvoidingSpikeStick_C'); -- 淘汰的玩家 EliminatePlayer = {}; AddScore = 1; JumpScale = 1; PlayerGravityScale = 1; bOnePlayerFinishGame = true; DeadPC = {}; } --- 游戏初始化 function MiniGameMode_AvoidingSpikeStick:Init() UGCLogSystem.Log("[MiniGameMode_AvoidingSpikeStick_Init]") self.SpikeStick = UGCSystemLibrary.GetUniqueInstanceFromPath(self.SpikeStickPath) self.JumpScale = MiniGameConfig.MiniGameInfo[MiniGameConfig.MiniGameType.AvoidingSpikeStick].GameParam.JumpVelocityScale self.PlayerGravityScale = MiniGameConfig.MiniGameInfo[MiniGameConfig.MiniGameType.AvoidingSpikeStick].GameParam.GravityScale self.bOnePlayerFinishGame = MiniGameConfig.MiniGameInfo[MiniGameConfig.MiniGameType.AvoidingSpikeStick].GameParam.bOnePlayerFinishGame UGCLogSystem.Log("[MiniGameMode_AvoidingSpikeStick_Init] JumpScale:%s", tostring(self.JumpScale)) UGCEventSystem.AddListener(EventEnum.StickOverlapPlayer, self.StickOverlapPlayer, self) UGCEventSystem.AddListener(EventEnum.PlayerDropMiniGameKillBox, self.PlayerDropKillBox, self) end --- 准备时间结束游戏开始 function MiniGameMode_AvoidingSpikeStick:GameBegin() self.bIsInGame = true -- 二次赋值 if not UE.IsValid(self.SpikeStick) then self.SpikeStick = UGCSystemLibrary.GetUniqueInstanceFromPath(self.SpikeStickPath) end if UE.IsValid(self.SpikeStick) then self.SpikeStick:StartPlay() else UGCLogSystem.LogError("[MiniGameMode_AvoidingSpikeStick_GameBegin] SpikeStick is nil") self:SetMiniGameModeEnd() end end function MiniGameMode_AvoidingSpikeStick:Update(DeltaTime) -- 判断该玩法是否已结束 if self.IsGameEnd then return end -- Update逻辑 -- 判断是否有玩家退出且场景没有玩家 if self.bIsInGame then if self.LastCheckAliveTime == nil then self.LastCheckAliveTime = 0 end self.LastCheckAliveTime = self.LastCheckAliveTime + DeltaTime if self.LastCheckAliveTime >= 2 then self.LastCheckAliveTime = 0 if UGCSystemLibrary.GetAlivePlayerCount() <= 1 then self:SetMiniGameModeEnd() end end end -- Update逻辑 End end --- 设置游戏结束,手动触发会结束该玩法,倒计时结束将自动触发该函数 function MiniGameMode_AvoidingSpikeStick:SetMiniGameModeEnd() if not self.IsGameEnd then self.IsGameEnd = true self:MiniGameEnd() end end --- 获取当前回合游戏结算, ---@return "{[PlayerKey] = AddScore, ...}" function MiniGameMode_AvoidingSpikeStick:GetPlayerAddScore() return self.PlayerAddScore end --- 外层调用,判断该玩法是否已结束 function MiniGameMode_AvoidingSpikeStick:CheckGameFinish() return self.IsGameEnd end --- 内部作用,判断玩法是否结束函数 function MiniGameMode_AvoidingSpikeStick:CheckGameIsFinish_InternalCall() local AllPC = UGCGameSystem.GetAllPlayerController() local AliveNum = 0 for i, v in pairs(AllPC) do if self.DeadPC[v.PlayerKey] == nil then AliveNum = AliveNum + 1 end end if AliveNum <= (GlobalConfigs.IsDebug and 0 or 1) then return true else return false end end --- 结束触发 function MiniGameMode_AvoidingSpikeStick:MiniGameEnd() if UE.IsValid(self.SpikeStick) then self.SpikeStick:StopPlay() -- 给存活玩家+4分 for i, v in pairs(UGCGameSystem.GetAllPlayerController()) do if self.PlayerAddScore[v.PlayerKey] == nil then self.PlayerAddScore[v.PlayerKey] = 4 end end else UGCLogSystem.LogError("[MiniGameMode_DigitalTrap_MiniGameEnd] SpikeStick is nil") end UGCGameSystem.GameState:SetPlayerMiniGameScore(self.PlayerAddScore) local MaxGameTime = MiniGameConfig.MiniGameInfo[MiniGameConfig.MiniGameType.AvoidingSpikeStick].MaxGameTime local AllPP = UGCGameSystem.GetAllPlayerPawn() for i, v in pairs(AllPP) do if v:IsAlive() then MiniGameConfig.CheckPlayerTask(v.PlayerKey, MiniGameConfig.MiniGameType.AvoidingSpikeStick, MaxGameTime - UGCGameSystem.GameState:GetGameTime(), false) end end UGCEventSystem.RemoveListener(EventEnum.StickOverlapPlayer, self.StickOverlapPlayer, self) UGCEventSystem.RemoveListener(EventEnum.PlayerDropMiniGameKillBox, self.PlayerDropKillBox, self) end ------------------------------------------ Player ------------------------------------------ --- 玩家死亡 function MiniGameMode_AvoidingSpikeStick:PlayerDead(VictimKey, CauserKey, WeaponID, DamageType, IsHeadShotDamage, Distance, DamageValue, Assister) end --- 玩家伤害修改 function MiniGameMode_AvoidingSpikeStick:PlayerDamageModify(DamageAmount, VictimPawn, CauserPC) if CauserPC ~= UGCGameSystem.GetControllerByPawn(VictimPawn) then return 0. end return DamageAmount end --- 玩家受控时 function MiniGameMode_AvoidingSpikeStick:PlayerPossessed(PlayerKey) end --- 玩家BeginPlay触发 function MiniGameMode_AvoidingSpikeStick:PlayerBeginPlay(PlayerPawn) PlayerPawn:SetCustomJumpZVelocity(443 * self.JumpScale) PlayerPawn:SetGravityScale(self.PlayerGravityScale) UGCEventSystem.SetTimer(UGCGameSystem.GameState, function() if UE.IsValid(PlayerPawn) then PlayerPawn:SetGravityScale(self.PlayerGravityScale) PlayerPawn:SetCustomJumpZVelocity(443 * self.JumpScale) UGCLogSystem.Log("[MiniGameMode_AvoidingSpikeStick_PlayerBeginPlay]") end end, 1) end ---------------------------------------- Player End ---------------------------------------- function MiniGameMode_AvoidingSpikeStick:StickOverlapPlayer(PlayerKey) if not self:CheckPlayerEliminated(PlayerKey) then local PlayerPawn = UGCGameSystem.GetPlayerPawnByPlayerKey(PlayerKey) if PlayerPawn then UGCLogSystem.Log("[MiniGameMode_AvoidingSpikeStick_StickOverlapPlayer]") UGCSendRPCSystem.ActorRPCNotify(nil, self.SpikeStick, "ClientHitPlayerEffect", VectorHelper.ToLuaTable(PlayerPawn:K2_GetActorLocation())) end self:PlayerEliminate(PlayerKey) end end function MiniGameMode_AvoidingSpikeStick:PlayerDropKillBox(PlayerKey) if not self:CheckPlayerEliminated(PlayerKey) then self:PlayerEliminate(PlayerKey) end end function MiniGameMode_AvoidingSpikeStick:PlayerEliminate(PlayerKey) self.DeadPC[PlayerKey] = 1 self.EliminatePlayer[#self.EliminatePlayer + 1] = PlayerKey self.PlayerAddScore[PlayerKey] = self.AddScore self.AddScore = self.AddScore + 1 local PC = UGCGameSystem.GetPlayerControllerByPlayerKey(PlayerKey) local PP = UGCGameSystem.GetPlayerPawnByPlayerKey(PlayerKey) --if PP then -- PP:K2_DestroyActor() --end -- UGCGameSystem.ApplyDamage(PP, 999, PC, PP, EDamageType.GiveUp) if UE.IsValid(PP) then UGCPawnAttrSystem.SetHealth(PP, -1) end if PC then -- UGCSendRPCSystem.ActorRPCNotify(PlayerKey, PC, "BlendToGodCamera") PC:Server_SetSceneCamera(true) end if self:CheckGameIsFinish_InternalCall() then self:SetMiniGameModeEnd() end local MaxGameTime = MiniGameConfig.MiniGameInfo[MiniGameConfig.MiniGameType.AvoidingSpikeStick].MaxGameTime MiniGameConfig.CheckPlayerTask(PlayerKey, MiniGameConfig.MiniGameType.AvoidingSpikeStick, MaxGameTime - UGCGameSystem.GameState:GetGameTime(), false) end function MiniGameMode_AvoidingSpikeStick:CheckPlayerEliminated(PlayerKey) return table.hasValue(self.EliminatePlayer, PlayerKey) end return MiniGameMode_AvoidingSpikeStick