mirror of
https://github.com/mangosfour/server.git
synced 2025-12-14 07:37:01 +00:00
[8426] Use upper/lower iterator pairs as result instead 2 function calls.
This commit is contained in:
parent
fdb2842f60
commit
5d50bb16b8
9 changed files with 139 additions and 173 deletions
|
|
@ -1208,18 +1208,18 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
|
|||
}
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM:
|
||||
// miscvalue1 = item_id
|
||||
if(!miscvalue1)
|
||||
if (!miscvalue1)
|
||||
continue;
|
||||
if(miscvalue1 != achievementCriteria->equip_item.itemID)
|
||||
if (miscvalue1 != achievementCriteria->equip_item.itemID)
|
||||
continue;
|
||||
|
||||
SetCriteriaProgress(achievementCriteria, 1);
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT:
|
||||
// miscvalue1 = go entry
|
||||
if(!miscvalue1)
|
||||
if (!miscvalue1)
|
||||
continue;
|
||||
if(miscvalue1 != achievementCriteria->use_gameobject.goEntry)
|
||||
if (miscvalue1 != achievementCriteria->use_gameobject.goEntry)
|
||||
continue;
|
||||
|
||||
SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
|
||||
|
|
@ -1234,7 +1234,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
|
|||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS:
|
||||
{
|
||||
if(miscvalue1 && miscvalue1 != achievementCriteria->learn_skillline_spell.skillLine)
|
||||
if (miscvalue1 && miscvalue1 != achievementCriteria->learn_skillline_spell.skillLine)
|
||||
continue;
|
||||
|
||||
uint32 spellCount = 0;
|
||||
|
|
@ -1242,9 +1242,8 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
|
|||
spellIter != GetPlayer()->GetSpellMap().end();
|
||||
++spellIter)
|
||||
{
|
||||
for(SkillLineAbilityMap::const_iterator skillIter = spellmgr.GetBeginSkillLineAbilityMap(spellIter->first);
|
||||
skillIter != spellmgr.GetEndSkillLineAbilityMap(spellIter->first);
|
||||
++skillIter)
|
||||
SkillLineAbilityMapBounds bounds = spellmgr.GetSkillLineAbilityMapBounds(spellIter->first);
|
||||
for(SkillLineAbilityMap::const_iterator skillIter = bounds.first; skillIter != bounds.second; ++skillIter)
|
||||
{
|
||||
if(skillIter->second->skillId == achievementCriteria->learn_skillline_spell.skillLine)
|
||||
spellCount++;
|
||||
|
|
@ -1255,17 +1254,17 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
|
|||
}
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL:
|
||||
// AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
|
||||
if(!miscvalue1)
|
||||
if (!miscvalue1)
|
||||
continue;
|
||||
|
||||
if(achievementCriteria->win_duel.duelCount)
|
||||
if (achievementCriteria->win_duel.duelCount)
|
||||
{
|
||||
// those requirements couldn't be found in the dbc
|
||||
AchievementCriteriaDataSet const* data = achievementmgr.GetCriteriaDataSet(achievementCriteria);
|
||||
if(!data)
|
||||
if (!data)
|
||||
continue;
|
||||
|
||||
if(!data->Meets(GetPlayer(),unit))
|
||||
if (!data->Meets(GetPlayer(),unit))
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
@ -1301,7 +1300,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
|
|||
}
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE:
|
||||
{
|
||||
if(miscvalue1 && miscvalue1 != achievementCriteria->learn_skill_line.skillLine)
|
||||
if (miscvalue1 && miscvalue1 != achievementCriteria->learn_skill_line.skillLine)
|
||||
continue;
|
||||
|
||||
uint32 spellCount = 0;
|
||||
|
|
@ -1309,13 +1308,10 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
|
|||
spellIter != GetPlayer()->GetSpellMap().end();
|
||||
++spellIter)
|
||||
{
|
||||
for(SkillLineAbilityMap::const_iterator skillIter = spellmgr.GetBeginSkillLineAbilityMap(spellIter->first);
|
||||
skillIter != spellmgr.GetEndSkillLineAbilityMap(spellIter->first);
|
||||
++skillIter)
|
||||
{
|
||||
if(skillIter->second->skillId == achievementCriteria->learn_skill_line.skillLine)
|
||||
SkillLineAbilityMapBounds bounds = spellmgr.GetSkillLineAbilityMapBounds(spellIter->first);
|
||||
for(SkillLineAbilityMap::const_iterator skillIter = bounds.first; skillIter != bounds.second; ++skillIter)
|
||||
if (skillIter->second->skillId == achievementCriteria->learn_skill_line.skillLine)
|
||||
spellCount++;
|
||||
}
|
||||
}
|
||||
SetCriteriaProgress(achievementCriteria, spellCount);
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -1331,12 +1331,12 @@ valid examples:
|
|||
c = reader.peek();
|
||||
}
|
||||
GlyphPropertiesEntry const* glyph = sGlyphPropertiesStore.LookupEntry(glyphId);
|
||||
if(!glyph)
|
||||
if (!glyph)
|
||||
return false;
|
||||
|
||||
linkedSpell = sSpellStore.LookupEntry(glyph->SpellId);
|
||||
|
||||
if(!linkedSpell)
|
||||
if (!linkedSpell)
|
||||
return false;
|
||||
}
|
||||
else
|
||||
|
|
@ -1349,10 +1349,10 @@ valid examples:
|
|||
break;
|
||||
case 'h':
|
||||
// if h is next element in sequence, this one must contain the linked text :)
|
||||
if(*validSequenceIterator == 'h')
|
||||
if (*validSequenceIterator == 'h')
|
||||
{
|
||||
// links start with '['
|
||||
if(reader.get() != '[')
|
||||
if (reader.get() != '[')
|
||||
{
|
||||
#ifdef MANGOS_DEBUG
|
||||
sLog.outBasic("ChatHandler::isValidChatMessage link caption doesn't start with '['");
|
||||
|
|
@ -1365,18 +1365,16 @@ valid examples:
|
|||
if (linkedSpell)
|
||||
{
|
||||
// spells with that flag have a prefix of "$PROFESSION: "
|
||||
if(linkedSpell->Attributes & SPELL_ATTR_TRADESPELL)
|
||||
if (linkedSpell->Attributes & SPELL_ATTR_TRADESPELL)
|
||||
{
|
||||
// lookup skillid
|
||||
SkillLineAbilityMap::const_iterator lower = spellmgr.GetBeginSkillLineAbilityMap(linkedSpell->Id);
|
||||
SkillLineAbilityMap::const_iterator upper = spellmgr.GetEndSkillLineAbilityMap(linkedSpell->Id);
|
||||
|
||||
if(lower == upper)
|
||||
SkillLineAbilityMapBounds bounds = spellmgr.GetSkillLineAbilityMapBounds(linkedSpell->Id);
|
||||
if (bounds.first == bounds.second)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
SkillLineAbilityEntry const *skillInfo = lower->second;
|
||||
SkillLineAbilityEntry const *skillInfo = bounds.first->second;
|
||||
|
||||
if (!skillInfo)
|
||||
{
|
||||
|
|
@ -1384,7 +1382,7 @@ valid examples:
|
|||
}
|
||||
|
||||
SkillLineEntry const *skillLine = sSkillLineStore.LookupEntry(skillInfo->skillId);
|
||||
if(!skillLine)
|
||||
if (!skillLine)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
|
@ -1392,7 +1390,7 @@ valid examples:
|
|||
for(uint8 i=0; i<MAX_LOCALE; ++i)
|
||||
{
|
||||
uint32 skillLineNameLength = strlen(skillLine->name[i]);
|
||||
if(skillLineNameLength > 0 && strncmp(skillLine->name[i], buffer, skillLineNameLength) == 0)
|
||||
if (skillLineNameLength > 0 && strncmp(skillLine->name[i], buffer, skillLineNameLength) == 0)
|
||||
{
|
||||
// found the prefix, remove it to perform spellname validation below
|
||||
// -2 = strlen(": ")
|
||||
|
|
@ -1404,22 +1402,22 @@ valid examples:
|
|||
bool foundName = false;
|
||||
for(uint8 i=0; i<MAX_LOCALE; ++i)
|
||||
{
|
||||
if(*linkedSpell->SpellName[i] && strcmp(linkedSpell->SpellName[i], buffer) == 0)
|
||||
if (*linkedSpell->SpellName[i] && strcmp(linkedSpell->SpellName[i], buffer) == 0)
|
||||
{
|
||||
foundName = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!foundName)
|
||||
if (!foundName)
|
||||
return false;
|
||||
}
|
||||
else if(linkedQuest)
|
||||
else if (linkedQuest)
|
||||
{
|
||||
if (linkedQuest->GetTitle() != buffer)
|
||||
{
|
||||
QuestLocale const *ql = objmgr.GetQuestLocale(linkedQuest->GetQuestId());
|
||||
|
||||
if(!ql)
|
||||
if (!ql)
|
||||
{
|
||||
#ifdef MANOGS_DEBUG
|
||||
sLog.outBasic("ChatHandler::isValidChatMessage default questname didn't match and there is no locale");
|
||||
|
|
@ -1430,13 +1428,13 @@ valid examples:
|
|||
bool foundName = false;
|
||||
for(uint8 i=0; i<ql->Title.size(); i++)
|
||||
{
|
||||
if(ql->Title[i] == buffer)
|
||||
if (ql->Title[i] == buffer)
|
||||
{
|
||||
foundName = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!foundName)
|
||||
if (!foundName)
|
||||
{
|
||||
#ifdef MANOGS_DEBUG
|
||||
sLog.outBasic("ChatHandler::isValidChatMessage no quest locale title matched")
|
||||
|
|
@ -1447,11 +1445,11 @@ valid examples:
|
|||
}
|
||||
else if(linkedItem)
|
||||
{
|
||||
if(strcmp(linkedItem->Name1, buffer) != 0)
|
||||
if (strcmp(linkedItem->Name1, buffer) != 0)
|
||||
{
|
||||
ItemLocale const *il = objmgr.GetItemLocale(linkedItem->ItemId);
|
||||
|
||||
if(!il)
|
||||
if (!il)
|
||||
{
|
||||
#ifdef MANGOS_DEBUG
|
||||
sLog.outBasic("ChatHandler::isValidChatMessage linked item name doesn't is wrong and there is no localization");
|
||||
|
|
@ -1462,13 +1460,13 @@ valid examples:
|
|||
bool foundName = false;
|
||||
for(uint8 i=0; i<il->Name.size(); ++i)
|
||||
{
|
||||
if(il->Name[i] == buffer)
|
||||
if (il->Name[i] == buffer)
|
||||
{
|
||||
foundName = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!foundName)
|
||||
if (!foundName)
|
||||
{
|
||||
#ifdef MANGOS_DEBUG
|
||||
sLog.outBasic("ChatHandler::isValidChatMessage linked item name wasn't found in any localization");
|
||||
|
|
@ -1477,18 +1475,18 @@ valid examples:
|
|||
}
|
||||
}
|
||||
}
|
||||
else if(linkedAchievement)
|
||||
else if (linkedAchievement)
|
||||
{
|
||||
bool foundName = false;
|
||||
for(uint8 i=0; i<MAX_LOCALE; ++i)
|
||||
{
|
||||
if(*linkedAchievement->name[i], strcmp(linkedAchievement->name[i], buffer) == 0)
|
||||
if (*linkedAchievement->name[i], strcmp(linkedAchievement->name[i], buffer) == 0)
|
||||
{
|
||||
foundName = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!foundName)
|
||||
if (!foundName)
|
||||
return false;
|
||||
}
|
||||
// that place should never be reached - if nothing linked has been set in |H
|
||||
|
|
|
|||
|
|
@ -2028,10 +2028,8 @@ void ObjectMgr::LoadItemRequiredTarget()
|
|||
if (pItemProto->Spells[i].SpellTrigger == ITEM_SPELLTRIGGER_ON_USE ||
|
||||
pItemProto->Spells[i].SpellTrigger == ITEM_SPELLTRIGGER_ON_NO_DELAY_USE)
|
||||
{
|
||||
SpellScriptTarget::const_iterator lower = spellmgr.GetBeginSpellScriptTarget(pSpellInfo->Id);
|
||||
SpellScriptTarget::const_iterator upper = spellmgr.GetEndSpellScriptTarget(pSpellInfo->Id);
|
||||
|
||||
if (lower != upper)
|
||||
SpellScriptTargetBounds bounds = spellmgr.GetSpellScriptTargetBounds(pSpellInfo->Id);
|
||||
if (bounds.first != bounds.second)
|
||||
break;
|
||||
|
||||
for (int j = 0; j < 3; ++j)
|
||||
|
|
|
|||
|
|
@ -2999,7 +2999,7 @@ bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool dependen
|
|||
|
||||
// cast talents with SPELL_EFFECT_LEARN_SPELL (other dependent spells will learned later as not auto-learned)
|
||||
// note: all spells with SPELL_EFFECT_LEARN_SPELL isn't passive
|
||||
if( talentCost > 0 && IsSpellHaveEffect(spellInfo,SPELL_EFFECT_LEARN_SPELL) )
|
||||
if (talentCost > 0 && IsSpellHaveEffect(spellInfo,SPELL_EFFECT_LEARN_SPELL))
|
||||
{
|
||||
// ignore stance requirement for talent learn spell (stance set for spell only for client spell description show)
|
||||
CastSpell(this, spell_id, true);
|
||||
|
|
@ -3007,10 +3007,10 @@ bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool dependen
|
|||
// also cast passive spells (including all talents without SPELL_EFFECT_LEARN_SPELL) with additional checks
|
||||
else if (IsPassiveSpell(spell_id))
|
||||
{
|
||||
if(IsNeedCastPassiveSpellAtLearn(spellInfo))
|
||||
if (IsNeedCastPassiveSpellAtLearn(spellInfo))
|
||||
CastSpell(this, spell_id, true);
|
||||
}
|
||||
else if( IsSpellHaveEffect(spellInfo,SPELL_EFFECT_SKILL_STEP) )
|
||||
else if (IsSpellHaveEffect(spellInfo,SPELL_EFFECT_SKILL_STEP))
|
||||
{
|
||||
CastSpell(this, spell_id, true);
|
||||
return false;
|
||||
|
|
@ -3020,7 +3020,7 @@ bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool dependen
|
|||
m_usedTalentCount += talentCost;
|
||||
|
||||
// update free primary prof.points (if any, can be none in case GM .learn prof. learning)
|
||||
if(uint32 freeProfs = GetFreePrimaryProfessionPoints())
|
||||
if (uint32 freeProfs = GetFreePrimaryProfessionPoints())
|
||||
{
|
||||
if(spellmgr.IsPrimaryProfessionFirstRankSpell(spell_id))
|
||||
SetFreePrimaryProfessions(freeProfs-1);
|
||||
|
|
@ -3031,20 +3031,19 @@ bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool dependen
|
|||
|
||||
SpellLearnSkillNode const* spellLearnSkill = spellmgr.GetSpellLearnSkill(spell_id);
|
||||
|
||||
SkillLineAbilityMap::const_iterator lower = spellmgr.GetBeginSkillLineAbilityMap(spell_id);
|
||||
SkillLineAbilityMap::const_iterator upper = spellmgr.GetEndSkillLineAbilityMap(spell_id);
|
||||
SkillLineAbilityMapBounds skill_bounds = spellmgr.GetSkillLineAbilityMapBounds(spell_id);
|
||||
|
||||
if(spellLearnSkill)
|
||||
if (spellLearnSkill)
|
||||
{
|
||||
uint32 skill_value = GetPureSkillValue(spellLearnSkill->skill);
|
||||
uint32 skill_max_value = GetPureMaxSkillValue(spellLearnSkill->skill);
|
||||
|
||||
if(skill_value < spellLearnSkill->value)
|
||||
if (skill_value < spellLearnSkill->value)
|
||||
skill_value = spellLearnSkill->value;
|
||||
|
||||
uint32 new_skill_max_value = spellLearnSkill->maxvalue == 0 ? maxskill : spellLearnSkill->maxvalue;
|
||||
|
||||
if(skill_max_value < new_skill_max_value)
|
||||
if (skill_max_value < new_skill_max_value)
|
||||
skill_max_value = new_skill_max_value;
|
||||
|
||||
SetSkill(spellLearnSkill->skill,skill_value,skill_max_value);
|
||||
|
|
@ -3052,16 +3051,16 @@ bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool dependen
|
|||
else
|
||||
{
|
||||
// not ranked skills
|
||||
for(SkillLineAbilityMap::const_iterator _spell_idx = lower; _spell_idx != upper; ++_spell_idx)
|
||||
for(SkillLineAbilityMap::const_iterator _spell_idx = skill_bounds.first; _spell_idx != skill_bounds.second; ++_spell_idx)
|
||||
{
|
||||
SkillLineEntry const *pSkill = sSkillLineStore.LookupEntry(_spell_idx->second->skillId);
|
||||
if(!pSkill)
|
||||
if (!pSkill)
|
||||
continue;
|
||||
|
||||
if(HasSkill(pSkill->id))
|
||||
if (HasSkill(pSkill->id))
|
||||
continue;
|
||||
|
||||
if(_spell_idx->second->learnOnGetSkill == ABILITY_LEARNED_ON_GET_RACE_OR_CLASS_SKILL ||
|
||||
if (_spell_idx->second->learnOnGetSkill == ABILITY_LEARNED_ON_GET_RACE_OR_CLASS_SKILL ||
|
||||
// lockpicking/runeforging special case, not have ABILITY_LEARNED_ON_GET_RACE_OR_CLASS_SKILL
|
||||
(pSkill->id==SKILL_LOCKPICKING || pSkill->id==SKILL_RUNEFORGING) && _spell_idx->second->max_value==0 )
|
||||
{
|
||||
|
|
@ -3084,24 +3083,23 @@ bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool dependen
|
|||
}
|
||||
|
||||
// learn dependent spells
|
||||
SpellLearnSpellMap::const_iterator spell_begin = spellmgr.GetBeginSpellLearnSpell(spell_id);
|
||||
SpellLearnSpellMap::const_iterator spell_end = spellmgr.GetEndSpellLearnSpell(spell_id);
|
||||
SpellLearnSpellMapBounds spell_bounds = spellmgr.GetSpellLearnSpellMapBounds(spell_id);
|
||||
|
||||
for(SpellLearnSpellMap::const_iterator itr2 = spell_begin; itr2 != spell_end; ++itr2)
|
||||
for(SpellLearnSpellMap::const_iterator itr2 = spell_bounds.first; itr2 != spell_bounds.second; ++itr2)
|
||||
{
|
||||
if(!itr2->second.autoLearned)
|
||||
if (!itr2->second.autoLearned)
|
||||
{
|
||||
if(!IsInWorld() || !itr2->second.active) // at spells loading, no output, but allow save
|
||||
if (!IsInWorld() || !itr2->second.active) // at spells loading, no output, but allow save
|
||||
addSpell(itr2->second.spell,itr2->second.active,true,true,false);
|
||||
else // at normal learning
|
||||
learnSpell(itr2->second.spell,true);
|
||||
}
|
||||
}
|
||||
|
||||
if(!GetSession()->PlayerLoading())
|
||||
if (!GetSession()->PlayerLoading())
|
||||
{
|
||||
// not ranked skills
|
||||
for(SkillLineAbilityMap::const_iterator _spell_idx = lower; _spell_idx != upper; ++_spell_idx)
|
||||
for(SkillLineAbilityMap::const_iterator _spell_idx = skill_bounds.first; _spell_idx != skill_bounds.second; ++_spell_idx)
|
||||
{
|
||||
GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE,_spell_idx->second->skillId);
|
||||
GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS,_spell_idx->second->skillId);
|
||||
|
|
@ -3236,19 +3234,19 @@ void Player::removeSpell(uint32 spell_id, bool disabled, bool learn_low_rank)
|
|||
prevSkill = spellmgr.GetSpellLearnSkill(spellmgr.GetFirstSpellInChain(prev_spell));
|
||||
}
|
||||
|
||||
if(!prevSkill) // not found prev skill setting, remove skill
|
||||
if (!prevSkill) // not found prev skill setting, remove skill
|
||||
SetSkill(spellLearnSkill->skill,0,0);
|
||||
else // set to prev. skill setting values
|
||||
{
|
||||
uint32 skill_value = GetPureSkillValue(prevSkill->skill);
|
||||
uint32 skill_max_value = GetPureMaxSkillValue(prevSkill->skill);
|
||||
|
||||
if(skill_value > prevSkill->value)
|
||||
if (skill_value > prevSkill->value)
|
||||
skill_value = prevSkill->value;
|
||||
|
||||
uint32 new_skill_max_value = prevSkill->maxvalue == 0 ? GetMaxSkillValueForLevel() : prevSkill->maxvalue;
|
||||
|
||||
if(skill_max_value > new_skill_max_value)
|
||||
if (skill_max_value > new_skill_max_value)
|
||||
skill_max_value = new_skill_max_value;
|
||||
|
||||
SetSkill(prevSkill->skill,skill_value,skill_max_value);
|
||||
|
|
@ -3259,22 +3257,21 @@ void Player::removeSpell(uint32 spell_id, bool disabled, bool learn_low_rank)
|
|||
else
|
||||
{
|
||||
// not ranked skills
|
||||
SkillLineAbilityMap::const_iterator lower = spellmgr.GetBeginSkillLineAbilityMap(spell_id);
|
||||
SkillLineAbilityMap::const_iterator upper = spellmgr.GetEndSkillLineAbilityMap(spell_id);
|
||||
SkillLineAbilityMapBounds bounds = spellmgr.GetSkillLineAbilityMapBounds(spell_id);
|
||||
|
||||
for(SkillLineAbilityMap::const_iterator _spell_idx = lower; _spell_idx != upper; ++_spell_idx)
|
||||
for(SkillLineAbilityMap::const_iterator _spell_idx = bounds.first; _spell_idx != bounds.second; ++_spell_idx)
|
||||
{
|
||||
SkillLineEntry const *pSkill = sSkillLineStore.LookupEntry(_spell_idx->second->skillId);
|
||||
if(!pSkill)
|
||||
if (!pSkill)
|
||||
continue;
|
||||
|
||||
if(_spell_idx->second->learnOnGetSkill == ABILITY_LEARNED_ON_GET_RACE_OR_CLASS_SKILL ||
|
||||
if (_spell_idx->second->learnOnGetSkill == ABILITY_LEARNED_ON_GET_RACE_OR_CLASS_SKILL ||
|
||||
// lockpicking/runeforging special case, not have ABILITY_LEARNED_ON_GET_RACE_OR_CLASS_SKILL
|
||||
(pSkill->id==SKILL_LOCKPICKING || pSkill->id==SKILL_RUNEFORGING) && _spell_idx->second->max_value==0 )
|
||||
{
|
||||
// not reset skills for professions and racial abilities
|
||||
if( (pSkill->categoryId==SKILL_CATEGORY_SECONDARY || pSkill->categoryId==SKILL_CATEGORY_PROFESSION) &&
|
||||
(IsProfessionSkill(pSkill->id) || _spell_idx->second->racemask!=0) )
|
||||
if ((pSkill->categoryId==SKILL_CATEGORY_SECONDARY || pSkill->categoryId==SKILL_CATEGORY_PROFESSION) &&
|
||||
(IsProfessionSkill(pSkill->id) || _spell_idx->second->racemask!=0))
|
||||
continue;
|
||||
|
||||
SetSkill(pSkill->id, 0, 0 );
|
||||
|
|
@ -3283,43 +3280,42 @@ void Player::removeSpell(uint32 spell_id, bool disabled, bool learn_low_rank)
|
|||
}
|
||||
|
||||
// remove dependent spells
|
||||
SpellLearnSpellMap::const_iterator spell_begin = spellmgr.GetBeginSpellLearnSpell(spell_id);
|
||||
SpellLearnSpellMap::const_iterator spell_end = spellmgr.GetEndSpellLearnSpell(spell_id);
|
||||
SpellLearnSpellMapBounds spell_bounds = spellmgr.GetSpellLearnSpellMapBounds(spell_id);
|
||||
|
||||
for(SpellLearnSpellMap::const_iterator itr2 = spell_begin; itr2 != spell_end; ++itr2)
|
||||
for(SpellLearnSpellMap::const_iterator itr2 = spell_bounds.first; itr2 != spell_bounds.second; ++itr2)
|
||||
removeSpell(itr2->second.spell, disabled);
|
||||
|
||||
// activate lesser rank in spellbook/action bar, and cast it if need
|
||||
bool prev_activate = false;
|
||||
|
||||
if(uint32 prev_id = spellmgr.GetPrevSpellInChain (spell_id))
|
||||
if (uint32 prev_id = spellmgr.GetPrevSpellInChain (spell_id))
|
||||
{
|
||||
SpellEntry const *spellInfo = sSpellStore.LookupEntry(spell_id);
|
||||
|
||||
// if talent then lesser rank also talent and need learn
|
||||
if(talentCosts)
|
||||
if (talentCosts)
|
||||
{
|
||||
if(learn_low_rank)
|
||||
learnSpell (prev_id,false);
|
||||
}
|
||||
// if ranked non-stackable spell: need activate lesser rank and update dendence state
|
||||
else if(cur_active && !SpellMgr::canStackSpellRanks(spellInfo) && spellmgr.GetSpellRank(spellInfo->Id) != 0)
|
||||
else if (cur_active && !SpellMgr::canStackSpellRanks(spellInfo) && spellmgr.GetSpellRank(spellInfo->Id) != 0)
|
||||
{
|
||||
// need manually update dependence state (learn spell ignore like attempts)
|
||||
PlayerSpellMap::iterator prev_itr = m_spells.find(prev_id);
|
||||
if (prev_itr != m_spells.end())
|
||||
{
|
||||
if(prev_itr->second->dependent != cur_dependent)
|
||||
if (prev_itr->second->dependent != cur_dependent)
|
||||
{
|
||||
prev_itr->second->dependent = cur_dependent;
|
||||
if(prev_itr->second->state != PLAYERSPELL_NEW)
|
||||
if (prev_itr->second->state != PLAYERSPELL_NEW)
|
||||
prev_itr->second->state = PLAYERSPELL_CHANGED;
|
||||
}
|
||||
|
||||
// now re-learn if need re-activate
|
||||
if(cur_active && !prev_itr->second->active && learn_low_rank)
|
||||
if (cur_active && !prev_itr->second->active && learn_low_rank)
|
||||
{
|
||||
if(addSpell(prev_id,true,false,prev_itr->second->dependent,prev_itr->second->disabled))
|
||||
if (addSpell(prev_id,true,false,prev_itr->second->dependent,prev_itr->second->disabled))
|
||||
{
|
||||
// downgrade spell ranks in spellbook and action bar
|
||||
WorldPacket data(SMSG_SUPERCEDED_SPELL, 4 + 4);
|
||||
|
|
@ -5043,20 +5039,19 @@ bool Player::UpdateCraftSkill(uint32 spellid)
|
|||
{
|
||||
sLog.outDebug("UpdateCraftSkill spellid %d", spellid);
|
||||
|
||||
SkillLineAbilityMap::const_iterator lower = spellmgr.GetBeginSkillLineAbilityMap(spellid);
|
||||
SkillLineAbilityMap::const_iterator upper = spellmgr.GetEndSkillLineAbilityMap(spellid);
|
||||
SkillLineAbilityMapBounds bounds = spellmgr.GetSkillLineAbilityMapBounds(spellid);
|
||||
|
||||
for(SkillLineAbilityMap::const_iterator _spell_idx = lower; _spell_idx != upper; ++_spell_idx)
|
||||
for(SkillLineAbilityMap::const_iterator _spell_idx = bounds.first; _spell_idx != bounds.second; ++_spell_idx)
|
||||
{
|
||||
if(_spell_idx->second->skillId)
|
||||
if (_spell_idx->second->skillId)
|
||||
{
|
||||
uint32 SkillValue = GetPureSkillValue(_spell_idx->second->skillId);
|
||||
|
||||
// Alchemy Discoveries here
|
||||
SpellEntry const* spellEntry = sSpellStore.LookupEntry(spellid);
|
||||
if(spellEntry && spellEntry->Mechanic==MECHANIC_DISCOVERY)
|
||||
if (spellEntry && spellEntry->Mechanic==MECHANIC_DISCOVERY)
|
||||
{
|
||||
if(uint32 discoveredSpell = GetSkillDiscoverySpell(_spell_idx->second->skillId, spellid, this))
|
||||
if (uint32 discoveredSpell = GetSkillDiscoverySpell(_spell_idx->second->skillId, spellid, this))
|
||||
learnSpell(discoveredSpell,false);
|
||||
}
|
||||
|
||||
|
|
@ -18584,19 +18579,18 @@ bool Player::IsSpellFitByClassAndRace( uint32 spell_id ) const
|
|||
uint32 racemask = getRaceMask();
|
||||
uint32 classmask = getClassMask();
|
||||
|
||||
SkillLineAbilityMap::const_iterator lower = spellmgr.GetBeginSkillLineAbilityMap(spell_id);
|
||||
SkillLineAbilityMap::const_iterator upper = spellmgr.GetEndSkillLineAbilityMap(spell_id);
|
||||
if(lower==upper)
|
||||
SkillLineAbilityMapBounds bounds = spellmgr.GetSkillLineAbilityMapBounds(spell_id);
|
||||
if (bounds.first==bounds.second)
|
||||
return true;
|
||||
|
||||
for(SkillLineAbilityMap::const_iterator _spell_idx = lower; _spell_idx != upper; ++_spell_idx)
|
||||
for(SkillLineAbilityMap::const_iterator _spell_idx = bounds.first; _spell_idx != bounds.second; ++_spell_idx)
|
||||
{
|
||||
// skip wrong race skills
|
||||
if( _spell_idx->second->racemask && (_spell_idx->second->racemask & racemask) == 0)
|
||||
if (_spell_idx->second->racemask && (_spell_idx->second->racemask & racemask) == 0)
|
||||
continue;
|
||||
|
||||
// skip wrong class skills
|
||||
if( _spell_idx->second->classmask && (_spell_idx->second->classmask & classmask) == 0)
|
||||
if (_spell_idx->second->classmask && (_spell_idx->second->classmask & classmask) == 0)
|
||||
continue;
|
||||
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -114,21 +114,18 @@ void LoadSkillDiscoveryTable()
|
|||
|
||||
SkillDiscoveryStore[reqSkillOrSpell].push_back( SkillDiscoveryEntry(spellId, reqSkillValue, chance) );
|
||||
}
|
||||
else if( reqSkillOrSpell == 0 ) // skill case
|
||||
else if (reqSkillOrSpell == 0) // skill case
|
||||
{
|
||||
SkillLineAbilityMap::const_iterator lower = spellmgr.GetBeginSkillLineAbilityMap(spellId);
|
||||
SkillLineAbilityMap::const_iterator upper = spellmgr.GetEndSkillLineAbilityMap(spellId);
|
||||
SkillLineAbilityMapBounds bounds = spellmgr.GetSkillLineAbilityMapBounds(spellId);
|
||||
|
||||
if(lower==upper)
|
||||
if (bounds.first==bounds.second)
|
||||
{
|
||||
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)
|
||||
{
|
||||
for(SkillLineAbilityMap::const_iterator _spell_idx = bounds.first; _spell_idx != bounds.second; ++_spell_idx)
|
||||
SkillDiscoveryStore[-int32(_spell_idx->second->skillId)].push_back( SkillDiscoveryEntry(spellId, reqSkillValue, chance) );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -143,21 +140,21 @@ void LoadSkillDiscoveryTable()
|
|||
|
||||
sLog.outString();
|
||||
sLog.outString( ">> Loaded %u skill discovery definitions", count );
|
||||
if(!ssNonDiscoverableEntries.str().empty())
|
||||
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());
|
||||
|
||||
// report about empty data for explicit discovery spells
|
||||
for(uint32 spell_id = 1; spell_id < sSpellStore.GetNumRows(); ++spell_id)
|
||||
{
|
||||
SpellEntry const* spellEntry = sSpellStore.LookupEntry(spell_id);
|
||||
if(!spellEntry)
|
||||
if (!spellEntry)
|
||||
continue;
|
||||
|
||||
// skip not explicit discovery spells
|
||||
if (!IsExplicitDiscoverySpell(spellEntry))
|
||||
continue;
|
||||
|
||||
if(SkillDiscoveryStore.find(spell_id)==SkillDiscoveryStore.end())
|
||||
if (SkillDiscoveryStore.find(spell_id)==SkillDiscoveryStore.end())
|
||||
sLog.outErrorDb("Spell (ID: %u) is 100%% chance random discovery ability but not have data in `skill_discovery_template` table",spell_id);
|
||||
}
|
||||
}
|
||||
|
|
@ -170,9 +167,8 @@ uint32 GetExplicitDiscoverySpell(uint32 spellId, Player* player)
|
|||
if (tab == SkillDiscoveryStore.end())
|
||||
return 0;
|
||||
|
||||
SkillLineAbilityMap::const_iterator lower = spellmgr.GetBeginSkillLineAbilityMap(spellId);
|
||||
SkillLineAbilityMap::const_iterator upper = spellmgr.GetEndSkillLineAbilityMap(spellId);
|
||||
uint32 skillvalue = lower != upper ? player->GetSkillValue(lower->second->skillId) : 0;
|
||||
SkillLineAbilityMapBounds bounds = spellmgr.GetSkillLineAbilityMapBounds(spellId);
|
||||
uint32 skillvalue = bounds.first != bounds.second ? player->GetSkillValue(bounds.first->second->skillId) : 0;
|
||||
|
||||
float full_chance = 0;
|
||||
for(SkillDiscoveryList::const_iterator item_iter = tab->second.begin(); item_iter != tab->second.end(); ++item_iter)
|
||||
|
|
|
|||
|
|
@ -3966,15 +3966,15 @@ SpellCastResult Spell::CheckCast(bool strict)
|
|||
}
|
||||
|
||||
// Spell casted only on battleground
|
||||
if((m_spellInfo->AttributesEx3 & SPELL_ATTR_EX3_BATTLEGROUND) && m_caster->GetTypeId() == TYPEID_PLAYER)
|
||||
if ((m_spellInfo->AttributesEx3 & SPELL_ATTR_EX3_BATTLEGROUND) && m_caster->GetTypeId() == TYPEID_PLAYER)
|
||||
if(!((Player*)m_caster)->InBattleGround())
|
||||
return SPELL_FAILED_ONLY_BATTLEGROUNDS;
|
||||
|
||||
// do not allow spells to be cast in arenas
|
||||
// - with greater than 15 min CD without SPELL_ATTR_EX4_USABLE_IN_ARENA flag
|
||||
// - with SPELL_ATTR_EX4_NOT_USABLE_IN_ARENA flag
|
||||
if( (m_spellInfo->AttributesEx4 & SPELL_ATTR_EX4_NOT_USABLE_IN_ARENA) ||
|
||||
GetSpellRecoveryTime(m_spellInfo) > 15 * MINUTE * IN_MILISECONDS && !(m_spellInfo->AttributesEx4 & SPELL_ATTR_EX4_USABLE_IN_ARENA) )
|
||||
if ((m_spellInfo->AttributesEx4 & SPELL_ATTR_EX4_NOT_USABLE_IN_ARENA) ||
|
||||
GetSpellRecoveryTime(m_spellInfo) > 15 * MINUTE * IN_MILISECONDS && !(m_spellInfo->AttributesEx4 & SPELL_ATTR_EX4_USABLE_IN_ARENA))
|
||||
if(MapEntry const* mapEntry = sMapStore.LookupEntry(m_caster->GetMapId()))
|
||||
if(mapEntry->IsBattleArena())
|
||||
return SPELL_FAILED_NOT_IN_ARENA;
|
||||
|
|
@ -3985,21 +3985,21 @@ SpellCastResult Spell::CheckCast(bool strict)
|
|||
|
||||
SpellCastResult locRes= spellmgr.GetSpellAllowedInLocationError(m_spellInfo,m_caster->GetMapId(),zone,area,
|
||||
m_caster->GetTypeId() == TYPEID_PLAYER ? ((Player*)m_caster) : NULL);
|
||||
if(locRes != SPELL_CAST_OK)
|
||||
if (locRes != SPELL_CAST_OK)
|
||||
return locRes;
|
||||
|
||||
// not let players cast spells at mount (and let do it to creatures)
|
||||
if( m_caster->IsMounted() && m_caster->GetTypeId()==TYPEID_PLAYER && !m_IsTriggeredSpell &&
|
||||
!IsPassiveSpell(m_spellInfo->Id) && !(m_spellInfo->Attributes & SPELL_ATTR_CASTABLE_WHILE_MOUNTED) )
|
||||
if (m_caster->IsMounted() && m_caster->GetTypeId()==TYPEID_PLAYER && !m_IsTriggeredSpell &&
|
||||
!IsPassiveSpell(m_spellInfo->Id) && !(m_spellInfo->Attributes & SPELL_ATTR_CASTABLE_WHILE_MOUNTED))
|
||||
{
|
||||
if(m_caster->isInFlight())
|
||||
if (m_caster->isInFlight())
|
||||
return SPELL_FAILED_NOT_FLYING;
|
||||
else
|
||||
return SPELL_FAILED_NOT_MOUNTED;
|
||||
}
|
||||
|
||||
// always (except passive spells) check items (focus object can be required for any type casts)
|
||||
if(!IsPassiveSpell(m_spellInfo->Id))
|
||||
if (!IsPassiveSpell(m_spellInfo->Id))
|
||||
{
|
||||
SpellCastResult castResult = CheckItems();
|
||||
if(castResult != SPELL_CAST_OK)
|
||||
|
|
@ -4007,7 +4007,7 @@ SpellCastResult Spell::CheckCast(bool strict)
|
|||
}
|
||||
|
||||
//ImpliciteTargetA-B = 38, If fact there is 0 Spell with ImpliciteTargetB=38
|
||||
if(m_UniqueTargetInfo.empty()) // skip second CheckCast apply (for delayed spells for example)
|
||||
if (m_UniqueTargetInfo.empty()) // skip second CheckCast apply (for delayed spells for example)
|
||||
{
|
||||
for(uint8 j = 0; j < 3; ++j)
|
||||
{
|
||||
|
|
@ -4016,9 +4016,8 @@ SpellCastResult Spell::CheckCast(bool strict)
|
|||
m_spellInfo->EffectImplicitTargetA[j] == TARGET_SCRIPT_COORDINATES ||
|
||||
m_spellInfo->EffectImplicitTargetB[j] == TARGET_SCRIPT_COORDINATES )
|
||||
{
|
||||
SpellScriptTarget::const_iterator lower = spellmgr.GetBeginSpellScriptTarget(m_spellInfo->Id);
|
||||
SpellScriptTarget::const_iterator upper = spellmgr.GetEndSpellScriptTarget(m_spellInfo->Id);
|
||||
if(lower==upper)
|
||||
SpellScriptTargetBounds bounds = spellmgr.GetSpellScriptTargetBounds(m_spellInfo->Id);
|
||||
if(bounds.first==bounds.second)
|
||||
sLog.outErrorDb("Spell (ID: %u) has effect EffectImplicitTargetA/EffectImplicitTargetB = TARGET_SCRIPT or TARGET_SCRIPT_COORDINATES, but does not have record in `spell_script_target`",m_spellInfo->Id);
|
||||
|
||||
SpellRangeEntry const* srange = sSpellRangeStore.LookupEntry(m_spellInfo->rangeIndex);
|
||||
|
|
@ -4027,7 +4026,7 @@ SpellCastResult Spell::CheckCast(bool strict)
|
|||
Creature* creatureScriptTarget = NULL;
|
||||
GameObject* goScriptTarget = NULL;
|
||||
|
||||
for(SpellScriptTarget::const_iterator i_spellST = lower; i_spellST != upper; ++i_spellST)
|
||||
for(SpellScriptTarget::const_iterator i_spellST = bounds.first; i_spellST != bounds.second; ++i_spellST)
|
||||
{
|
||||
switch(i_spellST->second.type)
|
||||
{
|
||||
|
|
@ -4035,7 +4034,7 @@ SpellCastResult Spell::CheckCast(bool strict)
|
|||
{
|
||||
GameObject* p_GameObject = NULL;
|
||||
|
||||
if(i_spellST->second.targetEntry)
|
||||
if (i_spellST->second.targetEntry)
|
||||
{
|
||||
CellPair p(MaNGOS::ComputeCellPair(m_caster->GetPositionX(), m_caster->GetPositionY()));
|
||||
Cell cell(p);
|
||||
|
|
@ -4048,7 +4047,7 @@ SpellCastResult Spell::CheckCast(bool strict)
|
|||
CellLock<GridReadGuard> cell_lock(cell, p);
|
||||
cell_lock->Visit(cell_lock, object_checker, *m_caster->GetMap());
|
||||
|
||||
if(p_GameObject)
|
||||
if (p_GameObject)
|
||||
{
|
||||
// remember found target and range, next attempt will find more near target with another entry
|
||||
creatureScriptTarget = NULL;
|
||||
|
|
@ -4056,10 +4055,10 @@ SpellCastResult Spell::CheckCast(bool strict)
|
|||
range = go_check.GetLastRange();
|
||||
}
|
||||
}
|
||||
else if( focusObject ) // Focus Object
|
||||
else if (focusObject) // Focus Object
|
||||
{
|
||||
float frange = m_caster->GetDistance(focusObject);
|
||||
if(range >= frange)
|
||||
if (range >= frange)
|
||||
{
|
||||
creatureScriptTarget = NULL;
|
||||
goScriptTarget = focusObject;
|
||||
|
|
|
|||
|
|
@ -1693,16 +1693,15 @@ bool SpellMgr::IsPrimaryProfessionFirstRankSpell(uint32 spellId) const
|
|||
|
||||
bool SpellMgr::IsSkillBonusSpell(uint32 spellId) const
|
||||
{
|
||||
SkillLineAbilityMap::const_iterator lower = GetBeginSkillLineAbilityMap(spellId);
|
||||
SkillLineAbilityMap::const_iterator upper = GetEndSkillLineAbilityMap(spellId);
|
||||
SkillLineAbilityMapBounds bounds = GetSkillLineAbilityMapBounds(spellId);
|
||||
|
||||
for(SkillLineAbilityMap::const_iterator _spell_idx = lower; _spell_idx != upper; ++_spell_idx)
|
||||
for(SkillLineAbilityMap::const_iterator _spell_idx = bounds.first; _spell_idx != bounds.second; ++_spell_idx)
|
||||
{
|
||||
SkillLineAbilityEntry const *pAbility = _spell_idx->second;
|
||||
if (!pAbility || pAbility->learnOnGetSkill != ABILITY_LEARNED_ON_GET_PROFESSION_SKILL)
|
||||
continue;
|
||||
|
||||
if(pAbility->req_skill_value > 0)
|
||||
if (pAbility->req_skill_value > 0)
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -1964,7 +1963,7 @@ void SpellMgr::LoadSpellLearnSpells()
|
|||
|
||||
// 0 1 2
|
||||
QueryResult *result = WorldDatabase.Query("SELECT entry, SpellID, Active FROM spell_learn_spell");
|
||||
if(!result)
|
||||
if (!result)
|
||||
{
|
||||
barGoLink bar( 1 );
|
||||
bar.step();
|
||||
|
|
@ -1990,19 +1989,19 @@ void SpellMgr::LoadSpellLearnSpells()
|
|||
node.active = fields[2].GetBool();
|
||||
node.autoLearned= false;
|
||||
|
||||
if(!sSpellStore.LookupEntry(spell_id))
|
||||
if (!sSpellStore.LookupEntry(spell_id))
|
||||
{
|
||||
sLog.outErrorDb("Spell %u listed in `spell_learn_spell` does not exist",spell_id);
|
||||
continue;
|
||||
}
|
||||
|
||||
if(!sSpellStore.LookupEntry(node.spell))
|
||||
if (!sSpellStore.LookupEntry(node.spell))
|
||||
{
|
||||
sLog.outErrorDb("Spell %u listed in `spell_learn_spell` learning not existed spell %u",spell_id,node.spell);
|
||||
continue;
|
||||
}
|
||||
|
||||
if(GetTalentSpellCost(node.spell))
|
||||
if (GetTalentSpellCost(node.spell))
|
||||
{
|
||||
sLog.outErrorDb("Spell %u listed in `spell_learn_spell` attempt learning talent spell %u, skipped",spell_id,node.spell);
|
||||
continue;
|
||||
|
|
@ -2021,7 +2020,7 @@ void SpellMgr::LoadSpellLearnSpells()
|
|||
{
|
||||
SpellEntry const* entry = sSpellStore.LookupEntry(spell);
|
||||
|
||||
if(!entry)
|
||||
if (!entry)
|
||||
continue;
|
||||
|
||||
for(int i = 0; i < 3; ++i)
|
||||
|
|
@ -2033,7 +2032,7 @@ void SpellMgr::LoadSpellLearnSpells()
|
|||
dbc_node.active = true; // all dbc based learned spells is active (show in spell book or hide by client itself)
|
||||
|
||||
// ignore learning not existed spells (broken/outdated/or generic learnig spell 483
|
||||
if(!sSpellStore.LookupEntry(dbc_node.spell))
|
||||
if (!sSpellStore.LookupEntry(dbc_node.spell))
|
||||
continue;
|
||||
|
||||
// talent or passive spells or skill-step spells auto-casted and not need dependent learning,
|
||||
|
|
@ -2041,13 +2040,12 @@ void SpellMgr::LoadSpellLearnSpells()
|
|||
// other required explicit dependent learning
|
||||
dbc_node.autoLearned = entry->EffectImplicitTargetA[i]==TARGET_PET || GetTalentSpellCost(spell) > 0 || IsPassiveSpell(spell) || IsSpellHaveEffect(entry,SPELL_EFFECT_SKILL_STEP);
|
||||
|
||||
SpellLearnSpellMap::const_iterator db_node_begin = GetBeginSpellLearnSpell(spell);
|
||||
SpellLearnSpellMap::const_iterator db_node_end = GetEndSpellLearnSpell(spell);
|
||||
SpellLearnSpellMapBounds db_node_bounds = GetSpellLearnSpellMapBounds(spell);
|
||||
|
||||
bool found = false;
|
||||
for(SpellLearnSpellMap::const_iterator itr = db_node_begin; itr != db_node_end; ++itr)
|
||||
for(SpellLearnSpellMap::const_iterator itr = db_node_bounds.first; itr != db_node_bounds.second; ++itr)
|
||||
{
|
||||
if(itr->second.spell == dbc_node.spell)
|
||||
if (itr->second.spell == dbc_node.spell)
|
||||
{
|
||||
sLog.outErrorDb("Spell %u auto-learn spell %u in spell.dbc then the record in `spell_learn_spell` is redundant, please fix DB.",
|
||||
spell,dbc_node.spell);
|
||||
|
|
@ -2056,7 +2054,7 @@ void SpellMgr::LoadSpellLearnSpells()
|
|||
}
|
||||
}
|
||||
|
||||
if(!found) // add new spell-spell pair if not found
|
||||
if (!found) // add new spell-spell pair if not found
|
||||
{
|
||||
mSpellLearnSpells.insert(SpellLearnSpellMap::value_type(spell,dbc_node));
|
||||
++dbc_count;
|
||||
|
|
|
|||
|
|
@ -545,6 +545,7 @@ struct SpellTargetEntry
|
|||
};
|
||||
|
||||
typedef std::multimap<uint32,SpellTargetEntry> SpellScriptTarget;
|
||||
typedef std::pair<SpellScriptTarget::const_iterator,SpellScriptTarget::const_iterator> SpellScriptTargetBounds;
|
||||
|
||||
// coordinates for spells (accessed using SpellMgr functions)
|
||||
struct SpellTargetPosition
|
||||
|
|
@ -666,8 +667,10 @@ struct SpellLearnSpellNode
|
|||
};
|
||||
|
||||
typedef std::multimap<uint32, SpellLearnSpellNode> SpellLearnSpellMap;
|
||||
typedef std::pair<SpellLearnSpellMap::const_iterator,SpellLearnSpellMap::const_iterator> SpellLearnSpellMapBounds;
|
||||
|
||||
typedef std::multimap<uint32, SkillLineAbilityEntry const*> SkillLineAbilityMap;
|
||||
typedef std::pair<SkillLineAbilityMap::const_iterator,SkillLineAbilityMap::const_iterator> SkillLineAbilityMapBounds;
|
||||
|
||||
typedef std::multimap<uint32, uint32> PetLevelupSpellSet;
|
||||
typedef std::map<uint32, PetLevelupSpellSet> PetLevelupSpellMap;
|
||||
|
|
@ -883,22 +886,16 @@ class SpellMgr
|
|||
return mSpellLearnSpells.find(spell_id) != mSpellLearnSpells.end();
|
||||
}
|
||||
|
||||
SpellLearnSpellMap::const_iterator GetBeginSpellLearnSpell(uint32 spell_id) const
|
||||
SpellLearnSpellMapBounds GetSpellLearnSpellMapBounds(uint32 spell_id) const
|
||||
{
|
||||
return mSpellLearnSpells.lower_bound(spell_id);
|
||||
}
|
||||
|
||||
SpellLearnSpellMap::const_iterator GetEndSpellLearnSpell(uint32 spell_id) const
|
||||
{
|
||||
return mSpellLearnSpells.upper_bound(spell_id);
|
||||
return SpellLearnSpellMapBounds(mSpellLearnSpells.lower_bound(spell_id),mSpellLearnSpells.upper_bound(spell_id));
|
||||
}
|
||||
|
||||
bool IsSpellLearnToSpell(uint32 spell_id1,uint32 spell_id2) const
|
||||
{
|
||||
SpellLearnSpellMap::const_iterator b = GetBeginSpellLearnSpell(spell_id1);
|
||||
SpellLearnSpellMap::const_iterator e = GetEndSpellLearnSpell(spell_id1);
|
||||
for(SpellLearnSpellMap::const_iterator i = b; i != e; ++i)
|
||||
if(i->second.spell==spell_id2)
|
||||
SpellLearnSpellMapBounds bounds = GetSpellLearnSpellMapBounds(spell_id1);
|
||||
for(SpellLearnSpellMap::const_iterator i = bounds.first; i != bounds.second; ++i)
|
||||
if (i->second.spell==spell_id2)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
|
@ -912,27 +909,17 @@ class SpellMgr
|
|||
|
||||
|
||||
// Spell script targets
|
||||
SpellScriptTarget::const_iterator GetBeginSpellScriptTarget(uint32 spell_id) const
|
||||
SpellScriptTargetBounds GetSpellScriptTargetBounds(uint32 spell_id) const
|
||||
{
|
||||
return mSpellScriptTarget.lower_bound(spell_id);
|
||||
}
|
||||
|
||||
SpellScriptTarget::const_iterator GetEndSpellScriptTarget(uint32 spell_id) const
|
||||
{
|
||||
return mSpellScriptTarget.upper_bound(spell_id);
|
||||
return SpellScriptTargetBounds(mSpellScriptTarget.lower_bound(spell_id),mSpellScriptTarget.upper_bound(spell_id));
|
||||
}
|
||||
|
||||
// Spell correctess for client using
|
||||
static bool IsSpellValid(SpellEntry const * spellInfo, Player* pl = NULL, bool msg = true);
|
||||
|
||||
SkillLineAbilityMap::const_iterator GetBeginSkillLineAbilityMap(uint32 spell_id) const
|
||||
SkillLineAbilityMapBounds GetSkillLineAbilityMapBounds(uint32 spell_id) const
|
||||
{
|
||||
return mSkillLineAbilityMap.lower_bound(spell_id);
|
||||
}
|
||||
|
||||
SkillLineAbilityMap::const_iterator GetEndSkillLineAbilityMap(uint32 spell_id) const
|
||||
{
|
||||
return mSkillLineAbilityMap.upper_bound(spell_id);
|
||||
return SkillLineAbilityMapBounds(mSkillLineAbilityMap.lower_bound(spell_id),mSkillLineAbilityMap.upper_bound(spell_id));
|
||||
}
|
||||
|
||||
PetAura const* GetPetAura(uint32 spell_id, uint8 eff)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#ifndef __REVISION_NR_H__
|
||||
#define __REVISION_NR_H__
|
||||
#define REVISION_NR "8425"
|
||||
#define REVISION_NR "8426"
|
||||
#endif // __REVISION_NR_H__
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue