From 9136354e7f529295118de751fa44bd61bef0c746 Mon Sep 17 00:00:00 2001 From: Trazom Date: Thu, 23 Apr 2009 21:48:55 +0400 Subject: [PATCH] [7702] Implement some damage/healing achievement statistics. * ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT * ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED * ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED * ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CASTED * ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED * ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED Signed-off-by: VladimirMangos --- src/game/AchievementMgr.cpp | 12 +++++------ src/game/Unit.cpp | 43 +++++++++++++++++++++++++++++++------ src/shared/revision_nr.h | 2 +- 3 files changed, 44 insertions(+), 13 deletions(-) diff --git a/src/game/AchievementMgr.cpp b/src/game/AchievementMgr.cpp index bf56c26cb..cd478a25b 100644 --- a/src/game/AchievementMgr.cpp +++ b/src/game/AchievementMgr.cpp @@ -538,6 +538,8 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_AT_BARBER: case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_MAIL: case ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY: + case ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED: + case ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED: // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case if(!miscvalue1) continue; @@ -546,6 +548,10 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui // std case: high value at miscvalue1 case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_BID: case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_SOLD: /* FIXME: for online player only currently */ + case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT: + case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED: + case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CASTED: + case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED: // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case if(!miscvalue1) continue; @@ -1077,12 +1083,6 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui case ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM: case ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED: case ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED: - case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT: - case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED: - case ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED: - case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CASTED: - case ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED: - case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED: case ACHIEVEMENT_CRITERIA_TYPE_QUEST_ABANDONED: case ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN: case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE: diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 3f4b31e0d..11362fed0 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -496,17 +496,26 @@ uint32 Unit::DealDamage(Unit *pVictim, uint32 damage, CleanDamage const* cleanDa } } - if(pVictim->GetTypeId() == TYPEID_PLAYER && GetTypeId() == TYPEID_PLAYER) + if (GetTypeId() == TYPEID_PLAYER && this != pVictim) { - if(((Player*)pVictim)->InBattleGround()) + Player *killer = ((Player*)this); + + // in bg, count dmg if victim is also a player + if (pVictim->GetTypeId()==TYPEID_PLAYER) { - Player *killer = ((Player*)this); - if(killer != ((Player*)pVictim)) - if(BattleGround *bg = killer->GetBattleGround()) - bg->UpdatePlayerScore(killer, SCORE_DAMAGE_DONE, damage); + if (BattleGround *bg = killer->GetBattleGround()) + { + // FIXME: kept by compatibility. don't know in BG if the restriction apply. + bg->UpdatePlayerScore(killer, SCORE_DAMAGE_DONE, damage); + } } + + killer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT, damage); } + if (pVictim->GetTypeId() == TYPEID_PLAYER) + ((Player*)pVictim)->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED, damage); + if (pVictim->GetTypeId() == TYPEID_UNIT && !((Creature*)pVictim)->isPet() && !((Creature*)pVictim)->hasLootRecipient()) ((Creature*)pVictim)->SetLootRecipient(this); @@ -514,6 +523,10 @@ uint32 Unit::DealDamage(Unit *pVictim, uint32 damage, CleanDamage const* cleanDa { DEBUG_LOG("DealDamage: victim just died"); + if (pVictim->GetTypeId() == TYPEID_PLAYER) + ((Player*)pVictim)->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED, health); + + // find player: owner of controlled `this` or `this` itself maybe Player *player = GetCharmerOrOwnerPlayerOrPlayerItself(); @@ -679,6 +692,9 @@ uint32 Unit::DealDamage(Unit *pVictim, uint32 damage, CleanDamage const* cleanDa { DEBUG_LOG("DealDamageAlive"); + if (pVictim->GetTypeId() == TYPEID_PLAYER) + ((Player*)pVictim)->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED, damage); + pVictim->ModifyHealth(- (int32)damage); if(damagetype != DOT) @@ -7433,6 +7449,21 @@ int32 Unit::DealHeal(Unit *pVictim, uint32 addhealth, SpellEntry const *spellPro if (BattleGround *bg = ((Player*)this)->GetBattleGround()) bg->UpdatePlayerScore((Player*)this, SCORE_HEALING_DONE, gain); + + // healing done is count ONLY if the target is a player. + if (pVictim->GetTypeId()==TYPEID_PLAYER) + { + // use the actual gain, as the overheal shall not be counted. + ((Player*)this)->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE, gain); + } + + ((Player*)this)->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CASTED, addhealth); + } + + if (pVictim->GetTypeId()==TYPEID_PLAYER) + { + ((Player*)pVictim)->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED, gain); + ((Player*)pVictim)->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED, addhealth); } return gain; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index b08488d22..2767b64ae 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7701" + #define REVISION_NR "7702" #endif // __REVISION_NR_H__