From 95e3925db11cf9f6ca6b24e28ee0ef8652f0a35f Mon Sep 17 00:00:00 2001 From: eugene-hong <58686228+eugene-doobu@users.noreply.github.com> Date: Tue, 25 Jun 2024 14:58:04 +0900 Subject: [PATCH] fix refresh inventory after arena --- .../_Scripts/Blockchain/ActionHandler.cs | 15 ----- .../Blockchain/ActionRenderHandler.cs | 57 +++++++++---------- nekoyume/Assets/_Scripts/Game/Battle/Arena.cs | 1 + 3 files changed, 27 insertions(+), 46 deletions(-) diff --git a/nekoyume/Assets/_Scripts/Blockchain/ActionHandler.cs b/nekoyume/Assets/_Scripts/Blockchain/ActionHandler.cs index 08212a5538f..93473aeee04 100644 --- a/nekoyume/Assets/_Scripts/Blockchain/ActionHandler.cs +++ b/nekoyume/Assets/_Scripts/Blockchain/ActionHandler.cs @@ -250,21 +250,6 @@ await UpdateCurrentAvatarStateAsync( } } - protected async UniTask UpdateCurrentAvatarStateAsync() - { - var avatarAddress = States.Instance.CurrentAvatarState.address; - var avatars = - await Game.Game.instance.Agent.GetAvatarStatesAsync(new[] { avatarAddress }); - if (avatars.TryGetValue(avatarAddress, out var avatarState)) - { - await UpdateCurrentAvatarStateAsync(avatarState); - } - else - { - NcDebug.LogError($"Failed to get AvatarState: {avatarAddress}"); - } - } - protected static void UpdateCurrentAvatarInventory(ActionEvaluation eval) where T : ActionBase { diff --git a/nekoyume/Assets/_Scripts/Blockchain/ActionRenderHandler.cs b/nekoyume/Assets/_Scripts/Blockchain/ActionRenderHandler.cs index 954aae7d283..97cfdeabbc7 100644 --- a/nekoyume/Assets/_Scripts/Blockchain/ActionRenderHandler.cs +++ b/nekoyume/Assets/_Scripts/Blockchain/ActionRenderHandler.cs @@ -2683,22 +2683,24 @@ private async void ResponseBattleArenaAsync(ActionEvaluation eval) await UniTask.WhenAll(RxProps.ArenaInfoTuple.UpdateAsync(eval.OutputState), RxProps.ArenaInformationOrderedWithScore.UpdateAsync(eval.OutputState)); + void OnBattleEnd() + { + UpdateAgentStateAsync(eval).Forget(); + UpdateCurrentAvatarStateAsync(eval).Forget(); + // TODO!!!! [`PlayersArenaParticipant`]를 개별로 업데이트 한다. + // RxProps.PlayersArenaParticipant.UpdateAsync().Forget(); + _disposableForBattleEnd = null; + Game.Game.instance.Arena.IsAvatarStateUpdatedAfterBattle = true; + } + _disposableForBattleEnd?.Dispose(); _disposableForBattleEnd = Game.Game.instance.Arena.OnArenaEnd .First() .Subscribe(_ => { - UniTask.Run(() => - { - UpdateAgentStateAsync(eval).Forget(); - UpdateCurrentAvatarStateAsync().Forget(); - // TODO!!!! [`PlayersArenaParticipant`]를 개별로 업데이트 한다. - // RxProps.PlayersArenaParticipant.UpdateAsync().Forget(); - _disposableForBattleEnd = null; - Game.Game.instance.Arena.IsAvatarStateUpdatedAfterBattle = true; - }).ToObservable() + UniTask.RunOnThreadPool(OnBattleEnd) + .ToObservable() .First() - // ReSharper disable once ConvertClosureToMethodGroup .DoOnError(e => NcDebug.LogException(e)); }); @@ -2726,17 +2728,9 @@ await UniTask.WhenAll(RxProps.ArenaInfoTuple.UpdateAsync(eval.OutputState), .First() .Subscribe(_ => { - UniTask.RunOnThreadPool(() => - { - UpdateAgentStateAsync(eval).Forget(); - UpdateCurrentAvatarStateAsync().Forget(); - // TODO!!!! [`PlayersArenaParticipant`]를 개별로 업데이트 한다. - // RxProps.PlayersArenaParticipant.UpdateAsync().Forget(); - _disposableForBattleEnd = null; - Game.Game.instance.Arena.IsAvatarStateUpdatedAfterBattle = true; - }, configureAwait: false).ToObservable() + UniTask.RunOnThreadPool(OnBattleEnd, configureAwait: false) + .ToObservable() .First() - // ReSharper disable once ConvertClosureToMethodGroup .DoOnError(e => NcDebug.LogException(e)); }); previousMyScore = StateGetter.TryGetArenaScore( @@ -2761,7 +2755,6 @@ await UniTask.WhenAll(RxProps.ArenaInfoTuple.UpdateAsync(eval.OutputState), enemyCollectionState = StateGetter.GetCollectionState(eval.OutputState, eval.Action.enemyAvatarAddress); }).ToObservable().ObserveOnMainThread(); - prepareObserve.Subscribe(_ => { var hasMedalReward = @@ -2819,18 +2812,20 @@ await UniTask.WhenAll(RxProps.ArenaInfoTuple.UpdateAsync(eval.OutputState), rewards.AddRange(reward); } - if (arenaBattlePreparation && arenaBattlePreparation.IsActive()) + if (!arenaBattlePreparation || !arenaBattlePreparation.IsActive()) { - arenaBattlePreparation.OnRenderBattleArena(eval); - Game.Game.instance.Arena.Enter( - logs.First(), - rewards, - myDigest.Value, - enemyDigest.Value, - eval.Action.myAvatarAddress, - eval.Action.enemyAvatarAddress, - winCount + defeatCount > 1 ? (winCount, defeatCount) : null); + return; } + + arenaBattlePreparation.OnRenderBattleArena(eval); + Game.Game.instance.Arena.Enter( + logs.First(), + rewards, + myDigest.Value, + enemyDigest.Value, + eval.Action.myAvatarAddress, + eval.Action.enemyAvatarAddress, + winCount + defeatCount > 1 ? (winCount, defeatCount) : null); }); } diff --git a/nekoyume/Assets/_Scripts/Game/Battle/Arena.cs b/nekoyume/Assets/_Scripts/Game/Battle/Arena.cs index 2ada4f8387f..dd8c2af8076 100644 --- a/nekoyume/Assets/_Scripts/Game/Battle/Arena.cs +++ b/nekoyume/Assets/_Scripts/Game/Battle/Arena.cs @@ -46,6 +46,7 @@ public class Arena : MonoBehaviour, IArena public SkillController SkillController { get; private set; } public BuffController BuffController { get; private set; } + // Only Changed on Thread Pool public bool IsAvatarStateUpdatedAfterBattle { get; set; } public int TurnNumber => _turnNumber;