diff --git a/src/game/AchievementMgr.cpp b/src/game/AchievementMgr.cpp index 1a4a55412..9fe0c1e9a 100644 --- a/src/game/AchievementMgr.cpp +++ b/src/game/AchievementMgr.cpp @@ -35,6 +35,8 @@ #include "MapManager.h" #include "BattleGround.h" #include "BattleGroundAB.h" +#include "Map.h" +#include "InstanceData.h" #include "Policies/SingletonImp.h" @@ -102,6 +104,8 @@ bool AchievementCriteriaRequirement::IsValid(AchievementCriteriaEntry const* cri case ACHIEVEMENT_CRITERIA_REQUIRE_NONE: case ACHIEVEMENT_CRITERIA_REQUIRE_VALUE: case ACHIEVEMENT_CRITERIA_REQUIRE_DISABLED: + case ACHIEVEMENT_CRITERIA_REQUIRE_BG_LOSS_TEAM_SCORE: + case ACHIEVEMENT_CRITERIA_REQUIRE_INSTANCE_SCRIPT: return true; case ACHIEVEMENT_CRITERIA_REQUIRE_T_CREATURE: if (!creature.id || !ObjectMgr::GetCreatureTemplate(creature.id)) @@ -235,8 +239,6 @@ bool AchievementCriteriaRequirement::IsValid(AchievementCriteriaEntry const* cri return false; } return true; - case ACHIEVEMENT_CRITERIA_REQUIRE_BG_LOSS_TEAM_SCORE: - return true; // not check correctness node indexes default: sLog.outErrorDb( "Table `achievement_criteria_requirement` (Entry: %u Type: %u) have data for not supported data type (%u), ignore.", criteria->ID, criteria->requiredType,requirementType); return false; @@ -244,7 +246,7 @@ bool AchievementCriteriaRequirement::IsValid(AchievementCriteriaEntry const* cri return false; } -bool AchievementCriteriaRequirement::Meets(Player const* source, Unit const* target, uint32 miscvalue1 /*= 0*/) const +bool AchievementCriteriaRequirement::Meets(uint32 criteria_id, Player const* source, Unit const* target, uint32 miscvalue1 /*= 0*/) const { switch(requirementType) { @@ -312,6 +314,16 @@ bool AchievementCriteriaRequirement::Meets(Player const* source, Unit const* tar return false; return bg->IsTeamScoreInRange(source->GetTeam()==ALLIANCE ? HORDE : ALLIANCE,bg_loss_team_score.min_score,bg_loss_team_score.max_score); } + case ACHIEVEMENT_CRITERIA_REQUIRE_INSTANCE_SCRIPT: + if (!source->IsInWorld()) + return false; + Map* map = source->GetMap(); + if (!map->Instanceable()) + return false; + InstanceData* data = ((InstanceMap*)map)->GetInstanceData(); + if (!data) + return false; + return data->CheckAchievementCriteriaMeet(criteria_id, source, target, miscvalue1); } return false; } @@ -319,7 +331,7 @@ bool AchievementCriteriaRequirement::Meets(Player const* source, Unit const* tar bool AchievementCriteriaRequirementSet::Meets(Player const* source, Unit const* target, uint32 miscvalue /*= 0*/) const { for(Storage::const_iterator itr = storage.begin(); itr != storage.end(); ++itr) - if(!itr->Meets(source,target,miscvalue)) + if(!itr->Meets(criteria_id, source, target, miscvalue)) return false; return true; diff --git a/src/game/AchievementMgr.h b/src/game/AchievementMgr.h index b13441194..be071a279 100644 --- a/src/game/AchievementMgr.h +++ b/src/game/AchievementMgr.h @@ -60,9 +60,10 @@ enum AchievementCriteriaRequirementType ACHIEVEMENT_CRITERIA_REQUIRE_S_DRUNK = 15, // drunken_state 0 (enum DrunkenState) of player ACHIEVEMENT_CRITERIA_REQUIRE_HOLIDAY = 16, // holiday_id 0 event in holiday time ACHIEVEMENT_CRITERIA_REQUIRE_BG_LOSS_TEAM_SCORE = 17, // min_score max_score player's team win bg and opposition team have team score in range + ACHIEVEMENT_CRITERIA_REQUIRE_INSTANCE_SCRIPT = 18, // 0 0 maker instance script call for check curent criteria requirements fit }; -#define MAX_ACHIEVEMENT_CRITERIA_REQUIREMENT_TYPE 18 // maximum value in AchievementCriteriaRequirementType enum +#define MAX_ACHIEVEMENT_CRITERIA_REQUIREMENT_TYPE 19 // maximum value in AchievementCriteriaRequirementType enum class Player; class Unit; @@ -175,15 +176,18 @@ struct AchievementCriteriaRequirement } bool IsValid(AchievementCriteriaEntry const* criteria); - bool Meets(Player const* source, Unit const* target, uint32 miscvalue1 = 0) const; + bool Meets(uint32 criteria_id, Player const* source, Unit const* target, uint32 miscvalue1 = 0) const; }; struct AchievementCriteriaRequirementSet { + AchievementCriteriaRequirementSet() : criteria_id(0) {} + explicit AchievementCriteriaRequirementSet(uint32 id) : criteria_id(id) {} typedef std::vector Storage; void Add(AchievementCriteriaRequirement const& data) { storage.push_back(data); } bool Meets(Player const* source, Unit const* target, uint32 miscvalue = 0) const; private: + uint32 criteria_id; Storage storage; }; diff --git a/src/game/InstanceData.h b/src/game/InstanceData.h index 4099e7aa3..b7539fc2f 100644 --- a/src/game/InstanceData.h +++ b/src/game/InstanceData.h @@ -70,5 +70,12 @@ class MANGOS_DLL_SPEC InstanceData //All-purpose data storage 32 bit virtual uint32 GetData(uint32 /*Type*/) { return 0; } virtual void SetData(uint32 /*Type*/, uint32 /*Data*/) {} + + // Achievement criteria additional requirements check + // NOTE: not use this if same can be checked existed requirement types from AchievementCriteriaRequirementType + virtual bool CheckAchievementCriteriaMeet(uint32 /*criteria_id*/, Player const* /*source*/, Unit const* /*target*/ = NULL, uint32 /*miscvalue1*/ = 0) + { + return false; + } }; #endif diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index b7694a31f..d5a4c8ce7 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "9025" + #define REVISION_NR "9026" #endif // __REVISION_NR_H__