local MiniGameMode_ShootingTarget = { IsGameEnd = false; -- 给玩家结算添加的得分{[PlayerKey] = AddScore, ...} PlayerAddScore = {}; -- 目标得分 -- TargetHitScore = 50; -- 玩家当前击靶得分 MiniGameScore = {}; -- 玩家完成目标的时间{[PlayerKey] = Time, ...} PlayerFinishMiniGameTime = {}; LastUpdatePlayerScoreTime = 0.; PlayerScoreIsChange = false; RespawnList = {}; LastCheckPlayerBackPack = 0.; bIsInGame = false; } function MiniGameMode_ShootingTarget:Init() self.PlayerGravityScale = MiniGameConfig.MiniGameInfo[MiniGameConfig.MiniGameType.ShootingTarget].GameParam.GravityScale self.JumpScale = MiniGameConfig.MiniGameInfo[MiniGameConfig.MiniGameType.ShootingTarget].GameParam.JumpVelocityScale UGCEventSystem.AddListener(EventEnum.ShootingTargetAddScore, self.ShootingTargetAddScore, self) self.DefaultBackPack = MiniGameConfig.MiniGameInfo[MiniGameConfig.MiniGameType.ShootingTarget].GameParam.DefaultBackPack local AllPC = UGCGameSystem.GetAllPlayerController() for i, PC in pairs(AllPC) do self.MiniGameScore[PC.PlayerKey] = 0 end UGCSendRPCSystem.RPCEvent(nil, EventEnum.UpdateMiniGameAllPlayerScore, self.MiniGameScore) end function MiniGameMode_ShootingTarget:GameBegin() self.bIsInGame = true end function MiniGameMode_ShootingTarget:Update(DeltaTime) -- 判断该玩法是否已结束 if self.IsGameEnd then return end -- Update逻辑 ---- 更新玩家得分 --self.LastUpdatePlayerScoreTime = self.LastUpdatePlayerScoreTime + DeltaTime ---- 这里做了个减少RPC发送频率的处理 --if self.PlayerScoreIsChange and self.LastUpdatePlayerScoreTime >= 0.2 then -- self.LastUpdatePlayerScoreTime = 0. -- self.PlayerScoreIsChange = false -- UGCSendRPCSystem.RPCEvent(nil, EventEnum.UpdateMiniGameAllPlayerScore, self.MiniGameScore) --end -- 验证背包 self.LastCheckPlayerBackPack = self.LastCheckPlayerBackPack + DeltaTime if self.LastCheckPlayerBackPack >= 1. then self.LastCheckPlayerBackPack = 0. self:CheckBackPack() end -- Update逻辑 End end --- 设置游戏结束,手动触发会结束该玩法,倒计时结束将自动触发该函数 function MiniGameMode_ShootingTarget:SetMiniGameModeEnd() if not self.IsGameEnd then self.IsGameEnd = true self:MiniGameEnd() end end --- 获取当前回合游戏结算, ---@return "{[PlayerKey] = AddScore, ...}" function MiniGameMode_ShootingTarget:GetPlayerAddScore() return self.PlayerAddScore end --- 外层调用,判断该玩法是否已结束 function MiniGameMode_ShootingTarget:CheckGameFinish() return self.IsGameEnd end --- 结束触发 function MiniGameMode_ShootingTarget:MiniGameEnd() for i, v in pairs(self.RespawnList) do UGCEventSystem.StopTimer(v) end self.RespawnList = {} self.PlayerAddScore = UGCGameSystem.GameState:GetPlayerMiniGameAddScore() UGCEventSystem.RemoveListener(EventEnum.ShootingTargetAddScore, self.ShootingTargetAddScore, self) end --- 玩家BeginPlay触发 function MiniGameMode_ShootingTarget:PlayerBeginPlay(PlayerPawn) PlayerPawn:SetGravityScale(self.PlayerGravityScale) PlayerPawn:SetCustomJumpZVelocity(443 * self.JumpScale) UGCEventSystem.SetTimer(UGCGameSystem.GameState, function() if UE.IsValid(PlayerPawn) then PlayerPawn:SetGravityScale(self.PlayerGravityScale) PlayerPawn:SetCustomJumpZVelocity(443 * self.JumpScale) UGCLogSystem.Log("[MiniGameMode_ShootingTarget_PlayerBeginPlay]") end end, 1) end ------------------------------------------ Player ------------------------------------------ function MiniGameMode_ShootingTarget:PlayerDead(VictimKey, CauserKey, WeaponID, DamageType, IsHeadShotDamage, Distance, DamageValue, Assister) -- 判断死者是否有分 local VictimScore = UGCGameSystem.GameState:GetPlayerMiniGameScore(VictimKey) if VictimScore then -- 抢夺被杀者部分积分 local SnatchScore = math.ceil(VictimScore * MiniGameConfig.MiniGameInfo[MiniGameConfig.MiniGameType.ShootingTarget].GameParam.SnatchRate) self:ShootingTargetAddScore(VictimKey, -SnatchScore) self:ShootingTargetAddScore(CauserKey, SnatchScore) end -- 复活死者 self.RespawnList[VictimKey] = UGCEventSystem.SetTimer(UGCGameSystem.GameState, function() self.RespawnList[VictimKey] = nil if not self.IsGameEnd then UGCGameSystem.RespawnPlayer(VictimKey) UGCLogSystem.Log("[MiniGameMode_ShootingTarget_PlayerDead] RespawnPlayer") end end, MiniGameConfig.MiniGameInfo[MiniGameConfig.MiniGameType.ShootingTarget].GameParam.RespawnTime ) end function MiniGameMode_ShootingTarget:PlayerDamageModify(DamageAmount, VictimPawn, CauserPC) return DamageAmount end function MiniGameMode_ShootingTarget:PlayerPossessed(PlayerPawn, Controller) end ---------------------------------------- Player End ---------------------------------------- function MiniGameMode_ShootingTarget:ShootingTargetAddScore(PlayerKey, AddScore) if self.bIsInGame then UGCGameSystem.GameState:PlayerAddMiniGameScore(PlayerKey, AddScore) MiniGameConfig.CheckPlayerTask(PlayerKey, MiniGameConfig.MiniGameType.ShootingTarget, UGCGameSystem.GameState:GetPlayerMiniGameScore(PlayerKey), false) end end --- 验证背包 function MiniGameMode_ShootingTarget: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 return MiniGameMode_ShootingTarget