From 72bc2510482f4c7b16e1ce5ca260d1163998eca1 Mon Sep 17 00:00:00 2001 From: Yang Chun Ung Date: Tue, 18 Jul 2023 17:44:26 +0900 Subject: [PATCH 01/16] Optimize QuestReward deserialize --- Lib9c/Model/Quest/QuestReward.cs | 17 ++++++++--------- Lib9c/Model/State/AvatarState.cs | 12 ++++++------ 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/Lib9c/Model/Quest/QuestReward.cs b/Lib9c/Model/Quest/QuestReward.cs index 3f21d31c8b..e9e291bbb7 100644 --- a/Lib9c/Model/Quest/QuestReward.cs +++ b/Lib9c/Model/Quest/QuestReward.cs @@ -10,29 +10,28 @@ namespace Nekoyume.Model.Quest [Serializable] public class QuestReward : IState { - public readonly Dictionary ItemMap; + public readonly IEnumerable> ItemMap; public QuestReward(Dictionary map) { - ItemMap = map - .ToDictionary(kv => kv.Key, kv => kv.Value - ); +#pragma warning disable LAA1002 + ItemMap = map.Select(kv => new Tuple(kv.Key, kv.Value)); } public QuestReward(Dictionary serialized) { - ItemMap = serialized.ToDictionary( - kv => kv.Key.ToInteger(), - kv => kv.Value.ToInteger() + ItemMap = serialized.Select( + kv => new Tuple(kv.Key.ToInteger(), kv.Value.ToInteger()) ); +#pragma warning restore LAA1002 } public IValue Serialize() => new Dictionary( #pragma warning disable LAA1002 ItemMap.Select(kv => new KeyValuePair( - (Text)kv.Key.ToString(CultureInfo.InvariantCulture), - (Text)kv.Value.ToString(CultureInfo.InvariantCulture) + (Text)kv.Item1.ToString(CultureInfo.InvariantCulture), + (Text)kv.Item2.ToString(CultureInfo.InvariantCulture) ) ) #pragma warning restore LAA1002 diff --git a/Lib9c/Model/State/AvatarState.cs b/Lib9c/Model/State/AvatarState.cs index 2504237c77..0e04e481b2 100644 --- a/Lib9c/Model/State/AvatarState.cs +++ b/Lib9c/Model/State/AvatarState.cs @@ -487,11 +487,11 @@ public void UpdateFromAddCostume(Costume costume, bool canceled) public void UpdateFromQuestReward(Quest.Quest quest, MaterialItemSheet materialItemSheet) { var items = new List(); - foreach (var pair in quest.Reward.ItemMap.OrderBy(kv => kv.Key)) + foreach (var pair in quest.Reward.ItemMap.OrderBy(kv => kv.Item1)) { - var row = materialItemSheet.OrderedList.First(itemRow => itemRow.Id == pair.Key); + var row = materialItemSheet.OrderedList.First(itemRow => itemRow.Id == pair.Item1); var item = ItemFactory.CreateMaterial(row); - var map = inventory.AddItem(item, count: pair.Value); + var map = inventory.AddItem(item, count: pair.Item2); itemMap.Add(map); items.Add(item); } @@ -506,11 +506,11 @@ public void UpdateFromQuestReward(Quest.Quest quest, MaterialItemSheet materialI public void UpdateFromQuestReward2(Quest.Quest quest, MaterialItemSheet materialItemSheet) { var items = new List(); - foreach (var pair in quest.Reward.ItemMap.OrderBy(kv => kv.Key)) + foreach (var pair in quest.Reward.ItemMap.OrderBy(kv => kv.Item1)) { - var row = materialItemSheet.OrderedList.First(itemRow => itemRow.Id == pair.Key); + var row = materialItemSheet.OrderedList.First(itemRow => itemRow.Id == pair.Item2); var item = ItemFactory.CreateMaterial(row); - var map = inventory.AddItem2(item, count: pair.Value); + var map = inventory.AddItem2(item, count: pair.Item2); itemMap.Add(map); items.Add(item); } From 487e382cd04dface3eaa2f77120ac39174ed8af3 Mon Sep 17 00:00:00 2001 From: Yang Chun Ung Date: Wed, 19 Jul 2023 15:08:15 +0900 Subject: [PATCH 02/16] Lazyload mail --- Lib9c/Model/Mail/Mail.cs | 48 ++++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/Lib9c/Model/Mail/Mail.cs b/Lib9c/Model/Mail/Mail.cs index 52b9595eb7..ea2f8777aa 100644 --- a/Lib9c/Model/Mail/Mail.cs +++ b/Lib9c/Model/Mail/Mail.cs @@ -106,7 +106,24 @@ public static Mail Deserialize(Dictionary serialized) [Serializable] public class MailBox : IEnumerable, IState { - private List _mails = new List(); + private List _serialized; + private List _deserialized; + + private List _mails + { + get + { + if (_deserialized is null) + { + _deserialized = _serialized.Select( + d => Mail.Deserialize((Dictionary)d) + ).ToList(); + _serialized = null; + } + + return _deserialized; + } + } public int Count => _mails.Count; @@ -118,9 +135,7 @@ public MailBox() public MailBox(List serialized) : this() { - _mails = serialized.Select( - d => Mail.Deserialize((Dictionary)d) - ).ToList(); + _serialized = serialized; } public IEnumerator GetEnumerator() @@ -140,9 +155,9 @@ public void Add(Mail mail) public void CleanUp() { - if (_mails.Count > 30) + if (_serialized is null || _serialized.Count > 30) { - _mails = _mails + _deserialized = _mails .OrderByDescending(m => m.blockIndex) .ThenBy(m => m.id) .Take(30) @@ -155,17 +170,14 @@ public void CleanUpV1() { if (_mails.Count > 30) { - _mails = _mails - .OrderByDescending(m => m.blockIndex) - .Take(30) - .ToList(); + _deserialized = _mails.OrderByDescending(m => m.blockIndex).Take(30).ToList(); } } [Obsolete("No longer in use.")] public void CleanUpTemp(long blockIndex) { - _mails = _mails + _deserialized = _mails .Where(m => m.requiredBlockIndex >= blockIndex) .ToList(); } @@ -175,8 +187,16 @@ public void Remove(Mail mail) _mails.Remove(mail); } - public IValue Serialize() => new List(_mails - .OrderBy(i => i.id) - .Select(m => m.Serialize())); + public IValue Serialize() + { + if (_serialized is null) + { + return new List(_mails + .OrderBy(i => i.id) + .Select(m => m.Serialize())); + } + + return _serialized; + } } } From 15f956789e23f7497f2ade7db143166deb7eb0a7 Mon Sep 17 00:00:00 2001 From: Yang Chun Ung Date: Wed, 19 Jul 2023 17:21:56 +0900 Subject: [PATCH 03/16] Fix QuestReward --- .Lib9c.Tests/Model/QuestRewardTest.cs | 19 ++++++++++--------- Lib9c/Model/State/AvatarState.cs | 2 +- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/.Lib9c.Tests/Model/QuestRewardTest.cs b/.Lib9c.Tests/Model/QuestRewardTest.cs index e35963da89..4902acadff 100644 --- a/.Lib9c.Tests/Model/QuestRewardTest.cs +++ b/.Lib9c.Tests/Model/QuestRewardTest.cs @@ -1,6 +1,8 @@ namespace Lib9c.Tests.Model { + using System; using System.Collections.Generic; + using System.Linq; using Bencodex.Types; using Nekoyume.Model.Quest; using Xunit; @@ -16,19 +18,18 @@ public void Serialize() [1] = 1, }); - Assert.Equal( - new Dictionary() - { - [1] = 1, - [2] = 1, - }, - reward.ItemMap - ); + var expected = new[] + { + new Tuple(1, 1), + new Tuple(2, 1), + }; + + Assert.Equal(expected.OrderBy(t => t.Item1), reward.ItemMap.OrderBy(t => t.Item1)); var serialized = reward.Serialize(); var des = new QuestReward((Dictionary)serialized); - Assert.Equal(reward.ItemMap, des.ItemMap); + Assert.Equal(reward.ItemMap.OrderBy(t => t.Item1), des.ItemMap.OrderBy(t => t.Item1)); Assert.Equal(serialized, des.Serialize()); } diff --git a/Lib9c/Model/State/AvatarState.cs b/Lib9c/Model/State/AvatarState.cs index 0e04e481b2..a9ff513a8a 100644 --- a/Lib9c/Model/State/AvatarState.cs +++ b/Lib9c/Model/State/AvatarState.cs @@ -508,7 +508,7 @@ public void UpdateFromQuestReward2(Quest.Quest quest, MaterialItemSheet material var items = new List(); foreach (var pair in quest.Reward.ItemMap.OrderBy(kv => kv.Item1)) { - var row = materialItemSheet.OrderedList.First(itemRow => itemRow.Id == pair.Item2); + var row = materialItemSheet.OrderedList.First(itemRow => itemRow.Id == pair.Item1); var item = ItemFactory.CreateMaterial(row); var map = inventory.AddItem2(item, count: pair.Item2); itemMap.Add(map); From 939c43cb45f4e1ab99d4e32f2e159e0ae938266a Mon Sep 17 00:00:00 2001 From: Yang Chun Ung Date: Wed, 19 Jul 2023 17:22:15 +0900 Subject: [PATCH 04/16] Delete legacy BinaryFormatter test --- .Lib9c.Tests/Model/ItemGradeQuestTest.cs | 9 --------- .Lib9c.Tests/Model/ItemTypeCollectQuestTest.cs | 9 --------- 2 files changed, 18 deletions(-) diff --git a/.Lib9c.Tests/Model/ItemGradeQuestTest.cs b/.Lib9c.Tests/Model/ItemGradeQuestTest.cs index 0e80f09075..4805814fe5 100644 --- a/.Lib9c.Tests/Model/ItemGradeQuestTest.cs +++ b/.Lib9c.Tests/Model/ItemGradeQuestTest.cs @@ -43,15 +43,6 @@ public void Serialize() var des = new ItemGradeQuest((Dictionary)quest.Serialize()); Assert.Equal(expected, des.ItemIds); - - var formatter = new BinaryFormatter(); - using var ms = new MemoryStream(); - formatter.Serialize(ms, quest); - - ms.Seek(0, SeekOrigin.Begin); - var deserialized = (ItemGradeQuest)formatter.Deserialize(ms); - - Assert.Equal(quest.ItemIds, deserialized.ItemIds); } } } diff --git a/.Lib9c.Tests/Model/ItemTypeCollectQuestTest.cs b/.Lib9c.Tests/Model/ItemTypeCollectQuestTest.cs index 77f920cc85..d89c74eaf1 100644 --- a/.Lib9c.Tests/Model/ItemTypeCollectQuestTest.cs +++ b/.Lib9c.Tests/Model/ItemTypeCollectQuestTest.cs @@ -43,15 +43,6 @@ public void Serialize() var des = new ItemTypeCollectQuest((Dictionary)quest.Serialize()); Assert.Equal(expected, des.ItemIds); - - var formatter = new BinaryFormatter(); - using var ms = new MemoryStream(); - formatter.Serialize(ms, quest); - - ms.Seek(0, SeekOrigin.Begin); - var deserialized = (ItemTypeCollectQuest)formatter.Deserialize(ms); - - Assert.Equal(quest.ItemIds, deserialized.ItemIds); } } } From 86434b8373eda7ec5e73c41eeacd7c586d44cf77 Mon Sep 17 00:00:00 2001 From: Yang Chun Ung Date: Wed, 19 Jul 2023 17:22:33 +0900 Subject: [PATCH 05/16] Fix mail lazyload --- Lib9c/Model/Mail/Mail.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Lib9c/Model/Mail/Mail.cs b/Lib9c/Model/Mail/Mail.cs index ea2f8777aa..e584f4ecdc 100644 --- a/Lib9c/Model/Mail/Mail.cs +++ b/Lib9c/Model/Mail/Mail.cs @@ -113,7 +113,7 @@ private List _mails { get { - if (_deserialized is null) + if (_serialized is { }) { _deserialized = _serialized.Select( d => Mail.Deserialize((Dictionary)d) @@ -131,6 +131,7 @@ private List _mails public MailBox() { + _deserialized = new List(); } public MailBox(List serialized) : this() From 8d5a71d3ca1d823173fd499b8f49b4c024c79180 Mon Sep 17 00:00:00 2001 From: Yang Chun Ung Date: Fri, 21 Jul 2023 09:28:24 +0900 Subject: [PATCH 06/16] Lazyload quest --- Lib9c/Model/Quest/Quest.cs | 88 +++++++++++++++++++++++++++++++------- 1 file changed, 72 insertions(+), 16 deletions(-) diff --git a/Lib9c/Model/Quest/Quest.cs b/Lib9c/Model/Quest/Quest.cs index 2d30d98972..5d0d34afef 100644 --- a/Lib9c/Model/Quest/Quest.cs +++ b/Lib9c/Model/Quest/Quest.cs @@ -42,13 +42,61 @@ public abstract class Quest : IState ["combinationEquipmentQuest"] = d => new CombinationEquipmentQuest(d), }; - public bool Complete { get; protected set; } + public bool Complete + { + get + { + if (_serializedComplete.HasValue) + { + _complete = _serializedComplete.Value; + _serializedComplete = null; + } - public int Goal { get; set; } + return _complete; + } + protected set => _complete = value; + } - public int Id { get; } + public int Goal { + get + { + if (_serializedGoal.HasValue) + { + _goal = _serializedGoal.Value; + _serializedGoal = null; + } - public QuestReward Reward { get; } + return _goal; + } + } + + public int Id + { + get + { + if (_serializedId.HasValue) + { + _id = _serializedId.Value; + _serializedId = null; + } + + return _id; + } + } + + public QuestReward Reward + { + get + { + if (_serializedReward is { }) + { + _reward = new QuestReward(_serializedReward); + _serializedReward = null; + } + + return _reward; + } + } /// /// 이미 퀘스트 보상이 액션에서 지급되었는가? @@ -58,12 +106,20 @@ public abstract class Quest : IState public virtual float Progress => (float) _current / Goal; public const string GoalFormat = "({0}/{1})"; + private Dictionary _serializedReward; + private QuestReward _reward; + private Bencodex.Types.Boolean? _serializedComplete; + private Integer? _serializedGoal; + private int _goal; + private Integer? _serializedId; + private int _id; + private bool _complete; protected Quest(QuestSheet.Row data, QuestReward reward) { - Id = data.Id; - Goal = data.Goal; - Reward = reward; + _id = data.Id; + _goal = data.Goal; + _reward = reward; } public abstract void Check(); @@ -71,12 +127,12 @@ protected Quest(QuestSheet.Row data, QuestReward reward) protected Quest(Dictionary serialized) { - Complete = ((Bencodex.Types.Boolean) serialized["complete"]).Value; - Goal = (int) ((Integer) serialized["goal"]).Value; - _current = (int) ((Integer) serialized["current"]).Value; - Id = (int) ((Integer) serialized["id"]).Value; - Reward = new QuestReward((Dictionary) serialized["reward"]); + _serializedComplete = (Bencodex.Types.Boolean) serialized["complete"]; + _serializedGoal = (Integer) serialized["goal"]; + _serializedId = (Integer) serialized["id"]; + _serializedReward = (Dictionary) serialized["reward"]; IsPaidInAction = serialized["isPaidInAction"].ToNullableBoolean() ?? false; + _current = (int) ((Integer) serialized["current"]).Value; } public abstract string GetProgressText(); @@ -84,11 +140,11 @@ protected Quest(Dictionary serialized) public virtual IValue Serialize() => Dictionary.Empty .Add("typeId", (Text) TypeId) - .Add("complete", new Bencodex.Types.Boolean(Complete)) - .Add("goal", (Integer) Goal) + .Add("complete", _serializedComplete ?? new Bencodex.Types.Boolean(Complete)) + .Add("goal", _serializedGoal ?? Goal) .Add("current", (Integer) _current) - .Add("id", (Integer) Id) - .Add("reward", Reward.Serialize()) + .Add("id", _serializedId ?? Id) + .Add("reward", _serializedReward ?? Reward.Serialize()) .Add("isPaidInAction", new Bencodex.Types.Boolean(IsPaidInAction)); public static Quest Deserialize(Dictionary serialized) From 9eacb1c182a2ff5b32fa4ce88fe51457ab3583cf Mon Sep 17 00:00:00 2001 From: Yang Chun Ung Date: Fri, 21 Jul 2023 10:20:27 +0900 Subject: [PATCH 07/16] Lazyload combination quests --- .../Model/Quest/CombinationEquipmentQuest.cs | 44 +++++++++++++++---- Lib9c/Model/Quest/CombinationQuest.cs | 44 +++++++++++++++---- 2 files changed, 72 insertions(+), 16 deletions(-) diff --git a/Lib9c/Model/Quest/CombinationEquipmentQuest.cs b/Lib9c/Model/Quest/CombinationEquipmentQuest.cs index 6868333bb0..84c7b80c28 100644 --- a/Lib9c/Model/Quest/CombinationEquipmentQuest.cs +++ b/Lib9c/Model/Quest/CombinationEquipmentQuest.cs @@ -10,20 +10,48 @@ namespace Nekoyume.Model.Quest { public class CombinationEquipmentQuest : Quest { - public readonly int RecipeId; - public readonly int StageId; + public int RecipeId + { + get + { + if (_serializedRecipeId is { }) + { + _recipeId = _serializedRecipeId.ToInteger(); + _serializedRecipeId = null; + } + + return _recipeId; + } + } + + public int StageId { + get + { + if (_serializedStageId is { }) + { + _stageId = _serializedStageId.ToInteger(); + _serializedStageId = null; + } + + return _stageId; + } + } + private IValue _serializedRecipeId; + private int _recipeId; + private IValue _serializedStageId; + private int _stageId; public CombinationEquipmentQuest(QuestSheet.Row data, QuestReward reward, int stageId) : base(data, reward) { var row = (CombinationEquipmentQuestSheet.Row) data; - RecipeId = row.RecipeId; - StageId = stageId; + _recipeId = row.RecipeId; + _stageId = stageId; } public CombinationEquipmentQuest(Dictionary serialized) : base(serialized) { - RecipeId = serialized["recipe_id"].ToInteger(); - StageId = serialized["stage_id"].ToInteger(); + _serializedStageId = serialized["stage_id"]; + _serializedRecipeId = serialized["recipe_id"]; } //임시처리. 새 타입을 만들어서 위젯에 띄워줘야합니다. @@ -59,8 +87,8 @@ public void Update(int recipeId) public override IValue Serialize() { return ((Dictionary) base.Serialize()) - .Add("recipe_id", RecipeId.Serialize()) - .Add("stage_id", StageId.Serialize()); + .Add("recipe_id", _serializedRecipeId ?? RecipeId.Serialize()) + .Add("stage_id", _serializedStageId ?? StageId.Serialize()); } } } diff --git a/Lib9c/Model/Quest/CombinationQuest.cs b/Lib9c/Model/Quest/CombinationQuest.cs index fbe9bbbc78..dbda55a5eb 100644 --- a/Lib9c/Model/Quest/CombinationQuest.cs +++ b/Lib9c/Model/Quest/CombinationQuest.cs @@ -11,22 +11,50 @@ namespace Nekoyume.Model.Quest [Serializable] public class CombinationQuest : Quest { - public readonly ItemType ItemType; - public readonly ItemSubType ItemSubType; + public ItemType ItemType + { + get + { + if (_serializedItemType is { }) + { + _itemType = (ItemType) (int) _serializedItemType; + _serializedItemType = null; + } + + return _itemType; + } + } + public ItemSubType ItemSubType + { + get + { + if (_serializedItemSubType is { }) + { + _itemSubType = (ItemSubType) (int) _serializedItemSubType; + _serializedItemSubType = null; + } + + return _itemSubType; + } + } + private Integer? _serializedItemType; + private ItemType _itemType; + private Integer? _serializedItemSubType; + private ItemSubType _itemSubType; public override QuestType QuestType => QuestType.Craft; public CombinationQuest(CombinationQuestSheet.Row data, QuestReward reward) : base(data, reward) { - ItemType = data.ItemType; - ItemSubType = data.ItemSubType; + _itemType = data.ItemType; + _itemSubType = data.ItemSubType; } public CombinationQuest(Dictionary serialized) : base(serialized) { - ItemType = (ItemType)(int)((Integer)serialized["itemType"]).Value; - ItemSubType = (ItemSubType)(int)((Integer)serialized["itemSubType"]).Value; + _serializedItemType = (Integer)serialized["itemType"]; + _serializedItemSubType = (Integer)serialized["itemSubType"]; } public override void Check() @@ -59,7 +87,7 @@ public void Update(List items) public override IValue Serialize() => ((Dictionary) base.Serialize()) - .Add("itemType", (int) ItemType) - .Add("itemSubType", (int) ItemSubType); + .Add("itemType", _serializedItemType ?? (int) ItemType) + .Add("itemSubType", _serializedItemSubType ?? (int) ItemSubType); } } From 4d7af57f94ac0bfd099210e2729b58c5d9e6e556 Mon Sep 17 00:00:00 2001 From: Yang Chun Ung Date: Fri, 21 Jul 2023 11:17:46 +0900 Subject: [PATCH 08/16] Lazyload market quest --- Lib9c/Model/Quest/GoldQuest.cs | 23 +++++++++++++++++++---- Lib9c/Model/Quest/TradeQuest.cs | 23 +++++++++++++++++++---- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/Lib9c/Model/Quest/GoldQuest.cs b/Lib9c/Model/Quest/GoldQuest.cs index da5e9a351c..4074b97377 100644 --- a/Lib9c/Model/Quest/GoldQuest.cs +++ b/Lib9c/Model/Quest/GoldQuest.cs @@ -12,17 +12,32 @@ namespace Nekoyume.Model.Quest [Serializable] public class GoldQuest : Quest { - public readonly TradeType Type; + public TradeType Type + { + get + { + if (_serializedType is { }) + { + _type = (TradeType) (int) _serializedType; + _serializedType = null; + } + + return _type; + } + } + private TradeType _type; + private Integer? _serializedType; + public GoldQuest(GoldQuestSheet.Row data, QuestReward reward) : base(data, reward) { - Type = data.Type; + _type = data.Type; } public GoldQuest(Dictionary serialized) : base(serialized) { - Type = (TradeType)(int)((Integer)serialized["type"]).Value; + _serializedType = (Integer) serialized["type"]; } public override QuestType QuestType => QuestType.Exchange; @@ -62,6 +77,6 @@ public void Update(FungibleAssetValue gold) public override IValue Serialize() => ((Dictionary) base.Serialize()) - .Add("type", (int) Type); + .Add("type", _serializedType ?? (int) Type); } } diff --git a/Lib9c/Model/Quest/TradeQuest.cs b/Lib9c/Model/Quest/TradeQuest.cs index 206697b9ca..13e5077c76 100644 --- a/Lib9c/Model/Quest/TradeQuest.cs +++ b/Lib9c/Model/Quest/TradeQuest.cs @@ -12,17 +12,32 @@ namespace Nekoyume.Model.Quest public class TradeQuest : Quest { public override QuestType QuestType => QuestType.Exchange; - public readonly TradeType Type; + + public TradeType Type + { + get + { + if (_serializedType is { }) + { + _type = (TradeType) (int) _serializedType; + _serializedType = null; + } + + return _type; + } + } + private TradeType _type; + private Integer? _serializedType; public TradeQuest(TradeQuestSheet.Row data, QuestReward reward) : base(data, reward) { - Type = data.Type; + _type = data.Type; } public TradeQuest(Dictionary serialized) : base(serialized) { - Type = (TradeType)(int)((Integer)serialized["type"]).Value; + _serializedType = (Integer) serialized["type"]; } public override void Check() @@ -46,6 +61,6 @@ public override string GetProgressText() => protected override string TypeId => "tradeQuest"; public override IValue Serialize() => ((Dictionary) base.Serialize()) - .Add("type", (int) Type); + .Add("type", _serializedType ?? (int) Type); } } From ca9c5a65ff04b50b4b5e393b0e4869b71ca23ea6 Mon Sep 17 00:00:00 2001 From: Yang Chun Ung Date: Fri, 21 Jul 2023 11:17:57 +0900 Subject: [PATCH 09/16] Lazyload ItemEnhancementQuest --- Lib9c/Model/Quest/ItemEnhancementQuest.cs | 54 ++++++++++++++++++----- 1 file changed, 42 insertions(+), 12 deletions(-) diff --git a/Lib9c/Model/Quest/ItemEnhancementQuest.cs b/Lib9c/Model/Quest/ItemEnhancementQuest.cs index b93a56f240..2e7eb988d9 100644 --- a/Lib9c/Model/Quest/ItemEnhancementQuest.cs +++ b/Lib9c/Model/Quest/ItemEnhancementQuest.cs @@ -11,22 +11,52 @@ namespace Nekoyume.Model.Quest [Serializable] public class ItemEnhancementQuest : Quest { - public readonly int Grade; - private readonly int _count; - public int Count => _count; - public override float Progress => (float) _current / _count; + public int Grade + { + get + { + if (_serializedGrade is { }) + { + _grade = (int) _serializedGrade; + _serializedGrade = null; + } + + return _grade; + } + } + + public int Count + { + get + { + if (_serializedCount is { }) + { + _count = (int) _serializedCount; + _serializedCount = null; + } + + return _count; + } + } + + private Integer? _serializedGrade; + private int _grade; + private Integer? _serializedCount; + // Do not use this field. it can be different check result + private int _count; + public override float Progress => (float) _current / Count; public ItemEnhancementQuest(ItemEnhancementQuestSheet.Row data, QuestReward reward) : base(data, reward) { _count = data.Count; - Grade = data.Grade; + _grade = data.Grade; } public ItemEnhancementQuest(Dictionary serialized) : base(serialized) { - Grade = (int)((Integer)serialized["grade"]).Value; - _count = (int)((Integer)serialized["count"]).Value; + _serializedGrade = (Integer) serialized["grade"]; + _serializedCount = (Integer) serialized["count"]; } public override QuestType QuestType => QuestType.Craft; @@ -36,15 +66,15 @@ public override void Check() if (Complete) return; - Complete = _count == _current; + Complete = Count == _current; } public override string GetProgressText() => string.Format( CultureInfo.InvariantCulture, GoalFormat, - Math.Min(_count, _current), - _count + Math.Min(Count, _current), + Count ); public void Update(Equipment equipment) @@ -64,7 +94,7 @@ public void Update(Equipment equipment) public override IValue Serialize() => ((Dictionary) base.Serialize()) - .Add("grade", Grade) - .Add("count", _count); + .Add("grade", _serializedGrade ?? Grade) + .Add("count", _serializedCount ?? Count); } } From c890ef0e22910985d8946fa7565de7844dd3476f Mon Sep 17 00:00:00 2001 From: Yang Chun Ung Date: Fri, 21 Jul 2023 15:24:57 +0900 Subject: [PATCH 10/16] Lazyload ItemBase --- Lib9c/Model/Item/ItemBase.cs | 126 ++++++++++++++++++++++++++++------- 1 file changed, 101 insertions(+), 25 deletions(-) diff --git a/Lib9c/Model/Item/ItemBase.cs b/Lib9c/Model/Item/ItemBase.cs index a86dbda433..e3c25f4290 100644 --- a/Lib9c/Model/Item/ItemBase.cs +++ b/Lib9c/Model/Item/ItemBase.cs @@ -13,50 +13,126 @@ public abstract class ItemBase : IItem { protected static readonly Codec Codec = new Codec(); - public int Id { get; } - public int Grade { get; } - public ItemType ItemType { get; } - public ItemSubType ItemSubType { get; } - public ElementalType ElementalType { get; } + private int _id; + private int _grade; + private ItemType _itemType; + private ItemSubType _itemSubType; + private ElementalType _elementalType; + private Text? _serializedId; + private Text? _serializedGrade; + private Text? _serializedItemType; + private Text? _serializedItemSubType; + private Text? _serializedElementalType; + + public int Id + { + get + { + if (_serializedId is { }) + { + _id = _serializedId.ToInteger(); + _serializedId = null; + } + + return _id; + } + } + + public int Grade + { + get + { + if (_serializedGrade is { }) + { + _grade = _serializedGrade.ToInteger(); + _serializedGrade = null; + } + + return _grade; + } + } + + public ItemType ItemType + { + get + { + if (_serializedItemType is { }) + { + _itemType = _serializedItemType.ToEnum(); + _serializedItemType = null; + } + + return _itemType; + } + } + + public ItemSubType ItemSubType + { + get + { + if (_serializedItemSubType is { }) + { + _itemSubType = _serializedItemSubType.ToEnum(); + _serializedItemSubType = null; + } + + return _itemSubType; + } + } + + public ElementalType ElementalType + { + get + { + if (_serializedElementalType is { }) + { + _elementalType = _serializedElementalType.ToEnum(); + _serializedElementalType = null; + } + + return _elementalType; + } + } + protected ItemBase(ItemSheet.Row data) { - Id = data.Id; - Grade = data.Grade; - ItemType = data.ItemType; - ItemSubType = data.ItemSubType; - ElementalType = data.ElementalType; + _id = data.Id; + _grade = data.Grade; + _itemType = data.ItemType; + _itemSubType = data.ItemSubType; + _elementalType = data.ElementalType; } protected ItemBase(ItemBase other) { - Id = other.Id; - Grade = other.Grade; - ItemType = other.ItemType; - ItemSubType = other.ItemSubType; - ElementalType = other.ElementalType; + _id = other.Id; + _grade = other.Grade; + _itemType = other.ItemType; + _itemSubType = other.ItemSubType; + _elementalType = other.ElementalType; } protected ItemBase(Dictionary serialized) { if (serialized.TryGetValue((Text) "id", out var id)) { - Id = id.ToInteger(); + _serializedId = (Text) id; } if (serialized.TryGetValue((Text) "grade", out var grade)) { - Grade = grade.ToInteger(); + _serializedGrade = (Text) grade; } if (serialized.TryGetValue((Text) "item_type", out var type)) { - ItemType = type.ToEnum(); + _serializedItemType = (Text) type; } if (serialized.TryGetValue((Text) "item_sub_type", out var subType)) { - ItemSubType = subType.ToEnum(); + _serializedItemSubType = (Text) subType; } if (serialized.TryGetValue((Text) "elemental_type", out var elementalType)) { - ElementalType = elementalType.ToEnum(); + _serializedElementalType = (Text) elementalType; } } @@ -94,11 +170,11 @@ public override int GetHashCode() public virtual IValue Serialize() => Dictionary.Empty - .Add("id", Id.Serialize()) - .Add("item_type", ItemType.Serialize()) - .Add("item_sub_type", ItemSubType.Serialize()) - .Add("grade", Grade.Serialize()) - .Add("elemental_type", ElementalType.Serialize()); + .Add("id", _serializedId ?? Id.Serialize()) + .Add("item_type", _serializedItemType ?? ItemType.Serialize()) + .Add("item_sub_type", _serializedItemSubType ?? ItemSubType.Serialize()) + .Add("grade", _serializedGrade ?? Grade.Serialize()) + .Add("elemental_type", _serializedElementalType ?? ElementalType.Serialize()); public override string ToString() { From 6e279bcefe023e4655e4095823291c6e596c9c93 Mon Sep 17 00:00:00 2001 From: Yang Chun Ung Date: Fri, 21 Jul 2023 15:25:05 +0900 Subject: [PATCH 11/16] Lazyload ItemUsable --- .Lib9c.Tests/Action/BuyMultipleTest.cs | 63 ------------ .Lib9c.Tests/Model/Item/ArmorTest.cs | 18 ---- .Lib9c.Tests/Model/Item/BeltTest.cs | 18 ---- .Lib9c.Tests/Model/Item/ConsumableTest.cs | 18 ---- .Lib9c.Tests/Model/Item/EquipmentTest.cs | 22 ---- .Lib9c.Tests/Model/Item/InventoryTest.cs | 20 ---- .Lib9c.Tests/Model/Item/NecklaceTest.cs | 18 ---- .Lib9c.Tests/Model/Item/ShopItemTest.cs | 18 ---- Lib9c/Model/Item/ItemUsable.cs | 116 +++++++++++++++++----- 9 files changed, 89 insertions(+), 222 deletions(-) diff --git a/.Lib9c.Tests/Action/BuyMultipleTest.cs b/.Lib9c.Tests/Action/BuyMultipleTest.cs index d8d3a821a0..7be32d6d89 100644 --- a/.Lib9c.Tests/Action/BuyMultipleTest.cs +++ b/.Lib9c.Tests/Action/BuyMultipleTest.cs @@ -2,10 +2,8 @@ { using System; using System.Collections.Generic; - using System.IO; using System.Linq; using System.Numerics; - using System.Runtime.Serialization.Formatters.Binary; using Libplanet.Action.State; using Libplanet.Crypto; using Libplanet.Types.Assets; @@ -609,67 +607,6 @@ public void ExecuteThrowShopItemExpiredError() Assert.True(isAllFailed); } - [Fact] - public void SerializeWithDotnetAPI() - { - var sellerAvatarAddress = new PrivateKey().ToAddress(); - var sellerAgentAddress = new PrivateKey().ToAddress(); - CreateAvatarState(sellerAgentAddress, sellerAvatarAddress); - - IAccountStateDelta previousStates = _initialState; - var shopState = previousStates.GetShopState(); - - var productId = Guid.NewGuid(); - var equipment = ItemFactory.CreateItemUsable( - _tableSheets.EquipmentItemSheet.First, - Guid.NewGuid(), - 0); - shopState.Register(new ShopItem( - sellerAgentAddress, - sellerAvatarAddress, - productId, - new FungibleAssetValue(_goldCurrencyState.Currency, 100, 0), - 100, - equipment)); - shopState.Register(new ShopItem( - sellerAgentAddress, - sellerAvatarAddress, - Guid.NewGuid(), - new FungibleAssetValue(_goldCurrencyState.Currency, 100, 0), - 100, - equipment)); - var products = shopState.Products.Values - .Select(p => new BuyMultiple.PurchaseInfo( - p.ProductId, - p.SellerAgentAddress, - p.SellerAvatarAddress)) - .ToList(); - - previousStates = previousStates - .SetState(Addresses.Shop, shopState.Serialize()); - - var action = new BuyMultiple - { - buyerAvatarAddress = _buyerAvatarAddress, - purchaseInfos = products, - }; - action.Execute(new ActionContext() - { - BlockIndex = 1, - PreviousState = previousStates, - Random = new TestRandom(), - Signer = _buyerAgentAddress, - }); - - var formatter = new BinaryFormatter(); - using var ms = new MemoryStream(); - formatter.Serialize(ms, action); - ms.Seek(0, SeekOrigin.Begin); - - var deserialized = (BuyMultiple)formatter.Deserialize(ms); - Assert.Equal(action.PlainValue, deserialized.PlainValue); - } - private (AvatarState AvatarState, AgentState AgentState) CreateAvatarState( Address agentAddress, Address avatarAddress) { diff --git a/.Lib9c.Tests/Model/Item/ArmorTest.cs b/.Lib9c.Tests/Model/Item/ArmorTest.cs index 0e68c845e0..7bd14187c3 100644 --- a/.Lib9c.Tests/Model/Item/ArmorTest.cs +++ b/.Lib9c.Tests/Model/Item/ArmorTest.cs @@ -1,9 +1,7 @@ namespace Lib9c.Tests.Model.Item { using System; - using System.IO; using System.Linq; - using System.Runtime.Serialization.Formatters.Binary; using Nekoyume.Model.Item; using Nekoyume.TableData; using Xunit; @@ -30,21 +28,5 @@ public void Serialize() Assert.Equal(costume, deserialized); } - - [Fact] - public void SerializeWithDotNetAPI() - { - Assert.NotNull(_armorRow); - - var costume = new Armor(_armorRow, Guid.NewGuid(), 0); - var formatter = new BinaryFormatter(); - using var ms = new MemoryStream(); - formatter.Serialize(ms, costume); - ms.Seek(0, SeekOrigin.Begin); - - var deserialized = (Armor)formatter.Deserialize(ms); - - Assert.Equal(costume, deserialized); - } } } diff --git a/.Lib9c.Tests/Model/Item/BeltTest.cs b/.Lib9c.Tests/Model/Item/BeltTest.cs index ec5d4a4fb2..f949893ee0 100644 --- a/.Lib9c.Tests/Model/Item/BeltTest.cs +++ b/.Lib9c.Tests/Model/Item/BeltTest.cs @@ -1,9 +1,7 @@ namespace Lib9c.Tests.Model.Item { using System; - using System.IO; using System.Linq; - using System.Runtime.Serialization.Formatters.Binary; using Nekoyume.Model.Item; using Nekoyume.TableData; using Xunit; @@ -30,21 +28,5 @@ public void Serialize() Assert.Equal(costume, deserialized); } - - [Fact] - public void SerializeWithDotNetAPI() - { - Assert.NotNull(_beltRow); - - var costume = new Belt(_beltRow, Guid.NewGuid(), 0); - var formatter = new BinaryFormatter(); - using var ms = new MemoryStream(); - formatter.Serialize(ms, costume); - ms.Seek(0, SeekOrigin.Begin); - - var deserialized = (Belt)formatter.Deserialize(ms); - - Assert.Equal(costume, deserialized); - } } } diff --git a/.Lib9c.Tests/Model/Item/ConsumableTest.cs b/.Lib9c.Tests/Model/Item/ConsumableTest.cs index 5bca779eea..687105a022 100644 --- a/.Lib9c.Tests/Model/Item/ConsumableTest.cs +++ b/.Lib9c.Tests/Model/Item/ConsumableTest.cs @@ -1,8 +1,6 @@ namespace Lib9c.Tests.Model.Item { using System; - using System.IO; - using System.Runtime.Serialization.Formatters.Binary; using Nekoyume.Model.Item; using Nekoyume.TableData; using Xunit; @@ -29,22 +27,6 @@ public void Serialize() Assert.Equal(consumable, deserialized); } - [Fact] - public void SerializeWithDotNetAPI() - { - Assert.NotNull(_consumableRow); - - var consumable = new Consumable(_consumableRow, Guid.NewGuid(), 0); - var formatter = new BinaryFormatter(); - using var ms = new MemoryStream(); - formatter.Serialize(ms, consumable); - ms.Seek(0, SeekOrigin.Begin); - - var deserialized = (Consumable)formatter.Deserialize(ms); - - Assert.Equal(consumable, deserialized); - } - [Fact] public void Update() { diff --git a/.Lib9c.Tests/Model/Item/EquipmentTest.cs b/.Lib9c.Tests/Model/Item/EquipmentTest.cs index 9b981b7b3e..3567ddc766 100644 --- a/.Lib9c.Tests/Model/Item/EquipmentTest.cs +++ b/.Lib9c.Tests/Model/Item/EquipmentTest.cs @@ -2,8 +2,6 @@ namespace Lib9c.Tests.Model.Item { using System; using System.Collections.Generic; - using System.IO; - using System.Runtime.Serialization.Formatters.Binary; using Nekoyume.Model.Item; using Nekoyume.TableData; using Xunit; @@ -43,26 +41,6 @@ public void Serialize() Assert.Equal(serialized, reSerialized); } - [Fact] - public void SerializeWithDotNetAPI() - { - Assert.NotNull(_equipmentRow); - - var costume = new Equipment(_equipmentRow, Guid.NewGuid(), 0); - var formatter = new BinaryFormatter(); - using var ms = new MemoryStream(); - formatter.Serialize(ms, costume); - ms.Seek(0, SeekOrigin.Begin); - var serialized = ms.ToArray(); - var deserialized = (Equipment)formatter.Deserialize(ms); - ms.Seek(0, SeekOrigin.Begin); - formatter.Serialize(ms, deserialized); - var reSerialized = ms.ToArray(); - - Assert.Equal(costume, deserialized); - Assert.Equal(serialized, reSerialized); - } - [Fact] public void LevelUp() { diff --git a/.Lib9c.Tests/Model/Item/InventoryTest.cs b/.Lib9c.Tests/Model/Item/InventoryTest.cs index 24ce3abb3e..b01f818bec 100644 --- a/.Lib9c.Tests/Model/Item/InventoryTest.cs +++ b/.Lib9c.Tests/Model/Item/InventoryTest.cs @@ -2,9 +2,7 @@ { using System; using System.Collections.Generic; - using System.IO; using System.Linq; - using System.Runtime.Serialization.Formatters.Binary; using Lib9c.Tests.Action; using Nekoyume.Model.Item; using Nekoyume.TableData; @@ -35,24 +33,6 @@ public void Serialize() Assert.Equal(inventory, deserialized); } - [Fact] - public void Serialize_With_DotNet_Api() - { - var inventory = new Inventory(); - var row = TableSheets.EquipmentItemSheet.First; - var itemUsable = ItemFactory.CreateItemUsable(row, Guid.NewGuid(), 0); - inventory.AddItem(itemUsable); - var row2 = TableSheets.MaterialItemSheet.First; - var material = ItemFactory.CreateMaterial(row2); - inventory.AddItem(material, 1, new OrderLock(Guid.NewGuid())); - var formatter = new BinaryFormatter(); - using var ms = new MemoryStream(); - formatter.Serialize(ms, inventory); - ms.Seek(0, SeekOrigin.Begin); - var deserialized = (Inventory)formatter.Deserialize(ms); - Assert.Equal(inventory, deserialized); - } - // Add [Fact] public Inventory AddItem_Consumable() diff --git a/.Lib9c.Tests/Model/Item/NecklaceTest.cs b/.Lib9c.Tests/Model/Item/NecklaceTest.cs index 7507d1cc85..95c2b291bf 100644 --- a/.Lib9c.Tests/Model/Item/NecklaceTest.cs +++ b/.Lib9c.Tests/Model/Item/NecklaceTest.cs @@ -1,9 +1,7 @@ namespace Lib9c.Tests.Model.Item { using System; - using System.IO; using System.Linq; - using System.Runtime.Serialization.Formatters.Binary; using Nekoyume.Model.Item; using Nekoyume.TableData; using Xunit; @@ -30,21 +28,5 @@ public void Serialize() Assert.Equal(costume, deserialized); } - - [Fact] - public void SerializeWithDotNetAPI() - { - Assert.NotNull(_necklaceRow); - - var costume = new Necklace(_necklaceRow, Guid.NewGuid(), 0); - var formatter = new BinaryFormatter(); - using var ms = new MemoryStream(); - formatter.Serialize(ms, costume); - ms.Seek(0, SeekOrigin.Begin); - - var deserialized = (Necklace)formatter.Deserialize(ms); - - Assert.Equal(costume, deserialized); - } } } diff --git a/.Lib9c.Tests/Model/Item/ShopItemTest.cs b/.Lib9c.Tests/Model/Item/ShopItemTest.cs index bc3b9e80d3..f536f984e1 100644 --- a/.Lib9c.Tests/Model/Item/ShopItemTest.cs +++ b/.Lib9c.Tests/Model/Item/ShopItemTest.cs @@ -2,9 +2,7 @@ namespace Lib9c.Tests.Model.Item { using System; using System.Collections.Generic; - using System.IO; using System.Linq; - using System.Runtime.Serialization.Formatters.Binary; using Bencodex.Types; using Libplanet.Crypto; using Libplanet.Types.Assets; @@ -38,22 +36,6 @@ public void Serialize() } } - [Fact] - public void Serialize_With_DotNet_Api() - { - foreach (var shopItem in GetShopItems()) - { - var formatter = new BinaryFormatter(); - using var ms = new MemoryStream(); - formatter.Serialize(ms, shopItem); - ms.Seek(0, SeekOrigin.Begin); - - var deserialized = (ShopItem)formatter.Deserialize(ms); - - Assert.Equal(shopItem, deserialized); - } - } - // NOTE: `SerializeBackup1()` only tests with `ShopItem` containing `Equipment`. [Fact] public void SerializeBackup1() diff --git a/Lib9c/Model/Item/ItemUsable.cs b/Lib9c/Model/Item/ItemUsable.cs index 83f671912f..60aa40962d 100644 --- a/Lib9c/Model/Item/ItemUsable.cs +++ b/Lib9c/Model/Item/ItemUsable.cs @@ -14,12 +14,77 @@ namespace Nekoyume.Model.Item [Serializable] public abstract class ItemUsable : ItemBase, INonFungibleItem { - public Guid ItemId { get; } + public Guid ItemId + { + get + { + if (_serializedItemId is { }) + { + _itemId = _serializedItemId.ToGuid(); + _serializedItemId = null; + } + + return _itemId; + } + } + public Guid TradableId => ItemId; public Guid NonFungibleId => ItemId; - public StatsMap StatsMap { get; } - public List Skills { get; } - public List BuffSkills { get; } + + public StatsMap StatsMap + { + get + { + _statsMap ??= new StatsMap(); + if (_serializedStatsMap is { }) + { + _statsMap.Deserialize(_serializedStatsMap); + _serializedStatsMap = null; + } + + return _statsMap; + } + } + + public List Skills + { + get + { + _skills ??= new List(); + if (_serializedSkills is { }) + { + foreach (var value in _serializedSkills) + { + var serializedSkill = (Dictionary) value; + _skills.Add(SkillFactory.Deserialize(serializedSkill)); + } + + _serializedSkills = null; + } + + return _skills; + } + } + + public List BuffSkills + { + get + { + _buffSkills ??= new List(); + if (_serializedBuffSkills is { }) + { + foreach (var value in _serializedBuffSkills) + { + var serializedSkill = (Dictionary) value; + _buffSkills.Add((BuffSkill) SkillFactory.Deserialize(serializedSkill)); + } + + _serializedBuffSkills = null; + } + + return _buffSkills; + } + } public long RequiredBlockIndex { @@ -36,11 +101,19 @@ public long RequiredBlockIndex } private long _requiredBlockIndex; + private Guid _itemId; + private StatsMap _statsMap; + private List _skills; + private List _buffSkills; + private Binary? _serializedItemId; + private Dictionary _serializedStatsMap; + private List _serializedSkills; + private List _serializedBuffSkills; protected ItemUsable(ItemSheet.Row data, Guid id, long requiredBlockIndex) : base(data) { - ItemId = id; - StatsMap = new StatsMap(); + _itemId = id; + _statsMap = new StatsMap(); switch (data) { @@ -58,39 +131,28 @@ protected ItemUsable(ItemSheet.Row data, Guid id, long requiredBlockIndex) : bas break; } - Skills = new List(); - BuffSkills = new List(); + _skills = new List(); + _buffSkills = new List(); RequiredBlockIndex = requiredBlockIndex; } protected ItemUsable(Dictionary serialized) : base(serialized) { - StatsMap = new StatsMap(); - Skills = new List(); - BuffSkills = new List(); if (serialized.TryGetValue((Text) "itemId", out var itemId)) { - ItemId = itemId.ToGuid(); + _serializedItemId = (Binary) itemId; } if (serialized.TryGetValue((Text) "statsMap", out var statsMap)) { - StatsMap.Deserialize((Dictionary) statsMap); + _serializedStatsMap = (Dictionary) statsMap; } if (serialized.TryGetValue((Text) "skills", out var skills)) { - foreach (var value in (List) skills) - { - var skill = (Dictionary) value; - Skills.Add(SkillFactory.Deserialize(skill)); - } + _serializedSkills = (List) skills; } if (serialized.TryGetValue((Text) "buffSkills", out var buffSkills)) { - foreach (var value in (List) buffSkills) - { - var buffSkill = (Dictionary) value; - BuffSkills.Add((BuffSkill) SkillFactory.Deserialize(buffSkill)); - } + _serializedBuffSkills = (List) buffSkills; } if (serialized.TryGetValue((Text) "requiredBlockIndex", out var requiredBlockIndex)) { @@ -137,13 +199,13 @@ public void Update(long blockIndex) } public override IValue Serialize() => ((Dictionary)base.Serialize()) - .Add("itemId", ItemId.Serialize()) - .Add("statsMap", StatsMap.Serialize()) - .Add("skills", new List(Skills + .Add("itemId", _serializedItemId ?? ItemId.Serialize()) + .Add("statsMap", _serializedStatsMap ?? StatsMap.Serialize()) + .Add("skills", _serializedSkills ?? new List(Skills .OrderByDescending(i => i.Chance) .ThenByDescending(i => i.Power) .Select(s => s.Serialize()))) - .Add("buffSkills", new List(BuffSkills + .Add("buffSkills", _serializedBuffSkills ?? new List(BuffSkills .OrderByDescending(i => i.Chance) .ThenByDescending(i => i.Power) .Select(s => s.Serialize()))) From da4f4faedc1d9d84c647182165c19ec707ab96db Mon Sep 17 00:00:00 2001 From: sky1045 Date: Tue, 25 Jul 2023 11:20:57 +0900 Subject: [PATCH 12/16] Log HAS Playcount, Remove Debug log --- Lib9c/Action/HackAndSlash.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Lib9c/Action/HackAndSlash.cs b/Lib9c/Action/HackAndSlash.cs index 8689b6f249..30aa9d3444 100644 --- a/Lib9c/Action/HackAndSlash.cs +++ b/Lib9c/Action/HackAndSlash.cs @@ -123,7 +123,7 @@ public IAccountStateDelta Execute( var addressesHex = $"[{signer.ToHex()}, {AvatarAddress.ToHex()}]"; var started = DateTimeOffset.UtcNow; - Log.Debug("{AddressesHex}HAS exec started", addressesHex); + Log.Verbose("{AddressesHex}HAS exec started", addressesHex); if (ApStoneCount > UsableApStoneCount) { @@ -534,8 +534,8 @@ public IAccountStateDelta Execute( ); } sw.Stop(); - Log.Verbose("{AddressesHex}HAS loop Simulate: {Elapsed}, Count: {PlayCount}", - addressesHex, sw.Elapsed, TotalPlayCount); + Log.Verbose("{AddressesHex} {Source} loop Simulate: {Elapsed}, Count: {PlayCount}", + addressesHex, "HackAndSlash", sw.Elapsed, TotalPlayCount); // Update CrystalRandomSkillState.Stars by clearedWaveNumber. (add) skillState?.Update(starCount, crystalStageBuffSheet); @@ -569,7 +569,7 @@ public IAccountStateDelta Execute( Log.Verbose("{AddressesHex}HAS Set States: {Elapsed}", addressesHex, sw.Elapsed); var totalElapsed = DateTimeOffset.UtcNow - started; - Log.Debug("{AddressesHex}HAS Total Executed Time: {Elapsed}", addressesHex, totalElapsed); + Log.Verbose("{AddressesHex}HAS Total Executed Time: {Elapsed}", addressesHex, totalElapsed); return states; } From 61e5c074389a0576f2bded6c319c3d1d5abed5f5 Mon Sep 17 00:00:00 2001 From: Robert Date: Tue, 25 Jul 2023 14:46:30 +0900 Subject: [PATCH 13/16] Remove invalid state exception logging from AccountStateExtensions --- Lib9c/Action/AccountStateExtensions.cs | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Lib9c/Action/AccountStateExtensions.cs b/Lib9c/Action/AccountStateExtensions.cs index f0ed864437..21bf766826 100644 --- a/Lib9c/Action/AccountStateExtensions.cs +++ b/Lib9c/Action/AccountStateExtensions.cs @@ -38,13 +38,6 @@ public static bool TryGetState(this IAccountState states, Address address, ou return true; } - Log.Error( - "Expected a {0}, but got invalid state ({1}): ({2}) {3}", - typeof(T).Name, - address.ToHex(), - raw?.GetType().Name, - raw - ); result = default; return false; } From ef950095eda804064382a9c15f83a02122e99261 Mon Sep 17 00:00:00 2001 From: Robert Date: Tue, 25 Jul 2023 14:56:49 +0900 Subject: [PATCH 14/16] Fix playcount log level --- Lib9c/Action/HackAndSlash.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib9c/Action/HackAndSlash.cs b/Lib9c/Action/HackAndSlash.cs index 30aa9d3444..cafd55054b 100644 --- a/Lib9c/Action/HackAndSlash.cs +++ b/Lib9c/Action/HackAndSlash.cs @@ -534,7 +534,7 @@ public IAccountStateDelta Execute( ); } sw.Stop(); - Log.Verbose("{AddressesHex} {Source} loop Simulate: {Elapsed}, Count: {PlayCount}", + Log.Debug("{AddressesHex} {Source} loop Simulate: {Elapsed}, Count: {PlayCount}", addressesHex, "HackAndSlash", sw.Elapsed, TotalPlayCount); // Update CrystalRandomSkillState.Stars by clearedWaveNumber. (add) From e120e033264d39c50142da2d5c14013ddb2a9060 Mon Sep 17 00:00:00 2001 From: Yang Chun Ung Date: Tue, 25 Jul 2023 16:28:08 +0900 Subject: [PATCH 15/16] HAS break down --- Lib9c/Action/HackAndSlash.cs | 50 ++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/Lib9c/Action/HackAndSlash.cs b/Lib9c/Action/HackAndSlash.cs index cafd55054b..ad2c5410b7 100644 --- a/Lib9c/Action/HackAndSlash.cs +++ b/Lib9c/Action/HackAndSlash.cs @@ -123,7 +123,8 @@ public IAccountStateDelta Execute( var addressesHex = $"[{signer.ToHex()}, {AvatarAddress.ToHex()}]"; var started = DateTimeOffset.UtcNow; - Log.Verbose("{AddressesHex}HAS exec started", addressesHex); + const string source = "HackAndSlash"; + Log.Verbose("{AddressesHex} {Source} HAS exec started", addressesHex, source); if (ApStoneCount > UsableApStoneCount) { @@ -157,7 +158,7 @@ public IAccountStateDelta Execute( } sw.Stop(); - Log.Verbose("{AddressesHex}HAS Get AvatarState: {Elapsed}", addressesHex, sw.Elapsed); + Log.Verbose("{AddressesHex} {Source} HAS {Process}: {Elapsed}", addressesHex, source, "Get AvatarState", sw.Elapsed.TotalMilliseconds); sw.Restart(); var sheets = states.GetSheets( @@ -186,7 +187,7 @@ public IAccountStateDelta Execute( typeof(RuneListSheet), }); sw.Stop(); - Log.Verbose("{AddressesHex}HAS Get Sheets: {Elapsed}", addressesHex, sw.Elapsed); + Log.Verbose("{AddressesHex} {Source} HAS {Process}: {Elapsed}", addressesHex, source, "Get Sheets", sw.Elapsed.TotalMilliseconds); sw.Restart(); var stakingLevel = 0; @@ -200,7 +201,7 @@ public IAccountStateDelta Execute( } sw.Stop(); - Log.Verbose("{AddressesHex}HAS Check StakeState: {Elapsed}", addressesHex, sw.Elapsed); + Log.Verbose("{AddressesHex} {Source} HAS {Process}: {Elapsed}", addressesHex, source, "Check StateState", sw.Elapsed.TotalMilliseconds); var worldSheet = sheets.GetSheet(); if (!worldSheet.TryGetValue(WorldId, out var worldRow, false)) @@ -223,7 +224,7 @@ public IAccountStateDelta Execute( } sw.Stop(); - Log.Verbose("{AddressesHex}HAS Get StageSheet: {Elapsed}", addressesHex, sw.Elapsed); + Log.Verbose("{AddressesHex} {Source} HAS {Process}: {Elapsed}", addressesHex, source, "Get StageSheet", sw.Elapsed.TotalMilliseconds); sw.Restart(); var worldInformation = avatarState.worldInformation; @@ -263,15 +264,15 @@ public IAccountStateDelta Execute( } sw.Stop(); - Log.Verbose("{AddressesHex}HAS Validate World: {Elapsed}", addressesHex, sw.Elapsed); + Log.Verbose("{AddressesHex} {Source} HAS {Process}: {Elapsed}", addressesHex, source, "Validate World", sw.Elapsed.TotalMilliseconds); sw.Restart(); var equipmentList = avatarState.ValidateEquipmentsV2(Equipments, blockIndex); var foodIds = avatarState.ValidateConsumable(Foods, blockIndex); var costumeIds = avatarState.ValidateCostume(Costumes); sw.Stop(); - Log.Verbose("{AddressesHex}HAS Validate Items: {Elapsed}", addressesHex, sw.Elapsed); - + Log.Verbose("{AddressesHex} {Source} HAS {Process}: {Elapsed}", addressesHex, source, "Validate Items", sw.Elapsed.TotalMilliseconds); + sw.Restart(); var materialItemSheet = sheets.GetSheet(); var apPlayCount = TotalPlayCount; var minimumCostAp = stageRow.CostAP; @@ -313,11 +314,12 @@ public IAccountStateDelta Execute( } Log.Verbose( - "{AddressesHex}TotalPlayCount: {TotalPlayCount}, " + + "{AddressesHex} {Source} TotalPlayCount: {TotalPlayCount}, " + "ApStoneCount: {ApStoneCount}, PlayCount by Ap stone: {ApStonePlayCount}, " + "Ap cost per 1 play: {MinimumCostAp}, " + "PlayCount by action point: {ApPlayCount}, Used AP: {UsedAp}", addressesHex, + source, TotalPlayCount, ApStoneCount, apStonePlayCount, @@ -347,12 +349,12 @@ public IAccountStateDelta Execute( var items = Equipments.Concat(Costumes); avatarState.EquipItems(items); sw.Stop(); - Log.Verbose("{AddressesHex}HAS Unequip items: {Elapsed}", addressesHex, sw.Elapsed); + Log.Verbose("{AddressesHex} {Source} HAS {Process}: {Elapsed}", addressesHex, source, "Unequip items", sw.Elapsed.TotalMilliseconds); sw.Restart(); var questSheet = sheets.GetQuestSheet(); sw.Stop(); - Log.Verbose("{AddressesHex}HAS GetQuestSheet: {Elapsed}", addressesHex, sw.Elapsed); + Log.Verbose("{AddressesHex} {Source} HAS {Process}: {Elapsed}", addressesHex, source, "Get QuestSheet", sw.Elapsed.TotalMilliseconds); // Update QuestList only when QuestSheet.Count is greater than QuestList.Count var questList = avatarState.questList; @@ -365,7 +367,7 @@ public IAccountStateDelta Execute( sheets.GetSheet(), sheets.GetSheet()); sw.Stop(); - Log.Verbose("{AddressesHex}HAS Update QuestList: {Elapsed}", addressesHex, sw.Elapsed); + Log.Verbose("{AddressesHex} {Source} HAS {Process}: {Elapsed}", addressesHex, source, "Update QuestList", sw.Elapsed.TotalMilliseconds); } sw.Restart(); @@ -404,7 +406,7 @@ public IAccountStateDelta Execute( } sw.Stop(); - Log.Verbose("{AddressesHex}HAS Get skillState : {Elapsed}", addressesHex, sw.Elapsed); + Log.Verbose("{AddressesHex} {Source} HAS {Process}: {Elapsed}", addressesHex, source, "Get skillState", sw.Elapsed.TotalMilliseconds); sw.Restart(); var worldUnlockSheet = sheets.GetSheet(); @@ -439,6 +441,8 @@ public IAccountStateDelta Execute( runeStates.Add(new RuneState(rawRuneState)); } } + sw.Stop(); + Log.Verbose("{AddressesHex} {Source} HAS {Process}: {Elapsed}", addressesHex, source, "Update slotState", sw.Elapsed.TotalMilliseconds); var stageWaveRow = sheets.GetSheet()[StageId]; var enemySkillSheet = sheets.GetSheet(); @@ -469,12 +473,12 @@ public IAccountStateDelta Execute( rewards, false); sw.Stop(); - Log.Verbose("{AddressesHex}HAS Initialize Simulator: {Elapsed}", addressesHex, sw.Elapsed); + Log.Verbose("{AddressesHex} {Source} HAS {Process}: {Elapsed}", addressesHex, source, "Initialize Simulator", sw.Elapsed.TotalMilliseconds); sw.Restart(); simulator.Simulate(); sw.Stop(); - Log.Verbose("{AddressesHex}HAS Simulator.Simulate(): {Elapsed}", addressesHex, sw.Elapsed); + Log.Verbose("{AddressesHex} {Source} HAS {Process}: {Elapsed}", addressesHex, source, "Simulator.Simulate()", sw.Elapsed.TotalMilliseconds); sw.Restart(); if (simulator.Log.IsClear) @@ -491,7 +495,7 @@ public IAccountStateDelta Execute( stageCleared = true; } sw.Stop(); - Log.Verbose("{AddressesHex}HAS ClearStage: {Elapsed}", addressesHex, sw.Elapsed); + Log.Verbose("{AddressesHex} {Source} HAS {Process}: {Elapsed}", addressesHex, source, "ClearStage", sw.Elapsed.TotalMilliseconds); } sw.Restart(); @@ -521,10 +525,12 @@ public IAccountStateDelta Execute( sw.Stop(); Log.Verbose( - "{AddressesHex}Update avatar by simulator({AvatarAddress}); " + + "{AddressesHex} {Source} {Process} by simulator({AvatarAddress}); " + "worldId: {WorldId}, stageId: {StageId}, result: {Result}, " + "clearWave: {ClearWave}, totalWave: {TotalWave}", addressesHex, + source, + "Update avatar", AvatarAddress, WorldId, StageId, @@ -534,8 +540,8 @@ public IAccountStateDelta Execute( ); } sw.Stop(); - Log.Debug("{AddressesHex} {Source} loop Simulate: {Elapsed}, Count: {PlayCount}", - addressesHex, "HackAndSlash", sw.Elapsed, TotalPlayCount); + Log.Debug("{AddressesHex} {Source} {Process}: {Elapsed}, Count: {PlayCount}", + addressesHex, source, "loop Simulate", sw.Elapsed.TotalMilliseconds, TotalPlayCount); // Update CrystalRandomSkillState.Stars by clearedWaveNumber. (add) skillState?.Update(starCount, crystalStageBuffSheet); @@ -544,7 +550,7 @@ public IAccountStateDelta Execute( avatarState.updatedAt = blockIndex; avatarState.mailBox.CleanUp(); sw.Stop(); - Log.Verbose("{AddressesHex}HAS Update AvatarState: {Elapsed}", addressesHex, sw.Elapsed); + Log.Verbose("{AddressesHex} {Source} HAS {Process}: {Elapsed}", addressesHex, source, "Update AvatarState", sw.Elapsed.TotalMilliseconds); sw.Restart(); if (isNotClearedStage) @@ -566,10 +572,10 @@ public IAccountStateDelta Execute( .SetState(worldInformationAddress, avatarState.worldInformation.Serialize()) .SetState(questListAddress, avatarState.questList.Serialize()); sw.Stop(); - Log.Verbose("{AddressesHex}HAS Set States: {Elapsed}", addressesHex, sw.Elapsed); + Log.Verbose("{AddressesHex} {Source} HAS {Process}: {Elapsed}", addressesHex, source, "Set States", sw.Elapsed.TotalMilliseconds); var totalElapsed = DateTimeOffset.UtcNow - started; - Log.Verbose("{AddressesHex}HAS Total Executed Time: {Elapsed}", addressesHex, totalElapsed); + Log.Verbose("{AddressesHex} {Source} HAS {Process}: {Elapsed}", addressesHex, source, "Total Executed Time", totalElapsed.TotalMilliseconds); return states; } From afe06237d1c959721124f4cf39a9c92611bdb869 Mon Sep 17 00:00:00 2001 From: Robert <35055316+sky1045@users.noreply.github.com> Date: Thu, 27 Jul 2023 16:41:01 +0900 Subject: [PATCH 16/16] Merge pull request #2034 from planetarium/fix/has-log-blockindex Add blockindex to has total log --- Lib9c/Action/HackAndSlash.cs | 59 ++++++++++++++++++++++++------------ 1 file changed, 39 insertions(+), 20 deletions(-) diff --git a/Lib9c/Action/HackAndSlash.cs b/Lib9c/Action/HackAndSlash.cs index ad2c5410b7..0fea9d3f20 100644 --- a/Lib9c/Action/HackAndSlash.cs +++ b/Lib9c/Action/HackAndSlash.cs @@ -124,7 +124,8 @@ public IAccountStateDelta Execute( var addressesHex = $"[{signer.ToHex()}, {AvatarAddress.ToHex()}]"; var started = DateTimeOffset.UtcNow; const string source = "HackAndSlash"; - Log.Verbose("{AddressesHex} {Source} HAS exec started", addressesHex, source); + Log.Verbose("{AddressesHex} {Source} from #{BlockIndex} exec started", + addressesHex, source, blockIndex); if (ApStoneCount > UsableApStoneCount) { @@ -158,7 +159,8 @@ public IAccountStateDelta Execute( } sw.Stop(); - Log.Verbose("{AddressesHex} {Source} HAS {Process}: {Elapsed}", addressesHex, source, "Get AvatarState", sw.Elapsed.TotalMilliseconds); + Log.Verbose("{AddressesHex} {Source} HAS {Process} from #{BlockIndex}: {Elapsed}", + addressesHex, source, "Get AvatarState", blockIndex, sw.Elapsed.TotalMilliseconds); sw.Restart(); var sheets = states.GetSheets( @@ -187,7 +189,8 @@ public IAccountStateDelta Execute( typeof(RuneListSheet), }); sw.Stop(); - Log.Verbose("{AddressesHex} {Source} HAS {Process}: {Elapsed}", addressesHex, source, "Get Sheets", sw.Elapsed.TotalMilliseconds); + Log.Verbose("{AddressesHex} {Source} HAS {Process} from #{BlockIndex}: {Elapsed}", + addressesHex, source, "Get Sheets", blockIndex, sw.Elapsed.TotalMilliseconds); sw.Restart(); var stakingLevel = 0; @@ -201,7 +204,8 @@ public IAccountStateDelta Execute( } sw.Stop(); - Log.Verbose("{AddressesHex} {Source} HAS {Process}: {Elapsed}", addressesHex, source, "Check StateState", sw.Elapsed.TotalMilliseconds); + Log.Verbose("{AddressesHex} {Source} HAS {Process} from #{BlockIndex}: {Elapsed}", + addressesHex, source, "Check StateState", blockIndex, sw.Elapsed.TotalMilliseconds); var worldSheet = sheets.GetSheet(); if (!worldSheet.TryGetValue(WorldId, out var worldRow, false)) @@ -224,7 +228,8 @@ public IAccountStateDelta Execute( } sw.Stop(); - Log.Verbose("{AddressesHex} {Source} HAS {Process}: {Elapsed}", addressesHex, source, "Get StageSheet", sw.Elapsed.TotalMilliseconds); + Log.Verbose("{AddressesHex} {Source} HAS {Process} from #{BlockIndex}: {Elapsed}", + addressesHex, source, "Get StageSheet", blockIndex, sw.Elapsed.TotalMilliseconds); sw.Restart(); var worldInformation = avatarState.worldInformation; @@ -264,14 +269,16 @@ public IAccountStateDelta Execute( } sw.Stop(); - Log.Verbose("{AddressesHex} {Source} HAS {Process}: {Elapsed}", addressesHex, source, "Validate World", sw.Elapsed.TotalMilliseconds); + Log.Verbose("{AddressesHex} {Source} HAS {Process} from #{BlockIndex}: {Elapsed}", + addressesHex, source, "Validate World", blockIndex, sw.Elapsed.TotalMilliseconds); sw.Restart(); var equipmentList = avatarState.ValidateEquipmentsV2(Equipments, blockIndex); var foodIds = avatarState.ValidateConsumable(Foods, blockIndex); var costumeIds = avatarState.ValidateCostume(Costumes); sw.Stop(); - Log.Verbose("{AddressesHex} {Source} HAS {Process}: {Elapsed}", addressesHex, source, "Validate Items", sw.Elapsed.TotalMilliseconds); + Log.Verbose("{AddressesHex} {Source} HAS {Process} from #{BlockIndex}: {Elapsed}", + addressesHex, source, "Validate Items", blockIndex, sw.Elapsed.TotalMilliseconds); sw.Restart(); var materialItemSheet = sheets.GetSheet(); var apPlayCount = TotalPlayCount; @@ -317,6 +324,7 @@ public IAccountStateDelta Execute( "{AddressesHex} {Source} TotalPlayCount: {TotalPlayCount}, " + "ApStoneCount: {ApStoneCount}, PlayCount by Ap stone: {ApStonePlayCount}, " + "Ap cost per 1 play: {MinimumCostAp}, " + + "BlockIndex: {BlockIndex}, " + "PlayCount by action point: {ApPlayCount}, Used AP: {UsedAp}", addressesHex, source, @@ -349,12 +357,14 @@ public IAccountStateDelta Execute( var items = Equipments.Concat(Costumes); avatarState.EquipItems(items); sw.Stop(); - Log.Verbose("{AddressesHex} {Source} HAS {Process}: {Elapsed}", addressesHex, source, "Unequip items", sw.Elapsed.TotalMilliseconds); + Log.Verbose("{AddressesHex} {Source} HAS {Process} from #{BlockIndex}: {Elapsed}", + addressesHex, source, "Unequip items", blockIndex, sw.Elapsed.TotalMilliseconds); sw.Restart(); var questSheet = sheets.GetQuestSheet(); sw.Stop(); - Log.Verbose("{AddressesHex} {Source} HAS {Process}: {Elapsed}", addressesHex, source, "Get QuestSheet", sw.Elapsed.TotalMilliseconds); + Log.Verbose("{AddressesHex} {Source} HAS {Process} from #{BlockIndex}: {Elapsed}", + addressesHex, source, "Get QuestSheet", blockIndex, sw.Elapsed.TotalMilliseconds); // Update QuestList only when QuestSheet.Count is greater than QuestList.Count var questList = avatarState.questList; @@ -367,7 +377,8 @@ public IAccountStateDelta Execute( sheets.GetSheet(), sheets.GetSheet()); sw.Stop(); - Log.Verbose("{AddressesHex} {Source} HAS {Process}: {Elapsed}", addressesHex, source, "Update QuestList", sw.Elapsed.TotalMilliseconds); + Log.Verbose("{AddressesHex} {Source} HAS {Process} from #{BlockIndex}: {Elapsed}", + addressesHex, source, "Update QuestList", blockIndex, sw.Elapsed.TotalMilliseconds); } sw.Restart(); @@ -406,7 +417,8 @@ public IAccountStateDelta Execute( } sw.Stop(); - Log.Verbose("{AddressesHex} {Source} HAS {Process}: {Elapsed}", addressesHex, source, "Get skillState", sw.Elapsed.TotalMilliseconds); + Log.Verbose("{AddressesHex} {Source} HAS {Process} from #{BlockIndex}: {Elapsed}", + addressesHex, source, "Get skillState", blockIndex, sw.Elapsed.TotalMilliseconds); sw.Restart(); var worldUnlockSheet = sheets.GetSheet(); @@ -442,7 +454,8 @@ public IAccountStateDelta Execute( } } sw.Stop(); - Log.Verbose("{AddressesHex} {Source} HAS {Process}: {Elapsed}", addressesHex, source, "Update slotState", sw.Elapsed.TotalMilliseconds); + Log.Verbose("{AddressesHex} {Source} HAS {Process} from #{BlockIndex}: {Elapsed}", + addressesHex, source, "Update slotState", blockIndex, sw.Elapsed.TotalMilliseconds); var stageWaveRow = sheets.GetSheet()[StageId]; var enemySkillSheet = sheets.GetSheet(); @@ -473,12 +486,14 @@ public IAccountStateDelta Execute( rewards, false); sw.Stop(); - Log.Verbose("{AddressesHex} {Source} HAS {Process}: {Elapsed}", addressesHex, source, "Initialize Simulator", sw.Elapsed.TotalMilliseconds); + Log.Verbose("{AddressesHex} {Source} HAS {Process} from #{BlockIndex}: {Elapsed}", + addressesHex, source, "Initialize Simulator", blockIndex, sw.Elapsed.TotalMilliseconds); sw.Restart(); simulator.Simulate(); sw.Stop(); - Log.Verbose("{AddressesHex} {Source} HAS {Process}: {Elapsed}", addressesHex, source, "Simulator.Simulate()", sw.Elapsed.TotalMilliseconds); + Log.Verbose("{AddressesHex} {Source} HAS {Process} from #{BlockIndex}: {Elapsed}", + addressesHex, source, "Simulator.Simulate()", blockIndex, sw.Elapsed.TotalMilliseconds); sw.Restart(); if (simulator.Log.IsClear) @@ -495,7 +510,8 @@ public IAccountStateDelta Execute( stageCleared = true; } sw.Stop(); - Log.Verbose("{AddressesHex} {Source} HAS {Process}: {Elapsed}", addressesHex, source, "ClearStage", sw.Elapsed.TotalMilliseconds); + Log.Verbose("{AddressesHex} {Source} HAS {Process} from #{BlockIndex}: {Elapsed}", + addressesHex, source, "ClearStage", blockIndex, sw.Elapsed.TotalMilliseconds); } sw.Restart(); @@ -526,6 +542,7 @@ public IAccountStateDelta Execute( sw.Stop(); Log.Verbose( "{AddressesHex} {Source} {Process} by simulator({AvatarAddress}); " + + "blockIndex: {BlockIndex} " + "worldId: {WorldId}, stageId: {StageId}, result: {Result}, " + "clearWave: {ClearWave}, totalWave: {TotalWave}", addressesHex, @@ -540,8 +557,8 @@ public IAccountStateDelta Execute( ); } sw.Stop(); - Log.Debug("{AddressesHex} {Source} {Process}: {Elapsed}, Count: {PlayCount}", - addressesHex, source, "loop Simulate", sw.Elapsed.TotalMilliseconds, TotalPlayCount); + Log.Debug("{AddressesHex} {Source} {Process} from #{BlockIndex}: {Elapsed}, Count: {PlayCount}", + addressesHex, source, "loop Simulate", blockIndex, sw.Elapsed.TotalMilliseconds, TotalPlayCount); // Update CrystalRandomSkillState.Stars by clearedWaveNumber. (add) skillState?.Update(starCount, crystalStageBuffSheet); @@ -550,7 +567,8 @@ public IAccountStateDelta Execute( avatarState.updatedAt = blockIndex; avatarState.mailBox.CleanUp(); sw.Stop(); - Log.Verbose("{AddressesHex} {Source} HAS {Process}: {Elapsed}", addressesHex, source, "Update AvatarState", sw.Elapsed.TotalMilliseconds); + Log.Verbose("{AddressesHex} {Source} HAS {Process} from #{BlockIndex}: {Elapsed}", + addressesHex, source, "Update AvatarState", blockIndex, sw.Elapsed.TotalMilliseconds); sw.Restart(); if (isNotClearedStage) @@ -572,10 +590,11 @@ public IAccountStateDelta Execute( .SetState(worldInformationAddress, avatarState.worldInformation.Serialize()) .SetState(questListAddress, avatarState.questList.Serialize()); sw.Stop(); - Log.Verbose("{AddressesHex} {Source} HAS {Process}: {Elapsed}", addressesHex, source, "Set States", sw.Elapsed.TotalMilliseconds); + Log.Verbose("{AddressesHex} {Source} HAS {Process} from #{BlockIndex}: {Elapsed}", + addressesHex, source, "Set States", blockIndex, sw.Elapsed.TotalMilliseconds); var totalElapsed = DateTimeOffset.UtcNow - started; - Log.Verbose("{AddressesHex} {Source} HAS {Process}: {Elapsed}", addressesHex, source, "Total Executed Time", totalElapsed.TotalMilliseconds); + Log.Verbose("{AddressesHex} {Source} HAS {Process}: {Elapsed}, blockIndex: {BlockIndex}", addressesHex, source, "Total Executed Time", totalElapsed.TotalMilliseconds, blockIndex); return states; }