[8014] Fixes and cleanup in error messages at skill_discovery_template loading.

Signed-off-by: VladimirMangos <vladimir@getmangos.com>
This commit is contained in:
NoFantasy 2009-06-14 19:30:29 +04:00 committed by VladimirMangos
parent 25140ea3cc
commit 2377917176
2 changed files with 100 additions and 92 deletions

View file

@ -55,85 +55,93 @@ void LoadSkillDiscoveryTable()
QueryResult *result = WorldDatabase.Query("SELECT spellId, reqSpell, reqSkillValue, chance FROM skill_discovery_template"); QueryResult *result = WorldDatabase.Query("SELECT spellId, reqSpell, reqSkillValue, chance FROM skill_discovery_template");
if (result) if (result)
{
barGoLink bar(result->GetRowCount());
std::ostringstream ssNonDiscoverableEntries;
do
{
Field *fields = result->Fetch();
bar.step();
uint32 spellId = fields[0].GetUInt32();
int32 reqSkillOrSpell = fields[1].GetInt32();
uint32 reqSkillValue = fields[2].GetInt32();
float chance = fields[3].GetFloat();
if( chance <= 0 ) // chance
{
ssNonDiscoverableEntries << "spellId = " << spellId << " reqSkillOrSpell = " << reqSkillOrSpell
<< " reqSkillValue = " << reqSkillValue << " chance = " << chance << "(chance problem)\n";
continue;
}
if(reqSkillOrSpell > 0) // spell case
{
SpellEntry const* spellEntry = sSpellStore.LookupEntry(reqSkillOrSpell);
if( !spellEntry )
{
sLog.outErrorDb("Spell (ID: %u) have not existed spell (ID: %i) in `reqSpell` field in `skill_discovery_template` table",spellId,reqSkillOrSpell);
continue;
}
// mechanic discovery
if (spellEntry->Mechanic != MECHANIC_DISCOVERY &&
// explicit discovery ability
!IsExplicitDiscoverySpell(spellEntry))
{
sLog.outErrorDb("Spell (ID: %u) not have have MECHANIC_DISCOVERY (28) value in Mechanic field in spell.dbc and not 100%% chance random discovery ability but listed in `skill_discovery_template` table",spellId);
continue;
}
SkillDiscoveryStore[reqSkillOrSpell].push_back( SkillDiscoveryEntry(spellId, reqSkillValue, chance) );
}
else if( reqSkillOrSpell == 0 ) // skill case
{
SkillLineAbilityMap::const_iterator lower = spellmgr.GetBeginSkillLineAbilityMap(spellId);
SkillLineAbilityMap::const_iterator upper = spellmgr.GetEndSkillLineAbilityMap(spellId);
if(lower==upper)
{
sLog.outErrorDb("Spell (ID: %u) not listed in `SkillLineAbility.dbc` but listed with `reqSpell`=0 in `skill_discovery_template` table",spellId);
continue;
}
for(SkillLineAbilityMap::const_iterator _spell_idx = lower; _spell_idx != upper; ++_spell_idx)
{
SkillDiscoveryStore[-int32(_spell_idx->second->skillId)].push_back( SkillDiscoveryEntry(spellId, reqSkillValue, chance) );
}
}
else
{
sLog.outErrorDb("Spell (ID: %u) have negative value in `reqSpell` field in `skill_discovery_template` table",spellId);
continue;
}
++count;
} while (result->NextRow());
delete result;
sLog.outString();
sLog.outString( ">> Loaded %u skill discovery definitions", count );
if(!ssNonDiscoverableEntries.str().empty())
sLog.outErrorDb("Some items can't be successfully discovered: have in chance field value < 0.000001 in `skill_discovery_template` DB table . List:\n%s",ssNonDiscoverableEntries.str().c_str());
}
else
{ {
sLog.outString(); sLog.outString();
sLog.outString( ">> Loaded 0 skill discovery definitions. DB table `skill_discovery_template` is empty." ); sLog.outString( ">> Loaded 0 skill discovery definitions. DB table `skill_discovery_template` is empty." );
return;
} }
barGoLink bar(result->GetRowCount());
std::ostringstream ssNonDiscoverableEntries;
std::set<uint32> reportedReqSpells;
do
{
Field *fields = result->Fetch();
bar.step();
uint32 spellId = fields[0].GetUInt32();
int32 reqSkillOrSpell = fields[1].GetInt32();
uint32 reqSkillValue = fields[2].GetInt32();
float chance = fields[3].GetFloat();
if (chance <= 0) // chance
{
ssNonDiscoverableEntries << "spellId = " << spellId << " reqSkillOrSpell = " << reqSkillOrSpell
<< " reqSkillValue = " << reqSkillValue << " chance = " << chance << "(chance problem)\n";
continue;
}
if (reqSkillOrSpell > 0) // spell case
{
SpellEntry const* reqSpellEntry = sSpellStore.LookupEntry(reqSkillOrSpell);
if (!reqSpellEntry)
{
if(reportedReqSpells.count(reqSkillOrSpell)==0)
{
sLog.outErrorDb("Spell (ID: %u) have not existed spell (ID: %i) in `reqSpell` field in `skill_discovery_template` table",spellId,reqSkillOrSpell);
reportedReqSpells.insert(reqSkillOrSpell);
}
continue;
}
// mechanic discovery
if (reqSpellEntry->Mechanic != MECHANIC_DISCOVERY &&
// explicit discovery ability
!IsExplicitDiscoverySpell(reqSpellEntry))
{
if (reportedReqSpells.count(reqSkillOrSpell)==0)
{
sLog.outErrorDb("Spell (ID: %u) not have have MECHANIC_DISCOVERY (28) value in Mechanic field in spell.dbc and not 100%% chance random discovery ability but listed for spellId %u (and maybe more) in `skill_discovery_template` table",reqSkillOrSpell,spellId);
reportedReqSpells.insert(reqSkillOrSpell);
}
continue;
}
SkillDiscoveryStore[reqSkillOrSpell].push_back( SkillDiscoveryEntry(spellId, reqSkillValue, chance) );
}
else if( reqSkillOrSpell == 0 ) // skill case
{
SkillLineAbilityMap::const_iterator lower = spellmgr.GetBeginSkillLineAbilityMap(spellId);
SkillLineAbilityMap::const_iterator upper = spellmgr.GetEndSkillLineAbilityMap(spellId);
if(lower==upper)
{
sLog.outErrorDb("Spell (ID: %u) not listed in `SkillLineAbility.dbc` but listed with `reqSpell`=0 in `skill_discovery_template` table",spellId);
continue;
}
for(SkillLineAbilityMap::const_iterator _spell_idx = lower; _spell_idx != upper; ++_spell_idx)
{
SkillDiscoveryStore[-int32(_spell_idx->second->skillId)].push_back( SkillDiscoveryEntry(spellId, reqSkillValue, chance) );
}
}
else
{
sLog.outErrorDb("Spell (ID: %u) have negative value in `reqSpell` field in `skill_discovery_template` table",spellId);
continue;
}
++count;
} while (result->NextRow());
delete result;
sLog.outString();
sLog.outString( ">> Loaded %u skill discovery definitions", count );
if(!ssNonDiscoverableEntries.str().empty())
sLog.outErrorDb("Some items can't be successfully discovered: have in chance field value < 0.000001 in `skill_discovery_template` DB table . List:\n%s",ssNonDiscoverableEntries.str().c_str());
} }
uint32 GetExplicitDiscoverySpell(uint32 spellId, Player* player) uint32 GetExplicitDiscoverySpell(uint32 spellId, Player* player)
@ -141,7 +149,7 @@ uint32 GetExplicitDiscoverySpell(uint32 spellId, Player* player)
// explicit discovery spell chances (always success if case exist) // explicit discovery spell chances (always success if case exist)
// in this case we have both skill and spell // in this case we have both skill and spell
SkillDiscoveryMap::const_iterator tab = SkillDiscoveryStore.find(spellId); SkillDiscoveryMap::const_iterator tab = SkillDiscoveryStore.find(spellId);
if(tab == SkillDiscoveryStore.end()) if (tab == SkillDiscoveryStore.end())
return 0; return 0;
SkillLineAbilityMap::const_iterator lower = spellmgr.GetBeginSkillLineAbilityMap(spellId); SkillLineAbilityMap::const_iterator lower = spellmgr.GetBeginSkillLineAbilityMap(spellId);
@ -150,22 +158,22 @@ uint32 GetExplicitDiscoverySpell(uint32 spellId, Player* player)
float full_chance = 0; float full_chance = 0;
for(SkillDiscoveryList::const_iterator item_iter = tab->second.begin(); item_iter != tab->second.end(); ++item_iter) for(SkillDiscoveryList::const_iterator item_iter = tab->second.begin(); item_iter != tab->second.end(); ++item_iter)
if(item_iter->reqSkillValue <= skillvalue) if (item_iter->reqSkillValue <= skillvalue)
if(!player->HasSpell(item_iter->spellId)) if (!player->HasSpell(item_iter->spellId))
full_chance += item_iter->chance; full_chance += item_iter->chance;
float rate = full_chance / 100.0f; float rate = full_chance / 100.0f;
float roll = rand_chance() * rate; // roll now in range 0..full_chance float roll = rand_chance() * rate; // roll now in range 0..full_chance
for(SkillDiscoveryList::const_iterator item_iter = tab->second.begin(); item_iter != tab->second.end(); ++item_iter) for(SkillDiscoveryList::const_iterator item_iter = tab->second.begin(); item_iter != tab->second.end(); ++item_iter)
{ {
if(item_iter->reqSkillValue > skillvalue) if (item_iter->reqSkillValue > skillvalue)
continue; continue;
if(player->HasSpell(item_iter->spellId)) if (player->HasSpell(item_iter->spellId))
continue; continue;
if(item_iter->chance > roll) if (item_iter->chance > roll)
return item_iter->spellId; return item_iter->spellId;
roll -= item_iter->chance; roll -= item_iter->chance;
@ -181,31 +189,31 @@ uint32 GetSkillDiscoverySpell(uint32 skillId, uint32 spellId, Player* player)
// check spell case // check spell case
SkillDiscoveryMap::const_iterator tab = SkillDiscoveryStore.find(spellId); SkillDiscoveryMap::const_iterator tab = SkillDiscoveryStore.find(spellId);
if(tab != SkillDiscoveryStore.end()) if (tab != SkillDiscoveryStore.end())
{ {
for(SkillDiscoveryList::const_iterator item_iter = tab->second.begin(); item_iter != tab->second.end(); ++item_iter) for(SkillDiscoveryList::const_iterator item_iter = tab->second.begin(); item_iter != tab->second.end(); ++item_iter)
{ {
if( roll_chance_f(item_iter->chance * sWorld.getRate(RATE_SKILL_DISCOVERY)) if (roll_chance_f(item_iter->chance * sWorld.getRate(RATE_SKILL_DISCOVERY)) &&
&& item_iter->reqSkillValue <= skillvalue item_iter->reqSkillValue <= skillvalue &&
&& !player->HasSpell(item_iter->spellId) ) !player->HasSpell(item_iter->spellId))
return item_iter->spellId; return item_iter->spellId;
} }
return 0; return 0;
} }
if(!skillId) if (!skillId)
return 0; return 0;
// check skill line case // check skill line case
tab = SkillDiscoveryStore.find(-(int32)skillId); tab = SkillDiscoveryStore.find(-(int32)skillId);
if(tab != SkillDiscoveryStore.end()) if (tab != SkillDiscoveryStore.end())
{ {
for(SkillDiscoveryList::const_iterator item_iter = tab->second.begin(); item_iter != tab->second.end(); ++item_iter) for(SkillDiscoveryList::const_iterator item_iter = tab->second.begin(); item_iter != tab->second.end(); ++item_iter)
{ {
if( roll_chance_f(item_iter->chance * sWorld.getRate(RATE_SKILL_DISCOVERY)) if (roll_chance_f(item_iter->chance * sWorld.getRate(RATE_SKILL_DISCOVERY)) &&
&& item_iter->reqSkillValue <= skillvalue item_iter->reqSkillValue <= skillvalue &&
&& !player->HasSpell(item_iter->spellId) ) !player->HasSpell(item_iter->spellId))
return item_iter->spellId; return item_iter->spellId;
} }

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "8013" #define REVISION_NR "8014"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__