aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp43
-rw-r--r--src/server/game/Achievements/AchievementMgr.h4
-rw-r--r--src/server/game/BattleGrounds/BattleGround.cpp2
-rw-r--r--src/server/game/BattleGrounds/Zones/BattleGroundAA.cpp1
-rw-r--r--src/server/game/BattleGrounds/Zones/BattleGroundAA.h1
-rw-r--r--src/server/game/BattleGrounds/Zones/BattleGroundAB.cpp2
-rw-r--r--src/server/game/BattleGrounds/Zones/BattleGroundAB.h6
-rw-r--r--src/server/game/BattleGrounds/Zones/BattleGroundAV.cpp4
-rw-r--r--src/server/game/BattleGrounds/Zones/BattleGroundAV.h8
-rw-r--r--src/server/game/BattleGrounds/Zones/BattleGroundEY.cpp1
-rw-r--r--src/server/game/BattleGrounds/Zones/BattleGroundEY.h5
-rw-r--r--src/server/game/BattleGrounds/Zones/BattleGroundIC.h6
-rw-r--r--src/server/game/BattleGrounds/Zones/BattleGroundWS.cpp2
-rw-r--r--src/server/game/BattleGrounds/Zones/BattleGroundWS.h6
-rw-r--r--src/server/game/DataStores/DBCEnums.h6
-rw-r--r--src/server/game/DataStores/DBCStructure.h25
-rw-r--r--src/server/game/Scripting/ScriptLoader.cpp2
17 files changed, 86 insertions, 38 deletions
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index ec384f9a995..cc8a3b96961 100644
--- a/src/server/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
@@ -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);
- 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
+ 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;
- }
+ }
}
}
@@ -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;
}
diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h
index 301028e3e7b..f49c2954c4e 100644
--- a/src/server/game/Achievements/AchievementMgr.h
+++ b/src/server/game/Achievements/AchievementMgr.h
@@ -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();
diff --git a/src/server/game/BattleGrounds/BattleGround.cpp b/src/server/game/BattleGrounds/BattleGround.cpp
index bc2c629aaf5..7bce925d90a 100644
--- a/src/server/game/BattleGrounds/BattleGround.cpp
+++ b/src/server/game/BattleGrounds/BattleGround.cpp
@@ -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;
diff --git a/src/server/game/BattleGrounds/Zones/BattleGroundAA.cpp b/src/server/game/BattleGrounds/Zones/BattleGroundAA.cpp
index 56cf3ebed15..921af6c9f32 100644
--- a/src/server/game/BattleGrounds/Zones/BattleGroundAA.cpp
+++ b/src/server/game/BattleGrounds/Zones/BattleGroundAA.cpp
@@ -81,4 +81,3 @@ bool BattleGroundAA::SetupBattleGround()
{
return true;
}
-
diff --git a/src/server/game/BattleGrounds/Zones/BattleGroundAA.h b/src/server/game/BattleGrounds/Zones/BattleGroundAA.h
index a13833697cf..65ae6e6f5dd 100644
--- a/src/server/game/BattleGrounds/Zones/BattleGroundAA.h
+++ b/src/server/game/BattleGrounds/Zones/BattleGroundAA.h
@@ -50,4 +50,3 @@ class BattleGroundAA : public BattleGround
void HandleKillPlayer(Player* player, Player *killer);
};
#endif
-
diff --git a/src/server/game/BattleGrounds/Zones/BattleGroundAB.cpp b/src/server/game/BattleGrounds/Zones/BattleGroundAB.cpp
index 38671e85597..a741a4ba26c 100644
--- a/src/server/game/BattleGrounds/Zones/BattleGroundAB.cpp
+++ b/src/server/game/BattleGrounds/Zones/BattleGroundAB.cpp
@@ -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);
diff --git a/src/server/game/BattleGrounds/Zones/BattleGroundAB.h b/src/server/game/BattleGrounds/Zones/BattleGroundAB.h
index 3072f8beafd..fb4682490a5 100644
--- a/src/server/game/BattleGrounds/Zones/BattleGroundAB.h
+++ b/src/server/game/BattleGrounds/Zones/BattleGroundAB.h
@@ -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
diff --git a/src/server/game/BattleGrounds/Zones/BattleGroundAV.cpp b/src/server/game/BattleGrounds/Zones/BattleGroundAV.cpp
index 67725fd3f39..7be793ad1f2 100644
--- a/src/server/game/BattleGrounds/Zones/BattleGroundAV.cpp
+++ b/src/server/game/BattleGrounds/Zones/BattleGroundAV.cpp
@@ -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;
diff --git a/src/server/game/BattleGrounds/Zones/BattleGroundAV.h b/src/server/game/BattleGrounds/Zones/BattleGroundAV.h
index 6d95c7bbc5d..837fba091c4 100644
--- a/src/server/game/BattleGrounds/Zones/BattleGroundAV.h
+++ b/src/server/game/BattleGrounds/Zones/BattleGroundAV.h
@@ -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;
diff --git a/src/server/game/BattleGrounds/Zones/BattleGroundEY.cpp b/src/server/game/BattleGrounds/Zones/BattleGroundEY.cpp
index 20f023e4c2a..556587b0711 100644
--- a/src/server/game/BattleGrounds/Zones/BattleGroundEY.cpp
+++ b/src/server/game/BattleGrounds/Zones/BattleGroundEY.cpp
@@ -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);
diff --git a/src/server/game/BattleGrounds/Zones/BattleGroundEY.h b/src/server/game/BattleGrounds/Zones/BattleGroundEY.h
index 6b1ec6ced59..66442445a1b 100644
--- a/src/server/game/BattleGrounds/Zones/BattleGroundEY.h
+++ b/src/server/game/BattleGrounds/Zones/BattleGroundEY.h
@@ -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)
diff --git a/src/server/game/BattleGrounds/Zones/BattleGroundIC.h b/src/server/game/BattleGrounds/Zones/BattleGroundIC.h
index e49ea01e850..e360014df69 100644
--- a/src/server/game/BattleGrounds/Zones/BattleGroundIC.h
+++ b/src/server/game/BattleGrounds/Zones/BattleGroundIC.h
@@ -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:
diff --git a/src/server/game/BattleGrounds/Zones/BattleGroundWS.cpp b/src/server/game/BattleGrounds/Zones/BattleGroundWS.cpp
index 2521e93ebcf..8c5949e106f 100644
--- a/src/server/game/BattleGrounds/Zones/BattleGroundWS.cpp
+++ b/src/server/game/BattleGrounds/Zones/BattleGroundWS.cpp
@@ -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);
diff --git a/src/server/game/BattleGrounds/Zones/BattleGroundWS.h b/src/server/game/BattleGrounds/Zones/BattleGroundWS.h
index ff3a3c893ff..2e712637f39 100644
--- a/src/server/game/BattleGrounds/Zones/BattleGroundWS.h
+++ b/src/server/game/BattleGrounds/Zones/BattleGroundWS.h
@@ -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:
diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h
index 8caa77cddff..4d8cef56b3f 100644
--- a/src/server/game/DataStores/DBCEnums.h
+++ b/src/server/game/DataStores/DBCEnums.h
@@ -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
diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h
index 562cd740c72..a3aed724166 100644
--- a/src/server/game/DataStores/DBCStructure.h
+++ b/src/server/game/DataStores/DBCStructure.h
@@ -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
diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp
index 64644bdbe8e..292c14f1a22 100644
--- a/src/server/game/Scripting/ScriptLoader.cpp
+++ b/src/server/game/Scripting/ScriptLoader.cpp
@@ -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
}