UGCProjects/GZJ/Script/Manager/GameEndManager.lua

271 lines
10 KiB
Lua
Raw Permalink Normal View History

2025-01-08 22:46:12 +08:00
GameEndManager = LuaClass("GameEndManager")
GameEndManager.HasTriggered = false
function GameEndManager:Init()
self.HasTriggered = false
EventSystem:AddListener(EventType.OnSendGameEnd, GameEndManager.OnReceiveGameEnd, self)
end
function GameEndManager:OnReceiveGameEnd(EndReason)
if self.HasTriggered then
return
end
self.HasTriggered = true
local GameState = UGCGameSystem.GameState
GameState.GameStage = EGameStage.GameEnd
GameState.GameEndTimeStamp = GameplayStatics.GetRealTimeSeconds(GameState)
local NoticeStr = ""
if EndReason == "LastBossDefeated" then
GameState:SetIsGameWin(true)
NoticeStr = "已击败最终首领,游戏胜利!"
elseif EndReason == "TimeOut" then
GameState:SetIsGameWin(false)
NoticeStr = "时间已耗尽,游戏失败!"
elseif EndReason == "ChickenDead" then
GameState:SetIsGameWin(false)
NoticeStr = "光子鸡被击败,游戏结束!"
elseif EndReason == "AllPlayerExited" then
GameState:SetIsGameWin(false)
NoticeStr = "所有玩家已退出游戏,游戏自动结算!"
end
NoticeTipsTools.MulticastGeneralNoticeTips(NoticeStr, true, 3.0)
UE.Log("[GameEndManager][OnReceiveGameEnd] NoticeStr: %s", NoticeStr)
self:ClearAllMonsters()
self:SendGameResultData()
self:SendUGCModeBattleResult()
UGCGameSystem.SendModeCustomEvent("GameEnd")
end
function GameEndManager:ClearAllMonsters()
local GameState = UGCGameSystem.GameState
if not GameState then
return
end
local AllSpawners = GameState:GetAllSpawners()
for _, Spawner in pairs(AllSpawners) do
local SpawnedMonsters = Spawner.SpawnedMonsters
for _, Monster in pairs(SpawnedMonsters) do
if Monster ~= nil and UE.IsValid(Monster) and Monster:IsAlive() then
Monster:K2_DestroyActor()
end
end
Spawner.SpawnedMonsters = {}
Spawner.IsActivate = false
end
end
--发送游戏结算
function GameEndManager:SendGameResultData()
print(string.format("[GameEndManager:SendGameResultData] 执行"))
local GameState = UGCGameSystem.GameState
if not GameState then
return false
end
local GameResultData = {};
GameResultData.IsWin = GameState:GetIsGameWin()
GameResultData.GameDifficulty = GameState.GameDifficulty
GameResultData.GameDuration = GameState:GetGameDuration()
GameResultData.PlayerResultDatas = {}
SoundManager.MulticastPlaySound2D(GameResultData.IsWin and 1 or 2)
local GameTotalDamage = 0.0
for PlayerKey, DamageInfoList in pairs(UGCGameSystem.GameState.PlayerDamageList) do
for BossID, DamageValue in pairs(DamageInfoList) do
GameTotalDamage = GameTotalDamage + DamageValue
end
end
local PlayerStates = UGCGameSystem.GetAllPlayerState(false);
UE.Log("[GameEndManager][SendGameResultData] PlayerState Count=%d", table.getCount(PlayerStates))
--获取所有玩家信息并汇总
for i, PlayerState in ipairs(PlayerStates) do
if PlayerState then
print(string.format('[GameEndManager][SendGameResultData] 序号: %d', i))
local PlayerResultData = {}
local PlayerGlobalSaveData = {}
PlayerResultData.UID = PlayerState.UID
PlayerResultData.PlayerKey = PlayerState.PlayerKey
PlayerResultData.PlayerName = PlayerState.PlayerName
PlayerResultData.Level = PlayerState.Level
PlayerResultData.CombatPoint = PlayerState.CombatPoint
PlayerResultData.Gender = PlayerState.PlatformGender
-- 计算 PlayerState里面的存档数据
PlayerGlobalSaveData.UID = PlayerState.UID
PlayerState.ArchiveData.GameTimes = PlayerState.ArchiveData.GameTimes + 1
-- 判断一下当前有多少个技能
local PC = UGCGameSystem.GetPlayerControllerByPlayerKey(PlayerState.PlayerKey)
--local AddCount = 0;
--log_tree(string.format("[Action_GameEnd:SendGameResultData] PlayerKey = %d PC.ItemMap[5] = ", PlayerState.PlayerKey), PC.ItemMap[5])
--for c, v in pairs(PC.ItemMap[5]) do
-- if GetItemQualityLevel(c) == EQualityType.Super then
-- AddCount = AddCount + v;
-- end
--end
-- 判断当前装备了几个技能
--local Pawn = UGCGameSystem.GetPlayerPawnByPlayerKey(PlayerState.PlayerKey);
-- Slot: SkillInst
--log_tree(string.format("[Action_GameEnd:SendGameResultData] PlayerKey = %d Pawn.SkillSystemComponent.SlotToSkillList = ", PlayerState.PlayerKey), Pawn.SkillSystemComponent.SlotToSkillList)
--for k, v in pairs(Pawn.SkillSystemComponent.SlotToSkillList) do
-- if v.SkillLevel - 1 == EQualityType.Super then
-- AddCount = AddCount + 1
-- end
--end
--PlayerState.ArchiveData.TotalSuperSkill = PlayerState.ArchiveData.TotalSuperSkill + AddCount;
-- 阉割版
if GameResultData.IsWin then
-- 阉割版
--PlayerState.ArchiveData.GameClearanceTimes = PlayerState.ArchiveData.GameClearanceTimes + 1
PlayerResultData.Score = 10 + GameState.GameDifficulty * 1
-- 此处计算游戏通关掉落
-- 阉割版
if PlayerState.ArchiveData.GameDropItems == nil then
PlayerState.ArchiveData.GameDropItems = {}
PlayerState.ArchiveData.GameDropItems[GameState.GameDifficulty] = {}
end
-- 遍历查找对应数据
local NextDropIndex = 0
local TotalCount = table.getCount(PlayerState.ArchiveData.GameDropItems[GameState.GameDifficulty])
local Temp = {1, 2, 3, 4, 5}
if TotalCount > 0 then
if TotalCount >= 5 then
NextDropIndex = 6 -- 表示掉落碎片
Temp = {}
else
if table.getCount(PlayerState.ArchiveData.GameDropItems[GameState.GameDifficulty]) == 5 then
-- 说明已经满了
NextDropIndex = 6;
else
local RemovePos = {}
for d, v in pairs(PlayerState.ArchiveData.GameDropItems[GameState.GameDifficulty]) do
table.insert(RemovePos, d)
end
for c = 1, #RemovePos, -1 do
table.remove(Temp, RemovePos[c]);
end
end
end
end
if NextDropIndex == 0 then
NextDropIndex = Temp[math.random(1, #Temp)]
if PlayerState.ArchiveData.GameDropItems[GameState.GameDifficulty] == nil then
PlayerState.ArchiveData.GameDropItems[GameState.GameDifficulty] = {}
end
PlayerState.ArchiveData.GameDropItems[GameState.GameDifficulty][NextDropIndex] = 1
else
if PlayerState.ArchiveData.GameDropItems[GameState.GameDifficulty][NextDropIndex] == nil then
PlayerState.ArchiveData.GameDropItems[GameState.GameDifficulty][NextDropIndex] = 1
else
PlayerState.ArchiveData.GameDropItems[GameState.GameDifficulty][NextDropIndex] = 1 + PlayerState.ArchiveData.GameDropItems[GameState.GameDifficulty][NextDropIndex]
end
end
log_tree("[GameEndManager:SendGameResultData] PlayerState.ArchiveData = ", PlayerState.ArchiveData);
else
print(string.format("[GameEndManager][SendGameResultData] 游戏输了"))
-- 失败积分
PlayerResultData.Score = PlayerState.KillCount.Boss * 2
end
print(string.format('[GameEndManager][SendGameResultData] 开始记录存档数据'))
PlayerState.ArchiveData.Score = PlayerResultData.Score + PlayerState.ArchiveData.Score;
PlayerState.ArchiveData.TotalCoinPoint = PlayerState.ArchiveData.TotalCoinPoint + PlayerState.CoinPoint.Total
PlayerState.ArchiveData.TotalKillPoint = PlayerState.ArchiveData.TotalKillPoint + PlayerState.KillPoint.Total
PlayerState.ArchiveData.GameTimes = PlayerState.ArchiveData.GameTimes + 1
if GameResultData.IsWin then
if PlayerState.ArchiveData.PlayedGames[GameState.GameDifficulty] == nil then
PlayerState.ArchiveData.PlayedGames[GameState.GameDifficulty] = 0
end
PlayerState.ArchiveData.PlayedGames[GameState.GameDifficulty] = PlayerState.ArchiveData.PlayedGames[GameState.GameDifficulty] + 1
ArchiveTable.Funcs[ArchiveTable.ArchiveType.EasterEggs](PlayerState, 2);
end
-- 判断一下一共有多少个通关的
local Times = 0;
for c, v in pairs(PlayerState.ArchiveData.PlayedGames) do
Times = Times + v;
end
PlayerState.ArchiveData.GameClearanceTimes = Times;
local TotalDamage = 0.0
local DamageInfoList = UGCGameSystem.GameState.PlayerDamageList[PlayerState.PlayerKey]
for BossID, DamageValue in pairs(DamageInfoList) do
TotalDamage = TotalDamage + DamageValue
end
-- TODO: 临时数据
PlayerResultData.IsMVP = false
PlayerResultData.TotalDamage = TotalDamage
PlayerResultData.DamagePercent = GameTotalDamage > 0 and TotalDamage / GameTotalDamage or 0
if GameResultData.IsWin then
ArchiveTable.Funcs[ArchiveTable.ArchiveType.EasterEggs](PlayerState, 5, PlayerResultData.DamagePercent)
ArchiveTable.Funcs[ArchiveTable.ArchiveType.EasterEggs](PlayerState, 8)
end
log_tree("[GameEndManager][SendGameResultData] PlayerState.ArchiveData = ", PlayerState.ArchiveData)
table.insert(GameResultData.PlayerResultDatas, PlayerResultData);
-- 同步一下属性
UnrealNetwork.CallUnrealRPC(PC, PC, "Client_UpdateArchiveData", PlayerState.ArchiveData);
else
UE.Log("[GameEndManager][SendGameResultData] Error: PlayerState is nil!")
end
end
table.sort(GameResultData.PlayerResultDatas,function(a,b) return a.DamagePercent > b.DamagePercent end)
if GameResultData.IsWin then
GameResultData.PlayerResultDatas[1].IsMVP = true
-- 积分
GameResultData.PlayerResultDatas[1].Score = GameResultData.PlayerResultDatas[1].Score + 2
local PS = UGCGameSystem.GetPlayerStateByUID(GameResultData.PlayerResultDatas[1].UID)
PS.ArchiveData.Score = PS.ArchiveData.Score + 2
end
-- 保存玩家数据到云端
GameState:SavePlayersData(nil)
GameState.GameResultData = GameResultData
UnrealNetwork.RepLazyProperty(UGCGameSystem.GameState, "GameResultData")
--EventSystem:SendEvent(EventType.GameEnd, GameResultData);
UnrealNetwork.CallUnrealRPC_Multicast(UGCGameSystem.GameState ,"Client_MulticastRPC_SendEvent", EventType.GameEnd, GameResultData);
end
--UGC模式结算发送至后台记录
function GameEndManager:SendUGCModeBattleResult()
local PlayerStates = UGCGameSystem.GetAllPlayerState(false)
UE.Log("[GameEndManager][SendUGCModeBattleResult] #PlayerStates[%d]", #PlayerStates)
for i, PlayerState in ipairs(PlayerStates) do
if PlayerState then
UGCGameSystem.SendPlayerSettlement(PlayerState.PlayerKey);
else
UE.Log("[GameEndManager][SendUGCModeBattleResult] Error: PlayerState is nil!")
end
end
end
return GameEndManager;