diff options
27 files changed, 497 insertions, 254 deletions
diff --git a/sql/updates/world/2013_09_04_00_world_sai.sql b/sql/updates/world/2013_09_04_00_world_sai.sql new file mode 100644 index 00000000000..a4614deca75 --- /dev/null +++ b/sql/updates/world/2013_09_04_00_world_sai.sql @@ -0,0 +1,52 @@ +-- Putting Olakin Back Together Again (13220) +SET @QUEST := 13220; +SET @NPC_OLAKIN := 31235; -- Crusader Olakin Sainrith +SET @GO_CLEAVER := 193092; -- The Doctor's Cleaver +SET @GO_SPOOL := 193091; -- Spool of Thread +SET @EVENT_SCRIPT := 20269; -- Event from 58856 Reanimate Crusader Olakin +SET @SPELL_FD := 35356; -- Feign Death +SET @SPELL_FAKE_BLOOD := 37692; -- Fake Blood Spurt +SET @SPELL_RESURRECTION := 58854; -- Resurrection + +DELETE FROM `gameobject` WHERE `id` IN (@GO_CLEAVER,@GO_SPOOL); +INSERT INTO `gameobject` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`rotation0`,`rotation1`,`rotation2`,`rotation3`,`spawntimesecs`,`animprogress`,`state`) VALUES +(16974,@GO_SPOOL,571,1,1,6668.17,3268.54,669.539,2.54818,0,0,0.956304,0.292373,120,255, 1), +(16976,@GO_CLEAVER,571,1,1,6601.1,3147.78,666.916,-2.77507,0,0,-0.983254,0.182238,120,255,1); + +DELETE FROM `event_scripts` WHERE `id`=@EVENT_SCRIPT; +INSERT INTO `event_scripts` (`id`,`delay`,`command`,`datalong`,`datalong2`,`dataint`,`x`,`y`,`z`,`o`) VALUES +(@EVENT_SCRIPT,0,10,@NPC_OLAKIN,60000,0,6636.792,3211.102,668.6439,0.8901179); + +DELETE FROM `creature_template_addon` WHERE `entry`=@NPC_OLAKIN; +INSERT INTO `creature_template_addon` (`entry`,`mount`,`bytes1`,`bytes2`,`auras`) VALUES +(@NPC_OLAKIN,0,0x0,0x1,'35356'); -- 31235 - 35356 + +DELETE FROM `creature_text` WHERE `entry`=@NPC_OLAKIN; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES +(@NPC_OLAKIN,0,0,'Thank the Light for granting me another chance. And thank you, $N.',12,0,100,1,0,0,'Crusader Olakin Sainrith'), +(@NPC_OLAKIN,1,0,'Without your help, I would''ve been doomed to a life of undeath among the Lich King''s gruesome creations.', 12,0,100,1,0,0,'Crusader Olakin Sainrith'), +(@NPC_OLAKIN,2,0,'There will be time for a proper thanks later, but there is still a battle to be fought!', 12,0,100,25,0,0,'Crusader Olakin Sainrith'); + +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@NPC_OLAKIN; +DELETE FROM `smart_scripts` WHERE (`source_type`=0 AND `entryorguid`=@NPC_OLAKIN) OR (`source_type`=9 AND `entryorguid`=@NPC_OLAKIN*100); +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 +(@NPC_OLAKIN,0,0,0,54,0,100,0,0,0,0,0,80,@NPC_OLAKIN*100,0,0,0,0,0,1,0,0,0,0,0,0,0,'Crusader Olakin Sainrith - On Just summoned - Run Script'), +(@NPC_OLAKIN,0,1,0,40,0,100,0,3,0,0,0,41,1000,0,0,0,0,0,1,0,0,0,0,0,0,0,'Crusader Olakin Sainrith - On WP Reached - Despawn'), +-- 17,26 +(@NPC_OLAKIN*100,9,0,0,0,0,100,0,2000,2000,0,0,11,@SPELL_FAKE_BLOOD,0,0,0,0,0,1,0,0,0,0,0,0,0,'Crusader Olakin Sainrith - On Script - Cast Spell'), +(@NPC_OLAKIN*100,9,1,0,0,0,100,0,2000,2000,0,0,11,@SPELL_RESURRECTION,0,0,0,0,0,1,0,0,0,0,0,0,0,'Crusader Olakin Sainrith - On Script - Cast Spell'), +(@NPC_OLAKIN*100,9,2,0,0,0,100,0,0,0,0,0,28,@SPELL_FD,0,0,0,0,0,1,0,0,0,0,0,0,0,'Crusader Olakin Sainrith - On Script - Remove Aura'), +(@NPC_OLAKIN*100,9,3,0,0,0,100,0,0,0,0,0,96,32,0,0,0,0,0,1,0,0,0,0,0,0,0,'Crusader Olakin Sainrith - On Script - Remove dynamic flag'), +(@NPC_OLAKIN*100,9,4,0,0,0,100,0,1000,1000,0,0,19,1,1,0,0,0,0,1,0,0,0,0,0,0,0,'Crusader Olakin Sainrith - On Script - Remove Unit Flag_2 1 {dead)'), +(@NPC_OLAKIN*100,9,5,0,0,0,100,0,4000,4000,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Crusader Olakin Sainrith - On Script - Say 0'), +(@NPC_OLAKIN*100,9,6,0,0,0,100,0,4000,4000,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Crusader Olakin Sainrith - On Script - Say 1'), +(@NPC_OLAKIN*100,9,7,0,0,0,100,0,4000,4000,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Crusader Olakin Sainrith - On Script - Say 2'), +(@NPC_OLAKIN*100,9,8,0,0,0,100,0,3000,3000,0,0,33,@NPC_OLAKIN,0,0,0,0,0,17,0,30,0,0,0,0,0,'Crusader Olakin Sainrith - On Script - Quest Credit'), +(@NPC_OLAKIN*100,9,9,0,0,0,100,0,0,0,0,0,53,1,@NPC_OLAKIN,0,0,0,0,1,0,0,0,0,0,0,0,'Crusader Olakin Sainrith - On Script -Start WP movement'); + +DELETE FROM `waypoints` WHERE entry =@NPC_OLAKIN; +INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES +(@NPC_OLAKIN, 1, 6632.227, 3223.6350, 666.7750,'Olakin'), +(@NPC_OLAKIN, 2, 6624.2558, 3230.2343, 666.857, 'Olakin'), +(@NPC_OLAKIN, 3, 6608.985, 3234.5588, 668.779, 'Olakin'); + diff --git a/sql/updates/world/2013_09_04_01_world_sai.sql b/sql/updates/world/2013_09_04_01_world_sai.sql new file mode 100644 index 00000000000..9d9412b87e7 --- /dev/null +++ b/sql/updates/world/2013_09_04_01_world_sai.sql @@ -0,0 +1,41 @@ +-- A Cleansing Song (12735) +SET @KOOSU := 29034; +SET @HA_KHALAN := 29018; +SET @ATHA := 29033; + +-- Spirit of Koosu +DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@KOOSU; +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@KOOSU; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@KOOSU; +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 +(@KOOSU,0,0,0,4,0,100,1,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Spirit of Koosu - Set Phase 1 - on Aggro'), +(@KOOSU,0,1,0,4,1,100,1,0,0,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Spirit of Koosu - Stop Moving - on Aggro'), +(@KOOSU,0,2,0,4,1,100,1,0,0,0,0,11,21971,0,0,0,0,0,2,0,0,0,0,0,0,0,'Spirit of Koosu - Cast bolt - on Aggro'), +(@KOOSU,0,3,0,9,1,100,0,5,30,3500,4100,11,21971,0,0,0,0,0,2,0,0,0,0,0,0,0,'Spirit of Koosu - Cast bolt - In Range'), +(@KOOSU,0,4,0,9,1,100,0,30,100,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Spirit of Koosu - Start Moving - When not in bolt Range'), +(@KOOSU,0,5,0,9,1,100,0,9,15,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Spirit of Koosu - Stop Moving - 15 Yards'), +(@KOOSU,0,6,0,9,1,100,0,0,5,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Spirit of Koosu - Start Moving - when not in bolt Range'), +(@KOOSU,0,7,0,9,1,100,0,5,30,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Spirit of Koosu - Stop Moving - when in bolt Range'); + +-- Spirit of Ha-Khalan +DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@HA_KHALAN; +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@HA_KHALAN; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@HA_KHALAN; +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 +(@HA_KHALAN,0,0,0,0,0,100,0,1000,1000,125000,125000,11,50502,0,0,0,0,0,1,0,0,0,0,0,0,0,'Spirit of Ha-Khalan - IC - Cast Thick Hide'), +(@HA_KHALAN,0,1,0,0,0,100,0,5000,10000,12000,16000,11,34370,0,0,0,0,0,2,0,0,0,0,0,0,0,'Spirit of Ha-Khalan - IC - Cast Jagged Tooth Snap'), +(@HA_KHALAN,0,2,0,0,0,100,0,3000,5000,7000,11000,11,48287,0,0,0,0,0,2,0,0,0,0,0,0,0,'Spirit of Ha-Khalan - IC - Cast Powerful Bite'); + +-- Spirit of Atha +DELETE FROM `creature_ai_scripts` WHERE `creature_id`=@ATHA; +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ATHA; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@ATHA; +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 +(@ATHA,0,0,0,0,0,100,0,8000,13000,12000,16000,11,21790,0,0,0,0,0,1,0,0,0,0,0,0,0,'Spirit of Atha - IC - Cast Aqua Jet'), +(@ATHA,0,1,0,0,0,100,0,2000,4000,5000,7000,11,3391,0,0,0,0,0,1,0,0,0,0,0,0,0,'Spirit of Atha - IC - Cast Thrash'); + +UPDATE `creature_template` SET `unit_flags`=`unit_flags`|8 WHERE `entry`=29018; -- Spirit of Ha-Khalan +-- Addon data for creature 29018 (Spirit of Ha-Khalan) +DELETE FROM `creature_template_addon` WHERE `entry`=29018; +INSERT INTO `creature_template_addon` (`entry`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES +(29018,0,0,1,0,''); -- Spirit of Ha-Khalan diff --git a/sql/updates/world/2013_09_04_02_world_spawns_sai.sql b/sql/updates/world/2013_09_04_02_world_spawns_sai.sql new file mode 100644 index 00000000000..40e238d04a2 --- /dev/null +++ b/sql/updates/world/2013_09_04_02_world_spawns_sai.sql @@ -0,0 +1,38 @@ +-- Corpulen Horror spawns in area The Fleshwerks +SET @CGUID = 127272; + +DELETE FROM `creature_ai_scripts` WHERE `creature_id`=30696; +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=30696; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=30696; +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 +(30696,0,0,0,9,0,100,0,8,40,3500,4100,11,50335,0,0,0,0,0,2,0,0,0,0,0,0,0,'Corpulent Horror - Cast Scourge Hook - In Range'); + +DELETE FROM `creature_template_addon` WHERE `entry`=30696; +INSERT INTO `creature_template_addon` (`entry`, `mount`, `bytes1`, `bytes2`, `auras`) VALUES +(30696, 0, 0x0, 0x1, ''); -- Corpulent Horror + +UPDATE `creature_template` SET `faction_A`=2102, `faction_H`=2102, `speed_walk`=1.142857, `speed_run`=1, `rangeattacktime`=2000, `unit_flags`=32768, `dynamicflags`=0 WHERE `entry`=30696; -- Corpulent Horror +DELETE FROM `creature` WHERE `id` = 30696; +INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`) VALUES +(@CGUID+0, 30696, 571, 1, 1, 0, 0, 6975.386, 3462.006, 710.9403, 6.126106, 120, 0, 0, 0, 0, 0, 0, 0, 0), -- Corpulent Horror (Area: The Fleshwerks) +(@CGUID+1, 30696, 571, 1, 1, 0, 0, 6982.377, 3478.588, 710.9403, 5.811946, 120, 0, 0, 0, 0, 0, 0, 0, 0), -- Corpulent Horror (Area: The Fleshwerks) +(@CGUID+2, 30696, 571, 1, 1, 0, 0, 6920.697, 3446.544, 710.2005, 3.097477, 120, 0, 0, 0, 0, 0, 0, 0, 0), -- Corpulent Horror (Area: The Fleshwerks) +(@CGUID+3, 30696, 571, 1, 1, 0, 0, 6932.927, 3502.471, 705.0461, 3.281219, 120, 0, 0, 0, 0, 0, 0, 0, 0), -- Corpulent Horror (Area: The Fleshwerks) +(@CGUID+4, 30696, 571, 1, 1, 0, 0, 6903.668, 3478.428, 700.0414, 3.093731, 120, 0, 0, 0, 0, 0, 0, 0, 0), -- Corpulent Horror (Area: The Fleshwerks) +(@CGUID+5, 30696, 571, 1, 1, 0, 0, 6895.87, 3460.794, 700.7824, 1.592374, 120, 0, 0, 0, 0, 0, 0, 0, 0), -- Corpulent Horror (Area: The Fleshwerks) +(@CGUID+6, 30696, 571, 1, 1, 0, 0, 6868.874, 3435.562, 705.6059, 1.542484, 120, 0, 0, 0, 0, 0, 0, 0, 0), -- Corpulent Horror (Area: The Fleshwerks) +(@CGUID+7, 30696, 571, 1, 1, 0, 0, 6869.054, 3493.792, 695.7783, 5.440073, 120, 0, 0, 0, 0, 0, 0, 0, 0), -- Corpulent Horror (Area: The Fleshwerks) +(@CGUID+8, 30696, 571, 1, 1, 0, 0, 6875.154, 3513.065, 698.8162, 3.944444, 120, 0, 0, 0, 0, 0, 0, 0, 0), -- Corpulent Horror (Area: The Fleshwerks) +(@CGUID+9, 30696, 571, 1, 1, 0, 0, 6836.296, 3505.824, 690.3577, 0.5061455, 120, 0, 0, 0, 0, 0, 0, 0, 0), -- Corpulent Horror (Area: The Fleshwerks) +(@CGUID+10, 30696, 571, 1, 1, 0, 0, 6823.636, 3484.259, 688.4615, 6.278303, 120, 0, 0, 0, 0, 0, 0, 0, 0), -- Corpulent Horror (Area: The Fleshwerks) +(@CGUID+11, 30696, 571, 1, 1, 0, 0, 6729.185, 3433.822, 682.3103, 2.64319, 120, 0, 0, 0, 0, 0, 0, 0, 0), -- Corpulent Horror (Area: The Fleshwerks) +(@CGUID+12, 30696, 571, 1, 1, 0, 0, 6676.063, 3349.062, 704.616, 2.582512, 120, 0, 0, 0, 0, 0, 0, 0, 0), -- Corpulent Horror (Area: The Fleshwerks) +(@CGUID+13, 30696, 571, 1, 1, 0, 0, 6699.958, 3422.957, 679.4948, 3.363122, 120, 0, 0, 0, 0, 0, 0, 0, 0), -- Corpulent Horror (Area: The Fleshwerks) +(@CGUID+14, 30696, 571, 1, 1, 0, 0, 6548.099, 3309.558, 665.8171, 2.951326, 120, 0, 0, 0, 0, 0, 0, 0, 0), -- Corpulent Horror (Area: The Fleshwerks) +(@CGUID+15, 30696, 571, 1, 1, 0, 0, 6535.431, 3322.088, 664.9422, 5.877358, 120, 0, 0, 0, 0, 0, 0, 0, 0), -- Corpulent Horror (Area: The Fleshwerks) +(@CGUID+16, 30696, 571, 1, 1, 0, 0, 6530.748, 3296.081, 664.9409, 3.446935, 120, 0, 0, 0, 0, 0, 0, 0, 0), -- Corpulent Horror (Area: The Fleshwerks) +(@CGUID+17, 30696, 571, 1, 1, 0, 0, 6534.971, 3260.271, 666.9742, 0.2021571, 120, 0, 0, 0, 0, 0, 0, 0, 0), -- Corpulent Horror (Area: The Fleshwerks) +(@CGUID+18, 30696, 571, 1, 1, 0, 0, 6477.204, 3257.901, 643.6331, 3.804818, 120, 0, 0, 0, 0, 0, 0, 0, 0), -- Corpulent Horror (Area: The Fleshwerks) +(@CGUID+19, 30696, 571, 1, 1, 0, 0, 6488.242, 3194.719, 652.9039, 1.48353, 120, 0, 0, 0, 0, 0, 0, 0, 0), -- Corpulent Horror (Area: The Fleshwerks) +(@CGUID+20, 30696, 571, 1, 1, 0, 0, 6412.273, 3236.912, 640.3326, 0.7460284, 120, 0, 0, 0, 0, 0, 0, 0, 0), -- Corpulent Horror (Area: The Fleshwerks +(@CGUID+21, 30696, 571, 1, 1, 0, 0, 6413.427, 3218.029, 638.4678, 0.122173, 120, 0, 0, 0, 0, 0, 0, 0, 0); -- Corpulent Horror (Area: The Fleshwerks) diff --git a/sql/updates/world/2013_09_04_03_world_isle_of_conquest.sql b/sql/updates/world/2013_09_04_03_world_isle_of_conquest.sql new file mode 100644 index 00000000000..471ee3adefb --- /dev/null +++ b/sql/updates/world/2013_09_04_03_world_isle_of_conquest.sql @@ -0,0 +1,26 @@ +DELETE FROM `spell_linked_spell` WHERE `spell_trigger` IN (66548,66549,66550,66551); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry` IN (66550,66551); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(13,1,66550,0,0,31,0,3,22515,0,0,0,0,'','Isle of Conquest - Teleport Fortress Out'), +(13,1,66550,0,0,35,0,1,10,1,0,0,0,'','Isle of Conquest - Teleport Fortress Out'), +(13,1,66551,0,0,31,0,3,22515,0,0,0,0,'','Isle of Conquest - Teleport Fortress In'), +(13,1,66551,0,0,35,0,1,10,1,0,0,0,'','Isle of Conquest - Teleport Fortress In'); + +SET @CGUID := 90179; +DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+13; +INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `MovementType`) VALUES +(@CGUID+0, 22515, 628, 3, 1, 392.4965, -859.4583, 48.99871, 3.036873, 7200, 0, 0), -- A IN +(@CGUID+1, 22515, 628, 3, 1, 313.2344, -918.0452, 48.85597, 4.869469, 7200, 0, 0), -- A OUT +(@CGUID+2, 22515, 628, 3, 1, 279.8698, -832.8073, 51.55094, 0, 7200, 0, 0), -- A CENTER +(@CGUID+3, 22515, 628, 3, 1, 323.4965, -883.8021, 48.99959, 1.466077, 7200, 0, 0), -- A IN +(@CGUID+4, 22515, 628, 3, 1, 430.6007, -857.0052, 48.31177, 0.1396263, 7200, 0, 0), -- A OUT +(@CGUID+5, 22515, 628, 3, 1, 325.9167, -781.8993, 49.00521, 4.590216, 7200, 0, 0), -- A IN +(@CGUID+6, 22515, 628, 3, 1, 326.2135, -744.0243, 49.43576, 1.308997, 7200, 0, 0), -- A OUT +(@CGUID+7, 22515, 628, 3, 1, 1139.498, -779.4739, 48.73496, 3.001966, 7200, 0, 0), -- H OUT +(@CGUID+8, 22515, 628, 3, 1, 1162.913, -745.908, 48.71506, 0.1396263, 7200, 0, 0), -- H IN +(@CGUID+9, 22515, 628, 3, 1, 1234.304, -688.2986, 49.22296, 4.677482, 7200, 0, 0), -- H IN +(@CGUID+10, 22515, 628, 3, 1, 1232.524, -666.3246, 48.13402, 2.303835, 7200, 0, 0), -- H OUT +(@CGUID+11, 22515, 628, 3, 1, 1233.106, -838.316, 48.99958, 1.466077, 7200, 0, 0), -- H IN +(@CGUID+12, 22515, 628, 3, 1, 1232.387, -861.0243, 48.99959, 3.560472, 7200, 0, 0), -- H OUT +(@CGUID+13, 22515, 628, 3, 1, 1296.526, -766.1823, 50.70293, 3.089233, 7200, 0, 0); -- H CENTER diff --git a/sql/updates/world/2013_09_06_00_world_misc.sql b/sql/updates/world/2013_09_06_00_world_misc.sql new file mode 100644 index 00000000000..872dc840a8b --- /dev/null +++ b/sql/updates/world/2013_09_06_00_world_misc.sql @@ -0,0 +1,4 @@ +-- Fix few startup errors +UPDATE `smart_scripts` SET `event_param3`=12555 WHERE `entryorguid`=27727 AND `source_type`=0 AND `id`=2 AND `link`=0; +DELETE FROM `creature_addon` WHERE `guid`=66177; +DELETE FROM `waypoint_data` WHERE `id`=661770; diff --git a/sql/updates/world/2013_09_06_01_world_misc.sql b/sql/updates/world/2013_09_06_01_world_misc.sql new file mode 100644 index 00000000000..10533e8354c --- /dev/null +++ b/sql/updates/world/2013_09_06_01_world_misc.sql @@ -0,0 +1,13 @@ +DELETE FROM `smart_scripts` WHERE `entryorguid`=28481 AND `source_type`=0; +UPDATE `creature_template` SET `AIName`='' WHERE `entry`=28481; + +DELETE FROM `spell_script_names` WHERE `spell_id` IN (51769,51770,58941); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(51769,'spell_q12619_emblazon_runeblade'), +(51770,'spell_q12619_emblazon_runeblade_effect'), +(58941,'spell_archavon_rock_shards'); + +DELETE FROM `spelldifficulty_dbc` WHERE `id` IN (58695,58696); +INSERT INTO `spelldifficulty_dbc`(`id`,`spellid0`,`spellid1`) VALUES +(58695,58695,60883), +(58696,58696,60884); diff --git a/sql/updates/world/2013_09_06_02_world_misc.sql b/sql/updates/world/2013_09_06_02_world_misc.sql new file mode 100644 index 00000000000..47ac870f977 --- /dev/null +++ b/sql/updates/world/2013_09_06_02_world_misc.sql @@ -0,0 +1,4 @@ +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=28481; +DELETE FROM `smart_scripts` WHERE `entryorguid`=28481 AND `source_type`=0; +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 +(28481, 0, 0, 0, 8, 0, 100, 0, 51769, 0, 0, 0, 11, 51738, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Runeforge (SE) - On Spellhit Emblazon Runeblade - Cast Shadow Storm'); diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index 01f9080fba1..361cf025647 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -771,6 +771,26 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) case SMART_ACTION_SUMMON_CREATURE: if (!IsCreatureValid(e, e.action.summonCreature.creature)) return false; + + for (uint32 i = 0; i < sSpellMgr->GetSpellInfoStoreSize(); ++i) + { + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(i); + if (!spellInfo) + continue; + + for (uint32 j = 0; j < MAX_SPELL_EFFECTS; ++j) + { + if (spellInfo->Effects[j].Effect == SPELL_EFFECT_SUMMON) + { + uint32 creatureSummonEntry = spellInfo->Effects[j].MiscValue; + + if (e.action.summonCreature.creature == creatureSummonEntry) + TC_LOG_ERROR(LOG_FILTER_SQL, "SmartAIMgr: Entry %d SourceType %u Event %u Action %u creature summon: %u has already summon spell (SpellId: %u effect: %u)", + e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.action.summonCreature.creature, spellInfo->Id, j); + } + } + } + if (e.action.summonCreature.type < TEMPSUMMON_TIMED_OR_DEAD_DESPAWN || e.action.summonCreature.type > TEMPSUMMON_MANUAL_DESPAWN) { TC_LOG_ERROR(LOG_FILTER_SQL, "SmartAIMgr: Entry %d SourceType %u Event %u Action %u uses incorrect TempSummonType %u, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.action.summonCreature.type); @@ -828,6 +848,25 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) case SMART_ACTION_SUMMON_GO: if (!IsGameObjectValid(e, e.action.summonGO.entry)) return false; + + for (uint32 i = 0; i < sSpellMgr->GetSpellInfoStoreSize(); ++i) + { + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(i); + if (!spellInfo) + continue; + + for (uint32 j = 0; j < MAX_SPELL_EFFECTS; ++j) + { + if (spellInfo->Effects[j].Effect == SPELL_EFFECT_SUMMON_OBJECT_WILD) + { + uint32 goSummonEntry = spellInfo->Effects[j].MiscValue; + + if (e.action.summonGO.entry == goSummonEntry) + TC_LOG_ERROR(LOG_FILTER_SQL, "SmartAIMgr: Entry %d SourceType %u Event %u Action %u gameobject summon: %u has already summon spell (SpellId: %u effect: %u)", + e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.action.summonGO.entry, spellInfo->Id, j); + } + } + } break; case SMART_ACTION_ADD_ITEM: case SMART_ACTION_REMOVE_ITEM: diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 3d2eaffc15d..1fe9a08bfdc 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -508,103 +508,50 @@ void AchievementMgr::SaveToDB(SQLTransaction& trans) { if (!m_completedAchievements.empty()) { - bool need_execute = false; - std::ostringstream ssdel; - std::ostringstream ssins; for (CompletedAchievementMap::iterator iter = m_completedAchievements.begin(); iter != m_completedAchievements.end(); ++iter) { if (!iter->second.changed) continue; - /// first new/changed record prefix - if (!need_execute) - { - ssdel << "DELETE FROM character_achievement WHERE guid = " << GetPlayer()->GetGUIDLow() << " AND achievement IN ("; - ssins << "INSERT INTO character_achievement (guid, achievement, date) VALUES "; - need_execute = true; - } - /// next new/changed record prefix - else - { - ssdel << ','; - ssins << ','; - } + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACHIEVEMENT_BY_ACHIEVEMENT); + stmt->setUInt16(0, iter->first); + stmt->setUInt32(1, GetPlayer()->GetGUID()); + trans->Append(stmt); - // new/changed record data - ssdel << iter->first; - ssins << '(' << GetPlayer()->GetGUIDLow() << ',' << iter->first << ',' << uint64(iter->second.date) << ')'; + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_ACHIEVEMENT); + stmt->setUInt32(0, GetPlayer()->GetGUID()); + stmt->setUInt16(1, iter->first); + stmt->setUInt32(2, uint32(iter->second.date)); + trans->Append(stmt); - /// mark as saved in db iter->second.changed = false; } - - if (need_execute) - { - ssdel << ')'; - trans->Append(ssdel.str().c_str()); - trans->Append(ssins.str().c_str()); - } } if (!m_criteriaProgress.empty()) { - /// prepare deleting and insert - bool need_execute_del = false; - bool need_execute_ins = false; - std::ostringstream ssdel; - std::ostringstream ssins; for (CriteriaProgressMap::iterator iter = m_criteriaProgress.begin(); iter != m_criteriaProgress.end(); ++iter) { if (!iter->second.changed) continue; - // deleted data (including 0 progress state) - { - /// first new/changed record prefix (for any counter value) - if (!need_execute_del) - { - ssdel << "DELETE FROM character_achievement_progress WHERE guid = " << GetPlayer()->GetGUIDLow() << " AND criteria IN ("; - need_execute_del = true; - } - /// next new/changed record prefix - else - ssdel << ','; - - // new/changed record data - ssdel << iter->first; - } + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS_BY_CRITERIA); + stmt->setUInt32(0, GetPlayer()->GetGUID()); + stmt->setUInt16(1, iter->first); + trans->Append(stmt); - // store data only for real progress - if (iter->second.counter != 0) + if (iter->second.counter) { - /// first new/changed record prefix - if (!need_execute_ins) - { - ssins << "INSERT INTO character_achievement_progress (guid, criteria, counter, date) VALUES "; - need_execute_ins = true; - } - /// next new/changed record prefix - else - ssins << ','; - - // new/changed record data - ssins << '(' << GetPlayer()->GetGUIDLow() << ',' << iter->first << ',' << iter->second.counter << ',' << iter->second.date << ')'; + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_ACHIEVEMENT_PROGRESS); + stmt->setUInt32(0, GetPlayer()->GetGUID()); + stmt->setUInt16(1, iter->first); + stmt->setUInt32(2, iter->second.counter); + stmt->setUInt32(3, uint32(iter->second.date)); + trans->Append(stmt); } - /// mark as updated in db iter->second.changed = false; } - - if (need_execute_del) // DELETE ... IN (.... _)_ - ssdel << ')'; - - if (need_execute_del || need_execute_ins) - { - if (need_execute_del) - trans->Append(ssdel.str().c_str()); - if (need_execute_ins) - trans->Append(ssins.str().c_str()); - } } } diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp index 557cb9de09f..62ffb0fb832 100644 --- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp +++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp @@ -262,8 +262,8 @@ void BattlegroundMgr::BuildPvpLogDataPacket(WorldPacket* data, Battleground* bg) Battleground::BattlegroundScoreMap::const_iterator itr2 = bg->GetPlayerScoresBegin(); for (Battleground::BattlegroundScoreMap::const_iterator itr = itr2; itr != bg->GetPlayerScoresEnd();) { - BattlegroundScore* score = itr2->second; itr2 = itr++; + BattlegroundScore* score = itr2->second; if (!bg->IsPlayerInBattleground(itr2->first)) { TC_LOG_ERROR(LOG_FILTER_BATTLEGROUND, "Player " UI64FMTD " has scoreboard entry for battleground %u but is not in battleground!", itr->first, bg->GetTypeID(true)); diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index ada7909e9ff..5e4ca1de73a 100644 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -1500,6 +1500,11 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond) } break; } + case CONDITION_SOURCE_TYPE_PHASE_DEFINITION: + { + TC_LOG_ERROR(LOG_FILTER_SQL, "CONDITION_SOURCE_TYPE_PHASE_DEFINITION:: is only for 4.3.4 branch, skipped"); + return false; + } case CONDITION_SOURCE_TYPE_GOSSIP_MENU: case CONDITION_SOURCE_TYPE_GOSSIP_MENU_OPTION: case CONDITION_SOURCE_TYPE_SMART_EVENT: diff --git a/src/server/game/Conditions/ConditionMgr.h b/src/server/game/Conditions/ConditionMgr.h index 07eab29e53a..4e3225ca8a2 100644 --- a/src/server/game/Conditions/ConditionMgr.h +++ b/src/server/game/Conditions/ConditionMgr.h @@ -129,7 +129,8 @@ enum ConditionSourceType CONDITION_SOURCE_TYPE_SMART_EVENT = 22, CONDITION_SOURCE_TYPE_NPC_VENDOR = 23, CONDITION_SOURCE_TYPE_SPELL_PROC = 24, - CONDITION_SOURCE_TYPE_MAX = 25 // MAX + CONDITION_SOURCE_TYPE_PHASE_DEFINITION = 25, // only 4.3.4 + CONDITION_SOURCE_TYPE_MAX = 26 // MAX }; enum ComparisionType diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index c371fc781fd..e12f70baa41 100644 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -1966,9 +1966,9 @@ struct VehicleSeatEntry bool CanEnterOrExit() const { return m_flags & VEHICLE_SEAT_FLAG_CAN_ENTER_OR_EXIT; } bool CanSwitchFromSeat() const { return m_flags & VEHICLE_SEAT_FLAG_CAN_SWITCH; } - bool IsUsableByOverride() const { return (m_flags & VEHICLE_SEAT_FLAG_UNCONTROLLED) + bool IsUsableByOverride() const { return (m_flags & (VEHICLE_SEAT_FLAG_UNCONTROLLED | VEHICLE_SEAT_FLAG_UNK18) || (m_flagsB & (VEHICLE_SEAT_FLAG_B_USABLE_FORCED | VEHICLE_SEAT_FLAG_B_USABLE_FORCED_2 | - VEHICLE_SEAT_FLAG_B_USABLE_FORCED_3 | VEHICLE_SEAT_FLAG_B_USABLE_FORCED_4)); } + VEHICLE_SEAT_FLAG_B_USABLE_FORCED_3 | VEHICLE_SEAT_FLAG_B_USABLE_FORCED_4))); } bool IsEjectable() const { return m_flagsB & VEHICLE_SEAT_FLAG_B_EJECTABLE; } }; diff --git a/src/server/game/Guilds/GuildMgr.cpp b/src/server/game/Guilds/GuildMgr.cpp index 3fc4e839651..1fcc6ec4e6e 100644 --- a/src/server/game/Guilds/GuildMgr.cpp +++ b/src/server/game/Guilds/GuildMgr.cpp @@ -378,20 +378,13 @@ void GuildMgr::LoadGuilds() TC_LOG_INFO(LOG_FILTER_GUILD, "Validating data of loaded guilds..."); { uint32 oldMSTime = getMSTime(); - std::set<Guild*> rm; // temporary storage to avoid modifying GuildStore with RemoveGuild() while iterating - for (GuildContainer::iterator itr = GuildStore.begin(); itr != GuildStore.end(); ++itr) + for (GuildContainer::iterator itr = GuildStore.begin(); itr != GuildStore.end();) { Guild* guild = itr->second; + ++itr; if (guild && !guild->Validate()) - rm.insert(guild); - } - - for (std::set<Guild*>::iterator itr = rm.begin(); itr != rm.end(); ++itr) - { - Guild* guild = *itr; - RemoveGuild(guild->GetId()); - delete guild; + delete guild; } TC_LOG_INFO(LOG_FILTER_SERVER_LOADING, ">> Validated data of loaded guilds in %u ms", GetMSTimeDiffToNow(oldMSTime)); diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 3d55d9de16f..ff4a3b5ca71 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -5113,7 +5113,7 @@ void AuraEffect::HandleAuraLinked(AuraApplication const* aurApp, uint8 mode, boo { if (apply) { - Unit* caster = triggeredSpellInfo->NeedsToBeTriggeredByCaster() ? GetCaster() : target; + Unit* caster = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) ? GetCaster() : target; if (!caster) return; @@ -5125,13 +5125,13 @@ void AuraEffect::HandleAuraLinked(AuraApplication const* aurApp, uint8 mode, boo } else { - uint64 casterGUID = triggeredSpellInfo->NeedsToBeTriggeredByCaster() ? GetCasterGUID() : target->GetGUID(); + uint64 casterGUID = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) ? GetCasterGUID() : target->GetGUID(); target->RemoveAura(triggeredSpellId, casterGUID, 0, aurApp->GetRemoveMode()); } } else if (mode & AURA_EFFECT_HANDLE_REAPPLY && apply) { - uint64 casterGUID = triggeredSpellInfo->NeedsToBeTriggeredByCaster() ? GetCasterGUID() : target->GetGUID(); + uint64 casterGUID = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) ? GetCasterGUID() : target->GetGUID(); // change the stack amount to be equal to stack amount of our aura if (Aura* triggeredAura = target->GetAura(triggeredSpellId, casterGUID)) triggeredAura->ModStackAmount(GetBase()->GetStackAmount() - triggeredAura->GetStackAmount()); @@ -5733,7 +5733,7 @@ void AuraEffect::HandlePeriodicTriggerSpellAuraTick(Unit* target, Unit* caster) if (triggeredSpellInfo) { - if (Unit* triggerCaster = triggeredSpellInfo->NeedsToBeTriggeredByCaster() ? caster : target) + if (Unit* triggerCaster = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) ? caster : target) { triggerCaster->CastSpell(target, triggeredSpellInfo, true, NULL, this); TC_LOG_DEBUG(LOG_FILTER_SPELLS_AURAS, "AuraEffect::HandlePeriodicTriggerSpellAuraTick: Spell %u Trigger %u", GetId(), triggeredSpellInfo->Id); @@ -5753,7 +5753,7 @@ void AuraEffect::HandlePeriodicTriggerSpellWithValueAuraTick(Unit* target, Unit* uint32 triggerSpellId = GetSpellInfo()->Effects[m_effIndex].TriggerSpell; if (SpellInfo const* triggeredSpellInfo = sSpellMgr->GetSpellInfo(triggerSpellId)) { - if (Unit* triggerCaster = triggeredSpellInfo->NeedsToBeTriggeredByCaster() ? caster : target) + if (Unit* triggerCaster = triggeredSpellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) ? caster : target) { int32 basepoints = GetAmount(); triggerCaster->CastCustomSpell(target, triggerSpellId, &basepoints, &basepoints, &basepoints, true, 0, this); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 91a5c35955a..98c188df08f 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -917,13 +917,13 @@ void Spell::EffectTriggerSpell(SpellEffIndex effIndex) SpellCastTargets targets; if (effectHandleMode == SPELL_EFFECT_HANDLE_LAUNCH_TARGET) { - if (!spellInfo->NeedsToBeTriggeredByCaster()) + if (!spellInfo->NeedsToBeTriggeredByCaster(m_spellInfo)) return; targets.SetUnitTarget(unitTarget); } else //if (effectHandleMode == SPELL_EFFECT_HANDLE_LAUNCH) { - if (spellInfo->NeedsToBeTriggeredByCaster() && (m_spellInfo->Effects[effIndex].GetProvidedTargetMask() & TARGET_FLAG_UNIT_MASK)) + if (spellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) && (m_spellInfo->Effects[effIndex].GetProvidedTargetMask() & TARGET_FLAG_UNIT_MASK)) return; if (spellInfo->GetExplicitTargetMask() & TARGET_FLAG_DEST_LOCATION) @@ -969,13 +969,13 @@ void Spell::EffectTriggerMissileSpell(SpellEffIndex effIndex) SpellCastTargets targets; if (effectHandleMode == SPELL_EFFECT_HANDLE_HIT_TARGET) { - if (!spellInfo->NeedsToBeTriggeredByCaster()) + if (!spellInfo->NeedsToBeTriggeredByCaster(m_spellInfo)) return; targets.SetUnitTarget(unitTarget); } else //if (effectHandleMode == SPELL_EFFECT_HANDLE_HIT) { - if (spellInfo->NeedsToBeTriggeredByCaster() && (m_spellInfo->Effects[effIndex].GetProvidedTargetMask() & TARGET_FLAG_UNIT_MASK)) + if (spellInfo->NeedsToBeTriggeredByCaster(m_spellInfo) && (m_spellInfo->Effects[effIndex].GetProvidedTargetMask() & TARGET_FLAG_UNIT_MASK)) return; if (spellInfo->GetExplicitTargetMask() & TARGET_FLAG_DEST_LOCATION) @@ -1133,29 +1133,6 @@ void Spell::EffectTeleportUnits(SpellEffIndex /*effIndex*/) if (!unitTarget || unitTarget->IsInFlight()) return; - // Pre effects - switch (m_spellInfo->Id) - { - case 66550: // teleports outside (Isle of Conquest) - if (Player* target = unitTarget->ToPlayer()) - { - if (target->GetTeamId() == TEAM_ALLIANCE) - m_targets.SetDst(442.24f, -835.25f, 44.30f, 0.06f, 628); - else - m_targets.SetDst(1120.43f, -762.11f, 47.92f, 2.94f, 628); - } - break; - case 66551: // teleports inside (Isle of Conquest) - if (Player* target = unitTarget->ToPlayer()) - { - if (target->GetTeamId() == TEAM_ALLIANCE) - m_targets.SetDst(389.57f, -832.38f, 48.65f, 3.00f, 628); - else - m_targets.SetDst(1174.85f, -763.24f, 48.72f, 6.26f, 628); - } - break; - } - // If not exist data for dest location - return if (!m_targets.HasDst()) { @@ -3902,15 +3879,6 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) npc->LoadEquipment(); return; } - // Emblazon Runeblade - case 51770: - { - if (!m_originalCaster) - return; - - m_originalCaster->CastSpell(m_originalCaster, damage, false); - break; - } // Deathbolt from Thalgran Blightbringer // reflected by Freya's Ward // Retribution by Sevenfold Retribution @@ -3985,26 +3953,6 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) return; } - case 58941: // Rock Shards - if (unitTarget && m_originalCaster) - { - for (uint32 i = 0; i < 3; ++i) - { - m_originalCaster->CastSpell(unitTarget, 58689, true); - m_originalCaster->CastSpell(unitTarget, 58692, true); - } - if (((InstanceMap*)m_originalCaster->GetMap())->GetDifficulty() == REGULAR_DIFFICULTY) - { - m_originalCaster->CastSpell(unitTarget, 58695, true); - m_originalCaster->CastSpell(unitTarget, 58696, true); - } - else - { - m_originalCaster->CastSpell(unitTarget, 60883, true); - m_originalCaster->CastSpell(unitTarget, 60884, true); - } - } - return; case 58983: // Big Blizzard Bear { if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 04437b82f2d..99242d622df 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -1004,14 +1004,12 @@ bool SpellInfo::NeedsExplicitUnitTarget() const return GetExplicitTargetMask() & TARGET_FLAG_UNIT_MASK; } -bool SpellInfo::NeedsToBeTriggeredByCaster() const +bool SpellInfo::NeedsToBeTriggeredByCaster(SpellInfo const* triggeringSpell) const { - if (AttributesCu & SPELL_ATTR0_CU_TRIGGERED_BY_CASTER) - return true; - if (NeedsExplicitUnitTarget()) return true; + /* for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) { if (Effects[i].IsEffect()) @@ -1021,6 +1019,20 @@ bool SpellInfo::NeedsToBeTriggeredByCaster() const return true; } } + */ + + if (triggeringSpell->IsChanneled()) + { + uint32 mask = 0; + for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) + { + if (Effects[i].TargetA.GetTarget() != TARGET_UNIT_CASTER && Effects[i].TargetA.GetTarget() != TARGET_DEST_CASTER) + mask |= Effects[i].GetProvidedTargetMask(); + } + + if (mask & TARGET_FLAG_UNIT_MASK) + return true; + } return false; } diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h index 6acde5afa74..c2ca938d26f 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -176,7 +176,6 @@ enum SpellCustomAttributes SPELL_ATTR0_CU_CONE_LINE = 0x00000004, SPELL_ATTR0_CU_SHARE_DAMAGE = 0x00000008, SPELL_ATTR0_CU_NO_INITIAL_THREAT = 0x00000010, - SPELL_ATTR0_CU_TRIGGERED_BY_CASTER = 0x00000020, // @todo: need generic solution, some triggered spells will be casted by target instead of caster SPELL_ATTR0_CU_AURA_CC = 0x00000040, SPELL_ATTR0_CU_DIRECT_DAMAGE = 0x00000100, SPELL_ATTR0_CU_CHARGE = 0x00000200, @@ -386,7 +385,7 @@ public: bool IsAffectingArea() const; bool IsTargetingArea() const; bool NeedsExplicitUnitTarget() const; - bool NeedsToBeTriggeredByCaster() const; + bool NeedsToBeTriggeredByCaster(SpellInfo const* triggeringSpell) const; bool IsPassive() const; bool IsAutocastable() const; diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 5d471492553..29a869cf458 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -2974,9 +2974,6 @@ void SpellMgr::LoadSpellInfoCustomAttributes() case 72293: // Mark of the Fallen Champion (Deathbringer Saurfang) spellInfo->AttributesCu |= SPELL_ATTR0_CU_NEGATIVE_EFF0; break; - case 38729: // Rod of Purification - spellInfo->AttributesCu |= SPELL_ATTR0_CU_TRIGGERED_BY_CASTER; - break; default: break; } @@ -3750,6 +3747,13 @@ void SpellMgr::LoadSpellInfoCorrections() // Crashes client on pressing ESC spellInfo->AttributesEx4 &= ~SPELL_ATTR4_TRIGGERED; break; + // ISLE OF CONQUEST SPELLS + // + case 66551: // Teleport + spellInfo->RangeEntry = sSpellRangeStore.LookupEntry(13); // 50000yd + break; + // ENDOF ISLE OF CONQUEST SPELLS + // default: break; } diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index df80ba3c797..c13e9d08172 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -264,7 +264,7 @@ public: unit = player; std::ifstream ifs("opcode.txt"); - if (ifs.bad()) + if (ifs.fail()) return false; // remove comments from file diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index 872be042074..0dfb7181fef 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -33,15 +33,18 @@ EndScriptData */ #include "Player.h" #include "Pet.h" -struct NpcFlagText +template<typename E, typename T = char const*> +struct EnumName { - uint32 flag; - int32 text; + E Value; + T Name; }; +#define CREATE_NAMED_ENUM(VALUE) { VALUE, STRINGIZE(VALUE) } + #define NPCFLAG_COUNT 24 -NpcFlagText const npcFlagTexts[NPCFLAG_COUNT] = +EnumName<NPCFlags, int32> const npcFlagTexts[NPCFLAG_COUNT] = { { UNIT_NPC_FLAG_AUCTIONEER, LANG_NPCINFO_AUCTIONEER }, { UNIT_NPC_FLAG_BANKER, LANG_NPCINFO_BANKER }, @@ -69,89 +72,76 @@ NpcFlagText const npcFlagTexts[NPCFLAG_COUNT] = { UNIT_NPC_FLAG_VENDOR_REAGENT, LANG_NPCINFO_VENDOR_REAGENT } }; -struct MechanicImmune -{ - uint32 flag; - char const* text; -}; - -MechanicImmune const mechanicImmunes[MAX_MECHANIC] = -{ - { MECHANIC_NONE , "MECHANIC_NONE" }, - { MECHANIC_CHARM , "MECHANIC_CHARM" }, - { MECHANIC_DISORIENTED , "MECHANIC_DISORIENTED" }, - { MECHANIC_DISARM , "MECHANIC_DISARM" }, - { MECHANIC_DISTRACT , "MECHANIC_DISTRACT" }, - { MECHANIC_FEAR , "MECHANIC_FEAR" }, - { MECHANIC_GRIP , "MECHANIC_GRIP" }, - { MECHANIC_ROOT , "MECHANIC_ROOT" }, - { MECHANIC_SLOW_ATTACK , "MECHANIC_SLOW_ATTACK" }, - { MECHANIC_SILENCE , "MECHANIC_SILENCE" }, - { MECHANIC_SLEEP , "MECHANIC_SLEEP" }, - { MECHANIC_SNARE , "MECHANIC_SNARE" }, - { MECHANIC_STUN , "MECHANIC_STUN" }, - { MECHANIC_FREEZE , "MECHANIC_FREEZE" }, - { MECHANIC_KNOCKOUT , "MECHANIC_KNOCKOUT" }, - { MECHANIC_BLEED , "MECHANIC_BLEED" }, - { MECHANIC_BANDAGE , "MECHANIC_BANDAGE" }, - { MECHANIC_POLYMORPH , "MECHANIC_POLYMORPH" }, - { MECHANIC_BANISH , "MECHANIC_BANISH" }, - { MECHANIC_SHIELD , "MECHANIC_SHIELD" }, - { MECHANIC_SHACKLE , "MECHANIC_SHACKLE" }, - { MECHANIC_MOUNT , "MECHANIC_MOUNT" }, - { MECHANIC_INFECTED , "MECHANIC_INFECTED" }, - { MECHANIC_TURN , "MECHANIC_TURN" }, - { MECHANIC_HORROR , "MECHANIC_HORROR" }, - { MECHANIC_INVULNERABILITY , "MECHANIC_INVULNERABILITY" }, - { MECHANIC_INTERRUPT , "MECHANIC_INTERRUPT" }, - { MECHANIC_DAZE , "MECHANIC_DAZE" }, - { MECHANIC_DISCOVERY , "MECHANIC_DISCOVERY" }, - { MECHANIC_IMMUNE_SHIELD , "MECHANIC_IMMUNE_SHIELD" }, - { MECHANIC_SAPPED , "MECHANIC_SAPPED" }, - { MECHANIC_ENRAGED , "MECHANIC_ENRAGED" } -}; - - -struct UnitFlag +EnumName<Mechanics> const mechanicImmunes[MAX_MECHANIC] = { - uint32 flag; - char const* text; + CREATE_NAMED_ENUM(MECHANIC_NONE), + CREATE_NAMED_ENUM(MECHANIC_CHARM), + CREATE_NAMED_ENUM(MECHANIC_DISORIENTED), + CREATE_NAMED_ENUM(MECHANIC_DISARM), + CREATE_NAMED_ENUM(MECHANIC_DISTRACT), + CREATE_NAMED_ENUM(MECHANIC_FEAR), + CREATE_NAMED_ENUM(MECHANIC_GRIP), + CREATE_NAMED_ENUM(MECHANIC_ROOT), + CREATE_NAMED_ENUM(MECHANIC_SLOW_ATTACK), + CREATE_NAMED_ENUM(MECHANIC_SILENCE), + CREATE_NAMED_ENUM(MECHANIC_SLEEP), + CREATE_NAMED_ENUM(MECHANIC_SNARE), + CREATE_NAMED_ENUM(MECHANIC_STUN), + CREATE_NAMED_ENUM(MECHANIC_FREEZE), + CREATE_NAMED_ENUM(MECHANIC_KNOCKOUT), + CREATE_NAMED_ENUM(MECHANIC_BLEED), + CREATE_NAMED_ENUM(MECHANIC_BANDAGE), + CREATE_NAMED_ENUM(MECHANIC_POLYMORPH), + CREATE_NAMED_ENUM(MECHANIC_BANISH), + CREATE_NAMED_ENUM(MECHANIC_SHIELD), + CREATE_NAMED_ENUM(MECHANIC_SHACKLE), + CREATE_NAMED_ENUM(MECHANIC_MOUNT), + CREATE_NAMED_ENUM(MECHANIC_INFECTED), + CREATE_NAMED_ENUM(MECHANIC_TURN), + CREATE_NAMED_ENUM(MECHANIC_HORROR), + CREATE_NAMED_ENUM(MECHANIC_INVULNERABILITY), + CREATE_NAMED_ENUM(MECHANIC_INTERRUPT), + CREATE_NAMED_ENUM(MECHANIC_DAZE), + CREATE_NAMED_ENUM(MECHANIC_DISCOVERY), + CREATE_NAMED_ENUM(MECHANIC_IMMUNE_SHIELD), + CREATE_NAMED_ENUM(MECHANIC_SAPPED), + CREATE_NAMED_ENUM(MECHANIC_ENRAGED) }; -UnitFlag const unitFlags[MAX_UNIT_FLAGS] = +EnumName<UnitFlags> const unitFlags[MAX_UNIT_FLAGS] = { - { UNIT_FLAG_SERVER_CONTROLLED , "UNIT_FLAG_SERVER_CONTROLLED" }, - { UNIT_FLAG_NON_ATTACKABLE , "UNIT_FLAG_NON_ATTACKABLE" }, - { UNIT_FLAG_DISABLE_MOVE , "UNIT_FLAG_DISABLE_MOVE" }, - { UNIT_FLAG_PVP_ATTACKABLE , "UNIT_FLAG_PVP_ATTACKABLE" }, - { UNIT_FLAG_RENAME , "UNIT_FLAG_RENAME" }, - { UNIT_FLAG_PREPARATION , "UNIT_FLAG_PREPARATION" }, - { UNIT_FLAG_UNK_6 , "UNIT_FLAG_UNK_6" }, - { UNIT_FLAG_NOT_ATTACKABLE_1 , "UNIT_FLAG_NOT_ATTACKABLE_1" }, - { UNIT_FLAG_IMMUNE_TO_PC , "UNIT_FLAG_IMMUNE_TO_PC" }, - { UNIT_FLAG_IMMUNE_TO_NPC , "UNIT_FLAG_IMMUNE_TO_NPC" }, - { UNIT_FLAG_LOOTING , "UNIT_FLAG_LOOTING" }, - { UNIT_FLAG_PET_IN_COMBAT , "UNIT_FLAG_PET_IN_COMBAT" }, - { UNIT_FLAG_PVP , "UNIT_FLAG_PVP" }, - { UNIT_FLAG_SILENCED , "UNIT_FLAG_SILENCED" }, - { UNIT_FLAG_UNK_14 , "UNIT_FLAG_UNK_14" }, - { UNIT_FLAG_UNK_15 , "UNIT_FLAG_UNK_15" }, - { UNIT_FLAG_UNK_16 , "UNIT_FLAG_UNK_16" }, - { UNIT_FLAG_PACIFIED , "UNIT_FLAG_PACIFIED" }, - { UNIT_FLAG_STUNNED , "UNIT_FLAG_STUNNED" }, - { UNIT_FLAG_IN_COMBAT , "UNIT_FLAG_IN_COMBAT" }, - { UNIT_FLAG_TAXI_FLIGHT , "UNIT_FLAG_TAXI_FLIGHT" }, - { UNIT_FLAG_DISARMED , "UNIT_FLAG_DISARMED" }, - { UNIT_FLAG_CONFUSED , "UNIT_FLAG_CONFUSED" }, - { UNIT_FLAG_FLEEING , "UNIT_FLAG_FLEEING" }, - { UNIT_FLAG_PLAYER_CONTROLLED , "UNIT_FLAG_PLAYER_CONTROLLED" }, - { UNIT_FLAG_NOT_SELECTABLE , "UNIT_FLAG_NOT_SELECTABLE" }, - { UNIT_FLAG_SKINNABLE , "UNIT_FLAG_SKINNABLE" }, - { UNIT_FLAG_MOUNT , "UNIT_FLAG_MOUNT" }, - { UNIT_FLAG_UNK_28 , "UNIT_FLAG_UNK_28" }, - { UNIT_FLAG_UNK_29 , "UNIT_FLAG_UNK_29" }, - { UNIT_FLAG_SHEATHE , "UNIT_FLAG_SHEATHE" }, - { UNIT_FLAG_UNK_31 , "UNIT_FLAG_UNK_31" } + CREATE_NAMED_ENUM(UNIT_FLAG_SERVER_CONTROLLED), + CREATE_NAMED_ENUM(UNIT_FLAG_NON_ATTACKABLE), + CREATE_NAMED_ENUM(UNIT_FLAG_DISABLE_MOVE), + CREATE_NAMED_ENUM(UNIT_FLAG_PVP_ATTACKABLE), + CREATE_NAMED_ENUM(UNIT_FLAG_RENAME), + CREATE_NAMED_ENUM(UNIT_FLAG_PREPARATION), + CREATE_NAMED_ENUM(UNIT_FLAG_UNK_6), + CREATE_NAMED_ENUM(UNIT_FLAG_NOT_ATTACKABLE_1), + CREATE_NAMED_ENUM(UNIT_FLAG_IMMUNE_TO_PC), + CREATE_NAMED_ENUM(UNIT_FLAG_IMMUNE_TO_NPC), + CREATE_NAMED_ENUM(UNIT_FLAG_LOOTING), + CREATE_NAMED_ENUM(UNIT_FLAG_PET_IN_COMBAT), + CREATE_NAMED_ENUM(UNIT_FLAG_PVP), + CREATE_NAMED_ENUM(UNIT_FLAG_SILENCED), + CREATE_NAMED_ENUM(UNIT_FLAG_UNK_14), + CREATE_NAMED_ENUM(UNIT_FLAG_UNK_15), + CREATE_NAMED_ENUM(UNIT_FLAG_UNK_16), + CREATE_NAMED_ENUM(UNIT_FLAG_PACIFIED), + CREATE_NAMED_ENUM(UNIT_FLAG_STUNNED), + CREATE_NAMED_ENUM(UNIT_FLAG_IN_COMBAT), + CREATE_NAMED_ENUM(UNIT_FLAG_TAXI_FLIGHT), + CREATE_NAMED_ENUM(UNIT_FLAG_DISARMED), + CREATE_NAMED_ENUM(UNIT_FLAG_CONFUSED), + CREATE_NAMED_ENUM(UNIT_FLAG_FLEEING), + CREATE_NAMED_ENUM(UNIT_FLAG_PLAYER_CONTROLLED), + CREATE_NAMED_ENUM(UNIT_FLAG_NOT_SELECTABLE), + CREATE_NAMED_ENUM(UNIT_FLAG_SKINNABLE), + CREATE_NAMED_ENUM(UNIT_FLAG_MOUNT), + CREATE_NAMED_ENUM(UNIT_FLAG_UNK_28), + CREATE_NAMED_ENUM(UNIT_FLAG_UNK_29), + CREATE_NAMED_ENUM(UNIT_FLAG_SHEATHE), + CREATE_NAMED_ENUM(UNIT_FLAG_UNK_31) }; class npc_commandscript : public CommandScript @@ -242,10 +232,15 @@ public: char* team = strtok(NULL, " "); int32 teamval = 0; - if (team) { teamval = atoi(team); } - if (teamval < 0) { teamval = 0; } + if (team) + teamval = atoi(team); + + if (teamval < 0) + teamval = 0; uint32 id = atoi(charID); + if (!sObjectMgr->GetCreatureTemplate(id)) + return false; Player* chr = handler->GetSession()->GetPlayer(); float x = chr->GetPositionX(); @@ -737,8 +732,8 @@ public: handler->PSendSysMessage(LANG_NPCINFO_UNIT_FIELD_FLAGS, target->GetUInt32Value(UNIT_FIELD_FLAGS)); for (uint8 i = 0; i < MAX_UNIT_FLAGS; ++i) - if (target->GetUInt32Value(UNIT_FIELD_FLAGS) & unitFlags[i].flag) - handler->PSendSysMessage(unitFlags[i].text, unitFlags[i].flag); + if (target->GetUInt32Value(UNIT_FIELD_FLAGS) & unitFlags[i].Value) + handler->PSendSysMessage("%s (0x%X)", unitFlags[i].Name, unitFlags[i].Value); handler->PSendSysMessage(LANG_NPCINFO_FLAGS, target->GetUInt32Value(UNIT_FIELD_FLAGS_2), target->GetUInt32Value(UNIT_DYNAMIC_FLAGS), target->getFaction()); handler->PSendSysMessage(LANG_COMMAND_RAWPAWNTIMES, defRespawnDelayStr.c_str(), curRespawnDelayStr.c_str()); @@ -750,13 +745,13 @@ public: handler->PSendSysMessage(LANG_NPCINFO_AIINFO, target->GetAIName().c_str(), target->GetScriptName().c_str()); for (uint8 i = 0; i < NPCFLAG_COUNT; i++) - if (npcflags & npcFlagTexts[i].flag) - handler->PSendSysMessage(npcFlagTexts[i].text, npcFlagTexts[i].flag); + if (npcflags & npcFlagTexts[i].Value) + handler->PSendSysMessage(npcFlagTexts[i].Name); handler->PSendSysMessage(LANG_NPCINFO_MECHANIC_IMMUNE, mechanicImmuneMask); for (uint8 i = 0; i < MAX_MECHANIC; ++i) - if ((mechanicImmuneMask << 1) & mechanicImmunes[i].flag) - handler->PSendSysMessage(mechanicImmunes[i].text, mechanicImmunes[i].flag); + if ((mechanicImmuneMask << 1) & mechanicImmunes[i].Value) + handler->PSendSysMessage("%s (0x%X)", mechanicImmunes[i].Name, mechanicImmunes[i].Value); return true; } @@ -1361,6 +1356,9 @@ public: if (!id) return false; + if (!sObjectMgr->GetCreatureTemplate(id)) + return false; + chr->SummonCreature(id, *chr, TEMPSUMMON_CORPSE_DESPAWN, 120); return true; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp index 4c6b3ae8b3f..7fcb624c35e 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp @@ -989,6 +989,7 @@ class boss_yogg_saron : public CreatureScript Talk(SAY_YOGG_SARON_PHASE_3); DoCast(me, SPELL_PHASE_3_TRANSFORM); me->RemoveAurasDueToSpell(SPELL_SHADOWY_BARRIER_YOGG); + me->ResetPlayerDamageReq(); break; default: break; diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp index e44e0ab0539..7d3d149f0ff 100644 --- a/src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp +++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_archavon.cpp @@ -17,6 +17,7 @@ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "SpellScript.h" #include "vault_of_archavon.h" enum Emotes @@ -27,9 +28,12 @@ enum Emotes enum Spells { - // Spells Archavon SPELL_ROCK_SHARDS = 58678, + SPELL_ROCK_SHARDS_VISUAL_L = 58689, + SPELL_ROCK_SHARDS_VISUAL_R = 58692, + SPELL_ROCK_SHARDS_DAMAGE_L = 58695, + SPELL_ROCK_SHARDS_DAMAGE_R = 58696, SPELL_CRUSHING_LEAP = 58960, SPELL_STOMP = 58663, SPELL_IMPALE = 58666, @@ -205,8 +209,55 @@ class npc_archavon_warder : public CreatureScript } }; +// 58941 - Rock Shards +class spell_archavon_rock_shards : public SpellScriptLoader +{ + public: + spell_archavon_rock_shards() : SpellScriptLoader("spell_archavon_rock_shards") { } + + class spell_archavon_rock_shards_SpellScript : public SpellScript + { + PrepareSpellScript(spell_archavon_rock_shards_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE + { + if (!sSpellMgr->GetSpellInfo(SPELL_ROCK_SHARDS_VISUAL_L) + || !sSpellMgr->GetSpellInfo(SPELL_ROCK_SHARDS_VISUAL_R) + || !sSpellMgr->GetSpellInfo(SPELL_ROCK_SHARDS_DAMAGE_L) + || !sSpellMgr->GetSpellInfo(SPELL_ROCK_SHARDS_DAMAGE_R)) + return false; + return true; + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + + for (uint8 i = 0; i < 3; ++i) + { + caster->CastSpell((Unit*)NULL, SPELL_ROCK_SHARDS_VISUAL_L, true); + caster->CastSpell((Unit*)NULL, SPELL_ROCK_SHARDS_VISUAL_R, true); + } + + caster->CastSpell((Unit*)NULL, SPELL_ROCK_SHARDS_DAMAGE_L, true); + caster->CastSpell((Unit*)NULL, SPELL_ROCK_SHARDS_DAMAGE_R, true); + } + + void Register() OVERRIDE + { + OnEffectHit += SpellEffectFn(spell_archavon_rock_shards_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const OVERRIDE + { + return new spell_archavon_rock_shards_SpellScript(); + } +}; + void AddSC_boss_archavon() { new boss_archavon(); new npc_archavon_warder(); + new spell_archavon_rock_shards(); } diff --git a/src/server/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp index 8804410d814..6b56c51d6e1 100644 --- a/src/server/scripts/Spells/spell_quest.cpp +++ b/src/server/scripts/Spells/spell_quest.cpp @@ -25,7 +25,7 @@ #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "SpellScript.h" -#include "SpellAuras.h" +#include "SpellAuraEffects.h" #include "Vehicle.h" #include "GridNotifiers.h" #include "GridNotifiersImpl.h" @@ -2072,8 +2072,6 @@ class spell_q12641_death_comes_from_on_high : public SpellScriptLoader { uint32 spellId = 0; - TC_LOG_DEBUG(LOG_FILTER_SPELLS_AURAS, "spell_q12641_death_comes_from_on_high:: Caster: %s (GUID: %u) On Hit Target: Creature: %s (Entry: %u GUID: %u)", - GetOriginalCaster()->GetName().c_str(), GetOriginalCaster()->GetGUIDLow(), GetHitCreature()->GetName().c_str(), GetHitCreature()->GetEntry(), GetHitCreature()->GetGUIDLow()); switch (GetHitCreature()->GetEntry()) { case NPC_NEW_AVALON_FORGE: @@ -2092,7 +2090,7 @@ class spell_q12641_death_comes_from_on_high : public SpellScriptLoader return; } - GetOriginalCaster()->CastSpell((Unit*)NULL, spellId, true); + GetCaster()->CastSpell((Unit*)NULL, spellId, true); } void Register() OVERRIDE @@ -2107,6 +2105,62 @@ class spell_q12641_death_comes_from_on_high : public SpellScriptLoader } }; +// 51769 - Emblazon Runeblade +class spell_q12619_emblazon_runeblade : public SpellScriptLoader +{ + public: + spell_q12619_emblazon_runeblade() : SpellScriptLoader("spell_q12619_emblazon_runeblade") { } + + class spell_q12619_emblazon_runeblade_AuraScript : public AuraScript + { + PrepareAuraScript(spell_q12619_emblazon_runeblade_AuraScript); + + void HandleEffectPeriodic(AuraEffect const* aurEff) + { + PreventDefaultAction(); + if (Unit* caster = GetCaster()) + caster->CastSpell(caster, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true, NULL, aurEff); + } + + void Register() OVERRIDE + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_q12619_emblazon_runeblade_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const OVERRIDE + { + return new spell_q12619_emblazon_runeblade_AuraScript(); + } +}; + +// 51770 - Emblazon Runeblade +class spell_q12619_emblazon_runeblade_effect : public SpellScriptLoader +{ + public: + spell_q12619_emblazon_runeblade_effect() : SpellScriptLoader("spell_q12619_emblazon_runeblade_effect") { } + + class spell_q12619_emblazon_runeblade_effect_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q12619_emblazon_runeblade_effect_SpellScript); + + void HandleScript(SpellEffIndex /*effIndex*/) + { + GetCaster()->CastSpell(GetCaster(), uint32(GetEffectValue()), false); + } + + void Register() OVERRIDE + { + OnEffectHit += SpellEffectFn(spell_q12619_emblazon_runeblade_effect_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const OVERRIDE + { + return new spell_q12619_emblazon_runeblade_effect_SpellScript(); + } +}; + void AddSC_quest_spell_scripts() { new spell_q55_sacred_cleansing(); @@ -2157,4 +2211,6 @@ void AddSC_quest_spell_scripts() new spell_q12308_escape_from_silverbrook_summon_worgen(); new spell_q12308_escape_from_silverbrook(); new spell_q12641_death_comes_from_on_high(); + new spell_q12619_emblazon_runeblade(); + new spell_q12619_emblazon_runeblade_effect(); } diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp index 7e237614f62..fdb71dd8d1a 100644 --- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp @@ -458,6 +458,9 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_SEL_GUILD_BANK_ITEM_BY_ENTRY, "SELECT gi.item_guid, gi.guildid, g.name FROM guild_bank_item gi INNER JOIN guild g ON g.guildid = gi.guildid INNER JOIN item_instance ii ON ii.guid = gi.item_guid WHERE ii.itemEntry = ? LIMIT ?", CONNECTION_SYNCH); PrepareStatement(CHAR_DEL_CHAR_ACHIEVEMENT, "DELETE FROM character_achievement WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS, "DELETE FROM character_achievement_progress WHERE guid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_INS_CHAR_ACHIEVEMENT, "INSERT INTO character_achievement (guid, achievement, date) VALUES (?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS_BY_CRITERIA, "DELETE FROM character_achievement_progress WHERE guid = ? AND criteria = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_INS_CHAR_ACHIEVEMENT_PROGRESS, "INSERT INTO character_achievement_progress (guid, criteria, counter, date) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_REPUTATION_BY_FACTION, "DELETE FROM character_reputation WHERE guid = ? AND faction = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_CHAR_REPUTATION_BY_FACTION, "INSERT INTO character_reputation (guid, faction, standing, flags) VALUES (?, ?, ? , ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_CHAR_ARENA_POINTS, "UPDATE characters SET arenaPoints = (arenaPoints + ?) WHERE guid = ?", CONNECTION_ASYNC); diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/shared/Database/Implementation/CharacterDatabase.h index f97dd63064d..4aeee0ac525 100644 --- a/src/server/shared/Database/Implementation/CharacterDatabase.h +++ b/src/server/shared/Database/Implementation/CharacterDatabase.h @@ -394,6 +394,9 @@ enum CharacterDatabaseStatements CHAR_SEL_GUILD_BANK_ITEM_BY_ENTRY, CHAR_DEL_CHAR_ACHIEVEMENT, CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS, + CHAR_INS_CHAR_ACHIEVEMENT, + CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS_BY_CRITERIA, + CHAR_INS_CHAR_ACHIEVEMENT_PROGRESS, CHAR_DEL_CHAR_REPUTATION_BY_FACTION, CHAR_INS_CHAR_REPUTATION_BY_FACTION, CHAR_UPD_CHAR_ARENA_POINTS, diff --git a/src/server/worldserver/CommandLine/CliRunnable.cpp b/src/server/worldserver/CommandLine/CliRunnable.cpp index e136269e2a0..1ebb58eef1a 100644 --- a/src/server/worldserver/CommandLine/CliRunnable.cpp +++ b/src/server/worldserver/CommandLine/CliRunnable.cpp @@ -175,6 +175,8 @@ void CliRunnable::run() { #if PLATFORM == PLATFORM_WINDOWS printf("TC>"); +#else + free(command_str); #endif continue; } @@ -184,6 +186,8 @@ void CliRunnable::run() { #if PLATFORM == PLATFORM_WINDOWS printf("TC>"); +#else + free(command_str); #endif continue; } @@ -192,6 +196,7 @@ void CliRunnable::run() sWorld->QueueCliCommand(new CliCommandHolder(NULL, command.c_str(), &utf8print, &commandFinished)); #if PLATFORM != PLATFORM_WINDOWS add_history(command.c_str()); + free(command_str); #endif } else if (feof(stdin)) |