Implement some death related achievements

* ACHIEVEMENT_CRITERIA_TYPE_DEATH (normal and arena types counting)
* ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON (instance types by man limit counting)
  Note: need fixed for cases when max allowed players different from recommended count.
* ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM (environment damage sources by types)

Fixed:
* ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER
   - self-kill counting as death from players
   - same team player kill in opposition kills counter.

Also cleanup in Player::EnvironmentalDamage use DBCStructure.h comment.
This commit is contained in:
VladimirMangos 2009-03-06 01:10:54 +03:00
parent bfa785fdb8
commit c18d20782b
4 changed files with 195 additions and 76 deletions

View file

@ -27,6 +27,7 @@
#include "GameEvent.h" #include "GameEvent.h"
#include "World.h" #include "World.h"
#include "SpellMgr.h" #include "SpellMgr.h"
#include "ArenaTeam.h"
#include "ProgressBar.h" #include "ProgressBar.h"
#include "GridNotifiersImpl.h" #include "GridNotifiersImpl.h"
#include "CellImpl.h" #include "CellImpl.h"
@ -374,6 +375,18 @@ void AchievementMgr::CheckAllAchievementCriteria()
UpdateAchievementCriteria(AchievementCriteriaTypes(i)); UpdateAchievementCriteria(AchievementCriteriaTypes(i));
} }
static const uint32 achievIdByArenaSlot[MAX_ARENA_SLOT] = { 1057, 1107, 1108 };
static const uint32 achievIdForDangeon[][4] =
{
// ach_cr_id,is_dungeon,is_raid,is_heroic_dungeon
{ 321, true, true, true },
{ 916, false, true, false },
{ 917, false, true, false },
{ 918, true, false, false },
{ 2219, false, false, true },
{ 0, false, false, false }
};
/** /**
* this function will be called whenever the user might have done a criteria relevant action * this function will be called whenever the user might have done a criteria relevant action
*/ */
@ -408,7 +421,6 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
{ {
// std. case: increment at 1 // std. case: increment at 1
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST: case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST:
case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER:
// AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
if(!miscvalue1) if(!miscvalue1)
continue; continue;
@ -493,6 +505,79 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
continue; continue;
SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
break; break;
case ACHIEVEMENT_CRITERIA_TYPE_DEATH:
{
// AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
if(!miscvalue1)
continue;
// skip wrong arena achievements, if not achievIdByArenaSlot then normal totla death counter
bool notfit = false;
for(int i = 0; i < MAX_ARENA_SLOT; ++i)
{
if(achievIdByArenaSlot[i] == achievement->ID)
{
BattleGround* bg = GetPlayer()->GetBattleGround();
if(!bg || ArenaTeam::GetSlotByType(bg->GetArenaType())!=i)
notfit = true;
break;
}
}
if(notfit)
continue;
SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
break;
}
case ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON:
{
// AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
if(!miscvalue1)
continue;
Map const* map = GetPlayer()->GetMap();
if(!map->IsDungeon())
continue;
// search case
bool found = false;
for(int i = 0; achievIdForDangeon[i][0]; ++i)
{
if(achievIdForDangeon[i][0] == achievement->ID)
{
if(map->IsRaid())
{
// if raid accepted (ignore difficulty)
if(!achievIdForDangeon[i][2])
break; // for
}
else if(GetPlayer()->GetDifficulty()==DIFFICULTY_NORMAL)
{
// dungeon in normal mode accepted
if(!achievIdForDangeon[i][1])
break; // for
}
else
{
// dungeon in heroic mode accepted
if(!achievIdForDangeon[i][3])
break; // for
}
found = true;
break; // for
}
}
if(!found)
continue;
//FIXME: work only for instances where max==min for players
if(((InstanceMap*)map)->GetMaxPlayers() != achievementCriteria->death_in_dungeon.manLimit)
continue;
SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
break;
}
case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE: case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE:
// AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
if(!miscvalue1) if(!miscvalue1)
@ -501,6 +586,17 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
continue; continue;
SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE); SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
break; break;
case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER:
// AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
if(!miscvalue1)
continue;
// if team check required: must kill by opposition faction
if(achievement->ID==318 && miscvalue2==GetPlayer()->GetTeam())
continue;
SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
break;
case ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING: case ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING:
{ {
// AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
@ -518,6 +614,14 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
SetCriteriaProgress(achievementCriteria, miscvalue1); SetCriteriaProgress(achievementCriteria, miscvalue1);
break; break;
} }
case ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM:
// AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
if(!miscvalue1)
continue;
if(miscvalue2 != achievementCriteria->death_from.type)
continue;
SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
break;
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST: case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST:
if(GetPlayer()->GetQuestRewardStatus(achievementCriteria->complete_quest.questID)) if(GetPlayer()->GetQuestRewardStatus(achievementCriteria->complete_quest.questID))
SetCriteriaProgress(achievementCriteria, 1); SetCriteriaProgress(achievementCriteria, 1);
@ -680,10 +784,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG: case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG:
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY: case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY:
case ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE: case ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE:
case ACHIEVEMENT_CRITERIA_TYPE_DEATH:
case ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON:
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID: case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID:
case ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM:
case ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE: case ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE:
case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA: case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA:
case ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA: case ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA:
@ -836,8 +937,11 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve
// handle all statistic-only criteria here // handle all statistic-only criteria here
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND: case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND:
case ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP: case ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP:
case ACHIEVEMENT_CRITERIA_TYPE_DEATH:
case ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON:
case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE: case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE:
case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER: case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER:
case ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM:
case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS: case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS:
case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_AT_BARBER: case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_AT_BARBER:
case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_MAIL: case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_MAIL:

View file

@ -839,6 +839,9 @@ void Player::StopMirrorTimer(MirrorTimerType Type)
void Player::EnvironmentalDamage(uint64 guid, EnviromentalDamage type, uint32 damage) void Player::EnvironmentalDamage(uint64 guid, EnviromentalDamage type, uint32 damage)
{ {
if(!isAlive() || isGameMaster())
return;
WorldPacket data(SMSG_ENVIRONMENTALDAMAGELOG, (21)); WorldPacket data(SMSG_ENVIRONMENTALDAMAGELOG, (21));
data << (uint64)guid; data << (uint64)guid;
data << (uint8)(type!=DAMAGE_FALL_TO_VOID ? type : DAMAGE_FALL); data << (uint8)(type!=DAMAGE_FALL_TO_VOID ? type : DAMAGE_FALL);
@ -849,13 +852,18 @@ void Player::EnvironmentalDamage(uint64 guid, EnviromentalDamage type, uint32 da
DealDamage(this, damage, NULL, SELF_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); DealDamage(this, damage, NULL, SELF_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
if(type==DAMAGE_FALL && !isAlive()) // DealDamage not apply item durability loss at self damage if(!isAlive())
{ {
DEBUG_LOG("We are fall to death, loosing 10 percents durability"); if(type==DAMAGE_FALL) // DealDamage not apply item durability loss at self damage
DurabilityLossAll(0.10f,false); {
// durability lost message DEBUG_LOG("We are fall to death, loosing 10 percents durability");
WorldPacket data(SMSG_DURABILITY_DAMAGE_DEATH, 0); DurabilityLossAll(0.10f,false);
GetSession()->SendPacket(&data); // durability lost message
WorldPacket data(SMSG_DURABILITY_DAMAGE_DEATH, 0);
GetSession()->SendPacket(&data);
}
GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM, 1, type);
} }
} }
@ -939,9 +947,7 @@ void Player::HandleLava()
uint64 guid = GetGUID(); uint64 guid = GetGUID();
uint32 damage = urand(600, 700); // TODO: Get more detailed information about lava damage uint32 damage = urand(600, 700); // TODO: Get more detailed information about lava damage
// if not gamemaster then deal damage EnvironmentalDamage(guid, DAMAGE_LAVA, damage);
if ( !isGameMaster() )
EnvironmentalDamage(guid, DAMAGE_LAVA, damage);
m_breathTimer = 1*IN_MILISECONDS; m_breathTimer = 1*IN_MILISECONDS;
} }
@ -1326,6 +1332,8 @@ void Player::setDeathState(DeathState s)
if(!ressSpellId) if(!ressSpellId)
ressSpellId = GetResurrectionSpellId(); ressSpellId = GetResurrectionSpellId();
GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP, 1); GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP, 1);
GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DEATH, 1);
GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON, 1);
} }
Unit::setDeathState(s); Unit::setDeathState(s);

View file

@ -528,6 +528,7 @@ uint32 Unit::DealDamage(Unit *pVictim, uint32 damage, CleanDamage const* cleanDa
if (pVictim->GetTypeId() == TYPEID_UNIT && !((Creature*)pVictim)->isPet() && !((Creature*)pVictim)->hasLootRecipient()) if (pVictim->GetTypeId() == TYPEID_UNIT && !((Creature*)pVictim)->isPet() && !((Creature*)pVictim)->hasLootRecipient())
((Creature*)pVictim)->SetLootRecipient(this); ((Creature*)pVictim)->SetLootRecipient(this);
if (health <= damage) if (health <= damage)
{ {
DEBUG_LOG("DealDamage: victim just died"); DEBUG_LOG("DealDamage: victim just died");
@ -604,12 +605,12 @@ uint32 Unit::DealDamage(Unit *pVictim, uint32 damage, CleanDamage const* cleanDa
((Creature*)this)->AI()->KilledUnit(pVictim); ((Creature*)this)->AI()->KilledUnit(pVictim);
// achievement stuff // achievement stuff
if ( pVictim->GetTypeId() == TYPEID_PLAYER) if (pVictim->GetTypeId() == TYPEID_PLAYER)
{ {
if(GetTypeId() == TYPEID_UNIT) if (GetTypeId() == TYPEID_UNIT)
((Player*)pVictim)->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE, GetEntry()); ((Player*)pVictim)->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE, GetEntry());
else if(GetTypeId() == TYPEID_PLAYER) else if(GetTypeId() == TYPEID_PLAYER && pVictim != this)
((Player*)pVictim)->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER, 1); ((Player*)pVictim)->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER, 1, ((Player*)this)->GetTeam());
} }
// 10% durability loss on death // 10% durability loss on death

View file

@ -72,7 +72,7 @@ struct AchievementCriteriaEntry
uint32 requiredType; // 2 uint32 requiredType; // 2
union union
{ {
// ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE = 0 // ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE = 0
// TODO: also used for player deaths.. // TODO: also used for player deaths..
struct struct
{ {
@ -80,7 +80,7 @@ struct AchievementCriteriaEntry
uint32 creatureCount; // 4 uint32 creatureCount; // 4
} kill_creature; } kill_creature;
// ACHIEVEMENT_CRITERIA_TYPE_WIN_BG = 1 // ACHIEVEMENT_CRITERIA_TYPE_WIN_BG = 1
// TODO: there are further criterias instead just winning // TODO: there are further criterias instead just winning
struct struct
{ {
@ -88,27 +88,27 @@ struct AchievementCriteriaEntry
uint32 winCount; // 4 uint32 winCount; // 4
} win_bg; } win_bg;
// ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL = 5 // ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL = 5
struct struct
{ {
uint32 unused; // 3 uint32 unused; // 3
uint32 level; // 4 uint32 level; // 4
} reach_level; } reach_level;
// ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL = 7 // ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL = 7
struct struct
{ {
uint32 skillID; // 3 uint32 skillID; // 3
uint32 skillLevel; // 4 uint32 skillLevel; // 4
} reach_skill_level; } reach_skill_level;
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT = 8 // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT = 8
struct struct
{ {
uint32 linkedAchievement; // 3 uint32 linkedAchievement; // 3
} complete_achievement; } complete_achievement;
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT = 9 // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT = 9
struct struct
{ {
uint32 unused; // 3 uint32 unused; // 3
@ -129,67 +129,73 @@ struct AchievementCriteriaEntry
uint32 questCount; // 4 uint32 questCount; // 4
} complete_quests_in_zone; } complete_quests_in_zone;
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST = 14 // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST = 14
struct struct
{ {
uint32 unused; // 3 uint32 unused; // 3
uint32 questCount; // 4 uint32 questCount; // 4
} complete_daily_quest; } complete_daily_quest;
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND= 15 // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND = 15
struct struct
{ {
uint32 mapID; // 3 uint32 mapID; // 3
} complete_battleground; } complete_battleground;
// ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP= 16 // ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP = 16
struct struct
{ {
uint32 mapID; // 3 uint32 mapID; // 3
} death_at_map; } death_at_map;
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID = 19 // ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON = 18
struct
{
uint32 manLimit; // 3
} death_in_dungeon;
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID = 19
struct struct
{ {
uint32 groupSize; // 3 can be 5, 10 or 25 uint32 groupSize; // 3 can be 5, 10 or 25
} complete_raid; } complete_raid;
// ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE = 20 // ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE = 20
struct struct
{ {
uint32 creatureEntry; // 3 uint32 creatureEntry; // 3
} killed_by_creature; } killed_by_creature;
// ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING = 24 // ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING = 24
struct struct
{ {
uint32 unused; // 3 uint32 unused; // 3
uint32 fallHeight; // 4 uint32 fallHeight; // 4
} fall_without_dying; } fall_without_dying;
// ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM = 26 // ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM = 26
struct struct
{ {
uint32 type; // 0 - fatigue, 1 - drowning, 2 - falling, 3 - ??, 5 - fire and lava uint32 type; // 3, see enum EnviromentalDamage
} deaths; } death_from;
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST = 27 // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST = 27
struct struct
{ {
uint32 questID; // 3 uint32 questID; // 3
uint32 questCount; // 4 uint32 questCount; // 4
} complete_quest; } complete_quest;
// ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET = 28 // ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET = 28
// ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2= 69 // ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2 = 69
struct struct
{ {
uint32 spellID; // 3 uint32 spellID; // 3
uint32 spellCount; // 4 uint32 spellCount; // 4
} be_spell_target; } be_spell_target;
// ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL= 29 // ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL = 29
// ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2 = 110 // ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2 = 110
struct struct
{ {
uint32 spellID; // 3 uint32 spellID; // 3
@ -203,32 +209,32 @@ struct AchievementCriteriaEntry
uint32 killCount; // 4 uint32 killCount; // 4
} honorable_kill_at_area; } honorable_kill_at_area;
// ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA = 32 // ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA = 32
struct struct
{ {
uint32 mapID; // 3 Reference to Map.dbc uint32 mapID; // 3 Reference to Map.dbc
} win_arena; } win_arena;
// ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA = 33 // ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA = 33
struct struct
{ {
uint32 mapID; // 3 Reference to Map.dbc uint32 mapID; // 3 Reference to Map.dbc
} play_arena; } play_arena;
// ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL = 34 // ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL = 34
struct struct
{ {
uint32 spellID; // 3 Reference to Map.dbc uint32 spellID; // 3 Reference to Map.dbc
} learn_spell; } learn_spell;
// ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM = 36 // ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM = 36
struct struct
{ {
uint32 itemID; // 3 uint32 itemID; // 3
uint32 itemCount; // 4 uint32 itemCount; // 4
} own_item; } own_item;
// ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA = 37 // ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA = 37
struct struct
{ {
uint32 unused; // 3 uint32 unused; // 3
@ -236,62 +242,62 @@ struct AchievementCriteriaEntry
uint32 flag; // 5 4=in a row uint32 flag; // 5 4=in a row
} win_rated_arena; } win_rated_arena;
// ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING = 38 // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING = 38
struct struct
{ {
uint32 teamtype; // 3 {2,3,5} uint32 teamtype; // 3 {2,3,5}
} highest_team_rating; } highest_team_rating;
// ACHIEVEMENT_CRITERIA_TYPE_REACH_TEAM_RATING = 39 // ACHIEVEMENT_CRITERIA_TYPE_REACH_TEAM_RATING = 39
struct struct
{ {
uint32 teamtype; // 3 {2,3,5} uint32 teamtype; // 3 {2,3,5}
uint32 teamrating; // 4 uint32 teamrating; // 4
} reach_team_rating; } reach_team_rating;
// ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL = 40 // ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL = 40
struct struct
{ {
uint32 skillID; // 3 uint32 skillID; // 3
uint32 skillLevel; // 4 apprentice=1, journeyman=2, expert=3, artisan=4, master=5, grand master=6 uint32 skillLevel; // 4 apprentice=1, journeyman=2, expert=3, artisan=4, master=5, grand master=6
} learn_skill_level; } learn_skill_level;
// ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM = 41 // ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM = 41
struct struct
{ {
uint32 itemID; // 3 uint32 itemID; // 3
uint32 itemCount; // 4 uint32 itemCount; // 4
} use_item; } use_item;
// ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM = 42 // ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM = 42
struct struct
{ {
uint32 itemID; // 3 uint32 itemID; // 3
uint32 itemCount; // 4 uint32 itemCount; // 4
} loot_item; } loot_item;
// ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA = 43 // ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA = 43
struct struct
{ {
// TODO: This rank is _NOT_ the index from AreaTable.dbc // TODO: This rank is _NOT_ the index from AreaTable.dbc
uint32 areaReference; // 3 uint32 areaReference; // 3
} explore_area; } explore_area;
// ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK= 44 // ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK = 44
struct struct
{ {
// TODO: This rank is _NOT_ the index from CharTitles.dbc // TODO: This rank is _NOT_ the index from CharTitles.dbc
uint32 rank; // 3 uint32 rank; // 3
} own_rank; } own_rank;
// ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT= 45 // ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT = 45
struct struct
{ {
uint32 unused; // 3 uint32 unused; // 3
uint32 numberOfSlots; // 4 uint32 numberOfSlots; // 4
} buy_bank_slot; } buy_bank_slot;
// ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION= 46 // ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION = 46
struct struct
{ {
uint32 factionID; // 3 uint32 factionID; // 3
@ -305,56 +311,56 @@ struct AchievementCriteriaEntry
uint32 numberOfExaltedFactions; // 4 uint32 numberOfExaltedFactions; // 4
} gain_exalted_reputation; } gain_exalted_reputation;
// ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP = 48 // ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP = 48
struct struct
{ {
uint32 unused; // 3 uint32 unused; // 3
uint32 numberOfVisits; // 4 uint32 numberOfVisits; // 4
} visit_barber; } visit_barber;
// ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM = 49 // ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM = 49
// TODO: where is the required itemlevel stored? // TODO: where is the required itemlevel stored?
struct struct
{ {
uint32 itemSlot; // 3 uint32 itemSlot; // 3
} equip_epic_item; } equip_epic_item;
// ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT= 50 // ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT = 50
struct struct
{ {
uint32 rollValue; // 3 uint32 rollValue; // 3
uint32 count; // 4 uint32 count; // 4
} roll_need_on_loot; } roll_need_on_loot;
// ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT= 51 // ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT = 51
struct struct
{ {
uint32 rollValue; // 3 uint32 rollValue; // 3
uint32 count; // 4 uint32 count; // 4
} roll_greed_on_loot; } roll_greed_on_loot;
// ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS = 52 // ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS = 52
struct struct
{ {
uint32 classID; // 3 uint32 classID; // 3
uint32 count; // 4 uint32 count; // 4
} hk_class; } hk_class;
// ACHIEVEMENT_CRITERIA_TYPE_HK_RACE = 53 // ACHIEVEMENT_CRITERIA_TYPE_HK_RACE = 53
struct struct
{ {
uint32 raceID; // 3 uint32 raceID; // 3
uint32 count; // 4 uint32 count; // 4
} hk_race; } hk_race;
// ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE = 54 // ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE = 54
// TODO: where is the information about the target stored? // TODO: where is the information about the target stored?
struct struct
{ {
uint32 emoteID; // 3 uint32 emoteID; // 3
} do_emote; } do_emote;
// ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE = 13 // ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE = 13
// ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE = 55 // ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE = 55
// ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS = 56 // ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS = 56
struct struct
{ {
uint32 unused; // 3 uint32 unused; // 3
@ -363,13 +369,13 @@ struct AchievementCriteriaEntry
uint32 mapid; // 6 uint32 mapid; // 6
} healing_done; } healing_done;
// ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM = 57 // ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM = 57
struct struct
{ {
uint32 itemID; // 3 uint32 itemID; // 3
} equip_item; } equip_item;
// ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD = 62 // ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD= 62
struct struct
{ {
uint32 unused; // 3 uint32 unused; // 3
@ -377,21 +383,21 @@ struct AchievementCriteriaEntry
} quest_reward_money; } quest_reward_money;
// ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY = 67 // ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY = 67
struct struct
{ {
uint32 unused; // 3 uint32 unused; // 3
uint32 goldInCopper; // 4 uint32 goldInCopper; // 4
} loot_money; } loot_money;
// ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT = 68 // ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT = 68
struct struct
{ {
uint32 goEntry; // 3 uint32 goEntry; // 3
uint32 useCount; // 4 uint32 useCount; // 4
} use_gameobject; } use_gameobject;
// ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL= 70 // ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL = 70
// TODO: are those special criteria stored in the dbc or do we have to add another sql table? // TODO: are those special criteria stored in the dbc or do we have to add another sql table?
struct struct
{ {
@ -399,66 +405,66 @@ struct AchievementCriteriaEntry
uint32 killCount; // 4 uint32 killCount; // 4
} special_pvp_kill; } special_pvp_kill;
// ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT = 72 // ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT = 72
struct struct
{ {
uint32 goEntry; // 3 uint32 goEntry; // 3
uint32 lootCount; // 4 uint32 lootCount; // 4
} fish_in_gameobject; } fish_in_gameobject;
// ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS= 75 // ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS = 75
struct struct
{ {
uint32 skillLine; // 3 uint32 skillLine; // 3
uint32 spellCount; // 4 uint32 spellCount; // 4
} learn_skilline_spell; } learn_skilline_spell;
// ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL = 76 // ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL = 76
struct struct
{ {
uint32 unused; // 3 uint32 unused; // 3
uint32 duelCount; // 4 uint32 duelCount; // 4
} win_duel; } win_duel;
// ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_POWER = 96 // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_POWER = 96
struct struct
{ {
uint32 powerType; // 3 mana=0, 1=rage, 3=energy, 6=runic power uint32 powerType; // 3 mana=0, 1=rage, 3=energy, 6=runic power
} highest_power; } highest_power;
// ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_STAT = 97 // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_STAT = 97
struct struct
{ {
uint32 statType; // 3 4=spirit, 3=int, 2=stamina, 1=agi, 0=strength uint32 statType; // 3 4=spirit, 3=int, 2=stamina, 1=agi, 0=strength
} highest_stat; } highest_stat;
// ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_SPELLPOWER = 98 // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_SPELLPOWER = 98
struct struct
{ {
uint32 spellSchool; // 3 uint32 spellSchool; // 3
} highest_spellpower; } highest_spellpower;
// ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_RATING = 100 // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_RATING = 100
struct struct
{ {
uint32 ratingType; // 3 uint32 ratingType; // 3
} highest_rating; } highest_rating;
// ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE = 109 // ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE = 109
struct struct
{ {
uint32 lootType; // 3 3=fishing, 2=pickpocket, 4=disentchant uint32 lootType; // 3 3=fishing, 2=pickpocket, 4=disentchant
uint32 lootTypeCount; // 4 uint32 lootTypeCount; // 4
} loot_type; } loot_type;
// ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE= 112 // ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE = 112
struct struct
{ {
uint32 skillLine; // 3 uint32 skillLine; // 3
uint32 spellCount; // 4 uint32 spellCount; // 4
} learn_skill_line; } learn_skill_line;
// ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL = 113 // ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL = 113
struct struct
{ {
uint32 unused; // 3 uint32 unused; // 3