aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2011-05-14 12:26:49 +0200
committerShauren <shauren.trinity@gmail.com>2011-05-14 12:26:49 +0200
commit24a8cc24da62e2a5712fbfc2da48ca036cfb0707 (patch)
tree95badc3431b4fb00478b175820baad02785458af /src
parentb71b2896b6dde4a3a2690675b5afab3f54f1a294 (diff)
Core/Achievements: Implemented ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/game/Achievements/AchievementMgr.cpp8
-rwxr-xr-xsrc/server/game/DataStores/DBCStructure.h8
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.cpp175
-rw-r--r--src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp15
-rwxr-xr-xsrc/server/scripts/World/achievement_scripts.cpp24
5 files changed, 141 insertions, 89 deletions
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index b2d7cb79319..fe5467db35f 100755
--- a/src/server/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
@@ -101,6 +101,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria)
case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL:
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST: // only Children's Week achievements
case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM: // only Children's Week achievements
+ case ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS:
break;
default:
sLog->outErrorDb("Table `achievement_criteria_data` has data for non-supported criteria type (Entry: %u Type: %u), ignored.", criteria->ID, criteria->requiredType);
@@ -1479,10 +1480,12 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
}
case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL:
case ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL:
+ case ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS:
{
// skip login update
if (!miscValue1)
continue;
+
// those requirements couldn't be found in the dbc
AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
if (!data || !data->Meets(GetPlayer(), unit))
@@ -1540,7 +1543,6 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
case ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA:
case ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA:
case ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK:
- case ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS:
case ACHIEVEMENT_CRITERIA_TYPE_EARNED_PVP_TITLE:
case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE:
case ACHIEVEMENT_CRITERIA_TYPE_TOTAL:
@@ -1695,6 +1697,8 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve
return progress->counter >= 9000;
case ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS:
return progress->counter >= achievementCriteria->use_lfg.dungeonsComplete;
+ case ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS:
+ return progress->counter >= achievementCriteria->get_killing_blow.killCount;
// handle all statistic-only criteria here
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND:
case ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP:
@@ -2327,6 +2331,8 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData()
continue;
break;
}
+ case ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS:
+ break;
default: // type not use DB data, ignore
continue;
}
diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h
index b5c22a11b24..94edcf467b0 100755
--- a/src/server/game/DataStores/DBCStructure.h
+++ b/src/server/game/DataStores/DBCStructure.h
@@ -371,13 +371,19 @@ struct AchievementCriteriaEntry
} do_emote;
// ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE = 13
// ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE = 55
- // ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS = 56
struct
{
uint32 unused; // 3
uint32 count; // 4
} healing_done;
+ // ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS = 56
+ struct
+ {
+ uint32 unused;
+ uint32 killCount;
+ } get_killing_blow;
+
// ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM = 57
struct
{
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index ba883e20c95..fb912541f7c 100755
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -15127,44 +15127,44 @@ bool Unit::HandleAuraRaidProcFromCharge(AuraEffect* triggeredByAura)
return true;
}
-void Unit::Kill(Unit *pVictim, bool durabilityLoss)
+void Unit::Kill(Unit* victim, bool durabilityLoss)
{
// Prevent killing unit twice (and giving reward from kill twice)
- if (!pVictim->GetHealth())
+ if (!victim->GetHealth())
return;
// Inform pets (if any) when player kills target)
- if (this->ToPlayer())
+ if (Player* plr = this->ToPlayer())
{
- Pet *pPet = this->ToPlayer()->GetPet();
- if (pPet && pPet->isAlive() && pPet->isControlled())
- pPet->AI()->KilledUnit(pVictim);
+ Pet* pet = plr->GetPet();
+ if (pet && pet->isAlive() && pet->isControlled())
+ pet->AI()->KilledUnit(victim);
}
// find player: owner of controlled `this` or `this` itself maybe
- Player *player = GetCharmerOrOwnerPlayerOrPlayerItself();
- Creature *creature = pVictim->ToCreature();
+ Player* player = GetCharmerOrOwnerPlayerOrPlayerItself();
+ Creature* creature = victim->ToCreature();
- bool bRewardIsAllowed = true;
+ bool isRewardAllowed = true;
if (creature)
{
- bRewardIsAllowed = creature->IsDamageEnoughForLootingAndReward();
- if (!bRewardIsAllowed)
+ isRewardAllowed = creature->IsDamageEnoughForLootingAndReward();
+ if (!isRewardAllowed)
creature->SetLootRecipient(NULL);
}
- if (bRewardIsAllowed && creature && creature->GetLootRecipient())
+ if (isRewardAllowed && creature && creature->GetLootRecipient())
player = creature->GetLootRecipient();
// Reward player, his pets, and group/raid members
// call kill spell proc event (before real die and combat stop to triggering auras removed at death/combat stop)
- if (bRewardIsAllowed && player && player != pVictim)
+ if (isRewardAllowed && player && player != victim)
{
WorldPacket data(SMSG_PARTYKILLLOG, (8+8)); //send event PARTY_KILL
data << uint64(player->GetGUID()); //player with killing blow
- data << uint64(pVictim->GetGUID()); //victim
+ data << uint64(victim->GetGUID()); //victim
- Player* pLooter = player;
+ Player* looter = player;
if (Group *group = player->GetGroup())
{
@@ -15175,11 +15175,11 @@ void Unit::Kill(Unit *pVictim, bool durabilityLoss)
group->UpdateLooterGuid(creature, true);
if (group->GetLooterGuid())
{
- pLooter = sObjectMgr->GetPlayer(group->GetLooterGuid());
- if (pLooter)
+ looter = sObjectMgr->GetPlayer(group->GetLooterGuid());
+ if (looter)
{
- creature->SetLootRecipient(pLooter); // update creature loot recipient to the allowed looter.
- group->SendLooter(creature, pLooter);
+ creature->SetLootRecipient(looter); // update creature loot recipient to the allowed looter.
+ group->SendLooter(creature, looter);
}
else
group->SendLooter(creature, NULL);
@@ -15196,7 +15196,7 @@ void Unit::Kill(Unit *pVictim, bool durabilityLoss)
if (creature)
{
- WorldPacket data2(SMSG_LOOT_LIST, (8+1+1));
+ WorldPacket data2(SMSG_LOOT_LIST, 8 + 1 + 1);
data2 << uint64(creature->GetGUID());
data2 << uint8(0); // unk1
data2 << uint8(0); // no group looter
@@ -15212,85 +15212,90 @@ void Unit::Kill(Unit *pVictim, bool durabilityLoss)
loot->clear();
if (uint32 lootid = creature->GetCreatureInfo()->lootid)
- loot->FillLoot(lootid, LootTemplates_Creature, pLooter, false, false, creature->GetLootMode());
+ loot->FillLoot(lootid, LootTemplates_Creature, looter, false, false, creature->GetLootMode());
loot->generateMoneyLoot(creature->GetCreatureInfo()->mingold, creature->GetCreatureInfo()->maxgold);
}
- player->RewardPlayerAndGroupAtKill(pVictim, false);
+ player->RewardPlayerAndGroupAtKill(victim, false);
}
// Do KILL and KILLED procs. KILL proc is called only for the unit who landed the killing blow (and its owner - for pets and totems) regardless of who tapped the victim
if (isPet() || isTotem())
- if (Unit *owner = GetOwner())
- owner->ProcDamageAndSpell(pVictim, PROC_FLAG_KILL, PROC_FLAG_NONE, PROC_EX_NONE, 0);
+ if (Unit* owner = GetOwner())
+ owner->ProcDamageAndSpell(victim, PROC_FLAG_KILL, PROC_FLAG_NONE, PROC_EX_NONE, 0);
- if (pVictim->GetCreatureType() != CREATURE_TYPE_CRITTER)
- ProcDamageAndSpell(pVictim, PROC_FLAG_KILL, PROC_FLAG_KILLED, PROC_EX_NONE, 0);
+ if (victim->GetCreatureType() != CREATURE_TYPE_CRITTER)
+ ProcDamageAndSpell(victim, PROC_FLAG_KILL, PROC_FLAG_KILLED, PROC_EX_NONE, 0);
// Proc auras on death - must be before aura/combat remove
- pVictim->ProcDamageAndSpell(NULL, PROC_FLAG_DEATH, PROC_FLAG_NONE, PROC_EX_NONE, 0, BASE_ATTACK, 0);
+ victim->ProcDamageAndSpell(NULL, PROC_FLAG_DEATH, PROC_FLAG_NONE, PROC_EX_NONE, 0, BASE_ATTACK, 0);
+
+ // update get killing blow achievements, must be done before setDeathState to be able to require auras on target
+ // and before Spirit of Redemption as it also removes auras
+ if (player)
+ player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, 1, 0, victim);
// if talent known but not triggered (check priest class for speedup check)
- bool SpiritOfRedemption = false;
- if (pVictim->GetTypeId() == TYPEID_PLAYER && pVictim->getClass() == CLASS_PRIEST)
+ bool spiritOfRedemption = false;
+ if (victim->GetTypeId() == TYPEID_PLAYER && victim->getClass() == CLASS_PRIEST)
{
- AuraEffectList const& vDummyAuras = pVictim->GetAuraEffectsByType(SPELL_AURA_DUMMY);
- for (AuraEffectList::const_iterator itr = vDummyAuras.begin(); itr != vDummyAuras.end(); ++itr)
+ AuraEffectList const& dummyAuras = victim->GetAuraEffectsByType(SPELL_AURA_DUMMY);
+ for (AuraEffectList::const_iterator itr = dummyAuras.begin(); itr != dummyAuras.end(); ++itr)
{
if ((*itr)->GetSpellProto()->SpellIconID == 1654)
{
- AuraEffect * aurEff = *itr;
+ AuraEffect const* aurEff = *itr;
// save value before aura remove
- uint32 ressSpellId = pVictim->GetUInt32Value(PLAYER_SELF_RES_SPELL);
+ uint32 ressSpellId = victim->GetUInt32Value(PLAYER_SELF_RES_SPELL);
if (!ressSpellId)
- ressSpellId = pVictim->ToPlayer()->GetResurrectionSpellId();
+ ressSpellId = victim->ToPlayer()->GetResurrectionSpellId();
//Remove all expected to remove at death auras (most important negative case like DoT or periodic triggers)
- pVictim->RemoveAllAurasOnDeath();
+ victim->RemoveAllAurasOnDeath();
// restore for use at real death
- pVictim->SetUInt32Value(PLAYER_SELF_RES_SPELL, ressSpellId);
+ victim->SetUInt32Value(PLAYER_SELF_RES_SPELL, ressSpellId);
// FORM_SPIRITOFREDEMPTION and related auras
- pVictim->CastSpell(pVictim, 27827, true, NULL, aurEff);
- SpiritOfRedemption = true;
+ victim->CastSpell(victim, 27827, true, NULL, aurEff);
+ spiritOfRedemption = true;
break;
}
}
}
- if (!SpiritOfRedemption)
+ if (!spiritOfRedemption)
{
sLog->outStaticDebug("SET JUST_DIED");
- pVictim->setDeathState(JUST_DIED);
+ victim->setDeathState(JUST_DIED);
}
// 10% durability loss on death
// clean InHateListOf
- if (pVictim->GetTypeId() == TYPEID_PLAYER)
+ if (Player* plrVictim = victim->ToPlayer())
{
// remember victim PvP death for corpse type and corpse reclaim delay
// at original death (not at SpiritOfRedemtionTalent timeout)
- pVictim->ToPlayer()->SetPvPDeath(player != NULL);
+ plrVictim->SetPvPDeath(player != NULL);
// only if not player and not controlled by player pet. And not at BG
- if ((durabilityLoss && !player && !pVictim->ToPlayer()->InBattleground()) || (player && sWorld->getBoolConfig(CONFIG_DURABILITY_LOSS_IN_PVP)))
+ if ((durabilityLoss && !player && !victim->ToPlayer()->InBattleground()) || (player && sWorld->getBoolConfig(CONFIG_DURABILITY_LOSS_IN_PVP)))
{
sLog->outStaticDebug("We are dead, losing %f percent durability", sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH));
- pVictim->ToPlayer()->DurabilityLossAll(sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH), false);
+ plrVictim->DurabilityLossAll(sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH), false);
// durability lost message
WorldPacket data(SMSG_DURABILITY_DAMAGE_DEATH, 0);
- pVictim->ToPlayer()->GetSession()->SendPacket(&data);
+ plrVictim->GetSession()->SendPacket(&data);
}
// Call KilledUnit for creatures
- if (GetTypeId() == TYPEID_UNIT && this->ToCreature()->IsAIEnabled)
- this->ToCreature()->AI()->KilledUnit(pVictim);
+ if (GetTypeId() == TYPEID_UNIT && IsAIEnabled)
+ this->ToCreature()->AI()->KilledUnit(victim);
// last damage from non duel opponent or opponent controlled creature
- if (pVictim->ToPlayer()->duel)
+ if (plrVictim->duel)
{
- pVictim->ToPlayer()->duel->opponent->CombatStopWithPets(true);
- pVictim->ToPlayer()->CombatStopWithPets(true);
- pVictim->ToPlayer()->DuelComplete(DUEL_INTERRUPTED);
+ plrVictim->duel->opponent->CombatStopWithPets(true);
+ plrVictim->CombatStopWithPets(true);
+ plrVictim->DuelComplete(DUEL_INTERRUPTED);
}
}
else // creature died
@@ -15306,35 +15311,31 @@ void Unit::Kill(Unit *pVictim, bool durabilityLoss)
}
// Call KilledUnit for creatures, this needs to be called after the lootable flag is set
- if (GetTypeId() == TYPEID_UNIT && this->ToCreature()->IsAIEnabled)
- this->ToCreature()->AI()->KilledUnit(pVictim);
+ if (GetTypeId() == TYPEID_UNIT && IsAIEnabled)
+ this->ToCreature()->AI()->KilledUnit(victim);
// Call creature just died function
if (creature->IsAIEnabled)
creature->AI()->JustDied(this);
- if (creature->ToTempSummon())
- {
- if (Unit* pSummoner = creature->ToTempSummon()->GetSummoner())
- {
- if (pSummoner->ToCreature() && pSummoner->ToCreature()->IsAIEnabled)
- pSummoner->ToCreature()->AI()->SummonedCreatureDies(creature, this);
- }
- }
+ if (TempSummon* summon = creature->ToTempSummon())
+ if (Unit* summoner = summon->GetSummoner())
+ if (summoner->ToCreature() && summoner->IsAIEnabled)
+ summoner->ToCreature()->AI()->SummonedCreatureDies(creature, this);
// Dungeon specific stuff, only applies to players killing creatures
if (creature->GetInstanceId())
{
- Map *m = creature->GetMap();
- Player *creditedPlayer = GetCharmerOrOwnerPlayerOrPlayerItself();
+ Map* instanceMap = creature->GetMap();
+ Player* creditedPlayer = GetCharmerOrOwnerPlayerOrPlayerItself();
// TODO: do instance binding anyway if the charmer/owner is offline
- if (m->IsDungeon() && creditedPlayer)
+ if (instanceMap->IsDungeon() && creditedPlayer)
{
- if (m->IsRaidOrHeroicDungeon())
+ if (instanceMap->IsRaidOrHeroicDungeon())
{
if (creature->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_INSTANCE_BIND)
- ((InstanceMap *)m)->PermBindAllPlayers(creditedPlayer);
+ ((InstanceMap*)instanceMap)->PermBindAllPlayers(creditedPlayer);
}
else
{
@@ -15350,9 +15351,9 @@ void Unit::Kill(Unit *pVictim, bool durabilityLoss)
// outdoor pvp things, do these after setting the death state, else the player activity notify won't work... doh...
// handle player kill only if not suicide (spirit of redemption for example)
- if (player && this != pVictim)
+ if (player && this != victim)
if (OutdoorPvP * pvp = player->GetOutdoorPvP())
- pvp->HandleKill(player, pVictim);
+ pvp->HandleKill(player, victim);
//if (pVictim->GetTypeId() == TYPEID_PLAYER)
// if (OutdoorPvP * pvp = pVictim->ToPlayer()->GetOutdoorPvP())
@@ -15361,52 +15362,52 @@ void Unit::Kill(Unit *pVictim, bool durabilityLoss)
// battleground things (do this at the end, so the death state flag will be properly set to handle in the bg->handlekill)
if (player && player->InBattleground())
{
- if (Battleground *bg = player->GetBattleground())
+ if (Battleground* bg = player->GetBattleground())
{
- if (pVictim->GetTypeId() == TYPEID_PLAYER)
- bg->HandleKillPlayer((Player*)pVictim, player);
+ if (victim->GetTypeId() == TYPEID_PLAYER)
+ bg->HandleKillPlayer((Player*)victim, player);
else
- bg->HandleKillUnit(pVictim->ToCreature(), player);
+ bg->HandleKillUnit(victim->ToCreature(), player);
}
}
// achievement stuff
- if (pVictim->GetTypeId() == TYPEID_PLAYER)
+ if (victim->GetTypeId() == TYPEID_PLAYER)
{
if (GetTypeId() == TYPEID_UNIT)
- pVictim->ToPlayer()->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE, GetEntry());
- else if (GetTypeId() == TYPEID_PLAYER && pVictim != this)
- pVictim->ToPlayer()->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER, 1, this->ToPlayer()->GetTeam());
+ victim->ToPlayer()->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE, GetEntry());
+ else if (GetTypeId() == TYPEID_PLAYER && victim != this)
+ victim->ToPlayer()->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER, 1, this->ToPlayer()->GetTeam());
}
//Hook for OnPVPKill Event
- if (this->GetTypeId() == TYPEID_PLAYER)
+ if (GetTypeId() == TYPEID_PLAYER)
{
- if (pVictim->GetTypeId() == TYPEID_PLAYER)
+ if (victim->GetTypeId() == TYPEID_PLAYER)
{
- Player *killer = this->ToPlayer();
- Player *killed = pVictim->ToPlayer();
+ Player* killer = this->ToPlayer();
+ Player* killed = victim->ToPlayer();
sScriptMgr->OnPVPKill(killer, killed);
}
- else if (pVictim->GetTypeId() == TYPEID_UNIT)
+ else if (victim->GetTypeId() == TYPEID_UNIT)
{
Player *killer = this->ToPlayer();
- Creature *killed = pVictim->ToCreature();
+ Creature *killed = victim->ToCreature();
sScriptMgr->OnCreatureKill(killer, killed);
}
}
- else if (this->GetTypeId() == TYPEID_UNIT)
+ else if (GetTypeId() == TYPEID_UNIT)
{
- if (pVictim->GetTypeId() == TYPEID_PLAYER)
+ if (victim->GetTypeId() == TYPEID_PLAYER)
{
Creature *killer = this->ToCreature();
- Player *killed = pVictim->ToPlayer();
+ Player *killed = victim->ToPlayer();
sScriptMgr->OnPlayerKilledByCreature(killer, killed);
}
}
- if (pVictim->GetVehicle())
- pVictim->ExitVehicle();
+ if (victim->GetVehicle())
+ victim->ExitVehicle();
}
void Unit::SetControlled(bool apply, UnitState state)
diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
index 30253c78260..0d25ddb7086 100644
--- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
+++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp
@@ -1112,6 +1112,20 @@ public:
};
};
+class achievement_denyin_the_scion : public AchievementCriteriaScript
+{
+ public:
+ achievement_denyin_the_scion() : AchievementCriteriaScript("achievement_denyin_the_scion") { }
+
+ bool OnCheck(Player* source, Unit* /*target*/)
+ {
+ if (Unit* disk = source->GetVehicleBase())
+ if (disk->GetEntry() == NPC_HOVER_DISK_CASTER || disk->GetEntry() == NPC_HOVER_DISK_MELEE)
+ return true;
+ return false;
+ }
+};
+
void AddSC_boss_malygos()
{
new boss_malygos();
@@ -1123,4 +1137,5 @@ void AddSC_boss_malygos()
new spell_malygos_vortex_dummy();
new spell_malygos_vortex_visual();
new npc_alexstrasza_eoe();
+ new achievement_denyin_the_scion();
}
diff --git a/src/server/scripts/World/achievement_scripts.cpp b/src/server/scripts/World/achievement_scripts.cpp
index ed4f404d9be..f26b34e6308 100755
--- a/src/server/scripts/World/achievement_scripts.cpp
+++ b/src/server/scripts/World/achievement_scripts.cpp
@@ -167,6 +167,27 @@ class achievement_bg_sa_artillery : public AchievementCriteriaScript
}
};
+class achievement_arena_kills : public AchievementCriteriaScript
+{
+ public:
+ achievement_arena_kills(char const* name, uint8 arenaType) : AchievementCriteriaScript(name),
+ _arenaType(arenaType)
+ {
+ }
+
+ bool OnCheck(Player* source, Unit* /*target*/)
+ {
+ // this checks GetBattleground() for NULL already
+ if (!source->InArena())
+ return false;
+
+ return source->GetBattleground()->GetArenaType() == _arenaType;
+ }
+
+ private:
+ uint8 const _arenaType;
+};
+
void AddSC_achievement_scripts()
{
new achievement_storm_glory();
@@ -177,4 +198,7 @@ void AddSC_achievement_scripts()
new achievement_bg_ic_glaive_grave();
new achievement_bg_ic_mowed_down();
new achievement_bg_sa_artillery();
+ new achievement_arena_kills("achievement_arena_2v2_kills", ARENA_TYPE_2v2);
+ new achievement_arena_kills("achievement_arena_3v3_kills", ARENA_TYPE_3v3);
+ new achievement_arena_kills("achievement_arena_5v5_kills", ARENA_TYPE_5v5);
}