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:
Shauren
2010-08-13 13:48:59 +02:00
parent 9bd2619425
commit 30468a106f
11 changed files with 175 additions and 54 deletions
+50 -50
View File
@@ -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:
+5
View File
@@ -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);
+1
View File
@@ -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();
}