aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Creature/Trainer.cpp27
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp28
-rw-r--r--src/server/game/Handlers/NPCHandler.cpp11
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());
}