mirror of
https://github.com/mangosfour/server.git
synced 2025-12-15 19:37:02 +00:00
[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:
parent
0c636c6e3e
commit
9b6900b9a3
4 changed files with 30 additions and 7 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
#ifndef __REVISION_NR_H__
|
||||
#define __REVISION_NR_H__
|
||||
#define REVISION_NR "9025"
|
||||
#define REVISION_NR "9026"
|
||||
#endif // __REVISION_NR_H__
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue