aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--README.md2
-rw-r--r--cmake/options.cmake14
-rw-r--r--pull_request_template.md2
-rw-r--r--sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_11.sql13
-rw-r--r--sql/updates/hotfixes/6.x/2016_06_21_00_hotfixes.sql27
-rw-r--r--sql/updates/world/3.3.5/2016_07_05_02_world.sql1
-rw-r--r--sql/updates/world/6.x/2016_06_14_00_world.sql26
-rw-r--r--sql/updates/world/6.x/2016_06_15_00_world.sql8
-rw-r--r--sql/updates/world/6.x/2016_06_15_01_world.sql50
-rw-r--r--sql/updates/world/6.x/2016_06_15_02_world.sql14
-rw-r--r--sql/updates/world/6.x/2016_06_15_03_world.sql6
-rw-r--r--sql/updates/world/6.x/2016_06_15_04_world.sql6
-rw-r--r--sql/updates/world/6.x/2016_06_15_05_world.sql4
-rw-r--r--sql/updates/world/6.x/2016_06_15_06_world.sql1
-rw-r--r--sql/updates/world/6.x/2016_06_15_07_world.sql3
-rw-r--r--sql/updates/world/6.x/2016_06_15_08_world.sql13
-rw-r--r--sql/updates/world/6.x/2016_06_16_00_world.sql16
-rw-r--r--sql/updates/world/6.x/2016_06_17_00_world.sql2
-rw-r--r--sql/updates/world/6.x/2016_06_17_01_world.sql3
-rw-r--r--sql/updates/world/6.x/2016_06_19_00_world.sql2
-rw-r--r--sql/updates/world/6.x/2016_06_19_01_world.sql1
-rw-r--r--sql/updates/world/6.x/2016_06_20_00_world.sql2
-rw-r--r--sql/updates/world/6.x/2016_06_20_01_world.sql1431
-rw-r--r--sql/updates/world/6.x/2016_06_20_02_world.sql320
-rw-r--r--sql/updates/world/6.x/2016_06_23_00_world.sql5
-rw-r--r--sql/updates/world/6.x/2016_06_23_01_world.sql2
-rw-r--r--sql/updates/world/6.x/2016_06_23_02_world.sql3
-rw-r--r--sql/updates/world/6.x/2016_06_25_00_world.sql2
-rw-r--r--sql/updates/world/6.x/2016_06_26_00_world.sql3
-rw-r--r--sql/updates/world/6.x/2016_06_28_00_world.sql2
-rw-r--r--sql/updates/world/6.x/2016_06_28_01_world.sql2
-rw-r--r--sql/updates/world/6.x/2016_06_30_00_world.sql2
-rw-r--r--sql/updates/world/6.x/2016_07_05_00_world.sql33
-rw-r--r--src/common/GitRevision.cpp31
-rw-r--r--src/common/Utilities/EventProcessor.cpp80
-rw-r--r--src/common/Utilities/EventProcessor.h36
-rw-r--r--src/server/database/Database/Implementation/CharacterDatabase.cpp2
-rw-r--r--src/server/database/Database/Implementation/HotfixDatabase.cpp9
-rw-r--r--src/server/database/Database/Implementation/HotfixDatabase.h4
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp2
-rw-r--r--src/server/game/Achievements/CriteriaHandler.cpp85
-rw-r--r--src/server/game/Achievements/CriteriaHandler.h2
-rw-r--r--src/server/game/Battlegrounds/Battleground.cpp2
-rw-r--r--src/server/game/DataStores/DB2Stores.cpp16
-rw-r--r--src/server/game/DataStores/DB2Stores.h11
-rw-r--r--src/server/game/DataStores/DB2Structure.h19
-rw-r--r--src/server/game/DataStores/DBCEnums.h21
-rw-r--r--src/server/game/DataStores/GameTables.h49
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.cpp18
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.h3
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp8
-rw-r--r--src/server/game/Entities/DynamicObject/DynamicObject.cpp11
-rw-r--r--src/server/game/Entities/DynamicObject/DynamicObject.h3
-rw-r--r--src/server/game/Entities/Item/Item.cpp37
-rw-r--r--src/server/game/Entities/Item/ItemTemplate.h1
-rw-r--r--src/server/game/Entities/Player/Player.cpp82
-rw-r--r--src/server/game/Entities/Player/Player.h4
-rw-r--r--src/server/game/Entities/Unit/StatSystem.cpp33
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp58
-rw-r--r--src/server/game/Entities/Unit/Unit.h70
-rw-r--r--src/server/game/Entities/Vehicle/Vehicle.cpp10
-rw-r--r--src/server/game/Handlers/BattlenetHandler.cpp1
-rw-r--r--src/server/game/Handlers/ItemHandler.cpp62
-rw-r--r--src/server/game/Loot/LootMgr.cpp1
-rw-r--r--src/server/game/Loot/LootMgr.h3
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h7
-rw-r--r--src/server/game/Scripting/ScriptMgr.cpp4
-rw-r--r--src/server/game/Server/Packets/ItemPackets.cpp23
-rw-r--r--src/server/game/Server/Packets/ItemPackets.h24
-rw-r--r--src/server/game/Server/Packets/SpellPackets.cpp18
-rw-r--r--src/server/game/Server/Packets/SpellPackets.h12
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp5
-rw-r--r--src/server/game/Server/Protocol/Opcodes.h1
-rw-r--r--src/server/game/Server/WorldSession.h2
-rw-r--r--src/server/game/Spells/Auras/SpellAuraDefines.h26
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp208
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.h2
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.cpp6
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.h3
-rw-r--r--src/server/game/Spells/Spell.cpp130
-rw-r--r--src/server/game/Spells/SpellEffects.cpp12
-rw-r--r--src/server/game/Spells/SpellHistory.cpp4
-rw-r--r--src/server/game/Spells/SpellInfo.cpp82
-rw-r--r--src/server/game/Spells/SpellInfo.h6
-rw-r--r--src/server/game/Spells/SpellMgr.cpp212
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp12
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp2
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp12
-rw-r--r--src/server/scripts/Spells/spell_druid.cpp8
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp162
-rw-r--r--src/server/scripts/Spells/spell_monk.cpp184
-rw-r--r--src/server/worldserver/worldserver.conf.dist6
-rw-r--r--src/tools/connection_patcher/Patches/Common.hpp2
94 files changed, 3401 insertions, 570 deletions
diff --git a/.gitignore b/.gitignore
index 9378a13bf11..48fa31fa9d2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -17,3 +17,4 @@ CMakeLists.txt.user
*.BASE.*
*.LOCAL.*
nbproject/*
+.idea/*
diff --git a/README.md b/README.md
index 91ef8181336..53712f2a465 100644
--- a/README.md
+++ b/README.md
@@ -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)
diff --git a/cmake/options.cmake b/cmake/options.cmake
index 93e51141207..09efc3db08b 100644
--- a/cmake/options.cmake
+++ b/cmake/options.cmake
@@ -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)
diff --git a/pull_request_template.md b/pull_request_template.md
index bd2f058c1fd..50446db2645 100644
--- a/pull_request_template.md
+++ b/pull_request_template.md
@@ -6,7 +6,7 @@
**Target branch(es)**: 335/6x
-**Issues addressed**: Fixes #
+**Issues addressed**: Closes #
**Tests performed**: (Does it build, tested in-game, etc)
diff --git a/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_11.sql b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_11.sql
new file mode 100644
index 00000000000..ac0e9d5a81b
--- /dev/null
+++ b/sql/updates/hotfixes/2016_xx_xx_xx_hotfixes_legion_11.sql
@@ -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';
diff --git a/sql/updates/hotfixes/6.x/2016_06_21_00_hotfixes.sql b/sql/updates/hotfixes/6.x/2016_06_21_00_hotfixes.sql
new file mode 100644
index 00000000000..e2ca7d2ce65
--- /dev/null
+++ b/sql/updates/hotfixes/6.x/2016_06_21_00_hotfixes.sql
@@ -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;
diff --git a/sql/updates/world/3.3.5/2016_07_05_02_world.sql b/sql/updates/world/3.3.5/2016_07_05_02_world.sql
new file mode 100644
index 00000000000..2921c19b0c1
--- /dev/null
+++ b/sql/updates/world/3.3.5/2016_07_05_02_world.sql
@@ -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';
diff --git a/sql/updates/world/6.x/2016_06_14_00_world.sql b/sql/updates/world/6.x/2016_06_14_00_world.sql
new file mode 100644
index 00000000000..4f597165174
--- /dev/null
+++ b/sql/updates/world/6.x/2016_06_14_00_world.sql
@@ -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'");
diff --git a/sql/updates/world/6.x/2016_06_15_00_world.sql b/sql/updates/world/6.x/2016_06_15_00_world.sql
new file mode 100644
index 00000000000..cd2de3f62ff
--- /dev/null
+++ b/sql/updates/world/6.x/2016_06_15_00_world.sql
@@ -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');
diff --git a/sql/updates/world/6.x/2016_06_15_01_world.sql b/sql/updates/world/6.x/2016_06_15_01_world.sql
new file mode 100644
index 00000000000..a24ec70a972
--- /dev/null
+++ b/sql/updates/world/6.x/2016_06_15_01_world.sql
@@ -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);
diff --git a/sql/updates/world/6.x/2016_06_15_02_world.sql b/sql/updates/world/6.x/2016_06_15_02_world.sql
new file mode 100644
index 00000000000..830b14012c0
--- /dev/null
+++ b/sql/updates/world/6.x/2016_06_15_02_world.sql
@@ -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');
diff --git a/sql/updates/world/6.x/2016_06_15_03_world.sql b/sql/updates/world/6.x/2016_06_15_03_world.sql
new file mode 100644
index 00000000000..f1b024e2d30
--- /dev/null
+++ b/sql/updates/world/6.x/2016_06_15_03_world.sql
@@ -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);
diff --git a/sql/updates/world/6.x/2016_06_15_04_world.sql b/sql/updates/world/6.x/2016_06_15_04_world.sql
new file mode 100644
index 00000000000..be66984e8e0
--- /dev/null
+++ b/sql/updates/world/6.x/2016_06_15_04_world.sql
@@ -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);
diff --git a/sql/updates/world/6.x/2016_06_15_05_world.sql b/sql/updates/world/6.x/2016_06_15_05_world.sql
new file mode 100644
index 00000000000..7e833b44ea8
--- /dev/null
+++ b/sql/updates/world/6.x/2016_06_15_05_world.sql
@@ -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');
diff --git a/sql/updates/world/6.x/2016_06_15_06_world.sql b/sql/updates/world/6.x/2016_06_15_06_world.sql
new file mode 100644
index 00000000000..6d63a4ca441
--- /dev/null
+++ b/sql/updates/world/6.x/2016_06_15_06_world.sql
@@ -0,0 +1 @@
+DROP TABLE IF EXISTS `spell_ranks`;
diff --git a/sql/updates/world/6.x/2016_06_15_07_world.sql b/sql/updates/world/6.x/2016_06_15_07_world.sql
new file mode 100644
index 00000000000..cc6aa2db566
--- /dev/null
+++ b/sql/updates/world/6.x/2016_06_15_07_world.sql
@@ -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;
diff --git a/sql/updates/world/6.x/2016_06_15_08_world.sql b/sql/updates/world/6.x/2016_06_15_08_world.sql
new file mode 100644
index 00000000000..1a7d606352f
--- /dev/null
+++ b/sql/updates/world/6.x/2016_06_15_08_world.sql
@@ -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);
diff --git a/sql/updates/world/6.x/2016_06_16_00_world.sql b/sql/updates/world/6.x/2016_06_16_00_world.sql
new file mode 100644
index 00000000000..49d6c2debd4
--- /dev/null
+++ b/sql/updates/world/6.x/2016_06_16_00_world.sql
@@ -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);
diff --git a/sql/updates/world/6.x/2016_06_17_00_world.sql b/sql/updates/world/6.x/2016_06_17_00_world.sql
new file mode 100644
index 00000000000..af5e1dca844
--- /dev/null
+++ b/sql/updates/world/6.x/2016_06_17_00_world.sql
@@ -0,0 +1,2 @@
+--
+UPDATE `creature_template` SET `npcflag`=`npcflag` &~2 WHERE `entry` IN (16521, 16522);
diff --git a/sql/updates/world/6.x/2016_06_17_01_world.sql b/sql/updates/world/6.x/2016_06_17_01_world.sql
new file mode 100644
index 00000000000..e5bc16000ce
--- /dev/null
+++ b/sql/updates/world/6.x/2016_06_17_01_world.sql
@@ -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');
diff --git a/sql/updates/world/6.x/2016_06_19_00_world.sql b/sql/updates/world/6.x/2016_06_19_00_world.sql
new file mode 100644
index 00000000000..e125222ebf3
--- /dev/null
+++ b/sql/updates/world/6.x/2016_06_19_00_world.sql
@@ -0,0 +1,2 @@
+--
+UPDATE `creature_template` SET `npcflag`=`npcflag` &~2 WHERE `entry` IN (3101);
diff --git a/sql/updates/world/6.x/2016_06_19_01_world.sql b/sql/updates/world/6.x/2016_06_19_01_world.sql
new file mode 100644
index 00000000000..8b139241f60
--- /dev/null
+++ b/sql/updates/world/6.x/2016_06_19_01_world.sql
@@ -0,0 +1 @@
+ALTER TABLE `playercreateinfo_cast_spell` ADD PRIMARY KEY(`raceMask`, `classMask`, `spell`);
diff --git a/sql/updates/world/6.x/2016_06_20_00_world.sql b/sql/updates/world/6.x/2016_06_20_00_world.sql
new file mode 100644
index 00000000000..0a24574d5b6
--- /dev/null
+++ b/sql/updates/world/6.x/2016_06_20_00_world.sql
@@ -0,0 +1,2 @@
+--
+UPDATE `creature_template` SET `flags_extra`=`flags_extra`|128|2 WHERE `entry` IN (35010,35011,35830);
diff --git a/sql/updates/world/6.x/2016_06_20_01_world.sql b/sql/updates/world/6.x/2016_06_20_01_world.sql
new file mode 100644
index 00000000000..35c5bf01c16
--- /dev/null
+++ b/sql/updates/world/6.x/2016_06_20_01_world.sql
@@ -0,0 +1,1431 @@
+--
+-- Felwood (Zone 361) Ore spawns
+SET @LASTGUID := 173;
+SET @OGUID1 := 234355;
+SET @OGUID2 := @OGUID1 + (@LASTGUID + 1);
+SET @OGUID3 := @OGUID2 + (@LASTGUID + 1);
+SET @POOL := 361001; -- 174 pooled
+SET @MOTHER := 36101;
+SET @ACTIVE := 66; -- Max number of active spawns
+SET @TIMER := 30; -- Respawn timer in seconds
+
+DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID1 AND @OGUID1+@LASTGUID;
+DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID2 AND @OGUID2+@LASTGUID;
+DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID3 AND @OGUID3+@LASTGUID;
+INSERT INTO `gameobject` (`guid`, `id`, `map`, `spawnMask`, `PhaseId`, `PhaseGroup`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`) VALUES
+-- Mithril Deposits
+(@OGUID1+0,2040,1,1,1,0,3518.36,-1096.71,230.29,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+1,2040,1,1,1,0,3532.12,-1080.09,234.065,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+2,2040,1,1,1,0,3555.23,-1051.94,241.666,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+3,2040,1,1,1,0,3595.66,-1205.04,227.842,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+4,2040,1,1,1,0,3595.67,-993.8,233.478,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+5,2040,1,1,1,0,3612.46,-935.637,297.772,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+6,2040,1,1,1,0,3646.68,-1379.49,224.298,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+7,2040,1,1,1,0,3674.1,-1247.69,231.801,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+8,2040,1,1,1,0,3688.55,-947.625,297.762,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+9,2040,1,1,1,0,3701.43,-1354.14,233.103,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+10,2040,1,1,1,0,3719.78,-885.641,334.797,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+11,2040,1,1,1,0,3724.96,-808.394,343.181,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+12,2040,1,1,1,0,3741.6,-1266.94,219.244,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+13,2040,1,1,1,0,3742.2,-1698.85,272.017,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+14,2040,1,1,1,0,3769.26,-1731.45,281.997,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+15,2040,1,1,1,0,3769.4,-864.252,311.543,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+16,2040,1,1,1,0,3778.65,-722.302,351.5,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+17,2040,1,1,1,0,3794.74,-719.337,342.173,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+18,2040,1,1,1,0,3813.47,-1754.63,300.244,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+19,2040,1,1,1,0,3816.61,-936.957,270.896,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+20,2040,1,1,1,0,3818.71,-688.347,341.798,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+21,2040,1,1,1,0,3831.14,-661.13,339.622,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+22,2040,1,1,1,0,3838.67,-1729.82,284.623,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+23,2040,1,1,1,0,3852.45,-923.967,285.531,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+24,2040,1,1,1,0,3904.94,-733.469,326.517,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+25,2040,1,1,1,0,3909.45,-821.382,327.248,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+26,2040,1,1,1,0,3922.89,-1479.14,232.244,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+27,2040,1,1,1,0,3923.16,-786.628,321.315,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+28,2040,1,1,1,0,3923.49,-1648.37,284.106,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+29,2040,1,1,1,0,3931.29,-677.875,338.391,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+30,2040,1,1,1,0,3939.84,-724.755,303.409,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+31,2040,1,1,1,0,3942.22,-569.201,352.489,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+32,2040,1,1,1,0,3965.01,-722.538,297.317,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+33,2040,1,1,1,0,3967.32,-1537.2,271.055,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+34,2040,1,1,1,0,3968.31,-688.894,328.956,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+35,2040,1,1,1,0,3975.79,-1488.68,266.003,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+36,2040,1,1,1,0,4025.35,-607.109,339.809,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+37,2040,1,1,1,0,4026.89,-715.2,290.555,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+38,2040,1,1,1,0,4072.45,-644.082,304.451,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+39,2040,1,1,1,0,4142.32,-1208.18,313.861,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+40,2040,1,1,1,0,4164.01,-1181.65,315.052,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+41,2040,1,1,1,0,4204.95,-1193.75,327.289,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+42,2040,1,1,1,0,4270.48,-493.052,314.379,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+43,2040,1,1,1,0,4293.27,-671.332,296.312,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+44,2040,1,1,1,0,4305.38,-1110.16,339.926,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+45,2040,1,1,1,0,4327.34,-1089.69,344.662,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+46,2040,1,1,1,0,4476.36,-446.014,329.234,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+47,2040,1,1,1,0,4499.75,-403.543,344.001,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+48,2040,1,1,1,0,4509.84,-1013.56,353.013,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+49,2040,1,1,1,0,4538.48,-399.399,318.674,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+50,2040,1,1,1,0,4595.53,-420.356,331.271,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+51,2040,1,1,1,0,4606.84,-459.365,319.505,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+52,2040,1,1,1,0,4617.51,-587.194,294.599,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+53,2040,1,1,1,0,4661.36,-930.628,349.474,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+54,2040,1,1,1,0,4667.22,-724.479,301.801,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+55,2040,1,1,1,0,4680.24,-881.153,349.374,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+56,2040,1,1,1,0,4704.11,-949.054,364.112,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+57,2040,1,1,1,0,4709.69,-738.403,314.423,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+58,2040,1,1,1,0,4749.24,-722.13,310.143,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+59,2040,1,1,1,0,4776.74,-837.42,333.643,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+60,2040,1,1,1,0,4792.78,-803.882,317.419,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+61,2040,1,1,1,0,4821.81,-671.188,312.993,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+62,2040,1,1,1,0,4839.51,-812.58,319.261,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+63,2040,1,1,1,0,4857.02,-419.045,367.752,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+64,2040,1,1,1,0,4888.34,-807.721,305.402,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+65,2040,1,1,1,0,4890.75,-353.943,369.361,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+66,2040,1,1,1,0,4977.67,-790.019,326.817,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+67,2040,1,1,1,0,4989.58,-519.306,350.89,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+68,2040,1,1,1,0,5093.99,-815.09,352.615,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+69,2040,1,1,1,0,5123.59,-808.363,352.909,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+70,2040,1,1,1,0,5155.09,-529.038,344.48,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+71,2040,1,1,1,0,5186.75,-801.981,359.166,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+72,2040,1,1,1,0,5273.65,-901.323,370.16,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+73,2040,1,1,1,0,5293.68,-915.602,383.933,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+74,2040,1,1,1,0,5298.8,-483.415,345.655,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+75,2040,1,1,1,0,5326.76,-941.991,384.361,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+76,2040,1,1,1,0,5354.51,-945.491,384.49,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+77,2040,1,1,1,0,5377.76,-970.936,388.505,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+78,2040,1,1,1,0,5410.82,-963.049,389.923,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+79,2040,1,1,1,0,5442.81,-508.226,379.438,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+80,2040,1,1,1,0,5473.56,-1028.85,388.938,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+81,2040,1,1,1,0,5488.17,-500.201,378.676,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+82,2040,1,1,1,0,5522.06,-1031.1,387.649,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+83,2040,1,1,1,0,5542.26,-1039.36,394.232,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+84,2040,1,1,1,0,5589.41,-498.7,384.993,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+85,2040,1,1,1,0,5596.71,-1155.65,408.308,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+86,2040,1,1,1,0,5626.65,-1160.9,401.451,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+87,2040,1,1,1,0,5649.58,-1166.41,403.607,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+88,2040,1,1,1,0,5689.34,-1185.81,408.171,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+89,2040,1,1,1,0,5718.74,-1211.69,434.88,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+90,2040,1,1,1,0,5753.47,-1190.98,407.722,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+91,2040,1,1,1,0,5847.39,-1348.74,455.415,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+92,2040,1,1,1,0,5852.26,-1267.06,423.101,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+93,2040,1,1,1,0,5869.19,-1315.33,421.243,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+94,2040,1,1,1,0,5875.35,-606.835,406.306,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+95,2040,1,1,1,0,5958.91,-1412.89,444.033,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+96,2040,1,1,1,0,5989.43,-619.717,410.86,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+97,2040,1,1,1,0,6009.19,-658.227,406.552,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+98,2040,1,1,1,0,6017.37,-1488.13,451.171,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+99,2040,1,1,1,0,6048.66,-1597.7,492.117,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+100,2040,1,1,1,0,6052.97,-1573.89,476.19,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+101,2040,1,1,1,0,6112.73,-1036.49,405.857,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+102,2040,1,1,1,0,6127.9,-688.844,420.179,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+103,2040,1,1,1,0,6138.25,-1024.62,401.109,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+104,2040,1,1,1,0,6151.11,-1796.5,552.678,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+105,2040,1,1,1,0,6179.23,-974.965,405.433,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+106,2040,1,1,1,0,6181.83,-1417.01,403.935,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+107,2040,1,1,1,0,6201.63,-1760.22,538.785,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+108,2040,1,1,1,0,6224.72,-649.944,426.282,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+109,2040,1,1,1,0,6248.72,-2052.01,610.663,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+110,2040,1,1,1,0,6252.74,-679.368,437.375,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+111,2040,1,1,1,0,6258.6,-769.642,427.735,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+112,2040,1,1,1,0,6267.66,-707.227,432.376,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+113,2040,1,1,1,0,6305.11,-1468.17,394.291,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+114,2040,1,1,1,0,6336.31,-651.368,496.393,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+115,2040,1,1,1,0,6344.4,-617.972,483.824,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+116,2040,1,1,1,0,6347.32,-660.427,487.705,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+117,2040,1,1,1,0,6362.56,-1440.67,387.155,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+118,2040,1,1,1,0,6523.49,-2018.68,571.073,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+119,2040,1,1,1,0,6547,-780.592,484.607,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+120,2040,1,1,1,0,6556.96,-1829.11,540.269,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+121,2040,1,1,1,0,6572.51,-927.887,497.34,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+122,2040,1,1,1,0,6573.16,-1792.3,550.087,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+123,2040,1,1,1,0,6575.55,-778.285,483.815,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+124,2040,1,1,1,0,6582.12,-899.059,483.995,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+125,2040,1,1,1,0,6592.13,-1953.67,560.754,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+126,2040,1,1,1,0,6616.44,-1018.3,483.959,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+127,2040,1,1,1,0,6634.33,-936.304,492.336,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+128,2040,1,1,1,0,6651.69,-1685.27,497.607,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+129,2040,1,1,1,0,6654.5,-1200.41,473.482,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+130,2040,1,1,1,0,6679.9,-1999.93,554.918,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+131,2040,1,1,1,0,6682.84,-1218.41,475.421,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+132,2040,1,1,1,0,6684.67,-2043.19,571.531,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+133,2040,1,1,1,0,6695.35,-1668.53,506.223,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+134,2040,1,1,1,0,6696.96,-1357.71,493.868,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+135,2040,1,1,1,0,6715.46,-1377.59,491.777,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+136,2040,1,1,1,0,6720.77,-1282.89,492.925,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+137,2040,1,1,1,0,6741.15,-1987.21,555.494,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+138,2040,1,1,1,0,6751.67,-1528.59,496.243,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+139,2040,1,1,1,0,6774.01,-2034.64,576.012,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+140,2040,1,1,1,0,6789.58,-1966.37,556.149,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+141,2040,1,1,1,0,6807.13,-1763.37,621.515,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+142,2040,1,1,1,0,6855.63,-1545.64,510.091,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+143,2040,1,1,1,0,6883.95,-1969.92,573.449,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+144,2040,1,1,1,0,6890.68,-1780.24,590.574,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+145,2040,1,1,1,0,6893.74,-1637.91,507.892,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+146,2040,1,1,1,0,6910.06,-1923.74,582.433,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+147,2040,1,1,1,0,6918.18,-2045.36,596.652,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+148,2040,1,1,1,0,6925.78,-1579.02,518.463,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+149,2040,1,1,1,0,6926.55,-1785.23,586.29,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+150,2040,1,1,1,0,6957.56,-1994.14,610.338,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+151,2040,1,1,1,0,6255.08,-1719.68,432.793,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+152,2040,1,1,1,0,6262.42,-1679.22,433.738,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+153,2040,1,1,1,0,6299.92,-1767.96,421.915,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+154,2040,1,1,1,0,6319.9,-1633.21,428.503,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+155,2040,1,1,1,0,6340.79,-1844,436.472,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+156,2040,1,1,1,0,6342.07,-1739.85,422.616,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+157,2040,1,1,1,0,6349.85,-1777.57,421.974,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+158,2040,1,1,1,0,6351.52,-1633.01,431.807,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+159,2040,1,1,1,0,6353.48,-1867.76,436.986,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+160,2040,1,1,1,0,6356.96,-1684.74,441.362,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+161,2040,1,1,1,0,6363.45,-1836.28,434.892,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+162,2040,1,1,1,0,6374.6,-1648.47,436.67,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+163,2040,1,1,1,0,6374.99,-1746.69,421.572,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+164,2040,1,1,1,0,6376.33,-1670.75,438.206,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+165,2040,1,1,1,0,6409.36,-1673.24,419.222,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+166,2040,1,1,1,0,6412.9,-1636.42,435.787,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+167,2040,1,1,1,0,6425.6,-1649.16,435.996,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+168,2040,1,1,1,0,6436.65,-1657.93,414.83,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+169,2040,1,1,1,0,6442.42,-1606.78,433.71,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+170,2040,1,1,1,0,6442.44,-1641.64,433.461,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+171,2040,1,1,1,0,6460.49,-1583.25,436.143,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+172,2040,1,1,1,0,6472.37,-1703.37,418.753,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID1+173,2040,1,1,1,0,6480.74,-1632.92,436.187,2.932139,0,0,0,1, @TIMER, 255, 1),
+-- Gold Veins
+(@OGUID2+0,1734,1,1,1,0,3518.36,-1096.71,230.29,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+1,1734,1,1,1,0,3532.12,-1080.09,234.065,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+2,1734,1,1,1,0,3555.23,-1051.94,241.666,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+3,1734,1,1,1,0,3595.66,-1205.04,227.842,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+4,1734,1,1,1,0,3595.67,-993.8,233.478,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+5,1734,1,1,1,0,3612.46,-935.637,297.772,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+6,1734,1,1,1,0,3646.68,-1379.49,224.298,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+7,1734,1,1,1,0,3674.1,-1247.69,231.801,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+8,1734,1,1,1,0,3688.55,-947.625,297.762,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+9,1734,1,1,1,0,3701.43,-1354.14,233.103,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+10,1734,1,1,1,0,3719.78,-885.641,334.797,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+11,1734,1,1,1,0,3724.96,-808.394,343.181,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+12,1734,1,1,1,0,3741.6,-1266.94,219.244,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+13,1734,1,1,1,0,3742.2,-1698.85,272.017,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+14,1734,1,1,1,0,3769.26,-1731.45,281.997,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+15,1734,1,1,1,0,3769.4,-864.252,311.543,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+16,1734,1,1,1,0,3778.65,-722.302,351.5,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+17,1734,1,1,1,0,3794.74,-719.337,342.173,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+18,1734,1,1,1,0,3813.47,-1754.63,300.244,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+19,1734,1,1,1,0,3816.61,-936.957,270.896,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+20,1734,1,1,1,0,3818.71,-688.347,341.798,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+21,1734,1,1,1,0,3831.14,-661.13,339.622,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+22,1734,1,1,1,0,3838.67,-1729.82,284.623,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+23,1734,1,1,1,0,3852.45,-923.967,285.531,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+24,1734,1,1,1,0,3904.94,-733.469,326.517,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+25,1734,1,1,1,0,3909.45,-821.382,327.248,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+26,1734,1,1,1,0,3922.89,-1479.14,232.244,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+27,1734,1,1,1,0,3923.16,-786.628,321.315,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+28,1734,1,1,1,0,3923.49,-1648.37,284.106,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+29,1734,1,1,1,0,3931.29,-677.875,338.391,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+30,1734,1,1,1,0,3939.84,-724.755,303.409,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+31,1734,1,1,1,0,3942.22,-569.201,352.489,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+32,1734,1,1,1,0,3965.01,-722.538,297.317,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+33,1734,1,1,1,0,3967.32,-1537.2,271.055,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+34,1734,1,1,1,0,3968.31,-688.894,328.956,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+35,1734,1,1,1,0,3975.79,-1488.68,266.003,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+36,1734,1,1,1,0,4025.35,-607.109,339.809,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+37,1734,1,1,1,0,4026.89,-715.2,290.555,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+38,1734,1,1,1,0,4072.45,-644.082,304.451,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+39,1734,1,1,1,0,4142.32,-1208.18,313.861,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+40,1734,1,1,1,0,4164.01,-1181.65,315.052,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+41,1734,1,1,1,0,4204.95,-1193.75,327.289,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+42,1734,1,1,1,0,4270.48,-493.052,314.379,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+43,1734,1,1,1,0,4293.27,-671.332,296.312,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+44,1734,1,1,1,0,4305.38,-1110.16,339.926,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+45,1734,1,1,1,0,4327.34,-1089.69,344.662,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+46,1734,1,1,1,0,4476.36,-446.014,329.234,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+47,1734,1,1,1,0,4499.75,-403.543,344.001,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+48,1734,1,1,1,0,4509.84,-1013.56,353.013,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+49,1734,1,1,1,0,4538.48,-399.399,318.674,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+50,1734,1,1,1,0,4595.53,-420.356,331.271,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+51,1734,1,1,1,0,4606.84,-459.365,319.505,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+52,1734,1,1,1,0,4617.51,-587.194,294.599,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+53,1734,1,1,1,0,4661.36,-930.628,349.474,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+54,1734,1,1,1,0,4667.22,-724.479,301.801,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+55,1734,1,1,1,0,4680.24,-881.153,349.374,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+56,1734,1,1,1,0,4704.11,-949.054,364.112,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+57,1734,1,1,1,0,4709.69,-738.403,314.423,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+58,1734,1,1,1,0,4749.24,-722.13,310.143,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+59,1734,1,1,1,0,4776.74,-837.42,333.643,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+60,1734,1,1,1,0,4792.78,-803.882,317.419,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+61,1734,1,1,1,0,4821.81,-671.188,312.993,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+62,1734,1,1,1,0,4839.51,-812.58,319.261,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+63,1734,1,1,1,0,4857.02,-419.045,367.752,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+64,1734,1,1,1,0,4888.34,-807.721,305.402,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+65,1734,1,1,1,0,4890.75,-353.943,369.361,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+66,1734,1,1,1,0,4977.67,-790.019,326.817,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+67,1734,1,1,1,0,4989.58,-519.306,350.89,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+68,1734,1,1,1,0,5093.99,-815.09,352.615,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+69,1734,1,1,1,0,5123.59,-808.363,352.909,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+70,1734,1,1,1,0,5155.09,-529.038,344.48,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+71,1734,1,1,1,0,5186.75,-801.981,359.166,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+72,1734,1,1,1,0,5273.65,-901.323,370.16,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+73,1734,1,1,1,0,5293.68,-915.602,383.933,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+74,1734,1,1,1,0,5298.8,-483.415,345.655,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+75,1734,1,1,1,0,5326.76,-941.991,384.361,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+76,1734,1,1,1,0,5354.51,-945.491,384.49,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+77,1734,1,1,1,0,5377.76,-970.936,388.505,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+78,1734,1,1,1,0,5410.82,-963.049,389.923,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+79,1734,1,1,1,0,5442.81,-508.226,379.438,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+80,1734,1,1,1,0,5473.56,-1028.85,388.938,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+81,1734,1,1,1,0,5488.17,-500.201,378.676,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+82,1734,1,1,1,0,5522.06,-1031.1,387.649,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+83,1734,1,1,1,0,5542.26,-1039.36,394.232,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+84,1734,1,1,1,0,5589.41,-498.7,384.993,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+85,1734,1,1,1,0,5596.71,-1155.65,408.308,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+86,1734,1,1,1,0,5626.65,-1160.9,401.451,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+87,1734,1,1,1,0,5649.58,-1166.41,403.607,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+88,1734,1,1,1,0,5689.34,-1185.81,408.171,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+89,1734,1,1,1,0,5718.74,-1211.69,434.88,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+90,1734,1,1,1,0,5753.47,-1190.98,407.722,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+91,1734,1,1,1,0,5847.39,-1348.74,455.415,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+92,1734,1,1,1,0,5852.26,-1267.06,423.101,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+93,1734,1,1,1,0,5869.19,-1315.33,421.243,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+94,1734,1,1,1,0,5875.35,-606.835,406.306,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+95,1734,1,1,1,0,5958.91,-1412.89,444.033,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+96,1734,1,1,1,0,5989.43,-619.717,410.86,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+97,1734,1,1,1,0,6009.19,-658.227,406.552,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+98,1734,1,1,1,0,6017.37,-1488.13,451.171,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+99,1734,1,1,1,0,6048.66,-1597.7,492.117,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+100,1734,1,1,1,0,6052.97,-1573.89,476.19,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+101,1734,1,1,1,0,6112.73,-1036.49,405.857,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+102,1734,1,1,1,0,6127.9,-688.844,420.179,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+103,1734,1,1,1,0,6138.25,-1024.62,401.109,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+104,1734,1,1,1,0,6151.11,-1796.5,552.678,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+105,1734,1,1,1,0,6179.23,-974.965,405.433,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+106,1734,1,1,1,0,6181.83,-1417.01,403.935,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+107,1734,1,1,1,0,6201.63,-1760.22,538.785,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+108,1734,1,1,1,0,6224.72,-649.944,426.282,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+109,1734,1,1,1,0,6248.72,-2052.01,610.663,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+110,1734,1,1,1,0,6252.74,-679.368,437.375,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+111,1734,1,1,1,0,6258.6,-769.642,427.735,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+112,1734,1,1,1,0,6267.66,-707.227,432.376,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+113,1734,1,1,1,0,6305.11,-1468.17,394.291,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+114,1734,1,1,1,0,6336.31,-651.368,496.393,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+115,1734,1,1,1,0,6344.4,-617.972,483.824,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+116,1734,1,1,1,0,6347.32,-660.427,487.705,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+117,1734,1,1,1,0,6362.56,-1440.67,387.155,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+118,1734,1,1,1,0,6523.49,-2018.68,571.073,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+119,1734,1,1,1,0,6547,-780.592,484.607,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+120,1734,1,1,1,0,6556.96,-1829.11,540.269,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+121,1734,1,1,1,0,6572.51,-927.887,497.34,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+122,1734,1,1,1,0,6573.16,-1792.3,550.087,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+123,1734,1,1,1,0,6575.55,-778.285,483.815,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+124,1734,1,1,1,0,6582.12,-899.059,483.995,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+125,1734,1,1,1,0,6592.13,-1953.67,560.754,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+126,1734,1,1,1,0,6616.44,-1018.3,483.959,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+127,1734,1,1,1,0,6634.33,-936.304,492.336,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+128,1734,1,1,1,0,6651.69,-1685.27,497.607,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+129,1734,1,1,1,0,6654.5,-1200.41,473.482,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+130,1734,1,1,1,0,6679.9,-1999.93,554.918,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+131,1734,1,1,1,0,6682.84,-1218.41,475.421,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+132,1734,1,1,1,0,6684.67,-2043.19,571.531,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+133,1734,1,1,1,0,6695.35,-1668.53,506.223,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+134,1734,1,1,1,0,6696.96,-1357.71,493.868,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+135,1734,1,1,1,0,6715.46,-1377.59,491.777,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+136,1734,1,1,1,0,6720.77,-1282.89,492.925,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+137,1734,1,1,1,0,6741.15,-1987.21,555.494,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+138,1734,1,1,1,0,6751.67,-1528.59,496.243,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+139,1734,1,1,1,0,6774.01,-2034.64,576.012,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+140,1734,1,1,1,0,6789.58,-1966.37,556.149,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+141,1734,1,1,1,0,6807.13,-1763.37,621.515,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+142,1734,1,1,1,0,6855.63,-1545.64,510.091,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+143,1734,1,1,1,0,6883.95,-1969.92,573.449,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+144,1734,1,1,1,0,6890.68,-1780.24,590.574,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+145,1734,1,1,1,0,6893.74,-1637.91,507.892,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+146,1734,1,1,1,0,6910.06,-1923.74,582.433,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+147,1734,1,1,1,0,6918.18,-2045.36,596.652,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+148,1734,1,1,1,0,6925.78,-1579.02,518.463,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+149,1734,1,1,1,0,6926.55,-1785.23,586.29,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+150,1734,1,1,1,0,6957.56,-1994.14,610.338,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+151,1734,1,1,1,0,6255.08,-1719.68,432.793,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+152,1734,1,1,1,0,6262.42,-1679.22,433.738,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+153,1734,1,1,1,0,6299.92,-1767.96,421.915,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+154,1734,1,1,1,0,6319.9,-1633.21,428.503,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+155,1734,1,1,1,0,6340.79,-1844,436.472,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+156,1734,1,1,1,0,6342.07,-1739.85,422.616,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+157,1734,1,1,1,0,6349.85,-1777.57,421.974,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+158,1734,1,1,1,0,6351.52,-1633.01,431.807,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+159,1734,1,1,1,0,6353.48,-1867.76,436.986,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+160,1734,1,1,1,0,6356.96,-1684.74,441.362,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+161,1734,1,1,1,0,6363.45,-1836.28,434.892,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+162,1734,1,1,1,0,6374.6,-1648.47,436.67,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+163,1734,1,1,1,0,6374.99,-1746.69,421.572,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+164,1734,1,1,1,0,6376.33,-1670.75,438.206,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+165,1734,1,1,1,0,6409.36,-1673.24,419.222,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+166,1734,1,1,1,0,6412.9,-1636.42,435.787,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+167,1734,1,1,1,0,6425.6,-1649.16,435.996,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+168,1734,1,1,1,0,6436.65,-1657.93,414.83,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+169,1734,1,1,1,0,6442.42,-1606.78,433.71,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+170,1734,1,1,1,0,6442.44,-1641.64,433.461,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+171,1734,1,1,1,0,6460.49,-1583.25,436.143,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+172,1734,1,1,1,0,6472.37,-1703.37,418.753,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID2+173,1734,1,1,1,0,6480.74,-1632.92,436.187,2.932139,0,0,0,1, @TIMER, 255, 1),
+-- Truesilver Deposits
+(@OGUID3+0,2047,1,1,1,0,3518.36,-1096.71,230.29,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+1,2047,1,1,1,0,3532.12,-1080.09,234.065,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+2,2047,1,1,1,0,3555.23,-1051.94,241.666,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+3,2047,1,1,1,0,3595.66,-1205.04,227.842,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+4,2047,1,1,1,0,3595.67,-993.8,233.478,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+5,2047,1,1,1,0,3612.46,-935.637,297.772,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+6,2047,1,1,1,0,3646.68,-1379.49,224.298,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+7,2047,1,1,1,0,3674.1,-1247.69,231.801,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+8,2047,1,1,1,0,3688.55,-947.625,297.762,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+9,2047,1,1,1,0,3701.43,-1354.14,233.103,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+10,2047,1,1,1,0,3719.78,-885.641,334.797,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+11,2047,1,1,1,0,3724.96,-808.394,343.181,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+12,2047,1,1,1,0,3741.6,-1266.94,219.244,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+13,2047,1,1,1,0,3742.2,-1698.85,272.017,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+14,2047,1,1,1,0,3769.26,-1731.45,281.997,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+15,2047,1,1,1,0,3769.4,-864.252,311.543,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+16,2047,1,1,1,0,3778.65,-722.302,351.5,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+17,2047,1,1,1,0,3794.74,-719.337,342.173,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+18,2047,1,1,1,0,3813.47,-1754.63,300.244,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+19,2047,1,1,1,0,3816.61,-936.957,270.896,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+20,2047,1,1,1,0,3818.71,-688.347,341.798,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+21,2047,1,1,1,0,3831.14,-661.13,339.622,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+22,2047,1,1,1,0,3838.67,-1729.82,284.623,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+23,2047,1,1,1,0,3852.45,-923.967,285.531,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+24,2047,1,1,1,0,3904.94,-733.469,326.517,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+25,2047,1,1,1,0,3909.45,-821.382,327.248,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+26,2047,1,1,1,0,3922.89,-1479.14,232.244,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+27,2047,1,1,1,0,3923.16,-786.628,321.315,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+28,2047,1,1,1,0,3923.49,-1648.37,284.106,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+29,2047,1,1,1,0,3931.29,-677.875,338.391,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+30,2047,1,1,1,0,3939.84,-724.755,303.409,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+31,2047,1,1,1,0,3942.22,-569.201,352.489,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+32,2047,1,1,1,0,3965.01,-722.538,297.317,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+33,2047,1,1,1,0,3967.32,-1537.2,271.055,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+34,2047,1,1,1,0,3968.31,-688.894,328.956,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+35,2047,1,1,1,0,3975.79,-1488.68,266.003,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+36,2047,1,1,1,0,4025.35,-607.109,339.809,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+37,2047,1,1,1,0,4026.89,-715.2,290.555,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+38,2047,1,1,1,0,4072.45,-644.082,304.451,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+39,2047,1,1,1,0,4142.32,-1208.18,313.861,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+40,2047,1,1,1,0,4164.01,-1181.65,315.052,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+41,2047,1,1,1,0,4204.95,-1193.75,327.289,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+42,2047,1,1,1,0,4270.48,-493.052,314.379,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+43,2047,1,1,1,0,4293.27,-671.332,296.312,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+44,2047,1,1,1,0,4305.38,-1110.16,339.926,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+45,2047,1,1,1,0,4327.34,-1089.69,344.662,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+46,2047,1,1,1,0,4476.36,-446.014,329.234,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+47,2047,1,1,1,0,4499.75,-403.543,344.001,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+48,2047,1,1,1,0,4509.84,-1013.56,353.013,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+49,2047,1,1,1,0,4538.48,-399.399,318.674,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+50,2047,1,1,1,0,4595.53,-420.356,331.271,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+51,2047,1,1,1,0,4606.84,-459.365,319.505,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+52,2047,1,1,1,0,4617.51,-587.194,294.599,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+53,2047,1,1,1,0,4661.36,-930.628,349.474,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+54,2047,1,1,1,0,4667.22,-724.479,301.801,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+55,2047,1,1,1,0,4680.24,-881.153,349.374,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+56,2047,1,1,1,0,4704.11,-949.054,364.112,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+57,2047,1,1,1,0,4709.69,-738.403,314.423,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+58,2047,1,1,1,0,4749.24,-722.13,310.143,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+59,2047,1,1,1,0,4776.74,-837.42,333.643,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+60,2047,1,1,1,0,4792.78,-803.882,317.419,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+61,2047,1,1,1,0,4821.81,-671.188,312.993,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+62,2047,1,1,1,0,4839.51,-812.58,319.261,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+63,2047,1,1,1,0,4857.02,-419.045,367.752,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+64,2047,1,1,1,0,4888.34,-807.721,305.402,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+65,2047,1,1,1,0,4890.75,-353.943,369.361,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+66,2047,1,1,1,0,4977.67,-790.019,326.817,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+67,2047,1,1,1,0,4989.58,-519.306,350.89,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+68,2047,1,1,1,0,5093.99,-815.09,352.615,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+69,2047,1,1,1,0,5123.59,-808.363,352.909,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+70,2047,1,1,1,0,5155.09,-529.038,344.48,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+71,2047,1,1,1,0,5186.75,-801.981,359.166,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+72,2047,1,1,1,0,5273.65,-901.323,370.16,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+73,2047,1,1,1,0,5293.68,-915.602,383.933,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+74,2047,1,1,1,0,5298.8,-483.415,345.655,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+75,2047,1,1,1,0,5326.76,-941.991,384.361,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+76,2047,1,1,1,0,5354.51,-945.491,384.49,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+77,2047,1,1,1,0,5377.76,-970.936,388.505,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+78,2047,1,1,1,0,5410.82,-963.049,389.923,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+79,2047,1,1,1,0,5442.81,-508.226,379.438,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+80,2047,1,1,1,0,5473.56,-1028.85,388.938,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+81,2047,1,1,1,0,5488.17,-500.201,378.676,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+82,2047,1,1,1,0,5522.06,-1031.1,387.649,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+83,2047,1,1,1,0,5542.26,-1039.36,394.232,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+84,2047,1,1,1,0,5589.41,-498.7,384.993,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+85,2047,1,1,1,0,5596.71,-1155.65,408.308,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+86,2047,1,1,1,0,5626.65,-1160.9,401.451,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+87,2047,1,1,1,0,5649.58,-1166.41,403.607,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+88,2047,1,1,1,0,5689.34,-1185.81,408.171,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+89,2047,1,1,1,0,5718.74,-1211.69,434.88,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+90,2047,1,1,1,0,5753.47,-1190.98,407.722,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+91,2047,1,1,1,0,5847.39,-1348.74,455.415,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+92,2047,1,1,1,0,5852.26,-1267.06,423.101,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+93,2047,1,1,1,0,5869.19,-1315.33,421.243,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+94,2047,1,1,1,0,5875.35,-606.835,406.306,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+95,2047,1,1,1,0,5958.91,-1412.89,444.033,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+96,2047,1,1,1,0,5989.43,-619.717,410.86,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+97,2047,1,1,1,0,6009.19,-658.227,406.552,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+98,2047,1,1,1,0,6017.37,-1488.13,451.171,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+99,2047,1,1,1,0,6048.66,-1597.7,492.117,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+100,2047,1,1,1,0,6052.97,-1573.89,476.19,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+101,2047,1,1,1,0,6112.73,-1036.49,405.857,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+102,2047,1,1,1,0,6127.9,-688.844,420.179,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+103,2047,1,1,1,0,6138.25,-1024.62,401.109,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+104,2047,1,1,1,0,6151.11,-1796.5,552.678,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+105,2047,1,1,1,0,6179.23,-974.965,405.433,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+106,2047,1,1,1,0,6181.83,-1417.01,403.935,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+107,2047,1,1,1,0,6201.63,-1760.22,538.785,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+108,2047,1,1,1,0,6224.72,-649.944,426.282,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+109,2047,1,1,1,0,6248.72,-2052.01,610.663,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+110,2047,1,1,1,0,6252.74,-679.368,437.375,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+111,2047,1,1,1,0,6258.6,-769.642,427.735,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+112,2047,1,1,1,0,6267.66,-707.227,432.376,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+113,2047,1,1,1,0,6305.11,-1468.17,394.291,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+114,2047,1,1,1,0,6336.31,-651.368,496.393,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+115,2047,1,1,1,0,6344.4,-617.972,483.824,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+116,2047,1,1,1,0,6347.32,-660.427,487.705,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+117,2047,1,1,1,0,6362.56,-1440.67,387.155,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+118,2047,1,1,1,0,6523.49,-2018.68,571.073,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+119,2047,1,1,1,0,6547,-780.592,484.607,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+120,2047,1,1,1,0,6556.96,-1829.11,540.269,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+121,2047,1,1,1,0,6572.51,-927.887,497.34,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+122,2047,1,1,1,0,6573.16,-1792.3,550.087,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+123,2047,1,1,1,0,6575.55,-778.285,483.815,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+124,2047,1,1,1,0,6582.12,-899.059,483.995,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+125,2047,1,1,1,0,6592.13,-1953.67,560.754,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+126,2047,1,1,1,0,6616.44,-1018.3,483.959,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+127,2047,1,1,1,0,6634.33,-936.304,492.336,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+128,2047,1,1,1,0,6651.69,-1685.27,497.607,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+129,2047,1,1,1,0,6654.5,-1200.41,473.482,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+130,2047,1,1,1,0,6679.9,-1999.93,554.918,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+131,2047,1,1,1,0,6682.84,-1218.41,475.421,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+132,2047,1,1,1,0,6684.67,-2043.19,571.531,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+133,2047,1,1,1,0,6695.35,-1668.53,506.223,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+134,2047,1,1,1,0,6696.96,-1357.71,493.868,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+135,2047,1,1,1,0,6715.46,-1377.59,491.777,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+136,2047,1,1,1,0,6720.77,-1282.89,492.925,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+137,2047,1,1,1,0,6741.15,-1987.21,555.494,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+138,2047,1,1,1,0,6751.67,-1528.59,496.243,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+139,2047,1,1,1,0,6774.01,-2034.64,576.012,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+140,2047,1,1,1,0,6789.58,-1966.37,556.149,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+141,2047,1,1,1,0,6807.13,-1763.37,621.515,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+142,2047,1,1,1,0,6855.63,-1545.64,510.091,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+143,2047,1,1,1,0,6883.95,-1969.92,573.449,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+144,2047,1,1,1,0,6890.68,-1780.24,590.574,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+145,2047,1,1,1,0,6893.74,-1637.91,507.892,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+146,2047,1,1,1,0,6910.06,-1923.74,582.433,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+147,2047,1,1,1,0,6918.18,-2045.36,596.652,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+148,2047,1,1,1,0,6925.78,-1579.02,518.463,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+149,2047,1,1,1,0,6926.55,-1785.23,586.29,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+150,2047,1,1,1,0,6957.56,-1994.14,610.338,4.485497,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+151,2047,1,1,1,0,6255.08,-1719.68,432.793,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+152,2047,1,1,1,0,6262.42,-1679.22,433.738,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+153,2047,1,1,1,0,6299.92,-1767.96,421.915,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+154,2047,1,1,1,0,6319.9,-1633.21,428.503,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+155,2047,1,1,1,0,6340.79,-1844,436.472,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+156,2047,1,1,1,0,6342.07,-1739.85,422.616,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+157,2047,1,1,1,0,6349.85,-1777.57,421.974,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+158,2047,1,1,1,0,6351.52,-1633.01,431.807,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+159,2047,1,1,1,0,6353.48,-1867.76,436.986,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+160,2047,1,1,1,0,6356.96,-1684.74,441.362,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+161,2047,1,1,1,0,6363.45,-1836.28,434.892,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+162,2047,1,1,1,0,6374.6,-1648.47,436.67,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+163,2047,1,1,1,0,6374.99,-1746.69,421.572,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+164,2047,1,1,1,0,6376.33,-1670.75,438.206,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+165,2047,1,1,1,0,6409.36,-1673.24,419.222,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+166,2047,1,1,1,0,6412.9,-1636.42,435.787,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+167,2047,1,1,1,0,6425.6,-1649.16,435.996,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+168,2047,1,1,1,0,6436.65,-1657.93,414.83,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+169,2047,1,1,1,0,6442.42,-1606.78,433.71,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+170,2047,1,1,1,0,6442.44,-1641.64,433.461,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+171,2047,1,1,1,0,6460.49,-1583.25,436.143,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+172,2047,1,1,1,0,6472.37,-1703.37,418.753,2.932139,0,0,0,1, @TIMER, 255, 1),
+(@OGUID3+173,2047,1,1,1,0,6480.74,-1632.92,436.187,2.932139,0,0,0,1, @TIMER, 255, 1);
+
+-- Add mother pool to pool template
+DELETE FROM `pool_template` WHERE `entry`=@MOTHER;
+INSERT INTO `pool_template` (`entry`,`max_limit`,`description`) VALUES
+(@MOTHER,@ACTIVE, 'Felwood Ore Mother pool');
+
+-- Pool Ore Spawnpoints
+DELETE FROM `pool_gameobject` WHERE `guid` BETWEEN @OGUID1 AND @OGUID1+@LASTGUID;
+DELETE FROM `pool_gameobject` WHERE `guid` BETWEEN @OGUID2 AND @OGUID2+@LASTGUID;
+DELETE FROM `pool_gameobject` WHERE `guid` BETWEEN @OGUID3 AND @OGUID3+@LASTGUID;
+INSERT INTO `pool_gameobject` (`guid`,`pool_entry`,`chance`,`description`) VALUES
+(@OGUID1+0,@POOL+0,80, 'Mithril Deposit'),
+(@OGUID2+0,@POOL+0,10, 'Truesilver Deposit'),
+(@OGUID3+0,@POOL+0,10, 'Gold Vein'),
+(@OGUID1+1,@POOL+1,80, 'Mithril Deposit'),
+(@OGUID2+1,@POOL+1,10, 'Truesilver Deposit'),
+(@OGUID3+1,@POOL+1,10, 'Gold Vein'),
+(@OGUID1+2,@POOL+2,80, 'Mithril Deposit'),
+(@OGUID2+2,@POOL+2,10, 'Truesilver Deposit'),
+(@OGUID3+2,@POOL+2,10, 'Gold Vein'),
+(@OGUID1+3,@POOL+3,80, 'Mithril Deposit'),
+(@OGUID2+3,@POOL+3,10, 'Truesilver Deposit'),
+(@OGUID3+3,@POOL+3,10, 'Gold Vein'),
+(@OGUID1+4,@POOL+4,80, 'Mithril Deposit'),
+(@OGUID2+4,@POOL+4,10, 'Truesilver Deposit'),
+(@OGUID3+4,@POOL+4,10, 'Gold Vein'),
+(@OGUID1+5,@POOL+5,80, 'Mithril Deposit'),
+(@OGUID2+5,@POOL+5,10, 'Truesilver Deposit'),
+(@OGUID3+5,@POOL+5,10, 'Gold Vein'),
+(@OGUID1+6,@POOL+6,80, 'Mithril Deposit'),
+(@OGUID2+6,@POOL+6,10, 'Truesilver Deposit'),
+(@OGUID3+6,@POOL+6,10, 'Gold Vein'),
+(@OGUID1+7,@POOL+7,80, 'Mithril Deposit'),
+(@OGUID2+7,@POOL+7,10, 'Truesilver Deposit'),
+(@OGUID3+7,@POOL+7,10, 'Gold Vein'),
+(@OGUID1+8,@POOL+8,80, 'Mithril Deposit'),
+(@OGUID2+8,@POOL+8,10, 'Truesilver Deposit'),
+(@OGUID3+8,@POOL+8,10, 'Gold Vein'),
+(@OGUID1+9,@POOL+9,80, 'Mithril Deposit'),
+(@OGUID2+9,@POOL+9,10, 'Truesilver Deposit'),
+(@OGUID3+9,@POOL+9,10, 'Gold Vein'),
+(@OGUID1+10,@POOL+10,80, 'Mithril Deposit'),
+(@OGUID2+10,@POOL+10,10, 'Truesilver Deposit'),
+(@OGUID3+10,@POOL+10,10, 'Gold Vein'),
+(@OGUID1+11,@POOL+11,80, 'Mithril Deposit'),
+(@OGUID2+11,@POOL+11,10, 'Truesilver Deposit'),
+(@OGUID3+11,@POOL+11,10, 'Gold Vein'),
+(@OGUID1+12,@POOL+12,80, 'Mithril Deposit'),
+(@OGUID2+12,@POOL+12,10, 'Truesilver Deposit'),
+(@OGUID3+12,@POOL+12,10, 'Gold Vein'),
+(@OGUID1+13,@POOL+13,80, 'Mithril Deposit'),
+(@OGUID2+13,@POOL+13,10, 'Truesilver Deposit'),
+(@OGUID3+13,@POOL+13,10, 'Gold Vein'),
+(@OGUID1+14,@POOL+14,80, 'Mithril Deposit'),
+(@OGUID2+14,@POOL+14,10, 'Truesilver Deposit'),
+(@OGUID3+14,@POOL+14,10, 'Gold Vein'),
+(@OGUID1+15,@POOL+15,80, 'Mithril Deposit'),
+(@OGUID2+15,@POOL+15,10, 'Truesilver Deposit'),
+(@OGUID3+15,@POOL+15,10, 'Gold Vein'),
+(@OGUID1+16,@POOL+16,80, 'Mithril Deposit'),
+(@OGUID2+16,@POOL+16,10, 'Truesilver Deposit'),
+(@OGUID3+16,@POOL+16,10, 'Gold Vein'),
+(@OGUID1+17,@POOL+17,80, 'Mithril Deposit'),
+(@OGUID2+17,@POOL+17,10, 'Truesilver Deposit'),
+(@OGUID3+17,@POOL+17,10, 'Gold Vein'),
+(@OGUID1+18,@POOL+18,80, 'Mithril Deposit'),
+(@OGUID2+18,@POOL+18,10, 'Truesilver Deposit'),
+(@OGUID3+18,@POOL+18,10, 'Gold Vein'),
+(@OGUID1+19,@POOL+19,80, 'Mithril Deposit'),
+(@OGUID2+19,@POOL+19,10, 'Truesilver Deposit'),
+(@OGUID3+19,@POOL+19,10, 'Gold Vein'),
+(@OGUID1+20,@POOL+20,80, 'Mithril Deposit'),
+(@OGUID2+20,@POOL+20,10, 'Truesilver Deposit'),
+(@OGUID3+20,@POOL+20,10, 'Gold Vein'),
+(@OGUID1+21,@POOL+21,80, 'Mithril Deposit'),
+(@OGUID2+21,@POOL+21,10, 'Truesilver Deposit'),
+(@OGUID3+21,@POOL+21,10, 'Gold Vein'),
+(@OGUID1+22,@POOL+22,80, 'Mithril Deposit'),
+(@OGUID2+22,@POOL+22,10, 'Truesilver Deposit'),
+(@OGUID3+22,@POOL+22,10, 'Gold Vein'),
+(@OGUID1+23,@POOL+23,80, 'Mithril Deposit'),
+(@OGUID2+23,@POOL+23,10, 'Truesilver Deposit'),
+(@OGUID3+23,@POOL+23,10, 'Gold Vein'),
+(@OGUID1+24,@POOL+24,80, 'Mithril Deposit'),
+(@OGUID2+24,@POOL+24,10, 'Truesilver Deposit'),
+(@OGUID3+24,@POOL+24,10, 'Gold Vein'),
+(@OGUID1+25,@POOL+25,80, 'Mithril Deposit'),
+(@OGUID2+25,@POOL+25,10, 'Truesilver Deposit'),
+(@OGUID3+25,@POOL+25,10, 'Gold Vein'),
+(@OGUID1+26,@POOL+26,80, 'Mithril Deposit'),
+(@OGUID2+26,@POOL+26,10, 'Truesilver Deposit'),
+(@OGUID3+26,@POOL+26,10, 'Gold Vein'),
+(@OGUID1+27,@POOL+27,80, 'Mithril Deposit'),
+(@OGUID2+27,@POOL+27,10, 'Truesilver Deposit'),
+(@OGUID3+27,@POOL+27,10, 'Gold Vein'),
+(@OGUID1+28,@POOL+28,80, 'Mithril Deposit'),
+(@OGUID2+28,@POOL+28,10, 'Truesilver Deposit'),
+(@OGUID3+28,@POOL+28,10, 'Gold Vein'),
+(@OGUID1+29,@POOL+29,80, 'Mithril Deposit'),
+(@OGUID2+29,@POOL+29,10, 'Truesilver Deposit'),
+(@OGUID3+29,@POOL+29,10, 'Gold Vein'),
+(@OGUID1+30,@POOL+30,80, 'Mithril Deposit'),
+(@OGUID2+30,@POOL+30,10, 'Truesilver Deposit'),
+(@OGUID3+30,@POOL+30,10, 'Gold Vein'),
+(@OGUID1+31,@POOL+31,80, 'Mithril Deposit'),
+(@OGUID2+31,@POOL+31,10, 'Truesilver Deposit'),
+(@OGUID3+31,@POOL+31,10, 'Gold Vein'),
+(@OGUID1+32,@POOL+32,80, 'Mithril Deposit'),
+(@OGUID2+32,@POOL+32,10, 'Truesilver Deposit'),
+(@OGUID3+32,@POOL+32,10, 'Gold Vein'),
+(@OGUID1+33,@POOL+33,80, 'Mithril Deposit'),
+(@OGUID2+33,@POOL+33,10, 'Truesilver Deposit'),
+(@OGUID3+33,@POOL+33,10, 'Gold Vein'),
+(@OGUID1+34,@POOL+34,80, 'Mithril Deposit'),
+(@OGUID2+34,@POOL+34,10, 'Truesilver Deposit'),
+(@OGUID3+34,@POOL+34,10, 'Gold Vein'),
+(@OGUID1+35,@POOL+35,80, 'Mithril Deposit'),
+(@OGUID2+35,@POOL+35,10, 'Truesilver Deposit'),
+(@OGUID3+35,@POOL+35,10, 'Gold Vein'),
+(@OGUID1+36,@POOL+36,80, 'Mithril Deposit'),
+(@OGUID2+36,@POOL+36,10, 'Truesilver Deposit'),
+(@OGUID3+36,@POOL+36,10, 'Gold Vein'),
+(@OGUID1+37,@POOL+37,80, 'Mithril Deposit'),
+(@OGUID2+37,@POOL+37,10, 'Truesilver Deposit'),
+(@OGUID3+37,@POOL+37,10, 'Gold Vein'),
+(@OGUID1+38,@POOL+38,80, 'Mithril Deposit'),
+(@OGUID2+38,@POOL+38,10, 'Truesilver Deposit'),
+(@OGUID3+38,@POOL+38,10, 'Gold Vein'),
+(@OGUID1+39,@POOL+39,80, 'Mithril Deposit'),
+(@OGUID2+39,@POOL+39,10, 'Truesilver Deposit'),
+(@OGUID3+39,@POOL+39,10, 'Gold Vein'),
+(@OGUID1+40,@POOL+40,80, 'Mithril Deposit'),
+(@OGUID2+40,@POOL+40,10, 'Truesilver Deposit'),
+(@OGUID3+40,@POOL+40,10, 'Gold Vein'),
+(@OGUID1+41,@POOL+41,80, 'Mithril Deposit'),
+(@OGUID2+41,@POOL+41,10, 'Truesilver Deposit'),
+(@OGUID3+41,@POOL+41,10, 'Gold Vein'),
+(@OGUID1+42,@POOL+42,80, 'Mithril Deposit'),
+(@OGUID2+42,@POOL+42,10, 'Truesilver Deposit'),
+(@OGUID3+42,@POOL+42,10, 'Gold Vein'),
+(@OGUID1+43,@POOL+43,80, 'Mithril Deposit'),
+(@OGUID2+43,@POOL+43,10, 'Truesilver Deposit'),
+(@OGUID3+43,@POOL+43,10, 'Gold Vein'),
+(@OGUID1+44,@POOL+44,80, 'Mithril Deposit'),
+(@OGUID2+44,@POOL+44,10, 'Truesilver Deposit'),
+(@OGUID3+44,@POOL+44,10, 'Gold Vein'),
+(@OGUID1+45,@POOL+45,80, 'Mithril Deposit'),
+(@OGUID2+45,@POOL+45,10, 'Truesilver Deposit'),
+(@OGUID3+45,@POOL+45,10, 'Gold Vein'),
+(@OGUID1+46,@POOL+46,80, 'Mithril Deposit'),
+(@OGUID2+46,@POOL+46,10, 'Truesilver Deposit'),
+(@OGUID3+46,@POOL+46,10, 'Gold Vein'),
+(@OGUID1+47,@POOL+47,80, 'Mithril Deposit'),
+(@OGUID2+47,@POOL+47,10, 'Truesilver Deposit'),
+(@OGUID3+47,@POOL+47,10, 'Gold Vein'),
+(@OGUID1+48,@POOL+48,80, 'Mithril Deposit'),
+(@OGUID2+48,@POOL+48,10, 'Truesilver Deposit'),
+(@OGUID3+48,@POOL+48,10, 'Gold Vein'),
+(@OGUID1+49,@POOL+49,80, 'Mithril Deposit'),
+(@OGUID2+49,@POOL+49,10, 'Truesilver Deposit'),
+(@OGUID3+49,@POOL+49,10, 'Gold Vein'),
+(@OGUID1+50,@POOL+50,80, 'Mithril Deposit'),
+(@OGUID2+50,@POOL+50,10, 'Truesilver Deposit'),
+(@OGUID3+50,@POOL+50,10, 'Gold Vein'),
+(@OGUID1+51,@POOL+51,80, 'Mithril Deposit'),
+(@OGUID2+51,@POOL+51,10, 'Truesilver Deposit'),
+(@OGUID3+51,@POOL+51,10, 'Gold Vein'),
+(@OGUID1+52,@POOL+52,80, 'Mithril Deposit'),
+(@OGUID2+52,@POOL+52,10, 'Truesilver Deposit'),
+(@OGUID3+52,@POOL+52,10, 'Gold Vein'),
+(@OGUID1+53,@POOL+53,80, 'Mithril Deposit'),
+(@OGUID2+53,@POOL+53,10, 'Truesilver Deposit'),
+(@OGUID3+53,@POOL+53,10, 'Gold Vein'),
+(@OGUID1+54,@POOL+54,80, 'Mithril Deposit'),
+(@OGUID2+54,@POOL+54,10, 'Truesilver Deposit'),
+(@OGUID3+54,@POOL+54,10, 'Gold Vein'),
+(@OGUID1+55,@POOL+55,80, 'Mithril Deposit'),
+(@OGUID2+55,@POOL+55,10, 'Truesilver Deposit'),
+(@OGUID3+55,@POOL+55,10, 'Gold Vein'),
+(@OGUID1+56,@POOL+56,80, 'Mithril Deposit'),
+(@OGUID2+56,@POOL+56,10, 'Truesilver Deposit'),
+(@OGUID3+56,@POOL+56,10, 'Gold Vein'),
+(@OGUID1+57,@POOL+57,80, 'Mithril Deposit'),
+(@OGUID2+57,@POOL+57,10, 'Truesilver Deposit'),
+(@OGUID3+57,@POOL+57,10, 'Gold Vein'),
+(@OGUID1+58,@POOL+58,80, 'Mithril Deposit'),
+(@OGUID2+58,@POOL+58,10, 'Truesilver Deposit'),
+(@OGUID3+58,@POOL+58,10, 'Gold Vein'),
+(@OGUID1+59,@POOL+59,80, 'Mithril Deposit'),
+(@OGUID2+59,@POOL+59,10, 'Truesilver Deposit'),
+(@OGUID3+59,@POOL+59,10, 'Gold Vein'),
+(@OGUID1+60,@POOL+60,80, 'Mithril Deposit'),
+(@OGUID2+60,@POOL+60,10, 'Truesilver Deposit'),
+(@OGUID3+60,@POOL+60,10, 'Gold Vein'),
+(@OGUID1+61,@POOL+61,80, 'Mithril Deposit'),
+(@OGUID2+61,@POOL+61,10, 'Truesilver Deposit'),
+(@OGUID3+61,@POOL+61,10, 'Gold Vein'),
+(@OGUID1+62,@POOL+62,80, 'Mithril Deposit'),
+(@OGUID2+62,@POOL+62,10, 'Truesilver Deposit'),
+(@OGUID3+62,@POOL+62,10, 'Gold Vein'),
+(@OGUID1+63,@POOL+63,80, 'Mithril Deposit'),
+(@OGUID2+63,@POOL+63,10, 'Truesilver Deposit'),
+(@OGUID3+63,@POOL+63,10, 'Gold Vein'),
+(@OGUID1+64,@POOL+64,80, 'Mithril Deposit'),
+(@OGUID2+64,@POOL+64,10, 'Truesilver Deposit'),
+(@OGUID3+64,@POOL+64,10, 'Gold Vein'),
+(@OGUID1+65,@POOL+65,80, 'Mithril Deposit'),
+(@OGUID2+65,@POOL+65,10, 'Truesilver Deposit'),
+(@OGUID3+65,@POOL+65,10, 'Gold Vein'),
+(@OGUID1+66,@POOL+66,80, 'Mithril Deposit'),
+(@OGUID2+66,@POOL+66,10, 'Truesilver Deposit'),
+(@OGUID3+66,@POOL+66,10, 'Gold Vein'),
+(@OGUID1+67,@POOL+67,80, 'Mithril Deposit'),
+(@OGUID2+67,@POOL+67,10, 'Truesilver Deposit'),
+(@OGUID3+67,@POOL+67,10, 'Gold Vein'),
+(@OGUID1+68,@POOL+68,80, 'Mithril Deposit'),
+(@OGUID2+68,@POOL+68,10, 'Truesilver Deposit'),
+(@OGUID3+68,@POOL+68,10, 'Gold Vein'),
+(@OGUID1+69,@POOL+69,80, 'Mithril Deposit'),
+(@OGUID2+69,@POOL+69,10, 'Truesilver Deposit'),
+(@OGUID3+69,@POOL+69,10, 'Gold Vein'),
+(@OGUID1+70,@POOL+70,80, 'Mithril Deposit'),
+(@OGUID2+70,@POOL+70,10, 'Truesilver Deposit'),
+(@OGUID3+70,@POOL+70,10, 'Gold Vein'),
+(@OGUID1+71,@POOL+71,80, 'Mithril Deposit'),
+(@OGUID2+71,@POOL+71,10, 'Truesilver Deposit'),
+(@OGUID3+71,@POOL+71,10, 'Gold Vein'),
+(@OGUID1+72,@POOL+72,80, 'Mithril Deposit'),
+(@OGUID2+72,@POOL+72,10, 'Truesilver Deposit'),
+(@OGUID3+72,@POOL+72,10, 'Gold Vein'),
+(@OGUID1+73,@POOL+73,80, 'Mithril Deposit'),
+(@OGUID2+73,@POOL+73,10, 'Truesilver Deposit'),
+(@OGUID3+73,@POOL+73,10, 'Gold Vein'),
+(@OGUID1+74,@POOL+74,80, 'Mithril Deposit'),
+(@OGUID2+74,@POOL+74,10, 'Truesilver Deposit'),
+(@OGUID3+74,@POOL+74,10, 'Gold Vein'),
+(@OGUID1+75,@POOL+75,80, 'Mithril Deposit'),
+(@OGUID2+75,@POOL+75,10, 'Truesilver Deposit'),
+(@OGUID3+75,@POOL+75,10, 'Gold Vein'),
+(@OGUID1+76,@POOL+76,80, 'Mithril Deposit'),
+(@OGUID2+76,@POOL+76,10, 'Truesilver Deposit'),
+(@OGUID3+76,@POOL+76,10, 'Gold Vein'),
+(@OGUID1+77,@POOL+77,80, 'Mithril Deposit'),
+(@OGUID2+77,@POOL+77,10, 'Truesilver Deposit'),
+(@OGUID3+77,@POOL+77,10, 'Gold Vein'),
+(@OGUID1+78,@POOL+78,80, 'Mithril Deposit'),
+(@OGUID2+78,@POOL+78,10, 'Truesilver Deposit'),
+(@OGUID3+78,@POOL+78,10, 'Gold Vein'),
+(@OGUID1+79,@POOL+79,80, 'Mithril Deposit'),
+(@OGUID2+79,@POOL+79,10, 'Truesilver Deposit'),
+(@OGUID3+79,@POOL+79,10, 'Gold Vein'),
+(@OGUID1+80,@POOL+80,80, 'Mithril Deposit'),
+(@OGUID2+80,@POOL+80,10, 'Truesilver Deposit'),
+(@OGUID3+80,@POOL+80,10, 'Gold Vein'),
+(@OGUID1+81,@POOL+81,80, 'Mithril Deposit'),
+(@OGUID2+81,@POOL+81,10, 'Truesilver Deposit'),
+(@OGUID3+81,@POOL+81,10, 'Gold Vein'),
+(@OGUID1+82,@POOL+82,80, 'Mithril Deposit'),
+(@OGUID2+82,@POOL+82,10, 'Truesilver Deposit'),
+(@OGUID3+82,@POOL+82,10, 'Gold Vein'),
+(@OGUID1+83,@POOL+83,80, 'Mithril Deposit'),
+(@OGUID2+83,@POOL+83,10, 'Truesilver Deposit'),
+(@OGUID3+83,@POOL+83,10, 'Gold Vein'),
+(@OGUID1+84,@POOL+84,80, 'Mithril Deposit'),
+(@OGUID2+84,@POOL+84,10, 'Truesilver Deposit'),
+(@OGUID3+84,@POOL+84,10, 'Gold Vein'),
+(@OGUID1+85,@POOL+85,80, 'Mithril Deposit'),
+(@OGUID2+85,@POOL+85,10, 'Truesilver Deposit'),
+(@OGUID3+85,@POOL+85,10, 'Gold Vein'),
+(@OGUID1+86,@POOL+86,80, 'Mithril Deposit'),
+(@OGUID2+86,@POOL+86,10, 'Truesilver Deposit'),
+(@OGUID3+86,@POOL+86,10, 'Gold Vein'),
+(@OGUID1+87,@POOL+87,80, 'Mithril Deposit'),
+(@OGUID2+87,@POOL+87,10, 'Truesilver Deposit'),
+(@OGUID3+87,@POOL+87,10, 'Gold Vein'),
+(@OGUID1+88,@POOL+88,80, 'Mithril Deposit'),
+(@OGUID2+88,@POOL+88,10, 'Truesilver Deposit'),
+(@OGUID3+88,@POOL+88,10, 'Gold Vein'),
+(@OGUID1+89,@POOL+89,80, 'Mithril Deposit'),
+(@OGUID2+89,@POOL+89,10, 'Truesilver Deposit'),
+(@OGUID3+89,@POOL+89,10, 'Gold Vein'),
+(@OGUID1+90,@POOL+90,80, 'Mithril Deposit'),
+(@OGUID2+90,@POOL+90,10, 'Truesilver Deposit'),
+(@OGUID3+90,@POOL+90,10, 'Gold Vein'),
+(@OGUID1+91,@POOL+91,80, 'Mithril Deposit'),
+(@OGUID2+91,@POOL+91,10, 'Truesilver Deposit'),
+(@OGUID3+91,@POOL+91,10, 'Gold Vein'),
+(@OGUID1+92,@POOL+92,80, 'Mithril Deposit'),
+(@OGUID2+92,@POOL+92,10, 'Truesilver Deposit'),
+(@OGUID3+92,@POOL+92,10, 'Gold Vein'),
+(@OGUID1+93,@POOL+93,80, 'Mithril Deposit'),
+(@OGUID2+93,@POOL+93,10, 'Truesilver Deposit'),
+(@OGUID3+93,@POOL+93,10, 'Gold Vein'),
+(@OGUID1+94,@POOL+94,80, 'Mithril Deposit'),
+(@OGUID2+94,@POOL+94,10, 'Truesilver Deposit'),
+(@OGUID3+94,@POOL+94,10, 'Gold Vein'),
+(@OGUID1+95,@POOL+95,80, 'Mithril Deposit'),
+(@OGUID2+95,@POOL+95,10, 'Truesilver Deposit'),
+(@OGUID3+95,@POOL+95,10, 'Gold Vein'),
+(@OGUID1+96,@POOL+96,80, 'Mithril Deposit'),
+(@OGUID2+96,@POOL+96,10, 'Truesilver Deposit'),
+(@OGUID3+96,@POOL+96,10, 'Gold Vein'),
+(@OGUID1+97,@POOL+97,80, 'Mithril Deposit'),
+(@OGUID2+97,@POOL+97,10, 'Truesilver Deposit'),
+(@OGUID3+97,@POOL+97,10, 'Gold Vein'),
+(@OGUID1+98,@POOL+98,80, 'Mithril Deposit'),
+(@OGUID2+98,@POOL+98,10, 'Truesilver Deposit'),
+(@OGUID3+98,@POOL+98,10, 'Gold Vein'),
+(@OGUID1+99,@POOL+99,80, 'Mithril Deposit'),
+(@OGUID2+99,@POOL+99,10, 'Truesilver Deposit'),
+(@OGUID3+99,@POOL+99,10, 'Gold Vein'),
+(@OGUID1+100,@POOL+100,80, 'Mithril Deposit'),
+(@OGUID2+100,@POOL+100,10, 'Truesilver Deposit'),
+(@OGUID3+100,@POOL+100,10, 'Gold Vein'),
+(@OGUID1+101,@POOL+101,80, 'Mithril Deposit'),
+(@OGUID2+101,@POOL+101,10, 'Truesilver Deposit'),
+(@OGUID3+101,@POOL+101,10, 'Gold Vein'),
+(@OGUID1+102,@POOL+102,80, 'Mithril Deposit'),
+(@OGUID2+102,@POOL+102,10, 'Truesilver Deposit'),
+(@OGUID3+102,@POOL+102,10, 'Gold Vein'),
+(@OGUID1+103,@POOL+103,80, 'Mithril Deposit'),
+(@OGUID2+103,@POOL+103,10, 'Truesilver Deposit'),
+(@OGUID3+103,@POOL+103,10, 'Gold Vein'),
+(@OGUID1+104,@POOL+104,80, 'Mithril Deposit'),
+(@OGUID2+104,@POOL+104,10, 'Truesilver Deposit'),
+(@OGUID3+104,@POOL+104,10, 'Gold Vein'),
+(@OGUID1+105,@POOL+105,80, 'Mithril Deposit'),
+(@OGUID2+105,@POOL+105,10, 'Truesilver Deposit'),
+(@OGUID3+105,@POOL+105,10, 'Gold Vein'),
+(@OGUID1+106,@POOL+106,80, 'Mithril Deposit'),
+(@OGUID2+106,@POOL+106,10, 'Truesilver Deposit'),
+(@OGUID3+106,@POOL+106,10, 'Gold Vein'),
+(@OGUID1+107,@POOL+107,80, 'Mithril Deposit'),
+(@OGUID2+107,@POOL+107,10, 'Truesilver Deposit'),
+(@OGUID3+107,@POOL+107,10, 'Gold Vein'),
+(@OGUID1+108,@POOL+108,80, 'Mithril Deposit'),
+(@OGUID2+108,@POOL+108,10, 'Truesilver Deposit'),
+(@OGUID3+108,@POOL+108,10, 'Gold Vein'),
+(@OGUID1+109,@POOL+109,80, 'Mithril Deposit'),
+(@OGUID2+109,@POOL+109,10, 'Truesilver Deposit'),
+(@OGUID3+109,@POOL+109,10, 'Gold Vein'),
+(@OGUID1+110,@POOL+110,80, 'Mithril Deposit'),
+(@OGUID2+110,@POOL+110,10, 'Truesilver Deposit'),
+(@OGUID3+110,@POOL+110,10, 'Gold Vein'),
+(@OGUID1+111,@POOL+111,80, 'Mithril Deposit'),
+(@OGUID2+111,@POOL+111,10, 'Truesilver Deposit'),
+(@OGUID3+111,@POOL+111,10, 'Gold Vein'),
+(@OGUID1+112,@POOL+112,80, 'Mithril Deposit'),
+(@OGUID2+112,@POOL+112,10, 'Truesilver Deposit'),
+(@OGUID3+112,@POOL+112,10, 'Gold Vein'),
+(@OGUID1+113,@POOL+113,80, 'Mithril Deposit'),
+(@OGUID2+113,@POOL+113,10, 'Truesilver Deposit'),
+(@OGUID3+113,@POOL+113,10, 'Gold Vein'),
+(@OGUID1+114,@POOL+114,80, 'Mithril Deposit'),
+(@OGUID2+114,@POOL+114,10, 'Truesilver Deposit'),
+(@OGUID3+114,@POOL+114,10, 'Gold Vein'),
+(@OGUID1+115,@POOL+115,80, 'Mithril Deposit'),
+(@OGUID2+115,@POOL+115,10, 'Truesilver Deposit'),
+(@OGUID3+115,@POOL+115,10, 'Gold Vein'),
+(@OGUID1+116,@POOL+116,80, 'Mithril Deposit'),
+(@OGUID2+116,@POOL+116,10, 'Truesilver Deposit'),
+(@OGUID3+116,@POOL+116,10, 'Gold Vein'),
+(@OGUID1+117,@POOL+117,80, 'Mithril Deposit'),
+(@OGUID2+117,@POOL+117,10, 'Truesilver Deposit'),
+(@OGUID3+117,@POOL+117,10, 'Gold Vein'),
+(@OGUID1+118,@POOL+118,80, 'Mithril Deposit'),
+(@OGUID2+118,@POOL+118,10, 'Truesilver Deposit'),
+(@OGUID3+118,@POOL+118,10, 'Gold Vein'),
+(@OGUID1+119,@POOL+119,80, 'Mithril Deposit'),
+(@OGUID2+119,@POOL+119,10, 'Truesilver Deposit'),
+(@OGUID3+119,@POOL+119,10, 'Gold Vein'),
+(@OGUID1+120,@POOL+120,80, 'Mithril Deposit'),
+(@OGUID2+120,@POOL+120,10, 'Truesilver Deposit'),
+(@OGUID3+120,@POOL+120,10, 'Gold Vein'),
+(@OGUID1+121,@POOL+121,80, 'Mithril Deposit'),
+(@OGUID2+121,@POOL+121,10, 'Truesilver Deposit'),
+(@OGUID3+121,@POOL+121,10, 'Gold Vein'),
+(@OGUID1+122,@POOL+122,80, 'Mithril Deposit'),
+(@OGUID2+122,@POOL+122,10, 'Truesilver Deposit'),
+(@OGUID3+122,@POOL+122,10, 'Gold Vein'),
+(@OGUID1+123,@POOL+123,80, 'Mithril Deposit'),
+(@OGUID2+123,@POOL+123,10, 'Truesilver Deposit'),
+(@OGUID3+123,@POOL+123,10, 'Gold Vein'),
+(@OGUID1+124,@POOL+124,80, 'Mithril Deposit'),
+(@OGUID2+124,@POOL+124,10, 'Truesilver Deposit'),
+(@OGUID3+124,@POOL+124,10, 'Gold Vein'),
+(@OGUID1+125,@POOL+125,80, 'Mithril Deposit'),
+(@OGUID2+125,@POOL+125,10, 'Truesilver Deposit'),
+(@OGUID3+125,@POOL+125,10, 'Gold Vein'),
+(@OGUID1+126,@POOL+126,80, 'Mithril Deposit'),
+(@OGUID2+126,@POOL+126,10, 'Truesilver Deposit'),
+(@OGUID3+126,@POOL+126,10, 'Gold Vein'),
+(@OGUID1+127,@POOL+127,80, 'Mithril Deposit'),
+(@OGUID2+127,@POOL+127,10, 'Truesilver Deposit'),
+(@OGUID3+127,@POOL+127,10, 'Gold Vein'),
+(@OGUID1+128,@POOL+128,80, 'Mithril Deposit'),
+(@OGUID2+128,@POOL+128,10, 'Truesilver Deposit'),
+(@OGUID3+128,@POOL+128,10, 'Gold Vein'),
+(@OGUID1+129,@POOL+129,80, 'Mithril Deposit'),
+(@OGUID2+129,@POOL+129,10, 'Truesilver Deposit'),
+(@OGUID3+129,@POOL+129,10, 'Gold Vein'),
+(@OGUID1+130,@POOL+130,80, 'Mithril Deposit'),
+(@OGUID2+130,@POOL+130,10, 'Truesilver Deposit'),
+(@OGUID3+130,@POOL+130,10, 'Gold Vein'),
+(@OGUID1+131,@POOL+131,80, 'Mithril Deposit'),
+(@OGUID2+131,@POOL+131,10, 'Truesilver Deposit'),
+(@OGUID3+131,@POOL+131,10, 'Gold Vein'),
+(@OGUID1+132,@POOL+132,80, 'Mithril Deposit'),
+(@OGUID2+132,@POOL+132,10, 'Truesilver Deposit'),
+(@OGUID3+132,@POOL+132,10, 'Gold Vein'),
+(@OGUID1+133,@POOL+133,80, 'Mithril Deposit'),
+(@OGUID2+133,@POOL+133,10, 'Truesilver Deposit'),
+(@OGUID3+133,@POOL+133,10, 'Gold Vein'),
+(@OGUID1+134,@POOL+134,80, 'Mithril Deposit'),
+(@OGUID2+134,@POOL+134,10, 'Truesilver Deposit'),
+(@OGUID3+134,@POOL+134,10, 'Gold Vein'),
+(@OGUID1+135,@POOL+135,80, 'Mithril Deposit'),
+(@OGUID2+135,@POOL+135,10, 'Truesilver Deposit'),
+(@OGUID3+135,@POOL+135,10, 'Gold Vein'),
+(@OGUID1+136,@POOL+136,80, 'Mithril Deposit'),
+(@OGUID2+136,@POOL+136,10, 'Truesilver Deposit'),
+(@OGUID3+136,@POOL+136,10, 'Gold Vein'),
+(@OGUID1+137,@POOL+137,80, 'Mithril Deposit'),
+(@OGUID2+137,@POOL+137,10, 'Truesilver Deposit'),
+(@OGUID3+137,@POOL+137,10, 'Gold Vein'),
+(@OGUID1+138,@POOL+138,80, 'Mithril Deposit'),
+(@OGUID2+138,@POOL+138,10, 'Truesilver Deposit'),
+(@OGUID3+138,@POOL+138,10, 'Gold Vein'),
+(@OGUID1+139,@POOL+139,80, 'Mithril Deposit'),
+(@OGUID2+139,@POOL+139,10, 'Truesilver Deposit'),
+(@OGUID3+139,@POOL+139,10, 'Gold Vein'),
+(@OGUID1+140,@POOL+140,80, 'Mithril Deposit'),
+(@OGUID2+140,@POOL+140,10, 'Truesilver Deposit'),
+(@OGUID3+140,@POOL+140,10, 'Gold Vein'),
+(@OGUID1+141,@POOL+141,80, 'Mithril Deposit'),
+(@OGUID2+141,@POOL+141,10, 'Truesilver Deposit'),
+(@OGUID3+141,@POOL+141,10, 'Gold Vein'),
+(@OGUID1+142,@POOL+142,80, 'Mithril Deposit'),
+(@OGUID2+142,@POOL+142,10, 'Truesilver Deposit'),
+(@OGUID3+142,@POOL+142,10, 'Gold Vein'),
+(@OGUID1+143,@POOL+143,80, 'Mithril Deposit'),
+(@OGUID2+143,@POOL+143,10, 'Truesilver Deposit'),
+(@OGUID3+143,@POOL+143,10, 'Gold Vein'),
+(@OGUID1+144,@POOL+144,80, 'Mithril Deposit'),
+(@OGUID2+144,@POOL+144,10, 'Truesilver Deposit'),
+(@OGUID3+144,@POOL+144,10, 'Gold Vein'),
+(@OGUID1+145,@POOL+145,80, 'Mithril Deposit'),
+(@OGUID2+145,@POOL+145,10, 'Truesilver Deposit'),
+(@OGUID3+145,@POOL+145,10, 'Gold Vein'),
+(@OGUID1+146,@POOL+146,80, 'Mithril Deposit'),
+(@OGUID2+146,@POOL+146,10, 'Truesilver Deposit'),
+(@OGUID3+146,@POOL+146,10, 'Gold Vein'),
+(@OGUID1+147,@POOL+147,80, 'Mithril Deposit'),
+(@OGUID2+147,@POOL+147,10, 'Truesilver Deposit'),
+(@OGUID3+147,@POOL+147,10, 'Gold Vein'),
+(@OGUID1+148,@POOL+148,80, 'Mithril Deposit'),
+(@OGUID2+148,@POOL+148,10, 'Truesilver Deposit'),
+(@OGUID3+148,@POOL+148,10, 'Gold Vein'),
+(@OGUID1+149,@POOL+149,80, 'Mithril Deposit'),
+(@OGUID2+149,@POOL+149,10, 'Truesilver Deposit'),
+(@OGUID3+149,@POOL+149,10, 'Gold Vein'),
+(@OGUID1+150,@POOL+150,80, 'Mithril Deposit'),
+(@OGUID2+150,@POOL+150,10, 'Truesilver Deposit'),
+(@OGUID3+150,@POOL+150,10, 'Gold Vein'),
+(@OGUID1+151,@POOL+151,80, 'Mithril Deposit'),
+(@OGUID2+151,@POOL+151,10, 'Truesilver Deposit'),
+(@OGUID3+151,@POOL+151,10, 'Gold Vein'),
+(@OGUID1+152,@POOL+152,80, 'Mithril Deposit'),
+(@OGUID2+152,@POOL+152,10, 'Truesilver Deposit'),
+(@OGUID3+152,@POOL+152,10, 'Gold Vein'),
+(@OGUID1+153,@POOL+153,80, 'Mithril Deposit'),
+(@OGUID2+153,@POOL+153,10, 'Truesilver Deposit'),
+(@OGUID3+153,@POOL+153,10, 'Gold Vein'),
+(@OGUID1+154,@POOL+154,80, 'Mithril Deposit'),
+(@OGUID2+154,@POOL+154,10, 'Truesilver Deposit'),
+(@OGUID3+154,@POOL+154,10, 'Gold Vein'),
+(@OGUID1+155,@POOL+155,80, 'Mithril Deposit'),
+(@OGUID2+155,@POOL+155,10, 'Truesilver Deposit'),
+(@OGUID3+155,@POOL+155,10, 'Gold Vein'),
+(@OGUID1+156,@POOL+156,80, 'Mithril Deposit'),
+(@OGUID2+156,@POOL+156,10, 'Truesilver Deposit'),
+(@OGUID3+156,@POOL+156,10, 'Gold Vein'),
+(@OGUID1+157,@POOL+157,80, 'Mithril Deposit'),
+(@OGUID2+157,@POOL+157,10, 'Truesilver Deposit'),
+(@OGUID3+157,@POOL+157,10, 'Gold Vein'),
+(@OGUID1+158,@POOL+158,80, 'Mithril Deposit'),
+(@OGUID2+158,@POOL+158,10, 'Truesilver Deposit'),
+(@OGUID3+158,@POOL+158,10, 'Gold Vein'),
+(@OGUID1+159,@POOL+159,80, 'Mithril Deposit'),
+(@OGUID2+159,@POOL+159,10, 'Truesilver Deposit'),
+(@OGUID3+159,@POOL+159,10, 'Gold Vein'),
+(@OGUID1+160,@POOL+160,80, 'Mithril Deposit'),
+(@OGUID2+160,@POOL+160,10, 'Truesilver Deposit'),
+(@OGUID3+160,@POOL+160,10, 'Gold Vein'),
+(@OGUID1+161,@POOL+161,80, 'Mithril Deposit'),
+(@OGUID2+161,@POOL+161,10, 'Truesilver Deposit'),
+(@OGUID3+161,@POOL+161,10, 'Gold Vein'),
+(@OGUID1+162,@POOL+162,80, 'Mithril Deposit'),
+(@OGUID2+162,@POOL+162,10, 'Truesilver Deposit'),
+(@OGUID3+162,@POOL+162,10, 'Gold Vein'),
+(@OGUID1+163,@POOL+163,80, 'Mithril Deposit'),
+(@OGUID2+163,@POOL+163,10, 'Truesilver Deposit'),
+(@OGUID3+163,@POOL+163,10, 'Gold Vein'),
+(@OGUID1+164,@POOL+164,80, 'Mithril Deposit'),
+(@OGUID2+164,@POOL+164,10, 'Truesilver Deposit'),
+(@OGUID3+164,@POOL+164,10, 'Gold Vein'),
+(@OGUID1+165,@POOL+165,80, 'Mithril Deposit'),
+(@OGUID2+165,@POOL+165,10, 'Truesilver Deposit'),
+(@OGUID3+165,@POOL+165,10, 'Gold Vein'),
+(@OGUID1+166,@POOL+166,80, 'Mithril Deposit'),
+(@OGUID2+166,@POOL+166,10, 'Truesilver Deposit'),
+(@OGUID3+166,@POOL+166,10, 'Gold Vein'),
+(@OGUID1+167,@POOL+167,80, 'Mithril Deposit'),
+(@OGUID2+167,@POOL+167,10, 'Truesilver Deposit'),
+(@OGUID3+167,@POOL+167,10, 'Gold Vein'),
+(@OGUID1+168,@POOL+168,80, 'Mithril Deposit'),
+(@OGUID2+168,@POOL+168,10, 'Truesilver Deposit'),
+(@OGUID3+168,@POOL+168,10, 'Gold Vein'),
+(@OGUID1+169,@POOL+169,80, 'Mithril Deposit'),
+(@OGUID2+169,@POOL+169,10, 'Truesilver Deposit'),
+(@OGUID3+169,@POOL+169,10, 'Gold Vein'),
+(@OGUID1+170,@POOL+170,80, 'Mithril Deposit'),
+(@OGUID2+170,@POOL+170,10, 'Truesilver Deposit'),
+(@OGUID3+170,@POOL+170,10, 'Gold Vein'),
+(@OGUID1+171,@POOL+171,80, 'Mithril Deposit'),
+(@OGUID2+171,@POOL+171,10, 'Truesilver Deposit'),
+(@OGUID3+171,@POOL+171,10, 'Gold Vein'),
+(@OGUID1+172,@POOL+172,80, 'Mithril Deposit'),
+(@OGUID2+172,@POOL+172,10, 'Truesilver Deposit'),
+(@OGUID3+172,@POOL+172,10, 'Gold Vein'),
+(@OGUID1+173,@POOL+173,80, 'Mithril Deposit'),
+(@OGUID2+173,@POOL+173,10, 'Truesilver Deposit'),
+(@OGUID3+173,@POOL+173,10, 'Gold Vein');
+
+-- Add each pool to pool template
+DELETE FROM `pool_template` WHERE `entry` BETWEEN @POOL AND @POOL+@LASTGUID;
+INSERT INTO `pool_template` (`entry`,`max_limit`,`description`) VALUES
+(@POOL+0,1, 'Felwood Ore Spawnpoint'),
+(@POOL+1,1, 'Felwood Ore Spawnpoint'),
+(@POOL+2,1, 'Felwood Ore Spawnpoint'),
+(@POOL+3,1, 'Felwood Ore Spawnpoint'),
+(@POOL+4,1, 'Felwood Ore Spawnpoint'),
+(@POOL+5,1, 'Felwood Ore Spawnpoint'),
+(@POOL+6,1, 'Felwood Ore Spawnpoint'),
+(@POOL+7,1, 'Felwood Ore Spawnpoint'),
+(@POOL+8,1, 'Felwood Ore Spawnpoint'),
+(@POOL+9,1, 'Felwood Ore Spawnpoint'),
+(@POOL+10,1, 'Felwood Ore Spawnpoint'),
+(@POOL+11,1, 'Felwood Ore Spawnpoint'),
+(@POOL+12,1, 'Felwood Ore Spawnpoint'),
+(@POOL+13,1, 'Felwood Ore Spawnpoint'),
+(@POOL+14,1, 'Felwood Ore Spawnpoint'),
+(@POOL+15,1, 'Felwood Ore Spawnpoint'),
+(@POOL+16,1, 'Felwood Ore Spawnpoint'),
+(@POOL+17,1, 'Felwood Ore Spawnpoint'),
+(@POOL+18,1, 'Felwood Ore Spawnpoint'),
+(@POOL+19,1, 'Felwood Ore Spawnpoint'),
+(@POOL+20,1, 'Felwood Ore Spawnpoint'),
+(@POOL+21,1, 'Felwood Ore Spawnpoint'),
+(@POOL+22,1, 'Felwood Ore Spawnpoint'),
+(@POOL+23,1, 'Felwood Ore Spawnpoint'),
+(@POOL+24,1, 'Felwood Ore Spawnpoint'),
+(@POOL+25,1, 'Felwood Ore Spawnpoint'),
+(@POOL+26,1, 'Felwood Ore Spawnpoint'),
+(@POOL+27,1, 'Felwood Ore Spawnpoint'),
+(@POOL+28,1, 'Felwood Ore Spawnpoint'),
+(@POOL+29,1, 'Felwood Ore Spawnpoint'),
+(@POOL+30,1, 'Felwood Ore Spawnpoint'),
+(@POOL+31,1, 'Felwood Ore Spawnpoint'),
+(@POOL+32,1, 'Felwood Ore Spawnpoint'),
+(@POOL+33,1, 'Felwood Ore Spawnpoint'),
+(@POOL+34,1, 'Felwood Ore Spawnpoint'),
+(@POOL+35,1, 'Felwood Ore Spawnpoint'),
+(@POOL+36,1, 'Felwood Ore Spawnpoint'),
+(@POOL+37,1, 'Felwood Ore Spawnpoint'),
+(@POOL+38,1, 'Felwood Ore Spawnpoint'),
+(@POOL+39,1, 'Felwood Ore Spawnpoint'),
+(@POOL+40,1, 'Felwood Ore Spawnpoint'),
+(@POOL+41,1, 'Felwood Ore Spawnpoint'),
+(@POOL+42,1, 'Felwood Ore Spawnpoint'),
+(@POOL+43,1, 'Felwood Ore Spawnpoint'),
+(@POOL+44,1, 'Felwood Ore Spawnpoint'),
+(@POOL+45,1, 'Felwood Ore Spawnpoint'),
+(@POOL+46,1, 'Felwood Ore Spawnpoint'),
+(@POOL+47,1, 'Felwood Ore Spawnpoint'),
+(@POOL+48,1, 'Felwood Ore Spawnpoint'),
+(@POOL+49,1, 'Felwood Ore Spawnpoint'),
+(@POOL+50,1, 'Felwood Ore Spawnpoint'),
+(@POOL+51,1, 'Felwood Ore Spawnpoint'),
+(@POOL+52,1, 'Felwood Ore Spawnpoint'),
+(@POOL+53,1, 'Felwood Ore Spawnpoint'),
+(@POOL+54,1, 'Felwood Ore Spawnpoint'),
+(@POOL+55,1, 'Felwood Ore Spawnpoint'),
+(@POOL+56,1, 'Felwood Ore Spawnpoint'),
+(@POOL+57,1, 'Felwood Ore Spawnpoint'),
+(@POOL+58,1, 'Felwood Ore Spawnpoint'),
+(@POOL+59,1, 'Felwood Ore Spawnpoint'),
+(@POOL+60,1, 'Felwood Ore Spawnpoint'),
+(@POOL+61,1, 'Felwood Ore Spawnpoint'),
+(@POOL+62,1, 'Felwood Ore Spawnpoint'),
+(@POOL+63,1, 'Felwood Ore Spawnpoint'),
+(@POOL+64,1, 'Felwood Ore Spawnpoint'),
+(@POOL+65,1, 'Felwood Ore Spawnpoint'),
+(@POOL+66,1, 'Felwood Ore Spawnpoint'),
+(@POOL+67,1, 'Felwood Ore Spawnpoint'),
+(@POOL+68,1, 'Felwood Ore Spawnpoint'),
+(@POOL+69,1, 'Felwood Ore Spawnpoint'),
+(@POOL+70,1, 'Felwood Ore Spawnpoint'),
+(@POOL+71,1, 'Felwood Ore Spawnpoint'),
+(@POOL+72,1, 'Felwood Ore Spawnpoint'),
+(@POOL+73,1, 'Felwood Ore Spawnpoint'),
+(@POOL+74,1, 'Felwood Ore Spawnpoint'),
+(@POOL+75,1, 'Felwood Ore Spawnpoint'),
+(@POOL+76,1, 'Felwood Ore Spawnpoint'),
+(@POOL+77,1, 'Felwood Ore Spawnpoint'),
+(@POOL+78,1, 'Felwood Ore Spawnpoint'),
+(@POOL+79,1, 'Felwood Ore Spawnpoint'),
+(@POOL+80,1, 'Felwood Ore Spawnpoint'),
+(@POOL+81,1, 'Felwood Ore Spawnpoint'),
+(@POOL+82,1, 'Felwood Ore Spawnpoint'),
+(@POOL+83,1, 'Felwood Ore Spawnpoint'),
+(@POOL+84,1, 'Felwood Ore Spawnpoint'),
+(@POOL+85,1, 'Felwood Ore Spawnpoint'),
+(@POOL+86,1, 'Felwood Ore Spawnpoint'),
+(@POOL+87,1, 'Felwood Ore Spawnpoint'),
+(@POOL+88,1, 'Felwood Ore Spawnpoint'),
+(@POOL+89,1, 'Felwood Ore Spawnpoint'),
+(@POOL+90,1, 'Felwood Ore Spawnpoint'),
+(@POOL+91,1, 'Felwood Ore Spawnpoint'),
+(@POOL+92,1, 'Felwood Ore Spawnpoint'),
+(@POOL+93,1, 'Felwood Ore Spawnpoint'),
+(@POOL+94,1, 'Felwood Ore Spawnpoint'),
+(@POOL+95,1, 'Felwood Ore Spawnpoint'),
+(@POOL+96,1, 'Felwood Ore Spawnpoint'),
+(@POOL+97,1, 'Felwood Ore Spawnpoint'),
+(@POOL+98,1, 'Felwood Ore Spawnpoint'),
+(@POOL+99,1, 'Felwood Ore Spawnpoint'),
+(@POOL+100,1, 'Felwood Ore Spawnpoint'),
+(@POOL+101,1, 'Felwood Ore Spawnpoint'),
+(@POOL+102,1, 'Felwood Ore Spawnpoint'),
+(@POOL+103,1, 'Felwood Ore Spawnpoint'),
+(@POOL+104,1, 'Felwood Ore Spawnpoint'),
+(@POOL+105,1, 'Felwood Ore Spawnpoint'),
+(@POOL+106,1, 'Felwood Ore Spawnpoint'),
+(@POOL+107,1, 'Felwood Ore Spawnpoint'),
+(@POOL+108,1, 'Felwood Ore Spawnpoint'),
+(@POOL+109,1, 'Felwood Ore Spawnpoint'),
+(@POOL+110,1, 'Felwood Ore Spawnpoint'),
+(@POOL+111,1, 'Felwood Ore Spawnpoint'),
+(@POOL+112,1, 'Felwood Ore Spawnpoint'),
+(@POOL+113,1, 'Felwood Ore Spawnpoint'),
+(@POOL+114,1, 'Felwood Ore Spawnpoint'),
+(@POOL+115,1, 'Felwood Ore Spawnpoint'),
+(@POOL+116,1, 'Felwood Ore Spawnpoint'),
+(@POOL+117,1, 'Felwood Ore Spawnpoint'),
+(@POOL+118,1, 'Felwood Ore Spawnpoint'),
+(@POOL+119,1, 'Felwood Ore Spawnpoint'),
+(@POOL+120,1, 'Felwood Ore Spawnpoint'),
+(@POOL+121,1, 'Felwood Ore Spawnpoint'),
+(@POOL+122,1, 'Felwood Ore Spawnpoint'),
+(@POOL+123,1, 'Felwood Ore Spawnpoint'),
+(@POOL+124,1, 'Felwood Ore Spawnpoint'),
+(@POOL+125,1, 'Felwood Ore Spawnpoint'),
+(@POOL+126,1, 'Felwood Ore Spawnpoint'),
+(@POOL+127,1, 'Felwood Ore Spawnpoint'),
+(@POOL+128,1, 'Felwood Ore Spawnpoint'),
+(@POOL+129,1, 'Felwood Ore Spawnpoint'),
+(@POOL+130,1, 'Felwood Ore Spawnpoint'),
+(@POOL+131,1, 'Felwood Ore Spawnpoint'),
+(@POOL+132,1, 'Felwood Ore Spawnpoint'),
+(@POOL+133,1, 'Felwood Ore Spawnpoint'),
+(@POOL+134,1, 'Felwood Ore Spawnpoint'),
+(@POOL+135,1, 'Felwood Ore Spawnpoint'),
+(@POOL+136,1, 'Felwood Ore Spawnpoint'),
+(@POOL+137,1, 'Felwood Ore Spawnpoint'),
+(@POOL+138,1, 'Felwood Ore Spawnpoint'),
+(@POOL+139,1, 'Felwood Ore Spawnpoint'),
+(@POOL+140,1, 'Felwood Ore Spawnpoint'),
+(@POOL+141,1, 'Felwood Ore Spawnpoint'),
+(@POOL+142,1, 'Felwood Ore Spawnpoint'),
+(@POOL+143,1, 'Felwood Ore Spawnpoint'),
+(@POOL+144,1, 'Felwood Ore Spawnpoint'),
+(@POOL+145,1, 'Felwood Ore Spawnpoint'),
+(@POOL+146,1, 'Felwood Ore Spawnpoint'),
+(@POOL+147,1, 'Felwood Ore Spawnpoint'),
+(@POOL+148,1, 'Felwood Ore Spawnpoint'),
+(@POOL+149,1, 'Felwood Ore Spawnpoint'),
+(@POOL+150,1, 'Felwood Ore Spawnpoint'),
+(@POOL+151,1, 'Felwood Ore Spawnpoint'),
+(@POOL+152,1, 'Felwood Ore Spawnpoint'),
+(@POOL+153,1, 'Felwood Ore Spawnpoint'),
+(@POOL+154,1, 'Felwood Ore Spawnpoint'),
+(@POOL+155,1, 'Felwood Ore Spawnpoint'),
+(@POOL+156,1, 'Felwood Ore Spawnpoint'),
+(@POOL+157,1, 'Felwood Ore Spawnpoint'),
+(@POOL+158,1, 'Felwood Ore Spawnpoint'),
+(@POOL+159,1, 'Felwood Ore Spawnpoint'),
+(@POOL+160,1, 'Felwood Ore Spawnpoint'),
+(@POOL+161,1, 'Felwood Ore Spawnpoint'),
+(@POOL+162,1, 'Felwood Ore Spawnpoint'),
+(@POOL+163,1, 'Felwood Ore Spawnpoint'),
+(@POOL+164,1, 'Felwood Ore Spawnpoint'),
+(@POOL+165,1, 'Felwood Ore Spawnpoint'),
+(@POOL+166,1, 'Felwood Ore Spawnpoint'),
+(@POOL+167,1, 'Felwood Ore Spawnpoint'),
+(@POOL+168,1, 'Felwood Ore Spawnpoint'),
+(@POOL+169,1, 'Felwood Ore Spawnpoint'),
+(@POOL+170,1, 'Felwood Ore Spawnpoint'),
+(@POOL+171,1, 'Felwood Ore Spawnpoint'),
+(@POOL+172,1, 'Felwood Ore Spawnpoint'),
+(@POOL+173,1, 'Felwood Ore Spawnpoint');
+
+-- Add each pool to pool_pool
+DELETE FROM `pool_pool` WHERE `pool_id` BETWEEN @POOL AND @POOL+@LASTGUID;
+INSERT INTO `pool_pool` (`pool_id`,`mother_pool`,`chance`,`description`) VALUES
+(@POOL+0,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+1,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+2,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+3,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+4,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+5,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+6,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+7,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+8,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+9,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+10,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+11,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+12,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+13,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+14,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+15,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+16,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+17,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+18,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+19,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+20,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+21,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+22,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+23,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+24,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+25,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+26,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+27,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+28,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+29,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+30,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+31,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+32,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+33,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+34,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+35,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+36,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+37,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+38,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+39,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+40,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+41,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+42,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+43,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+44,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+45,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+46,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+47,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+48,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+49,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+50,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+51,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+52,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+53,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+54,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+55,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+56,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+57,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+58,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+59,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+60,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+61,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+62,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+63,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+64,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+65,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+66,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+67,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+68,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+69,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+70,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+71,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+72,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+73,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+74,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+75,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+76,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+77,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+78,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+79,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+80,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+81,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+82,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+83,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+84,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+85,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+86,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+87,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+88,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+89,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+90,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+91,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+92,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+93,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+94,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+95,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+96,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+97,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+98,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+99,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+100,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+101,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+102,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+103,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+104,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+105,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+106,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+107,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+108,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+109,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+110,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+111,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+112,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+113,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+114,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+115,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+116,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+117,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+118,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+119,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+120,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+121,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+122,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+123,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+124,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+125,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+126,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+127,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+128,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+129,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+130,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+131,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+132,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+133,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+134,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+135,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+136,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+137,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+138,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+139,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+140,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+141,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+142,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+143,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+144,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+145,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+146,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+147,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+148,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+149,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+150,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+151,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+152,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+153,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+154,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+155,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+156,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+157,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+158,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+159,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+160,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+161,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+162,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+163,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+164,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+165,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+166,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+167,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+168,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+169,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+170,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+171,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+172,@MOTHER,0, 'Felwood Ore Spawnpoint'),
+(@POOL+173,@MOTHER,0, 'Felwood Ore Spawnpoint');
+
+UPDATE `gameobject` SET `PhaseId`=169 WHERE `PhaseId`=1;
diff --git a/sql/updates/world/6.x/2016_06_20_02_world.sql b/sql/updates/world/6.x/2016_06_20_02_world.sql
new file mode 100644
index 00000000000..38034246657
--- /dev/null
+++ b/sql/updates/world/6.x/2016_06_20_02_world.sql
@@ -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)
diff --git a/sql/updates/world/6.x/2016_06_23_00_world.sql b/sql/updates/world/6.x/2016_06_23_00_world.sql
new file mode 100644
index 00000000000..42f23376051
--- /dev/null
+++ b/sql/updates/world/6.x/2016_06_23_00_world.sql
@@ -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);
diff --git a/sql/updates/world/6.x/2016_06_23_01_world.sql b/sql/updates/world/6.x/2016_06_23_01_world.sql
new file mode 100644
index 00000000000..843ee299caa
--- /dev/null
+++ b/sql/updates/world/6.x/2016_06_23_01_world.sql
@@ -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);
diff --git a/sql/updates/world/6.x/2016_06_23_02_world.sql b/sql/updates/world/6.x/2016_06_23_02_world.sql
new file mode 100644
index 00000000000..43f2c02dcf2
--- /dev/null
+++ b/sql/updates/world/6.x/2016_06_23_02_world.sql
@@ -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');
diff --git a/sql/updates/world/6.x/2016_06_25_00_world.sql b/sql/updates/world/6.x/2016_06_25_00_world.sql
new file mode 100644
index 00000000000..b82331b7a19
--- /dev/null
+++ b/sql/updates/world/6.x/2016_06_25_00_world.sql
@@ -0,0 +1,2 @@
+--
+UPDATE `creature_template` SET `flags_extra`=64 WHERE `entry` IN(53714, 57873, 58168, 60162, 60931, 65069);
diff --git a/sql/updates/world/6.x/2016_06_26_00_world.sql b/sql/updates/world/6.x/2016_06_26_00_world.sql
new file mode 100644
index 00000000000..ead8bc25478
--- /dev/null
+++ b/sql/updates/world/6.x/2016_06_26_00_world.sql
@@ -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');
diff --git a/sql/updates/world/6.x/2016_06_28_00_world.sql b/sql/updates/world/6.x/2016_06_28_00_world.sql
new file mode 100644
index 00000000000..f56a204ba5c
--- /dev/null
+++ b/sql/updates/world/6.x/2016_06_28_00_world.sql
@@ -0,0 +1,2 @@
+--
+UPDATE `creature_template` SET `npcflag`=`npcflag` &~2 WHERE `entry` IN (15294);
diff --git a/sql/updates/world/6.x/2016_06_28_01_world.sql b/sql/updates/world/6.x/2016_06_28_01_world.sql
new file mode 100644
index 00000000000..b5414324100
--- /dev/null
+++ b/sql/updates/world/6.x/2016_06_28_01_world.sql
@@ -0,0 +1,2 @@
+--
+UPDATE `creature_template` SET `npcflag`=`npcflag` &~2 WHERE `entry` IN (15273, 15298);
diff --git a/sql/updates/world/6.x/2016_06_30_00_world.sql b/sql/updates/world/6.x/2016_06_30_00_world.sql
new file mode 100644
index 00000000000..4684bf97b77
--- /dev/null
+++ b/sql/updates/world/6.x/2016_06_30_00_world.sql
@@ -0,0 +1,2 @@
+--
+DELETE FROM `creature_queststarter` WHERE `id` IN (3101,16521,16522);
diff --git a/sql/updates/world/6.x/2016_07_05_00_world.sql b/sql/updates/world/6.x/2016_07_05_00_world.sql
new file mode 100644
index 00000000000..e81a39afd96
--- /dev/null
+++ b/sql/updates/world/6.x/2016_07_05_00_world.sql
@@ -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');
diff --git a/src/common/GitRevision.cpp b/src/common/GitRevision.cpp
index 2b4537db448..1f4c28cd310 100644
--- a/src/common/GitRevision.cpp
+++ b/src/common/GitRevision.cpp
@@ -46,19 +46,30 @@ char const* GitRevision::GetHotfixesDatabase()
return _HOTFIXES_DATABASE;
}
-#define _PACKAGENAME "TrinityCore"
-
-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
+# 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
- return _PACKAGENAME " rev. " VER_PRODUCTVERSION_STR " (Unix, " _BUILD_DIRECTIVE ")";
+# define TRINITY_LINKAGE_TYPE_STR "Dynamic"
#endif
+
+char const* GitRevision::GetFullVersion()
+{
+ return "TrinityCore rev. " VER_PRODUCTVERSION_STR
+ " (" TRINITY_PLATFORM_STR ", " _BUILD_DIRECTIVE ", " TRINITY_LINKAGE_TYPE_STR ")";
}
char const* GitRevision::GetCompanyNameStr()
diff --git a/src/common/Utilities/EventProcessor.cpp b/src/common/Utilities/EventProcessor.cpp
index be74d58b790..2341d0a0872 100644
--- a/src/common/Utilities/EventProcessor.cpp
+++ b/src/common/Utilities/EventProcessor.cpp
@@ -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;
+ itr->second->SetAborted();
+ itr->second->Abort(m_time);
+ }
- if (!force) // need per-element cleanup
- m_events.erase (i_old);
+ // 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);
}
-
diff --git a/src/common/Utilities/EventProcessor.h b/src/common/Utilities/EventProcessor.h
index e10558e6a21..57f3065f323 100644
--- a/src/common/Utilities/EventProcessor.h
+++ b/src/common/Utilities/EventProcessor.h
@@ -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
diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp
index fc729e04e5b..f88307db19c 100644
--- a/src/server/database/Database/Implementation/CharacterDatabase.cpp
+++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp
@@ -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);
diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp
index 210516eaf7c..524392fb474 100644
--- a/src/server/database/Database/Implementation/HotfixDatabase.cpp
+++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp
@@ -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
diff --git a/src/server/database/Database/Implementation/HotfixDatabase.h b/src/server/database/Database/Implementation/HotfixDatabase.h
index f49e28b8de2..4221e05f0cc 100644
--- a/src/server/database/Database/Implementation/HotfixDatabase.h
+++ b/src/server/database/Database/Implementation/HotfixDatabase.h
@@ -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,
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index 9c95eca9db1..1d0d061a6db 100644
--- a/src/server/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
@@ -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)
diff --git a/src/server/game/Achievements/CriteriaHandler.cpp b/src/server/game/Achievements/CriteriaHandler.cpp
index 3c8a5241809..c8acd18671e 100644
--- a/src/server/game/Achievements/CriteriaHandler.cpp
+++ b/src/server/game/Achievements/CriteriaHandler.cpp
@@ -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;
+ 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:
+ {
+ 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;
- if (op & CRITERIA_TREE_OPERATOR_ANY && completedCount >= requiredCount)
+ return false;
+ }
+ case CRITERIA_TREE_OPERATOR_ANY:
{
- if (!tree->Criteria)
- return true;
+ uint64 progress = 0;
+ for (CriteriaTree const* node : tree->Children)
+ if (IsCompletedCriteriaTree(node))
+ if (++progress >= requiredCount)
+ return true;
- break;
+ return false;
}
+ default:
+ break;
}
- if (op & CRITERIA_TREE_OPERATOR_ANY && completedCount < requiredCount)
- return false;
+ return false;
+}
- if (op & CRITERIA_TREE_OPERATOR_ALL && !hasAll)
+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 (!tree->Criteria)
- return true;
-
- return IsCompletedCriteria(tree->Criteria, requiredCount);
+ return true;
}
bool CriteriaHandler::CanCompleteCriteriaTree(CriteriaTree const* /*tree*/)
diff --git a/src/server/game/Achievements/CriteriaHandler.h b/src/server/game/Achievements/CriteriaHandler.h
index 4d269a894bd..adabca54ac9 100644
--- a/src/server/game/Achievements/CriteriaHandler.h
+++ b/src/server/game/Achievements/CriteriaHandler.h
@@ -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*/) { }
diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp
index 449e614a900..147070f98af 100644
--- a/src/server/game/Battlegrounds/Battleground.cpp
+++ b/src/server/game/Battlegrounds/Battleground.cpp
@@ -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;
}
}
diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp
index 2acf3205ddc..2d7c3003688 100644
--- a/src/server/game/DataStores/DB2Stores.cpp
+++ b/src/server/game/DataStores/DB2Stores.cpp
@@ -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);
diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h
index fc8407eb96b..9ee2bb3b553 100644
--- a/src/server/game/DataStores/DB2Stores.h
+++ b/src/server/game/DataStores/DB2Stores.h
@@ -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;
diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h
index 47e54d1f7af..f9a7c7116d8 100644
--- a/src/server/game/DataStores/DB2Structure.h
+++ b/src/server/game/DataStores/DB2Structure.h
@@ -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;
};
diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h
index dd29591e22f..3159039d6cd 100644
--- a/src/server/game/DataStores/DBCEnums.h
+++ b/src/server/game/DataStores/DBCEnums.h
@@ -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
diff --git a/src/server/game/DataStores/GameTables.h b/src/server/game/DataStores/GameTables.h
index 1d4e9126955..c9b9547847c 100644
--- a/src/server/game/DataStores/GameTables.h
+++ b/src/server/game/DataStores/GameTables.h
@@ -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__
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
index 68ee386be3f..568c0e39469 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
+++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
@@ -15,13 +15,14 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "Unit.h"
-#include "SpellInfo.h"
+#include "AreaTrigger.h"
+#include "DB2Stores.h"
#include "Log.h"
+#include "SpellInfo.h"
+#include "Unit.h"
#include "UpdateData.h"
-#include "AreaTrigger.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);
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.h b/src/server/game/Entities/AreaTrigger/AreaTrigger.h
index e3caa6d2e95..1b3e6f02a3e 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTrigger.h
+++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.h
@@ -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
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index 679238ecb17..ab5db4c0b04 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -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;
}
diff --git a/src/server/game/Entities/DynamicObject/DynamicObject.cpp b/src/server/game/Entities/DynamicObject/DynamicObject.cpp
index ea925148084..25684b44db6 100644
--- a/src/server/game/Entities/DynamicObject/DynamicObject.cpp
+++ b/src/server/game/Entities/DynamicObject/DynamicObject.cpp
@@ -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());
diff --git a/src/server/game/Entities/DynamicObject/DynamicObject.h b/src/server/game/Entities/DynamicObject/DynamicObject.h
index 09426a3c044..4d1cdefdd48 100644
--- a/src/server/game/Entities/DynamicObject/DynamicObject.h
+++ b/src/server/game/Entities/DynamicObject/DynamicObject.h
@@ -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
diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp
index 9bb17ec1fa5..103eee0d1f0 100644
--- a/src/server/game/Entities/Item/Item.cpp
+++ b/src/server/game/Entities/Item/Item.cpp
@@ -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);
}
diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h
index 756d21e7856..cacea73bf87 100644
--- a/src/server/game/Entities/Item/ItemTemplate.h
+++ b/src/server/game/Entities/Item/ItemTemplate.h
@@ -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; }
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index a59624515dd..8ac7e909471 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -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
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 4f2df580d54..1c4c1d57dd4 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -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
diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp
index 035bc4d8703..2c9da5cf672 100644
--- a/src/server/game/Entities/Unit/StatSystem.cpp
+++ b/src/server/game/Entities/Unit/StatSystem.cpp
@@ -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;
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index e117a859da6..abb2f8a9d07 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -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;
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index 209958f430b..8dbe00d54c2 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -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; }
diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp
index a1523db5d62..9f3c91f2e35 100644
--- a/src/server/game/Entities/Vehicle/Vehicle.cpp
+++ b/src/server/game/Entities/Vehicle/Vehicle.cpp
@@ -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
diff --git a/src/server/game/Handlers/BattlenetHandler.cpp b/src/server/game/Handlers/BattlenetHandler.cpp
index 1f968c3b423..2324ae51959 100644
--- a/src/server/game/Handlers/BattlenetHandler.cpp
+++ b/src/server/game/Handlers/BattlenetHandler.cpp
@@ -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());
diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp
index 938523afb8a..91a8eee27e6 100644
--- a/src/server/game/Handlers/ItemHandler.cpp
+++ b/src/server/game/Handlers/ItemHandler.cpp
@@ -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));
+}
diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp
index f110425c1a4..abf20d1920a 100644
--- a/src/server/game/Loot/LootMgr.cpp
+++ b/src/server/game/Loot/LootMgr.cpp
@@ -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;
diff --git a/src/server/game/Loot/LootMgr.h b/src/server/game/Loot/LootMgr.h
index 006edab70a6..f7c1085eaad 100644
--- a/src/server/game/Loot/LootMgr.h
+++ b/src/server/game/Loot/LootMgr.h
@@ -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){ };
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h
index 54461828da4..b76281ffeac 100644
--- a/src/server/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
@@ -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)
diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp
index 70f0e717e7c..5fe41518cbc 100644
--- a/src/server/game/Scripting/ScriptMgr.cpp
+++ b/src/server/game/Scripting/ScriptMgr.cpp
@@ -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);
diff --git a/src/server/game/Server/Packets/ItemPackets.cpp b/src/server/game/Server/Packets/ItemPackets.cpp
index 3ae94dfb84a..c6609812af5 100644
--- a/src/server/game/Server/Packets/ItemPackets.cpp
+++ b/src/server/game/Server/Packets/ItemPackets.cpp
@@ -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;
+}
diff --git a/src/server/game/Server/Packets/ItemPackets.h b/src/server/game/Server/Packets/ItemPackets.h
index 384ba7eea5b..aef6060b260 100644
--- a/src/server/game/Server/Packets/ItemPackets.h
+++ b/src/server/game/Server/Packets/ItemPackets.h
@@ -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:
diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp
index 599d07e0d87..be57dc2ab9d 100644
--- a/src/server/game/Server/Packets/SpellPackets.cpp
+++ b/src/server/game/Server/Packets/SpellPackets.cpp
@@ -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;
diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h
index a3a68c8e194..60299e06c4d 100644
--- a/src/server/game/Server/Packets/SpellPackets.h
+++ b/src/server/game/Server/Packets/SpellPackets.h
@@ -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:
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 777f69c1c17..3dbd9a60ad9 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -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);
diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h
index 87a9f180a4a..dbd448e1bba 100644
--- a/src/server/game/Server/Protocol/Opcodes.h
+++ b/src/server/game/Server/Protocol/Opcodes.h
@@ -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,
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 02ba3d182ec..757ea968ed1 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -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);
diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h
index 9eb6ad5c864..34023c16d1b 100644
--- a/src/server/game/Spells/Auras/SpellAuraDefines.h
+++ b/src/server/game/Spells/Auras/SpellAuraDefines.h
@@ -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
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
index a6ab82e2211..21eb48c3fa5 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
@@ -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_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_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_TREE_OF_LIFE:
+ case FORM_TRAVEL_FORM:
+ case FORM_AQUATIC_FORM:
+ case FORM_AMBIENT:
+
+ 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_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 ***/
/********************************/
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.h b/src/server/game/Spells/Auras/SpellAuraEffects.h
index 8df069df7f3..b599fe1df28 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.h
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.h
@@ -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;
diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp
index d0af2af8f97..0aa5d752c60 100644
--- a/src/server/game/Spells/Auras/SpellAuras.cpp
+++ b/src/server/game/Spells/Auras/SpellAuras.cpp
@@ -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;
}
}
diff --git a/src/server/game/Spells/Auras/SpellAuras.h b/src/server/game/Spells/Auras/SpellAuras.h
index 253b07768f0..83b6343ceef 100644
--- a/src/server/game/Spells/Auras/SpellAuras.h
+++ b/src/server/game/Spells/Auras/SpellAuras.h
@@ -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;
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index c69c2ebea5f..de5d96f9894 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -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;
+ 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)
+ {
+ 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();
- 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;
+ 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;
+ }
+ }
- range_type = m_spellInfo->RangeEntry->Flags;
+ 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
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 3720c2addc8..6a98cd525c2 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -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;
}
diff --git a/src/server/game/Spells/SpellHistory.cpp b/src/server/game/Spells/SpellHistory.cpp
index b6c7fdc17ec..657d6027594 100644
--- a/src/server/game/Spells/SpellHistory.cpp
+++ b/src/server/game/Spells/SpellHistory.cpp
@@ -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)
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp
index 362d5e8df35..5db23525a7f 100644
--- a/src/server/game/Spells/SpellInfo.cpp
+++ b/src/server/game/Spells/SpellInfo.cpp
@@ -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];
diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h
index a5d620571a3..0888c7ebb6e 100644
--- a/src/server/game/Spells/SpellInfo.h
+++ b/src/server/game/Spells/SpellInfo.h
@@ -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();
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index 84cbbe90b7e..0ab8b919664 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -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;
- }
-
- uint32 count = 0;
- bool finished = false;
-
- do
- {
- // 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);
- 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);
+ if (!skillAbility->SupercedesSpell)
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)
+
+ if (!GetSpellInfo(skillAbility->SupercedesSpell) || !GetSpellInfo(skillAbility->SpellID))
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);
+ chains[skillAbility->SupercedesSpell] = skillAbility->SpellID;
+ hasPrev.insert(skillAbility->SpellID);
+ }
- 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;
+ // each key in chains that isn't present in hasPrev is a first rank
+ for (auto itr = chains.begin(); itr != chains.end(); ++itr)
+ {
+ if (hasPrev.count(itr->first))
+ continue;
- if (itr == rankChain.end())
+ SpellInfo const* first = AssertSpellInfo(itr->first);
+ SpellInfo const* next = AssertSpellInfo(itr->second);
+
+ 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];
+
+ 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);
diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp
index dd087a63146..6f27d733eb8 100644
--- a/src/server/scripts/Commands/cs_misc.cpp
+++ b/src/server/scripts/Commands/cs_misc.cpp
@@ -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)
{
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp
index b87c836c2a4..84ee5cd97db 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp
@@ -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))
{
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp
index 33afada15fd..3a7d8547cc9 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp
@@ -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();
}
diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp
index 2c941a4f757..bb7ad7a84c0 100644
--- a/src/server/scripts/Spells/spell_druid.cpp
+++ b/src/server/scripts/Spells/spell_druid.cpp
@@ -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);
diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp
index cf9ff3ef28b..f0ebfb23427 100644
--- a/src/server/scripts/Spells/spell_generic.cpp
+++ b/src/server/scripts/Spells/spell_generic.cpp
@@ -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();
}
diff --git a/src/server/scripts/Spells/spell_monk.cpp b/src/server/scripts/Spells/spell_monk.cpp
index 904089bc451..fd91db9216f 100644
--- a/src/server/scripts/Spells/spell_monk.cpp
+++ b/src/server/scripts/Spells/spell_monk.cpp
@@ -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();
}
diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist
index 73b5719ec18..5bf03012ec1 100644
--- a/src/server/worldserver/worldserver.conf.dist
+++ b/src/server/worldserver/worldserver.conf.dist
@@ -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"
diff --git a/src/tools/connection_patcher/Patches/Common.hpp b/src/tools/connection_patcher/Patches/Common.hpp
index 22e22beedcd..58215a42419 100644
--- a/src/tools/connection_patcher/Patches/Common.hpp
+++ b/src/tools/connection_patcher/Patches/Common.hpp
@@ -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)";
}
};
}