aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorn0n4m3 <none@none>2009-12-25 15:53:37 +0100
committern0n4m3 <none@none>2009-12-25 15:53:37 +0100
commit07e2920b6018e7da5a99b19614c6a5bd57ef0f46 (patch)
tree1fd9886f852ff65b62ae7bbd8b86d28edc6d5c12 /src
parent7deb87502ea7bce8f8a783740ab7c2fa6087d97d (diff)
Implement ACHIEVEMENT_CRITERIA_DATA_INSTANCE_SCRIPT. by VladimirMangos
--HG-- branch : trunk
Diffstat (limited to 'src')
-rw-r--r--src/game/AchievementMgr.cpp25
-rw-r--r--src/game/AchievementMgr.h8
-rw-r--r--src/game/InstanceData.cpp8
-rw-r--r--src/game/InstanceData.h4
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