[9026] Implement ACHIEVEMENT_CRITERIA_REQUIRE_INSTANCE_SCRIPT.

This achievement criteria requirement type let set in table `achievement_criteria_requirement`
that specific criteria id for achievmenet connected with some instance
must be checked by new InstanceData call
  bool CheckAchievementCriteriaMeet(uint32 criteria_id,Player const* source, Unit const* target, uint32 miscvalue1)

It expected to be used for cases: kill boss without raid members death or for some limited time
or without kill before some other boss helpers and etc. Implementation expected base at collection some data/counters update
in instance data at specific event and then make check by query and retunr success for specific criteri or fail requirements.
This commit is contained in:
VladimirMangos 2009-12-19 18:00:48 +03:00
parent 0c636c6e3e
commit 9b6900b9a3
4 changed files with 30 additions and 7 deletions

View file

@ -35,6 +35,8 @@
#include "MapManager.h" #include "MapManager.h"
#include "BattleGround.h" #include "BattleGround.h"
#include "BattleGroundAB.h" #include "BattleGroundAB.h"
#include "Map.h"
#include "InstanceData.h"
#include "Policies/SingletonImp.h" #include "Policies/SingletonImp.h"
@ -102,6 +104,8 @@ bool AchievementCriteriaRequirement::IsValid(AchievementCriteriaEntry const* cri
case ACHIEVEMENT_CRITERIA_REQUIRE_NONE: case ACHIEVEMENT_CRITERIA_REQUIRE_NONE:
case ACHIEVEMENT_CRITERIA_REQUIRE_VALUE: case ACHIEVEMENT_CRITERIA_REQUIRE_VALUE:
case ACHIEVEMENT_CRITERIA_REQUIRE_DISABLED: case ACHIEVEMENT_CRITERIA_REQUIRE_DISABLED:
case ACHIEVEMENT_CRITERIA_REQUIRE_BG_LOSS_TEAM_SCORE:
case ACHIEVEMENT_CRITERIA_REQUIRE_INSTANCE_SCRIPT:
return true; return true;
case ACHIEVEMENT_CRITERIA_REQUIRE_T_CREATURE: case ACHIEVEMENT_CRITERIA_REQUIRE_T_CREATURE:
if (!creature.id || !ObjectMgr::GetCreatureTemplate(creature.id)) if (!creature.id || !ObjectMgr::GetCreatureTemplate(creature.id))
@ -235,8 +239,6 @@ bool AchievementCriteriaRequirement::IsValid(AchievementCriteriaEntry const* cri
return false; return false;
} }
return true; return true;
case ACHIEVEMENT_CRITERIA_REQUIRE_BG_LOSS_TEAM_SCORE:
return true; // not check correctness node indexes
default: 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); 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; return false;
@ -244,7 +246,7 @@ bool AchievementCriteriaRequirement::IsValid(AchievementCriteriaEntry const* cri
return false; 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) switch(requirementType)
{ {
@ -312,6 +314,16 @@ bool AchievementCriteriaRequirement::Meets(Player const* source, Unit const* tar
return false; return false;
return bg->IsTeamScoreInRange(source->GetTeam()==ALLIANCE ? HORDE : ALLIANCE,bg_loss_team_score.min_score,bg_loss_team_score.max_score); 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; 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 bool AchievementCriteriaRequirementSet::Meets(Player const* source, Unit const* target, uint32 miscvalue /*= 0*/) const
{ {
for(Storage::const_iterator itr = storage.begin(); itr != storage.end(); ++itr) 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 false;
return true; return true;

View file

@ -60,9 +60,10 @@ enum AchievementCriteriaRequirementType
ACHIEVEMENT_CRITERIA_REQUIRE_S_DRUNK = 15, // drunken_state 0 (enum DrunkenState) of player 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_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_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 Player;
class Unit; class Unit;
@ -175,15 +176,18 @@ struct AchievementCriteriaRequirement
} }
bool IsValid(AchievementCriteriaEntry const* criteria); 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 struct AchievementCriteriaRequirementSet
{ {
AchievementCriteriaRequirementSet() : criteria_id(0) {}
explicit AchievementCriteriaRequirementSet(uint32 id) : criteria_id(id) {}
typedef std::vector<AchievementCriteriaRequirement> Storage; typedef std::vector<AchievementCriteriaRequirement> Storage;
void Add(AchievementCriteriaRequirement const& data) { storage.push_back(data); } void Add(AchievementCriteriaRequirement const& data) { storage.push_back(data); }
bool Meets(Player const* source, Unit const* target, uint32 miscvalue = 0) const; bool Meets(Player const* source, Unit const* target, uint32 miscvalue = 0) const;
private: private:
uint32 criteria_id;
Storage storage; Storage storage;
}; };

View file

@ -70,5 +70,12 @@ class MANGOS_DLL_SPEC InstanceData
//All-purpose data storage 32 bit //All-purpose data storage 32 bit
virtual uint32 GetData(uint32 /*Type*/) { return 0; } virtual uint32 GetData(uint32 /*Type*/) { return 0; }
virtual void SetData(uint32 /*Type*/, uint32 /*Data*/) {} 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 #endif

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "9025" #define REVISION_NR "9026"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__