mirror of
https://github.com/mangosfour/server.git
synced 2025-12-14 16:37:01 +00:00
Implemented ACHIEVEMENT_FLAG_REALM_FIRST_REACH
This commit is contained in:
parent
6707038cfc
commit
0d6805ec94
7 changed files with 66 additions and 7 deletions
|
|
@ -202,6 +202,13 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve
|
|||
if(achievement->flags & ACHIEVEMENT_FLAG_COUNTER)
|
||||
return false;
|
||||
|
||||
if(achievement->flags & (ACHIEVEMENT_FLAG_REALM_FIRST_REACH | ACHIEVEMENT_FLAG_REALM_FIRST_KILL))
|
||||
{
|
||||
// someone on this realm has already completed that achievement
|
||||
if(objmgr.allCompletedAchievements.find(achievement->ID)!=objmgr.allCompletedAchievements.end())
|
||||
return false;
|
||||
}
|
||||
|
||||
CriteriaProgressMap::iterator itr = m_criteriaProgress.find(achievementCriteria->ID);
|
||||
if(itr == m_criteriaProgress.end())
|
||||
return false;
|
||||
|
|
@ -211,10 +218,32 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve
|
|||
switch(achievementCriteria->requiredType)
|
||||
{
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL:
|
||||
if(achievement->ID == 467 && GetPlayer()->getClass() != CLASS_SHAMAN ||
|
||||
achievement->ID == 466 && GetPlayer()->getClass() != CLASS_DRUID ||
|
||||
achievement->ID == 465 && GetPlayer()->getClass() != CLASS_PALADIN ||
|
||||
achievement->ID == 464 && GetPlayer()->getClass() != CLASS_PRIEST ||
|
||||
achievement->ID == 463 && GetPlayer()->getClass() != CLASS_WARLOCK ||
|
||||
achievement->ID == 462 && GetPlayer()->getClass() != CLASS_HUNTER ||
|
||||
achievement->ID == 461 && GetPlayer()->getClass() != CLASS_DEATH_KNIGHT ||
|
||||
achievement->ID == 460 && GetPlayer()->getClass() != CLASS_MAGE ||
|
||||
achievement->ID == 459 && GetPlayer()->getClass() != CLASS_WARRIOR ||
|
||||
achievement->ID == 458 && GetPlayer()->getClass() != CLASS_ROGUE ||
|
||||
|
||||
achievement->ID == 1404 && GetPlayer()->getRace() != RACE_GNOME ||
|
||||
achievement->ID == 1405 && GetPlayer()->getRace() != RACE_BLOODELF ||
|
||||
achievement->ID == 1406 && GetPlayer()->getRace() != RACE_DRAENEI ||
|
||||
achievement->ID == 1407 && GetPlayer()->getRace() != RACE_DWARF ||
|
||||
achievement->ID == 1408 && GetPlayer()->getRace() != RACE_HUMAN ||
|
||||
achievement->ID == 1409 && GetPlayer()->getRace() != RACE_NIGHTELF ||
|
||||
achievement->ID == 1410 && GetPlayer()->getRace() != RACE_ORC ||
|
||||
achievement->ID == 1411 && GetPlayer()->getRace() != RACE_TAUREN ||
|
||||
achievement->ID == 1412 && GetPlayer()->getRace() != RACE_TROLL ||
|
||||
achievement->ID == 1413 && GetPlayer()->getRace() != RACE_UNDEAD_PLAYER )
|
||||
return false;
|
||||
return progress->counter >= achievementCriteria->reach_level.level;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT:
|
||||
return progress->counter >= achievementCriteria->buy_bank_slot.numberOfSlots;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ARCHIEVEMENT:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT:
|
||||
return m_completedAchievements.find(achievementCriteria->complete_achievement.linkedAchievement) != m_completedAchievements.end();
|
||||
}
|
||||
return false;
|
||||
|
|
@ -289,7 +318,12 @@ void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement)
|
|||
SendAchievementEarned(achievement->ID);
|
||||
m_completedAchievements[achievement->ID] = time(NULL);
|
||||
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ARCHIEVEMENT);
|
||||
// don't insert for ACHIEVEMENT_FLAG_REALM_FIRST_KILL since otherwise only the first group member would reach that achievement
|
||||
// TODO: where do set this instead?
|
||||
if(!(achievement->flags & ACHIEVEMENT_FLAG_REALM_FIRST_KILL))
|
||||
objmgr.allCompletedAchievements.insert(achievement->ID);
|
||||
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT);
|
||||
// TODO: reward titles and items
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@ struct CriteriaProgress
|
|||
|
||||
typedef HM_NAMESPACE::hash_map<uint32, CriteriaProgress*> CriteriaProgressMap;
|
||||
typedef HM_NAMESPACE::hash_map<uint32, time_t> CompletedAchievementMap;
|
||||
typedef std::set<uint32> AchievementSet;
|
||||
|
||||
class Player;
|
||||
class WorldPacket;
|
||||
|
|
@ -61,7 +62,6 @@ class AchievementMgr
|
|||
void CheckAllAchievementCriteria();
|
||||
void SendAllAchievementData();
|
||||
void SendRespondInspectAchievements(Player* player);
|
||||
|
||||
Player* GetPlayer() { return m_player;}
|
||||
|
||||
private:
|
||||
|
|
@ -77,7 +77,7 @@ class AchievementMgr
|
|||
Player* m_player;
|
||||
CriteriaProgressMap m_criteriaProgress;
|
||||
CompletedAchievementMap m_completedAchievements;
|
||||
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -563,6 +563,22 @@ void ObjectMgr::LoadCreatureLocales()
|
|||
sLog.outString( ">> Loaded %u creature locale strings", mCreatureLocaleMap.size() );
|
||||
}
|
||||
|
||||
void ObjectMgr::LoadCompletedAchievements()
|
||||
{
|
||||
QueryResult *result = WorldDatabase.Query("SELECT achievement FROM character_achievement GROUP BY achievement");
|
||||
|
||||
if(!result)
|
||||
return;
|
||||
|
||||
do
|
||||
{
|
||||
Field *fields = result->Fetch();
|
||||
allCompletedAchievements.insert(fields[0].GetUInt32());
|
||||
} while(result->NextRow());
|
||||
|
||||
delete result;
|
||||
}
|
||||
|
||||
void ObjectMgr::LoadNpcOptionLocales()
|
||||
{
|
||||
mNpcOptionLocaleMap.clear(); // need for reload case
|
||||
|
|
|
|||
|
|
@ -553,6 +553,7 @@ class ObjectMgr
|
|||
void LoadNpcTextId();
|
||||
void LoadVendors();
|
||||
void LoadTrainerSpell();
|
||||
void LoadCompletedAchievements();
|
||||
|
||||
std::string GeneratePetName(uint32 entry);
|
||||
uint32 GetBaseXP(uint32 level);
|
||||
|
|
@ -757,6 +758,7 @@ class ObjectMgr
|
|||
bool IsVendorItemValid( uint32 vendor_entry, uint32 item, uint32 maxcount, uint32 ptime, uint32 ExtendedCost, Player* pl = NULL, std::set<uint32>* skip_vendors = NULL ) const;
|
||||
void LoadAchievementCriteriaList();
|
||||
AchievementCriteriaEntryList const& GetAchievementCriteriaByType(AchievementCriteriaTypes type);
|
||||
std::set<uint32> allCompletedAchievements;
|
||||
|
||||
protected:
|
||||
uint32 m_auctionid;
|
||||
|
|
|
|||
|
|
@ -931,6 +931,9 @@ void World::SetInitialWorldSettings()
|
|||
sLog.outString( "Loading AchievementCriteriaList..." );
|
||||
objmgr.LoadAchievementCriteriaList();
|
||||
|
||||
sLog.outString( "Loading completed achievements..." );
|
||||
objmgr.LoadCompletedAchievements();
|
||||
|
||||
sLog.outString( "Loading SkillLineAbilityMultiMap Data..." );
|
||||
spellmgr.LoadSkillLineAbilityMap();
|
||||
|
||||
|
|
|
|||
|
|
@ -35,6 +35,10 @@ enum AchievementFactionFlags
|
|||
enum AchievementFlags
|
||||
{
|
||||
ACHIEVEMENT_FLAG_COUNTER = 0x00000001,
|
||||
ACHIEVEMENT_FLAG_REACH_LEVEL = 0x00000004,
|
||||
ACHIEVEMENT_FLAG_AVERAGE = 0x00000040,
|
||||
ACHIEVEMENT_FLAG_REALM_FIRST_REACH= 0x00000100,
|
||||
ACHIEVEMENT_FLAG_REALM_FIRST_KILL = 0x00000200,
|
||||
};
|
||||
|
||||
enum AchievementCriteriaCondition
|
||||
|
|
@ -66,7 +70,7 @@ enum AchievementCriteriaTypes
|
|||
ACHIEVEMENT_CRITERIA_TYPE_WIN_BG = 1,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL = 5,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL = 7,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ARCHIEVEMENT = 8,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT = 8,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT = 9,
|
||||
// you have to complete a daily quest x times in a row
|
||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY = 10,
|
||||
|
|
|
|||
|
|
@ -101,7 +101,7 @@ struct AchievementCriteriaEntry
|
|||
uint32 skillLevel; // 4
|
||||
} reach_skill_level;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ARCHIEVEMENT = 8
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT = 8
|
||||
struct
|
||||
{
|
||||
uint32 linkedAchievement; // 3
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue