diff options
author | Shauren <shauren.trinity@gmail.com> | 2017-07-31 19:53:02 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2017-07-31 19:53:02 +0200 |
commit | fac8ccf7e0981d3ea376aeff30788d2e53fca92f (patch) | |
tree | c1c88d196f01530423e028b9de45ace4b68f65fe | |
parent | e7c22cbfb5bb233a160f964237250549e81c447e (diff) |
Core/Creatures: Trainer followup
* Drop unused columns
* Send proper spellid in packets for profession ranks
* Added missing rank check
-rw-r--r-- | sql/updates/world/master/2017_07_31_00_world.sql | 3 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/Trainer.cpp | 9 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/Trainer.h | 3 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 10 |
4 files changed, 18 insertions, 7 deletions
diff --git a/sql/updates/world/master/2017_07_31_00_world.sql b/sql/updates/world/master/2017_07_31_00_world.sql new file mode 100644 index 00000000000..20175915156 --- /dev/null +++ b/sql/updates/world/master/2017_07_31_00_world.sql @@ -0,0 +1,3 @@ +ALTER TABLE `creature_template` + DROP `trainer_type`, + DROP `trainer_race`; diff --git a/src/server/game/Entities/Creature/Trainer.cpp b/src/server/game/Entities/Creature/Trainer.cpp index 013d8c73453..d1df0ca9d9b 100644 --- a/src/server/game/Entities/Creature/Trainer.cpp +++ b/src/server/game/Entities/Creature/Trainer.cpp @@ -82,8 +82,8 @@ namespace Trainer player->SendPlaySpellVisualKit(362, 1, 0); // 113 EmoteSalute // learn explicitly or cast explicitly - if (trainerSpell->CastSpellId) - player->CastSpell(player, trainerSpell->CastSpellId, true); + if (trainerSpell->IsCastable()) + player->CastSpell(player, trainerSpell->SpellId, true); else player->LearnSpell(trainerSpell->SpellId, false); } @@ -135,6 +135,11 @@ namespace Trainer if (player->getLevel() < trainerSpell->ReqLevel) return SpellState::Unavailable; + // check ranks + if (uint32 previousRankSpellId = sSpellMgr->GetPrevSpellInChain(trainerSpell->LearnedSpellId)) + if (!player->HasSpell(previousRankSpellId)) + return SpellState::Unavailable; + // check additional spell requirement for (auto const& requirePair : sSpellMgr->GetSpellsRequiredForSpellBounds(trainerSpell->SpellId)) if (!player->HasSpell(requirePair.second)) diff --git a/src/server/game/Entities/Creature/Trainer.h b/src/server/game/Entities/Creature/Trainer.h index 75558cd3b60..7ef442584be 100644 --- a/src/server/game/Entities/Creature/Trainer.h +++ b/src/server/game/Entities/Creature/Trainer.h @@ -59,7 +59,8 @@ namespace Trainer std::array<uint32, 3> ReqAbility = { }; uint8 ReqLevel = 0; - uint32 CastSpellId = 0; + uint32 LearnedSpellId = 0; + bool IsCastable() const { return LearnedSpellId != SpellId; } }; class Trainer diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index a506a7676cd..1db80ed6001 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -8563,13 +8563,15 @@ void ObjectMgr::LoadTrainers() if (!allReqValid) continue; + spell.LearnedSpellId = spell.SpellId; for (SpellEffectInfo const* spellEffect : spellInfo->GetEffectsForDifficulty(DIFFICULTY_NONE)) { - if (spellEffect->IsEffect(SPELL_EFFECT_LEARN_SPELL)) + if (spellEffect && spellEffect->IsEffect(SPELL_EFFECT_LEARN_SPELL)) { - spell.CastSpellId = spell.SpellId; - spell.SpellId = spellEffect->TriggerSpell; - break; + ASSERT(spell.LearnedSpellId == spell.SpellId, + "Only one learned spell is currently supported - spell %u already teaches %u but it tried to overwrite it with %u", + spell.SpellId, spell.LearnedSpellId, spellEffect->TriggerSpell); + spell.LearnedSpellId = spellEffect->TriggerSpell; } } |