From 6c7cc1690f1c51067e3943bcfcd00029367fc951 Mon Sep 17 00:00:00 2001 From: UltraNix <80540499+UltraNix@users.noreply.github.com> Date: Sun, 21 Mar 2021 15:18:41 +0100 Subject: [PATCH] fix(Core/Creatures): Fixed displaying trainer npcflags that are not valid to player. (#4848) --- .../game/Entities/Creature/Creature.cpp | 41 +++++++++++++++++++ src/server/game/Entities/Creature/Creature.h | 1 + src/server/game/Entities/Player/Player.cpp | 5 +++ src/server/game/Entities/Unit/Unit.cpp | 5 +++ 4 files changed, 52 insertions(+) diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 5195f9733..94584ef26 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -1033,6 +1033,47 @@ bool Creature::isCanTrainingAndResetTalentsOf(Player* player) const && player->getClass() == GetCreatureTemplate()->trainer_class; } +bool Creature::IsValidTrainerForPlayer(Player* player, uint32* npcFlags /*= nullptr*/) const +{ + if (!IsTrainer()) + { + return false; + } + + switch (m_creatureInfo->trainer_type) + { + case TRAINER_TYPE_CLASS: + case TRAINER_TYPE_PETS: + if (m_creatureInfo->trainer_class && m_creatureInfo->trainer_class != player->getClass()) + { + if (npcFlags) + *npcFlags &= ~UNIT_NPC_FLAG_TRAINER_CLASS; + + return false; + } + break; + case TRAINER_TYPE_MOUNTS: + if (m_creatureInfo->trainer_race && m_creatureInfo->trainer_race != player->getRace()) + { + return false; + } + break; + case TRAINER_TYPE_TRADESKILLS: + if (m_creatureInfo->trainer_spell && !player->HasSpell(m_creatureInfo->trainer_spell)) + { + if (npcFlags) + *npcFlags &= ~UNIT_NPC_FLAG_TRAINER_PROFESSION; + + return false; + } + break; + default: + break; + } + + return true; +} + Player* Creature::GetLootRecipient() const { if (!m_lootRecipient) diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 3d4a88ad7..124074ffc 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -474,6 +474,7 @@ public: ///// TODO RENAME THIS!!!!! bool isCanInteractWithBattleMaster(Player* player, bool msg) const; bool isCanTrainingAndResetTalentsOf(Player* player) const; + [[nodiscard]] bool IsValidTrainerForPlayer(Player* player, uint32* npcFlags = nullptr) const; bool CanCreatureAttack(Unit const* victim, bool skipDistCheck = false) const; void LoadSpellTemplateImmunity(); bool IsImmunedToSpell(SpellInfo const* spellInfo) override; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 767c6087d..65dc9a906 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -15074,6 +15074,11 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId /*= 0*/, bool canTalk = false; break; case GOSSIP_OPTION_TRAINER: + if (!creature->IsValidTrainerForPlayer(this)) + { + canTalk = false; + } + break; case GOSSIP_OPTION_GOSSIP: case GOSSIP_OPTION_SPIRITGUIDE: case GOSSIP_OPTION_INNKEEPER: diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index de12eb62f..de745c87c 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -19844,6 +19844,11 @@ void Unit::BuildValuesUpdate(uint8 updateType, ByteBuffer* data, Player* target) if (!target->CanSeeSpellClickOn(creature)) appendValue &= ~UNIT_NPC_FLAG_SPELLCLICK; + + if (!creature->IsValidTrainerForPlayer(target, &appendValue)) + { + appendValue &= ~UNIT_NPC_FLAG_TRAINER; + } } fieldBuffer << uint32(appendValue);