This commit is contained in:
Shauren
2016-07-06 00:05:13 +02:00
94 changed files with 3402 additions and 571 deletions
+1
View File
@@ -17,3 +17,4 @@ CMakeLists.txt.user
*.BASE.*
*.LOCAL.*
nbproject/*
.idea/*
+1 -1
View File
@@ -1,4 +1,4 @@
# ![logo](http://www.trinitycore.org/f/public/style_images/1_trinitycore.png) TrinityCore
# ![logo](https://community.trinitycore.org/public/style_images/1_trinitycore.png) TrinityCore
[![Issue Stats](http://www.issuestats.com/github/TrinityCore/TrinityCore/badge/issue)](http://www.issuestats.com/github/TrinityCore/TrinityCore) [![Issue Stats](http://www.issuestats.com/github/TrinityCore/TrinityCore/badge/pr)](http://www.issuestats.com/github/TrinityCore/TrinityCore) [![Bountysource](https://www.bountysource.com/badge/tracker?tracker_id=1310)](https://www.bountysource.com/trackers/1310-trinity-core?utm_source=1310&utm_medium=shield&utm_campaign=TRACKER_BADGE)
+13 -1
View File
@@ -9,8 +9,20 @@
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
option(SERVERS "Build worldserver and bnetserver" 1)
set(SCRIPTS_AVAILABLE_OPTIONS none static dynamic minimal-static minimal-dynamic)
# Log a fatal error when the value of the SCRIPTS variable isn't a valid option.
if (SCRIPTS)
list (FIND SCRIPTS_AVAILABLE_OPTIONS "${SCRIPTS}" SCRIPTS_INDEX)
if (${SCRIPTS_INDEX} EQUAL -1)
message(FATAL_ERROR "The value (${SCRIPTS}) of your SCRIPTS variable is invalid! "
"Allowed values are: ${SCRIPTS_AVAILABLE_OPTIONS}")
endif()
endif()
set(SCRIPTS "static" CACHE STRING "Build core with scripts")
set_property(CACHE SCRIPTS PROPERTY STRINGS none static dynamic minimal-static minimal-dynamic)
set_property(CACHE SCRIPTS PROPERTY STRINGS ${SCRIPTS_AVAILABLE_OPTIONS})
# Build a list of all script modules when -DSCRIPT="custom" is selected
GetScriptModuleList(SCRIPT_MODULE_LIST)
+1 -1
View File
@@ -6,7 +6,7 @@
**Target branch(es)**: 335/6x
**Issues addressed**: Fixes #
**Issues addressed**: Closes #
**Tests performed**: (Does it build, tested in-game, etc)
@@ -0,0 +1,13 @@
ALTER TABLE `item_upgrade`
CHANGE `CurrencyCost` `CurrencyCost` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`,
CHANGE `PrevItemUpgradeID` `PrevItemUpgradeID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `CurrencyCost`,
CHANGE `CurrencyID` `CurrencyID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `PrevItemUpgradeID`,
CHANGE `ItemUpgradePathID` `ItemUpgradePathID` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `CurrencyID`,
CHANGE `ItemLevelBonus` `ItemLevelBonus` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `ItemUpgradePathID`;
ALTER TABLE `ruleset_item_upgrade`
CHANGE `ItemID` `ItemID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `ID`,
CHANGE `ItemUpgradeID` `ItemUpgradeID` smallint(5) unsigned NOT NULL DEFAULT '0' AFTER `ItemID`,
DROP `RulesetID`;
ALTER TABLE `skill_line_ability` CHANGE `AquireMethod` `AcquireMethod` tinyint(3) unsigned NOT NULL DEFAULT '0';
@@ -0,0 +1,27 @@
--
-- Table structure for table `item_upgrade`
--
DROP TABLE IF EXISTS `item_upgrade`;
CREATE TABLE `item_upgrade` (
`ID` int(10) unsigned NOT NULL DEFAULT '0',
`ItemUpgradePathID` int(10) unsigned NOT NULL DEFAULT '0',
`ItemLevelBonus` int(10) unsigned NOT NULL DEFAULT '0',
`PrevItemUpgradeID` int(10) unsigned NOT NULL DEFAULT '0',
`CurrencyID` int(10) unsigned NOT NULL DEFAULT '0',
`CurrencyCost` int(10) unsigned NOT NULL DEFAULT '0',
`VerifiedBuild` smallint(6) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
--
-- Table structure for table `ruleset_item_upgrade`
--
DROP TABLE IF EXISTS `ruleset_item_upgrade`;
CREATE TABLE `ruleset_item_upgrade` (
`ID` int(10) unsigned NOT NULL DEFAULT '0',
`RulesetID` int(10) unsigned NOT NULL DEFAULT '0',
`ItemUpgradeID` int(10) unsigned NOT NULL DEFAULT '0',
`ItemID` int(10) unsigned NOT NULL DEFAULT '0',
`VerifiedBuild` smallint(6) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
@@ -0,0 +1 @@
UPDATE `command` SET `help` = 'Syntax: .cometome\nMake selected creature come to your current location (new position not saved to DB).' WHERE `command`.`name` = 'cometome';
@@ -0,0 +1,26 @@
--
SET @FIRSTTROUGH := 36727;
SET @SECONDTROUGH := 37155;
SET @THIRDTROUGH := 37156;
SET @BURNEFFECT := 42345;
SET @SPELLTHROWTORCH := 69228;
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceGroup`=1 AND `SourceEntry`=@SPELLTHROWTORCH;
INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
(13,1,@SPELLTHROWTORCH,0,0,31,0,3,@THIRDTROUGH, 0,0,"","Throw Torch target Third Trough"),
(13,1,@SPELLTHROWTORCH,0,1,31,0,3,@SECONDTROUGH,0,0,"","Throw Torch target Second Trough"),
(13,1,@SPELLTHROWTORCH,0,2,31,0,3,@FIRSTTROUGH, 0,0,"","Throw Torch target First Trough");
UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@FIRSTTROUGH;
UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@SECONDTROUGH;
UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@THIRDTROUGH;
DELETE FROM `smart_scripts` WHERE `entryorguid`=@FIRSTTROUGH AND `source_type`=0 AND `id` in (0,1);
DELETE FROM `smart_scripts` WHERE `entryorguid`=@SECONDTROUGH AND `source_type`=0 AND `id` in (0,1);
DELETE FROM `smart_scripts` WHERE `entryorguid`=@THIRDTROUGH AND `source_type`=0 AND `id` in (0,1);
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
(@FIRSTTROUGH,0,0,1,8,0,100,0,@SPELLTHROWTORCH,0,0,0,33,@FIRSTTROUGH,0,0,0,0,0,7,0,0,0,0,0,0,0,"First Trough - On Spellhit 'Throw Torch' - Quest Credit 'Feed of Evil'"),
(@FIRSTTROUGH,0,1,0,61,0,100,0,@SPELLTHROWTORCH,0,0,0,11,@BURNEFFECT,0,0,0,0,0,1,0,0,0,0,0,0,0,"First Trough - On Spellhit 'Throw Torch' - Cast 'Cosmetic - Flame Patch'"),
(@SECONDTROUGH,0,0,1,8,0,100,0,@SPELLTHROWTORCH,0,0,0,33,@SECONDTROUGH,0,0,0,0,0,7,0,0,0,0,0,0,0,"Second Trough - On Spellhit 'Throw Torch' - Quest Credit 'Feed of Evil'"),
(@SECONDTROUGH,0,1,0,61,0,100,0,@SPELLTHROWTORCH,0,0,0,11,@BURNEFFECT,0,0,0,0,0,1,0,0,0,0,0,0,0,"Second Trough - On Spellhit 'Throw Torch' - Cast 'Cosmetic - Flame Patch'"),
(@THIRDTROUGH,0,0,1,8,0,100,0,@SPELLTHROWTORCH,0,0,0,33,@THIRDTROUGH,0,0,0,0,0,7,0,0,0,0,0,0,0,"Third Trough - On Spellhit 'Throw Torch' - Quest Credit 'Feed of Evil'"),
(@THIRDTROUGH,0,1,0,61,0,100,0,@SPELLTHROWTORCH,0,0,0,11,@BURNEFFECT,0,0,0,0,0,1,0,0,0,0,0,0,0,"Third Trough - On Spellhit 'Throw Torch' - Cast 'Cosmetic - Flame Patch'");
@@ -0,0 +1,8 @@
--
DELETE FROM `terrain_swap_defaults` WHERE `MapId`= 0 AND `TerrainSwapMap`= 1190;
INSERT INTO `terrain_swap_defaults` (`MapId`,`TerrainSwapMap`,`Comment`) VALUES
(0, 1190, 'Blasted Land Terrian');
DELETE FROM `terrain_worldmap` WHERE `TerrainSwapMap`= 545 AND `WorldMapArea`= 683;
INSERT INTO `terrain_worldmap` (`TerrainSwapMap`,`WorldMapArea`,`Comment`) VALUES
(545, 683, 'Blasted Land Swap');
@@ -0,0 +1,50 @@
--
SET @NPC := 452424;
DELETE FROM `creature` WHERE `guid`=@NPC;
INSERT INTO `creature` (`guid`, `id`, `map`, `position_x`, `position_y`, `position_z`) VALUES (@NPC, 50839,0, -7507.344, -1167.55, 261.0904);
-- Pathing for Chromehound Entry: 50839 'TDB FORMAT'
SET @PATH := @NPC * 10;
UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-7507.344,`position_y`=-1167.55,`position_z`=261.0904 WHERE `guid`=@NPC;
DELETE FROM `creature_addon` WHERE `guid`=@NPC;
INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, '');
DELETE FROM `waypoint_data` WHERE `id`=@PATH;
INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
(@PATH,1,-7507.344,-1167.55,261.0904,0,0,0,0,100,0),
(@PATH,2,-7492.085,-1164.431,262.7305,0,0,0,0,100,0),
(@PATH,3,-7489.484,-1149.292,264.4326,0,0,0,0,100,0),
(@PATH,4,-7490.816,-1130.962,265.503,0,0,0,0,100,0),
(@PATH,5,-7494.488,-1121.899,265.6144,0,0,0,0,100,0),
(@PATH,6,-7492.366,-1110.879,266.0537,0,0,0,0,100,0),
(@PATH,7,-7493.984,-1094.67,265.577,0,0,0,0,100,0),
(@PATH,8,-7495.3,-1083.632,265.1164,0,0,0,0,100,0),
(@PATH,9,-7503.222,-1072.288,264.4205,0,0,0,0,100,0),
(@PATH,10,-7507.295,-1060.439,263.3694,0,0,0,0,100,0),
(@PATH,11,-7521.344,-1044.481,260.9198,0,0,0,0,100,0),
(@PATH,12,-7531.807,-1033.694,258.3916,0,0,0,0,100,0),
(@PATH,13,-7550.604,-1024.927,254.4957,0,0,0,0,100,0),
(@PATH,14,-7566.979,-1019.031,250.771,0,0,0,0,100,0),
(@PATH,15,-7587.071,-1014.3,246.2627,0,0,0,0,100,0),
(@PATH,16,-7609.59,-1013.542,240.6937,0,0,0,0,100,0),
(@PATH,17,-7628.318,-1020.125,235.8074,0,0,0,0,100,0),
(@PATH,18,-7643.806,-1026.658,231.2818,0,0,0,0,100,0),
(@PATH,19,-7662.762,-1041.675,225.5605,0,0,0,0,100,0),
(@PATH,20,-7679.563,-1057.769,220.2642,0,0,0,0,100,0),
(@PATH,21,-7687.872,-1075.955,218.3654,0,0,0,0,100,0),
(@PATH,22,-7692.823,-1094.333,217.3829,0,0,0,0,100,0),
(@PATH,23,-7699.91,-1104.755,216.755,0,0,0,0,100,0),
(@PATH,24,-7698.327,-1124.78,215.6021,0,0,0,0,100,0),
(@PATH,25,-7693.615,-1147.448,215.0171,0,0,0,0,100,0),
(@PATH,26,-7688.542,-1162.736,215.4126,0,0,0,0,100,0),
(@PATH,27,-7678.569,-1177.247,217.1286,0,0,0,0,100,0),
(@PATH,28,-7665.182,-1194.701,220.6102,0,0,0,0,100,0),
(@PATH,29,-7649.865,-1205.075,224.4757,0,0,0,0,100,0),
(@PATH,30,-7635.476,-1212.811,228.4464,0,0,0,0,100,0),
(@PATH,31,-7622.031,-1217.165,231.4845,0,0,0,0,100,0),
(@PATH,32,-7605.257,-1222.564,234.1023,0,0,0,0,100,0),
(@PATH,33,-7593.495,-1223.609,237.124,0,0,0,0,100,0),
(@PATH,34,-7579.444,-1221.302,241.1097,0,0,0,0,100,0),
(@PATH,35,-7564.16,-1218.061,245.7083,0,0,0,0,100,0),
(@PATH,36,-7547.385,-1211.174,249.913,0,0,0,0,100,0),
(@PATH,37,-7532.037,-1200.672,253.8217,0,0,0,0,100,0),
(@PATH,38,-7522.413,-1193.398,256.1735,0,0,0,0,100,0),
(@PATH,39,-7515.12,-1179.415,258.7101,0,0,0,0,100,0);
@@ -0,0 +1,14 @@
--
SET @OGUID := 300915; -- set by TDB team (1)
DELETE FROM `gameobject_template` WHERE `entry`=244447;
INSERT INTO `gameobject_template` (`entry`, `type`, `displayId`, `name`, `IconName`, `castBarCaption`, `unk1`, `size`, `Data0`, `Data1`, `Data2`, `Data3`, `Data4`, `Data5`, `Data6`, `Data7`, `Data8`, `Data9`, `Data10`, `Data11`, `Data12`, `Data13`, `Data14`, `Data15`, `Data16`, `Data17`, `Data18`, `Data19`, `Data20`, `Data21`, `Data22`, `Data23`, `Data24`, `Data25`, `Data26`, `Data27`, `Data28`, `Data29`, `Data30`, `Data31`, `Data32`, `unkInt32`, `VerifiedBuild`) VALUES
(244447, 3, 3851, 'White Murloc Egg', '', '', '', 1, 1691, 62019, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20726); -- White Murloc Egg
DELETE FROM `gameobject` WHERE `guid`=@OGUID+0;
INSERT INTO `gameobject` (`guid`, `id`, `map`, `spawnMask`, `PhaseID`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`, `VerifiedBuild`) VALUES
(@OGUID+0, 244447, 571, 1, 0, 1462.983, 5422.067, 0.6317602, 4.443114, 0, 0, 0, 1, 5, 255, 1, 20726); -- White Murloc Egg (Area: Riplash Ruins)
DELETE FROM `gameobject_loot_template` WHERE `Entry`=244447;
INSERT INTO `gameobject_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES
(244447, 22780, 0, 100, 0, 1, 0, 1, 1, 'White Murloc Egg');
@@ -0,0 +1,6 @@
--
-- remove loot item 4893, 'Savannah Lion Tusk' from the loot table
-- move loot item 5096 from Savannah Prowler (3425) to Savannah Huntress (3415)
DELETE FROM `creature_loot_template` WHERE `Item` IN (4893,5096);
INSERT INTO `creature_loot_template` (`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES
(3415, 5096, 0, 50.08, 1, 1, 0, 1, 1, NULL);
@@ -0,0 +1,6 @@
--
DELETE FROM `spell_area` WHERE `spell` IN (60922, 49417, 49416) AND `quest_start` = 14071;
INSERT INTO `spell_area` (`spell`, `area`, `quest_start`, `gender`, `autocast`, `quest_start_status`) VALUES
(60922, 4765, 14071, 2, 1, 8),
(49417, 4737, 14071, 2, 1, 8),
(49416, 4767, 14071, 2, 1, 8);
@@ -0,0 +1,4 @@
--
DELETE FROM `spell_linked_spell` WHERE `spell_trigger` = 108212;
INSERT INTO `spell_linked_spell` (`spell_trigger`, `spell_effect`, `type`, `comment`) VALUES
(108212, 137681, 0, 'Burst of Speed - Rogue Talent');
@@ -0,0 +1 @@
DROP TABLE IF EXISTS `spell_ranks`;
@@ -0,0 +1,3 @@
-- Huntress Claws: http://eu.battle.net/wow/en/item/5096
-- Drop Chance: Guaranteed
UPDATE `creature_loot_template` SET `Chance`=100 WHERE `Item`=5096;
@@ -0,0 +1,13 @@
--
DELETE FROM `game_event_gameobject` WHERE `guid` IN (220041, 220044, 220043, 220042, 220048, 220049, 220076, 220148, 220147, 220029);
INSERT INTO `game_event_gameobject` (`eventEntry`, `guid`) VALUES
(3, 220029),
(3, 220041),
(3, 220042),
(3, 220043),
(3, 220044),
(3, 220147),
(3, 220048),
(3, 220049),
(3, 220076),
(3, 220148);
@@ -0,0 +1,16 @@
--
DELETE FROM `game_event_creature` WHERE `guid` IN (314040, 314484, 310945);
INSERT INTO `game_event_creature` (`eventEntry`, `guid`) VALUES
(3, 314040),
(3, 314484),
(3, 310945);
DELETE FROM `game_event_gameobject` WHERE `guid` IN (220437, 220463, 220468, 220476, 220461, 220436, 220466);
INSERT INTO `game_event_gameobject` (`eventEntry`, `guid`) VALUES
(3, 220437),
(3, 220463),
(3, 220468),
(3, 220476),
(3, 220461),
(3, 220436),
(3, 220466);
@@ -0,0 +1,2 @@
--
UPDATE `creature_template` SET `npcflag`=`npcflag` &~2 WHERE `entry` IN (16521, 16522);
@@ -0,0 +1,3 @@
DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_monk_provoke';
INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
(115546,'spell_monk_provoke');
@@ -0,0 +1,2 @@
--
UPDATE `creature_template` SET `npcflag`=`npcflag` &~2 WHERE `entry` IN (3101);
@@ -0,0 +1 @@
ALTER TABLE `playercreateinfo_cast_spell` ADD PRIMARY KEY(`raceMask`, `classMask`, `spell`);
@@ -0,0 +1,2 @@
--
UPDATE `creature_template` SET `flags_extra`=`flags_extra`|128|2 WHERE `entry` IN (35010,35011,35830);
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,320 @@
--
SET @CGUID := 452425;
SET @OGUID := 300916;
DELETE FROM `creature` WHERE `map`=369;
DELETE FROM `gameobject` WHERE `map`=369;
DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+110;
INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `MovementType`) VALUES
(@CGUID+0, 59481, 369, 1, -111.592, 2497.691, -49.03749, 3.245147, 7200, 0, 0), -- World Trigger (Area: Deeprun Tram)
(@CGUID+1, 59481, 369, 1, -123.015, 2486.45, -49.03749, 1.610651, 7200, 0, 0), -- World Trigger (Area: Deeprun Tram)
(@CGUID+2, 59481, 369, 1, -112.0902, 2502.644, -49.03749, 3.245147, 7200, 0, 0), -- World Trigger (Area: Deeprun Tram)
(@CGUID+3, 66305, 369, 1, -120.93, 2499.215, -42.5099, 4.981629, 7200, 0, 0), -- Generic Bunny - PRK (Gigantic AOI) (Area: Deeprun Tram) (Auras: 131338 - Brawl Sound - Alliance, Fight (DNT))
(@CGUID+4, 59481, 369, 1, -117.2557, 2488.732, -49.03749, 1.610651, 7200, 0, 0), -- World Trigger (Area: Deeprun Tram)
(@CGUID+5, 13018, 369, 1, -19.66991, 2459.451, -4.297698, 4.315197, 7200, 0, 0), -- Nipsy (Area: Deeprun Tram)
(@CGUID+6, 59481, 369, 1, -122.51, 2512.107, -49.03749, 1.610651, 7200, 0, 0), -- World Trigger (Area: Deeprun Tram)
(@CGUID+7, 59481, 369, 1, -113.6001, 2492.852, -49.03749, 1.610651, 7200, 0, 0), -- World Trigger (Area: Deeprun Tram)
(@CGUID+8, 68952, 369, 1, -11.66637, 2460.222, -13.67119, 0, 7200, 0, 0), -- Bizmo's Brawlpub Entrance (Area: Deeprun Tram)
(@CGUID+9, 59481, 369, 1, -117.462, 2510.872, -49.03749, 1.610651, 7200, 0, 0), -- World Trigger (Area: Deeprun Tram)
(@CGUID+10, 59481, 369, 1, -113.6244, 2507.23, -49.03749, 1.610651, 7200, 0, 0), -- World Trigger (Area: Deeprun Tram)
(@CGUID+11, 59481, 369, 1, -128.5394, 2511.586, -49.03749, 1.610651, 7200, 0, 0), -- World Trigger (Area: Deeprun Tram)
(@CGUID+12, 59481, 369, 1, -128.2716, 2486.095, -49.03749, 1.610651, 7200, 0, 0), -- World Trigger (Area: Deeprun Tram)
(@CGUID+13, 68801, 369, 1, -72.61393, 2484.34, -42.56921, 2.688661, 7200, 0, 0), -- Flora (Area: Deeprun Tram)
(@CGUID+14, 68798, 369, 1, -74.73705, 2488.276, -42.56943, 4.384407, 7200, 0, 0), -- Verah "Violet" Bustle (Area: Deeprun Tram)
(@CGUID+15, 68408, 369, 1, -79.87337, 2456.72, -43.02885, 6.074724, 7200, 0, 0), -- Bizmo's Brawlpub Bouncer (Area: Deeprun Tram)
(@CGUID+16, 68363, 369, 1, -80.62134, 2493.143, -43.04583, 3.141518, 7200, 0, 0), -- Quackenbush (Area: Deeprun Tram)
(@CGUID+17, 68408, 369, 1, -79.48066, 2462.06, -43.04464, 0.006766027, 7200, 0, 0), -- Bizmo's Brawlpub Bouncer (Area: Deeprun Tram)
(@CGUID+18, 68963, 369, 1, -69.9504, 2531.353, -43.03644, 4.470451, 7200, 0, 0), -- Boom Room Bouncer (Area: Deeprun Tram) (Auras: 134909 - Guard Area Trigger)
(@CGUID+19, 68537, 369, 1, -77.59014, 2474.093, -42.57321, 5.390444, 7200, 0, 0), -- Keith "The Party" Westin (Area: Deeprun Tram) (Auras: 135041 - Wearing Glasses)
(@CGUID+20, 68540, 369, 1, -92.56053, 2501.646, -43.0263, 3.215507, 7200, 0, 0), -- Twix Gearspark (Area: Deeprun Tram) (Auras: 135038 - Wearing A Rose)
(@CGUID+21, 70752, 369, 1, -80.73928, 2496.621, -43.04459, 3.155379, 7200, 0, 0), -- Card Trader Leila (Area: Deeprun Tram)
(@CGUID+22, 68408, 369, 1, -80.53696, 2503.729, -43.04551, 3.495188, 7200, 0, 0), -- Bizmo's Brawlpub Bouncer (Area: Deeprun Tram) (Auras: 134909 - Guard Area Trigger)
(@CGUID+23, 68408, 369, 1, -92.82359, 2478.773, -43.02393, 5.454063, 7200, 0, 0), -- Bizmo's Brawlpub Bouncer (Area: Deeprun Tram) (Auras: 134909 - Guard Area Trigger)
(@CGUID+24, 68442, 369, 1, -185.4213, 2403.296, -19.29758, 1.549658, 7200, 0, 0), -- Subway Car (Area: Deeprun Tram) (Auras: 46598 - Ride Vehicle Hardcoded) (possible waypoints or random movement)
(@CGUID+25, 68994, 369, 1, -92.15841, 2508.988, -43.02711, 3.417215, 7200, 0, 0), -- Brawl Enthusiast (Area: Deeprun Tram)
(@CGUID+26, 68442, 369, 1, -185.9497, 2378.302, -19.29758, 1.549658, 7200, 0, 0), -- Subway Car (Area: Deeprun Tram) (Auras: 46598 - Ride Vehicle Hardcoded) (possible waypoints or random movement)
(@CGUID+27, 68803, 369, 1, -77.40304, 2527.581, -43.14859, 1.466077, 7200, 0, 0), -- Willow Cloudstep (Area: Deeprun Tram)
(@CGUID+28, 68406, 369, 1, -90.78221, 2510.052, -43.02958, 3.444857, 7200, 0, 0), -- Brawl Enthusiast (Area: Deeprun Tram)
(@CGUID+29, 68994, 369, 1, -91.88435, 2507.1, -43.02748, 3.360122, 7200, 0, 0), -- Brawl Enthusiast (Area: Deeprun Tram)
(@CGUID+30, 68434, 369, 1, -184.8929, 2428.29, -19.29758, 1.549658, 7200, 0, 0), -- Subway Car (Area: Deeprun Tram) (Auras: )
(@CGUID+31, 68963, 369, 1, -77.38558, 2531.209, -43.06725, 4.655104, 7200, 0, 0), -- Boom Room Bouncer (Area: Deeprun Tram) (Auras: 134909 - Guard Area Trigger)
(@CGUID+32, 73645, 369, 1, -100.9014, 2521.038, -43.00908, 4.456221, 7200, 0, 0), -- Mochi (Area: Deeprun Tram)
(@CGUID+33, 73642, 369, 1, -101.7706, 2521.221, -43.01014, 4.267982, 7200, 0, 0), -- Carman Cheung (Area: Deeprun Tram)
(@CGUID+34, 68323, 369, 1, -100.3051, 2500.025, -38.27213, 4.704797, 7200, 0, 0), -- Bizmo (Area: Deeprun Tram) (Auras: 134727 - Announcer Control Aura) (possible waypoints or random movement)
(@CGUID+35, 68994, 369, 1, -98.8081, 2528.282, -30.94316, 4.794365, 7200, 0, 0), -- Brawl Enthusiast (Area: Deeprun Tram)
(@CGUID+36, 68994, 369, 1, -92.28378, 2495.343, -43.02649, 2.885064, 7200, 0, 0), -- Brawl Enthusiast (Area: Deeprun Tram)
(@CGUID+37, 68408, 369, 1, -92.80369, 2520.167, -43.02577, 0.9440587, 7200, 0, 0), -- Bizmo's Brawlpub Bouncer (Area: Deeprun Tram) (Auras: 134909 - Guard Area Trigger)
(@CGUID+38, 68408, 369, 1, -105.0908, 2536.745, -29.50906, 3.152398, 7200, 0, 0), -- Bizmo's Brawlpub Bouncer (Area: Deeprun Tram) (Auras: 134909 - Guard Area Trigger)
(@CGUID+39, 68405, 369, 1, -92.70891, 2513.377, -41.73821, 3.517262, 7200, 0, 0), -- Brawl Enthusiast (Area: Deeprun Tram)
(@CGUID+40, 68992, 369, 1, -97.60636, 2521.3, -43.0251, 4.362116, 7200, 0, 0), -- Brawl Enthusiast (Area: Deeprun Tram)
(@CGUID+41, 73646, 369, 1, -110.409, 2521.234, -43.09079, 3.983943, 7200, 0, 0), -- Mugen (Area: Deeprun Tram)
(@CGUID+42, 68994, 369, 1, -114.8847, 2528.314, -30.94316, 4.794365, 7200, 0, 0), -- Brawl Enthusiast (Area: Deeprun Tram)
(@CGUID+43, 70722, 369, 1, -115.9391, 2548.06, -29.42094, 5.008683, 7200, 0, 0), -- Grant Lazarby (Area: Deeprun Tram)
(@CGUID+44, 68406, 369, 1, -104.7996, 2478.275, -43.02339, 1.905591, 7200, 0, 0), -- Brawl Enthusiast (Area: Deeprun Tram)
(@CGUID+45, 70354, 369, 1, -111.4123, 2521.159, -43.00659, 4.784949, 7200, 0, 0), -- Stabby Joe (Area: Deeprun Tram)
(@CGUID+46, 68992, 369, 1, -107.2923, 2477.497, -41.59616, 1.724435, 7200, 0, 0), -- Brawl Enthusiast (Area: Deeprun Tram)
(@CGUID+47, 68405, 369, 1, -115.9377, 2528.296, -30.94316, 4.794365, 7200, 0, 0), -- Brawl Enthusiast (Area: Deeprun Tram)
(@CGUID+48, 68768, 369, 1, -107.1775, 2469.11, -43.02339, 4.816863, 7200, 0, 0), -- "Numbers" Pfeiffer (Area: Deeprun Tram)
(@CGUID+49, 68541, 369, 1, -108.9182, 2465.788, -41.7275, 1.688493, 7200, 0, 0), -- "To Catch A Spy" - Controller Bunny (Area: Deeprun Tram)
(@CGUID+50, 68992, 369, 1, -111.289, 2478.452, -43.02339, 1.660031, 7200, 0, 0), -- Brawl Enthusiast (Area: Deeprun Tram)
(@CGUID+51, 68526, 369, 1, -107.7167, 2464.034, -43.02339, 1.513651, 7200, 0, 0), -- Barkeep Townsley (Area: Deeprun Tram)
(@CGUID+52, 68405, 369, 1, -115.428, 2476.831, -43.02339, 1.412076, 7200, 0, 0), -- Brawl Enthusiast (Area: Deeprun Tram) (possible waypoints or random movement)
(@CGUID+53, 67559, 369, 1, -120.3602, 2498.904, -49.03749, 1.610651, 7200, 0, 0), -- Center of Arena (Area: Deeprun Tram)
(@CGUID+54, 68792, 369, 1, -117.8844, 2525.327, -43.0252, 0, 7200, 0, 0), -- Lidiya Peyton (Area: Deeprun Tram)
(@CGUID+55, 41200, 369, 1, -122.3594, 2499.679, -49.02588, 6.281145, 7200, 0, 0), -- Generic Bunny - PRK (Area: Deeprun Tram)
(@CGUID+56, 68406, 369, 1, -123.4395, 2476.39, -43.02323, 1.289963, 7200, 0, 0), -- Brawl Enthusiast (Area: Deeprun Tram)
(@CGUID+57, 68992, 369, 1, -128.1297, 2522.312, -43.0252, 4.925224, 7200, 0, 0), -- Brawl Enthusiast (Area: Deeprun Tram)
(@CGUID+58, 70719, 369, 1, -129.2251, 2546.816, -28.64184, 4.700079, 7200, 0, 0), -- Mozzle Gearbeer (Area: Deeprun Tram)
(@CGUID+59, 68408, 369, 1, -119.6542, 2543.874, -29.51023, 4.66066, 7200, 0, 0), -- Bizmo's Brawlpub Bouncer (Area: Deeprun Tram) (Auras: 134909 - Guard Area Trigger)
(@CGUID+60, 68535, 369, 1, -124.0146, 2470.271, -43.02339, 4.654057, 7200, 0, 0), -- Zoe Mae (Area: Deeprun Tram)
(@CGUID+61, 68799, 369, 1, -133.157, 2522.6, -43.1086, 5.253441, 7200, 0, 0), -- Sniffy Pete (Area: Deeprun Tram)
(@CGUID+62, 70721, 369, 1, -138.4244, 2531.526, -29.42594, 5.201118, 7200, 0, 0), -- Auriella Giggysprock (Area: Deeprun Tram)
(@CGUID+63, 70723, 369, 1, -138.8784, 2553.276, -29.51023, 1.654117, 7200, 0, 0), -- Dame Jesepha (Area: Deeprun Tram)
(@CGUID+64, 68408, 369, 1, -140.8107, 2543.777, -29.51023, 4.763262, 7200, 0, 0), -- Bizmo's Brawlpub Bouncer (Area: Deeprun Tram) (Auras: 134909 - Guard Area Trigger)
(@CGUID+65, 68406, 369, 1, -147.5056, 2530.823, -29.45766, 5.258637, 7200, 0, 0), -- Brawl Enthusiast (Area: Deeprun Tram)
(@CGUID+66, 68539, 369, 1, -123.2527, 2468.814, -43.02339, 4.693232, 7200, 0, 0), -- Tasha Windpaw (Area: Deeprun Tram) (Auras: 135042 - Wearing A Silly Hat)
(@CGUID+67, 68992, 369, 1, -135.8501, 2520.722, -43.02504, 4.998402, 7200, 0, 0), -- Brawl Enthusiast (Area: Deeprun Tram)
(@CGUID+68, 70720, 369, 1, -140.3198, 2531.583, -29.43665, 5.252556, 7200, 0, 0), -- Kreeg O'Lalley (Area: Deeprun Tram)
(@CGUID+69, 68406, 369, 1, -135.3807, 2478.33, -41.82138, 0.4567683, 7200, 0, 0), -- Brawl Enthusiast (Area: Deeprun Tram)
(@CGUID+70, 68405, 369, 1, -137.7543, 2476.543, -43.02323, 0.8270133, 7200, 0, 0), -- Brawl Enthusiast (Area: Deeprun Tram)
(@CGUID+71, 68992, 369, 1, -147.7791, 2492.552, -43.12021, 0.06981317, 7200, 0, 0), -- Brawl Enthusiast (Area: Deeprun Tram)
(@CGUID+72, 68405, 369, 1, -148.0988, 2486.217, -43.09425, 0.4335296, 7200, 0, 0), -- Brawl Enthusiast (Area: Deeprun Tram)
(@CGUID+73, 68408, 369, 1, -146.7061, 2520.218, -43.04026, 2.367301, 7200, 0, 0), -- Bizmo's Brawlpub Bouncer (Area: Deeprun Tram) (Auras: 134909 - Guard Area Trigger)
(@CGUID+74, 68994, 369, 1, -147.2167, 2488.962, -43.06815, 0.3635806, 7200, 0, 0), -- Brawl Enthusiast (Area: Deeprun Tram)
(@CGUID+75, 68406, 369, 1, -147.3227, 2512.465, -43.07458, 6.069045, 7200, 0, 0), -- Brawl Enthusiast (Area: Deeprun Tram)
(@CGUID+76, 68994, 369, 1, -147.2851, 2491.248, -43.07172, 0.2907128, 7200, 0, 0), -- Brawl Enthusiast (Area: Deeprun Tram)
(@CGUID+77, 68406, 369, 1, -147.6912, 2490.127, -43.09228, 0.3222111, 7200, 0, 0), -- Brawl Enthusiast (Area: Deeprun Tram)
(@CGUID+78, 68796, 369, 1, -133.553, 2465.56, -43.10672, 0.07545592, 7200, 0, 0), -- Brom Ironboot (Area: Deeprun Tram) (Auras: 32951 - Sleeping Sleep)
(@CGUID+79, 68797, 369, 1, -134.0696, 2467.511, -43.10672, 0.1178655, 7200, 0, 0), -- Babby Ironboot (Area: Deeprun Tram) (Auras: 32951 - Sleeping Sleep) (possible waypoints or random movement)
(@CGUID+80, 68408, 369, 1, -146.3822, 2478.488, -43.02087, 4.011124, 7200, 0, 0), -- Bizmo's Brawlpub Bouncer (Area: Deeprun Tram) (Auras: 134909 - Guard Area Trigger)
(@CGUID+81, 68764, 369, 1, -146.3028, 2529.885, -43.02577, 4.902921, 7200, 0, 0), -- Willard "Bubbles" Wilcox (Area: Deeprun Tram)
(@CGUID+82, 68406, 369, 1, -146.6423, 2475.746, -43.10672, 5.603979, 7200, 0, 0), -- Brawl Enthusiast (Area: Deeprun Tram)
(@CGUID+83, 64367, 369, 1, -121.3079, 2499.617, -51.52943, 0, 7200, 0, 0), -- Invisible Man (Area: Bizmo's Brawlpub)
(@CGUID+84, 10942, 369, 1, 75.55157, 1339.963, -117.9171, 1.745329, 7200, 0, 0), -- Nessy (Area: 0) (Auras: 3417 - Thrash)
(@CGUID+85, 5186, 369, 1, -112.5415, 1154.451, -119.3451, 1.842971, 7200, 0, 0), -- Basking Shark (Area: 0)
(@CGUID+86, 10956, 369, 1, 49.28621, 1190.869, -121.3143, 5.759336, 7200, 0, 0), -- Naga Siren (Area: 0) (possible waypoints or random movement)
(@CGUID+87, 12997, 369, 1, -19.63116, 40.07523, -4.297364, 4.799655, 7200, 0, 0), -- Monty (Area: 0)
(@CGUID+88, 13016, 369, 1, -72.91493, 28.83738, -4.295185, 4.817047, 7200, 5, 1), -- Deeprun Rat (Area: 0)
(@CGUID+89, 13016, 369, 1, -48.21173, 83.58146, -13.86341, 4.895867, 7200, 5, 1), -- Deeprun Rat (Area: 0)
(@CGUID+90, 13016, 369, 1, -74.56241, 26.27987, -4.296764, 1.524805, 7200, 5, 1), -- Deeprun Rat (Area: 0)
(@CGUID+91, 13016, 369, 1, -64.81646, 9.109329, -4.298093, 2.861342, 7200, 5, 1), -- Deeprun Rat (Area: 0)
(@CGUID+92, 13016, 369, 1, -46.58396, 50.17245, -13.86341, 1.715754, 7200, 5, 1), -- Deeprun Rat (Area: 0)
(@CGUID+93, 13016, 369, 1, -57.21196, -21.82399, -4.297354, 5.160522, 7200, 5, 1), -- Deeprun Rat (Area: 0)
(@CGUID+94, 13016, 369, 1, -43.35949, -36.59221, -4.297349, 2.571393, 7200, 5, 1), -- Deeprun Rat (Area: 0)
(@CGUID+95, 13016, 369, 1, -69.88953, -16.39119, -4.297355, 5.97014, 7200, 5, 1), -- Deeprun Rat (Area: 0)
(@CGUID+96, 13016, 369, 1, 25.99659, 8.834719, -4.297348, 5.974719, 7200, 5, 1), -- Deeprun Rat (Area: 0)
(@CGUID+97, 13016, 369, 1, 2.777291, 58.8372, -13.86342, 3.297968, 7200, 5, 1), -- Deeprun Rat (Area: 0)
(@CGUID+98, 14041, 369, 1, 25.26379, 14.66779, -4.29735, 0.02318603, 7200, 0, 0), -- Haggle (Area: 0) (possible waypoints or random movement)
(@CGUID+99, 13016, 369, 1, -45.03532, -14.37037, -13.86343, 1.545782, 7200, 5, 1), -- Deeprun Rat (Area: 0)
(@CGUID+100, 13016, 369, 1, 5.721666, 86.90855, -13.86341, 4.284974, 7200, 5, 1), -- Deeprun Rat (Area: 0)
(@CGUID+101, 13016, 369, 1, 20.23471, 24.19788, -4.287271, 2.203791, 7200, 5, 1), -- Deeprun Rat (Area: 0)
(@CGUID+102, 13016, 369, 1, 31.22039, -4.568573, -4.297352, 4.505353, 7200, 5, 1), -- Deeprun Rat (Area: 0)
(@CGUID+103, 13016, 369, 1, 29.57163, -19.09113, -4.297352, 1.515674, 7200, 5, 1), -- Deeprun Rat (Area: 0)
(@CGUID+104, 5186, 369, 1, 88.33257, 1046.559, -122.219, 1.076333, 7200, 0, 0), -- Basking Shark (Area: 0)
(@CGUID+105, 14121, 369, 1, 32.48093, 1253.982, -123.7761, 1.58335, 7200, 0, 0), -- Deeprun Diver (Area: 0) (Auras: 22431 - Tag: Bubbles)
(@CGUID+106, 10942, 369, 1, -113.8064, 1254.373, -123.0315, 0.541052, 7200, 0, 0), -- Nessy (Area: 0) (Auras: 3417 - Thrash)
(@CGUID+107, 5186, 369, 1, 73.59551, 1359.462, -119.6585, 2.401082, 7200, 0, 0), -- Basking Shark (Area: 0)
(@CGUID+108, 10942, 369, 1, 54.22202, 1148.91, -120.5259, 3.236281, 7200, 0, 0), -- Nessy (Area: 0) (Auras: 3417 - Thrash)
(@CGUID+109, 10942, 369, 1, -113.8064, 1254.373, -123.0315, 0.541052, 7200, 0, 0), -- Nessy (Area: 0) (Auras: 3417 - Thrash)
(@CGUID+110, 14121, 369, 1, 68.96642, 1107.01, -121.1463, 1.448623, 7200, 0, 0); -- Deeprun Diver (Area: 0) (Auras: 22431 - Tag: Bubbles)
DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+196;
INSERT INTO `gameobject` (`guid`, `id`, `map`, `spawnMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`) VALUES
(@OGUID+0, 218240, 369, 1, 39.73352, 2508.677, -4.294677, 3.141593, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+1, 218241, 369, 1, 39.82929, 2514.314, -4.294678, 3.141593, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+2, 218242, 369, 1, 39.70155, 2501.759, -4.294677, 3.063024, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+3, 218243, 369, 1, 39.70155, 2469.287, -4.294677, 3.063024, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+4, 218244, 369, 1, 39.73352, 2476.204, -4.294677, 3.141593, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+5, 218245, 369, 1, 39.82929, 2481.842, -4.294678, 3.141593, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+6, 218262, 369, 1, -19.9828, 2513.025, -4.294851, 3.141593, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+7, 218263, 369, 1, -20.07856, 2507.387, -4.294851, 3.141593, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+8, 218264, 369, 1, -20.11053, 2500.469, -4.294851, 3.063024, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+9, 218265, 369, 1, -20.66589, 2474.819, -4.294851, 3.141593, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+10, 218266, 369, 1, -20.57011, 2480.457, -4.294851, 3.141593, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+11, 218267, 369, 1, -20.69785, 2467.902, -4.294851, 3.063024, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+12, 218268, 369, 1, -17.70583, 2473.837, -4.294851, 0, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+13, 218269, 369, 1, -17.8016, 2468.2, -4.294851, 0, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+14, 218270, 369, 1, -17.01946, 2513.227, -4.29485, 6.204646, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+15, 218271, 369, 1, -17.1472, 2500.672, -4.294851, 0, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+16, 218230, 369, 1, 23.66657, 2511.292, -4.294677, 3.141593, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+17, 218231, 369, 1, 23.34438, 2507.955, -4.294676, 3.141593, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+18, 218203, 369, 1, 4.580645, 28.20966, 7.011068, 1.570796, 0, 0, 1, -4.371139E-08, 7200, 255, 24), -- 0 (Area: Deeprun Tram)
(@OGUID+19, 218232, 369, 1, 23.49342, 2504.603, -4.294677, 3.063024, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+20, 218233, 369, 1, 23.34438, 2475.57, -4.294677, 3.141593, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+21, 218234, 369, 1, 23.49342, 2472.218, -4.294677, 3.063024, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+22, 218235, 369, 1, 23.66658, 2478.907, -4.294677, 3.141593, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+23, 218236, 369, 1, 20.55386, 2501.279, -4.294677, 2.932139, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+24, 218237, 369, 1, 20.75057, 2514.581, -4.294677, 3.220161, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+25, 218238, 369, 1, 20.75058, 2481.732, -4.294677, 3.220161, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+26, 218239, 369, 1, 20.55387, 2468.431, -4.294677, 2.932139, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+27, 218208, 369, 1, 4.498832, -11.34751, 7.011068, 4.71239, 0, 0, 1, -4.371139E-08, 7200, 255, 24), -- 0 (Area: Deeprun Tram)
(@OGUID+28, 218204, 369, 1, 4.528066, 8.435292, 7.011068, 1.570796, 0, 0, 1, -4.371139E-08, 7200, 255, 24), -- 0 (Area: Deeprun Tram)
(@OGUID+29, 218272, 369, 1, -17.05142, 2506.31, -4.29485, 0, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+30, 218273, 369, 1, -17.67386, 2480.754, -4.294851, 6.204646, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+31, 218246, 369, 1, -64.48874, 2504.563, -4.294677, 0, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+32, 218247, 369, 1, -64.16654, 2507.901, -4.294676, 0, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+33, 218248, 369, 1, -64.31558, 2511.252, -4.294677, 6.204646, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+34, 218249, 369, 1, -63.73218, 2475.644, -4.294677, 0, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+35, 218250, 369, 1, -63.88121, 2478.996, -4.294677, 6.204646, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+36, 218251, 369, 1, -64.05437, 2472.306, -4.294677, 0, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+37, 218252, 369, 1, -61.37602, 2514.576, -4.294676, 6.073748, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+38, 218253, 369, 1, -61.57273, 2501.275, -4.294676, 0.07854, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+39, 218254, 369, 1, -61.13838, 2469.482, -4.294677, 0.07854, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+40, 218255, 369, 1, -60.94166, 2482.783, -4.294677, 6.073748, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+41, 218259, 369, 1, -80.64693, 2480.339, -4.294677, 6.204646, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+42, 218260, 369, 1, -80.6789, 2473.422, -4.294677, 0, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+43, 218261, 369, 1, -80.77467, 2467.784, -4.294678, 0, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+44, 218336, 369, 1, -71.31967, 2469.101, -42.869, 2.35619, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+45, 218337, 369, 1, -71.29236, 2474.231, -42.84547, 3.926991, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+46, 218338, 369, 1, -74.48042, 2475.56, -42.8726, 4.71239, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+47, 218339, 369, 1, -74.30511, 2482.061, -42.8726, 1.570796, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+48, 218341, 369, 1, -71.66871, 2483.934, -42.79978, 2.44346, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+49, 218342, 369, 1, -71.60806, 2487.854, -42.79978, 3.839725, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+50, 218344, 369, 1, -70.35074, 2500.099, -42.8726, 3.141593, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+51, 218345, 369, 1, -71.56815, 2497.768, -42.86273, 2.35619, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+52, 218334, 369, 1, -74.32562, 2467.829, -42.8726, 1.570796, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+53, 218335, 369, 1, -70.21131, 2471.709, -42.8726, 3.141593, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+54, 218340, 369, 1, -74.48042, 2489.804, -42.8726, 4.71239, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+55, 218346, 369, 1, -71.56815, 2502.425, -42.84547, 3.926991, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+56, 218256, 369, 1, -80.56744, 2507, -4.294678, 0, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+57, 218257, 369, 1, -80.66321, 2501.362, -4.294678, 0, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+58, 218258, 369, 1, -80.53547, 2513.917, -4.294677, 6.204646, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+59, 218343, 369, 1, -74.30511, 2496.409, -42.8726, 1.570796, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+60, 218347, 369, 1, -74.48042, 2503.618, -42.8726, 4.71239, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+61, 218348, 369, 1, -74.30511, 2510.373, -42.8726, 1.570796, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+62, 218349, 369, 1, -74.48042, 2517.582, -42.8726, 4.71239, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+63, 218350, 369, 1, -71.92816, 2512.242, -42.79978, 2.44346, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+64, 218351, 369, 1, -71.886, 2515.754, -42.79978, 3.839725, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+65, 220360, 369, 1, -96.89163, 2478.907, -43.10672, 4.717134, 0, 0, 0, 1, 7200, 255, 1), -- Remote Viewing Console (Area: Deeprun Tram)
(@OGUID+66, 218332, 369, 1, -95.01887, 2464.429, -43.10918, 3.054327, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+67, 218333, 369, 1, -94.87846, 2458.042, -43.16341, 3.141593, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+68, 218331, 369, 1, -105.69, 2469.067, -43.10918, 4.625124, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+69, 218207, 369, 1, -45.39338, 2472.931, 6.988598, 1.570796, 0, 0, 1, -4.371139E-08, 7200, 255, 24), -- 0 (Area: Deeprun Tram)
(@OGUID+70, 218205, 369, 1, -45.40052, 2492.792, 6.988598, 1.570796, 0, 0, 1, -4.371139E-08, 7200, 255, 24), -- 0 (Area: Deeprun Tram)
(@OGUID+71, 218206, 369, 1, -45.40074, 2512.148, 6.988598, 1.570796, 0, 0, 1, -4.371139E-08, 7200, 255, 24), -- 0 (Area: Deeprun Tram)
(@OGUID+72, 218366, 369, 1, -103.7942, 2521.406, -43.16342, 3.141593, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+73, 218361, 369, 1, -108.6291, 2549.7, -29.53149, 3.141593, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+74, 218363, 369, 1, -110.5395, 2552.282, -29.45867, 4.01426, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+75, 218364, 369, 1, -114.3652, 2552.402, -29.45867, 5.410522, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+76, 218367, 369, 1, -108.0164, 2521.269, -43.10919, 6.195921, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+77, 218319, 369, 1, -114.9488, 2531.119, -43.16342, 3.141593, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+78, 218321, 369, 1, -106.7227, 2530.981, -43.10919, 6.195921, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+79, 218322, 369, 1, -102.5006, 2531.119, -43.16342, 3.141593, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+80, 218370, 369, 1, -115.3981, 2521.104, -43.10919, 3.054327, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+81, 218330, 369, 1, -110.2254, 2468.849, -43.16341, 4.712392, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+82, 218329, 369, 1, -114.9488, 2468.849, -43.16341, 4.712392, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+83, 218365, 369, 1, -119.6202, 2520.967, -43.16342, 0, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+84, 218328, 369, 1, -119.7294, 2468.745, -43.10918, 4.625124, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+85, 220360, 369, 1, -121.4181, 2545.575, -29.59357, 3.132858, 0, 0, 0, 1, 7200, 255, 1), -- Remote Viewing Console (Area: Deeprun Tram)
(@OGUID+86, 218352, 369, 1, -133.5216, 2541.906, -29.50879, 1.483528, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+87, 218353, 369, 1, -128.9862, 2541.802, -29.56301, 1.570796, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+88, 218354, 369, 1, -123.4175, 2547.911, -29.55851, 3.054327, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+89, 218355, 369, 1, -123.3138, 2551.838, -29.61273, 3.141593, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+90, 218362, 369, 1, -116.1536, 2549.525, -29.53149, 0, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+91, 218320, 369, 1, -126.5526, 2530.816, -43.10919, 3.054327, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+92, 218323, 369, 1, -119.1709, 2530.981, -43.10919, 6.195921, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+93, 218368, 369, 1, -127.8463, 2521.104, -43.10919, 3.054327, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+94, 220087, 369, 1, -128.901, 2546.624, -29.59357, 5.885697, 0, 0, 0, 1, 7200, 255, 1), -- Book Stack (Area: Deeprun Tram)
(@OGUID+95, 220360, 369, 1, -142.9507, 2520.156, -43.0725, 1.592488, 0, 0, 0, 1, 7200, 255, 1), -- Remote Viewing Console (Area: Deeprun Tram)
(@OGUID+96, 218356, 369, 1, -143.9925, 2549.628, -29.49515, 3.141593, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+97, 218318, 369, 1, -130.7747, 2530.679, -43.16342, 0, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+98, 218327, 369, 1, -125.339, 2468.849, -43.16341, 4.712392, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+99, 218369, 369, 1, -132.0684, 2520.967, -43.16342, 0, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+100, 218214, 369, 1, -138.2139, 2471.3, -43.10609, 4.127707, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+101, 218215, 369, 1, -141.3755, 2471.253, -43.10609, 5.401793, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+102, 218216, 369, 1, -139.5541, 2466.639, -43.10673, 1.570796, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+103, 218217, 369, 1, -137.1418, 2468.598, -43.10609, 2.940878, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+104, 218357, 369, 1, -147.8015, 2554.089, -29.49515, 4.71239, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+105, 218358, 369, 1, -145.2794, 2552.678, -29.34725, 3.926991, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+106, 218359, 369, 1, -150.3227, 2552.781, -29.46802, 5.497789, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+107, 218360, 369, 1, -151.6096, 2549.453, -29.49515, 0, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+108, 218324, 369, 1, -133.7215, 2463.137, -43.16341, 0, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+109, 218325, 369, 1, -133.6178, 2458.097, -43.10918, 6.195921, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+110, 218326, 369, 1, -130.3793, 2469.195, -43.10918, 4.625124, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+111, 218213, 369, 1, -140.3532, 2463.915, -43.10609, 3.900813, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+112, 218218, 369, 1, -141.942, 2468.055, -43.10609, 0.4363316, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+113, 218209, 369, 1, -144.8453, 2461.269, -43.10609, 0.1745321, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+114, 218210, 369, 1, -140.0449, 2460.966, -43.10673, 2.836158, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+115, 218211, 369, 1, -142.2138, 2459.56, -43.10674, 1.527163, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+116, 218212, 369, 1, -143.7642, 2464.378, -43.10609, 5.218536, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+117, 218219, 369, 1, -146.5631, 2466.862, -43.10674, 2.530723, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+118, 218220, 369, 1, -146.5619, 2469.745, -43.10609, 3.700098, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+119, 218221, 369, 1, -151.3983, 2467.785, -43.10673, 6.265733, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+120, 218222, 369, 1, -149.2733, 2465.646, -43.10673, 1.596976, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+121, 218223, 369, 1, -150.1574, 2470.702, -43.10609, 5.218536, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: Deeprun Tram)
(@OGUID+122, 220360, 369, 1, -138.1376, 2456.681, -43.1059, 1.546259, 0, 0, 0, 1, 7200, 255, 1), -- Remote Viewing Console (Area: Deeprun Tram)
(@OGUID+123, 179264, 369, 1, -79.30329, 1211.732, -122.8182, 0.4014249, 0, 0, 0, 1, 7200, 255, 1), -- Giant Clam (Area: 0)
(@OGUID+124, 178304, 369, 1, -22.5045, 44.43635, -4.297362, 1.291542, 0, 0, 0, 1, 7200, 255, 1), -- Box o' Squirrels (Area: 0)
(@OGUID+125, 208864, 369, 1, -18.80994, 28.25147, -4.297366, 0, 0, 0, 0, 1, 7200, 255, 1), -- Rat Trap (Area: 0)
(@OGUID+126, 178304, 369, 1, -16.77179, 44.47802, -4.297363, 1.832595, 0, 0, 0, 1, 7200, 255, 1), -- Box o' Squirrels (Area: 0)
(@OGUID+127, 208864, 369, 1, -81.32017, 22.30112, -4.297349, 0, 0, 0, 0, 1, 7200, 255, 1), -- Rat Trap (Area: 0)
(@OGUID+128, 218306, 369, 1, -17.0512, 24.52901, -4.294851, 0, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+129, 218307, 369, 1, -17.14698, 18.89099, -4.294851, 0, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+130, 218308, 369, 1, -17.01924, 31.44611, -4.294851, 6.204646, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+131, 208864, 369, 1, -77.95713, 45.4724, -4.297347, 0, 0, 0, 0, 1, 7200, 255, 1), -- Rat Trap (Area: 0)
(@OGUID+132, 218315, 369, 1, -20.11032, 18.68863, -4.294851, 3.063024, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+133, 218316, 369, 1, -20.07835, 25.60595, -4.294851, 3.141593, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+134, 218317, 369, 1, -19.98258, 31.24376, -4.294851, 3.141593, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+135, 178304, 369, 1, -19.66363, 44.25616, -4.297363, 5.270896, 0, 0, 0, 1, 7200, 255, 1), -- Box o' Squirrels (Area: 0)
(@OGUID+136, 218277, 369, 1, -64.24798, 25.16312, -4.294851, 0, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+137, 218278, 369, 1, -64.39703, 28.51469, -4.29485, 6.204646, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+138, 218279, 369, 1, -64.57018, 21.82545, -4.294851, 0, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+139, 218282, 369, 1, -61.65417, 19.00144, -4.294851, 0.07854, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+140, 218283, 369, 1, -61.45748, 32.30244, -4.294851, 6.073748, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+141, 218287, 369, 1, -80.60516, 31.44611, -4.294851, 6.204646, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+142, 218288, 369, 1, -80.63712, 24.52901, -4.294851, 0, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+143, 218303, 369, 1, 39.74333, 20.39353, -4.294851, 3.063024, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+144, 208864, 369, 1, -63.69213, -15.59292, -4.297354, 0, 0, 0, 0, 1, 7200, 255, 1), -- Rat Trap (Area: 0)
(@OGUID+145, 208864, 369, 1, 9.727059, -23.84358, -13.86343, 0, 0, 0, 0, 1, 7200, 255, 1), -- Rat Trap (Area: 0)
(@OGUID+146, 208864, 369, 1, 21.24571, 17.08864, -4.29735, 0, 0, 0, 0, 1, 7200, 255, 1), -- Rat Trap (Area: 0)
(@OGUID+147, 208864, 369, 1, -0.5995102, 33.58908, -13.86343, 0, 0, 0, 0, 1, 7200, 255, 1), -- Rat Trap (Area: 0)
(@OGUID+148, 208864, 369, 1, 37.16822, 44.65622, -4.297347, 0, 0, 0, 0, 1, 7200, 255, 1), -- Rat Trap (Area: 0)
(@OGUID+149, 218304, 369, 1, 39.77528, 27.31064, -4.29485, 3.141593, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+150, 218305, 369, 1, 39.87106, 32.94865, -4.294852, 3.141593, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+151, 218309, 369, 1, -20.66567, -6.96157, -4.294851, 3.141593, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+152, 218310, 369, 1, -20.56989, -1.323543, -4.294851, 3.141593, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+153, 218311, 369, 1, -20.69763, -13.87867, -4.294851, 3.063024, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+154, 218312, 369, 1, -17.67365, -1.026118, -4.294851, 6.204646, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+155, 218313, 369, 1, -17.70562, -7.943435, -4.294851, 0, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+156, 218314, 369, 1, -17.80138, -13.58124, -4.294851, 0, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+157, 208864, 369, 1, -55.16456, -37.43731, -4.297352, 0, 0, 0, 0, 1, 7200, 255, 1), -- Rat Trap (Area: 0)
(@OGUID+158, 208864, 369, 1, 21.65013, -15.25156, -4.297355, 0, 0, 0, 0, 1, 7200, 255, 1), -- Rat Trap (Area: 0)
(@OGUID+159, 208864, 369, 1, -65.49454, -11.31814, -4.297354, 0, 0, 0, 0, 1, 7200, 255, 1), -- Rat Trap (Area: 0)
(@OGUID+160, 208864, 369, 1, -25.81312, -24.38962, -4.297369, 0, 0, 0, 0, 1, 7200, 255, 1), -- Rat Trap (Area: 0)
(@OGUID+161, 208864, 369, 1, 16.44149, 46.07506, -4.297347, 0, 0, 0, 0, 1, 7200, 255, 1), -- Rat Trap (Area: 0)
(@OGUID+162, 218274, 369, 1, -64.57018, -10.55954, -4.294851, 0, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+163, 218275, 369, 1, -64.24798, -7.221652, -4.29485, 0, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+164, 218276, 369, 1, -64.39702, -3.870082, -4.294851, 6.204646, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+165, 208864, 369, 1, -80.1594, -5.485014, -4.297352, 0, 0, 0, 0, 1, 7200, 255, 1), -- Rat Trap (Area: 0)
(@OGUID+166, 218280, 369, 1, -61.45747, -0.5463043, -4.29485, 6.073748, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+167, 218281, 369, 1, -61.65417, -13.84751, -4.294851, 0.07854, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+168, 208864, 369, 1, -62.29871, 0.4384706, -4.297353, 0, 0, 0, 0, 1, 7200, 255, 1), -- Rat Trap (Area: 0)
(@OGUID+169, 218284, 369, 1, -80.63712, -7.943434, -4.294851, 0, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+170, 218285, 369, 1, -80.73289, -13.58124, -4.294851, 0, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+171, 218286, 369, 1, -80.60516, -1.026123, -4.294851, 6.204646, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+172, 218289, 369, 1, -80.73289, 18.89098, -4.294851, 0, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+173, 208864, 369, 1, -18.22651, -5.197068, -4.297369, 0, 0, 0, 0, 1, 7200, 255, 1), -- Rat Trap (Area: 0)
(@OGUID+174, 218290, 369, 1, 23.58513, -3.829995, -4.29485, 3.141593, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+175, 218291, 369, 1, 23.26293, -7.167885, -4.29485, 3.141593, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+176, 218292, 369, 1, 23.41197, -10.51945, -4.294851, 3.063024, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+177, 218293, 369, 1, 22.82857, 25.08885, -4.294851, 3.141593, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+178, 218294, 369, 1, 22.97761, 21.73728, -4.29485, 3.063024, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+179, 218295, 369, 1, 23.15076, 28.42652, -4.29485, 3.141593, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+180, 218296, 369, 1, 20.47242, -13.84323, -4.29485, 2.932139, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+181, 218297, 369, 1, 20.66912, -0.5420112, -4.29485, 3.220161, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+182, 218298, 369, 1, 20.23477, 31.25052, -4.294851, 3.220161, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+183, 218299, 369, 1, 20.03805, 17.94952, -4.294851, 2.932139, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+184, 218300, 369, 1, 39.66383, -6.266836, -4.294851, 3.141593, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+185, 218301, 369, 1, 39.75959, -0.6290315, -4.294851, 3.141593, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+186, 218302, 369, 1, 39.63186, -13.18415, -4.294851, 3.063024, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Chair (Area: 0)
(@OGUID+187, 208864, 369, 1, 40.01941, -25.9875, -4.297345, 0, 0, 0, 0, 1, 7200, 255, 1), -- Rat Trap (Area: 0)
(@OGUID+188, 208864, 369, 1, 14.71833, -37.30925, -4.297353, 0, 0, 0, 0, 1, 7200, 255, 1), -- Rat Trap (Area: 0)
(@OGUID+189, 218226, 369, 1, 112.0717, 21.57919, -0.967929, 6.278823, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Doodad_DwarfSign_Fireworks01 (Area: 0)
(@OGUID+190, 218227, 369, 1, 109.3507, 16.21418, -4.294435, 0.8508465, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Brazier (Area: 0)
(@OGUID+191, 218228, 369, 1, 109.8475, 4.727702, -4.294435, 0.8508465, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Brazier (Area: 0)
(@OGUID+192, 218229, 369, 1, 112.3642, 5.079133, -4.357647, 0.8508465, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Mailbox (Area: 0)
(@OGUID+193, 218224, 369, 1, 146.9395, -6.104181, -3.154193, 2.412915, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Doodad_GnomeSign_Engineer01 (Area: 0)
(@OGUID+194, 218225, 369, 1, 146.4382, 27.88295, -0.142696, 3.878999, 0, 0, 1, -4.371139E-08, 7200, 255, 1), -- Doodad_DwarfSign_Alchemist01 (Area: 0)
(@OGUID+195, 179264, 369, 1, 37.43438, 1316.428, -121.9855, 3.839725, 0, 0, 0, 1, 7200, 255, 1), -- Giant Clam (Area: 0)
(@OGUID+196, 179345, 369, 1, 57.43581, 1206.985, -121.5893, 3.630291, 0, 0, 0, 1, 7200, 255, 1); -- Deeprun Chest (Area: 0)
@@ -0,0 +1,5 @@
--
SET @CGUID := 250016;
DELETE FROM creature WHERE `guid` = @CGUID;
INSERT INTO creature (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `PhaseId`, `PhaseGroup`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `VerifiedBuild`) VALUES
(@CGUID, 37024, 1, 0, 0, 1, 0, 0, 0, 0, -798.2708, -486.757, -32.19226, 1.623156, 120, 0, 0, 0, 0, 0, 0, 0, 0, 15354);
@@ -0,0 +1,2 @@
-- Make both quests 24812 & 24813 available to players: you must complete both quests to take next one, quest 24814.
UPDATE `quest_template_addon` SET `ExclusiveGroup`= -24812 WHERE `id` IN (24812, 24813);
@@ -0,0 +1,3 @@
DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_monk_surging_mist';
INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
(116694,'spell_monk_surging_mist');
@@ -0,0 +1,2 @@
--
UPDATE `creature_template` SET `flags_extra`=64 WHERE `entry` IN(53714, 57873, 58168, 60162, 60931, 65069);
@@ -0,0 +1,3 @@
DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_monk_surging_mist_glyphed';
INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
(123273,'spell_monk_surging_mist_glyphed');
@@ -0,0 +1,2 @@
--
UPDATE `creature_template` SET `npcflag`=`npcflag` &~2 WHERE `entry` IN (15294);
@@ -0,0 +1,2 @@
--
UPDATE `creature_template` SET `npcflag`=`npcflag` &~2 WHERE `entry` IN (15273, 15298);
@@ -0,0 +1,2 @@
--
DELETE FROM `creature_queststarter` WHERE `id` IN (3101,16521,16522);
@@ -0,0 +1,33 @@
-- Dark Siphon
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceGroup`=0 AND `SourceEntry`=165059;
INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
(13,1,165059,0,0,31,0,3,81556 ,0,0,"","Dark Siphon – Cast only on K'ure.");
-- Decimatus SAI
SET @ENTRY := 81989;
UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY;
DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY 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
(@ENTRY,0,0,0,11,0,100,0,0,0,0,0,11,169869,34,0,0,0,0,1,0,0,0,0,0,0,0,"Decimatus - On Respawn - Cast Transformation Sickness on Self (Need Core Handler for Spell)"),
(@ENTRY,0,1,0,0,0,100,0,9000,11000,9000,11000,11,174011,0,0,0,0,0,5,0,0,0,0,0,0,0,"Decimatus - In Combat - Cast Neutralize - Need Core Handler."),
(@ENTRY,0,2,0,0,0,100,0,27000,27000,27000,27000,11,174016,1,0,0,0,0,1,0,0,0,0,0,0,0,"Decimatus - In Combat - Cast Decimate.");
-- spell_gen_decimatus_transformation_sickness
DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_gen_decimatus_transformation_sickness';
INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
(169869,'spell_gen_decimatus_transformation_sickness');
-- spell_gen_azgalor_rain_of_fire_hellfire_citadel
DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_gen_azgalor_rain_of_fire_hellfire_citadel';
INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
(189549,'spell_gen_azgalor_rain_of_fire_hellfire_citadel');
-- spell_gen_mark_of_kazrogal_hellfire
DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_gen_mark_of_kazrogal_hellfire';
INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
(189512,'spell_gen_mark_of_kazrogal_hellfire');
-- spell_gen_anetheron_summon_towering_infernal
DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_gen_anetheron_summon_towering_infernal';
INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
(189491,'spell_gen_anetheron_summon_towering_infernal');
+21 -10
View File
@@ -46,19 +46,30 @@ char const* GitRevision::GetHotfixesDatabase()
return _HOTFIXES_DATABASE;
}
#define _PACKAGENAME "TrinityCore"
#if PLATFORM == PLATFORM_WINDOWS
# ifdef _WIN64
# define TRINITY_PLATFORM_STR "Win64"
# else
# define TRINITY_PLATFORM_STR "Win32"
# endif
#elif PLATFORM == PLATFORM_APPLE
# define TRINITY_PLATFORM_STR "MacOSX"
#elif PLATFORM == PLATFORM_INTEL
# define TRINITY_PLATFORM_STR "Intel"
#else // PLATFORM_UNIX
# define TRINITY_PLATFORM_STR "Unix"
#endif
#ifndef TRINITY_API_USE_DYNAMIC_LINKING
# define TRINITY_LINKAGE_TYPE_STR "Static"
#else
# define TRINITY_LINKAGE_TYPE_STR "Dynamic"
#endif
char const* GitRevision::GetFullVersion()
{
#if PLATFORM == PLATFORM_WINDOWS
# ifdef _WIN64
return _PACKAGENAME " rev. " VER_PRODUCTVERSION_STR " (Win64, " _BUILD_DIRECTIVE ")";
# else
return _PACKAGENAME " rev. " VER_PRODUCTVERSION_STR " (Win32, " _BUILD_DIRECTIVE ")";
# endif
#else
return _PACKAGENAME " rev. " VER_PRODUCTVERSION_STR " (Unix, " _BUILD_DIRECTIVE ")";
#endif
return "TrinityCore rev. " VER_PRODUCTVERSION_STR
" (" TRINITY_PLATFORM_STR ", " _BUILD_DIRECTIVE ", " TRINITY_LINKAGE_TYPE_STR ")";
}
char const* GitRevision::GetCompanyNameStr()
+54 -28
View File
@@ -17,11 +17,20 @@
*/
#include "EventProcessor.h"
#include "Errors.h"
EventProcessor::EventProcessor()
void BasicEvent::ScheduleAbort()
{
m_time = 0;
m_aborting = false;
ASSERT(IsRunning()
&& "Tried to scheduled the abortion of an event twice!");
m_abortState = AbortState::STATE_ABORT_SCHEDULED;
}
void BasicEvent::SetAborted()
{
ASSERT(!IsAborted()
&& "Tried to abort an already aborted event!");
m_abortState = AbortState::STATE_ABORTED;
}
EventProcessor::~EventProcessor()
@@ -39,55 +48,73 @@ void EventProcessor::Update(uint32 p_time)
while (((i = m_events.begin()) != m_events.end()) && i->first <= m_time)
{
// get and remove event from queue
BasicEvent* Event = i->second;
BasicEvent* event = i->second;
m_events.erase(i);
if (!Event->to_Abort)
if (event->IsRunning())
{
if (Event->Execute(m_time, p_time))
if (event->Execute(m_time, p_time))
{
// completely destroy event if it is not re-added
delete Event;
delete event;
}
continue;
}
else
if (event->IsAbortScheduled())
{
Event->Abort(m_time);
delete Event;
event->Abort(m_time);
// Mark the event as aborted
event->SetAborted();
}
if (event->IsDeletable())
{
delete event;
continue;
}
// Reschedule non deletable events to be checked at
// the next update tick
AddEvent(event, CalculateTime(1), false);
}
}
void EventProcessor::KillAllEvents(bool force)
{
// prevent event insertions
m_aborting = true;
// first, abort all existing events
for (EventList::iterator i = m_events.begin(); i != m_events.end();)
for (auto itr = m_events.begin(); itr != m_events.end();)
{
EventList::iterator i_old = i;
++i;
i_old->second->to_Abort = true;
i_old->second->Abort(m_time);
if (force || i_old->second->IsDeletable())
// Abort events which weren't aborted already
if (!itr->second->IsAborted())
{
delete i_old->second;
if (!force) // need per-element cleanup
m_events.erase (i_old);
itr->second->SetAborted();
itr->second->Abort(m_time);
}
// Skip non-deletable events when we are
// not forcing the event cancellation.
if (!force && !itr->second->IsDeletable())
{
++itr;
continue;
}
delete itr->second;
if (force)
++itr; // Clear the whole container when forcing
else
itr = m_events.erase(itr);
}
// fast clear event list (in force case)
if (force)
m_events.clear();
}
void EventProcessor::AddEvent(BasicEvent* Event, uint64 e_time, bool set_addtime)
{
if (set_addtime) Event->m_addTime = m_time;
if (set_addtime)
Event->m_addTime = m_time;
Event->m_execTime = e_time;
m_events.insert(std::pair<uint64, BasicEvent*>(e_time, Event));
}
@@ -96,4 +123,3 @@ uint64 EventProcessor::CalculateTime(uint64 t_offset) const
{
return(m_time + t_offset);
}
+26 -10
View File
@@ -20,20 +20,27 @@
#define __EVENTPROCESSOR_H
#include "Define.h"
#include <map>
class EventProcessor;
// Note. All times are in milliseconds here.
class TC_COMMON_API BasicEvent
{
friend class EventProcessor;
enum class AbortState : uint8
{
STATE_RUNNING,
STATE_ABORT_SCHEDULED,
STATE_ABORTED
};
public:
BasicEvent()
{
to_Abort = false;
m_addTime = 0;
m_execTime = 0;
}
: m_abortState(AbortState::STATE_RUNNING), m_addTime(0), m_execTime(0) { }
virtual ~BasicEvent() { } // override destructor to perform some actions on event removal
// this method executes when the event is triggered
@@ -45,8 +52,16 @@ class TC_COMMON_API BasicEvent
virtual void Abort(uint64 /*e_time*/) { } // this method executes when the event is aborted
bool to_Abort; // set by externals when the event is aborted, aborted events don't execute
// and get Abort call when deleted
// Aborts the event at the next update tick
void ScheduleAbort();
private:
void SetAborted();
bool IsRunning() const { return (m_abortState == AbortState::STATE_RUNNING); }
bool IsAbortScheduled() const { return (m_abortState == AbortState::STATE_ABORT_SCHEDULED); }
bool IsAborted() const { return (m_abortState == AbortState::STATE_ABORTED); }
AbortState m_abortState; // set by externals when the event is aborted, aborted events don't execute
// these can be used for time offset control
uint64 m_addTime; // time when the event was added to queue, filled by event handler
@@ -58,16 +73,17 @@ typedef std::multimap<uint64, BasicEvent*> EventList;
class TC_COMMON_API EventProcessor
{
public:
EventProcessor();
EventProcessor() : m_time(0) { }
~EventProcessor();
void Update(uint32 p_time);
void KillAllEvents(bool force);
void AddEvent(BasicEvent* Event, uint64 e_time, bool set_addtime = true);
uint64 CalculateTime(uint64 t_offset) const;
protected:
uint64 m_time;
EventList m_events;
bool m_aborting;
};
#endif
@@ -167,7 +167,7 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PrepareStatement(CHAR_REP_INVENTORY_ITEM, "REPLACE INTO character_inventory (guid, bag, slot, item) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
PrepareStatement(CHAR_REP_ITEM_INSTANCE, "REPLACE INTO item_instance (itemEntry, owner_guid, creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, upgradeId, battlePetSpeciesId, battlePetBreedData, battlePetLevel, battlePetDisplayId, bonusListIDs, guid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
PrepareStatement(CHAR_UPD_ITEM_INSTANCE, "UPDATE item_instance SET itemEntry = ?, owner_guid = ?, creatorGuid = ?, giftCreatorGuid = ?, count = ?, duration = ?, charges = ?, flags = ?, enchantments = ?, randomPropertyId = ?, durability = ?, playedTime = ?, text = ?, upgradeId = ?, battlePetSpeciesId = ?, battlePetBreedData = ?, battlePetLevel = ?, battlePetDisplayId = ?, bonusListIDs = ? WHERE guid = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_UPD_ITEM_INSTANCE_ON_LOAD, "UPDATE item_instance SET duration = ?, flags = ?, durability = ? WHERE guid = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_UPD_ITEM_INSTANCE_ON_LOAD, "UPDATE item_instance SET duration = ?, flags = ?, durability = ?, upgradeId = ? WHERE guid = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_DEL_ITEM_INSTANCE, "DELETE FROM item_instance WHERE guid = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_DEL_ITEM_INSTANCE_BY_OWNER, "DELETE FROM item_instance WHERE owner_guid = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_INS_ITEM_INSTANCE_GEMS, "INSERT INTO item_instance_gems (itemGuid, gemItemId1, gemItemId2, gemItemId3) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
@@ -481,6 +481,10 @@ void HotfixDatabaseConnection::DoPrepareStatements()
// ItemSpecOverride.db2
PrepareStatement(HOTFIX_SEL_ITEM_SPEC_OVERRIDE, "SELECT ID, ItemID, SpecID FROM item_spec_override ORDER BY ID DESC", CONNECTION_SYNCH);
// ItemUpgrade.db2
PrepareStatement(HOTFIX_SEL_ITEM_UPGRADE, "SELECT ID, CurrencyCost, PrevItemUpgradeID, CurrencyID, ItemUpgradePathID, ItemLevelBonus"
" FROM item_upgrade ORDER BY ID DESC", CONNECTION_SYNCH);
// ItemXBonusTree.db2
PrepareStatement(HOTFIX_SEL_ITEM_X_BONUS_TREE, "SELECT ID, ItemID, BonusTreeID FROM item_x_bonus_tree ORDER BY ID DESC", CONNECTION_SYNCH);
@@ -623,6 +627,9 @@ void HotfixDatabaseConnection::DoPrepareStatements()
"RarePropertiesPoints5, UncommonPropertiesPoints1, UncommonPropertiesPoints2, UncommonPropertiesPoints3, UncommonPropertiesPoints4, "
"UncommonPropertiesPoints5 FROM rand_prop_points ORDER BY ID DESC", CONNECTION_SYNCH);
// RulesetItemUpgrade.db2
PrepareStatement(HOTFIX_SEL_RULESET_ITEM_UPGRADE, "SELECT ID, ItemID, ItemUpgradeID FROM ruleset_item_upgrade ORDER BY ID DESC", CONNECTION_SYNCH);
// ScalingStatDistribution.db2
PrepareStatement(HOTFIX_SEL_SCALING_STAT_DISTRIBUTION, "SELECT ID, ItemLevelCurveID, MinLevel, MaxLevel FROM scaling_stat_distribution"
" ORDER BY ID DESC", CONNECTION_SYNCH);
@@ -635,7 +642,7 @@ void HotfixDatabaseConnection::DoPrepareStatements()
// SkillLineAbility.db2
PrepareStatement(HOTFIX_SEL_SKILL_LINE_ABILITY, "SELECT ID, SpellID, RaceMask, SupercedesSpell, Unknown703, SkillLine, MinSkillLineRank, "
"TrivialSkillLineRankHigh, TrivialSkillLineRankLow, UniqueBit, TradeSkillCategoryID, AquireMethod, NumSkillUps, ClassMask"
"TrivialSkillLineRankHigh, TrivialSkillLineRankLow, UniqueBit, TradeSkillCategoryID, AcquireMethod, NumSkillUps, ClassMask"
" FROM skill_line_ability ORDER BY ID DESC", CONNECTION_SYNCH);
// SkillRaceClassInfo.db2
@@ -264,6 +264,8 @@ enum HotfixDatabaseStatements
HOTFIX_SEL_ITEM_SPEC_OVERRIDE,
HOTFIX_SEL_ITEM_UPGRADE,
HOTFIX_SEL_ITEM_X_BONUS_TREE,
HOTFIX_SEL_KEY_CHAIN,
@@ -335,6 +337,8 @@ enum HotfixDatabaseStatements
HOTFIX_SEL_RAND_PROP_POINTS,
HOTFIX_SEL_RULESET_ITEM_UPGRADE,
HOTFIX_SEL_SCALING_STAT_DISTRIBUTION,
HOTFIX_SEL_SKILL_LINE,
@@ -85,7 +85,7 @@ bool AchievementMgr::CanUpdateCriteriaTree(Criteria const* criteria, CriteriaTre
return false;
}
return true;
return CriteriaHandler::CanUpdateCriteriaTree(criteria, tree, referencePlayer);
}
bool AchievementMgr::CanCompleteCriteriaTree(CriteriaTree const* tree)
@@ -935,37 +935,80 @@ bool CriteriaHandler::IsCompletedCriteriaTree(CriteriaTree const* tree)
return false;
uint64 requiredCount = tree->Entry->Amount;
uint64 completedCount = 0;
uint32 op = tree->Entry->Operator;
bool hasAll = true;
// Check criteria we depend on first
for (CriteriaTree const* node : tree->Children)
switch (tree->Entry->Operator)
{
if (IsCompletedCriteriaTree(node))
++completedCount;
else
hasAll = false;
if (op & CRITERIA_TREE_OPERATOR_ANY && completedCount >= requiredCount)
case CRITERIA_TREE_OPERATOR_SINGLE:
return tree->Criteria && IsCompletedCriteria(tree->Criteria, requiredCount);
case CRITERIA_TREE_OPERATOR_SINGLE_NOT_COMPLETED:
return !tree->Criteria || !IsCompletedCriteria(tree->Criteria, requiredCount);
case CRITERIA_TREE_OPERATOR_ALL:
for (CriteriaTree const* node : tree->Children)
if (!IsCompletedCriteriaTree(node))
return false;
return true;
case CRITERIA_TREE_OPERAROR_SUM_CHILDREN:
{
if (!tree->Criteria)
return true;
break;
uint64 progress = 0;
CriteriaMgr::WalkCriteriaTree(tree, [this, &progress](CriteriaTree const* criteriaTree)
{
if (criteriaTree->Criteria)
if (CriteriaProgress const* criteriaProgress = GetCriteriaProgress(criteriaTree->Criteria))
progress += criteriaProgress->Counter;
});
return progress >= requiredCount;
}
case CRITERIA_TREE_OPERATOR_MAX_CHILD:
{
uint64 progress = 0;
CriteriaMgr::WalkCriteriaTree(tree, [this, &progress](CriteriaTree const* criteriaTree)
{
if (criteriaTree->Criteria)
if (CriteriaProgress const* criteriaProgress = GetCriteriaProgress(criteriaTree->Criteria))
if (criteriaProgress->Counter > progress)
progress = criteriaProgress->Counter;
});
return progress >= requiredCount;
}
case CRITERIA_TREE_OPERATOR_COUNT_DIRECT_CHILDREN:
{
uint64 progress = 0;
for (CriteriaTree const* node : tree->Children)
if (node->Criteria)
if (CriteriaProgress const* criteriaProgress = GetCriteriaProgress(node->Criteria))
if (criteriaProgress->Counter >= 1)
if (++progress >= requiredCount)
return true;
return false;
}
case CRITERIA_TREE_OPERATOR_ANY:
{
uint64 progress = 0;
for (CriteriaTree const* node : tree->Children)
if (IsCompletedCriteriaTree(node))
if (++progress >= requiredCount)
return true;
return false;
}
default:
break;
}
if (op & CRITERIA_TREE_OPERATOR_ANY && completedCount < requiredCount)
return false;
}
bool CriteriaHandler::CanUpdateCriteriaTree(Criteria const* criteria, CriteriaTree const* tree, Player* referencePlayer) const
{
if ((tree->Entry->Flags & CRITERIA_TREE_FLAG_HORDE_ONLY && referencePlayer->GetTeam() != HORDE) ||
(tree->Entry->Flags & CRITERIA_TREE_FLAG_ALLIANCE_ONLY && referencePlayer->GetTeam() != ALLIANCE))
{
TC_LOG_TRACE("criteria", "CriteriaHandler::CanUpdateCriteriaTree: (Id: %u Type %s CriteriaTree %u) Wrong faction",
criteria->ID, CriteriaMgr::GetCriteriaTypeString(criteria->Entry->Type), tree->Entry->ID);
return false;
}
if (op & CRITERIA_TREE_OPERATOR_ALL && !hasAll)
return false;
if (!tree->Criteria)
return true;
return IsCompletedCriteria(tree->Criteria, requiredCount);
return true;
}
bool CriteriaHandler::CanCompleteCriteriaTree(CriteriaTree const* /*tree*/)
@@ -273,7 +273,7 @@ protected:
virtual void SendCriteriaProgressRemoved(uint32 criteriaId) = 0;
bool IsCompletedCriteriaTree(CriteriaTree const* tree);
virtual bool CanUpdateCriteriaTree(Criteria const* criteria, CriteriaTree const* tree, Player* referencePlayer) const = 0;
virtual bool CanUpdateCriteriaTree(Criteria const* criteria, CriteriaTree const* tree, Player* referencePlayer) const;
virtual bool CanCompleteCriteriaTree(CriteriaTree const* tree);
virtual void CompletedCriteriaTree(CriteriaTree const* tree, Player* referencePlayer) = 0;
virtual void AfterCriteriaTreeUpdate(CriteriaTree const* /*tree*/, Player* /*referencePlayer*/) { }
@@ -1870,7 +1870,7 @@ uint32 Battleground::GetAlivePlayersCountByTeam(uint32 Team) const
if (itr->second.Team == Team)
{
Player* player = ObjectAccessor::FindPlayer(itr->first);
if (player && player->IsAlive() && !player->HasByteFlag(UNIT_FIELD_BYTES_2, 3, FORM_SPIRITOFREDEMPTION))
if (player && player->IsAlive() && !player->HasByteFlag(UNIT_FIELD_BYTES_2, 3, FORM_SPIRIT_OF_REDEMPTION))
++count;
}
}
+16
View File
@@ -122,6 +122,7 @@ DB2Storage<ItemSetSpellEntry> sItemSetSpellStore("ItemSetSpell
DB2SparseStorage<ItemSparseEntry> sItemSparseStore("Item-sparse.db2", ItemSparseMeta::Instance(), HOTFIX_SEL_ITEM_SPARSE);
DB2Storage<ItemSpecEntry> sItemSpecStore("ItemSpec.db2", ItemSpecMeta::Instance(), HOTFIX_SEL_ITEM_SPEC);
DB2Storage<ItemSpecOverrideEntry> sItemSpecOverrideStore("ItemSpecOverride.db2", ItemSpecOverrideMeta::Instance(), HOTFIX_SEL_ITEM_SPEC_OVERRIDE);
DB2Storage<ItemUpgradeEntry> sItemUpgradeStore("ItemUpgrade.db2", ItemUpgradeMeta::Instance(), HOTFIX_SEL_ITEM_UPGRADE);
DB2Storage<ItemXBonusTreeEntry> sItemXBonusTreeStore("ItemXBonusTree.db2", ItemXBonusTreeMeta::Instance(), HOTFIX_SEL_ITEM_X_BONUS_TREE);
DB2Storage<KeyChainEntry> sKeyChainStore("KeyChain.db2", KeyChainMeta::Instance(), HOTFIX_SEL_KEY_CHAIN);
DB2Storage<LfgDungeonsEntry> sLfgDungeonsStore("LfgDungeons.db2", LfgDungeonsMeta::Instance(), HOTFIX_SEL_LFG_DUNGEONS);
@@ -153,6 +154,7 @@ DB2Storage<QuestSortEntry> sQuestSortStore("QuestSort.db2",
DB2Storage<QuestV2Entry> sQuestV2Store("QuestV2.db2", QuestV2Meta::Instance(), HOTFIX_SEL_QUEST_V2);
DB2Storage<QuestXPEntry> sQuestXPStore("QuestXP.db2", QuestXPMeta::Instance(), HOTFIX_SEL_QUEST_XP);
DB2Storage<RandPropPointsEntry> sRandPropPointsStore("RandPropPoints.db2", RandPropPointsMeta::Instance(), HOTFIX_SEL_RAND_PROP_POINTS);
DB2Storage<RulesetItemUpgradeEntry> sRulesetItemUpgradeStore("RulesetItemUpgrade.db2", RulesetItemUpgradeMeta::Instance(), HOTFIX_SEL_RULESET_ITEM_UPGRADE);
DB2Storage<ScalingStatDistributionEntry> sScalingStatDistributionStore("ScalingStatDistribution.db2", ScalingStatDistributionMeta::Instance(), HOTFIX_SEL_SCALING_STAT_DISTRIBUTION);
DB2Storage<SkillLineEntry> sSkillLineStore("SkillLine.db2", SkillLineMeta::Instance(), HOTFIX_SEL_SKILL_LINE);
DB2Storage<SkillLineAbilityEntry> sSkillLineAbilityStore("SkillLineAbility.db2", SkillLineAbilityMeta::Instance(), HOTFIX_SEL_SKILL_LINE_ABILITY);
@@ -381,6 +383,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
LOAD_DB2(sItemSparseStore);
LOAD_DB2(sItemSpecStore);
LOAD_DB2(sItemSpecOverrideStore);
LOAD_DB2(sItemUpgradeStore);
LOAD_DB2(sItemXBonusTreeStore);
LOAD_DB2(sKeyChainStore);
LOAD_DB2(sLfgDungeonsStore);
@@ -412,6 +415,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
LOAD_DB2(sQuestV2Store);
LOAD_DB2(sQuestXPStore);
LOAD_DB2(sRandPropPointsStore);
LOAD_DB2(sRulesetItemUpgradeStore);
LOAD_DB2(sScalingStatDistributionStore);
LOAD_DB2(sSkillLineStore);
LOAD_DB2(sSkillLineAbilityStore);
@@ -683,6 +687,9 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
for (QuestPackageItemEntry const* questPackageItem : sQuestPackageItemStore)
_questPackages[questPackageItem->QuestPackageID].push_back(questPackageItem);
for (RulesetItemUpgradeEntry const* rulesetItemUpgrade : sRulesetItemUpgradeStore)
_rulesetItemUpgrade[rulesetItemUpgrade->ItemID] = rulesetItemUpgrade->ItemUpgradeID;
for (SkillRaceClassInfoEntry const* entry : sSkillRaceClassInfoStore)
if (sSkillLineStore.LookupEntry(entry->SkillID))
_skillRaceClassInfoBySkill.insert(SkillRaceClassInfoContainer::value_type(entry->SkillID, entry));
@@ -1312,6 +1319,15 @@ std::set<uint32> DB2Manager::GetPhasesForGroup(uint32 group) const
return std::set<uint32>();
}
uint32 DB2Manager::GetRulesetItemUpgrade(uint32 itemId) const
{
auto itr = _rulesetItemUpgrade.find(itemId);
if (itr != _rulesetItemUpgrade.end())
return itr->second;
return 0;
}
SkillRaceClassInfoEntry const* DB2Manager::GetSkillRaceClassInfo(uint32 skill, uint8 race, uint8 class_)
{
auto bounds = _skillRaceClassInfoBySkill.equal_range(skill);
+7 -4
View File
@@ -112,6 +112,7 @@ TC_GAME_API extern DB2Storage<ItemSetSpellEntry> sItemSetSpel
TC_GAME_API extern DB2SparseStorage<ItemSparseEntry> sItemSparseStore;
TC_GAME_API extern DB2Storage<ItemSpecEntry> sItemSpecStore;
TC_GAME_API extern DB2Storage<ItemSpecOverrideEntry> sItemSpecOverrideStore;
TC_GAME_API extern DB2Storage<ItemUpgradeEntry> sItemUpgradeStore;
TC_GAME_API extern DB2Storage<LfgDungeonsEntry> sLfgDungeonsStore;
TC_GAME_API extern DB2Storage<LiquidTypeEntry> sLiquidTypeStore;
TC_GAME_API extern DB2Storage<LockEntry> sLockStore;
@@ -246,6 +247,7 @@ public:
typedef std::array<std::vector<boost::regex>, TOTAL_LOCALES + 1> NameValidationRegexContainer;
typedef std::unordered_map<uint32, std::set<uint32>> PhaseGroupContainer;
typedef std::unordered_map<uint32, std::vector<QuestPackageItemEntry const*>> QuestPackageItemContainer;
typedef std::unordered_map<uint32, uint32> RulesetItemUpgradeContainer;
typedef std::unordered_multimap<uint32, SkillRaceClassInfoEntry const*> SkillRaceClassInfoContainer;
typedef std::unordered_map<uint32, std::vector<SpecializationSpellsEntry const*>> SpecializationSpellsContainer;
typedef std::unordered_map<uint32, std::vector<SpellPowerEntry const*>> SpellPowerContainer;
@@ -298,13 +300,13 @@ public:
MountEntry const* GetMountById(uint32 id) const;
MountTypeXCapabilitySet const* GetMountCapabilities(uint32 mountType) const;
ResponseCodes ValidateName(std::string const& name, LocaleConstant locale) const;
std::vector<QuestPackageItemEntry const*> const* GetQuestPackageItems(uint32 questPackageID) const;
uint32 GetQuestUniqueBitFlag(uint32 questId);
std::set<uint32> GetPhasesForGroup(uint32 group) const;
static PvPDifficultyEntry const* GetBattlegroundBracketByLevel(uint32 mapid, uint32 level);
static PvPDifficultyEntry const* GetBattlegroundBracketById(uint32 mapid, BattlegroundBracketId id);
SkillRaceClassInfoEntry const* GetSkillRaceClassInfo(uint32 skill, uint8 race, uint8 class_);
std::vector<SpecializationSpellsEntry const*> const* GetSpecializationSpells(uint32 specId) const;
std::vector<QuestPackageItemEntry const*> const* GetQuestPackageItems(uint32 questPackageID) const;
uint32 GetQuestUniqueBitFlag(uint32 questId);
uint32 GetRulesetItemUpgrade(uint32 itemId) const;
SkillRaceClassInfoEntry const* GetSkillRaceClassInfo(uint32 skill, uint8 race, uint8 class_); std::vector<SpecializationSpellsEntry const*> const* GetSpecializationSpells(uint32 specId) const;
std::vector<SpellPowerEntry const*> GetSpellPowers(uint32 spellId, Difficulty difficulty = DIFFICULTY_NONE, bool* hasDifficultyPowers = nullptr) const;
std::vector<SpellProcsPerMinuteModEntry const*> GetSpellProcsPerMinuteMods(uint32 spellprocsPerMinuteId) const;
std::vector<TalentEntry const*> const& GetTalentsByPosition(uint32 class_, uint32 tier, uint32 column) const;
@@ -343,6 +345,7 @@ private:
NameValidationRegexContainer _nameValidators;
PhaseGroupContainer _phasesByGroup;
QuestPackageItemContainer _questPackages;
RulesetItemUpgradeContainer _rulesetItemUpgrade;
SkillRaceClassInfoContainer _skillRaceClassInfoBySkill;
SpecializationSpellsContainer _specializationSpellsBySpec;
SpellPowerContainer _spellPowers;
+18 -1
View File
@@ -1446,6 +1446,16 @@ struct ItemSpecOverrideEntry
uint16 SpecID;
};
struct ItemUpgradeEntry
{
uint32 ID;
uint32 CurrencyCost;
uint16 PrevItemUpgradeID;
uint16 CurrencyID;
uint8 ItemUpgradePathID;
uint8 ItemLevelBonus;
};
struct ItemXBonusTreeEntry
{
uint32 ID;
@@ -1887,6 +1897,13 @@ struct RandPropPointsEntry
uint32 UncommonPropertiesPoints[5];
};
struct RulesetItemUpgradeEntry
{
uint32 ID;
uint32 ItemID;
uint16 ItemUpgradeID;
};
struct ScalingStatDistributionEntry
{
uint32 ID;
@@ -1921,7 +1938,7 @@ struct SkillLineAbilityEntry
uint16 TrivialSkillLineRankLow;
uint16 UniqueBit;
uint16 TradeSkillCategoryID;
uint8 AquireMethod;
uint8 AcquireMethod;
uint8 NumSkillUps;
uint32 ClassMask;
};
+18 -3
View File
@@ -407,10 +407,25 @@ enum CriteriaTypes
#define CRITERIA_TYPE_TOTAL 190
enum CriteriaTreeOperator
enum CriteriaTreeFlags : uint16
{
CRITERIA_TREE_OPERATOR_ALL = 4,
CRITERIA_TREE_OPERATOR_ANY = 8
CRITERIA_TREE_FLAG_PROGRESS_BAR = 0x0001,
CRITERIA_TREE_FLAG_PROGRESS_IS_DATE = 0x0004,
CRITERIA_TREE_FLAG_SHOW_CURRENCY_ICON = 0x0008,
CRITERIA_TREE_FLAG_ALLIANCE_ONLY = 0x0200,
CRITERIA_TREE_FLAG_HORDE_ONLY = 0x0400,
CRITERIA_TREE_FLAG_SHOW_REQUIRED_COUNT = 0x0800
};
enum CriteriaTreeOperator : uint8
{
CRITERIA_TREE_OPERATOR_SINGLE = 0,
CRITERIA_TREE_OPERATOR_SINGLE_NOT_COMPLETED = 1,
CRITERIA_TREE_OPERATOR_ALL = 4,
CRITERIA_TREE_OPERAROR_SUM_CHILDREN = 5,
CRITERIA_TREE_OPERATOR_MAX_CHILD = 6,
CRITERIA_TREE_OPERATOR_COUNT_DIRECT_CHILDREN = 7,
CRITERIA_TREE_OPERATOR_ANY = 8
};
enum CharSectionFlags
+48 -1
View File
@@ -196,7 +196,7 @@ TC_GAME_API extern GameTable<GtXpEntry> sXpGameTable;
TC_GAME_API void LoadGameTables(std::string const& dataPath);
template<class T>
inline float GetGameTableColumnForClass(T const* row, uint32 class_)
inline float GetGameTableColumnForClass(T const* row, int32 class_)
{
switch (class_)
{
@@ -231,4 +231,51 @@ inline float GetGameTableColumnForClass(T const* row, uint32 class_)
return 0.0f;
}
inline float GetSpellScalingColumnForClass(GtSpellScalingEntry const* row, int32 class_)
{
switch (class_)
{
case CLASS_WARRIOR:
return row->Warrior;
case CLASS_PALADIN:
return row->Paladin;
case CLASS_HUNTER:
return row->Hunter;
case CLASS_ROGUE:
return row->Rogue;
case CLASS_PRIEST:
return row->Priest;
case CLASS_DEATH_KNIGHT:
return row->DeathKnight;
case CLASS_SHAMAN:
return row->Shaman;
case CLASS_MAGE:
return row->Mage;
case CLASS_WARLOCK:
return row->Warlock;
case CLASS_MONK:
return row->Monk;
case CLASS_DRUID:
return row->Druid;
case CLASS_DEMON_HUNTER:
return row->DemonHunter;
case -1:
return row->Item;
case -2:
return row->Consumable;
case -3:
return row->Gem1;
case -4:
return row->Gem2;
case -5:
return row->Gem3;
case -6:
return row->Health;
default:
break;
}
return 0.0f;
}
#endif // GameTables_h__
@@ -15,13 +15,14 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "Unit.h"
#include "SpellInfo.h"
#include "Log.h"
#include "UpdateData.h"
#include "AreaTrigger.h"
#include "DB2Stores.h"
#include "Log.h"
#include "SpellInfo.h"
#include "Unit.h"
#include "UpdateData.h"
AreaTrigger::AreaTrigger() : WorldObject(false), _duration(0)
AreaTrigger::AreaTrigger() : WorldObject(false), _duration(0), _spellXSpellVisualId(0)
{
m_objectType |= TYPEMASK_AREATRIGGER;
m_objectTypeId = TYPEID_AREATRIGGER;
@@ -56,8 +57,9 @@ void AreaTrigger::RemoveFromWorld()
}
}
bool AreaTrigger::CreateAreaTrigger(ObjectGuid::LowType guidlow, uint32 triggerEntry, Unit* caster, SpellInfo const* spell, Position const& pos)
bool AreaTrigger::CreateAreaTrigger(ObjectGuid::LowType guidlow, uint32 triggerEntry, Unit* caster, SpellInfo const* spell, Position const& pos, uint32 spellXSpellVisualId)
{
_spellXSpellVisualId = spellXSpellVisualId;
SetMap(caster->GetMap());
Relocate(pos);
if (!IsPositionValid())
@@ -69,13 +71,17 @@ bool AreaTrigger::CreateAreaTrigger(ObjectGuid::LowType guidlow, uint32 triggerE
Object::_Create(ObjectGuid::Create<HighGuid::AreaTrigger>(GetMapId(), triggerEntry, guidlow));
SetPhaseMask(caster->GetPhaseMask(), false);
uint32 spellVisual = 0;
if (SpellXSpellVisualEntry const* visual = sSpellXSpellVisualStore.LookupEntry(spellXSpellVisualId))
spellVisual = visual->SpellVisualID[0];
SetEntry(triggerEntry);
SetDuration(spell->GetDuration());
SetObjectScale(1);
SetGuidValue(AREATRIGGER_CASTER, caster->GetGUID());
SetUInt32Value(AREATRIGGER_SPELLID, spell->Id);
SetUInt32Value(AREATRIGGER_SPELLVISUALID, spell->GetSpellVisual(GetMap()->GetDifficultyID()));
SetUInt32Value(AREATRIGGER_SPELLVISUALID, spellVisual);
SetUInt32Value(AREATRIGGER_DURATION, spell->GetDuration());
CopyPhaseFrom(caster);
@@ -32,7 +32,7 @@ class TC_GAME_API AreaTrigger : public WorldObject, public GridObject<AreaTrigge
void AddToWorld() override;
void RemoveFromWorld() override;
bool CreateAreaTrigger(ObjectGuid::LowType guidlow, uint32 triggerEntry, Unit* caster, SpellInfo const* spell, Position const& pos);
bool CreateAreaTrigger(ObjectGuid::LowType guidlow, uint32 triggerEntry, Unit* caster, SpellInfo const* spell, Position const& pos, uint32 spellXSpellVisualId);
void Update(uint32 p_time) override;
void Remove();
uint32 GetSpellId() const { return GetUInt32Value(AREATRIGGER_SPELLID); }
@@ -42,5 +42,6 @@ class TC_GAME_API AreaTrigger : public WorldObject, public GridObject<AreaTrigge
protected:
int32 _duration;
uint32 _spellXSpellVisualId;
};
#endif
@@ -1893,9 +1893,9 @@ SpellInfo const* Creature::reachWithSpellAttack(Unit* victim)
float dist = GetDistance(victim);
if (dist > range || dist < minrange)
continue;
if (spellInfo->PreventionType == SPELL_PREVENTION_TYPE_SILENCE && HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SILENCED))
if (spellInfo->PreventionType & SPELL_PREVENTION_TYPE_SILENCE && HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SILENCED))
continue;
if (spellInfo->PreventionType == SPELL_PREVENTION_TYPE_PACIFY && HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED))
if (spellInfo->PreventionType & SPELL_PREVENTION_TYPE_PACIFY && HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED))
continue;
return spellInfo;
}
@@ -1943,9 +1943,9 @@ SpellInfo const* Creature::reachWithSpellCure(Unit* victim)
// continue;
if (dist > range || dist < minrange)
continue;
if (spellInfo->PreventionType == SPELL_PREVENTION_TYPE_SILENCE && HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SILENCED))
if (spellInfo->PreventionType & SPELL_PREVENTION_TYPE_SILENCE && HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SILENCED))
continue;
if (spellInfo->PreventionType == SPELL_PREVENTION_TYPE_PACIFY && HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED))
if (spellInfo->PreventionType & SPELL_PREVENTION_TYPE_PACIFY && HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED))
continue;
return spellInfo;
}
@@ -28,7 +28,7 @@
#include "Transport.h"
DynamicObject::DynamicObject(bool isWorldObject) : WorldObject(isWorldObject),
_aura(NULL), _removedAura(NULL), _caster(NULL), _duration(0), _isViewpoint(false)
_aura(NULL), _removedAura(NULL), _caster(NULL), _duration(0), _spellXSpellVisualId(0), _isViewpoint(false)
{
m_objectType |= TYPEMASK_DYNAMICOBJECT;
m_objectTypeId = TYPEID_DYNAMICOBJECT;
@@ -80,8 +80,9 @@ void DynamicObject::RemoveFromWorld()
}
}
bool DynamicObject::CreateDynamicObject(ObjectGuid::LowType guidlow, Unit* caster, SpellInfo const* spell, Position const& pos, float radius, DynamicObjectType type)
bool DynamicObject::CreateDynamicObject(ObjectGuid::LowType guidlow, Unit* caster, SpellInfo const* spell, Position const& pos, float radius, DynamicObjectType type, uint32 spellXSpellVisualId)
{
_spellXSpellVisualId = spellXSpellVisualId;
SetMap(caster->GetMap());
Relocate(pos);
if (!IsPositionValid())
@@ -93,10 +94,14 @@ bool DynamicObject::CreateDynamicObject(ObjectGuid::LowType guidlow, Unit* caste
WorldObject::_Create(ObjectGuid::Create<HighGuid::DynamicObject>(GetMapId(), spell->Id, guidlow));
SetPhaseMask(caster->GetPhaseMask(), false);
uint32 spellVisual = 0;
if (SpellXSpellVisualEntry const* visual = sSpellXSpellVisualStore.LookupEntry(spellXSpellVisualId))
spellVisual = visual->SpellVisualID[0];
SetEntry(spell->Id);
SetObjectScale(1.0f);
SetGuidValue(DYNAMICOBJECT_CASTER, caster->GetGUID());
SetUInt32Value(DYNAMICOBJECT_BYTES, spell->GetSpellVisual(GetMap()->GetDifficultyID()) | (type << 28));
SetUInt32Value(DYNAMICOBJECT_BYTES, spellVisual | (type << 28));
SetUInt32Value(DYNAMICOBJECT_SPELLID, spell->Id);
SetFloatValue(DYNAMICOBJECT_RADIUS, radius);
SetUInt32Value(DYNAMICOBJECT_CASTTIME, getMSTime());
@@ -41,7 +41,7 @@ class TC_GAME_API DynamicObject : public WorldObject, public GridObject<DynamicO
void AddToWorld() override;
void RemoveFromWorld() override;
bool CreateDynamicObject(ObjectGuid::LowType guidlow, Unit* caster, SpellInfo const* spell, Position const& pos, float radius, DynamicObjectType type);
bool CreateDynamicObject(ObjectGuid::LowType guidlow, Unit* caster, SpellInfo const* spell, Position const& pos, float radius, DynamicObjectType type, uint32 spellXSpellVisualId);
void Update(uint32 p_time) override;
void Remove();
void SetDuration(int32 newDuration);
@@ -63,6 +63,7 @@ class TC_GAME_API DynamicObject : public WorldObject, public GridObject<DynamicO
Aura* _removedAura;
Unit* _caster;
int32 _duration; // for non-aura dynobjects
uint32 _spellXSpellVisualId;
bool _isViewpoint;
};
#endif
+32 -5
View File
@@ -577,7 +577,23 @@ bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid ownerGuid, Field* fie
SetUInt32Value(ITEM_FIELD_CREATE_PLAYED_TIME, fields[11].GetUInt32());
SetText(fields[12].GetString());
SetModifier(ITEM_MODIFIER_UPGRADE_ID, fields[13].GetUInt32());
SetModifier(ITEM_MODIFIER_BATTLE_PET_DISPLAY_ID, fields[19].GetUInt32());
uint32 upgradeId = fields[14].GetUInt32();
ItemUpgradeEntry const* rulesetUpgrade = sItemUpgradeStore.LookupEntry(sDB2Manager.GetRulesetItemUpgrade(entry));
ItemUpgradeEntry const* upgrade = sItemUpgradeStore.LookupEntry(upgradeId);
if (!rulesetUpgrade || !upgrade || rulesetUpgrade->ItemUpgradePathID != upgrade->ItemUpgradePathID)
{
upgradeId = 0;
need_save = true;
}
if (rulesetUpgrade && !upgradeId)
{
upgradeId = rulesetUpgrade->ID;
need_save = true;
}
SetModifier(ITEM_MODIFIER_UPGRADE_ID, upgradeId);
SetModifier(ITEM_MODIFIER_BATTLE_PET_SPECIES_ID, fields[14].GetUInt32());
SetModifier(ITEM_MODIFIER_BATTLE_PET_BREED_DATA, fields[15].GetUInt32());
SetModifier(ITEM_MODIFIER_BATTLE_PET_LEVEL, fields[16].GetUInt16());
@@ -615,11 +631,13 @@ bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid ownerGuid, Field* fie
if (need_save) // normal item changed state set not work at loading
{
uint8 index = 0;
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ITEM_INSTANCE_ON_LOAD);
stmt->setUInt32(0, GetUInt32Value(ITEM_FIELD_DURATION));
stmt->setUInt32(1, GetUInt32Value(ITEM_FIELD_FLAGS));
stmt->setUInt32(2, GetUInt32Value(ITEM_FIELD_DURABILITY));
stmt->setUInt64(3, guid);
stmt->setUInt32(index++, GetUInt32Value(ITEM_FIELD_DURATION));
stmt->setUInt32(index++, GetUInt32Value(ITEM_FIELD_FLAGS));
stmt->setUInt32(index++, GetUInt32Value(ITEM_FIELD_DURABILITY));
stmt->setUInt32(index++, GetModifier(ITEM_MODIFIER_UPGRADE_ID));
stmt->setUInt64(index++, guid);
CharacterDatabase.Execute(stmt);
}
@@ -1897,6 +1915,9 @@ uint32 Item::GetItemLevel(Player const* owner) const
if (uint32 heirloomIlvl = sDB2Manager.GetHeirloomItemLevel(ssd->ItemLevelCurveID, owner->getLevel()))
itemLevel = heirloomIlvl;
if (ItemUpgradeEntry const* upgrade = sItemUpgradeStore.LookupEntry(GetModifier(ITEM_MODIFIER_UPGRADE_ID)))
itemLevel += upgrade->ItemLevelBonus;
return std::min(std::max(itemLevel + _bonusData.ItemLevel, uint32(MIN_ITEM_LEVEL)), uint32(MAX_ITEM_LEVEL));
}
@@ -1935,6 +1956,12 @@ ItemModifiedAppearanceEntry const* Item::GetItemModifiedAppearance() const
void Item::SetModifier(ItemModifier modifier, uint32 value)
{
if (_modifiers[modifier] != value)
{
_dynamicChangesMask.SetBit(ITEM_DYNAMIC_FIELD_MODIFIERS);
AddToObjectUpdateIfNeeded();
}
_modifiers[modifier] = value;
ApplyModFlag(ITEM_FIELD_MODIFIERS_MASK, 1 << modifier, value != 0);
}
@@ -733,6 +733,7 @@ struct TC_GAME_API ItemTemplate
uint32 GetScalingStatDistribution() const { return ExtendedData->ScalingStatDistribution; }
uint32 GetDamageType() const { return ExtendedData->DamageType; }
uint32 GetDelay() const { return ExtendedData->Delay; }
float GetRangedModRange() const { return ExtendedData->RangedModRange; }
ItemBondingType GetBonding() const { return ItemBondingType(ExtendedData->Bonding); }
char const* GetName(LocaleConstant locale) const;
uint32 GetPageText() const { return ExtendedData->PageText; }
+64 -18
View File
@@ -2917,7 +2917,7 @@ bool Player::AddSpell(uint32 spellId, bool active, bool learning, bool dependent
{
uint32 next_active_spell_id = 0;
// fix activate state for non-stackable low rank (and find next spell for !active case)
if (!spellInfo->IsStackableWithRanks() && spellInfo->IsRanked())
if (spellInfo->IsRanked())
{
if (uint32 next = sSpellMgr->GetNextSpellInChain(spellId))
{
@@ -3030,7 +3030,7 @@ bool Player::AddSpell(uint32 spellId, bool active, bool learning, bool dependent
newspell->disabled = disabled;
// replace spells in action bars and spellbook to bigger rank if only one spell rank must be accessible
if (newspell->active && !newspell->disabled && !spellInfo->IsStackableWithRanks() && spellInfo->IsRanked() != 0)
if (newspell->active && !newspell->disabled && spellInfo->IsRanked())
{
for (PlayerSpellMap::iterator itr2 = m_spells.begin(); itr2 != m_spells.end(); ++itr2)
{
@@ -3138,7 +3138,7 @@ bool Player::AddSpell(uint32 spellId, bool active, bool learning, bool dependent
continue;
// Runeforging special case
if ((_spell_idx->second->AquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && !HasSkill(_spell_idx->second->SkillLine)) || ((_spell_idx->second->SkillLine == SKILL_RUNEFORGING) && _spell_idx->second->TrivialSkillLineRankHigh == 0))
if ((_spell_idx->second->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && !HasSkill(_spell_idx->second->SkillLine)) || ((_spell_idx->second->SkillLine == SKILL_RUNEFORGING) && _spell_idx->second->TrivialSkillLineRankHigh == 0))
if (SkillRaceClassInfoEntry const* rcInfo = sDB2Manager.GetSkillRaceClassInfo(_spell_idx->second->SkillLine, getRace(), getClass()))
LearnDefaultSkill(rcInfo);
}
@@ -3380,7 +3380,7 @@ void Player::RemoveSpell(uint32 spell_id, bool disabled, bool learn_low_rank)
{
// if ranked non-stackable spell: need activate lesser rank and update dendence state
/// No need to check for spellInfo != NULL here because if cur_active is true, then that means that the spell was already in m_spells, and only valid spells can be pushed there.
if (cur_active && !spellInfo->IsStackableWithRanks() && spellInfo->IsRanked())
if (cur_active && spellInfo->IsRanked())
{
// need manually update dependence state (learn spell ignore like attempts)
PlayerSpellMap::iterator prev_itr = m_spells.find(prev_id);
@@ -7960,11 +7960,10 @@ void Player::_ApplyAllLevelScaleItemMods(bool apply)
{
if (m_items[i])
{
if (m_items[i]->IsBroken() || !CanUseAttackType(Player::GetAttackBySlot(i, m_items[i]->GetTemplate()->GetInventoryType())))
if (!CanUseAttackType(Player::GetAttackBySlot(i, m_items[i]->GetTemplate()->GetInventoryType())))
continue;
_ApplyItemBonuses(m_items[i], i, apply);
ApplyItemEquipSpell(m_items[i], apply);
_ApplyItemMods(m_items[i], i, apply);
}
}
}
@@ -11075,6 +11074,9 @@ Item* Player::StoreNewItem(ItemPosCountVec const& pos, uint32 itemId, bool updat
if (randomPropertyId)
item->SetItemRandomProperties(randomPropertyId);
if (uint32 upgradeID = sDB2Manager.GetRulesetItemUpgrade(itemId))
item->SetModifier(ITEM_MODIFIER_UPGRADE_ID, upgradeID);
for (int32 bonusListID : bonusListIDs)
item->AddBonuses(bonusListID);
@@ -12877,6 +12879,25 @@ void Player::ApplyEnchantment(Item* item, EnchantmentSlot slot, bool apply, bool
}
break;
case ITEM_ENCHANTMENT_TYPE_RESISTANCE:
if (pEnchant->ScalingClass)
{
int32 scalingClass = pEnchant->ScalingClass;
if ((GetUInt32Value(UNIT_FIELD_MIN_ITEM_LEVEL) || GetUInt32Value(UNIT_FIELD_MAXITEMLEVEL)) && pEnchant->ScalingClassRestricted)
scalingClass = pEnchant->ScalingClassRestricted;
uint8 minLevel = pEnchant->Flags & 0x20 ? 1 : 60;
uint8 scalingLevel = getLevel();
uint8 maxLevel = uint8(pEnchant->MaxLevel ? pEnchant->MaxLevel : sSpellScalingGameTable.GetTableRowCount() - 1);
if (minLevel > getLevel())
scalingLevel = minLevel;
else if (maxLevel < getLevel())
scalingLevel = maxLevel;
if (GtSpellScalingEntry const* spellScaling = sSpellScalingGameTable.GetRow(scalingLevel))
enchant_amount = uint32(pEnchant->EffectScalingPoints[s] * GetSpellScalingColumnForClass(spellScaling, scalingClass));
}
if (!enchant_amount)
{
ItemRandomSuffixEntry const* item_rand = sItemRandomSuffixStore.LookupEntry(abs(item->GetItemRandomPropertyId()));
@@ -12897,6 +12918,25 @@ void Player::ApplyEnchantment(Item* item, EnchantmentSlot slot, bool apply, bool
break;
case ITEM_ENCHANTMENT_TYPE_STAT:
{
if (pEnchant->ScalingClass)
{
int32 scalingClass = pEnchant->ScalingClass;
if ((GetUInt32Value(UNIT_FIELD_MIN_ITEM_LEVEL) || GetUInt32Value(UNIT_FIELD_MAXITEMLEVEL)) && pEnchant->ScalingClassRestricted)
scalingClass = pEnchant->ScalingClassRestricted;
uint8 minLevel = pEnchant->Flags & 0x20 ? 1 : 60;
uint8 scalingLevel = getLevel();
uint8 maxLevel = uint8(pEnchant->MaxLevel ? pEnchant->MaxLevel : sSpellScalingGameTable.GetTableRowCount() - 1);
if (minLevel > getLevel())
scalingLevel = minLevel;
else if (maxLevel < getLevel())
scalingLevel = maxLevel;
if (GtSpellScalingEntry const* spellScaling = sSpellScalingGameTable.GetRow(scalingLevel))
enchant_amount = uint32(pEnchant->EffectScalingPoints[s] * GetSpellScalingColumnForClass(spellScaling, scalingClass));
}
if (!enchant_amount)
{
ItemRandomSuffixEntry const* item_rand_suffix = sItemRandomSuffixStore.LookupEntry(abs(item->GetItemRandomPropertyId()));
@@ -17818,7 +17858,6 @@ void Player::_LoadQuestStatus(PreparedQueryResult result)
void Player::_LoadQuestStatusObjectives(PreparedQueryResult result)
{
uint16 slot = 0;
//// 0 1 2
//QueryResult* result = CharacterDatabase.PQuery("SELECT quest, objective, data WHERE guid = '%u'", GetGUIDLow());
@@ -17831,8 +17870,9 @@ void Player::_LoadQuestStatusObjectives(PreparedQueryResult result)
uint32 questID = fields[0].GetUInt32();
uint16 slot = FindQuestSlot(questID);
auto itr = m_QuestStatus.find(questID);
if (itr != m_QuestStatus.end())
if (itr != m_QuestStatus.end() && slot < MAX_QUEST_LOG_SIZE)
{
QuestStatusData& questStatusData = itr->second;
uint8 objectiveIndex = fields[1].GetUInt8();
@@ -20935,13 +20975,13 @@ void Player::InitDataForForm(bool reapplyMods)
switch (form)
{
case FORM_GHOUL:
case FORM_CAT:
case FORM_CAT_FORM:
{
if (getPowerType() != POWER_ENERGY)
setPowerType(POWER_ENERGY);
break;
}
case FORM_BEAR:
case FORM_BEAR_FORM:
{
if (getPowerType() != POWER_RAGE)
setPowerType(POWER_RAGE);
@@ -22678,6 +22718,11 @@ void Player::LearnQuestRewardedSpells()
void Player::LearnSkillRewardedSpells(uint32 skillId, uint32 skillValue)
{
// bad hack to work around data being suited only for the client - AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN for riding
// client uses it to show riding in spellbook as trainable
if (skillId == SKILL_RIDING)
return;
uint32 raceMask = getRaceMask();
uint32 classMask = getClassMask();
for (uint32 j = 0; j < sSkillLineAbilityStore.GetNumRows(); ++j)
@@ -22690,7 +22735,7 @@ void Player::LearnSkillRewardedSpells(uint32 skillId, uint32 skillValue)
if (!spellInfo)
continue;
if (ability->AquireMethod != SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE && ability->AquireMethod != SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN)
if (ability->AcquireMethod != SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE && ability->AcquireMethod != SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN)
continue;
// Check race if set
@@ -22706,7 +22751,7 @@ void Player::LearnSkillRewardedSpells(uint32 skillId, uint32 skillValue)
continue;
// need unlearn spell
if (skillValue < ability->MinSkillLineRank && ability->AquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE)
if (skillValue < ability->MinSkillLineRank && ability->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE)
RemoveSpell(ability->SpellID);
// need learn
else if (!IsInWorld())
@@ -25266,11 +25311,11 @@ void Player::SendTimeSync()
GetName().c_str(), GetGUID().ToString().c_str());
}
void Player::SetReputation(uint32 factionentry, uint32 value)
void Player::SetReputation(uint32 factionentry, int32 value)
{
GetReputationMgr().SetReputation(sFactionStore.LookupEntry(factionentry), value);
}
uint32 Player::GetReputation(uint32 factionentry) const
int32 Player::GetReputation(uint32 factionentry) const
{
return GetReputationMgr().GetReputation(sFactionStore.LookupEntry(factionentry));
}
@@ -25969,9 +26014,10 @@ void Player::SendUpdatePhasing()
void Player::SendSupercededSpell(uint32 oldSpell, uint32 newSpell) const
{
WorldPacket data(SMSG_SUPERCEDED_SPELLS, 8);
data << uint32(newSpell) << uint32(oldSpell);
GetSession()->SendPacket(&data);
WorldPackets::Spells::SupercededSpells supercededSpells;
supercededSpells.SpellID.push_back(newSpell);
supercededSpells.Superceded.push_back(oldSpell);
GetSession()->SendPacket(supercededSpells.Write());
}
uint32 Player::CalculateTalentsTiers() const
+2 -2
View File
@@ -1746,8 +1746,8 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
void RemoveSpecializationSpells();
void SendSpellCategoryCooldowns() const;
void SetReputation(uint32 factionentry, uint32 value);
uint32 GetReputation(uint32 factionentry) const;
void SetReputation(uint32 factionentry, int32 value);
int32 GetReputation(uint32 factionentry) const;
std::string GetGuildName() const;
// Loot Spec
+22 -11
View File
@@ -163,7 +163,10 @@ void Player::ApplySpellPowerBonus(int32 amount, bool apply)
ApplyModUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + i, amount, apply);
if (HasAuraType(SPELL_AURA_OVERRIDE_ATTACK_POWER_BY_SP_PCT))
{
UpdateAttackPowerAndDamage();
UpdateAttackPowerAndDamage(true);
}
}
void Player::UpdateSpellDamageAndHealingBonus()
@@ -177,7 +180,10 @@ void Player::UpdateSpellDamageAndHealingBonus()
SetStatInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS+i, SpellBaseDamageBonusDone(SpellSchoolMask(1 << i)));
if (HasAuraType(SPELL_AURA_OVERRIDE_ATTACK_POWER_BY_SP_PCT))
{
UpdateAttackPowerAndDamage();
UpdateAttackPowerAndDamage(true);
}
}
bool Player::UpdateAllStats()
@@ -313,19 +319,24 @@ void Player::UpdateAttackPowerAndDamage(bool ranged)
index = UNIT_FIELD_RANGED_ATTACK_POWER;
index_mod = UNIT_FIELD_RANGED_ATTACK_POWER_MOD_POS;
index_mult = UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER;
val2 = (level + std::max(GetStat(STAT_AGILITY), 0.0f)) * entry->RangedAttackPowerPerAgility;
}
else if (!HasAuraType(SPELL_AURA_OVERRIDE_ATTACK_POWER_BY_SP_PCT))
if (!HasAuraType(SPELL_AURA_OVERRIDE_ATTACK_POWER_BY_SP_PCT))
{
float strengthValue = std::max(GetStat(STAT_STRENGTH) * entry->AttackPowerPerStrength, 0.0f);
float agilityValue = std::max(GetStat(STAT_AGILITY) * entry->AttackPowerPerAgility, 0.0f);
if (!ranged)
{
float strengthValue = std::max(GetStat(STAT_STRENGTH) * entry->AttackPowerPerStrength, 0.0f);
float agilityValue = std::max(GetStat(STAT_AGILITY) * entry->AttackPowerPerAgility, 0.0f);
SpellShapeshiftFormEntry const* form = sSpellShapeshiftFormStore.LookupEntry(GetShapeshiftForm());
// Directly taken from client, SHAPESHIFT_FLAG_AP_FROM_STRENGTH ?
if (form && form->Flags & 0x20)
agilityValue += std::max(GetStat(STAT_AGILITY) * entry->AttackPowerPerStrength, 0.0f);
SpellShapeshiftFormEntry const* form = sSpellShapeshiftFormStore.LookupEntry(GetShapeshiftForm());
// Directly taken from client, SHAPESHIFT_FLAG_AP_FROM_STRENGTH ?
if (form && form->Flags & 0x20)
agilityValue += std::max(GetStat(STAT_AGILITY) * entry->AttackPowerPerStrength, 0.0f);
val2 = strengthValue + agilityValue;
val2 = strengthValue + agilityValue;
}
else
val2 = (level + std::max(GetStat(STAT_AGILITY), 0.0f)) * entry->RangedAttackPowerPerAgility;
}
else
{
@@ -416,12 +427,12 @@ void Player::CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bo
if (Item* weapon = GetWeaponForAttack(BASE_ATTACK, true))
weaponSpeed = weapon->GetTemplate()->GetDelay() / 1000;
if (GetShapeshiftForm() == FORM_CAT)
if (GetShapeshiftForm() == FORM_CAT_FORM)
{
weaponMinDamage = weaponMinDamage / weaponSpeed;
weaponMaxDamage = weaponMaxDamage / weaponSpeed;
}
else if (GetShapeshiftForm() == FORM_BEAR)
else if (GetShapeshiftForm() == FORM_BEAR_FORM)
{
weaponMinDamage = weaponMinDamage / weaponSpeed + weaponMinDamage / 2.5;
weaponMaxDamage = weaponMinDamage / weaponSpeed + weaponMaxDamage / 2.5;
+36 -22
View File
@@ -484,12 +484,6 @@ void Unit::resetAttackTimer(WeaponAttackType type)
m_attackTimer[type] = uint32(GetAttackTime(type) * m_modAttackSpeedPct[type]);
}
float Unit::GetMeleeReach() const
{
float reach = m_floatValues[UNIT_FIELD_COMBATREACH];
return reach > MIN_MELEE_REACH ? reach : MIN_MELEE_REACH;
}
bool Unit::IsWithinCombatRange(const Unit* obj, float dist2compare) const
{
if (!obj || !IsInMap(obj) || !IsInPhase(obj))
@@ -516,7 +510,7 @@ bool Unit::IsWithinMeleeRange(const Unit* obj, float dist) const
float dz = GetPositionZMinusOffset() - obj->GetPositionZMinusOffset();
float distsq = dx*dx + dy*dy + dz*dz;
float sizefactor = GetMeleeReach() + obj->GetMeleeReach();
float sizefactor = GetCombatReach() + obj->GetCombatReach() + 4.0f / 3.0f;
float maxdist = dist + sizefactor;
return distsq < maxdist * maxdist;
@@ -3308,7 +3302,7 @@ void Unit::_RemoveNoStackAurasDueToAura(Aura* aura)
{
Unit* caster = aura->GetCaster();
if (caster && caster->GetTypeId() == TYPEID_PLAYER)
Spell::SendCastResult(caster->ToPlayer(), aura->GetSpellInfo(), aura->GetSpellInfo()->GetSpellXSpellVisualId(caster->GetMap()->GetDifficultyID()), aura->GetCastGUID(), SPELL_FAILED_AURA_BOUNCED);
Spell::SendCastResult(caster->ToPlayer(), aura->GetSpellInfo(), aura->GetSpellXSpellVisualId(), aura->GetCastGUID(), SPELL_FAILED_AURA_BOUNCED);
}
aura->Remove();
@@ -6183,10 +6177,10 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg
switch (GetShapeshiftForm())
{
case FORM_NONE: trigger_spell_id = 37344; break;
case FORM_CAT: trigger_spell_id = 37341; break;
case FORM_BEAR: trigger_spell_id = 37340; break;
case FORM_TREE: trigger_spell_id = 37342; break;
case FORM_MOONKIN: trigger_spell_id = 37343; break;
case FORM_CAT_FORM: trigger_spell_id = 37341; break;
case FORM_BEAR_FORM: trigger_spell_id = 37340; break;
case FORM_TREE_OF_LIFE: trigger_spell_id = 37342; break;
case FORM_MOONKIN_FORM: trigger_spell_id = 37343; break;
default:
return false;
}
@@ -6197,8 +6191,8 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg
{
switch (GetShapeshiftForm())
{
case FORM_CAT: trigger_spell_id = 67355; break;
case FORM_BEAR: trigger_spell_id = 67354; break;
case FORM_CAT_FORM: trigger_spell_id = 67355; break;
case FORM_BEAR_FORM: trigger_spell_id = 67354; break;
default:
return false;
}
@@ -10660,7 +10654,7 @@ void Unit::SetShapeshiftForm(ShapeshiftForm form)
bool Unit::IsInFeralForm() const
{
ShapeshiftForm form = GetShapeshiftForm();
return form == FORM_CAT || form == FORM_BEAR;
return form == FORM_CAT_FORM || form == FORM_BEAR_FORM;
}
bool Unit::IsInDisallowedMountForm() const
@@ -11582,6 +11576,7 @@ bool InitTriggerAuraData()
isAlwaysTriggeredAura[i] = false;
}
isTriggerAura[SPELL_AURA_PROC_ON_POWER_AMOUNT] = true;
isTriggerAura[SPELL_AURA_PROC_ON_POWER_AMOUNT_2] = true;
isTriggerAura[SPELL_AURA_DUMMY] = true;
isTriggerAura[SPELL_AURA_MOD_CONFUSE] = true;
isTriggerAura[SPELL_AURA_MOD_THREAT] = true;
@@ -11906,6 +11901,7 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u
break;
}
case SPELL_AURA_PROC_ON_POWER_AMOUNT:
case SPELL_AURA_PROC_ON_POWER_AMOUNT_2:
{
triggeredByAura->HandleProcTriggerSpellOnPowerAmountAuraProc(aurApp, eventInfo);
takeCharges = true;
@@ -13106,7 +13102,7 @@ void Unit::Kill(Unit* victim, bool durabilityLoss)
// restore for use at real death
victim->SetUInt32Value(PLAYER_SELF_RES_SPELL, ressSpellId);
// FORM_SPIRITOFREDEMPTION and related auras
// FORM_SPIRIT_OF_REDEMPTION and related auras
victim->CastSpell(victim, 27827, true, NULL, aurEff);
spiritOfRedemption = true;
break;
@@ -14195,7 +14191,7 @@ uint32 Unit::GetModelForForm(ShapeshiftForm form) const
{
switch (form)
{
case FORM_CAT:
case FORM_CAT_FORM:
// Based on Hair color
if (getRace() == RACE_NIGHTELF)
{
@@ -14343,7 +14339,7 @@ uint32 Unit::GetModelForForm(ShapeshiftForm form) const
return 892;
else
return 8571;
case FORM_BEAR:
case FORM_BEAR_FORM:
// Based on Hair color
if (getRace() == RACE_NIGHTELF)
{
@@ -14491,17 +14487,17 @@ uint32 Unit::GetModelForForm(ShapeshiftForm form) const
return 2281;
else
return 2289;
case FORM_FLIGHT:
case FORM_FLIGHT_FORM:
if (Player::TeamForRace(getRace()) == ALLIANCE)
return 20857;
return 20872;
case FORM_FLIGHT_EPIC:
case FORM_FLIGHT_FORM_EPIC:
if (Player::TeamForRace(getRace()) == ALLIANCE)
return (getRace() == RACE_WORGEN ? 37729 : 21243);
if (getRace() == RACE_TROLL)
return 37730;
return 21244;
case FORM_MOONKIN:
case FORM_MOONKIN_FORM:
switch (getRace())
{
case RACE_NIGHTELF:
@@ -14516,7 +14512,7 @@ uint32 Unit::GetModelForForm(ShapeshiftForm form) const
break;
}
break;
case FORM_GHOSTWOLF:
case FORM_GHOST_WOLF:
if (HasAura(58135)) //! Glyph of Arctic Wolf
return 27312;
default:
@@ -16038,6 +16034,24 @@ SpellInfo const* Unit::GetCastSpellInfo(SpellInfo const* spellInfo) const
return spellInfo;
}
uint32 Unit::GetCastSpellXSpellVisualId(SpellInfo const* spellInfo) const
{
Unit::AuraEffectList const& visualOverrides = GetAuraEffectsByType(SPELL_AURA_OVERRIDE_SPELL_VISUAL);
for (AuraEffect const* effect : visualOverrides)
{
if (uint32(effect->GetMiscValue()) == spellInfo->Id)
{
if (SpellInfo const* visualSpell = sSpellMgr->GetSpellInfo(effect->GetMiscValueB()))
{
spellInfo = visualSpell;
break;
}
}
}
return spellInfo->GetSpellXSpellVisualId(this);
}
struct CombatLogSender
{
WorldObject const* i_source;
+37 -33
View File
@@ -259,37 +259,40 @@ enum UnitBytes1_Flags
// high byte (3 from 0..3) of UNIT_FIELD_BYTES_2
enum ShapeshiftForm
{
FORM_NONE = 0x00,
FORM_CAT = 0x01,
FORM_TREE = 0x02,
FORM_TRAVEL = 0x03,
FORM_AQUA = 0x04,
FORM_BEAR = 0x05,
FORM_AMBIENT = 0x06,
FORM_GHOUL = 0x07,
FORM_DIREBEAR = 0x08, // Removed in 4.0.1
FORM_STEVES_GHOUL = 0x09,
FORM_THARONJA_SKELETON = 0x0A,
FORM_TEST_OF_STRENGTH = 0x0B,
FORM_BLB_PLAYER = 0x0C,
FORM_SHADOW_DANCE = 0x0D,
FORM_CREATUREBEAR = 0x0E,
FORM_CREATURECAT = 0x0F,
FORM_GHOSTWOLF = 0x10,
FORM_BATTLESTANCE = 0x11,
FORM_DEFENSIVESTANCE = 0x12,
FORM_BERSERKERSTANCE = 0x13,
FORM_TEST = 0x14,
FORM_ZOMBIE = 0x15,
FORM_METAMORPHOSIS = 0x16,
FORM_UNDEAD = 0x19,
FORM_MASTER_ANGLER = 0x1A,
FORM_FLIGHT_EPIC = 0x1B,
FORM_SHADOW = 0x1C,
FORM_FLIGHT = 0x1D,
FORM_STEALTH = 0x1E,
FORM_MOONKIN = 0x1F,
FORM_SPIRITOFREDEMPTION = 0x20
FORM_NONE = 0,
FORM_CAT_FORM = 1,
FORM_TREE_OF_LIFE = 2,
FORM_TRAVEL_FORM = 3,
FORM_AQUATIC_FORM = 4,
FORM_BEAR_FORM = 5,
FORM_AMBIENT = 6,
FORM_GHOUL = 7,
FORM_DIRE_BEAR_FORM = 8,
FORM_CRANE_STANCE = 9,
FORM_THARONJA_SKELETON = 10,
FORM_DARKMOON_TEST_OF_STRENGTH = 11,
FORM_BLB_PLAYER = 12,
FORM_SHADOW_DANCE = 13,
FORM_CREATURE_BEAR = 14,
FORM_CREATURE_CAT = 15,
FORM_GHOST_WOLF = 16,
FORM_BATTLE_STANCE = 17,
FORM_DEFENSIVE_STANCE = 18,
FORM_BERSERKER_STANCE = 19,
FORM_SERPENT_STANCE = 20,
FORM_ZOMBIE = 21,
FORM_METAMORPHOSIS = 22,
FORM_OX_STANCE = 23,
FORM_TIGER_STANCE = 24,
FORM_UNDEAD = 25,
FORM_FRENZY = 26,
FORM_FLIGHT_FORM_EPIC = 27,
FORM_SHADOWFORM = 28,
FORM_FLIGHT_FORM = 29,
FORM_STEALTH = 30,
FORM_MOONKIN_FORM = 31,
FORM_SPIRIT_OF_REDEMPTION = 32,
FORM_GLADIATOR_STANCE = 33
};
// low byte (0 from 0..3) of UNIT_FIELD_BYTES_2
@@ -734,7 +737,8 @@ enum UnitFlags2
UNIT_FLAG2_DISABLE_TURN = 0x00008000,
UNIT_FLAG2_UNK2 = 0x00010000,
UNIT_FLAG2_PLAY_DEATH_ANIM = 0x00020000, // Plays special death animation upon death
UNIT_FLAG2_ALLOW_CHEAT_SPELLS = 0x00040000 // Allows casting spells with AttributesEx7 & SPELL_ATTR7_IS_CHEAT_SPELL
UNIT_FLAG2_ALLOW_CHEAT_SPELLS = 0x00040000, // Allows casting spells with AttributesEx7 & SPELL_ATTR7_IS_CHEAT_SPELL
UNIT_FLAG2_NO_ACTIONS = 0x00800000
};
/// Non Player Character flags
@@ -1370,7 +1374,6 @@ class TC_GAME_API Unit : public WorldObject
bool CanDualWield() const { return m_canDualWield; }
virtual void SetCanDualWield(bool value) { m_canDualWield = value; }
float GetCombatReach() const { return m_floatValues[UNIT_FIELD_COMBATREACH]; }
float GetMeleeReach() const;
bool IsWithinCombatRange(const Unit* obj, float dist2compare) const;
bool IsWithinMeleeRange(const Unit* obj, float dist = MELEE_RANGE) const;
void GetRandomContactPoint(const Unit* target, float &x, float &y, float &z, float distance2dMin, float distance2dMax) const;
@@ -1936,6 +1939,7 @@ class TC_GAME_API Unit : public WorldObject
Spell* FindCurrentSpellBySpellId(uint32 spell_id) const;
int32 GetCurrentSpellCastTime(uint32 spell_id) const;
virtual SpellInfo const* GetCastSpellInfo(SpellInfo const* spellInfo) const;
uint32 GetCastSpellXSpellVisualId(SpellInfo const* spellInfo) const;
SpellHistory* GetSpellHistory() { return _spellHistory; }
SpellHistory const* GetSpellHistory() const { return _spellHistory; }
+5 -5
View File
@@ -232,7 +232,7 @@ void Vehicle::RemoveAllPassengers()
while (!_pendingJoinEvents.empty())
{
VehicleJoinEvent* e = _pendingJoinEvents.front();
e->to_Abort = true;
e->ScheduleAbort();
e->Target = eventVehicle;
_pendingJoinEvents.pop_front();
}
@@ -421,7 +421,7 @@ bool Vehicle::AddPassenger(Unit* unit, int8 seatId)
if (seat == Seats.end()) // no available seat
{
e->to_Abort = true;
e->ScheduleAbort();
return false;
}
@@ -433,7 +433,7 @@ bool Vehicle::AddPassenger(Unit* unit, int8 seatId)
seat = Seats.find(seatId);
if (seat == Seats.end())
{
e->to_Abort = true;
e->ScheduleAbort();
return false;
}
@@ -691,7 +691,7 @@ void Vehicle::RemovePendingEventsForSeat(int8 seatId)
{
if ((*itr)->Seat->first == seatId)
{
(*itr)->to_Abort = true;
(*itr)->ScheduleAbort();
_pendingJoinEvents.erase(itr++);
}
else
@@ -716,7 +716,7 @@ void Vehicle::RemovePendingEventsForPassenger(Unit* passenger)
{
if ((*itr)->Passenger == passenger)
{
(*itr)->to_Abort = true;
(*itr)->ScheduleAbort();
_pendingJoinEvents.erase(itr++);
}
else
@@ -31,6 +31,7 @@ void WorldSession::HandleBattlenetRequestRealmListTicket(WorldPackets::Battlenet
WorldPackets::Battlenet::RealmListTicket realmListTicket;
realmListTicket.Token = requestRealmListTicket.Token;
realmListTicket.Allow = true;
realmListTicket.Ticket << "WorldserverRealmListTicket";
SendPacket(realmListTicket.Write());
+62
View File
@@ -1136,3 +1136,65 @@ void WorldSession::HandleUseCritterItem(WorldPackets::Item::UseCritterItem& useC
_player->DestroyItem(item->GetBagSlot(), item->GetSlot(), true);
}
void WorldSession::HandleUpgradeItem(WorldPackets::Item::UpgradeItem& upgradeItem)
{
WorldPackets::Item::ItemUpgradeResult itemUpgradeResult;
if (!_player->GetNPCIfCanInteractWith(upgradeItem.ItemMaster, UNIT_NPC_FLAG_ITEM_UPGRADE_MASTER))
{
TC_LOG_DEBUG("network", "WORLD: HandleUpgradeItems - %s not found or player can't interact with it.", upgradeItem.ItemMaster.ToString().c_str());
itemUpgradeResult.Success = false;
SendPacket(itemUpgradeResult.Write());
return;
}
Item* item = _player->GetItemByGuid(upgradeItem.ItemGUID);
if (!item)
{
TC_LOG_DEBUG("network", "WORLD: HandleUpgradeItems: Item %s not found!", upgradeItem.ItemGUID.ToString().c_str());
itemUpgradeResult.Success = false;
SendPacket(itemUpgradeResult.Write());
return;
}
ItemUpgradeEntry const* itemUpgradeEntry = sItemUpgradeStore.LookupEntry(upgradeItem.UpgradeID);
if (!itemUpgradeEntry)
{
TC_LOG_DEBUG("network", "WORLD: HandleUpgradeItems - ItemUpgradeEntry (%u) not found.", upgradeItem.UpgradeID);
itemUpgradeResult.Success = false;
SendPacket(itemUpgradeResult.Write());
return;
}
// Check if player has enough currency
if (!_player->HasCurrency(itemUpgradeEntry->CurrencyID, itemUpgradeEntry->CurrencyCost))
{
TC_LOG_DEBUG("network", "WORLD: HandleUpgradeItems - Player has not enougth currency (ID: %u, Cost: %u) not found.", itemUpgradeEntry->CurrencyID, itemUpgradeEntry->CurrencyCost);
itemUpgradeResult.Success = false;
SendPacket(itemUpgradeResult.Write());
return;
}
uint32 currentUpgradeId = item->GetModifier(ITEM_MODIFIER_UPGRADE_ID);
if (currentUpgradeId != itemUpgradeEntry->PrevItemUpgradeID)
{
TC_LOG_DEBUG("network", "WORLD: HandleUpgradeItems - ItemUpgradeEntry (%u) is not related to this ItemUpgradePath (%u).", itemUpgradeEntry->ID, currentUpgradeId);
itemUpgradeResult.Success = false;
SendPacket(itemUpgradeResult.Write());
return;
}
itemUpgradeResult.Success = true;
SendPacket(itemUpgradeResult.Write());
if (item->IsEquipped())
_player->_ApplyItemBonuses(item, item->GetSlot(), false);
item->SetModifier(ITEM_MODIFIER_UPGRADE_ID, itemUpgradeEntry->ID);
if (item->IsEquipped())
_player->_ApplyItemBonuses(item, item->GetSlot(), true);
item->SetState(ITEM_CHANGED, _player);
_player->ModifyCurrency(itemUpgradeEntry->CurrencyID, -int32(itemUpgradeEntry->CurrencyCost));
}
+1
View File
@@ -366,6 +366,7 @@ LootItem::LootItem(LootStoreItem const& li)
randomSuffix = GenerateEnchSuffixFactor(itemid);
randomPropertyId = Item::GenerateItemRandomPropertyId(itemid);
upgradeId = sDB2Manager.GetRulesetItemUpgrade(itemid);
count = 0;
is_looted = 0;
is_blocked = 0;
+2 -1
View File
@@ -159,6 +159,7 @@ struct TC_GAME_API LootItem
uint32 itemid;
uint32 randomSuffix;
int32 randomPropertyId;
int32 upgradeId;
std::vector<int32> BonusListIDs;
ConditionContainer conditions; // additional loot condition
GuidSet allowedGUIDs;
@@ -177,7 +178,7 @@ struct TC_GAME_API LootItem
explicit LootItem(LootStoreItem const& li);
// Empty constructor for creating an empty LootItem to be filled in with DB data
LootItem() : itemid(0), randomSuffix(0), randomPropertyId(0), count(0), is_looted(false), is_blocked(false),
LootItem() : itemid(0), randomSuffix(0), randomPropertyId(0), upgradeId(0), count(0), is_looted(false), is_blocked(false),
freeforall(false), is_underthreshold(false), is_counted(false), needs_quest(false), follow_loot_rules(false),
canSave(true){ };
@@ -2254,10 +2254,9 @@ enum SpellDmgClass
enum SpellPreventionType
{
SPELL_PREVENTION_TYPE_NONE = 0,
SPELL_PREVENTION_TYPE_SILENCE = 1,
SPELL_PREVENTION_TYPE_PACIFY = 2,
SPELL_PREVENTION_TYPE_UNK = 3 // Only a few spells have this, but most of the should be interruptable.
SPELL_PREVENTION_TYPE_SILENCE = 1,
SPELL_PREVENTION_TYPE_PACIFY = 2,
SPELL_PREVENTION_TYPE_NO_ACTIONS = 4
};
enum GameobjectTypes : uint8 // (6.0.3.19103)
+3 -1
View File
@@ -367,7 +367,9 @@ class CreatureGameObjectScriptRegistrySwapHooks
// Hook which is called before a creature is swapped
static void UnloadStage1(Creature* creature)
{
creature->m_Events.KillAllEvents(true);
// Remove deletable events only,
// otherwise it causes crashes with non-deletable spell events.
creature->m_Events.KillAllEvents(false);
if (creature->IsCharmed())
creature->RemoveCharmedBy(nullptr);
+22 -1
View File
@@ -293,7 +293,11 @@ void WorldPackets::Item::ItemInstance::Initialize(::LootItem const& lootItem)
ItemBonus->Context = 0; /// @todo
}
/// no Modifications
if (lootItem.upgradeId)
{
Modifications = boost::in_place();
Modifications->Insert(ITEM_MODIFIER_UPGRADE_ID, lootItem.upgradeId);
}
}
void WorldPackets::Item::ItemInstance::Initialize(::VoidStorageItem const* voidItem)
@@ -508,6 +512,15 @@ void WorldPackets::Item::UseCritterItem::Read()
_worldPacket >> ItemGuid;
}
void WorldPackets::Item::UpgradeItem::Read()
{
_worldPacket >> ItemMaster;
_worldPacket >> ItemGUID;
_worldPacket >> UpgradeID;
_worldPacket >> ContainerSlot;
_worldPacket >> Slot;
}
void WorldPackets::Item::SocketGems::Read()
{
_worldPacket >> ItemGuid;
@@ -521,3 +534,11 @@ WorldPacket const* WorldPackets::Item::SocketGemsResult::Write()
return &_worldPacket;
}
WorldPacket const* WorldPackets::Item::ItemUpgradeResult::Write()
{
_worldPacket.WriteBit(Success);
_worldPacket.FlushBits();
return &_worldPacket;
}
@@ -484,6 +484,30 @@ namespace WorldPackets
ObjectGuid ItemGuid;
};
class UpgradeItem final : public ClientPacket
{
public:
UpgradeItem(WorldPacket&& packet) : ClientPacket(CMSG_UPGRADE_ITEM, std::move(packet)) { }
void Read() override;
ObjectGuid ItemMaster;
ObjectGuid ItemGUID;
int32 ContainerSlot = 0;
int32 UpgradeID = 0;
int32 Slot = 0;
};
class ItemUpgradeResult final : public ServerPacket
{
public:
ItemUpgradeResult() : ServerPacket(SMSG_ITEM_UPGRADE_RESULT, 1) { }
WorldPacket const* Write() override;
bool Success = false;
};
class SocketGems final : public ClientPacket
{
public:
@@ -480,6 +480,24 @@ WorldPacket const* WorldPackets::Spells::LearnedSpells::Write()
return &_worldPacket;
}
WorldPacket const* WorldPackets::Spells::SupercededSpells::Write()
{
_worldPacket << uint32(SpellID.size());
_worldPacket << uint32(Superceded.size());
_worldPacket << uint32(FavoriteSpellID.size());
if (!SpellID.empty())
_worldPacket.append(SpellID.data(), SpellID.size());
if (!Superceded.empty())
_worldPacket.append(Superceded.data(), Superceded.size());
if (!FavoriteSpellID.empty())
_worldPacket.append(FavoriteSpellID.data(), FavoriteSpellID.size());
return &_worldPacket;
}
WorldPacket const* WorldPackets::Spells::SpellFailure::Write()
{
_worldPacket << CasterUnit;
@@ -422,6 +422,18 @@ namespace WorldPackets
bool SuppressMessaging = false;
};
class SupercededSpells final : public ServerPacket
{
public:
SupercededSpells() : ServerPacket(SMSG_SUPERCEDED_SPELLS, 4 + 4 + 4 + 4) { }
WorldPacket const* Write() override;
std::vector<int32> SpellID;
std::vector<int32> Superceded;
std::vector<int32> FavoriteSpellID;
};
class SpellFailure final : public ServerPacket
{
public:
+3 -2
View File
@@ -796,7 +796,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_UPDATE_WOW_TOKEN_AUCTIONABLE_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Token::UpdateListedAuctionableTokens, &WorldSession::HandleUpdateListedAuctionableTokens);
DEFINE_HANDLER(CMSG_UPDATE_WOW_TOKEN_COUNT, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_UPGRADE_GARRISON, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_UPGRADE_ITEM, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_UPGRADE_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::UpgradeItem, &WorldSession::HandleUpgradeItem);
DEFINE_HANDLER(CMSG_USED_FOLLOW, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_USE_CRITTER_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::UseCritterItem, &WorldSession::HandleUseCritterItem);
DEFINE_HANDLER(CMSG_USE_EQUIPMENT_SET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::EquipmentSet::UseEquipmentSet, &WorldSession::HandleUseEquipmentSet);
@@ -1261,6 +1261,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_PURCHASE_REFUND_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_PUSH_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_TIME_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_UPGRADE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_KICK_REASON, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEARNED_SPELLS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEARN_PVP_TALENTS_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -1689,7 +1690,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUMMON_CANCEL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUMMON_RAID_MEMBER_VALIDATE_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUMMON_REQUEST, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUPERCEDED_SPELLS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUPERCEDED_SPELLS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUSPEND_COMMS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUSPEND_TOKEN, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TALENTS_INVOLUNTARILY_RESET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -1694,6 +1694,7 @@ enum OpcodeServer : uint32
// Opcodes that are not generated automatically
SMSG_ACCOUNT_HEIRLOOM_UPDATE = 0xBADD, // no client handler
SMSG_ITEM_UPGRADE_RESULT = 0xBADD, // no client handler
SMSG_COMPRESSED_PACKET = 0x3052,
SMSG_MULTIPLE_PACKETS = 0x3051,
+2
View File
@@ -367,6 +367,7 @@ namespace WorldPackets
class WrapItem;
class CancelTempEnchantment;
class UseCritterItem;
class UpgradeItem;
class SocketGems;
struct ItemInstance;
}
@@ -1420,6 +1421,7 @@ class TC_GAME_API WorldSession
void HandleBuybackItem(WorldPackets::Item::BuyBackItem& packet);
void HandleWrapItem(WorldPackets::Item::WrapItem& packet);
void HandleUseCritterItem(WorldPackets::Item::UseCritterItem& packet);
void HandleUpgradeItem(WorldPackets::Item::UpgradeItem& packet);
void HandleAttackSwingOpcode(WorldPackets::Combat::AttackSwing& packet);
void HandleAttackStopOpcode(WorldPackets::Combat::AttackStop& packet);
+13 -13
View File
@@ -378,7 +378,7 @@ enum AuraType
SPELL_AURA_MASTERY = 318,
SPELL_AURA_MOD_MELEE_HASTE_3 = 319,
SPELL_AURA_MOD_RANGED_HASTE_2 = 320,
SPELL_AURA_321 = 321,
SPELL_AURA_MOD_NO_ACTIONS = 321,
SPELL_AURA_INTERFERE_TARGETTING = 322, // NYI
SPELL_AURA_323 = 323, // Not used in 4.3.4
SPELL_AURA_324 = 324, // spell critical chance (probably by school mask)
@@ -453,13 +453,13 @@ enum AuraType
SPELL_AURA_393 = 393,
SPELL_AURA_SHOW_CONFIRMATION_PROMPT = 394,
SPELL_AURA_AREA_TRIGGER = 395, // NYI
SPELL_AURA_396 = 396,
SPELL_AURA_PROC_ON_POWER_AMOUNT_2 = 396, // missing MicValueB handling, probably OnAmountReach ascending/descending or spell/stack add/remove
SPELL_AURA_397 = 397,
SPELL_AURA_398 = 398,
SPELL_AURA_399 = 399,
SPELL_AURA_MOD_SKILL_2 = 400,
SPELL_AURA_401 = 401,
SPELL_AURA_402 = 402,
SPELL_AURA_MOD_POWER_DISPLAY = 402,
SPELL_AURA_OVERRIDE_SPELL_VISUAL = 403,
SPELL_AURA_OVERRIDE_ATTACK_POWER_BY_SP_PCT = 404,
SPELL_AURA_MOD_RATING_PCT = 405, // NYI
@@ -515,17 +515,17 @@ enum AuraType
SPELL_AURA_455 = 455,
SPELL_AURA_CHARGE_RECOVERY_AFFECTED_BY_HASTE = 456,
SPELL_AURA_CHARGE_RECOVERY_AFFECTED_BY_HASTE_REGEN = 457,
SPELL_AURA_IGNORE_DUAL_WIELD_HIT_PENALTY = 458, // NYI
SPELL_AURA_459 = 459,
SPELL_AURA_460 = 460,
SPELL_AURA_IGNORE_DUAL_WIELD_HIT_PENALTY = 458, // NYI
SPELL_AURA_IGNORE_MOVEMENT_FORCES = 459, // NYI
SPELL_AURA_RESET_COOLDOWNS_ON_DUEL_START = 460, // NYI
SPELL_AURA_461 = 461,
SPELL_AURA_462 = 462,
SPELL_AURA_CONVER_CRIT_RATING_PCT_TO_PARRY_RATING = 463, // NYI
SPELL_AURA_464 = 464,
SPELL_AURA_465 = 465,
SPELL_AURA_MOD_BONUS_ARMOR_PCT = 466, // Affects bonus armor gain from all sources except base stats
SPELL_AURA_MOD_STAT_BONUS_PCT = 467, // Affects stat gain from all sources except base stats
SPELL_AURA_468 = 468,
SPELL_AURA_MOD_HEALING_AND_ABSORB_FROM_CASTER = 462, // NYI
SPELL_AURA_CONVERT_CRIT_RATING_PCT_TO_PARRY_RATING = 463, // NYI
SPELL_AURA_MOD_ATTACK_POWER_OF_BONUS_ARMOR = 464, // NYI
SPELL_AURA_MOD_BONUS_ARMOR = 465, // NYI
SPELL_AURA_MOD_BONUS_ARMOR_PCT = 466, // Affects bonus armor gain from all sources except base stats
SPELL_AURA_MOD_STAT_BONUS_PCT = 467, // Affects stat gain from all sources except base stats
SPELL_AURA_TRIGGER_SPELL_ON_HEALTH_BELOW_PCT = 468, // Triggers spell when health falls below specified percent value (once, not every time damage is taken below threshold)
SPELL_AURA_SHOW_CONFIRMATION_PROMPT_WITH_DIFFICULTY = 469,
SPELL_AURA_470 = 470,
SPELL_AURA_MOD_VERSATILITY = 471, // NYI
+127 -77
View File
@@ -380,7 +380,7 @@ pAuraEffectHandler AuraEffectHandler[TOTAL_AURAS]=
&AuraEffect::HandleMastery, //318 SPELL_AURA_MASTERY
&AuraEffect::HandleModMeleeSpeedPct, //319 SPELL_AURA_MOD_MELEE_HASTE_3
&AuraEffect::HandleAuraModRangedHaste, //320 SPELL_AURA_MOD_RANGED_HASTE_2
&AuraEffect::HandleNULL, //321 SPELL_AURA_321
&AuraEffect::HandleAuraModNoActions, //321 SPELL_AURA_MOD_NO_ACTIONS
&AuraEffect::HandleNULL, //322 SPELL_AURA_INTERFERE_TARGETTING
&AuraEffect::HandleUnused, //323 unused (4.3.4)
&AuraEffect::HandleNULL, //324 SPELL_AURA_324
@@ -455,14 +455,14 @@ pAuraEffectHandler AuraEffectHandler[TOTAL_AURAS]=
&AuraEffect::HandleNULL, //393
&AuraEffect::HandleShowConfirmationPrompt, //394 SPELL_AURA_SHOW_CONFIRMATION_PROMPT
&AuraEffect::HandleNULL, //395 SPELL_AURA_AREA_TRIGGER
&AuraEffect::HandleNULL, //396
&AuraEffect::HandleNoImmediateEffect, //396 SPELL_AURA_PROC_ON_POWER_AMOUNT_2 implemented in Unit::HandleAuraProcOnPowerAmount
&AuraEffect::HandleNULL, //397
&AuraEffect::HandleNULL, //398
&AuraEffect::HandleNULL, //399
&AuraEffect::HandleAuraModSkill, //400 SPELL_AURA_MOD_SKILL_2
&AuraEffect::HandleNULL, //401
&AuraEffect::HandleNULL, //402
&AuraEffect::HandleNULL, //403
&AuraEffect::HandleModPowerDisplay, //402 SPELL_AURA_MOD_POWER_DISPLAY
&AuraEffect::HandleNoImmediateEffect, //403 SPELL_AURA_OVERRIDE_SPELL_VISUAL implemented in Unit::GetCastSpellXSpellVisualId
&AuraEffect::HandleOverrideAttackPowerBySpellPower, //404 SPELL_AURA_OVERRIDE_ATTACK_POWER_BY_SP_PCT
&AuraEffect::HandleNULL, //405 SPELL_AURA_MOD_RATING_PCT
&AuraEffect::HandleNULL, //406
@@ -518,16 +518,16 @@ pAuraEffectHandler AuraEffectHandler[TOTAL_AURAS]=
&AuraEffect::HandleNoImmediateEffect, //456 SPELL_AURA_CHARGE_RECOVERY_AFFECTED_BY_HASTE implemented in SpellHistory::GetChargeRecoveryTime
&AuraEffect::HandleNoImmediateEffect, //457 SPELL_AURA_CHARGE_RECOVERY_AFFECTED_BY_HASTE_REGEN implemented in SpellHistory::GetChargeRecoveryTime
&AuraEffect::HandleNULL, //458 SPELL_AURA_IGNORE_DUAL_WIELD_HIT_PENALTY
&AuraEffect::HandleNULL, //459
&AuraEffect::HandleNULL, //460
&AuraEffect::HandleNULL, //459 SPELL_AURA_IGNORE_MOVEMENT_FORCES
&AuraEffect::HandleNULL, //460 SPELL_AURA_RESET_COOLDOWNS_ON_DUEL_START
&AuraEffect::HandleNULL, //461
&AuraEffect::HandleNULL, //462
&AuraEffect::HandleNULL, //463 SPELL_AURA_CRIT_RATING_AFFECTS_PARRY used by Riposte
&AuraEffect::HandleNULL, //464
&AuraEffect::HandleNULL, //465
&AuraEffect::HandleNULL, //462 SPELL_AURA_MOD_HEALING_AND_ABSORB_FROM_CASTER
&AuraEffect::HandleNULL, //463 SPELL_AURA_CONVERT_CRIT_RATING_PCT_TO_PARRY_RATING used by Riposte
&AuraEffect::HandleNULL, //464 SPELL_AURA_MOD_ATTACK_POWER_OF_BONUS_ARMOR
&AuraEffect::HandleNULL, //465 SPELL_AURA_MOD_BONUS_ARMOR
&AuraEffect::HandleNULL, //466 SPELL_AURA_MOD_BONUS_ARMOR_PCT
&AuraEffect::HandleModStatBonusPercent, //467 SPELL_AURA_MOD_STAT_BONUS_PCT
&AuraEffect::HandleNULL, //468
&AuraEffect::HandleNULL, //468 SPELL_AURA_TRIGGER_SPELL_ON_HEALTH_BELOW_PCT
&AuraEffect::HandleShowConfirmationPrompt, //469 SPELL_AURA_SHOW_CONFIRMATION_PROMPT_WITH_DIFFICULTY
&AuraEffect::HandleNULL, //470
&AuraEffect::HandleNULL, //471 SPELL_AURA_MOD_VERSATILITY
@@ -1236,6 +1236,7 @@ void AuraEffect::HandleProc(AuraApplication* aurApp, ProcEventInfo& eventInfo)
HandleRaidProcFromChargeWithValueAuraProc(aurApp, eventInfo);
break;
case SPELL_AURA_PROC_ON_POWER_AMOUNT:
case SPELL_AURA_PROC_ON_POWER_AMOUNT_2:
HandleProcTriggerSpellOnPowerAmountAuraProc(aurApp, eventInfo);
break;
default:
@@ -1274,40 +1275,40 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const
switch (GetMiscValue())
{
case FORM_CAT:
case FORM_CAT_FORM:
spellId = 3025;
break;
case FORM_TREE:
case FORM_TREE_OF_LIFE:
spellId = 34123;
break;
case FORM_TRAVEL:
case FORM_TRAVEL_FORM:
spellId = 5419;
break;
case FORM_AQUA:
case FORM_AQUATIC_FORM:
spellId = 5421;
break;
case FORM_BEAR:
case FORM_BEAR_FORM:
spellId = 1178;
spellId2 = 21178;
break;
case FORM_BATTLESTANCE:
case FORM_BATTLE_STANCE:
spellId = 21156;
break;
case FORM_DEFENSIVESTANCE:
case FORM_DEFENSIVE_STANCE:
spellId = 7376;
break;
case FORM_BERSERKERSTANCE:
case FORM_BERSERKER_STANCE:
spellId = 7381;
break;
case FORM_MOONKIN:
case FORM_MOONKIN_FORM:
spellId = 24905;
spellId2 = 24907;
break;
case FORM_FLIGHT:
case FORM_FLIGHT_FORM:
spellId = 33948;
spellId2 = 34764;
break;
case FORM_FLIGHT_EPIC:
case FORM_FLIGHT_FORM_EPIC:
spellId = 40122;
spellId2 = 40121;
break;
@@ -1315,21 +1316,19 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const
spellId = 54817;
spellId2 = 54879;
break;
case FORM_SPIRITOFREDEMPTION:
case FORM_SPIRIT_OF_REDEMPTION:
spellId = 27792;
spellId2 = 27795; // must be second, this important at aura remove to prevent to early iterator invalidation.
break;
case FORM_SHADOW:
case FORM_SHADOWFORM:
spellId = 49868;
break;
case FORM_GHOSTWOLF:
case FORM_GHOST_WOLF:
spellId = 67116;
break;
case FORM_GHOUL:
case FORM_AMBIENT:
case FORM_STEALTH:
case FORM_CREATURECAT:
case FORM_CREATUREBEAR:
break;
default:
break;
@@ -1377,7 +1376,7 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const
switch (GetMiscValue())
{
case FORM_CAT:
case FORM_CAT_FORM:
// Savage Roar
if (target->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_DRUID, flag128(0, 0x10000000, 0)))
target->CastSpell(target, 62071, true);
@@ -1403,7 +1402,7 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const
target->CastCustomSpell(target, 48420, &bp, NULL, NULL, true);
}
break;
case FORM_BEAR:
case FORM_BEAR_FORM:
// Master Shapeshifter - Bear
if (AuraEffect const* aurEff = target->GetAuraEffect(SPELL_AURA_MOD_HEALING_DONE_PERCENT, SPELLFAMILY_GENERIC, 2851, EFFECT_0))
{
@@ -1411,7 +1410,7 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const
target->CastCustomSpell(target, 48418, &bp, NULL, NULL, true);
}
break;
case FORM_MOONKIN:
case FORM_MOONKIN_FORM:
// Master Shapeshifter - Moonkin
if (AuraEffect const* aurEff = target->GetAuraEffect(SPELL_AURA_MOD_HEALING_DONE_PERCENT, SPELLFAMILY_GENERIC, 2851, EFFECT_0))
{
@@ -1766,44 +1765,43 @@ void AuraEffect::HandleAuraModShapeshift(AuraApplication const* aurApp, uint8 mo
switch (form)
{
case FORM_CAT: // 0x01
case FORM_GHOUL: // 0x07
case FORM_CAT_FORM:
case FORM_GHOUL:
case FORM_TIGER_STANCE:
case FORM_OX_STANCE:
PowerType = POWER_ENERGY;
break;
case FORM_BEAR: // 0x05
case FORM_BEAR_FORM:
case FORM_BATTLESTANCE: // 0x11
case FORM_DEFENSIVESTANCE: // 0x12
case FORM_BERSERKERSTANCE: // 0x13
case FORM_BATTLE_STANCE:
case FORM_DEFENSIVE_STANCE:
case FORM_BERSERKER_STANCE:
PowerType = POWER_RAGE;
break;
case FORM_TREE: // 0x02
case FORM_TRAVEL: // 0x03
case FORM_AQUA: // 0x04
case FORM_AMBIENT: // 0x06
case FORM_TREE_OF_LIFE:
case FORM_TRAVEL_FORM:
case FORM_AQUATIC_FORM:
case FORM_AMBIENT:
case FORM_STEVES_GHOUL: // 0x09
case FORM_THARONJA_SKELETON: // 0x0A
case FORM_TEST_OF_STRENGTH: // 0x0B
case FORM_BLB_PLAYER: // 0x0C
case FORM_SHADOW_DANCE: // 0x0D
case FORM_CREATUREBEAR: // 0x0E
case FORM_CREATURECAT: // 0x0F
case FORM_GHOSTWOLF: // 0x10
case FORM_THARONJA_SKELETON:
case FORM_DARKMOON_TEST_OF_STRENGTH:
case FORM_BLB_PLAYER:
case FORM_SHADOW_DANCE:
case FORM_CRANE_STANCE:
case FORM_GHOST_WOLF:
case FORM_TEST: // 0x14
case FORM_ZOMBIE: // 0x15
case FORM_METAMORPHOSIS: // 0x16
case FORM_UNDEAD: // 0x19
case FORM_MASTER_ANGLER: // 0x1A
case FORM_FLIGHT_EPIC: // 0x1B
case FORM_SHADOW: // 0x1C
case FORM_FLIGHT: // 0x1D
case FORM_STEALTH: // 0x1E
case FORM_MOONKIN: // 0x1F
case FORM_SPIRITOFREDEMPTION: // 0x20
case FORM_SERPENT_STANCE:
case FORM_ZOMBIE:
case FORM_METAMORPHOSIS:
case FORM_UNDEAD:
case FORM_FLIGHT_FORM_EPIC:
case FORM_SHADOWFORM:
case FORM_FLIGHT_FORM:
case FORM_STEALTH:
case FORM_MOONKIN_FORM:
case FORM_SPIRIT_OF_REDEMPTION:
break;
default:
TC_LOG_ERROR("spells", "Auras: Unknown Shapeshift Type: %u", GetMiscValue());
@@ -1816,14 +1814,14 @@ void AuraEffect::HandleAuraModShapeshift(AuraApplication const* aurApp, uint8 mo
// remove polymorph before changing display id to keep new display id
switch (form)
{
case FORM_CAT:
case FORM_TREE:
case FORM_TRAVEL:
case FORM_AQUA:
case FORM_BEAR:
case FORM_FLIGHT_EPIC:
case FORM_FLIGHT:
case FORM_MOONKIN:
case FORM_CAT_FORM:
case FORM_TREE_OF_LIFE:
case FORM_TRAVEL_FORM:
case FORM_AQUATIC_FORM:
case FORM_BEAR_FORM:
case FORM_FLIGHT_FORM_EPIC:
case FORM_FLIGHT_FORM:
case FORM_MOONKIN_FORM:
{
// remove movement affects
target->RemoveMovementImpairingAuras();
@@ -1851,14 +1849,14 @@ void AuraEffect::HandleAuraModShapeshift(AuraApplication const* aurApp, uint8 mo
if (target->getPowerType() != PowerType)
target->setPowerType(PowerType);
if (form == FORM_CAT || form == FORM_BEAR)
if (form == FORM_CAT_FORM || form == FORM_BEAR_FORM)
{
// get furor proc chance
int32 FurorChance = 0;
if (AuraEffect const* dummy = target->GetDummyAuraEffect(SPELLFAMILY_DRUID, 238, 0))
FurorChance = std::max(dummy->GetAmount(), 0);
if (form == FORM_CAT)
if (form == FORM_CAT_FORM)
{
int32 basePoints = std::min<int32>(oldPower, FurorChance);
target->SetPower(POWER_ENERGY, 0);
@@ -1901,19 +1899,19 @@ void AuraEffect::HandleAuraModShapeshift(AuraApplication const* aurApp, uint8 mo
switch (form)
{
// Nordrassil Harness - bonus
case FORM_BEAR:
case FORM_CAT:
case FORM_BEAR_FORM:
case FORM_CAT_FORM:
if (AuraEffect* dummy = target->GetAuraEffect(37315, 0))
target->CastSpell(target, 37316, true, NULL, dummy);
break;
// Nordrassil Regalia - bonus
case FORM_MOONKIN:
case FORM_MOONKIN_FORM:
if (AuraEffect* dummy = target->GetAuraEffect(37324, 0))
target->CastSpell(target, 37325, true, NULL, dummy);
break;
case FORM_BATTLESTANCE:
case FORM_DEFENSIVESTANCE:
case FORM_BERSERKERSTANCE:
case FORM_BATTLE_STANCE:
case FORM_DEFENSIVE_STANCE:
case FORM_BERSERKER_STANCE:
{
int32 Rage_val = 0;
// Stance mastery + Tactical mastery (both passive, and last have aura only in defense stance, but need apply at any stance switch)
@@ -2409,10 +2407,10 @@ void AuraEffect::HandleAuraModSilence(AuraApplication const* aurApp, uint8 mode,
target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SILENCED);
// call functions which may have additional effects after chainging state of unit
// Stop cast only spells vs PreventionType == SPELL_PREVENTION_TYPE_SILENCE
// Stop cast only spells vs PreventionType & SPELL_PREVENTION_TYPE_SILENCE
for (uint32 i = CURRENT_MELEE_SPELL; i < CURRENT_MAX_SPELL; ++i)
if (Spell* spell = target->GetCurrentSpell(CurrentSpellTypes(i)))
if (spell->m_spellInfo->PreventionType == SPELL_PREVENTION_TYPE_SILENCE)
if (spell->m_spellInfo->PreventionType & SPELL_PREVENTION_TYPE_SILENCE)
// Stop spells on prepare or casting state
target->InterruptSpell(CurrentSpellTypes(i), false);
}
@@ -2494,6 +2492,35 @@ void AuraEffect::HandleAuraAllowOnlyAbility(AuraApplication const* aurApp, uint8
}
}
void AuraEffect::HandleAuraModNoActions(AuraApplication const* aurApp, uint8 mode, bool apply) const
{
if (!(mode & AURA_EFFECT_HANDLE_REAL))
return;
Unit* target = aurApp->GetTarget();
if (apply)
{
target->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_NO_ACTIONS);
// call functions which may have additional effects after chainging state of unit
// Stop cast only spells vs PreventionType & SPELL_PREVENTION_TYPE_SILENCE
for (uint32 i = CURRENT_MELEE_SPELL; i < CURRENT_MAX_SPELL; ++i)
if (Spell* spell = target->GetCurrentSpell(CurrentSpellTypes(i)))
if (spell->m_spellInfo->PreventionType & SPELL_PREVENTION_TYPE_NO_ACTIONS)
// Stop spells on prepare or casting state
target->InterruptSpell(CurrentSpellTypes(i), false);
}
else
{
// do not remove unit flag if there are more than this auraEffect of that kind on unit on unit
if (target->HasAuraType(SPELL_AURA_MOD_NO_ACTIONS))
return;
target->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_NO_ACTIONS);
}
}
/****************************/
/*** TRACKING ***/
/****************************/
@@ -3981,6 +4008,7 @@ void AuraEffect::HandleOverrideAttackPowerBySpellPower(AuraApplication const* au
target->ApplyModSignedFloatValue(PLAYER_FIELD_OVERRIDE_AP_BY_SPELL_POWER_PERCENT, float(m_amount), apply);
target->UpdateAttackPowerAndDamage();
target->UpdateAttackPowerAndDamage(true);
}
/********************************/
@@ -4151,6 +4179,28 @@ void AuraEffect::HandleAuraModIncreaseBaseManaPercent(AuraApplication const* aur
aurApp->GetTarget()->HandleStatModifier(UNIT_MOD_MANA, BASE_PCT, float(GetAmount()), apply);
}
void AuraEffect::HandleModPowerDisplay(AuraApplication const* aurApp, uint8 mode, bool apply) const
{
if (!(mode & AURA_EFFECT_HANDLE_REAL))
return;
PowerDisplayEntry const* powerDisplay = sPowerDisplayStore.LookupEntry(GetMiscValue());
if (!powerDisplay)
return;
Unit* target = aurApp->GetTarget();
if (target->GetPowerIndex(powerDisplay->PowerType) == MAX_POWERS)
return;
if (apply)
{
target->RemoveAurasByType(GetAuraType(), ObjectGuid::Empty, GetBase());
target->SetUInt32Value(UNIT_FIELD_OVERRIDE_DISPLAY_POWER_ID, powerDisplay->ID);
}
else
target->SetUInt32Value(UNIT_FIELD_OVERRIDE_DISPLAY_POWER_ID, 0);
}
/********************************/
/*** FIGHT ***/
/********************************/
@@ -167,6 +167,7 @@ class TC_GAME_API AuraEffect
void HandleAuraModPacify(AuraApplication const* aurApp, uint8 mode, bool apply) const;
void HandleAuraModPacifyAndSilence(AuraApplication const* aurApp, uint8 mode, bool apply) const;
void HandleAuraAllowOnlyAbility(AuraApplication const* aurApp, uint8 mode, bool apply) const;
void HandleAuraModNoActions(AuraApplication const* aurApp, uint8 mode, bool apply) const;
// tracking
void HandleAuraTrackResources(AuraApplication const* aurApp, uint8 mode, bool apply) const;
void HandleAuraTrackCreatures(AuraApplication const* aurApp, uint8 mode, bool apply) const;
@@ -247,6 +248,7 @@ class TC_GAME_API AuraEffect
void HandleAuraModIncreaseHealthPercent(AuraApplication const* aurApp, uint8 mode, bool apply) const;
void HandleAuraIncreaseBaseHealthPercent(AuraApplication const* aurApp, uint8 mode, bool apply) const;
void HandleAuraModIncreaseBaseManaPercent(AuraApplication const* aurApp, uint8 mode, bool apply) const;
void HandleModPowerDisplay(AuraApplication const* aurApp, uint8 mode, bool apply) const;
// fight
void HandleAuraModParryPercent(AuraApplication const* aurApp, uint8 mode, bool apply) const;
void HandleAuraModDodgePercent(AuraApplication const* aurApp, uint8 mode, bool apply) const;
+3 -3
View File
@@ -205,7 +205,7 @@ void AuraApplication::BuildUpdatePacket(WorldPackets::Spells::AuraInfo& auraInfo
WorldPackets::Spells::AuraDataInfo& auraData = auraInfo.AuraData.get();
auraData.CastID = aura->GetCastGUID();
auraData.SpellID = aura->GetId();
auraData.SpellXSpellVisualID = aura->GetSpellInfo()->GetSpellXSpellVisualId(_target->GetMap()->GetDifficultyID());
auraData.SpellXSpellVisualID = aura->GetSpellXSpellVisualId();
auraData.Flags = GetFlags();
if (aura->GetMaxDuration() > 0 && !(aura->GetSpellInfo()->AttributesEx5 & SPELL_ATTR5_HIDE_DURATION))
auraData.Flags |= AFLAG_DURATION;
@@ -366,7 +366,7 @@ Aura* Aura::Create(SpellInfo const* spellproto, ObjectGuid castId, uint32 effMas
Aura::Aura(SpellInfo const* spellproto, ObjectGuid castId, WorldObject* owner, Unit* caster, Item* castItem, ObjectGuid casterGUID, int32 castItemLevel) :
m_spellInfo(spellproto), m_castGuid(castId), m_casterGuid(!casterGUID.IsEmpty() ? casterGUID : caster->GetGUID()),
m_castItemGuid(castItem ? castItem->GetGUID() : ObjectGuid::Empty), m_castItemLevel(castItemLevel),
m_castItemGuid(castItem ? castItem->GetGUID() : ObjectGuid::Empty), m_castItemLevel(castItemLevel), m_spellXSpellVisualId(caster ? caster->GetCastSpellXSpellVisualId(spellproto) : spellproto->GetSpellXSpellVisualId()),
m_applyTime(time(NULL)), m_owner(owner), m_timeCla(0), m_updateTargetMapInterval(0),
m_casterLevel(caster ? caster->getLevel() : m_spellInfo->SpellLevel), m_procCharges(0), m_stackAmount(1),
m_isRemoved(false), m_isSingleTarget(false), m_isUsingCharges(false), m_dropEvent(nullptr),
@@ -525,7 +525,7 @@ void Aura::_Remove(AuraRemoveMode removeMode)
if (m_dropEvent)
{
m_dropEvent->to_Abort = true;
m_dropEvent->ScheduleAbort();
m_dropEvent = nullptr;
}
}
+2 -1
View File
@@ -134,6 +134,7 @@ class TC_GAME_API Aura
ObjectGuid GetCasterGUID() const { return m_casterGuid; }
ObjectGuid GetCastItemGUID() const { return m_castItemGuid; }
int32 GetCastItemLevel() const { return m_castItemLevel; }
uint32 GetSpellXSpellVisualId() const { return m_spellXSpellVisualId; }
Unit* GetCaster() const;
WorldObject* GetOwner() const { return m_owner; }
Unit* GetUnitOwner() const { ASSERT(GetType() == UNIT_AURA_TYPE); return (Unit*)m_owner; }
@@ -302,6 +303,7 @@ class TC_GAME_API Aura
ObjectGuid const m_casterGuid;
ObjectGuid const m_castItemGuid; // it is NOT safe to keep a pointer to the item because it may get deleted
int32 m_castItemLevel;
uint32 const m_spellXSpellVisualId;
time_t const m_applyTime;
WorldObject* const m_owner;
@@ -315,7 +317,6 @@ class TC_GAME_API Aura
uint8 m_procCharges; // Aura charges (0 for infinite)
uint8 m_stackAmount; // Aura stack amount
//AuraEffect* m_effects[3];
ApplicationMap m_applications;
bool m_isRemoved;
+86 -44
View File
@@ -591,7 +591,7 @@ m_spellValue(new SpellValue(caster->GetMap()->GetDifficultyID(), m_spellInfo)),
focusObject = NULL;
m_castId = ObjectGuid::Create<HighGuid::Cast>(SPELL_CAST_SOURCE_NORMAL, m_caster->GetMapId(), m_spellInfo->Id, m_caster->GetMap()->GenerateLowGuid<HighGuid::Cast>());
memset(m_misc.Raw.Data, 0, sizeof(m_misc.Raw.Data));
m_SpellVisual = m_spellInfo->GetSpellXSpellVisualId(caster->GetMap()->GetDifficultyID());
m_SpellVisual = caster->GetCastSpellXSpellVisualId(m_spellInfo);
m_preCastSpell = 0;
m_triggeredByAuraSpell = NULL;
m_spellAura = NULL;
@@ -4366,7 +4366,7 @@ void Spell::SendChannelStart(uint32 duration)
m_caster->SetChannelObjectGuid(channelTarget);
m_caster->SetUInt32Value(UNIT_CHANNEL_SPELL, m_spellInfo->Id);
m_caster->SetUInt32Value(UNIT_CHANNEL_SPELL_X_SPELL_VISUAL, m_spellInfo->GetSpellXSpellVisualId(m_caster->GetMap()->GetDifficultyID()));
m_caster->SetUInt32Value(UNIT_CHANNEL_SPELL_X_SPELL_VISUAL, m_SpellVisual);
}
void Spell::SendResurrectRequest(Player* target)
@@ -5657,7 +5657,7 @@ SpellCastResult Spell::CheckCasterAuras() const
Unit::AuraEffectList const& stunAuras = m_caster->GetAuraEffectsByType(SPELL_AURA_MOD_STUN);
for (Unit::AuraEffectList::const_iterator i = stunAuras.begin(); i != stunAuras.end(); ++i)
{
if ((*i)->GetSpellInfo()->GetAllEffectsMechanicMask() && !((*i)->GetSpellInfo()->GetAllEffectsMechanicMask() & (1<<MECHANIC_STUN)))
if ((*i)->GetSpellInfo()->GetAllEffectsMechanicMask() && !((*i)->GetSpellInfo()->GetAllEffectsMechanicMask() & (1 << MECHANIC_STUN)))
{
foundNotStun = true;
break;
@@ -5673,10 +5673,12 @@ SpellCastResult Spell::CheckCasterAuras() const
prevented_reason = SPELL_FAILED_CONFUSED;
else if (unitflag & UNIT_FLAG_FLEEING && !m_spellInfo->HasAttribute(SPELL_ATTR5_USABLE_WHILE_FEARED))
prevented_reason = SPELL_FAILED_FLEEING;
else if (unitflag & UNIT_FLAG_SILENCED && m_spellInfo->PreventionType == SPELL_PREVENTION_TYPE_SILENCE)
else if (unitflag & UNIT_FLAG_SILENCED && m_spellInfo->PreventionType & SPELL_PREVENTION_TYPE_SILENCE)
prevented_reason = SPELL_FAILED_SILENCED;
else if (unitflag & UNIT_FLAG_PACIFIED && m_spellInfo->PreventionType == SPELL_PREVENTION_TYPE_PACIFY)
else if (unitflag & UNIT_FLAG_PACIFIED && m_spellInfo->PreventionType & SPELL_PREVENTION_TYPE_PACIFY)
prevented_reason = SPELL_FAILED_PACIFIED;
else if (m_caster->HasFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_NO_ACTIONS) && m_spellInfo->PreventionType & SPELL_PREVENTION_TYPE_NO_ACTIONS)
prevented_reason = SPELL_FAILED_NO_ACTIONS;
// Attr must make flag drop spell totally immune from all effects
if (prevented_reason != SPELL_CAST_OK)
@@ -5722,9 +5724,9 @@ SpellCastResult Spell::CheckCasterAuras() const
case SPELL_AURA_MOD_SILENCE:
case SPELL_AURA_MOD_PACIFY:
case SPELL_AURA_MOD_PACIFY_SILENCE:
if (m_spellInfo->PreventionType == SPELL_PREVENTION_TYPE_PACIFY)
if (m_spellInfo->PreventionType & SPELL_PREVENTION_TYPE_PACIFY)
return SPELL_FAILED_PACIFIED;
else if (m_spellInfo->PreventionType == SPELL_PREVENTION_TYPE_SILENCE)
else if (m_spellInfo->PreventionType & SPELL_PREVENTION_TYPE_SILENCE)
return SPELL_FAILED_SILENCED;
break;
default: break;
@@ -5830,43 +5832,76 @@ SpellCastResult Spell::CheckRange(bool strict)
if (!strict && m_casttime == 0)
return SPELL_CAST_OK;
uint32 range_type = 0;
if (m_spellInfo->RangeEntry)
Unit* target = m_targets.GetUnitTarget();
float minRange = 0.0f;
float maxRange = 0.0f;
float rangeMod = 0.0f;
if (strict && IsNextMeleeSwingSpell())
maxRange = 100.0f;
else if (m_spellInfo->RangeEntry)
{
// check needed by 68766 51693 - both spells are cast on enemies and have 0 max range
// these are triggered by other spells - possibly we should omit range check in that case?
if (m_spellInfo->RangeIndex == 1)
return SPELL_CAST_OK;
if (m_spellInfo->RangeEntry->Flags & SPELL_RANGE_MELEE)
{
rangeMod = m_caster->GetCombatReach() + 4.0f / 3.0f;
if (target)
rangeMod += target->GetCombatReach();
else
rangeMod += m_caster->GetCombatReach();
range_type = m_spellInfo->RangeEntry->Flags;
rangeMod = std::max(rangeMod, NOMINAL_MELEE_RANGE);
}
else
{
float meleeRange = 0.0f;
if (m_spellInfo->RangeEntry->Flags & SPELL_RANGE_RANGED)
{
meleeRange = m_caster->GetCombatReach() + 4.0f / 3.0f;
if (target)
meleeRange += target->GetCombatReach();
else
meleeRange += m_caster->GetCombatReach();
meleeRange = std::max(meleeRange, NOMINAL_MELEE_RANGE);
}
minRange = m_caster->GetSpellMinRangeForTarget(target, m_spellInfo) + meleeRange;
maxRange = m_caster->GetSpellMaxRangeForTarget(target, m_spellInfo);
if (target || m_targets.GetCorpseTarget())
{
rangeMod = m_caster->GetCombatReach();
if (target)
rangeMod += target->GetCombatReach();
if (minRange > 0.0f && !(m_spellInfo->RangeEntry->Flags & SPELL_RANGE_RANGED))
minRange += rangeMod;
}
}
if (target && m_caster->isMoving() && target->isMoving() && !m_caster->IsWalking() && !target->IsWalking() &&
(m_spellInfo->RangeEntry->Flags & SPELL_RANGE_MELEE || target->GetTypeId() == TYPEID_PLAYER))
rangeMod += 5.0f / 3.0f;
}
Unit* target = m_targets.GetUnitTarget();
float max_range = m_caster->GetSpellMaxRangeForTarget(target, m_spellInfo);
float min_range = m_caster->GetSpellMinRangeForTarget(target, m_spellInfo);
if (m_spellInfo->HasAttribute(SPELL_ATTR0_REQ_AMMO) && m_caster->GetTypeId() == TYPEID_PLAYER)
if (Item* ranged = m_caster->ToPlayer()->GetWeaponForAttack(RANGED_ATTACK, true))
maxRange *= ranged->GetTemplate()->GetRangedModRange() * 0.01f;
if (Player* modOwner = m_caster->GetSpellModOwner())
modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_RANGE, max_range, this);
modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_RANGE, maxRange, this);
maxRange += rangeMod;
minRange *= minRange;
maxRange *= maxRange;
if (target && target != m_caster)
{
if (range_type == SPELL_RANGE_MELEE)
{
// Because of lag, we can not check too strictly here.
if (!m_caster->IsWithinMeleeRange(target, max_range))
return !(_triggeredCastFlags & TRIGGERED_DONT_REPORT_CAST_ERROR) ? SPELL_FAILED_OUT_OF_RANGE : SPELL_FAILED_DONT_REPORT;
}
else if (!m_caster->IsWithinCombatRange(target, max_range))
return !(_triggeredCastFlags & TRIGGERED_DONT_REPORT_CAST_ERROR) ? SPELL_FAILED_OUT_OF_RANGE : SPELL_FAILED_DONT_REPORT; //0x5A;
if (m_caster->GetExactDistSq(target) > maxRange)
return !(_triggeredCastFlags & TRIGGERED_DONT_REPORT_CAST_ERROR) ? SPELL_FAILED_OUT_OF_RANGE : SPELL_FAILED_DONT_REPORT;
if (range_type == SPELL_RANGE_RANGED)
{
if (m_caster->IsWithinMeleeRange(target))
return !(_triggeredCastFlags & TRIGGERED_DONT_REPORT_CAST_ERROR) ? SPELL_FAILED_TOO_CLOSE : SPELL_FAILED_DONT_REPORT;
}
else if (min_range && m_caster->IsWithinCombatRange(target, min_range)) // skip this check if min_range = 0
return !(_triggeredCastFlags & TRIGGERED_DONT_REPORT_CAST_ERROR) ? SPELL_FAILED_TOO_CLOSE : SPELL_FAILED_DONT_REPORT;
if (minRange > 0.0f && m_caster->GetExactDistSq(target) < minRange)
return !(_triggeredCastFlags & TRIGGERED_DONT_REPORT_CAST_ERROR) ? SPELL_FAILED_OUT_OF_RANGE : SPELL_FAILED_DONT_REPORT;
if (m_caster->GetTypeId() == TYPEID_PLAYER &&
(m_spellInfo->FacingCasterFlags & SPELL_FACING_FLAG_INFRONT) && !m_caster->HasInArc(static_cast<float>(M_PI), target))
@@ -5875,10 +5910,10 @@ SpellCastResult Spell::CheckRange(bool strict)
if (m_targets.HasDst() && !m_targets.HasTraj())
{
if (!m_caster->IsWithinDist3d(m_targets.GetDstPos(), max_range))
return SPELL_FAILED_OUT_OF_RANGE;
if (min_range && m_caster->IsWithinDist3d(m_targets.GetDstPos(), min_range))
return SPELL_FAILED_TOO_CLOSE;
if (m_caster->GetExactDistSq(m_targets.GetDstPos()) > maxRange)
return !(_triggeredCastFlags & TRIGGERED_DONT_REPORT_CAST_ERROR) ? SPELL_FAILED_OUT_OF_RANGE : SPELL_FAILED_DONT_REPORT;
if (minRange > 0.0f && m_caster->GetExactDistSq(m_targets.GetDstPos()) < minRange)
return !(_triggeredCastFlags & TRIGGERED_DONT_REPORT_CAST_ERROR) ? SPELL_FAILED_OUT_OF_RANGE : SPELL_FAILED_DONT_REPORT;
}
return SPELL_CAST_OK;
@@ -6669,7 +6704,7 @@ bool Spell::IsAutoActionResetSpell() const
bool Spell::IsNeedSendToClient() const
{
return m_spellInfo->GetSpellXSpellVisualId(m_caster->GetMap()->GetDifficultyID()) || m_spellInfo->IsChanneled() ||
return m_SpellVisual || m_spellInfo->IsChanneled() ||
(m_spellInfo->HasAttribute(SPELL_ATTR8_AURA_SEND_AMOUNT)) || m_spellInfo->Speed > 0.0f || (!m_triggeredByAuraSpell && !IsTriggered());
}
@@ -6730,8 +6765,8 @@ bool SpellEvent::Execute(uint64 e_time, uint32 p_time)
return true; // spell is deletable, finish event
}
// event will be re-added automatically at the end of routine)
} break;
break;
}
case SPELL_STATE_DELAYED:
{
// first, check, if we have just started
@@ -6781,17 +6816,24 @@ bool SpellEvent::Execute(uint64 e_time, uint32 p_time)
{
// delaying had just started, record the moment
m_Spell->SetDelayStart(e_time);
// handle effects on caster if the spell has travel time but also affects the caster in some way
if (!m_Spell->m_targets.HasDst())
{
uint64 n_offset = m_Spell->handle_delayed(0);
ASSERT(n_offset == m_Spell->GetDelayMoment());
}
// re-plan the event for the delay moment
m_Spell->GetCaster()->m_Events.AddEvent(this, e_time + m_Spell->GetDelayMoment(), false);
return false; // event not complete
}
} break;
break;
}
default:
{
// all other states
// event will be re-added automatically at the end of routine)
} break;
break;
}
}
// spell processing not complete, plan event on the next update interval
+6 -6
View File
@@ -1546,7 +1546,7 @@ void Spell::EffectPersistentAA(SpellEffIndex effIndex)
if (!caster->IsInWorld())
return;
DynamicObject* dynObj = new DynamicObject(false);
if (!dynObj->CreateDynamicObject(caster->GetMap()->GenerateLowGuid<HighGuid::DynamicObject>(), caster, m_spellInfo, *destTarget, radius, DYNAMIC_OBJECT_AREA_SPELL))
if (!dynObj->CreateDynamicObject(caster->GetMap()->GenerateLowGuid<HighGuid::DynamicObject>(), caster, m_spellInfo, *destTarget, radius, DYNAMIC_OBJECT_AREA_SPELL, m_SpellVisual))
{
delete dynObj;
return;
@@ -2387,7 +2387,7 @@ void Spell::EffectAddFarsight(SpellEffIndex /*effIndex*/)
return;
DynamicObject* dynObj = new DynamicObject(true);
if (!dynObj->CreateDynamicObject(m_caster->GetMap()->GenerateLowGuid<HighGuid::DynamicObject>(), m_caster, m_spellInfo, *destTarget, radius, DYNAMIC_OBJECT_FARSIGHT_FOCUS))
if (!dynObj->CreateDynamicObject(m_caster->GetMap()->GenerateLowGuid<HighGuid::DynamicObject>(), m_caster, m_spellInfo, *destTarget, radius, DYNAMIC_OBJECT_FARSIGHT_FOCUS, m_SpellVisual))
{
delete dynObj;
return;
@@ -2646,10 +2646,10 @@ void Spell::EffectEnchantItemTmp(SpellEffIndex effIndex)
else if (m_spellInfo->SpellFamilyName == SPELLFAMILY_SHAMAN)
duration = 3600; // 30 mins
// other cases with this SpellVisual already selected
else if (m_spellInfo->GetSpellVisual(DIFFICULTY_NONE) == 215)
else if (m_spellInfo->GetSpellVisual() == 215)
duration = 1800; // 30 mins
// some fishing pole bonuses except Glow Worm which lasts full hour
else if (m_spellInfo->GetSpellVisual(DIFFICULTY_NONE) == 563 && m_spellInfo->Id != 64401)
else if (m_spellInfo->GetSpellVisual() == 563 && m_spellInfo->Id != 64401)
duration = 600; // 10 mins
else if (m_spellInfo->Id == 29702)
duration = 300; // 5 mins
@@ -3131,7 +3131,7 @@ void Spell::EffectInterruptCast(SpellEffIndex effIndex)
// check if we can interrupt spell
if ((spell->getState() == SPELL_STATE_CASTING
|| (spell->getState() == SPELL_STATE_PREPARING && spell->GetCastTime() > 0.0f))
&& (curSpellInfo->PreventionType == SPELL_PREVENTION_TYPE_SILENCE || curSpellInfo->PreventionType == SPELL_PREVENTION_TYPE_UNK)
&& (curSpellInfo->PreventionType & SPELL_PREVENTION_TYPE_SILENCE)
&& ((i == CURRENT_GENERIC_SPELL && curSpellInfo->InterruptFlags & SPELL_INTERRUPT_FLAG_INTERRUPT)
|| (i == CURRENT_CHANNELED_SPELL && curSpellInfo->ChannelInterruptFlags & CHANNEL_INTERRUPT_FLAG_INTERRUPT)))
{
@@ -5595,7 +5595,7 @@ void Spell::EffectCreateAreaTrigger(SpellEffIndex /*effIndex*/)
uint32 triggerEntry = effectInfo->MiscValue;
AreaTrigger * areaTrigger = new AreaTrigger;
if (!areaTrigger->CreateAreaTrigger(GetCaster()->GetMap()->GenerateLowGuid<HighGuid::AreaTrigger>(), triggerEntry, GetCaster(), GetSpellInfo(), pos))
if (!areaTrigger->CreateAreaTrigger(GetCaster()->GetMap()->GenerateLowGuid<HighGuid::AreaTrigger>(), triggerEntry, GetCaster(), GetSpellInfo(), pos, m_SpellVisual))
delete areaTrigger;
}
+2 -2
View File
@@ -261,7 +261,7 @@ void SpellHistory::HandleCooldowns(SpellInfo const* spellInfo, uint32 itemID, Sp
bool SpellHistory::IsReady(SpellInfo const* spellInfo, uint32 itemId /*= 0*/, bool ignoreCategoryCooldown /*= false*/) const
{
if (spellInfo->PreventionType == SPELL_PREVENTION_TYPE_SILENCE)
if (spellInfo->PreventionType & SPELL_PREVENTION_TYPE_SILENCE)
if (IsSchoolLocked(spellInfo->GetSchoolMask()))
return false;
@@ -683,7 +683,7 @@ void SpellHistory::LockSpellSchool(SpellSchoolMask schoolMask, uint32 lockoutTim
if (spellInfo->IsCooldownStartedOnEvent())
continue;
if (spellInfo->PreventionType != SPELL_PREVENTION_TYPE_SILENCE)
if (!(spellInfo->PreventionType & SPELL_PREVENTION_TYPE_SILENCE))
continue;
if ((schoolMask & spellInfo->GetSchoolMask()) && GetRemainingCooldown(spellInfo) < lockoutTime)
+30 -52
View File
@@ -487,7 +487,7 @@ int32 SpellEffectInfo::CalcValue(Unit const* caster /*= nullptr*/, int32 const*
{
GtSpellScalingEntry const* gtScaling = sSpellScalingGameTable.GetRow(level);
if (_spellInfo->Scaling.Class > 0)
value = GetGameTableColumnForClass(gtScaling, _spellInfo->Scaling.Class);
value = GetSpellScalingColumnForClass(gtScaling, _spellInfo->Scaling.Class);
else
value = gtScaling->Item;
}
@@ -1029,6 +1029,9 @@ SpellInfo::SpellInfo(SpellInfoLoadHelper const& data, SpellEffectEntryMap const&
ActiveIconID = _misc ? _misc->ActiveIconID : 0;
_visuals = std::move(visuals);
// sort all visuals so that the ones without a condition requirement are last on the list
for (auto& visualPair : _visuals)
std::sort(visualPair.second.begin(), visualPair.second.end(), [](SpellXSpellVisualEntry const* first, SpellXSpellVisualEntry const* second) { return first->PlayerConditionID > second->PlayerConditionID; });
// SpellScalingEntry
SpellScalingEntry const* _scaling = data.Scaling;
@@ -1243,22 +1246,6 @@ bool SpellInfo::IsQuestTame() const
return effect0 && effect1 && effect0->Effect == SPELL_EFFECT_THREAT && effect1->Effect == SPELL_EFFECT_APPLY_AURA && effect1->ApplyAuraName == SPELL_AURA_DUMMY;
}
bool SpellInfo::IsProfessionOrRiding(uint32 difficulty) const
{
SpellEffectInfoVector effects = GetEffectsForDifficulty(difficulty);
for (SpellEffectInfo const* effect : effects)
{
if ((effect && effect->Effect == SPELL_EFFECT_SKILL))
{
uint32 skill = effect->MiscValue;
if (IsProfessionOrRidingSkill(skill))
return true;
}
}
return false;
}
bool SpellInfo::IsProfession(uint32 difficulty) const
{
SpellEffectInfoVector effects = GetEffectsForDifficulty(difficulty);
@@ -1296,23 +1283,6 @@ bool SpellInfo::IsPrimaryProfessionFirstRank(uint32 difficulty) const
return IsPrimaryProfession(difficulty) && GetRank() == 1;
}
bool SpellInfo::IsAbilityLearnedWithProfession() const
{
SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(Id);
for (SkillLineAbilityMap::const_iterator _spell_idx = bounds.first; _spell_idx != bounds.second; ++_spell_idx)
{
SkillLineAbilityEntry const* pAbility = _spell_idx->second;
if (!pAbility || pAbility->AquireMethod != SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE)
continue;
if (pAbility->MinSkillLineRank > 0)
return true;
}
return false;
}
bool SpellInfo::IsAbilityOfSkillType(uint32 skillType) const
{
SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(Id);
@@ -1411,12 +1381,6 @@ bool SpellInfo::IsStackableWithRanks() const
if (IsPassive())
return false;
if (IsProfessionOrRiding())
return false;
if (IsAbilityLearnedWithProfession())
return false;
// All stance spells. if any better way, change it.
SpellEffectInfoVector effects = GetEffectsForDifficulty(DIFFICULTY_NONE);
for (SpellEffectInfo const* effect : effects)
@@ -2974,32 +2938,46 @@ bool SpellInfo::IsHighRankOf(SpellInfo const* spellInfo) const
return false;
}
uint32 SpellInfo::GetSpellXSpellVisualId(Difficulty difficulty) const
uint32 SpellInfo::GetSpellXSpellVisualId(Unit const* caster /*= nullptr*/) const
{
DifficultyEntry const* difficultyEntry = sDifficultyStore.LookupEntry(difficulty);
while (difficultyEntry)
if (caster)
{
auto itr = _visuals.find(difficulty);
if (itr != _visuals.end())
for (SpellXSpellVisualEntry const* visual : itr->second)
if (!visual->PlayerConditionID)
return visual->ID;
Difficulty difficulty = caster->GetMap()->GetDifficultyID();
DifficultyEntry const* difficultyEntry = sDifficultyStore.LookupEntry(difficulty);
while (difficultyEntry)
{
auto itr = _visuals.find(difficulty);
if (itr != _visuals.end())
{
for (SpellXSpellVisualEntry const* visual : itr->second)
{
PlayerConditionEntry const* playerCondition = sPlayerConditionStore.LookupEntry(visual->PlayerConditionID);
if (!playerCondition || (caster->GetTypeId() == TYPEID_PLAYER && sConditionMgr->IsPlayerMeetingCondition(caster->ToPlayer(), playerCondition)))
return visual->ID;
}
}
difficultyEntry = sDifficultyStore.LookupEntry(difficultyEntry->FallbackDifficultyID);
difficultyEntry = sDifficultyStore.LookupEntry(difficultyEntry->FallbackDifficultyID);
}
}
auto itr = _visuals.find(DIFFICULTY_NONE);
if (itr != _visuals.end())
{
for (SpellXSpellVisualEntry const* visual : itr->second)
if (!visual->PlayerConditionID)
{
PlayerConditionEntry const* playerCondition = sPlayerConditionStore.LookupEntry(visual->PlayerConditionID);
if (!playerCondition || (caster && caster->GetTypeId() == TYPEID_PLAYER && sConditionMgr->IsPlayerMeetingCondition(caster->ToPlayer(), playerCondition)))
return visual->ID;
}
}
return 0;
}
uint32 SpellInfo::GetSpellVisual(Difficulty difficulty, Player* /*forPlayer*/ /*= nullptr*/) const
uint32 SpellInfo::GetSpellVisual(Unit const* caster /*= nullptr*/) const
{
if (SpellXSpellVisualEntry const* visual = sSpellXSpellVisualStore.LookupEntry(GetSpellXSpellVisualId(difficulty)))
if (SpellXSpellVisualEntry const* visual = sSpellXSpellVisualStore.LookupEntry(GetSpellXSpellVisualId(caster)))
{
//if (visual->SpellVisualID[1] && forPlayer->GetViolenceLevel() operator 2)
// return visual->SpellVisualID[1];
+2 -4
View File
@@ -445,11 +445,9 @@ public:
bool IsExplicitDiscovery() const;
bool IsLootCrafting() const;
bool IsQuestTame() const;
bool IsProfessionOrRiding(uint32 difficulty = DIFFICULTY_NONE) const;
bool IsProfession(uint32 difficulty = DIFFICULTY_NONE) const;
bool IsPrimaryProfession(uint32 difficulty = DIFFICULTY_NONE) const;
bool IsPrimaryProfessionFirstRank(uint32 difficulty = DIFFICULTY_NONE) const;
bool IsAbilityLearnedWithProfession() const;
bool IsAbilityOfSkillType(uint32 skillType) const;
bool IsAffectingArea(uint32 difficulty) const;
@@ -539,8 +537,8 @@ public:
bool IsDifferentRankOf(SpellInfo const* spellInfo) const;
bool IsHighRankOf(SpellInfo const* spellInfo) const;
uint32 GetSpellXSpellVisualId(Difficulty difficulty) const;
uint32 GetSpellVisual(Difficulty difficulty, Player* forPlayer = nullptr) const;
uint32 GetSpellXSpellVisualId(Unit const* caster = nullptr) const;
uint32 GetSpellVisual(Unit const* caster = nullptr) const;
// loading helpers
void _InitializeExplicitTargetMask();
+83 -125
View File
@@ -68,24 +68,24 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto)
case SPELLFAMILY_GENERIC:
{
// Entrapment -- 135373
if (spellproto->SpellIconID == 20 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 39588)
if (spellproto->SpellIconID == 20 && spellproto->GetSpellVisual() == 39588)
return DIMINISHING_ROOT;
// Intimidation -- 24394
if (spellproto->SpellIconID == 166 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 2816)
if (spellproto->SpellIconID == 166 && spellproto->GetSpellVisual() == 2816)
return DIMINISHING_STUN;
// Pulverize (Primal Earth Elemental) -- 118345
if (spellproto->SpellIconID == 4507 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 39877)
if (spellproto->SpellIconID == 4507 && spellproto->GetSpellVisual() == 39877)
return DIMINISHING_STUN;
// Static Charge (Capacitor Totem) -- 118905
if (spellproto->SpellIconID == 54 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 24442)
if (spellproto->SpellIconID == 54 && spellproto->GetSpellVisual() == 24442)
return DIMINISHING_STUN;
// Remorseless Winter -- 115001
if (spellproto->SpellIconID == 5744 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 23514)
if (spellproto->SpellIconID == 5744 && spellproto->GetSpellVisual() == 23514)
return DIMINISHING_STUN;
// Gorefiend's Grasp -- 108199
if (spellproto->SpellIconID == 5743 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 28937)
if (spellproto->SpellIconID == 5743 && spellproto->GetSpellVisual() == 28937)
return DIMINISHING_AOE_KNOCKBACK;
break;
}
@@ -150,7 +150,7 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto)
if (spellproto->SpellFamilyFlags[1] & 0x8000000)
return DIMINISHING_INCAPACITATE;
// Blood Horror -- 137143, no flags (17986)
if (spellproto->SpellIconID == 6447 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 26758)
if (spellproto->SpellIconID == 6447 && spellproto->GetSpellVisual() == 26758)
return DIMINISHING_INCAPACITATE;
// Fear -- 118699
@@ -194,11 +194,11 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto)
if (spellproto->SpellFamilyFlags[0] & 0x2000)
return DIMINISHING_STUN;
// Rake -- 163505 -- no flags on the stun, 20490
if (spellproto->SpellIconID == 494 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 38283)
if (spellproto->SpellIconID == 494 && spellproto->GetSpellVisual() == 38283)
return DIMINISHING_STUN;
// Incapacitating Roar -- 99, no flags on the stun, 14
if (spellproto->SpellIconID == 960 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 38528)
if (spellproto->SpellIconID == 960 && spellproto->GetSpellVisual() == 38528)
return DIMINISHING_INCAPACITATE;
// Cyclone -- 33786
@@ -220,7 +220,7 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto)
if (spellproto->SpellFamilyFlags[0] & 0x200)
return DIMINISHING_ROOT;
// Mass Entanglement -- 102359, no flags on the root, 13535
if (spellproto->SpellIconID == 5782 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 38269)
if (spellproto->SpellIconID == 5782 && spellproto->GetSpellVisual() == 38269)
return DIMINISHING_ROOT;
// Faerie Fire -- 770, 20 seconds in PvP (6.0)
@@ -259,14 +259,14 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto)
// return DIMINISHING_AOE_KNOCKBACK;
// Charge (Tenacity pet) -- 53148, no flags (5526)
if (spellproto->SpellIconID == 1559 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 39480)
if (spellproto->SpellIconID == 1559 && spellproto->GetSpellVisual() == 39480)
return DIMINISHING_ROOT;
// Narrow Escape -- 136634, no flags (17964)
if (spellproto->SpellIconID == 3342 && spellproto->SchoolMask == 8)
return DIMINISHING_ROOT;
// Binding Shot -- 117526, no flags (15581)
if (spellproto->SpellIconID == 4612 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 6859)
if (spellproto->SpellIconID == 4612 && spellproto->GetSpellVisual() == 6859)
return DIMINISHING_STUN;
// Freezing Trap -- 3355
@@ -313,7 +313,7 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto)
if (spellproto->SpellFamilyFlags[2] & 0x4000)
return DIMINISHING_ROOT;
// Frost Shock (with Frozen Power) -- 63685, no flags (6918)
if (spellproto->SpellIconID == 193 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 39876)
if (spellproto->SpellIconID == 193 && spellproto->GetSpellVisual() == 39876)
return DIMINISHING_ROOT;
break;
}
@@ -324,31 +324,31 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto)
return DIMINISHING_SILENCE;
// Chains of Ice (with Chilblains) -- 96294, no flags (13020)
if (spellproto->SpellIconID == 180 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 20135)
if (spellproto->SpellIconID == 180 && spellproto->GetSpellVisual() == 20135)
return DIMINISHING_ROOT;
// Asphyxiate -- 108194
if (spellproto->SpellFamilyFlags[2] & 0x100000)
return DIMINISHING_STUN;
// Gnaw (Ghoul) -- 91800, no flags (12511)
if (spellproto->SpellIconID == 3010 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 38760)
if (spellproto->SpellIconID == 3010 && spellproto->GetSpellVisual() == 38760)
return DIMINISHING_STUN;
// Monstrous Blow (Ghoul w/ Dark Transformation active) -- 91797, no flags (12510)
if (spellproto->SpellIconID == 15 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 38761)
if (spellproto->SpellIconID == 15 && spellproto->GetSpellVisual() == 38761)
return DIMINISHING_STUN;
break;
}
case SPELLFAMILY_PRIEST:
{
// Glyph of Mind Blast -- 87194, no flags (10092)
if (spellproto->SpellIconID == 2114 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 38927)
if (spellproto->SpellIconID == 2114 && spellproto->GetSpellVisual() == 38927)
return DIMINISHING_ROOT;
// Void Tendrils -- 114404, no flags (15067)
if (spellproto->SpellIconID == 5816 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 25199)
if (spellproto->SpellIconID == 5816 && spellproto->GetSpellVisual() == 25199)
return DIMINISHING_ROOT;
// Dominate Mind -- 605
if (spellproto->SpellFamilyFlags[0] & 0x20000 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 39068)
if (spellproto->SpellFamilyFlags[0] & 0x20000 && spellproto->GetSpellVisual() == 39068)
return DIMINISHING_INCAPACITATE;
// Holy Word: Chastise -- 88625
if (spellproto->SpellFamilyFlags[2] & 0x20)
@@ -369,7 +369,7 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto)
case SPELLFAMILY_MONK:
{
// Disable -- 116706, no flags (15483)
if (spellproto->SpellIconID == 23 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 39984)
if (spellproto->SpellIconID == 23 && spellproto->GetSpellVisual() == 39984)
return DIMINISHING_ROOT;
// Charging Ox Wave -- 119392
@@ -383,13 +383,13 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto)
return DIMINISHING_STUN;
// Glyph of Breath of Fire -- 123393, no flags (16504)
if (spellproto->SpellIconID == 15 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 25408)
if (spellproto->SpellIconID == 15 && spellproto->GetSpellVisual() == 25408)
return DIMINISHING_INCAPACITATE;
// Paralysis -- 115078
if (spellproto->SpellFamilyFlags[2] & 0x800000)
return DIMINISHING_INCAPACITATE;
// Ring of Peace -- 137460, no flags (18006)
if (spellproto->SpellIconID == 7195 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 39999)
if (spellproto->SpellIconID == 7195 && spellproto->GetSpellVisual() == 39999)
return DIMINISHING_INCAPACITATE;
break;
}
@@ -443,7 +443,7 @@ int32 GetDiminishingReturnsLimitDuration(SpellInfo const* spellproto)
case SPELLFAMILY_HUNTER:
{
// Binding Shot - 3 seconds in PvP (6.0)
if (spellproto->SpellIconID == 4612 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 6859)
if (spellproto->SpellIconID == 4612 && spellproto->GetSpellVisual() == 6859)
return 3 * IN_MILLISECONDS;
// Wyvern Sting - 6 seconds in PvP (6.0)
if (spellproto->SpellFamilyFlags[1] & 0x1000)
@@ -1260,113 +1260,71 @@ void SpellMgr::LoadSpellRanks()
{
uint32 oldMSTime = getMSTime();
// 0 1 2
QueryResult result = WorldDatabase.Query("SELECT first_spell_id, spell_id, rank from spell_ranks ORDER BY first_spell_id, rank");
if (!result)
std::map<uint32 /*spell*/, uint32 /*next*/> chains;
std::set<uint32> hasPrev;
for (SkillLineAbilityEntry const* skillAbility : sSkillLineAbilityStore)
{
TC_LOG_INFO("server.loading", ">> Loaded 0 spell rank records. DB table `spell_ranks` is empty.");
return;
if (!skillAbility->SupercedesSpell)
continue;
if (!GetSpellInfo(skillAbility->SupercedesSpell) || !GetSpellInfo(skillAbility->SpellID))
continue;
chains[skillAbility->SupercedesSpell] = skillAbility->SpellID;
hasPrev.insert(skillAbility->SpellID);
}
uint32 count = 0;
bool finished = false;
do
// each key in chains that isn't present in hasPrev is a first rank
for (auto itr = chains.begin(); itr != chains.end(); ++itr)
{
// spellid, rank
std::list < std::pair < int32, int32 > > rankChain;
int32 currentSpell = -1;
int32 lastSpell = -1;
// fill one chain
while (currentSpell == lastSpell && !finished)
{
Field* fields = result->Fetch();
currentSpell = fields[0].GetUInt32();
if (lastSpell == -1)
lastSpell = currentSpell;
uint32 spell_id = fields[1].GetUInt32();
uint32 rank = fields[2].GetUInt8();
// don't drop the row if we're moving to the next rank
if (currentSpell == lastSpell)
{
rankChain.push_back(std::make_pair(spell_id, rank));
if (!result->NextRow())
finished = true;
}
else
break;
}
// check if chain is made with valid first spell
SpellInfo const* first = GetSpellInfo(lastSpell);
if (!first)
{
TC_LOG_ERROR("sql.sql", "The spell rank identifier(first_spell_id) %u listed in `spell_ranks` does not exist!", lastSpell);
if (hasPrev.count(itr->first))
continue;
}
// check if chain is long enough
if (rankChain.size() < 2)
{
TC_LOG_ERROR("sql.sql", "There is only 1 spell rank for identifier(first_spell_id) %u in `spell_ranks`, entry is not needed!", lastSpell);
continue;
}
int32 curRank = 0;
bool valid = true;
// check spells in chain
for (std::list<std::pair<int32, int32> >::iterator itr = rankChain.begin(); itr!= rankChain.end(); ++itr)
{
SpellInfo const* spell = GetSpellInfo(itr->first);
if (!spell)
{
TC_LOG_ERROR("sql.sql", "The spell %u (rank %u) listed in `spell_ranks` for chain %u does not exist!", itr->first, itr->second, lastSpell);
valid = false;
break;
}
++curRank;
if (itr->second != curRank)
{
TC_LOG_ERROR("sql.sql", "The spell %u (rank %u) listed in `spell_ranks` for chain %u does not have a proper rank value (should be %u)!", itr->first, itr->second, lastSpell, curRank);
valid = false;
break;
}
}
if (!valid)
continue;
int32 prevRank = 0;
// insert the chain
std::list<std::pair<int32, int32> >::iterator itr = rankChain.begin();
do
{
++count;
int32 addedSpell = itr->first;
if (mSpellInfoMap[addedSpell]->ChainEntry)
TC_LOG_ERROR("sql.sql", "The spell %u (rank: %u, first: %u) listed in `spell_ranks` already has ChainEntry from dbc.", addedSpell, itr->second, lastSpell);
SpellInfo const* first = AssertSpellInfo(itr->first);
SpellInfo const* next = AssertSpellInfo(itr->second);
mSpellChains[addedSpell].first = GetSpellInfo(lastSpell);
mSpellChains[addedSpell].last = GetSpellInfo(rankChain.back().first);
mSpellChains[addedSpell].rank = itr->second;
mSpellChains[addedSpell].prev = GetSpellInfo(prevRank);
mSpellInfoMap[addedSpell]->ChainEntry = &mSpellChains[addedSpell];
prevRank = addedSpell;
++itr;
mSpellChains[itr->first].first = first;
mSpellChains[itr->first].prev = nullptr;
mSpellChains[itr->first].next = next;
mSpellChains[itr->first].last = next;
mSpellChains[itr->first].rank = 1;
mSpellInfoMap[itr->first]->ChainEntry = &mSpellChains[itr->first];
if (itr == rankChain.end())
mSpellChains[itr->second].first = first;
mSpellChains[itr->second].prev = first;
mSpellChains[itr->second].next = nullptr;
mSpellChains[itr->second].last = next;
mSpellChains[itr->second].rank = 2;
mSpellInfoMap[itr->second]->ChainEntry = &mSpellChains[itr->second];
uint8 rank = 3;
auto nextItr = chains.find(itr->second);
while (nextItr != chains.end())
{
SpellInfo const* prev = AssertSpellInfo(nextItr->first); // already checked in previous iteration (or above, in case this is the first one)
SpellInfo const* last = AssertSpellInfo(nextItr->second);
mSpellChains[nextItr->first].next = last;
mSpellChains[nextItr->second].first = first;
mSpellChains[nextItr->second].prev = prev;
mSpellChains[nextItr->second].next = nullptr;
mSpellChains[nextItr->second].last = last;
mSpellChains[nextItr->second].rank = rank++;
mSpellInfoMap[nextItr->second]->ChainEntry = &mSpellChains[nextItr->second];
// fill 'last'
do
{
mSpellChains[addedSpell].next = NULL;
break;
}
else
mSpellChains[addedSpell].next = GetSpellInfo(itr->first);
mSpellChains[prev->Id].last = last;
prev = mSpellChains[prev->Id].prev;
} while (prev);
nextItr = chains.find(nextItr->second);
}
while (true);
}
while (!finished);
TC_LOG_INFO("server.loading", ">> Loaded %u spell rank records in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
TC_LOG_INFO("server.loading", ">> Loaded %u spell rank records in %u ms", uint32(mSpellChains.size()), GetMSTimeDiffToNow(oldMSTime));
}
void SpellMgr::LoadSpellRequired()
@@ -1450,8 +1408,8 @@ void SpellMgr::LoadSpellLearnSkills()
if (effect && effect->Effect == SPELL_EFFECT_SKILL)
{
SpellLearnSkillNode dbc_node;
dbc_node.skill = effect->MiscValue;
dbc_node.step = effect->CalcValue();
dbc_node.skill = uint16(effect->MiscValue);
dbc_node.step = uint16(effect->CalcValue());
if (dbc_node.skill != SKILL_RIDING)
dbc_node.value = 1;
else
@@ -1677,7 +1635,7 @@ void SpellMgr::LoadSpellTargetPositions()
// target facing is in degrees for 6484 & 9268... (blizz sucks)
if (effect->PositionFacing > 2 * M_PI)
st.target_Orientation = effect->PositionFacing * M_PI / 180;
st.target_Orientation = effect->PositionFacing * float(M_PI) / 180;
else
st.target_Orientation = effect->PositionFacing;
@@ -2375,7 +2333,7 @@ void SpellMgr::LoadPetLevelupSpellMap()
if (skillLine->SkillLine != creatureFamily->SkillLine[j])
continue;
if (skillLine->AquireMethod != SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN)
if (skillLine->AcquireMethod != SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN)
continue;
SpellInfo const* spell = GetSpellInfo(skillLine->SpellID);
@@ -2936,7 +2894,7 @@ void SpellMgr::LoadSpellInfoCustomAttributes()
if (!spellInfo->_IsPositiveEffect(EFFECT_2, false))
spellInfo->AttributesCu |= SPELL_ATTR0_CU_NEGATIVE_EFF2;
if (spellInfo->GetSpellVisual(DIFFICULTY_NONE) == 3879)
if (spellInfo->GetSpellVisual() == 3879)
spellInfo->AttributesCu |= SPELL_ATTR0_CU_CONE_BACK;
if (talentSpells.count(spellInfo->Id))
@@ -3475,7 +3433,7 @@ void SpellMgr::LoadSpellInfoCorrections()
spellInfo->AuraInterruptFlags |= AURA_INTERRUPT_FLAG_CAST | AURA_INTERRUPT_FLAG_MOVE | AURA_INTERRUPT_FLAG_JUMP;
break;
case 5420: // Tree of Life (Passive)
spellInfo->Stances = UI64LIT(1) << (FORM_TREE - 1);
spellInfo->Stances = UI64LIT(1) << (FORM_TREE_OF_LIFE - 1);
break;
case 49376: // Feral Charge (Cat Form)
spellInfo->AttributesEx3 &= ~SPELL_ATTR3_CANT_TRIGGER_PROC;
@@ -3552,7 +3510,7 @@ void SpellMgr::LoadPetFamilySpellsStore()
if (skillLine->SkillLine != cFamily->SkillLine[0] && skillLine->SkillLine != cFamily->SkillLine[1])
continue;
if (skillLine->AquireMethod != SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN)
if (skillLine->AcquireMethod != SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN)
continue;
sPetFamilySpellsStore[i].insert(spellInfo->ID);
+2 -10
View File
@@ -2192,17 +2192,9 @@ public:
}
return true;
}
/*
ComeToMe command REQUIRED for 3rd party scripting library to have access to PointMovementGenerator
Without this function 3rd party scripting library will get linking errors (unresolved external)
when attempting to use the PointMovementGenerator
*/
static bool HandleComeToMeCommand(ChatHandler* handler, char const* args)
{
char const* newFlagStr = strtok((char*)args, " ");
if (!newFlagStr)
return false;
static bool HandleComeToMeCommand(ChatHandler* handler, char const* /*args*/)
{
Creature* caster = handler->getSelectedCreature();
if (!caster)
{
@@ -298,7 +298,7 @@ public:
if (Blind_Timer <= diff)
{
std::list<Unit*> targets;
SelectTargetList(targets, 5, SELECT_TARGET_RANDOM, me->GetMeleeReach()*5, true);
SelectTargetList(targets, 5, SELECT_TARGET_RANDOM, me->GetCombatReach()*5, true);
for (std::list<Unit*>::const_iterator i = targets.begin(); i != targets.end(); ++i)
if (!me->IsWithinMeleeRange(*i))
{
@@ -1366,17 +1366,6 @@ class spell_algalon_supermassive_fail : public SpellScriptLoader
}
};
class achievement_he_feeds_on_your_tears : public AchievementCriteriaScript
{
public:
achievement_he_feeds_on_your_tears() : AchievementCriteriaScript("achievement_he_feeds_on_your_tears") { }
bool OnCheck(Player* /*source*/, Unit* target) override
{
return !target->GetAI()->GetData(DATA_HAS_FED_ON_TEARS);
}
};
void AddSC_boss_algalon_the_observer()
{
new boss_algalon_the_observer();
@@ -1393,5 +1382,4 @@ void AddSC_boss_algalon_the_observer()
new spell_algalon_cosmic_smash();
new spell_algalon_cosmic_smash_damage();
new spell_algalon_supermassive_fail();
new achievement_he_feeds_on_your_tears();
}
+4 -4
View File
@@ -74,7 +74,7 @@ class spell_dru_dash : public SpellScriptLoader
void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
{
// do not set speed if not in cat form
if (GetUnitOwner()->GetShapeshiftForm() != FORM_CAT)
if (GetUnitOwner()->GetShapeshiftForm() != FORM_CAT_FORM)
amount = 0;
}
@@ -767,7 +767,7 @@ class spell_dru_savage_roar : public SpellScriptLoader
SpellCastResult CheckCast()
{
Unit* caster = GetCaster();
if (caster->GetShapeshiftForm() != FORM_CAT)
if (caster->GetShapeshiftForm() != FORM_CAT_FORM)
return SPELL_FAILED_ONLY_SHAPESHIFT;
return SPELL_CAST_OK;
@@ -889,7 +889,7 @@ class spell_dru_stampede : public SpellScriptLoader
void HandleEffectCatProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
{
PreventDefaultAction();
if (GetTarget()->GetShapeshiftForm() != FORM_CAT || eventInfo.GetDamageInfo()->GetSpellInfo()->Id != SPELL_DRUID_FERAL_CHARGE_CAT)
if (GetTarget()->GetShapeshiftForm() != FORM_CAT_FORM || eventInfo.GetDamageInfo()->GetSpellInfo()->Id != SPELL_DRUID_FERAL_CHARGE_CAT)
return;
GetTarget()->CastSpell(GetTarget(), sSpellMgr->GetSpellWithRank(SPELL_DRUID_STAMPEDE_CAT_RANK_1, GetSpellInfo()->GetRank()), true, NULL, aurEff);
@@ -899,7 +899,7 @@ class spell_dru_stampede : public SpellScriptLoader
void HandleEffectBearProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
{
PreventDefaultAction();
if (GetTarget()->GetShapeshiftForm() != FORM_BEAR || eventInfo.GetDamageInfo()->GetSpellInfo()->Id != SPELL_DRUID_FERAL_CHARGE_BEAR)
if (GetTarget()->GetShapeshiftForm() != FORM_BEAR_FORM || eventInfo.GetDamageInfo()->GetSpellInfo()->Id != SPELL_DRUID_FERAL_CHARGE_BEAR)
return;
GetTarget()->CastSpell(GetTarget(), sSpellMgr->GetSpellWithRank(SPELL_DRUID_STAMPEDE_BAER_RANK_1, GetSpellInfo()->GetRank()), true, NULL, aurEff);
+162
View File
@@ -4228,6 +4228,164 @@ class spell_gen_clear_debuffs : public SpellScriptLoader
}
};
// 169869 - Transformation Sickness
class spell_gen_decimatus_transformation_sickness : public SpellScriptLoader
{
public:
spell_gen_decimatus_transformation_sickness() : SpellScriptLoader("spell_gen_decimatus_transformation_sickness") { }
class spell_gen_decimatus_transformation_sickness_SpellScript : public SpellScript
{
PrepareSpellScript(spell_gen_decimatus_transformation_sickness_SpellScript);
void HandleScript(SpellEffIndex /*effIndex*/)
{
if (Unit* target = GetHitUnit())
target->SetHealth(target->CountPctFromMaxHealth(10));
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_gen_decimatus_transformation_sickness_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_gen_decimatus_transformation_sickness_SpellScript();
}
};
// 189491 - Summon Towering Infernal.
class spell_gen_anetheron_summon_towering_infernal : public SpellScriptLoader
{
public:
spell_gen_anetheron_summon_towering_infernal() : SpellScriptLoader("spell_gen_anetheron_summon_towering_infernal") { }
class spell_gen_anetheron_summon_towering_infernal_SpellScript : public SpellScript
{
PrepareSpellScript(spell_gen_anetheron_summon_towering_infernal_SpellScript);
void HandleDummy(SpellEffIndex /* effIndex */)
{
GetCaster()->CastSpell(GetHitUnit(), uint32(GetEffectValue()), true);
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_gen_anetheron_summon_towering_infernal_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_gen_anetheron_summon_towering_infernal_SpellScript();
}
};
enum KazrogalHellfireMark
{
SPELL_MARK_OF_KAZROGAL_HELLFIRE = 189512,
SPELL_MARK_OF_KAZROGAL_DAMAGE_HELLFIRE = 189515
};
class MarkTargetHellfireFilter
{
public:
bool operator()(WorldObject* target) const
{
if (Unit* unit = target->ToUnit())
return unit->getPowerType() != POWER_MANA;
return false;
}
};
class spell_gen_mark_of_kazrogal_hellfire : public SpellScriptLoader
{
public:
spell_gen_mark_of_kazrogal_hellfire() : SpellScriptLoader("spell_gen_mark_of_kazrogal_hellfire") { }
class spell_gen_mark_of_kazrogal_hellfire_SpellScript : public SpellScript
{
PrepareSpellScript(spell_gen_mark_of_kazrogal_hellfire_SpellScript);
void FilterTargets(std::list<WorldObject*>& targets)
{
targets.remove_if(MarkTargetHellfireFilter());
}
void Register() override
{
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_gen_mark_of_kazrogal_hellfire_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
}
};
class spell_gen_mark_of_kazrogal_hellfire_AuraScript : public AuraScript
{
PrepareAuraScript(spell_gen_mark_of_kazrogal_hellfire_AuraScript);
bool Validate(SpellInfo const* /*spell*/) override
{
if (!sSpellMgr->GetSpellInfo(SPELL_MARK_OF_KAZROGAL_DAMAGE_HELLFIRE))
return false;
return true;
}
void OnPeriodic(AuraEffect const* aurEff)
{
Unit* target = GetTarget();
if (target->GetPower(POWER_MANA) == 0)
{
target->CastSpell(target, SPELL_MARK_OF_KAZROGAL_DAMAGE_HELLFIRE, true, NULL, aurEff);
// Remove aura
SetDuration(0);
}
}
void Register() override
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_mark_of_kazrogal_hellfire_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_POWER_BURN);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_gen_mark_of_kazrogal_hellfire_SpellScript();
}
AuraScript* GetAuraScript() const override
{
return new spell_gen_mark_of_kazrogal_hellfire_AuraScript();
}
};
class spell_gen_azgalor_rain_of_fire_hellfire_citadel : public SpellScriptLoader
{
public:
spell_gen_azgalor_rain_of_fire_hellfire_citadel() : SpellScriptLoader("spell_gen_azgalor_rain_of_fire_hellfire_citadel") { }
class spell_gen_azgalor_rain_of_fire_hellfire_citadel_SpellScript : public SpellScript
{
PrepareSpellScript(spell_gen_azgalor_rain_of_fire_hellfire_citadel_SpellScript);
void HandleDummy(SpellEffIndex /* effIndex */)
{
GetCaster()->CastSpell(GetHitUnit(), uint32(GetEffectValue()), true);
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_gen_azgalor_rain_of_fire_hellfire_citadel_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_gen_azgalor_rain_of_fire_hellfire_citadel_SpellScript();
}
};
void AddSC_generic_spell_scripts()
{
new spell_gen_absorb0_hitlimit1();
@@ -4318,4 +4476,8 @@ void AddSC_generic_spell_scripts()
new spell_gen_mixology_bonus();
new spell_gen_landmine_knockback_achievement();
new spell_gen_clear_debuffs();
new spell_gen_decimatus_transformation_sickness();
new spell_gen_anetheron_summon_towering_infernal();
new spell_gen_mark_of_kazrogal_hellfire();
new spell_gen_azgalor_rain_of_fire_hellfire_citadel();
}
+178 -6
View File
@@ -28,12 +28,15 @@
enum MonkSpells
{
SPELL_MONK_CRACKLING_JADE_LIGHTNING_CHANNEL = 117952,
SPELL_MONK_CRACKLING_JADE_LIGHTNING_CHI_PROC = 123333,
SPELL_MONK_STANCE_OF_THE_SPIRITED_CRANE = 154436,
SPELL_MONK_CRACKLING_JADE_LIGHTNING_KNOCKBACK = 117962,
SPELL_MONK_CRACKLING_JADE_LIGHTNING_KNOCKBACK_CD = 117953,
SPELL_MONK_CRACKLING_JADE_LIGHTNING_CHANNEL = 117952,
SPELL_MONK_CRACKLING_JADE_LIGHTNING_CHI_PROC = 123333,
SPELL_MONK_CRACKLING_JADE_LIGHTNING_KNOCKBACK = 117962,
SPELL_MONK_CRACKLING_JADE_LIGHTNING_KNOCKBACK_CD = 117953,
SPELL_MONK_PROVOKE_SINGLE_TARGET = 116189,
SPELL_MONK_PROVOKE_AOE = 118635,
SPELL_MONK_SOOTHING_MIST = 115175,
SPELL_MONK_STANCE_OF_THE_SPIRITED_CRANE = 154436,
SPELL_MONK_SURGING_MIST_HEAL = 116995,
};
// 117952 - Crackling Jade Lightning
@@ -125,8 +128,177 @@ public:
}
};
// 115546 - Provoke
class spell_monk_provoke : public SpellScriptLoader
{
public:
spell_monk_provoke() : SpellScriptLoader("spell_monk_provoke") { }
class spell_monk_provoke_SpellScript : public SpellScript
{
PrepareSpellScript(spell_monk_provoke_SpellScript);
static uint32 const BlackOxStatusEntry = 61146;
bool Validate(SpellInfo const* spellInfo) override
{
if (!(spellInfo->GetExplicitTargetMask() & TARGET_FLAG_UNIT_MASK)) // ensure GetExplTargetUnit() will return something meaningful during CheckCast
return false;
if (!sSpellMgr->GetSpellInfo(SPELL_MONK_PROVOKE_SINGLE_TARGET))
return false;
if (!sSpellMgr->GetSpellInfo(SPELL_MONK_PROVOKE_AOE))
return false;
return true;
}
SpellCastResult CheckExplicitTarget()
{
if (GetExplTargetUnit()->GetEntry() != BlackOxStatusEntry)
{
SpellInfo const* singleTarget = sSpellMgr->AssertSpellInfo(SPELL_MONK_PROVOKE_SINGLE_TARGET);
SpellCastResult singleTargetExplicitResult = singleTarget->CheckExplicitTarget(GetCaster(), GetExplTargetUnit());
if (singleTargetExplicitResult != SPELL_CAST_OK)
return singleTargetExplicitResult;
}
else if (GetExplTargetUnit()->GetOwnerGUID() != GetCaster()->GetGUID())
return SPELL_FAILED_BAD_TARGETS;
return SPELL_CAST_OK;
}
void HandleDummy(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
if (GetHitUnit()->GetEntry() != BlackOxStatusEntry)
GetCaster()->CastSpell(GetHitUnit(), SPELL_MONK_PROVOKE_SINGLE_TARGET, true);
else
GetCaster()->CastSpell(GetHitUnit(), SPELL_MONK_PROVOKE_AOE, true);
}
void Register() override
{
OnCheckCast += SpellCheckCastFn(spell_monk_provoke_SpellScript::CheckExplicitTarget);
OnEffectHitTarget += SpellEffectFn(spell_monk_provoke_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_monk_provoke_SpellScript();
}
};
// 116694 - Surging Mist
class spell_monk_surging_mist : public SpellScriptLoader
{
public:
spell_monk_surging_mist() : SpellScriptLoader("spell_monk_surging_mist") { }
class spell_monk_surging_mist_SpellScript : public SpellScript
{
PrepareSpellScript(spell_monk_surging_mist_SpellScript);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
if (!sSpellMgr->GetSpellInfo(SPELL_MONK_SURGING_MIST_HEAL))
return false;
return true;
}
void SelectTarget(WorldObject*& target)
{
Unit* caster = GetCaster();
if (caster->GetUInt32Value(UNIT_CHANNEL_SPELL) == SPELL_MONK_SOOTHING_MIST)
if (Unit* soothingMistTarget = ObjectAccessor::GetUnit(*caster, caster->GetChannelObjectGuid()))
target = soothingMistTarget;
}
void HandleDummy(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
GetCaster()->CastSpell(GetHitUnit(), SPELL_MONK_SURGING_MIST_HEAL, true);
}
void Register() override
{
OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_monk_surging_mist_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_TARGET_ALLY);
OnEffectHitTarget += SpellEffectFn(spell_monk_surging_mist_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_monk_surging_mist_SpellScript();
}
};
// 123273 - Surging Mist (Glyphed)
class spell_monk_surging_mist_glyphed : public SpellScriptLoader
{
public:
spell_monk_surging_mist_glyphed() : SpellScriptLoader("spell_monk_surging_mist_glyphed") { }
class spell_monk_surging_mist_glyphed_SpellScript : public SpellScript
{
PrepareSpellScript(spell_monk_surging_mist_glyphed_SpellScript);
bool Validate(SpellInfo const* /*spellInfo*/) override
{
if (!sSpellMgr->GetSpellInfo(SPELL_MONK_SURGING_MIST_HEAL))
return false;
if (!sSpellMgr->GetSpellInfo(SPELL_MONK_SOOTHING_MIST))
return false;
return true;
}
void SelectTarget(std::list<WorldObject*>& targets)
{
Unit* caster = GetCaster();
if (caster->GetUInt32Value(UNIT_CHANNEL_SPELL) == SPELL_MONK_SOOTHING_MIST)
{
targets.clear();
if (Unit* soothingMistTarget = ObjectAccessor::GetUnit(*caster, caster->GetChannelObjectGuid()))
targets.push_back(soothingMistTarget);
}
else
{
targets.remove_if([caster](WorldObject* target)
{
return target->GetTypeId() != TYPEID_UNIT || !target->ToUnit()->IsInRaidWith(caster);
});
targets.sort(Trinity::HealthPctOrderPred());
if (!targets.empty())
targets.resize(1);
}
if (targets.empty())
targets.push_back(caster);
}
void HandleDummy(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
GetCaster()->CastSpell(GetHitUnit(), SPELL_MONK_SURGING_MIST_HEAL, true);
}
void Register() override
{
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_monk_surging_mist_glyphed_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
OnEffectHitTarget += SpellEffectFn(spell_monk_surging_mist_glyphed_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_monk_surging_mist_glyphed_SpellScript();
}
};
void AddSC_monk_spell_scripts()
{
new spell_monk_crackling_jade_lightning();
new spell_monk_crackling_jade_lightning_knockback_proc_aura();
new spell_monk_provoke();
new spell_monk_surging_mist();
new spell_monk_surging_mist_glyphed();
}
@@ -99,6 +99,12 @@ LogsDir = ""
# "127.0.0.1;3306;trinity;trinity;world" - (WorldDatabaseInfo)
# "127.0.0.1;3306;trinity;trinity;characters" - (CharacterDatabaseInfo)
# "127.0.0.1;3306;trinity;trinity;hotfixes" - (HotfixDatabaseInfo)
#
# Don't change hostname unless you are hosting mysql on a different machine, if you need help
# with configuration allowing to connect from diferent machine than the one running server
# search for TCE00016 on forum.
# Don't open port on firewall to external connections (it belongs to mysql, not to wow server).
# The username you choose must have permisions to create/alter/rename tables.
LoginDatabaseInfo = "127.0.0.1;3306;trinity;trinity;auth"
WorldDatabaseInfo = "127.0.0.1;3306;trinity;trinity;world"
@@ -66,7 +66,7 @@ R"({
"SigningCertificates": [
{ "RawData": "-----BEGIN CERTIFICATE-----MIIF5DCCA8ygAwIBAgIJAIgLslwk40XzMA0GCSqGSIb3DQEBCwUAMH8xCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtUcmluaXR5Q29yZTEqMCgGA1UECwwhVHJpbml0eUNvcmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MS4wLAYDVQQDDCVUcmluaXR5Q29yZSBCYXR0bGUubmV0IEF1cm9yYSBSb290IENBMB4XDTE2MDIyODEyNDkwOFoXDTM2MDIyMzEyNDkwOFowfzELMAkGA1UEBhMCVVMxFDASBgNVBAoMC1RyaW5pdHlDb3JlMSowKAYDVQQLDCFUcmluaXR5Q29yZSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxLjAsBgNVBAMMJVRyaW5pdHlDb3JlIEJhdHRsZS5uZXQgQXVyb3JhIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDGrYWvS0mVParJd96E4z/qjCvW6eR0buQ++VNEqVgeG14k4V41wkEzakB4nr2oGH10z9J/aqLlWnxaOl+yJ7BaomUAAOgJaCyqAJ8HaEU+7BbDO4MZXmtw1A3YcHsBkVx5wGm3tcH5IEXfVhvNZDqwAmYIcm7gKFgnds6RFJmRxF4WznWiRr2MQkSOr/kc2eQ2VUg5afTlTxZva/mXEVpShinvbhaMSgFBW+QahCwBJVQaLhEn+Wc6YNuHFmZ/i716xGb3cuYu89TF46iKQ/9Bm8yEFGg8QA28IZQ1sXgVpzJI9eowFtqAwhl65ipjGw4xH33of+WcwJQNjF7HXymRqk0WAa2jtXOEiShI3XDloblX7vKbAe9RFpfVIqT8UfKSOJGQDVzvl4wSihINshO7YgIqp97MGnWtnlWCDb2mcSj8JjnzRjG2kZZCNR/2lgfCG/1VF+QLh/3vD2+N5YkJZqBK1JTFFx+p66lVQWfdh2MXPlGjat343HZGm0YR7nRjngO2j3YtTojdJxRfLgztQv94jMtWPHE38ysUK7mS6KKqYXqyB19IOHL2QB8fjmON1hCd0wDW42ZB23ywNkASw6uJDR02xXN2wiynIIb3cz6zouXd60wC7utMTveq8+rhFFgmFDdI2o9gwWQPA/43OYIlAdKVg2NRhXb/6bzFkwIDAQABo2MwYTAdBgNVHQ4EFgQUEt6gxhfmHEc7rBOqHJEfNkzGv3MwHwYDVR0jBBgwFoAUEt6gxhfmHEc7rBOqHJEfNkzGv3MwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBAFzCJkcDCPVMal+Thlip26LPkszZ4zWTsNsbUYmSe7h0kmMWt4x3mmZITfwb/eysYCnHThBVTjXj9VWBGfbECZ/xdyXC2ur+qp0Mm7xH2Wuswf7yfPC+USNO6+/tFS282FO/nM0quaKVknOC8ioCoASsBICB9lwRoYRKNBwRn3pkJplHepGahaJez4eedujO3dzxDdD32zy2/AfdeFXTxhWY8PTjMBKC2zpUQD7Kdvl+D8SfIsq73b8a9XmhdNX7qTc6MjecCD7WHAP2rrK7epjTaVJp4+PYlw7qfix/NT1fNkq2Mb2E77h2eToUG1mjs/mvG/4WfVCfMaBHOKaw6fyZULf366Jbx02r8K05P5ouvS1Z0De1mZJuUEUYhTRSs2POIdrmVrn9R83Y4l7TKNPJelq2uyEc4r+/fRrerIlT4HVlLPTC3SdW8ytYSUZXx+1NfJfQimieveIyIaTOV3SfC4EfeXtPtUpcVJvmFXqVbnXOO7bQU63bfFuuVSeU6OXWjoFRVkdHNYTGUGb5xg4hgWqlLWvWg0WPgLLabMbetrP6c5/Qhml/l07nJHeLoVxlFuwsL8HGeu0JWqnmwamp4/mmblRC9UfyrIQeDS8gsx8q/t2zdzT4bBph0nqYkZSyiIoQzlMrYdrWxeJm3sReR0G3FluL+03TGJypGfhr-----END CERTIFICATE-----" }
]
};inserting_dummy_signature_inserting_dummy_signature_inserting_dummy_signature_inserting_dummy_signature_inserting_dummy_signature_inserting_dummy_signature_inserting_dummy_signature_inserting_dummy_signature_inserting_dummy_signature_inserting_dummy_signature)";
}NGISerting_dummy_signature_inserting_dummy_signature_inserting_dummy_signature_inserting_dummy_signature_inserting_dummy_signature_inserting_dummy_signature_inserting_dummy_signature_inserting_dummy_signature_inserting_dummy_signature_inserting_dummy_signature)";
}
};
}