*Fix a crash and merge.

--HG--
branch : trunk
This commit is contained in:
QAston
2009-03-06 23:28:01 +01:00
12 changed files with 252 additions and 126 deletions
+3 -32
View File
@@ -22,7 +22,7 @@
DROP TABLE IF EXISTS `db_version`; DROP TABLE IF EXISTS `db_version`;
CREATE TABLE `db_version` ( CREATE TABLE `db_version` (
`version` varchar(120) default NULL, `version` varchar(120) default NULL,
`required_7382_01_mangos_creature_template` bit(1) default NULL `required_7388_01_mangos_mangos_string` bit(1) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes'; ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes';
-- --
@@ -1472,36 +1472,6 @@ CREATE TABLE `instance_template` (
LOCK TABLES `instance_template` WRITE; LOCK TABLES `instance_template` WRITE;
/*!40000 ALTER TABLE `instance_template` DISABLE KEYS */; /*!40000 ALTER TABLE `instance_template` DISABLE KEYS */;
INSERT INTO `instance_template` VALUES
(33,0,22,30,10,10,7200,NULL,NULL,NULL,NULL,''),
(34,0,24,32,10,10,7200,NULL,NULL,NULL,NULL,''),
(36,0,15,20,10,10,7200,NULL,NULL,NULL,NULL,''),
(43,0,15,21,10,10,7200,NULL,NULL,NULL,NULL,''),
(47,0,29,38,10,10,7200,NULL,NULL,NULL,NULL,''),
(48,0,24,32,10,10,7200,NULL,NULL,NULL,NULL,''),
(70,0,35,47,10,10,7200,NULL,NULL,NULL,NULL,''),
(90,0,29,38,10,10,7200,NULL,NULL,NULL,NULL,''),
(109,0,45,55,10,10,7200,NULL,NULL,NULL,NULL,''),
(129,0,37,46,10,10,7200,NULL,NULL,NULL,NULL,''),
(189,0,34,45,10,10,7200,NULL,NULL,NULL,NULL,''),
(209,0,44,54,10,10,7200,NULL,NULL,NULL,NULL,''),
(229,0,58,0,10,10,120000,78.5083,-225.044,49.839,5.1,''),
(230,0,52,0,5,5,7200,NULL,NULL,NULL,NULL,''),
(249,0,60,0,40,40,432000,NULL,NULL,NULL,NULL,''),
(289,0,57,0,5,5,7200,NULL,NULL,NULL,NULL,''),
(309,0,60,0,20,20,259200,NULL,NULL,NULL,NULL,''),
(329,0,58,60,5,5,7200,NULL,NULL,NULL,NULL,''),
(349,0,46,55,10,10,7200,NULL,NULL,NULL,NULL,''),
(389,0,13,18,10,10,7200,NULL,NULL,NULL,NULL,''),
(409,0,60,0,40,40,604800,NULL,NULL,NULL,NULL,''),
(429,0,55,60,5,5,7200,NULL,NULL,NULL,NULL,''),
(469,0,60,0,40,40,604800,NULL,NULL,NULL,NULL,''),
(509,0,60,0,20,20,259200,NULL,NULL,NULL,NULL,''),
(531,0,60,0,40,40,604800,NULL,NULL,NULL,NULL,''),
(533,0,80,0,10,25,0,NULL,NULL,NULL,NULL,''),
(615,0,80,0,10,25,0,NULL,NULL,NULL,NULL,''),
(616,0,80,0,10,25,0,NULL,NULL,NULL,NULL,''),
(624,0,80,0,10,25,0,NULL,NULL,NULL,NULL,'');
/*!40000 ALTER TABLE `instance_template` ENABLE KEYS */; /*!40000 ALTER TABLE `instance_template` ENABLE KEYS */;
UNLOCK TABLES; UNLOCK TABLES;
@@ -2842,7 +2812,6 @@ INSERT INTO `mangos_string` VALUES
(723,'Your group does not have enough players to join this match.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (723,'Your group does not have enough players to join this match.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(724,'The Gold Team wins!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (724,'The Gold Team wins!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(725,'The Green Team wins!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (725,'The Green Team wins!',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(726,'There aren\'t enough players in this battleground. It will end soon unless some more players join to balance the fight.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(727,'Your group has an offline member. Please remove him before joining.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (727,'Your group has an offline member. Please remove him before joining.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(728,'Your group has players from the opposing faction. You can\'t join the battleground as a group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (728,'Your group has players from the opposing faction. You can\'t join the battleground as a group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(729,'Your group has players from different battleground brakets. You can\'t join as group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (729,'Your group has players from different battleground brakets. You can\'t join as group.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
@@ -2863,6 +2832,8 @@ INSERT INTO `mangos_string` VALUES
(744,'Modifying played count, arena points etc. for loaded arena teams, sending updated stats to online players...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (744,'Modifying played count, arena points etc. for loaded arena teams, sending updated stats to online players...',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(745,'Modification done.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (745,'Modification done.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(746,'Done flushing Arena points.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (746,'Done flushing Arena points.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(750,'Not enough players. This game will close in %u mins.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(751,'Not enough players. This game will close in %u seconds.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(801,'You do not have enough gold',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (801,'You do not have enough gold',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(802,'You do not have enough free slots',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (802,'You do not have enough free slots',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
(803,'Your partner does not have enough free bag slots',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), (803,'Your partner does not have enough free bag slots',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
@@ -0,0 +1,3 @@
DELETE FROM mangos_string WHERE entry = 726;
INSERT INTO mangos_string VALUES (750,'Not enough players. This game will close in %u mins.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
INSERT INTO mangos_string VALUES (751,'Not enough players. This game will close in %u seconds.',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
+108 -4
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:
+24 -4
View File
@@ -230,7 +230,6 @@ void BattleGround::Update(uint32 diff)
{ {
m_PrematureCountDown = true; m_PrematureCountDown = true;
m_PrematureCountDownTimer = sBattleGroundMgr.GetPrematureFinishTime(); m_PrematureCountDownTimer = sBattleGroundMgr.GetPrematureFinishTime();
SendMessageToAll(LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING);
} }
else if(m_PrematureCountDownTimer < diff) else if(m_PrematureCountDownTimer < diff)
{ {
@@ -242,8 +241,17 @@ void BattleGround::Update(uint32 diff)
{ {
uint32 newtime = m_PrematureCountDownTimer - diff; uint32 newtime = m_PrematureCountDownTimer - diff;
// announce every minute // announce every minute
if(m_PrematureCountDownTimer != sBattleGroundMgr.GetPrematureFinishTime() && newtime / 60000 != m_PrematureCountDownTimer / 60000) if( newtime > (MINUTE * IN_MILISECONDS) )
SendMessageToAll(LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING); {
if( newtime / (MINUTE * IN_MILISECONDS) != m_PrematureCountDownTimer / (MINUTE * IN_MILISECONDS) )
PSendMessageToAll(LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING, (uint32)(m_PrematureCountDownTimer / (MINUTE * IN_MILISECONDS)));
}
else
{
//announce every 15 seconds
if( newtime / (15 * IN_MILISECONDS) != m_PrematureCountDownTimer / (15 * IN_MILISECONDS) )
PSendMessageToAll(LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING_SECS, (uint32)(m_PrematureCountDownTimer / IN_MILISECONDS));
}
m_PrematureCountDownTimer = newtime; m_PrematureCountDownTimer = newtime;
} }
} }
@@ -1047,7 +1055,7 @@ void BattleGround::RemoveFromBGFreeSlotQueue()
// returns the number how many players can join battleground to MaxPlayersPerTeam // returns the number how many players can join battleground to MaxPlayersPerTeam
uint32 BattleGround::GetFreeSlotsForTeam(uint32 Team) const uint32 BattleGround::GetFreeSlotsForTeam(uint32 Team) const
{ {
//if BG is starting ... invite anyone //return free slot count to MaxPlayerPerTeam
if (GetStatus() == STATUS_WAIT_JOIN || GetStatus() == STATUS_IN_PROGRESS) if (GetStatus() == STATUS_WAIT_JOIN || GetStatus() == STATUS_IN_PROGRESS)
return (GetInvitedCount(Team) < GetMaxPlayersPerTeam()) ? GetMaxPlayersPerTeam() - GetInvitedCount(Team) : 0; return (GetInvitedCount(Team) < GetMaxPlayersPerTeam()) ? GetMaxPlayersPerTeam() - GetInvitedCount(Team) : 0;
@@ -1414,6 +1422,18 @@ void BattleGround::SendMessageToAll(int32 entry)
SendPacketToAll(&data); SendPacketToAll(&data);
} }
//copied from void ChatHandler::PSendSysMessage(int32 entry, ...)
void BattleGround::PSendMessageToAll(int32 entry, ...)
{
const char *format = GetMangosString(entry);
va_list ap;
char str [2048];
va_start(ap, entry);
vsnprintf(str,2048,format, ap );
va_end(ap);
SendMessageToAll(str);
}
void BattleGround::EndNow() void BattleGround::EndNow()
{ {
RemoveFromBGFreeSlotQueue(); RemoveFromBGFreeSlotQueue();
+1
View File
@@ -402,6 +402,7 @@ class BattleGround
void SendMessageToAll(char const* text); void SendMessageToAll(char const* text);
void SendMessageToAll(int32 entry); void SendMessageToAll(int32 entry);
void PSendMessageToAll(int32 entry, ... );
/* Raid Group */ /* Raid Group */
Group *GetBgRaid(uint32 TeamID) const { return TeamID == ALLIANCE ? m_BgRaids[BG_TEAM_ALLIANCE] : m_BgRaids[BG_TEAM_HORDE]; } Group *GetBgRaid(uint32 TeamID) const { return TeamID == ALLIANCE ? m_BgRaids[BG_TEAM_ALLIANCE] : m_BgRaids[BG_TEAM_HORDE]; }
+7 -2
View File
@@ -654,7 +654,7 @@ enum TrinityStrings
LANG_ARENA_NOT_ENOUGH_PLAYERS = 723, // "Your group does not have enough players to join this match." LANG_ARENA_NOT_ENOUGH_PLAYERS = 723, // "Your group does not have enough players to join this match."
LANG_ARENA_GOLD_WINS = 724, // "The Gold Team wins!" LANG_ARENA_GOLD_WINS = 724, // "The Gold Team wins!"
LANG_ARENA_GREEN_WINS = 725, // "The Green Team wins!" LANG_ARENA_GREEN_WINS = 725, // "The Green Team wins!"
LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING = 726, // The battleground will end soon, because there aren't enough players. Get more ppl or win already! // = 726, not used
LANG_BG_GROUP_OFFLINE_MEMBER = 727, // "Your group has an offline member. Please remove him before joining." LANG_BG_GROUP_OFFLINE_MEMBER = 727, // "Your group has an offline member. Please remove him before joining."
LANG_BG_GROUP_MIXED_FACTION = 728, // "Your group has players from the opposing faction. You can't join the battleground as a group." LANG_BG_GROUP_MIXED_FACTION = 728, // "Your group has players from the opposing faction. You can't join the battleground as a group."
LANG_BG_GROUP_MIXED_LEVELS = 729, // "Your group has players from different battleground brakets. You can't join as group." LANG_BG_GROUP_MIXED_LEVELS = 729, // "Your group has players from different battleground brakets. You can't join as group."
@@ -676,7 +676,12 @@ enum TrinityStrings
LANG_DIST_ARENA_POINTS_TEAM_START = 744, LANG_DIST_ARENA_POINTS_TEAM_START = 744,
LANG_DIST_ARENA_POINTS_TEAM_END = 745, LANG_DIST_ARENA_POINTS_TEAM_END = 745,
LANG_DIST_ARENA_POINTS_END = 746, LANG_DIST_ARENA_POINTS_END = 746,
// Room for batleground/arena strings 747-799 not used // = 747, not used
// = 748, not used
// = 749, not used
LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING = 750, // "Not enough players. This game will close in %u mins."
LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING_SECS = 751, // "Not enough players. This game will close in %u seconds."
// Room for batleground/arena strings 752-799 not used
// Room for BG/ARENA 750-769 not used // Room for BG/ARENA 750-769 not used
+7
View File
@@ -278,6 +278,13 @@ bool LootStoreItem::IsValid(LootStore const& store, uint32 entry) const
store.GetName(), entry, itemid, chance); store.GetName(), entry, itemid, chance);
return false; return false;
} }
if( maxcount < mincountOrRef) // wrong max count
{
sLog.outErrorDb("Table '%s' entry %d item %d: max count (%u) less that min count (%i) - skipped", store.GetName(), entry, itemid, uint32(maxcount), mincountOrRef);
return false;
}
} }
else // mincountOrRef < 0 else // mincountOrRef < 0
{ {
+1 -3
View File
@@ -125,9 +125,7 @@ void WorldSession::HandleSendMail(WorldPacket & recv_data )
return; return;
} }
uint32 cost = money + 30; uint32 cost = items_count ? 30 * items_count : 30; // price hardcoded in client
if (items_count)
cost = 30 * items_count;
uint32 reqmoney = cost + money; uint32 reqmoney = cost + money;
+17 -9
View File
@@ -898,6 +898,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);
@@ -908,13 +911,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);
} }
} }
@@ -998,9 +1006,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;
} }
@@ -1385,6 +1391,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);
+15 -12
View File
@@ -743,6 +743,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");
@@ -820,12 +821,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
@@ -5561,6 +5562,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
return false; return false;
basepoints0 = triggerAmount * GetMaxHealth() / 100; basepoints0 = triggerAmount * GetMaxHealth() / 100;
triggered_spell_id = 34299; triggered_spell_id = 34299;
break;
} }
// Healing Touch (Dreamwalker Raiment set) // Healing Touch (Dreamwalker Raiment set)
case 28719: case 28719:
@@ -5664,6 +5666,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
{ {
triggered_spell_id = 60889; triggered_spell_id = 60889;
basepoints0 = triggerAmount * GetMaxPower(POWER_MANA) / 100; basepoints0 = triggerAmount * GetMaxPower(POWER_MANA) / 100;
break;
} }
break; break;
} }
@@ -12506,14 +12509,14 @@ void Unit::Kill(Unit *pVictim, bool durabilityLoss)
} }
} }
// 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());
} }
} }
void Unit::SetControlled(bool apply, UnitState state) void Unit::SetControlled(bool apply, UnitState state)
+65 -59
View File
@@ -75,7 +75,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
{ {
@@ -83,7 +83,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
{ {
@@ -91,27 +91,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
@@ -132,67 +132,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
@@ -206,32 +212,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
@@ -239,62 +245,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
@@ -308,56 +314,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
@@ -366,13 +372,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
@@ -380,21 +386,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
{ {
@@ -402,66 +408,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
+1 -1
View File
@@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "7384" #define REVISION_NR "7389"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__