Moved battleground achievement scripted checks into scripts
Call ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL updates in code Implemented achievements: Save the Day, Quick Cap, Warsong Expedience --HG-- branch : trunk
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user