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

219 lines
7.9 KiB
Lua

---@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