mirror of
https://github.com/mangosfour/server.git
synced 2025-12-13 04:37:00 +00:00
[11587] Use SkillRaceClassInfo.dbc data for check spell training.
* Show race/class specific min level in trainer list (for weapon master for example) and use it for check spell traing possibility. * Hide for specific race/class some spells marked by flag ABILITY_SKILL_NONTRAINABLE This possible in cases when spell available for race/class but learned from talent/etc and then don't must be show for race/calss pair in trainer list. Single case in 3.3.5a. * Add to code tables for profession ranks for seelct correct rank related reqlevel and check DB side data for it. Note: DB reqlevel values redundant for profession rank spells now. * Use for reqlevel selection (if DB value not provided) learned spell insteed cast-spell spellLevel field. This let in more cases select training reqlevel without provided DB value. For LogFilter_DbStrictedCheck = 0 mode output data about like redundant reqlevel values in traner tables.
This commit is contained in:
parent
c2199e7030
commit
108a167c46
13 changed files with 179 additions and 29 deletions
|
|
@ -8041,13 +8041,13 @@ void ObjectMgr::LoadTrainers(char const* tableName, bool isTemplates)
|
|||
SpellEntry const *spellinfo = sSpellStore.LookupEntry(spell);
|
||||
if (!spellinfo)
|
||||
{
|
||||
sLog.outErrorDb("Table `%s` for trainer (Entry: %u ) has non existing spell %u, ignore", tableName, entry, spell);
|
||||
sLog.outErrorDb("Table `%s` (Entry: %u ) has non existing spell %u, ignore", tableName, entry, spell);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!SpellMgr::IsSpellValid(spellinfo))
|
||||
{
|
||||
sLog.outErrorDb("Table `%s` for trainer (Entry: %u) has broken learning spell %u, ignore", tableName, entry, spell);
|
||||
sLog.outErrorDb("Table `%s` (Entry: %u) has broken learning spell %u, ignore", tableName, entry, spell);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
@ -8085,7 +8085,7 @@ void ObjectMgr::LoadTrainers(char const* tableName, bool isTemplates)
|
|||
{
|
||||
if (tSpells->spellList.find(spell) != tSpells->spellList.end())
|
||||
{
|
||||
sLog.outErrorDb("Table `%s` for trainer (Entry: %u) has spell %u listed in trainer template %u, ignore", tableName, entry, spell, cInfo->trainerId);
|
||||
sLog.outErrorDb("Table `%s` (Entry: %u) has spell %u listed in trainer template %u, ignore", tableName, entry, spell, cInfo->trainerId);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
|
@ -8100,25 +8100,52 @@ void ObjectMgr::LoadTrainers(char const* tableName, bool isTemplates)
|
|||
trainerSpell.reqSkillValue = fields[4].GetUInt32();
|
||||
trainerSpell.reqLevel = fields[5].GetUInt32();
|
||||
|
||||
if(!trainerSpell.reqLevel)
|
||||
trainerSpell.reqLevel = spellinfo->spellLevel;
|
||||
|
||||
// calculate learned spell for profession case when stored cast-spell
|
||||
trainerSpell.learnedSpell = spell;
|
||||
for(int i = 0; i < MAX_EFFECT_INDEX; ++i)
|
||||
{
|
||||
if (spellinfo->Effect[i] != SPELL_EFFECT_LEARN_SPELL)
|
||||
continue;
|
||||
if (SpellMgr::IsProfessionOrRidingSpell(spellinfo->EffectTriggerSpell[i]))
|
||||
if (spellinfo->Effect[i] == SPELL_EFFECT_LEARN_SPELL &&
|
||||
SpellMgr::IsProfessionOrRidingSpell(spellinfo->EffectTriggerSpell[i]))
|
||||
{
|
||||
trainerSpell.learnedSpell = spellinfo->EffectTriggerSpell[i];
|
||||
// prof spells sometime only additions to main spell learn that have level data
|
||||
for(int j = 0; j < MAX_EFFECT_INDEX; ++j)
|
||||
{
|
||||
if (spellinfo->Effect[j] == SPELL_EFFECT_LEARN_SPELL)
|
||||
{
|
||||
trainerSpell.learnedSpell = spellinfo->EffectTriggerSpell[j];
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// already checked as valid spell so exist.
|
||||
SpellEntry const *learnSpellinfo = sSpellStore.LookupEntry(trainerSpell.learnedSpell);
|
||||
if (trainerSpell.reqLevel)
|
||||
{
|
||||
if (trainerSpell.reqLevel == learnSpellinfo->spellLevel)
|
||||
ERROR_DB_STRICT_LOG("Table `%s` (Entry: %u) has redundant reqlevel %u (=spell level) for spell %u", tableName, entry, trainerSpell.reqLevel, spell);
|
||||
}
|
||||
else
|
||||
trainerSpell.reqLevel = learnSpellinfo->spellLevel;
|
||||
|
||||
if (SpellMgr::IsProfessionSpell(trainerSpell.learnedSpell))
|
||||
{
|
||||
data.trainerType = 2;
|
||||
|
||||
uint32 minLevel = sSpellMgr.GetProfessionSpellMinLevel(trainerSpell.learnedSpell);
|
||||
if (trainerSpell.reqLevel)
|
||||
{
|
||||
if (minLevel == trainerSpell.reqLevel)
|
||||
ERROR_DB_STRICT_LOG("Table `%s` (Entry: %u) has redundant reqlevel %u (=prof reqlevel) for spell %u", tableName, entry, trainerSpell.reqLevel, spell);
|
||||
else
|
||||
sLog.outErrorDb("Table `%s` (Entry: %u) has wrong redundant reqlevel %u (<>prof reqlevel %u) for spell %u", tableName, entry, trainerSpell.reqLevel, minLevel, spell);
|
||||
}
|
||||
else
|
||||
trainerSpell.reqLevel = minLevel;
|
||||
}
|
||||
|
||||
++count;
|
||||
|
||||
} while (result->NextRow());
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue