diff options
author | Brian <runningnak3d@gmail.com> | 2010-02-14 19:13:14 -0700 |
---|---|---|
committer | Brian <runningnak3d@gmail.com> | 2010-02-14 19:13:14 -0700 |
commit | 486c00891ba34884e5b2cdd8d44b4d8496f11283 (patch) | |
tree | 7df304b9020ed21b87bd66978d2dc6e6683edce7 | |
parent | 7799ade4da0da17034039439d692122e976c0138 (diff) |
* Core switch to client 3.3.2 (11403)
* Credits (in no particular order) to:
* n0n4m3, raczman, manuel, Spp, Malcrom, Teacher, QAston, Tartalo,
* thenecromancer, Xanadu, Trazom, Zor, kiper
* Additional credits to:
* TOM_RUS and NoFantasy from MaNGOS
* Thanks for testing Aokromes and XTElite1
* SoTA still needs some work, but is very playable (huge thanks to raczman and
* kiper)
* To upgrade, you need to apply all SQL from sql/updates/3.2.2a_old from the
* last rev you are on
* and then apply all SQL from sql/updates/3.3.2_old to char / realmd / world
* DBs
* Known problem with guild banks.
--HG--
branch : trunk
114 files changed, 11573 insertions, 1670 deletions
@@ -64,4 +64,4 @@ footman, elron103, make_the_king, destros, MetaphysicalDrama, disassebler, Malcrom, Vladmimír Lipták, retriman, hyriuu, Smakapotatis, PainKiller, bkhorizon, n0n4m3, Chesterfield, Frankir, Wowka321, Morpheux, p0wer, Ouden, toshik, laise, yavi, Splinter, Syntec, Arthas, denyde, unholy, -Vaughner, blackmanos, edrinn, kiper +Vaughner, blackmanos, edrinn. diff --git a/sql/FULL/world_scripts_full.sql b/sql/FULL/world_scripts_full.sql index 76a7a118890..40a4a20194a 100644 --- a/sql/FULL/world_scripts_full.sql +++ b/sql/FULL/world_scripts_full.sql @@ -1269,6 +1269,8 @@ UPDATE `creature_template` SET `ScriptName`='boss_stormcaller_brundir' WHERE `en UPDATE `creature_template` SET `ScriptName`='mob_lightning_elemental' WHERE `entry`=32958; UPDATE `creature_template` SET `ScriptName`='mob_rune_of_summoning' WHERE `entry`=33051; UPDATE `creature_template` SET `ScriptName`='boss_kologarn' WHERE `entry`=32930; +UPDATE `creature_template` SET `ScriptName`='boss_algalon' WHERE `entry`=32871; +UPDATE `creature_template` SET `ScriptName`='mob_collapsing_star' WHERE `entry`=32955; UPDATE `gameobject_template` SET `ScriptName`='ulduar_teleporter' WHERE `entry`=194569; /* UN'GORO CRATER */ diff --git a/sql/characters.sql b/sql/characters.sql index a6014f8d852..2fdd6709172 100644 --- a/sql/characters.sql +++ b/sql/characters.sql @@ -26,7 +26,7 @@ CREATE TABLE `account_data` ( `account` int(11) unsigned NOT NULL default '0', `type` int(11) unsigned NOT NULL default '0', `time` bigint(11) unsigned NOT NULL default '0', - `data` longtext NOT NULL, + `data` longblob NOT NULL, PRIMARY KEY (`account`,`type`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; @@ -396,7 +396,7 @@ CREATE TABLE `character_account_data` ( `guid` int(11) unsigned NOT NULL default '0', `type` int(11) unsigned NOT NULL default '0', `time` bigint(11) unsigned NOT NULL default '0', - `data` longtext NOT NULL, + `data` longblob NOT NULL, PRIMARY KEY (`guid`,`type`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; diff --git a/sql/realmd.sql b/sql/realmd.sql index 4e235d9eca5..7334139d660 100644 --- a/sql/realmd.sql +++ b/sql/realmd.sql @@ -209,7 +209,7 @@ CREATE TABLE `realmlist` ( LOCK TABLES `realmlist` WRITE; /*!40000 ALTER TABLE `realmlist` DISABLE KEYS */; INSERT INTO `realmlist` (`id`,`name`,`address`,`port`,`icon`,`color`,`timezone`,`allowedSecurityLevel`,`population`,`gamebuild`) VALUES -(1,'Trinity','127.0.0.1',8085,1,0,1,0,0,10505); +(1,'Trinity','127.0.0.1',8085,1,0,1,0,0,11403); /*!40000 ALTER TABLE `realmlist` ENABLE KEYS */; UNLOCK TABLES; diff --git a/sql/updates/7306_world_trinity_string.sql b/sql/updates/3.2.2a_old/7306_world_trinity_string.sql index c1b15a3797d..c1b15a3797d 100644 --- a/sql/updates/7306_world_trinity_string.sql +++ b/sql/updates/3.2.2a_old/7306_world_trinity_string.sql diff --git a/sql/updates/7312_world_script_texts.sql b/sql/updates/3.2.2a_old/7312_world_script_texts.sql index 893f6954c01..893f6954c01 100644 --- a/sql/updates/7312_world_script_texts.sql +++ b/sql/updates/3.2.2a_old/7312_world_script_texts.sql diff --git a/sql/updates/7316_world_script_texts.sql b/sql/updates/3.2.2a_old/7316_world_script_texts.sql index db46ba9b00f..db46ba9b00f 100644 --- a/sql/updates/7316_world_script_texts.sql +++ b/sql/updates/3.2.2a_old/7316_world_script_texts.sql diff --git a/sql/updates/7327_world_creature_classlevelstats.sql b/sql/updates/3.2.2a_old/7327_world_creature_classlevelstats.sql index 06e66207688..06e66207688 100644 --- a/sql/updates/7327_world_creature_classlevelstats.sql +++ b/sql/updates/3.2.2a_old/7327_world_creature_classlevelstats.sql diff --git a/sql/updates/7328_world_creature_classlevelstats.sql b/sql/updates/3.2.2a_old/7328_world_creature_classlevelstats.sql index ebde8b765a4..b3b826ccc0a 100644 --- a/sql/updates/7328_world_creature_classlevelstats.sql +++ b/sql/updates/3.2.2a_old/7328_world_creature_classlevelstats.sql @@ -3,7 +3,6 @@ UPDATE `creature_classlevelstats` SET `basehp0`=5492 WHERE `level`=81 AND `class UPDATE `creature_classlevelstats` SET `basehp1`=8715 WHERE `level`=78 AND `class`=1; UPDATE `creature_classlevelstats` SET `basehp1`=8960 WHERE `level`=79 AND `class`=1; UPDATE `creature_classlevelstats` SET `basehp1`=9474 WHERE `level`=81 AND `class`=1; -UPDATE `creature_classlevelstats` SET `basehp1`=7794 WHERE `level`=82 AND `class`=2; UPDATE `creature_classlevelstats` SET `basehp1`=6243 WHERE `level`=74 AND `class`=2; UPDATE `creature_classlevelstats` SET `basehp1`=6602 WHERE `level`=76 AND `class`=2; UPDATE `creature_classlevelstats` SET `basehp1`=6784 WHERE `level`=77 AND `class`=2; diff --git a/sql/updates/3.3.2_old/7332_characters_account_data.sql b/sql/updates/3.3.2_old/7332_characters_account_data.sql new file mode 100644 index 00000000000..f01415135f9 --- /dev/null +++ b/sql/updates/3.3.2_old/7332_characters_account_data.sql @@ -0,0 +1 @@ +ALTER table account_data change `data` `data` longblob NOT NULL; diff --git a/sql/updates/3.3.2_old/7332_characters_character_account_data.sql b/sql/updates/3.3.2_old/7332_characters_character_account_data.sql new file mode 100644 index 00000000000..8a83b3a9879 --- /dev/null +++ b/sql/updates/3.3.2_old/7332_characters_character_account_data.sql @@ -0,0 +1 @@ +ALTER table character_account_data change `data` `data` longblob NOT NULL; diff --git a/sql/updates/3.3.2_old/7332_characters_character_spell.sql b/sql/updates/3.3.2_old/7332_characters_character_spell.sql new file mode 100644 index 00000000000..08a7c2077a0 --- /dev/null +++ b/sql/updates/3.3.2_old/7332_characters_character_spell.sql @@ -0,0 +1 @@ +DELETE FROM `character_spell` WHERE `spell` IN (6783,9913,1785,1786,1787); diff --git a/sql/updates/3.3.2_old/7332_characters_characters.sql b/sql/updates/3.3.2_old/7332_characters_characters.sql new file mode 100644 index 00000000000..6db1a7d0946 --- /dev/null +++ b/sql/updates/3.3.2_old/7332_characters_characters.sql @@ -0,0 +1,61 @@ +UPDATE characters SET data = REPLACE(data,' ',' '); +UPDATE characters SET data = CONCAT(TRIM(data),' '); +UPDATE `characters` SET `data` = CONCAT( + SUBSTRING_INDEX(`data`, ' ', 161 + 1), ' ', + '0 ', + SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 165 + 1), ' ', -165 + 162 - 1), ' ', + '0 ', + SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 165 + 4 + 1), ' ', -165 - 4 + 162 + 4 - 1), ' ', + '0 ', + SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 165 + 4*2 + 1), ' ', -165 - 4*2 + 162 + 4*2 - 1), ' ', + '0 ', + SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 165 + 4*3 + 1), ' ', -165 - 4*3 + 162 + 4*3 - 1), ' ', + '0 ', + SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 165 + 4*4 + 1), ' ', -165 - 4*4 + 162 + 4*4 - 1), ' ', + '0 ', + SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 165 + 4*5 + 1), ' ', -165 - 4*5 + 162 + 4*5 - 1), ' ', + '0 ', + SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 165 + 4*6 + 1), ' ', -165 - 4*6 + 162 + 4*6 - 1), ' ', + '0 ', + SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 165 + 4*7 + 1), ' ', -165 - 4*7 + 162 + 4*7 - 1), ' ', + '0 ', + SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 165 + 4*8 + 1), ' ', -165 - 4*8 + 162 + 4*8 - 1), ' ', + '0 ', + SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 165 + 4*9 + 1), ' ', -165 - 4*9 + 162 + 4*9 - 1), ' ', + '0 ', + SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 165 + 4*10 + 1), ' ', -165 - 4*10 + 162 + 4*10 - 1), ' ', + '0 ', + SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 165 + 4*11 + 1), ' ', -165 - 4*11 + 162 + 4*11 - 1), ' ', + '0 ', + SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 165 + 4*12 + 1), ' ', -165 - 4*12 + 162 + 4*12 - 1), ' ', + '0 ', + SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 165 + 4*13 + 1), ' ', -165 - 4*13 + 162 + 4*13 - 1), ' ', + '0 ', + SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 165 + 4*14 + 1), ' ', -165 - 4*14 + 162 + 4*14 - 1), ' ', + '0 ', + SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 165 + 4*15 + 1), ' ', -165 - 4*15 + 162 + 4*15 - 1), ' ', + '0 ', + SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 165 + 4*16 + 1), ' ', -165 - 4*16 + 162 + 4*16 - 1), ' ', + '0 ', + SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 165 + 4*17 + 1), ' ', -165 - 4*17 + 162 + 4*17 - 1), ' ', + '0 ', + SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 165 + 4*18 + 1), ' ', -165 - 4*18 + 162 + 4*18 - 1), ' ', + '0 ', + SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 165 + 4*19 + 1), ' ', -165 - 4*19 + 162 + 4*19 - 1), ' ', + '0 ', + SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 165 + 4*20 + 1), ' ', -165 - 4*20 + 162 + 4*20 - 1), ' ', + '0 ', + SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 165 + 4*21 + 1), ' ', -165 - 4*21 + 162 + 4*21 - 1), ' ', + '0 ', + SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 165 + 4*22 + 1), ' ', -165 - 4*22 + 162 + 4*22 - 1), ' ', + '0 ', + SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 165 + 4*23 + 1), ' ', -165 - 4*23 + 162 + 4*23 - 1), ' ', + '0 ', + SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 298 + 1), ' ', -298 + 162 + 4*24 - 1), ' ', + '0 ', + SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 1300 + 1), ' ', -1300 + 299 - 1), ' ' + ) +WHERE length(SUBSTRING_INDEX(data, ' ', 1300)) < length(data) and length(SUBSTRING_INDEX(data, ' ', 1300+1)) >= length(data); +UPDATE characters SET data = REPLACE(data,' ',' '); +UPDATE characters SET data = CONCAT(TRIM(data),' '); + diff --git a/sql/updates/3.3.2_old/7332_characters_guild.sql b/sql/updates/3.3.2_old/7332_characters_guild.sql new file mode 100644 index 00000000000..ddc5c3b5e26 --- /dev/null +++ b/sql/updates/3.3.2_old/7332_characters_guild.sql @@ -0,0 +1,12 @@ +-- add temporary column +ALTER TABLE guild ADD COLUMN created_temp bigint(20) default '0'; +-- update temporary columns data +UPDATE guild SET created_temp = UNIX_TIMESTAMP(createdate); +-- drop current column +ALTER TABLE guild DROP COLUMN createdate; +-- create new column with correct type +ALTER TABLE guild ADD COLUMN createdate bigint(20) NOT NULL default '0' AFTER motd; +-- copy data to new column +UPDATE guild set createdate = created_temp; +-- remove old column +ALTER TABLE guild DROP COLUMN created_temp; diff --git a/sql/updates/3.3.2_old/7332_characters_guild_bank_eventlog.sql b/sql/updates/3.3.2_old/7332_characters_guild_bank_eventlog.sql new file mode 100644 index 00000000000..551d58e8eef --- /dev/null +++ b/sql/updates/3.3.2_old/7332_characters_guild_bank_eventlog.sql @@ -0,0 +1,14 @@ +DROP TABLE IF EXISTS `guild_bank_eventlog`; +CREATE TABLE `guild_bank_eventlog` ( + `guildid` int(11) unsigned NOT NULL default '0' COMMENT 'Guild Identificator', + `LogGuid` int(11) unsigned NOT NULL default '0' COMMENT 'Log record identificator - auxiliary column', + `TabId` tinyint(3) unsigned NOT NULL default '0' COMMENT 'Guild bank TabId', + `EventType` tinyint(3) unsigned NOT NULL default '0' COMMENT 'Event type', + `PlayerGuid` int(11) unsigned NOT NULL default '0', + `ItemOrMoney` int(11) unsigned NOT NULL default '0', + `ItemStackCount` tinyint(3) unsigned NOT NULL default '0', + `DestTabId` tinyint(1) unsigned NOT NULL default '0' COMMENT 'Destination Tab Id', + `TimeStamp` bigint(20) unsigned NOT NULL default '0' COMMENT 'Event UNIX time', + PRIMARY KEY (`guildid`,`LogGuid`,`TabId`), + KEY `guildid_key` (`guildid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/sql/updates/3.3.2_old/7332_characters_guild_eventlog.sql b/sql/updates/3.3.2_old/7332_characters_guild_eventlog.sql new file mode 100644 index 00000000000..e471dc8e426 --- /dev/null +++ b/sql/updates/3.3.2_old/7332_characters_guild_eventlog.sql @@ -0,0 +1,11 @@ +DROP TABLE IF EXISTS `guild_eventlog`; +CREATE TABLE `guild_eventlog` ( + `guildid` int(11) NOT NULL COMMENT 'Guild Identificator', + `LogGuid` int(11) NOT NULL COMMENT 'Log record identificator - auxiliary column', + `EventType` tinyint(1) NOT NULL COMMENT 'Event type', + `PlayerGuid1` int(11) NOT NULL COMMENT 'Player 1', + `PlayerGuid2` int(11) NOT NULL COMMENT 'Player 2', + `NewRank` tinyint(2) NOT NULL COMMENT 'New rank(in case promotion/demotion)', + `TimeStamp` bigint(20) NOT NULL COMMENT 'Event UNIX time', + PRIMARY KEY (`guildid`, `LogGuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT 'Guild Eventlog'; diff --git a/sql/updates/3.3.2_old/7332_characters_guild_rank.sql b/sql/updates/3.3.2_old/7332_characters_guild_rank.sql new file mode 100644 index 00000000000..68e296af947 --- /dev/null +++ b/sql/updates/3.3.2_old/7332_characters_guild_rank.sql @@ -0,0 +1 @@ +UPDATE guild_rank SET BankMoneyPerDay = 4294967295 WHERE rid = 0; diff --git a/sql/updates/3.3.2_old/7332_realmd_realmlist.sql b/sql/updates/3.3.2_old/7332_realmd_realmlist.sql new file mode 100644 index 00000000000..63d01a31b18 --- /dev/null +++ b/sql/updates/3.3.2_old/7332_realmd_realmlist.sql @@ -0,0 +1 @@ +UPDATE `realmlist` SET `gamebuild`=11403 WHERE `id`=1; diff --git a/sql/updates/3.3.2_old/7332_world_creature_template.sql b/sql/updates/3.3.2_old/7332_world_creature_template.sql new file mode 100644 index 00000000000..59a53551587 --- /dev/null +++ b/sql/updates/3.3.2_old/7332_world_creature_template.sql @@ -0,0 +1 @@ +ALTER TABLE `creature_template` ADD `WDBVerified` SMALLINT(5) SIGNED DEFAULT 0 AFTER `ScriptName`; diff --git a/sql/updates/3.3.2_old/7332_world_gameobject_template.sql b/sql/updates/3.3.2_old/7332_world_gameobject_template.sql new file mode 100644 index 00000000000..88955785f3d --- /dev/null +++ b/sql/updates/3.3.2_old/7332_world_gameobject_template.sql @@ -0,0 +1 @@ +ALTER TABLE `gameobject_template` ADD `WDBVerified` SMALLINT(5) SIGNED DEFAULT 0 AFTER `ScriptName`; diff --git a/sql/updates/3.3.2_old/7332_world_item_template.sql b/sql/updates/3.3.2_old/7332_world_item_template.sql new file mode 100644 index 00000000000..2ad3845809d --- /dev/null +++ b/sql/updates/3.3.2_old/7332_world_item_template.sql @@ -0,0 +1,8 @@ +-- Resize spellcharge fields in item_template to hold 3.3.0 wdb data +ALTER TABLE `item_template` MODIFY `spellcharges_1` SMALLINT(4); -- Resize make larger +ALTER TABLE `item_template` MODIFY `spellcharges_2` SMALLINT(4); -- Resize make larger +ALTER TABLE `item_template` MODIFY `spellcharges_3` SMALLINT(4); -- Resize make larger +ALTER TABLE `item_template` MODIFY `spellcharges_4` SMALLINT(4); -- Resize make larger +ALTER TABLE `item_template` MODIFY `spellcharges_5` SMALLINT(4); -- Resize make larger + +ALTER TABLE `item_template` ADD `WDBVerified` SMALLINT(5) SIGNED DEFAULT 0 AFTER `maxMoneyLoot`; diff --git a/sql/updates/3.3.2_old/7332_world_npc_text.sql b/sql/updates/3.3.2_old/7332_world_npc_text.sql new file mode 100644 index 00000000000..33aad7f189e --- /dev/null +++ b/sql/updates/3.3.2_old/7332_world_npc_text.sql @@ -0,0 +1 @@ +ALTER TABLE `npc_text` ADD `WDBVerified` SMALLINT(5) SIGNED DEFAULT 0 AFTER `em7_5`; diff --git a/sql/updates/3.3.2_old/7332_world_page_text.sql b/sql/updates/3.3.2_old/7332_world_page_text.sql new file mode 100644 index 00000000000..b2767bb7d01 --- /dev/null +++ b/sql/updates/3.3.2_old/7332_world_page_text.sql @@ -0,0 +1 @@ +ALTER TABLE `page_text` ADD `WDBVerified` SMALLINT(5) SIGNED DEFAULT 0 AFTER `next_page`; diff --git a/sql/updates/3.3.2_old/7332_world_playercreateinfo_action.sql b/sql/updates/3.3.2_old/7332_world_playercreateinfo_action.sql new file mode 100644 index 00000000000..0a1e7710208 --- /dev/null +++ b/sql/updates/3.3.2_old/7332_world_playercreateinfo_action.sql @@ -0,0 +1,326 @@ +TRUNCATE `playercreateinfo_action`; +INSERT INTO `playercreateinfo_action` VALUES ('1', '1', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('1', '1', '72', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('1', '1', '73', '78', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('1', '1', '82', '59752', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('1', '1', '84', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('1', '1', '96', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('1', '1', '108', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('1', '2', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('1', '2', '1', '21084', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('1', '2', '2', '635', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('1', '2', '11', '59752', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('1', '4', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('1', '4', '1', '1752', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('1', '4', '2', '2098', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('1', '4', '3', '2764', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('1', '4', '11', '59752', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('1', '5', '0', '585', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('1', '5', '1', '2050', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('1', '5', '11', '59752', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('1', '6', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('1', '6', '1', '49576', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('1', '6', '2', '45477', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('1', '6', '3', '45462', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('1', '6', '4', '45902', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('1', '6', '5', '47541', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('1', '6', '11', '59752', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('1', '8', '0', '133', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('1', '8', '1', '168', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('1', '8', '11', '59752', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('1', '9', '0', '686', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('1', '9', '1', '687', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('1', '9', '11', '59752', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('2', '1', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('2', '1', '72', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('2', '1', '73', '78', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('2', '1', '74', '20572', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('2', '1', '84', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('2', '1', '96', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('2', '1', '108', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('2', '3', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('2', '3', '1', '2973', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('2', '3', '2', '75', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('2', '3', '11', '20572', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('2', '4', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('2', '4', '1', '1752', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('2', '4', '2', '2098', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('2', '4', '3', '2764', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('2', '4', '4', '20572', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('2', '6', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('2', '6', '1', '49576', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('2', '6', '2', '45477', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('2', '6', '3', '45462', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('2', '6', '4', '45902', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('2', '6', '5', '47541', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('2', '6', '10', '20572', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('2', '7', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('2', '7', '1', '403', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('2', '7', '2', '331', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('2', '7', '3', '33697', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('2', '9', '0', '686', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('2', '9', '1', '687', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('2', '9', '2', '33702', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '1', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '1', '1', '78', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '1', '72', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '1', '73', '78', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '1', '74', '20594', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '1', '75', '2481', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '1', '84', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '1', '96', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '1', '108', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '2', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '2', '1', '21084', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '2', '2', '635', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '2', '3', '20594', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '2', '4', '2481', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '3', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '3', '1', '2973', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '3', '2', '75', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '3', '3', '20594', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '3', '4', '2481', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '3', '75', '20594', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '3', '76', '2481', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '4', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '4', '1', '1752', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '4', '2', '2098', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '4', '3', '2764', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '4', '4', '20594', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '4', '5', '2481', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '5', '0', '585', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '5', '1', '2050', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '5', '2', '20594', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '5', '3', '2481', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '6', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '6', '1', '49576', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '6', '2', '45477', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '6', '3', '45462', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '6', '4', '45902', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '6', '5', '47541', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('3', '6', '10', '2481', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('4', '1', '72', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('4', '4', '82', '58984', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('4', '1', '73', '78', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('4', '1', '82', '58984', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('4', '1', '85', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('4', '1', '97', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('4', '1', '109', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('4', '3', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('4', '3', '1', '2973', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('4', '3', '2', '75', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('4', '3', '3', '58984', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('4', '4', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('4', '4', '1', '1752', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('4', '4', '2', '2098', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('4', '4', '3', '2764', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('4', '4', '11', '58984', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('4', '5', '0', '585', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('4', '5', '1', '2050', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('4', '5', '2', '58984', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('4', '6', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('4', '6', '1', '49576', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('4', '6', '2', '45477', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('4', '6', '3', '45462', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('4', '6', '4', '45902', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('4', '6', '5', '47541', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('4', '6', '10', '58984', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('4', '6', '83', '58984', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('4', '11', '0', '5176', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('4', '11', '1', '5185', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('4', '11', '11', '58984', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('5', '1', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('5', '1', '72', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('5', '1', '73', '78', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('5', '1', '74', '20577', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('5', '1', '84', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('5', '1', '96', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('5', '1', '108', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('5', '4', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('5', '4', '1', '1752', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('5', '4', '2', '2098', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('5', '4', '3', '2764', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('5', '4', '4', '20577', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('5', '5', '0', '585', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('5', '5', '1', '2050', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('5', '5', '2', '20577', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('5', '6', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('5', '6', '1', '49576', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('5', '6', '2', '45477', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('5', '6', '3', '45462', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('5', '6', '4', '45902', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('5', '6', '5', '47541', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('5', '6', '10', '20577', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('5', '8', '0', '133', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('5', '8', '1', '168', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('5', '8', '2', '20577', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('5', '9', '0', '686', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('5', '9', '1', '687', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('5', '9', '2', '20577', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('6', '1', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('6', '1', '1', '78', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('6', '1', '3', '20549', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('6', '1', '72', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('6', '1', '73', '78', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('6', '1', '74', '20549', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('6', '1', '84', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('6', '1', '96', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('6', '1', '108', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('6', '3', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('6', '3', '1', '2973', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('6', '3', '2', '75', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('6', '3', '3', '20549', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('6', '3', '76', '20549', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('6', '6', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('6', '6', '1', '49576', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('6', '6', '2', '45477', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('6', '6', '3', '45462', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('6', '6', '4', '45902', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('6', '6', '5', '47541', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('6', '6', '10', '20549', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('6', '6', '75', '20549', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('6', '7', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('6', '7', '1', '403', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('6', '7', '2', '331', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('6', '7', '3', '20549', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('6', '7', '76', '20549', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('6', '11', '0', '5176', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('6', '11', '1', '5185', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('6', '11', '2', '20549', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('6', '11', '73', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('6', '11', '76', '20549', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('6', '11', '85', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('6', '11', '97', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('6', '11', '109', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('7', '1', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('7', '1', '1', '78', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('7', '1', '11', '20589', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('7', '1', '72', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('7', '1', '73', '78', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('7', '1', '82', '20589', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('7', '1', '84', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('7', '1', '96', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('7', '1', '108', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('7', '4', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('7', '4', '1', '1752', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('7', '4', '2', '2098', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('7', '4', '3', '2764', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('7', '4', '11', '20589', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('7', '6', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('7', '6', '1', '49576', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('7', '6', '2', '45477', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('7', '6', '3', '45462', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('7', '6', '4', '45902', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('7', '6', '5', '47541', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('7', '6', '10', '20589', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('7', '6', '83', '41751', '128'); +INSERT INTO `playercreateinfo_action` VALUES ('7', '6', '72', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('7', '6', '11', '41751', '128'); +INSERT INTO `playercreateinfo_action` VALUES ('7', '6', '84', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('7', '6', '96', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('7', '6', '108', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('7', '8', '0', '133', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('7', '8', '1', '168', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('7', '8', '11', '20589', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('7', '9', '0', '686', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('7', '9', '1', '687', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('7', '9', '11', '20589', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('8', '1', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('8', '1', '72', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('8', '1', '73', '78', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('8', '1', '74', '2764', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('8', '1', '75', '26296', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('8', '1', '84', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('8', '1', '96', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('8', '1', '108', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('8', '3', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('8', '3', '1', '2973', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('8', '3', '2', '75', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('8', '8', '2', '20554', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('8', '4', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('8', '4', '1', '1752', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('8', '4', '2', '2098', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('8', '4', '3', '2764', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('8', '4', '4', '26297', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('8', '5', '0', '585', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('8', '5', '1', '2050', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('8', '7', '3', '20554', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('8', '6', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('8', '6', '1', '49576', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('8', '6', '2', '45477', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('8', '6', '3', '45462', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('8', '6', '4', '45902', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('8', '6', '5', '47541', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('8', '6', '10', '50621', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('8', '7', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('8', '7', '1', '403', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('8', '7', '2', '331', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('8', '5', '2', '20554', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('8', '8', '0', '133', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('8', '8', '1', '168', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('8', '3', '3', '20554', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('10', '2', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('10', '2', '1', '21084', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('10', '2', '2', '635', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('10', '2', '3', '28730', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('10', '3', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('10', '3', '1', '2973', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('10', '3', '2', '75', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('10', '3', '3', '28730', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('10', '4', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('10', '4', '1', '1752', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('10', '4', '2', '2098', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('10', '4', '3', '2764', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('10', '4', '4', '25046', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('10', '5', '0', '585', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('10', '5', '1', '2050', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('10', '5', '2', '28730', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('10', '6', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('10', '6', '1', '49576', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('10', '6', '2', '45477', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('10', '6', '3', '45462', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('10', '6', '4', '45902', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('10', '6', '5', '47541', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('10', '6', '6', '50613', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('10', '8', '0', '133', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('10', '8', '1', '168', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('10', '8', '2', '28730', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('10', '9', '0', '686', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('10', '9', '1', '687', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('10', '9', '2', '28730', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '1', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '1', '72', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '1', '73', '78', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '1', '74', '28880', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '1', '84', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '1', '96', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '1', '108', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '2', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '2', '1', '21084', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '2', '2', '635', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '2', '3', '59542', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '3', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '3', '1', '2973', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '3', '2', '75', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '3', '3', '59543', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '3', '72', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '3', '73', '2973', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '3', '74', '75', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '5', '0', '585', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '5', '1', '2050', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '5', '2', '59544', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '6', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '6', '1', '49576', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '6', '2', '45477', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '6', '3', '45462', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '6', '4', '45902', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '6', '5', '47541', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '6', '10', '59545', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '7', '0', '6603', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '7', '1', '403', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '7', '2', '331', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '7', '3', '59547', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '8', '0', '133', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '8', '1', '168', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '8', '2', '59548', '0'); +INSERT INTO `playercreateinfo_action` VALUES ('11', '6', '11', '41751', '128'); diff --git a/sql/updates/3.3.2_old/7332_world_playercreateinfo_spell.sql b/sql/updates/3.3.2_old/7332_world_playercreateinfo_spell.sql new file mode 100644 index 00000000000..9735fab55fa --- /dev/null +++ b/sql/updates/3.3.2_old/7332_world_playercreateinfo_spell.sql @@ -0,0 +1,54 @@ +-- Add new start weapons as of 3.3 patch + +-- Warrior: Two-Handed Sword +DELETE FROM `playercreateinfo_spell` WHERE `class`=1 AND `Spell`=202; +INSERT INTO `playercreateinfo_spell` (`race`,`class`,`Spell`,`Note`) VALUES +(1,1,202, 'Two-Handed Swords'), +(4,1,202, 'Two-Handed Swords'), +(5,1,202, 'Two-Handed Swords'), +(7,1,202, 'Two-Handed Swords'), +(8,1,202, 'Two-Handed Swords'), +(11,1,202, 'Two-Handed Swords'); + +-- Hunter: Two-Handed Axe +DELETE FROM `playercreateinfo_spell` WHERE `class`=3 AND `Spell`=197; +INSERT INTO `playercreateinfo_spell` (`race`,`class`,`Spell`,`Note`) VALUES +(2,3,197, 'Two-Handed Axes'), +(3,3,197, 'Two-Handed Axes'), +(4,3,197, 'Two-Handed Axes'), +(6,3,197, 'Two-Handed Axes'), +(8,3,197, 'Two-Handed Axes'), +(10,3,197, 'Two-Handed Axes'), +(11,3,197, 'Two-Handed Axes'); + +-- Rogue: Dual Wield +DELETE FROM `playercreateinfo_spell` WHERE `class`=4 AND `Spell`=674; +INSERT INTO `playercreateinfo_spell` (`race`,`class`,`Spell`,`Note`) VALUES +(1,4,674, 'Dual Wield'), +(2,4,674, 'Dual Wield'), +(3,4,674, 'Dual Wield'), +(4,4,674, 'Dual Wield'), +(5,4,674, 'Dual Wield'), +(7,4,674, 'Dual Wield'), +(8,4,674, 'Dual Wield'), +(10,4,674, 'Dual Wield'); + +-- Priest: Staff +DELETE FROM `playercreateinfo_spell` WHERE `class`=5 AND `Spell`=227; +INSERT INTO `playercreateinfo_spell` (`race`,`class`,`Spell`,`Note`) VALUES +(1,5,227, 'Staves'), +(3,5,227, 'Staves'), +(4,5,227, 'Staves'), +(5,5,227, 'Staves'), +(8,5,227, 'Staves'), +(10,5,227, 'Staves'), +(11,5,227, 'Staves'); + +-- Warlock: Staff +DELETE FROM `playercreateinfo_spell` WHERE `class`=9 AND `Spell`=227; +INSERT INTO `playercreateinfo_spell` (`race`,`class`,`Spell`,`Note`) VALUES +(1,9,227, 'Staves'), +(2,9,227, 'Staves'), +(5,9,227, 'Staves'), +(7,9,227, 'Staves'), +(10,9,227, 'Staves'); diff --git a/sql/updates/3.3.2_old/7332_world_quest_poi.sql b/sql/updates/3.3.2_old/7332_world_quest_poi.sql new file mode 100644 index 00000000000..d101b778420 --- /dev/null +++ b/sql/updates/3.3.2_old/7332_world_quest_poi.sql @@ -0,0 +1,13 @@ +DROP TABLE IF EXISTS `quest_poi`; +CREATE TABLE `quest_poi` ( + `questId` int(10) UNSIGNED NOT NULL DEFAULT '0', + `id` int(10) UNSIGNED NOT NULL DEFAULT '0', + `objIndex` int(10) NOT NULL DEFAULT '0', + `mapid` int(10) UNSIGNED NOT NULL DEFAULT '0', + `WorldMapAreaId` int(10) UNSIGNED NOT NULL DEFAULT '0', + `FloorId` int(10) UNSIGNED NOT NULL DEFAULT '0', + `unk3` int(10) UNSIGNED NOT NULL DEFAULT '0', + `unk4` int(10) UNSIGNED NOT NULL DEFAULT '0', + KEY `questId` (`questId`,`id`), + KEY `id` (`id`,`questId`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci; diff --git a/sql/updates/3.3.2_old/7332_world_quest_poi_points.sql b/sql/updates/3.3.2_old/7332_world_quest_poi_points.sql new file mode 100644 index 00000000000..4c21abc7016 --- /dev/null +++ b/sql/updates/3.3.2_old/7332_world_quest_poi_points.sql @@ -0,0 +1,8 @@ +DROP TABLE IF EXISTS `quest_poi_points`; +CREATE TABLE `quest_poi_points` ( + `questId` int(10) UNSIGNED NOT NULL DEFAULT '0', + `id` int(10) UNSIGNED NOT NULL DEFAULT '0', + `x` int(10) NOT NULL DEFAULT '0', + `y` int(10) NOT NULL DEFAULT '0', + KEY `questId_id` (`questId`,`id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci; diff --git a/sql/updates/3.3.2_old/7332_world_quest_template.sql b/sql/updates/3.3.2_old/7332_world_quest_template.sql new file mode 100644 index 00000000000..ae4d729642c --- /dev/null +++ b/sql/updates/3.3.2_old/7332_world_quest_template.sql @@ -0,0 +1,15 @@ +-- Update quest_template table for 3.3.0 +ALTER TABLE `quest_template` ADD `RewXPId` TINYINT(2) UNSIGNED NOT NULL DEFAULT '0' AFTER `NextQuestInChain`; +ALTER TABLE `quest_template` ADD `RewHonorMultiplier` FLOAT NOT NULL DEFAULT '1' AFTER `RewHonorableKills`; +ALTER TABLE `quest_template` ADD `RewardArenaPoints` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `BonusTalents`; +ALTER TABLE `quest_template` ADD `unk0` TINYINT(2) UNSIGNED NOT NULL DEFAULT '0' AFTER `RewHonorMultiplier`; +ALTER TABLE `quest_template` ADD `RewRepValueId1` MEDIUMINT(6) NOT NULL DEFAULT '0' AFTER `RewRepFaction5`; +ALTER TABLE `quest_template` ADD `RewRepValueId2` MEDIUMINT(6) NOT NULL DEFAULT '0' AFTER `RewRepValueId1`; +ALTER TABLE `quest_template` ADD `RewRepValueId3` MEDIUMINT(6) NOT NULL DEFAULT '0' AFTER `RewRepValueId2`; +ALTER TABLE `quest_template` ADD `RewRepValueId4` MEDIUMINT(6) NOT NULL DEFAULT '0' AFTER `RewRepValueId3`; +ALTER TABLE `quest_template` ADD `RewRepValueId5` MEDIUMINT(6) NOT NULL DEFAULT '0' AFTER `RewRepValueId4`; + +ALTER TABLE `quest_template` ADD `CompletionText` TEXT NULL DEFAULT NULL AFTER `EndText`; + +ALTER TABLE `quest_template` ADD `WDBVerified` SMALLINT(5) SIGNED DEFAULT 0 AFTER `CompleteScript`; +ALTER TABLE `quest_template` CHANGE COLUMN `RewHonorableKills` `RewHonorAddition` int(10) NOT NULL default '0'; diff --git a/sql/updates/3.3.2_old/7332_world_scriptname.sql b/sql/updates/3.3.2_old/7332_world_scriptname.sql new file mode 100644 index 00000000000..2ca443acfb6 --- /dev/null +++ b/sql/updates/3.3.2_old/7332_world_scriptname.sql @@ -0,0 +1,2 @@ +UPDATE creature_template SET ScriptName='boss_algalon' WHERE entry=32871; +UPDATE creature_template SET ScriptName='mob_collapsing_star' WHERE entry=32955; diff --git a/sql/updates/3.3.2_old/7332_world_spell_bonus_data.sql b/sql/updates/3.3.2_old/7332_world_spell_bonus_data.sql new file mode 100644 index 00000000000..62a57b01cd8 --- /dev/null +++ b/sql/updates/3.3.2_old/7332_world_spell_bonus_data.sql @@ -0,0 +1,5 @@ +UPDATE `spell_bonus_data` SET `ap_bonus`=0.15 WHERE `entry`=60089; +DELETE FROM `spell_bonus_data` WHERE `entry`=52042; +INSERT INTO `spell_bonus_data` (`entry`,`direct_bonus`,`dot_bonus`,`ap_bonus`,`ap_dot_bonus`,`comments`) VALUES (52042,-1,-1,-1,-1,'Shaman - Healing Stream Totem Triggered Heal'); + +DELETE FROM `spell_bonus_data` WHERE `entry` IN (8443,8504,8505,11310,11311,25538,25539,61651,61660); diff --git a/sql/updates/3.3.2_old/7332_world_spell_proc_event.sql b/sql/updates/3.3.2_old/7332_world_spell_proc_event.sql new file mode 100644 index 00000000000..53aef7698bc --- /dev/null +++ b/sql/updates/3.3.2_old/7332_world_spell_proc_event.sql @@ -0,0 +1,32 @@ +DELETE FROM `spell_proc_event` WHERE `entry` IN (49194); +INSERT INTO `spell_proc_event` VALUES +(49194, 0x00, 15, 0x00002000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0); + +DELETE FROM `spell_proc_event` WHERE `entry` IN (31656, 31657, 31658); +INSERT INTO `spell_proc_event` VALUES +(31656, 4, 3, 0x8000000, 0, 0, 0, 0, 0, 0, 0), +(31657, 4, 3, 0x8000000, 0, 0, 0, 0, 0, 0, 0), +(31658, 4, 3, 0x8000000, 0, 0, 0, 0, 0, 0, 0); + +DELETE FROM `spell_proc_event` WHERE entry = 67356; +INSERT INTO `spell_proc_event` VALUES (67356, 8, 7, 0x10, 0, 0, 0, 0, 0, 0, 0); + +DELETE FROM `spell_proc_event` WHERE `entry` IN (47245,47246,47247); +INSERT INTO `spell_proc_event` VALUES +(47245, 0x00, 5, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0.000000, 0.000000, 0), +(47246, 0x00, 5, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0.000000, 0.000000, 0), +(47247, 0x00, 5, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0.000000, 0.000000, 0); + +DELETE FROM `spell_proc_event` WHERE `entry` IN +(58631,55668,55669,55670,63320); + +DELETE FROM `spell_proc_event` WHERE `entry` IN (20375,21084,31801); +INSERT INTO `spell_proc_event` VALUES +(20375, 0x00000001, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 1), +(21084, 0x00000001, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0), +(31801, 0x00000001, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0.000000, 0.000000, 0); + +DELETE FROM `spell_proc_event` WHERE `entry` IN (51524,51523); +INSERT INTO `spell_proc_event` (`entry`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `procFlags`, `procEx`, `ppmRate`, `CustomChance`, `Cooldown`) VALUES ('51524', '0', '11', '0', '1', '0', '65536', '0', '0', '50', '0'); +INSERT INTO `spell_proc_event` (`entry`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `procFlags`, `procEx`, `ppmRate`, `CustomChance`, `Cooldown`) VALUES ('51523', '0', '11', '0', '1', '0', '65536', '0', '0', '50', '0'); + diff --git a/sql/updates/3.3.2_old/7332_world_spell_ranks.sql b/sql/updates/3.3.2_old/7332_world_spell_ranks.sql new file mode 100644 index 00000000000..93c6c992dbf --- /dev/null +++ b/sql/updates/3.3.2_old/7332_world_spell_ranks.sql @@ -0,0 +1,6857 @@ +TRUNCATE TABLE spell_ranks; +INSERT INTO spell_ranks (`first_spell_id`, `spell_id`, `rank`) VALUES + -- Abomination's Might +(53137, 53137, 1), +(53137, 53138, 2), + -- Absolution +(33167, 33167, 1), +(33167, 33171, 2), +(33167, 33172, 3), + -- Acclimation +(49200, 49200, 1), +(49200, 50151, 2), +(49200, 50152, 3), + -- Acid Spit +(55749, 55749, 1), +(55749, 55750, 2), +(55749, 55751, 3), +(55749, 55752, 4), +(55749, 55753, 5), +(55749, 55754, 6), + -- Aftermath +(18119, 18119, 1), +(18119, 18120, 2), + -- Aggression +(18427, 18427, 1), +(18427, 18428, 2), +(18427, 18429, 3), +(18427, 61330, 4), +(18427, 61331, 5), + -- Agility +(8115, 8115, 1), +(8115, 8116, 2), +(8115, 8117, 3), +(8115, 12174, 4), +(8115, 33077, 5), +(8115, 43194, 6), +(8115, 58450, 7), +(8115, 58451, 8), + -- Aimed Shot +(19434, 19434, 1), +(19434, 20900, 2), +(19434, 20901, 3), +(19434, 20902, 4), +(19434, 20903, 5), +(19434, 20904, 6), +(19434, 27065, 7), +(19434, 49049, 8), +(19434, 49050, 9), + -- Alchemy +(2259, 2259, 1), +(2259, 3101, 2), +(2259, 3464, 3), +(2259, 11611, 4), +(2259, 28596, 5), +(2259, 51304, 6), + -- Ambush +(8676, 8676, 1), +(8676, 8724, 2), +(8676, 8725, 3), +(8676, 11267, 4), +(8676, 11268, 5), +(8676, 11269, 6), +(8676, 27441, 7), +(8676, 48689, 8), +(8676, 48690, 9), +(8676, 48691, 10), + -- Amplify Magic +(1267, 1267, 1), +(1267, 8456, 2), +(1267, 10171, 3), +(1267, 10172, 4), +(1267, 27397, 5), +(1267, 33947, 6), + -- Amplify Magic +(1008, 1008, 1), +(1008, 8455, 2), +(1008, 10169, 3), +(1008, 10170, 4), +(1008, 27130, 5), +(1008, 33946, 6), +(1008, 43017, 7), + -- Ancestral Awakening +(51556, 51556, 1), +(51556, 51557, 2), +(51556, 51558, 3), + -- Ancestral Fortitude +(16177, 16177, 1), +(16177, 16236, 2), +(16177, 16237, 3), + -- Ancestral Healing +(16176, 16176, 1), +(16176, 16235, 2), +(16176, 16240, 3), + -- Ancestral Knowledge +(17485, 17485, 1), +(17485, 17486, 2), +(17485, 17487, 3), +(17485, 17488, 4), +(17485, 17489, 5), + -- Ancestral Spirit +(2008, 2008, 1), +(2008, 20609, 2), +(2008, 20610, 3), +(2008, 20776, 4), +(2008, 20777, 5), +(2008, 25590, 6), +(2008, 49277, 7), + -- Anguish +(33704, 33704, 1), +(33704, 33705, 2), +(33704, 33706, 3), + -- Anguish +(33698, 33698, 1), +(33698, 33699, 2), +(33698, 33700, 3), +(33698, 47993, 4), + -- Animal Handler +(34453, 34453, 1), +(34453, 34454, 2), + -- Annihilation +(51468, 51468, 1), +(51468, 51472, 2), +(51468, 51473, 3), + -- Anticipation +(12297, 12297, 1), +(12297, 12750, 2), +(12297, 12751, 3), +(12297, 12752, 4), +(12297, 12753, 5), + -- Anticipation +(20096, 20096, 1), +(20096, 20097, 2), +(20096, 20098, 3), +(20096, 20099, 4), +(20096, 20100, 5), + -- Anticipation +(16254, 16254, 1), +(16254, 16271, 2), +(16254, 16272, 3), + -- Anticipation +(55129, 55129, 1), +(55129, 55130, 2), +(55129, 55131, 3), +(55129, 55132, 4), +(55129, 55133, 5), + -- Arcane Barrage +(44425, 44425, 1), +(44425, 44780, 2), +(44425, 44781, 3), + -- Arcane Blast +(30451, 30451, 1), +(30451, 42894, 2), +(30451, 42896, 3), +(30451, 42897, 4), + -- Arcane Brilliance +(23028, 23028, 1), +(23028, 27127, 2), +(23028, 43002, 3), + -- Arcane Concentration +(11213, 11213, 1), +(11213, 12574, 2), +(11213, 12575, 3), +(11213, 12576, 4), +(11213, 12577, 5), + -- Arcane Empowerment +(31579, 31579, 1), +(31579, 31582, 2), +(31579, 31583, 3), + -- Arcane Explosion +(1449, 1449, 1), +(1449, 8437, 2), +(1449, 8438, 3), +(1449, 8439, 4), +(1449, 10201, 5), +(1449, 10202, 6), +(1449, 27080, 7), +(1449, 27082, 8), +(1449, 42920, 9), +(1449, 42921, 10), + -- Arcane Flows +(44378, 44378, 1), +(44378, 44379, 2), + -- Arcane Focus +(11222, 11222, 1), +(11222, 12839, 2), +(11222, 12840, 3), + -- Arcane Fortitude +(28574, 28574, 1), +(28574, 54658, 2), +(28574, 54659, 3), + -- Arcane Instability +(15058, 15058, 1), +(15058, 15059, 2), +(15058, 15060, 3), + -- Arcane Intellect +(1459, 1459, 1), +(1459, 1460, 2), +(1459, 1461, 3), +(1459, 10156, 4), +(1459, 10157, 5), +(1459, 27126, 6), +(1459, 42995, 7), + -- Arcane Mastery +(16734, 16734, 1), +(16734, 16735, 2), +(16734, 16736, 3), +(16734, 16737, 4), +(16734, 16738, 5), + -- Arcane Meditation +(18462, 18462, 1), +(18462, 18463, 2), +(18462, 18464, 3), + -- Arcane Mind +(11232, 11232, 1), +(11232, 12500, 2), +(11232, 12501, 3), +(11232, 12502, 4), +(11232, 12503, 5), + -- Arcane Potency +(31571, 31571, 1), +(31571, 31572, 2), + -- Arcane Shielding +(11252, 11252, 1), +(11252, 12605, 2), + -- Arcane Shot +(3044, 3044, 1), +(3044, 14281, 2), +(3044, 14282, 3), +(3044, 14283, 4), +(3044, 14284, 5), +(3044, 14285, 6), +(3044, 14286, 7), +(3044, 14287, 8), +(3044, 27019, 9), +(3044, 49044, 10), +(3044, 49045, 11), + -- Arcane Stability +(11237, 11237, 1), +(11237, 12463, 2), +(11237, 12464, 3), +(11237, 16769, 4), +(11237, 16770, 5), + -- Arcane Subtlety +(11210, 11210, 1), +(11210, 12592, 2), + -- Arctic Reach +(16757, 16757, 1), +(16757, 16758, 2), + -- Arctic Winds +(31674, 31674, 1), +(31674, 31675, 2), +(31674, 31676, 3), +(31674, 31677, 4), +(31674, 31678, 5), + -- Ardent Defender +(31850, 31850, 1), +(31850, 31851, 2), +(31850, 31852, 3), + -- Armor +(8091, 8091, 1), +(8091, 8094, 2), +(8091, 8095, 3), +(8091, 12175, 4), +(8091, 33079, 5), +(8091, 43196, 6), +(8091, 58452, 7), +(8091, 58453, 8), + -- Armored to the Teeth +(61216, 61216, 1), +(61216, 61221, 2), +(61216, 61222, 3), + -- Aspect of the Dragonhawk +(61846, 61846, 1), +(61846, 61847, 2), + -- Aspect of the Hawk +(13165, 13165, 1), +(13165, 14318, 2), +(13165, 14319, 3), +(13165, 14320, 4), +(13165, 14321, 5), +(13165, 14322, 6), +(13165, 25296, 7), +(13165, 27044, 8), + -- Aspect of the Wild +(20043, 20043, 1), +(20043, 20190, 2), +(20043, 27045, 3), +(20043, 49071, 4), + -- Aspiration +(47507, 47507, 1), +(47507, 47508, 2), + -- Astral Shift +(51474, 51474, 1), +(51474, 51478, 2), +(51474, 51479, 3), + -- Avenger's Shield +(31935, 31935, 1), +(31935, 32699, 2), +(31935, 32700, 3), +(31935, 48826, 4), +(31935, 48827, 5), + -- Backdraft +(47258, 47258, 1), +(47258, 47259, 2), +(47258, 47260, 3), + -- Backlash +(34935, 34935, 1), +(34935, 34938, 2), +(34935, 34939, 3), + -- Backstab +(53, 53, 1), +(53, 2589, 2), +(53, 2590, 3), +(53, 2591, 4), +(53, 8721, 5), +(53, 11279, 6), +(53, 11280, 7), +(53, 11281, 8), +(53, 25300, 9), +(53, 26863, 10), +(53, 48656, 11), +(53, 48657, 12), + -- Bad Attitude +(50433, 50433, 1), +(50433, 52395, 2), +(50433, 52396, 3), +(50433, 52397, 4), +(50433, 52398, 5), +(50433, 52399, 6), + -- Balance of Power +(33592, 33592, 1), +(33592, 33596, 2), + -- Bane +(17788, 17788, 1), +(17788, 17789, 2), +(17788, 17790, 3), +(17788, 17791, 4), +(17788, 17792, 5), + -- Banish +(710, 710, 1), +(710, 18647, 2), + -- Barrage +(19461, 19461, 1), +(19461, 19462, 2), +(19461, 24691, 3), + -- Bash +(5211, 5211, 1), +(5211, 6798, 2), +(5211, 8983, 3), + -- Battle Shout +(6673, 6673, 1), +(6673, 5242, 2), +(6673, 6192, 3), +(6673, 11549, 4), +(6673, 11550, 5), +(6673, 11551, 6), +(6673, 25289, 7), +(6673, 2048, 8), +(6673, 47436, 9), + -- Benediction +(20101, 20101, 1), +(20101, 20102, 2), +(20101, 20103, 3), +(20101, 20104, 4), +(20101, 20105, 5), + -- Bestial Discipline +(19590, 19590, 1), +(19590, 19592, 2), + -- Bestial Fury +(19603, 19603, 1), +(19603, 19605, 2), +(19603, 19606, 3), +(19603, 19607, 4), +(19603, 19608, 5), + -- Binding Heal +(32546, 32546, 1), +(32546, 48119, 2), +(32546, 48120, 3), + -- Bite +(17254, 17254, 1), +(17254, 17262, 2), +(17254, 17263, 3), +(17254, 17264, 4), +(17254, 17265, 5), +(17254, 17266, 6), +(17254, 17267, 7), +(17254, 17268, 8), +(17254, 27348, 9), + -- Bite +(17253, 17253, 1), +(17253, 17255, 2), +(17253, 17256, 3), +(17253, 17257, 4), +(17253, 17258, 5), +(17253, 17259, 6), +(17253, 17260, 7), +(17253, 17261, 8), +(17253, 27050, 9), +(17253, 52473, 10), +(17253, 52474, 11), + -- Black Arrow +(3674, 3674, 1), +(3674, 63668, 2), +(3674, 63669, 3), +(3674, 63670, 4), +(3674, 63671, 5), +(3674, 63672, 6), + -- Black Ice +(49140, 49140, 1), +(49140, 49661, 2), +(49140, 49662, 3), +(49140, 49663, 4), +(49140, 49664, 5), + -- Blacksmithing +(2018, 2018, 1), +(2018, 3100, 2), +(2018, 3538, 3), +(2018, 9785, 4), +(2018, 29844, 5), +(2018, 51300, 6), + -- Blade Barrier +(51789, 51789, 1), +(51789, 64855, 2), +(51789, 64856, 3), +(51789, 64858, 4), +(51789, 64859, 5), + -- Blade Barrier +(49182, 49182, 1), +(49182, 49500, 2), +(49182, 49501, 3), +(49182, 55225, 4), +(49182, 55226, 5), + -- Blade Twisting +(31124, 31124, 1), +(31124, 31126, 2), + -- Bladed Armor +(48978, 48978, 1), +(48978, 49390, 2), +(48978, 49391, 3), +(48978, 49392, 4), +(48978, 49393, 5), + -- Blast Wave +(11113, 11113, 1), +(11113, 13018, 2), +(11113, 13019, 3), +(11113, 13020, 4), +(11113, 13021, 5), +(11113, 27133, 6), +(11113, 33933, 7), +(11113, 42944, 8), +(11113, 42945, 9), + -- Blazing Speed +(31641, 31641, 1), +(31641, 31642, 2), + -- Blessed Hands +(53660, 53660, 1), +(53660, 53661, 2), + -- Blessed Life +(31828, 31828, 1), +(31828, 31829, 2), +(31828, 31830, 3), + -- Blessing of Might +(19740, 19740, 1), +(19740, 19834, 2), +(19740, 19835, 3), +(19740, 19836, 4), +(19740, 19837, 5), +(19740, 19838, 6), +(19740, 25291, 7), +(19740, 27140, 8), +(19740, 48931, 9), +(19740, 48932, 10), + -- Blessing of the Eternals +(51554, 51554, 1), +(51554, 51555, 2), + -- Blessing of Wisdom +(19742, 19742, 1), +(19742, 19850, 2), +(19742, 19852, 3), +(19742, 19853, 4), +(19742, 19854, 5), +(19742, 25290, 6), +(19742, 27142, 7), +(19742, 48935, 8), +(19742, 48936, 9), + -- Blood Boil +(48721, 48721, 1), +(48721, 49939, 2), +(48721, 49940, 3), +(48721, 49941, 4), + -- Blood Craze +(16487, 16487, 1), +(16487, 16489, 2), +(16487, 16492, 3), + -- Blood Frenzy +(30069, 30069, 1), +(30069, 30070, 2), + -- Blood Frenzy +(29836, 29836, 1), +(29836, 29859, 2), + -- Blood Frenzy +(16952, 16952, 1), +(16952, 16954, 2), + -- Blood of Icewater +(50122, 50122, 1), +(50122, 50123, 2), +(50122, 50124, 3), +(50122, 50125, 4), +(50122, 50126, 5), + -- Blood of the North +(54639, 54639, 1), +(54639, 54638, 2), +(54639, 54637, 3), + -- Blood of the Rhino +(53481, 53481, 1), +(53481, 53482, 2), + -- Blood Pact +(6307, 6307, 1), +(6307, 7804, 2), +(6307, 7805, 3), +(6307, 11766, 4), +(6307, 11767, 5), +(6307, 27268, 6), +(6307, 47982, 7), + -- Blood Spatter +(51632, 51632, 1), +(51632, 51633, 2), + -- Blood-Caked Blade +(49219, 49219, 1), +(49219, 49627, 2), +(49219, 49628, 3), + -- Bloodsurge +(46913, 46913, 1), +(46913, 46914, 2), +(46913, 46915, 3), + -- Bloodthirsty +(53186, 53186, 1), +(53186, 53187, 2), + -- Bloodworms +(49027, 49027, 1), +(49027, 49542, 2), +(49027, 49543, 3), + -- Bloody Strikes +(48977, 48977, 1), +(48977, 49394, 2), +(48977, 49395, 3), + -- Bloody Vengeance +(48988, 48988, 1), +(48988, 49503, 2), +(48988, 49504, 3), + -- Body and Soul +(64127, 64127, 1), +(64127, 64129, 2), + -- Booming Echoes +(63370, 63370, 1), +(63370, 63372, 2), + -- Booming Voice +(12321, 12321, 1), +(12321, 12835, 2), + -- Borrowed Time +(52795, 52795, 1), +(52795, 52797, 2), +(52795, 52798, 3), +(52795, 52799, 4), +(52795, 52800, 5), + -- Brain Freeze +(44546, 44546, 1), +(44546, 44548, 2), +(44546, 44549, 3), + -- Brambles +(16836, 16836, 1), +(16836, 16839, 2), +(16836, 16840, 3), + -- Brutal Impact +(16940, 16940, 1), +(16940, 16941, 2), + -- Burning Determination +(54747, 54747, 1), +(54747, 54749, 2), + -- Burning Soul +(11083, 11083, 1), +(11083, 12351, 2), + -- Burnout +(44449, 44449, 1), +(44449, 44469, 2), +(44449, 44470, 3), +(44449, 44471, 4), +(44449, 44472, 5), + -- Butchery +(48979, 48979, 1), +(48979, 49483, 2), + -- Call of Flame +(16038, 16038, 1), +(16038, 16160, 2), +(16038, 16161, 3), + -- Camouflage +(13975, 13975, 1), +(13975, 14062, 2), +(13975, 14063, 3), + -- Careful Aim +(34482, 34482, 1), +(34482, 34483, 2), +(34482, 34484, 3), + -- Cataclysm +(17778, 17778, 1), +(17778, 17779, 2), +(17778, 17780, 3), + -- Catlike Reflexes +(34462, 34462, 1), +(34462, 34464, 2), +(34462, 34465, 3), + -- Celestial Focus +(16850, 16850, 1), +(16850, 16923, 2), +(16850, 16924, 3), + -- Chain Heal +(1064, 1064, 1), +(1064, 10622, 2), +(1064, 10623, 3), +(1064, 25422, 4), +(1064, 25423, 5), +(1064, 55458, 6), +(1064, 55459, 7), + -- Chains of Ice +(113, 113, 1), +(113, 512, 2), + -- Chaos Bolt +(50796, 50796, 1), +(50796, 59170, 2), +(50796, 59171, 3), +(50796, 59172, 4), + -- Charge +(100, 100, 1), +(100, 6178, 2), +(100, 11578, 3), + -- Charge Rage Bonus Effect +(12695, 12695, 1), +(12695, 12696, 2), + -- Cheat Death +(31228, 31228, 1), +(31228, 31229, 2), +(31228, 31230, 3), + -- Chilblains +(50040, 50040, 1), +(50040, 50041, 2), +(50040, 50043, 3), + -- Chill of the Grave +(49149, 49149, 1), +(49149, 50115, 2), + -- Chilled +(12484, 12484, 1), +(12484, 12485, 2), +(12484, 12486, 3), + -- Chilled to the Bone +(44566, 44566, 1), +(44566, 44567, 2), +(44566, 44568, 3), +(44566, 44570, 4), +(44566, 44571, 5), + -- Circle of Healing +(34861, 34861, 1), +(34861, 34863, 2), +(34861, 34864, 3), +(34861, 34865, 4), +(34861, 34866, 5), +(34861, 48088, 6), +(34861, 48089, 7), + -- Claw +(1082, 1082, 1), +(1082, 3029, 2), +(1082, 5201, 3), +(1082, 9849, 4), +(1082, 9850, 5), +(1082, 27000, 6), +(1082, 48569, 7), +(1082, 48570, 8), + -- Claw +(16827, 16827, 1), +(16827, 16828, 2), +(16827, 16829, 3), +(16827, 16830, 4), +(16827, 16831, 5), +(16827, 16832, 6), +(16827, 3010, 7), +(16827, 3009, 8), +(16827, 27049, 9), +(16827, 52471, 10), +(16827, 52472, 11), + -- Cleave +(30214, 30214, 1), +(30214, 30222, 2), +(30214, 30224, 3), + -- Cleave +(845, 845, 1), +(845, 7369, 2), +(845, 11608, 3), +(845, 11609, 4), +(845, 20569, 5), +(845, 25231, 6), +(845, 47519, 7), +(845, 47520, 8), + -- Cleave +(30213, 30213, 1), +(30213, 30219, 2), +(30213, 30223, 3), +(30213, 47994, 4), + -- Cleave Armor +(5508, 5508, 1), +(5508, 5480, 2), + -- Close Quarters Combat +(13706, 13706, 1), +(13706, 13804, 2), +(13706, 13805, 3), +(13706, 13806, 4), +(13706, 13807, 5), + -- Cobra Reflexes +(61682, 61682, 1), +(61682, 61683, 2), + -- Cobra Strikes +(53256, 53256, 1), +(53256, 53259, 2), +(53256, 53260, 3), + -- Cold as Ice +(55091, 55091, 1), +(55091, 55092, 2), + -- Combat Endurance +(17427, 17427, 1), +(17427, 17428, 2), +(17427, 17429, 3), + -- Combat Experience +(34475, 34475, 1), +(34475, 34476, 2), + -- Combat Expertise +(31858, 31858, 1), +(31858, 31859, 2), +(31858, 31860, 3), + -- Combat Potency +(35542, 35542, 1), +(35542, 35545, 2), +(35542, 35546, 3), +(35542, 35547, 4), +(35542, 35548, 5), + -- Combat Potency +(35541, 35541, 1), +(35541, 35550, 2), +(35541, 35551, 3), +(35541, 35552, 4), +(35541, 35553, 5), + -- Commanding Presence +(12318, 12318, 1), +(12318, 12857, 2), +(12318, 12858, 3), +(12318, 12860, 4), +(12318, 12861, 5), + -- Commanding Shout +(469, 469, 1), +(469, 47439, 2), +(469, 47440, 3), + -- Concussion +(16035, 16035, 1), +(16035, 16105, 2), +(16035, 16106, 3), +(16035, 16107, 4), +(16035, 16108, 5), + -- Concussive Barrage +(35100, 35100, 1), +(35100, 35102, 2), + -- Cone of Cold +(120, 120, 1), +(120, 8492, 2), +(120, 10159, 3), +(120, 10160, 4), +(120, 10161, 5), +(120, 27087, 6), +(120, 42930, 7), +(120, 42931, 8), + -- Conjure Food +(587, 587, 1), +(587, 597, 2), +(587, 990, 3), +(587, 6129, 4), +(587, 10144, 5), +(587, 10145, 6), +(587, 28612, 7), +(587, 33717, 8), + -- Conjure Mana Gem +(759, 759, 1), +(759, 3552, 2), +(759, 10053, 3), +(759, 10054, 4), +(759, 27101, 5), +(759, 42985, 6), + -- Conjure Refreshment +(42955, 42955, 1), +(42955, 42956, 2), + -- Conjure Water +(5504, 5504, 1), +(5504, 5505, 2), +(5504, 5506, 3), +(5504, 6127, 4), +(5504, 10138, 5), +(5504, 10139, 6), +(5504, 10140, 7), +(5504, 37420, 8), +(5504, 27090, 9), + -- Consecration +(26573, 26573, 1), +(26573, 20116, 2), +(26573, 20922, 3), +(26573, 20923, 4), +(26573, 20924, 5), +(26573, 27173, 6), +(26573, 48818, 7), +(26573, 48819, 8), + -- Consume Shadows +(17767, 17767, 1), +(17767, 17850, 2), +(17767, 17851, 3), +(17767, 17852, 4), +(17767, 17853, 5), +(17767, 17854, 6), +(17767, 27272, 7), +(17767, 47987, 8), +(17767, 47988, 9), + -- Contagion +(30060, 30060, 1), +(30060, 30061, 2), +(30060, 30062, 3), +(30060, 30063, 4), +(30060, 30064, 5), + -- Convection +(16039, 16039, 1), +(16039, 16109, 2), +(16039, 16110, 3), +(16039, 16111, 4), +(16039, 16112, 5), + -- Conviction +(20117, 20117, 1), +(20117, 20118, 2), +(20117, 20119, 3), +(20117, 20120, 4), +(20117, 20121, 5), + -- Cooking +(2550, 2550, 1), +(2550, 3102, 2), +(2550, 3413, 3), +(2550, 18260, 4), +(2550, 33359, 5), +(2550, 51296, 6), + -- Cornered +(52234, 52234, 1), +(52234, 53497, 2), + -- Corpse Explosion +(49158, 49158, 1), +(49158, 51325, 2), +(49158, 51326, 3), +(49158, 51327, 4), +(49158, 51328, 5), + -- Corruption +(172, 172, 1), +(172, 6222, 2), +(172, 6223, 3), +(172, 7648, 4), +(172, 11671, 5), +(172, 11672, 6), +(172, 25311, 7), +(172, 27216, 8), +(172, 47812, 9), +(172, 47813, 10), + -- Counterattack +(19306, 19306, 1), +(19306, 20909, 2), +(19306, 20910, 3), +(19306, 27067, 4), +(19306, 48998, 5), +(19306, 48999, 6), + -- Cower +(8998, 8998, 1), +(8998, 9000, 2), +(8998, 9892, 3), +(8998, 31709, 4), +(8998, 27004, 5), +(8998, 48575, 6), + -- Create Firestone +(6366, 6366, 1), +(6366, 17951, 2), +(6366, 17952, 3), +(6366, 17953, 4), +(6366, 27250, 5), +(6366, 60219, 6), +(6366, 60220, 7), + -- Create Healthstone +(6201, 6201, 1), +(6201, 6202, 2), +(6201, 5699, 3), +(6201, 11729, 4), +(6201, 11730, 5), +(6201, 27230, 6), +(6201, 47871, 7), +(6201, 47878, 8), + -- Create Soulstone +(693, 693, 1), +(693, 20752, 2), +(693, 20755, 3), +(693, 20756, 4), +(693, 20757, 5), +(693, 27238, 6), +(693, 47884, 7), + -- Create Spellstone +(2362, 2362, 1), +(2362, 17727, 2), +(2362, 17728, 3), +(2362, 28172, 4), +(2362, 47886, 5), +(2362, 47888, 6), + -- Critical Block +(47294, 47294, 1), +(47294, 47295, 2), +(47294, 47296, 3), + -- Critical Mass +(11115, 11115, 1), +(11115, 11367, 2), +(11115, 11368, 3), + -- Cruelty +(12320, 12320, 1), +(12320, 12852, 2), +(12320, 12853, 3), +(12320, 12855, 4), +(12320, 12856, 5), + -- Crusade +(31866, 31866, 1), +(31866, 31867, 2), +(31866, 31868, 3), + -- Crypt Fever +(49032, 49032, 1), +(49032, 49631, 2), +(49032, 49632, 3), + -- Culling the Herd +(61680, 61680, 1), +(61680, 61681, 2), +(61680, 52858, 3), + -- Curse of Agony +(980, 980, 1), +(980, 1014, 2), +(980, 6217, 3), +(980, 11711, 4), +(980, 11712, 5), +(980, 11713, 6), +(980, 27218, 7), +(980, 47863, 8), +(980, 47864, 9), + -- Curse of Doom +(603, 603, 1), +(603, 30910, 2), +(603, 47867, 3), + -- Curse of the Elements +(1490, 1490, 1), +(1490, 11721, 2), +(1490, 11722, 3), +(1490, 27228, 4), +(1490, 47865, 5), + -- Curse of Tongues +(1714, 1714, 1), +(1714, 11719, 2), + -- Curse of Weakness +(702, 702, 1), +(702, 1108, 2), +(702, 6205, 3), +(702, 7646, 4), +(702, 11707, 5), +(702, 11708, 6), +(702, 27224, 7), +(702, 30909, 8), +(702, 50511, 9), + -- Cut to the Chase +(51664, 51664, 1), +(51664, 51665, 2), +(51664, 51667, 3), +(51664, 51668, 4), +(51664, 51669, 5), + -- Damage Shield +(58872, 58872, 1), +(58872, 58874, 2), + -- Dampen Magic +(1266, 1266, 1), +(1266, 8452, 2), +(1266, 8453, 3), +(1266, 10175, 4), +(1266, 10176, 5), + -- Dampen Magic +(604, 604, 1), +(604, 8450, 2), +(604, 8451, 3), +(604, 10173, 4), +(604, 10174, 5), +(604, 33944, 6), +(604, 43015, 7), + -- Dark Conviction +(48987, 48987, 1), +(48987, 49477, 2), +(48987, 49478, 3), +(48987, 49479, 4), +(48987, 49480, 5), + -- Dark Pact +(18220, 18220, 1), +(18220, 18937, 2), +(18220, 18938, 3), +(18220, 27265, 4), +(18220, 59092, 5), + -- Darkness +(15259, 15259, 1), +(15259, 15307, 2), +(15259, 15308, 3), +(15259, 15309, 4), +(15259, 15310, 5), + -- Dash +(1850, 1850, 1), +(1850, 9821, 2), +(1850, 33357, 3), + -- Deadened Nerves +(31380, 31380, 1), +(31380, 31382, 2), +(31380, 31383, 3), + -- Deadliness +(30902, 30902, 1), +(30902, 30903, 2), +(30902, 30904, 3), +(30902, 30905, 4), +(30902, 30906, 5), + -- Deadly Brew +(51625, 51625, 1), +(51625, 51626, 2), + -- Deadly Throw +(26679, 26679, 1), +(26679, 48673, 2), +(26679, 48674, 3), + -- Death and Decay +(43265, 43265, 1), +(43265, 49936, 2), +(43265, 49937, 3), +(43265, 49938, 4), + -- Death Coil +(6789, 6789, 1), +(6789, 17925, 2), +(6789, 17926, 3), +(6789, 27223, 4), +(6789, 47859, 5), +(6789, 47860, 6), + -- Death Coil +(62900, 62900, 1), +(62900, 62901, 2), +(62900, 62902, 3), +(62900, 62903, 4), +(62900, 62904, 5), + -- Death Strike +(49998, 49998, 1), +(49998, 49999, 2), +(49998, 45463, 3), +(49998, 49923, 4), +(49998, 49924, 5), + -- Death's Embrace +(47198, 47198, 1), +(47198, 47199, 2), +(47198, 47200, 3), + -- Decimation +(63156, 63156, 1), +(63156, 63158, 2), + -- Deep Wounds +(12162, 12162, 1), +(12162, 12850, 2), +(12162, 12868, 3), + -- Deep Wounds +(12834, 12834, 1), +(12834, 12849, 2), +(12834, 12867, 3), + -- Defensive Tactics +(29559, 29559, 1), +(29559, 29588, 2), +(29559, 29589, 3), + -- Defiance +(12303, 12303, 1), +(12303, 12788, 2), +(12303, 12789, 3), + -- Deflection +(16462, 16462, 1), +(16462, 16463, 2), +(16462, 16464, 3), +(16462, 16465, 4), +(16462, 16466, 5), + -- Deflection +(13713, 13713, 1), +(13713, 13853, 2), +(13713, 13854, 3), + -- Deflection +(19295, 19295, 1), +(19295, 19297, 2), +(19295, 19298, 3), + -- Deflection +(20060, 20060, 1), +(20060, 20061, 2), +(20060, 20062, 3), +(20060, 20063, 4), +(20060, 20064, 5), + -- Demon Armor +(706, 706, 1), +(706, 1086, 2), +(706, 11733, 3), +(706, 11734, 4), +(706, 11735, 5), +(706, 27260, 6), +(706, 47793, 7), +(706, 47889, 8), + -- Demon Skin +(687, 687, 1), +(687, 696, 2), + -- Demonic Aegis +(30143, 30143, 1), +(30143, 30144, 2), +(30143, 30145, 3), + -- Demonic Brutality +(18705, 18705, 1), +(18705, 18706, 2), +(18705, 18707, 3), + -- Demonic Embrace +(18697, 18697, 1), +(18697, 18698, 2), +(18697, 18699, 3), + -- Demonic Knowledge +(35691, 35691, 1), +(35691, 35692, 2), +(35691, 35693, 3), + -- Demonic Pact +(47236, 47236, 1), +(47236, 47237, 2), +(47236, 47238, 3), +(47236, 47239, 4), +(47236, 47240, 5), + -- Demonic Power +(18126, 18126, 1), +(18126, 18127, 2), + -- Demonic Resilience +(30319, 30319, 1), +(30319, 30320, 2), +(30319, 30321, 3), + -- Demonic Tactics +(30242, 30242, 1), +(30242, 30245, 2), +(30242, 30246, 3), +(30242, 30247, 4), +(30242, 30248, 5), + -- Demoralizing Roar +(99, 99, 1), +(99, 1735, 2), +(99, 9490, 3), +(99, 9747, 4), +(99, 9898, 5), +(99, 26998, 6), +(99, 48559, 7), +(99, 48560, 8), + -- Demoralizing Screech +(24424, 24424, 1), +(24424, 24580, 2), +(24424, 24581, 3), +(24424, 24582, 4), +(24424, 27349, 5), + -- Demoralizing Screech +(24423, 24423, 1), +(24423, 24577, 2), +(24423, 24578, 3), +(24423, 24579, 4), +(24423, 27051, 5), +(24423, 55487, 6), + -- Demoralizing Shout +(1160, 1160, 1), +(1160, 6190, 2), +(1160, 11554, 3), +(1160, 11555, 4), +(1160, 11556, 5), +(1160, 25202, 6), +(1160, 25203, 7), +(1160, 47437, 8), + -- Desecration +(55666, 55666, 1), +(55666, 55667, 2), + -- Desperate Prayer +(19236, 19236, 1), +(19236, 19238, 2), +(19236, 19240, 3), +(19236, 19241, 4), +(19236, 19242, 5), +(19236, 19243, 6), +(19236, 25437, 7), +(19236, 48172, 8), +(19236, 48173, 9), + -- Destructive Reach +(17917, 17917, 1), +(17917, 17918, 2), + -- Destructive Soul +(30251, 30251, 1), +(30251, 30256, 2), + -- Devastate +(20243, 20243, 1), +(20243, 30016, 2), +(20243, 30022, 3), +(20243, 47497, 4), +(20243, 47498, 5), + -- Devotion Aura +(465, 465, 1), +(465, 10290, 2), +(465, 643, 3), +(465, 10291, 4), +(465, 1032, 5), +(465, 10292, 6), +(465, 10293, 7), +(465, 27149, 8), +(465, 48941, 9), +(465, 48942, 10), + -- Devour Magic +(19505, 19505, 1), +(19505, 19731, 2), +(19505, 19734, 3), +(19505, 19736, 4), +(19505, 27276, 5), +(19505, 27277, 6), +(19505, 48011, 7), + -- Devouring Plague +(2944, 2944, 1), +(2944, 19276, 2), +(2944, 19277, 3), +(2944, 19278, 4), +(2944, 19279, 5), +(2944, 19280, 6), +(2944, 25467, 7), +(2944, 48299, 8), +(2944, 48300, 9), + -- Dirge +(49223, 49223, 1), +(49223, 49599, 2), + -- Dirty Deeds +(14082, 14082, 1), +(14082, 14083, 2), + -- Dirty Tricks +(14076, 14076, 1), +(14076, 14094, 2), + -- Dispel Magic +(527, 527, 1), +(527, 988, 2), + -- Displacement +(34478, 34478, 1), +(34478, 34479, 2), +(34478, 34481, 3), + -- Dive +(23146, 23146, 1), +(23146, 23149, 2), +(23146, 23150, 3), + -- Divine Aegis +(47509, 47509, 1), +(47509, 47511, 2), +(47509, 47515, 3), + -- Divine Fury +(18530, 18530, 1), +(18530, 18531, 2), +(18530, 18533, 3), +(18530, 18534, 4), +(18530, 18535, 5), + -- Divine Guardian +(53527, 53527, 1), +(53527, 53530, 2), + -- Divine Intellect +(20257, 20257, 1), +(20257, 20258, 2), +(20257, 20259, 3), +(20257, 20260, 4), +(20257, 20261, 5), + -- Divine Providence +(47562, 47562, 1), +(47562, 47564, 2), +(47562, 47565, 3), +(47562, 47566, 4), +(47562, 47567, 5), + -- Divine Purpose +(31871, 31871, 1), +(31871, 31872, 2), + -- Divine Spirit +(14752, 14752, 1), +(14752, 14818, 2), +(14752, 14819, 3), +(14752, 27841, 4), +(14752, 25312, 5), +(14752, 48073, 6), + -- Divine Strength +(20262, 20262, 1), +(20262, 20263, 2), +(20262, 20264, 3), +(20262, 20265, 4), +(20262, 20266, 5), + -- Divinity +(63646, 63646, 1), +(63646, 63647, 2), +(63646, 63648, 3), +(63646, 63649, 4), +(63646, 63650, 5), + -- Dragon's Breath +(31661, 31661, 1), +(31661, 33041, 2), +(31661, 33042, 3), +(31661, 33043, 4), +(31661, 42949, 5), +(31661, 42950, 6), + -- Drain Life +(689, 689, 1), +(689, 699, 2), +(689, 709, 3), +(689, 7651, 4), +(689, 11699, 5), +(689, 11700, 6), +(689, 27219, 7), +(689, 27220, 8), +(689, 47857, 9), + -- Drain Soul +(1120, 1120, 1), +(1120, 8288, 2), +(1120, 8289, 3), +(1120, 11675, 4), +(1120, 27217, 5), +(1120, 47855, 6), + -- Dreamstate +(33597, 33597, 1), +(33597, 33599, 2), +(33597, 33956, 3), + -- Dual Wield Specialization +(13715, 13715, 1), +(13715, 13848, 2), +(13715, 13849, 3), +(13715, 13851, 4), +(13715, 13852, 5), + -- Dual Wield Specialization +(23584, 23584, 1), +(23584, 23585, 2), +(23584, 23586, 3), +(23584, 23587, 4), +(23584, 23588, 5), + -- Dual Wield Specialization +(30816, 30816, 1), +(30816, 30818, 2), +(30816, 30819, 3), + -- Earth and Moon +(48506, 48506, 1), +(48506, 48510, 2), +(48506, 48511, 3), + -- Earth Shield +(974, 974, 1), +(974, 32593, 2), +(974, 32594, 3), +(974, 49283, 4), +(974, 49284, 5), + -- Earth Shock +(8042, 8042, 1), +(8042, 8044, 2), +(8042, 8045, 3), +(8042, 8046, 4), +(8042, 10412, 5), +(8042, 10413, 6), +(8042, 10414, 7), +(8042, 25454, 8), +(8042, 49230, 9), +(8042, 49231, 10), + -- Earthen Power +(51523, 51523, 1), +(51523, 51524, 2), + -- Earthliving +(51945, 51945, 1), +(51945, 51990, 2), +(51945, 51997, 3), +(51945, 51998, 4), +(51945, 51999, 5), +(51945, 52000, 6), + -- Earthliving Weapon +(51730, 51730, 1), +(51730, 51988, 2), +(51730, 51991, 3), +(51730, 51992, 4), +(51730, 51993, 5), +(51730, 51994, 6), + -- Earthliving Weapon (Passive) +(51940, 51940, 1), +(51940, 51989, 2), +(51940, 52004, 3), +(51940, 52005, 4), +(51940, 52007, 5), +(51940, 52008, 6), + -- Earth's Grasp +(16043, 16043, 1), +(16043, 16130, 2), + -- Ebon Plaguebringer +(51099, 51099, 1), +(51099, 51160, 2), +(51099, 51161, 3), + -- Eclipse +(48516, 48516, 1), +(48516, 48521, 2), +(48516, 48525, 3), + -- Efficiency +(19416, 19416, 1), +(19416, 19417, 2), +(19416, 19418, 3), +(19416, 19419, 4), +(19416, 19420, 5), + -- Elemental Absorption +(30701, 30701, 1), +(30701, 30702, 2), +(30701, 30703, 3), +(30701, 30704, 4), +(30701, 30705, 5), + -- Elemental Oath +(51466, 51466, 1), +(51466, 51470, 2), + -- Elemental Precision +(30672, 30672, 1), +(30672, 30673, 2), +(30672, 30674, 3), + -- Elemental Reach +(28999, 28999, 1), +(28999, 29000, 2), + -- Elemental Shields +(30669, 30669, 1), +(30669, 30670, 2), +(30669, 30671, 3), + -- Elemental Warding +(28996, 28996, 1), +(28996, 28997, 2), +(28996, 28998, 3), + -- Elemental Weapons +(16266, 16266, 1), +(16266, 29079, 2), +(16266, 29080, 3), + -- Elusiveness +(13981, 13981, 1), +(13981, 14066, 2), + -- Emberstorm +(17954, 17954, 1), +(17954, 17955, 2), +(17954, 17956, 3), +(17954, 17957, 4), +(17954, 17958, 5), + -- Empowered Corruption +(32381, 32381, 1), +(32381, 32382, 2), +(32381, 32383, 3), + -- Empowered Fire +(31656, 31656, 1), +(31656, 31657, 2), +(31656, 31658, 3), + -- Empowered Frostbolt +(31682, 31682, 1), +(31682, 31683, 2), + -- Empowered Healing +(33158, 33158, 1), +(33158, 33159, 2), +(33158, 33160, 3), +(33158, 33161, 4), +(33158, 33162, 5), + -- Empowered Imp +(47220, 47220, 1), +(47220, 47221, 2), +(47220, 47223, 3), + -- Empowered Rejuvenation +(33886, 33886, 1), +(33886, 33887, 2), +(33886, 33888, 3), +(33886, 33889, 4), +(33886, 33890, 5), + -- Empowered Renew +(63534, 63534, 1), +(63534, 63542, 2), +(63534, 63543, 3), + -- Empowered Touch +(33879, 33879, 1), +(33879, 33880, 2), + -- Enchanting +(7411, 7411, 1), +(7411, 7412, 2), +(7411, 7413, 3), +(7411, 13920, 4), +(7411, 28029, 5), +(7411, 51313, 6), + -- Endless Winter +(49137, 49137, 1), +(49137, 49657, 2), + -- Endurance +(13742, 13742, 1), +(13742, 13872, 2), + -- Endurance Training +(19583, 19583, 1), +(19583, 19584, 2), +(19583, 19585, 3), +(19583, 19586, 4), +(19583, 19587, 5), + -- Enduring Winter +(44557, 44557, 1), +(44557, 44560, 2), +(44557, 44561, 3), + -- Engineering +(4036, 4036, 1), +(4036, 4037, 2), +(4036, 4038, 3), +(4036, 12656, 4), +(4036, 30350, 5), +(4036, 51306, 6), + -- Enhancing Totems +(16259, 16259, 1), +(16259, 16295, 2), +(16259, 52456, 3), + -- Enlightened Judgements +(53556, 53556, 1), +(53556, 53557, 2), + -- Enlightenment +(34908, 34908, 1), +(34908, 34909, 2), +(34908, 34910, 3), + -- Enrage +(12317, 12317, 1), +(12317, 13045, 2), +(12317, 13046, 3), +(12317, 13047, 4), +(12317, 13048, 5), + -- Enslave Demon +(1098, 1098, 1), +(1098, 11725, 2), +(1098, 11726, 3), +(1098, 61191, 4), + -- Entangling Roots +(339, 339, 1), +(339, 1062, 2), +(339, 5195, 3), +(339, 5196, 4), +(339, 9852, 5), +(339, 9853, 6), +(339, 26989, 7), +(339, 53308, 8), + -- Entrapment +(19184, 19184, 1), +(19184, 19387, 2), +(19184, 19388, 3), + -- Enveloping Shadows +(31211, 31211, 1), +(31211, 31212, 2), +(31211, 31213, 3), + -- Envenom +(32645, 32645, 1), +(32645, 32684, 2), +(32645, 57992, 3), +(32645, 57993, 4), + -- Epidemic +(49036, 49036, 1), +(49036, 49562, 2), + -- Eradication +(47195, 47195, 1), +(47195, 47196, 2), +(47195, 47197, 3), + -- Evasion +(5277, 5277, 1), +(5277, 26669, 2), + -- Everlasting Affliction +(47201, 47201, 1), +(47201, 47202, 2), +(47201, 47203, 3), +(47201, 47204, 4), +(47201, 47205, 5), + -- Eviscerate +(2098, 2098, 1), +(2098, 6760, 2), +(2098, 6761, 3), +(2098, 6762, 4), +(2098, 8623, 5), +(2098, 8624, 6), +(2098, 11299, 7), +(2098, 11300, 8), +(2098, 31016, 9), +(2098, 26865, 10), +(2098, 48667, 11), +(2098, 48668, 12), + -- Execute +(5308, 5308, 1), +(5308, 20658, 2), +(5308, 20660, 3), +(5308, 20661, 4), +(5308, 20662, 5), +(5308, 25234, 6), +(5308, 25236, 7), +(5308, 47470, 8), +(5308, 47471, 9), + -- Exorcism +(879, 879, 1), +(879, 5614, 2), +(879, 5615, 3), +(879, 10312, 4), +(879, 10313, 5), +(879, 10314, 6), +(879, 27138, 7), +(879, 48800, 8), +(879, 48801, 9), + -- Explosive Shot +(53301, 53301, 1), +(53301, 60051, 2), +(53301, 60052, 3), +(53301, 60053, 4), + -- Explosive Trap +(13813, 13813, 1), +(13813, 14316, 2), +(13813, 14317, 3), +(13813, 27025, 4), +(13813, 49066, 5), +(13813, 49067, 6), + -- Explosive Trap Effect +(13812, 13812, 1), +(13812, 14314, 2), +(13812, 14315, 3), +(13812, 27026, 4), +(13812, 49064, 5), +(13812, 49065, 6), + -- Expose Weakness +(34500, 34500, 1), +(34500, 34502, 2), +(34500, 34503, 3), + -- Eye of the Storm +(29062, 29062, 1), +(29062, 29064, 2), +(29062, 29065, 3), + -- Faerie Fire +(13424, 13424, 1), +(13424, 13752, 2), + -- Fanaticism +(31879, 31879, 1), +(31879, 31880, 2), +(31879, 31881, 3), + -- Fear +(5782, 5782, 1), +(5782, 6213, 2), +(5782, 6215, 3), + -- Feeding Frenzy +(60096, 60096, 1), +(60096, 60097, 2), + -- Feeding Frenzy +(53511, 53511, 1), +(53511, 53512, 2), + -- Feint +(1966, 1966, 1), +(1966, 6768, 2), +(1966, 8637, 3), +(1966, 11303, 4), +(1966, 25302, 5), +(1966, 27448, 6), +(1966, 48658, 7), +(1966, 48659, 8), + -- Fel Armor +(28176, 28176, 1), +(28176, 28189, 2), +(28176, 47892, 3), +(28176, 47893, 4), + -- Fel Concentration +(17783, 17783, 1), +(17783, 17784, 2), +(17783, 17785, 3), + -- Fel Intelligence +(54424, 54424, 1), +(54424, 57564, 2), +(54424, 57565, 3), +(54424, 57566, 4), +(54424, 57567, 5), + -- Fel Synergy +(47230, 47230, 1), +(47230, 47231, 2), + -- Fel Vitality +(18731, 18731, 1), +(18731, 18743, 2), +(18731, 18744, 3), + -- Feral Aggression +(16858, 16858, 1), +(16858, 16859, 2), +(16858, 16860, 3), +(16858, 16861, 4), +(16858, 16862, 5), + -- Feral Instinct +(16947, 16947, 1), +(16947, 16948, 2), +(16947, 16949, 3), + -- Ferocious Bite +(22568, 22568, 1), +(22568, 22827, 2), +(22568, 22828, 3), +(22568, 22829, 4), +(22568, 31018, 5), +(22568, 24248, 6), +(22568, 48576, 7), +(22568, 48577, 8), + -- Ferocious Dead +(49038, 49038, 1), +(49038, 49595, 2), +(49038, 49596, 3), + -- Ferocious Inspiration +(34455, 34455, 1), +(34455, 34459, 2), +(34455, 34460, 3), + -- Ferocity +(19598, 19598, 1), +(19598, 19599, 2), +(19598, 19600, 3), +(19598, 19601, 4), +(19598, 19602, 5), + -- Ferocity +(16934, 16934, 1), +(16934, 16935, 2), +(16934, 16936, 3), +(16934, 16937, 4), +(16934, 16938, 5), + -- Filthy Tricks +(58414, 58414, 1), +(58414, 58415, 2), + -- Find Weakness +(31234, 31234, 1), +(31234, 31235, 2), +(31234, 31236, 3), + -- Fingers of Frost +(44543, 44543, 1), +(44543, 44545, 2), + -- Fire and Brimstone +(47266, 47266, 1), +(47266, 47267, 2), +(47266, 47268, 3), +(47266, 47269, 4), +(47266, 47270, 5), + -- Fire Blast +(2141, 2141, 1), +(2141, 2142, 2), +(2141, 2143, 3), +(2141, 8414, 4), +(2141, 8415, 5), +(2141, 10198, 6), +(2141, 10200, 7), +(2141, 27378, 8), +(2141, 27379, 9), + -- Fire Blast +(2136, 2136, 1), +(2136, 2137, 2), +(2136, 2138, 3), +(2136, 8412, 4), +(2136, 8413, 5), +(2136, 10197, 6), +(2136, 10199, 7), +(2136, 27078, 8), +(2136, 27079, 9), +(2136, 42872, 10), +(2136, 42873, 11), + -- Fire Breath +(34889, 34889, 1), +(34889, 35323, 2), +(34889, 55482, 3), +(34889, 55483, 4), +(34889, 55484, 5), +(34889, 55485, 6), + -- Fire Power +(11124, 11124, 1), +(11124, 12378, 2), +(11124, 12398, 3), +(11124, 12399, 4), +(11124, 12400, 5), + -- Fire Resistance Aura +(19891, 19891, 1), +(19891, 19899, 2), +(19891, 19900, 3), +(19891, 27153, 4), +(19891, 48947, 5), + -- Fire Resistance Totem +(8184, 8184, 1), +(8184, 10537, 2), +(8184, 10538, 3), +(8184, 25563, 4), +(8184, 58737, 5), +(8184, 58739, 6), + -- Fire Shield +(2947, 2947, 1), +(2947, 8316, 2), +(2947, 8317, 3), +(2947, 11770, 4), +(2947, 11771, 5), +(2947, 27269, 6), +(2947, 47983, 7), + -- Fire Shot +(3011, 3011, 1), +(3011, 6979, 2), +(3011, 6980, 3), + -- Fire Ward +(1035, 1035, 1), +(1035, 8459, 2), +(1035, 8460, 3), +(1035, 10224, 4), +(1035, 10226, 5), +(1035, 27395, 6), + -- Fire Ward +(543, 543, 1), +(543, 8457, 2), +(543, 8458, 3), +(543, 10223, 4), +(543, 10225, 5), +(543, 27128, 6), +(543, 43010, 7), + -- Fireball +(133, 133, 1), +(133, 143, 2), +(133, 145, 3), +(133, 3140, 4), +(133, 8400, 5), +(133, 8401, 6), +(133, 8402, 7), +(133, 10148, 8), +(133, 10149, 9), +(133, 10150, 10), +(133, 10151, 11), +(133, 25306, 12), +(133, 27070, 13), +(133, 38692, 14), +(133, 42832, 15), +(133, 42833, 16), + -- Firebolt +(3110, 3110, 1), +(3110, 7799, 2), +(3110, 7800, 3), +(3110, 7801, 4), +(3110, 7802, 5), +(3110, 11762, 6), +(3110, 11763, 7), +(3110, 27267, 8), +(3110, 47964, 9), + -- Firestarter +(44442, 44442, 1), +(44442, 44443, 2), + -- First Aid +(3273, 3273, 1), +(3273, 3274, 2), +(3273, 7924, 3), +(3273, 10846, 4), +(3273, 27028, 5), +(3273, 45542, 6), + -- Flame Shock +(8050, 8050, 1), +(8050, 8052, 2), +(8050, 8053, 3), +(8050, 10447, 4), +(8050, 10448, 5), +(8050, 29228, 6), +(8050, 25457, 7), +(8050, 49232, 8), +(8050, 49233, 9), + -- Flame Throwing +(11100, 11100, 1), +(11100, 12353, 2), + -- Flamestrike +(2120, 2120, 1), +(2120, 2121, 2), +(2120, 8422, 3), +(2120, 8423, 4), +(2120, 10215, 5), +(2120, 10216, 6), +(2120, 27086, 7), +(2120, 42925, 8), +(2120, 42926, 9), + -- Flametongue Totem +(52109, 52109, 1), +(52109, 52110, 2), +(52109, 52111, 3), +(52109, 52112, 4), +(52109, 52113, 5), +(52109, 58651, 6), +(52109, 58654, 7), +(52109, 58655, 8), + -- Flametongue Totem +(8227, 8227, 1), +(8227, 8249, 2), +(8227, 10526, 3), +(8227, 16387, 4), +(8227, 25557, 5), +(8227, 58649, 6), +(8227, 58652, 7), +(8227, 58656, 8), + -- Flametongue Weapon +(8024, 8024, 1), +(8024, 8027, 2), +(8024, 8030, 3), +(8024, 16339, 4), +(8024, 16341, 5), +(8024, 16342, 6), +(8024, 25489, 7), +(8024, 58785, 8), +(8024, 58789, 9), +(8024, 58790, 10), + -- Flametongue Weapon (Passive) +(10400, 10400, 1), +(10400, 15567, 2), +(10400, 15568, 3), +(10400, 15569, 4), +(10400, 16311, 5), +(10400, 16312, 6), +(10400, 16313, 7), +(10400, 58784, 8), +(10400, 58791, 9), +(10400, 58792, 10), + -- Flametongue Weapon Proc +(8026, 8026, 1), +(8026, 8028, 2), +(8026, 8029, 3), +(8026, 10445, 4), +(8026, 16343, 5), +(8026, 16344, 6), +(8026, 25488, 7), +(8026, 58786, 8), +(8026, 58787, 9), +(8026, 58788, 10), + -- Flash Heal +(2061, 2061, 1), +(2061, 9472, 2), +(2061, 9473, 3), +(2061, 9474, 4), +(2061, 10915, 5), +(2061, 10916, 6), +(2061, 10917, 7), +(2061, 25233, 8), +(2061, 25235, 9), +(2061, 48070, 10), +(2061, 48071, 11), + -- Flash of Light +(19750, 19750, 1), +(19750, 19939, 2), +(19750, 19940, 3), +(19750, 19941, 4), +(19750, 19942, 5), +(19750, 19943, 6), +(19750, 27137, 7), +(19750, 48784, 8), +(19750, 48785, 9), + -- Fleet Footed +(31208, 31208, 1), +(31208, 31209, 2), + -- Flurry +(16257, 16257, 1), +(16257, 16277, 2), +(16257, 16278, 3), +(16257, 16279, 4), +(16257, 16280, 5), + -- Flurry +(16256, 16256, 1), +(16256, 16281, 2), +(16256, 16282, 3), +(16256, 16283, 4), +(16256, 16284, 5), + -- Focused Aim +(53620, 53620, 1), +(53620, 53621, 2), +(53620, 53622, 3), + -- Focused Attacks +(51634, 51634, 1), +(51634, 51635, 2), +(51634, 51636, 3), + -- Focused Casting +(14743, 14743, 1), +(14743, 27828, 2), + -- Focused Fire +(35060, 35060, 1), +(35060, 35061, 2), + -- Focused Fire +(35029, 35029, 1), +(35029, 35030, 2), + -- Focused Mind +(33213, 33213, 1), +(33213, 33214, 2), +(33213, 33215, 3), + -- Focused Mind +(30864, 30864, 1), +(30864, 30865, 2), +(30864, 30866, 3), + -- Focused Power +(33186, 33186, 1), +(33186, 33190, 2), + -- Focused Rage +(29787, 29787, 1), +(29787, 29790, 2), +(29787, 29792, 3), + -- Freezing Trap +(1499, 1499, 1), +(1499, 14310, 2), +(1499, 14311, 3), + -- Freezing Trap Effect +(3355, 3355, 1), +(3355, 14308, 2), +(3355, 14309, 3), + -- Frenzy +(19621, 19621, 1), +(19621, 19622, 2), +(19621, 19623, 3), +(19621, 19624, 4), +(19621, 19625, 5), + -- Frigid Dreadplate +(49186, 49186, 1), +(49186, 51108, 2), +(49186, 51109, 3), + -- Frost Armor +(168, 168, 1), +(168, 7300, 2), +(168, 7301, 3), + -- Frost Channeling +(11160, 11160, 1), +(11160, 12518, 2), +(11160, 12519, 3), + -- Frost Nova +(122, 122, 1), +(122, 865, 2), +(122, 6131, 3), +(122, 10230, 4), +(122, 27088, 5), +(122, 42917, 6), + -- Frost Resistance Aura +(19888, 19888, 1), +(19888, 19897, 2), +(19888, 19898, 3), +(19888, 27152, 4), +(19888, 48945, 5), + -- Frost Resistance Totem +(8181, 8181, 1), +(8181, 10478, 2), +(8181, 10479, 3), +(8181, 25560, 4), +(8181, 58741, 5), +(8181, 58745, 6), + -- Frost Shock +(8056, 8056, 1), +(8056, 8058, 2), +(8056, 10472, 3), +(8056, 10473, 4), +(8056, 25464, 5), +(8056, 49235, 6), +(8056, 49236, 7), + -- Frost Ward +(6144, 6144, 1), +(6144, 8463, 2), +(6144, 8464, 3), +(6144, 10178, 4), +(6144, 27396, 5), +(6144, 32797, 6), + -- Frost Ward +(6143, 6143, 1), +(6143, 8461, 2), +(6143, 8462, 3), +(6143, 10177, 4), +(6143, 28609, 5), +(6143, 32796, 6), +(6143, 43012, 7), + -- Frost Warding +(11189, 11189, 1), +(11189, 28332, 2), + -- Frostbite +(11071, 11071, 1), +(11071, 12496, 2), +(11071, 12497, 3), + -- Frostbolt +(116, 116, 1), +(116, 205, 2), +(116, 837, 3), +(116, 7322, 4), +(116, 8406, 5), +(116, 8407, 6), +(116, 8408, 7), +(116, 10179, 8), +(116, 10180, 9), +(116, 10181, 10), +(116, 25304, 11), +(116, 27071, 12), +(116, 27072, 13), +(116, 38697, 14), +(116, 42841, 15), +(116, 42842, 16), + -- Frostbrand Weapon +(8033, 8033, 1), +(8033, 8038, 2), +(8033, 10456, 3), +(8033, 16355, 4), +(8033, 16356, 5), +(8033, 25500, 6), +(8033, 58794, 7), +(8033, 58795, 8), +(8033, 58796, 9), + -- Frostfire Bolt +(44614, 44614, 1), +(44614, 47610, 2), + -- Froststorm Breath +(54644, 54644, 1), +(54644, 55488, 2), +(54644, 55489, 3), +(54644, 55490, 4), +(54644, 55491, 5), +(54644, 55492, 6), + -- Frozen Core +(31667, 31667, 1), +(31667, 31668, 2), +(31667, 31669, 3), + -- Frozen Power +(63373, 63373, 1), +(63373, 63374, 2), + -- Furious Attacks +(46910, 46910, 1), +(46910, 46911, 2), + -- Furious Howl +(24604, 24604, 1), +(24604, 64491, 2), +(24604, 64492, 3), +(24604, 64493, 4), +(24604, 64494, 5), +(24604, 64495, 6), + -- Furor +(17056, 17056, 1), +(17056, 17058, 2), +(17056, 17059, 3), +(17056, 17060, 4), +(17056, 17061, 5), + -- Gag Order +(12311, 12311, 1), +(12311, 12958, 2), + -- Gale Winds +(48488, 48488, 1), +(48488, 48514, 2), + -- Garrote +(703, 703, 1), +(703, 8631, 2), +(703, 8632, 3), +(703, 8633, 4), +(703, 11289, 5), +(703, 11290, 6), +(703, 26839, 7), +(703, 26884, 8), +(703, 48675, 9), +(703, 48676, 10), + -- Genesis +(57810, 57810, 1), +(57810, 57811, 2), +(57810, 57812, 3), +(57810, 57813, 4), +(57810, 57814, 5), + -- Gift of Nature +(17104, 17104, 1), +(17104, 24943, 2), +(17104, 24944, 3), +(17104, 24945, 4), +(17104, 24946, 5), + -- Gift of the Earthmother +(51179, 51179, 1), +(51179, 51180, 2), +(51179, 51181, 3), +(51179, 51182, 4), +(51179, 51183, 5), + -- Gift of the Wild +(21849, 21849, 1), +(21849, 21850, 2), +(21849, 26991, 3), +(21849, 48470, 4), + -- Glacier Rot +(49471, 49471, 1), +(49471, 49790, 2), +(49471, 49791, 3), + -- Go for the Throat +(34952, 34952, 1), +(34952, 34953, 2), + -- Go for the Throat +(34950, 34950, 1), +(34950, 34954, 2), + -- Gore +(35299, 35299, 1), +(35299, 35300, 2), +(35299, 35302, 3), +(35299, 35303, 4), +(35299, 35304, 5), +(35299, 35305, 6), +(35299, 35306, 7), +(35299, 35307, 8), +(35299, 35308, 9), + -- Gore +(35290, 35290, 1), +(35290, 35291, 2), +(35290, 35292, 3), +(35290, 35293, 4), +(35290, 35294, 5), +(35290, 35295, 6), + -- Grace +(47516, 47516, 1), +(47516, 47517, 2), + -- Grace of the Mantis +(53450, 53450, 1), +(53450, 53451, 2), + -- Great Resistance +(53427, 53427, 1), +(53427, 53429, 2), +(53427, 53430, 3), + -- Great Stamina +(4195, 4195, 1), +(4195, 4196, 2), +(4195, 4197, 3), +(4195, 4198, 4), +(4195, 4199, 5), +(4195, 4200, 6), +(4195, 4201, 7), +(4195, 4202, 8), +(4195, 5048, 9), +(4195, 5049, 10), +(4195, 27364, 11), + -- Great Stamina +(61686, 61686, 1), +(61686, 61687, 2), +(61686, 61688, 3), + -- Greater Blessing of Might +(25782, 25782, 1), +(25782, 25916, 2), +(25782, 27141, 3), +(25782, 48933, 4), +(25782, 48934, 5), + -- Greater Blessing of Wisdom +(25894, 25894, 1), +(25894, 25918, 2), +(25894, 27143, 3), +(25894, 48937, 4), +(25894, 48938, 5), + -- Greater Heal +(2060, 2060, 1), +(2060, 10963, 2), +(2060, 10964, 3), +(2060, 10965, 4), +(2060, 25314, 5), +(2060, 25210, 6), +(2060, 25213, 7), +(2060, 48062, 8), +(2060, 48063, 9), + -- Grim Reach +(18218, 18218, 1), +(18218, 18219, 2), + -- Growl +(1853, 1853, 1), +(1853, 14922, 2), +(1853, 14923, 3), +(1853, 14924, 4), +(1853, 14925, 5), +(1853, 14926, 6), +(1853, 14927, 7), +(1853, 27344, 8), + -- Growl +(2649, 2649, 1), +(2649, 14916, 2), +(2649, 14917, 3), +(2649, 14918, 4), +(2649, 14919, 5), +(2649, 14920, 6), +(2649, 14921, 7), +(2649, 27047, 8), +(2649, 61676, 9), + -- Guard Dog +(53178, 53178, 1), +(53178, 53179, 2), + -- Guarded by the Light +(53583, 53583, 1), +(53583, 53585, 2), + -- Guardian Totems +(16258, 16258, 1), +(16258, 16293, 2), + -- Guardian's Favor +(20174, 20174, 1), +(20174, 20175, 2), + -- Guile of Gorefiend +(50187, 50187, 1), +(50187, 50190, 2), +(50187, 50191, 3), + -- Hack and Slash +(13960, 13960, 1), +(13960, 13961, 2), +(13960, 13962, 3), +(13960, 13963, 4), +(13960, 13964, 5), + -- Hammer of Justice +(853, 853, 1), +(853, 5588, 2), +(853, 5589, 3), +(853, 10308, 4), + -- Hammer of Wrath +(24275, 24275, 1), +(24275, 24274, 2), +(24275, 24239, 3), +(24275, 27180, 4), +(24275, 48805, 5), +(24275, 48806, 6), + -- Hand of Protection +(1022, 1022, 1), +(1022, 5599, 2), +(1022, 10278, 3), + -- Haunt +(48181, 48181, 1), +(48181, 59161, 2), +(48181, 59163, 3), +(48181, 59164, 4), + -- Hawk Eye +(19498, 19498, 1), +(19498, 19499, 2), +(19498, 19500, 3), + -- Heal +(2054, 2054, 1), +(2054, 2055, 2), +(2054, 6063, 3), +(2054, 6064, 4), + -- Healing Focus +(14913, 14913, 1), +(14913, 15012, 2), + -- Healing Focus +(16181, 16181, 1), +(16181, 16230, 2), +(16181, 16232, 3), + -- Healing Grace +(29187, 29187, 1), +(29187, 29189, 2), +(29187, 29191, 3), + -- Healing Light +(20237, 20237, 1), +(20237, 20238, 2), +(20237, 20239, 3), + -- Healing Prayers +(14911, 14911, 1), +(14911, 15018, 2), + -- Healing Stream Totem +(5394, 5394, 1), +(5394, 6375, 2), +(5394, 6377, 3), +(5394, 10462, 4), +(5394, 10463, 5), +(5394, 25567, 6), +(5394, 58755, 7), +(5394, 58756, 8), +(5394, 58757, 9), + -- Healing Touch +(5185, 5185, 1), +(5185, 5186, 2), +(5185, 5187, 3), +(5185, 5188, 4), +(5185, 5189, 5), +(5185, 6778, 6), +(5185, 8903, 7), +(5185, 9758, 8), +(5185, 9888, 9), +(5185, 9889, 10), +(5185, 25297, 11), +(5185, 26978, 12), +(5185, 26979, 13), +(5185, 48377, 14), +(5185, 48378, 15), + -- Healing Wave +(331, 331, 1), +(331, 332, 2), +(331, 547, 3), +(331, 913, 4), +(331, 939, 5), +(331, 959, 6), +(331, 8005, 7), +(331, 10395, 8), +(331, 10396, 9), +(331, 25357, 10), +(331, 25391, 11), +(331, 25396, 12), +(331, 49272, 13), +(331, 49273, 14), + -- Healing Way +(29206, 29206, 1), +(29206, 29205, 2), +(29206, 29202, 3), + -- Health Funnel +(755, 755, 1), +(755, 3698, 2), +(755, 3699, 3), +(755, 3700, 4), +(755, 11693, 5), +(755, 11694, 6), +(755, 11695, 7), +(755, 27259, 8), +(755, 47856, 9), + -- Heart of the Crusader +(21183, 21183, 1), +(21183, 54498, 2), +(21183, 54499, 3), + -- Heart of the Crusader +(20335, 20335, 1), +(20335, 20336, 2), +(20335, 20337, 3), + -- Heart of the Wild +(17003, 17003, 1), +(17003, 17004, 2), +(17003, 17005, 3), +(17003, 17006, 4), +(17003, 24894, 5), + -- Heart Strike +(55050, 55050, 1), +(55050, 55258, 2), +(55050, 55259, 3), +(55050, 55260, 4), +(55050, 55261, 5), +(55050, 55262, 6), + -- Heightened Senses +(30894, 30894, 1), +(30894, 30895, 2), + -- Hellfire +(1949, 1949, 1), +(1949, 11683, 2), +(1949, 11684, 3), +(1949, 27213, 4), +(1949, 47823, 5), + -- Hellfire Effect +(5857, 5857, 1), +(5857, 11681, 2), +(5857, 11682, 3), +(5857, 27214, 4), +(5857, 47822, 5), + -- Hemorrhage +(16511, 16511, 1), +(16511, 17347, 2), +(16511, 17348, 3), +(16511, 26864, 4), +(16511, 48660, 5), + -- Herb Gathering +(2366, 2366, 1), +(2366, 2368, 2), +(2366, 3570, 3), +(2366, 11993, 4), +(2366, 28695, 5), +(2366, 50300, 6), + -- Heroic Strike +(78, 78, 1), +(78, 284, 2), +(78, 285, 3), +(78, 1608, 4), +(78, 11564, 5), +(78, 11565, 6), +(78, 11566, 7), +(78, 11567, 8), +(78, 25286, 9), +(78, 29707, 10), +(78, 30324, 11), +(78, 47449, 12), +(78, 47450, 13), + -- Hibernate +(2637, 2637, 1), +(2637, 18657, 2), +(2637, 18658, 3), + -- Holy Concentration +(34753, 34753, 1), +(34753, 34859, 2), +(34753, 34860, 3), + -- Holy Fire +(14914, 14914, 1), +(14914, 15262, 2), +(14914, 15263, 3), +(14914, 15264, 4), +(14914, 15265, 5), +(14914, 15266, 6), +(14914, 15267, 7), +(14914, 15261, 8), +(14914, 25384, 9), +(14914, 48134, 10), +(14914, 48135, 11), + -- Holy Guidance +(31837, 31837, 1), +(31837, 31838, 2), +(31837, 31839, 3), +(31837, 31840, 4), +(31837, 31841, 5), + -- Holy Light +(635, 635, 1), +(635, 639, 2), +(635, 647, 3), +(635, 1026, 4), +(635, 1042, 5), +(635, 3472, 6), +(635, 10328, 7), +(635, 10329, 8), +(635, 25292, 9), +(635, 27135, 10), +(635, 27136, 11), +(635, 48781, 12), +(635, 48782, 13), + -- Holy Power +(5923, 5923, 1), +(5923, 5924, 2), +(5923, 5925, 3), +(5923, 5926, 4), +(5923, 25829, 5), + -- Holy Reach +(27789, 27789, 1), +(27789, 27790, 2), + -- Holy Shield +(20925, 20925, 1), +(20925, 20927, 2), +(20925, 20928, 3), +(20925, 27179, 4), +(20925, 48951, 5), +(20925, 48952, 6), + -- Holy Specialization +(14889, 14889, 1), +(14889, 15008, 2), +(14889, 15009, 3), +(14889, 15010, 4), +(14889, 15011, 5), + -- Holy Wrath +(2812, 2812, 1), +(2812, 10318, 2), +(2812, 27139, 3), +(2812, 48816, 4), +(2812, 48817, 5), + -- Honor Among Thieves +(51698, 51698, 1), +(51698, 51700, 2), +(51698, 51701, 3), + -- Horn of Winter +(57330, 57330, 1), +(57330, 57623, 2), + -- Hot Streak +(44445, 44445, 1), +(44445, 44446, 2), +(44445, 44448, 3), + -- Howl of Terror +(5484, 5484, 1), +(5484, 17928, 2), + -- Howling Blast +(49184, 49184, 1), +(49184, 51409, 2), +(49184, 51410, 3), +(49184, 51411, 4), + -- Hunter vs. Wild +(56339, 56339, 1), +(56339, 56340, 2), +(56339, 56341, 3), + -- Hunter's Mark +(1130, 1130, 1), +(1130, 14323, 2), +(1130, 14324, 3), +(1130, 14325, 4), +(1130, 53338, 5), + -- Hunting Party +(53290, 53290, 1), +(53290, 53291, 2), +(53290, 53292, 3), + -- Ice Armor +(1214, 1214, 1), +(1214, 1228, 2), +(1214, 10221, 3), +(1214, 10222, 4), +(1214, 27391, 5), + -- Ice Armor +(7302, 7302, 1), +(7302, 7320, 2), +(7302, 10219, 3), +(7302, 10220, 4), +(7302, 27124, 5), +(7302, 43008, 6), + -- Ice Barrier +(11426, 11426, 1), +(11426, 13031, 2), +(11426, 13032, 3), +(11426, 13033, 4), +(11426, 27134, 5), +(11426, 33405, 6), +(11426, 43038, 7), +(11426, 43039, 8), + -- Ice Floes +(31670, 31670, 1), +(31670, 31672, 2), +(31670, 55094, 3), + -- Ice Lance +(30455, 30455, 1), +(30455, 42913, 2), +(30455, 42914, 3), + -- Ice Shards +(11207, 11207, 1), +(11207, 12672, 2), +(11207, 15047, 3), + -- Icy Reach +(55061, 55061, 1), +(55061, 55062, 2), + -- Icy Talons +(50880, 50880, 1), +(50880, 50884, 2), +(50880, 50885, 3), +(50880, 50886, 4), +(50880, 50887, 5), + -- Ignite +(11119, 11119, 1), +(11119, 11120, 2), +(11119, 12846, 3), +(11119, 12847, 4), +(11119, 12848, 5), + -- Illumination +(20210, 20210, 1), +(20210, 20212, 2), +(20210, 20213, 3), +(20210, 20214, 4), +(20210, 20215, 5), + -- Immolate +(348, 348, 1), +(348, 707, 2), +(348, 1094, 3), +(348, 2941, 4), +(348, 11665, 5), +(348, 11667, 6), +(348, 11668, 7), +(348, 25309, 8), +(348, 27215, 9), +(348, 47810, 10), +(348, 47811, 11), + -- Impale +(16493, 16493, 1), +(16493, 16494, 2), + -- Improved Ambush +(14079, 14079, 1), +(14079, 14080, 2), + -- Improved Arcane Shot +(19454, 19454, 1), +(19454, 19455, 2), +(19454, 19456, 3), + -- Improved Aspect of the Hawk +(19552, 19552, 1), +(19552, 19553, 2), +(19552, 19554, 3), +(19552, 19555, 4), +(19552, 19556, 5), + -- Improved Aspect of the Monkey +(19549, 19549, 1), +(19549, 19550, 2), +(19549, 19551, 3), + -- Improved Barkskin +(63410, 63410, 1), +(63410, 63411, 2), + -- Improved Barrage +(35104, 35104, 1), +(35104, 35110, 2), +(35104, 35111, 3), + -- Improved Berserker Rage +(20500, 20500, 1), +(20500, 20501, 2), + -- Improved Berserker Stance +(29759, 29759, 1), +(29759, 29760, 2), +(29759, 29761, 3), +(29759, 29762, 4), +(29759, 29763, 5), + -- Improved Blessing of Might +(20042, 20042, 1), +(20042, 20045, 2), + -- Improved Blessing of Salvation +(20194, 20194, 1), +(20194, 20195, 2), + -- Improved Blessing of Wisdom +(20244, 20244, 1), +(20244, 20245, 2), + -- Improved Blink +(31569, 31569, 1), +(31569, 31570, 2), + -- Improved Blizzard +(11185, 11185, 1), +(11185, 12487, 2), +(11185, 12488, 3), + -- Improved Blood Presence +(50365, 50365, 1), +(50365, 50371, 2), + -- Improved Bloodrage +(12301, 12301, 1), +(12301, 12818, 2), + -- Improved Chain Heal +(30872, 30872, 1), +(30872, 30873, 2), + -- Improved Challenging Shout +(12327, 12327, 1), +(12327, 12886, 2), + -- Improved Charge +(12285, 12285, 1), +(12285, 12697, 2), + -- Improved Cleave +(12329, 12329, 1), +(12329, 12950, 2), +(12329, 20496, 3), + -- Improved Concentration Aura +(20254, 20254, 1), +(20254, 20255, 2), +(20254, 20256, 3), + -- Improved Concussive Shot +(19407, 19407, 1), +(19407, 19412, 2), + -- Improved Cone of Cold +(11190, 11190, 1), +(11190, 12489, 2), +(11190, 12490, 3), + -- Improved Corpse Explosion +(49601, 49601, 1), +(49601, 49602, 2), + -- Improved Corruption +(17810, 17810, 1), +(17810, 17811, 2), +(17810, 17812, 3), +(17810, 17813, 4), +(17810, 17814, 5), + -- Improved Counterspell +(11255, 11255, 1), +(11255, 12598, 2), + -- Improved Cower +(53180, 53180, 1), +(53180, 53181, 2), + -- Improved Curse of Agony +(18827, 18827, 1), +(18827, 18829, 2), + -- Improved Curse of Weakness +(18179, 18179, 1), +(18179, 18180, 2), + -- Improved Death Coil +(30049, 30049, 1), +(30049, 30051, 2), +(30049, 30052, 3), + -- Improved Defensive Stance +(29593, 29593, 1), +(29593, 29594, 2), + -- Improved Demonic Tactics +(54347, 54347, 1), +(54347, 54348, 2), +(54347, 54349, 3), + -- Improved Demoralizing Shout +(12324, 12324, 1), +(12324, 12876, 2), +(12324, 12877, 3), +(12324, 12878, 4), +(12324, 12879, 5), + -- Improved Devotion Aura +(20138, 20138, 1), +(20138, 20139, 2), +(20138, 20140, 3), + -- Improved Devouring Plague +(63625, 63625, 1), +(63625, 63626, 2), +(63625, 63627, 3), + -- Improved Disarm +(12313, 12313, 1), +(12313, 12804, 2), + -- Improved Disciplines +(12312, 12312, 1), +(12312, 12803, 2), + -- Improved Divine Spirit +(33174, 33174, 1), +(33174, 33182, 2), + -- Improved Drain Soul +(18213, 18213, 1), +(18213, 18372, 2), + -- Improved Earth Shield +(51560, 51560, 1), +(51560, 51561, 2), + -- Improved Eviscerate +(14162, 14162, 1), +(14162, 14163, 2), +(14162, 14164, 3), + -- Improved Execute +(20502, 20502, 1), +(20502, 20503, 2), + -- Improved Expose Armor +(14168, 14168, 1), +(14168, 14169, 2), + -- Improved Eyes of the Beast +(19557, 19557, 1), +(19557, 19558, 2), + -- Improved Faerie Fire +(33600, 33600, 1), +(33600, 33601, 2), +(33600, 33602, 3), + -- Improved Fear +(53754, 53754, 1), +(53754, 53759, 2), + -- Improved Felhunter +(54037, 54037, 1), +(54037, 54038, 2), + -- Improved Fire Blast +(11078, 11078, 1), +(11078, 11080, 2), + -- Improved Fire Nova +(16086, 16086, 1), +(16086, 16544, 2), + -- Improved Fireball +(11069, 11069, 1), +(11069, 12338, 2), +(11069, 12339, 3), +(11069, 12340, 4), +(11069, 12341, 5), + -- Improved Flash of Light +(20249, 20249, 1), +(20249, 20250, 2), +(20249, 20251, 3), + -- Improved Frost Presence +(50384, 50384, 1), +(50384, 50385, 2), + -- Improved Frostbolt +(11070, 11070, 1), +(11070, 12473, 2), +(11070, 16763, 3), +(11070, 16765, 4), +(11070, 16766, 5), + -- Improved Ghost Wolf +(16262, 16262, 1), +(16262, 16287, 2), + -- Improved Gouge +(13741, 13741, 1), +(13741, 13793, 2), +(13741, 13792, 3), + -- Improved Hammer of Justice +(20487, 20487, 1), +(20487, 20488, 2), + -- Improved Hamstring +(12289, 12289, 1), +(12289, 12668, 2), +(12289, 23695, 3), + -- Improved Healing +(14912, 14912, 1), +(14912, 15013, 2), +(14912, 15014, 3), + -- Improved Healing Wave +(16182, 16182, 1), +(16182, 16226, 2), +(16182, 16227, 3), +(16182, 16228, 4), +(16182, 16229, 5), + -- Improved Health Funnel +(18703, 18703, 1), +(18703, 18704, 2), + -- Improved Healthstone +(18692, 18692, 1), +(18692, 18693, 2), + -- Improved Heroic Strike +(12282, 12282, 1), +(12282, 12663, 2), +(12282, 12664, 3), + -- Improved Howl of Terror +(30054, 30054, 1), +(30054, 30057, 2), + -- Improved Hunter's Mark +(19421, 19421, 1), +(19421, 19422, 2), +(19421, 19423, 3), + -- Improved Icy Touch +(49175, 49175, 1), +(49175, 50031, 2), +(49175, 51456, 3), + -- Improved Immolate +(17815, 17815, 1), +(17815, 17833, 2), +(17815, 17834, 3), + -- Improved Imp +(18694, 18694, 1), +(18694, 18695, 2), +(18694, 18696, 3), + -- Improved Inner Fire +(14747, 14747, 1), +(14747, 14770, 2), +(14747, 14771, 3), + -- Improved Inner Rage +(12325, 12325, 1), +(12325, 12863, 2), +(12325, 12864, 3), +(12325, 12865, 4), +(12325, 12866, 5), + -- Improved Insect Swarm +(57849, 57849, 1), +(57849, 57850, 2), +(57849, 57851, 3), + -- Improved Intercept +(29888, 29888, 1), +(29888, 29889, 2), + -- Improved Intimidating Shout +(19870, 19870, 1), +(19870, 19871, 2), + -- Improved Judgements +(25956, 25956, 1), +(25956, 25957, 2), + -- Improved Kick +(13754, 13754, 1), +(13754, 13867, 2), + -- Improved Kidney Shot +(14174, 14174, 1), +(14174, 14175, 2), +(14174, 14176, 3), + -- Improved Lay on Hands +(20234, 20234, 1), +(20234, 20235, 2), + -- Improved Leader of the Pack +(34297, 34297, 1), +(34297, 34300, 2), + -- Improved Life Tap +(18182, 18182, 1), +(18182, 18183, 2), + -- Improved Mana Burn +(14750, 14750, 1), +(14750, 14772, 2), + -- Improved Mangle +(48532, 48532, 1), +(48532, 48489, 2), +(48532, 48491, 3), + -- Improved Mark of the Wild +(17050, 17050, 1), +(17050, 17051, 2), + -- Improved Mind Blast +(15273, 15273, 1), +(15273, 15312, 2), +(15273, 15313, 3), +(15273, 15314, 4), +(15273, 15316, 5), + -- Improved Moonfire +(16821, 16821, 1), +(16821, 16822, 2), + -- Improved Moonkin Form +(50170, 50170, 1), +(50170, 50171, 2), +(50170, 50172, 3), + -- Improved Moonkin Form +(48384, 48384, 1), +(48384, 48395, 2), +(48384, 48396, 3), + -- Improved Mortal Strike +(35446, 35446, 1), +(35446, 35448, 2), +(35446, 35449, 3), + -- Improved Overpower +(12290, 12290, 1), +(12290, 12963, 2), + -- Improved Poisons +(14113, 14113, 1), +(14113, 14114, 2), +(14113, 14115, 3), +(14113, 14116, 4), +(14113, 14117, 5), + -- Improved Power Word: Fortitude +(14749, 14749, 1), +(14749, 14767, 2), + -- Improved Power Word: Shield +(14748, 14748, 1), +(14748, 14768, 2), +(14748, 14769, 3), + -- Improved Psychic Scream +(15392, 15392, 1), +(15392, 15448, 2), + -- Improved Reincarnation +(16184, 16184, 1), +(16184, 16209, 2), + -- Improved Rejuvenation +(17111, 17111, 1), +(17111, 17112, 2), +(17111, 17113, 3), + -- Improved Rend +(12286, 12286, 1), +(12286, 12658, 2), + -- Improved Renew +(14908, 14908, 1), +(14908, 15020, 2), +(14908, 17191, 3), + -- Improved Revenge +(12797, 12797, 1), +(12797, 12799, 2), + -- Improved Revive Pet +(24443, 24443, 1), +(24443, 19575, 2), + -- Improved Righteous Fury +(20468, 20468, 1), +(20468, 20469, 2), +(20468, 20470, 3), + -- Improved Rune Tap +(48985, 48985, 1), +(48985, 49488, 2), +(48985, 49489, 3), + -- Improved Scorch +(11095, 11095, 1), +(11095, 12872, 2), +(11095, 12873, 3), + -- Improved Scorpid Sting +(19491, 19491, 1), +(19491, 19493, 2), +(19491, 19494, 3), + -- Improved Searing Pain +(17927, 17927, 1), +(17927, 17929, 2), +(17927, 17930, 3), + -- Improved Shadow Bolt +(17793, 17793, 1), +(17793, 17796, 2), +(17793, 17801, 3), +(17793, 17802, 4), +(17793, 17803, 5), + -- Improved Shadow Word: Pain +(15275, 15275, 1), +(15275, 15317, 2), + -- Improved Shadowform +(47569, 47569, 1), +(47569, 47570, 2), + -- Improved Shields +(16261, 16261, 1), +(16261, 16290, 2), +(16261, 51881, 3), + -- Improved Sinister Strike +(13732, 13732, 1), +(13732, 13863, 2), + -- Improved Slam +(12862, 12862, 1), +(12862, 12330, 2), + -- Improved Slice and Dice +(14165, 14165, 1), +(14165, 14166, 2), + -- Improved Soul Leech +(54117, 54117, 1), +(54117, 54118, 2), + -- Improved Spell Reflection +(59088, 59088, 1), +(59088, 59089, 2), + -- Improved Spirit Tap +(49694, 49694, 1), +(49694, 59000, 2), + -- Improved Spirit Tap +(15337, 15337, 1), +(15337, 15338, 2), + -- Improved Sprint +(13743, 13743, 1), +(13743, 13875, 2), + -- Improved Steady Shot +(53221, 53221, 1), +(53221, 53222, 2), +(53221, 53224, 3), + -- Improved Stings +(19464, 19464, 1), +(19464, 19465, 2), +(19464, 19466, 3), + -- Improved Stormstrike +(51521, 51521, 1), +(51521, 51522, 2), + -- Improved Succubus +(18754, 18754, 1), +(18754, 18755, 2), +(18754, 18756, 3), + -- Improved Thunder Clap +(12287, 12287, 1), +(12287, 12665, 2), +(12287, 12666, 3), + -- Improved Tracking +(52783, 52783, 1), +(52783, 52785, 2), +(52783, 52786, 3), +(52783, 52787, 4), +(52783, 52788, 5), + -- Improved Tranquility +(17123, 17123, 1), +(17123, 17124, 2), + -- Improved Tree of Life +(48535, 48535, 1), +(48535, 48536, 2), +(48535, 48537, 3), + -- Improved Unholy Presence +(50391, 50391, 1), +(50391, 50392, 2), + -- Improved Vampiric Embrace +(27839, 27839, 1), +(27839, 27840, 2), + -- Improved Water Shield +(16180, 16180, 1), +(16180, 16196, 2), +(16180, 16198, 3), + -- Improved Whirlwind +(29721, 29721, 1), +(29721, 29776, 2), + -- Improved Windfury Totem +(29192, 29192, 1), +(29192, 29193, 2), + -- Impurity +(49220, 49220, 1), +(49220, 49633, 2), +(49220, 49635, 3), +(49220, 49636, 4), +(49220, 49638, 5), + -- Incanter's Absorption +(44394, 44394, 1), +(44394, 44395, 2), +(44394, 44396, 3), + -- Incinerate +(29722, 29722, 1), +(29722, 32231, 2), +(29722, 47837, 3), +(29722, 47838, 4), + -- Incineration +(18459, 18459, 1), +(18459, 18460, 2), +(18459, 54734, 3), + -- Incite +(50685, 50685, 1), +(50685, 50686, 2), +(50685, 50687, 3), + -- Infected Wounds +(48483, 48483, 1), +(48483, 48484, 2), +(48483, 48485, 3), + -- Infectious Poisons +(51630, 51630, 1), +(51630, 51631, 2), + -- Inner Fire +(588, 588, 1), +(588, 7128, 2), +(588, 602, 3), +(588, 1006, 4), +(588, 10951, 5), +(588, 10952, 6), +(588, 25431, 7), +(588, 48040, 8), +(588, 48168, 9), + -- Inscription +(45357, 45357, 1), +(45357, 45358, 2), +(45357, 45359, 3), +(45357, 45360, 4), +(45357, 45361, 5), +(45357, 45363, 6), + -- Insect Swarm +(5570, 5570, 1), +(5570, 24974, 2), +(5570, 24975, 3), +(5570, 24976, 4), +(5570, 24977, 5), +(5570, 27013, 6), +(5570, 48468, 7), + -- Inspiration +(14893, 14893, 1), +(14893, 15357, 2), +(14893, 15359, 3), + -- Inspiration +(14892, 14892, 1), +(14892, 15362, 2), +(14892, 15363, 3), + -- Intensify Rage +(46908, 46908, 1), +(46908, 46909, 2), +(46908, 56924, 3), + -- Intensity +(17080, 17080, 1), +(17080, 35358, 2), +(17080, 35359, 3), + -- Intensity +(17106, 17106, 1), +(17106, 17107, 2), +(17106, 17108, 3), + -- Intensity +(18135, 18135, 1), +(18135, 18136, 2), + -- Invigoration +(53252, 53252, 1), +(53252, 53253, 2), + -- Iron Will +(12300, 12300, 1), +(12300, 12959, 2), +(12300, 12960, 3), + -- Jewelcrafting +(25229, 25229, 1), +(25229, 25230, 2), +(25229, 28894, 3), +(25229, 28895, 4), +(25229, 28897, 5), +(25229, 51311, 6), + -- Judgements of the Just +(53695, 53695, 1), +(53695, 53696, 2), + -- Judgements of the Wise +(31876, 31876, 1), +(31876, 31877, 2), +(31876, 31878, 3), + -- Khadgar's Unlocking +(491, 491, 1), +(491, 857, 2), +(491, 10165, 3), +(491, 10166, 4), + -- Kidney Shot +(408, 408, 1), +(408, 8643, 2), + -- Kill Shot +(53351, 53351, 1), +(53351, 61005, 2), +(53351, 61006, 3), + -- Killer Instinct +(19370, 19370, 1), +(19370, 19371, 2), +(19370, 19373, 3), + -- Killing Machine +(51123, 51123, 1), +(51123, 51127, 2), +(51123, 51128, 3), +(51123, 51129, 4), +(51123, 51130, 5), + -- Kindling Soul +(47426, 47426, 1), +(47426, 47427, 2), + -- Kindling Soul +(47261, 47261, 1), +(47261, 47262, 2), + -- Kindred Spirits +(56314, 56314, 1), +(56314, 56315, 2), +(56314, 56316, 3), +(56314, 56317, 4), +(56314, 56318, 5), + -- King of the Jungle +(48492, 48492, 1), +(48492, 48494, 2), +(48492, 48495, 3), + -- Lacerate +(33745, 33745, 1), +(33745, 48567, 2), +(33745, 48568, 3), + -- Lash of Pain +(7814, 7814, 1), +(7814, 7815, 2), +(7814, 7816, 3), +(7814, 11778, 4), +(7814, 11779, 5), +(7814, 11780, 6), +(7814, 27274, 7), +(7814, 47991, 8), +(7814, 47992, 9), + -- Lava Breath +(58604, 58604, 1), +(58604, 58607, 2), +(58604, 58608, 3), +(58604, 58609, 4), +(58604, 58610, 5), +(58604, 58611, 6), + -- Lava Burst +(51505, 51505, 1), +(51505, 60043, 2), + -- Lava Flows +(51480, 51480, 1), +(51480, 51481, 2), +(51480, 51482, 3), + -- Lay on Hands +(633, 633, 1), +(633, 2800, 2), +(633, 10310, 3), +(633, 27154, 4), +(633, 48788, 5), + -- Leatherworking +(2108, 2108, 1), +(2108, 3104, 2), +(2108, 3811, 3), +(2108, 10662, 4), +(2108, 32549, 5), +(2108, 51302, 6), + -- Lesser Heal +(2050, 2050, 1), +(2050, 2052, 2), +(2050, 2053, 3), + -- Lesser Healing Wave +(8004, 8004, 1), +(8004, 8008, 2), +(8004, 8010, 3), +(8004, 10466, 4), +(8004, 10467, 5), +(8004, 10468, 6), +(8004, 25420, 7), +(8004, 49275, 8), +(8004, 49276, 9), + -- Lethal Shots +(19426, 19426, 1), +(19426, 19427, 2), +(19426, 19429, 3), +(19426, 19430, 4), +(19426, 19431, 5), + -- Lethality +(14128, 14128, 1), +(14128, 14132, 2), +(14128, 14135, 3), +(14128, 14136, 4), +(14128, 14137, 5), + -- Life Tap +(1454, 1454, 1), +(1454, 1455, 2), +(1454, 1456, 3), +(1454, 11687, 4), +(1454, 11688, 5), +(1454, 11689, 6), +(1454, 27222, 7), +(1454, 57946, 8), + -- Lifeblood +(55428, 55428, 1), +(55428, 55480, 2), +(55428, 55500, 3), +(55428, 55501, 4), +(55428, 55502, 5), +(55428, 55503, 6), + -- Lifebloom +(33763, 33763, 1), +(33763, 48450, 2), +(33763, 48451, 3), + -- Lightning Breath +(24845, 24845, 1), +(24845, 25013, 2), +(24845, 25014, 3), +(24845, 25015, 4), +(24845, 25016, 5), +(24845, 25017, 6), + -- Lightning Breath +(24844, 24844, 1), +(24844, 25008, 2), +(24844, 25009, 3), +(24844, 25010, 4), +(24844, 25011, 5), +(24844, 25012, 6), + -- Lightning Mastery +(16578, 16578, 1), +(16578, 16579, 2), +(16578, 16580, 3), +(16578, 16581, 4), +(16578, 16582, 5), + -- Lightning Overload +(30675, 30675, 1), +(30675, 30678, 2), +(30675, 30679, 3), + -- Lightning Reflexes +(13712, 13712, 1), +(13712, 13788, 2), +(13712, 13789, 3), + -- Lightning Reflexes +(19168, 19168, 1), +(19168, 19180, 2), +(19168, 19181, 3), +(19168, 24296, 4), +(19168, 24297, 5), + -- Light's Grace +(31833, 31833, 1), +(31833, 31835, 2), +(31833, 31836, 3), + -- Lightwell +(724, 724, 1), +(724, 27870, 2), +(724, 27871, 3), +(724, 28275, 4), +(724, 48086, 5), +(724, 48087, 6), + -- Lightwell Renew +(7001, 7001, 1), +(7001, 27873, 2), +(7001, 27874, 3), +(7001, 28276, 4), +(7001, 48084, 5), +(7001, 48085, 6), + -- Lionhearted +(53409, 53409, 1), +(53409, 53411, 2), + -- Living Seed +(48496, 48496, 1), +(48496, 48499, 2), +(48496, 48500, 3), + -- Living Spirit +(34151, 34151, 1), +(34151, 34152, 2), +(34151, 34153, 3), + -- Lock and Load +(56342, 56342, 1), +(56342, 56343, 2), +(56342, 56344, 3), + -- Lockpicking +(1809, 1809, 1), +(1809, 1810, 2), +(1809, 6460, 3), + -- Longevity +(53262, 53262, 1), +(53262, 53263, 2), +(53262, 53264, 3), + -- Lunar Guidance +(33589, 33589, 1), +(33589, 33590, 2), +(33589, 33591, 3), + -- Mace Specialization +(13709, 13709, 1), +(13709, 13800, 2), +(13709, 13801, 3), +(13709, 13802, 4), +(13709, 13803, 5), + -- Maelstrom Weapon +(51528, 51528, 1), +(51528, 51529, 2), +(51528, 51530, 3), +(51528, 51531, 4), +(51528, 51532, 5), + -- Mage Armor +(6121, 6121, 1), +(6121, 22784, 2), +(6121, 22785, 3), +(6121, 27392, 4), + -- Mage Armor +(6117, 6117, 1), +(6117, 22782, 2), +(6117, 22783, 3), +(6117, 27125, 4), +(6117, 43023, 5), +(6117, 43024, 6), + -- Magic Absorption +(29441, 29441, 1), +(29441, 29444, 2), + -- Magic Attunement +(11247, 11247, 1), +(11247, 12606, 2), + -- Magic Suppression +(49224, 49224, 1), +(49224, 49610, 2), +(49224, 49611, 3), + -- Magma Totem +(8187, 8187, 1), +(8187, 10579, 2), +(8187, 10580, 3), +(8187, 10581, 4), +(8187, 25550, 5), +(8187, 58732, 6), +(8187, 58735, 7), + -- Magma Totem +(8190, 8190, 1), +(8190, 10585, 2), +(8190, 10586, 3), +(8190, 10587, 4), +(8190, 25552, 5), +(8190, 58731, 6), +(8190, 58734, 7), + -- Magma Totem Passive +(8188, 8188, 1), +(8188, 10582, 2), +(8188, 10583, 3), +(8188, 10584, 4), +(8188, 25551, 5), +(8188, 58733, 6), +(8188, 58736, 7), + -- Maim +(22570, 22570, 1), +(22570, 49802, 2), + -- Malediction +(32477, 32477, 1), +(32477, 32483, 2), +(32477, 32484, 3), + -- Malice +(14138, 14138, 1), +(14138, 14139, 2), +(14138, 14140, 3), +(14138, 14141, 4), +(14138, 14142, 5), + -- Mana Shield +(1481, 1481, 1), +(1481, 8496, 2), +(1481, 8497, 3), +(1481, 10194, 4), +(1481, 10195, 5), +(1481, 10196, 6), +(1481, 27398, 7), + -- Mana Shield +(1463, 1463, 1), +(1463, 8494, 2), +(1463, 8495, 3), +(1463, 10191, 4), +(1463, 10192, 5), +(1463, 10193, 6), +(1463, 27131, 7), +(1463, 43019, 8), +(1463, 43020, 9), + -- Mana Spring +(5677, 5677, 1), +(5677, 10491, 2), +(5677, 10493, 3), +(5677, 10494, 4), +(5677, 25569, 5), +(5677, 58775, 6), +(5677, 58776, 7), +(5677, 58777, 8), + -- Mana Spring Totem +(5675, 5675, 1), +(5675, 10495, 2), +(5675, 10496, 3), +(5675, 10497, 4), +(5675, 25570, 5), +(5675, 58771, 6), +(5675, 58773, 7), +(5675, 58774, 8), + -- Mangle (Bear) +(33878, 33878, 1), +(33878, 33986, 2), +(33878, 33987, 3), +(33878, 48563, 4), +(33878, 48564, 5), + -- Mangle (Cat) +(33876, 33876, 1), +(33876, 33982, 2), +(33876, 33983, 3), +(33876, 48565, 4), +(33876, 48566, 5), + -- Mark of the Wild +(1126, 1126, 1), +(1126, 5232, 2), +(1126, 6756, 3), +(1126, 5234, 4), +(1126, 8907, 5), +(1126, 9884, 6), +(1126, 9885, 7), +(1126, 26990, 8), +(1126, 48469, 9), + -- Marked for Death +(53241, 53241, 1), +(53241, 53243, 2), +(53241, 53244, 3), +(53241, 53245, 4), +(53241, 53246, 5), + -- Martyrdom +(14531, 14531, 1), +(14531, 14774, 2), + -- Master Conjuror +(18767, 18767, 1), +(18767, 18768, 2), + -- Master Healer +(14904, 14904, 1), +(14904, 15024, 2), +(14904, 15025, 3), +(14904, 15026, 4), +(14904, 15027, 5), + -- Master Marksman +(34485, 34485, 1), +(34485, 34486, 2), +(34485, 34487, 3), +(34485, 34488, 4), +(34485, 34489, 5), + -- Master of Anatomy +(53125, 53125, 1), +(53125, 53662, 2), +(53125, 53663, 3), +(53125, 53664, 4), +(53125, 53665, 5), +(53125, 53666, 6), + -- Master of Deception +(13958, 13958, 1), +(13958, 13970, 2), +(13958, 13971, 3), + -- Master of Elements +(29074, 29074, 1), +(29074, 29075, 2), +(29074, 29076, 3), + -- Master of Subtlety +(31221, 31221, 1), +(31221, 31222, 2), +(31221, 31223, 3), + -- Master Poisoner +(31226, 31226, 1), +(31226, 31227, 2), +(31226, 58410, 3), + -- Master Summoner +(18709, 18709, 1), +(18709, 18710, 2), + -- Maul +(6807, 6807, 1), +(6807, 6808, 2), +(6807, 6809, 3), +(6807, 8972, 4), +(6807, 9745, 5), +(6807, 9880, 6), +(6807, 9881, 7), +(6807, 26996, 8), +(6807, 48479, 9), +(6807, 48480, 10), + -- Meditation +(14521, 14521, 1), +(14521, 14776, 2), +(14521, 14777, 3), + -- Melee Specialization +(19381, 19381, 1), +(19381, 19382, 2), +(19381, 19383, 3), +(19381, 19384, 4), +(19381, 19385, 5), + -- Melted Mind +(58378, 58378, 1), +(58378, 58379, 2), + -- Mend Pet +(136, 136, 1), +(136, 3111, 2), +(136, 3661, 3), +(136, 3662, 4), +(136, 13542, 5), +(136, 13543, 6), +(136, 13544, 7), +(136, 27046, 8), +(136, 48989, 9), +(136, 48990, 10), + -- Mental Agility +(14520, 14520, 1), +(14520, 14780, 2), +(14520, 14781, 3), + -- Mental Dexterity +(51883, 51883, 1), +(51883, 51884, 2), +(51883, 51885, 3), + -- Mental Quickness +(30812, 30812, 1), +(30812, 30813, 2), +(30812, 30814, 3), + -- Mental Strength +(18551, 18551, 1), +(18551, 18552, 2), +(18551, 18553, 3), +(18551, 18554, 4), +(18551, 18555, 5), + -- Merciless Combat +(49024, 49024, 1), +(49024, 49538, 2), + -- Might of Mograine +(49023, 49023, 1), +(49023, 49533, 2), +(49023, 49534, 3), + -- Mind Blast +(8092, 8092, 1), +(8092, 8102, 2), +(8092, 8103, 3), +(8092, 8104, 4), +(8092, 8105, 5), +(8092, 8106, 6), +(8092, 10945, 7), +(8092, 10946, 8), +(8092, 10947, 9), +(8092, 25372, 10), +(8092, 25375, 11), +(8092, 48126, 12), +(8092, 48127, 13), + -- Mind Flay +(15407, 15407, 1), +(15407, 17311, 2), +(15407, 17312, 3), +(15407, 17313, 4), +(15407, 17314, 5), +(15407, 18807, 6), +(15407, 25387, 7), +(15407, 48155, 8), +(15407, 48156, 9), + -- Mind Mastery +(31584, 31584, 1), +(31584, 31585, 2), +(31584, 31586, 3), +(31584, 31587, 4), +(31584, 31588, 5), + -- Mind Melt +(14910, 14910, 1), +(14910, 33371, 2), + -- Mind Vision +(2096, 2096, 1), +(2096, 10909, 2), + -- Mining +(2575, 2575, 1), +(2575, 2576, 2), +(2575, 3564, 3), +(2575, 10248, 4), +(2575, 29354, 5), +(2575, 50310, 6), + -- Missile Barrage +(44404, 44404, 1), +(44404, 54486, 2), +(44404, 54488, 3), +(44404, 54489, 4), +(44404, 54490, 5), + -- Molten Core +(47245, 47245, 1), +(47245, 47246, 2), +(47245, 47247, 3), + -- Molten Fury +(31679, 31679, 1), +(31679, 31680, 2), + -- Molten Shields +(11094, 11094, 1), +(11094, 13043, 2), + -- Mongoose Bite +(1495, 1495, 1), +(1495, 14269, 2), +(1495, 14270, 3), +(1495, 14271, 4), +(1495, 36916, 5), +(1495, 53339, 6), + -- Monstrous Bite +(54680, 54680, 1), +(54680, 55495, 2), +(54680, 55496, 3), +(54680, 55497, 4), +(54680, 55498, 5), +(54680, 55499, 6), + -- Moonfire +(8921, 8921, 1), +(8921, 8924, 2), +(8921, 8925, 3), +(8921, 8926, 4), +(8921, 8927, 5), +(8921, 8928, 6), +(8921, 8929, 7), +(8921, 9833, 8), +(8921, 9834, 9), +(8921, 9835, 10), +(8921, 26987, 11), +(8921, 26988, 12), +(8921, 48462, 13), +(8921, 48463, 14), + -- Moonfury +(16896, 16896, 1), +(16896, 16897, 2), +(16896, 16899, 3), + -- Moonglow +(16845, 16845, 1), +(16845, 16846, 2), +(16845, 16847, 3), + -- Morbidity +(48963, 48963, 1), +(48963, 49564, 2), +(48963, 49565, 3), + -- Mortal Shots +(19485, 19485, 1), +(19485, 19487, 2), +(19485, 19488, 3), +(19485, 19489, 4), +(19485, 19490, 5), + -- Mortal Strike +(12294, 12294, 1), +(12294, 21551, 2), +(12294, 21552, 3), +(12294, 21553, 4), +(12294, 25248, 5), +(12294, 30330, 6), +(12294, 47485, 7), +(12294, 47486, 8), + -- Multi-Shot +(2643, 2643, 1), +(2643, 14288, 2), +(2643, 14289, 3), +(2643, 14290, 4), +(2643, 25294, 5), +(2643, 27021, 6), +(2643, 49047, 7), +(2643, 49048, 8), + -- Murder +(14158, 14158, 1), +(14158, 14159, 2), + -- Mutilate +(1329, 1329, 1), +(1329, 34411, 2), +(1329, 34412, 3), +(1329, 34413, 4), +(1329, 48663, 5), +(1329, 48666, 6), + -- Natural Armor +(24547, 24547, 1), +(24547, 24556, 2), +(24547, 24557, 3), +(24547, 24558, 4), +(24547, 24559, 5), +(24547, 24560, 6), +(24547, 24561, 7), +(24547, 24562, 8), +(24547, 24631, 9), +(24547, 24632, 10), +(24547, 27362, 11), + -- Natural Armor +(61689, 61689, 1), +(61689, 61690, 2), + -- Natural Perfection +(45281, 45281, 1), +(45281, 45282, 2), +(45281, 45283, 3), + -- Natural Perfection +(33881, 33881, 1), +(33881, 33882, 2), +(33881, 33883, 3), + -- Natural Reaction +(57878, 57878, 1), +(57878, 57880, 2), +(57878, 57881, 3), + -- Natural Shapeshifter +(16833, 16833, 1), +(16833, 16834, 2), +(16833, 16835, 3), + -- Naturalist +(17069, 17069, 1), +(17069, 17070, 2), +(17069, 17071, 3), +(17069, 17072, 4), +(17069, 17073, 5), + -- Nature Resistance Totem +(10595, 10595, 1), +(10595, 10600, 2), +(10595, 10601, 3), +(10595, 25574, 4), +(10595, 58746, 5), +(10595, 58749, 6), + -- Nature's Blessing +(30867, 30867, 1), +(30867, 30868, 2), +(30867, 30869, 3), + -- Nature's Bounty +(17074, 17074, 1), +(17074, 17075, 2), +(17074, 17076, 3), +(17074, 17077, 4), +(17074, 17078, 5), + -- Nature's Focus +(17063, 17063, 1), +(17063, 17065, 2), +(17063, 17066, 3), + -- Nature's Grasp +(16689, 16689, 1), +(16689, 16810, 2), +(16689, 16811, 3), +(16689, 16812, 4), +(16689, 16813, 5), +(16689, 17329, 6), +(16689, 27009, 7), +(16689, 53312, 8), + -- Nature's Guardian +(30881, 30881, 1), +(30881, 30883, 2), +(30881, 30884, 3), +(30881, 30885, 4), +(30881, 30886, 5), + -- Nature's Reach +(16819, 16819, 1), +(16819, 16820, 2), + -- Necrosis +(51459, 51459, 1), +(51459, 51462, 2), +(51459, 51463, 3), +(51459, 51464, 4), +(51459, 51465, 5), + -- Nemesis +(63117, 63117, 1), +(63117, 63121, 2), +(63117, 63123, 3), + -- Nerves of Cold Steel +(49226, 49226, 1), +(49226, 50137, 2), +(49226, 50138, 3), + -- Nerves of Steel +(31130, 31130, 1), +(31130, 31131, 2), + -- Nether Protection +(30299, 30299, 1), +(30299, 30301, 2), +(30299, 30302, 3), + -- Nether Shock +(50479, 50479, 1), +(50479, 53584, 2), +(50479, 53586, 3), +(50479, 53587, 4), +(50479, 53588, 5), +(50479, 53589, 6), + -- Netherwind Presence +(44400, 44400, 1), +(44400, 44402, 2), +(44400, 44403, 3), + -- Night of the Dead +(55620, 55620, 1), +(55620, 55623, 2), + -- Nightfall +(18094, 18094, 1), +(18094, 18095, 2), + -- Noxious Stings +(53295, 53295, 1), +(53295, 53296, 2), +(53295, 53297, 3), + -- Nurturing Instinct +(47179, 47179, 1), +(47179, 47180, 2), + -- Nurturing Instinct +(33872, 33872, 1), +(33872, 33873, 2), + -- One-Handed Weapon Specialization +(16538, 16538, 1), +(16538, 16539, 2), +(16538, 16540, 3), +(16538, 16541, 4), +(16538, 16542, 5), + -- One-Handed Weapon Specialization +(20196, 20196, 1), +(20196, 20197, 2), +(20196, 20198, 3), + -- Opportunity +(14057, 14057, 1), +(14057, 14072, 2), + -- Outbreak +(49013, 49013, 1), +(49013, 55236, 2), +(49013, 55237, 3), + -- Owlkin Frenzy +(48389, 48389, 1), +(48389, 48392, 2), +(48389, 48393, 3), + -- Owl's Focus +(53514, 53514, 1), +(53514, 53516, 2), + -- Pain and Suffering +(47580, 47580, 1), +(47580, 47581, 2), +(47580, 47582, 3), + -- Pathfinding +(19559, 19559, 1), +(19559, 19560, 2), + -- Permafrost +(11175, 11175, 1), +(11175, 12569, 2), +(11175, 12571, 3), + -- Pet Aggression +(6311, 6311, 1), +(6311, 6314, 2), +(6311, 6315, 3), +(6311, 6316, 4), +(6311, 6317, 5), + -- Pet Barding +(53175, 53175, 1), +(53175, 53176, 2), + -- Pet Hardiness +(6280, 6280, 1), +(6280, 6281, 2), +(6280, 6282, 3), +(6280, 6283, 4), +(6280, 6286, 5), + -- Pet Recovery +(6328, 6328, 1), +(6328, 6331, 2), +(6328, 6332, 3), +(6328, 6333, 4), +(6328, 6334, 5), + -- Pet Resistance +(6443, 6443, 1), +(6443, 6444, 2), +(6443, 6445, 3), +(6443, 6446, 4), +(6443, 6447, 5), + -- Piercing Ice +(11151, 11151, 1), +(11151, 12952, 2), +(11151, 12953, 3), + -- Piercing Shots +(53234, 53234, 1), +(53234, 53237, 2), +(53234, 53238, 3), + -- Pin +(50245, 50245, 1), +(50245, 53544, 2), +(50245, 53545, 3), +(50245, 53546, 4), +(50245, 53547, 5), +(50245, 53548, 6), + -- Playing with Fire +(31638, 31638, 1), +(31638, 31639, 2), +(31638, 31640, 3), + -- Point of No Escape +(53298, 53298, 1), +(53298, 53299, 2), + -- Poison Spit +(35388, 35388, 1), +(35388, 35390, 2), +(35388, 35391, 3), + -- Poison Spit +(35387, 35387, 1), +(35387, 35389, 2), +(35387, 35392, 3), +(35387, 55555, 4), +(35387, 55556, 5), +(35387, 55557, 6), + -- Poleaxe Specialization +(12700, 12700, 1), +(12700, 12781, 2), +(12700, 12783, 3), +(12700, 12784, 4), +(12700, 12785, 5), + -- Polymorph +(118, 118, 1), +(118, 12824, 2), +(118, 12825, 3), +(118, 12826, 4), + -- Pounce +(9005, 9005, 1), +(9005, 9823, 2), +(9005, 9827, 3), +(9005, 27006, 4), +(9005, 49803, 5), + -- Pounce Bleed +(9007, 9007, 1), +(9007, 9824, 2), +(9007, 9826, 3), +(9007, 27007, 4), +(9007, 49804, 5), + -- Power Word: Fortitude +(1243, 1243, 1), +(1243, 1244, 2), +(1243, 1245, 3), +(1243, 2791, 4), +(1243, 10937, 5), +(1243, 10938, 6), +(1243, 25389, 7), +(1243, 48161, 8), + -- Power Word: Shield +(17, 17, 1), +(17, 592, 2), +(17, 600, 3), +(17, 3747, 4), +(17, 6065, 5), +(17, 6066, 6), +(17, 10898, 7), +(17, 10899, 8), +(17, 10900, 9), +(17, 10901, 10), +(17, 25217, 11), +(17, 25218, 12), +(17, 48065, 13), +(17, 48066, 14), + -- Prayer of Fortitude +(21562, 21562, 1), +(21562, 21564, 2), +(21562, 25392, 3), +(21562, 48162, 4), + -- Prayer of Healing +(596, 596, 1), +(596, 996, 2), +(596, 10960, 3), +(596, 10961, 4), +(596, 25316, 5), +(596, 25308, 6), +(596, 48072, 7), + -- Prayer of Mending +(41635, 41635, 1), +(41635, 48110, 2), +(41635, 48111, 3), + -- Prayer of Mending +(33076, 33076, 1), +(33076, 48112, 2), +(33076, 48113, 3), + -- Prayer of Shadow Protection +(27683, 27683, 1), +(27683, 39374, 2), +(27683, 48170, 3), + -- Prayer of Spirit +(27681, 27681, 1), +(27681, 32999, 2), +(27681, 48074, 3), + -- Precision +(29438, 29438, 1), +(29438, 29439, 2), +(29438, 29440, 3), + -- Precision +(13705, 13705, 1), +(13705, 13832, 2), +(13705, 13843, 3), +(13705, 13844, 4), +(13705, 13845, 5), + -- Precision +(29590, 29590, 1), +(29590, 29591, 2), +(29590, 29592, 3), + -- Predatory Instincts +(33859, 33859, 1), +(33859, 33866, 2), +(33859, 33867, 3), + -- Predatory Strikes +(16972, 16972, 1), +(16972, 16974, 2), +(16972, 16975, 3), + -- Prey on the Weak +(51685, 51685, 1), +(51685, 51686, 2), +(51685, 51687, 3), +(51685, 51688, 4), +(51685, 51689, 5), + -- Primal Precision +(48409, 48409, 1), +(48409, 48410, 2), + -- Primal Tenacity +(33851, 33851, 1), +(33851, 33852, 2), +(33851, 33957, 3), + -- Prismatic Cloak +(31574, 31574, 1), +(31574, 31575, 2), +(31574, 54354, 3), + -- Protector of the Pack +(57873, 57873, 1), +(57873, 57876, 2), +(57873, 57877, 3), + -- Prowl +(24450, 24450, 1), +(24450, 24452, 2), +(24450, 24453, 3), + -- Psychic Scream +(8122, 8122, 1), +(8122, 8124, 2), +(8122, 10888, 3), +(8122, 10890, 4), + -- Pummel +(13491, 13491, 1), +(13491, 6554, 2), +(13491, 6555, 3), + -- Puncture +(12308, 12308, 1), +(12308, 12810, 2), +(12308, 12811, 3), + -- Puncturing Wounds +(13733, 13733, 1), +(13733, 13865, 2), +(13733, 13866, 3), + -- Pure of Heart +(31822, 31822, 1), +(31822, 31823, 2), + -- Purge +(370, 370, 1), +(370, 8012, 2), + -- Purification +(16178, 16178, 1), +(16178, 16210, 2), +(16178, 16211, 3), +(16178, 16212, 4), +(16178, 16213, 5), + -- Purifying Power +(31825, 31825, 1), +(31825, 31826, 2), + -- Pursuit of Justice +(61417, 61417, 1), +(61417, 61418, 2), + -- Pursuit of Justice +(26022, 26022, 1), +(26022, 26023, 2), + -- Pyroblast +(11366, 11366, 1), +(11366, 12505, 2), +(11366, 12522, 3), +(11366, 12523, 4), +(11366, 12524, 5), +(11366, 12525, 6), +(11366, 12526, 7), +(11366, 18809, 8), +(11366, 27132, 9), +(11366, 33938, 10), +(11366, 42890, 11), +(11366, 42891, 12), + -- Pyroclasm +(18096, 18096, 1), +(18096, 18073, 2), +(18096, 63245, 3), + -- Pyromaniac +(34293, 34293, 1), +(34293, 34295, 2), +(34293, 34296, 3), + -- Quick Recovery +(31244, 31244, 1), +(31244, 31245, 2), + -- Rage of Rivendare +(50117, 50117, 1), +(50117, 50118, 2), +(50117, 50119, 3), +(50117, 50120, 4), +(50117, 50121, 5), + -- Rake +(1822, 1822, 1), +(1822, 1823, 2), +(1822, 1824, 3), +(1822, 9904, 4), +(1822, 27003, 5), +(1822, 48573, 6), +(1822, 48574, 7), + -- Rake +(59881, 59881, 1), +(59881, 59882, 2), +(59881, 59883, 3), +(59881, 59884, 4), +(59881, 59885, 5), +(59881, 59886, 6), + -- Ranged Weapon Specialization +(19507, 19507, 1), +(19507, 19508, 2), +(19507, 19509, 3), + -- Rapid Recuperation +(53228, 53228, 1), +(53228, 53232, 2), + -- Raptor Strike +(2973, 2973, 1), +(2973, 14260, 2), +(2973, 14261, 3), +(2973, 14262, 4), +(2973, 14263, 5), +(2973, 14264, 6), +(2973, 14265, 7), +(2973, 14266, 8), +(2973, 27014, 9), +(2973, 48995, 10), +(2973, 48996, 11), + -- Rapture +(47535, 47535, 1), +(47535, 47536, 2), +(47535, 47537, 3), + -- Ravage +(6785, 6785, 1), +(6785, 6787, 2), +(6785, 9866, 3), +(6785, 9867, 4), +(6785, 27005, 5), +(6785, 48578, 6), +(6785, 48579, 7), + -- Ravage +(50518, 50518, 1), +(50518, 53558, 2), +(50518, 53559, 3), +(50518, 53560, 4), +(50518, 53561, 5), +(50518, 53562, 6), + -- Ravenous Dead +(48965, 48965, 1), +(48965, 49571, 2), +(48965, 49572, 3), + -- Reaping +(49208, 49208, 1), +(49208, 56834, 2), +(49208, 56835, 3), + -- Rebirth +(20484, 20484, 1), +(20484, 20739, 2), +(20484, 20742, 3), +(20484, 20747, 4), +(20484, 20748, 5), +(20484, 26994, 6), +(20484, 48477, 7), + -- Reckoning +(20177, 20177, 1), +(20177, 20179, 2), +(20177, 20181, 3), +(20177, 20180, 4), +(20177, 20182, 5), + -- Redemption +(7328, 7328, 1), +(7328, 10322, 2), +(7328, 10324, 3), +(7328, 20772, 4), +(7328, 20773, 5), +(7328, 48949, 6), +(7328, 48950, 7), + -- Redoubt +(20127, 20127, 1), +(20127, 20130, 2), +(20127, 20135, 3), + -- Reflective Shield +(33201, 33201, 1), +(33201, 33202, 2), + -- Regeneration +(30799, 30799, 1), +(30799, 30800, 2), +(30799, 30801, 3), + -- Regrowth +(8936, 8936, 1), +(8936, 8938, 2), +(8936, 8939, 3), +(8936, 8940, 4), +(8936, 8941, 5), +(8936, 9750, 6), +(8936, 9856, 7), +(8936, 9857, 8), +(8936, 9858, 9), +(8936, 26980, 10), +(8936, 48442, 11), +(8936, 48443, 12), + -- Rejuvenation +(774, 774, 1), +(774, 1058, 2), +(774, 1430, 3), +(774, 2090, 4), +(774, 2091, 5), +(774, 3627, 6), +(774, 8910, 7), +(774, 9839, 8), +(774, 9840, 9), +(774, 9841, 10), +(774, 25299, 11), +(774, 26981, 12), +(774, 26982, 13), +(774, 48440, 14), +(774, 48441, 15), + -- Relentless Strikes +(14179, 14179, 1), +(14179, 58422, 2), +(14179, 58423, 3), +(14179, 58424, 4), +(14179, 58425, 5), + -- Remorseless +(14143, 14143, 1), +(14143, 14149, 2), + -- Remorseless Attacks +(14144, 14144, 1), +(14144, 14148, 2), + -- Rend +(772, 772, 1), +(772, 6546, 2), +(772, 6547, 3), +(772, 6548, 4), +(772, 11572, 5), +(772, 11573, 6), +(772, 11574, 7), +(772, 25208, 8), +(772, 46845, 9), +(772, 47465, 10), + -- Rend and Tear +(48432, 48432, 1), +(48432, 48433, 2), +(48432, 48434, 3), +(48432, 51268, 4), +(48432, 51269, 5), + -- Renew +(139, 139, 1), +(139, 6074, 2), +(139, 6075, 3), +(139, 6076, 4), +(139, 6077, 5), +(139, 6078, 6), +(139, 10927, 7), +(139, 10928, 8), +(139, 10929, 9), +(139, 25315, 10), +(139, 25221, 11), +(139, 25222, 12), +(139, 48067, 13), +(139, 48068, 14), + -- Renewed Hope +(57470, 57470, 1), +(57470, 57472, 2), + -- Replenish Mana +(5405, 5405, 1), +(5405, 10052, 2), +(5405, 10057, 3), +(5405, 10058, 4), +(5405, 27103, 5), +(5405, 42987, 6), +(5405, 42988, 7), + -- Resourcefulness +(34491, 34491, 1), +(34491, 34492, 2), +(34491, 34493, 3), + -- Restorative Totems +(16187, 16187, 1), +(16187, 16205, 2), +(16187, 16206, 3), + -- Resurrection +(2006, 2006, 1), +(2006, 2010, 2), +(2006, 10880, 3), +(2006, 10881, 4), +(2006, 20770, 5), +(2006, 25435, 6), +(2006, 48171, 7), + -- Retribution Aura +(7294, 7294, 1), +(7294, 10298, 2), +(7294, 10299, 3), +(7294, 10300, 4), +(7294, 10301, 5), +(7294, 27150, 6), +(7294, 54043, 7), + -- Revenge +(6572, 6572, 1), +(6572, 6574, 2), +(6572, 7379, 3), +(6572, 11600, 4), +(6572, 11601, 5), +(6572, 25288, 6), +(6572, 25269, 7), +(6572, 30357, 8), +(6572, 57823, 9), + -- Reverberation +(16040, 16040, 1), +(16040, 16113, 2), +(16040, 16114, 3), +(16040, 16115, 4), +(16040, 16116, 5), + -- Revitalize +(48539, 48539, 1), +(48539, 48544, 2), +(48539, 48545, 3), + -- Revive +(50769, 50769, 1), +(50769, 50768, 2), +(50769, 50767, 3), +(50769, 50766, 4), +(50769, 50765, 5), +(50769, 50764, 6), +(50769, 50763, 7), + -- Righteous Vengeance +(53380, 53380, 1), +(53380, 53381, 2), +(53380, 53382, 3), + -- Rime +(49188, 49188, 1), +(49188, 56822, 2), +(49188, 59057, 3), + -- Rip +(1079, 1079, 1), +(1079, 9492, 2), +(1079, 9493, 3), +(1079, 9752, 4), +(1079, 9894, 5), +(1079, 9896, 6), +(1079, 27008, 7), +(1079, 49799, 8), +(1079, 49800, 9), + -- Riptide +(61295, 61295, 1), +(61295, 61299, 2), +(61295, 61300, 3), +(61295, 61301, 4), + -- Ritual of Refreshment +(43987, 43987, 1), +(43987, 58659, 2), + -- Ritual of Souls +(29893, 29893, 1), +(29893, 58887, 2), + -- Rockbiter Weapon +(8017, 8017, 1), +(8017, 8018, 2), +(8017, 8019, 3), +(8017, 10399, 4), + -- Ruin +(17959, 17959, 1), +(17959, 59738, 2), +(17959, 59739, 3), +(17959, 59740, 4), +(17959, 59741, 5), + -- Runic Power Mastery +(49455, 49455, 1), +(49455, 50147, 2), + -- Rupture +(1943, 1943, 1), +(1943, 8639, 2), +(1943, 8640, 3), +(1943, 11273, 4), +(1943, 11274, 5), +(1943, 11275, 6), +(1943, 26867, 7), +(1943, 48671, 8), +(1943, 48672, 9), + -- Ruthlessness +(14156, 14156, 1), +(14156, 14160, 2), +(14156, 14161, 3), + -- Sacred Cleansing +(53551, 53551, 1), +(53551, 53552, 2), +(53551, 53553, 3), + -- Sacred Duty +(31848, 31848, 1), +(31848, 31849, 2), + -- Sacrifice +(7812, 7812, 1), +(7812, 19438, 2), +(7812, 19440, 3), +(7812, 19441, 4), +(7812, 19442, 5), +(7812, 19443, 6), +(7812, 27273, 7), +(7812, 47985, 8), +(7812, 47986, 9), + -- Sanctified Light +(20359, 20359, 1), +(20359, 20360, 2), +(20359, 20361, 3), + -- Sanctified Wrath +(53375, 53375, 1), +(53375, 53376, 2), + -- Sanctity of Battle +(32043, 32043, 1), +(32043, 35396, 2), +(32043, 35397, 3), + -- Sap +(6770, 6770, 1), +(6770, 2070, 2), +(6770, 11297, 3), +(6770, 51724, 4), + -- Savage Combat +(58684, 58684, 1), +(58684, 58683, 2), + -- Savage Combat +(51682, 51682, 1), +(51682, 58413, 2), + -- Savage Fury +(16998, 16998, 1), +(16998, 16999, 2), + -- Savage Strikes +(19159, 19159, 1), +(19159, 19160, 2), + -- Scare Beast +(1513, 1513, 1), +(1513, 14326, 2), +(1513, 14327, 3), + -- Scent of Blood +(49004, 49004, 1), +(49004, 49508, 2), +(49004, 49509, 3), + -- Scorch +(1811, 1811, 1), +(1811, 8447, 2), +(1811, 8448, 3), +(1811, 8449, 4), +(1811, 10208, 5), +(1811, 10209, 6), +(1811, 10210, 7), +(1811, 27375, 8), +(1811, 27376, 9), + -- Scorch +(2948, 2948, 1), +(2948, 8444, 2), +(2948, 8445, 3), +(2948, 8446, 4), +(2948, 10205, 5), +(2948, 10206, 6), +(2948, 10207, 7), +(2948, 27073, 8), +(2948, 27074, 9), +(2948, 42858, 10), +(2948, 42859, 11), + -- Scorpid Poison +(24641, 24641, 1), +(24641, 24584, 2), +(24641, 24588, 3), +(24641, 24589, 4), +(24641, 27361, 5), + -- Scorpid Poison +(24640, 24640, 1), +(24640, 24583, 2), +(24640, 24586, 3), +(24640, 24587, 4), +(24640, 27060, 5), +(24640, 55728, 6), + -- Scourge Strike +(55090, 55090, 1), +(55090, 55265, 2), +(55090, 55270, 3), +(55090, 55271, 4), + -- Seal Fate +(14186, 14186, 1), +(14186, 14190, 2), +(14186, 14193, 3), +(14186, 14194, 4), +(14186, 14195, 5), + -- Seals of the Pure +(20224, 20224, 1), +(20224, 20225, 2), +(20224, 20330, 3), +(20224, 20331, 4), +(20224, 20332, 5), + -- Searing Light +(14909, 14909, 1), +(14909, 15017, 2), + -- Searing Pain +(5676, 5676, 1), +(5676, 17919, 2), +(5676, 17920, 3), +(5676, 17921, 4), +(5676, 17922, 5), +(5676, 17923, 6), +(5676, 27210, 7), +(5676, 30459, 8), +(5676, 47814, 9), +(5676, 47815, 10), + -- Searing Totem +(2075, 2075, 1), +(2075, 38116, 2), + -- Searing Totem +(3599, 3599, 1), +(3599, 6363, 2), +(3599, 6364, 3), +(3599, 6365, 4), +(3599, 10437, 5), +(3599, 10438, 6), +(3599, 25533, 7), +(3599, 58699, 8), +(3599, 58703, 9), +(3599, 58704, 10), + -- Seed of Corruption +(43991, 43991, 1), +(43991, 47831, 2), +(43991, 47832, 3), + -- Serendipity +(63730, 63730, 1), +(63730, 63733, 2), +(63730, 63737, 3), + -- Serenity Dust +(50318, 50318, 1), +(50318, 52012, 2), +(50318, 52013, 3), +(50318, 52014, 4), +(50318, 52015, 5), +(50318, 52016, 6), + -- Serious Wound +(5597, 5597, 1), +(5597, 5598, 2), + -- Serpent Sting +(1978, 1978, 1), +(1978, 13549, 2), +(1978, 13550, 3), +(1978, 13551, 4), +(1978, 13552, 5), +(1978, 13553, 6), +(1978, 13554, 7), +(1978, 13555, 8), +(1978, 25295, 9), +(1978, 27016, 10), +(1978, 49000, 11), +(1978, 49001, 12), + -- Serpent's Swiftness +(34466, 34466, 1), +(34466, 34467, 2), +(34466, 34468, 3), +(34466, 34469, 4), +(34466, 34470, 5), + -- Serrated Blades +(14171, 14171, 1), +(14171, 14172, 2), +(14171, 14173, 3), + -- Setup +(13983, 13983, 1), +(13983, 14070, 2), +(13983, 14071, 3), + -- Shackle Undead +(9484, 9484, 1), +(9484, 9485, 2), +(9484, 10955, 3), + -- Shadow Affinity +(15318, 15318, 1), +(15318, 15272, 2), +(15318, 15320, 3), + -- Shadow and Flame +(30288, 30288, 1), +(30288, 30289, 2), +(30288, 30290, 3), +(30288, 30291, 4), +(30288, 30292, 5), + -- Shadow Bite +(54049, 54049, 1), +(54049, 54050, 2), +(54049, 54051, 3), +(54049, 54052, 4), +(54049, 54053, 5), + -- Shadow Bolt +(686, 686, 1), +(686, 695, 2), +(686, 705, 3), +(686, 1088, 4), +(686, 1106, 5), +(686, 7641, 6), +(686, 11659, 7), +(686, 11660, 8), +(686, 11661, 9), +(686, 25307, 10), +(686, 27209, 11), +(686, 47808, 12), +(686, 47809, 13), + -- Shadow Embrace +(32385, 32385, 1), +(32385, 32387, 2), +(32385, 32392, 3), +(32385, 32393, 4), +(32385, 32394, 5), + -- Shadow Focus +(15260, 15260, 1), +(15260, 15327, 2), +(15260, 15328, 3), + -- Shadow Mastery +(18271, 18271, 1), +(18271, 18272, 2), +(18271, 18273, 3), +(18271, 18274, 4), +(18271, 18275, 5), + -- Shadow Power +(33221, 33221, 1), +(33221, 33222, 2), +(33221, 33223, 3), +(33221, 33224, 4), +(33221, 33225, 5), + -- Shadow Protection +(976, 976, 1), +(976, 10957, 2), +(976, 10958, 3), +(976, 25433, 4), +(976, 48169, 5), + -- Shadow Reach +(17322, 17322, 1), +(17322, 17323, 2), + -- Shadow Resistance Aura +(19876, 19876, 1), +(19876, 19895, 2), +(19876, 19896, 3), +(19876, 27151, 4), +(19876, 48943, 5), + -- Shadow Ward +(6229, 6229, 1), +(6229, 11739, 2), +(6229, 11740, 3), +(6229, 28610, 4), +(6229, 47890, 5), +(6229, 47891, 6), + -- Shadow Weaving +(15257, 15257, 1), +(15257, 15331, 2), +(15257, 15332, 3), + -- Shadow Word: Death +(32379, 32379, 1), +(32379, 32996, 2), +(32379, 48157, 3), +(32379, 48158, 4), + -- Shadow Word: Pain +(589, 589, 1), +(589, 594, 2), +(589, 970, 3), +(589, 992, 4), +(589, 2767, 5), +(589, 10892, 6), +(589, 10893, 7), +(589, 10894, 8), +(589, 25367, 9), +(589, 25368, 10), +(589, 48124, 11), +(589, 48125, 12), + -- Shadowburn +(17877, 17877, 1), +(17877, 18867, 2), +(17877, 18868, 3), +(17877, 18869, 4), +(17877, 18870, 5), +(17877, 18871, 6), +(17877, 27263, 7), +(17877, 30546, 8), +(17877, 47826, 9), +(17877, 47827, 10), + -- Shadowflame +(47897, 47897, 1), +(47897, 61290, 2), + -- Shadowfury +(30283, 30283, 1), +(30283, 30413, 2), +(30283, 30414, 3), +(30283, 47846, 4), +(30283, 47847, 5), + -- Shamanism +(62097, 62097, 1), +(62097, 62098, 2), +(62097, 62099, 3), +(62097, 62100, 4), +(62097, 62101, 5), + -- Shark Attack +(62759, 62759, 1), +(62759, 62760, 2), + -- Sharpened Claws +(16942, 16942, 1), +(16942, 16943, 2), +(16942, 16944, 3), + -- Shatter +(11170, 11170, 1), +(11170, 12982, 2), +(11170, 12983, 3), + -- Shattered Barrier +(44745, 44745, 1), +(44745, 54787, 2), + -- Sheath of Light +(53501, 53501, 1), +(53501, 53502, 2), +(53501, 53503, 3), + -- Shield Mastery +(29598, 29598, 1), +(29598, 29599, 2), + -- Shield of Righteousness +(53600, 53600, 1), +(53600, 61411, 2), + -- Shield of the Templar +(53709, 53709, 1), +(53709, 53710, 2), +(53709, 53711, 3), + -- Shield Slam +(23922, 23922, 1), +(23922, 23923, 2), +(23922, 23924, 3), +(23922, 23925, 4), +(23922, 25258, 5), +(23922, 30356, 6), +(23922, 47487, 7), +(23922, 47488, 8), + -- Shield Specialization +(12298, 12298, 1), +(12298, 12724, 2), +(12298, 12725, 3), +(12298, 12726, 4), +(12298, 12727, 5), + -- Shield Specialization +(16253, 16253, 1), +(16253, 16298, 2), + -- Shock +(2607, 2607, 1), +(2607, 2606, 2), +(2607, 2608, 3), +(2607, 2609, 4), +(2607, 2610, 5), + -- Shred +(5221, 5221, 1), +(5221, 6800, 2), +(5221, 8992, 3), +(5221, 9829, 4), +(5221, 9830, 5), +(5221, 27001, 6), +(5221, 27002, 7), +(5221, 48571, 8), +(5221, 48572, 9), + -- Shredding Attacks +(16966, 16966, 1), +(16966, 16968, 2), + -- Silenced - Improved Counterspell +(18469, 18469, 1), +(18469, 55021, 2), + -- Silent Hunter +(34472, 34472, 1), +(34472, 34473, 2), +(34472, 34474, 3), + -- Silent Resolve +(14523, 14523, 1), +(14523, 14784, 2), +(14523, 14785, 3), + -- Silverback +(62764, 62764, 1), +(62764, 62765, 2), + -- Sinister Calling +(31216, 31216, 1), +(31216, 31217, 2), +(31216, 31218, 3), +(31216, 31219, 4), +(31216, 31220, 5), + -- Sinister Strike +(1752, 1752, 1), +(1752, 1757, 2), +(1752, 1758, 3), +(1752, 1759, 4), +(1752, 1760, 5), +(1752, 8621, 6), +(1752, 11293, 7), +(1752, 11294, 8), +(1752, 26861, 9), +(1752, 26862, 10), +(1752, 48637, 11), +(1752, 48638, 12), + -- Skinning +(8613, 8613, 1), +(8613, 8617, 2), +(8613, 8618, 3), +(8613, 10768, 4), +(8613, 32678, 5), +(8613, 50305, 6), + -- Slam +(1464, 1464, 1), +(1464, 8820, 2), +(1464, 11604, 3), +(1464, 11605, 4), +(1464, 25241, 5), +(1464, 25242, 6), +(1464, 47474, 7), +(1464, 47475, 8), + -- Slaughter from the Shadows +(51708, 51708, 1), +(51708, 51709, 2), +(51708, 51710, 3), +(51708, 51711, 4), +(51708, 51712, 5), + -- Sleep +(700, 700, 1), +(700, 1090, 2), + -- Sleight of Hand +(30892, 30892, 1), +(30892, 30893, 2), + -- Slice and Dice +(5171, 5171, 1), +(5171, 6774, 2), + -- Slow +(246, 246, 1), +(246, 6146, 2), + -- Smack +(49966, 49966, 1), +(49966, 49967, 2), +(49966, 49968, 3), +(49966, 49969, 4), +(49966, 49970, 5), +(49966, 49971, 6), +(49966, 49972, 7), +(49966, 49973, 8), +(49966, 49974, 9), +(49966, 52475, 10), +(49966, 52476, 11), + -- Smite +(585, 585, 1), +(585, 591, 2), +(585, 598, 3), +(585, 984, 4), +(585, 1004, 5), +(585, 6060, 6), +(585, 10933, 7), +(585, 10934, 8), +(585, 25363, 9), +(585, 25364, 10), +(585, 48122, 11), +(585, 48123, 12), + -- Snatch +(50541, 50541, 1), +(50541, 53537, 2), +(50541, 53538, 3), +(50541, 53540, 4), +(50541, 53542, 5), +(50541, 53543, 6), + -- Sniper Training +(53302, 53302, 1), +(53302, 53303, 2), +(53302, 53304, 3), + -- Sonic Blast +(50519, 50519, 1), +(50519, 53564, 2), +(50519, 53565, 3), +(50519, 53566, 4), +(50519, 53567, 5), +(50519, 53568, 6), + -- Soothe Animal +(2908, 2908, 1), +(2908, 8955, 2), +(2908, 9901, 3), +(2908, 26995, 4), + -- Soothing Kiss +(6360, 6360, 1), +(6360, 7813, 2), +(6360, 11784, 3), +(6360, 11785, 4), +(6360, 27275, 5), + -- Soul Fire +(6353, 6353, 1), +(6353, 17924, 2), +(6353, 27211, 3), +(6353, 30545, 4), +(6353, 47824, 5), +(6353, 47825, 6), + -- Soul Leech +(30293, 30293, 1), +(30293, 30295, 2), +(30293, 30296, 3), + -- Soul Siphon +(17804, 17804, 1), +(17804, 17805, 2), + -- Spark of Nature +(48435, 48435, 1), +(48435, 48436, 2), +(48435, 48437, 3), + -- Spell Deflection +(49145, 49145, 1), +(49145, 49495, 2), +(49145, 49497, 3), + -- Spell Impact +(11242, 11242, 1), +(11242, 12467, 2), +(11242, 12469, 3), + -- Spell Lock +(19244, 19244, 1), +(19244, 19647, 2), + -- Spell Power +(35578, 35578, 1), +(35578, 35581, 2), + -- Spell Warding +(27900, 27900, 1), +(27900, 27901, 2), +(27900, 27902, 3), +(27900, 27903, 4), +(27900, 27904, 5), + -- Spider's Bite +(53203, 53203, 1), +(53203, 53204, 2), +(53203, 53205, 3), + -- Spiked Collar +(53182, 53182, 1), +(53182, 53183, 2), +(53182, 53184, 3), + -- Spirit +(8112, 8112, 1), +(8112, 8113, 2), +(8112, 8114, 3), +(8112, 12177, 4), +(8112, 33080, 5), +(8112, 43197, 6), +(8112, 48103, 7), +(8112, 48104, 8), + -- Spirit Strike +(61193, 61193, 1), +(61193, 61194, 2), +(61193, 61195, 3), +(61193, 61196, 4), +(61193, 61197, 5), +(61193, 61198, 6), + -- Spirit Tap +(15270, 15270, 1), +(15270, 15335, 2), +(15270, 15336, 3), + -- Spiritual Attunement +(31785, 31785, 1), +(31785, 33776, 2), + -- Spiritual Focus +(20205, 20205, 1), +(20205, 20206, 2), +(20205, 20207, 3), +(20205, 20209, 4), +(20205, 20208, 5), + -- Spiritual Guidance +(14901, 14901, 1), +(14901, 15028, 2), +(14901, 15029, 3), +(14901, 15030, 4), +(14901, 15031, 5), + -- Spiritual Healing +(14898, 14898, 1), +(14898, 15349, 2), +(14898, 15354, 3), +(14898, 15355, 4), +(14898, 15356, 5), + -- Spore Cloud +(50274, 50274, 1), +(50274, 53593, 2), +(50274, 53594, 3), +(50274, 53596, 4), +(50274, 53597, 5), +(50274, 53598, 6), + -- Sprint +(2983, 2983, 1), +(2983, 8696, 2), +(2983, 11305, 3), + -- Stampede +(57386, 57386, 1), +(57386, 57389, 2), +(57386, 57390, 3), +(57386, 57391, 4), +(57386, 57392, 5), +(57386, 57393, 6), + -- Starfall +(48505, 48505, 1), +(48505, 53199, 2), +(48505, 53200, 3), +(48505, 53201, 4), + -- Starfire +(2912, 2912, 1), +(2912, 8949, 2), +(2912, 8950, 3), +(2912, 8951, 4), +(2912, 9875, 5), +(2912, 9876, 6), +(2912, 25298, 7), +(2912, 26986, 8), +(2912, 48464, 9), +(2912, 48465, 10), + -- Starlight Wrath +(16814, 16814, 1), +(16814, 16815, 2), +(16814, 16816, 3), +(16814, 16817, 4), +(16814, 16818, 5), + -- Static Shock +(51525, 51525, 1), +(51525, 51526, 2), +(51525, 51527, 3), + -- Steady Shot +(56641, 56641, 1), +(56641, 34120, 2), +(56641, 49051, 3), +(56641, 49052, 4), + -- Sting +(56626, 56626, 1), +(56626, 56627, 2), +(56626, 56628, 3), +(56626, 56629, 4), +(56626, 56630, 5), +(56626, 56631, 6), + -- Stoicism +(31844, 31844, 1), +(31844, 31845, 2), +(31844, 53519, 3), + -- Stoneclaw Totem +(5730, 5730, 1), +(5730, 6390, 2), +(5730, 6391, 3), +(5730, 6392, 4), +(5730, 10427, 5), +(5730, 10428, 6), +(5730, 25525, 7), +(5730, 58580, 8), +(5730, 58581, 9), +(5730, 58582, 10), + -- Stoneclaw Totem Passive +(5728, 5728, 1), +(5728, 6397, 2), +(5728, 6398, 3), +(5728, 6399, 4), +(5728, 10425, 5), +(5728, 10426, 6), +(5728, 25513, 7), +(5728, 58583, 8), +(5728, 58584, 9), +(5728, 58585, 10), + -- Stoneskin Totem +(8073, 8073, 1), +(8073, 38115, 2), + -- Stoneskin Totem +(8071, 8071, 1), +(8071, 8154, 2), +(8071, 8155, 3), +(8071, 10406, 4), +(8071, 10407, 5), +(8071, 10408, 6), +(8071, 25508, 7), +(8071, 25509, 8), +(8071, 58751, 9), +(8071, 58753, 10), + -- Storm, Earth and Fire +(51483, 51483, 1), +(51483, 51485, 2), +(51483, 51486, 3), + -- Strength +(8118, 8118, 1), +(8118, 8119, 2), +(8118, 8120, 3), +(8118, 12179, 4), +(8118, 33082, 5), +(8118, 43199, 6), +(8118, 58448, 7), +(8118, 58449, 8), + -- Strength of Arms +(46865, 46865, 1), +(46865, 46866, 2), + -- Strength of Earth Totem +(8075, 8075, 1), +(8075, 8160, 2), +(8075, 8161, 3), +(8075, 10442, 4), +(8075, 25361, 5), +(8075, 25528, 6), +(8075, 57622, 7), +(8075, 58643, 8), + -- Student of the Mind +(44397, 44397, 1), +(44397, 44398, 2), +(44397, 44399, 3), + -- Stunning Blast +(5648, 5648, 1), +(5648, 5649, 2), + -- Stunning Blow +(5726, 5726, 1), +(5726, 5727, 2), + -- Subtlety +(17118, 17118, 1), +(17118, 17119, 2), +(17118, 17120, 3), + -- Subversion +(48997, 48997, 1), +(48997, 49490, 2), +(48997, 49491, 3), + -- Sudden Death +(29723, 29723, 1), +(29723, 29725, 2), +(29723, 29724, 3), + -- Sudden Doom +(49018, 49018, 1), +(49018, 49529, 2), +(49018, 49530, 3), + -- Suffering +(17735, 17735, 1), +(17735, 17750, 2), +(17735, 17751, 3), +(17735, 17752, 4), +(17735, 27271, 5), +(17735, 33701, 6), +(17735, 47989, 7), +(17735, 47990, 8), + -- Suppression +(18174, 18174, 1), +(18174, 18175, 2), +(18174, 18176, 3), + -- Surefooted +(19290, 19290, 1), +(19290, 19294, 2), +(19290, 24283, 3), + -- Survival Instincts +(34494, 34494, 1), +(34494, 34496, 2), + -- Survival of the Fittest +(33853, 33853, 1), +(33853, 33855, 2), +(33853, 33856, 3), + -- Survival Tactics +(19286, 19286, 1), +(19286, 19287, 2), + -- Survivalist +(19255, 19255, 1), +(19255, 19256, 2), +(19255, 19257, 3), +(19255, 19258, 4), +(19255, 19259, 5), + -- Swift Retribution +(53379, 53379, 1), +(53379, 53484, 2), +(53379, 53648, 3), + -- Swipe +(50256, 50256, 1), +(50256, 53526, 2), +(50256, 53528, 3), +(50256, 53529, 4), +(50256, 53532, 5), +(50256, 53533, 6), + -- Swipe (Bear) +(779, 779, 1), +(779, 780, 2), +(779, 769, 3), +(779, 9754, 4), +(779, 9908, 5), +(779, 26997, 6), +(779, 48561, 7), +(779, 48562, 8), + -- Sword and Board +(46951, 46951, 1), +(46951, 46952, 2), +(46951, 46953, 3), + -- Sword Specialization +(12281, 12281, 1), +(12281, 12812, 2), +(12281, 12813, 3), +(12281, 12814, 4), +(12281, 12815, 5), + -- T.N.T. +(56333, 56333, 1), +(56333, 56336, 2), +(56333, 56337, 3), + -- Tactical Mastery +(12295, 12295, 1), +(12295, 12676, 2), +(12295, 12677, 3), + -- Tailoring +(3908, 3908, 1), +(3908, 3909, 2), +(3908, 3910, 3), +(3908, 12180, 4), +(3908, 26790, 5), +(3908, 51309, 6), + -- Taste for Blood +(56636, 56636, 1), +(56636, 56637, 2), +(56636, 56638, 3), + -- Tendon Rip +(50271, 50271, 1), +(50271, 53571, 2), +(50271, 53572, 3), +(50271, 53573, 4), +(50271, 53574, 5), +(50271, 53575, 6), + -- Test of Faith +(47558, 47558, 1), +(47558, 47559, 2), +(47558, 47560, 3), + -- Thick Hide +(19609, 19609, 1), +(19609, 19610, 2), +(19609, 19612, 3), + -- Thick Hide +(16929, 16929, 1), +(16929, 16930, 2), +(16929, 16931, 3), + -- Thorns +(467, 467, 1), +(467, 782, 2), +(467, 1075, 3), +(467, 8914, 4), +(467, 9756, 5), +(467, 9910, 6), +(467, 26992, 7), +(467, 53307, 8), + -- Threat of Thassarian +(65661, 65661, 1), +(65661, 66191, 2), +(65661, 66192, 3), + -- Thrill of the Hunt +(34497, 34497, 1), +(34497, 34498, 2), +(34497, 34499, 3), + -- Throwing Specialization +(5952, 5952, 1), +(5952, 51679, 2), + -- Thunder Clap +(6343, 6343, 1), +(6343, 8198, 2), +(6343, 8204, 3), +(6343, 8205, 4), +(6343, 11580, 5), +(6343, 11581, 6), +(6343, 25264, 7), +(6343, 47501, 8), +(6343, 47502, 9), + -- Thundering Strikes +(16255, 16255, 1), +(16255, 16302, 2), +(16255, 16303, 3), +(16255, 16304, 4), +(16255, 16305, 5), + -- Thunderstorm +(51490, 51490, 1), +(51490, 59156, 2), +(51490, 59158, 3), +(51490, 59159, 4), + -- Tidal Focus +(16179, 16179, 1), +(16179, 16214, 2), +(16179, 16215, 3), +(16179, 16216, 4), +(16179, 16217, 5), + -- Tidal Mastery +(16194, 16194, 1), +(16194, 16218, 2), +(16194, 16219, 3), +(16194, 16220, 4), +(16194, 16221, 5), + -- Tidal Waves +(51562, 51562, 1), +(51562, 51563, 2), +(51562, 51564, 3), +(51562, 51565, 4), +(51562, 51566, 5), + -- Tiger's Fury +(5217, 5217, 1), +(5217, 6793, 2), +(5217, 9845, 3), +(5217, 9846, 4), +(5217, 50212, 5), +(5217, 50213, 6), + -- Torment +(3716, 3716, 1), +(3716, 7809, 2), +(3716, 7810, 3), +(3716, 7811, 4), +(3716, 11774, 5), +(3716, 11775, 6), +(3716, 27270, 7), +(3716, 47984, 8), + -- Torment the Weak +(29447, 29447, 1), +(29447, 55339, 2), +(29447, 55340, 3), + -- Torture +(47263, 47263, 1), +(47263, 47264, 2), +(47263, 47265, 3), + -- Totem of Wrath +(30706, 30706, 1), +(30706, 57720, 2), +(30706, 57721, 3), +(30706, 57722, 4), + -- Totemic Focus +(16173, 16173, 1), +(16173, 16222, 2), +(16173, 16223, 3), +(16173, 16224, 4), +(16173, 16225, 5), + -- Touched by the Light +(53590, 53590, 1), +(53590, 53591, 2), +(53590, 53592, 3), + -- Toughness +(53120, 53120, 1), +(53120, 53121, 2), +(53120, 53122, 3), +(53120, 53123, 4), +(53120, 53124, 5), +(53120, 53040, 6), + -- Toughness +(12299, 12299, 1), +(12299, 12761, 2), +(12299, 12762, 3), +(12299, 12763, 4), +(12299, 12764, 5), + -- Toughness +(20143, 20143, 1), +(20143, 20144, 2), +(20143, 20145, 3), +(20143, 20146, 4), +(20143, 20147, 5), + -- Toughness +(16252, 16252, 1), +(16252, 16306, 2), +(16252, 16307, 3), +(16252, 16308, 4), +(16252, 16309, 5), + -- Toughness +(49042, 49042, 1), +(49042, 49786, 2), +(49042, 49787, 3), +(49042, 49788, 4), +(49042, 49789, 5), + -- Tranquil Spirit +(24968, 24968, 1), +(24968, 24969, 2), +(24968, 24970, 3), +(24968, 24971, 4), +(24968, 24972, 5), + -- Trap Mastery +(19376, 19376, 1), +(19376, 63457, 2), +(19376, 63458, 3), + -- Tundra Stalker +(49202, 49202, 1), +(49202, 50127, 2), +(49202, 50128, 3), +(49202, 50129, 4), +(49202, 50130, 5), + -- Turn the Tables +(51627, 51627, 1), +(51627, 51628, 2), +(51627, 51629, 3), + -- Twin Disciplines +(47586, 47586, 1), +(47586, 47587, 2), +(47586, 47588, 3), +(47586, 52802, 4), +(47586, 52803, 5), + -- Twisted Faith +(47573, 47573, 1), +(47573, 47577, 2), +(47573, 47578, 3), +(47573, 51166, 4), +(47573, 51167, 5), + -- Two-Handed Weapon Specialization +(12163, 12163, 1), +(12163, 12711, 2), +(12163, 12712, 3), + -- Two-Handed Weapon Specialization +(20111, 20111, 1), +(20111, 20112, 2), +(20111, 20113, 3), + -- Two-Handed Weapon Specialization +(55107, 55107, 1), +(55107, 55108, 2), + -- Unbreakable Will +(14522, 14522, 1), +(14522, 14788, 2), +(14522, 14789, 3), +(14522, 14790, 4), +(14522, 14791, 5), + -- Unending Fury +(56927, 56927, 1), +(56927, 56929, 2), +(56927, 56930, 3), +(56927, 56931, 4), +(56927, 56932, 5), + -- Unholy Command +(49588, 49588, 1), +(49588, 49589, 2), + -- Unholy Power +(18769, 18769, 1), +(18769, 18770, 2), +(18769, 18771, 3), +(18769, 18772, 4), +(18769, 18773, 5), + -- Unleashed Fury +(19616, 19616, 1), +(19616, 19617, 2), +(19616, 19618, 3), +(19616, 19619, 4), +(19616, 19620, 5), + -- Unrelenting Assault +(46859, 46859, 1), +(46859, 46860, 2), + -- Unrelenting Storm +(30664, 30664, 1), +(30664, 30665, 2), +(30664, 30666, 3), + -- Unstable Affliction +(30108, 30108, 1), +(30108, 30404, 2), +(30108, 30405, 3), +(30108, 47841, 4), +(30108, 47843, 5), + -- Unyielding Faith +(9453, 9453, 1), +(9453, 25836, 2), + -- Vampiric Touch +(34914, 34914, 1), +(34914, 34916, 2), +(34914, 34917, 3), +(34914, 48159, 4), +(34914, 48160, 5), + -- Vanish +(1856, 1856, 1), +(1856, 1857, 2), +(1856, 26889, 3), + -- Veiled Shadows +(15274, 15274, 1), +(15274, 15311, 2), + -- Vendetta +(49015, 49015, 1), +(49015, 50154, 2), +(49015, 55136, 3), + -- Vengeance +(20049, 20049, 1), +(20049, 20056, 2), +(20049, 20057, 3), + -- Vengeance +(16909, 16909, 1), +(16909, 16910, 2), +(16909, 16911, 3), +(16909, 16912, 4), +(16909, 16913, 5), + -- Venom Web Spray +(54706, 54706, 1), +(54706, 55505, 2), +(54706, 55506, 3), +(54706, 55507, 4), +(54706, 55508, 5), +(54706, 55509, 6), + -- Veteran of the Third War +(49006, 49006, 1), +(49006, 49526, 2), +(49006, 50029, 3), + -- Vicious Strikes +(51745, 51745, 1), +(51745, 51746, 2), + -- Vile Poisons +(16513, 16513, 1), +(16513, 16514, 2), +(16513, 16515, 3), + -- Virulence +(48962, 48962, 1), +(48962, 49567, 2), +(48962, 49568, 3), + -- Vitality +(31122, 31122, 1), +(31122, 31123, 2), +(31122, 61329, 3), + -- Vitality +(29140, 29140, 1), +(29140, 29143, 2), +(29140, 29144, 3), + -- Wand Specialization +(14524, 14524, 1), +(14524, 14525, 2), +(14524, 14526, 3), +(14524, 14527, 4), +(14524, 14528, 5), + -- Wandering Plague +(49217, 49217, 1), +(49217, 49654, 2), +(49217, 49655, 3), + -- Water Shield +(52127, 52127, 1), +(52127, 52129, 2), +(52127, 52131, 3), +(52127, 52134, 4), +(52127, 52136, 5), +(52127, 52138, 6), +(52127, 24398, 7), +(52127, 33736, 8), +(52127, 57960, 9), + -- Waylay +(51692, 51692, 1), +(51692, 51696, 2), + -- Weapon Expertise +(30919, 30919, 1), +(30919, 30920, 2), + -- Weapon Mastery +(20504, 20504, 1), +(20504, 20505, 2), + -- Weapon Mastery +(29082, 29082, 1), +(29082, 29084, 2), +(29082, 29086, 3), + -- Wild Growth +(48438, 48438, 1), +(48438, 53248, 2), +(48438, 53249, 3), +(48438, 53251, 4), + -- Wild Hunt +(62758, 62758, 1), +(62758, 62762, 2), + -- Wild Quiver +(53215, 53215, 1), +(53215, 53216, 2), +(53215, 53217, 3), + -- Windfury Weapon +(8232, 8232, 1), +(8232, 8235, 2), +(8232, 10486, 3), +(8232, 16362, 4), +(8232, 25505, 5), +(8232, 58801, 6), +(8232, 58803, 7), +(8232, 58804, 8), + -- Winter's Chill +(11180, 11180, 1), +(11180, 28592, 2), +(11180, 28593, 3), + -- World in Flames +(11108, 11108, 1), +(11108, 12349, 2), +(11108, 12350, 3), + -- Wrath +(5176, 5176, 1), +(5176, 5177, 2), +(5176, 5178, 3), +(5176, 5179, 4), +(5176, 5180, 5), +(5176, 6780, 6), +(5176, 8905, 7), +(5176, 9912, 8), +(5176, 26984, 9), +(5176, 26985, 10), +(5176, 48459, 11), +(5176, 48461, 12), + -- Wrath of Cenarius +(33603, 33603, 1), +(33603, 33604, 2), +(33603, 33605, 3), +(33603, 33606, 4), +(33603, 33607, 5), + -- Wrecking Crew +(46867, 46867, 1), +(46867, 56611, 2), +(46867, 56612, 3), +(46867, 56613, 4), +(46867, 56614, 5), + -- Arcane Brilliance +(23030, 23030, 1), +(23030, 27394, 2), + -- Arcane Explosion +(1467, 1467, 1), +(1467, 8440, 2), +(1467, 8441, 3), +(1467, 8442, 4), +(1467, 10203, 5), +(1467, 10204, 6), +(1467, 27380, 7), +(1467, 27381, 8), + -- Arcane Intellect +(1472, 1472, 1), +(1472, 1473, 2), +(1472, 1474, 3), +(1472, 1475, 4), +(1472, 10158, 5), +(1472, 27393, 6), +(1472, 42999, 7), + -- Arcane Missiles +(5143, 5143, 1), +(5143, 5144, 2), +(5143, 5145, 3), +(5143, 8416, 4), +(5143, 8417, 5), +(5143, 10211, 6), +(5143, 10212, 7), +(5143, 25345, 8), +(5143, 27075, 9), +(5143, 38699, 10), +(5143, 38704, 11), +(5143, 42843, 12), +(5143, 42846, 13), + -- Blessed Recovery +(27811, 27811, 1), +(27811, 27815, 2), +(27811, 27816, 3), + -- Blessed Recovery +(27813, 27813, 1), +(27813, 27817, 2), +(27813, 27818, 3), + -- Blessed Resilience +(33142, 33142, 1), +(33142, 33145, 2), +(33142, 33146, 3), + -- Blizzard +(1196, 1196, 1), +(1196, 6142, 2), +(1196, 8428, 3), +(1196, 10188, 4), +(1196, 10189, 5), +(1196, 10190, 6), +(1196, 27384, 7), + -- Blizzard +(42208, 42208, 1), +(42208, 42209, 2), +(42208, 42210, 3), +(42208, 42211, 4), +(42208, 42212, 5), +(42208, 42213, 6), +(42208, 42198, 7), +(42208, 42937, 8), +(42208, 42938, 9), + -- Blizzard +(10, 10, 1), +(10, 6141, 2), +(10, 8427, 3), +(10, 10185, 4), +(10, 10186, 5), +(10, 10187, 6), +(10, 27085, 7), +(10, 42939, 8), +(10, 42940, 9), + -- Chain Lightning +(421, 421, 1), +(421, 930, 2), +(421, 2860, 3), +(421, 10605, 4), +(421, 25439, 5), +(421, 25442, 6), +(421, 49270, 7), +(421, 49271, 8), + -- Chain Lightning +(45297, 45297, 1), +(45297, 45298, 2), +(45297, 45299, 3), +(45297, 45300, 4), +(45297, 45301, 5), +(45297, 45302, 6), +(45297, 49268, 7), +(45297, 49269, 8), + -- Charge +(7370, 7370, 1), +(7370, 26184, 2), +(7370, 26185, 3), +(7370, 26186, 4), +(7370, 26202, 5), +(7370, 28343, 6), + -- Consume Shadows +(17776, 17776, 1), +(17776, 17855, 2), +(17776, 17856, 3), +(17776, 17857, 4), +(17776, 17859, 5), +(17776, 17860, 6), + -- Consume Shadows +(20387, 20387, 1), +(20387, 20388, 2), +(20387, 20389, 3), +(20387, 20390, 4), +(20387, 20391, 5), +(20387, 20392, 6), +(20387, 27491, 7), +(20387, 48003, 8), +(20387, 48004, 9), + -- Cower +(1747, 1747, 1), +(1747, 1748, 2), +(1747, 1749, 3), +(1747, 1750, 4), +(1747, 1751, 5), +(1747, 16698, 6), +(1747, 27346, 7), + -- Echoes of Lordaeron +(6966, 6966, 1), +(6966, 30880, 2), +(6966, 30683, 3), +(6966, 30682, 4), +(6966, 29520, 5), + -- Echoes of Lordaeron +(6964, 6964, 1), +(6964, 11413, 2), +(6964, 11414, 3), +(6964, 11415, 4), +(6964, 1386, 5), + -- Eye for an Eye +(9799, 9799, 1), +(9799, 25988, 2), + -- Fire Nova +(1535, 1535, 1), +(1535, 8498, 2), +(1535, 8499, 3), +(1535, 11314, 4), +(1535, 11315, 5), +(1535, 25546, 6), +(1535, 25547, 7), +(1535, 61649, 8), +(1535, 61657, 9), + -- Fire Nova +(8349, 8349, 1), +(8349, 8502, 2), +(8349, 8503, 3), +(8349, 11306, 4), +(8349, 11307, 5), +(8349, 25535, 6), +(8349, 25537, 7), +(8349, 61650, 8), +(8349, 61654, 9), + -- Fire Protection +(7230, 7230, 1), +(7230, 7231, 2), +(7230, 7232, 3), +(7230, 7233, 4), +(7230, 7234, 5), + -- Fire Resistance +(24440, 24440, 1), +(24440, 24441, 2), +(24440, 24463, 3), +(24440, 24464, 4), +(24440, 27351, 5), + -- Fire Resistance +(8185, 8185, 1), +(8185, 10534, 2), +(8185, 10535, 3), +(8185, 25562, 4), +(8185, 58738, 5), +(8185, 58740, 6), + -- Fire Shield +(2949, 2949, 1), +(2949, 8318, 2), +(2949, 8319, 3), +(2949, 11772, 4), +(2949, 11773, 5), +(2949, 27486, 6), + -- Fire Shield +(20322, 20322, 1), +(20322, 20323, 2), +(20322, 20324, 3), +(20322, 20326, 4), +(20322, 20327, 5), +(20322, 27489, 6), +(20322, 47998, 7), + -- Flameblade +(7829, 7829, 1), +(7829, 7874, 2), +(7829, 7875, 3), + -- Flameblade +(7806, 7806, 1), +(7806, 7807, 2), +(7806, 7808, 3), + -- Flurry +(12319, 12319, 1), +(12319, 12971, 2), +(12319, 12972, 3), +(12319, 12973, 4), +(12319, 12974, 5), + -- Flurry +(12966, 12966, 1), +(12966, 12967, 2), +(12966, 12968, 3), +(12966, 12969, 4), +(12966, 12970, 5), + -- Focused Will +(45234, 45234, 1), +(45234, 45243, 2), +(45234, 45244, 3), + -- Focused Will +(45237, 45237, 1), +(45237, 45241, 2), +(45237, 45242, 3), + -- Frost Nova +(1194, 1194, 1), +(1194, 1225, 2), +(1194, 6132, 3), +(1194, 10231, 4), +(1194, 27387, 5), + -- Frost Protection +(7240, 7240, 1), +(7240, 7236, 2), +(7240, 7238, 3), +(7240, 7237, 4), +(7240, 7239, 5), + -- Frost Resistance +(24475, 24475, 1), +(24475, 24476, 2), +(24475, 24477, 3), +(24475, 24478, 4), +(24475, 27352, 5), + -- Frost Resistance +(8182, 8182, 1), +(8182, 10476, 2), +(8182, 10477, 3), +(8182, 25559, 4), +(8182, 58742, 5), +(8182, 58744, 6), + -- Frostbrand Attack +(8034, 8034, 1), +(8034, 8037, 2), +(8034, 10458, 3), +(8034, 16352, 4), +(8034, 16353, 5), +(8034, 25501, 6), +(8034, 58797, 7), +(8034, 58798, 8), +(8034, 58799, 9), + -- Healing Stream +(5672, 5672, 1), +(5672, 6371, 2), +(5672, 6372, 3), +(5672, 10460, 4), +(5672, 10461, 5), +(5672, 25566, 6), +(5672, 58763, 7), +(5672, 58764, 8), +(5672, 58765, 9), + -- Holy Nova +(15237, 15237, 1), +(15237, 15430, 2), +(15237, 15431, 3), +(15237, 27799, 4), +(15237, 27800, 5), +(15237, 27801, 6), +(15237, 25331, 7), +(15237, 48077, 8), +(15237, 48078, 9), + -- Holy Nova +(23455, 23455, 1), +(23455, 23458, 2), +(23455, 23459, 3), +(23455, 27803, 4), +(23455, 27804, 5), +(23455, 27805, 6), +(23455, 25329, 7), +(23455, 48075, 8), +(23455, 48076, 9), + -- Holy Protection +(7245, 7245, 1), +(7245, 7246, 2), +(7245, 7247, 3), +(7245, 7248, 4), +(7245, 7249, 5), +(7245, 17545, 6), + -- Holy Shock +(20473, 20473, 1), +(20473, 20929, 2), +(20473, 20930, 3), +(20473, 27174, 4), +(20473, 33072, 5), +(20473, 48824, 6), +(20473, 48825, 7), + -- Holy Shock +(25912, 25912, 1), +(25912, 25911, 2), +(25912, 25902, 3), +(25912, 27176, 4), +(25912, 33073, 5), +(25912, 48822, 6), +(25912, 48823, 7), + -- Holy Shock +(25914, 25914, 1), +(25914, 25913, 2), +(25914, 25903, 3), +(25914, 27175, 4), +(25914, 33074, 5), +(25914, 48820, 6), +(25914, 48821, 7), + -- Hurricane +(16914, 16914, 1), +(16914, 17401, 2), +(16914, 17402, 3), +(16914, 27012, 4), +(16914, 48467, 5), + -- Hurricane +(42231, 42231, 1), +(42231, 42232, 2), +(42231, 42233, 3), +(42231, 42230, 4), +(42231, 48466, 5), + -- Immolation Trap +(13795, 13795, 1), +(13795, 14302, 2), +(13795, 14303, 3), +(13795, 14304, 4), +(13795, 14305, 5), +(13795, 27023, 6), +(13795, 49055, 7), +(13795, 49056, 8), + -- Impact +(11103, 11103, 1), +(11103, 12357, 2), +(11103, 12358, 3), + -- Improved Mend Pet +(19572, 19572, 1), +(19572, 19573, 2), + -- Infusion of Light +(53569, 53569, 1), +(53569, 53576, 2), + -- Initiative +(13976, 13976, 1), +(13976, 13979, 2), +(13976, 13980, 3), + -- Intercept +(30154, 30154, 1), +(30154, 30199, 2), +(30154, 30200, 3), + -- Intercept +(30153, 30153, 1), +(30153, 30195, 2), +(30153, 30197, 3), +(30153, 47995, 4), + -- Intercept +(30151, 30151, 1), +(30151, 30194, 2), +(30151, 30198, 3), +(30151, 47996, 4), + -- Lash of Pain +(7876, 7876, 1), +(7876, 7877, 2), +(7876, 7878, 3), +(7876, 11781, 4), +(7876, 11782, 5), +(7876, 11783, 6), + -- Lay on Hands +(20233, 20233, 1), +(20233, 20236, 2), + -- Lay on Hands +(17233, 17233, 1), +(17233, 9257, 2), + -- Lightning Bolt +(403, 403, 1), +(403, 529, 2), +(403, 548, 3), +(403, 915, 4), +(403, 943, 5), +(403, 6041, 6), +(403, 10391, 7), +(403, 10392, 8), +(403, 15207, 9), +(403, 15208, 10), +(403, 25448, 11), +(403, 25449, 12), +(403, 49237, 13), +(403, 49238, 14), + -- Lightning Bolt +(45284, 45284, 1), +(45284, 45286, 2), +(45284, 45287, 3), +(45284, 45288, 4), +(45284, 45289, 5), +(45284, 45290, 6), +(45284, 45291, 7), +(45284, 45292, 8), +(45284, 45293, 9), +(45284, 45294, 10), +(45284, 45295, 11), +(45284, 45296, 12), +(45284, 49239, 13), +(45284, 49240, 14), + -- Lightning Shield +(324, 324, 1), +(324, 325, 2), +(324, 905, 3), +(324, 945, 4), +(324, 8134, 5), +(324, 10431, 6), +(324, 10432, 7), +(324, 25469, 8), +(324, 25472, 9), +(324, 49280, 10), +(324, 49281, 11), + -- Lightning Shield +(26364, 26364, 1), +(26364, 26365, 2), +(26364, 26366, 3), +(26364, 26367, 4), +(26364, 26369, 5), +(26364, 26370, 6), +(26364, 26363, 7), +(26364, 26371, 8), +(26364, 26372, 9), +(26364, 49278, 10), +(26364, 49279, 11), + -- Living Bomb +(44457, 44457, 1), +(44457, 55359, 2), +(44457, 55360, 3), + -- Living Bomb +(44461, 44461, 1), +(44461, 55361, 2), +(44461, 55362, 3), + -- Mind Sear +(48045, 48045, 1), +(48045, 53023, 2), + -- Mind Sear +(49821, 49821, 1), +(49821, 53022, 2), + -- Molten Armor +(34913, 34913, 1), +(34913, 43043, 2), +(34913, 43044, 3), + -- Molten Armor +(30482, 30482, 1), +(30482, 43045, 2), +(30482, 43046, 3), + -- Nature Protection +(7250, 7250, 1), +(7250, 7251, 2), +(7250, 7252, 3), +(7250, 7253, 4), +(7250, 7254, 5), + -- Nature Resistance +(24494, 24494, 1), +(24494, 24511, 2), +(24494, 24512, 3), +(24494, 24513, 4), +(24494, 27354, 5), + -- Nature Resistance +(10596, 10596, 1), +(10596, 10598, 2), +(10596, 10599, 3), +(10596, 25573, 4), +(10596, 58748, 5), +(10596, 58750, 6), + -- On a Pale Horse +(49146, 49146, 1), +(49146, 51267, 2), + -- Penance +(47540, 47540, 1), +(47540, 53005, 2), +(47540, 53006, 3), +(47540, 53007, 4), + -- Penance +(47750, 47750, 1), +(47750, 52983, 2), +(47750, 52984, 3), +(47750, 52985, 4), + -- Penance +(47666, 47666, 1), +(47666, 52998, 2), +(47666, 52999, 3), +(47666, 53000, 4), + -- Plague Strike +(59133, 59133, 1), +(59133, 66988, 2), +(59133, 66989, 3), +(59133, 66990, 4), +(59133, 66991, 5), +(59133, 66992, 6), + -- Prowl +(24451, 24451, 1), +(24451, 24454, 2), +(24451, 24455, 3), + -- Rain of Fire +(42223, 42223, 1), +(42223, 42224, 2), +(42223, 42225, 3), +(42223, 42226, 4), +(42223, 42218, 5), +(42223, 47817, 6), +(42223, 47818, 7), + -- Rain of Fire +(5740, 5740, 1), +(5740, 6219, 2), +(5740, 11677, 3), +(5740, 11678, 4), +(5740, 27212, 5), +(5740, 47819, 6), +(5740, 47820, 7), + -- Sacrifice +(7885, 7885, 1), +(7885, 19439, 2), +(7885, 19444, 3), +(7885, 19445, 4), +(7885, 19446, 5), +(7885, 19447, 6), + -- Sacrifice +(20381, 20381, 1), +(20381, 20382, 2), +(20381, 20383, 3), +(20381, 20384, 4), +(20381, 20385, 5), +(20381, 20386, 6), +(20381, 27492, 7), +(20381, 48001, 8), +(20381, 48002, 9), + -- Safeguard +(46945, 46945, 1), +(46945, 46949, 2), + -- Safeguard +(46946, 46946, 1), +(46946, 46947, 2), + -- Seed of Corruption +(27285, 27285, 1), +(27285, 47833, 2), +(27285, 47834, 3), + -- Seed of Corruption +(27243, 27243, 1), +(27243, 47835, 2), +(27243, 47836, 3), + -- Shadow Protection +(7235, 7235, 1), +(7235, 7241, 2), +(7235, 7242, 3), +(7235, 7243, 4), +(7235, 7244, 5), + -- Shadow Resistance +(24490, 24490, 1), +(24490, 24514, 2), +(24490, 24515, 3), +(24490, 24516, 4), +(24490, 27353, 5), + -- Soothing Kiss +(6362, 6362, 1), +(6362, 7879, 2), +(6362, 11786, 3), +(6362, 11787, 4), + -- Soothing Kiss +(20403, 20403, 1), +(20403, 20404, 2), +(20403, 20405, 3), +(20403, 20406, 4), +(20403, 27494, 5), + -- Spell Lock +(19648, 19648, 1), +(19648, 19650, 2), + -- Spell Lock +(20433, 20433, 1), +(20433, 20434, 2), + -- Starfall +(50286, 50286, 1), +(50286, 53196, 2), +(50286, 53197, 3), +(50286, 53198, 4), + -- Starfall +(50294, 50294, 1), +(50294, 53188, 2), +(50294, 53189, 3), +(50294, 53190, 4), + -- Starfall +(50288, 50288, 1), +(50288, 53191, 2), +(50288, 53194, 3), +(50288, 53195, 4), + -- Suffering +(17736, 17736, 1), +(17736, 17753, 2), +(17736, 17754, 3), +(17736, 17755, 4), + -- Suffering +(20393, 20393, 1), +(20393, 20394, 2), +(20393, 20395, 3), +(20393, 20396, 4), +(20393, 27500, 5), +(20393, 33703, 6), +(20393, 48005, 7), +(20393, 48006, 8), + -- Surge of Light +(33150, 33150, 1), +(33150, 33154, 2), + -- Tainted Blood +(19661, 19661, 1), +(19661, 19662, 2), +(19661, 19663, 3), +(19661, 19664, 4), + -- Tainted Blood +(20429, 20429, 1), +(20429, 20430, 2), +(20429, 20431, 3), +(20429, 20432, 4), +(20429, 27497, 5), + -- The Art of War +(53486, 53486, 1), +(53486, 53488, 2), + -- Thick Skin +(5364, 5364, 1), +(5364, 5368, 2), +(5364, 5369, 3), +(5364, 5370, 4), + -- Thick Skin +(5363, 5363, 1), +(5363, 5365, 2), +(5363, 5366, 3), +(5363, 5367, 4), + -- Torment +(7881, 7881, 1), +(7881, 7882, 2), +(7881, 7883, 3), +(7881, 7884, 4), +(7881, 11776, 5), +(7881, 11777, 6), + -- Tough Shell +(4112, 4112, 1), +(4112, 4113, 2), +(4112, 4115, 3), +(4112, 4114, 4), + -- Tough Shell +(4107, 4107, 1), +(4107, 4108, 2), +(4107, 4109, 3), +(4107, 4111, 4), + -- Tranquility +(740, 740, 1), +(740, 8918, 2), +(740, 9862, 3), +(740, 9863, 4), +(740, 26983, 5), +(740, 48446, 6), +(740, 48447, 7), + -- Tranquility +(44203, 44203, 1), +(44203, 44205, 2), +(44203, 44206, 3), +(44203, 44207, 4), +(44203, 44208, 5), +(44203, 48444, 6), +(44203, 48445, 7), + -- Typhoon +(61391, 61391, 1), +(61391, 61390, 2), +(61391, 61388, 3), +(61391, 61387, 4), +(61391, 53227, 5), + -- Typhoon +(50516, 50516, 1), +(50516, 53223, 2), +(50516, 53225, 3), +(50516, 53226, 4), +(50516, 61384, 5), + -- Unfair Advantage +(51675, 51675, 1), +(51675, 51677, 2), + -- Unfair Advantage +(51672, 51672, 1), +(51672, 51674, 2), + -- Unleashed Rage +(30802, 30802, 1), +(30802, 30808, 2), +(30802, 30809, 3), + -- Unleashed Rage +(30803, 30803, 1), +(30803, 30804, 2), +(30803, 30805, 3), + -- Vindication +(9452, 9452, 1), +(9452, 26016, 2), + -- Vindication +(67, 67, 1), +(67, 26017, 2), + -- Volley +(42243, 42243, 1), +(42243, 42244, 2), +(42243, 42245, 3), +(42243, 42234, 4), +(42243, 58432, 5), +(42243, 58433, 6), + -- Volley +(1510, 1510, 1), +(1510, 14294, 2), +(1510, 14295, 3), +(1510, 27022, 4), +(1510, 58431, 5), +(1510, 58434, 6), + -- Will of the Necropolis +(52284, 52284, 1), +(52284, 52285, 2), +(52284, 52286, 3), + -- Will of the Necropolis +(49189, 49189, 1), +(49189, 50149, 2), +(49189, 50150, 3), + -- Wyvern Sting +(19386, 19386, 1), +(19386, 24132, 2), +(19386, 24133, 3), +(19386, 27068, 4), +(19386, 49011, 5), +(19386, 49012, 6), + -- First Aid +(746, 746, 1), +(746, 1159, 2), +(746, 3267, 3), +(746, 3268, 4), +(746, 7926, 5), +(746, 7927, 6), +(746, 10838, 7), +(746, 10839, 8), +(746, 18608, 9), +(746, 18610, 10), +(746, 27030, 11), +(746, 27031, 12), +(746, 45543, 13), +(746, 51827, 14), +(746, 45544, 15), +(746, 51803, 16), + -- Frost Strike +(49143, 49143, 1), +(49143, 51416, 2), +(49143, 51417, 3), +(49143, 51418, 4), +(49143, 51419, 5), +(49143, 55268, 6), + -- Intercept +(20253, 20253, 1), +(20253, 20614, 2), +(20253, 20615, 3), +(20253, 25273, 4), +(20253, 25274, 5), + -- Misery +(33191, 33191, 1), +(33191, 33192, 2), +(33191, 33193, 3), + -- Misery +(33196, 33196, 1), +(33196, 33197, 2), +(33196, 33198, 3), + -- Obliterate +(49020, 49020, 1), +(49020, 51423, 2), +(49020, 51424, 3), +(49020, 51425, 4), + -- Penance +(47758, 47758, 1), +(47758, 53001, 2), +(47758, 53002, 3), +(47758, 53003, 4), + -- Penance +(47757, 47757, 1), +(47757, 52986, 2), + -- Savage Rend +(50498, 50498, 1), +(50498, 53578, 2), +(50498, 53579, 3), +(50498, 53580, 4), +(50498, 53581, 5), +(50498, 53582, 6), + -- Spirit Bond +(19578, 19578, 1), +(19578, 20895, 2), + -- Spirit Bond +(19579, 19579, 1), +(19579, 24529, 2), + -- Stoneskin +(8072, 8072, 1), +(8072, 8156, 2), +(8072, 8157, 3), +(8072, 10403, 4), +(8072, 10404, 5), +(8072, 10405, 6), +(8072, 25506, 7), +(8072, 25507, 8), +(8072, 58752, 9), +(8072, 58754, 10), + -- Attack +(3606, 3606, 1), +(3606, 6350, 2), +(3606, 6351, 3), +(3606, 6352, 4), +(3606, 10435, 5), +(3606, 10436, 6), +(3606, 25530, 7), +(3606, 58700, 8), +(3606, 58701, 9), +(3606, 58702, 10), + -- Blood Strike +(45902, 45902, 1), +(45902, 49926, 2), +(45902, 49927, 3), +(45902, 49928, 4), +(45902, 49929, 5), +(45902, 49930, 6), + -- Elemental Devastation +(30160, 30160, 1), +(30160, 29179, 2), +(30160, 29180, 3), + -- Elemental Devastation +(30165, 30165, 1), +(30165, 29177, 2), +(30165, 29178, 3), + -- Fishing +(7620, 7620, 1), +(7620, 7731, 2), +(7620, 7732, 3), +(7620, 18248, 4), +(7620, 33095, 5), +(7620, 51294, 6), + -- Icy Touch +(45477, 45477, 1), +(45477, 49896, 2), +(45477, 49903, 3), +(45477, 49904, 4), +(45477, 49909, 5), + -- Judgements of the Pure +(53671, 53671, 1), +(53671, 53673, 2), +(53671, 54151, 3), +(53671, 54154, 4), +(53671, 54155, 5), + -- Judgements of the Pure +(53655, 53655, 1), +(53655, 53656, 2), +(53655, 53657, 3), +(53655, 54152, 4), +(53655, 54153, 5), + -- Master Tactician +(34506, 34506, 1), +(34506, 34507, 2), +(34506, 34508, 3), +(34506, 34838, 4), +(34506, 34839, 5), + -- Master Tactician +(34833, 34833, 1), +(34833, 34834, 2), +(34833, 34835, 3), +(34833, 34836, 4), +(34833, 34837, 5), + -- Plague Strike +(45462, 45462, 1), +(45462, 49917, 2), +(45462, 49918, 3), +(45462, 49919, 4), +(45462, 49920, 5), +(45462, 49921, 6), + -- Rapid Killing +(34948, 34948, 1), +(34948, 34949, 2), + -- Rapid Killing +(35098, 35098, 1), +(35098, 35099, 2), + -- Second Wind +(29841, 29841, 1), +(29841, 29842, 2), + -- Second Wind +(29834, 29834, 1), +(29834, 29838, 2), + -- Strength of Earth +(8076, 8076, 1), +(8076, 8162, 2), +(8076, 8163, 3), +(8076, 10441, 4), +(8076, 25362, 5), +(8076, 25527, 6), +(8076, 57621, 7), +(8076, 58646, 8), + -- Trauma +(46854, 46854, 1), +(46854, 46855, 2), + -- Trauma +(46856, 46856, 1), +(46856, 46857, 2), + -- Unbridled Wrath +(12322, 12322, 1), +(12322, 12999, 2), +(12322, 13000, 3), +(12322, 13001, 4), +(12322, 13002, 5), + -- Vanish +(11327, 11327, 1), +(11327, 11329, 2), +(11327, 26888, 3), + -- Blood Gorged +(50096, 50096, 1), +(50096, 50108, 2), +(50096, 50109, 3), +(50096, 50110, 4), +(50096, 50111, 5), + -- Blood Gorged +(61274, 61274, 1), +(61274, 61275, 2), +(61274, 61276, 3), +(61274, 61277, 4), +(61274, 61278, 5), + -- Blood Gorged +(61154, 61154, 1), +(61154, 61155, 2), +(61154, 61156, 3), +(61154, 61157, 4), +(61154, 61158, 5), + -- Cone of Cold +(1241, 1241, 1), +(1241, 8493, 2), +(1241, 10162, 3), +(1241, 10163, 4), +(1241, 10164, 5), +(1241, 27386, 6), + -- Flamestrike +(2124, 2124, 1), +(2124, 2125, 2), +(2124, 8425, 3), +(2124, 8426, 4), +(2124, 10217, 5), +(2124, 10218, 6), +(2124, 27385, 7), + -- Anesthetic Poison +(26688, 26688, 1), +(26688, 57981, 2), + -- Anesthetic Poison +(26785, 26785, 1), +(26785, 57982, 2), + -- Apprentice Riding +(33388, 33388, 1), +(33388, 33391, 2), +(33388, 34090, 3), +(33388, 34091, 4), + -- Primal Fury +(16958, 16958, 1), +(16958, 16961, 2), + -- Primal Fury +(37116, 37116, 1), +(37116, 37117, 2), + -- Nature Resist +(4548, 4548, 1), +(4548, 24502, 2), +(4548, 24503, 3), +(4548, 24504, 4), +(4548, 27055, 5), + -- Instant Poison +(8680, 8680, 1), +(8680, 8685, 2), +(8680, 8689, 3), +(8680, 11335, 4), +(8680, 11336, 5), +(8680, 11337, 6), +(8680, 26890, 7), +(8680, 57964, 8), +(8680, 57965, 9), + -- Instant Poison +(8679, 8679, 1), +(8679, 8686, 2), +(8679, 8688, 3), +(8679, 11338, 4), +(8679, 11339, 5), +(8679, 11340, 6), +(8679, 26891, 7), +(8679, 57967, 8), +(8679, 57968, 9), + -- Claw +(2980, 2980, 1), +(2980, 2981, 2), +(2980, 2982, 3), +(2980, 3667, 4), +(2980, 2975, 5), +(2980, 2976, 6), +(2980, 2977, 7), +(2980, 3666, 8), +(2980, 27347, 9), + -- Mace Specialization +(12284, 12284, 1), +(12284, 12701, 2), +(12284, 12702, 3), +(12284, 12703, 4), +(12284, 12704, 5), + -- Deadly Toxin +(11539, 11539, 1), +(11539, 11471, 2), +(11539, 11470, 3), +(11539, 11469, 4), + -- Deadly Poison +(2818, 2818, 1), +(2818, 2819, 2), +(2818, 11353, 3), +(2818, 11354, 4), +(2818, 25349, 5), +(2818, 26968, 6), +(2818, 27187, 7), +(2818, 57969, 8), +(2818, 57970, 9), + -- Deadly Poison +(2823, 2823, 1), +(2823, 2824, 2), +(2823, 11355, 3), +(2823, 11356, 4), +(2823, 25351, 5), +(2823, 26967, 6), +(2823, 27186, 7), +(2823, 57972, 8), +(2823, 57973, 9), + -- On a Pale Horse +(51983, 51983, 1), +(51983, 51986, 2), + -- On a Pale Horse +(51969, 51969, 1), +(51969, 51970, 2), + -- Wound Poison +(13218, 13218, 1), +(13218, 13222, 2), +(13218, 13223, 3), +(13218, 13224, 4), +(13218, 27189, 5), +(13218, 57974, 6), +(13218, 57975, 7), + -- Wound Poison +(13219, 13219, 1), +(13219, 13225, 2), +(13219, 13226, 3), +(13219, 13227, 4), +(13219, 27188, 5), +(13219, 57977, 6), +(13219, 57978, 7), + -- Thunderstomp +(26094, 26094, 1), +(26094, 26189, 2), +(26094, 26190, 3), +(26094, 27366, 4), + -- Obliterate +(66198, 66198, 1), +(66198, 66972, 2), +(66198, 66973, 3), +(66198, 66974, 4), + -- Frost Strike +(66196, 66196, 1), +(66196, 66958, 2), +(66196, 66959, 3), +(66196, 66960, 4), +(66196, 66961, 5), +(66196, 66962, 6), + -- Death Strike +(66188, 66188, 1), +(66188, 66950, 2), +(66188, 66951, 3), +(66188, 66952, 4), +(66188, 66953, 5), + -- Fiery Payback +(44440, 44440, 1), +(44440, 44441, 2), + -- Fiery Payback +(64353, 64353, 1), +(64353, 64357, 2), + -- Improved Flash Heal +(63504, 63504, 1), +(63504, 63505, 2), +(63504, 63506, 3), + -- Elemental Fury +(16089, 16089, 1), +(16089, 60184, 2), +(16089, 60185, 3), +(16089, 60187, 4), +(16089, 60188, 5), + -- Feral Swiftness +(17002, 17002, 1), +(17002, 24866, 2), + -- Master Shapeshifter +(48411, 48411, 1), +(48411, 48412, 2), + -- Nature's Majesty +(35363, 35363, 1), +(35363, 35364, 2), + -- Nature's Grace +(16880, 16880, 1), +(16880, 61345, 2), +(16880, 61346, 3), + -- Molten Skin +(63349, 63349, 1), +(63349, 63350, 2), +(63349, 63351, 3), + -- Master Demonologist +(23785, 23785, 1), +(23785, 23822, 2), +(23785, 23823, 3), +(23785, 23824, 4), +(23785, 23825, 5), + -- Death Rune Mastery +(49467, 49467, 1), +(49467, 50033, 2), +(49467, 50034, 3), + -- Improved Death Strike +(62905, 62905, 1), +(62905, 62908, 2), + -- Desolation +(66799, 66799, 1), +(66799, 66814, 2), +(66799, 66815, 3), +(66799, 66816, 4), +(66799, 66817, 5), + -- Mobility +(53483, 53483, 1), +(53483, 53485, 2), + -- Mobility +(53554, 53554, 1), +(53554, 53555, 2), + -- Arcane Missiles +(7268, 7268, 1), +(7268, 7269, 2), +(7268, 7270, 3), +(7268, 8419, 4), +(7268, 8418, 5), +(7268, 10273, 6), +(7268, 10274, 7), +(7268, 25346, 8), +(7268, 27076, 9), +(7268, 38700, 10), +(7268, 38703, 11), +(7268, 42844, 12), +(7268, 42845, 13), + -- Entangling Roots +(19975, 19975, 1), +(19975, 19974, 2), +(19975, 19973, 3), +(19975, 19972, 4), +(19975, 19971, 5), +(19975, 19970, 6), +(19975, 27010, 7), +(19975, 53313, 8), + -- Death Coil +(47541, 47541, 1), +(47541, 49892, 2), +(47541, 49893, 3), +(47541, 49894, 4), +(47541, 49895, 5), + -- Intellect +(8096, 8096, 1), +(8096, 8097, 2), +(8096, 8098, 3), +(8096, 12176, 4), +(8096, 33078, 5), +(8096, 43195, 6), +(8096, 48099, 7), +(8096, 48100, 8), + -- Stamina +(8099, 8099, 1), +(8099, 8100, 2), +(8099, 8101, 3), +(8099, 12178, 4), +(8099, 33081, 5), +(8099, 48101, 6), +(8099, 48102, 7), +(8099, 43198, 8), + -- Mutilate +(5374, 5374, 1), +(5374, 34414, 2), +(5374, 34416, 3), +(5374, 34419, 4), +(5374, 48662, 5), +(5374, 48665, 6), + -- Mutilate +(27576, 27576, 1), +(27576, 34415, 2), +(27576, 34417, 3), +(27576, 34418, 4), +(27576, 48661, 5), +(27576, 48664, 6), + -- Immolation trap +(13797, 13797, 1), +(13797, 14298, 2), +(13797, 14299, 3), +(13797, 14300, 4), +(13797, 14301, 5), +(13797, 27024, 6), +(13797, 49053, 7), +(13797, 49054, 8), + -- Sniper Training +(64418, 64418, 1), +(64418, 64419, 2), +(64418, 64420, 3), + -- Blood Strike +(66215, 66215, 1), +(66215, 66975, 2), +(66215, 66976, 3), +(66215, 66977, 4), +(66215, 66978, 5), +(66215, 66979, 6), + -- Stoneclaw Totem Effect +(5729, 5729, 1), +(5729, 6393, 2), +(5729, 6394, 3), +(5729, 6395, 4), +(5729, 10423, 5), +(5729, 10424, 6), +(5729, 25512, 7), +(5729, 58586, 8), +(5729, 58587, 9), +(5729, 58588, 10); diff --git a/sql/updates/3.3.2_old/7332_world_trinity_string.sql b/sql/updates/3.3.2_old/7332_world_trinity_string.sql new file mode 100644 index 00000000000..2706e5b0556 --- /dev/null +++ b/sql/updates/3.3.2_old/7332_world_trinity_string.sql @@ -0,0 +1,7 @@ +INSERT INTO `trinity_string` VALUES +(10056,'The battle for Strand of the Ancients begins in 2 minutes.','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL'), +(10057,'The battle for Strand of the Ancients begins in 1 minute.','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL'), +(10058,'The battle for Strand of the Ancients begins in 30 seconds. Prepare yourselves!.','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL'), +(10059,'Let the battle for Strand of the Ancients begin!.','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL'), +(10061,'%s is destroyed!','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL'), +(10060,'%s is under attack!','NULL','NULL','NULL','NULL','NULL','NULL','NULL','NULL'); diff --git a/sql/updates/3.3.2_old/CMakeLists.txt b/sql/updates/3.3.2_old/CMakeLists.txt new file mode 100644 index 00000000000..87734d93da3 --- /dev/null +++ b/sql/updates/3.3.2_old/CMakeLists.txt @@ -0,0 +1,5 @@ +FILE(GLOB _SQL_332 *.sql) + +INSTALL(FILES +${_SQL_332} +DESTINATION share/trinity/sql/updates/3.3.2_old)
\ No newline at end of file diff --git a/sql/updates/CMakeLists.txt b/sql/updates/CMakeLists.txt index 3097e2d715d..1c93b666976 100644 --- a/sql/updates/CMakeLists.txt +++ b/sql/updates/CMakeLists.txt @@ -2,6 +2,7 @@ add_subdirectory(2.4.3_old) add_subdirectory(3.0.9_old) add_subdirectory(3.1.3_old) add_subdirectory(3.2.2a_old) +add_subdirectory(3.3.2_old) FILE(GLOB _SQL_UPDATES *.sql) diff --git a/sql/world.sql b/sql/world.sql index 5ec46699653..fca4fde2f0b 100644 --- a/sql/world.sql +++ b/sql/world.sql @@ -979,10 +979,10 @@ INSERT INTO `creature_classlevelstats` (`class`,`level`,`basehp0`,`basehp1`,`bas (1,75,4652,8025,10635,0,8219), (1,76,4781,8247,11001,0,8520), (1,77,4916,8480,11379,0,8822), -(1,78,5052,1,11770,0,9124), -(1,79,5194,1,12175,0,9426), +(1,78,5052,8715,11770,0,9124), +(1,79,5194,8960,12175,0,9426), (1,80,5342,9215,12600,0,9729), -(1,81,5496,1,13033,0,10033), +(1,81,5492,9474,13033,0,10033), (1,82,5647,1,13481,0,10356), (1,83,5808,1,13945,0,10673), (1,84,1,1,1,0,1), @@ -1075,15 +1075,15 @@ INSERT INTO `creature_classlevelstats` (`class`,`level`,`basehp0`,`basehp1`,`bas (2,71,3330,5744,9291,3231,7007), (2,72,3422,5903,9610,3309,7305), (2,73,3519,6070,9940,3387,7604), -(2,74,3619,1,10282,3466,7903), +(2,74,3619,6243,10282,3466,7903), (2,75,3722,6420,10635,3561,8204), -(2,76,3825,1,11001,3643,8503), -(2,77,3933,1,11379,3725,8803), -(2,78,4042,1,11770,3809,9104), -(2,79,4155,1,12175,3893,9405), -(2,80,4274,1,12600,3994,9706), -(2,81,4394,1,13033,4081,10007), -(2,82,4518,1,13481,4169,10253), +(2,76,3825,6602,11001,3643,8503), +(2,77,3933,6784,11379,3725,8803), +(2,78,4042,6972,11770,3809,9104), +(2,79,4155,7167,12175,3893,9405), +(2,80,4274,7373,12600,3994,9706), +(2,81,4394,7581,13033,4081,10007), +(2,82,4518,7794,13481,4169,10253), (2,83,4646,1,13945,4258,10573), (2,84,1,1,1,1,1), (2,85,1,1,1,1,1), @@ -1629,6 +1629,7 @@ CREATE TABLE `creature_template` ( `mechanic_immune_mask` int(10) unsigned NOT NULL DEFAULT '0', `flags_extra` int(10) unsigned NOT NULL DEFAULT '0', `ScriptName` char(64) NOT NULL DEFAULT '', + `WDBVerified` smallint(5) signed DEFAULT '0', PRIMARY KEY (`entry`), KEY `idx_name` (`name`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Creature System'; @@ -2505,6 +2506,7 @@ CREATE TABLE `gameobject_template` ( `data22` int(10) unsigned NOT NULL DEFAULT '0', `data23` int(10) unsigned NOT NULL DEFAULT '0', `ScriptName` varchar(64) NOT NULL DEFAULT '', + `WDBVerified` smallint(5) signed DEFAULT '0', PRIMARY KEY (`entry`), KEY `idx_name` (`name`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Gameobject System'; @@ -2805,35 +2807,35 @@ CREATE TABLE `item_template` ( `RangedModRange` float NOT NULL DEFAULT '0', `spellid_1` mediumint(8) signed NOT NULL DEFAULT '0', `spelltrigger_1` tinyint(3) unsigned NOT NULL DEFAULT '0', - `spellcharges_1` tinyint(4) NOT NULL DEFAULT '0', + `spellcharges_1` smallint(4) NOT NULL DEFAULT '0', `spellppmRate_1` float NOT NULL DEFAULT '0', `spellcooldown_1` int(11) NOT NULL DEFAULT '-1', `spellcategory_1` smallint(5) unsigned NOT NULL DEFAULT '0', `spellcategorycooldown_1` int(11) NOT NULL DEFAULT '-1', `spellid_2` mediumint(8) signed NOT NULL DEFAULT '0', `spelltrigger_2` tinyint(3) unsigned NOT NULL DEFAULT '0', - `spellcharges_2` tinyint(4) NOT NULL DEFAULT '0', + `spellcharges_2` smallint(4) NOT NULL DEFAULT '0', `spellppmRate_2` float NOT NULL DEFAULT '0', `spellcooldown_2` int(11) NOT NULL DEFAULT '-1', `spellcategory_2` smallint(5) unsigned NOT NULL DEFAULT '0', `spellcategorycooldown_2` int(11) NOT NULL DEFAULT '-1', `spellid_3` mediumint(8) signed NOT NULL DEFAULT '0', `spelltrigger_3` tinyint(3) unsigned NOT NULL DEFAULT '0', - `spellcharges_3` tinyint(4) NOT NULL DEFAULT '0', + `spellcharges_3` smallint(4) NOT NULL DEFAULT '0', `spellppmRate_3` float NOT NULL DEFAULT '0', `spellcooldown_3` int(11) NOT NULL DEFAULT '-1', `spellcategory_3` smallint(5) unsigned NOT NULL DEFAULT '0', `spellcategorycooldown_3` int(11) NOT NULL DEFAULT '-1', `spellid_4` mediumint(8) signed NOT NULL DEFAULT '0', `spelltrigger_4` tinyint(3) unsigned NOT NULL DEFAULT '0', - `spellcharges_4` tinyint(4) NOT NULL DEFAULT '0', + `spellcharges_4` smallint(4) NOT NULL DEFAULT '0', `spellppmRate_4` float NOT NULL DEFAULT '0', `spellcooldown_4` int(11) NOT NULL DEFAULT '-1', `spellcategory_4` smallint(5) unsigned NOT NULL DEFAULT '0', `spellcategorycooldown_4` int(11) NOT NULL DEFAULT '-1', `spellid_5` mediumint(8) signed NOT NULL DEFAULT '0', `spelltrigger_5` tinyint(3) unsigned NOT NULL DEFAULT '0', - `spellcharges_5` tinyint(4) NOT NULL DEFAULT '0', + `spellcharges_5` smallint(4) NOT NULL DEFAULT '0', `spellppmRate_5` float NOT NULL DEFAULT '0', `spellcooldown_5` int(11) NOT NULL DEFAULT '-1', `spellcategory_5` smallint(5) unsigned NOT NULL DEFAULT '0', @@ -2874,6 +2876,7 @@ CREATE TABLE `item_template` ( `FoodType` tinyint(3) unsigned NOT NULL DEFAULT '0', `minMoneyLoot` int(10) unsigned NOT NULL DEFAULT '0', `maxMoneyLoot` int(10) unsigned NOT NULL DEFAULT '0', + `WDBVerified` smallint(5) signed DEFAULT '0', PRIMARY KEY (`entry`), KEY `idx_name` (`name`), KEY `items_index` (`class`) @@ -3620,6 +3623,7 @@ CREATE TABLE `npc_text` ( `em7_3` smallint(5) unsigned NOT NULL DEFAULT '0', `em7_4` smallint(5) unsigned NOT NULL DEFAULT '0', `em7_5` smallint(5) unsigned NOT NULL DEFAULT '0', + `WDBVerified` smallint(5) signed DEFAULT '0', PRIMARY KEY (`ID`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; @@ -3697,6 +3701,7 @@ CREATE TABLE `page_text` ( `entry` mediumint(8) unsigned NOT NULL DEFAULT '0', `text` longtext NOT NULL, `next_page` mediumint(8) unsigned NOT NULL DEFAULT '0', + `WDBVerified` smallint(5) signed DEFAULT '0', PRIMARY KEY (`entry`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Item System'; /*!40101 SET character_set_client = @saved_cs_client */; @@ -3932,7 +3937,54 @@ CREATE TABLE `playercreateinfo_action` ( LOCK TABLES `playercreateinfo_action` WRITE; /*!40000 ALTER TABLE `playercreateinfo_action` DISABLE KEYS */; -INSERT INTO `playercreateinfo_action` VALUES (1,1,0,6603,0),(1,1,11,117,128),(1,1,72,6603,0),(1,1,73,78,0),(1,1,82,59752,0),(1,1,83,117,128),(1,1,84,6603,0),(1,1,96,6603,0),(1,1,108,6603,0),(1,2,0,6603,0),(1,2,1,21084,0),(1,2,2,635,0),(1,2,9,59752,0),(1,2,10,159,128),(1,2,11,2070,128),(1,4,0,6603,0),(1,4,1,1752,0),(1,4,2,2098,0),(1,4,3,2764,0),(1,4,10,59752,0),(1,4,11,2070,128),(1,5,0,6603,0),(1,5,1,585,0),(1,5,2,2050,0),(1,5,9,59752,0),(1,5,10,159,128),(1,5,11,2070,128),(1,6,0,6603,0),(1,6,1,49576,0),(1,6,2,45477,0),(1,6,3,45462,0),(1,6,4,45902,0),(1,6,5,47541,0),(1,6,11,59752,0),(1,8,0,6603,0),(1,8,1,133,0),(1,8,2,168,0),(1,8,9,59752,0),(1,8,10,159,128),(1,8,11,2070,128),(1,9,0,6603,0),(1,9,1,686,0),(1,9,2,687,0),(1,9,9,59752,0),(1,9,10,159,128),(1,9,11,4604,128),(2,1,0,6603,0),(2,1,72,6603,0),(2,1,73,78,0),(2,1,74,20572,0),(2,1,83,117,128),(2,1,84,6603,0),(2,1,96,6603,0),(2,1,108,6603,0),(2,3,0,6603,0),(2,3,1,2973,0),(2,3,2,75,0),(2,3,9,20572,0),(2,3,10,159,128),(2,3,11,117,128),(2,4,0,6603,0),(2,4,1,1752,0),(2,4,2,2098,0),(2,4,3,2764,0),(2,4,4,20572,0),(2,4,11,117,128),(2,6,0,6603,0),(2,6,1,49576,0),(2,6,2,45477,0),(2,6,3,45462,0),(2,6,4,45902,0),(2,6,5,47541,0),(2,6,10,20572,0),(2,7,0,6603,0),(2,7,1,403,0),(2,7,2,331,0),(2,7,3,33697,0),(2,7,10,159,128),(2,7,11,117,128),(2,9,0,6603,0),(2,9,1,686,0),(2,9,2,687,0),(2,9,3,33702,0),(2,9,10,159,128),(2,9,11,117,128),(3,1,0,6603,0),(3,1,1,78,0),(3,1,11,117,128),(3,1,72,6603,0),(3,1,73,78,0),(3,1,74,20594,0),(3,1,75,2481,0),(3,1,83,117,128),(3,1,84,6603,0),(3,1,96,6603,0),(3,1,108,6603,0),(3,2,0,6603,0),(3,2,1,21084,0),(3,2,2,635,0),(3,2,3,20594,0),(3,2,4,2481,0),(3,2,10,159,128),(3,2,11,4540,128),(3,3,0,6603,0),(3,3,1,2973,0),(3,3,2,75,0),(3,3,3,20594,0),(3,3,4,2481,0),(3,3,10,159,128),(3,3,11,117,128),(3,3,75,20594,0),(3,3,76,2481,0),(3,4,0,6603,0),(3,4,1,1752,0),(3,4,2,2098,0),(3,4,3,2764,0),(3,4,4,20594,0),(3,4,5,2481,0),(3,4,11,4540,128),(3,5,0,6603,0),(3,5,1,585,0),(3,5,2,2050,0),(3,5,3,20594,0),(3,5,4,2481,0),(3,5,10,159,128),(3,5,11,4540,128),(3,6,0,6603,0),(3,6,1,49576,0),(3,6,2,45477,0),(3,6,3,45462,0),(3,6,4,45902,0),(3,6,5,47541,0),(3,6,10,2481,0),(4,1,72,6603,0),(4,4,82,58984,0),(4,1,73,78,0),(4,1,82,58984,0),(4,1,83,117,128),(4,1,85,6603,0),(4,1,97,6603,0),(4,1,109,6603,0),(4,3,0,6603,0),(4,3,1,2973,0),(4,3,2,75,0),(4,3,3,58984,0),(4,3,10,159,128),(4,3,11,117,128),(4,4,0,6603,0),(4,4,1,1752,0),(4,4,2,2098,0),(4,4,3,2764,0),(4,4,10,58984,0),(4,4,11,4540,128),(4,5,0,6603,0),(4,5,1,585,0),(4,5,2,2050,0),(4,5,3,58984,0),(4,5,10,159,128),(4,5,11,2070,128),(4,6,0,6603,0),(4,6,1,49576,0),(4,6,2,45477,0),(4,6,3,45462,0),(4,6,4,45902,0),(4,6,5,47541,0),(4,6,10,58984,0),(4,6,83,58984,0),(4,11,0,6603,0),(4,11,1,5176,0),(4,11,2,5185,0),(4,11,9,58984,0),(4,11,10,159,128),(4,11,11,4536,128),(5,1,0,6603,0),(5,1,72,6603,0),(5,1,73,78,0),(5,1,74,20577,0),(5,1,83,4604,128),(5,1,84,6603,0),(5,1,96,6603,0),(5,1,108,6603,0),(5,4,0,6603,0),(5,4,1,1752,0),(5,4,2,2098,0),(5,4,3,2764,0),(5,4,4,20577,0),(5,4,11,4604,128),(5,5,0,6603,0),(5,5,1,585,0),(5,5,2,2050,0),(5,5,3,20577,0),(5,5,10,159,128),(5,5,11,4604,128),(5,6,0,6603,0),(5,6,1,49576,0),(5,6,2,45477,0),(5,6,3,45462,0),(5,6,4,45902,0),(5,6,5,47541,0),(5,6,10,20577,0),(5,8,0,6603,0),(5,8,1,133,0),(5,8,2,168,0),(5,8,3,20577,0),(5,8,10,159,128),(5,8,11,4604,128),(5,9,0,6603,0),(5,9,1,686,0),(5,9,2,687,0),(5,9,3,20577,0),(5,9,10,159,128),(5,9,11,4604,128),(6,1,0,6603,0),(6,1,1,78,0),(6,1,3,20549,0),(6,1,72,6603,0),(6,1,73,78,0),(6,1,74,20549,0),(6,1,83,4540,128),(6,1,84,6603,0),(6,1,96,6603,0),(6,1,108,6603,0),(6,3,0,6603,0),(6,3,1,2973,0),(6,3,2,75,0),(6,3,3,20549,0),(6,3,10,159,128),(6,3,11,117,128),(6,3,76,20549,0),(6,6,0,6603,0),(6,6,1,49576,0),(6,6,2,45477,0),(6,6,3,45462,0),(6,6,4,45902,0),(6,6,5,47541,0),(6,6,10,20549,0),(6,6,75,20549,0),(6,7,0,6603,0),(6,7,1,403,0),(6,7,2,331,0),(6,7,3,20549,0),(6,7,10,159,128),(6,7,11,4604,128),(6,7,76,20549,0),(6,11,0,6603,0),(6,11,1,5176,0),(6,11,2,5185,0),(6,11,3,20549,0),(6,11,10,159,128),(6,11,11,4536,128),(6,11,73,6603,0),(6,11,76,20549,0),(6,11,85,6603,0),(6,11,97,6603,0),(6,11,109,6603,0),(7,1,0,6603,0),(7,1,1,78,0),(7,1,10,20589,0),(7,1,11,117,128),(7,1,72,6603,0),(7,1,73,78,0),(7,1,82,20589,0),(7,1,83,117,128),(7,1,84,6603,0),(7,1,96,6603,0),(7,1,108,6603,0),(7,4,0,6603,0),(7,4,1,1752,0),(7,4,2,2098,0),(7,4,3,2764,0),(7,4,10,20589,0),(7,4,11,117,128),(7,6,0,6603,0),(7,6,1,49576,0),(7,6,2,45477,0),(7,6,3,45462,0),(7,6,4,45902,0),(7,6,5,47541,0),(7,6,10,20589,0),(7,6,83,41751,128),(7,6,72,6603,0),(7,6,11,41751,128),(7,6,84,6603,0),(7,6,96,6603,0),(7,6,108,6603,0),(7,8,0,6603,0),(7,8,1,133,0),(7,8,2,168,0),(7,8,9,20589,0),(7,8,10,159,128),(7,8,11,4536,128),(7,9,0,6603,0),(7,9,1,686,0),(7,9,2,687,0),(7,9,9,20589,0),(7,9,10,159,128),(7,9,11,4604,128),(8,1,0,6603,0),(8,1,72,6603,0),(8,1,73,78,0),(8,1,74,2764,0),(8,1,75,26297,0),(8,1,83,117,128),(8,1,84,6603,0),(8,1,96,6603,0),(8,1,108,6603,0),(8,3,0,6603,0),(8,3,1,2973,0),(8,3,2,75,0),(8,3,10,159,128),(8,3,11,4604,128),(8,8,3,26297,0),(8,4,0,6603,0),(8,4,1,1752,0),(8,4,2,2098,0),(8,4,3,2764,0),(8,4,11,117,128),(8,4,4,26297,0),(8,5,0,6603,0),(8,5,1,585,0),(8,5,2,2050,0),(8,5,10,159,128),(8,5,11,4540,128),(8,7,3,26297,0),(8,6,0,6603,0),(8,6,1,49576,0),(8,6,2,45477,0),(8,6,3,45462,0),(8,6,4,45902,0),(8,6,5,47541,0),(8,6,10,26297,0),(8,7,0,6603,0),(8,7,1,403,0),(8,7,2,331,0),(8,7,10,159,128),(8,7,11,117,128),(8,5,3,26297,0),(8,8,0,6603,0),(8,8,1,133,0),(8,8,2,168,0),(8,8,10,159,128),(8,8,11,117,128),(8,3,3,26297,0),(10,2,0,6603,0),(10,2,1,21084,0),(10,2,2,635,0),(10,2,3,28730,0),(10,2,10,159,128),(10,2,11,20857,128),(10,3,0,6603,0),(10,3,1,2973,0),(10,3,2,75,0),(10,3,3,28730,0),(10,3,10,159,128),(10,3,11,20857,128),(10,4,0,6603,0),(10,4,1,1752,0),(10,4,2,2098,0),(10,4,3,2764,0),(10,4,4,25046,0),(10,4,11,20857,128),(10,5,0,6603,0),(10,5,1,585,0),(10,5,2,2050,0),(10,5,3,28730,0),(10,5,10,159,128),(10,5,11,20857,128),(10,6,0,6603,0),(10,6,1,49576,0),(10,6,2,45477,0),(10,6,3,45462,0),(10,6,4,45902,0),(10,6,5,47541,0),(10,6,6,50613,0),(10,8,0,6603,0),(10,8,1,133,0),(10,8,2,168,0),(10,8,3,28730,0),(10,8,10,159,128),(10,8,11,20857,128),(10,9,0,6603,0),(10,9,1,686,0),(10,9,2,687,0),(10,9,3,28730,0),(10,9,10,159,128),(10,9,11,20857,128),(11,1,0,6603,0),(11,1,72,6603,0),(11,1,73,78,0),(11,1,74,28880,0),(11,1,83,4540,128),(11,1,84,6603,0),(11,1,96,6603,0),(11,1,108,6603,0),(11,2,0,6603,0),(11,2,1,21084,0),(11,2,2,635,0),(11,2,3,59542,0),(11,2,10,159,128),(11,2,11,4540,128),(11,2,83,4540,128),(11,3,0,6603,0),(11,3,1,2973,0),(11,3,2,75,0),(11,3,3,59543,0),(11,3,10,159,128),(11,3,11,4540,128),(11,3,72,6603,0),(11,3,73,2973,0),(11,3,74,75,0),(11,3,82,159,128),(11,3,83,4540,128),(11,5,0,6603,0),(11,5,1,585,0),(11,5,2,2050,0),(11,5,3,59544,0),(11,5,10,159,128),(11,5,11,4540,128),(11,5,83,4540,128),(11,6,0,6603,0),(11,6,1,49576,0),(11,6,2,45477,0),(11,6,3,45462,0),(11,6,4,45902,0),(11,6,5,47541,0),(11,6,10,59545,0),(11,7,0,6603,0),(11,7,1,403,0),(11,7,2,331,0),(11,7,3,59547,0),(11,7,10,159,128),(11,7,11,4540,128),(11,8,0,6603,0),(11,8,1,133,0),(11,8,2,168,0),(11,8,3,59548,0),(11,8,10,159,128),(11,8,11,4540,128),(11,8,83,4540,128),(11,6,11,41751,128); +INSERT INTO `playercreateinfo_action` (`race`,`class`,`button`,`action`,`type`) VALUES +(10,6,2,45477,0), +(10,6,3,45462,0), +(10,6,4,45902,0), +(10,6,5,47541,0), +(10,6,6,50613,0), +(10,8,0,133,0), +(10,8,1,168,0), +(10,8,2,28730,0), +(10,9,0,686,0), +(10,9,1,687,0), +(10,9,2,28730,0), +(11,1,0,6603,0), +(11,1,72,6603,0), +(11,1,73,78,0), +(11,1,74,28880,0), +(11,1,84,6603,0), +(11,1,96,6603,0), +(11,1,108,6603,0), +(11,2,0,6603,0), +(11,2,1,21084,0), +(11,2,2,635,0), +(11,2,3,59542,0), +(11,3,0,6603,0), +(11,3,1,2973,0), +(11,3,2,75,0), +(11,3,3,59543,0), +(11,3,72,6603,0), +(11,3,73,2973,0), +(11,3,74,75,0), +(11,5,0,585,0), +(11,5,1,2050,0), +(11,5,2,59544,0), +(11,6,0,6603,0), +(11,6,1,49576,0), +(11,6,2,45477,0), +(11,6,3,45462,0), +(11,6,4,45902,0), +(11,6,5,47541,0), +(11,6,10,59545,0), +(11,7,0,6603,0), +(11,7,1,403,0), +(11,7,2,331,0), +(11,7,3,59547,0), +(11,8,0,133,0), +(11,8,1,168,0), +(11,8,2,59548,0), +(11,6,11,41751,128); /*!40000 ALTER TABLE `playercreateinfo_action` ENABLE KEYS */; UNLOCK TABLES; @@ -3983,7 +4035,7 @@ CREATE TABLE `playercreateinfo_spell` ( LOCK TABLES `playercreateinfo_spell` WRITE; /*!40000 ALTER TABLE `playercreateinfo_spell` DISABLE KEYS */; -INSERT INTO `playercreateinfo_spell` VALUES (1,1,78,'Heroic Strike'),(1,1,81,'Dodge'),(1,1,107,'Block'),(1,1,196,'One-Handed Axes'),(1,1,198,'One-Handed Maces'),(1,1,201,'One-Handed Swords'),(1,1,203,'Unarmed'),(1,1,204,'Defense'),(1,1,522,'SPELLDEFENSE (DND)'),(1,1,668,'Language Common'),(1,1,1843,'Disarm'),(1,1,2382,'Generic'),(1,1,2457,'Battle Stance'),(1,1,2479,'Honorless Target'),(1,1,3050,'Detect'),(1,1,3365,'Opening'),(1,1,5301,'Defensive State (DND)'),(1,1,6233,'Closing'),(1,1,6246,'Closing'),(1,1,6247,'Opening'),(1,1,6477,'Opening'),(1,1,6478,'Opening'),(1,1,6603,'Attack'),(1,1,7266,'Duel'),(1,1,7267,'Grovel'),(1,1,7355,'Stuck'),(1,1,8386,'Attacking'),(1,1,8737,'Mail'),(1,1,9077,'Leather'),(1,1,9078,'Cloth'),(1,1,9116,'Shield'),(1,1,9125,'Generic'),(1,1,20597,'Sword Specialization'),(1,1,20598,'The Human Spirit'),(1,1,20599,'Diplomacy'),(1,1,20864,'Mace Specialization'),(1,1,21651,'Opening'),(1,1,21652,'Closing'),(1,1,22027,'Remove Insignia'),(1,1,22810,'Opening - No Text'),(1,1,32215,'Victorious State'),(1,1,45927,'Summon Friend'),(1,1,58985,'Perception'),(1,1,59752,'Every Man for Himself'),(1,1,61437,'Opening'),(1,2,81,'Dodge'),(1,2,107,'Block'),(1,2,198,'One-Handed Maces'),(1,2,199,'Two-Handed Maces'),(1,2,203,'Unarmed'),(1,2,204,'Defense'),(1,2,522,'SPELLDEFENSE (DND)'),(1,2,635,'Holy Light'),(1,2,668,'Language Common'),(1,2,1843,'Disarm'),(1,2,2382,'Generic'),(1,2,2479,'Honorless Target'),(1,2,3050,'Detect'),(1,2,3365,'Opening'),(1,2,6233,'Closing'),(1,2,6246,'Closing'),(1,2,6247,'Opening'),(1,2,6477,'Opening'),(1,2,6478,'Opening'),(1,2,6603,'Attack'),(1,2,7266,'Duel'),(1,2,7267,'Grovel'),(1,2,7355,'Stuck'),(1,2,8386,'Attacking'),(1,2,8737,'Mail'),(1,2,9077,'Leather'),(1,2,9078,'Cloth'),(1,2,9116,'Shield'),(1,2,9125,'Generic'),(1,2,21084,'Seal of Righteousness'),(1,2,20597,'Sword Specialization'),(1,2,20598,'The Human Spirit'),(1,2,20599,'Diplomacy'),(1,2,20864,'Mace Specialization'),(1,2,21651,'Opening'),(1,2,21652,'Closing'),(1,2,22027,'Remove Insignia'),(1,2,22810,'Opening - No Text'),(1,2,27762,'Libram'),(1,2,45927,'Summon Friend'),(1,2,58985,'Perception'),(1,2,59752,'Every Man for Himself'),(1,2,61437,'Opening'),(1,4,81,'Dodge'),(1,4,203,'Unarmed'),(1,4,204,'Defense'),(1,4,522,'SPELLDEFENSE (DND)'),(1,4,668,'Language Common'),(1,4,1180,'Daggers'),(1,4,1752,'Sinister Strike'),(1,4,1843,'Disarm'),(1,4,2098,'Eviscerate'),(1,4,2382,'Generic'),(1,4,2479,'Honorless Target'),(1,4,2567,'Thrown'),(1,4,2764,'Throw'),(1,4,3050,'Detect'),(1,4,3365,'Opening'),(1,4,6233,'Closing'),(1,4,6246,'Closing'),(1,4,6247,'Opening'),(1,4,6477,'Opening'),(1,4,6478,'Opening'),(1,4,6603,'Attack'),(1,4,7266,'Duel'),(1,4,7267,'Grovel'),(1,4,7355,'Stuck'),(1,4,8386,'Attacking'),(1,4,9077,'Leather'),(1,4,9078,'Cloth'),(1,4,9125,'Generic'),(1,4,16092,'Defensive State (DND)'),(1,4,20597,'Sword Specialization'),(1,4,20598,'The Human Spirit'),(1,4,20599,'Diplomacy'),(1,4,20864,'Mace Specialization'),(1,4,21184,'Rogue Passive (DND)'),(1,4,21651,'Opening'),(1,4,21652,'Closing'),(1,4,22027,'Remove Insignia'),(1,4,22810,'Opening - No Text'),(1,4,45927,'Summon Friend'),(1,4,58985,'Perception'),(1,4,59752,'Every Man for Himself'),(1,4,61437,'Opening'),(1,5,81,'Dodge'),(1,5,198,'One-Handed Maces'),(1,5,203,'Unarmed'),(1,5,204,'Defense'),(1,5,522,'SPELLDEFENSE (DND)'),(1,5,585,'Smite'),(1,5,668,'Language Common'),(1,5,1843,'Disarm'),(1,5,2050,'Lesser Heal'),(1,5,2382,'Generic'),(1,5,2479,'Honorless Target'),(1,5,3050,'Detect'),(1,5,3365,'Opening'),(1,5,5009,'Wands'),(1,5,5019,'Shoot'),(1,5,6233,'Closing'),(1,5,6246,'Closing'),(1,5,6247,'Opening'),(1,5,6477,'Opening'),(1,5,6478,'Opening'),(1,5,6603,'Attack'),(1,5,7266,'Duel'),(1,5,7267,'Grovel'),(1,5,7355,'Stuck'),(1,5,8386,'Attacking'),(1,5,9078,'Cloth'),(1,5,9125,'Generic'),(1,5,20597,'Sword Specialization'),(1,5,20598,'The Human Spirit'),(1,5,20599,'Diplomacy'),(1,5,20864,'Mace Specialization'),(1,5,21651,'Opening'),(1,5,21652,'Closing'),(1,5,22027,'Remove Insignia'),(1,5,22810,'Opening - No Text'),(1,5,45927,'Summon Friend'),(1,5,58985,'Perception'),(1,5,59752,'Every Man for Himself'),(1,5,61437,'Opening'),(1,6,81,'Dodge'),(1,6,196,'One-Handed Axes'),(1,6,197,'Two-Handed Axes'),(1,6,200,'Polearms'),(1,6,201,'One-Handed Swords'),(1,6,202,'Two-Handed Swords'),(1,6,203,'Unarmed'),(1,6,204,'Defense'),(1,6,522,'SPELLDEFENSE (DND)'),(1,6,668,'Language Common'),(1,6,674,'Dual Wield'),(1,6,750,'Plate Mail'),(1,6,1843,'Disarm'),(1,6,2382,'Generic'),(1,6,2479,'Honorless Target'),(1,6,3050,'Detect'),(1,6,3127,'Parry'),(1,6,3275,'Linen Bandage'),(1,6,3276,'Heavy Linen Bandage'),(1,6,3277,'Wool Bandage'),(1,6,3278,'Heavy Wool Bandage'),(1,6,3365,'Opening'),(1,6,6233,'Closing'),(1,6,6246,'Closing'),(1,6,6247,'Opening'),(1,6,6477,'Opening'),(1,6,6478,'Opening'),(1,6,6603,'Attack'),(1,6,7266,'Duel'),(1,6,7267,'Grovel'),(1,6,7355,'Stuck'),(1,6,7928,'Silk Bandage'),(1,6,7929,'Heavy Silk Bandage'),(1,6,7934,'Anti-Venom'),(1,6,8386,'Attacking'),(1,6,8737,'Mail'),(1,6,9077,'Leather'),(1,6,9078,'Cloth'),(1,6,9125,'Generic'),(1,6,10840,'Mageweave Bandage'),(1,6,10841,'Heavy Mageweave Bandage'),(1,6,10846,'First Aid'),(1,6,18629,'Runecloth Bandage'),(1,6,18630,'Heavy Runecloth Bandage'),(1,6,20597,'Sword Specialization'),(1,6,20598,'The Human Spirit'),(1,6,20599,'Diplomacy'),(1,6,20864,'Mace Specialization'),(1,6,21651,'Opening'),(1,6,21652,'Closing'),(1,6,22027,'Remove Insignia'),(1,6,22810,'Opening - No Text'),(1,6,33391,'Journeyman Riding'),(1,6,45462,'Plague Strike'),(1,6,45477,'Icy Touch'),(1,6,45902,'Blood Strike'),(1,6,45903,'Offensive State (DND)'),(1,6,45927,'Summon Friend'),(1,6,47541,'Death Coil'),(1,6,48266,'Blood Presence'),(1,6,49410,'Forceful Deflection'),(1,6,49576,'Death Grip'),(1,6,52665,'Sigil'),(1,6,58985,'Perception'),(1,6,59752,'Every Man for Himself'),(1,6,59879,'Blood Plague'),(1,6,59921,'Frost Fever'),(1,6,61437,'Opening'),(1,6,61455,'Runic Focus'),(1,8,81,'Dodge'),(1,8,133,'Fireball'),(1,8,168,'Frost Armor'),(1,8,203,'Unarmed'),(1,8,204,'Defense'),(1,8,227,'Staves'),(1,8,522,'SPELLDEFENSE (DND)'),(1,8,668,'Language Common'),(1,8,1843,'Disarm'),(1,8,2382,'Generic'),(1,8,2479,'Honorless Target'),(1,8,3050,'Detect'),(1,8,3365,'Opening'),(1,8,5009,'Wands'),(1,8,5019,'Shoot'),(1,8,6233,'Closing'),(1,8,6246,'Closing'),(1,8,6247,'Opening'),(1,8,6477,'Opening'),(1,8,6478,'Opening'),(1,8,6603,'Attack'),(1,8,7266,'Duel'),(1,8,7267,'Grovel'),(1,8,7355,'Stuck'),(1,8,8386,'Attacking'),(1,8,9078,'Cloth'),(1,8,9125,'Generic'),(1,8,20597,'Sword Specialization'),(1,8,20598,'The Human Spirit'),(1,8,20599,'Diplomacy'),(1,8,20864,'Mace Specialization'),(1,8,21651,'Opening'),(1,8,21652,'Closing'),(1,8,22027,'Remove Insignia'),(1,8,22810,'Opening - No Text'),(1,8,45927,'Summon Friend'),(1,8,58985,'Perception'),(1,8,59752,'Every Man for Himself'),(1,8,61437,'Opening'),(1,9,81,'Dodge'),(1,9,203,'Unarmed'),(1,9,204,'Defense'),(1,9,522,'SPELLDEFENSE (DND)'),(1,9,668,'Language Common'),(1,9,686,'Shadow Bolt'),(1,9,687,'Demon Skin'),(1,9,1180,'Daggers'),(1,9,1843,'Disarm'),(1,9,2382,'Generic'),(1,9,2479,'Honorless Target'),(1,9,3050,'Detect'),(1,9,3365,'Opening'),(1,9,5009,'Wands'),(1,9,5019,'Shoot'),(1,9,6233,'Closing'),(1,9,6246,'Closing'),(1,9,6247,'Opening'),(1,9,6477,'Opening'),(1,9,6478,'Opening'),(1,9,6603,'Attack'),(1,9,7266,'Duel'),(1,9,7267,'Grovel'),(1,9,7355,'Stuck'),(1,9,8386,'Attacking'),(1,9,9078,'Cloth'),(1,9,9125,'Generic'),(1,9,20597,'Sword Specialization'),(1,9,20598,'The Human Spirit'),(1,9,20599,'Diplomacy'),(1,9,20864,'Mace Specialization'),(1,9,21651,'Opening'),(1,9,21652,'Closing'),(1,9,22027,'Remove Insignia'),(1,9,22810,'Opening - No Text'),(1,9,45927,'Summon Friend'),(5,9,58284,'Chaos Bolt Passive'),(1,9,58985,'Perception'),(1,9,59752,'Every Man for Himself'),(1,9,61437,'Opening'),(2,1,78,'Heroic Strike'),(2,1,81,'Dodge'),(2,1,107,'Block'),(2,1,196,'One-Handed Axes'),(2,1,197,'Two-Handed Axes'),(2,1,201,'One-Handed Swords'),(2,1,203,'Unarmed'),(2,1,204,'Defense'),(2,1,522,'SPELLDEFENSE (DND)'),(2,1,669,'Language Orcish'),(2,1,1843,'Disarm'),(2,1,2382,'Generic'),(2,1,2457,'Battle Stance'),(2,1,2479,'Honorless Target'),(2,1,3050,'Detect'),(2,1,3365,'Opening'),(2,1,5301,'Defensive State (DND)'),(2,1,6233,'Closing'),(2,1,6246,'Closing'),(2,1,6247,'Opening'),(2,1,6477,'Opening'),(2,1,6478,'Opening'),(2,1,6603,'Attack'),(2,1,7266,'Duel'),(2,1,7267,'Grovel'),(2,1,7355,'Stuck'),(2,1,8386,'Attacking'),(2,1,8737,'Mail'),(2,1,9077,'Leather'),(2,1,9078,'Cloth'),(2,1,9116,'Shield'),(2,1,9125,'Generic'),(2,1,20572,'Blood Fury'),(2,1,20573,'Hardiness'),(2,1,20574,'Axe Specialization'),(2,1,21563,'Command'),(2,1,21651,'Opening'),(2,1,21652,'Closing'),(2,1,22027,'Remove Insignia'),(2,1,22810,'Opening - No Text'),(2,1,32215,'Victorious State'),(2,1,45927,'Summon Friend'),(2,1,61437,'Opening'),(2,3,75,'Auto Shot'),(2,3,81,'Dodge'),(2,3,196,'One-Handed Axes'),(2,3,203,'Unarmed'),(2,3,204,'Defense'),(2,3,264,'Bows'),(2,3,522,'SPELLDEFENSE (DND)'),(2,3,669,'Language Orcish'),(2,3,1843,'Disarm'),(2,3,2382,'Generic'),(2,3,2479,'Honorless Target'),(2,3,2973,'Raptor Strike'),(2,3,3050,'Detect'),(2,3,3365,'Opening'),(2,3,6233,'Closing'),(2,3,6246,'Closing'),(2,3,6247,'Opening'),(2,3,6477,'Opening'),(2,3,6478,'Opening'),(2,3,6603,'Attack'),(2,3,7266,'Duel'),(2,3,7267,'Grovel'),(2,3,7355,'Stuck'),(2,3,8386,'Attacking'),(2,3,9077,'Leather'),(2,3,9078,'Cloth'),(2,3,9125,'Generic'),(2,3,13358,'Defensive State (DND)'),(2,3,20572,'Blood Fury'),(2,3,20573,'Hardiness'),(2,3,20574,'Axe Specialization'),(2,3,20576,'Command'),(2,3,21651,'Opening'),(2,3,21652,'Closing'),(2,3,22027,'Remove Insignia'),(2,3,22810,'Opening - No Text'),(2,3,24949,'Defensive State 2 (DND)'),(2,3,34082,'Advantaged State (DND)'),(2,3,45927,'Summon Friend'),(2,3,61437,'Opening'),(2,4,81,'Dodge'),(2,4,203,'Unarmed'),(2,4,204,'Defense'),(2,4,522,'SPELLDEFENSE (DND)'),(2,4,669,'Language Orcish'),(2,4,1180,'Daggers'),(2,4,1752,'Sinister Strike'),(2,4,1843,'Disarm'),(2,4,2098,'Eviscerate'),(2,4,2382,'Generic'),(2,4,2479,'Honorless Target'),(2,4,2567,'Thrown'),(2,4,2764,'Throw'),(2,4,3050,'Detect'),(2,4,3365,'Opening'),(2,4,6233,'Closing'),(2,4,6246,'Closing'),(2,4,6247,'Opening'),(2,4,6477,'Opening'),(2,4,6478,'Opening'),(2,4,6603,'Attack'),(2,4,7266,'Duel'),(2,4,7267,'Grovel'),(2,4,7355,'Stuck'),(2,4,8386,'Attacking'),(2,4,9077,'Leather'),(2,4,9078,'Cloth'),(2,4,9125,'Generic'),(2,4,16092,'Defensive State (DND)'),(2,4,20572,'Blood Fury'),(2,4,20573,'Hardiness'),(2,4,20574,'Axe Specialization'),(2,4,21184,'Rogue Passive (DND)'),(2,4,21563,'Command'),(2,4,21651,'Opening'),(2,4,21652,'Closing'),(2,4,22027,'Remove Insignia'),(2,4,22810,'Opening - No Text'),(2,4,45927,'Summon Friend'),(2,4,61437,'Opening'),(2,6,81,'Dodge'),(2,6,196,'One-Handed Axes'),(2,6,197,'Two-Handed Axes'),(2,6,200,'Polearms'),(2,6,201,'One-Handed Swords'),(2,6,202,'Two-Handed Swords'),(2,6,203,'Unarmed'),(2,6,204,'Defense'),(2,6,522,'SPELLDEFENSE (DND)'),(2,6,669,'Language Orcish'),(2,6,674,'Dual Wield'),(2,6,750,'Plate Mail'),(2,6,1843,'Disarm'),(2,6,2382,'Generic'),(2,6,2479,'Honorless Target'),(2,6,3050,'Detect'),(2,6,3127,'Parry'),(2,6,3275,'Linen Bandage'),(2,6,3276,'Heavy Linen Bandage'),(2,6,3277,'Wool Bandage'),(2,6,3278,'Heavy Wool Bandage'),(2,6,3365,'Opening'),(2,6,6233,'Closing'),(2,6,6246,'Closing'),(2,6,6247,'Opening'),(2,6,6477,'Opening'),(2,6,6478,'Opening'),(2,6,6603,'Attack'),(2,6,7266,'Duel'),(2,6,7267,'Grovel'),(2,6,7355,'Stuck'),(2,6,7928,'Silk Bandage'),(2,6,7929,'Heavy Silk Bandage'),(2,6,7934,'Anti-Venom'),(2,6,8386,'Attacking'),(2,6,8737,'Mail'),(2,6,9077,'Leather'),(2,6,9078,'Cloth'),(2,6,9125,'Generic'),(2,6,10840,'Mageweave Bandage'),(2,6,10841,'Heavy Mageweave Bandage'),(2,6,10846,'First Aid'),(2,6,18629,'Runecloth Bandage'),(2,6,18630,'Heavy Runecloth Bandage'),(2,6,20572,'Blood Fury'),(2,6,20573,'Hardiness'),(2,6,20574,'Axe Specialization'),(2,6,21651,'Opening'),(2,6,21652,'Closing'),(2,6,22027,'Remove Insignia'),(2,6,22810,'Opening - No Text'),(2,6,33391,'Journeyman Riding'),(2,6,45462,'Plague Strike'),(2,6,45477,'Icy Touch'),(2,6,45902,'Blood Strike'),(2,6,45903,'Offensive State (DND)'),(2,6,45927,'Summon Friend'),(2,6,47541,'Death Coil'),(2,6,48266,'Blood Presence'),(2,6,49410,'Forceful Deflection'),(2,6,49576,'Death Grip'),(2,6,52665,'Sigil'),(2,6,54562,'Command'),(2,6,59879,'Blood Plague'),(2,6,59921,'Frost Fever'),(2,6,61437,'Opening'),(2,6,61455,'Runic Focus'),(2,7,81,'Dodge'),(2,7,107,'Block'),(2,7,198,'One-Handed Maces'),(2,7,203,'Unarmed'),(2,7,204,'Defense'),(2,7,227,'Staves'),(2,7,331,'Healing Wave'),(2,7,403,'Lightning Bolt'),(2,7,522,'SPELLDEFENSE (DND)'),(2,7,669,'Language Orcish'),(2,7,1843,'Disarm'),(2,7,2382,'Generic'),(2,7,2479,'Honorless Target'),(2,7,3050,'Detect'),(2,7,3365,'Opening'),(2,7,6233,'Closing'),(2,7,6246,'Closing'),(2,7,6247,'Opening'),(2,7,6477,'Opening'),(2,7,6478,'Opening'),(2,7,6603,'Attack'),(2,7,7266,'Duel'),(2,7,7267,'Grovel'),(2,7,7355,'Stuck'),(2,7,8386,'Attacking'),(2,7,9077,'Leather'),(2,7,9078,'Cloth'),(2,7,9116,'Shield'),(2,7,9125,'Generic'),(2,7,20573,'Hardiness'),(2,7,20574,'Axe Specialization'),(2,7,21563,'Command'),(2,7,21651,'Opening'),(2,7,21652,'Closing'),(2,7,22027,'Remove Insignia'),(2,7,22810,'Opening - No Text'),(2,7,27763,'Totem'),(2,7,33697,'Blood Fury'),(2,7,45927,'Summon Friend'),(2,7,61437,'Opening'),(2,9,81,'Dodge'),(2,9,203,'Unarmed'),(2,9,204,'Defense'),(2,9,522,'SPELLDEFENSE (DND)'),(2,9,669,'Language Orcish'),(2,9,686,'Shadow Bolt'),(2,9,687,'Demon Skin'),(2,9,1180,'Daggers'),(2,9,1843,'Disarm'),(2,9,2382,'Generic'),(2,9,2479,'Honorless Target'),(2,9,3050,'Detect'),(2,9,3365,'Opening'),(2,9,5009,'Wands'),(2,9,5019,'Shoot'),(2,9,6233,'Closing'),(2,9,6246,'Closing'),(2,9,6247,'Opening'),(2,9,6477,'Opening'),(2,9,6478,'Opening'),(2,9,6603,'Attack'),(2,9,7266,'Duel'),(2,9,7267,'Grovel'),(2,9,7355,'Stuck'),(2,9,8386,'Attacking'),(2,9,9078,'Cloth'),(2,9,9125,'Generic'),(2,9,20573,'Hardiness'),(2,9,20574,'Axe Specialization'),(2,9,20575,'Command'),(2,9,21651,'Opening'),(2,9,21652,'Closing'),(2,9,22027,'Remove Insignia'),(2,9,22810,'Opening - No Text'),(2,9,33702,'Blood Fury'),(2,9,45927,'Summon Friend'),(2,9,58284,'Chaos Bolt Passive'),(2,9,61437,'Opening'),(3,1,78,'Heroic Strike'),(3,1,81,'Dodge'),(3,1,107,'Block'),(3,1,196,'One-Handed Axes'),(3,1,197,'Two-Handed Axes'),(3,1,198,'One-Handed Maces'),(3,1,203,'Unarmed'),(3,1,204,'Defense'),(3,1,522,'SPELLDEFENSE (DND)'),(3,1,668,'Language Common'),(3,1,672,'Language Dwarven'),(3,1,1843,'Disarm'),(3,1,2382,'Generic'),(3,1,2457,'Battle Stance'),(3,1,2479,'Honorless Target'),(3,1,2481,'Find Treasure'),(3,1,3050,'Detect'),(3,1,3365,'Opening'),(3,1,5301,'Defensive State (DND)'),(3,1,6233,'Closing'),(3,1,6246,'Closing'),(3,1,6247,'Opening'),(3,1,6477,'Opening'),(3,1,6478,'Opening'),(3,1,6603,'Attack'),(3,1,7266,'Duel'),(3,1,7267,'Grovel'),(3,1,7355,'Stuck'),(3,1,8386,'Attacking'),(3,1,8737,'Mail'),(3,1,9077,'Leather'),(3,1,9078,'Cloth'),(3,1,9116,'Shield'),(3,1,9125,'Generic'),(3,1,20594,'Stoneform'),(3,1,20595,'Gun Specialization'),(3,1,20596,'Frost Resistance'),(3,1,21651,'Opening'),(3,1,21652,'Closing'),(3,1,22027,'Remove Insignia'),(3,1,22810,'Opening - No Text'),(3,1,32215,'Victorious State'),(3,1,45927,'Summon Friend'),(3,1,59224,'Mace Specialization'),(3,1,61437,'Opening'),(3,2,81,'Dodge'),(3,2,107,'Block'),(3,2,198,'One-Handed Maces'),(3,2,199,'Two-Handed Maces'),(3,2,203,'Unarmed'),(3,2,204,'Defense'),(3,2,522,'SPELLDEFENSE (DND)'),(3,2,635,'Holy Light'),(3,2,668,'Language Common'),(3,2,672,'Language Dwarven'),(3,2,1843,'Disarm'),(3,2,2382,'Generic'),(3,2,2479,'Honorless Target'),(3,2,2481,'Find Treasure'),(3,2,3050,'Detect'),(3,2,3365,'Opening'),(3,2,6233,'Closing'),(3,2,6246,'Closing'),(3,2,6247,'Opening'),(3,2,6477,'Opening'),(3,2,6478,'Opening'),(3,2,6603,'Attack'),(3,2,7266,'Duel'),(3,2,7267,'Grovel'),(3,2,7355,'Stuck'),(3,2,8386,'Attacking'),(3,2,8737,'Mail'),(3,2,9077,'Leather'),(3,2,9078,'Cloth'),(3,2,9116,'Shield'),(3,2,9125,'Generic'),(3,2,21084,'Seal of Righteousness'),(3,2,20594,'Stoneform'),(3,2,20595,'Gun Specialization'),(3,2,20596,'Frost Resistance'),(3,2,21651,'Opening'),(3,2,21652,'Closing'),(3,2,22027,'Remove Insignia'),(3,2,22810,'Opening - No Text'),(3,2,27762,'Libram'),(3,2,45927,'Summon Friend'),(3,2,59224,'Mace Specialization'),(3,2,61437,'Opening'),(3,3,75,'Auto Shot'),(3,3,81,'Dodge'),(3,3,196,'One-Handed Axes'),(3,3,203,'Unarmed'),(3,3,204,'Defense'),(3,3,266,'Guns'),(3,3,522,'SPELLDEFENSE (DND)'),(3,3,668,'Language Common'),(3,3,672,'Language Dwarven'),(3,3,1843,'Disarm'),(3,3,2382,'Generic'),(3,3,2479,'Honorless Target'),(3,3,2481,'Find Treasure'),(3,3,2973,'Raptor Strike'),(3,3,3050,'Detect'),(3,3,3365,'Opening'),(3,3,6233,'Closing'),(3,3,6246,'Closing'),(3,3,6247,'Opening'),(3,3,6477,'Opening'),(3,3,6478,'Opening'),(3,3,6603,'Attack'),(3,3,7266,'Duel'),(3,3,7267,'Grovel'),(3,3,7355,'Stuck'),(3,3,8386,'Attacking'),(3,3,9077,'Leather'),(3,3,9078,'Cloth'),(3,3,9125,'Generic'),(3,3,13358,'Defensive State (DND)'),(3,3,20594,'Stoneform'),(3,3,20595,'Gun Specialization'),(3,3,20596,'Frost Resistance'),(3,3,21651,'Opening'),(3,3,21652,'Closing'),(3,3,22027,'Remove Insignia'),(3,3,22810,'Opening - No Text'),(3,3,24949,'Defensive State 2 (DND)'),(3,3,34082,'Advantaged State (DND)'),(3,3,45927,'Summon Friend'),(3,3,59224,'Mace Specialization'),(3,3,61437,'Opening'),(3,4,81,'Dodge'),(3,4,203,'Unarmed'),(3,4,204,'Defense'),(3,4,522,'SPELLDEFENSE (DND)'),(3,4,668,'Language Common'),(3,4,672,'Language Dwarven'),(3,4,1180,'Daggers'),(3,4,1752,'Sinister Strike'),(3,4,1843,'Disarm'),(3,4,2098,'Eviscerate'),(3,4,2382,'Generic'),(3,4,2479,'Honorless Target'),(3,4,2481,'Find Treasure'),(3,4,2567,'Thrown'),(3,4,2764,'Throw'),(3,4,3050,'Detect'),(3,4,3365,'Opening'),(3,4,6233,'Closing'),(3,4,6246,'Closing'),(3,4,6247,'Opening'),(3,4,6477,'Opening'),(3,4,6478,'Opening'),(3,4,6603,'Attack'),(3,4,7266,'Duel'),(3,4,7267,'Grovel'),(3,4,7355,'Stuck'),(3,4,8386,'Attacking'),(3,4,9077,'Leather'),(3,4,9078,'Cloth'),(3,4,9125,'Generic'),(3,4,16092,'Defensive State (DND)'),(3,4,20594,'Stoneform'),(3,4,20595,'Gun Specialization'),(3,4,20596,'Frost Resistance'),(3,4,21184,'Rogue Passive (DND)'),(3,4,21651,'Opening'),(3,4,21652,'Closing'),(3,4,22027,'Remove Insignia'),(3,4,22810,'Opening - No Text'),(3,4,45927,'Summon Friend'),(3,4,59224,'Mace Specialization'),(3,4,61437,'Opening'),(3,5,81,'Dodge'),(3,5,198,'One-Handed Maces'),(3,5,203,'Unarmed'),(3,5,204,'Defense'),(3,5,522,'SPELLDEFENSE (DND)'),(3,5,585,'Smite'),(3,5,668,'Language Common'),(3,5,672,'Language Dwarven'),(3,5,1843,'Disarm'),(3,5,2050,'Lesser Heal'),(3,5,2382,'Generic'),(3,5,2479,'Honorless Target'),(3,5,2481,'Find Treasure'),(3,5,3050,'Detect'),(3,5,3365,'Opening'),(3,5,5009,'Wands'),(3,5,5019,'Shoot'),(3,5,6233,'Closing'),(3,5,6246,'Closing'),(3,5,6247,'Opening'),(3,5,6477,'Opening'),(3,5,6478,'Opening'),(3,5,6603,'Attack'),(3,5,7266,'Duel'),(3,5,7267,'Grovel'),(3,5,7355,'Stuck'),(3,5,8386,'Attacking'),(3,5,9078,'Cloth'),(3,5,9125,'Generic'),(3,5,20594,'Stoneform'),(3,5,20595,'Gun Specialization'),(3,5,20596,'Frost Resistance'),(3,5,21651,'Opening'),(3,5,21652,'Closing'),(3,5,22027,'Remove Insignia'),(3,5,22810,'Opening - No Text'),(3,5,45927,'Summon Friend'),(3,5,59224,'Mace Specialization'),(3,5,61437,'Opening'),(3,6,81,'Dodge'),(3,6,196,'One-Handed Axes'),(3,6,197,'Two-Handed Axes'),(3,6,200,'Polearms'),(3,6,201,'One-Handed Swords'),(3,6,202,'Two-Handed Swords'),(3,6,203,'Unarmed'),(3,6,204,'Defense'),(3,6,522,'SPELLDEFENSE (DND)'),(3,6,668,'Language Common'),(3,6,672,'Language Dwarven'),(3,6,674,'Dual Wield'),(3,6,750,'Plate Mail'),(3,6,1843,'Disarm'),(3,6,2382,'Generic'),(3,6,2479,'Honorless Target'),(3,6,2481,'Find Treasure'),(3,6,3050,'Detect'),(3,6,3127,'Parry'),(3,6,3275,'Linen Bandage'),(3,6,3276,'Heavy Linen Bandage'),(3,6,3277,'Wool Bandage'),(3,6,3278,'Heavy Wool Bandage'),(3,6,3365,'Opening'),(3,6,6233,'Closing'),(3,6,6246,'Closing'),(3,6,6247,'Opening'),(3,6,6477,'Opening'),(3,6,6478,'Opening'),(3,6,6603,'Attack'),(3,6,7266,'Duel'),(3,6,7267,'Grovel'),(3,6,7355,'Stuck'),(3,6,7928,'Silk Bandage'),(3,6,7929,'Heavy Silk Bandage'),(3,6,7934,'Anti-Venom'),(3,6,8386,'Attacking'),(3,6,8737,'Mail'),(3,6,9077,'Leather'),(3,6,9078,'Cloth'),(3,6,9125,'Generic'),(3,6,10840,'Mageweave Bandage'),(3,6,10841,'Heavy Mageweave Bandage'),(3,6,10846,'First Aid'),(3,6,18629,'Runecloth Bandage'),(3,6,18630,'Heavy Runecloth Bandage'),(3,6,20594,'Stoneform'),(3,6,20595,'Gun Specialization'),(3,6,20596,'Frost Resistance'),(3,6,21651,'Opening'),(3,6,21652,'Closing'),(3,6,22027,'Remove Insignia'),(3,6,22810,'Opening - No Text'),(3,6,33391,'Journeyman Riding'),(3,6,45462,'Plague Strike'),(3,6,45477,'Icy Touch'),(3,6,45902,'Blood Strike'),(3,6,45903,'Offensive State (DND)'),(3,6,45927,'Summon Friend'),(3,6,47541,'Death Coil'),(3,6,48266,'Blood Presence'),(3,6,49410,'Forceful Deflection'),(3,6,49576,'Death Grip'),(3,6,52665,'Sigil'),(3,6,59224,'Mace Specialization'),(3,6,59879,'Blood Plague'),(3,6,59921,'Frost Fever'),(3,6,61437,'Opening'),(3,6,61455,'Runic Focus'),(4,1,78,'Heroic Strike'),(4,1,81,'Dodge'),(4,1,107,'Block'),(4,1,198,'One-Handed Maces'),(4,1,201,'One-Handed Swords'),(4,1,203,'Unarmed'),(4,1,204,'Defense'),(4,1,522,'SPELLDEFENSE (DND)'),(4,1,668,'Language Common'),(4,1,671,'Language Darnassian'),(4,1,1180,'Daggers'),(4,1,1843,'Disarm'),(4,1,2382,'Generic'),(4,1,2457,'Battle Stance'),(4,1,2479,'Honorless Target'),(4,1,3050,'Detect'),(4,1,3365,'Opening'),(4,1,5301,'Defensive State (DND)'),(4,1,6233,'Closing'),(4,1,6246,'Closing'),(4,1,6247,'Opening'),(4,1,6477,'Opening'),(4,1,6478,'Opening'),(4,1,6603,'Attack'),(4,1,7266,'Duel'),(4,1,7267,'Grovel'),(4,1,7355,'Stuck'),(4,1,8386,'Attacking'),(4,1,8737,'Mail'),(4,1,9077,'Leather'),(4,1,9078,'Cloth'),(4,1,9116,'Shield'),(4,1,9125,'Generic'),(4,1,20582,'Quickness'),(4,1,20583,'Nature Resistance'),(4,1,20585,'Wisp Spirit'),(4,1,21651,'Opening'),(4,1,21652,'Closing'),(4,1,22027,'Remove Insignia'),(4,1,22810,'Opening - No Text'),(4,1,32215,'Victorious State'),(4,1,45927,'Summon Friend'),(4,1,58984,'Shadowmelt'),(4,1,61437,'Opening'),(4,3,75,'Auto Shot'),(4,3,81,'Dodge'),(4,3,203,'Unarmed'),(4,3,204,'Defense'),(4,3,264,'Bows'),(4,3,522,'SPELLDEFENSE (DND)'),(4,3,668,'Language Common'),(4,3,671,'Language Darnassian'),(4,3,1180,'Daggers'),(4,3,1843,'Disarm'),(4,3,2382,'Generic'),(4,3,2479,'Honorless Target'),(4,3,2973,'Raptor Strike'),(4,3,3050,'Detect'),(4,3,3365,'Opening'),(4,3,6233,'Closing'),(4,3,6246,'Closing'),(4,3,6247,'Opening'),(4,3,6477,'Opening'),(4,3,6478,'Opening'),(4,3,6603,'Attack'),(4,3,7266,'Duel'),(4,3,7267,'Grovel'),(4,3,7355,'Stuck'),(4,3,8386,'Attacking'),(4,3,9077,'Leather'),(4,3,9078,'Cloth'),(4,3,9125,'Generic'),(4,3,13358,'Defensive State (DND)'),(4,3,20582,'Quickness'),(4,3,20583,'Nature Resistance'),(4,3,20585,'Wisp Spirit'),(4,3,21651,'Opening'),(4,3,21652,'Closing'),(4,3,22027,'Remove Insignia'),(4,3,22810,'Opening - No Text'),(4,3,24949,'Defensive State 2 (DND)'),(4,3,34082,'Advantaged State (DND)'),(4,3,45927,'Summon Friend'),(4,3,58984,'Shadowmelt'),(4,3,61437,'Opening'),(4,4,81,'Dodge'),(4,4,203,'Unarmed'),(4,4,204,'Defense'),(4,4,522,'SPELLDEFENSE (DND)'),(4,4,668,'Language Common'),(4,4,671,'Language Darnassian'),(4,4,1180,'Daggers'),(4,4,1752,'Sinister Strike'),(4,4,1843,'Disarm'),(4,4,2098,'Eviscerate'),(4,4,2382,'Generic'),(4,4,2479,'Honorless Target'),(4,4,2567,'Thrown'),(4,4,2764,'Throw'),(4,4,3050,'Detect'),(4,4,3365,'Opening'),(4,4,6233,'Closing'),(4,4,6246,'Closing'),(4,4,6247,'Opening'),(4,4,6477,'Opening'),(4,4,6478,'Opening'),(4,4,6603,'Attack'),(4,4,7266,'Duel'),(4,4,7267,'Grovel'),(4,4,7355,'Stuck'),(4,4,8386,'Attacking'),(4,4,9077,'Leather'),(4,4,9078,'Cloth'),(4,4,9125,'Generic'),(4,4,16092,'Defensive State (DND)'),(4,4,20582,'Quickness'),(4,4,20583,'Nature Resistance'),(4,4,20585,'Wisp Spirit'),(4,4,21184,'Rogue Passive (DND)'),(4,4,21651,'Opening'),(4,4,21652,'Closing'),(4,4,22027,'Remove Insignia'),(4,4,22810,'Opening - No Text'),(4,4,45927,'Summon Friend'),(4,4,58984,'Shadowmelt'),(4,4,61437,'Opening'),(4,5,81,'Dodge'),(4,5,198,'One-Handed Maces'),(4,5,203,'Unarmed'),(4,5,204,'Defense'),(4,5,522,'SPELLDEFENSE (DND)'),(4,5,585,'Smite'),(4,5,668,'Language Common'),(4,5,671,'Language Darnassian'),(4,5,1843,'Disarm'),(4,5,2050,'Lesser Heal'),(4,5,2382,'Generic'),(4,5,2479,'Honorless Target'),(4,5,3050,'Detect'),(4,5,3365,'Opening'),(4,5,5009,'Wands'),(4,5,5019,'Shoot'),(4,5,6233,'Closing'),(4,5,6246,'Closing'),(4,5,6247,'Opening'),(4,5,6477,'Opening'),(4,5,6478,'Opening'),(4,5,6603,'Attack'),(4,5,7266,'Duel'),(4,5,7267,'Grovel'),(4,5,7355,'Stuck'),(4,5,8386,'Attacking'),(4,5,9078,'Cloth'),(4,5,9125,'Generic'),(4,5,20582,'Quickness'),(4,5,20583,'Nature Resistance'),(4,5,20585,'Wisp Spirit'),(4,5,21651,'Opening'),(4,5,21652,'Closing'),(4,5,22027,'Remove Insignia'),(4,5,22810,'Opening - No Text'),(4,5,45927,'Summon Friend'),(4,5,58984,'Shadowmelt'),(4,5,61437,'Opening'),(4,6,81,'Dodge'),(4,6,196,'One-Handed Axes'),(4,6,197,'Two-Handed Axes'),(4,6,200,'Polearms'),(4,6,201,'One-Handed Swords'),(4,6,202,'Two-Handed Swords'),(4,6,203,'Unarmed'),(4,6,204,'Defense'),(4,6,522,'SPELLDEFENSE (DND)'),(4,6,668,'Language Common'),(4,6,671,'Language Darnassian'),(4,6,674,'Dual Wield'),(4,6,750,'Plate Mail'),(4,6,1843,'Disarm'),(4,6,2382,'Generic'),(4,6,2479,'Honorless Target'),(4,6,3050,'Detect'),(4,6,3127,'Parry'),(4,6,3275,'Linen Bandage'),(4,6,3276,'Heavy Linen Bandage'),(4,6,3277,'Wool Bandage'),(4,6,3278,'Heavy Wool Bandage'),(4,6,3365,'Opening'),(4,6,6233,'Closing'),(4,6,6246,'Closing'),(4,6,6247,'Opening'),(4,6,6477,'Opening'),(4,6,6478,'Opening'),(4,6,6603,'Attack'),(4,6,7266,'Duel'),(4,6,7267,'Grovel'),(4,6,7355,'Stuck'),(4,6,7928,'Silk Bandage'),(4,6,7929,'Heavy Silk Bandage'),(4,6,7934,'Anti-Venom'),(4,6,8386,'Attacking'),(4,6,8737,'Mail'),(4,6,9077,'Leather'),(4,6,9078,'Cloth'),(4,6,9125,'Generic'),(4,6,10840,'Mageweave Bandage'),(4,6,10841,'Heavy Mageweave Bandage'),(4,6,10846,'First Aid'),(4,6,18629,'Runecloth Bandage'),(4,6,18630,'Heavy Runecloth Bandage'),(4,6,20582,'Quickness'),(4,6,20583,'Nature Resistance'),(4,6,20585,'Wisp Spirit'),(4,6,21651,'Opening'),(4,6,21652,'Closing'),(4,6,22027,'Remove Insignia'),(4,6,22810,'Opening - No Text'),(4,6,33391,'Journeyman Riding'),(4,6,45462,'Plague Strike'),(4,6,45477,'Icy Touch'),(4,6,45902,'Blood Strike'),(4,6,45903,'Offensive State (DND)'),(4,6,45927,'Summon Friend'),(4,6,47541,'Death Coil'),(4,6,48266,'Blood Presence'),(4,6,49410,'Forceful Deflection'),(4,6,49576,'Death Grip'),(4,6,52665,'Sigil'),(4,6,58984,'Shadowmeld'),(4,6,59879,'Blood Plague'),(4,6,59921,'Frost Fever'),(4,6,61437,'Opening'),(4,6,61455,'Runic Focus'),(4,11,81,'Dodge'),(4,11,203,'Unarmed'),(4,11,204,'Defense'),(4,11,227,'Staves'),(4,11,522,'SPELLDEFENSE (DND)'),(4,11,668,'Language Common'),(4,11,671,'Language Darnassian'),(4,11,1180,'Daggers'),(4,11,1843,'Disarm'),(4,11,2382,'Generic'),(4,11,2479,'Honorless Target'),(4,11,3050,'Detect'),(4,11,3365,'Opening'),(4,11,5176,'Wrath'),(4,11,5185,'Healing Touch'),(4,11,6233,'Closing'),(4,11,6246,'Closing'),(4,11,6247,'Opening'),(4,11,6477,'Opening'),(4,11,6478,'Opening'),(4,11,6603,'Attack'),(4,11,7266,'Duel'),(4,11,7267,'Grovel'),(4,11,7355,'Stuck'),(4,11,8386,'Attacking'),(4,11,9077,'Leather'),(4,11,9078,'Cloth'),(4,11,9125,'Generic'),(4,11,20582,'Quickness'),(4,11,20583,'Nature Resistance'),(4,11,20585,'Wisp Spirit'),(4,11,21651,'Opening'),(4,11,21652,'Closing'),(4,11,22027,'Remove Insignia'),(4,11,22810,'Opening - No Text'),(4,11,27764,'Fetish'),(4,11,45927,'Summon Friend'),(4,11,58984,'Shadowmelt'),(4,11,61437,'Opening'),(5,1,78,'Heroic Strike'),(5,1,81,'Dodge'),(5,1,107,'Block'),(5,1,201,'One-Handed Swords'),(5,1,202,'Two-Handed Swords'),(5,1,203,'Unarmed'),(5,1,204,'Defense'),(5,1,522,'SPELLDEFENSE (DND)'),(5,1,669,'Language Orcish'),(5,1,1180,'Daggers'),(5,1,1843,'Disarm'),(5,1,2382,'Generic'),(5,1,2457,'Battle Stance'),(5,1,2479,'Honorless Target'),(5,1,3050,'Detect'),(5,1,3365,'Opening'),(5,1,5227,'Underwater Breathing'),(5,1,5301,'Defensive State (DND)'),(5,1,6233,'Closing'),(5,1,6246,'Closing'),(5,1,6247,'Opening'),(5,1,6477,'Opening'),(5,1,6478,'Opening'),(5,1,6603,'Attack'),(5,1,7266,'Duel'),(5,1,7267,'Grovel'),(5,1,7355,'Stuck'),(5,1,7744,'Will of the Forsaken'),(5,1,8386,'Attacking'),(5,1,8737,'Mail'),(5,1,9077,'Leather'),(5,1,9078,'Cloth'),(5,1,9116,'Shield'),(5,1,9125,'Generic'),(5,1,17737,'Language Gutterspeak'),(5,1,20577,'Cannibalize'),(5,1,20579,'Shadow Resistance'),(5,1,21651,'Opening'),(5,1,21652,'Closing'),(5,1,22027,'Remove Insignia'),(5,1,22810,'Opening - No Text'),(5,1,32215,'Victorious State'),(5,1,45927,'Summon Friend'),(5,1,61437,'Opening'),(5,4,81,'Dodge'),(5,4,203,'Unarmed'),(5,4,204,'Defense'),(5,4,522,'SPELLDEFENSE (DND)'),(5,4,669,'Language Orcish'),(5,4,1180,'Daggers'),(5,4,1752,'Sinister Strike'),(5,4,1843,'Disarm'),(5,4,2098,'Eviscerate'),(5,4,2382,'Generic'),(5,4,2479,'Honorless Target'),(5,4,2567,'Thrown'),(5,4,2764,'Throw'),(5,4,3050,'Detect'),(5,4,3365,'Opening'),(5,4,5227,'Underwater Breathing'),(5,4,6233,'Closing'),(5,4,6246,'Closing'),(5,4,6247,'Opening'),(5,4,6477,'Opening'),(5,4,6478,'Opening'),(5,4,6603,'Attack'),(5,4,7266,'Duel'),(5,4,7267,'Grovel'),(5,4,7355,'Stuck'),(5,4,7744,'Will of the Forsaken'),(5,4,8386,'Attacking'),(5,4,9077,'Leather'),(5,4,9078,'Cloth'),(5,4,9125,'Generic'),(5,4,16092,'Defensive State (DND)'),(5,4,17737,'Language Gutterspeak'),(5,4,20577,'Cannibalize'),(5,4,20579,'Shadow Resistance'),(5,4,21184,'Rogue Passive (DND)'),(5,4,21651,'Opening'),(5,4,21652,'Closing'),(5,4,22027,'Remove Insignia'),(5,4,22810,'Opening - No Text'),(5,4,45927,'Summon Friend'),(5,4,61437,'Opening'),(5,5,81,'Dodge'),(5,5,198,'One-Handed Maces'),(5,5,203,'Unarmed'),(5,5,204,'Defense'),(5,5,522,'SPELLDEFENSE (DND)'),(5,5,585,'Smite'),(5,5,669,'Language Orcish'),(5,5,1843,'Disarm'),(5,5,2050,'Lesser Heal'),(5,5,2382,'Generic'),(5,5,2479,'Honorless Target'),(5,5,3050,'Detect'),(5,5,3365,'Opening'),(5,5,5009,'Wands'),(5,5,5019,'Shoot'),(5,5,5227,'Underwater Breathing'),(5,5,6233,'Closing'),(5,5,6246,'Closing'),(5,5,6247,'Opening'),(5,5,6477,'Opening'),(5,5,6478,'Opening'),(5,5,6603,'Attack'),(5,5,7266,'Duel'),(5,5,7267,'Grovel'),(5,5,7355,'Stuck'),(5,5,7744,'Will of the Forsaken'),(5,5,8386,'Attacking'),(5,5,9078,'Cloth'),(5,5,9125,'Generic'),(5,5,17737,'Language Gutterspeak'),(5,5,20577,'Cannibalize'),(5,5,20579,'Shadow Resistance'),(5,5,21651,'Opening'),(5,5,21652,'Closing'),(5,5,22027,'Remove Insignia'),(5,5,22810,'Opening - No Text'),(5,5,45927,'Summon Friend'),(5,5,61437,'Opening'),(5,6,81,'Dodge'),(5,6,196,'One-Handed Axes'),(5,6,197,'Two-Handed Axes'),(5,6,200,'Polearms'),(5,6,201,'One-Handed Swords'),(5,6,202,'Two-Handed Swords'),(5,6,203,'Unarmed'),(5,6,204,'Defense'),(5,6,522,'SPELLDEFENSE (DND)'),(5,6,669,'Language Orcish'),(5,6,674,'Dual Wield'),(5,6,750,'Plate Mail'),(5,6,1843,'Disarm'),(5,6,2382,'Generic'),(5,6,2479,'Honorless Target'),(5,6,3050,'Detect'),(5,6,3127,'Parry'),(5,6,3275,'Linen Bandage'),(5,6,3276,'Heavy Linen Bandage'),(5,6,3277,'Wool Bandage'),(5,6,3278,'Heavy Wool Bandage'),(5,6,3365,'Opening'),(5,6,5227,'Underwater Breathing'),(5,6,6233,'Closing'),(5,6,6246,'Closing'),(5,6,6247,'Opening'),(5,6,6477,'Opening'),(5,6,6478,'Opening'),(5,6,6603,'Attack'),(5,6,7266,'Duel'),(5,6,7267,'Grovel'),(5,6,7355,'Stuck'),(5,6,7744,'Will of the Forsaken'),(5,6,7928,'Silk Bandage'),(5,6,7929,'Heavy Silk Bandage'),(5,6,7934,'Anti-Venom'),(5,6,8386,'Attacking'),(5,6,8737,'Mail'),(5,6,9077,'Leather'),(5,6,9078,'Cloth'),(5,6,9125,'Generic'),(5,6,10840,'Mageweave Bandage'),(5,6,10841,'Heavy Mageweave Bandage'),(5,6,10846,'First Aid'),(5,6,17737,'Language Gutterspeak'),(5,6,18629,'Runecloth Bandage'),(5,6,18630,'Heavy Runecloth Bandage'),(5,6,20577,'Cannibalize'),(5,6,20579,'Shadow Resistance'),(5,6,21651,'Opening'),(5,6,21652,'Closing'),(5,6,22027,'Remove Insignia'),(5,6,22810,'Opening - No Text'),(5,6,33391,'Journeyman Riding'),(5,6,45462,'Plague Strike'),(5,6,45477,'Icy Touch'),(5,6,45902,'Blood Strike'),(5,6,45903,'Offensive State (DND)'),(5,6,45927,'Summon Friend'),(5,6,47541,'Death Coil'),(5,6,48266,'Blood Presence'),(5,6,49410,'Forceful Deflection'),(5,6,49576,'Death Grip'),(5,6,52665,'Sigil'),(5,6,59879,'Blood Plague'),(5,6,59921,'Frost Fever'),(5,6,61437,'Opening'),(5,6,61455,'Runic Focus'),(5,8,81,'Dodge'),(5,8,133,'Fireball'),(5,8,168,'Frost Armor'),(5,8,203,'Unarmed'),(5,8,204,'Defense'),(5,8,227,'Staves'),(5,8,522,'SPELLDEFENSE (DND)'),(5,8,669,'Language Orcish'),(5,8,1843,'Disarm'),(5,8,2382,'Generic'),(5,8,2479,'Honorless Target'),(5,8,3050,'Detect'),(5,8,3365,'Opening'),(5,8,5009,'Wands'),(5,8,5019,'Shoot'),(5,8,5227,'Underwater Breathing'),(5,8,6233,'Closing'),(5,8,6246,'Closing'),(5,8,6247,'Opening'),(5,8,6477,'Opening'),(5,8,6478,'Opening'),(5,8,6603,'Attack'),(5,8,7266,'Duel'),(5,8,7267,'Grovel'),(5,8,7355,'Stuck'),(5,8,7744,'Will of the Forsaken'),(5,8,8386,'Attacking'),(5,8,9078,'Cloth'),(5,8,9125,'Generic'),(5,8,17737,'Language Gutterspeak'),(5,8,20577,'Cannibalize'),(5,8,20579,'Shadow Resistance'),(5,8,21651,'Opening'),(5,8,21652,'Closing'),(5,8,22027,'Remove Insignia'),(5,8,22810,'Opening - No Text'),(5,8,45927,'Summon Friend'),(5,8,61437,'Opening'),(5,9,81,'Dodge'),(5,9,203,'Unarmed'),(5,9,204,'Defense'),(5,9,522,'SPELLDEFENSE (DND)'),(5,9,669,'Language Orcish'),(5,9,686,'Shadow Bolt'),(5,9,687,'Demon Skin'),(5,9,1180,'Daggers'),(5,9,1843,'Disarm'),(5,9,2382,'Generic'),(5,9,2479,'Honorless Target'),(5,9,3050,'Detect'),(5,9,3365,'Opening'),(5,9,5009,'Wands'),(5,9,5019,'Shoot'),(5,9,5227,'Underwater Breathing'),(5,9,6233,'Closing'),(5,9,6246,'Closing'),(5,9,6247,'Opening'),(5,9,6477,'Opening'),(5,9,6478,'Opening'),(5,9,6603,'Attack'),(5,9,7266,'Duel'),(5,9,7267,'Grovel'),(5,9,7355,'Stuck'),(5,9,7744,'Will of the Forsaken'),(5,9,8386,'Attacking'),(5,9,9078,'Cloth'),(5,9,9125,'Generic'),(5,9,17737,'Language Gutterspeak'),(5,9,20577,'Cannibalize'),(5,9,20579,'Shadow Resistance'),(5,9,21651,'Opening'),(5,9,21652,'Closing'),(5,9,22027,'Remove Insignia'),(5,9,22810,'Opening - No Text'),(5,9,45927,'Summon Friend'),(1,9,58284,'Chaos Bolt Passive'),(5,9,61437,'Opening'),(6,1,78,'Heroic Strike'),(6,1,81,'Dodge'),(6,1,107,'Block'),(6,1,196,'One-Handed Axes'),(6,1,198,'One-Handed Maces'),(6,1,199,'Two-Handed Maces'),(6,1,203,'Unarmed'),(6,1,204,'Defense'),(6,1,522,'SPELLDEFENSE (DND)'),(6,1,669,'Language Orcish'),(6,1,670,'Language Taurahe'),(6,1,1843,'Disarm'),(6,1,2382,'Generic'),(6,1,2457,'Battle Stance'),(6,1,2479,'Honorless Target'),(6,1,3050,'Detect'),(6,1,3365,'Opening'),(6,1,5301,'Defensive State (DND)'),(6,1,6233,'Closing'),(6,1,6246,'Closing'),(6,1,6247,'Opening'),(6,1,6477,'Opening'),(6,1,6478,'Opening'),(6,1,6603,'Attack'),(6,1,7266,'Duel'),(6,1,7267,'Grovel'),(6,1,7355,'Stuck'),(6,1,8386,'Attacking'),(6,1,8737,'Mail'),(6,1,9077,'Leather'),(6,1,9078,'Cloth'),(6,1,9116,'Shield'),(6,1,9125,'Generic'),(6,1,20549,'War Stomp'),(6,1,20550,'Endurance'),(6,1,20551,'Nature Resistance'),(6,1,20552,'Cultivation'),(6,1,21651,'Opening'),(6,1,21652,'Closing'),(6,1,22027,'Remove Insignia'),(6,1,22810,'Opening - No Text'),(6,1,32215,'Victorious State'),(6,1,45927,'Summon Friend'),(6,1,61437,'Opening'),(6,3,75,'Auto Shot'),(6,3,81,'Dodge'),(6,3,196,'One-Handed Axes'),(6,3,203,'Unarmed'),(6,3,204,'Defense'),(6,3,266,'Guns'),(6,3,522,'SPELLDEFENSE (DND)'),(6,3,669,'Language Orcish'),(6,3,670,'Language Taurahe'),(6,3,1843,'Disarm'),(6,3,2382,'Generic'),(6,3,2479,'Honorless Target'),(6,3,2973,'Raptor Strike'),(6,3,3050,'Detect'),(6,3,3365,'Opening'),(6,3,6233,'Closing'),(6,3,6246,'Closing'),(6,3,6247,'Opening'),(6,3,6477,'Opening'),(6,3,6478,'Opening'),(6,3,6603,'Attack'),(6,3,7266,'Duel'),(6,3,7267,'Grovel'),(6,3,7355,'Stuck'),(6,3,8386,'Attacking'),(6,3,9077,'Leather'),(6,3,9078,'Cloth'),(6,3,9125,'Generic'),(6,3,13358,'Defensive State (DND)'),(6,3,20549,'War Stomp'),(6,3,20550,'Endurance'),(6,3,20551,'Nature Resistance'),(6,3,20552,'Cultivation'),(6,3,21651,'Opening'),(6,3,21652,'Closing'),(6,3,22027,'Remove Insignia'),(6,3,22810,'Opening - No Text'),(6,3,24949,'Defensive State 2 (DND)'),(6,3,34082,'Advantaged State (DND)'),(6,3,45927,'Summon Friend'),(6,3,61437,'Opening'),(6,6,81,'Dodge'),(6,6,196,'One-Handed Axes'),(6,6,197,'Two-Handed Axes'),(6,6,200,'Polearms'),(6,6,201,'One-Handed Swords'),(6,6,202,'Two-Handed Swords'),(6,6,203,'Unarmed'),(6,6,204,'Defense'),(6,6,522,'SPELLDEFENSE (DND)'),(6,6,669,'Language Orcish'),(6,6,670,'Language Taurahe'),(6,6,674,'Dual Wield'),(6,6,750,'Plate Mail'),(6,6,1843,'Disarm'),(6,6,2382,'Generic'),(6,6,2479,'Honorless Target'),(6,6,3050,'Detect'),(6,6,3127,'Parry'),(6,6,3275,'Linen Bandage'),(6,6,3276,'Heavy Linen Bandage'),(6,6,3277,'Wool Bandage'),(6,6,3278,'Heavy Wool Bandage'),(6,6,3365,'Opening'),(6,6,6233,'Closing'),(6,6,6246,'Closing'),(6,6,6247,'Opening'),(6,6,6477,'Opening'),(6,6,6478,'Opening'),(6,6,6603,'Attack'),(6,6,7266,'Duel'),(6,6,7267,'Grovel'),(6,6,7355,'Stuck'),(6,6,7928,'Silk Bandage'),(6,6,7929,'Heavy Silk Bandage'),(6,6,7934,'Anti-Venom'),(6,6,8386,'Attacking'),(6,6,8737,'Mail'),(6,6,9077,'Leather'),(6,6,9078,'Cloth'),(6,6,9125,'Generic'),(6,6,10840,'Mageweave Bandage'),(6,6,10841,'Heavy Mageweave Bandage'),(6,6,10846,'First Aid'),(6,6,18629,'Runecloth Bandage'),(6,6,18630,'Heavy Runecloth Bandage'),(6,6,20549,'War Stomp'),(6,6,20550,'Endurance'),(6,6,20551,'Nature Resistance'),(6,6,20552,'Cultivation'),(6,6,21651,'Opening'),(6,6,21652,'Closing'),(6,6,22027,'Remove Insignia'),(6,6,22810,'Opening - No Text'),(6,6,33391,'Journeyman Riding'),(6,6,45462,'Plague Strike'),(6,6,45477,'Icy Touch'),(6,6,45902,'Blood Strike'),(6,6,45903,'Offensive State (DND)'),(6,6,45927,'Summon Friend'),(6,6,47541,'Death Coil'),(6,6,48266,'Blood Presence'),(6,6,49410,'Forceful Deflection'),(6,6,49576,'Death Grip'),(6,6,52665,'Sigil'),(6,6,59879,'Blood Plague'),(6,6,59921,'Frost Fever'),(6,6,61437,'Opening'),(6,6,61455,'Runic Focus'),(6,7,81,'Dodge'),(6,7,107,'Block'),(6,7,198,'One-Handed Maces'),(6,7,203,'Unarmed'),(6,7,204,'Defense'),(6,7,227,'Staves'),(6,7,331,'Healing Wave'),(6,7,403,'Lightning Bolt'),(6,7,522,'SPELLDEFENSE (DND)'),(6,7,669,'Language Orcish'),(6,7,670,'Language Taurahe'),(6,7,1843,'Disarm'),(6,7,2382,'Generic'),(6,7,2479,'Honorless Target'),(6,7,3050,'Detect'),(6,7,3365,'Opening'),(6,7,6233,'Closing'),(6,7,6246,'Closing'),(6,7,6247,'Opening'),(6,7,6477,'Opening'),(6,7,6478,'Opening'),(6,7,6603,'Attack'),(6,7,7266,'Duel'),(6,7,7267,'Grovel'),(6,7,7355,'Stuck'),(6,7,8386,'Attacking'),(6,7,9077,'Leather'),(6,7,9078,'Cloth'),(6,7,9116,'Shield'),(6,7,9125,'Generic'),(6,7,20549,'War Stomp'),(6,7,20550,'Endurance'),(6,7,20551,'Nature Resistance'),(6,7,20552,'Cultivation'),(6,7,21651,'Opening'),(6,7,21652,'Closing'),(6,7,22027,'Remove Insignia'),(6,7,22810,'Opening - No Text'),(6,7,27763,'Totem'),(6,7,45927,'Summon Friend'),(6,7,61437,'Opening'),(6,11,81,'Dodge'),(6,11,198,'One-Handed Maces'),(6,11,203,'Unarmed'),(6,11,204,'Defense'),(6,11,227,'Staves'),(6,11,522,'SPELLDEFENSE (DND)'),(6,11,669,'Language Orcish'),(6,11,670,'Language Taurahe'),(6,11,1843,'Disarm'),(6,11,2382,'Generic'),(6,11,2479,'Honorless Target'),(6,11,3050,'Detect'),(6,11,3365,'Opening'),(6,11,5176,'Wrath'),(6,11,5185,'Healing Touch'),(6,11,6233,'Closing'),(6,11,6246,'Closing'),(6,11,6247,'Opening'),(6,11,6477,'Opening'),(6,11,6478,'Opening'),(6,11,6603,'Attack'),(6,11,7266,'Duel'),(6,11,7267,'Grovel'),(6,11,7355,'Stuck'),(6,11,8386,'Attacking'),(6,11,9077,'Leather'),(6,11,9078,'Cloth'),(6,11,9125,'Generic'),(6,11,20549,'War Stomp'),(6,11,20550,'Endurance'),(6,11,20551,'Nature Resistance'),(6,11,20552,'Cultivation'),(6,11,21651,'Opening'),(6,11,21652,'Closing'),(6,11,22027,'Remove Insignia'),(6,11,22810,'Opening - No Text'),(6,11,27764,'Fetish'),(6,11,45927,'Summon Friend'),(6,11,61437,'Opening'),(7,1,78,'Heroic Strike'),(7,1,81,'Dodge'),(7,1,107,'Block'),(7,1,198,'One-Handed Maces'),(7,1,201,'One-Handed Swords'),(7,1,203,'Unarmed'),(7,1,204,'Defense'),(7,1,522,'SPELLDEFENSE (DND)'),(7,1,668,'Language Common'),(7,1,1180,'Daggers'),(7,1,1843,'Disarm'),(7,1,2382,'Generic'),(7,1,2457,'Battle Stance'),(7,1,2479,'Honorless Target'),(7,1,3050,'Detect'),(7,1,3365,'Opening'),(7,1,5301,'Defensive State (DND)'),(7,1,6233,'Closing'),(7,1,6246,'Closing'),(7,1,6247,'Opening'),(7,1,6477,'Opening'),(7,1,6478,'Opening'),(7,1,6603,'Attack'),(7,1,7266,'Duel'),(7,1,7267,'Grovel'),(7,1,7340,'Language Gnomish'),(7,1,7355,'Stuck'),(7,1,8386,'Attacking'),(7,1,8737,'Mail'),(7,1,9077,'Leather'),(7,1,9078,'Cloth'),(7,1,9116,'Shield'),(7,1,9125,'Generic'),(7,1,20589,'Escape Artist'),(7,1,20591,'Expansive Mind'),(7,1,20592,'Arcane Resistance'),(7,1,20593,'Engineering Specialization'),(7,1,21651,'Opening'),(7,1,21652,'Closing'),(7,1,22027,'Remove Insignia'),(7,1,22810,'Opening - No Text'),(7,1,32215,'Victorious State'),(7,1,45927,'Summon Friend'),(7,1,61437,'Opening'),(7,4,81,'Dodge'),(7,4,203,'Unarmed'),(7,4,204,'Defense'),(7,4,522,'SPELLDEFENSE (DND)'),(7,4,668,'Language Common'),(7,4,1180,'Daggers'),(7,4,1752,'Sinister Strike'),(7,4,1843,'Disarm'),(7,4,2098,'Eviscerate'),(7,4,2382,'Generic'),(7,4,2479,'Honorless Target'),(7,4,2567,'Thrown'),(7,4,2764,'Throw'),(7,4,3050,'Detect'),(7,4,3365,'Opening'),(7,4,6233,'Closing'),(7,4,6246,'Closing'),(7,4,6247,'Opening'),(7,4,6477,'Opening'),(7,4,6478,'Opening'),(7,4,6603,'Attack'),(7,4,7266,'Duel'),(7,4,7267,'Grovel'),(7,4,7340,'Language Gnomish'),(7,4,7355,'Stuck'),(7,4,8386,'Attacking'),(7,4,9077,'Leather'),(7,4,9078,'Cloth'),(7,4,9125,'Generic'),(7,4,16092,'Defensive State (DND)'),(7,4,20589,'Escape Artist'),(7,4,20591,'Expansive Mind'),(7,4,20592,'Arcane Resistance'),(7,4,20593,'Engineering Specialization'),(7,4,21184,'Rogue Passive (DND)'),(7,4,21651,'Opening'),(7,4,21652,'Closing'),(7,4,22027,'Remove Insignia'),(7,4,22810,'Opening - No Text'),(7,4,45927,'Summon Friend'),(7,4,61437,'Opening'),(7,6,81,'Dodge'),(7,6,196,'One-Handed Axes'),(7,6,197,'Two-Handed Axes'),(7,6,200,'Polearms'),(7,6,201,'One-Handed Swords'),(7,6,202,'Two-Handed Swords'),(7,6,203,'Unarmed'),(7,6,204,'Defense'),(7,6,522,'SPELLDEFENSE (DND)'),(7,6,668,'Language Common'),(7,6,674,'Dual Wield'),(7,6,750,'Plate Mail'),(7,6,1843,'Disarm'),(7,6,2382,'Generic'),(7,6,2479,'Honorless Target'),(7,6,3050,'Detect'),(7,6,3127,'Parry'),(7,6,3275,'Linen Bandage'),(7,6,3276,'Heavy Linen Bandage'),(7,6,3277,'Wool Bandage'),(7,6,3278,'Heavy Wool Bandage'),(7,6,3365,'Opening'),(7,6,6233,'Closing'),(7,6,6246,'Closing'),(7,6,6247,'Opening'),(7,6,6477,'Opening'),(7,6,6478,'Opening'),(7,6,6603,'Attack'),(7,6,7266,'Duel'),(7,6,7267,'Grovel'),(7,6,7340,'Language Gnomish'),(7,6,7355,'Stuck'),(7,6,7928,'Silk Bandage'),(7,6,7929,'Heavy Silk Bandage'),(7,6,7934,'Anti-Venom'),(7,6,8386,'Attacking'),(7,6,8737,'Mail'),(7,6,9077,'Leather'),(7,6,9078,'Cloth'),(7,6,9125,'Generic'),(7,6,10840,'Mageweave Bandage'),(7,6,10841,'Heavy Mageweave Bandage'),(7,6,10846,'First Aid'),(7,6,18629,'Runecloth Bandage'),(7,6,18630,'Heavy Runecloth Bandage'),(7,6,20589,'Escape Artist'),(7,6,20591,'Expansive Mind'),(7,6,20592,'Arcane Resistance'),(7,6,20593,'Engineering Specialization'),(7,6,21651,'Opening'),(7,6,21652,'Closing'),(7,6,22027,'Remove Insignia'),(7,6,22810,'Opening - No Text'),(7,6,33391,'Journeyman Riding'),(7,6,45462,'Plague Strike'),(7,6,45477,'Icy Touch'),(7,6,45902,'Blood Strike'),(7,6,45903,'Offensive State (DND)'),(7,6,45927,'Summon Friend'),(7,6,47541,'Death Coil'),(7,6,48266,'Blood Presence'),(7,6,49410,'Forceful Deflection'),(7,6,49576,'Death Grip'),(7,6,52665,'Sigil'),(7,6,59879,'Blood Plague'),(7,6,59921,'Frost Fever'),(7,6,61437,'Opening'),(7,6,61455,'Runic Focus'),(7,8,81,'Dodge'),(7,8,133,'Fireball'),(7,8,168,'Frost Armor'),(7,8,203,'Unarmed'),(7,8,204,'Defense'),(7,8,227,'Staves'),(7,8,522,'SPELLDEFENSE (DND)'),(7,8,668,'Language Common'),(7,8,1843,'Disarm'),(7,8,2382,'Generic'),(7,8,2479,'Honorless Target'),(7,8,3050,'Detect'),(7,8,3365,'Opening'),(7,8,5009,'Wands'),(7,8,5019,'Shoot'),(7,8,6233,'Closing'),(7,8,6246,'Closing'),(7,8,6247,'Opening'),(7,8,6477,'Opening'),(7,8,6478,'Opening'),(7,8,6603,'Attack'),(7,8,7266,'Duel'),(7,8,7267,'Grovel'),(7,8,7340,'Language Gnomish'),(7,8,7355,'Stuck'),(7,8,8386,'Attacking'),(7,8,9078,'Cloth'),(7,8,9125,'Generic'),(7,8,20589,'Escape Artist'),(7,8,20591,'Expansive Mind'),(7,8,20592,'Arcane Resistance'),(7,8,20593,'Engineering Specialization'),(7,8,21651,'Opening'),(7,8,21652,'Closing'),(7,8,22027,'Remove Insignia'),(7,8,22810,'Opening - No Text'),(7,8,45927,'Summon Friend'),(7,8,61437,'Opening'),(7,9,81,'Dodge'),(7,9,203,'Unarmed'),(7,9,204,'Defense'),(7,9,522,'SPELLDEFENSE (DND)'),(7,9,668,'Language Common'),(7,9,686,'Shadow Bolt'),(7,9,687,'Demon Skin'),(7,9,1180,'Daggers'),(7,9,1843,'Disarm'),(7,9,2382,'Generic'),(7,9,2479,'Honorless Target'),(7,9,3050,'Detect'),(7,9,3365,'Opening'),(7,9,5009,'Wands'),(7,9,5019,'Shoot'),(7,9,6233,'Closing'),(7,9,6246,'Closing'),(7,9,6247,'Opening'),(7,9,6477,'Opening'),(7,9,6478,'Opening'),(7,9,6603,'Attack'),(7,9,7266,'Duel'),(7,9,7267,'Grovel'),(7,9,7340,'Language Gnomish'),(7,9,7355,'Stuck'),(7,9,8386,'Attacking'),(7,9,9078,'Cloth'),(7,9,9125,'Generic'),(7,9,20589,'Escape Artist'),(7,9,20591,'Expansive Mind'),(7,9,20592,'Arcane Resistance'),(7,9,20593,'Engineering Specialization'),(7,9,21651,'Opening'),(7,9,21652,'Closing'),(7,9,22027,'Remove Insignia'),(7,9,22810,'Opening - No Text'),(7,9,45927,'Summon Friend'),(7,9,61437,'Opening'),(8,1,78,'Heroic Strike'),(8,1,81,'Dodge'),(8,1,107,'Block'),(8,1,196,'One-Handed Axes'),(8,1,203,'Unarmed'),(8,1,204,'Defense'),(8,1,522,'SPELLDEFENSE (DND)'),(8,1,669,'Language Orcish'),(8,1,1180,'Daggers'),(8,1,1843,'Disarm'),(8,1,2382,'Generic'),(8,1,2457,'Battle Stance'),(8,1,2479,'Honorless Target'),(8,1,2567,'Thrown'),(8,1,2764,'Throw'),(8,1,3050,'Detect'),(8,1,3365,'Opening'),(8,1,5301,'Defensive State (DND)'),(8,1,6233,'Closing'),(8,1,6246,'Closing'),(8,1,6247,'Opening'),(8,1,6477,'Opening'),(8,1,6478,'Opening'),(8,1,6603,'Attack'),(8,1,7266,'Duel'),(8,1,7267,'Grovel'),(8,1,7341,'Language Troll'),(8,1,7355,'Stuck'),(8,1,8386,'Attacking'),(8,1,8737,'Mail'),(8,1,9077,'Leather'),(8,1,9078,'Cloth'),(8,1,9116,'Shield'),(8,1,9125,'Generic'),(8,1,20555,'Regeneration'),(8,1,20557,'Beast Slaying'),(8,1,20558,'Throwing Specialization'),(8,1,21651,'Opening'),(8,1,21652,'Closing'),(8,1,22027,'Remove Insignia'),(8,1,22810,'Opening - No Text'),(8,1,26290,'Bow Specialization'),(8,1,26297,'Berserking'),(8,1,32215,'Victorious State'),(8,1,45927,'Summon Friend'),(8,1,58943,'Da Voodoo Shuffle'),(8,1,61437,'Opening'),(8,3,75,'Auto Shot'),(8,3,81,'Dodge'),(8,3,196,'One-Handed Axes'),(8,3,203,'Unarmed'),(8,3,204,'Defense'),(8,3,264,'Bows'),(8,3,522,'SPELLDEFENSE (DND)'),(8,3,669,'Language Orcish'),(8,3,1843,'Disarm'),(8,3,2382,'Generic'),(8,3,2479,'Honorless Target'),(8,3,2973,'Raptor Strike'),(8,3,3050,'Detect'),(8,3,3365,'Opening'),(8,3,6233,'Closing'),(8,3,6246,'Closing'),(8,3,6247,'Opening'),(8,3,6477,'Opening'),(8,3,6478,'Opening'),(8,3,6603,'Attack'),(8,3,7266,'Duel'),(8,3,7267,'Grovel'),(8,3,7341,'Language Troll'),(8,3,7355,'Stuck'),(8,3,8386,'Attacking'),(8,3,9077,'Leather'),(8,3,9078,'Cloth'),(8,3,9125,'Generic'),(8,3,13358,'Defensive State (DND)'),(8,3,26297,'Berserking'),(8,3,20555,'Regeneration'),(8,3,20557,'Beast Slaying'),(8,3,20558,'Throwing Specialization'),(8,3,21651,'Opening'),(8,3,21652,'Closing'),(8,3,22027,'Remove Insignia'),(8,3,22810,'Opening - No Text'),(8,3,24949,'Defensive State 2 (DND)'),(8,3,26290,'Bow Specialization'),(8,3,34082,'Advantaged State (DND)'),(8,3,45927,'Summon Friend'),(8,3,58943,'Da Voodoo Shuffle'),(8,3,61437,'Opening'),(8,4,81,'Dodge'),(8,4,203,'Unarmed'),(8,4,204,'Defense'),(8,4,522,'SPELLDEFENSE (DND)'),(8,4,669,'Language Orcish'),(8,4,1180,'Daggers'),(8,4,1752,'Sinister Strike'),(8,4,1843,'Disarm'),(8,4,2098,'Eviscerate'),(8,4,2382,'Generic'),(8,4,2479,'Honorless Target'),(8,4,2567,'Thrown'),(8,4,2764,'Throw'),(8,4,3050,'Detect'),(8,4,3365,'Opening'),(8,4,6233,'Closing'),(8,4,6246,'Closing'),(8,4,6247,'Opening'),(8,4,6477,'Opening'),(8,4,6478,'Opening'),(8,4,6603,'Attack'),(8,4,7266,'Duel'),(8,4,7267,'Grovel'),(8,4,7341,'Language Troll'),(8,4,7355,'Stuck'),(8,4,8386,'Attacking'),(8,4,9077,'Leather'),(8,4,9078,'Cloth'),(8,4,9125,'Generic'),(8,4,16092,'Defensive State (DND)'),(8,4,20555,'Regeneration'),(8,4,20557,'Beast Slaying'),(8,4,20558,'Throwing Specialization'),(8,4,21184,'Rogue Passive (DND)'),(8,4,21651,'Opening'),(8,4,21652,'Closing'),(8,4,22027,'Remove Insignia'),(8,4,22810,'Opening - No Text'),(8,4,26290,'Bow Specialization'),(8,4,26297,'Berserking'),(8,4,45927,'Summon Friend'),(8,4,58943,'Da Voodoo Shuffle'),(8,4,61437,'Opening'),(8,5,81,'Dodge'),(8,5,198,'One-Handed Maces'),(8,5,203,'Unarmed'),(8,5,204,'Defense'),(8,5,522,'SPELLDEFENSE (DND)'),(8,5,585,'Smite'),(8,5,669,'Language Orcish'),(8,5,1843,'Disarm'),(8,5,2050,'Lesser Heal'),(8,5,2382,'Generic'),(8,5,2479,'Honorless Target'),(8,5,3050,'Detect'),(8,5,3365,'Opening'),(8,5,5009,'Wands'),(8,5,5019,'Shoot'),(8,5,6233,'Closing'),(8,5,6246,'Closing'),(8,5,6247,'Opening'),(8,5,6477,'Opening'),(8,5,6478,'Opening'),(8,5,6603,'Attack'),(8,5,7266,'Duel'),(8,5,7267,'Grovel'),(8,5,7341,'Language Troll'),(8,5,7355,'Stuck'),(8,5,8386,'Attacking'),(8,5,9078,'Cloth'),(8,5,9125,'Generic'),(8,5,26297,'Berserking'),(8,5,20555,'Regeneration'),(8,5,20557,'Beast Slaying'),(8,5,20558,'Throwing Specialization'),(8,5,21651,'Opening'),(8,5,21652,'Closing'),(8,5,22027,'Remove Insignia'),(8,5,22810,'Opening - No Text'),(8,5,26290,'Bow Specialization'),(8,5,45927,'Summon Friend'),(8,5,58943,'Da Voodoo Shuffle'),(8,5,61437,'Opening'),(8,6,81,'Dodge'),(8,6,196,'One-Handed Axes'),(8,6,197,'Two-Handed Axes'),(8,6,200,'Polearms'),(8,6,201,'One-Handed Swords'),(8,6,202,'Two-Handed Swords'),(8,6,203,'Unarmed'),(8,6,204,'Defense'),(8,6,522,'SPELLDEFENSE (DND)'),(8,6,669,'Language Orcish'),(8,6,674,'Dual Wield'),(8,6,750,'Plate Mail'),(8,6,1843,'Disarm'),(8,6,2382,'Generic'),(8,6,2479,'Honorless Target'),(8,6,3050,'Detect'),(8,6,3127,'Parry'),(8,6,3275,'Linen Bandage'),(8,6,3276,'Heavy Linen Bandage'),(8,6,3277,'Wool Bandage'),(8,6,3278,'Heavy Wool Bandage'),(8,6,3365,'Opening'),(8,6,6233,'Closing'),(8,6,6246,'Closing'),(8,6,6247,'Opening'),(8,6,6477,'Opening'),(8,6,6478,'Opening'),(8,6,6603,'Attack'),(8,6,7266,'Duel'),(8,6,7267,'Grovel'),(8,6,7341,'Language Troll'),(8,6,7355,'Stuck'),(8,6,7928,'Silk Bandage'),(8,6,7929,'Heavy Silk Bandage'),(8,6,7934,'Anti-Venom'),(8,6,8386,'Attacking'),(8,6,8737,'Mail'),(8,6,9077,'Leather'),(8,6,9078,'Cloth'),(8,6,9125,'Generic'),(8,6,10840,'Mageweave Bandage'),(8,6,10841,'Heavy Mageweave Bandage'),(8,6,10846,'First Aid'),(8,6,18629,'Runecloth Bandage'),(8,6,18630,'Heavy Runecloth Bandage'),(8,6,20555,'Regeneration'),(8,6,20557,'Beast Slaying'),(8,6,20558,'Throwing Specialization'),(8,6,21651,'Opening'),(8,6,21652,'Closing'),(8,6,22027,'Remove Insignia'),(8,6,22810,'Opening - No Text'),(8,6,26290,'Bow Specialization'),(8,6,33391,'Journeyman Riding'),(8,6,45462,'Plague Strike'),(8,6,45477,'Icy Touch'),(8,6,45902,'Blood Strike'),(8,6,45903,'Offensive State (DND)'),(8,6,45927,'Summon Friend'),(8,6,47541,'Death Coil'),(8,6,48266,'Blood Presence'),(8,6,49410,'Forceful Deflection'),(8,6,49576,'Death Grip'),(8,6,26297,'Berserking'),(8,6,52665,'Sigil'),(8,6,58943,'Da Voodoo Shuffle'),(8,6,59879,'Blood Plague'),(8,6,59921,'Frost Fever'),(8,6,61437,'Opening'),(8,6,61455,'Runic Focus'),(8,7,81,'Dodge'),(8,7,107,'Block'),(8,7,198,'One-Handed Maces'),(8,7,203,'Unarmed'),(8,7,204,'Defense'),(8,7,227,'Staves'),(8,7,331,'Healing Wave'),(8,7,403,'Lightning Bolt'),(8,7,522,'SPELLDEFENSE (DND)'),(8,7,669,'Language Orcish'),(8,7,1843,'Disarm'),(8,7,2382,'Generic'),(8,7,2479,'Honorless Target'),(8,7,3050,'Detect'),(8,7,3365,'Opening'),(8,7,6233,'Closing'),(8,7,6246,'Closing'),(8,7,6247,'Opening'),(8,7,6477,'Opening'),(8,7,6478,'Opening'),(8,7,6603,'Attack'),(8,7,7266,'Duel'),(8,7,7267,'Grovel'),(8,7,7341,'Language Troll'),(8,7,7355,'Stuck'),(8,7,8386,'Attacking'),(8,7,9077,'Leather'),(8,7,9078,'Cloth'),(8,7,9116,'Shield'),(8,7,9125,'Generic'),(8,7,26297,'Berserking'),(8,7,20555,'Regeneration'),(8,7,20557,'Beast Slaying'),(8,7,20558,'Throwing Specialization'),(8,7,21651,'Opening'),(8,7,21652,'Closing'),(8,7,22027,'Remove Insignia'),(8,7,22810,'Opening - No Text'),(8,7,26290,'Bow Specialization'),(8,7,27763,'Totem'),(8,7,45927,'Summon Friend'),(8,7,58943,'Da Voodoo Shuffle'),(8,7,61437,'Opening'),(8,8,81,'Dodge'),(8,8,133,'Fireball'),(8,8,168,'Frost Armor'),(8,8,203,'Unarmed'),(8,8,204,'Defense'),(8,8,227,'Staves'),(8,8,522,'SPELLDEFENSE (DND)'),(8,8,669,'Language Orcish'),(8,8,1843,'Disarm'),(8,8,2382,'Generic'),(8,8,2479,'Honorless Target'),(8,8,3050,'Detect'),(8,8,3365,'Opening'),(8,8,5009,'Wands'),(8,8,5019,'Shoot'),(8,8,6233,'Closing'),(8,8,6246,'Closing'),(8,8,6247,'Opening'),(8,8,6477,'Opening'),(8,8,6478,'Opening'),(8,8,6603,'Attack'),(8,8,7266,'Duel'),(8,8,7267,'Grovel'),(8,8,7341,'Language Troll'),(8,8,7355,'Stuck'),(8,8,8386,'Attacking'),(8,8,9078,'Cloth'),(8,8,9125,'Generic'),(8,8,26297,'Berserking'),(8,8,20555,'Regeneration'),(8,8,20557,'Beast Slaying'),(8,8,20558,'Throwing Specialization'),(8,8,21651,'Opening'),(8,8,21652,'Closing'),(8,8,22027,'Remove Insignia'),(8,8,22810,'Opening - No Text'),(8,8,26290,'Bow Specialization'),(8,8,45927,'Summon Friend'),(8,8,58943,'Da Voodoo Shuffle'),(8,8,61437,'Opening'),(10,2,81,'Dodge'),(10,2,107,'Block'),(10,2,201,'One-Handed Swords'),(10,2,202,'Two-Handed Swords'),(10,2,203,'Unarmed'),(10,2,204,'Defense'),(10,2,522,'SPELLDEFENSE (DND)'),(10,2,635,'Holy Light'),(10,2,669,'Language Orcish'),(10,2,813,'Language Thalassian'),(10,2,822,'Magic Resistance'),(10,2,2382,'Generic'),(10,2,2479,'Honorless Target'),(10,2,3050,'Detect'),(10,2,3365,'Opening'),(10,2,6233,'Closing'),(10,2,6246,'Closing'),(10,2,6247,'Opening'),(10,2,6477,'Opening'),(10,2,6478,'Opening'),(10,2,6603,'Attack'),(10,2,7266,'Duel'),(10,2,7267,'Grovel'),(10,2,7355,'Stuck'),(10,2,8386,'Attacking'),(10,2,8737,'Mail'),(10,2,9077,'Leather'),(10,2,9078,'Cloth'),(10,2,9116,'Shield'),(10,2,9125,'Generic'),(10,2,21084,'Seal of Righteousness'),(10,2,21651,'Opening'),(10,2,21652,'Closing'),(10,2,22027,'Remove Insignia'),(10,2,22810,'Opening - No Text'),(10,2,27762,'Libram'),(10,2,28730,'Arcane Torrent'),(10,2,28877,'Arcane Affinity'),(10,3,75,'Auto Shot'),(10,3,81,'Dodge'),(10,3,203,'Unarmed'),(10,3,204,'Defense'),(10,3,264,'Bows'),(10,3,522,'SPELLDEFENSE (DND)'),(10,3,669,'Language Orcish'),(10,3,813,'Language Thalassian'),(10,3,822,'Magic Resistance'),(10,3,1180,'Daggers'),(10,3,2382,'Generic'),(10,3,2479,'Honorless Target'),(10,3,2973,'Raptor Strike'),(10,3,3050,'Detect'),(10,3,3365,'Opening'),(10,3,6233,'Closing'),(10,3,6246,'Closing'),(10,3,6247,'Opening'),(10,3,6477,'Opening'),(10,3,6478,'Opening'),(10,3,6603,'Attack'),(10,3,7266,'Duel'),(10,3,7267,'Grovel'),(10,3,7355,'Stuck'),(10,3,8386,'Attacking'),(10,3,9077,'Leather'),(10,3,9078,'Cloth'),(10,3,9125,'Generic'),(10,3,13358,'Defensive State (DND)'),(10,3,21651,'Opening'),(10,3,21652,'Closing'),(10,3,22027,'Remove Insignia'),(10,3,22810,'Opening - No Text'),(10,3,24949,'Defensive State 2 (DND)'),(10,3,28730,'Arcane Torrent'),(10,3,28877,'Arcane Affinity'),(10,3,34082,'Advantaged State (DND)'),(10,4,81,'Dodge'),(10,4,203,'Unarmed'),(10,4,204,'Defense'),(10,4,522,'SPELLDEFENSE (DND)'),(10,4,669,'Language Orcish'),(10,4,813,'Language Thalassian'),(10,4,822,'Magic Resistance'),(10,4,1180,'Daggers'),(10,4,1752,'Sinister Strike'),(10,4,2098,'Eviscerate'),(10,4,2382,'Generic'),(10,4,2479,'Honorless Target'),(10,4,2567,'Thrown'),(10,4,2764,'Throw'),(10,4,3050,'Detect'),(10,4,3365,'Opening'),(10,4,6233,'Closing'),(10,4,6246,'Closing'),(10,4,6247,'Opening'),(10,4,6477,'Opening'),(10,4,6478,'Opening'),(10,4,6603,'Attack'),(10,4,7266,'Duel'),(10,4,7267,'Grovel'),(10,4,7355,'Stuck'),(10,4,8386,'Attacking'),(10,4,9077,'Leather'),(10,4,9078,'Cloth'),(10,4,9125,'Generic'),(10,4,16092,'Defensive State (DND)'),(10,4,21184,'Rogue Passive (DND)'),(10,4,21651,'Opening'),(10,4,21652,'Closing'),(10,4,22027,'Remove Insignia'),(10,4,22810,'Opening - No Text'),(10,4,25046,'Arcane Torrent'),(10,4,28877,'Arcane Affinity'),(10,5,81,'Dodge'),(10,5,198,'One-Handed Maces'),(10,5,203,'Unarmed'),(10,5,204,'Defense'),(10,5,522,'SPELLDEFENSE (DND)'),(10,5,585,'Smite'),(10,5,669,'Language Orcish'),(10,5,813,'Language Thalassian'),(10,5,822,'Magic Resistance'),(10,5,2050,'Lesser Heal'),(10,5,2382,'Generic'),(10,5,2479,'Honorless Target'),(10,5,3050,'Detect'),(10,5,3365,'Opening'),(10,5,5009,'Wands'),(10,5,5019,'Shoot'),(10,5,6233,'Closing'),(10,5,6246,'Closing'),(10,5,6247,'Opening'),(10,5,6477,'Opening'),(10,5,6478,'Opening'),(10,5,6603,'Attack'),(10,5,7266,'Duel'),(10,5,7267,'Grovel'),(10,5,7355,'Stuck'),(10,5,8386,'Attacking'),(10,5,9078,'Cloth'),(10,5,9125,'Generic'),(10,5,21651,'Opening'),(10,5,21652,'Closing'),(10,5,22027,'Remove Insignia'),(10,5,22810,'Opening - No Text'),(10,5,28730,'Arcane Torrent'),(10,5,28877,'Arcane Affinity'),(10,6,81,'Dodge'),(10,6,196,'One-Handed Axes'),(10,6,197,'Two-Handed Axes'),(10,6,200,'Polearms'),(10,6,201,'One-Handed Swords'),(10,6,202,'Two-Handed Swords'),(10,6,203,'Unarmed'),(10,6,204,'Defense'),(10,6,522,'SPELLDEFENSE (DND)'),(10,6,669,'Language Orcish'),(10,6,674,'Dual Wield'),(10,6,750,'Plate Mail'),(10,6,813,'Language Thalassian'),(10,6,822,'Magic Resistance'),(10,6,1843,'Disarm'),(10,6,2382,'Generic'),(10,6,2479,'Honorless Target'),(10,6,3050,'Detect'),(10,6,3127,'Parry'),(10,6,3275,'Linen Bandage'),(10,6,3276,'Heavy Linen Bandage'),(10,6,3277,'Wool Bandage'),(10,6,3278,'Heavy Wool Bandage'),(10,6,3365,'Opening'),(10,6,6233,'Closing'),(10,6,6246,'Closing'),(10,6,6247,'Opening'),(10,6,6477,'Opening'),(10,6,6478,'Opening'),(10,6,6603,'Attack'),(10,6,7266,'Duel'),(10,6,7267,'Grovel'),(10,6,7355,'Stuck'),(10,6,7928,'Silk Bandage'),(10,6,7929,'Heavy Silk Bandage'),(10,6,7934,'Anti-Venom'),(10,6,8386,'Attacking'),(10,6,8737,'Mail'),(10,6,9077,'Leather'),(10,6,9078,'Cloth'),(10,6,9125,'Generic'),(10,6,10840,'Mageweave Bandage'),(10,6,10841,'Heavy Mageweave Bandage'),(10,6,10846,'First Aid'),(10,6,18629,'Runecloth Bandage'),(10,6,18630,'Heavy Runecloth Bandage'),(10,6,21651,'Opening'),(10,6,21652,'Closing'),(10,6,22027,'Remove Insignia'),(10,6,22810,'Opening - No Text'),(10,6,28877,'Arcane Affinity'),(10,6,33391,'Journeyman Riding'),(10,6,45462,'Plague Strike'),(10,6,45477,'Icy Touch'),(10,6,45902,'Blood Strike'),(10,6,45903,'Offensive State (DND)'),(10,6,45927,'Summon Friend'),(10,6,47541,'Death Coil'),(10,6,48266,'Blood Presence'),(10,6,49410,'Forceful Deflection'),(10,6,49576,'Death Grip'),(10,6,50613,'Arcane Torrent'),(10,6,52665,'Sigil'),(10,6,59879,'Blood Plague'),(10,6,59921,'Frost Fever'),(10,6,61437,'Opening'),(10,6,61455,'Runic Focus'),(10,8,81,'Dodge'),(10,8,133,'Fireball'),(10,8,168,'Frost Armor'),(10,8,203,'Unarmed'),(10,8,204,'Defense'),(10,8,227,'Staves'),(10,8,522,'SPELLDEFENSE (DND)'),(10,8,669,'Language Orcish'),(10,8,813,'Language Thalassian'),(10,8,822,'Magic Resistance'),(10,8,2382,'Generic'),(10,8,2479,'Honorless Target'),(10,8,3050,'Detect'),(10,8,3365,'Opening'),(10,8,5009,'Wands'),(10,8,5019,'Shoot'),(10,8,6233,'Closing'),(10,8,6246,'Closing'),(10,8,6247,'Opening'),(10,8,6477,'Opening'),(10,8,6478,'Opening'),(10,8,6603,'Attack'),(10,8,7266,'Duel'),(10,8,7267,'Grovel'),(10,8,7355,'Stuck'),(10,8,8386,'Attacking'),(10,8,9078,'Cloth'),(10,8,9125,'Generic'),(10,8,21651,'Opening'),(10,8,21652,'Closing'),(10,8,22027,'Remove Insignia'),(10,8,22810,'Opening - No Text'),(10,8,28730,'Arcane Torrent'),(10,8,28877,'Arcane Affinity'),(10,9,81,'Dodge'),(10,9,203,'Unarmed'),(10,9,204,'Defense'),(10,9,522,'SPELLDEFENSE (DND)'),(10,9,669,'Language Orcish'),(10,9,686,'Shadow Bolt'),(10,9,687,'Demon Skin'),(10,9,813,'Language Thalassian'),(10,9,822,'Magic Resistance'),(10,9,1180,'Daggers'),(10,9,2382,'Generic'),(10,9,2479,'Honorless Target'),(10,9,3050,'Detect'),(10,9,3365,'Opening'),(10,9,5009,'Wands'),(10,9,5019,'Shoot'),(10,9,6233,'Closing'),(10,9,6246,'Closing'),(10,9,6247,'Opening'),(10,9,6477,'Opening'),(10,9,6478,'Opening'),(10,9,6603,'Attack'),(10,9,7266,'Duel'),(10,9,7267,'Grovel'),(10,9,7355,'Stuck'),(10,9,8386,'Attacking'),(10,9,9078,'Cloth'),(10,9,9125,'Generic'),(10,9,21651,'Opening'),(10,9,21652,'Closing'),(10,9,22027,'Remove Insignia'),(10,9,22810,'Opening - No Text'),(10,9,28730,'Arcane Torrent'),(10,9,28877,'Arcane Affinity'),(11,1,78,'Heroic Strike'),(11,1,81,'Dodge'),(11,1,107,'Block'),(11,1,198,'One-Handed Maces'),(11,1,201,'One-Handed Swords'),(11,1,202,'Two-Handed Swords'),(11,1,203,'Unarmed'),(11,1,204,'Defense'),(11,1,522,'SPELLDEFENSE (DND)'),(11,1,668,'Language Common'),(11,1,1843,'Disarm'),(11,1,2382,'Generic'),(11,1,2457,'Battle Stance'),(11,1,2479,'Honorless Target'),(11,1,3050,'Detect'),(11,1,3365,'Opening'),(11,1,5301,'Defensive State (DND)'),(11,1,6233,'Closing'),(11,1,6246,'Closing'),(11,1,6247,'Opening'),(11,1,6477,'Opening'),(11,1,6478,'Opening'),(11,1,6562,'Heroic Presence'),(11,1,6603,'Attack'),(11,1,7266,'Duel'),(11,1,7267,'Grovel'),(11,1,7355,'Stuck'),(11,1,8386,'Attacking'),(11,1,8737,'Mail'),(11,1,9077,'Leather'),(11,1,9078,'Cloth'),(11,1,9116,'Shield'),(11,1,9125,'Generic'),(11,1,21651,'Opening'),(11,1,21652,'Closing'),(11,1,22027,'Remove Insignia'),(11,1,22810,'Opening - No Text'),(11,1,28875,'Gemcutting'),(11,1,28880,'Gift of the Naaru'),(11,1,29932,'Language Draenei'),(11,1,32215,'Victorious State'),(11,1,45927,'Summon Friend'),(11,1,59221,'Shadow Resistance'),(11,1,61437,'Opening'),(11,2,81,'Dodge'),(11,2,107,'Block'),(11,2,198,'One-Handed Maces'),(11,2,199,'Two-Handed Maces'),(11,2,203,'Unarmed'),(11,2,204,'Defense'),(11,2,522,'SPELLDEFENSE (DND)'),(11,2,635,'Holy Light'),(11,2,668,'Language Common'),(11,2,1843,'Disarm'),(11,2,2382,'Generic'),(11,2,2479,'Honorless Target'),(11,2,3050,'Detect'),(11,2,3365,'Opening'),(11,2,6233,'Closing'),(11,2,6246,'Closing'),(11,2,6247,'Opening'),(11,2,6477,'Opening'),(11,2,6478,'Opening'),(11,2,6562,'Heroic Presence'),(11,2,6603,'Attack'),(11,2,7266,'Duel'),(11,2,7267,'Grovel'),(11,2,7355,'Stuck'),(11,2,8386,'Attacking'),(11,2,8737,'Mail'),(11,2,9077,'Leather'),(11,2,9078,'Cloth'),(11,2,9116,'Shield'),(11,2,9125,'Generic'),(11,2,21084,'Seal of Righteousness'),(11,2,21651,'Opening'),(11,2,21652,'Closing'),(11,2,22027,'Remove Insignia'),(11,2,22810,'Opening - No Text'),(11,2,27762,'Libram'),(11,2,28875,'Gemcutting'),(11,2,29932,'Language Draenei'),(11,2,45927,'Summon Friend'),(11,2,59221,'Shadow Resistance'),(11,2,59542,'Gift of the Naaru'),(11,2,61437,'Opening'),(11,3,75,'Auto Shot'),(11,3,81,'Dodge'),(11,3,201,'One-Handed Swords'),(11,3,203,'Unarmed'),(11,3,204,'Defense'),(11,3,522,'SPELLDEFENSE (DND)'),(11,3,668,'Language Common'),(11,3,1843,'Disarm'),(11,3,2382,'Generic'),(11,3,2479,'Honorless Target'),(11,3,2973,'Raptor Strike'),(11,3,3050,'Detect'),(11,3,3365,'Opening'),(11,3,5011,'Crossbows'),(11,3,6233,'Closing'),(11,3,6246,'Closing'),(11,3,6247,'Opening'),(11,3,6477,'Opening'),(11,3,6478,'Opening'),(11,3,6562,'Heroic Presence'),(11,3,6603,'Attack'),(11,3,7266,'Duel'),(11,3,7267,'Grovel'),(11,3,7355,'Stuck'),(11,3,8386,'Attacking'),(11,3,9077,'Leather'),(11,3,9078,'Cloth'),(11,3,9125,'Generic'),(11,3,13358,'Defensive State (DND)'),(11,3,21651,'Opening'),(11,3,21652,'Closing'),(11,3,22027,'Remove Insignia'),(11,3,22810,'Opening - No Text'),(11,3,24949,'Defensive State 2 (DND)'),(11,3,28875,'Gemcutting'),(11,3,29932,'Language Draenei'),(11,3,34082,'Advantaged State (DND)'),(11,3,45927,'Summon Friend'),(11,3,59221,'Shadow Resistance'),(11,3,59543,'Gift of the Naaru'),(11,3,61437,'Opening'),(11,5,81,'Dodge'),(11,5,198,'One-Handed Maces'),(11,5,203,'Unarmed'),(11,5,204,'Defense'),(11,5,522,'SPELLDEFENSE (DND)'),(11,5,585,'Smite'),(11,5,668,'Language Common'),(11,5,1843,'Disarm'),(11,5,2050,'Lesser Heal'),(11,5,2382,'Generic'),(11,5,2479,'Honorless Target'),(11,5,3050,'Detect'),(11,5,3365,'Opening'),(11,5,5009,'Wands'),(11,5,5019,'Shoot'),(11,5,6233,'Closing'),(11,5,6246,'Closing'),(11,5,6247,'Opening'),(11,5,6477,'Opening'),(11,5,6478,'Opening'),(11,5,6603,'Attack'),(11,5,7266,'Duel'),(11,5,7267,'Grovel'),(11,5,7355,'Stuck'),(11,5,8386,'Attacking'),(11,5,9078,'Cloth'),(11,5,9125,'Generic'),(11,5,21651,'Opening'),(11,5,21652,'Closing'),(11,5,22027,'Remove Insignia'),(11,5,22810,'Opening - No Text'),(11,5,28875,'Gemcutting'),(11,5,28878,'Inspiring Presence'),(11,5,29932,'Language Draenei'),(11,5,45927,'Summon Friend'),(11,5,59221,'Shadow Resistance'),(11,5,59544,'Gift of the Naaru'),(11,5,61437,'Opening'),(11,6,81,'Dodge'),(11,6,196,'One-Handed Axes'),(11,6,197,'Two-Handed Axes'),(11,6,200,'Polearms'),(11,6,201,'One-Handed Swords'),(11,6,202,'Two-Handed Swords'),(11,6,203,'Unarmed'),(11,6,204,'Defense'),(11,6,522,'SPELLDEFENSE (DND)'),(11,6,668,'Language Common'),(11,6,674,'Dual Wield'),(11,6,750,'Plate Mail'),(11,6,1843,'Disarm'),(11,6,2382,'Generic'),(11,6,2479,'Honorless Target'),(11,6,3050,'Detect'),(11,6,3127,'Parry'),(11,6,3275,'Linen Bandage'),(11,6,3276,'Heavy Linen Bandage'),(11,6,3277,'Wool Bandage'),(11,6,3278,'Heavy Wool Bandage'),(11,6,3365,'Opening'),(11,6,6233,'Closing'),(11,6,6246,'Closing'),(11,6,6247,'Opening'),(11,6,6477,'Opening'),(11,6,6478,'Opening'),(11,6,6562,'Heroic Presence'),(11,6,6603,'Attack'),(11,6,7266,'Duel'),(11,6,7267,'Grovel'),(11,6,7355,'Stuck'),(11,6,7928,'Silk Bandage'),(11,6,7929,'Heavy Silk Bandage'),(11,6,7934,'Anti-Venom'),(11,6,8386,'Attacking'),(11,6,8737,'Mail'),(11,6,9077,'Leather'),(11,6,9078,'Cloth'),(11,6,9125,'Generic'),(11,6,10840,'Mageweave Bandage'),(11,6,10841,'Heavy Mageweave Bandage'),(11,6,10846,'First Aid'),(11,6,18629,'Runecloth Bandage'),(11,6,18630,'Heavy Runecloth Bandage'),(11,6,21651,'Opening'),(11,6,21652,'Closing'),(11,6,22027,'Remove Insignia'),(11,6,22810,'Opening - No Text'),(11,6,28875,'Gemcutting'),(11,6,29932,'Language Draenei'),(11,6,33391,'Journeyman Riding'),(11,6,45462,'Plague Strike'),(11,6,45477,'Icy Touch'),(11,6,45902,'Blood Strike'),(11,6,45903,'Offensive State (DND)'),(11,6,45927,'Summon Friend'),(11,6,47541,'Death Coil'),(11,6,48266,'Blood Presence'),(11,6,49410,'Forceful Deflection'),(11,6,49576,'Death Grip'),(11,6,52665,'Sigil'),(11,6,59221,'Shadow Resistance'),(11,6,59539,'Shadow Resistance'),(11,6,59545,'Gift of the Naaru'),(11,6,59879,'Blood Plague'),(11,6,59921,'Frost Fever'),(11,6,61437,'Opening'),(11,6,61455,'Runic Focus'),(11,7,81,'Dodge'),(11,7,107,'Block'),(11,7,198,'One-Handed Maces'),(11,7,203,'Unarmed'),(11,7,204,'Defense'),(11,7,227,'Staves'),(11,7,331,'Healing Wave'),(11,7,403,'Lightning Bolt'),(11,7,522,'SPELLDEFENSE (DND)'),(11,7,668,'Language Common'),(11,7,1843,'Disarm'),(11,7,2382,'Generic'),(11,7,2479,'Honorless Target'),(11,7,3050,'Detect'),(11,7,3365,'Opening'),(11,7,6233,'Closing'),(11,7,6246,'Closing'),(11,7,6247,'Opening'),(11,7,6477,'Opening'),(11,7,6478,'Opening'),(11,7,6603,'Attack'),(11,7,7266,'Duel'),(11,7,7267,'Grovel'),(11,7,7355,'Stuck'),(11,7,8386,'Attacking'),(11,7,9077,'Leather'),(11,7,9078,'Cloth'),(11,7,9116,'Shield'),(11,7,9125,'Generic'),(11,7,21651,'Opening'),(11,7,21652,'Closing'),(11,7,22027,'Remove Insignia'),(11,7,22810,'Opening - No Text'),(11,7,27763,'Totem'),(11,7,28875,'Gemcutting'),(11,7,28878,'Inspiring Presence'),(11,7,29932,'Language Draenei'),(11,7,45927,'Summon Friend'),(11,7,59221,'Shadow Resistance'),(11,7,59547,'Gift of the Naaru'),(11,7,61437,'Opening'),(11,8,81,'Dodge'),(11,8,133,'Fireball'),(11,8,168,'Frost Armor'),(11,8,203,'Unarmed'),(11,8,204,'Defense'),(11,8,227,'Staves'),(11,8,522,'SPELLDEFENSE (DND)'),(11,8,668,'Language Common'),(11,8,1843,'Disarm'),(11,8,2382,'Generic'),(11,8,2479,'Honorless Target'),(11,8,3050,'Detect'),(11,8,3365,'Opening'),(11,8,5009,'Wands'),(11,8,5019,'Shoot'),(11,8,6233,'Closing'),(11,8,6246,'Closing'),(11,8,6247,'Opening'),(11,8,6477,'Opening'),(11,8,6478,'Opening'),(11,8,6603,'Attack'),(11,8,7266,'Duel'),(11,8,7267,'Grovel'),(11,8,7355,'Stuck'),(11,8,8386,'Attacking'),(11,8,9078,'Cloth'),(11,8,9125,'Generic'),(11,8,21651,'Opening'),(11,8,21652,'Closing'),(11,8,22027,'Remove Insignia'),(11,8,22810,'Opening - No Text'),(11,8,28875,'Gemcutting'),(11,8,28878,'Inspiring Presence'),(11,8,29932,'Language Draenei'),(11,8,45927,'Summon Friend'),(11,8,59221,'Shadow Resistance'),(11,8,59548,'Gift of the Naaru'),(11,8,61437,'Opening'),(7,9,58284,'Chaos Bolt Passive'),(10,9,58284,'Chaos Bolt Passive'),(11,2,60091,'Judgement Anti-Parry/Dodge Passive'),(10,2,60091,'Judgement Anti-Parry/Dodge Passive'),(3,2,60091,'Judgement Anti-Parry/Dodge Passive'),(1,2,60091,'Judgement Anti-Parry/Dodge Passive'),(0,6,56816,'Rune Strike'); +INSERT INTO `playercreateinfo_spell` VALUES (1,1,78,'Heroic Strike'),(1,1,81,'Dodge'),(1,1,107,'Block'),(1,1,196,'One-Handed Axes'),(1,1,198,'One-Handed Maces'),(1,1,201,'One-Handed Swords'),(1,1,203,'Unarmed'),(1,1,204,'Defense'),(1,1,522,'SPELLDEFENSE (DND)'),(1,1,668,'Language Common'),(1,1,1843,'Disarm'),(1,1,2382,'Generic'),(1,1,2457,'Battle Stance'),(1,1,2479,'Honorless Target'),(1,1,3050,'Detect'),(1,1,3365,'Opening'),(1,1,5301,'Defensive State (DND)'),(1,1,6233,'Closing'),(1,1,6246,'Closing'),(1,1,6247,'Opening'),(1,1,6477,'Opening'),(1,1,6478,'Opening'),(1,1,6603,'Attack'),(1,1,7266,'Duel'),(1,1,7267,'Grovel'),(1,1,7355,'Stuck'),(1,1,8386,'Attacking'),(1,1,8737,'Mail'),(1,1,9077,'Leather'),(1,1,9078,'Cloth'),(1,1,9116,'Shield'),(1,1,9125,'Generic'),(1,1,20597,'Sword Specialization'),(1,1,20598,'The Human Spirit'),(1,1,20599,'Diplomacy'),(1,1,20864,'Mace Specialization'),(1,1,21651,'Opening'),(1,1,21652,'Closing'),(1,1,22027,'Remove Insignia'),(1,1,22810,'Opening - No Text'),(1,1,32215,'Victorious State'),(1,1,45927,'Summon Friend'),(1,1,58985,'Perception'),(1,1,59752,'Every Man for Himself'),(1,1,61437,'Opening'),(1,2,81,'Dodge'),(1,2,107,'Block'),(1,2,198,'One-Handed Maces'),(1,2,199,'Two-Handed Maces'),(1,2,203,'Unarmed'),(1,2,204,'Defense'),(1,2,522,'SPELLDEFENSE (DND)'),(1,2,635,'Holy Light'),(1,2,668,'Language Common'),(1,2,1843,'Disarm'),(1,2,2382,'Generic'),(1,2,2479,'Honorless Target'),(1,2,3050,'Detect'),(1,2,3365,'Opening'),(1,2,6233,'Closing'),(1,2,6246,'Closing'),(1,2,6247,'Opening'),(1,2,6477,'Opening'),(1,2,6478,'Opening'),(1,2,6603,'Attack'),(1,2,7266,'Duel'),(1,2,7267,'Grovel'),(1,2,7355,'Stuck'),(1,2,8386,'Attacking'),(1,2,8737,'Mail'),(1,2,9077,'Leather'),(1,2,9078,'Cloth'),(1,2,9116,'Shield'),(1,2,9125,'Generic'),(1,2,21084,'Seal of Righteousness'),(1,2,20597,'Sword Specialization'),(1,2,20598,'The Human Spirit'),(1,2,20599,'Diplomacy'),(1,2,20864,'Mace Specialization'),(1,2,21651,'Opening'),(1,2,21652,'Closing'),(1,2,22027,'Remove Insignia'),(1,2,22810,'Opening - No Text'),(1,2,27762,'Libram'),(1,2,45927,'Summon Friend'),(1,2,58985,'Perception'),(1,2,59752,'Every Man for Himself'),(1,2,61437,'Opening'),(1,4,81,'Dodge'),(1,4,203,'Unarmed'),(1,4,204,'Defense'),(1,4,522,'SPELLDEFENSE (DND)'),(1,4,668,'Language Common'),(1,4,1180,'Daggers'),(1,4,1752,'Sinister Strike'),(1,4,1843,'Disarm'),(1,4,2098,'Eviscerate'),(1,4,2382,'Generic'),(1,4,2479,'Honorless Target'),(1,4,2567,'Thrown'),(1,4,2764,'Throw'),(1,4,3050,'Detect'),(1,4,3365,'Opening'),(1,4,6233,'Closing'),(1,4,6246,'Closing'),(1,4,6247,'Opening'),(1,4,6477,'Opening'),(1,4,6478,'Opening'),(1,4,6603,'Attack'),(1,4,7266,'Duel'),(1,4,7267,'Grovel'),(1,4,7355,'Stuck'),(1,4,8386,'Attacking'),(1,4,9077,'Leather'),(1,4,9078,'Cloth'),(1,4,9125,'Generic'),(1,4,16092,'Defensive State (DND)'),(1,4,20597,'Sword Specialization'),(1,4,20598,'The Human Spirit'),(1,4,20599,'Diplomacy'),(1,4,20864,'Mace Specialization'),(1,4,21184,'Rogue Passive (DND)'),(1,4,21651,'Opening'),(1,4,21652,'Closing'),(1,4,22027,'Remove Insignia'),(1,4,22810,'Opening - No Text'),(1,4,45927,'Summon Friend'),(1,4,58985,'Perception'),(1,4,59752,'Every Man for Himself'),(1,4,61437,'Opening'),(1,5,81,'Dodge'),(1,5,198,'One-Handed Maces'),(1,5,203,'Unarmed'),(1,5,204,'Defense'),(1,5,522,'SPELLDEFENSE (DND)'),(1,5,585,'Smite'),(1,5,668,'Language Common'),(1,5,1843,'Disarm'),(1,5,2050,'Lesser Heal'),(1,5,2382,'Generic'),(1,5,2479,'Honorless Target'),(1,5,3050,'Detect'),(1,5,3365,'Opening'),(1,5,5009,'Wands'),(1,5,5019,'Shoot'),(1,5,6233,'Closing'),(1,5,6246,'Closing'),(1,5,6247,'Opening'),(1,5,6477,'Opening'),(1,5,6478,'Opening'),(1,5,6603,'Attack'),(1,5,7266,'Duel'),(1,5,7267,'Grovel'),(1,5,7355,'Stuck'),(1,5,8386,'Attacking'),(1,5,9078,'Cloth'),(1,5,9125,'Generic'),(1,5,20597,'Sword Specialization'),(1,5,20598,'The Human Spirit'),(1,5,20599,'Diplomacy'),(1,5,20864,'Mace Specialization'),(1,5,21651,'Opening'),(1,5,21652,'Closing'),(1,5,22027,'Remove Insignia'),(1,5,22810,'Opening - No Text'),(1,5,45927,'Summon Friend'),(1,5,58985,'Perception'),(1,5,59752,'Every Man for Himself'),(1,5,61437,'Opening'),(1,6,81,'Dodge'),(1,6,196,'One-Handed Axes'),(1,6,197,'Two-Handed Axes'),(1,6,200,'Polearms'),(1,6,201,'One-Handed Swords'),(1,6,202,'Two-Handed Swords'),(1,6,203,'Unarmed'),(1,6,204,'Defense'),(1,6,522,'SPELLDEFENSE (DND)'),(1,6,668,'Language Common'),(1,6,674,'Dual Wield'),(1,6,750,'Plate Mail'),(1,6,1843,'Disarm'),(1,6,2382,'Generic'),(1,6,2479,'Honorless Target'),(1,6,3050,'Detect'),(1,6,3127,'Parry'),(1,6,3275,'Linen Bandage'),(1,6,3276,'Heavy Linen Bandage'),(1,6,3277,'Wool Bandage'),(1,6,3278,'Heavy Wool Bandage'),(1,6,3365,'Opening'),(1,6,6233,'Closing'),(1,6,6246,'Closing'),(1,6,6247,'Opening'),(1,6,6477,'Opening'),(1,6,6478,'Opening'),(1,6,6603,'Attack'),(1,6,7266,'Duel'),(1,6,7267,'Grovel'),(1,6,7355,'Stuck'),(1,6,7928,'Silk Bandage'),(1,6,7929,'Heavy Silk Bandage'),(1,6,7934,'Anti-Venom'),(1,6,8386,'Attacking'),(1,6,8737,'Mail'),(1,6,9077,'Leather'),(1,6,9078,'Cloth'),(1,6,9125,'Generic'),(1,6,10840,'Mageweave Bandage'),(1,6,10841,'Heavy Mageweave Bandage'),(1,6,10846,'First Aid'),(1,6,18629,'Runecloth Bandage'),(1,6,18630,'Heavy Runecloth Bandage'),(1,6,20597,'Sword Specialization'),(1,6,20598,'The Human Spirit'),(1,6,20599,'Diplomacy'),(1,6,20864,'Mace Specialization'),(1,6,21651,'Opening'),(1,6,21652,'Closing'),(1,6,22027,'Remove Insignia'),(1,6,22810,'Opening - No Text'),(1,6,33391,'Journeyman Riding'),(1,6,45462,'Plague Strike'),(1,6,45477,'Icy Touch'),(1,6,45902,'Blood Strike'),(1,6,45903,'Offensive State (DND)'),(1,6,45927,'Summon Friend'),(1,6,47541,'Death Coil'),(1,6,48266,'Blood Presence'),(1,6,49410,'Forceful Deflection'),(1,6,49576,'Death Grip'),(1,6,52665,'Sigil'),(1,6,58985,'Perception'),(1,6,59752,'Every Man for Himself'),(1,6,59879,'Blood Plague'),(1,6,59921,'Frost Fever'),(1,6,61437,'Opening'),(1,6,61455,'Runic Focus'),(1,8,81,'Dodge'),(1,8,133,'Fireball'),(1,8,168,'Frost Armor'),(1,8,203,'Unarmed'),(1,8,204,'Defense'),(1,8,227,'Staves'),(1,8,522,'SPELLDEFENSE (DND)'),(1,8,668,'Language Common'),(1,8,1843,'Disarm'),(1,8,2382,'Generic'),(1,8,2479,'Honorless Target'),(1,8,3050,'Detect'),(1,8,3365,'Opening'),(1,8,5009,'Wands'),(1,8,5019,'Shoot'),(1,8,6233,'Closing'),(1,8,6246,'Closing'),(1,8,6247,'Opening'),(1,8,6477,'Opening'),(1,8,6478,'Opening'),(1,8,6603,'Attack'),(1,8,7266,'Duel'),(1,8,7267,'Grovel'),(1,8,7355,'Stuck'),(1,8,8386,'Attacking'),(1,8,9078,'Cloth'),(1,8,9125,'Generic'),(1,8,20597,'Sword Specialization'),(1,8,20598,'The Human Spirit'),(1,8,20599,'Diplomacy'),(1,8,20864,'Mace Specialization'),(1,8,21651,'Opening'),(1,8,21652,'Closing'),(1,8,22027,'Remove Insignia'),(1,8,22810,'Opening - No Text'),(1,8,45927,'Summon Friend'),(1,8,58985,'Perception'),(1,8,59752,'Every Man for Himself'),(1,8,61437,'Opening'),(1,9,81,'Dodge'),(1,9,203,'Unarmed'),(1,9,204,'Defense'),(1,9,522,'SPELLDEFENSE (DND)'),(1,9,668,'Language Common'),(1,9,686,'Shadow Bolt'),(1,9,687,'Demon Skin'),(1,9,1180,'Daggers'),(1,9,1843,'Disarm'),(1,9,2382,'Generic'),(1,9,2479,'Honorless Target'),(1,9,3050,'Detect'),(1,9,3365,'Opening'),(1,9,5009,'Wands'),(1,9,5019,'Shoot'),(1,9,6233,'Closing'),(1,9,6246,'Closing'),(1,9,6247,'Opening'),(1,9,6477,'Opening'),(1,9,6478,'Opening'),(1,9,6603,'Attack'),(1,9,7266,'Duel'),(1,9,7267,'Grovel'),(1,9,7355,'Stuck'),(1,9,8386,'Attacking'),(1,9,9078,'Cloth'),(1,9,9125,'Generic'),(1,9,20597,'Sword Specialization'),(1,9,20598,'The Human Spirit'),(1,9,20599,'Diplomacy'),(1,9,20864,'Mace Specialization'),(1,9,21651,'Opening'),(1,9,21652,'Closing'),(1,9,22027,'Remove Insignia'),(1,9,22810,'Opening - No Text'),(1,9,45927,'Summon Friend'),(5,9,58284,'Chaos Bolt Passive'),(1,9,58985,'Perception'),(1,9,59752,'Every Man for Himself'),(1,9,61437,'Opening'),(2,1,78,'Heroic Strike'),(2,1,81,'Dodge'),(2,1,107,'Block'),(2,1,196,'One-Handed Axes'),(2,1,197,'Two-Handed Axes'),(2,1,201,'One-Handed Swords'),(2,1,203,'Unarmed'),(2,1,204,'Defense'),(2,1,522,'SPELLDEFENSE (DND)'),(2,1,669,'Language Orcish'),(2,1,1843,'Disarm'),(2,1,2382,'Generic'),(2,1,2457,'Battle Stance'),(2,1,2479,'Honorless Target'),(2,1,3050,'Detect'),(2,1,3365,'Opening'),(2,1,5301,'Defensive State (DND)'),(2,1,6233,'Closing'),(2,1,6246,'Closing'),(2,1,6247,'Opening'),(2,1,6477,'Opening'),(2,1,6478,'Opening'),(2,1,6603,'Attack'),(2,1,7266,'Duel'),(2,1,7267,'Grovel'),(2,1,7355,'Stuck'),(2,1,8386,'Attacking'),(2,1,8737,'Mail'),(2,1,9077,'Leather'),(2,1,9078,'Cloth'),(2,1,9116,'Shield'),(2,1,9125,'Generic'),(2,1,20572,'Blood Fury'),(2,1,20573,'Hardiness'),(2,1,20574,'Axe Specialization'),(2,1,21563,'Command'),(2,1,21651,'Opening'),(2,1,21652,'Closing'),(2,1,22027,'Remove Insignia'),(2,1,22810,'Opening - No Text'),(2,1,32215,'Victorious State'),(2,1,45927,'Summon Friend'),(2,1,61437,'Opening'),(2,3,75,'Auto Shot'),(2,3,81,'Dodge'),(2,3,196,'One-Handed Axes'),(2,3,203,'Unarmed'),(2,3,204,'Defense'),(2,3,264,'Bows'),(2,3,522,'SPELLDEFENSE (DND)'),(2,3,669,'Language Orcish'),(2,3,1843,'Disarm'),(2,3,2382,'Generic'),(2,3,2479,'Honorless Target'),(2,3,2973,'Raptor Strike'),(2,3,3050,'Detect'),(2,3,3365,'Opening'),(2,3,6233,'Closing'),(2,3,6246,'Closing'),(2,3,6247,'Opening'),(2,3,6477,'Opening'),(2,3,6478,'Opening'),(2,3,6603,'Attack'),(2,3,7266,'Duel'),(2,3,7267,'Grovel'),(2,3,7355,'Stuck'),(2,3,8386,'Attacking'),(2,3,9077,'Leather'),(2,3,9078,'Cloth'),(2,3,9125,'Generic'),(2,3,13358,'Defensive State (DND)'),(2,3,20572,'Blood Fury'),(2,3,20573,'Hardiness'),(2,3,20574,'Axe Specialization'),(2,3,20576,'Command'),(2,3,21651,'Opening'),(2,3,21652,'Closing'),(2,3,22027,'Remove Insignia'),(2,3,22810,'Opening - No Text'),(2,3,24949,'Defensive State 2 (DND)'),(2,3,34082,'Advantaged State (DND)'),(2,3,45927,'Summon Friend'),(2,3,61437,'Opening'),(2,4,81,'Dodge'),(2,4,203,'Unarmed'),(2,4,204,'Defense'),(2,4,522,'SPELLDEFENSE (DND)'),(2,4,669,'Language Orcish'),(2,4,1180,'Daggers'),(2,4,1752,'Sinister Strike'),(2,4,1843,'Disarm'),(2,4,2098,'Eviscerate'),(2,4,2382,'Generic'),(2,4,2479,'Honorless Target'),(2,4,2567,'Thrown'),(2,4,2764,'Throw'),(2,4,3050,'Detect'),(2,4,3365,'Opening'),(2,4,6233,'Closing'),(2,4,6246,'Closing'),(2,4,6247,'Opening'),(2,4,6477,'Opening'),(2,4,6478,'Opening'),(2,4,6603,'Attack'),(2,4,7266,'Duel'),(2,4,7267,'Grovel'),(2,4,7355,'Stuck'),(2,4,8386,'Attacking'),(2,4,9077,'Leather'),(2,4,9078,'Cloth'),(2,4,9125,'Generic'),(2,4,16092,'Defensive State (DND)'),(2,4,20572,'Blood Fury'),(2,4,20573,'Hardiness'),(2,4,20574,'Axe Specialization'),(2,4,21184,'Rogue Passive (DND)'),(2,4,21563,'Command'),(2,4,21651,'Opening'),(2,4,21652,'Closing'),(2,4,22027,'Remove Insignia'),(2,4,22810,'Opening - No Text'),(2,4,45927,'Summon Friend'),(2,4,61437,'Opening'),(2,6,81,'Dodge'),(2,6,196,'One-Handed Axes'),(2,6,197,'Two-Handed Axes'),(2,6,200,'Polearms'),(2,6,201,'One-Handed Swords'),(2,6,202,'Two-Handed Swords'),(2,6,203,'Unarmed'),(2,6,204,'Defense'),(2,6,522,'SPELLDEFENSE (DND)'),(2,6,669,'Language Orcish'),(2,6,674,'Dual Wield'),(2,6,750,'Plate Mail'),(2,6,1843,'Disarm'),(2,6,2382,'Generic'),(2,6,2479,'Honorless Target'),(2,6,3050,'Detect'),(2,6,3127,'Parry'),(2,6,3275,'Linen Bandage'),(2,6,3276,'Heavy Linen Bandage'),(2,6,3277,'Wool Bandage'),(2,6,3278,'Heavy Wool Bandage'),(2,6,3365,'Opening'),(2,6,6233,'Closing'),(2,6,6246,'Closing'),(2,6,6247,'Opening'),(2,6,6477,'Opening'),(2,6,6478,'Opening'),(2,6,6603,'Attack'),(2,6,7266,'Duel'),(2,6,7267,'Grovel'),(2,6,7355,'Stuck'),(2,6,7928,'Silk Bandage'),(2,6,7929,'Heavy Silk Bandage'),(2,6,7934,'Anti-Venom'),(2,6,8386,'Attacking'),(2,6,8737,'Mail'),(2,6,9077,'Leather'),(2,6,9078,'Cloth'),(2,6,9125,'Generic'),(2,6,10840,'Mageweave Bandage'),(2,6,10841,'Heavy Mageweave Bandage'),(2,6,10846,'First Aid'),(2,6,18629,'Runecloth Bandage'),(2,6,18630,'Heavy Runecloth Bandage'),(2,6,20572,'Blood Fury'),(2,6,20573,'Hardiness'),(2,6,20574,'Axe Specialization'),(2,6,21651,'Opening'),(2,6,21652,'Closing'),(2,6,22027,'Remove Insignia'),(2,6,22810,'Opening - No Text'),(2,6,33391,'Journeyman Riding'),(2,6,45462,'Plague Strike'),(2,6,45477,'Icy Touch'),(2,6,45902,'Blood Strike'),(2,6,45903,'Offensive State (DND)'),(2,6,45927,'Summon Friend'),(2,6,47541,'Death Coil'),(2,6,48266,'Blood Presence'),(2,6,49410,'Forceful Deflection'),(2,6,49576,'Death Grip'),(2,6,52665,'Sigil'),(2,6,54562,'Command'),(2,6,59879,'Blood Plague'),(2,6,59921,'Frost Fever'),(2,6,61437,'Opening'),(2,6,61455,'Runic Focus'),(2,7,81,'Dodge'),(2,7,107,'Block'),(2,7,198,'One-Handed Maces'),(2,7,203,'Unarmed'),(2,7,204,'Defense'),(2,7,227,'Staves'),(2,7,331,'Healing Wave'),(2,7,403,'Lightning Bolt'),(2,7,522,'SPELLDEFENSE (DND)'),(2,7,669,'Language Orcish'),(2,7,1843,'Disarm'),(2,7,2382,'Generic'),(2,7,2479,'Honorless Target'),(2,7,3050,'Detect'),(2,7,3365,'Opening'),(2,7,6233,'Closing'),(2,7,6246,'Closing'),(2,7,6247,'Opening'),(2,7,6477,'Opening'),(2,7,6478,'Opening'),(2,7,6603,'Attack'),(2,7,7266,'Duel'),(2,7,7267,'Grovel'),(2,7,7355,'Stuck'),(2,7,8386,'Attacking'),(2,7,9077,'Leather'),(2,7,9078,'Cloth'),(2,7,9116,'Shield'),(2,7,9125,'Generic'),(2,7,20573,'Hardiness'),(2,7,20574,'Axe Specialization'),(2,7,21563,'Command'),(2,7,21651,'Opening'),(2,7,21652,'Closing'),(2,7,22027,'Remove Insignia'),(2,7,22810,'Opening - No Text'),(2,7,27763,'Totem'),(2,7,33697,'Blood Fury'),(2,7,45927,'Summon Friend'),(2,7,61437,'Opening'),(2,9,81,'Dodge'),(2,9,203,'Unarmed'),(2,9,204,'Defense'),(2,9,522,'SPELLDEFENSE (DND)'),(2,9,669,'Language Orcish'),(2,9,686,'Shadow Bolt'),(2,9,687,'Demon Skin'),(2,9,1180,'Daggers'),(2,9,1843,'Disarm'),(2,9,2382,'Generic'),(2,9,2479,'Honorless Target'),(2,9,3050,'Detect'),(2,9,3365,'Opening'),(2,9,5009,'Wands'),(2,9,5019,'Shoot'),(2,9,6233,'Closing'),(2,9,6246,'Closing'),(2,9,6247,'Opening'),(2,9,6477,'Opening'),(2,9,6478,'Opening'),(2,9,6603,'Attack'),(2,9,7266,'Duel'),(2,9,7267,'Grovel'),(2,9,7355,'Stuck'),(2,9,8386,'Attacking'),(2,9,9078,'Cloth'),(2,9,9125,'Generic'),(2,9,20573,'Hardiness'),(2,9,20574,'Axe Specialization'),(2,9,20575,'Command'),(2,9,21651,'Opening'),(2,9,21652,'Closing'),(2,9,22027,'Remove Insignia'),(2,9,22810,'Opening - No Text'),(2,9,33702,'Blood Fury'),(2,9,45927,'Summon Friend'),(2,9,58284,'Chaos Bolt Passive'),(2,9,61437,'Opening'),(3,1,78,'Heroic Strike'),(3,1,81,'Dodge'),(3,1,107,'Block'),(3,1,196,'One-Handed Axes'),(3,1,197,'Two-Handed Axes'),(3,1,198,'One-Handed Maces'),(3,1,203,'Unarmed'),(3,1,204,'Defense'),(3,1,522,'SPELLDEFENSE (DND)'),(3,1,668,'Language Common'),(3,1,672,'Language Dwarven'),(3,1,1843,'Disarm'),(3,1,2382,'Generic'),(3,1,2457,'Battle Stance'),(3,1,2479,'Honorless Target'),(3,1,2481,'Find Treasure'),(3,1,3050,'Detect'),(3,1,3365,'Opening'),(3,1,5301,'Defensive State (DND)'),(3,1,6233,'Closing'),(3,1,6246,'Closing'),(3,1,6247,'Opening'),(3,1,6477,'Opening'),(3,1,6478,'Opening'),(3,1,6603,'Attack'),(3,1,7266,'Duel'),(3,1,7267,'Grovel'),(3,1,7355,'Stuck'),(3,1,8386,'Attacking'),(3,1,8737,'Mail'),(3,1,9077,'Leather'),(3,1,9078,'Cloth'),(3,1,9116,'Shield'),(3,1,9125,'Generic'),(3,1,20594,'Stoneform'),(3,1,20595,'Gun Specialization'),(3,1,20596,'Frost Resistance'),(3,1,21651,'Opening'),(3,1,21652,'Closing'),(3,1,22027,'Remove Insignia'),(3,1,22810,'Opening - No Text'),(3,1,32215,'Victorious State'),(3,1,45927,'Summon Friend'),(3,1,59224,'Mace Specialization'),(3,1,61437,'Opening'),(3,2,81,'Dodge'),(3,2,107,'Block'),(3,2,198,'One-Handed Maces'),(3,2,199,'Two-Handed Maces'),(3,2,203,'Unarmed'),(3,2,204,'Defense'),(3,2,522,'SPELLDEFENSE (DND)'),(3,2,635,'Holy Light'),(3,2,668,'Language Common'),(3,2,672,'Language Dwarven'),(3,2,1843,'Disarm'),(3,2,2382,'Generic'),(3,2,2479,'Honorless Target'),(3,2,2481,'Find Treasure'),(3,2,3050,'Detect'),(3,2,3365,'Opening'),(3,2,6233,'Closing'),(3,2,6246,'Closing'),(3,2,6247,'Opening'),(3,2,6477,'Opening'),(3,2,6478,'Opening'),(3,2,6603,'Attack'),(3,2,7266,'Duel'),(3,2,7267,'Grovel'),(3,2,7355,'Stuck'),(3,2,8386,'Attacking'),(3,2,8737,'Mail'),(3,2,9077,'Leather'),(3,2,9078,'Cloth'),(3,2,9116,'Shield'),(3,2,9125,'Generic'),(3,2,21084,'Seal of Righteousness'),(3,2,20594,'Stoneform'),(3,2,20595,'Gun Specialization'),(3,2,20596,'Frost Resistance'),(3,2,21651,'Opening'),(3,2,21652,'Closing'),(3,2,22027,'Remove Insignia'),(3,2,22810,'Opening - No Text'),(3,2,27762,'Libram'),(3,2,45927,'Summon Friend'),(3,2,59224,'Mace Specialization'),(3,2,61437,'Opening'),(3,3,75,'Auto Shot'),(3,3,81,'Dodge'),(3,3,196,'One-Handed Axes'),(3,3,203,'Unarmed'),(3,3,204,'Defense'),(3,3,266,'Guns'),(3,3,522,'SPELLDEFENSE (DND)'),(3,3,668,'Language Common'),(3,3,672,'Language Dwarven'),(3,3,1843,'Disarm'),(3,3,2382,'Generic'),(3,3,2479,'Honorless Target'),(3,3,2481,'Find Treasure'),(3,3,2973,'Raptor Strike'),(3,3,3050,'Detect'),(3,3,3365,'Opening'),(3,3,6233,'Closing'),(3,3,6246,'Closing'),(3,3,6247,'Opening'),(3,3,6477,'Opening'),(3,3,6478,'Opening'),(3,3,6603,'Attack'),(3,3,7266,'Duel'),(3,3,7267,'Grovel'),(3,3,7355,'Stuck'),(3,3,8386,'Attacking'),(3,3,9077,'Leather'),(3,3,9078,'Cloth'),(3,3,9125,'Generic'),(3,3,13358,'Defensive State (DND)'),(3,3,20594,'Stoneform'),(3,3,20595,'Gun Specialization'),(3,3,20596,'Frost Resistance'),(3,3,21651,'Opening'),(3,3,21652,'Closing'),(3,3,22027,'Remove Insignia'),(3,3,22810,'Opening - No Text'),(3,3,24949,'Defensive State 2 (DND)'),(3,3,34082,'Advantaged State (DND)'),(3,3,45927,'Summon Friend'),(3,3,59224,'Mace Specialization'),(3,3,61437,'Opening'),(3,4,81,'Dodge'),(3,4,203,'Unarmed'),(3,4,204,'Defense'),(3,4,522,'SPELLDEFENSE (DND)'),(3,4,668,'Language Common'),(3,4,672,'Language Dwarven'),(3,4,1180,'Daggers'),(3,4,1752,'Sinister Strike'),(3,4,1843,'Disarm'),(3,4,2098,'Eviscerate'),(3,4,2382,'Generic'),(3,4,2479,'Honorless Target'),(3,4,2481,'Find Treasure'),(3,4,2567,'Thrown'),(3,4,2764,'Throw'),(3,4,3050,'Detect'),(3,4,3365,'Opening'),(3,4,6233,'Closing'),(3,4,6246,'Closing'),(3,4,6247,'Opening'),(3,4,6477,'Opening'),(3,4,6478,'Opening'),(3,4,6603,'Attack'),(3,4,7266,'Duel'),(3,4,7267,'Grovel'),(3,4,7355,'Stuck'),(3,4,8386,'Attacking'),(3,4,9077,'Leather'),(3,4,9078,'Cloth'),(3,4,9125,'Generic'),(3,4,16092,'Defensive State (DND)'),(3,4,20594,'Stoneform'),(3,4,20595,'Gun Specialization'),(3,4,20596,'Frost Resistance'),(3,4,21184,'Rogue Passive (DND)'),(3,4,21651,'Opening'),(3,4,21652,'Closing'),(3,4,22027,'Remove Insignia'),(3,4,22810,'Opening - No Text'),(3,4,45927,'Summon Friend'),(3,4,59224,'Mace Specialization'),(3,4,61437,'Opening'),(3,5,81,'Dodge'),(3,5,198,'One-Handed Maces'),(3,5,203,'Unarmed'),(3,5,204,'Defense'),(3,5,522,'SPELLDEFENSE (DND)'),(3,5,585,'Smite'),(3,5,668,'Language Common'),(3,5,672,'Language Dwarven'),(3,5,1843,'Disarm'),(3,5,2050,'Lesser Heal'),(3,5,2382,'Generic'),(3,5,2479,'Honorless Target'),(3,5,2481,'Find Treasure'),(3,5,3050,'Detect'),(3,5,3365,'Opening'),(3,5,5009,'Wands'),(3,5,5019,'Shoot'),(3,5,6233,'Closing'),(3,5,6246,'Closing'),(3,5,6247,'Opening'),(3,5,6477,'Opening'),(3,5,6478,'Opening'),(3,5,6603,'Attack'),(3,5,7266,'Duel'),(3,5,7267,'Grovel'),(3,5,7355,'Stuck'),(3,5,8386,'Attacking'),(3,5,9078,'Cloth'),(3,5,9125,'Generic'),(3,5,20594,'Stoneform'),(3,5,20595,'Gun Specialization'),(3,5,20596,'Frost Resistance'),(3,5,21651,'Opening'),(3,5,21652,'Closing'),(3,5,22027,'Remove Insignia'),(3,5,22810,'Opening - No Text'),(3,5,45927,'Summon Friend'),(3,5,59224,'Mace Specialization'),(3,5,61437,'Opening'),(3,6,81,'Dodge'),(3,6,196,'One-Handed Axes'),(3,6,197,'Two-Handed Axes'),(3,6,200,'Polearms'),(3,6,201,'One-Handed Swords'),(3,6,202,'Two-Handed Swords'),(3,6,203,'Unarmed'),(3,6,204,'Defense'),(3,6,522,'SPELLDEFENSE (DND)'),(3,6,668,'Language Common'),(3,6,672,'Language Dwarven'),(3,6,674,'Dual Wield'),(3,6,750,'Plate Mail'),(3,6,1843,'Disarm'),(3,6,2382,'Generic'),(3,6,2479,'Honorless Target'),(3,6,2481,'Find Treasure'),(3,6,3050,'Detect'),(3,6,3127,'Parry'),(3,6,3275,'Linen Bandage'),(3,6,3276,'Heavy Linen Bandage'),(3,6,3277,'Wool Bandage'),(3,6,3278,'Heavy Wool Bandage'),(3,6,3365,'Opening'),(3,6,6233,'Closing'),(3,6,6246,'Closing'),(3,6,6247,'Opening'),(3,6,6477,'Opening'),(3,6,6478,'Opening'),(3,6,6603,'Attack'),(3,6,7266,'Duel'),(3,6,7267,'Grovel'),(3,6,7355,'Stuck'),(3,6,7928,'Silk Bandage'),(3,6,7929,'Heavy Silk Bandage'),(3,6,7934,'Anti-Venom'),(3,6,8386,'Attacking'),(3,6,8737,'Mail'),(3,6,9077,'Leather'),(3,6,9078,'Cloth'),(3,6,9125,'Generic'),(3,6,10840,'Mageweave Bandage'),(3,6,10841,'Heavy Mageweave Bandage'),(3,6,10846,'First Aid'),(3,6,18629,'Runecloth Bandage'),(3,6,18630,'Heavy Runecloth Bandage'),(3,6,20594,'Stoneform'),(3,6,20595,'Gun Specialization'),(3,6,20596,'Frost Resistance'),(3,6,21651,'Opening'),(3,6,21652,'Closing'),(3,6,22027,'Remove Insignia'),(3,6,22810,'Opening - No Text'),(3,6,33391,'Journeyman Riding'),(3,6,45462,'Plague Strike'),(3,6,45477,'Icy Touch'),(3,6,45902,'Blood Strike'),(3,6,45903,'Offensive State (DND)'),(3,6,45927,'Summon Friend'),(3,6,47541,'Death Coil'),(3,6,48266,'Blood Presence'),(3,6,49410,'Forceful Deflection'),(3,6,49576,'Death Grip'),(3,6,52665,'Sigil'),(3,6,59224,'Mace Specialization'),(3,6,59879,'Blood Plague'),(3,6,59921,'Frost Fever'),(3,6,61437,'Opening'),(3,6,61455,'Runic Focus'),(4,1,78,'Heroic Strike'),(4,1,81,'Dodge'),(4,1,107,'Block'),(4,1,198,'One-Handed Maces'),(4,1,201,'One-Handed Swords'),(4,1,203,'Unarmed'),(4,1,204,'Defense'),(4,1,522,'SPELLDEFENSE (DND)'),(4,1,668,'Language Common'),(4,1,671,'Language Darnassian'),(4,1,1180,'Daggers'),(4,1,1843,'Disarm'),(4,1,2382,'Generic'),(4,1,2457,'Battle Stance'),(4,1,2479,'Honorless Target'),(4,1,3050,'Detect'),(4,1,3365,'Opening'),(4,1,5301,'Defensive State (DND)'),(4,1,6233,'Closing'),(4,1,6246,'Closing'),(4,1,6247,'Opening'),(4,1,6477,'Opening'),(4,1,6478,'Opening'),(4,1,6603,'Attack'),(4,1,7266,'Duel'),(4,1,7267,'Grovel'),(4,1,7355,'Stuck'),(4,1,8386,'Attacking'),(4,1,8737,'Mail'),(4,1,9077,'Leather'),(4,1,9078,'Cloth'),(4,1,9116,'Shield'),(4,1,9125,'Generic'),(4,1,20582,'Quickness'),(4,1,20583,'Nature Resistance'),(4,1,20585,'Wisp Spirit'),(4,1,21651,'Opening'),(4,1,21652,'Closing'),(4,1,22027,'Remove Insignia'),(4,1,22810,'Opening - No Text'),(4,1,32215,'Victorious State'),(4,1,45927,'Summon Friend'),(4,1,58984,'Shadowmelt'),(4,1,61437,'Opening'),(4,3,75,'Auto Shot'),(4,3,81,'Dodge'),(4,3,203,'Unarmed'),(4,3,204,'Defense'),(4,3,264,'Bows'),(4,3,522,'SPELLDEFENSE (DND)'),(4,3,668,'Language Common'),(4,3,671,'Language Darnassian'),(4,3,1180,'Daggers'),(4,3,1843,'Disarm'),(4,3,2382,'Generic'),(4,3,2479,'Honorless Target'),(4,3,2973,'Raptor Strike'),(4,3,3050,'Detect'),(4,3,3365,'Opening'),(4,3,6233,'Closing'),(4,3,6246,'Closing'),(4,3,6247,'Opening'),(4,3,6477,'Opening'),(4,3,6478,'Opening'),(4,3,6603,'Attack'),(4,3,7266,'Duel'),(4,3,7267,'Grovel'),(4,3,7355,'Stuck'),(4,3,8386,'Attacking'),(4,3,9077,'Leather'),(4,3,9078,'Cloth'),(4,3,9125,'Generic'),(4,3,13358,'Defensive State (DND)'),(4,3,20582,'Quickness'),(4,3,20583,'Nature Resistance'),(4,3,20585,'Wisp Spirit'),(4,3,21651,'Opening'),(4,3,21652,'Closing'),(4,3,22027,'Remove Insignia'),(4,3,22810,'Opening - No Text'),(4,3,24949,'Defensive State 2 (DND)'),(4,3,34082,'Advantaged State (DND)'),(4,3,45927,'Summon Friend'),(4,3,58984,'Shadowmelt'),(4,3,61437,'Opening'),(4,4,81,'Dodge'),(4,4,203,'Unarmed'),(4,4,204,'Defense'),(4,4,522,'SPELLDEFENSE (DND)'),(4,4,668,'Language Common'),(4,4,671,'Language Darnassian'),(4,4,1180,'Daggers'),(4,4,1752,'Sinister Strike'),(4,4,1843,'Disarm'),(4,4,2098,'Eviscerate'),(4,4,2382,'Generic'),(4,4,2479,'Honorless Target'),(4,4,2567,'Thrown'),(4,4,2764,'Throw'),(4,4,3050,'Detect'),(4,4,3365,'Opening'),(4,4,6233,'Closing'),(4,4,6246,'Closing'),(4,4,6247,'Opening'),(4,4,6477,'Opening'),(4,4,6478,'Opening'),(4,4,6603,'Attack'),(4,4,7266,'Duel'),(4,4,7267,'Grovel'),(4,4,7355,'Stuck'),(4,4,8386,'Attacking'),(4,4,9077,'Leather'),(4,4,9078,'Cloth'),(4,4,9125,'Generic'),(4,4,16092,'Defensive State (DND)'),(4,4,20582,'Quickness'),(4,4,20583,'Nature Resistance'),(4,4,20585,'Wisp Spirit'),(4,4,21184,'Rogue Passive (DND)'),(4,4,21651,'Opening'),(4,4,21652,'Closing'),(4,4,22027,'Remove Insignia'),(4,4,22810,'Opening - No Text'),(4,4,45927,'Summon Friend'),(4,4,58984,'Shadowmelt'),(4,4,61437,'Opening'),(4,5,81,'Dodge'),(4,5,198,'One-Handed Maces'),(4,5,203,'Unarmed'),(4,5,204,'Defense'),(4,5,522,'SPELLDEFENSE (DND)'),(4,5,585,'Smite'),(4,5,668,'Language Common'),(4,5,671,'Language Darnassian'),(4,5,1843,'Disarm'),(4,5,2050,'Lesser Heal'),(4,5,2382,'Generic'),(4,5,2479,'Honorless Target'),(4,5,3050,'Detect'),(4,5,3365,'Opening'),(4,5,5009,'Wands'),(4,5,5019,'Shoot'),(4,5,6233,'Closing'),(4,5,6246,'Closing'),(4,5,6247,'Opening'),(4,5,6477,'Opening'),(4,5,6478,'Opening'),(4,5,6603,'Attack'),(4,5,7266,'Duel'),(4,5,7267,'Grovel'),(4,5,7355,'Stuck'),(4,5,8386,'Attacking'),(4,5,9078,'Cloth'),(4,5,9125,'Generic'),(4,5,20582,'Quickness'),(4,5,20583,'Nature Resistance'),(4,5,20585,'Wisp Spirit'),(4,5,21651,'Opening'),(4,5,21652,'Closing'),(4,5,22027,'Remove Insignia'),(4,5,22810,'Opening - No Text'),(4,5,45927,'Summon Friend'),(4,5,58984,'Shadowmelt'),(4,5,61437,'Opening'),(4,6,81,'Dodge'),(4,6,196,'One-Handed Axes'),(4,6,197,'Two-Handed Axes'),(4,6,200,'Polearms'),(4,6,201,'One-Handed Swords'),(4,6,202,'Two-Handed Swords'),(4,6,203,'Unarmed'),(4,6,204,'Defense'),(4,6,522,'SPELLDEFENSE (DND)'),(4,6,668,'Language Common'),(4,6,671,'Language Darnassian'),(4,6,674,'Dual Wield'),(4,6,750,'Plate Mail'),(4,6,1843,'Disarm'),(4,6,2382,'Generic'),(4,6,2479,'Honorless Target'),(4,6,3050,'Detect'),(4,6,3127,'Parry'),(4,6,3275,'Linen Bandage'),(4,6,3276,'Heavy Linen Bandage'),(4,6,3277,'Wool Bandage'),(4,6,3278,'Heavy Wool Bandage'),(4,6,3365,'Opening'),(4,6,6233,'Closing'),(4,6,6246,'Closing'),(4,6,6247,'Opening'),(4,6,6477,'Opening'),(4,6,6478,'Opening'),(4,6,6603,'Attack'),(4,6,7266,'Duel'),(4,6,7267,'Grovel'),(4,6,7355,'Stuck'),(4,6,7928,'Silk Bandage'),(4,6,7929,'Heavy Silk Bandage'),(4,6,7934,'Anti-Venom'),(4,6,8386,'Attacking'),(4,6,8737,'Mail'),(4,6,9077,'Leather'),(4,6,9078,'Cloth'),(4,6,9125,'Generic'),(4,6,10840,'Mageweave Bandage'),(4,6,10841,'Heavy Mageweave Bandage'),(4,6,10846,'First Aid'),(4,6,18629,'Runecloth Bandage'),(4,6,18630,'Heavy Runecloth Bandage'),(4,6,20582,'Quickness'),(4,6,20583,'Nature Resistance'),(4,6,20585,'Wisp Spirit'),(4,6,21651,'Opening'),(4,6,21652,'Closing'),(4,6,22027,'Remove Insignia'),(4,6,22810,'Opening - No Text'),(4,6,33391,'Journeyman Riding'),(4,6,45462,'Plague Strike'),(4,6,45477,'Icy Touch'),(4,6,45902,'Blood Strike'),(4,6,45903,'Offensive State (DND)'),(4,6,45927,'Summon Friend'),(4,6,47541,'Death Coil'),(4,6,48266,'Blood Presence'),(4,6,49410,'Forceful Deflection'),(4,6,49576,'Death Grip'),(4,6,52665,'Sigil'),(4,6,58984,'Shadowmeld'),(4,6,59879,'Blood Plague'),(4,6,59921,'Frost Fever'),(4,6,61437,'Opening'),(4,6,61455,'Runic Focus'),(4,11,81,'Dodge'),(4,11,203,'Unarmed'),(4,11,204,'Defense'),(4,11,227,'Staves'),(4,11,522,'SPELLDEFENSE (DND)'),(4,11,668,'Language Common'),(4,11,671,'Language Darnassian'),(4,11,1180,'Daggers'),(4,11,1843,'Disarm'),(4,11,2382,'Generic'),(4,11,2479,'Honorless Target'),(4,11,3050,'Detect'),(4,11,3365,'Opening'),(4,11,5176,'Wrath'),(4,11,5185,'Healing Touch'),(4,11,6233,'Closing'),(4,11,6246,'Closing'),(4,11,6247,'Opening'),(4,11,6477,'Opening'),(4,11,6478,'Opening'),(4,11,6603,'Attack'),(4,11,7266,'Duel'),(4,11,7267,'Grovel'),(4,11,7355,'Stuck'),(4,11,8386,'Attacking'),(4,11,9077,'Leather'),(4,11,9078,'Cloth'),(4,11,9125,'Generic'),(4,11,20582,'Quickness'),(4,11,20583,'Nature Resistance'),(4,11,20585,'Wisp Spirit'),(4,11,21651,'Opening'),(4,11,21652,'Closing'),(4,11,22027,'Remove Insignia'),(4,11,22810,'Opening - No Text'),(4,11,27764,'Fetish'),(4,11,45927,'Summon Friend'),(4,11,58984,'Shadowmelt'),(4,11,61437,'Opening'),(5,1,78,'Heroic Strike'),(5,1,81,'Dodge'),(5,1,107,'Block'),(5,1,201,'One-Handed Swords'),(5,1,202,'Two-Handed Swords'),(5,1,203,'Unarmed'),(5,1,204,'Defense'),(5,1,522,'SPELLDEFENSE (DND)'),(5,1,669,'Language Orcish'),(5,1,1180,'Daggers'),(5,1,1843,'Disarm'),(5,1,2382,'Generic'),(5,1,2457,'Battle Stance'),(5,1,2479,'Honorless Target'),(5,1,3050,'Detect'),(5,1,3365,'Opening'),(5,1,5227,'Underwater Breathing'),(5,1,5301,'Defensive State (DND)'),(5,1,6233,'Closing'),(5,1,6246,'Closing'),(5,1,6247,'Opening'),(5,1,6477,'Opening'),(5,1,6478,'Opening'),(5,1,6603,'Attack'),(5,1,7266,'Duel'),(5,1,7267,'Grovel'),(5,1,7355,'Stuck'),(5,1,7744,'Will of the Forsaken'),(5,1,8386,'Attacking'),(5,1,8737,'Mail'),(5,1,9077,'Leather'),(5,1,9078,'Cloth'),(5,1,9116,'Shield'),(5,1,9125,'Generic'),(5,1,17737,'Language Gutterspeak'),(5,1,20577,'Cannibalize'),(5,1,20579,'Shadow Resistance'),(5,1,21651,'Opening'),(5,1,21652,'Closing'),(5,1,22027,'Remove Insignia'),(5,1,22810,'Opening - No Text'),(5,1,32215,'Victorious State'),(5,1,45927,'Summon Friend'),(5,1,61437,'Opening'),(5,4,81,'Dodge'),(5,4,203,'Unarmed'),(5,4,204,'Defense'),(5,4,522,'SPELLDEFENSE (DND)'),(5,4,669,'Language Orcish'),(5,4,1180,'Daggers'),(5,4,1752,'Sinister Strike'),(5,4,1843,'Disarm'),(5,4,2098,'Eviscerate'),(5,4,2382,'Generic'),(5,4,2479,'Honorless Target'),(5,4,2567,'Thrown'),(5,4,2764,'Throw'),(5,4,3050,'Detect'),(5,4,3365,'Opening'),(5,4,5227,'Underwater Breathing'),(5,4,6233,'Closing'),(5,4,6246,'Closing'),(5,4,6247,'Opening'),(5,4,6477,'Opening'),(5,4,6478,'Opening'),(5,4,6603,'Attack'),(5,4,7266,'Duel'),(5,4,7267,'Grovel'),(5,4,7355,'Stuck'),(5,4,7744,'Will of the Forsaken'),(5,4,8386,'Attacking'),(5,4,9077,'Leather'),(5,4,9078,'Cloth'),(5,4,9125,'Generic'),(5,4,16092,'Defensive State (DND)'),(5,4,17737,'Language Gutterspeak'),(5,4,20577,'Cannibalize'),(5,4,20579,'Shadow Resistance'),(5,4,21184,'Rogue Passive (DND)'),(5,4,21651,'Opening'),(5,4,21652,'Closing'),(5,4,22027,'Remove Insignia'),(5,4,22810,'Opening - No Text'),(5,4,45927,'Summon Friend'),(5,4,61437,'Opening'),(5,5,81,'Dodge'),(5,5,198,'One-Handed Maces'),(5,5,203,'Unarmed'),(5,5,204,'Defense'),(5,5,522,'SPELLDEFENSE (DND)'),(5,5,585,'Smite'),(5,5,669,'Language Orcish'),(5,5,1843,'Disarm'),(5,5,2050,'Lesser Heal'),(5,5,2382,'Generic'),(5,5,2479,'Honorless Target'),(5,5,3050,'Detect'),(5,5,3365,'Opening'),(5,5,5009,'Wands'),(5,5,5019,'Shoot'),(5,5,5227,'Underwater Breathing'),(5,5,6233,'Closing'),(5,5,6246,'Closing'),(5,5,6247,'Opening'),(5,5,6477,'Opening'),(5,5,6478,'Opening'),(5,5,6603,'Attack'),(5,5,7266,'Duel'),(5,5,7267,'Grovel'),(5,5,7355,'Stuck'),(5,5,7744,'Will of the Forsaken'),(5,5,8386,'Attacking'),(5,5,9078,'Cloth'),(5,5,9125,'Generic'),(5,5,17737,'Language Gutterspeak'),(5,5,20577,'Cannibalize'),(5,5,20579,'Shadow Resistance'),(5,5,21651,'Opening'),(5,5,21652,'Closing'),(5,5,22027,'Remove Insignia'),(5,5,22810,'Opening - No Text'),(5,5,45927,'Summon Friend'),(5,5,61437,'Opening'),(5,6,81,'Dodge'),(5,6,196,'One-Handed Axes'),(5,6,197,'Two-Handed Axes'),(5,6,200,'Polearms'),(5,6,201,'One-Handed Swords'),(5,6,202,'Two-Handed Swords'),(5,6,203,'Unarmed'),(5,6,204,'Defense'),(5,6,522,'SPELLDEFENSE (DND)'),(5,6,669,'Language Orcish'),(5,6,674,'Dual Wield'),(5,6,750,'Plate Mail'),(5,6,1843,'Disarm'),(5,6,2382,'Generic'),(5,6,2479,'Honorless Target'),(5,6,3050,'Detect'),(5,6,3127,'Parry'),(5,6,3275,'Linen Bandage'),(5,6,3276,'Heavy Linen Bandage'),(5,6,3277,'Wool Bandage'),(5,6,3278,'Heavy Wool Bandage'),(5,6,3365,'Opening'),(5,6,5227,'Underwater Breathing'),(5,6,6233,'Closing'),(5,6,6246,'Closing'),(5,6,6247,'Opening'),(5,6,6477,'Opening'),(5,6,6478,'Opening'),(5,6,6603,'Attack'),(5,6,7266,'Duel'),(5,6,7267,'Grovel'),(5,6,7355,'Stuck'),(5,6,7744,'Will of the Forsaken'),(5,6,7928,'Silk Bandage'),(5,6,7929,'Heavy Silk Bandage'),(5,6,7934,'Anti-Venom'),(5,6,8386,'Attacking'),(5,6,8737,'Mail'),(5,6,9077,'Leather'),(5,6,9078,'Cloth'),(5,6,9125,'Generic'),(5,6,10840,'Mageweave Bandage'),(5,6,10841,'Heavy Mageweave Bandage'),(5,6,10846,'First Aid'),(5,6,17737,'Language Gutterspeak'),(5,6,18629,'Runecloth Bandage'),(5,6,18630,'Heavy Runecloth Bandage'),(5,6,20577,'Cannibalize'),(5,6,20579,'Shadow Resistance'),(5,6,21651,'Opening'),(5,6,21652,'Closing'),(5,6,22027,'Remove Insignia'),(5,6,22810,'Opening - No Text'),(5,6,33391,'Journeyman Riding'),(5,6,45462,'Plague Strike'),(5,6,45477,'Icy Touch'),(5,6,45902,'Blood Strike'),(5,6,45903,'Offensive State (DND)'),(5,6,45927,'Summon Friend'),(5,6,47541,'Death Coil'),(5,6,48266,'Blood Presence'),(5,6,49410,'Forceful Deflection'),(5,6,49576,'Death Grip'),(5,6,52665,'Sigil'),(5,6,59879,'Blood Plague'),(5,6,59921,'Frost Fever'),(5,6,61437,'Opening'),(5,6,61455,'Runic Focus'),(5,8,81,'Dodge'),(5,8,133,'Fireball'),(5,8,168,'Frost Armor'),(5,8,203,'Unarmed'),(5,8,204,'Defense'),(5,8,227,'Staves'),(5,8,522,'SPELLDEFENSE (DND)'),(5,8,669,'Language Orcish'),(5,8,1843,'Disarm'),(5,8,2382,'Generic'),(5,8,2479,'Honorless Target'),(5,8,3050,'Detect'),(5,8,3365,'Opening'),(5,8,5009,'Wands'),(5,8,5019,'Shoot'),(5,8,5227,'Underwater Breathing'),(5,8,6233,'Closing'),(5,8,6246,'Closing'),(5,8,6247,'Opening'),(5,8,6477,'Opening'),(5,8,6478,'Opening'),(5,8,6603,'Attack'),(5,8,7266,'Duel'),(5,8,7267,'Grovel'),(5,8,7355,'Stuck'),(5,8,7744,'Will of the Forsaken'),(5,8,8386,'Attacking'),(5,8,9078,'Cloth'),(5,8,9125,'Generic'),(5,8,17737,'Language Gutterspeak'),(5,8,20577,'Cannibalize'),(5,8,20579,'Shadow Resistance'),(5,8,21651,'Opening'),(5,8,21652,'Closing'),(5,8,22027,'Remove Insignia'),(5,8,22810,'Opening - No Text'),(5,8,45927,'Summon Friend'),(5,8,61437,'Opening'),(5,9,81,'Dodge'),(5,9,203,'Unarmed'),(5,9,204,'Defense'),(5,9,522,'SPELLDEFENSE (DND)'),(5,9,669,'Language Orcish'),(5,9,686,'Shadow Bolt'),(5,9,687,'Demon Skin'),(5,9,1180,'Daggers'),(5,9,1843,'Disarm'),(5,9,2382,'Generic'),(5,9,2479,'Honorless Target'),(5,9,3050,'Detect'),(5,9,3365,'Opening'),(5,9,5009,'Wands'),(5,9,5019,'Shoot'),(5,9,5227,'Underwater Breathing'),(5,9,6233,'Closing'),(5,9,6246,'Closing'),(5,9,6247,'Opening'),(5,9,6477,'Opening'),(5,9,6478,'Opening'),(5,9,6603,'Attack'),(5,9,7266,'Duel'),(5,9,7267,'Grovel'),(5,9,7355,'Stuck'),(5,9,7744,'Will of the Forsaken'),(5,9,8386,'Attacking'),(5,9,9078,'Cloth'),(5,9,9125,'Generic'),(5,9,17737,'Language Gutterspeak'),(5,9,20577,'Cannibalize'),(5,9,20579,'Shadow Resistance'),(5,9,21651,'Opening'),(5,9,21652,'Closing'),(5,9,22027,'Remove Insignia'),(5,9,22810,'Opening - No Text'),(5,9,45927,'Summon Friend'),(1,9,58284,'Chaos Bolt Passive'),(5,9,61437,'Opening'),(6,1,78,'Heroic Strike'),(6,1,81,'Dodge'),(6,1,107,'Block'),(6,1,196,'One-Handed Axes'),(6,1,198,'One-Handed Maces'),(6,1,199,'Two-Handed Maces'),(6,1,203,'Unarmed'),(6,1,204,'Defense'),(6,1,522,'SPELLDEFENSE (DND)'),(6,1,669,'Language Orcish'),(6,1,670,'Language Taurahe'),(6,1,1843,'Disarm'),(6,1,2382,'Generic'),(6,1,2457,'Battle Stance'),(6,1,2479,'Honorless Target'),(6,1,3050,'Detect'),(6,1,3365,'Opening'),(6,1,5301,'Defensive State (DND)'),(6,1,6233,'Closing'),(6,1,6246,'Closing'),(6,1,6247,'Opening'),(6,1,6477,'Opening'),(6,1,6478,'Opening'),(6,1,6603,'Attack'),(6,1,7266,'Duel'),(6,1,7267,'Grovel'),(6,1,7355,'Stuck'),(6,1,8386,'Attacking'),(6,1,8737,'Mail'),(6,1,9077,'Leather'),(6,1,9078,'Cloth'),(6,1,9116,'Shield'),(6,1,9125,'Generic'),(6,1,20549,'War Stomp'),(6,1,20550,'Endurance'),(6,1,20551,'Nature Resistance'),(6,1,20552,'Cultivation'),(6,1,21651,'Opening'),(6,1,21652,'Closing'),(6,1,22027,'Remove Insignia'),(6,1,22810,'Opening - No Text'),(6,1,32215,'Victorious State'),(6,1,45927,'Summon Friend'),(6,1,61437,'Opening'),(6,3,75,'Auto Shot'),(6,3,81,'Dodge'),(6,3,196,'One-Handed Axes'),(6,3,203,'Unarmed'),(6,3,204,'Defense'),(6,3,266,'Guns'),(6,3,522,'SPELLDEFENSE (DND)'),(6,3,669,'Language Orcish'),(6,3,670,'Language Taurahe'),(6,3,1843,'Disarm'),(6,3,2382,'Generic'),(6,3,2479,'Honorless Target'),(6,3,2973,'Raptor Strike'),(6,3,3050,'Detect'),(6,3,3365,'Opening'),(6,3,6233,'Closing'),(6,3,6246,'Closing'),(6,3,6247,'Opening'),(6,3,6477,'Opening'),(6,3,6478,'Opening'),(6,3,6603,'Attack'),(6,3,7266,'Duel'),(6,3,7267,'Grovel'),(6,3,7355,'Stuck'),(6,3,8386,'Attacking'),(6,3,9077,'Leather'),(6,3,9078,'Cloth'),(6,3,9125,'Generic'),(6,3,13358,'Defensive State (DND)'),(6,3,20549,'War Stomp'),(6,3,20550,'Endurance'),(6,3,20551,'Nature Resistance'),(6,3,20552,'Cultivation'),(6,3,21651,'Opening'),(6,3,21652,'Closing'),(6,3,22027,'Remove Insignia'),(6,3,22810,'Opening - No Text'),(6,3,24949,'Defensive State 2 (DND)'),(6,3,34082,'Advantaged State (DND)'),(6,3,45927,'Summon Friend'),(6,3,61437,'Opening'),(6,6,81,'Dodge'),(6,6,196,'One-Handed Axes'),(6,6,197,'Two-Handed Axes'),(6,6,200,'Polearms'),(6,6,201,'One-Handed Swords'),(6,6,202,'Two-Handed Swords'),(6,6,203,'Unarmed'),(6,6,204,'Defense'),(6,6,522,'SPELLDEFENSE (DND)'),(6,6,669,'Language Orcish'),(6,6,670,'Language Taurahe'),(6,6,674,'Dual Wield'),(6,6,750,'Plate Mail'),(6,6,1843,'Disarm'),(6,6,2382,'Generic'),(6,6,2479,'Honorless Target'),(6,6,3050,'Detect'),(6,6,3127,'Parry'),(6,6,3275,'Linen Bandage'),(6,6,3276,'Heavy Linen Bandage'),(6,6,3277,'Wool Bandage'),(6,6,3278,'Heavy Wool Bandage'),(6,6,3365,'Opening'),(6,6,6233,'Closing'),(6,6,6246,'Closing'),(6,6,6247,'Opening'),(6,6,6477,'Opening'),(6,6,6478,'Opening'),(6,6,6603,'Attack'),(6,6,7266,'Duel'),(6,6,7267,'Grovel'),(6,6,7355,'Stuck'),(6,6,7928,'Silk Bandage'),(6,6,7929,'Heavy Silk Bandage'),(6,6,7934,'Anti-Venom'),(6,6,8386,'Attacking'),(6,6,8737,'Mail'),(6,6,9077,'Leather'),(6,6,9078,'Cloth'),(6,6,9125,'Generic'),(6,6,10840,'Mageweave Bandage'),(6,6,10841,'Heavy Mageweave Bandage'),(6,6,10846,'First Aid'),(6,6,18629,'Runecloth Bandage'),(6,6,18630,'Heavy Runecloth Bandage'),(6,6,20549,'War Stomp'),(6,6,20550,'Endurance'),(6,6,20551,'Nature Resistance'),(6,6,20552,'Cultivation'),(6,6,21651,'Opening'),(6,6,21652,'Closing'),(6,6,22027,'Remove Insignia'),(6,6,22810,'Opening - No Text'),(6,6,33391,'Journeyman Riding'),(6,6,45462,'Plague Strike'),(6,6,45477,'Icy Touch'),(6,6,45902,'Blood Strike'),(6,6,45903,'Offensive State (DND)'),(6,6,45927,'Summon Friend'),(6,6,47541,'Death Coil'),(6,6,48266,'Blood Presence'),(6,6,49410,'Forceful Deflection'),(6,6,49576,'Death Grip'),(6,6,52665,'Sigil'),(6,6,59879,'Blood Plague'),(6,6,59921,'Frost Fever'),(6,6,61437,'Opening'),(6,6,61455,'Runic Focus'),(6,7,81,'Dodge'),(6,7,107,'Block'),(6,7,198,'One-Handed Maces'),(6,7,203,'Unarmed'),(6,7,204,'Defense'),(6,7,227,'Staves'),(6,7,331,'Healing Wave'),(6,7,403,'Lightning Bolt'),(6,7,522,'SPELLDEFENSE (DND)'),(6,7,669,'Language Orcish'),(6,7,670,'Language Taurahe'),(6,7,1843,'Disarm'),(6,7,2382,'Generic'),(6,7,2479,'Honorless Target'),(6,7,3050,'Detect'),(6,7,3365,'Opening'),(6,7,6233,'Closing'),(6,7,6246,'Closing'),(6,7,6247,'Opening'),(6,7,6477,'Opening'),(6,7,6478,'Opening'),(6,7,6603,'Attack'),(6,7,7266,'Duel'),(6,7,7267,'Grovel'),(6,7,7355,'Stuck'),(6,7,8386,'Attacking'),(6,7,9077,'Leather'),(6,7,9078,'Cloth'),(6,7,9116,'Shield'),(6,7,9125,'Generic'),(6,7,20549,'War Stomp'),(6,7,20550,'Endurance'),(6,7,20551,'Nature Resistance'),(6,7,20552,'Cultivation'),(6,7,21651,'Opening'),(6,7,21652,'Closing'),(6,7,22027,'Remove Insignia'),(6,7,22810,'Opening - No Text'),(6,7,27763,'Totem'),(6,7,45927,'Summon Friend'),(6,7,61437,'Opening'),(6,11,81,'Dodge'),(6,11,198,'One-Handed Maces'),(6,11,203,'Unarmed'),(6,11,204,'Defense'),(6,11,227,'Staves'),(6,11,522,'SPELLDEFENSE (DND)'),(6,11,669,'Language Orcish'),(6,11,670,'Language Taurahe'),(6,11,1843,'Disarm'),(6,11,2382,'Generic'),(6,11,2479,'Honorless Target'),(6,11,3050,'Detect'),(6,11,3365,'Opening'),(6,11,5176,'Wrath'),(6,11,5185,'Healing Touch'),(6,11,6233,'Closing'),(6,11,6246,'Closing'),(6,11,6247,'Opening'),(6,11,6477,'Opening'),(6,11,6478,'Opening'),(6,11,6603,'Attack'),(6,11,7266,'Duel'),(6,11,7267,'Grovel'),(6,11,7355,'Stuck'),(6,11,8386,'Attacking'),(6,11,9077,'Leather'),(6,11,9078,'Cloth'),(6,11,9125,'Generic'),(6,11,20549,'War Stomp'),(6,11,20550,'Endurance'),(6,11,20551,'Nature Resistance'),(6,11,20552,'Cultivation'),(6,11,21651,'Opening'),(6,11,21652,'Closing'),(6,11,22027,'Remove Insignia'),(6,11,22810,'Opening - No Text'),(6,11,27764,'Fetish'),(6,11,45927,'Summon Friend'),(6,11,61437,'Opening'),(7,1,78,'Heroic Strike'),(7,1,81,'Dodge'),(7,1,107,'Block'),(7,1,198,'One-Handed Maces'),(7,1,201,'One-Handed Swords'),(7,1,203,'Unarmed'),(7,1,204,'Defense'),(7,1,522,'SPELLDEFENSE (DND)'),(7,1,668,'Language Common'),(7,1,1180,'Daggers'),(7,1,1843,'Disarm'),(7,1,2382,'Generic'),(7,1,2457,'Battle Stance'),(7,1,2479,'Honorless Target'),(7,1,3050,'Detect'),(7,1,3365,'Opening'),(7,1,5301,'Defensive State (DND)'),(7,1,6233,'Closing'),(7,1,6246,'Closing'),(7,1,6247,'Opening'),(7,1,6477,'Opening'),(7,1,6478,'Opening'),(7,1,6603,'Attack'),(7,1,7266,'Duel'),(7,1,7267,'Grovel'),(7,1,7340,'Language Gnomish'),(7,1,7355,'Stuck'),(7,1,8386,'Attacking'),(7,1,8737,'Mail'),(7,1,9077,'Leather'),(7,1,9078,'Cloth'),(7,1,9116,'Shield'),(7,1,9125,'Generic'),(7,1,20589,'Escape Artist'),(7,1,20591,'Expansive Mind'),(7,1,20592,'Arcane Resistance'),(7,1,20593,'Engineering Specialization'),(7,1,21651,'Opening'),(7,1,21652,'Closing'),(7,1,22027,'Remove Insignia'),(7,1,22810,'Opening - No Text'),(7,1,32215,'Victorious State'),(7,1,45927,'Summon Friend'),(7,1,61437,'Opening'),(7,4,81,'Dodge'),(7,4,203,'Unarmed'),(7,4,204,'Defense'),(7,4,522,'SPELLDEFENSE (DND)'),(7,4,668,'Language Common'),(7,4,1180,'Daggers'),(7,4,1752,'Sinister Strike'),(7,4,1843,'Disarm'),(7,4,2098,'Eviscerate'),(7,4,2382,'Generic'),(7,4,2479,'Honorless Target'),(7,4,2567,'Thrown'),(7,4,2764,'Throw'),(7,4,3050,'Detect'),(7,4,3365,'Opening'),(7,4,6233,'Closing'),(7,4,6246,'Closing'),(7,4,6247,'Opening'),(7,4,6477,'Opening'),(7,4,6478,'Opening'),(7,4,6603,'Attack'),(7,4,7266,'Duel'),(7,4,7267,'Grovel'),(7,4,7340,'Language Gnomish'),(7,4,7355,'Stuck'),(7,4,8386,'Attacking'),(7,4,9077,'Leather'),(7,4,9078,'Cloth'),(7,4,9125,'Generic'),(7,4,16092,'Defensive State (DND)'),(7,4,20589,'Escape Artist'),(7,4,20591,'Expansive Mind'),(7,4,20592,'Arcane Resistance'),(7,4,20593,'Engineering Specialization'),(7,4,21184,'Rogue Passive (DND)'),(7,4,21651,'Opening'),(7,4,21652,'Closing'),(7,4,22027,'Remove Insignia'),(7,4,22810,'Opening - No Text'),(7,4,45927,'Summon Friend'),(7,4,61437,'Opening'),(7,6,81,'Dodge'),(7,6,196,'One-Handed Axes'),(7,6,197,'Two-Handed Axes'),(7,6,200,'Polearms'),(7,6,201,'One-Handed Swords'),(7,6,202,'Two-Handed Swords'),(7,6,203,'Unarmed'),(7,6,204,'Defense'),(7,6,522,'SPELLDEFENSE (DND)'),(7,6,668,'Language Common'),(7,6,674,'Dual Wield'),(7,6,750,'Plate Mail'),(7,6,1843,'Disarm'),(7,6,2382,'Generic'),(7,6,2479,'Honorless Target'),(7,6,3050,'Detect'),(7,6,3127,'Parry'),(7,6,3275,'Linen Bandage'),(7,6,3276,'Heavy Linen Bandage'),(7,6,3277,'Wool Bandage'),(7,6,3278,'Heavy Wool Bandage'),(7,6,3365,'Opening'),(7,6,6233,'Closing'),(7,6,6246,'Closing'),(7,6,6247,'Opening'),(7,6,6477,'Opening'),(7,6,6478,'Opening'),(7,6,6603,'Attack'),(7,6,7266,'Duel'),(7,6,7267,'Grovel'),(7,6,7340,'Language Gnomish'),(7,6,7355,'Stuck'),(7,6,7928,'Silk Bandage'),(7,6,7929,'Heavy Silk Bandage'),(7,6,7934,'Anti-Venom'),(7,6,8386,'Attacking'),(7,6,8737,'Mail'),(7,6,9077,'Leather'),(7,6,9078,'Cloth'),(7,6,9125,'Generic'),(7,6,10840,'Mageweave Bandage'),(7,6,10841,'Heavy Mageweave Bandage'),(7,6,10846,'First Aid'),(7,6,18629,'Runecloth Bandage'),(7,6,18630,'Heavy Runecloth Bandage'),(7,6,20589,'Escape Artist'),(7,6,20591,'Expansive Mind'),(7,6,20592,'Arcane Resistance'),(7,6,20593,'Engineering Specialization'),(7,6,21651,'Opening'),(7,6,21652,'Closing'),(7,6,22027,'Remove Insignia'),(7,6,22810,'Opening - No Text'),(7,6,33391,'Journeyman Riding'),(7,6,45462,'Plague Strike'),(7,6,45477,'Icy Touch'),(7,6,45902,'Blood Strike'),(7,6,45903,'Offensive State (DND)'),(7,6,45927,'Summon Friend'),(7,6,47541,'Death Coil'),(7,6,48266,'Blood Presence'),(7,6,49410,'Forceful Deflection'),(7,6,49576,'Death Grip'),(7,6,52665,'Sigil'),(7,6,59879,'Blood Plague'),(7,6,59921,'Frost Fever'),(7,6,61437,'Opening'),(7,6,61455,'Runic Focus'),(7,8,81,'Dodge'),(7,8,133,'Fireball'),(7,8,168,'Frost Armor'),(7,8,203,'Unarmed'),(7,8,204,'Defense'),(7,8,227,'Staves'),(7,8,522,'SPELLDEFENSE (DND)'),(7,8,668,'Language Common'),(7,8,1843,'Disarm'),(7,8,2382,'Generic'),(7,8,2479,'Honorless Target'),(7,8,3050,'Detect'),(7,8,3365,'Opening'),(7,8,5009,'Wands'),(7,8,5019,'Shoot'),(7,8,6233,'Closing'),(7,8,6246,'Closing'),(7,8,6247,'Opening'),(7,8,6477,'Opening'),(7,8,6478,'Opening'),(7,8,6603,'Attack'),(7,8,7266,'Duel'),(7,8,7267,'Grovel'),(7,8,7340,'Language Gnomish'),(7,8,7355,'Stuck'),(7,8,8386,'Attacking'),(7,8,9078,'Cloth'),(7,8,9125,'Generic'),(7,8,20589,'Escape Artist'),(7,8,20591,'Expansive Mind'),(7,8,20592,'Arcane Resistance'),(7,8,20593,'Engineering Specialization'),(7,8,21651,'Opening'),(7,8,21652,'Closing'),(7,8,22027,'Remove Insignia'),(7,8,22810,'Opening - No Text'),(7,8,45927,'Summon Friend'),(7,8,61437,'Opening'),(7,9,81,'Dodge'),(7,9,203,'Unarmed'),(7,9,204,'Defense'),(7,9,522,'SPELLDEFENSE (DND)'),(7,9,668,'Language Common'),(7,9,686,'Shadow Bolt'),(7,9,687,'Demon Skin'),(7,9,1180,'Daggers'),(7,9,1843,'Disarm'),(7,9,2382,'Generic'),(7,9,2479,'Honorless Target'),(7,9,3050,'Detect'),(7,9,3365,'Opening'),(7,9,5009,'Wands'),(7,9,5019,'Shoot'),(7,9,6233,'Closing'),(7,9,6246,'Closing'),(7,9,6247,'Opening'),(7,9,6477,'Opening'),(7,9,6478,'Opening'),(7,9,6603,'Attack'),(7,9,7266,'Duel'),(7,9,7267,'Grovel'),(7,9,7340,'Language Gnomish'),(7,9,7355,'Stuck'),(7,9,8386,'Attacking'),(7,9,9078,'Cloth'),(7,9,9125,'Generic'),(7,9,20589,'Escape Artist'),(7,9,20591,'Expansive Mind'),(7,9,20592,'Arcane Resistance'),(7,9,20593,'Engineering Specialization'),(7,9,21651,'Opening'),(7,9,21652,'Closing'),(7,9,22027,'Remove Insignia'),(7,9,22810,'Opening - No Text'),(7,9,45927,'Summon Friend'),(7,9,61437,'Opening'),(8,1,78,'Heroic Strike'),(8,1,81,'Dodge'),(8,1,107,'Block'),(8,1,196,'One-Handed Axes'),(8,1,203,'Unarmed'),(8,1,204,'Defense'),(8,1,522,'SPELLDEFENSE (DND)'),(8,1,669,'Language Orcish'),(8,1,1180,'Daggers'),(8,1,1843,'Disarm'),(8,1,2382,'Generic'),(8,1,2457,'Battle Stance'),(8,1,2479,'Honorless Target'),(8,1,2567,'Thrown'),(8,1,2764,'Throw'),(8,1,3050,'Detect'),(8,1,3365,'Opening'),(8,1,5301,'Defensive State (DND)'),(8,1,6233,'Closing'),(8,1,6246,'Closing'),(8,1,6247,'Opening'),(8,1,6477,'Opening'),(8,1,6478,'Opening'),(8,1,6603,'Attack'),(8,1,7266,'Duel'),(8,1,7267,'Grovel'),(8,1,7341,'Language Troll'),(8,1,7355,'Stuck'),(8,1,8386,'Attacking'),(8,1,8737,'Mail'),(8,1,9077,'Leather'),(8,1,9078,'Cloth'),(8,1,9116,'Shield'),(8,1,9125,'Generic'),(8,1,20555,'Regeneration'),(8,1,20557,'Beast Slaying'),(8,1,20558,'Throwing Specialization'),(8,1,21651,'Opening'),(8,1,21652,'Closing'),(8,1,22027,'Remove Insignia'),(8,1,22810,'Opening - No Text'),(8,1,26290,'Bow Specialization'),(8,1,26297,'Berserking'),(8,1,32215,'Victorious State'),(8,1,45927,'Summon Friend'),(8,1,58943,'Da Voodoo Shuffle'),(8,1,61437,'Opening'),(8,3,75,'Auto Shot'),(8,3,81,'Dodge'),(8,3,196,'One-Handed Axes'),(8,3,203,'Unarmed'),(8,3,204,'Defense'),(8,3,264,'Bows'),(8,3,522,'SPELLDEFENSE (DND)'),(8,3,669,'Language Orcish'),(8,3,1843,'Disarm'),(8,3,2382,'Generic'),(8,3,2479,'Honorless Target'),(8,3,2973,'Raptor Strike'),(8,3,3050,'Detect'),(8,3,3365,'Opening'),(8,3,6233,'Closing'),(8,3,6246,'Closing'),(8,3,6247,'Opening'),(8,3,6477,'Opening'),(8,3,6478,'Opening'),(8,3,6603,'Attack'),(8,3,7266,'Duel'),(8,3,7267,'Grovel'),(8,3,7341,'Language Troll'),(8,3,7355,'Stuck'),(8,3,8386,'Attacking'),(8,3,9077,'Leather'),(8,3,9078,'Cloth'),(8,3,9125,'Generic'),(8,3,13358,'Defensive State (DND)'),(8,3,26297,'Berserking'),(8,3,20555,'Regeneration'),(8,3,20557,'Beast Slaying'),(8,3,20558,'Throwing Specialization'),(8,3,21651,'Opening'),(8,3,21652,'Closing'),(8,3,22027,'Remove Insignia'),(8,3,22810,'Opening - No Text'),(8,3,24949,'Defensive State 2 (DND)'),(8,3,26290,'Bow Specialization'),(8,3,34082,'Advantaged State (DND)'),(8,3,45927,'Summon Friend'),(8,3,58943,'Da Voodoo Shuffle'),(8,3,61437,'Opening'),(8,4,81,'Dodge'),(8,4,203,'Unarmed'),(8,4,204,'Defense'),(8,4,522,'SPELLDEFENSE (DND)'),(8,4,669,'Language Orcish'),(8,4,1180,'Daggers'),(8,4,1752,'Sinister Strike'),(8,4,1843,'Disarm'),(8,4,2098,'Eviscerate'),(8,4,2382,'Generic'),(8,4,2479,'Honorless Target'),(8,4,2567,'Thrown'),(8,4,2764,'Throw'),(8,4,3050,'Detect'),(8,4,3365,'Opening'),(8,4,6233,'Closing'),(8,4,6246,'Closing'),(8,4,6247,'Opening'),(8,4,6477,'Opening'),(8,4,6478,'Opening'),(8,4,6603,'Attack'),(8,4,7266,'Duel'),(8,4,7267,'Grovel'),(8,4,7341,'Language Troll'),(8,4,7355,'Stuck'),(8,4,8386,'Attacking'),(8,4,9077,'Leather'),(8,4,9078,'Cloth'),(8,4,9125,'Generic'),(8,4,16092,'Defensive State (DND)'),(8,4,20555,'Regeneration'),(8,4,20557,'Beast Slaying'),(8,4,20558,'Throwing Specialization'),(8,4,21184,'Rogue Passive (DND)'),(8,4,21651,'Opening'),(8,4,21652,'Closing'),(8,4,22027,'Remove Insignia'),(8,4,22810,'Opening - No Text'),(8,4,26290,'Bow Specialization'),(8,4,26297,'Berserking'),(8,4,45927,'Summon Friend'),(8,4,58943,'Da Voodoo Shuffle'),(8,4,61437,'Opening'),(8,5,81,'Dodge'),(8,5,198,'One-Handed Maces'),(8,5,203,'Unarmed'),(8,5,204,'Defense'),(8,5,522,'SPELLDEFENSE (DND)'),(8,5,585,'Smite'),(8,5,669,'Language Orcish'),(8,5,1843,'Disarm'),(8,5,2050,'Lesser Heal'),(8,5,2382,'Generic'),(8,5,2479,'Honorless Target'),(8,5,3050,'Detect'),(8,5,3365,'Opening'),(8,5,5009,'Wands'),(8,5,5019,'Shoot'),(8,5,6233,'Closing'),(8,5,6246,'Closing'),(8,5,6247,'Opening'),(8,5,6477,'Opening'),(8,5,6478,'Opening'),(8,5,6603,'Attack'),(8,5,7266,'Duel'),(8,5,7267,'Grovel'),(8,5,7341,'Language Troll'),(8,5,7355,'Stuck'),(8,5,8386,'Attacking'),(8,5,9078,'Cloth'),(8,5,9125,'Generic'),(8,5,26297,'Berserking'),(8,5,20555,'Regeneration'),(8,5,20557,'Beast Slaying'),(8,5,20558,'Throwing Specialization'),(8,5,21651,'Opening'),(8,5,21652,'Closing'),(8,5,22027,'Remove Insignia'),(8,5,22810,'Opening - No Text'),(8,5,26290,'Bow Specialization'),(8,5,45927,'Summon Friend'),(8,5,58943,'Da Voodoo Shuffle'),(8,5,61437,'Opening'),(8,6,81,'Dodge'),(8,6,196,'One-Handed Axes'),(8,6,197,'Two-Handed Axes'),(8,6,200,'Polearms'),(8,6,201,'One-Handed Swords'),(8,6,202,'Two-Handed Swords'),(8,6,203,'Unarmed'),(8,6,204,'Defense'),(8,6,522,'SPELLDEFENSE (DND)'),(8,6,669,'Language Orcish'),(8,6,674,'Dual Wield'),(8,6,750,'Plate Mail'),(8,6,1843,'Disarm'),(8,6,2382,'Generic'),(8,6,2479,'Honorless Target'),(8,6,3050,'Detect'),(8,6,3127,'Parry'),(8,6,3275,'Linen Bandage'),(8,6,3276,'Heavy Linen Bandage'),(8,6,3277,'Wool Bandage'),(8,6,3278,'Heavy Wool Bandage'),(8,6,3365,'Opening'),(8,6,6233,'Closing'),(8,6,6246,'Closing'),(8,6,6247,'Opening'),(8,6,6477,'Opening'),(8,6,6478,'Opening'),(8,6,6603,'Attack'),(8,6,7266,'Duel'),(8,6,7267,'Grovel'),(8,6,7341,'Language Troll'),(8,6,7355,'Stuck'),(8,6,7928,'Silk Bandage'),(8,6,7929,'Heavy Silk Bandage'),(8,6,7934,'Anti-Venom'),(8,6,8386,'Attacking'),(8,6,8737,'Mail'),(8,6,9077,'Leather'),(8,6,9078,'Cloth'),(8,6,9125,'Generic'),(8,6,10840,'Mageweave Bandage'),(8,6,10841,'Heavy Mageweave Bandage'),(8,6,10846,'First Aid'),(8,6,18629,'Runecloth Bandage'),(8,6,18630,'Heavy Runecloth Bandage'),(8,6,20555,'Regeneration'),(8,6,20557,'Beast Slaying'),(8,6,20558,'Throwing Specialization'),(8,6,21651,'Opening'),(8,6,21652,'Closing'),(8,6,22027,'Remove Insignia'),(8,6,22810,'Opening - No Text'),(8,6,26290,'Bow Specialization'),(8,6,33391,'Journeyman Riding'),(8,6,45462,'Plague Strike'),(8,6,45477,'Icy Touch'),(8,6,45902,'Blood Strike'),(8,6,45903,'Offensive State (DND)'),(8,6,45927,'Summon Friend'),(8,6,47541,'Death Coil'),(8,6,48266,'Blood Presence'),(8,6,49410,'Forceful Deflection'),(8,6,49576,'Death Grip'),(8,6,26297,'Berserking'),(8,6,52665,'Sigil'),(8,6,58943,'Da Voodoo Shuffle'),(8,6,59879,'Blood Plague'),(8,6,59921,'Frost Fever'),(8,6,61437,'Opening'),(8,6,61455,'Runic Focus'),(8,7,81,'Dodge'),(8,7,107,'Block'),(8,7,198,'One-Handed Maces'),(8,7,203,'Unarmed'),(8,7,204,'Defense'),(8,7,227,'Staves'),(8,7,331,'Healing Wave'),(8,7,403,'Lightning Bolt'),(8,7,522,'SPELLDEFENSE (DND)'),(8,7,669,'Language Orcish'),(8,7,1843,'Disarm'),(8,7,2382,'Generic'),(8,7,2479,'Honorless Target'),(8,7,3050,'Detect'),(8,7,3365,'Opening'),(8,7,6233,'Closing'),(8,7,6246,'Closing'),(8,7,6247,'Opening'),(8,7,6477,'Opening'),(8,7,6478,'Opening'),(8,7,6603,'Attack'),(8,7,7266,'Duel'),(8,7,7267,'Grovel'),(8,7,7341,'Language Troll'),(8,7,7355,'Stuck'),(8,7,8386,'Attacking'),(8,7,9077,'Leather'),(8,7,9078,'Cloth'),(8,7,9116,'Shield'),(8,7,9125,'Generic'),(8,7,26297,'Berserking'),(8,7,20555,'Regeneration'),(8,7,20557,'Beast Slaying'),(8,7,20558,'Throwing Specialization'),(8,7,21651,'Opening'),(8,7,21652,'Closing'),(8,7,22027,'Remove Insignia'),(8,7,22810,'Opening - No Text'),(8,7,26290,'Bow Specialization'),(8,7,27763,'Totem'),(8,7,45927,'Summon Friend'),(8,7,58943,'Da Voodoo Shuffle'),(8,7,61437,'Opening'),(8,8,81,'Dodge'),(8,8,133,'Fireball'),(8,8,168,'Frost Armor'),(8,8,203,'Unarmed'),(8,8,204,'Defense'),(8,8,227,'Staves'),(8,8,522,'SPELLDEFENSE (DND)'),(8,8,669,'Language Orcish'),(8,8,1843,'Disarm'),(8,8,2382,'Generic'),(8,8,2479,'Honorless Target'),(8,8,3050,'Detect'),(8,8,3365,'Opening'),(8,8,5009,'Wands'),(8,8,5019,'Shoot'),(8,8,6233,'Closing'),(8,8,6246,'Closing'),(8,8,6247,'Opening'),(8,8,6477,'Opening'),(8,8,6478,'Opening'),(8,8,6603,'Attack'),(8,8,7266,'Duel'),(8,8,7267,'Grovel'),(8,8,7341,'Language Troll'),(8,8,7355,'Stuck'),(8,8,8386,'Attacking'),(8,8,9078,'Cloth'),(8,8,9125,'Generic'),(8,8,26297,'Berserking'),(8,8,20555,'Regeneration'),(8,8,20557,'Beast Slaying'),(8,8,20558,'Throwing Specialization'),(8,8,21651,'Opening'),(8,8,21652,'Closing'),(8,8,22027,'Remove Insignia'),(8,8,22810,'Opening - No Text'),(8,8,26290,'Bow Specialization'),(8,8,45927,'Summon Friend'),(8,8,58943,'Da Voodoo Shuffle'),(8,8,61437,'Opening'),(10,2,81,'Dodge'),(10,2,107,'Block'),(10,2,201,'One-Handed Swords'),(10,2,202,'Two-Handed Swords'),(10,2,203,'Unarmed'),(10,2,204,'Defense'),(10,2,522,'SPELLDEFENSE (DND)'),(10,2,635,'Holy Light'),(10,2,669,'Language Orcish'),(10,2,813,'Language Thalassian'),(10,2,822,'Magic Resistance'),(10,2,2382,'Generic'),(10,2,2479,'Honorless Target'),(10,2,3050,'Detect'),(10,2,3365,'Opening'),(10,2,6233,'Closing'),(10,2,6246,'Closing'),(10,2,6247,'Opening'),(10,2,6477,'Opening'),(10,2,6478,'Opening'),(10,2,6603,'Attack'),(10,2,7266,'Duel'),(10,2,7267,'Grovel'),(10,2,7355,'Stuck'),(10,2,8386,'Attacking'),(10,2,8737,'Mail'),(10,2,9077,'Leather'),(10,2,9078,'Cloth'),(10,2,9116,'Shield'),(10,2,9125,'Generic'),(10,2,21084,'Seal of Righteousness'),(10,2,21651,'Opening'),(10,2,21652,'Closing'),(10,2,22027,'Remove Insignia'),(10,2,22810,'Opening - No Text'),(10,2,27762,'Libram'),(10,2,28730,'Arcane Torrent'),(10,2,28877,'Arcane Affinity'),(10,3,75,'Auto Shot'),(10,3,81,'Dodge'),(10,3,203,'Unarmed'),(10,3,204,'Defense'),(10,3,264,'Bows'),(10,3,522,'SPELLDEFENSE (DND)'),(10,3,669,'Language Orcish'),(10,3,813,'Language Thalassian'),(10,3,822,'Magic Resistance'),(10,3,1180,'Daggers'),(10,3,2382,'Generic'),(10,3,2479,'Honorless Target'),(10,3,2973,'Raptor Strike'),(10,3,3050,'Detect'),(10,3,3365,'Opening'),(10,3,6233,'Closing'),(10,3,6246,'Closing'),(10,3,6247,'Opening'),(10,3,6477,'Opening'),(10,3,6478,'Opening'),(10,3,6603,'Attack'),(10,3,7266,'Duel'),(10,3,7267,'Grovel'),(10,3,7355,'Stuck'),(10,3,8386,'Attacking'),(10,3,9077,'Leather'),(10,3,9078,'Cloth'),(10,3,9125,'Generic'),(10,3,13358,'Defensive State (DND)'),(10,3,21651,'Opening'),(10,3,21652,'Closing'),(10,3,22027,'Remove Insignia'),(10,3,22810,'Opening - No Text'),(10,3,24949,'Defensive State 2 (DND)'),(10,3,28730,'Arcane Torrent'),(10,3,28877,'Arcane Affinity'),(10,3,34082,'Advantaged State (DND)'),(10,4,81,'Dodge'),(10,4,203,'Unarmed'),(10,4,204,'Defense'),(10,4,522,'SPELLDEFENSE (DND)'),(10,4,669,'Language Orcish'),(10,4,813,'Language Thalassian'),(10,4,822,'Magic Resistance'),(10,4,1180,'Daggers'),(10,4,1752,'Sinister Strike'),(10,4,2098,'Eviscerate'),(10,4,2382,'Generic'),(10,4,2479,'Honorless Target'),(10,4,2567,'Thrown'),(10,4,2764,'Throw'),(10,4,3050,'Detect'),(10,4,3365,'Opening'),(10,4,6233,'Closing'),(10,4,6246,'Closing'),(10,4,6247,'Opening'),(10,4,6477,'Opening'),(10,4,6478,'Opening'),(10,4,6603,'Attack'),(10,4,7266,'Duel'),(10,4,7267,'Grovel'),(10,4,7355,'Stuck'),(10,4,8386,'Attacking'),(10,4,9077,'Leather'),(10,4,9078,'Cloth'),(10,4,9125,'Generic'),(10,4,16092,'Defensive State (DND)'),(10,4,21184,'Rogue Passive (DND)'),(10,4,21651,'Opening'),(10,4,21652,'Closing'),(10,4,22027,'Remove Insignia'),(10,4,22810,'Opening - No Text'),(10,4,25046,'Arcane Torrent'),(10,4,28877,'Arcane Affinity'),(10,5,81,'Dodge'),(10,5,198,'One-Handed Maces'),(10,5,203,'Unarmed'),(10,5,204,'Defense'),(10,5,522,'SPELLDEFENSE (DND)'),(10,5,585,'Smite'),(10,5,669,'Language Orcish'),(10,5,813,'Language Thalassian'),(10,5,822,'Magic Resistance'),(10,5,2050,'Lesser Heal'),(10,5,2382,'Generic'),(10,5,2479,'Honorless Target'),(10,5,3050,'Detect'),(10,5,3365,'Opening'),(10,5,5009,'Wands'),(10,5,5019,'Shoot'),(10,5,6233,'Closing'),(10,5,6246,'Closing'),(10,5,6247,'Opening'),(10,5,6477,'Opening'),(10,5,6478,'Opening'),(10,5,6603,'Attack'),(10,5,7266,'Duel'),(10,5,7267,'Grovel'),(10,5,7355,'Stuck'),(10,5,8386,'Attacking'),(10,5,9078,'Cloth'),(10,5,9125,'Generic'),(10,5,21651,'Opening'),(10,5,21652,'Closing'),(10,5,22027,'Remove Insignia'),(10,5,22810,'Opening - No Text'),(10,5,28730,'Arcane Torrent'),(10,5,28877,'Arcane Affinity'),(10,6,81,'Dodge'),(10,6,196,'One-Handed Axes'),(10,6,197,'Two-Handed Axes'),(10,6,200,'Polearms'),(10,6,201,'One-Handed Swords'),(10,6,202,'Two-Handed Swords'),(10,6,203,'Unarmed'),(10,6,204,'Defense'),(10,6,522,'SPELLDEFENSE (DND)'),(10,6,669,'Language Orcish'),(10,6,674,'Dual Wield'),(10,6,750,'Plate Mail'),(10,6,813,'Language Thalassian'),(10,6,822,'Magic Resistance'),(10,6,1843,'Disarm'),(10,6,2382,'Generic'),(10,6,2479,'Honorless Target'),(10,6,3050,'Detect'),(10,6,3127,'Parry'),(10,6,3275,'Linen Bandage'),(10,6,3276,'Heavy Linen Bandage'),(10,6,3277,'Wool Bandage'),(10,6,3278,'Heavy Wool Bandage'),(10,6,3365,'Opening'),(10,6,6233,'Closing'),(10,6,6246,'Closing'),(10,6,6247,'Opening'),(10,6,6477,'Opening'),(10,6,6478,'Opening'),(10,6,6603,'Attack'),(10,6,7266,'Duel'),(10,6,7267,'Grovel'),(10,6,7355,'Stuck'),(10,6,7928,'Silk Bandage'),(10,6,7929,'Heavy Silk Bandage'),(10,6,7934,'Anti-Venom'),(10,6,8386,'Attacking'),(10,6,8737,'Mail'),(10,6,9077,'Leather'),(10,6,9078,'Cloth'),(10,6,9125,'Generic'),(10,6,10840,'Mageweave Bandage'),(10,6,10841,'Heavy Mageweave Bandage'),(10,6,10846,'First Aid'),(10,6,18629,'Runecloth Bandage'),(10,6,18630,'Heavy Runecloth Bandage'),(10,6,21651,'Opening'),(10,6,21652,'Closing'),(10,6,22027,'Remove Insignia'),(10,6,22810,'Opening - No Text'),(10,6,28877,'Arcane Affinity'),(10,6,33391,'Journeyman Riding'),(10,6,45462,'Plague Strike'),(10,6,45477,'Icy Touch'),(10,6,45902,'Blood Strike'),(10,6,45903,'Offensive State (DND)'),(10,6,45927,'Summon Friend'),(10,6,47541,'Death Coil'),(10,6,48266,'Blood Presence'),(10,6,49410,'Forceful Deflection'),(10,6,49576,'Death Grip'),(10,6,50613,'Arcane Torrent'),(10,6,52665,'Sigil'),(10,6,59879,'Blood Plague'),(10,6,59921,'Frost Fever'),(10,6,61437,'Opening'),(10,6,61455,'Runic Focus'),(10,8,81,'Dodge'),(10,8,133,'Fireball'),(10,8,168,'Frost Armor'),(10,8,203,'Unarmed'),(10,8,204,'Defense'),(10,8,227,'Staves'),(10,8,522,'SPELLDEFENSE (DND)'),(10,8,669,'Language Orcish'),(10,8,813,'Language Thalassian'),(10,8,822,'Magic Resistance'),(10,8,2382,'Generic'),(10,8,2479,'Honorless Target'),(10,8,3050,'Detect'),(10,8,3365,'Opening'),(10,8,5009,'Wands'),(10,8,5019,'Shoot'),(10,8,6233,'Closing'),(10,8,6246,'Closing'),(10,8,6247,'Opening'),(10,8,6477,'Opening'),(10,8,6478,'Opening'),(10,8,6603,'Attack'),(10,8,7266,'Duel'),(10,8,7267,'Grovel'),(10,8,7355,'Stuck'),(10,8,8386,'Attacking'),(10,8,9078,'Cloth'),(10,8,9125,'Generic'),(10,8,21651,'Opening'),(10,8,21652,'Closing'),(10,8,22027,'Remove Insignia'),(10,8,22810,'Opening - No Text'),(10,8,28730,'Arcane Torrent'),(10,8,28877,'Arcane Affinity'),(10,9,81,'Dodge'),(10,9,203,'Unarmed'),(10,9,204,'Defense'),(10,9,522,'SPELLDEFENSE (DND)'),(10,9,669,'Language Orcish'),(10,9,686,'Shadow Bolt'),(10,9,687,'Demon Skin'),(10,9,813,'Language Thalassian'),(10,9,822,'Magic Resistance'),(10,9,1180,'Daggers'),(10,9,2382,'Generic'),(10,9,2479,'Honorless Target'),(10,9,3050,'Detect'),(10,9,3365,'Opening'),(10,9,5009,'Wands'),(10,9,5019,'Shoot'),(10,9,6233,'Closing'),(10,9,6246,'Closing'),(10,9,6247,'Opening'),(10,9,6477,'Opening'),(10,9,6478,'Opening'),(10,9,6603,'Attack'),(10,9,7266,'Duel'),(10,9,7267,'Grovel'),(10,9,7355,'Stuck'),(10,9,8386,'Attacking'),(10,9,9078,'Cloth'),(10,9,9125,'Generic'),(10,9,21651,'Opening'),(10,9,21652,'Closing'),(10,9,22027,'Remove Insignia'),(10,9,22810,'Opening - No Text'),(10,9,28730,'Arcane Torrent'),(10,9,28877,'Arcane Affinity'),(11,1,78,'Heroic Strike'),(11,1,81,'Dodge'),(11,1,107,'Block'),(11,1,198,'One-Handed Maces'),(11,1,201,'One-Handed Swords'),(11,1,203,'Unarmed'),(11,1,204,'Defense'),(11,1,522,'SPELLDEFENSE (DND)'),(11,1,668,'Language Common'),(11,1,1843,'Disarm'),(11,1,2382,'Generic'),(11,1,2457,'Battle Stance'),(11,1,2479,'Honorless Target'),(11,1,3050,'Detect'),(11,1,3365,'Opening'),(11,1,5301,'Defensive State (DND)'),(11,1,6233,'Closing'),(11,1,6246,'Closing'),(11,1,6247,'Opening'),(11,1,6477,'Opening'),(11,1,6478,'Opening'),(11,1,6562,'Heroic Presence'),(11,1,6603,'Attack'),(11,1,7266,'Duel'),(11,1,7267,'Grovel'),(11,1,7355,'Stuck'),(11,1,8386,'Attacking'),(11,1,8737,'Mail'),(11,1,9077,'Leather'),(11,1,9078,'Cloth'),(11,1,9116,'Shield'),(11,1,9125,'Generic'),(11,1,21651,'Opening'),(11,1,21652,'Closing'),(11,1,22027,'Remove Insignia'),(11,1,22810,'Opening - No Text'),(11,1,28875,'Gemcutting'),(11,1,28880,'Gift of the Naaru'),(11,1,29932,'Language Draenei'),(11,1,32215,'Victorious State'),(11,1,45927,'Summon Friend'),(11,1,59221,'Shadow Resistance'),(11,1,61437,'Opening'),(11,2,81,'Dodge'),(11,2,107,'Block'),(11,2,198,'One-Handed Maces'),(11,2,199,'Two-Handed Maces'),(11,2,203,'Unarmed'),(11,2,204,'Defense'),(11,2,522,'SPELLDEFENSE (DND)'),(11,2,635,'Holy Light'),(11,2,668,'Language Common'),(11,2,1843,'Disarm'),(11,2,2382,'Generic'),(11,2,2479,'Honorless Target'),(11,2,3050,'Detect'),(11,2,3365,'Opening'),(11,2,6233,'Closing'),(11,2,6246,'Closing'),(11,2,6247,'Opening'),(11,2,6477,'Opening'),(11,2,6478,'Opening'),(11,2,6562,'Heroic Presence'),(11,2,6603,'Attack'),(11,2,7266,'Duel'),(11,2,7267,'Grovel'),(11,2,7355,'Stuck'),(11,2,8386,'Attacking'),(11,2,8737,'Mail'),(11,2,9077,'Leather'),(11,2,9078,'Cloth'),(11,2,9116,'Shield'),(11,2,9125,'Generic'),(11,2,21084,'Seal of Righteousness'),(11,2,21651,'Opening'),(11,2,21652,'Closing'),(11,2,22027,'Remove Insignia'),(11,2,22810,'Opening - No Text'),(11,2,27762,'Libram'),(11,2,28875,'Gemcutting'),(11,2,29932,'Language Draenei'),(11,2,45927,'Summon Friend'),(11,2,59221,'Shadow Resistance'),(11,2,59542,'Gift of the Naaru'),(11,2,61437,'Opening'),(11,3,75,'Auto Shot'),(11,3,81,'Dodge'),(11,3,201,'One-Handed Swords'),(11,3,203,'Unarmed'),(11,3,204,'Defense'),(11,3,522,'SPELLDEFENSE (DND)'),(11,3,668,'Language Common'),(11,3,1843,'Disarm'),(11,3,2382,'Generic'),(11,3,2479,'Honorless Target'),(11,3,2973,'Raptor Strike'),(11,3,3050,'Detect'),(11,3,3365,'Opening'),(11,3,5011,'Crossbows'),(11,3,6233,'Closing'),(11,3,6246,'Closing'),(11,3,6247,'Opening'),(11,3,6477,'Opening'),(11,3,6478,'Opening'),(11,3,6562,'Heroic Presence'),(11,3,6603,'Attack'),(11,3,7266,'Duel'),(11,3,7267,'Grovel'),(11,3,7355,'Stuck'),(11,3,8386,'Attacking'),(11,3,9077,'Leather'),(11,3,9078,'Cloth'),(11,3,9125,'Generic'),(11,3,13358,'Defensive State (DND)'),(11,3,21651,'Opening'),(11,3,21652,'Closing'),(11,3,22027,'Remove Insignia'),(11,3,22810,'Opening - No Text'),(11,3,24949,'Defensive State 2 (DND)'),(11,3,28875,'Gemcutting'),(11,3,29932,'Language Draenei'),(11,3,34082,'Advantaged State (DND)'),(11,3,45927,'Summon Friend'),(11,3,59221,'Shadow Resistance'),(11,3,59543,'Gift of the Naaru'),(11,3,61437,'Opening'),(11,5,81,'Dodge'),(11,5,198,'One-Handed Maces'),(11,5,203,'Unarmed'),(11,5,204,'Defense'),(11,5,522,'SPELLDEFENSE (DND)'),(11,5,585,'Smite'),(11,5,668,'Language Common'),(11,5,1843,'Disarm'),(11,5,2050,'Lesser Heal'),(11,5,2382,'Generic'),(11,5,2479,'Honorless Target'),(11,5,3050,'Detect'),(11,5,3365,'Opening'),(11,5,5009,'Wands'),(11,5,5019,'Shoot'),(11,5,6233,'Closing'),(11,5,6246,'Closing'),(11,5,6247,'Opening'),(11,5,6477,'Opening'),(11,5,6478,'Opening'),(11,5,6603,'Attack'),(11,5,7266,'Duel'),(11,5,7267,'Grovel'),(11,5,7355,'Stuck'),(11,5,8386,'Attacking'),(11,5,9078,'Cloth'),(11,5,9125,'Generic'),(11,5,21651,'Opening'),(11,5,21652,'Closing'),(11,5,22027,'Remove Insignia'),(11,5,22810,'Opening - No Text'),(11,5,28875,'Gemcutting'),(11,5,28878,'Inspiring Presence'),(11,5,29932,'Language Draenei'),(11,5,45927,'Summon Friend'),(11,5,59221,'Shadow Resistance'),(11,5,59544,'Gift of the Naaru'),(11,5,61437,'Opening'),(11,6,81,'Dodge'),(11,6,196,'One-Handed Axes'),(11,6,197,'Two-Handed Axes'),(11,6,200,'Polearms'),(11,6,201,'One-Handed Swords'),(11,6,202,'Two-Handed Swords'),(11,6,203,'Unarmed'),(11,6,204,'Defense'),(11,6,522,'SPELLDEFENSE (DND)'),(11,6,668,'Language Common'),(11,6,674,'Dual Wield'),(11,6,750,'Plate Mail'),(11,6,1843,'Disarm'),(11,6,2382,'Generic'),(11,6,2479,'Honorless Target'),(11,6,3050,'Detect'),(11,6,3127,'Parry'),(11,6,3275,'Linen Bandage'),(11,6,3276,'Heavy Linen Bandage'),(11,6,3277,'Wool Bandage'),(11,6,3278,'Heavy Wool Bandage'),(11,6,3365,'Opening'),(11,6,6233,'Closing'),(11,6,6246,'Closing'),(11,6,6247,'Opening'),(11,6,6477,'Opening'),(11,6,6478,'Opening'),(11,6,6562,'Heroic Presence'),(11,6,6603,'Attack'),(11,6,7266,'Duel'),(11,6,7267,'Grovel'),(11,6,7355,'Stuck'),(11,6,7928,'Silk Bandage'),(11,6,7929,'Heavy Silk Bandage'),(11,6,7934,'Anti-Venom'),(11,6,8386,'Attacking'),(11,6,8737,'Mail'),(11,6,9077,'Leather'),(11,6,9078,'Cloth'),(11,6,9125,'Generic'),(11,6,10840,'Mageweave Bandage'),(11,6,10841,'Heavy Mageweave Bandage'),(11,6,10846,'First Aid'),(11,6,18629,'Runecloth Bandage'),(11,6,18630,'Heavy Runecloth Bandage'),(11,6,21651,'Opening'),(11,6,21652,'Closing'),(11,6,22027,'Remove Insignia'),(11,6,22810,'Opening - No Text'),(11,6,28875,'Gemcutting'),(11,6,29932,'Language Draenei'),(11,6,33391,'Journeyman Riding'),(11,6,45462,'Plague Strike'),(11,6,45477,'Icy Touch'),(11,6,45902,'Blood Strike'),(11,6,45903,'Offensive State (DND)'),(11,6,45927,'Summon Friend'),(11,6,47541,'Death Coil'),(11,6,48266,'Blood Presence'),(11,6,49410,'Forceful Deflection'),(11,6,49576,'Death Grip'),(11,6,52665,'Sigil'),(11,6,59221,'Shadow Resistance'),(11,6,59539,'Shadow Resistance'),(11,6,59545,'Gift of the Naaru'),(11,6,59879,'Blood Plague'),(11,6,59921,'Frost Fever'),(11,6,61437,'Opening'),(11,6,61455,'Runic Focus'),(11,7,81,'Dodge'),(11,7,107,'Block'),(11,7,198,'One-Handed Maces'),(11,7,203,'Unarmed'),(11,7,204,'Defense'),(11,7,227,'Staves'),(11,7,331,'Healing Wave'),(11,7,403,'Lightning Bolt'),(11,7,522,'SPELLDEFENSE (DND)'),(11,7,668,'Language Common'),(11,7,1843,'Disarm'),(11,7,2382,'Generic'),(11,7,2479,'Honorless Target'),(11,7,3050,'Detect'),(11,7,3365,'Opening'),(11,7,6233,'Closing'),(11,7,6246,'Closing'),(11,7,6247,'Opening'),(11,7,6477,'Opening'),(11,7,6478,'Opening'),(11,7,6603,'Attack'),(11,7,7266,'Duel'),(11,7,7267,'Grovel'),(11,7,7355,'Stuck'),(11,7,8386,'Attacking'),(11,7,9077,'Leather'),(11,7,9078,'Cloth'),(11,7,9116,'Shield'),(11,7,9125,'Generic'),(11,7,21651,'Opening'),(11,7,21652,'Closing'),(11,7,22027,'Remove Insignia'),(11,7,22810,'Opening - No Text'),(11,7,27763,'Totem'),(11,7,28875,'Gemcutting'),(11,7,28878,'Inspiring Presence'),(11,7,29932,'Language Draenei'),(11,7,45927,'Summon Friend'),(11,7,59221,'Shadow Resistance'),(11,7,59547,'Gift of the Naaru'),(11,7,61437,'Opening'),(11,8,81,'Dodge'),(11,8,133,'Fireball'),(11,8,168,'Frost Armor'),(11,8,203,'Unarmed'),(11,8,204,'Defense'),(11,8,227,'Staves'),(11,8,522,'SPELLDEFENSE (DND)'),(11,8,668,'Language Common'),(11,8,1843,'Disarm'),(11,8,2382,'Generic'),(11,8,2479,'Honorless Target'),(11,8,3050,'Detect'),(11,8,3365,'Opening'),(11,8,5009,'Wands'),(11,8,5019,'Shoot'),(11,8,6233,'Closing'),(11,8,6246,'Closing'),(11,8,6247,'Opening'),(11,8,6477,'Opening'),(11,8,6478,'Opening'),(11,8,6603,'Attack'),(11,8,7266,'Duel'),(11,8,7267,'Grovel'),(11,8,7355,'Stuck'),(11,8,8386,'Attacking'),(11,8,9078,'Cloth'),(11,8,9125,'Generic'),(11,8,21651,'Opening'),(11,8,21652,'Closing'),(11,8,22027,'Remove Insignia'),(11,8,22810,'Opening - No Text'),(11,8,28875,'Gemcutting'),(11,8,28878,'Inspiring Presence'),(11,8,29932,'Language Draenei'),(11,8,45927,'Summon Friend'),(11,8,59221,'Shadow Resistance'),(11,8,59548,'Gift of the Naaru'),(11,8,61437,'Opening'),(7,9,58284,'Chaos Bolt Passive'),(10,9,58284,'Chaos Bolt Passive'),(11,2,60091,'Judgement Anti-Parry/Dodge Passive'),(10,2,60091,'Judgement Anti-Parry/Dodge Passive'),(3,2,60091,'Judgement Anti-Parry/Dodge Passive'),(1,2,60091,'Judgement Anti-Parry/Dodge Passive'),(0,6,56816,'Rune Strike'),(1,1,202, 'Two-Handed Swords'),(4,1,202, 'Two-Handed Swords'),(7,1,202, 'Two-Handed Swords'),(8,1,202, 'Two-Handed Swords'),(11,1,202, 'Two-Handed Swords'),(2,3,197, 'Two-Handed Axes'),(3,3,197, 'Two-Handed Axes'),(4,3,197, 'Two-Handed Axes'),(6,3,197, 'Two-Handed Axes'),(8,3,197, 'Two-Handed Axes'),(10,3,197, 'Two-Handed Axes'),(11,3,197, 'Two-Handed Axes'),(1,4,674, 'Dual Wield'),(2,4,674, 'Dual Wield'),(3,4,674, 'Dual Wield'),(4,4,674, 'Dual Wield'),(5,4,674, 'Dual Wield'),(7,4,674, 'Dual Wield'),(8,4,674, 'Dual Wield'),(10,4,674, 'Dual Wield'),(1,5,227, 'Staves'),(3,5,227, 'Staves'),(4,5,227, 'Staves'),(5,5,227, 'Staves'),(8,5,227, 'Staves'),(10,5,227, 'Staves'),(11,5,227, 'Staves'),(1,9,227, 'Staves'),(2,9,227, 'Staves'),(5,9,227, 'Staves'),(7,9,227, 'Staves'),(10,9,227, 'Staves'); /*!40000 ALTER TABLE `playercreateinfo_spell` ENABLE KEYS */; UNLOCK TABLES; @@ -4206,6 +4258,61 @@ LOCK TABLES `quest_end_scripts` WRITE; UNLOCK TABLES; -- +-- Table structure for table `quest_poi` +-- + +DROP TABLE IF EXISTS `quest_poi`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `quest_poi` ( + `questId` int(10) UNSIGNED NOT NULL DEFAULT '0', + `id` int(10) UNSIGNED NOT NULL DEFAULT '0', + `objIndex` int(10) NOT NULL DEFAULT '0', + `mapid` int(10) UNSIGNED NOT NULL DEFAULT '0', + `WorldMapAreaId` int(10) UNSIGNED NOT NULL DEFAULT '0', + `FloorId` int(10) UNSIGNED NOT NULL DEFAULT '0', + `unk3` int(10) UNSIGNED NOT NULL DEFAULT '0', + `unk4` int(10) UNSIGNED NOT NULL DEFAULT '0', + KEY `questId` (`questId`,`id`), + KEY `id` (`id`,`questId`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `quest_poi` +-- + +LOCK TABLES `quest_poi` WRITE; +/*!40000 ALTER TABLE `quest_poi` DISABLE KEYS */; +/*!40000 ALTER TABLE `quest_poi` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `quest_poi_points` +-- + +DROP TABLE IF EXISTS `quest_poi_points`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `quest_poi_points` ( + `questId` int(10) UNSIGNED NOT NULL DEFAULT '0', + `id` int(10) UNSIGNED NOT NULL DEFAULT '0', + `x` int(10) NOT NULL DEFAULT '0', + `y` int(10) NOT NULL DEFAULT '0', + KEY `questId_id` (`questId`,`id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `quest_poi_points` +-- + +LOCK TABLES `quest_poi_points` WRITE; +/*!40000 ALTER TABLE `quest_poi_points` DISABLE KEYS */; +/*!40000 ALTER TABLE `quest_poi_points` ENABLE KEYS */; +UNLOCK TABLES; + +-- -- Table structure for table `quest_start_scripts` -- @@ -4266,24 +4373,27 @@ CREATE TABLE `quest_template` ( `SpecialFlags` tinyint(3) unsigned NOT NULL DEFAULT '0', `CharTitleId` tinyint(3) unsigned NOT NULL DEFAULT '0', `PlayersSlain` tinyint(3) unsigned NOT NULL DEFAULT '0', - `BonusTalents` tinyint(3) unsigned NOT NULL DEFAULT '0', + `BonusTalents` tinyint(3) unsigned unsigned NULL DEFAULT '0', + `RewardArenaPoints` smallint(5) unsigned NOT NULL DEFAULT '0', `PrevQuestId` mediumint(9) NOT NULL DEFAULT '0', `NextQuestId` mediumint(9) NOT NULL DEFAULT '0', `ExclusiveGroup` mediumint(9) NOT NULL DEFAULT '0', `NextQuestInChain` mediumint(8) unsigned NOT NULL DEFAULT '0', + `RewXPId` tinyint(2) unsigned NOT NULL DEFAULT '0', `SrcItemId` mediumint(8) unsigned NOT NULL DEFAULT '0', `SrcItemCount` tinyint(3) unsigned NOT NULL DEFAULT '0', `SrcSpell` mediumint(8) unsigned NOT NULL DEFAULT '0', - `Title` text, - `Details` text, - `Objectives` text, - `OfferRewardText` text, - `RequestItemsText` text, - `EndText` text, - `ObjectiveText1` text, - `ObjectiveText2` text, - `ObjectiveText3` text, - `ObjectiveText4` text, + `Title` text DEFAULT NULL, + `Details` text DEFAULT NULL, + `Objectives` text DEFAULT NULL, + `OfferRewardText` text DEFAULT NULL, + `RequestItemsText` text DEFAULT NULL, + `EndText` text DEFAULT NULL, + `CompletionText` text DEFAULT NULL, + `ObjectiveText1` text DEFAULT NULL, + `ObjectiveText2` text DEFAULT NULL, + `ObjectiveText3` text DEFAULT NULL, + `ObjectiveText4` text DEFAULT NULL, `ReqItemId1` mediumint(8) unsigned NOT NULL DEFAULT '0', `ReqItemId2` mediumint(8) unsigned NOT NULL DEFAULT '0', `ReqItemId3` mediumint(8) unsigned NOT NULL DEFAULT '0', @@ -4341,12 +4451,19 @@ CREATE TABLE `quest_template` ( `RewRepFaction3` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'faction id from Faction.dbc in this case', `RewRepFaction4` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'faction id from Faction.dbc in this case', `RewRepFaction5` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'faction id from Faction.dbc in this case', + `RewRepValueId1` mediumint(6) NOT NULL DEFAULT '0', + `RewRepValueId2` mediumint(6) NOT NULL DEFAULT '0', + `RewRepValueId3` mediumint(6) NOT NULL DEFAULT '0', + `RewRepValueId4` mediumint(6) NOT NULL DEFAULT '0', + `RewRepValueId5` mediumint(6) NOT NULL DEFAULT '0', `RewRepValue1` mediumint(9) NOT NULL DEFAULT '0', `RewRepValue2` mediumint(9) NOT NULL DEFAULT '0', `RewRepValue3` mediumint(9) NOT NULL DEFAULT '0', `RewRepValue4` mediumint(9) NOT NULL DEFAULT '0', `RewRepValue5` mediumint(9) NOT NULL DEFAULT '0', - `RewHonorableKills` int(10) unsigned NOT NULL DEFAULT '0', + `RewHonorAddition` int(10) signed NOT NULL DEFAULT '0', + `RewHonorMultiplier` float NOT NULL DEFAULT '1', + `unk0` tinyint(2) unsigned NOT NULL DEFAULT '0', `RewOrReqMoney` int(11) NOT NULL DEFAULT '0', `RewMoneyMaxLevel` int(10) unsigned NOT NULL DEFAULT '0', `RewSpell` mediumint(8) unsigned NOT NULL DEFAULT '0', @@ -4377,6 +4494,7 @@ CREATE TABLE `quest_template` ( `OfferRewardEmoteDelay4` int(11) unsigned NOT NULL DEFAULT '0', `StartScript` mediumint(8) unsigned NOT NULL DEFAULT '0', `CompleteScript` mediumint(8) unsigned NOT NULL DEFAULT '0', + `WDBVerified` smallint(5) signed DEFAULT '0', PRIMARY KEY (`entry`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Quest System'; /*!40101 SET character_set_client = @saved_cs_client */; @@ -4684,7 +4802,7 @@ INSERT INTO `spell_bonus_data` (`entry`,`direct_bonus`,`dot_bonus`,`ap_bonus`,`a (47476, -1, -1, 0.06, -1, 'Death Knight - Strangulate'), (50536, -1, -1, 0.013, -1, 'Death Knight - Unholy Blight (Rank1)'), (339, -1, 0.1, -1, -1, 'Druid - Entangling Roots'), -(60089, -1, -1, 0.05, -1, 'Druid - Faerie Fire (feral)'), +(60089, -1, -1, 0.15, -1, 'Druid - Faerie Fire (feral)'), (5185, 1.611, -1, -1, -1, 'Druid - Healing Touch'), (42231, 0.12898, -1, -1, -1, 'Druid - Hurricane Triggered'), (5570, -1, 0.2, -1, -1, 'Druid - Insect Swarm'), @@ -4852,15 +4970,6 @@ INSERT INTO `spell_bonus_data` (`entry`,`direct_bonus`,`dot_bonus`,`ap_bonus`,`a (974, 0.4762, -1, -1, -1, 'Shaman - Earth Shield'), (379, 0, 0, 0, 0, 'Shaman - Earth Shield Triggered'), (8042, 0.3858, -1, -1, -1, 'Shaman - Earth Shock'), -(8443, 0.2142, -1, -1, -1, 'Shaman - Fire Nova Totem Casted by Totem Rank 1'), -(8504, 0.2142, -1, -1, -1, 'Shaman - Fire Nova Totem Casted by Totem Rank 2'), -(8505, 0.2142, -1, -1, -1, 'Shaman - Fire Nova Totem Casted by Totem Rank 3'), -(11310, 0.2142, -1, -1, -1, 'Shaman - Fire Nova Totem Casted by Totem Rank 4'), -(11311, 0.2142, -1, -1, -1, 'Shaman - Fire Nova Totem Casted by Totem Rank 5'), -(25538, 0.2142, -1, -1, -1, 'Shaman - Fire Nova Totem Casted by Totem Rank 6'), -(25539, 0.2142, -1, -1, -1, 'Shaman - Fire Nova Totem Casted by Totem Rank 7'), -(61651, 0.2142, -1, -1, -1, 'Shaman - Fire Nova Totem Casted by Totem Rank 8'), -(61660, 0.2142, -1, -1, -1, 'Shaman - Fire Nova Totem Casted by Totem Rank 9'), (8050, 0.2142, 0.1, -1, -1, 'Shaman - Flame Shock'), (8026, 0.1, -1, -1, -1, 'Shaman - Flametongue Weapon Proc Rank 1'), (58788, 0.1, -1, -1, -1, 'Shaman - Flametongue Weapon Proc Rank 10'), @@ -4883,7 +4992,7 @@ INSERT INTO `spell_bonus_data` (`entry`,`direct_bonus`,`dot_bonus`,`ap_bonus`,`a (58798, 0.1, -1, -1, -1, 'Shaman - Frostbrand Attack Rank 8'), (58799, 0.1, -1, -1, -1, 'Shaman - Frostbrand Attack Rank 9'), (2645, 0, 0, 0, 0, 'Shaman - Glyph of Ghost Wolf'), -(52042, 0.045, -1, -1, -1, 'Shaman - Healing Stream Totem Triggered Heal'), +(52042, -1, -1, -1, -1, 'Shaman - Healing Stream Totem Triggered Heal'), (331, 1.6106, -1, -1, -1, 'Shaman - Healing Wave'), (51505, 0.5714, -1, -1, -1, 'Shaman - Lava Burst'), (8004, 0.8082, -1, -1, -1, 'Shaman - Lesser Healing Wave'), @@ -5983,7 +6092,7 @@ INSERT INTO `spell_proc_event` (`entry`,`SchoolMask`,`SpellFamilyName`,`SpellFam ( 20215, 0x00, 10, 0xC0000000, 0x00010000, 0x00000000, 0x00000000, 0x00000002, 0, 0, 0), -- Illumination (Rank 5) ( 20234, 0x00, 10, 0x00008000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Improved Lay on Hands (Rank 1) ( 20235, 0x00, 10, 0x00008000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Improved Lay on Hands (Rank 2) -( 20375, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 1), -- Seal of Command +( 20375, 0x01, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 1), -- Seal of Command ( 20500, 0x00, 4, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Improved Berserker Rage (Rank 1) ( 20501, 0x00, 4, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Improved Berserker Rage (Rank 2) ( 20705, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0, 0, 0), -- Power Shield 500 @@ -5991,6 +6100,7 @@ INSERT INTO `spell_proc_event` (`entry`,`SchoolMask`,`SpellFamilyName`,`SpellFam ( 20925, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0, 0, 0), -- Holy Shield (Rank 1) ( 20927, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0, 0, 0), -- Holy Shield (Rank 2) ( 20928, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0, 0, 0), -- Holy Shield (Rank 3) +( 21084, 0x01, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Seal of Righteousness ( 21185, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 10), -- Spinal Reaper ( 21882, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0, 0, 0), -- Judgement Smite ( 21890, 0x00, 4, 0x2A764EEF, 0x0000036C, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Warrior's Wrath @@ -6116,8 +6226,11 @@ INSERT INTO `spell_proc_event` (`entry`,`SchoolMask`,`SpellFamilyName`,`SpellFam ( 31570, 0x00, 3, 0x00010000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Improved Blink (Rank 2) ( 31571, 0x00, 3, 0x00000000, 0x00000022, 0x00000000, 0x00004000, 0x00000000, 0, 0, 0), -- Arcane Potency (Rank 1) ( 31572, 0x00, 3, 0x00000000, 0x00000022, 0x00000000, 0x00004000, 0x00000000, 0, 0, 0), -- Arcane Potency (Rank 2) +( 31656, 0x04, 3, 0x8000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Empowered Fire (Rank 1) +( 31657, 0x04, 3, 0x8000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Empowered Fire (Rank 2) +( 31658, 0x04, 3, 0x8000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Empowered Fire (Rank 3) ( 31794, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000, 0, 0, 0), -- Focused Mind -( 31801, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 20, 0, 0), -- Seal of Vengeance +( 31801, 0x01, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Seal of Vengeance ( 31833, 0x00, 10, 0x80000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Light's Grace (Rank 1) ( 31835, 0x00, 10, 0x80000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Light's Grace (Rank 2) ( 31836, 0x00, 10, 0x80000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Light's Grace (Rank 3) @@ -6366,9 +6479,9 @@ INSERT INTO `spell_proc_event` (`entry`,`SchoolMask`,`SpellFamilyName`,`SpellFam ( 47203, 0x00, 5, 0x00000008, 0x00040000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Everlasting Affliction (3) ( 47204, 0x00, 5, 0x00000008, 0x00040000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Everlasting Affliction (4) ( 47205, 0x00, 5, 0x00000008, 0x00040000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Everlasting Affliction (5) -( 47245, 0x20, 5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Molten Core (Rank 1) -( 47246, 0x20, 5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Molten Core (Rank 2) -( 47247, 0x20, 5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Molten Core (Rank 3) +( 47245, 0x00, 5, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0, 0, 0), -- Molten Core (Rank 1) +( 47246, 0x00, 5, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0, 0, 0), -- Molten Core (Rank 2) +( 47247, 0x00, 5, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0, 0, 0), -- Molten Core (Rank 3) ( 47258, 0x00, 5, 0x00000000, 0x00800000, 0x00000000, 0x00000000, 0x00010000, 0, 0, 0), -- Backdraft (Rank 1) ( 47259, 0x00, 5, 0x00000000, 0x00800000, 0x00000000, 0x00000000, 0x00010000, 0, 0, 0), -- Backdraft (Rank 2) ( 47260, 0x00, 5, 0x00000000, 0x00800000, 0x00000000, 0x00000000, 0x00010000, 0, 0, 0), -- Backdraft (Rank 3) @@ -6413,9 +6526,10 @@ INSERT INTO `spell_proc_event` (`entry`,`SchoolMask`,`SpellFamilyName`,`SpellFam ( 48952, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0, 0, 0), -- Holy Shield (Rank 6) ( 48988, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0, 0, 0), -- Bloody Vengeance (Rank 1) ( 49018, 0x00, 15, 0x01400000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Sudden Doom (Rank 1) -( 49027, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 3, 20), -- Bloodworms rank 1 -( 49542, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 6, 20), -- Bloodworms rank 2 -( 49543, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 9, 20), -- Bloodworms rank 3 +( 49194, 0x00, 15, 0x00002000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Unholy Blight +( 49027, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 3, 20), -- Bloodworms rank 1 +( 49542, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 6, 20), -- Bloodworms rank 2 +( 49543, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 9, 20), -- Bloodworms rank 3 ( 49208, 0x00, 15, 0x04000000, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Reaping (Rank 1) ( 49222, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 3), -- Bone Shield ( 49280, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 3), -- Lightning Shield (Rank 10) @@ -6453,8 +6567,8 @@ INSERT INTO `spell_proc_event` (`entry`,`SchoolMask`,`SpellFamilyName`,`SpellFam ( 51486, 0x01, 11, 0x20000000, 0x00000000, 0x00000000, 0x00004000, 0x00000001, 0, 0, 0), -- Storm, Earth and Fire ( 51521, 0x00, 11, 0x00000000, 0x01000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Improved Stormstrike ( 51522, 0x00, 11, 0x00000000, 0x01000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Improved Stormstrike -( 51523, 0x08, 11, 0x00000000, 0x00000001, 0x00000000, 0x00011000, 0x00000000, 0, 50, 0), -- Earthen Power (Rank 1) -( 51524, 0x08, 11, 0x00000000, 0x00000001, 0x00000000, 0x00011000, 0x00000000, 0, 100, 0), -- Earthen Power (Rank 2) +( 51523, 0x00, 11, 0x00000000, 0x00000001, 0x00000000, 0x00010000, 0x00000000, 0, 50, 0), -- Earthen Power (Rank 1) +( 51524, 0x00, 11, 0x00000000, 0x00000001, 0x00000000, 0x00010000, 0x00000000, 0, 50, 0), -- Earthen Power (Rank 2) ( 51528, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 2.5, 0, 0), -- Maelstrom Weapon (Rank 1) ( 51529, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 5, 0, 0), -- Maelstrom Weapon (Rank 2) ( 51530, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 7.5, 0, 0), -- Maelstrom Weapon (Rank 3) @@ -6612,7 +6726,6 @@ INSERT INTO `spell_proc_event` (`entry`,`SchoolMask`,`SpellFamilyName`,`SpellFam ( 58442, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 15), -- Airy Pale Ale ( 58444, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 5), -- Worg Tooth Oatmeal Stout ( 58626, 0x00, 15, 0x02000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Glyph of Death Grip -( 58631, 0x00, 15, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Glyph of Icy Touch ( 58642, 0x00, 15, 0x00000000, 0x08000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Glyph of Scourge Strike ( 58644, 0x00, 15, 0x00000000, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Glyph of Frost Strike ( 58647, 0x00, 15, 0x00000000, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Glyph of Frost Strike @@ -6701,7 +6814,6 @@ INSERT INTO `spell_proc_event` (`entry`,`SchoolMask`,`SpellFamilyName`,`SpellFam ( 18073, 0x00, 5, 0x00000100, 0x00800000, 0x00000000, 0x00000000, 0x00000002, 0, 0, 0), -- Pyroclasm ( 63280, 0x00, 11, 0x20000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Glyph of Totem of Wrath ( 63310, 0x00, 5, 0x00000000, 0x00010000, 0x00000000, 0x00010000, 0x00000000, 0, 0, 0), -- Glyph of Shadowflame -( 63320, 0x00, 5, 0x00040000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Glyph of Life Tap ( 63335, 0x00, 15, 0x00000000, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Glyph of Howling Blast ( 63730, 0x00, 6, 0x00000800, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Serendipity ( 63733, 0x00, 6, 0x00000800, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Serendipity @@ -6748,9 +6860,6 @@ INSERT INTO `spell_proc_event` (`entry`,`SchoolMask`,`SpellFamilyName`,`SpellFam ( 59057, 0x00, 15, 0x00000000, 0x00020000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Rime ( 55666, 0x00, 15, 0x00000001, 0x08000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Desecration ( 55667, 0x00, 15, 0x00000001, 0x08000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Desecration -( 55668, 0x00, 15, 0x00000001, 0x08000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Desecration -( 55669, 0x00, 15, 0x00000001, 0x08000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Desecration -( 55670, 0x00, 15, 0x00000001, 0x08000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Desecration ( 58616, 0x00, 15, 0x01000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Glyph of Heart Strike ( 16164, 0x00, 11, 0x901000C3, 0x00001000, 0x00000000, 0x00000000, 0x00000002, 0, 0, 0), -- Elemental Focus ( 49149, 0x00, 15, 0x00000006, 0x00020002, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Chill of the Grave @@ -6795,7 +6904,8 @@ INSERT INTO `spell_proc_event` (`entry`,`SchoolMask`,`SpellFamilyName`,`SpellFam ( 53601, 0x00, 0, 0x00000000, 0x00000000, 0x00000000, 0x000A02A8, 0x00000000, 0, 0, 6), -- Sacred Shield (Rank 1) ( 58375, 0x00, 4, 0x00000000, 0x00000200, 0x00000000, 0x00000010, 0x00000000, 0, 0, 0), -- Glyph of Blocking ( 58387, 0x00, 4, 0x00004000, 0x00000040, 0x00000000, 0x00000010, 0x00000000, 0, 0, 0), -- Glyph of Sunder Armor -( 54925, 0x02, 10, 0x00000000, 0x00000208, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0); -- Glyph of Seal of Command +( 54925, 0x02, 10, 0x00000000, 0x00000208, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0), -- Glyph of Seal of Command +( 67356, 0x08, 7, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0, 0, 0); -- Item - Druid T9 Restoration Relic (Rejuvenation) /*!40000 ALTER TABLE `spell_proc_event` ENABLE KEYS */; UNLOCK TABLES; @@ -7233,10 +7343,6 @@ INSERT INTO spell_ranks (`first_spell_id`, `spell_id`, `rank`) VALUES (31935, 32700, 3), (31935, 48826, 4), (31935, 48827, 5), - -- Avoidance -(61680, 61680, 1), -(61680, 61681, 2), -(61680, 52858, 3), -- Backdraft (47258, 47258, 1), (47258, 47259, 2), @@ -7559,6 +7665,9 @@ INSERT INTO spell_ranks (`first_spell_id`, `spell_id`, `rank`) VALUES (1064, 25423, 5), (1064, 55458, 6), (1064, 55459, 7), + -- Chains of Ice +(113, 113, 1), +(113, 512, 2), -- Chaos Bolt (50796, 50796, 1), (50796, 59170, 2), @@ -7810,28 +7919,12 @@ INSERT INTO spell_ranks (`first_spell_id`, `spell_id`, `rank`) VALUES (19306, 48998, 5), (19306, 48999, 6), -- Cower -(1747, 1747, 1), -(1747, 1748, 2), -(1747, 1749, 3), -(1747, 1750, 4), -(1747, 1751, 5), -(1747, 16698, 6), -(1747, 27346, 7), - -- Cower (8998, 8998, 1), (8998, 9000, 2), (8998, 9892, 3), (8998, 31709, 4), (8998, 27004, 5), (8998, 48575, 6), - -- Cower -(1742, 1742, 1), -(1742, 1753, 2), -(1742, 1754, 3), -(1742, 1755, 4), -(1742, 1756, 5), -(1742, 16697, 6), -(1742, 27048, 7), -- Create Firestone (6366, 6366, 1), (6366, 17951, 2), @@ -7886,6 +7979,10 @@ INSERT INTO spell_ranks (`first_spell_id`, `spell_id`, `rank`) VALUES (49032, 49032, 1), (49032, 49631, 2), (49032, 49632, 3), + -- Culling the Herd +(61680, 61680, 1), +(61680, 61681, 2), +(61680, 52858, 3), -- Curse of Agony (980, 980, 1), (980, 1014, 2), @@ -8126,6 +8223,9 @@ INSERT INTO spell_ranks (`first_spell_id`, `spell_id`, `rank`) VALUES (1160, 25202, 6), (1160, 25203, 7), (1160, 47437, 8), + -- Desecration +(55666, 55666, 1), +(55666, 55667, 2), -- Desperate Prayer (19236, 19236, 1), (19236, 19238, 2), @@ -8703,16 +8803,6 @@ INSERT INTO spell_ranks (`first_spell_id`, `spell_id`, `rank`) VALUES (34889, 55483, 4), (34889, 55484, 5), (34889, 55485, 6), - -- Fire Nova Totem -(1535, 1535, 1), -(1535, 8498, 2), -(1535, 8499, 3), -(1535, 11314, 4), -(1535, 11315, 5), -(1535, 25546, 6), -(1535, 25547, 7), -(1535, 61649, 8), -(1535, 61657, 9), -- Fire Power (11124, 11124, 1), (11124, 12378, 2), @@ -8810,14 +8900,6 @@ INSERT INTO spell_ranks (`first_spell_id`, `spell_id`, `rank`) VALUES (11100, 11100, 1), (11100, 12353, 2), -- Flamestrike -(2124, 2124, 1), -(2124, 2125, 2), -(2124, 8425, 3), -(2124, 8426, 4), -(2124, 10217, 5), -(2124, 10218, 6), -(2124, 27385, 7), - -- Flamestrike (2120, 2120, 1), (2120, 2121, 2), (2120, 8422, 3), @@ -9745,7 +9827,7 @@ INSERT INTO spell_ranks (`first_spell_id`, `spell_id`, `rank`) VALUES -- Improved Fire Blast (11078, 11078, 1), (11078, 11080, 2), - -- Improved Fire Nova Totem + -- Improved Fire Nova (16086, 16086, 1), (16086, 16544, 2), -- Improved Fireball @@ -11052,10 +11134,6 @@ INSERT INTO spell_ranks (`first_spell_id`, `spell_id`, `rank`) VALUES (57873, 57876, 2), (57873, 57877, 3), -- Prowl -(5215, 5215, 1), -(5215, 6783, 2), -(5215, 9913, 3), - -- Prowl (24450, 24450, 1), (24450, 24452, 2), (24450, 24453, 3), @@ -12040,11 +12118,6 @@ INSERT INTO spell_ranks (`first_spell_id`, `spell_id`, `rank`) VALUES (56641, 34120, 2), (56641, 49051, 3), (56641, 49052, 4), - -- Stealth -(1784, 1784, 1), -(1784, 1785, 2), -(1784, 1786, 3), -(1784, 1787, 4), -- Sting (56626, 56626, 1), (56626, 56627, 2), @@ -12078,17 +12151,6 @@ INSERT INTO spell_ranks (`first_spell_id`, `spell_id`, `rank`) VALUES (5728, 58583, 8), (5728, 58584, 9), (5728, 58585, 10), - -- Stoneskin -(8072, 8072, 1), -(8072, 8156, 2), -(8072, 8157, 3), -(8072, 10403, 4), -(8072, 10404, 5), -(8072, 10405, 6), -(8072, 25506, 7), -(8072, 25507, 8), -(8072, 58752, 9), -(8072, 58754, 10), -- Stoneskin Totem (8073, 8073, 1), (8073, 38115, 2), @@ -12706,9 +12768,6 @@ INSERT INTO spell_ranks (`first_spell_id`, `spell_id`, `rank`) VALUES (45297, 45302, 6), (45297, 49268, 7), (45297, 49269, 8), - -- Chains of Ice -(113, 113, 1), -(113, 512, 2), -- Charge (7370, 7370, 1), (7370, 26184, 2), @@ -12733,6 +12792,14 @@ INSERT INTO spell_ranks (`first_spell_id`, `spell_id`, `rank`) VALUES (20387, 27491, 7), (20387, 48003, 8), (20387, 48004, 9), + -- Cower +(1747, 1747, 1), +(1747, 1748, 2), +(1747, 1749, 3), +(1747, 1750, 4), +(1747, 1751, 5), +(1747, 16698, 6), +(1747, 27346, 7), -- Echoes of Lordaeron (6966, 6966, 1), (6966, 30880, 2), @@ -12749,25 +12816,25 @@ INSERT INTO spell_ranks (`first_spell_id`, `spell_id`, `rank`) VALUES (9799, 9799, 1), (9799, 25988, 2), -- Fire Nova -(8350, 8350, 1), -(8350, 8508, 2), -(8350, 8509, 3), -(8350, 11312, 4), -(8350, 11313, 5), -(8350, 25540, 6), -(8350, 25544, 7), -(8350, 61658, 8), -(8350, 61659, 9), +(1535, 1535, 1), +(1535, 8498, 2), +(1535, 8499, 3), +(1535, 11314, 4), +(1535, 11315, 5), +(1535, 25546, 6), +(1535, 25547, 7), +(1535, 61649, 8), +(1535, 61657, 9), -- Fire Nova -(8443, 8443, 1), -(8443, 8504, 2), -(8443, 8505, 3), -(8443, 11310, 4), -(8443, 11311, 5), -(8443, 25538, 6), -(8443, 25539, 7), -(8443, 61651, 8), -(8443, 61660, 9), +(8349, 8349, 1), +(8349, 8502, 2), +(8349, 8503, 3), +(8349, 11306, 4), +(8349, 11307, 5), +(8349, 25535, 6), +(8349, 25537, 7), +(8349, 61650, 8), +(8349, 61654, 9), -- Fire Protection (7230, 7230, 1), (7230, 7231, 2), @@ -13338,6 +13405,8 @@ INSERT INTO spell_ranks (`first_spell_id`, `spell_id`, `rank`) VALUES (19386, 27068, 4), (19386, 49011, 5), (19386, 49012, 6), + -- Arantir's Deception +(9736, 9736, 1), -- First Aid (746, 746, 1), (746, 1159, 2), @@ -13402,6 +13471,19 @@ INSERT INTO spell_ranks (`first_spell_id`, `spell_id`, `rank`) VALUES -- Spirit Bond (19579, 19579, 1), (19579, 24529, 2), + -- Stoneskin +(8072, 8072, 1), +(8072, 8156, 2), +(8072, 8157, 3), +(8072, 10403, 4), +(8072, 10404, 5), +(8072, 10405, 6), +(8072, 25506, 7), +(8072, 25507, 8), +(8072, 58752, 9), +(8072, 58754, 10), + -- Ashcrombe's Teleport +(15742, 15742, 1), -- Attack (3606, 3606, 1), (3606, 6350, 2), @@ -13534,6 +13616,14 @@ INSERT INTO spell_ranks (`first_spell_id`, `spell_id`, `rank`) VALUES (1241, 10163, 4), (1241, 10164, 5), (1241, 27386, 6), + -- Flamestrike +(2124, 2124, 1), +(2124, 2125, 2), +(2124, 8425, 3), +(2124, 8426, 4), +(2124, 10217, 5), +(2124, 10218, 6), +(2124, 27385, 7), -- Anesthetic Poison (26688, 26688, 1), (26688, 57981, 2), @@ -13744,16 +13834,6 @@ INSERT INTO spell_ranks (`first_spell_id`, `spell_id`, `rank`) VALUES (19975, 19970, 6), (19975, 27010, 7), (19975, 53313, 8), - -- Fire Nova -(8349, 8349, 1), -(8349, 8502, 2), -(8349, 8503, 3), -(8349, 11306, 4), -(8349, 11307, 5), -(8349, 25535, 6), -(8349, 25537, 7), -(8349, 61650, 8), -(8349, 61654, 9), -- Death Coil (47541, 47541, 1), (47541, 49892, 2), @@ -13792,7 +13872,7 @@ INSERT INTO spell_ranks (`first_spell_id`, `spell_id`, `rank`) VALUES (27576, 34418, 4), (27576, 48661, 5), (27576, 48664, 6), - -- immolation trap + -- Immolation trap (13797, 13797, 1), (13797, 14298, 2), (13797, 14299, 3), @@ -13805,12 +13885,6 @@ INSERT INTO spell_ranks (`first_spell_id`, `spell_id`, `rank`) VALUES (64418, 64418, 1), (64418, 64419, 2), (64418, 64420, 3), - -- Desecration -(55666, 55666, 1), -(55666, 55667, 2), -(55666, 55668, 3), -(55666, 55669, 4), -(55666, 55670, 5), -- Blood Strike (66215, 66215, 1), (66215, 66975, 2), @@ -14766,6 +14840,12 @@ INSERT INTO `trinity_string` (`entry`,`content_default`,`content_loc1`,`content_ (10053, 'Take me to Crown Guard Tower.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), (10054, 'Give me the flag, I''ll take it to the central beacon for the glory of the Alliance!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), (10055, 'Give me the flag, I''ll take it to the central beacon for the glory of the Horde!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(10056, 'The battle for Strand of the Ancients begins in 2 minutes.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(10057, 'The battle for Strand of the Ancients begins in 1 minute.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(10058, 'The battle for Strand of the Ancients begins in 30 seconds. Prepare yourselves!.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(10059, 'Let the battle for Strand of the Ancients begin!.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(10061, '%s is destroyed!', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(10060, '%s is under attack!', NULL, NULL ,NULL , NULL, NULL, NULL, NULL, NULL), (11000, '|cffffff00[|c00077766Autobroadcast|cffffff00]: |cFFF222FF%s|r', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), (11001, 'You have not chosen -1 or the current realmID that you are on.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); /*!40000 ALTER TABLE `trinity_string` ENABLE KEYS */; diff --git a/src/game/ArenaTeam.cpp b/src/game/ArenaTeam.cpp index 320d8aa6b98..45ac5057de2 100644 --- a/src/game/ArenaTeam.cpp +++ b/src/game/ArenaTeam.cpp @@ -46,7 +46,9 @@ ArenaTeam::ArenaTeam() m_stats.games_week = 0; m_stats.games_season = 0; m_stats.rank = 0; - if (sWorld.getConfig(CONFIG_ARENA_SEASON_ID) >= 6) + if (sWorld.getConfig(CONFIG_ARENA_START_RATING)>=0) + m_stats.rating = sWorld.getConfig(CONFIG_ARENA_START_RATING); + else if (sWorld.getConfig(CONFIG_ARENA_SEASON_ID) >= 6) m_stats.rating = 0; else m_stats.rating = 1500; @@ -143,7 +145,9 @@ bool ArenaTeam::AddMember(const uint64& PlayerGuid) newmember.games_week = 0; newmember.wins_season = 0; newmember.wins_week = 0; - if (sWorld.getConfig(CONFIG_ARENA_SEASON_ID) >= 6) + if (sWorld.getConfig(CONFIG_ARENA_START_PERSONAL_RATING) >= 0) + newmember.personal_rating = sWorld.getConfig(CONFIG_ARENA_START_PERSONAL_RATING); + else if (sWorld.getConfig(CONFIG_ARENA_SEASON_ID) >= 6) { if (m_stats.rating < 1000) newmember.personal_rating = 0; diff --git a/src/game/BattleGround.h b/src/game/BattleGround.h index 9bbc9a9104e..67dcfaa5b88 100644 --- a/src/game/BattleGround.h +++ b/src/game/BattleGround.h @@ -201,8 +201,10 @@ enum ScoreType SCORE_TOWERS_DEFENDED = 14, SCORE_MINES_CAPTURED = 15, SCORE_LEADERS_KILLED = 16, - SCORE_SECONDARY_OBJECTIVES = 17 - // TODO : implement them + SCORE_SECONDARY_OBJECTIVES = 17, + //SOTA + SCORE_DESTROYED_DEMOLISHER = 18, + SCORE_DESTROYED_WALL = 19 }; enum ArenaType @@ -503,6 +505,8 @@ class BattleGround virtual void EventPlayerCapturedFlag(Player* /*player*/) {} void EventPlayerLoggedIn(Player* player, uint64 plr_guid); void EventPlayerLoggedOut(Player* player); + virtual void EventPlayerDamagedGO(Player* /*player*/, GameObject* /*target_obj*/, uint32 /*eventId*/) {} + virtual void EventPlayerUsedGO(Player* player, GameObject* go){} /* Death related */ virtual WorldSafeLocsEntry const* GetClosestGraveYard(Player* player); diff --git a/src/game/BattleGroundIC.cpp b/src/game/BattleGroundIC.cpp index 216b7cbe727..73783e3b1ab 100644 --- a/src/game/BattleGroundIC.cpp +++ b/src/game/BattleGroundIC.cpp @@ -23,6 +23,8 @@ BattleGroundIC::BattleGroundIC() { + m_BgCreatures.resize(2); + m_BgObjects.resize(5); //TODO FIX ME! m_StartMessageIds[BG_STARTING_EVENT_FIRST] = LANG_BG_WS_START_TWO_MINUTES; m_StartMessageIds[BG_STARTING_EVENT_SECOND] = LANG_BG_WS_START_ONE_MINUTE; @@ -78,4 +80,52 @@ void BattleGroundIC::UpdatePlayerScore(Player* Source, uint32 type, uint32 value return; BattleGround::UpdatePlayerScore(Source,type,value); -}
\ No newline at end of file +} + +bool BattleGroundIC::SetupBattleGround() +{ + AddObject(0, 195157, 459.72f, -419.93f, 42.55f, 0, 0, 0, 0.9996573f, 0.02617699f, 10*MINUTE); + AddObject(1, 195158, 797.72f, -1009.48f, 138.52f, 0, 0, 0, 0.9996573f, 0.02617699f, 10*MINUTE); + AddObject(2, 195338, 418.98f, -838.33f, 51.09f, 0, 0, 0, 0.9996573f, 0.02617699f, 10*MINUTE); + AddObject(3, 195343, 1267.45f, -390.88f, 24.23f, 0, 0, 0, 0.9996573f, 0.02617699f, 10*MINUTE); + AddObject(4, 195333, 769.27f, -833.53f, 9.57f, 0, 0, 0, 0.9996573f, 0.02617699f, 10*MINUTE); + SpawnLeader(ALLIANCE); + SpawnLeader(HORDE); + return true; +} + +void BattleGroundIC::SpawnLeader(uint32 teamid) +{ + if (teamid == ALLIANCE) + AddCreature(34924, 0, ALLIANCE, 307.03f, -833.04f, 48.91f, 6.23f, 10*MINUTE); + else + AddCreature(34922, 1, HORDE, 1264.42f, -766.80f, 48.91f, 3.28f, 10*MINUTE); +} + +void BattleGroundIC::HandleKillUnit(Creature *unit, Player *killer) +{ + if (GetStatus() != STATUS_IN_PROGRESS) + return; + + uint32 entry = unit->GetEntry(); + if (entry == 34924) + { + RewardHonorToTeam(500,HORDE); + EndBattleGround(HORDE); + } + else if (entry == 34922) + { + RewardHonorToTeam(500,ALLIANCE); + EndBattleGround(ALLIANCE); + } +} + +void BattleGroundIC::EndBattleGround(uint32 winner) +{ + BattleGround::EndBattleGround(winner); +} +void BattleGroundIC::EventPlayerClickedOnFlag(Player *source, GameObject* /*target_obj*/) +{ + if (GetStatus() != STATUS_IN_PROGRESS) + return; +} diff --git a/src/game/BattleGroundIC.h b/src/game/BattleGroundIC.h index 5c4b17cc926..987350fc9f3 100644 --- a/src/game/BattleGroundIC.h +++ b/src/game/BattleGroundIC.h @@ -21,6 +21,12 @@ class BattleGround; +enum Buffs +{ + OIL_REFINERY = 68719, + QUARRY = 68720 +}; + class BattleGroundICScore : public BattleGroundScore { public: @@ -44,11 +50,15 @@ class BattleGroundIC : public BattleGround void RemovePlayer(Player *plr,uint64 guid); void HandleAreaTrigger(Player *Source, uint32 Trigger); - //bool SetupBattleGround(); + bool SetupBattleGround(); + void SpawnLeader(uint32 teamid); + void HandleKillUnit(Creature *unit, Player *killer); + void EndBattleGround(uint32 winner); + void EventPlayerClickedOnFlag(Player *source, GameObject* /*target_obj*/); /* Scorekeeping */ void UpdatePlayerScore(Player *Source, uint32 type, uint32 value); private: }; -#endif
\ No newline at end of file +#endif diff --git a/src/game/BattleGroundMgr.cpp b/src/game/BattleGroundMgr.cpp index 7948fd321d6..d3f79b25576 100644 --- a/src/game/BattleGroundMgr.cpp +++ b/src/game/BattleGroundMgr.cpp @@ -1239,18 +1239,18 @@ void BattleGroundMgr::Update(uint32 diff) void BattleGroundMgr::BuildBattleGroundStatusPacket(WorldPacket *data, BattleGround *bg, uint8 QueueSlot, uint8 StatusID, uint32 Time1, uint32 Time2, uint8 arenatype) { - // we can be in 3 queues in same time... + // we can be in 2 queues in same time... if (StatusID == 0 || !bg) { - data->Initialize(SMSG_BATTLEFIELD_STATUS, 4*3); - *data << uint32(QueueSlot); // queue id (0...2) + data->Initialize(SMSG_BATTLEFIELD_STATUS, 4+8); + *data << uint32(QueueSlot); // queue id (0...1) *data << uint64(0); return; } - data->Initialize(SMSG_BATTLEFIELD_STATUS, (4+1+1+4+2+4+1+4+4+4)); - *data << uint32(QueueSlot); // queue id (0...2) - player can be in 3 queues in time + data->Initialize(SMSG_BATTLEFIELD_STATUS, (4+8+1+1+4+1+4+4+4)); + *data << uint32(QueueSlot); // queue id (0...1) - player can be in 2 queues in time // The following segment is read as uint64 in client but can be appended as their original type. *data << uint8(arenatype); sLog.outDebug("BattleGroundMgr::BuildBattleGroundStatusPacket: arenatype = %u for bg instanceID %u, TypeID %u.", arenatype, bg->GetClientInstanceID(), bg->GetTypeID()); @@ -1258,6 +1258,8 @@ void BattleGroundMgr::BuildBattleGroundStatusPacket(WorldPacket *data, BattleGro *data << uint32(bg->GetTypeID()); *data << uint16(0x1F90); // End of uint64 segment, decomposed this way for simplicity + *data << uint8(0); // 3.3.0 + *data << uint8(0); // 3.3.0 *data << uint32(bg->GetClientInstanceID()); // alliance/horde for BG and skirmish/rated for Arenas // following displays the minimap-icon 0 = faction icon 1 = arenaicon @@ -1378,7 +1380,11 @@ void BattleGroundMgr::BuildPvpLogDataPacket(WorldPacket *data, BattleGround *bg) case BATTLEGROUND_BE: case BATTLEGROUND_AA: case BATTLEGROUND_RL: - case BATTLEGROUND_SA: // wotlk + case BATTLEGROUND_SA: + *data << uint32(2); + *data << uint32(((BattleGroundSAScore*)itr->second)->demolishers_destroyed); + *data << uint32(((BattleGroundSAScore*)itr->second)->gates_destroyed); + break; case BATTLEGROUND_DS: // wotlk case BATTLEGROUND_RV: // wotlk case BATTLEGROUND_IC: // wotlk @@ -1514,8 +1520,16 @@ BattleGround * BattleGroundMgr::CreateNewBattleGround(BattleGroundTypeId bgTypeI //for arenas there is random map used if (bg_template->isArena()) { - BattleGroundTypeId arenas[] = {BATTLEGROUND_RV, BATTLEGROUND_NA, BATTLEGROUND_BE, BATTLEGROUND_RL}; - uint32 arena_num = urand(1,3); // Disable Ring of Valor due to LoS problems + // for type enter in arenas + uint32 arenaswitch = urand(1, 3); + + if (sWorld.getConfig(CONFIG_ARENA_LK_ARENAS_ENABLE) == 1) + arenaswitch = urand(0, 4); // Enable Ring of Valor and Dalaran Sewers arenas - in these arenas problem with LoS + else + arenaswitch = urand(1, 3); // Disable WoTLK Arenas (Ring of Valor, Dalaran Sewers) + + BattleGroundTypeId arenas[] = {BATTLEGROUND_RV, BATTLEGROUND_NA, BATTLEGROUND_BE, BATTLEGROUND_RL, BATTLEGROUND_DS}; + uint32 arena_num = arenaswitch; bgTypeId = arenas[arena_num]; bg_template = GetBattleGroundTemplate(bgTypeId); if (!bg_template) @@ -1691,8 +1705,9 @@ void BattleGroundMgr::CreateInitialBattleGrounds() } if (MinLvl == 0 || MaxLvl == 0 || MinLvl > MaxLvl) { - MinLvl = bl->minlvl; - MaxLvl = bl->maxlvl; + //TO-DO: FIX ME + MinLvl = 0;//bl->minlvl; + MaxLvl = 80;//bl->maxlvl; } start1 = fields[5].GetUInt32(); @@ -1838,15 +1853,17 @@ void BattleGroundMgr::BuildBattleGroundListPacket(WorldPacket *data, const uint6 if(bgTypeId == BATTLEGROUND_AA) // arena { *data << uint8(4); // unk + *data << uint8(0); // unk *data << uint32(0); // unk (count?) } else // battleground { - *data << uint8(0x00); // unk, different for each bg type + *data << uint8(0); // unk, different for each bg type + *data << uint8(0); // unk size_t count_pos = data->wpos(); uint32 count = 0; - *data << uint32(0x00); // number of bg instances + *data << uint32(0); // number of bg instances uint32 queue_id = plr->GetBattleGroundQueueIdFromLevel(bgTypeId); for (std::set<uint32>::iterator itr = m_ClientBattleGroundIds[bgTypeId][queue_id].begin(); itr != m_ClientBattleGroundIds[bgTypeId][queue_id].end(); ++itr) diff --git a/src/game/BattleGroundSA.cpp b/src/game/BattleGroundSA.cpp index acf16ad3af0..ce2e9e0611e 100644 --- a/src/game/BattleGroundSA.cpp +++ b/src/game/BattleGroundSA.cpp @@ -20,24 +20,293 @@ #include "BattleGroundSA.h" #include "Language.h" #include "Player.h" +#include "GameObject.h" +#include "ObjectMgr.h" +#include "WorldPacket.h" + +/* + The crap needs shitload of DB data fixed, will paste it here: + + Cannons: + update creature_template set IconName = "Gunner" where entry = 27894; + UPDATE `creature_template` SET `vehicleid`=160 WHERE `entry`=27894; + ^^ Sniffed by el manuel, should be good. + UPDATE `creature_template` SET `spell1`=49872 WHERE `entry`=27894; + UPDATE `creature_template` set `unit_flags`=`unit_flags`|4 WHERE `entry`=27894; + + UPDATE `creature_template` SET `vehicleid`=158 WHERE `entry`=28781; + UPDATE `creature_template` set `spell1=49872 where `entry`=32795; + UPDATE `creature_template` set `spell1=52338,`spell2`=60206 where `entry`=32796; + */ BattleGroundSA::BattleGroundSA() { //TODO FIX ME! - m_StartMessageIds[BG_STARTING_EVENT_FIRST] = LANG_BG_WS_START_TWO_MINUTES; - m_StartMessageIds[BG_STARTING_EVENT_SECOND] = LANG_BG_WS_START_ONE_MINUTE; - m_StartMessageIds[BG_STARTING_EVENT_THIRD] = LANG_BG_WS_START_HALF_MINUTE; - m_StartMessageIds[BG_STARTING_EVENT_FOURTH] = LANG_BG_WS_HAS_BEGUN; + m_StartMessageIds[BG_STARTING_EVENT_FIRST] = LANG_BG_SA_START_TWO_MINUTES; + m_StartMessageIds[BG_STARTING_EVENT_SECOND] = LANG_BG_SA_START_ONE_MINUTE; + m_StartMessageIds[BG_STARTING_EVENT_THIRD] = LANG_BG_SA_START_HALF_MINUTE; + m_StartMessageIds[BG_STARTING_EVENT_FOURTH] = LANG_BG_SA_HAS_BEGUN; + m_BgObjects.resize(BG_SA_MAXOBJ); + m_BgCreatures.resize(BG_SA_MAXNPC + BG_SA_MAX_GY); + TimerEnabled = false; } BattleGroundSA::~BattleGroundSA() { + sLog.outError("SOTA ZDYCHA: \n%u %u\n %u %u",BG_SA_MAXOBJ,m_BgObjects.size(),BG_SA_MAXNPC,m_BgCreatures.size()); +} + +void BattleGroundSA::Reset() +{ + TotalTime = 0; + attackers = ( (urand(0,1)) ? TEAM_ALLIANCE : TEAM_HORDE); + for(uint8 i = 0; i <= 5; i++) + { + GateStatus[i] = BG_SA_GATE_OK; + } + ShipsStarted = false; + status = BG_SA_WARMUP; +} + +bool BattleGroundSA::SetupBattleGround() +{ + return ResetObjs(); +} + +bool BattleGroundSA::ResetObjs() +{ + + uint32 atF = BG_SA_Factions[attackers]; + uint32 defF = BG_SA_Factions[attackers ? TEAM_ALLIANCE : TEAM_HORDE]; + sLog.outError("SOTA: Attacking team: %u %u %u",attackers,atF,defF); + + for(uint8 i = 0; i <BG_SA_MAXOBJ; i++) + DelObject(i); + + for(uint8 i = 0; i < BG_SA_MAXNPC; i++) + DelCreature(i); + + for(uint8 i = BG_SA_MAXNPC; i < BG_SA_MAXNPC + BG_SA_MAX_GY; i++) + DelCreature(i); + + for(uint8 i = 0; i < 6; i++) + GateStatus[i] = BG_SA_GATE_OK; + + for(uint8 i = 0; i < BG_SA_CENTRAL_FLAG; i++) + { + if(!AddObject(i,BG_SA_ObjEntries[i], + BG_SA_ObjSpawnlocs[i][0],BG_SA_ObjSpawnlocs[i][1], + BG_SA_ObjSpawnlocs[i][2],BG_SA_ObjSpawnlocs[i][3], + 0,0,0,0,RESPAWN_ONE_DAY)) + return false; + else + sLog.outError("SOTA: object %u spawned",i); + } + + GetBGObject(BG_SA_TITAN_RELIC)->SetUInt32Value(GAMEOBJECT_FACTION, defF); + GetBGObject(BG_SA_TITAN_RELIC)->Refresh(); + + //Cannons and demolishers - NPCs are spawned + //By capturing GYs. + for(uint8 i = 0; i < BG_SA_NPC_SPARKLIGHT; i++) + { + if(!AddCreature(BG_SA_NpcEntries[i], i, (attackers == TEAM_ALLIANCE ? TEAM_HORDE : TEAM_ALLIANCE), + BG_SA_NpcSpawnlocs[i][0],BG_SA_NpcSpawnlocs[i][1], + BG_SA_NpcSpawnlocs[i][2],BG_SA_NpcSpawnlocs[i][3])) + return false; + } + + OverrideGunFaction(); + + for(uint8 i = 0; i <= BG_SA_TITAN_RELIC; i++) + { + SpawnBGObject(i, RESPAWN_IMMEDIATELY); + GetBGObject(i)->SetUInt32Value(GAMEOBJECT_FACTION, defF); + } + + for(uint8 i = 0; i <= 5; i++) + { + GateStatus[i] = BG_SA_GATE_OK; + } + + // MAD props for Kiper for discovering those values - 4 hours of his work. + GetBGObject(BG_SA_BOAT_ONE)->UpdateRotationFields(1.0f, 0.0002f); + GetBGObject(BG_SA_BOAT_TWO)->UpdateRotationFields(1.0f, 0.00001f); + SpawnBGObject(BG_SA_BOAT_ONE, RESPAWN_IMMEDIATELY); + SpawnBGObject(BG_SA_BOAT_TWO, RESPAWN_IMMEDIATELY); + + TotalTime = 0; + ShipsStarted = false; + + //Graveyards! + for(uint8 i = 0;i < BG_SA_MAX_GY; i++) + { + WorldSafeLocsEntry const *sg = NULL; + sg = sWorldSafeLocsStore.LookupEntry(BG_SA_GYEntries[i]); + + if(!sg) + { + sLog.outError("SOTA: Can't find GY entry %u",BG_SA_GYEntries[i]); + return false; + } + + if(i == BG_SA_BEACH_GY) + { + GraveyardStatus[i] = attackers; + AddSpiritGuide(i + BG_SA_MAXNPC, sg->x, sg->y, sg->z, BG_SA_GYOrientation[i], ((attackers == TEAM_HORDE )? HORDE : ALLIANCE)); + } + else + { + GraveyardStatus[i] = ((attackers == TEAM_HORDE )? TEAM_ALLIANCE : TEAM_HORDE); + sLog.outError("SOTA: Spawning GY %u %f %f %f team %u",i,sg->x,sg->y,sg->z,GraveyardStatus[i]); + if(!AddSpiritGuide(i + BG_SA_MAXNPC, sg->x, sg->y, sg->z, BG_SA_GYOrientation[i], ((attackers == TEAM_HORDE )? ALLIANCE : HORDE) )) + { + sLog.outError("SOTA: couldn't spawn GY: %u",i); + } + } + } + + //GY capture points + for(uint8 i = BG_SA_CENTRAL_FLAG; i < BG_SA_MAXOBJ; i++) + { + AddObject(i, BG_SA_ObjEntries[i] - (attackers == TEAM_ALLIANCE ? 1:0), + BG_SA_ObjSpawnlocs[i][0], BG_SA_ObjSpawnlocs[i][1], + BG_SA_ObjSpawnlocs[i][2], BG_SA_ObjSpawnlocs[i][3], + 0,0,0,0,RESPAWN_ONE_DAY); + GetBGObject(i)->SetUInt32Value(GAMEOBJECT_FACTION, atF); + } + + //Player may enter BEFORE we set up bG - lets update his worldstates anyway... + UpdateWorldState(BG_SA_RIGHT_GY_HORDE , GraveyardStatus[BG_SA_RIGHT_CAPTURABLE_GY] == TEAM_HORDE?1:0 ); + UpdateWorldState(BG_SA_LEFT_GY_HORDE , GraveyardStatus[BG_SA_LEFT_CAPTURABLE_GY] == TEAM_HORDE?1:0 ); + UpdateWorldState(BG_SA_CENTER_GY_HORDE , GraveyardStatus[BG_SA_CENTRAL_CAPTURABLE_GY] == TEAM_HORDE?1:0 ); + + UpdateWorldState(BG_SA_RIGHT_GY_ALLIANCE , GraveyardStatus[BG_SA_RIGHT_CAPTURABLE_GY] == TEAM_ALLIANCE?1:0 ); + UpdateWorldState(BG_SA_LEFT_GY_ALLIANCE , GraveyardStatus[BG_SA_LEFT_CAPTURABLE_GY] == TEAM_ALLIANCE?1:0 ); + UpdateWorldState(BG_SA_CENTER_GY_ALLIANCE , GraveyardStatus[BG_SA_CENTRAL_CAPTURABLE_GY] == TEAM_ALLIANCE?1:0 ); + + if(attackers == TEAM_ALLIANCE) + { + UpdateWorldState(BG_SA_ALLY_ATTACKS, 1); + UpdateWorldState(BG_SA_HORDE_ATTACKS, 0); + + UpdateWorldState(BG_SA_RIGHT_ATT_TOKEN_ALL, 1); + UpdateWorldState(BG_SA_LEFT_ATT_TOKEN_ALL, 1); + UpdateWorldState(BG_SA_RIGHT_ATT_TOKEN_HRD, 0); + UpdateWorldState(BG_SA_LEFT_ATT_TOKEN_HRD, 0); + + UpdateWorldState(BG_SA_HORDE_DEFENCE_TOKEN,1); + UpdateWorldState(BG_SA_ALLIANCE_DEFENCE_TOKEN,0); + + } + else + { + UpdateWorldState(BG_SA_HORDE_ATTACKS, 1); + UpdateWorldState(BG_SA_ALLY_ATTACKS, 0); + + UpdateWorldState(BG_SA_RIGHT_ATT_TOKEN_ALL, 0); + UpdateWorldState(BG_SA_LEFT_ATT_TOKEN_ALL, 0); + UpdateWorldState(BG_SA_RIGHT_ATT_TOKEN_HRD, 1); + UpdateWorldState(BG_SA_LEFT_ATT_TOKEN_HRD, 1); + + UpdateWorldState(BG_SA_HORDE_DEFENCE_TOKEN,0); + UpdateWorldState(BG_SA_ALLIANCE_DEFENCE_TOKEN,1); + + } + + UpdateWorldState(BG_SA_PURPLE_GATEWS, 1); + UpdateWorldState(BG_SA_RED_GATEWS, 1); + UpdateWorldState(BG_SA_BLUE_GATEWS, 1); + UpdateWorldState(BG_SA_GREEN_GATEWS, 1); + UpdateWorldState(BG_SA_YELLOW_GATEWS, 1); + UpdateWorldState(BG_SA_ANCIENT_GATEWS, 1); + + TeleportPlayers(); + + return true; +} + +void BattleGroundSA::StartShips() +{ + if(ShipsStarted) + return; + sLog.outError("SOTA: Starting boats!"); + DoorOpen(BG_SA_BOAT_ONE); + DoorOpen(BG_SA_BOAT_TWO); + + for(int i = BG_SA_BOAT_ONE; i <= BG_SA_BOAT_TWO; i++) + { + for( BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end();itr++) + { + if(Player* p = objmgr.GetPlayer(itr->first)) + { + if(p->GetTeamId() != attackers) + continue; + + UpdateData data; + WorldPacket pkt; + GetBGObject(i)->BuildValuesUpdateBlockForPlayer(&data, p); + data.BuildPacket(&pkt); + p->GetSession()->SendPacket(&pkt); + } + } + } + + ShipsStarted = true; } void BattleGroundSA::Update(uint32 diff) { BattleGround::Update(diff); + TotalTime += diff; + + if(status == BG_SA_WARMUP || status == BG_SA_SECOND_WARMUP) + { + if(TotalTime >= BG_SA_WARMUPLENGTH) + { + TotalTime = 0; + ToggleTimer(); + status = (status == BG_SA_WARMUP) ? BG_SA_ROUND_ONE : BG_SA_ROUND_TWO; + } + if(TotalTime >= BG_SA_BOAT_START) + StartShips(); + return; + } + else if(status == BG_SA_ROUND_ONE) + { + if(TotalTime >= BG_SA_ROUNDLENGTH) + { + RoundScores[0].time = TotalTime; + TotalTime = 0; + status = BG_SA_SECOND_WARMUP; + attackers = (attackers == TEAM_ALLIANCE) ? TEAM_HORDE : TEAM_ALLIANCE; + RoundScores[0].winner = attackers; + status = BG_SA_SECOND_WARMUP; + ToggleTimer(); + ResetObjs(); + return; + } + + } + else if(status == BG_SA_ROUND_TWO) + { + if(TotalTime >= BG_SA_ROUNDLENGTH) + { + RoundScores[1].time = TotalTime; + RoundScores[1].winner = (attackers == TEAM_ALLIANCE) ? TEAM_HORDE : TEAM_ALLIANCE; + + if(RoundScores[0].time < RoundScores[1].time) + EndBattleGround(RoundScores[0].winner == TEAM_ALLIANCE ? ALLIANCE : HORDE); + else + EndBattleGround(RoundScores[1].winner == TEAM_ALLIANCE ? ALLIANCE : HORDE); + + return; + } + } + + if(status == BG_SA_ROUND_ONE || status == BG_SA_ROUND_TWO) + SendTime(); } void BattleGroundSA::StartingEventCloseDoors() @@ -48,18 +317,81 @@ void BattleGroundSA::StartingEventOpenDoors() { } +void BattleGroundSA::FillInitialWorldStates(WorldPacket& data) +{ + uint32 ally_attacks = uint32(attackers == TEAM_ALLIANCE ? 1 : 0); + uint32 horde_attacks = uint32(attackers == TEAM_HORDE ? 1 : 0); + + for(uint8 i = 0; i < BG_SA_MAX_GY; i++) + sLog.outError("UWS: %u",GraveyardStatus[i]); + + data << uint32(BG_SA_ANCIENT_GATEWS) << uint32(GateStatus[BG_SA_ANCIENT_GATE]); + data << uint32(BG_SA_YELLOW_GATEWS) << uint32(GateStatus[BG_SA_YELLOW_GATE]); + data << uint32(BG_SA_GREEN_GATEWS) << uint32(GateStatus[BG_SA_GREEN_GATE]); + data << uint32(BG_SA_BLUE_GATEWS) << uint32(GateStatus[BG_SA_BLUE_GATE]); + data << uint32(BG_SA_RED_GATEWS) << uint32(GateStatus[BG_SA_RED_GATE]); + data << uint32(BG_SA_PURPLE_GATEWS) << uint32(GateStatus[BG_SA_PURPLE_GATE]); + + data << uint32(BG_SA_BONUS_TIMER) << uint32(0); + + data << uint32(BG_SA_HORDE_ATTACKS)<< horde_attacks; + data << uint32(BG_SA_ALLY_ATTACKS) << ally_attacks; + + //Time will be sent on first update... + data << uint32(BG_SA_ENABLE_TIMER) << ((TimerEnabled) ? uint32(1) : uint32(0)); + data << uint32(BG_SA_TIMER_MINS) << uint32(0); + data << uint32(BG_SA_TIMER_SEC_TENS) << uint32(0); + data << uint32(BG_SA_TIMER_SEC_DECS) << uint32(0); + + data << uint32(BG_SA_RIGHT_GY_HORDE) << uint32(GraveyardStatus[BG_SA_RIGHT_CAPTURABLE_GY] == TEAM_HORDE?1:0 ); + data << uint32(BG_SA_LEFT_GY_HORDE) << uint32(GraveyardStatus[BG_SA_LEFT_CAPTURABLE_GY] == TEAM_HORDE?1:0 ); + data << uint32(BG_SA_CENTER_GY_HORDE) << uint32(GraveyardStatus[BG_SA_CENTRAL_CAPTURABLE_GY] == TEAM_HORDE?1:0 ); + + data << uint32(BG_SA_RIGHT_GY_ALLIANCE) << uint32(GraveyardStatus[BG_SA_RIGHT_CAPTURABLE_GY] == TEAM_ALLIANCE?1:0 ); + data << uint32(BG_SA_LEFT_GY_ALLIANCE) << uint32(GraveyardStatus[BG_SA_LEFT_CAPTURABLE_GY] == TEAM_ALLIANCE?1:0 ); + data << uint32(BG_SA_CENTER_GY_ALLIANCE) << uint32(GraveyardStatus[BG_SA_CENTRAL_CAPTURABLE_GY] == TEAM_ALLIANCE?1:0 ); + + data << uint32(BG_SA_HORDE_DEFENCE_TOKEN) << ally_attacks; + data << uint32(BG_SA_ALLIANCE_DEFENCE_TOKEN) << horde_attacks; + + data << uint32(BG_SA_LEFT_ATT_TOKEN_HRD) << horde_attacks; + data << uint32(BG_SA_RIGHT_ATT_TOKEN_HRD) << horde_attacks; + data << uint32(BG_SA_RIGHT_ATT_TOKEN_ALL) << ally_attacks; + data << uint32(BG_SA_LEFT_ATT_TOKEN_ALL) << ally_attacks; +} + void BattleGroundSA::AddPlayer(Player *plr) { BattleGround::AddPlayer(plr); //create score and add it to map, default values are set in constructor BattleGroundSAScore* sc = new BattleGroundSAScore; + if(!ShipsStarted) + if(plr->GetTeamId() == attackers) + { + plr->CastSpell(plr,12438,true);//Without this player falls before boat loads... + + if(urand(0,1)) + plr->TeleportTo(607, 2682.936f, -830.368f, 50.0f, 2.895f, 0); + else + plr->TeleportTo(607, 2577.003f, 980.261f, 50.0f, 0.807f, 0); + + }else + plr->TeleportTo(607, 1209.7f, -65.16f, 70.1f, 0.0f, 0); + else + { + if(plr->GetTeamId() == attackers) + plr->TeleportTo(607, 1600.381f, -106.263f, 8.8745f, 3.78f, 0); + else + plr->TeleportTo(607, 1209.7f, -65.16f, 70.1f, 0.0f, 0); + } + m_PlayerScores[plr->GetGUID()] = sc; } void BattleGroundSA::RemovePlayer(Player* /*plr*/,uint64 /*guid*/) { - + } void BattleGroundSA::HandleAreaTrigger(Player * /*Source*/, uint32 /*Trigger*/) @@ -76,5 +408,294 @@ void BattleGroundSA::UpdatePlayerScore(Player* Source, uint32 type, uint32 value if(itr == m_PlayerScores.end()) // player not found... return; - BattleGround::UpdatePlayerScore(Source,type,value); + if(type == SCORE_DESTROYED_DEMOLISHER) + ((BattleGroundSAScore*)itr->second)->demolishers_destroyed += value; + else if(type == SCORE_DESTROYED_WALL) + ((BattleGroundSAScore*)itr->second)->gates_destroyed += value; + else + BattleGround::UpdatePlayerScore(Source,type,value); +} + +void BattleGroundSA::TeleportPlayers() +{ + for (BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) + { + if(Player *plr = objmgr.GetPlayer(itr->first)) + { + + if(plr->GetTeamId() == attackers) + { + plr->CastSpell(plr,12438,true);//Without this player falls before boat loads... + + if(urand(0,1)) + plr->TeleportTo(607, 2682.936f, -830.368f, 50.0f, 2.895f, 0); + else + plr->TeleportTo(607, 2577.003f, 980.261f, 50.0f, 0.807f, 0); + } + else + plr->TeleportTo(607, 1209.7f, -65.16f, 70.1f, 0.0f, 0); + + } + } +} + +void BattleGroundSA::EventPlayerDamagedGO(Player* plr, GameObject* go, uint32 event) +{ + sLog.outError("SOTA: EventGO %u",event); + + switch(event) + { + case 19046: //Green gate destroyed + DestroyGate(BG_SA_GREEN_GATE,plr); + return; + case 19045: //blue gate + DestroyGate(BG_SA_BLUE_GATE,plr); + return; + case 19047: //red gate + DestroyGate(BG_SA_RED_GATE,plr); + return; + case 19048: //purple gate + DestroyGate(BG_SA_PURPLE_GATE,plr); + return; + case 19049: //yellow gate + DestroyGate(BG_SA_YELLOW_GATE,plr); + return; + case 19837: //ancient gate + DestroyGate(BG_SA_ANCIENT_GATE,plr); + return; + default: + return; + } + +} + +void BattleGroundSA::HandleKillUnit(Creature* unit, Player* killer) +{ + if(!unit) + return; + + if(unit->GetEntry() == 28781) //Demolisher + UpdatePlayerScore(killer, SCORE_DESTROYED_DEMOLISHER, 1); + +} + +/* + You may ask what the fuck does it do? + Prevents owner overwriting guns faction with own. + */ +void BattleGroundSA::OverrideGunFaction() +{ + if(!m_BgCreatures[0]) + return; + + for(uint8 i = BG_SA_GUN_1; i <= BG_SA_GUN_10;i++) + if(Creature* gun = GetBGCreature(i)) + { + gun->setFaction(BG_SA_Factions[attackers? TEAM_ALLIANCE : TEAM_HORDE]); + } + + for(uint8 i = BG_SA_DEMOLISHER_1; i <= BG_SA_DEMOLISHER_4;i++) + if(Creature* dem = GetBGCreature(i)) + { + dem->setFaction(BG_SA_Factions[attackers]); + } + +} + +void BattleGroundSA::DestroyGate(uint32 i, Player* pl) +{ + if(!GateStatus[i]) + return; + + if(GameObject* g = GetBGObject(i)) + { + if(g->GetGOValue()->building.health == 0) + { + GateStatus[i] = BG_SA_GATE_DESTROYED; + uint32 uws; + switch(i) + { + case 0: + uws = BG_SA_GREEN_GATEWS; + break; + case 1: + uws = BG_SA_YELLOW_GATEWS; + break; + case 2: + uws = BG_SA_BLUE_GATEWS; + break; + case 3: + uws = BG_SA_RED_GATEWS; + break; + case 4: + uws = BG_SA_PURPLE_GATEWS; + break; + case 5: + uws = BG_SA_ANCIENT_GATEWS; + break; + default: + ASSERT(false); + break; + } + + if(i < 5) + DelObject(i+9); + sLog.outError("SOTA: gate %u destroyed!",i+1); + UpdateWorldState(uws, GateStatus[i]); + UpdatePlayerScore(pl,SCORE_DESTROYED_WALL, 1); + } + } + +} + +WorldSafeLocsEntry const* BattleGroundSA::GetClosestGraveYard(Player* player) +{ + uint32 safeloc = 0; + WorldSafeLocsEntry const* ret; + float dist, nearest; + float x,y,z; + + player->GetPosition(x,y,z); + + if(player->GetTeamId() == attackers) + safeloc = BG_SA_GYEntries[BG_SA_BEACH_GY]; + else + safeloc = BG_SA_GYEntries[BG_SA_DEFENDER_LAST_GY]; + + ret = sWorldSafeLocsStore.LookupEntry(safeloc); + nearest = sqrt((ret->x - x)*(ret->x - x) + (ret->y - y)*(ret->y - y)+(ret->z - z)*(ret->z - z)); + + for(uint8 i = BG_SA_LEFT_CAPTURABLE_GY; i < BG_SA_MAX_GY; i++) + { + if(GraveyardStatus[i] != player->GetTeamId()) + continue; + + dist = sqrt((ret->x - x)*(ret->x - x) + (ret->y - y)*(ret->y - y)+(ret->z - z)*(ret->z - z)); + if(dist < nearest) + { + ret = sWorldSafeLocsStore.LookupEntry(BG_SA_GYEntries[i]); + nearest = dist; + } + } + + return ret; +} + +void BattleGroundSA::SendTime() +{ + uint32 end_of_round = (BG_SA_ROUNDLENGTH - TotalTime); + UpdateWorldState(BG_SA_TIMER_MINS, end_of_round/60000); + UpdateWorldState(BG_SA_TIMER_SEC_TENS, (end_of_round%60000)/10000); + UpdateWorldState(BG_SA_TIMER_SEC_DECS, ((end_of_round%60000)%10000)/1000); +} + +void BattleGroundSA::EventPlayerClickedOnFlag(Player *Source, GameObject* target_obj) +{ + + switch(target_obj->GetEntry()) + { + case 191307: + case 191308: + CaptureGraveyard(BG_SA_LEFT_CAPTURABLE_GY); + break; + case 191305: + case 191306: + CaptureGraveyard(BG_SA_RIGHT_CAPTURABLE_GY); + break; + case 191310: + case 191309: + CaptureGraveyard(BG_SA_CENTRAL_CAPTURABLE_GY); + break; + default: + return; + }; + +} + +void BattleGroundSA::CaptureGraveyard(BG_SA_Graveyards i) +{ + + DelCreature(BG_SA_MAXNPC + i); + GraveyardStatus[i] = (GraveyardStatus[i] == TEAM_ALLIANCE? TEAM_HORDE : TEAM_ALLIANCE); + WorldSafeLocsEntry const *sg = NULL; + sg = sWorldSafeLocsStore.LookupEntry(BG_SA_GYEntries[i]); + AddSpiritGuide(i + BG_SA_MAXNPC, sg->x, sg->y, sg->z, BG_SA_GYOrientation[i], (GraveyardStatus[i] == TEAM_ALLIANCE? ALLIANCE : HORDE )); + uint32 npc = 0; + + switch(i) + { + case BG_SA_LEFT_CAPTURABLE_GY: + sLog.outError("LEFT GY"); + SpawnBGObject(BG_SA_LEFT_FLAG,RESPAWN_ONE_DAY); + npc = BG_SA_NPC_RIGSPARK; + AddCreature(BG_SA_NpcEntries[npc], npc, attackers, + BG_SA_NpcSpawnlocs[npc][0], BG_SA_NpcSpawnlocs[npc][1], + BG_SA_NpcSpawnlocs[npc][2], BG_SA_NpcSpawnlocs[npc][3]); + UpdateWorldState(BG_SA_LEFT_GY_ALLIANCE, (GraveyardStatus[i] == TEAM_ALLIANCE? 1:0)); + UpdateWorldState(BG_SA_LEFT_GY_HORDE, (GraveyardStatus[i] == TEAM_ALLIANCE? 0:1)); + break; + case BG_SA_RIGHT_CAPTURABLE_GY: + sLog.outError("RIGHT GY"); + SpawnBGObject(BG_SA_RIGHT_FLAG, RESPAWN_ONE_DAY); + npc = BG_SA_NPC_SPARKLIGHT; + AddCreature(BG_SA_NpcEntries[npc], npc, attackers, + BG_SA_NpcSpawnlocs[npc][0], BG_SA_NpcSpawnlocs[npc][1], + BG_SA_NpcSpawnlocs[npc][2], BG_SA_NpcSpawnlocs[npc][3]); + UpdateWorldState(BG_SA_RIGHT_GY_ALLIANCE, (GraveyardStatus[i] == TEAM_ALLIANCE? 1:0)); + UpdateWorldState(BG_SA_RIGHT_GY_HORDE, (GraveyardStatus[i] == TEAM_ALLIANCE? 0:1)); + break; + case BG_SA_CENTRAL_CAPTURABLE_GY: + SpawnBGObject(BG_SA_CENTRAL_FLAG, RESPAWN_ONE_DAY); + UpdateWorldState(BG_SA_CENTER_GY_ALLIANCE, (GraveyardStatus[i] == TEAM_ALLIANCE? 1:0)); + UpdateWorldState(BG_SA_CENTER_GY_HORDE, (GraveyardStatus[i] == TEAM_ALLIANCE? 0:1)); + break; + default: + ASSERT(0); + break; + }; + + +} + +void BattleGroundSA::EventPlayerUsedGO(Player* Source, GameObject* object) +{ + + if(object->GetEntry() == BG_SA_ObjEntries[BG_SA_TITAN_RELIC]) + { + sLog.outError("SOTA: Match ended."); + if(Source->GetTeamId() == attackers) + { + + if(status == BG_SA_ROUND_ONE) + { + RoundScores[0].winner = attackers; + RoundScores[0].time = TotalTime; + attackers = (attackers == TEAM_ALLIANCE) ? TEAM_HORDE : TEAM_ALLIANCE; + status = BG_SA_SECOND_WARMUP; + TotalTime = 0; + ToggleTimer(); + ResetObjs(); + } + else if(status == BG_SA_ROUND_TWO) + { + RoundScores[1].winner = attackers; + RoundScores[1].time = TotalTime; + ToggleTimer(); + if(RoundScores[0].time < RoundScores[1].time) + EndBattleGround(RoundScores[0].winner == TEAM_ALLIANCE ? ALLIANCE : HORDE); + else + EndBattleGround(RoundScores[1].winner == TEAM_ALLIANCE ? ALLIANCE : HORDE); + + } + } + } + +} + +void BattleGroundSA::ToggleTimer() +{ + + TimerEnabled = !TimerEnabled; + UpdateWorldState(BG_SA_ENABLE_TIMER, (TimerEnabled) ? 1 : 0); + } diff --git a/src/game/BattleGroundSA.h b/src/game/BattleGroundSA.h index 3ba23d02656..17b30c51240 100644 --- a/src/game/BattleGroundSA.h +++ b/src/game/BattleGroundSA.h @@ -24,8 +24,267 @@ class BattleGround; class BattleGroundSAScore : public BattleGroundScore { public: - BattleGroundSAScore() {}; + BattleGroundSAScore(): demolishers_destroyed(0), gates_destroyed(0) {}; virtual ~BattleGroundSAScore() {}; + uint8 demolishers_destroyed; + uint8 gates_destroyed; +}; + +enum BG_SA_Status + { + BG_SA_NOTSTARTED = 0, + BG_SA_WARMUP, + BG_SA_ROUND_ONE, + BG_SA_SECOND_WARMUP, + BG_SA_ROUND_TWO, + BG_SA_BONUS_ROUND + }; + +enum BG_SA_GateState + { + BG_SA_GATE_OK = 1, + BG_SA_GATE_DAMAGED = 2, + BG_SA_GATE_DESTROYED = 3 + }; + +enum BG_SA_Timers + { + BG_SA_BOAT_START = 60000, + BG_SA_WARMUPLENGTH = 120000, + BG_SA_ROUNDLENGTH = 600000 + }; + +enum BG_SA_WorldStates + { + BG_SA_TIMER_MINS = 3559, + BG_SA_TIMER_SEC_TENS = 3560, + BG_SA_TIMER_SEC_DECS = 3561, + BG_SA_ALLY_ATTACKS = 4352, + BG_SA_HORDE_ATTACKS = 4353, + + BG_SA_PURPLE_GATEWS = 3614, + BG_SA_RED_GATEWS = 3617, + BG_SA_BLUE_GATEWS = 3620, + BG_SA_GREEN_GATEWS = 3623, + BG_SA_YELLOW_GATEWS = 3638, + BG_SA_ANCIENT_GATEWS = 3849, + + + BG_SA_LEFT_GY_ALLIANCE = 3635, + BG_SA_RIGHT_GY_ALLIANCE = 3636, + BG_SA_CENTER_GY_ALLIANCE = 3637, + + BG_SA_RIGHT_ATT_TOKEN_ALL = 3627, + BG_SA_LEFT_ATT_TOKEN_ALL = 3626, + + BG_SA_LEFT_ATT_TOKEN_HRD = 3629, + BG_SA_RIGHT_ATT_TOKEN_HRD = 3628, + + BG_SA_HORDE_DEFENCE_TOKEN = 3631, + BG_SA_ALLIANCE_DEFENCE_TOKEN = 3630, + + BG_SA_RIGHT_GY_HORDE = 3632, + BG_SA_LEFT_GY_HORDE = 3633, + BG_SA_CENTER_GY_HORDE = 3634, + + BG_SA_BONUS_TIMER = 0xdf3, + BG_SA_ENABLE_TIMER = 3564, + }; + +enum BG_SA_NPCs + { + BG_SA_GUN_1 = 0, + BG_SA_GUN_2, + BG_SA_GUN_3, + BG_SA_GUN_4, + BG_SA_GUN_5, + BG_SA_GUN_6, + BG_SA_GUN_7, + BG_SA_GUN_8, + BG_SA_GUN_9, + BG_SA_GUN_10, + BG_SA_DEMOLISHER_1, + BG_SA_DEMOLISHER_2, + BG_SA_DEMOLISHER_3, + BG_SA_DEMOLISHER_4, + BG_SA_NPC_SPARKLIGHT, + BG_SA_NPC_RIGSPARK, + BG_SA_MAXNPC + }; + +const uint32 BG_SA_NpcEntries[BG_SA_MAXNPC] = + { + 27894, + 27894, + 27894, + 27894, + 27894, + 27894, + 27894, + 27894, + 27894, + 27894, + //4 beach demolishers + 28781, + 28781, + 28781, + 28781, + //Fizzle Sparklight, or whatever his name was + 29260, + 29262, + }; + +const float BG_SA_NpcSpawnlocs[BG_SA_MAXNPC][4] = + { + //Cannons + { 1436.429f, 110.05f, 41.407f, 5.4f }, + { 1404.9023f, 84.758f, 41.183f, 5.46f }, + { 1068.693f, -86.951f, 93.81f, 0.02f }, + { 1068.83f, -127.56f, 96.45f, 0.0912f }, + { 1422.115f, -196.433f, 42.1825f, 1.0222f }, + { 1454.887f, -220.454f, 41.956f, 0.9627f }, + { 1232.345f, -187.517f, 66.945f, 0.45f }, + { 1249.634f, -224.189f, 66.72f, 0.635f }, + { 1236.213f, 92.287f, 64.965f, 5.751f }, + { 1215.11f, 57.772f, 64.739f, 5.78f } , + //Demolishers + { 1611.597656,-117.270073,8.719355,2.513274}, + { 1575.562500,-158.421875,5.024450,2.129302}, + { 1618.047729,61.424641,7.248210,3.979351}, + { 1575.103149,98.873344,2.830360,3.752458}, + //Npcs + { 1348.644165, -298.786469, 31.080130, 1.710423}, + { 1358.191040, 195.527786, 31.018187, 4.171337}, + }; + +enum BG_SA_Objects + { + BG_SA_GREEN_GATE = 0, + BG_SA_YELLOW_GATE, + BG_SA_BLUE_GATE, + BG_SA_RED_GATE, + BG_SA_PURPLE_GATE, + BG_SA_ANCIENT_GATE, + BG_SA_TITAN_RELIC, + BG_SA_BOAT_ONE, + BG_SA_BOAT_TWO, + BG_SA_SIGIL_1, + BG_SA_SIGIL_2, + BG_SA_SIGIL_3, + BG_SA_SIGIL_4, + BG_SA_SIGIL_5, + BG_SA_CENTRAL_FLAGPOLE, + BG_SA_RIGHT_FLAGPOLE, + BG_SA_LEFT_FLAGPOLE, + BG_SA_CENTRAL_FLAG, + BG_SA_RIGHT_FLAG, + BG_SA_LEFT_FLAG, + BG_SA_MAXOBJ + }; + +const float BG_SA_ObjSpawnlocs[BG_SA_MAXOBJ][4] = + { + { 1411.57f, 108.163f, 28.692f, 5.441f }, + { 1055.452f, -108.1f, 82.134f, 0.034f }, + { 1431.3413f, -219.437f, 30.893f, 0.9736f }, + { 1227.667f, -212.555f, 55.372f, 0.5023f }, + { 1214.681f, 81.21f, 53.413f, 5.745f }, + { 878.555f, -108.989f, 119.835f, 0.0565f }, + { 836.5f, -108.8f, 120.219f, 0.0f }, + //Ships + { 2679.696777, -826.891235, 3.712860, 5.78367f}, //rot2 1 rot3 0.0002 + { 2574.003662, 981.261475, 2.603424, 0.807696}, + //Sigils + { 1414.054f, 106.72f, 41.442f, 5.441f }, + { 1060.63f, -107.8f, 94.7f, 0.034f }, + { 1433.383f, -216.4f, 43.642f, 0.9736f }, + { 1230.75f, -210.724f, 67.611f, 0.5023f }, + { 1217.8f, 79.532f, 66.58f, 5.745f }, + //Flagpoles + { 1215.114258,-65.711861,70.084267,-3.124123}, + {1338.863892,-153.336533,30.895121,-2.530723}, + {1309.124268,9.410645,30.893402,-1.623156}, + //Flags + { 1215.108032,-65.715767,70.084267,-3.124123}, + { 1338.859253,-153.327316,30.895077,-2.530723}, + { 1309.192017,9.416233,30.893402,1.518436}, + }; + +/* Ships: + * 193182 - ally + * 193183 - horde + * 193184 - horde + * 193185 - ally + * Banners: + * 191308 - left one, + * 191306 - right one, + * 191310 - central, + * Ally ones, substract 1 + * to get horde ones. + */ + +const uint32 BG_SA_ObjEntries[BG_SA_MAXOBJ] = + { + 190722, + 190727, + 190724, + 190726, + 190723, + 192549, + 192834, + 193182, + 193185, + 192687, + 192685, + 192689, + 192690, + 192691, + 191311, + 191311, + 191311, + 191310, + 191306, + 191308, + }; + +const uint32 BG_SA_Factions[2] = + { + 1732, + 1735, + }; + +enum BG_SA_Graveyards + { + BG_SA_BEACH_GY = 0, + BG_SA_DEFENDER_LAST_GY, + BG_SA_RIGHT_CAPTURABLE_GY, + BG_SA_LEFT_CAPTURABLE_GY, + BG_SA_CENTRAL_CAPTURABLE_GY, + BG_SA_MAX_GY + }; + +const uint32 BG_SA_GYEntries[BG_SA_MAX_GY] = + { + 1350, + 1349, + 1347, + 1346, + 1348, + }; + +const float BG_SA_GYOrientation[BG_SA_MAX_GY] = + { + 6.202f, + 1.926f, //right capturable GY + 3.917f, //left capturable GY + 3.104f, //center, capturable + 6.148f, //defender last GY + }; + +struct BG_SA_RoundScore +{ + TeamId winner; + uint32 time; }; class BattleGroundSA : public BattleGround @@ -41,14 +300,38 @@ class BattleGroundSA : public BattleGround virtual void AddPlayer(Player *plr); virtual void StartingEventCloseDoors(); virtual void StartingEventOpenDoors(); + virtual bool SetupBattleGround(); + virtual void Reset(); + virtual void FillInitialWorldStates(WorldPacket& data); + virtual void EventPlayerDamagedGO(Player* plr, GameObject* go, uint32 event); + virtual void HandleKillUnit(Creature* unit, Player* killer); + virtual WorldSafeLocsEntry const* GetClosestGraveYard(Player* player); + virtual void EventPlayerClickedOnFlag(Player *Source, GameObject* target_obj); + virtual void EventPlayerUsedGO(Player* Source, GameObject* object); void RemovePlayer(Player *plr,uint64 guid); void HandleAreaTrigger(Player *Source, uint32 Trigger); - //bool SetupBattleGround(); + /* Scorekeeping */ void UpdatePlayerScore(Player *Source, uint32 type, uint32 value); private: + bool ResetObjs(); + void StartShips(); + void TeleportPlayers(); + void OverrideGunFaction(); + void DestroyGate(uint32 i, Player* pl); + void SendTime(); + void CaptureGraveyard(BG_SA_Graveyards i); + void ToggleTimer(); + TeamId attackers; + uint32 TotalTime; + bool ShipsStarted; + BG_SA_GateState GateStatus[6]; + BG_SA_Status status; + TeamId GraveyardStatus[BG_SA_MAX_GY]; + BG_SA_RoundScore RoundScores[2]; + bool TimerEnabled; }; #endif diff --git a/src/game/CharacterHandler.cpp b/src/game/CharacterHandler.cpp index bc2b4d97a4e..17b23b61e64 100644 --- a/src/game/CharacterHandler.cpp +++ b/src/game/CharacterHandler.cpp @@ -456,6 +456,8 @@ void WorldSession::HandleCharCreateOpcode( WorldPacket & recv_data ) if ((have_same_race && skipCinematics == 1) || skipCinematics == 2) pNewChar->setCinematic(1); // not show intro + pNewChar->SetAtLoginFlag(AT_LOGIN_FIRST); // First login + // Player created, save it now pNewChar->SaveToDB(); charcount+=1; @@ -659,22 +661,21 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder * holder) if(guild) { data.Initialize(SMSG_GUILD_EVENT, (2+guild->GetMOTD().size()+1)); - data << (uint8)GE_MOTD; - data << (uint8)1; + data << uint8(GE_MOTD); + data << uint8(1); data << guild->GetMOTD(); SendPacket(&data); DEBUG_LOG( "WORLD: Sent guild-motd (SMSG_GUILD_EVENT)" ); + guild->DisplayGuildBankTabsInfo(this); + data.Initialize(SMSG_GUILD_EVENT, (5+10)); // we guess size - data<<(uint8)GE_SIGNED_ON; - data<<(uint8)1; - data<<pCurrChar->GetName(); - data<<pCurrChar->GetGUID(); + data<<uint8(GE_SIGNED_ON); + data<<uint8(1); + data<< pCurrChar->GetName(); + data<< pCurrChar->GetGUID(); guild->BroadcastPacket(&data); DEBUG_LOG( "WORLD: Sent guild-signed-on (SMSG_GUILD_EVENT)" ); - - // Increment online members of the guild - guild->IncOnlineMemberCount(); } else { @@ -689,9 +690,6 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder * holder) data << uint32(0); SendPacket(&data); - if(!pCurrChar->isAlive()) - pCurrChar->SendCorpseReclaimDelay(true); - pCurrChar->SendInitialPacketsBeforeAddToMap(); //Show cinematic at the first time that player login @@ -784,6 +782,9 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder * holder) SendNotification(LANG_RESET_TALENTS); } + if (pCurrChar->HasAtLoginFlag(AT_LOGIN_FIRST)) + pCurrChar->RemoveAtLoginFlag(AT_LOGIN_FIRST); + // show time before shutdown if shutdown planned. if(sWorld.IsShutdowning()) sWorld.ShutdownMsg(true,pCurrChar); diff --git a/src/game/Chat.cpp b/src/game/Chat.cpp index 3c595d49124..588289b6e4d 100644 --- a/src/game/Chat.cpp +++ b/src/game/Chat.cpp @@ -1819,7 +1819,7 @@ void ChatHandler::FillMessageData(WorldPacket *data, WorldSession* session, uint case CHAT_MSG_MONSTER_EMOTE: case CHAT_MSG_RAID_BOSS_WHISPER: case CHAT_MSG_RAID_BOSS_EMOTE: - case CHAT_MSG_BN: + case CHAT_MSG_BATTLENET: { *data << uint64(speaker->GetGUID()); *data << uint32(0); // 2.1.0 @@ -1838,7 +1838,7 @@ void ChatHandler::FillMessageData(WorldPacket *data, WorldSession* session, uint return; } default: - if (type != CHAT_MSG_REPLY && type != CHAT_MSG_IGNORED && type != CHAT_MSG_DND && type != CHAT_MSG_AFK) + if (type != CHAT_MSG_WHISPER_INFORM && type != CHAT_MSG_IGNORED && type != CHAT_MSG_DND && type != CHAT_MSG_AFK) target_guid = 0; // only for CHAT_MSG_WHISPER_INFORM used original value target_guid break; } @@ -1855,7 +1855,7 @@ void ChatHandler::FillMessageData(WorldPacket *data, WorldSession* session, uint *data << uint64(target_guid); *data << uint32(messageLength); *data << message; - if (session != 0 && type != CHAT_MSG_REPLY && type != CHAT_MSG_DND && type != CHAT_MSG_AFK) + if (session != 0 && type != CHAT_MSG_WHISPER_INFORM && type != CHAT_MSG_DND && type != CHAT_MSG_AFK) *data << uint8(session->GetPlayer()->chatTag()); else *data << uint8(0); diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp index 433b5e1610d..7816412a0ad 100644 --- a/src/game/Creature.cpp +++ b/src/game/Creature.cpp @@ -972,7 +972,7 @@ void Creature::SetLootRecipient(Unit *unit) { m_lootRecipient = 0; RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); - RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_OTHER_TAGGER); + RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_TAPPED); return; } @@ -981,7 +981,7 @@ void Creature::SetLootRecipient(Unit *unit) return; m_lootRecipient = player->GetGUID(); - SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_OTHER_TAGGER); + SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_TAPPED); } void Creature::SaveToDB() @@ -1583,9 +1583,9 @@ void Creature::Respawn(bool force) if (IsAIEnabled) AI()->JustRespawned(); - uint16 poolid = poolhandler.IsPartOfAPool(GetGUIDLow(), GetTypeId()); + uint16 poolid = GetDBTableGUIDLow() ? poolhandler.IsPartOfAPool<Creature>(GetDBTableGUIDLow()) : 0; if (poolid) - poolhandler.UpdatePool(poolid, GetGUIDLow(), TYPEID_UNIT); + poolhandler.UpdatePool<Creature>(poolid, GetDBTableGUIDLow()); } SetToNotify(); diff --git a/src/game/Creature.h b/src/game/Creature.h index 3aa88c1b9db..d19ee3635a1 100644 --- a/src/game/Creature.h +++ b/src/game/Creature.h @@ -54,6 +54,8 @@ enum CreatureFlagsExtra //CREATURE_FLAG_EXTRA_CHARM_AI = 0x00008000, // use ai when charmed CREATURE_FLAG_EXTRA_NO_CRIT = 0x00020000, // creature can't do critical strikes CREATURE_FLAG_EXTRA_NO_SKILLGAIN = 0x00040000, // creature won't increase weapon skills + CREATURE_FLAG_EXTRA_TAUNT_DIMINISH = 0x00080000, // Taunt is a subject to diminishing returns on this creautre + CREATURE_FLAG_EXTRA_ALL_DIMINISH = 0x00100000, // Creature is subject to all diminishing returns as player are }; // GCC have alternative #pragma pack(N) syntax and old gcc version not support pack(push,N), also any gcc version not support it at some platform diff --git a/src/game/DBCEnums.h b/src/game/DBCEnums.h index 090369d091e..715c0933bde 100644 --- a/src/game/DBCEnums.h +++ b/src/game/DBCEnums.h @@ -196,8 +196,11 @@ enum AchievementCriteriaTypes ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE= 112, ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL = 113, ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS = 114, - // 0..114 => 115 criteria types total - ACHIEVEMENT_CRITERIA_TYPE_TOTAL = 115, + // 0..115 => 116 criteria types total + ACHIEVEMENT_CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS = 115, + ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS = 119, + // 0..119 => 120 criteria types total + ACHIEVEMENT_CRITERIA_TYPE_TOTAL = 120, }; enum AreaFlags @@ -283,13 +286,13 @@ enum FactionMasks // if none flags set then non-aggressive creature }; -enum MapTypes +enum MapTypes // Lua_IsInInstance { - MAP_COMMON = 0, - MAP_INSTANCE = 1, - MAP_RAID = 2, - MAP_BATTLEGROUND = 3, - MAP_ARENA = 4 + MAP_COMMON = 0, // none + MAP_INSTANCE = 1, // party + MAP_RAID = 2, // raid + MAP_BATTLEGROUND = 3, // pvp + MAP_ARENA = 4 // arena }; enum AbilytyLearnType diff --git a/src/game/DBCStores.cpp b/src/game/DBCStores.cpp index 97985a23363..989e94fb2d5 100644 --- a/src/game/DBCStores.cpp +++ b/src/game/DBCStores.cpp @@ -108,7 +108,8 @@ MapDifficultyMap sMapDifficultyMap; DBCStorage <MovieEntry> sMovieStore(MovieEntryfmt); DBCStorage <QuestSortEntry> sQuestSortStore(QuestSortEntryfmt); - +DBCStorage <QuestXPEntry> sQuestXPStore(QuestXPfmt); +DBCStorage <QuestFactionRewEntry> sQuestFactionRewardStore(QuestFactionRewardfmt); DBCStorage <RandomPropertiesPointsEntry> sRandomPropertiesPointsStore(RandomPropertiesPointsfmt); DBCStorage <ScalingStatDistributionEntry> sScalingStatDistributionStore(ScalingStatDistributionfmt); DBCStorage <ScalingStatValuesEntry> sScalingStatValuesStore(ScalingStatValuesfmt); @@ -215,7 +216,7 @@ void LoadDBCStores(const std::string& dataPath) { std::string dbcPath = dataPath+"dbc/"; - const uint32 DBCFilesCount = 82; + const uint32 DBCFilesCount = 83; barGoLink bar(DBCFilesCount); @@ -328,6 +329,8 @@ void LoadDBCStores(const std::string& dataPath) LoadDBC(availableDbcLocales,bar,bad_dbc_files,sMovieStore, dbcPath,"Movie.dbc"); LoadDBC(availableDbcLocales,bar,bad_dbc_files,sQuestSortStore, dbcPath,"QuestSort.dbc"); + LoadDBC(availableDbcLocales,bar,bad_dbc_files,sQuestXPStore, dbcPath,"QuestXP.dbc"); + LoadDBC(availableDbcLocales,bar,bad_dbc_files,sQuestFactionRewardStore, dbcPath,"QuestFactionReward.dbc"); LoadDBC(availableDbcLocales,bar,bad_dbc_files,sRandomPropertiesPointsStore, dbcPath,"RandPropPoints.dbc"); LoadDBC(availableDbcLocales,bar,bad_dbc_files,sScalingStatDistributionStore, dbcPath,"ScalingStatDistribution.dbc"); LoadDBC(availableDbcLocales,bar,bad_dbc_files,sScalingStatValuesStore, dbcPath,"ScalingStatValues.dbc"); @@ -523,13 +526,13 @@ void LoadDBCStores(const std::string& dataPath) } // Check loaded DBC files proper version - if( !sSpellStore.LookupEntry(69599) || // last added spell in 3.2.2 - !sMapStore.LookupEntry(650) || // last map added in 3.2.2 - !sGemPropertiesStore.LookupEntry(1629) || // last gem property added in 3.2.2 - !sItemExtendedCostStore.LookupEntry(2723) || // last item extended cost added in 3.2.2 - !sCharTitlesStore.LookupEntry(171) || // last char title added in 3.2.2 - !sAreaStore.LookupEntry(3091) || // last area (areaflag) added in 3.2.2 - !sItemStore.LookupEntry(49667) ) // last client known item added in 3.2.2 + if( !sSpellStore.LookupEntry(74445) || // last added spell in 3.3.2 + !sMapStore.LookupEntry(718) || // last map added in 3.3.2 + !sGemPropertiesStore.LookupEntry(1629) || // last gem property added in 3.3.2 + !sItemExtendedCostStore.LookupEntry(2982) || // last item extended cost added in 3.3.2 + !sCharTitlesStore.LookupEntry(177) || // last char title added in 3.3.2 + !sAreaStore.LookupEntry(3461) || // last area (areaflag) added in 3.3.2 + !sItemStore.LookupEntry(52686) ) // last client known item added in 3.3.2 { sLog.outError("\nYou have _outdated_ DBC files. Please extract correct versions from current using client."); exit(1); diff --git a/src/game/DBCStores.h b/src/game/DBCStores.h index 8c1fdbb8f63..fb301660525 100644 --- a/src/game/DBCStores.h +++ b/src/game/DBCStores.h @@ -117,6 +117,8 @@ extern DBCStorage <MapEntry> sMapStore; extern MapDifficultyMap sMapDifficultyMap; extern DBCStorage <MovieEntry> sMovieStore; extern DBCStorage <QuestSortEntry> sQuestSortStore; +extern DBCStorage <QuestXPEntry> sQuestXPStore; +extern DBCStorage <QuestFactionRewEntry> sQuestFactionRewardStore; extern DBCStorage <RandomPropertiesPointsEntry> sRandomPropertiesPointsStore; extern DBCStorage <ScalingStatDistributionEntry> sScalingStatDistributionStore; extern DBCStorage <ScalingStatValuesEntry> sScalingStatValuesStore; diff --git a/src/game/DBCStructure.h b/src/game/DBCStructure.h index 91517153929..15f489573ff 100644 --- a/src/game/DBCStructure.h +++ b/src/game/DBCStructure.h @@ -595,16 +595,13 @@ struct BattlemasterListEntry uint32 id; // 0 int32 mapid[8]; // 1-8 mapid uint32 type; // 9 (3 - BG, 4 - arena) - uint32 minlvl; // 10 - uint32 maxlvl; // 11 - uint32 maxplayersperteam; // 12 - // 13 minplayers - // 14 0 or 9 - // 15 - char* name[16]; // 16-31 - // 32 string flag, unused - // 33 unused - //uint32 unk; // 34 new 3.1 + uint32 maxplayersperteam; // 10 + //uint32 unk1; // 11 (0 or 1) + char* name[16]; // 12-27 + // 28 string flag, unused + // 29 unused + //uint32 unk2; // 30 new 3.1 + }; #define MAX_OUTFIT_ITEMS 24 @@ -812,10 +809,14 @@ struct FactionEntry int32 BaseRepValue[4]; // 10-13 m_reputationBase uint32 ReputationFlags[4]; // 14-17 m_reputationFlags uint32 team; // 18 m_parentFactionID - char* name[16]; // 19-34 m_name_lang - // 35 string flags - //char* description[16]; // 36-51 m_description_lang - // 52 string flags + //float unk1; // 19 + //float unk2; // 20 + //uint32 unk3 // 21 + //uint32 unk4; // 22 + char* name[16]; // 23-38 m_name_lang + // 39 string flags + //char* description[16]; // 40-55 m_description_lang + // 56 string flags }; struct FactionTemplateEntry @@ -1114,23 +1115,24 @@ struct MapEntry uint32 MapID; // 0 //char* internalname; // 1 unused uint32 map_type; // 2 - // 3 0 or 1 for battlegrounds (not arenas) - char* name[16]; // 4-19 - // 20 name flags, unused - uint32 linked_zone; // 21 common zone for instance and continent map - //char* hordeIntro[16]; // 23-37 text for PvP Zones - // 38 intro text flags - //char* allianceIntro[16]; // 39-54 text for PvP Zones - // 55 intro text flags - uint32 multimap_id; // 56 - // 57 - int32 entrance_map; // 58 map_id of entrance map - float entrance_x; // 59 entrance x coordinate (if exist single entry) - float entrance_y; // 60 entrance y coordinate (if exist single entry) - // 61 -1, 0 and 720 - uint32 addon; // 62 (0-original maps,1-tbc addon) - uint32 unk_time; // 63 some kind of time? - for pre-bc raids - //uint32 maxPlayers; // 64 max players + //uint32 unk_330; // 3 + // 4 0 or 1 for battlegrounds (not arenas) + char* name[16]; // 5-20 + // 21 name flags, unused + uint32 linked_zone; // 22 common zone for instance and continent map + //char* hordeIntro[16]; // 23-38 text for PvP Zones + // 39 intro text flags + //char* allianceIntro[16]; // 40-55 text for PvP Zones + // 56 intro text flags + uint32 multimap_id; // 57 + // 58 + int32 entrance_map; // 59 map_id of entrance map + float entrance_x; // 60 entrance x coordinate (if exist single entry) + float entrance_y; // 61 entrance y coordinate (if exist single entry) + // 62 -1, 0 and 720 + uint32 addon; // 63 (0-original maps,1-tbc addon) + uint32 unk_time; // 64 some kind of time? + //uint32 maxPlayers; // 65 max players // Helpers uint32 Expansion() const { return addon; } @@ -1195,6 +1197,18 @@ struct QuestSortEntry // 17 name flags }; +struct QuestXPEntry +{ + uint32 id; + uint32 Exp[10]; +}; + +struct QuestFactionRewEntry +{ + uint32 id; + int32 QuestRewFactionValue[10]; +}; + struct RandomPropertiesPointsEntry { //uint32 Id; // 0 hidden key @@ -1221,19 +1235,20 @@ struct ScalingStatValuesEntry uint32 dpsMod[6]; // 10-15 DPS mod for level uint32 spellBonus; // 16 spell power for level uint32 ssdMultiplier2; // 17 there's data from 3.1 dbc ssdMultiplier[3] - //uint32 unk1; // 18 all fields equal to 0 - //uint32 unk2; // 19 unk, probably also Armor for level + uint32 ssdMultiplier3; // 18 3.3 + //uint32 unk2; // 19 unk, probably also Armor for level (flag 0x80000?) uint32 armorMod2[4]; // 20-23 Armor for level uint32 getssdMultiplier(uint32 mask) const { - if (mask & 0x001F) + if (mask & 0x4001F) { if(mask & 0x00000001) return ssdMultiplier[0]; if(mask & 0x00000002) return ssdMultiplier[1]; if(mask & 0x00000004) return ssdMultiplier[2]; if(mask & 0x00000008) return ssdMultiplier2; if(mask & 0x00000010) return ssdMultiplier[3]; + if(mask & 0x00040000) return ssdMultiplier3; } return 0; } @@ -1407,7 +1422,7 @@ struct SpellEntry //uint32 modalNextSpell; // 48 m_modalNextSpell not used uint32 StackAmount; // 49 m_cumulativeAura uint32 Totem[2]; // 50-51 m_totem - int32 Reagent[8]; // 50-59 m_reagent + int32 Reagent[8]; // 52-59 m_reagent uint32 ReagentCount[8]; // 60-67 m_reagentCount int32 EquippedItemClass; // 68 m_equippedItemClass (value) int32 EquippedItemSubClassMask; // 69 m_equippedItemSubclass (mask) @@ -1421,8 +1436,8 @@ struct SpellEntry uint32 EffectMechanic[MAX_SPELL_EFFECTS]; // 89-91 m_effectMechanic uint32 EffectImplicitTargetA[MAX_SPELL_EFFECTS]; // 92-94 m_implicitTargetA uint32 EffectImplicitTargetB[MAX_SPELL_EFFECTS]; // 95-97 m_implicitTargetB - uint32 EffectRadiusIndex[MAX_SPELL_EFFECTS]; // 98-100 m_effectRadiusIndex - spellradius.dbc - uint32 EffectApplyAuraName[MAX_SPELL_EFFECTS]; // 101-103 m_effectAura + uint32 EffectRadiusIndex[MAX_SPELL_EFFECTS]; // 98-100 m_effectRadiusIndex - spellradius.dbc + uint32 EffectApplyAuraName[MAX_SPELL_EFFECTS]; // 101-103 m_effectAura uint32 EffectAmplitude[MAX_SPELL_EFFECTS]; // 104-106 m_effectAuraPeriod float EffectMultipleValue[MAX_SPELL_EFFECTS]; // 107-109 m_effectAmplitude uint32 EffectChainTarget[MAX_SPELL_EFFECTS]; // 110-112 m_effectChainTargets @@ -1431,6 +1446,43 @@ struct SpellEntry int32 EffectMiscValueB[MAX_SPELL_EFFECTS]; // 119-121 m_effectMiscValueB uint32 EffectTriggerSpell[MAX_SPELL_EFFECTS]; // 122-124 m_effectTriggerSpell float EffectPointsPerComboPoint[MAX_SPELL_EFFECTS]; // 125-127 m_effectPointsPerCombo + flag96 EffectSpellClassMask[MAX_SPELL_EFFECTS]; // 128-136 + uint32 SpellVisual[2]; // 137-138 m_spellVisualID + uint32 SpellIconID; // 139 m_spellIconID + uint32 activeIconID; // 140 m_activeIconID + //uint32 spellPriority; // 141 not used + char* SpellName[16]; // 142-157 m_name_lang + //uint32 SpellNameFlag; // 158 not used + char* Rank[16]; // 159-174 m_nameSubtext_lang + //uint32 RankFlags; // 175 not used + //char* Description[16]; // 176-191 m_description_lang not used + //uint32 DescriptionFlags; // 192 not used + //char* ToolTip[16]; // 193-208 m_auraDescription_lang not used + //uint32 ToolTipFlags; // 209 not used + uint32 ManaCostPercentage; // 210 m_manaCostPct + uint32 StartRecoveryCategory; // 211 m_startRecoveryCategory + uint32 StartRecoveryTime; // 212 m_startRecoveryTime + uint32 MaxTargetLevel; // 213 m_maxTargetLevel + uint32 SpellFamilyName; // 214 m_spellClassSet + flag96 SpellFamilyFlags; // 215-217 + uint32 MaxAffectedTargets; // 218 m_maxTargets + uint32 DmgClass; // 219 m_defenseType + uint32 PreventionType; // 220 m_preventionType + //uint32 StanceBarOrder; // 221 m_stanceBarOrder not used + float DmgMultiplier[3]; // 222-224 m_effectChainAmplitude + //uint32 MinFactionId; // 225 m_minFactionID not used + //uint32 MinReputation; // 226 m_minReputation not used + //uint32 RequiredAuraVision; // 227 m_requiredAuraVision not used + uint32 TotemCategory[2]; // 228-229 m_requiredTotemCategoryID + int32 AreaGroupId; // 230 m_requiredAreaGroupId + uint32 SchoolMask; // 231 m_schoolMask + uint32 runeCostID; // 232 m_runeCostID + //uint32 spellMissileID; // 233 m_spellMissileID not used + //uint32 PowerDisplayId; // 234 PowerDisplay.dbc, new in 3.1 + //float unk_320_4[3]; // 235-237 3.2.0 + //uint32 spellDescriptionVariableID; // 238 3.2.0 + //uint32 SpellDifficultyId; // 239 3.3.0 + /* flag96 EffectSpellClassMask[MAX_SPELL_EFFECTS]; // 127-136 uint32 SpellVisual[2]; // 137-138 m_spellVisualID uint32 SpellIconID; // 139 m_spellIconID @@ -1466,7 +1518,7 @@ struct SpellEntry //uint32 PowerDisplayId; // 234 PowerDisplay.dbc, new in 3.1 //float unk_320_4[3]; // 235-237 3.2.0 //uint32 spellDescriptionVariableID; // 238 3.2.0 - +*/ // helpers int32 CalculateSimpleValue(uint8 eff) const { return EffectBasePoints[eff]+int32(EffectBaseDice[eff]); } diff --git a/src/game/DBCfmt.h b/src/game/DBCfmt.h index bac2ff19028..a323e47501a 100644 --- a/src/game/DBCfmt.h +++ b/src/game/DBCfmt.h @@ -30,7 +30,7 @@ const char AreaTriggerEntryfmt[]="niffffffff"; const char AuctionHouseEntryfmt[]="niiixxxxxxxxxxxxxxxxx"; const char BankBagSlotPricesEntryfmt[]="ni"; const char BarberShopStyleEntryfmt[]="nixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiii"; -const char BattlemasterListEntryfmt[]="niiiiiiiiiiiixxxssssssssssssssssxxx"; +const char BattlemasterListEntryfmt[]="niiiiiiiiiixssssssssssssssssxxx"; const char CharStartOutfitEntryfmt[]="diiiiiiiiiiiiiiiiiiiiiiiiixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; const char CharTitlesEntryfmt[]="nxssssssssssssssssxxxxxxxxxxxxxxxxxxi"; const char ChatChannelsEntryfmt[]="iixssssssssssssssssxxxxxxxxxxxxxxxxxx"; @@ -47,7 +47,7 @@ const char DurabilityCostsfmt[]="niiiiiiiiiiiiiiiiiiiiiiiiiiiii"; const char DurabilityQualityfmt[]="nf"; const char EmotesEntryfmt[]="nxxiiix"; const char EmotesTextEntryfmt[]="nxixxxxxxxxxxxxxxxx"; -const char FactionEntryfmt[]="niiiiiiiiiiiiiiiiiissssssssssssssssxxxxxxxxxxxxxxxxxx"; +const char FactionEntryfmt[]="niiiiiiiiiiiiiiiiiixxxxssssssssssssssssxxxxxxxxxxxxxxxxxx"; const char FactionTemplateEntryfmt[]="niiiiiiiiiiiii"; const char GameObjectDisplayInfofmt[]="nxxxxxxxxxxxffffffx"; const char GemPropertiesEntryfmt[]="nixxi"; @@ -75,19 +75,21 @@ const char ItemRandomSuffixfmt[]="nssssssssssssssssxxiiiiiiiiii"; const char ItemSetEntryfmt[]="dssssssssssssssssxxxxxxxxxxxxxxxxxxiiiiiiiiiiiiiiiiii"; const char LockEntryfmt[]="niiiiiiiiiiiiiiiiiiiiiiiixxxxxxxx"; const char MailTemplateEntryfmt[]="nxxxxxxxxxxxxxxxxxssssssssssssssssx"; -const char MapEntryfmt[]="nxixssssssssssssssssxixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxixiffxiix"; +const char MapEntryfmt[]="nxixxssssssssssssssssxixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxixiffxiix"; const char MapDifficultyEntryfmt[]="diixxxxxxxxxxxxxxxxxiix"; const char MovieEntryfmt[]="nxx"; const char QuestSortEntryfmt[]="nxxxxxxxxxxxxxxxxx"; +const char QuestXPfmt[]="niiiiiiiiii"; +const char QuestFactionRewardfmt[]="niiiiiiiiii"; const char RandomPropertiesPointsfmt[]="niiiiiiiiiiiiiii"; const char ScalingStatDistributionfmt[]="niiiiiiiiiiiiiiiiiiiii"; -const char ScalingStatValuesfmt[]="iniiiiiiiiiiiiiiiixxiiii"; +const char ScalingStatValuesfmt[]="iniiiiiiiiiiiiiiiiixiiii"; const char SkillLinefmt[]="nixssssssssssssssssxxxxxxxxxxxxxxxxxxixxxxxxxxxxxxxxxxxi"; const char SkillLineAbilityfmt[]="niiiixxiiiiixx"; const char SoundEntriesfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; const char SpellCastTimefmt[]="nixx"; const char SpellDurationfmt[]="niii"; -const char SpellEntryfmt[]="niiiiiiiiiiiixixiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiifxiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffffffiiiiiiiiiiiiiiiiiiiiifffiiiiiiiiiiiiiiifffiiiiiiiiiiiiixssssssssssssssssxssssssssssssssssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiiiiiiiiiiixfffxxxiiiiixxxxxx"; +const char SpellEntryfmt[]="niiiiiiiiiiiixixiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiifxiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffffffiiiiiiiiiiiiiiiiiiiiifffiiiiiiiiiiiiiiifffiiiiiiiiiiiiixssssssssssssssssxssssssssssssssssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiiiiiiiiiiixfffxxxiiiiixxxxxxx"; const std::string CustomSpellEntryfmt="pappppppppaaaaaapaaaaaaaaaaapaaapapppppppaaaaapaapaaaaaaaaaaaaaaaaaappppppppppppppppppppppppppppppppppppppppppaaaaaapppppppppaaapppppppppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaappppppppapppaaaaappaaaaaaa"; const std::string CustomSpellEntryIndex = "Id"; const char SpellFocusObjectfmt[]="nxxxxxxxxxxxxxxxxx"; diff --git a/src/game/GameEventMgr.cpp b/src/game/GameEventMgr.cpp index 19c716007ec..fb1ab876f6e 100644 --- a/src/game/GameEventMgr.cpp +++ b/src/game/GameEventMgr.cpp @@ -1301,11 +1301,7 @@ void GameEventMgr::GameEventSpawn(int16 event_id) } for (IdList::iterator itr = mGameEventPoolIds[internal_event_id].begin(); itr != mGameEventPoolIds[internal_event_id].end(); ++itr) - { - poolhandler.SpawnPool(*itr, 0, 0); - poolhandler.SpawnPool(*itr, 0, TYPEID_GAMEOBJECT); - poolhandler.SpawnPool(*itr, 0, TYPEID_UNIT); - } + poolhandler.SpawnPool(*itr); } void GameEventMgr::GameEventUnspawn(int16 event_id) diff --git a/src/game/GameObject.cpp b/src/game/GameObject.cpp index 30045eb7ddf..e7a1871f07e 100644 --- a/src/game/GameObject.cpp +++ b/src/game/GameObject.cpp @@ -73,6 +73,9 @@ GameObject::~GameObject() void GameObject::CleanupsBeforeDelete(bool finalCleanup) { + if (IsInWorld()) + RemoveFromWorld(); + if(m_uint32Values) // field array can be not exist if GameOBject not loaded { // Possible crash at access to deleted GO in Unit::m_gameobj @@ -224,9 +227,15 @@ void GameObject::Update(uint32 /*p_time*/) case GAMEOBJECT_TYPE_TRAP: { // Arming Time for GAMEOBJECT_TYPE_TRAP (6) - Unit* owner = GetOwner(); - if (owner && owner->isInCombat()) - m_cooldownTime = time(NULL) + GetGOInfo()->trap.startDelay; + GameObjectInfo const* goInfo = GetGOInfo(); + // Bombs + if (goInfo->trap.charges == 2) + m_cooldownTime = time(NULL) + 10; // Hardcoded tooltip value + else if (Unit* owner = GetOwner()) + { + if (owner->isInCombat()) + m_cooldownTime = time(NULL) + goInfo->trap.startDelay; + } m_lootState = GO_READY; break; } @@ -301,9 +310,9 @@ void GameObject::Update(uint32 /*p_time*/) return; } // respawn timer - uint16 poolid = poolhandler.IsPartOfAPool(GetGUIDLow(), TYPEID_GAMEOBJECT); + uint16 poolid = GetDBTableGUIDLow() ? poolhandler.IsPartOfAPool<GameObject>(GetDBTableGUIDLow()) : 0; if (poolid) - poolhandler.UpdatePool(poolid, GetGUIDLow(), TYPEID_GAMEOBJECT); + poolhandler.UpdatePool<GameObject>(poolid, GetDBTableGUIDLow()); else GetMap()->Add(this); break; @@ -320,7 +329,15 @@ void GameObject::Update(uint32 /*p_time*/) if(m_cooldownTime >= time(NULL)) return; - // traps + // Type 2 - Bomb ( will go away after casting it's spell ) + if(goInfo->trap.charges == 2) + { + if(goInfo->trap.spellId) + CastSpell(NULL, goInfo->trap.spellId); // FIXME: null target won't work for target type 1 + SetLootState(GO_JUST_DEACTIVATED); + break; + } + // Type 0 and 1 - trap ( type 0 will not get removed after casting a spell ) Unit* owner = GetOwner(); Unit* ok = NULL; // pointer to appropriate target if found any @@ -373,11 +390,7 @@ void GameObject::Update(uint32 /*p_time*/) m_cooldownTime = time(NULL) + 4; // 4 seconds - // count charges - //if(goInfo->trap.charges > 0) - // AddUse(); - - if(owner) + if(owner) // || goInfo->trap.charges == 1) SetLootState(GO_JUST_DEACTIVATED); if(IsBattleGroundTrap && ok->GetTypeId() == TYPEID_PLAYER) @@ -524,9 +537,9 @@ void GameObject::Delete() SetGoState(GO_STATE_READY); SetUInt32Value(GAMEOBJECT_FLAGS, GetGOInfo()->flags); - uint16 poolid = poolhandler.IsPartOfAPool(GetGUIDLow(), TYPEID_GAMEOBJECT); + uint16 poolid = GetDBTableGUIDLow() ? poolhandler.IsPartOfAPool<GameObject>(GetDBTableGUIDLow()) : 0; if (poolid) - poolhandler.UpdatePool(poolid, GetGUIDLow(), TYPEID_GAMEOBJECT); + poolhandler.UpdatePool<GameObject>(poolid, GetDBTableGUIDLow()); else AddObjectToRemoveList(); } @@ -1118,6 +1131,11 @@ void GameObject::Use(Unit* user) break; } + if (BattleGround* bg = player->GetBattleGround()) + { + bg->EventPlayerUsedGO(player, this); + } + player->CastedCreatureOrGO(info->id, GetGUID(), 0); } @@ -1489,14 +1507,14 @@ void GameObject::CastSpell(Unit* target, uint32 spellId) if(Unit *owner = GetOwner()) { trigger->setFaction(owner->getFaction()); - trigger->CastSpell(target, spellInfo, true, 0, 0, owner->GetGUID()); + trigger->CastSpell(target ? target : trigger, spellInfo, true, 0, 0, owner->GetGUID()); } else { trigger->setFaction(14); // Set owner guid for target if no owner avalible - needed by trigger auras // - trigger gets despawned and there's no caster avalible (see AuraEffect::TriggerSpell()) - trigger->CastSpell(target, spellInfo, true, 0, 0, target ? target->GetGUID() : 0); + trigger->CastSpell(target ? target : trigger, spellInfo, true, 0, 0, target ? target->GetGUID() : 0); } //trigger->setDeathState(JUST_DIED); //trigger->RemoveCorpse(); @@ -1531,11 +1549,18 @@ bool GameObject::IsInRange(float x, float y, float z, float radius) const && dz < info->maxZ + radius && dz > info->minZ - radius; } -void GameObject::TakenDamage(uint32 damage) +void GameObject::TakenDamage(uint32 damage, Unit *who) { if (!m_goValue->building.health) return; + Player* pwho = NULL; + if(who && who->GetTypeId() == TYPEID_PLAYER) + pwho = (Player*)who; + + if(who && who->IsVehicle()) + pwho = (Player*)who->GetCharmerOrOwner(); + if (m_goValue->building.health > damage) m_goValue->building.health -= damage; else @@ -1550,7 +1575,12 @@ void GameObject::TakenDamage(uint32 damage) SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DESTROYED); SetUInt32Value(GAMEOBJECT_DISPLAYID, m_goInfo->building.destroyedDisplayId); EventInform(m_goInfo->building.destroyedEvent); - } + if(pwho) + { + if(BattleGround* bg = pwho->GetBattleGround()) + bg->EventPlayerDamagedGO(pwho, this, m_goInfo->building.destroyedEvent); + } + } } else // from intact to damaged { diff --git a/src/game/GameObject.h b/src/game/GameObject.h index 7f84bb2d3ec..671bd84addf 100644 --- a/src/game/GameObject.h +++ b/src/game/GameObject.h @@ -725,7 +725,7 @@ class GameObject : public WorldObject, public GridObject<GameObject> void CastSpell(Unit *target, uint32 spell); void SendCustomAnim(); bool IsInRange(float x, float y, float z, float radius) const; - void TakenDamage(uint32 damage); + void TakenDamage(uint32 damage, Unit* who = NULL); void Rebuild(); void EventInform(uint32 eventId); diff --git a/src/game/GossipDef.cpp b/src/game/GossipDef.cpp index f4587917630..f35205a8c09 100644 --- a/src/game/GossipDef.cpp +++ b/src/game/GossipDef.cpp @@ -434,8 +434,6 @@ void PlayerMenu::SendQuestGiverStatus( uint8 questStatus, uint64 npcGUID ) void PlayerMenu::SendQuestGiverQuestDetails( Quest const *pQuest, uint64 npcGUID, bool ActivateAccept ) { - WorldPacket data(SMSG_QUESTGIVER_QUEST_DETAILS, 100); // guess size - std::string Title = pQuest->GetTitle(); std::string Details = pQuest->GetDetails(); std::string Objectives = pQuest->GetObjectives(); @@ -458,16 +456,18 @@ void PlayerMenu::SendQuestGiverQuestDetails( Quest const *pQuest, uint64 npcGUID } } + WorldPacket data(SMSG_QUESTGIVER_QUEST_DETAILS, 100); // guess size data << uint64(npcGUID); data << uint64(0); // wotlk, something todo with quest sharing? data << uint32(pQuest->GetQuestId()); data << Title; data << Details; data << Objectives; - data << uint32(ActivateAccept); + data << uint8(ActivateAccept ? 1 : 0); data << uint32(pQuest->GetSuggestedPlayers()); data << uint8(0); // new wotlk data << uint8(0); // new 3.1 + data << uint8(0); // new 3.3.0 if (pQuest->HasFlag(QUEST_FLAGS_HIDDEN_REWARDS)) { @@ -508,12 +508,25 @@ void PlayerMenu::SendQuestGiverQuestDetails( Quest const *pQuest, uint64 npcGUID data << uint32(pQuest->GetRewOrReqMoney()); } + data << uint32(0); // rewarded honor points. Multiply with 10 to satisfy client data << uint32(10*Trinity::Honor::hk_honor_at_level(pSession->GetPlayer()->getLevel(), pQuest->GetRewHonorableKills())); + data << float(0); // new 3.3.0 data << uint32(pQuest->GetRewSpell()); // reward spell, this spell will display (icon) (casted if RewSpellCast==0) data << int32(pQuest->GetRewSpellCast()); // casted spell data << uint32(pQuest->GetCharTitleId()); // CharTitleId, new 2.4.0, player gets this title (id from CharTitles) data << uint32(pQuest->GetBonusTalents()); // bonus talents + data << uint32(0); + data << uint32(0); + + for(int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) + data << uint32(pQuest->RewRepFaction[i]); + + for(int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) + data << int32(pQuest->RewRepValueId[i]); + + for(int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) + data << int32(pQuest->RewRepValue[i]); data << uint32(QUEST_EMOTE_COUNT); for (uint32 i=0; i < QUEST_EMOTE_COUNT; ++i) @@ -563,6 +576,7 @@ void PlayerMenu::SendQuestQueryResponse( Quest const *pQuest ) data << uint32(pQuest->GetQuestId()); // quest id data << uint32(pQuest->GetQuestMethod()); // Accepted values: 0, 1 or 2. 0==IsAutoComplete() (skip objectives/details) data << uint32(pQuest->GetQuestLevel()); // may be -1, static data, in other cases must be used dynamic level: Player::GetQuestLevel (0 is not known, but assuming this is no longer valid for quest intended for client) + data << uint32(pQuest->GetMinLevel()); // min level data << uint32(pQuest->GetZoneOrSort()); // zone or sort to display in quest log data << uint32(pQuest->GetType()); // quest type @@ -575,6 +589,7 @@ void PlayerMenu::SendQuestQueryResponse( Quest const *pQuest ) data << uint32(pQuest->GetRepObjectiveValue2()); // shown in quest log as part of quest objective OPPOSITE faction data << uint32(pQuest->GetNextQuestInChain()); // client will request this quest from NPC, if not 0 + data << uint32(0); // unk 3.3.0 if (pQuest->HasFlag(QUEST_FLAGS_HIDDEN_REWARDS)) data << uint32(0); // Hide money rewarded @@ -587,11 +602,14 @@ void PlayerMenu::SendQuestQueryResponse( Quest const *pQuest ) // rewarded honor points data << uint32(Trinity::Honor::hk_honor_at_level(pSession->GetPlayer()->getLevel(), pQuest->GetRewHonorableKills())); + data << float(0); // new reward honor (multipled by ~62 at client side) data << uint32(pQuest->GetSrcItemId()); // source item id data << uint32(pQuest->GetFlags() & 0xFFFF); // quest flags data << uint32(pQuest->GetCharTitleId()); // CharTitleId, new 2.4.0, player gets this title (id from CharTitles) data << uint32(pQuest->GetPlayersSlain()); // players slain data << uint32(pQuest->GetBonusTalents()); // bonus talents + data << uint32(0); // bonus arena points + data << uint32(0); // unknown int iI; @@ -616,6 +634,15 @@ void PlayerMenu::SendQuestQueryResponse( Quest const *pQuest ) } } + for(int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // reward factions ids + data << uint32(pQuest->RewRepFaction[i]); + + for(int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // columnid+1 QuestFactionReward.dbc? + data << int32(pQuest->RewRepValueId[i]); + + for(int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // unk (0) + data << int32(pQuest->RewRepValue[i]); + data << pQuest->GetPointMapId(); data << pQuest->GetPointX(); data << pQuest->GetPointY(); @@ -625,6 +652,7 @@ void PlayerMenu::SendQuestQueryResponse( Quest const *pQuest ) data << Objectives; data << Details; data << EndText; + data << uint8(0); // some string for (iI = 0; iI < QUEST_OBJECTIVES_COUNT; ++iI) { @@ -639,6 +667,7 @@ void PlayerMenu::SendQuestQueryResponse( Quest const *pQuest ) } data << uint32(pQuest->ReqCreatureOrGOCount[iI]); data << uint32(pQuest->ReqSourceId[iI]); + data << uint32(0); // req source count? } for (iI = 0; iI < QUEST_ITEM_OBJECTIVES_COUNT; ++iI) @@ -674,12 +703,12 @@ void PlayerMenu::SendQuestGiverOfferReward( Quest const* pQuest, uint64 npcGUID, WorldPacket data( SMSG_QUESTGIVER_OFFER_REWARD, 50 ); // guess size - data << npcGUID; - data << pQuest->GetQuestId(); + data << uint64(npcGUID); + data << uint32(pQuest->GetQuestId()); data << Title; data << OfferRewardText; - data << uint32( EnableNext ); + data << uint8(EnableNext ? 1 : 0); data << uint32(0); // unk uint32 EmoteCount = 0; @@ -726,15 +755,29 @@ void PlayerMenu::SendQuestGiverOfferReward( Quest const* pQuest, uint64 npcGUID, data << uint32(0); } + data << uint32(0); data << uint32(pQuest->GetRewOrReqMoney()); // rewarded honor points. Multiply with 10 to satisfy client data << uint32(10*Trinity::Honor::hk_honor_at_level(pSession->GetPlayer()->getLevel(), pQuest->GetRewHonorableKills())); + data << float(0); data << uint32(0x08); // unused by client? data << uint32(pQuest->GetRewSpell()); // reward spell, this spell will display (icon) (casted if RewSpellCast==0) data << int32(pQuest->GetRewSpellCast()); // casted spell data << uint32(0); // unknown data << uint32(pQuest->GetBonusTalents()); // bonus talents + data << uint32(0); + data << uint32(0); + + for(int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // reward factions ids + data << uint32(pQuest->RewRepFaction[i]); + + for(int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // columnid in QuestFactionReward.dbc (zero based)? + data << int32(pQuest->RewRepValueId[i]); + + for(int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // reward reputation override? + data << uint32(pQuest->RewRepValue[i]); + pSession->SendPacket( &data ); sLog.outDebug( "WORLD: Sent SMSG_QUESTGIVER_OFFER_REWARD NPCGuid=%u, questid=%u", GUID_LOPART(npcGUID), pQuest->GetQuestId() ); } diff --git a/src/game/Group.cpp b/src/game/Group.cpp index a4ebf7bfc27..abd1c2c8869 100644 --- a/src/game/Group.cpp +++ b/src/game/Group.cpp @@ -364,8 +364,9 @@ uint32 Group::RemoveMember(const uint64 &guid, const uint8 &method) } else { - data.Initialize(SMSG_GROUP_LIST, 24); - data << uint64(0) << uint64(0) << uint64(0); + data.Initialize(SMSG_GROUP_LIST, 1+1+1+1+8+4+4+8); + data << uint8(0x10) << uint8(0) << uint8(0) << uint8(0); + data << uint64(0) << uint32(0) << uint32(0) << uint64(0); player->GetSession()->SendPacket(&data); } @@ -447,8 +448,9 @@ void Group::Disband(bool hideDestroy) } else { - data.Initialize(SMSG_GROUP_LIST, 24); - data << uint64(0) << uint64(0) << uint64(0); + data.Initialize(SMSG_GROUP_LIST, 1+1+1+1+8+4+4+8); + data << uint8(0x10) << uint8(0) << uint8(0) << uint8(0); + data << uint64(0) << uint32(0) << uint32(0) << uint64(0); player->GetSession()->SendPacket(&data); } @@ -479,7 +481,7 @@ void Group::Disband(bool hideDestroy) void Group::SendLootStartRoll(uint32 CountDown, const Roll &r) { - WorldPacket data(SMSG_LOOT_START_ROLL, (8+4+4+4+4+4+4)); + WorldPacket data(SMSG_LOOT_START_ROLL, (8+4+4+4+4+4+4+1)); data << uint64(r.itemGUID); // guid of rolled item data << uint32(r.totalPlayersRolling); // maybe the number of players rolling for it??? data << uint32(r.itemid); // the itemEntryId for the item that shall be rolled for @@ -487,6 +489,7 @@ void Group::SendLootStartRoll(uint32 CountDown, const Roll &r) data << uint32(r.itemRandomPropId); // item random property ID data << uint32(r.itemCount); // items in stack data << uint32(CountDown); // the countdown time to choose "need" or "greed" + data << uint8(ALL_ROLL_TYPE_MASK); // roll type mask for (Roll::PlayerVote::const_iterator itr=r.playerVote.begin(); itr!=r.playerVote.end(); ++itr) { @@ -751,8 +754,15 @@ void Group::CountRollVote(const uint64& playerGUID, const uint64& Guid, uint32 N itr->second = GREED; } break; + case ROLL_DISENCHANT: // player choose Disenchant + { + SendLootRoll(0, playerGUID, 128, ROLL_DISENCHANT, *roll); + ++roll->totalGreed; + itr->second = DISENCHANT; + } + break; } - if (roll->totalPass + roll->totalGreed + roll->totalNeed >= roll->totalPlayersRolling) + if (roll->totalPass + roll->totalNeed + roll->totalGreed >= roll->totalPlayersRolling) { CountTheRoll(rollI, NumberOfPlayers); } @@ -833,42 +843,56 @@ void Group::CountTheRoll(Rolls::iterator rollI, uint32 NumberOfPlayers) uint8 maxresul = 0; uint64 maxguid = (*roll->playerVote.begin()).first; Player *player; + RollVote rollvote; Roll::PlayerVote::iterator itr; for (itr=roll->playerVote.begin(); itr!=roll->playerVote.end(); ++itr) { - if (itr->second != GREED) + if (itr->second != GREED && itr->second != DISENCHANT) continue; uint8 randomN = urand(1, 99); - SendLootRoll(0, itr->first, randomN, ROLL_GREED, *roll); + SendLootRoll(0, itr->first, randomN, itr->second, *roll); if (maxresul < randomN) { maxguid = itr->first; maxresul = randomN; + rollvote = itr->second; } } - SendLootRollWon(0, maxguid, maxresul, ROLL_GREED, *roll); + SendLootRollWon(0, maxguid, maxresul, rollvote, *roll); player = objmgr.GetPlayer(maxguid); if(player && player->GetSession()) { player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT, roll->itemid, maxresul); - ItemPosCountVec dest; LootItem *item = &(roll->getLoot()->items[roll->itemSlot]); - uint8 msg = player->CanStoreNewItem( NULL_BAG, NULL_SLOT, dest, roll->itemid, item->count ); - if ( msg == EQUIP_ERR_OK ) + + if(rollvote == GREED) + { + ItemPosCountVec dest; + uint8 msg = player->CanStoreNewItem( NULL_BAG, NULL_SLOT, dest, roll->itemid, item->count ); + if ( msg == EQUIP_ERR_OK ) + { + item->is_looted = true; + roll->getLoot()->NotifyItemRemoved(roll->itemSlot); + --roll->getLoot()->unlootedCount; + player->StoreNewItem( dest, roll->itemid, true, item->randomPropertyId); + } + else + { + item->is_blocked = false; + player->SendEquipError( msg, NULL, NULL ); + } + } + else if(rollvote == DISENCHANT) { item->is_looted = true; roll->getLoot()->NotifyItemRemoved(roll->itemSlot); --roll->getLoot()->unlootedCount; - player->StoreNewItem( dest, roll->itemid, true, item->randomPropertyId); - } - else - { - item->is_blocked = false; - player->SendEquipError( msg, NULL, NULL ); + ItemPrototype const *pProto = ObjectMgr::GetItemPrototype(roll->itemid); + player->AutoStoreLoot(pProto->DisenchantID, LootTemplates_Disenchant, true); } } } @@ -883,23 +907,24 @@ void Group::CountTheRoll(Rolls::iterator rollI, uint32 NumberOfPlayers) delete roll; } -void Group::SetTargetIcon(uint8 id, uint64 guid) +void Group::SetTargetIcon(uint8 id, uint64 whoGuid, uint64 targetGuid) { if(id >= TARGETICONCOUNT) return; // clean other icons - if( guid != 0 ) + if( targetGuid != 0 ) for (int i=0; i<TARGETICONCOUNT; ++i) - if( m_targetIcons[i] == guid ) - SetTargetIcon(i, 0); + if( m_targetIcons[i] == targetGuid ) + SetTargetIcon(i, 0, 0); - m_targetIcons[id] = guid; + m_targetIcons[id] = targetGuid; - WorldPacket data(MSG_RAID_TARGET_UPDATE, (2+8)); - data << (uint8)0; - data << id; - data << guid; + WorldPacket data(MSG_RAID_TARGET_UPDATE, (1+8+1+8)); + data << uint8(0); // set targets + data << uint64(whoGuid); + data << uint8(id); + data << uint64(targetGuid); BroadcastPacket(&data, true); } @@ -932,15 +957,15 @@ void Group::SendTargetIconList(WorldSession *session) return; WorldPacket data(MSG_RAID_TARGET_UPDATE, (1+TARGETICONCOUNT*9)); - data << (uint8)1; + data << uint8(1); // list targets for (int i=0; i<TARGETICONCOUNT; ++i) { if(m_targetIcons[i] == 0) continue; - data << (uint8)i; - data << m_targetIcons[i]; + data << uint8(i); + data << uint64(m_targetIcons[i]); } session->SendPacket(&data); @@ -957,18 +982,24 @@ void Group::SendUpdate() continue; // guess size WorldPacket data(SMSG_GROUP_LIST, (1+1+1+1+8+4+GetMembersCount()*20)); - data << uint8(m_groupType); // group type + data << uint8(m_groupType); // group type (flags in 3.3) data << uint8(isBGGroup() ? 1 : 0); // 2.0.x, isBattleGroundGroup? data << uint8(citr->group); // groupid data << uint8(0); // unk + if(m_groupType & GROUPTYPE_LFD) + { + data << uint8(0); + data << uint32(0); + } data << uint64(0x50000000FFFFFFFELL); // related to voice chat? + data << uint32(0); // 3.3, may be some kind of time data << uint32(GetMembersCount()-1); for (member_citerator citr2 = m_memberSlots.begin(); citr2 != m_memberSlots.end(); ++citr2) { if(citr->guid == citr2->guid) continue; Player* member = objmgr.GetPlayer(citr2->guid); - + // Sometimes objmgr can't find player when he is teleporting between maps, causing him to show up as offline uint8 onlineState = (member) ? MEMBER_STATUS_ONLINE : MEMBER_STATUS_OFFLINE; onlineState = onlineState | ((isBGGroup()) ? MEMBER_STATUS_PVP : 0); @@ -978,6 +1009,7 @@ void Group::SendUpdate() data << uint8(onlineState); // online-state data << uint8(citr2->group); // groupid data << uint8(citr2->flags); // See enum GroupMemberFlags + data << uint8(0); // 3.3 } data << uint64(m_leaderGuid); // leader guid @@ -988,6 +1020,7 @@ void Group::SendUpdate() data << uint8(m_lootThreshold); // loot threshold data << uint8(m_dungeonDifficulty); // Dungeon Difficulty data << uint8(m_raidDifficulty); // Raid Difficulty + data << uint8(0); // 3.3 } player->GetSession()->SendPacket( &data ); } @@ -1232,7 +1265,7 @@ void Group::_removeRolls(const uint64 &guid) if(itr2 == roll->playerVote.end()) continue; - if (itr2->second == GREED) --roll->totalGreed; + if (itr2->second == GREED || itr2->second == DISENCHANT) --roll->totalGreed; if (itr2->second == NEED) --roll->totalNeed; if (itr2->second == PASS) --roll->totalPass; if (itr2->second != NOT_VALID) --roll->totalPlayersRolling; @@ -1279,7 +1312,7 @@ bool Group::_setMainTank(const uint64 &guid, const bool &apply) RemoveUniqueGroupMemberFlag(MEMBER_FLAG_MAINTANK); // Remove main tank flag from current if any. ToggleGroupMemberFlag(slot, MEMBER_FLAG_MAINTANK, apply); // And apply main tank flag on new main tank. - + if (!isBGGroup()) CharacterDatabase.PExecute("UPDATE groups SET mainTank='%u' WHERE leaderGuid='%u'", GUID_LOPART(m_mainTank), GUID_LOPART(m_leaderGuid)); return true; @@ -1293,7 +1326,7 @@ bool Group::_setMainAssistant(const uint64 &guid, const bool &apply) RemoveUniqueGroupMemberFlag(MEMBER_FLAG_MAINASSIST); // Remove main assist flag from current if any. ToggleGroupMemberFlag(slot, MEMBER_FLAG_MAINASSIST, apply); // Apply main assist flag on new main assist. - + if (!isBGGroup()) CharacterDatabase.PExecute("UPDATE groups SET mainAssistant='%u' WHERE leaderGuid='%u'", GUID_LOPART(m_mainAssistant), GUID_LOPART(m_leaderGuid)); return true; diff --git a/src/game/Group.h b/src/game/Group.h index 5cc09927dcd..58244d0cc5f 100644 --- a/src/game/Group.h +++ b/src/game/Group.h @@ -39,8 +39,9 @@ enum RollVote PASS = 0, NEED = 1, GREED = 2, - NOT_EMITED_YET = 3, - NOT_VALID = 4 + DISENCHANT = 3, + NOT_EMITED_YET = 4, + NOT_VALID = 5 }; enum GroupMemberOnlineStatus @@ -65,8 +66,13 @@ enum GroupMemberFlags enum GroupType { - GROUPTYPE_NORMAL = 0, - GROUPTYPE_RAID = 1 + GROUPTYPE_NORMAL = 0x00, + GROUPTYPE_BG = 0x01, + GROUPTYPE_RAID = 0x02, + GROUPTYPE_BGRAID = GROUPTYPE_BG | GROUPTYPE_RAID, // mask + // 0x04? + GROUPTYPE_LFD = 0x08, + // 0x10, leave/change group?, I saw this flag when leaving group and after leaving BG while in group }; class BattleGround; @@ -289,7 +295,7 @@ class Group SendUpdate(); } - void SetTargetIcon(uint8 id, uint64 guid); + void SetTargetIcon(uint8 id, uint64 whoGuid, uint64 targetGuid); Difficulty GetDifficulty(bool isRaid) const { return isRaid ? m_raidDifficulty : m_dungeonDifficulty; } Difficulty GetDungeonDifficulty() const { return m_dungeonDifficulty; } @@ -407,7 +413,7 @@ class Group if (m_subGroupsCounts) --m_subGroupsCounts[subgroup]; } - + void RemoveUniqueGroupMemberFlag(GroupMemberFlags flag) { for (member_witerator itr = m_memberSlots.begin(); itr != m_memberSlots.end(); ++itr) @@ -416,14 +422,14 @@ class Group itr->flags &= ~flag; } } - + void ToggleGroupMemberFlag(member_witerator slot, uint8 flag, bool apply) { if (apply) slot->flags |= flag; else slot->flags &= ~flag; - } + } MemberSlotList m_memberSlots; GroupRefManager m_memberMgr; diff --git a/src/game/GroupHandler.cpp b/src/game/GroupHandler.cpp index 4f2a1dc4c8d..cf52bec2074 100644 --- a/src/game/GroupHandler.cpp +++ b/src/game/GroupHandler.cpp @@ -126,7 +126,7 @@ void WorldSession::HandleGroupInviteOpcode( WorldPacket & recv_data ) if(group) { // not have permissions for invite - if(!group->IsLeader(GetPlayer()->GetGUID()) && !group->IsAssistant(GetPlayer()->GetGUID())) + if(group->isRaidGroup() && !group->IsLeader(GetPlayer()->GetGUID()) && !group->IsAssistant(GetPlayer()->GetGUID())) { SendPartyResult(PARTY_OP_INVITE, "", PARTY_RESULT_YOU_NOT_LEADER); return; @@ -428,9 +428,9 @@ void WorldSession::HandleMinimapPingOpcode(WorldPacket& recv_data) // everything's fine, do it WorldPacket data(MSG_MINIMAP_PING, (8+4+4)); - data << GetPlayer()->GetGUID(); - data << x; - data << y; + data << uint64(GetPlayer()->GetGUID()); + data << float(x); + data << float(y); GetPlayer()->GetGroup()->BroadcastPacket(&data, true, -1, GetPlayer()->GetGUID()); } @@ -451,10 +451,10 @@ void WorldSession::HandleRandomRollOpcode(WorldPacket& recv_data) //sLog.outDebug("ROLL: MIN: %u, MAX: %u, ROLL: %u", minimum, maximum, roll); WorldPacket data(MSG_RANDOM_ROLL, 4+4+4+8); - data << minimum; - data << maximum; - data << roll; - data << GetPlayer()->GetGUID(); + data << uint32(minimum); + data << uint32(maximum); + data << uint32(roll); + data << uint64(GetPlayer()->GetGUID()); if(GetPlayer()->GetGroup()) GetPlayer()->GetGroup()->BroadcastPacket(&data, false); else @@ -485,7 +485,7 @@ void WorldSession::HandleRaidTargetUpdateOpcode( WorldPacket & recv_data ) uint64 guid; recv_data >> guid; - group->SetTargetIcon(x, guid); + group->SetTargetIcon(x, _player->GetGUID(), guid); } } @@ -535,11 +535,7 @@ void WorldSession::HandleGroupChangeSubGroupOpcode( WorldPacket & recv_data ) //Do not allow leader to change group of player in combat if (movedPlayer->isInCombat()) - { - WorldPacket data(SMSG_GROUP_SWAP_FAILED, (0)); - SendPacket(&data); return; - } // everything's fine, do it group->ChangeMembersGroup(movedPlayer, groupNr); @@ -586,7 +582,7 @@ void WorldSession::HandlePartyAssignmentOpcode( WorldPacket & recv_data ) // everything's fine, do it if (flag == MEMBER_FLAG_MAINTANK) group->SetMainTank(guid, apply); - + else if (flag == MEMBER_FLAG_MAINASSIST) group->SetMainAssistant(guid, apply); } diff --git a/src/game/Item.cpp b/src/game/Item.cpp index d1a5612b95c..00f271ca89e 100644 --- a/src/game/Item.cpp +++ b/src/game/Item.cpp @@ -726,6 +726,36 @@ bool Item::CanBeTraded(bool mail) const return true; } + +bool Item::HasEnchantRequiredSkill(const Player *pPlayer) const +{ + + // Check all enchants for required skill + for (uint32 enchant_slot = PERM_ENCHANTMENT_SLOT; enchant_slot < MAX_ENCHANTMENT_SLOT; ++enchant_slot) + if (uint32 enchant_id = GetEnchantmentId(EnchantmentSlot(enchant_slot))) + if (SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id)) + if (enchantEntry->requiredSkill && pPlayer->GetSkillValue(enchantEntry->requiredSkill) < enchantEntry->requiredSkillValue) + return false; + + return true; +} + + +uint32 Item::GetEnchantRequiredLevel() const +{ + + uint32 level = 0; + + // Check all enchants for required level + for (uint32 enchant_slot = PERM_ENCHANTMENT_SLOT; enchant_slot < MAX_ENCHANTMENT_SLOT; ++enchant_slot) + if (uint32 enchant_id = GetEnchantmentId(EnchantmentSlot(enchant_slot))) + if (SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id)) + if (enchantEntry->requiredLevel > level) + level = enchantEntry->requiredLevel; + + return level; +} + bool Item::IsBoundByEnchant() const { // Check all enchants for soulbound @@ -741,6 +771,10 @@ bool Item::IsFitToSpellRequirements(SpellEntry const* spellInfo) const { ItemPrototype const* proto = GetProto(); + //Lava Lash + if (spellInfo->Id==60103 && spellInfo->EquippedItemClass==ITEM_CLASS_WEAPON) + return true; + if (spellInfo->EquippedItemClass != -1) // -1 == any item class { // Special case - accept vellum for armor/weapon requirements diff --git a/src/game/Item.h b/src/game/Item.h index 37d7b7c2dfd..8e504800e9a 100644 --- a/src/game/Item.h +++ b/src/game/Item.h @@ -250,6 +250,9 @@ class Item : public Object void SetInTrade(bool b = true) { mb_in_trade = b; } bool IsInTrade() const { return mb_in_trade; } + bool HasEnchantRequiredSkill(const Player *pPlayer) const; + uint32 GetEnchantRequiredLevel() const; + bool IsFitToSpellRequirements(SpellEntry const* spellInfo) const; bool IsTargetValidForItemUse(Unit* pUnitTarget); bool IsLimitedToAnotherMapOrZone( uint32 cur_mapId, uint32 cur_zoneId) const; diff --git a/src/game/ItemHandler.cpp b/src/game/ItemHandler.cpp index 4993f8bcd12..b36fd844923 100644 --- a/src/game/ItemHandler.cpp +++ b/src/game/ItemHandler.cpp @@ -1341,7 +1341,7 @@ void WorldSession::HandleCancelTempEnchantmentOpcode(WorldPacket& recv_data) void WorldSession::HandleItemRefundInfoRequest(WorldPacket& recv_data) { - sLog.outDebug("WORLD: CMSG_ITEM_REFUND_INFO_REQUEST"); + sLog.outDebug("WORLD: CMSG_ITEM_REFUND_INFO"); uint64 guid; @@ -1362,7 +1362,7 @@ void WorldSession::HandleItemRefundInfoRequest(WorldPacket& recv_data) } // item refund system not implemented yet - WorldPacket data(SMSG_ITEM_REFUND_TIMER, 8+4+4+4+4*4+4*4+4+4); // guess size + WorldPacket data(SMSG_ITEM_REFUND_INFO_RESPONSE, 8+4+4+4+4*4+4*4+4+4); // guess size data << uint64(guid); // item guid data << uint32(1); // unknown data << uint32(item->GetPaidHonorPoints()); // honor point cost @@ -1398,13 +1398,13 @@ void WorldSession::HandleItemRefund(WorldPacket &recv_data) if(item->GetRefundExpiryTime() <= time(NULL)) // item refund has expired { - WorldPacket data(SMSG_ITEM_REFUND); + WorldPacket data(SMSG_ITEM_REFUND_RESULT); data << uint64(guid); // guid data << uint32(1); // error, abort refund return; } - WorldPacket data(SMSG_ITEM_REFUND); + WorldPacket data(SMSG_ITEM_REFUND_RESULT); data << uint64(guid); // guid? data << uint32(0); // must be 0 or client side error in refund data << uint32(0); // unk - message sent to client? diff --git a/src/game/ItemPrototype.h b/src/game/ItemPrototype.h index 872bcd34f67..768df0cc11b 100644 --- a/src/game/ItemPrototype.h +++ b/src/game/ItemPrototype.h @@ -60,7 +60,7 @@ enum ItemModType ITEM_MOD_EXPERTISE_RATING = 37, ITEM_MOD_ATTACK_POWER = 38, ITEM_MOD_RANGED_ATTACK_POWER = 39, - ITEM_MOD_FERAL_ATTACK_POWER = 40, + //ITEM_MOD_FERAL_ATTACK_POWER = 40, not in 3.3 ITEM_MOD_SPELL_HEALING_DONE = 41, // deprecated ITEM_MOD_SPELL_DAMAGE_DONE = 42, // deprecated ITEM_MOD_MANA_REGENERATION = 43, diff --git a/src/game/LFGHandler.cpp b/src/game/LFGHandler.cpp index 89abfec79a0..63fc3ad2439 100644 --- a/src/game/LFGHandler.cpp +++ b/src/game/LFGHandler.cpp @@ -259,7 +259,7 @@ void WorldSession::HandleLookingForGroup(WorldPacket& recv_data) } void WorldSession::SendLfgResult(uint32 type, uint32 entry, uint8 lfg_type) -{ +{/* uint32 number = 0; WorldPacket data(MSG_LOOKING_FOR_GROUP); @@ -267,18 +267,18 @@ void WorldSession::SendLfgResult(uint32 type, uint32 entry, uint8 lfg_type) data << uint32(entry); // entry from LFGDungeons.dbc data << uint8(0); - /*if(uint8) + if(uint8) { uint32 count1; for(count1) { uint64; // player guid } - }*/ + } data << uint32(0); // count2 data << uint32(0); - /*for(count2) + for(count2) { uint64 // not player guid uint32 flags; @@ -297,7 +297,7 @@ void WorldSession::SendLfgResult(uint32 type, uint32 entry, uint8 lfg_type) uint8 } } - }*/ + } size_t count3_pos = data.wpos(); data << uint32(0); // count3 @@ -389,6 +389,7 @@ void WorldSession::SendLfgResult(uint32 type, uint32 entry, uint8 lfg_type) data.put<uint32>(count3_pos, number); // fill count placeholder SendPacket(&data); +*/ } void WorldSession::HandleSetLfgOpcode( WorldPacket & recv_data ) @@ -429,10 +430,5 @@ void WorldSession::HandleLfgSetRoles(WorldPacket &recv_data) void WorldSession::SendLfgUpdate(uint8 unk1, uint8 unk2, uint8 unk3) { - WorldPacket data(SMSG_LFG_UPDATE, 3); - data << uint8(unk1); - data << uint8(unk2); - data << uint8(unk3); - SendPacket(&data); -} +} diff --git a/src/game/Language.h b/src/game/Language.h index 6558908d302..86235315d27 100644 --- a/src/game/Language.h +++ b/src/game/Language.h @@ -953,6 +953,13 @@ enum TrinityStrings LANG_OPVP_ZM_GOSSIP_ALLIANCE = 10054, LANG_OPVP_ZM_GOSSIP_HORDE = 10055, + LANG_BG_SA_START_TWO_MINUTES = 10056, + LANG_BG_SA_START_ONE_MINUTE = 10057, + LANG_BG_SA_START_HALF_MINUTE = 10058, + LANG_BG_SA_HAS_BEGUN = 10059, + LANG_BG_SA_IS_UNDER_ATTACK = 10060, + LANG_BG_SA_IS_DESTROYED = 10061, + // Use for custom patches 11000-11999 LANG_AUTO_BROADCAST = 11000, LANG_INVALID_REALMID = 11001, diff --git a/src/game/Level1.cpp b/src/game/Level1.cpp index d31cf17b567..9a9c60f245e 100644 --- a/src/game/Level1.cpp +++ b/src/game/Level1.cpp @@ -495,7 +495,7 @@ bool ChatHandler::HandleGMTicketAssignToCommand(const char* args) SendSysMessage(LANG_COMMAND_TICKETNOTEXIST); return true; } - + uint64 tarGUID = objmgr.GetPlayerGUIDByName(targm.c_str()); uint64 accid = objmgr.GetPlayerAccountIdByGUID(tarGUID); uint32 gmlevel = accmgr.GetSecurity(accid, realmID); @@ -2205,6 +2205,13 @@ bool ChatHandler::HandleTeleCommand(const char * args) return false; } + if (_player->isInCombat()) + { + SendSysMessage(LANG_YOU_IN_COMBAT); + SetSentErrorMessage(true); + return false; + } + MapEntry const * me = sMapStore.LookupEntry(tele->mapId); if(!me || me->IsBattleGroundOrArena()) { diff --git a/src/game/Level2.cpp b/src/game/Level2.cpp index 530a243794d..62fc94b541a 100644 --- a/src/game/Level2.cpp +++ b/src/game/Level2.cpp @@ -508,8 +508,8 @@ bool ChatHandler::HandleGameObjectTargetCommand(const char* args) o = fields[5].GetFloat(); mapid = fields[6].GetUInt16(); phase = fields[7].GetUInt16(); - pool_id = poolhandler.IsPartOfAPool(lowguid, TYPEID_GAMEOBJECT); - if (!pool_id || (pool_id && poolhandler.IsSpawnedObject(pool_id, lowguid, TYPEID_GAMEOBJECT))) + pool_id = poolhandler.IsPartOfAPool<GameObject>(lowguid); + if (!pool_id || poolhandler.IsSpawnedObject<GameObject>(lowguid)) found = true; } while( result->NextRow() && (!found) ); diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp index aa146210a77..0d56d12a816 100644 --- a/src/game/Level3.cpp +++ b/src/game/Level3.cpp @@ -2458,8 +2458,11 @@ bool ChatHandler::HandleLearnAllMyTalentsCommand(const char* /*args*/) // learn highest rank of talent and learn all non-talent spell ranks (recursive by tree) player->learnSpellHighRank(spellId); + player->AddTalent(spellId, player->GetActiveSpec(), true); } + player->SetFreeTalentPoints(0); + SendSysMessage(LANG_COMMAND_LEARN_CLASS_TALENTS); return true; } @@ -2536,6 +2539,8 @@ bool ChatHandler::HandleLearnAllMyPetTalentsCommand(const char* /*args*/) pet->learnSpellHighRank(spellid); } + pet->SetFreeTalentPoints(0); + SendSysMessage(LANG_COMMAND_LEARN_PET_TALENTS); return true; } diff --git a/src/game/LootMgr.h b/src/game/LootMgr.h index 00e0bb8d1b5..3db547e0836 100644 --- a/src/game/LootMgr.h +++ b/src/game/LootMgr.h @@ -34,9 +34,12 @@ enum RollType ROLL_PASS = 0, ROLL_NEED = 1, ROLL_GREED = 2, - MAX_ROLL_TYPE = 3 + ROLL_DISENCHANT = 3, + MAX_ROLL_TYPE = 4 }; +#define ALL_ROLL_TYPE_MASK 0x0F + #define MAX_NR_LOOT_ITEMS 16 // note: the client cannot show more than 16 items total #define MAX_NR_QUEST_ITEMS 32 diff --git a/src/game/Mail.cpp b/src/game/Mail.cpp index 12425866090..64403a3b488 100644 --- a/src/game/Mail.cpp +++ b/src/game/Mail.cpp @@ -546,7 +546,7 @@ void WorldSession::HandleGetMailList(WorldPacket & recv_data ) uint8 item_count = (*itr)->items.size(); // max count is MAX_MAIL_ITEMS (12) - size_t next_mail_size = 2+4+1+8+4*8+((*itr)->subject.size()+1)+1+item_count*(1+4+4+6*3*4+4+4+1+4+4+4); + size_t next_mail_size = 2+4+1+((*itr)->messageType == MAIL_NORMAL ? 8 : 4)+4*8+((*itr)->subject.size()+1)+1+item_count*(1+4+4+7*3*4+4+4+4+4+4+4+1); if (data.wpos()+next_mail_size > maxPacketSize) { diff --git a/src/game/Map.cpp b/src/game/Map.cpp index 0d65f26127b..dbfe03f5ee3 100644 --- a/src/game/Map.cpp +++ b/src/game/Map.cpp @@ -2692,7 +2692,6 @@ bool InstanceMap::Add(Player *player) } } - if(i_data) i_data->OnPlayerEnter(player); // for normal instances cancel the reset schedule when the // first player enters (no players yet) SetResetSchedule(false); @@ -2706,6 +2705,10 @@ bool InstanceMap::Add(Player *player) // this will acquire the same mutex so it cannot be in the previous block Map::Add(player); + + if (i_data) + i_data->OnPlayerEnter(player); + return true; } diff --git a/src/game/MiscHandler.cpp b/src/game/MiscHandler.cpp index b366c37c40b..52853c57fd3 100644 --- a/src/game/MiscHandler.cpp +++ b/src/game/MiscHandler.cpp @@ -1115,7 +1115,9 @@ void WorldSession::HandleMoveUnRootAck(WorldPacket& recv_data) recv_data.read_skip<uint32>(); // unk MovementInfo movementInfo; + movementInfo.guid = guid; ReadMovementInfo(recv_data, &movementInfo); + recv_data.read_skip<float>(); // unk2 */ } @@ -1498,10 +1500,27 @@ void WorldSession::HandleSetDungeonDifficultyOpcode( WorldPacket & recv_data ) if(_player->getLevel() < LEVELREQUIREMENT_HEROIC) return; - if(Group *pGroup = _player->GetGroup()) + Group *pGroup = _player->GetGroup(); + if(pGroup) { if(pGroup->IsLeader(_player->GetGUID())) { + for(GroupReference *itr = pGroup->GetFirstMember(); itr != NULL; itr = itr->next()) + { + Player* pGroupGuy = itr->getSource(); + if(!pGroupGuy) + continue; + + if(!pGroupGuy->IsInMap(pGroupGuy)) + return; + + map = pGroupGuy->GetMap(); + if(map && map->IsRaidOrHeroicDungeon() ) + { + sLog.outError("WorldSession::HandleSetDungeonDifficultyOpcode: player %d tried to reset the instance while inside!", _player->GetGUIDLow()); + return; + } + } // the difficulty is set even if the instances can't be reset //_player->SendDungeonDifficulty(true); pGroup->ResetInstances(INSTANCE_RESET_CHANGE_DIFFICULTY, false, _player); @@ -1547,6 +1566,22 @@ void WorldSession::HandleSetRaidDifficultyOpcode( WorldPacket & recv_data ) { if(pGroup->IsLeader(_player->GetGUID())) { + for(GroupReference *itr = pGroup->GetFirstMember(); itr != NULL; itr = itr->next()) + { + Player* pGroupGuy = itr->getSource(); + if(!pGroupGuy) + continue; + + if(!pGroupGuy->IsInMap(pGroupGuy)) + return; + + map = pGroupGuy->GetMap(); + if(map && map->IsRaidOrHeroicDungeon() ) + { + sLog.outError("WorldSession::HandleSetDungeonDifficultyOpcode: player %d tried to reset the instance while inside!", _player->GetGUIDLow()); + return; + } + } // the difficulty is set even if the instances can't be reset //_player->SendDungeonDifficulty(true); pGroup->ResetInstances(INSTANCE_RESET_CHANGE_DIFFICULTY, true, _player); @@ -1594,9 +1629,10 @@ void WorldSession::HandleMoveSetCanFlyAckOpcode( WorldPacket & recv_data ) recv_data.read_skip<uint32>(); // unk MovementInfo movementInfo; + movementInfo.guid = guid; ReadMovementInfo(recv_data, &movementInfo); - recv_data.read_skip<uint32>(); // unk2 + recv_data.read_skip<float>(); // unk2 _player->m_mover->m_movementInfo.flags = movementInfo.GetMovementFlags(); } @@ -1640,6 +1676,14 @@ void WorldSession::HandleWorldStateUITimerUpdate(WorldPacket& recv_data) SendPacket(&data); } +void WorldSession::HandleReadyForAccountDataTimes(WorldPacket& recv_data) +{ + // empty opcode + sLog.outDebug("WORLD: CMSG_READY_FOR_ACCOUNT_DATA_TIMES"); + + SendAccountDataTimes(GLOBAL_CACHE_MASK); +} + void WorldSession::SendSetPhaseShift(uint32 PhaseShift) { WorldPacket data(SMSG_SET_PHASE_SHIFT, 4); diff --git a/src/game/Object.cpp b/src/game/Object.cpp index 1b8a21650bd..4e0f7c01964 100644 --- a/src/game/Object.cpp +++ b/src/game/Object.cpp @@ -611,7 +611,7 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask if(!target->isAllowedToLoot((Creature*)this)) *data << (m_uint32Values[ index ] & ~UNIT_DYNFLAG_LOOTABLE); else - *data << (m_uint32Values[ index ] & ~UNIT_DYNFLAG_OTHER_TAGGER); + *data << (m_uint32Values[ index ] & ~UNIT_DYNFLAG_TAPPED); } else *data << m_uint32Values[ index ]; @@ -1103,8 +1103,8 @@ bool Object::PrintIndexError(uint32 index, bool set) const bool Position::HasInLine(const Unit * const target, float distance, float width) const { - assert(target); - if(!HasInArc(M_PI, target) || !target->IsWithinDist3d(m_positionX, m_positionY, m_positionZ, distance)) return false; + if (!HasInArc(M_PI, target) || !target->IsWithinDist3d(m_positionX, m_positionY, m_positionZ, distance)) + return false; width += target->GetObjectSize(); float angle = GetRelativeAngle(target); return abs(sin(angle)) * GetExactDist2d(target->GetPositionX(), target->GetPositionY()) < width; @@ -1193,7 +1193,6 @@ InstanceData* WorldObject::GetInstanceData() float WorldObject::GetDistanceZ(const WorldObject* obj) const { - assert(obj); float dz = fabs(GetPositionZ() - obj->GetPositionZ()); float sizefactor = GetObjectSize() + obj->GetObjectSize(); float dist = dz - sizefactor; @@ -1202,7 +1201,6 @@ float WorldObject::GetDistanceZ(const WorldObject* obj) const bool WorldObject::_IsWithinDist(WorldObject const* obj, float dist2compare, bool is3D) const { - assert(obj); float dx = GetPositionX() - obj->GetPositionX(); float dy = GetPositionY() - obj->GetPositionY(); float distsq = dx*dx + dy*dy; @@ -1360,7 +1358,6 @@ void Position::GetSinCos(const float x, const float y, float &vsin, float &vcos) bool Position::HasInArc(float arc, const Position *obj) const { - assert(obj); // always have self in arc if(obj == this) return true; diff --git a/src/game/Object.h b/src/game/Object.h index 22c7415a15a..0b4b71c13a5 100644 --- a/src/game/Object.h +++ b/src/game/Object.h @@ -377,7 +377,7 @@ struct Position void Relocate(const Position &pos) { m_positionX = pos.m_positionX; m_positionY = pos.m_positionY; m_positionZ = pos.m_positionZ; m_orientation = pos.m_orientation; } void Relocate(const Position *pos) - { assert(pos); m_positionX = pos->m_positionX; m_positionY = pos->m_positionY; m_positionZ = pos->m_positionZ; m_orientation = pos->m_orientation; } + { m_positionX = pos->m_positionX; m_positionY = pos->m_positionY; m_positionZ = pos->m_positionZ; m_orientation = pos->m_orientation; } void SetOrientation(float orientation) { m_orientation = orientation; } @@ -405,33 +405,33 @@ struct Position float GetExactDist2d(const float x, const float y) const { return sqrt(GetExactDist2dSq(x, y)); } float GetExactDist2dSq(const Position *pos) const - { assert(pos); float dx = m_positionX - pos->m_positionX; float dy = m_positionY - pos->m_positionY; return dx*dx + dy*dy; } + { float dx = m_positionX - pos->m_positionX; float dy = m_positionY - pos->m_positionY; return dx*dx + dy*dy; } float GetExactDist2d(const Position *pos) const - { assert(pos); return sqrt(GetExactDist2dSq(pos)); } + { return sqrt(GetExactDist2dSq(pos)); } float GetExactDistSq(float x, float y, float z) const { float dz = m_positionZ - z; return GetExactDist2dSq(x, y) + dz*dz; } float GetExactDist(float x, float y, float z) const { return sqrt(GetExactDistSq(x, y, z)); } float GetExactDistSq(const Position *pos) const - { assert(pos); float dx = m_positionX - pos->m_positionX; float dy = m_positionY - pos->m_positionY; float dz = m_positionZ - pos->m_positionZ; return dx*dx + dy*dy + dz*dz; } + { float dx = m_positionX - pos->m_positionX; float dy = m_positionY - pos->m_positionY; float dz = m_positionZ - pos->m_positionZ; return dx*dx + dy*dy + dz*dz; } float GetExactDist(const Position *pos) const - { assert(pos); return sqrt(GetExactDistSq(pos)); } + { return sqrt(GetExactDistSq(pos)); } float GetAngle(const Position *pos) const; float GetAngle(float x, float y) const; float GetRelativeAngle(const Position *pos) const - { assert(pos); return GetAngle(pos) - m_orientation; } + { return GetAngle(pos) - m_orientation; } float GetRelativeAngle(float x, float y) const { return GetAngle(x, y) - m_orientation; } void GetSinCos(float x, float y, float &vsin, float &vcos) const; bool IsInDist2d(float x, float y, float dist) const { return GetExactDist2dSq(x, y) < dist * dist; } bool IsInDist2d(const Position *pos, float dist) const - { assert(pos); return GetExactDist2dSq(pos) < dist * dist; } + { return GetExactDist2dSq(pos) < dist * dist; } bool IsInDist(float x, float y, float z, float dist) const { return GetExactDistSq(x, y, z) < dist * dist; } bool IsInDist(const Position *pos, float dist) const - { assert(pos); return GetExactDistSq(pos) < dist * dist; } + { return GetExactDistSq(pos) < dist * dist; } bool HasInArc(float arcangle, const Position *pos) const; bool HasInLine(const Unit *target, float distance, float width) const; }; @@ -513,7 +513,7 @@ class WorldObject : public Object, public WorldLocation virtual void SetPhaseMask(uint32 newPhaseMask, bool update); uint32 GetPhaseMask() const { return m_phaseMask; } - bool InSamePhase(WorldObject const* obj) const { assert(obj); return InSamePhase(obj->GetPhaseMask()); } + bool InSamePhase(WorldObject const* obj) const { return InSamePhase(obj->GetPhaseMask()); } bool InSamePhase(uint32 phasemask) const { return (GetPhaseMask() & phasemask); } uint32 GetZoneId() const; @@ -529,7 +529,6 @@ class WorldObject : public Object, public WorldLocation float GetDistance(const WorldObject *obj) const { - assert(obj); float d = GetExactDist(obj) - GetObjectSize() - obj->GetObjectSize(); return d > 0.0f ? d : 0.0f; } @@ -545,7 +544,6 @@ class WorldObject : public Object, public WorldLocation } float GetDistance2d(const WorldObject* obj) const { - assert(obj); float d = GetExactDist2d(obj) - GetObjectSize() - obj->GetObjectSize(); return d > 0.0f ? d : 0.0f; } diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index b9265081cf5..e44207c63db 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -2325,6 +2325,29 @@ void ObjectMgr::LoadItemPrototypes() const_cast<ItemPrototype*>(proto)->HolidayId = 0; } } + + // check some dbc referecned items (avoid duplicate reports) + std::set<uint32> notFoundOutfit; + for (uint32 i = 1; i < sCharStartOutfitStore.GetNumRows(); ++i) + { + CharStartOutfitEntry const* entry = sCharStartOutfitStore.LookupEntry(i); + if (!entry) + continue; + + for(int j = 0; j < MAX_OUTFIT_ITEMS; ++j) + { + if(entry->ItemId[j] <= 0) + continue; + + uint32 item_id = entry->ItemId[j]; + + if(!GetItemPrototype(item_id)) + notFoundOutfit.insert(item_id); + } + } + + for(std::set<uint32>::const_iterator itr = notFoundOutfit.begin(); itr != notFoundOutfit.end(); ++itr) + sLog.outErrorDb("Item (Entry: %u) not exist in `item_template` but referenced in `CharStartOutfit.dnc`", *itr); } void ObjectMgr::LoadItemRequiredTarget() @@ -3451,7 +3474,7 @@ void ObjectMgr::LoadQuests() // 9 10 11 12 13 14 15 16 17 18 "RepObjectiveFaction, RepObjectiveValue, RepObjectiveFaction2, RepObjectiveValue2, RequiredMinRepFaction, RequiredMinRepValue, RequiredMaxRepFaction, RequiredMaxRepValue, SuggestedPlayers, LimitTime," // 19 20 21 22 23 24 25 26 27 28 29 30 - "QuestFlags, SpecialFlags, CharTitleId, PlayersSlain, BonusTalents, PrevQuestId, NextQuestId, ExclusiveGroup, NextQuestInChain, SrcItemId, SrcItemCount, SrcSpell," + "QuestFlags, SpecialFlags, CharTitleId, PlayersSlain, BonusTalents, PrevQuestId, NextQuestId, ExclusiveGroup, NextQuestInChain, RewXPId, SrcItemId, SrcItemCount, SrcSpell," // 31 32 33 34 35 36 37 38 39 40 "Title, Details, Objectives, OfferRewardText, RequestItemsText, EndText, ObjectiveText1, ObjectiveText2, ObjectiveText3, ObjectiveText4," // 41 42 43 44 45 46 47 48 49 50 51 52 @@ -3469,9 +3492,10 @@ void ObjectMgr::LoadQuests() // 85 86 87 88 89 90 91 92 "RewItemId1, RewItemId2, RewItemId3, RewItemId4, RewItemCount1, RewItemCount2, RewItemCount3, RewItemCount4," // 93 94 95 96 97 98 99 100 101 102 - "RewRepFaction1, RewRepFaction2, RewRepFaction3, RewRepFaction4, RewRepFaction5, RewRepValue1, RewRepValue2, RewRepValue3, RewRepValue4, RewRepValue5," + "RewRepFaction1, RewRepFaction2, RewRepFaction3, RewRepFaction4, RewRepFaction5, RewRepValueId1, RewRepValueId2, RewRepValueId3, RewRepValueId4, RewRepValueId5," + "RewRepValue1, RewRepValue2, RewRepValue3, RewRepValue4, RewRepValue5," // 103 104 105 106 107 108 109 110 111 112 113 - "RewHonorableKills, RewOrReqMoney, RewMoneyMaxLevel, RewSpell, RewSpellCast, RewMailTemplateId, RewMailDelaySecs, PointMapId, PointX, PointY, PointOpt," + "RewHonorAddition, RewHonorMultiplier, RewOrReqMoney, RewMoneyMaxLevel, RewSpell, RewSpellCast, RewMailTemplateId, RewMailDelaySecs, PointMapId, PointX, PointY, PointOpt," // 114 115 116 117 118 119 120 121 "DetailsEmote1, DetailsEmote2, DetailsEmote3, DetailsEmote4, DetailsEmoteDelay1, DetailsEmoteDelay2, DetailsEmoteDelay3, DetailsEmoteDelay4," // 122 123 124 125 126 127 @@ -3938,30 +3962,29 @@ void ObjectMgr::LoadQuests() for (uint8 j = 0; j < QUEST_REPUTATIONS_COUNT; ++j) { - if(qinfo->RewRepFaction[j]) + if (qinfo->RewRepFaction[j]) { - if(!qinfo->RewRepValue[j]) + if (abs(qinfo->RewRepValueId[j]) > 9) { - sLog.outErrorDb("Quest %u has `RewRepFaction%d` = %u but `RewRepValue%d` = 0, quest will not reward this reputation.", - qinfo->GetQuestId(),j+1,qinfo->RewRepValue[j],j+1); - // no changes + sLog.outErrorDb("Quest %u has RewRepValueId%d = %i. That is outside the range of valid values (-9 to 9).", qinfo->GetQuestId(), j+1, qinfo->RewRepValueId[j]); } - if(!sFactionStore.LookupEntry(qinfo->RewRepFaction[j])) { - sLog.outErrorDb("Quest %u has `RewRepFaction%d` = %u but raw faction (faction.dbc) %u does not exist, quest will not reward reputation for this faction.", - qinfo->GetQuestId(),j+1,qinfo->RewRepFaction[j] ,qinfo->RewRepFaction[j] ); + sLog.outErrorDb("Quest %u has `RewRepFaction%d` = %u but raw faction (faction.dbc) %u does not exist, quest will not reward reputation for this faction.", qinfo->GetQuestId(),j+1,qinfo->RewRepFaction[j] ,qinfo->RewRepFaction[j] ); qinfo->RewRepFaction[j] = 0; // quest will not reward this } - } + } + + else if(qinfo->RewRepValue[j]!=0) { - sLog.outErrorDb("Quest %u has `RewRepFaction%d` = 0 but `RewRepValue%d` = %u.", + sLog.outErrorDb("Quest %u has `RewRepFaction%d` = 0 but `RewRepValue%d` = %i.", qinfo->GetQuestId(),j+1,j+1,qinfo->RewRepValue[j]); // no changes, quest ignore this data } } + if(qinfo->RewSpell) { SpellEntry const* spellInfo = sSpellStore.LookupEntry(qinfo->RewSpell); @@ -6595,6 +6618,65 @@ void ObjectMgr::LoadPointsOfInterest() sLog.outString(">> Loaded %u Points of Interest definitions", count); } +void ObjectMgr::LoadQuestPOI() +{ + uint32 count = 0; + + // 0 1 2 3 + QueryResult_AutoPtr result = WorldDatabase.Query("SELECT questId, id, objIndex, mapid, WorldMapAreaId, FloorId, unk3, unk4 FROM quest_poi order by questId"); + + if(!result) + { + barGoLink bar(1); + + bar.step(); + + sLog.outString(); + sLog.outErrorDb(">> Loaded 0 quest POI definitions. DB table `quest_poi` is empty."); + return; + } + + barGoLink bar(result->GetRowCount()); + + do + { + Field *fields = result->Fetch(); + bar.step(); + + uint32 questId = fields[0].GetUInt32(); + uint32 id = fields[1].GetUInt32(); + int32 objIndex = fields[2].GetInt32(); + uint32 mapId = fields[3].GetUInt32(); + uint32 WorldMapAreaId = fields[4].GetUInt32(); + uint32 FloorId = fields[5].GetUInt32(); + uint32 unk3 = fields[6].GetUInt32(); + uint32 unk4 = fields[7].GetUInt32(); + + QuestPOI POI(objIndex, mapId, WorldMapAreaId, FloorId, unk3, unk4); + + QueryResult_AutoPtr points = WorldDatabase.PQuery("SELECT x, y FROM quest_poi_points WHERE questId='%u' AND id='%i'", questId, id); + + if(points) + { + do + { + Field *pointFields = points->Fetch(); + int32 x = pointFields[0].GetInt32(); + int32 y = pointFields[1].GetInt32(); + QuestPOIPoint point(x, y); + POI.points.push_back(point); + } while (points->NextRow()); + } + + mQuestPOIMap[questId].push_back(POI); + + ++count; + } while (result->NextRow()); + + sLog.outString(); + sLog.outString(">> Loaded %u quest POI definitions", count); +} + void ObjectMgr::LoadNPCSpellClickSpells() { uint32 count = 0; diff --git a/src/game/ObjectMgr.h b/src/game/ObjectMgr.h index bfbaea67a87..63483958ab0 100644 --- a/src/game/ObjectMgr.h +++ b/src/game/ObjectMgr.h @@ -249,6 +249,32 @@ typedef std::pair<GossipMenusMap::const_iterator, GossipMenusMap::const_iterator typedef std::multimap<uint32,GossipMenuItems> GossipMenuItemsMap; typedef std::pair<GossipMenuItemsMap::const_iterator, GossipMenuItemsMap::const_iterator> GossipMenuItemsMapBounds; +struct QuestPOIPoint +{ + int32 x; + int32 y; + + QuestPOIPoint() : x(0), y(0) {} + QuestPOIPoint(int32 _x, int32 _y) : x(_x), y(_y) {} +}; + +struct QuestPOI +{ + int32 ObjectiveIndex; + uint32 MapId; + uint32 Unk1; + uint32 Unk2; + uint32 Unk3; + uint32 Unk4; + std::vector<QuestPOIPoint> points; + + QuestPOI() : ObjectiveIndex(0), MapId(0), Unk1(0), Unk2(0), Unk3(0), Unk4(0) {} + QuestPOI(int32 objIndex, uint32 mapId, uint32 unk1, uint32 unk2, uint32 unk3, uint32 unk4) : ObjectiveIndex(objIndex), MapId(mapId), Unk1(unk1), Unk2(unk2), Unk3(unk3), Unk4(unk4) {} +}; + +typedef std::vector<QuestPOI> QuestPOIVector; +typedef UNORDERED_MAP<uint32, QuestPOIVector> QuestPOIMap; + #define WEATHER_SEASONS 4 struct WeatherSeasonChances { @@ -542,6 +568,14 @@ class ObjectMgr return NULL; } + QuestPOIVector const* GetQuestPOIVector(uint32 questId) + { + QuestPOIMap::const_iterator itr = mQuestPOIMap.find(questId); + if(itr != mQuestPOIMap.end()) + return &itr->second; + return NULL; + } + void LoadGuilds(); void LoadArenaTeams(); void LoadGroups(); @@ -627,6 +661,7 @@ class ObjectMgr void LoadReputationOnKill(); void LoadPointsOfInterest(); + void LoadQuestPOI(); void LoadNPCSpellClickSpells(); @@ -989,6 +1024,8 @@ class ObjectMgr GossipMenuItemsMap m_mGossipMenuItemsMap; PointOfInterestMap mPointsOfInterest; + QuestPOIMap mQuestPOIMap; + WeatherZoneMap mWeatherZoneMap; //character reserved names diff --git a/src/game/Opcodes.cpp b/src/game/Opcodes.cpp index 12f2c8704fa..834ef3f2d3d 100644 --- a/src/game/Opcodes.cpp +++ b/src/game/Opcodes.cpp @@ -511,8 +511,8 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] = /*0x1E0*/ { "CMSG_SETSHEATHED", STATUS_LOGGEDIN, &WorldSession::HandleSetSheathedOpcode }, /*0x1E1*/ { "SMSG_COOLDOWN_CHEAT", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x1E2*/ { "SMSG_SPELL_DELAYED", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x1E3*/ { "CMSG_PLAYER_MACRO_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL }, - /*0x1E4*/ { "SMSG_PLAYER_MACRO_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x1E3*/ { "CMSG_QUEST_POI_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleQuestPOIQuery }, + /*0x1E4*/ { "SMSG_QUEST_POI_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x1E5*/ { "CMSG_GHOST", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x1E6*/ { "CMSG_GM_INVIS", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x1E7*/ { "SMSG_INVALID_PROMOTION_CODE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, @@ -537,10 +537,10 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] = /*0x1FA*/ { "CMSG_GM_NUKE", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x1FB*/ { "MSG_RANDOM_ROLL", STATUS_LOGGEDIN, &WorldSession::HandleRandomRollOpcode }, /*0x1FC*/ { "SMSG_ENVIRONMENTALDAMAGELOG", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x1FD*/ { "CMSG_RWHOIS_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_NULL }, + /*0x1FD*/ { "CMSG_PLAYER_DIFFICULTY_CHANGE", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x1FE*/ { "SMSG_RWHOIS", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x1FF*/ { "MSG_LOOKING_FOR_GROUP", STATUS_LOGGEDIN, &WorldSession::HandleLookingForGroup }, - /*0x200*/ { "CMSG_SET_LOOKING_FOR_GROUP", STATUS_LOGGEDIN, &WorldSession::HandleSetLfgOpcode }, + /*0x1FF*/ { "SMSG_LFG_COMPLETION_REWARD", STATUS_LOGGEDIN, &WorldSession::Handle_ServerSide }, + /*0x200*/ { "SMSG_LFG_ERROR", STATUS_LOGGEDIN, &WorldSession::Handle_ServerSide }, /*0x201*/ { "CMSG_UNLEARN_SPELL", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x202*/ { "CMSG_UNLEARN_SKILL", STATUS_LOGGEDIN, &WorldSession::HandleUnlearnSkillOpcode }, /*0x203*/ { "SMSG_REMOVED_SPELL", STATUS_NEVER, &WorldSession::Handle_ServerSide }, @@ -554,7 +554,7 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] = /*0x20B*/ { "CMSG_UPDATE_ACCOUNT_DATA", STATUS_AUTHED, &WorldSession::HandleUpdateAccountData }, /*0x20C*/ { "SMSG_UPDATE_ACCOUNT_DATA", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x20D*/ { "SMSG_CLEAR_FAR_SIGHT_IMMEDIATE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x20E*/ { "SMSG_POWERGAINLOG_OBSOLETE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x20E*/ { "SMSG_PLAYER_DIFFICULTY_CHANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x20F*/ { "CMSG_GM_TEACH", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x210*/ { "CMSG_GM_CREATE_ITEM_TARGET", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x211*/ { "CMSG_GMTICKET_GETTICKET", STATUS_LOGGEDIN, &WorldSession::HandleGMTicketGetTicketOpcode }, @@ -687,7 +687,7 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] = /*0x290*/ { "CMSG_BUYBACK_ITEM", STATUS_LOGGEDIN, &WorldSession::HandleBuybackItem }, /*0x291*/ { "SMSG_SERVER_MESSAGE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x292*/ { "CMSG_SET_SAVED_INSTANCE_EXTEND", STATUS_NEVER, &WorldSession::Handle_NULL }, - /*0x293*/ { "CMSG_MEETINGSTONE_LEAVE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x293*/ { "SMSG_LFG_OFFER_CONTINUE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x294*/ { "CMSG_MEETINGSTONE_CHEAT", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x295*/ { "SMSG_MEETINGSTONE_SETQUEUE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x296*/ { "CMSG_MEETINGSTONE_INFO", STATUS_LOGGEDIN, &WorldSession::HandleMeetingStoneInfo }, @@ -727,7 +727,7 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] = /*0x2B8*/ { "SMSG_AREA_TRIGGER_MESSAGE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x2B9*/ { "CMSG_SHOWING_HELM", STATUS_LOGGEDIN, &WorldSession::HandleShowingHelmOpcode }, /*0x2BA*/ { "CMSG_SHOWING_CLOAK", STATUS_LOGGEDIN, &WorldSession::HandleShowingCloakOpcode }, - /*0x2BB*/ { "SMSG_MEETINGSTONE_JOINFAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x2BB*/ { "SMSG_LFG_ROLE_CHECK_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x2BC*/ { "SMSG_PLAYER_SKINNED", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x2BD*/ { "SMSG_DURABILITY_DAMAGE_DEATH", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x2BE*/ { "CMSG_SET_EXPLORATION", STATUS_NEVER, &WorldSession::Handle_NULL }, @@ -888,29 +888,29 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] = /*0x359*/ { "MSG_MOVE_START_ASCEND", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes }, /*0x35A*/ { "MSG_MOVE_STOP_ASCEND", STATUS_LOGGEDIN, &WorldSession::HandleMovementOpcodes }, /*0x35B*/ { "SMSG_ARENA_TEAM_STATS", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x35C*/ { "CMSG_LFG_SET_AUTOJOIN", STATUS_AUTHED, &WorldSession::HandleLfgSetAutoJoinOpcode }, - /*0x35D*/ { "CMSG_LFG_CLEAR_AUTOJOIN", STATUS_LOGGEDIN, &WorldSession::HandleLfgClearAutoJoinOpcode }, - /*0x35E*/ { "CMSG_LFM_SET_AUTOFILL", STATUS_AUTHED, &WorldSession::HandleLfmSetAutoFillOpcode }, - /*0x35F*/ { "CMSG_LFM_CLEAR_AUTOFILL", STATUS_LOGGEDIN, &WorldSession::HandleLfmClearAutoFillOpcode }, - /*0x360*/ { "CMSG_ACCEPT_LFG_MATCH", STATUS_NEVER, &WorldSession::Handle_NULL }, - /*0x361*/ { "CMSG_DECLINE_LFG_MATCH", STATUS_NEVER, &WorldSession::Handle_NULL }, - /*0x362*/ { "CMSG_CANCEL_PENDING_LFG", STATUS_NEVER, &WorldSession::Handle_NULL }, - /*0x363*/ { "CMSG_CLEAR_LOOKING_FOR_GROUP", STATUS_LOGGEDIN, &WorldSession::HandleLfgClearOpcode }, - /*0x364*/ { "CMSG_CLEAR_LOOKING_FOR_MORE", STATUS_LOGGEDIN, &WorldSession::HandleLfmClearOpcode }, - /*0x365*/ { "CMSG_SET_LOOKING_FOR_MORE", STATUS_LOGGEDIN, &WorldSession::HandleSetLfmOpcode }, + /*0x35C*/ { "CMSG_LFG_JOIN", STATUS_LOGGEDIN, &WorldSession::HandleLfgSetAutoJoinOpcode }, + /*0x35D*/ { "CMSG_LFG_LEAVE", STATUS_LOGGEDIN, &WorldSession::HandleLfgClearAutoJoinOpcode }, + /*0x35E*/ { "CMSG_SEARCH_LFG_JOIN", STATUS_LOGGEDIN, &WorldSession::HandleLfmSetAutoFillOpcode }, + /*0x35F*/ { "CMSG_SEARCH_LFG_LEAVE", STATUS_LOGGEDIN, &WorldSession::HandleLfmClearAutoFillOpcode }, + /*0x360*/ { "SMSG_UPDATE_LFG_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x361*/ { "SMSG_LFG_PROPOSAL_DECLINED", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x362*/ { "CMSG_LFG_PROPOSAL_RESULT", STATUS_LOGGEDIN, &WorldSession::Handle_NULL }, + /*0x363*/ { "SMSG_LFG_ROLE_CHECK", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x364*/ { "SMSG_LFG_ROLE_CHECK_FAILED_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x365*/ { "SMSG_LFG_QUEUE_STATUS_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x366*/ { "CMSG_SET_LFG_COMMENT", STATUS_LOGGEDIN, &WorldSession::HandleSetLfgCommentOpcode }, - /*0x367*/ { "SMSG_LFG_TIMEDOUT", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x368*/ { "SMSG_LFG_OTHER_TIMEDOUT", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x369*/ { "SMSG_LFG_AUTOJOIN_FAILED", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x36A*/ { "SMSG_LFG_AUTOJOIN_FAILED_NO_PLAYER", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x36B*/ { "SMSG_LFG_LEADER_IS_LFM", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x36C*/ { "SMSG_LFG_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x36D*/ { "SMSG_LFG_UPDATE_LFM", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x36E*/ { "SMSG_LFG_UPDATE_LFG", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x36F*/ { "SMSG_LFG_UPDATE_QUEUED", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x370*/ { "SMSG_LFG_PENDING_INVITE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x371*/ { "SMSG_LFG_PENDING_MATCH", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x372*/ { "SMSG_LFG_PENDING_MATCH_DONE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x367*/ { "SMSG_LFG_LFG_PROPOSAL_INFO", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x368*/ { "SMSG_LFG_LFG_PROPOSAL_INFO2", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x369*/ { "SMSG_LFG_UPDATE_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x36A*/ { "CMSG_LFG_SET_ROLES", STATUS_NEVER, &WorldSession::Handle_NULL }, + /*0x36B*/ { "CMSG_LFG_SET_NEEDS", STATUS_NEVER, &WorldSession::Handle_NULL }, + /*0x36C*/ { "CMSG_LFG_SET_BOOT_VOTE", STATUS_NEVER, &WorldSession::Handle_NULL }, + /*0x36D*/ { "SMSG_LFG_BOOT_PROPOSAL_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x36E*/ { "CMSG_LFD_PLAYER_LOCK_INFO_REQUEST", STATUS_NEVER, &WorldSession::Handle_NULL }, + /*0x36F*/ { "SMSG_LFG_PLAYER_LOCK_INFO_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x370*/ { "CMSG_LFG_TELEPORT", STATUS_NEVER, &WorldSession::Handle_NULL }, + /*0x371*/ { "CMSG_LFD_PARTY_LOCK_INFO_REQUEST", STATUS_NEVER, &WorldSession::Handle_NULL }, + /*0x372*/ { "SMSG_LFG_PLAYER_LOCK_INFO_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x373*/ { "SMSG_TITLE_EARNED", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x374*/ { "CMSG_SET_TITLE", STATUS_LOGGEDIN, &WorldSession::HandleSetTitleOpcode }, /*0x375*/ { "CMSG_CANCEL_MOUNT_AURA", STATUS_LOGGEDIN, &WorldSession::HandleCancelMountAuraOpcode }, @@ -1218,7 +1218,7 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] = /*0x4A3*/ { "SMSG_SERVER_BUCK_DATA_START", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x4A4*/ { "CMSG_QUERY_VEHICLE_STATUS", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4A5*/ { "UMSG_UNKNOWN_1189", STATUS_NEVER, &WorldSession::Handle_NULL }, - /*0x4A6*/ { "SMSG_UNKNOWN_1190", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x4A6*/ { "SMSG_BATTLEGROUND_INFO_THROTTLED", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x4A7*/ { "SMSG_PLAYER_VEHICLE_DATA", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x4A8*/ { "CMSG_PLAYER_VEHICLE_ENTER", STATUS_LOGGEDIN, &WorldSession::HandleEnterPlayerVehicle }, /*0x4A9*/ { "CMSG_EJECT_PASSENGER", STATUS_LOGGEDIN, &WorldSession::HandleEjectPasenger }, @@ -1230,16 +1230,16 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] = /*0x4AF*/ { "UMSG_UNKNOWN_1199", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4B0*/ { "UMSG_UNKNOWN_1200", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4B1*/ { "UMSG_UNKNOWN_1201", STATUS_NEVER, &WorldSession::Handle_NULL }, - /*0x4B2*/ { "SMSG_ITEM_REFUND_TIMER", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x4B3*/ { "CMSG_ITEM_REFUND_INFO_REQUEST", STATUS_LOGGEDIN, &WorldSession::HandleItemRefundInfoRequest }, + /*0x4B2*/ { "SMSG_ITEM_REFUND_INFO_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x4B3*/ { "CMSG_ITEM_REFUND_INFO", STATUS_LOGGEDIN, &WorldSession::HandleItemRefundInfoRequest }, /*0x4B4*/ { "CMSG_ITEM_REFUND", STATUS_LOGGEDIN, &WorldSession::HandleItemRefund }, - /*0x4B5*/ { "SMSG_UNKNOWN_1205", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x4B5*/ { "SMSG_ITEM_REFUND_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x4B6*/ { "CMSG_CORPSE_MAP_POSITION_QUERY", STATUS_LOGGEDIN, &WorldSession::HandleCorpseMapPositionQuery }, /*0x4B7*/ { "CMSG_CORPSE_MAP_POSITION_QUERY_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x4B8*/ { "CMSG_LFG_SET_ROLES", STATUS_LOGGEDIN, &WorldSession::HandleLfgSetRoles }, + /*0x4B8*/ { "CMSG_LFG_SET_ROLES_2", STATUS_LOGGEDIN, &WorldSession::HandleLfgSetRoles }, /*0x4B9*/ { "UMSG_UNKNOWN_1209", STATUS_NEVER, &WorldSession::Handle_NULL }, - /*0x4BA*/ { "CMSG_UNKNOWN_1210", STATUS_NEVER, &WorldSession::Handle_NULL }, - /*0x4BB*/ { "SMSG_UNKNOWN_1211", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x4BA*/ { "CMSG_CALENDAR_CONTEXT_EVENT_SIGNUP", STATUS_NEVER, &WorldSession::Handle_NULL }, + /*0x4BB*/ { "SMSG_CALENDAR_ACTION_PENDING", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x4BC*/ { "SMSG_EQUIPMENT_SET_LIST", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x4BD*/ { "CMSG_EQUIPMENT_SET_SAVE", STATUS_LOGGEDIN, &WorldSession::HandleEquipmentSetSave }, /*0x4BE*/ { "CMSG_UNKNOWN_1214", STATUS_NEVER, &WorldSession::Handle_NULL }, @@ -1251,8 +1251,8 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] = /*0x4C4*/ { "UMSG_UNKNOWN_1220", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4C5*/ { "UMSG_UNKNOWN_1221", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4C6*/ { "UMSG_UNKNOWN_1222", STATUS_NEVER, &WorldSession::Handle_NULL }, - /*0x4C7*/ { "SMSG_UNKNOWN_1223", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x4C8*/ { "SMSG_UNKNOWN_1224", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x4C7*/ { "SMSG_ARENA_OPPONENT_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x4C8*/ { "SMSG_ARENA_TEAM_CHANGE_FAILED_QUEUED", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x4C9*/ { "UMSG_UNKNOWN_1225", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4CA*/ { "UMSG_UNKNOWN_1226", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4CB*/ { "UMSG_UNKNOWN_1227", STATUS_NEVER, &WorldSession::Handle_NULL }, @@ -1269,36 +1269,50 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] = /*0x4D6*/ { "SMSG_EQUIPMENT_SET_USE_RESULT", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x4D7*/ { "UMSG_UNKNOWN_1239", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4D8*/ { "SMSG_UNKNOWN_1240", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x4D9*/ { "CMSG_UNKNOWN_1241", STATUS_NEVER, &WorldSession::Handle_NULL }, - /*0x4DA*/ { "SMSG_UNKNOWN_1242", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x4D9*/ { "CMSG_CHAR_FACTION_CHANGE", STATUS_NEVER, &WorldSession::Handle_NULL }, + /*0x4DA*/ { "SMSG_CHAR_FACTION_CHANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x4DB*/ { "UMSG_UNKNOWN_1243", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4DC*/ { "UMSG_UNKNOWN_1244", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4DD*/ { "UMSG_UNKNOWN_1245", STATUS_NEVER, &WorldSession::Handle_NULL }, - /*0x4DE*/ { "SMSG_UNKNOWN_1246", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x4DF*/ { "CMSG_UNKNOWN_1247", STATUS_NEVER, &WorldSession::Handle_NULL }, - /*0x4E0*/ { "SMSG_UNKNOWN_1248", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x4E1*/ { "SMSG_UNKNOWN_1249", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x4E2*/ { "CMSG_UNKNOWN_1250", STATUS_NEVER, &WorldSession::Handle_NULL }, - /*0x4E3*/ { "CMSG_UNKNOWN_1251", STATUS_NEVER, &WorldSession::Handle_NULL }, - /*0x4E4*/ { "SMSG_UNKNOWN_1252", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x4E5*/ { "SMSG_UNKNOWN_1253", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x4E6*/ { "SMSG_UNKNOWN_1254", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x4E7*/ { "CMSG_UNKNOWN_1255", STATUS_NEVER, &WorldSession::Handle_NULL }, - /*0x4E8*/ { "SMSG_UNKNOWN_1256", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x4DE*/ { "SMSG_BATTLEFIELD_MGR_ENTRY_INVITE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x4DF*/ { "CMSG_BATTLEFIELD_MGR_ENTRY_INVITE_RESPONS", STATUS_NEVER, &WorldSession::Handle_NULL }, + /*0x4E0*/ { "SMSG_BATTLEFIELD_MGR_ENTERED", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x4E1*/ { "SMSG_BATTLEFIELD_MGR_QUEUE_INVITE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x4E2*/ { "CMSG_BATTLEFIELD_MGR_QUEUE_INVITE_RESPONSE", STATUS_NEVER, &WorldSession::Handle_NULL }, + /*0x4E3*/ { "CMSG_BATTLEFIELD_MGR_QUEUE_REQUEST", STATUS_NEVER, &WorldSession::Handle_NULL }, + /*0x4E4*/ { "SMSG_BATTLEFIELD_MGR_QUEUE_REQUEST_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x4E5*/ { "SMSG_BATTLEFIELD_MGR_EJECT_PENDING", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x4E6*/ { "SMSG_BATTLEFIELD_MGR_EJECTED", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x4E7*/ { "CMSG_BATTLEFIELD_MGR_EXIT_REQUEST", STATUS_NEVER, &WorldSession::Handle_NULL }, + /*0x4E8*/ { "SMSG_BATTLEFIELD_MGR_STATE_CHANGE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x4E9*/ { "UMSG_UNKNOWN_1257", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4EA*/ { "UMSG_UNKNOWN_1258", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4EB*/ { "MSG_SET_RAID_DIFFICULTY", STATUS_LOGGEDIN, &WorldSession::HandleSetRaidDifficultyOpcode }, /*0x4EC*/ { "UMSG_UNKNOWN_1260", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4ED*/ { "SMSG_TOGGLE_XP_GAIN", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x4EE*/ { "SMSG_UNKNOWN_1262", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x4EF*/ { "SMSG_UNKNOWN_1263", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x4F0*/ { "CMSG_UNKNOWN_1264", STATUS_NEVER, &WorldSession::Handle_NULL }, - /*0x4F1*/ { "SMSG_UNKNOWN_1265", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x4EE*/ { "SMSG_GMRESPONSE_DB_ERROR", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x4EF*/ { "SMSG_GMRESPONSE_RECEIVED", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x4F0*/ { "CMSG_GMRESPONSE_RESOLVE", STATUS_NEVER, &WorldSession::Handle_NULL }, + /*0x4F1*/ { "SMSG_GMRESPONSE_STATUS_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, /*0x4F2*/ { "UMSG_UNKNOWN_1266", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4F3*/ { "UMSG_UNKNOWN_1267", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4F4*/ { "UMSG_UNKNOWN_1268", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4F5*/ { "UMSG_UNKNOWN_1269", STATUS_NEVER, &WorldSession::Handle_NULL }, /*0x4F6*/ { "CMSG_WORLD_STATE_UI_TIMER_UPDATE", STATUS_LOGGEDIN, &WorldSession::HandleWorldStateUITimerUpdate }, /*0x4F7*/ { "SMSG_WORLD_STATE_UI_TIMER_UPDATE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, - /*0x4F8*/ { "CMSG_UNKNOWN_1272", STATUS_NEVER, &WorldSession::Handle_NULL }, + /*0x4F8*/ { "CMSG_CHAR_RACE_CHANGE", STATUS_NEVER, &WorldSession::Handle_NULL }, + /*0x4F9*/ { "UMSG_UNKNOWN_1273", STATUS_NEVER, &WorldSession::Handle_NULL }, + /*0x4FA*/ { "SMSG_TALENTS_INVOLUNTARILY_RESET", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x4FB*/ { "UMSG_UNKNOWN_1275", STATUS_NEVER, &WorldSession::Handle_NULL }, + /*0x4FC*/ { "SMSG_UNKNOWN_1276", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x4FD*/ { "SMSG_LOOT_SLOT_CHANGED", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x4FE*/ { "UMSG_UNKNOWN_1278", STATUS_NEVER, &WorldSession::Handle_NULL }, + /*0x4FF*/ { "CMSG_READY_FOR_ACCOUNT_DATA_TIMES", STATUS_AUTHED, &WorldSession::HandleReadyForAccountDataTimes }, + /*0x500*/ { "CMSG_QUERY_QUESTS_COMPLETED", STATUS_LOGGEDIN, &WorldSession::HandleQueryQuestsCompleted }, + /*0x501*/ { "SMSG_QUERY_QUESTS_COMPLETED_RESPONSE", STATUS_NEVER, &WorldSession::Handle_ServerSide }, + /*0x502*/ { "CMSG_GM_REPORT_LAG", STATUS_NEVER, &WorldSession::Handle_NULL }, + /*0x503*/ { "UMSG_UNKNOWN_1283", STATUS_NEVER, &WorldSession::Handle_NULL }, + /*0x504*/ { "UMSG_UNKNOWN_1284", STATUS_NEVER, &WorldSession::Handle_NULL }, + /*0x505*/ { "UMSG_UNKNOWN_1285", STATUS_NEVER, &WorldSession::Handle_NULL }, + /*0x506*/ { "UMSG_UNKNOWN_1286", STATUS_NEVER, &WorldSession::Handle_NULL }, }; diff --git a/src/game/Opcodes.h b/src/game/Opcodes.h index d3f80834764..a7464ba77a2 100644 --- a/src/game/Opcodes.h +++ b/src/game/Opcodes.h @@ -369,7 +369,7 @@ enum Opcodes SMSG_ATTACKERSTATEUPDATE = 0x14A, SMSG_BATTLEFIELD_PORT_DENIED = 0x14B, SMSG_DAMAGE_DONE_OBSOLETE = 0x14C, - SMSG_DAMAGE_TAKEN_OBSOLETE = 0x14D, + SMSG_UNIT_SPELLCAST_START = 0x14D, SMSG_CANCEL_COMBAT = 0x14E, SMSG_SPELLBREAKLOG = 0x14F, SMSG_SPELLHEALLOG = 0x150, @@ -404,7 +404,7 @@ enum Opcodes CMSG_DUEL_CANCELLED = 0x16D, SMSG_MOUNTRESULT = 0x16E, SMSG_DISMOUNTRESULT = 0x16F, - SMSG_PUREMOUNT_CANCELLED_OBSOLETE = 0x170, + SMSG_PUREMOUNT_CANCELLED_OBSOLETE = 0x170, // ERR_REMOVE_FROM_PVP_QUEUE_* events CMSG_MOUNTSPECIAL_ANIM = 0x171, SMSG_MOUNTSPECIAL_ANIM = 0x172, SMSG_PET_TAME_FAILURE = 0x173, @@ -545,10 +545,10 @@ enum Opcodes CMSG_GM_NUKE = 0x1FA, MSG_RANDOM_ROLL = 0x1FB, SMSG_ENVIRONMENTALDAMAGELOG = 0x1FC, - CMSG_RWHOIS_OBSOLETE = 0x1FD, + CMSG_PLAYER_DIFFICULTY_CHANGE = 0x1FD, SMSG_RWHOIS = 0x1FE, - MSG_LOOKING_FOR_GROUP = 0x1FF, - CMSG_SET_LOOKING_FOR_GROUP = 0x200, + SMSG_LFG_COMPLETION_REWARD = 0x1FF, // uint32, uint8, uint32, uint32, uint32, uint32, uint32, uint8, for(uint8) {uint32,uint32,uint32} + SMSG_LFG_ERROR = 0x200, // uint32 (1,2,4,6;0,5,7) CMSG_UNLEARN_SPELL = 0x201, CMSG_UNLEARN_SKILL = 0x202, SMSG_REMOVED_SPELL = 0x203, @@ -562,7 +562,7 @@ enum Opcodes CMSG_UPDATE_ACCOUNT_DATA = 0x20B, SMSG_UPDATE_ACCOUNT_DATA = 0x20C, SMSG_CLEAR_FAR_SIGHT_IMMEDIATE = 0x20D, - SMSG_POWERGAINLOG_OBSOLETE = 0x20E, + SMSG_PLAYER_DIFFICULTY_CHANGE = 0x20E, CMSG_GM_TEACH = 0x20F, CMSG_GM_CREATE_ITEM_TARGET = 0x210, CMSG_GMTICKET_GETTICKET = 0x211, @@ -578,7 +578,7 @@ enum Opcodes SMSG_GMTICKET_SYSTEMSTATUS = 0x21B, CMSG_SPIRIT_HEALER_ACTIVATE = 0x21C, CMSG_SET_STAT_CHEAT = 0x21D, - SMSG_SET_REST_START_OBSOLETE = 0x21E, + SMSG_QUEST_FORCE_REMOVE = 0x21E, // uint32 questid CMSG_SKILL_BUY_STEP = 0x21F, CMSG_SKILL_BUY_RANK = 0x220, CMSG_XP_CHEAT = 0x221, @@ -695,13 +695,13 @@ enum Opcodes CMSG_BUYBACK_ITEM = 0x290, SMSG_SERVER_MESSAGE = 0x291, CMSG_SET_SAVED_INSTANCE_EXTEND = 0x292, // lua: SetSavedInstanceExtend - SMSG_MEETINGSTONE_LEAVE = 0x293, - CMSG_MEETINGSTONE_CHEAT = 0x294, - SMSG_MEETINGSTONE_SETQUEUE = 0x295, - CMSG_MEETINGSTONE_INFO = 0x296, - SMSG_MEETINGSTONE_COMPLETE = 0x297, - SMSG_MEETINGSTONE_IN_PROGRESS = 0x298, - SMSG_MEETINGSTONE_MEMBER_ADDED = 0x299, + SMSG_LFG_OFFER_CONTINUE = 0x293, + CMSG_MEETINGSTONE_CHEAT = 0x294, // not found 3.3 + SMSG_MEETINGSTONE_SETQUEUE = 0x295, // string, showed in console + CMSG_MEETINGSTONE_INFO = 0x296, // EVENT_LFG_UPDATE + SMSG_MEETINGSTONE_COMPLETE = 0x297, // EVENT_MAIL_SHOW + SMSG_MEETINGSTONE_IN_PROGRESS = 0x298, // uint32, some UPDATE_COOLDOWN events + SMSG_MEETINGSTONE_MEMBER_ADDED = 0x299, // uint32, errors: ERR_NOT_IN_GROUP (2,51) and ERR_NOT_IN_RAID (3,39,40) CMSG_GMTICKETSYSTEM_TOGGLE = 0x29A, CMSG_CANCEL_GROWTH_AURA = 0x29B, SMSG_CANCEL_AUTO_REPEAT = 0x29C, @@ -735,7 +735,7 @@ enum Opcodes SMSG_AREA_TRIGGER_MESSAGE = 0x2B8, CMSG_SHOWING_HELM = 0x2B9, CMSG_SHOWING_CLOAK = 0x2BA, - SMSG_MEETINGSTONE_JOINFAILED = 0x2BB, + SMSG_LFG_ROLE_CHECK_RESULT = 0x2BB, SMSG_PLAYER_SKINNED = 0x2BC, SMSG_DURABILITY_DAMAGE_DEATH = 0x2BD, CMSG_SET_EXPLORATION = 0x2BE, @@ -896,29 +896,29 @@ enum Opcodes MSG_MOVE_START_ASCEND = 0x359, MSG_MOVE_STOP_ASCEND = 0x35A, SMSG_ARENA_TEAM_STATS = 0x35B, - CMSG_LFG_SET_AUTOJOIN = 0x35C, - CMSG_LFG_CLEAR_AUTOJOIN = 0x35D, - CMSG_LFM_SET_AUTOFILL = 0x35E, - CMSG_LFM_CLEAR_AUTOFILL = 0x35F, - CMSG_ACCEPT_LFG_MATCH = 0x360, - CMSG_DECLINE_LFG_MATCH = 0x361, - CMSG_CANCEL_PENDING_LFG = 0x362, - CMSG_CLEAR_LOOKING_FOR_GROUP = 0x363, - CMSG_CLEAR_LOOKING_FOR_MORE = 0x364, - CMSG_SET_LOOKING_FOR_MORE = 0x365, - CMSG_SET_LFG_COMMENT = 0x366, - SMSG_LFG_TIMEDOUT = 0x367, - SMSG_LFG_OTHER_TIMEDOUT = 0x368, - SMSG_LFG_AUTOJOIN_FAILED = 0x369, - SMSG_LFG_AUTOJOIN_FAILED_NO_PLAYER = 0x36A, - SMSG_LFG_LEADER_IS_LFM = 0x36B, - SMSG_LFG_UPDATE = 0x36C, - SMSG_LFG_UPDATE_LFM = 0x36D, - SMSG_LFG_UPDATE_LFG = 0x36E, - SMSG_LFG_UPDATE_QUEUED = 0x36F, - SMSG_LFG_PENDING_INVITE = 0x370, - SMSG_LFG_PENDING_MATCH = 0x371, - SMSG_LFG_PENDING_MATCH_DONE = 0x372, + CMSG_LFG_JOIN = 0x35C, // CMSG JoinLFG + CMSG_LFG_LEAVE = 0x35D, // CMSG LeaveLFG + CMSG_SEARCH_LFG_JOIN = 0x35E, // CMSG SearchLFGJoin + CMSG_SEARCH_LFG_LEAVE = 0x35F, // CMSG SearchLFGLeave + SMSG_UPDATE_LFG_LIST = 0x360, // SMSG uint32, uint32, if(uint8) { uint32 count, for(count) { uint64} }, uint32 count2, uint32, for(count2) { uint64, uint32 flags, if(flags & 0x2) {string}, if(flags & 0x10) {for(3) uint8}, if(flags & 0x80) {uint64, uint32}}, uint32 count3, uint32, for(count3) {uint64, uint32 flags, if(flags & 0x1) {uint8, uint8, uint8, for(3) uint8, uint32, uint32, uint32, uint32, uint32, uint32, float, float, uint32, uint32, uint32, uint32, uint32, float, uint32, uint32, uint32, uint32, uint32, uint32}, if(flags&0x2) string, if(flags&0x4) uint8, if(flags&0x8) uint64, if(flags&0x10) uint8, if(flags&0x20) uint32, if(flags&0x40) uint8, if(flags& 0x80) {uint64, uint32}} + SMSG_LFG_PROPOSAL_DECLINED = 0x361, // SMSG uint32, uint8, uint32, uint32, uint8, for(uint8) {uint32,uint8,uint8,uint8,uint8} + CMSG_LFG_PROPOSAL_RESULT = 0x362, // CMSG AcceptProposal, RejectProposal + SMSG_LFG_ROLE_CHECK = 0x363, // SMSG uint32, uint8, for(uint8) uint32, uint8, for(uint8) { uint64, uint8, uint32, uint8, } + SMSG_LFG_ROLE_CHECK_FAILED_RESULT = 0x364, // SMSG uint32 unk, uint32, if(unk==6) { uint8 count, for(count) uint64 } + SMSG_LFG_QUEUE_STATUS_UPDATE = 0x365, // SMSG uint32 dungeon, uint32 lfgtype, uint32, uint32, uint32, uint32, uint8, uint8, uint8, uint8 + CMSG_SET_LFG_COMMENT = 0x366, // CMSG SetLFGComment + SMSG_LFG_LFG_PROPOSAL_INFO = 0x367, // SMSG uint8, if(uint8) { uint8, uint8, uint8, uint8, if(uint8) for(uint8) uint32, string} + SMSG_LFG_LFG_PROPOSAL_INFO2 = 0x368, // SMSG uint8, if(uint8) { uint8, uint8, uint8, for(3) uint8, uint8, if(uint8) for(uint8) uint32, string} + SMSG_LFG_UPDATE_LIST = 0x369, // SMSG uint8 + CMSG_LFG_SET_ROLES = 0x36A, // CMSG SetLFGRoles + CMSG_LFG_SET_NEEDS = 0x36B, // CMSG SetLFGNeeds + CMSG_LFG_SET_BOOT_VOTE = 0x36C, // CMSG SetLFGBootVote + SMSG_LFG_BOOT_PROPOSAL_UPDATE = 0x36D, // SMSG uint8, uint8, uint8, uint64, uint32, uint32, uint32, uint32 + CMSG_LFD_PLAYER_LOCK_INFO_REQUEST = 0x36E, // CMSG RequestLFDPlayerLockInfo + SMSG_LFG_PLAYER_LOCK_INFO_RESPONSE = 0x36F, // SMSG uint8, for(uint8) { uint32, uint8, uint32, uint32, uint32, uint32, uint8, for(uint8) {uint32,uint32, uint32}}, uint32, for(uint32) {uint32,uint32} + CMSG_LFG_TELEPORT = 0x370, // CMSG LFGTeleport + CMSG_LFD_PARTY_LOCK_INFO_REQUEST = 0x371, // CMSG RequestLFDPartyLockInfo + SMSG_LFG_PLAYER_LOCK_INFO_UPDATE = 0x372, // SMSG uint8, for(uint8) uint64 SMSG_TITLE_EARNED = 0x373, CMSG_SET_TITLE = 0x374, CMSG_CANCEL_MOUNT_AURA = 0x375, @@ -1156,8 +1156,8 @@ enum Opcodes CMSG_FORCE_PITCH_RATE_CHANGE_ACK = 0x45D, SMSG_SPLINE_SET_PITCH_RATE = 0x45E, SMSG_MOVE_ABANDON_TRANSPORT = 0x45F, - MSG_MOVE_ABANDON_TRANSPORT = 0x460, - CMSG_MOVE_ABANDON_TRANSPORT_ACK = 0x461, + SMSG_CALENDAR_UPDATE_INVITE_LIST = 0x460, + SMSG_CALENDAR_UPDATE_INVITE_LIST2 = 0x461, CMSG_UPDATE_MISSILE_TRAJECTORY = 0x462, SMSG_UPDATE_ACCOUNT_DATA_COMPLETE = 0x463, SMSG_TRIGGER_MOVIE = 0x464, @@ -1173,7 +1173,7 @@ enum Opcodes CMSG_COMPLETE_ACHIEVEMENT_CHEAT = 0x46E, SMSG_QUESTUPDATE_ADD_PVP_KILL = 0x46F, CMSG_SET_CRITERIA_CHEAT = 0x470, - SMSG_GROUP_SWAP_FAILED = 0x471, + SMSG_CALENDAR_UPDATE_INVITE_LIST3 = 0x471, CMSG_UNITANIMTIER_CHEAT = 0x472, CMSG_CHAR_CUSTOMIZE = 0x473, SMSG_CHAR_CUSTOMIZE = 0x474, @@ -1226,7 +1226,7 @@ enum Opcodes SMSG_SERVER_BUCK_DATA_START = 0x4A3, // not found CMSG_QUERY_VEHICLE_STATUS = 0x4A4, // not found UMSG_UNKNOWN_1189 = 0x4A5, // not found, old SMSG_PET_GUIDS - SMSG_UNKNOWN_1190 = 0x4A6, // smsg unk, "You can't do that yet" + SMSG_BATTLEGROUND_INFO_THROTTLED = 0x4A6, // empty, "You can't do that yet" SMSG_PLAYER_VEHICLE_DATA = 0x4A7, // smsg guid+uint32 (vehicle) CMSG_PLAYER_VEHICLE_ENTER = 0x4A8, // cmsg uint64 CMSG_EJECT_PASSENGER = 0x4A9, // cmsg uint64 @@ -1238,16 +1238,16 @@ enum Opcodes UMSG_UNKNOWN_1199 = 0x4AF, // not found UMSG_UNKNOWN_1200 = 0x4B0, // not found UMSG_UNKNOWN_1201 = 0x4B1, // not found - SMSG_ITEM_REFUND_TIMER = 0x4B2, // refund something - CMSG_ITEM_REFUND_INFO_REQUEST = 0x4B3, // refund request? + SMSG_ITEM_REFUND_INFO_RESPONSE = 0x4B2, // refund item info + CMSG_ITEM_REFUND_INFO = 0x4B3, // refund request? CMSG_ITEM_REFUND = 0x4B4, // lua: ContainerRefundItemPurchase - SMSG_ITEM_REFUND = 0x4B5, // refund something + SMSG_ITEM_REFUND_RESULT = 0x4B5, // refund item result CMSG_CORPSE_MAP_POSITION_QUERY = 0x4B6, // CMSG, uint32 CMSG_CORPSE_MAP_POSITION_QUERY_RESPONSE = 0x4B7, // SMSG, 3*float+float - CMSG_LFG_SET_ROLES = 0x4B8, // CMSG, empty, lua: SetLFGRoles + UMSG_UNKNOWN_1208 = 0x4B8, // not found UMSG_UNKNOWN_1209 = 0x4B9, // not found - CMSG_UNKNOWN_1210 = 0x4BA, // CMSG, uint64, lua: CalendarContextEventSignUp - SMSG_UNKNOWN_1211 = 0x4BB, // SMSG, calendar related + CMSG_CALENDAR_CONTEXT_EVENT_SIGNUP = 0x4BA, // CMSG, uint64, lua: CalendarContextEventSignUp + SMSG_CALENDAR_ACTION_PENDING = 0x4BB, // SMSG, calendar related EVENT_CALENDAR_ACTION_PENDING SMSG_EQUIPMENT_SET_LIST = 0x4BC, // SMSG, equipment manager list? CMSG_EQUIPMENT_SET_SAVE = 0x4BD, // CMSG, lua: SaveEquipmentSet CMSG_UNKNOWN_1214 = 0x4BE, // CMSG, missle? @@ -1259,57 +1259,71 @@ enum Opcodes UMSG_UNKNOWN_1220 = 0x4C4, // not found 3.2 UMSG_UNKNOWN_1221 = 0x4C5, // not found 3.2 UMSG_UNKNOWN_1222 = 0x4C6, // not found 3.2 - SMSG_UNKNOWN_1223 = 0x4C7, // uint64, arena pet? 3.2 - SMSG_UNKNOWN_1224 = 0x4C8, // uint32 "Can't modify arena team while queued or in a match." 3.2 + SMSG_ARENA_OPPONENT_UPDATE = 0x4C7, // uint64, EVENT_ARENA_OPPONENT_UPDATE + SMSG_ARENA_TEAM_CHANGE_FAILED_QUEUED = 0x4C8, // uint32 "Can't modify arena team while queued or in a match." 3.2 UMSG_UNKNOWN_1225 = 0x4C9, // not found 3.2 UMSG_UNKNOWN_1226 = 0x4CA, // not found 3.2 UMSG_UNKNOWN_1227 = 0x4CB, // not found 3.2 UMSG_UNKNOWN_1228 = 0x4CC, // not found 3.2 - SMSG_UNKNOWN_1229 = 0x4CD, // SMSG, any opcode? - SMSG_UNKNOWN_1230 = 0x4CE, // SMSG, movement related - CMSG_UNKNOWN_1231_ACK = 0x4CF, // movement related - SMSG_UNKNOWN_1232 = 0x4D0, // SMSG, movement related - CMSG_UNKNOWN_1233_ACK = 0x4D1, // movement related - SMSG_UNKNOWN_1234 = 0x4D2, // SMSG, movement related - SMSG_UNKNOWN_1235 = 0x4D3, // SMSG, movement related - SMSG_UNKNOWN_1236 = 0x4D4, // SMSG, movement related + SMSG_UNKNOWN_1229 = 0x4CD, // SMSG, handles any opcode + SMSG_FORCE_UNK1_SPEED_CHANGE = 0x4CE, // SMSG, movement related + CMSG_FORCE_UNK1_SPEED_CHANGE_ACK = 0x4CF, // movement related + SMSG_FORCE_UNK2_SPEED_CHANGE = 0x4D0, // SMSG, movement related + CMSG_FORCE_UNK2_SPEED_CHANGE_ACK = 0x4D1, // movement related + MSG_MOVE_UNKNOWN_1234 = 0x4D2, // SMSG, movement related + SMSG_SPLINE_MOVE_UNKNOWN_1235 = 0x4D3, // SMSG, movement related + SMSG_SPLINE_MOVE_UNKNOWN_1236 = 0x4D4, // SMSG, movement related CMSG_EQUIPMENT_SET_USE = 0x4D5, // CMSG, lua: UseEquipmentSet SMSG_EQUIPMENT_SET_USE_RESULT = 0x4D6, // SMSG, UseEquipmentSetResult? UMSG_UNKNOWN_1239 = 0x4D7, // not found 3.2 - SMSG_UNKNOWN_1240 = 0x4D8, // SMSG, uint64, string + SMSG_UNKNOWN_1240 = 0x4D8, // SMSG, uint64, string, doing nothing CMSG_CHAR_FACTION_CHANGE = 0x4D9, // lua: CreateCharacter (PFC client response) SMSG_CHAR_FACTION_CHANGE = 0x4DA, // response to 1241 (PFC server response) UMSG_UNKNOWN_1243 = 0x4DB, // not found 3.2 UMSG_UNKNOWN_1244 = 0x4DC, // not found 3.2 UMSG_UNKNOWN_1245 = 0x4DD, // not found 3.2 - SMSG_UNKNOWN_1246 = 0x4DE, // uint32, BattlefieldMgrEntryInvite - CMSG_UNKNOWN_1247 = 0x4DF, // lua: BattlefieldMgrEntryInviteResponse - SMSG_UNKNOWN_1248 = 0x4E0, // uint32, uint8, uint8 - SMSG_UNKNOWN_1249 = 0x4E1, // uint32 BattlefieldMgrQueueInvite - CMSG_UNKNOWN_1250 = 0x4E2, // lua: BattlefieldMgrQueueInviteResponse - CMSG_UNKNOWN_1251 = 0x4E3, // lua: BattlefieldMgrQueueRequest - SMSG_UNKNOWN_1252 = 0x4E4, // uint32, uint8 queue full/can't join - SMSG_UNKNOWN_1253 = 0x4E5, // uint32 wintergrasp is full, you'll be ejected soon - SMSG_UNKNOWN_1254 = 0x4E6, // uint32, uint32, uint8 - CMSG_UNKNOWN_1255 = 0x4E7, // lua: BattlefieldMgrExitRequest - SMSG_UNKNOWN_1256 = 0x4E8, // uint32, uint32 + SMSG_BATTLEFIELD_MGR_ENTRY_INVITE = 0x4DE, // uint32, EVENT_BATTLEFIELD_MGR_ENTRY_INVITE + CMSG_BATTLEFIELD_MGR_ENTRY_INVITE_RESPONSE = 0x4DF, // lua: BattlefieldMgrEntryInviteResponse + SMSG_BATTLEFIELD_MGR_ENTERED = 0x4E0, // uint32, uint8, uint8 EVENT_BATTLEFIELD_MGR_ENTERED + SMSG_BATTLEFIELD_MGR_QUEUE_INVITE = 0x4E1, // uint32 EVENT_BATTLEFIELD_MGR_QUEUE_INVITE + CMSG_BATTLEFIELD_MGR_QUEUE_INVITE_RESPONSE = 0x4E2, // lua: BattlefieldMgrQueueInviteResponse + CMSG_BATTLEFIELD_MGR_QUEUE_REQUEST = 0x4E3, // lua: BattlefieldMgrQueueRequest + SMSG_BATTLEFIELD_MGR_QUEUE_REQUEST_RESPONSE = 0x4E4, // uint32, uint8 EVENT_BATTLEFIELD_MGR_QUEUE_REQUEST_RESPONSE + SMSG_BATTLEFIELD_MGR_EJECT_PENDING = 0x4E5, // uint32 EVENT_BATTLEFIELD_MGR_EJECT_PENDING + SMSG_BATTLEFIELD_MGR_EJECTED = 0x4E6, // uint32, uint32, uint8 EVENT_BATTLEFIELD_MGR_EJECTED + CMSG_BATTLEFIELD_MGR_EXIT_REQUEST = 0x4E7, // lua: BattlefieldMgrExitRequest + SMSG_BATTLEFIELD_MGR_STATE_CHANGE = 0x4E8, // uint32, uint32 EVENT_BATTLEFIELD_MGR_STATE_CHANGE UMSG_UNKNOWN_1257 = 0x4E9, // not found 3.2 UMSG_UNKNOWN_1258 = 0x4EA, // not found 3.2 MSG_SET_RAID_DIFFICULTY = 0x4EB, // lua: SetRaidDifficulty UMSG_UNKNOWN_1260 = 0x4EC, // not found 3.2 SMSG_TOGGLE_XP_GAIN = 0x4ED, // enable/disable XP gain console message - SMSG_UNKNOWN_1262 = 0x4EE, - SMSG_UNKNOWN_1263 = 0x4EF, - CMSG_UNKNOWN_1264 = 0x4F0, // lua: GMResponseResolve - SMSG_UNKNOWN_1265 = 0x4F1, + SMSG_GMRESPONSE_DB_ERROR = 0x4EE, // empty + SMSG_GMRESPONSE_RECEIVED = 0x4EF, // uint32, uint32, string[2000], string[4000][4] + CMSG_GMRESPONSE_RESOLVE = 0x4F0, // lua: GMResponseResolve + SMSG_GMRESPONSE_STATUS_UPDATE = 0x4F1, // uint8 (1 - EVENT_GMSURVEY_DISPLAY, 0 - EVENT_UPDATE_TICKET) UMSG_UNKNOWN_1266 = 0x4F2, // not found 3.2 UMSG_UNKNOWN_1267 = 0x4F3, // not found 3.2 UMSG_UNKNOWN_1268 = 0x4F4, // not found 3.2 UMSG_UNKNOWN_1269 = 0x4F5, // not found 3.2 CMSG_WORLD_STATE_UI_TIMER_UPDATE = 0x4F6, SMSG_WORLD_STATE_UI_TIMER_UPDATE = 0x4F7, - CMSG_UNKNOWN_1272 = 0x4F8, // called from lua: CreateCharacter, paid race change - NUM_MSG_TYPES = 0x4F9 + CMSG_CHAR_RACE_CHANGE = 0x4F8, // called from lua: CreateCharacter, paid race change + UMSG_UNKNOWN_1273 = 0x4F9, // not found 10554 + SMSG_TALENTS_INVOLUNTARILY_RESET = 0x4FA, // uint8 EVENT_TALENTS_INVOLUNTARILY_RESET + UMSG_UNKNOWN_1275 = 0x4FB, // not found 10554 + SMSG_UNKNOWN_1276 = 0x4FC, // does nothing in 10554 + SMSG_LOOT_SLOT_CHANGED = 0x4FD, // EVENT_LOOT_SLOT_CHANGED + UMSG_UNKNOWN_1278 = 0x4FE, // not found 10596 + CMSG_READY_FOR_ACCOUNT_DATA_TIMES = 0x4FF, // lua: ReadyForAccountDataTimes + CMSG_QUERY_QUESTS_COMPLETED = 0x500, // lua: QueryQuestsCompleted + SMSG_QUERY_QUESTS_COMPLETED_RESPONSE = 0x501, // response to 0x500 + CMSG_GM_REPORT_LAG = 0x502, // lua: GMReportLag + UMSG_UNKNOWN_1283 = 0x503, + UMSG_UNKNOWN_1284 = 0x504, + UMSG_UNKNOWN_1285 = 0x505, + UMSG_UNKNOWN_1286 = 0x506, + NUM_MSG_TYPES = 0x507 }; /// Player state diff --git a/src/game/Pet.cpp b/src/game/Pet.cpp index 5bb5be55908..981f864136c 100644 --- a/src/game/Pet.cpp +++ b/src/game/Pet.cpp @@ -40,7 +40,7 @@ char const* petTypeSuffix[MAX_PET_TYPE] = "'s Companion" // MINI_PET }; -#define PET_XP_FACTOR 0.1f +#define PET_XP_FACTOR 0.05f Pet::Pet(Player *owner, PetType type) : Guardian(NULL, owner), m_petType(type), m_removed(false), m_happinessTimer(7500), m_duration(0), @@ -215,7 +215,7 @@ bool Pet::LoadPetFromDB( Player* owner, uint32 petentry, uint32 petnumber, bool case HUNTER_PET: SetUInt32Value(UNIT_FIELD_BYTES_0, 0x02020100); //class=warrior,gender=none,power=focus SetSheath(SHEATH_STATE_MELEE); - SetByteValue(UNIT_FIELD_BYTES_2, 2, fields[9].GetBool() ? UNIT_RENAME_NOT_ALLOWED : UNIT_RENAME_ALLOWED); + SetByteFlag(UNIT_FIELD_BYTES_2, 2, fields[9].GetBool() ? UNIT_CAN_BE_ABANDONED : UNIT_CAN_BE_RENAMED | UNIT_CAN_BE_ABANDONED); SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE); // this enables popup window (pet abandon, cancel) @@ -420,7 +420,7 @@ void Pet::SavePetToDB(PetSaveMode mode) << uint32(GetReactState()) << ", " << uint32(mode) << ", '" << name.c_str() << "', " - << uint32((GetByteValue(UNIT_FIELD_BYTES_2, 2) == UNIT_RENAME_ALLOWED)?0:1) << ", " + << uint32(HasByteFlag(UNIT_FIELD_BYTES_2, 2, UNIT_CAN_BE_RENAMED) ? 0 : 1) << ", " << curhealth << ", " << curmana << ", " << GetPower(POWER_HAPPINESS) << ", '"; @@ -785,7 +785,7 @@ bool Pet::CreateBaseAtCreature(Creature* creature) { SetUInt32Value(UNIT_FIELD_BYTES_0, 0x02020100); SetSheath(SHEATH_STATE_MELEE); - SetByteValue(UNIT_FIELD_BYTES_2, 2, UNIT_RENAME_ALLOWED); + SetByteFlag(UNIT_FIELD_BYTES_2, 2, UNIT_CAN_BE_RENAMED | UNIT_CAN_BE_ABANDONED); SetUInt32Value(UNIT_MOD_CAST_SPEED, creature->GetUInt32Value(UNIT_MOD_CAST_SPEED)); } return true; @@ -1949,7 +1949,7 @@ void Pet::SynchronizeLevelWithOwner() if (getLevel() > owner->getLevel()) { GivePetLevel(owner->getLevel()); - SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, objmgr.GetXPForLevel(owner->getLevel())/4); + SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, objmgr.GetXPForLevel(owner->getLevel())/5); SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, GetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP)-1); } break; diff --git a/src/game/PetHandler.cpp b/src/game/PetHandler.cpp index 11d03ffb13d..f6d6cf3e2da 100644 --- a/src/game/PetHandler.cpp +++ b/src/game/PetHandler.cpp @@ -515,7 +515,7 @@ void WorldSession::HandlePetRename( WorldPacket & recv_data ) Pet* pet = ObjectAccessor::GetPet(petguid); // check it! if( !pet || !pet->isPet() || ((Pet*)pet)->getPetType()!= HUNTER_PET || - pet->GetByteValue(UNIT_FIELD_BYTES_2, 2) != UNIT_RENAME_ALLOWED || + !pet->HasByteFlag(UNIT_FIELD_BYTES_2, 2, UNIT_CAN_BE_RENAMED) || pet->GetOwnerGUID() != _player->GetGUID() || !pet->GetCharmInfo() ) return; @@ -538,7 +538,7 @@ void WorldSession::HandlePetRename( WorldPacket & recv_data ) if(owner && (owner->GetTypeId() == TYPEID_PLAYER) && ((Player*)owner)->GetGroup()) ((Player*)owner)->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_PET_NAME); - pet->SetByteValue(UNIT_FIELD_BYTES_2, 2, UNIT_RENAME_NOT_ALLOWED); + pet->RemoveByteFlag(UNIT_FIELD_BYTES_2, 2, UNIT_CAN_BE_RENAMED); if(isdeclined) { diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 985908dff0a..46906a03e94 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -758,16 +758,10 @@ bool Player::Create( uint32 guidlow, const std::string& name, uint8 race, uint8 uint32 item_id = oEntry->ItemId[j]; - // Hack for not existed item id in dbc 3.0.3 - if(item_id==40582) - continue; - + // just skip, reported in ObjectMgr::LoadItemPrototypes ItemPrototype const* iProto = objmgr.GetItemPrototype(item_id); - if(!iProto) - { - sLog.outErrorDb("Initial item id %u (race %u class %u) from CharStartOutfit.dbc not listed in `item_template`, ignoring.",item_id,getRace(),getClass()); + if (!iProto) continue; - } // BuyCount by default uint32 count = iProto->BuyCount; @@ -787,6 +781,11 @@ bool Player::Create( uint32 guidlow, const std::string& name, uint8 race, uint8 if(iProto->Stackable < count) count = iProto->Stackable; } + // special amount for daggers + else if(iProto->Class==ITEM_CLASS_WEAPON && iProto->SubClass==ITEM_SUBCLASS_WEAPON_DAGGER) + { + count = 2; // will placed to 2 slots + } StoreNewItemInBestSlots(item_id, count); } @@ -1539,7 +1538,8 @@ bool Player::BuildEnumData( QueryResult_AutoPtr result, WorldPacket * p_data ) *p_data << uint32(char_flags); // character flags // character customize flags *p_data << uint32(atLoginFlags & AT_LOGIN_CUSTOMIZE ? CHAR_CUSTOMIZE_FLAG_CUSTOMIZE : CHAR_CUSTOMIZE_FLAG_NONE); - *p_data << uint8(1); // unknown + // First login + *p_data << uint8(atLoginFlags & AT_LOGIN_FIRST ? 1 : 0); // Pets info { @@ -2074,6 +2074,10 @@ void Player::Regenerate(Powers power) { bool recentCast = IsUnderLastManaUseEffect(); float ManaIncreaseRate = sWorld.getRate(RATE_POWER_MANA); + + if (getLevel() < 15) + ManaIncreaseRate = sWorld.getRate(RATE_POWER_MANA) * (2.066f - (getLevel() * 0.066f)); + if (recentCast) // Trinity Updates Mana in intervals of 2s, which is correct addvalue += GetFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER) * ManaIncreaseRate * 0.001f * m_regenTimer; else @@ -2175,6 +2179,9 @@ void Player::RegenerateHealth() float HealthIncreaseRate = sWorld.getRate(RATE_HEALTH); + if (getLevel() < 15) + HealthIncreaseRate = sWorld.getRate(RATE_HEALTH) * (2.066f - (getLevel() * 0.066f)); + float addvalue = 0.0f; // polymorphed case @@ -2497,7 +2504,7 @@ void Player::GiveXP(uint32 xp, Unit* victim) return; // XP resting bonus for kill - uint32 rested_bonus_xp = victim ? GetXPRestBonus(xp) : 0; + uint32 rested_bonus_xp = victim ? GetXPRestBonus(xp) : 0; // Heirloom Experience Bonus float heirloomModifier = 1.0f; @@ -3991,7 +3998,7 @@ void Player::InitVisibleBits() updateVisualBits.SetBit(UNIT_NPC_FLAGS); // PLAYER_QUEST_LOG_x also visible bit on official (but only on party/raid)... - for (uint16 i = PLAYER_QUEST_LOG_1_1; i < PLAYER_QUEST_LOG_25_2; i += 4) + for (uint16 i = PLAYER_QUEST_LOG_1_1; i < PLAYER_QUEST_LOG_25_2; i += MAX_QUEST_OFFSET) updateVisualBits.SetBit(i); // Players visible items are not inventory stuff @@ -4100,7 +4107,7 @@ TrainerSpellState Player::GetTrainerSpellState(TrainerSpell const* trainer_spell { if (!trainer_spell->learnedSpell[i]) continue; - + if(!HasSpell(trainer_spell->learnedSpell[i])) { hasSpell = false; @@ -6294,13 +6301,38 @@ void Player::RewardReputation(Quest const *pQuest) // quest reputation reward/loss for (uint8 i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) { - if(pQuest->RewRepFaction[i] && pQuest->RewRepValue[i] ) + if (!pQuest->RewRepFaction[i]) + continue; + if (pQuest->RewRepValue[i]) { int32 rep = CalculateReputationGain(GetQuestLevel(pQuest), pQuest->RewRepValue[i], pQuest->RewRepFaction[i], true); - FactionEntry const* factionEntry = sFactionStore.LookupEntry(pQuest->RewRepFaction[i]); - if(factionEntry) + if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(pQuest->RewRepFaction[i])) GetReputationMgr().ModifyReputation(factionEntry, rep); } + else + { + uint32 row = 1; + int32 field = 0; + + if (pQuest->RewRepValueId[i] < 0) + { + ++row; + field = abs(pQuest->RewRepValueId[i]); + } + else + field = pQuest->RewRepValueId[i]; + if (const QuestFactionRewEntry *pRow = sQuestFactionRewardStore.LookupEntry(row)) + { + int32 repPoints = pRow->QuestRewFactionValue[field]; + + if (!repPoints) + continue; + + repPoints = CalculateReputationGain(GetQuestLevel(pQuest), repPoints, pQuest->RewRepFaction[i], true); + if (const FactionEntry* factionEntry = sFactionStore.LookupEntry(pQuest->RewRepFaction[i])) + GetReputationMgr().ModifyReputation(factionEntry, repPoints); + } + } } // TODO: implement reputation spillover @@ -6817,7 +6849,7 @@ void Player::DuelComplete(DuelCompleteType type) duel->opponent->AttackStop(); } break; - case DUEL_WON: + case DUEL_WON: GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL, 1); if (duel->opponent) { @@ -6895,37 +6927,32 @@ void Player::_ApplyItemMods(Item *item, uint8 slot,bool apply) if (!proto) return; - // not apply mods for broken item - if (item->IsBroken()) - { - if (proto->Socket[0].Color) - CorrectMetaGemEnchants(slot, apply); + if (proto->Socket[0].Color) //only (un)equipping of items with sockets can influence metagems, so no need to waste time with normal items + CorrectMetaGemEnchants(slot, apply); + // not apply/remove mods for broken item + if (item->IsBroken()) return; - } sLog.outDetail("applying mods for item %u ",item->GetGUIDLow()); uint8 attacktype = Player::GetAttackBySlot(slot); - //check disarm only on mod apply to allow remove item mods + // check disarm only on mod apply to allow remove item mods if (!CanUseAttackType(attacktype) ) return; - if(attacktype < MAX_ATTACK) + if (attacktype < MAX_ATTACK) _ApplyWeaponDependentAuraMods(item,WeaponAttackType(attacktype),apply); _ApplyItemBonuses(proto,slot,apply); - if( slot==EQUIPMENT_SLOT_RANGED ) + if (slot==EQUIPMENT_SLOT_RANGED) _ApplyAmmoBonuses(); ApplyItemEquipSpell(item,apply); ApplyEnchantment(item, apply); - if(proto->Socket[0].Color) //only (un)equipping of items with sockets can influence metagems, so no need to waste time with normal items - CorrectMetaGemEnchants(slot, apply); - sLog.outDebug("_ApplyItemMods complete."); } @@ -7095,9 +7122,9 @@ void Player::_ApplyItemBonuses(ItemPrototype const *proto, uint8 slot, bool appl case ITEM_MOD_RANGED_ATTACK_POWER: HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, float(val), apply); break; - case ITEM_MOD_FERAL_ATTACK_POWER: - ApplyFeralAPBonus(int32(val), apply); - break; +// case ITEM_MOD_FERAL_ATTACK_POWER: +// ApplyFeralAPBonus(int32(val), apply); +// break; case ITEM_MOD_MANA_REGENERATION: ApplyManaRegenBonus(int32(val), apply); break; @@ -8686,40 +8713,39 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid) break; case 3703: // Shattrath City case 4384: // SA - /*if (bg && bg->GetTypeID() == BATTLEGROUND_SA) - bg->FillInitialWorldStates(data); + if (bg && bg->GetTypeID() == BATTLEGROUND_SA) + bg->FillInitialWorldStates(data); else - {*/ + { // 1-3 A defend, 4-6 H defend, 7-9 unk defend, 1 - ok, 2 - half destroyed, 3 - destroyed - data << uint32(0xf09) << uint32(0x4); // 7 3849 Gate of Temple - data << uint32(0xe36) << uint32(0x4); // 8 3638 Gate of Yellow Moon - data << uint32(0xe27) << uint32(0x4); // 9 3623 Gate of Green Emerald - data << uint32(0xe24) << uint32(0x4); // 10 3620 Gate of Blue Sapphire - data << uint32(0xe21) << uint32(0x4); // 11 3617 Gate of Red Sun - data << uint32(0xe1e) << uint32(0x4); // 12 3614 Gate of Purple Ametyst + data << uint32(0xf09) << uint32(0x0); // 7 3849 Gate of Temple + data << uint32(0xe36) << uint32(0x0); // 8 3638 Gate of Yellow Moon + data << uint32(0xe27) << uint32(0x0); // 9 3623 Gate of Green Emerald + data << uint32(0xe24) << uint32(0x0); // 10 3620 Gate of Blue Sapphire + data << uint32(0xe21) << uint32(0x0); // 11 3617 Gate of Red Sun + data << uint32(0xe1e) << uint32(0x0); // 12 3614 Gate of Purple Ametyst data << uint32(0xdf3) << uint32(0x0); // 13 3571 bonus timer (1 - on, 0 - off) data << uint32(0xded) << uint32(0x0); // 14 3565 Horde Attacker - data << uint32(0xdec) << uint32(0x1); // 15 3564 Alliance Attacker + data << uint32(0xdec) << uint32(0x0); // 15 3564 Alliance Attacker // End Round (timer), better explain this by example, eg. ends in 19:59 -> A:BC - data << uint32(0xde9) << uint32(0x9); // 16 3561 C - data << uint32(0xde8) << uint32(0x5); // 17 3560 B - data << uint32(0xde7) << uint32(0x19); // 18 3559 A - data << uint32(0xe35) << uint32(0x1); // 19 3637 East g - Horde control - data << uint32(0xe34) << uint32(0x1); // 20 3636 West g - Horde control - data << uint32(0xe33) << uint32(0x1); // 21 3635 South g - Horde control + data << uint32(0xde9) << uint32(0x0); // 16 3561 C + data << uint32(0xde8) << uint32(0x0); // 17 3560 B + data << uint32(0xde7) << uint32(0x0); // 18 3559 A + data << uint32(0xe35) << uint32(0x0); // 19 3637 East g - Horde control + data << uint32(0xe34) << uint32(0x0); // 20 3636 West g - Horde control + data << uint32(0xe33) << uint32(0x0); // 21 3635 South g - Horde control data << uint32(0xe32) << uint32(0x0); // 22 3634 East g - Alliance control data << uint32(0xe31) << uint32(0x0); // 23 3633 West g - Alliance control data << uint32(0xe30) << uint32(0x0); // 24 3632 South g - Alliance control - data << uint32(0xe2f) << uint32(0x1); // 25 3631 Chamber of Ancients - Horde control + data << uint32(0xe2f) << uint32(0x0); // 25 3631 Chamber of Ancients - Horde control data << uint32(0xe2e) << uint32(0x0); // 26 3630 Chamber of Ancients - Alliance control data << uint32(0xe2d) << uint32(0x0); // 27 3629 Beach1 - Horde control data << uint32(0xe2c) << uint32(0x0); // 28 3628 Beach2 - Horde control - data << uint32(0xe2b) << uint32(0x1); // 29 3627 Beach1 - Alliance control - data << uint32(0xe2a) << uint32(0x1); // 30 3626 Beach2 - Alliance control + data << uint32(0xe2b) << uint32(0x0); // 29 3627 Beach1 - Alliance control + data << uint32(0xe2a) << uint32(0x0); // 30 3626 Beach2 - Alliance control // and many unks... - //} - break; + } break; case 4406: // Ring of Valor if (bg && bg->GetTypeID() == BATTLEGROUND_RV) @@ -9584,7 +9610,7 @@ uint8 Player::_CanTakeMoreSimilarItems(uint32 entry, uint32 count, Item* pItem, if (curcount + count > limitEntry->maxCount) { if (no_space_count) - *no_space_count = count + curcount - limitEntry->maxCount; + *no_space_count = count + curcount - limitEntry->maxCount; return EQUIP_ERR_CANT_CARRY_MORE_OF_THIS; // attempt add too many limit category items } } @@ -10692,6 +10718,12 @@ uint8 Player::CanBankItem( uint8 bag, uint8 slot, ItemPosCountVec &dest, Item *p if (!pItem) return swap ? EQUIP_ERR_ITEMS_CANT_BE_SWAPPED : EQUIP_ERR_ITEM_NOT_FOUND; + if (pItem->m_lootGenerated) + { + GetSession()->DoLootRelease(GetLootGUID()); + return EQUIP_ERR_OK; + } + uint32 count = pItem->GetCount(); sLog.outDebug( "STORAGE: CanBankItem bag = %u, slot = %u, item = %u, count = %u", bag, slot, pItem->GetEntry(), pItem->GetCount()); @@ -10887,7 +10919,28 @@ uint8 Player::CanUseItem( Item *pItem, bool not_loading ) const if (pItem->GetSkill() != 0) { - if (GetSkillValue( pItem->GetSkill() ) == 0) + bool allowEquip = false; + uint32 itemSkill = pItem->GetSkill(); + // Armor that is binded to account can "morph" from plate to mail, etc. if skill is not learned yet. + if (pProto->Quality == ITEM_QUALITY_HEIRLOOM && pProto->Class == ITEM_CLASS_ARMOR && !HasSkill(itemSkill)) + { + // TODO: when you right-click already equipped item it throws EQUIP_ERR_NO_REQUIRED_PROFICIENCY. + + // In fact it's a visual bug, everything works properly... I need sniffs of operations with + // binded to account items from off server. + + switch (this->getClass()) + { + case CLASS_HUNTER: + case CLASS_SHAMAN: + allowEquip = (itemSkill == SKILL_MAIL); + break; + case CLASS_PALADIN: + allowEquip = (itemSkill == SKILL_PLATE_MAIL); + break; + } + } + if (!allowEquip && GetSkillValue(itemSkill) == 0) return EQUIP_ERR_NO_REQUIRED_PROFICIENCY; } @@ -12131,7 +12184,7 @@ void Player::SwapItem( uint16 src, uint16 dst ) // bag swap (with items exchange) case if(emptyBag && fullBag) { - ItemPrototype const* emotyProto = emptyBag->GetProto(); + ItemPrototype const* emptyProto = emptyBag->GetProto(); uint32 count = 0; @@ -12142,7 +12195,7 @@ void Player::SwapItem( uint16 src, uint16 dst ) continue; ItemPrototype const* bagItemProto = bagItem->GetProto(); - if (!bagItemProto || !ItemCanGoIntoBag(bagItemProto, emotyProto)) + if (!bagItemProto || !ItemCanGoIntoBag(bagItemProto, emptyProto)) { // one from items not go to empty target bag SendEquipError( EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG, pSrcItem, pDstItem ); @@ -12196,6 +12249,46 @@ void Player::SwapItem( uint16 src, uint16 dst ) else if (IsEquipmentPos(src)) EquipItem(eDest2, pDstItem, true); + // if player is moving bags and is looting an item inside this bag + // release the loot + if (GetLootGUID()) + { + bool released = false; + if (IsBagPos(src)) + { + Bag* bag = (Bag*)pSrcItem; + for(int i=0; i < bag->GetBagSize(); ++i) + { + if (Item *bagItem = bag->GetItemByPos(i)) + { + if (bagItem->m_lootGenerated) + { + m_session->DoLootRelease(GetLootGUID()); + released = true; // so we don't need to look at dstBag + break; + } + } + } + } + + if (!released && IsBagPos(dst) && pDstItem) + { + Bag* bag = (Bag*)pDstItem; + for(int i=0; i < bag->GetBagSize(); ++i) + { + if (Item *bagItem = bag->GetItemByPos(i)) + { + if (bagItem->m_lootGenerated) + { + m_session->DoLootRelease(GetLootGUID()); + released = true; // not realy needed here + break; + } + } + } + } + } + AutoUnequipOffhandIfNeed(); } @@ -12792,8 +12885,8 @@ void Player::ApplyEnchantment(Item *item, EnchantmentSlot slot, bool apply, bool HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, float(enchant_amount), apply); sLog.outDebug("+ %u RANGED_ATTACK_POWER", enchant_amount); break; - case ITEM_MOD_FERAL_ATTACK_POWER: - ((Player*)this)->ApplyFeralAPBonus(enchant_amount, apply); +// case ITEM_MOD_FERAL_ATTACK_POWER: +// ((Player*)this)->ApplyFeralAPBonus(enchant_amount, apply); sLog.outDebug("+ %u FERAL_ATTACK_POWER", enchant_amount); break; case ITEM_MOD_MANA_REGENERATION: @@ -15038,6 +15131,7 @@ void Player::SendQuestReward( Quest const *pQuest, uint32 XP, Object * questGive data << uint32(10*Trinity::Honor::hk_honor_at_level(getLevel(), pQuest->GetRewHonorableKills())); data << uint32(pQuest->GetBonusTalents()); // bonus talents + data << uint32(0); GetSession()->SendPacket( &data ); if (pQuest->GetQuestCompleteScript() != 0) @@ -15125,7 +15219,7 @@ void Player::SendQuestUpdateAddItem( Quest const* pQuest, uint32 item_idx, uint3 void Player::SendQuestUpdateAddCreatureOrGo( Quest const* pQuest, uint64 guid, uint32 creatureOrGO_idx, uint32 old_count, uint32 add_count ) { - assert(old_count + add_count < 256 && "mob/GO count store in 8 bits 2^8 = 256 (0..256)"); + assert(old_count + add_count < 65536 && "mob/GO count store in 16 bits 2^16 = 65536 (0..65536)"); int32 entry = pQuest->ReqCreatureOrGOId[ creatureOrGO_idx ]; if (entry < 0) @@ -15631,13 +15725,16 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder ) m_taxi.ClearTaxiDestinations(); } - if(uint32 node_id = m_taxi.GetTaxiSource()) + if (uint32 node_id = m_taxi.GetTaxiSource()) { // save source node as recall coord to prevent recall and fall from sky TaxiNodesEntry const* nodeEntry = sTaxiNodesStore.LookupEntry(node_id); - assert(nodeEntry); // checked in m_taxi.LoadTaxiDestinationsFromString - mapId = nodeEntry->map_id; - Relocate(nodeEntry->x, nodeEntry->y, nodeEntry->z,0.0f); + if (nodeEntry && nodeEntry->map_id == GetMapId()) + { + assert(nodeEntry); // checked in m_taxi.LoadTaxiDestinationsFromString + mapId = nodeEntry->map_id; + Relocate(nodeEntry->x, nodeEntry->y, nodeEntry->z,0.0f); + } // flight will started later } @@ -17209,7 +17306,7 @@ void Player::_SaveAuras() CharacterDatabase.PExecute("INSERT INTO character_aura (guid,caster_guid,spell,effect_mask,recalculate_mask,stackcount,amount0,amount1,amount2,base_amount0,base_amount1,base_amount2,maxduration,remaintime,remaincharges) " "VALUES ('%u', '" UI64FMTD "', '%u', '%u', '%u', '%u', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%u')", - GetGUIDLow(), itr->second->GetCasterGUID(), itr->second->GetId(), effMask, recalculateMask, + GetGUIDLow(), itr->second->GetCasterGUID(), itr->second->GetId(), effMask, recalculateMask, itr->second->GetStackAmount(), damage[0], damage[1], damage[2], baseDamage[0], baseDamage[1], baseDamage[2], itr->second->GetMaxDuration(), itr->second->GetDuration(),itr->second->GetCharges()); } @@ -17980,7 +18077,7 @@ void Player::Whisper(const std::string& text, uint32 language,uint64 receiver) if (language != LANG_ADDON) { data.Initialize(SMSG_MESSAGECHAT, 200); - rPlayer->BuildPlayerChat(&data, CHAT_MSG_REPLY, text, language); + rPlayer->BuildPlayerChat(&data, CHAT_MSG_WHISPER_INFORM, text, language); GetSession()->SendPacket(&data); } } @@ -19197,6 +19294,7 @@ void Player::UpdateHomebindTime(uint32 time) if (time >= m_HomebindTimer) { // teleport to nearest graveyard + SetPhaseMask(1,true); RepopAtGraveyard(); } else @@ -19212,6 +19310,7 @@ void Player::UpdateHomebindTime(uint32 time) data << uint32(1); GetSession()->SendPacket(&data); sLog.outDebug("PLAYER: Player '%s' (GUID: %u) will be teleported to homebind in 60 seconds", GetName(),GetGUIDLow()); + SetPhaseMask(2,true); } } diff --git a/src/game/Player.h b/src/game/Player.h index 5ea84581735..4236b3a29c0 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -336,7 +336,8 @@ enum LfgType LFG_TYPE_RAID = 2, LFG_TYPE_QUEST = 3, LFG_TYPE_ZONE = 4, - LFG_TYPE_HEROIC_DUNGEON = 5 + LFG_TYPE_HEROIC_DUNGEON = 5, + LFG_TYPE_RANDOM_DUNGEON = 6 }; enum LfgRoles @@ -431,7 +432,7 @@ enum PlayerFlags PLAYER_FLAGS_UNK13 = 0x00001000, // played long time PLAYER_FLAGS_UNK14 = 0x00002000, // played too long time PLAYER_FLAGS_UNK15 = 0x00004000, - PLAYER_FLAGS_UNK16 = 0x00008000, // strange visual effect (2.0.1), looks like PLAYER_FLAGS_GHOST flag + PLAYER_FLAGS_DEVELOPER = 0x00008000, // <Dev> prefix for something? PLAYER_FLAGS_UNK17 = 0x00010000, // pre-3.0.3 PLAYER_FLAGS_SANCTUARY flag for player entered sanctuary PLAYER_FLAGS_UNK18 = 0x00020000, // taxi benchmark mode (on/off) (2.0.1) PLAYER_FLAGS_PVP_TIMER = 0x00040000, // 3.0.2, pvp timer active (after you disable pvp manually) @@ -556,6 +557,7 @@ enum AtLoginFlags AT_LOGIN_RESET_TALENTS = 0x04, AT_LOGIN_CUSTOMIZE = 0x08, AT_LOGIN_RESET_PET_TALENTS = 0x10, + AT_LOGIN_FIRST = 0x20, }; typedef std::map<uint32, QuestStatusData> QuestStatusMap; @@ -568,7 +570,7 @@ enum QuestSlotOffsets QUEST_TIME_OFFSET = 3 }; -#define MAX_QUEST_OFFSET 4 +#define MAX_QUEST_OFFSET 5 enum QuestSlotStateMask { @@ -848,7 +850,7 @@ enum PlayerDelayedOperations DELAYED_RESURRECT_PLAYER = 0x02, DELAYED_SPELL_CAST_DESERTER = 0x04, DELAYED_BG_MOUNT_RESTORE = 0x08, ///< Flag to restore mount state after teleport from BG - DELAYED_BG_TAXI_RESTORE = 0x10, ///< Flag to restore taxi state after teleport from BG + DELAYED_BG_TAXI_RESTORE = 0x10, ///< Flag to restore taxi state after teleport from BG DELAYED_END }; @@ -1306,31 +1308,37 @@ class Player : public Unit, public GridObject<Player> void ResetDailyQuestStatus(); uint16 FindQuestSlot( uint32 quest_id ) const; - uint32 GetQuestSlotQuestId(uint16 slot) const { return GetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot*MAX_QUEST_OFFSET + QUEST_ID_OFFSET); } - uint32 GetQuestSlotState(uint16 slot) const { return GetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot*MAX_QUEST_OFFSET + QUEST_STATE_OFFSET); } - uint32 GetQuestSlotCounters(uint16 slot)const { return GetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot*MAX_QUEST_OFFSET + QUEST_COUNTS_OFFSET); } - uint8 GetQuestSlotCounter(uint16 slot,uint8 counter) const { return GetByteValue(PLAYER_QUEST_LOG_1_1 + slot*MAX_QUEST_OFFSET + QUEST_COUNTS_OFFSET,counter); } - uint32 GetQuestSlotTime(uint16 slot) const { return GetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot*MAX_QUEST_OFFSET + QUEST_TIME_OFFSET); } - void SetQuestSlot(uint16 slot,uint32 quest_id, uint32 timer = 0) + uint32 GetQuestSlotQuestId(uint16 slot) const { return GetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_ID_OFFSET); } + uint32 GetQuestSlotState(uint16 slot) const { return GetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_STATE_OFFSET); } + uint16 GetQuestSlotCounter(uint16 slot, uint8 counter) const { return (uint16)(GetUInt64Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_COUNTS_OFFSET) >> (counter * 16)); } + uint32 GetQuestSlotTime(uint16 slot) const { return GetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_TIME_OFFSET); } + void SetQuestSlot(uint16 slot, uint32 quest_id, uint32 timer = 0) { - SetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot*MAX_QUEST_OFFSET + QUEST_ID_OFFSET,quest_id); - SetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot*MAX_QUEST_OFFSET + QUEST_STATE_OFFSET,0); - SetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot*MAX_QUEST_OFFSET + QUEST_COUNTS_OFFSET,0); - SetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot*MAX_QUEST_OFFSET + QUEST_TIME_OFFSET,timer); + SetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_ID_OFFSET, quest_id); + SetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_STATE_OFFSET, 0); + SetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_COUNTS_OFFSET, 0); + SetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_COUNTS_OFFSET + 1, 0); + SetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_TIME_OFFSET, timer); } - void SetQuestSlotCounter(uint16 slot,uint8 counter,uint8 count) { SetByteValue(PLAYER_QUEST_LOG_1_1 + slot*MAX_QUEST_OFFSET + QUEST_COUNTS_OFFSET,counter,count); } - void SetQuestSlotState(uint16 slot,uint32 state) { SetFlag(PLAYER_QUEST_LOG_1_1 + slot*MAX_QUEST_OFFSET + QUEST_STATE_OFFSET,state); } - void RemoveQuestSlotState(uint16 slot,uint32 state) { RemoveFlag(PLAYER_QUEST_LOG_1_1 + slot*MAX_QUEST_OFFSET + QUEST_STATE_OFFSET,state); } - void SetQuestSlotTimer(uint16 slot,uint32 timer) { SetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot*MAX_QUEST_OFFSET + QUEST_TIME_OFFSET,timer); } - void SwapQuestSlot(uint16 slot1,uint16 slot2) + void SetQuestSlotCounter(uint16 slot, uint8 counter, uint16 count) { - for (uint8 i = 0; i < MAX_QUEST_OFFSET ; ++i ) + uint64 val = GetUInt64Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_COUNTS_OFFSET); + val &= ~((uint64)0xFFFF << (counter * 16)); + val |= ((uint64)count << (counter * 16)); + SetUInt64Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_COUNTS_OFFSET, val); + } + void SetQuestSlotState(uint16 slot, uint32 state) { SetFlag(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_STATE_OFFSET, state); } + void RemoveQuestSlotState(uint16 slot, uint32 state) { RemoveFlag(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_STATE_OFFSET, state); } + void SetQuestSlotTimer(uint16 slot, uint32 timer) { SetUInt32Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_TIME_OFFSET, timer); } + void SwapQuestSlot(uint16 slot1, uint16 slot2) + { + for (int i = 0; i < MAX_QUEST_OFFSET; ++i) { - uint32 temp1 = GetUInt32Value(PLAYER_QUEST_LOG_1_1 + MAX_QUEST_OFFSET *slot1 + i); - uint32 temp2 = GetUInt32Value(PLAYER_QUEST_LOG_1_1 + MAX_QUEST_OFFSET *slot2 + i); + uint32 temp1 = GetUInt32Value(PLAYER_QUEST_LOG_1_1 + MAX_QUEST_OFFSET * slot1 + i); + uint32 temp2 = GetUInt32Value(PLAYER_QUEST_LOG_1_1 + MAX_QUEST_OFFSET * slot2 + i); - SetUInt32Value(PLAYER_QUEST_LOG_1_1 + MAX_QUEST_OFFSET *slot1 + i, temp2); - SetUInt32Value(PLAYER_QUEST_LOG_1_1 + MAX_QUEST_OFFSET *slot2 + i, temp1); + SetUInt32Value(PLAYER_QUEST_LOG_1_1 + MAX_QUEST_OFFSET * slot1 + i, temp2); + SetUInt32Value(PLAYER_QUEST_LOG_1_1 + MAX_QUEST_OFFSET * slot2 + i, temp1); } } uint32 GetReqKillOrCastCurrentCount(uint32 quest_id, int32 entry); diff --git a/src/game/PoolHandler.cpp b/src/game/PoolHandler.cpp index 15afb656805..6a148b58d66 100644 --- a/src/game/PoolHandler.cpp +++ b/src/game/PoolHandler.cpp @@ -26,6 +26,85 @@ INSTANTIATE_SINGLETON_1(PoolHandler); //////////////////////////////////////////////////////////// +// template class SpawnedPoolData + +// Method that tell amount spawned objects/subpools +uint32 SpawnedPoolData::GetSpawnedObjects(uint32 pool_id) const +{ + SpawnedPoolPools::const_iterator itr = mSpawnedPools.find(pool_id); + return itr != mSpawnedPools.end() ? itr->second : 0; +} + +// Method that tell if a creature is spawned currently +template<> +bool SpawnedPoolData::IsSpawnedObject<Creature>(uint32 db_guid) const +{ + return mSpawnedCreatures.find(db_guid) != mSpawnedCreatures.end(); +} + +// Method that tell if a gameobject is spawned currently +template<> +bool SpawnedPoolData::IsSpawnedObject<GameObject>(uint32 db_guid) const +{ + return mSpawnedGameobjects.find(db_guid) != mSpawnedGameobjects.end(); +} + +// Method that tell if a pool is spawned currently +template<> +bool SpawnedPoolData::IsSpawnedObject<Pool>(uint32 sub_pool_id) const +{ + return mSpawnedPools.find(sub_pool_id) != mSpawnedPools.end(); +} + +template<> +void SpawnedPoolData::AddSpawn<Creature>(uint32 db_guid, uint32 pool_id) +{ + mSpawnedCreatures.insert(db_guid); + ++mSpawnedPools[pool_id]; +} + +template<> +void SpawnedPoolData::AddSpawn<GameObject>(uint32 db_guid, uint32 pool_id) +{ + mSpawnedGameobjects.insert(db_guid); + ++mSpawnedPools[pool_id]; +} + +template<> +void SpawnedPoolData::AddSpawn<Pool>(uint32 sub_pool_id, uint32 pool_id) +{ + mSpawnedPools[sub_pool_id] = 0; + ++mSpawnedPools[pool_id]; +} + +template<> +void SpawnedPoolData::RemoveSpawn<Creature>(uint32 db_guid, uint32 pool_id) +{ + mSpawnedCreatures.erase(db_guid); + uint32& val = mSpawnedPools[pool_id]; + if (val > 0) + --val; +} + +template<> +void SpawnedPoolData::RemoveSpawn<GameObject>(uint32 db_guid, uint32 pool_id) +{ + mSpawnedGameobjects.erase(db_guid); + uint32& val = mSpawnedPools[pool_id]; + if (val > 0) + --val; +} + +template<> +void SpawnedPoolData::RemoveSpawn<Pool>(uint32 sub_pool_id, uint32 pool_id) +{ + mSpawnedPools.erase(sub_pool_id); + uint32& val = mSpawnedPools[pool_id]; + if (val > 0) + --val; +} + +//////////////////////////////////////////////////////////// // Methods of template class PoolGroup // Method to add a gameobject/creature guid to the proper list depending on pool type and chance value @@ -40,7 +119,7 @@ void PoolGroup<T>::AddEntry(PoolObject& poolitem, uint32 maxentries) // Method to check the chances are proper in this object pool template <class T> -bool PoolGroup<T>::CheckPool(void) +bool PoolGroup<T>::CheckPool() const { if (EqualChanced.size() == 0) { @@ -53,21 +132,8 @@ bool PoolGroup<T>::CheckPool(void) return true; } -// Method that tell if the gameobject, creature or pool is spawned currently template <class T> -bool PoolGroup<T>::IsSpawnedObject(uint32 guid) -{ - for (uint32 i=0; i<ExplicitlyChanced.size(); ++i) - if (ExplicitlyChanced[i].guid == guid) - return ExplicitlyChanced[i].spawned; - for (uint32 i=0; i<EqualChanced.size(); ++i) - if (EqualChanced[i].guid == guid) - return EqualChanced[i].spawned; - return false; -} - -template <class T> -void PoolGroup<T>::RollOne(int32& index, PoolObjectList** store, uint32 triggerFrom) +PoolObject* PoolGroup<T>::RollOne(SpawnedPoolData& spawns, uint32 triggerFrom) { if (!ExplicitlyChanced.empty()) { @@ -78,61 +144,50 @@ void PoolGroup<T>::RollOne(int32& index, PoolObjectList** store, uint32 triggerF roll -= ExplicitlyChanced[i].chance; // Triggering object is marked as spawned at this time and can be also rolled (respawn case) // so this need explicit check for this case - if (roll < 0 && (!ExplicitlyChanced[i].spawned || ExplicitlyChanced[i].guid == triggerFrom)) - { - index = i; - *store = &ExplicitlyChanced; - return; - } + if (roll < 0 && (ExplicitlyChanced[i].guid == triggerFrom || !spawns.IsSpawnedObject<T>(ExplicitlyChanced[i].guid))) + return &ExplicitlyChanced[i]; } } if (!EqualChanced.empty()) { - index = irand(0, EqualChanced.size()-1); + int32 index = irand(0, EqualChanced.size()-1); // Triggering object is marked as spawned at this time and can be also rolled (respawn case) // so this need explicit check for this case - if (!EqualChanced[index].spawned || EqualChanced[index].guid == triggerFrom) - { - *store = &EqualChanced; - return; - } + if (EqualChanced[index].guid == triggerFrom || !spawns.IsSpawnedObject<T>(EqualChanced[index].guid)) + return &EqualChanced[index]; } - index = -1; + return NULL; } // Main method to despawn a creature or gameobject in a pool // If no guid is passed, the pool is just removed (event end case) // If guid is filled, cache will be used and no removal will occur, it just fill the cache template<class T> -void PoolGroup<T>::DespawnObject(uint32 guid) +void PoolGroup<T>::DespawnObject(SpawnedPoolData& spawns, uint32 guid) { for (size_t i=0; i<EqualChanced.size(); ++i) { - if (EqualChanced[i].spawned) + // if spawned + if (spawns.IsSpawnedObject<T>(EqualChanced[i].guid)) { if (!guid || EqualChanced[i].guid == guid) { Despawn1Object(EqualChanced[i].guid); - - EqualChanced[i].spawned = false; - if (m_SpawnedPoolAmount > 0) - --m_SpawnedPoolAmount; + spawns.RemoveSpawn<T>(EqualChanced[i].guid,poolId); } } } for (size_t i = 0; i < ExplicitlyChanced.size(); ++i) { - if (ExplicitlyChanced[i].spawned) + // spawned + if (spawns.IsSpawnedObject<T>(ExplicitlyChanced[i].guid)) { if (!guid || ExplicitlyChanced[i].guid == guid) { Despawn1Object(ExplicitlyChanced[i].guid); - ExplicitlyChanced[i].spawned = false; - - if (m_SpawnedPoolAmount > 0) - --m_SpawnedPoolAmount; + spawns.RemoveSpawn<T>(ExplicitlyChanced[i].guid,poolId); } } } @@ -194,10 +249,10 @@ void PoolGroup<Pool>::RemoveOneRelation(uint16 child_pool_id) } template <class T> -void PoolGroup<T>::SpawnObject(uint32 limit, uint32 triggerFrom) +void PoolGroup<T>::SpawnObject(SpawnedPoolData& spawns, uint32 limit, uint32 triggerFrom) { uint32 lastDespawned = 0; - int count = limit - m_SpawnedPoolAmount; + int count = limit - spawns.GetSpawnedObjects(poolId); // If triggered from some object respawn this object is still marked as spawned // and also counted into m_SpawnedPoolAmount so we need increase count to be @@ -208,43 +263,38 @@ void PoolGroup<T>::SpawnObject(uint32 limit, uint32 triggerFrom) // This will try to spawn the rest of pool, not guaranteed for (int i = 0; i < count; ++i) { - int index; - PoolObjectList* store; - - RollOne(index, &store, triggerFrom); - if (index == -1) + PoolObject* obj = RollOne(spawns,triggerFrom); + if (!obj) continue; - if ((*store)[index].guid == lastDespawned) + if (obj->guid == lastDespawned) continue; - if ((*store)[index].guid == triggerFrom) + if (obj->guid == triggerFrom) { - (*store)[index].spawned = ReSpawn1Object(triggerFrom); + ReSpawn1Object(obj); triggerFrom = 0; continue; } - else - (*store)[index].spawned = Spawn1Object((*store)[index].guid); + spawns.AddSpawn<T>(obj->guid,poolId); + Spawn1Object(obj); if (triggerFrom) { // One spawn one despawn no count increase - DespawnObject(triggerFrom); + DespawnObject(spawns, triggerFrom); lastDespawned = triggerFrom; triggerFrom = 0; } - else - ++m_SpawnedPoolAmount; } } // Method that is actualy doing the spawn job on 1 creature template <> -bool PoolGroup<Creature>::Spawn1Object(uint32 guid) +void PoolGroup<Creature>::Spawn1Object(PoolObject* obj) { - if (CreatureData const* data = objmgr.GetCreatureData(guid)) + if (CreatureData const* data = objmgr.GetCreatureData(obj->guid)) { - objmgr.AddCreatureToGrid(guid, data); + objmgr.AddCreatureToGrid(obj->guid, data); // Spawn if necessary (loaded grids only) Map* map = const_cast<Map*>(MapManager::Instance().CreateBaseMap(data->mapid)); @@ -253,26 +303,24 @@ bool PoolGroup<Creature>::Spawn1Object(uint32 guid) { Creature* pCreature = new Creature; //sLog.outDebug("Spawning creature %u",guid); - if (!pCreature->LoadFromDB(guid, map)) + if (!pCreature->LoadFromDB(obj->guid, map)) { delete pCreature; - return false; + return; } else map->Add(pCreature); } - return true; } - return false; } // Same for 1 gameobject template <> -bool PoolGroup<GameObject>::Spawn1Object(uint32 guid) +void PoolGroup<GameObject>::Spawn1Object(PoolObject* obj) { - if (GameObjectData const* data = objmgr.GetGOData(guid)) + if (GameObjectData const* data = objmgr.GetGOData(obj->guid)) { - objmgr.AddGameobjectToGrid(guid, data); + objmgr.AddGameobjectToGrid(obj->guid, data); // Spawn if necessary (loaded grids only) // this base map checked as non-instanced and then only existed Map* map = const_cast<Map*>(MapManager::Instance().CreateBaseMap(data->mapid)); @@ -281,10 +329,10 @@ bool PoolGroup<GameObject>::Spawn1Object(uint32 guid) { GameObject* pGameobject = new GameObject; //sLog.outDebug("Spawning gameobject %u", guid); - if (!pGameobject->LoadFromDB(guid, map)) + if (!pGameobject->LoadFromDB(obj->guid, map)) { delete pGameobject; - return false; + return; } else { @@ -292,52 +340,38 @@ bool PoolGroup<GameObject>::Spawn1Object(uint32 guid) map->Add(pGameobject); } } - return true; } - return false; } // Same for 1 pool template <> -bool PoolGroup<Pool>::Spawn1Object(uint32 child_pool_id) +void PoolGroup<Pool>::Spawn1Object(PoolObject* obj) { - poolhandler.SpawnPool(child_pool_id, 0, 0); - poolhandler.SpawnPool(child_pool_id, 0, TYPEID_GAMEOBJECT); - poolhandler.SpawnPool(child_pool_id, 0, TYPEID_UNIT); - return true; + poolhandler.SpawnPool(obj->guid); } // Method that does the respawn job on the specified creature template <> -bool PoolGroup<Creature>::ReSpawn1Object(uint32 guid) +void PoolGroup<Creature>::ReSpawn1Object(PoolObject* obj) { - if (CreatureData const* data = objmgr.GetCreatureData(guid)) - { - if (Creature* pCreature = ObjectAccessor::Instance().GetObjectInWorld(MAKE_NEW_GUID(guid, data->id, HIGHGUID_UNIT), (Creature*)NULL)) + if (CreatureData const* data = objmgr.GetCreatureData(obj->guid)) + if (Creature* pCreature = ObjectAccessor::Instance().GetObjectInWorld(MAKE_NEW_GUID(obj->guid, data->id, HIGHGUID_UNIT), (Creature*)NULL)) pCreature->GetMap()->Add(pCreature); - return true; - } - return false; } -// Same for 1 gameobject +// Method that does the respawn job on the specified gameobject template <> -bool PoolGroup<GameObject>::ReSpawn1Object(uint32 guid) +void PoolGroup<GameObject>::ReSpawn1Object(PoolObject* obj) { - if (GameObjectData const* data = objmgr.GetGOData(guid)) - { - if (GameObject* pGameobject = ObjectAccessor::Instance().GetObjectInWorld(MAKE_NEW_GUID(guid, data->id, HIGHGUID_GAMEOBJECT), (GameObject*)NULL)) + if (GameObjectData const* data = objmgr.GetGOData(obj->guid)) + if (GameObject* pGameobject = ObjectAccessor::Instance().GetObjectInWorld(MAKE_NEW_GUID(obj->guid, data->id, HIGHGUID_GAMEOBJECT), (GameObject*)NULL)) pGameobject->GetMap()->Add(pGameobject); - return true; - } - return false; } // Nothing to do for a child Pool template <> -bool PoolGroup<Pool>::ReSpawn1Object(uint32 /*guid*/) +void PoolGroup<Pool>::ReSpawn1Object(PoolObject* /*obj*/) { - return true; } //////////////////////////////////////////////////////////// @@ -345,7 +379,6 @@ bool PoolGroup<Pool>::ReSpawn1Object(uint32 /*guid*/) PoolHandler::PoolHandler() { - m_IsPoolSystemStarted = false; } void PoolHandler::LoadFromDB() @@ -448,6 +481,7 @@ void PoolHandler::LoadFromDB() PoolObject plObject = PoolObject(guid, chance); PoolGroup<Creature>& cregroup = mPoolCreatureGroups[pool_id]; + cregroup.SetPoolId(pool_id); cregroup.AddEntry(plObject, pPoolTemplate->MaxLimit); SearchPair p(guid, pool_id); mCreatureSearchMap.insert(p); @@ -519,6 +553,7 @@ void PoolHandler::LoadFromDB() PoolObject plObject = PoolObject(guid, chance); PoolGroup<GameObject>& gogroup = mPoolGameobjectGroups[pool_id]; + gogroup.SetPoolId(pool_id); gogroup.AddEntry(plObject, pPoolTemplate->MaxLimit); SearchPair p(guid, pool_id); mGameobjectSearchMap.insert(p); @@ -585,6 +620,7 @@ void PoolHandler::LoadFromDB() PoolObject plObject = PoolObject(child_pool_id, chance); PoolGroup<Pool>& plgroup = mPoolPoolGroups[mother_pool_id]; + plgroup.SetPoolId(mother_pool_id); plgroup.AddEntry(plObject, pPoolTemplateMother->MaxLimit); SearchPair p(child_pool_id, mother_pool_id); mPoolSearchMap.insert(p); @@ -636,87 +672,63 @@ void PoolHandler::Initialize() sLog.outErrorDb("Pool Id (%u) has all creatures or gameobjects with explicit chance sum <>100 and no equal chance defined. The pool system cannot pick one to spawn.", pool_entry); continue; } - SpawnPool(pool_entry, 0, 0); - SpawnPool(pool_entry, 0, TYPEID_GAMEOBJECT); - SpawnPool(pool_entry, 0, TYPEID_UNIT); + SpawnPool(pool_entry);; count++; } while (result->NextRow()); } sLog.outBasic("Pool handling system initialized, %u pools spawned.", count); - m_IsPoolSystemStarted = true; } // Call to spawn a pool, if cache if true the method will spawn only if cached entry is different -// If it's same, the gameobject/creature is respawned only (added back to map) -void PoolHandler::SpawnPool(uint16 pool_id, uint32 guid, uint32 type) +// If it's same, the creature is respawned only (added back to map) +template<> +void PoolHandler::SpawnPool<Creature>(uint16 pool_id, uint32 db_guid) { - switch (type) - { - case TYPEID_UNIT: - if (!mPoolCreatureGroups[pool_id].isEmpty()) - mPoolCreatureGroups[pool_id].SpawnObject(mPoolTemplate[pool_id].MaxLimit, guid); - break; - case TYPEID_GAMEOBJECT: - if (!mPoolGameobjectGroups[pool_id].isEmpty()) - mPoolGameobjectGroups[pool_id].SpawnObject(mPoolTemplate[pool_id].MaxLimit, guid); - break; - default: - if (!mPoolPoolGroups[pool_id].isEmpty()) - mPoolPoolGroups[pool_id].SpawnObject(mPoolTemplate[pool_id].MaxLimit, guid); - } + if (!mPoolCreatureGroups[pool_id].isEmpty()) + mPoolCreatureGroups[pool_id].SpawnObject(mSpawnedData, mPoolTemplate[pool_id].MaxLimit, db_guid); } -// Call to despawn a pool, all gameobjects/creatures in this pool are removed -void PoolHandler::DespawnPool(uint16 pool_id) +// Call to spawn a pool, if cache if true the method will spawn only if cached entry is different +// If it's same, the gameobject is respawned only (added back to map) +template<> +void PoolHandler::SpawnPool<GameObject>(uint16 pool_id, uint32 db_guid) { - if (!mPoolCreatureGroups[pool_id].isEmpty()) - mPoolCreatureGroups[pool_id].DespawnObject(); - if (!mPoolGameobjectGroups[pool_id].isEmpty()) - mPoolGameobjectGroups[pool_id].DespawnObject(); + mPoolGameobjectGroups[pool_id].SpawnObject(mSpawnedData, mPoolTemplate[pool_id].MaxLimit, db_guid); +} +// Call to spawn a pool, if cache if true the method will spawn only if cached entry is different +// If it's same, the pool is respawned only +template<> +void PoolHandler::SpawnPool<Pool>(uint16 pool_id, uint32 sub_pool_id) +{ if (!mPoolPoolGroups[pool_id].isEmpty()) - mPoolPoolGroups[pool_id].DespawnObject(); + mPoolPoolGroups[pool_id].SpawnObject(mSpawnedData, mPoolTemplate[pool_id].MaxLimit, sub_pool_id); } -// Call to update the pool when a gameobject/creature part of pool [pool_id] is ready to respawn -// Here we cache only the creature/gameobject whose guid is passed as parameter -// Then the spawn pool call will use this cache to decide -void PoolHandler::UpdatePool(uint16 pool_id, uint32 guid, uint32 type) +void PoolHandler::SpawnPool( uint16 pool_id ) { - if (uint16 motherpoolid = IsPartOfAPool(pool_id, 0)) - SpawnPool(motherpoolid, 0, 0); - else - SpawnPool(pool_id, guid, type); + SpawnPool<Pool>(pool_id, 0); + SpawnPool<GameObject>(pool_id, 0); + SpawnPool<Creature>(pool_id, 0); } -// Method that tell if the gameobject/creature is part of a pool and return the pool id if yes -uint16 PoolHandler::IsPartOfAPool(uint32 guid, uint32 type) +// Call to despawn a pool, all gameobjects/creatures in this pool are removed +void PoolHandler::DespawnPool(uint16 pool_id) { - if (type == 0) // pool of pool - { - SearchMap::const_iterator itr = mPoolSearchMap.find(guid); - if (itr != mPoolSearchMap.end()) - return itr->second; - } - else if (type == TYPEID_GAMEOBJECT) - { - SearchMap::const_iterator itr = mGameobjectSearchMap.find(guid); - if (itr != mGameobjectSearchMap.end()) - return itr->second; - } - else // creature - { - SearchMap::const_iterator itr = mCreatureSearchMap.find(guid); - if (itr != mCreatureSearchMap.end()) - return itr->second; - } - return 0; + if (!mPoolCreatureGroups[pool_id].isEmpty()) + mPoolCreatureGroups[pool_id].DespawnObject(mSpawnedData); + + if (!mPoolGameobjectGroups[pool_id].isEmpty()) + mPoolGameobjectGroups[pool_id].DespawnObject(mSpawnedData); + + if (!mPoolPoolGroups[pool_id].isEmpty()) + mPoolPoolGroups[pool_id].DespawnObject(mSpawnedData); } // Method that check chance integrity of the creatures and gameobjects in this pool -bool PoolHandler::CheckPool(uint16 pool_id) +bool PoolHandler::CheckPool(uint16 pool_id) const { return pool_id <= max_pool_id && mPoolGameobjectGroups[pool_id].CheckPool() && @@ -724,15 +736,18 @@ bool PoolHandler::CheckPool(uint16 pool_id) mPoolPoolGroups[pool_id].CheckPool(); } -// Method that tell if a creature or gameobject in pool_id is spawned currently -bool PoolHandler::IsSpawnedObject(uint16 pool_id, uint32 guid, uint32 type) +// Call to update the pool when a gameobject/creature part of pool [pool_id] is ready to respawn +// Here we cache only the creature/gameobject whose guid is passed as parameter +// Then the spawn pool call will use this cache to decide +template<typename T> +void PoolHandler::UpdatePool(uint16 pool_id, uint32 db_guid_or_pool_id) { - if (pool_id > max_pool_id) - return false; - if (type == 0) - return mPoolPoolGroups[pool_id].IsSpawnedObject(guid); - else if (type == TYPEID_GAMEOBJECT) - return mPoolGameobjectGroups[pool_id].IsSpawnedObject(guid); + if (uint16 motherpoolid = IsPartOfAPool<Pool>(pool_id)) + SpawnPool<Pool>(motherpoolid, pool_id); else - return mPoolCreatureGroups[pool_id].IsSpawnedObject(guid); + SpawnPool<T>(pool_id, db_guid_or_pool_id); } + +template void PoolHandler::UpdatePool<Pool>(uint16 pool_id, uint32 db_guid_or_pool_id); +template void PoolHandler::UpdatePool<GameObject>(uint16 pool_id, uint32 db_guid_or_pool_id); +template void PoolHandler::UpdatePool<Creature>(uint16 pool_id, uint32 db_guid_or_pool_id);
\ No newline at end of file diff --git a/src/game/PoolHandler.h b/src/game/PoolHandler.h index cfc9c989e0a..0ba4cc7769f 100644 --- a/src/game/PoolHandler.h +++ b/src/game/PoolHandler.h @@ -33,8 +33,33 @@ struct PoolObject { uint32 guid; float chance; - bool spawned; - PoolObject(uint32 _guid, float _chance): guid(_guid), chance(fabs(_chance)), spawned(false) {} + PoolObject(uint32 _guid, float _chance): guid(_guid), chance(fabs(_chance)) {} +}; + +class Pool // for Pool of Pool case +{ +}; + +typedef std::set<uint32> SpawnedPoolObjects; +typedef std::map<uint32,uint32> SpawnedPoolPools; + +class SpawnedPoolData +{ + public: + template<typename T> + bool IsSpawnedObject(uint32 db_guid_or_pool_id) const; + + uint32 GetSpawnedObjects(uint32 pool_id) const; + + template<typename T> + void AddSpawn(uint32 db_guid_or_pool_id, uint32 pool_id); + + template<typename T> + void RemoveSpawn(uint32 db_guid_or_pool_id, uint32 pool_id); + private: + SpawnedPoolObjects mSpawnedCreatures; + SpawnedPoolObjects mSpawnedGameobjects; + SpawnedPoolPools mSpawnedPools; }; template <class T> @@ -42,27 +67,24 @@ class PoolGroup { typedef std::vector<PoolObject> PoolObjectList; public: - PoolGroup() : m_SpawnedPoolAmount(0) {} + explicit PoolGroup() : poolId(0) { } + void SetPoolId(uint32 pool_id) { poolId = pool_id; } ~PoolGroup() {}; - bool isEmpty() { return ExplicitlyChanced.empty() && EqualChanced.empty(); } + bool isEmpty() const { return ExplicitlyChanced.empty() && EqualChanced.empty(); } void AddEntry(PoolObject& poolitem, uint32 maxentries); - bool CheckPool(void); - void RollOne(int32& index, PoolObjectList** store, uint32 triggerFrom); - bool IsSpawnedObject(uint32 guid); - void DespawnObject(uint32 guid=0); + bool CheckPool() const; + PoolObject* RollOne(SpawnedPoolData& spawns, uint32 triggerFrom); + void DespawnObject(SpawnedPoolData& spawns, uint32 guid=0); void Despawn1Object(uint32 guid); - void SpawnObject(uint32 limit, uint32 triggerFrom); - bool Spawn1Object(uint32 guid); - bool ReSpawn1Object(uint32 guid); + void SpawnObject(SpawnedPoolData& spawns, uint32 limit, uint32 triggerFrom); + + void Spawn1Object(PoolObject* obj); + void ReSpawn1Object(PoolObject* obj); void RemoveOneRelation(uint16 child_pool_id); private: + uint32 poolId; PoolObjectList ExplicitlyChanced; PoolObjectList EqualChanced; - uint32 m_SpawnedPoolAmount; // Used to know the number of spawned objects -}; - -class Pool // for Pool of Pool case -{ }; class PoolHandler @@ -70,17 +92,28 @@ class PoolHandler public: PoolHandler(); ~PoolHandler() {}; + void LoadFromDB(); - uint16 IsPartOfAPool(uint32 guid, uint32 type); - bool IsSpawnedObject(uint16 pool_id, uint32 guid, uint32 type); - bool CheckPool(uint16 pool_id); - void SpawnPool(uint16 pool_id, uint32 guid, uint32 type); - void DespawnPool(uint16 pool_id); - void UpdatePool(uint16 pool_id, uint32 guid, uint32 type); void Initialize(); + template<typename T> + uint16 IsPartOfAPool(uint32 db_guid_or_pool_id) const; + + template<typename T> + bool IsSpawnedObject(uint32 db_guid_or_pool_id) const { return mSpawnedData.IsSpawnedObject<T>(db_guid_or_pool_id); } + + bool CheckPool(uint16 pool_id) const; + + void SpawnPool(uint16 pool_id); + void DespawnPool(uint16 pool_id); + + template<typename T> + void UpdatePool(uint16 pool_id, uint32 db_guid_or_pool_id); + protected: - bool m_IsPoolSystemStarted; + template<typename T> + void SpawnPool(uint16 pool_id, uint32 db_guid_or_pool_id); + uint16 max_pool_id; typedef std::vector<PoolTemplateData> PoolTemplateDataMap; typedef std::vector<PoolGroup<Creature> > PoolGroupCreatureMap; @@ -97,7 +130,43 @@ class PoolHandler SearchMap mGameobjectSearchMap; SearchMap mPoolSearchMap; + // dynamic data + SpawnedPoolData mSpawnedData; }; #define poolhandler Trinity::Singleton<PoolHandler>::Instance() + +// Method that tell if the creature is part of a pool and return the pool id if yes +template<> +inline uint16 PoolHandler::IsPartOfAPool<Creature>(uint32 db_guid) const +{ + SearchMap::const_iterator itr = mCreatureSearchMap.find(db_guid); + if (itr != mCreatureSearchMap.end()) + return itr->second; + + return 0; +} + +// Method that tell if the gameobject is part of a pool and return the pool id if yes +template<> +inline uint16 PoolHandler::IsPartOfAPool<GameObject>(uint32 db_guid) const +{ + SearchMap::const_iterator itr = mGameobjectSearchMap.find(db_guid); + if (itr != mGameobjectSearchMap.end()) + return itr->second; + + return 0; +} + +// Method that tell if the pool is part of another pool and return the pool id if yes +template<> +inline uint16 PoolHandler::IsPartOfAPool<Pool>(uint32 pool_id) const +{ + SearchMap::const_iterator itr = mPoolSearchMap.find(pool_id); + if (itr != mPoolSearchMap.end()) + return itr->second; + + return 0; +} + #endif diff --git a/src/game/QueryHandler.cpp b/src/game/QueryHandler.cpp index 9cb1020cedd..062f70f46ed 100644 --- a/src/game/QueryHandler.cpp +++ b/src/game/QueryHandler.cpp @@ -471,3 +471,71 @@ void WorldSession::HandleCorpseMapPositionQuery( WorldPacket & recv_data ) data << float(0); SendPacket(&data); } + +void WorldSession::HandleQuestPOIQuery(WorldPacket& recv_data) +{ + uint32 count; + recv_data >> count; // quest count, max=25 + + if(count >= MAX_QUEST_LOG_SIZE) + return; + + WorldPacket data(SMSG_QUEST_POI_QUERY_RESPONSE, 4+(4+4)*count); + data << uint32(count); // count + + for(int i = 0; i < count; ++i) + { + uint32 questId; + recv_data >> questId; // quest id + + bool questOk = false; + + uint16 questSlot = _player->FindQuestSlot(questId); + + if(questSlot != MAX_QUEST_LOG_SIZE) + questOk =_player->GetQuestSlotQuestId(questSlot) == questId; + + if(questOk) + { + QuestPOIVector const *POI = objmgr.GetQuestPOIVector(questId); + + if(POI) + { + data << uint32(questId); // quest ID + data << uint32(POI->size()); // POI count + + int index = 0; + for(QuestPOIVector::const_iterator itr = POI->begin(); itr != POI->end(); ++itr) + { + data << uint32(index); // POI index + data << int32(itr->ObjectiveIndex); // objective index + data << uint32(itr->MapId); // mapid + data << uint32(itr->Unk1); // unknown + data << uint32(itr->Unk2); // unknown + data << uint32(itr->Unk3); // unknown + data << uint32(itr->Unk4); // unknown + data << uint32(itr->points.size()); // POI points count + + for(std::vector<QuestPOIPoint>::const_iterator itr2 = itr->points.begin(); itr2 != itr->points.end(); ++itr2) + { + data << int32(itr2->x); // POI point x + data << int32(itr2->y); // POI point y + } + ++index; + } + } + else + { + data << uint32(questId); // quest ID + data << uint32(0); // POI count + } + } + else + { + data << uint32(questId); // quest ID + data << uint32(0); // POI count + } + } + + SendPacket(&data); +}
\ No newline at end of file diff --git a/src/game/QuestDef.cpp b/src/game/QuestDef.cpp index 979c002f54e..9057f7930fb 100644 --- a/src/game/QuestDef.cpp +++ b/src/game/QuestDef.cpp @@ -52,87 +52,92 @@ Quest::Quest(Field * questRecord) NextQuestId = questRecord[25].GetInt32(); ExclusiveGroup = questRecord[26].GetInt32(); NextQuestInChain = questRecord[27].GetUInt32(); - SrcItemId = questRecord[28].GetUInt32(); - SrcItemCount = questRecord[29].GetUInt32(); - SrcSpell = questRecord[30].GetUInt32(); - Title = questRecord[31].GetCppString(); - Details = questRecord[32].GetCppString(); - Objectives = questRecord[33].GetCppString(); - OfferRewardText = questRecord[34].GetCppString(); - RequestItemsText = questRecord[35].GetCppString(); - EndText = questRecord[36].GetCppString(); + XPId = questRecord[28].GetUInt32(); + SrcItemId = questRecord[29].GetUInt32(); + SrcItemCount = questRecord[30].GetUInt32(); + SrcSpell = questRecord[31].GetUInt32(); + Title = questRecord[32].GetCppString(); + Details = questRecord[33].GetCppString(); + Objectives = questRecord[34].GetCppString(); + OfferRewardText = questRecord[35].GetCppString(); + RequestItemsText = questRecord[36].GetCppString(); + EndText = questRecord[37].GetCppString(); for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i) - ObjectiveText[i] = questRecord[37+i].GetCppString(); + ObjectiveText[i] = questRecord[38+i].GetCppString(); for (int i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i) - ReqItemId[i] = questRecord[41+i].GetUInt32(); + ReqItemId[i] = questRecord[42+i].GetUInt32(); for (int i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i) - ReqItemCount[i] = questRecord[47+i].GetUInt32(); + ReqItemCount[i] = questRecord[48+i].GetUInt32(); for (int i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i) - ReqSourceId[i] = questRecord[53+i].GetUInt32(); + ReqSourceId[i] = questRecord[54+i].GetUInt32(); for (int i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i) - ReqSourceCount[i] = questRecord[57+i].GetUInt32(); + ReqSourceCount[i] = questRecord[58+i].GetUInt32(); for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i) - ReqCreatureOrGOId[i] = questRecord[61+i].GetInt32(); + ReqCreatureOrGOId[i] = questRecord[62+i].GetInt32(); for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i) - ReqCreatureOrGOCount[i] = questRecord[65+i].GetUInt32(); + ReqCreatureOrGOCount[i] = questRecord[66+i].GetUInt32(); for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i) - ReqSpell[i] = questRecord[69+i].GetUInt32(); + ReqSpell[i] = questRecord[70+i].GetUInt32(); for (int i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i) - RewChoiceItemId[i] = questRecord[73+i].GetUInt32(); + RewChoiceItemId[i] = questRecord[74+i].GetUInt32(); for (int i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i) - RewChoiceItemCount[i] = questRecord[79+i].GetUInt32(); + RewChoiceItemCount[i] = questRecord[80+i].GetUInt32(); for (int i = 0; i < QUEST_REWARDS_COUNT; ++i) - RewItemId[i] = questRecord[85+i].GetUInt32(); + RewItemId[i] = questRecord[86+i].GetUInt32(); for (int i = 0; i < QUEST_REWARDS_COUNT; ++i) - RewItemCount[i] = questRecord[89+i].GetUInt32(); + RewItemCount[i] = questRecord[90+i].GetUInt32(); for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) - RewRepFaction[i] = questRecord[93+i].GetUInt32(); + RewRepFaction[i] = questRecord[94+i].GetUInt32(); for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) - RewRepValue[i] = questRecord[98+i].GetInt32(); - - RewHonorableKills = questRecord[103].GetUInt32(); - RewOrReqMoney = questRecord[104].GetInt32(); - RewMoneyMaxLevel = questRecord[105].GetUInt32(); - RewSpell = questRecord[106].GetUInt32(); - RewSpellCast = questRecord[107].GetInt32(); - RewMailTemplateId = questRecord[108].GetUInt32(); - RewMailDelaySecs = questRecord[109].GetUInt32(); - PointMapId = questRecord[110].GetUInt32(); - PointX = questRecord[111].GetFloat(); - PointY = questRecord[112].GetFloat(); - PointOpt = questRecord[113].GetUInt32(); + RewRepValueId[i] = questRecord[99+i].GetInt32(); + + for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) + RewRepValue[i] = questRecord[104+i].GetInt32(); + + RewHonorableKills = questRecord[109].GetUInt32(); + RewHonorMultiplier = questRecord[110].GetFloat(); + RewOrReqMoney = questRecord[111].GetInt32(); + RewMoneyMaxLevel = questRecord[112].GetUInt32(); + RewSpell = questRecord[113].GetUInt32(); + RewSpellCast = questRecord[114].GetInt32(); + RewMailTemplateId = questRecord[115].GetUInt32(); + RewMailDelaySecs = questRecord[116].GetUInt32(); + PointMapId = questRecord[117].GetUInt32(); + PointX = questRecord[118].GetFloat(); + PointY = questRecord[119].GetFloat(); + PointOpt = questRecord[120].GetUInt32(); for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) - DetailsEmote[i] = questRecord[114+i].GetUInt32(); + DetailsEmote[i] = questRecord[121+i].GetUInt32(); for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) - DetailsEmoteDelay[i] = questRecord[118+i].GetUInt32(); + DetailsEmoteDelay[i] = questRecord[125+i].GetUInt32(); - IncompleteEmote = questRecord[122].GetUInt32(); - CompleteEmote = questRecord[123].GetUInt32(); + IncompleteEmote = questRecord[129].GetUInt32(); + CompleteEmote = questRecord[130].GetUInt32(); for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) - OfferRewardEmote[i] = questRecord[124+i].GetInt32(); + OfferRewardEmote[i] = questRecord[131+i].GetInt32(); for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) - OfferRewardEmoteDelay[i] = questRecord[128+i].GetInt32(); + OfferRewardEmoteDelay[i] = questRecord[135+i].GetInt32(); - QuestStartScript = questRecord[132].GetUInt32(); - QuestCompleteScript = questRecord[133].GetUInt32(); + QuestStartScript = questRecord[139].GetUInt32(); + QuestCompleteScript = questRecord[140].GetUInt32(); QuestFlags |= SpecialFlags << 16; @@ -170,39 +175,33 @@ uint32 Quest::XPValue( Player *pPlayer ) const { if( pPlayer ) { - if( RewMoneyMaxLevel > 0 ) - { - uint32 pLevel = pPlayer->getLevel(); - int32 qLevel = QuestLevel; - float fullxp = 0; - if (qLevel >= 15) - fullxp = RewMoneyMaxLevel / 6.0f; - else if (qLevel == 14) - fullxp = RewMoneyMaxLevel / 4.8f; - else if (qLevel == 13) - fullxp = RewMoneyMaxLevel / 3.666f; - else if (qLevel == 12) - fullxp = RewMoneyMaxLevel / 2.4f; - else if (qLevel == 11) - fullxp = RewMoneyMaxLevel / 1.2f; - else if (qLevel >= 1 && qLevel <= 10) - fullxp = RewMoneyMaxLevel / 0.6f; - else if (qLevel <= 0) - fullxp = RewMoneyMaxLevel; - - if ((pLevel <= qLevel + 5) || qLevel == -1) - return (uint32)fullxp; - else if (pLevel == qLevel + 6) - return (uint32)(fullxp * 0.8f); - else if (pLevel == qLevel + 7) - return (uint32)(fullxp * 0.6f); - else if (pLevel == qLevel + 8) - return (uint32)(fullxp * 0.4f); - else if (pLevel == qLevel + 9) - return (uint32)(fullxp * 0.2f); - else - return (uint32)(fullxp * 0.1f); - } + + const QuestXPEntry *xpentry; + int32 quest_level = (QuestLevel == -1 ? pPlayer->getLevel() : QuestLevel); + xpentry = sQuestXPStore.LookupEntry(quest_level); + if(!xpentry) + return 0; + + int diffFactor = 2 * (quest_level - pPlayer->getLevel()) + 20; + + if (diffFactor < 1) + diffFactor = 1; + else if (diffFactor > 10) + diffFactor = 10; + + uint32 xp = diffFactor * xpentry->Exp[XPId] / 10; + + if (xp <= 100) + xp = 5 * ((xp + 2) / 5); + else if (xp <= 500) + xp = 10 * ((xp + 5) / 10); + else if (xp <= 1000) + xp = 25 * ((xp + 12) / 25); + else + xp = 50 * ((xp + 25) / 50); + + return xp; + } return 0; } diff --git a/src/game/QuestDef.h b/src/game/QuestDef.h index d230514b818..74a2087ad37 100644 --- a/src/game/QuestDef.h +++ b/src/game/QuestDef.h @@ -122,6 +122,7 @@ enum __QuestGiverStatus enum __QuestFlags { // Flags used at server and sent to client + QUEST_FLAGS_NONE = 0x00000000, QUEST_FLAGS_STAY_ALIVE = 0x00000001, // Not used currently QUEST_FLAGS_PARTY_ACCEPT = 0x00000002, // Not used currently. If player in party, all players that can accept this quest will receive confirmation box to accept quest CMSG_QUEST_CONFIRM_ACCEPT/SMSG_QUEST_CONFIRM_ACCEPT QUEST_FLAGS_EXPLORATION = 0x00000004, // Not used currently @@ -136,6 +137,10 @@ enum __QuestFlags QUEST_FLAGS_TBC_RACES = 0x00000800, // Not used currently: Blood elf/Draenei starting zone quests QUEST_FLAGS_DAILY = 0x00001000, // Used to know quest is Daily one QUEST_FLAGS_WEEKLY = 0x00008000, + QUEST_FLAGS_AUTOCOMPLETE = 0x00010000, // auto complete + QUEST_FLAGS_UNK5 = 0x00020000, // has something to do with ReqItemId and SrcItemId + QUEST_FLAGS_UNK6 = 0x00040000, // use Objective text as Complete text + QUEST_FLAGS_LOW_LEVEL = 0x00080000, // quests in starting areas // Trinity flags for set SpecialFlags in DB if required but used only at server QUEST_TRINITY_FLAGS_REPEATABLE = 0x010000, // Set by 1 in SpecialFlags from DB @@ -246,6 +251,7 @@ class Quest uint32 RewItemId[QUEST_REWARDS_COUNT]; uint32 RewItemCount[QUEST_REWARDS_COUNT]; uint32 RewRepFaction[QUEST_REPUTATIONS_COUNT]; + int32 RewRepValueId[QUEST_REPUTATIONS_COUNT]; int32 RewRepValue[QUEST_REPUTATIONS_COUNT]; uint32 DetailsEmote[QUEST_EMOTE_COUNT]; uint32 DetailsEmoteDelay[QUEST_EMOTE_COUNT]; @@ -276,7 +282,7 @@ class Quest int32 ZoneOrSort; int32 SkillOrClass; uint32 MinLevel; - uint32 QuestLevel; + int32 QuestLevel; uint32 Type; uint32 RequiredRaces; uint32 RequiredSkillValue; @@ -298,6 +304,7 @@ class Quest int32 NextQuestId; int32 ExclusiveGroup; uint32 NextQuestInChain; + uint32 XPId; uint32 SrcItemId; uint32 SrcItemCount; uint32 SrcSpell; @@ -308,6 +315,7 @@ class Quest std::string RequestItemsText; std::string EndText; uint32 RewHonorableKills; + float RewHonorMultiplier; int32 RewOrReqMoney; uint32 RewMoneyMaxLevel; uint32 RewSpell; diff --git a/src/game/QuestHandler.cpp b/src/game/QuestHandler.cpp index 4b9f3eddd04..d234e063d39 100644 --- a/src/game/QuestHandler.cpp +++ b/src/game/QuestHandler.cpp @@ -689,3 +689,22 @@ void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPacket& /*recvPacket data.put<uint32>(0, count); // write real count SendPacket(&data); } + +void WorldSession::HandleQueryQuestsCompleted( WorldPacket & recv_data ) +{ + uint32 count = 0; + + WorldPacket data(SMSG_QUERY_QUESTS_COMPLETED_RESPONSE, 4+4*count); + data << uint32(count); + + for(QuestStatusMap::const_iterator itr = _player->getQuestStatusMap().begin(); itr != _player->getQuestStatusMap().end(); ++itr) + { + if(itr->second.m_rewarded) + { + data << uint32(itr->first); + count++; + } + } + data.put<uint32>(0, count); + SendPacket(&data); +} diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.h index d047dd90544..0e9c1db98fb 100644 --- a/src/game/SharedDefines.h +++ b/src/game/SharedDefines.h @@ -280,7 +280,7 @@ const uint32 ItemQualityColors[MAX_ITEM_QUALITY] = { #define SPELL_ATTR_EX_DISMISS_PET 0x00000001 // 0 dismiss pet and not allow to summon new one? #define SPELL_ATTR_EX_DRAIN_ALL_POWER 0x00000002 // 1 use all power (Only paladin Lay of Hands and Bunyanize) #define SPELL_ATTR_EX_CHANNELED_1 0x00000004 // 2 channeled target -#define SPELL_ATTR_EX_UNK3 0x00000008 // 3 +#define SPELL_ATTR_EX_PUT_CASTER_IN_COMBAT 0x00000008 // 3 spells that cause a caster to enter a combat #define SPELL_ATTR_EX_UNK4 0x00000010 // 4 stealth and whirlwind #define SPELL_ATTR_EX_NOT_BREAK_STEALTH 0x00000020 // 5 Not break stealth #define SPELL_ATTR_EX_CHANNELED_2 0x00000040 // 6 channeled self @@ -303,11 +303,11 @@ const uint32 ItemQualityColors[MAX_ITEM_QUALITY] = { #define SPELL_ATTR_EX_UNK23 0x00800000 // 23 #define SPELL_ATTR_EX_UNK24 0x01000000 // 24 Req fishing pole?? #define SPELL_ATTR_EX_UNK25 0x02000000 // 25 -#define SPELL_ATTR_EX_UNK26 0x04000000 // 26 +#define SPELL_ATTR_EX_UNK26 0x04000000 // 26 works correctly with [target=focus] and [target=mouseover] macros? #define SPELL_ATTR_EX_UNK27 0x08000000 // 27 -#define SPELL_ATTR_EX_UNK28 0x10000000 // 28 +#define SPELL_ATTR_EX_IGNORE_IMMUNITY 0x10000000 // 28 removed from Chains of Ice 3.3.0 #define SPELL_ATTR_EX_UNK29 0x20000000 // 29 -#define SPELL_ATTR_EX_UNK30 0x40000000 // 30 overpower +#define SPELL_ATTR_EX_ENABLE_AT_DODGE 0x40000000 // 30 Overpower, Wolverine Bite #define SPELL_ATTR_EX_UNK31 0x80000000 // 31 #define SPELL_ATTR_EX2_UNK0 0x00000001 // 0 @@ -361,7 +361,7 @@ const uint32 ItemQualityColors[MAX_ITEM_QUALITY] = { #define SPELL_ATTR_EX3_UNK15 0x00008000 // 15 Auto Shoot, Shoot, Throw, - this is autoshot flag #define SPELL_ATTR_EX3_UNK16 0x00010000 // 16 no triggers effects that trigger on casting a spell?? (15290 - 2.2ptr change) #define SPELL_ATTR_EX3_NO_INITIAL_AGGRO 0x00020000 // 17 Soothe Animal, 39758, Mind Soothe -#define SPELL_ATTR_EX3_UNK18 0x00040000 // 18 +#define SPELL_ATTR_EX3_UNK18 0x00040000 // 18 added to Explosive Trap Effect 3.3.0, removed from Mutilate 3.3.0 #define SPELL_ATTR_EX3_DISABLE_PROC 0x00080000 // 19 during aura proc no spells can trigger (20178, 20375) #define SPELL_ATTR_EX3_DEATH_PERSISTENT 0x00100000 // 20 Death persistent spells #define SPELL_ATTR_EX3_UNK21 0x00200000 // 21 @@ -372,8 +372,8 @@ const uint32 ItemQualityColors[MAX_ITEM_QUALITY] = { #define SPELL_ATTR_EX3_CAN_PROC_TRIGGERED 0x04000000 // 26 #define SPELL_ATTR_EX3_DRAIN_SOUL 0x08000000 // 27 only drain soul has this flag #define SPELL_ATTR_EX3_UNK28 0x10000000 // 28 -#define SPELL_ATTR_EX3_UNK29 0x20000000 // 29 -#define SPELL_ATTR_EX3_UNK30 0x40000000 // 30 +#define SPELL_ATTR_EX3_UNK29 0x20000000 // 29 Ignite 3.3.0 +#define SPELL_ATTR_EX3_UNK30 0x40000000 // 30 Shaman's Fire Nova 3.3.0, Sweeping Strikes 3.3.0 #define SPELL_ATTR_EX3_UNK31 0x80000000 // 31 #define SPELL_ATTR_EX4_UNK0 0x00000001 // 0 @@ -396,7 +396,7 @@ const uint32 ItemQualityColors[MAX_ITEM_QUALITY] = { #define SPELL_ATTR_EX4_USABLE_IN_ARENA 0x00020000 // 17 usable in arena #define SPELL_ATTR_EX4_UNK18 0x00040000 // 18 #define SPELL_ATTR_EX4_UNK19 0x00080000 // 19 -#define SPELL_ATTR_EX4_UNK20 0x00100000 // 20 +#define SPELL_ATTR_EX4_NOT_CHECK_SELFCAST_POWER 0x00100000 // 20 supersedes message "More powerful spell applied" for self casts. #define SPELL_ATTR_EX4_UNK21 0x00200000 // 21 #define SPELL_ATTR_EX4_UNK22 0x00400000 // 22 #define SPELL_ATTR_EX4_UNK23 0x00800000 // 23 @@ -463,7 +463,7 @@ const uint32 ItemQualityColors[MAX_ITEM_QUALITY] = { #define SPELL_ATTR_EX6_UNK18 0x00040000 // 18 #define SPELL_ATTR_EX6_UNK19 0x00080000 // 19 #define SPELL_ATTR_EX6_UNK20 0x00100000 // 20 -#define SPELL_ATTR_EX6_UNK21 0x00200000 // 21 +#define SPELL_ATTR_EX6_CLIENT_UI_TARGET_EFFECTS 0x00200000 // 21 it's only client-side attribute #define SPELL_ATTR_EX6_UNK22 0x00400000 // 22 #define SPELL_ATTR_EX6_UNK23 0x00800000 // 23 not set in 3.0.3 #define SPELL_ATTR_EX6_UNK24 0x01000000 // 24 not set in 3.0.3 @@ -974,7 +974,7 @@ enum AuraState AURA_STATE_HUNTER_PARRY = 7, // C | //AURA_STATE_UNKNOWN7 = 7, // c | creature cheap shot / focused bursts spells //AURA_STATE_UNKNOWN8 = 8, // t| test spells - //AURA_STATE_UNKNOWN9 = 9, // | + //AURA_STATE_UNKNOWN9 = 9, // | AURA_STATE_WARRIOR_VICTORY_RUSH = 10, // C | warrior victory rush //AURA_STATE_UNKNOWN11 = 11, // C t| 60348 - Maelstrom Ready!, test spells AURA_STATE_FAERIE_FIRE = 12, // c t| @@ -2359,13 +2359,15 @@ enum TotemCategory enum UnitDynFlags { - UNIT_DYNFLAG_LOOTABLE = 0x0001, - UNIT_DYNFLAG_TRACK_UNIT = 0x0002, - UNIT_DYNFLAG_OTHER_TAGGER = 0x0004, - UNIT_DYNFLAG_ROOTED = 0x0008, - UNIT_DYNFLAG_SPECIALINFO = 0x0010, - UNIT_DYNFLAG_DEAD = 0x0020, - UNIT_DYNFLAG_REFER_A_FRIEND = 0x0040 + UNIT_DYNFLAG_NONE = 0x0000, + UNIT_DYNFLAG_LOOTABLE = 0x0001, + UNIT_DYNFLAG_TRACK_UNIT = 0x0002, + UNIT_DYNFLAG_TAPPED = 0x0004, // Lua_UnitIsTapped + UNIT_DYNFLAG_TAPPED_BY_PLAYER = 0x0008, // Lua_UnitIsTappedByPlayer + UNIT_DYNFLAG_SPECIALINFO = 0x0010, + UNIT_DYNFLAG_DEAD = 0x0020, + UNIT_DYNFLAG_REFER_A_FRIEND = 0x0040, + UNIT_DYNFLAG_TAPPED_BY_ALL_THREAT_LIST = 0x0080 // Lua_UnitIsTappedByAllThreatList }; enum CorpseDynFlags @@ -2396,8 +2398,8 @@ enum ChatMsg CHAT_MSG_OFFICER = 0x05, CHAT_MSG_YELL = 0x06, CHAT_MSG_WHISPER = 0x07, - CHAT_MSG_WHISPER_INFORM = 0x08, // WHISPER_FOREIGN? - CHAT_MSG_REPLY = 0x09, // WHISPER_INFORM? + CHAT_MSG_WHISPER_FOREIGN = 0x08, + CHAT_MSG_WHISPER_INFORM = 0x09, CHAT_MSG_EMOTE = 0x0A, CHAT_MSG_TEXT_EMOTE = 0x0B, CHAT_MSG_MONSTER_SAY = 0x0C, @@ -2429,18 +2431,20 @@ enum ChatMsg CHAT_MSG_BG_SYSTEM_HORDE = 0x26, CHAT_MSG_RAID_LEADER = 0x27, CHAT_MSG_RAID_WARNING = 0x28, - CHAT_MSG_RAID_BOSS_WHISPER = 0x29, - CHAT_MSG_RAID_BOSS_EMOTE = 0x2A, + CHAT_MSG_RAID_BOSS_EMOTE = 0x29, + CHAT_MSG_RAID_BOSS_WHISPER = 0x2A, CHAT_MSG_FILTERED = 0x2B, CHAT_MSG_BATTLEGROUND = 0x2C, CHAT_MSG_BATTLEGROUND_LEADER = 0x2D, CHAT_MSG_RESTRICTED = 0x2E, - CHAT_MSG_BN = 0x2F, + CHAT_MSG_BATTLENET = 0x2F, CHAT_MSG_ACHIEVEMENT = 0x30, - CHAT_MSG_GUILD_ACHIEVEMENT = 0x31 + CHAT_MSG_GUILD_ACHIEVEMENT = 0x31, + CHAT_MSG_ARENA_POINTS = 0x32, + CHAT_MSG_PARTY_LEADER = 0x33 }; -#define MAX_CHAT_MSG_TYPE 0x32 +#define MAX_CHAT_MSG_TYPE 0x33 enum ChatLinkColors { @@ -2632,41 +2636,43 @@ enum ResponseCodes CHAR_CREATE_CHARACTER_GOLD_LIMIT = 0x44, - CHAR_DELETE_IN_PROGRESS = 0x45, - CHAR_DELETE_SUCCESS = 0x46, - CHAR_DELETE_FAILED = 0x47, - CHAR_DELETE_FAILED_LOCKED_FOR_TRANSFER = 0x48, - CHAR_DELETE_FAILED_GUILD_LEADER = 0x49, - CHAR_DELETE_FAILED_ARENA_CAPTAIN = 0x4A, - - CHAR_LOGIN_IN_PROGRESS = 0x4B, - CHAR_LOGIN_SUCCESS = 0x4C, - CHAR_LOGIN_NO_WORLD = 0x4D, - CHAR_LOGIN_DUPLICATE_CHARACTER = 0x4E, - CHAR_LOGIN_NO_INSTANCES = 0x4F, - CHAR_LOGIN_FAILED = 0x50, - CHAR_LOGIN_DISABLED = 0x51, - CHAR_LOGIN_NO_CHARACTER = 0x52, - CHAR_LOGIN_LOCKED_FOR_TRANSFER = 0x53, - CHAR_LOGIN_LOCKED_BY_BILLING = 0x54, - - CHAR_NAME_SUCCESS = 0x55, - CHAR_NAME_FAILURE = 0x56, - CHAR_NAME_NO_NAME = 0x57, - CHAR_NAME_TOO_SHORT = 0x58, - CHAR_NAME_TOO_LONG = 0x59, - CHAR_NAME_INVALID_CHARACTER = 0x5A, - CHAR_NAME_MIXED_LANGUAGES = 0x5B, - CHAR_NAME_PROFANE = 0x5C, - CHAR_NAME_RESERVED = 0x5D, - CHAR_NAME_INVALID_APOSTROPHE = 0x5E, - CHAR_NAME_MULTIPLE_APOSTROPHES = 0x5F, - CHAR_NAME_THREE_CONSECUTIVE = 0x60, - CHAR_NAME_INVALID_SPACE = 0x61, - CHAR_NAME_CONSECUTIVE_SPACES = 0x62, - CHAR_NAME_RUSSIAN_CONSECUTIVE_SILENT_CHARACTERS = 0x63, - CHAR_NAME_RUSSIAN_SILENT_CHARACTER_AT_BEGINNING_OR_END = 0x64, - CHAR_NAME_DECLENSION_DOESNT_MATCH_BASE_NAME = 0x65 + CHAR_CREATE_FORCE_LOGIN = 0x45, + + CHAR_DELETE_IN_PROGRESS = 0x46, + CHAR_DELETE_SUCCESS = 0x47, + CHAR_DELETE_FAILED = 0x48, + CHAR_DELETE_FAILED_LOCKED_FOR_TRANSFER = 0x49, + CHAR_DELETE_FAILED_GUILD_LEADER = 0x4A, + CHAR_DELETE_FAILED_ARENA_CAPTAIN = 0x4B, + + CHAR_LOGIN_IN_PROGRESS = 0x4C, + CHAR_LOGIN_SUCCESS = 0x4D, + CHAR_LOGIN_NO_WORLD = 0x4E, + CHAR_LOGIN_DUPLICATE_CHARACTER = 0x4F, + CHAR_LOGIN_NO_INSTANCES = 0x50, + CHAR_LOGIN_FAILED = 0x51, + CHAR_LOGIN_DISABLED = 0x52, + CHAR_LOGIN_NO_CHARACTER = 0x53, + CHAR_LOGIN_LOCKED_FOR_TRANSFER = 0x54, + CHAR_LOGIN_LOCKED_BY_BILLING = 0x55, + + CHAR_NAME_SUCCESS = 0x56, + CHAR_NAME_FAILURE = 0x57, + CHAR_NAME_NO_NAME = 0x58, + CHAR_NAME_TOO_SHORT = 0x59, + CHAR_NAME_TOO_LONG = 0x5A, + CHAR_NAME_INVALID_CHARACTER = 0x5B, + CHAR_NAME_MIXED_LANGUAGES = 0x5C, + CHAR_NAME_PROFANE = 0x5D, + CHAR_NAME_RESERVED = 0x5E, + CHAR_NAME_INVALID_APOSTROPHE = 0x5F, + CHAR_NAME_MULTIPLE_APOSTROPHES = 0x60, + CHAR_NAME_THREE_CONSECUTIVE = 0x61, + CHAR_NAME_INVALID_SPACE = 0x62, + CHAR_NAME_CONSECUTIVE_SPACES = 0x63, + CHAR_NAME_RUSSIAN_CONSECUTIVE_SILENT_CHARACTERS = 0x64, + CHAR_NAME_RUSSIAN_SILENT_CHARACTER_AT_BEGINNING_OR_END = 0x65, + CHAR_NAME_DECLENSION_DOESNT_MATCH_BASE_NAME = 0x66 }; /// Ban function modes diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index ad2a6c867be..9bcb0751252 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -2899,6 +2899,13 @@ void Spell::cast(bool skipCheck) m_preCastSpell = 11196; // Recently Bandaged break; } + case SPELLFAMILY_MAGE: + { + // Permafrost + if (m_spellInfo->SpellFamilyFlags[1] & 0x00001000 || m_spellInfo->SpellFamilyFlags[0] & 0x00100220) + m_preCastSpell = 68391; + break; + } } // traded items have trade slot instead of guid in m_itemTargetGUID // set to real guid to be sent later to the client @@ -4621,7 +4628,7 @@ SpellCastResult Spell::CheckCast(bool strict) // - with greater than 15 min CD without SPELL_ATTR_EX4_USABLE_IN_ARENA flag // - with SPELL_ATTR_EX4_NOT_USABLE_IN_ARENA flag if ((m_spellInfo->AttributesEx4 & SPELL_ATTR_EX4_NOT_USABLE_IN_ARENA) || - GetSpellRecoveryTime(m_spellInfo) > 15 * MINUTE * IN_MILISECONDS && !(m_spellInfo->AttributesEx4 & SPELL_ATTR_EX4_USABLE_IN_ARENA)) + GetSpellRecoveryTime(m_spellInfo) > 10 * MINUTE * IN_MILISECONDS && !(m_spellInfo->AttributesEx4 & SPELL_ATTR_EX4_USABLE_IN_ARENA)) if(MapEntry const* mapEntry = sMapStore.LookupEntry(m_caster->GetMapId())) if(mapEntry->IsBattleArena()) return SPELL_FAILED_NOT_IN_ARENA; @@ -4825,6 +4832,11 @@ SpellCastResult Spell::CheckCast(bool strict) if(m_targets.getUnitTarget() && !m_caster->IsFriendlyTo(m_targets.getUnitTarget()) && !m_caster->HasInArc( M_PI, m_targets.getUnitTarget() )) return SPELL_FAILED_UNIT_NOT_INFRONT; } + else if(m_spellInfo->SpellIconID == 33 && m_spellInfo->SpellFamilyName == SPELLFAMILY_SHAMAN && m_spellInfo->SpellFamilyFlags[0] & SPELLFAMILYFLAG_SHAMAN_FIRE_NOVA) + { + if (!m_caster->m_SummonSlot[1]) + return SPELL_FAILED_SUCCESS; + } else if (m_spellInfo->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT && m_spellInfo->SpellFamilyFlags[0] == 0x2000) // Death Coil (DeathKnight) { Unit* target = m_targets.getUnitTarget(); @@ -5290,6 +5302,17 @@ SpellCastResult Spell::CheckCast(bool strict) } break; } + case SPELL_AURA_RANGED_AP_ATTACKER_CREATURES_BONUS: + { + if (!m_targets.getUnitTarget() && m_targets.getUnitTarget()->GetTypeId() != TYPEID_UNIT) + return SPELL_FAILED_BAD_IMPLICIT_TARGETS; + + // can be casted at non-friendly unit or own pet/charm + if (m_caster->IsFriendlyTo(m_targets.getUnitTarget())) + return SPELL_FAILED_TARGET_FRIENDLY; + + break; + } case SPELL_AURA_PERIODIC_MANA_LEECH: { if (!m_targets.getUnitTarget()) @@ -6609,6 +6632,13 @@ int32 Spell::CalculateDamageDone(Unit *unit, const uint32 effectMask, float *mul { if(int32 reducedPct = unit->GetMaxNegativeAuraModifier(SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE)) m_damage = m_damage * (100 + reducedPct) / 100; + + if (m_caster->GetTypeId() == TYPEID_PLAYER) + { + uint32 targetAmount = m_UniqueTargetInfo.size(); + if (targetAmount > 10) + m_damage = m_damage * 10/targetAmount; + } } } if(m_applyMultiplierMask & (1 << i)) diff --git a/src/game/SpellAuraDefines.h b/src/game/SpellAuraDefines.h index 77736e21cc9..8b21062e371 100644 --- a/src/game/SpellAuraDefines.h +++ b/src/game/SpellAuraDefines.h @@ -351,7 +351,17 @@ enum AuraType SPELL_AURA_304 = 304, SPELL_AURA_MOD_MINIMUM_SPEED = 305, SPELL_AURA_306 = 306, - TOTAL_AURAS = 307 + SPELL_AURA_307 = 307, + SPELL_AURA_308 = 308, + SPELL_AURA_309 = 309, + SPELL_AURA_RANGED_AP_ATTACKER_CREATURES_BONUS = 310, + SPELL_AURA_311 = 311, + SPELL_AURA_312 = 312, + SPELL_AURA_313 = 313, + SPELL_AURA_314 = 314, + SPELL_AURA_315 = 315, + SPELL_AURA_PERIODIC_HASTE = 316, + TOTAL_AURAS = 317 }; enum AuraObjectType diff --git a/src/game/SpellAuraEffects.cpp b/src/game/SpellAuraEffects.cpp index 30e019d669d..951692de7fa 100644 --- a/src/game/SpellAuraEffects.cpp +++ b/src/game/SpellAuraEffects.cpp @@ -360,7 +360,18 @@ pAuraEffectHandler AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleNULL, //303 17 spells &AuraEffect::HandleNULL, //304 2 spells (alcohol effect?) &AuraEffect::HandleAuraModIncreaseSpeed, //305 SPELL_AURA_MOD_MINIMUM_SPEED - &AuraEffect::HandleNULL //306 1 spell + &AuraEffect::HandleNULL, //306 1 spell + &AuraEffect::HandleNULL, //307 absorb healing? + &AuraEffect::HandleNULL, //308 new aura for hunter traps + &AuraEffect::HandleNULL, //309 absorb healing? + &AuraEffect::HandleNoImmediateEffect, //310 5 spells SPELL_AURA_RANGED_AP_ATTACKER_CREATURES_BONUS implemented in Unit::MeleeDamageBonus + &AuraEffect::HandleNULL, //311 0 spells in 3.3 + &AuraEffect::HandleNULL, //312 0 spells in 3.3 + &AuraEffect::HandleNULL, //313 0 spells in 3.3 + &AuraEffect::HandleNULL, //314 1 test spell (reduce duration of silince/magic) + &AuraEffect::HandleNULL, //315 underwater walking + &AuraEffect::HandleNoImmediateEffect, //316 SPELL_AURA_PERIODIC_HASTE implemented in AuraEffect::CalculatePeriodic + &AuraEffect::HandleNULL }; AuraEffect::AuraEffect(Aura * base, uint8 effIndex, int32 *baseAmount, Unit * caster) : @@ -725,9 +736,29 @@ void AuraEffect::CalculatePeriodic(Unit * caster, bool create) return; Player* modOwner = caster ? caster->GetSpellModOwner() : NULL; - //apply casting time mods for channeled spells - if(modOwner && m_amplitude && IsChanneledSpell(m_spellProto)) - modOwner->ModSpellCastTime(m_spellProto, m_amplitude); + // Apply casting time mods + if(modOwner && m_amplitude) + { + // For channeled spells + if (IsChanneledSpell(m_spellProto)) { + modOwner->ModSpellCastTime(m_spellProto, m_amplitude); + } + // For spells that can benefit from haste + else if (modOwner->HasAuraType(SPELL_AURA_PERIODIC_HASTE)) { + const Unit::AuraEffectList &effList = modOwner->GetAuraEffectsByType(SPELL_AURA_PERIODIC_HASTE); + for (Unit::AuraEffectList::const_iterator itr = effList.begin(), end = effList.end(); itr != end; ++itr) + { + if ((*itr)->IsAffectedOnSpell(m_spellProto)) + { + float hasteMod = modOwner->GetFloatValue(UNIT_MOD_CAST_SPEED); + m_amplitude *= hasteMod; + GetBase()->SetMaxDuration(GetBase()->GetMaxDuration() * hasteMod); + GetBase()->SetDuration(GetBase()->GetDuration() * hasteMod); + break; + } + } + } + } // Apply periodic time mod if(modOwner && m_amplitude) @@ -989,7 +1020,7 @@ void AuraEffect::UpdatePeriodic(Unit * caster) break; case 46394: // Brutallus Burn if (m_tickNumber % 11 == 0) - SetAmount(GetAmount() * 2); ; + SetAmount(GetAmount() * 2); break; } break; diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp index 3ca24609a3e..354d79fb723 100644 --- a/src/game/SpellAuras.cpp +++ b/src/game/SpellAuras.cpp @@ -916,7 +916,10 @@ void Aura::HandleAuraSpecificMods(AuraApplication const * aurApp, Unit * caster, case 48020: // Demonic Circle if(target->GetTypeId() == TYPEID_PLAYER) if(GameObject* obj = target->GetGameObject(48018)) + { ((Player*)target)->TeleportTo(obj->GetMapId(),obj->GetPositionX(),obj->GetPositionY(),obj->GetPositionZ(),obj->GetOrientation()); + ((Player*)target)->RemoveMovementImpairingAuras(); + } break; } break; diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index 56eb08e56de..904b275cc25 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -492,7 +492,7 @@ void Spell::SpellDamageSchoolDmg(uint32 effect_idx) { uint32 pdamage = aura->GetAmount() > 0 ? aura->GetAmount() : 0; pdamage = m_caster->SpellDamageBonus(unitTarget, aura->GetSpellProto(), pdamage, DOT, aura->GetBase()->GetStackAmount()); - damage += pdamage * 4; // 4 ticks of 3 seconds = 12 secs + damage += pdamage * aura->GetTotalTicks() * 60 / 100; apply_direct_bonus = false; // Glyph of Conflagrate if (!m_caster->HasAura(56235)) @@ -1979,6 +1979,37 @@ void Spell::EffectDummy(uint32 i) m_caster->CastCustomSpell(unitTarget, 39609, &EffectBasePoints0, NULL, NULL, true, NULL, NULL, m_originalCasterGUID); return; } + // Fire Nova + if (m_spellInfo->SpellIconID == 33) + { + if (!m_caster) + return; + + uint32 triggered_spell_id; + switch(m_spellInfo->Id) + { + case 1535: triggered_spell_id = 8349; break; + case 8498: triggered_spell_id = 8502; break; + case 8499: triggered_spell_id = 8503; break; + case 11314: triggered_spell_id = 11306; break; + case 11315: triggered_spell_id = 11307; break; + case 25546: triggered_spell_id = 25535; break; + case 25547: triggered_spell_id = 25537; break; + case 61649: triggered_spell_id = 61650; break; + case 61657: triggered_spell_id = 61654; break; + default: + break; + } + // fire slot + if (triggered_spell_id && m_caster->m_SummonSlot[1]) + { + Creature* totem = m_caster->GetMap()->GetCreature(m_caster->m_SummonSlot[1]); + if (totem && totem->isTotem()) + totem->CastSpell(totem, triggered_spell_id, true); + return; + } + return; + } // Lava Lash if (m_spellInfo->SpellFamilyFlags[2] & SPELLFAMILYFLAG2_SHAMAN_LAVA_LASH) { @@ -3351,12 +3382,10 @@ void Spell::EffectOpenLock(uint32 effIndex) //CanUseBattleGroundObject() already called in CheckCast() // in battleground check if(BattleGround *bg = player->GetBattleGround()) - { - // check if it's correct bg - if(bg->GetTypeID() == BATTLEGROUND_AB || bg->GetTypeID() == BATTLEGROUND_AV) - bg->EventPlayerClickedOnFlag(player, gameObjTarget); - return; - } + { + bg->EventPlayerClickedOnFlag(player, gameObjTarget); + return; + } } else if (goInfo->type == GAMEOBJECT_TYPE_FLAGSTAND) { @@ -4525,15 +4554,6 @@ void Spell::SpellDamageWeaponDmg(uint32 i) spell_bonus += int32(0.13f*m_caster->SpellBaseDamageBonus(GetSpellSchoolMask(m_spellInfo))); } break; - // Judgement of Blood/of the Martyr backlash damage (33%) - if (m_spellInfo->SpellFamilyFlags[0] & 0x0000000800000000LL && m_spellInfo->SpellIconID==153) - { - int32 damagePoint = m_damage * 33 / 100; - if (m_spellInfo->Id == 31898) - m_caster->CastCustomSpell(m_caster, 32220, &damagePoint, NULL, NULL, true); - else - m_caster->CastCustomSpell(m_caster, 53725, &damagePoint, NULL, NULL, true); - } } case SPELLFAMILY_SHAMAN: { @@ -4552,7 +4572,7 @@ void Spell::SpellDamageWeaponDmg(uint32 i) ((Player*)m_caster)->AddComboPoints(unitTarget,1, this); } // Shred, Maul - Rend and Tear - else if (m_spellInfo->SpellFamilyFlags[0] & 0x00008800 && unitTarget->HasAuraState(AURA_STATE_BLEEDING, m_spellInfo, m_caster)) + else if (m_spellInfo->SpellFamilyFlags[0] & 0x00008800 && unitTarget->HasAuraState(AURA_STATE_BLEEDING)) { if (AuraEffect const* rendAndTear = m_caster->GetDummyAuraEffect(SPELLFAMILY_DRUID, 2859, 0)) { @@ -4723,11 +4743,19 @@ void Spell::EffectHealMaxHealth(uint32 /*i*/) int32 addhealth; if(m_spellInfo->SpellFamilyName == SPELLFAMILY_PALADIN) // Lay on Hands + { + if (m_caster && m_caster->GetGUID() == unitTarget->GetGUID()) + m_caster->CastSpell(m_caster, 25771, true); + addhealth = m_caster->GetMaxHealth(); + } else addhealth = unitTarget->GetMaxHealth() - unitTarget->GetHealth(); if(m_originalCaster) - m_originalCaster->DealHeal(unitTarget, addhealth, m_spellInfo); + { + addhealth=m_originalCaster->SpellHealingBonus(unitTarget,m_spellInfo, addhealth, HEAL); + m_originalCaster->DealHeal(unitTarget, addhealth, m_spellInfo); + } } void Spell::EffectInterruptCast(uint32 i) @@ -7321,7 +7349,7 @@ void Spell::EffectWMODamage(uint32 /*i*/) goft = sFactionTemplateStore.LookupEntry(gameObjTarget->GetUInt32Value(GAMEOBJECT_FACTION)); // Do not allow to damage GO's of friendly factions (ie: Wintergrasp Walls) if (casterft && goft && !casterft->IsFriendlyTo(*goft)) - gameObjTarget->TakenDamage((uint32)damage); + gameObjTarget->TakenDamage((uint32)damage, caster); } } @@ -7442,7 +7470,7 @@ void Spell::EffectRenamePet(uint32 /*eff_idx*/) !((Creature*)unitTarget)->isPet() || ((Pet*)unitTarget)->getPetType() != HUNTER_PET) return; - unitTarget->SetByteValue(UNIT_FIELD_BYTES_2, 2, UNIT_RENAME_ALLOWED); + unitTarget->RemoveByteFlag(UNIT_FIELD_BYTES_2, 2, UNIT_CAN_BE_RENAMED); } void Spell::EffectPlayMusic(uint32 i) diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp index 48d1d325ad2..4c1d2816df4 100644 --- a/src/game/SpellMgr.cpp +++ b/src/game/SpellMgr.cpp @@ -2382,7 +2382,24 @@ bool SpellMgr::IsSpellValid(SpellEntry const *spellInfo, Player *pl, bool msg) case SPELL_EFFECT_CREATE_ITEM: case SPELL_EFFECT_CREATE_ITEM_2: { - if(!ObjectMgr::GetItemPrototype(spellInfo->EffectItemType[i])) + if (spellInfo->EffectItemType[i] == 0) + { + // skip auto-loot crafting spells, its not need explicit item info (but have special fake items sometime) + if (!IsLootCraftingSpell(spellInfo)) + { + if(msg) + { + if(pl) + ChatHandler(pl).PSendSysMessage("Craft spell %u not have create item entry.",spellInfo->Id); + else + sLog.outErrorDb("Craft spell %u not have create item entry.",spellInfo->Id); + } + return false; + } + + } + // also possible IsLootCraftingSpell case but fake item must exist anyway + else if (!ObjectMgr::GetItemPrototype(spellInfo->EffectItemType[i])) { if (msg) { @@ -2814,6 +2831,9 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellEntry const* spellproto // Frostbite if (spellproto->SpellFamilyFlags[1] & 0x80000000) return DIMINISHING_TRIGGER_ROOT; + // Frost Nova, Shatterd Barrier + if (spellproto->SpellFamilyFlags[0] & 0x00080040) + return DIMINISHING_CONTROL_ROOT; break; } case SPELLFAMILY_ROGUE: @@ -2998,6 +3018,18 @@ bool IsDiminishingReturnsGroupDurationLimited(DiminishingGroup group) return false; } +DiminishingLevels GetDiminishingReturnsMaxLevel(DiminishingGroup group) +{ + switch(group) + { + case DIMINISHING_TAUNT: + return DIMINISHING_LEVEL_TAUNT_IMMUNE; + default: + return DIMINISHING_LEVEL_IMMUNE; + } + return DIMINISHING_LEVEL_IMMUNE; +} + DiminishingReturnsType GetDiminishingReturnsGroupType(DiminishingGroup group) { switch(group) @@ -3052,7 +3084,7 @@ bool SpellArea::IsFitToRequirements(Player const* player, uint32 newZone, uint32 if (auraSpell) // not have expected aura if (!player || auraSpell > 0 && !player->HasAura(auraSpell) || auraSpell < 0 && player->HasAura(-auraSpell)) return false; - + // Extra conditions -- leaving the possibility add extra conditions... switch(spellId) { @@ -3253,7 +3285,7 @@ void SpellMgr::LoadSpellRequired() uint32 spell_id = fields[0].GetUInt32(); uint32 spell_req = fields[1].GetUInt32(); - // validate table + // check if chain is made with valid first spell SpellEntry const * spell = sSpellStore.LookupEntry(spell_id); if (!spell) { @@ -3314,7 +3346,7 @@ void SpellMgr::LoadSpellRanks() std::list < std::pair < int32, int32 > > rankChain; int32 currentSpell = -1; int32 lastSpell = -1; - + // fill one chain while(currentSpell == lastSpell && !finished) { diff --git a/src/game/SpellMgr.h b/src/game/SpellMgr.h index 331270bddd6..8fc6c562c22 100644 --- a/src/game/SpellMgr.h +++ b/src/game/SpellMgr.h @@ -127,6 +127,7 @@ enum SpellFamilyFlag SPELLFAMILYFLAG_SHAMAN_MANA_SPRING = 0x00004000, SPELLFAMILYFLAG2_SHAMAN_LAVA_LASH = 0x00000004, SPELLFAMILYFLAG_SHAMAN_FLAMETONGUE = 0x00200000, + SPELLFAMILYFLAG_SHAMAN_FIRE_NOVA = 0x28000000, // Deathknight SPELLFAMILYFLAG_DK_DEATH_STRIKE = 0x00000010, @@ -503,6 +504,7 @@ inline uint32 GetDispellMask(DispelType dispel) DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellEntry const* spellproto, bool triggered); bool IsDiminishingReturnsGroupDurationLimited(DiminishingGroup group); DiminishingReturnsType GetDiminishingReturnsGroupType(DiminishingGroup group); +DiminishingLevels GetDiminishingReturnsMaxLevel(DiminishingGroup group); int32 GetDiminishingReturnsLimitDuration(DiminishingGroup group, SpellEntry const* spellproto); // Spell proc event related declarations (accessed using SpellMgr functions) @@ -574,6 +576,8 @@ enum ProcFlagsEx PROC_EX_ABSORB = 0x0000400, PROC_EX_REFLECT = 0x0000800, PROC_EX_INTERRUPT = 0x0001000, // Melee hit result can be Interrupt (not used) + PROC_EX_FULL_BLOCK = 0x0002000, // block al attack damage + PROC_EX_RESERVED2 = 0x0004000, PROC_EX_NOT_ACTIVE_SPELL = 0x0008000, // Spell mustn't do damage/heal to proc PROC_EX_EX_TRIGGER_ALWAYS = 0x0010000, // If set trigger always no matter of hit result PROC_EX_EX_ONE_TIME_TRIGGER = 0x0020000, // If set trigger always but only one time (not implemented yet) @@ -1267,6 +1271,22 @@ class SpellMgr return true; } + const SpellsRequiringSpellMap GetSpellsRequiringSpell() + { + return this->mSpellsReqSpell; + } + + uint32 GetSpellRequired(uint32 spell_id) const + { + SpellRequiredMap::const_iterator itr = mSpellReq.find(spell_id); + + if(itr == mSpellReq.end()) + return NULL; + + return itr->second; + } + + // Modifiers public: static SpellMgr& Instance(); diff --git a/src/game/Totem.cpp b/src/game/Totem.cpp index 0358cc0c990..6b277136444 100644 --- a/src/game/Totem.cpp +++ b/src/game/Totem.cpp @@ -73,6 +73,24 @@ void Totem::InitStats(uint32 duration) display_id = cinfo->Modelid3; else display_id = cinfo->Modelid1; + + switch (((Player*)m_owner)->getRace()) + { + case RACE_ORC: + if (cinfo->Modelid2) + display_id = cinfo->Modelid2; + else + display_id = cinfo->Modelid1; + break; + case RACE_TROLL: + if (cinfo->Modelid4) + display_id = cinfo->Modelid4; + else + display_id = cinfo->Modelid1; + break; + default: + break; + } break; default: break; diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 3454928fc88..60eadb288a5 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -228,6 +228,10 @@ void Unit::Update(uint32 p_time) // Spells must be processed with event system BEFORE they go to _UpdateSpells. // Or else we may have some SPELL_STATE_FINISHED spells stalled in pointers, that is bad. m_Events.Update(p_time); + + if (!IsInWorld()) + return; + _UpdateSpells(p_time); // If this is set during update SetCantProc(false) call is missing somewhere in the code @@ -519,8 +523,9 @@ void Unit::GetRandomContactPoint(const Unit* obj, float &x, float &y, float &z, void Unit::UpdateInterruptMask() { m_interruptMask = 0; - for (AuraApplicationList::const_iterator i = m_interruptableAuras.begin(); i != m_interruptableAuras.end(); ++i) - m_interruptMask |= (*i)->GetBase()->GetSpellProto()->AuraInterruptFlags; + for(AuraApplicationList::const_iterator i = m_interruptableAuras.begin(); i != m_interruptableAuras.end(); ++i) + if (*i && (*i)->GetBase() && (*i)->GetBase()->GetSpellProto()) + m_interruptMask |= (*i)->GetBase()->GetSpellProto()->AuraInterruptFlags; if (Spell* spell = m_currentSpells[CURRENT_CHANNELED_SPELL]) if (spell->getState() == SPELL_STATE_CASTING) @@ -1390,6 +1395,7 @@ void Unit::CalculateMeleeDamage(Unit *pVictim, uint32 damage, CalcDamageInfo *da { damageInfo->TargetState = VICTIMSTATE_BLOCKS; damageInfo->blocked_amount = damageInfo->damage; + damageInfo->procEx |= PROC_EX_FULL_BLOCK; } else damageInfo->procEx |= PROC_EX_NORMAL_HIT; @@ -3156,7 +3162,12 @@ float Unit::GetUnitCriticalChance(WeaponAttackType attackType, const Unit *pVict // reduce crit chance from Rating for players if (attackType != RANGED_ATTACK) + { crit -= pVictim->GetMeleeCritChanceReduction(); + // Glyph of barkskin + if (pVictim->HasAura(63057) && pVictim->HasAura(22812)) + crit-=25.0f; + } else crit -= pVictim->GetRangedCritChanceReduction(); @@ -5285,19 +5296,6 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, AuraEffect* trigger } return false; } - // Improved Divine Spirit - case 33174: - case 33182: - { - int32 spelldmg = CalculateSpellDamage(procSpell, 0, procSpell->EffectBasePoints[0],pVictim); - if (AuraEffect * Aur = pVictim->GetAuraEffect(procSpell->Id, effIndex+1, triggeredByAura->GetCasterGUID())) - { - // Remove aura mods - Aur->ChangeAmount(Aur->GetAmount() + spelldmg); - return true; - } - return false; - } // Eye for an Eye case 9799: case 25988: @@ -5808,23 +5806,6 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, AuraEffect* trigger triggered_spell_id = 12654; break; } - // Combustion - case 11129: - { - Unit *caster = triggeredByAura->GetCaster(); - if (!caster || !damage) - return false; - - //last charge and crit - if (triggeredByAura->GetBase()->GetCharges() <= 1 && (procEx & PROC_EX_CRITICAL_HIT) ) - { - RemoveAurasDueToSpell(28682); //-> remove Combustion auras - return true; // charge counting (will removed) - } - - CastSpell(this, 28682, true, castItem, triggeredByAura); - return (procEx & PROC_EX_CRITICAL_HIT);// charge update only at crit hits, no hidden cooldowns - } // Glyph of Ice Block case 56372: { @@ -6142,14 +6123,10 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, AuraEffect* trigger if(!pVictim || !pVictim->isAlive()) return false; - // pVictim is caster of aura - if(triggeredByAura->GetCasterGUID() != pVictim->GetGUID()) - return false; - // heal amount int32 team = triggerAmount*damage/500; int32 self = triggerAmount*damage/100 - team; - pVictim->CastCustomSpell(pVictim,15290,&team,&self,NULL,true,castItem,triggeredByAura); + CastCustomSpell(this,15290,&team,&self,NULL,true,castItem,triggeredByAura); return true; // no hidden cooldown } // Priest Tier 6 Trinket (Ashtongue Talisman of Acumen) @@ -6242,6 +6219,27 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, AuraEffect* trigger triggered_spell_id = 28810; break; } + // Earthen Power (Rank 1, 2) + case 51523: + case 51524: + { + // Totem itself must be a caster of this spell + Unit* caster = NULL; + for (ControlList::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr) + { + if ((*itr)->GetEntry() != 2630) + continue; + + caster = (*itr); + break; + } + + if (!caster) + return false; + + caster->CastSpell(caster, 59566, true, castItem, triggeredByAura, originalCaster); + return true; + } } break; } @@ -6731,7 +6729,9 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, AuraEffect* trigger if(effIndex != 0) // effect 1,2 used by seal unleashing code return false; - triggered_spell_id = 31803; + // At melee attack or Hammer of the Righteous spell damage considered as melee attack + if ((procFlag & PROC_FLAG_SUCCESSFUL_MELEE_HIT) || (procSpell && procSpell->Id == 53595) ) + triggered_spell_id = 31803; // On target with 5 stacks of Holy Vengeance direct damage is done if (Aura * aur = pVictim->GetAura(triggered_spell_id, GetGUID())) { @@ -6754,7 +6754,9 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, AuraEffect* trigger if(effIndex != 0) // effect 1,2 used by seal unleashing code return false; - triggered_spell_id = 53742; + // At melee attack or Hammer of the Righteous spell damage considered as melee attack + if ((procFlag & PROC_FLAG_SUCCESSFUL_MELEE_HIT) || (procSpell && procSpell->Id == 53595)) + triggered_spell_id = 53742; // On target with 5 stacks of Blood Corruption direct damage is done if (Aura * aur = pVictim->GetAura(triggered_spell_id, GetGUID())) { @@ -6849,16 +6851,6 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, AuraEffect* trigger { switch(dummySpell->Id) { - // Improved fire nova totem - case 16086: - case 16544: - triggered_spell_id = 51880; - break; - // Earthen Power (Rank 1, 2) - case 51523: - case 51524: - triggered_spell_id = 63532; - break; // Tidal Force case 55198: { @@ -7150,7 +7142,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, AuraEffect* trigger return false; // Water Shield - if (AuraEffect const * aurEff = GetAuraEffect(SPELL_AURA_PROC_TRIGGER_SPELL, SPELLFAMILY_SHAMAN, 0, 0x00000020)) + if (AuraEffect const * aurEff = GetAuraEffect(SPELL_AURA_PROC_TRIGGER_SPELL, SPELLFAMILY_SHAMAN, 0, 0x00000020, 0)) { uint32 spell = aurEff->GetSpellProto()->EffectTriggerSpell[aurEff->GetEffIndex()]; CastSpell(this, spell, true, castItem, triggeredByAura); @@ -7231,6 +7223,11 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, AuraEffect* trigger if (AuraEffect const * aurEff = GetAuraEffect(SPELL_AURA_PROC_TRIGGER_SPELL, SPELLFAMILY_SHAMAN, 0x400, 0, 0)) { uint32 spell = spellmgr.GetSpellWithRank(26364, spellmgr.GetSpellRank(aurEff->GetId())); + + // custom cooldown processing case + if (GetTypeId() == TYPEID_PLAYER && ((Player*)this)->HasSpellCooldown(spell)) + ((Player*)this)->RemoveSpellCooldown(spell); + CastSpell(target, spell, true, castItem, triggeredByAura); aurEff->GetBase()->DropCharge(); return true; @@ -7296,6 +7293,13 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, AuraEffect* trigger triggered_spell_id = 61607; break; } + // Unholy Blight + if (dummySpell->Id == 49194) + { + basepoints0 = triggerAmount * damage / 100; + triggered_spell_id = 50536; + break; + } // Vendetta if (dummySpell->SpellFamilyFlags[0] & 0x10000) { @@ -7632,6 +7636,46 @@ bool Unit::HandleAuraProc(Unit *pVictim, uint32 damage, Aura * triggeredByAura, switch(dummySpell->SpellFamilyName) { + case SPELLFAMILY_MAGE: + { + // Combustion + switch (dummySpell->Id) + { + case 11129: + { + *handled = true; + Unit *caster = triggeredByAura->GetCaster(); + if (!caster || !damage) + return false; + + //last charge and crit + if (triggeredByAura->GetCharges() <= 1 && (procEx & PROC_EX_CRITICAL_HIT) ) + { + RemoveAurasDueToSpell(28682); //-> remove Combustion auras + return true; // charge counting (will removed) + } + + this->CastSpell(this, 28682, true); + return false; // ordinary chrages will be removed during crit chance computations. + } + // Empowered Fire + case 31656: + case 31657: + case 31658: + { + *handled = true; + + SpellEntry const *spInfo = sSpellStore.LookupEntry(67545); + if (!spInfo) + return false; + + int32 bp0 = this->GetCreateMana() * spInfo->CalculateSimpleValue(0) / 100; + this->CastCustomSpell(this, 67545, &bp0, NULL, NULL, true, NULL, triggeredByAura->GetEffect(0), this->GetGUID()); + return true; + } + } + break; + } case SPELLFAMILY_DEATHKNIGHT: { // Blood of the North @@ -8135,6 +8179,13 @@ bool Unit::HandleProcTriggerSpell(Unit *pVictim, uint32 damage, AuraEffect* trig trigger_spell_id = 26470; break; } + // Unyielding Knights (item exploit 29108\29109) + case 38164: + { + if(pVictim->GetEntry() != 19457) // Proc only if you target is Grillok + return false; + break; + } // Deflection case 52420: { @@ -8284,17 +8335,6 @@ bool Unit::HandleProcTriggerSpell(Unit *pVictim, uint32 damage, AuraEffect* trig // Need add combopoint AFTER finish movie (or they dropped in finish phase) break; } - case 22959: - { - // Glyph of Improved Scorch - if (AuraEffect * aurEff = GetAuraEffect(56371,0)) - { - for (int32 count = aurEff->GetAmount(); count>0; count--) - CastSpell(pVictim, 22959, true); - return true; - } - break; - } // Bloodthirst (($m/100)% of max health) case 23880: { @@ -10296,8 +10336,10 @@ bool Unit::isSpellCrit(Unit *pVictim, SpellEntry const *spellProto, SpellSchoolM switch(spellProto->SpellFamilyName) { case SPELLFAMILY_DRUID: - // Rend and Tear - bonus crit chance for bleeding targets of Ferocious Bite - if (spellProto->SpellFamilyFlags[0] & 0x00800000 && pVictim->HasAuraState(AURA_STATE_BLEEDING, spellProto, this)) + // Rend and Tear - bonus crit chance for Ferocious Bite on bleeding targets + if (spellProto->SpellFamilyFlags[0] & 0x00800000 + && spellProto->SpellIconID == 1680 + && pVictim->HasAuraState(AURA_STATE_BLEEDING)) { if (AuraEffect const *rendAndTear = GetDummyAuraEffect(SPELLFAMILY_DRUID, 2859, 1)) crit_chance += rendAndTear->GetAmount(); @@ -10891,7 +10933,18 @@ void Unit::MeleeDamageBonus(Unit *pVictim, uint32 *pdamage, WeaponAttackType att // ..done (base at attack power for marked target and base at attack power for creature type) int32 APbonus = 0; - if (attType == RANGED_ATTACK) + + if (attType == RANGED_ATTACK && pVictim->GetTypeId() == TYPEID_UNIT) + { + APbonus += pVictim->GetTotalAuraModifier(SPELL_AURA_RANGED_AP_ATTACKER_CREATURES_BONUS); + + // ..done (base at attack power and creature type) + AuraEffectList const& mCreatureAttackPower = GetAuraEffectsByType(SPELL_AURA_MOD_RANGED_ATTACK_POWER_VERSUS); + for (AuraEffectList::const_iterator i = mCreatureAttackPower.begin(); i != mCreatureAttackPower.end(); ++i) + if (creatureTypeMask & uint32((*i)->GetMiscValue())) + APbonus += (*i)->GetAmount(); + } + else if (attType == RANGED_ATTACK) { APbonus += pVictim->GetTotalAuraModifier(SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS); @@ -11390,7 +11443,7 @@ void Unit::ClearInCombat() if (GetTypeId() != TYPEID_PLAYER) { clearUnitState(UNIT_STAT_ATTACK_PLAYER); - if (HasFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_OTHER_TAGGER)) + if (HasFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_TAPPED)) SetUInt32Value(UNIT_DYNAMIC_FLAGS, ((Creature*)this)->GetCreatureInfo()->dynamicflags); } else @@ -12416,7 +12469,7 @@ void Unit::IncrDiminishing(DiminishingGroup group) { if (i->DRGroup != group) continue; - if (i->hitCount < DIMINISHING_LEVEL_IMMUNE) + if (i->hitCount < GetDiminishingReturnsMaxLevel(group)) i->hitCount += 1; return; } @@ -12425,7 +12478,7 @@ void Unit::IncrDiminishing(DiminishingGroup group) void Unit::ApplyDiminishingToDuration(DiminishingGroup group, int32 &duration,Unit* caster,DiminishingLevels Level, int32 limitduration) { - if (duration == -1 || group == DIMINISHING_NONE || (caster->IsFriendlyTo(this) && caster != this)) + if (duration == -1 || group == DIMINISHING_NONE || caster->IsFriendlyTo(this)) return; // test pet/charm masters instead pets/charmeds @@ -12438,14 +12491,35 @@ void Unit::ApplyDiminishingToDuration(DiminishingGroup group, int32 &duration,Un Unit const* target = targetOwner ? targetOwner : this; Unit const* source = casterOwner ? casterOwner : caster; - if (target->GetTypeId() == TYPEID_PLAYER && source->GetTypeId() == TYPEID_PLAYER) + if ((target->GetTypeId() == TYPEID_PLAYER + || ((Creature*)target)->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_ALL_DIMINISH) + && source->GetTypeId() == TYPEID_PLAYER) duration = limitduration; } float mod = 1.0f; + if (group == DIMINISHING_TAUNT) + { + if(GetTypeId() == TYPEID_UNIT && (((Creature*)this)->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_TAUNT_DIMINISH)) + { + DiminishingLevels diminish = Level; + switch(diminish) + { + case DIMINISHING_LEVEL_1: break; + case DIMINISHING_LEVEL_2: mod = 0.65f; break; + case DIMINISHING_LEVEL_3: mod = 0.4225f; break; + case DIMINISHING_LEVEL_4: mod = 0.274625f; break; + case DIMINISHING_LEVEL_TAUNT_IMMUNE: mod = 0.0f; break; + default: break; + } + } + } // Some diminishings applies to mobs too (for example, Stun) - if ((GetDiminishingReturnsGroupType(group) == DRTYPE_PLAYER && (targetOwner ? (targetOwner->GetTypeId() == TYPEID_PLAYER) : (GetTypeId() == TYPEID_PLAYER))) || GetDiminishingReturnsGroupType(group) == DRTYPE_ALL) + else if ((GetDiminishingReturnsGroupType(group) == DRTYPE_PLAYER + && ((targetOwner ? (targetOwner->GetTypeId() == TYPEID_PLAYER) : (GetTypeId() == TYPEID_PLAYER)) + || (GetTypeId() == TYPEID_UNIT && ((Creature*)this)->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_ALL_DIMINISH))) + || GetDiminishingReturnsGroupType(group) == DRTYPE_ALL) { DiminishingLevels diminish = Level; switch(diminish) @@ -13381,6 +13455,7 @@ bool InitTriggerAuraData() isNonTriggerAura[SPELL_AURA_MOD_POWER_REGEN]=true; isNonTriggerAura[SPELL_AURA_REDUCE_PUSHBACK]=true; + isTriggerAura[SPELL_AURA_RANGED_AP_ATTACKER_CREATURES_BONUS] = true; return true; } @@ -15444,10 +15519,10 @@ float Unit::GetCombatRatingReduction(CombatRating cr) const return ((Player const*)this)->GetRatingBonusValue(cr); else if (((Creature const*)this)->isPet()) { - // Player's pet have 0.4 resilience from owner + // Player's pet get resilience from owner if (Unit* owner = GetOwner()) if(owner->GetTypeId() == TYPEID_PLAYER) - return ((Player*)owner)->GetRatingBonusValue(cr) * 0.4f; + return ((Player*)owner)->GetRatingBonusValue(cr); } return 0.0f; diff --git a/src/game/Unit.h b/src/game/Unit.h index 45644700b04..1390d9eb09e 100644 --- a/src/game/Unit.h +++ b/src/game/Unit.h @@ -244,8 +244,8 @@ enum UnitPVPStateFlags // byte (2 from 0..3) of UNIT_FIELD_BYTES_2 enum UnitRename { - UNIT_RENAME_NOT_ALLOWED = 0x02, - UNIT_RENAME_ALLOWED = 0x03 + UNIT_CAN_BE_RENAMED = 0x01, + UNIT_CAN_BE_ABANDONED = 0x02, }; #define CREATURE_MAX_SPELLS 8 @@ -775,7 +775,9 @@ enum DiminishingLevels DIMINISHING_LEVEL_1 = 0, DIMINISHING_LEVEL_2 = 1, DIMINISHING_LEVEL_3 = 2, - DIMINISHING_LEVEL_IMMUNE = 3 + DIMINISHING_LEVEL_IMMUNE = 3, + DIMINISHING_LEVEL_4 = 3, + DIMINISHING_LEVEL_TAUNT_IMMUNE = 4, }; struct DiminishingReturn diff --git a/src/game/UpdateFields.h b/src/game/UpdateFields.h index 8c2e0310c30..c18ffef8d18 100644 --- a/src/game/UpdateFields.h +++ b/src/game/UpdateFields.h @@ -21,414 +21,417 @@ #ifndef _UPDATEFIELDS_AUTO_H #define _UPDATEFIELDS_AUTO_H -// Auto generated for version 3, 2, 2, 10505 +// Auto generated for version 3, 3, 0, 11159 + enum EObjectFields { - OBJECT_FIELD_GUID = 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC - OBJECT_FIELD_TYPE = 0x0002, // Size: 1, Type: INT, Flags: PUBLIC - OBJECT_FIELD_ENTRY = 0x0003, // Size: 1, Type: INT, Flags: PUBLIC - OBJECT_FIELD_SCALE_X = 0x0004, // Size: 1, Type: FLOAT, Flags: PUBLIC - OBJECT_FIELD_PADDING = 0x0005, // Size: 1, Type: INT, Flags: NONE - OBJECT_END = 0x0006, + OBJECT_FIELD_GUID = 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC + OBJECT_FIELD_TYPE = 0x0002, // Size: 1, Type: INT, Flags: PUBLIC + OBJECT_FIELD_ENTRY = 0x0003, // Size: 1, Type: INT, Flags: PUBLIC + OBJECT_FIELD_SCALE_X = 0x0004, // Size: 1, Type: FLOAT, Flags: PUBLIC + OBJECT_FIELD_PADDING = 0x0005, // Size: 1, Type: INT, Flags: NONE + OBJECT_END = 0x0006, }; enum EItemFields { - ITEM_FIELD_OWNER = OBJECT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC - ITEM_FIELD_CONTAINED = OBJECT_END + 0x0002, // Size: 2, Type: LONG, Flags: PUBLIC - ITEM_FIELD_CREATOR = OBJECT_END + 0x0004, // Size: 2, Type: LONG, Flags: PUBLIC - ITEM_FIELD_GIFTCREATOR = OBJECT_END + 0x0006, // Size: 2, Type: LONG, Flags: PUBLIC - ITEM_FIELD_STACK_COUNT = OBJECT_END + 0x0008, // Size: 1, Type: INT, Flags: OWNER, ITEM_OWNER - ITEM_FIELD_DURATION = OBJECT_END + 0x0009, // Size: 1, Type: INT, Flags: OWNER, ITEM_OWNER - ITEM_FIELD_SPELL_CHARGES = OBJECT_END + 0x000A, // Size: 5, Type: INT, Flags: OWNER, ITEM_OWNER - ITEM_FIELD_FLAGS = OBJECT_END + 0x000F, // Size: 1, Type: INT, Flags: PUBLIC - ITEM_FIELD_ENCHANTMENT_1_1 = OBJECT_END + 0x0010, // Size: 2, Type: INT, Flags: PUBLIC - ITEM_FIELD_ENCHANTMENT_1_3 = OBJECT_END + 0x0012, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - ITEM_FIELD_ENCHANTMENT_2_1 = OBJECT_END + 0x0013, // Size: 2, Type: INT, Flags: PUBLIC - ITEM_FIELD_ENCHANTMENT_2_3 = OBJECT_END + 0x0015, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - ITEM_FIELD_ENCHANTMENT_3_1 = OBJECT_END + 0x0016, // Size: 2, Type: INT, Flags: PUBLIC - ITEM_FIELD_ENCHANTMENT_3_3 = OBJECT_END + 0x0018, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - ITEM_FIELD_ENCHANTMENT_4_1 = OBJECT_END + 0x0019, // Size: 2, Type: INT, Flags: PUBLIC - ITEM_FIELD_ENCHANTMENT_4_3 = OBJECT_END + 0x001B, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - ITEM_FIELD_ENCHANTMENT_5_1 = OBJECT_END + 0x001C, // Size: 2, Type: INT, Flags: PUBLIC - ITEM_FIELD_ENCHANTMENT_5_3 = OBJECT_END + 0x001E, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - ITEM_FIELD_ENCHANTMENT_6_1 = OBJECT_END + 0x001F, // Size: 2, Type: INT, Flags: PUBLIC - ITEM_FIELD_ENCHANTMENT_6_3 = OBJECT_END + 0x0021, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - ITEM_FIELD_ENCHANTMENT_7_1 = OBJECT_END + 0x0022, // Size: 2, Type: INT, Flags: PUBLIC - ITEM_FIELD_ENCHANTMENT_7_3 = OBJECT_END + 0x0024, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - ITEM_FIELD_ENCHANTMENT_8_1 = OBJECT_END + 0x0025, // Size: 2, Type: INT, Flags: PUBLIC - ITEM_FIELD_ENCHANTMENT_8_3 = OBJECT_END + 0x0027, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - ITEM_FIELD_ENCHANTMENT_9_1 = OBJECT_END + 0x0028, // Size: 2, Type: INT, Flags: PUBLIC - ITEM_FIELD_ENCHANTMENT_9_3 = OBJECT_END + 0x002A, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - ITEM_FIELD_ENCHANTMENT_10_1 = OBJECT_END + 0x002B, // Size: 2, Type: INT, Flags: PUBLIC - ITEM_FIELD_ENCHANTMENT_10_3 = OBJECT_END + 0x002D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - ITEM_FIELD_ENCHANTMENT_11_1 = OBJECT_END + 0x002E, // Size: 2, Type: INT, Flags: PUBLIC - ITEM_FIELD_ENCHANTMENT_11_3 = OBJECT_END + 0x0030, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - ITEM_FIELD_ENCHANTMENT_12_1 = OBJECT_END + 0x0031, // Size: 2, Type: INT, Flags: PUBLIC - ITEM_FIELD_ENCHANTMENT_12_3 = OBJECT_END + 0x0033, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - ITEM_FIELD_PROPERTY_SEED = OBJECT_END + 0x0034, // Size: 1, Type: INT, Flags: PUBLIC - ITEM_FIELD_RANDOM_PROPERTIES_ID = OBJECT_END + 0x0035, // Size: 1, Type: INT, Flags: PUBLIC - ITEM_FIELD_ITEM_TEXT_ID = OBJECT_END + 0x0036, // Size: 1, Type: INT, Flags: OWNER - ITEM_FIELD_DURABILITY = OBJECT_END + 0x0037, // Size: 1, Type: INT, Flags: OWNER, ITEM_OWNER - ITEM_FIELD_MAXDURABILITY = OBJECT_END + 0x0038, // Size: 1, Type: INT, Flags: OWNER, ITEM_OWNER - ITEM_FIELD_CREATE_PLAYED_TIME = OBJECT_END + 0x0039, // Size: 1, Type: INT, Flags: PUBLIC - ITEM_END = OBJECT_END + 0x003A, + ITEM_FIELD_OWNER = OBJECT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC + ITEM_FIELD_CONTAINED = OBJECT_END + 0x0002, // Size: 2, Type: LONG, Flags: PUBLIC + ITEM_FIELD_CREATOR = OBJECT_END + 0x0004, // Size: 2, Type: LONG, Flags: PUBLIC + ITEM_FIELD_GIFTCREATOR = OBJECT_END + 0x0006, // Size: 2, Type: LONG, Flags: PUBLIC + ITEM_FIELD_STACK_COUNT = OBJECT_END + 0x0008, // Size: 1, Type: INT, Flags: OWNER, ITEM_OWNER + ITEM_FIELD_DURATION = OBJECT_END + 0x0009, // Size: 1, Type: INT, Flags: OWNER, ITEM_OWNER + ITEM_FIELD_SPELL_CHARGES = OBJECT_END + 0x000A, // Size: 5, Type: INT, Flags: OWNER, ITEM_OWNER + ITEM_FIELD_FLAGS = OBJECT_END + 0x000F, // Size: 1, Type: INT, Flags: PUBLIC + ITEM_FIELD_ENCHANTMENT_1_1 = OBJECT_END + 0x0010, // Size: 2, Type: INT, Flags: PUBLIC + ITEM_FIELD_ENCHANTMENT_1_3 = OBJECT_END + 0x0012, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + ITEM_FIELD_ENCHANTMENT_2_1 = OBJECT_END + 0x0013, // Size: 2, Type: INT, Flags: PUBLIC + ITEM_FIELD_ENCHANTMENT_2_3 = OBJECT_END + 0x0015, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + ITEM_FIELD_ENCHANTMENT_3_1 = OBJECT_END + 0x0016, // Size: 2, Type: INT, Flags: PUBLIC + ITEM_FIELD_ENCHANTMENT_3_3 = OBJECT_END + 0x0018, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + ITEM_FIELD_ENCHANTMENT_4_1 = OBJECT_END + 0x0019, // Size: 2, Type: INT, Flags: PUBLIC + ITEM_FIELD_ENCHANTMENT_4_3 = OBJECT_END + 0x001B, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + ITEM_FIELD_ENCHANTMENT_5_1 = OBJECT_END + 0x001C, // Size: 2, Type: INT, Flags: PUBLIC + ITEM_FIELD_ENCHANTMENT_5_3 = OBJECT_END + 0x001E, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + ITEM_FIELD_ENCHANTMENT_6_1 = OBJECT_END + 0x001F, // Size: 2, Type: INT, Flags: PUBLIC + ITEM_FIELD_ENCHANTMENT_6_3 = OBJECT_END + 0x0021, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + ITEM_FIELD_ENCHANTMENT_7_1 = OBJECT_END + 0x0022, // Size: 2, Type: INT, Flags: PUBLIC + ITEM_FIELD_ENCHANTMENT_7_3 = OBJECT_END + 0x0024, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + ITEM_FIELD_ENCHANTMENT_8_1 = OBJECT_END + 0x0025, // Size: 2, Type: INT, Flags: PUBLIC + ITEM_FIELD_ENCHANTMENT_8_3 = OBJECT_END + 0x0027, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + ITEM_FIELD_ENCHANTMENT_9_1 = OBJECT_END + 0x0028, // Size: 2, Type: INT, Flags: PUBLIC + ITEM_FIELD_ENCHANTMENT_9_3 = OBJECT_END + 0x002A, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + ITEM_FIELD_ENCHANTMENT_10_1 = OBJECT_END + 0x002B, // Size: 2, Type: INT, Flags: PUBLIC + ITEM_FIELD_ENCHANTMENT_10_3 = OBJECT_END + 0x002D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + ITEM_FIELD_ENCHANTMENT_11_1 = OBJECT_END + 0x002E, // Size: 2, Type: INT, Flags: PUBLIC + ITEM_FIELD_ENCHANTMENT_11_3 = OBJECT_END + 0x0030, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + ITEM_FIELD_ENCHANTMENT_12_1 = OBJECT_END + 0x0031, // Size: 2, Type: INT, Flags: PUBLIC + ITEM_FIELD_ENCHANTMENT_12_3 = OBJECT_END + 0x0033, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + ITEM_FIELD_PROPERTY_SEED = OBJECT_END + 0x0034, // Size: 1, Type: INT, Flags: PUBLIC + ITEM_FIELD_RANDOM_PROPERTIES_ID = OBJECT_END + 0x0035, // Size: 1, Type: INT, Flags: PUBLIC + ITEM_FIELD_ITEM_TEXT_ID = OBJECT_END + 0x0036, // Size: 1, Type: INT, Flags: OWNER + ITEM_FIELD_DURABILITY = OBJECT_END + 0x0037, // Size: 1, Type: INT, Flags: OWNER, ITEM_OWNER + ITEM_FIELD_MAXDURABILITY = OBJECT_END + 0x0038, // Size: 1, Type: INT, Flags: OWNER, ITEM_OWNER + ITEM_FIELD_CREATE_PLAYED_TIME = OBJECT_END + 0x0039, // Size: 1, Type: INT, Flags: PUBLIC + ITEM_END = OBJECT_END + 0x003A, }; enum EContainerFields { - CONTAINER_FIELD_NUM_SLOTS = ITEM_END + 0x0000, // Size: 1, Type: INT, Flags: PUBLIC - CONTAINER_ALIGN_PAD = ITEM_END + 0x0001, // Size: 1, Type: BYTES, Flags: NONE - CONTAINER_FIELD_SLOT_1 = ITEM_END + 0x0002, // Size: 72, Type: LONG, Flags: PUBLIC - CONTAINER_END = ITEM_END + 0x004A, + CONTAINER_FIELD_NUM_SLOTS = ITEM_END + 0x0000, // Size: 1, Type: INT, Flags: PUBLIC + CONTAINER_ALIGN_PAD = ITEM_END + 0x0001, // Size: 1, Type: BYTES, Flags: NONE + CONTAINER_FIELD_SLOT_1 = ITEM_END + 0x0002, // Size: 72, Type: LONG, Flags: PUBLIC + CONTAINER_END = ITEM_END + 0x004A, }; enum EUnitFields { - UNIT_FIELD_CHARM = OBJECT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC - UNIT_FIELD_SUMMON = OBJECT_END + 0x0002, // Size: 2, Type: LONG, Flags: PUBLIC - UNIT_FIELD_CRITTER = OBJECT_END + 0x0004, // Size: 2, Type: LONG, Flags: PRIVATE - UNIT_FIELD_CHARMEDBY = OBJECT_END + 0x0006, // Size: 2, Type: LONG, Flags: PUBLIC - UNIT_FIELD_SUMMONEDBY = OBJECT_END + 0x0008, // Size: 2, Type: LONG, Flags: PUBLIC - UNIT_FIELD_CREATEDBY = OBJECT_END + 0x000A, // Size: 2, Type: LONG, Flags: PUBLIC - UNIT_FIELD_TARGET = OBJECT_END + 0x000C, // Size: 2, Type: LONG, Flags: PUBLIC - UNIT_FIELD_CHANNEL_OBJECT = OBJECT_END + 0x000E, // Size: 2, Type: LONG, Flags: PUBLIC - UNIT_FIELD_BYTES_0 = OBJECT_END + 0x0010, // Size: 1, Type: BYTES, Flags: PUBLIC - UNIT_FIELD_HEALTH = OBJECT_END + 0x0011, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_POWER1 = OBJECT_END + 0x0012, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_POWER2 = OBJECT_END + 0x0013, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_POWER3 = OBJECT_END + 0x0014, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_POWER4 = OBJECT_END + 0x0015, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_POWER5 = OBJECT_END + 0x0016, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_POWER6 = OBJECT_END + 0x0017, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_POWER7 = OBJECT_END + 0x0018, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_MAXHEALTH = OBJECT_END + 0x0019, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_MAXPOWER1 = OBJECT_END + 0x001A, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_MAXPOWER2 = OBJECT_END + 0x001B, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_MAXPOWER3 = OBJECT_END + 0x001C, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_MAXPOWER4 = OBJECT_END + 0x001D, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_MAXPOWER5 = OBJECT_END + 0x001E, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_MAXPOWER6 = OBJECT_END + 0x001F, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_MAXPOWER7 = OBJECT_END + 0x0020, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER = OBJECT_END + 0x0021, // Size: 7, Type: FLOAT, Flags: PRIVATE, OWNER + UNIT_FIELD_CHARM = OBJECT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC + UNIT_FIELD_SUMMON = OBJECT_END + 0x0002, // Size: 2, Type: LONG, Flags: PUBLIC + UNIT_FIELD_CRITTER = OBJECT_END + 0x0004, // Size: 2, Type: LONG, Flags: PRIVATE + UNIT_FIELD_CHARMEDBY = OBJECT_END + 0x0006, // Size: 2, Type: LONG, Flags: PUBLIC + UNIT_FIELD_SUMMONEDBY = OBJECT_END + 0x0008, // Size: 2, Type: LONG, Flags: PUBLIC + UNIT_FIELD_CREATEDBY = OBJECT_END + 0x000A, // Size: 2, Type: LONG, Flags: PUBLIC + UNIT_FIELD_TARGET = OBJECT_END + 0x000C, // Size: 2, Type: LONG, Flags: PUBLIC + UNIT_FIELD_CHANNEL_OBJECT = OBJECT_END + 0x000E, // Size: 2, Type: LONG, Flags: PUBLIC + UNIT_FIELD_BYTES_0 = OBJECT_END + 0x0010, // Size: 1, Type: BYTES, Flags: PUBLIC + UNIT_FIELD_HEALTH = OBJECT_END + 0x0011, // Size: 1, Type: INT, Flags: PUBLIC + UNIT_FIELD_POWER1 = OBJECT_END + 0x0012, // Size: 1, Type: INT, Flags: PUBLIC + UNIT_FIELD_POWER2 = OBJECT_END + 0x0013, // Size: 1, Type: INT, Flags: PUBLIC + UNIT_FIELD_POWER3 = OBJECT_END + 0x0014, // Size: 1, Type: INT, Flags: PUBLIC + UNIT_FIELD_POWER4 = OBJECT_END + 0x0015, // Size: 1, Type: INT, Flags: PUBLIC + UNIT_FIELD_POWER5 = OBJECT_END + 0x0016, // Size: 1, Type: INT, Flags: PUBLIC + UNIT_FIELD_POWER6 = OBJECT_END + 0x0017, // Size: 1, Type: INT, Flags: PUBLIC + UNIT_FIELD_POWER7 = OBJECT_END + 0x0018, // Size: 1, Type: INT, Flags: PUBLIC + UNIT_FIELD_MAXHEALTH = OBJECT_END + 0x0019, // Size: 1, Type: INT, Flags: PUBLIC + UNIT_FIELD_MAXPOWER1 = OBJECT_END + 0x001A, // Size: 1, Type: INT, Flags: PUBLIC + UNIT_FIELD_MAXPOWER2 = OBJECT_END + 0x001B, // Size: 1, Type: INT, Flags: PUBLIC + UNIT_FIELD_MAXPOWER3 = OBJECT_END + 0x001C, // Size: 1, Type: INT, Flags: PUBLIC + UNIT_FIELD_MAXPOWER4 = OBJECT_END + 0x001D, // Size: 1, Type: INT, Flags: PUBLIC + UNIT_FIELD_MAXPOWER5 = OBJECT_END + 0x001E, // Size: 1, Type: INT, Flags: PUBLIC + UNIT_FIELD_MAXPOWER6 = OBJECT_END + 0x001F, // Size: 1, Type: INT, Flags: PUBLIC + UNIT_FIELD_MAXPOWER7 = OBJECT_END + 0x0020, // Size: 1, Type: INT, Flags: PUBLIC + UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER = OBJECT_END + 0x0021, // Size: 7, Type: FLOAT, Flags: PRIVATE, OWNER UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER = OBJECT_END + 0x0028, // Size: 7, Type: FLOAT, Flags: PRIVATE, OWNER - UNIT_FIELD_LEVEL = OBJECT_END + 0x002F, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_FACTIONTEMPLATE = OBJECT_END + 0x0030, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_VIRTUAL_ITEM_SLOT_ID = OBJECT_END + 0x0031, // Size: 3, Type: INT, Flags: PUBLIC - UNIT_FIELD_FLAGS = OBJECT_END + 0x0034, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_FLAGS_2 = OBJECT_END + 0x0035, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_AURASTATE = OBJECT_END + 0x0036, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_BASEATTACKTIME = OBJECT_END + 0x0037, // Size: 2, Type: INT, Flags: PUBLIC - UNIT_FIELD_RANGEDATTACKTIME = OBJECT_END + 0x0039, // Size: 1, Type: INT, Flags: PRIVATE - UNIT_FIELD_BOUNDINGRADIUS = OBJECT_END + 0x003A, // Size: 1, Type: FLOAT, Flags: PUBLIC - UNIT_FIELD_COMBATREACH = OBJECT_END + 0x003B, // Size: 1, Type: FLOAT, Flags: PUBLIC - UNIT_FIELD_DISPLAYID = OBJECT_END + 0x003C, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_NATIVEDISPLAYID = OBJECT_END + 0x003D, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_MOUNTDISPLAYID = OBJECT_END + 0x003E, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_MINDAMAGE = OBJECT_END + 0x003F, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER, PARTY_LEADER - UNIT_FIELD_MAXDAMAGE = OBJECT_END + 0x0040, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER, PARTY_LEADER - UNIT_FIELD_MINOFFHANDDAMAGE = OBJECT_END + 0x0041, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER, PARTY_LEADER - UNIT_FIELD_MAXOFFHANDDAMAGE = OBJECT_END + 0x0042, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER, PARTY_LEADER - UNIT_FIELD_BYTES_1 = OBJECT_END + 0x0043, // Size: 1, Type: BYTES, Flags: PUBLIC - UNIT_FIELD_PETNUMBER = OBJECT_END + 0x0044, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_PET_NAME_TIMESTAMP = OBJECT_END + 0x0045, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_PETEXPERIENCE = OBJECT_END + 0x0046, // Size: 1, Type: INT, Flags: OWNER - UNIT_FIELD_PETNEXTLEVELEXP = OBJECT_END + 0x0047, // Size: 1, Type: INT, Flags: OWNER - UNIT_DYNAMIC_FLAGS = OBJECT_END + 0x0048, // Size: 1, Type: INT, Flags: DYNAMIC - UNIT_CHANNEL_SPELL = OBJECT_END + 0x0049, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_MOD_CAST_SPEED = OBJECT_END + 0x004A, // Size: 1, Type: FLOAT, Flags: PUBLIC - UNIT_CREATED_BY_SPELL = OBJECT_END + 0x004B, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_NPC_FLAGS = OBJECT_END + 0x004C, // Size: 1, Type: INT, Flags: DYNAMIC - UNIT_NPC_EMOTESTATE = OBJECT_END + 0x004D, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_STAT0 = OBJECT_END + 0x004E, // Size: 1, Type: INT, Flags: PRIVATE, OWNER - UNIT_FIELD_STAT1 = OBJECT_END + 0x004F, // Size: 1, Type: INT, Flags: PRIVATE, OWNER - UNIT_FIELD_STAT2 = OBJECT_END + 0x0050, // Size: 1, Type: INT, Flags: PRIVATE, OWNER - UNIT_FIELD_STAT3 = OBJECT_END + 0x0051, // Size: 1, Type: INT, Flags: PRIVATE, OWNER - UNIT_FIELD_STAT4 = OBJECT_END + 0x0052, // Size: 1, Type: INT, Flags: PRIVATE, OWNER - UNIT_FIELD_POSSTAT0 = OBJECT_END + 0x0053, // Size: 1, Type: INT, Flags: PRIVATE, OWNER - UNIT_FIELD_POSSTAT1 = OBJECT_END + 0x0054, // Size: 1, Type: INT, Flags: PRIVATE, OWNER - UNIT_FIELD_POSSTAT2 = OBJECT_END + 0x0055, // Size: 1, Type: INT, Flags: PRIVATE, OWNER - UNIT_FIELD_POSSTAT3 = OBJECT_END + 0x0056, // Size: 1, Type: INT, Flags: PRIVATE, OWNER - UNIT_FIELD_POSSTAT4 = OBJECT_END + 0x0057, // Size: 1, Type: INT, Flags: PRIVATE, OWNER - UNIT_FIELD_NEGSTAT0 = OBJECT_END + 0x0058, // Size: 1, Type: INT, Flags: PRIVATE, OWNER - UNIT_FIELD_NEGSTAT1 = OBJECT_END + 0x0059, // Size: 1, Type: INT, Flags: PRIVATE, OWNER - UNIT_FIELD_NEGSTAT2 = OBJECT_END + 0x005A, // Size: 1, Type: INT, Flags: PRIVATE, OWNER - UNIT_FIELD_NEGSTAT3 = OBJECT_END + 0x005B, // Size: 1, Type: INT, Flags: PRIVATE, OWNER - UNIT_FIELD_NEGSTAT4 = OBJECT_END + 0x005C, // Size: 1, Type: INT, Flags: PRIVATE, OWNER - UNIT_FIELD_RESISTANCES = OBJECT_END + 0x005D, // Size: 7, Type: INT, Flags: PRIVATE, OWNER, PARTY_LEADER - UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE = OBJECT_END + 0x0064, // Size: 7, Type: INT, Flags: PRIVATE, OWNER - UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE = OBJECT_END + 0x006B, // Size: 7, Type: INT, Flags: PRIVATE, OWNER - UNIT_FIELD_BASE_MANA = OBJECT_END + 0x0072, // Size: 1, Type: INT, Flags: PUBLIC - UNIT_FIELD_BASE_HEALTH = OBJECT_END + 0x0073, // Size: 1, Type: INT, Flags: PRIVATE, OWNER - UNIT_FIELD_BYTES_2 = OBJECT_END + 0x0074, // Size: 1, Type: BYTES, Flags: PUBLIC - UNIT_FIELD_ATTACK_POWER = OBJECT_END + 0x0075, // Size: 1, Type: INT, Flags: PRIVATE, OWNER - UNIT_FIELD_ATTACK_POWER_MODS = OBJECT_END + 0x0076, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE, OWNER - UNIT_FIELD_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x0077, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER - UNIT_FIELD_RANGED_ATTACK_POWER = OBJECT_END + 0x0078, // Size: 1, Type: INT, Flags: PRIVATE, OWNER - UNIT_FIELD_RANGED_ATTACK_POWER_MODS = OBJECT_END + 0x0079, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE, OWNER + UNIT_FIELD_LEVEL = OBJECT_END + 0x002F, // Size: 1, Type: INT, Flags: PUBLIC + UNIT_FIELD_FACTIONTEMPLATE = OBJECT_END + 0x0030, // Size: 1, Type: INT, Flags: PUBLIC + UNIT_VIRTUAL_ITEM_SLOT_ID = OBJECT_END + 0x0031, // Size: 3, Type: INT, Flags: PUBLIC + UNIT_FIELD_FLAGS = OBJECT_END + 0x0034, // Size: 1, Type: INT, Flags: PUBLIC + UNIT_FIELD_FLAGS_2 = OBJECT_END + 0x0035, // Size: 1, Type: INT, Flags: PUBLIC + UNIT_FIELD_AURASTATE = OBJECT_END + 0x0036, // Size: 1, Type: INT, Flags: PUBLIC + UNIT_FIELD_BASEATTACKTIME = OBJECT_END + 0x0037, // Size: 2, Type: INT, Flags: PUBLIC + UNIT_FIELD_RANGEDATTACKTIME = OBJECT_END + 0x0039, // Size: 1, Type: INT, Flags: PRIVATE + UNIT_FIELD_BOUNDINGRADIUS = OBJECT_END + 0x003A, // Size: 1, Type: FLOAT, Flags: PUBLIC + UNIT_FIELD_COMBATREACH = OBJECT_END + 0x003B, // Size: 1, Type: FLOAT, Flags: PUBLIC + UNIT_FIELD_DISPLAYID = OBJECT_END + 0x003C, // Size: 1, Type: INT, Flags: PUBLIC + UNIT_FIELD_NATIVEDISPLAYID = OBJECT_END + 0x003D, // Size: 1, Type: INT, Flags: PUBLIC + UNIT_FIELD_MOUNTDISPLAYID = OBJECT_END + 0x003E, // Size: 1, Type: INT, Flags: PUBLIC + UNIT_FIELD_MINDAMAGE = OBJECT_END + 0x003F, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER, PARTY_LEADER + UNIT_FIELD_MAXDAMAGE = OBJECT_END + 0x0040, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER, PARTY_LEADER + UNIT_FIELD_MINOFFHANDDAMAGE = OBJECT_END + 0x0041, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER, PARTY_LEADER + UNIT_FIELD_MAXOFFHANDDAMAGE = OBJECT_END + 0x0042, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER, PARTY_LEADER + UNIT_FIELD_BYTES_1 = OBJECT_END + 0x0043, // Size: 1, Type: BYTES, Flags: PUBLIC + UNIT_FIELD_PETNUMBER = OBJECT_END + 0x0044, // Size: 1, Type: INT, Flags: PUBLIC + UNIT_FIELD_PET_NAME_TIMESTAMP = OBJECT_END + 0x0045, // Size: 1, Type: INT, Flags: PUBLIC + UNIT_FIELD_PETEXPERIENCE = OBJECT_END + 0x0046, // Size: 1, Type: INT, Flags: OWNER + UNIT_FIELD_PETNEXTLEVELEXP = OBJECT_END + 0x0047, // Size: 1, Type: INT, Flags: OWNER + UNIT_DYNAMIC_FLAGS = OBJECT_END + 0x0048, // Size: 1, Type: INT, Flags: DYNAMIC + UNIT_CHANNEL_SPELL = OBJECT_END + 0x0049, // Size: 1, Type: INT, Flags: PUBLIC + UNIT_MOD_CAST_SPEED = OBJECT_END + 0x004A, // Size: 1, Type: FLOAT, Flags: PUBLIC + UNIT_CREATED_BY_SPELL = OBJECT_END + 0x004B, // Size: 1, Type: INT, Flags: PUBLIC + UNIT_NPC_FLAGS = OBJECT_END + 0x004C, // Size: 1, Type: INT, Flags: DYNAMIC + UNIT_NPC_EMOTESTATE = OBJECT_END + 0x004D, // Size: 1, Type: INT, Flags: PUBLIC + UNIT_FIELD_STAT0 = OBJECT_END + 0x004E, // Size: 1, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_STAT1 = OBJECT_END + 0x004F, // Size: 1, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_STAT2 = OBJECT_END + 0x0050, // Size: 1, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_STAT3 = OBJECT_END + 0x0051, // Size: 1, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_STAT4 = OBJECT_END + 0x0052, // Size: 1, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_POSSTAT0 = OBJECT_END + 0x0053, // Size: 1, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_POSSTAT1 = OBJECT_END + 0x0054, // Size: 1, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_POSSTAT2 = OBJECT_END + 0x0055, // Size: 1, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_POSSTAT3 = OBJECT_END + 0x0056, // Size: 1, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_POSSTAT4 = OBJECT_END + 0x0057, // Size: 1, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_NEGSTAT0 = OBJECT_END + 0x0058, // Size: 1, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_NEGSTAT1 = OBJECT_END + 0x0059, // Size: 1, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_NEGSTAT2 = OBJECT_END + 0x005A, // Size: 1, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_NEGSTAT3 = OBJECT_END + 0x005B, // Size: 1, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_NEGSTAT4 = OBJECT_END + 0x005C, // Size: 1, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_RESISTANCES = OBJECT_END + 0x005D, // Size: 7, Type: INT, Flags: PRIVATE, OWNER, PARTY_LEADER + UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE = OBJECT_END + 0x0064, // Size: 7, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE = OBJECT_END + 0x006B, // Size: 7, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_BASE_MANA = OBJECT_END + 0x0072, // Size: 1, Type: INT, Flags: PUBLIC + UNIT_FIELD_BASE_HEALTH = OBJECT_END + 0x0073, // Size: 1, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_BYTES_2 = OBJECT_END + 0x0074, // Size: 1, Type: BYTES, Flags: PUBLIC + UNIT_FIELD_ATTACK_POWER = OBJECT_END + 0x0075, // Size: 1, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_ATTACK_POWER_MODS = OBJECT_END + 0x0076, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE, OWNER + UNIT_FIELD_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x0077, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER + UNIT_FIELD_RANGED_ATTACK_POWER = OBJECT_END + 0x0078, // Size: 1, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_RANGED_ATTACK_POWER_MODS = OBJECT_END + 0x0079, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE, OWNER UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x007A, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER - UNIT_FIELD_MINRANGEDDAMAGE = OBJECT_END + 0x007B, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER - UNIT_FIELD_MAXRANGEDDAMAGE = OBJECT_END + 0x007C, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER - UNIT_FIELD_POWER_COST_MODIFIER = OBJECT_END + 0x007D, // Size: 7, Type: INT, Flags: PRIVATE, OWNER - UNIT_FIELD_POWER_COST_MULTIPLIER = OBJECT_END + 0x0084, // Size: 7, Type: FLOAT, Flags: PRIVATE, OWNER - UNIT_FIELD_MAXHEALTHMODIFIER = OBJECT_END + 0x008B, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER - UNIT_FIELD_HOVERHEIGHT = OBJECT_END + 0x008C, // Size: 1, Type: FLOAT, Flags: PUBLIC - UNIT_FIELD_PADDING = OBJECT_END + 0x008D, // Size: 1, Type: INT, Flags: NONE - UNIT_END = OBJECT_END + 0x008E, + UNIT_FIELD_MINRANGEDDAMAGE = OBJECT_END + 0x007B, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER + UNIT_FIELD_MAXRANGEDDAMAGE = OBJECT_END + 0x007C, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER + UNIT_FIELD_POWER_COST_MODIFIER = OBJECT_END + 0x007D, // Size: 7, Type: INT, Flags: PRIVATE, OWNER + UNIT_FIELD_POWER_COST_MULTIPLIER = OBJECT_END + 0x0084, // Size: 7, Type: FLOAT, Flags: PRIVATE, OWNER + UNIT_FIELD_MAXHEALTHMODIFIER = OBJECT_END + 0x008B, // Size: 1, Type: FLOAT, Flags: PRIVATE, OWNER + UNIT_FIELD_HOVERHEIGHT = OBJECT_END + 0x008C, // Size: 1, Type: FLOAT, Flags: PUBLIC + UNIT_FIELD_PADDING = OBJECT_END + 0x008D, // Size: 1, Type: INT, Flags: NONE + UNIT_END = OBJECT_END + 0x008E, - PLAYER_DUEL_ARBITER = UNIT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC - PLAYER_FLAGS = UNIT_END + 0x0002, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_GUILDID = UNIT_END + 0x0003, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_GUILDRANK = UNIT_END + 0x0004, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_BYTES = UNIT_END + 0x0005, // Size: 1, Type: BYTES, Flags: PUBLIC - PLAYER_BYTES_2 = UNIT_END + 0x0006, // Size: 1, Type: BYTES, Flags: PUBLIC - PLAYER_BYTES_3 = UNIT_END + 0x0007, // Size: 1, Type: BYTES, Flags: PUBLIC - PLAYER_DUEL_TEAM = UNIT_END + 0x0008, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_GUILD_TIMESTAMP = UNIT_END + 0x0009, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_QUEST_LOG_1_1 = UNIT_END + 0x000A, // Size: 1, Type: INT, Flags: PARTY_MEMBER - PLAYER_QUEST_LOG_1_2 = UNIT_END + 0x000B, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_1_3 = UNIT_END + 0x000C, // Size: 1, Type: BYTES, Flags: PRIVATE - PLAYER_QUEST_LOG_1_4 = UNIT_END + 0x000D, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_2_1 = UNIT_END + 0x000E, // Size: 1, Type: INT, Flags: PARTY_MEMBER - PLAYER_QUEST_LOG_2_2 = UNIT_END + 0x000F, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_2_3 = UNIT_END + 0x0010, // Size: 1, Type: BYTES, Flags: PRIVATE - PLAYER_QUEST_LOG_2_4 = UNIT_END + 0x0011, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_3_1 = UNIT_END + 0x0012, // Size: 1, Type: INT, Flags: PARTY_MEMBER - PLAYER_QUEST_LOG_3_2 = UNIT_END + 0x0013, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_3_3 = UNIT_END + 0x0014, // Size: 1, Type: BYTES, Flags: PRIVATE - PLAYER_QUEST_LOG_3_4 = UNIT_END + 0x0015, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_4_1 = UNIT_END + 0x0016, // Size: 1, Type: INT, Flags: PARTY_MEMBER - PLAYER_QUEST_LOG_4_2 = UNIT_END + 0x0017, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_4_3 = UNIT_END + 0x0018, // Size: 1, Type: BYTES, Flags: PRIVATE - PLAYER_QUEST_LOG_4_4 = UNIT_END + 0x0019, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_5_1 = UNIT_END + 0x001A, // Size: 1, Type: INT, Flags: PARTY_MEMBER - PLAYER_QUEST_LOG_5_2 = UNIT_END + 0x001B, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_5_3 = UNIT_END + 0x001C, // Size: 1, Type: BYTES, Flags: PRIVATE - PLAYER_QUEST_LOG_5_4 = UNIT_END + 0x001D, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_6_1 = UNIT_END + 0x001E, // Size: 1, Type: INT, Flags: PARTY_MEMBER - PLAYER_QUEST_LOG_6_2 = UNIT_END + 0x001F, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_6_3 = UNIT_END + 0x0020, // Size: 1, Type: BYTES, Flags: PRIVATE - PLAYER_QUEST_LOG_6_4 = UNIT_END + 0x0021, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_7_1 = UNIT_END + 0x0022, // Size: 1, Type: INT, Flags: PARTY_MEMBER - PLAYER_QUEST_LOG_7_2 = UNIT_END + 0x0023, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_7_3 = UNIT_END + 0x0024, // Size: 1, Type: BYTES, Flags: PRIVATE - PLAYER_QUEST_LOG_7_4 = UNIT_END + 0x0025, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_8_1 = UNIT_END + 0x0026, // Size: 1, Type: INT, Flags: PARTY_MEMBER - PLAYER_QUEST_LOG_8_2 = UNIT_END + 0x0027, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_8_3 = UNIT_END + 0x0028, // Size: 1, Type: BYTES, Flags: PRIVATE - PLAYER_QUEST_LOG_8_4 = UNIT_END + 0x0029, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_9_1 = UNIT_END + 0x002A, // Size: 1, Type: INT, Flags: PARTY_MEMBER - PLAYER_QUEST_LOG_9_2 = UNIT_END + 0x002B, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_9_3 = UNIT_END + 0x002C, // Size: 1, Type: BYTES, Flags: PRIVATE - PLAYER_QUEST_LOG_9_4 = UNIT_END + 0x002D, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_10_1 = UNIT_END + 0x002E, // Size: 1, Type: INT, Flags: PARTY_MEMBER - PLAYER_QUEST_LOG_10_2 = UNIT_END + 0x002F, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_10_3 = UNIT_END + 0x0030, // Size: 1, Type: BYTES, Flags: PRIVATE - PLAYER_QUEST_LOG_10_4 = UNIT_END + 0x0031, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_11_1 = UNIT_END + 0x0032, // Size: 1, Type: INT, Flags: PARTY_MEMBER - PLAYER_QUEST_LOG_11_2 = UNIT_END + 0x0033, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_11_3 = UNIT_END + 0x0034, // Size: 1, Type: BYTES, Flags: PRIVATE - PLAYER_QUEST_LOG_11_4 = UNIT_END + 0x0035, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_12_1 = UNIT_END + 0x0036, // Size: 1, Type: INT, Flags: PARTY_MEMBER - PLAYER_QUEST_LOG_12_2 = UNIT_END + 0x0037, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_12_3 = UNIT_END + 0x0038, // Size: 1, Type: BYTES, Flags: PRIVATE - PLAYER_QUEST_LOG_12_4 = UNIT_END + 0x0039, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_13_1 = UNIT_END + 0x003A, // Size: 1, Type: INT, Flags: PARTY_MEMBER - PLAYER_QUEST_LOG_13_2 = UNIT_END + 0x003B, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_13_3 = UNIT_END + 0x003C, // Size: 1, Type: BYTES, Flags: PRIVATE - PLAYER_QUEST_LOG_13_4 = UNIT_END + 0x003D, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_14_1 = UNIT_END + 0x003E, // Size: 1, Type: INT, Flags: PARTY_MEMBER - PLAYER_QUEST_LOG_14_2 = UNIT_END + 0x003F, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_14_3 = UNIT_END + 0x0040, // Size: 1, Type: BYTES, Flags: PRIVATE - PLAYER_QUEST_LOG_14_4 = UNIT_END + 0x0041, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_15_1 = UNIT_END + 0x0042, // Size: 1, Type: INT, Flags: PARTY_MEMBER - PLAYER_QUEST_LOG_15_2 = UNIT_END + 0x0043, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_15_3 = UNIT_END + 0x0044, // Size: 1, Type: BYTES, Flags: PRIVATE - PLAYER_QUEST_LOG_15_4 = UNIT_END + 0x0045, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_16_1 = UNIT_END + 0x0046, // Size: 1, Type: INT, Flags: PARTY_MEMBER - PLAYER_QUEST_LOG_16_2 = UNIT_END + 0x0047, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_16_3 = UNIT_END + 0x0048, // Size: 1, Type: BYTES, Flags: PRIVATE - PLAYER_QUEST_LOG_16_4 = UNIT_END + 0x0049, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_17_1 = UNIT_END + 0x004A, // Size: 1, Type: INT, Flags: PARTY_MEMBER - PLAYER_QUEST_LOG_17_2 = UNIT_END + 0x004B, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_17_3 = UNIT_END + 0x004C, // Size: 1, Type: BYTES, Flags: PRIVATE - PLAYER_QUEST_LOG_17_4 = UNIT_END + 0x004D, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_18_1 = UNIT_END + 0x004E, // Size: 1, Type: INT, Flags: PARTY_MEMBER - PLAYER_QUEST_LOG_18_2 = UNIT_END + 0x004F, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_18_3 = UNIT_END + 0x0050, // Size: 1, Type: BYTES, Flags: PRIVATE - PLAYER_QUEST_LOG_18_4 = UNIT_END + 0x0051, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_19_1 = UNIT_END + 0x0052, // Size: 1, Type: INT, Flags: PARTY_MEMBER - PLAYER_QUEST_LOG_19_2 = UNIT_END + 0x0053, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_19_3 = UNIT_END + 0x0054, // Size: 1, Type: BYTES, Flags: PRIVATE - PLAYER_QUEST_LOG_19_4 = UNIT_END + 0x0055, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_20_1 = UNIT_END + 0x0056, // Size: 1, Type: INT, Flags: PARTY_MEMBER - PLAYER_QUEST_LOG_20_2 = UNIT_END + 0x0057, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_20_3 = UNIT_END + 0x0058, // Size: 1, Type: BYTES, Flags: PRIVATE - PLAYER_QUEST_LOG_20_4 = UNIT_END + 0x0059, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_21_1 = UNIT_END + 0x005A, // Size: 1, Type: INT, Flags: PARTY_MEMBER - PLAYER_QUEST_LOG_21_2 = UNIT_END + 0x005B, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_21_3 = UNIT_END + 0x005C, // Size: 1, Type: BYTES, Flags: PRIVATE - PLAYER_QUEST_LOG_21_4 = UNIT_END + 0x005D, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_22_1 = UNIT_END + 0x005E, // Size: 1, Type: INT, Flags: PARTY_MEMBER - PLAYER_QUEST_LOG_22_2 = UNIT_END + 0x005F, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_22_3 = UNIT_END + 0x0060, // Size: 1, Type: BYTES, Flags: PRIVATE - PLAYER_QUEST_LOG_22_4 = UNIT_END + 0x0061, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_23_1 = UNIT_END + 0x0062, // Size: 1, Type: INT, Flags: PARTY_MEMBER - PLAYER_QUEST_LOG_23_2 = UNIT_END + 0x0063, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_23_3 = UNIT_END + 0x0064, // Size: 1, Type: BYTES, Flags: PRIVATE - PLAYER_QUEST_LOG_23_4 = UNIT_END + 0x0065, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_24_1 = UNIT_END + 0x0066, // Size: 1, Type: INT, Flags: PARTY_MEMBER - PLAYER_QUEST_LOG_24_2 = UNIT_END + 0x0067, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_24_3 = UNIT_END + 0x0068, // Size: 1, Type: BYTES, Flags: PRIVATE - PLAYER_QUEST_LOG_24_4 = UNIT_END + 0x0069, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_25_1 = UNIT_END + 0x006A, // Size: 1, Type: INT, Flags: PARTY_MEMBER - PLAYER_QUEST_LOG_25_2 = UNIT_END + 0x006B, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_QUEST_LOG_25_3 = UNIT_END + 0x006C, // Size: 1, Type: BYTES, Flags: PRIVATE - PLAYER_QUEST_LOG_25_4 = UNIT_END + 0x006D, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_VISIBLE_ITEM_1_ENTRYID = UNIT_END + 0x006E, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_1_ENCHANTMENT = UNIT_END + 0x006F, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_2_ENTRYID = UNIT_END + 0x0070, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_2_ENCHANTMENT = UNIT_END + 0x0071, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_3_ENTRYID = UNIT_END + 0x0072, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_3_ENCHANTMENT = UNIT_END + 0x0073, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_4_ENTRYID = UNIT_END + 0x0074, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_4_ENCHANTMENT = UNIT_END + 0x0075, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_5_ENTRYID = UNIT_END + 0x0076, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_5_ENCHANTMENT = UNIT_END + 0x0077, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_6_ENTRYID = UNIT_END + 0x0078, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_6_ENCHANTMENT = UNIT_END + 0x0079, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_7_ENTRYID = UNIT_END + 0x007A, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_7_ENCHANTMENT = UNIT_END + 0x007B, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_8_ENTRYID = UNIT_END + 0x007C, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_8_ENCHANTMENT = UNIT_END + 0x007D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_9_ENTRYID = UNIT_END + 0x007E, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_9_ENCHANTMENT = UNIT_END + 0x007F, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_10_ENTRYID = UNIT_END + 0x0080, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_10_ENCHANTMENT = UNIT_END + 0x0081, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_11_ENTRYID = UNIT_END + 0x0082, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_11_ENCHANTMENT = UNIT_END + 0x0083, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_12_ENTRYID = UNIT_END + 0x0084, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_12_ENCHANTMENT = UNIT_END + 0x0085, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_13_ENTRYID = UNIT_END + 0x0086, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_13_ENCHANTMENT = UNIT_END + 0x0087, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_14_ENTRYID = UNIT_END + 0x0088, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_14_ENCHANTMENT = UNIT_END + 0x0089, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_15_ENTRYID = UNIT_END + 0x008A, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_15_ENCHANTMENT = UNIT_END + 0x008B, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_16_ENTRYID = UNIT_END + 0x008C, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_16_ENCHANTMENT = UNIT_END + 0x008D, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_17_ENTRYID = UNIT_END + 0x008E, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_17_ENCHANTMENT = UNIT_END + 0x008F, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_18_ENTRYID = UNIT_END + 0x0090, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_18_ENCHANTMENT = UNIT_END + 0x0091, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_19_ENTRYID = UNIT_END + 0x0092, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_VISIBLE_ITEM_19_ENCHANTMENT = UNIT_END + 0x0093, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC - PLAYER_CHOSEN_TITLE = UNIT_END + 0x0094, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_FAKE_INEBRIATION = UNIT_END + 0x0095, // Size: 1, Type: INT, Flags: PUBLIC - PLAYER_FIELD_INV_SLOT_HEAD = UNIT_END + 0x0096, // Size: 46, Type: LONG, Flags: PRIVATE - PLAYER_FIELD_PACK_SLOT_1 = UNIT_END + 0x00C4, // Size: 32, Type: LONG, Flags: PRIVATE - PLAYER_FIELD_BANK_SLOT_1 = UNIT_END + 0x00E4, // Size: 56, Type: LONG, Flags: PRIVATE - PLAYER_FIELD_BANKBAG_SLOT_1 = UNIT_END + 0x011C, // Size: 14, Type: LONG, Flags: PRIVATE - PLAYER_FIELD_VENDORBUYBACK_SLOT_1 = UNIT_END + 0x012A, // Size: 24, Type: LONG, Flags: PRIVATE - PLAYER_FIELD_KEYRING_SLOT_1 = UNIT_END + 0x0142, // Size: 64, Type: LONG, Flags: PRIVATE - PLAYER_FIELD_CURRENCYTOKEN_SLOT_1 = UNIT_END + 0x0182, // Size: 64, Type: LONG, Flags: PRIVATE - PLAYER_FARSIGHT = UNIT_END + 0x01C2, // Size: 2, Type: LONG, Flags: PRIVATE - PLAYER__FIELD_KNOWN_TITLES = UNIT_END + 0x01C4, // Size: 2, Type: LONG, Flags: PRIVATE - PLAYER__FIELD_KNOWN_TITLES1 = UNIT_END + 0x01C6, // Size: 2, Type: LONG, Flags: PRIVATE - PLAYER__FIELD_KNOWN_TITLES2 = UNIT_END + 0x01C8, // Size: 2, Type: LONG, Flags: PRIVATE - PLAYER_FIELD_KNOWN_CURRENCIES = UNIT_END + 0x01CA, // Size: 2, Type: LONG, Flags: PRIVATE - PLAYER_XP = UNIT_END + 0x01CC, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_NEXT_LEVEL_XP = UNIT_END + 0x01CD, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_SKILL_INFO_1_1 = UNIT_END + 0x01CE, // Size: 384, Type: TWO_SHORT, Flags: PRIVATE - PLAYER_CHARACTER_POINTS1 = UNIT_END + 0x034E, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_CHARACTER_POINTS2 = UNIT_END + 0x034F, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_TRACK_CREATURES = UNIT_END + 0x0350, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_TRACK_RESOURCES = UNIT_END + 0x0351, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_BLOCK_PERCENTAGE = UNIT_END + 0x0352, // Size: 1, Type: FLOAT, Flags: PRIVATE - PLAYER_DODGE_PERCENTAGE = UNIT_END + 0x0353, // Size: 1, Type: FLOAT, Flags: PRIVATE - PLAYER_PARRY_PERCENTAGE = UNIT_END + 0x0354, // Size: 1, Type: FLOAT, Flags: PRIVATE - PLAYER_EXPERTISE = UNIT_END + 0x0355, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_OFFHAND_EXPERTISE = UNIT_END + 0x0356, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_CRIT_PERCENTAGE = UNIT_END + 0x0357, // Size: 1, Type: FLOAT, Flags: PRIVATE - PLAYER_RANGED_CRIT_PERCENTAGE = UNIT_END + 0x0358, // Size: 1, Type: FLOAT, Flags: PRIVATE - PLAYER_OFFHAND_CRIT_PERCENTAGE = UNIT_END + 0x0359, // Size: 1, Type: FLOAT, Flags: PRIVATE - PLAYER_SPELL_CRIT_PERCENTAGE1 = UNIT_END + 0x035A, // Size: 7, Type: FLOAT, Flags: PRIVATE - PLAYER_SHIELD_BLOCK = UNIT_END + 0x0361, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_SHIELD_BLOCK_CRIT_PERCENTAGE = UNIT_END + 0x0362, // Size: 1, Type: FLOAT, Flags: PRIVATE - PLAYER_EXPLORED_ZONES_1 = UNIT_END + 0x0363, // Size: 128, Type: BYTES, Flags: PRIVATE - PLAYER_REST_STATE_EXPERIENCE = UNIT_END + 0x03E3, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_FIELD_COINAGE = UNIT_END + 0x03E4, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_FIELD_MOD_DAMAGE_DONE_POS = UNIT_END + 0x03E5, // Size: 7, Type: INT, Flags: PRIVATE - PLAYER_FIELD_MOD_DAMAGE_DONE_NEG = UNIT_END + 0x03EC, // Size: 7, Type: INT, Flags: PRIVATE - PLAYER_FIELD_MOD_DAMAGE_DONE_PCT = UNIT_END + 0x03F3, // Size: 7, Type: INT, Flags: PRIVATE - PLAYER_FIELD_MOD_HEALING_DONE_POS = UNIT_END + 0x03FA, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_FIELD_MOD_HEALING_PCT = UNIT_END + 0x03FB, // Size: 1, Type: FLOAT, Flags: PRIVATE - PLAYER_FIELD_MOD_HEALING_DONE_PCT = UNIT_END + 0x03FC, // Size: 1, Type: FLOAT, Flags: PRIVATE - PLAYER_FIELD_MOD_TARGET_RESISTANCE = UNIT_END + 0x03FD, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE = UNIT_END + 0x03FE, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_FIELD_BYTES = UNIT_END + 0x03FF, // Size: 1, Type: BYTES, Flags: PRIVATE - PLAYER_AMMO_ID = UNIT_END + 0x0400, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_SELF_RES_SPELL = UNIT_END + 0x0401, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_FIELD_PVP_MEDALS = UNIT_END + 0x0402, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_FIELD_BUYBACK_PRICE_1 = UNIT_END + 0x0403, // Size: 12, Type: INT, Flags: PRIVATE - PLAYER_FIELD_BUYBACK_TIMESTAMP_1 = UNIT_END + 0x040F, // Size: 12, Type: INT, Flags: PRIVATE - PLAYER_FIELD_KILLS = UNIT_END + 0x041B, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE - PLAYER_FIELD_TODAY_CONTRIBUTION = UNIT_END + 0x041C, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_FIELD_YESTERDAY_CONTRIBUTION = UNIT_END + 0x041D, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_FIELD_LIFETIME_HONORABLE_KILLS = UNIT_END + 0x041E, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_FIELD_BYTES2 = UNIT_END + 0x041F, // Size: 1, Type: 6, Flags: PRIVATE - PLAYER_FIELD_WATCHED_FACTION_INDEX = UNIT_END + 0x0420, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_FIELD_COMBAT_RATING_1 = UNIT_END + 0x0421, // Size: 25, Type: INT, Flags: PRIVATE - PLAYER_FIELD_ARENA_TEAM_INFO_1_1 = UNIT_END + 0x043A, // Size: 21, Type: INT, Flags: PRIVATE - PLAYER_FIELD_HONOR_CURRENCY = UNIT_END + 0x044F, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_FIELD_ARENA_CURRENCY = UNIT_END + 0x0450, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_FIELD_MAX_LEVEL = UNIT_END + 0x0451, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_FIELD_DAILY_QUESTS_1 = UNIT_END + 0x0452, // Size: 25, Type: INT, Flags: PRIVATE - PLAYER_RUNE_REGEN_1 = UNIT_END + 0x046B, // Size: 4, Type: FLOAT, Flags: PRIVATE - PLAYER_NO_REAGENT_COST_1 = UNIT_END + 0x046F, // Size: 3, Type: INT, Flags: PRIVATE - PLAYER_FIELD_GLYPH_SLOTS_1 = UNIT_END + 0x0472, // Size: 6, Type: INT, Flags: PRIVATE - PLAYER_FIELD_GLYPHS_1 = UNIT_END + 0x0478, // Size: 6, Type: INT, Flags: PRIVATE - PLAYER_GLYPHS_ENABLED = UNIT_END + 0x047E, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_FIELD_PADDING = UNIT_END + 0x047F, // Size: 1, Type: INT, Flags: NONE - PLAYER_END = UNIT_END + 0x0480, + PLAYER_DUEL_ARBITER = UNIT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC + PLAYER_FLAGS = UNIT_END + 0x0002, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_GUILDID = UNIT_END + 0x0003, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_GUILDRANK = UNIT_END + 0x0004, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_BYTES = UNIT_END + 0x0005, // Size: 1, Type: BYTES, Flags: PUBLIC + PLAYER_BYTES_2 = UNIT_END + 0x0006, // Size: 1, Type: BYTES, Flags: PUBLIC + PLAYER_BYTES_3 = UNIT_END + 0x0007, // Size: 1, Type: BYTES, Flags: PUBLIC + PLAYER_DUEL_TEAM = UNIT_END + 0x0008, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_GUILD_TIMESTAMP = UNIT_END + 0x0009, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_QUEST_LOG_1_1 = UNIT_END + 0x000A, // Size: 1, Type: INT, Flags: PARTY_MEMBER + PLAYER_QUEST_LOG_1_2 = UNIT_END + 0x000B, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_1_3 = UNIT_END + 0x000C, // Size: 2, Type: TWO_SHORT, Flags: PRIVATE + PLAYER_QUEST_LOG_1_5 = UNIT_END + 0x000E, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_2_1 = UNIT_END + 0x000F, // Size: 1, Type: INT, Flags: PARTY_MEMBER + PLAYER_QUEST_LOG_2_2 = UNIT_END + 0x0010, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_2_3 = UNIT_END + 0x0011, // Size: 2, Type: TWO_SHORT, Flags: PRIVATE + PLAYER_QUEST_LOG_2_5 = UNIT_END + 0x0013, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_3_1 = UNIT_END + 0x0014, // Size: 1, Type: INT, Flags: PARTY_MEMBER + PLAYER_QUEST_LOG_3_2 = UNIT_END + 0x0015, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_3_3 = UNIT_END + 0x0016, // Size: 2, Type: TWO_SHORT, Flags: PRIVATE + PLAYER_QUEST_LOG_3_5 = UNIT_END + 0x0018, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_4_1 = UNIT_END + 0x0019, // Size: 1, Type: INT, Flags: PARTY_MEMBER + PLAYER_QUEST_LOG_4_2 = UNIT_END + 0x001A, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_4_3 = UNIT_END + 0x001B, // Size: 2, Type: TWO_SHORT, Flags: PRIVATE + PLAYER_QUEST_LOG_4_5 = UNIT_END + 0x001D, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_5_1 = UNIT_END + 0x001E, // Size: 1, Type: INT, Flags: PARTY_MEMBER + PLAYER_QUEST_LOG_5_2 = UNIT_END + 0x001F, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_5_3 = UNIT_END + 0x0020, // Size: 2, Type: TWO_SHORT, Flags: PRIVATE + PLAYER_QUEST_LOG_5_5 = UNIT_END + 0x0022, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_6_1 = UNIT_END + 0x0023, // Size: 1, Type: INT, Flags: PARTY_MEMBER + PLAYER_QUEST_LOG_6_2 = UNIT_END + 0x0024, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_6_3 = UNIT_END + 0x0025, // Size: 2, Type: TWO_SHORT, Flags: PRIVATE + PLAYER_QUEST_LOG_6_5 = UNIT_END + 0x0027, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_7_1 = UNIT_END + 0x0028, // Size: 1, Type: INT, Flags: PARTY_MEMBER + PLAYER_QUEST_LOG_7_2 = UNIT_END + 0x0029, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_7_3 = UNIT_END + 0x002A, // Size: 2, Type: TWO_SHORT, Flags: PRIVATE + PLAYER_QUEST_LOG_7_5 = UNIT_END + 0x002C, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_8_1 = UNIT_END + 0x002D, // Size: 1, Type: INT, Flags: PARTY_MEMBER + PLAYER_QUEST_LOG_8_2 = UNIT_END + 0x002E, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_8_3 = UNIT_END + 0x002F, // Size: 2, Type: TWO_SHORT, Flags: PRIVATE + PLAYER_QUEST_LOG_8_5 = UNIT_END + 0x0031, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_9_1 = UNIT_END + 0x0032, // Size: 1, Type: INT, Flags: PARTY_MEMBER + PLAYER_QUEST_LOG_9_2 = UNIT_END + 0x0033, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_9_3 = UNIT_END + 0x0034, // Size: 2, Type: TWO_SHORT, Flags: PRIVATE + PLAYER_QUEST_LOG_9_5 = UNIT_END + 0x0036, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_10_1 = UNIT_END + 0x0037, // Size: 1, Type: INT, Flags: PARTY_MEMBER + PLAYER_QUEST_LOG_10_2 = UNIT_END + 0x0038, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_10_3 = UNIT_END + 0x0039, // Size: 2, Type: TWO_SHORT, Flags: PRIVATE + PLAYER_QUEST_LOG_10_5 = UNIT_END + 0x003B, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_11_1 = UNIT_END + 0x003C, // Size: 1, Type: INT, Flags: PARTY_MEMBER + PLAYER_QUEST_LOG_11_2 = UNIT_END + 0x003D, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_11_3 = UNIT_END + 0x003E, // Size: 2, Type: TWO_SHORT, Flags: PRIVATE + PLAYER_QUEST_LOG_11_5 = UNIT_END + 0x0040, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_12_1 = UNIT_END + 0x0041, // Size: 1, Type: INT, Flags: PARTY_MEMBER + PLAYER_QUEST_LOG_12_2 = UNIT_END + 0x0042, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_12_3 = UNIT_END + 0x0043, // Size: 2, Type: TWO_SHORT, Flags: PRIVATE + PLAYER_QUEST_LOG_12_5 = UNIT_END + 0x0045, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_13_1 = UNIT_END + 0x0046, // Size: 1, Type: INT, Flags: PARTY_MEMBER + PLAYER_QUEST_LOG_13_2 = UNIT_END + 0x0047, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_13_3 = UNIT_END + 0x0048, // Size: 2, Type: TWO_SHORT, Flags: PRIVATE + PLAYER_QUEST_LOG_13_5 = UNIT_END + 0x004A, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_14_1 = UNIT_END + 0x004B, // Size: 1, Type: INT, Flags: PARTY_MEMBER + PLAYER_QUEST_LOG_14_2 = UNIT_END + 0x004C, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_14_3 = UNIT_END + 0x004D, // Size: 2, Type: TWO_SHORT, Flags: PRIVATE + PLAYER_QUEST_LOG_14_5 = UNIT_END + 0x004F, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_15_1 = UNIT_END + 0x0050, // Size: 1, Type: INT, Flags: PARTY_MEMBER + PLAYER_QUEST_LOG_15_2 = UNIT_END + 0x0051, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_15_3 = UNIT_END + 0x0052, // Size: 2, Type: TWO_SHORT, Flags: PRIVATE + PLAYER_QUEST_LOG_15_5 = UNIT_END + 0x0054, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_16_1 = UNIT_END + 0x0055, // Size: 1, Type: INT, Flags: PARTY_MEMBER + PLAYER_QUEST_LOG_16_2 = UNIT_END + 0x0056, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_16_3 = UNIT_END + 0x0057, // Size: 2, Type: TWO_SHORT, Flags: PRIVATE + PLAYER_QUEST_LOG_16_5 = UNIT_END + 0x0059, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_17_1 = UNIT_END + 0x005A, // Size: 1, Type: INT, Flags: PARTY_MEMBER + PLAYER_QUEST_LOG_17_2 = UNIT_END + 0x005B, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_17_3 = UNIT_END + 0x005C, // Size: 2, Type: TWO_SHORT, Flags: PRIVATE + PLAYER_QUEST_LOG_17_5 = UNIT_END + 0x005E, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_18_1 = UNIT_END + 0x005F, // Size: 1, Type: INT, Flags: PARTY_MEMBER + PLAYER_QUEST_LOG_18_2 = UNIT_END + 0x0060, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_18_3 = UNIT_END + 0x0061, // Size: 2, Type: TWO_SHORT, Flags: PRIVATE + PLAYER_QUEST_LOG_18_5 = UNIT_END + 0x0063, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_19_1 = UNIT_END + 0x0064, // Size: 1, Type: INT, Flags: PARTY_MEMBER + PLAYER_QUEST_LOG_19_2 = UNIT_END + 0x0065, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_19_3 = UNIT_END + 0x0066, // Size: 2, Type: TWO_SHORT, Flags: PRIVATE + PLAYER_QUEST_LOG_19_5 = UNIT_END + 0x0068, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_20_1 = UNIT_END + 0x0069, // Size: 1, Type: INT, Flags: PARTY_MEMBER + PLAYER_QUEST_LOG_20_2 = UNIT_END + 0x006A, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_20_3 = UNIT_END + 0x006B, // Size: 2, Type: TWO_SHORT, Flags: PRIVATE + PLAYER_QUEST_LOG_20_5 = UNIT_END + 0x006D, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_21_1 = UNIT_END + 0x006E, // Size: 1, Type: INT, Flags: PARTY_MEMBER + PLAYER_QUEST_LOG_21_2 = UNIT_END + 0x006F, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_21_3 = UNIT_END + 0x0070, // Size: 2, Type: TWO_SHORT, Flags: PRIVATE + PLAYER_QUEST_LOG_21_5 = UNIT_END + 0x0072, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_22_1 = UNIT_END + 0x0073, // Size: 1, Type: INT, Flags: PARTY_MEMBER + PLAYER_QUEST_LOG_22_2 = UNIT_END + 0x0074, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_22_3 = UNIT_END + 0x0075, // Size: 2, Type: TWO_SHORT, Flags: PRIVATE + PLAYER_QUEST_LOG_22_5 = UNIT_END + 0x0077, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_23_1 = UNIT_END + 0x0078, // Size: 1, Type: INT, Flags: PARTY_MEMBER + PLAYER_QUEST_LOG_23_2 = UNIT_END + 0x0079, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_23_3 = UNIT_END + 0x007A, // Size: 2, Type: TWO_SHORT, Flags: PRIVATE + PLAYER_QUEST_LOG_23_5 = UNIT_END + 0x007C, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_24_1 = UNIT_END + 0x007D, // Size: 1, Type: INT, Flags: PARTY_MEMBER + PLAYER_QUEST_LOG_24_2 = UNIT_END + 0x007E, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_24_3 = UNIT_END + 0x007F, // Size: 2, Type: TWO_SHORT, Flags: PRIVATE + PLAYER_QUEST_LOG_24_5 = UNIT_END + 0x0081, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_25_1 = UNIT_END + 0x0082, // Size: 1, Type: INT, Flags: PARTY_MEMBER + PLAYER_QUEST_LOG_25_2 = UNIT_END + 0x0083, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_QUEST_LOG_25_3 = UNIT_END + 0x0084, // Size: 2, Type: TWO_SHORT, Flags: PRIVATE + PLAYER_QUEST_LOG_25_5 = UNIT_END + 0x0086, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_VISIBLE_ITEM_1_ENTRYID = UNIT_END + 0x0087, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_1_ENCHANTMENT = UNIT_END + 0x0088, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_2_ENTRYID = UNIT_END + 0x0089, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_2_ENCHANTMENT = UNIT_END + 0x008A, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_3_ENTRYID = UNIT_END + 0x008B, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_3_ENCHANTMENT = UNIT_END + 0x008C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_4_ENTRYID = UNIT_END + 0x008D, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_4_ENCHANTMENT = UNIT_END + 0x008E, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_5_ENTRYID = UNIT_END + 0x008F, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_5_ENCHANTMENT = UNIT_END + 0x0090, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_6_ENTRYID = UNIT_END + 0x0091, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_6_ENCHANTMENT = UNIT_END + 0x0092, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_7_ENTRYID = UNIT_END + 0x0093, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_7_ENCHANTMENT = UNIT_END + 0x0094, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_8_ENTRYID = UNIT_END + 0x0095, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_8_ENCHANTMENT = UNIT_END + 0x0096, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_9_ENTRYID = UNIT_END + 0x0097, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_9_ENCHANTMENT = UNIT_END + 0x0098, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_10_ENTRYID = UNIT_END + 0x0099, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_10_ENCHANTMENT = UNIT_END + 0x009A, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_11_ENTRYID = UNIT_END + 0x009B, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_11_ENCHANTMENT = UNIT_END + 0x009C, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_12_ENTRYID = UNIT_END + 0x009D, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_12_ENCHANTMENT = UNIT_END + 0x009E, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_13_ENTRYID = UNIT_END + 0x009F, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_13_ENCHANTMENT = UNIT_END + 0x00A0, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_14_ENTRYID = UNIT_END + 0x00A1, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_14_ENCHANTMENT = UNIT_END + 0x00A2, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_15_ENTRYID = UNIT_END + 0x00A3, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_15_ENCHANTMENT = UNIT_END + 0x00A4, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_16_ENTRYID = UNIT_END + 0x00A5, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_16_ENCHANTMENT = UNIT_END + 0x00A6, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_17_ENTRYID = UNIT_END + 0x00A7, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_17_ENCHANTMENT = UNIT_END + 0x00A8, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_18_ENTRYID = UNIT_END + 0x00A9, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_18_ENCHANTMENT = UNIT_END + 0x00AA, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_19_ENTRYID = UNIT_END + 0x00AB, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_VISIBLE_ITEM_19_ENCHANTMENT = UNIT_END + 0x00AC, // Size: 1, Type: TWO_SHORT, Flags: PUBLIC + PLAYER_CHOSEN_TITLE = UNIT_END + 0x00AD, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_FAKE_INEBRIATION = UNIT_END + 0x00AE, // Size: 1, Type: INT, Flags: PUBLIC + PLAYER_FIELD_PAD_0 = UNIT_END + 0x00AF, // Size: 1, Type: INT, Flags: NONE + PLAYER_FIELD_INV_SLOT_HEAD = UNIT_END + 0x00B0, // Size: 46, Type: LONG, Flags: PRIVATE + PLAYER_FIELD_PACK_SLOT_1 = UNIT_END + 0x00DE, // Size: 32, Type: LONG, Flags: PRIVATE + PLAYER_FIELD_BANK_SLOT_1 = UNIT_END + 0x00FE, // Size: 56, Type: LONG, Flags: PRIVATE + PLAYER_FIELD_BANKBAG_SLOT_1 = UNIT_END + 0x0136, // Size: 14, Type: LONG, Flags: PRIVATE + PLAYER_FIELD_VENDORBUYBACK_SLOT_1 = UNIT_END + 0x0144, // Size: 24, Type: LONG, Flags: PRIVATE + PLAYER_FIELD_KEYRING_SLOT_1 = UNIT_END + 0x015C, // Size: 64, Type: LONG, Flags: PRIVATE + PLAYER_FIELD_CURRENCYTOKEN_SLOT_1 = UNIT_END + 0x019C, // Size: 64, Type: LONG, Flags: PRIVATE + PLAYER_FARSIGHT = UNIT_END + 0x01DC, // Size: 2, Type: LONG, Flags: PRIVATE + PLAYER__FIELD_KNOWN_TITLES = UNIT_END + 0x01DE, // Size: 2, Type: LONG, Flags: PRIVATE + PLAYER__FIELD_KNOWN_TITLES1 = UNIT_END + 0x01E0, // Size: 2, Type: LONG, Flags: PRIVATE + PLAYER__FIELD_KNOWN_TITLES2 = UNIT_END + 0x01E2, // Size: 2, Type: LONG, Flags: PRIVATE + PLAYER_FIELD_KNOWN_CURRENCIES = UNIT_END + 0x01E4, // Size: 2, Type: LONG, Flags: PRIVATE + PLAYER_XP = UNIT_END + 0x01E6, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_NEXT_LEVEL_XP = UNIT_END + 0x01E7, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_SKILL_INFO_1_1 = UNIT_END + 0x01E8, // Size: 384, Type: TWO_SHORT, Flags: PRIVATE + PLAYER_CHARACTER_POINTS1 = UNIT_END + 0x0368, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_CHARACTER_POINTS2 = UNIT_END + 0x0369, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_TRACK_CREATURES = UNIT_END + 0x036A, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_TRACK_RESOURCES = UNIT_END + 0x036B, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_BLOCK_PERCENTAGE = UNIT_END + 0x036C, // Size: 1, Type: FLOAT, Flags: PRIVATE + PLAYER_DODGE_PERCENTAGE = UNIT_END + 0x036D, // Size: 1, Type: FLOAT, Flags: PRIVATE + PLAYER_PARRY_PERCENTAGE = UNIT_END + 0x036E, // Size: 1, Type: FLOAT, Flags: PRIVATE + PLAYER_EXPERTISE = UNIT_END + 0x036F, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_OFFHAND_EXPERTISE = UNIT_END + 0x0370, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_CRIT_PERCENTAGE = UNIT_END + 0x0371, // Size: 1, Type: FLOAT, Flags: PRIVATE + PLAYER_RANGED_CRIT_PERCENTAGE = UNIT_END + 0x0372, // Size: 1, Type: FLOAT, Flags: PRIVATE + PLAYER_OFFHAND_CRIT_PERCENTAGE = UNIT_END + 0x0373, // Size: 1, Type: FLOAT, Flags: PRIVATE + PLAYER_SPELL_CRIT_PERCENTAGE1 = UNIT_END + 0x0374, // Size: 7, Type: FLOAT, Flags: PRIVATE + PLAYER_SHIELD_BLOCK = UNIT_END + 0x037B, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_SHIELD_BLOCK_CRIT_PERCENTAGE = UNIT_END + 0x037C, // Size: 1, Type: FLOAT, Flags: PRIVATE + PLAYER_EXPLORED_ZONES_1 = UNIT_END + 0x037D, // Size: 128, Type: BYTES, Flags: PRIVATE + PLAYER_REST_STATE_EXPERIENCE = UNIT_END + 0x03FD, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_COINAGE = UNIT_END + 0x03FE, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_MOD_DAMAGE_DONE_POS = UNIT_END + 0x03FF, // Size: 7, Type: INT, Flags: PRIVATE + PLAYER_FIELD_MOD_DAMAGE_DONE_NEG = UNIT_END + 0x0406, // Size: 7, Type: INT, Flags: PRIVATE + PLAYER_FIELD_MOD_DAMAGE_DONE_PCT = UNIT_END + 0x040D, // Size: 7, Type: INT, Flags: PRIVATE + PLAYER_FIELD_MOD_HEALING_DONE_POS = UNIT_END + 0x0414, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_MOD_HEALING_PCT = UNIT_END + 0x0415, // Size: 1, Type: FLOAT, Flags: PRIVATE + PLAYER_FIELD_MOD_HEALING_DONE_PCT = UNIT_END + 0x0416, // Size: 1, Type: FLOAT, Flags: PRIVATE + PLAYER_FIELD_MOD_TARGET_RESISTANCE = UNIT_END + 0x0417, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE = UNIT_END + 0x0418, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_BYTES = UNIT_END + 0x0419, // Size: 1, Type: BYTES, Flags: PRIVATE + PLAYER_AMMO_ID = UNIT_END + 0x041A, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_SELF_RES_SPELL = UNIT_END + 0x041B, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_PVP_MEDALS = UNIT_END + 0x041C, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_BUYBACK_PRICE_1 = UNIT_END + 0x041D, // Size: 12, Type: INT, Flags: PRIVATE + PLAYER_FIELD_BUYBACK_TIMESTAMP_1 = UNIT_END + 0x0429, // Size: 12, Type: INT, Flags: PRIVATE + PLAYER_FIELD_KILLS = UNIT_END + 0x0435, // Size: 1, Type: TWO_SHORT, Flags: PRIVATE + PLAYER_FIELD_TODAY_CONTRIBUTION = UNIT_END + 0x0436, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_YESTERDAY_CONTRIBUTION = UNIT_END + 0x0437, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_LIFETIME_HONORABLE_KILLS = UNIT_END + 0x0438, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_BYTES2 = UNIT_END + 0x0439, // Size: 1, Type: 6, Flags: PRIVATE + PLAYER_FIELD_WATCHED_FACTION_INDEX = UNIT_END + 0x043A, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_COMBAT_RATING_1 = UNIT_END + 0x043B, // Size: 25, Type: INT, Flags: PRIVATE + PLAYER_FIELD_ARENA_TEAM_INFO_1_1 = UNIT_END + 0x0454, // Size: 21, Type: INT, Flags: PRIVATE + PLAYER_FIELD_HONOR_CURRENCY = UNIT_END + 0x0469, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_ARENA_CURRENCY = UNIT_END + 0x046A, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_MAX_LEVEL = UNIT_END + 0x046B, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_DAILY_QUESTS_1 = UNIT_END + 0x046C, // Size: 25, Type: INT, Flags: PRIVATE + PLAYER_RUNE_REGEN_1 = UNIT_END + 0x0485, // Size: 4, Type: FLOAT, Flags: PRIVATE + PLAYER_NO_REAGENT_COST_1 = UNIT_END + 0x0489, // Size: 3, Type: INT, Flags: PRIVATE + PLAYER_FIELD_GLYPH_SLOTS_1 = UNIT_END + 0x048C, // Size: 6, Type: INT, Flags: PRIVATE + PLAYER_FIELD_GLYPHS_1 = UNIT_END + 0x0492, // Size: 6, Type: INT, Flags: PRIVATE + PLAYER_GLYPHS_ENABLED = UNIT_END + 0x0498, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_PADDING = UNIT_END + 0x0499, // Size: 1, Type: INT, Flags: NONE + PLAYER_END = UNIT_END + 0x049A, }; enum EGameObjectFields { - OBJECT_FIELD_CREATED_BY = OBJECT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC - GAMEOBJECT_DISPLAYID = OBJECT_END + 0x0002, // Size: 1, Type: INT, Flags: PUBLIC - GAMEOBJECT_FLAGS = OBJECT_END + 0x0003, // Size: 1, Type: INT, Flags: PUBLIC - GAMEOBJECT_PARENTROTATION = OBJECT_END + 0x0004, // Size: 4, Type: FLOAT, Flags: PUBLIC - GAMEOBJECT_DYNAMIC = OBJECT_END + 0x0008, // Size: 1, Type: TWO_SHORT, Flags: DYNAMIC - GAMEOBJECT_FACTION = OBJECT_END + 0x0009, // Size: 1, Type: INT, Flags: PUBLIC - GAMEOBJECT_LEVEL = OBJECT_END + 0x000A, // Size: 1, Type: INT, Flags: PUBLIC - GAMEOBJECT_BYTES_1 = OBJECT_END + 0x000B, // Size: 1, Type: BYTES, Flags: PUBLIC - GAMEOBJECT_END = OBJECT_END + 0x000C, + OBJECT_FIELD_CREATED_BY = OBJECT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC + GAMEOBJECT_DISPLAYID = OBJECT_END + 0x0002, // Size: 1, Type: INT, Flags: PUBLIC + GAMEOBJECT_FLAGS = OBJECT_END + 0x0003, // Size: 1, Type: INT, Flags: PUBLIC + GAMEOBJECT_PARENTROTATION = OBJECT_END + 0x0004, // Size: 4, Type: FLOAT, Flags: PUBLIC + GAMEOBJECT_DYNAMIC = OBJECT_END + 0x0008, // Size: 1, Type: TWO_SHORT, Flags: DYNAMIC + GAMEOBJECT_FACTION = OBJECT_END + 0x0009, // Size: 1, Type: INT, Flags: PUBLIC + GAMEOBJECT_LEVEL = OBJECT_END + 0x000A, // Size: 1, Type: INT, Flags: PUBLIC + GAMEOBJECT_BYTES_1 = OBJECT_END + 0x000B, // Size: 1, Type: BYTES, Flags: PUBLIC + GAMEOBJECT_END = OBJECT_END + 0x000C, }; + enum EDynamicObjectFields { - DYNAMICOBJECT_CASTER = OBJECT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC - DYNAMICOBJECT_BYTES = OBJECT_END + 0x0002, // Size: 1, Type: BYTES, Flags: PUBLIC - DYNAMICOBJECT_SPELLID = OBJECT_END + 0x0003, // Size: 1, Type: INT, Flags: PUBLIC - DYNAMICOBJECT_RADIUS = OBJECT_END + 0x0004, // Size: 1, Type: FLOAT, Flags: PUBLIC - DYNAMICOBJECT_CASTTIME = OBJECT_END + 0x0005, // Size: 1, Type: INT, Flags: PUBLIC - DYNAMICOBJECT_END = OBJECT_END + 0x0006, + DYNAMICOBJECT_CASTER = OBJECT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC + DYNAMICOBJECT_BYTES = OBJECT_END + 0x0002, // Size: 1, Type: BYTES, Flags: PUBLIC + DYNAMICOBJECT_SPELLID = OBJECT_END + 0x0003, // Size: 1, Type: INT, Flags: PUBLIC + DYNAMICOBJECT_RADIUS = OBJECT_END + 0x0004, // Size: 1, Type: FLOAT, Flags: PUBLIC + DYNAMICOBJECT_CASTTIME = OBJECT_END + 0x0005, // Size: 1, Type: INT, Flags: PUBLIC + DYNAMICOBJECT_END = OBJECT_END + 0x0006, }; enum ECorpseFields { - CORPSE_FIELD_OWNER = OBJECT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC - CORPSE_FIELD_PARTY = OBJECT_END + 0x0002, // Size: 2, Type: LONG, Flags: PUBLIC - CORPSE_FIELD_DISPLAY_ID = OBJECT_END + 0x0004, // Size: 1, Type: INT, Flags: PUBLIC - CORPSE_FIELD_ITEM = OBJECT_END + 0x0005, // Size: 19, Type: INT, Flags: PUBLIC - CORPSE_FIELD_BYTES_1 = OBJECT_END + 0x0018, // Size: 1, Type: BYTES, Flags: PUBLIC - CORPSE_FIELD_BYTES_2 = OBJECT_END + 0x0019, // Size: 1, Type: BYTES, Flags: PUBLIC - CORPSE_FIELD_GUILD = OBJECT_END + 0x001A, // Size: 1, Type: INT, Flags: PUBLIC - CORPSE_FIELD_FLAGS = OBJECT_END + 0x001B, // Size: 1, Type: INT, Flags: PUBLIC - CORPSE_FIELD_DYNAMIC_FLAGS = OBJECT_END + 0x001C, // Size: 1, Type: INT, Flags: DYNAMIC - CORPSE_FIELD_PAD = OBJECT_END + 0x001D, // Size: 1, Type: INT, Flags: NONE - CORPSE_END = OBJECT_END + 0x001E, + CORPSE_FIELD_OWNER = OBJECT_END + 0x0000, // Size: 2, Type: LONG, Flags: PUBLIC + CORPSE_FIELD_PARTY = OBJECT_END + 0x0002, // Size: 2, Type: LONG, Flags: PUBLIC + CORPSE_FIELD_DISPLAY_ID = OBJECT_END + 0x0004, // Size: 1, Type: INT, Flags: PUBLIC + CORPSE_FIELD_ITEM = OBJECT_END + 0x0005, // Size: 19, Type: INT, Flags: PUBLIC + CORPSE_FIELD_BYTES_1 = OBJECT_END + 0x0018, // Size: 1, Type: BYTES, Flags: PUBLIC + CORPSE_FIELD_BYTES_2 = OBJECT_END + 0x0019, // Size: 1, Type: BYTES, Flags: PUBLIC + CORPSE_FIELD_GUILD = OBJECT_END + 0x001A, // Size: 1, Type: INT, Flags: PUBLIC + CORPSE_FIELD_FLAGS = OBJECT_END + 0x001B, // Size: 1, Type: INT, Flags: PUBLIC + CORPSE_FIELD_DYNAMIC_FLAGS = OBJECT_END + 0x001C, // Size: 1, Type: INT, Flags: DYNAMIC + CORPSE_FIELD_PAD = OBJECT_END + 0x001D, // Size: 1, Type: INT, Flags: NONE + CORPSE_END = OBJECT_END + 0x001E, }; #endif diff --git a/src/game/World.cpp b/src/game/World.cpp index f413fc7dfd1..6a0ec55a86e 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -264,8 +264,6 @@ World::AddSession_ (WorldSession* s) pkt << uint32(sWorld.getConfig(CONFIG_CLIENTCACHE_VERSION)); s->SendPacket(&pkt); - s->SendAccountDataTimes(GLOBAL_CACHE_MASK); - s->SendTutorialsData(); UpdateMaxSessionCounters (); @@ -1044,7 +1042,10 @@ void World::LoadConfigSettings(bool reload) m_configs[CONFIG_ARENA_QUEUE_ANNOUNCER_ENABLE] = sConfig.GetBoolDefault("Arena.QueueAnnouncer.Enable", false); m_configs[CONFIG_ARENA_QUEUE_ANNOUNCER_PLAYERONLY] = sConfig.GetBoolDefault("Arena.QueueAnnouncer.PlayerOnly", false); m_configs[CONFIG_ARENA_SEASON_ID] = sConfig.GetIntDefault ("Arena.ArenaSeason.ID", 1); + m_configs[CONFIG_ARENA_START_RATING] = sConfig.GetIntDefault ("Arena.ArenaStartRating", 0); + m_configs[CONFIG_ARENA_START_PERSONAL_RATING] = sConfig.GetIntDefault ("Arena.ArenaStartPersonalRating", 0); m_configs[CONFIG_ARENA_SEASON_IN_PROGRESS] = sConfig.GetBoolDefault("Arena.ArenaSeason.InProgress", true); + m_configs[CONFIG_ARENA_LK_ARENAS_ENABLE] = sConfig.GetIntDefault ("Arena.LK.ArenasEnable", 0); m_configs[CONFIG_OFFHAND_CHECK_AT_SPELL_UNLEARN] = sConfig.GetBoolDefault("OffhandCheckAtSpellUnlearn", false); @@ -1406,6 +1407,11 @@ void World::SetInitialWorldSettings() sLog.outString("Loading Quests..."); objmgr.LoadQuests(); // must be loaded after DBCs, creature_template, item_template, gameobject tables + + sLog.outString( "Loading Quest POI" ); + objmgr.LoadQuestPOI(); + + sLog.outString("Loading Quests Relations..."); objmgr.LoadQuestRelations(); // must be after quest load sLog.outString("Loading UNIT_NPC_FLAG_SPELLCLICK Data..."); diff --git a/src/game/World.h b/src/game/World.h index b8d9b217562..f89a998afcc 100644 --- a/src/game/World.h +++ b/src/game/World.h @@ -239,6 +239,9 @@ enum WorldConfigs CONFIG_ARENA_QUEUE_ANNOUNCER_PLAYERONLY, CONFIG_ARENA_SEASON_ID, CONFIG_ARENA_SEASON_IN_PROGRESS, + CONFIG_ARENA_START_RATING, + CONFIG_ARENA_START_PERSONAL_RATING, + CONFIG_ARENA_LK_ARENAS_ENABLE, CONFIG_MAX_WHO, CONFIG_BG_START_MUSIC, CONFIG_START_ALL_SPELLS, diff --git a/src/game/WorldSession.h b/src/game/WorldSession.h index a6019d8112c..ce3974312ab 100644 --- a/src/game/WorldSession.h +++ b/src/game/WorldSession.h @@ -726,6 +726,9 @@ class WorldSession void HandleEquipmentSetDelete(WorldPacket& recv_data); void HandleEquipmentSetUse(WorldPacket& recv_data); void HandleWorldStateUITimerUpdate(WorldPacket& recv_data); + void HandleReadyForAccountDataTimes(WorldPacket& recv_data); + void HandleQueryQuestsCompleted(WorldPacket& recv_data); + void HandleQuestPOIQuery(WorldPacket& recv_data); void HandleOnPVPKill(Player *killed); bool HandleOnPlayerChat(const char *text); uint32 HandleOnGetXP(uint32 amount); diff --git a/src/scripts/kalimdor/onyxias_lair/boss_onyxia.cpp b/src/scripts/kalimdor/onyxias_lair/boss_onyxia.cpp index b2d83a76ae2..23cb8f3289e 100644 --- a/src/scripts/kalimdor/onyxias_lair/boss_onyxia.cpp +++ b/src/scripts/kalimdor/onyxias_lair/boss_onyxia.cpp @@ -17,276 +17,344 @@ /* ScriptData SDName: Boss_Onyxia SD%Complete: 90 -SDComment: Spell Heated Ground is wrong, flying animation, visual for area effect +SDComment: Phase 3 need additianal code. Phase 2 requires entries in spell_target_position with specific locations. See bottom of file. SDCategory: Onyxia's Lair EndScriptData */ #include "ScriptedPch.h" -#define SAY_AGGRO -1249000 -#define SAY_KILL -1249001 -#define SAY_PHASE_2_TRANS -1249002 -#define SAY_PHASE_3_TRANS -1249003 -#define EMOTE_BREATH -1249004 - -#define SPELL_WINGBUFFET 18500 -#define SPELL_FLAMEBREATH 18435 -#define SPELL_CLEAVE 19983 -#define SPELL_TAILSWEEP 15847 -#define SPELL_KNOCK_AWAY 19633 - -#define SPELL_ENGULFINGFLAMES 20019 -#define SPELL_DEEPBREATH 23461 -#define SPELL_FIREBALL 18392 - -#define SPELL_BELLOWINGROAR 18431 -#define SPELL_HEATED_GROUND 22191 //Wrong Spell - -#define SPELL_SUMMONWHELP 17646 +enum +{ + SAY_AGGRO = -1249000, + SAY_KILL = -1249001, + SAY_PHASE_2_TRANS = -1249002, + SAY_PHASE_3_TRANS = -1249003, + EMOTE_BREATH = -1249004, + + SPELL_WINGBUFFET = 18500, + SPELL_FLAMEBREATH = 18435, + SPELL_CLEAVE = 19983, + SPELL_TAILSWEEP = 15847, + SPELL_KNOCK_AWAY = 19633, + + SPELL_ENGULFINGFLAMES = 20019, + SPELL_DEEPBREATH = 23461, + SPELL_FIREBALL = 18392, + + //Not much choise about these. We have to make own defintion on the direction/start-end point + //SPELL_BREATH_NORTH_TO_SOUTH = 17086, // 20x in "array" + //SPELL_BREATH_SOUTH_TO_NORTH = 18351, // 11x in "array" + + SPELL_BREATH_EAST_TO_WEST = 18576, // 7x in "array" + SPELL_BREATH_WEST_TO_EAST = 18609, // 7x in "array" + + SPELL_BREATH_SE_TO_NW = 18564, // 12x in "array" + SPELL_BREATH_NW_TO_SE = 18584, // 12x in "array" + SPELL_BREATH_SW_TO_NE = 18596, // 12x in "array" + SPELL_BREATH_NE_TO_SW = 18617, // 12x in "array" + + //SPELL_BREATH = 21131, // 8x in "array", different initial cast than the other arrays + + SPELL_BELLOWINGROAR = 18431, + SPELL_HEATED_GROUND = 22191, + + SPELL_SUMMONWHELP = 17646, + NPC_WHELP = 11262, + MAX_WHELP = 16, + + PHASE_START = 1, + PHASE_BREATH = 2, + PHASE_END = 3 +}; -#define CREATURE_WHELP 11262 +struct sOnyxMove +{ + uint32 uiLocId; + uint32 uiLocIdEnd; + uint32 uiSpellId; + float fX, fY, fZ; +}; -static float MovementLocations[4][3]= +static sOnyxMove aMoveData[]= { - {-64.0523, -213.0619, -68.2985}, - {12.4636, -220.01490, -68.0548}, - {-38.8391, -182.3220, -68.9457}, - {-37.0390, -244.8760, -68.1278} + {0, 1, SPELL_BREATH_WEST_TO_EAST, -33.5561f, -182.682f, -60.9457f},//west + {1, 0, SPELL_BREATH_EAST_TO_WEST, -31.4963f, -250.123f, -60.1278f},//east + {2, 4, SPELL_BREATH_NW_TO_SE, 6.8951f, -180.246f, -60.896f},//north-west + {3, 5, SPELL_BREATH_NE_TO_SW, 10.2191f, -247.912f, -60.896f},//north-east + {4, 2, SPELL_BREATH_SE_TO_NW, -63.5156f, -240.096f, -60.477f},//south-east + {5, 3, SPELL_BREATH_SW_TO_NE, -58.2509f, -189.020f, -60.790f},//south-west + //{6, 7, SPELL_BREATH_SOUTH_TO_NORTH, -65.8444f, -213.809f, -60.2985f},//south + //{7, 6, SPELL_BREATH_NORTH_TO_SOUTH, 22.8763f, -217.152f, -60.0548f},//north }; -static float SpawnLocations[4][3]= +static float afSpawnLocations[2][3]= { {-30.127, -254.463, -89.440}, - {-30.817, -177.106, -89.258}, - {14.480, -241.560, -85.6300}, - {17.372, -190.840, -85.2810}, + {-30.817, -177.106, -89.258} }; struct boss_onyxiaAI : public ScriptedAI { - boss_onyxiaAI(Creature* c) : ScriptedAI(c) {} + boss_onyxiaAI(Creature* pCreature) : ScriptedAI(pCreature) {Reset();} + + uint32 m_uiPhase; - uint32 Phase; + uint32 m_uiFlameBreathTimer; + uint32 m_uiCleaveTimer; + uint32 m_uiTailSweepTimer; + uint32 m_uiWingBuffetTimer; - uint32 FlameBreathTimer; - uint32 CleaveTimer; - uint32 TailSweepTimer; - uint32 MovementTimer; - uint32 EngulfingFlamesTimer; - uint32 SummonWhelpsTimer; - uint32 BellowingRoarTimer; - uint32 WingBuffetTimer; - uint32 KnockAwayTimer; - uint32 FireballTimer; + uint32 m_uiMovePoint; + uint32 m_uiMovementTimer; + sOnyxMove* m_pPointData; - bool InitialSpawn; + uint32 m_uiEngulfingFlamesTimer; + uint32 m_uiSummonWhelpsTimer; + uint32 m_uiBellowingRoarTimer; + uint32 m_uiWhelpTimer; + + uint8 m_uiSummonCount; + bool m_bIsSummoningWhelps; void Reset() { - Phase = 1; - - FlameBreathTimer = 20000; - TailSweepTimer = 2000; - CleaveTimer = 15000; - MovementTimer = 3000; - EngulfingFlamesTimer = 15000; - SummonWhelpsTimer = 45000; - BellowingRoarTimer = 30000; - WingBuffetTimer = 17000; - KnockAwayTimer = 15000; - FireballTimer = 18000; - - InitialSpawn = true; + if (!IsCombatMovement()) + SetCombatMovement(true); + + m_uiPhase = PHASE_START; + + m_uiFlameBreathTimer = urand(10000, 20000); + m_uiTailSweepTimer = urand(15000, 20000); + m_uiCleaveTimer = urand(2000, 5000); + m_uiWingBuffetTimer = urand(10000, 20000); + + m_uiMovePoint = urand(0, 5); + m_uiMovementTimer = 20000; + m_pPointData = GetMoveData(); + + m_uiEngulfingFlamesTimer = 15000; + m_uiSummonWhelpsTimer = 45000; + m_uiBellowingRoarTimer = 30000; + m_uiWhelpTimer = 1000; + + m_uiSummonCount = 0; + m_bIsSummoningWhelps = false; } - void EnterCombat(Unit* who) + void Aggro(Unit* pWho) { DoScriptText(SAY_AGGRO, m_creature); - DoZoneInCombat(); + m_creature->SetInCombatWithZone(); } - void JustDied(Unit* Killer) + void JustSummoned(Creature *pSummoned) { + if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,0)) + pSummoned->AI()->AttackStart(pTarget); + + ++m_uiSummonCount; } - void KilledUnit(Unit *victim) + void KilledUnit(Unit* pVictim) { DoScriptText(SAY_KILL, m_creature); } - void UpdateAI(const uint32 diff) + void SpellHit(Unit *pCaster, const SpellEntry* pSpell) { - if (!UpdateVictim()) - return; - - if (((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 60) && (Phase == 1)) + if (pSpell->Id == SPELL_BREATH_EAST_TO_WEST || + pSpell->Id == SPELL_BREATH_WEST_TO_EAST || + pSpell->Id == SPELL_BREATH_SE_TO_NW || + pSpell->Id == SPELL_BREATH_NW_TO_SE || + pSpell->Id == SPELL_BREATH_SW_TO_NE || + pSpell->Id == SPELL_BREATH_NE_TO_SW) { - Phase = 2; - m_creature->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); - m_creature->SetHover(true); - m_creature->GetMotionMaster()->Clear(false); - m_creature->GetMotionMaster()->MoveIdle(); - DoScriptText(SAY_PHASE_2_TRANS, m_creature); + if (m_pPointData) + { + m_creature->GetMap()->CreatureRelocation(m_creature, m_pPointData->fX, m_pPointData->fY, m_pPointData->fZ, 0.0f); + m_creature->GetMotionMaster()->MovePoint(0, -10.6155, -219.357, -87.7344); + + } } + } - if (((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 40) && (Phase == 2)) + sOnyxMove* GetMoveData() + { + uint32 uiMaxCount = sizeof(aMoveData)/sizeof(sOnyxMove); + + for (uint32 i = 0; i < uiMaxCount; ++i) { - Phase = 3; - m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING); - m_creature->SetHover(false); - m_creature->GetMotionMaster()->MovePoint(0, -10.6155, -219.357, -87.7344); - DoStartMovement(m_creature->getVictim()); - m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); - DoScriptText(SAY_PHASE_3_TRANS, m_creature); - m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); + if (aMoveData[i].uiLocId == m_uiMovePoint) + return &aMoveData[i]; } - if (Phase == 1 || Phase == 3) + return NULL; + } + + void SetNextRandomPoint() + { + uint32 uiMaxCount = sizeof(aMoveData)/sizeof(sOnyxMove); + + int iTemp = rand()%(uiMaxCount-1); + + if (iTemp >= m_uiMovePoint) + ++iTemp; + + m_uiMovePoint = iTemp; + } + + void UpdateAI(const uint32 uiDiff) + { + if (!UpdateVictim()) + return; + + if (m_uiPhase == PHASE_START || m_uiPhase == PHASE_END) { - if (FlameBreathTimer <= diff) + if (m_uiFlameBreathTimer <= uiDiff) { DoCast(m_creature->getVictim(), SPELL_FLAMEBREATH); - FlameBreathTimer = 15000; - } else FlameBreathTimer -= diff; + m_uiFlameBreathTimer = urand(10000, 20000); + } + else + m_uiFlameBreathTimer -= uiDiff; - if (TailSweepTimer <= diff) + if (m_uiTailSweepTimer <= uiDiff) { - Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 1); - if (pTarget && !m_creature->HasInArc(M_PI, pTarget)) - DoCast(pTarget, SPELL_TAILSWEEP); - - TailSweepTimer = 10000; - } else TailSweepTimer -= diff; + DoCast(m_creature, SPELL_TAILSWEEP); + m_uiTailSweepTimer = urand(15000, 20000); + } + else + m_uiTailSweepTimer -= uiDiff; - if (CleaveTimer <= diff) + if (m_uiCleaveTimer <= uiDiff) { DoCast(m_creature->getVictim(), SPELL_CLEAVE); - CleaveTimer = 10000; - } else CleaveTimer -= diff; + m_uiCleaveTimer = urand(2000, 5000); + } + else + m_uiCleaveTimer -= uiDiff; - if (WingBuffetTimer <= diff) + if (m_uiWingBuffetTimer <= uiDiff) { DoCast(m_creature->getVictim(), SPELL_WINGBUFFET); - WingBuffetTimer = 7000 + ((rand()%8)*1000); - } else WingBuffetTimer -= diff; + m_uiWingBuffetTimer = urand(15000, 30000); + } + else + m_uiWingBuffetTimer -= uiDiff; - if (KnockAwayTimer <= diff) + if (m_uiPhase == PHASE_END) { - if (rand() <= 30) + if (m_uiBellowingRoarTimer <= uiDiff) { - DoCast(m_creature->getVictim(), SPELL_KNOCK_AWAY); + DoCast(m_creature->getVictim(), SPELL_BELLOWINGROAR); + m_uiBellowingRoarTimer = 30000; } - KnockAwayTimer = 15000; - } else KnockAwayTimer -= diff; - - if (Phase == 3) + else + m_uiBellowingRoarTimer -= uiDiff; + } + else { - if (BellowingRoarTimer <= diff) + if (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() < 60) { - DoCast(m_creature->getVictim(), SPELL_BELLOWINGROAR); + m_uiPhase = PHASE_BREATH; - BellowingRoarTimer = 30000; - } else BellowingRoarTimer -= diff; + SetCombatMovement(false); - if (SummonWhelpsTimer <= diff) - { - SummonWhelps(Phase); + m_creature->GetMotionMaster()->Clear(false); + m_creature->GetMotionMaster()->MoveIdle(); - SummonWhelpsTimer = 45000; - } else SummonWhelpsTimer -= diff; + DoScriptText(SAY_PHASE_2_TRANS, m_creature); + + if (m_pPointData) + m_creature->GetMotionMaster()->MovePoint(m_pPointData->uiLocId, m_pPointData->fX, m_pPointData->fY, m_pPointData->fZ); + + SetNextRandomPoint(); + return; + } } DoMeleeAttackIfReady(); } - - if (Phase == 2) + else { - if (InitialSpawn) + if (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() < 40) { - InitialSpawn = false; + m_uiPhase = PHASE_END; + DoScriptText(SAY_PHASE_3_TRANS, m_creature); - for (uint32 i = 0; i < 10; ++i) - { - uint32 random = rand()%4; - Creature* Whelp = m_creature->SummonCreature(CREATURE_WHELP, SpawnLocations[random][0], SpawnLocations[random][1], SpawnLocations[random][2], 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000); - if (Whelp) - Whelp->AI()->AttackStart(SelectUnit(SELECT_TARGET_RANDOM, 0)); - } + SetCombatMovement(true); + m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); + + return; } - if (EngulfingFlamesTimer <= diff) + if (m_uiMovementTimer <= uiDiff) { - DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_ENGULFINGFLAMES); - m_creature->HandleEmoteCommand(ANIM_FLY); + m_pPointData = GetMoveData(); - EngulfingFlamesTimer = 10000; - } - else EngulfingFlamesTimer -= diff; + SetNextRandomPoint(); - if (FireballTimer <= diff) - { - DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_FIREBALL); + m_uiMovementTimer = 25000; - FireballTimer = 18000; - } - else FireballTimer -= diff; + if (!m_pPointData) + return; - if (MovementTimer <= diff) - { - if (rand()%100 < 30) + if (m_uiMovePoint == m_pPointData->uiLocIdEnd) { + if (m_creature->IsNonMeleeSpellCasted(false)) + m_creature->InterruptNonMeleeSpells(false); + DoScriptText(EMOTE_BREATH, m_creature); - DoCast(m_creature->getVictim(), SPELL_DEEPBREATH); + DoCast(m_creature, m_pPointData->uiSpellId); + } + else + { + m_creature->GetMotionMaster()->MovePoint(m_pPointData->uiLocId, m_pPointData->fX, m_pPointData->fY, m_pPointData->fZ); } - else ChangePosition(); - - MovementTimer = 25000; - } else MovementTimer -= diff; - - if (SummonWhelpsTimer <= diff) - { - SummonWhelps(Phase); - - SummonWhelpsTimer = 45000; } - else SummonWhelpsTimer -= diff; - } - } + else + m_uiMovementTimer -= uiDiff; - void ChangePosition() - { - uint32 random = rand() % 4; - if (random<4){ - m_creature->GetMotionMaster()->MovePoint(0, MovementLocations[random][0], MovementLocations[random][1], MovementLocations[random][2]);} - } - - void SummonWhelps(uint32 Phase) - { - if (Phase == 2) - { - uint32 max = rand()%10; - for (uint32 i = 0; i < max; ++i) + if (m_uiEngulfingFlamesTimer <= uiDiff) { - uint32 random = rand()%3; - Creature* Whelp = m_creature->SummonCreature(CREATURE_WHELP, SpawnLocations[random][0], SpawnLocations[random][1], SpawnLocations[random][2], 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000); - if (Whelp) - Whelp->AI()->AttackStart(SelectUnit(SELECT_TARGET_RANDOM, 0)); + if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() != POINT_MOTION_TYPE) + { + if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0)) + DoCast(pTarget, SPELL_FIREBALL); + + m_uiEngulfingFlamesTimer = 8000; + } } - } + else + m_uiEngulfingFlamesTimer -= uiDiff; //engulfingflames is supposed to be activated by a fireball but haven't come by - if (Phase == 3) - { - uint32 max = rand() % 10 +1; - if (max < 5) + if (m_bIsSummoningWhelps) { - for (uint32 i = 0; i < max; ++i) + if (m_uiSummonCount < MAX_WHELP) { - uint32 random = rand()%4; - Creature* Whelp = m_creature->SummonCreature(CREATURE_WHELP, SpawnLocations[random][0], SpawnLocations[random][1], SpawnLocations[random][2], 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000); - if (Whelp) - Whelp->AI()->AttackStart(SelectUnit(SELECT_TARGET_RANDOM, 0)); + if (m_uiWhelpTimer <= uiDiff) + { + m_creature->SummonCreature(NPC_WHELP, afSpawnLocations[0][0], afSpawnLocations[0][1], afSpawnLocations[0][2], 0.0f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000); + m_creature->SummonCreature(NPC_WHELP, afSpawnLocations[1][0], afSpawnLocations[1][1], afSpawnLocations[1][2], 0.0f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000); + m_uiWhelpTimer = 1000; + } + else + m_uiWhelpTimer -= uiDiff; + } + else + { + m_bIsSummoningWhelps = false; + m_uiSummonCount = 0; + m_uiSummonWhelpsTimer = 30000; } } + else + { + if (m_uiSummonWhelpsTimer <= uiDiff) + m_bIsSummoningWhelps = true; + else + m_uiSummonWhelpsTimer -= uiDiff; + } } } }; @@ -304,4 +372,3 @@ void AddSC_boss_onyxia() newscript->GetAI = &GetAI_boss_onyxiaAI; newscript->RegisterSelf(); } - diff --git a/src/scripts/kalimdor/temple_of_ahnqiraj/boss_skeram.cpp b/src/scripts/kalimdor/temple_of_ahnqiraj/boss_skeram.cpp index 7e64259efad..11980a94b68 100644 --- a/src/scripts/kalimdor/temple_of_ahnqiraj/boss_skeram.cpp +++ b/src/scripts/kalimdor/temple_of_ahnqiraj/boss_skeram.cpp @@ -233,7 +233,7 @@ struct boss_skeramAI : public ScriptedAI for (uint8 ico = 0; ico < TARGETICONCOUNT; ++ico) { //if (grp->m_targetIcons[ico] == m_creature->GetGUID()) -- private member :( - pGrp->SetTargetIcon(ico, 0); + pGrp->SetTargetIcon(ico, 0, 0); } break; diff --git a/src/scripts/northrend/azjol_nerub/ahnkahet/boss_elder_nadox.cpp b/src/scripts/northrend/azjol_nerub/ahnkahet/boss_elder_nadox.cpp index f39ea93a11e..4451a190bf9 100644 --- a/src/scripts/northrend/azjol_nerub/ahnkahet/boss_elder_nadox.cpp +++ b/src/scripts/northrend/azjol_nerub/ahnkahet/boss_elder_nadox.cpp @@ -66,6 +66,8 @@ struct boss_elder_nadoxAI : public ScriptedAI uint32 swarmer_spawn_Timer; uint32 guard_spawn_Timer; uint32 enrage_Timer; + + bool GuardSpawned; ScriptedInstance *pInstance; @@ -80,6 +82,7 @@ struct boss_elder_nadoxAI : public ScriptedAI enrage_Timer = 5000; DeadAhnkaharGuardian = false; + GuardSpawned = false; if (pInstance) pInstance->SetData(DATA_ELDER_NADOX_EVENT, NOT_STARTED); @@ -156,11 +159,11 @@ struct boss_elder_nadoxAI : public ScriptedAI swarmer_spawn_Timer = 10000; } else swarmer_spawn_Timer -= diff; - if (guard_spawn_Timer <= diff) + if (!GuardSpawned && guard_spawn_Timer <= diff) { m_creature->MonsterTextEmote(EMOTE_HATCHES,m_creature->GetGUID(),true); DoCast(m_creature, SPELL_SUMMON_SWARM_GUARD); - guard_spawn_Timer = 25000; + GuardSpawned = true; } else guard_spawn_Timer -= diff; if (enrage_Timer <= diff) diff --git a/src/scripts/northrend/ulduar/halls_of_stone/halls_of_stone.cpp b/src/scripts/northrend/ulduar/halls_of_stone/halls_of_stone.cpp index 20f3b275d72..75f62af171a 100644 --- a/src/scripts/northrend/ulduar/halls_of_stone/halls_of_stone.cpp +++ b/src/scripts/northrend/ulduar/halls_of_stone/halls_of_stone.cpp @@ -104,12 +104,7 @@ enum Quests #define GOSSIP_ITEM_START "Brann, it would be our honor!" #define GOSSIP_ITEM_PROGRESS "Let's move Brann, enough of the history lessons!" -struct Locations -{ - float x, y, z; -}; - -static Locations SpawnLocations[]= +static Position SpawnLocations[]= { {946.992, 397.016, 208.374}, {960.748, 382.944, 208.374}, @@ -295,7 +290,6 @@ struct npc_brann_hosAI : public npc_escortAI case 13: DoScriptText(SAY_EVENT_INTRO_1, m_creature); SetEscortPaused(true); - SetRun(true); JumpToNextStep(20000); break; case 17: @@ -320,16 +314,16 @@ struct npc_brann_hosAI : public npc_escortAI { uint32 uiSpawnNumber = DUNGEON_MODE(2,3); for (uint8 i = 0; i < uiSpawnNumber; ++i) - m_creature->SummonCreature(CREATURE_DARK_RUNE_PROTECTOR, SpawnLocations[0].x, SpawnLocations[0].y, SpawnLocations[0].z, 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); - m_creature->SummonCreature(CREATURE_DARK_RUNE_STORMCALLER, SpawnLocations[0].x, SpawnLocations[0].y, SpawnLocations[0].z, 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); + m_creature->SummonCreature(CREATURE_DARK_RUNE_PROTECTOR, SpawnLocations[0], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); + m_creature->SummonCreature(CREATURE_DARK_RUNE_STORMCALLER, SpawnLocations[0], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); break; } case 2: for (uint8 i = 0; i < 2; ++i) - m_creature->SummonCreature(CREATURE_DARK_RUNE_STORMCALLER, SpawnLocations[1].x, SpawnLocations[1].y, SpawnLocations[1].z, 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); + m_creature->SummonCreature(CREATURE_DARK_RUNE_STORMCALLER, SpawnLocations[0], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); break; case 3: - m_creature->SummonCreature(CREATURE_IRON_GOLEM_CUSTODIAN, SpawnLocations[1].x, SpawnLocations[1].y, SpawnLocations[1].z, 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); + m_creature->SummonCreature(CREATURE_IRON_GOLEM_CUSTODIAN, SpawnLocations[0], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); break; } } @@ -370,6 +364,7 @@ struct npc_brann_hosAI : public npc_escortAI } bIsBattle = false; DoScriptText(SAY_ESCORT_START, m_creature); + SetRun(true); JumpToNextStep(0); break; case 3: diff --git a/src/scripts/northrend/ulduar/ulduar/boss_algalon.cpp b/src/scripts/northrend/ulduar/ulduar/boss_algalon.cpp index a9f1be65f2d..32b5190ccf4 100644 --- a/src/scripts/northrend/ulduar/ulduar/boss_algalon.cpp +++ b/src/scripts/northrend/ulduar/ulduar/boss_algalon.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008 - 2009 Trinity <http://www.trinitycore.org/> + * Copyright (C) 2008 - 2010 Trinity <http://www.trinitycore.org/> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,3 +18,343 @@ #include "ScriptedPch.h" #include "ulduar.h" + +#define GAMEOBJECT_GIVE_OF_THE_OBSERVER 194821 + +enum Spells +{ + SPELL_ASCEND = 64487, + SPELL_BERSERK = 47008, + SPELL_BIG_BANG = 64443, + H_SPELL_BIG_BANG = 64584, + SPELL_COSMIC_SMASH = 62301, + H_SPELL_COSMIC_SMASH = 64598, + SPELL_PHASE_PUNCH = 64412, + SPELL_QUANTUM_STRIKE = 64395, + H_SPELL_QUANTUM_STRIKE = 64592, + SPELL_BLACK_HOLE_EXPLOSION = 64122, + SPELL_ARCANE_BARAGE = 64599, + H_SPELL_ARCANE_BARAGE = 64607 +}; + +enum Creatures +{ + CREATURE_COLLAPSING_STAR = 32955, + CREATURE_BLACK_HOLE = 32953, + CREATURE_LIVING_CONSTELLATION = 33052, + CREATURE_DARK_MATTER = 33089 +}; + +#define NORDRASSIL_X 1614.288574 +#define NORDRASSIL_Y -320.713287 +#define NORDRASSIL_Z 417.321167 +#define NORDRASSIL_X 1614.276245 +#define NORDRASSIL_Y -287.016632 +#define NORDRASSIL_Z 417.321106 +#define NORDRASSIL_X 1650.428467 +#define NORDRASSIL_Y -292.331390 +#define NORDRASSIL_Z 417.321167 +#define NORDRASSIL_X 1649.501831 +#define NORDRASSIL_Y -324.609222 +#define NORDRASSIL_Z 417.322174 + +enum Texts +{ + SAY_AGGRO = -1620000, + SAY_KILL_1 = -1620005, + SAY_KILL_2 = -1620006, + SAY_BIG_BANG_1 = -1620002, + SAY_BIG_BANG_2 = -1620003, + SAY_PHASE_2 = -1620003, + SAY_BLACK_HOLE = -1620004, + SAY_BERSERK = -1620007, + SAY_SUMMON_COLLAPSING_STAR = -1620008, + SAY_ENGADED_FOR_FIRTS_TIME = -1620001, + SAY_SUMMON1 = -1620010, + SAY_SUMMON2 = -1620011, + SAY_SUMMON3 = -1620012, + SAY_DEATH_1 = -1620013, + SAY_DEATH_2 = -1620014, + SAY_DEATH_3 = -1620015, + SAY_DEATH_4 = -1620009, + SAY_DEFEAT_1 = -1620016, + SAY_DEFEAT_2 = -1620017, + SAY_DEFEAT_3 = -1620018 +}; + +struct boss_algalonAI : public ScriptedAI +{ + boss_algalonAI(Creature *c) : ScriptedAI(c) + { + pInstance = c->GetInstanceData(); + } + + ScriptedInstance* pInstance; + + std::list<uint64> m_lCollapsingStarGUIDList; + + uint32 Phase; + uint32 Ascend_Timer; + uint32 Berserk_Timer; + uint32 BigBang_Timer; + uint32 CosmicSmash_Timer; + uint32 PhasePunch_Timer; + uint32 QuantumStrike_Timer; + uint32 CollapsingStar_Timer; + uint32 uiPhase_timer; + uint32 uiStep; + + uint64 BlackHoleGUID; + + bool Enrage; + bool m_bIsHeroicMode; + bool Summon; + + void EnterCombat(Unit* who) + { + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + me->SetReactState(REACT_PASSIVE); + } + + void KilledUnit(Unit *victim) + { + DoScriptText(RAND(SAY_KILL_1,SAY_KILL_2), me); + } + + void Reset() + { + Phase = 1; + + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + DoScriptText(SAY_DEFEAT_1, me); + DoScriptText(SAY_DEFEAT_2, me); + DoScriptText(SAY_DEFEAT_3, me); + if (pInstance) + pInstance->SetData(TYPE_ALGALON, NOT_STARTED); + + BlackHoleGUID = 0; + + Ascend_Timer = 480000; //8 minutes + QuantumStrike_Timer = 4000 + rand()%10000; + Berserk_Timer = 360000; //6 minutes + CollapsingStar_Timer = urand(15000, 20000); //Spawns between 15 to 20 seconds + BigBang_Timer = 90000; + PhasePunch_Timer = 8000; + CosmicSmash_Timer = urand(30000, 60000); + } + + void JumpToNextStep(uint32 uiTimer) + { + uiPhase_timer = uiTimer; + ++uiStep; + } + + void Aggro(Unit* pWho) + { + me->InterruptSpell(CURRENT_CHANNELED_SPELL); + me->SetInCombatWithZone(); + if (pInstance) + pInstance->SetData(TYPE_ALGALON, IN_PROGRESS); + } + + void DespawnCollapsingStar() + { + if (m_lCollapsingStarGUIDList.empty()) + return; + for(std::list<uint64>::iterator itr = m_lCollapsingStarGUIDList.begin(); itr != m_lCollapsingStarGUIDList.end(); ++itr) + { + if (Creature* pTemp = (Creature*)Unit::GetUnit(*me, *itr)) + { + if (pTemp->isAlive()) + pTemp->ForcedDespawn(); + } + } + m_lCollapsingStarGUIDList.clear(); + } + + void JustSummoned(Creature* pSummoned) + { + if (pSummoned->GetEntry() == CREATURE_COLLAPSING_STAR) + { + Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0); + if (me->getVictim()) + pSummoned->AI()->AttackStart(pTarget ? pTarget : me->getVictim()); + m_lCollapsingStarGUIDList.push_back(pSummoned->GetGUID()); + } + } + + void SummonCollapsingStar(Unit* target) + { + DoScriptText(SAY_SUMMON_COLLAPSING_STAR, me); + me->SummonCreature(CREATURE_COLLAPSING_STAR,target->GetPositionX()+15.0,target->GetPositionY()+15.0,target->GetPositionZ(),0, TEMPSUMMON_TIMED_DESPAWN, 100000); + DoScriptText(SAY_BLACK_HOLE, me); + me->SummonCreature(CREATURE_BLACK_HOLE,target->GetPositionX()+15.0,target->GetPositionY()+15.0,target->GetPositionZ(),0, TEMPSUMMON_TIMED_DESPAWN, 27000); + } + + void UpdateAI(const uint32 diff) + { + //Return since we have no target + if (!UpdateVictim()) + return; + + if ((me->GetHealth()*100 / me->GetMaxHealth()) < 20 && Phase == 1) + { + Phase = 2; + DoScriptText(SAY_PHASE_2, me); + } + + if ((me->GetHealth()*100 / me->GetMaxHealth()) < 2) + { + me->SummonGameObject(GAMEOBJECT_GIVE_OF_THE_OBSERVER, 1634.258667, -295.101166,417.321381,0,0,0,0,0,-10); + + DoScriptText(SAY_DEATH_1, me); + DoScriptText(SAY_DEATH_2, me); + DoScriptText(SAY_DEATH_3, me); + DoScriptText(SAY_DEATH_4, me); + + me->DisappearAndDie(); + + if (pInstance) + pInstance->SetData(TYPE_ALGALON, DONE); + } + + if (Phase == 1) + { + if (!Summon) + { + if (uiPhase_timer <= diff) + { + switch(uiStep) + { + case 1: DoScriptText(SAY_SUMMON1, m_creature); break; JumpToNextStep(3000); + case 2: DoScriptText(SAY_SUMMON2, m_creature); break; JumpToNextStep(3000); + case 3: DoScriptText(SAY_SUMMON3, m_creature); break; JumpToNextStep(3000); + case 4: DoScriptText(SAY_ENGADED_FOR_FIRTS_TIME, m_creature); break; JumpToNextStep(3000); + case 5: DoScriptText(SAY_AGGRO, m_creature); break; + case 6: m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); break; + case 7: m_creature->SetReactState(REACT_AGGRESSIVE); break; + } + }else uiPhase_timer -= diff; + } + + if(QuantumStrike_Timer <= diff) + { + DoCast(me->getVictim(), m_bIsHeroicMode ? H_SPELL_QUANTUM_STRIKE : SPELL_QUANTUM_STRIKE, true); + + QuantumStrike_Timer = 4000 + rand()%10000; + }else QuantumStrike_Timer -= diff; + + if(BigBang_Timer <= diff) + { + DoScriptText(RAND(SAY_BIG_BANG_1,SAY_BIG_BANG_2), me); + DoCast(me->getVictim(), m_bIsHeroicMode ? H_SPELL_BIG_BANG : SPELL_BIG_BANG, true); + + BigBang_Timer = 90000; + }else BigBang_Timer -= diff; + + if(Ascend_Timer <= diff) + { + DoCast(me->getVictim(),SPELL_ASCEND, true); + + Ascend_Timer = 480000; + }else Ascend_Timer -= diff; + + if(PhasePunch_Timer <= diff) + { + DoCast(me->getVictim(),SPELL_PHASE_PUNCH, true); + + PhasePunch_Timer = 8000; + }else PhasePunch_Timer -= diff; + + if(CosmicSmash_Timer <= diff) + { + DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), m_bIsHeroicMode ? H_SPELL_COSMIC_SMASH : SPELL_COSMIC_SMASH, true); + + CosmicSmash_Timer = urand(30000, 60000); + }else CosmicSmash_Timer -= diff; + + if(Berserk_Timer <= diff) + { + DoScriptText(SAY_BERSERK, me); + DoCast(me->getVictim(),SPELL_BERSERK, true); + + Berserk_Timer = 360000; + }else Berserk_Timer -= diff; + + DoMeleeAttackIfReady(); + + EnterEvadeIfOutOfCombatArea(diff); + } + + if (Phase == 2) + { + if (Enrage) + { + if (Ascend_Timer <= diff) + { + DoCast(me, SPELL_ASCEND); + DoScriptText(SAY_BERSERK, me); + Ascend_Timer = 360000 + rand()%5000; + Enrage = false; + } else Ascend_Timer -= diff; + } + } + + DoMeleeAttackIfReady(); + } +}; +//Collapsing Star +struct mob_collapsing_starAI : public ScriptedAI +{ + mob_collapsing_starAI(Creature *pCreature) : ScriptedAI(pCreature) + { + pInstance = (ScriptedInstance*)pCreature->GetInstanceData(); + Reset(); + } + + ScriptedInstance* pInstance; + + uint32 BlackHoleExplosion_Timer; + + void Reset() + { + BlackHoleExplosion_Timer = 0; + } + + void UpdateAI(const uint32 diff) + { + if (!UpdateVictim()) + return; + + if(BlackHoleExplosion_Timer <= diff) + { + me->CastSpell(me, SPELL_BLACK_HOLE_EXPLOSION, false); + BlackHoleExplosion_Timer = 0; + }else BlackHoleExplosion_Timer -= diff; + } +}; + +CreatureAI* GetAI_boss_algalon(Creature* pCreature) +{ + return new boss_algalonAI(pCreature); +} + +CreatureAI* GetAI_mob_collapsing_star(Creature* pCreature) +{ + return new mob_collapsing_starAI(pCreature); +} + +void AddSC_boss_Algalon() +{ + Script *newscript; + + newscript = new Script; + newscript->Name = "boss_algalon"; + newscript->GetAI = &GetAI_boss_algalon; + newscript->RegisterSelf(); + + newscript = new Script; + newscript->Name = "mob_collapsing_star"; + newscript->GetAI = &GetAI_mob_collapsing_star; + newscript->RegisterSelf(); +} diff --git a/src/scripts/outland/boss_doomlord_kazzak.cpp b/src/scripts/outland/boss_doomlord_kazzak.cpp index 7b7d22a395a..2d2339d2c26 100644 --- a/src/scripts/outland/boss_doomlord_kazzak.cpp +++ b/src/scripts/outland/boss_doomlord_kazzak.cpp @@ -23,18 +23,18 @@ EndScriptData */ #include "ScriptedPch.h" -#define SAY_INTRO -1000375 //signed for 3465 -#define SAY_AGGRO1 -1000376 //signed for 3465 -#define SAY_AGGRO2 -1000377 //signed for 3465 -#define SAY_SURPREME1 -1000378 //signed for 3465 -#define SAY_SURPREME2 -1000379 //signed for 3465 -#define SAY_KILL1 -1000380 //signed for 3465 -#define SAY_KILL2 -1000381 //signed for 21027 -#define SAY_KILL3 -1000382 //signed for 21027 -#define SAY_DEATH -1000383 //signed for 21027 -#define EMOTE_FRENZY -1000384 //signed for 21027 -#define SAY_RAND1 -1000385 //signed for 21027 -#define SAY_RAND2 -1000386 //signed for 21027 +#define SAY_INTRO -1000147 +#define SAY_AGGRO1 -1000148 +#define SAY_AGGRO2 -1000149 +#define SAY_SURPREME1 -1000154 +#define SAY_SURPREME2 -1000149 +#define SAY_KILL1 -1000150 +#define SAY_KILL2 -1000151 +#define SAY_KILL3 -1000152 +#define SAY_DEATH -1000155 +#define EMOTE_FRENZY -1000151 +#define SAY_RAND1 -1000158 +#define SAY_RAND2 -1000157 #define SPELL_SHADOWVOLLEY 32963 #define SPELL_CLEAVE 31779 diff --git a/src/scripts/outland/boss_doomwalker.cpp b/src/scripts/outland/boss_doomwalker.cpp index e0db99ec196..761f9e22289 100644 --- a/src/scripts/outland/boss_doomwalker.cpp +++ b/src/scripts/outland/boss_doomwalker.cpp @@ -23,15 +23,15 @@ EndScriptData */ #include "ScriptedPch.h" -#define SAY_AGGRO -1000387 //signed for 21027 -#define SAY_EARTHQUAKE_1 -1000388 //signed for 21027 -#define SAY_EARTHQUAKE_2 -1000389 //signed for 21027 -#define SAY_OVERRUN_1 -1000390 //signed for 21027 -#define SAY_OVERRUN_2 -1000391 //signed for 5955 -#define SAY_SLAY_1 -1000392 //signed for 5955 -#define SAY_SLAY_2 -1000393 //signed for 5955 -#define SAY_SLAY_3 -1000394 //signed for 5955 -#define SAY_DEATH -1000395 //signed for 5955 +#define SAY_AGGRO -1000159 +#define SAY_EARTHQUAKE_1 -1000160 +#define SAY_EARTHQUAKE_2 -1000161 +#define SAY_OVERRUN_1 -1000162 +#define SAY_OVERRUN_2 -1000163 +#define SAY_SLAY_1 -1000164 +#define SAY_SLAY_2 -1000165 +#define SAY_SLAY_3 -1000166 +#define SAY_DEATH -1000167 #define SPELL_EARTHQUAKE 32686 #define SPELL_SUNDER_ARMOR 33661 diff --git a/src/shared/Database/SQLStorage.cpp b/src/shared/Database/SQLStorage.cpp index e36297ed35b..01b3e283250 100644 --- a/src/shared/Database/SQLStorage.cpp +++ b/src/shared/Database/SQLStorage.cpp @@ -27,17 +27,17 @@ extern DatabasePostgre WorldDatabase; extern DatabaseMysql WorldDatabase; #endif -const char CreatureInfosrcfmt[]="iiiiiiiiiisssiiiiiiiffiffiifiiiiiiiiiiffiiiiiiiiiiiiiiiiiiiiiiiisiifffliiiiiiiliiis"; -const char CreatureInfodstfmt[]="iiiiiiiiiisssiiiiiiiffiffiifiiiiiiiiiiffiiiiiiiiiiiiiiiiiiiiiiiisiifffliiiiiiiliiii"; +const char CreatureInfosrcfmt[]="iiiiiiiiiisssiiiiiiiffiffiifiiiiiiiiiiffiiiiiiiiiiiiiiiiiiiiiiiisiifffliiiiiiiliiisi"; +const char CreatureInfodstfmt[]="iiiiiiiiiisssiiiiiiiffiffiifiiiiiiiiiiffiiiiiiiiiiiiiiiiiiiiiiiisiifffliiiiiiiliiiii"; const char CreatureDataAddonInfofmt[]="iiiiiis"; const char CreatureModelfmt[]="iffbi"; const char CreatureInfoAddonInfofmt[]="iiiiiis"; const char EquipmentInfofmt[]="iiii"; -const char GameObjectInfosrcfmt[]="iiissssiifiiiiiiiiiiiiiiiiiiiiiiiiiiiiiis"; -const char GameObjectInfodstfmt[]="iiissssiifiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"; -const char ItemPrototypesrcfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiiisiiii"; -const char ItemPrototypedstfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiiiiiiii"; -const char PageTextfmt[]="isi"; +const char GameObjectInfosrcfmt[]="iiissssiifiiiiiiiiiiiiiiiiiiiiiiiiiiiiiisi"; +const char GameObjectInfodstfmt[]="iiissssiifiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"; +const char ItemPrototypesrcfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiiisiiiii"; +const char ItemPrototypedstfmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiiiiiiiiiifiiifiiiiiifiiiiiifiiiiiifiiiiiifiiiisiiiiiiiiiiiiiiiiiiiiiiiiifiiiiiiiii"; +const char PageTextfmt[]="isii"; const char InstanceTemplatesrcfmt[]="iiiffffs"; const char InstanceTemplatedstfmt[]="iiiffffi"; diff --git a/src/trinitycore/trinitycore.conf.dist b/src/trinitycore/trinitycore.conf.dist index e8bfddbd39f..a812ec13abe 100644 --- a/src/trinitycore/trinitycore.conf.dist +++ b/src/trinitycore/trinitycore.conf.dist @@ -1686,6 +1686,19 @@ BattleGround.PremadeGroupWaitForMatch = 1800000 # Default: 1 (active) # 0 (finished) # +# Arena.ArenaStartRating +# Start arena team command rating +# Default: 1500 +# +# Arena.StartPersonalRating +# Start personal rating on entry in team +# Default: 1500 +# +# Arena.LK.ArenasEnable +# Enable or Disable new WoTLK Arenas: Ring of Valor and Dalaran Sewers. These arenas have a problem of Line of The Side. +# Default: 0 (Disable) +# 1 (Enable) +# ############################################################################### Arena.MaxRatingDifference = 150 @@ -1696,7 +1709,9 @@ Arena.QueueAnnouncer.Enable = 0 Arena.QueueAnnouncer.PlayerOnly = 0 Arena.ArenaSeason.ID = 1 Arena.ArenaSeason.InProgress = 1 - +Arena.ArenaStartRating = 0 +Arena.ArenaStartPersonalRating = 0 +Arena.LK.ArenasEnable = 0 ############################################################################### # NETWORK CONFIG diff --git a/src/trinityrealm/AuthCodes.h b/src/trinityrealm/AuthCodes.h index db0f1d8196a..3cc373ed6e7 100644 --- a/src/trinityrealm/AuthCodes.h +++ b/src/trinityrealm/AuthCodes.h @@ -72,8 +72,13 @@ enum LoginResult //2.4.3 build 8606 //3.1.3 build 9947 //3.1.3 build 10146 Chinese build +//3.2.2a build 10505 +//3.3.0a build 11159 +//3.3.2 build 11403 -#define POST_BC_ACCEPTED_CLIENT_BUILD {10505, 10146, 9947, 8606, 0} +//original code +#define EXPECTED_TRINITY_CLIENT_BUILD {10571, 10505, 10146, 9947, 8606, 5875, 6005, 0} + +#define POST_BC_ACCEPTED_CLIENT_BUILD {11403, 11159, 10571, 10505, 10146, 9947, 8606, 0} //Maybe wrong? #define PRE_BC_ACCEPTED_CLIENT_BUILD {5875, 6005, 0} #define POST_BC_EXP_FLAG 0x2 diff --git a/src/trinityrealm/AuthSocket.cpp b/src/trinityrealm/AuthSocket.cpp index b5fe5f040c1..c9b88833667 100644 --- a/src/trinityrealm/AuthSocket.cpp +++ b/src/trinityrealm/AuthSocket.cpp @@ -361,6 +361,11 @@ bool AuthSocket::_HandleLogonChallenge() buf[buf.size() - 1] = 0; sAuthLogonChallenge_C *ch = (sAuthLogonChallenge_C*)&buf[0]; + ///- Read the remaining of the packet + ibuf.Read((char *)&buf[4], remaining); + DEBUG_LOG("[AuthChallenge] got full packet, %#04x bytes", ch->size); + DEBUG_LOG("[AuthChallenge] name(%d): '%s'", ch->I_len, ch->I); + // BigEndian code, nop in little endian case // size already converted EndianConvert(*((uint32*)(&ch->gamename[0]))); @@ -371,11 +376,6 @@ bool AuthSocket::_HandleLogonChallenge() EndianConvert(ch->timezone_bias); EndianConvert(ch->ip); - ///- Read the remaining of the packet - ibuf.Read((char *)&buf[4], remaining); - DEBUG_LOG("[AuthChallenge] got full packet, %#04x bytes", ch->size); - DEBUG_LOG("[AuthChallenge] name(%d): '%s'", ch->I_len, ch->I); - ByteBuffer pkt; _login = (const char*)ch->I; @@ -410,7 +410,7 @@ bool AuthSocket::_HandleLogonChallenge() ///- Get the account details from the account table // No SQL injection (escaped user name) - result = + result = loginDatabase.PQuery("SELECT a.sha_pass_hash,a.id,a.locked,a.last_ip,aa.gmlevel,a.v,a.s " "FROM account a " "LEFT JOIN account_access aa " |