aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/base/characters_database.sql1
-rw-r--r--sql/base/world_database.sql59
-rw-r--r--sql/updates/2011_02_03_0_characters_instance.sql1
-rw-r--r--sql/updates/2011_02_03_0_world instance_encounters.sql638
-rw-r--r--sql/updates/2011_02_03_1_world_command.sql1
-rw-r--r--sql/updates/2011_02_03_2_world_lfg_dungeon_encounters.sql1
-rw-r--r--sql/updates/2011_02_03_3_world_spell_dbc.sql17
-rwxr-xr-xsrc/server/game/Achievements/AchievementMgr.cpp4
-rwxr-xr-xsrc/server/game/DataStores/DBCStores.cpp8
-rwxr-xr-xsrc/server/game/DataStores/DBCStores.h3
-rwxr-xr-xsrc/server/game/DataStores/DBCStructure.h12
-rwxr-xr-xsrc/server/game/DataStores/DBCfmt.h1
-rwxr-xr-xsrc/server/game/DungeonFinding/LFGMgr.cpp71
-rwxr-xr-xsrc/server/game/DungeonFinding/LFGMgr.h3
-rwxr-xr-xsrc/server/game/Entities/Player/Player.cpp11
-rwxr-xr-xsrc/server/game/Globals/ObjectMgr.cpp78
-rwxr-xr-xsrc/server/game/Globals/ObjectMgr.h32
-rwxr-xr-xsrc/server/game/Instances/InstanceSaveMgr.cpp19
-rwxr-xr-xsrc/server/game/Instances/InstanceScript.cpp35
-rwxr-xr-xsrc/server/game/Instances/InstanceScript.h14
-rwxr-xr-xsrc/server/game/Maps/Map.cpp3
-rwxr-xr-xsrc/server/game/Server/Protocol/Handlers/LFGHandler.cpp24
-rwxr-xr-xsrc/server/game/Spells/Spell.cpp12
-rwxr-xr-xsrc/server/game/World/World.cpp2
-rw-r--r--src/server/scripts/Commands/cs_reload.cpp9
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.cpp1
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp6
-rw-r--r--src/server/scripts/EasternKingdoms/MoltenCore/boss_majordomo_executus.cpp2
-rwxr-xr-xsrc/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp10
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp4
-rw-r--r--src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp2
-rwxr-xr-xsrc/server/shared/Database/Implementation/CharacterDatabase.cpp6
-rwxr-xr-xsrc/server/shared/Database/Implementation/CharacterDatabase.h3
33 files changed, 941 insertions, 152 deletions
diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql
index c3569844e07..e0bf22ab4c0 100644
--- a/sql/base/characters_database.sql
+++ b/sql/base/characters_database.sql
@@ -1786,6 +1786,7 @@ CREATE TABLE `instance` (
`map` smallint(5) unsigned NOT NULL DEFAULT '0',
`resettime` int(10) unsigned NOT NULL DEFAULT '0',
`difficulty` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `completedEncounters` int(10) unsigned NOT NULL DEFAULT '0',
`data` tinytext NOT NULL,
PRIMARY KEY (`id`),
KEY `map` (`map`),
diff --git a/sql/base/world_database.sql b/sql/base/world_database.sql
index a9c11f9f9ab..70b95dcd23d 100644
--- a/sql/base/world_database.sql
+++ b/sql/base/world_database.sql
@@ -606,7 +606,6 @@ INSERT INTO `command` VALUES
('reload item_enchantment_template',3,'Syntax: .reload item_enchantment_template\nReload item_enchantment_template table.'),
('reload item_loot_template',3,'Syntax: .reload item_loot_template\nReload item_loot_template table.'),
('reload item_set_names',3,'Syntax: .reload item_set_names\nReload item_set_names table.'),
-('reload lfg_dungeon_encounters',3,'Syntax: .reload lfg_dungeon_encounters\nReload lfg_dungeon_encounters table.'),
('reload lfg_dungeon_rewards',3,'Syntax: .reload lfg_dungeon_rewards\nReload lfg_dungeon_rewards table.'),
('reload locales_creature',3,'Syntax: .reload locales_creature\nReload locales_creature table.'),
('reload locales_gameobject',3,'Syntax: .reload locales_gameobject\nReload locales_gameobject table.'),
@@ -2781,6 +2780,32 @@ LOCK TABLES `gossip_menu_option` WRITE;
UNLOCK TABLES;
--
+-- Table structure for table `instance_encounters`
+--
+
+DROP TABLE IF EXISTS `instance_encounters`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `instance_encounters` (
+ `entry` int(10) unsigned NOT NULL COMMENT 'Unique entry from DungeonEncounter.dbc',
+ `creditType` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `creditEntry` int(10) unsigned NOT NULL DEFAULT '0',
+ `lastEncounterDungeon` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'If not 0, LfgDungeon.dbc entry for the instance it is last encounter in',
+ `comment` varchar(255) NOT NULL DEFAULT '',
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `instance_encounters`
+--
+
+LOCK TABLES `instance_encounters` WRITE;
+/*!40000 ALTER TABLE `instance_encounters` DISABLE KEYS */;
+/*!40000 ALTER TABLE `instance_encounters` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
-- Table structure for table `instance_template`
--
@@ -3075,26 +3100,6 @@ LOCK TABLES `item_template` WRITE;
UNLOCK TABLES;
--
--- Table structure for table `lfg_dungeon_encounters`
---
-
-DROP TABLE IF EXISTS `lfg_dungeon_encounters`;
-CREATE TABLE `lfg_dungeon_encounters` (
- `achievementId` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Achievement marking final boss completion',
- `dungeonId` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Dungeon entry from dbc',
- PRIMARY KEY (`achievementId`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
---
--- Dumping data for table `lfg_dungeon_encounters`
---
-
-LOCK TABLES `lfg_dungeon_encounters` WRITE;
-/*!40000 ALTER TABLE `lfg_dungeon_encounters` DISABLE KEYS */;
-/*!40000 ALTER TABLE `lfg_dungeon_encounters` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
-- Table structure for table `lfg_dungeon_rewards`
--
@@ -17305,7 +17310,17 @@ INSERT INTO `spell_dbc` (`Id`,`Dispel`,`Mechanic`,`Attributes`,`AttributesEx`,`A
(70878, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Creature 40160 creature_addon serverside spell'),
(38406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Quest 10721 RewSpellCast serverside spell'),
(44805, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Aura used in creature_addon - serverside spell'),
-(3617, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'NPC 32958 suicide spell');
+(3617, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'NPC 32958 suicide spell'),
+(58630, 0, 0, 536870912, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 101, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Mal''ganis credit marker'),
+(68572, 0, 0, 536870912, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 101, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Grand Champions credit marker'),
+(68574, 0, 0, 536870912, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 101, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Argent Champion credit marker'),
+(59046, 0, 0, 536870912, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 101, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Tribunal of Ages credit marker'),
+(68184, 0, 0, 536870912, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 101, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Faction Champions credit marker'),
+(59450, 0, 0, 536870912, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 101, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'The Four Horsemen credit marker'),
+(65195, 0, 0, 536870912, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 101, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'The Iron Council credit marker'),
+(64899, 0, 0, 536870912, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 101, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Hodir credit marker'),
+(64985, 0, 0, 536870912, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 101, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Thorim credit marker'),
+(65074, 0, 0, 536870912, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 101, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Freya credit marker');
/*!40000 ALTER TABLE `spell_dbc` ENABLE KEYS */;
UNLOCK TABLES;
diff --git a/sql/updates/2011_02_03_0_characters_instance.sql b/sql/updates/2011_02_03_0_characters_instance.sql
new file mode 100644
index 00000000000..5072fa69f0a
--- /dev/null
+++ b/sql/updates/2011_02_03_0_characters_instance.sql
@@ -0,0 +1 @@
+ALTER TABLE `instance` ADD COLUMN `completedEncounters` int(10) unsigned NOT NULL DEFAULT '0' AFTER `difficulty`;
diff --git a/sql/updates/2011_02_03_0_world instance_encounters.sql b/sql/updates/2011_02_03_0_world instance_encounters.sql
new file mode 100644
index 00000000000..e35e09f1403
--- /dev/null
+++ b/sql/updates/2011_02_03_0_world instance_encounters.sql
@@ -0,0 +1,638 @@
+--
+-- Table structure for table `instance_encounters`
+--
+
+DROP TABLE IF EXISTS `instance_encounters`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `instance_encounters` (
+ `entry` int(10) unsigned NOT NULL COMMENT 'Unique entry from DungeonEncounter.dbc',
+ `creditType` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `creditEntry` int(10) unsigned NOT NULL DEFAULT '0',
+ `lastEncounterDungeon` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'If not 0, LfgDungeon.dbc entry for the instance it is last encounter in',
+ `comment` varchar(255) NOT NULL DEFAULT '',
+ PRIMARY KEY (`entry`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `instance_encounters`
+--
+
+LOCK TABLES `instance_encounters` WRITE;
+/*!40000 ALTER TABLE `instance_encounters` DISABLE KEYS */;
+INSERT INTO `instance_encounters` VALUES
+(161,0,644,0, 'Rhahk''zor'),
+(162,0,643,0, 'Sneed'),
+(163,0,1763,0, 'Gilnid'),
+(164,0,646,0, 'Mr. Smite'),
+(165,0,645,0, 'Cookie'),
+(166,0,647,0, 'Captain Greenskin'),
+(167,0,639,6, 'Edwin VanCleef'),
+(201,0,18371,0, 'Shirrak the Dead Watcher'),
+(202,0,18373,149, 'Exarch Maladaar'),
+(203,0,18341,0, 'Pandemonius'),
+(204,0,18343,0, 'Tavarok'),
+(205,0,18344,148, 'Nexus-Prince Shaffar'),
+(206,0,18472,0, 'Darkweaver Syth'),
+(207,0,18473,150, 'Talon King Ikiss'),
+(208,0,18731,0, 'Ambassador Hellmaw'),
+(209,0,18667,0, 'Blackheart the Inciter'),
+(210,0,18732,0, 'Grandmaster Vorpil'),
+(211,0,18708,151, 'Murmur'),
+(212,0,29309,0, 'Elder Nadox'),
+(213,0,29308,0, 'Prince Taldaram'),
+(214,0,29310,0, 'Jedoga Shadowseeker'),
+(215,0,29311,218, 'Herald Volazj'),
+(216,0,28684,0, 'Krik''thir the Gatewatcher'),
+(217,0,28921,0, 'Hadronox'),
+(218,0,29120,204, 'Anub''arak'),
+(219,0,4887,0, 'Ghamoo-ra'),
+(220,0,4831,0, 'Lady Sarevess'),
+(221,0,6243,0, 'Gelihast'),
+(222,0,12902,0, 'Lorgus Jett'),
+(224,0,4830,0, 'Old Serra''kis'),
+(225,0,4832,0, 'Twilight Lord Kelris'),
+(226,0,4829,10, 'Aku''mai'),
+(227,0,9018,30, 'High Interrogator Gerstahn'),
+(228,0,9025,0, 'Lord Roccor'),
+(229,0,9319,0, 'Houndmaster Grebmar'),
+(230,0,10096,0, 'Ring of Law'),
+(231,0,9024,0, 'Pyromancer Loregrain'),
+(232,0,9017,0, 'Lord Incendius'),
+(233,0,9041,0, 'Warder Stilgiss'),
+(234,0,9056,0, 'Fineous Darkvire'),
+(235,0,9016,0, 'Bael''Gar'),
+(236,0,9033,0, 'General Angerforge'),
+(237,0,8983,0, 'Golem Lord Argelmach'),
+(238,0,9537,0, 'Hurley Blackbreath'),
+(239,0,9502,0, 'Phalanx'),
+(240,0,9543,0, 'Ribbly Screwspigot'),
+(241,0,9499,0, 'Plugger Spazzring'),
+(242,0,9156,0, 'Ambassador Flamelash'),
+(243,0,9035,0, 'The Seven'),
+(244,0,9938,0, 'Magmus'),
+(245,0,9019,276, 'Emperor Dagran Thaurissan'),
+(246,0,18371,0, 'Shirrak the Dead Watcher'),
+(247,0,18373,178, 'Exarch Maladaar'),
+(248,0,18341,0, 'Pandemonius'),
+(249,0,18343,0, 'Tavarok'),
+(250,0,22930,0, 'Yor'),
+(251,0,18344,179, 'Nexus-Prince Shaffar'),
+(252,0,18472,0, 'Darkweaver Syth'),
+(253,0,23035,0, 'Anzu'),
+(254,0,18473,180, 'Talon King Ikiss'),
+(255,0,18731,0, 'Ambassador Hellmaw'),
+(256,0,18667,0, 'Blackheart the Inciter'),
+(257,0,18732,0, 'Grandmaster Vorpil'),
+(258,0,18708,181, 'Murmur'),
+(259,0,29309,0, 'Elder Nadox'),
+(260,0,29308,0, 'Prince Taldaram'),
+(261,0,29310,0, 'Jedoga Shadowseeker'),
+(262,0,30258,0, 'Amanitar'),
+(263,0,29311,219, 'Herald Volazj'),
+(264,0,28684,0, 'Krik''thir the Gatewatcher'),
+(265,0,28921,0, 'Hadronox'),
+(266,0,29120,241, 'Anub''arak'),
+(267,0,9196,0, 'Highlord Omokk'),
+(268,0,9236,0, 'Shadow Hunter Vosh''gajin'),
+(269,0,9237,0, 'War Master Voone'),
+(270,0,10596,0, 'Mother Smolderweb'),
+(271,0,10584,0, 'Urok Doomhowl'),
+(272,0,9736,0, 'Quartermaster Zigris'),
+(273,0,10268,0, 'Gizrul the Slavener'),
+(274,0,10220,0, 'Halycon'),
+(275,0,9568,32, 'Overlord Wyrmthalak'),
+(276,0,9816,0, 'Pyroguard Emberseer'),
+(277,0,10264,0, 'Solakar Flamewreath'),
+(278,0,10429,0, 'Warchief Rend Blackhand'),
+(279,0,10430,0, 'The Beast'),
+(280,0,10363,44, 'General Drakkisath'),
+(281,0,18096,170, 'Epoch Hunter'),
+(282,0,18096,183, 'Epoch Hunter'),
+(283,0,17862,0, 'Captain Skarloc'),
+(284,0,17862,0, 'Captain Skarloc'),
+(285,0,17848,0, 'Lieutenant Drake'),
+(286,0,17848,0, 'Lieutenant Drake'),
+(287,0,17879,0, 'Chrono Lord Deja'),
+(288,0,17879,0, 'Chrono Lord Deja'),
+(289,0,17880,0, 'Temporus'),
+(290,0,17880,0, 'Temporus'),
+(291,0,17881,171, 'Aeonus'),
+(292,0,17881,182, 'Aeonus'),
+(293,0,26529,0, 'Meathook'),
+(294,0,26530,0, 'Salram the Fleshcrafter'),
+(295,0,26532,0, 'Chrono-Lord Epoch'),
+(296,1,58630,209, 'Mal''ganis'),
+(297,0,26529,0, 'Meathook'),
+(298,0,26530,0, 'Salram the Fleshcrafter'),
+(299,0,26532,0, 'Chrono-Lord Epoch'),
+(300,1,58630,210, 'Mal''ganis'),
+(301,0,17941,0, 'Mennu the Betrayer'),
+(302,0,17991,0, 'Rokmar the Crackler'),
+(303,0,17942,140, 'Quagmirran'),
+(304,0,17941,0, 'Mennu the Betrayer'),
+(305,0,17991,0, 'Rokmar the Crackler'),
+(306,0,17942,184, 'Quagmirran'),
+(314,0,17797,0, 'Hydromancer Thespia'),
+(315,0,17797,0, 'Hydromancer Thespia'),
+(316,0,17796,0, 'Mekgineer Steamrigger'),
+(317,0,17796,0, 'Mekgineer Steamrigger'),
+(318,0,17798,147, 'Warlord Kalithresh'),
+(319,0,17798,185, 'Warlord Kalithresh'),
+(320,0,17770,0, 'Hungarfen'),
+(321,0,17770,0, 'Hungarfen'),
+(322,0,18105,0, 'Ghaz''an'),
+(323,0,18105,0, 'Ghaz''an'),
+(329,0,17826,0, 'Swamplord Musel''ek'),
+(330,0,17826,0, 'Swamplord Musel''ek'),
+(331,0,17882,146, 'The Black Stalker'),
+(332,0,17882,186, 'The Black Stalker'),
+(334,1,68572,0, 'Grand Champions'),
+(336,1,68572,0, 'Grand Champions'),
+(338,1,68574,0, 'Argent Champion'),
+(339,1,68574,0, 'Argent Champion'),
+(340,1,68663,245, 'The Black Knight'),
+(341,1,68663,249, 'The Black Knight'),
+(343,0,11490,0, 'Zevrim Thornhoof'),
+(344,0,13280,0, 'Hydrospawn'),
+(345,0,14327,0, 'Lethtendris'),
+(346,0,11492,34, 'Alzzin the Wildshaper'),
+(347,0,11488,0, 'Illyanna Ravenoak'),
+(348,0,11487,0, 'Magister Kalendris'),
+(349,0,11496,0, 'Immol''thar'),
+(350,0,11489,0, 'Tendris Warpwood'),
+(361,0,11486,36, 'Prince Tortheldrin'),
+(362,0,14326,0, 'Guard Mol''dar'),
+(363,0,14322,0, 'Stomper Kreeg'),
+(364,0,14321,0, 'Guard Fengus'),
+(365,0,14323,0, 'Guard Slip''kik'),
+(366,0,14325,0, 'Captain Kromcrush'),
+(367,0,14324,0, 'Cho''Rush the Observer'),
+(368,0,11501,38, 'King Gordok'),
+(369,0,26630,0, 'Trollgore'),
+(370,0,26630,0, 'Trollgore'),
+(371,0,26631,0, 'Novos the Summoner'),
+(372,0,26631,0, 'Novos the Summoner'),
+(373,0,27483,0, 'King Dred'),
+(374,0,27483,0, 'King Dred'),
+(375,1,61863,214, 'The Prophet Tharon''ja'),
+(376,1,61863,215, 'The Prophet Tharon''ja'),
+(378,0,7079,0, 'Viscous Fallout'),
+(379,0,7361,0, 'Grubbis'),
+(380,0,6235,0, 'Electrocutioner 6000'),
+(381,0,6229,0, 'Crowd Pummeler 9-60'),
+(382,0,7800,14, 'Mekgineer Thermaplugg'),
+(383,0,29304,0, 'Slad''ran'),
+(384,0,29304,0, 'Slad''ran'),
+(385,0,29573,0, 'Drakkari Colossus'),
+(386,0,29573,0, 'Drakkari Colossus'),
+(387,0,29305,0, 'Moorabi'),
+(388,0,29305,0, 'Moorabi'),
+(389,0,29932,0, 'Eck the Ferocious'),
+(390,0,29306,216, 'Gal''darah'),
+(391,0,29306,217, 'Gal''darah'),
+(392,0,17306,0, 'Watchkeeper Gargolmar'),
+(393,0,17306,0, 'Watchkeeper Gargolmar'),
+(394,0,17308,0, 'Omor the Unscarred'),
+(395,0,17308,0, 'Omor the Unscarred'),
+(396,0,17537,136, 'Vazruden the Herald'),
+(397,0,17537,188, 'Vazruden the Herald'),
+(401,0,17381,0, 'The Maker'),
+(402,0,17381,0, 'The Maker'),
+(403,0,17380,0, 'Broggok'),
+(404,0,17380,0, 'Broggok'),
+(405,0,17377,137, 'Keli''dan the Breaker'),
+(406,0,17377,187, 'Keli''dan the Breaker'),
+(407,0,16807,0, 'Grand Warlock Nethekurse'),
+(408,0,16807,0, 'Grand Warlock Nethekurse'),
+(409,0,20923,0, 'Blood Guard Porung'),
+(410,0,16809,0, 'Warbringer O''mrogg'),
+(411,0,16809,0, 'Warbringer O''mrogg'),
+(412,0,16808,138, 'Warchief Kargath Bladefist'),
+(413,0,16808,189, 'Warchief Kargath Bladefist'),
+(414,0,24723,0, 'Selin Fireheart'),
+(415,0,24723,0, 'Selin Fireheart'),
+(416,0,24744,0, 'Vexallus'),
+(417,0,24744,0, 'Vexallus'),
+(418,0,24560,0, 'Priestess Delrissa'),
+(419,0,24560,0, 'Priestess Delrissa'),
+(420,0,24664,198, 'Kael''thas Sunstrider'),
+(421,0,24664,201, 'Kael''thas Sunstrider'),
+(422,0,13282,0, 'Noxxion'),
+(423,0,12258,26, 'Razorlash'),
+(424,0,12236,272, 'Lord Vyletongue'),
+(425,0,12225,0, 'Celebras the Cursed'),
+(426,0,12203,0, 'Landslide'),
+(427,0,13601,0, 'Tinkerer Gizlock'),
+(428,0,13596,0, 'Rotgrip'),
+(429,0,12201,273, 'Princess Theradras'),
+(430,0,11517,0, 'Oggleflint'),
+(431,0,11520,4, 'Taragaman the Hungerer'),
+(432,0,11518,0, 'Jergosh the Invoker'),
+(433,0,11519,0, 'Bazzalan'),
+(434,0,7355,0, 'Tuten''kash'),
+(435,0,7357,0, 'Mordresh Fire Eye'),
+(436,0,8567,0, 'Glutton'),
+(437,0,7358,20, 'Amnennar the Coldbringer'),
+(438,0,6168,0, 'Roogug'),
+(439,0,4424,0, 'Aggem Thorncurse'),
+(440,0,4428,0, 'Death Speaker Jargba'),
+(441,0,4420,0, 'Overlord Ramtusk'),
+(443,0,4421,16, 'Charlga Razorflank'),
+(444,0,3983,0, 'Interrogator Vishas'),
+(445,0,4543,18, 'Bloodmage Thalnos'),
+(446,0,3974,0, 'Houndmaster Loksey'),
+(447,0,6487,165, 'Arcanist Doan'),
+(448,0,3975,163, 'Herod'),
+(449,0,4542,0, 'High Inquisitor Fairbanks'),
+(450,0,3977,164, 'High Inquisitor Whitemane'),
+(451,0,10506,0, 'Kirtonos the Herald'),
+(452,0,10503,0, 'Jandice Barov'),
+(453,0,11622,0, 'Rattlegore'),
+(454,0,10433,0, 'Marduk Blackpool'),
+(455,0,10432,0, 'Vectus'),
+(456,0,10508,0, 'Ras Frostwhisper'),
+(457,0,10505,0, 'Instructor Malicia'),
+(458,0,11261,0, 'Doctor Theolen Krastinov'),
+(459,0,10901,0, 'Lorekeeper Polkelt'),
+(460,0,10507,0, 'The Ravenian'),
+(461,0,10504,0, 'Lord Alexei Barov'),
+(462,0,10502,0, 'Lady Illucia Barov'),
+(463,0,1853,2, 'Darkmaster Gandling'),
+(464,0,3914,0, 'Rethilgore'),
+(465,0,3886,0, 'Razorclaw the Butcher'),
+(466,0,3887,0, 'Baron Silverlaine'),
+(467,0,4278,0, 'Commander Springvale'),
+(468,0,4279,0, 'Odo the Blindwatcher'),
+(469,0,4274,0, 'Fenrus the Devourer'),
+(470,0,3927,0, 'Wolf Master Nandos'),
+(471,0,4275,8, 'Archmage Arugal'),
+(472,0,10516,0, 'The Unforgiven'),
+(473,0,10558,0, 'Hearthsinger Forresten'),
+(474,0,10808,0, 'Timmy the Cruel'),
+(475,0,10997,0, 'Cannon Master Willey'),
+(476,0,11032,0, 'Malor the Zealous'),
+(477,0,10811,0, 'Archivist Galford'),
+(478,0,10813,40, 'Balnazzar'),
+(479,0,10436,0, 'Baroness Anastari'),
+(480,0,10437,0, 'Nerub''enkan'),
+(481,0,10438,0, 'Maleki the Pallid'),
+(482,0,10435,0, 'Magistrate Barthilas'),
+(483,0,10439,0, 'Ramnstein the Gorger'),
+(484,0,10440,274, 'Baron Rivendare'),
+(485,0,8580,0, 'Atal''alarion'),
+(486,0,5721,0, 'Dreamscythe'),
+(487,0,5720,0, 'Weaver'),
+(488,0,5710,0, 'Jammal''an the Prophet'),
+(490,0,5719,0, 'Morphaz'),
+(491,0,5722,0, 'Hazzas'),
+(492,0,8443,0, 'Avatar of Hakkar'),
+(493,0,5709,28, 'Shade of Eranikus'),
+(494,0,20870,0, 'Zereketh the Unbound'),
+(495,0,20870,0, 'Zereketh the Unbound'),
+(496,0,20885,0, 'Dalliah the Doomsayer'),
+(497,0,20885,0, 'Dalliah the Doomsayer'),
+(498,0,20886,0, 'Wrath-Scryer Soccothrates'),
+(499,0,20886,0, 'Wrath-Scryer Soccothrates'),
+(500,0,20912,174, 'Harbinger Skyriss'),
+(501,0,20912,190, 'Harbinger Skyriss'),
+(502,0,17976,0, 'Commander Sarannis'),
+(504,0,17976,0, 'Commander Sarannis'),
+(505,0,17975,0, 'High Botanist Freywinn'),
+(506,0,17975,0, 'High Botanist Freywinn'),
+(507,0,17978,0, 'Thorngrin the Tender'),
+(508,0,17978,0, 'Thorngrin the Tender'),
+(509,0,17980,0, 'Laj'),
+(510,0,17980,0, 'Laj'),
+(511,0,17977,173, 'Warp Splinter'),
+(512,0,17977,191, 'Warp Splinter'),
+(513,0,19219,0, 'Mechano-Lord Capacitus'),
+(514,0,19219,0, 'Mechano-Lord Capacitus'),
+(515,0,19221,0, 'Nethermancer Sepethrea'),
+(516,0,19221,0, 'Nethermancer Sepethrea'),
+(517,0,19220,172, 'Pathaleon the Calculator'),
+(518,0,19220,192, 'Pathaleon the Calculator'),
+(519,0,26796,0, 'Frozen Commander'),
+(520,0,26731,0, 'Grand Magus Telestra'),
+(521,0,26731,0, 'Grand Magus Telestra'),
+(522,0,26763,0, 'Anomalus'),
+(523,0,26763,0, 'Anomalus'),
+(524,0,26794,0, 'Ormorok the Tree-Shaper'),
+(525,0,26794,0, 'Ormrok the Tree-Shaper'),
+(526,0,26723,225, 'Keristrasza'),
+(527,0,26723,226, 'Keristrasza'),
+(528,0,27654,0, 'Drakos the Interrogator'),
+(529,0,27654,0, 'Drakos the Interrogator'),
+(530,0,27447,0, 'Varos Cloudstrider'),
+(531,0,27447,0, 'Varos Cloudstrider'),
+(532,0,27655,0, 'Mage-Lord Urom'),
+(533,0,27655,0, 'Mage-Lord Urom'),
+(534,0,27656,206, 'Ley-Guardian Eregos'),
+(535,0,27656,211, 'Ley-Guardian Eregos'),
+(536,0,1696,0, 'Targorr the Dread'),
+(537,0,1666,0, 'Kam Deepfury'),
+(538,0,1717,0, 'Hamhock'),
+(539,0,1716,0, 'Bazil Thredd'),
+(540,0,1663,12, 'Dextren Ward'),
+(541,0,29315,0, 'First Prisoner'),
+(542,0,29315,0, 'First Prisoner'),
+(543,0,29316,0, 'Second Prisoner'),
+(544,0,29316,0, 'Second Prisoner'),
+(545,0,31134,220, 'Cyanigosa'),
+(546,0,31134,221, 'Cyanigosa'),
+(547,0,6910,0, 'Revelosh'),
+(548,0,6906,0, 'The Lost Dwarves'),
+(549,0,7228,0, 'Ironaya'),
+(551,0,7206,0, 'Ancient Stone Keeper'),
+(552,0,7291,0, 'Galgann Firehammer'),
+(553,0,4854,0, 'Grimlok'),
+(554,0,2748,22, 'Archaedas'),
+(555,0,28586,0, 'General Bjarngrim'),
+(556,0,28586,0, 'General Bjarngrim'),
+(557,0,28587,0, 'Volkhan'),
+(558,0,28587,0, 'Volkhan'),
+(559,0,28546,0, 'Ionar'),
+(560,0,28546,0, 'Ionar'),
+(561,0,28923,207, 'Loken'),
+(562,0,28923,212, 'Loken'),
+(563,0,27977,0, 'Krystallus'),
+(564,0,27977,0, 'Krystallus'),
+(565,0,27975,0, 'Maiden of Grief'),
+(566,0,27975,0, 'Maiden of Grief'),
+(567,1,59046,0, 'Tribunal of Ages'),
+(568,1,59046,0, 'Tribunal of Ages'),
+(569,0,27978,208, 'Sjonnir the Ironshaper'),
+(570,0,27978,213, 'Sjonnir the Ironshaper'),
+(571,0,23953,0, 'Prince Keleseth'),
+(572,0,23953,0, 'Prince Keleseth'),
+(573,0,24201,0, 'Skarvold & Dalronn'),
+(574,0,24201,0, 'Skarvold & Dalronn'),
+(575,0,23954,202, 'Ingvar the Plunderer'),
+(576,0,23954,242, 'Ingvar the Plunderer'),
+(577,0,26668,0, 'Svala Sorrowgrave'),
+(578,0,26668,0, 'Svala Sorrowgrave'),
+(579,0,26687,0, 'Gortok Palehoof'),
+(580,0,26687,0, 'Gortok Palehoof'),
+(581,0,26693,0, 'Skadi the Ruthless'),
+(582,0,26693,0, 'Skadi the Ruthless'),
+(583,0,26861,203, 'King Ymiron'),
+(584,0,26861,205, 'King Ymiron'),
+(585,0,3671,0, 'Lady Anacondra'),
+(586,0,3669,0, 'Lord Cobrahn'),
+(587,0,3653,0, 'Kresh'),
+(588,0,3670,0, 'Lord Pythas'),
+(589,0,3674,0, 'Skum'),
+(590,0,3673,0, 'Lord Serpentis'),
+(591,0,5775,0, 'Verdan the Everliving'),
+(592,0,3654,1, 'Mutanus the Devourer'),
+(593,0,7795,0, 'Hydromancer Velratha'),
+(594,0,7273,0, 'Ghaz''rilla'),
+(595,0,8127,0, 'Antu''sul'),
+(596,0,7272,0, 'Theka the Martyr'),
+(597,0,7271,0, 'Witch Doctor Zum''rah'),
+(598,0,7796,0, 'Nekrum Gutchewer'),
+(599,0,7275,0, 'Shadowpriest Sezz''ziz'),
+(600,0,7267,24, 'Chief Ukorz Sandscalp'),
+(601,0,22887,0, 'High Warlord Naj''entus'),
+(602,0,22898,0, 'Supremus'),
+(603,0,22841,0, 'Shade of Akama'),
+(604,0,22871,0, 'Teron Gorefiend'),
+(605,0,22948,0, 'Gurtogg Bloodboil'),
+(606,0,23420,0, 'Reliquary of Souls'),
+(607,0,22947,0, 'Mother Shahraz'),
+(608,0,23426,0, 'The Illidari Council'),
+(609,0,22917,196, 'Illidan Stormrage'),
+(610,0,12435,0, 'Razorgore the Untamed'),
+(611,0,13020,0, 'Vaelastrasz the Corrupt'),
+(612,0,12017,0, 'Broodlord Lashlayer'),
+(613,0,11983,0, 'Firemaw'),
+(614,0,14601,0, 'Ebonroc'),
+(615,0,11981,0, 'Flamegor'),
+(616,0,14020,0, 'Chromaggus'),
+(617,0,11583,50, 'Nefarian'),
+(618,0,17767,0, 'Rage Winterchill'),
+(619,0,17808,0, 'Anetheron'),
+(620,0,17888,0, 'Kaz''rogal'),
+(621,0,17842,0, 'Azgalor'),
+(622,0,17968,195, 'Archimonde'),
+(623,0,21216,0, 'Hydross the Unstable'),
+(624,0,21217,0, 'The Lurker Below'),
+(625,0,21215,0, 'Leotheras the Blind'),
+(626,0,21214,0, 'Fathom-Lord Karathress'),
+(627,0,21213,0, 'Morogrim Tidewalker'),
+(628,0,21212,194, 'Lady Vashj'),
+(629,0,34797,0, 'Northrend Beasts'),
+(630,0,34797,0, 'Northrend Beasts'),
+(631,0,34797,0, 'Northrend Beasts'),
+(632,0,34797,0, 'Northrend Beasts'),
+(633,0,34780,0, 'Lord Jaraxxus'),
+(634,0,34780,0, 'Lord Jaraxxus'),
+(635,0,34780,0, 'Lord Jaraxxus'),
+(636,0,34780,0, 'Lord Jaraxxus'),
+(637,1,68184,0, 'Faction Champions'),
+(638,1,68184,0, 'Faction Champions'),
+(639,1,68184,0, 'Faction Champions'),
+(640,1,68184,0, 'Faction Champions'),
+(641,0,34496,0, 'Val''kyr Twins'),
+(642,0,34496,0, 'Val''kyr Twins'),
+(643,0,34496,0, 'Val''kyr Twins'),
+(644,0,34496,0, 'Val''kyr Twins'),
+(645,0,34564,246, 'Anub''arak'),
+(646,0,34564,248, 'Anub''arak'),
+(647,0,34564,247, 'Anub''arak'),
+(648,0,34564,250, 'Anub''arak'),
+(649,0,18831,0, 'High King Maulgar'),
+(650,0,19044,177, 'Gruul the Dragonkiller'),
+(651,0,17257,176, 'Magtheridon'),
+(652,0,15550,0, 'Attumen the Huntsman'),
+(653,0,15687,0, 'Moroes'),
+(654,0,16457,0, 'Maiden of the Virtue'),
+(655,0,16812,0, 'Opera Event'),
+(656,0,15691,0, 'The Curator'),
+(657,0,15688,0, 'Terestian Illhoof'),
+(658,0,16524,0, 'Shade of Aran'),
+(659,0,15689,0, 'Netherspite'),
+(660,0,22520,0, 'Chess Event'),
+(661,0,15690,175, 'Prince Malchezaar'),
+(662,0,17225,0, 'Nightbane'),
+(663,0,12118,0, 'Lucifron'),
+(664,0,11982,0, 'Magmadar'),
+(665,0,12259,0, 'Gehennas'),
+(666,0,12057,0, 'Garr'),
+(667,0,12264,0, 'Shazzrah'),
+(668,0,12056,0, 'Baron Geddon'),
+(669,0,12098,0, 'Sulfuron Harbinger'),
+(670,0,11988,0, 'Golemagg the Incinerator'),
+(671,0,12018,0, 'Majordomo Executus'),
+(672,0,11502,48, 'Ragnaros'),
+(673,0,15956,0, 'Anub''Rekhan'),
+(674,0,15956,0, 'Anub''Rekhan'),
+(677,0,15953,0, 'Grand Widow Faerlina'),
+(678,0,15953,0, 'Grand Widow Faerlina'),
+(679,0,15952,0, 'Maexxna'),
+(680,0,15952,0, 'Maexxna'),
+(681,0,15954,0, 'Noth the Plaguebringer'),
+(682,0,15954,0, 'Noth the Plaguebringer'),
+(683,0,15936,0, 'Heigan the Unclean'),
+(684,0,15936,0, 'Heigan the Unclean '),
+(685,0,16011,0, 'Loatheb'),
+(686,0,16011,0, 'Loatheb'),
+(687,0,16061,0, 'Instructor Razuvious'),
+(689,0,16061,0, 'Instructor Razuvious'),
+(690,0,16060,0, 'Gothik the Harvester'),
+(691,0,16060,0, 'Gothik the Harvester'),
+(692,1,59450,0, 'The Four Horsemen'),
+(693,1,59450,0, 'The Four Horsemen'),
+(694,0,16028,0, 'Patchwerk'),
+(695,0,16028,0, 'Patchwerk '),
+(696,0,15931,0, 'Grobbulus'),
+(697,0,15931,0, 'Grobbulus'),
+(698,0,15932,0, 'Gluth'),
+(699,0,15932,0, 'Gluth'),
+(700,0,15928,0, 'Thaddius'),
+(701,0,15928,0, 'Thaddius'),
+(702,0,15989,0, 'Sapphiron'),
+(703,0,15989,0, 'Sapphiron'),
+(704,0,15990,159, 'Kel''Thuzad'),
+(706,0,15990,227, 'Kel''Thuzad'),
+(707,0,10184,46, 'Onyxia'),
+(708,0,10184,257, 'Onyxia'),
+(709,0,15263,0, 'The Prophet Skeram'),
+(710,0,15544,0, 'Silithid Royalty'),
+(711,0,15516,0, 'Battleguard Sartura'),
+(712,0,15510,0, 'Fankriss the Unyielding'),
+(713,0,15299,0, 'Viscidus'),
+(714,0,15509,0, 'Princess Huhuran'),
+(715,0,15275,0, 'Twin Emperors'),
+(716,0,15517,0, 'Ouro'),
+(717,0,15727,161, 'C''thun'),
+(718,0,15348,0, 'Kurinnaxx'),
+(719,0,15341,0, 'General Rajaxx'),
+(720,0,15340,0, 'Moam'),
+(721,0,15370,0, 'Buru the Gorger'),
+(722,0,15369,0, 'Ayamiss the Hunter'),
+(723,0,15339,160, 'Ossirian the Unscarred'),
+(724,0,24892,0, 'Kalecgos'),
+(725,0,24882,0, 'Brutallus'),
+(726,0,25038,0, 'Felmyst'),
+(727,0,25165,0, 'Eredar Twins'),
+(728,0,25840,0, 'M''uru'),
+(729,0,25315,199, 'Kil''jaeden'),
+(730,0,19514,0, 'Al''ar'),
+(731,0,19516,0, 'Void Reaver'),
+(732,0,18805,0, 'High Astromancer Solarian'),
+(733,0,19622,193, 'Kael''thas Sunstrider'),
+(734,0,28859,223, 'Malygos'),
+(735,0,28859,237, 'Malygos'),
+(736,0,30452,0, 'Tenebron'),
+(737,0,30452,0, 'Tenebron'),
+(738,0,30451,0, 'Shadron'),
+(739,0,30451,0, 'Shadron'),
+(740,0,30449,0, 'Vesperon'),
+(741,0,30449,0, 'Vesperon'),
+(742,0,28860,224, 'Sartharion'),
+(743,0,28860,238, 'Sartharion'),
+(744,0,33113,0, 'Flame Leviathan'),
+(745,0,33118,0, 'Ignis the Furnace Master'),
+(746,0,33186,0, 'Razorscale'),
+(747,0,33293,0, 'XT-002 Deconstructor'),
+(748,1,65195,0, 'The Iron Council'),
+(749,0,32930,0, 'Kologarn'),
+(750,0,33515,0, 'Auriaya'),
+(751,1,64899,0, 'Hodir'),
+(752,1,64985,0, 'Thorim'),
+(753,1,65074,0, 'Freya'),
+(754,0,33432,0, 'Mimiron'),
+(755,0,33271,0, 'General Vezax'),
+(756,0,33288,0, 'Yogg-Saron'),
+(757,0,32871,243, 'Algalon the Observer'),
+(758,0,33113,0, 'Flame Leviathan'),
+(759,0,33118,0, 'Ignis the Furnace Master'),
+(760,0,33186,0, 'Razorscale'),
+(761,0,33293,0, 'XT-002 Deconstructor'),
+(762,1,65195,0, 'The Iron Council'),
+(763,0,32930,0, 'Kologarn'),
+(764,0,33515,0, 'Auriaya'),
+(765,1,64899,0, 'Hodir'),
+(766,1,64985,0, 'Thorim'),
+(767,1,65074,0, 'Freya'),
+(768,0,33432,0, 'Mimiron'),
+(769,0,33271,0, 'General Vezax'),
+(770,0,33288,0, 'Yogg-Saron'),
+(771,0,32871,244, 'Algalon the Observer'),
+(772,0,31125,0, 'Archavon the Stone Watcher'),
+(773,0,31125,0, 'Archavon the Stone Watcher'),
+(774,0,33993,0, 'Emalon the Storm Watcher'),
+(775,0,33993,0, 'Emalon the Storm Watcher'),
+(776,0,35013,0, 'Koralon the Flame Watcher'),
+(777,0,35013,0, 'Koralon the Flame Watcher'),
+(778,0,23574,0, 'Akil''zon'),
+(779,0,23576,0, 'Nalorakk'),
+(780,0,23578,0, 'Jan''alai'),
+(781,0,23577,0, 'Halazzi'),
+(782,0,24239,0, 'Hex Lord Malacrass'),
+(783,0,23863,197, 'Zul''jin'),
+(784,0,14507,0, 'High Priest Venoxis'),
+(785,0,14517,0, 'High Priestess Jeklik'),
+(786,0,14510,0, 'High Priestess Mar''li'),
+(787,0,11382,0, 'Bloodlord Mandokir'),
+(788,0,15083,0, 'Edge of Madness'),
+(789,0,14509,0, 'High Priest Thekal'),
+(790,0,15114,0, 'Gahz''ranka'),
+(791,0,14515,0, 'High Priestess Arlokk'),
+(792,0,11380,0, 'Jin''do the Hexxer'),
+(793,0,14834,42, 'Hakkar'),
+(829,0,36497,0, 'Bronjahm'),
+(830,0,36497,0, 'Bronjahm '),
+(831,0,36502,251, 'Devourer of Souls'),
+(832,0,36502,252, 'Devourer of Souls'),
+(833,0,36494,0, 'Forgemaster Garfrost'),
+(834,0,36494,0, 'Forgemaster Garfrost'),
+(835,0,36476,0, 'Krick'),
+(836,0,36476,0, 'Krick'),
+(837,0,36658,253, 'Overlord Tyrannus'),
+(838,0,36658,254, 'Overlord Tyrannus'),
+(839,0,38113,0, 'Marwyn'),
+(840,0,38113,0, 'Marwyn'),
+(841,0,38112,0, 'Falric'),
+(842,0,38112,0, 'Falric'),
+(843,1,72830,255, 'Escaped from Arthas'),
+(844,1,72830,256, 'Escaped from Arthas'),
+(845,0,36612,0, 'Lord Marrowgar'),
+(846,0,36855,0, 'Lady Deathwhisper'),
+(847,1,72959,0, 'Icecrown Gunship Battle'),
+(848,0,37813,0, 'Deathbringer Saurfang'),
+(849,0,36626,0, 'Festergut'),
+(850,0,36627,0, 'Rotface'),
+(851,0,36678,0, 'Professor Putricide'),
+(852,0,37970,0, 'Blood Council'),
+(853,0,37955,0, 'Queen Lana''thel'),
+(854,1,72706,0, 'Valithria Dreamwalker'),
+(855,0,36853,0, 'Sindragosa'),
+(856,0,36597,279, 'The Lich King'),
+(857,0,36612,0, 'Lord Marrowgar'),
+(858,0,36855,0, 'Lady Deathwhisper'),
+(859,1,72959,0, 'Icecrown Gunship Battle'),
+(860,0,37813,0, 'Deathbringer Saurfang'),
+(861,0,36626,0, 'Festergut'),
+(862,0,36627,0, 'Rotface'),
+(863,0,36678,0, 'Professor Putricide'),
+(864,0,37970,0, 'Blood Council'),
+(865,0,37955,0, 'Queen Lana''thel'),
+(866,1,72706,0, 'Valithria Dreamwalker'),
+(867,0,36853,0, 'Sindragosa'),
+(868,0,36597,280, 'The Lich King'),
+(883,0,4422,0, 'Agathelos the Raging'),
+(885,0,38433,239, 'Toravon the Ice Watcher'),
+(886,0,38433,240, 'Toravon the Ice Watcher'),
+(887,0,39863,293, 'Halion'),
+(888,0,39863,294, 'Halion'),
+(889,0,39751,0, 'Baltharus the Warborn'),
+(890,0,39751,0, 'Baltharus the Warborn'),
+(891,0,39747,0, 'Saviana Ragefire'),
+(892,0,39747,0, 'Saviana Ragefire'),
+(893,0,39746,0, 'General Zarithrian'),
+(894,0,39746,0, 'General Zarithrian');
+/*!40000 ALTER TABLE `instance_encounters` ENABLE KEYS */;
+UNLOCK TABLES;
diff --git a/sql/updates/2011_02_03_1_world_command.sql b/sql/updates/2011_02_03_1_world_command.sql
new file mode 100644
index 00000000000..8902097fb06
--- /dev/null
+++ b/sql/updates/2011_02_03_1_world_command.sql
@@ -0,0 +1 @@
+DELETE FROM `command` WHERE `name`='reload lfg_dungeon_encounters';
diff --git a/sql/updates/2011_02_03_2_world_lfg_dungeon_encounters.sql b/sql/updates/2011_02_03_2_world_lfg_dungeon_encounters.sql
new file mode 100644
index 00000000000..16fe34907a2
--- /dev/null
+++ b/sql/updates/2011_02_03_2_world_lfg_dungeon_encounters.sql
@@ -0,0 +1 @@
+DROP TABLE IF EXISTS `lfg_dungeon_encounters';
diff --git a/sql/updates/2011_02_03_3_world_spell_dbc.sql b/sql/updates/2011_02_03_3_world_spell_dbc.sql
new file mode 100644
index 00000000000..223c4760d0b
--- /dev/null
+++ b/sql/updates/2011_02_03_3_world_spell_dbc.sql
@@ -0,0 +1,17 @@
+INSERT INTO `spell_dbc` (`Id`,`Dispel`,`Mechanic`,`Attributes`,`AttributesEx`,`AttributesEx2`,`AttributesEx3`,`AttributesEx4`,`AttributesEx5`,`Stances`,`StancesNot`,`Targets`,`CastingTimeIndex`,`AuraInterruptFlags`,`ProcFlags`,`ProcChance`,`ProcCharges`,
+`MaxLevel`,`BaseLevel`,`SpellLevel`,`DurationIndex`,`RangeIndex`,`StackAmount`,`EquippedItemClass`,`EquippedItemSubClassMask`,`EquippedItemInventoryTypeMask`,`Effect1`,`Effect2`,`Effect3`,`EffectDieSides1`,`EffectDieSides2`,`EffectDieSides3`,
+`EffectRealPointsPerLevel1`,`EffectRealPointsPerLevel2`,`EffectRealPointsPerLevel3`,`EffectBasePoints1`,`EffectBasePoints2`,`EffectBasePoints3`,`EffectMechanic1`,`EffectMechanic2`,`EffectMechanic3`,`EffectImplicitTargetA1`,`EffectImplicitTargetA2`,`EffectImplicitTargetA3`,
+`EffectImplicitTargetB1`,`EffectImplicitTargetB2`,`EffectImplicitTargetB3`,`EffectRadiusIndex1`,`EffectRadiusIndex2`,`EffectRadiusIndex3`,`EffectApplyAuraName1`,`EffectApplyAuraName2`,`EffectApplyAuraName3`,`EffectAmplitude1`,`EffectAmplitude2`,`EffectAmplitude3`,
+`EffectMultipleValue1`,`EffectMultipleValue2`,`EffectMultipleValue3`,`EffectMiscValue1`,`EffectMiscValue2`,`EffectMiscValue3`,`EffectMiscValueB1`,`EffectMiscValueB2`,`EffectMiscValueB3`,`EffectTriggerSpell1`,`EffectTriggerSpell2`,`EffectTriggerSpell3`,
+`EffectSpellClassMaskA1`,`EffectSpellClassMaskA2`,`EffectSpellClassMaskA3`,`EffectSpellClassMaskB1`,`EffectSpellClassMaskB2`,`EffectSpellClassMaskB3`,`EffectSpellClassMaskC1`,`EffectSpellClassMaskC2`,`EffectSpellClassMaskC3`,`MaxTargetLevel`,`SpellFamilyName`,
+`SpellFamilyFlags1`,`SpellFamilyFlags2`,`SpellFamilyFlags3`,`MaxAffectedTargets`,`DmgClass`,`PreventionType`,`DmgMultiplier1`,`DmgMultiplier2`,`DmgMultiplier3`,`AreaGroupId`,`SchoolMask`,`Comment`) VALUES
+(58630,0,0,536870912,0,0,0,0,0,0,0,0,1,0,0,101,0,0,0,0,0,1,0,-1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,16,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'Mal''ganis credit marker'),
+(68572,0,0,536870912,0,0,0,0,0,0,0,0,1,0,0,101,0,0,0,0,0,1,0,-1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,16,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'Grand Champions credit marker'),
+(68574,0,0,536870912,0,0,0,0,0,0,0,0,1,0,0,101,0,0,0,0,0,1,0,-1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,16,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'Argent Champion credit marker'),
+(59046,0,0,536870912,0,0,0,0,0,0,0,0,1,0,0,101,0,0,0,0,0,1,0,-1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,16,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'Tribunal of Ages credit marker'),
+(68184,0,0,536870912,0,0,0,0,0,0,0,0,1,0,0,101,0,0,0,0,0,1,0,-1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,16,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'Faction Champions credit marker'),
+(59450,0,0,536870912,0,0,0,0,0,0,0,0,1,0,0,101,0,0,0,0,0,1,0,-1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,16,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'The Four Horsemen credit marker'),
+(65195,0,0,536870912,0,0,0,0,0,0,0,0,1,0,0,101,0,0,0,0,0,1,0,-1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,16,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'The Iron Council credit marker'),
+(64899,0,0,536870912,0,0,0,0,0,0,0,0,1,0,0,101,0,0,0,0,0,1,0,-1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,16,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'Hodir credit marker'),
+(64985,0,0,536870912,0,0,0,0,0,0,0,0,1,0,0,101,0,0,0,0,0,1,0,-1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,16,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'Thorim credit marker'),
+(65074,0,0,536870912,0,0,0,0,0,0,0,0,1,0,0,101,0,0,0,0,0,1,0,-1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,16,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'Freya credit marker');
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index 327b4360292..228af5838df 100755
--- a/src/server/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
@@ -38,7 +38,6 @@
#include "BattlegroundAB.h"
#include "Map.h"
#include "InstanceScript.h"
-#include "LFGMgr.h"
namespace Trinity
{
@@ -1548,9 +1547,6 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
if (IsCompletedAchievement(*itr))
CompletedAchievement(*itr);
}
-
- if (const uint32 dungeonId = sLFGMgr->GetDungeonIdForAchievement(achievement->ID))
- sLFGMgr->RewardDungeonDoneFor(dungeonId, GetPlayer());
}
}
diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp
index 021e5f9d62e..07d0ec037e3 100755
--- a/src/server/game/DataStores/DBCStores.cpp
+++ b/src/server/game/DataStores/DBCStores.cpp
@@ -75,6 +75,7 @@ DBCStorage <CreatureSpellDataEntry> sCreatureSpellDataStore(CreatureSpellDatafmt
DBCStorage <CreatureTypeEntry> sCreatureTypeStore(CreatureTypefmt);
DBCStorage <CurrencyTypesEntry> sCurrencyTypesStore(CurrencyTypesfmt);
+DBCStorage <DungeonEncounterEntry> sDungeonEncounterStore(DungeonEncounterfmt);
DBCStorage <DurabilityQualityEntry> sDurabilityQualityStore(DurabilityQualityfmt);
DBCStorage <DurabilityCostsEntry> sDurabilityCostsStore(DurabilityCostsfmt);
@@ -246,7 +247,7 @@ void LoadDBCStores(const std::string& dataPath)
uint32 oldMSTime = getMSTime();
std::string dbcPath = dataPath+"dbc/";
- const uint32 DBCFilesCount = 91;
+ const uint32 DBCFilesCount = 92;
StoreProblemList bad_dbc_files;
uint32 availableDbcLocales = 0xFFFFFFFF;
@@ -287,6 +288,7 @@ void LoadDBCStores(const std::string& dataPath)
LoadDBC(availableDbcLocales,bad_dbc_files,sCreatureSpellDataStore, dbcPath,"CreatureSpellData.dbc");
LoadDBC(availableDbcLocales,bad_dbc_files,sCreatureTypeStore, dbcPath,"CreatureType.dbc");
LoadDBC(availableDbcLocales,bad_dbc_files,sCurrencyTypesStore, dbcPath,"CurrencyTypes.dbc");
+ LoadDBC(availableDbcLocales,bad_dbc_files,sDungeonEncounterStore, dbcPath,"DungeonEncounter.dbc");
LoadDBC(availableDbcLocales,bad_dbc_files,sDurabilityCostsStore, dbcPath,"DurabilityCosts.dbc");
LoadDBC(availableDbcLocales,bad_dbc_files,sDurabilityQualityStore, dbcPath,"DurabilityQuality.dbc");
LoadDBC(availableDbcLocales,bad_dbc_files,sEmotesStore, dbcPath,"Emotes.dbc");
@@ -581,12 +583,8 @@ void LoadDBCStores(const std::string& dataPath)
LoadDBC(availableDbcLocales,bad_dbc_files,sVehicleSeatStore, dbcPath,"VehicleSeat.dbc");
LoadDBC(availableDbcLocales,bad_dbc_files,sWMOAreaTableStore, dbcPath,"WMOAreaTable.dbc");
for(uint32 i = 0; i < sWMOAreaTableStore.GetNumRows(); ++i)
- {
if(WMOAreaTableEntry const* entry = sWMOAreaTableStore.LookupEntry(i))
- {
sWMOAreaInfoByTripple.insert(WMOAreaInfoByTripple::value_type(WMOAreaTableTripple(entry->rootId, entry->adtId, entry->groupId), entry));
- }
- }
LoadDBC(availableDbcLocales,bad_dbc_files,sWorldMapAreaStore, dbcPath,"WorldMapArea.dbc");
LoadDBC(availableDbcLocales,bad_dbc_files,sWorldMapOverlayStore, dbcPath,"WorldMapOverlay.dbc");
LoadDBC(availableDbcLocales,bad_dbc_files,sWorldSafeLocsStore, dbcPath,"WorldSafeLocs.dbc");
diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h
index fbd61153509..3b7a5764281 100755
--- a/src/server/game/DataStores/DBCStores.h
+++ b/src/server/game/DataStores/DBCStores.h
@@ -26,8 +26,8 @@
#include <list>
typedef std::list<uint32> SimpleFactionsList;
-
SimpleFactionsList const* GetFactionTeamList(uint32 faction);
+
char* GetPetName(uint32 petfamily, uint32 dbclang);
uint32 GetTalentSpellCost(uint32 spellId);
TalentSpellPos const* GetTalentSpellPos(uint32 spellId);
@@ -84,6 +84,7 @@ extern DBCStorage <CreatureFamilyEntry> sCreatureFamilyStore;
extern DBCStorage <CreatureSpellDataEntry> sCreatureSpellDataStore;
extern DBCStorage <CreatureTypeEntry> sCreatureTypeStore;
extern DBCStorage <CurrencyTypesEntry> sCurrencyTypesStore;
+extern DBCStorage <DungeonEncounterEntry> sDungeonEncounterStore;
extern DBCStorage <DurabilityCostsEntry> sDurabilityCostsStore;
extern DBCStorage <DurabilityQualityEntry> sDurabilityQualityStore;
extern DBCStorage <EmotesEntry> sEmotesStore;
diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h
index ef09795d731..3ece8f93e39 100755
--- a/src/server/game/DataStores/DBCStructure.h
+++ b/src/server/game/DataStores/DBCStructure.h
@@ -784,6 +784,18 @@ struct CurrencyTypesEntry
uint32 BitIndex; // 3 bit index in PLAYER_FIELD_KNOWN_CURRENCIES (1 << (index-1))
};
+struct DungeonEncounterEntry
+{
+ uint32 id; // 0 unique id
+ uint32 mapId; // 1 map id
+ uint32 difficulty; // 2 instance mode
+ //uint32 unk0; // 3
+ uint32 encounterIndex; // 4 encounter index for creating completed mask
+ char* encounterName[16]; // 5-20 encounter name
+ //uint32 nameFlags; // 21
+ //uint32 unk1; // 22
+};
+
struct DurabilityCostsEntry
{
uint32 Itemlvl; // 0
diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h
index a6d3f8e983a..89495b786dd 100755
--- a/src/server/game/DataStores/DBCfmt.h
+++ b/src/server/game/DataStores/DBCfmt.h
@@ -41,6 +41,7 @@ const char CreatureFamilyfmt[]="nfifiiiiixssssssssssssssssxx";
const char CreatureSpellDatafmt[]="niiiixxxx";
const char CreatureTypefmt[]="nxxxxxxxxxxxxxxxxxx";
const char CurrencyTypesfmt[]="xnxi";
+const char DungeonEncounterfmt[]="niixissssssssssssssssxx";
const char DurabilityCostsfmt[]="niiiiiiiiiiiiiiiiiiiiiiiiiiiii";
const char DurabilityQualityfmt[]="nf";
const char EmotesEntryfmt[]="nxxiiix";
diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp
index 97b31a37cf1..d7a329737a6 100755
--- a/src/server/game/DungeonFinding/LFGMgr.cpp
+++ b/src/server/game/DungeonFinding/LFGMgr.cpp
@@ -71,61 +71,6 @@ LFGMgr::~LFGMgr()
delete it->second;
}
-/// Load achievement <-> encounter associations
-void LFGMgr::LoadDungeonEncounters()
-{
- uint32 oldMSTime = getMSTime();
-
- m_EncountersByAchievement.clear();
-
- QueryResult result = WorldDatabase.Query("SELECT achievementId, dungeonId FROM lfg_dungeon_encounters");
-
- if (!result)
- {
-
- sLog->outString();
- sLog->outErrorDb(">> Loaded 0 dungeon encounter lfg associations. DB table `lfg_dungeon_encounters` is empty!");
- return;
- }
-
- uint32 count = 0;
-
- Field* fields = NULL;
- do
- {
- fields = result->Fetch();
- uint32 achievementId = fields[0].GetUInt32();
- uint32 dungeonId = fields[1].GetUInt32();
-
- if (AchievementEntry const* achievement = sAchievementStore.LookupEntry(achievementId))
- {
- if (!(achievement->flags & ACHIEVEMENT_FLAG_COUNTER))
- {
- sLog->outErrorDb("Achievement %u specified in table `lfg_dungeon_encounters` is not a statistic!", achievementId);
- continue;
- }
- }
- else
- {
- sLog->outErrorDb("Achievement %u specified in table `lfg_dungeon_encounters` does not exist!", achievementId);
- continue;
- }
-
- if (!sLFGDungeonStore.LookupEntry(dungeonId))
- {
- sLog->outErrorDb("Dungeon %u specified in table `lfg_dungeon_encounters` does not exist!", dungeonId);
- continue;
- }
-
- m_EncountersByAchievement[achievementId] = dungeonId;
- ++count;
- } while (result->NextRow());
-
- sLog->outString(">> Loaded %u dungeon encounter lfg associations in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
- sLog->outString();
-}
-
-
/// Load rewards for completing dungeons
void LFGMgr::LoadRewards()
{
@@ -1730,7 +1675,6 @@ void LFGMgr::TeleportPlayer(Player* plr, bool out, bool fromOpcode /*= false*/)
if (!fromOpcode)
{
-
// Select a player inside to be teleported to
for (GroupReference* itr = grp->GetFirstMember(); itr != NULL && !mapid; itr = itr->next())
{
@@ -1923,21 +1867,6 @@ LfgType LFGMgr::GetDungeonType(uint32 dungeonId)
}
/**
- Given a Achievement id returns the related dungeon id
-
- @param[in] achievementId Achievement id
- @returns dungeon id
-*/
-uint32 LFGMgr::GetDungeonIdForAchievement(uint32 achievementId)
-{
- std::map<uint32, uint32>::iterator itr = m_EncountersByAchievement.find(achievementId);
- if (itr != m_EncountersByAchievement.end())
- return itr->second;
-
- return 0;
-};
-
-/**
Given a list of guids returns the concatenation using | as delimiter
@param[in] check list of guids
diff --git a/src/server/game/DungeonFinding/LFGMgr.h b/src/server/game/DungeonFinding/LFGMgr.h
index 775c1e05837..493bed3305b 100755
--- a/src/server/game/DungeonFinding/LFGMgr.h
+++ b/src/server/game/DungeonFinding/LFGMgr.h
@@ -262,10 +262,8 @@ class LFGMgr
void Update(uint32 diff);
// Reward
- void LoadDungeonEncounters();
void LoadRewards();
void RewardDungeonDoneFor(const uint32 dungeonId, Player* player);
- uint32 GetDungeonIdForAchievement(uint32 achievementId);
LfgReward const* GetRandomDungeonReward(uint32 dungeon, uint8 level);
// Queue
@@ -348,7 +346,6 @@ class LFGMgr
LfgDungeonMap m_CachedDungeonMap; ///< Stores all dungeons by groupType
// Reward System
LfgRewardMap m_RewardMap; ///< Stores rewards for random dungeons
- std::map<uint32, uint32> m_EncountersByAchievement;///< Stores dungeon ids associated with achievements (for rewards)
// Queue
LfgQueueInfoMap m_QueueInfoMap; ///< Queued groups
LfgGuidListMap m_currentQueue; ///< Ordered list. Used to find groups
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 29d1d136687..a6a8e9a6bb0 100755
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -68,6 +68,7 @@
#include "WeatherMgr.h"
#include "LFGMgr.h"
#include "CharacterDatabaseCleaner.h"
+#include "InstanceScript.h"
#include <cmath>
#define ZONE_UPDATE_INTERVAL (1*IN_MILLISECONDS)
@@ -17709,6 +17710,10 @@ InstancePlayerBind* Player::BindToInstance(InstanceSave *save, bool permanent, b
void Player::BindToInstance()
{
+ // Player left the instance
+ if (_pendingBind->GetInstanceId() != GetInstanceId())
+ return;
+
WorldPacket data(SMSG_INSTANCE_SAVE_CREATED, 4);
data << uint32(0);
GetSession()->SendPacket(&data);
@@ -22116,6 +22121,12 @@ bool Player::RewardPlayerAndGroupAtKill(Unit* pVictim)
KilledMonster(pVictim->ToCreature()->GetCreatureInfo(), pVictim->GetGUID());
}
}
+
+ // Credit encounter in instance
+ if (pVictim->GetTypeId() == TYPEID_UNIT && GetMap()->IsDungeon())
+ if (InstanceScript* instance = pVictim->GetInstanceScript())
+ instance->UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, pVictim->GetEntry(), pVictim);
+
return xp || honored_kill;
}
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 013c8afe6e8..940f3c5ad1a 100755
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -5553,6 +5553,84 @@ void ObjectMgr::LoadInstanceTemplate()
sLog->outString();
}
+void ObjectMgr::LoadInstanceEncounters()
+{
+ uint32 oldMSTime = getMSTime();
+
+ QueryResult result = WorldDatabase.Query("SELECT entry, creditType, creditEntry, lastEncounterDungeon FROM instance_encounters");
+ if (!result)
+ {
+ sLog->outErrorDb(">> Loaded 0 instance encounters, table is empty!");
+ sLog->outString();
+ return;
+ }
+
+ uint32 count = 0;
+ std::map<uint32, DungeonEncounterEntry const*> dungeonLastBosses;
+ do
+ {
+ Field* fields = result->Fetch();
+ uint32 entry = fields[0].GetUInt32();
+ DungeonEncounterEntry const* dungeonEncounter = sDungeonEncounterStore.LookupEntry(entry);
+ if (!dungeonEncounter)
+ {
+ sLog->outErrorDb("Table `instance_encounters` has an invalid encounter id %u, skipped!", entry);
+ continue;
+ }
+
+ uint8 creditType = fields[1].GetUInt8();
+ uint32 creditEntry = fields[2].GetUInt32();
+
+ switch (creditType)
+ {
+ case ENCOUNTER_CREDIT_KILL_CREATURE:
+ if (!GetCreatureInfo(creditEntry))
+ {
+ sLog->outErrorDb("Table `instance_encounters` has an invalid creature (entry %u) linked to the encounter %u (%s), skipped!", creditEntry, entry, dungeonEncounter->encounterName[0]);
+ continue;
+ }
+ break;
+ case ENCOUNTER_CREDIT_CAST_SPELL:
+ if (!sSpellStore.LookupEntry(creditEntry))
+ {
+ sLog->outErrorDb("Table `instance_encounters` has an invalid spell (entry %u) linked to the encounter %u (%s), skipped!", creditEntry, entry, dungeonEncounter->encounterName[0]);
+ continue;
+ }
+ break;
+ default:
+ sLog->outErrorDb("Table `instance_encounters` has an invalid credit type (%u) for encounter %u (%s), skipped!", creditType, entry, dungeonEncounter->encounterName[0]);
+ continue;
+ }
+
+ uint32 lastEncounterDungeon = fields[3].GetUInt32();
+
+ if (lastEncounterDungeon && !sLFGDungeonStore.LookupEntry(lastEncounterDungeon))
+ {
+ sLog->outErrorDb("Table `instance_encounters` has an encounter %u (%s) marked as final for invalid dungeon id %u, skipped!", entry, dungeonEncounter->encounterName[0], lastEncounterDungeon);
+ continue;
+ }
+
+ std::map<uint32, DungeonEncounterEntry const*>::const_iterator itr = dungeonLastBosses.find(lastEncounterDungeon);
+ if (lastEncounterDungeon)
+ {
+ if (itr != dungeonLastBosses.end())
+ {
+ sLog->outErrorDb("Table `instance_encounters` specified encounter %u (%s) as last encounter but %u (%s) is already marked as one, skipped!", entry, dungeonEncounter->encounterName[0], itr->second->id, itr->second->encounterName[0]);
+ continue;
+ }
+
+ dungeonLastBosses[lastEncounterDungeon] = dungeonEncounter;
+ }
+
+ DungeonEncounterList& encounters = mDungeonEncounters[MAKE_PAIR32(dungeonEncounter->mapId, dungeonEncounter->difficulty)];
+ encounters.push_back(new DungeonEncounter(dungeonEncounter, EncounterCreditType(creditType), creditEntry, lastEncounterDungeon));
+ ++count;
+ } while (result->NextRow());
+
+ sLog->outString(">> Loaded %u instance encounters in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
+ sLog->outString();
+}
+
GossipText const *ObjectMgr::GetGossipText(uint32 Text_ID) const
{
GossipTextMap::const_iterator itr = mGossipText.find(Text_ID);
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index 4efbbc7e5f0..13d3a3ec418 100755
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -557,7 +557,27 @@ struct LanguageDesc
};
extern LanguageDesc lang_description[LANGUAGES_COUNT];
- LanguageDesc const* GetLanguageDescByID(uint32 lang);
+LanguageDesc const* GetLanguageDescByID(uint32 lang);
+
+enum EncounterCreditType
+{
+ ENCOUNTER_CREDIT_KILL_CREATURE = 0,
+ ENCOUNTER_CREDIT_CAST_SPELL = 1,
+};
+
+struct DungeonEncounter
+{
+ DungeonEncounter(DungeonEncounterEntry const* _dbcEntry, EncounterCreditType _creditType, uint32 _creditEntry, uint32 _lastEncounterDungeon)
+ : dbcEntry(_dbcEntry), creditType(_creditType), creditEntry(_creditEntry), lastEncounterDungeon(_lastEncounterDungeon) { }
+
+ DungeonEncounterEntry const* dbcEntry;
+ EncounterCreditType creditType;
+ uint32 creditEntry;
+ uint32 lastEncounterDungeon;
+};
+
+typedef std::list<DungeonEncounter const*> DungeonEncounterList;
+typedef UNORDERED_MAP<uint32,DungeonEncounterList> DungeonEncounterMap;
class PlayerDumpReader;
@@ -796,6 +816,14 @@ class ObjectMgr
return NULL;
}
+ DungeonEncounterList const* GetDungeonEncounterList(uint32 mapId, Difficulty difficulty)
+ {
+ UNORDERED_MAP<uint32, DungeonEncounterList>::const_iterator itr = mDungeonEncounters.find(MAKE_PAIR32(mapId, difficulty));
+ if (itr != mDungeonEncounters.end())
+ return &itr->second;
+ return NULL;
+ }
+
void LoadGuilds();
void LoadArenaTeams();
void LoadGroups();
@@ -884,6 +912,7 @@ class ObjectMgr
void LoadGossipMenuItemsLocales();
void LoadPointOfInterestLocales();
void LoadInstanceTemplate();
+ void LoadInstanceEncounters();
void LoadMailLevelRewards();
void LoadVehicleAccessories();
void LoadVehicleScaling();
@@ -1253,6 +1282,7 @@ class ObjectMgr
AreaTriggerMap mAreaTriggers;
AreaTriggerScriptMap mAreaTriggerScripts;
AccessRequirementMap mAccessRequirements;
+ DungeonEncounterMap mDungeonEncounters;
RepRewardRateMap m_RepRewardRateMap;
RepOnKillMap mRepOnKill;
diff --git a/src/server/game/Instances/InstanceSaveMgr.cpp b/src/server/game/Instances/InstanceSaveMgr.cpp
index 4c2f8117ba7..ad385a7334d 100755
--- a/src/server/game/Instances/InstanceSaveMgr.cpp
+++ b/src/server/game/Instances/InstanceSaveMgr.cpp
@@ -165,20 +165,27 @@ void InstanceSave::SaveToDB()
{
// save instance data too
std::string data;
+ uint32 completedEncounters = 0;
- Map *map = sMapMgr->FindMap(GetMapId(),m_instanceid);
+ Map *map = sMapMgr->FindMap(GetMapId(), m_instanceid);
if (map)
{
ASSERT(map->IsDungeon());
- if (InstanceScript *iData = ((InstanceMap*)map)->GetInstanceScript())
+ if (InstanceScript *instanceScript = ((InstanceMap*)map)->GetInstanceScript())
{
- data = iData->GetSaveData();
- if (!data.empty())
- CharacterDatabase.escape_string(data);
+ data = instanceScript->GetSaveData();
+ completedEncounters = instanceScript->GetCompletedEncounterMask();
}
}
- CharacterDatabase.PExecute("INSERT INTO instance VALUES ('%u', '%u', '%u', '%u', '%s')", m_instanceid, GetMapId(), (uint32)GetResetTimeForDB(), GetDifficulty(), data.c_str());
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_ADD_INSTANCE_SAVE);
+ stmt->setUInt32(0, m_instanceid);
+ stmt->setUInt16(1, GetMapId());
+ stmt->setUInt32(2, uint32(GetResetTimeForDB()));
+ stmt->setUInt8(3, uint8(GetDifficulty()));
+ stmt->setUInt32(4, completedEncounters);
+ stmt->setString(5, data);
+ CharacterDatabase.Execute(stmt);
}
time_t InstanceSave::GetResetTimeForDB()
diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp
index 348ff7a766c..231d6ab6667 100755
--- a/src/server/game/Instances/InstanceScript.cpp
+++ b/src/server/game/Instances/InstanceScript.cpp
@@ -24,14 +24,19 @@
#include "Creature.h"
#include "CreatureAI.h"
#include "Log.h"
+#include "LFGMgr.h"
void InstanceScript::SaveToDB()
{
std::string data = GetSaveData();
if (data.empty())
return;
- CharacterDatabase.escape_string(data);
- CharacterDatabase.PExecute("UPDATE instance SET data = '%s' WHERE id = '%d'", data.c_str(), instance->GetInstanceId());
+
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPDATE_INSTANCE_DATA);
+ stmt->setUInt32(0, GetCompletedEncounterMask());
+ stmt->setString(1, data);
+ stmt->setUInt32(2, instance->GetInstanceId());
+ CharacterDatabase.Execute(stmt);
}
void InstanceScript::HandleGameObject(uint64 GUID, bool open, GameObject *go)
@@ -427,3 +432,29 @@ void InstanceScript::SendEncounterUnit(uint32 type, Unit* unit /*= NULL*/, uint8
instance->SendToPlayers(&data);
}
+
+void InstanceScript::UpdateEncounterState(EncounterCreditType type, uint32 creditEntry, Unit* source)
+{
+ DungeonEncounterList const* encounters = sObjectMgr->GetDungeonEncounterList(instance->GetId(), instance->GetDifficulty());
+ if (!encounters)
+ return;
+
+ for (DungeonEncounterList::const_iterator itr = encounters->begin(); itr != encounters->end(); ++itr)
+ {
+ if ((*itr)->creditType == type && (*itr)->creditEntry == creditEntry)
+ {
+ completedEncounters |= 1 << (*itr)->dbcEntry->encounterIndex;
+ sLog->outDebug("Instance %s (instanceId %u) completed encounter %s", instance->GetMapName(), instance->GetInstanceId(), (*itr)->dbcEntry->encounterName[0]);
+ if (uint32 dungeonId = (*itr)->lastEncounterDungeon)
+ {
+ Map::PlayerList const& players = instance->GetPlayers();
+ if (!players.isEmpty())
+ for (Map::PlayerList::const_iterator i = players.begin(); i != players.end(); ++i)
+ if (Player* player = i->getSource())
+ if (!source || player->IsAtGroupRewardDistance(source))
+ sLFGMgr->RewardDungeonDoneFor(dungeonId, player);
+ }
+ return;
+ }
+ }
+}
diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h
index 5e293eee0ca..2ba81c963a4 100755
--- a/src/server/game/Instances/InstanceScript.h
+++ b/src/server/game/Instances/InstanceScript.h
@@ -21,6 +21,7 @@
#include "ZoneScript.h"
#include "World.h"
+#include "ObjectMgr.h"
//#include "GameObject.h"
//#include "Map.h"
@@ -124,7 +125,8 @@ class InstanceScript : public ZoneScript
{
public:
- explicit InstanceScript(Map *map) : instance(map) {}
+ explicit InstanceScript(Map* map) : instance(map), completedEncounters(0) {}
+
virtual ~InstanceScript() {}
Map *instance;
@@ -196,9 +198,14 @@ class InstanceScript : public ZoneScript
// Checks boss requirements (one boss required to kill other)
virtual bool CheckRequiredBosses(uint32 /*bossId*/, Player const* /*player*/ = NULL) const { return true; }
+ // Checks encounter state at kill/spellcast
+ void UpdateEncounterState(EncounterCreditType type, uint32 creditEntry, Unit* source);
+
+ // Used only during loading
+ void SetCompletedEncountersMask(uint32 newMask) { completedEncounters = newMask; }
+
// Returns completed encounters mask for packets
- // NOTE: MUST USE ENCOUNTER IDS FROM DungeonEncounter.dbc 4th column
- virtual uint32 GetCompletedEncounterMask() const { return 0; }
+ uint32 GetCompletedEncounterMask() const { return completedEncounters; }
void SendEncounterUnit(uint32 type, Unit* unit = NULL, uint8 param1 = 0, uint8 param2 = 0);
@@ -219,6 +226,7 @@ class InstanceScript : public ZoneScript
std::vector<BossInfo> bosses;
DoorInfoMap doors;
MinionInfoMap minions;
+ uint32 completedEncounters; // completed encounter mask, bit indexes are DungeonEncounter.dbc boss numbers, used for packets
};
#endif
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index c4187ff626f..1e2e55a7cde 100755
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -2425,11 +2425,12 @@ void InstanceMap::CreateInstanceData(bool load)
if (load)
{
// TODO: make a global storage for this
- QueryResult result = CharacterDatabase.PQuery("SELECT data FROM instance WHERE map = '%u' AND id = '%u'", GetId(), i_InstanceId);
+ QueryResult result = CharacterDatabase.PQuery("SELECT data, completedEncounters FROM instance WHERE map = '%u' AND id = '%u'", GetId(), i_InstanceId);
if (result)
{
Field* fields = result->Fetch();
std::string data = fields[0].GetString();
+ i_data->SetCompletedEncountersMask(fields[1].GetUInt32());
if (data != "")
{
sLog->outDebug("Loading instance data for `%s` with id %u", sObjectMgr->GetScriptName(i_script_id), i_InstanceId);
diff --git a/src/server/game/Server/Protocol/Handlers/LFGHandler.cpp b/src/server/game/Server/Protocol/Handlers/LFGHandler.cpp
index 2ac129973a9..ac8ce189f4b 100755
--- a/src/server/game/Server/Protocol/Handlers/LFGHandler.cpp
+++ b/src/server/game/Server/Protocol/Handlers/LFGHandler.cpp
@@ -22,7 +22,7 @@
#include "Group.h"
#include "LFGMgr.h"
#include "ObjectMgr.h"
-
+#include "InstanceScript.h"
void BuildPlayerLockDungeonBlock(WorldPacket& data, const LfgLockMap& lock)
{
@@ -555,6 +555,7 @@ void WorldSession::SendLfgUpdateProposal(uint32 proposalId, const LfgProposal* p
bool isSameDungeon = false;
bool isContinue = false;
Group* grp = dLowGuid ? sObjectMgr->GetGroupByGUID(dLowGuid) : NULL;
+ uint32 completedEncounters = 0;
if (grp)
{
uint64 gguid = grp->GetGUID();
@@ -571,12 +572,31 @@ void WorldSession::SendLfgUpdateProposal(uint32 proposalId, const LfgProposal* p
if (playerDungeons.size() == 1)
dungeonId = (*playerDungeons.begin());
}
+
if (LFGDungeonEntry const* dungeon = sLFGDungeonStore.LookupEntry(dungeonId))
+ {
dungeonId = dungeon->Entry();
+
+ // Select a player inside to be get completed encounters from
+ if (grp)
+ {
+ for (GroupReference* itr = grp->GetFirstMember(); itr != NULL; itr = itr->next())
+ {
+ Player* groupMember = itr->getSource();
+ if (groupMember && groupMember->GetMapId() == uint32(dungeon->map))
+ {
+ if (InstanceScript* instance = groupMember->GetInstanceScript())
+ completedEncounters = instance->GetCompletedEncounterMask();
+ break;
+ }
+ }
+ }
+ }
+
data << uint32(dungeonId); // Dungeon
data << uint8(pProp->state); // Result state
data << uint32(proposalId); // Internal Proposal ID
- data << uint32(0); // Bosses killed - FIXME
+ data << uint32(completedEncounters); // Bosses killed
data << uint8(isSameDungeon); // Silent (show client window)
data << uint8(pProp->players.size()); // Group size
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 2cc6d08c0be..f0ecb5307b6 100755
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -51,6 +51,7 @@
#include "ConditionMgr.h"
#include "DisableMgr.h"
#include "SpellScript.h"
+#include "InstanceScript.h"
#define SPELL_CHANNEL_UPDATE_INTERVAL (1 * IN_MILLISECONDS)
@@ -3717,16 +3718,17 @@ void Spell::finish(bool ok)
// triggered spell pointer can be not set in some cases
// this is needed for proper apply of triggered spell mods
m_caster->ToPlayer()->SetSpellModTakingSpell(this, true);
- }
- // Take mods after trigger spell (needed for 14177 to affect 48664)
- // mods are taken only on succesfull cast and independantly from targets of the spell
- if (m_caster->GetTypeId() == TYPEID_PLAYER)
- {
+ // Take mods after trigger spell (needed for 14177 to affect 48664)
+ // mods are taken only on succesfull cast and independantly from targets of the spell
m_caster->ToPlayer()->RemoveSpellMods(this);
m_caster->ToPlayer()->SetSpellModTakingSpell(this, false);
}
+ if (m_caster->GetTypeId() == TYPEID_UNIT)
+ if (InstanceScript* instance = m_caster->GetInstanceScript())
+ instance->UpdateEncounterState(ENCOUNTER_CREDIT_CAST_SPELL, m_spellInfo->Id, m_caster);
+
// Stop Attack for some spells
if (m_spellInfo->Attributes & SPELL_ATTR0_STOP_ATTACK_TARGET)
m_caster->AttackStop();
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 08193860413..ab5071a18bd 100755
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -1403,7 +1403,7 @@ void World::SetInitialWorldSettings()
sGameEventMgr->LoadFromDB(); // TODOLEAK: add scopes
sLog->outString("Loading Dungeon boss data...");
- sLFGMgr->LoadDungeonEncounters();
+ sObjectMgr->LoadInstanceEncounters();
sLog->outString("Loading LFG rewards...");
sLFGMgr->LoadRewards();
diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp
index 6a35982b74a..ae86a16fae9 100644
--- a/src/server/scripts/Commands/cs_reload.cpp
+++ b/src/server/scripts/Commands/cs_reload.cpp
@@ -102,7 +102,6 @@ public:
{ "item_enchantment_template", SEC_ADMINISTRATOR, true, &HandleReloadItemEnchantementsCommand, "", NULL },
{ "item_loot_template", SEC_ADMINISTRATOR, true, &HandleReloadLootTemplatesItemCommand, "", NULL },
{ "item_set_names", SEC_ADMINISTRATOR, true, &HandleReloadItemSetNamesCommand, "", NULL },
- { "lfg_dungeon_encounters", SEC_ADMINISTRATOR, true, &HandleReloadLfgEncountersCommand, "", NULL },
{ "lfg_dungeon_rewards", SEC_ADMINISTRATOR, true, &HandleReloadLfgRewardsCommand, "", NULL },
{ "locales_achievement_reward", SEC_ADMINISTRATOR, true, &HandleReloadLocalesAchievementRewardCommand, "", NULL },
{ "locales_creature", SEC_ADMINISTRATOR, true, &HandleReloadLocalesCreatureCommand, "", NULL },
@@ -1164,14 +1163,6 @@ public:
return true;
}
- static bool HandleReloadLfgEncountersCommand(ChatHandler* handler, const char* /*args*/)
- {
- sLog->outString("Re-Loading dungeon encounter lfg associations...");
- sLFGMgr->LoadDungeonEncounters();
- handler->SendGlobalGMSysMessage("DB table `lfg_dungeon_encounters` reloaded.");
- return true;
- }
-
static bool HandleReloadLfgRewardsCommand(ChatHandler* handler, const char* /*args*/)
{
sLog->outString("Re-Loading lfg dungeon rewards...");
diff --git a/src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.cpp
index f458084e9b2..0e72c048a03 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockDepths/blackrock_depths.cpp
@@ -237,6 +237,7 @@ public:
case 5:
if (pInstance)
{
+ pInstance->UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, NPC_GRIMSTONE, me);
pInstance->SetData(TYPE_RING_OF_LAW,DONE);
sLog->outDebug("TSCR: npc_grimstone: event reached end and set complete.");
}
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp
index 8f8cde5bb31..1a48ab455e3 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp
@@ -138,7 +138,11 @@ public:
break;
case TYPE_MAIDEN: m_auiEncounter[2] = uiData; break;
case TYPE_OPTIONAL_BOSS: m_auiEncounter[3] = uiData; break;
- case TYPE_OPERA: m_auiEncounter[4] = uiData; break;
+ case TYPE_OPERA:
+ m_auiEncounter[4] = uiData;
+ if (uiData == DONE)
+ UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, 16812, NULL);
+ break;
case TYPE_CURATOR: m_auiEncounter[5] = uiData; break;
case TYPE_ARAN: m_auiEncounter[6] = uiData; break;
case TYPE_TERESTIAN: m_auiEncounter[7] = uiData; break;
diff --git a/src/server/scripts/EasternKingdoms/MoltenCore/boss_majordomo_executus.cpp b/src/server/scripts/EasternKingdoms/MoltenCore/boss_majordomo_executus.cpp
index ffa48d8846b..f5291af6620 100644
--- a/src/server/scripts/EasternKingdoms/MoltenCore/boss_majordomo_executus.cpp
+++ b/src/server/scripts/EasternKingdoms/MoltenCore/boss_majordomo_executus.cpp
@@ -107,7 +107,7 @@ class boss_majordomo : public CreatureScript
if (!me->FindNearestCreature(NPC_FLAMEWAKER_HEALER, 100.0f) && !me->FindNearestCreature(NPC_FLAMEWAKER_ELITE, 100.0f))
{
- //instance->UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, me->GetEntry());
+ instance->UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, me->GetEntry());
me->setFaction(35);
me->AI()->EnterEvadeMode();
DoScriptText(SAY_DEFEAT, me);
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
index 758bb92a1aa..c739364d23d 100755
--- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp
@@ -395,16 +395,6 @@ class instance_icecrown_citadel : public InstanceMapScript
return true;
}
- uint32 GetCompletedEncounterMask() const
- {
- uint32 mask = 0;
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- if (GetBossState(i) == DONE)
- mask |= 1 << i;
-
- return mask;
- }
-
void SetData(uint32 type, uint32 data)
{
switch (type)
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp
index 73c933301f7..51b75f19f7e 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_eregos.cpp
@@ -139,7 +139,7 @@ public:
Talk(SAY_AGGRO);
}
-
+
void DoAction(const int32 action)
{
if (action != ACTION_SET_NORMAL_EVENTS)
@@ -157,7 +157,7 @@ public:
if (summon->GetEntry() != NPC_PLANAR_ANOMALY)
return;
-
+
summon->CombatStop(true);
summon->SetReactState(REACT_PASSIVE);
summon->GetMotionMaster()->MoveRandom(100.0f);
diff --git a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp
index 031bfa33bd9..a0d5eb3d173 100644
--- a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp
+++ b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp
@@ -315,11 +315,13 @@ public:
switch(type)
{
case DATA_1ST_BOSS_EVENT:
+ UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, CREATURE_EREKEM, NULL);
m_auiEncounter[0] = data;
if (data == DONE)
SaveToDB();
break;
case DATA_2ND_BOSS_EVENT:
+ UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, CREATURE_MORAGG, NULL);
m_auiEncounter[1] = data;
if (data == DONE)
SaveToDB();
diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
index 6d251824338..44aaeec07ab 100755
--- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp
+++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
@@ -259,10 +259,12 @@ bool CharacterDatabaseConnection::Open()
PREPARE_STATEMENT(CHAR_ADD_AURA, "INSERT INTO character_aura (guid,caster_guid,item_guid,spell,effect_mask,recalculate_mask,stackcount,amount0,amount1,amount2,base_amount0,base_amount1,base_amount2,maxduration,remaintime,remaincharges) "
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC)
+ // Instance saves
+ PREPARE_STATEMENT(CHAR_ADD_INSTANCE_SAVE, "INSERT INTO instance (id,map,resettime,difficulty,completedEncounters,data) VALUES (?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC)
+ PREPARE_STATEMENT(CHAR_UPDATE_INSTANCE_DATA, "UPDATE instance SET completedEncounters=?, data=? WHERE id=?", CONNECTION_ASYNC)
+
for (PreparedStatementMap::const_iterator itr = m_queries.begin(); itr != m_queries.end(); ++itr)
- {
PrepareStatement(itr->first, itr->second.first, itr->second.second);
- }
return true;
}
diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/shared/Database/Implementation/CharacterDatabase.h
index 412dd6145cd..4d47878eba6 100755
--- a/src/server/shared/Database/Implementation/CharacterDatabase.h
+++ b/src/server/shared/Database/Implementation/CharacterDatabase.h
@@ -218,6 +218,9 @@ enum CharacterDatabaseStatements
CHAR_DEL_AURA,
CHAR_ADD_AURA,
+ CHAR_ADD_INSTANCE_SAVE,
+ CHAR_UPDATE_INSTANCE_DATA,
+
MAX_CHARACTERDATABASE_STATEMENTS,
};