UGCProjects/AthleticMasters/Script/Global/MiniGame/MiniGameMode/MiniGameMode_ShootingTarget.lua
2025-01-04 23:00:19 +08:00

168 lines
5.8 KiB
Lua

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