diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Achievements/AchievementMgr.cpp | 100 | ||||
-rw-r--r-- | src/server/game/Achievements/AchievementMgr.h | 1 | ||||
-rw-r--r-- | src/server/game/Battlegrounds/Battleground.cpp | 7 | ||||
-rw-r--r-- | src/server/game/Battlegrounds/Battleground.h | 1 | ||||
-rw-r--r-- | src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Battlegrounds/Zones/BattlegroundWS.h | 4 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 5 | ||||
-rw-r--r-- | src/server/scripts/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/server/scripts/World/achievement_scripts.cpp | 71 |
9 files changed, 143 insertions, 52 deletions
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index b4e6d87703d..dbdb9bc187c 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -432,7 +432,7 @@ void AchievementMgr::ResetAchievementCriteria(AchievementCriteriaTypes type, uin (!achievementCriteria->additionalRequrements[j].additionalRequirement_value || achievementCriteria->additionalRequrements[j].additionalRequirement_value == miscvalue2)) { - SetCriteriaProgress(achievementCriteria, 0, PROGRESS_SET); + RemoveCriteriaProgress(achievementCriteria); break; } } @@ -786,42 +786,10 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui if (achievementCriteria->win_bg.bgMapID != GetPlayer()->GetMapId()) continue; - if (achievementCriteria->additionalRequrements[0].additionalRequirement_type) - { - // those requirements couldn't be found in the dbc - AchievementCriteriaDataSet const* data = sAchievementMgr.GetCriteriaDataSet(achievementCriteria); - if (!data || !data->Meets(GetPlayer(),unit)) - continue; - } - // some hardcoded requirements - else - { - Battleground* bg = GetPlayer()->GetBattleground(); - if (!bg) - continue; - - switch(achievementCriteria->referredAchievement) - { - case 161: // AB, Overcome a 500 resource disadvantage - { - if (bg->GetTypeID(true) != BATTLEGROUND_AB) - continue; - if (!((BattlegroundAB*)bg)->IsTeamScores500Disadvantage(GetPlayer()->GetTeam())) - continue; - break; - } - case 156: // AB, win while controlling all 5 flags (all nodes) - case 784: // EY, win while holding 4 bases (all nodes) - { - if (!bg->IsAllNodesConrolledByTeam(GetPlayer()->GetTeam())) - continue; - break; - } - case 1762: // SA, win without losing any siege vehicles - case 2192: // SA, win without losing any siege vehicles - continue; // not implemented - } - } + // those requirements couldn't be found in the dbc + AchievementCriteriaDataSet const* data = sAchievementMgr.GetCriteriaDataSet(achievementCriteria); + if (!data || !data->Meets(GetPlayer(),unit)) + continue; SetCriteriaProgress(achievementCriteria, miscvalue1, PROGRESS_ACCUMULATE); break; @@ -1463,10 +1431,28 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui break; } case ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE: + { if (!miscvalue1 || miscvalue1 != achievementCriteria->bg_objective.objectiveId) continue; + + // those requirements couldn't be found in the dbc + AchievementCriteriaDataSet const* data = sAchievementMgr.GetCriteriaDataSet(achievementCriteria); + if (!data || !data->Meets(GetPlayer(), unit)) + continue; + SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); break; + } + case ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL: + { + // those requirements couldn't be found in the dbc + AchievementCriteriaDataSet const* data = sAchievementMgr.GetCriteriaDataSet(achievementCriteria); + if (!data || !data->Meets(GetPlayer(), unit)) + continue; + + SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); + break; + } // std case: not exist in DBC, not triggered in code as result case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALTH: case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_SPELLPOWER: @@ -1485,7 +1471,6 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui case ACHIEVEMENT_CRITERIA_TYPE_REACH_TEAM_RATING: case ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK: case ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS: - case ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL: case ACHIEVEMENT_CRITERIA_TYPE_EARNED_PVP_TITLE: case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE: case ACHIEVEMENT_CRITERIA_TYPE_TOTAL: @@ -1622,6 +1607,8 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve return progress->counter >= achievementCriteria->loot_money.goldInCopper; case ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT: return progress->counter >= achievementCriteria->use_gameobject.useCount; + case ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL: + return progress->counter >= achievementCriteria->special_pvp_kill.killCount; case ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT: return progress->counter >= achievementCriteria->fish_in_gameobject.lootCount; case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS: @@ -1829,6 +1816,25 @@ void AchievementMgr::SetCriteriaProgress(AchievementCriteriaEntry const* entry, SendCriteriaUpdate(entry, progress, timeElapsed, timedCompleted); } +void AchievementMgr::RemoveCriteriaProgress(const AchievementCriteriaEntry *entry) +{ + CriteriaProgressMap::iterator criteriaProgress = m_criteriaProgress.find(entry->ID); + if (criteriaProgress == m_criteriaProgress.end()) + return; + + CriteriaProgress progress = criteriaProgress->second; + //if (progress.counter) + //{ + // progress.counter = 0; + // SendCriteriaUpdate(entry, &progress, entry->timeLimit, false); + //} + WorldPacket data(SMSG_CRITERIA_DELETED,4); + data << uint32(entry->ID); + m_player->SendDirectMessage(&data); + + m_criteriaProgress.erase(criteriaProgress); +} + void AchievementMgr::UpdateTimedAchievements(uint32 timeDiff) { if (!m_timedAchievements.empty()) @@ -1839,11 +1845,8 @@ void AchievementMgr::UpdateTimedAchievements(uint32 timeDiff) if (itr->second <= timeDiff) { AchievementCriteriaEntry const *entry = sAchievementCriteriaStore.LookupEntry(itr->first); - SetCriteriaProgress(entry, 0, PROGRESS_SET); - CriteriaProgressMap::iterator criteriaProgress = m_criteriaProgress.find(itr->first); + RemoveCriteriaProgress(entry); m_timedAchievements.erase(itr++); - if (criteriaProgress != m_criteriaProgress.end()) - m_criteriaProgress.erase(criteriaProgress); } else { @@ -1890,11 +1893,8 @@ void AchievementMgr::RemoveTimedAchievement(AchievementCriteriaTimedTypes type, if (timedIter == m_timedAchievements.end()) continue; - // SetCriteriaProgress for packet send, then remove progress - SetCriteriaProgress(*i, 0, PROGRESS_SET); - CriteriaProgressMap::iterator criteriaProgress = m_criteriaProgress.find((*i)->ID); - if (criteriaProgress != m_criteriaProgress.end()) - m_criteriaProgress.erase(criteriaProgress); + // remove progress + RemoveCriteriaProgress(*i); // Remove the timer m_timedAchievements.erase(timedIter); @@ -2166,9 +2166,7 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData() switch(criteria->requiredType) { - case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG: - if (!criteria->additionalRequrements[0].additionalRequirement_type) - continue; + case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG: // any cases break; case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE: break; // any cases @@ -2226,6 +2224,8 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData() break; case ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE: break; // any cases + case ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL: + break; // any cases default: // type not use DB data, ignore continue; } diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h index 3a827796281..4c8b8976673 100644 --- a/src/server/game/Achievements/AchievementMgr.h +++ b/src/server/game/Achievements/AchievementMgr.h @@ -263,6 +263,7 @@ class AchievementMgr void SendCriteriaUpdate(AchievementCriteriaEntry const* entry, CriteriaProgress const* progress, uint32 timeElapsed, bool timedCompleted); CriteriaProgress* GetCriteriaProgress(AchievementCriteriaEntry const* entry); void SetCriteriaProgress(AchievementCriteriaEntry const* entry, uint32 changeValue, ProgressType ptype = PROGRESS_SET); + void RemoveCriteriaProgress(AchievementCriteriaEntry const* entry); void CompletedCriteriaFor(AchievementEntry const* achievement); bool IsCompletedCriteria(AchievementCriteriaEntry const* criteria, AchievementEntry const* achievement); bool IsCompletedAchievement(AchievementEntry const* entry); diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 4e2170695bd..dca7f1c474f 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -1872,6 +1872,13 @@ bool Battleground::IsTeamScoreInRange(uint32 team, uint32 minScore, uint32 maxSc return score >= minScore && score <= maxScore; } +void Battleground::StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry) +{ + for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) + if (Player* pPlayer = sObjectMgr.GetPlayer(itr->first)) + pPlayer->GetAchievementMgr().StartTimedAchievement(type, entry); +} + void Battleground::SetBracket(PvPDifficultyEntry const* bracketEntry) { m_BracketId = bracketEntry->GetBracketId(); diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h index 33e2b17a9ca..1b4a3e5610e 100644 --- a/src/server/game/Battlegrounds/Battleground.h +++ b/src/server/game/Battlegrounds/Battleground.h @@ -346,6 +346,7 @@ class Battleground /* achievement req. */ virtual bool IsAllNodesConrolledByTeam(uint32 /*team*/) const { return false; } bool IsTeamScoreInRange(uint32 team, uint32 minScore, uint32 maxScore) const; + void StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry); /* Battleground */ // Get methods: diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp index a87739c6b78..2fd6fbaf242 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp @@ -201,6 +201,9 @@ void BattlegroundWS::StartingEventOpenDoors() for (uint32 i = BG_WS_OBJECT_A_FLAG; i <= BG_WS_OBJECT_BERSERKBUFF_2; ++i) SpawnBGObject(i, RESPAWN_IMMEDIATELY); + + // players joining later are not egible + StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, WS_EVENT_START_BATTLE); } void BattlegroundWS::AddPlayer(Player *plr) @@ -459,6 +462,7 @@ void BattlegroundWS::EventPlayerClickedOnFlag(Player *Source, GameObject* target UpdateFlagState(HORDE, BG_WS_FLAG_STATE_ON_PLAYER); UpdateWorldState(BG_WS_FLAG_UNK_ALLIANCE, 1); Source->CastSpell(Source, BG_WS_SPELL_SILVERWING_FLAG, true); + Source->GetAchievementMgr().StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_SPELL_TARGET, BG_WS_SPELL_SILVERWING_FLAG_PICKED); if (m_FlagState[1] == BG_WS_FLAG_STATE_ON_PLAYER) m_BothFlagsKept = true; } @@ -477,6 +481,7 @@ void BattlegroundWS::EventPlayerClickedOnFlag(Player *Source, GameObject* target UpdateFlagState(ALLIANCE, BG_WS_FLAG_STATE_ON_PLAYER); UpdateWorldState(BG_WS_FLAG_UNK_HORDE, 1); Source->CastSpell(Source, BG_WS_SPELL_WARSONG_FLAG, true); + Source->GetAchievementMgr().StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_SPELL_TARGET, BG_WS_SPELL_WARSONG_FLAG_PICKED); if (m_FlagState[0] == BG_WS_FLAG_STATE_ON_PLAYER) m_BothFlagsKept = true; } diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.h b/src/server/game/Battlegrounds/Zones/BattlegroundWS.h index 0d70c4f7e66..d5aa6b3d473 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.h @@ -47,8 +47,10 @@ enum BG_WS_SpellId { BG_WS_SPELL_WARSONG_FLAG = 23333, BG_WS_SPELL_WARSONG_FLAG_DROPPED = 23334, + BG_WS_SPELL_WARSONG_FLAG_PICKED = 61266, // fake spell, does not exist but used as timer start event BG_WS_SPELL_SILVERWING_FLAG = 23335, BG_WS_SPELL_SILVERWING_FLAG_DROPPED = 23336, + BG_WS_SPELL_SILVERWING_FLAG_PICKED = 61265, // fake spell, does not exist but used as timer start event BG_WS_SPELL_FOCUSED_ASSAULT = 46392, BG_WS_SPELL_BRUTAL_ASSAULT = 46393 }; @@ -144,6 +146,8 @@ enum BG_WS_Objectives WS_OBJECTIVE_RETURN_FLAG = 44 }; +#define WS_EVENT_START_BATTLE 8563 + class BattlegroundWGScore : public BattlegroundScore { public: diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 9aefb5225f5..28c6240ce40 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -715,7 +715,12 @@ uint32 Unit::DealDamage(Unit *pVictim, uint32 damage, CleanDamage const* cleanDa DEBUG_LOG("DealDamage: victim just died"); if (pVictim->GetTypeId() == TYPEID_PLAYER) + { pVictim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED, health); + // call before auras are removed + if (Player* killer = ToPlayer()) + killer->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL, 0, 0, pVictim); + } Kill(pVictim, durabilityLoss); diff --git a/src/server/scripts/CMakeLists.txt b/src/server/scripts/CMakeLists.txt index a1b22f8d4b4..9a198774d90 100644 --- a/src/server/scripts/CMakeLists.txt +++ b/src/server/scripts/CMakeLists.txt @@ -82,6 +82,7 @@ include_directories( ${CMAKE_SOURCE_DIR}/src/server/game/AI/ScriptedAI ${CMAKE_SOURCE_DIR}/src/server/game/AuctionHouse ${CMAKE_SOURCE_DIR}/src/server/game/Battlegrounds + ${CMAKE_SOURCE_DIR}/src/server/game/Battlegrounds/Zones ${CMAKE_SOURCE_DIR}/src/server/game/Calendar ${CMAKE_SOURCE_DIR}/src/server/game/Chat ${CMAKE_SOURCE_DIR}/src/server/game/Chat/Channels diff --git a/src/server/scripts/World/achievement_scripts.cpp b/src/server/scripts/World/achievement_scripts.cpp index 19a61ccd011..c2c282bf2f8 100644 --- a/src/server/scripts/World/achievement_scripts.cpp +++ b/src/server/scripts/World/achievement_scripts.cpp @@ -17,6 +17,8 @@ */ #include "ScriptPCH.h" +#include "BattlegroundAB.h" +#include "BattlegroundWS.h" class achievement_school_of_hard_knocks : public AchievementCriteriaScript { @@ -53,8 +55,73 @@ class achievement_storm_glory : public AchievementCriteriaScript } }; +class achievement_resilient_victory : public AchievementCriteriaScript +{ + public: + achievement_resilient_victory() : AchievementCriteriaScript("achievement_resilient_victory") { } + + bool OnCheck(Player* source, Unit* /*target*/) + { + Battleground* bg = source->GetBattleground(); + if (!bg) + return false; + + if (bg->GetTypeID(true) != BATTLEGROUND_AB) + return false; + + if (!static_cast<BattlegroundAB*>(bg)->IsTeamScores500Disadvantage(source->GetTeam())) + return false; + + return true; + } +}; + +class achievement_bg_control_all_nodes : public AchievementCriteriaScript +{ + public: + achievement_bg_control_all_nodes() : AchievementCriteriaScript("achievement_bg_control_all_nodes") { } + + bool OnCheck(Player* source, Unit* /*target*/) + { + Battleground* bg = source->GetBattleground(); + if (!bg) + return false; + + if (!bg->IsAllNodesConrolledByTeam(source->GetTeam())) + return false; + + return true; + } +}; + +class achievement_save_the_day : public AchievementCriteriaScript +{ + public: + achievement_save_the_day() : AchievementCriteriaScript("achievement_save_the_day") { } + + bool OnCheck(Player* source, Unit* target) + { + if (!target) + return false; + + if (Player const* pTarget = target->ToPlayer()) + { + if (source->GetBattlegroundTypeId() != BATTLEGROUND_WS || !source->GetBattleground()) + return false; + + BattlegroundWS* pWSG = static_cast<BattlegroundWS*>(source->GetBattleground()); + if (pWSG->GetFlagState(pTarget->GetTeam()) == BG_WS_FLAG_STATE_ON_BASE) + return true; + } + return false; + } +}; + void AddSC_achievement_scripts() { - new achievement_school_of_hard_knocks; - new achievement_storm_glory; + new achievement_school_of_hard_knocks(); + new achievement_storm_glory(); + new achievement_resilient_victory(); + new achievement_bg_control_all_nodes(); + new achievement_save_the_day(); } |