mirror of
https://github.com/mangosfour/server.git
synced 2025-12-15 01:37:00 +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)
|
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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue