From 593ac992bcf3430c3db03f797d855065427a15b7 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Sat, 13 Feb 2021 20:50:56 -0500 Subject: [PATCH] Core/Players: - Fixed auto learning class abilities that are rewarded from quests if starting Exile's Reach in case player chose not to start there Port From (https://github.com/TrinityCore/TrinityCore/commit/b4bdc4eea678628ffdfda9bf2c1f8c9f02b7b7f1) --- Source/Framework/Constants/CliDBConst.cs | 5 +++++ Source/Game/DataStorage/Structs/S_Records.cs | 2 +- Source/Game/Entities/Player/Player.Spells.cs | 15 +++++++++++++-- Source/Game/Spells/SpellInfo.cs | 11 +++++++++++ 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/Source/Framework/Constants/CliDBConst.cs b/Source/Framework/Constants/CliDBConst.cs index 349942714..46860d9f0 100644 --- a/Source/Framework/Constants/CliDBConst.cs +++ b/Source/Framework/Constants/CliDBConst.cs @@ -46,6 +46,11 @@ namespace Framework.Constants RewardedFromQuest = 4 // Learned as quest reward, also re-learned if missing } + public enum SkillLineAbilityFlags + { + CanFallbackToLearnedOnSkillLearn = 0x80, // The skill is rewarded from a quest if player started on exile's reach + } + public enum Anim { Stand = 0, diff --git a/Source/Game/DataStorage/Structs/S_Records.cs b/Source/Game/DataStorage/Structs/S_Records.cs index be15ae4b3..33db55f79 100644 --- a/Source/Game/DataStorage/Structs/S_Records.cs +++ b/Source/Game/DataStorage/Structs/S_Records.cs @@ -109,7 +109,7 @@ namespace Game.DataStorage public AbilityLearnType AcquireMethod; public ushort TrivialSkillLineRankHigh; public ushort TrivialSkillLineRankLow; - public int Flags; + public SkillLineAbilityFlags Flags; public byte NumSkillUps; public short UniqueBit; public short TradeSkillCategoryID; diff --git a/Source/Game/Entities/Player/Player.Spells.cs b/Source/Game/Entities/Player/Player.Spells.cs index 126dcc7e6..ca2f4d180 100644 --- a/Source/Game/Entities/Player/Player.Spells.cs +++ b/Source/Game/Entities/Player/Player.Spells.cs @@ -1580,8 +1580,19 @@ namespace Game.Entities if (spellInfo == null) continue; - if (ability.AcquireMethod != AbilityLearnType.OnSkillValue && ability.AcquireMethod != AbilityLearnType.OnSkillLearn) - continue; + switch (ability.AcquireMethod) + { + case AbilityLearnType.OnSkillValue: + case AbilityLearnType.OnSkillLearn: + break; + case AbilityLearnType.RewardedFromQuest: + if (!ability.Flags.HasAnyFlag(SkillLineAbilityFlags.CanFallbackToLearnedOnSkillLearn) || + !spellInfo.MeetsFutureSpellPlayerCondition(this)) + continue; + break; + default: + continue; + } // AcquireMethod == 2 && NumSkillUps == 1 -. automatically learn riding skill spell, else we skip it (client shows riding in spellbook as trainable). if (skillId == (uint)SkillType.Riding && (ability.AcquireMethod != AbilityLearnType.OnSkillLearn || ability.NumSkillUps != 1)) diff --git a/Source/Game/Spells/SpellInfo.cs b/Source/Game/Spells/SpellInfo.cs index da31a9706..0df2fc3b7 100644 --- a/Source/Game/Spells/SpellInfo.cs +++ b/Source/Game/Spells/SpellInfo.cs @@ -76,6 +76,7 @@ namespace Game.Spells IconFileDataId = _misc.SpellIconFileDataID; ActiveIconFileDataId = _misc.ActiveIconFileDataID; ContentTuningId = _misc.ContentTuningID; + ShowFutureSpellPlayerConditionID = (uint)_misc.ShowFutureSpellPlayerConditionID; } if (visuals != null) @@ -3458,6 +3459,15 @@ namespace Game.Spells } } + public bool MeetsFutureSpellPlayerCondition(Player player) + { + if (ShowFutureSpellPlayerConditionID == 0) + return false; + + var playerCondition = CliDB.PlayerConditionStorage.LookupByKey(ShowFutureSpellPlayerConditionID); + return playerCondition == null || ConditionManager.IsPlayerMeetingCondition(player, playerCondition); + } + public static SpellCastTargetFlags GetTargetFlagMask(SpellTargetObjectTypes objType) { switch (objType) @@ -3600,6 +3610,7 @@ namespace Game.Spells public uint IconFileDataId { get; set; } public uint ActiveIconFileDataId { get; set; } public uint ContentTuningId { get; set; } + public uint ShowFutureSpellPlayerConditionID { get; set; } public LocalizedString SpellName { get; set; } public float ConeAngle { get; set; } public float Width { get; set; }