diff options
40 files changed, 1698 insertions, 312 deletions
diff --git a/contrib/check_updates.sh b/contrib/check_updates.sh index 97aa3dff7a8..017542eb807 100644 --- a/contrib/check_updates.sh +++ b/contrib/check_updates.sh @@ -22,7 +22,7 @@ do updates=$((updates+1)) else # The update isn't listed in the updates table of the given database. - echo "- \"sql/updates/${file}\" is missing in table '${name}'.'updates'" + echo "- \"sql/updates/${name}/${file}\" is missing in the '${name}'.'updates' table." error=1 fi done @@ -31,14 +31,14 @@ if [ ${error} -ne 0 ] then echo echo "Fatal error:" - echo " The Database Updater is broken for database '${name}" - echo " due to applied update which are missing in the '${name}'.'updates' table." + echo " The Database Updater is broken for the '${name}' database," + echo " because the applied update is missing in the '${name}'.'updates' table." echo echo "How to fix:" - echo " Insert the missing names of sql updates which were applied already to" - echo " the 'updates' table of the '${name}' base dump ('sql/base/${name}_database.sql')." + echo " Insert the missing names of the already applied sql updates" + echo " to the 'updates' table of the '${name}' base dump ('sql/base/${name}_database.sql')." exit 1 else - echo " Everything is ok, checked ${updates} updates." + echo " Everything is OK, finished checking ${updates} updates." exit 0 fi diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql index 9599070a6a8..8ecf61f5461 100644 --- a/sql/base/characters_database.sql +++ b/sql/base/characters_database.sql @@ -2413,6 +2413,7 @@ DROP TABLE IF EXISTS `pvpstats_players`; CREATE TABLE `pvpstats_players` ( `battleground_id` bigint(20) unsigned NOT NULL, `character_guid` int(10) unsigned NOT NULL, + `winner` bit(1) NOT NULL, `score_killing_blows` mediumint(8) unsigned NOT NULL, `score_deaths` mediumint(8) unsigned NOT NULL, `score_honorable_kills` mediumint(8) unsigned NOT NULL, @@ -2510,7 +2511,7 @@ CREATE TABLE `updates` ( LOCK TABLES `updates` WRITE; /*!40000 ALTER TABLE `updates` DISABLE KEYS */; -INSERT INTO `updates` VALUES ('2015_03_20_00_characters.sql','B761760804EA73BD297F296C5C1919687DF7191C','ARCHIVED','2015-03-21 21:44:15',0),('2015_03_20_01_characters.sql','894F08B70449A5481FFAF394EE5571D7FC4D8A3A','ARCHIVED','2015-03-21 21:44:15',0),('2015_03_20_02_characters.sql','97D7BE0CAADC79F3F11B9FD296B8C6CD40FE593B','ARCHIVED','2015-03-21 21:44:51',0),('2015_06_26_00_characters_335.sql','C2CC6E50AFA1ACCBEBF77CC519AAEB09F3BBAEBC','ARCHIVED','2015-07-13 23:49:22',0),('2015_09_28_00_characters_335.sql','F8682A431D50E54BDC4AC0E7DBED21AE8AAB6AD4','ARCHIVED','2015-09-28 21:00:00',0),('2015_08_26_00_characters_335.sql','C7D6A3A00FECA3EBFF1E71744CA40D3076582374','ARCHIVED','2015-08-26 21:00:00',0),('2015_10_06_00_characters.sql', '16842FDD7E8547F2260D3312F53EFF8761EFAB35', 'ARCHIVED', '2015-10-06 16:06:38', 0),('2015_10_07_00_characters.sql','E15AB463CEBE321001D7BFDEA4B662FF618728FD','ARCHIVED','2015-10-07 23:32:00',0); +INSERT INTO `updates` VALUES ('2015_03_20_00_characters.sql','B761760804EA73BD297F296C5C1919687DF7191C','ARCHIVED','2015-03-21 21:44:15',0),('2015_03_20_01_characters.sql','894F08B70449A5481FFAF394EE5571D7FC4D8A3A','ARCHIVED','2015-03-21 21:44:15',0),('2015_03_20_02_characters.sql','97D7BE0CAADC79F3F11B9FD296B8C6CD40FE593B','ARCHIVED','2015-03-21 21:44:51',0),('2015_06_26_00_characters_335.sql','C2CC6E50AFA1ACCBEBF77CC519AAEB09F3BBAEBC','ARCHIVED','2015-07-13 23:49:22',0),('2015_09_28_00_characters_335.sql','F8682A431D50E54BDC4AC0E7DBED21AE8AAB6AD4','ARCHIVED','2015-09-28 21:00:00',0),('2015_08_26_00_characters_335.sql','C7D6A3A00FECA3EBFF1E71744CA40D3076582374','ARCHIVED','2015-08-26 21:00:00',0),('2015_10_06_00_characters.sql', '16842FDD7E8547F2260D3312F53EFF8761EFAB35', 'ARCHIVED', '2015-10-06 16:06:38', 0),('2015_10_07_00_characters.sql','E15AB463CEBE321001D7BFDEA4B662FF618728FD','ARCHIVED','2015-10-07 23:32:00',0),('2015_10_12_00_characters.sql','D6F9927BDED72AD0A81D6EC2C6500CBC34A39FA2','ARCHIVED','2015-10-12 15:35:47',0); /*!40000 ALTER TABLE `updates` ENABLE KEYS */; UNLOCK TABLES; diff --git a/sql/updates/characters/2015_10_12_00_characters.sql b/sql/updates/characters/2015_10_12_00_characters.sql new file mode 100644 index 00000000000..d7d4fb90f02 --- /dev/null +++ b/sql/updates/characters/2015_10_12_00_characters.sql @@ -0,0 +1,17 @@ +-- Add new winner field, bound to player +ALTER TABLE `pvpstats_players` + ADD COLUMN `winner` BIT(1) NOT NULL AFTER `character_guid`; + +-- Resolve horde players victories +UPDATE `pvpstats_players` SET `winner` = 1 WHERE `battleground_id` IN ( + SELECT `id` FROM `pvpstats_battlegrounds` WHERE `winner_faction` = 0 +) AND `character_guid` IN ( + SELECT `guid` FROM `characters` WHERE `race` IN (2, 5, 6, 8, 9, 10) +); + +-- Resolve alliance players victories +UPDATE `pvpstats_players` SET `winner` = 1 WHERE `battleground_id` IN ( + SELECT `id` FROM `pvpstats_battlegrounds` WHERE `winner_faction` = 1 +) AND `character_guid` IN ( + SELECT `guid` FROM `characters` WHERE `race` IN (1, 3, 4, 7, 11, 22) +); diff --git a/sql/updates/world/2015_10_08_01_world.sql b/sql/updates/world/2015_10_08_01_world.sql new file mode 100644 index 00000000000..6b162ee4393 --- /dev/null +++ b/sql/updates/world/2015_10_08_01_world.sql @@ -0,0 +1,2 @@ +-- +UPDATE `gameobject_template` SET `faction`=0 WHERE `entry`=177219; diff --git a/sql/updates/world/2015_10_10_00_world.sql b/sql/updates/world/2015_10_10_00_world.sql new file mode 100644 index 00000000000..c26303006b7 --- /dev/null +++ b/sql/updates/world/2015_10_10_00_world.sql @@ -0,0 +1,9 @@ +-- +UPDATE `creature_text` SET `probability`=20 WHERE `entry`=15954 AND `groupid`=2; + +DELETE FROM `creature_text` WHERE `entry`=15954 AND `groupid` in (4,5,6,7); +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`probability`,`BroadcastTextId`,`TextRange`,`comment`) VALUES +(15954,4,0,"%s summons forth Skeletal Warriors!",41,100,32974,3,"Noth EMOTE_SUMMON"), +(15954,5,0,"%s raises more skeletons!",41,100,32977,3,"Noth EMOTE_SUMMON_WAVE"), +(15954,6,0,"%s teleports to the balcony above!",41,100,32331,3,"Noth EMOTE_TELEPORT_1"), +(15954,7,0,"%s teleports back into the battle!",41,100,32976,3,"Noth EMOTE_TELEPORT_2"); diff --git a/sql/updates/world/2015_10_10_01_world.sql b/sql/updates/world/2015_10_10_01_world.sql new file mode 100644 index 00000000000..4088a33b837 --- /dev/null +++ b/sql/updates/world/2015_10_10_01_world.sql @@ -0,0 +1,7 @@ +-- +UPDATE `creature_text` SET `probability`=20 WHERE `entry`=15936 AND `groupid`=1; + +DELETE FROM `creature_text` WHERE `entry`=15936 AND `groupid` IN (4,5); +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`probability`,`BroadcastTextId`,`TextRange`,`comment`) VALUES +(15936,4,0,"%s teleports and begins to channel a spell!",41,100,32332,3,"Heigan EMOTE_DANCE"), +(15936,5,0,"%s rushes to attack once more!",41,100,32333,3,"Heigan EMOTE_DANCE_END"); diff --git a/sql/updates/world/2015_10_10_02_world.sql b/sql/updates/world/2015_10_10_02_world.sql new file mode 100644 index 00000000000..068255d4e0c --- /dev/null +++ b/sql/updates/world/2015_10_10_02_world.sql @@ -0,0 +1,12 @@ +-- +DELETE FROM `smart_scripts` WHERE `entryorguid`=16286 AND `source_type`=0; +UPDATE `creature_template` SET `AIName`="" WHERE `entry`=16286; + +DELETE FROM `spell_script_names` WHERE `spell_id` IN (29865,55053); +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(29865,"spell_loatheb_deathbloom"), +(55053,"spell_loatheb_deathbloom"); + +DELETE FROM `spelldifficulty_dbc` WHERE `id` IN (55594); +INSERT INTO `spelldifficulty_dbc` (`id`,`spellid0`,`spellid1`) VALUES +(55594,55594,55601); diff --git a/sql/updates/world/2015_10_10_03_world.sql b/sql/updates/world/2015_10_10_03_world.sql new file mode 100644 index 00000000000..57dc5a2f29b --- /dev/null +++ b/sql/updates/world/2015_10_10_03_world.sql @@ -0,0 +1,2 @@ +-- +UPDATE `locales_quest` SET `Title_loc2` = "Le nettoyage du camp des kobolds", `Title_loc3` = "Säuberung im Koboldlager", `Title_loc7` = "La Limpieza del Campamento Kóbold", `Title_loc8` = "Нападение на лагерь кобольдов" WHERE `Id` = 7; diff --git a/sql/updates/world/2015_10_10_04_world.sql b/sql/updates/world/2015_10_10_04_world.sql new file mode 100644 index 00000000000..b1bab808d96 --- /dev/null +++ b/sql/updates/world/2015_10_10_04_world.sql @@ -0,0 +1,2 @@ +-- +DELETE FROM `gossip_menu_option` WHERE `menu_id`=344 AND `id`=1; diff --git a/sql/updates/world/2015_10_10_05_world.sql b/sql/updates/world/2015_10_10_05_world.sql new file mode 100644 index 00000000000..5a552b76e64 --- /dev/null +++ b/sql/updates/world/2015_10_10_05_world.sql @@ -0,0 +1,4 @@ +DELETE FROM `trinity_string` WHERE `entry` IN (5057, 5058); +INSERT INTO `trinity_string` (`entry`, `content_default`, `content_loc1`, `content_loc2`, `content_loc3`, `content_loc4`, `content_loc5`, `content_loc6`, `content_loc7`, `content_loc8`) VALUES +(5057, 'Boss id %i state is now set to %i (%s).', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +(5058, 'Boss id %i state is %i (%s).', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); diff --git a/sql/updates/world/2015_10_11_00_world.sql b/sql/updates/world/2015_10_11_00_world.sql new file mode 100644 index 00000000000..dbad0438ed3 --- /dev/null +++ b/sql/updates/world/2015_10_11_00_world.sql @@ -0,0 +1,2 @@ +-- +DELETE FROM `spell_linked_spell` WHERE `spell_trigger` IN (29865,-29865,55053,-55053); diff --git a/sql/updates/world/2015_10_11_01_world.sql b/sql/updates/world/2015_10_11_01_world.sql new file mode 100644 index 00000000000..678e03a31e3 --- /dev/null +++ b/sql/updates/world/2015_10_11_01_world.sql @@ -0,0 +1,96 @@ +DROP TABLE IF EXISTS `skill_perfect_item_template`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `skill_perfect_item_template` ( + `spellId` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT 'SpellId of the item creation spell', + `requiredSpecialization` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT 'Specialization spell id', + `perfectCreateChance` float NOT NULL DEFAULT '0' COMMENT 'chance to create the perfect item instead', + `perfectItemType` mediumint(8) unsigned NOT NULL DEFAULT '0' COMMENT 'perfect item type to create instead', + PRIMARY KEY (`spellId`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Crafting Perfection System'; +/*!40101 SET character_set_client = @saved_cs_client */; + +LOCK TABLES `skill_perfect_item_template` WRITE; +/*!40000 ALTER TABLE `skill_perfect_item_template` DISABLE KEYS */; +INSERT INTO `skill_perfect_item_template` (`spellId`, `requiredSpecialization`, `perfectCreateChance`, `perfectItemType`) +VALUES +/* Bloodstone */ +(53831,55534,20,41432), -- Bold +(53835,55534,20,41433), -- Bright +(53832,55534,20,41434), -- Delicate +(53844,55534,20,41435), -- Flashing +(53845,55534,20,41436), -- Fractured +(54017,55534,20,41437), -- Precise +(53834,55534,20,41438), -- Runed +(53843,55534,20,41439), -- Subtle +/* Sun Crystal */ +(53852,55534,20,41444), -- Brilliant +(53857,55534,20,41445), -- Mystic +(53856,55534,20,41446), -- Quick +(53854,55534,20,41447), -- Rigid +(53853,55534,20,41448), -- Smooth +(53855,55534,20,41449), -- Thick +/* Chalcedony */ +(53941,55534,20,41440), -- Lustrous +(53934,55534,20,41441), -- Solid +(53940,55534,20,41442), -- Sparkling +(53943,55534,20,41443), -- Stormy +/* Dark Jade */ +(53926,55534,20,41463), -- Dazzling +(53918,55534,20,41464), -- Enduring +(53930,55534,20,41465), -- Energized +(53920,55534,20,41466), -- Forceful +(53925,55534,20,41467), -- Intricate +(53916,55534,20,41468), -- Jagged +(53928,55534,20,41469), -- Lambent +(53922,55534,20,41470), -- Misty +(53929,55534,20,41471), -- Opaque +(53931,55534,20,41472), -- Radiant +(53921,55534,20,41473), -- Seer's +(53933,55534,20,41474), -- Shattered +(53923,55534,20,41475), -- Shining +(53919,55534,20,41476), -- Steady +(53927,55534,20,41477), -- Sundered +(53932,55534,20,41478), -- Tense +(53894,55534,20,41479), -- Timeless +(53924,55534,20,41480), -- Turbid +(53917,55534,20,41481), -- Vivid +/* Huge Citrine */ +(53886,55534,20,41429), -- Wicked +(53892,55534,20,41482), -- Accurate +(53874,55534,20,41483), -- Champion's +(53877,55534,20,41484), -- Deadly +(53880,55534,20,41485), -- Deft +(53884,55534,20,41486), -- Durable +(53888,55534,20,41487), -- Empowered +(53873,55534,20,41488), -- Etched +(53876,55534,20,41489), -- Fierce +(53891,55534,20,41490), -- Glimmering +(53878,55534,20,41491), -- Glinting +(53872,55534,20,41492), -- Inscribed +(53879,55534,20,41493), -- Lucent +(53881,55534,20,41494), -- Luminous +(53882,55534,20,41495), -- Potent +(53887,55534,20,41496), -- Pristine +(53885,55534,20,41497), -- Reckless +(53893,55534,20,41498), -- Resolute +(53875,55534,20,41499), -- Resplendent +(53890,55534,20,41500), -- Stalwart +(53889,55534,20,41501), -- Stark +(53883,55534,20,41502), -- Veiled +/* Shadow Crystal */ +(53866,55534,20,41450), -- Balanced +(53869,55534,20,41451), -- Defender's +(53862,55534,20,41452), -- Glowing +(53871,55534,20,41453), -- Guardian's +(53867,55534,20,41454), -- Infused +(53865,55534,20,41455), -- Mysterious +(53870,55534,20,41456), -- Puissant +(53863,55534,20,41457), -- Purified +(53868,55534,20,41458), -- Regal +(53864,55534,20,41459), -- Royal +(53860,55534,20,41460), -- Shifting +(53859,55534,20,41461), -- Sovereign +(53861,55534,20,41462); -- Tenuous +/*!40000 ALTER TABLE `skill_perfect_item_template` ENABLE KEYS */; +UNLOCK TABLES; diff --git a/sql/updates/world/2015_10_11_02_world.sql b/sql/updates/world/2015_10_11_02_world.sql new file mode 100644 index 00000000000..0a9d014d762 --- /dev/null +++ b/sql/updates/world/2015_10_11_02_world.sql @@ -0,0 +1,20 @@ +-- Gameobject list for Molten Core +SET @OGUID := 56280; +DELETE FROM `gameobject` WHERE `guid` IN (43162,43163,43164,43165,35665); +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID AND @OGUID+14; +INSERT INTO `gameobject` (`guid`,`id`,`map`,`zoneId`,`areaId`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`rotation0`,`rotation1`,`rotation2`,`rotation3`,`spawntimesecs`,`animprogress`,`state`) VALUES +(@OGUID+0,176951,409,2717,0,1,1,601.6724,-1174.613,-196.0725,3.141593,0,0,-1,0,120,255,1), -- Rune of Koro +(@OGUID+1,176952,409,2717,0,1,1,748.8392,-985.1598,-178.2831,3.141593,0,0,-1,0,120,255,1), -- Rune of Zeth +(@OGUID+2,176953,409,2717,0,1,1,583.7003,-806.7377,-204.9614,3.141593,0,0,-1,0,120,255,1), -- Rune of Mazj +(@OGUID+3,176954,409,2717,0,1,1,795.5356,-974.2527,-207.7883,3.141593,0,0,-1,0,120,255,1), -- Rune of Theri +(@OGUID+4,176955,409,2717,0,1,1,694.2289,-495.5984,-214.3294,3.141593,0,0,-1,0,120,255,1), -- Rune of Blaz +(@OGUID+5,176956,409,2717,0,1,1,1132.106,-1017.273,-186.4936,3.141593,0,0,-1,0,120,255,1), -- Rune of Kress +(@OGUID+6,176957,409,2717,0,1,1,897.0577,-551.5464,-203.9534,3.141593,0,0,-1,0,120,255,1), -- Rune of Mohn +(@OGUID+7,177000,409,2717,0,1,1,736.6626,-1176.569,-119.7984,3.141593,0,0,-1,0,120,255,1), -- Hot Coal +(@OGUID+8,178187,409,2717,0,1,1,601.6724,-1174.613,-196.0725,3.141593,0,0,-1,0,120,255,1), -- Molten Core Circle SULFURON +(@OGUID+9,178188,409,2717,0,1,1,748.8392,-985.1598,-178.2831,3.141593,0,0,-1,0,120,255,1), -- Molten Core Circle BARON +(@OGUID+10,178189,409,2717,0,1,1,583.7003,-806.7377,-204.9614,3.141593,0,0,-1,0,120,255,1), -- Molten Core Circle SHAZZRAH +(@OGUID+11,178190,409,2717,0,1,1,795.5356,-974.2527,-207.7883,3.141593,0,0,-1,0,120,255,1), -- Molten Core Circle GOLEMAGG +(@OGUID+12,178191,409,2717,0,1,1,694.2289,-495.5984,-214.3294,3.141593,0,0,-1,0,120,255,1), -- Molten Core Circle GARR +(@OGUID+13,178192,409,2717,0,1,1,1132.106,-1017.273,-186.4936,3.141593,0,0,-1,0,120,255,1), -- Molten Core Circle MAGMADAR +(@OGUID+14,178193,409,2717,0,1,1,897.0577,-551.5464,-203.9534,3.141593,0,0,-1,0,120,255,1); -- Molten Core Circle GEHENNAS diff --git a/sql/updates/world/2015_10_11_03_world.sql b/sql/updates/world/2015_10_11_03_world.sql new file mode 100644 index 00000000000..16306b08235 --- /dev/null +++ b/sql/updates/world/2015_10_11_03_world.sql @@ -0,0 +1,786 @@ +-- Add missing Firesworn spawn +SET @CGUID := 16399; +DELETE FROM `creature` WHERE `guid`=@CGUID; +INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `MovementType`) VALUES +(@CGUID, 12099, 409, 1, 1, 698.831, -507.815, -214.691, 1.832596, 7200, 0, 0); + +-- Garr movement/formation fixup +UPDATE `creature` SET `spawndist`=10,`MovementType`=1 WHERE `guid`=56609; +DELETE FROM `creature_formations` WHERE `leaderGUID` IN (56609); +INSERT INTO `creature_formations` (`leaderGUID`,`memberGUID`,`dist`,`angle`,`groupAI`,`point_1`,`point_2`) VALUES +(56609,56609,0,0,2,0,0), +(56609,56610,10,45,2,0,0), +(56609,56616,10,90,2,0,0), +(56609,56619,10,135,2,0,0), +(56609,56620,10,180,2,0,0), +(56609,56622,10,225,2,0,0), +(56609,56626,10,270,2,0,0), +(56609,56628,10,315,2,0,0), +(56609,@CGUID,10,360,2,0,0); + +-- Pathing for Core Hound Entry: 11673 'TDB FORMAT' +SET @NPC := 56742; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=619.3152,`position_y`=-1131.169,`position_z`=-201.6246 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '18950'); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,619.3152,-1131.169,-201.6246,0,0,0,0,100,0), +(@PATH,2,635.5156,-1094.704,-196.7484,0,0,0,0,100,0), +(@PATH,3,637.1269,-1060.913,-199.2417,0,0,0,0,100,0), +(@PATH,4,635.5156,-1094.704,-196.7484,0,0,0,0,100,0), +(@PATH,5,619.3152,-1131.169,-201.6246,0,0,0,0,100,0), +(@PATH,6,610.0372,-1155.73,-198.8285,0,0,0,0,100,0); + +-- Pathing for Core Hound Entry: 11673 'TDB FORMAT' +SET @NPC := 56743; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=1039.667,`position_y`=-791.0968,`position_z`=-151.0096 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '18950'); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,1039.667,-791.0968,-151.0096,0,0,0,0,100,0), +(@PATH,2,1026.315,-767.8003,-156.6493,0,0,0,0,100,0), +(@PATH,3,1038.774,-761.6977,-152.658,0,0,0,0,100,0), +(@PATH,4,1064.627,-748.9409,-151.7516,0,0,0,0,100,0), +(@PATH,5,1038.774,-761.6977,-152.658,0,0,0,0,100,0), +(@PATH,6,1026.315,-767.8003,-156.6493,0,0,0,0,100,0), +(@PATH,7,1039.641,-791.0518,-150.9892,0,0,0,0,100,0), +(@PATH,8,1051.314,-799.6896,-151.9713,0,0,0,0,100,0), +(@PATH,9,1040.764,-815.1115,-152.1656,0,0,0,0,100,0), +(@PATH,10,1051.314,-799.6896,-151.9713,0,0,0,0,100,0); + +-- Pathing for Core Hound Entry: 11673 'TDB FORMAT' +SET @NPC := 56744; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=862.4832,`position_y`=-1025.388,`position_z`=-193.7729 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '18950'); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,862.4832,-1025.388,-193.7729,0,0,0,0,100,0), +(@PATH,2,837.9779,-1005.705,-203.4326,0,0,0,0,100,0), +(@PATH,3,811.0497,-995.4718,-207.7699,0,0,0,0,100,0), +(@PATH,4,837.9779,-1005.705,-203.4326,0,0,0,0,100,0), +(@PATH,5,862.4832,-1025.388,-193.7729,0,0,0,0,100,0), +(@PATH,6,867.8922,-1050.318,-187.0417,0,0,0,0,100,0), +(@PATH,7,872.7313,-1072.91,-180.5435,0,0,0,0,100,0), +(@PATH,8,866.1934,-1092.763,-172.8487,0,0,0,0,100,0), +(@PATH,9,852.0717,-1110.005,-164.8026,0,0,0,0,100,0), +(@PATH,10,839.597,-1126.927,-156.889,0,0,0,0,100,0), +(@PATH,11,809.0994,-1147.87,-152.4792,0,0,0,0,100,0), +(@PATH,12,797.6674,-1151.59,-151.2095,0,0,0,0,100,0), +(@PATH,13,786.1231,-1142.027,-149.5751,0,0,0,0,100,0), +(@PATH,14,751.8342,-1124.252,-144.3583,0,0,0,0,100,0), +(@PATH,15,726.2703,-1123.733,-140.4308,0,0,0,0,100,0), +(@PATH,16,705.0751,-1129.982,-137.4043,0,0,0,0,100,0), +(@PATH,17,688.8096,-1145.377,-132.6487,0,0,0,0,100,0), +(@PATH,18,681.356,-1157.213,-129.4221,0,0,0,0,100,0), +(@PATH,19,678.912,-1171.258,-124.9925,0,0,0,0,100,0), +(@PATH,20,687.782,-1186.916,-122.3317,0,0,0,0,100,0), +(@PATH,21,702.4774,-1195.069,-120.2255,0,0,0,0,100,0), +(@PATH,22,687.7936,-1186.922,-122.3323,0,0,0,0,100,0), +(@PATH,23,678.912,-1171.258,-124.9925,0,0,0,0,100,0), +(@PATH,24,681.356,-1157.213,-129.4221,0,0,0,0,100,0), +(@PATH,25,688.8096,-1145.377,-132.6487,0,0,0,0,100,0), +(@PATH,26,705.0751,-1129.982,-137.4043,0,0,0,0,100,0), +(@PATH,27,726.2703,-1123.733,-140.4308,0,0,0,0,100,0), +(@PATH,28,751.8342,-1124.252,-144.3583,0,0,0,0,100,0), +(@PATH,29,786.1231,-1142.027,-149.5751,0,0,0,0,100,0), +(@PATH,30,797.6674,-1151.59,-151.2095,0,0,0,0,100,0), +(@PATH,31,809.0994,-1147.87,-152.4792,0,0,0,0,100,0), +(@PATH,32,839.597,-1126.927,-156.889,0,0,0,0,100,0), +(@PATH,33,852.0717,-1110.005,-164.8026,0,0,0,0,100,0), +(@PATH,34,866.1934,-1092.763,-172.8487,0,0,0,0,100,0), +(@PATH,35,872.7313,-1072.91,-180.5435,0,0,0,0,100,0), +(@PATH,36,867.8922,-1050.318,-187.0417,0,0,0,0,100,0); + +-- Pathing for Core Hound Entry: 11673 'TDB FORMAT' +SET @NPC := 56745; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=820.8864,`position_y`=-1133.536,`position_z`=-153.9561 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '18950'); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,820.8864,-1133.536,-153.9561,0,0,0,0,100,0), +(@PATH,2,811.4623,-1112.419,-155.1721,0,0,0,0,100,0), +(@PATH,3,791.674,-1098.377,-157.4893,0,0,0,0,100,0), +(@PATH,4,756.4903,-1086.385,-165.0273,0,0,0,0,100,0), +(@PATH,5,713.1385,-1077.042,-178.4627,0,0,0,0,100,0), +(@PATH,6,666.2255,-1071.984,-188.5744,0,0,0,0,100,0), +(@PATH,7,713.1385,-1077.042,-178.4627,0,0,0,0,100,0), +(@PATH,8,756.4903,-1086.385,-165.0273,0,0,0,0,100,0), +(@PATH,9,791.674,-1098.377,-157.4893,0,0,0,0,100,0), +(@PATH,10,811.4623,-1112.419,-155.1721,0,0,0,0,100,0), +(@PATH,11,820.8864,-1133.536,-153.9561,0,0,0,0,100,0), +(@PATH,12,807.4134,-1143.589,-152.2109,0,0,0,0,100,0), +(@PATH,13,788.3813,-1136.843,-150.0572,0,0,0,0,100,0), +(@PATH,14,774.8284,-1122.117,-148.7992,0,0,0,0,100,0), +(@PATH,15,753.0598,-1112.579,-145.9724,0,0,0,0,100,0), +(@PATH,16,723.3937,-1111.516,-142.1575,0,0,0,0,100,0), +(@PATH,17,692.8207,-1125.591,-137.05,0,0,0,0,100,0), +(@PATH,18,670.802,-1153.978,-128.2815,0,0,0,0,100,0), +(@PATH,19,669.009,-1180.974,-123.0805,0,0,0,0,100,0), +(@PATH,20,670.802,-1153.978,-128.2815,0,0,0,0,100,0), +(@PATH,21,692.8207,-1125.591,-137.05,0,0,0,0,100,0), +(@PATH,22,723.3937,-1111.516,-142.1575,0,0,0,0,100,0), +(@PATH,23,753.0598,-1112.579,-145.9724,0,0,0,0,100,0), +(@PATH,24,774.8284,-1122.117,-148.7992,0,0,0,0,100,0), +(@PATH,25,788.3813,-1136.843,-150.0572,0,0,0,0,100,0), +(@PATH,26,807.4134,-1143.589,-152.2109,0,0,0,0,100,0); + +-- Pathing for Core Hound Entry: 11673 'TDB FORMAT' +SET @NPC := 56746; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=706.5988,`position_y`=-608.756,`position_z`=-209.7862 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '18950'); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,706.5988,-608.756,-209.7862,0,0,0,0,100,0), +(@PATH,2,694.3823,-643.1285,-209.7859,0,0,0,0,100,0), +(@PATH,3,691.9941,-667.7454,-209.6549,0,0,0,0,100,0), +(@PATH,4,712.6238,-699.4688,-209.7263,0,0,0,0,100,0), +(@PATH,5,696.8894,-727.3798,-209.4279,0,0,0,0,100,0), +(@PATH,6,672.7046,-770.8894,-209.0702,0,0,0,0,100,0), +(@PATH,7,696.8894,-727.3798,-209.4279,0,0,0,0,100,0), +(@PATH,8,712.6238,-699.4688,-209.7263,0,0,0,0,100,0), +(@PATH,9,691.9941,-667.7454,-209.6549,0,0,0,0,100,0), +(@PATH,10,694.3823,-643.1285,-209.7859,0,0,0,0,100,0); + +-- Pathing for Core Hound Entry: 11673 'TDB FORMAT' +SET @NPC := 56667; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=716.2954,`position_y`=-563.1713,`position_z`=-215.2122 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '18950'); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,716.2954,-563.1713,-215.2122,0,0,0,0,100,0), +(@PATH,2,730.72,-541.2038,-216.5207,0,0,0,0,100,0), +(@PATH,3,751.7352,-537.1676,-215.0087,0,0,0,0,100,0), +(@PATH,4,782.8221,-568.6121,-213.2396,0,0,0,0,100,0), +(@PATH,5,826.4692,-557.4173,-206.1204,0,0,0,0,100,0), +(@PATH,6,862.7628,-559.3347,-203.8248,0,0,0,0,100,0), +(@PATH,7,897.3094,-575.2031,-203.7624,0,0,0,0,100,0), +(@PATH,8,928.274,-599.9254,-203.4944,0,0,0,0,100,0), +(@PATH,9,976.9997,-588.0521,-203.566,0,0,0,0,100,0), +(@PATH,10,1013.348,-611.7108,-198.8222,0,0,0,0,100,0), +(@PATH,11,1031.784,-628.6943,-189.8679,0,0,0,0,100,0), +(@PATH,12,1054.582,-638.4258,-174.0191,0,0,0,0,100,0), +(@PATH,13,1082.93,-658.8265,-159.5947,0,0,0,0,100,0), +(@PATH,14,1102.016,-688.0265,-153.0321,0,0,0,0,100,0), +(@PATH,15,1095.611,-709.971,-151.2729,0,0,0,0,100,0), +(@PATH,16,1102.016,-688.0265,-153.0321,0,0,0,0,100,0), +(@PATH,17,1082.93,-658.8265,-159.5947,0,0,0,0,100,0), +(@PATH,18,1054.582,-638.4258,-174.0191,0,0,0,0,100,0), +(@PATH,19,1031.784,-628.6943,-189.8679,0,0,0,0,100,0), +(@PATH,20,1013.348,-611.7108,-198.8222,0,0,0,0,100,0), +(@PATH,21,976.9997,-588.0521,-203.566,0,0,0,0,100,0), +(@PATH,22,928.274,-599.9254,-203.4944,0,0,0,0,100,0), +(@PATH,23,897.3094,-575.2031,-203.7624,0,0,0,0,100,0), +(@PATH,24,862.7628,-559.3347,-203.8248,0,0,0,0,100,0), +(@PATH,25,826.4692,-557.4173,-206.1204,0,0,0,0,100,0), +(@PATH,26,782.8221,-568.6121,-213.2396,0,0,0,0,100,0), +(@PATH,27,751.7352,-537.1676,-215.0087,0,0,0,0,100,0), +(@PATH,28,730.72,-541.2038,-216.5207,0,0,0,0,100,0), +(@PATH,29,716.2954,-563.1713,-215.2122,0,0,0,0,100,0), +(@PATH,30,710.9113,-588.9549,-211.3497,0,0,0,0,100,0); + +-- Pathing for Core Hound Entry: 11673 'TDB FORMAT' +SET @NPC := 56668; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=746.1315,`position_y`=-1006.086,`position_z`=-177.4375 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '18950'); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,746.1315,-1006.086,-177.4375,0,0,0,0,100,0), +(@PATH,2,733.2838,-1027.083,-177.5541,0,0,0,0,100,0), +(@PATH,3,695.6022,-1035.41,-182.9091,0,0,0,0,100,0), +(@PATH,4,652.9347,-1047.064,-195.1933,0,0,0,0,100,0), +(@PATH,5,695.6022,-1035.41,-182.9091,0,0,0,0,100,0), +(@PATH,6,733.2838,-1027.083,-177.5541,0,0,0,0,100,0); + +-- Pathing for Core Hound Entry: 11673 'TDB FORMAT' +SET @NPC := 56669; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=819.1058,`position_y`=-631.4754,`position_z`=-202.4386 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '18950'); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,819.1058,-631.4754,-202.4386,0,0,0,0,100,0), +(@PATH,2,842.2988,-620.2899,-203.6502,0,0,0,0,100,0), +(@PATH,3,863.2007,-606.6663,-201.9657,0,0,0,0,100,0), +(@PATH,4,880.7169,-589.9871,-203.5187,0,0,0,0,100,0), +(@PATH,5,891.5865,-563.1656,-204.1768,0,0,0,0,100,0), +(@PATH,6,880.7169,-589.9871,-203.5187,0,0,0,0,100,0), +(@PATH,7,863.2007,-606.6663,-201.9657,0,0,0,0,100,0), +(@PATH,8,842.2988,-620.2899,-203.6502,0,0,0,0,100,0), +(@PATH,9,819.1058,-631.4754,-202.4386,0,0,0,0,100,0), +(@PATH,10,801.1528,-637.2293,-203.2919,0,0,0,0,100,0); + +-- Pathing for Core Hound Entry: 11673 'TDB FORMAT' +SET @NPC := 56670; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=640.3456,`position_y`=-838.7157,`position_z`=-208.4006 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '18950'); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,640.3456,-838.7157,-208.4006,0,0,0,0,100,0), +(@PATH,2,606.3914,-839.9142,-207.404,0,0,0,0,100,0), +(@PATH,3,580.7532,-839.1719,-206.0227,0,0,0,0,100,0), +(@PATH,4,571.1739,-823.5732,-206.9356,0,0,0,0,100,0), +(@PATH,5,568.275,-805.6725,-206.7511,0,0,0,0,100,0), +(@PATH,6,574.7719,-784.4373,-207.1243,0,0,0,0,100,0), +(@PATH,7,568.275,-805.6725,-206.7511,0,0,0,0,100,0), +(@PATH,8,571.1739,-823.5732,-206.9356,0,0,0,0,100,0), +(@PATH,9,580.7532,-839.1719,-206.0227,0,0,0,0,100,0), +(@PATH,10,606.3914,-839.9142,-207.404,0,0,0,0,100,0); + +-- Pathing for Core Hound Entry: 11673 'TDB FORMAT' +SET @NPC := 56671; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=693.7902,`position_y`=-895.4052,`position_z`=-199.3317 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '18950'); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,693.7902,-895.4052,-199.3317,0,0,0,0,100,0), +(@PATH,2,676.3041,-859.0721,-207.3966,0,0,0,0,100,0), +(@PATH,3,660.5331,-846.3304,-208.582,0,0,0,0,100,0), +(@PATH,4,676.3041,-859.0721,-207.3966,0,0,0,0,100,0), +(@PATH,5,693.7902,-895.4052,-199.3317,0,0,0,0,100,0), +(@PATH,6,709.7253,-933.0809,-191.2163,0,0,0,0,100,0); + +-- Pathing for Core Hound Entry: 11673 'TDB FORMAT' +SET @NPC := 56672; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=708.7521,`position_y`=-494.4869,`position_z`=-213.9441 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '18950'); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,708.7521,-494.4869,-213.9441,0,0,0,0,100,0), +(@PATH,2,706.8069,-515.2225,-215.4603,0,0,0,0,100,0), +(@PATH,3,695.7981,-526.2382,-214.3069,0,0,0,0,100,0), +(@PATH,4,671.7322,-532.863,-210.5322,0,0,0,0,100,0), +(@PATH,5,695.7981,-526.2382,-214.3069,0,0,0,0,100,0), +(@PATH,6,706.8069,-515.2225,-215.4603,0,0,0,0,100,0), +(@PATH,7,708.7521,-494.4869,-213.9441,0,0,0,0,100,0), +(@PATH,8,706.4074,-474.3789,-211.1673,0,0,0,0,100,0); + +-- Pathing for Core Hound Entry: 11673 'TDB FORMAT' +SET @NPC := 56673; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=723.8314,`position_y`=-518.3099,`position_z`=-217.6104 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '18950'); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,723.8314,-518.3099,-217.6104,0,0,0,0,100,0), +(@PATH,2,706.7125,-535.8472,-216.7189,0,0,0,0,100,0), +(@PATH,3,685.7861,-543.6451,-211.2004,0,0,0,0,100,0), +(@PATH,4,667.6307,-538.1242,-209.9916,0,0,0,0,100,0), +(@PATH,5,685.7861,-543.6451,-211.2004,0,0,0,0,100,0), +(@PATH,6,706.7125,-535.8472,-216.7189,0,0,0,0,100,0), +(@PATH,7,723.8314,-518.3099,-217.6104,0,0,0,0,100,0), +(@PATH,8,728.2719,-487.4919,-212.95,0,0,0,0,100,0); + +-- Pathing for Core Hound Entry: 11673 'TDB FORMAT' +SET @NPC := 56674; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=831.386,`position_y`=-627.8932,`position_z`=-203.1487 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '18950'); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,831.386,-627.8932,-203.1487,0,0,0,0,100,0), +(@PATH,2,856.4564,-617.9056,-202.1571,0,0,0,0,100,0), +(@PATH,3,899.6118,-613.5433,-202.2377,0,0,0,0,100,0), +(@PATH,4,936.2535,-612.5002,-203.6217,0,0,0,0,100,0), +(@PATH,5,975.1815,-641.0467,-201.5775,0,0,0,0,100,0), +(@PATH,6,1002.311,-661.9902,-194.1922,0,0,0,0,100,0), +(@PATH,7,1024.067,-684.3118,-173.4296,0,0,0,0,100,0), +(@PATH,8,1042.016,-695.8206,-163.7581,0,0,0,0,100,0), +(@PATH,9,1058.163,-706.0782,-156.6107,0,0,0,0,100,0), +(@PATH,10,1068.566,-742.8318,-151.7328,0,0,0,0,100,0), +(@PATH,11,1117.097,-744.479,-145.6289,0,0,0,0,100,0), +(@PATH,12,1149.458,-726.4506,-133.8044,0,0,0,0,100,0), +(@PATH,13,1175.513,-702.1757,-130.9873,0,0,0,0,100,0), +(@PATH,14,1200.504,-670.9343,-128.5453,0,0,0,0,100,0), +(@PATH,15,1202.953,-639.3985,-126.1688,0,0,0,0,100,0), +(@PATH,16,1188.303,-614.0296,-121.8816,0,0,0,0,100,0), +(@PATH,17,1164.196,-595.4036,-115.7764,0,0,0,0,100,0), +(@PATH,18,1155.213,-574.8707,-113.3766,0,0,0,0,100,0), +(@PATH,19,1164.196,-595.4036,-115.7764,0,0,0,0,100,0), +(@PATH,20,1188.303,-614.0296,-121.8816,0,0,0,0,100,0), +(@PATH,21,1202.953,-639.3985,-126.1688,0,0,0,0,100,0), +(@PATH,22,1200.504,-670.9343,-128.5453,0,0,0,0,100,0), +(@PATH,23,1175.589,-702.0806,-130.9749,0,0,0,0,100,0), +(@PATH,24,1149.458,-726.4506,-133.8044,0,0,0,0,100,0), +(@PATH,25,1117.097,-744.479,-145.6289,0,0,0,0,100,0), +(@PATH,26,1068.566,-742.8318,-151.7328,0,0,0,0,100,0), +(@PATH,27,1058.163,-706.0782,-156.6107,0,0,0,0,100,0), +(@PATH,28,1042.016,-695.8206,-163.7581,0,0,0,0,100,0), +(@PATH,29,1024.226,-684.4753,-173.2943,0,0,0,0,100,0), +(@PATH,30,1002.311,-661.9902,-194.1922,0,0,0,0,100,0), +(@PATH,31,975.1815,-641.0467,-201.5775,0,0,0,0,100,0), +(@PATH,32,936.2535,-612.5002,-203.6217,0,0,0,0,100,0), +(@PATH,33,899.6118,-613.5433,-202.2377,0,0,0,0,100,0), +(@PATH,34,856.4564,-617.9056,-202.1571,0,0,0,0,100,0), +(@PATH,35,831.386,-627.8932,-203.1487,0,0,0,0,100,0), +(@PATH,36,816.5816,-641.0675,-203.8891,0,0,0,0,100,0); + +-- Pathing for Core Hound Entry: 11673 'TDB FORMAT' +SET @NPC := 56675; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=1144.05,`position_y`=-662.6844,`position_z`=-131.4626 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '18950'); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,1144.05,-662.6844,-131.4626,0,0,0,0,100,0), +(@PATH,2,1160.286,-696.8795,-132.4863,0,0,0,0,100,0), +(@PATH,3,1129.031,-721.049,-139.5804,0,0,0,0,100,0), +(@PATH,4,1118.512,-712.1383,-144.2585,0,0,0,0,100,0), +(@PATH,5,1104.687,-722.1303,-146.9832,0,0,0,0,100,0), +(@PATH,6,1090.824,-731.3634,-149.9868,0,0,0,0,100,0), +(@PATH,7,1070.791,-717.5623,-153.4831,0,0,0,0,100,0), +(@PATH,8,1080.754,-681.5721,-159.8726,0,0,0,0,100,0), +(@PATH,9,1081.626,-681.3043,-159.6755,0,12000,0,0,100,0), +(@PATH,10,1079.369,-678.5401,-160.8983,0,10000,0,0,100,0), +(@PATH,11,1081.374,-680.3018,-159.9551,0,1000,0,0,100,0), +(@PATH,12,1080.824,-681.4283,-159.8819,0,2000,0,0,100,0), +(@PATH,13,1081.491,-679.0739,-160.1742,0,1000,0,0,100,0), +(@PATH,14,1079.343,-678.3975,-160.9352,0,5000,0,0,100,0), +(@PATH,15,1081.436,-676.3215,-160.7577,0,8000,0,0,100,0), +(@PATH,16,1080.754,-681.5721,-159.8726,0,1000,0,0,100,0), +(@PATH,17,1077.228,-678.6388,-161.4971,0,1000,0,0,100,0), +(@PATH,18,1077.687,-678.7886,-161.3334,0,1000,0,0,100,0), +(@PATH,19,1079.716,-679.3854,-160.6235,0,10000,0,0,100,0), +(@PATH,20,1081.338,-682.8629,-159.4373,0,10000,0,0,100,0), +(@PATH,21,1079.463,-680.3129,-160.5056,0,1000,0,0,100,0), +(@PATH,22,1080.754,-681.5721,-159.8726,0,1000,0,0,100,0), +(@PATH,23,1080.708,-679.2873,-160.3567,0,1000,0,0,100,0), +(@PATH,24,1082.191,-681.9566,-159.3777,0,9000,0,0,100,0), +(@PATH,25,1079.69,-678.5046,-160.8126,0,8000,0,0,100,0), +(@PATH,26,1080.177,-679.1766,-160.5332,0,1000,0,0,100,0), +(@PATH,27,1078.341,-677.3896,-161.4327,0,9000,0,0,100,0), +(@PATH,28,1079.791,-676.366,-161.2243,0,1000,0,0,100,0), +(@PATH,29,1078.341,-677.3896,-161.4327,0,1000,0,0,100,0), +(@PATH,30,1081.163,-683.5833,-159.3395,0,7000,0,0,100,0), +(@PATH,31,1080.636,-682.1011,-159.7975,0,1000,0,0,100,0), +(@PATH,32,1081.985,-678.5395,-160.1417,0,2000,0,0,100,0), +(@PATH,33,1081.526,-679.8784,-159.9983,0,1000,0,0,100,0), +(@PATH,34,1080.778,-681.3652,-159.9082,0,1000,0,0,100,0), +(@PATH,35,1079.221,-677.4147,-161.1729,0,1000,0,0,100,0), +(@PATH,36,1079.501,-678.1235,-160.946,0,2000,0,0,100,0), +(@PATH,37,1080.827,-681.6636,-159.8325,0,6000,0,0,100,0), +(@PATH,38,1085.063,-680.338,-158.8806,0,8000,0,0,100,0), +(@PATH,39,1079.092,-677.261,-161.242,0,1000,0,0,100,0), +(@PATH,40,1079.541,-677.6991,-161.0217,0,1000,0,0,100,0), +(@PATH,41,1081.284,-682.4361,-159.5412,0,2000,0,0,100,0), +(@PATH,42,1080.757,-681.0048,-159.9885,0,1000,0,0,100,0), +(@PATH,43,1083.066,-680.2807,-159.4699,0,6000,0,0,100,0), +(@PATH,44,1081.552,-677.1035,-160.5629,0,1000,0,0,100,0), +(@PATH,45,1081.611,-680.4688,-159.852,0,11000,0,0,100,0), +(@PATH,46,1080.048,-679.4224,-160.5198,0,7000,0,0,100,0), +(@PATH,47,1082.761,-681.9189,-159.2203,0,11000,0,0,100,0), +(@PATH,48,1078.952,-678.8635,-160.9521,0,8000,0,0,100,0), +(@PATH,49,1081.18,-681.5133,-159.7614,0,1000,0,0,100,0), +(@PATH,50,1080.676,-681.3997,-159.9307,0,11000,0,0,100,0), +(@PATH,51,1078.617,-679.6107,-160.8951,0,1000,0,0,100,0), +(@PATH,52,1081.279,-680.4371,-159.9548,0,1000,0,0,100,0), +(@PATH,53,1078.764,-677.3422,-161.3203,0,1000,0,0,100,0), +(@PATH,54,1080.66,-681.4279,-159.9294,0,2000,0,0,100,0), +(@PATH,55,1080.101,-708.452,-154.2289,0,1000,0,0,100,0), +(@PATH,56,1084.528,-731.8951,-151.0118,0,0,0,0,100,0), +(@PATH,57,1093.696,-748.0836,-149.2619,0,0,0,0,100,0), +(@PATH,58,1110.641,-738.1426,-146.5005,0,0,0,0,100,0), +(@PATH,59,1115.694,-716.585,-144.6347,0,0,0,0,100,0), +(@PATH,60,1148.22,-713.5815,-132.988,0,0,0,0,100,0), +(@PATH,61,1161.699,-694.4932,-132.2003,0,0,0,0,100,0), +(@PATH,62,1149.113,-669.7729,-130.3396,0,0,0,0,100,0), +(@PATH,63,1142.684,-647.411,-131.9233,0,0,0,0,100,0), +(@PATH,64,1142.684,-647.411,-131.9233,1.53589,60000,0,0,100,0); + +-- Pathing for Core Hound Entry: 11673 'TDB FORMAT' +SET @NPC := 56676; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=820.1378,`position_y`=-991.096,`position_z`=-207.1345 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '18950'); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,820.1378,-991.096,-207.1345,0,0,0,0,100,0), +(@PATH,2,815.0589,-979.8468,-208.6176,0,0,0,0,100,0), +(@PATH,3,820.1378,-991.096,-207.1345,0,0,0,0,100,0), +(@PATH,4,837.5117,-1001.866,-203.9284,0,0,0,0,100,0), +(@PATH,5,875.2714,-1009.17,-195.7951,0,0,0,0,100,0), +(@PATH,6,884.1406,-1024.13,-192.9333,0,0,0,0,100,0), +(@PATH,7,875.2714,-1009.17,-195.7951,0,0,0,0,100,0), +(@PATH,8,837.5117,-1001.866,-203.9284,0,0,0,0,100,0); + +-- Pathing for Baron Geddon Entry: 12056 'TDB FORMAT' +SET @NPC := 56655; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=747.5466,`position_y`=-981.676,`position_z`=-178.401 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,747.5466,-981.676,-178.401,0,0,1,0,100,0), +(@PATH,2,739.986,-953.2151,-185.7548,0,0,1,0,100,0), +(@PATH,3,716.3201,-910.8809,-193.1546,0,0,1,0,100,0), +(@PATH,4,701.403,-887.8356,-199.5063,0,0,1,0,100,0), +(@PATH,5,675.8235,-847.7932,-208.2585,0,0,1,0,100,0), +(@PATH,6,639.0753,-830.6404,-208.4202,0,0,1,0,100,0), +(@PATH,7,611.1107,-828.0424,-207.401,0,0,1,0,100,0), +(@PATH,8,591.2252,-811.5459,-205.4029,0,0,1,0,100,0), +(@PATH,9,608.8426,-787.6771,-207.4771,0,0,1,0,100,0), +(@PATH,10,643.6417,-778.0462,-208.7169,0,0,1,0,100,0), +(@PATH,11,664.3234,-786.412,-208.9517,0,0,1,0,100,0), +(@PATH,12,661.6707,-816.6882,-208.705,0,0,1,0,100,0), +(@PATH,13,678.5975,-847.099,-208.2891,0,0,1,0,100,0), +(@PATH,14,699.6382,-878.082,-201.5386,0,0,1,0,100,0), +(@PATH,15,718.3248,-907.4992,-193.3159,0,0,1,0,100,0), +(@PATH,16,740.3997,-949.3792,-186.3494,0,0,1,0,100,0), +(@PATH,17,746.6027,-966.5585,-181.5636,0,0,1,0,100,0); + +-- Pathing for Shazzrah Entry: 12264 'TDB FORMAT' +SET @NPC := 56608; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=587.3033,`position_y`=-801.9748,`position_z`=-205.1575 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,587.3033,-801.9748,-205.1575,0,0,0,0,100,0), +(@PATH,2,588.8104,-806.2665,-205.0612,0,0,0,0,100,0), +(@PATH,3,587.384,-811.3304,-205.1067,0,0,0,0,100,0), +(@PATH,4,583.1524,-811.6958,-205.1573,0,0,0,0,100,0), +(@PATH,5,579.2105,-806.6736,-205.2536,0,0,0,0,100,0), +(@PATH,6,579.0768,-804.3456,-205.2396,0,0,0,0,100,0), +(@PATH,7,580.0167,-800.6034,-205.4058,0,0,0,0,100,0), +(@PATH,8,583.49,-799.7552,-205.3562,0,0,0,0,100,0); + +-- Pathing for Lucifron Entry: 12118 'TDB FORMAT' +SET @NPC := 56605; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=1037.022,`position_y`=-986.3419,`position_z`=-181.5163 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,1037.022,-986.3419,-181.5163,0,0,0,0,100,0), +(@PATH,2,1053.15,-990.7546,-182.6615,0,0,0,0,100,0), +(@PATH,3,1070.411,-1006.765,-185.5444,0,0,0,0,100,0), +(@PATH,4,1053.299,-990.8936,-182.7192,0,0,0,0,100,0), +(@PATH,5,1037.022,-986.3419,-181.5163,0,0,0,0,100,0), +(@PATH,6,1014.705,-978.6508,-181.182,0,0,0,0,100,0), +(@PATH,7,1007.782,-958.0884,-180.174,0,0,0,0,100,0), +(@PATH,8,1000.203,-955.4069,-179.5825,0,0,0,0,100,0), +(@PATH,9,1007.782,-958.0884,-180.174,0,0,0,0,100,0), +(@PATH,10,1014.45,-978.5632,-181.1854,0,0,0,0,100,0); +-- Lucifron formation fixup +DELETE FROM `creature_formations` WHERE `leaderGUID` IN (56605); +INSERT INTO `creature_formations` (`leaderGUID`,`memberGUID`,`dist`,`angle`,`groupAI`,`point_1`,`point_2`) VALUES +(56605,56605,0,0,2,0,0), +(56605,56606,4,90,2,3,8), +(56605,56607,4,270,2,3,8); +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=1035.672,`position_y`=-989.7419,`position_z`=-181.7763 WHERE `guid`=56606; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=1038.512,`position_y`=-982.9519,`position_z`=-181.2578 WHERE `guid`=56607; +DELETE FROM `waypoint_data` WHERE `id` IN (566060,566070); + +-- Pathing for Lava Surger Entry: 12101 'TDB FORMAT' +SET @NPC := 56656; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=1028.491,`position_y`=-908.0417,`position_z`=-161.3687 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,1028.491,-908.0417,-161.3687,0,0,1,0,100,0), +(@PATH,2,1041.238,-888.9818,-158.3343,0,0,1,0,100,0), +(@PATH,3,1061.057,-900.0848,-159.2599,0,0,1,0,100,0), +(@PATH,4,1071.243,-893.1624,-156.4947,0,0,1,0,100,0), +(@PATH,5,1041.238,-888.9818,-158.3343,0,0,1,0,100,0), +(@PATH,6,1028.491,-908.0417,-161.3687,0,0,1,0,100,0), +(@PATH,7,1008.565,-890.0919,-165.3463,0,0,1,0,100,0), +(@PATH,8,980.3823,-904.361,-171.1376,0,0,1,0,100,0), +(@PATH,9,966.753,-899.8453,-175.7252,0,0,1,0,100,0), +(@PATH,10,957.4196,-885.538,-173.7588,0,0,1,0,100,0), +(@PATH,11,980.3823,-904.361,-171.1376,0,0,1,0,100,0), +(@PATH,12,1008.565,-890.0919,-165.3463,0,0,1,0,100,0); + +-- Pathing for Lava Surger Entry: 12101 'TDB FORMAT' +SET @NPC := 56657; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=748.5151,`position_y`=-725.4263,`position_z`=-211.9395 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,748.5151,-725.4263,-211.9395,0,0,1,0,100,0), +(@PATH,2,739.7422,-763.3509,-218.9724,0,0,1,0,100,0), +(@PATH,3,737.3899,-809.9995,-225.6305,0,0,1,0,100,0), +(@PATH,4,745.2436,-850.8501,-223.6281,0,0,1,0,100,0), +(@PATH,5,737.3899,-809.9995,-225.6305,0,0,1,0,100,0), +(@PATH,6,739.7422,-763.3509,-218.9724,0,0,1,0,100,0), +(@PATH,7,748.5151,-725.4263,-211.9395,0,0,1,0,100,0), +(@PATH,8,764.8676,-686.4996,-212.5972,0,0,1,0,100,0); + +-- Pathing for Lava Surger Entry: 12101 'TDB FORMAT' +SET @NPC := 56658; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=975.5094,`position_y`=-589.3787,`position_z`=-203.781 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,975.5094,-589.3787,-203.781,0,0,1,0,100,0), +(@PATH,2,958.4057,-595.7327,-203.9931,0,0,1,0,100,0), +(@PATH,3,950.7159,-608.6719,-202.882,0,0,1,0,100,0), +(@PATH,4,957.0149,-625.9316,-203.259,0,0,1,0,100,0), +(@PATH,5,980.0177,-632.2986,-203.5142,0,0,1,0,100,0), +(@PATH,6,990.2437,-625.777,-200.7675,0,0,1,0,100,0), +(@PATH,7,998.6928,-609.5692,-202.0619,0,0,1,0,100,0), +(@PATH,8,989.8893,-595.9269,-203.2261,0,0,1,0,100,0); + +-- Pathing for Lava Surger Entry: 12101 'TDB FORMAT' +SET @NPC := 56659; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=864.6398,`position_y`=-983.1211,`position_z`=-199.6699 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,864.6398,-983.1211,-199.6699,0,0,1,0,100,0), +(@PATH,2,875.8871,-1014.841,-194.9043,0,0,1,0,100,0), +(@PATH,3,891.3988,-1050.081,-187.1399,0,0,1,0,100,0), +(@PATH,4,891.1622,-1067.062,-182.6621,0,0,1,0,100,0), +(@PATH,5,883.1496,-1090.733,-176.0342,0,0,1,0,100,0), +(@PATH,6,870.0406,-1110.407,-169.6678,0,0,1,0,100,0), +(@PATH,7,855.7172,-1121.873,-161.9807,0,0,1,0,100,0), +(@PATH,8,839.0113,-1128.492,-156.5452,0,0,1,0,100,0), +(@PATH,9,819.8719,-1143.5,-153.6145,0,0,1,0,100,0), +(@PATH,10,809.326,-1150.683,-152.5631,0,0,1,0,100,0), +(@PATH,11,791.812,-1152.45,-150.4214,0,0,1,0,100,0), +(@PATH,12,787.2233,-1123.192,-150.5524,0,0,1,0,100,0), +(@PATH,13,757.2313,-1129.672,-145.1273,0,0,1,0,100,0), +(@PATH,14,723.393,-1106.211,-143.0938,0,0,1,0,100,0), +(@PATH,15,701.5763,-1137.426,-135.6903,0,0,1,0,100,0), +(@PATH,16,666.1591,-1162.693,-126.0165,0,0,1,0,100,0), +(@PATH,17,693.4008,-1186.742,-120.9137,0,0,1,0,100,0), +(@PATH,18,717.1637,-1193.438,-118.9491,0,0,1,0,100,0), +(@PATH,19,736.2715,-1211.634,-118.8998,0,0,1,0,100,0), +(@PATH,20,759.3818,-1228.879,-119.2757,0,0,1,0,100,0), +(@PATH,21,736.2715,-1211.634,-118.8998,0,0,1,0,100,0), +(@PATH,22,717.1637,-1193.438,-118.9491,0,0,1,0,100,0), +(@PATH,23,693.4008,-1186.742,-120.9137,0,0,1,0,100,0), +(@PATH,24,666.1591,-1162.693,-126.0165,0,0,1,0,100,0), +(@PATH,25,701.5763,-1137.426,-135.6903,0,0,1,0,100,0), +(@PATH,26,723.393,-1106.211,-143.0938,0,0,1,0,100,0), +(@PATH,27,757.2313,-1129.672,-145.1273,0,0,1,0,100,0), +(@PATH,28,787.2233,-1123.192,-150.5524,0,0,1,0,100,0), +(@PATH,29,791.812,-1152.45,-150.4214,0,0,1,0,100,0), +(@PATH,30,809.326,-1150.683,-152.5631,0,0,1,0,100,0), +(@PATH,31,819.8719,-1143.5,-153.6145,0,0,1,0,100,0), +(@PATH,32,839.0113,-1128.492,-156.5452,0,0,1,0,100,0), +(@PATH,33,855.7172,-1121.873,-161.9807,0,0,1,0,100,0), +(@PATH,34,870.0406,-1110.407,-169.6678,0,0,1,0,100,0), +(@PATH,35,883.1496,-1090.733,-176.0342,0,0,1,0,100,0), +(@PATH,36,891.1622,-1067.062,-182.6621,0,0,1,0,100,0), +(@PATH,37,891.3988,-1050.081,-187.1399,0,0,1,0,100,0), +(@PATH,38,875.8871,-1014.841,-194.9043,0,0,1,0,100,0), +(@PATH,39,864.6398,-983.1211,-199.6699,0,0,1,0,100,0); + +-- Pathing for Lava Surger Entry: 12101 'TDB FORMAT' +SET @NPC := 56660; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=912.38,`position_y`=-812.9961,`position_z`=-227.3731 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,912.38,-812.9961,-227.3731,0,0,1,0,100,0), +(@PATH,2,917.8469,-848.5494,-219.4701,0,0,1,0,100,0), +(@PATH,3,913.7874,-875.5369,-214.22,0,0,1,0,100,0), +(@PATH,4,890.5936,-905.0054,-222.0683,0,0,1,0,100,0), +(@PATH,5,860.6026,-921.1229,-225.7609,0,0,1,0,100,0), +(@PATH,6,816.981,-920.8954,-225.8454,0,0,1,0,100,0), +(@PATH,7,782.662,-911.1868,-222.6471,0,0,1,0,100,0), +(@PATH,8,816.9766,-920.8942,-225.8542,0,0,1,0,100,0), +(@PATH,9,860.6026,-921.1229,-225.7609,0,0,1,0,100,0), +(@PATH,10,890.5936,-905.0054,-222.0683,0,0,1,0,100,0), +(@PATH,11,913.7874,-875.5369,-214.22,0,0,1,0,100,0), +(@PATH,12,917.8469,-848.5494,-219.4701,0,0,1,0,100,0), +(@PATH,13,912.38,-812.9961,-227.3731,0,0,1,0,100,0), +(@PATH,14,909.2687,-788.947,-226.9377,0,0,1,0,100,0), +(@PATH,15,895.7159,-764.4568,-224.3548,0,0,1,0,100,0), +(@PATH,16,879.3519,-761.3517,-224.0491,0,0,1,0,100,0), +(@PATH,17,865.0396,-765.1099,-224.75,0,0,1,0,100,0), +(@PATH,18,884.0205,-803.6951,-226.6926,0,0,1,0,100,0), +(@PATH,19,889.6862,-825.1835,-227.3351,0,0,1,0,100,0), +(@PATH,20,865.6118,-779.7151,-225.9819,0,0,1,0,100,0), +(@PATH,21,865.0396,-765.1099,-224.75,0,0,1,0,100,0), +(@PATH,22,879.3519,-761.3517,-224.0491,0,0,1,0,100,0), +(@PATH,23,895.7159,-764.4568,-224.3548,0,0,1,0,100,0), +(@PATH,24,909.2687,-788.947,-226.9377,0,0,1,0,100,0); + +-- Pathing for Lava Surger Entry: 12101 'TDB FORMAT' +SET @NPC := 56661; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=1031.916,`position_y`=-889.574,`position_z`=-160.0134 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,1031.916,-889.574,-160.0134,0,0,1,0,100,0), +(@PATH,2,1069.734,-893.855,-156.7931,0,0,1,0,100,0), +(@PATH,3,1031.916,-889.574,-160.0134,0,0,1,0,100,0), +(@PATH,4,996.8139,-897.9012,-168.1947,0,0,1,0,100,0), +(@PATH,5,962.845,-884.6795,-173.6825,0,0,1,0,100,0), +(@PATH,6,987.062,-893.2951,-169.7379,0,0,1,0,100,0), +(@PATH,7,1001.684,-886.9771,-167.0547,0,0,1,0,100,0), +(@PATH,8,1008.282,-863.9785,-164.7876,0,0,1,0,100,0), +(@PATH,9,987.062,-893.2951,-169.7379,0,0,1,0,100,0), +(@PATH,10,962.845,-884.6795,-173.6825,0,0,1,0,100,0), +(@PATH,11,996.8139,-897.9012,-168.1947,0,0,1,0,100,0); + +-- Pathing for Lava Surger Entry: 12101 'TDB FORMAT' +SET @NPC := 56662; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=1068.962,`position_y`=-696.559,`position_z`=-157.781 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,1068.962,-696.559,-157.781,0,0,1,0,100,0), +(@PATH,2,1053.966,-737.0459,-151.7794,0,0,1,0,100,0), +(@PATH,3,1059.624,-760.5685,-151.586,0,0,1,0,100,0), +(@PATH,4,1084.683,-739.8831,-150.7728,0,0,1,0,100,0), +(@PATH,5,1099.292,-778.5201,-151.1692,0,0,1,0,100,0), +(@PATH,6,1125.305,-739.6833,-142.7612,0,0,1,0,100,0), +(@PATH,7,1159.508,-719.2535,-133.2384,0,0,1,0,100,0), +(@PATH,8,1192.168,-686.1762,-128.7967,0,0,1,0,100,0), +(@PATH,9,1211.332,-653.7628,-127.9139,0,0,1,0,100,0), +(@PATH,10,1187.516,-611.0389,-121.1588,0,0,1,0,100,0), +(@PATH,11,1148.847,-599.9906,-114.898,0,0,1,0,100,0), +(@PATH,12,1187.516,-611.0389,-121.1588,0,0,1,0,100,0), +(@PATH,13,1211.332,-653.7628,-127.9139,0,0,1,0,100,0), +(@PATH,14,1192.168,-686.1762,-128.7967,0,0,1,0,100,0), +(@PATH,15,1159.508,-719.2535,-133.2384,0,0,1,0,100,0), +(@PATH,16,1125.392,-739.6312,-142.7302,0,0,1,0,100,0), +(@PATH,17,1099.292,-778.5201,-151.1692,0,0,1,0,100,0), +(@PATH,18,1084.683,-739.8831,-150.7728,0,0,1,0,100,0), +(@PATH,19,1059.654,-760.5442,-151.592,0,0,1,0,100,0), +(@PATH,20,1053.966,-737.0459,-151.7794,0,0,1,0,100,0), +(@PATH,21,1068.962,-696.559,-157.781,0,0,1,0,100,0), +(@PATH,22,1046.413,-674.9515,-169.5157,0,0,1,0,100,0), +(@PATH,23,1023.84,-646.451,-189.8513,0,0,1,0,100,0), +(@PATH,24,1046.413,-674.9515,-169.5157,0,0,1,0,100,0); + +-- Pathing for Lava Surger Entry: 12101 'TDB FORMAT' +SET @NPC := 56664; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=759.9225,`position_y`=-689.7131,`position_z`=-212.5623 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,759.9225,-689.7131,-212.5623,0,0,1,0,100,0), +(@PATH,2,779.0322,-680.1849,-213.9095,0,0,1,0,100,0), +(@PATH,3,800.4368,-665.5578,-208.9407,0,0,1,0,100,0), +(@PATH,4,807.4164,-656.269,-206.1155,0,0,1,0,100,0), +(@PATH,5,779.0322,-680.1849,-213.9095,0,0,1,0,100,0), +(@PATH,6,759.9225,-689.7131,-212.5623,0,0,1,0,100,0), +(@PATH,7,753.9745,-704.1632,-211.753,0,0,1,0,100,0), +(@PATH,8,758.8966,-684.4725,-212.381,0,0,1,0,100,0), +(@PATH,9,780.8896,-669.565,-211.4591,0,0,1,0,100,0), +(@PATH,10,791.4582,-652.981,-207.6324,0,0,1,0,100,0), +(@PATH,11,758.8966,-684.4725,-212.381,0,0,1,0,100,0), +(@PATH,12,753.9745,-704.1632,-211.753,0,0,1,0,100,0); + +-- Pathing for Lava Surger Entry: 12101 'TDB FORMAT' +SET @NPC := 56665; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=1035.173,`position_y`=-854.7958,`position_z`=-158.8589 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,1035.173,-854.7958,-158.8589,0,0,1,0,100,0), +(@PATH,2,1057.385,-862.5274,-159.6177,0,0,1,0,100,0), +(@PATH,3,995.0676,-853.4235,-165.4317,0,0,1,0,100,0); + +-- Pathing for Lava Surger Entry: 12101 'TDB FORMAT' +SET @NPC := 56740; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=667.9337,`position_y`=-1066.047,`position_z`=-188.3889 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,667.9337,-1066.047,-188.3889,0,0,1,0,100,0), +(@PATH,2,619.8726,-1066.64,-199.7958,0,0,1,0,100,0), +(@PATH,3,613.3337,-1099.887,-198.7582,0,0,1,0,100,0), +(@PATH,4,591.3667,-1135.207,-200.2088,0,0,1,0,100,0), +(@PATH,5,578.8029,-1173.733,-194.7558,0,0,1,0,100,0), +(@PATH,6,591.5503,-1192.438,-195.7943,0,0,1,0,100,0), +(@PATH,7,608.195,-1194.054,-195.7651,0,0,1,0,100,0), +(@PATH,8,623.8442,-1186.21,-195.8348,0,0,1,0,100,0), +(@PATH,9,628.4896,-1171.869,-194.5435,0,0,1,0,100,0), +(@PATH,10,628.3709,-1151.011,-197.0152,0,0,1,0,100,0), +(@PATH,11,626.806,-1131.724,-200.8709,0,0,1,0,100,0), +(@PATH,12,645.6395,-1106.676,-196.4797,0,0,1,0,100,0); + +-- Pathing for Lava Surger Entry: 12101 'TDB FORMAT' +SET @NPC := 56741; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=1055.823,`position_y`=-833.2653,`position_z`=-154.468 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,1055.823,-833.2653,-154.468,0,0,0,0,100,0), +(@PATH,2,1032.143,-826.1788,-154.2626,0,0,0,0,100,0), +(@PATH,3,1015.666,-808.7546,-148.7213,0,0,0,0,100,0), +(@PATH,4,1032.143,-826.1788,-154.2626,0,0,0,0,100,0); + +-- Pathing for Lava Surger Entry: 12101 'TDB FORMAT' +SET @NPC := 56789; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=679.1953,`position_y`=-847.3836,`position_z`=-208.2482 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,679.1953,-847.3836,-208.2482,0,0,1,0,100,0), +(@PATH,2,676.7046,-829.8509,-208.8353,0,0,1,0,100,0), +(@PATH,3,665.002,-813.2372,-208.774,0,0,1,0,100,0), +(@PATH,4,681.6021,-776.7833,-209.1657,0,0,1,0,100,0), +(@PATH,5,686.1985,-738.5436,-209.2948,0,0,1,0,100,0), +(@PATH,6,707.9111,-711.0708,-209.5187,0,0,1,0,100,0), +(@PATH,7,708.2624,-692.8405,-209.5718,0,0,1,0,100,0), +(@PATH,8,690.2739,-662.6287,-209.6574,0,0,1,0,100,0), +(@PATH,9,708.2625,-692.8368,-209.5175,0,0,1,0,100,0), +(@PATH,10,707.9111,-711.0708,-209.5187,0,0,1,0,100,0), +(@PATH,11,686.1985,-738.5436,-209.2948,0,0,1,0,100,0), +(@PATH,12,681.6021,-776.7833,-209.1657,0,0,1,0,100,0), +(@PATH,13,665.002,-813.2372,-208.774,0,0,1,0,100,0), +(@PATH,14,676.7046,-829.8509,-208.8353,0,0,1,0,100,0), +(@PATH,15,679.1953,-847.3836,-208.2482,0,0,1,0,100,0), +(@PATH,16,696.5482,-855.4606,-206.0954,0,0,1,0,100,0), +(@PATH,17,710.7119,-882.6242,-198.953,0,0,1,0,100,0), +(@PATH,18,714.8118,-907.6405,-193.7685,0,0,1,0,100,0), +(@PATH,19,735.3042,-937.3447,-188.4066,0,0,1,0,100,0), +(@PATH,20,714.8118,-907.6405,-193.7685,0,0,1,0,100,0), +(@PATH,21,710.7119,-882.6242,-198.953,0,0,1,0,100,0), +(@PATH,22,697.0541,-866.1818,-204.0854,0,0,1,0,100,0); diff --git a/sql/updates/world/2015_10_11_04_world.sql b/sql/updates/world/2015_10_11_04_world.sql new file mode 100644 index 00000000000..17664992c98 --- /dev/null +++ b/sql/updates/world/2015_10_11_04_world.sql @@ -0,0 +1,2 @@ +-- Lothos Riftwaker SAI Spell fix +UPDATE `smart_scripts` SET `action_param2`=2 WHERE `entryorguid`=14387; diff --git a/sql/updates/world/2015_10_12_00_world.sql b/sql/updates/world/2015_10_12_00_world.sql new file mode 100644 index 00000000000..d169863a95b --- /dev/null +++ b/sql/updates/world/2015_10_12_00_world.sql @@ -0,0 +1,16 @@ +-- +DELETE FROM `gameobject` WHERE `guid` IN (5514,5515,5516,5517,5518,5519,5520,5521,5522,5523,5524,5525,5526,5527,5528); +INSERT INTO `gameobject` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `VerifiedBuild`) VALUES +(5514, 191517, 571, 0, 0, 1, 1, 6255.64, -1185.84, 425.924, 2.12057, 0, 0, 0, 1, 300, 100, 1, 0), +(5515, 1732, 0, 0, 0, 1, 1, -9255, -2735, 89.702, 0.436, 0, 0, 0.216439, 0.976296, 900, 100, 1, 0), +(5516, 1732, 0, 0, 0, 1, 1, -3149, -3275, 63.632, 0.262, 0, 0, 0, 0, 900, 100, 1, 0), +(5518, 1732, 0, 0, 0, 1, 1, -9853.86, 1406.45, 38.028, 1.826, 0, 0, 0.95848, 0.285161, 900, 100, 1, 0), +(5519, 1732, 0, 0, 0, 1, 1, -9835.8, 1394.81, 38.405, 0.106, 0, 0, 0, 0, 900, 100, 1, 0), +(5520, 1732, 0, 0, 0, 1, 1, -9854.17, 1391.69, 38.7294, 3.244, 0, 0, 0, 0, 900, 100, 1, 0), +(5522, 1732, 1, 0, 0, 1, 1, -1521, 1964.46, 67.374, 1.85, 0, 0, 0.798635, 0.601815, 900, 100, 1, 0), +(5523, 1732, 0, 0, 0, 1, 1, -9847.12, 1399.89, 37.1306, 3.397, 0, 0, 0.95848, 0.285161, 900, 100, 1, 0), +(5524, 1732, 0, 0, 0, 1, 1, -1123, -1277, 66.215, 3.817, 0, 0, 0.943491, -0.331398, 900, 100, 1, 0), +(5525, 1732, 1, 0, 0, 1, 1, 2508.13, -1446, 172.044, -2, 0, 0, 0, 0, 900, 100, 1, 0), +(5526, 2054, 0, 0, 0, 1, 1, -8850, -1905, 125.96, 4.143, 0, 0, 0, 0, 900, 100, 1, 0), +(5527, 1732, 0, 0, 0, 1, 1, -9828, 1415.7, 37.242, 2.663, 0, 0, 0, 0, 900, 100, 1, 0), +(5528, 1732, 0, 0, 0, 1, 1, -9843, 1386.87, 39.012, 4.783, 0, 0, 0, 0, 900, 100, 1, 0); diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index 14e7571dd42..b41ba41bcff 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -603,7 +603,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() // PvPstats PrepareStatement(CHAR_SEL_PVPSTATS_MAXID, "SELECT MAX(id) FROM pvpstats_battlegrounds", CONNECTION_SYNCH); PrepareStatement(CHAR_INS_PVPSTATS_BATTLEGROUND, "INSERT INTO pvpstats_battlegrounds (id, winner_faction, bracket_id, type, date) VALUES (?, ?, ?, ?, NOW())", CONNECTION_ASYNC); - PrepareStatement(CHAR_INS_PVPSTATS_PLAYER, "INSERT INTO pvpstats_players (battleground_id, character_guid, score_killing_blows, score_deaths, score_honorable_kills, score_bonus_honor, score_damage_done, score_healing_done, attr_1, attr_2, attr_3, attr_4, attr_5) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_INS_PVPSTATS_PLAYER, "INSERT INTO pvpstats_players (battleground_id, character_guid, winner, score_killing_blows, score_deaths, score_honorable_kills, score_bonus_honor, score_damage_done, score_healing_done, attr_1, attr_2, attr_3, attr_4, attr_5) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_PVPSTATS_FACTIONS_OVERALL, "SELECT winner_faction, COUNT(*) AS count FROM pvpstats_battlegrounds WHERE DATEDIFF(NOW(), date) < 7 GROUP BY winner_faction ORDER BY winner_faction ASC", CONNECTION_SYNCH); // QuestTracker diff --git a/src/server/game/AI/CoreAI/UnitAI.cpp b/src/server/game/AI/CoreAI/UnitAI.cpp index 5aa6ea8ea7a..f0d9d34db69 100644 --- a/src/server/game/AI/CoreAI/UnitAI.cpp +++ b/src/server/game/AI/CoreAI/UnitAI.cpp @@ -29,7 +29,15 @@ void UnitAI::AttackStart(Unit* victim) { if (victim && me->Attack(victim, true)) + { + // Clear distracted state on attacking + if (me->HasUnitState(UNIT_STATE_DISTRACTED)) + { + me->ClearUnitState(UNIT_STATE_DISTRACTED); + me->GetMotionMaster()->Clear(); + } me->GetMotionMaster()->MoveChase(victim); + } } void UnitAI::AttackStartCaster(Unit* victim, float dist) diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp index 8e2a82dbfd3..7b145268d22 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp @@ -470,6 +470,7 @@ void BossAI::_Reset() if (!me->IsAlive()) return; + me->SetCombatPulseDelay(0); me->ResetLootMode(); events.Reset(); summons.DespawnAll(); @@ -500,6 +501,7 @@ void BossAI::_EnterCombat() instance->SetBossState(_bossId, IN_PROGRESS); } + me->SetCombatPulseDelay(5); me->setActive(true); DoZoneInCombat(); ScheduleTasks(); diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index 46122697094..46cf934356d 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -453,45 +453,15 @@ void SmartAI::MoveInLineOfSight(Unit* who) GetScript()->OnMoveInLineOfSight(who); - if (me->HasReactState(REACT_PASSIVE) || AssistPlayerInCombat(who)) + if (AssistPlayerInCombat(who)) return; - if (!CanAIAttack(who)) - return; - - if (!me->CanStartAttack(who, false)) - return; - - if (me->IsHostileTo(who)) - { - float fAttackRadius = me->GetAttackDistance(who); - if (me->IsWithinDistInMap(who, fAttackRadius) && me->IsWithinLOSInMap(who)) - { - if (!me->GetVictim()) - { - // Clear distracted state on combat - if (me->HasUnitState(UNIT_STATE_DISTRACTED)) - { - me->ClearUnitState(UNIT_STATE_DISTRACTED); - me->GetMotionMaster()->Clear(); - } - - AttackStart(who); - } - else/* if (me->GetMap()->IsDungeon())*/ - { - who->SetInCombatWith(me); - me->AddThreat(who, 0.0f); - } - } - } + CreatureAI::MoveInLineOfSight(who); } bool SmartAI::CanAIAttack(const Unit* /*who*/) const { - if (me->GetReactState() == REACT_PASSIVE) - return false; - return true; + return !(me->HasReactState(REACT_PASSIVE)); } bool SmartAI::AssistPlayerInCombat(Unit* who) diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 09597443827..0e44925cd57 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -784,19 +784,20 @@ void Battleground::EndBattleground(uint32 winner) stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_PVPSTATS_PLAYER); BattlegroundScoreMap::const_iterator score = PlayerScores.find(player->GetGUID().GetCounter()); - stmt->setUInt32(0, battlegroundId); - stmt->setUInt32(1, player->GetGUID().GetCounter()); - stmt->setUInt32(2, score->second->GetKillingBlows()); - stmt->setUInt32(3, score->second->GetDeaths()); - stmt->setUInt32(4, score->second->GetHonorableKills()); - stmt->setUInt32(5, score->second->GetBonusHonor()); - stmt->setUInt32(6, score->second->GetDamageDone()); - stmt->setUInt32(7, score->second->GetHealingDone()); - stmt->setUInt32(8, score->second->GetAttr1()); - stmt->setUInt32(9, score->second->GetAttr2()); - stmt->setUInt32(10, score->second->GetAttr3()); - stmt->setUInt32(11, score->second->GetAttr4()); - stmt->setUInt32(12, score->second->GetAttr5()); + stmt->setUInt32(0, battlegroundId); + stmt->setUInt32(1, player->GetGUID().GetCounter()); + stmt->setBool (2, team == winner); + stmt->setUInt32(3, score->second->GetKillingBlows()); + stmt->setUInt32(4, score->second->GetDeaths()); + stmt->setUInt32(5, score->second->GetHonorableKills()); + stmt->setUInt32(6, score->second->GetBonusHonor()); + stmt->setUInt32(7, score->second->GetDamageDone()); + stmt->setUInt32(8, score->second->GetHealingDone()); + stmt->setUInt32(9, score->second->GetAttr1()); + stmt->setUInt32(10, score->second->GetAttr2()); + stmt->setUInt32(11, score->second->GetAttr3()); + stmt->setUInt32(12, score->second->GetAttr4()); + stmt->setUInt32(13, score->second->GetAttr5()); CharacterDatabase.Execute(stmt); } diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 7fe3628f893..c8a258ad386 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -138,7 +138,7 @@ bool ForcedDespawnDelayEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/) Creature::Creature(bool isWorldObject): Unit(isWorldObject), MapObject(), m_groupLootTimer(0), lootingGroupLowGUID(0), m_PlayerDamageReq(0), m_lootRecipient(), m_lootRecipientGroup(0), _skinner(), _pickpocketLootRestore(0), m_corpseRemoveTime(0), m_respawnTime(0), -m_respawnDelay(300), m_corpseDelay(60), m_respawnradius(0.0f), m_reactState(REACT_AGGRESSIVE), +m_respawnDelay(300), m_corpseDelay(60), m_respawnradius(0.0f), m_combatPulseTime(0), m_combatPulseDelay(0), m_reactState(REACT_AGGRESSIVE), m_defaultMovementType(IDLE_MOTION_TYPE), m_spawnId(0), m_equipmentId(0), m_originalEquipmentId(0), m_AlreadyCallAssistance(false), m_AlreadySearchedAssistance(false), m_regenHealth(true), m_AI_locked(false), m_meleeDamageSchoolMask(SPELL_SCHOOL_MASK_NORMAL), m_originalEntry(0), m_homePosition(), m_transportHomePosition(), m_creatureInfo(NULL), m_creatureData(NULL), m_waypointID(0), m_path_id(0), m_formation(NULL) @@ -539,10 +539,44 @@ void Creature::Update(uint32 diff) LastCharmerGUID.Clear(); } + // if periodic combat pulse is enabled and we are both in combat and in a dungeon, do this now + if (m_combatPulseDelay > 0 && IsInCombat() && GetMap()->IsDungeon()) + { + if (diff > m_combatPulseTime) + m_combatPulseTime = 0; + else + m_combatPulseTime -= diff; + + if (m_combatPulseTime == 0) + { + Map::PlayerList const &players = GetMap()->GetPlayers(); + if (!players.isEmpty()) + for (Map::PlayerList::const_iterator it = players.begin(); it != players.end(); ++it) + { + if (Player* player = it->GetSource()) + { + if (player->IsGameMaster()) + continue; + + if (player->IsAlive() && this->IsHostileTo(player)) + { + if (CanHaveThreatList()) + AddThreat(player, 0.0f); + this->SetInCombatWith(player); + player->SetInCombatWith(this); + } + } + } + + m_combatPulseTime = m_combatPulseDelay * IN_MILLISECONDS; + } + } + if (!IsInEvadeMode() && IsAIEnabled) { // do not allow the AI to be changed during update m_AI_locked = true; + i_AI->UpdateAI(diff); m_AI_locked = false; } diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 3e381063772..79832b70f52 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -601,6 +601,14 @@ class Creature : public Unit, public GridObject<Creature>, public MapObject float GetRespawnRadius() const { return m_respawnradius; } void SetRespawnRadius(float dist) { m_respawnradius = dist; } + uint32 GetCombatPulseDelay() const { return m_combatPulseDelay; } + void SetCombatPulseDelay(uint32 delay) // (secs) interval at which the creature pulses the entire zone into combat (only works in dungeons) + { + m_combatPulseDelay = delay; + if (m_combatPulseTime == 0 || m_combatPulseTime > delay) + m_combatPulseTime = delay; + } + uint32 m_groupLootTimer; // (msecs)timer used for group loot uint32 lootingGroupLowGUID; // used to find group which is looting corpse @@ -686,6 +694,8 @@ class Creature : public Unit, public GridObject<Creature>, public MapObject uint32 m_respawnDelay; // (secs) delay between corpse disappearance and respawning uint32 m_corpseDelay; // (secs) delay between death and corpse disappearance float m_respawnradius; + uint32 m_combatPulseTime; // (msecs) remaining time for next zone-in-combat pulse + uint32 m_combatPulseDelay; // (secs) how often the creature puts the entire zone in combat (only works in dungeons) ReactStates m_reactState; // for AI, not charmInfo void RegenerateMana(); diff --git a/src/server/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp index 0293901c9e3..8ecf86680ca 100644 --- a/src/server/game/Handlers/AuctionHouseHandler.cpp +++ b/src/server/game/Handlers/AuctionHouseHandler.cpp @@ -265,6 +265,8 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) if (!auctioneerData) { TC_LOG_ERROR("misc", "Data for auctioneer not found (%s)", auctioneer.ToString().c_str()); + SendAuctionCommandResult(0, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); + delete AH; return; } @@ -272,6 +274,8 @@ void WorldSession::HandleAuctionSellItem(WorldPacket& recvData) if (!auctioneerInfo) { TC_LOG_ERROR("misc", "Non existing auctioneer (%s)", auctioneer.ToString().c_str()); + SendAuctionCommandResult(0, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); + delete AH; return; } diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp index 5d44f3ec696..a8cf42ea49e 100644 --- a/src/server/game/Instances/InstanceScript.cpp +++ b/src/server/game/Instances/InstanceScript.cpp @@ -652,3 +652,25 @@ void InstanceScript::UpdateEncounterState(EncounterCreditType type, uint32 credi } } } + +std::string InstanceScript::GetBossStateName(uint8 state) +{ + // See enum EncounterState in InstanceScript.h + switch (state) + { + case NOT_STARTED: + return "NOT_STARTED"; + case IN_PROGRESS: + return "IN_PROGRESS"; + case FAIL: + return "FAIL"; + case DONE: + return "DONE"; + case SPECIAL: + return "SPECIAL"; + case TO_BE_DECIDED: + return "TO_BE_DECIDED"; + default: + return "INVALID"; + } +} diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h index e832d7cdffe..93dafea0413 100644 --- a/src/server/game/Instances/InstanceScript.h +++ b/src/server/game/Instances/InstanceScript.h @@ -220,6 +220,7 @@ class InstanceScript : public ZoneScript virtual bool SetBossState(uint32 id, EncounterState state); EncounterState GetBossState(uint32 id) const { return id < bosses.size() ? bosses[id].state : TO_BE_DECIDED; } + static std::string GetBossStateName(uint8 state); BossBoundaryMap const* GetBossBoundary(uint32 id) const { return id < bosses.size() ? &bosses[id].boundary : NULL; } // Achievement criteria additional requirements check diff --git a/src/server/game/Skills/SkillExtraItems.cpp b/src/server/game/Skills/SkillExtraItems.cpp index 8df9ce86f9a..2c9a2a7bcfd 100644 --- a/src/server/game/Skills/SkillExtraItems.cpp +++ b/src/server/game/Skills/SkillExtraItems.cpp @@ -20,11 +20,98 @@ #include "DatabaseEnv.h" #include "Log.h" #include "Player.h" +#include "ObjectMgr.h" #include <map> // some type definitions // no use putting them in the header file, they're only used in this .cpp +// struct to store information about perfection procs +// one entry per spell +struct SkillPerfectItemEntry +{ + // the spell id of the spell required - it's named "specialization" to conform with SkillExtraItemEntry + uint32 requiredSpecialization; + // perfection proc chance + float perfectCreateChance; + // itemid of the resulting perfect item + uint32 perfectItemType; + + SkillPerfectItemEntry() + : requiredSpecialization(0), perfectCreateChance(0.0f), perfectItemType(0) { } + SkillPerfectItemEntry(uint32 rS, float pCC, uint32 pIT) + : requiredSpecialization(rS), perfectCreateChance(pCC), perfectItemType(pIT) { } +}; + +// map to store perfection info. key = spellId of the creation spell, value is the perfectitementry as specified above +typedef std::map<uint32, SkillPerfectItemEntry> SkillPerfectItemMap; + +SkillPerfectItemMap SkillPerfectItemStore; + +// loads the perfection proc info from DB +void LoadSkillPerfectItemTable() +{ + uint32 oldMSTime = getMSTime(); + + SkillPerfectItemStore.clear(); // reload capability + + // 0 1 2 3 + QueryResult result = WorldDatabase.Query("SELECT spellId, requiredSpecialization, perfectCreateChance, perfectItemType FROM skill_perfect_item_template"); + + if (!result) + { + TC_LOG_ERROR("server.loading", ">> Loaded 0 spell perfection definitions. DB table `skill_perfect_item_template` is empty."); + return; + } + + uint32 count = 0; + + do /* fetch data and run sanity checks */ + { + Field* fields = result->Fetch(); + + uint32 spellId = fields[0].GetUInt32(); + + if (!sSpellMgr->GetSpellInfo(spellId)) + { + TC_LOG_ERROR("sql.sql", "Skill perfection data for spell %u has non-existent spell id in `skill_perfect_item_template`!", spellId); + continue; + } + + uint32 requiredSpecialization = fields[1].GetUInt32(); + if (!sSpellMgr->GetSpellInfo(requiredSpecialization)) + { + TC_LOG_ERROR("sql.sql", "Skill perfection data for spell %u has non-existent required specialization spell id %u in `skill_perfect_item_template`!", spellId, requiredSpecialization); + continue; + } + + float perfectCreateChance = fields[2].GetFloat(); + if (perfectCreateChance <= 0.0f) + { + TC_LOG_ERROR("sql.sql", "Skill perfection data for spell %u has impossibly low proc chance in `skill_perfect_item_template`!", spellId); + continue; + } + + uint32 perfectItemType = fields[3].GetUInt32(); + if (!sObjectMgr->GetItemTemplate(perfectItemType)) + { + TC_LOG_ERROR("sql.sql", "Skill perfection data for spell %u references non-existent perfect item id %u in `skill_perfect_item_template`!", spellId, perfectItemType); + continue; + } + + SkillPerfectItemEntry& skillPerfectItemEntry = SkillPerfectItemStore[spellId]; + + skillPerfectItemEntry.requiredSpecialization = requiredSpecialization; + skillPerfectItemEntry.perfectCreateChance = perfectCreateChance; + skillPerfectItemEntry.perfectItemType = perfectItemType; + + ++count; + } + while (result->NextRow()); + + TC_LOG_INFO("server.loading", ">> Loaded %u spell perfection definitions in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); +} + // struct to store information about extra item creation // one entry for every spell that is able to create an extra item struct SkillExtraItemEntry @@ -112,6 +199,30 @@ void LoadSkillExtraItemTable() TC_LOG_INFO("server.loading", ">> Loaded %u spell specialization definitions in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); } +bool CanCreatePerfectItem(Player* player, uint32 spellId, float &perfectCreateChance, uint32 &perfectItemType) +{ + SkillPerfectItemMap::const_iterator ret = SkillPerfectItemStore.find(spellId); + // no entry in DB means no perfection proc possible + if (ret == SkillPerfectItemStore.end()) + return false; + + SkillPerfectItemEntry const* thisEntry = &ret->second; + // lack of entry means no perfection proc possible + if (!thisEntry) + return false; + + // if you don't have the spell needed, then no procs for you + if (!player->HasSpell(thisEntry->requiredSpecialization)) + return false; + + // set values as appropriate + perfectCreateChance = thisEntry->perfectCreateChance; + perfectItemType = thisEntry->perfectItemType; + + // and tell the caller to start rolling the dice + return true; +} + bool CanCreateExtraItems(Player* player, uint32 spellId, float &additionalChance, uint8 &additionalMax) { // get the info for the specified spell diff --git a/src/server/game/Skills/SkillExtraItems.h b/src/server/game/Skills/SkillExtraItems.h index 0cdfff74ed2..118c49ed00f 100644 --- a/src/server/game/Skills/SkillExtraItems.h +++ b/src/server/game/Skills/SkillExtraItems.h @@ -23,6 +23,10 @@ // predef classes used in functions class Player; +// returns true and sets the appropriate info if the player can create a perfect item with the given spellId +bool CanCreatePerfectItem(Player* player, uint32 spellId, float &perfectCreateChance, uint32 &perfectItemType); +// load perfection proc info from DB +void LoadSkillPerfectItemTable(); // returns true and sets the appropriate info if the player can create extra items with the given spellId bool CanCreateExtraItems(Player* player, uint32 spellId, float &additionalChance, uint8 &additionalMax); // function to load the extra item creation info from DB diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 10dfbd511df..e587a59858a 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -1571,6 +1571,22 @@ void Spell::DoCreateItem(uint32 /*i*/, uint32 itemtype) if (num_to_add > pProto->GetMaxStackSize()) num_to_add = pProto->GetMaxStackSize(); + /* == gem perfection handling == */ + + // the chance of getting a perfect result + float perfectCreateChance = 0.0f; + // the resulting perfect item if successful + uint32 perfectItemType = itemtype; + // get perfection capability and chance + if (CanCreatePerfectItem(player, m_spellInfo->Id, perfectCreateChance, perfectItemType)) + if (roll_chance_f(perfectCreateChance)) // if the roll succeeds... + newitemid = perfectItemType; // the perfect item replaces the regular one + + /* == gem perfection handling over == */ + + + /* == profession specialization handling == */ + // init items_count to 1, since 1 item will be created regardless of specialization int items_count=1; // the chance to create additional items @@ -1579,15 +1595,16 @@ void Spell::DoCreateItem(uint32 /*i*/, uint32 itemtype) uint8 additionalMaxNum=0; // get the chance and maximum number for creating extra items if (CanCreateExtraItems(player, m_spellInfo->Id, additionalCreateChance, additionalMaxNum)) - { // roll with this chance till we roll not to create or we create the max num while (roll_chance_f(additionalCreateChance) && items_count <= additionalMaxNum) ++items_count; - } // really will be created more items num_to_add *= items_count; + /* == profession specialization handling over == */ + + // can the player store the new item? ItemPosCountVec dest; uint32 no_space = 0; diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index f27f9220aaa..55d0ad0b4dc 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -3105,11 +3105,13 @@ void SpellMgr::LoadSpellInfoCorrections() case 28796: // Poison Bolt Volly - Faerlina spellInfo->MaxAffectedTargets = 5; break; + case 54835: // Curse of the Plaguebringer - Noth (H) + spellInfo->MaxAffectedTargets = 8; + break; case 40827: // Sinful Beam case 40859: // Sinister Beam case 40860: // Vile Beam case 40861: // Wicked Beam - case 54835: // Curse of the Plaguebringer - Noth (H) case 54098: // Poison Bolt Volly - Faerlina (H) spellInfo->MaxAffectedTargets = 10; break; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 85e79168b71..169ff069de4 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1644,6 +1644,9 @@ void World::SetInitialWorldSettings() TC_LOG_INFO("server.loading", "Loading Skill Extra Item Table..."); LoadSkillExtraItemTable(); + TC_LOG_INFO("server.loading", "Loading Skill Perfection Data Table..."); + LoadSkillPerfectItemTable(); + TC_LOG_INFO("server.loading", "Loading Skill Fishing base level requirements..."); sObjectMgr->LoadFishingBaseSkillLevel(); diff --git a/src/server/scripts/Commands/cs_instance.cpp b/src/server/scripts/Commands/cs_instance.cpp index c960d3f3753..aa7310e3c65 100644 --- a/src/server/scripts/Commands/cs_instance.cpp +++ b/src/server/scripts/Commands/cs_instance.cpp @@ -254,7 +254,8 @@ public: } map->ToInstanceMap()->GetInstanceScript()->SetBossState(encounterId, (EncounterState)state); - handler->PSendSysMessage(LANG_COMMAND_INST_SET_BOSS_STATE, encounterId, state); + std::string stateName = InstanceScript::GetBossStateName(state); + handler->PSendSysMessage(LANG_COMMAND_INST_SET_BOSS_STATE, encounterId, state, stateName); return true; } @@ -318,7 +319,8 @@ public: } uint8 state = map->ToInstanceMap()->GetInstanceScript()->GetBossState(encounterId); - handler->PSendSysMessage(LANG_COMMAND_INST_GET_BOSS_STATE, encounterId, state); + std::string stateName = InstanceScript::GetBossStateName(state); + handler->PSendSysMessage(LANG_COMMAND_INST_GET_BOSS_STATE, encounterId, state, stateName); return true; } }; diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp index f4b442de92a..2863d2d4ede 100644 --- a/src/server/scripts/Commands/cs_reload.cpp +++ b/src/server/scripts/Commands/cs_reload.cpp @@ -749,12 +749,21 @@ public: return true; } - static bool HandleReloadSkillExtraItemTemplateCommand(ChatHandler* handler, const char* /*args*/) + static bool HandleReloadSkillPerfectItemTemplateCommand(ChatHandler* handler, const char* /*args*/) + { // latched onto HandleReloadSkillExtraItemTemplateCommand as it's part of that table group (and i don't want to chance all the command IDs) + TC_LOG_INFO("misc", "Re-Loading Skill Perfection Data Table..."); + LoadSkillPerfectItemTable(); + handler->SendGlobalGMSysMessage("DB table `skill_perfect_item_template` (perfect item procs when crafting) reloaded."); + return true; + } + + static bool HandleReloadSkillExtraItemTemplateCommand(ChatHandler* handler, const char* args) { TC_LOG_INFO("misc", "Re-Loading Skill Extra Item Table..."); LoadSkillExtraItemTable(); handler->SendGlobalGMSysMessage("DB table `skill_extra_item_template` (extra item creation when crafting) reloaded."); - return true; + + return HandleReloadSkillPerfectItemTemplateCommand(handler, args); } static bool HandleReloadSkillFishingBaseLevelCommand(ChatHandler* handler, const char* /*args*/) diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp index 9747d31952b..f2d7f23bdc7 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp @@ -93,11 +93,6 @@ class npc_unworthy_initiate : public CreatureScript public: npc_unworthy_initiate() : CreatureScript("npc_unworthy_initiate") { } - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_unworthy_initiateAI(creature); - } - struct npc_unworthy_initiateAI : public ScriptedAI { npc_unworthy_initiateAI(Creature* creature) : ScriptedAI(creature) @@ -156,7 +151,7 @@ public: me->CastSpell(me, SPELL_DK_INITIATE_VISUAL, true); if (Player* starter = ObjectAccessor::GetPlayer(*me, playerGUID)) - sCreatureTextMgr->SendChat(me, SAY_EVENT_ATTACK, NULL, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_NORMAL, 0, TEAM_OTHER, false, starter); + Talk(SAY_EVENT_ATTACK, starter); phase = PHASE_TO_ATTACK; } @@ -286,6 +281,11 @@ public: } } }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_unworthy_initiateAI(creature); + } }; class npc_unworthy_initiate_anchor : public CreatureScript @@ -457,6 +457,7 @@ enum Spells_DKI //SPELL_DUEL_TRIGGERED = 52990, SPELL_DUEL_VICTORY = 52994, SPELL_DUEL_FLAG = 52991, + SPELL_GROVEL = 7267, }; enum Says_VBM @@ -494,8 +495,6 @@ public: creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_15); - sCreatureTextMgr->SendChat(creature, SAY_DUEL, NULL, CHAT_MSG_ADDON, LANG_ADDON, TEXT_RANGE_NORMAL, 0, TEAM_OTHER, false, player); - player->CastSpell(creature, SPELL_DUEL, false); player->CastSpell(player, SPELL_DUEL_FLAG, true); } @@ -518,11 +517,6 @@ public: return true; } - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_death_knight_initiateAI(creature); - } - struct npc_death_knight_initiateAI : public CombatAI { npc_death_knight_initiateAI(Creature* creature) : CombatAI(creature) @@ -557,6 +551,7 @@ public: if (!m_bIsDuelInProgress && pSpell->Id == SPELL_DUEL) { m_uiDuelerGUID = pCaster->GetGUID(); + Talk(SAY_DUEL, pCaster); m_bIsDuelInProgress = true; } } @@ -577,7 +572,7 @@ public: pDoneBy->AttackStop(); me->CastSpell(pDoneBy, SPELL_DUEL_VICTORY, true); lose = true; - me->CastSpell(me, 7267, true); + me->CastSpell(me, SPELL_GROVEL, true); me->RestoreFaction(); } } @@ -607,13 +602,13 @@ public: { if (lose) { - if (!me->HasAura(7267)) + if (!me->HasAura(SPELL_GROVEL)) EnterEvadeMode(); return; } else if (me->GetVictim() && me->EnsureVictim()->GetTypeId() == TYPEID_PLAYER && me->EnsureVictim()->HealthBelowPct(10)) { - me->EnsureVictim()->CastSpell(me->GetVictim(), 7267, true); // beg + me->EnsureVictim()->CastSpell(me->GetVictim(), SPELL_GROVEL, true); // beg me->EnsureVictim()->RemoveGameObject(SPELL_DUEL_FLAG, true); EnterEvadeMode(); return; @@ -626,6 +621,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_death_knight_initiateAI(creature); + } }; /*###### diff --git a/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp b/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp index 3d7c128c8dd..5248c48029c 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_heigan.cpp @@ -21,36 +21,42 @@ #include "naxxramas.h" #include "Player.h" -enum Heigan +enum Spells { - SPELL_DECREPIT_FEVER = 29998, // 25-man: 55011 - SPELL_SPELL_DISRUPTION = 29310, - SPELL_PLAGUE_CLOUD = 29350, - - SAY_AGGRO = 0, - SAY_SLAY = 1, - SAY_TAUNT = 2, - SAY_DEATH = 3 + SPELL_DECREPIT_FEVER = 29998, // 25-man: 55011 + SPELL_SPELL_DISRUPTION = 29310, + SPELL_PLAGUE_CLOUD = 29350, + SPELL_TELEPORT_SELF = 30211, +}; + +enum Yells +{ + SAY_AGGRO = 0, + SAY_SLAY = 1, + SAY_TAUNT = 2, + SAY_DEATH = 3, + + EMOTE_DANCE = 4, + EMOTE_DANCE_END = 5, }; enum Events { - EVENT_NONE, - EVENT_DISRUPT, + EVENT_DISRUPT = 1, EVENT_FEVER, EVENT_ERUPT, - EVENT_PHASE, + EVENT_DANCE, + EVENT_DANCE_END }; enum Phases { PHASE_FIGHT = 1, - PHASE_DANCE, + PHASE_DANCE }; enum Misc { - ACTION_SAFETY_DANCE_FAIL = 1, DATA_SAFETY_DANCE = 19962139 }; @@ -66,39 +72,25 @@ public: struct boss_heiganAI : public BossAI { - boss_heiganAI(Creature* creature) : BossAI(creature, BOSS_HEIGAN) + boss_heiganAI(Creature* creature) : BossAI(creature, BOSS_HEIGAN), eruptSection(0), eruptDirection(false), safetyDance(false) { } + + void Reset() override { - eruptSection = 0; - eruptDirection = false; - safetyDance = false; - phase = PHASE_FIGHT; + me->SetReactState(REACT_AGGRESSIVE); + _Reset(); } - uint32 eruptSection; - bool eruptDirection; - bool safetyDance; - Phases phase; - void KilledUnit(Unit* who) override { - if (!(rand32() % 5)) - Talk(SAY_SLAY); + Talk(SAY_SLAY); + if (who->GetTypeId() == TYPEID_PLAYER) safetyDance = false; } - void SetData(uint32 id, uint32 data) override - { - if (id == DATA_SAFETY_DANCE) - safetyDance = data ? true : false; - } - uint32 GetData(uint32 type) const override { - if (type == DATA_SAFETY_DANCE) - return safetyDance ? 1 : 0; - - return 0; + return (type == DATA_SAFETY_DANCE && safetyDance) ? 1u : 0u; } void JustDied(Unit* /*killer*/) override @@ -111,35 +103,14 @@ public: { _EnterCombat(); Talk(SAY_AGGRO); - EnterPhase(PHASE_FIGHT); - safetyDance = true; - } - - void EnterPhase(Phases newPhase) - { - phase = newPhase; - events.Reset(); + eruptSection = 3; - if (phase == PHASE_FIGHT) - { - events.ScheduleEvent(EVENT_DISRUPT, urand(10000, 25000)); - events.ScheduleEvent(EVENT_FEVER, urand(15000, 20000)); - events.ScheduleEvent(EVENT_PHASE, 90000); - events.ScheduleEvent(EVENT_ERUPT, 15000); - me->GetMotionMaster()->MoveChase(me->GetVictim()); - } - else - { - float x, y, z, o; - me->GetHomePosition(x, y, z, o); - me->NearTeleportTo(x, y, z, o - (float(M_PI) / 2)); - me->GetMotionMaster()->Clear(); - me->GetMotionMaster()->MoveIdle(); - me->SetTarget(ObjectGuid::Empty); - DoCastAOE(SPELL_PLAGUE_CLOUD); - events.ScheduleEvent(EVENT_PHASE, 45000); - events.ScheduleEvent(EVENT_ERUPT, 8000); - } + events.ScheduleEvent(EVENT_DISRUPT, urand(15 * IN_MILLISECONDS, 20 * IN_MILLISECONDS), 0, PHASE_FIGHT); + events.ScheduleEvent(EVENT_FEVER, urand(10 * IN_MILLISECONDS, 20 * IN_MILLISECONDS), 0, PHASE_FIGHT); + events.ScheduleEvent(EVENT_DANCE, 90 * IN_MILLISECONDS, 0, PHASE_FIGHT); + events.ScheduleEvent(EVENT_ERUPT, 15 * IN_MILLISECONDS, 0, PHASE_FIGHT); + + safetyDance = true; } void UpdateAI(uint32 diff) override @@ -155,15 +126,36 @@ public: { case EVENT_DISRUPT: DoCastAOE(SPELL_SPELL_DISRUPTION); - events.ScheduleEvent(EVENT_DISRUPT, urand(5000, 10000)); + events.ScheduleEvent(EVENT_DISRUPT, 11 * IN_MILLISECONDS); break; case EVENT_FEVER: DoCastAOE(SPELL_DECREPIT_FEVER); - events.ScheduleEvent(EVENT_FEVER, urand(20000, 25000)); + events.ScheduleEvent(EVENT_FEVER, urand(20 * IN_MILLISECONDS, 25 * IN_MILLISECONDS)); + break; + case EVENT_DANCE: + events.SetPhase(PHASE_DANCE); + Talk(SAY_TAUNT); + Talk(EMOTE_DANCE); + eruptSection = 3; + me->SetReactState(REACT_PASSIVE); + me->AttackStop(); + me->StopMoving(); + DoCast(SPELL_TELEPORT_SELF); + DoCastAOE(SPELL_PLAGUE_CLOUD); + events.ScheduleEvent(EVENT_DANCE_END, 45 * IN_MILLISECONDS, 0, PHASE_DANCE); + events.ScheduleEvent(EVENT_ERUPT, 10 * IN_MILLISECONDS); break; - case EVENT_PHASE: - /// @todo Add missing texts for both phase switches - EnterPhase(phase == PHASE_FIGHT ? PHASE_DANCE : PHASE_FIGHT); + case EVENT_DANCE_END: + events.SetPhase(PHASE_FIGHT); + Talk(EMOTE_DANCE_END); + eruptSection = 3; + events.ScheduleEvent(EVENT_DISRUPT, urand(10, 25) * IN_MILLISECONDS, 0, PHASE_FIGHT); + events.ScheduleEvent(EVENT_FEVER, urand(15, 20) * IN_MILLISECONDS, 0, PHASE_FIGHT); + events.ScheduleEvent(EVENT_DANCE, 90 * IN_MILLISECONDS, 0, PHASE_FIGHT); + events.ScheduleEvent(EVENT_ERUPT, 15 * IN_MILLISECONDS, 0, PHASE_FIGHT); + me->CastStop(); + me->SetReactState(REACT_AGGRESSIVE); + DoZoneInCombat(); break; case EVENT_ERUPT: instance->SetData(DATA_HEIGAN_ERUPT, eruptSection); @@ -176,13 +168,22 @@ public: eruptDirection ? ++eruptSection : --eruptSection; - events.ScheduleEvent(EVENT_ERUPT, phase == PHASE_FIGHT ? 10000 : 3000); + if (events.IsInPhase(PHASE_DANCE)) + events.ScheduleEvent(EVENT_ERUPT, 3 * IN_MILLISECONDS, 0, PHASE_DANCE); + else + events.ScheduleEvent(EVENT_ERUPT, 10 * IN_MILLISECONDS, 0, PHASE_FIGHT); break; } } DoMeleeAttackIfReady(); } + + private: + uint32 eruptSection; + bool eruptDirection; + + bool safetyDance; // is achievement still possible? (= no player deaths yet) }; }; @@ -205,7 +206,7 @@ class spell_heigan_eruption : public SpellScriptLoader if (GetHitDamage() >= int32(GetHitPlayer()->GetHealth())) if (InstanceScript* instance = caster->GetInstanceScript()) if (Creature* Heigan = ObjectAccessor::GetCreature(*caster, instance->GetGuidData(DATA_HEIGAN))) - Heigan->AI()->SetData(DATA_SAFETY_DANCE, 0); + Heigan->AI()->KilledUnit(GetHitPlayer()); } void Register() override @@ -223,9 +224,7 @@ class spell_heigan_eruption : public SpellScriptLoader class achievement_safety_dance : public AchievementCriteriaScript { public: - achievement_safety_dance() : AchievementCriteriaScript("achievement_safety_dance") - { - } + achievement_safety_dance() : AchievementCriteriaScript("achievement_safety_dance") { } bool OnCheck(Player* /*player*/, Unit* target) override { diff --git a/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp b/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp index 33fb43b6bbc..494c173f5fc 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_loatheb.cpp @@ -27,7 +27,10 @@ enum Spells SPELL_WARN_NECROTIC_AURA = 59481, SPELL_SUMMON_SPORE = 29234, SPELL_DEATHBLOOM = 29865, - SPELL_INEVITABLE_DOOM = 29204 + SPELL_INEVITABLE_DOOM = 29204, + SPELL_FUNGAL_CREEP = 29232, + + SPELL_DEATHBLOOM_FINAL_DAMAGE = 55594, }; enum Texts @@ -72,29 +75,35 @@ class boss_loatheb : public CreatureScript void Reset() override { _Reset(); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_FUNGAL_CREEP); Initialize(); } void EnterCombat(Unit* /*who*/) override { _EnterCombat(); - events.ScheduleEvent(EVENT_NECROTIC_AURA, 17000); - events.ScheduleEvent(EVENT_DEATHBLOOM, 5000); - events.ScheduleEvent(EVENT_SPORE, IsHeroic() ? 18000 : 36000); - events.ScheduleEvent(EVENT_INEVITABLE_DOOM, 120000); + events.ScheduleEvent(EVENT_NECROTIC_AURA, 17 * IN_MILLISECONDS); + events.ScheduleEvent(EVENT_DEATHBLOOM, 5 * IN_MILLISECONDS); + events.ScheduleEvent(EVENT_SPORE, RAID_MODE(36,18) * IN_MILLISECONDS); + events.ScheduleEvent(EVENT_INEVITABLE_DOOM, 2 * MINUTE * IN_MILLISECONDS); } - void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) override + void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) override { _sporeLoserData = false; + summon->CastSpell(summon,SPELL_FUNGAL_CREEP,true); } - uint32 GetData(uint32 id) const override + void SummonedCreatureDespawn(Creature* summon) override { - if (id != DATA_ACHIEVEMENT_SPORE_LOSER) - return 0; + summons.Despawn(summon); + if (summon->IsAlive()) + summon->CastSpell(summon,SPELL_FUNGAL_CREEP,true); + } - return uint32(_sporeLoserData); + uint32 GetData(uint32 id) const override + { + return (_sporeLoserData && id == DATA_ACHIEVEMENT_SPORE_LOSER) ? 1u : 0u; } void UpdateAI(uint32 diff) override @@ -111,21 +120,29 @@ class boss_loatheb : public CreatureScript case EVENT_NECROTIC_AURA: DoCastAOE(SPELL_NECROTIC_AURA); DoCast(me, SPELL_WARN_NECROTIC_AURA); - events.ScheduleEvent(EVENT_NECROTIC_AURA, 20000); - events.ScheduleEvent(EVENT_NECROTIC_AURA_FADING, 14000); + events.ScheduleEvent(EVENT_NECROTIC_AURA, 20 * IN_MILLISECONDS); + events.ScheduleEvent(EVENT_NECROTIC_AURA_FADING, 14 * IN_MILLISECONDS); break; case EVENT_DEATHBLOOM: DoCastAOE(SPELL_DEATHBLOOM); - events.ScheduleEvent(EVENT_DEATHBLOOM, 30000); + events.ScheduleEvent(EVENT_DEATHBLOOM, 30 * IN_MILLISECONDS); break; case EVENT_INEVITABLE_DOOM: _doomCounter++; DoCastAOE(SPELL_INEVITABLE_DOOM); - events.ScheduleEvent(EVENT_INEVITABLE_DOOM, std::max(120000 - _doomCounter * 15000, 15000)); // needs to be confirmed + if (_doomCounter > 6) + { + if (_doomCounter & 1) // odd + events.ScheduleEvent(EVENT_INEVITABLE_DOOM, 14 * IN_MILLISECONDS); + else + events.ScheduleEvent(EVENT_INEVITABLE_DOOM, 17 * IN_MILLISECONDS); + } + else + events.ScheduleEvent(EVENT_INEVITABLE_DOOM, 30 * IN_MILLISECONDS); break; case EVENT_SPORE: DoCast(me, SPELL_SUMMON_SPORE, false); - events.ScheduleEvent(EVENT_SPORE, IsHeroic() ? 18000 : 36000); + events.ScheduleEvent(EVENT_SPORE, RAID_MODE(36,18) * IN_MILLISECONDS); break; case EVENT_NECROTIC_AURA_FADING: Talk(SAY_NECROTIC_AURA_FADING); @@ -203,9 +220,46 @@ class spell_loatheb_necrotic_aura_warning : public SpellScriptLoader } }; +class spell_loatheb_deathbloom : public SpellScriptLoader +{ + public: + spell_loatheb_deathbloom() : SpellScriptLoader("spell_loatheb_deathbloom") { } + + class spell_loatheb_deathbloom_AuraScript : public AuraScript + { + PrepareAuraScript(spell_loatheb_deathbloom_AuraScript); + + bool Validate(SpellInfo const* /*spell*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_DEATHBLOOM_FINAL_DAMAGE)) + return false; + return true; + } + + void AfterRemove(AuraEffect const* eff, AuraEffectHandleModes /*mode*/) + { + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) + return; + + GetTarget()->CastSpell(nullptr, SPELL_DEATHBLOOM_FINAL_DAMAGE, true, nullptr, eff, GetCasterGUID()); + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_loatheb_deathbloom_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_loatheb_deathbloom_AuraScript(); + } +}; + void AddSC_boss_loatheb() { new boss_loatheb(); new achievement_spore_loser(); new spell_loatheb_necrotic_aura_warning(); + new spell_loatheb_deathbloom(); } diff --git a/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp index f5e5b287571..810d446111a 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_noth.cpp @@ -19,51 +19,58 @@ #include "ScriptedCreature.h" #include "naxxramas.h" -enum Noth +enum Phases { - SAY_AGGRO = 0, - SAY_SUMMON = 1, - SAY_SLAY = 2, - SAY_DEATH = 3, - - SOUND_DEATH = 8848, - - SPELL_CURSE_PLAGUEBRINGER = 29213, // 25-man: 54835 - SPELL_CRIPPLE = 29212, // 25-man: 54814 - SPELL_TELEPORT = 29216, - - NPC_WARRIOR = 16984, - NPC_CHAMPION = 16983, - NPC_GUARDIAN = 16981 + PHASE_NONE, + PHASE_GROUND, + PHASE_BALCONY }; -#define SPELL_BLINK RAND(29208, 29209, 29210, 29211) +enum Events +{ + EVENT_CURSE = 1, // curse of the plaguebringer + EVENT_BLINK, // blink (25m only) + EVENT_WARRIOR, // summon warriors during ground phase + EVENT_BALCONY, // become untargetable and begin balcony phase + EVENT_BALCONY_TELEPORT, // actually teleport to balcony, this is slightly delayed + EVENT_WAVE, // spawn wave during balcony phase + EVENT_GROUND, // end balcony phase and teleport to ground + EVENT_GROUND_ATTACKABLE // become attackable and aggressive again at start of ground phase, once again slightly delayed to prevent motionmaster weirdness +}; -// Teleport position of Noth on his balcony -Position const Teleport = { 2631.370f, -3529.680f, 274.040f, 6.277f }; +enum Talk +{ + SAY_AGGRO = 0, + SAY_SUMMON = 1, + SAY_SLAY = 2, + SAY_DEATH = 3, -#define MAX_SUMMON_POS 5 + EMOTE_SUMMON = 4, // ground phase + EMOTE_SUMMON_WAVE = 5, // balcony phase + EMOTE_TELEPORT_1 = 6, // ground to balcony + EMOTE_TELEPORT_2 = 7 // balcony to ground +}; -Position const SummonPos[MAX_SUMMON_POS] = +enum Spells { - { 2728.12f, -3544.43f, 261.91f, 6.04f }, - { 2729.05f, -3544.47f, 261.91f, 5.58f }, - { 2728.24f, -3465.08f, 264.20f, 3.56f }, - { 2704.11f, -3456.81f, 265.53f, 4.51f }, - { 2663.56f, -3464.43f, 262.66f, 5.20f } + SPELL_CURSE = 29213, // 25-man: 54835 + SPELL_CRIPPLE = 29212, // 25-man: 54814 + + SPELL_TELEPORT = 29216, // ground to balcony + SPELL_TELEPORT_BACK = 29231 // balcony to ground }; -enum Events +enum Adds { - EVENT_NONE, - EVENT_BERSERK, - EVENT_CURSE, - EVENT_BLINK, - EVENT_WARRIOR, - EVENT_BALCONY, - EVENT_WAVE, - EVENT_GROUND + N_WARRIOR_SPELLS = 3, + N_CHAMPION_SPELLS = 6, + N_GUARDIAN_SPELLS = 3 }; +const uint32 SummonWarriorSpells[N_WARRIOR_SPELLS] = { 29247, 29248, 29249 }; +const uint32 SummonChampionSpells[N_CHAMPION_SPELLS] = { 29238, 29255, 29257, 29258, 29262, 29267 }; +const uint32 SummonGuardianSpells[N_GUARDIAN_SPELLS] = { 29239, 29256, 29268 }; + +#define SPELL_BLINK RAND(29208, 29209, 29210, 29211) class boss_noth : public CreatureScript { @@ -72,16 +79,38 @@ public: struct boss_nothAI : public BossAI { - boss_nothAI(Creature* creature) : BossAI(creature, BOSS_NOTH) + boss_nothAI(Creature* creature) : BossAI(creature, BOSS_NOTH), balconyCount(0), justBlinked(false) { - balconyCount = 0; - waveCount = 0; + std::copy(SummonWarriorSpells, SummonWarriorSpells + N_WARRIOR_SPELLS, _SummonWarriorSpells); + std::copy(SummonChampionSpells, SummonChampionSpells + N_CHAMPION_SPELLS, _SummonChampionSpells); + std::copy(SummonGuardianSpells, SummonGuardianSpells + N_GUARDIAN_SPELLS, _SummonGuardianSpells); + + events.SetPhase(PHASE_NONE); + } + + void EnterEvadeMode() override + { + Reset(); // teleport back first + _EnterEvadeMode(); } void Reset() override { - me->SetReactState(REACT_AGGRESSIVE); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + if (!me->IsAlive()) + return; + + // in case we reset during balcony phase + if (events.IsInPhase(PHASE_BALCONY)) + { + DoCastAOE(SPELL_TELEPORT_BACK); + me->SetReactState(REACT_AGGRESSIVE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE); + } + + balconyCount = 0; + events.SetPhase(PHASE_NONE); + justBlinked = false; + _Reset(); } @@ -89,31 +118,44 @@ public: { _EnterCombat(); Talk(SAY_AGGRO); - balconyCount = 0; EnterPhaseGround(); } void EnterPhaseGround() { - me->SetReactState(REACT_AGGRESSIVE); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + events.SetPhase(PHASE_GROUND); + DoZoneInCombat(); if (me->getThreatManager().isThreatListEmpty()) - EnterEvadeMode(); + Reset(); else { - events.ScheduleEvent(EVENT_BALCONY, 110000); - events.ScheduleEvent(EVENT_CURSE, 10000 + rand32() % 15000); - events.ScheduleEvent(EVENT_WARRIOR, 30000); + uint8 secondsGround; + switch (balconyCount) + { + case 0: + secondsGround = 90; + break; + case 1: + secondsGround = 110; + break; + case 2: + default: + secondsGround = 180; + } + events.ScheduleEvent(EVENT_GROUND_ATTACKABLE, 2 * IN_MILLISECONDS, 0, PHASE_GROUND); + events.ScheduleEvent(EVENT_BALCONY, secondsGround * IN_MILLISECONDS, 0, PHASE_GROUND); + events.ScheduleEvent(EVENT_CURSE, urand(10,25) * IN_MILLISECONDS, 0, PHASE_GROUND); + events.ScheduleEvent(EVENT_WARRIOR, urand(20,30) * IN_MILLISECONDS, 0, PHASE_GROUND); if (GetDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL) - events.ScheduleEvent(EVENT_BLINK, urand(20000, 40000)); + events.ScheduleEvent(EVENT_BLINK, urand(20,30) * IN_MILLISECONDS, 0, PHASE_GROUND); } } - void KilledUnit(Unit* /*victim*/) override + void KilledUnit(Unit* victim) override { - if (!(rand32() % 5)) + if(victim->GetTypeId() == TYPEID_PLAYER) Talk(SAY_SLAY); } @@ -121,7 +163,7 @@ public: { summons.Summon(summon); summon->setActive(true); - summon->AI()->DoZoneInCombat(); + summon->AI()->DoZoneInCombat(nullptr, 250.0f); // specify range to cover entire room - default 50yd is not enough } void JustDied(Unit* /*killer*/) override @@ -130,10 +172,35 @@ public: Talk(SAY_DEATH); } - void SummonUndead(uint32 entry, uint32 num) + void DamageTaken(Unit* /*who*/, uint32& damage) // prevent noth from somehow dying in the balcony phase { - for (uint32 i = 0; i < num; ++i) - me->SummonCreature(entry, SummonPos[rand32() % MAX_SUMMON_POS], TEMPSUMMON_CORPSE_DESPAWN, 60000); + if (!events.IsInPhase(PHASE_BALCONY)) + return; + if (damage < me->GetHealth()) + return; + + me->SetHealth(1u); + damage = 0u; + } + + void HandleSummon(uint32* spellsList, const uint8 nSpells, uint8 num) + { // this ensures we do not spawn two mobs using the same spell (<=> in the same position) if we can help it + while (num) + for (uint8 it = 0; it < nSpells && num; ++it) + { + num--; + uint8 selected = urand(it, nSpells - 1); + DoCastAOE(spellsList[selected]); + if (selected != it) // shuffle the selected into the part of the array that is no longer being searched + std::swap(spellsList[selected], spellsList[it]); + } + } + + void CastSummon(uint8 nWarrior, uint8 nChampion, uint8 nGuardian) + { + HandleSummon(_SummonWarriorSpells, N_WARRIOR_SPELLS, nWarrior); + HandleSummon(_SummonChampionSpells, N_CHAMPION_SPELLS, nChampion); + HandleSummon(_SummonGuardianSpells, N_GUARDIAN_SPELLS, nGuardian); } void UpdateAI(uint32 diff) override @@ -151,72 +218,115 @@ public: switch (eventId) { case EVENT_CURSE: - DoCastAOE(SPELL_CURSE_PLAGUEBRINGER); - events.ScheduleEvent(EVENT_CURSE, urand(50000, 60000)); - return; + { + DoCastAOE(SPELL_CURSE); + events.ScheduleEvent(EVENT_CURSE, urand(50, 70) * IN_MILLISECONDS, 0, PHASE_GROUND); + break; + } case EVENT_WARRIOR: Talk(SAY_SUMMON); - SummonUndead(NPC_WARRIOR, RAID_MODE(2, 3)); - events.ScheduleEvent(EVENT_WARRIOR, 30000); - return; + Talk(EMOTE_SUMMON); + + CastSummon(RAID_MODE(2, 3), 0, 0); + + events.ScheduleEvent(EVENT_WARRIOR, 40 * IN_MILLISECONDS, 0, PHASE_GROUND); + break; case EVENT_BLINK: DoCastAOE(SPELL_CRIPPLE, true); DoCastAOE(SPELL_BLINK); DoResetThreat(); - events.ScheduleEvent(EVENT_BLINK, 40000); - return; + justBlinked = true; + + events.ScheduleEvent(EVENT_BLINK, 40000, 0, PHASE_GROUND); + break; case EVENT_BALCONY: + events.SetPhase(PHASE_BALCONY); me->SetReactState(REACT_PASSIVE); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE); me->AttackStop(); + me->StopMoving(); me->RemoveAllAuras(); - me->NearTeleportTo(Teleport.GetPositionX(), Teleport.GetPositionY(), Teleport.GetPositionZ(), Teleport.GetOrientation()); - events.Reset(); - events.ScheduleEvent(EVENT_WAVE, urand(2000, 5000)); - waveCount = 0; - return; + + events.ScheduleEvent(EVENT_BALCONY_TELEPORT, 3 * IN_MILLISECONDS, 0, PHASE_BALCONY); + events.ScheduleEvent(EVENT_WAVE, urand(5 * IN_MILLISECONDS, 8 * IN_MILLISECONDS), 0, PHASE_BALCONY); + + uint8 secondsBalcony; + switch (balconyCount) + { + case 0: + secondsBalcony = 70; + break; + case 1: + secondsBalcony = 97; + break; + case 2: + default: + secondsBalcony = 120; + break; + } + events.ScheduleEvent(EVENT_GROUND, secondsBalcony * IN_MILLISECONDS, 0, PHASE_BALCONY); + break; + case EVENT_BALCONY_TELEPORT: + Talk(EMOTE_TELEPORT_1); + DoCastAOE(SPELL_TELEPORT); + break; case EVENT_WAVE: - Talk(SAY_SUMMON); + Talk(EMOTE_SUMMON_WAVE); switch (balconyCount) { case 0: - SummonUndead(NPC_CHAMPION, RAID_MODE(2, 4)); + CastSummon(0, RAID_MODE(2, 4), 0); break; case 1: - SummonUndead(NPC_CHAMPION, RAID_MODE(1, 2)); - SummonUndead(NPC_GUARDIAN, RAID_MODE(1, 2)); + CastSummon(0, RAID_MODE(1, 2), RAID_MODE(1, 2)); break; case 2: - SummonUndead(NPC_GUARDIAN, RAID_MODE(2, 4)); + CastSummon(0, 0, RAID_MODE(2, 4)); break; default: - SummonUndead(NPC_CHAMPION, RAID_MODE(5, 10)); - SummonUndead(NPC_GUARDIAN, RAID_MODE(5, 10)); + CastSummon(0, RAID_MODE(5, 10), RAID_MODE(5, 10)); break; } - ++waveCount; - events.ScheduleEvent(waveCount < 2 ? EVENT_WAVE : EVENT_GROUND, urand(30000, 45000)); - return; + events.ScheduleEvent(EVENT_WAVE, urand(30, 45) * IN_MILLISECONDS, 0, PHASE_BALCONY); + break; case EVENT_GROUND: - { ++balconyCount; - float x, y, z, o; - me->GetHomePosition(x, y, z, o); - me->NearTeleportTo(x, y, z, o); - events.ScheduleEvent(EVENT_BALCONY, 110000); + + DoCastAOE(SPELL_TELEPORT_BACK); + Talk(EMOTE_TELEPORT_2); + EnterPhaseGround(); - return; - } + break; + case EVENT_GROUND_ATTACKABLE: + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NOT_SELECTABLE); + me->SetReactState(REACT_AGGRESSIVE); + break; } } - if (me->HasReactState(REACT_AGGRESSIVE)) - DoMeleeAttackIfReady(); + if (events.IsInPhase(PHASE_GROUND)) + { + /* workaround for movechase breaking after blinking + without this noth would just stand there unless his current target moves */ + if (justBlinked && me->GetVictim() && !me->IsWithinMeleeRange(me->EnsureVictim())) + { + me->GetMotionMaster()->Clear(); + me->GetMotionMaster()->MoveChase(me->EnsureVictim()); + justBlinked = false; + } + else + DoMeleeAttackIfReady(); + } } private: - uint32 waveCount; uint32 balconyCount; + + bool justBlinked; + + uint32 _SummonWarriorSpells[N_WARRIOR_SPELLS]; + uint32 _SummonChampionSpells[N_CHAMPION_SPELLS]; + uint32 _SummonGuardianSpells[N_GUARDIAN_SPELLS]; }; CreatureAI* GetAI(Creature* creature) const override diff --git a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp index 3a431ab3ac0..692e6d8b589 100644 --- a/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp +++ b/src/server/scripts/Northrend/Naxxramas/instance_naxxramas.cpp @@ -78,12 +78,13 @@ ObjectData const objectData[] = { 0, 0, } }; -float const HeiganPos[2] = { 2796.0f, -3707.0f }; +// from P2 teleport spell stored target +float const HeiganPos[2] = { 2793.86f, -3707.38f }; float const HeiganEruptionSlope[3] = { - (-3685.0f - HeiganPos[1]) / (2724.0f - HeiganPos[0]), - (-3647.0f - HeiganPos[1]) / (2749.0f - HeiganPos[0]), - (-3637.0f - HeiganPos[1]) / (2771.0f - HeiganPos[0]) + (-3703.303223f - HeiganPos[1]) / (2777.494141f - HeiganPos[0]), // between right center and far right + (-3696.948242f - HeiganPos[1]) / (2785.624268f - HeiganPos[0]), // between left and right halves + (-3691.880615f - HeiganPos[1]) / (2790.280029f - HeiganPos[0]) // between far left and left center }; // 0 H x @@ -246,7 +247,6 @@ class instance_naxxramas : public InstanceMapScript if (go->GetGOInfo()->displayId == 6785 || go->GetGOInfo()->displayId == 1287) { uint32 section = GetEruptionSection(go->GetPositionX(), go->GetPositionY()); - HeiganEruptionGUID[section].erase(go->GetGUID()); return; } @@ -552,7 +552,7 @@ class instance_naxxramas : public InstanceMapScript // This Function is called in CheckAchievementCriteriaMeet and CheckAchievementCriteriaMeet is called before SetBossState(bossId, DONE), // so to check if all bosses are done the checker must exclude 1 boss, the last done, if there is at most 1 encouter in progress when is // called this function then all bosses are done. The one boss that check is the boss that calls this function, so it is dead. - bool AreAllEncoutersDone() + bool AreAllEncountersDone() { uint32 numBossAlive = 0; for (uint32 i = 0; i < EncounterCount; ++i) @@ -589,7 +589,7 @@ class instance_naxxramas : public InstanceMapScript case 13239: // Loatheb case 13240: // Thaddius case 7617: // Kel'Thuzad - if (AreAllEncoutersDone() && !playerDied) + if (AreAllEncountersDone() && !playerDied) return true; return false; } diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index 0ab7c2fcb54..ca8c9a9ef93 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -3424,7 +3424,7 @@ class spell_gen_turkey_marker : public SpellScriptLoader void Register() override { - AfterEffectApply += AuraEffectApplyFn(spell_gen_turkey_marker_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterEffectApply += AuraEffectApplyFn(spell_gen_turkey_marker_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_turkey_marker_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); } diff --git a/src/server/scripts/World/npc_professions.cpp b/src/server/scripts/World/npc_professions.cpp index 44411b20aaf..9c05e4e2c08 100644 --- a/src/server/scripts/World/npc_professions.cpp +++ b/src/server/scripts/World/npc_professions.cpp @@ -179,6 +179,52 @@ enum ProfessionSpells }; /*### +# specialization trainers +###*/ +enum SpecializationTrainers +{ + /* Alchemy */ + N_TRAINER_TRANSMUTE = 22427, // Zarevhi + N_TRAINER_ELIXIR = 19052, // Lorokeem + N_TRAINER_POTION = 17909, // Lauranna Thar'well + + /* Blacksmithing */ + N_TRAINER_SMITHOMNI1 = 11145, // Myolor Sunderfury + N_TRAINER_SMITHOMNI2 = 11176, // Krathok Moltenfist + N_TRAINER_WEAPON1 = 11146, // Ironus Coldsteel + N_TRAINER_WEAPON2 = 11178, // Borgosh Corebender + N_TRAINER_ARMOR1 = 5164, // Grumnus Steelshaper + N_TRAINER_ARMOR2 = 11177, // Okothos Ironrager + N_TRAINER_HAMMER = 11191, // Lilith the Lithe + N_TRAINER_AXE = 11192, // Kilram + N_TRAINER_SWORD = 11193, // Seril Scourgebane + + /* Leatherworking */ + N_TRAINER_DRAGON1 = 7866, // Peter Galen + N_TRAINER_DRAGON2 = 7867, // Thorkaf Dragoneye + N_TRAINER_ELEMENTAL1 = 7868, // Sarah Tanner + N_TRAINER_ELEMENTAL2 = 7869, // Brumn Winterhoof + N_TRAINER_TRIBAL1 = 7870, // Caryssia Moonhunter + N_TRAINER_TRIBAL2 = 7871, // Se'Jib + + /* Tailoring */ + N_TRAINER_SPELLFIRE = 22213, // Gidge Spellweaver + N_TRAINER_MOONCLOTH = 22208, // Nasmara Moonsong + N_TRAINER_SHADOWEAVE = 22212, // Andrion Darkspinner +}; + +/*### +# specialization quests +###*/ +enum SpecializationQuests +{ + /* Alchemy */ + Q_MASTER_TRANSMUTE = 10899, + Q_MASTER_ELIXIR = 10902, + Q_MASTER_POTION = 10897, +}; + +/*### # formulas to calculate unlearning cost ###*/ @@ -395,23 +441,23 @@ public: if (player->HasSkill(SKILL_ALCHEMY) && player->GetBaseSkillValue(SKILL_ALCHEMY) >= 350 && player->getLevel() > 67) { - if (player->GetQuestRewardStatus(10899) || player->GetQuestRewardStatus(10902) || player->GetQuestRewardStatus(10897)) + if (player->GetQuestRewardStatus(Q_MASTER_TRANSMUTE) || player->GetQuestRewardStatus(Q_MASTER_ELIXIR) || player->GetQuestRewardStatus(Q_MASTER_POTION)) { switch (creature->GetEntry()) { - case 22427: //Zarevhi + case N_TRAINER_TRANSMUTE: //Zarevhi if (!HasAlchemySpell(player)) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_TRANSMUTE, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 1); if (player->HasSpell(S_TRANSMUTE)) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_TRANSMUTE, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 4); break; - case 19052: //Lorokeem + case N_TRAINER_ELIXIR: //Lorokeem if (!HasAlchemySpell(player)) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_ELIXIR, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 2); if (player->HasSpell(S_ELIXIR)) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_ELIXIR, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 5); break; - case 17909: //Lauranna Thar'well + case N_TRAINER_POTION: //Lauranna Thar'well if (!HasAlchemySpell(player)) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_POTION, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 3); if (player->HasSpell(S_POTION)) @@ -464,17 +510,17 @@ public: { switch (creature->GetEntry()) { - case 22427: + case N_TRAINER_TRANSMUTE: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_TRANSMUTE, GOSSIP_SENDER_CHECK, action); //unknown textID () player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; - case 19052: + case N_TRAINER_ELIXIR: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_ELIXIR, GOSSIP_SENDER_CHECK, action); //unknown textID () player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; - case 17909: + case N_TRAINER_POTION: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_POTION, GOSSIP_SENDER_CHECK, action); //unknown textID () player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); @@ -489,17 +535,17 @@ public: { switch (creature->GetEntry()) { - case 22427: //Zarevhi + case N_TRAINER_TRANSMUTE: player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_TRANSMUTE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ALCHEMY_SPEC, DoHighUnlearnCost(player), false); //unknown textID () player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; - case 19052: //Lorokeem + case N_TRAINER_ELIXIR: player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_ELIXIR, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ALCHEMY_SPEC, DoHighUnlearnCost(player), false); //unknown textID () player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; - case 17909: //Lauranna Thar'well + case N_TRAINER_POTION: player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_POTION, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ALCHEMY_SPEC, DoHighUnlearnCost(player), false); //unknown textID () player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); @@ -564,20 +610,20 @@ public: { switch (creatureId) { - case 11145: //Myolor Sunderfury - case 11176: //Krathok Moltenfist + case N_TRAINER_SMITHOMNI1: + case N_TRAINER_SMITHOMNI2: if (!player->HasSpell(S_ARMOR) && !player->HasSpell(S_WEAPON) && player->GetReputationRank(REP_ARMOR) >= REP_FRIENDLY) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ARMOR_LEARN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); if (!player->HasSpell(S_WEAPON) && !player->HasSpell(S_ARMOR) && player->GetReputationRank(REP_WEAPON) >= REP_FRIENDLY) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_WEAPON_LEARN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); break; - case 11146: //Ironus Coldsteel - case 11178: //Borgosh Corebender + case N_TRAINER_WEAPON1: + case N_TRAINER_WEAPON2: if (player->HasSpell(S_WEAPON)) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_WEAPON_UNLEARN, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 3); break; - case 5164: //Grumnus Steelshaper - case 11177: //Okothos Ironrager + case N_TRAINER_ARMOR1: + case N_TRAINER_ARMOR2: if (player->HasSpell(S_ARMOR)) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ARMOR_UNLEARN, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 4); break; @@ -588,19 +634,19 @@ public: { switch (creatureId) { - case 11191: //Lilith the Lithe + case N_TRAINER_HAMMER: if (!HasWeaponSub(player)) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_HAMMER, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 5); if (player->HasSpell(S_HAMMER)) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_HAMMER, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 8); break; - case 11192: //Kilram + case N_TRAINER_AXE: if (!HasWeaponSub(player)) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_AXE, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 6); if (player->HasSpell(S_AXE)) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_AXE, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 9); break; - case 11193: //Seril Scourgebane + case N_TRAINER_SWORD: if (!HasWeaponSub(player)) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_SWORD, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 7); if (player->HasSpell(S_SWORD)) @@ -685,17 +731,17 @@ public: { switch (creature->GetEntry()) { - case 11191: + case N_TRAINER_HAMMER: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_HAMMER, GOSSIP_SENDER_CHECK, action); //unknown textID (TALK_HAMMER_LEARN) player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; - case 11192: + case N_TRAINER_AXE: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_AXE, GOSSIP_SENDER_CHECK, action); //unknown textID (TALK_AXE_LEARN) player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; - case 11193: + case N_TRAINER_SWORD: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_SWORD, GOSSIP_SENDER_CHECK, action); //unknown textID (TALK_SWORD_LEARN) player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); @@ -710,26 +756,26 @@ public: { switch (creature->GetEntry()) { - case 11146: //Ironus Coldsteel - case 11178: //Borgosh Corebender - case 5164: //Grumnus Steelshaper - case 11177: //Okothos Ironrager + case N_TRAINER_WEAPON1: + case N_TRAINER_WEAPON2: + case N_TRAINER_ARMOR1: + case N_TRAINER_ARMOR2: player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_SMITH_SPEC, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_ARMORORWEAPON, DoLowUnlearnCost(player), false); //unknown textID (TALK_UNLEARN_AXEORWEAPON) player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; - case 11191: + case N_TRAINER_HAMMER: player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_HAMMER, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false); //unknown textID (TALK_HAMMER_UNLEARN) player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; - case 11192: + case N_TRAINER_AXE: player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_AXE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false); //unknown textID (TALK_AXE_UNLEARN) player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; - case 11193: + case N_TRAINER_SWORD: player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_SWORD, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_WEAPON_SPEC, DoMedUnlearnCost(player), false); //unknown textID (TALK_SWORD_UNLEARN) player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); @@ -901,18 +947,18 @@ public: { switch (creature->GetEntry()) { - case 7866: //Peter Galen - case 7867: //Thorkaf Dragoneye + case N_TRAINER_DRAGON1: + case N_TRAINER_DRAGON2: if (player->HasSpell(S_DRAGON)) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_DRAGON, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 1); break; - case 7868: //Sarah Tanner - case 7869: //Brumn Winterhoof + case N_TRAINER_ELEMENTAL1: + case N_TRAINER_ELEMENTAL2: if (player->HasSpell(S_ELEMENTAL)) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_ELEMENTAL, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 2); break; - case 7870: //Caryssia Moonhunter - case 7871: //Se'Jib + case N_TRAINER_TRIBAL1: + case N_TRAINER_TRIBAL2: if (player->HasSpell(S_TRIBAL)) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_TRIBAL, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 3); break; @@ -952,20 +998,20 @@ public: { switch (creature->GetEntry()) { - case 7866: //Peter Galen - case 7867: //Thorkaf Dragoneye + case N_TRAINER_DRAGON1: + case N_TRAINER_DRAGON2: player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_DRAGON, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_LEATHER_SPEC, DoMedUnlearnCost(player), false); //unknown textID () player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; - case 7868: //Sarah Tanner - case 7869: //Brumn Winterhoof + case N_TRAINER_ELEMENTAL1: + case N_TRAINER_ELEMENTAL2: player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_ELEMENTAL, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_LEATHER_SPEC, DoMedUnlearnCost(player), false); //unknown textID () player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; - case 7870: //Caryssia Moonhunter - case 7871: //Se'Jib + case N_TRAINER_TRIBAL1: + case N_TRAINER_TRIBAL2: player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_TRIBAL, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_LEATHER_SPEC, DoMedUnlearnCost(player), false); //unknown textID () player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); @@ -1027,19 +1073,19 @@ public: { switch (creature->GetEntry()) { - case 22213: //Gidge Spellweaver + case N_TRAINER_SPELLFIRE: if (!HasTailorSpell(player)) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_SPELLFIRE, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 1); if (player->HasSpell(S_SPELLFIRE)) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_SPELLFIRE, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 4); break; - case 22208: //Nasmara Moonsong + case N_TRAINER_MOONCLOTH: if (!HasTailorSpell(player)) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_MOONCLOTH, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 2); if (player->HasSpell(S_MOONCLOTH)) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_UNLEARN_MOONCLOTH, GOSSIP_SENDER_UNLEARN, GOSSIP_ACTION_INFO_DEF + 5); break; - case 22212: //Andrion Darkspinner + case N_TRAINER_SHADOWEAVE: if (!HasTailorSpell(player)) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_SHADOWEAVE, GOSSIP_SENDER_LEARN, GOSSIP_ACTION_INFO_DEF + 3); if (player->HasSpell(S_SHADOWEAVE)) @@ -1092,17 +1138,17 @@ public: { switch (creature->GetEntry()) { - case 22213: + case N_TRAINER_SPELLFIRE: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_SPELLFIRE, GOSSIP_SENDER_CHECK, action); //unknown textID () player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; - case 22208: + case N_TRAINER_MOONCLOTH: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_MOONCLOTH, GOSSIP_SENDER_CHECK, action); //unknown textID () player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; - case 22212: + case N_TRAINER_SHADOWEAVE: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_LEARN_SHADOWEAVE, GOSSIP_SENDER_CHECK, action); //unknown textID () player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); @@ -1117,17 +1163,17 @@ public: { switch (creature->GetEntry()) { - case 22213: //Gidge Spellweaver + case N_TRAINER_SPELLFIRE: player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_SPELLFIRE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false); //unknown textID () player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; - case 22208: //Nasmara Moonsong + case N_TRAINER_MOONCLOTH: player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_MOONCLOTH, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false); //unknown textID () player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; - case 22212: //Andrion Darkspinner + case N_TRAINER_SHADOWEAVE: player->ADD_GOSSIP_ITEM_EXTENDED(0, GOSSIP_UNLEARN_SHADOWEAVE, GOSSIP_SENDER_CHECK, action, BOX_UNLEARN_TAILOR_SPEC, DoHighUnlearnCost(player), false); //unknown textID () player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); |