diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/game/AchievementMgr.cpp | 25 | ||||
-rw-r--r-- | src/game/AchievementMgr.h | 8 | ||||
-rw-r--r-- | src/game/InstanceData.cpp | 8 | ||||
-rw-r--r-- | src/game/InstanceData.h | 4 |
4 files changed, 41 insertions, 4 deletions
diff --git a/src/game/AchievementMgr.cpp b/src/game/AchievementMgr.cpp index b7175a09af3..3be46b081ff 100644 --- a/src/game/AchievementMgr.cpp +++ b/src/game/AchievementMgr.cpp @@ -38,6 +38,8 @@ #include "MapManager.h" #include "BattleGround.h" #include "BattleGroundAB.h" +#include "Map.h" +#include "InstanceData.h" INSTANTIATE_SINGLETON_1(AchievementGlobalMgr); @@ -102,6 +104,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_NONE: case ACHIEVEMENT_CRITERIA_DATA_TYPE_VALUE: case ACHIEVEMENT_CRITERIA_DATA_TYPE_DISABLED: + case ACHIEVEMENT_CRITERIA_DATA_INSTANCE_SCRIPT: return true; case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_CREATURE: if (!creature.id || !objmgr.GetCreatureTemplate(creature.id)) @@ -244,7 +247,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) return false; } -bool AchievementCriteriaData::Meets(Player const* source, Unit const* target, uint32 miscvalue1 /*= 0*/) const +bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Unit const* target, uint32 miscvalue1 /*= 0*/) const { switch(dataType) { @@ -312,6 +315,24 @@ bool AchievementCriteriaData::Meets(Player const* source, Unit const* target, ui 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_DATA_INSTANCE_SCRIPT: + if (!source->IsInWorld()) + return false; + Map* map = source->GetMap(); + if (!map->Instanceable()) + { + sLog.outErrorDb("Achievement system call ACHIEVEMENT_CRITERIA_DATA_INSTANCE_SCRIPT (%u) for achievement criteria %u for non-instance map %u", + ACHIEVEMENT_CRITERIA_DATA_INSTANCE_SCRIPT, criteria_id, map->GetId()); + return false; + } + InstanceData* data = ((InstanceMap*)map)->GetInstanceData(); + if (!data) + { + sLog.outErrorDb("Achievement system call ACHIEVEMENT_CRITERIA_DATA_INSTANCE_SCRIPT (%u) for achievement criteria %u for map %u but map not have instance script", + ACHIEVEMENT_CRITERIA_DATA_INSTANCE_SCRIPT, criteria_id, map->GetId()); + return false; + } + return data->CheckAchievementCriteriaMeet(criteria_id, source, target, miscvalue1); } return false; } @@ -319,7 +340,7 @@ bool AchievementCriteriaData::Meets(Player const* source, Unit const* target, ui bool AchievementCriteriaDataSet::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 ceaa4bde65b..cbca0a0caf2 100644 --- a/src/game/AchievementMgr.h +++ b/src/game/AchievementMgr.h @@ -60,9 +60,10 @@ enum AchievementCriteriaDataType ACHIEVEMENT_CRITERIA_DATA_TYPE_S_DRUNK = 15,// drunken_state 0 (enum DrunkenState) of player ACHIEVEMENT_CRITERIA_DATA_TYPE_HOLIDAY = 16,// holiday_id 0 event in holiday time ACHIEVEMENT_CRITERIA_DATA_TYPE_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_DATA_TYPE 18 // maximum value in AchievementCriteriaDataType enum +#define MAX_ACHIEVEMENT_CRITERIA_DATA_TYPE 19 // maximum value in AchievementCriteriaDataType enum class Player; class Unit; @@ -174,15 +175,18 @@ struct AchievementCriteriaData } 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 AchievementCriteriaDataSet { + AchievementCriteriaDataSet() : criteria_id(0) {} + explicit AchievementCriteriaDataSet(uint32 id) : criteria_id(id) {} typedef std::vector<AchievementCriteriaData> Storage; void Add(AchievementCriteriaData 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.cpp b/src/game/InstanceData.cpp index 8db145bb5e1..51f63c6dbdc 100644 --- a/src/game/InstanceData.cpp +++ b/src/game/InstanceData.cpp @@ -25,6 +25,7 @@ #include "GameObject.h" #include "Creature.h" #include "CreatureAI.h" +#include "Log.h" void InstanceData::SaveToDB() { @@ -331,3 +332,10 @@ void InstanceData::DoRemoveAurasDueToSpellOnPlayers(uint32 spell) if (Player* pPlayer = i->getSource()) pPlayer->RemoveAurasDueToSpell(spell); } + +bool InstanceData::CheckAchievementCriteriaMeet( uint32 criteria_id, Player const* /*source*/, Unit const* /*target*/ /*= NULL*/, uint32 /*miscvalue1*/ /*= 0*/ ) +{ + sLog.outError("Achievement system call InstanceData::CheckAchievementCriteriaMeet but instance script for map %u not have implementation for achievement criteria %u", + instance->GetId(),criteria_id); + return false; +} diff --git a/src/game/InstanceData.h b/src/game/InstanceData.h index ccc389d8cc2..61a7ee7fffe 100644 --- a/src/game/InstanceData.h +++ b/src/game/InstanceData.h @@ -181,6 +181,10 @@ class TRINITY_DLL_SPEC InstanceData : public ZoneScript std::vector<BossInfo> bosses; DoorInfoMap doors; MinionInfoMap minions; + + // 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); }; #endif |