From f706941540b3181270772f93a03508c47e207af5 Mon Sep 17 00:00:00 2001 From: sven-n Date: Mon, 6 May 2024 20:12:28 +0200 Subject: [PATCH 1/3] Automatically add missing Stat Attributes of the character class when entering the game. --- src/GameLogic/Player.cs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/GameLogic/Player.cs b/src/GameLogic/Player.cs index f13e77363..3c8046437 100644 --- a/src/GameLogic/Player.cs +++ b/src/GameLogic/Player.cs @@ -4,6 +4,7 @@ namespace MUnique.OpenMU.GameLogic; +using System.Numerics; using System.Threading; using MUnique.OpenMU.AttributeSystem; using MUnique.OpenMU.DataModel.Attributes; @@ -1786,9 +1787,26 @@ private void RaisePlayerLeftMap(GameMap map) this.PlayerLeftMap?.Invoke(this, (this, map)); } + /// + /// Adds the missing stat attributes, e.g. after the character class has been changed outside of the game. + /// + private void AddMissingStatAttributes() + { + if (this.SelectedCharacter is not { CharacterClass: { } characterClass } character) + { + return; + } + + var missingStats = characterClass.StatAttributes.Where(a => this.SelectedCharacter.Attributes.All(c => c.Definition != a.Attribute)); + + var attributes = missingStats.Select(a => this.PersistenceContext.CreateNew(a.Attribute, a.BaseValue)).ToList(); + attributes.ForEach(character.Attributes.Add); + } + private async ValueTask OnPlayerEnteredWorldAsync() { this.Attributes = new ItemAwareAttributeSystem(this.Account!, this.SelectedCharacter!); + this.AddMissingStatAttributes(); this.Inventory = new InventoryStorage(this, this.GameContext); this.ShopStorage = new ShopStorage(this); this.TemporaryStorage = new Storage(InventoryConstants.TemporaryStorageSize, new TemporaryItemStorage()); From 9ba14b0e348ee05e9bbf8302ee6b893c6e5d95cf Mon Sep 17 00:00:00 2001 From: sven-n Date: Mon, 6 May 2024 20:14:50 +0200 Subject: [PATCH 2/3] Fixed initialization code for infinity arrow skill on quest completion --- .../Initialization/GameConfigurationInitializerBase.cs | 1 + .../Updates/InfinityArrowSkillOnQuestCompletionPlugIn.cs | 1 + src/Persistence/Initialization/Updates/UpdateVersion.cs | 2 +- src/Persistence/Initialization/VersionSeasonSix/Quests.cs | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Persistence/Initialization/GameConfigurationInitializerBase.cs b/src/Persistence/Initialization/GameConfigurationInitializerBase.cs index ff551f281..3b88d0342 100644 --- a/src/Persistence/Initialization/GameConfigurationInitializerBase.cs +++ b/src/Persistence/Initialization/GameConfigurationInitializerBase.cs @@ -39,6 +39,7 @@ public override void Initialize() { this.GameConfiguration.ExperienceRate = 1.0f; this.GameConfiguration.MaximumLevel = 400; + this.GameConfiguration.MaximumMasterLevel = 400; this.GameConfiguration.InfoRange = 12; this.GameConfiguration.AreaSkillHitsPlayer = false; this.GameConfiguration.MaximumInventoryMoney = int.MaxValue; diff --git a/src/Persistence/Initialization/Updates/InfinityArrowSkillOnQuestCompletionPlugIn.cs b/src/Persistence/Initialization/Updates/InfinityArrowSkillOnQuestCompletionPlugIn.cs index 09140246b..16de5c3f9 100644 --- a/src/Persistence/Initialization/Updates/InfinityArrowSkillOnQuestCompletionPlugIn.cs +++ b/src/Persistence/Initialization/Updates/InfinityArrowSkillOnQuestCompletionPlugIn.cs @@ -62,5 +62,6 @@ protected override async ValueTask ApplyAsync(IContext context, GameConfiguratio skillReward.Value = 1; skillReward.SkillReward = gameConfiguration.Skills.First(s => s.Number == (short)SkillNumber.InfinityArrow); skillReward.RewardType = QuestRewardType.Skill; + quest.Rewards.Add(skillReward); } } \ No newline at end of file diff --git a/src/Persistence/Initialization/Updates/UpdateVersion.cs b/src/Persistence/Initialization/Updates/UpdateVersion.cs index e5ec30f9e..cf9ee08d7 100644 --- a/src/Persistence/Initialization/Updates/UpdateVersion.cs +++ b/src/Persistence/Initialization/Updates/UpdateVersion.cs @@ -83,5 +83,5 @@ public enum UpdateVersion /// /// The version of the . /// - InfinityArrowSkillOnQuestCompletion = 14, + InfinityArrowSkillOnQuestCompletion = 15, } \ No newline at end of file diff --git a/src/Persistence/Initialization/VersionSeasonSix/Quests.cs b/src/Persistence/Initialization/VersionSeasonSix/Quests.cs index 537940b42..83799b3b6 100644 --- a/src/Persistence/Initialization/VersionSeasonSix/Quests.cs +++ b/src/Persistence/Initialization/VersionSeasonSix/Quests.cs @@ -249,6 +249,7 @@ private void GainHeroStatus(CharacterClassNumber characterClass) skillReward.Value = 1; skillReward.SkillReward = this.GameConfiguration.Skills.First(s => s.Number == (short)SkillNumber.InfinityArrow); skillReward.RewardType = QuestRewardType.Skill; + heroStatus.Rewards.Add(skillReward); } heroStatus.Rewards.Add(pointReward); From ad96299f402ab9d01a2a0f5c6b937047b09d96e1 Mon Sep 17 00:00:00 2001 From: sven-n Date: Mon, 6 May 2024 20:28:27 +0200 Subject: [PATCH 3/3] Update Player.cs --- src/GameLogic/Player.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/GameLogic/Player.cs b/src/GameLogic/Player.cs index 3c8046437..0a24ce652 100644 --- a/src/GameLogic/Player.cs +++ b/src/GameLogic/Player.cs @@ -4,7 +4,6 @@ namespace MUnique.OpenMU.GameLogic; -using System.Numerics; using System.Threading; using MUnique.OpenMU.AttributeSystem; using MUnique.OpenMU.DataModel.Attributes; @@ -2141,4 +2140,4 @@ public GMMagicEffectDefinition() this.PowerUpDefinitions = new List(0); } } -} \ No newline at end of file +}