diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/game/NPCHandler.cpp | 17 | ||||
-rw-r--r-- | src/game/Player.cpp | 2 | ||||
-rw-r--r-- | src/game/Player.h | 3 |
3 files changed, 13 insertions, 9 deletions
diff --git a/src/game/NPCHandler.cpp b/src/game/NPCHandler.cpp index 7d2985c0643..30d316afd83 100644 --- a/src/game/NPCHandler.cpp +++ b/src/game/NPCHandler.cpp @@ -157,6 +157,7 @@ void WorldSession::SendTrainerList( uint64 guid, const std::string& strTitle ) // reputation discount float fDiscountMod = _player->GetReputationPriceDiscount(unit); + bool can_learn_primary_prof = GetPlayer()->GetFreePrimaryProffesionPoints() > 0; uint32 count = 0; for(TrainerSpellMap::const_iterator itr = trainer_spells->spellList.begin(); itr != trainer_spells->spellList.end(); ++itr) @@ -166,25 +167,27 @@ void WorldSession::SendTrainerList( uint64 guid, const std::string& strTitle ) if(!_player->IsSpellFitByClassAndRace(tSpell->learnedSpell)) continue; - ++count; - bool primary_prof_first_rank = spellmgr.IsPrimaryProfessionFirstRankSpell(tSpell->learnedSpell); - SpellChainNode const* chain_node = spellmgr.GetSpellChainNode(tSpell->learnedSpell); uint32 req_spell = spellmgr.GetSpellRequired(tSpell->spell); + TrainerSpellState state = _player->GetTrainerSpellState(tSpell); data << uint32(tSpell->spell); // learned spell (or cast-spell in profession case) - data << uint8(_player->GetTrainerSpellState(tSpell)); + data << uint8(state==TRAINER_SPELL_GREEN_DISABLED ? TRAINER_SPELL_GREEN : state); data << uint32(floor(tSpell->spellCost * fDiscountMod)); - data << uint32(primary_prof_first_rank ? 1 : 0); // primary prof. learn confirmation dialog + data << uint32(primary_prof_first_rank && can_learn_primary_prof ? 1 : 0); + // primary prof. learn confirmation dialog data << uint32(primary_prof_first_rank ? 1 : 0); // must be equal prev. field to have learn button in enabled state data << uint8(tSpell->reqLevel); data << uint32(tSpell->reqSkill); data << uint32(tSpell->reqSkillValue); - data << uint32(chain_node && chain_node->prev ? chain_node->prev : req_spell); - data << uint32(chain_node && chain_node->prev ? req_spell : 0); + //prev + req or req + 0 + data << uint32(!tSpell->IsCastable() && chain_node && chain_node->prev ? chain_node->prev : req_spell); + data << uint32(!tSpell->IsCastable() && chain_node && chain_node->prev ? req_spell : 0); data << uint32(0); + + ++count; } data << strTitle; diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 7cb9e7b607a..a5a33c7d2fd 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -3785,7 +3785,7 @@ TrainerSpellState Player::GetTrainerSpellState(TrainerSpell const* trainer_spell // check primary prof. limit if(spellmgr.IsPrimaryProfessionFirstRankSpell(spell->Id) && GetFreePrimaryProffesionPoints() == 0) - return TRAINER_SPELL_RED; + return TRAINER_SPELL_GREEN_DISABLED; return TRAINER_SPELL_GREEN; } diff --git a/src/game/Player.h b/src/game/Player.h index a40a7f1c40c..6a0db61896d 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -122,7 +122,8 @@ enum TrainerSpellState { TRAINER_SPELL_GREEN = 0, TRAINER_SPELL_RED = 1, - TRAINER_SPELL_GRAY = 2 + TRAINER_SPELL_GRAY = 2, + TRAINER_SPELL_GREEN_DISABLED = 10 // custom value, not send to client: formally green but learn not allowed }; enum ActionButtonUpdateState |