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