diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/game/Entities/Creature/Trainer.cpp | 27 | ||||
| -rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 28 | ||||
| -rw-r--r-- | src/server/game/Handlers/NPCHandler.cpp | 11 |
3 files changed, 52 insertions, 14 deletions
diff --git a/src/server/game/Entities/Creature/Trainer.cpp b/src/server/game/Entities/Creature/Trainer.cpp index 266e96df27f..83fbde25396 100644 --- a/src/server/game/Entities/Creature/Trainer.cpp +++ b/src/server/game/Entities/Creature/Trainer.cpp @@ -209,17 +209,24 @@ namespace Trainer bool Trainer::IsTrainerValidForPlayer(Player const* player) const { - // check class for class trainers - if (player->getClass() != GetTrainerRequirement() && (GetTrainerType() == Type::Class || GetTrainerType() == Type::Pet)) - return false; - - // check race for mount trainers - if (player->getRace() != GetTrainerRequirement() && GetTrainerType() == Type::Mount) - return false; + if (!GetTrainerRequirement()) + return true; - // check spell for profession trainers - if (!player->HasSpell(GetTrainerRequirement()) && GetTrainerRequirement() != 0 && GetTrainerType() == Type::Tradeskill) - return false; + switch (GetTrainerType()) + { + case Type::Class: + case Type::Pet: + // check class for class trainers + return player->getClass() == GetTrainerRequirement(); + case Type::Mount: + // check race for mount trainers + return player->getRace() == GetTrainerRequirement(); + case Type::Tradeskill: + // check spell for profession trainers + return player->HasSpell(GetTrainerRequirement()); + default: + break; + } return true; } diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index f4277e3ffec..df4cdc346c2 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -8742,6 +8742,34 @@ void ObjectMgr::LoadTrainers() spellsByTrainer.erase(spellsItr); } + switch (trainerType) + { + case Trainer::Type::Class: + case Trainer::Type::Pet: + if (requirement && !sChrClassesStore.LookupEntry(requirement)) + { + TC_LOG_ERROR("sql.sql", "Table `trainer` references non-existing class requirement %u for TrainerId %u, ignoring", requirement, trainerId); + continue; + } + break; + case Trainer::Type::Mount: + if (requirement && !sChrRacesStore.LookupEntry(requirement)) + { + TC_LOG_ERROR("sql.sql", "Table `trainer` references non-existing race requirement %u for TrainerId %u, ignoring", requirement, trainerId); + continue; + } + break; + case Trainer::Type::Tradeskill: + if (requirement && !sSpellMgr->GetSpellInfo(requirement)) + { + TC_LOG_ERROR("sql.sql", "Table `trainer` references non-existing spell requirement %u for TrainerId %u, ignoring", requirement, trainerId); + continue; + } + break; + default: + break; + } + _trainers.emplace(std::piecewise_construct, std::forward_as_tuple(trainerId), std::forward_as_tuple(trainerId, trainerType, requirement, std::move(greeting), std::move(spells))); } while (trainersResult->NextRow()); } diff --git a/src/server/game/Handlers/NPCHandler.cpp b/src/server/game/Handlers/NPCHandler.cpp index 7f9655c417c..ad3260233d5 100644 --- a/src/server/game/Handlers/NPCHandler.cpp +++ b/src/server/game/Handlers/NPCHandler.cpp @@ -125,10 +125,7 @@ void WorldSession::HandleTrainerListOpcode(WorldPackets::NPC::Hello& packet) return; } - if (sObjectMgr->GetTrainer(npc->GetEntry())) - SendTrainerList(npc); - else - TC_LOG_DEBUG("network", "WorldSession::SendTrainerList - Creature id %u has no trainer data.", npc->GetEntry()); + SendTrainerList(npc); } void WorldSession::SendTrainerList(Creature* npc) @@ -144,6 +141,12 @@ void WorldSession::SendTrainerList(Creature* npc) return; } + if (!trainer->IsTrainerValidForPlayer(_player)) + { + TC_LOG_DEBUG("network", "WorldSession: SendTrainerList - trainer %s not valid for player %s", npc->GetGUID().ToString().c_str(), GetPlayerInfo().c_str()); + return; + } + trainer->SendSpells(npc, _player, GetSessionDbLocaleIndex()); } |
