Implemented ACHIEVEMENT_FLAG_REALM_FIRST_REACH

This commit is contained in:
arrai 2008-10-31 12:35:08 +01:00
parent 6707038cfc
commit 0d6805ec94
7 changed files with 66 additions and 7 deletions

View file

@ -202,6 +202,13 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve
if(achievement->flags & ACHIEVEMENT_FLAG_COUNTER) if(achievement->flags & ACHIEVEMENT_FLAG_COUNTER)
return false; 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); CriteriaProgressMap::iterator itr = m_criteriaProgress.find(achievementCriteria->ID);
if(itr == m_criteriaProgress.end()) if(itr == m_criteriaProgress.end())
return false; return false;
@ -211,10 +218,32 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve
switch(achievementCriteria->requiredType) switch(achievementCriteria->requiredType)
{ {
case ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL: 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; return progress->counter >= achievementCriteria->reach_level.level;
case ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT: case ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT:
return progress->counter >= achievementCriteria->buy_bank_slot.numberOfSlots; 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 m_completedAchievements.find(achievementCriteria->complete_achievement.linkedAchievement) != m_completedAchievements.end();
} }
return false; return false;
@ -289,7 +318,12 @@ void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement)
SendAchievementEarned(achievement->ID); SendAchievementEarned(achievement->ID);
m_completedAchievements[achievement->ID] = time(NULL); 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 // TODO: reward titles and items
} }

View file

@ -38,6 +38,7 @@ struct CriteriaProgress
typedef HM_NAMESPACE::hash_map<uint32, CriteriaProgress*> CriteriaProgressMap; typedef HM_NAMESPACE::hash_map<uint32, CriteriaProgress*> CriteriaProgressMap;
typedef HM_NAMESPACE::hash_map<uint32, time_t> CompletedAchievementMap; typedef HM_NAMESPACE::hash_map<uint32, time_t> CompletedAchievementMap;
typedef std::set<uint32> AchievementSet;
class Player; class Player;
class WorldPacket; class WorldPacket;
@ -61,7 +62,6 @@ class AchievementMgr
void CheckAllAchievementCriteria(); void CheckAllAchievementCriteria();
void SendAllAchievementData(); void SendAllAchievementData();
void SendRespondInspectAchievements(Player* player); void SendRespondInspectAchievements(Player* player);
Player* GetPlayer() { return m_player;} Player* GetPlayer() { return m_player;}
private: private:
@ -77,7 +77,7 @@ class AchievementMgr
Player* m_player; Player* m_player;
CriteriaProgressMap m_criteriaProgress; CriteriaProgressMap m_criteriaProgress;
CompletedAchievementMap m_completedAchievements; CompletedAchievementMap m_completedAchievements;
}; };
#endif #endif

View file

@ -563,6 +563,22 @@ void ObjectMgr::LoadCreatureLocales()
sLog.outString( ">> Loaded %u creature locale strings", mCreatureLocaleMap.size() ); 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() void ObjectMgr::LoadNpcOptionLocales()
{ {
mNpcOptionLocaleMap.clear(); // need for reload case mNpcOptionLocaleMap.clear(); // need for reload case

View file

@ -553,6 +553,7 @@ class ObjectMgr
void LoadNpcTextId(); void LoadNpcTextId();
void LoadVendors(); void LoadVendors();
void LoadTrainerSpell(); void LoadTrainerSpell();
void LoadCompletedAchievements();
std::string GeneratePetName(uint32 entry); std::string GeneratePetName(uint32 entry);
uint32 GetBaseXP(uint32 level); 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; 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(); void LoadAchievementCriteriaList();
AchievementCriteriaEntryList const& GetAchievementCriteriaByType(AchievementCriteriaTypes type); AchievementCriteriaEntryList const& GetAchievementCriteriaByType(AchievementCriteriaTypes type);
std::set<uint32> allCompletedAchievements;
protected: protected:
uint32 m_auctionid; uint32 m_auctionid;

View file

@ -931,6 +931,9 @@ void World::SetInitialWorldSettings()
sLog.outString( "Loading AchievementCriteriaList..." ); sLog.outString( "Loading AchievementCriteriaList..." );
objmgr.LoadAchievementCriteriaList(); objmgr.LoadAchievementCriteriaList();
sLog.outString( "Loading completed achievements..." );
objmgr.LoadCompletedAchievements();
sLog.outString( "Loading SkillLineAbilityMultiMap Data..." ); sLog.outString( "Loading SkillLineAbilityMultiMap Data..." );
spellmgr.LoadSkillLineAbilityMap(); spellmgr.LoadSkillLineAbilityMap();

View file

@ -34,7 +34,11 @@ enum AchievementFactionFlags
enum AchievementFlags enum AchievementFlags
{ {
ACHIEVEMENT_FLAG_COUNTER = 0x00000001, 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 enum AchievementCriteriaCondition
@ -66,7 +70,7 @@ enum AchievementCriteriaTypes
ACHIEVEMENT_CRITERIA_TYPE_WIN_BG = 1, ACHIEVEMENT_CRITERIA_TYPE_WIN_BG = 1,
ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL = 5, ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL = 5,
ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL = 7, 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, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT = 9,
// you have to complete a daily quest x times in a row // you have to complete a daily quest x times in a row
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY = 10, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY = 10,

View file

@ -101,7 +101,7 @@ struct AchievementCriteriaEntry
uint32 skillLevel; // 4 uint32 skillLevel; // 4
} reach_skill_level; } reach_skill_level;
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ARCHIEVEMENT = 8 // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT = 8
struct struct
{ {
uint32 linkedAchievement; // 3 uint32 linkedAchievement; // 3