mirror of
https://github.com/mangosfour/server.git
synced 2025-12-19 04:37:06 +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 "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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue