[7692] Implement ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE and reimplement ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS. Author: VladimirMangos
Also correctly set this criteria at login. --HG-- branch : trunk
This commit is contained in:
+26
-11
@@ -965,14 +965,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
|
|||||||
break;
|
break;
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS:
|
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS:
|
||||||
{
|
{
|
||||||
// spell always provide and at login spell learning.
|
if(miscvalue1 && miscvalue1 != achievementCriteria->learn_skillline_spell.skillLine)
|
||||||
if(!miscvalue1)
|
|
||||||
continue;
|
|
||||||
// rescan only when change possible
|
|
||||||
SkillLineAbilityMap::const_iterator skillIter0 = spellmgr.GetBeginSkillLineAbilityMap(miscvalue1);
|
|
||||||
if(skillIter0 == spellmgr.GetEndSkillLineAbilityMap(miscvalue1))
|
|
||||||
continue;
|
|
||||||
if(skillIter0->second->skillId != achievementCriteria->learn_skilline_spell.skillLine)
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
uint32 spellCount = 0;
|
uint32 spellCount = 0;
|
||||||
@@ -984,7 +977,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
|
|||||||
skillIter != spellmgr.GetEndSkillLineAbilityMap(spellIter->first);
|
skillIter != spellmgr.GetEndSkillLineAbilityMap(spellIter->first);
|
||||||
++skillIter)
|
++skillIter)
|
||||||
{
|
{
|
||||||
if(skillIter->second->skillId == achievementCriteria->learn_skilline_spell.skillLine)
|
if(skillIter->second->skillId == achievementCriteria->learn_skillline_spell.skillLine)
|
||||||
spellCount++;
|
spellCount++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1019,6 +1012,27 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
|
|||||||
SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
|
SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE:
|
||||||
|
{
|
||||||
|
if(miscvalue1 && miscvalue1 != achievementCriteria->learn_skill_line.skillLine)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
uint32 spellCount = 0;
|
||||||
|
for (PlayerSpellMap::const_iterator spellIter = GetPlayer()->GetSpellMap().begin();
|
||||||
|
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)
|
||||||
|
spellCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SetCriteriaProgress(achievementCriteria, spellCount);
|
||||||
|
break;
|
||||||
|
}
|
||||||
// std case: not exist in DBC, not triggered in code as result
|
// std case: not exist in DBC, not triggered in code as result
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALTH:
|
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALTH:
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_SPELLPOWER:
|
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_SPELLPOWER:
|
||||||
@@ -1069,7 +1083,6 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
|
|||||||
case ACHIEVEMENT_CRITERIA_TYPE_QUEST_ABANDONED:
|
case ACHIEVEMENT_CRITERIA_TYPE_QUEST_ABANDONED:
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN:
|
case ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN:
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE:
|
case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE:
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE:
|
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL:
|
case ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL:
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS:
|
case ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS:
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_TOTAL:
|
case ACHIEVEMENT_CRITERIA_TYPE_TOTAL:
|
||||||
@@ -1192,7 +1205,9 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve
|
|||||||
case ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT:
|
case ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT:
|
||||||
return progress->counter >= achievementCriteria->fish_in_gameobject.lootCount;
|
return progress->counter >= achievementCriteria->fish_in_gameobject.lootCount;
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS:
|
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS:
|
||||||
return progress->counter >= achievementCriteria->learn_skilline_spell.spellCount;
|
return progress->counter >= achievementCriteria->learn_skillline_spell.spellCount;
|
||||||
|
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE:
|
||||||
|
return progress->counter >= achievementCriteria->learn_skill_line.spellCount;
|
||||||
|
|
||||||
// handle all statistic-only criteria here
|
// handle all statistic-only criteria here
|
||||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND:
|
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND:
|
||||||
|
|||||||
@@ -422,7 +422,7 @@ struct AchievementCriteriaEntry
|
|||||||
{
|
{
|
||||||
uint32 skillLine; // 3
|
uint32 skillLine; // 3
|
||||||
uint32 spellCount; // 4
|
uint32 spellCount; // 4
|
||||||
} learn_skilline_spell;
|
} learn_skillline_spell;
|
||||||
|
|
||||||
// ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL = 76
|
// ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL = 76
|
||||||
struct
|
struct
|
||||||
|
|||||||
+11
-5
@@ -2955,6 +2955,9 @@ bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool dependen
|
|||||||
|
|
||||||
SpellLearnSkillNode const* spellLearnSkill = spellmgr.GetSpellLearnSkill(spell_id);
|
SpellLearnSkillNode const* spellLearnSkill = spellmgr.GetSpellLearnSkill(spell_id);
|
||||||
|
|
||||||
|
SkillLineAbilityMap::const_iterator lower = spellmgr.GetBeginSkillLineAbilityMap(spell_id);
|
||||||
|
SkillLineAbilityMap::const_iterator upper = spellmgr.GetEndSkillLineAbilityMap(spell_id);
|
||||||
|
|
||||||
if(spellLearnSkill)
|
if(spellLearnSkill)
|
||||||
{
|
{
|
||||||
uint32 skill_value = GetPureSkillValue(spellLearnSkill->skill);
|
uint32 skill_value = GetPureSkillValue(spellLearnSkill->skill);
|
||||||
@@ -2973,9 +2976,6 @@ bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool dependen
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// not ranked skills
|
// not ranked skills
|
||||||
SkillLineAbilityMap::const_iterator lower = spellmgr.GetBeginSkillLineAbilityMap(spell_id);
|
|
||||||
SkillLineAbilityMap::const_iterator upper = spellmgr.GetEndSkillLineAbilityMap(spell_id);
|
|
||||||
|
|
||||||
for(SkillLineAbilityMap::const_iterator _spell_idx = lower; _spell_idx != upper; ++_spell_idx)
|
for(SkillLineAbilityMap::const_iterator _spell_idx = lower; _spell_idx != upper; ++_spell_idx)
|
||||||
{
|
{
|
||||||
SkillLineEntry const *pSkill = sSkillLineStore.LookupEntry(_spell_idx->second->skillId);
|
SkillLineEntry const *pSkill = sSkillLineStore.LookupEntry(_spell_idx->second->skillId);
|
||||||
@@ -3022,10 +3022,16 @@ bool Player::addSpell(uint32 spell_id, bool active, bool learning, bool dependen
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(IsInWorld())
|
if(!GetSession()->PlayerLoading())
|
||||||
{
|
{
|
||||||
|
// not ranked skills
|
||||||
|
for(SkillLineAbilityMap::const_iterator _spell_idx = lower; _spell_idx != upper; ++_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);
|
||||||
|
}
|
||||||
|
|
||||||
GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL,spell_id);
|
GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL,spell_id);
|
||||||
GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS,spell_id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// return true (for send learn packet) only if spell active (in case ranked spells) and not replace old spell
|
// return true (for send learn packet) only if spell active (in case ranked spells) and not replace old spell
|
||||||
|
|||||||
Reference in New Issue
Block a user