aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp100
-rw-r--r--src/server/game/Achievements/AchievementMgr.h1
-rw-r--r--src/server/game/Battlegrounds/Battleground.cpp7
-rw-r--r--src/server/game/Battlegrounds/Battleground.h1
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp5
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundWS.h4
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp5
-rw-r--r--src/server/scripts/CMakeLists.txt1
-rw-r--r--src/server/scripts/World/achievement_scripts.cpp71
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();
}