Temp Fix modified the HandleTrainerBuySpellOpcode function :
void WorldSession::HandleTrainerBuySpellOpcode(WorldPacket& recv_data)
{
ObjectGuid guid;
uint32 spellId = 0, TrainerTemplateId = 0;
recv_data >> guid >> TrainerTemplateId >> spellId;
DEBUG_LOG("WORLD: Received opcode CMSG_TRAINER_BUY_SPELL Trainer: %s, learn spell id is: %u", guid.GetString().c_str(), spellId);
Creature* unit = GetPlayer()->GetNPCIfCanInteractWith(guid, UNIT_NPC_FLAG_TRAINER);
if (!unit)
{
DEBUG_LOG("WORLD: HandleTrainerBuySpellOpcode - %s not found or you can't interact with him.", guid.GetString().c_str());
return;
}
WorldPacket sendData(SMSG_TRAINER_SERVICE, 16);
uint32 trainState = 2;
if (!unit->IsTrainerOf(_player, true))
trainState = 1;
TrainerSpellData const* cSpells = unit->GetTrainerSpells();
TrainerSpellData const* tSpells = unit->GetTrainerTemplateSpells();
if (!cSpells && !tSpells)
trainState = 1;
TrainerSpell const* trainer_spell = cSpells ? cSpells->Find(spellId) : NULL;
if (!trainer_spell && tSpells)
trainer_spell = tSpells->Find(spellId);
if (!trainer_spell)
trainState = 1;
uint32 reqLevel = 0;
if (!_player->IsSpellFitByClassAndRace(trainer_spell->learnedSpell, &reqLevel))
trainState = 1;
reqLevel = trainer_spell->isProvidedReqLevel ? trainer_spell->reqLevel : std::max(reqLevel, trainer_spell->reqLevel);
if (_player->GetTrainerSpellState(trainer_spell, reqLevel) != TRAINER_SPELL_GREEN)
trainState = 1;
uint32 nSpellCost = uint32(floor(trainer_spell->spellCost * _player->GetReputationPriceDiscount(unit)));
if (_player->GetMoney() < nSpellCost && trainState > 1)
trainState = 0;
// Final hard-level check before spell is learned, money is removed, or visuals sent
if (_player->getLevel() < reqLevel)
{
ChatHandler(this).PSendSysMessage("You must be level %u to learn this spell.", reqLevel);
sendData << ObjectGuid(guid);
sendData << uint32(spellId);
sendData << uint32(1); // 1 = TRAIN_STATE_NOT_LEARNABLE
SendPacket(&sendData);
return;
}
if (trainState != 2)
{
sendData << ObjectGuid(guid);
sendData << uint32(spellId);
sendData << uint32(trainState);
SendPacket(&sendData);
}
else
{
_player->ModifyMoney(-int64(nSpellCost));
// visual effect on trainer
WorldPacket data;
unit->BuildSendPlayVisualPacket(&data, 0xB3, false);
SendPacket(&data);
// visual effect on player
_player->BuildSendPlayVisualPacket(&data, 0x016A, true);
SendPacket(&data);
// learn explicitly or cast explicitly
if (trainer_spell->IsCastable())
{
_player->CastSpell(_player, trainer_spell->spell, true);
}
else
{
_player->learnSpell(spellId, false);
}
sendData << ObjectGuid(guid);
sendData << uint32(spellId);
sendData << uint32(trainState);
SendPacket(&sendData);
}
}