aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmake/macros/FindMySQL.cmake7
-rw-r--r--sql/updates/world/2011_12_10_00_world_spell_proc_event.sql2
-rw-r--r--sql/updates/world/2011_12_10_01_world_achievement_criteria_data.sql23
-rw-r--r--sql/updates/world/2011_12_12_00_world_spell_bonus_data.sql3
-rw-r--r--sql/updates/world/2011_12_13_00_world_misc.sql6
-rw-r--r--sql/updates/world/2011_12_13_01_world_achievement_criteria_data.sql12
-rw-r--r--sql/updates/world/2011_12_13_02_creature_template_addon.sql2
-rw-r--r--sql/updates/world/2011_12_14_00_world_command.sql4
-rw-r--r--sql/updates/world/2011_12_14_01_world_gameobject_template.sql1
-rw-r--r--sql/updates/world/2011_12_16_00_world_creature_template.sql4
-rw-r--r--sql/updates/world/2011_12_16_00_world_spell_bonus_data.sql5
-rw-r--r--sql/updates/world/2011_12_17_00_world_creature.sql974
-rw-r--r--sql/updates/world/2011_12_17_00_world_gameobject.sql384
-rw-r--r--sql/updates/world/2011_12_18_00_world_creature_addon.sql2
-rw-r--r--sql/updates/world/2011_12_18_01_world_gossip.sql42
-rw-r--r--sql/updates/world/2011_12_18_02_world_spell_script_names.sql3
-rw-r--r--sql/updates/world/2011_12_18_03_world_trinity_string.sql3
-rw-r--r--sql/updates/world/2011_12_18_04_world_misc.sql87
-rw-r--r--sql/updates/world/2011_12_18_05_world_misc.sql94
-rw-r--r--sql/updates/world/2011_12_18_06_world_sai.sql14
-rw-r--r--sql/updates/world/2011_12_18_07_world_conditions.sql17
-rw-r--r--sql/updates/world/2011_12_19_00_world_conditions.sql7
-rw-r--r--sql/updates/world/2011_12_19_01_world_quest_template.sql2
-rw-r--r--sql/updates/world/2011_12_19_02_world_achievement_criteria_data.sql11
-rw-r--r--sql/updates/world/2011_12_24_00_world_sai.sql10
-rw-r--r--sql/updates/world/2011_12_24_00_world_spell_proc_event.sql1
-rw-r--r--sql/updates/world/2011_12_24_01_world_mail_loot_template.sql41
-rw-r--r--src/server/game/AI/CoreAI/GameObjectAI.h1
-rwxr-xr-xsrc/server/game/AI/CoreAI/UnitAI.h1
-rwxr-xr-xsrc/server/game/AI/EventAI/CreatureEventAI.cpp2
-rwxr-xr-xsrc/server/game/AI/EventAI/CreatureEventAI.h2
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp1
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.cpp13
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.h2
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp20
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp10
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.h15
-rwxr-xr-xsrc/server/game/Achievements/AchievementMgr.cpp50
-rwxr-xr-xsrc/server/game/Achievements/AchievementMgr.h2
-rwxr-xr-xsrc/server/game/Chat/Channels/Channel.cpp12
-rwxr-xr-xsrc/server/game/Chat/Chat.cpp36
-rwxr-xr-xsrc/server/game/Chat/Commands/Level0.cpp13
-rwxr-xr-xsrc/server/game/Chat/Commands/TicketCommands.cpp61
-rwxr-xr-xsrc/server/game/Conditions/ConditionMgr.cpp5
-rwxr-xr-xsrc/server/game/DataStores/DBCEnums.h23
-rwxr-xr-xsrc/server/game/DataStores/DBCStructure.h5
-rwxr-xr-xsrc/server/game/DungeonFinding/LFGMgr.cpp2
-rwxr-xr-xsrc/server/game/Entities/Corpse/Corpse.cpp16
-rwxr-xr-xsrc/server/game/Entities/Corpse/Corpse.h2
-rwxr-xr-xsrc/server/game/Entities/Creature/Creature.cpp3
-rwxr-xr-xsrc/server/game/Entities/Creature/Creature.h5
-rwxr-xr-xsrc/server/game/Entities/Creature/TemporarySummon.cpp10
-rwxr-xr-xsrc/server/game/Entities/Creature/TemporarySummon.h6
-rwxr-xr-xsrc/server/game/Entities/DynamicObject/DynamicObject.cpp7
-rwxr-xr-xsrc/server/game/Entities/DynamicObject/DynamicObject.h4
-rwxr-xr-xsrc/server/game/Entities/GameObject/GameObject.cpp2
-rwxr-xr-xsrc/server/game/Entities/Object/Object.cpp34
-rwxr-xr-xsrc/server/game/Entities/Object/Object.h7
-rwxr-xr-xsrc/server/game/Entities/Pet/Pet.cpp5
-rwxr-xr-xsrc/server/game/Entities/Player/Player.cpp68
-rwxr-xr-xsrc/server/game/Entities/Player/Player.h7
-rwxr-xr-xsrc/server/game/Entities/Totem/Totem.cpp2
-rwxr-xr-xsrc/server/game/Entities/Transport/Transport.cpp4
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.cpp400
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.h6
-rwxr-xr-xsrc/server/game/Entities/Vehicle/Vehicle.cpp2
-rwxr-xr-xsrc/server/game/Events/GameEventMgr.cpp27
-rwxr-xr-xsrc/server/game/Events/GameEventMgr.h1
-rwxr-xr-xsrc/server/game/Globals/ObjectAccessor.h20
-rwxr-xr-xsrc/server/game/Globals/ObjectMgr.cpp19
-rwxr-xr-xsrc/server/game/Grids/Grid.h7
-rwxr-xr-xsrc/server/game/Grids/GridStates.cpp2
-rwxr-xr-xsrc/server/game/Grids/NGrid.h22
-rwxr-xr-xsrc/server/game/Grids/Notifiers/GridNotifiers.cpp6
-rwxr-xr-xsrc/server/game/Groups/Group.cpp1
-rwxr-xr-xsrc/server/game/Guilds/Guild.cpp1
-rwxr-xr-xsrc/server/game/Mails/Mail.cpp8
-rwxr-xr-xsrc/server/game/Maps/Map.cpp126
-rwxr-xr-xsrc/server/game/Maps/Map.h4
-rwxr-xr-xsrc/server/game/Miscellaneous/Language.h7
-rwxr-xr-xsrc/server/game/Miscellaneous/SharedDefines.h72
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp3
-rwxr-xr-xsrc/server/game/Server/Protocol/Handlers/AuctionHouseHandler.cpp15
-rwxr-xr-xsrc/server/game/Server/Protocol/Handlers/CharacterHandler.cpp157
-rwxr-xr-xsrc/server/game/Server/Protocol/Handlers/CombatHandler.cpp23
-rwxr-xr-xsrc/server/game/Server/Protocol/Handlers/ItemHandler.cpp2
-rwxr-xr-xsrc/server/game/Server/Protocol/Handlers/MiscHandler.cpp45
-rwxr-xr-xsrc/server/game/Server/Protocol/Handlers/MovementHandler.cpp2
-rwxr-xr-xsrc/server/game/Server/Protocol/Handlers/NPCHandler.cpp29
-rwxr-xr-xsrc/server/game/Server/Protocol/Handlers/PetitionsHandler.cpp12
-rwxr-xr-xsrc/server/game/Server/Protocol/Handlers/QueryHandler.cpp3
-rwxr-xr-xsrc/server/game/Server/WorldSession.cpp57
-rwxr-xr-xsrc/server/game/Server/WorldSession.h28
-rwxr-xr-xsrc/server/game/Spells/Auras/SpellAuraEffects.cpp31
-rwxr-xr-xsrc/server/game/Spells/Auras/SpellAuras.cpp1
-rwxr-xr-xsrc/server/game/Spells/Spell.cpp58
-rwxr-xr-xsrc/server/game/Spells/Spell.h2
-rwxr-xr-xsrc/server/game/Spells/SpellEffects.cpp177
-rw-r--r--src/server/game/Spells/SpellInfo.cpp13
-rwxr-xr-xsrc/server/game/Spells/SpellMgr.cpp4
-rwxr-xr-xsrc/server/game/World/World.h3
-rw-r--r--src/server/scripts/Commands/cs_modify.cpp7
-rw-r--r--src/server/scripts/Commands/cs_npc.cpp10
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp6
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp2
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp8
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp2
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp2
-rw-r--r--src/server/scripts/Kalimdor/durotar.cpp4
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp208
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp8
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp5
-rw-r--r--src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp3
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp1
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp2
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp1
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp2
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp37
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/oculus.h3
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp4
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp4
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp4
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp4
-rw-r--r--src/server/scripts/Outland/nagrand.cpp2
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp53
-rw-r--r--src/server/scripts/World/go_scripts.cpp82
-rw-r--r--src/server/scripts/World/npcs_special.cpp179
-rwxr-xr-xsrc/server/shared/Database/DatabaseWorkerPool.h7
-rwxr-xr-xsrc/server/shared/Database/Implementation/CharacterDatabase.cpp9
-rwxr-xr-xsrc/server/shared/Database/Implementation/CharacterDatabase.h7
-rwxr-xr-xsrc/server/shared/Database/MySQLConnection.cpp7
-rwxr-xr-xsrc/server/shared/Database/MySQLConnection.h1
-rwxr-xr-xsrc/server/shared/Debugging/Errors.h3
-rwxr-xr-xsrc/server/shared/Threading/Callback.h121
-rwxr-xr-xsrc/server/shared/Threading/LockedQueue.h7
-rwxr-xr-xsrc/server/worldserver/CommandLine/CliRunnable.cpp2
-rwxr-xr-xsrc/server/worldserver/RemoteAccess/RASocket.cpp2
-rw-r--r--src/server/worldserver/worldserver.conf.dist3
139 files changed, 3388 insertions, 1043 deletions
diff --git a/cmake/macros/FindMySQL.cmake b/cmake/macros/FindMySQL.cmake
index 5c05fdb884d..d42dc5caf74 100644
--- a/cmake/macros/FindMySQL.cmake
+++ b/cmake/macros/FindMySQL.cmake
@@ -75,13 +75,16 @@ find_path(MYSQL_INCLUDE_DIR
"C:/Program Files/MySQL/include"
"C:/Program Files/MySQL/MySQL Server 5.0/include"
"C:/Program Files/MySQL/MySQL Server 5.1/include"
+ "C:/Program Files/MySQL/MySQL Server 5.6/include"
"C:/MySQL/include"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.0;Location]/include"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.1;Location]/include"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.5;Location]/include"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.6;Location]/include"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.0;Location]/include"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.1;Location]/include"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.5;Location]/include"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.6;Location]/include"
"$ENV{ProgramFiles}/MySQL/*/include"
"$ENV{SystemDrive}/MySQL/*/include"
"c:/msys/local/include"
@@ -115,13 +118,17 @@ if( WIN32 )
"C:/Program Files/MySQL/lib"
"C:/Program Files/MySQL/MySQL Server 5.0/lib/opt"
"C:/Program Files/MySQL/MySQL Server 5.1/lib/opt"
+ "C:/Program Files/MySQL/MySQL Server 5.6/lib/opt"
"C:/MySQL/lib/debug"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.0;Location]/lib/opt"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.1;Location]/lib/opt"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.6;Location]/lib/opt"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.5;Location]/lib"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.6;Location]/lib"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.0;Location]/lib/opt"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.1;Location]/lib/opt"
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.5;Location]/lib"
+ "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.6;Location]/lib"
"$ENV{ProgramFiles}/MySQL/*/lib/opt"
"$ENV{SystemDrive}/MySQL/*/lib/opt"
"c:/msys/local/include"
diff --git a/sql/updates/world/2011_12_10_00_world_spell_proc_event.sql b/sql/updates/world/2011_12_10_00_world_spell_proc_event.sql
new file mode 100644
index 00000000000..957a2e76b70
--- /dev/null
+++ b/sql/updates/world/2011_12_10_00_world_spell_proc_event.sql
@@ -0,0 +1,2 @@
+-- Bloodsurge
+UPDATE `spell_proc_event` SET `procEx` = 0x0040000 WHERE `entry` = 46915;
diff --git a/sql/updates/world/2011_12_10_01_world_achievement_criteria_data.sql b/sql/updates/world/2011_12_10_01_world_achievement_criteria_data.sql
new file mode 100644
index 00000000000..70e4a4fc544
--- /dev/null
+++ b/sql/updates/world/2011_12_10_01_world_achievement_criteria_data.sql
@@ -0,0 +1,23 @@
+DELETE FROM `achievement_criteria_data` WHERE criteria_id IN (5220, 5215, 5218, 5221, 5216, 5219, 5213, 5018, 5217, 5214, 5233, 5235, 5232, 5234, 5238, 5236, 5229, 5237, 5230, 5231);
+-- Classes
+INSERT INTO `achievement_criteria_data` VALUES (5220, 2, 1, 0, ''); -- Realm First! Level 80 Warrior
+INSERT INTO `achievement_criteria_data` VALUES (5215, 2, 2, 0, ''); -- Realm First! Level 80 Paladin
+INSERT INTO `achievement_criteria_data` VALUES (5218, 2, 3, 0, ''); -- Realm First! Level 80 Hunter
+INSERT INTO `achievement_criteria_data` VALUES (5221, 2, 4, 0, ''); -- Realm First! Level 80 Rogue
+INSERT INTO `achievement_criteria_data` VALUES (5216, 2, 5, 0, ''); -- Realm First! Level 80 Priest
+INSERT INTO `achievement_criteria_data` VALUES (5219, 2, 6, 0, ''); -- Realm First! Level 80 Death Knight
+INSERT INTO `achievement_criteria_data` VALUES (5213, 2, 7, 0, ''); -- Realm First! Level 80 Shaman
+INSERT INTO `achievement_criteria_data` VALUES (5018, 2, 8, 0, ''); -- Realm First! Level 80 Mage
+INSERT INTO `achievement_criteria_data` VALUES (5217, 2, 9, 0, ''); -- Realm First! Level 80 Warlock
+INSERT INTO `achievement_criteria_data` VALUES (5214, 2, 11, 0, ''); -- Realm First! Level 80 Druid
+-- Races
+INSERT INTO `achievement_criteria_data` VALUES (5233, 2, 0, 1, ''); -- Realm First! Level 80 Human
+INSERT INTO `achievement_criteria_data` VALUES (5235, 2, 0, 2, ''); -- Realm First! Level 80 Orc
+INSERT INTO `achievement_criteria_data` VALUES (5232, 2, 0, 3, ''); -- Realm First! Level 80 Dwarf
+INSERT INTO `achievement_criteria_data` VALUES (5234, 2, 0, 4, ''); -- Realm First! Level 80 Night Elf
+INSERT INTO `achievement_criteria_data` VALUES (5238, 2, 0, 5, ''); -- Realm First! Level 80 Undead
+INSERT INTO `achievement_criteria_data` VALUES (5236, 2, 0, 6, ''); -- Realm First! Level 80 Tauren
+INSERT INTO `achievement_criteria_data` VALUES (5229, 2, 0, 7, ''); -- Realm First! Level 80 Gnome
+INSERT INTO `achievement_criteria_data` VALUES (5237, 2, 0, 8, ''); -- Realm First! Level 80 Troll
+INSERT INTO `achievement_criteria_data` VALUES (5230, 2, 0, 10, ''); -- Realm First! Level 80 Blood Elf
+INSERT INTO `achievement_criteria_data` VALUES (5231, 2, 0, 11, ''); -- Realm First! Level 80 Draenei
diff --git a/sql/updates/world/2011_12_12_00_world_spell_bonus_data.sql b/sql/updates/world/2011_12_12_00_world_spell_bonus_data.sql
new file mode 100644
index 00000000000..cb728e70dd9
--- /dev/null
+++ b/sql/updates/world/2011_12_12_00_world_spell_bonus_data.sql
@@ -0,0 +1,3 @@
+DELETE FROM `spell_bonus_data` WHERE `entry` IN (52042,5672);
+INSERT INTO `spell_bonus_data` (`entry`,`direct_bonus`,`dot_bonus`,`ap_bonus`,`ap_dot_bonus`,`comments`) VALUES
+(5672,0.0827,-1,-1,-1, 'Shaman - Healing Stream Totem Rank 1');
diff --git a/sql/updates/world/2011_12_13_00_world_misc.sql b/sql/updates/world/2011_12_13_00_world_misc.sql
new file mode 100644
index 00000000000..48848c368f1
--- /dev/null
+++ b/sql/updates/world/2011_12_13_00_world_misc.sql
@@ -0,0 +1,6 @@
+DELETE FROM `creature_text` WHERE `entry`=28012;
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
+(28012,0,0,'The trickster Mage-Lord Urom protects the third ring. He will appear alone and defenseless, but do not be fooled by appearences! Urom is a powerful conjurer who commands a menagerie of Phantasmal creatures. Seek him out above.',12,0,0,0,0,0,''),
+(28012,1,1,'Your greatest challenge lies ahead. Ley-Guardian Eregos is a Blue dragon of immense power. You will find him flying above the uppermost ring.',12,0,0,0,0,0,'');
+
+UPDATE `creature_template` SET `ScriptName`='npc_image_belgaristrasz' WHERE `entry`=28012; \ No newline at end of file
diff --git a/sql/updates/world/2011_12_13_01_world_achievement_criteria_data.sql b/sql/updates/world/2011_12_13_01_world_achievement_criteria_data.sql
new file mode 100644
index 00000000000..9f3f22d7792
--- /dev/null
+++ b/sql/updates/world/2011_12_13_01_world_achievement_criteria_data.sql
@@ -0,0 +1,12 @@
+-- Experienced Drake Rider Achiev
+
+DELETE FROM `disables` WHERE `entry` IN (7177,7178,7179);
+
+DELETE FROM `achievement_criteria_data` WHERE `criteria_id` IN (7177,7178,7179);
+INSERT INTO `achievement_criteria_data` (`criteria_id`,`type`,`value1`,`value2`,`ScriptName`) VALUES
+(7177,5,49460,1,''), -- Amber Drake
+(7177,12,1,0, ''), -- hc mode only
+(7178,5,49346,1,''), -- Emerald Drake
+(7178,12,1,0, ''), -- hc mode only
+(7179,5,49464,1,''), -- Ruby Drake
+(7179,12,1,0, ''); -- hc mode only \ No newline at end of file
diff --git a/sql/updates/world/2011_12_13_02_creature_template_addon.sql b/sql/updates/world/2011_12_13_02_creature_template_addon.sql
new file mode 100644
index 00000000000..2e7280927bf
--- /dev/null
+++ b/sql/updates/world/2011_12_13_02_creature_template_addon.sql
@@ -0,0 +1,2 @@
+-- Fix speed of oculus drakes
+UPDATE `creature_template_addon` SET `auras`='50325' WHERE `entry` IN (27755,27692,27756); \ No newline at end of file
diff --git a/sql/updates/world/2011_12_14_00_world_command.sql b/sql/updates/world/2011_12_14_00_world_command.sql
new file mode 100644
index 00000000000..e871a82d89d
--- /dev/null
+++ b/sql/updates/world/2011_12_14_00_world_command.sql
@@ -0,0 +1,4 @@
+DELETE FROM `trinity_string` WHERE `entry` IN(19,20); # unused entries
+INSERT INTO `trinity_string` (`entry`,`content_default`) VALUES
+(19,'Update time diff: %u.'),
+(20,'Time left until shutdown/restart: %s');
diff --git a/sql/updates/world/2011_12_14_01_world_gameobject_template.sql b/sql/updates/world/2011_12_14_01_world_gameobject_template.sql
new file mode 100644
index 00000000000..12729afd6b8
--- /dev/null
+++ b/sql/updates/world/2011_12_14_01_world_gameobject_template.sql
@@ -0,0 +1 @@
+UPDATE `gameobject_template` SET `scriptName` = 'go_ethereal_teleport_pad' WHERE `entry` = 184073; -- Update Ethereal Teleport Pad scriptname \ No newline at end of file
diff --git a/sql/updates/world/2011_12_16_00_world_creature_template.sql b/sql/updates/world/2011_12_16_00_world_creature_template.sql
new file mode 100644
index 00000000000..156fd431359
--- /dev/null
+++ b/sql/updates/world/2011_12_16_00_world_creature_template.sql
@@ -0,0 +1,4 @@
+-- Greater Fire Elemental script
+UPDATE `creature_template` SET `ScriptName`='npc_fire_elemental' WHERE `entry`=15438;
+-- Greater Earth Elemental script
+UPDATE `creature_template` SET `ScriptName`='npc_earth_elemental' WHERE `entry`=15352; \ No newline at end of file
diff --git a/sql/updates/world/2011_12_16_00_world_spell_bonus_data.sql b/sql/updates/world/2011_12_16_00_world_spell_bonus_data.sql
new file mode 100644
index 00000000000..3250bda4fdb
--- /dev/null
+++ b/sql/updates/world/2011_12_16_00_world_spell_bonus_data.sql
@@ -0,0 +1,5 @@
+-- Bounus coef for Greater Fire Elemental spells
+DELETE FROM `spell_bonus_data` WHERE `entry` IN (13376,57984);
+INSERT INTO `spell_bonus_data` (`entry`, `direct_bonus`, `dot_bonus`,`ap_bonus`, `ap_dot_bonus`, `comments`) VALUES
+(13376,0.032,-1,-1,-1,'Greater Fire Elemental - Fire Shield'),
+(57984,0.4289,-1,-1,-1,'Greater Fire Elemental - Fire Blast'); \ No newline at end of file
diff --git a/sql/updates/world/2011_12_17_00_world_creature.sql b/sql/updates/world/2011_12_17_00_world_creature.sql
new file mode 100644
index 00000000000..0126561da01
--- /dev/null
+++ b/sql/updates/world/2011_12_17_00_world_creature.sql
@@ -0,0 +1,974 @@
+-- -------------
+-- UBRS FIXUP --
+-- -------------
+SET @GUID := 137817; -- 289 required
+DELETE FROM `creature` WHERE `map`=229 AND `id` IN (9098,9257,9258,9416,9045,9097,10339,9096,10083,10366,10371,10372,10680,10681,9816,9817,9818,9819,10317,10316,10740,16048,10430,10509,10363,10429,10318,10319,10742,10762,10899,10683,10264,10162);
+DELETE FROM `creature` WHERE `guid` BETWEEN @GUID AND @GUID+288;
+INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`) VALUES
+-- Pyroguard Emberseer
+(@GUID,9816,229,1,1,0,0,144.438171,-258.034149,96.40662,4.677482,1000000,0,0,1,0,0),
+-- Rage Talon Dragonspawn
+(@GUID+1,9096,229,1,1,0,0,100.742607,-246.0053,106.518906,2.65290046,7200,0,0,1,0,0),
+(@GUID+2,9096,229,1,1,0,0,101.678032,-237.6665,106.518906,3.54301834,7200,0,0,1,0,0),
+(@GUID+3,9096,229,1,1,0,0,102.156441,-253.07338,106.5189,4.72320032,7200,0,0,1,0,0),
+(@GUID+4,9096,229,1,1,0,0,103.098129,-364.3394,116.925743,5.86430645,7200,0,0,1,0,0),
+(@GUID+5,9096,229,1,1,0,0,105.175392,-327.1109,106.518906,2.53072739,7200,0,0,1,0,0),
+(@GUID+6,9096,229,1,1,0,0,128.020447,-315.29,111.029076,2.984513,7200,0,0,1,0,0),
+(@GUID+7,9096,229,1,1,0,0,136.037247,-338.207458,111.043625,0.6457718,7200,0,0,1,0,0),
+(@GUID+8,9096,229,1,1,0,0,136.2818,-308.682281,111.073242,0.279252678,7200,0,0,1,0,0),
+(@GUID+9,9096,229,1,1,0,0,136.424042,-316.1892,111.063728,0.0174532924,7200,0,0,1,0,0),
+(@GUID+10,9096,229,1,1,0,0,138.315643,-395.08606,122.058578,4.764749,7200,0,0,1,0,0),
+(@GUID+11,9096,229,1,1,0,0,142.593109,-342.274048,111.040665,1.39626336,7200,0,0,1,0,0),
+(@GUID+12,9096,229,1,1,0,0,147.042328,-312.391449,71.03966,5.550147,7200,10,0,1,0,1),
+(@GUID+13,9096,229,1,1,0,0,153.89537,-332.387146,70.95632,3.14905024,7200,0,0,1,0,0),
+(@GUID+14,9096,229,1,1,0,0,161.09,-316.201721,70.95632,1.913126,7200,10,0,1,0,1),
+(@GUID+15,9096,229,1,1,0,0,165.520889,-394.921417,122.058556,4.677482,7200,0,0,1,0,0),
+(@GUID+16,9096,229,1,1,0,0,167.774048,-338.655426,111.0341,2.79252672,7200,0,0,1,0,0),
+(@GUID+17,9096,229,1,1,0,0,193.480331,-314.875244,77.0207748,5.375614,7200,10,0,1,0,1),
+(@GUID+18,9096,229,1,1,0,0,195.986176,-291.863159,76.93301,2.74624467,7200,10,0,1,0,1),
+(@GUID+19,9096,229,1,1,0,0,92.24497,-427.635468,111.006088,3.159046,7200,0,0,1,0,0),
+(@GUID+20,9096,229,1,1,0,0,94.5186539,-256.702728,91.53693,6.265732,7200,0,0,1,0,0),
+(@GUID+21,9096,229,1,1,0,0,96.17891,-268.540375,91.53113,1.37881,7200,0,0,1,0,0),
+(@GUID+22,9096,229,1,1,0,0,97.91753,-333.680664,106.5189,1.93731546,7200,0,0,1,0,0),
+-- Rage Talon Flamescale
+(@GUID+23,10083,229,1,1,0,0,102.801758,-332.1205,106.518906,2.21656823,7200,0,0,1,0,0),
+(@GUID+24,10083,229,1,1,0,0,141.698181,-394.829071,122.058556,4.86946869,7200,0,0,1,0,0),
+(@GUID+25,10083,229,1,1,0,0,151.5985,-312.834961,110.825859,1.583788,7200,0,0,1,0,0),
+(@GUID+26,10083,229,1,1,0,0,157.517059,-366.047333,116.844231,6.27482271,7200,0,0,1,0,0),
+(@GUID+27,10083,229,1,1,0,0,161.314163,-393.648651,122.058533,4.86946869,7200,0,0,1,0,0),
+(@GUID+28,10083,229,1,1,0,0,161.339554,-343.435425,111.039314,1.850049,7200,0,0,1,0,0),
+(@GUID+29,10083,229,1,1,0,0,74.99681,-316.2664,91.52034,5.86179638,7200,7,0,1,0,1),
+(@GUID+30,10083,229,1,1,0,0,81.0063858,-284.352936,91.53317,5.951573,7200,7,0,1,0,1),
+-- Rage Talon Dragon Guard
+(@GUID+31,10366,229,1,1,0,0,11.332943,-492.121582,111.022545,0.7330383,7200,0,0,1,0,0),
+(@GUID+32,10366,229,1,1,0,0,165.272675,-475.4804,116.842445,0.01255145,7200,0,0,1,0,0),
+(@GUID+33,10366,229,1,1,0,0,27.6826859,-426.0668,111.009117,5.480334,7200,0,0,1,0,0),
+(@GUID+34,10366,229,1,1,0,0,31.2498379,-497.100922,111.035072,1.27409029,7200,0,0,1,0,0),
+(@GUID+35,10366,229,1,1,0,0,39.75237,-426.769226,111.010643,3.96189737,7200,0,0,1,0,0),
+(@GUID+36,10366,229,1,1,0,0,43.22777,-449.182983,111.026749,3.85717773,7200,0,0,1,0,0),
+(@GUID+37,10366,229,1,1,0,0,8.27626,-487.534119,111.013985,0.436332315,7200,0,0,1,0,0),
+(@GUID+38,10366,229,1,1,0,0,92.84775,-489.693024,116.925728,1.58824956,7200,0,0,1,0,0),
+-- Goraluk Anvilcrack <Blackhand Legion Armorsmith>
+(@GUID+39,10899,229,1,1,0,0,147.684921,-242.757523,111.004608,1.7652961,7200,0,0,1,0,0),
+-- Rage Talon Captain
+(@GUID+40,10371,229,1,1,0,0,-10.6942663,-350.008,111.026779,0.8552113,7200,0,0,1,0,0),
+(@GUID+41,10371,229,1,1,0,0,-16.02218,-263.335266,111.026764,5.70722675,7200,0,0,1,0,0),
+(@GUID+42,10371,229,1,1,0,0,20.24981,-263.2449,111.026764,3.651049,7200,0,0,1,0,0),
+(@GUID+43,10371,229,1,1,0,0,33.96815,-327.537231,111.026779,4.729842,7200,0,0,1,0,0),
+(@GUID+44,10371,229,1,1,0,0,8.802712,-450.5478,111.020157,5.689773,7200,0,0,1,0,0),
+-- Rage Talon Fire Tongue
+(@GUID+45,10372,229,1,1,0,0,-15.58145,-344.314941,111.026779,0.715585,7200,0,0,1,0,0),
+(@GUID+46,10372,229,1,1,0,0,16.30601,-449.322784,111.029114,4.468043,7200,0,0,1,0,0),
+(@GUID+47,10372,229,1,1,0,0,21.4282932,-475.194733,111.038452,1.76278257,7200,0,0,1,0,0),
+(@GUID+48,10372,229,1,1,0,0,23.7180157,-258.2444,111.030754,3.46037364,7200,0,0,1,0,0),
+(@GUID+49,10372,229,1,1,0,0,26.412632,-327.414429,111.026779,4.79965544,7200,0,0,1,0,0),
+(@GUID+50,10372,229,1,1,0,0,6.645312,-460.464966,111.016,0.418879032,7200,0,0,1,0,0),
+(@GUID+51,10372,229,1,1,0,0,86.68403,-480.173737,116.925743,0.8552113,7200,0,0,1,0,0),
+-- Blackhand Summoner <Blackhand Legion>
+(@GUID+52,9818,229,1,1,0,0,124.871681,-334.522583,71.04309,4.694936,7200,0,0,1,0,0),
+(@GUID+53,9818,229,1,1,0,0,128.321472,-295.045166,71.06125,3.874631,7200,0,0,1,0,0),
+(@GUID+54,9818,229,1,1,0,0,130.4315,-340.0683,71.0431061,3.17649913,7200,0,0,1,0,0),
+(@GUID+55,9818,229,1,1,0,0,151.102859,-358.37,71.02174,1.20427716,7200,0,0,1,0,0),
+(@GUID+56,9818,229,1,1,0,0,156.814621,-283.34024,71.03544,1.98967528,7200,0,0,1,0,0),
+(@GUID+57,9818,229,1,1,0,0,162.630127,-243.073456,111.034378,4.32841635,7200,0,0,1,0,0),
+(@GUID+58,9818,229,1,1,0,0,170.605957,-362.35318,116.924133,4.86946869,7200,0,0,1,0,0),
+(@GUID+59,9818,229,1,1,0,0,179.994781,-365.8944,116.925758,3.19395256,7200,0,0,1,0,0),
+(@GUID+60,9818,229,1,1,0,0,188.856033,-258.8772,77.03584,6.07374573,7200,0,0,1,0,0),
+(@GUID+61,9818,229,1,1,0,0,212.137329,-339.792267,76.9862747,1.15191734,7200,0,0,1,0,0),
+(@GUID+62,9818,229,1,1,0,0,217.200012,-259.563751,82.1870956,6.265732,7200,0,0,1,0,0),
+(@GUID+63,9818,229,1,1,0,0,223.7043,-297.484253,77.05145,5.46288061,7200,0,0,1,0,0),
+(@GUID+64,9818,229,1,1,0,0,224.405029,-307.493042,77.05062,0.7853982,7200,0,0,1,0,0),
+(@GUID+65,9818,229,1,1,0,0,87.17487,-363.085022,117.796295,4.729842,7200,0,0,1,0,0),
+(@GUID+66,9818,229,1,1,0,0,90.10163,-419.203979,111.006088,0.994837642,7200,0,0,1,0,0),
+-- Blackhand Veteran <Blackhand Legion>
+(@GUID+67,9819,229,1,1,0,0,113.70948,-366.072266,116.932022,5.82939959,7200,0,0,1,0,0),
+(@GUID+68,9819,229,1,1,0,0,120.166054,-295.048645,71.06183,5.497787,7200,0,0,1,0,0),
+(@GUID+69,9819,229,1,1,0,0,121.719147,-301.576538,71.0559845,0.75049156,7200,0,0,1,0,0),
+(@GUID+70,9819,229,1,1,0,0,141.709488,-299.4828,111.032074,0.0349065848,7200,0,0,1,0,0),
+(@GUID+71,9819,229,1,1,0,0,141.762787,-302.243439,111.031624,0.122173049,7200,0,0,1,0,0),
+(@GUID+72,9819,229,1,1,0,0,141.79213,-296.809937,111.031372,6.23082542,7200,0,0,1,0,0),
+(@GUID+73,9819,229,1,1,0,0,142.861816,-272.084259,111.026764,6.213372,7200,0,0,1,0,0),
+(@GUID+74,9819,229,1,1,0,0,142.902451,-275.0304,111.026955,0.0349065848,7200,0,0,1,0,0),
+(@GUID+75,9819,229,1,1,0,0,142.97287,-277.891327,111.027122,0.139626339,7200,0,0,1,0,0),
+(@GUID+76,9819,229,1,1,0,0,144.939285,-257.132019,110.919548,5.82939959,7200,0,0,1,0,0),
+(@GUID+77,9819,229,1,1,0,0,149.200531,-252.04541,110.907585,1.20427716,7200,0,0,1,0,0),
+(@GUID+78,9819,229,1,1,0,0,149.248459,-249.036591,110.907883,4.86946869,7200,0,0,1,0,0),
+(@GUID+79,9819,229,1,1,0,0,150.514359,-354.057831,71.0197,5.21853447,7200,0,0,1,0,0),
+(@GUID+80,9819,229,1,1,0,0,157.248657,-291.7521,71.0334,1.69296932,7200,0,0,1,0,0),
+(@GUID+81,9819,229,1,1,0,0,157.8796,-359.290649,71.0255661,1.53588974,7200,0,0,1,0,0),
+(@GUID+82,9819,229,1,1,0,0,159.268585,-245.612747,111.026138,6.23082542,7200,0,0,1,0,0),
+(@GUID+83,9819,229,1,1,0,0,161.448456,-317.885559,111.022552,3.17649913,7200,0,0,1,0,0),
+(@GUID+84,9819,229,1,1,0,0,161.471252,-314.998138,111.022469,3.19395256,7200,0,0,1,0,0),
+(@GUID+85,9819,229,1,1,0,0,161.5384,-320.877258,111.025208,3.12413931,7200,0,0,1,0,0),
+(@GUID+86,9819,229,1,1,0,0,168.431061,-288.5739,111.0254,2.91469979,7200,0,0,1,0,0),
+(@GUID+87,9819,229,1,1,0,0,168.467117,-285.357452,111.0254,3.159046,7200,0,0,1,0,0),
+(@GUID+88,9819,229,1,1,0,0,168.529587,-282.207245,111.0254,3.38593864,7200,0,0,1,0,0),
+(@GUID+89,9819,229,1,1,0,0,172.878586,-365.445526,116.925789,2.84488654,7200,0,0,1,0,0),
+(@GUID+90,9819,229,1,1,0,0,178.113251,-364.08963,116.925758,4.956735,7200,0,0,1,0,0),
+(@GUID+91,9819,229,1,1,0,0,191.3293,-272.009766,77.03062,5.61996031,7200,0,0,1,0,0),
+(@GUID+92,9819,229,1,1,0,0,194.615189,-255.948486,77.019455,4.310963,7200,0,0,1,0,0),
+(@GUID+93,9819,229,1,1,0,0,195.222046,-271.912567,77.03062,3.78736448,7200,0,0,1,0,0),
+(@GUID+94,9819,229,1,1,0,0,212.101151,-336.132416,76.955864,5.096361,7200,0,0,1,0,0),
+(@GUID+95,9819,229,1,1,0,0,222.666229,-334.5855,77.01298,3.07177949,7200,0,0,1,0,0),
+(@GUID+96,9819,229,1,1,0,0,225.916336,-261.5317,82.1132355,4.103862,7200,0,0,1,0,0),
+(@GUID+97,9819,229,1,1,0,0,85.73412,-373.6244,116.925743,0.6806784,7200,0,0,1,0,0),
+(@GUID+98,9819,229,1,1,0,0,87.50004,-426.620819,111.006088,5.916666,7200,0,0,1,0,0),
+(@GUID+99,9819,229,1,1,0,0,90.02657,-367.4056,117.518463,2.51327419,7200,0,0,1,0,0),
+(@GUID+100,9819,229,1,1,0,0,92.1094,-415.1748,111.006096,4.59021568,7200,0,0,1,0,0),
+(@GUID+101,9819,229,1,1,0,0,106.9291,-367.275757,116.925743,2.30383468,7200,0,0,1,0,0),
+-- Awbee
+(@GUID+102,10740,229,1,1,0,0,70.54358,-420.442535,110.846558,0.75049156,7200,0,0,1,0,0),
+-- Blackhand Incarcerator <Blackhand Legion>
+(@GUID+103,10316,229,1,1,0,0,126.3072,-258.6249,91.637146,0.0349065848,7200,0,0,1,0,0),
+(@GUID+104,10316,229,1,1,0,0,126.446983,-276.596771,91.6375656,0.820304751,7200,0,0,1,0,0),
+(@GUID+105,10316,229,1,1,0,0,126.507553,-240.895081,91.62151,5.532694,7200,0,0,1,0,0),
+(@GUID+106,10316,229,1,1,0,0,144.283234,-240.993958,91.62266,4.729842,7200,0,0,1,0,0),
+(@GUID+107,10316,229,1,1,0,0,162.216324,-240.97139,91.68952,3.89208412,7200,0,0,1,0,0),
+(@GUID+108,10316,229,1,1,0,0,162.327271,-276.7592,91.69608,2.32128787,7200,0,0,1,0,0),
+(@GUID+109,10316,229,1,1,0,0,162.459671,-258.961456,91.61771,3.08923268,7200,0,0,1,0,0),
+-- Lord Valthalak Trigger
+(@GUID+110,16048,229,1,1,0,0,50.1153679,-534.537354,111.019806,6.161012,7200,0,0,1,0,0),
+-- Blackhand Dreadweaver <Blackhand Legion>
+(@GUID+111,9817,229,1,1,0,0,119.028313,-340.441254,71.04595,0.0349065848,7200,0,0,1,0,0),
+(@GUID+112,9817,229,1,1,0,0,122.051933,-293.15744,71.06183,5.497787,7200,0,0,1,0,0),
+(@GUID+113,9817,229,1,1,0,0,125.033432,-346.358124,71.04615,1.60570288,7200,0,0,1,0,0),
+(@GUID+114,9817,229,1,1,0,0,154.42865,-289.456,71.02977,6.17846537,7200,0,0,1,0,0),
+(@GUID+116,9817,229,1,1,0,0,159.006119,-347.022461,71.01292,0.802851439,7200,0,0,1,0,0),
+(@GUID+117,9817,229,1,1,0,0,159.043167,-288.595856,71.03185,3.64773822,7200,0,0,1,0,0),
+(@GUID+118,9817,229,1,1,0,0,163.503326,-247.513779,111.025925,2.09439516,7200,0,0,1,0,0),
+(@GUID+119,9817,229,1,1,0,0,169.915909,-367.141479,116.925789,1.134464,7200,0,0,1,0,0),
+(@GUID+120,9817,229,1,1,0,0,177.830521,-367.561035,116.925758,1.15191734,7200,0,0,1,0,0),
+(@GUID+121,9817,229,1,1,0,0,190.633072,-263.9589,77.03324,0.9599311,7200,0,0,1,0,0),
+(@GUID+122,9817,229,1,1,0,0,215.519485,-337.73288,76.95243,3.106686,7200,0,0,1,0,0),
+(@GUID+123,9817,229,1,1,0,0,221.517853,-258.423828,82.12929,3.04173565,7200,0,0,1,0,0),
+(@GUID+124,9817,229,1,1,0,0,225.8605,-266.1465,82.087326,3.30034256,7200,0,0,1,0,0),
+(@GUID+125,9817,229,1,1,0,0,232.839737,-297.4911,77.0545654,4.08407,7200,0,0,1,0,0),
+(@GUID+126,9817,229,1,1,0,0,234.324112,-306.76416,77.06055,2.443461,7200,0,0,1,0,0),
+(@GUID+127,9817,229,1,1,0,0,85.6391449,-366.950134,116.925743,0.802851439,7200,0,0,1,0,0),
+(@GUID+128,9817,229,1,1,0,0,93.9203949,-417.965485,111.006088,2.79252672,7200,0,0,1,0,0),
+-- Blackhand Thug
+(@GUID+129,10762,229,1,1,0,0,71.6325,-421.34613,110.794823,1.74532926,7200,0,0,1,0,0),
+(@GUID+130,10762,229,1,1,0,0,71.74594,-419.1056,111.144218,4.694936,7200,0,0,1,0,0),
+-- Blackhand Elite <Blackhand Legion>
+(@GUID+131,10317,229,1,1,0,0,119.342194,-567.1412,107.25071,5.916666,7200,0,0,1,0,0),
+(@GUID+132,10317,229,1,1,0,0,120.0068,-563.2474,107.453323,5.846853,7200,0,0,1,0,0),
+(@GUID+133,10317,229,1,1,0,0,144.60112,-299.439117,110.735207,3.08923268,7200,0,0,1,0,0),
+(@GUID+134,10317,229,1,1,0,0,146.275345,-275.0636,111.0268,3.106686,7200,0,0,1,0,0),
+(@GUID+135,10317,229,1,1,0,0,15.7085686,-269.44873,110.943428,3.70086622,7200,0,0,1,0,0),
+(@GUID+136,10317,229,1,1,0,0,158.335342,-317.906342,110.734566,0.0349065848,7200,0,0,1,0,0),
+(@GUID+137,10317,229,1,1,0,0,11.4635525,-262.667877,110.943428,3.70086479,7200,0,0,1,0,0),
+(@GUID+138,10317,229,1,1,0,0,164.433945,-285.266144,111.025864,0,7200,0,0,1,0,0),
+(@GUID+139,10317,229,1,1,0,0,-18.404726,-338.186249,111.026764,0.5934119,7200,0,0,1,0,0),
+(@GUID+140,10317,229,1,1,0,0,20.7244225,-468.8023,111.035339,4.834562,7200,0,0,1,0,0),
+(@GUID+141,10317,229,1,1,0,0,24.4351749,-268.222015,111.026764,2.830616,7200,0,0,1,0,0),
+(@GUID+142,10317,229,1,1,0,0,29.5069962,-385.555267,110.747688,5.42797375,7200,0,0,1,0,0),
+(@GUID+143,10317,229,1,1,0,0,-3.292078,-259.9108,111.026764,5.480334,7200,0,0,1,0,0),
+(@GUID+144,10317,229,1,1,0,0,30.4171047,-332.906921,111.026779,4.764749,7200,0,0,1,0,0),
+(@GUID+145,10317,229,1,1,0,0,35.48675,-492.949921,111.035957,3.054326,7200,0,0,1,0,0),
+(@GUID+146,10317,229,1,1,0,0,37.333168,-333.77887,111.026779,4.660029,7200,0,0,1,0,0),
+(@GUID+147,10317,229,1,1,0,0,37.9199028,-451.0573,111.028809,0.08726646,7200,0,0,1,0,0),
+(@GUID+148,10317,229,1,1,0,0,-5.026564,-352.542572,111.026779,0.9599311,7200,0,0,1,0,0),
+(@GUID+149,10317,229,1,1,0,0,97.21676,-476.817535,116.925743,5.23598766,7200,0,0,1,0,0),
+-- Lord Victor Nefarius <Lord of Blackrock>
+(@GUID+150,10162,229,1,1,0,0,163.168335,-444.165,122.058609,3.12413931,7200,0,0,1,0,0),
+-- Warchief Rend Blackhand
+(@GUID+151,10429,229,1,1,0,0,159.276138,-443.619049,122.058609,6.265732,7200,0,0,1,0,0),
+-- The Beast
+(@GUID+152,10430,229,1,1,0,0,124.21048,-563.799438,107.4246,2.75762,7200,0,0,1,0,0),
+-- Jed Runewatcher <Blackhand Legion> RARE
+(@GUID+153,10509,229,1,1,0,0,165.09407,-341.9633,110.951019,1.588817,7200,0,0,1,0,0),
+-- General Drakkisath
+(@GUID+154,10363,229,1,1,0,0,36.4508629,-285.993561,111.036224,3.14159274,7200,0,0,1,0,0),
+-- Blackhand Assassin <Blackhand Legion>
+(@GUID+155,10318,229,1,1,0,0,117.948341,-569.3336,107.13662,5.98647928,7200,0,0,1,0,0),
+(@GUID+156,10318,229,1,1,0,0,18.2123585,-471.40033,111.030594,6.17846537,7200,0,0,1,0,0),
+(@GUID+157,10318,229,1,1,0,0,23.50665,-470.537872,111.03933,3.56047153,7200,0,0,1,0,0),
+(@GUID+158,10318,229,1,1,0,0,31.8534851,-490.6625,111.036209,4.32841635,7200,0,0,1,0,0),
+(@GUID+159,10318,229,1,1,0,0,38.164032,-385.480133,110.797859,4.18879032,7200,0,0,1,0,0),
+(@GUID+160,10318,229,1,1,0,0,40.42038,-453.613342,111.024033,1.34390354,7200,0,0,1,0,0),
+(@GUID+161,10318,229,1,1,0,0,-6.880112,-252.370468,111.026764,5.42797375,7200,0,0,1,0,0),
+(@GUID+162,10318,229,1,1,0,0,71.493454,-474.6056,115.778786,6.27848864,7200,0,0,1,0,0),
+(@GUID+163,10318,229,1,1,0,0,99.72865,-479.4235,116.925743,2.75762,7200,0,0,1,0,0),
+-- Blackhand Iron Guard <Blackhand Legion>
+(@GUID+164,10319,229,1,1,0,0,10.1526937,-457.006958,111.020668,4.502949,7200,0,0,1,0,0),
+(@GUID+165,10319,229,1,1,0,0,11.7395382,-460.466461,111.021942,2.80998015,7200,0,0,1,0,0),
+(@GUID+166,10319,229,1,1,0,0,124.05793,-470.958618,116.925743,3.85717773,7200,0,0,1,0,0),
+(@GUID+167,10319,229,1,1,0,0,124.094147,-478.257874,116.925743,2.37364769,7200,0,0,1,0,0),
+(@GUID+168,10319,229,1,1,0,0,-13.7761574,-274.925873,111.026764,5.899213,7200,0,0,1,0,0),
+(@GUID+169,10319,229,1,1,0,0,137.4377,-458.1639,121.873993,1.61019349,7200,0,0,1,0,0),
+(@GUID+170,10319,229,1,1,0,0,172.060364,-470.11795,116.907768,3.38593864,7200,0,0,1,0,0),
+(@GUID+171,10319,229,1,1,0,0,172.2113,-479.1257,116.922729,2.77507353,7200,0,0,1,0,0),
+(@GUID+172,10319,229,1,1,0,0,25.9503689,-431.148,111.036423,3.455752,7200,0,0,1,0,0),
+(@GUID+173,10319,229,1,1,0,0,27.20901,-487.106232,110.948944,5.92132044,7200,0,0,1,0,0),
+(@GUID+174,10319,229,1,1,0,0,30.4782486,-381.1838,110.765739,4.97418833,7200,0,0,1,0,0),
+(@GUID+175,10319,229,1,1,0,0,32.98562,-441.197968,110.947975,4.68552542,7200,0,0,1,0,0),
+(@GUID+177,10319,229,1,1,0,0,40.66904,-330.527466,111.026779,4.62512255,7200,0,0,1,0,0),
+(@GUID+178,10319,229,1,1,0,0,42.51416,-431.718781,111.029396,5.934119,7200,0,0,1,0,0),
+(@GUID+179,10319,229,1,1,0,0,-8.141677,-341.8935,111.026779,0.7679449,7200,0,0,1,0,0),
+(@GUID+180,10319,229,1,1,0,0,-9.265498,-265.802856,111.026764,5.67232,7200,0,0,1,0,0),
+-- Scarshield Acolyte <Scarshield Legion>
+(@GUID+181,9045,229,1,1,0,0,107.023872,-306.314117,54.00366,4.22369671,7200,0,0,1,0,0),
+(@GUID+182,9045,229,1,1,0,0,107.412292,-329.5834,54.003273,5.20108128,7200,0,0,1,0,0),
+(@GUID+183,9045,229,1,1,0,0,14.1215773,-259.2284,65.43308,2.3561945,7200,0,0,1,0,0),
+(@GUID+184,9045,229,1,1,0,0,18.0154171,-276.733521,65.375824,1.0306716,7200,4,0,1,0,1),
+(@GUID+185,9045,229,1,1,0,0,46.5601959,-453.7283,26.3562088,2.40855432,7200,0,0,1,0,0),
+(@GUID+186,9045,229,1,1,0,0,48.0624542,-257.406921,65.45917,0.418879032,7200,0,0,1,0,0),
+(@GUID+187,9045,229,1,1,0,0,5.471476,-520.6829,29.48178,3.4382987,7200,0,0,1,0,0),
+(@GUID+188,9045,229,1,1,0,0,52.8444061,-312.8106,54.00366,0.575958669,7200,0,0,1,0,0),
+(@GUID+189,9045,229,1,1,0,0,69.2313843,-439.3284,41.19126,3.159046,7200,0,0,1,0,0),
+(@GUID+190,9045,229,1,1,0,0,75.6738052,-319.729126,55.8668,1.71042264,7200,5,0,1,0,1),
+(@GUID+191,9045,229,1,1,0,0,79.86551,-353.9204,60.78536,0.87266463,7200,4,0,1,0,1),
+-- Scarshield Legionnaire <Scarshield Legion>
+(@GUID+192,9097,229,1,1,0,0,-1.888463,-585.6428,29.2742,2.49582076,7200,0,0,1,0,0),
+(@GUID+193,9097,229,1,1,0,0,102.429573,-314.697754,54.00119,1.06465089,7200,0,0,1,0,0),
+(@GUID+194,9097,229,1,1,0,0,107.2788,-324.246582,54.00367,3.50811172,7200,0,0,1,0,0),
+(@GUID+195,9097,229,1,1,0,0,107.6331,-311.3865,54.00366,2.67035365,7200,0,0,1,0,0),
+(@GUID+196,9097,229,1,1,0,0,12.8929729,-329.7429,48.8472366,3.159046,7200,0,0,1,0,0),
+(@GUID+197,9097,229,1,1,0,0,12.9406261,-279.607941,65.45197,5.969026,7200,5,0,1,0,1),
+(@GUID+198,9097,229,1,1,0,0,18.7627659,-284.2841,65.45917,2.12930179,7200,5,0,1,0,1),
+(@GUID+199,9097,229,1,1,0,0,-2.931882,-524.657837,29.27372,0.5934119,7200,0,0,1,0,0),
+(@GUID+200,9097,229,1,1,0,0,-28.38935,-563.0387,29.2742,2.86234,7200,0,0,1,0,0),
+(@GUID+201,9097,229,1,1,0,0,30.9195728,-399.682678,48.7868233,3.00196624,7200,0,0,1,0,0),
+(@GUID+202,9097,229,1,1,0,0,-31.5340881,-564.217163,29.2742,1.16937053,7200,0,0,1,0,0),
+(@GUID+203,9097,229,1,1,0,0,-34.0393829,-585.6407,29.2742,6.19591856,7200,0,0,1,0,0),
+(@GUID+204,9097,229,1,1,0,0,-37.9832726,-585.003052,29.2742,1.50098312,7200,0,0,1,0,0),
+(@GUID+205,9097,229,1,1,0,0,43.5522041,-274.521637,65.45917,6.108652,7200,4,0,1,0,1),
+(@GUID+206,9097,229,1,1,0,0,45.7239571,-449.172668,27.6064148,3.700098,7200,0,0,1,0,0),
+(@GUID+207,9097,229,1,1,0,0,45.8465,-279.354,65.3547,1.03702569,7200,4,0,1,0,1),
+(@GUID+208,9097,229,1,1,0,0,51.89088,-287.3514,65.45917,3.03687286,7200,0,0,1,0,0),
+(@GUID+209,9097,229,1,1,0,0,54.68561,-325.345245,54.00365,1.39626336,7200,0,0,1,0,0),
+(@GUID+210,9097,229,1,1,0,0,55.91653,-459.1569,24.6387119,4.74729538,7200,0,0,1,0,0),
+(@GUID+211,9097,229,1,1,0,0,57.3262329,-569.6453,30.678772,0.191986218,7200,0,0,1,0,0),
+(@GUID+212,9097,229,1,1,0,0,57.5051956,-314.922241,54.0019226,2.268928,7200,0,0,1,0,0),
+(@GUID+213,9097,229,1,1,0,0,57.8382835,-310.131531,54.00148,3.577925,7200,0,0,1,0,0),
+(@GUID+214,9097,229,1,1,0,0,59.3199,-507.905,29.2652359,6.05629253,7200,0,0,1,0,0),
+(@GUID+215,9097,229,1,1,0,0,6.909,-271.977539,65.41073,0.209439516,7200,0,0,1,0,0),
+(@GUID+216,9097,229,1,1,0,0,61.8540535,-560.6797,30.6882877,3.49065852,7200,0,0,1,0,0),
+(@GUID+217,9097,229,1,1,0,0,63.39378,-505.4025,29.2684975,4.57276249,7200,0,0,1,0,0),
+(@GUID+218,9097,229,1,1,0,0,66.23844,-274.531647,60.73464,6.23082542,7200,0,0,1,0,0),
+(@GUID+219,9097,229,1,1,0,0,66.43544,-435.9842,42.10328,4.32841635,7200,0,0,1,0,0),
+(@GUID+220,9097,229,1,1,0,0,69.6397,-278.3183,60.67765,0.296705961,7200,0,0,1,0,0),
+(@GUID+221,9097,229,1,1,0,0,-7.64752,-586.2085,29.2742,0.9250245,7200,0,0,1,0,0),
+(@GUID+222,9097,229,1,1,0,0,71.6458054,-586.649231,30.686348,6.265732,7200,0,0,1,0,0),
+(@GUID+223,9097,229,1,1,0,0,79.0274353,-287.054626,60.77396,1.98967528,7200,5,0,1,0,1),
+(@GUID+224,9097,229,1,1,0,0,8.43384,-253.37677,65.4404,5.46288061,7200,0,0,1,0,0),
+(@GUID+225,9097,229,1,1,0,0,82.27611,-580.576843,30.6900673,4.118977,7200,0,0,1,0,0),
+(@GUID+226,9097,229,1,1,0,0,82.37819,-315.5727,55.78426,2.65947676,7200,5,0,1,0,1),
+(@GUID+227,9097,229,1,1,0,0,85.21238,-357.96698,60.78536,6.05629253,7200,4,0,1,0,1),
+(@GUID+228,9097,229,1,1,0,0,86.74077,-283.049225,60.610733,2.49932933,7200,0,0,1,0,0),
+(@GUID+229,9097,229,1,1,0,0,87.000885,-316.9617,65.48379,3.38828468,7200,0,0,1,0,0),
+(@GUID+230,9097,229,1,1,0,0,87.48928,-318.901154,65.49227,3.38828754,7200,0,0,1,0,0),
+(@GUID+231,9097,229,1,1,0,0,9.058154,-257.7314,65.41364,0.6981317,7200,0,0,1,0,0),
+(@GUID+232,9097,229,1,1,0,0,9.251252,-332.5572,48.7950478,1.23918378,7200,0,0,1,0,0),
+(@GUID+233,9097,229,1,1,0,0,90.2249146,-280.722229,60.6818237,4.834562,7200,0,0,1,0,0),
+(@GUID+234,9097,229,1,1,0,0,91.53687,-361.906,60.7020264,1.54308629,7200,4,0,1,0,1),
+(@GUID+235,9097,229,1,1,0,0,94.65439,-275.0468,60.7526,3.14159274,7200,0,0,1,0,0),
+(@GUID+236,9097,229,1,1,0,0,-52.07244,-586.2182,29.2742,2.96705961,7200,0,0,1,0,0),
+(@GUID+237,9097,229,1,1,0,0,-55.7421837,-581.55426,29.2742,4.24115,7200,0,0,1,0,0),
+(@GUID+238,9097,229,1,1,0,0,-63.33937,-572.386353,29.2742,0.122173049,7200,0,0,1,0,0),
+(@GUID+239,9097,229,1,1,0,0,-67.22875,-535.405151,29.2742,3.874631,7200,0,0,1,0,0),
+(@GUID+240,9097,229,1,1,0,0,-70.01909,-575.8177,29.2742,1.16937053,7200,0,0,1,0,0),
+-- Scarshield Spellbinder <Scarshield Legion>
+(@GUID+241,9098,229,1,1,0,0,-1.331627,-519.548645,29.3309135,5.42797375,7200,0,0,1,0,0),
+(@GUID+242,9098,229,1,1,0,0,102.172279,-308.9317,54.0021477,5.916666,7200,0,0,1,0,0),
+(@GUID+243,9098,229,1,1,0,0,105.506432,-332.577332,54.0027466,6.23082542,7200,0,0,1,0,0),
+(@GUID+244,9098,229,1,1,0,0,14.2493792,-254.139786,65.4354858,3.68264461,7200,0,0,1,0,0),
+(@GUID+245,9098,229,1,1,0,0,-2.807793,-580.5389,29.2742,3.94444418,7200,0,0,1,0,0),
+(@GUID+246,9098,229,1,1,0,0,29.0991611,-396.495331,48.80111,4.537856,7200,0,0,1,0,0),
+(@GUID+247,9098,229,1,1,0,0,-31.529623,-559.1773,29.2742,5.480334,7200,0,0,1,0,0),
+(@GUID+248,9098,229,1,1,0,0,40.8953743,-448.450134,27.932621,5.497787,7200,0,0,1,0,0),
+(@GUID+249,9098,229,1,1,0,0,47.6854668,-270.914276,65.3638,6.241553,7200,4,0,1,0,1),
+(@GUID+250,9098,229,1,1,0,0,52.1842651,-307.34,54.0018921,5.253441,7200,0,0,1,0,0),
+(@GUID+251,9098,229,1,1,0,0,52.41355,-255.366913,65.45917,3.63028479,7200,0,0,1,0,0),
+(@GUID+252,9098,229,1,1,0,0,54.9745064,-327.755585,54.00365,1.41371667,7200,0,0,1,0,0),
+(@GUID+253,9098,229,1,1,0,0,55.53388,-464.8595,24.94574,1.4486233,7200,0,0,1,0,0),
+(@GUID+254,9098,229,1,1,0,0,57.2190132,-562.799744,30.6716766,0.418879032,7200,0,0,1,0,0),
+(@GUID+255,9098,229,1,1,0,0,65.42762,-510.3604,29.3167419,2.565634,7200,0,0,1,0,0),
+(@GUID+256,9098,229,1,1,0,0,67.43828,-443.5344,40.726696,2.09439516,7200,0,0,1,0,0),
+(@GUID+257,9098,229,1,1,0,0,8.843101,-326.523132,48.8573074,5.113815,7200,0,0,1,0,0),
+(@GUID+258,9098,229,1,1,0,0,80.25544,-584.6707,30.6894226,1.2566371,7200,0,0,1,0,0),
+(@GUID+259,9098,229,1,1,0,0,81.61091,-325.340729,55.8671455,1.79768908,7200,6,0,1,0,1),
+(@GUID+260,9098,229,1,1,0,0,90.11126,-354.347534,60.78536,4.485496,7200,4,0,1,0,1),
+-- Scarshield Worg <Scarshield Legion>
+(@GUID+261,9416,229,1,1,0,0,15.70567,-319.694763,48.9296379,4.81710863,7200,0,0,1,0,0),
+(@GUID+262,9416,229,1,1,0,0,21.6263542,-319.307526,48.921833,4.59021568,7200,0,0,1,0,0),
+(@GUID+263,9416,229,1,1,0,0,39.9757576,-401.308,48.73395,1.37881,7200,0,0,1,0,0),
+(@GUID+264,9416,229,1,1,0,0,-43.9925423,-560.761658,29.2742,5.77704,7200,0,0,1,0,0),
+(@GUID+265,9416,229,1,1,0,0,44.2465363,-401.749878,48.8481827,1.41371667,7200,0,0,1,0,0),
+(@GUID+266,9416,229,1,1,0,0,-44.5054626,-555.940247,29.2742,5.44542742,7200,0,0,1,0,0),
+(@GUID+267,9416,229,1,1,0,0,45.85862,-503.317871,29.2189922,0.628318548,7200,0,0,1,0,0),
+(@GUID+268,9416,229,1,1,0,0,48.7350845,-507.5874,29.2278786,0.802851439,7200,0,0,1,0,0),
+(@GUID+269,9416,229,1,1,0,0,54.7811,-477.6601,26.7370472,2.51327419,7200,0,0,1,0,0),
+(@GUID+270,9416,229,1,1,0,0,57.44511,-472.058868,25.8572731,2.740167,7200,0,0,1,0,0),
+(@GUID+271,9416,229,1,1,0,0,-62.07272,-550.186646,29.2742,0.9075712,7200,0,0,1,0,0),
+(@GUID+273,9416,229,1,1,0,0,-65.6472,-544.931946,29.2742,0.575958669,7200,0,0,1,0,0),
+-- Scarshield Raider <Scarshield Legion>
+(@GUID+274,9258,229,1,1,0,0,18.6335163,-319.563538,48.92536,4.694936,7200,0,0,1,0,0),
+(@GUID+275,9258,229,1,1,0,0,42.2404366,-400.899567,48.78902,1.39626336,7200,0,0,1,0,0),
+(@GUID+276,9258,229,1,1,0,0,-43.1253738,-558.9627,29.2742,5.61996031,7200,0,0,1,0,0),
+(@GUID+277,9258,229,1,1,0,0,48.0036926,-504.871857,29.22562,0.715585,7200,0,0,1,0,0),
+(@GUID+278,9258,229,1,1,0,0,55.2906952,-474.477264,26.0807571,2.61799383,7200,0,0,1,0,0),
+(@GUID+279,9258,229,1,1,0,0,-62.76482,-546.4872,29.2742,0.75049156,7200,0,0,1,0,0),
+-- Scarshield Warlock <Scarshield Legion>
+(@GUID+280,9257,229,1,1,0,0,26.0838318,-398.5821,48.8247757,6.07374573,7200,0,0,1,0,0),
+(@GUID+281,9257,229,1,1,0,0,3.1376,-524.950745,29.456665,2.23402143,7200,0,0,1,0,0),
+(@GUID+282,9257,229,1,1,0,0,41.2527657,-453.779816,26.4869156,1.012291,7200,0,0,1,0,0),
+(@GUID+283,9257,229,1,1,0,0,60.2924347,-460.7934,24.84539,3.2986722,7200,0,0,1,0,0),
+(@GUID+284,9257,229,1,1,0,0,62.5478935,-437.094635,42.1535568,5.532694,7200,0,0,1,0,0),
+(@GUID+285,9257,229,1,1,0,0,62.9071541,-569.002136,30.6996365,3.106686,7200,0,0,1,0,0),
+(@GUID+286,9257,229,1,1,0,0,75.31803,-587.21405,30.68769,2.86234,7200,0,0,1,0,0),
+(@GUID+287,9257,229,1,1,0,0,-8.240628,-580.9951,29.2742,5.67232,7200,0,0,1,0,0),
+(@GUID+288,9257,229,1,1,0,0,-56.70842,-586.1366,29.2742,1.2915436,7200,0,0,1,0,0);
+
+-- Add sitting to some Scarshield Legionnaires
+DELETE FROM `creature_addon` WHERE `guid` IN (209318,209333,209315,209337,209308,209312,209331,209320,209335);
+INSERT INTO `creature_addon` (`guid`,`bytes1`,`bytes2`) VALUES
+(209318,1,1),(209333,1,1),(209315,1,1),(209337,1,1),(209308,1,1),(209312,1,1),(209331,1,1),(209320,1,1),(209335,1,1);
+
+-- Pathing for Blackhand Dreadweaver Entry: 9817
+SET @NPC := @GUID+116;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=156.027,`position_y`=-256.98,`position_z`=110.873 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`) VALUES (@NPC,@PATH,1,0);
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,156.655,-261.057,110.911,0,0,0,100,0),
+(@PATH,2,156.697,-270.709,110.945,0,0,0,100,0),
+(@PATH,3,157.437,-283.381,110.653,0,0,0,100,0),
+(@PATH,4,156.721,-302.091,110.655,0,0,0,100,0),
+(@PATH,5,155.393,-316.954,110.658,0,0,0,100,0),
+(@PATH,6,145.795,-316.889,110.658,0,0,0,100,0),
+(@PATH,7,138.546,-312.556,110.971,0,0,0,100,0),
+(@PATH,8,128.11,-312.561,110.948,0,0,0,100,0),
+(@PATH,9,113.444,-312.323,106.436,0,0,0,100,0),
+(@PATH,10,107.291,-311.159,106.436,0,0,0,100,0),
+(@PATH,11,107.143,-305.034,106.436,0,0,0,100,0),
+(@PATH,12,107.968,-294.352,106.436,0,0,0,100,0),
+(@PATH,13,108.13,-273.961,106.436,0,0,0,100,0),
+(@PATH,14,108.325,-262.696,106.436,0,0,0,100,0),
+(@PATH,15,113.576,-260.461,106.436,0,0,0,100,0),
+(@PATH,16,119.512,-259.629,108.912,0,0,0,100,0),
+(@PATH,17,126.887,-258.807,110.95,0,0,0,100,0),
+(@PATH,18,134.264,-256.577,110.872,0,0,0,100,0),
+(@PATH,19,142.107,-253.858,110.808,0,0,0,100,0),
+(@PATH,20,149.232,-254.785,110.835,0,0,0,100,0),
+(@PATH,21,156.027,-256.98,110.873,0,0,0,100,0);
+
+-- Pathing for Rage Talon Dragonspawn Entry: 9096
+SET @NPC := @GUID+13;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=141.415,`position_y`=-328.32,`position_z`=70.9563 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`) VALUES (@NPC,@PATH,1,0);
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,137.036,-318.309,70.9563,0,0,0,100,0),
+(@PATH,2,139.625,-311.595,70.9563,0,0,0,100,0),
+(@PATH,3,145.022,-306.612,70.9563,0,0,0,100,0),
+(@PATH,4,155.634,-307.226,70.9563,0,0,0,100,0),
+(@PATH,5,165.665,-309.29,70.9563,0,0,0,100,0),
+(@PATH,6,179.918,-308.349,75.0044,0,0,0,100,0),
+(@PATH,7,186.484,-307.375,76.8804,0,0,0,100,0),
+(@PATH,8,190.417,-303.615,76.8863,0,0,0,100,0),
+(@PATH,9,190,-295.833,76.9324,0,0,0,100,0),
+(@PATH,10,192.748,-284.944,76.9366,0,0,0,100,0),
+(@PATH,11,197.221,-281.635,76.9372,0,0,0,100,0),
+(@PATH,12,205.403,-280.035,76.9363,0,0,0,100,0),
+(@PATH,13,206.769,-288.047,76.9327,0,0,0,100,0),
+(@PATH,14,206.049,-300.881,76.9044,0,0,0,100,0),
+(@PATH,15,203.805,-308.685,76.8987,0,0,0,100,0),
+(@PATH,16,200.091,-314.903,76.892,0,0,0,100,0),
+(@PATH,17,196.037,-321.532,76.8849,0,0,0,100,0),
+(@PATH,18,187.264,-325.25,76.8738,0,0,0,100,0),
+(@PATH,19,172.508,-330.708,71.6636,0,0,0,100,0),
+(@PATH,20,157.819,-330.472,70.9563,0,0,0,100,0),
+(@PATH,21,151.347,-332.406,70.9563,0,0,0,100,0),
+(@PATH,22,141.415,-328.32,70.9563,0,0,0,100,0);
+
+-- Pathing for Rage Talon Dragonspawn Entry: 9096
+SET @NPC := @GUID+3;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=102.111,`position_y`=-255.036,`position_z`=106.436 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`) VALUES (@NPC,@PATH,1,0);
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,102.492,-284.08,106.436,0,0,0,100,0),
+(@PATH,2,103.388,-312.501,106.436,0,0,0,100,0),
+(@PATH,3,102.492,-284.08,106.436,0,0,0,100,0),
+(@PATH,4,102.111,-255.036,106.436,0,0,0,100,0);
+
+-- Pathing for Rage Talon Flamescale Entry: 10083
+SET @NPC := @GUID+25;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=151.43,`position_y`=-299.848,`position_z`=110.655 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`) VALUES (@NPC,@PATH,1,0);
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,151.483,-266.668,110.941,0,0,0,100,0),
+(@PATH,2,151.43,-299.848,110.655,0,0,0,100,0),
+(@PATH,3,151.826,-337.478,110.948,0,0,0,100,0),
+(@PATH,4,151.43,-299.848,110.655,0,0,0,100,0);
+
+-- Pathing for Rage Talon Flamescale Entry: 10083
+SET @NPC := @GUID+26;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=159.69,`position_y`=-366.065,`position_z`=116.844 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`) VALUES (@NPC,@PATH,1,0);
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,164.673,-366.137,116.844,0,0,0,100,0),
+(@PATH,2,159.69,-366.065,116.844,0,0,0,100,0),
+(@PATH,3,134.314,-365.853,116.844,0,0,0,100,0),
+(@PATH,4,113.681,-366.227,116.844,0,0,0,100,0),
+(@PATH,5,134.314,-365.853,116.844,0,0,0,100,0),
+(@PATH,6,159.69,-366.065,116.844,0,0,0,100,0);
+
+-- Pathing for Blackhand Veteran Entry: 9819
+SET @NPC := @GUID+77;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=151.986,`position_y`=-343.381,`position_z`=110.952 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`) VALUES (@NPC,@PATH,1,0);
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,156.734,-340.574,110.949,0,0,0,100,0),
+(@PATH,2,161.285,-330.085,110.941,0,0,0,100,0),
+(@PATH,3,164.349,-321.437,110.935,0,0,0,100,0),
+(@PATH,4,164.066,-307.895,110.926,0,0,0,100,0),
+(@PATH,5,161.931,-295.254,110.937,0,0,0,100,0),
+(@PATH,6,161.54,-286.843,110.94,0,0,0,100,0),
+(@PATH,7,161.626,-276.16,110.942,0,0,0,100,0),
+(@PATH,8,162.619,-260.48,110.922,0,0,0,100,0),
+(@PATH,9,160.883,-251.074,110.911,0,0,0,100,0),
+(@PATH,10,153.333,-254.239,110.841,0,0,0,100,0),
+(@PATH,11,147.933,-256.874,110.85,0,0,0,100,0),
+(@PATH,12,144.41,-258.089,110.852,0,0,0,100,0),
+(@PATH,13,142.226,-262.721,110.888,0,0,0,100,0),
+(@PATH,14,139.325,-272.981,110.928,0,0,0,100,0),
+(@PATH,15,139.064,-292.411,110.964,0,0,0,100,0),
+(@PATH,16,138.366,-304.562,110.976,0,0,0,100,0),
+(@PATH,17,140.202,-318.19,110.956,0,0,0,100,0),
+(@PATH,18,141.56,-328.348,110.948,0,0,0,100,0),
+(@PATH,19,145.867,-339.175,110.95,0,0,0,100,0),
+(@PATH,20,151.986,-343.381,110.952,0,0,0,100,0);
+
+-- Pathing for Blackhand Veteran Entry: 9819
+SET @NPC := @GUID+68;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=137.681,`position_y`=-374.135,`position_z`=116.807 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`) VALUES (@NPC,@PATH,1,0);
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,137.932,-365.946,116.844,0,0,0,100,0),
+(@PATH,2,119.13,-366.058,116.848,0,0,0,100,0),
+(@PATH,3,137.932,-365.946,116.844,0,0,0,100,0),
+(@PATH,4,137.681,-374.135,116.807,0,0,0,100,0),
+(@PATH,5,138.003,-383.829,121.975,0,0,0,100,0),
+(@PATH,6,137.621,-374.032,116.807,0,0,0,100,0),
+(@PATH,7,137.28,-358.897,116.838,0,0,0,100,0),
+(@PATH,8,138.01,-349.646,111.285,0,0,0,100,0),
+(@PATH,9,138.504,-339.926,110.965,0,0,0,100,0),
+(@PATH,10,138.055,-349.128,110.97,0,0,0,100,0),
+(@PATH,11,137.272,-358.828,116.838,0,0,0,100,0),
+(@PATH,12,137.975,-366.027,116.844,0,0,0,100,0),
+(@PATH,13,151.988,-365.319,116.844,0,0,0,100,0),
+(@PATH,14,168.97,-365.253,116.844,0,0,0,100,0),
+(@PATH,15,151.988,-365.319,116.844,0,0,0,100,0),
+(@PATH,16,137.975,-366.027,116.844,0,0,0,100,0),
+(@PATH,17,137.263,-358.934,116.838,0,0,0,100,0),
+(@PATH,18,138.048,-349.209,110.971,0,0,0,100,0),
+(@PATH,19,138.504,-339.926,110.965,0,0,0,100,0),
+(@PATH,20,138.01,-349.646,111.285,0,0,0,100,0),
+(@PATH,21,137.286,-358.828,116.838,0,0,0,100,0),
+(@PATH,22,137.621,-374.032,116.807,0,0,0,100,0),
+(@PATH,23,138.003,-383.829,121.975,0,0,0,100,0),
+(@PATH,24,137.681,-374.135,116.807,0,0,0,100,0);
+
+-- Pathing for Rage Talon Dragon Guard Entry: 10366
+SET @NPC := @GUID+32;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=137.109,`position_y`=-474.652,`position_z`=116.842 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`) VALUES (@NPC,@PATH,1,0);
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,150.917,-475.661,116.826,0,0,0,100,0),
+(@PATH,2,165.273,-475.48,116.842,0,0,0,100,0),
+(@PATH,3,150.917,-475.661,116.826,0,0,0,100,0),
+(@PATH,4,137.109,-474.652,116.842,0,0,0,100,0),
+(@PATH,5,120.161,-474.673,116.842,0,0,0,100,0),
+(@PATH,6,106.258,-474.643,116.842,0,0,0,100,0),
+(@PATH,7,94.7496,-473.079,116.842,0,0,0,100,0),
+(@PATH,8,83.6851,-474.242,116.842,0,0,0,100,0),
+(@PATH,9,77.1173,-474.496,116.842,0,0,0,100,0),
+(@PATH,10,65.0976,-474.578,113.951,0,0,0,100,0),
+(@PATH,11,51.9036,-474.688,110.923,0,0,0,100,0),
+(@PATH,12,64.8587,-474.58,113.951,0,0,0,100,0),
+(@PATH,13,77.1173,-474.496,116.842,0,0,0,100,0),
+(@PATH,14,83.4094,-474.271,116.842,0,0,0,100,0),
+(@PATH,15,94.7496,-473.079,116.842,0,0,0,100,0),
+(@PATH,16,106.258,-474.643,116.842,0,0,0,100,0),
+(@PATH,17,120.161,-474.673,116.842,0,0,0,100,0),
+(@PATH,18,137.109,-474.652,116.842,0,0,0,100,0);
+
+-- Pathing for Jed Runewatcher Entry: 10509 "RARE"
+SET @NPC := @GUID+153;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=165.094,`position_y`=-341.963,`position_z`=110.951 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`) VALUES (@NPC,@PATH,1,0);
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,143.081,-332.039,110.946,0,0,0,100,0),
+(@PATH,2,137.568,-346.437,110.972,0,0,0,100,0),
+(@PATH,3,137.582,-349.249,110.999,0,0,0,100,0),
+(@PATH,4,137.404,-357.640,116.838,0,0,0,100,0),
+(@PATH,5,137.005,-366.262,116.844,0,0,0,100,0),
+(@PATH,6,137.173,-374.983,116.807,0,0,0,100,0),
+(@PATH,7,137.252,-383.108,121.975,0,0,0,100,0),
+(@PATH,8,137.299,-392.334,121.975,0,0,0,100,0),
+(@PATH,9,151.393,-392.988,121.975,0,0,0,100,0),
+(@PATH,10,165.537,-392.823,121.975,0,0,0,100,0),
+(@PATH,11,165.440,-383.058,121.975,0,0,0,100,0),
+(@PATH,12,165.651,-374.907,116.807,0,0,0,100,0),
+(@PATH,13,165.556,-367.59,116.845,0,0,0,100,0),
+(@PATH,14,165.415,-357.528,116.837,0,0,0,100,0),
+(@PATH,15,165.545,-348.847,110.969,0,0,0,100,0),
+(@PATH,16,165.094,-341.963,110.951,0,0,0,100,0),
+(@PATH,17,160.784,-330.969,110.941,0,0,0,100,0),
+(@PATH,18,160.191,-309.153,110.656,0,0,0,100,0),
+(@PATH,19,160.079,-280.562,110.652,0,0,0,100,0),
+(@PATH,20,144.032,-280.615,110.653,0,0,0,100,0),
+(@PATH,21,142.987,-312.006,110.658,0,0,0,100,0);
+
+-- Pathing for Blackhand Assassin Entry: 10318
+SET @NPC := @GUID+173;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=70.90186,`position_y`=-474.6028,`position_z`=115.4964 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '22766');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,83.54216,-474.6622,116.8424,0,0,0,100,0),
+(@PATH,2,93.11698,-476.8058,116.8424,0,0,0,100,0),
+(@PATH,3,93.16169,-492.36,116.8424,0,0,0,100,0),
+(@PATH,4,93.11698,-476.8058,116.8424,0,0,0,100,0),
+(@PATH,5,83.68505,-474.6942,116.8424,0,0,0,100,0),
+(@PATH,6,70.90186,-474.6028,115.4964,0,0,0,100,0),
+(@PATH,7,60.60706,-474.3578,112.1393,0,0,0,100,0),
+(@PATH,8,45.0526,-476.1751,110.926,0,0,0,100,0),
+(@PATH,9,36.50502,-483.8639,110.9392,0,0,0,100,0),
+(@PATH,10,24.51036,-485.5788,110.9466,0,0,0,100,0),
+(@PATH,11,12.32181,-481.5825,110.9355,0,0,0,100,0),
+(@PATH,12,10.06764,-472.9978,110.9354,0,0,0,100,0),
+(@PATH,13,17.3661,-456.8065,110.9467,0,0,0,100,0),
+(@PATH,14,29.56967,-454.026,110.9595,0,0,0,100,0),
+(@PATH,15,35.45218,-454.5979,110.943,0,0,0,100,0),
+(@PATH,16,34.74645,-442.8175,110.945,0,0,0,100,0),
+(@PATH,17,33.50422,-417.918,110.7123,0,0,0,100,0),
+(@PATH,18,34.74645,-442.8175,110.945,0,0,0,100,0),
+(@PATH,19,35.45218,-454.5979,110.943,0,0,0,100,0),
+(@PATH,20,29.56967,-454.026,110.9595,0,0,0,100,0),
+(@PATH,21,17.3661,-456.8065,110.9467,0,0,0,100,0),
+(@PATH,22,10.06764,-472.9978,110.9354,0,0,0,100,0),
+(@PATH,23,12.32181,-481.5825,110.9355,0,0,0,100,0),
+(@PATH,24,24.51036,-485.5788,110.9466,0,0,0,100,0),
+(@PATH,25,36.50502,-483.8639,110.9392,0,0,0,100,0),
+(@PATH,26,45.0526,-476.1751,110.926,0,0,0,100,0),
+(@PATH,27,60.60706,-474.3578,112.1393,0,0,0,100,0),
+(@PATH,28,70.90186,-474.6028,115.4964,0,0,0,100,0);
+-- 0xF13000284E0957D1 .go 83.54216 -474.6622 116.8424
+
+-- Pathing for Blackhand Assassin Entry: 10318
+SET @NPC := @GUID+155;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=117.2911,`position_y`=-562.6133,`position_z`=107.403 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,117.5151,-567.9547,107.125,0,0,0,100,0),
+(@PATH,2,117.2911,-562.6133,107.403,0,0,0,100,0),
+(@PATH,3,112.9668,-557.6212,107.6628,0,0,0,100,0),
+(@PATH,4,105.0914,-557.2451,107.6823,0,0,0,100,0),
+(@PATH,5,96.04835,-553.9485,110.5781,0,0,0,100,0),
+(@PATH,6,87.70401,-550.9095,110.9234,0,0,0,100,0),
+(@PATH,7,79.952,-545.0425,110.9392,0,0,0,100,0),
+(@PATH,8,71.74578,-539.9948,110.9404,0,0,0,100,0),
+(@PATH,9,63.53278,-534.9427,110.9417,0,0,0,100,0),
+(@PATH,10,71.6881,-539.9797,110.9404,0,0,0,100,0),
+(@PATH,11,79.952,-545.0425,110.9392,0,0,0,100,0),
+(@PATH,12,87.70401,-550.9095,110.9234,0,0,0,100,0),
+(@PATH,13,96.04835,-553.9485,110.5781,0,0,0,100,0),
+(@PATH,14,105.0914,-557.2451,107.6823,0,0,0,100,0),
+(@PATH,15,112.9668,-557.6212,107.6628,0,0,0,100,0),
+(@PATH,16,117.2911,-562.6133,107.403,0,0,0,100,0);
+-- 0xF13000284E0957CB .go 117.5151 -567.9547 107.125
+
+-- Pathing for Blackhand Iron Guard Entry: 10319
+SET @NPC := @GUID+185;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=27.209,`position_y`=-487.106,`position_z`=110.949 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`) VALUES (@NPC,@PATH,1,0);
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,41.0048,-479.188,110.932,0,0,0,100,0),
+(@PATH,2,40.6946,-470.055,110.934,0,0,0,100,0),
+(@PATH,3,28.987,-457.701,110.958,0,0,0,100,0),
+(@PATH,4,19.4282,-458.143,110.948,0,0,0,100,0),
+(@PATH,5,10.9487,-465.839,110.938,0,0,0,100,0),
+(@PATH,6,12.0295,-481.36,110.935,0,0,0,100,0),
+(@PATH,7,27.209,-487.106,110.949,0,0,0,100,0);
+
+-- Pathing for Blackhand Iron Guard Entry: 10319
+SET @NPC := @GUID+187;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=32.9856,`position_y`=-441.198,`position_z`=110.948 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`) VALUES (@NPC,@PATH,1,0);
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,33.2388,-451.331,110.947,0,0,0,100,0),
+(@PATH,2,27.8349,-467.173,110.954,0,0,0,100,0),
+(@PATH,3,22.5882,-486.309,110.945,0,0,0,100,0),
+(@PATH,4,21.3946,-495.946,110.941,0,0,0,100,0),
+(@PATH,5,22.5882,-486.309,110.945,0,0,0,100,0),
+(@PATH,6,27.8349,-467.173,110.954,0,0,0,100,0),
+(@PATH,7,33.2388,-451.331,110.947,0,0,0,100,0),
+(@PATH,8,32.9856,-441.198,110.948,0,0,0,100,0),
+(@PATH,9,33.2187,-432.523,110.949,0,0,0,100,0),
+(@PATH,10,32.9856,-441.198,110.948,0,0,0,100,0);
+
+-- Pathing for Blackhand Iron Guard Entry: 10319
+SET @NPC := @GUID+180;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=137.438,`position_y`=-458.164,`position_z`=121.874 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`) VALUES (@NPC,@PATH,1,0);
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,137.876,-449.432,121.975,0,0,0,100,0),
+(@PATH,2,142.882,-447.466,121.975,0,0,0,100,0),
+(@PATH,3,150.106,-447.552,121.975,0,0,0,100,0),
+(@PATH,4,158.939,-447.841,121.975,0,0,0,100,0),
+(@PATH,5,162.936,-450.315,121.975,0,0,0,100,0),
+(@PATH,6,164.986,-455.795,121.975,0,0,0,100,0),
+(@PATH,7,165.879,-465.25,116.954,0,0,0,100,0),
+(@PATH,8,165.223,-470.568,116.829,0,0,0,100,0),
+(@PATH,9,158.806,-470.375,116.826,0,0,0,100,0),
+(@PATH,10,148.989,-470.486,116.816,0,0,0,100,0),
+(@PATH,11,142.296,-471.539,116.839,0,0,0,100,0),
+(@PATH,12,127.625,-473.384,116.845,0,0,0,100,0),
+(@PATH,13,118.149,-473.105,116.842,0,0,0,100,0),
+(@PATH,14,109.252,-473.191,116.842,0,0,0,100,0),
+(@PATH,15,101.37,-473.117,116.842,0,0,0,100,0),
+(@PATH,16,97.2847,-470.1,116.842,0,0,0,100,0),
+(@PATH,17,93.7787,-464.77,116.842,0,0,0,100,0),
+(@PATH,18,93.1996,-456.881,116.842,0,0,0,100,0),
+(@PATH,19,93.0105,-447.581,113.951,0,0,0,100,0),
+(@PATH,20,92.7964,-437.883,110.923,0,0,0,100,0),
+(@PATH,21,92.9087,-447.432,113.951,0,0,0,100,0),
+(@PATH,22,93.261,-456.932,116.842,0,0,0,100,0),
+(@PATH,23,94.0509,-465.158,116.842,0,0,0,100,0),
+(@PATH,24,97.3934,-470.372,116.842,0,0,0,100,0),
+(@PATH,25,101.615,-473.2,116.842,0,0,0,100,0),
+(@PATH,26,109.96,-473.221,116.842,0,0,0,100,0),
+(@PATH,27,119.431,-472.966,116.842,0,0,0,100,0),
+(@PATH,28,129.714,-473.405,116.844,0,0,0,100,0),
+(@PATH,29,137.726,-471.057,116.836,0,0,0,100,0),
+(@PATH,30,137.759,-466.307,116.807,0,0,0,100,0),
+(@PATH,31,137.438,-458.164,121.874,0,0,0,100,0);
+
+-- Pathing for Goraluk Anvilcrack Entry: 10899
+SET @NPC := @GUID+39;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=145.1794,`position_y`=-242.7074,`position_z`=110.8712 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,140.8718,-243.5903,110.8264,0,0,0,100,0),
+(@PATH,2,140.0336,-244.9933,110.8045,7000,0,@PATH+1,100,0),
+(@PATH,3,140.0312,-247.3475,110.7735,0,0,0,100,0),
+(@PATH,4,142.0183,-248.9341,110.7787,0,0,0,100,0),
+(@PATH,5,144.8816,-250.2995,110.7876,0,0,0,100,0),
+(@PATH,6,148.9328,-246.4266,110.8622,0,0,0,100,0),
+(@PATH,7,152.1183,-245.3219,110.9002,0,0,0,100,0),
+(@PATH,8,159.5392,-248.6294,110.9232,48000,0,@PATH+2,100,0),
+(@PATH,9,155.1528,-243.6318,110.9261,0,0,0,100,0),
+(@PATH,10,148.9452,-243.1658,110.8972,0,0,0,100,0),
+(@PATH,11,147.2209,-242.0178,110.8953,70000,0,@PATH+3,100,0),
+(@PATH,12,144.9547,-246.9615,110.8239,0,0,0,100,0),
+(@PATH,13,147.9653,-244.2648,110.8774,0,0,0,100,0),
+(@PATH,14,149.6411,-243.5608,110.8987,0,0,0,100,0),
+(@PATH,15,147.806,-248.5052,110.8308,0,0,0,100,0),
+(@PATH,16,148.3326,-245.9803,110.8621,0,0,0,100,0),
+(@PATH,17,152.27,-246.4282,110.8896,0,0,0,100,0),
+(@PATH,18,147.7813,-243.522,110.8838,0,0,0,100,0),
+(@PATH,19,148.1721,-245.3295,110.8677,0,0,0,100,0),
+(@PATH,20,149.0415,-247.1999,110.8549,0,0,0,100,0),
+(@PATH,21,150.1232,-244.7369,110.8901,0,0,0,100,0),
+(@PATH,22,145.1794,-242.7074,110.8712,0,0,0,100,0);
+DELETE FROM `waypoint_scripts` WHERE `id` IN (@PATH+1,@PATH+2,@PATH+3);
+INSERT INTO `waypoint_scripts` (`id`,`delay`,`command`,`datalong`,`datalong2`,`o`,`guid`) VALUES
+(@PATH+1,0,30,0,0,5.759586,89),
+(@PATH+1,3,1,69,1,0,90),
+(@PATH+2,0,30,0,0,0.715585,91),
+(@PATH+2,4,1,133,1,0,92),
+(@PATH+2,39,1,0,1,0,93),
+(@PATH+3,0,30,0,0,1.801312,94),
+(@PATH+3,1,1,28,1,0,95),
+(@PATH+3,22,1,0,1,0,96);
+
+-- Pathing for Rage Talon Captain Entry: 10371
+SET @NPC := @GUID+42;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=17.7263,`position_y`=-263.467,`position_z`=110.943 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`) VALUES (@NPC,@PATH,1,0);
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,0.073367,-274.516,110.929,0,0,0,100,0),
+(@PATH,2,-0.197867,-320.715,110.939,0,0,0,100,0),
+(@PATH,3,32.9907,-344.613,110.943,0,0,0,100,0),
+(@PATH,4,2.70391,-335.468,110.942,0,0,0,100,0),
+(@PATH,5,21.5374,-315.253,110.945,0,0,0,100,0),
+(@PATH,6,21.8535,-266.793,110.943,0,0,0,100,0),
+(@PATH,7,21.5374,-315.253,110.945,0,0,0,100,0),
+(@PATH,8,2.70391,-335.468,110.942,0,0,0,100,0),
+(@PATH,9,32.9907,-344.613,110.943,0,0,0,100,0),
+(@PATH,10,-0.199047,-320.916,110.942,0,0,0,100,0),
+(@PATH,11,0.073367,-274.516,110.929,0,0,0,100,0),
+(@PATH,12,17.7263,-263.467,110.943,0,0,0,100,0);
+
+-- Pathing for Blackrock Drake Entry: 8964
+SET @NPC := 3343;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-7502.985,`position_y`=-1091.508,`position_z`=286.4399 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`) VALUES (@NPC,@PATH,1,0);
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-7526.111,-1065.07,290.0508,0,0,0,100,0),
+(@PATH,2,-7528.773,-1060.98,289.8008,0,0,0,100,0),
+(@PATH,3,-7554.438,-1032.648,293.9675,0,0,0,100,0),
+(@PATH,4,-7569.052,-1024.164,297.7729,0,0,0,100,0),
+(@PATH,5,-7603.773,-1019.187,303.3568,0,0,0,100,0),
+(@PATH,6,-7625.236,-1030.118,300.6064,0,0,0,100,0),
+(@PATH,7,-7652.77,-1045.974,291.5509,0,0,0,100,0),
+(@PATH,8,-7670.932,-1065.009,280.1344,0,0,0,100,0),
+(@PATH,9,-7677.66,-1074.487,277.8844,0,0,0,100,0),
+(@PATH,10,-7685.643,-1097.263,280.412,0,0,0,100,0),
+(@PATH,11,-7684.969,-1144.9,293.829,0,0,0,100,0),
+(@PATH,12,-7666.268,-1177.758,297.051,0,0,0,100,0),
+(@PATH,13,-7643.656,-1196.774,297.273,0,0,0,100,0),
+(@PATH,14,-7634.542,-1201.614,295.5235,0,0,0,100,0),
+(@PATH,15,-7597.882,-1211.088,294.7454,0,0,0,100,0),
+(@PATH,16,-7560.959,-1205.237,290.3565,0,0,0,100,0),
+(@PATH,17,-7536.037,-1191.708,287.6343,0,0,0,100,0),
+(@PATH,18,-7519.03,-1173.085,287.1065,0,0,0,100,0),
+(@PATH,19,-7502.939,-1142.821,286.4399,0,0,0,100,0),
+(@PATH,20,-7499.304,-1120.659,286.4399,0,0,0,100,0),
+(@PATH,21,-7502.985,-1091.508,286.4399,0,0,0,100,0);
+
+-- Pathing for Blackrock Drake Entry: 8964
+SET @NPC := 3344;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=-7587.611,`position_y`=-1127.057,`position_z`=299.0391 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`) VALUES (@NPC,@PATH,1,0);
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,-7595.692,-1122.375,300.0919,0,0,0,100,0),
+(@PATH,2,-7602.509,-1119.911,298.7615,0,0,0,100,0),
+(@PATH,3,-7623.113,-1121.951,299.8724,0,0,0,100,0),
+(@PATH,4,-7624.854,-1116.178,298.9836,0,0,0,100,0),
+(@PATH,5,-7623.076,-1109.361,301.2891,0,0,0,100,0),
+(@PATH,6,-7621.203,-1101.338,301.6222,0,0,0,100,0),
+(@PATH,7,-7617.672,-1097.37,302.9557,0,0,0,100,0),
+(@PATH,8,-7612.521,-1091.614,305.2333,0,0,0,100,0),
+(@PATH,9,-7603.752,-1088.397,307.15,0,0,0,100,0),
+(@PATH,10,-7595.697,-1086.253,309.7056,0,0,0,100,0),
+(@PATH,11,-7584.765,-1084.863,313.5945,0,0,0,100,0),
+(@PATH,12,-7573.741,-1089.98,318.4,0,0,0,100,0),
+(@PATH,13,-7563.752,-1095.654,321.1225,0,0,0,100,0),
+(@PATH,14,-7561.293,-1111.069,323.0945,0,0,0,100,0),
+(@PATH,15,-7562.622,-1134.871,324.7891,0,0,0,100,0),
+(@PATH,16,-7575.259,-1146.927,321.928,0,0,0,100,0),
+(@PATH,17,-7587.246,-1150.965,322.5114,0,0,0,100,0),
+(@PATH,18,-7599.556,-1147.009,320.2891,0,0,0,100,0),
+(@PATH,19,-7609.301,-1143.611,316.2057,0,0,0,100,0),
+(@PATH,20,-7634.01,-1120.37,312.1778,0,0,0,100,0),
+(@PATH,21,-7622.606,-1101.056,311.3446,0,0,0,100,0),
+(@PATH,22,-7614.432,-1092.255,305.6779,0,0,0,100,0),
+(@PATH,23,-7582.061,-1084.941,298.7889,0,0,0,100,0),
+(@PATH,24,-7562.621,-1112.578,307.4555,0,0,0,100,0),
+(@PATH,25,-7567.333,-1126.35,304.3445,0,0,0,100,0),
+(@PATH,26,-7587.611,-1127.057,299.0391,0,0,0,100,0);
+
+-- Pathing for Scarshield Legionnaire Entry: 9097
+SET @NPC := @GUID+228;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=70.94958,`position_y`=-282.0711,`position_z`=60.60775 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,72.5072,-281.7826,60.62373,0,0,0,100,0),
+(@PATH,2,87.12473,-283.3365,60.60862,29000,0,@PATH+1,100,0),
+(@PATH,3,86.74077,-283.0492,60.61073,0,0,0,100,0),
+(@PATH,4,70.94958,-282.0711,60.60775,24000,0,@PATH+2,100,0);
+DELETE FROM `waypoint_scripts` WHERE `id` IN (@PATH+1,@PATH+2);
+INSERT INTO `waypoint_scripts` (`id`,`delay`,`command`,`datalong`,`datalong2`,`o`,`guid`) VALUES
+(@PATH+1,2,2,74,1,0,97),
+(@PATH+1,2,1,7,0,0,98),
+(@PATH+1,24,2,74,0,0,99),
+(@PATH+2,0,30,0,0,3.892084,100),
+(@PATH+2,7,1,69,1,0,101),
+(@PATH+2,16,1,0,1,0,102);
+
+-- Pathing for Scarshield Legionnaire Entry: 9097
+SET @NPC := @GUID+209;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=53.45955,`position_y`=-325.36,`position_z`=53.91605 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,41.51676,-327.2762,53.74633,0,0,0,100,0),
+(@PATH,2,34.57693,-329.2669,53.62961,0,0,0,100,0),
+(@PATH,3,22.06219,-329.2139,48.75629,0,0,0,100,0),
+(@PATH,4,18.71977,-332.48,48.72622,0,0,0,100,0),
+(@PATH,5,18.61024,-346.3583,48.6756,0,0,0,100,0),
+(@PATH,6,20.25173,-349.2039,48.67309,0,0,0,100,0),
+(@PATH,7,35.13033,-349.1511,48.67545,0,0,0,100,0),
+(@PATH,8,37.16372,-352.3886,48.67825,0,0,0,100,0),
+(@PATH,9,37.26665,-364.0914,48.65669,0,0,0,100,0),
+(@PATH,10,37.16372,-352.3886,48.67825,0,0,0,100,0),
+(@PATH,11,35.13033,-349.1511,48.67545,0,0,0,100,0),
+(@PATH,12,20.25173,-349.2039,48.67309,0,0,0,100,0),
+(@PATH,13,18.61024,-346.3583,48.6756,0,0,0,100,0),
+(@PATH,14,18.71977,-332.48,48.72622,0,0,0,100,0),
+(@PATH,15,22.06219,-329.2139,48.75629,0,0,0,100,0),
+(@PATH,16,34.57693,-329.2669,53.62961,0,0,0,100,0),
+(@PATH,17,41.51676,-327.2762,53.74633,0,0,0,100,0),
+(@PATH,18,53.45955,-325.36,53.91605,0,0,0,100,0);
+
+-- Pathing for Scarshield Legionnaire Entry: 9097
+SET @NPC := @GUID+229;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=81.97402,`position_y`=-288.0753,`position_z`=60.66125 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,88.13084,-288.4329,60.61533,0,0,0,100,0),
+(@PATH,2,93.48189,-291.8687,60.63227,0,0,0,100,0),
+(@PATH,3,95.94733,-296.9316,60.66517,0,0,0,100,0),
+(@PATH,4,95.94772,-309.7263,65.39042,0,0,0,100,0),
+(@PATH,5,94.99308,-314.9491,65.47927,0,0,0,100,0),
+(@PATH,6,87.00089,-316.9617,65.48379,0,0,0,100,0),
+(@PATH,7,71.71636,-319.5778,65.46734,0,0,0,100,0),
+(@PATH,8,65.58628,-320.8983,65.45923,0,0,0,100,0),
+(@PATH,9,64.69189,-327.0649,65.46348,0,0,0,100,0),
+(@PATH,10,64.73603,-340.4908,60.70201,0,0,0,100,0),
+(@PATH,11,66.16424,-345.6102,60.70203,0,0,0,100,0),
+(@PATH,12,71.37296,-346.4238,60.70203,0,0,0,100,0),
+(@PATH,13,75.15958,-346.2384,60.70203,0,0,0,100,0),
+(@PATH,14,83.80564,-346.3136,60.70203,0,0,0,100,0),
+(@PATH,15,91.50565,-346.1702,60.70203,0,0,0,100,0),
+(@PATH,16,94.48775,-344.4582,60.70203,0,0,0,100,0),
+(@PATH,17,95.49223,-340.7823,60.70203,0,0,0,100,0),
+(@PATH,18,95.32813,-327.5041,65.46348,0,0,0,100,0),
+(@PATH,19,94.68663,-322.0191,65.46594,0,0,0,100,0),
+(@PATH,20,89.48792,-319.0262,65.4938,0,0,0,100,0),
+(@PATH,21,80.78517,-319.4615,65.47144,0,0,0,100,0),
+(@PATH,22,70.61723,-318.8349,65.48348,0,0,0,100,0),
+(@PATH,23,65.92691,-314.6129,65.46348,0,0,0,100,0),
+(@PATH,24,64.53401,-310.319,65.46348,0,0,0,100,0),
+(@PATH,25,64.13761,-297.2044,60.74208,0,0,0,100,0),
+(@PATH,26,67.14284,-292.4547,60.63996,0,0,0,100,0),
+(@PATH,27,74.20583,-289.4101,60.64116,0,0,0,100,0),
+(@PATH,28,81.97402,-288.0753,60.66125,0,0,0,100,0);
+
+-- Pathing for Scarshield Legionnaire Entry: 9097
+SET @NPC := @GUID+230;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=83.98484,`position_y`=-287.0403,`position_z`=60.643 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,89.93808,-286.1351,60.59507,0,0,0,100,0),
+(@PATH,2,93.29991,-289.3597,60.59763,0,0,0,100,0),
+(@PATH,3,96.0648,-291.1504,60.62643,0,0,0,100,0),
+(@PATH,4,97.3805,-295.3065,60.67328,0,0,0,100,0),
+(@PATH,5,97.94749,-302.046,62.42866,0,0,0,100,0),
+(@PATH,6,97.94783,-313.342,65.46348,0,0,0,100,0),
+(@PATH,7,96.72861,-316.5773,65.48706,0,0,0,100,0),
+(@PATH,8,91.31343,-317.9382,65.49011,0,0,0,100,0),
+(@PATH,9,68.48672,-322.1597,65.45495,0,0,0,100,0),
+(@PATH,10,65.65896,-322.9286,65.45052,0,0,0,100,0),
+(@PATH,11,66.58692,-327.4106,65.46348,0,0,0,100,0),
+(@PATH,12,66.21835,-330.4742,64.56249,0,0,0,100,0),
+(@PATH,13,66.71193,-333.1539,63.52972,0,0,0,100,0),
+(@PATH,14,66.74886,-344.3894,60.70203,0,0,0,100,0),
+(@PATH,15,94.72881,-344.1098,60.70203,0,0,0,100,0),
+(@PATH,16,95.94814,-341.3136,60.70203,0,0,0,100,0),
+(@PATH,17,94.90443,-337.6124,61.81128,0,0,0,100,0),
+(@PATH,18,95.29044,-329.2947,65.01956,0,0,0,100,0),
+(@PATH,19,93.29169,-324.5692,65.46348,0,0,0,100,0),
+(@PATH,20,92.33022,-319.0261,65.49524,0,0,0,100,0),
+(@PATH,21,88.11071,-320.541,65.4697,0,0,0,100,0),
+(@PATH,22,77.12846,-321.647,65.46059,0,0,0,100,0),
+(@PATH,23,73.90438,-321.0413,65.46191,0,0,0,100,0),
+(@PATH,24,70.89841,-320.856,65.46152,0,0,0,100,0),
+(@PATH,25,67.89243,-320.6708,65.46112,0,0,0,100,0),
+(@PATH,26,62.8699,-314.552,65.46348,0,0,0,100,0),
+(@PATH,27,62.38148,-310.165,65.46348,0,0,0,100,0),
+(@PATH,28,62.16359,-298.0943,60.90481,0,0,0,100,0),
+(@PATH,29,62.07857,-295.2815,60.75649,0,0,0,100,0),
+(@PATH,30,66.51885,-289.6947,60.65805,0,0,0,100,0),
+(@PATH,31,71.19937,-288.5282,60.61031,0,0,0,100,0),
+(@PATH,32,76.71995,-286.1484,60.66695,0,0,0,100,0),
+(@PATH,33,83.98484,-287.0403,60.643,0,0,0,100,0);
+
+-- Pathing for Scarshield Spellbinder Entry: 9098
+SET @NPC := @GUID+252;
+SET @PATH := @NPC * 10;
+UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=36.89285,`position_y`=-331.2767,`position_z`=53.68202 WHERE `guid`=@NPC;
+DELETE FROM `creature_addon` WHERE `guid`=@NPC;
+INSERT INTO `creature_addon` (`guid`,`path_id`,`bytes2`,`mount`,`auras`) VALUES (@NPC,@PATH,1,0, '');
+DELETE FROM `waypoint_data` WHERE `id`=@PATH;
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`delay`,`move_flag`,`action`,`action_chance`,`wpguid`) VALUES
+(@PATH,1,39.96936,-329.8007,53.7379,0,0,0,100,0),
+(@PATH,2,57.18673,-326.7872,53.91625,0,0,0,100,0),
+(@PATH,3,34.34272,-331.2659,53.48465,0,0,0,100,0),
+(@PATH,4,26.80801,-331.241,48.74844,0,0,0,100,0),
+(@PATH,5,23.99778,-331.2221,48.75055,0,0,0,100,0),
+(@PATH,6,18.19567,-331.1975,48.73712,0,0,0,100,0),
+(@PATH,7,18.45785,-335.4669,48.70008,0,0,0,100,0),
+(@PATH,8,20.61245,-337.6364,48.681,0,0,0,100,0),
+(@PATH,9,20.58323,-349.7892,48.67257,0,0,0,100,0),
+(@PATH,10,23.55131,-350.9213,48.67374,0,0,0,100,0),
+(@PATH,11,26.39461,-347.1821,48.68155,0,0,0,100,0),
+(@PATH,12,38.42376,-347.1394,48.67081,0,0,0,100,0),
+(@PATH,13,39.21199,-357.8676,48.65726,0,0,0,100,0),
+(@PATH,14,39.29136,-366.8922,48.65531,0,0,0,100,0),
+(@PATH,15,39.13438,-349.0444,48.67277,0,0,0,100,0),
+(@PATH,16,35.49154,-345.9659,48.6712,0,0,0,100,0),
+(@PATH,17,29.60406,-347.1707,48.68155,0,0,0,100,0),
+(@PATH,18,17.56905,-347.2134,48.6734,0,0,0,100,0),
+(@PATH,19,20.65288,-340.964,48.6903,0,0,0,100,0),
+(@PATH,20,20.74783,-328.9321,48.7581,0,0,0,100,0),
+(@PATH,21,24.81668,-329.3186,48.77163,0,0,0,100,0),
+(@PATH,22,28.94844,-331.2431,50.09388,0,0,0,100,0),
+(@PATH,23,31.78614,-331.2551,51.87762,0,0,0,100,0),
+(@PATH,24,34.34272,-331.2659,53.48465,0,0,0,100,0),
+(@PATH,25,36.89285,-331.2767,53.68202,0,0,0,100,0);
diff --git a/sql/updates/world/2011_12_17_00_world_gameobject.sql b/sql/updates/world/2011_12_17_00_world_gameobject.sql
new file mode 100644
index 00000000000..98752a1b7ec
--- /dev/null
+++ b/sql/updates/world/2011_12_17_00_world_gameobject.sql
@@ -0,0 +1,384 @@
+-- Add missing Go spawns for UBRS & LBRS
+SET @OGUID := 87602; -- 261 required
+DELETE FROM `gameobject` WHERE `map`=229 AND `id` IN (153464,175124,175194,175195,175196,175197,175198,175199,175200,175266,175267,175268,175269,175270,175271,175272,175706,175244,175187,175153,175705,175185,175186,164726,
+164726,175382,175385,175528,175529,175530,175531,175532,175533,175946,175947,175970,176447,176448,176449,176450,176451,176452,136950,136952,136955,176459,176460,176461,176462,176463,136922,136923,136925,136926,136927,
+136928,136929,136930,136931,136932,136933,136934,136935,136936,136937,136938,136939,136940,136941,136942,136943,136944,136945,136946,136947,136948,136949,136951,136954,136957,136959,136961,136962,136963,136964,153469,
+164725,175334,175571,175584,175588,175606,175607,175608,175609,175886,175949,175950,176089,176090,176425,176426,176427,176428,176429,176430,176431,176432,176433,176434,176435,176436,176437,176438,176439,176440,176441,
+176442,176443,176444,176445,176446,176454,176455,176456,176457,176458);
+INSERT INTO `gameobject` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`rotation0`,`rotation1`,`rotation2`,`rotation3`,`spawntimesecs`,`animprogress`,`state`) VALUES
+(@OGUID,175124,229,1,1,100.579681,-312.488953,91.4455,0.122172989,0,0,0,0,120,0,1),
+(@OGUID+1,175124,229,1,1,101.516693,-311.471344,91.4455,-1.58824873,0,0,0,0,120,0,1),
+(@OGUID+2,175124,229,1,1,102.414017,-304.376343,91.4466248,0.0174524616,0,0,0,0,120,0,1),
+(@OGUID+3,175124,229,1,1,104.212967,-289.411041,91.47319,1.50098288,0,0,0,0,120,0,1),
+(@OGUID+4,175124,229,1,1,104.316406,-302.841278,91.47408,3.07176614,0,0,0,0,120,0,1),
+(@OGUID+5,175124,229,1,1,104.403542,-299.438263,91.47574,0.6806767,0,0,0,0,120,0,1),
+(@OGUID+6,175124,229,1,1,104.601669,-287.9975,91.47882,-1.97221982,0,0,0,0,120,0,1),
+(@OGUID+7,175124,229,1,1,104.926949,-286.137817,91.48353,1.448622,0,0,0,0,120,0,1),
+(@OGUID+8,175124,229,1,1,105.029182,-300.911469,91.4845352,1.57079577,0,0,0,0,120,0,1),
+(@OGUID+9,175124,229,1,1,106.199173,-299.793121,91.50144,-1.20427728,0,0,0,0,120,0,1),
+(@OGUID+10,175124,229,1,1,106.420288,-281.429016,91.50514,-0.593412,0,0,0,0,120,0,1),
+(@OGUID+11,175124,229,1,1,106.603729,-283.775574,91.5078,1.954769,0,0,0,0,120,0,1),
+(@OGUID+12,175124,229,1,1,107.189377,-287.659851,91.51627,0.7504908,0,0,0,0,120,0,1),
+(@OGUID+13,175124,229,1,1,107.418739,-282.511749,91.5196,-2.19911456,0,0,0,0,120,0,1),
+(@OGUID+14,175124,229,1,1,107.927856,-299.94812,91.52648,2.00712848,0,0,0,0,120,0,1),
+(@OGUID+15,175124,229,1,1,112.297363,-390.177521,110.862892,-0.122172989,0,0,0,0,120,0,1),
+(@OGUID+16,175124,229,1,1,113.017937,-451.803925,110.862892,2.82742977,0,0,0,0,120,0,1),
+(@OGUID+17,175124,229,1,1,113.929672,-389.215057,110.862892,-0.785396755,0,0,0,0,120,0,1),
+(@OGUID+18,175124,229,1,1,114.805519,-450.286,110.862892,0.767943859,0,0,0,0,120,0,1),
+(@OGUID+19,175124,229,1,1,115.410751,-389.923,110.862892,-0.8377574,0,0,0,0,120,0,1),
+(@OGUID+20,175124,229,1,1,115.812012,-453.056946,110.862892,-1.98967242,0,0,0,0,120,0,1),
+(@OGUID+21,175124,229,1,1,186.987213,-389.476227,110.862892,-1.53588951,0,0,0,0,120,0,1),
+(@OGUID+22,175124,229,1,1,187.74115,-387.874451,110.862892,1.134463,0,0,0,0,120,0,1),
+(@OGUID+23,175124,229,1,1,188.002533,-452.5383,110.862892,1.34390128,0,0,0,0,120,0,1),
+(@OGUID+24,175124,229,1,1,188.12558,-450.820068,110.862892,1.48352814,0,0,0,0,120,0,1),
+(@OGUID+25,175124,229,1,1,189.080276,-388.61087,110.862892,-0.296705216,0,0,0,0,120,0,1),
+(@OGUID+26,175124,229,1,1,189.834488,-451.310455,110.862892,-2.86233544,0,0,0,0,120,0,1),
+(@OGUID+27,175124,229,1,1,197.826462,-407.929718,110.885162,-2.16420579,0,0,0,0,120,0,1),
+(@OGUID+28,175124,229,1,1,197.889175,-409.4169,110.885162,-1.51843619,0,0,0,0,120,0,1),
+(@OGUID+29,175124,229,1,1,198.345856,-432.6916,110.885071,-2.0594883,0,0,0,0,120,0,1),
+(@OGUID+30,175124,229,1,1,199.2812,-431.4338,110.885071,-2.44346023,0,0,0,0,120,0,1),
+(@OGUID+31,175124,229,1,1,199.588242,-433.8074,110.885071,1.11700928,0,0,0,0,120,0,1),
+(@OGUID+32,175124,229,1,1,199.616272,-410.271881,110.885689,-2.932139,0,0,0,0,120,0,1),
+(@OGUID+33,175124,229,1,1,200.124588,-407.845734,110.885162,2.879789,0,0,0,0,120,0,1),
+(@OGUID+34,175124,229,1,1,200.719711,-431.708069,110.885071,1.7802341,0,0,0,0,120,0,1),
+(@OGUID+35,175124,229,1,1,200.743408,-409.405762,110.885162,-1.37880921,0,0,0,0,120,0,1),
+(@OGUID+36,175124,229,1,1,201.846771,-432.208649,110.885483,1.448622,0,0,0,0,120,0,1),
+(@OGUID+37,175124,229,1,1,202.572159,-392.328,111.153641,-1.36135614,0,0,0,0,120,0,1),
+(@OGUID+38,175124,229,1,1,202.891327,-394.92514,111.134247,-2.80997539,0,0,0,0,120,0,1),
+(@OGUID+39,175124,229,1,1,203.082092,-401.453033,111.08667,-1.06464958,0,0,0,0,120,0,1),
+(@OGUID+40,175124,229,1,1,203.280655,-398.871735,111.104973,2.86233544,0,0,0,0,120,0,1),
+(@OGUID+41,175124,229,1,1,203.856339,-403.369232,111.071358,-1.15191638,0,0,0,0,120,0,1),
+(@OGUID+42,175124,229,1,1,204.114517,-393.5981,111.141563,-0.6457717,0,0,0,0,120,0,1),
+(@OGUID+43,175124,229,1,1,204.389526,-395.494537,111.127327,-1.2915417,0,0,0,0,120,0,1),
+(@OGUID+44,175124,229,1,1,204.402267,-400.3069,111.092491,-2.19911456,0,0,0,0,120,0,1),
+(@OGUID+45,175124,229,1,1,205.198654,-401.573273,111.081833,0.261798173,0,0,0,0,120,0,1),
+(@OGUID+46,175124,229,1,1,206.9045,-419.7901,110.925056,-0.7504908,0,0,0,0,120,0,1),
+(@OGUID+47,175124,229,1,1,207.266647,-434.7158,110.886642,0.226892471,0,0,0,0,120,0,1),
+(@OGUID+48,175124,229,1,1,207.935486,-420.0201,110.930283,-0.174532115,0,0,0,0,120,0,1),
+(@OGUID+49,175124,229,1,1,208.006454,-422.068726,110.929123,-1.51843619,0,0,0,0,120,0,1),
+(@OGUID+50,175124,229,1,1,208.166092,-418.3611,110.932716,2.21656513,0,0,0,0,120,0,1),
+(@OGUID+51,175124,229,1,1,208.798172,-433.633331,110.888489,-2.82742977,0,0,0,0,120,0,1),
+(@OGUID+52,175124,229,1,1,209.071991,-435.188141,110.884933,-2.94959545,0,0,0,0,120,0,1),
+(@OGUID+53,175124,229,1,1,209.28624,-391.269562,111.14872,-2.94959545,0,0,0,0,120,0,1),
+(@OGUID+54,175124,229,1,1,209.562531,-419.839661,110.938927,-0.5410506,0,0,0,0,120,0,1),
+(@OGUID+55,175124,229,1,1,210.485046,-393.288025,111.131866,-0.122172989,0,0,0,0,120,0,1),
+(@OGUID+56,175124,229,1,1,210.653778,-391.8297,111.142113,1.91986156,0,0,0,0,120,0,1),
+(@OGUID+57,175124,229,1,1,211.61734,-434.677,110.887962,-1.55334139,0,0,0,0,120,0,1),
+(@OGUID+58,175124,229,1,1,211.90686,-420.1357,110.945183,1.93731225,0,0,0,0,120,0,1),
+(@OGUID+59,175124,229,1,1,212.066559,-392.1727,111.136993,-0.5585039,0,0,0,0,120,0,1),
+(@OGUID+60,175124,229,1,1,212.458679,-418.521362,110.9529,2.98449826,0,0,0,0,120,0,1),
+(@OGUID+61,175124,229,1,1,212.63623,-432.306061,110.89183,-0.174532115,0,0,0,0,120,0,1),
+(@OGUID+62,175124,229,1,1,213.310959,-410.503100,110.962784,2.146753,0,0,0,0,120,0,1),
+(@OGUID+63,175124,229,1,1,213.576500,-419.532900,110.949500,0.628317,0,0,0,0,120,0,1),
+(@OGUID+64,175124,229,1,1,214.320190,-408.951233,110.967888,2.967041,0,0,0,0,120,0,1),
+(@OGUID+65,175124,229,1,1,217.875015,-392.086517,111.126740,0.907570,0,0,0,0,120,0,1),
+(@OGUID+66,175124,229,1,1,218.954147,-392.578674,111.121162,1.919862,0,0,0,0,120,0,1),
+(@OGUID+67,175124,229,1,1,219.678818,-393.405100,111.113823,-1.989672,0,0,0,0,120,0,1),
+(@OGUID+68,175124,229,1,1,219.995500,-399.617200,111.068283,-2.617989,0,0,0,0,120,0,1),
+(@OGUID+69,175124,229,1,1,220.161682,-421.224945,110.948463,-1.762782,0,0,0,0,120,0,1),
+(@OGUID+70,175124,229,1,1,220.172836,-391.630066,111.125732,1.361356,0,0,0,0,120,0,1),
+(@OGUID+71,175124,229,1,1,220.181274,-401.405100,111.055000,-1.989672,0,0,0,0,120,0,1),
+(@OGUID+72,175124,229,1,1,220.601800,-418.446900,110.961227,-1.221729,0,0,0,0,120,0,1),
+(@OGUID+73,175124,229,1,1,220.823685,-398.356600,111.075851,1.989672,0,0,0,0,120,0,1),
+(@OGUID+74,175124,229,1,1,220.835770,-393.648834,111.109894,-1.972220,0,0,0,0,120,0,1),
+(@OGUID+75,175124,229,1,1,220.869781,-411.346252,110.993027,-2.478367,0,0,0,0,120,0,1),
+(@OGUID+76,175124,229,1,1,221.281387,-400.066300,111.062630,0.977383,0,0,0,0,120,0,1),
+(@OGUID+77,175124,229,1,1,221.347992,-409.122284,111.003387,-2.076939,0,0,0,0,120,0,1),
+(@OGUID+78,175124,229,1,1,221.701370,-420.444366,110.953438,1.640607,0,0,0,0,120,0,1),
+(@OGUID+79,175124,229,1,1,222.093460,-432.249939,110.901382,0.000000,0,0,0,0,120,0,1),
+(@OGUID+80,175124,229,1,1,222.151962,-411.776367,110.992393,-3.071766,0,0,0,0,120,0,1),
+(@OGUID+81,175124,229,1,1,222.218918,-428.907776,110.916351,2.792518,0,0,0,0,120,0,1),
+(@OGUID+82,175124,229,1,1,222.736313,-410.476624,110.998500,-1.204277,0,0,0,0,120,0,1),
+(@OGUID+83,175124,229,1,1,222.815536,-430.970551,110.907448,-0.261798,0,0,0,0,120,0,1),
+(@OGUID+84,175124,229,1,1,223.579010,-419.323151,110.959229,-1.884953,0,0,0,0,120,0,1),
+(@OGUID+85,175124,229,1,1,223.816528,-429.410300,110.914421,-0.174532,0,0,0,0,120,0,1),
+(@OGUID+86,175124,229,1,1,223.977676,-432.850037,110.899147,1.884953,0,0,0,0,120,0,1),
+(@OGUID+87,175124,229,1,1,224.212540,-412.156647,110.991089,1.588249,0,0,0,0,120,0,1),
+(@OGUID+88,175124,229,1,1,48.812670,-337.076050,91.530170,2.268925,0,0,0,0,120,0,1),
+(@OGUID+89,175124,229,1,1,50.171127,-316.651550,91.530350,-2.426003,0,0,0,0,120,0,1),
+(@OGUID+90,175124,229,1,1,51.266464,-338.088400,91.541910,-1.989672,0,0,0,0,120,0,1),
+(@OGUID+91,175124,229,1,1,51.575382,-315.041870,91.522530,2.146753,0,0,0,0,120,0,1),
+(@OGUID+92,175124,229,1,1,51.863476,-316.613831,91.520930,-0.593412,0,0,0,0,120,0,1),
+(@OGUID+93,175124,229,1,1,54.265644,-255.434738,96.858940,1.343901,0,0,0,0,120,0,1),
+(@OGUID+94,175124,229,1,1,54.572220,-336.735138,91.529305,-1.134463,0,0,0,0,120,0,1),
+(@OGUID+95,175124,229,1,1,55.353077,-249.984161,97.048740,-2.652894,0,0,0,0,120,0,1),
+(@OGUID+96,175124,229,1,1,55.441975,-254.350900,97.197754,0.541051,0,0,0,0,120,0,1),
+(@OGUID+97,175124,229,1,1,56.761517,-332.325000,91.465240,-1.064650,0,0,0,0,120,0,1),
+(@OGUID+98,175124,229,1,1,56.851460,-253.342600,96.962560,-0.087266,0,0,0,0,120,0,1),
+(@OGUID+99,175124,229,1,1,56.876007,-255.377335,96.968940,0.261798,0,0,0,0,120,0,1),
+(@OGUID+100,175124,229,1,1,57.859043,-336.093262,91.523320,-2.234018,0,0,0,0,120,0,1),
+(@OGUID+101,175124,229,1,1,57.860306,-256.662100,96.739450,-1.012289,0,0,0,0,120,0,1),
+(@OGUID+102,175124,229,1,1,58.117460,-253.946426,96.880950,0.506145,0,0,0,0,120,0,1),
+(@OGUID+103,175124,229,1,1,58.817844,-334.106964,91.504810,0.977383,0,0,0,0,120,0,1),
+(@OGUID+104,175124,229,1,1,59.025590,-271.140137,93.636284,-2.495818,0,0,0,0,120,0,1),
+(@OGUID+105,175124,229,1,1,59.168900,-255.102982,96.815750,1.082103,0,0,0,0,120,0,1),
+(@OGUID+106,175124,229,1,1,59.192165,-317.294067,91.480150,-0.191985,0,0,0,0,120,0,1),
+(@OGUID+107,175124,229,1,1,59.330967,-332.230164,91.472916,-1.640610,0,0,0,0,120,0,1),
+(@OGUID+108,175124,229,1,1,59.419060,-337.406500,91.535560,-0.471239,0,0,0,0,120,0,1),
+(@OGUID+109,175124,229,1,1,60.185110,-270.196200,93.681820,-2.268925,0,0,0,0,120,0,1),
+(@OGUID+110,175124,229,1,1,60.351400,-312.296539,91.522070,1.134463,0,0,0,0,120,0,1),
+(@OGUID+111,175124,229,1,1,60.664970,-268.136017,93.601850,2.356195,0,0,0,0,120,0,1),
+(@OGUID+112,175124,229,1,1,61.012710,-315.652800,91.484780,0.733038,0,0,0,0,120,0,1),
+(@OGUID+113,175124,229,1,1,61.056700,-313.921875,91.505030,-0.680679,0,0,0,0,120,0,1),
+(@OGUID+114,175124,229,1,1,61.321583,-272.012665,93.600870,-1.151916,0,0,0,0,120,0,1),
+(@OGUID+115,175124,229,1,1,62.495476,-334.331300,91.506905,-0.349065,0,0,0,0,120,0,1),
+(@OGUID+116,175124,229,1,1,63.307910,-317.114000,91.471550,-3.089183,0,0,0,0,120,0,1),
+(@OGUID+117,175124,229,1,1,63.571682,-336.638200,91.528400,0.069812,0,0,0,0,120,0,1),
+(@OGUID+118,175124,229,1,1,64.204040,-268.474300,93.245410,-1.570796,0,0,0,0,120,0,1),
+(@OGUID+119,175124,229,1,1,64.925964,-317.059448,91.461044,1.780234,0,0,0,0,120,0,1),
+(@OGUID+120,175124,229,1,1,65.296530,-267.929600,93.076380,0.349065,0,0,0,0,120,0,1),
+(@OGUID+121,175124,229,1,1,65.583550,-305.104828,91.485280,1.099556,0,0,0,0,120,0,1),
+(@OGUID+122,175124,229,1,1,65.987790,-303.633759,91.469400,-2.617989,0,0,0,0,120,0,1),
+(@OGUID+123,175124,229,1,1,66.801750,-302.481100,91.451454,3.141593,0,0,0,0,120,0,1),
+(@OGUID+124,175124,229,1,1,68.121820,-302.416382,91.438910,3.124123,0,0,0,0,120,0,1),
+(@OGUID+125,175124,229,1,1,68.251770,-314.874634,91.433460,1.361356,0,0,0,0,120,0,1),
+(@OGUID+126,175124,229,1,1,68.728424,-307.073029,91.450460,0.994837,0,0,0,0,120,0,1),
+(@OGUID+127,175124,229,1,1,69.459880,-303.626923,91.437965,-1.396262,0,0,0,0,120,0,1),
+(@OGUID+128,175124,229,1,1,69.691370,-332.161224,91.486680,1.134463,0,0,0,0,120,0,1),
+(@OGUID+129,175124,229,1,1,69.930570,-326.639800,91.458800,2.897245,0,0,0,0,120,0,1),
+(@OGUID+130,175124,229,1,1,69.991165,-329.339233,91.465836,-0.401425,0,0,0,0,120,0,1),
+(@OGUID+131,175124,229,1,1,70.507195,-334.149000,91.505200,0.610864,0,0,0,0,120,0,1),
+(@OGUID+132,175124,229,1,1,70.929120,-304.969635,91.431526,3.036838,0,0,0,0,120,0,1),
+(@OGUID+133,175124,229,1,1,71.711500,-306.066100,91.418205,-1.518436,0,0,0,0,120,0,1),
+(@OGUID+134,175124,229,1,1,71.794900,-278.164948,92.456700,2.234018,0,0,0,0,120,0,1),
+(@OGUID+135,175124,229,1,1,72.002580,-328.391968,91.461020,-1.431168,0,0,0,0,120,0,1),
+(@OGUID+136,175124,229,1,1,72.026024,-331.224518,91.472250,-2.687807,0,0,0,0,120,0,1),
+(@OGUID+137,175124,229,1,1,72.053100,-325.809235,91.454160,1.431168,0,0,0,0,120,0,1),
+(@OGUID+138,175124,229,1,1,72.068990,-276.632355,92.298294,2.617989,0,0,0,0,120,0,1),
+(@OGUID+139,175124,229,1,1,72.141040,-285.905670,91.945180,-1.012289,0,0,0,0,120,0,1),
+(@OGUID+140,175124,229,1,1,73.133210,-306.736481,91.412690,-0.645772,0,0,0,0,120,0,1),
+(@OGUID+141,175124,229,1,1,73.545160,-324.155731,91.448090,0.453785,0,0,0,0,120,0,1),
+(@OGUID+142,175124,229,1,1,74.038910,-287.330600,91.448830,-1.012289,0,0,0,0,120,0,1),
+(@OGUID+143,175124,229,1,1,74.100430,-291.836700,91.442010,-0.401425,0,0,0,0,120,0,1),
+(@OGUID+144,175124,229,1,1,74.206830,-273.590729,91.642830,-1.396262,0,0,0,0,120,0,1),
+(@OGUID+145,175124,229,1,1,74.449070,-307.402924,91.414390,-0.733038,0,0,0,0,120,0,1),
+(@OGUID+146,175124,229,1,1,74.752180,-275.849121,91.650276,0.959930,0,0,0,0,120,0,1),
+(@OGUID+147,175124,229,1,1,75.177895,-292.906250,91.444630,1.989672,0,0,0,0,120,0,1),
+(@OGUID+148,175124,229,1,1,76.242165,-277.381100,91.473785,-0.785397,0,0,0,0,120,0,1),
+(@OGUID+149,175124,229,1,1,76.649890,-263.575470,91.480260,0.767944,0,0,0,0,120,0,1),
+(@OGUID+150,175124,229,1,1,76.864716,-275.632080,91.477770,2.321287,0,0,0,0,120,0,1),
+(@OGUID+151,175124,229,1,1,77.275060,-262.142944,91.479930,-1.256636,0,0,0,0,120,0,1),
+(@OGUID+152,175124,229,1,1,77.482170,-292.279968,91.447014,-0.087266,0,0,0,0,120,0,1),
+(@OGUID+153,175124,229,1,1,77.701280,-295.117300,91.443660,-1.117009,0,0,0,0,120,0,1),
+(@OGUID+154,175124,229,1,1,78.590004,-266.496338,91.474560,2.007128,0,0,0,0,120,0,1),
+(@OGUID+155,175124,229,1,1,79.001236,-331.653259,91.471030,-2.338740,0,0,0,0,120,0,1),
+(@OGUID+156,175124,229,1,1,79.072030,-328.432700,91.452940,-0.541051,0,0,0,0,120,0,1),
+(@OGUID+157,175124,229,1,1,79.206190,-262.497070,91.475750,-2.129301,0,0,0,0,120,0,1),
+(@OGUID+158,175124,229,1,1,79.568920,-291.473877,91.449265,-0.174532,0,0,0,0,120,0,1),
+(@OGUID+159,175124,229,1,1,79.786570,-325.953278,91.445595,1.605702,0,0,0,0,120,0,1),
+(@OGUID+160,175124,229,1,1,80.484150,-316.636383,91.437960,-0.855211,0,0,0,0,120,0,1),
+(@OGUID+161,175124,229,1,1,80.788110,-253.589417,91.475460,-2.146753,0,0,0,0,120,0,1),
+(@OGUID+162,175124,229,1,1,80.916214,-328.544200,91.451100,-2.094393,0,0,0,0,120,0,1),
+(@OGUID+163,175124,229,1,1,81.006350,-332.454468,91.481350,-2.513274,0,0,0,0,120,0,1),
+(@OGUID+164,175124,229,1,1,81.010410,-264.958038,91.470480,2.757613,0,0,0,0,120,0,1),
+(@OGUID+165,175124,229,1,1,81.071785,-330.128571,91.455090,-1.029743,0,0,0,0,120,0,1),
+(@OGUID+166,175124,229,1,1,81.765560,-326.139557,91.445510,2.460913,0,0,0,0,120,0,1),
+(@OGUID+167,175124,229,1,1,81.817490,-317.400055,91.439900,0.174532,0,0,0,0,120,0,1),
+(@OGUID+168,175124,229,1,1,81.974480,-335.983826,91.522300,-1.500983,0,0,0,0,120,0,1),
+(@OGUID+169,175124,229,1,1,82.075060,-251.810257,91.472730,-1.692969,0,0,0,0,120,0,1),
+(@OGUID+170,175124,229,1,1,82.531170,-315.925079,91.436134,1.710422,0,0,0,0,120,0,1),
+(@OGUID+171,175124,229,1,1,82.764340,-267.748474,91.465096,-3.019413,0,0,0,0,120,0,1),
+(@OGUID+172,175124,229,1,1,82.941520,-330.608337,91.454190,0.698132,0,0,0,0,120,0,1),
+(@OGUID+173,175124,229,1,1,82.960050,-249.989090,91.470880,-1.640610,0,0,0,0,120,0,1),
+(@OGUID+174,175124,229,1,1,83.030556,-333.102661,91.489250,-0.209439,0,0,0,0,120,0,1),
+(@OGUID+175,175124,229,1,1,83.216140,-327.689700,91.446200,-0.296705,0,0,0,0,120,0,1),
+(@OGUID+176,175124,229,1,1,83.653244,-252.415115,91.469410,1.954769,0,0,0,0,120,0,1),
+(@OGUID+177,175124,229,1,1,83.950905,-325.865200,91.445510,-2.967041,0,0,0,0,120,0,1),
+(@OGUID+178,175124,229,1,1,83.954080,-315.109400,91.434060,-0.541051,0,0,0,0,120,0,1),
+(@OGUID+179,175124,229,1,1,84.112040,-268.795441,91.461670,-2.879789,0,0,0,0,120,0,1),
+(@OGUID+180,175124,229,1,1,84.506134,-248.377167,91.467630,1.780234,0,0,0,0,120,0,1),
+(@OGUID+181,175124,229,1,1,84.657295,-301.760900,91.443214,0.157079,0,0,0,0,120,0,1),
+(@OGUID+182,175124,229,1,1,85.563520,-293.522736,91.447860,1.308995,0,0,0,0,120,0,1),
+(@OGUID+183,175124,229,1,1,85.667694,-314.023560,91.436035,-2.076939,0,0,0,0,120,0,1),
+(@OGUID+184,175124,229,1,1,85.834040,-295.413666,91.447740,2.775069,0,0,0,0,120,0,1),
+(@OGUID+185,175124,229,1,1,85.975090,-250.809708,91.464530,-2.932139,0,0,0,0,120,0,1),
+(@OGUID+186,175124,229,1,1,86.112880,-302.506317,91.443740,0.767944,0,0,0,0,120,0,1),
+(@OGUID+187,175124,229,1,1,86.367140,-246.965225,91.463715,1.815142,0,0,0,0,120,0,1),
+(@OGUID+188,175124,229,1,1,87.226135,-252.472137,91.461900,-0.942477,0,0,0,0,120,0,1),
+(@OGUID+189,175124,229,1,1,87.281105,-254.392151,91.461790,0.034906,0,0,0,0,120,0,1),
+(@OGUID+190,175124,229,1,1,87.410990,-278.121460,91.453200,-2.565632,0,0,0,0,120,0,1),
+(@OGUID+191,175124,229,1,1,87.812740,-314.716200,91.444310,3.019413,0,0,0,0,120,0,1),
+(@OGUID+192,175124,229,1,1,87.861210,-303.151947,91.444374,-1.797689,0,0,0,0,120,0,1),
+(@OGUID+193,175124,229,1,1,87.923130,-280.001373,91.447140,-2.705255,0,0,0,0,120,0,1),
+(@OGUID+194,175124,229,1,1,88.098390,-333.163361,91.484410,1.431168,0,0,0,0,120,0,1),
+(@OGUID+195,175124,229,1,1,88.343250,-248.339035,91.459560,2.286379,0,0,0,0,120,0,1),
+(@OGUID+196,175124,229,1,1,88.691250,-301.069800,91.444680,0.366518,0,0,0,0,120,0,1),
+(@OGUID+197,175124,229,1,1,88.808876,-316.133700,91.444670,-0.698132,0,0,0,0,120,0,1),
+(@OGUID+198,175124,229,1,1,89.004050,-251.208176,91.458170,2.949595,0,0,0,0,120,0,1),
+(@OGUID+199,175124,229,1,1,89.099160,-290.132965,91.446330,1.535890,0,0,0,0,120,0,1),
+(@OGUID+200,175124,229,1,1,89.926796,-301.831146,91.445114,0.541051,0,0,0,0,120,0,1),
+(@OGUID+201,175124,229,1,1,89.958930,-318.158875,91.444320,-0.872664,0,0,0,0,120,0,1),
+(@OGUID+202,175124,229,1,1,90.307120,-332.646332,91.473750,2.617989,0,0,0,0,120,0,1),
+(@OGUID+203,175124,229,1,1,90.575424,-320.018616,91.445500,1.204277,0,0,0,0,120,0,1),
+(@OGUID+204,175124,229,1,1,91.830710,-291.348500,91.445500,-3.089183,0,0,0,0,120,0,1),
+(@OGUID+205,175124,229,1,1,91.860870,-301.934900,91.445500,0.733038,0,0,0,0,120,0,1),
+(@OGUID+206,175124,229,1,1,92.115500,-334.860800,91.506560,0.453785,0,0,0,0,120,0,1),
+(@OGUID+207,175124,229,1,1,92.125114,-279.851044,91.445500,-1.675514,0,0,0,0,120,0,1),
+(@OGUID+208,175124,229,1,1,92.600150,-288.176178,91.445500,0.436332,0,0,0,0,120,0,1),
+(@OGUID+209,175124,229,1,1,92.644230,-304.446533,91.445500,2.443460,0,0,0,0,120,0,1),
+(@OGUID+210,175124,229,1,1,93.673340,-290.120483,91.445500,-0.750491,0,0,0,0,120,0,1),
+(@OGUID+211,175124,229,1,1,93.811460,-305.536255,91.445500,1.029743,0,0,0,0,120,0,1),
+(@OGUID+212,175124,229,1,1,93.890366,-288.281036,91.445500,2.356195,0,0,0,0,120,0,1),
+(@OGUID+213,175124,229,1,1,94.564140,-281.093300,91.445500,2.513274,0,0,0,0,120,0,1),
+(@OGUID+214,175124,229,1,1,94.917090,-288.643616,91.445500,2.967041,0,0,0,0,120,0,1),
+(@OGUID+215,175124,229,1,1,95.461464,-313.583679,91.445500,0.855211,0,0,0,0,120,0,1),
+(@OGUID+216,175124,229,1,1,96.062840,-287.470337,91.445500,1.710422,0,0,0,0,120,0,1),
+(@OGUID+217,175124,229,1,1,96.341835,-280.517578,91.445500,0.139624,0,0,0,0,120,0,1),
+(@OGUID+218,175124,229,1,1,97.125830,-281.948944,91.445500,-1.274091,0,0,0,0,120,0,1),
+(@OGUID+219,175124,229,1,1,97.196310,-310.890533,91.445500,-3.036838,0,0,0,0,120,0,1),
+(@OGUID+220,175124,229,1,1,97.340485,-313.429962,91.445500,2.670348,0,0,0,0,120,0,1),
+(@OGUID+221,175124,229,1,1,98.855940,-313.048950,91.445500,-1.012289,0,0,0,0,120,0,1),
+(@OGUID+222,175194,229,1,1,192.740372,-258.394226,76.86026,0,0,0,0,0,120,0,0),
+(@OGUID+223,175195,229,1,1,124.778954,-298.037384,70.85264,0.785396755,0,0,0,0,120,0,0),
+(@OGUID+224,175196,229,1,1,228.802658,-301.542084,76.88119,-1.57079577,0,0,0,0,120,0,0),
+(@OGUID+225,175197,229,1,1,125.357704,-340.4654,70.875206,2.356195,0,0,0,0,120,0,0),
+(@OGUID+226,175198,229,1,1,215.157425,-334.733,76.81243,-2.356195,0,0,0,0,120,0,0),
+(@OGUID+227,175199,229,1,1,155.33374,-353.044769,70.83366,3.14159274,0,0,0,0,120,0,0),
+(@OGUID+228,175200,229,1,1,155.320572,-286.073547,70.87632,0,0,0,0,0,120,0,0),
+(@OGUID+229,175266,229,1,1,144.3746,-240.826111,91.471344,0,0,0,0,0,120,0,0),
+(@OGUID+230,175267,229,1,1,126.354256,-240.769867,91.47007,0,0,0,0,0,120,0,0),
+(@OGUID+231,175268,229,1,1,162.465958,-240.764633,91.46876,0,0,0,0,0,120,0,0),
+(@OGUID+232,175269,229,1,1,126.295486,-258.731628,91.47007,0,0,0,0,0,120,0,0),
+(@OGUID+233,175270,229,1,1,162.443268,-258.9044,91.47007,0,0,0,0,0,120,0,0),
+(@OGUID+234,175271,229,1,1,126.4017,-276.79007,91.47007,0,0,0,0,0,120,0,0),
+(@OGUID+235,175272,229,1,1,162.400742,-276.823822,91.47007,0,0,0,0,0,120,0,0),
+(@OGUID+236,175706,229,1,1,144.445023,-280.941467,91.54761,1.58824873,0,0,0,0,120,0,0),
+(@OGUID+237,175244,229,1,1,216.44342,-286.135376,76.94057,3.14159274,0,0,0,0,120,0,1),
+(@OGUID+238,175187,229,1,1,144.369614,-299.198425,91.47007,0,0,0,0,0,120,0,1),
+(@OGUID+239,175153,229,1,1,113.751076,-258.944977,91.56026,0,0,0,0,0,120,0,1),
+(@OGUID+240,175705,229,1,1,175.127151,-258.944946,91.56026,0,0,0,0,0,120,0,1),
+(@OGUID+241,175185,229,1,1,194.234833,-420.225037,110.76078,3.14159274,0,0,0,0,120,0,1),
+(@OGUID+242,175186,229,1,1,92.959465,-435.590027,110.954376,-1.57079577,0,0,0,0,120,0,1),
+(@OGUID+243,164726,229,1,1,108.036087,-420.3313,110.954376,3.14159274,0,0,0,0,120,0,1),
+(@OGUID+244,175382,229,1,1,67.1283,-297.421021,91.42554,-0.0349062532,0,0,0,0,120,0,1),
+(@OGUID+245,175385,229,1,1,65.41786,-280.4161,94.04653,0.06981169,0,0,0,0,120,0,1),
+(@OGUID+246,175528,229,1,1,100.25692,-313.139862,66.5452652,3.14159274,0,0,0,0,120,0,0),
+(@OGUID+247,175529,229,1,1,100.25692,-324.880249,66.5452652,3.14159274,0,0,0,0,120,0,0),
+(@OGUID+248,175530,229,1,1,110.21476,-324.880249,68.03545,3.14159274,0,0,0,0,120,0,0),
+(@OGUID+249,175531,229,1,1,110.21476,-313.139862,68.03545,3.14159274,0,0,0,0,120,0,0),
+(@OGUID+250,175532,229,1,1,120.461563,-324.880249,73.53309,3.14159274,0,0,0,0,120,0,0),
+(@OGUID+251,175533,229,1,1,120.461563,-313.139862,73.53309,3.14159274,0,0,0,0,120,0,0),
+(@OGUID+252,175946,229,1,1,45.1932869,-259.712219,106.532768,3.14159274,0,0,0,0,120,0,1),
+(@OGUID+253,175947,229,1,1,45.19329,-312.5203,106.532768,3.14159274,0,0,0,0,120,0,1),
+(@OGUID+254,175970,229,1,1,147.227539,-240.435669,112.20472,-1.64933348,0,0,0,0,120,0,1),
+(@OGUID+255,176447,229,1,1,35.2498856,-505.634277,110.91436,-3.13874269,0,0,0,0,120,0,1),
+(@OGUID+256,176448,229,1,1,31.2830067,-505.634277,110.91436,1.57142222,0,0,0,0,120,0,1),
+(@OGUID+257,176449,229,1,1,27.4453468,-505.634277,110.91436,-0.261172324,0,0,0,0,120,0,1),
+(@OGUID+258,176450,229,1,1,21.5667877,-506.580719,110.91436,-1.57016766,0,0,0,0,120,0,1),
+(@OGUID+259,176451,229,1,1,18.0824432,-505.634277,110.91436,-3.13874269,0,0,0,0,120,0,1),
+(@OGUID+260,176452,229,1,1,24.5420456,-504.7355,110.91436,-2.35556316,0,0,0,0,120,0,1),
+(@OGUID+261,136950,229,1,1,72.83732,-265.629639,60.73645,3.14159274,0,0,0,0,120,0,1),
+(@OGUID+262,136952,229,1,1,69.97309,-329.867767,55.8721352,3.14159274,0,0,0,0,120,0,1),
+(@OGUID+263,136955,229,1,1,56.3640633,-306.158142,54.01571,3.14159274,0,0,0,0,120,0,1),
+(@OGUID+264,176459,229,1,1,68.64788,-270.903229,60.73748,3.14159274,0,0,0,0,120,0,1),
+(@OGUID+265,176460,229,1,1,70.54355,-257.169067,60.74014,3.124123,0,0,0,0,120,0,1),
+(@OGUID+266,176461,229,1,1,69.3254242,-265.102051,60.60442,3.14159274,0,0,0,0,120,0,1),
+(@OGUID+267,176462,229,1,1,90.48029,-283.217,60.70017,3.14159274,0,0,0,0,120,0,1),
+(@OGUID+268,176463,229,1,1,91.63333,-262.053284,60.70017,3.14159274,0,0,0,0,120,0,1),
+(@OGUID+269,136922,229,1,1,88.21516,-415.1,110.95723,2.72271276,0,0,0,0,120,0,1),
+(@OGUID+270,136923,229,1,1,87.4498444,-468.453552,116.886841,2.72271276,0,0,0,0,120,0,1),
+(@OGUID+271,136925,229,1,1,40.7229156,-586.7098,30.6816959,1.74532676,0,0,0,0,120,0,1),
+(@OGUID+272,136926,229,1,1,43.3148575,-572.47644,30.6816959,1.74532676,0,0,0,0,120,0,1),
+(@OGUID+273,136927,229,1,1,4.75705242,-567.072754,29.2221813,1.74532676,0,0,0,0,120,0,1),
+(@OGUID+274,136928,229,1,1,8.392041,-583.677,29.2221813,1.74532676,0,0,0,0,120,0,1),
+(@OGUID+275,136929,229,1,1,152.587021,-396.408356,121.963966,-1.57079577,0,0,0,0,120,0,1),
+(@OGUID+276,136930,229,1,1,147.161285,-389.9539,121.963966,-1.57079577,0,0,0,0,120,0,1),
+(@OGUID+277,136931,229,1,1,149.6765,-386.148346,121.963966,-1.57079577,0,0,0,0,120,0,1),
+(@OGUID+278,136932,229,1,1,157.7783,-389.9539,121.963966,-1.57079577,0,0,0,0,120,0,1),
+(@OGUID+279,136933,229,1,1,150.609192,-396.408356,121.963966,-1.57079577,0,0,0,0,120,0,1),
+(@OGUID+280,136934,229,1,1,155.816116,-390.034546,121.963966,-1.57079577,0,0,0,0,120,0,1),
+(@OGUID+281,136935,229,1,1,145.1764,-390.034546,121.963966,-1.57079577,0,0,0,0,120,0,1),
+(@OGUID+282,136936,229,1,1,153.360245,-386.1687,121.963966,-1.57079577,0,0,0,0,120,0,1),
+(@OGUID+283,136937,229,1,1,149.569,-454.6866,121.963966,1.57079577,0,0,0,0,120,0,1),
+(@OGUID+284,136938,229,1,1,153.252762,-454.70694,121.963966,1.57079577,0,0,0,0,120,0,1),
+(@OGUID+285,136939,229,1,1,157.752838,-450.1581,121.963966,1.57079577,0,0,0,0,120,0,1),
+(@OGUID+286,136940,229,1,1,155.76796,-450.238739,121.963966,1.57079577,0,0,0,0,120,0,1),
+(@OGUID+287,136941,229,1,1,152.320068,-444.3045,121.963966,1.57079577,0,0,0,0,120,0,1),
+(@OGUID+288,136942,229,1,1,150.342224,-444.3045,121.963966,1.57079577,0,0,0,0,120,0,1),
+(@OGUID+289,136943,229,1,1,147.113144,-450.1581,121.963966,1.57079577,0,0,0,0,120,0,1),
+(@OGUID+290,136944,229,1,1,145.15094,-450.238739,121.963966,1.57079577,0,0,0,0,120,0,1),
+(@OGUID+291,136945,229,1,1,-174.133926,-342.7732,64.39388,3.14159274,0,0,0,0,120,0,1),
+(@OGUID+292,136946,229,1,1,-172.351959,-462.842072,87.39826,-1.60570168,0,0,0,0,120,0,1),
+(@OGUID+293,136947,229,1,1,16.9936657,-253.820969,65.44975,3.14159274,0,0,0,0,120,0,1),
+(@OGUID+294,136948,229,1,1,8.170414,-268.9804,65.44975,3.14159274,0,0,0,0,120,0,1),
+(@OGUID+295,136949,229,1,1,51.2451057,-274.132843,65.44975,3.14159274,0,0,0,0,120,0,1),
+(@OGUID+296,136951,229,1,1,68.8801651,-283.793518,60.73645,3.14159274,0,0,0,0,120,0,1),
+(@OGUID+297,136954,229,1,1,16.1673641,-280.865326,9.61726,3.14159274,0,0,0,0,120,0,1),
+(@OGUID+298,136957,229,1,1,117.4544,-254.2912,91.57107,2.72271276,0,0,0,0,120,0,1),
+(@OGUID+299,136959,229,1,1,125.65564,-280.80777,91.57107,2.72271276,0,0,0,0,120,0,1),
+(@OGUID+300,136961,229,1,1,46.4689255,-309.64917,91.57107,2.72271276,0,0,0,0,120,0,1),
+(@OGUID+301,136962,229,1,1,106.176666,-265.9525,91.57107,-1.46607578,0,0,0,0,120,0,1),
+(@OGUID+302,136963,229,1,1,107.690056,-253.095154,91.57107,2.72271276,0,0,0,0,120,0,1),
+(@OGUID+303,136964,229,1,1,82.58793,-364.5863,116.859177,2.72271276,0,0,0,0,120,0,1),
+(@OGUID+304,153464,229,1,1,-36.1175957,-583.8276,-18.8201447,1.97221982,0,0,0,0,120,0,1),
+(@OGUID+305,153469,229,1,1,-73.99849,-453.3353,-18.9350014,-3.08918333,0,0,0,0,120,0,1),
+(@OGUID+306,153469,229,1,1,-84.26773,-350.10376,70.9524155,1.91986156,0,0,0,0,120,0,1),
+(@OGUID+307,153469,229,1,1,86.85506,-587.50116,30.6085377,2.63544416,0,0,0,0,120,0,1),
+(@OGUID+308,164725,229,1,1,126.878883,-319.108551,70.93496,3.14159274,0,0,0,0,120,0,0),
+(@OGUID+309,175334,229,1,1,33.71665,-466.067383,-18.46511,-1.53588951,0,0,0,0,120,0,1),
+(@OGUID+310,175584,229,1,1,-14.3415041,-395.7287,48.5381279,2.86233544,0,0,0,0,120,0,1),
+(@OGUID+311,175588,229,1,1,-139.523071,-525.87854,6.363978,-2.4260025,0,0,0,0,120,0,1),
+(@OGUID+312,175606,229,1,1,-100.230141,-529.5372,-5.773813,-0.43633157,0,0,0,0,120,0,1),
+(@OGUID+313,175606,229,1,1,-100.324532,-523.847,10.7028713,2.111848,0,0,0,0,120,0,1),
+(@OGUID+314,175606,229,1,1,-101.885674,-521.985168,-7.841986,-0.0349062532,0,0,0,0,120,0,1),
+(@OGUID+315,175606,229,1,1,-102.4652,-575.651062,9.900889,2.478367,0,0,0,0,120,0,1),
+(@OGUID+316,175606,229,1,1,-112.209923,-569.506165,10.1991549,2.18166041,0,0,0,0,120,0,1),
+(@OGUID+317,175606,229,1,1,-125.2294,-576.6645,13.7725887,-0.296705216,0,0,0,0,120,0,1),
+(@OGUID+318,175606,229,1,1,-126.745758,-514.1637,-12.1469631,3.10665226,0,0,0,0,120,0,1),
+(@OGUID+319,175606,229,1,1,-129.513687,-441.7,24.4328327,0.9773831,0,0,0,0,120,0,1),
+(@OGUID+320,175606,229,1,1,-131.570419,-439.602051,22.8934059,-1.134463,0,0,0,0,120,0,1),
+(@OGUID+321,175606,229,1,1,-131.804932,-526.783936,6.556513,-2.28637886,0,0,0,0,120,0,1),
+(@OGUID+322,175606,229,1,1,-132.261276,-474.847717,9.822438,-2.82742977,0,0,0,0,120,0,1),
+(@OGUID+323,175606,229,1,1,-132.404343,-514.960754,-15.93743,-1.79768872,0,0,0,0,120,0,1),
+(@OGUID+324,175606,229,1,1,-138.894241,-439.497467,24.8087673,1.76278245,0,0,0,0,120,0,1),
+(@OGUID+325,175606,229,1,1,-139.15303,-434.7381,23.11234,-2.740162,0,0,0,0,120,0,1),
+(@OGUID+326,175606,229,1,1,-144.504959,-441.602783,23.1015816,0.3316107,0,0,0,0,120,0,1),
+(@OGUID+327,175606,229,1,1,-146.906982,-441.462952,22.4743786,-0.8028509,0,0,0,0,120,0,1),
+(@OGUID+328,175606,229,1,1,-147.8808,-448.5486,20.091135,1.3264482,0,0,0,0,120,0,1),
+(@OGUID+329,175606,229,1,1,-150.1039,-470.007965,16.2278,1.76278245,0,0,0,0,120,0,1),
+(@OGUID+330,175606,229,1,1,-153.787643,-515.2272,-15.9504414,-0.95993,0,0,0,0,120,0,1),
+(@OGUID+331,175606,229,1,1,-154.378235,-552.2341,9.918845,-2.0594883,0,0,0,0,120,0,1),
+(@OGUID+332,175606,229,1,1,-154.59169,-525.218567,8.161819,2.042035,0,0,0,0,120,0,1),
+(@OGUID+333,175606,229,1,1,-154.769653,-541.317,9.022168,-0.104719326,0,0,0,0,120,0,1),
+(@OGUID+334,175606,229,1,1,-154.889313,-570.3387,10.0172291,2.478367,0,0,0,0,120,0,1),
+(@OGUID+335,175607,229,1,1,20.4895344,-438.85733,-18.78273,-2.26892543,0,0,0,0,120,0,1),
+(@OGUID+336,175608,229,1,1,23.8203316,-440.8061,-18.75866,1.43116808,0,0,0,0,120,0,1),
+(@OGUID+337,175609,229,1,1,20.99143,-443.1193,-18.91834,1.08210289,0,0,0,0,120,0,1),
+(@OGUID+338,175609,229,1,1,23.7352352,-445.173035,-18.9350014,2.111848,0,0,0,0,120,0,1),
+(@OGUID+339,175609,229,1,1,25.9651279,-443.5448,-18.9203186,-2.75761318,0,0,0,0,120,0,1),
+(@OGUID+340,175886,229,1,1,-34.5386,-589.6351,30.9964237,-0.593412,0,0,0,0,120,0,1),
+(@OGUID+341,175886,229,1,1,-34.7323723,-589.6146,30.9339237,1.62315571,0,0,0,0,120,0,1),
+(@OGUID+342,175886,229,1,1,-35.6387024,-589.632263,30.9825344,-1.97221982,0,0,0,0,120,0,1),
+(@OGUID+343,175886,229,1,1,-36.297657,-589.616943,31.0103111,1.09955645,0,0,0,0,120,0,1),
+(@OGUID+344,175886,229,1,1,-37.7856445,-589.639465,30.9964237,-3.08918333,0,0,0,0,120,0,1),
+(@OGUID+345,175949,229,1,1,-128.233643,-482.381,25.4534683,-0.0174524616,0,0,0,0,120,0,1),
+(@OGUID+346,175950,229,1,1,-11.1344738,-466.205139,-16.8552532,-1.55334139,0,0,0,0,120,0,1),
+(@OGUID+347,176089,229,1,1,-18.8625946,-360.393951,-31.426754,2.513274,0,0,0,0,120,0,1),
+(@OGUID+348,176090,229,1,1,-19.0726433,-361.990631,-31.523716,-0.3490652,0,0,0,0,120,0,1),
+(@OGUID+349,176425,229,1,1,60.0723534,-511.967224,29.2142811,-3.13874269,0,0,0,0,120,0,1),
+(@OGUID+350,176426,229,1,1,56.9334679,-556.048035,30.66044,-3.13874269,0,0,0,0,120,0,1),
+(@OGUID+351,176427,229,1,1,53.1921,-461.069824,24.3897438,-3.14149952,0,0,0,0,120,0,1),
+(@OGUID+352,176428,229,1,1,-63.25678,-581.4829,29.29337,-3.14149952,0,0,0,0,120,0,1),
+(@OGUID+353,176429,229,1,1,-37.6862526,-551.8221,16.2163448,3.14159274,0,0,0,0,120,0,1),
+(@OGUID+354,176430,229,1,1,-25.3348827,-478.438263,17.2503757,3.14159274,0,0,0,0,120,0,1),
+(@OGUID+355,176431,229,1,1,-46.3864632,-448.609955,-18.5644283,3.14159274,0,0,0,0,120,0,1),
+(@OGUID+356,176432,229,1,1,-2.64241648,-579.1437,-18.7608662,3.14159274,0,0,0,0,120,0,1),
+(@OGUID+357,176433,229,1,1,26.982,-583.365234,-18.515255,3.14159274,0,0,0,0,120,0,1),
+(@OGUID+358,176434,229,1,1,35.6424026,-550.729858,-18.41096,3.14159274,0,0,0,0,120,0,1),
+(@OGUID+359,176435,229,1,1,33.1642647,-471.046875,-18.5059147,3.14159274,0,0,0,0,120,0,1),
+(@OGUID+360,176436,229,1,1,31.9839039,-495.3488,-18.8984013,-3.13874269,0,0,0,0,120,0,1),
+(@OGUID+361,176437,229,1,1,-39.3852,-424.8782,-18.84707,3.14159274,0,0,0,0,120,0,1),
+(@OGUID+362,176438,229,1,1,-23.2051277,-410.6093,-18.8984013,3.14159274,0,0,0,0,120,0,1),
+(@OGUID+363,176439,229,1,1,-76.09747,-418.800659,-18.9234028,-1.83259165,0,0,0,0,120,0,1),
+(@OGUID+364,176440,229,1,1,-59.9712257,-409.6412,-18.8442917,3.14159274,0,0,0,0,120,0,1),
+(@OGUID+365,176441,229,1,1,-79.5308762,-453.927216,-18.8331814,3.14159274,0,0,0,0,120,0,1),
+(@OGUID+366,176442,229,1,1,-15.437788,-368.78067,49.49363,3.14085126,0,0,0,0,120,0,1),
+(@OGUID+367,176443,229,1,1,-121.137337,-296.445465,71.0397,3.14159274,0,0,0,0,120,0,1),
+(@OGUID+368,176444,229,1,1,-137.26358,-305.604919,70.9605942,-1.83259165,0,0,0,0,120,0,1),
+(@OGUID+369,176445,229,1,1,-59.1198235,-339.829254,70.9605942,-1.83259165,0,0,0,0,120,0,1),
+(@OGUID+370,176446,229,1,1,-87.3357,-348.370026,71.0397,3.14159274,0,0,0,0,120,0,1),
+(@OGUID+371,176454,229,1,1,60.57147,-562.5008,30.48111,3.14159274,0,0,0,0,120,0,1),
+(@OGUID+372,176455,229,1,1,52.2036819,-470.448181,25.11214,3.14148068,0,0,0,0,120,0,1),
+(@OGUID+373,176456,229,1,1,-60.6475868,-584.3826,29.1114845,3.14159274,0,0,0,0,120,0,1),
+(@OGUID+374,176457,229,1,1,-115.273315,-428.517548,-18.7010059,3.14159274,0,0,0,0,120,0,1),
+(@OGUID+375,176458,229,1,1,-114.981789,-421.896851,-18.9178715,3.14159274,0,0,0,0,120,0,1);
diff --git a/sql/updates/world/2011_12_18_00_world_creature_addon.sql b/sql/updates/world/2011_12_18_00_world_creature_addon.sql
new file mode 100644
index 00000000000..5df7f000b06
--- /dev/null
+++ b/sql/updates/world/2011_12_18_00_world_creature_addon.sql
@@ -0,0 +1,2 @@
+-- Delete addons for some creatures that has been removed
+DELETE FROM `creature_addon` WHERE `guid` IN (209318,209333,209315,209337,209308,209312,209331,209320,209335,209318,209333,209315,209337,209308,209312,209331,209320,209335);
diff --git a/sql/updates/world/2011_12_18_01_world_gossip.sql b/sql/updates/world/2011_12_18_01_world_gossip.sql
new file mode 100644
index 00000000000..eb76ffe4009
--- /dev/null
+++ b/sql/updates/world/2011_12_18_01_world_gossip.sql
@@ -0,0 +1,42 @@
+-- Gossip Menu insert from sniff
+DELETE FROM `gossip_menu` WHERE `entry`=7610 AND `text_id`=9261;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (7610,9261);
+DELETE FROM `gossip_menu` WHERE `entry`=8249 AND `text_id`=10266;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (8249,10266);
+DELETE FROM `gossip_menu` WHERE `entry`=7612 AND `text_id`=9263;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (7612,9263);
+DELETE FROM `gossip_menu` WHERE `entry`=7611 AND `text_id`=9262;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (7611,9262);
+DELETE FROM `gossip_menu` WHERE `entry`=7588 AND `text_id`=9236;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (7588,9236);
+DELETE FROM `gossip_menu` WHERE `entry`=7590 AND `text_id`=9238;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (7590,9238);
+DELETE FROM `gossip_menu` WHERE `entry`=7591 AND `text_id`=9239;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (7591,9239);
+DELETE FROM `gossip_menu` WHERE `entry`=7589 AND `text_id`=9237;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (7589,9237);
+DELETE FROM `gossip_menu` WHERE `entry`=7526 AND `text_id`=9128;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (7526,9128);
+DELETE FROM `gossip_menu` WHERE `entry`=7614 AND `text_id`=9265;
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES (7614,9265);
+-- Creature Gossip_menu_id Update from sniff
+UPDATE `creature_template` SET `gossip_menu_id`=7610 WHERE `entry`=18004;
+UPDATE `creature_template` SET `gossip_menu_id`=8249 WHERE `entry`=21172;
+UPDATE `creature_template` SET `gossip_menu_id`=7612 WHERE `entry`=18005;
+UPDATE `creature_template` SET `gossip_menu_id`=7611 WHERE `entry`=18006;
+UPDATE `creature_template` SET `gossip_menu_id`=7588 WHERE `entry`=18010;
+UPDATE `creature_template` SET `gossip_menu_id`=7590 WHERE `entry`=18019;
+UPDATE `creature_template` SET `gossip_menu_id`=7589 WHERE `entry`=18009;
+UPDATE `creature_template` SET `gossip_menu_id`=7614 WHERE `entry`=18003;
+-- Creature Gossip_menu_option Update from sniff
+DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (8249,7612,7611,7588,7590,7589,7495) AND `id`=0;
+DELETE FROM `gossip_menu_option` WHERE `menu_id`=7590 AND `id`=1;
+INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`) VALUES
+(8249,0,1, 'I want to browse your goods.',3,128,0,0,0,0, ''),
+(7612,0,1, 'I wish to buy from you.',3,128,0,0,0,0, ''),
+(7611,0,1, 'I would like to buy from you.',3,128,0,0,0,0, ''),
+(7588,0,1, 'Show me your wares, Maktu.',3,128,0,0,0,0, ''),
+(7590,0,1, 'Let me browse your reagents and poison supplies.',3,128,0,0,0,0, ''),
+(7590,1,0, 'Specialist, eh? Just what kind of specialist are you, anyway?',1,1,7591,0,0,0, ''),
+(7589,0,1, 'I wish to browse your wares.',3,128,0,0,0,0, ''),
+(7495,0,0, 'Watcher Leesa''oh, why are you out here?',1,1,7526,0,0,0, '');
diff --git a/sql/updates/world/2011_12_18_02_world_spell_script_names.sql b/sql/updates/world/2011_12_18_02_world_spell_script_names.sql
new file mode 100644
index 00000000000..c5f9a4376df
--- /dev/null
+++ b/sql/updates/world/2011_12_18_02_world_spell_script_names.sql
@@ -0,0 +1,3 @@
+DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_gen_luck_of_the_draw';
+INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
+(72221,'spell_gen_luck_of_the_draw');
diff --git a/sql/updates/world/2011_12_18_03_world_trinity_string.sql b/sql/updates/world/2011_12_18_03_world_trinity_string.sql
new file mode 100644
index 00000000000..d26cc356cff
--- /dev/null
+++ b/sql/updates/world/2011_12_18_03_world_trinity_string.sql
@@ -0,0 +1,3 @@
+DELETE FROM `trinity_string` WHERE `entry`=5031;
+INSERT INTO `trinity_string` (`entry`,`content_default`) VALUES
+(5031, 'AIName: %s ScriptName: %s');
diff --git a/sql/updates/world/2011_12_18_04_world_misc.sql b/sql/updates/world/2011_12_18_04_world_misc.sql
new file mode 100644
index 00000000000..3404e4f285f
--- /dev/null
+++ b/sql/updates/world/2011_12_18_04_world_misc.sql
@@ -0,0 +1,87 @@
+-- Remove empty EAI Script call from the following entries
+UPDATE `creature_template` SET `AIName` = '' WHERE `entry` IN (30243,30632);
+
+-- Crimson Hammersmith summon from Blacksmithing Plans fix
+-- Black Guard Swordsmith summon from Blacksmithing Plans fix
+UPDATE `gameobject_template` SET `AIName` = 'SmartGameObjectAI' WHERE `entry` IN (176325, 176327);
+DELETE FROM `smart_scripts` WHERE `entryorguid` IN (176325, 176327) AND `source_type`=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
+(176325, 1, 0, 0, 64, 0, 100, 1, 0, 0, 0, 0, 12, 11120, 6, 60000, 0, 0, 0, 8, 0, 0, 0, 3585.5, -3000.15, 125, 2.19912, 'Blacksmithing Plans - summon Crimson Hammersmith'),
+(176327, 1, 0, 0, 64, 0, 100, 1, 0, 0, 0, 0, 12, 11121, 6, 60000, 0, 0, 0, 8, 0, 0, 0, 3818.4, -3693.32, 144.242, 0.261799, 'Blacksmithing Plans - summon Black Guard Swordsmith');
+
+-- Sleeping Giants fix
+UPDATE `creature_template` SET `AIName` = 'SmartAI' WHERE `entry` = 24669;
+DELETE FROM `smart_scripts` WHERE (`entryorguid`=24669 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
+(24669, 0, 0, 1, 8, 0, 100, 0, 44261, 1, 0, 0, 33, 24669, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Dormant Vrykul - Sleeping Giants quest credit'),
+(24669, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Dormant Vrykul - Sleeping Giants despawn');
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=18 AND `SourceEntry`=34083;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(18, 0, 34083, 0, 24, 1, 24669, 0, 63, '', 'Awakening Rod target limit to Dormant Vrykul'); -- changed to item script by Nay, not tested.
+
+-- Culling of Stratholme Hemotoxin SAI spell fix version
+SET @ENTRY := 28199;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@ENTRY;
+DELETE FROM `creature_ai_scripts` WHERE (`creature_id`=@ENTRY);
+DELETE FROM `smart_scripts` WHERE (`entryorguid`=@ENTRY);
+INSERT INTO `smart_scripts` VALUES
+(@ENTRY, 0, 0, 0, 9, 0, 25, 2, 0, 20, 5000, 8000, 11, 52522, 32, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Tomb Stalker - Cast Hemotoxin Normal'),
+(@ENTRY, 0, 1, 0, 9, 0, 40, 4, 0, 20, 5000, 8000, 11, 58782, 32, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Tomb Stalker - Cast Hemotoxin Heroic');
+
+DELETE FROM `creature` WHERE `id` IN (28318, 29346);
+INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`) VALUES
+(40153, 28318, 530, 1, 1, 0, 0, -1775.148438, 5548.291992, -12.428190, 4.146070, 300, 0, 0, 1, 0, 0, 0, 0, 0), -- Grand Apothecary Putress
+(40251, 29346, 530, 1, 1, 0, 0, 1925, -4123.1899, 43.1780, 4.79965, 300, 0, 0, 1, 0, 0, 0, 0, 0); -- Apothecary Karlov
+
+-- Fix NPCs falling underground when killed by nelegalno
+UPDATE `creature_template` SET `InhabitType` = 3 WHERE `entry` IN (5936, 24899); -- Orca and Scoodles
+
+-- Removes wrong restriction from G.N.E.R.D. rage
+DELETE FROM `achievement_criteria_data` WHERE `criteria_id`=3882 AND `type`=16;
+
+-- Kalu'ak Fishing Derby start time fix
+UPDATE `game_event` SET `start_time` = '2011-01-01 13:00:00' WHERE `eventEntry`=63;
+UPDATE `game_event` SET `start_time` = '2011-01-01 14:00:00' WHERE `eventEntry`=64;
+
+-- Stranglethorn Fishing Extravaganza start time fix ( http://old.wowhead.com/event=301 )
+UPDATE `game_event` SET `start_time` = '2011-01-01 14:00:00' WHERE `eventEntry` IN (14, 15, 62);
+UPDATE `game_event` SET `description` = 'Stranglethorn Fishing Extravaganza Announce' WHERE `eventEntry`=14;
+UPDATE `game_event` SET `description` = 'Stranglethorn Fishing Extravaganza Fishing Pools' WHERE `eventEntry`=15;
+UPDATE `game_event` SET `description` = 'Stranglethorn Fishing Extravaganza Turn-ins' WHERE `eventEntry`=62;
+
+-- Eitrigg's Wisdom fix
+SET @GOSSIP = 21312;
+SET @NPC = 3144;
+SET @QUEST = 4941;
+-- Add gossip options for each menu id
+DELETE FROM `gossip_menu_option` WHERE `menu_id` BETWEEN @GOSSIP AND @GOSSIP+7;
+INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`, `option_text`, `option_id`, `npc_option_npcflag`, `action_menu_id`, `action_poi_id`, `box_coded`, `box_money`, `box_text`) VALUES
+(@GOSSIP, 0, 0, 'Hello, Eitrigg. I bring news from Blackrock Spire.', 1, 1, @GOSSIP+1, 0, 0, 0, ''),
+(@GOSSIP+1, 0, 0, 'There is only one Warchief, Eitrigg!', 1, 1, @GOSSIP+2, 0, 0, 0, ''),
+(@GOSSIP+2, 0, 0, 'What do you mean?', 1, 1, @GOSSIP+3, 0, 0, 0, ''),
+(@GOSSIP+3, 0, 0, 'Hearthglen? But...', 1, 1, @GOSSIP+4, 0, 0, 0, ''),
+(@GOSSIP+4, 0, 0, 'I will take you up on that offer, Eitrigg.', 1, 1, @GOSSIP+5, 0, 0, 0, ''),
+(@GOSSIP+5, 0, 0, 'Ah, so that is how they pushed the Dark Iron to the lower parts of the Spire.', 1, 1, @GOSSIP+6, 0, 0, 0, ''),
+(@GOSSIP+6, 0, 0, 'Perhaps there exists a way?', 1, 1, @GOSSIP+7, 0, 0, 0, ''),
+(@GOSSIP+7, 0, 0, 'As you wish, Eitrigg.', 1, 1, 0, 0, 0, 0, '');
+-- Add gossip menus (text values already in db)
+DELETE FROM `gossip_menu` WHERE `entry`BETWEEN @GOSSIP+1 AND @GOSSIP+7;
+INSERT INTO `gossip_menu` (`entry`, `text_id`) VALUES
+(@GOSSIP+1, 3574),
+(@GOSSIP+2, 3575),
+(@GOSSIP+3, 3576),
+(@GOSSIP+4, 3577),
+(@GOSSIP+5, 3578),
+(@GOSSIP+6, 3579),
+(@GOSSIP+7, 3580);
+-- Add Condtion so gossip only shows when on quest
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=@GOSSIP;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(15, @GOSSIP, 0, 0, 9, 4941, 0, 0, 0, '', NULL);
+-- Add SAI for quest complete and close of gossip when last option selected
+UPDATE `creature_template` SET `AIName`= 'SmartAI' WHERE `entry`=@NPC;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@NPC;
+INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES
+(@NPC,0,0,1,62,0,100,0,@GOSSIP+7,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0.0,0.0,0.0,0.0,'Eitrigg - Select As you wish, Eitrigg. - Close gossip'),
+(@NPC,0,1,0,61,0,100,0,0,0,0,0,15,@QUEST,0,0,0,0,0,7,0,0,0,0.0,0.0,0.0,0.0,'Eitrigg - On link - Give credit quest (4941)');
diff --git a/sql/updates/world/2011_12_18_05_world_misc.sql b/sql/updates/world/2011_12_18_05_world_misc.sql
new file mode 100644
index 00000000000..b8435c4211e
--- /dev/null
+++ b/sql/updates/world/2011_12_18_05_world_misc.sql
@@ -0,0 +1,94 @@
+-- Quest: The Black Knight's Orders (13663) SQL fix
+-- Black Knights Camp Spawns
+SET @OGUID=100489; -- Need 10
+SET @CGUID=152277; -- Need 3
+DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+9;
+INSERT INTO `gameobject` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`rotation0`,`rotation1`,`rotation2`,`rotation3`,`spawntimesecs`,`animprogress`,`state`) VALUES
+(@OGUID+0,194357,571,1,1,9070.324,2050.733,67.21755,0,0,0,0,1,0,0,0), -- Poison Vial
+(@OGUID+1,194357,571,1,1,9073.764,2050.120,68.15718,0,0,0,0,1,0,0,0), -- Poison Vial
+(@OGUID+2,194357,571,1,1,9074.699,2050.709,68.17049,0,0,0,0,1,0,0,0), -- Poison Vial
+(@OGUID+3,194357,571,1,1,9069.595,2050.349,67.21755,0,0,0,0,1,0,0,0), -- Poison Vial
+(@OGUID+4,194357,571,1,1,9069.961,2050.538,67.21755,0,0,0,0,1,0,0,0), -- Poison Vial
+(@OGUID+5,194357,571,1,1,9072.077,2049.292,67.78963,0,0,0,0,1,0,0,0), -- Poison Vial
+(@OGUID+6,194357,571,1,1,9065.680,2052.618,67.28638,0,0,0,0,1,0,0,0), -- Poison Vial
+(@OGUID+7,194394,571,1,1,9083.578,2041.696,67.81812,0,0,0,0,1,0,0,0), -- Cult Rune Circle
+(@OGUID+8,195011,571,1,1,9078.471,2057.547,67.21606,0,0,0,0.9981346,0.06105176,0,0,0), -- Bonfire
+(@OGUID+9,300007,571,1,1,8523.51,566.994,552.841,2.1518,0,0,0.880019,0.474938,300,0,1); -- Spell Focus GO?
+
+DELETE FROM `creature` WHERE `id`=33537;
+INSERT INTO `creature` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`,`npcflag`,`unit_flags`,`dynamicflags`) VALUES
+(@CGUID+0,33537,571,1,1,0,0,9071.043,2075.388,67.21542,4.935980,120,0,0,1,0,0,0,0,0),
+(@CGUID+1,33537,571,1,1,0,0,9074.414,2049.259,67.34636,2.181662,120,0,0,1,0,0,0,0,0),
+(@CGUID+2,33537,571,1,1,0,0,9081.280,2058.925,67.38979,3.612832,120,0,0,1,0,0,0,0,0);
+
+-- Template updates
+UPDATE `creature_template` SET `unit_flags`=`unit_flags`|8,`speed_run`=4, `InhabitType`=5 WHERE `entry`=33519; -- Black Knight''s Gryphon
+UPDATE `creature_template` SET `faction_A`=2080,`faction_H`=2080,`unit_flags`=`unit_flags`|32768,`equipment_id`=823 WHERE `entry`=33537; -- Cult Conspirator
+
+-- See black knight's invisibility while on quest The Black Knight's Orders
+DELETE FROM `spell_area` WHERE `spell`=67471 AND `area` IN (4658);
+INSERT INTO `spell_area` (`spell`,`area`,`quest_start`,`quest_start_active`,`quest_end`,`aura_spell`,`racemask`,`gender`,`autocast`) VALUES
+(67471,4658,13663,1,13663,0,0,2,1); -- See Black Knight Invis
+
+-- Addon data
+DELETE FROM `creature_template_addon` WHERE `entry` IN (33519,33537);
+INSERT INTO `creature_template_addon` (`entry`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES
+(33519,0,0,2049,0,NULL),-- Black Knight''s Gryphon
+(33537,0,1,1,0,NULL); -- Cult Conspirator
+
+-- SAI for Black Knight''s Gryphon
+SET @entry :=33519;
+UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=@entry;
+DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=@entry;
+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,27,0,100,0,0,0,0,0,53,0,@entry,0,13663,0,0,1,0,0,0,0,0,0,0,'Black Knight''s Gryphon - On passenger - Start WP movement'),
+(@entry,0,1,0,40,0,100,0,40,@entry,0,0,33,33519,0,0,0,0,0,7,0,0,0,0,0,0,0,'Black Knight''s Gryphon - On WP 40 - Quest Credit'),
+(@entry,0,2,0,40,0,100,0,43,@entry,0,0,11,50630,0,0,0,0,0,7,0,0,0,0,0,0,0,'Black Knight''s Gryphon - On WP 43 - Dismount Spell'),
+(@entry,0,3,0,40,0,100,0,44,@entry,0,0,41,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Black Knight''s Gryphon - On WP 44 - Despawn');
+
+DELETE FROM `waypoints` WHERE `entry`=33519;
+INSERT INTO `waypoints` (`entry`,`pointid`,`position_x`,`position_y`,`position_z`,`point_comment`) VALUES
+(33519, 1,8521.271,569.5960,552.8375,'Black Knight''s Gryphon'),
+(33519, 2,8517.864,579.1095,553.2125,'Black Knight''s Gryphon'),
+(33519, 3,8513.146,594.6724,551.2125,'Black Knight''s Gryphon'),
+(33519, 4,8505.263,606.5569,550.4177,'Black Knight''s Gryphon'),
+(33519, 5,8503.017,628.4188,547.4177,'Black Knight''s Gryphon'),
+(33519, 6,8480.271,652.7083,547.4177,'Black Knight''s Gryphon'),
+(33519, 7,8459.121,686.1427,547.4177,'Black Knight''s Gryphon'),
+(33519, 8,8436.802,713.8687,547.3428,'Black Knight''s Gryphon'),
+(33519, 9,8405.380,740.0045,547.4177,'Black Knight''s Gryphon'),
+(33519,10,8386.139,770.6009,547.5881,'Black Knight''s Gryphon'),
+(33519,11,8374.297,802.2525,547.9304,'Black Knight''s Gryphon'),
+(33519,12,8374.271,847.0363,548.0427,'Black Knight''s Gryphon'),
+(33519,13,8385.988,868.9881,548.0491,'Black Knight''s Gryphon'),
+(33519,14,8413.027,867.8573,547.2991,'Black Knight''s Gryphon'),
+(33519,15,8452.552,869.0339,547.2991,'Black Knight''s Gryphon'),
+(33519,16,8473.058,875.2012,547.2955,'Black Knight''s Gryphon'),
+(33519,17,8472.278,912.3134,547.4169,'Black Knight''s Gryphon'),
+(33519,18,8479.666,954.1650,547.3298,'Black Knight''s Gryphon'),
+(33519,19,8477.349,1001.368,547.3372,'Black Knight''s Gryphon'),
+(33519,20,8484.538,1025.797,547.4622,'Black Knight''s Gryphon'),
+(33519,21,8525.363,1029.284,547.4177,'Black Knight''s Gryphon'),
+(33519,22,8532.808,1052.904,548.1677,'Black Knight''s Gryphon'),
+(33519,23,8537.356,1077.927,554.5791,'Black Knight''s Gryphon'),
+(33519,24,8540.528,1083.379,569.6827,'Black Knight''s Gryphon'),
+(33519,25,8563.641,1140.965,569.6827,'Black Knight''s Gryphon'),
+(33519,26,8594.897,1205.458,569.6827,'Black Knight''s Gryphon'),
+(33519,27,8617.104,1257.399,566.1833,'Black Knight''s Gryphon'),
+(33519,28,8648.496,1329.349,558.0187,'Black Knight''s Gryphon'),
+(33519,29,8667.723,1388.411,546.1880,'Black Knight''s Gryphon'),
+(33519,30,8699.145,1474.898,528.2197,'Black Knight''s Gryphon'),
+(33519,31,8726.869,1546.006,501.7741,'Black Knight''s Gryphon'),
+(33519,32,8739.058,1592.157,478.5511,'Black Knight''s Gryphon'),
+(33519,33,8750.799,1636.771,455.0797,'Black Knight''s Gryphon'),
+(33519,34,8760.006,1669.482,423.2208,'Black Knight''s Gryphon'),
+(33519,35,8783.310,1701.852,375.8872,'Black Knight''s Gryphon'),
+(33519,36,8817.336,1735.731,343.3323,'Black Knight''s Gryphon'),
+(33519,37,8882.320,1789.754,301.5807,'Black Knight''s Gryphon'),
+(33519,38,8958.597,1841.807,259.9141,'Black Knight''s Gryphon'),
+(33519,39,9045.891,1908.076,233.4143,'Black Knight''s Gryphon'),
+(33519,40,9107.177,1964.594,215.9704,'Black Knight''s Gryphon'),
+(33519,41,9134.763,2036.925,175.1925,'Black Knight''s Gryphon'),
+(33519,42,9128.608,2089.091,141.3593,'Black Knight''s Gryphon'),
+(33519,43,9093.364,2128.384,99.38685,'Black Knight''s Gryphon'),
+(33519,44,9050.709,2123.656,60.24802,'Black Knight''s Gryphon');
diff --git a/sql/updates/world/2011_12_18_06_world_sai.sql b/sql/updates/world/2011_12_18_06_world_sai.sql
new file mode 100644
index 00000000000..2fce176cd0f
--- /dev/null
+++ b/sql/updates/world/2011_12_18_06_world_sai.sql
@@ -0,0 +1,14 @@
+SET @JEEVES := 35642;
+SET @SPELL_GOODBYE := 68052;
+DELETE FROM `spell_linked_spell` WHERE `spell_effect`=@SPELL_GOODBYE AND `spell_trigger`=-68054 AND `type`=0;
+INSERT INTO `spell_linked_spell` (`spell_trigger`,`spell_effect`,`type`,`comment`) VALUES
+(-68054,@SPELL_GOODBYE,0, 'Jeeves - Say Goodbye');
+
+UPDATE `creature_template` SET `AIName`= 'SmartAI' WHERE `entry`=@JEEVES;
+DELETE FROM `smart_scripts` WHERE `entryorguid`=@JEEVES 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
+(@JEEVES,0,0,0,8,0,100,0,@SPELL_GOODBYE,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Jeeves - On Spellhit - Say Line 0");
+
+DELETE FROM `creature_text` WHERE `entry`=@JEEVES;
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
+(@JEEVES,0,0,"If you'll excuse me, I'm afraid I have other business I must attend to. Please call on me again in the future.",12,0,100,3,0,0, 'Jeeves');
diff --git a/sql/updates/world/2011_12_18_07_world_conditions.sql b/sql/updates/world/2011_12_18_07_world_conditions.sql
new file mode 100644
index 00000000000..ef669dd2dbb
--- /dev/null
+++ b/sql/updates/world/2011_12_18_07_world_conditions.sql
@@ -0,0 +1,17 @@
+-- Fix condition for Bom'bay's npc_text, gossip_menu and gossip_menu_option
+-- Player must to complete quest 826 'Zalazane' to see gossip_menu_option
+DELETE FROM `gossip_menu` WHERE `entry`=3062 AND `text_id` IN (3794,3795);
+INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES
+(3062,3794), -- text before to complete quest 826
+(3062,3795); -- text after to complete quest 826
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (14,15) AND `SourceGroup`=3062;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES
+(14,3062,3794,0,14,826,0,0,0,'', "Bom'bay - show text 3794 if player does not have quest Zalazane"),
+(14,3062,3795,0,8,826,0,0,0,'', "Bom'bay - show text 3795 if player has quest Zalazane rewarded"),
+(15,3062,0,0,8,826,0,0,0,'', "Bom'bay - show gossip option 0 if player has quest Zalazane rewarded"),
+(15,3062,1,0,8,826,0,0,0,'', "Bom'bay - show gossip option 1 if player has quest Zalazane rewarded"),
+(15,3062,2,0,8,826,0,0,0,'', "Bom'bay - show gossip option 2 if player has quest Zalazane rewarded"),
+(15,3062,3,0,8,826,0,0,0,'', "Bom'bay - show gossip option 3 if player has quest Zalazane rewarded"),
+(15,3062,4,0,8,826,0,0,0,'', "Bom'bay - show gossip option 4 if player has quest Zalazane rewarded"),
+(15,3062,5,0,8,826,0,0,0,'', "Bom'bay - show gossip option 5 if player has quest Zalazane rewarded"),
+(15,3062,6,0,8,826,0,0,0,'', "Bom'bay - show gossip option 6 if player has quest Zalazane rewarded");
diff --git a/sql/updates/world/2011_12_19_00_world_conditions.sql b/sql/updates/world/2011_12_19_00_world_conditions.sql
new file mode 100644
index 00000000000..a56151a9f8f
--- /dev/null
+++ b/sql/updates/world/2011_12_19_00_world_conditions.sql
@@ -0,0 +1,7 @@
+UPDATE spell_dbc SET EffectImplicitTargetA1 = 22, EffectImplicitTargetB1 = 7 WHERE Id = 58630;
+
+DELETE FROM conditions WHERE SourceTypeOrReferenceId = 13 AND SourceEntry IN (61863, 68663);
+INSERT INTO conditions (SourceTypeOrReferenceId, SourceEntry, ConditionTypeOrReference, ConditionValue1, Comment) VALUES
+(13, 61863, 18, 1, 'The Prophet Tharon''ja - Achievement Check'),
+(13, 68663, 18, 1, 'The Black Knight - Kill Credit'),
+(13, 58630, 18, 1, 'Mal''Ganis - Kill Credit');
diff --git a/sql/updates/world/2011_12_19_01_world_quest_template.sql b/sql/updates/world/2011_12_19_01_world_quest_template.sql
new file mode 100644
index 00000000000..c04fdddfe97
--- /dev/null
+++ b/sql/updates/world/2011_12_19_01_world_quest_template.sql
@@ -0,0 +1,2 @@
+-- Quest: Arcane Refreshment only available for mages
+UPDATE `quest_template` SET `RequiredClasses`=`RequiredClasses`|128 WHERE `Id`=7463;
diff --git a/sql/updates/world/2011_12_19_02_world_achievement_criteria_data.sql b/sql/updates/world/2011_12_19_02_world_achievement_criteria_data.sql
new file mode 100644
index 00000000000..f5df93c3bd1
--- /dev/null
+++ b/sql/updates/world/2011_12_19_02_world_achievement_criteria_data.sql
@@ -0,0 +1,11 @@
+-- Achievement Fa-la-la-la-Ogri'la
+DELETE FROM `achievement_criteria_data` WHERE `criteria_id` IN (3936,3937,3938);
+INSERT INTO `achievement_criteria_data` (`criteria_id`, `type`, `value1`, `value2`, `ScriptName`) VALUES
+-- requires aura
+(3936, 5, 44827, 0, ''),
+(3937, 5, 44825, 0, ''),
+(3938, 5, 44824, 0, ''),
+-- requires Holiday Winter Veil
+(3936, 16, 141, 0, ''),
+(3937, 16, 141, 0, ''),
+(3938, 16, 141, 0, ''); \ No newline at end of file
diff --git a/sql/updates/world/2011_12_24_00_world_sai.sql b/sql/updates/world/2011_12_24_00_world_sai.sql
new file mode 100644
index 00000000000..fb5816bb737
--- /dev/null
+++ b/sql/updates/world/2011_12_24_00_world_sai.sql
@@ -0,0 +1,10 @@
+-- Scriptname for the cages
+UPDATE `gameobject_template` SET `ScriptName`='go_veil_skith_cage' WHERE `entry` IN (185202,185203,185204,185205);
+
+-- Texts for Captive Child
+DELETE FROM `creature_text` WHERE `entry`=22314;
+INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`) VALUES
+(22314,0,0,"Woot!",12,0,100,0,0,0,"Captive Child"),
+(22314,0,1,"I think those weird bird guys were going to eat us. Gross!",12,0,100,0,0,0,"Captive Child"),
+(22314,0,2,"Yay! We're free!",12,0,100,0,0,0,"Captive Child"),
+(22314,0,3,"Gross!",12,0,100,0,0,0,"Captive Child"); \ No newline at end of file
diff --git a/sql/updates/world/2011_12_24_00_world_spell_proc_event.sql b/sql/updates/world/2011_12_24_00_world_spell_proc_event.sql
new file mode 100644
index 00000000000..f25fa4c4856
--- /dev/null
+++ b/sql/updates/world/2011_12_24_00_world_spell_proc_event.sql
@@ -0,0 +1 @@
+UPDATE `spell_proc_event` SET `SpellFamilyMask0` = 0 WHERE `entry` IN (5952,51679);
diff --git a/sql/updates/world/2011_12_24_01_world_mail_loot_template.sql b/sql/updates/world/2011_12_24_01_world_mail_loot_template.sql
new file mode 100644
index 00000000000..2fc05e9cf17
--- /dev/null
+++ b/sql/updates/world/2011_12_24_01_world_mail_loot_template.sql
@@ -0,0 +1,41 @@
+-- Reward from Treats for Greatfather Winter (horde)
+SET @mail:=102; -- Set in DBC
+UPDATE quest_template SET RewardMailTemplateId=@mail, RewardMailDelay=86400 WHERE Id IN (6962); -- Set mail delivery
+DELETE FROM mail_loot_template WHERE entry=@mail;
+INSERT INTO mail_loot_template (entry,item,ChanceOrQuestChance,lootmode,groupid,mincountOrRef,maxcount) VALUES
+(@mail,17685,100,1,0,1,1); -- Attach item to mail
+
+-- Reward from Treats for Greatfather Winter (alliance)
+SET @mail:=118; -- Set in DBC
+UPDATE quest_template SET RewardMailTemplateId=@mail, RewardMailDelay=86400 WHERE Id IN (7025); -- Set mail delivery
+DELETE FROM mail_loot_template WHERE entry=@mail;
+INSERT INTO mail_loot_template (entry,item,ChanceOrQuestChance,lootmode,groupid,mincountOrRef,maxcount) VALUES
+(@mail,17685,100,1,0,1,1); -- Attach item to mail
+
+-- Reward from Stolen Winter Veil Treats (horde)
+SET @mail:=108; -- Set in DBC
+UPDATE quest_template SET RewardMailTemplateId=@mail, RewardMailDelay=86400 WHERE Id IN (6963); -- Set mail delivery
+DELETE FROM mail_loot_template WHERE entry=@mail;
+INSERT INTO mail_loot_template (entry,item,ChanceOrQuestChance,lootmode,groupid,mincountOrRef,maxcount) VALUES
+(@mail,17712,100,1,0,1,1); -- Attach item to mail
+
+-- Reward from Stolen Winter Veil Treats (alliance)
+SET @mail:=117; -- Set in DBC
+UPDATE quest_template SET RewardMailTemplateId=@mail, RewardMailDelay=86400 WHERE Id IN (7042); -- Set mail delivery
+DELETE FROM mail_loot_template WHERE entry=@mail;
+INSERT INTO mail_loot_template (entry,item,ChanceOrQuestChance,lootmode,groupid,mincountOrRef,maxcount) VALUES
+(@mail,17712,100,1,0,1,1); -- Attach item to mail
+
+-- Reward from Metzen the Reindeer (horde)
+SET @mail:=122; -- Set in DBC
+UPDATE quest_template SET RewardMailTemplateId=@mail, RewardMailDelay=86400 WHERE Id IN (8746); -- Set mail delivery
+DELETE FROM mail_loot_template WHERE entry=@mail;
+INSERT INTO mail_loot_template (entry,item,ChanceOrQuestChance,lootmode,groupid,mincountOrRef,maxcount) VALUES
+(@mail,21216,100,1,0,1,1); -- Attach item to mail
+
+-- Reward from Metzen the Reindeer (alliance)
+SET @mail:=161; -- Set in DBC
+UPDATE quest_template SET RewardMailTemplateId=@mail, RewardMailDelay=86400 WHERE Id IN (8762); -- Set mail delivery
+DELETE FROM mail_loot_template WHERE entry=@mail;
+INSERT INTO mail_loot_template (entry,item,ChanceOrQuestChance,lootmode,groupid,mincountOrRef,maxcount) VALUES
+(@mail,21216,100,1,0,1,1); -- Attach item to mail
diff --git a/src/server/game/AI/CoreAI/GameObjectAI.h b/src/server/game/AI/CoreAI/GameObjectAI.h
index 8d0e0508113..93cd3a6d237 100644
--- a/src/server/game/AI/CoreAI/GameObjectAI.h
+++ b/src/server/game/AI/CoreAI/GameObjectAI.h
@@ -49,6 +49,7 @@ class GameObjectAI
virtual uint32 GetDialogStatus(Player* /*player*/) {return 100;}
virtual void Destroyed(Player* /*player*/, uint32 /*eventId*/) {}
virtual void SetData(uint32 /*id*/, uint32 /*value*/) {}
+ virtual void OnGameEvent(bool /*start*/, uint16 /*eventId*/) {}
};
class NullGameObjectAI : public GameObjectAI
diff --git a/src/server/game/AI/CoreAI/UnitAI.h b/src/server/game/AI/CoreAI/UnitAI.h
index 3c16fe493b4..444dce0339e 100755
--- a/src/server/game/AI/CoreAI/UnitAI.h
+++ b/src/server/game/AI/CoreAI/UnitAI.h
@@ -267,6 +267,7 @@ class UnitAI
virtual void sQuestComplete(Player* /*player*/, Quest const* /*quest*/) {}
virtual void sQuestReward(Player* /*player*/, Quest const* /*quest*/, uint32 /*opt*/) {}
virtual bool sOnDummyEffect(Unit* /*caster*/, uint32 /*spellId*/, SpellEffIndex /*effIndex*/) { return false; }
+ virtual void sOnGameEvent(bool /*start*/, uint16 /*eventId*/) {}
};
class PlayerAI : public UnitAI
diff --git a/src/server/game/AI/EventAI/CreatureEventAI.cpp b/src/server/game/AI/EventAI/CreatureEventAI.cpp
index be0dd8c3679..1db6bbd550e 100755
--- a/src/server/game/AI/EventAI/CreatureEventAI.cpp
+++ b/src/server/game/AI/EventAI/CreatureEventAI.cpp
@@ -840,7 +840,7 @@ void CreatureEventAI::ProcessAction(CreatureEventAI_Action const& action, uint32
me->Mount(action.mount.modelId);
}
else
- me->Unmount();
+ me->Dismount();
break;
}
diff --git a/src/server/game/AI/EventAI/CreatureEventAI.h b/src/server/game/AI/EventAI/CreatureEventAI.h
index 2fc26bcbd3e..9cc8c8f9c4a 100755
--- a/src/server/game/AI/EventAI/CreatureEventAI.h
+++ b/src/server/game/AI/EventAI/CreatureEventAI.h
@@ -108,7 +108,7 @@ enum EventAI_ActionType
ACTION_T_SET_SHEATH = 40, // Sheath (0-passive, 1-melee, 2-ranged)
ACTION_T_FORCE_DESPAWN = 41, // No Params
ACTION_T_SET_INVINCIBILITY_HP_LEVEL = 42, // MinHpValue, format(0-flat, 1-percent from max health)
- ACTION_T_MOUNT_TO_ENTRY_OR_MODEL = 43, // Creature_template entry(param1) OR ModelId (param2) (or 0 for both to unmount)
+ ACTION_T_MOUNT_TO_ENTRY_OR_MODEL = 43, // Creature_template entry(param1) OR ModelId (param2) (or 0 for both to dismount)
ACTION_T_SET_PHASE_MASK = 97,
ACTION_T_SET_STAND_STATE = 98,
diff --git a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp
index 06c1570ccd9..c5f04d4ff5f 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp
+++ b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp
@@ -543,7 +543,6 @@ bool npc_escortAI::GetWaypointPosition(uint32 pointId, float& x, float& y, float
if (waypoints.empty())
return false;
- ScriptPointVector::const_iterator itrEnd = waypoints.end();
for (ScriptPointVector::const_iterator itr = waypoints.begin(); itr != waypoints.end(); ++itr)
{
if (itr->uiPointId == pointId)
diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp
index afa7e9c2932..7dd793a302b 100644
--- a/src/server/game/AI/SmartScripts/SmartAI.cpp
+++ b/src/server/game/AI/SmartScripts/SmartAI.cpp
@@ -707,7 +707,7 @@ void SmartAI::SetRun(bool run)
me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
else
me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING);
- me->SendMovementFlagUpdate();
+
mRun = run;
}
@@ -811,6 +811,12 @@ void SmartAI::SetScript9(SmartScriptHolder& e, uint32 entry, Unit* invoker)
GetScript()->mLastInvoker = invoker->GetGUID();
GetScript()->SetScript9(e, entry);
}
+
+void SmartAI::sOnGameEvent(bool start, uint16 eventId)
+{
+ GetScript()->ProcessEventsFor(start ? SMART_EVENT_GAME_EVENT_START : SMART_EVENT_GAME_EVENT_END, NULL, eventId);
+}
+
/*
SMART_EVENT_UPDATE_OOC
SMART_EVENT_SPELLHIT
@@ -913,6 +919,11 @@ void SmartGameObjectAI::SetScript9(SmartScriptHolder& e, uint32 entry, Unit* inv
GetScript()->SetScript9(e, entry);
}
+void SmartGameObjectAI::OnGameEvent(bool start, uint16 eventId)
+{
+ GetScript()->ProcessEventsFor(start ? SMART_EVENT_GAME_EVENT_START : SMART_EVENT_GAME_EVENT_END, NULL, eventId);
+}
+
class SmartTrigger : public AreaTriggerScript
{
public:
diff --git a/src/server/game/AI/SmartScripts/SmartAI.h b/src/server/game/AI/SmartScripts/SmartAI.h
index 8bb3bda8dd6..dc1f901d477 100644
--- a/src/server/game/AI/SmartScripts/SmartAI.h
+++ b/src/server/game/AI/SmartScripts/SmartAI.h
@@ -183,6 +183,7 @@ class SmartAI : public CreatureAI
//void sQuestComplete(Player* player, Quest const* quest);
void sQuestReward(Player* player, Quest const* quest, uint32 opt);
bool sOnDummyEffect(Unit* caster, uint32 spellId, SpellEffIndex effIndex);
+ void sOnGameEvent(bool start, uint16 eventId);
uint32 mEscortQuestID;
@@ -249,6 +250,7 @@ public:
void Destroyed(Player* player, uint32 eventId);
void SetData(uint32 id, uint32 value);
void SetScript9(SmartScriptHolder& e, uint32 entry, Unit* invoker);
+ void OnGameEvent(bool start, uint16 eventId);
protected:
GameObject* const go;
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index c845f6110d6..34d465a5e7e 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -994,7 +994,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
(*itr)->ToUnit()->Mount(e.action.morphOrMount.model);
}
else
- (*itr)->ToUnit()->Unmount();
+ (*itr)->ToUnit()->Dismount();
}
delete targets;
@@ -1493,7 +1493,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
else if (GameObject* goTarget = (*itr)->ToGameObject())
{
if (IsSmartGO(goTarget))
- CAST_AI(SmartGameObjectAI, target->AI())->SetScript9(e, e.action.timedActionList.id, GetLastInvoker());
+ CAST_AI(SmartGameObjectAI, goTarget->AI())->SetScript9(e, e.action.timedActionList.id, GetLastInvoker());
}
}
@@ -1610,7 +1610,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
else if (GameObject* goTarget = (*itr)->ToGameObject())
{
if (IsSmartGO(goTarget))
- CAST_AI(SmartGameObjectAI, target->AI())->SetScript9(e, id, GetLastInvoker());
+ CAST_AI(SmartGameObjectAI, goTarget->AI())->SetScript9(e, id, GetLastInvoker());
}
}
@@ -1640,7 +1640,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
else if (GameObject* goTarget = (*itr)->ToGameObject())
{
if (IsSmartGO(goTarget))
- CAST_AI(SmartGameObjectAI, target->AI())->SetScript9(e, id, GetLastInvoker());
+ CAST_AI(SmartGameObjectAI, goTarget->AI())->SetScript9(e, id, GetLastInvoker());
}
}
@@ -2595,6 +2595,14 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui
ProcessAction(e, unit, var0, var1);
break;
}
+ case SMART_EVENT_GAME_EVENT_START:
+ case SMART_EVENT_GAME_EVENT_END:
+ {
+ if (e.event.gameEvent.gameEventId != var0)
+ return;
+ ProcessAction(e, NULL, var0);
+ break;
+ }
default:
sLog->outErrorDb("SmartScript::ProcessEvent: Unhandled Event type %u", e.GetEventType());
break;
@@ -2996,7 +3004,9 @@ void SmartScript::SetScript9(SmartScriptHolder& e, uint32 entry)
mResumeActionList = e.action.timedActionList.dontResume ? false : true;
InitTimer((*i));
}
-}Unit* SmartScript::GetLastInvoker()
+}
+
+Unit* SmartScript::GetLastInvoker()
{
return ObjectAccessor::FindUnit(mLastInvoker);
}
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
index 011ed75205d..1df5849ca75 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
@@ -26,6 +26,7 @@
#include "CellImpl.h"
#include "InstanceScript.h"
#include "ScriptedCreature.h"
+#include "GameEventMgr.h"
#include "SmartScriptMgr.h"
@@ -466,6 +467,14 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
if (!IsMinMaxValid(e, e.event.behindTarget.cooldownMin, e.event.behindTarget.cooldownMax))
return false;
break;
+ case SMART_EVENT_GAME_EVENT_START:
+ case SMART_EVENT_GAME_EVENT_END:
+ {
+ GameEventMgr::GameEventDataMap const& events = sGameEventMgr->GetEventMap();
+ if (e.event.gameEvent.gameEventId >= events.size() || !events[e.event.gameEvent.gameEventId].isValid())
+ return false;
+ break;
+ }
case SMART_EVENT_TIMED_EVENT_TRIGGERED:
case SMART_EVENT_INSTANCE_PLAYER_ENTER:
case SMART_EVENT_TRANSPORT_RELOCATE:
@@ -492,7 +501,6 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
case SMART_EVENT_WAYPOINT_RESUMED:
case SMART_EVENT_WAYPOINT_STOPPED:
case SMART_EVENT_WAYPOINT_ENDED:
- case SMART_ACTION_PLAYMOVIE:
case SMART_EVENT_GOSSIP_SELECT:
case SMART_EVENT_GOSSIP_HELLO:
case SMART_EVENT_JUST_CREATED:
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
index e80da52ccd3..e8ec80672fc 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
@@ -152,8 +152,10 @@ enum SMART_EVENT
SMART_EVENT_FOLLOW_COMPLETED = 65, //1 // none
SMART_EVENT_DUMMY_EFFECT = 66, //1 // spellId, effectIndex
SMART_EVENT_IS_BEHIND_TARGET = 67, //1 // cooldownMin, CooldownMax
+ SMART_EVENT_GAME_EVENT_START = 68, //1 // game_event.Entry
+ SMART_EVENT_GAME_EVENT_END = 69, //1 // game_event.Entry
- SMART_EVENT_END = 68,
+ SMART_EVENT_END = 70,
};
struct SmartEvent
@@ -338,6 +340,11 @@ struct SmartEvent
uint32 cooldownMax;
} behindTarget;
+ struct
+ {
+ uint32 gameEventId;
+ } gameEvent;
+
struct
{
uint32 param1;
@@ -401,7 +408,7 @@ enum SMART_ACTION
SMART_ACTION_SET_SHEATH = 40, // Sheath (0-unarmed, 1-melee, 2-ranged)
SMART_ACTION_FORCE_DESPAWN = 41, // timer
SMART_ACTION_SET_INVINCIBILITY_HP_LEVEL = 42, // MinHpValue(+pct, -flat)
- SMART_ACTION_MOUNT_TO_ENTRY_OR_MODEL = 43, // Creature_template entry(param1) OR ModelId (param2) (or 0 for both to unmount)
+ SMART_ACTION_MOUNT_TO_ENTRY_OR_MODEL = 43, // Creature_template entry(param1) OR ModelId (param2) (or 0 for both to dismount)
SMART_ACTION_SET_INGAME_PHASE_MASK = 44, // mask
SMART_ACTION_SET_DATA = 45, // Field, Data (only creature TODO)
@@ -1128,7 +1135,9 @@ const uint32 SmartAIEventMask[SMART_EVENT_END][2] =
{SMART_EVENT_GOSSIP_HELLO, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT },
{SMART_EVENT_FOLLOW_COMPLETED, SMART_SCRIPT_TYPE_MASK_CREATURE },
{SMART_EVENT_DUMMY_EFFECT, SMART_SCRIPT_TYPE_MASK_SPELL },
- {SMART_EVENT_IS_BEHIND_TARGET, SMART_SCRIPT_TYPE_MASK_CREATURE }
+ {SMART_EVENT_IS_BEHIND_TARGET, SMART_SCRIPT_TYPE_MASK_CREATURE },
+ {SMART_EVENT_GAME_EVENT_START, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT },
+ {SMART_EVENT_GAME_EVENT_END, SMART_SCRIPT_TYPE_MASK_CREATURE + SMART_SCRIPT_TYPE_MASK_GAMEOBJECT },
};
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index 8967446f199..d22f4b94caa 100755
--- a/src/server/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
@@ -102,6 +102,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria)
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST: // only Children's Week achievements
case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM: // only Children's Week achievements
case ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS:
+ case ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL:
break;
default:
if (dataType != ACHIEVEMENT_CRITERIA_DATA_TYPE_SCRIPT)
@@ -135,13 +136,13 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria)
}
if (classRace.class_id && ((1 << (classRace.class_id-1)) & CLASSMASK_ALL_PLAYABLE) == 0)
{
- sLog->outErrorDb("Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_CREATURE (%u) has non-existing class in value1 (%u), ignored.",
+ sLog->outErrorDb("Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_PLAYER_CLASS_RACE (%u) has non-existing class in value1 (%u), ignored.",
criteria->ID, criteria->requiredType, dataType, classRace.class_id);
return false;
}
if (classRace.race_id && ((1 << (classRace.race_id-1)) & RACEMASK_ALL_PLAYABLE) == 0)
{
- sLog->outErrorDb("Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_CREATURE (%u) has non-existing race in value2 (%u), ignored.",
+ sLog->outErrorDb("Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_PLAYER_CLASS_RACE (%u) has non-existing race in value2 (%u), ignored.",
criteria->ID, criteria->requiredType, dataType, classRace.race_id);
return false;
}
@@ -450,7 +451,7 @@ void AchievementMgr::ResetAchievementCriteria(AchievementCriteriaTypes type, uin
continue;
// don't update already completed criteria if not forced or achievement already complete
- if ((IsCompletedCriteria(achievementCriteria, achievement) && !evenIfCriteriaComplete) || HasAchieved(achievement))
+ if ((IsCompletedCriteria(achievementCriteria, achievement) && !evenIfCriteriaComplete) || HasAchieved(achievement->ID))
continue;
for (uint8 j = 0; j < MAX_CRITERIA_REQUIREMENTS; ++j)
@@ -846,6 +847,9 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
break;
}
case ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL:
+ if (AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria))
+ if (!data->Meets(GetPlayer(), unit))
+ continue;
SetCriteriaProgress(achievementCriteria, GetPlayer()->getLevel());
break;
case ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL:
@@ -1065,14 +1069,9 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
continue;
}
- if (achievement->ID == 1282)
- {
- // those requirements couldn't be found in the dbc
- AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
- if (!data || !data->Meets(GetPlayer(), unit))
+ if (AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria))
+ if (!data->Meets(GetPlayer(), unit))
continue;
- break;
- }
SetCriteriaProgress(achievementCriteria, 1);
break;
@@ -1597,9 +1596,6 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
}
}
-static const uint32 achievIdByClass[MAX_CLASSES] = { 0, 459, 465, 462, 458, 464, 461, 467, 460, 463, 0, 466 };
-static const uint32 achievIdByRace[MAX_RACES] = { 0, 1408, 1410, 1407, 1409, 1413, 1411, 1404, 1412, 0, 1405, 1406 };
-
bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achievementCriteria, AchievementEntry const* achievement)
{
// counter can never complete
@@ -1624,20 +1620,7 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve
case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
return progress->counter >= achievementCriteria->kill_creature.creatureCount;
case ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL:
- {
- // skip wrong class achievements
- for (int i = 1; i < MAX_CLASSES; ++i)
- if (achievIdByClass[i] == achievement->ID && i != GetPlayer()->getClass())
- return false;
-
- // skip wrong race achievements
- for (int i = 1; i < MAX_RACES; ++i)
- if (achievIdByRace[i] == achievement->ID && i != GetPlayer()->getRace())
- return false;
-
- // appropriate class/race or not class/race specific
return progress->counter >= achievementCriteria->reach_level.level;
- }
case ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL:
return progress->counter >= achievementCriteria->reach_skill_level.skillLevel;
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT:
@@ -1778,7 +1761,7 @@ void AchievementMgr::CompletedCriteriaFor(AchievementEntry const* achievement)
return;
// already completed and stored
- if (HasAchieved(achievement))
+ if (HasAchieved(achievement->ID))
return;
if (IsCompletedAchievement(achievement))
@@ -2012,7 +1995,7 @@ void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement)
if (m_player->isGameMaster())
return;
- if (achievement->flags & ACHIEVEMENT_FLAG_COUNTER || HasAchieved(achievement))
+ if (achievement->flags & ACHIEVEMENT_FLAG_COUNTER || HasAchieved(achievement->ID))
return;
SendAchievementEarned(achievement);
@@ -2127,9 +2110,9 @@ void AchievementMgr::BuildAllDataPacket(WorldPacket* data) const
*data << int32(-1);
}
-bool AchievementMgr::HasAchieved(AchievementEntry const* achievement) const
+bool AchievementMgr::HasAchieved(uint32 achievementId) const
{
- return m_completedAchievements.find(achievement->ID) != m_completedAchievements.end();
+ return m_completedAchievements.find(achievementId) != m_completedAchievements.end();
}
bool AchievementMgr::CanUpdateCriteria(AchievementCriteriaEntry const* criteria, AchievementEntry const* achievement)
@@ -2393,15 +2376,16 @@ void AchievementGlobalMgr::LoadCompletedAchievements()
Field* fields = result->Fetch();
uint32 achievement_id = fields[0].GetUInt32();
- if (!sAchievementStore.LookupEntry(achievement_id))
+ const AchievementEntry* achievement = sAchievementStore.LookupEntry(achievement_id);
+ if (!achievement)
{
// we will remove not existed achievement for all characters
sLog->outError("Non-existing achievement %u data removed from table `character_achievement`.", achievement_id);
CharacterDatabase.PExecute("DELETE FROM character_achievement WHERE achievement = %u", achievement_id);
continue;
}
-
- m_allCompletedAchievements.insert(achievement_id);
+ else if (achievement->flags & (ACHIEVEMENT_FLAG_REALM_FIRST_REACH | ACHIEVEMENT_FLAG_REALM_FIRST_KILL))
+ m_allCompletedAchievements.insert(achievement_id);
} while (result->NextRow());
sLog->outString(">> Loaded %lu completed achievements in %u ms", (unsigned long)m_allCompletedAchievements.size(), GetMSTimeDiffToNow(oldMSTime));
diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h
index 7f66565622f..f88be974c9d 100755
--- a/src/server/game/Achievements/AchievementMgr.h
+++ b/src/server/game/Achievements/AchievementMgr.h
@@ -257,7 +257,7 @@ class AchievementMgr
void CheckAllAchievementCriteria();
void SendAllAchievementData() const;
void SendRespondInspectAchievements(Player* player) const;
- bool HasAchieved(AchievementEntry const* achievement) const;
+ bool HasAchieved(uint32 achievementId) const;
Player* GetPlayer() const { return m_player; }
void UpdateTimedAchievements(uint32 timeDiff);
void StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost = 0);
diff --git a/src/server/game/Chat/Channels/Channel.cpp b/src/server/game/Chat/Channels/Channel.cpp
index 1968de70f46..244c05ec0ad 100755
--- a/src/server/game/Chat/Channels/Channel.cpp
+++ b/src/server/game/Chat/Channels/Channel.cpp
@@ -310,18 +310,22 @@ void Channel::KickOrBan(uint64 good, const char *badname, bool ban)
bool changeowner = (m_ownerGUID == bad->GetGUID());
WorldPacket data;
+ bool notify = !(AccountMgr::IsGMAccount(sec) && sWorld->getBoolConfig(CONFIG_SILENTLY_GM_JOIN_TO_CHANNEL));
if (ban && !IsBanned(bad->GetGUID()))
{
banned.insert(bad->GetGUID());
- MakePlayerBanned(&data, bad->GetGUID(), good);
-
UpdateChannelInDB();
+
+ if (notify)
+ MakePlayerBanned(&data, bad->GetGUID(), good);
}
- else
+ else if (notify)
MakePlayerKicked(&data, bad->GetGUID(), good);
- SendToAll(&data);
+ if (notify)
+ SendToAll(&data);
+
players.erase(bad->GetGUID());
bad->LeftChannel(this);
diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp
index be43862eaea..185ac487481 100755
--- a/src/server/game/Chat/Chat.cpp
+++ b/src/server/game/Chat/Chat.cpp
@@ -303,29 +303,29 @@ ChatCommand* ChatHandler::getCommandTable()
static ChatCommand ticketResponseCommandTable[] =
{
- { "append", SEC_MODERATOR, false, OldHandler<&ChatHandler::HandleGMTicketResponseAppendCommand>, "", NULL },
- { "appendln", SEC_MODERATOR, false, OldHandler<&ChatHandler::HandleGMTicketResponseAppendLnCommand>, "", NULL },
+ { "append", SEC_MODERATOR, true, OldHandler<&ChatHandler::HandleGMTicketResponseAppendCommand>, "", NULL },
+ { "appendln", SEC_MODERATOR, true, OldHandler<&ChatHandler::HandleGMTicketResponseAppendLnCommand>, "", NULL },
{ NULL, 0, false, NULL, "", NULL }
};
static ChatCommand ticketCommandTable[] =
{
- { "list", SEC_MODERATOR, false, OldHandler<&ChatHandler::HandleGMTicketListCommand>, "", NULL },
- { "onlinelist", SEC_MODERATOR, false, OldHandler<&ChatHandler::HandleGMTicketListOnlineCommand>, "", NULL },
- { "viewname", SEC_MODERATOR, false, OldHandler<&ChatHandler::HandleGMTicketGetByNameCommand>, "", NULL },
- { "viewid", SEC_MODERATOR, false, OldHandler<&ChatHandler::HandleGMTicketGetByIdCommand>, "", NULL },
- { "close", SEC_MODERATOR, false, OldHandler<&ChatHandler::HandleGMTicketCloseByIdCommand>, "", NULL },
- { "closedlist", SEC_MODERATOR, false, OldHandler<&ChatHandler::HandleGMTicketListClosedCommand>, "", NULL },
- { "escalatedlist", SEC_GAMEMASTER, false, OldHandler<&ChatHandler::HandleGMTicketListEscalatedCommand>, "", NULL },
- { "delete", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleGMTicketDeleteByIdCommand>, "", NULL },
- { "reset", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleGMTicketResetCommand>, "", NULL },
- { "assign", SEC_GAMEMASTER, false, OldHandler<&ChatHandler::HandleGMTicketAssignToCommand>, "", NULL },
- { "unassign", SEC_GAMEMASTER, false, OldHandler<&ChatHandler::HandleGMTicketUnAssignCommand>, "", NULL },
- { "comment", SEC_MODERATOR, false, OldHandler<&ChatHandler::HandleGMTicketCommentCommand>, "", NULL },
- { "togglesystem", SEC_ADMINISTRATOR, false, OldHandler<&ChatHandler::HandleToggleGMTicketSystem>, "", NULL },
- { "escalate", SEC_MODERATOR, false, OldHandler<&ChatHandler::HandleGMTicketEscalateCommand>, "", NULL },
- { "response", SEC_MODERATOR, false, NULL, "", ticketResponseCommandTable },
- { "complete", SEC_MODERATOR, false, OldHandler<&ChatHandler::HandleGMTicketCompleteCommand>, "", NULL },
+ { "list", SEC_MODERATOR, true, OldHandler<&ChatHandler::HandleGMTicketListCommand>, "", NULL },
+ { "onlinelist", SEC_MODERATOR, true, OldHandler<&ChatHandler::HandleGMTicketListOnlineCommand>, "", NULL },
+ { "viewname", SEC_MODERATOR, true, OldHandler<&ChatHandler::HandleGMTicketGetByNameCommand>, "", NULL },
+ { "viewid", SEC_MODERATOR, true, OldHandler<&ChatHandler::HandleGMTicketGetByIdCommand>, "", NULL },
+ { "close", SEC_MODERATOR, true, OldHandler<&ChatHandler::HandleGMTicketCloseByIdCommand>, "", NULL },
+ { "closedlist", SEC_MODERATOR, true, OldHandler<&ChatHandler::HandleGMTicketListClosedCommand>, "", NULL },
+ { "escalatedlist", SEC_GAMEMASTER, true, OldHandler<&ChatHandler::HandleGMTicketListEscalatedCommand>, "", NULL },
+ { "delete", SEC_ADMINISTRATOR, true, OldHandler<&ChatHandler::HandleGMTicketDeleteByIdCommand>, "", NULL },
+ { "reset", SEC_ADMINISTRATOR, true, OldHandler<&ChatHandler::HandleGMTicketResetCommand>, "", NULL },
+ { "assign", SEC_GAMEMASTER, true, OldHandler<&ChatHandler::HandleGMTicketAssignToCommand>, "", NULL },
+ { "unassign", SEC_GAMEMASTER, true, OldHandler<&ChatHandler::HandleGMTicketUnAssignCommand>, "", NULL },
+ { "comment", SEC_MODERATOR, true, OldHandler<&ChatHandler::HandleGMTicketCommentCommand>, "", NULL },
+ { "togglesystem", SEC_ADMINISTRATOR, true, OldHandler<&ChatHandler::HandleToggleGMTicketSystem>, "", NULL },
+ { "escalate", SEC_MODERATOR, true, OldHandler<&ChatHandler::HandleGMTicketEscalateCommand>, "", NULL },
+ { "response", SEC_MODERATOR, true, NULL, "", ticketResponseCommandTable },
+ { "complete", SEC_MODERATOR, true, OldHandler<&ChatHandler::HandleGMTicketCompleteCommand>, "", NULL },
{ NULL, 0, false, NULL, "", NULL }
};
diff --git a/src/server/game/Chat/Commands/Level0.cpp b/src/server/game/Chat/Commands/Level0.cpp
index 338ad49463e..7ff7a82bf58 100755
--- a/src/server/game/Chat/Commands/Level0.cpp
+++ b/src/server/game/Chat/Commands/Level0.cpp
@@ -84,8 +84,8 @@ bool ChatHandler::HandleStartCommand(const char* /*args*/)
bool ChatHandler::HandleServerInfoCommand(const char* /*args*/)
{
- uint32 PlayersNum = sWorld->GetPlayerCount();
- uint32 MaxPlayersNum = sWorld->GetMaxPlayerCount();
+ uint32 playersNum = sWorld->GetPlayerCount();
+ uint32 maxPlayersNum = sWorld->GetMaxPlayerCount();
uint32 activeClientsNum = sWorld->GetActiveSessionCount();
uint32 queuedClientsNum = sWorld->GetQueuedSessionCount();
uint32 maxActiveClientsNum = sWorld->GetMaxActiveSessionCount();
@@ -94,10 +94,13 @@ bool ChatHandler::HandleServerInfoCommand(const char* /*args*/)
uint32 updateTime = sWorld->GetUpdateTime();
SendSysMessage(_FULLVERSION);
- PSendSysMessage(LANG_CONNECTED_PLAYERS, PlayersNum, MaxPlayersNum);
+ PSendSysMessage(LANG_CONNECTED_PLAYERS, playersNum, maxPlayersNum);
PSendSysMessage(LANG_CONNECTED_USERS, activeClientsNum, maxActiveClientsNum, queuedClientsNum, maxQueuedClientsNum);
PSendSysMessage(LANG_UPTIME, uptime.c_str());
- PSendSysMessage("Update time diff: %u.", updateTime);
+ PSendSysMessage(LANG_UPDATE_DIFF, updateTime);
+ //! Can't use sWorld->ShutdownMsg here in case of console command
+ if (sWorld->IsShuttingDown())
+ PSendSysMessage(LANG_SHUTDOWN_TIMELEFT, secsToTimeString(sWorld->GetShutDownTimeLeft()).c_str());
return true;
}
@@ -119,7 +122,7 @@ bool ChatHandler::HandleDismountCommand(const char* /*args*/)
return false;
}
- m_session->GetPlayer()->Unmount();
+ m_session->GetPlayer()->Dismount();
m_session->GetPlayer()->RemoveAurasByType(SPELL_AURA_MOUNTED);
return true;
}
diff --git a/src/server/game/Chat/Commands/TicketCommands.cpp b/src/server/game/Chat/Commands/TicketCommands.cpp
index 7caf63aac2b..d38da9eb97c 100755
--- a/src/server/game/Chat/Commands/TicketCommands.cpp
+++ b/src/server/game/Chat/Commands/TicketCommands.cpp
@@ -85,12 +85,14 @@ bool ChatHandler::HandleGMTicketGetByNameCommand(const char* args)
guid = player->GetGUID();
else
guid = sObjectMgr->GetPlayerGUIDByName(name);
+
// Target must exist
if (!guid)
{
SendSysMessage(LANG_NO_PLAYERS_FOUND);
return true;
}
+
// Ticket must exist
GmTicket *ticket = sTicketMgr->GetTicketByPlayer(guid);
if (!ticket)
@@ -119,27 +121,32 @@ bool ChatHandler::HandleGMTicketCloseByIdCommand(const char* args)
SendSysMessage(LANG_COMMAND_TICKETNOTEXIST);
return true;
}
- // Ticket must be assigned to player, who tries to close it.
- uint64 guid = m_session->GetPlayer()->GetGUID();
- if (ticket->IsAssignedNotTo(guid))
+
+ // Ticket should be assigned to the player who tries to close it.
+ // Console can override though
+ Player* player = m_session ? m_session->GetPlayer() : NULL;
+ if (player && ticket->IsAssignedNotTo(player->GetGUID()))
{
PSendSysMessage(LANG_COMMAND_TICKETCANNOTCLOSE, ticket->GetId());
return true;
}
- sTicketMgr->CloseTicket(ticket->GetId(), guid);
+
+ sTicketMgr->CloseTicket(ticket->GetId(), player ? player->GetGUID() : -1);
sTicketMgr->UpdateLastChange();
- std::string msg = ticket->FormatMessageString(*this, m_session->GetPlayer()->GetName(), NULL, NULL, NULL);
+ std::string msg = ticket->FormatMessageString(*this, player ? player->GetName() : "Console", NULL, NULL, NULL);
SendGlobalGMSysMessage(msg.c_str());
// Inform player, who submitted this ticket, that it is closed
- if (Player* player = ticket->GetPlayer())
- if (player->IsInWorld())
+ if (Player* submitter = ticket->GetPlayer())
+ {
+ if (submitter->IsInWorld())
{
WorldPacket data(SMSG_GMTICKET_DELETETICKET, 4);
data << uint32(GMTICKET_RESPONSE_TICKET_DELETED);
- player->GetSession()->SendPacket(&data);
+ submitter->GetSession()->SendPacket(&data);
}
+ }
return true;
}
@@ -170,25 +177,30 @@ bool ChatHandler::HandleGMTicketAssignToCommand(const char* args)
uint64 targetGuid = sObjectMgr->GetPlayerGUIDByName(target.c_str());
uint64 targetAccId = sObjectMgr->GetPlayerAccountIdByGUID(targetGuid);
uint32 targetGmLevel = AccountMgr::GetSecurity(targetAccId, realmID);
+
// Target must exist and have administrative rights
if (!targetGuid || AccountMgr::IsPlayerAccount(targetGmLevel))
{
SendSysMessage(LANG_COMMAND_TICKETASSIGNERROR_A);
return true;
}
+
// If already assigned, leave
if (ticket->IsAssignedTo(targetGuid))
{
PSendSysMessage(LANG_COMMAND_TICKETASSIGNERROR_B, ticket->GetId());
return true;
}
+
// If assigned to different player other than current, leave
- Player* player = m_session->GetPlayer();
- if (ticket->IsAssignedNotTo(player->GetGUID()))
+ //! Console can override though
+ Player* player = m_session ? m_session->GetPlayer() : NULL;
+ if (player && ticket->IsAssignedNotTo(player->GetGUID()))
{
PSendSysMessage(LANG_COMMAND_TICKETALREADYASSIGNED, ticket->GetId(), target.c_str());
return true;
}
+
// Assign ticket
SQLTransaction trans = SQLTransaction(NULL);
ticket->SetAssignedTo(targetGuid, AccountMgr::IsAdminAccount(targetGmLevel));
@@ -218,6 +230,7 @@ bool ChatHandler::HandleGMTicketUnAssignCommand(const char* args)
PSendSysMessage(LANG_COMMAND_TICKETNOTASSIGNED, ticket->GetId());
return true;
}
+
// Get security level of player, whom this ticket is assigned to
uint32 security = SEC_PLAYER;
Player* assignedPlayer = ticket->GetAssignedPlayer();
@@ -229,9 +242,11 @@ bool ChatHandler::HandleGMTicketUnAssignCommand(const char* args)
uint32 accountId = sObjectMgr->GetPlayerAccountIdByGUID(guid);
security = AccountMgr::GetSecurity(accountId, realmID);
}
+
// Check security
- Player* player = m_session->GetPlayer();
- if (security > uint32(player->GetSession()->GetSecurity()))
+ //! If no m_session present it means we're issuing this command from the console
+ uint32 mySecurity = m_session ? m_session->GetSecurity() : SEC_CONSOLE;
+ if (security > mySecurity)
{
SendSysMessage(LANG_COMMAND_TICKETUNASSIGNSECURITY);
return true;
@@ -242,7 +257,8 @@ bool ChatHandler::HandleGMTicketUnAssignCommand(const char* args)
ticket->SaveToDB(trans);
sTicketMgr->UpdateLastChange();
- std::string msg = ticket->FormatMessageString(*this, NULL, ticket->GetAssignedToName().c_str(), player->GetName(), NULL);
+ std::string msg = ticket->FormatMessageString(*this, NULL, ticket->GetAssignedToName().c_str(),
+ m_session ? m_session->GetPlayer()->GetName() : "Console", NULL);
SendGlobalGMSysMessage(msg.c_str());
return true;
}
@@ -265,9 +281,11 @@ bool ChatHandler::HandleGMTicketCommentCommand(const char* args)
PSendSysMessage(LANG_COMMAND_TICKETNOTEXIST);
return true;
}
+
// Cannot comment ticket assigned to someone else
- Player* player = m_session->GetPlayer();
- if (ticket->IsAssignedNotTo(player->GetGUID()))
+ //! Console excluded
+ Player* player = m_session ? m_session->GetPlayer() : NULL;
+ if (player && ticket->IsAssignedNotTo(player->GetGUID()))
{
PSendSysMessage(LANG_COMMAND_TICKETALREADYASSIGNED, ticket->GetId());
return true;
@@ -279,7 +297,7 @@ bool ChatHandler::HandleGMTicketCommentCommand(const char* args)
sTicketMgr->UpdateLastChange();
std::string msg = ticket->FormatMessageString(*this, NULL, ticket->GetAssignedToName().c_str(), NULL, NULL);
- msg += PGetParseString(LANG_COMMAND_TICKETLISTADDCOMMENT, player->GetName(), comment);
+ msg += PGetParseString(LANG_COMMAND_TICKETLISTADDCOMMENT, player ? player->GetName() : "Console", comment);
SendGlobalGMSysMessage(msg.c_str());
return true;
@@ -297,19 +315,21 @@ bool ChatHandler::HandleGMTicketDeleteByIdCommand(const char* args)
SendSysMessage(LANG_COMMAND_TICKETNOTEXIST);
return true;
}
+
if (!ticket->IsClosed())
{
SendSysMessage(LANG_COMMAND_TICKETCLOSEFIRST);
return true;
}
- std::string msg = ticket->FormatMessageString(*this, NULL, NULL, NULL, m_session->GetPlayer()->GetName());
+ std::string msg = ticket->FormatMessageString(*this, NULL, NULL, NULL, m_session ? m_session->GetPlayer()->GetName() : "Console");
SendGlobalGMSysMessage(msg.c_str());
sTicketMgr->RemoveTicket(ticket->GetId());
sTicketMgr->UpdateLastChange();
if (Player* player = ticket->GetPlayer())
+ {
if (player->IsInWorld())
{
// Force abandon ticket
@@ -317,6 +337,7 @@ bool ChatHandler::HandleGMTicketDeleteByIdCommand(const char* args)
data << uint32(GMTICKET_RESPONSE_TICKET_DELETED);
player->GetSession()->SendPacket(&data);
}
+ }
return true;
}
@@ -406,9 +427,11 @@ inline bool ChatHandler::_HandleGMTicketResponseAppendCommand(const char* args,
PSendSysMessage(LANG_COMMAND_TICKETNOTEXIST);
return true;
}
+
// Cannot add response to ticket, assigned to someone else
- Player* player = m_session->GetPlayer();
- if (ticket->IsAssignedNotTo(player->GetGUID()))
+ //! Console excluded
+ Player* player = m_session ? m_session->GetPlayer() : NULL;
+ if (player && ticket->IsAssignedNotTo(player->GetGUID()))
{
PSendSysMessage(LANG_COMMAND_TICKETALREADYASSIGNED, ticket->GetId());
return true;
diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp
index bfefb3e4e76..cf349044042 100755
--- a/src/server/game/Conditions/ConditionMgr.cpp
+++ b/src/server/game/Conditions/ConditionMgr.cpp
@@ -67,11 +67,8 @@ bool Condition::Meets(Player* player, Unit* invoker)
break;
}
case CONDITION_ACHIEVEMENT:
- {
- AchievementEntry const* achievement = GetAchievementStore()->LookupEntry(mConditionValue1);
- condMeets = player->GetAchievementMgr().HasAchieved(achievement);
+ condMeets = player->GetAchievementMgr().HasAchieved(mConditionValue1);
break;
- }
case CONDITION_TEAM:
condMeets = player->GetTeam() == mConditionValue1;
break;
diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h
index dcdc2b2ea0a..78324f8fae2 100755
--- a/src/server/game/DataStores/DBCEnums.h
+++ b/src/server/game/DataStores/DBCEnums.h
@@ -74,14 +74,14 @@ enum AchievementFlags
enum AchievementCriteriaCondition
{
- ACHIEVEMENT_CRITERIA_CONDITION_NONE = 0,
- ACHIEVEMENT_CRITERIA_CONDITION_NO_DEATH = 1, // reset progress on death
- ACHIEVEMENT_CRITERIA_CONDITION_UNK1 = 2, // only used in "Complete a daily quest every day for five consecutive days"
- ACHIEVEMENT_CRITERIA_CONDITION_BG_MAP = 3, // requires you to be on specific map, reset at change
- ACHIEVEMENT_CRITERIA_CONDITION_NO_LOSE = 4, // only used in "Win 10 arenas without losing"
- ACHIEVEMENT_CRITERIA_CONDITION_UNK2 = 9, // unk
- ACHIEVEMENT_CRITERIA_CONDITION_NOT_IN_GROUP = 10, // requires the player not to be in group
- ACHIEVEMENT_CRITERIA_CONDITION_UNK3 = 13, // unk
+ ACHIEVEMENT_CRITERIA_CONDITION_NONE = 0,
+ ACHIEVEMENT_CRITERIA_CONDITION_NO_DEATH = 1, // reset progress on death
+ ACHIEVEMENT_CRITERIA_CONDITION_UNK1 = 2, // only used in "Complete a daily quest every day for five consecutive days"
+ ACHIEVEMENT_CRITERIA_CONDITION_BG_MAP = 3, // requires you to be on specific map, reset at change
+ ACHIEVEMENT_CRITERIA_CONDITION_NO_LOSE = 4, // only used in "Win 10 arenas without losing"
+ ACHIEVEMENT_CRITERIA_CONDITION_NO_SPELL_HIT = 9, // requires the player not to be hit by specific spell
+ ACHIEVEMENT_CRITERIA_CONDITION_NOT_IN_GROUP = 10, // requires the player not to be in group
+ ACHIEVEMENT_CRITERIA_CONDITION_UNK3 = 13, // unk
};
enum AchievementCriteriaFlags
@@ -97,7 +97,7 @@ enum AchievementCriteriaFlags
enum AchievementCriteriaTimedTypes
{
ACHIEVEMENT_TIMED_TYPE_EVENT = 1, // Timer is started by internal event with id in timerStartEvent
- ACHIEVEMENT_TIMED_TYPE_QUEST = 2, // Timer is started by acceting quest with entry in timerStartEvent
+ ACHIEVEMENT_TIMED_TYPE_QUEST = 2, // Timer is started by accepting quest with entry in timerStartEvent
ACHIEVEMENT_TIMED_TYPE_SPELL_CASTER = 5, // Timer is started by casting a spell with entry in timerStartEvent
ACHIEVEMENT_TIMED_TYPE_SPELL_TARGET = 6, // Timer is started by being target of spell with entry in timerStartEvent
ACHIEVEMENT_TIMED_TYPE_CREATURE = 7, // Timer is started by killing creature with entry in timerStartEvent
@@ -417,7 +417,7 @@ enum SummonPropFlags
enum VehicleSeatFlags
{
VEHICLE_SEAT_FLAG_HIDE_PASSENGER = 0x00000200, // Passenger is hidden
- VEHICLE_SEAT_FLAG_UNK11 = 0x00000400, // needed for CGCamera__SyncFreeLookFacing
+ VEHICLE_SEAT_FLAG_UNK1 = 0x00000400, // needed for CGCamera__SyncFreeLookFacing
VEHICLE_SEAT_FLAG_CAN_CONTROL = 0x00000800, // Lua_UnitInVehicleControlSeat
VEHICLE_SEAT_FLAG_CAN_CAST_MOUNT_SPELL = 0x00001000, // Can cast spells with SPELL_AURA_MOUNTED from seat (possibly 4.x only, 0 seats on 3.3.5a)
VEHICLE_SEAT_FLAG_UNCONTROLLED = 0x00002000, // can override !& VEHICLE_SEAT_FLAG_CAN_ENTER_OR_EXIT
@@ -425,6 +425,7 @@ enum VehicleSeatFlags
VEHICLE_SEAT_FLAG_CAN_ENTER_OR_EXIT = 0x02000000, // Lua_CanExitVehicle - can enter and exit at free will
VEHICLE_SEAT_FLAG_CAN_SWITCH = 0x04000000, // Lua_CanSwitchVehicleSeats
VEHICLE_SEAT_FLAG_CAN_CAST = 0x20000000, // Lua_UnitHasVehicleUI
+ VEHICLE_SEAT_FLAG_UNK2 = 0x40000000, // checked in conjunction with 0x800 in CastSpell2
};
enum VehicleSeatFlagsB
@@ -435,7 +436,7 @@ enum VehicleSeatFlagsB
VEHICLE_SEAT_FLAG_B_EJECTABLE = 0x00000020, // ejectable
VEHICLE_SEAT_FLAG_B_USABLE_FORCED_2 = 0x00000040,
VEHICLE_SEAT_FLAG_B_USABLE_FORCED_3 = 0x00000100,
- VEHICLE_SEAT_FLAG_B_CANSWITCH = 0x04000000, // can switch seats
+ VEHICLE_SEAT_FLAG_B_USABLE_FORCED_4 = 0x02000000,
VEHICLE_SEAT_FLAG_B_VEHICLE_PLAYERFRAME_UI = 0x80000000, // Lua_UnitHasVehiclePlayerFrameUI - actually checked for flagsb &~ 0x80000000
};
diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h
index ba7be495c77..5a4dea3a020 100755
--- a/src/server/game/DataStores/DBCStructure.h
+++ b/src/server/game/DataStores/DBCStructure.h
@@ -1939,9 +1939,10 @@ struct VehicleSeatEntry
// 46-57 added in 3.1, floats mostly
bool CanEnterOrExit() const { return m_flags & VEHICLE_SEAT_FLAG_CAN_ENTER_OR_EXIT; }
- bool CanSwitchFromSeat() const { return m_flags & VEHICLE_SEAT_FLAG_B_CANSWITCH; }
+ bool CanSwitchFromSeat() const { return m_flags & VEHICLE_SEAT_FLAG_CAN_SWITCH; }
bool IsUsableByOverride() const { return (m_flags & VEHICLE_SEAT_FLAG_UNCONTROLLED)
- || (m_flagsB & (VEHICLE_SEAT_FLAG_B_USABLE_FORCED | VEHICLE_SEAT_FLAG_B_USABLE_FORCED_2 | VEHICLE_SEAT_FLAG_B_USABLE_FORCED_3)); }
+ || (m_flagsB & (VEHICLE_SEAT_FLAG_B_USABLE_FORCED | VEHICLE_SEAT_FLAG_B_USABLE_FORCED_2 |
+ VEHICLE_SEAT_FLAG_B_USABLE_FORCED_3 | VEHICLE_SEAT_FLAG_B_USABLE_FORCED_4)); }
bool IsEjectable() const { return m_flagsB & VEHICLE_SEAT_FLAG_B_EJECTABLE; }
};
diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp
index 55f798204db..21ff3c6e4e8 100755
--- a/src/server/game/DungeonFinding/LFGMgr.cpp
+++ b/src/server/game/DungeonFinding/LFGMgr.cpp
@@ -389,7 +389,7 @@ void LFGMgr::InitializeLockedDungeons(Player* player)
locktype = LFG_LOCKSTATUS_TOO_HIGH_LEVEL;
else if (locktype == LFG_LOCKSTATUS_OK && ar)
{
- if (ar->achievement && !player->GetAchievementMgr().HasAchieved(sAchievementStore.LookupEntry(ar->achievement)))
+ if (ar->achievement && !player->GetAchievementMgr().HasAchieved(ar->achievement))
locktype = LFG_LOCKSTATUS_RAID_LOCKED; // FIXME: Check the correct lock value
else if (player->GetTeam() == ALLIANCE && ar->quest_A && !player->GetQuestRewardStatus(ar->quest_A))
locktype = LFG_LOCKSTATUS_QUEST_NOT_COMPLETED;
diff --git a/src/server/game/Entities/Corpse/Corpse.cpp b/src/server/game/Entities/Corpse/Corpse.cpp
index 31cc21659c9..cd05cba7475 100755
--- a/src/server/game/Entities/Corpse/Corpse.cpp
+++ b/src/server/game/Entities/Corpse/Corpse.cpp
@@ -26,7 +26,7 @@
#include "GossipDef.h"
#include "World.h"
-Corpse::Corpse(CorpseType type) : WorldObject()
+Corpse::Corpse(CorpseType type) : WorldObject(type != CORPSE_BONES)
, m_type(type)
{
m_objectType |= TYPEMASK_CORPSE;
@@ -39,9 +39,6 @@ Corpse::Corpse(CorpseType type) : WorldObject()
m_time = time(NULL);
lootForBody = false;
-
- if (type != CORPSE_BONES)
- m_isWorldObject = true;
}
Corpse::~Corpse()
@@ -162,20 +159,11 @@ void Corpse::DeleteFromDB(SQLTransaction& trans)
trans->Append(stmt);
}
-bool Corpse::LoadFromDB(uint32 guid, Field* fields)
+bool Corpse::LoadCorpseFromDB(uint32 guid, Field* fields)
{
uint32 ownerGuid = fields[17].GetUInt32();
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
// SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, guildId, flags, dynFlags, time, corpseType, instanceId, phaseMask, corpseGuid, guid FROM corpse WHERE corpseType <> 0
- m_type = CorpseType(fields[13].GetUInt8());
- if (m_type >= MAX_CORPSE_TYPE)
- {
- sLog->outError("Corpse (guid: %u, owner: %u) have wrong corpse type (%u), not loading.", guid, ownerGuid, m_type);
- return false;
- }
- if (m_type != CORPSE_BONES)
- m_isWorldObject = true;
-
float posX = fields[0].GetFloat();
float posY = fields[1].GetFloat();
float posZ = fields[2].GetFloat();
diff --git a/src/server/game/Entities/Corpse/Corpse.h b/src/server/game/Entities/Corpse/Corpse.h
index 2e45606b88f..a704e2243eb 100755
--- a/src/server/game/Entities/Corpse/Corpse.h
+++ b/src/server/game/Entities/Corpse/Corpse.h
@@ -59,7 +59,7 @@ class Corpse : public WorldObject, public GridObject<Corpse>
bool Create(uint32 guidlow, Player* owner);
void SaveToDB();
- bool LoadFromDB(uint32 guid, Field* fields);
+ bool LoadCorpseFromDB(uint32 guid, Field* fields);
void DeleteBonesFromWorld();
void DeleteFromDB(SQLTransaction& trans);
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index 3238d9873a9..f97d01a42a4 100755
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -137,7 +137,7 @@ bool ForcedDespawnDelayEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/)
return true;
}
-Creature::Creature(): Unit(), MapCreature(),
+Creature::Creature(bool isWorldObject): Unit(isWorldObject), MapCreature(),
lootForPickPocketed(false), lootForBody(false), m_groupLootTimer(0), lootingGroupLowGUID(0),
m_PlayerDamageReq(0), m_lootMoney(0), m_lootRecipient(0), m_lootRecipientGroup(0), m_corpseRemoveTime(0), m_respawnTime(0),
m_respawnDelay(300), m_corpseDelay(60), m_respawnradius(0.0f), m_reactState(REACT_AGGRESSIVE),
@@ -160,6 +160,7 @@ m_creatureInfo(NULL), m_creatureData(NULL), m_formation(NULL)
ResetLootMode(); // restore default loot mode
TriggerJustRespawned = false;
+ m_isTempWorldObject = false;
}
Creature::~Creature()
diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h
index 6ae9fa97462..d84221f0e63 100755
--- a/src/server/game/Entities/Creature/Creature.h
+++ b/src/server/game/Entities/Creature/Creature.h
@@ -440,7 +440,7 @@ class Creature : public Unit, public GridObject<Creature>, public MapCreature
{
public:
- explicit Creature();
+ explicit Creature(bool isWorldObject = false);
virtual ~Creature();
void AddToWorld();
@@ -707,6 +707,9 @@ class Creature : public Unit, public GridObject<Creature>, public MapCreature
uint32 GetGUIDTransport() { return guid_transport; }
void FarTeleportTo(Map* map, float X, float Y, float Z, float O);
+
+ bool m_isTempWorldObject; //true when possessed
+
protected:
bool CreateFromProto(uint32 guidlow, uint32 Entry, uint32 vehId, uint32 team, const CreatureData* data = NULL);
bool InitEntry(uint32 entry, uint32 team=ALLIANCE, const CreatureData* data=NULL);
diff --git a/src/server/game/Entities/Creature/TemporarySummon.cpp b/src/server/game/Entities/Creature/TemporarySummon.cpp
index b17606b83cc..1b06f0f0b6a 100755
--- a/src/server/game/Entities/Creature/TemporarySummon.cpp
+++ b/src/server/game/Entities/Creature/TemporarySummon.cpp
@@ -22,8 +22,8 @@
#include "ObjectMgr.h"
#include "TemporarySummon.h"
-TempSummon::TempSummon(SummonPropertiesEntry const* properties, Unit* owner) :
-Creature(), m_Properties(properties), m_type(TEMPSUMMON_MANUAL_DESPAWN),
+TempSummon::TempSummon(SummonPropertiesEntry const* properties, Unit* owner, bool isWorldObject) :
+Creature(isWorldObject), m_Properties(properties), m_type(TEMPSUMMON_MANUAL_DESPAWN),
m_timer(0), m_lifetime(0)
{
m_summonerGUID = owner ? owner->GetGUID() : 0;
@@ -272,7 +272,7 @@ void TempSummon::RemoveFromWorld()
Creature::RemoveFromWorld();
}
-Minion::Minion(SummonPropertiesEntry const* properties, Unit* owner) : TempSummon(properties, owner)
+Minion::Minion(SummonPropertiesEntry const* properties, Unit* owner, bool isWorldObject) : TempSummon(properties, owner, isWorldObject)
, m_owner(owner)
{
ASSERT(m_owner);
@@ -306,7 +306,7 @@ bool Minion::IsGuardianPet() const
return isPet() || (m_Properties && m_Properties->Category == SUMMON_CATEGORY_PET);
}
-Guardian::Guardian(SummonPropertiesEntry const* properties, Unit* owner) : Minion(properties, owner)
+Guardian::Guardian(SummonPropertiesEntry const* properties, Unit* owner, bool isWorldObject) : Minion(properties, owner, isWorldObject)
, m_bonusSpellDamage(0)
{
memset(m_statFromOwner, 0, sizeof(float)*MAX_STATS);
@@ -340,7 +340,7 @@ void Guardian::InitSummon()
m_owner->ToPlayer()->CharmSpellInitialize();
}
-Puppet::Puppet(SummonPropertiesEntry const* properties, Unit* owner) : Minion(properties, owner)
+Puppet::Puppet(SummonPropertiesEntry const* properties, Unit* owner) : Minion(properties, owner, false) //maybe true?
{
ASSERT(owner->GetTypeId() == TYPEID_PLAYER);
m_owner = (Player*)owner;
diff --git a/src/server/game/Entities/Creature/TemporarySummon.h b/src/server/game/Entities/Creature/TemporarySummon.h
index 1982dec4bb8..69ae8349155 100755
--- a/src/server/game/Entities/Creature/TemporarySummon.h
+++ b/src/server/game/Entities/Creature/TemporarySummon.h
@@ -24,7 +24,7 @@
class TempSummon : public Creature
{
public:
- explicit TempSummon(SummonPropertiesEntry const* properties, Unit* owner);
+ explicit TempSummon(SummonPropertiesEntry const* properties, Unit* owner, bool isWorldObject);
virtual ~TempSummon() {}
void Update(uint32 time);
virtual void InitStats(uint32 lifetime);
@@ -48,7 +48,7 @@ class TempSummon : public Creature
class Minion : public TempSummon
{
public:
- Minion(SummonPropertiesEntry const* properties, Unit* owner);
+ Minion(SummonPropertiesEntry const* properties, Unit* owner, bool isWorldObject);
void InitStats(uint32 duration);
void RemoveFromWorld();
Unit* GetOwner() { return m_owner; }
@@ -64,7 +64,7 @@ class Minion : public TempSummon
class Guardian : public Minion
{
public:
- Guardian(SummonPropertiesEntry const* properties, Unit* owner);
+ Guardian(SummonPropertiesEntry const* properties, Unit* owner, bool isWorldObject);
void InitStats(uint32 duration);
bool InitStatsForLevel(uint8 level);
void InitSummon();
diff --git a/src/server/game/Entities/DynamicObject/DynamicObject.cpp b/src/server/game/Entities/DynamicObject/DynamicObject.cpp
index 30afd43cf14..4e0d2d7d0b9 100755
--- a/src/server/game/Entities/DynamicObject/DynamicObject.cpp
+++ b/src/server/game/Entities/DynamicObject/DynamicObject.cpp
@@ -27,7 +27,7 @@
#include "GridNotifiersImpl.h"
#include "ScriptMgr.h"
-DynamicObject::DynamicObject() : WorldObject(),
+DynamicObject::DynamicObject(bool isWorldObject) : WorldObject(isWorldObject),
_aura(NULL), _removedAura(NULL), _caster(NULL), _duration(0), _isViewpoint(false)
{
m_objectType |= TYPEMASK_DYNAMICOBJECT;
@@ -79,7 +79,7 @@ void DynamicObject::RemoveFromWorld()
}
}
-bool DynamicObject::CreateDynamicObject(uint32 guidlow, Unit* caster, uint32 spellId, Position const& pos, float radius, bool active, DynamicObjectType type)
+bool DynamicObject::CreateDynamicObject(uint32 guidlow, Unit* caster, uint32 spellId, Position const& pos, float radius, DynamicObjectType type)
{
SetMap(caster->GetMap());
Relocate(pos);
@@ -105,8 +105,7 @@ bool DynamicObject::CreateDynamicObject(uint32 guidlow, Unit* caster, uint32 spe
SetFloatValue(DYNAMICOBJECT_RADIUS, radius);
SetUInt32Value(DYNAMICOBJECT_CASTTIME, getMSTime());
- m_isWorldObject = active;
- if (active)
+ if (IsWorldObject())
setActive(true); //must before add to map to be put in world container
if (!GetMap()->AddToMap(this))
diff --git a/src/server/game/Entities/DynamicObject/DynamicObject.h b/src/server/game/Entities/DynamicObject/DynamicObject.h
index c178fe98d14..bd8c15cdba4 100755
--- a/src/server/game/Entities/DynamicObject/DynamicObject.h
+++ b/src/server/game/Entities/DynamicObject/DynamicObject.h
@@ -35,13 +35,13 @@ enum DynamicObjectType
class DynamicObject : public WorldObject, public GridObject<DynamicObject>
{
public:
- DynamicObject();
+ DynamicObject(bool isWorldObject);
~DynamicObject();
void AddToWorld();
void RemoveFromWorld();
- bool CreateDynamicObject(uint32 guidlow, Unit* caster, uint32 spellId, Position const& pos, float radius, bool active, DynamicObjectType type);
+ bool CreateDynamicObject(uint32 guidlow, Unit* caster, uint32 spellId, Position const& pos, float radius, DynamicObjectType type);
void Update(uint32 p_time);
void Remove();
void SetDuration(int32 newDuration);
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index de1b0f84871..036664a2760 100755
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -30,7 +30,7 @@
#include "CreatureAISelector.h"
#include "Group.h"
-GameObject::GameObject() : WorldObject(), m_goValue(new GameObjectValue), m_AI(NULL)
+GameObject::GameObject() : WorldObject(false), m_goValue(new GameObjectValue), m_AI(NULL)
{
m_objectType |= TYPEMASK_GAMEOBJECT;
m_objectTypeId = TYPEID_GAMEOBJECT;
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index 978d9accb64..d4679928d82 100755
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -82,7 +82,7 @@ Object::Object() : m_PackGUID(sizeof(uint64)+1)
WorldObject::~WorldObject()
{
// this may happen because there are many !create/delete
- if (m_isWorldObject && m_currMap)
+ if (IsWorldObject() && m_currMap)
{
if (GetTypeId() == TYPEID_CORPSE)
{
@@ -1221,8 +1221,8 @@ void MovementInfo::OutDebug()
sLog->outString("splineElevation: %f", splineElevation);
}
-WorldObject::WorldObject(): WorldLocation(),
-m_isWorldObject(false), m_name(""), m_isActive(false), m_zoneScript(NULL),
+WorldObject::WorldObject(bool isWorldObject): WorldLocation(),
+m_isWorldObject(isWorldObject), m_name(""), m_isActive(false), m_zoneScript(NULL),
m_transport(NULL), m_currMap(NULL), m_InstanceId(0),
m_phaseMask(PHASEMASK_NORMAL), m_notifyflags(0), m_executed_notifies(0)
{
@@ -1238,6 +1238,17 @@ void WorldObject::SetWorldObject(bool on)
GetMap()->AddObjectToSwitchList(this, on);
}
+bool WorldObject::IsWorldObject() const
+{
+ if (m_isWorldObject)
+ return true;
+
+ if (ToCreature() && ToCreature()->m_isTempWorldObject)
+ return true;
+
+ return false;
+}
+
void WorldObject::setActive(bool on)
{
if (m_isActive == on)
@@ -1642,7 +1653,7 @@ bool WorldObject::canSeeOrDetect(WorldObject const* obj, bool ignoreStealth, boo
bool corpseVisibility = false;
if (distanceCheck)
{
- if (const Player* thisPlayer = ToPlayer())
+ if (Player const* thisPlayer = ToPlayer())
{
if (thisPlayer->isDead() && thisPlayer->GetHealth() > 0 && // Cheap way to check for ghost state
!(obj->m_serverSideVisibility.GetValue(SERVERSIDE_VISIBILITY_GHOST) & m_serverSideVisibility.GetValue(SERVERSIDE_VISIBILITY_GHOST) & GHOST_VISIBILITY_GHOST))
@@ -1675,9 +1686,9 @@ bool WorldObject::canSeeOrDetect(WorldObject const* obj, bool ignoreStealth, boo
if (!corpseVisibility && !(obj->m_serverSideVisibility.GetValue(SERVERSIDE_VISIBILITY_GHOST) & m_serverSideVisibilityDetect.GetValue(SERVERSIDE_VISIBILITY_GHOST)))
{
// Alive players can see dead players in some cases, but other objects can't do that
- if (const Player* thisPlayer = ToPlayer())
+ if (Player const* thisPlayer = ToPlayer())
{
- if (const Player* objPlayer = obj->ToPlayer())
+ if (Player const* objPlayer = obj->ToPlayer())
{
if (thisPlayer->GetTeam() != objPlayer->GetTeam() || !thisPlayer->IsGroupVisibleFor(objPlayer))
return false;
@@ -2018,7 +2029,6 @@ void WorldObject::SendMessageToSet(WorldPacket* data, bool self)
SendMessageToSetInRange(data, GetVisibilityRange(), self);
}
-
void WorldObject::SendMessageToSetInRange(WorldPacket* data, float dist, bool /*self*/)
{
Trinity::MessageDistDeliverer notifier(this, data, dist);
@@ -2052,7 +2062,7 @@ void WorldObject::SetMap(Map* map)
m_currMap = map;
m_mapId = map->GetId();
m_InstanceId = map->GetInstanceId();
- if (m_isWorldObject)
+ if (IsWorldObject())
m_currMap->AddWorldObject(this);
}
@@ -2060,7 +2070,7 @@ void WorldObject::ResetMap()
{
ASSERT(m_currMap);
ASSERT(!IsInWorld());
- if (m_isWorldObject)
+ if (IsWorldObject())
m_currMap->RemoveWorldObject(this);
m_currMap = NULL;
//maybe not for corpse
@@ -2150,10 +2160,10 @@ TempSummon* Map::SummonCreature(uint32 entry, Position const& pos, SummonPropert
switch (mask)
{
case UNIT_MASK_SUMMON:
- summon = new TempSummon(properties, summoner);
+ summon = new TempSummon(properties, summoner, false);
break;
case UNIT_MASK_GUARDIAN:
- summon = new Guardian(properties, summoner);
+ summon = new Guardian(properties, summoner, false);
break;
case UNIT_MASK_PUPPET:
summon = new Puppet(properties, summoner);
@@ -2162,7 +2172,7 @@ TempSummon* Map::SummonCreature(uint32 entry, Position const& pos, SummonPropert
summon = new Totem(properties, summoner);
break;
case UNIT_MASK_MINION:
- summon = new Minion(properties, summoner);
+ summon = new Minion(properties, summoner, false);
break;
default:
return NULL;
diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h
index eab4dbeba99..786b23f6340 100755
--- a/src/server/game/Entities/Object/Object.h
+++ b/src/server/game/Entities/Object/Object.h
@@ -561,7 +561,7 @@ class FlaggedValuesArray32
class WorldObject : public Object, public WorldLocation
{
protected:
- explicit WorldObject();
+ explicit WorldObject(bool isWorldObject); //note: here it means if it is in grid object list or world object list
public:
virtual ~WorldObject();
@@ -800,6 +800,9 @@ class WorldObject : public Object, public WorldLocation
bool isActiveObject() const { return m_isActive; }
void setActive(bool isActiveObject);
void SetWorldObject(bool apply);
+ bool IsPermanentWorldObject() const { return m_isWorldObject; }
+ bool IsWorldObject() const;
+
template<class NOTIFIER> void VisitNearbyObject(float const& radius, NOTIFIER& notifier) const { if (IsInWorld()) GetMap()->VisitAll(GetPositionX(), GetPositionY(), radius, notifier); }
template<class NOTIFIER> void VisitNearbyGridObject(float const& radius, NOTIFIER& notifier) const { if (IsInWorld()) GetMap()->VisitGrid(GetPositionX(), GetPositionY(), radius, notifier); }
template<class NOTIFIER> void VisitNearbyWorldObject(float const& radius, NOTIFIER& notifier) const { if (IsInWorld()) GetMap()->VisitWorld(GetPositionX(), GetPositionY(), radius, notifier); }
@@ -812,7 +815,6 @@ class WorldObject : public Object, public WorldLocation
double rand_chance() const { return GetMap()->mtRand.randExc(100.0);}
#endif
- bool m_isWorldObject;
uint32 LastUsedScriptID;
// Transports
@@ -830,6 +832,7 @@ class WorldObject : public Object, public WorldLocation
protected:
std::string m_name;
bool m_isActive;
+ const bool m_isWorldObject;
ZoneScript* m_zoneScript;
// transports
diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp
index 404fe24d467..4e33142f5ce 100755
--- a/src/server/game/Entities/Pet/Pet.cpp
+++ b/src/server/game/Entities/Pet/Pet.cpp
@@ -33,7 +33,7 @@
#define PET_XP_FACTOR 0.05f
-Pet::Pet(Player* owner, PetType type) : Guardian(NULL, owner),
+Pet::Pet(Player* owner, PetType type) : Guardian(NULL, owner, true),
m_usedTalentCount(0), m_removed(false), m_owner(owner),
m_happinessTimer(7500), m_petType(type), m_duration(0),
m_auraRaidUpdateMask(0), m_loading(false), m_declinedname(NULL)
@@ -50,8 +50,6 @@ m_auraRaidUpdateMask(0), m_loading(false), m_declinedname(NULL)
m_name = "Pet";
m_regenTimer = PET_FOCUS_REGEN_INTERVAL;
-
- m_isWorldObject = true;
}
Pet::~Pet()
@@ -908,6 +906,7 @@ bool Guardian::InitStatsForLevel(uint8 petlevel)
SetCreateHealth(40*petlevel);
SetCreateMana(28 + 10*petlevel);
}
+ SetBonusDamage(m_owner->SpellBaseDamageBonus(SPELL_SCHOOL_MASK_FIRE) * 0.5f);
SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, float(petlevel * 4 - petlevel));
SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, float(petlevel * 4 + petlevel));
break;
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 0e98eb27596..510813a4e56 100755
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -629,7 +629,7 @@ UpdateMask Player::updateVisualBits;
#ifdef _MSC_VER
#pragma warning(disable:4355)
#endif
-Player::Player (WorldSession* session): Unit(), m_achievementMgr(this), m_reputationMgr(this)
+Player::Player(WorldSession* session): Unit(true), m_achievementMgr(this), m_reputationMgr(this)
{
#ifdef _MSC_VER
#pragma warning(default:4355)
@@ -839,7 +839,6 @@ Player::Player (WorldSession* session): Unit(), m_achievementMgr(this), m_reputa
m_grantableLevels = 0;
m_ControlledByPlayer = true;
- m_isWorldObject = true;
sWorld->IncreasePlayerCount();
@@ -1850,7 +1849,7 @@ void Player::setDeathState(DeathState s)
SetUInt32Value(PLAYER_SELF_RES_SPELL, 0);
}
-bool Player::BuildEnumData(QueryResult result, WorldPacket* data)
+bool Player::BuildEnumData(PreparedQueryResult result, WorldPacket* data)
{
// 0 1 2 3 4 5 6 7
// "SELECT characters.guid, characters.name, characters.race, characters.class, characters.gender, characters.playerBytes, characters.playerBytes2, characters.level, "
@@ -1894,8 +1893,8 @@ bool Player::BuildEnumData(QueryResult result, WorldPacket* data)
*data << uint8(playerBytes2 & 0xFF); // facial hair
*data << uint8(fields[7].GetUInt8()); // level
- *data << uint32(fields[8].GetUInt32()); // zone
- *data << uint32(fields[9].GetUInt32()); // map
+ *data << uint32(fields[8].GetUInt16()); // zone
+ *data << uint32(fields[9].GetUInt16()); // map
*data << fields[10].GetFloat(); // x
*data << fields[11].GetFloat(); // y
@@ -2052,28 +2051,6 @@ void Player::SendTeleportAckPacket()
GetSession()->SendPacket(&data);
}
-// this is not used anywhere
-void Player::TeleportOutOfMap(Map* oldMap)
-{
- while (IsBeingTeleportedFar())
- GetSession()->HandleMoveWorldportAckOpcode();
-
- if (GetMap() != oldMap)
- return;
-
- TeleportTo(m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, GetOrientation());
-
- while (IsBeingTeleportedFar())
- GetSession()->HandleMoveWorldportAckOpcode();
-
- if (GetMap() == oldMap)
- {
- sLog->outCrash("Cannot teleport player out of map!");
- ResetMap();
- ASSERT(false);
- }
-}
-
bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options)
{
if (!MapManager::IsValidMapCoord(mapid, x, y, z, orientation))
@@ -12885,6 +12862,8 @@ void Player::SwapItem(uint16 src, uint16 dst)
RemoveItem(srcbag, srcslot, true);
StoreItem(dest, pSrcItem, true);
+ if (IsBankPos(src))
+ ItemAddedQuestCheck(pSrcItem->GetEntry(), pSrcItem->GetCount());
}
else if (IsBankPos (dst))
{
@@ -12898,6 +12877,7 @@ void Player::SwapItem(uint16 src, uint16 dst)
RemoveItem(srcbag, srcslot, true);
BankItem(dest, pSrcItem, true);
+ ItemRemovedQuestCheck(pSrcItem->GetEntry(), pSrcItem->GetCount());
}
else if (IsEquipmentPos (dst))
{
@@ -13322,11 +13302,7 @@ void Player::UpdateSoulboundTradeItems()
// also checks for garbage data
for (ItemDurationList::iterator itr = m_itemSoulboundTradeable.begin(); itr != m_itemSoulboundTradeable.end();)
{
- if (!*itr)
- {
- m_itemSoulboundTradeable.erase(itr++);
- continue;
- }
+ ASSERT(*itr);
if ((*itr)->GetOwnerGUID() != GetGUID())
{
m_itemSoulboundTradeable.erase(itr++);
@@ -13341,16 +13317,10 @@ void Player::UpdateSoulboundTradeItems()
}
}
+//TODO: should never allow an item to be added to m_itemSoulboundTradeable twice
void Player::RemoveTradeableItem(Item* item)
{
- for (ItemDurationList::iterator itr = m_itemSoulboundTradeable.begin(); itr != m_itemSoulboundTradeable.end(); ++itr)
- {
- if ((*itr) == item)
- {
- m_itemSoulboundTradeable.erase(itr);
- break;
- }
- }
+ m_itemSoulboundTradeable.remove(item);
}
void Player::UpdateItemDuration(uint32 time, bool realtimeonly)
@@ -15052,11 +15022,11 @@ void Player::FailQuest(uint32 questId)
// Destroy quest items on quest failure.
for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
if (quest->RequiredItemId[i] > 0 && quest->RequiredItemCount[i] > 0)
- // Destroy items recieved on starting the quest.
+ // Destroy items received on starting the quest.
DestroyItemCount(quest->RequiredItemId[i], quest->RequiredItemCount[i], true, true);
for (uint8 i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
if (quest->RequiredSourceItemId[i] > 0 && quest->RequiredSourceItemCount[i] > 0)
- // Destroy items recieved during the quest.
+ // Destroy items received during the quest.
DestroyItemCount(quest->RequiredSourceItemId[i], quest->RequiredSourceItemCount[i], true, true);
}
}
@@ -18143,8 +18113,14 @@ bool Player::Satisfy(AccessRequirement const* ar, uint32 target_map, bool report
missingQuest = ar->quest_H;
uint32 missingAchievement = 0;
- if (ar->achievement && !GetAchievementMgr().HasAchieved(sAchievementStore.LookupEntry(ar->achievement)))
- missingAchievement = ar->achievement;
+ Player* leader = this;
+ uint64 leaderGuid = GetGroup() ? GetGroup()->GetLeaderGUID() : GetGUID();
+ if (leaderGuid != GetGUID())
+ leader = ObjectAccessor::FindPlayer(leaderGuid);
+
+ if (ar->achievement)
+ if (!leader || !leader->GetAchievementMgr().HasAchieved(ar->achievement))
+ missingAchievement = ar->achievement;
Difficulty target_difficulty = GetDifficulty(mapEntry->IsRaid());
MapDifficulty const* mapDiff = GetDownscaledMapDifficultyData(target_map, target_difficulty);
@@ -18919,7 +18895,7 @@ void Player::_SaveSkills(SQLTransaction& trans)
void Player::_SaveSpells(SQLTransaction& trans)
{
- for (PlayerSpellMap::iterator itr = m_spells.begin(), next = m_spells.begin(); itr != m_spells.end();)
+ for (PlayerSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end();)
{
if (itr->second->state == PLAYERSPELL_REMOVED || itr->second->state == PLAYERSPELL_CHANGED)
trans->PAppend("DELETE FROM character_spell WHERE guid = '%u' and spell = '%u'", GetGUIDLow(), itr->first);
@@ -20221,7 +20197,7 @@ bool Player::ActivateTaxiPathTo(uint32 taxi_path_id, uint32 spellid /*= 0*/)
void Player::CleanupAfterTaxiFlight()
{
m_taxi.ClearTaxiDestinations(); // not destinations, clear source node
- Unmount();
+ Dismount();
RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_TAXI_FLIGHT);
getHostileRefManager().setOnlineOfflineState(true);
}
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 651b99e7cb4..8ee7d1a417f 100755
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -1091,13 +1091,10 @@ class Player : public Unit, public GridObject<Player>
void RemoveFromWorld();
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options = 0);
- void TeleportOutOfMap(Map* oldMap);
-
bool TeleportTo(WorldLocation const &loc, uint32 options = 0)
{
return TeleportTo(loc.GetMapId(), loc.GetPositionX(), loc.GetPositionY(), loc.GetPositionZ(), loc.GetOrientation(), options);
}
-
bool TeleportToBGEntryPoint();
void SetSummonPoint(uint32 mapid, float x, float y, float z)
@@ -1114,7 +1111,7 @@ class Player : public Unit, public GridObject<Player>
void Update(uint32 time);
- static bool BuildEnumData(QueryResult result, WorldPacket* data);
+ static bool BuildEnumData(PreparedQueryResult result, WorldPacket* data);
void SetInWater(bool apply);
@@ -2503,7 +2500,7 @@ class Player : public Unit, public GridObject<Player>
CreatureDisplayInfoEntry const* mountDisplayInfo = sCreatureDisplayInfoStore.LookupEntry(GetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID));
if (!mountDisplayInfo)
return GetCollisionHeight(false);
-
+
CreatureModelDataEntry const* mountModelData = sCreatureModelDataStore.LookupEntry(mountDisplayInfo->ModelId);
if (!mountModelData)
return GetCollisionHeight(false);
diff --git a/src/server/game/Entities/Totem/Totem.cpp b/src/server/game/Entities/Totem/Totem.cpp
index 97629e802d4..fc368b1f109 100755
--- a/src/server/game/Entities/Totem/Totem.cpp
+++ b/src/server/game/Entities/Totem/Totem.cpp
@@ -25,7 +25,7 @@
#include "SpellMgr.h"
#include "SpellInfo.h"
-Totem::Totem(SummonPropertiesEntry const* properties, Unit* owner) : Minion(properties, owner)
+Totem::Totem(SummonPropertiesEntry const* properties, Unit* owner) : Minion(properties, owner, false)
{
m_unitTypeMask |= UNIT_MASK_TOTEM;
m_duration = 0;
diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp
index 008f752306d..d533f6fe5b9 100755
--- a/src/server/game/Entities/Transport/Transport.cpp
+++ b/src/server/game/Entities/Transport/Transport.cpp
@@ -633,7 +633,8 @@ void Transport::BuildStopMovePacket(Map const* targetMap)
uint32 Transport::AddNPCPassenger(uint32 tguid, uint32 entry, float x, float y, float z, float o, uint32 anim)
{
Map* map = GetMap();
- Creature* creature = new Creature;
+ //make it world object so it will not be unloaded with grid
+ Creature* creature = new Creature(true);
if (!creature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, GetPhaseMask(), entry, 0, GetGOInfo()->faction, 0, 0, 0, 0))
{
@@ -666,7 +667,6 @@ uint32 Transport::AddNPCPassenger(uint32 tguid, uint32 entry, float x, float y,
map->AddToMap(creature);
m_NPCPassengerSet.insert(creature);
- creature->SetWorldObject(true); //so it will not be unloaded with grid
if (tguid == 0)
{
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 298f9c60af8..fec9a13192c 100755
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -144,7 +144,7 @@ _hitMask(hitMask), _spell(spell), _damageInfo(damageInfo), _healInfo(healInfo)
#ifdef _MSC_VER
#pragma warning(disable:4355)
#endif
-Unit::Unit(): WorldObject(),
+Unit::Unit(bool isWorldObject): WorldObject(isWorldObject),
m_movedPlayer(NULL), m_lastSanctuaryTime(0), IsAIEnabled(false), NeedChangeAI(false),
m_ControlledByPlayer(false), i_AI(NULL), i_disabledAI(NULL), m_procDeep(0),
m_removedAurasCount(0), i_motionMaster(this), m_ThreatManager(this), m_vehicle(NULL),
@@ -1478,9 +1478,13 @@ bool Unit::IsDamageReducedByArmor(SpellSchoolMask schoolMask, SpellInfo const* s
return false;
// bleeding effects are not reduced by armor
- if (effIndex != MAX_SPELL_EFFECTS && spellInfo->Effects[effIndex].ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE)
- if (spellInfo->GetEffectMechanicMask(effIndex) & (1<<MECHANIC_BLEED))
- return false;
+ if (effIndex != MAX_SPELL_EFFECTS)
+ {
+ if (spellInfo->Effects[effIndex].ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE ||
+ spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_SCHOOL_DAMAGE)
+ if (spellInfo->GetEffectMechanicMask(effIndex) & (1<<MECHANIC_BLEED))
+ return false;
+ }
}
return true;
}
@@ -1922,12 +1926,7 @@ void Unit::AttackerStateUpdate (Unit* victim, WeaponAttackType attType, bool ext
CombatStart(victim);
RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_MELEE_ATTACK);
- uint32 hitInfo;
- if (attType == BASE_ATTACK)
- hitInfo = HITINFO_NORMALSWING2;
- else if (attType == OFF_ATTACK)
- hitInfo = HITINFO_LEFTSWING;
- else
+ if (attType != BASE_ATTACK && attType != OFF_ATTACK)
return; // ignore ranged case
// melee attack spell casted at main hand attack only - no normal melee dmg dealt
@@ -5470,7 +5469,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
case CLASS_DRUID:
RandomSpells.push_back(71484);
RandomSpells.push_back(71485);
- RandomSpells.push_back(71486);
+ RandomSpells.push_back(71492);
break;
case CLASS_HUNTER:
RandomSpells.push_back(71486);
@@ -5516,7 +5515,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
case CLASS_DRUID:
RandomSpells.push_back(71561);
RandomSpells.push_back(71556);
- RandomSpells.push_back(71558);
+ RandomSpells.push_back(71560);
break;
case CLASS_HUNTER:
RandomSpells.push_back(71558);
@@ -6498,7 +6497,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere
RemoveAura(57934);
if (!redirectTarget)
break;
- redirectTarget->CastSpell(this,59628,true);
+ CastSpell(this,59628,true);
CastSpell(redirectTarget,57933,true);
break;
}
@@ -8920,6 +8919,20 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg
}
break;
}
+ case 46916: // Slam! (Bloodsurge proc)
+ case 52437: // Sudden Death
+ {
+ // Item - Warrior T10 Melee 4P Bonus
+ if (AuraEffect const* aurEff = GetAuraEffect(70847, 0))
+ {
+ if (!roll_chance_i(aurEff->GetAmount()))
+ break;
+ CastSpell(this, 70849, true, castItem, triggeredByAura); // Extra Charge!
+ CastSpell(this, 71072, true, castItem, triggeredByAura); // Slam GCD Reduced
+ CastSpell(this, 71069, true, castItem, triggeredByAura); // Execute GCD Reduced
+ }
+ break;
+ }
// Sword and Board
case 50227:
{
@@ -11929,7 +11942,7 @@ void Unit::Mount(uint32 mount, uint32 VehicleId, uint32 creatureEntry)
RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_MOUNT);
}
-void Unit::Unmount()
+void Unit::Dismount()
{
if (!IsMounted())
return;
@@ -11950,7 +11963,7 @@ void Unit::Unmount()
data.appendPackGUID(GetGUID());
SendMessageToSet(&data, true);
- // unmount as a vehicle
+ // dismount as a vehicle
if (GetTypeId() == TYPEID_PLAYER && GetVehicleKit())
{
// Send other players that we are no longer a vehicle
@@ -12072,7 +12085,7 @@ void Unit::SetInCombatState(bool PvP, Unit* enemy)
}
if (!(creature->GetCreatureInfo()->type_flags & CREATURE_TYPEFLAGS_MOUNTED_COMBAT))
- Unmount();
+ Dismount();
}
for (Unit::ControlList::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
@@ -14300,6 +14313,7 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u
if (procTriggered.empty())
return;
+ // Note: must SetCantProc(false) before return
if (procExtra & (PROC_EX_INTERNAL_TRIGGERED | PROC_EX_INTERNAL_CANT_PROC))
SetCantProc(true);
@@ -14324,6 +14338,7 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u
if (GetTypeId() == TYPEID_PLAYER && i->spellProcEvent && i->spellProcEvent->cooldown)
cooldown = i->spellProcEvent->cooldown;
+ // Note: must SetCantProc(false) before return
if (spellInfo->AttributesEx3 & SPELL_ATTR3_DISABLE_PROC)
SetCantProc(true);
@@ -14336,176 +14351,179 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u
}
if (!handled)
- for (uint8 effIndex = 0; effIndex < MAX_SPELL_EFFECTS; ++effIndex)
{
- if (!(i->effMask & (1<<effIndex)))
- continue;
-
- AuraEffect* triggeredByAura = i->aura->GetEffect(effIndex);
- ASSERT(triggeredByAura);
-
- switch (triggeredByAura->GetAuraType())
+ for (uint8 effIndex = 0; effIndex < MAX_SPELL_EFFECTS; ++effIndex)
{
- case SPELL_AURA_PROC_TRIGGER_SPELL:
- {
- sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "ProcDamageAndSpell: casting spell %u (triggered by %s aura of spell %u)", spellInfo->Id, (isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId());
- // Don`t drop charge or add cooldown for not started trigger
- if (HandleProcTriggerSpell(target, damage, triggeredByAura, procSpell, procFlag, procExtra, cooldown))
- takeCharges = true;
- break;
- }
- case SPELL_AURA_PROC_TRIGGER_DAMAGE:
- {
- // target has to be valid
- if (!target)
- return;
-
- sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "ProcDamageAndSpell: doing %u damage from spell id %u (triggered by %s aura of spell %u)", triggeredByAura->GetAmount(), spellInfo->Id, (isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId());
- SpellNonMeleeDamage damageInfo(this, target, spellInfo->Id, spellInfo->SchoolMask);
- uint32 newDamage = SpellDamageBonus(target, spellInfo, triggeredByAura->GetAmount(), SPELL_DIRECT_DAMAGE);
- CalculateSpellDamageTaken(&damageInfo, newDamage, spellInfo);
- DealDamageMods(damageInfo.target, damageInfo.damage, &damageInfo.absorb);
- SendSpellNonMeleeDamageLog(&damageInfo);
- DealSpellDamage(&damageInfo, true);
- takeCharges = true;
- break;
- }
- case SPELL_AURA_MANA_SHIELD:
- case SPELL_AURA_DUMMY:
- {
- sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "ProcDamageAndSpell: casting spell id %u (triggered by %s dummy aura of spell %u)", spellInfo->Id, (isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId());
- if (HandleDummyAuraProc(target, damage, triggeredByAura, procSpell, procFlag, procExtra, cooldown))
- takeCharges = true;
- break;
- }
- case SPELL_AURA_OBS_MOD_POWER:
- sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "ProcDamageAndSpell: casting spell id %u (triggered by %s aura of spell %u)", spellInfo->Id, (isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId());
- if (HandleObsModEnergyAuraProc(target, damage, triggeredByAura, procSpell, procFlag, procExtra, cooldown))
- takeCharges = true;
- break;
- case SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN:
- sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "ProcDamageAndSpell: casting spell id %u (triggered by %s aura of spell %u)", spellInfo->Id, (isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId());
- if (HandleModDamagePctTakenAuraProc(target, damage, triggeredByAura, procSpell, procFlag, procExtra, cooldown))
- takeCharges = true;
- break;
- case SPELL_AURA_MOD_MELEE_HASTE:
- {
- sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "ProcDamageAndSpell: casting spell id %u (triggered by %s haste aura of spell %u)", spellInfo->Id, (isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId());
- if (HandleHasteAuraProc(target, damage, triggeredByAura, procSpell, procFlag, procExtra, cooldown))
- takeCharges = true;
- break;
- }
- case SPELL_AURA_OVERRIDE_CLASS_SCRIPTS:
- {
- sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "ProcDamageAndSpell: casting spell id %u (triggered by %s aura of spell %u)", spellInfo->Id, (isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId());
- if (HandleOverrideClassScriptAuraProc(target, damage, triggeredByAura, procSpell, cooldown))
- takeCharges = true;
- break;
- }
- case SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE:
- {
- sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "ProcDamageAndSpell: casting mending (triggered by %s dummy aura of spell %u)",
- (isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId());
+ if (!(i->effMask & (1<<effIndex)))
+ continue;
- HandleAuraRaidProcFromChargeWithValue(triggeredByAura);
- takeCharges = true;
- break;
- }
- case SPELL_AURA_RAID_PROC_FROM_CHARGE:
- {
- sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "ProcDamageAndSpell: casting mending (triggered by %s dummy aura of spell %u)",
- (isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId());
+ AuraEffect* triggeredByAura = i->aura->GetEffect(effIndex);
+ ASSERT(triggeredByAura);
- HandleAuraRaidProcFromCharge(triggeredByAura);
- takeCharges = true;
- break;
- }
- case SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE:
+ switch (triggeredByAura->GetAuraType())
{
- sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "ProcDamageAndSpell: casting spell %u (triggered with value by %s aura of spell %u)", spellInfo->Id, (isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId());
+ case SPELL_AURA_PROC_TRIGGER_SPELL:
+ {
+ sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "ProcDamageAndSpell: casting spell %u (triggered by %s aura of spell %u)", spellInfo->Id, (isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId());
+ // Don`t drop charge or add cooldown for not started trigger
+ if (HandleProcTriggerSpell(target, damage, triggeredByAura, procSpell, procFlag, procExtra, cooldown))
+ takeCharges = true;
+ break;
+ }
+ case SPELL_AURA_PROC_TRIGGER_DAMAGE:
+ {
+ // target has to be valid
+ if (!target)
+ break;
- if (HandleProcTriggerSpell(target, damage, triggeredByAura, procSpell, procFlag, procExtra, cooldown))
- takeCharges = true;
- break;
- }
- case SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK:
- // Skip melee hits or instant cast spells
- if (procSpell && procSpell->CalcCastTime() != 0)
- takeCharges = true;
- break;
- case SPELL_AURA_REFLECT_SPELLS_SCHOOL:
- // Skip Melee hits and spells ws wrong school
- if (procSpell && (triggeredByAura->GetMiscValue() & procSpell->SchoolMask)) // School check
- takeCharges = true;
- break;
- case SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT:
- case SPELL_AURA_MOD_POWER_COST_SCHOOL:
- // Skip melee hits and spells ws wrong school or zero cost
- if (procSpell &&
- (procSpell->ManaCost != 0 || procSpell->ManaCostPercentage != 0) && // Cost check
- (triggeredByAura->GetMiscValue() & procSpell->SchoolMask)) // School check
- takeCharges = true;
- break;
- case SPELL_AURA_MECHANIC_IMMUNITY:
- // Compare mechanic
- if (procSpell && procSpell->Mechanic == uint32(triggeredByAura->GetMiscValue()))
- takeCharges = true;
- break;
- case SPELL_AURA_MOD_MECHANIC_RESISTANCE:
- // Compare mechanic
- if (procSpell && procSpell->Mechanic == uint32(triggeredByAura->GetMiscValue()))
+ sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "ProcDamageAndSpell: doing %u damage from spell id %u (triggered by %s aura of spell %u)", triggeredByAura->GetAmount(), spellInfo->Id, (isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId());
+ SpellNonMeleeDamage damageInfo(this, target, spellInfo->Id, spellInfo->SchoolMask);
+ uint32 newDamage = SpellDamageBonus(target, spellInfo, triggeredByAura->GetAmount(), SPELL_DIRECT_DAMAGE);
+ CalculateSpellDamageTaken(&damageInfo, newDamage, spellInfo);
+ DealDamageMods(damageInfo.target, damageInfo.damage, &damageInfo.absorb);
+ SendSpellNonMeleeDamageLog(&damageInfo);
+ DealSpellDamage(&damageInfo, true);
takeCharges = true;
- break;
- case SPELL_AURA_MOD_DAMAGE_FROM_CASTER:
- // Compare casters
- if (triggeredByAura->GetCasterGUID() == target->GetGUID())
- takeCharges = true;
- break;
- case SPELL_AURA_MOD_SPELL_CRIT_CHANCE:
- sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "ProcDamageAndSpell: casting spell id %u (triggered by %s spell crit chance aura of spell %u)", spellInfo->Id, (isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId());
- if (procSpell && HandleSpellCritChanceAuraProc(target, damage, triggeredByAura, procSpell, procFlag, procExtra, cooldown))
+ break;
+ }
+ case SPELL_AURA_MANA_SHIELD:
+ case SPELL_AURA_DUMMY:
+ {
+ sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "ProcDamageAndSpell: casting spell id %u (triggered by %s dummy aura of spell %u)", spellInfo->Id, (isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId());
+ if (HandleDummyAuraProc(target, damage, triggeredByAura, procSpell, procFlag, procExtra, cooldown))
+ takeCharges = true;
+ break;
+ }
+ case SPELL_AURA_OBS_MOD_POWER:
+ sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "ProcDamageAndSpell: casting spell id %u (triggered by %s aura of spell %u)", spellInfo->Id, (isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId());
+ if (HandleObsModEnergyAuraProc(target, damage, triggeredByAura, procSpell, procFlag, procExtra, cooldown))
+ takeCharges = true;
+ break;
+ case SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN:
+ sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "ProcDamageAndSpell: casting spell id %u (triggered by %s aura of spell %u)", spellInfo->Id, (isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId());
+ if (HandleModDamagePctTakenAuraProc(target, damage, triggeredByAura, procSpell, procFlag, procExtra, cooldown))
+ takeCharges = true;
+ break;
+ case SPELL_AURA_MOD_MELEE_HASTE:
+ {
+ sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "ProcDamageAndSpell: casting spell id %u (triggered by %s haste aura of spell %u)", spellInfo->Id, (isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId());
+ if (HandleHasteAuraProc(target, damage, triggeredByAura, procSpell, procFlag, procExtra, cooldown))
+ takeCharges = true;
+ break;
+ }
+ case SPELL_AURA_OVERRIDE_CLASS_SCRIPTS:
+ {
+ sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "ProcDamageAndSpell: casting spell id %u (triggered by %s aura of spell %u)", spellInfo->Id, (isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId());
+ if (HandleOverrideClassScriptAuraProc(target, damage, triggeredByAura, procSpell, cooldown))
+ takeCharges = true;
+ break;
+ }
+ case SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE:
+ {
+ sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "ProcDamageAndSpell: casting mending (triggered by %s dummy aura of spell %u)",
+ (isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId());
+
+ HandleAuraRaidProcFromChargeWithValue(triggeredByAura);
takeCharges = true;
- break;
- // CC Auras which use their amount amount to drop
- // Are there any more auras which need this?
- case SPELL_AURA_MOD_CONFUSE:
- case SPELL_AURA_MOD_FEAR:
- case SPELL_AURA_MOD_STUN:
- case SPELL_AURA_MOD_ROOT:
- case SPELL_AURA_TRANSFORM:
- {
- // chargeable mods are breaking on hit
- if (useCharges)
+ break;
+ }
+ case SPELL_AURA_RAID_PROC_FROM_CHARGE:
+ {
+ sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "ProcDamageAndSpell: casting mending (triggered by %s dummy aura of spell %u)",
+ (isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId());
+
+ HandleAuraRaidProcFromCharge(triggeredByAura);
takeCharges = true;
- else
+ break;
+ }
+ case SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE:
{
- // Spell own direct damage at apply wont break the CC
- if (procSpell && (procSpell->Id == triggeredByAura->GetId()))
+ sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "ProcDamageAndSpell: casting spell %u (triggered with value by %s aura of spell %u)", spellInfo->Id, (isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId());
+
+ if (HandleProcTriggerSpell(target, damage, triggeredByAura, procSpell, procFlag, procExtra, cooldown))
+ takeCharges = true;
+ break;
+ }
+ case SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK:
+ // Skip melee hits or instant cast spells
+ if (procSpell && procSpell->CalcCastTime() != 0)
+ takeCharges = true;
+ break;
+ case SPELL_AURA_REFLECT_SPELLS_SCHOOL:
+ // Skip Melee hits and spells ws wrong school
+ if (procSpell && (triggeredByAura->GetMiscValue() & procSpell->SchoolMask)) // School check
+ takeCharges = true;
+ break;
+ case SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT:
+ case SPELL_AURA_MOD_POWER_COST_SCHOOL:
+ // Skip melee hits and spells ws wrong school or zero cost
+ if (procSpell &&
+ (procSpell->ManaCost != 0 || procSpell->ManaCostPercentage != 0) && // Cost check
+ (triggeredByAura->GetMiscValue() & procSpell->SchoolMask)) // School check
+ takeCharges = true;
+ break;
+ case SPELL_AURA_MECHANIC_IMMUNITY:
+ // Compare mechanic
+ if (procSpell && procSpell->Mechanic == uint32(triggeredByAura->GetMiscValue()))
+ takeCharges = true;
+ break;
+ case SPELL_AURA_MOD_MECHANIC_RESISTANCE:
+ // Compare mechanic
+ if (procSpell && procSpell->Mechanic == uint32(triggeredByAura->GetMiscValue()))
+ takeCharges = true;
+ break;
+ case SPELL_AURA_MOD_DAMAGE_FROM_CASTER:
+ // Compare casters
+ if (triggeredByAura->GetCasterGUID() == target->GetGUID())
+ takeCharges = true;
+ break;
+ case SPELL_AURA_MOD_SPELL_CRIT_CHANCE:
+ sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "ProcDamageAndSpell: casting spell id %u (triggered by %s spell crit chance aura of spell %u)", spellInfo->Id, (isVictim?"a victim's":"an attacker's"), triggeredByAura->GetId());
+ if (procSpell && HandleSpellCritChanceAuraProc(target, damage, triggeredByAura, procSpell, procFlag, procExtra, cooldown))
+ takeCharges = true;
+ break;
+ // CC Auras which use their amount amount to drop
+ // Are there any more auras which need this?
+ case SPELL_AURA_MOD_CONFUSE:
+ case SPELL_AURA_MOD_FEAR:
+ case SPELL_AURA_MOD_STUN:
+ case SPELL_AURA_MOD_ROOT:
+ case SPELL_AURA_TRANSFORM:
+ {
+ // chargeable mods are breaking on hit
+ if (useCharges)
+ takeCharges = true;
+ else
{
- Aura* aura = triggeredByAura->GetBase();
- // called from spellcast, should not have ticked yet
- if (aura->GetDuration() == aura->GetMaxDuration())
- break;
+ // Spell own direct damage at apply wont break the CC
+ if (procSpell && (procSpell->Id == triggeredByAura->GetId()))
+ {
+ Aura* aura = triggeredByAura->GetBase();
+ // called from spellcast, should not have ticked yet
+ if (aura->GetDuration() == aura->GetMaxDuration())
+ break;
+ }
+ int32 damageLeft = triggeredByAura->GetAmount();
+ // No damage left
+ if (damageLeft < int32(damage))
+ i->aura->Remove();
+ else
+ triggeredByAura->SetAmount(damageLeft - damage);
}
- int32 damageLeft = triggeredByAura->GetAmount();
- // No damage left
- if (damageLeft < int32(damage))
- i->aura->Remove();
- else
- triggeredByAura->SetAmount(damageLeft - damage);
+ break;
}
- break;
- }
- //case SPELL_AURA_ADD_FLAT_MODIFIER:
- //case SPELL_AURA_ADD_PCT_MODIFIER:
- // HandleSpellModAuraProc
- //break;
- default:
- // nothing do, just charges counter
- takeCharges = true;
- break;
- }
- }
+ //case SPELL_AURA_ADD_FLAT_MODIFIER:
+ //case SPELL_AURA_ADD_PCT_MODIFIER:
+ // HandleSpellModAuraProc
+ //break;
+ default:
+ // nothing do, just charges counter
+ takeCharges = true;
+ break;
+ } // switch (triggeredByAura->GetAuraType())
+ } // for (uint8 effIndex = 0; effIndex < MAX_SPELL_EFFECTS; ++effIndex)
+ } // if (!handled)
+
// Remove charge (aura can be removed by triggers)
if (useCharges && takeCharges)
i->aura->DropCharge(AURA_REMOVE_BY_EXPIRE);
@@ -15593,29 +15611,17 @@ void Unit::Kill(Unit* victim, bool durabilityLoss)
}
// Hook for OnPVPKill Event
- if (GetTypeId() == TYPEID_PLAYER)
+ if (Player* killerPlr = ToPlayer())
{
- if (victim->GetTypeId() == TYPEID_PLAYER)
- {
- Player* killer = ToPlayer();
- Player* killed = victim->ToPlayer();
- sScriptMgr->OnPVPKill(killer, killed);
- }
- else if (victim->GetTypeId() == TYPEID_UNIT)
- {
- Player* killer = ToPlayer();
- Creature* killed = victim->ToCreature();
- sScriptMgr->OnCreatureKill(killer, killed);
- }
+ if (Player* killedPlr = victim->ToPlayer())
+ sScriptMgr->OnPVPKill(killerPlr, killedPlr);
+ else if (Creature* killedCre = victim->ToCreature())
+ sScriptMgr->OnCreatureKill(killerPlr, killedCre);
}
- else if (GetTypeId() == TYPEID_UNIT)
+ else if (Creature* killerCre = ToCreature())
{
- if (victim->GetTypeId() == TYPEID_PLAYER)
- {
- Creature* killer = ToCreature();
- Player* killed = victim->ToPlayer();
- sScriptMgr->OnPlayerKilledByCreature(killer, killed);
- }
+ if (Player* killed = victim->ToPlayer())
+ sScriptMgr->OnPlayerKilledByCreature(killerCre, killed);
}
if (victim->GetVehicle())
@@ -15851,9 +15857,9 @@ bool Unit::SetCharmedBy(Unit* charmer, CharmType type, AuraApplication const* au
if (!charmer)
return false;
- // unmount players when charmed
+ // dismount players when charmed
if (GetTypeId() == TYPEID_PLAYER)
- Unmount();
+ Dismount();
ASSERT(type != CHARM_TYPE_POSSESS || charmer->GetTypeId() == TYPEID_PLAYER);
ASSERT((type == CHARM_TYPE_VEHICLE) == IsVehicle());
@@ -16999,7 +17005,7 @@ void Unit::_EnterVehicle(Vehicle* vehicle, int8 seatId, AuraApplication const* a
InterruptNonMeleeSpells(false);
player->StopCastingCharm();
player->StopCastingBindSight();
- Unmount();
+ Dismount();
RemoveAurasByType(SPELL_AURA_MOUNTED);
// drop flag at invisible in bg
@@ -17099,7 +17105,7 @@ void Unit::_ExitVehicle(Position const* exitPosition)
// Vehicle just died, we die too
if (vehicle->GetBase()->getDeathState() == JUST_DIED)
setDeathState(JUST_DIED);
- // If for other reason we as minion are exiting the vehicle (ejected, master unmounted) - unsummon
+ // If for other reason we as minion are exiting the vehicle (ejected, master dismounted) - unsummon
else
ToTempSummon()->UnSummon(2000); // Approximation
}
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index 5906a7f3a2b..b18223ae3ce 100755
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -65,7 +65,7 @@ enum SpellAuraInterruptFlags
AURA_INTERRUPT_FLAG_MOVE = 0x00000008, // 3 removed by any movement
AURA_INTERRUPT_FLAG_TURNING = 0x00000010, // 4 removed by any turning
AURA_INTERRUPT_FLAG_JUMP = 0x00000020, // 5 removed by entering combat
- AURA_INTERRUPT_FLAG_NOT_MOUNTED = 0x00000040, // 6 removed by unmounting
+ AURA_INTERRUPT_FLAG_NOT_MOUNTED = 0x00000040, // 6 removed by dismounting
AURA_INTERRUPT_FLAG_NOT_ABOVEWATER = 0x00000080, // 7 removed by entering water
AURA_INTERRUPT_FLAG_NOT_UNDERWATER = 0x00000100, // 8 removed by leaving water
AURA_INTERRUPT_FLAG_NOT_SHEATHED = 0x00000200, // 9 removed by unsheathing
@@ -1441,7 +1441,7 @@ class Unit : public WorldObject
bool IsMounted() const { return HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_MOUNT); }
uint32 GetMountID() const { return GetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID); }
void Mount(uint32 mount, uint32 vehicleId = 0, uint32 creatureEntry = 0);
- void Unmount();
+ void Dismount();
uint16 GetMaxSkillValueForLevel(Unit const* target = NULL) const { return (target ? getLevelForTarget(target) : getLevel()) * 5; }
void DealDamageMods(Unit* pVictim, uint32 &damage, uint32* absorb);
@@ -2233,7 +2233,7 @@ class Unit : public WorldObject
}
protected:
- explicit Unit ();
+ explicit Unit (bool isWorldObject);
UnitAI* i_AI, *i_disabledAI;
diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp
index fe018ec78ce..d3c3268e9ce 100755
--- a/src/server/game/Entities/Vehicle/Vehicle.cpp
+++ b/src/server/game/Entities/Vehicle/Vehicle.cpp
@@ -341,7 +341,7 @@ bool Vehicle::AddPassenger(Unit* unit, int8 seatId)
}
}
- if (seat->second.SeatInfo->m_flags && !(seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_UNK11))
+ if (seat->second.SeatInfo->m_flags && !(seat->second.SeatInfo->m_flags & VEHICLE_SEAT_FLAG_UNK1))
unit->AddUnitState(UNIT_STAT_ONVEHICLE);
unit->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT);
diff --git a/src/server/game/Events/GameEventMgr.cpp b/src/server/game/Events/GameEventMgr.cpp
index d3cc27c9e6c..5cb130b93e4 100755
--- a/src/server/game/Events/GameEventMgr.cpp
+++ b/src/server/game/Events/GameEventMgr.cpp
@@ -27,6 +27,8 @@
#include "GossipDef.h"
#include "Player.h"
#include "BattlegroundMgr.h"
+#include "UnitAI.h"
+#include "GameObjectAI.h"
bool GameEventMgr::CheckOneGameEvent(uint16 entry) const
{
@@ -1059,6 +1061,8 @@ uint32 GameEventMgr::Update() // return the next e
void GameEventMgr::UnApplyEvent(uint16 event_id)
{
sLog->outDetail("GameEvent %u \"%s\" removed.", event_id, mGameEvent[event_id].description.c_str());
+ //! Run SAI scripts with SMART_EVENT_GAME_EVENT_END
+ RunSmartAIScripts(event_id, false);
// un-spawn positive event tagged objects
GameEventUnspawn(event_id);
// spawn negative event tagget objects
@@ -1090,6 +1094,9 @@ void GameEventMgr::ApplyNewEvent(uint16 event_id)
sLog->outDetail("GameEvent %u \"%s\" started.", event_id, mGameEvent[event_id].description.c_str());
+ //! Run SAI scripts with SMART_EVENT_GAME_EVENT_END
+ RunSmartAIScripts(event_id, true);
+
// spawn positive event tagget objects
GameEventSpawn(event_id);
// un-spawn negative event tagged objects
@@ -1601,6 +1608,26 @@ void GameEventMgr::SendWorldStateUpdate(Player* player, uint16 event_id)
}
}
+void GameEventMgr::RunSmartAIScripts(uint16 event_id, bool activate)
+{
+ //! Iterate over every supported source type (creature and gameobject)
+ //! Not entirely sure how this will affect units in non-loaded grids.
+ {
+ TRINITY_READ_GUARD(HashMapHolder<Creature>::LockType, *HashMapHolder<Creature>::GetLock());
+ HashMapHolder<Creature>::MapType const& m = ObjectAccessor::GetCreatures();
+ for (HashMapHolder<Creature>::MapType::const_iterator iter = m.begin(); iter != m.end(); ++iter)
+ if (iter->second->IsInWorld())
+ iter->second->AI()->sOnGameEvent(activate, event_id);
+ }
+ {
+ TRINITY_READ_GUARD(HashMapHolder<GameObject>::LockType, *HashMapHolder<GameObject>::GetLock());
+ HashMapHolder<GameObject>::MapType const& m = ObjectAccessor::GetGameObjects();
+ for (HashMapHolder<GameObject>::MapType::const_iterator iter = m.begin(); iter != m.end(); ++iter)
+ if (iter->second->IsInWorld())
+ iter->second->AI()->OnGameEvent(activate, event_id);
+ }
+}
+
bool IsHolidayActive(HolidayIds id)
{
if (id == HOLIDAY_NONE)
diff --git a/src/server/game/Events/GameEventMgr.h b/src/server/game/Events/GameEventMgr.h
index a2a35a85098..bba92b4d24c 100755
--- a/src/server/game/Events/GameEventMgr.h
+++ b/src/server/game/Events/GameEventMgr.h
@@ -132,6 +132,7 @@ class GameEventMgr
void UpdateEventNPCFlags(uint16 event_id);
void UpdateEventNPCVendor(uint16 event_id, bool activate);
void UpdateBattlegroundSettings();
+ void RunSmartAIScripts(uint16 event_id, bool activate); //! Runs SMART_EVENT_GAME_EVENT_START/_END SAI
bool CheckOneGameEventConditions(uint16 event_id);
void SaveWorldEventStateToDB(uint16 event_id);
bool hasCreatureQuestActiveEventExcept(uint32 quest_id, uint16 event_id);
diff --git a/src/server/game/Globals/ObjectAccessor.h b/src/server/game/Globals/ObjectAccessor.h
index 25fa20dce70..92c947eb86f 100755
--- a/src/server/game/Globals/ObjectAccessor.h
+++ b/src/server/game/Globals/ObjectAccessor.h
@@ -201,16 +201,16 @@ class ObjectAccessor
}
// when using this, you must use the hashmapholder's lock
- //HashMapHolder<Creature>::MapType& GetCreatures()
- //{
- // return HashMapHolder<Creature>::GetContainer();
- //}
-
- //// when using this, you must use the hashmapholder's lock
- //HashMapHolder<GameObject>::MapType& GetGameObjects()
- //{
- // return HashMapHolder<GameObject>::GetContainer();
- //}
+ static HashMapHolder<Creature>::MapType const& GetCreatures()
+ {
+ return HashMapHolder<Creature>::GetContainer();
+ }
+
+ // when using this, you must use the hashmapholder's lock
+ static HashMapHolder<GameObject>::MapType const& GetGameObjects()
+ {
+ return HashMapHolder<GameObject>::GetContainer();
+ }
template<class T> static void AddObject(T* object)
{
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 75573367241..5353e048066 100755
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -3818,11 +3818,11 @@ void ObjectMgr::LoadQuests()
// no changes, quest not dependent from this value but can have problems at client (note some may be 0, we must allow this so no check)
}
//check for proper RequiredSkillId value (skill case)
- if (int32 skill_id = SkillByQuestSort(-int32(qinfo->ZoneOrSort)))
+ if (uint32 skill_id = SkillByQuestSort(-int32(qinfo->ZoneOrSort)))
{
if (qinfo->RequiredSkillId != skill_id)
{
- sLog->outErrorDb("Quest %u has `ZoneOrSort` = %i but `RequiredSkillId` does not have a corresponding value (%i).",
+ sLog->outErrorDb("Quest %u has `ZoneOrSort` = %i but `RequiredSkillId` does not have a corresponding value (%d).",
qinfo->GetQuestId(), qinfo->ZoneOrSort, skill_id);
//override, and force proper value here?
}
@@ -6721,9 +6721,15 @@ void ObjectMgr::LoadCorpses()
{
Field* fields = result->Fetch();
uint32 guid = fields[16].GetUInt32();
+ CorpseType type = CorpseType(fields[13].GetUInt8());
+ if (type >= MAX_CORPSE_TYPE)
+ {
+ sLog->outError("Corpse (guid: %u) have wrong corpse type (%u), not loading.", guid, type);
+ continue;
+ }
- Corpse* corpse = new Corpse();
- if (!corpse->LoadFromDB(guid, fields))
+ Corpse* corpse = new Corpse(type);
+ if (!corpse->LoadCorpseFromDB(guid, fields))
{
delete corpse;
continue;
@@ -8040,8 +8046,11 @@ bool ObjectMgr::AddGameTele(GameTele& tele)
m_GameTeleMap[new_id] = tele;
+ std::string safeName(tele.name);
+ WorldDatabase.EscapeString(safeName);
+
WorldDatabase.PExecute("INSERT INTO game_tele (id, position_x, position_y, position_z, orientation, map, name) VALUES (%u, %f, %f, %f, %f, %d, '%s')",
- new_id, tele.position_x, tele.position_y, tele.position_z, tele.orientation, tele.mapId, tele.name.c_str());
+ new_id, tele.position_x, tele.position_y, tele.position_z, tele.orientation, tele.mapId, safeName.c_str());
return true;
}
diff --git a/src/server/game/Grids/Grid.h b/src/server/game/Grids/Grid.h
index 448c4cb35fd..7e66cf1080a 100755
--- a/src/server/game/Grids/Grid.h
+++ b/src/server/game/Grids/Grid.h
@@ -100,7 +100,12 @@ class Grid
/** Returns the number of object within the grid.
*/
- unsigned int ActiveObjectsInGrid(void) const { return /*m_activeGridObjects.size()+*/i_objects.template Count<ACTIVE_OBJECT>(); }
+ //unsigned int ActiveObjectsInGrid(void) const { return i_objects.template Count<ACTIVE_OBJECT>(); }
+ template<class T>
+ uint32 GetWorldObjectCountInGrid() const
+ {
+ return i_objects.template Count<T>();
+ }
/** Inserts a container type object into the grid.
*/
diff --git a/src/server/game/Grids/GridStates.cpp b/src/server/game/Grids/GridStates.cpp
index 5f88516c9ac..4e63388c356 100755
--- a/src/server/game/Grids/GridStates.cpp
+++ b/src/server/game/Grids/GridStates.cpp
@@ -31,7 +31,7 @@ void ActiveState::Update(Map &m, NGridType &grid, GridInfo & info, const uint32
info.UpdateTimeTracker(t_diff);
if (info.getTimeTracker().Passed())
{
- if (grid.ActiveObjectsInGrid() == 0 && !m.ActiveObjectsNearGrid(grid))
+ if (!grid.GetWorldObjectCountInNGrid<Player>() && !m.ActiveObjectsNearGrid(grid))
{
ObjectGridStoper worker;
TypeContainerVisitor<ObjectGridStoper, GridTypeMapContainer> visitor(worker);
diff --git a/src/server/game/Grids/NGrid.h b/src/server/game/Grids/NGrid.h
index 97a47f7d272..c87fd7e6129 100755
--- a/src/server/game/Grids/NGrid.h
+++ b/src/server/game/Grids/NGrid.h
@@ -158,14 +158,28 @@ class NGrid
GetGridType(x, y).Visit(visitor);
}
- unsigned int ActiveObjectsInGrid(void) const
+ //This gets the player count in grid
+ //I disable this to avoid confusion (active object usually means something else)
+ /*
+ uint32 GetActiveObjectCountInGrid() const
{
- unsigned int count=0;
- for (unsigned int x=0; x < N; ++x)
- for (unsigned int y=0; y < N; ++y)
+ uint32 count = 0;
+ for (uint32 x = 0; x < N; ++x)
+ for (uint32 y = 0; y < N; ++y)
count += i_cells[x][y].ActiveObjectsInGrid();
return count;
}
+ */
+
+ template<class T>
+ uint32 GetWorldObjectCountInNGrid() const
+ {
+ uint32 count = 0;
+ for (uint32 x = 0; x < N; ++x)
+ for (uint32 y = 0; y < N; ++y)
+ count += i_cells[x][y].template GetWorldObjectCountInGrid<T>();
+ return count;
+ }
private:
uint32 i_gridId;
diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.cpp b/src/server/game/Grids/Notifiers/GridNotifiers.cpp
index ca61a82e840..99d402b4add 100755
--- a/src/server/game/Grids/Notifiers/GridNotifiers.cpp
+++ b/src/server/game/Grids/Notifiers/GridNotifiers.cpp
@@ -344,7 +344,7 @@ bool AnyDeadUnitObjectInRangeCheck::operator()(Creature* u)
bool AnyDeadUnitSpellTargetInRangeCheck::operator()(Player* u)
{
return AnyDeadUnitObjectInRangeCheck::operator()(u)
- && i_spellInfo->CheckTarget(i_searchObj, u, true)
+ && (i_spellInfo->CheckTarget(i_searchObj, u, true) == SPELL_CAST_OK)
&& i_searchObj->IsTargetMatchingCheck(u, i_check);
}
@@ -352,14 +352,14 @@ bool AnyDeadUnitSpellTargetInRangeCheck::operator()(Corpse* u)
{
Player* owner = ObjectAccessor::FindPlayer(u->GetOwnerGUID());
return owner && AnyDeadUnitObjectInRangeCheck::operator()(u)
- && i_spellInfo->CheckTarget(i_searchObj, owner, true)
+ && (i_spellInfo->CheckTarget(i_searchObj, owner, true) == SPELL_CAST_OK)
&& i_searchObj->IsTargetMatchingCheck(owner, i_check);
}
bool AnyDeadUnitSpellTargetInRangeCheck::operator()(Creature* u)
{
return AnyDeadUnitObjectInRangeCheck::operator()(u)
- && i_spellInfo->CheckTarget(i_searchObj, u, true)
+ && (i_spellInfo->CheckTarget(i_searchObj, u, true) == SPELL_CAST_OK)
&& i_searchObj->IsTargetMatchingCheck(u, i_check);
}
diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp
index 6311066f597..11175b13114 100755
--- a/src/server/game/Groups/Group.cpp
+++ b/src/server/game/Groups/Group.cpp
@@ -1121,6 +1121,7 @@ void Group::CountTheRoll(Rolls::iterator rollI, uint32 NumberOfPlayers)
roll->getLoot()->unlootedCount--;
ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(roll->itemid);
player->AutoStoreLoot(pProto->DisenchantID, LootTemplates_Disenchant, true);
+ player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL, 13262); // Disenchant
}
}
}
diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp
index 59c107bd40f..94fcbbdda25 100755
--- a/src/server/game/Guilds/Guild.cpp
+++ b/src/server/game/Guilds/Guild.cpp
@@ -1993,6 +1993,7 @@ bool Guild::Validate()
}
}
}
+
if (broken_ranks)
{
m_ranks.clear();
diff --git a/src/server/game/Mails/Mail.cpp b/src/server/game/Mails/Mail.cpp
index 6d54aacb311..e5de3e35956 100755
--- a/src/server/game/Mails/Mail.cpp
+++ b/src/server/game/Mails/Mail.cpp
@@ -171,6 +171,7 @@ void MailDraft::SendReturnToSender(uint32 sender_acc, uint32 sender_guid, uint32
void MailDraft::SendMailTo(SQLTransaction& trans, MailReceiver const& receiver, MailSender const& sender, MailCheckMask checked, uint32 deliver_delay)
{
Player* pReceiver = receiver.GetPlayer(); // can be NULL
+ Player* pSender = sObjectMgr->GetPlayerByLowGUID(sender.GetSenderId());
if (pReceiver)
prepareItems(pReceiver, trans); // generate mail template items
@@ -188,9 +189,12 @@ void MailDraft::SendMailTo(SQLTransaction& trans, MailReceiver const& receiver,
// mail from battlemaster (rewardmarks) should last only one day
else if (sender.GetMailMessageType() == MAIL_CREATURE && sBattlegroundMgr->GetBattleMasterBG(sender.GetSenderId()) != BATTLEGROUND_TYPE_NONE)
expire_delay = DAY;
- // default case: expire time if COD 3 days, if no COD 30 days
+ // default case: expire time if COD 3 days, if no COD 30 days (or 90 days if sender is a game master)
else
- expire_delay = (m_COD > 0) ? 3 * DAY : 30 * DAY;
+ if (m_COD)
+ expire_delay = 3 * DAY;
+ else
+ expire_delay = pSender && pSender->isGameMaster() ? 90 * DAY : 30 * DAY;
time_t expire_time = deliver_time + expire_delay;
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 13a47633b53..34a7b60bcbd 100755
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -30,6 +30,7 @@
#include "MapManager.h"
#include "ObjectMgr.h"
#include "Group.h"
+#include "LFGMgr.h"
union u_map_magic
{
@@ -58,7 +59,7 @@ Map::~Map()
while (!i_worldObjects.empty())
{
WorldObject* obj = *i_worldObjects.begin();
- ASSERT(obj->m_isWorldObject);
+ ASSERT(obj->IsWorldObject());
//ASSERT(obj->GetTypeId() == TYPEID_CORPSE);
obj->RemoveFromWorld();
obj->ResetMap();
@@ -237,7 +238,7 @@ template<class T>
void Map::AddToGrid(T* obj, Cell const& cell)
{
NGridType* grid = getNGrid(cell.GridX(), cell.GridY());
- if (obj->m_isWorldObject)
+ if (obj->IsWorldObject())
grid->GetGridType(cell.CellX(), cell.CellY()).template AddWorldObject<T>(obj);
else
grid->GetGridType(cell.CellX(), cell.CellY()).template AddGridObject<T>(obj);
@@ -247,7 +248,7 @@ template<>
void Map::AddToGrid(Creature* obj, Cell const& cell)
{
NGridType* grid = getNGrid(cell.GridX(), cell.GridY());
- if (obj->m_isWorldObject)
+ if (obj->IsWorldObject())
grid->GetGridType(cell.CellX(), cell.CellY()).AddWorldObject(obj);
else
grid->GetGridType(cell.CellX(), cell.CellY()).AddGridObject(obj);
@@ -255,9 +256,9 @@ void Map::AddToGrid(Creature* obj, Cell const& cell)
obj->SetCurrentCell(cell);
}
-template<class T>
-void Map::SwitchGridContainers(T* obj, bool on)
+void Map::SwitchGridContainers(Creature* obj, bool on)
{
+ ASSERT(!obj->IsPermanentWorldObject());
CellCoord p = Trinity::ComputeCellCoord(obj->GetPositionX(), obj->GetPositionY());
if (!p.IsCoordValid())
{
@@ -277,15 +278,18 @@ void Map::SwitchGridContainers(T* obj, bool on)
obj->RemoveFromGrid(); //This step is not really necessary but we want to do ASSERT in remove/add
if (on)
- grid.AddWorldObject<T>(obj);
+ {
+ grid.AddWorldObject(obj);
+ AddWorldObject(obj);
+ }
else
- grid.AddGridObject<T>(obj);
- obj->m_isWorldObject = on;
+ {
+ grid.AddGridObject(obj);
+ RemoveWorldObject(obj);
+ }
+ obj->m_isTempWorldObject = on;
}
-template void Map::SwitchGridContainers(Creature*, bool);
-//template void Map::SwitchGridContainers(DynamicObject*, bool);
-
template<class T>
void Map::DeleteFromWorld(T* obj)
{
@@ -685,8 +689,7 @@ void Map::RemoveFromMap(T *obj, bool remove)
}
}
-void
-Map::PlayerRelocation(Player* player, float x, float y, float z, float orientation)
+void Map::PlayerRelocation(Player* player, float x, float y, float z, float orientation)
{
ASSERT(player);
@@ -710,8 +713,7 @@ Map::PlayerRelocation(Player* player, float x, float y, float z, float orientati
player->UpdateObjectVisibility(false);
}
-void
-Map::CreatureRelocation(Creature* creature, float x, float y, float z, float ang, bool respawnRelocationOnFail)
+void Map::CreatureRelocation(Creature* creature, float x, float y, float z, float ang, bool respawnRelocationOnFail)
{
ASSERT(CheckGridIntegrity(creature, false));
@@ -910,8 +912,15 @@ bool Map::UnloadGrid(NGridType& ngrid, bool unloadAll)
const uint32 y = ngrid.getY();
{
- if (!unloadAll && ActiveObjectsNearGrid(ngrid))
- return false;
+ if (!unloadAll)
+ {
+ //pets, possessed creatures (must be active), transport passengers
+ if (ngrid.GetWorldObjectCountInNGrid<Creature>())
+ return false;
+
+ if (ActiveObjectsNearGrid(ngrid))
+ return false;
+ }
sLog->outDebug(LOG_FILTER_MAPS, "Unloading grid[%u, %u] for map %u", x, y, GetId());
@@ -1161,7 +1170,7 @@ bool GridMap::loadHeihgtData(FILE* in, uint32 offset, uint32 /*size*/)
return true;
}
-bool GridMap::loadLiquidData(FILE* in, uint32 offset, uint32 /*size*/)
+bool GridMap::loadLiquidData(FILE* in, uint32 offset, uint32 /*size*/)
{
map_liquidHeader header;
fseek(in, offset, SEEK_SET);
@@ -1203,12 +1212,12 @@ uint16 GridMap::getArea(float x, float y)
return m_area_map[lx*16 + ly];
}
-float GridMap::getHeightFromFlat(float /*x*/, float /*y*/) const
+float GridMap::getHeightFromFlat(float /*x*/, float /*y*/) const
{
return m_gridHeight;
}
-float GridMap::getHeightFromFloat(float x, float y) const
+float GridMap::getHeightFromFloat(float x, float y) const
{
if (!m_V8 || !m_V9)
return m_gridHeight;
@@ -1290,7 +1299,7 @@ float GridMap::getHeightFromFloat(float x, float y) const
return a * x + b * y + c;
}
-float GridMap::getHeightFromUint8(float x, float y) const
+float GridMap::getHeightFromUint8(float x, float y) const
{
if (!m_uint8_V8 || !m_uint8_V9)
return m_gridHeight;
@@ -1357,7 +1366,7 @@ float GridMap::getHeightFromUint8(float x, float y) const
return (float)((a * x) + (b * y) + c)*m_gridIntHeightMultiplier + m_gridHeight;
}
-float GridMap::getHeightFromUint16(float x, float y) const
+float GridMap::getHeightFromUint16(float x, float y) const
{
if (!m_uint16_V8 || !m_uint16_V9)
return m_gridHeight;
@@ -1424,7 +1433,7 @@ float GridMap::getHeightFromUint16(float x, float y) const
return (float)((a * x) + (b * y) + c)*m_gridIntHeightMultiplier + m_gridHeight;
}
-float GridMap::getLiquidLevel(float x, float y)
+float GridMap::getLiquidLevel(float x, float y)
{
if (!m_liquid_map)
return m_liquidLevel;
@@ -1443,7 +1452,7 @@ float GridMap::getLiquidLevel(float x, float y)
return m_liquid_map[cx_int*m_liquid_width + cy_int];
}
-uint8 GridMap::getTerrainType(float x, float y)
+uint8 GridMap::getTerrainType(float x, float y)
{
if (!m_liquid_type)
return 0;
@@ -1530,41 +1539,28 @@ inline GridMap* Map::GetGrid(float x, float y)
return GridMaps[gx][gy];
}
-float Map::GetHeight(float x, float y, float z, bool pUseVmaps, float maxSearchDist) const
+float Map::GetHeight(float x, float y, float z, bool checkVMap /*= true*/, float maxSearchDist /*= DEFAULT_HEIGHT_SEARCH*/) const
{
// find raw .map surface under Z coordinates
- float mapHeight;
+ float mapHeight = VMAP_INVALID_HEIGHT_VALUE;
if (GridMap* gmap = const_cast<Map*>(this)->GetGrid(x, y))
{
- float _mapheight = gmap->getHeight(x, y);
-
+ float gridHeight = gmap->getHeight(x, y);
// look from a bit higher pos to find the floor, ignore under surface case
- if (z + 2.0f > _mapheight)
- mapHeight = _mapheight;
- else
- mapHeight = VMAP_INVALID_HEIGHT_VALUE;
+ if (z + 2.0f > gridHeight)
+ mapHeight = gridHeight;
}
- else
- mapHeight = VMAP_INVALID_HEIGHT_VALUE;
- float vmapHeight;
- if (pUseVmaps)
+ float vmapHeight = VMAP_INVALID_HEIGHT_VALUE;
+ if (checkVMap)
{
VMAP::IVMapManager* vmgr = VMAP::VMapFactory::createOrGetVMapManager();
if (vmgr->isHeightCalcEnabled())
- {
- // look from a bit higher pos to find the floor
- vmapHeight = vmgr->getHeight(GetId(), x, y, z + 2.0f, maxSearchDist);
- }
- else
- vmapHeight = VMAP_INVALID_HEIGHT_VALUE;
+ vmapHeight = vmgr->getHeight(GetId(), x, y, z + 2.0f, maxSearchDist); // look from a bit higher pos to find the floor
}
- else
- vmapHeight = VMAP_INVALID_HEIGHT_VALUE;
// mapHeight set for any above raw ground Z or <= INVALID_HEIGHT
// vmapheight set for any under Z value or <= INVALID_HEIGHT
-
if (vmapHeight > INVALID_HEIGHT)
{
if (mapHeight > INVALID_HEIGHT)
@@ -1581,15 +1577,8 @@ float Map::GetHeight(float x, float y, float z, bool pUseVmaps, float maxSearchD
else
return vmapHeight; // we have only vmapHeight (if have)
}
- else
- {
- if (!pUseVmaps)
- return mapHeight; // explicitly use map data (if have)
- else if (mapHeight > INVALID_HEIGHT && (z < mapHeight + 2 || z == MAX_HEIGHT))
- return mapHeight; // explicitly use map data if original z < mapHeight but map found (z+2 > mapHeight)
- else
- return VMAP_INVALID_HEIGHT_VALUE; // we not have any height
- }
+
+ return mapHeight; // explicitly use map data
}
inline bool IsOutdoorWMO(uint32 mogpFlags, int32 /*adtId*/, int32 /*rootId*/, int32 /*groupId*/, WMOAreaTableEntry const* wmoEntry, AreaTableEntry const* atEntry)
@@ -1826,7 +1815,7 @@ bool Map::CheckGridIntegrity(Creature* c, bool moved) const
return true;
}
-const char* Map::GetMapName() const
+char const* Map::GetMapName() const
{
return i_mapEntry ? i_mapEntry->name[sWorld->GetDefaultDbcLocale()] : "UNNAMEDMAP\x0";
}
@@ -1996,15 +1985,8 @@ void Map::RemoveAllObjectsInRemoveList()
bool on = itr->second;
i_objectsToSwitch.erase(itr);
- switch (obj->GetTypeId())
- {
- case TYPEID_UNIT:
- if (!obj->ToCreature()->isPet())
- SwitchGridContainers(obj->ToCreature(), on);
- break;
- default:
- break;
- }
+ if (obj->GetTypeId() == TYPEID_UNIT && !obj->IsPermanentWorldObject())
+ SwitchGridContainers(obj->ToCreature(), on);
}
//sLog->outDebug(LOG_FILTER_MAPS, "Object remover 1 check.");
@@ -2340,6 +2322,13 @@ bool InstanceMap::AddPlayerToMap(Player* player)
ASSERT(playerBind->save == mapSave);
}
}
+
+ if (group && group->isLFGGroup())
+ if (uint32 dungeonId = sLFGMgr->GetDungeon(group->GetGUID(), true))
+ if (LFGDungeonEntry const* dungeon = sLFGDungeonStore.LookupEntry(dungeonId))
+ if (LFGDungeonEntry const* randomDungeon = sLFGDungeonStore.LookupEntry(*(sLFGMgr->GetSelectedDungeons(player->GetGUID()).begin())))
+ if (dungeon->map == GetId() && dungeon->difficulty == GetDifficulty() && randomDungeon->type == LFG_TYPE_RANDOM)
+ player->CastSpell(player, LFG_SPELL_LUCK_OF_THE_DRAW, true);
}
// for normal instances cancel the reset schedule when the
@@ -2623,20 +2612,17 @@ void BattlegroundMap::RemoveAllPlayers()
player->TeleportTo(player->GetBattlegroundEntryPoint());
}
-Creature*
-Map::GetCreature(uint64 guid)
+Creature* Map::GetCreature(uint64 guid)
{
return ObjectAccessor::GetObjectInMap(guid, this, (Creature*)NULL);
}
-GameObject*
-Map::GetGameObject(uint64 guid)
+GameObject* Map::GetGameObject(uint64 guid)
{
return ObjectAccessor::GetObjectInMap(guid, this, (GameObject*)NULL);
}
-DynamicObject*
-Map::GetDynamicObject(uint64 guid)
+DynamicObject* Map::GetDynamicObject(uint64 guid)
{
return ObjectAccessor::GetObjectInMap(guid, this, (DynamicObject*)NULL);
}
diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h
index 5b652a2524a..542d9119830 100755
--- a/src/server/game/Maps/Map.h
+++ b/src/server/game/Maps/Map.h
@@ -296,7 +296,7 @@ class Map : public GridRefManager<NGridType>
// some calls like isInWater should not use vmaps due to processor power
// can return INVALID_HEIGHT if under z+2 z coord not found height
- float GetHeight(float x, float y, float z, bool pCheckVMap=true, float maxSearchDist=DEFAULT_HEIGHT_SEARCH) const;
+ float GetHeight(float x, float y, float z, bool checkVMap = true, float maxSearchDist = DEFAULT_HEIGHT_SEARCH) const;
ZLiquidStatus getLiquidStatus(float x, float y, float z, uint8 ReqLiquidType, LiquidData* data = 0) const;
@@ -405,7 +405,7 @@ class Map : public GridRefManager<NGridType>
void RemoveFromActive(Creature* obj);
- template<class T> void SwitchGridContainers(T* obj, bool active);
+ void SwitchGridContainers(Creature* creature, bool toWorldContainer);
template<class NOTIFIER> void VisitAll(const float &x, const float &y, float radius, NOTIFIER &notifier);
template<class NOTIFIER> void VisitFirstFound(const float &x, const float &y, float radius, NOTIFIER &notifier);
template<class NOTIFIER> void VisitWorld(const float &x, const float &y, float radius, NOTIFIER &notifier);
diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h
index ffdf0131143..a5935e1de9f 100755
--- a/src/server/game/Miscellaneous/Language.h
+++ b/src/server/game/Miscellaneous/Language.h
@@ -42,8 +42,8 @@ enum TrinityStrings
LANG_GMS_ON_SRV = 16,
LANG_GMS_NOT_LOGGED = 17,
LANG_YOU_IN_FLIGHT = 18,
- //LANG_YOU_IN_BATTLEGROUND = 19, not used
- //LANG_TARGET_IN_FLIGHT = 20, not used
+ LANG_UPDATE_DIFF = 19,
+ LANG_SHUTDOWN_TIMELEFT = 20,
LANG_CHAR_IN_FLIGHT = 21,
LANG_CHAR_NON_MOUNTED = 22,
LANG_YOU_IN_COMBAT = 23,
@@ -946,8 +946,9 @@ enum TrinityStrings
LANG_GOINFO_NAME = 5027,
LANG_GOINFO_LOOTID = 5028,
LANG_COMMAND_LOOKUP_MAX_RESULTS = 5029,
- // Room for more Trinity strings 5030-9999
LANG_FLEE = 5030,
+ LANG_NPCINFO_AIINFO = 5031,
+ // Room for more Trinity strings 5032-9999
// Level requirement notifications
LANG_SAY_REQ = 6604,
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h
index a99d0f37c02..952df731c19 100755
--- a/src/server/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
@@ -312,13 +312,13 @@ enum SpellAttr1
SPELL_ATTR1_MELEE_COMBAT_START = 0x00000200, // 9 player starts melee combat after this spell is cast
SPELL_ATTR1_NO_THREAT = 0x00000400, // 10 no generates threat on cast 100% (old NO_INITIAL_AGGRO)
SPELL_ATTR1_UNK11 = 0x00000800, // 11 aura
- SPELL_ATTR1_UNK12 = 0x00001000, // 12
+ SPELL_ATTR1_UNK12 = 0x00001000, // 12 pickpoket
SPELL_ATTR1_FARSIGHT = 0x00002000, // 13 Client removes farsight on aura loss
SPELL_ATTR1_CHANNEL_TRACK_TARGET = 0x00004000, // 14 Client automatically forces player to face target when channeling
SPELL_ATTR1_DISPEL_AURAS_ON_IMMUNITY = 0x00008000, // 15 remove auras on immunity
SPELL_ATTR1_UNAFFECTED_BY_SCHOOL_IMMUNE = 0x00010000, // 16 on immuniy
SPELL_ATTR1_UNAUTOCASTABLE_BY_PET = 0x00020000, // 17
- SPELL_ATTR1_UNK18 = 0x00040000, // 18
+ SPELL_ATTR1_UNK18 = 0x00040000, // 18 stun, polymorph, daze, hex
SPELL_ATTR1_CANT_TARGET_SELF = 0x00080000, // 19
SPELL_ATTR1_REQ_COMBO_POINTS1 = 0x00100000, // 20 Req combo points on target
SPELL_ATTR1_UNK21 = 0x00200000, // 21
@@ -327,17 +327,17 @@ enum SpellAttr1
SPELL_ATTR1_UNK24 = 0x01000000, // 24 only fishing spells
SPELL_ATTR1_UNK25 = 0x02000000, // 25
SPELL_ATTR1_UNK26 = 0x04000000, // 26 works correctly with [target=focus] and [target=mouseover] macros?
- SPELL_ATTR1_UNK27 = 0x08000000, // 27
+ SPELL_ATTR1_UNK27 = 0x08000000, // 27 melee spell?
SPELL_ATTR1_DONT_DISPLAY_IN_AURA_BAR = 0x10000000, // 28 client doesn't display these spells in aura bar
SPELL_ATTR1_CHANNEL_DISPLAY_SPELL_NAME = 0x20000000, // 29 spell name is displayed in cast bar instead of 'channeling' text
- SPELL_ATTR1_ENABLE_AT_DODGE = 0x40000000, // 30 Overpower, Wolverine Bite
+ SPELL_ATTR1_ENABLE_AT_DODGE = 0x40000000, // 30 Overpower
SPELL_ATTR1_UNK31 = 0x80000000 // 31
};
enum SpellAttr2
{
SPELL_ATTR2_CAN_TARGET_DEAD = 0x00000001, // 0 can target dead unit or corpse
- SPELL_ATTR2_UNK1 = 0x00000002, // 1 ? many triggered spells have this flag
+ SPELL_ATTR2_UNK1 = 0x00000002, // 1 vanish, shadowform, Ghost Wolf and other
SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS = 0x00000004, // 2 26368 4.0.1 dbc change
SPELL_ATTR2_UNK3 = 0x00000008, // 3
SPELL_ATTR2_DISPLAY_IN_STANCE_BAR = 0x00000010, // 4 client displays icon in stance bar when learned, even if not shapeshift
@@ -346,9 +346,9 @@ enum SpellAttr2
SPELL_ATTR2_UNK7 = 0x00000080, // 7
SPELL_ATTR2_UNK8 = 0x00000100, // 8 not set in 3.0.3
SPELL_ATTR2_UNK9 = 0x00000200, // 9
- SPELL_ATTR2_UNK10 = 0x00000400, // 10
+ SPELL_ATTR2_UNK10 = 0x00000400, // 10 related to tame
SPELL_ATTR2_HEALTH_FUNNEL = 0x00000800, // 11
- SPELL_ATTR2_UNK12 = 0x00001000, // 12
+ SPELL_ATTR2_UNK12 = 0x00001000, // 12 Cleave, Heart Strike, Maul, Sunder Armor, Swipe
SPELL_ATTR2_UNK13 = 0x00002000, // 13 Items enchanted by spells with this flag preserve the enchant to arenas
SPELL_ATTR2_UNK14 = 0x00004000, // 14
SPELL_ATTR2_UNK15 = 0x00008000, // 15 not set in 3.0.3
@@ -358,13 +358,13 @@ enum SpellAttr2
SPELL_ATTR2_NOT_NEED_SHAPESHIFT = 0x00080000, // 19 does not necessarly need shapeshift
SPELL_ATTR2_UNK20 = 0x00100000, // 20
SPELL_ATTR2_DAMAGE_REDUCED_SHIELD = 0x00200000, // 21 for ice blocks, pala immunity buffs, priest absorb shields, but used also for other spells -> not sure!
- SPELL_ATTR2_UNK22 = 0x00400000, // 22
+ SPELL_ATTR2_UNK22 = 0x00400000, // 22 Ambush, Backstab, Cheap Shot, Death Grip, Garrote, Judgements, Mutilate, Pounce, Ravage, Shiv, Shred
SPELL_ATTR2_UNK23 = 0x00800000, // 23 Only mage Arcane Concentration have this flag
SPELL_ATTR2_UNK24 = 0x01000000, // 24
SPELL_ATTR2_UNK25 = 0x02000000, // 25
SPELL_ATTR2_UNK26 = 0x04000000, // 26 unaffected by school immunity
SPELL_ATTR2_UNK27 = 0x08000000, // 27
- SPELL_ATTR2_UNK28 = 0x10000000, // 28 no breaks stealth if it fails??
+ SPELL_ATTR2_UNK28 = 0x10000000, // 28
SPELL_ATTR2_CANT_CRIT = 0x20000000, // 29 Spell can't crit
SPELL_ATTR2_TRIGGERED_CAN_TRIGGER_PROC = 0x40000000, // 30 spell can trigger even if triggered
SPELL_ATTR2_FOOD_BUFF = 0x80000000 // 31 Food or Drink Buff (like Well Fed)
@@ -393,7 +393,7 @@ enum SpellAttr3
SPELL_ATTR3_IGNORE_HIT_RESULT = 0x00040000, // 18 Spell should always hit its target
SPELL_ATTR3_DISABLE_PROC = 0x00080000, // 19 during aura proc no spells can trigger (20178, 20375)
SPELL_ATTR3_DEATH_PERSISTENT = 0x00100000, // 20 Death persistent spells
- SPELL_ATTR3_UNK21 = 0x00200000, // 21
+ SPELL_ATTR3_UNK21 = 0x00200000, // 21 unused
SPELL_ATTR3_REQ_WAND = 0x00400000, // 22 Req wand
SPELL_ATTR3_UNK23 = 0x00800000, // 23
SPELL_ATTR3_REQ_OFFHAND = 0x01000000, // 24 Req offhand weapon
@@ -417,7 +417,7 @@ enum SpellAttr4
SPELL_ATTR4_NOT_STEALABLE = 0x00000040, // 6 although such auras might be dispellable, they cannot be stolen
SPELL_ATTR4_TRIGGERED = 0x00000080, // 7 spells forced to be triggered
SPELL_ATTR4_UNK8 = 0x00000100, // 8 ignores taken percent damage mods?
- SPELL_ATTR4_UNK9 = 0x00000200, // 9
+ SPELL_ATTR4_TRIGGER_ACTIVATE = 0x00000200, // 9 initially disabled / trigger activate from event (Execute, Riposte, Deep Freeze end other)
SPELL_ATTR4_SPELL_VS_EXTEND_COST = 0x00000400, // 10 Rogue Shiv have this flag
SPELL_ATTR4_UNK11 = 0x00000800, // 11
SPELL_ATTR4_UNK12 = 0x00001000, // 12
@@ -427,16 +427,16 @@ enum SpellAttr4
SPELL_ATTR4_NOT_USABLE_IN_ARENA = 0x00010000, // 16
SPELL_ATTR4_USABLE_IN_ARENA = 0x00020000, // 17
SPELL_ATTR4_AREA_TARGET_CHAIN = 0x00040000, // 18 (NYI)hits area targets one after another instead of all at once
- SPELL_ATTR4_UNK19 = 0x00080000, // 19
+ SPELL_ATTR4_UNK19 = 0x00080000, // 19 proc dalayed, after damage or don't proc on absorb?
SPELL_ATTR4_NOT_CHECK_SELFCAST_POWER = 0x00100000, // 20 supersedes message "More powerful spell applied" for self casts.
- SPELL_ATTR4_UNK21 = 0x00200000, // 21
+ SPELL_ATTR4_UNK21 = 0x00200000, // 21 Pally aura, dk presence, dudu form, warrior stance, shadowform, hunter track
SPELL_ATTR4_UNK22 = 0x00400000, // 22
SPELL_ATTR4_UNK23 = 0x00800000, // 23
- SPELL_ATTR4_UNK24 = 0x01000000, // 24
+ SPELL_ATTR4_UNK24 = 0x01000000, // 24 some shoot spell
SPELL_ATTR4_UNK25 = 0x02000000, // 25 pet scaling auras
SPELL_ATTR4_CAST_ONLY_IN_OUTLAND = 0x04000000, // 26 Can only be used in Outland.
SPELL_ATTR4_UNK27 = 0x08000000, // 27
- SPELL_ATTR4_UNK28 = 0x10000000, // 28
+ SPELL_ATTR4_UNK28 = 0x10000000, // 28 Aimed Shot
SPELL_ATTR4_UNK29 = 0x20000000, // 29
SPELL_ATTR4_UNK30 = 0x40000000, // 30
SPELL_ATTR4_UNK31 = 0x80000000 // 31
@@ -456,7 +456,7 @@ enum SpellAttr5
SPELL_ATTR5_START_PERIODIC_AT_APPLY = 0x00000200, // 9 begin periodic tick at aura apply
SPELL_ATTR5_HIDE_DURATION = 0x00000400, // 10 do not send duration to client
SPELL_ATTR5_ALLOW_TARGET_OF_TARGET_AS_TARGET = 0x00000800, // 11 (NYI) uses target's target as target if original target not valid (intervene for example)
- SPELL_ATTR5_UNK12 = 0x00001000, // 12
+ SPELL_ATTR5_UNK12 = 0x00001000, // 12 Cleave related?
SPELL_ATTR5_HASTE_AFFECT_DURATION = 0x00002000, // 13 haste effects decrease duration of this
SPELL_ATTR5_UNK14 = 0x00004000, // 14
SPELL_ATTR5_UNK15 = 0x00008000, // 15
@@ -470,7 +470,7 @@ enum SpellAttr5
SPELL_ATTR5_UNK23 = 0x00800000, // 23
SPELL_ATTR5_UNK24 = 0x01000000, // 24
SPELL_ATTR5_UNK25 = 0x02000000, // 25
- SPELL_ATTR5_UNK26 = 0x04000000, // 26
+ SPELL_ATTR5_UNK26 = 0x04000000, // 26 aoe related - Boulder, Cannon, Corpse Explosion, Fire Nova, Flames, Frost Bomb, Living Bomb, Seed of Corruption, Starfall, Thunder Clap, Volley
SPELL_ATTR5_UNK27 = 0x08000000, // 27
SPELL_ATTR5_UNK28 = 0x10000000, // 28
SPELL_ATTR5_UNK29 = 0x20000000, // 29
@@ -495,23 +495,23 @@ enum SpellAttr6
SPELL_ATTR6_CASTABLE_WHILE_ON_VEHICLE = 0x00001000, // 12 castable while caster is on vehicle
SPELL_ATTR6_CAN_TARGET_INVISIBLE = 0x00002000, // 13 ignore visibility requirement for spell target (phases, invisibility, etc.)
SPELL_ATTR6_UNK14 = 0x00004000, // 14
- SPELL_ATTR6_UNK15 = 0x00008000, // 15 not set in 3.0.3
+ SPELL_ATTR6_UNK15 = 0x00008000, // 15 only 54368, 67892
SPELL_ATTR6_UNK16 = 0x00010000, // 16
- SPELL_ATTR6_UNK17 = 0x00020000, // 17
+ SPELL_ATTR6_UNK17 = 0x00020000, // 17 Mount spell
SPELL_ATTR6_CAST_BY_CHARMER = 0x00040000, // 18 client won't allow to cast these spells when unit is not possessed && charmer of caster will be original caster
- SPELL_ATTR6_UNK19 = 0x00080000, // 19
- SPELL_ATTR6_UNK20 = 0x00100000, // 20
+ SPELL_ATTR6_UNK19 = 0x00080000, // 19 only 47488, 50782
+ SPELL_ATTR6_UNK20 = 0x00100000, // 20 only 58371, 62218
SPELL_ATTR6_CLIENT_UI_TARGET_EFFECTS = 0x00200000, // 21 it's only client-side attribute
- SPELL_ATTR6_UNK22 = 0x00400000, // 22
+ SPELL_ATTR6_UNK22 = 0x00400000, // 22 only 72054
SPELL_ATTR6_UNK23 = 0x00800000, // 23
SPELL_ATTR6_CAN_TARGET_UNTARGETABLE = 0x01000000, // 24
- SPELL_ATTR6_UNK25 = 0x02000000, // 25
- SPELL_ATTR6_UNK26 = 0x04000000, // 26
+ SPELL_ATTR6_UNK25 = 0x02000000, // 25 Exorcism, Flash of Light
+ SPELL_ATTR6_UNK26 = 0x04000000, // 26 related to player castable positive buff
SPELL_ATTR6_UNK27 = 0x08000000, // 27
- SPELL_ATTR6_UNK28 = 0x10000000, // 28
+ SPELL_ATTR6_UNK28 = 0x10000000, // 28 Death Grip
SPELL_ATTR6_NO_DONE_PCT_DAMAGE_MODS = 0x20000000, // 29 ignores done percent damage mods?
SPELL_ATTR6_UNK30 = 0x40000000, // 30
- SPELL_ATTR6_UNK31 = 0x80000000 // 31 some special cooldown calc?
+ SPELL_ATTR6_UNK31 = 0x80000000 // 31 some special cooldown calc? only 2894
};
enum SpellAttr7
@@ -520,7 +520,7 @@ enum SpellAttr7
SPELL_ATTR7_UNK1 = 0x00000002, // 1 Not set in 3.2.2a.
SPELL_ATTR7_REACTIVATE_AT_RESURRECT = 0x00000004, // 2 Paladin's auras and 65607 only.
SPELL_ATTR7_IS_CHEAT_SPELL = 0x00000008, // 3 Cannot cast if caster doesn't have UnitFlag2 & UNIT_FLAG2_ALLOW_CHEAT_SPELLS
- SPELL_ATTR7_UNK4 = 0x00000010, // 4 Only 66109 test spell.
+ SPELL_ATTR7_UNK4 = 0x00000010, // 4 Only 47883 (Soulstone Resurrection) and test spell.
SPELL_ATTR7_SUMMON_PLAYER_TOTEM = 0x00000020, // 5 Only Shaman player totems.
SPELL_ATTR7_UNK6 = 0x00000040, // 6 Dark Surge, Surge of Light, Burning Breath triggers (boss spells).
SPELL_ATTR7_UNK7 = 0x00000080, // 7 66218 (Launch) spell.
@@ -536,18 +536,18 @@ enum SpellAttr7
SPELL_ATTR7_UNK17 = 0x00020000, // 17 Only 27965 (Suicide) spell.
SPELL_ATTR7_HAS_CHARGE_EFFECT = 0x00040000, // 18 Only spells that have Charge among effects.
SPELL_ATTR7_ZONE_TELEPORT = 0x00080000, // 19 Teleports to specific zones.
- SPELL_ATTR7_UNK20 = 0x00100000, // 20
- SPELL_ATTR7_UNK21 = 0x00200000, // 21
+ SPELL_ATTR7_UNK20 = 0x00100000, // 20 Blink, Divine Shield, Ice Block
+ SPELL_ATTR7_UNK21 = 0x00200000, // 21 Not set
SPELL_ATTR7_UNK22 = 0x00400000, // 22
- SPELL_ATTR7_UNK23 = 0x00800000, // 23
- SPELL_ATTR7_UNK24 = 0x01000000, // 24
+ SPELL_ATTR7_UNK23 = 0x00800000, // 23 Motivate, Mutilate, Shattering Throw
+ SPELL_ATTR7_UNK24 = 0x01000000, // 24 Motivate, Mutilate, Perform Speech, Shattering Throw
SPELL_ATTR7_UNK25 = 0x02000000, // 25
SPELL_ATTR7_UNK26 = 0x04000000, // 26
- SPELL_ATTR7_UNK27 = 0x08000000, // 27
- SPELL_ATTR7_UNK28 = 0x10000000, // 28
- SPELL_ATTR7_UNK29 = 0x20000000, // 29
- SPELL_ATTR7_UNK30 = 0x40000000, // 30
- SPELL_ATTR7_UNK31 = 0x80000000 // 31
+ SPELL_ATTR7_UNK27 = 0x08000000, // 27 Not set
+ SPELL_ATTR7_UNK28 = 0x10000000, // 28 related to player positive buff
+ SPELL_ATTR7_UNK29 = 0x20000000, // 29 only 69028, 71237
+ SPELL_ATTR7_UNK30 = 0x40000000, // 30 Burning Determination, Divine Sacrifice, Earth Shield, Prayer of Mending
+ SPELL_ATTR7_UNK31 = 0x80000000 // 31 only 70769
};
#define MIN_TALENT_SPEC 0
diff --git a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp
index 5bd0a23207e..09af2303397 100755
--- a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp
@@ -47,11 +47,10 @@ template<>
void
RandomMovementGenerator<Creature>::_setRandomLocation(Creature &creature)
{
- float X, Y, Z, z, nx, ny, nz, ori, dist;
+ float X, Y, Z, nx, ny, nz, ori, dist;
creature.GetHomePosition(X, Y, Z, ori);
- z = creature.GetPositionZ();
Map const* map = creature.GetBaseMap();
// For 2D/3D system selection
diff --git a/src/server/game/Server/Protocol/Handlers/AuctionHouseHandler.cpp b/src/server/game/Server/Protocol/Handlers/AuctionHouseHandler.cpp
index 2f8a27740be..1710a387307 100755
--- a/src/server/game/Server/Protocol/Handlers/AuctionHouseHandler.cpp
+++ b/src/server/game/Server/Protocol/Handlers/AuctionHouseHandler.cpp
@@ -115,6 +115,8 @@ void WorldSession::SendAuctionOwnerNotification(AuctionEntry* auction)
//this void creates new auction and adds auction to some auctionhouse
void WorldSession::HandleAuctionSellItem(WorldPacket & recv_data)
{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_AUCTION_SELL_ITEM");
+
uint64 auctioneer, item;
uint32 etime, bid, buyout, count;
recv_data >> auctioneer;
@@ -253,6 +255,8 @@ void WorldSession::HandleAuctionSellItem(WorldPacket & recv_data)
//this function is called when client bids or buys out auction
void WorldSession::HandleAuctionPlaceBid(WorldPacket & recv_data)
{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_AUCTION_PLACE_BID");
+
uint64 auctioneer;
uint32 auctionId;
uint32 price;
@@ -374,6 +378,8 @@ void WorldSession::HandleAuctionPlaceBid(WorldPacket & recv_data)
//this void is called when auction_owner cancels his auction
void WorldSession::HandleAuctionRemoveItem(WorldPacket & recv_data)
{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_AUCTION_REMOVE_ITEM");
+
uint64 auctioneer;
uint32 auctionId;
recv_data >> auctioneer;
@@ -452,6 +458,8 @@ void WorldSession::HandleAuctionRemoveItem(WorldPacket & recv_data)
//called when player lists his bids
void WorldSession::HandleAuctionListBidderItems(WorldPacket & recv_data)
{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_AUCTION_LIST_BIDDER_ITEMS");
+
uint64 guid; //NPC guid
uint32 listfrom; //page of auctions
uint32 outbiddedCount; //count of outbidded auctions
@@ -469,6 +477,7 @@ void WorldSession::HandleAuctionListBidderItems(WorldPacket & recv_data)
if (!creature)
{
sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: HandleAuctionListBidderItems - Unit (GUID: %u) not found or you can't interact with him.", uint32(GUID_LOPART(guid)));
+ recv_data.rfinish();
return;
}
@@ -506,6 +515,8 @@ void WorldSession::HandleAuctionListBidderItems(WorldPacket & recv_data)
//this void sends player info about his auctions
void WorldSession::HandleAuctionListOwnerItems(WorldPacket & recv_data)
{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_AUCTION_LIST_OWNER_ITEMS");
+
uint32 listfrom;
uint64 guid;
@@ -541,6 +552,8 @@ void WorldSession::HandleAuctionListOwnerItems(WorldPacket & recv_data)
//this void is called when player clicks on search button
void WorldSession::HandleAuctionListItems(WorldPacket & recv_data)
{
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_AUCTION_LIST_ITEMS");
+
std::string searchedname;
uint8 levelmin, levelmax, usable;
uint32 listfrom, auctionSlotID, auctionMainCategory, auctionSubCategory, quality;
@@ -606,7 +619,7 @@ void WorldSession::HandleAuctionListItems(WorldPacket & recv_data)
void WorldSession::HandleAuctionListPendingSales(WorldPacket & recv_data)
{
- sLog->outDebug(LOG_FILTER_NETWORKIO, "CMSG_AUCTION_LIST_PENDING_SALES");
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_AUCTION_LIST_PENDING_SALES");
recv_data.read_skip<uint64>();
diff --git a/src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp b/src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp
index 83b9ab048ad..2a4e1c50ac5 100755
--- a/src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp
@@ -196,7 +196,7 @@ bool LoginQueryHolder::Initialize()
return res;
}
-void WorldSession::HandleCharEnum(QueryResult result)
+void WorldSession::HandleCharEnum(PreparedQueryResult result)
{
WorldPacket data(SMSG_CHAR_ENUM, 100); // we guess size
@@ -232,35 +232,16 @@ void WorldSession::HandleCharEnumOpcode(WorldPacket & /*recv_data*/)
CharacterDatabase.Execute(stmt);
/// get all the data necessary for loading all characters (along with their pets) on the account
- _charEnumCallback =
- CharacterDatabase.AsyncPQuery(
- !sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED) ?
- // ------- Query Without Declined Names --------
- // 0 1 2 3 4 5 6 7
- "SELECT characters.guid, characters.name, characters.race, characters.class, characters.gender, characters.playerBytes, characters.playerBytes2, characters.level, "
- // 8 9 10 11 12 13 14
- "characters.zone, characters.map, characters.position_x, characters.position_y, characters.position_z, guild_member.guildid, characters.playerFlags, "
- // 15 16 17 18 19 20
- "characters.at_login, character_pet.entry, character_pet.modelid, character_pet.level, characters.equipmentCache, character_banned.guid "
- "FROM characters LEFT JOIN character_pet ON characters.guid=character_pet.owner AND character_pet.slot='%u' "
- "LEFT JOIN guild_member ON characters.guid = guild_member.guid "
- "LEFT JOIN character_banned ON characters.guid = character_banned.guid AND character_banned.active = 1 "
- "WHERE characters.account = '%u' ORDER BY characters.guid"
- :
- // --------- Query With Declined Names ---------
- // 0 1 2 3 4 5 6 7
- "SELECT characters.guid, characters.name, characters.race, characters.class, characters.gender, characters.playerBytes, characters.playerBytes2, characters.level, "
- // 8 9 10 11 12 13 14
- "characters.zone, characters.map, characters.position_x, characters.position_y, characters.position_z, guild_member.guildid, characters.playerFlags, "
- // 15 16 17 18 19 20 21
- "characters.at_login, character_pet.entry, character_pet.modelid, character_pet.level, characters.equipmentCache, character_banned.guid, character_declinedname.genitive "
- "FROM characters LEFT JOIN character_pet ON characters.guid = character_pet.owner AND character_pet.slot='%u' "
- "LEFT JOIN character_declinedname ON characters.guid = character_declinedname.guid "
- "LEFT JOIN guild_member ON characters.guid = guild_member.guid "
- "LEFT JOIN character_banned ON characters.guid = character_banned.guid AND character_banned.active = 1 "
- "WHERE characters.account = '%u' ORDER BY characters.guid",
- PET_SAVE_AS_CURRENT, GetAccountId()
- );
+
+ if (sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED))
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_GET_ENUM_DECLINED_NAME);
+ else
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_GET_ENUM);
+
+ stmt->setUInt8(0, PET_SAVE_AS_CURRENT);
+ stmt->setUInt32(1, GetAccountId());
+
+ _charEnumCallback = CharacterDatabase.AsyncQuery(stmt);
}
void WorldSession::HandleCharCreateOpcode(WorldPacket & recv_data)
@@ -413,7 +394,7 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
This is much more efficient than synchronous requests on packet handler, and much less DoS prone.
It also prevents data syncrhonisation errors.
*/
- switch (createInfo->Stage)
+ switch (_charCreateCallback.GetStage())
{
case 0:
{
@@ -423,8 +404,7 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
data << uint8(CHAR_CREATE_NAME_IN_USE);
SendPacket(&data);
delete createInfo;
- _charCreateCallback.SetParam(NULL);
- _charCreateCallback.FreeResult();
+ _charCreateCallback.Reset();
return;
}
@@ -435,8 +415,7 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
_charCreateCallback.FreeResult();
_charCreateCallback.SetFutureResult(LoginDatabase.AsyncQuery(stmt));
-
- createInfo->Stage++;
+ _charCreateCallback.NextStage();
}
break;
case 1:
@@ -457,8 +436,7 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
data << uint8(CHAR_CREATE_ACCOUNT_LIMIT);
SendPacket(&data);
delete createInfo;
- _charCreateCallback.SetParam(NULL);
- _charCreateCallback.FreeResult();
+ _charCreateCallback.Reset();
return;
}
@@ -470,8 +448,7 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
_charCreateCallback.FreeResult();
_charCreateCallback.SetFutureResult(CharacterDatabase.AsyncQuery(stmt));
-
- createInfo->Stage++;
+ _charCreateCallback.NextStage();
}
break;
case 2:
@@ -487,8 +464,7 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
data << uint8(CHAR_CREATE_SERVER_LIMIT);
SendPacket(&data);
delete createInfo;
- _charCreateCallback.SetParam(NULL);
- _charCreateCallback.FreeResult();
+ _charCreateCallback.Reset();
return;
}
}
@@ -504,11 +480,11 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
stmt->setUInt32(0, GetAccountId());
stmt->setUInt32(1, (skipCinematics == 1 || createInfo->Class == CLASS_DEATH_KNIGHT) ? 10 : 1);
_charCreateCallback.SetFutureResult(CharacterDatabase.AsyncQuery(stmt));
- createInfo->Stage++;
+ _charCreateCallback.NextStage();
return;
}
- createInfo->Stage++;
+ _charCreateCallback.NextStage();
HandleCharCreateCallback(PreparedQueryResult(NULL), createInfo); // Will jump to case 3
}
break;
@@ -542,8 +518,7 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
data << uint8(CHAR_CREATE_UNIQUE_CLASS_LIMIT);
SendPacket(&data);
delete createInfo;
- _charCreateCallback.SetParam(NULL);
- _charCreateCallback.FreeResult();
+ _charCreateCallback.Reset();
return;
}
}
@@ -570,8 +545,7 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
data << uint8(CHAR_CREATE_PVP_TEAMS_VIOLATION);
SendPacket(&data);
delete createInfo;
- _charCreateCallback.SetParam(NULL);
- _charCreateCallback.FreeResult();
+ _charCreateCallback.Reset();
return;
}
}
@@ -603,8 +577,7 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
data << uint8(CHAR_CREATE_UNIQUE_CLASS_LIMIT);
SendPacket(&data);
delete createInfo;
- _charCreateCallback.SetParam(NULL);
- _charCreateCallback.FreeResult();
+ _charCreateCallback.Reset();
return;
}
}
@@ -625,8 +598,7 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
data << uint8(CHAR_CREATE_LEVEL_REQUIREMENT);
SendPacket(&data);
delete createInfo;
- _charCreateCallback.SetParam(NULL);
- _charCreateCallback.FreeResult();
+ _charCreateCallback.Reset();
return;
}
@@ -647,8 +619,7 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
data << uint8(CHAR_CREATE_ERROR);
SendPacket(&data);
delete createInfo;
- _charCreateCallback.SetParam(NULL);
- _charCreateCallback.FreeResult();
+ _charCreateCallback.Reset();
return;
}
@@ -689,8 +660,7 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte
sWorld->AddCharacterNameData(newChar.GetGUIDLow(), std::string(newChar.GetName()), newChar.getGender(), newChar.getRace(), newChar.getClass());
delete createInfo;
- _charCreateCallback.SetParam(NULL);
- _charCreateCallback.FreeResult();
+ _charCreateCallback.Reset();
}
break;
}
@@ -791,7 +761,7 @@ void WorldSession::HandlePlayerLoginOpcode(WorldPacket & recv_data)
_charLoginCallback = CharacterDatabase.DelayQueryHolder((SQLQueryHolder*)holder);
}
-void WorldSession::HandlePlayerLogin(LoginQueryHolder * holder)
+void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder)
{
uint64 playerGuid = holder->GetGuid();
@@ -997,7 +967,7 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder * holder)
pCurrChar->RemoveAtLoginFlag(AT_LOGIN_FIRST);
// show time before shutdown if shutdown planned.
- if (sWorld->IsShutdowning())
+ if (sWorld->IsShuttingDown())
sWorld->ShutdownMsg(true, pCurrChar);
if (sWorld->getBoolConfig(CONFIG_ALL_TAXI_PATHS))
@@ -1085,28 +1055,30 @@ void WorldSession::HandleSetFactionInactiveOpcode(WorldPacket & recv_data)
_player->GetReputationMgr().SetInactive(replistid, inactive);
}
-void WorldSession::HandleShowingHelmOpcode(WorldPacket & /*recv_data*/)
+void WorldSession::HandleShowingHelmOpcode(WorldPacket& recv_data)
{
sLog->outStaticDebug("CMSG_SHOWING_HELM for %s", _player->GetName());
+ recv_data.read_skip<uint8>(); // unknown, bool?
_player->ToggleFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_HELM);
}
-void WorldSession::HandleShowingCloakOpcode(WorldPacket & /*recv_data*/)
+void WorldSession::HandleShowingCloakOpcode(WorldPacket& recv_data)
{
sLog->outStaticDebug("CMSG_SHOWING_CLOAK for %s", _player->GetName());
+ recv_data.read_skip<uint8>(); // unknown, bool?
_player->ToggleFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_CLOAK);
}
void WorldSession::HandleCharRenameOpcode(WorldPacket& recv_data)
{
uint64 guid;
- std::string newname;
+ std::string newName;
recv_data >> guid;
- recv_data >> newname;
+ recv_data >> newName;
// prevent character rename to invalid name
- if (!normalizePlayerName(newname))
+ if (!normalizePlayerName(newName))
{
WorldPacket data(SMSG_CHAR_RENAME, 1);
data << uint8(CHAR_NAME_NO_NAME);
@@ -1114,7 +1086,7 @@ void WorldSession::HandleCharRenameOpcode(WorldPacket& recv_data)
return;
}
- uint8 res = ObjectMgr::CheckPlayerName(newname, true);
+ uint8 res = ObjectMgr::CheckPlayerName(newName, true);
if (res != CHAR_NAME_SUCCESS)
{
WorldPacket data(SMSG_CHAR_RENAME, 1);
@@ -1124,7 +1096,7 @@ void WorldSession::HandleCharRenameOpcode(WorldPacket& recv_data)
}
// check name limitations
- if (AccountMgr::IsPlayerAccount(GetSecurity()) && sObjectMgr->IsReservedName(newname))
+ if (AccountMgr::IsPlayerAccount(GetSecurity()) && sObjectMgr->IsReservedName(newName))
{
WorldPacket data(SMSG_CHAR_RENAME, 1);
data << uint8(CHAR_NAME_RESERVED);
@@ -1132,21 +1104,22 @@ void WorldSession::HandleCharRenameOpcode(WorldPacket& recv_data)
return;
}
- std::string escaped_newname = newname;
- CharacterDatabase.EscapeString(escaped_newname);
-
- // make sure that the character belongs to the current account, that rename at login is enabled
+ // Ensure that the character belongs to the current account, that rename at login is enabled
// and that there is no character with the desired new name
- _charRenameCallback.SetParam(newname);
- _charRenameCallback.SetFutureResult(
- CharacterDatabase.AsyncPQuery(
- "SELECT guid, name FROM characters WHERE guid = %d AND account = %d AND (at_login & %d) = %d AND NOT EXISTS (SELECT NULL FROM characters WHERE name = '%s')",
- GUID_LOPART(guid), GetAccountId(), AT_LOGIN_RENAME, AT_LOGIN_RENAME, escaped_newname.c_str()
- )
- );
+ _charRenameCallback.SetParam(newName);
+
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_GET_FREE_NAME);
+
+ stmt->setUInt32(0, GUID_LOPART(guid));
+ stmt->setUInt32(1, GetAccountId());
+ stmt->setUInt16(2, AT_LOGIN_RENAME);
+ stmt->setUInt16(3, AT_LOGIN_RENAME);
+ stmt->setString(4, newName);
+
+ _charRenameCallback.SetFutureResult(CharacterDatabase.AsyncQuery(stmt));
}
-void WorldSession::HandleChangePlayerNameOpcodeCallBack(QueryResult result, std::string newname)
+void WorldSession::HandleChangePlayerNameOpcodeCallBack(PreparedQueryResult result, std::string newName)
{
if (!result)
{
@@ -1156,22 +1129,38 @@ void WorldSession::HandleChangePlayerNameOpcodeCallBack(QueryResult result, std:
return;
}
- uint32 guidLow = result->Fetch()[0].GetUInt32();
+ Field* fields = result->Fetch();
+
+ uint32 guidLow = fields[0].GetUInt32();
+ std::string oldName = fields[1].GetString();
+
uint64 guid = MAKE_NEW_GUID(guidLow, 0, HIGHGUID_PLAYER);
- std::string oldname = result->Fetch()[1].GetString();
- CharacterDatabase.PExecute("UPDATE characters set name = '%s', at_login = at_login & ~ %u WHERE guid ='%u'", newname.c_str(), uint32(AT_LOGIN_RENAME), guidLow);
- CharacterDatabase.PExecute("DELETE FROM character_declinedname WHERE guid ='%u'", guidLow);
+ // Update name and at_login flag in the db
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPDATE_NAME);
+
+ stmt->setString(0, newName);
+ stmt->setUInt16(1, AT_LOGIN_RENAME);
+ stmt->setUInt32(2, guidLow);
- sLog->outChar("Account: %d (IP: %s) Character:[%s] (guid:%u) Changed name to: %s", GetAccountId(), GetRemoteAddress().c_str(), oldname.c_str(), guidLow, newname.c_str());
+ CharacterDatabase.Execute(stmt);
+
+ // Removed declined name from db
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_DECLINED_NAME);
- WorldPacket data(SMSG_CHAR_RENAME, 1+8+(newname.size()+1));
+ stmt->setUInt32(0, guidLow);
+
+ CharacterDatabase.Execute(stmt);
+
+ sLog->outChar("Account: %d (IP: %s) Character:[%s] (guid:%u) Changed name to: %s", GetAccountId(), GetRemoteAddress().c_str(), oldName.c_str(), guidLow, newName.c_str());
+
+ WorldPacket data(SMSG_CHAR_RENAME, 1+8+(newName.size()+1));
data << uint8(RESPONSE_SUCCESS);
data << uint64(guid);
- data << newname;
+ data << newName;
SendPacket(&data);
- sWorld->UpdateCharacterNameData(guidLow, newname);
+ sWorld->UpdateCharacterNameData(guidLow, newName);
}
void WorldSession::HandleSetPlayerDeclinedNames(WorldPacket& recv_data)
diff --git a/src/server/game/Server/Protocol/Handlers/CombatHandler.cpp b/src/server/game/Server/Protocol/Handlers/CombatHandler.cpp
index 31a09e830ff..e6c4499baab 100755
--- a/src/server/game/Server/Protocol/Handlers/CombatHandler.cpp
+++ b/src/server/game/Server/Protocol/Handlers/CombatHandler.cpp
@@ -23,13 +23,15 @@
#include "ObjectAccessor.h"
#include "CreatureAI.h"
#include "ObjectDefines.h"
+#include "Vehicle.h"
+#include "VehicleDefines.h"
-void WorldSession::HandleAttackSwingOpcode(WorldPacket & recv_data)
+void WorldSession::HandleAttackSwingOpcode(WorldPacket& recv_data)
{
uint64 guid;
recv_data >> guid;
- sLog->outStaticDebug("WORLD: Recvd CMSG_ATTACKSWING Message guidlow:%u guidhigh:%u", GUID_LOPART(guid), GUID_HIPART(guid));
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Recvd CMSG_ATTACKSWING Message guidlow:%u guidhigh:%u", GUID_LOPART(guid), GUID_HIPART(guid));
Unit* pEnemy = ObjectAccessor::GetUnit(*_player, guid);
@@ -47,6 +49,20 @@ void WorldSession::HandleAttackSwingOpcode(WorldPacket & recv_data)
return;
}
+ //! Client explicitly checks the following before sending CMSG_ATTACKSWING packet,
+ //! so we'll place the same check here. Note that it might be possible to reuse this snippet
+ //! in other places as well.
+ if (Vehicle* vehicle = _player->GetVehicle())
+ {
+ VehicleSeatEntry const* seat = vehicle->GetSeatForPassenger(_player);
+ ASSERT(seat);
+ if (!(seat->m_flags & VEHICLE_SEAT_FLAG_CAN_ATTACK))
+ {
+ SendAttackStop(pEnemy);
+ return;
+ }
+ }
+
_player->Attack(pEnemy, true);
}
@@ -55,7 +71,7 @@ void WorldSession::HandleAttackStopOpcode(WorldPacket & /*recv_data*/)
GetPlayer()->AttackStop();
}
-void WorldSession::HandleSetSheathedOpcode(WorldPacket & recv_data)
+void WorldSession::HandleSetSheathedOpcode(WorldPacket& recv_data)
{
uint32 sheathed;
recv_data >> sheathed;
@@ -79,4 +95,3 @@ void WorldSession::SendAttackStop(Unit const* enemy)
data << uint32(0); // unk, can be 1 also
SendPacket(&data);
}
-
diff --git a/src/server/game/Server/Protocol/Handlers/ItemHandler.cpp b/src/server/game/Server/Protocol/Handlers/ItemHandler.cpp
index f4e3af72892..4d323996de7 100755
--- a/src/server/game/Server/Protocol/Handlers/ItemHandler.cpp
+++ b/src/server/game/Server/Protocol/Handlers/ItemHandler.cpp
@@ -938,6 +938,7 @@ void WorldSession::HandleAutoBankItemOpcode(WorldPacket& recvPacket)
}
_player->RemoveItem(srcbag, srcslot, true);
+ _player->ItemRemovedQuestCheck(pItem->GetEntry(), pItem->GetCount());
_player->BankItem(dest, pItem, true);
}
@@ -965,6 +966,7 @@ void WorldSession::HandleAutoStoreBankItemOpcode(WorldPacket& recvPacket)
_player->RemoveItem(srcbag, srcslot, true);
_player->StoreItem(dest, pItem, true);
+ _player->ItemAddedQuestCheck(pItem->GetEntry(), pItem->GetCount());
}
else // moving from inventory to bank
{
diff --git a/src/server/game/Server/Protocol/Handlers/MiscHandler.cpp b/src/server/game/Server/Protocol/Handlers/MiscHandler.cpp
index 7327cdbba65..aef3bf03bd9 100755
--- a/src/server/game/Server/Protocol/Handlers/MiscHandler.cpp
+++ b/src/server/game/Server/Protocol/Handlers/MiscHandler.cpp
@@ -531,24 +531,23 @@ void WorldSession::HandleAddFriendOpcode(WorldPacket & recv_data)
if (!normalizePlayerName(friendName))
return;
- CharacterDatabase.EscapeString(friendName); // prevent SQL injection - normal name must not be changed by this call
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: %s asked to add friend : '%s'", GetPlayer()->GetName(), friendName.c_str());
- sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: %s asked to add friend : '%s'",
- GetPlayer()->GetName(), friendName.c_str());
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_GET_GUID_RACE_ACC_BY_NAME);
+
+ stmt->setString(0, friendName);
_addFriendCallback.SetParam(friendNote);
- _addFriendCallback.SetFutureResult(
- CharacterDatabase.AsyncPQuery("SELECT guid, race, account FROM characters WHERE name = '%s'", friendName.c_str())
- );
+ _addFriendCallback.SetFutureResult(CharacterDatabase.AsyncQuery(stmt));
}
-void WorldSession::HandleAddFriendOpcodeCallBack(QueryResult result, std::string friendNote)
+void WorldSession::HandleAddFriendOpcodeCallBack(PreparedQueryResult result, std::string friendNote)
{
if (!GetPlayer())
return;
uint64 friendGuid;
- uint32 friendAcctid;
+ uint32 friendAccountId;
uint32 team;
FriendsResult friendResult;
@@ -557,11 +556,13 @@ void WorldSession::HandleAddFriendOpcodeCallBack(QueryResult result, std::string
if (result)
{
- friendGuid = MAKE_NEW_GUID((*result)[0].GetUInt32(), 0, HIGHGUID_PLAYER);
- team = Player::TeamForRace((*result)[1].GetUInt8());
- friendAcctid = (*result)[2].GetUInt32();
+ Field* fields = result->Fetch();
+
+ friendGuid = MAKE_NEW_GUID(fields[0].GetUInt32(), 0, HIGHGUID_PLAYER);
+ team = Player::TeamForRace(fields[1].GetUInt8());
+ friendAccountId = fields[2].GetUInt32();
- if (!AccountMgr::IsPlayerAccount(GetSecurity()) || sWorld->getBoolConfig(CONFIG_ALLOW_GM_FRIEND) || AccountMgr::IsPlayerAccount(AccountMgr::GetSecurity(friendAcctid, realmID)))
+ if (!AccountMgr::IsPlayerAccount(GetSecurity()) || sWorld->getBoolConfig(CONFIG_ALLOW_GM_FRIEND) || AccountMgr::IsPlayerAccount(AccountMgr::GetSecurity(friendAccountId, realmID)))
{
if (friendGuid)
{
@@ -613,22 +614,24 @@ void WorldSession::HandleAddIgnoreOpcode(WorldPacket & recv_data)
{
sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_ADD_IGNORE");
- std::string IgnoreName = GetTrinityString(LANG_FRIEND_IGNORE_UNKNOWN);
+ std::string ignoreName = GetTrinityString(LANG_FRIEND_IGNORE_UNKNOWN);
- recv_data >> IgnoreName;
+ recv_data >> ignoreName;
- if (!normalizePlayerName(IgnoreName))
+ if (!normalizePlayerName(ignoreName))
return;
- CharacterDatabase.EscapeString(IgnoreName); // prevent SQL injection - normal name must not be changed by this call
-
sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: %s asked to Ignore: '%s'",
- GetPlayer()->GetName(), IgnoreName.c_str());
+ GetPlayer()->GetName(), ignoreName.c_str());
+
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_GET_GUID_BY_NAME);
+
+ stmt->setString(0, ignoreName);
- _addIgnoreCallback = CharacterDatabase.AsyncPQuery("SELECT guid FROM characters WHERE name = '%s'", IgnoreName.c_str());
+ _addIgnoreCallback = CharacterDatabase.AsyncQuery(stmt);
}
-void WorldSession::HandleAddIgnoreOpcodeCallBack(QueryResult result)
+void WorldSession::HandleAddIgnoreOpcodeCallBack(PreparedQueryResult result)
{
if (!GetPlayer())
return;
@@ -1607,7 +1610,7 @@ void WorldSession::HandleCancelMountAuraOpcode(WorldPacket & /*recv_data*/)
return;
}
- _player->Unmount();
+ _player->Dismount();
_player->RemoveAurasByType(SPELL_AURA_MOUNTED);
}
diff --git a/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp b/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp
index 4e45eb2d6c6..ae2612e4ced 100755
--- a/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp
+++ b/src/server/game/Server/Protocol/Handlers/MovementHandler.cpp
@@ -299,7 +299,7 @@ void WorldSession::HandleMovementOpcodes(WorldPacket & recv_data)
// if we boarded a transport, add us to it
if (plMover && !plMover->GetTransport())
{
- // elevators also cause the client to send MOVEMENTFLAG_ONTRANSPORT - just unmount if the guid can be found in the transport list
+ // elevators also cause the client to send MOVEMENTFLAG_ONTRANSPORT - just dismount if the guid can be found in the transport list
for (MapManager::TransportSet::const_iterator iter = sMapMgr->m_Transports.begin(); iter != sMapMgr->m_Transports.end(); ++iter)
{
if ((*iter)->GetGUID() == movementInfo.t_guid)
diff --git a/src/server/game/Server/Protocol/Handlers/NPCHandler.cpp b/src/server/game/Server/Protocol/Handlers/NPCHandler.cpp
index a675214930a..92f4a0380f9 100755
--- a/src/server/game/Server/Protocol/Handlers/NPCHandler.cpp
+++ b/src/server/game/Server/Protocol/Handlers/NPCHandler.cpp
@@ -618,39 +618,43 @@ void WorldSession::HandleStablePet(WorldPacket & recv_data)
return;
}
- _stablePetCallback = CharacterDatabase.AsyncPQuery("SELECT owner, slot, id FROM character_pet WHERE owner = '%u' AND slot >= '%u' AND slot <= '%u' ORDER BY slot ",
- _player->GetGUIDLow(), PET_SAVE_FIRST_STABLE_SLOT, PET_SAVE_LAST_STABLE_SLOT);
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_GET_PET_SLOTS);
+ stmt->setUInt32(0, _player->GetGUIDLow());
+ stmt->setUInt8(1, PET_SAVE_FIRST_STABLE_SLOT);
+ stmt->setUInt8(2, PET_SAVE_LAST_STABLE_SLOT);
+
+ _stablePetCallback = CharacterDatabase.AsyncQuery(stmt);
}
-void WorldSession::HandleStablePetCallback(QueryResult result)
+void WorldSession::HandleStablePetCallback(PreparedQueryResult result)
{
if (!GetPlayer())
return;
- uint32 free_slot = 1;
+ uint8 freeSlot = 1;
if (result)
{
do
{
Field* fields = result->Fetch();
- uint32 slot = fields[1].GetUInt32();
+ uint8 slot = fields[1].GetUInt8();
// slots ordered in query, and if not equal then free
- if (slot != free_slot)
+ if (slot != freeSlot)
break;
// this slot not free, skip
- ++free_slot;
+ ++freeSlot;
}
while (result->NextRow());
}
WorldPacket data(SMSG_STABLE_RESULT, 1);
- if (free_slot > 0 && free_slot <= GetPlayer()->m_stableSlots)
+ if (freeSlot > 0 && freeSlot <= GetPlayer()->m_stableSlots)
{
- _player->RemovePet(_player->GetPet(), PetSaveMode(free_slot));
+ _player->RemovePet(_player->GetPet(), PetSaveMode(freeSlot));
SendStableResult(STABLE_SUCCESS_STABLE);
}
else
@@ -801,7 +805,7 @@ void WorldSession::HandleStableSwapPet(WorldPacket & recv_data)
// find swapped pet slot in stable
_stableSwapCallback.SetParam(pet_number);
_stableSwapCallback.SetFutureResult(
- CharacterDatabase.PQuery("SELECT slot, entry FROM character_pet WHERE owner = '%u' AND id = '%u'",
+ CharacterDatabase.AsyncPQuery("SELECT slot, entry FROM character_pet WHERE owner = '%u' AND id = '%u'",
_player->GetGUIDLow(), pet_number)
);
}
@@ -878,19 +882,18 @@ void WorldSession::HandleRepairItemOpcode(WorldPacket & recv_data)
// reputation discount
float discountMod = _player->GetReputationPriceDiscount(unit);
- uint32 TotalCost = 0;
if (itemGUID)
{
sLog->outDebug(LOG_FILTER_NETWORKIO, "ITEM: Repair item, itemGUID = %u, npcGUID = %u", GUID_LOPART(itemGUID), GUID_LOPART(npcGUID));
Item* item = _player->GetItemByGuid(itemGUID);
if (item)
- TotalCost = _player->DurabilityRepair(item->GetPos(), true, discountMod, guildBank);
+ _player->DurabilityRepair(item->GetPos(), true, discountMod, guildBank);
}
else
{
sLog->outDebug(LOG_FILTER_NETWORKIO, "ITEM: Repair all items, npcGUID = %u", GUID_LOPART(npcGUID));
- TotalCost = _player->DurabilityRepairAll(true, discountMod, guildBank);
+ _player->DurabilityRepairAll(true, discountMod, guildBank);
}
}
diff --git a/src/server/game/Server/Protocol/Handlers/PetitionsHandler.cpp b/src/server/game/Server/Protocol/Handlers/PetitionsHandler.cpp
index a931d8a5b3d..2e9b88bd3f0 100755
--- a/src/server/game/Server/Protocol/Handlers/PetitionsHandler.cpp
+++ b/src/server/game/Server/Protocol/Handlers/PetitionsHandler.cpp
@@ -311,21 +311,17 @@ void WorldSession::SendPetitionQueryOpcode(uint64 petitionguid)
uint64 ownerguid = 0;
uint32 type;
std::string name = "NO_NAME_FOR_GUID";
- uint8 signs = 0;
- QueryResult result = CharacterDatabase.PQuery(
- "SELECT ownerguid, name, "
- " (SELECT COUNT(playerguid) FROM petition_sign WHERE petition_sign.petitionguid = '%u') AS signs, "
- " type "
- "FROM petition WHERE petitionguid = '%u'", GUID_LOPART(petitionguid), GUID_LOPART(petitionguid));
+ // TODO: Use CHAR_LOAD_PETITION PS
+ QueryResult result = CharacterDatabase.PQuery("SELECT ownerguid, name, type "
+ "FROM petition WHERE petitionguid = '%u'", GUID_LOPART(petitionguid));
if (result)
{
Field* fields = result->Fetch();
ownerguid = MAKE_NEW_GUID(fields[0].GetUInt32(), 0, HIGHGUID_PLAYER);
name = fields[1].GetString();
- signs = fields[2].GetUInt8();
- type = fields[3].GetUInt32();
+ type = fields[2].GetUInt32();
}
else
{
diff --git a/src/server/game/Server/Protocol/Handlers/QueryHandler.cpp b/src/server/game/Server/Protocol/Handlers/QueryHandler.cpp
index bf951619e63..042b1242a95 100755
--- a/src/server/game/Server/Protocol/Handlers/QueryHandler.cpp
+++ b/src/server/game/Server/Protocol/Handlers/QueryHandler.cpp
@@ -413,7 +413,10 @@ void WorldSession::HandleQuestPOIQuery(WorldPacket& recv_data)
recv_data >> count; // quest count, max=25
if (count >= MAX_QUEST_LOG_SIZE)
+ {
+ recv_data.rfinish();
return;
+ }
WorldPacket data(SMSG_QUEST_POI_QUERY_RESPONSE, 4+(4+4)*count);
data << uint32(count); // count
diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp
index 14c86286718..54d477abf69 100755
--- a/src/server/game/Server/WorldSession.cpp
+++ b/src/server/game/Server/WorldSession.cpp
@@ -222,7 +222,18 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
///- Retrieve packets from the receive queue and call the appropriate handlers
/// not process packets if socket already closed
WorldPacket* packet = NULL;
- while (m_Socket && !m_Socket->IsClosed() && _recvQueue.next(packet, updater))
+ //! Delete packet after processing by default
+ bool deletePacket = true;
+ //! To prevent infinite loop
+ WorldPacket* firstDelayedPacket = NULL;
+ //! If _recvQueue.peek() == firstDelayedPacket it means that in this Update call, we've processed all
+ //! *properly timed* packets, and we're now at the part of the queue where we find
+ //! delayed packets that were re-enqueued due to improper timing. To prevent an infinite
+ //! loop caused by re-enqueueing the same packets over and over again, we stop updating this session
+ //! and continue updating others. The re-enqueued packets will be handled in the next Update call for this session.
+ while (m_Socket && !m_Socket->IsClosed() &&
+ !_recvQueue.empty() && _recvQueue.peek(true) != firstDelayedPacket &&
+ _recvQueue.next(packet, updater))
{
if (packet->GetOpcode() >= NUM_MSG_TYPES)
{
@@ -240,8 +251,21 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
if (!_player)
{
// skip STATUS_LOGGEDIN opcode unexpected errors if player logout sometime ago - this can be network lag delayed packets
+ //! If player didn't log out a while ago, it means packets are being sent while the server does not recognize
+ //! the client to be in world yet. We will re-add the packets to the bottom of the queue and process them later.
if (!m_playerRecentlyLogout)
- LogUnexpectedOpcode(packet, "STATUS_LOGGEDIN", "the player has not logged in yet");
+ {
+ //! Prevent infinite loop
+ if (!firstDelayedPacket)
+ firstDelayedPacket = packet;
+ //! Because checking a bool is faster than reallocating memory
+ deletePacket = false;
+ QueuePacket(packet);
+ //! Log
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "Re-enqueueing packet with opcode %s (0x%.4X) with with status STATUS_LOGGEDIN. "
+ "Player is currently not in world yet.", opHandle.name, packet->GetOpcode());
+ }
+
}
else if (_player->IsInWorld())
{
@@ -258,7 +282,7 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
"the player has not logged in yet and not recently logout");
else
{
- // not expected _player or must checked in packet hanlder
+ // not expected _player or must checked in packet handler
sScriptMgr->OnPacketReceive(m_Socket, WorldPacket(*packet));
(this->*opHandle.handler)(*packet);
if (sLog->IsOutDebug() && packet->rpos() < packet->wpos())
@@ -308,7 +332,7 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
break;
}
}
- catch(ByteBufferException &)
+ catch (ByteBufferException &)
{
sLog->outError("WorldSession::Update ByteBufferException occured while parsing a packet (opcode: %u) from client %s, accountid=%i. Skipped packet.",
packet->GetOpcode(), GetRemoteAddress().c_str(), GetAccountId());
@@ -320,7 +344,8 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
}
}
- delete packet;
+ if (deletePacket)
+ delete packet;
}
ProcessQueryCallbacks();
@@ -344,6 +369,7 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
if (!m_Socket)
return false; //Will remove this session from the world session map
}
+
return true;
}
@@ -983,12 +1009,13 @@ void WorldSession::InitializeQueryCallbackParameters()
void WorldSession::ProcessQueryCallbacks()
{
QueryResult result;
+ PreparedQueryResult result2;
//! HandleCharEnumOpcode
if (_charEnumCallback.ready())
{
- _charEnumCallback.get(result);
- HandleCharEnum(result);
+ _charEnumCallback.get(result2);
+ HandleCharEnum(result2);
_charEnumCallback.cancel();
}
@@ -1013,8 +1040,8 @@ void WorldSession::ProcessQueryCallbacks()
if (_addFriendCallback.IsReady())
{
std::string param = _addFriendCallback.GetParam();
- _addFriendCallback.GetResult(result);
- HandleAddFriendOpcodeCallBack(result, param);
+ _addFriendCallback.GetResult(result2);
+ HandleAddFriendOpcodeCallBack(result2, param);
_addFriendCallback.FreeResult();
}
@@ -1022,16 +1049,16 @@ void WorldSession::ProcessQueryCallbacks()
if (_charRenameCallback.IsReady())
{
std::string param = _charRenameCallback.GetParam();
- _charRenameCallback.GetResult(result);
- HandleChangePlayerNameOpcodeCallBack(result, param);
+ _charRenameCallback.GetResult(result2);
+ HandleChangePlayerNameOpcodeCallBack(result2, param);
_charRenameCallback.FreeResult();
}
//- HandleCharAddIgnoreOpcode
if (_addIgnoreCallback.ready())
{
- _addIgnoreCallback.get(result);
- HandleAddIgnoreOpcodeCallBack(result);
+ _addIgnoreCallback.get(result2);
+ HandleAddIgnoreOpcodeCallBack(result2);
_addIgnoreCallback.cancel();
}
@@ -1047,8 +1074,8 @@ void WorldSession::ProcessQueryCallbacks()
//- HandleStablePet
if (_stablePetCallback.ready())
{
- _stablePetCallback.get(result);
- HandleStablePetCallback(result);
+ _stablePetCallback.get(result2);
+ HandleStablePetCallback(result2);
_stablePetCallback.cancel();
}
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 4a83c2d4092..d1f607704b9 100755
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -184,7 +184,7 @@ class CharacterCreateInfo
protected:
CharacterCreateInfo(std::string name, uint8 race, uint8 cclass, uint8 gender, uint8 skin, uint8 face, uint8 hairStyle, uint8 hairColor, uint8 facialHair, uint8 outfitId,
WorldPacket& data) : Name(name), Race(race), Class(cclass), Gender(gender), Skin(skin), Face(face), HairStyle(hairStyle), HairColor(hairColor), FacialHair(facialHair),
- OutfitId(outfitId), Data(data), CharCount(0), Stage(0)
+ OutfitId(outfitId), Data(data), CharCount(0)
{}
/// User specified variables
@@ -203,9 +203,6 @@ class CharacterCreateInfo
/// Server side data
uint8 CharCount;
- /// Internal
- uint8 Stage; // Stage of the callback chain
-
private:
virtual ~CharacterCreateInfo(){};
};
@@ -400,7 +397,7 @@ class WorldSession
void HandleCharCreateOpcode(WorldPacket& recvPacket);
void HandleCharCreateCallback(PreparedQueryResult result, CharacterCreateInfo* createInfo);
void HandlePlayerLoginOpcode(WorldPacket& recvPacket);
- void HandleCharEnum(QueryResult result);
+ void HandleCharEnum(PreparedQueryResult result);
void HandlePlayerLogin(LoginQueryHolder * holder);
void HandleCharFactionOrRaceChange(WorldPacket& recv_data);
@@ -469,10 +466,10 @@ class WorldSession
void HandleEmoteOpcode(WorldPacket& recvPacket);
void HandleContactListOpcode(WorldPacket& recvPacket);
void HandleAddFriendOpcode(WorldPacket& recvPacket);
- void HandleAddFriendOpcodeCallBack(QueryResult result, std::string friendNote);
+ void HandleAddFriendOpcodeCallBack(PreparedQueryResult result, std::string friendNote);
void HandleDelFriendOpcode(WorldPacket& recvPacket);
void HandleAddIgnoreOpcode(WorldPacket& recvPacket);
- void HandleAddIgnoreOpcodeCallBack(QueryResult result);
+ void HandleAddIgnoreOpcodeCallBack(PreparedQueryResult result);
void HandleDelIgnoreOpcode(WorldPacket& recvPacket);
void HandleSetContactNotesOpcode(WorldPacket& recvPacket);
void HandleBugOpcode(WorldPacket& recvPacket);
@@ -588,7 +585,7 @@ class WorldSession
void HandleBinderActivateOpcode(WorldPacket& recvPacket);
void HandleListStabledPetsOpcode(WorldPacket& recvPacket);
void HandleStablePet(WorldPacket& recvPacket);
- void HandleStablePetCallback(QueryResult result);
+ void HandleStablePetCallback(PreparedQueryResult result);
void HandleUnstablePet(WorldPacket& recvPacket);
void HandleUnstablePetCallback(QueryResult result, uint32 petnumber);
void HandleBuyStableSlot(WorldPacket& recvPacket);
@@ -747,7 +744,7 @@ class WorldSession
void HandleSetActionBarToggles(WorldPacket& recv_data);
void HandleCharRenameOpcode(WorldPacket& recv_data);
- void HandleChangePlayerNameOpcodeCallBack(QueryResult result, std::string newname);
+ void HandleChangePlayerNameOpcodeCallBack(PreparedQueryResult result, std::string newName);
void HandleSetPlayerDeclinedNames(WorldPacket& recv_data);
void HandleTotemDestroyed(WorldPacket& recv_data);
@@ -896,16 +893,15 @@ class WorldSession
void InitializeQueryCallbackParameters();
void ProcessQueryCallbacks();
- ACE_Future_Set<QueryResult> _nameQueryCallbacks;
- QueryResultFuture _charEnumCallback;
- QueryResultFuture _addIgnoreCallback;
- QueryResultFuture _stablePetCallback;
- QueryCallback<QueryResult, std::string> _charRenameCallback;
- QueryCallback<QueryResult, std::string> _addFriendCallback;
+ PreparedQueryResultFuture _charEnumCallback;
+ PreparedQueryResultFuture _addIgnoreCallback;
+ PreparedQueryResultFuture _stablePetCallback;
+ QueryCallback<PreparedQueryResult, std::string> _charRenameCallback;
+ QueryCallback<PreparedQueryResult, std::string> _addFriendCallback;
QueryCallback<QueryResult, uint32> _unstablePetCallback;
QueryCallback<QueryResult, uint32> _stableSwapCallback;
QueryCallback<QueryResult, uint64> _sendStabledPetCallback;
- QueryCallback<PreparedQueryResult, CharacterCreateInfo*> _charCreateCallback;
+ QueryCallback<PreparedQueryResult, CharacterCreateInfo*, true> _charCreateCallback;
QueryResultHolderFuture _charLoginCallback;
private:
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
index b690a811fbb..12c40c15db4 100755
--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
@@ -1518,7 +1518,7 @@ void AuraEffect::HandleShapeshiftBoosts(Unit* target, bool apply) const
spellId3 = 47180;
break;
}
- target->CastSpell(target, spellId, true, NULL, this);
+ target->CastSpell(target, spellId3, true, NULL, this);
}
// Master Shapeshifter - Cat
if (AuraEffect const* aurEff = target->GetDummyAuraEffect(SPELLFAMILY_GENERIC, 2851, 0))
@@ -2821,7 +2821,7 @@ void AuraEffect::HandleAuraMounted(AuraApplication const* aurApp, uint8 mode, bo
}
else
{
- target->Unmount();
+ target->Dismount();
//some mounts like Headless Horseman's Mount or broom stick are skill based spell
// need to remove ALL arura related to mounts, this will stop client crash with broom stick
// and never endless flying after using Headless Horseman's Mount
@@ -4794,18 +4794,22 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool
break;
case 63322: // Saronite Vapors
{
- int32 mana = int32(GetAmount() * pow(2.0f, GetBase()->GetStackAmount())); // mana restore - bp * 2^stackamount
- int32 damage = mana * 2; // damage
- caster->CastCustomSpell(target, 63337, &mana, NULL, NULL, true);
- caster->CastCustomSpell(target, 63338, &damage, NULL, NULL, true);
+ if (caster)
+ {
+ int32 mana = int32(GetAmount() * pow(2.0f, GetBase()->GetStackAmount())); // mana restore - bp * 2^stackamount
+ int32 damage = mana * 2; // damage
+ caster->CastCustomSpell(target, 63337, &mana, NULL, NULL, true);
+ caster->CastCustomSpell(target, 63338, &damage, NULL, NULL, true);
+ }
break;
}
case 71563:
if (Aura* newAura = target->AddAura(71564, target))
newAura->SetStackAmount(newAura->GetSpellInfo()->StackAmount);
break;
- case 59628: // Tricks of the Trade
- target->SetReducedThreatPercent(100,caster->GetGUID());
+ case 59628: // Tricks of the Trade
+ if (caster && caster->GetMisdirectionTarget())
+ target->SetReducedThreatPercent(100, caster->GetMisdirectionTarget()->GetGUID());
break;
}
}
@@ -4958,9 +4962,14 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool
// Tricks of the trade
switch(GetId())
{
- case 59628:
- case 57934:
+ case 59628: //Tricks of the trade buff on rogue (6sec duration)
target->SetReducedThreatPercent(0,0);
+ break;
+ case 57934: //Tricks of the trade buff on rogue (30sec duration)
+ if (aurApp->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE || !caster->GetMisdirectionTarget())
+ target->SetReducedThreatPercent(0,0);
+ else
+ target->SetReducedThreatPercent(0,caster->GetMisdirectionTarget()->GetGUID());
break;
}
default:
@@ -5201,7 +5210,7 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool
if (!(mode & AURA_EFFECT_HANDLE_REAL))
break;
// Sentry Totem
- if (GetId() == 6495 && caster->GetTypeId() == TYPEID_PLAYER)
+ if (GetId() == 6495 && caster && caster->GetTypeId() == TYPEID_PLAYER)
{
if (apply)
{
diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp
index 525084a70ed..91ecc328fd8 100755
--- a/src/server/game/Spells/Auras/SpellAuras.cpp
+++ b/src/server/game/Spells/Auras/SpellAuras.cpp
@@ -1332,6 +1332,7 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b
if (removeMode != AURA_REMOVE_BY_EXPIRE)
break;
target->CastSpell(target, 32612, true, NULL, GetEffect(1));
+ target->CombatStop();
break;
case 74396: // Fingers of Frost
// Remove the IGNORE_AURASTATE aura
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 8a4c0a768d8..fbb1a1965d8 100755
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -3254,6 +3254,12 @@ void Spell::handle_immediate()
m_caster->AddInterruptMask(m_spellInfo->ChannelInterruptFlags);
SendChannelStart(duration);
}
+ else if (duration == -1)
+ {
+ m_spellState = SPELL_STATE_CASTING;
+ m_caster->AddInterruptMask(m_spellInfo->ChannelInterruptFlags);
+ SendChannelStart(duration);
+ }
}
PrepareTargetProcessing();
@@ -3279,7 +3285,6 @@ void Spell::handle_immediate()
if (m_spellInfo->IsRangedWeaponSpell() && m_spellInfo->IsChanneled())
TakeAmmo();
-
if (m_spellState != SPELL_STATE_CASTING)
finish(true); // successfully finish spell cast (not last in case autorepeat or channel spell)
}
@@ -3478,9 +3483,9 @@ void Spell::update(uint32 difftime)
{
case SPELL_STATE_PREPARING:
{
- if (m_timer)
+ if (m_timer > 0)
{
- if (difftime >= m_timer)
+ if (difftime >= (uint32)m_timer)
m_timer = 0;
else
m_timer -= difftime;
@@ -3489,10 +3494,11 @@ void Spell::update(uint32 difftime)
if (m_timer == 0 && !IsNextMeleeSwingSpell() && !IsAutoRepeat())
// don't CheckCast for instant spells - done in spell::prepare, skip duplicate checks, needed for range checks for example
cast(!m_casttime);
- } break;
+ break;
+ }
case SPELL_STATE_CASTING:
{
- if (m_timer > 0)
+ if (m_timer)
{
// check if there are alive targets left
if (!UpdateChanneledTargetList())
@@ -3502,10 +3508,13 @@ void Spell::update(uint32 difftime)
finish();
}
- if (difftime >= m_timer)
- m_timer = 0;
- else
- m_timer -= difftime;
+ if (m_timer > 0)
+ {
+ if (difftime >= (uint32)m_timer)
+ m_timer = 0;
+ else
+ m_timer -= difftime;
+ }
}
if (m_timer == 0)
@@ -3547,10 +3556,10 @@ void Spell::update(uint32 difftime)
finish();
}
- } break;
+ break;
+ }
default:
- {
- }break;
+ break;
}
}
@@ -3666,9 +3675,9 @@ void Spell::SendCastResult(Player* caster, SpellInfo const* spellInfo, uint8 cas
switch (result)
{
case SPELL_FAILED_REQUIRES_SPELL_FOCUS:
- data << uint32(spellInfo->RequiresSpellFocus);
+ data << uint32(spellInfo->RequiresSpellFocus); // SpellFocusObject.dbc id
break;
- case SPELL_FAILED_REQUIRES_AREA:
+ case SPELL_FAILED_REQUIRES_AREA: // AreaTable.dbc id
// hardcode areas limitation case
switch (spellInfo->Id)
{
@@ -3701,14 +3710,15 @@ void Spell::SendCastResult(Player* caster, SpellInfo const* spellInfo, uint8 cas
data << uint32(spellInfo->TotemCategory[1]);
break;
case SPELL_FAILED_EQUIPPED_ITEM_CLASS:
+ case SPELL_FAILED_EQUIPPED_ITEM_CLASS_MAINHAND:
+ case SPELL_FAILED_EQUIPPED_ITEM_CLASS_OFFHAND:
data << uint32(spellInfo->EquippedItemClass);
data << uint32(spellInfo->EquippedItemSubClassMask);
- //data << uint32(spellInfo->EquippedItemInventoryTypeMask);
break;
case SPELL_FAILED_TOO_MANY_OF_ITEM:
{
uint32 item = 0;
- for (int8 x = 0;x < 3; x++)
+ for (int8 x = 0; x < 3; x++)
if (spellInfo->Effects[x].ItemType)
item = spellInfo->Effects[x].ItemType;
ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item);
@@ -3757,7 +3767,7 @@ void Spell::SendSpellStart()
data << uint8(m_cast_count); // pending spell cast?
data << uint32(m_spellInfo->Id); // spellId
data << uint32(castFlags); // cast flags
- data << uint32(m_timer); // delay?
+ data << int32(m_timer); // delay?
m_targets.Write(data);
@@ -3856,7 +3866,7 @@ void Spell::SendSpellGo()
}
}
- if (castFlags & CAST_FLAG_UNKNOWN_18) // unknown wotlk
+ if (castFlags & CAST_FLAG_UNKNOWN_18)
{
data << float(0);
data << uint32(0);
@@ -3865,7 +3875,7 @@ void Spell::SendSpellGo()
if (castFlags & CAST_FLAG_AMMO)
WriteAmmoToPacket(&data);
- if (castFlags & CAST_FLAG_UNKNOWN_20) // unknown wotlk
+ if (castFlags & CAST_FLAG_UNKNOWN_20)
{
data << uint32(0);
data << uint32(0);
@@ -4126,9 +4136,6 @@ void Spell::SendChannelUpdate(uint32 time)
m_caster->SetUInt32Value(UNIT_CHANNEL_SPELL, 0);
}
- if (m_caster->GetTypeId() != TYPEID_PLAYER)
- return;
-
WorldPacket data(MSG_CHANNEL_UPDATE, 8+4);
data.append(m_caster->GetPackGUID());
data << uint32(time);
@@ -5646,7 +5653,8 @@ SpellCastResult Spell::CheckRange(bool strict)
if (m_spellInfo->RangeEntry)
{
- // self cast is used for triggered spells, no range checking needed
+ // 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->RangeEntry->ID == 1)
return SPELL_CAST_OK;
@@ -6263,7 +6271,7 @@ void Spell::Delayed() // only called in DealDamage()
AddPctN(delaytime, -delayReduce);
- if (int32(m_timer) + delaytime > m_casttime)
+ if (m_timer + delaytime > m_casttime)
{
delaytime = m_casttime - m_timer;
m_timer = m_casttime;
@@ -6298,7 +6306,7 @@ void Spell::DelayedChannel()
AddPctN(delaytime, -delayReduce);
- if (int32(m_timer) <= delaytime)
+ if (m_timer <= delaytime)
{
delaytime = m_timer;
m_timer = 0;
diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h
index 624c3b9b9b3..f57b3114a70 100755
--- a/src/server/game/Spells/Spell.h
+++ b/src/server/game/Spells/Spell.h
@@ -647,7 +647,7 @@ class Spell
// -------------------------------------------
uint32 m_spellState;
- uint32 m_timer;
+ int32 m_timer;
TriggerCastFlags _triggeredCastFlags;
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index e42294f59ae..95917070b5d 100755
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -606,57 +606,67 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex)
case SPELLFAMILY_ROGUE:
{
// Envenom
- if (m_caster->GetTypeId() == TYPEID_PLAYER && (m_spellInfo->SpellFamilyFlags[1] & 0x8))
+ if (m_spellInfo->SpellFamilyFlags[1] & 0x00000008)
{
- // consume from stack dozes not more that have combo-points
- if (uint32 combo = m_caster->ToPlayer()->GetComboPoints())
+ if (Player* player = m_caster->ToPlayer())
{
- // Lookup for Deadly poison (only attacker applied)
- if (AuraEffect const* aurEff = unitTarget->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_ROGUE, 0x10000, 0, 0, m_caster->GetGUID()))
+ // consume from stack dozes not more that have combo-points
+ if (uint32 combo = player->GetComboPoints())
{
- // count consumed deadly poison doses at target
- bool needConsume = true;
- uint32 spellId = aurEff->GetId();
- uint32 doses = aurEff->GetBase()->GetStackAmount();
- if (doses > combo)
- doses = combo;
- // Master Poisoner
- Unit::AuraEffectList const& auraList = m_caster->ToPlayer()->GetAuraEffectsByType(SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK);
- for (Unit::AuraEffectList::const_iterator iter = auraList.begin(); iter != auraList.end(); ++iter)
+ // Lookup for Deadly poison (only attacker applied)
+ if (AuraEffect const* aurEff = unitTarget->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_ROGUE, 0x00010000, 0, 0, m_caster->GetGUID()))
{
- if ((*iter)->GetSpellInfo()->SpellFamilyName == SPELLFAMILY_ROGUE && (*iter)->GetSpellInfo()->SpellIconID == 1960)
+ // count consumed deadly poison doses at target
+ bool needConsume = true;
+ uint32 spellId = aurEff->GetId();
+
+ uint32 doses = aurEff->GetBase()->GetStackAmount();
+ if (doses > combo)
+ doses = combo;
+
+ // Master Poisoner
+ Unit::AuraEffectList const& auraList = player->GetAuraEffectsByType(SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK);
+ for (Unit::AuraEffectList::const_iterator iter = auraList.begin(); iter != auraList.end(); ++iter)
{
- uint32 chance = (*iter)->GetSpellInfo()->Effects[EFFECT_2].CalcValue(m_caster);
+ if ((*iter)->GetSpellInfo()->SpellFamilyName == SPELLFAMILY_ROGUE && (*iter)->GetSpellInfo()->SpellIconID == 1960)
+ {
+ uint32 chance = (*iter)->GetSpellInfo()->Effects[EFFECT_2].CalcValue(m_caster);
- if (chance && roll_chance_i(chance))
- needConsume = false;
+ if (chance && roll_chance_i(chance))
+ needConsume = false;
- break;
+ break;
+ }
}
+
+ if (needConsume)
+ for (uint32 i = 0; i < doses; ++i)
+ unitTarget->RemoveAuraFromStack(spellId);
+
+ damage *= doses;
+ damage += int32(player->GetTotalAttackPowerValue(BASE_ATTACK) * 0.09f * combo);
}
- if (needConsume)
- for (uint32 i = 0; i < doses; ++i)
- unitTarget->RemoveAuraFromStack(spellId);
- damage *= doses;
- damage += int32(((Player*)m_caster)->GetTotalAttackPowerValue(BASE_ATTACK) * 0.09f * doses);
+ // Eviscerate and Envenom Bonus Damage (item set effect)
+ if (m_caster->HasAura(37169))
+ damage += combo * 40;
}
- // Eviscerate and Envenom Bonus Damage (item set effect)
- if (m_caster->HasAura(37169))
- damage += ((Player*)m_caster)->GetComboPoints()*40;
}
}
// Eviscerate
- else if ((m_spellInfo->SpellFamilyFlags[0] & 0x00020000) && m_caster->GetTypeId() == TYPEID_PLAYER)
+ else if (m_spellInfo->SpellFamilyFlags[0] & 0x00020000)
{
- if (uint32 combo = ((Player*)m_caster)->GetComboPoints())
+ if (m_caster->GetTypeId() == TYPEID_PLAYER)
{
- float ap = m_caster->GetTotalAttackPowerValue(BASE_ATTACK);
- damage += irand(int32(ap * combo * 0.03f), int32(ap * combo * 0.07f));
+ if (uint32 combo = ((Player*)m_caster)->GetComboPoints())
+ {
+ float ap = m_caster->GetTotalAttackPowerValue(BASE_ATTACK);
+ damage += irand(int32(ap * combo * 0.03f), int32(ap * combo * 0.07f));
- // Eviscerate and Envenom Bonus Damage (item set effect)
- if (m_caster->HasAura(37169))
- damage += combo*40;
+ // Eviscerate and Envenom Bonus Damage (item set effect)
+ if (m_caster->HasAura(37169))
+ damage += combo*40;
+ }
}
}
break;
@@ -1421,11 +1431,19 @@ void Spell::EffectDummy(SpellEffIndex effIndex)
{
if (!unitTarget)
return;
- // Restorative Totems
if (Unit* owner = m_caster->GetOwner())
+ {
+ if (m_triggeredByAuraSpell)
+ damage = int32(owner->SpellHealingBonus(unitTarget, m_triggeredByAuraSpell, damage, HEAL));
+
+ // Restorative Totems
if (AuraEffect* dummy = owner->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, 338, 1))
AddPctN(damage, dummy->GetAmount());
+ // Glyph of Healing Stream Totem
+ if (AuraEffect const* aurEff = owner->GetAuraEffect(55456, EFFECT_0))
+ AddPctN(damage, aurEff->GetAmount());
+ }
m_caster->CastCustomSpell(unitTarget, 52042, &damage, 0, 0, true, 0, 0, m_originalCasterGUID);
return;
}
@@ -2093,12 +2111,12 @@ void Spell::EffectUnlearnSpecialization(SpellEffIndex effIndex)
if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER)
return;
- Player* _player = unitTarget->ToPlayer();
+ Player* player = unitTarget->ToPlayer();
uint32 spellToUnlearn = m_spellInfo->Effects[effIndex].TriggerSpell;
- _player->removeSpell(spellToUnlearn);
+ player->removeSpell(spellToUnlearn);
- sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "Spell: Player %u has unlearned spell %u from NpcGUID: %u", _player->GetGUIDLow(), spellToUnlearn, m_caster->GetGUIDLow());
+ sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "Spell: Player %u has unlearned spell %u from NpcGUID: %u", player->GetGUIDLow(), spellToUnlearn, m_caster->GetGUIDLow());
}
void Spell::EffectPowerDrain(SpellEffIndex effIndex)
@@ -2145,19 +2163,9 @@ void Spell::EffectSendEvent(SpellEffIndex effIndex)
&& effectHandleMode != SPELL_EFFECT_HANDLE_HIT)
return;
- //! it's possible for spells with this spell effect to either have a target or no target
- //! in case of a target, we will execute this handler on SPELL_EFFECT_HANDLE_HIT_TARGET
- //! with all relevant variables, and we will skip SPELL_EFFECT_HANDLE_HIT
- if (effectHandleMode == SPELL_EFFECT_HANDLE_HIT)
- {
- if (GetSpellInfo()->Effects[effIndex].TargetA.GetTarget() != 0 ||
- GetSpellInfo()->Effects[effIndex].TargetB.GetTarget() != 0)
- return;
- }
-
WorldObject* target = NULL;
- // call events for target if present
+ // call events for object target if present
if (effectHandleMode == SPELL_EFFECT_HANDLE_HIT_TARGET)
{
if (unitTarget)
@@ -2165,9 +2173,15 @@ void Spell::EffectSendEvent(SpellEffIndex effIndex)
else if (gameObjTarget)
target = gameObjTarget;
}
- // call event with no target or focus target when no targets could be found due to no dbc entry
- else if (!m_spellInfo->Effects[effIndex].GetProvidedTargetMask())
+ else // if (effectHandleMode == SPELL_EFFECT_HANDLE_HIT)
{
+ // let's prevent executing effect handler twice in case when spell effect is capable of targeting an object
+ // this check was requested by scripters, but it has some downsides:
+ // now it's impossible to script (using sEventScripts) a cast which misses all targets
+ // or to have an ability to script the moment spell hits dest (in a case when there are object targets present)
+ if (m_spellInfo->Effects[effIndex].GetProvidedTargetMask() & (TARGET_FLAG_UNIT_MASK | TARGET_FLAG_GAMEOBJECT_MASK))
+ return;
+ // some spells have no target entries in dbc and they use focus target
if (focusObject)
target = focusObject;
// TODO: there should be a possibility to pass dest target to event script
@@ -2588,8 +2602,8 @@ void Spell::EffectPersistentAA(SpellEffIndex effIndex)
// Caster not in world, might be spell triggered from aura removal
if (!caster->IsInWorld())
return;
- DynamicObject* dynObj = new DynamicObject();
- if (!dynObj->CreateDynamicObject(sObjectMgr->GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), caster, m_spellInfo->Id, *m_targets.GetDst(), radius, false, DYNAMIC_OBJECT_AREA_SPELL))
+ DynamicObject* dynObj = new DynamicObject(false);
+ if (!dynObj->CreateDynamicObject(sObjectMgr->GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), caster, m_spellInfo->Id, *m_targets.GetDst(), radius, DYNAMIC_OBJECT_AREA_SPELL))
{
delete dynObj;
return;
@@ -3437,8 +3451,8 @@ void Spell::EffectAddFarsight(SpellEffIndex effIndex)
if (!m_caster->IsInWorld())
return;
- DynamicObject* dynObj = new DynamicObject();
- if (!dynObj->CreateDynamicObject(sObjectMgr->GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), m_caster, m_spellInfo->Id, *m_targets.GetDst(), radius, true, DYNAMIC_OBJECT_FARSIGHT_FOCUS))
+ DynamicObject* dynObj = new DynamicObject(true);
+ if (!dynObj->CreateDynamicObject(sObjectMgr->GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), m_caster, m_spellInfo->Id, *m_targets.GetDst(), radius, DYNAMIC_OBJECT_FARSIGHT_FOCUS))
{
delete dynObj;
return;
@@ -5875,16 +5889,15 @@ void Spell::EffectFeedPet(SpellEffIndex effIndex)
if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET)
return;
- if (m_caster->GetTypeId() != TYPEID_PLAYER)
+ Player* player = m_caster->ToPlayer();
+ if (!player)
return;
- Player* _player = m_caster->ToPlayer();
-
Item* foodItem = itemTarget;
if (!foodItem)
return;
- Pet* pet = _player->GetPet();
+ Pet* pet = player->GetPet();
if (!pet)
return;
@@ -5898,7 +5911,7 @@ void Spell::EffectFeedPet(SpellEffIndex effIndex)
ExecuteLogEffectDestroyItem(effIndex, foodItem->GetEntry());
uint32 count = 1;
- _player->DestroyItemCount(foodItem, count, true);
+ player->DestroyItemCount(foodItem, count, true);
// TODO: fix crash when a spell has two effects, both pointed at the same item target
m_caster->CastCustomSpell(pet, m_spellInfo->Effects[effIndex].TriggerSpell, &benefit, NULL, NULL, true);
@@ -6097,7 +6110,7 @@ void Spell::EffectReputation(SpellEffIndex effIndex)
if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER)
return;
- Player* _player = unitTarget->ToPlayer();
+ Player* player = unitTarget->ToPlayer();
int32 rep_change = damage;
@@ -6114,10 +6127,10 @@ void Spell::EffectReputation(SpellEffIndex effIndex)
}
// Bonus from spells that increase reputation gain
- float bonus = rep_change * _player->GetTotalAuraModifier(SPELL_AURA_MOD_REPUTATION_GAIN) / 100.0f; // 10%
+ float bonus = rep_change * player->GetTotalAuraModifier(SPELL_AURA_MOD_REPUTATION_GAIN) / 100.0f; // 10%
rep_change += (int32)bonus;
- _player->GetReputationMgr().ModifyReputation(factionEntry, rep_change);
+ player->GetReputationMgr().ModifyReputation(factionEntry, rep_change);
}
void Spell::EffectQuestComplete(SpellEffIndex effIndex)
@@ -6227,9 +6240,13 @@ void Spell::EffectCharge(SpellEffIndex /*effIndex*/)
if (!unitTarget)
return;
- float x, y, z;
- unitTarget->GetContactPoint(m_caster, x, y, z);
- m_caster->GetMotionMaster()->MoveCharge(x, y, z);
+ float angle = unitTarget->GetRelativeAngle(m_caster);
+ Position pos;
+
+ unitTarget->GetContactPoint(m_caster, pos.m_positionX, pos.m_positionY, pos.m_positionZ);
+ unitTarget->GetFirstCollisionPosition(pos, unitTarget->GetObjectSize(), angle);
+
+ m_caster->GetMotionMaster()->MoveCharge(pos.m_positionX, pos.m_positionY, pos.m_positionZ + unitTarget->GetObjectSize());
}
if (effectHandleMode == SPELL_EFFECT_HANDLE_HIT_TARGET)
@@ -6250,9 +6267,13 @@ void Spell::EffectChargeDest(SpellEffIndex /*effIndex*/)
if (m_targets.HasDst())
{
- float x, y, z;
- m_targets.GetDst()->GetPosition(x, y, z);
- m_caster->GetMotionMaster()->MoveCharge(x, y, z);
+ Position pos;
+ m_targets.GetDst()->GetPosition(&pos);
+ float angle = m_caster->GetRelativeAngle(pos.GetPositionX(), pos.GetPositionY());
+ float dist = m_caster->GetDistance(pos);
+ m_caster->GetFirstCollisionPosition(pos, dist, angle);
+
+ m_caster->GetMotionMaster()->MoveCharge(pos.m_positionX, pos.m_positionY, pos.m_positionZ);
}
}
@@ -6432,20 +6453,20 @@ void Spell::EffectSummonDeadPet(SpellEffIndex /*effIndex*/)
if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT)
return;
- if (m_caster->GetTypeId() != TYPEID_PLAYER)
- return;
- Player* _player = m_caster->ToPlayer();
- Pet* pet = _player->GetPet();
- if (!pet)
+ Player* player = m_caster->ToPlayer();
+ if (!player)
return;
- if (pet->isAlive())
+
+ Pet* pet = player->GetPet();
+ if (!pet || pet->isAlive())
return;
+
if (damage < 0)
return;
float x, y, z;
- _player->GetPosition(x, y, z);
- _player->GetMap()->CreatureRelocation(pet, x, y, z, _player->GetOrientation());
+ player->GetPosition(x, y, z);
+ player->GetMap()->CreatureRelocation(pet, x, y, z, player->GetOrientation());
pet->SetUInt32Value(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_NONE);
pet->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE);
@@ -6454,7 +6475,7 @@ void Spell::EffectSummonDeadPet(SpellEffIndex /*effIndex*/)
pet->SetHealth(pet->CountPctFromMaxHealth(damage));
//pet->AIM_Initialize();
- //_player->PetSpellInitialize();
+ //player->PetSpellInitialize();
pet->SavePetToDB(PET_SAVE_AS_CURRENT);
}
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp
index 972276c7d26..463b46972fa 100644
--- a/src/server/game/Spells/SpellInfo.cpp
+++ b/src/server/game/Spells/SpellInfo.cpp
@@ -2304,6 +2304,19 @@ bool SpellInfo::_IsPositiveEffect(uint8 effIndex, bool deep) const
if (Id == 30708)
return false;
break;
+ case SPELLFAMILY_ROGUE:
+ switch (Id)
+ {
+ // Envenom must be considered as a positive effect even though it deals damage
+ case 32645: // Envenom (Rank 1)
+ case 32684: // Envenom (Rank 2)
+ case 57992: // Envenom (Rank 3)
+ case 57993: // Envenom (Rank 4)
+ return true;
+ default:
+ break;
+ }
+ break;
default:
break;
}
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index 6cfbb04e179..8976f90690c 100755
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -3230,6 +3230,10 @@ void SpellMgr::LoadDbcDataCorrections()
// this needs research on modifier applying rules, does not seem to be in Attributes fields
spellInfo->EffectSpellClassMask[0] = flag96(0x00000040, 0x00000000, 0x00000000);
break;
+ case 63163: // Apply Enchanted Bridle (Argent Tournament)
+ spellInfo->EffectDieSides[0] = 0; // was 1, that should probably mean seat 0, but instead it's treated as spell 1
+ spellInfo->EffectBasePoints[0] = 52391; // Ride Vehicle (forces seat 0)
+ break;
case 19970: // Entangling Roots (Rank 6) -- Nature's Grasp Proc
case 19971: // Entangling Roots (Rank 5) -- Nature's Grasp Proc
case 19972: // Entangling Roots (Rank 4) -- Nature's Grasp Proc
diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
index f643ae60287..9354c14f51c 100755
--- a/src/server/game/World/World.h
+++ b/src/server/game/World/World.h
@@ -634,7 +634,8 @@ class World
void SendServerMessage(ServerMessageType type, const char *text = "", Player* player = NULL);
/// Are we in the middle of a shutdown?
- bool IsShutdowning() const { return m_ShutdownTimer > 0; }
+ bool IsShuttingDown() const { return m_ShutdownTimer > 0; }
+ uint32 GetShutDownTimeLeft() const { return m_ShutdownTimer; }
void ShutdownServ(uint32 time, uint32 options, uint8 exitcode);
void ShutdownCancel();
void ShutdownMsg(bool show = false, Player* player = NULL);
diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp
index 28bc17a7450..c32abb9537b 100644
--- a/src/server/scripts/Commands/cs_modify.cpp
+++ b/src/server/scripts/Commands/cs_modify.cpp
@@ -1129,7 +1129,12 @@ public:
uint16 drunkMod = drunklevel * 0xFFFF / 100;
- handler->GetSession()->GetPlayer()->SetDrunkValue(drunkMod);
+ Player* target = handler->getSelectedPlayer();
+ if (!target)
+ target = handler->GetSession()->GetPlayer();
+
+ if (target)
+ target->SetDrunkValue(drunkMod);
return true;
}
diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp
index b9ac21cc040..a5aa2a516f3 100644
--- a/src/server/scripts/Commands/cs_npc.cpp
+++ b/src/server/scripts/Commands/cs_npc.cpp
@@ -552,15 +552,13 @@ public:
handler->PSendSysMessage(LANG_NPCINFO_PHASEMASK, target->GetPhaseMask());
handler->PSendSysMessage(LANG_NPCINFO_ARMOR, target->GetArmor());
handler->PSendSysMessage(LANG_NPCINFO_POSITION, float(target->GetPositionX()), float(target->GetPositionY()), float(target->GetPositionZ()));
+ handler->PSendSysMessage(LANG_NPCINFO_AIINFO, target->GetAIName().c_str(), target->GetScriptName().c_str());
- if ((npcflags & UNIT_NPC_FLAG_VENDOR))
- {
+ if (npcflags & UNIT_NPC_FLAG_VENDOR)
handler->SendSysMessage(LANG_NPCINFO_VENDOR);
- }
- if ((npcflags & UNIT_NPC_FLAG_TRAINER))
- {
+
+ if (npcflags & UNIT_NPC_FLAG_TRAINER)
handler->SendSysMessage(LANG_NPCINFO_TRAINER);
- }
return true;
}
diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp
index ebd30aa2f5d..8179c9fccaa 100644
--- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp
@@ -248,7 +248,7 @@ public:
me->Mount(MODEL_DEATH_KNIGHT_MOUNT);
break;
case 10:
- me->Unmount();
+ me->Dismount();
break;
}
}
@@ -378,7 +378,7 @@ public:
void EnterCombat(Unit* /*who*/)
{
DoScriptText(SAY_TREE2, me);
- me->Unmount();
+ me->Dismount();
uiStage = 0;
}
diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp
index 18316d67cd4..3ee71ce3609 100644
--- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp
@@ -526,13 +526,13 @@ public:
NPCChangeTarget(uiOrbazGUID);
NPCChangeTarget(uiThassarianGUID);
- me->Unmount();
+ me->Dismount();
me->CastSpell(me, SPELL_THE_MIGHT_OF_MOGRAINE, true); // need to fix, on player only
if (Creature* temp = Unit::GetCreature(*me, uiKoltiraGUID))
- temp->Unmount();
+ temp->Dismount();
if (Creature* temp = Unit::GetCreature(*me, uiThassarianGUID))
- temp->Unmount();
+ temp->Dismount();
bIsBattle = true;
break;
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
index f45c943b0f1..7dc357f692a 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
@@ -149,7 +149,7 @@ class boss_mandokir : public CreatureScript
if (!CombatStart)
{
//At combat Start Mandokir is mounted so we must unmount it first
- me->Unmount();
+ me->Dismount();
//And summon his raptor
me->SummonCreature(14988, me->getVictim()->GetPositionX(), me->getVictim()->GetPositionY(), me->getVictim()->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 35000);
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp
index 1a43472365a..798ea3925dc 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp
@@ -34,7 +34,8 @@ enum Spells
H_SPELL_MIND_BLAST = 58850,
SPELL_SLEEP = 52721, //Puts an enemy to sleep for up to 10 sec. Any damage caused will awaken the target.
H_SPELL_SLEEP = 58849,
- SPELL_VAMPIRIC_TOUCH = 52723 //Heals the caster for half the damage dealt by a melee attack.
+ SPELL_VAMPIRIC_TOUCH = 52723, //Heals the caster for half the damage dealt by a melee attack.
+ SPELL_KILL_CREDIT = 58630 // Non-existing spell as encounter credit, created in spell_dbc
};
enum Yells
@@ -237,9 +238,8 @@ public:
{
instance->SetData(DATA_MAL_GANIS_EVENT, DONE);
- // give achievement credit to players. criteria use spell 58630 which doesn't exist.
- if (instance)
- instance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, 58630);
+ // give achievement credit and LFG rewards to players. criteria use spell 58630 which doesn't exist, but it was created in spell_dbc
+ DoCast(me, SPELL_KILL_CREDIT);
}
}
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp
index 82f16dd7784..7cbb1b91755 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp
@@ -582,7 +582,7 @@ public:
{
Unit* pJaina = GetClosestCreatureWithEntry(me, NPC_JAINA, 50.0f);
if (!pJaina)
- pJaina = pJaina = me->SummonCreature(NPC_JAINA, 1895.48f, 1292.66f, 143.706f, 0.023475f, TEMPSUMMON_DEAD_DESPAWN, 180000);
+ pJaina = me->SummonCreature(NPC_JAINA, 1895.48f, 1292.66f, 143.706f, 0.023475f, TEMPSUMMON_DEAD_DESPAWN, 180000);
if (pJaina)
uiJainaGUID = pJaina->GetGUID();
bStepping = false;
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp
index 1f0342b3804..65ae3287381 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp
@@ -498,7 +498,7 @@ public:
}
void DoUnmount()
{
- me->Unmount();
+ me->Dismount();
me->SetSpeed(MOVE_RUN, SPEED_RUN);
}
void EnterCombat(Unit* /*who*/)
diff --git a/src/server/scripts/Kalimdor/durotar.cpp b/src/server/scripts/Kalimdor/durotar.cpp
index 1f64353901c..d6d2d633890 100644
--- a/src/server/scripts/Kalimdor/durotar.cpp
+++ b/src/server/scripts/Kalimdor/durotar.cpp
@@ -400,7 +400,7 @@ class npc_troll_volunteer : public CreatureScript
DoCast(me, SPELL_TURNIN);
DoCast(me, SPELL_QUEST_CREDIT);
me->RemoveAurasDueToSpell(SPELL_MOUNTING_CHECK);
- me->Unmount();
+ me->Dismount();
Talk(SAY_VOLUNTEER_END);
me->GetMotionMaster()->MovePoint(POINT_URUZIN, caster->GetPositionX(), caster->GetPositionY(), caster->GetPositionZ());
}
@@ -447,7 +447,7 @@ class spell_mount_check : public SpellScriptLoader
target->Mount(mountid);
}
else if (!owner->IsMounted() && target->IsMounted())
- target->Unmount();
+ target->Dismount();
target->SetSpeed(MOVE_RUN, owner->GetSpeedRate(MOVE_RUN));
target->SetSpeed(MOVE_WALK, owner->GetSpeedRate(MOVE_WALK));
diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp
index 545dc79453d..e0892ffb009 100644
--- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp
@@ -91,49 +91,50 @@ public:
struct boss_anub_arakAI : public ScriptedAI
{
- boss_anub_arakAI(Creature* c) : ScriptedAI(c), lSummons(me)
+ boss_anub_arakAI(Creature* creature) : ScriptedAI(creature), Summons(me)
{
- instance = c->GetInstanceScript();
+ instance = creature->GetInstanceScript();
}
InstanceScript* instance;
- bool bChanneling;
- bool bGuardianSummoned;
- bool bVenomancerSummoned;
- bool bDatterSummoned;
- uint8 uiPhase;
- uint32 uiUndergroundPhase;
- uint32 uiCarrionBeetlesTimer;
- uint32 uiLeechingSwarmTimer;
- uint32 uiPoundTimer;
- uint32 uiSubmergeTimer;
- uint32 uiUndergroundTimer;
- uint32 uiVenomancerTimer;
- uint32 uiDatterTimer;
-
- uint32 uiImpaleTimer;
- uint32 uiImpalePhase;
- uint64 uiImpaleTarget;
-
- SummonList lSummons;
+ bool Channeling;
+ bool GuardianSummoned;
+ bool VenomancerSummoned;
+ bool DatterSummoned;
+ uint8 Phase;
+ uint32 UndergroundPhase;
+ uint32 CarrionBeetlesTimer;
+ uint32 LeechingSwarmTimer;
+ uint32 PoundTimer;
+ uint32 SubmergeTimer;
+ uint32 UndergroundTimer;
+ uint32 VenomancerTimer;
+ uint32 DatterTimer;
+ uint32 DelayTimer;
+
+ uint32 ImpaleTimer;
+ uint32 ImpalePhase;
+ uint64 ImpaleTarget;
+
+ SummonList Summons;
void Reset()
{
- uiCarrionBeetlesTimer = 8*IN_MILLISECONDS;
- uiLeechingSwarmTimer = 20*IN_MILLISECONDS;
- uiImpaleTimer = 9*IN_MILLISECONDS;
- uiPoundTimer = 15*IN_MILLISECONDS;
+ CarrionBeetlesTimer = 8*IN_MILLISECONDS;
+ LeechingSwarmTimer = 20*IN_MILLISECONDS;
+ ImpaleTimer = 9*IN_MILLISECONDS;
+ PoundTimer = 15*IN_MILLISECONDS;
- uiPhase = PHASE_MELEE;
- uiUndergroundPhase = 0;
- bChanneling = false;
- uiImpalePhase = IMPALE_PHASE_TARGET;
+ Phase = PHASE_MELEE;
+ UndergroundPhase = 0;
+ Channeling = false;
+ ImpalePhase = IMPALE_PHASE_TARGET;
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
me->RemoveAura(SPELL_SUBMERGE);
- lSummons.DespawnAll();
+ Summons.DespawnAll();
if (instance)
{
@@ -147,13 +148,13 @@ public:
Position targetPos;
target->GetPosition(&targetPos);
- if (TempSummon* pImpaleTarget = me->SummonCreature(CREATURE_IMPALE_TARGET, targetPos, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 6*IN_MILLISECONDS))
+ if (TempSummon* impaleTarget = me->SummonCreature(CREATURE_IMPALE_TARGET, targetPos, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 6*IN_MILLISECONDS))
{
- uiImpaleTarget = pImpaleTarget->GetGUID();
- pImpaleTarget->SetReactState(REACT_PASSIVE);
- pImpaleTarget->SetDisplayId(DISPLAY_INVISIBLE);
- pImpaleTarget->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE|UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
- return pImpaleTarget;
+ ImpaleTarget = impaleTarget->GetGUID();
+ impaleTarget->SetReactState(REACT_PASSIVE);
+ impaleTarget->SetDisplayId(DISPLAY_INVISIBLE);
+ impaleTarget->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE|UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
+ return impaleTarget;
}
return NULL;
@@ -162,11 +163,15 @@ public:
void EnterCombat(Unit* /*who*/)
{
DoScriptText(SAY_AGGRO, me);
+ DelayTimer = 0;
if (instance)
- {
- instance->SetData(DATA_ANUBARAK_EVENT, IN_PROGRESS);
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
- }
+ }
+
+ void DelayEventStart()
+ {
+ if (instance)
+ instance->SetData(DATA_ANUBARAK_EVENT, IN_PROGRESS);
}
void UpdateAI(const uint32 diff)
@@ -174,41 +179,45 @@ public:
if (!UpdateVictim())
return;
- switch (uiPhase)
+ if (DelayTimer && DelayTimer > 5000)
+ DelayEventStart();
+ else DelayTimer+=diff;
+
+ switch (Phase)
{
case PHASE_UNDERGROUND:
- if (uiImpaleTimer <= diff)
+ if (ImpaleTimer <= diff)
{
- switch (uiImpalePhase)
+ switch (ImpalePhase)
{
case IMPALE_PHASE_TARGET:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
{
- if (Creature* pImpaleTarget = DoSummonImpaleTarget(target))
- pImpaleTarget->CastSpell(pImpaleTarget, SPELL_IMPALE_SHAKEGROUND, true);
- uiImpaleTimer = 3*IN_MILLISECONDS;
- uiImpalePhase = IMPALE_PHASE_ATTACK;
+ if (Creature* impaleTarget = DoSummonImpaleTarget(target))
+ impaleTarget->CastSpell(impaleTarget, SPELL_IMPALE_SHAKEGROUND, true);
+ ImpaleTimer = 3*IN_MILLISECONDS;
+ ImpalePhase = IMPALE_PHASE_ATTACK;
}
break;
case IMPALE_PHASE_ATTACK:
- if (Creature* pImpaleTarget = Unit::GetCreature(*me, uiImpaleTarget))
+ if (Creature* impaleTarget = Unit::GetCreature(*me, ImpaleTarget))
{
- pImpaleTarget->CastSpell(pImpaleTarget, SPELL_IMPALE_SPIKE, false);
- pImpaleTarget->RemoveAurasDueToSpell(SPELL_IMPALE_SHAKEGROUND);
+ impaleTarget->CastSpell(impaleTarget, SPELL_IMPALE_SPIKE, false);
+ impaleTarget->RemoveAurasDueToSpell(SPELL_IMPALE_SHAKEGROUND);
}
- uiImpalePhase = IMPALE_PHASE_DMG;
- uiImpaleTimer = 1*IN_MILLISECONDS;
+ ImpalePhase = IMPALE_PHASE_DMG;
+ ImpaleTimer = 1*IN_MILLISECONDS;
break;
case IMPALE_PHASE_DMG:
- if (Creature* pImpaleTarget = Unit::GetCreature(*me, uiImpaleTarget))
- me->CastSpell(pImpaleTarget, DUNGEON_MODE(SPELL_IMPALE_DMG, SPELL_IMPALE_DMG_H), true);
- uiImpalePhase = IMPALE_PHASE_TARGET;
- uiImpaleTimer = 9*IN_MILLISECONDS;
+ if (Creature* impaleTarget = Unit::GetCreature(*me, ImpaleTarget))
+ me->CastSpell(impaleTarget, DUNGEON_MODE(SPELL_IMPALE_DMG, SPELL_IMPALE_DMG_H), true);
+ ImpalePhase = IMPALE_PHASE_TARGET;
+ ImpaleTimer = 9*IN_MILLISECONDS;
break;
}
- } else uiImpaleTimer -= diff;
+ } else ImpaleTimer -= diff;
- if (!bGuardianSummoned)
+ if (!GuardianSummoned)
{
for (uint8 i = 0; i < 2; ++i)
{
@@ -218,14 +227,14 @@ public:
DoZoneInCombat(Guardian);
}
}
- bGuardianSummoned = true;
+ GuardianSummoned = true;
}
- if (!bVenomancerSummoned)
+ if (!VenomancerSummoned)
{
- if (uiVenomancerTimer <= diff)
+ if (VenomancerTimer <= diff)
{
- if (uiUndergroundPhase > 1)
+ if (UndergroundPhase > 1)
{
for (uint8 i = 0; i < 2; ++i)
{
@@ -235,16 +244,16 @@ public:
DoZoneInCombat(Venomancer);
}
}
- bVenomancerSummoned = true;
+ VenomancerSummoned = true;
}
- } else uiVenomancerTimer -= diff;
+ } else VenomancerTimer -= diff;
}
- if (!bDatterSummoned)
+ if (!DatterSummoned)
{
- if (uiDatterTimer <= diff)
+ if (DatterTimer <= diff)
{
- if (uiUndergroundPhase > 2)
+ if (UndergroundPhase > 2)
{
for (uint8 i = 0; i < 2; ++i)
{
@@ -254,71 +263,74 @@ public:
DoZoneInCombat(Datter);
}
}
- bDatterSummoned = true;
+ DatterSummoned = true;
}
- } else uiDatterTimer -= diff;
+ } else DatterTimer -= diff;
+
+ if(me->HasAura(SPELL_LEECHING_SWARM))
+ me->RemoveAurasDueToSpell(SPELL_LEECHING_SWARM);
}
- if (uiUndergroundTimer <= diff)
+ if (UndergroundTimer <= diff)
{
me->RemoveAura(SPELL_SUBMERGE);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
- uiPhase = PHASE_MELEE;
- } else uiUndergroundTimer -= diff;
+ Phase = PHASE_MELEE;
+ } else UndergroundTimer -= diff;
break;
case PHASE_MELEE:
- if (((uiUndergroundPhase == 0 && HealthBelowPct(75))
- || (uiUndergroundPhase == 1 && HealthBelowPct(50))
- || (uiUndergroundPhase == 2 && HealthBelowPct(25)))
+ if (((UndergroundPhase == 0 && HealthBelowPct(75))
+ || (UndergroundPhase == 1 && HealthBelowPct(50))
+ || (UndergroundPhase == 2 && HealthBelowPct(25)))
&& !me->HasUnitState(UNIT_STAT_CASTING))
{
- bGuardianSummoned = false;
- bVenomancerSummoned = false;
- bDatterSummoned = false;
+ GuardianSummoned = false;
+ VenomancerSummoned = false;
+ DatterSummoned = false;
- uiUndergroundTimer = 40*IN_MILLISECONDS;
- uiVenomancerTimer = 25*IN_MILLISECONDS;
- uiDatterTimer = 32*IN_MILLISECONDS;
+ UndergroundTimer = 40*IN_MILLISECONDS;
+ VenomancerTimer = 25*IN_MILLISECONDS;
+ DatterTimer = 32*IN_MILLISECONDS;
- uiImpalePhase = 0;
- uiImpaleTimer = 9*IN_MILLISECONDS;
+ ImpalePhase = 0;
+ ImpaleTimer = 9*IN_MILLISECONDS;
DoCast(me, SPELL_SUBMERGE, false);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
- uiPhase = PHASE_UNDERGROUND;
- ++uiUndergroundPhase;
+ Phase = PHASE_UNDERGROUND;
+ ++UndergroundPhase;
}
- if (bChanneling == true)
+ if (Channeling == true)
{
for (uint8 i = 0; i < 8; ++i)
DoCast(me->getVictim(), SPELL_SUMMON_CARRION_BEETLES, true);
- bChanneling = false;
+ Channeling = false;
}
- else if (uiCarrionBeetlesTimer <= diff)
+ else if (CarrionBeetlesTimer <= diff)
{
- bChanneling = true;
+ Channeling = true;
DoCastVictim(SPELL_CARRION_BEETLES);
- uiCarrionBeetlesTimer = 25*IN_MILLISECONDS;
- } else uiCarrionBeetlesTimer -= diff;
+ CarrionBeetlesTimer = 25*IN_MILLISECONDS;
+ } else CarrionBeetlesTimer -= diff;
- if (uiLeechingSwarmTimer <= diff)
+ if (LeechingSwarmTimer <= diff)
{
DoCast(me, SPELL_LEECHING_SWARM, true);
- uiLeechingSwarmTimer = 19*IN_MILLISECONDS;
- } else uiLeechingSwarmTimer -= diff;
+ LeechingSwarmTimer = 19*IN_MILLISECONDS;
+ } else LeechingSwarmTimer -= diff;
- if (uiPoundTimer <= diff)
+ if (PoundTimer <= diff)
{
if (Unit* target = me->getVictim())
{
if (Creature* pImpaleTarget = DoSummonImpaleTarget(target))
me->CastSpell(pImpaleTarget, DUNGEON_MODE(SPELL_POUND, SPELL_POUND_H), false);
}
- uiPoundTimer = 16500;
- } else uiPoundTimer -= diff;
+ PoundTimer = 16500;
+ } else PoundTimer -= diff;
DoMeleeAttackIfReady();
break;
@@ -328,7 +340,7 @@ public:
void JustDied(Unit* /*killer*/)
{
DoScriptText(SAY_DEATH, me);
- lSummons.DespawnAll();
+ Summons.DespawnAll();
if (instance)
instance->SetData(DATA_ANUBARAK_EVENT, DONE);
}
@@ -342,7 +354,7 @@ public:
void JustSummoned(Creature* summon)
{
- lSummons.Summon(summon);
+ Summons.Summon(summon);
}
};
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp
index fd84c1eec8a..f73e9779248 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp
@@ -54,8 +54,10 @@ enum eSpells
SPELL_BLACK_KNIGHT_RES = 67693,
- SPELL_LEAP = 67749,
- SPELL_LEAP_H = 67880
+ SPELL_LEAP = 67749,
+ SPELL_LEAP_H = 67880,
+
+ SPELL_KILL_CREDIT = 68663
};
enum eModels
@@ -288,6 +290,8 @@ public:
void JustDied(Unit* /*killer*/)
{
+ DoCast(me, SPELL_KILL_CREDIT);
+
if (instance)
instance->SetData(BOSS_BLACK_KNIGHT, DONE);
}
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp
index 2fbe381fed5..2f6a01e73d7 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp
@@ -839,7 +839,8 @@ public:
if (target && me->IsInRange(target, 5.0f, 30.0f, false))
{
DoCast(target, SPELL_MULTI_SHOT);
- } else
+ }
+ else
{
Map::PlayerList const& players = me->GetMap()->GetPlayers();
if (me->GetMap()->IsDungeon() && !players.isEmpty())
@@ -849,7 +850,7 @@ public:
Player* player = itr->getSource();
if (player && !player->isGameMaster() && me->IsInRange(player, 5.0f, 30.0f, false))
{
- DoCast(target, SPELL_MULTI_SHOT);
+ DoCast(player, SPELL_MULTI_SHOT);
break;
}
}
diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp
index e552341fd1e..d877bbd0842 100644
--- a/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp
+++ b/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp
@@ -237,7 +237,8 @@ public:
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
if (Player* player = i->getSource())
player->DeMorph();
- instance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2, SPELL_ACHIEVEMENT_CHECK);
+
+ DoCast(me, SPELL_ACHIEVEMENT_CHECK);
instance->SetData(DATA_THARON_JA_EVENT, DONE);
}
diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp
index eacb800f15a..1e29ec55dc8 100644
--- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp
@@ -215,7 +215,6 @@ class mob_corrupted_soul_fragment : public CreatureScript
if (Creature* bronjahm = ObjectAccessor::GetCreature(*me, BronjahmGUID))
me->CastSpell(bronjahm, SPELL_CONSUME_SOUL, true);
- summ->GetMotionMaster()->MoveIdle();
summ->UnSummon();
}
}
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
index 29c3276467b..25610341a2f 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
@@ -341,7 +341,7 @@ class boss_sindragosa : public CreatureScript
{
if (uint32 spellId = sSpellMgr->GetSpellIdForDifficulty(_isThirdPhase ? SPELL_FROST_BREATH_P2 : SPELL_FROST_BREATH_P1, me))
{
- if (player->GetQuestStatus(QUEST_FROST_INFUSION) != QUEST_STATUS_REWARDED && spellId == spell->Id)
+ if (player->GetQuestStatus(QUEST_FROST_INFUSION) == QUEST_STATUS_INCOMPLETE && spellId == spell->Id)
{
if (Item* shadowsEdge = player->GetWeaponForAttack(BASE_ATTACK, true))
{
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp
index 16c258af756..e63d50b0133 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_urom.cpp
@@ -289,6 +289,7 @@ public:
void JustDied(Unit* /*killer*/)
{
_JustDied();
+ DoCast(me, SPELL_DEATH_SPELL, true); // we cast the spell as triggered or the summon effect does not occur
}
void LeaveCombat()
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp
index f3384b7ec15..4dcd2618895 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp
@@ -144,8 +144,8 @@ public:
void JustDied(Unit* /*killer*/)
{
_JustDied();
-
Talk(SAY_DEATH);
+ DoCast(me, SPELL_DEATH_SPELL, true); // we cast the spell as triggered or the summon effect does not occur
}
private:
bool firstCoreEnergize;
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp
index f8839aa0028..b9799103214 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp
@@ -50,6 +50,12 @@ enum Drakes
NPC_ETERNOS = 27659
};
+enum Says
+{
+ SAY_VAROS = 0,
+ SAY_UROM = 1
+};
+
class npc_oculus_drake : public CreatureScript
{
public:
@@ -174,7 +180,38 @@ public:
};
+class npc_image_belgaristrasz : public CreatureScript
+{
+public:
+ npc_image_belgaristrasz() : CreatureScript("npc_image_belgaristrasz") { }
+
+ struct npc_image_belgaristraszAI : public ScriptedAI
+ {
+ npc_image_belgaristraszAI(Creature* creature) : ScriptedAI(creature) {}
+
+ void IsSummonedBy(Unit* summoner)
+ {
+ if (summoner->GetEntry() == NPC_VAROS)
+ {
+ Talk(SAY_VAROS);
+ me->DespawnOrUnsummon(60000);
+ }
+ if (summoner->GetEntry() == NPC_UROM)
+ {
+ Talk(SAY_UROM);
+ me->DespawnOrUnsummon(60000);
+ }
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_image_belgaristraszAI(creature);
+ }
+};
+
void AddSC_oculus()
{
new npc_oculus_drake();
+ new npc_image_belgaristrasz();
}
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/oculus.h b/src/server/scripts/Northrend/Nexus/Oculus/oculus.h
index e04f2c8aab9..dab2821b5e5 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/oculus.h
+++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.h
@@ -71,6 +71,7 @@ enum OculusWorldStates
enum OculusSpells
{
- SPELL_CENTRIFUGE_SHIELD = 50053
+ SPELL_CENTRIFUGE_SHIELD = 50053,
+ SPELL_DEATH_SPELL = 50415
};
#endif
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp
index e7d8b070e53..13c174a9607 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp
@@ -526,7 +526,7 @@ class boss_freya : public CreatureScript
{
uint8 n = 0;
- // Handling recieved data
+ // Handling received data
for (uint8 i = 0; i < 5; ++i) // We have created "instances" for keeping informations about last 6 death lashers - needed because of respawning
{
deforestation[i][0] = deforestation[(i + 1)][0]; // Time
@@ -590,7 +590,7 @@ class boss_freya : public CreatureScript
waveCount++;
}
- void JustDied(Unit* who)
+ void JustDied(Unit* /*who*/)
{
//! Freya's chest is dynamically spawned on death by different spells.
const uint32 summonSpell[2][4] =
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp
index dc2d34326a7..3712bd748a5 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp
@@ -173,7 +173,11 @@ public:
DoScriptText(YELL_DEAD_2, me);
if (instance)
+ {
+ // Ingvar has MOB_INGVAR_UNDEAD id in this moment, so we have to update encounter state for his original id
+ instance->UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, MOB_INGVAR_HUMAN, me);
instance->SetData(DATA_INGVAR_EVENT, DONE);
+ }
}
void KilledUnit(Unit* /*victim*/)
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp
index 7b459e7410d..f31271b825e 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp
@@ -218,7 +218,7 @@ public:
void JustReachedHome()
{
me->SetFlying(false);
- me->Unmount();
+ me->Dismount();
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
if (Unit::GetCreature((*me), m_uiGraufGUID) == NULL)
me->SummonCreature(CREATURE_GRAUF, Location[0].GetPositionX(), Location[0].GetPositionY(), Location[0].GetPositionZ(), 3.0f);
@@ -285,7 +285,7 @@ public:
{
Phase = SKADI;
me->SetFlying(false);
- me->Unmount();
+ me->Dismount();
if (Creature* pGrauf = me->SummonCreature(CREATURE_GRAUF, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3*IN_MILLISECONDS))
{
pGrauf->GetMotionMaster()->MoveFall(0);
diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp
index 4f837870612..5965c352975 100644
--- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp
@@ -303,9 +303,7 @@ class boss_warchief_kargath_bladefist : public CreatureScript
if (resetcheck_timer <= diff)
{
- uint32 tempx, tempy;
- tempx = uint32(me->GetPositionX());
- tempy = uint32(me->GetPositionY());
+ uint32 tempx = uint32(me->GetPositionX());
if (tempx > 255 || tempx < 205)
{
EnterEvadeMode();
diff --git a/src/server/scripts/Outland/nagrand.cpp b/src/server/scripts/Outland/nagrand.cpp
index c556253ecf1..bae3aa65b98 100644
--- a/src/server/scripts/Outland/nagrand.cpp
+++ b/src/server/scripts/Outland/nagrand.cpp
@@ -573,7 +573,7 @@ public:
{
Talk(SAY_KUR_MORE);
- if (Creature* temp = me->SummonCreature(NPC_KUR_MURK_PUTRIFIER, kurenaiAmbushB[0], kurenaiAmbushB[1], kurenaiAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000))
+ if (me->SummonCreature(NPC_KUR_MURK_PUTRIFIER, kurenaiAmbushB[0], kurenaiAmbushB[1], kurenaiAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000))
Talk(SAY_KUR_MORE_TWO);
me->SummonCreature(NPC_KUR_MURK_PUTRIFIER, kurenaiAmbushB[0]-2.5f, kurenaiAmbushB[1]-2.5f, kurenaiAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000);
diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp
index 260b0c57563..298e9b6410e 100644
--- a/src/server/scripts/Spells/spell_generic.cpp
+++ b/src/server/scripts/Spells/spell_generic.cpp
@@ -26,6 +26,8 @@
#include "SpellAuraEffects.h"
#include "SkillDiscovery.h"
#include "GridNotifiers.h"
+#include "Group.h"
+#include "LFGMgr.h"
class spell_gen_absorb0_hitlimit1 : public SpellScriptLoader
{
@@ -564,6 +566,9 @@ class spell_creature_permanent_feign_death : public SpellScriptLoader
Unit* target = GetTarget();
target->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
target->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
+
+ if (target->GetTypeId() == TYPEID_UNIT)
+ target->ToCreature()->SetReactState(REACT_PASSIVE);
}
void Register()
@@ -1419,6 +1424,53 @@ public:
}
};
+class spell_gen_luck_of_the_draw : public SpellScriptLoader
+{
+ public:
+ spell_gen_luck_of_the_draw() : SpellScriptLoader("spell_gen_luck_of_the_draw") { }
+
+ class spell_gen_luck_of_the_draw_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_gen_luck_of_the_draw_AuraScript);
+
+ // cheap hax to make it have update calls
+ void CalcPeriodic(AuraEffect const* /*effect*/, bool& isPeriodic, int32& amplitude)
+ {
+ isPeriodic = true;
+ amplitude = 5 * IN_MILLISECONDS;
+ }
+
+ void Update(AuraEffect* /*effect*/)
+ {
+ if (GetUnitOwner()->GetTypeId() != TYPEID_PLAYER)
+ return;
+
+ LFGDungeonEntry const* randomDungeon = sLFGDungeonStore.LookupEntry(*(sLFGMgr->GetSelectedDungeons(GetUnitOwner()->GetGUID()).begin()));
+ Group* group = GetUnitOwner()->ToPlayer()->GetGroup();
+ Map const* map = GetUnitOwner()->GetMap();
+ if (group && group->isLFGGroup())
+ if (uint32 dungeonId = sLFGMgr->GetDungeon(group->GetGUID(), true))
+ if (LFGDungeonEntry const* dungeon = sLFGDungeonStore.LookupEntry(dungeonId))
+ if (dungeon->map == map->GetId() && dungeon->difficulty == map->GetDifficulty())
+ if (randomDungeon && randomDungeon->type == LFG_TYPE_RANDOM)
+ return; // in correct dungeon
+
+ Remove(AURA_REMOVE_BY_DEFAULT);
+ }
+
+ void Register()
+ {
+ DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_gen_luck_of_the_draw_AuraScript::CalcPeriodic, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE);
+ OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_gen_luck_of_the_draw_AuraScript::Update, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_gen_luck_of_the_draw_AuraScript();
+ }
+};
+
void AddSC_generic_spell_scripts()
{
new spell_gen_absorb0_hitlimit1();
@@ -1451,4 +1503,5 @@ void AddSC_generic_spell_scripts()
new spell_gen_vehicle_scaling();
new spell_gen_oracle_wolvar_reputation();
new spell_gen_damage_reduction_aura();
+ new spell_gen_luck_of_the_draw();
}
diff --git a/src/server/scripts/World/go_scripts.cpp b/src/server/scripts/World/go_scripts.cpp
index 3bb969977b6..4799b893286 100644
--- a/src/server/scripts/World/go_scripts.cpp
+++ b/src/server/scripts/World/go_scripts.cpp
@@ -16,13 +16,6 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: GO_Scripts
-SD%Complete: 100
-SDComment: Quest support: 4285, 4287, 4288(crystal pylons), 4296, 6481, 10990, 10991, 10992, Field_Repair_Bot->Teaches spell 22704. Barov_journal->Teaches spell 26089, 12843, 12982, 2936. Soulwell
-SDCategory: Game Objects
-EndScriptData */
-
/* ContentData
go_cat_figurine (the "trap" version of GO, two different exist)
go_northern_crystal_pylon
@@ -47,6 +40,16 @@ go_jotunheim_cage
go_table_theka
go_soulwell
go_bashir_crystalforge
+go_ethereal_teleport_pad
+go_soulwell
+go_dragonflayer_cage
+go_tadpole_cage
+go_black_cage
+go_amberpine_outhouse
+go_hive_pod
+go_gjalerbron_cage
+go_large_gjalerbron_cage
+go_veil_skith_cage
EndContentData */
#include "ScriptPCH.h"
@@ -922,6 +925,32 @@ public:
};
/*######
+## go_ethereal_teleport_pad
+######*/
+
+enum eEtherealTeleportPad
+{
+ NPC_IMAGE_WIND_TRADER = 20518,
+ ITEM_TELEPORTER_POWER_PACK = 28969,
+};
+
+class go_ethereal_teleport_pad : public GameObjectScript
+{
+public:
+ go_ethereal_teleport_pad() : GameObjectScript("go_ethereal_teleport_pad") { }
+
+ bool OnGossipHello(Player* player, GameObject* pGO)
+ {
+ if (!player->HasItemCount(ITEM_TELEPORTER_POWER_PACK, 1))
+ return false;
+
+ pGO->SummonCreature(NPC_IMAGE_WIND_TRADER, pGO->GetPositionX(), pGO->GetPositionY(), pGO->GetPositionZ(), pGO->GetAngle(player), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000);
+
+ return true;
+ }
+};
+
+/*######
## go_soulwell
######*/
@@ -1152,6 +1181,7 @@ public:
/*######
## Quest 1126: Hive in the Tower
+## go_hive_pod
######*/
enum eHives
@@ -1251,6 +1281,42 @@ class go_large_gjalerbron_cage : public GameObjectScript
}
};
+/*########
+#### go_veil_skith_cage
+#####*/
+
+enum MissingFriends
+{
+ QUEST_MISSING_FRIENDS = 10852,
+ NPC_CAPTIVE_CHILD = 22314,
+ SAY_FREE = 0,
+};
+
+class go_veil_skith_cage : public GameObjectScript
+{
+ public:
+ go_veil_skith_cage() : GameObjectScript("go_veil_skith_cage") { }
+
+ bool OnGossipHello(Player* player, GameObject* go)
+ {
+ if (player->GetQuestStatus(QUEST_MISSING_FRIENDS) == QUEST_STATUS_INCOMPLETE)
+ {
+ std::list<Creature*> ChildrenList;
+ GetCreatureListWithEntryInGrid(ChildrenList, go, NPC_CAPTIVE_CHILD, INTERACTION_DISTANCE);
+ for (std::list<Creature*>::const_iterator itr = ChildrenList.begin(); itr != ChildrenList.end(); ++itr)
+ {
+ go->UseDoorOrButton();
+ player->KilledMonsterCredit(NPC_CAPTIVE_CHILD, (*itr)->GetGUID());
+ (*itr)->ForcedDespawn(5000);
+ (*itr)->GetMotionMaster()->MovePoint(1, go->GetPositionX()+5, go->GetPositionY(), go->GetPositionZ());
+ (*itr)->AI()->Talk(SAY_FREE);
+ (*itr)->GetMotionMaster()->Clear();
+ }
+ }
+ return false;
+ }
+};
+
void AddSC_go_scripts()
{
new go_cat_figurine;
@@ -1282,6 +1348,7 @@ void AddSC_go_scripts()
new go_jotunheim_cage;
new go_table_theka;
new go_inconspicuous_landmark;
+ new go_ethereal_teleport_pad;
new go_soulwell;
new go_tadpole_cage;
new go_dragonflayer_cage;
@@ -1291,4 +1358,5 @@ void AddSC_go_scripts()
new go_massive_seaforium_charge;
new go_gjalerbron_cage;
new go_large_gjalerbron_cage;
+ new go_veil_skith_cage;
}
diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp
index a5e5b467fc7..38a56f7b64a 100644
--- a/src/server/scripts/World/npcs_special.cpp
+++ b/src/server/scripts/World/npcs_special.cpp
@@ -1623,46 +1623,44 @@ public:
## npc_winter_reveler
####*/
+enum WinterReveler
+{
+ SPELL_MISTLETOE_DEBUFF = 26218,
+ SPELL_CREATE_MISTLETOE = 26206,
+ SPELL_CREATE_HOLLY = 26207,
+ SPELL_CREATE_SNOWFLAKES = 45036,
+};
+
class npc_winter_reveler : public CreatureScript
{
-public:
- npc_winter_reveler() : CreatureScript("npc_winter_reveler") { }
+ public:
+ npc_winter_reveler() : CreatureScript("npc_winter_reveler") { }
- struct npc_winter_revelerAI : public ScriptedAI
- {
- npc_winter_revelerAI(Creature* c) : ScriptedAI(c) {}
- void ReceiveEmote(Player* player, uint32 emote)
+ struct npc_winter_revelerAI : public ScriptedAI
{
- if (!IsHolidayActive(HOLIDAY_FEAST_OF_WINTER_VEIL))
- return;
- //TODO: check auralist.
- if (player->HasAura(26218))
- return;
+ npc_winter_revelerAI(Creature* c) : ScriptedAI(c) {}
- if (emote == TEXT_EMOTE_KISS)
+ void ReceiveEmote(Player* player, uint32 emote)
{
- me->CastSpell(me, 26218, false);
- player->CastSpell(player, 26218, false);
- switch (urand(0, 2))
+ if (player->HasAura(SPELL_MISTLETOE_DEBUFF))
+ return;
+
+ if (!IsHolidayActive(HOLIDAY_FEAST_OF_WINTER_VEIL))
+ return;
+
+ if (emote == TEXT_EMOTE_KISS)
{
- case 0:
- me->CastSpell(player, 26207, false);
- break;
- case 1:
- me->CastSpell(player, 26206, false);
- break;
- case 2:
- me->CastSpell(player, 45036, false);
- break;
+ uint32 spellId = RAND<uint32>(SPELL_CREATE_MISTLETOE, SPELL_CREATE_HOLLY, SPELL_CREATE_SNOWFLAKES);
+ me->CastSpell(player, spellId, false);
+ me->CastSpell(player, SPELL_MISTLETOE_DEBUFF, false);
}
}
- }
- };
+ };
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_winter_revelerAI(creature);
- }
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_winter_revelerAI(creature);
+ }
};
/*####
@@ -1678,8 +1676,6 @@ public:
#define C_VIPER 19921
-#define RAND 5
-
class npc_snake_trap : public CreatureScript
{
public:
@@ -1726,7 +1722,7 @@ public:
float attackRadius = me->GetAttackDistance(who);
if (me->IsWithinDistInMap(who, attackRadius) && me->IsWithinLOSInMap(who))
{
- if (!(rand() % RAND))
+ if (!(rand() % 5))
{
me->setAttackTimer(BASE_ATTACK, (rand() % 10) * 100);
SpellTimer = (rand() % 10) * 100;
@@ -2164,6 +2160,121 @@ public:
};
/*######
+# npc_fire_elemental
+######*/
+#define SPELL_FIRENOVA 12470
+#define SPELL_FIRESHIELD 13376
+#define SPELL_FIREBLAST 57984
+
+class npc_fire_elemental : public CreatureScript
+{
+public:
+ npc_fire_elemental() : CreatureScript("npc_fire_elemental") { }
+
+ struct npc_fire_elementalAI : public ScriptedAI
+ {
+ npc_fire_elementalAI(Creature* creature) : ScriptedAI(creature) {}
+
+ uint32 FireNova_Timer;
+ uint32 FireShield_Timer;
+ uint32 FireBlast_Timer;
+
+ void Reset()
+ {
+ FireNova_Timer = 5000 + rand() % 15000; // 5-20 sec cd
+ FireBlast_Timer = 5000 + rand() % 15000; // 5-20 sec cd
+ FireShield_Timer = 0;
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_FIRE, true);
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ if (me->HasUnitState(UNIT_STAT_CASTING))
+ return;
+
+ if (FireShield_Timer <= diff)
+ {
+ DoCast(me->getVictim(), SPELL_FIRESHIELD);
+ FireShield_Timer = 2 * IN_MILLISECONDS;
+ }
+ else
+ FireShield_Timer -= diff;
+
+ if (FireBlast_Timer <= diff)
+ {
+ DoCast(me->getVictim(), SPELL_FIREBLAST);
+ FireBlast_Timer = 5000 + rand() % 15000; // 5-20 sec cd
+ }
+ else
+ FireBlast_Timer -= diff;
+
+ if (FireNova_Timer <= diff)
+ {
+ DoCast(me->getVictim(), SPELL_FIRENOVA);
+ FireNova_Timer = 5000 + rand() % 15000; // 5-20 sec cd
+ }
+ else
+ FireNova_Timer -= diff;
+
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI *GetAI(Creature* creature) const
+ {
+ return new npc_fire_elementalAI(creature);
+ }
+};
+
+/*######
+# npc_earth_elemental
+######*/
+#define SPELL_ANGEREDEARTH 36213
+
+class npc_earth_elemental : public CreatureScript
+{
+public:
+ npc_earth_elemental() : CreatureScript("npc_earth_elemental") { }
+
+ struct npc_earth_elementalAI : public ScriptedAI
+ {
+ npc_earth_elementalAI(Creature* creature) : ScriptedAI(creature) {}
+
+ uint32 AngeredEarth_Timer;
+
+ void Reset()
+ {
+ AngeredEarth_Timer = 0;
+ me->ApplySpellImmune(0, IMMUNITY_SCHOOL, SPELL_SCHOOL_MASK_NATURE, true);
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ if (AngeredEarth_Timer <= diff)
+ {
+ DoCast(me->getVictim(), SPELL_ANGEREDEARTH);
+ AngeredEarth_Timer = 5000 + rand() % 15000; // 5-20 sec cd
+ }
+ else
+ AngeredEarth_Timer -= diff;
+
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI *GetAI(Creature* creature) const
+ {
+ return new npc_earth_elementalAI(creature);
+ }
+};
+
+/*######
# npc_wormhole
######*/
@@ -2673,5 +2784,7 @@ void AddSC_npcs_special()
new npc_locksmith;
new npc_tabard_vendor;
new npc_experience;
+ new npc_fire_elemental;
+ new npc_earth_elemental;
}
diff --git a/src/server/shared/Database/DatabaseWorkerPool.h b/src/server/shared/Database/DatabaseWorkerPool.h
index adf5902a591..f1d01661210 100755
--- a/src/server/shared/Database/DatabaseWorkerPool.h
+++ b/src/server/shared/Database/DatabaseWorkerPool.h
@@ -158,6 +158,7 @@ class DatabaseWorkerPool
}
//! Enqueues a one-way SQL operation in prepared statement format that will be executed asynchronously.
+ //! Statement must be prepared with CONNECTION_ASYNC flag.
void Execute(PreparedStatement* stmt)
{
PreparedStatementTask* task = new PreparedStatementTask(stmt);
@@ -195,6 +196,7 @@ class DatabaseWorkerPool
}
//! Directly executes a one-way SQL operation in prepared statement format, that will block the calling thread until finished.
+ //! Statement must be prepared with the CONNECTION_SYNCH flag.
void DirectExecute(PreparedStatement* stmt)
{
T* t = GetFreeConnection();
@@ -203,7 +205,7 @@ class DatabaseWorkerPool
}
/**
- Syncrhonous query (with resultset) methods.
+ Synchronous query (with resultset) methods.
*/
//! Directly executes an SQL query in string format that will block the calling thread until finished.
@@ -256,6 +258,7 @@ class DatabaseWorkerPool
//! Directly executes an SQL query in prepared format that will block the calling thread until finished.
//! Returns reference counted auto pointer, no need for manual memory management in upper level code.
+ //! Statement must be prepared with CONNECTION_SYNCH flag.
PreparedQueryResult Query(PreparedStatement* stmt)
{
T* t = GetFreeConnection();
@@ -297,6 +300,7 @@ class DatabaseWorkerPool
//! Enqueues a query in prepared format that will set the value of the PreparedQueryResultFuture return object as soon as the query is executed.
//! The return value is then processed in ProcessQueryCallback methods.
+ //! Statement must be prepared with CONNECTION_ASYNC flag.
PreparedQueryResultFuture AsyncQuery(PreparedStatement* stmt)
{
PreparedQueryResultFuture res;
@@ -308,6 +312,7 @@ class DatabaseWorkerPool
//! Enqueues a vector of SQL operations (can be both adhoc and prepared) that will set the value of the QueryResultHolderFuture
//! return object as soon as the query is executed.
//! The return value is then processed in ProcessQueryCallback methods.
+ //! Any prepared statements added to this holder need to be prepared with the CONNECTION_ASYNC flag.
QueryResultHolderFuture DelayQueryHolder(SQLQueryHolder* holder)
{
QueryResultHolderFuture res;
diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
index f93c4a70d7c..0cbf4f8f4b4 100755
--- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp
+++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
@@ -26,7 +26,7 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PREPARE_STATEMENT(CHAR_ADD_QUEST_POOL_SAVE, "INSERT INTO pool_quest_save (pool_id, quest_id) VALUES (?, ?)", CONNECTION_ASYNC)
PREPARE_STATEMENT(CHAR_DEL_NONEXISTENT_GUILD_BANK_ITEM, "DELETE FROM guild_bank_item WHERE guildid = ? AND TabId = ? AND SlotId = ?", CONNECTION_ASYNC)
PREPARE_STATEMENT(CHAR_DEL_EXPIRED_BANS, "UPDATE character_banned SET active = 0 WHERE unbandate <= UNIX_TIMESTAMP() AND unbandate <> bandate", CONNECTION_ASYNC)
- PREPARE_STATEMENT(CHAR_GET_GUID_BY_NAME, "SELECT guid FROM characters WHERE name = ?", CONNECTION_SYNCH);
+ PREPARE_STATEMENT(CHAR_GET_GUID_BY_NAME, "SELECT guid FROM characters WHERE name = ?", CONNECTION_BOTH);
PREPARE_STATEMENT(CHAR_GET_CHECK_NAME, "SELECT 1 FROM characters WHERE name = ?", CONNECTION_ASYNC);
PREPARE_STATEMENT(CHAR_GET_SUM_CHARS, "SELECT COUNT(guid) FROM characters WHERE account = ?", CONNECTION_ASYNC);
PREPARE_STATEMENT(CHAR_GET_CHAR_CREATE_INFO, "SELECT level, race, class FROM characters WHERE account = ? LIMIT 0, ?", CONNECTION_ASYNC);
@@ -36,6 +36,11 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PREPARE_STATEMENT(CHAR_GET_GUID_BY_NAME_FILTER, "SELECT guid, name FROM characters WHERE name LIKE CONCAT('%', ?, '%')", CONNECTION_SYNCH)
PREPARE_STATEMENT(CHAR_GET_BANINFO_LIST, "SELECT bandate, unbandate, bannedby, banreason FROM character_banned WHERE guid = ? ORDER BY unbandate", CONNECTION_SYNCH)
PREPARE_STATEMENT(CHAR_GET_BANNED_NAME, "SELECT characters.name FROM characters, character_banned WHERE character_banned.guid = ? AND character_banned.guid = characters.guid", CONNECTION_SYNCH)
+ PREPARE_STATEMENT(CHAR_GET_ENUM, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.playerBytes, c.playerBytes2, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? LEFT JOIN guild_member AS gm ON c.guid = gm.guid LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? ORDER BY c.guid", CONNECTION_ASYNC);
+ PREPARE_STATEMENT(CHAR_GET_ENUM_DECLINED_NAME, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.playerBytes, c.playerBytes2, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid LEFT JOIN guild_member AS gm ON c.guid = gm.guid LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? ORDER BY c.guid", CONNECTION_ASYNC);
+ PREPARE_STATEMENT(CHAR_GET_PET_SLOTS, "SELECT owner, slot FROM character_pet WHERE owner = ? AND slot >= ? AND slot <= ? ORDER BY slot", CONNECTION_ASYNC);
+ PREPARE_STATEMENT(CHAR_GET_FREE_NAME, "SELECT guid, name FROM characters WHERE guid = ? AND account = ? AND (at_login & ?) = ? AND NOT EXISTS (SELECT NULL FROM characters WHERE name = ?)", CONNECTION_ASYNC);
+ PREPARE_STATEMENT(CHAR_GET_GUID_RACE_ACC_BY_NAME, "SELECT guid, race, account FROM characters WHERE name = ?", CONNECTION_ASYNC);
// Start LoginQueryHolder content
PREPARE_STATEMENT(CHAR_LOAD_PLAYER, "SELECT guid, account, name, race, class, gender, level, xp, money, playerBytes, playerBytes2, playerFlags, "
@@ -111,6 +116,8 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PREPARE_STATEMENT(CHAR_LOAD_PLAYER_NAME_CLASS, "SELECT name, class FROM characters WHERE guid = ?", CONNECTION_SYNCH);
PREPARE_STATEMENT(CHAR_LOAD_MATCH_MAKER_RATING, "SELECT matchMakerRating FROM character_arena_stats WHERE guid = ? AND slot = ?", CONNECTION_SYNCH);
PREPARE_STATEMENT(CHAR_GET_CHARACTER_COUNT, "SELECT account, COUNT(guid) FROM characters WHERE account = ? GROUP BY account", CONNECTION_ASYNC);
+ PREPARE_STATEMENT(CHAR_UPDATE_NAME, "UPDATE characters set name = ?, at_login = at_login & ~ ? WHERE guid = ?", CONNECTION_ASYNC);
+ PREPARE_STATEMENT(CHAR_DEL_DECLINED_NAME, "DELETE FROM character_declinedname WHERE guid = ?", CONNECTION_ASYNC);
// Guild handling
// 0: uint32, 1: string, 2: uint32, 3: string, 4: string, 5: uint64, 6-10: uint32, 11: uint64
diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/shared/Database/Implementation/CharacterDatabase.h
index f06a17aa924..a9464aed34f 100755
--- a/src/server/shared/Database/Implementation/CharacterDatabase.h
+++ b/src/server/shared/Database/Implementation/CharacterDatabase.h
@@ -56,6 +56,11 @@ enum CharacterDatabaseStatements
CHAR_GET_GUID_BY_NAME_FILTER,
CHAR_GET_BANINFO_LIST,
CHAR_GET_BANNED_NAME,
+ CHAR_GET_ENUM,
+ CHAR_GET_ENUM_DECLINED_NAME,
+ CHAR_GET_PET_SLOTS,
+ CHAR_GET_FREE_NAME,
+ CHAR_GET_GUID_RACE_ACC_BY_NAME,
CHAR_LOAD_PLAYER,
CHAR_LOAD_PLAYER_GROUP,
CHAR_LOAD_PLAYER_BOUNDINSTANCES,
@@ -120,6 +125,8 @@ enum CharacterDatabaseStatements
CHAR_LOAD_PLAYER_NAME_CLASS,
CHAR_LOAD_MATCH_MAKER_RATING,
CHAR_GET_CHARACTER_COUNT,
+ CHAR_UPDATE_NAME,
+ CHAR_DEL_DECLINED_NAME,
CHAR_ADD_GUILD,
CHAR_DEL_GUILD,
diff --git a/src/server/shared/Database/MySQLConnection.cpp b/src/server/shared/Database/MySQLConnection.cpp
index 70a8beb3d70..9ce924127ba 100755
--- a/src/server/shared/Database/MySQLConnection.cpp
+++ b/src/server/shared/Database/MySQLConnection.cpp
@@ -527,7 +527,12 @@ bool MySQLConnection::_HandleMySQLErrno(uint32 errNo)
// Query related errors - skip query
case 1058: // "Column count doesn't match value count"
case 1062: // "Duplicate entry '%s' for key '%d'"
- case 1054: // "Unknown column '%s' in 'order clause'"
+ return false;
+
+ // Outdated table or database structure - terminate core
+ case 1054: // "Unknown column '%s' in '%s'"
+ case 1146: // "Table '%s' doesn't exist"
+ WPFatal(!errNo, "Your database structure is not up to date. Please make sure you've executed all queries in the sql/updates folders.");
return false;
default:
diff --git a/src/server/shared/Database/MySQLConnection.h b/src/server/shared/Database/MySQLConnection.h
index 03846c47ecd..2e134cfa814 100755
--- a/src/server/shared/Database/MySQLConnection.h
+++ b/src/server/shared/Database/MySQLConnection.h
@@ -33,6 +33,7 @@ enum ConnectionFlags
{
CONNECTION_ASYNC = 0x1,
CONNECTION_SYNCH = 0x2,
+ CONNECTION_BOTH = CONNECTION_ASYNC | CONNECTION_SYNCH,
};
struct MySQLConnectionInfo
diff --git a/src/server/shared/Debugging/Errors.h b/src/server/shared/Debugging/Errors.h
index cfa1452864f..921363d6dc5 100755
--- a/src/server/shared/Debugging/Errors.h
+++ b/src/server/shared/Debugging/Errors.h
@@ -22,11 +22,12 @@
#include "Common.h"
#include "Log.h"
#include <ace/Stack_Trace.h>
+#include <ace/OS_NS_unistd.h>
#define WPAssert( assertion ) { if (!(assertion)) { ACE_Stack_Trace st; sLog->outError( "\n%s:%i in %s ASSERTION FAILED:\n %s\n%s\n", __FILE__, __LINE__, __FUNCTION__, #assertion, st.c_str()); assert( #assertion &&0 ); ((void(*)())NULL)();} }
#define WPError( assertion, errmsg ) if ( ! (assertion) ) { sLog->outError( "%\n%s:%i in %s ERROR:\n %s\n", __FILE__, __LINE__, __FUNCTION__, (char *)errmsg ); assert( false ); }
#define WPWarning( assertion, errmsg ) if ( ! (assertion) ) { sLog->outError( "\n%s:%i in %s WARNING:\n %s\n", __FILE__, __LINE__, __FUNCTION__, (char *)errmsg ); }
-#define WPFatal( assertion, errmsg ) if ( ! (assertion) ) { sLog->outError( "\n%s:%i in %s FATAL ERROR:\n %s\n", __FILE__, __LINE__, __FUNCTION__, (char *)errmsg ); assert( #assertion &&0 ); abort(); }
+#define WPFatal( assertion, errmsg ) if ( ! (assertion) ) { sLog->outError( "\n%s:%i in %s FATAL ERROR:\n %s\n", __FILE__, __LINE__, __FUNCTION__, (char *)errmsg ); ACE_OS::sleep(10); assert( #assertion &&0 ); abort(); }
#define ASSERT WPAssert
#endif
diff --git a/src/server/shared/Threading/Callback.h b/src/server/shared/Threading/Callback.h
index b179b215253..6ec2f49c8ff 100755
--- a/src/server/shared/Threading/Callback.h
+++ b/src/server/shared/Threading/Callback.h
@@ -29,107 +29,178 @@ typedef ACE_Future<PreparedQueryResult> PreparedQueryResultFuture;
issued the request. <ParamType> is variable type of parameter that is used as parameter
for the callback function.
*/
-template <typename Result, typename ParamType>
+#define CALLBACK_STAGE_INVALID uint8(-1)
+
+template <typename Result, typename ParamType, bool chain = false>
class QueryCallback
{
public:
- QueryCallback() {}
+ QueryCallback() : _stage(chain ? 0 : CALLBACK_STAGE_INVALID) {}
+ //! The parameter of this function should be a resultset returned from either .AsyncQuery or .AsyncPQuery
void SetFutureResult(ACE_Future<Result> value)
{
- result = value;
+ _result = value;
}
ACE_Future<Result> GetFutureResult()
{
- return result;
+ return _result;
}
int IsReady()
{
- return result.ready();
+ return _result.ready();
}
void GetResult(Result& res)
{
- result.get(res);
+ _result.get(res);
}
void FreeResult()
{
- result.cancel();
+ _result.cancel();
}
void SetParam(ParamType value)
{
- param = value;
+ _param = value;
}
ParamType GetParam()
{
- return param;
+ return _param;
+ }
+
+ //! Resets the stage of the callback chain
+ void ResetStage()
+ {
+ if (!chain)
+ return;
+
+ _stage = 0;
+ }
+
+ //! Advances the callback chain to the next stage, so upper level code can act on its results accordingly
+ void NextStage()
+ {
+ if (!chain)
+ return;
+
+ ++_stage;
+ }
+
+ //! Returns the callback stage (or CALLBACK_STAGE_INVALID if invalid)
+ uint8 GetStage()
+ {
+ return _stage;
+ }
+
+ //! Resets all underlying variables (param, result and stage)
+ void Reset()
+ {
+ SetParam(NULL);
+ FreeResult();
+ ResetStage();
}
private:
- ACE_Future<Result> result;
- ParamType param;
+ ACE_Future<Result> _result;
+ ParamType _param;
+ uint8 _stage;
};
-template <typename Result, typename ParamType1, typename ParamType2>
+template <typename Result, typename ParamType1, typename ParamType2, bool chain = false>
class QueryCallback_2
{
public:
- QueryCallback_2() {}
+ QueryCallback_2() : _stage(chain ? 0 : CALLBACK_STAGE_INVALID) {}
+ //! The parameter of this function should be a resultset returned from either .AsyncQuery or .AsyncPQuery
void SetFutureResult(ACE_Future<Result> value)
{
- result = value;
+ _result = value;
}
ACE_Future<Result> GetFutureResult()
{
- return result;
+ return _result;
}
int IsReady()
{
- return result.ready();
+ return _result.ready();
}
void GetResult(Result& res)
{
- result.get(res);
+ _result.get(res);
}
void FreeResult()
{
- result.cancel();
+ _result.cancel();
}
void SetFirstParam(ParamType1 value)
{
- param_1 = value;
+ _param_1 = value;
}
void SetSecondParam(ParamType2 value)
{
- param_2 = value;
+ _param_2 = value;
}
ParamType1 GetFirstParam()
{
- return param_1;
+ return _param_1;
}
ParamType2 GetSecondParam()
{
- return param_2;
+ return _param_2;
+ }
+
+ //! Resets the stage of the callback chain
+ void ResetStage()
+ {
+ if (!chain)
+ return;
+
+ _stage = 0;
+ }
+
+ //! Advances the callback chain to the next stage, so upper level code can act on its results accordingly
+ void NextStage()
+ {
+ if (!chain)
+ return;
+
+ ++_stage;
+ }
+
+ //! Returns the callback stage (or CALLBACK_STAGE_INVALID if invalid)
+ uint8 GetStage()
+ {
+ return _stage;
+ }
+
+ //! Resets all underlying variables (param, result and stage)
+ void Reset()
+ {
+ SetFirstParam(NULL);
+ SetSecondParam(NULL);
+ FreeResult();
+ ResetStage();
}
private:
- ACE_Future<Result> result;
- ParamType1 param_1;
- ParamType2 param_2;
+ ACE_Future<Result> _result;
+ ParamType1 _param_1;
+ ParamType2 _param_2;
+ uint8 _stage;
};
#endif \ No newline at end of file
diff --git a/src/server/shared/Threading/LockedQueue.h b/src/server/shared/Threading/LockedQueue.h
index 92eab440684..4d2ddd33f5f 100755
--- a/src/server/shared/Threading/LockedQueue.h
+++ b/src/server/shared/Threading/LockedQueue.h
@@ -98,13 +98,16 @@ namespace ACE_Based
return true;
}
- //! Peeks at the top of the queue. Remember to unlock after use.
- T& peek()
+ //! Peeks at the top of the queue. Check if the queue is empty before calling! Remember to unlock after use if autoUnlock == false.
+ T& peek(bool autoUnlock = false)
{
lock();
T& result = _queue.front();
+ if (autoUnlock)
+ unlock();
+
return result;
}
diff --git a/src/server/worldserver/CommandLine/CliRunnable.cpp b/src/server/worldserver/CommandLine/CliRunnable.cpp
index 564f6028eca..61352521d9f 100755
--- a/src/server/worldserver/CommandLine/CliRunnable.cpp
+++ b/src/server/worldserver/CommandLine/CliRunnable.cpp
@@ -104,7 +104,7 @@ void utf8print(void* /*arg*/, const char* str)
printf(temp_buf);
#else
{
- printf(str);
+ printf("%s", str);
fflush(stdout);
}
#endif
diff --git a/src/server/worldserver/RemoteAccess/RASocket.cpp b/src/server/worldserver/RemoteAccess/RASocket.cpp
index 71d4d1df035..82238ee54bc 100755
--- a/src/server/worldserver/RemoteAccess/RASocket.cpp
+++ b/src/server/worldserver/RemoteAccess/RASocket.cpp
@@ -286,7 +286,7 @@ int RASocket::subnegotiate()
if (n >= 1024)
{
- sLog->outRemote("RASocket::subnegotiate: allocated buffer 1024 bytes was too small for negotiation packet, size: %u", n);
+ sLog->outRemote("RASocket::subnegotiate: allocated buffer 1024 bytes was too small for negotiation packet, size: %u", uint32(n));
return -1;
}
diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist
index a8c0d91b2e6..1e37f50aa63 100644
--- a/src/server/worldserver/worldserver.conf.dist
+++ b/src/server/worldserver/worldserver.conf.dist
@@ -1744,7 +1744,8 @@ Channel.RestrictedLfg = 1
#
# Channel.SilentlyGMJoin
-# Description: Silently join GM characters to channels
+# Description: Silently join GM characters to channels. If set to 1, channel kick and ban
+# commands issued by a GM will not be broadcasted.
# Default: 0 - (Disabled, Join with announcement)
# 1 - (Enabled, Join without announcement)