aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/master/2017_07_31_00_world.sql3
-rw-r--r--src/server/game/Entities/Creature/Trainer.cpp9
-rw-r--r--src/server/game/Entities/Creature/Trainer.h3
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp10
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;
}
}