UGCProjects/GZJ/Script/gamemode/Action_GameEnd.lua

213 lines
8.0 KiB
Lua
Raw Normal View History

2025-01-08 22:46:12 +08:00
local Action_GameEnd = {
}
--Action_GameEnd.IsSetEnd = false;
function Action_GameEnd:Execute(...)
-- 只单纯执行一遍
--if self.IsSetEnd then
-- return true
--end
--self.IsSetEnd = false;
UE.Log("[Action_GameEnd:Execute]")
-- local GameState = UGCGameSystem.GameState
-- GameState.GameStage = EGameStage.GameEnd
-- self:SendGameResultData()
-- self:SendUGCModeBattleResult()
return true
end
--发送游戏结算
function Action_GameEnd: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("[Action_GameEnd:SendGameResultData] #PlayerStates[%d]", #PlayerStates)
local Func = function(Id)
return GetItemQualityLevel(Id)
end
--获取所有玩家信息并汇总
for i, PlayerState in ipairs(PlayerStates) do
if PlayerState then
print(string.format('[Action_GameEnd:SendGameResultData] 开始执行数据'))
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] = "), 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 = "), 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;
-- 阉割版
ArchiveTable.Funcs[ArchiveTable.ArchiveType.EasterEggs](PlayerState, 2)
if GameResultData.IsWin then
print(string.format("[Action_GameEnd:SendGameResultData] 赢游戏了"))
-- 阉割版
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
for d, v in pairs(PlayerState.ArchiveData.GameDropItems[GameState.GameDifficulty]) do
table.remove(Temp, d)
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
else
print(string.format("[Action_GameEnd:SendGameResultData] 游戏输了"))
-- 失败积分
PlayerResultData.Score = PlayerState.KillCount.Boss * 2
end
print(string.format('[Action_GameEnd:SendGameResultData] 开始记录存档数据'))
PlayerState.ArchiveData.Score = PlayerResultData.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
end
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
ArchiveTable.Funcs[ArchiveTable.ArchiveType.EasterEggs](PlayerState, 5, PlayerResultData.DamagePercent)
ArchiveTable.Funcs[ArchiveTable.ArchiveType.EasterEggs](PlayerState, 8)
log_tree("PlayerState.ArchiveData = ", PlayerState.ArchiveData)
table.insert(GameResultData.PlayerResultDatas, PlayerResultData);
else
UE.Log("[Action_GameEnd: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
print(string.format('[Action_GameEnd:SendGameResultData] 接下来执行'))
-- 保存玩家数据到云端
GameState:SavePlayersData(nil)
-- 对比玩家数据
--EventSystem:SendEvent(EventType.GameEnd, GameResultData);
print(string.format('[Action_GameEnd:SendGameResultData] 结束啦'))
UnrealNetwork.CallUnrealRPC_Multicast(UGCGameSystem.GameState ,"Client_MulticastRPC_SendEvent", EventType.GameEnd, GameResultData);
end
--UGC模式结算发送至后台记录
function Action_GameEnd:SendUGCModeBattleResult()
local PlayerStates = UGCGameSystem.GetAllPlayerState(false)
UE.Log("[Action_GameEnd:SendUGCModeBattleResult] #PlayerStates[%d]", #PlayerStates)
for i, PlayerState in ipairs(PlayerStates) do
if PlayerState then
UGCGameSystem.SendPlayerSettlement(PlayerState.PlayerKey);
else
UE.Log("[Action_GameEnd:SendUGCModeBattleResult] Error: PlayerState is nil!")
end
end
end
return Action_GameEnd