Implemented ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE
Added support for "in single battleground" and "without dying" requirement to battleground achievements Add examples of scripting achievement (School of Hard Knocks, Storm Glory) --HG-- branch : trunk
This commit is contained in:
@@ -96,6 +96,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria)
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE:
|
||||
break;
|
||||
default:
|
||||
sLog.outErrorDb("Table `achievement_criteria_data` has data for non-supported criteria type (Entry: %u Type: %u), ignored.", criteria->ID, criteria->requiredType);
|
||||
@@ -405,7 +406,7 @@ void AchievementMgr::Reset()
|
||||
CheckAllAchievementCriteria();
|
||||
}
|
||||
|
||||
void AchievementMgr::ResetAchievementCriteria(AchievementCriteriaTypes type, uint32 miscvalue1, uint32 miscvalue2)
|
||||
void AchievementMgr::ResetAchievementCriteria(AchievementCriteriaTypes type, uint32 miscvalue1, uint32 miscvalue2, bool evenIfCriteriaComplete)
|
||||
{
|
||||
if ((sLog.getLogFilter() & LOG_FILTER_ACHIEVEMENT_UPDATES) == 0)
|
||||
sLog.outDetail("AchievementMgr::ResetAchievementCriteria(%u, %u, %u)", type, miscvalue1, miscvalue2);
|
||||
@@ -422,26 +423,18 @@ void AchievementMgr::ResetAchievementCriteria(AchievementCriteriaTypes type, uin
|
||||
if (!achievement)
|
||||
continue;
|
||||
|
||||
// don't update already completed criteria
|
||||
if (IsCompletedCriteria(achievementCriteria,achievement))
|
||||
// don't update already completed criteria if not forced or achievement already complete
|
||||
if ((IsCompletedCriteria(achievementCriteria, achievement) && !evenIfCriteriaComplete) || HasAchieved(achievement->ID))
|
||||
continue;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE: // have total statistic also not expected to be reset
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE: // have total statistic also not expected to be reset
|
||||
if (achievementCriteria->healing_done.flag == miscvalue1 &&
|
||||
achievementCriteria->healing_done.mapid == miscvalue2)
|
||||
SetCriteriaProgress(achievementCriteria, 0, PROGRESS_SET);
|
||||
for (uint8 j = 0; j < MAX_CRITERIA_REQUIREMENTS; ++j)
|
||||
if (achievementCriteria->additionalRequrements[j].additionalRequirement_type == miscvalue1 &&
|
||||
(!achievementCriteria->additionalRequrements[j].additionalRequirement_value ||
|
||||
achievementCriteria->additionalRequrements[j].additionalRequirement_value == miscvalue2))
|
||||
{
|
||||
SetCriteriaProgress(achievementCriteria, 0, PROGRESS_SET);
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA: // have total statistic also not expected to be reset
|
||||
// reset only the criteria having the miscvalue1 condition
|
||||
if (achievementCriteria->win_rated_arena.flag == miscvalue1)
|
||||
SetCriteriaProgress(achievementCriteria, 0, PROGRESS_SET);
|
||||
break;
|
||||
default: // reset all cases
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -793,7 +786,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
|
||||
if (achievementCriteria->win_bg.bgMapID != GetPlayer()->GetMapId())
|
||||
continue;
|
||||
|
||||
if (achievementCriteria->win_bg.additionalRequirement1_type)
|
||||
if (achievementCriteria->additionalRequrements[0].additionalRequirement_type)
|
||||
{
|
||||
// those requirements couldn't be found in the dbc
|
||||
AchievementCriteriaDataSet const* data = achievementmgr.GetCriteriaDataSet(achievementCriteria);
|
||||
@@ -1469,6 +1462,11 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
|
||||
SetCriteriaProgress(achievementCriteria, miscvalue1, PROGRESS_ACCUMULATE);
|
||||
break;
|
||||
}
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE:
|
||||
if (!miscvalue1 || miscvalue1 != achievementCriteria->bg_objective.objectiveId)
|
||||
continue;
|
||||
SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
|
||||
break;
|
||||
// std case: not exist in DBC, not triggered in code as result
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALTH:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_SPELLPOWER:
|
||||
@@ -1479,7 +1477,6 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
|
||||
break;
|
||||
// FIXME: not triggered in code as result, need to implement
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA:
|
||||
@@ -1582,6 +1579,8 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2:
|
||||
return progress->counter >= achievementCriteria->cast_spell.castCount;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE:
|
||||
return progress->counter >= achievementCriteria->bg_objective.completeCount;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL:
|
||||
return progress->counter >= 1;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM:
|
||||
@@ -2165,7 +2164,7 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData()
|
||||
switch(criteria->requiredType)
|
||||
{
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG:
|
||||
if (!criteria->win_bg.additionalRequirement1_type)
|
||||
if (!criteria->additionalRequrements[0].additionalRequirement_type)
|
||||
continue;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
|
||||
@@ -2222,6 +2221,8 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData()
|
||||
if (criteria->loot_type.lootTypeCount != 1)
|
||||
continue;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE:
|
||||
break; // any cases
|
||||
default: // type not use DB data, ignore
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -245,8 +245,8 @@ class AchievementMgr
|
||||
static void DeleteFromDB(uint32 lowguid);
|
||||
void LoadFromDB(QueryResult_AutoPtr achievementResult, QueryResult_AutoPtr criteriaResult);
|
||||
void SaveToDB();
|
||||
void ResetAchievementCriteria(AchievementCriteriaTypes type, uint32 miscvalue1=0, uint32 miscvalue2=0);
|
||||
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscvalue1=0, uint32 miscvalue2=0, Unit *unit=NULL, uint32 time=0);
|
||||
void ResetAchievementCriteria(AchievementCriteriaTypes type, uint32 miscvalue1 = 0, uint32 miscvalue2 = 0, bool evenIfCriteriaComplete = false);
|
||||
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscvalue1 = 0, uint32 miscvalue2 = 0, Unit *unit = NULL, uint32 time = 0);
|
||||
void CompletedAchievement(AchievementEntry const* entry);
|
||||
void CheckAllAchievementCriteria();
|
||||
void SendAllAchievementData();
|
||||
|
||||
Reference in New Issue
Block a user