[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 "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;

View file

@ -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<AchievementCriteriaRequirement> 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;
};

View file

@ -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

View file

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