aboutsummaryrefslogtreecommitdiff
path: root/src/game/AchievementMgr.cpp
diff options
context:
space:
mode:
authormegamage <none@none>2009-03-06 18:14:05 -0600
committermegamage <none@none>2009-03-06 18:14:05 -0600
commitc2261e350231a9d2fb7699a27c8991aa76874b14 (patch)
treeb9613413c7104df7750252dcbadb509d98a0ffcb /src/game/AchievementMgr.cpp
parent7915fd768a34604f6edf6be63bdf77fb2663d556 (diff)
[7391] Prevent achievement counter overflow, implement ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE generic support.
Before overflow has been possible at 4294967295 lols for example. ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE in many cases require check special conditions and targets. For this allow call it from scripts: * Add Player::UpdateAchievementCriteria functiona ccessable from scripts * In emote case it allowed call in form player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE, text_emote_id, achievement_id, target_unit_ptr); Author: VladimirMangos --HG-- branch : trunk
Diffstat (limited to 'src/game/AchievementMgr.cpp')
-rw-r--r--src/game/AchievementMgr.cpp34
1 files changed, 32 insertions, 2 deletions
diff --git a/src/game/AchievementMgr.cpp b/src/game/AchievementMgr.cpp
index b06a2f1c758..0f61962ce1a 100644
--- a/src/game/AchievementMgr.cpp
+++ b/src/game/AchievementMgr.cpp
@@ -730,6 +730,31 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
break;
}
+ case ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE:
+ {
+ // miscvalue1 = emote
+ // miscvalue2 = achievement->ID for special requirement
+ if(!miscvalue1)
+ continue;
+ if(miscvalue1 != achievementCriteria->do_emote.emoteID)
+ continue;
+ if(achievementCriteria->do_emote.count)
+ {
+ // harcoded case
+ if(achievement->ID==247)
+ {
+ if (!unit || unit->GetTypeId() != TYPEID_PLAYER ||
+ unit->isAlive() || ((Player*)unit)->GetDeathTimer() == 0)
+ continue;
+ }
+ // expected as scripted case
+ else if(!miscvalue2 || !achievement->ID != miscvalue2)
+ continue;
+ }
+
+ SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
+ break;
+ }
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS:
{
uint32 spellCount = 0;
@@ -798,7 +823,6 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM:
case ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS:
case ACHIEVEMENT_CRITERIA_TYPE_HK_RACE:
- case ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE:
case ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE:
case ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS:
case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM:
@@ -927,6 +951,8 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve
case ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT:
case ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT:
return progress->counter >= achievementCriteria->roll_greed_on_loot.count;
+ case ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE:
+ return progress->counter >= achievementCriteria->do_emote.count;
case ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD:
return progress->counter >= achievementCriteria->quest_reward_money.goldInCopper;
case ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY:
@@ -1024,8 +1050,12 @@ void AchievementMgr::SetCriteriaProgress(AchievementCriteriaEntry const* entry,
newValue = changeValue;
break;
case PROGRESS_ACCUMULATE:
- newValue = progress->counter + changeValue;
+ {
+ // avoid overflow
+ uint32 max_value = std::numeric_limits<uint32>::max();
+ newValue = max_value - progress->counter > changeValue ? progress->counter + changeValue : max_value;
break;
+ }
case PROGRESS_HIGHEST:
newValue = progress->counter < changeValue ? changeValue : progress->counter;
break;