aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2014-09-20 19:07:39 +0200
committerShauren <shauren.trinity@gmail.com>2014-09-20 19:07:39 +0200
commitd87c23cdafd3f64e83e4451efeb4952814593d69 (patch)
treebeeb89c2bdadbbc4ab9692e9cb53d808e919b1e0 /src
parentb5cd540758592261a51e2e4c580190fd282ed5a0 (diff)
Core/Achievements: Fixed realm first kill achievement restrictions - now only the first group will be able to complete it
Closes #2957
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp16
-rw-r--r--src/server/game/Achievements/AchievementMgr.h23
-rw-r--r--src/server/game/Maps/MapManager.cpp2
3 files changed, 30 insertions, 11 deletions
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index 90e8d8de672..594f34e4202 100644
--- a/src/server/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
@@ -1620,7 +1620,7 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve
if (achievement->flags & (ACHIEVEMENT_FLAG_REALM_FIRST_REACH | ACHIEVEMENT_FLAG_REALM_FIRST_KILL))
{
// someone on this realm has already completed that achievement
- if (sAchievementMgr->IsRealmCompleted(achievement))
+ if (sAchievementMgr->IsRealmCompleted(achievement, GetPlayer()->GetInstanceId()))
return false;
}
@@ -2027,10 +2027,7 @@ void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement)
ca.date = time(NULL);
ca.changed = true;
- // 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))
- sAchievementMgr->SetRealmCompleted(achievement);
+ sAchievementMgr->SetRealmCompleted(achievement, GetPlayer()->GetInstanceId());
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT);
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS, achievement->points);
@@ -2405,7 +2402,7 @@ void AchievementGlobalMgr::LoadCompletedAchievements()
continue;
}
else if (achievement->flags & (ACHIEVEMENT_FLAG_REALM_FIRST_REACH | ACHIEVEMENT_FLAG_REALM_FIRST_KILL))
- m_allCompletedAchievements.insert(achievementId);
+ m_allCompletedAchievements[achievementId] = uint32(0xFFFFFFFF);
}
while (result->NextRow());
@@ -2582,3 +2579,10 @@ AchievementCriteriaEntry const* AchievementGlobalMgr::GetAchievementCriteria(uin
{
return sAchievementCriteriaStore.LookupEntry(criteriaId);
}
+
+void AchievementGlobalMgr::OnInstanceDestroyed(uint32 instanceId)
+{
+ for (auto& realmCompletion : m_allCompletedAchievements)
+ if (realmCompletion.second == instanceId)
+ realmCompletion.second = uint32(0xFFFFFFFF);
+}
diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h
index a72152782c3..282cc0d70c2 100644
--- a/src/server/game/Achievements/AchievementMgr.h
+++ b/src/server/game/Achievements/AchievementMgr.h
@@ -355,16 +355,29 @@ class AchievementGlobalMgr
return iter != m_criteriaDataMap.end() ? &iter->second : NULL;
}
- bool IsRealmCompleted(AchievementEntry const* achievement) const
+ bool IsRealmCompleted(AchievementEntry const* achievement, uint32 instanceId) const
{
- return m_allCompletedAchievements.find(achievement->ID) != m_allCompletedAchievements.end();
+ AllCompletedAchievements::const_iterator itr = m_allCompletedAchievements.find(achievement->ID);
+ if (itr == m_allCompletedAchievements.end())
+ return false;
+
+ if (achievement->flags & ACHIEVEMENT_FLAG_REALM_FIRST_KILL)
+ return itr->second != instanceId;
+
+ return true;
}
- void SetRealmCompleted(AchievementEntry const* achievement)
+ void SetRealmCompleted(AchievementEntry const* achievement, uint32 instanceId)
{
- m_allCompletedAchievements.insert(achievement->ID);
+ if (IsRealmCompleted(achievement, instanceId))
+ return;
+
+ m_allCompletedAchievements[achievement->ID] = instanceId;
}
+ // Removes instanceId as valid id to complete realm first kill achievements
+ void OnInstanceDestroyed(uint32 instanceId);
+
void LoadAchievementCriteriaList();
void LoadAchievementCriteriaData();
void LoadAchievementReferenceList();
@@ -387,7 +400,7 @@ class AchievementGlobalMgr
// store achievements by referenced achievement id to speed up lookup
AchievementListByReferencedId m_AchievementListByReferencedId;
- typedef std::set<uint32> AllCompletedAchievements;
+ typedef std::map<uint32 /*achievementId*/, uint32 /*instanceId*/> AllCompletedAchievements;
AllCompletedAchievements m_allCompletedAchievements;
AchievementRewards m_achievementRewards;
diff --git a/src/server/game/Maps/MapManager.cpp b/src/server/game/Maps/MapManager.cpp
index 7fbb4d543f0..87a2b7dca8b 100644
--- a/src/server/game/Maps/MapManager.cpp
+++ b/src/server/game/Maps/MapManager.cpp
@@ -36,6 +36,7 @@
#include "Player.h"
#include "WorldSession.h"
#include "Opcodes.h"
+#include "AchievementMgr.h"
MapManager::MapManager()
{
@@ -393,4 +394,5 @@ void MapManager::FreeInstanceId(uint32 instanceId)
SetNextInstanceId(instanceId);
_instanceIds[instanceId] = false;
+ sAchievementMgr->OnInstanceDestroyed(instanceId);
}