diff options
| author | Wyrserth <43747507+Wyrserth@users.noreply.github.com> | 2019-06-15 14:13:19 +0200 |
|---|---|---|
| committer | Giacomo Pozzoni <giacomopoz@gmail.com> | 2019-06-15 14:13:19 +0200 |
| commit | 2315d43b2c1f478bd5f612e39f3a938bf6640ab6 (patch) | |
| tree | e7d8c65fd0228d100dab941f8531ea5b9d02c42e | |
| parent | e1a5e31498329a0b2d1b6ddd7051a69a1d435421 (diff) | |
Core/Spell: allow Northrend Inscription Research to unlock three recipes the first time it is cast. (#23401)
Also prevent double skill-up because of duplicate UpdateCraftSkill() calls.
| -rw-r--r-- | src/server/game/Skills/SkillDiscovery.cpp | 13 | ||||
| -rw-r--r-- | src/server/game/Skills/SkillDiscovery.h | 1 | ||||
| -rw-r--r-- | src/server/scripts/Spells/spell_generic.cpp | 19 |
3 files changed, 29 insertions, 4 deletions
diff --git a/src/server/game/Skills/SkillDiscovery.cpp b/src/server/game/Skills/SkillDiscovery.cpp index f8fd8f6bfbf..cbaa4ff5ffd 100644 --- a/src/server/game/Skills/SkillDiscovery.cpp +++ b/src/server/game/Skills/SkillDiscovery.cpp @@ -206,6 +206,19 @@ bool HasDiscoveredAllSpells(uint32 spellId, Player* player) return true; } +bool HasDiscoveredAnySpell(uint32 spellId, Player* player) +{ + SkillDiscoveryMap::const_iterator tab = SkillDiscoveryStore.find(int32(spellId)); + if (tab == SkillDiscoveryStore.end()) + return false; + + for (SkillDiscoveryList::const_iterator item_iter = tab->second.begin(); item_iter != tab->second.end(); ++item_iter) + if (player->HasSpell(item_iter->spellId)) + return true; + + return false; +} + uint32 GetSkillDiscoverySpell(uint32 skillId, uint32 spellId, Player* player) { uint32 skillvalue = skillId ? player->GetSkillValue(skillId) : uint32(0); diff --git a/src/server/game/Skills/SkillDiscovery.h b/src/server/game/Skills/SkillDiscovery.h index fa849a5957a..03dcfdbc404 100644 --- a/src/server/game/Skills/SkillDiscovery.h +++ b/src/server/game/Skills/SkillDiscovery.h @@ -26,6 +26,7 @@ class Player; TC_GAME_API void LoadSkillDiscoveryTable(); TC_GAME_API uint32 GetSkillDiscoverySpell(uint32 skillId, uint32 spellId, Player* player); TC_GAME_API bool HasDiscoveredAllSpells(uint32 spellId, Player* player); +TC_GAME_API bool HasDiscoveredAnySpell(uint32 spellId, Player* player); TC_GAME_API uint32 GetExplicitDiscoverySpell(uint32 spellId, Player* player); #endif diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index e03a43331bb..b7a92c9b3dd 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -2820,6 +2820,11 @@ class spell_gen_pet_summoned : public SpellScript } }; +enum ProfessionResearch +{ + SPELL_NORTHREND_INSCRIPTION_RESEARCH = 61177 +}; + class spell_gen_profession_research : public SpellScript { PrepareSpellScript(spell_gen_profession_research); @@ -2831,7 +2836,9 @@ class spell_gen_profession_research : public SpellScript SpellCastResult CheckRequirement() { - if (HasDiscoveredAllSpells(GetSpellInfo()->Id, GetCaster()->ToPlayer())) + Player* player = GetCaster()->ToPlayer(); + + if (HasDiscoveredAllSpells(GetSpellInfo()->Id, player)) { SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_NOTHING_TO_DISCOVER); return SPELL_FAILED_CUSTOM_ERROR; @@ -2845,11 +2852,15 @@ class spell_gen_profession_research : public SpellScript Player* caster = GetCaster()->ToPlayer(); uint32 spellId = GetSpellInfo()->Id; - // learn random explicit discovery recipe (if any) + // Learn random explicit discovery recipe (if any) + // Players will now learn 3 recipes the very first time they perform Northrend Inscription Research (3.3.0 patch notes) + if (spellId == SPELL_NORTHREND_INSCRIPTION_RESEARCH && !HasDiscoveredAnySpell(spellId, caster)) + for (int i = 0; i < 2; ++i) + if (uint32 discoveredSpellId = GetExplicitDiscoverySpell(spellId, caster)) + caster->LearnSpell(discoveredSpellId, false); + if (uint32 discoveredSpellId = GetExplicitDiscoverySpell(spellId, caster)) caster->LearnSpell(discoveredSpellId, false); - - caster->UpdateCraftSkill(spellId); } void Register() override |
