diff options
48 files changed, 1089 insertions, 416 deletions
diff --git a/sql/updates/world/2014_08_12_01_world_misc.sql b/sql/updates/world/2014_08_12_01_world_misc.sql new file mode 100644 index 00000000000..a1e386b16a0 --- /dev/null +++ b/sql/updates/world/2014_08_12_01_world_misc.sql @@ -0,0 +1,3 @@ +UPDATE `quest_template` SET `SpecialFlags`=2 WHERE `Id` IN(10321,10322,10323,10329,1330,10338,10365); +UPDATE `smart_scripts` SET `event_param4`=75000 WHERE `entryorguid`=17953 AND `source_type`=0 AND `id`=1 AND `link`=2; +UPDATE `smart_scripts` SET `event_param1`=0 WHERE `entryorguid`=2021806 AND `source_type`=9 AND `id`=0 AND `link`=0; diff --git a/sql/updates/world/2014_08_13_00_world_sai.sql b/sql/updates/world/2014_08_13_00_world_sai.sql new file mode 100644 index 00000000000..e478edd86b3 --- /dev/null +++ b/sql/updates/world/2014_08_13_00_world_sai.sql @@ -0,0 +1,95 @@ +DELETE FROM `creature_text` WHERE `entry` IN(23782,24126,27248,27250,27349); + +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`, `BroadcastTextID`) VALUES +(24126, 0, 0, 'Excellent. What''s the lowdown? Do we have a bodycount?', 12, 0, 100, 11, 0, 0, 'Apothecary Lysander',22797), +(24126, 1, 0, 'Well, spit it out! What''s the bad news?', 12, 0, 100, 1, 0, 0, 'Apothecary Lysander',22798), +(24126, 2, 0, 'Severe stomach pain?', 12, 0, 100, 5, 0, 0, 'Apothecary Lysander',22800), +(24126, 3, 0, 'SEVERE STOMACH PAIN?', 14, 0, 100, 15, 0, 0, 'Apothecary Lysander',22801), +(24126, 4, 0, 'We are the Royal Apothecary Society! Inducing belly aches is not part of our job description!', 12, 0, 100, 0, 0, 0, 'Apothecary Lysander',22802), +(24126, 5, 0, 'Am I surrounded by amateurs? I want a full analysis of the new strain by tomorrow morning! Get on it, Ravien!', 12, 0, 100, 25, 0, 0, 'Apothecary Lysander',22803), +(24126, 6, 0, 'We were making progress with our plague in Undercity. All of a sudden our strains keep failing!', 12, 0, 100, 5, 0, 0, 'Apothecary Lysander',22406), +(24126, 6, 1, 'The last ten strains from Undercity... all of them worthless!', 12, 0, 100, 5, 0, 0, 'Apothecary Lysander',22403), +(24126, 6, 2, 'I cannot work under these conditions! We need a viable strain!', 12, 0, 100, 5, 0, 0, 'Apothecary Lysander',22404), +(23782, 0, 0, 'Reports from the test on the enemy fleet have come in, sir!', 12, 0, 100, 1, 0, 0, 'Apothecary Ravien',22793), +(23782, 1, 0, 'Well... the good news is we forced the reinforcements to turn back.', 12, 0, 100, 6, 0, 0, 'Apothecary Ravien',22794), +(23782, 2, 0, 'The plague was not quite... fatal. However, reports of harmful effects include nausea, loss of equilibrium and severe stomach pain.', 12, 0, 100, 274, 0, 0, 'Apothecary Ravien',22795), +(23782, 3, 0, 'Yes, sir!', 12, 0, 100, 273, 0, 0, 'Apothecary Ravien',22796), +(27349, 0, 0, 'The %s moans but seems otherwise unaffected by the blight.', 16, 0, 100, 0, 0, 0, 'Scarlet Onslaught Prisoner',26389), +(27250, 0, 0, 'Huh?', 12, 0, 100, 6, 0, 0, 'Junior Apothecary Schlemiel',26274), +(27250, 1, 0, 'But... I followed your instructions precisely! Sorry?', 12, 0, 100, 6, 0, 0, 'Junior Apothecary Schlemiel',26277), +(27250, 2, 0, 'Eep!', 12, 0, 100, 34, 0, 1368, 'Junior Apothecary Schlemiel',26281), +(27248, 0, 0, 'Schlemiel!', 12, 0, 100, 5, 0, 0, 'Apothecary Vicky Levine',26273), +(27248, 1, 0, 'Apparently you flubbed this batch of blight. What do you have to say for yourself?', 12, 0, 100, 5, 0, 0, 'Apothecary Vicky Levine',26275), +(27248, 2, 0, 'Sorry? SORRY?! Here''s sorry for you!', 12, 0, 100, 5, 0, 0, 'Apothecary Vicky Levine',26279), +(27248, 3, 0, 'Oops. I guess it IS working! That''s odd.', 12, 0, 100, 6, 0, 0, 'Apothecary Vicky Levine',26280), +(27248, 4, 0, 'I''m gonna need a cleanup and a new assistant over here!', 12, 0, 100, 5, 0, 0, 'Apothecary Vicky Levine',26289); + +UPDATE `creature_template` SET `ainame`='SmartAI', `scriptname`='' WHERE `entry` IN(23782,24126,27248,27250); +DELETE FROM `smart_scripts` WHERE `entryorguid` IN(23782,24126,27248,27250) AND `source_type`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid` IN(2412600,2412601,2724800) AND `source_type`=9; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(24126, 0, 0, 0, 20, 0, 100, 0, 11170, 0, 0, 0, 80, 2412600, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Lysander - On Quest Reward - Run Script 1'), +(24126, 0, 1, 0, 38, 0, 100, 0, 1, 1, 0, 0, 80, 2412601, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Lysander - On Data Set - Run Script 2'), +(24126, 0, 2, 3, 38, 0, 100, 0, 2, 2, 0, 0, 81, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Lysander - On Data Set - Set NPC Flags'), +(24126, 0, 3, 0, 61, 0, 100, 0, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Lysander - On Data Set - Set Phase 1'), +(24126, 0, 4, 0, 25, 0, 100, 0, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Lysander - On Reset - Set Phase 1'), +(24126, 0, 5, 0, 1, 1, 100, 0, 0, 30000, 30000, 90000, 1, 6, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Lysander - OOC (Phase 1) - Say'), +(23782, 0, 0, 0, 54, 0, 100, 0, 0, 0, 0, 0, 53, 0, 23782, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Ravien - On Just Summoned - Start WP'), +(23782, 0, 1, 2, 40, 0, 100, 0, 6, 23782, 0, 0, 54, 60000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Ravien - On Reached WP6 - Pause WP'), +(23782, 0, 2, 3, 61, 0, 100, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 19, 24126, 0, 0, 0, 0, 0, 0, 'Apothecary Ravien - On Reached WP6 - Set Orientation'), +(23782, 0, 3, 0, 61, 0, 100, 0, 0, 0, 0, 0, 45, 1, 1, 0, 0, 0, 0, 19, 24126, 0, 0, 0, 0, 0, 0, 'Apothecary Ravien - On Reached WP6 - Set Data on Apothecary Lysander'), +(23782, 0, 4, 0, 40, 0, 100, 0, 7, 23782, 0, 0, 45, 2, 2, 0, 0, 0, 0, 19,24126, 0, 0, 0, 0, 0, 0, 'Apothecary Ravien - On Reached WP7 - Set Data on Apothecary Lysander'), +(23782, 0, 5, 0, 40, 0, 100, 0,18, 23782, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1,0, 0, 0, 0, 0, 0, 0, 'Apothecary Ravien - On Reached WP18 - Despawn'), +(27250, 0, 0, 1, 8, 0, 100, 0,48201, 0, 0, 0, 11, 48196, 0, 0, 0, 0, 0, 1,0, 0, 0, 0, 0, 0, 0, 'Junior Apothecary Schlemiel - On Spellhit (Throw Blight) - Cast Blighted'), +(27250, 0, 1, 2, 61, 0, 100, 0,0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1,0, 0, 0, 0, 0, 0, 0, 'Junior Apothecary Schlemiel - On Spellhit (Throw Blight) - Set Phase 1'), +(27250, 0, 2, 0, 61, 0, 100, 0,0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 1,0, 0, 0, 0, 0, 0, 0, 'Junior Apothecary Schlemiel - On Spellhit (Throw Blight) - Say Line 3'), +(27250, 0, 3, 0, 1, 1, 100, 0,5000, 5000, 0, 0, 37, 0, 0, 0, 0, 0, 0, 1,0, 0, 0, 0, 0, 0, 0, 'Junior Apothecary Schlemiel - OOC (Phase 1) - Die'), +(27248, 0, 0, 0, 20, 0, 100, 0, 12206, 0, 0, 0, 80, 2724800, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Vicky Levine - On Quest Reward - Run Script'), +(2724800, 9,0,0,0,0,100,0,0,0,0,0,81,0,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Apothecary Vicky Levine - Script - Set NPC Flags'), +(2724800, 9,1,0,0,0,100,0,0,0,0,0,66,0,0,0,0,0,0,19,27250,0,0,0, 0, 0, 0,'Apothecary Vicky Levine - Script - Set Orientation'), +(2724800, 9,2,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Apothecary Vicky Levine - Script - Say Line 1'), +(2724800, 9,3,0,0,0,100,0,6000,6000,0,0,1,0,0,0,0,0,0,19,27250,0,0,0, 0, 0, 0,'Apothecary Vicky Levine - Script - Say Line 1 (Junior Apothecary Schlemiel)'), +(2724800, 9,4,0,0,0,100,0,6000,6000,0,0,1,1,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Apothecary Vicky Levine - Script - Say Line 2'), +(2724800, 9,5,0,0,0,100,0,6000,6000,0,0,1,1,0,0,0,0,0,19,27250,0,0,0, 0, 0, 0,'Apothecary Vicky Levine - Script - Say Line 2 (Junior Apothecary Schlemiel)'), +(2724800, 9,6,0,0,0,100,0,6000,6000,0,0,1,2,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Apothecary Vicky Levine - Script - Say Line 3'), +(2724800, 9,7,0,0,0,100,0,0,0,0,0,11,48201,0,0,0,0,0,19,27250,0,0,0, 0, 0, 0,'Apothecary Vicky Levine - Script - Cast Throw Blight'), +(2724800, 9,8,0,0,0,100,0,7000,7000,0,0,1,3,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Apothecary Vicky Levine - Script - Say Line 4'), +(2724800, 9,9,0,0,0,100,0,6000,6000,0,0,1,4,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Apothecary Vicky Levine - Script - Say Line 5'), +(2724800, 9,10,0,0,0,100,0,0,0,0,0,81,2,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Apothecary Vicky Levine - Script - Set NPC Flags'), +(2412600, 9,0,0,0,0,100,0,0,0,0,0,12,23782,1,90000,0,0,0,8,0,0,0,1965.131, -6126.74, 25.61264, 3.271674,'Apothecary Lysander - Script 1 - Spawn Apothecary Ravien'), +(2412600, 9,1,0,0,0,100,0,0,0,0,0,81,0,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Apothecary Lysander - Script 1 - Set NPC Flags'), +(2412600, 9,2,0,0,0,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Apothecary Lysander - Script 1 - Set Phase 0'), +(2412601, 9,0,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,19,23782,0,0,0, 0, 0, 0,'Apothecary Lysander - Script 2 - Say Line 1 (Apothecary Ravien)'), +(2412601, 9,1,0,0,0,100,0,6000,6000,0,0,1,0,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Apothecary Lysander - Script 2 - Say Line 1'), +(2412601, 9,2,0,0,0,100,0,6000,6000,0,0,1,1,0,0,0,0,0,19,23782,0,0,0, 0, 0, 0,'Apothecary Lysander - Script 2 - Say Line 2 (Apothecary Ravien)'), +(2412601, 9,3,0,0,0,100,0,6000,6000,0,0,1,1,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Apothecary Lysander - Script 2 - Say Line 2'), +(2412601, 9,4,0,0,0,100,0,6000,6000,0,0,1,2,0,0,0,0,0,19,23782,0,0,0, 0, 0, 0,'Apothecary Lysander - Script 2 - Say Line 3 (Apothecary Ravien)'), +(2412601, 9,5,0,0,0,100,0,6000,6000,0,0,1,2,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Apothecary Lysander - Script 2 - Say Line 3'), +(2412601, 9,6,0,0,0,100,0,6000,6000,0,0,1,3,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Apothecary Lysander - Script 2 - Say Line 4'), +(2412601, 9,7,0,0,0,100,0,6000,6000,0,0,1,4,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Apothecary Lysander - Script 2 - Say Line 5'), +(2412601, 9,8,0,0,0,100,0,6000,6000,0,0,1,5,0,0,0,0,0,1,0,0,0,0, 0, 0, 0,'Apothecary Lysander - Script 2 - Say Line 6'), +(2412601, 9,9,0,0,0,100,0,6000,6000,0,0,1,3,0,0,0,0,0,19,23782,0,0,0, 0, 0, 0,'Apothecary Lysander - Script 2 - Say Line 4 (Apothecary Ravien)'); + +UPDATE `smart_scripts` SET `event_flags`=0 WHERE `entryorguid`=27349 AND `source_type`=0 AND `id`=0 AND `link`=1; +UPDATE `smart_scripts` SET `link`=0, `event_flags`=0, `action_type`=1,`comment`='Scarlet Onslaught Prisoner - On Spellhit \'Flask of Blight\' - Say' WHERE `entryorguid`=27349 AND `source_type`=0 AND `id`=1 AND `link`=2; + +DELETE FROM `waypoints` WHERE `entry` IN(23782); +INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES +(23782,1, 1950.98, -6131.159, 24.8696,'Apothecary Ravien'), +(23782,2, 1946.992, -6136.564, 24.37891,'Apothecary Ravien'), +(23782,3, 1946.492, -6139.314, 24.37891,'Apothecary Ravien'), +(23782,4, 1946.492, -6140.314, 24.37891,'Apothecary Ravien'), +(23782,5, 1946.492, -6141.314, 24.37891,'Apothecary Ravien'), +(23782,6, 1946.492, -6142.564, 24.37891,'Apothecary Ravien'), -- Event +(23782,7, 1946.487, -6142.437, 24.39008,'Apothecary Ravien'), +(23782,8, 1946.487, -6141.437, 24.39008,'Apothecary Ravien'), +(23782,9, 1946.487, -6140.437, 24.39008,'Apothecary Ravien'), +(23782,10, 1946.487, -6139.437, 24.39008,'Apothecary Ravien'), +(23782,11, 1947.237, -6137.437, 24.39008,'Apothecary Ravien'), +(23782,12, 1947.051, -6137.372, 24.81357,'Apothecary Ravien'), +(23782,13, 1948.301, -6134.372, 24.81357,'Apothecary Ravien'), +(23782,14, 1950.301, -6133.622, 25.06357,'Apothecary Ravien'), +(23782,15, 1954.051, -6129.622, 25.06357,'Apothecary Ravien'), +(23782,16, 1958.301, -6127.122, 25.56357,'Apothecary Ravien'), +(23782,17, 1958.692, -6127.187, 25.5125,'Apothecary Ravien'), +(23782,18, 1960.692, -6127.187, 26.0125,'Apothecary Ravien'); -- Despawn diff --git a/sql/updates/world/2014_08_14_00_world_gameobject.sql b/sql/updates/world/2014_08_14_00_world_gameobject.sql new file mode 100644 index 00000000000..0cbe21fb11a --- /dev/null +++ b/sql/updates/world/2014_08_14_00_world_gameobject.sql @@ -0,0 +1,4 @@ +SET @OGUID := 5495; +DELETE FROM `gameobject` WHERE `guid`=@OGUID; +INSERT INTO `gameobject` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`animprogress`,`state`) VALUES +(@OGUID,201818,631,15,1,4149.65,2779.59,350.962,0,604800,0,1); diff --git a/sql/updates/world/2014_08_14_01_world_creature_template.sql b/sql/updates/world/2014_08_14_01_world_creature_template.sql new file mode 100644 index 00000000000..8889a424b62 --- /dev/null +++ b/sql/updates/world/2014_08_14_01_world_creature_template.sql @@ -0,0 +1,16 @@ +ALTER TABLE `creature_template` + DROP COLUMN `mindmg`, + DROP COLUMN `maxdmg`, + DROP COLUMN `attackpower`, + DROP COLUMN `minrangedmg`, + DROP COLUMN `maxrangedmg`, + DROP COLUMN `rangedattackpower`, + CHANGE `baseattacktime` `BaseAttackTime` INT(10) UNSIGNED DEFAULT 0 NOT NULL, + CHANGE `rangeattacktime` `RangeAttackTime` INT(10) UNSIGNED DEFAULT 0 NOT NULL, + ADD COLUMN `BaseVariance` FLOAT DEFAULT 1 NOT NULL AFTER `RangeAttackTime`, + ADD COLUMN `RangeVariance` FLOAT DEFAULT 1 NOT NULL AFTER `BaseVariance`, + CHANGE `Health_mod` `HealthModifier` FLOAT DEFAULT 1 NOT NULL, + CHANGE `Mana_mod` `ManaModifier` FLOAT DEFAULT 1 NOT NULL, + CHANGE `Armor_mod` `ArmorModifier` FLOAT DEFAULT 1 NOT NULL, + CHANGE `dmg_multiplier` `DamageModifier` FLOAT DEFAULT 1 NOT NULL AFTER `ArmorModifier`, + ADD COLUMN `ExperienceModifier` FLOAT DEFAULT 1 NOT NULL AFTER `DamageModifier`; diff --git a/sql/updates/world/2014_08_14_02_world_misc.sql b/sql/updates/world/2014_08_14_02_world_misc.sql new file mode 100644 index 00000000000..e08c6f66c74 --- /dev/null +++ b/sql/updates/world/2014_08_14_02_world_misc.sql @@ -0,0 +1,197 @@ +DELETE FROM `creature_text` WHERE `entry` IN(24703,24706,24709,25237,25256,23990,24123,23989,23991,24014,24152,24362); +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`, `BroadcastTextID`) VALUES +(24703, 0, 0, 'The Scourge has us surrounded. We can hold the village for awhile, but if we can''t defeat them, they will overrun us.', 12, 0, 100, 5, 0, 0, 'Chieftain Wintergale',24791), +(24703, 1, 0, 'The time has come to act. We must decide how to deal with the Scourge before it consumes us.', 12, 0, 100, 1, 0, 0, 'Chieftain Wintergale',24807), +(24706, 0, 0, 'The choice is clear. We must attack. I know the odds are against us, but Taunka do not go quietly to the slaughter.', 12, 0, 100, 25, 0, 0, 'Durm Icehide',24792), +(24706, 1, 0, 'I''ll die with my axes in my hands and drenched in the blood of our foes!', 12, 0, 100, 53, 0, 0, 'Durm Icehide',24793), +(24703, 2, 0, 'I won''t sacrifice my warriors for romantic notions of glorious death on the battlefield. What use is fighting for survival if no one survives?', 12, 0, 100, 1, 0, 0, 'Chieftain Wintergale',24798), +(24703, 3, 0, 'There will be a time for battle, Durm. But first, we must find a way to even the odds. What would you have me do, Aeire?', 12, 0, 100, 6, 0, 0, 'Chieftain Wintergale',24799), +(24709, 0, 0, 'The ancestors knew a way to confound an enemy''s senses. We could use this knowledge to discover the Scourge''s weakness or strike at their commanders. Without their leaders, the Scourge would fall before our warriors.', 12, 0, 100, 1, 0, 0, 'Sage Aeire',24800), +(24706, 2, 0, 'A dishonorable scheme.', 12, 0, 100, 274, 0, 0, 'Durm Icehide',24801), +(24703, 4, 0, 'What is your honor worth, Durm? Your life? Mine? The life of blind old Greatfather Mahan, who raised you from childhood?', 12, 0, 100, 1, 0, 0, 'Chieftain Wintergale',24802), +(24703, 5, 0, 'Honor is meaningless to a dead man. A warrior may throw himself into battle for honor''s sake, but a chieftain is responsible for far more. We will follow Sage Aeire''s plan and continue to defend our village.', 12, 0, 100, 1, 0, 0, 'Chieftain Wintergale',24803), +(24709, 1, 0, 'I''ll take those. We can''t have the mighty chieftain cowering in fear of a few hides.', 12, 0, 100, 11, 0, 0, 'Sage Aeire',24811), +(24703, 6, 0, 'Aeire, $n has brought your hides. Please, take them before they make me ill.', 12, 0, 100, 25, 0, 0, 'Chieftain Wintergale',24810), +(25256, 0, 0, 'We are surrounded... Our enemies press in from all sides, young Hellscream.', 12, 1, 100, 1, 0, 0, 'High Overlord Saurfang',24486), +(25256, 1, 0, 'The Scourge descends like locust from the north.', 12, 1, 100, 25, 0, 0, 'High Overlord Saurfang',24487), +(25256, 2, 0, 'The Alliance holds the only secure shipping lane in this region, and even that is at risk of being lost to those dreaded mists.', 12, 1, 100, 25, 0, 0, 'High Overlord Saurfang',24488), +(25256, 3, 0, 'Our only viable port for resupply is held by the Forsaken on the other side of this blasted continent!', 12, 1, 100, 1, 0, 0, 'High Overlord Saurfang',24489), +(25256, 4, 0, 'Anything our zeppelins cannot haul must be brought in by ship and travel the length of Northrend to reach us.', 12, 1, 100, 1, 0, 0, 'High Overlord Saurfang',24490), +(25237, 0, 0, '%s grunts.', 16, 1, 100, 0, 0, 0, 'Garrosh Hellscream',24491), +(25237, 1, 0, 'Shipping lanes... supplies... You bore me to death! We need nothing more than the warrior spirit of the Horde, Saurfang! Now that we are firmly entrenched in this frozen wasteland, nothing shall stop us!', 12, 1, 100, 1, 0, 0, 'Garrosh Hellscream',24492), +(25256, 5, 0, 'Siege engines, ammunition, heavy armor... How do you propose to shatter the walls of Icecrown without those?', 12, 1, 100, 1, 0, 0, 'High Overlord Saurfang',24493), +(25237, 2, 0, 'Propose? I will show you what I propose!', 12, 1, 100, 6, 0, 0, 'Garrosh Hellscream',24494), +(25237, 3, 0, 'There... Now we now have a shipping lane.', 12, 1, 100, 1, 0, 0, 'Garrosh Hellscream',24495), +(25237, 4, 0, 'And just for good measure...', 12, 1, 100, 5, 0, 0, 'Garrosh Hellscream',24496), +(25256, 6, 0, 'So the prodigal son has spoken!', 12, 1, 100, 5, 0, 0, 'High Overlord Saurfang',24997), +(25256, 7, 0, 'Your father''s blood runs strong in you, Hellscream. Impatient as always... Impatient and reckless.', 12, 1, 100, 1, 0, 0, 'High Overlord Saurfang',24498), +(25256, 8, 0, 'You rush headlong into all-out war without a thought of the consequences.', 12, 1, 100, 1, 0, 0, 'High Overlord Saurfang',24500), +(25237, 5, 0, 'Do not speak to me of consequences, old one. ', 12, 1, 100, 25, 0, 0, 'Garrosh Hellscream',24501), +(25256, 9, 0, 'I drank of the same blood your father did, Garrosh. Mannoroth''s cursed venom pumped through my veins as well.', 12, 1, 100, 1, 0, 0, 'High Overlord Saurfang',24502), +(25256, 10, 0, 'I drove my weapons into the bodies and minds of my enemies.', 12, 1, 100, 1, 0, 0, 'High Overlord Saurfang',24503), +(25256, 11, 0, 'And while Grom died a glorious death - freeing us all from the blood curse - he could not wipe away the terrible memory of our past.', 12, 1, 100, 1, 0, 0, 'High Overlord Saurfang',24504), +(25256, 12, 0, 'His act could not erase the horrors we committed. ', 12, 1, 100, 274, 0, 0, 'High Overlord Saurfang',24505), +(25256, 13, 0, '%s pauses.', 16, 1, 100, 0, 0, 0, 'High Overlord Saurfang',24506), +(25256, 14, 0, 'The winter after the curse was lifted, hundreds of veteran orcs like me were lost to despair.', 12, 1, 100, 1, 0, 0, 'High Overlord Saurfang',24507), +(25256, 15, 0, 'Our minds were finally free, yes... Free to relive all of the unthinkable acts that we had performed under the Legions'' influence.', 12, 1, 100, 273, 0, 0, 'High Overlord Saurfang',24508), +(25256, 16, 0, '%s nods.', 16, 1, 100, 273, 0, 0, 'High Overlord Saurfang',24509), +(25256, 17, 0, 'I think it was the sounds of the draenei children that unnerved most of them... You never forget...', 12, 1, 100, 1, 0, 0, 'High Overlord Saurfang',24510), +(25256, 18, 0, 'Have you ever been to Jaggedswine Farm? When the swine are of age for the slaughter... It''s that sound. The sound of the swine being killed... It resonates the loudest. Those are hard times for us older veterans.', 12, 1, 100, 6, 0, 0, 'High Overlord Saurfang',24511), +(25237, 6, 0, 'But surely you cannot think that those children were born into innocence? They would have grown up and taken arms against us!', 12, 1, 100, 5, 0, 0, 'Garrosh Hellscream',24512), +(25256, 19, 0, '%s shakes his head.', 16, 1, 100, 274, 0, 0, 'High Overlord Saurfang',24513), +(25256, 20, 0, 'I am not speaking solely of the children of our enemies...', 12, 1, 100, 1, 0, 0, 'High Overlord Saurfang',24515), +(25256, 21, 0, '%s pauses.', 16, 1, 100, 1, 0, 0, 'High Overlord Saurfang',24506), +(25256, 22, 0, 'I won''t let you take us down that dark path again, young Hellscream. I''ll kill you myself before that day comes...', 12, 1, 100, 274, 0, 0, 'High Overlord Saurfang',24516), +(25237, 7, 0, 'How have you managed to survive for so long, Saurfang? Not fallen victim to your own memories?', 12, 1, 100, 6, 0, 0, 'Garrosh Hellscream',24518), +(25256, 23, 0, 'I don''t eat pork...', 12, 1, 100, 274, 0, 0, 'High Overlord Saurfang',24519), +(25256, 24, 0, '%s spits.', 16, 1, 100, 0, 0, 0, 'High Overlord Saurfang',24520), +(24014, 0, 0, 'You too will serve the Lich King.', 12, 0, 100, 0, 0, 0, 'Necrolord',23663), +(24014, 0, 1, 'There''s always room for one more.', 12, 0, 100, 0, 0, 13542, 'Necrolord',23669), +(24014, 0, 2, 'Your life for the Lich King!', 12, 0, 100, 0, 0, 0, 'Necrolord',23667), +(24014, 0, 3, 'So eager to die are we?', 12, 0, 100, 0, 0, 0, 'Necrolord',23662), +(24014, 0, 4, 'Hello, little one. Come to play?', 12, 0, 100, 0, 0, 0, 'Necrolord',23666), +(24014, 0, 5, 'I have so many wonders to show you.', 12, 0, 100, 0, 0, 0, 'Necrolord',23668), +(24014, 0, 6, 'Excellent, another sacrificial lamb.', 12, 0, 100, 0, 0, 0, 'Necrolord',23661), +(24014, 0, 7, 'There''s always room for one more.', 12, 0, 100, 0, 0, 0, 'Necrolord',23669), +(24014, 0, 8, 'Plucked ripe off the vine.', 12, 0, 100, 0, 0, 0, 'Necrolord',23678), +(23990, 0, 0, 'I spit on you!', 12, 0, 100, 0, 0, 13538, 'Gjalerbron Rune-Caster',30503), +(23990, 0, 1, 'YAAARRRGH!', 12, 0, 100, 0, 0, 0, 'Gjalerbron Rune-Caster',22700), +(23990, 0, 2, 'Look what''s come to play.', 12, 0, 100, 0, 0, 0, 'Gjalerbron Rune-Caster',22820), +(23990, 0, 3, 'Your entrails will make a fine necklace.', 12, 0, 100, 0, 0, 13535, 'Gjalerbron Rune-Caster',30500), +(24123, 0, 0, 'These are all excellent. It''s going to be hard to choose just one.', 12, 0, 100, 1, 0, 0, 'Nokoma Snowseer',22854), +(24123, 1, 0, 'I think I''ve found the one I''ll use. Now I have to begin the task of carving it. I don''t think it''s going to be easy. I don''t even know what a female yeti''s mating call sounds like!', 12, 0, 100, 396, 0, 0, 'Nokoma Snowseer',22855), +(24123, 2, 0, 'I''ve got most of the basic carving done, but it needs to be tested before I can continue. Are you willing to help me with that, $n?', 12, 0, 100, 396, 0, 0, 'Nokoma Snowseer',22856), +(24152, 0, 0, 'Wait a minute...', 12, 0, 100, 5, 0, 0, 'Apothecary Malthus',22958), +(24152, 1, 0, 'It''s just...', 12, 0, 100, 6, 0, 0, 'Apothecary Malthus',22959), +(24152, 2, 0, 'Beer! Mere beer!', 12, 0, 100, 1, 0, 0, 'Apothecary Malthus',22960), +(24152, 3, 0, 'There''s absolutely nothing out of the ordinary about it.', 12, 0, 100, 1, 0, 0, 'Apothecary Malthus',22961), +(24152, 4, 0, 'You! Not a word to Grick about this! Do you hear me?', 12, 0, 100, 25, 0, 0, 'Apothecary Malthus',22962), +(23989, 0, 0, 'I''ll eat your heart!', 12, 0, 100, 0, 0, 13542, 'Gjalerbron Sleep-Watcher',30508), +(23989, 0, 1, 'YAAARRRGH!', 12, 0, 100, 0, 0, 13542, 'Gjalerbron Sleep-Watcher',22700), +(23989, 0, 2, 'I will take pleasure in gutting you!', 12, 0, 100, 0, 0, 13533, 'Gjalerbron Sleep-Watcher',30498), +(23989, 0, 3, 'YAAARRRGH!', 12, 0, 100, 0, 0, 0, 'Gjalerbron Sleep-Watcher',22700), +(23989, 0, 4, 'There will be no everlasting life for you!', 12, 0, 100, 0, 0, 0, 'Gjalerbron Sleep-Watcher',22822), +(23989, 0, 5, 'Sniveling pig!', 12, 0, 100, 0, 0, 0, 'Gjalerbron Sleep-Watcher',30504), +(23989, 0, 6, 'Haraak foln!', 12, 0, 100, 0, 0, 0, 'Gjalerbron Sleep-Watcher',30506), +(23991, 0, 0, 'I will feed you to the dogs!', 12, 0, 100, 0, 0, 13534, 'Gjalerbron Warrior',30499), +(23991, 0, 1, 'I''ll eat your heart!', 12, 0, 100, 0, 0, 13542, 'Gjalerbron Warrior',30508), +(23991, 0, 2, 'Look what''s come to play.', 12, 0, 100, 0, 0, 13542, 'Gjalerbron Warrior',22820), +(23991, 0, 3, 'My life for Ymiron!', 12, 0, 100, 0, 0, 0, 'Gjalerbron Warrior',22702), +(23991, 0, 4, 'I spit on you!', 12, 0, 100, 0, 0, 13538, 'Gjalerbron Warrior',30503), +(23991, 0, 5, 'You tiny creatures disgust me!', 12, 0, 100, 0, 0, 0, 'Gjalerbron Warrior',22816), +(23991, 0, 6, 'You tiny creatures disgust me!', 12, 0, 100, 0, 0, 13542, 'Gjalerbron Warrior',22816), +(23991, 0, 7, 'Your entrails will make a fine necklace.', 12, 0, 100, 0, 0, 13535, 'Gjalerbron Warrior',30500), +(23991, 0, 8, 'YAAARRRGH!', 12, 0, 100, 0, 0, 13535, 'Gjalerbron Warrior',22700), +(23991, 0, 9, 'For Ymiron!', 12, 0, 100, 0, 0, 0, 'Gjalerbron Warrior',22697), +(24362, 0, 0, 'They keep their tools in boxes that look like this. Look for them near the pavilions.', 12, 0, 100, 25, 0, 0, 'Longrunner Pembe',23552), +(24362, 1, 0, 'I''m only going to carve the runes I think will give you command over a giant.', 12, 0, 100, 1, 0, 0, 'Longrunner Pembe',23246), +(24362, 2, 0, 'I''m omitting the runes for "north" and "west" because I''m not sure how they impact the giant. I''m also including a rune to limit how long you can control it.', 12, 0, 100, 0, 0, 0, 'Longrunner Pembe',23247), +(24362, 3, 0, 'There we go, the Rune of Command... hopefully. Not nearly as vicious as its Iron Dwarf cousin, but functional.', 12, 0, 100, 1, 0, 0, 'Longrunner Pembe',23248); + +UPDATE `creature_template` SET `ainame`='SmartAI', `scriptname`='' WHERE `entry` IN(25256,24703,25237,24014,23991,23989,23990,24152,24123,24362); + +DELETE FROM `smart_scripts` WHERE `entryorguid` IN(25256,24703,25237,24014,23991,23989,23990,24152,24123,24362) AND `source_type`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid` IN(2525600,2470300,2415200,2412300) AND `source_type`=9; + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceEntry`=25256 ; + +DELETE FROM `waypoints` WHERE `entry` IN(2523700,2523701); +INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES +(2523700,1, 2836.876, 6186.151, 84.93269,'Garrosh Hellscream (Path 1)'), +(2523700,2, 2835.618, 6183.708, 84.93269,'Garrosh Hellscream (Path 1)'), +(2523700,3, 2838.32, 6187.36, 84.6827,'Garrosh Hellscream (Path 1)'), +(2523701,1, 2834.367, 6182.802, 84.93269,'Garrosh Hellscream (Path 2)'), +(2523701,2, 2833.117, 6185.052, 84.93269,'Garrosh Hellscream (Path 2)'), +(2523701,3, 2832.875, 6185.245, 84.93269,'Garrosh Hellscream (Path 2)'), +(2523701,4, 2834.375, 6183.995, 84.93269,'Garrosh Hellscream (Path 2)'), +(2523701,5, 2838.32, 6187.36, 84.6827,'Garrosh Hellscream (Path 2)'); + +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(24014, 0, 0, 0, 4, 0, 50, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Necrolord - On Agro - Say'), +(23989, 0, 0, 0, 4, 0, 50, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Gjalerbron Sleep-Watcher - On Agro - Say'), +(23990, 0, 0, 0, 4, 0, 50, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Gjalerbron Rune-Caster - On Agro - Say'), +(23991, 0, 0, 0, 4, 0, 50, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Gjalerbron Warrior - On Agro - Say'), +(24152, 0, 0, 0, 20, 0, 100, 0, 11298, 0, 0, 0, 80, 2415200, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Malthus <Royal Apothecary Society> - On Quest Reward (Whats in that brew?) - Run Script'), +(24123, 0, 0, 0, 20, 0, 100, 0, 11275, 0, 0, 0, 80, 2412300, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Nokoma Snowseer - On Quest Reward (Making The Horn) - Run Script'), +(25256, 0, 0, 0, 1, 0, 100, 0, 0, 0, 300000, 450000, 80, 2525600, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - OOC - Run Script'), +(25237, 0, 0, 6, 40, 0, 100, 0, 2, 2523700, 0, 0, 54, 1000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Garrosh Hellscream - On Reached WP 2 (Path 1) - Pause WP'), +(25237, 0, 1, 0, 40, 0, 100, 0, 3, 2523700, 0, 0, 66, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 3.822270, 'Garrosh Hellscream - On Reached WP 3 (Path 1) - Set Orientation'), +(25237, 0, 2, 6, 40, 0, 100, 0, 3, 2523701, 0, 0, 54, 1000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Garrosh Hellscream - On Reached WP 3 (Path 2) - Pause WP'), +(25237, 0, 3, 0, 40, 0, 100, 0, 5, 2523701, 0, 0, 66, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 3.822270, 'Garrosh Hellscream - On Reached WP 5 (Path 2) - Set Orientation'), +(25237, 0, 4, 0, 38, 0, 100, 0, 1, 1, 0, 0, 53, 1, 2523700, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Garrosh Hellscream - On Data Set 1 1 - Start WP (Path 1)'), +(25237, 0, 5, 0, 38, 0, 100, 0, 2, 2, 0, 0, 53, 1, 2523701, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Garrosh Hellscream - On Data Set 2 2 - Start WP (Path 2)'), +(25237, 0, 6, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 45404, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Garrosh Hellscream - Link - Cast Crush Under Foot'), +(24703, 0, 0, 0, 1, 0, 100, 0, 0, 0, 300000, 450000, 80, 2470300, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Chieftain Wintergale - OOC - Run Script'), +(24703, 0, 1, 0, 20, 0, 100, 0, 11628, 0, 0, 0, 1, 6, 7000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Chieftain Wintergale - On Quest Reward (Shrouds of the Scourge) - Say Line 7'), +(24703, 0, 2, 0, 52, 0, 100, 0, 6, 24703, 0, 0, 1, 1, 0, 0, 0, 0, 0, 19, 24709, 0, 0, 0, 0, 0, 0, 'Chieftain Wintergale - On Quest Reward (Shrouds of the Scourge) - Say Line 2 (Sage Aeire)'), +(24362, 0, 0, 0, 19, 0, 100, 0, 11351, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Longrunner Pembe - On Quest Accept (Mastering the Runes) - Say Line 1'), +(24362, 0, 1, 0, 20, 0, 100, 0, 11351, 0, 0, 0, 1, 1, 7000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Longrunner Pembe - On Quest Reward (Mastering the Runes) - Say Line 2'), +(24362, 0, 2, 0, 52, 0, 100, 0, 1, 24362, 0, 0, 1, 2, 7000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Longrunner Pembe - On Text Over Line 2 - Say Line 3'), +(24362, 0, 3, 0, 52, 0, 100, 0, 2, 24362, 0, 0, 1, 3, 7000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Longrunner Pembe - On Text Over Line 3 - Say Line 4'), +(2415200, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Malthus <Royal Apothecary Society> - Script - Say Line 1'), +(2415200, 9, 2, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Malthus <Royal Apothecary Society> - Script - Say Line 2'), +(2415200, 9, 3, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 1, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Malthus <Royal Apothecary Society> - Script - Say Line 2'), +(2415200, 9, 4, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 1, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Malthus <Royal Apothecary Society> - Script - Say Line 2'), +(2415200, 9, 5, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 1, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Apothecary Malthus <Royal Apothecary Society> - Script - Say Line 2'), +(2412300, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Nokoma Snowseer - Script - Say Line 1'), +(2412300, 9, 2, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Nokoma Snowseer - Script - Say Line 2'), +(2412300, 9, 3, 0, 0, 0, 100, 0, 7000, 7000, 0, 0, 1, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Nokoma Snowseer - Script - Say Line 2'), +(2470300, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Chieftain Wintergale - Script - Say Line 1'), +(2470300, 9, 2, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Chieftain Wintergale - Script - Say Line 2'), +(2470300, 9, 3, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 0, 0, 0, 0, 0, 0, 19, 24706, 0, 0, 0, 0, 0, 0, 'Chieftain Wintergale - Script - Say Line 1 (Durm Icehide)'), +(2470300, 9, 4, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 1, 0, 0, 0, 0, 0, 19, 24706, 0, 0, 0, 0, 0, 0, 'Chieftain Wintergale - Script - Say Line 2 (Durm Icehide)'), +(2470300, 9, 5, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Chieftain Wintergale - Script - Say Line 3'), +(2470300, 9, 6, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Chieftain Wintergale - Script - Say Line 4'), +(2470300, 9, 7, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 0, 0, 0, 0, 0, 0, 19, 24709, 0, 0, 0, 0, 0, 0, 'Chieftain Wintergale - Script - Say Line 1 (Sage Aeire)'), +(2470300, 9, 8, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 2, 0, 0, 0, 0, 0, 19, 24706, 0, 0, 0, 0, 0, 0, 'Chieftain Wintergale - Script - Say Line 3 (Durm Icehide)'), +(2470300, 9, 9, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Chieftain Wintergale - Script - Say Line 5'), +(2470300, 9, 10, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Chieftain Wintergale - Script - Say Line 6'), +(2525600, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 19, 25237, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Set Orientation'), +(2525600, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 1'), +(2525600, 9, 2, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 2'), +(2525600, 9, 3, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 3'), +(2525600, 9, 4, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 4'), +(2525600, 9, 5, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 5'), +(2525600, 9, 6, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 1, 0, 0, 0, 0, 0, 0, 19, 25237, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 1 (Garrosh Hellscream)'), +(2525600, 9, 7, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 1, 0, 0, 0, 0, 0, 19, 25237, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 2 (Garrosh Hellscream)'), +(2525600, 9, 8, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 6'), +(2525600, 9, 9, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 2, 0, 0, 0, 0, 0, 19, 25237, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 3 (Garrosh Hellscream)'), +(2525600, 9, 10, 0, 0, 0, 100, 0, 0, 0, 0, 0, 45, 1, 1, 0, 0, 0, 0, 19, 25237, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Set Data 1 1 (Garrosh Hellscream)'), +(2525600, 9, 11, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 3, 0, 0, 0, 0, 0, 19, 25237, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 4 (Garrosh Hellscream)'), +(2525600, 9, 12, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 4, 0, 0, 0, 0, 0, 19, 25237, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 5 (Garrosh Hellscream)'), +(2525600, 9, 13, 0, 0, 0, 100, 0, 0, 0, 0, 0, 45, 2, 2, 0, 0, 0, 0, 19, 25237, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Set Data 2 2 (Garrosh Hellscream)'), +(2525600, 9, 14, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 6, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 7'), +(2525600, 9, 15, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 7, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 8'), +(2525600, 9, 16, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 8, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 9'), +(2525600, 9, 17, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 5, 0, 0, 0, 0, 0, 19, 25237, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 6 (Garrosh Hellscream)'), +(2525600, 9, 18, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 9, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 10'), +(2525600, 9, 19, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 11'), +(2525600, 9, 20, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 11, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 12'), +(2525600, 9, 21, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 12, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 13'), +(2525600, 9, 22, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 13, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 14'), +(2525600, 9, 23, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 1, 14, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 15'), +(2525600, 9, 24, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 15, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 16'), +(2525600, 9, 25, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 16, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 17'), +(2525600, 9, 26, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 1, 17, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 18'), +(2525600, 9, 27, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 18, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 19'), +(2525600, 9, 28, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 6, 0, 0, 0, 0, 0, 19, 25237, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 7 (Garrosh Hellscream)'), +(2525600, 9, 29, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 19, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 20'), +(2525600, 9, 30, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 20, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 21'), +(2525600, 9, 31, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 21, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 22'), +(2525600, 9, 32, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 1, 22, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 23'), +(2525600, 9, 33, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 7, 0, 0, 0, 0, 0, 19, 25237, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 8 (Garrosh Hellscream)'), +(2525600, 9, 34, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 23, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 24'), +(2525600, 9, 35, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 1, 24, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'High Overlord Saurfang - Script - Say Line 25'), +(2525600, 9, 36, 0, 0, 0, 100, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 5.821980, 'High Overlord Saurfang - Script - Set Orientation'); + + +UPDATE `quest_template` SET `SpecialFlags`=2 WHERE `Id`=10330; + +UPDATE `smart_scripts` SET `link`=6 WHERE `entryorguid`=17831 AND `source_type`=0 AND `id`=1 AND `link`=0; + +DELETE FROM `smart_scripts` WHERE `entryorguid`=17831 AND `source_type`=0 AND `id`>5; + +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(17831, 0, 6, 0, 61, 0, 100, 0, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Watcher Leesa\'oh - Quest Reward - Set Phase 1'), +(17831, 0, 7, 8, 1, 1, 100, 0, 300000, 300000, 0, 0, 81, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Watcher Leesa\'oh - OOC (Phase 1) - Set NPC Flags'), +(17831, 0, 8, 0, 61, 1, 100, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Watcher Leesa\'oh - OOC (Phase 1) - Set Phase 0'); diff --git a/sql/updates/world/2014_08_15_00_world_sai.sql b/sql/updates/world/2014_08_15_00_world_sai.sql new file mode 100644 index 00000000000..753866d5a87 --- /dev/null +++ b/sql/updates/world/2014_08_15_00_world_sai.sql @@ -0,0 +1,39 @@ +DELETE FROM `creature_text` WHERE `entry`=27683; +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`, `BroadcastTextID`) VALUES +(27683, 0, 0, 'I''ve lived here and kept this shrine with the blessing of the Alexstrasza for longer than I can remember. In its darkest hour, I''ve failed... I fell at the feet of that damned death knight... Bloodbane.', 12, 0, 100, 0, 0, 0, 'Remnant of Dahlia Suntouch',26939), +(27683, 1, 0, 'Dahlia spits on the ground at the thought of the name.', 16, 0, 100, 0, 0, 0, 'Remnant of Dahlia Suntouch',26943), +(27683, 2, 0, 'The Lich King is stretching his hand far now... fearlessly treading on the most sacred lands of all of the flights. He intends to force us to action.', 12, 0, 100, 0, 0, 0, 'Remnant of Dahlia Suntouch',26940), +(27683, 3, 0, 'My time is done... I offered myself to Alexstrasza in life, but I have nothing left to offer in death. She will need a new keeper for her shrine.', 12, 0, 100, 0, 0, 0, 'Remnant of Dahlia Suntouch',26941), +(27683, 4, 0, 'And thank you... thank you for freeing me from the shackles of the damned. You are a hero... I know you will go on to great deeds.', 12, 0, 100, 0, 0, 0, 'Remnant of Dahlia Suntouch',26942), +(27683, 5, 0, 'The Remnant of Dahlia Suntouch fades away...', 16, 0, 100, 0, 0, 0, 'Remnant of Dahlia Suntouch',26944); + +DELETE FROM `waypoints` WHERE `entry` IN(27683); +INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES +(27683,1, 3711.944, 938.4294, 55.09203,'Remnant of Dahlia Suntouch'), +(27683,2, 3711.274, 937.6862, 55.09203,'Remnant of Dahlia Suntouch'), +(27683,3, 3722.171, 943.1833, 54.70838,'Remnant of Dahlia Suntouch'), +(27683,4, 3723.844, 944.0275, 53.94967,'Remnant of Dahlia Suntouch'), +(27683,5, 3725.486, 944.8557, 54.00668,'Remnant of Dahlia Suntouch'), +(27683,6, 3729.952, 947.1088, 53.98567,'Remnant of Dahlia Suntouch'), +(27683,7, 3733.333, 948.8146, 53.49077,'Remnant of Dahlia Suntouch'), +(27683,8, 3737.499, 950.9161, 53.46587,'Remnant of Dahlia Suntouch'), +(27683,9, 3737.499, 950.9161, 53.46587,'Remnant of Dahlia Suntouch'), +(27683,10, 3736.349, 956.1506, 53.60175,'Remnant of Dahlia Suntouch'); + +UPDATE `creature_template` SET `ainame`='SmartAI', `scriptname`='' WHERE `entry` =27683; +DELETE FROM `smart_scripts` WHERE `entryorguid` =27683 AND `source_type`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid` =27680 AND `source_type`=0 AND `id`=12; + +DELETE FROM `smart_scripts` WHERE `entryorguid` =2768300 AND `source_type`=9; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(27683, 0, 0, 0, 54, 0, 100, 0, 0, 0, 0, 0, 53, 0, 27683, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Remnant of Dahlia Suntouch - On Just Summoned - Start WP'), +(27683, 0, 1, 2, 40, 0, 100, 0, 9, 27683, 0, 0, 54, 25000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Remnant of Dahlia Suntouch - On Reached WP9 - Pause WP'), +(27683, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 80, 2768300, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Remnant of Dahlia Suntouch - On Reached WP9 - Run Script'), +(27680, 0, 12, 0, 6, 0, 100, 0, 0, 0, 0, 0, 12, 27683, 1, 60000, 0, 0, 0, 8, 0, 0, 0, 3712.014, 938.0595, 55.06598, 0.4672305, 'Dahlia Suntouch - On Death - Summon Remnant of Dahlia Suntouch'), +(2768300, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Remnant of Dahlia Suntouch - Script - Say Line 1'), +(2768300, 9, 1, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Remnant of Dahlia Suntouch - Script - Say Line 2'), +(2768300, 9, 2, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Remnant of Dahlia Suntouch - Script - Say Line 3'), +(2768300, 9, 3, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Remnant of Dahlia Suntouch - Script - Say Line 4'), +(2768300, 9, 4, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Remnant of Dahlia Suntouch - Script - Say Line 5'), +(2768300, 9, 5, 0, 0, 0, 100, 0, 8000, 8000, 0, 0, 1, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Remnant of Dahlia Suntouch - Script - Say Line 6'), +(2768300, 9, 6, 0, 0, 0, 100, 0, 500, 500, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Remnant of Dahlia Suntouch - Despawn - Say Line 6'); diff --git a/sql/updates/world/2014_08_15_01_world_misc.sql b/sql/updates/world/2014_08_15_01_world_misc.sql new file mode 100644 index 00000000000..5be02998c64 --- /dev/null +++ b/sql/updates/world/2014_08_15_01_world_misc.sql @@ -0,0 +1,170 @@ +SET @CGuid := 143153; +SET @OGuid := 77204; +DELETE FROM `creature` WHERE `id` IN(23929,25284); +INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `MovementType`) VALUES +(@CGUID+0, 23929, 571, 1, 1, 2062.051, -6156.655, 2.237447, 2.628232, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+1, 23929, 571, 1, 1, 2039.878, -6193.417, -3.080797, 0.6698744, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+2, 23929, 571, 1, 1, 2081.596, -6220.62, -5.559644, 5.520558, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+3, 23929, 571, 1, 1, 2077.341, -6119.324, 5.133451, 4.804286, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+4, 23929, 571, 1, 1, 2115, -6212.778, -4.308464, 3.277982, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+5, 23929, 571, 1, 1, 2122.892, -6158.371, 0.6280799, 0.982948, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+6, 23929, 571, 1, 1, 2087.858, -6250.41, -10.2408, 1.35658, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+7, 23929, 571, 1, 1, 2119.835, -6118.032, 4.803041, 4.132127, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+8, 23929, 571, 1, 1, 2013.993, -6254.518, -21.00015, 1.112391, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+9, 23929, 571, 1, 1, 2074.681, -6119.5, 5.277219, 0.4713301, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+10, 23929, 571, 1, 1, 2031.484, -6194.683, -3.001702, 3.621255, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+11, 23929, 571, 1, 1, 1812.82, -6244.173, 1.262661, 2.487445, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+12, 23929, 571, 1, 1, 1776.06, -6286.881, -8.274602, 2.982747, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+13, 23929, 571, 1, 1, 1751.377, -6316.019, -10.69181, 3.970208, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+14, 23929, 571, 1, 1, 1815.154, -6316.675, -13.0728, 4.246229, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+15, 23929, 571, 1, 1, 1720.834, -6354.166, -23.7564, 3.148981, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+16, 23929, 571, 1, 1, 1786.484, -6348.827, -15.25126, 5.586704, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+17, 23929, 571, 1, 1, 2012.074, -6258.688, -24.43521, 1.652964, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+18, 23929, 571, 1, 1, 2079.094, -6215.773, -5.043775, 5.081459, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+19, 23929, 571, 1, 1, 2071.581, -6157.182, 0.1636388, 5.932077, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+20, 23929, 571, 1, 1, 2074.838, -6118.759, 5.493956, 5.970884, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+21, 23929, 571, 1, 1, 2117.708, -6161.979, -0.6126428, 3.141593, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+22, 23929, 571, 1, 1, 2125.113, -6124.736, 3.693666, 0.07874685, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+23, 23929, 571, 1, 1, 2151.335, -6116.62, 3.726775, 0.7912424, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+24, 23929, 571, 1, 1, 2164.445, -6072.661, 6.89298, 2.316718, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+25, 23929, 571, 1, 1, 2179.933, -6160.375, -2.803007, 4.367789, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+26, 23929, 571, 1, 1, 2153.739, -6181.967, -3.171751, 5.224991, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+27, 23929, 571, 1, 1, 2220.191, -6099.616, 0.6470425, 4.567189, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+28, 23929, 571, 1, 1, 2221.758, -6150.805, -3.64033, 6.07286, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+29, 23929, 571, 1, 1, 2219.395, -6119.518, -0.3414693, 5.788517, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+30, 23929, 571, 1, 1, 2244.717, -6174.005, -2.611649, 4.025463, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+31, 23929, 571, 1, 1, 2268.053, -6148.229, 0.8215511, 4.072433, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+32, 23929, 571, 1, 1, 2259.826, -6126.416, -1.830338, 5.523048, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+33, 23929, 571, 1, 1, 2254.738, -6091.322, -2.024077, 5.402378, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+34, 23929, 571, 1, 1, 2271.875, -6126.52, -1.595837, 4.712389, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+35, 23929, 571, 1, 1, 2314.286, -6078.776, -3.049409, 1.255219, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+36, 23929, 571, 1, 1, 2285.159, -6048.628, 1.530014, 1.072228, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+37, 23929, 571, 1, 1, 2343.827, -6044.389, 1.277295, 1.883511, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+38, 23929, 571, 1, 1, 2335.332, -6080.069, 1.338652, 0.232657, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+39, 23929, 571, 1, 1, 2351.129, -6115.324, -4.712684, 3.427819, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+40, 23929, 571, 1, 1, 2386.805, -6029.24, 1.689566, 5.427387, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+41, 23929, 571, 1, 1, 2386.735, -6067.292, -0.04827976, 5.714135, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+42, 23929, 571, 1, 1, 2384.594, -6092.619, -3.653382, 5.481915, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+43, 23929, 571, 1, 1, 2423.318, -6059.001, -6.105264, 3.636262, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+44, 23929, 571, 1, 1, 2377.889, -6160.928, -19.9129, 1.64061, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+45, 23929, 571, 1, 1, 2436.968, -6086.432, -7.688639, 2.888794, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+46, 23929, 571, 1, 1, 2440.737, -6130.041, 1.548573, 0.08994298, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+47, 23929, 571, 1, 1, 2431.062, -6115.15, 1.2024, 0.1236143, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+48, 23929, 571, 1, 1, 2441.386, -6147.935, -9.38678, 5.727692, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+49, 23929, 571, 1, 1, 2481.23, -6117.843, -16.34631, 0.01528431, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+50, 23929, 571, 1, 1, 2416.964, -6180.481, -10.01509, 5.76622, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+51, 23929, 571, 1, 1, 2517.968, -6183.572, -14.04712, 0.9787358, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+52, 23929, 571, 1, 1, 2479.459, -6216.994, -9.751188, 5.713609, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+53, 23929, 571, 1, 1, 2357.83, -6189.611, -5.109934, 4.951204, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+54, 23929, 571, 1, 1, 2449.997, -6250.838, -23.58067, 5.063299, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+55, 23929, 571, 1, 1, 2309.368, -6179.754, -1.228604, 4.355446, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+56, 23929, 571, 1, 1, 2275.881, -6190.431, -3.251583, 4.121325, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+57, 23929, 571, 1, 1, 2145.802, -6215.906, -7.7219, 3.838213, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+58, 23929, 571, 1, 1, 2120.029, -6220.328, -5.733196, 5.31485, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+59, 23929, 571, 1, 1, 2184.749, -6251.813, -16.28959, 5.527495, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+60, 23929, 571, 1, 1, 1854.276, -6285.03, -2.871074, 0.0351761, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+61, 23929, 571, 1, 1, 1380.867, -6553.344, -46.03973, 3.758869, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+62, 23929, 571, 1, 1, 1178.156, -6519.182, -92.66708, 3.490531, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+63, 23929, 571, 1, 1, 1127.725, -6511.934, -94.98593, 4.032036, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+64, 23929, 571, 1, 1, 1084.161, -6485.229, -108.9694, 0.2125256, 120, 0, 1), -- 23929 (Area: 3979) +(@CGUID+65, 23929, 571, 1, 1, 1921.829, -6288.605, -31.88664, 2.203755, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+66, 23929, 571, 1, 1, 1874.235, -6321.702, -14.44084, 3.356235, 120, 5, 1), -- 23929 (Area: 495) +(@CGUID+67, 25284, 571, 1, 1, 2978.103, 6172.022, 60.97056, 5.323254, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+68, 25284, 571, 1, 1, 2945.243, 6246.111, 60.97499, 6.161012, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+69, 25284, 571, 1, 1, 2957.582, 6227.221, 60.7323, 3.944444, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+70, 25284, 571, 1, 1, 2926.579, 6281.956, 62.19782, 0.8028514, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+71, 25284, 571, 1, 1, 2887.594, 6237.456, 77.77579, 3.857178, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+72, 25284, 571, 1, 1, 2867.707, 6267.306, 61.74702, 4.991642, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+73, 25284, 571, 1, 1, 2854.757, 6246.977, 77.77579, 3.351032, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+74, 25284, 571, 1, 1, 2905.465, 6216.614, 61.55614, 5.305801, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+75, 25284, 571, 1, 1, 2928.379, 6185.368, 62.54679, 1.919862, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+76, 25284, 571, 1, 1, 2894.524, 6226.447, 77.77579, 3.647738, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+77, 25284, 571, 1, 1, 2887.594, 6237.456, 77.77579, 3.857178, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+78, 25284, 571, 1, 1, 2854.757, 6246.977, 77.77579, 3.351032, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+79, 25284, 571, 1, 1, 2905.465, 6216.614, 61.55614, 5.305801, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+80, 25284, 571, 1, 1, 2902.444, 6158.434, 78.50218, 2.96706, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+81, 25284, 571, 1, 1, 2895.373, 6293.756, 61.66352, 4.24115, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+82, 25284, 571, 1, 1, 2934.037, 6166.059, 62.02911, 2.007129, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+83, 25284, 571, 1, 1, 2819.929, 6311.556, 62.53657, 4.694936, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+84, 25284, 571, 1, 1, 2921.874, 6135.715, 78.50816, 5.166174, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+85, 25284, 571, 1, 1, 2754.331, 6240.902, 77.77577, 3.176499, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+86, 25284, 571, 1, 1, 2704.211, 6040.896, 30.74461, 5.77704, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+87, 25284, 571, 1, 1, 2722.752, 6031.677, 30.67421, 2.181662, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+88, 25284, 571, 1, 1, 2685.116, 6131.614, 40.07638, 2.530727, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+89, 25284, 571, 1, 1, 2689.42, 6110.311, 40.18113, 2.199115, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+90, 25284, 571, 1, 1, 2680.275, 6147.348, 40.37154, 5.602507, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+91, 25284, 571, 1, 1, 2721.42, 6008.339, 32.75626, 3.804818, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+92, 25284, 571, 1, 1, 2650.328, 6111.799, 38.28828, 3.001966, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+93, 25284, 571, 1, 1, 2689.249, 6194.803, 54.03319, 3.490659, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+94, 25284, 571, 1, 1, 2669.266, 6179.793, 39.35976, 5.654867, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+95, 25284, 571, 1, 1, 2656.433, 6220.198, 38.51787, 1.762783, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+96, 25284, 571, 1, 1, 2567.771, 6109.047, 54.6977, 3.769911, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+97, 25284, 571, 1, 1, 2641.339, 6031.713, 54.29123, 3.263766, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+98, 25284, 571, 1, 1, 2625.259, 6095.536, 54.0161, 5.235988, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+99, 25284, 571, 1, 1, 2585.699, 6190.792, 39.16593, 3.909538, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+100, 25284, 571, 1, 1, 2615.039, 6115.129, 45.42371, 2.495821, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+101, 25284, 571, 1, 1, 2634.755, 6034.534, 54.04792, 3.071779, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+102, 25284, 571, 1, 1, 2700.171, 6236.872, 39.57338, 6.126106, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+103, 25284, 571, 1, 1, 2660.299, 6237.816, 38.33454, 3.909538, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+104, 25284, 571, 1, 1, 2671.279, 6169.584, 39.5054, 5.51524, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+105, 25284, 571, 1, 1, 2717.305, 6294.582, 61.74333, 1.343904, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+106, 25284, 571, 1, 1, 2673.979, 6268.218, 39.8142, 2.635447, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+107, 25284, 571, 1, 1, 2629.925, 6118.807, 38.28828, 2.426008, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+108, 25284, 571, 1, 1, 2627.617, 6052.651, 54.03309, 6.213372, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+109, 25284, 571, 1, 1, 2590.953, 6064.318, 53.93201, 0.9948376, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+110, 25284, 571, 1, 1, 2650.328, 6111.799, 38.28828, 3.001966, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+111, 25284, 571, 1, 1, 2669.266, 6179.793, 39.35976, 5.654867, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+112, 25284, 571, 1, 1, 2637.65, 6217.151, 40.16053, 2.199115, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+113, 25284, 571, 1, 1, 2677.915, 6199.642, 39.81421, 2.513274, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+114, 25284, 571, 1, 1, 2708.715, 6270.94, 47.00795, 3.228859, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+115, 25284, 571, 1, 1, 2685.116, 6131.614, 40.07638, 2.530727, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+116, 25284, 571, 1, 1, 2680.275, 6147.348, 40.37154, 5.602507, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+117, 25284, 571, 1, 1, 2990.109, 6142.668, 61.59288, 1.27409, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+118, 25284, 571, 1, 1, 2673.979, 6268.218, 39.8142, 2.635447, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+119, 25284, 571, 1, 1, 2700.171, 6236.872, 39.57338, 6.126106, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+120, 25284, 571, 1, 1, 2641.339, 6031.713, 54.29123, 3.263766, 120, 0, 0), -- 25284 (Area: 3537) +(@CGUID+121, 25284, 571, 1, 1, 2979.675, 6128.437, 62.3862, 2.844887, 120, 0, 0); -- 25284 (Area: 3537) + +DELETE FROM `gameobject` WHERE `id` =188359; +INSERT INTO `gameobject` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`) VALUES +(@OGUID+0, 188359, 571, 1, 1, 2739.448, 1009.872, -15.50548, 1.117009, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+1, 188359, 571, 1, 1, 2693.321, 800.6493, -35.41924, 4.01426, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+2, 188359, 571, 1, 1, 2626.211, 916.5868, -38.96599, 0.1745321, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+3, 188359, 571, 1, 1, 2676.746, 1013.403, -40.85683, 4.136433, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+4, 188359, 571, 1, 1, 2620.612, 856.0625, -50.26746, 4.450591, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+5, 188359, 571, 1, 1, 2572.437, 893.8802, -58.98691, 1.466076, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+6, 188359, 571, 1, 1, 2529.14, 934.5538, -72.81474, 0.7853968, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+7, 188359, 571, 1, 1, 2575.657, 1030.057, -53.22688, 2.268925, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+8, 188359, 571, 1, 1, 2534.077, 989.4757, -71.60398, 1.466076, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+9, 188359, 571, 1, 1, 2509.641, 873.2882, -75.62807, 1.658062, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+10, 188359, 571, 1, 1, 2563.084, 823.2552, -61.71206, 3.124123, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+11, 188359, 571, 1, 1, 2518.605, 800.5799, -76.53564, 2.146753, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+12, 188359, 571, 1, 1, 2615.869, 802.5712, -51.88618, 4.904376, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+13, 188359, 571, 1, 1, 2581.496, 762.3195, -61.76929, 1.117009, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+14, 188359, 571, 1, 1, 2535.514, 735.6823, -77.05926, 2.617989, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+15, 188359, 571, 1, 1, 2571.571, 706.4549, -67.86278, 1.989672, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+16, 188359, 571, 1, 1, 2629.165, 735.0938, -46.26245, 1.640607, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+17, 188359, 571, 1, 1, 2613.99, 677.934, -56.06399, 6.230826, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+18, 188359, 571, 1, 1, 2681.451, 736.7986, -33.3134, 0.9075702, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+19, 188359, 571, 1, 1, 2645.693, 650.7758, -48.87302, 2.792518, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+20, 188359, 571, 1, 1, 2711.268, 1039.043, -16.4229, 5.724681, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+21, 188359, 571, 1, 1, 2644.706, 1073.232, -23.43658, 3.926996, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+22, 188359, 571, 1, 1, 2647.365, 1045.391, -30.60161, 2.007128, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+23, 188359, 571, 1, 1, 2633.851, 982.8386, -46.50484, 0.2094394, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+24, 188359, 571, 1, 1, 2590.615, 1085.63, -34.9085, 6.265733, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+25, 188359, 571, 1, 1, 2609.903, 625.9184, -57.36692, 4.502952, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+26, 188359, 571, 1, 1, 2549.809, 657.2969, -71.88847, 6.0912, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+27, 188359, 571, 1, 1, 2638.909, 576.8455, -54.19276, 1.815142, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+28, 188359, 571, 1, 1, 2701.917, 570.9913, -38.3619, 1.239183, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+29, 188359, 571, 1, 1, 2575.972, 561.1805, -57.53023, 5.131269, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+30, 188359, 571, 1, 1, 2532.788, 599.1788, -67.74231, 5.951575, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+31, 188359, 571, 1, 1, 2518.677, 539.4149, -57.49432, 3.141593, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+32, 188359, 571, 1, 1, 2660.824, 515.9827, -59.03183, 2.91469, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+33, 188359, 571, 1, 1, 2581.496, 762.3195, -61.76929, 1.117009, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+34, 188359, 571, 1, 1, 2572.437, 893.8802, -58.98691, 1.466076, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+35, 188359, 571, 1, 1, 2633.851, 982.8386, -46.50484, 0.2094394, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+36, 188359, 571, 1, 1, 2676.746, 1013.403, -40.85683, 4.136433, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+37, 188359, 571, 1, 1, 2520.906, 1052.955, -56.98813, 5.794494, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+38, 188359, 571, 1, 1, 2533.467, 1092.911, -30.86761, 1.518436, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+39, 188359, 571, 1, 1, 2599.236, 1126.641, -24.74891, 4.468043, 0, 0, 0, 1, 120, 255, 1), -- 188359 (Area: 65) +(@OGUID+40, 188359, 571, 1, 1, 2633.851, 982.8386, -46.50484, 0.2094394, 0, 0, 0, 1, 120, 255, 1); -- 188359 (Area: 65) diff --git a/sql/updates/world/2014_08_15_02_world_misc.sql b/sql/updates/world/2014_08_15_02_world_misc.sql new file mode 100644 index 00000000000..52c52593ab5 --- /dev/null +++ b/sql/updates/world/2014_08_15_02_world_misc.sql @@ -0,0 +1,106 @@ +DELETE FROM `creature_text` WHERE `entry` IN(27210,27951,27202,27203,27246); +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`, `BroadcastTextID`) VALUES +(27210, 0, 0, 'Now I''ll show you the REAL power of the Onslaught!', 12, 0, 100, 0, 0, 14192, 'High General Abbendis',27593), +(27951, 0, 0, 'Kill them Abbendis! Do not fail me!', 14, 0, 100, 25, 0, 14198, 'Admiral Barean Westwind',27354), +(27951, 1, 0, 'The grand admiral studies you a moment through narrowed eyes.', 16, 0, 100, 0, 0, 0, 'Admiral Barean Westwind',27355), +(27951, 2, 0, 'You served your purpose.', 12, 0, 100, 0, 0, 14199, 'Admiral Barean Westwind',27357), +(27951, 3, 0, 'I will see you in Icecrown, weakling... if you live that long!', 12, 0, 100, 0, 0, 14200, 'Admiral Barean Westwind',27358), +(27203, 0, 0, 'Be purified by steel!', 12, 0, 100, 0, 0, 0, 'Onslaught Footman',26404), +(27203, 0, 1, 'By the Light!', 12, 0, 100, 0, 0, 0, 'Onslaught Footman',26403), +(27203, 0, 2, 'In the name of the Light!', 12, 0, 100, 0, 0, 0, 'Onslaught Footman',26402), +(27203, 0, 3, 'You will be cleansed!', 12, 0, 100, 0, 0, 0, 'Onslaught Footman',26401), +(27202, 0, 0, 'Abbendis will see you purged!', 12, 0, 100, 0, 0, 0, 'Onslaught Raven Priest',26399), +(27202, 0, 1, 'You are impure!', 12, 0, 100, 0, 0, 0, 'Onslaught Raven Priest',26393), +(27202, 0, 2, 'Gah! What are you doing?', 12, 0, 100, 5, 0, 7256, 'Onslaught Raven Priest',26637), +(27202, 1, 0, 'I sense the taint of this land in you, footman. Report to the Bishop before the start of your next shift.', 12, 0, 100, 0, 0, 0, 'Onslaught Raven Priest',26256), +(27202, 1, 1, 'Your protection is strong, child. Continue your work.', 12, 0, 100, 0, 0, 0, 'Onslaught Raven Priest',26390), +(27202, 1, 2, 'The Grand Admiral himself has come to see to our dedication. If I see you slacking on your post again, I will gut you myself.', 12, 0, 100, 0, 0, 0, 'Onslaught Raven Priest',26655), +(27202, 1, 3, 'You require the Bishop''s blessing. Go to him soon.', 12, 0, 100, 0, 0, 0, 'Onslaught Raven Priest',26391), +(27202, 2, 0, 'HELP! HELP! THIS $g MAN : WOMAN; HAS STOLEN MY IMAGE!', 12, 0, 100, 0, 0, 0, 'Onslaught Raven Priest',26543), +(27246, 0, 0, 'It is good that you have come my child. The Light''s protection has worn thin on you.', 12, 0, 100, 0, 0, 0, 'Bishop Street',26271), +(27246, 1, 0, 'It is done. Serve the Light well.', 12, 0, 100, 0, 0, 0, 'Bishop Street',26272), +(27246, 2, 0, 'How dare you interrupt our righteous work?!', 12, 0, 100, 0, 0, 0, 'Bishop Street',26405); + +UPDATE `creature_template` SET `unit_flags`=32768 WHERE `entry`=27951; + +UPDATE `creature_template` SET `ainame`='SmartAI', `scriptname`='' WHERE `entry` =27951; +DELETE FROM `smart_scripts` WHERE `entryorguid` =27951 AND `source_type`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid` =27210 AND `source_type`=0 AND `id`>2; +DELETE FROM `smart_scripts` WHERE `entryorguid` =27203 AND `source_type`=0 AND `id`=1; +DELETE FROM `smart_scripts` WHERE `entryorguid` =27202 AND `source_type`=0 AND `id`>13; +DELETE FROM `smart_scripts` WHERE `entryorguid` =27246 AND `source_type`=0 AND `id`>10; + +UPDATE `smart_scripts` SET `action_type`=1, `action_param1`=2,`target_type`=7, `comment`='Onslaught Raven Priest - On Spellhit \'Banshee\'s Magic Mirror\' - Say (No Repeat)' WHERE `entryorguid`=27202 AND `source_type`=0 AND `id`=12 AND `link`=0; + + +DELETE FROM `smart_scripts` WHERE `entryorguid` IN(2795100,2795101,2795102) AND `source_type`=9; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(27951, 0, 0, 1, 25, 0, 100, 0, 0, 0, 0, 0, 20, 0,0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - On Reset - Disable Auto Attack'), +(27951, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 21, 0,0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - On Reset - Disable Combat Movement'), +(27951, 0, 2, 0, 38, 0, 100, 0, 2, 2, 0, 0, 28, 50161,0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - On Data Set 2 2 - Remove Aura Protection Sphere'), +(27951, 0, 3, 4, 4, 0, 100, 0, 0, 0, 0, 0, 11, 50161,0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - On Agro - Cast Protection Sphere'), +(27951, 0, 4, 0, 61, 0, 100, 0, 0, 0, 0, 0, 80, 2795100,2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - On Agro - Run Script 1'), +(27951, 0, 5, 0, 38, 0, 100, 0, 1, 1, 0, 0, 80, 2795101,2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - On Data Set 1 1 - Run Script 2'), +(27951, 0, 6, 0, 40, 0, 100, 0, 6, 27951, 0, 0, 1, 3,0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - On Reached WP6 - Say Line 4'), +(27951, 0, 7, 0, 40, 0, 100, 0, 26, 27951, 0, 0, 80, 2795102,2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - On Reached WP26 - Run Script 3'), +(27951, 0, 8, 0, 11, 0, 100, 0, 0, 0, 0, 0, 19, 768,0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - On Respawn - Remove Unit flags immune to pc/npc'), +(27951, 0, 9, 0, 38, 0, 100, 0, 3, 3, 0, 0, 49, 0,0, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - On Data Set 3 3 - Enter combat (Stored Target)'), +(27210, 0, 3, 0, 6, 0, 100, 0, 0, 0, 0, 0, 45, 1, 1, 0, 0, 0, 0, 19, 27951, 0, 0, 0, 0, 0, 0, 'High General Abbendis - On Death - Set Data 1 1 on Admiral Barean Westwind '), +(27210, 0, 4, 0, 7, 0, 100, 0, 0, 0, 0, 0, 45, 2, 2, 0, 0, 0, 0, 19, 27951, 0, 0, 0, 0, 0, 0, 'High General Abbendis - On Evade - Set Data 2 2 on Admiral Barean Westwind '), +(27210, 0, 5, 6, 4, 0, 100, 0, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'High General Abbendis - On Agro - Store Targetlist'), +(27210, 0, 6, 7, 61, 0, 100, 0, 0, 0, 0, 0, 100, 1, 0, 0, 0, 0, 0, 19, 27951, 0, 0, 0, 0, 0, 0, 'High General Abbendis - On Agro - Send Target Targetlist to Admiral Barean Westwind'), +(27210, 0, 7, 0, 61, 0, 100, 0, 0, 0, 0, 0, 45, 3, 3, 0, 0, 0, 0, 19, 27951, 0, 0, 0, 0, 0, 0, 'High General Abbendis - On Agro - Set Data 3 3 on Admiral Barean Westwind'), +(27210, 0, 8, 0,11, 0, 100, 1, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 10, 85322, 27951, 0, 0, 0, 0, 0, 'High General Abbendis - On Respawn - Respawn Admiral Barean Westwind '), +(27203, 0, 1, 0, 4, 0, 30, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Onslaught Footman - On Agro - Say'), +(27202, 0, 14, 0, 4, 0, 30, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Onslaught Raven Priest - On Aggro - Say'), +(27202, 0, 15, 0, 1, 0, 50, 0, 0, 45000, 60000, 90000, 1, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Onslaught Raven Priest - OOC - Say'), +(27246, 0, 11, 0, 10, 0, 100, 0, 0, 40, 45000, 55000, 1, 0, 7000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Bishop Street - OOC Los - Say Line 1'), +(27246, 0, 12, 0, 52, 0, 100, 0, 0, 27246, 0, 0, 1, 1, 7000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Bishop Street - On Text Over Line 1 - Say Line 2'), +(27246, 0, 13, 0, 4, 0, 100, 0, 0, 0, 0, 0, 1, 2, 7000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Bishop Street - On Agro Say Line 3'), +(2795100, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 1, 0,0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Script 1 - Say Line 1'), +(2795100, 9, 1, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 1, 0,0, 0, 0, 0, 0, 19, 27210, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Script 1 - Say Line 1 (High General Abbendis)'), +(2795101, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 18, 768,0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Script 2 - Set Unit Flags Immune to NPC/PC'), +(2795101, 9, 1, 0, 0, 0, 100, 0, 100, 100, 0, 0, 11, 50161,0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Script 2 - Cast Protection Spear'), +(2795101, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 66, 0,0, 0, 0, 0, 0, 21, 50, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Script 2 - Face Player'), +(2795101, 9, 3, 0, 0, 0, 100, 0, 0, 0, 0, 0, 1, 1,0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Script 2 - Say Line 2'), +(2795101, 9, 4, 0, 0, 0, 100, 0, 5000, 5000, 0, 0, 66, 0,0, 0, 0, 0, 0, 19, 27210, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Script 2 - Face High General Abbendis'), +(2795101, 9, 5, 0, 0, 0, 100, 0, 0, 0, 0, 0,90, 8,0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Script 2 - Set Kneel'), +(2795101, 9, 6, 0, 0, 0, 100, 0, 0, 0, 0, 0, 1, 2,0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Script 2 - Say Line 3'), +(2795101, 9, 7, 0, 0, 0, 100, 0, 5000, 5000, 0, 0,91, 8,0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Script 2 - Set Stand'), +(2795101, 9, 8, 0, 0, 0, 100, 0, 0, 0, 0, 0,53, 0,27951, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Script 2 - Start WP'), +(2795102, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 34427,0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Script 3 - Cast Ethereal Teleport'), +(2795102, 9, 1, 0, 0, 0, 100, 0, 1000, 1000, 0, 0, 41, 0,0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Admiral Barean Westwind - Script 3 - Despawn'); +DELETE FROM `creature_template_addon` WHERE `entry` IN (27202); +INSERT INTO `creature_template_addon` (`entry`, `mount`, `bytes1`, `bytes2`, `auras`) VALUES +(27202, 0, 0x0, 0x1, '48154'); -- 27202 - 48154 + +DELETE FROM `waypoints` WHERE `entry` IN(27951); +INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES +(27951,1, 2663.62, -359.1632, 144.224,'Admiral Barean Westwind'), +(27951,2, 2664.87, -358.9132, 143.724,'Admiral Barean Westwind'), +(27951,3, 2666.12, -358.6632, 143.224,'Admiral Barean Westwind'), +(27951,4, 2667.12, -358.4132, 142.724,'Admiral Barean Westwind'), +(27951,5, 2668.37, -358.4132, 142.474,'Admiral Barean Westwind'), +(27951,6, 2669.62, -358.1632, 142.224,'Admiral Barean Westwind'), +(27951,7, 2671.12, -357.9132, 141.724,'Admiral Barean Westwind'), +(27951,8, 2679.87, -356.6632, 141.724,'Admiral Barean Westwind'), +(27951,9, 2684.62, -355.9132, 141.724,'Admiral Barean Westwind'), +(27951,10, 2691.62, -355.1632, 141.724,'Admiral Barean Westwind'), +(27951,11, 2698.62, -354.1632, 141.724,'Admiral Barean Westwind'), +(27951,12, 2705.87, -353.1632, 141.724,'Admiral Barean Westwind'), +(27951,13, 2714.12, -351.9132, 141.724,'Admiral Barean Westwind'), +(27951,14, 2715.37, -351.6632, 141.724,'Admiral Barean Westwind'), +(27951,15, 2717.62, -351.4132, 141.724,'Admiral Barean Westwind'), +(27951,16, 2717.798, -351.4926, 141.4669,'Admiral Barean Westwind'), +(27951,17, 2718.548, -351.2426, 141.4669,'Admiral Barean Westwind'), +(27951,18, 2719.298, -353.4926, 141.4669,'Admiral Barean Westwind'), +(27951,19, 2720.548, -355.2426, 141.4669,'Admiral Barean Westwind'), +(27951,20, 2720.86, -355.3831, 141.4667,'Admiral Barean Westwind'), +(27951,21, 2722.36, -357.8831, 141.4667,'Admiral Barean Westwind'), +(27951,22, 2723.61, -357.6331, 141.4667,'Admiral Barean Westwind'), +(27951,23, 2726.86, -357.3831, 141.4667,'Admiral Barean Westwind'), +(27951,24, 2731.61, -356.6331, 141.4667,'Admiral Barean Westwind'), +(27951,25, 2733.86, -356.3831, 141.4667,'Admiral Barean Westwind'), +(27951,26, 2736.61, -355.8831, 141.4667,'Admiral Barean Westwind'); + +UPDATE `creature` SET `spawndist`=5 WHERE `guid`=143217; diff --git a/src/server/game/AI/CreatureAISelector.cpp b/src/server/game/AI/CreatureAISelector.cpp index afbd306c184..3643bccdb6f 100644 --- a/src/server/game/AI/CreatureAISelector.cpp +++ b/src/server/game/AI/CreatureAISelector.cpp @@ -68,7 +68,7 @@ namespace FactorySelector else ai_factory = ai_registry.GetRegistryItem("NullCreatureAI"); } - else if (creature->GetCreatureType() == CREATURE_TYPE_CRITTER && !creature->HasUnitTypeMask(UNIT_MASK_GUARDIAN)) + else if (creature->IsCritter() && !creature->HasUnitTypeMask(UNIT_MASK_GUARDIAN)) ai_factory = ai_registry.GetRegistryItem("CritterAI"); } diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index b06ee8613e9..cd80c646a2d 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -3213,7 +3213,7 @@ void SmartScript::InitTimer(SmartScriptHolder& e) void SmartScript::RecalcTimer(SmartScriptHolder& e, uint32 min, uint32 max) { // min/max was checked at loading! - e.timer = urand(uint32(min), uint32(max)); + e.timer = urand(min, max); e.active = e.timer ? false : true; } diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index aa3bd99a988..547cd9a8502 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -2584,7 +2584,7 @@ void AchievementGlobalMgr::LoadRewardLocales() AchievementRewardLocale& data = m_achievementRewardLocales[entry]; - for (int i = 1; i < TOTAL_LOCALES; ++i) + for (uint8 i = TOTAL_LOCALES - 1; i > 0; --i) { LocaleConstant locale = (LocaleConstant) i; ObjectMgr::AddLocaleString(fields[1 + 2 * (i - 1)].GetString(), locale, data.subject); @@ -2593,7 +2593,7 @@ void AchievementGlobalMgr::LoadRewardLocales() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %lu achievement reward locale strings in %u ms", (unsigned long)m_achievementRewardLocales.size(), GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u achievement reward locale strings in %u ms", uint32(m_achievementRewardLocales.size()), GetMSTimeDiffToNow(oldMSTime)); } AchievementEntry const* AchievementGlobalMgr::GetAchievement(uint32 achievementId) const diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index c9a2015dbb8..7103654e90f 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -384,9 +384,9 @@ bool Creature::UpdateEntry(uint32 entry, CreatureData const* data /*= nullptr*/) RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT); - SetAttackTime(BASE_ATTACK, cInfo->baseattacktime); - SetAttackTime(OFF_ATTACK, cInfo->baseattacktime); - SetAttackTime(RANGED_ATTACK, cInfo->rangeattacktime); + SetAttackTime(BASE_ATTACK, cInfo->BaseAttackTime); + SetAttackTime(OFF_ATTACK, cInfo->BaseAttackTime); + SetAttackTime(RANGED_ATTACK, cInfo->RangeAttackTime); SelectLevel(); @@ -815,7 +815,7 @@ bool Creature::Create(uint32 guidlow, Map* map, uint32 phaseMask, uint32 entry, void Creature::InitializeReactState() { - if (IsTotem() || IsTrigger() || GetCreatureType() == CREATURE_TYPE_CRITTER || IsSpiritService()) + if (IsTotem() || IsTrigger() || IsCritter() || IsSpiritService()) SetReactState(REACT_PASSIVE); /* else if (IsCivilian()) diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index ea4da5d5611..9b332bb5de4 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -64,12 +64,12 @@ enum CreatureFlagsExtra CREATURE_FLAG_EXTRA_NO_SKILLGAIN | CREATURE_FLAG_EXTRA_TAUNT_DIMINISH | CREATURE_FLAG_EXTRA_ALL_DIMINISH | \ CREATURE_FLAG_EXTRA_GUARD) -#define MAX_KILL_CREDIT 2 #define CREATURE_REGEN_INTERVAL 2 * IN_MILLISECONDS +#define MAX_KILL_CREDIT 2 +#define MAX_CREATURE_MODELS 4 #define MAX_CREATURE_QUEST_ITEMS 6 - -#define MAX_EQUIPMENT_ITEMS 3 +#define CREATURE_MAX_SPELLS 8 // from `creature_template` table struct CreatureTemplate @@ -94,13 +94,11 @@ struct CreatureTemplate float speed_run; float scale; uint32 rank; - float mindmg; - float maxdmg; uint32 dmgschool; - uint32 attackpower; - float dmg_multiplier; - uint32 baseattacktime; - uint32 rangeattacktime; + uint32 BaseAttackTime; + uint32 RangeAttackTime; + float BaseVariance; + float RangeVariance; uint32 unit_class; // enum Classes. Note only 4 classes are known for creatures. uint32 unit_flags; // enum UnitFlags mask values uint32 unit_flags2; // enum UnitFlags2 mask values @@ -110,9 +108,6 @@ struct CreatureTemplate uint32 trainer_spell; uint32 trainer_class; uint32 trainer_race; - float minrangedmg; - float maxrangedmg; - uint32 rangedattackpower; uint32 type; // enum CreatureType values uint32 type_flags; // enum CreatureTypeFlags mask values uint32 lootid; @@ -131,6 +126,8 @@ struct CreatureTemplate float ModHealth; float ModMana; float ModArmor; + float ModDamage; + float ModExperience; bool RacialLeader; uint32 questItems[MAX_CREATURE_QUEST_ITEMS]; uint32 movementId; @@ -237,6 +234,8 @@ struct PointOfInterestLocale StringVector IconName; }; +#define MAX_EQUIPMENT_ITEMS 3 + struct EquipmentInfo { uint32 ItemEntry[MAX_EQUIPMENT_ITEMS]; diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index ee39ed48ad6..c8c0eaefb27 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -143,7 +143,12 @@ void GameObject::AddToWorld() // The state can be changed after GameObject::Create but before GameObject::AddToWorld bool toggledState = GetGoType() == GAMEOBJECT_TYPE_CHEST ? getLootState() == GO_READY : (GetGoState() == GO_STATE_READY || IsTransport()); if (m_model) - GetMap()->InsertGameObjectModel(*m_model); + { + if (Transport* trans = ToTransport()) + trans->SetDelayedAddModelToMap(); + else + GetMap()->InsertGameObjectModel(*m_model); + } EnableCollision(toggledState); WorldObject::AddToWorld(); diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index dc6007cbfe0..13f4dd13a83 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -805,14 +805,16 @@ namespace Trinity class ObjectDistanceOrderPred { public: - ObjectDistanceOrderPred(WorldObject const* pRefObj, bool ascending = true) : m_refObj(pRefObj), m_ascending(ascending) { } - bool operator()(WorldObject const* pLeft, WorldObject const* pRight) const + ObjectDistanceOrderPred(WorldObject const* refObj, bool ascending = true) : _refObj(refObj), _ascending(ascending) { } + + bool operator()(WorldObject const* left, WorldObject const* right) const { - return m_ascending ? m_refObj->GetDistanceOrder(pLeft, pRight) : !m_refObj->GetDistanceOrder(pLeft, pRight); + return _refObj->GetDistanceOrder(left, right) == _ascending; } + private: - WorldObject const* m_refObj; - const bool m_ascending; + WorldObject const* _refObj; + bool _ascending; }; } diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index 876f35a58ce..37087663328 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -182,8 +182,7 @@ bool Pet::LoadPetFromDB(Player* owner, uint32 petEntry, uint32 petnumber, bool c setFaction(owner->getFaction()); SetUInt32Value(UNIT_CREATED_BY_SPELL, summonSpellId); - CreatureTemplate const* cinfo = GetCreatureTemplate(); - if (cinfo->type == CREATURE_TYPE_CRITTER) + if (IsCritter()) { float px, py, pz; owner->GetClosePoint(px, py, pz, GetObjectSize(), PET_FOLLOW_DIST, GetFollowAngle()); @@ -1019,7 +1018,7 @@ bool Guardian::InitStatsForLevel(uint8 petlevel) SetCreateHealth(30*petlevel); // wolf attack speed is 1.5s - SetAttackTime(BASE_ATTACK, cinfo->baseattacktime); + SetAttackTime(BASE_ATTACK, cinfo->BaseAttackTime); SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, float((petlevel * 4 - petlevel))); SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, float((petlevel * 4 + petlevel))); diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp index d907274f8d1..367ccd34cdb 100644 --- a/src/server/game/Entities/Transport/Transport.cpp +++ b/src/server/game/Entities/Transport/Transport.cpp @@ -35,7 +35,8 @@ Transport::Transport() : GameObject(), _transportInfo(NULL), _isMoving(true), _pendingStop(false), - _triggeredArrivalEvent(false), _triggeredDepartureEvent(false), _passengerTeleportItr(_passengers.begin()) + _triggeredArrivalEvent(false), _triggeredDepartureEvent(false), + _passengerTeleportItr(_passengers.begin()), _delayedAddModel(false) { m_updateFlag = UPDATEFLAG_TRANSPORT | UPDATEFLAG_LOWGUID | UPDATEFLAG_STATIONARY_POSITION | UPDATEFLAG_ROTATION; } @@ -186,6 +187,14 @@ void Transport::Update(uint32 diff) return; // Update more in new map thread } + // Add model to map after we are fully done with moving maps + if (_delayedAddModel) + { + _delayedAddModel = false; + if (m_model) + GetMap()->InsertGameObjectModel(*m_model); + } + // Set position _positionChangeTimer.Update(diff); if (_positionChangeTimer.Passed()) @@ -625,7 +634,6 @@ bool Transport::TeleportTransport(uint32 newMapid, float x, float y, float z, fl } Relocate(x, y, z, o); - UpdateModelPosition(); GetMap()->AddToMap<Transport>(this); return true; } diff --git a/src/server/game/Entities/Transport/Transport.h b/src/server/game/Entities/Transport/Transport.h index e644417f1ac..2c924eb33ed 100644 --- a/src/server/game/Entities/Transport/Transport.h +++ b/src/server/game/Entities/Transport/Transport.h @@ -95,6 +95,8 @@ class Transport : public GameObject, public TransportBase void EnableMovement(bool enabled); + void SetDelayedAddModelToMap() { _delayedAddModel = true; } + TransportTemplate const* GetTransportTemplate() const { return _transportInfo; } private: @@ -123,6 +125,8 @@ class Transport : public GameObject, public TransportBase PassengerSet _passengers; PassengerSet::iterator _passengerTeleportItr; PassengerSet _staticPassengers; + + bool _delayedAddModel; }; #endif diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index 04136221d0d..bac2a8ef856 100644 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -1037,17 +1037,21 @@ void Creature::UpdateAttackPowerAndDamage(bool ranged) void Creature::CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float& minDamage, float& maxDamage) { + float variance = 1.0f; UnitMods unitMod; switch (attType) { case BASE_ATTACK: default: + variance = GetCreatureTemplate()->BaseVariance; unitMod = UNIT_MOD_DAMAGE_MAINHAND; break; case OFF_ATTACK: + variance = GetCreatureTemplate()->BaseVariance; unitMod = UNIT_MOD_DAMAGE_OFFHAND; break; case RANGED_ATTACK: + variance = GetCreatureTemplate()->RangeVariance; unitMod = UNIT_MOD_DAMAGE_RANGED; break; } @@ -1070,11 +1074,11 @@ void Creature::CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, float attackPower = GetTotalAttackPowerValue(attType); float attackSpeedMulti = GetAPMultiplier(attType, normalized); - float baseValue = GetModifierValue(unitMod, BASE_VALUE) + (attackPower / 14.0f); + float baseValue = GetModifierValue(unitMod, BASE_VALUE) + (attackPower / 14.0f) * variance; float basePct = GetModifierValue(unitMod, BASE_PCT) * attackSpeedMulti; float totalValue = GetModifierValue(unitMod, TOTAL_VALUE); float totalPct = addTotalPct ? GetModifierValue(unitMod, TOTAL_PCT) : 1.0f; - float dmgMultiplier = GetCreatureTemplate()->dmg_multiplier; // = dmg_multiplier * _GetDamageMod(rank); + float dmgMultiplier = GetCreatureTemplate()->ModDamage; // = ModDamage * _GetDamageMod(rank); minDamage = ((weaponMinDamage + baseValue) * dmgMultiplier * basePct + totalValue) * totalPct; maxDamage = ((weaponMaxDamage + baseValue) * dmgMultiplier * basePct + totalValue) * totalPct; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index b5a60793d63..a42836682bb 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -12791,6 +12791,10 @@ int32 Unit::ModSpellDuration(SpellInfo const* spellProto, Unit const* target, in if (duration < 0) return duration; + // some auras are not affected by duration modifiers + if (spellProto->AttributesEx7 & SPELL_ATTR7_IGNORE_DURATION_MODS) + return duration; + // cut duration only of negative effects if (!positive) { @@ -13994,7 +13998,7 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u // On melee based hit/miss/resist need update skill (for victim and attacker) if (procExtra & (PROC_EX_NORMAL_HIT|PROC_EX_MISS|PROC_EX_RESIST)) { - if (target->GetTypeId() != TYPEID_PLAYER && target->GetCreatureType() != CREATURE_TYPE_CRITTER) + if (target->GetTypeId() != TYPEID_PLAYER && !target->IsCritter()) ToPlayer()->UpdateCombatSkills(target, attType, isVictim); } // Update defence if player is victim and parry/dodge/block @@ -14658,7 +14662,7 @@ Unit* Unit::SelectNearbyTarget(Unit* exclude, float dist) const // remove not LoS targets for (std::list<Unit*>::iterator tIter = targets.begin(); tIter != targets.end();) { - if (!IsWithinLOSInMap(*tIter) || (*tIter)->IsTotem() || (*tIter)->IsSpiritService() || (*tIter)->GetCreatureType() == CREATURE_TYPE_CRITTER) + if (!IsWithinLOSInMap(*tIter) || (*tIter)->IsTotem() || (*tIter)->IsSpiritService() || (*tIter)->IsCritter()) targets.erase(tIter++); else ++tIter; @@ -15279,7 +15283,7 @@ void Unit::Kill(Unit* victim, bool durabilityLoss) if (Unit* owner = GetOwner()) owner->ProcDamageAndSpell(victim, PROC_FLAG_KILL, PROC_FLAG_NONE, PROC_EX_NONE, 0); - if (victim->GetCreatureType() != CREATURE_TYPE_CRITTER) + if (!victim->IsCritter()) ProcDamageAndSpell(victim, PROC_FLAG_KILL, PROC_FLAG_KILLED, PROC_EX_NONE, 0); // Proc auras on death - must be before aura/combat remove diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index b65081ba89e..2e8d93ec995 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -265,7 +265,6 @@ enum UnitRename UNIT_CAN_BE_ABANDONED = 0x02 }; -#define CREATURE_MAX_SPELLS 8 #define MAX_SPELL_CHARM 4 #define MAX_SPELL_VEHICLE 6 #define MAX_SPELL_POSSESS 8 @@ -1528,6 +1527,7 @@ class Unit : public WorldObject bool IsArmorer() const { return HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_REPAIR); } bool IsServiceProvider() const; bool IsSpiritService() const { return HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPIRITHEALER | UNIT_NPC_FLAG_SPIRITGUIDE); } + bool IsCritter() const { return GetCreatureType() == CREATURE_TYPE_CRITTER; } bool IsInFlight() const { return HasUnitState(UNIT_STATE_IN_FLIGHT); } diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index b7f2cd3dae4..944ad4d4a19 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -315,7 +315,7 @@ void ObjectMgr::LoadCreatureLocales() CreatureLocale& data = _creatureLocaleStore[entry]; - for (uint8 i = 1; i < TOTAL_LOCALES; ++i) + for (uint8 i = TOTAL_LOCALES - 1; i > 0; --i) { LocaleConstant locale = (LocaleConstant) i; AddLocaleString(fields[1 + 2 * (i - 1)].GetString(), locale, data.Name); @@ -323,7 +323,7 @@ void ObjectMgr::LoadCreatureLocales() } } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %lu creature locale strings in %u ms", (unsigned long)_creatureLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u creature locale strings in %u ms", uint32(_creatureLocaleStore.size()), GetMSTimeDiffToNow(oldMSTime)); } void ObjectMgr::LoadGossipMenuItemsLocales() @@ -351,7 +351,7 @@ void ObjectMgr::LoadGossipMenuItemsLocales() GossipMenuItemsLocale& data = _gossipMenuItemsLocaleStore[MAKE_PAIR32(menuId, id)]; - for (uint8 i = 1; i < TOTAL_LOCALES; ++i) + for (uint8 i = TOTAL_LOCALES - 1; i > 0; --i) { LocaleConstant locale = (LocaleConstant) i; AddLocaleString(fields[2 + 2 * (i - 1)].GetString(), locale, data.OptionText); @@ -360,7 +360,7 @@ void ObjectMgr::LoadGossipMenuItemsLocales() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %lu gossip_menu_option locale strings in %u ms", (unsigned long)_gossipMenuItemsLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u gossip_menu_option locale strings in %u ms", uint32(_gossipMenuItemsLocaleStore.size()), GetMSTimeDiffToNow(oldMSTime)); } void ObjectMgr::LoadPointOfInterestLocales() @@ -382,33 +382,33 @@ void ObjectMgr::LoadPointOfInterestLocales() PointOfInterestLocale& data = _pointOfInterestLocaleStore[entry]; - for (uint8 i = 1; i < TOTAL_LOCALES; ++i) + for (uint8 i = TOTAL_LOCALES - 1; i > 0; --i) AddLocaleString(fields[i].GetString(), LocaleConstant(i), data.IconName); } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %lu points_of_interest locale strings in %u ms", (unsigned long)_pointOfInterestLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u points_of_interest locale strings in %u ms", uint32(_pointOfInterestLocaleStore.size()), GetMSTimeDiffToNow(oldMSTime)); } void ObjectMgr::LoadCreatureTemplates() { uint32 oldMSTime = getMSTime(); - // 0 1 2 3 4 5 6 7 8 + // 0 1 2 3 4 5 6 7 8 QueryResult result = WorldDatabase.Query("SELECT entry, difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, modelid1, modelid2, modelid3, " - // 9 10 11 12 13 14 15 16 17 18 19 20 21 + // 9 10 11 12 13 14 15 16 17 18 19 20 "modelid4, name, subname, IconName, gossip_menu_id, minlevel, maxlevel, exp, faction, npcflag, speed_walk, speed_run, " - // 22 23 24 25 26 27 28 29 30 31 32 33 - "scale, rank, mindmg, maxdmg, dmgschool, attackpower, dmg_multiplier, baseattacktime, rangeattacktime, unit_class, unit_flags, unit_flags2, " - // 34 35 36 37 38 39 40 41 42 43 - "dynamicflags, family, trainer_type, trainer_spell, trainer_class, trainer_race, minrangedmg, maxrangedmg, rangedattackpower, type, " - // 44 45 46 47 48 49 50 51 52 53 54 + // 21 22 23 24 25 26 27 28 29 30 + "scale, rank, dmgschool, BaseAttackTime, RangeAttackTime, BaseVariance, RangeVariance, unit_class, unit_flags, unit_flags2, " + // 31 32 33 34 35 36 37 + "dynamicflags, family, trainer_type, trainer_spell, trainer_class, trainer_race, type, " + // 38 39 40 41 42 43 44 45 46 47 48 "type_flags, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, spell1, " - // 55 56 57 58 59 60 61 62 63 64 65 66 67 + // 49 50 51 52 53 54 55 56 57 58 59 60 61 "spell2, spell3, spell4, spell5, spell6, spell7, spell8, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, " - // 68 69 70 71 72 73 74 75 76 77 78 - "InhabitType, HoverHeight, Health_mod, Mana_mod, Armor_mod, RacialLeader, questItem1, questItem2, questItem3, questItem4, questItem5, " - // 79 80 81 82 83 84 - " questItem6, movementId, RegenHealth, mechanic_immune_mask, flags_extra, ScriptName " + // 62 63 64 65 66 67 68 69 + "InhabitType, HoverHeight, HealthModifier, ManaModifier, ArmorModifier, DamageModifier, ExperienceModifier, RacialLeader, " + // 70 71 72 73 74 75 76 77 78 79 80 + "questItem1, questItem2, questItem3, questItem4, questItem5, questItem6, movementId, RegenHealth, mechanic_immune_mask, flags_extra, ScriptName " "FROM creature_template;"); if (!result) @@ -422,90 +422,7 @@ void ObjectMgr::LoadCreatureTemplates() do { Field* fields = result->Fetch(); - - uint32 entry = fields[0].GetUInt32(); - - - CreatureTemplate& creatureTemplate = _creatureTemplateStore[entry]; - - creatureTemplate.Entry = entry; - - for (uint8 i = 0; i < MAX_DIFFICULTY - 1; ++i) - creatureTemplate.DifficultyEntry[i] = fields[1 + i].GetUInt32(); - - for (uint8 i = 0; i < MAX_KILL_CREDIT; ++i) - creatureTemplate.KillCredit[i] = fields[4 + i].GetUInt32(); - - creatureTemplate.Modelid1 = fields[6].GetUInt32(); - creatureTemplate.Modelid2 = fields[7].GetUInt32(); - creatureTemplate.Modelid3 = fields[8].GetUInt32(); - creatureTemplate.Modelid4 = fields[9].GetUInt32(); - creatureTemplate.Name = fields[10].GetString(); - creatureTemplate.SubName = fields[11].GetString(); - creatureTemplate.IconName = fields[12].GetString(); - creatureTemplate.GossipMenuId = fields[13].GetUInt32(); - creatureTemplate.minlevel = fields[14].GetUInt8(); - creatureTemplate.maxlevel = fields[15].GetUInt8(); - creatureTemplate.expansion = uint32(fields[16].GetInt16()); - creatureTemplate.faction = uint32(fields[17].GetUInt16()); - creatureTemplate.npcflag = fields[18].GetUInt32(); - creatureTemplate.speed_walk = fields[19].GetFloat(); - creatureTemplate.speed_run = fields[20].GetFloat(); - creatureTemplate.scale = fields[21].GetFloat(); - creatureTemplate.rank = uint32(fields[22].GetUInt8()); - creatureTemplate.mindmg = fields[23].GetFloat(); - creatureTemplate.maxdmg = fields[24].GetFloat(); - creatureTemplate.dmgschool = uint32(fields[25].GetInt8()); - creatureTemplate.attackpower = fields[26].GetUInt32(); - creatureTemplate.dmg_multiplier = fields[27].GetFloat(); - creatureTemplate.baseattacktime = fields[28].GetUInt32(); - creatureTemplate.rangeattacktime = fields[29].GetUInt32(); - creatureTemplate.unit_class = uint32(fields[30].GetUInt8()); - creatureTemplate.unit_flags = fields[31].GetUInt32(); - creatureTemplate.unit_flags2 = fields[32].GetUInt32(); - creatureTemplate.dynamicflags = fields[33].GetUInt32(); - creatureTemplate.family = uint32(fields[34].GetUInt8()); - creatureTemplate.trainer_type = uint32(fields[35].GetUInt8()); - creatureTemplate.trainer_spell = fields[36].GetUInt32(); - creatureTemplate.trainer_class = uint32(fields[37].GetUInt8()); - creatureTemplate.trainer_race = uint32(fields[38].GetUInt8()); - creatureTemplate.minrangedmg = fields[39].GetFloat(); - creatureTemplate.maxrangedmg = fields[40].GetFloat(); - creatureTemplate.rangedattackpower = uint32(fields[41].GetUInt16()); - creatureTemplate.type = uint32(fields[42].GetUInt8()); - creatureTemplate.type_flags = fields[43].GetUInt32(); - creatureTemplate.lootid = fields[44].GetUInt32(); - creatureTemplate.pickpocketLootId = fields[45].GetUInt32(); - creatureTemplate.SkinLootId = fields[46].GetUInt32(); - - for (uint8 i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i) - creatureTemplate.resistance[i] = fields[47 + i -1].GetInt16(); - - for (uint8 i = 0; i < CREATURE_MAX_SPELLS; ++i) - creatureTemplate.spells[i] = fields[53 + i].GetUInt32(); - - creatureTemplate.PetSpellDataId = fields[61].GetUInt32(); - creatureTemplate.VehicleId = fields[62].GetUInt32(); - creatureTemplate.mingold = fields[63].GetUInt32(); - creatureTemplate.maxgold = fields[64].GetUInt32(); - creatureTemplate.AIName = fields[65].GetString(); - creatureTemplate.MovementType = uint32(fields[66].GetUInt8()); - creatureTemplate.InhabitType = uint32(fields[67].GetUInt8()); - creatureTemplate.HoverHeight = fields[68].GetFloat(); - creatureTemplate.ModHealth = fields[69].GetFloat(); - creatureTemplate.ModMana = fields[70].GetFloat(); - creatureTemplate.ModArmor = fields[71].GetFloat(); - creatureTemplate.RacialLeader = fields[72].GetBool(); - - for (uint8 i = 0; i < MAX_CREATURE_QUEST_ITEMS; ++i) - creatureTemplate.questItems[i] = fields[73 + i].GetUInt32(); - - creatureTemplate.movementId = fields[79].GetUInt32(); - creatureTemplate.RegenHealth = fields[80].GetBool(); - creatureTemplate.MechanicImmuneMask = fields[81].GetUInt32(); - creatureTemplate.flags_extra = fields[82].GetUInt32(); - creatureTemplate.ScriptID = GetScriptId(fields[83].GetCString()); - + LoadCreatureTemplate(fields); ++count; } while (result->NextRow()); @@ -517,6 +434,88 @@ void ObjectMgr::LoadCreatureTemplates() TC_LOG_INFO("server.loading", ">> Loaded %u creature definitions in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); } +void ObjectMgr::LoadCreatureTemplate(Field* fields) +{ + uint32 entry = fields[0].GetUInt32(); + + CreatureTemplate& creatureTemplate = _creatureTemplateStore[entry]; + + creatureTemplate.Entry = entry; + + for (uint8 i = 0; i < MAX_DIFFICULTY - 1; ++i) + creatureTemplate.DifficultyEntry[i] = fields[1 + i].GetUInt32(); + + for (uint8 i = 0; i < MAX_KILL_CREDIT; ++i) + creatureTemplate.KillCredit[i] = fields[4 + i].GetUInt32(); + + creatureTemplate.Modelid1 = fields[6].GetUInt32(); + creatureTemplate.Modelid2 = fields[7].GetUInt32(); + creatureTemplate.Modelid3 = fields[8].GetUInt32(); + creatureTemplate.Modelid4 = fields[9].GetUInt32(); + creatureTemplate.Name = fields[10].GetString(); + creatureTemplate.SubName = fields[11].GetString(); + creatureTemplate.IconName = fields[12].GetString(); + creatureTemplate.GossipMenuId = fields[13].GetUInt32(); + creatureTemplate.minlevel = fields[14].GetUInt8(); + creatureTemplate.maxlevel = fields[15].GetUInt8(); + creatureTemplate.expansion = uint32(fields[16].GetInt16()); + creatureTemplate.faction = fields[17].GetUInt16(); + creatureTemplate.npcflag = fields[18].GetUInt32(); + creatureTemplate.speed_walk = fields[19].GetFloat(); + creatureTemplate.speed_run = fields[20].GetFloat(); + creatureTemplate.scale = fields[21].GetFloat(); + creatureTemplate.rank = fields[22].GetUInt8(); + creatureTemplate.dmgschool = uint32(fields[23].GetInt8()); + creatureTemplate.BaseAttackTime = fields[24].GetUInt32(); + creatureTemplate.RangeAttackTime = fields[25].GetUInt32(); + creatureTemplate.BaseVariance = fields[26].GetFloat(); + creatureTemplate.RangeVariance = fields[27].GetFloat(); + creatureTemplate.unit_class = fields[28].GetUInt8(); + creatureTemplate.unit_flags = fields[29].GetUInt32(); + creatureTemplate.unit_flags2 = fields[30].GetUInt32(); + creatureTemplate.dynamicflags = fields[31].GetUInt32(); + creatureTemplate.family = fields[32].GetUInt8(); + creatureTemplate.trainer_type = fields[33].GetUInt8(); + creatureTemplate.trainer_spell = fields[34].GetUInt32(); + creatureTemplate.trainer_class = fields[35].GetUInt8(); + creatureTemplate.trainer_race = fields[36].GetUInt8(); + creatureTemplate.type = fields[37].GetUInt8(); + creatureTemplate.type_flags = fields[38].GetUInt32(); + creatureTemplate.lootid = fields[39].GetUInt32(); + creatureTemplate.pickpocketLootId = fields[40].GetUInt32(); + creatureTemplate.SkinLootId = fields[41].GetUInt32(); + + for (uint8 i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i) + creatureTemplate.resistance[i] = fields[42 + i - 1].GetInt16(); + + for (uint8 i = 0; i < CREATURE_MAX_SPELLS; ++i) + creatureTemplate.spells[i] = fields[48 + i].GetUInt32(); + + creatureTemplate.PetSpellDataId = fields[56].GetUInt32(); + creatureTemplate.VehicleId = fields[57].GetUInt32(); + creatureTemplate.mingold = fields[58].GetUInt32(); + creatureTemplate.maxgold = fields[59].GetUInt32(); + creatureTemplate.AIName = fields[60].GetString(); + creatureTemplate.MovementType = fields[61].GetUInt8(); + creatureTemplate.InhabitType = fields[62].GetUInt8(); + creatureTemplate.HoverHeight = fields[63].GetFloat(); + creatureTemplate.ModHealth = fields[64].GetFloat(); + creatureTemplate.ModMana = fields[65].GetFloat(); + creatureTemplate.ModArmor = fields[66].GetFloat(); + creatureTemplate.ModDamage = fields[67].GetFloat(); + creatureTemplate.ModExperience = fields[68].GetFloat(); + creatureTemplate.RacialLeader = fields[69].GetBool(); + + for (uint8 i = 0; i < MAX_CREATURE_QUEST_ITEMS; ++i) + creatureTemplate.questItems[i] = fields[70 + i].GetUInt32(); + + creatureTemplate.movementId = fields[76].GetUInt32(); + creatureTemplate.RegenHealth = fields[77].GetBool(); + creatureTemplate.MechanicImmuneMask = fields[78].GetUInt32(); + creatureTemplate.flags_extra = fields[79].GetUInt32(); + creatureTemplate.ScriptID = GetScriptId(fields[80].GetCString()); +} + void ObjectMgr::LoadCreatureTemplateAddons() { uint32 oldMSTime = getMSTime(); @@ -856,11 +855,11 @@ void ObjectMgr::CheckCreatureTemplate(CreatureTemplate const* cInfo) const_cast<CreatureTemplate*>(cInfo)->dmgschool = SPELL_SCHOOL_NORMAL; } - if (cInfo->baseattacktime == 0) - const_cast<CreatureTemplate*>(cInfo)->baseattacktime = BASE_ATTACK_TIME; + if (cInfo->BaseAttackTime == 0) + const_cast<CreatureTemplate*>(cInfo)->BaseAttackTime = BASE_ATTACK_TIME; - if (cInfo->rangeattacktime == 0) - const_cast<CreatureTemplate*>(cInfo)->rangeattacktime = BASE_ATTACK_TIME; + if (cInfo->RangeAttackTime == 0) + const_cast<CreatureTemplate*>(cInfo)->RangeAttackTime = BASE_ATTACK_TIME; if ((cInfo->npcflag & UNIT_NPC_FLAG_TRAINER) && cInfo->trainer_type >= MAX_TRAINER_TYPE) TC_LOG_ERROR("sql.sql", "Creature (Entry: %u) has wrong trainer type %u.", cInfo->Entry, cInfo->trainer_type); @@ -955,7 +954,7 @@ void ObjectMgr::CheckCreatureTemplate(CreatureTemplate const* cInfo) const_cast<CreatureTemplate*>(cInfo)->flags_extra &= CREATURE_FLAG_EXTRA_DB_ALLOWED; } - const_cast<CreatureTemplate*>(cInfo)->dmg_multiplier *= Creature::_GetDamageMod(cInfo->rank); + const_cast<CreatureTemplate*>(cInfo)->ModDamage *= Creature::_GetDamageMod(cInfo->rank); } void ObjectMgr::LoadCreatureAddons() @@ -2199,7 +2198,7 @@ void ObjectMgr::LoadItemLocales() ItemLocale& data = _itemLocaleStore[entry]; - for (uint8 i = 1; i < TOTAL_LOCALES; ++i) + for (uint8 i = TOTAL_LOCALES - 1; i > 0; --i) { LocaleConstant locale = (LocaleConstant) i; AddLocaleString(fields[1 + 2 * (i - 1)].GetString(), locale, data.Name); @@ -2207,7 +2206,7 @@ void ObjectMgr::LoadItemLocales() } } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %lu Item locale strings in %u ms", (unsigned long)_itemLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u Item locale strings in %u ms", uint32(_itemLocaleStore.size()), GetMSTimeDiffToNow(oldMSTime)); } void ObjectMgr::LoadItemTemplates() @@ -2841,7 +2840,7 @@ void ObjectMgr::LoadItemSetNameLocales() ItemSetNameLocale& data = _itemSetNameLocaleStore[entry]; - for (uint8 i = 1; i < TOTAL_LOCALES; ++i) + for (uint8 i = TOTAL_LOCALES - 1; i > 0; --i) AddLocaleString(fields[i].GetString(), LocaleConstant(i), data.Name); } while (result->NextRow()); @@ -4523,7 +4522,7 @@ void ObjectMgr::LoadQuestLocales() QuestLocale& data = _questLocaleStore[entry]; - for (uint8 i = 1; i < TOTAL_LOCALES; ++i) + for (uint8 i = TOTAL_LOCALES - 1; i > 0; --i) { LocaleConstant locale = (LocaleConstant) i; @@ -4540,7 +4539,7 @@ void ObjectMgr::LoadQuestLocales() } } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %lu Quest locale strings in %u ms", (unsigned long)_questLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u Quest locale strings in %u ms", uint32(_questLocaleStore.size()), GetMSTimeDiffToNow(oldMSTime)); } void ObjectMgr::LoadScripts(ScriptsType type) @@ -5152,11 +5151,11 @@ void ObjectMgr::LoadPageTextLocales() PageTextLocale& data = _pageTextLocaleStore[entry]; - for (uint8 i = 1; i < TOTAL_LOCALES; ++i) + for (uint8 i = TOTAL_LOCALES - 1; i > 0; --i) AddLocaleString(fields[i].GetString(), LocaleConstant(i), data.Text); } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %lu PageText locale strings in %u ms", (unsigned long)_pageTextLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u PageText locale strings in %u ms", uint32(_pageTextLocaleStore.size()), GetMSTimeDiffToNow(oldMSTime)); } void ObjectMgr::LoadInstanceTemplate() @@ -5400,10 +5399,10 @@ void ObjectMgr::LoadNpcTextLocales() NpcTextLocale& data = _npcTextLocaleStore[entry]; - for (uint8 i = 1; i < TOTAL_LOCALES; ++i) + for (uint8 i = TOTAL_LOCALES - 1; i > 0; --i) { LocaleConstant locale = (LocaleConstant) i; - for (uint8 j = 0; j < MAX_LOCALES; ++j) + for (uint8 j = 0; j < MAX_GOSSIP_TEXT_OPTIONS; ++j) { AddLocaleString(fields[1 + 8 * 2 * (i - 1) + 2 * j].GetString(), locale, data.Text_0[j]); AddLocaleString(fields[1 + 8 * 2 * (i - 1) + 2 * j + 1].GetString(), locale, data.Text_1[j]); @@ -5411,7 +5410,7 @@ void ObjectMgr::LoadNpcTextLocales() } } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %lu NpcText locale strings in %u ms", (unsigned long)_npcTextLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u NpcText locale strings in %u ms", uint32(_npcTextLocaleStore.size()), GetMSTimeDiffToNow(oldMSTime)); } //not very fast function but it is called only once a day, or on starting-up @@ -6435,14 +6434,14 @@ void ObjectMgr::LoadGameObjectLocales() GameObjectLocale& data = _gameObjectLocaleStore[entry]; - for (uint8 i = 1; i < TOTAL_LOCALES; ++i) + for (uint8 i = TOTAL_LOCALES - 1; i > 0; --i) + { AddLocaleString(fields[i].GetString(), LocaleConstant(i), data.Name); - - for (uint8 i = 1; i < TOTAL_LOCALES; ++i) AddLocaleString(fields[i + (TOTAL_LOCALES - 1)].GetString(), LocaleConstant(i), data.CastBarCaption); + } } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %lu gameobject locale strings in %u ms", (unsigned long)_gameObjectLocaleStore.size(), GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u gameobject locale strings in %u ms", uint32(_gameObjectLocaleStore.size()), GetMSTimeDiffToNow(oldMSTime)); } inline void CheckGOLockId(GameObjectTemplate const* goInfo, uint32 dataN, uint32 N) @@ -7758,7 +7757,7 @@ bool ObjectMgr::LoadTrinityStrings(const char* table, int32 min_value, int32 max data.Content.resize(1); ++count; - for (uint8 i = 0; i < TOTAL_LOCALES; ++i) + for (int8 i = TOTAL_LOCALES - 1; i >= 0; --i) AddLocaleString(fields[i + 1].GetString(), LocaleConstant(i), data.Content); } while (result->NextRow()); @@ -8780,11 +8779,11 @@ void ObjectMgr::LoadBroadcastTextLocales() continue; } - for (uint8 i = 1; i < TOTAL_LOCALES; ++i) + for (uint8 i = TOTAL_LOCALES - 1; i > 0; --i) { LocaleConstant locale = LocaleConstant(i); - ObjectMgr::AddLocaleString(fields[1 + (i - 1)].GetString(), locale, bct->second.MaleText); - ObjectMgr::AddLocaleString(fields[9 + (i - 1)].GetString(), locale, bct->second.FemaleText); + AddLocaleString(fields[1 + (i - 1)].GetString(), locale, bct->second.MaleText); + AddLocaleString(fields[9 + (i - 1)].GetString(), locale, bct->second.FemaleText); } ++count; diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index 738b99778f8..56ae4a4c6d1 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -961,6 +961,7 @@ class ObjectMgr void LoadCreatureLocales(); void LoadCreatureTemplates(); void LoadCreatureTemplateAddons(); + void LoadCreatureTemplate(Field* fields); void CheckCreatureTemplate(CreatureTemplate const* cInfo); void LoadTempSummons(); void LoadCreatures(); diff --git a/src/server/game/Handlers/NPCHandler.h b/src/server/game/Handlers/NPCHandler.h index 7210d9a53b5..855536c7d9e 100644 --- a/src/server/game/Handlers/NPCHandler.h +++ b/src/server/game/Handlers/NPCHandler.h @@ -51,10 +51,10 @@ struct PageTextLocale struct NpcTextLocale { - NpcTextLocale() { Text_0.resize(8); Text_1.resize(8); } + NpcTextLocale() { } - std::vector<StringVector> Text_0; - std::vector<StringVector> Text_1; + StringVector Text_0[MAX_GOSSIP_TEXT_OPTIONS]; + StringVector Text_1[MAX_GOSSIP_TEXT_OPTIONS]; }; #endif diff --git a/src/server/game/Miscellaneous/Formulas.h b/src/server/game/Miscellaneous/Formulas.h index 8d0e97dc765..e6ff1a0b40f 100644 --- a/src/server/game/Miscellaneous/Formulas.h +++ b/src/server/game/Miscellaneous/Formulas.h @@ -160,27 +160,32 @@ namespace Trinity inline uint32 Gain(Player* player, Unit* u) { - uint32 gain; + Creature* creature = u->ToCreature(); + uint32 gain = 0; - if (u->GetTypeId() == TYPEID_UNIT && - (((Creature*)u)->IsTotem() || ((Creature*)u)->IsPet() || - (((Creature*)u)->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_XP_AT_KILL) || - ((Creature*)u)->GetCreatureTemplate()->type == CREATURE_TYPE_CRITTER)) - gain = 0; - else + if (!creature || (!creature->IsTotem() && !creature->IsPet() && !creature->IsCritter() && + !(creature->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_NO_XP_AT_KILL))) { + float xpMod = 1.0f; + gain = BaseGain(player->getLevel(), u->getLevel(), GetContentLevelsForMapAndZone(u->GetMapId(), u->GetZoneId())); - if (gain != 0 && u->GetTypeId() == TYPEID_UNIT && ((Creature*)u)->isElite()) + if (gain && creature) { - // Elites in instances have a 2.75x XP bonus instead of the regular 2x world bonus. - if (u->GetMap() && u->GetMap()->IsDungeon()) - gain = uint32(gain * 2.75); - else - gain *= 2; + if (creature->isElite()) + { + // Elites in instances have a 2.75x XP bonus instead of the regular 2x world bonus. + if (u->GetMap() && u->GetMap()->IsDungeon()) + xpMod *= 2.75f; + else + xpMod *= 2.0f; + } + + xpMod *= creature->GetCreatureTemplate()->ModExperience; } - gain = uint32(gain * sWorld->getRate(RATE_XP_KILL)); + xpMod *= sWorld->getRate(RATE_XP_KILL); + gain = uint32(gain * xpMod); } sScriptMgr->OnGainCalculation(gain, player, u); diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index ed3bb74ae9d..5309229b0fc 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -529,7 +529,7 @@ enum SpellAttr6 enum SpellAttr7 { SPELL_ATTR7_UNK0 = 0x00000001, // 0 Shaman's new spells (Call of the ...), Feign Death. - SPELL_ATTR7_UNK1 = 0x00000002, // 1 Not set in 3.2.2a. + SPELL_ATTR7_IGNORE_DURATION_MODS = 0x00000002, // 1 Duration is not affected by duration modifiers SPELL_ATTR7_REACTIVATE_AT_RESURRECT = 0x00000004, // 2 Paladin's auras and 65607 only. SPELL_ATTR7_IS_CHEAT_SPELL = 0x00000008, // 3 Cannot cast if caster doesn't have UnitFlag2 & UNIT_FLAG2_ALLOW_CHEAT_SPELLS SPELL_ATTR7_UNK4 = 0x00000010, // 4 Only 47883 (Soulstone Resurrection) and test spell. diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp index a0185bf7709..d036d438926 100644 --- a/src/server/game/Scripting/ScriptLoader.cpp +++ b/src/server/game/Scripting/ScriptLoader.cpp @@ -266,7 +266,6 @@ void AddSC_blasted_lands(); void AddSC_burning_steppes(); void AddSC_duskwood(); void AddSC_eastern_plaguelands(); -void AddSC_eversong_woods(); void AddSC_ghostlands(); void AddSC_hinterlands(); void AddSC_isle_of_queldanas(); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 98633281e19..2e6a699fc7c 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -373,22 +373,21 @@ class WorldSession void SetLatency(uint32 latency) { m_latency = latency; } void ResetClientTimeDelay() { m_clientTimeDelay = 0; } - std::atomic<time_t> m_timeOutTime; + std::atomic<int32> m_timeOutTime; void UpdateTimeOutTime(uint32 diff) { - if (time_t(diff) > m_timeOutTime) - m_timeOutTime = 0; - else - m_timeOutTime -= diff; + m_timeOutTime -= int32(diff); } + void ResetTimeOutTime() { - m_timeOutTime = sWorld->getIntConfig(CONFIG_SOCKET_TIMEOUTTIME); + m_timeOutTime = int32(sWorld->getIntConfig(CONFIG_SOCKET_TIMEOUTTIME)); } + bool IsConnectionIdle() const { - return (m_timeOutTime <= 0 && !m_inQueue); + return m_timeOutTime <= 0 && !m_inQueue; } // Recruit-A-Friend Handling diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index c81b3ebc6fe..14cf256d98e 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -5088,7 +5088,7 @@ SpellCastResult Spell::CheckCast(bool strict) return SPELL_FAILED_TARGET_UNSKINNABLE; Creature* creature = m_targets.GetUnitTarget()->ToCreature(); - if (creature->GetCreatureType() != CREATURE_TYPE_CRITTER && !creature->loot.isLooted()) + if (!creature->IsCritter() && !creature->loot.isLooted()) return SPELL_FAILED_TARGET_NOT_LOOTED; uint32 skill = creature->GetCreatureTemplate()->GetRequiredLootSkill(); diff --git a/src/server/game/Texts/CreatureTextMgr.cpp b/src/server/game/Texts/CreatureTextMgr.cpp index 8bd7a5a5e71..0412128754c 100644 --- a/src/server/game/Texts/CreatureTextMgr.cpp +++ b/src/server/game/Texts/CreatureTextMgr.cpp @@ -180,7 +180,7 @@ void CreatureTextMgr::LoadCreatureTextLocales() { Field* fields = result->Fetch(); CreatureTextLocale& loc = mLocaleTextMap[CreatureTextId(fields[0].GetUInt32(), uint32(fields[1].GetUInt8()), uint32(fields[2].GetUInt8()))]; - for (uint8 i = 1; i < TOTAL_LOCALES; ++i) + for (uint8 i = TOTAL_LOCALES - 1; i > 0; --i) { LocaleConstant locale = LocaleConstant(i); ObjectMgr::AddLocaleString(fields[3 + i - 1].GetString(), locale, loc.Text); diff --git a/src/server/scripts/Commands/cs_ban.cpp b/src/server/scripts/Commands/cs_ban.cpp index cc5c8e49c69..a90bbd69e24 100644 --- a/src/server/scripts/Commands/cs_ban.cpp +++ b/src/server/scripts/Commands/cs_ban.cpp @@ -109,21 +109,23 @@ public: return false; } - switch (sWorld->BanCharacter(name, durationStr, reasonStr, handler->GetSession() ? handler->GetSession()->GetPlayerName().c_str() : "")) + std::string author = handler->GetSession() ? handler->GetSession()->GetPlayerName() : "Server"; + + switch (sWorld->BanCharacter(name, durationStr, reasonStr, author)) { case BAN_SUCCESS: { if (atoi(durationStr) > 0) { if (sWorld->getBoolConfig(CONFIG_SHOW_BAN_IN_WORLD)) - sWorld->SendWorldText(LANG_BAN_CHARACTER_YOUBANNEDMESSAGE_WORLD, (handler->GetSession() ? handler->GetSession()->GetPlayerName().c_str() : "Server"), name.c_str(), secsToTimeString(TimeStringToSecs(durationStr), true).c_str(), reasonStr); + sWorld->SendWorldText(LANG_BAN_CHARACTER_YOUBANNEDMESSAGE_WORLD, author.c_str(), name.c_str(), secsToTimeString(TimeStringToSecs(durationStr), true).c_str(), reasonStr); else handler->PSendSysMessage(LANG_BAN_YOUBANNED, name.c_str(), secsToTimeString(TimeStringToSecs(durationStr), true).c_str(), reasonStr); } else { if (sWorld->getBoolConfig(CONFIG_SHOW_BAN_IN_WORLD)) - sWorld->SendWorldText(LANG_BAN_CHARACTER_YOUPERMBANNEDMESSAGE_WORLD, (handler->GetSession() ? handler->GetSession()->GetPlayerName().c_str() : "Server"), name.c_str(), reasonStr); + sWorld->SendWorldText(LANG_BAN_CHARACTER_YOUPERMBANNEDMESSAGE_WORLD, author.c_str(), name.c_str(), reasonStr); else handler->PSendSysMessage(LANG_BAN_YOUPERMBANNED, name.c_str(), reasonStr); } @@ -195,20 +197,22 @@ public: break; } - switch (sWorld->BanAccount(mode, nameOrIP, durationStr, reasonStr, handler->GetSession() ? handler->GetSession()->GetPlayerName().c_str() : "")) + std::string author = handler->GetSession() ? handler->GetSession()->GetPlayerName() : "Server"; + + switch (sWorld->BanAccount(mode, nameOrIP, durationStr, reasonStr, author)) { case BAN_SUCCESS: if (atoi(durationStr) > 0) { if (sWorld->getBoolConfig(CONFIG_SHOW_BAN_IN_WORLD)) - sWorld->SendWorldText(LANG_BAN_ACCOUNT_YOUBANNEDMESSAGE_WORLD, (handler->GetSession() ? handler->GetSession()->GetPlayerName().c_str() : "Server"), nameOrIP.c_str(), secsToTimeString(TimeStringToSecs(durationStr), true).c_str(), reasonStr); + sWorld->SendWorldText(LANG_BAN_ACCOUNT_YOUBANNEDMESSAGE_WORLD, author.c_str(), nameOrIP.c_str(), secsToTimeString(TimeStringToSecs(durationStr), true).c_str(), reasonStr); else handler->PSendSysMessage(LANG_BAN_YOUBANNED, nameOrIP.c_str(), secsToTimeString(TimeStringToSecs(durationStr), true).c_str(), reasonStr); } else { if (sWorld->getBoolConfig(CONFIG_SHOW_BAN_IN_WORLD)) - sWorld->SendWorldText(LANG_BAN_ACCOUNT_YOUPERMBANNEDMESSAGE_WORLD, (handler->GetSession() ? handler->GetSession()->GetPlayerName().c_str() : "Server"), nameOrIP.c_str(), reasonStr); + sWorld->SendWorldText(LANG_BAN_ACCOUNT_YOUPERMBANNEDMESSAGE_WORLD, author.c_str(), nameOrIP.c_str(), reasonStr); else handler->PSendSysMessage(LANG_BAN_YOUPERMBANNED, nameOrIP.c_str(), reasonStr); } diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 47128dd9911..a3848c00877 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -1609,16 +1609,7 @@ public: banReason = fields[3].GetString(); } - // Can be used to query data from World database - stmt2 = WorldDatabase.GetPreparedStatement(WORLD_SEL_REQ_XP); - stmt2->setUInt8(0, level); - PreparedQueryResult result3 = WorldDatabase.Query(stmt2); - if (result3) - { - Field* fields = result3->Fetch(); - xptotal = fields[0].GetUInt32(); - } // Can be used to query data from Characters database stmt2 = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PINFO_XP); @@ -1630,6 +1621,7 @@ public: Field* fields = result4->Fetch(); xp = fields[0].GetUInt32(); // Used for "current xp" output and "%u XP Left" calculation uint32 gguid = fields[1].GetUInt32(); // We check if have a guild for the person, so we might not require to query it at all + xptotal = sObjectMgr->GetXPForLevel(level); if (gguid != 0) { @@ -1766,10 +1758,10 @@ public: Player* player = handler->GetSession()->GetPlayer(); // accept only explicitly selected target (not implicitly self targeting case) - Unit* target = handler->getSelectedUnit(); - if (player->GetTarget() && target) + Creature* target = player->GetTarget() ? handler->getSelectedCreature() : nullptr; + if (target) { - if (target->GetTypeId() != TYPEID_UNIT || target->IsPet()) + if (target->IsPet()) { handler->SendSysMessage(LANG_SELECT_CREATURE); handler->SetSentErrorMessage(true); @@ -1777,19 +1769,13 @@ public: } if (target->isDead()) - target->ToCreature()->Respawn(); + target->Respawn(); return true; } - CellCoord p(Trinity::ComputeCellCoord(player->GetPositionX(), player->GetPositionY())); - Cell cell(p); - cell.SetNoCreate(); - Trinity::RespawnDo u_do; Trinity::WorldObjectWorker<Trinity::RespawnDo> worker(player, u_do); - - TypeContainerVisitor<Trinity::WorldObjectWorker<Trinity::RespawnDo>, GridTypeMapContainer > obj_worker(worker); - cell.Visit(p, obj_worker, *player->GetMap(), *player, player->GetGridActivationRange()); + player->VisitNearbyGridObject(player->GetGridActivationRange(), worker); return true; } @@ -1843,14 +1829,9 @@ public: std::string nameLink = handler->playerLink(targetName); if (sWorld->getBoolConfig(CONFIG_SHOW_MUTE_IN_WORLD)) - { - sWorld->SendWorldText(LANG_COMMAND_MUTEMESSAGE_WORLD, (handler->GetSession() ? handler->GetSession()->GetPlayerName().c_str() : "Server"), nameLink.c_str(), notSpeakTime, muteReasonStr.c_str()); - ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOUR_CHAT_DISABLED, notSpeakTime, muteBy.c_str(), muteReasonStr.c_str()); - } - else - { - ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOUR_CHAT_DISABLED, notSpeakTime, muteBy.c_str(), muteReasonStr.c_str()); - } + sWorld->SendWorldText(LANG_COMMAND_MUTEMESSAGE_WORLD, muteBy.c_str(), nameLink.c_str(), notSpeakTime, muteReasonStr.c_str()); + + ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOUR_CHAT_DISABLED, notSpeakTime, muteBy.c_str(), muteReasonStr.c_str()); } else { @@ -1865,10 +1846,11 @@ public: LoginDatabase.Execute(stmt); std::string nameLink = handler->playerLink(targetName); - if (sWorld->getBoolConfig(CONFIG_SHOW_MUTE_IN_WORLD) && !target) - sWorld->SendWorldText(LANG_COMMAND_MUTEMESSAGE_WORLD, handler->GetSession()->GetPlayerName().c_str(), nameLink.c_str(), notSpeakTime, muteReasonStr.c_str()); - else - handler->PSendSysMessage(target ? LANG_YOU_DISABLE_CHAT : LANG_COMMAND_DISABLE_CHAT_DELAYED, nameLink.c_str(), notSpeakTime, muteReasonStr.c_str()); + if (sWorld->getBoolConfig(CONFIG_SHOW_MUTE_IN_WORLD) && !target) + sWorld->SendWorldText(LANG_COMMAND_MUTEMESSAGE_WORLD, muteBy.c_str(), nameLink.c_str(), notSpeakTime, muteReasonStr.c_str()); + else + handler->PSendSysMessage(target ? LANG_YOU_DISABLE_CHAT : LANG_COMMAND_DISABLE_CHAT_DELAYED, nameLink.c_str(), notSpeakTime, muteReasonStr.c_str()); + return true; } diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp index cc4bf3dd22f..70aacbfc227 100644 --- a/src/server/scripts/Commands/cs_reload.cpp +++ b/src/server/scripts/Commands/cs_reload.cpp @@ -440,7 +440,7 @@ public: continue; } - CreatureTemplate* cInfo = const_cast<CreatureTemplate*>(sObjectMgr->GetCreatureTemplate(entry)); + CreatureTemplate const* cInfo = sObjectMgr->GetCreatureTemplate(entry); if (!cInfo) { handler->PSendSysMessage(LANG_COMMAND_CREATURESTORAGE_NOTFOUND, entry); @@ -450,89 +450,7 @@ public: TC_LOG_INFO("misc", "Reloading creature template entry %u", entry); Field* fields = result->Fetch(); - - cInfo->DifficultyEntry[0] = fields[0].GetUInt32(); - cInfo->DifficultyEntry[1] = fields[1].GetUInt32(); - cInfo->DifficultyEntry[2] = fields[2].GetUInt32(); - cInfo->KillCredit[0] = fields[3].GetUInt32(); - cInfo->KillCredit[1] = fields[4].GetUInt32(); - cInfo->Modelid1 = fields[5].GetUInt32(); - cInfo->Modelid2 = fields[6].GetUInt32(); - cInfo->Modelid3 = fields[7].GetUInt32(); - cInfo->Modelid4 = fields[8].GetUInt32(); - cInfo->Name = fields[9].GetString(); - cInfo->SubName = fields[10].GetString(); - cInfo->IconName = fields[11].GetString(); - cInfo->GossipMenuId = fields[12].GetUInt32(); - cInfo->minlevel = fields[13].GetUInt8(); - cInfo->maxlevel = fields[14].GetUInt8(); - cInfo->expansion = fields[15].GetUInt16(); - cInfo->faction = fields[16].GetUInt16(); - cInfo->npcflag = fields[17].GetUInt32(); - cInfo->speed_walk = fields[18].GetFloat(); - cInfo->speed_run = fields[19].GetFloat(); - cInfo->scale = fields[20].GetFloat(); - cInfo->rank = fields[21].GetUInt8(); - cInfo->mindmg = fields[22].GetFloat(); - cInfo->maxdmg = fields[23].GetFloat(); - cInfo->dmgschool = fields[24].GetUInt8(); - cInfo->attackpower = fields[25].GetUInt32(); - cInfo->dmg_multiplier = fields[26].GetFloat(); - cInfo->baseattacktime = fields[27].GetUInt32(); - cInfo->rangeattacktime = fields[28].GetUInt32(); - cInfo->unit_class = fields[29].GetUInt8(); - cInfo->unit_flags = fields[30].GetUInt32(); - cInfo->unit_flags2 = fields[31].GetUInt32(); - cInfo->dynamicflags = fields[32].GetUInt32(); - cInfo->family = fields[33].GetUInt8(); - cInfo->trainer_type = fields[34].GetUInt8(); - cInfo->trainer_spell = fields[35].GetUInt32(); - cInfo->trainer_class = fields[36].GetUInt8(); - cInfo->trainer_race = fields[37].GetUInt8(); - cInfo->minrangedmg = fields[38].GetFloat(); - cInfo->maxrangedmg = fields[39].GetFloat(); - cInfo->rangedattackpower = fields[40].GetUInt16(); - cInfo->type = fields[41].GetUInt8(); - cInfo->type_flags = fields[42].GetUInt32(); - cInfo->lootid = fields[43].GetUInt32(); - cInfo->pickpocketLootId = fields[44].GetUInt32(); - cInfo->SkinLootId = fields[45].GetUInt32(); - - for (uint8 i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i) - cInfo->resistance[i] = fields[46 + i -1].GetUInt16(); - - cInfo->spells[0] = fields[52].GetUInt32(); - cInfo->spells[1] = fields[53].GetUInt32(); - cInfo->spells[2] = fields[54].GetUInt32(); - cInfo->spells[3] = fields[55].GetUInt32(); - cInfo->spells[4] = fields[56].GetUInt32(); - cInfo->spells[5] = fields[57].GetUInt32(); - cInfo->spells[6] = fields[58].GetUInt32(); - cInfo->spells[7] = fields[59].GetUInt32(); - cInfo->PetSpellDataId = fields[60].GetUInt32(); - cInfo->VehicleId = fields[61].GetUInt32(); - cInfo->mingold = fields[62].GetUInt32(); - cInfo->maxgold = fields[63].GetUInt32(); - cInfo->AIName = fields[64].GetString(); - cInfo->MovementType = fields[65].GetUInt8(); - cInfo->InhabitType = fields[66].GetUInt8(); - cInfo->HoverHeight = fields[67].GetFloat(); - cInfo->ModHealth = fields[68].GetFloat(); - cInfo->ModMana = fields[69].GetFloat(); - cInfo->ModArmor = fields[70].GetFloat(); - cInfo->RacialLeader = fields[71].GetBool(); - cInfo->questItems[0] = fields[72].GetUInt32(); - cInfo->questItems[1] = fields[73].GetUInt32(); - cInfo->questItems[2] = fields[74].GetUInt32(); - cInfo->questItems[3] = fields[75].GetUInt32(); - cInfo->questItems[4] = fields[76].GetUInt32(); - cInfo->questItems[5] = fields[77].GetUInt32(); - cInfo->movementId = fields[78].GetUInt32(); - cInfo->RegenHealth = fields[79].GetBool(); - cInfo->MechanicImmuneMask = fields[80].GetUInt32(); - cInfo->flags_extra = fields[81].GetUInt32(); - cInfo->ScriptID = sObjectMgr->GetScriptId(fields[82].GetCString()); - + sObjectMgr->LoadCreatureTemplate(fields); sObjectMgr->CheckCreatureTemplate(cInfo); } diff --git a/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp b/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp index f996bcc6f70..e3021ff7a95 100644 --- a/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp +++ b/src/server/scripts/Kalimdor/RazorfenKraul/razorfen_kraul.cpp @@ -47,27 +47,20 @@ class npc_willix : public CreatureScript public: npc_willix() : CreatureScript("npc_willix") { } - bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_WILLIX_THE_IMPORTER) - { - ENSURE_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); - creature->AI()->Talk(SAY_READY, player); - creature->setFaction(113); - } - - return true; - } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_willixAI(creature); - } - struct npc_willixAI : public npc_escortAI { npc_willixAI(Creature* creature) : npc_escortAI(creature) { } + void sQuestAccept(Player* player, Quest const* quest) override + { + if (quest->GetQuestId() == QUEST_WILLIX_THE_IMPORTER) + { + Start(true, false, player->GetGUID()); + Talk(SAY_READY, player); + me->setFaction(113); + } + } + void WaypointReached(uint32 waypointId) override { Player* player = GetPlayerForEscort(); @@ -137,6 +130,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_willixAI(creature); + } }; enum SnufflenoseGopher @@ -147,18 +144,6 @@ enum SnufflenoseGopher POINT_TUBBER = 0 }; -struct DistanceOrder : public std::binary_function<GameObject, GameObject, bool> -{ - DistanceOrder(Creature* me) : me(me) { } - - bool operator() (GameObject* first, GameObject* second) - { - return me->GetDistanceOrder(first, second); - } - - Creature* me; -}; - struct npc_snufflenose_gopher : public CreatureScript { public: @@ -208,18 +193,14 @@ public: if (tubbersInRange.empty()) return; - tubbersInRange.sort(DistanceOrder(me)); - GameObject* nearestTubber = NULL; - - for (std::list<GameObject*>::const_iterator itr = tubbersInRange.begin(); itr != tubbersInRange.end(); ++itr) + tubbersInRange.remove_if([](GameObject* go) { - if (!(*itr)->isSpawned() && (*itr)->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND)) - { - nearestTubber = *itr; - break; - } - } + return go->isSpawned() || !go->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND); + }); + tubbersInRange.sort(Trinity::ObjectDistanceOrderPred(me)); + + GameObject* nearestTubber = tubbersInRange.front(); if (!nearestTubber) return; @@ -259,21 +240,16 @@ class spell_snufflenose_command : public SpellScriptLoader { PrepareSpellScript(spell_snufflenose_commandSpellScript); - bool Load() override - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - void HandleAfterCast() + void HandleEffect(SpellEffIndex /*effIndex*/) { - if (Unit* target = GetCaster()->ToPlayer()->GetSelectedUnit()) + if (Creature* target = GetHitCreature()) if (target->GetEntry() == NPC_SNUFFLENOSE_GOPHER) - target->ToCreature()->AI()->DoAction(ACTION_FIND_NEW_TUBBER); + target->AI()->DoAction(ACTION_FIND_NEW_TUBBER); } void Register() override { - AfterCast += SpellCastFn(spell_snufflenose_commandSpellScript::HandleAfterCast); + OnEffectHitTarget += SpellEffectFn(spell_snufflenose_commandSpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_DUMMY); } }; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp index e1658e564ec..5ef84c7bb40 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp @@ -299,6 +299,12 @@ class boss_deathbringer_saurfang : public CreatureScript _introDone = true; + if (GameObject* teleporter = GameObject::GetGameObject(*me, instance->GetData64(GO_SCOURGE_TRANSPORTER_DEATHBRINGER))) + { + instance->HandleGameObject(0, false, teleporter); + teleporter->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + } + Talk(SAY_AGGRO); events.ScheduleEvent(EVENT_SUMMON_BLOOD_BEAST, 30000, 0, PHASE_COMBAT); events.ScheduleEvent(EVENT_BERSERK, IsHeroic() ? 360000 : 480000, 0, PHASE_COMBAT); @@ -538,12 +544,6 @@ class boss_deathbringer_saurfang : public CreatureScript case PHASE_INTRO_A: case PHASE_INTRO_H: { - if (GameObject* teleporter = GameObject::GetGameObject(*me, instance->GetData64(GO_SCOURGE_TRANSPORTER_SAURFANG))) - { - instance->HandleGameObject(0, false, teleporter); - teleporter->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); - } - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); // controls what events will execute events.SetPhase(uint32(action)); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp index 592c44940a4..e85ddc21dda 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp @@ -2102,7 +2102,15 @@ class at_icc_shutdown_traps : public AreaTriggerScript bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override { if (InstanceScript* instance = player->GetInstanceScript()) - instance->SetData(DATA_COLDFLAME_JETS, DONE); + { + instance->SetData(DATA_UPPERSPIRE_TELE_ACT, DONE); + uint64 teleporterGUID = instance->GetData64(GO_SCOURGE_TRANSPORTER_UPPERSPIRE); + if (GameObject* go = instance->instance->GetGameObject(teleporterGUID)) + { + go->SetGoState(GO_STATE_ACTIVE); + go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + } + } return true; } }; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h index da4a8f089cc..fbd3a715fb8 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h @@ -116,7 +116,8 @@ enum DataTypes DATA_HIGHLORD_TIRION_FORDRING = 37, DATA_ARTHAS_PLATFORM = 38, DATA_TERENAS_MENETHIL = 39, - DATA_ENEMY_GUNSHIP = 40 + DATA_ENEMY_GUNSHIP = 40, + DATA_UPPERSPIRE_TELE_ACT = 41, }; enum CreaturesIds @@ -322,6 +323,15 @@ enum CreaturesIds enum GameObjectsIds { + // ICC Teleporters + GO_SCOURGE_TRANSPORTER_LICHKING = 202223, + GO_SCOURGE_TRANSPORTER_UPPERSPIRE = 202235, + GO_SCOURGE_TRANSPORTER_LIGHTSHAMMER = 202242, + GO_SCOURGE_TRANSPORTER_RAMPART = 202243, + GO_SCOURGE_TRANSPORTER_DEATHBRINGER = 202244, + GO_SCOURGE_TRANSPORTER_ORATORY = 202245, + GO_SCOURGE_TRANSPORTER_SINDRAGOSA = 202246, + // Lower Spire Trash GO_SPIRIT_ALARM_1 = 201814, GO_SPIRIT_ALARM_2 = 201815, @@ -359,7 +369,6 @@ enum GameObjectsIds GO_DEATHBRINGER_S_CACHE_25N = 202240, GO_DEATHBRINGER_S_CACHE_10H = 202238, GO_DEATHBRINGER_S_CACHE_25H = 202241, - GO_SCOURGE_TRANSPORTER_SAURFANG = 202244, // Professor Putricide GO_ORANGE_PLAGUE_MONSTER_ENTRANCE = 201371, @@ -404,7 +413,6 @@ enum GameObjectsIds GO_SIGIL_OF_THE_FROSTWING = 202181, // The Lich King - GO_SCOURGE_TRANSPORTER_LK = 202223, GO_ARTHAS_PLATFORM = 202161, GO_ARTHAS_PRECIPICE = 202078, GO_DOODAD_ICECROWN_THRONEFROSTYWIND01 = 202188, diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp index 537c3c7354d..469bfc1d310 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp @@ -31,19 +31,23 @@ class icecrown_citadel_teleport : public GameObjectScript bool OnGossipHello(Player* player, GameObject* go) override { - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to Light's Hammer.", GOSSIP_SENDER_ICC_PORT, LIGHT_S_HAMMER_TELEPORT); if (InstanceScript* instance = go->GetInstanceScript()) { if (instance->GetBossState(DATA_LORD_MARROWGAR) == DONE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Oratory of the Damned.", GOSSIP_SENDER_ICC_PORT, ORATORY_OF_THE_DAMNED_TELEPORT); - if (instance->GetBossState(DATA_LADY_DEATHWHISPER) == DONE) + { + if (go->GetEntry() != GO_SCOURGE_TRANSPORTER_LIGHTSHAMMER) + player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to Light's Hammer.", GOSSIP_SENDER_ICC_PORT, LIGHT_S_HAMMER_TELEPORT); + if (go->GetEntry() != GO_SCOURGE_TRANSPORTER_ORATORY) + player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Oratory of the Damned.", GOSSIP_SENDER_ICC_PORT, ORATORY_OF_THE_DAMNED_TELEPORT); + } + if (instance->GetBossState(DATA_LADY_DEATHWHISPER) == DONE && go->GetEntry() != GO_SCOURGE_TRANSPORTER_RAMPART) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Rampart of Skulls.", GOSSIP_SENDER_ICC_PORT, RAMPART_OF_SKULLS_TELEPORT); - if (instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) == DONE) + if (instance->GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) == DONE && go->GetEntry() != GO_SCOURGE_TRANSPORTER_DEATHBRINGER) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Deathbringer's Rise.", GOSSIP_SENDER_ICC_PORT, DEATHBRINGER_S_RISE_TELEPORT); - if (instance->GetData(DATA_COLDFLAME_JETS) == DONE) + if (instance->GetData(DATA_UPPERSPIRE_TELE_ACT) == DONE && go->GetEntry() != GO_SCOURGE_TRANSPORTER_UPPERSPIRE) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to the Upper Spire.", GOSSIP_SENDER_ICC_PORT, UPPER_SPIRE_TELEPORT); /// @todo Gauntlet event before Sindragosa - if (instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) == DONE) + if (instance->GetBossState(DATA_VALITHRIA_DREAMWALKER) == DONE && go->GetEntry() != GO_SCOURGE_TRANSPORTER_SINDRAGOSA) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Teleport to Sindragosa's Lair", GOSSIP_SENDER_ICC_PORT, SINDRAGOSA_S_LAIR_TELEPORT); } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp index df5e3b795d5..f7f8e3e2489 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp @@ -127,7 +127,13 @@ class instance_icecrown_citadel : public InstanceMapScript DeathbringerSaurfangDoorGUID = 0; DeathbringerSaurfangEventGUID = 0; DeathbringersCacheGUID = 0; - SaurfangTeleportGUID = 0; + TeleporterLichKingGUID = 0; + TeleporterUpperSpireGUID = 0; + TeleporterLightsHammerGUID = 0; + TeleporterRampartsGUID = 0; + TeleporterDeathBringerGUID = 0; + TeleporterOratoryGUID = 0; + TeleporterSindragosaGUID = 0; PlagueSigilGUID = 0; BloodwingSigilGUID = 0; FrostwingSigilGUID = 0; @@ -164,10 +170,26 @@ class instance_icecrown_citadel : public InstanceMapScript IsNauseaEligible = true; IsOrbWhispererEligible = true; ColdflameJetsState = NOT_STARTED; + UpperSpireTeleporterActiveState = NOT_STARTED; BloodQuickeningState = NOT_STARTED; BloodQuickeningMinutes = 0; } + // A function to help reduce the number of lines for teleporter management. + void SetTeleporterState(GameObject* go, bool usable) + { + if (usable) + { + go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + go->SetGoState(GO_STATE_ACTIVE); + } + else + { + go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + go->SetGoState(GO_STATE_READY); + } + } + void FillInitialWorldStates(WorldPacket& data) override { data << uint32(WORLDSTATE_SHOW_TIMER) << uint32(BloodQuickeningState == IN_PROGRESS); @@ -542,8 +564,37 @@ class instance_icecrown_citadel : public InstanceMapScript case GO_DEATHBRINGER_S_CACHE_25H: DeathbringersCacheGUID = go->GetGUID(); break; - case GO_SCOURGE_TRANSPORTER_SAURFANG: - SaurfangTeleportGUID = go->GetGUID(); + case GO_SCOURGE_TRANSPORTER_LICHKING: + TeleporterLichKingGUID = go->GetGUID(); + if (GetBossState(DATA_PROFESSOR_PUTRICIDE) == DONE && GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) == DONE && GetBossState(DATA_SINDRAGOSA) == DONE) + go->SetGoState(GO_STATE_ACTIVE); + break; + case GO_SCOURGE_TRANSPORTER_UPPERSPIRE: + TeleporterUpperSpireGUID = go->GetGUID(); + if (GetBossState(DATA_DEATHBRINGER_SAURFANG) != DONE || GetData(DATA_UPPERSPIRE_TELE_ACT) != DONE) + SetTeleporterState(go, false); + else + SetTeleporterState(go, true); + break; + case GO_SCOURGE_TRANSPORTER_LIGHTSHAMMER: + TeleporterLightsHammerGUID = go->GetGUID(); + SetTeleporterState(go, GetBossState(DATA_LORD_MARROWGAR) == DONE); + break; + case GO_SCOURGE_TRANSPORTER_RAMPART: + TeleporterRampartsGUID = go->GetGUID(); + SetTeleporterState(go, GetBossState(DATA_LADY_DEATHWHISPER) == DONE); + break; + case GO_SCOURGE_TRANSPORTER_DEATHBRINGER: + TeleporterDeathBringerGUID = go->GetGUID(); + SetTeleporterState(go, GetBossState(DATA_ICECROWN_GUNSHIP_BATTLE) == DONE); + break; + case GO_SCOURGE_TRANSPORTER_ORATORY: + TeleporterOratoryGUID = go->GetGUID(); + SetTeleporterState(go, GetBossState(DATA_LORD_MARROWGAR) == DONE); + break; + case GO_SCOURGE_TRANSPORTER_SINDRAGOSA: + TeleporterSindragosaGUID = go->GetGUID(); + SetTeleporterState(go, GetBossState(DATA_VALITHRIA_DREAMWALKER) == DONE); break; case GO_PLAGUE_SIGIL: PlagueSigilGUID = go->GetGUID(); @@ -600,11 +651,6 @@ class instance_icecrown_citadel : public InstanceMapScript go->SetLootRecipient(valithria->GetLootRecipient()); go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED | GO_FLAG_NOT_SELECTABLE | GO_FLAG_NODESPAWN); break; - case GO_SCOURGE_TRANSPORTER_LK: - TheLichKingTeleportGUID = go->GetGUID(); - if (GetBossState(DATA_PROFESSOR_PUTRICIDE) == DONE && GetBossState(DATA_BLOOD_QUEEN_LANA_THEL) == DONE && GetBossState(DATA_SINDRAGOSA) == DONE) - go->SetGoState(GO_STATE_ACTIVE); - break; case GO_ARTHAS_PLATFORM: // this enables movement at The Frozen Throne, when printed this value is 0.000000f // however, when represented as integer client will accept only this value @@ -694,6 +740,8 @@ class instance_icecrown_citadel : public InstanceMapScript return RimefangTrash.size(); case DATA_COLDFLAME_JETS: return ColdflameJetsState; + case DATA_UPPERSPIRE_TELE_ACT: + return UpperSpireTeleporterActiveState; case DATA_TEAM_IN_INSTANCE: return TeamInInstance; case DATA_BLOOD_QUICKENING_STATE: @@ -721,8 +769,20 @@ class instance_icecrown_citadel : public InstanceMapScript return DeathbringerSaurfangEventGUID; case GO_SAURFANG_S_DOOR: return DeathbringerSaurfangDoorGUID; - case GO_SCOURGE_TRANSPORTER_SAURFANG: - return SaurfangTeleportGUID; + case GO_SCOURGE_TRANSPORTER_LICHKING: + return TeleporterLichKingGUID; + case GO_SCOURGE_TRANSPORTER_UPPERSPIRE: + return TeleporterUpperSpireGUID; + case GO_SCOURGE_TRANSPORTER_LIGHTSHAMMER: + return TeleporterLightsHammerGUID; + case GO_SCOURGE_TRANSPORTER_RAMPART: + return TeleporterRampartsGUID; + case GO_SCOURGE_TRANSPORTER_DEATHBRINGER: + return TeleporterDeathBringerGUID; + case GO_SCOURGE_TRANSPORTER_ORATORY: + return TeleporterOratoryGUID; + case GO_SCOURGE_TRANSPORTER_SINDRAGOSA: + return TeleporterSindragosaGUID; case DATA_FESTERGUT: return FestergutGUID; case DATA_ROTFACE: @@ -784,10 +844,24 @@ class instance_icecrown_citadel : public InstanceMapScript switch (type) { + case DATA_LORD_MARROWGAR: + { + if (state == DONE) + { + if (GameObject* teleporter = instance->GetGameObject(TeleporterLightsHammerGUID)) + SetTeleporterState(teleporter, true); + if (GameObject* teleporter = instance->GetGameObject(TeleporterOratoryGUID)) + SetTeleporterState(teleporter, true); + } + break; + } case DATA_LADY_DEATHWHISPER: { if (state == DONE) { + if (GameObject* teleporter = instance->GetGameObject(TeleporterRampartsGUID)) + SetTeleporterState(teleporter, true); + if (GameObject* elevator = instance->GetGameObject(LadyDeathwisperElevatorGUID)) { elevator->SetUInt32Value(GAMEOBJECT_LEVEL, 0); @@ -801,6 +875,9 @@ class instance_icecrown_citadel : public InstanceMapScript case DATA_ICECROWN_GUNSHIP_BATTLE: if (state == DONE) { + if (GameObject* teleporter = instance->GetGameObject(TeleporterDeathBringerGUID)) + SetTeleporterState(teleporter, true); + if (GameObject* loot = instance->GetGameObject(GunshipArmoryGUID)) loot->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED | GO_FLAG_NOT_SELECTABLE | GO_FLAG_NODESPAWN); } @@ -811,20 +888,28 @@ class instance_icecrown_citadel : public InstanceMapScript switch (state) { case DONE: + { if (GameObject* loot = instance->GetGameObject(DeathbringersCacheGUID)) { if (Creature* deathbringer = instance->GetCreature(DeathbringerSaurfangGUID)) loot->SetLootRecipient(deathbringer->GetLootRecipient()); loot->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED | GO_FLAG_NOT_SELECTABLE | GO_FLAG_NODESPAWN); } - // no break + + if (GameObject* teleporter = instance->GetGameObject(TeleporterUpperSpireGUID)) + SetTeleporterState(teleporter, true); + + if (GameObject* teleporter = instance->GetGameObject(TeleporterDeathBringerGUID)) + SetTeleporterState(teleporter, true); + break; + } case NOT_STARTED: - if (GameObject* teleporter = instance->GetGameObject(SaurfangTeleportGUID)) - { - HandleGameObject(SaurfangTeleportGUID, true, teleporter); - teleporter->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); - } + { + if (GameObject* teleporter = instance->GetGameObject(TeleporterDeathBringerGUID)) + SetTeleporterState(teleporter, true); + break; + } default: break; } @@ -894,8 +979,13 @@ class instance_icecrown_citadel : public InstanceMapScript } break; case DATA_VALITHRIA_DREAMWALKER: - if (state == DONE && sPoolMgr->IsSpawnedObject<Quest>(WeeklyQuestData[8].questId[instance->GetSpawnMode() & 1])) - instance->SummonCreature(NPC_VALITHRIA_DREAMWALKER_QUEST, ValithriaSpawnPos); + if (state == DONE) + { + if (sPoolMgr->IsSpawnedObject<Quest>(WeeklyQuestData[8].questId[instance->GetSpawnMode() & 1])) + instance->SummonCreature(NPC_VALITHRIA_DREAMWALKER_QUEST, ValithriaSpawnPos); + if (GameObject* teleporter = instance->GetGameObject(TeleporterSindragosaGUID)) + SetTeleporterState(teleporter, true); + } break; case DATA_SINDRAGOSA: HandleGameObject(FrostwingSigilGUID, state != DONE); @@ -1029,6 +1119,11 @@ class instance_icecrown_citadel : public InstanceMapScript SaveToDB(); break; } + case DATA_UPPERSPIRE_TELE_ACT: + UpperSpireTeleporterActiveState = data; + if (UpperSpireTeleporterActiveState == DONE) + SaveToDB(); + break; default: break; } @@ -1235,7 +1330,7 @@ class instance_icecrown_citadel : public InstanceMapScript std::ostringstream saveStream; saveStream << "I C " << GetBossSaveData() << HeroicAttempts << ' ' - << ColdflameJetsState << ' ' << BloodQuickeningState << ' ' << BloodQuickeningMinutes; + << ColdflameJetsState << ' ' << BloodQuickeningState << ' ' << BloodQuickeningMinutes << ' ' << UpperSpireTeleporterActiveState; OUT_SAVE_INST_DATA_COMPLETE; return saveStream.str(); @@ -1271,11 +1366,17 @@ class instance_icecrown_citadel : public InstanceMapScript uint32 temp = 0; loadStream >> temp; - ColdflameJetsState = temp ? DONE : NOT_STARTED; + if (temp == IN_PROGRESS) + ColdflameJetsState = NOT_STARTED; + else + ColdflameJetsState = temp ? DONE : NOT_STARTED; loadStream >> temp; BloodQuickeningState = temp ? DONE : NOT_STARTED; // DONE means finished (not success/fail) loadStream >> BloodQuickeningMinutes; + + loadStream >> temp; + UpperSpireTeleporterActiveState = temp ? DONE : NOT_STARTED; } else OUT_LOAD_INST_DATA_FAIL; @@ -1416,7 +1517,13 @@ class instance_icecrown_citadel : public InstanceMapScript uint64 DeathbringerSaurfangDoorGUID; uint64 DeathbringerSaurfangEventGUID; // Muradin Bronzebeard or High Overlord Saurfang uint64 DeathbringersCacheGUID; - uint64 SaurfangTeleportGUID; + uint64 TeleporterLichKingGUID; + uint64 TeleporterUpperSpireGUID; + uint64 TeleporterLightsHammerGUID; + uint64 TeleporterRampartsGUID; + uint64 TeleporterDeathBringerGUID; + uint64 TeleporterOratoryGUID; + uint64 TeleporterSindragosaGUID; uint64 PlagueSigilGUID; uint64 BloodwingSigilGUID; uint64 FrostwingSigilGUID; @@ -1453,6 +1560,7 @@ class instance_icecrown_citadel : public InstanceMapScript uint64 PillarsUnchainedGUID; uint32 TeamInInstance; uint32 ColdflameJetsState; + uint32 UpperSpireTeleporterActiveState; std::set<uint32> FrostwyrmGUIDs; std::set<uint32> SpinestalkerTrash; std::set<uint32> RimefangTrash; diff --git a/src/server/scripts/Pet/pet_hunter.cpp b/src/server/scripts/Pet/pet_hunter.cpp index 7dbdc7af63f..8fd6cb54b0e 100644 --- a/src/server/scripts/Pet/pet_hunter.cpp +++ b/src/server/scripts/Pet/pet_hunter.cpp @@ -57,7 +57,7 @@ class npc_pet_hunter_snake_trap : public CreatureScript me->SetMaxHealth(uint32(107 * (me->getLevel() - 40) * 0.025f)); // Add delta to make them not all hit the same time uint32 delta = (rand32() % 7) * 100; - me->SetAttackTime(BASE_ATTACK, Info->baseattacktime + delta); + me->SetAttackTime(BASE_ATTACK, Info->BaseAttackTime + delta); //me->SetStatFloatValue(UNIT_FIELD_RANGED_ATTACK_POWER, float(Info->attackpower)); // Start attacking attacker of owner on first ai update after spawn - move in line of sight may choose better target diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp index 87c323aa22f..c43b781936c 100644 --- a/src/server/scripts/Spells/spell_item.cpp +++ b/src/server/scripts/Spells/spell_item.cpp @@ -991,7 +991,7 @@ class spell_item_unsated_craving : public SpellScriptLoader return false; Unit* target = procInfo.GetActionTarget(); - if (!target || target->GetTypeId() != TYPEID_UNIT || target->GetCreatureType() == CREATURE_TYPE_CRITTER || (target->GetEntry() != NPC_SINDRAGOSA && target->IsSummon())) + if (!target || target->GetTypeId() != TYPEID_UNIT || target->IsCritter() || (target->GetEntry() != NPC_SINDRAGOSA && target->IsSummon())) return false; return true; diff --git a/src/server/shared/Database/Implementation/WorldDatabase.cpp b/src/server/shared/Database/Implementation/WorldDatabase.cpp index aa2ca4b7e2e..f5d9913bc5b 100644 --- a/src/server/shared/Database/Implementation/WorldDatabase.cpp +++ b/src/server/shared/Database/Implementation/WorldDatabase.cpp @@ -76,7 +76,7 @@ void WorldDatabaseConnection::DoPrepareStatements() PrepareStatement(WORLD_SEL_WAYPOINT_SCRIPT_ID_BY_GUID, "SELECT id FROM waypoint_scripts WHERE guid = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_DEL_CREATURE, "DELETE FROM creature WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(WORLD_SEL_COMMANDS, "SELECT name, permission, help FROM command", CONNECTION_SYNCH); - PrepareStatement(WORLD_SEL_CREATURE_TEMPLATE, "SELECT difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, modelid1, modelid2, modelid3, modelid4, name, subname, IconName, gossip_menu_id, minlevel, maxlevel, exp, faction, npcflag, speed_walk, speed_run, scale, rank, mindmg, maxdmg, dmgschool, attackpower, dmg_multiplier, baseattacktime, rangeattacktime, unit_class, unit_flags, unit_flags2, dynamicflags, family, trainer_type, trainer_spell, trainer_class, trainer_race, minrangedmg, maxrangedmg, rangedattackpower, type, type_flags, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, InhabitType, HoverHeight, Health_mod, Mana_mod, Armor_mod, RacialLeader, questItem1, questItem2, questItem3, questItem4, questItem5, questItem6, movementId, RegenHealth, mechanic_immune_mask, flags_extra, ScriptName FROM creature_template WHERE entry = ?", CONNECTION_SYNCH); + PrepareStatement(WORLD_SEL_CREATURE_TEMPLATE, "SELECT entry, difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, modelid1, modelid2, modelid3, modelid4, name, subname, IconName, gossip_menu_id, minlevel, maxlevel, exp, faction, npcflag, speed_walk, speed_run, scale, rank, dmgschool, BaseAttackTime, RangeAttackTime, BaseVariance, RangeVariance, unit_class, unit_flags, unit_flags2, dynamicflags, family, trainer_type, trainer_spell, trainer_class, trainer_race, type, type_flags, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, InhabitType, HoverHeight, HealthModifier, ManaModifier, ArmorModifier, DamageModifier, ExperienceModifier, RacialLeader, questItem1, questItem2, questItem3, questItem4, questItem5, questItem6, movementId, RegenHealth, mechanic_immune_mask, flags_extra, ScriptName FROM creature_template WHERE entry = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_WAYPOINT_SCRIPT_BY_ID, "SELECT guid, delay, command, datalong, datalong2, dataint, x, y, z, o FROM waypoint_scripts WHERE id = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_ITEM_TEMPLATE_BY_NAME, "SELECT entry FROM item_template WHERE name = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_CREATURE_BY_ID, "SELECT guid FROM creature WHERE id = ?", CONNECTION_SYNCH); @@ -89,6 +89,4 @@ void WorldDatabaseConnection::DoPrepareStatements() PrepareStatement(WORLD_INS_DISABLES, "INSERT INTO disables (entry, sourceType, flags, comment) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(WORLD_SEL_DISABLES, "SELECT entry FROM disables WHERE entry = ? AND sourceType = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_DEL_DISABLES, "DELETE FROM disables WHERE entry = ? AND sourceType = ?", CONNECTION_ASYNC); - // 0: uint8 - PrepareStatement(WORLD_SEL_REQ_XP, "SELECT xp_for_next_level FROM player_xp_for_level WHERE lvl = ?", CONNECTION_SYNCH); } diff --git a/src/server/shared/Database/Implementation/WorldDatabase.h b/src/server/shared/Database/Implementation/WorldDatabase.h index 625dfc68ce6..8a5bd206021 100644 --- a/src/server/shared/Database/Implementation/WorldDatabase.h +++ b/src/server/shared/Database/Implementation/WorldDatabase.h @@ -110,7 +110,6 @@ enum WorldDatabaseStatements WORLD_SEL_DISABLES, WORLD_INS_DISABLES, WORLD_DEL_DISABLES, - WORLD_SEL_REQ_XP, MAX_WORLDDATABASE_STATEMENTS }; diff --git a/src/server/shared/Database/QueryHolder.cpp b/src/server/shared/Database/QueryHolder.cpp index bd938561b50..f0dc3c96e4e 100644 --- a/src/server/shared/Database/QueryHolder.cpp +++ b/src/server/shared/Database/QueryHolder.cpp @@ -166,8 +166,16 @@ void SQLQueryHolder::SetSize(size_t size) m_queries.resize(size); } +SQLQueryHolderTask::~SQLQueryHolderTask() +{ + if (!m_executed) + delete m_holder; +} + bool SQLQueryHolderTask::Execute() { + m_executed = true; + if (!m_holder) return false; diff --git a/src/server/shared/Database/QueryHolder.h b/src/server/shared/Database/QueryHolder.h index 273980c3ac5..39e51b591c5 100644 --- a/src/server/shared/Database/QueryHolder.h +++ b/src/server/shared/Database/QueryHolder.h @@ -47,14 +47,16 @@ class SQLQueryHolderTask : public SQLOperation private: SQLQueryHolder* m_holder; QueryResultHolderPromise m_result; + bool m_executed; public: SQLQueryHolderTask(SQLQueryHolder* holder) - : m_holder(holder) { }; + : m_holder(holder), m_executed(false) { } + + ~SQLQueryHolderTask(); bool Execute() override; QueryResultHolderFuture GetFuture() { return m_result.get_future(); } - }; -#endif
\ No newline at end of file +#endif diff --git a/src/server/shared/Networking/MessageBuffer.h b/src/server/shared/Networking/MessageBuffer.h index fff94b86c1e..c7f8ba31a71 100644 --- a/src/server/shared/Networking/MessageBuffer.h +++ b/src/server/shared/Networking/MessageBuffer.h @@ -40,6 +40,10 @@ public: bool IsMessageReady() const { return _wpos == _storage.size(); } + size_type GetSize() const { return _storage.size(); } + + size_type GetReadyDataSize() const { return _wpos; } + size_type GetMissingSize() const { return _storage.size() - _wpos; } uint8* Data() { return _storage.data(); } @@ -55,8 +59,6 @@ public: void ResetWritePointer() { _wpos = 0; } - size_type GetSize() { return _storage.size(); } - std::vector<uint8>&& Move() { _wpos = 0; diff --git a/src/server/shared/Networking/Socket.h b/src/server/shared/Networking/Socket.h index c8bd5a1dd81..a13a079ff6c 100644 --- a/src/server/shared/Networking/Socket.h +++ b/src/server/shared/Networking/Socket.h @@ -146,6 +146,9 @@ public: uint8* GetHeaderBuffer() { return _readHeaderBuffer.Data(); } uint8* GetDataBuffer() { return _readDataBuffer.Data(); } + size_t GetHeaderSize() const { return _readHeaderBuffer.GetReadyDataSize(); } + size_t GetDataSize() const { return _readDataBuffer.GetReadyDataSize(); } + MessageBuffer&& MoveHeader() { return std::move(_readHeaderBuffer); } MessageBuffer&& MoveData() { return std::move(_readDataBuffer); } diff --git a/src/server/shared/Threading/ProducerConsumerQueue.h b/src/server/shared/Threading/ProducerConsumerQueue.h index accb0aebb11..a76b8b0b5c0 100644 --- a/src/server/shared/Threading/ProducerConsumerQueue.h +++ b/src/server/shared/Threading/ProducerConsumerQueue.h @@ -39,10 +39,8 @@ public: void Push(const T& value) { - { - std::lock_guard<std::mutex> lock(_queueLock); - _queue.push(std::move(value)); - } + std::lock_guard<std::mutex> lock(_queueLock); + _queue.push(std::move(value)); _condition.notify_one(); } @@ -72,10 +70,7 @@ public: { std::unique_lock<std::mutex> lock(_queueLock); - while (_queue.empty() && !_shutdown) - { - _condition.wait(lock); - } + _condition.wait(lock, [this]() { return !_queue.empty() || _shutdown; }); if (_queue.empty() || _shutdown) return; |