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();
|
||||
|
||||
@@ -1002,6 +1002,7 @@ void BattleGround::RemovePlayerAtLeave(uint64 guid, bool Transport, bool SendPac
|
||||
plr->TeleportToBGEntryPoint();
|
||||
|
||||
sLog.outDetail("BATTLEGROUND: Removed player %s from BattleGround.", plr->GetName());
|
||||
plr->GetAchievementMgr().ResetAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, ACHIEVEMENT_CRITERIA_CONDITION_MAP, GetMapId(), true);
|
||||
}
|
||||
|
||||
//battleground object will be deleted next BattleGround::Update() call
|
||||
@@ -1302,6 +1303,7 @@ void BattleGround::UpdatePlayerScore(Player *Source, uint32 type, uint32 value,
|
||||
break;
|
||||
case SCORE_DEATHS: // Deaths
|
||||
itr->second->Deaths += value;
|
||||
Source->GetAchievementMgr().ResetAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, ACHIEVEMENT_CRITERIA_CONDITION_NO_DEATH);
|
||||
break;
|
||||
case SCORE_HONORABLE_KILLS: // Honorable kills
|
||||
itr->second->HonorableKills += value;
|
||||
|
||||
@@ -81,4 +81,3 @@ bool BattleGroundAA::SetupBattleGround()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -50,4 +50,3 @@ class BattleGroundAA : public BattleGround
|
||||
void HandleKillPlayer(Player* player, Player *killer);
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
@@ -693,9 +693,11 @@ void BattleGroundAB::UpdatePlayerScore(Player *Source, uint32 type, uint32 value
|
||||
{
|
||||
case SCORE_BASES_ASSAULTED:
|
||||
((BattleGroundABScore*)itr->second)->BasesAssaulted += value;
|
||||
Source->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AB_OBJECTIVE_ASSAULT_BASE);
|
||||
break;
|
||||
case SCORE_BASES_DEFENDED:
|
||||
((BattleGroundABScore*)itr->second)->BasesDefended += value;
|
||||
Source->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AB_OBJECTIVE_DEFEND_BASE);
|
||||
break;
|
||||
default:
|
||||
BattleGround::UpdatePlayerScore(Source,type,value, doAddHonor);
|
||||
|
||||
@@ -172,6 +172,12 @@ enum BG_AB_Sounds
|
||||
BG_AB_SOUND_NEAR_VICTORY = 8456
|
||||
};
|
||||
|
||||
enum BG_AB_Objectives
|
||||
{
|
||||
AB_OBJECTIVE_ASSAULT_BASE = 122,
|
||||
AB_OBJECTIVE_DEFEND_BASE = 123
|
||||
};
|
||||
|
||||
#define BG_AB_NotABBGWeekendHonorTicks 330
|
||||
#define BG_AB_ABBGWeekendHonorTicks 200
|
||||
#define BG_AB_NotABBGWeekendReputationTicks 200
|
||||
|
||||
@@ -541,15 +541,19 @@ void BattleGroundAV::UpdatePlayerScore(Player* Source, uint32 type, uint32 value
|
||||
{
|
||||
case SCORE_GRAVEYARDS_ASSAULTED:
|
||||
((BattleGroundAVScore*)itr->second)->GraveyardsAssaulted += value;
|
||||
Source->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AV_OBJECTIVE_ASSAULT_GRAVEYARD);
|
||||
break;
|
||||
case SCORE_GRAVEYARDS_DEFENDED:
|
||||
((BattleGroundAVScore*)itr->second)->GraveyardsDefended += value;
|
||||
Source->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AV_OBJECTIVE_DEFEND_GRAVEYARD);
|
||||
break;
|
||||
case SCORE_TOWERS_ASSAULTED:
|
||||
((BattleGroundAVScore*)itr->second)->TowersAssaulted += value;
|
||||
Source->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AV_OBJECTIVE_ASSAULT_TOWER);
|
||||
break;
|
||||
case SCORE_TOWERS_DEFENDED:
|
||||
((BattleGroundAVScore*)itr->second)->TowersDefended += value;
|
||||
Source->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AV_OBJECTIVE_DEFEND_TOWER);
|
||||
break;
|
||||
case SCORE_MINES_CAPTURED:
|
||||
((BattleGroundAVScore*)itr->second)->MinesCaptured += value;
|
||||
|
||||
@@ -1499,6 +1499,14 @@ enum BG_AV_QuestIds
|
||||
AV_QUEST_H_RIDER_TAME = 7001
|
||||
};
|
||||
|
||||
enum BG_AV_Objectives
|
||||
{
|
||||
AV_OBJECTIVE_ASSAULT_TOWER = 61,
|
||||
AV_OBJECTIVE_ASSAULT_GRAVEYARD = 63,
|
||||
AV_OBJECTIVE_DEFEND_TOWER = 64,
|
||||
AV_OBJECTIVE_DEFEND_GRAVEYARD = 65
|
||||
};
|
||||
|
||||
struct BG_AV_NodeInfo
|
||||
{
|
||||
uint16 TotalOwner;
|
||||
|
||||
@@ -817,6 +817,7 @@ void BattleGroundEY::UpdatePlayerScore(Player *Source, uint32 type, uint32 value
|
||||
{
|
||||
case SCORE_FLAG_CAPTURES: // flags captured
|
||||
((BattleGroundEYScore*)itr->second)->FlagCaptures += value;
|
||||
Source->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, EY_OBJECTIVE_CAPTURE_FLAG);
|
||||
break;
|
||||
default:
|
||||
BattleGround::UpdatePlayerScore(Source, type, value, doAddHonor);
|
||||
|
||||
@@ -240,6 +240,11 @@ enum EYBattleGroundPointState
|
||||
EY_POINT_UNDER_CONTROL = 3
|
||||
};
|
||||
|
||||
enum BG_EY_Objectives
|
||||
{
|
||||
EY_OBJECTIVE_CAPTURE_FLAG = 183
|
||||
};
|
||||
|
||||
struct BattleGroundEYPointIconsStruct
|
||||
{
|
||||
BattleGroundEYPointIconsStruct(uint32 _WorldStateControlIndex, uint32 _WorldStateAllianceControlledIndex, uint32 _WorldStateHordeControlledIndex)
|
||||
|
||||
@@ -27,6 +27,12 @@ enum Buffs
|
||||
QUARRY = 68720
|
||||
};
|
||||
|
||||
enum BG_IC_Objectives
|
||||
{
|
||||
IC_OBJECTIVE_ASSAULT_BASE = 245,
|
||||
IC_OBJECTIVE_DEFEND_BASE = 246
|
||||
};
|
||||
|
||||
class BattleGroundICScore : public BattleGroundScore
|
||||
{
|
||||
public:
|
||||
|
||||
@@ -765,9 +765,11 @@ void BattleGroundWS::UpdatePlayerScore(Player *Source, uint32 type, uint32 value
|
||||
{
|
||||
case SCORE_FLAG_CAPTURES: // flags captured
|
||||
((BattleGroundWGScore*)itr->second)->FlagCaptures += value;
|
||||
Source->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, WS_OBJECTIVE_CAPTURE_FLAG);
|
||||
break;
|
||||
case SCORE_FLAG_RETURNS: // flags returned
|
||||
((BattleGroundWGScore*)itr->second)->FlagReturns += value;
|
||||
Source->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, WS_OBJECTIVE_RETURN_FLAG);
|
||||
break;
|
||||
default:
|
||||
BattleGround::UpdatePlayerScore(Source, type, value, doAddHonor);
|
||||
|
||||
@@ -138,6 +138,12 @@ enum BG_WS_CarrierDebuffs
|
||||
WS_SPELL_BRUTAL_ASSAULT = 46393
|
||||
};
|
||||
|
||||
enum BG_WS_Objectives
|
||||
{
|
||||
WS_OBJECTIVE_CAPTURE_FLAG = 42,
|
||||
WS_OBJECTIVE_RETURN_FLAG = 44
|
||||
};
|
||||
|
||||
class BattleGroundWGScore : public BattleGroundScore
|
||||
{
|
||||
public:
|
||||
|
||||
@@ -69,12 +69,14 @@ enum AchievementFlags
|
||||
ACHIEVEMENT_FLAG_REALM_FIRST_KILL = 0x00000200, //
|
||||
};
|
||||
|
||||
#define MAX_CRITERIA_REQUIREMENTS 2
|
||||
|
||||
enum AchievementCriteriaCondition
|
||||
{
|
||||
ACHIEVEMENT_CRITERIA_CONDITION_NONE = 0,
|
||||
ACHIEVEMENT_CRITERIA_CONDITION_NO_DEATH = 1,
|
||||
ACHIEVEMENT_CRITERIA_CONDITION_NO_DEATH = 1, // reset progress on death
|
||||
ACHIEVEMENT_CRITERIA_CONDITION_UNK1 = 2, // only used in "Complete a daily quest every day for five consecutive days"
|
||||
ACHIEVEMENT_CRITERIA_CONDITION_MAP = 3, // requires you to be on specific map
|
||||
ACHIEVEMENT_CRITERIA_CONDITION_MAP = 3, // requires you to be on specific map, reset at change
|
||||
ACHIEVEMENT_CRITERIA_CONDITION_NO_LOOSE = 4, // only used in "Win 10 arenas without losing"
|
||||
ACHIEVEMENT_CRITERIA_CONDITION_UNK2 = 9, // unk
|
||||
ACHIEVEMENT_CRITERIA_CONDITION_UNK3 = 13, // unk
|
||||
|
||||
@@ -90,10 +90,6 @@ struct AchievementCriteriaEntry
|
||||
{
|
||||
uint32 bgMapID; // 3
|
||||
uint32 winCount; // 4
|
||||
uint32 additionalRequirement1_type; // 5 additional requirement 1 type
|
||||
uint32 additionalRequirement1_value; // 6 additional requirement 1 value
|
||||
uint32 additionalRequirement2_type; // 7 additional requirement 2 type
|
||||
uint32 additionalRequirement2_value; // 8 additional requirement 1 value
|
||||
} win_bg;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL = 5
|
||||
@@ -210,6 +206,13 @@ struct AchievementCriteriaEntry
|
||||
uint32 castCount; // 4
|
||||
} cast_spell;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE
|
||||
struct
|
||||
{
|
||||
uint32 objectiveId; // 3
|
||||
uint32 completeCount; // 4
|
||||
} bg_objective;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA = 31
|
||||
struct
|
||||
{
|
||||
@@ -247,7 +250,6 @@ struct AchievementCriteriaEntry
|
||||
{
|
||||
uint32 unused; // 3
|
||||
uint32 count; // 4
|
||||
uint32 flag; // 5 4=in a row
|
||||
} win_rated_arena;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING = 38
|
||||
@@ -375,8 +377,6 @@ struct AchievementCriteriaEntry
|
||||
{
|
||||
uint32 unused; // 3
|
||||
uint32 count; // 4
|
||||
uint32 flag; // 5 =3 for battleground healing
|
||||
uint32 mapid; // 6
|
||||
} healing_done;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM = 57
|
||||
@@ -485,12 +485,15 @@ struct AchievementCriteriaEntry
|
||||
{
|
||||
uint32 field3; // 3 main requirement
|
||||
uint32 count; // 4 main requirement count
|
||||
uint32 additionalRequirement1_type; // 5 additional requirement 1 type
|
||||
uint32 additionalRequirement1_value; // 6 additional requirement 1 value
|
||||
uint32 additionalRequirement2_type; // 7 additional requirement 2 type
|
||||
uint32 additionalRequirement2_value; // 8 additional requirement 1 value
|
||||
} raw;
|
||||
};
|
||||
|
||||
struct
|
||||
{
|
||||
uint32 additionalRequirement_type;
|
||||
uint32 additionalRequirement_value;
|
||||
} additionalRequrements[MAX_CRITERIA_REQUIREMENTS];
|
||||
|
||||
//char* name[16]; // 9-24
|
||||
//uint32 name_flags; // 25
|
||||
uint32 completionFlag; // 26
|
||||
|
||||
@@ -38,6 +38,7 @@ void AddSC_npc_professions();
|
||||
void AddSC_npc_innkeeper();
|
||||
void AddSC_npcs_special();
|
||||
void AddSC_npc_taxi();
|
||||
void AddSC_achievement_scripts();
|
||||
|
||||
//eastern kingdoms
|
||||
void AddSC_alterac_valley(); //Alterac Valley
|
||||
@@ -598,6 +599,7 @@ void AddWorldScripts()
|
||||
AddSC_npc_innkeeper();
|
||||
AddSC_npcs_special();
|
||||
AddSC_npc_taxi();
|
||||
AddSC_achievement_scripts();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user