5 Commits
10 changed files with 9395 additions and 167 deletions
@@ -0,0 +1,740 @@
-- =================================================================================
-- Lightforged Draenei Starting Zone (Map 1860 - AreaID/ZoneID 9359 - The Vindicaar)
-- =================================================================================
-- =======================
-- Misc: Zone Calibrations
-- =======================
DELETE FROM `phase_area` WHERE `AreaId`=9359;
UPDATE `creature` SET `phaseUseFlags`=0, `PhaseId`=0, `spawntimesecs`=180, `wander_distance`=0, `MovementType`=0 WHERE `map`=1860;
UPDATE `gameobject` SET `spawntimesecs`=180 WHERE `map`=1860;
-- ============================
-- Misc: Spell Area Calibration
-- ============================
DELETE FROM `spell_area` WHERE `area`=9359;
INSERT INTO `spell_area` (`spell`, `area`, `quest_start`, `quest_end`, `aura_spell`, `teamId`, `racemask`, `gender`, `flags`, `quest_start_status`, `quest_end_status`, `comment`) VALUES
(49416, 9359, 49772, 0, 0, -1, 536870912, 2, 3, 74, 64, 'Generic Quest Invisibility Detection 1 - Lightforged Draenei (The Vindicaar, The Vindicaar)');
DELETE FROM `spell_area` WHERE `area`=5150 AND `spell`=49417;
INSERT INTO `spell_area` (`spell`, `area`, `quest_start`, `quest_end`, `aura_spell`, `teamId`, `racemask`, `gender`, `flags`, `quest_start_status`, `quest_end_status`, `comment`) VALUES
(49417, 5150, 50313, 50313, 0, -1, 536870912, 2, 3, 10, 64, 'Generic Quest Invisibility Detection 2 - Lightforged Draenei (Dwarven District, Stormwind City)');
DELETE FROM `spell_area` WHERE `area`=9171 AND `spell` IN (49417,60922);
INSERT INTO `spell_area` (`spell`, `area`, `quest_start`, `quest_end`, `aura_spell`, `teamId`, `racemask`, `gender`, `flags`, `quest_start_status`, `quest_end_status`, `comment`) VALUES
(49417, 9171, 50313, 0, 0, -1, 536870912, 2, 3, 64, 64, 'Generic Quest Invisibility Detection 2 - Lightforged Draenei (Stormwind Embassy, Stormwind City)'),
(60922, 9171, 49698, 50071, 0, -1, 0, 2, 3, 74, 64, 'Generic Quest Invisibility Detection 2 (Stormwind Embassy, Stormwind City)');
-- =========================================
-- Quest For the Alliance (49772)
-- Quest Heritage of the Lightforged (49782)
-- =========================================
UPDATE `quest_template_addon` SET `ScriptName`='SmartQuest' WHERE `ID`=49772;
DELETE FROM `smart_scripts` WHERE `entryorguid`=49772 AND `source_type`=5;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `Difficulties`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param_string`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `action_param7`, `action_param_string`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_param_string`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(49772, 5, 0, 0, '', 91, 0, 100, 0, 0, 0, 0, 0, 0, '', 62, 1860, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 457.285, 1449.185, 757.572, 0.408, 'Lightforged Draenei Quest - On Quest Abandoned - Teleport Player');
-- NPC Captain Fareeya (130993)
DELETE FROM `creature` WHERE `guid`=243563;
UPDATE `creature_template_difficulty` SET `ContentTuningID`=293, `VerifiedBuild`=69587 WHERE `Entry`=130993;
DELETE FROM `creature_text` WHERE `CreatureID`=130993;
DELETE FROM `smart_scripts` WHERE `entryorguid`=130993 AND `source_type`=0;
DELETE FROM `smart_scripts` WHERE `entryorguid`=13099300 AND `source_type`=9;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `Difficulties`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param_string`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `action_param7`, `action_param_string`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_param_string`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(130993, 0, 0, 0, '', 19, 0, 100, 0, 49772, 0, 0, 0, 0, '', 143, 6481, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Captain Fareeya - On Quest Taken - Run Conversation'),
(130993, 0, 1, 0, '', 20, 0, 100, 0, 49782, 0, 0, 0, 0, '', 143, 20003, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Captain Fareeya - On Quest Rewarded - Run Conversation');
-- Conversation (20003)
DELETE FROM `conversation_template` WHERE `Id`=20003;
INSERT INTO `conversation_template` (`Id`, `FirstLineId`, `TextureKitId`, `Flags`, `ScriptName`, `VerifiedBuild`) VALUES
(20003, 15593, 0, 0, '', 69587);
DELETE FROM `conversation_actors` WHERE `ConversationId`=20003;
INSERT INTO `conversation_actors` (`ConversationId`, `ConversationActorId`, `ConversationActorGuid`, `ConversationActorNearId`, `Idx`, `CreatureId`, `CreatureDisplayInfoId`, `NoActorObject`, `ActivePlayerObject`, `VerifiedBuild`) VALUES
(20003, 61703, 238180, 0, 0, 0, 0, 0, 0, 69587);
DELETE FROM `conversation_line_template` WHERE `Id` IN (15593,15594);
INSERT INTO `conversation_line_template` (`Id`, `UiCameraID`, `ActorIdx`, `Flags`, `ChatType`, `VerifiedBuild`, `Unk`) VALUES
(15593, 0, 0, 0, 0, 69587, 0),
(15594, 0, 0, 0, 0, 69587, 0);
-- GO Portal to Stormwind (278732)
UPDATE `gameobject_template` SET `IconName`='questinteract' WHERE `entry`=278732;
DELETE FROM `gameobject_addon` WHERE `guid`=143827;
INSERT INTO `gameobject_addon` (`guid`, `parent_rotation0`, `parent_rotation1`, `parent_rotation2`, `parent_rotation3`, `invisibilityType`, `invisibilityValue`, `WorldEffectID`, `AIAnimKitID`) VALUES
(143827, 0, 0, 0, 1, 7, 1, 0, 0);
DELETE FROM `gameobject_template_locale` WHERE `entry` IN (278732);
INSERT INTO `gameobject_template_locale` (`entry`, `locale`, `name`, `castBarCaption`, `unk1`, `VerifiedBuild`) VALUES
(278732, 'deDE', 'Portal nach Sturmwind', '', NULL, 69587),
(278732, 'esES', 'Portal a Ventormenta', '', NULL, 69587),
(278732, 'esMX', 'Portal a Ventormenta', '', NULL, 69587),
(278732, 'frFR', 'Portail vers Hurlevent', '', NULL, 69587),
(278732, 'itIT', 'Portale per Roccavento', '', '', 69587),
(278732, 'koKR', '스톰윈드로 통하는 차원문', '', NULL, 69587),
(278732, 'ruRU', 'Портал в Штормград', '', NULL, 69587),
(278732, 'zhCN', '通往暴风城的传送门', '', NULL, 69587),
(278732, 'zhTW', '暴風城傳送門', '', NULL, 69587);
-- ========================================
-- Quest Stranger in a Strange Land (50313)
-- ========================================
UPDATE `quest_poi_points` SET `X`=-8358, `Y`=622, `Z`=95 WHERE `QuestID`=50313 AND `Idx1`=0 AND `Idx2`=0;
-- NPC Vindicator Minkey (131334)
UPDATE `creature` SET `PhaseId`=0 WHERE `guid`=241642;
UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=131334;
UPDATE `creature_template_addon` SET `SheathState`=0 WHERE `entry`=131334;
UPDATE `creature_template_difficulty` SET `ContentTuningID`=293, `VerifiedBuild`=69587 WHERE `Entry`=131334;
UPDATE `creature_text` SET `comment`='Vindicator Minkey' WHERE `CreatureID`=131334;
DELETE FROM `creature_addon` WHERE `guid`=241642;
INSERT INTO `creature_addon` (`guid`, `PathId`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `aiAnimKit`, `movementAnimKit`, `meleeAnimKit`, `visibilityDistanceType`, `auras`) VALUES
(241642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '49415');
DELETE FROM `smart_scripts` WHERE `entryorguid`=131334 AND `source_type`=0;
DELETE FROM `smart_scripts` WHERE `entryorguid`=13133400 AND `source_type`=9;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `Difficulties`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param_string`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `action_param7`, `action_param_string`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_param_string`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(131334, 0, 0, 0, '', 20, 0, 100, 0, 50313, 0, 0, 0, 0, '', 162, 131334, 8, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, -8340.16, 637.168, 95.5151, 3.3206, 'Vindicator Minkey - On Quest Rewarded - Summon Creature Vindicator Minkey in Personal Visibility'),
(131334, 0, 1, 0, '', 54, 0, 100, 1, 0, 0, 0, 0, 0, '', 80, 13133400, 2, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Vindicator Minkey - On Just Summoned - Run Actionlist'),
(131334, 0, 2, 3, '', 34, 0, 100, 1, 8, 1, 0, 0, 0, '', 11, 52096, 2, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Vindicator Minkey - On Movement Inform 1 - Cast Cosmetic Teleport Effect'),
(131334, 0, 3, 0, '', 61, 0, 100, 1, 0, 0, 0, 0, 0, '', 41, 0, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Vindicator Minkey - Despawn Instant'),
(13133400, 9, 0, 0, '', 0, 0, 100, 0, 0, 0, 0, 0, 0, '', 83, 2, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Vindicator Minkey - Remove NPC Flag'),
(13133400, 9, 1, 0, '', 0, 0, 100, 0, 0, 0, 0, 0, 0, '', 66, 0, 0, 0, 0, 0, 0, 0, NULL, 23, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Vindicator Minkey - Set Orientation to Invoker'),
(13133400, 9, 2, 0, '', 0, 0, 100, 0, 1000, 1000, 0, 0, 0, '', 1, 0, 0, 0, 0, 0, 0, 0, NULL, 23, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Vindicator Minkey - Say Line 0'),
(13133400, 9, 3, 0, '', 0, 0, 100, 0, 7000, 7000, 0, 0, 0, '', 59, 0, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Vindicator Minkey - Set Run Off'),
(13133400, 9, 4, 0, '', 0, 0, 100, 0, 0, 0, 0, 0, 0, '', 69, 1, 0, 0, 0, 0, 0, 0, NULL, 8, 0, 0, 0, 0, NULL, -8358.657, 622.213, 95.317, 3.814, 'Vindicator Minkey - Move to PoS 1');
-- NPC Lightforged Beacon (130758)
UPDATE `creature` SET `PhaseId`=0 WHERE `guid`=243622;
UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=130758;
UPDATE `creature_template_addon` SET `SheathState`=0 WHERE `entry`=130758;
UPDATE `creature_template_difficulty` SET `StaticFlags1`=524288 WHERE `Entry`=130758 AND `DifficultyID`=0;
DELETE FROM `creature` WHERE `guid`=37;
INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnDifficulties`, `phaseUseFlags`, `PhaseId`, `PhaseGroup`, `terrainSwapMap`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curHealthPct`, `MovementType`, `npcflag`, `unit_flags`, `unit_flags2`, `unit_flags3`, `ScriptName`, `StringId`, `VerifiedBuild`) VALUES
(37, 130758, 0, 1519, 9171, '0', 0, 0, 0, -1, 0, 0, -8123.5, 889.019, 77.2747, 0.35972, 180, 0, 0, NULL, 0, NULL, NULL, NULL, NULL, '', NULL, 69587);
DELETE FROM `creature_addon` WHERE `guid` IN (243622,37);
INSERT INTO `creature_addon` (`guid`, `PathId`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `aiAnimKit`, `movementAnimKit`, `meleeAnimKit`, `visibilityDistanceType`, `auras`) VALUES
(243622, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '49415'),
(37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '60921');
DELETE FROM `npc_spellclick_spells` WHERE `npc_entry`=130758;
INSERT INTO `npc_spellclick_spells` (`npc_entry`, `spell_id`, `cast_flags`, `user_type`) VALUES
(130758, 258298, 3, 0);
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=18 AND `SourceGroup`=130758 AND `SourceEntry`=258298;
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `ConditionStringValue1`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(18, 130758, 258298, 0, 0, 9, 0, 49698, 0, 0, '', 0, 0, 0, '', 'Lightforged Beacon - Allow Spellclick if Quest is Taken'),
(18, 130758, 258298, 0, 1, 28, 0, 49698, 0, 0, '', 0, 0, 0, '', 'Lightforged Beacon - Allow Spellclick if Quest is Completed'),
(18, 130758, 258298, 0, 2, 8, 0, 49698, 0, 0, '', 0, 0, 0, '', 'Lightforged Beacon - Allow Spellclick if Quest is Rewarded'),
(18, 130758, 258298, 0, 2, 8, 0, 50071, 0, 0, '', 1, 0, 0, '', 'Lightforged Beacon - Allow Spellclick if Quest is Not Rewarded'),
(18, 130758, 258298, 0, 3, 8, 0, 50313, 0, 0, '', 0, 0, 0, '', 'Lightforged Beacon - Allow Spellclick if Quest is Rewarded');
DELETE FROM `smart_scripts` WHERE `entryorguid`=130758 AND `source_type`=0;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `Difficulties`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param_string`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `action_param7`, `action_param_string`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_param_string`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(130758, 0, 0, 0, '', 73, 0, 100, 0, 0, 0, 0, 0, 0, '', 33, 130758, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Beacon - On Spellclick - Quest Credit');
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceEntry`=199952 AND `SourceId`=0;
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `ConditionStringValue1`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(22, 1, 199952, 0, 0, 9, 0, 49782, 0, 0, '', 0, 0, 0, '', 'Lightforged Beacon - Run Script if Quest is Taken'),
(22, 1, 199952, 0, 1, 9, 0, 49698, 0, 0, '', 0, 0, 0, '', 'Lightforged Beacon - Run Script if Quest is Taken');
-- =========================================
-- Quest The Lightforged (49698)
-- Quest Heritage of the Lightforged (49782)
-- =========================================
UPDATE `quest_objectives` SET `Type`=0 WHERE `ID`=333778;
UPDATE `quest_objectives` SET `Type`=0 WHERE `ID`=454073;
DELETE FROM `quest_poi_points` WHERE `QuestID`=49782;
INSERT INTO `quest_poi_points` (`QuestID`, `Idx1`, `Idx2`, `X`, `Y`, `Z`, `VerifiedBuild`) VALUES
(49782, 0, 0, 464, 1452, 758, 69587),
(49782, 1, 0, -8163, 777, 76, 69587),
(49782, 2, 0, -8163, 777, 76, 69587),
(49782, 3, 0, 502, 1471, 766, 69587),
(49782, 4, 0, -8163, 777, 76, 69587),
(49782, 5, 0, -2385, 1271, 534, 69587);
-- ==============================
-- Misc: Gameobjects Calibrations
-- ==============================
-- GO Netherlight Crucible (276296,273271)
UPDATE `gameobject_template` SET `name`='Netherlight Crucible', `IconName`='questinteract' WHERE `entry` IN (276296,273271);
DELETE FROM `gameobject` WHERE `guid`=143831;
DELETE FROM `gameobject_addon` WHERE `guid`=143831;
DELETE FROM `gameobject_template_locale` WHERE `entry` IN (276296,273271);
INSERT INTO `gameobject_template_locale` (`entry`, `locale`, `name`, `castBarCaption`, `unk1`, `VerifiedBuild`) VALUES
(276296, 'deDE', 'Netherlichttiegel', '', NULL, 69587),
(276296, 'esES', 'Crisol de Luz Abisal', '', NULL, 69587),
(276296, 'esMX', 'Crisol de luz abisal', '', NULL, 69587),
(276296, 'frFR', 'Creuset de Halo-du-Néant', '', NULL, 69587),
(276296, 'itIT', 'Crogiolo di Lucefatua', '', NULL, 69587),
(276296, 'koKR', '황천빛 도가니', '', NULL, 69587),
(276296, 'ptBR', 'Crisol de Eterluz', '', NULL, 69587),
(276296, 'ruRU', 'Тигель света Пустоты', '', NULL, 69587),
(276296, 'zhCN', '虚空之光熔炉', '', NULL, 69587),
(276296, 'zhTW', '虛空之光熔爐', '', NULL, 69587),
(273271, 'deDE', 'Netherlichttiegel', '', NULL, 69587),
(273271, 'esES', 'Crisol de Luz Abisal', '', NULL, 69587),
(273271, 'esMX', 'Crisol de luz abisal', '', NULL, 69587),
(273271, 'frFR', 'Creuset de Halo-du-Néant', '', NULL, 69587),
(273271, 'itIT', 'Crogiolo di Lucefatua', '', NULL, 69587),
(273271, 'koKR', '황천빛 도가니', '', NULL, 69587),
(273271, 'ptBR', 'Crisol de Eterluz', '', NULL, 69587),
(273271, 'ruRU', 'Тигель света Пустоты', '', NULL, 69587),
(273271, 'zhCN', '虚空之光熔炉', '', NULL, 69587),
(273271, 'zhTW', '虛空之光熔爐', '', NULL, 69587);
-- ============================
-- Misc: Creatures Calibrations
-- ============================
-- NPC Tassia Whisperglen (96507)
UPDATE `creature_template_addon` SET `SheathState`=0, `emote`=69 WHERE `entry`=96507;
-- NPC High Priestess Ishanah (123395)
DELETE FROM `gossip_menu_option` WHERE `MenuID`=21462;
INSERT INTO `gossip_menu_option` (`MenuID`, `GossipOptionID`, `OptionID`, `OptionNpc`, `OptionText`, `OptionBroadcastTextID`, `Language`, `Flags`, `ActionMenuID`, `ActionPoiID`, `GossipNpcOptionID`, `BoxCoded`, `BoxMoney`, `BoxText`, `BoxBroadcastTextID`, `SpellID`, `OverrideIconID`, `VerifiedBuild`) VALUES
(21462, 47636, 0, 5, 'Make this inn your home.', 2822, 0, 0, 0, 0, NULL, 0, 0, NULL, 0, NULL, NULL, 69587),
(21462, 47638, 1, 1, 'Let me browse your goods.', 2823, 0, 0, 0, 0, NULL, 0, 0, NULL, 0, NULL, NULL, 69587),
(21462, 0, 2, 0, 'It is good to see you, Ishanah. How are you?', 136389, 0, 0, 21463, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(21462, -331008, 3, 0, 'Trick or Treat!', 10693, 0, 0, 0, 0, NULL, 0, 0, NULL, 0, NULL, NULL, 69587);
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=21462;
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `ConditionStringValue1`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(15, 21462, 2, 0, 0, 9, 0, 48500, 0, 0, '', 0, 0, 0, '', 'High Priestess Ishanah - Show Gossip Option 2 if Quest is Taken'),
(15, 21462, 2, 0, 0, 48, 0, 292394, 0, 1, '', 1, 0, 0, '', 'High Priestess Ishanah - Show Gossip Option 2 if Quest Objetive is Not Completed'),
(15, 21462, 3, 0, 0, 12, 0, 12, 0, 0, '', 0, 0, 0, '', 'High Priestess Ishanah - Show Gossip Option 3 if Hallow\'s End Event is Active'),
(15, 21462, 3, 0, 0, 1, 0, 24755, 0, 0, '', 1, 0, 0, '', 'High Priestess Ishanah - Show Gossip Option 3 if Player Not Aura Tricked or Treated');
DELETE FROM `smart_scripts` WHERE `entryorguid`=123395 AND `source_type`=0;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `Difficulties`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param_string`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `action_param7`, `action_param_string`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_param_string`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(123395, 0, 0, 0, '', 62, 0, 100, 0, 21462, 2, 0, 0, 0, '', 33, 123395, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'High Priestess Ishanah - On Gossip Option 2 Select - Quest Credit'),
(123395, 0, 1, 2, '', 62, 0, 100, 0, 21462, 3, 0, 0, 0, '', 72, 0, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'High Priestess Ishanah - On Gossip Option 3 Select - Close Gossip'),
(123395, 0, 2, 0, '', 61, 0, 100, 0, 0, 0, 0, 0, 0, '', 85, 24751, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'High Priestess Ishanah - Player Cast on Self Trick or Treat');
-- NPC Lightsworn Anchorite (125524)
DELETE FROM `creature` WHERE `guid` IN (327892,32789,327896,327908,327910);
UPDATE `creature` SET `wander_distance`='0', `MovementType`='0' WHERE `id`='125524' AND NOT `MovementType`='2';
UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=125524;
DELETE FROM `smart_scripts` WHERE `entryorguid`=125524 AND `source_type`=0;
DELETE FROM `smart_scripts` WHERE `entryorguid` IN (12552400,12552401) AND `source_type`=9;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(125524, 0, 0, 0, 60, 0, 100, 0, 5000, 10000, 10000, 15000, 88, 12552400, 12552401, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lightsworn Anchorite - On Update - Run Random Actionlist'),
(12552400, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 10, 1, 113, 29, 574, 71, 400, 1, 0, 0, 0, 0, 0, 0, 0, 'Lightsworn Anchorite - Play Random Emote'),
(12552401, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 10, 1, 5, 6, 29, 604, 661, 1, 0, 0, 0, 0, 0, 0, 0, 'Lightsworn Anchorite - Play Random Emote');
-- NPC Exodar Artificer (125843)
DELETE FROM `creature` WHERE `guid` IN (231024,231031,231124,326596,326598,326606,447401,447406,447410,447416);
UPDATE `creature` SET `wander_distance`='0', `MovementType`='0' WHERE `id`='125843' AND NOT `MovementType`='2';
UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=125843;
UPDATE `creature_template_addon` SET `emote`=233 WHERE `entry`=125843;
DELETE FROM `creature_addon` WHERE `guid` IN (231012,231013,231022,231028,231032,231034,231080,231086,243586,326594,326595,326597,326601);
INSERT INTO `creature_addon` (`guid`, `PathId`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `aiAnimKit`, `movementAnimKit`, `meleeAnimKit`, `visibilityDistanceType`, `auras`) VALUES
(231012, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '230497'),
(231013, 0, 0, 0, 0, 0, 0, 0, 0, 648, 0, 0, 0, 0, ''),
(231022, 0, 0, 0, 0, 0, 0, 0, 0, 455, 0, 0, 0, 0, ''),
(231028, 0, 0, 0, 0, 0, 0, 0, 0, 455, 0, 0, 0, 0, ''),
(231032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '230497'),
(231034, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '230497'),
(231080, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ''),
(231086, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ''),
(243586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ''),
(326594, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ''),
(326595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ''),
(326597, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ''),
(326601, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '');
DELETE FROM `smart_scripts` WHERE `entryorguid` IN (125843,-231080,-231086,-243586,-326594,-326595,-326597,-326601) AND `source_type`=0;
DELETE FROM `smart_scripts` WHERE `entryorguid` IN (12584300,12584301) AND `source_type`=9;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(-231080, 0, 0, 0, 60, 0, 100, 0, 5000, 10000, 10000, 15000, 88, 12584300, 12584301, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lightsworn Anchorite - On Update - Run Random Actionlist'),
(-231086, 0, 0, 0, 60, 0, 100, 0, 5000, 10000, 10000, 15000, 88, 12584300, 12584301, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lightsworn Anchorite - On Update - Run Random Actionlist'),
(-243586, 0, 0, 0, 60, 0, 100, 0, 5000, 10000, 10000, 15000, 88, 12584300, 12584301, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lightsworn Anchorite - On Update - Run Random Actionlist'),
(-326594, 0, 0, 0, 60, 0, 100, 0, 5000, 10000, 10000, 15000, 88, 12584300, 12584301, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lightsworn Anchorite - On Update - Run Random Actionlist'),
(-326595, 0, 0, 0, 60, 0, 100, 0, 5000, 10000, 10000, 15000, 88, 12584300, 12584301, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lightsworn Anchorite - On Update - Run Random Actionlist'),
(-326597, 0, 0, 0, 60, 0, 100, 0, 5000, 10000, 10000, 15000, 88, 12584300, 12584301, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lightsworn Anchorite - On Update - Run Random Actionlist'),
(-326601, 0, 0, 0, 60, 0, 100, 0, 5000, 10000, 10000, 15000, 88, 12584300, 12584301, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lightsworn Anchorite - On Update - Run Random Actionlist'),
(12584300, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 10, 1, 113, 29, 574, 71, 400, 1, 0, 0, 0, 0, 0, 0, 0, 'Lightsworn Anchorite - Play Random Emote'),
(12584301, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 10, 1, 5, 6, 29, 604, 661, 1, 0, 0, 0, 0, 0, 0, 0, 'Lightsworn Anchorite - Play Random Emote');
-- NPC Anchorite Lysara (126022)
UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=126022;
UPDATE `creature_template_addon` SET `SheathState`=0 WHERE `entry`=126022;
UPDATE `creature_trainer` SET `MenuID`=0 WHERE `CreatureID`=126022 AND `MenuID`=8522 AND `OptionID`=0;
UPDATE `creature_trainer` SET `MenuID`=0 WHERE `MenuID`=8522;
UPDATE `creature` SET `wander_distance`='0', `MovementType`='0' WHERE `id`='126022' AND NOT `MovementType`='2';
DELETE FROM `smart_scripts` WHERE `entryorguid`=126022 AND `source_type`=0;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `Difficulties`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param_string`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `action_param7`, `action_param_string`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_param_string`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(126022, 0, 0, 0, '', 60, 0, 100, 0, 5000, 10000, 20000, 20000, 0, '', 11, 61493, 2, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Anchorite Lysara - On Update - Cast [DND] First Aid');
-- NPC Lightsworn Anchorite (126030)
DELETE FROM `creature` WHERE `guid`=327924;
UPDATE `creature_template` SET `AIName`='' WHERE `entry`=126030;
DELETE FROM `creature_addon` WHERE `guid` IN (231065,243608,327921,327923,327925);
INSERT INTO `creature_addon` (`guid`, `PathId`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `aiAnimKit`, `movementAnimKit`, `meleeAnimKit`, `visibilityDistanceType`, `auras`) VALUES
(231065, 0, 0, 0, 0, 0, 0, 0, 0, 641, 0, 0, 0, 0, ''),
(243608, 0, 0, 0, 0, 0, 0, 0, 0, 641, 0, 0, 0, 0, ''),
(327921, 0, 0, 0, 0, 0, 0, 0, 0, 641, 0, 0, 0, 0, ''),
(327923, 0, 0, 0, 0, 0, 0, 0, 0, 641, 0, 0, 0, 0, ''),
(327925, 0, 0, 0, 0, 0, 0, 0, 0, 641, 0, 0, 0, 0, '');
-- NPC A'naa (126075)
UPDATE `creature_template_addon` SET `SheathState`=0, `emote`=69 WHERE `entry`=126075;
DELETE FROM `creature_addon` WHERE `guid`=327562;
INSERT INTO `creature_addon` (`guid`, `PathId`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `aiAnimKit`, `movementAnimKit`, `meleeAnimKit`, `visibilityDistanceType`, `auras`) VALUES
(327562, 0, 0, 0, 0, 0, 0, 0, 0, 613, 0, 0, 0, 0, '');
-- NPC Artificer Shela'na (126389)
UPDATE `creature_template` SET `npcflag`=3 WHERE `entry`=126389;
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=21451;
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `ConditionStringValue1`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(15, 21451, 0, 0, 0, 9, 0, 48500, 0, 0, '', 0, 0, 0, '', 'Artificer Shela\'na - Show Gossip Option if Quest is Taken'),
(15, 21451, 0, 0, 0, 48, 0, 292317, 0, 1, '', 1, 0, 0, '', 'Artificer Shela\'na - Show Gossip Option if Quest Objetive is Not Completed');
DELETE FROM `smart_scripts` WHERE `entryorguid`=126389 AND `source_type`=0;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `Difficulties`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param_string`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `action_param7`, `action_param_string`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_param_string`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(126389, 0, 0, 0, '', 62, 0, 100, 0, 21451, 0, 0, 0, 0, '', 33, 126389, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Artificer Shela\'na - On Gossip Select - Quest Credit');
-- NPC Thelbus Wimblenod (126390)
UPDATE `creature_template_difficulty` SET `StaticFlags1`=536871168 WHERE `Entry`=126390;
UPDATE `creature` SET `position_z`=132.267 WHERE `guid`=231071;
UPDATE `creature` SET `position_z`=743.197 WHERE `guid`=243579;
UPDATE `creature` SET `position_z`=41.720 WHERE `guid`=329855;
UPDATE `creature` SET `position_z`=47.778 WHERE `guid`=447426;
DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=21454;
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `ConditionStringValue1`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(15, 21454, 0, 0, 0, 9, 0, 48500, 0, 0, '', 0, 0, 0, '', 'Thelbus Wimblenod - Show Gossip Option if Quest is Taken'),
(15, 21454, 0, 0, 0, 48, 0, 292319, 0, 1, '', 1, 0, 0, '', 'Thelbus Wimblenod - Show Gossip Option if Quest Objetive is Not Completed');
DELETE FROM `smart_scripts` WHERE `entryorguid`=126390 AND `source_type`=0;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `Difficulties`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param_string`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `action_param7`, `action_param_string`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_param_string`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(126390, 0, 0, 0, '', 62, 0, 100, 0, 21454, 0, 0, 0, 0, '', 33, 126390, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Thelbus Wimblenod - On Gossip Select - Quest Credit');
-- NPC Maras (130560)
UPDATE `creature_template_addon` SET `SheathState`=0, `emote`=415 WHERE `entry`=130560;
-- NPC Vigilant Quoram (130986)
UPDATE `creature_text` SET `comment`='Vigilant Quoram' WHERE `CreatureID`=130986;
DELETE FROM `smart_scripts` WHERE `entryorguid`=130986 AND `source_type`=0;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `Difficulties`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param_string`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `action_param7`, `action_param_string`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_param_string`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(130986, 0, 0, 1, '', 62, 0, 100, 0, 21910, 0, 0, 0, 0, '', 1, 0, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Vigilant Quoram - On Gossip Option 0 Select - Say Random Text'),
(130986, 0, 1, 0, '', 61, 0, 100, 0, 0, 0, 0, 0, 0, '', 72, 0, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Vigilant Quoram - Close Gossip'),
(130986, 0, 2, 3, '', 62, 0, 100, 0, 21910, 1, 0, 0, 0, '', 1, 1, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Vigilant Quoram - On Gossip Option 1 Select - Say Line 1'),
(130986, 0, 3, 0, '', 61, 0, 100, 0, 0, 0, 0, 0, 0, '', 72, 0, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Vigilant Quoram - Close Gossip'),
(130986, 0, 4, 5, '', 62, 0, 100, 0, 21910, 2, 0, 0, 0, '', 1, 2, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Vigilant Quoram - On Gossip Option 2 Select - Say Random Text'),
(130986, 0, 5, 0, '', 61, 0, 100, 0, 0, 0, 0, 0, 0, '', 72, 0, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Vigilant Quoram - Close Gossip'),
(130986, 0, 6, 7, '', 62, 0, 100, 0, 21910, 3, 0, 0, 0, '', 1, 3, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Vigilant Quoram - On Gossip Option 3 Select - Say Random Text'),
(130986, 0, 7, 0, '', 61, 0, 100, 0, 0, 0, 0, 0, 0, '', 72, 0, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Vigilant Quoram - Close Gossip'),
(130986, 0, 8, 9, '', 62, 0, 100, 0, 21910, 4, 0, 0, 0, '', 1, 4, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Vigilant Quoram - On Gossip Option 4 Select - Say Line 4'),
(130986, 0, 9, 0, '', 61, 0, 100, 0, 0, 0, 0, 0, 0, '', 72, 0, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Vigilant Quoram - Close Gossip'),
(130986, 0, 10, 11, '', 62, 0, 100, 0, 21910, 5, 0, 0, 0, '', 1, 5, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Vigilant Quoram - On Gossip Option 5 Select - Say Line 5'),
(130986, 0, 11, 0, '', 61, 0, 100, 0, 0, 0, 0, 0, 0, '', 72, 0, 0, 0, 0, 0, 0, 0, NULL, 7, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Vigilant Quoram - Close Gossip');
-- NPC T'paartos (132210)
UPDATE `creature_template_addon` SET `SheathState`=0, `emote`=455 WHERE `entry`=132210;
-- NPC Lightforged Anchorite (132214)
UPDATE `creature` SET `position_x`=451.651, `position_y`=1391.86, `position_z`=772.655, `orientation`=3.5627, `wander_distance`=0, `MovementType`=2 WHERE `guid`=243587;
UPDATE `creature` SET `position_x`=445.31, `position_y`=1491.44, `position_z`=742.054, `wander_distance`=0, `MovementType`=2 WHERE `guid`=243590;
DELETE FROM `creature_addon` WHERE `guid` IN (243587,243590);
INSERT INTO `creature_addon` (`guid`, `PathId`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `aiAnimKit`, `movementAnimKit`, `meleeAnimKit`, `visibilityDistanceType`, `auras`) VALUES
(243587, 243587, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, ''),
(243590, 243590, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '');
DELETE FROM `smart_scripts` WHERE `entryorguid` IN (132214,-243587,-243590) AND `source_type`=0;
DELETE FROM `smart_scripts` WHERE `entryorguid` IN (13221400,13221401) AND `source_type`=9;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(132214, 0, 0, 0, 60, 0, 100, 0, 5000, 10000, 10000, 15000, 88, 13221400, 13221401, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lightforged Anchorite - On Update - Run Random Actionlist'),
(-243587, 0, 0, 0, 25, 0, 100, 1, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lightforged Anchorite - On Reset - Set Emote State'),
(-243590, 0, 0, 0, 25, 0, 100, 1, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lightforged Anchorite - On Reset - Set Emote State'),
(13221400, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 10, 1, 113, 29, 574, 71, 400, 1, 0, 0, 0, 0, 0, 0, 0, 'Lightforged Anchorite - Play Random Emote'),
(13221401, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 10, 1, 5, 6, 29, 604, 661, 1, 0, 0, 0, 0, 0, 0, 0, 'Lightforged Anchorite - Play Random Emote');
DELETE FROM `waypoint_path` WHERE `PathId` IN (243587,243590);
INSERT INTO `waypoint_path` (`PathId`, `MoveType`, `Flags`, `Velocity`, `Comment`) VALUES
(243587, 0, 0, NULL, 'Lightforged Anchorite'),
(243590, 0, 0, NULL, 'Lightforged Anchorite');
DELETE FROM `waypoint_path_node` WHERE `PathId` IN (243587,243590);
INSERT INTO `waypoint_path_node` (`PathId`, `NodeId`, `PositionX`, `PositionY`, `PositionZ`, `Orientation`, `Delay`) VALUES
(243587, 1, 451.651, 1391.86, 772.655, 3.5627, 6000),
(243587, 2, 468.72, 1398.42, 772.649, NULL, 15000),
(243590, 1, 445.31, 1491.44, 742.054, NULL, 0),
(243590, 2, 449.102, 1492.26, 742.054, NULL, 0),
(243590, 3, 452.211, 1492.02, 742.054, NULL, 0),
(243590, 4, 455.332, 1491.77, 742.054, NULL, 0),
(243590, 5, 459.149, 1491.24, 742.054, NULL, 0),
(243590, 6, 461.977, 1489.86, 742.054, NULL, 0),
(243590, 7, 464.783, 1488.5, 742.054, NULL, 0),
(243590, 8, 467.845, 1486.43, 742.054, NULL, 0),
(243590, 9, 470.159, 1484.3, 742.054, NULL, 0),
(243590, 10, 472.47, 1482.17, 742.054, NULL, 0),
(243590, 11, 474.784, 1480.48, 742.054, NULL, 0),
(243590, 12, 477.384, 1478.69, 742.054, NULL, 0),
(243590, 13, 479.934, 1476.97, 742.054, NULL, 0),
(243590, 14, 482.59, 1475.29, 742.054, NULL, 0),
(243590, 15, 485.636, 1473.01, 742.054, NULL, 0),
(243590, 16, 487.552, 1470.53, 742.054, NULL, 0),
(243590, 17, 489.67, 1467.63, 742.351, NULL, 0),
(243590, 18, 490.965, 1464.76, 742.41, NULL, 0),
(243590, 19, 492.259, 1461.91, 742.094, NULL, 0),
(243590, 20, 493.017, 1458.38, 742.054, NULL, 0),
(243590, 21, 493.614, 1455.29, 742.054, NULL, 0),
(243590, 22, 493.873, 1451.91, 742.054, NULL, 0),
(243590, 23, 494.082, 1448.77, 742.054, NULL, 0),
(243590, 24, 494.018, 1445.42, 742.054, NULL, 0),
(243590, 25, 493.892, 1442.26, 742.054, NULL, 0),
(243590, 26, 493.686, 1439.02, 742.054, NULL, 0),
(243590, 27, 493.405, 1435.87, 742.054, NULL, 0),
(243590, 28, 493.125, 1432.73, 742.054, NULL, 0),
(243590, 29, 492.558, 1429.43, 742.054, NULL, 0),
(243590, 30, 491.974, 1426.33, 742.054, NULL, 0),
(243590, 31, 490.814, 1422.84, 742.054, NULL, 0),
(243590, 32, 489.362, 1420.06, 742.054, NULL, 0),
(243590, 33, 487.307, 1416.63, 742.054, NULL, 0),
(243590, 34, 484.792, 1414.76, 742.054, NULL, 0),
(243590, 35, 482.283, 1412.89, 742.054, NULL, 0),
(243590, 36, 479.226, 1411.06, 742.054, NULL, 0),
(243590, 37, 476.346, 1409.78, 742.054, NULL, 0),
(243590, 38, 473.466, 1408.51, 742.054, NULL, 0),
(243590, 39, 470.176, 1407.37, 742.054, NULL, 0),
(243590, 40, 467.112, 1406.61, 742.054, NULL, 0),
(243590, 41, 464.061, 1405.85, 742.054, NULL, 0),
(243590, 42, 460.678, 1405.27, 742.054, NULL, 0),
(243590, 43, 457.557, 1404.97, 742.054, NULL, 0),
(243590, 44, 454.439, 1404.66, 742.054, NULL, 0),
(243590, 45, 450.63, 1404.75, 742.054, NULL, 0),
(243590, 46, 447.592, 1405.52, 742.054, NULL, 0),
(243590, 47, 444.559, 1406.3, 742.054, NULL, 0),
(243590, 48, 441.241, 1408.08, 742.054, NULL, 0),
(243590, 49, 438.659, 1409.84, 742.054, NULL, 0),
(243590, 50, 435.959, 1412.43, 742.054, NULL, 0),
(243590, 51, 434.062, 1414.93, 742.054, NULL, 0),
(243590, 52, 432.168, 1417.44, 742.054, NULL, 0),
(243590, 53, 430.249, 1419.89, 742.054, NULL, 0),
(243590, 54, 428.286, 1422.37, 742.054, NULL, 0),
(243590, 55, 426.317, 1425.07, 742.078, NULL, 0),
(243590, 56, 424.625, 1427.71, 742.386, NULL, 0),
(243590, 57, 422.932, 1430.35, 742.391, NULL, 0),
(243590, 58, 420.405, 1436.27, 742.46, NULL, 0),
(243590, 59, 419.453, 1439.03, 742.46, NULL, 0),
(243590, 60, 418.494, 1441.81, 742.054, NULL, 0),
(243590, 61, 417.564, 1444.83, 742.054, NULL, 0),
(243590, 62, 416.921, 1447.69, 742.054, NULL, 0),
(243590, 63, 416.277, 1450.54, 742.054, NULL, 0),
(243590, 64, 415.805, 1453.77, 742.054, NULL, 0),
(243590, 65, 415.674, 1456.71, 742.054, NULL, 0),
(243590, 66, 415.543, 1459.64, 742.054, NULL, 0),
(243590, 67, 415.413, 1462.57, 742.054, NULL, 0),
(243590, 68, 416.659, 1466.18, 742.054, NULL, 0),
(243590, 69, 417.855, 1468.87, 742.054, NULL, 0),
(243590, 70, 419.464, 1471.91, 742.054, NULL, 0),
(243590, 71, 421.322, 1474.18, 742.054, NULL, 0),
(243590, 72, 423.185, 1476.45, 742.054, NULL, 0),
(243590, 73, 425.048, 1478.72, 742.054, NULL, 0),
(243590, 74, 427.477, 1480.94, 742.054, NULL, 0),
(243590, 75, 429.724, 1482.82, 742.054, NULL, 0),
(243590, 76, 431.97, 1484.71, 742.054, NULL, 0),
(243590, 77, 434.211, 1486.59, 742.054, NULL, 0),
(243590, 78, 437.152, 1488.8, 742.054, NULL, 0),
(243590, 79, 439.943, 1489.7, 742.054, NULL, 0),
(243590, 80, 442.729, 1490.6, 742.054, NULL, 0);
-- NPC Lightforged Vindicator (132215)
DELETE FROM `creature` WHERE `guid` IN (243582,243601);
UPDATE `creature` SET `position_x`=425.337, `position_y`=1412.52, `position_z`=772.696, `orientation`=0.1589, `wander_distance`=0, `MovementType`=2 WHERE `guid`=243573;
UPDATE `creature` SET `position_x`=425.095, `position_y`=1438.91, `position_z`=742.054, `wander_distance`=0, `MovementType`=2 WHERE `guid`=243577;
DELETE FROM `creature_addon` WHERE `guid` IN (243573,243577,243581,243592,243607,243609,243615,243621);
INSERT INTO `creature_addon` (`guid`, `PathId`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `aiAnimKit`, `movementAnimKit`, `meleeAnimKit`, `visibilityDistanceType`, `auras`) VALUES
(243573, 243573, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, ''),
(243577, 243577, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, ''),
(243581, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ''),
(243592, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ''),
(243607, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ''),
(243609, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '260861 52550'),
(243615, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ''),
(243621, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '260861 52550');
DELETE FROM `smart_scripts` WHERE `entryorguid` IN (-243581,-243592,-243607,-243615) AND `source_type`=0;
DELETE FROM `smart_scripts` WHERE `entryorguid` IN (13221500,13221501) AND `source_type`=9;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(-243581, 0, 0, 0, 60, 0, 100, 0, 5000, 10000, 10000, 15000, 88, 13221500, 13221501, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lightforged Vindicator - On Update - Run Random Actionlist'),
(-243592, 0, 0, 0, 60, 0, 100, 0, 5000, 10000, 10000, 15000, 88, 13221500, 13221501, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lightforged Vindicator - On Update - Run Random Actionlist'),
(-243607, 0, 0, 0, 60, 0, 100, 0, 5000, 10000, 10000, 15000, 88, 13221500, 13221501, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lightforged Vindicator - On Update - Run Random Actionlist'),
(-243615, 0, 0, 0, 60, 0, 100, 0, 5000, 10000, 10000, 15000, 88, 13221500, 13221501, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lightforged Vindicator - On Update - Run Random Actionlist'),
(13221500, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 10, 1, 113, 29, 574, 71, 400, 1, 0, 0, 0, 0, 0, 0, 0, 'Lightforged Vindicator - Play Random Emote'),
(13221501, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 10, 1, 5, 6, 29, 604, 661, 1, 0, 0, 0, 0, 0, 0, 0, 'Lightforged Vindicator - Play Random Emote');
DELETE FROM `waypoint_path` WHERE `PathId` IN (243573,243577);
INSERT INTO `waypoint_path` (`PathId`, `MoveType`, `Flags`, `Velocity`, `Comment`) VALUES
(243573, 0, 0, NULL, 'Lightforged Vindicator'),
(243577, 0, 0, NULL, 'Lightforged Vindicator');
DELETE FROM `waypoint_path_node` WHERE `PathId` IN (243573,243577);
INSERT INTO `waypoint_path_node` (`PathId`, `NodeId`, `PositionX`, `PositionY`, `PositionZ`, `Orientation`, `Delay`) VALUES
(243573, 1, 425.337, 1412.52, 772.696, 0.1589, 6000),
(243573, 2, 415.845, 1483.25, 772.655, 0.1196, 15000),
(243577, 1, 425.095, 1438.91, 742.054, NULL, 0),
(243577, 2, 425.317, 1442.74, 742.054, NULL, 0),
(243577, 3, 426.108, 1446.2, 742.054, NULL, 0),
(243577, 4, 427.422, 1448.99, 742.054, NULL, 0),
(243577, 5, 428.614, 1451.72, 742.054, NULL, 0),
(243577, 6, 429.68, 1454.39, 742.886, NULL, 0),
(243577, 7, 430.591, 1457.19, 743.547, NULL, 0),
(243577, 8, 431.674, 1460.08, 744.594, NULL, 0),
(243577, 9, 432.78, 1462.79, 745.482, NULL, 0),
(243577, 10, 434.441, 1465.61, 746.429, NULL, 0),
(243577, 11, 436.273, 1468.39, 747.52, NULL, 0),
(243577, 12, 438.286, 1470.49, 748.399, NULL, 0),
(243577, 13, 440.691, 1472.8, 749.454, NULL, 0),
(243577, 14, 443.108, 1474.42, 750.417, NULL, 0),
(243577, 15, 445.914, 1476.06, 751.394, NULL, 0),
(243577, 16, 448.577, 1477.23, 752.357, NULL, 0),
(243577, 17, 451.689, 1478.24, 753.491, NULL, 0),
(243577, 18, 454.527, 1478.92, 754.517, NULL, 0),
(243577, 19, 457.791, 1479.22, 755.482, NULL, 0),
(243577, 20, 460.694, 1479.34, 756.435, NULL, 0),
(243577, 21, 463.933, 1479.11, 757.525, NULL, 0),
(243577, 22, 466.045, 1479.19, 757.627, NULL, 0),
(243577, 23, 469.1, 1480.03, 757.472, NULL, 0),
(243577, 24, 469.459, 1481.52, 757.456, NULL, 0),
(243577, 25, 470.04, 1483.35, 757.333, NULL, 0),
(243577, 26, 470.281, 1484.75, 757.279, NULL, 0),
(243577, 27, 468.04, 1486.89, 757.356, NULL, 0),
(243577, 28, 466.111, 1487.73, 757.603, NULL, 0),
(243577, 29, 463.585, 1488.48, 758.087, NULL, 0),
(243577, 30, 460.578, 1488.74, 758.641, NULL, 0),
(243577, 31, 457.904, 1488.9, 759.686, NULL, 0),
(243577, 32, 454.81, 1488.85, 760.096, NULL, 0),
(243577, 33, 452.216, 1488.62, 760.753, NULL, 0),
(243577, 34, 449.254, 1487.98, 761.71, NULL, 0),
(243577, 35, 446.729, 1487.19, 762.13, NULL, 0),
(243577, 36, 443.952, 1486.02, 762.769, NULL, 0),
(243577, 37, 441.45, 1484.77, 763.477, NULL, 0),
(243577, 38, 438.819, 1483.29, 764.144, NULL, 0),
(243577, 39, 436.522, 1481.83, 764.613, NULL, 0),
(243577, 40, 434.132, 1480, 765.177, NULL, 0),
(243577, 41, 432.1, 1478.29, 765.793, NULL, 0),
(243577, 42, 430.058, 1476.07, 766.47, NULL, 0),
(243577, 43, 428.251, 1474.04, 767.19, NULL, 0),
(243577, 44, 426.538, 1471.56, 767.892, NULL, 0),
(243577, 45, 425.027, 1469.37, 768.482, NULL, 0),
(243577, 46, 423.781, 1466.67, 769.215, NULL, 0),
(243577, 47, 422.594, 1464.12, 769.731, NULL, 0),
(243577, 48, 421.691, 1461.25, 770.444, NULL, 0),
(243577, 49, 421.047, 1458.65, 771.059, NULL, 0),
(243577, 50, 420.639, 1455.66, 771.744, NULL, 0),
(243577, 51, 420.347, 1452.73, 772.418, NULL, 0),
(243577, 52, 420, 1449.59, 772.758, NULL, 0),
(243577, 53, 419.555, 1446.55, 772.844, NULL, 0),
(243577, 54, 419.527, 1444.09, 772.69, NULL, 0),
(243577, 55, 420.012, 1441.05, 772.664, NULL, 0),
(243577, 56, 420.512, 1438.32, 772.671, NULL, 0),
(243577, 57, 421.431, 1435.38, 772.685, NULL, 0),
(243577, 58, 422.348, 1432.46, 772.819, NULL, 0),
(243577, 59, 423.365, 1430.44, 772.697, NULL, 0),
(243577, 60, 425.32, 1428.06, 772.664, NULL, 0),
(243577, 61, 427.284, 1425.68, 772.728, NULL, 0),
(243577, 62, 429.257, 1424.18, 772.782, NULL, 0),
(243577, 63, 431.81, 1422.2, 772.791, NULL, 0),
(243577, 64, 434.217, 1420.42, 772.751, NULL, 0),
(243577, 65, 436.709, 1418.64, 772.429, NULL, 0),
(243577, 66, 439.116, 1417.03, 771.734, NULL, 0),
(243577, 67, 441.692, 1415.48, 771.134, NULL, 0),
(243577, 68, 443.986, 1414.18, 770.556, NULL, 0),
(243577, 69, 446.812, 1413.08, 769.907, NULL, 0),
(243577, 70, 449.631, 1411.99, 769.273, NULL, 0),
(243577, 71, 452.185, 1411.51, 768.583, NULL, 0),
(243577, 72, 455.143, 1411.01, 767.863, NULL, 0),
(243577, 73, 457.876, 1410.91, 767.276, NULL, 0),
(243577, 74, 460.883, 1410.82, 766.629, NULL, 0),
(243577, 75, 463.687, 1411.04, 766.026, NULL, 0),
(243577, 76, 466.459, 1411.32, 765.402, NULL, 0),
(243577, 77, 469.426, 1411.9, 764.664, NULL, 0),
(243577, 78, 469.65, 1409.86, 764.7, NULL, 0),
(243577, 79, 469.651, 1409.86, 764.699, NULL, 0),
(243577, 80, 477.215, 1414.74, 763.059, NULL, 0),
(243577, 81, 479.872, 1416.28, 762.292, NULL, 0),
(243577, 82, 481.742, 1417.87, 762.106, NULL, 0),
(243577, 83, 483.966, 1419.78, 761.211, NULL, 0),
(243577, 84, 486.063, 1421.92, 760.265, NULL, 0),
(243577, 85, 487.826, 1423.99, 759.804, NULL, 0),
(243577, 86, 489.595, 1426.36, 758.859, NULL, 0),
(243577, 87, 491.266, 1428.77, 758.153, NULL, 0),
(243577, 88, 492.772, 1431.17, 757.649, NULL, 0),
(243577, 89, 493.989, 1432.96, 757.442, NULL, 0),
(243577, 90, 494.181, 1436.01, 757.323, NULL, 0),
(243577, 91, 493.674, 1436.83, 757.259, NULL, 0),
(243577, 92, 492.256, 1438.46, 757.278, NULL, 0),
(243577, 93, 489.288, 1439.18, 757.412, NULL, 0),
(243577, 94, 487.482, 1438.66, 757.536, NULL, 0),
(243577, 95, 485.915, 1437.66, 757.604, NULL, 0),
(243577, 96, 484.063, 1435.4, 757.656, NULL, 0),
(243577, 97, 482.373, 1433.09, 756.492, NULL, 0),
(243577, 98, 480.408, 1430.66, 755.344, NULL, 0),
(243577, 99, 478.432, 1428.56, 754.382, NULL, 0),
(243577, 100, 476.005, 1426.4, 753.537, NULL, 0),
(243577, 101, 473.666, 1424.68, 752.412, NULL, 0),
(243577, 102, 473.666, 1424.68, 752.412, NULL, 0),
(243577, 103, 473.666, 1424.68, 752.412, NULL, 0),
(243577, 104, 473.666, 1424.68, 752.412, NULL, 0),
(243577, 105, 473.666, 1424.68, 752.412, NULL, 0),
(243577, 106, 473.666, 1424.68, 752.412, NULL, 0),
(243577, 107, 470.558, 1423, 751.247, NULL, 0),
(243577, 108, 467.799, 1422.14, 750.429, NULL, 0),
(243577, 109, 464.682, 1421.47, 749.263, NULL, 0),
(243577, 110, 461.82, 1421.03, 748.429, NULL, 0),
(243577, 111, 458.523, 1421.07, 747.585, NULL, 0),
(243577, 112, 455.631, 1421.22, 746.376, NULL, 0),
(243577, 113, 452.499, 1421.85, 745.46, NULL, 0),
(243577, 114, 449.563, 1422.53, 744.548, NULL, 0),
(243577, 115, 446.674, 1423.52, 743.494, NULL, 0),
(243577, 116, 443.984, 1424.24, 742.848, NULL, 0),
(243577, 117, 441.076, 1424.94, 742.054, NULL, 0),
(243577, 118, 438.091, 1425.64, 742.054, NULL, 0),
(243577, 119, 434.852, 1426.78, 742.054, NULL, 0),
(243577, 120, 431.627, 1428.42, 742.093, NULL, 0),
(243577, 121, 429.287, 1430.39, 742.065, NULL, 0),
(243577, 122, 427.075, 1433.13, 742.46, NULL, 0);
-- NPC Durael (132224)
UPDATE `creature_template_addon` SET `emote`=613 WHERE `entry`=132224;
-- NPC Lightforged Artificer (132225)
DELETE FROM `creature` WHERE `guid`=243566;
UPDATE `creature_template_addon` SET `SheathState`=0 WHERE `entry`=132225;
DELETE FROM `smart_scripts` WHERE `entryorguid`=132225 AND `source_type`=0;
DELETE FROM `smart_scripts` WHERE `entryorguid` IN (13222500,13222501) AND `source_type`=9;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(132225, 0, 0, 0, 60, 0, 100, 0, 5000, 10000, 10000, 15000, 88, 13222500, 13222501, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lightforged Artificer - On Update - Run Random Actionlist'),
(13222500, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 10, 1, 113, 29, 574, 71, 400, 1, 0, 0, 0, 0, 0, 0, 0, 'Lightforged Artificer - Play Random Emote'),
(13222501, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 10, 1, 5, 6, 29, 604, 661, 1, 0, 0, 0, 0, 0, 0, 0, 'Lightforged Artificer - Play Random Emote');
-- NPC Lightforged Protector (132262)
UPDATE `creature_template_addon` SET `aiAnimKit`=12976 WHERE `entry`=132262;
DELETE FROM `smart_scripts` WHERE `entryorguid`=132262 AND `source_type`=0;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `Difficulties`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param_string`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `action_param7`, `action_param_string`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_param_string`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(132262, 0, 0, 0, '', 60, 0, 100, 0, 1000, 1000, 300000, 300000, 0, '', 11, 79968, 1, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Protector - On Update - Cast Blessing of Kings');
-- NPC Lightforged Protector (132266)
UPDATE `creature_template_addon` SET `aiAnimKit`=14737 WHERE `entry`=132266;
DELETE FROM `smart_scripts` WHERE `entryorguid`=132266 AND `source_type`=0;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `Difficulties`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param_string`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `action_param7`, `action_param_string`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_param_string`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(132266, 0, 0, 0, '', 60, 0, 100, 0, 1000, 1000, 300000, 300000, 0, '', 11, 79968, 1, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, 'Lightforged Protector - On Update - Cast Blessing of Kings');
-- NPC Yalia (132323)
UPDATE `creature_template_addon` SET `SheathState`=0, `emote`=69 WHERE `entry`=132323;
-- NPC Jarus (132325)
UPDATE `creature_template` SET `AIName`='' WHERE `entry`=132325;
UPDATE `creature_template_addon` SET `SheathState`=0, `emote`=426, `aiAnimKit`=7276 WHERE `entry`=132325;
-- NPC Lightforged Bulwark (132328)
DELETE FROM `smart_scripts` WHERE `entryorguid` IN (132328,-243617) AND `source_type`=0;
DELETE FROM `smart_scripts` WHERE `entryorguid` IN (13232800,13232801) AND `source_type`=9;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(132328, 0, 0, 0, 60, 0, 100, 0, 5000, 10000, 10000, 15000, 88, 13232800, 13232801, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lightforged Bulwark - On Update - Run Random Actionlist'),
(-243617, 0, 0, 0, 25, 0, 100, 1, 0, 0, 0, 0, 17, 492, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lightforged Bulwark - On Reset - Set Emote State'),
(13232800, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 10, 1, 113, 29, 574, 71, 400, 1, 0, 0, 0, 0, 0, 0, 0, 'Lightforged Bulwark - Play Random Emote'),
(13232801, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 10, 1, 5, 6, 29, 604, 661, 1, 0, 0, 0, 0, 0, 0, 0, 'Lightforged Bulwark - Play Random Emote');
-- NPC Grand Artificer Romuul (132334)
UPDATE `creature_template` SET `AIName`='' WHERE `entry`=132334;
-- NPC Enstraa (132358)
UPDATE `creature_template_addon` SET `emote`=641 WHERE `entry`=132358;
File diff suppressed because one or more lines are too long
@@ -0,0 +1,235 @@
DELETE FROM `creature_equip_template` WHERE (`CreatureID`=268753 AND `ID`=1);
INSERT INTO `creature_equip_template` (`CreatureID`, `ID`, `ItemID1`, `AppearanceModID1`, `ItemVisual1`, `ItemID2`, `AppearanceModID2`, `ItemVisual2`, `ItemID3`, `AppearanceModID3`, `ItemVisual3`, `VerifiedBuild`) VALUES
(268753, 1, 268215, 0, 0, 0, 0, 0, 0, 0, 0, 69587); -- Kursak the Coiled
REPLACE INTO `conversation_actors` (`ConversationId`, `ConversationActorId`, `Idx`, `CreatureId`, `CreatureDisplayInfoId`, `NoActorObject`, `ActivePlayerObject`, `VerifiedBuild`) VALUES
(28589, 105534, 0, 235535, 124899, 0, 0, 69587), -- Full: 0x2041F15A60E603C001058B00001ECF33 Creature/0 R4220/S66955 Map: 2771 (Voidstorm) Entry: 235535 (Lothraxion) Low: 2019123
(32187, 111767, 0, 241034, 124899, 0, 0, 69587);
DELETE FROM `conversation_line_template` WHERE `Id` IN (78725, 89172);
INSERT INTO `conversation_line_template` (`Id`, `UiCameraID`, `ActorIdx`, `Flags`, `ChatType`, `VerifiedBuild`) VALUES
(78725, 0, 0, 0, 0, 69587),
(89172, 1890, 0, 0, 0, 69587);
DELETE FROM `conversation_template` WHERE `Id` IN (32187, 28589);
INSERT INTO `conversation_template` (`Id`, `FirstLineID`, `TextureKitId`, `VerifiedBuild`) VALUES
(32187, 89172, 0, 69587),
(28589, 78725, 0, 69587);
DELETE FROM `ui_map_quest` WHERE (`UIMapId`=2405 AND `QuestId` IN (96048,92195,92364));
INSERT INTO `ui_map_quest` (`UIMapId`, `QuestId`, `VerifiedBuild`) VALUES
(2405, 96048, 69587), -- The Time to Strike
(2405, 92195, 69587), -- Come On Down
(2405, 92364, 69587); -- Sun Support
DELETE FROM `world_quest_template` WHERE `QuestID` IN (57219 /*Unearthed Keeper*/, 54836 /*Commander Drald*/, 56163 /*Bound Elemental*/, 51665 /*Broodmother Razora*/, 56400 /*Unit 17*/, 52979 /*Ritual Cleansing*/, 57234 /*Solar Collector*/, 54829 /*Stonebinder Ssra'vess*/, 55828 /*Bounty: More Murlocs*/, 81862 /*Feline Frenzy*/, 60842 /*To Serve Spriggan*/, 55973 /*Deepcoil Experiments*/, 49050 /*Shadeflicker*/, 51546 /*It's the Pits*/, 58285 /*Unearthed Artifacts*/, 53979 /*Naga Attack!*/, 51640 /*Beachhead*/, 51619 /*Trapline*/, 52464 /*Osca the Bloodied*/, 55824 /*Bounty: A Few Snapdragons*/, 52507 /*Sticky Mess*/, 75657 /*Time-Lost Trio*/, 56074 /*Void Conduit*/, 55670 /*Amathet Raiding Fleet*/, 50850 /*Tia'Kawan*/, 50600 /*Order of Embers*/, 55888 /*Champion Qalina, Spear of Ice*/, 52779 /*Crawg in the Bog*/, 54673 /*Tip of the Trident*/, 53346 /*Trogg Tromping*/, 51033 /*Supplies Needed: Mistscale*/, 56036 /*A Steamy Situation*/, 54825 /*Alash'anir*/, 61342 /*Battles Won Long Ago*/, 56384 /*Shadowspike Lurker*/);
INSERT INTO `world_quest_template` (`QuestID`, `Duration`, `VariableID`, `Value`) VALUES
(57219, 86400, 18469, 1), -- Unearthed Keeper
(54836, 86400, 17031, 1), -- Commander Drald
(56163, 86400, 18087, 1), -- Bound Elemental
(51665, 86400, 15435, 1), -- Broodmother Razora
(56400, 86400, 17788, 8), -- Unit 17
(52979, 86400, 16004, 2), -- Ritual Cleansing
(57234, 86400, 18471, 1), -- Solar Collector
(54829, 86400, 17024, 1), -- Stonebinder Ssra'vess
(55828, 86400, 17523, 1), -- Bounty: More Murlocs
(81862, 345600, 26477, 1), -- Feline Frenzy
(60842, 86400, 19476, 2), -- To Serve Spriggan
(55973, 86400, 17619, 1), -- Deepcoil Experiments
(49050, 86400, 14316, 1), -- Shadeflicker
(51546, 86400, 14985, 1), -- It's the Pits
(58285, 86400, 18449, 1), -- Unearthed Artifacts
(53979, 86400, 16485, 1), -- Naga Attack!
(51640, 86400, 15310, 1), -- Beachhead
(51619, 86400, 15493, 1), -- Trapline
(52464, 86400, 15764, 1), -- Osca the Bloodied
(55824, 86400, 17519, 1), -- Bounty: A Few Snapdragons
(52507, 86400, 15889, 1), -- Sticky Mess
(75657, 86400, 24019, 1), -- Time-Lost Trio
(56074, 86400, 18093, 1), -- Void Conduit
(55670, 86400, 18463, 1), -- Amathet Raiding Fleet
(50850, 86400, 14940, 1), -- Tia'Kawan
(50600, 259200, 14884, 1), -- Order of Embers
(55888, 259200, 17588, 1), -- Champion Qalina, Spear of Ice
(52779, 86400, 15890, 1), -- Crawg in the Bog
(54673, 86400, 17065, 1), -- Tip of the Trident
(53346, 86400, 15139, 4), -- Trogg Tromping
(51033, 86400, 16093, 6), -- Supplies Needed: Mistscale
(56036, 86400, 17683, 1), -- A Steamy Situation
(54825, 86400, 17019, 1), -- Alash'anir
(61342, 86400, 19734, 2), -- Battles Won Long Ago
(56384, 86400, 17787, 4); -- Shadowspike Lurker
UPDATE `world_quest_template` SET `VariableID`=14062 WHERE `QuestID`=49091; -- Invasion Point: Val
UPDATE `spawn_tracking_template` SET `PhaseId`=0 WHERE `SpawnTrackingId` IN (2478335, 2291865, 2291871);
DELETE FROM `creature_template_addon` WHERE `entry`=268753;
INSERT INTO `creature_template_addon` (`entry`, `PathId`, `mount`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvpFlags`, `emote`, `aiAnimKit`, `movementAnimKit`, `meleeAnimKit`, `visibilityDistanceType`, `auras`) VALUES
(268753, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '1260302'); -- 268753 (Kursak the Coiled) - Recovering Strength
UPDATE `creature_model_info` SET `CombatReach`=1.5 WHERE `DisplayID`=118072;
UPDATE `creature_model_info` SET `BoundingRadius`=1, `CombatReach`=1.5 WHERE `DisplayID`=137452;
UPDATE `creature_model_info` SET `BoundingRadius`=1.654816031455993652, `CombatReach`=2.160000085830688476 WHERE `DisplayID`=145588;
UPDATE `creature_model_info` SET `BoundingRadius`=3.539993524551391601 WHERE `DisplayID`=128549;
DELETE FROM `creature_template_gossip` WHERE (`CreatureID`=235535 AND `MenuID`=38425);
INSERT INTO `creature_template_gossip` (`CreatureID`, `MenuID`, `VerifiedBuild`) VALUES
(235535, 38425, 69587); -- Lothraxion
UPDATE `gameobject_template` SET `Data7`=10481 WHERE `entry`=618571;
DELETE FROM `page_text` WHERE `ID`=10481;
INSERT INTO `page_text` (`ID`, `Text`, `NextPageID`, `PlayerConditionID`, `Flags`, `VerifiedBuild`) VALUES
(10481, '<The Shadowgraft hums. It calls to you with the promise of power.\n\nYou reach a hand out before you can stop yourself. As your skin touches the cold metal, you feel a rush of power.\n\nThe thrill of battle. The soaring heartbeat of a duel. The off-beat note of a parry.\n\nThe brutal satisfaction of sinking your blade into your enemy\'s flesh, that feeling both disgusting and triumphant.\n\nYour fingers tingle. Your vision is red. You have already grabbed your weapon, turning to fight the next enemy.\n\nAs you step away from the Shadowgraft, your vision returns to normal. Your breath returns and your heartbeat slows.\n\nYou know deep in your bones that this metal will make you braver and stronger.\n\nYou also know that if you are bound by it, you will never be yourself again.>', 0, 0, 0, 69587); -- 10481
DELETE FROM `quest_details` WHERE `ID` IN (86530 /*First, The Shells*/, 86531 /*Work Disruption*/, 86536 /*Reliable Enemies*/, 86565 /*No Prayer for the Wicked*/);
INSERT INTO `quest_details` (`ID`, `Emote1`, `Emote2`, `Emote3`, `Emote4`, `EmoteDelay1`, `EmoteDelay2`, `EmoteDelay3`, `EmoteDelay4`, `VerifiedBuild`) VALUES
(86530, 1, 0, 0, 0, 0, 0, 0, 0, 69587), -- First, The Shells
(86531, 1, 0, 0, 0, 0, 0, 0, 0, 69587), -- Work Disruption
(86536, 1, 0, 0, 0, 0, 0, 0, 0, 69587), -- Reliable Enemies
(86565, 669, 0, 0, 0, 0, 0, 0, 0, 69587); -- No Prayer for the Wicked
DELETE FROM `ui_map_quest` WHERE (`UIMapId`=2405 AND `QuestId` IN (96048,92195,92122,92364));
INSERT INTO `ui_map_quest` (`UIMapId`, `QuestId`, `VerifiedBuild`) VALUES
(2405, 96048, 69587), -- The Time to Strike
(2405, 92195, 69587), -- Come On Down
(2405, 92122, 69587), -- Beneath the Sunsails
(2405, 92364, 69587); -- Sun Support
DELETE FROM `world_quest_template` WHERE `QuestID` IN (57219 /*Unearthed Keeper*/, 54836 /*Commander Drald*/, 56163 /*Bound Elemental*/, 51665 /*Broodmother Razora*/, 56400 /*Unit 17*/, 52979 /*Ritual Cleansing*/, 57234 /*Solar Collector*/, 54829 /*Stonebinder Ssra'vess*/, 55828 /*Bounty: More Murlocs*/, 81862 /*Feline Frenzy*/, 60842 /*To Serve Spriggan*/, 55973 /*Deepcoil Experiments*/, 49050 /*Shadeflicker*/, 51546 /*It's the Pits*/, 58285 /*Unearthed Artifacts*/, 53979 /*Naga Attack!*/, 51640 /*Beachhead*/, 51619 /*Trapline*/, 52464 /*Osca the Bloodied*/, 53753 /*Shell Outs*/, 51982 /*Storm's Rage*/, 55824 /*Bounty: A Few Snapdragons*/, 75657 /*Time-Lost Trio*/, 56074 /*Void Conduit*/, 55670 /*Amathet Raiding Fleet*/, 92566 /*92566*/, 48729 /*Ataxon*/, 50850 /*Tia'Kawan*/, 50600 /*Order of Embers*/, 55888 /*Champion Qalina, Spear of Ice*/, 52779 /*Crawg in the Bog*/, 54647 /*Ale Intent*/, 54673 /*Tip of the Trident*/, 53346 /*Trogg Tromping*/, 51033 /*Supplies Needed: Mistscale*/, 53724 /*Shadow Hunter Mutumba*/, 53768 /*Furious Fracas*/, 56036 /*A Steamy Situation*/, 54825 /*Alash'anir*/, 53715 /*Firewarden Viton Darkflare*/, 61342 /*Battles Won Long Ago*/, 56384 /*Shadowspike Lurker*/);
INSERT INTO `world_quest_template` (`QuestID`, `Duration`, `VariableID`, `Value`) VALUES
(57219, 86400, 18469, 1), -- Unearthed Keeper
(54836, 86400, 17031, 1), -- Commander Drald
(56163, 86400, 18087, 1), -- Bound Elemental
(51665, 86400, 15435, 1), -- Broodmother Razora
(56400, 86400, 17788, 8), -- Unit 17
(52979, 86400, 16004, 2), -- Ritual Cleansing
(57234, 86400, 18471, 1), -- Solar Collector
(54829, 86400, 17024, 1), -- Stonebinder Ssra'vess
(55828, 86400, 17523, 1), -- Bounty: More Murlocs
(81862, 345600, 26477, 1), -- Feline Frenzy
(60842, 86400, 19476, 2), -- To Serve Spriggan
(55973, 86400, 17619, 1), -- Deepcoil Experiments
(49050, 86400, 14316, 1), -- Shadeflicker
(51546, 86400, 14985, 1), -- It's the Pits
(58285, 86400, 18449, 1), -- Unearthed Artifacts
(53979, 86400, 16485, 1), -- Naga Attack!
(51640, 86400, 15310, 1), -- Beachhead
(51619, 86400, 15493, 1), -- Trapline
(52464, 86400, 15764, 1), -- Osca the Bloodied
(53753, 25200, 16289, 1), -- Shell Outs
(51982, 25200, 16289, 1), -- Storm's Rage
(55824, 86400, 17519, 1), -- Bounty: A Few Snapdragons
(75657, 86400, 24019, 1), -- Time-Lost Trio
(56074, 86400, 18093, 1), -- Void Conduit
(55670, 86400, 18463, 1), -- Amathet Raiding Fleet
(92566, 302400, 29823, 1), -- 92566
(48729, 86400, 14179, 1), -- Ataxon
(50850, 86400, 14940, 1), -- Tia'Kawan
(50600, 259200, 14884, 1), -- Order of Embers
(55888, 259200, 17588, 1), -- Champion Qalina, Spear of Ice
(52779, 86400, 15890, 1), -- Crawg in the Bog
(54647, 25200, 16289, 1), -- Ale Intent
(54673, 86400, 17065, 1), -- Tip of the Trident
(53346, 86400, 15139, 4), -- Trogg Tromping
(51033, 86400, 16093, 6), -- Supplies Needed: Mistscale
(53724, 25200, 16289, 1), -- Shadow Hunter Mutumba
(53768, 25200, 16289, 1), -- Furious Fracas
(56036, 86400, 17683, 1), -- A Steamy Situation
(54825, 86400, 17019, 1), -- Alash'anir
(53715, 25200, 16289, 1), -- Firewarden Viton Darkflare
(61342, 86400, 19734, 2), -- Battles Won Long Ago
(56384, 86400, 17787, 4); -- Shadowspike Lurker
UPDATE `world_quest_template` SET `VariableID`=14247 WHERE `QuestID`=49096; -- Invasion Point: Naigtal
UPDATE `world_quest_template` SET `VariableID`=14062 WHERE `QuestID`=49091; -- Invasion Point: Val
UPDATE `world_quest_template` SET `VariableID`=14061 WHERE `QuestID`=48982; -- Invasion Point: Aurinor
DELETE FROM `spawn_tracking_template` WHERE `SpawnTrackingId` IN (2702275 /*Map: 2771 (Voidstorm) - Phase: 25963*/, 2703730 /*Map: 2771 (Voidstorm) - Phase: 25966*/, 2702280 /*Map: 2771 (Voidstorm) - Phase: 25964*/, 2703732 /*Map: 2771 (Voidstorm) - Phase: 25965*/, 2703356 /*Map: 2771 (Voidstorm) - Phase: 27316*/, 2702278 /*Map: 2771 (Voidstorm) - Phase: 25964*/, 2703358 /*Map: 2771 (Voidstorm) - Phase: 26477*/, 2703339 /*Map: 2771 (Voidstorm) - Phase: 25853*/, 2703322 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2799645 /*Map: 2771 (Voidstorm) - Phase: 0*/, 2703359 /*Map: 2771 (Voidstorm) - Phase: 27316*/);
INSERT INTO `spawn_tracking_template` (`SpawnTrackingId`, `MapId`, `PhaseId`, `PhaseGroup`, `PhaseUseFlags`, `VerifiedBuild`) VALUES
(2702275, 2771, 25963, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 25963
(2703730, 2771, 25966, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 25966
(2702280, 2771, 25964, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 25964
(2703732, 2771, 25965, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 25965
(2703356, 2771, 27316, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 27316
(2702278, 2771, 25964, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 25964
(2703358, 2771, 26477, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 26477
(2703339, 2771, 25853, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 25853
(2703322, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2799645, 2771, 0, 0, 0, 69587), -- Map: 2771 (Voidstorm) - Phase: 0
(2703359, 2771, 27316, 0, 0, 69587); -- Map: 2771 (Voidstorm) - Phase: 27316
UPDATE `spawn_tracking_template` SET `PhaseId`=0 WHERE `SpawnTrackingId` IN (2478335, 2291865, 2291871);
DELETE FROM `spawn_tracking_quest_objective` WHERE (`SpawnTrackingId`=2703730 AND `QuestObjectiveId`=459674) OR (`SpawnTrackingId`=2702278 AND `QuestObjectiveId`=464297) OR (`SpawnTrackingId`=2703358 AND `QuestObjectiveId`=459779) OR (`SpawnTrackingId`=2703339 AND `QuestObjectiveId`=456983) OR (`SpawnTrackingId`=2703322 AND `QuestObjectiveId`=456982) OR (`SpawnTrackingId`=2799645 AND `QuestObjectiveId`=461332);
INSERT INTO `spawn_tracking_quest_objective` (`SpawnTrackingId`, `QuestObjectiveId`, `VerifiedBuild`) VALUES
(2703730, 459674, 69587), -- 2703730
(2702278, 464297, 69587), -- 2702278
(2703358, 459779, 69587), -- 2703358
(2703339, 456983, 69587), -- 2703339
(2703322, 456982, 69587), -- 2703322
(2799645, 461332, 69587); -- 2799645
DELETE FROM `spell_target_position` WHERE (`ID`=1233371 AND `EffectIndex`=1 AND `OrderIndex`=0);
INSERT INTO `spell_target_position` (`ID`, `EffectIndex`, `OrderIndex`, `MapID`, `PositionX`, `PositionY`, `PositionZ`, `VerifiedBuild`) VALUES
(1233371, 1, 0, 2771, 2903.85009765625, 2013.3299560546875, 180.3699951171875, 69587); -- Spell: 1233371 ([DNT] Start Scene) Effect 1: 252 (SPELL_EFFECT_TELEPORT_UNITS)
DELETE FROM `creature_template_difficulty` WHERE (`Entry`=217429 AND `DifficultyID`=1);
INSERT INTO `creature_template_difficulty` (`Entry`, `DifficultyID`, `HealthScalingExpansion`, `HealthModifier`, `ManaModifier`, `CreatureDifficultyID`, `TypeFlags`, `TypeFlags2`, `TypeFlags3`) VALUES
(217429, 1, 11, 2, 1, 266922, 0x0, 1, 0); -- Overfiend
UPDATE `creature_template_difficulty` SET `HealthScalingExpansion`=11, `HealthModifier`=1.5, `ManaModifier`=1.5, `CreatureDifficultyID`=55991 WHERE (`Entry`=62821 AND `DifficultyID`=1); -- Mystic Birdhat
UPDATE `creature_template_difficulty` SET `HealthScalingExpansion`=11, `HealthModifier`=1, `CreatureDifficultyID`=55992 WHERE (`Entry`=62822 AND `DifficultyID`=1); -- Cousin Slowhands
UPDATE `creature_template_difficulty` SET `HealthScalingExpansion`=11 WHERE (`Entry`=166949 AND `DifficultyID`=1); -- Chi-Ji
UPDATE `creature_model_info` SET `BoundingRadius`=3.539993524551391601 WHERE `DisplayID`=128549;
UPDATE `creature_model_info` SET `BoundingRadius`=1, `CombatReach`=2 WHERE `DisplayID`=145977;
UPDATE `creature_model_info` SET `BoundingRadius`=1 WHERE `DisplayID`=146677;
UPDATE `creature_model_info` SET `BoundingRadius`=0.949782073497772216 WHERE `DisplayID`=146663;
UPDATE `creature_model_info` SET `BoundingRadius`=1.358234524726867675 WHERE `DisplayID`=144271;
UPDATE `creature_model_info` SET `BoundingRadius`=1.654816031455993652, `CombatReach`=2.160000085830688476 WHERE `DisplayID`=146372;
UPDATE `creature_model_info` SET `BoundingRadius`=3.483673095703125, `CombatReach`=3.60000014305114746 WHERE `DisplayID`=146986;
UPDATE `creature_model_info` SET `BoundingRadius`=1.049999952316284179, `CombatReach`=1.75 WHERE `DisplayID`=147574;
UPDATE `creature_model_info` SET `BoundingRadius`=2.615614652633666992, `CombatReach`=1.399999976158142089 WHERE `DisplayID`=137230;
UPDATE `creature_model_info` SET `BoundingRadius`=1.039555668830871582, `CombatReach`=1 WHERE `DisplayID`=131269;
DELETE FROM `creature_template_gossip` WHERE (`CreatureID`=235392 AND `MenuID`=38393) OR (`CreatureID`=235607 AND `MenuID`=38620) OR (`CreatureID`=235537 AND `MenuID`=39205) OR (`CreatureID`=235535 AND `MenuID`=38425);
INSERT INTO `creature_template_gossip` (`CreatureID`, `MenuID`, `VerifiedBuild`) VALUES
(235392, 38393, 69587), -- Decimus
(235607, 38620, 69587), -- Decimus
(235537, 39205, 69587), -- Arator
(235535, 38425, 69587); -- Lothraxion
REPLACE INTO `npc_text` (`ID`, `Probability0`, `Probability1`, `Probability2`, `Probability3`, `Probability4`, `Probability5`, `Probability6`, `Probability7`, `BroadcastTextId0`, `BroadcastTextId1`, `BroadcastTextId2`, `BroadcastTextId3`, `BroadcastTextId4`, `BroadcastTextId5`, `BroadcastTextId6`, `BroadcastTextId7`, `VerifiedBuild`) VALUES
(235537, 1, 0, 0, 0, 0, 0, 0, 0, 289834, 0, 0, 0, 0, 0, 0, 0, 69587), -- 235537 (Arator)
(235392, 1, 0, 0, 0, 0, 0, 0, 0, 297403, 0, 0, 0, 0, 0, 0, 0, 69587), -- 235392 (Decimus)
(235607, 1, 0, 0, 0, 0, 0, 0, 0, 285822, 0, 0, 0, 0, 0, 0, 0, 69587); -- 235607 (Decimus)
REPLACE INTO `gossip_menu` (`MenuID`, `TextID`, `VerifiedBuild`) VALUES
(39205, 235537, 69587), -- 235537 (Arator)
(38393, 235392, 69587), -- 235392 (Decimus)
(38620, 235607, 69587); -- 235607 (Decimus)
DELETE FROM `gossip_menu_option` WHERE (`MenuID`=39205 AND `OptionID`=0) OR (`MenuID`=38393 AND `OptionID`=0) OR (`MenuID`=38620 AND `OptionID` IN (2,0,1));
INSERT INTO `gossip_menu_option` (`MenuID`, `GossipOptionID`, `OptionID`, `OptionNpc`, `OptionText`, `OptionBroadcastTextID`, `Language`, `Flags`, `ActionMenuID`, `ActionPoiID`, `GossipNpcOptionID`, `BoxCoded`, `BoxMoney`, `BoxText`, `BoxBroadcastTextID`, `SpellID`, `OverrideIconID`, `VerifiedBuild`) VALUES
(39205, 133752, 0, 0, '<Ask Arator when he\'s planning on telling Alleria what Turalyon did at the Amani Pass.>', 0, 0, 0, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(38393, 135469, 0, 0, 'How did Xal\'atath take control of the ethereals?', 0, 0, 5, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(38620, 133628, 2, 0, '<Ask for more information about the domanaar.>', 0, 0, 0, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(38620, 132998, 0, 0, '<Apply force.>', 0, 0, 1, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587),
(38620, 132848, 1, 0, '|cFFFF0000<Skip>|r I don\'t have time for this. Tell us what you know.', 0, 0, 1, 0, 0, NULL, 0, 0, '', 0, NULL, NULL, 69587);
@@ -44,23 +44,37 @@
#include "UpdateData.h" #include "UpdateData.h"
#include "ZoneScript.h" #include "ZoneScript.h"
#include "advstd.h" #include "advstd.h"
#include <G3D/AABox.h>
#include <G3D/Box.h>
#include <G3D/CollisionDetection.h>
#include <G3D/CoordinateFrame.h>
#include <G3D/Cylinder.h>
#include <G3D/Quat.h>
#include <bit> #include <bit>
struct AreaTrigger::MovementUpdateResult enum class MovementUpdateResult
{
enum
{ {
None, None,
Moved, Moved,
Arrived Arrived
} Status; };
struct AreaTrigger::MovementUpdateWorldResult
{
MovementUpdateResult Status;
::Position Position;
G3D::Quat Rotation;
};
struct AreaTrigger::MovementUpdateLocalResult
{
MovementUpdateResult Status;
G3D::Vector3 Position; G3D::Vector3 Position;
float Rotation = 0.0f; G3D::Vector3 Rotation;
}; };
AreaTrigger::AreaTrigger() : WorldObject(false), MapObject(), _spawnId(0), _aurEff(nullptr), AreaTrigger::AreaTrigger() : WorldObject(false), MapObject(), _spawnId(0), _aurEff(nullptr),
_duration(0), _totalDuration(0), _verticesUpdatePreviousOrientation(std::numeric_limits<float>::infinity()), _duration(0), _totalDuration(0), _verticesUpdatePreviousRotation(),
_isRemoved(false), _reachedDestination(true), _isRemoved(false), _reachedDestination(true),
_areaTriggerCreateProperties(nullptr), _areaTriggerTemplate(nullptr) _areaTriggerCreateProperties(nullptr), _areaTriggerTemplate(nullptr)
{ {
@@ -184,7 +198,7 @@ bool AreaTrigger::Create(AreaTriggerCreatePropertiesId areaTriggerCreateProperti
{ {
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::TimeToTargetScale), GetCreateProperties()->TimeToTargetScale != 0 ? GetCreateProperties()->TimeToTargetScale : *m_areaTriggerData->Duration); SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::TimeToTargetScale), GetCreateProperties()->TimeToTargetScale != 0 ? GetCreateProperties()->TimeToTargetScale : *m_areaTriggerData->Duration);
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::TimeToTargetPos), *m_areaTriggerData->Duration); SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::TimeToTargetPos), *m_areaTriggerData->Duration);
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::TimeToTargetFacing), *m_areaTriggerData->Duration); SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::TimeToTargetShape), *m_areaTriggerData->Duration);
} }
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::BoundsRadius2D), GetCreateProperties()->Shape.GetMaxSearchRadius()); SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::BoundsRadius2D), GetCreateProperties()->Shape.GetMaxSearchRadius());
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::DecalPropertiesID), GetCreateProperties()->DecalPropertiesId); SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::DecalPropertiesID), GetCreateProperties()->DecalPropertiesId);
@@ -291,12 +305,19 @@ bool AreaTrigger::Create(AreaTriggerCreatePropertiesId areaTriggerCreateProperti
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::Facing), _stationaryPosition.GetOrientation()); SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::Facing), _stationaryPosition.GetOrientation());
UpdateShape();
AI_Initialize(); AI_Initialize();
UpdateDynamicShapeFlag(); UpdateDynamicShapeFlag();
// Calculate initial position and rotation
{
auto [_, movedPos, movedRot] = CalculateWorldPositionAndRotation();
Relocate(movedPos);
_rotation = { movedRot.x, movedRot.y, movedRot.z, movedRot.w };
}
UpdateShape();
if (!IsStaticSpawn()) if (!IsStaticSpawn())
{ {
if (!GetMap()->AddToMap(this)) if (!GetMap()->AddToMap(this))
@@ -451,19 +472,19 @@ void AreaTrigger::ClearOverrideMoveCurve()
UpdateDynamicShapeFlag(); UpdateDynamicShapeFlag();
} }
void AreaTrigger::SetOverrideFacingCurve(float overrideFacing) void AreaTrigger::SetOverrideShapeCurve(float overrideFacing)
{ {
SetOverrideCurve(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::OverrideFacingCurve), overrideFacing); SetOverrideCurve(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::OverrideShapeCurve), overrideFacing);
} }
void AreaTrigger::SetOverrideFacingCurve(std::array<DBCPosition2D, 2> const& points, Optional<uint32> startTimeOffset, CurveInterpolationMode interpolation) void AreaTrigger::SetOverrideShapeCurve(std::array<DBCPosition2D, 2> const& points, Optional<uint32> startTimeOffset, CurveInterpolationMode interpolation)
{ {
SetOverrideCurve(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::OverrideFacingCurve), points, startTimeOffset, interpolation); SetOverrideCurve(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::OverrideShapeCurve), points, startTimeOffset, interpolation);
} }
void AreaTrigger::ClearOverrideFacingCurve() void AreaTrigger::ClearOverrideShapeCurve()
{ {
ClearOverrideCurve(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::OverrideFacingCurve)); ClearOverrideCurve(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::OverrideShapeCurve));
} }
void AreaTrigger::SetSpellVisual(SpellCastVisual const& visual) void AreaTrigger::SetSpellVisual(SpellCastVisual const& visual)
@@ -474,6 +495,24 @@ void AreaTrigger::SetSpellVisual(SpellCastVisual const& visual)
SetUpdateFieldValue(spellVisualMutator.ModifyValue(&UF::SpellCastVisual::ScriptVisualID), visual.ScriptVisualID); SetUpdateFieldValue(spellVisualMutator.ModifyValue(&UF::SpellCastVisual::ScriptVisualID), visual.ScriptVisualID);
} }
void AreaTrigger::SetRollPitchYaw(float roll, float pitch, float yaw,
Optional<float> targetRoll, Optional<float> targetPitch, Optional<float> targetYaw)
{
auto areaTriggerData = m_values.ModifyValue(&AreaTrigger::m_areaTriggerData);
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::RollPitchYaw), { roll, pitch, yaw });
if (targetRoll && targetPitch && targetYaw)
{
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::TargetRollPitchYaw, 0), { *targetRoll, *targetPitch, *targetYaw });
SetAreaTriggerFlag(AreaTriggerFieldFlags::DynamicShape);
}
else
{
RemoveOptionalUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::TargetRollPitchYaw));
UpdateDynamicShapeFlag();
}
}
void AreaTrigger::SetDuration(int32 newDuration) void AreaTrigger::SetDuration(int32 newDuration)
{ {
_duration = newDuration; _duration = newDuration;
@@ -501,21 +540,13 @@ float AreaTrigger::CalcCurrentScale() const
if (m_areaTriggerData->OverrideScaleCurve->OverrideActive) if (m_areaTriggerData->OverrideScaleCurve->OverrideActive)
scale *= std::max(GetOverrideCurveValue(*m_areaTriggerData->OverrideScaleCurve, m_areaTriggerData->TimeToTargetScale), 0.000001f); scale *= std::max(GetOverrideCurveValue(*m_areaTriggerData->OverrideScaleCurve, m_areaTriggerData->TimeToTargetScale), 0.000001f);
else if (m_areaTriggerData->ScaleCurveId) else if (m_areaTriggerData->ScaleCurveId)
scale *= std::max(sDB2Manager.GetCurveValueAt(m_areaTriggerData->ScaleCurveId, GetOverrideCurveProgress(*m_areaTriggerData->OverrideScaleCurve, m_areaTriggerData->TimeToTargetScale)), 0.000001f); scale *= std::max(sDB2Manager.GetCurveValueAt(m_areaTriggerData->ScaleCurveId, GetScaleProgress()), 0.000001f);
scale *= std::max(GetOverrideCurveValue(*m_areaTriggerData->ExtraScaleCurve, m_areaTriggerData->TimeToTargetExtraScale), 0.000001f); scale *= std::max(GetOverrideCurveValue(*m_areaTriggerData->ExtraScaleCurve, m_areaTriggerData->TimeToTargetExtraScale), 0.000001f);
return scale; return scale;
} }
float AreaTrigger::GetProgress() const
{
if (_totalDuration <= 0)
return 1.0f;
return std::clamp(float(GetTimeSinceCreated()) / float(GetTotalDuration()), 0.0f, 1.0f);
}
float AreaTrigger::GetOverrideCurveProgress(UF::OverrideCurve const& overrideCurve, uint32 timeTo) const float AreaTrigger::GetOverrideCurveProgress(UF::OverrideCurve const& overrideCurve, uint32 timeTo) const
{ {
if (!timeTo) if (!timeTo)
@@ -727,7 +758,7 @@ void AreaTrigger::SearchUnits(std::vector<Unit*>& targetList, float radius, bool
void AreaTrigger::SearchUnitInSphere(UF::AreaTriggerSphere const& sphere, std::vector<Unit*>& targetList) void AreaTrigger::SearchUnitInSphere(UF::AreaTriggerSphere const& sphere, std::vector<Unit*>& targetList)
{ {
float progress = GetProgress(); float progress = GetShapeProgress();
if (m_areaTriggerData->MorphCurveId) if (m_areaTriggerData->MorphCurveId)
progress = sDB2Manager.GetCurveValueAt(m_areaTriggerData->MorphCurveId, progress); progress = sDB2Manager.GetCurveValueAt(m_areaTriggerData->MorphCurveId, progress);
@@ -735,11 +766,16 @@ void AreaTrigger::SearchUnitInSphere(UF::AreaTriggerSphere const& sphere, std::v
float radius = G3D::lerp(sphere.Radius, sphere.RadiusTarget, progress) * scale; float radius = G3D::lerp(sphere.Radius, sphere.RadiusTarget, progress) * scale;
SearchUnits(targetList, radius, true); SearchUnits(targetList, radius, true);
Trinity::Containers::EraseIf(targetList, [this, radius](Unit const* unit) -> bool
{
return !unit->IsWithinDist(this, radius);
});
} }
void AreaTrigger::SearchUnitInBox(UF::AreaTriggerBox const& box, std::vector<Unit*>& targetList) void AreaTrigger::SearchUnitInBox(UF::AreaTriggerBox const& box, std::vector<Unit*>& targetList)
{ {
float progress = GetProgress(); float progress = GetShapeProgress();
if (m_areaTriggerData->MorphCurveId) if (m_areaTriggerData->MorphCurveId)
progress = sDB2Manager.GetCurveValueAt(m_areaTriggerData->MorphCurveId, progress); progress = sDB2Manager.GetCurveValueAt(m_areaTriggerData->MorphCurveId, progress);
@@ -747,20 +783,32 @@ void AreaTrigger::SearchUnitInBox(UF::AreaTriggerBox const& box, std::vector<Uni
float extentsX = G3D::lerp(box.Extents->Pos.GetPositionX(), box.ExtentsTarget->Pos.GetPositionX(), progress) * scale; float extentsX = G3D::lerp(box.Extents->Pos.GetPositionX(), box.ExtentsTarget->Pos.GetPositionX(), progress) * scale;
float extentsY = G3D::lerp(box.Extents->Pos.GetPositionY(), box.ExtentsTarget->Pos.GetPositionY(), progress) * scale; float extentsY = G3D::lerp(box.Extents->Pos.GetPositionY(), box.ExtentsTarget->Pos.GetPositionY(), progress) * scale;
float extentsZ = G3D::lerp(box.Extents->Pos.GetPositionZ(), box.ExtentsTarget->Pos.GetPositionZ(), progress) * scale; float extentsZ = G3D::lerp(box.Extents->Pos.GetPositionZ(), box.ExtentsTarget->Pos.GetPositionZ(), progress) * scale;
float radius = std::sqrt(extentsX * extentsX + extentsY * extentsY); float radius = std::sqrt(extentsX * extentsX + extentsY * extentsY + extentsZ * extentsZ);
SearchUnits(targetList, radius, false); SearchUnits(targetList, radius, false);
Position const& boxCenter = GetPosition(); if (targetList.empty())
Trinity::Containers::EraseIf(targetList, [boxCenter, extentsX, extentsY, extentsZ](Unit const* unit) -> bool return;
G3D::Box rotatedBox = G3D::CoordinateFrame(G3D::Quat(_rotation.x, _rotation.y, _rotation.z, _rotation.w), PositionToVector3(GetPosition()))
.toWorldSpace(G3D::AABox({ -extentsX, -extentsY, -extentsZ / 2 }, { extentsX, extentsY, extentsZ / 2 }));
Trinity::Containers::EraseIf(targetList, [&rotatedBox](Unit const* unit) -> bool
{ {
return !unit->IsWithinBox(boxCenter, extentsX, extentsY, extentsZ / 2); return !rotatedBox.contains(PositionToVector3(*unit));
}); });
#ifdef TRINITY_DEBUG
// DebugVisualizeShape
if (Player* caster = Object::ToPlayer(GetCaster()); caster && caster->isDebugAreaTriggers)
for (int32 corner = 0; corner < 8; ++corner)
caster->SummonCreature(1, Vector3ToPosition(rotatedBox.corner(corner)), TEMPSUMMON_TIMED_DESPAWN, 50ms);
#endif
} }
void AreaTrigger::SearchUnitInPolygon(UF::AreaTriggerPolygon const& polygon, std::vector<Unit*>& targetList) void AreaTrigger::SearchUnitInPolygon(UF::AreaTriggerPolygon const& polygon, std::vector<Unit*>& targetList)
{ {
float progress = GetProgress(); float progress = GetShapeProgress();
if (m_areaTriggerData->MorphCurveId) if (m_areaTriggerData->MorphCurveId)
progress = sDB2Manager.GetCurveValueAt(m_areaTriggerData->MorphCurveId, progress); progress = sDB2Manager.GetCurveValueAt(m_areaTriggerData->MorphCurveId, progress);
@@ -770,17 +818,33 @@ void AreaTrigger::SearchUnitInPolygon(UF::AreaTriggerPolygon const& polygon, std
SearchUnits(targetList, GetMaxSearchRadius(), false); SearchUnits(targetList, GetMaxSearchRadius(), false);
if (targetList.empty())
return;
Trinity::Containers::EraseIf(targetList, [this, minZ, maxZ](Unit const* unit) -> bool Trinity::Containers::EraseIf(targetList, [this, minZ, maxZ](Unit const* unit) -> bool
{ {
return unit->GetPositionZ() < minZ return unit->GetPositionZ() < minZ
|| unit->GetPositionZ() > maxZ || unit->GetPositionZ() > maxZ
|| !unit->IsInPolygon2D(*this, _polygonVertices); || !unit->IsInPolygon2D(*this, _polygonVertices);
}); });
#ifdef TRINITY_DEBUG
// DebugVisualizeShape
if (Player* caster = Object::ToPlayer(GetCaster()); caster && caster->isDebugAreaTriggers)
{
for (Position const& vertex : _polygonVertices)
{
G3D::Vector3 pos = PositionToVector3(GetPosition()) + PositionToVector3(vertex);
caster->SummonCreature(1, Vector3ToPosition(pos + G3D::Vector3(0, 0, -height)), TEMPSUMMON_TIMED_DESPAWN, 50ms);
caster->SummonCreature(1, Vector3ToPosition(pos + G3D::Vector3(0, 0, +height)), TEMPSUMMON_TIMED_DESPAWN, 50ms);
}
}
#endif
} }
void AreaTrigger::SearchUnitInCylinder(UF::AreaTriggerCylinder const& cylinder, std::vector<Unit*>& targetList) void AreaTrigger::SearchUnitInCylinder(UF::AreaTriggerCylinder const& cylinder, std::vector<Unit*>& targetList)
{ {
float progress = GetProgress(); float progress = GetShapeProgress();
if (m_areaTriggerData->MorphCurveId) if (m_areaTriggerData->MorphCurveId)
progress = sDB2Manager.GetCurveValueAt(m_areaTriggerData->MorphCurveId, progress); progress = sDB2Manager.GetCurveValueAt(m_areaTriggerData->MorphCurveId, progress);
@@ -790,21 +854,35 @@ void AreaTrigger::SearchUnitInCylinder(UF::AreaTriggerCylinder const& cylinder,
if (!HasAreaTriggerFlag(AreaTriggerFieldFlags::HeightIgnoresScale)) if (!HasAreaTriggerFlag(AreaTriggerFieldFlags::HeightIgnoresScale))
height *= scale; height *= scale;
float minZ = GetPositionZ() - height; float zOffset = G3D::lerp(cylinder.LocationZOffset, cylinder.LocationZOffsetTarget, progress) * scale;
float maxZ = GetPositionZ() + height;
SearchUnits(targetList, radius, false); SearchUnits(targetList, std::sqrt(radius * radius + height * height), false);
Trinity::Containers::EraseIf(targetList, [minZ, maxZ](Unit const* unit) -> bool if (targetList.empty())
return;
G3D::Cylinder rotatedCylinder = G3D::CoordinateFrame(G3D::Quat(_rotation.x, _rotation.y, _rotation.z, _rotation.w), PositionToVector3(GetPosition()))
.toWorldSpace(G3D::Cylinder(
{ 0.0f, 0.0f, 0.0f + zOffset },
{ 0.0f, 0.0f, 0.0f + zOffset + height },
radius));
Trinity::Containers::EraseIf(targetList, [&rotatedCylinder](Unit const* unit) -> bool
{ {
return unit->GetPositionZ() < minZ return !rotatedCylinder.contains(PositionToVector3(*unit));
|| unit->GetPositionZ() > maxZ;
}); });
#ifdef TRINITY_DEBUG
// DebugVisualizeShape
if (Player* caster = Object::ToPlayer(GetCaster()); caster && caster->isDebugAreaTriggers)
for (int32 end = 0; end < 2; ++end)
caster->SummonCreature(1, Vector3ToPosition(rotatedCylinder.point(end)), TEMPSUMMON_TIMED_DESPAWN, 50ms);
#endif
} }
void AreaTrigger::SearchUnitInDisk(UF::AreaTriggerDisk const& disk, std::vector<Unit*>& targetList) void AreaTrigger::SearchUnitInDisk(UF::AreaTriggerDisk const& disk, std::vector<Unit*>& targetList)
{ {
float progress = GetProgress(); float progress = GetShapeProgress();
if (m_areaTriggerData->MorphCurveId) if (m_areaTriggerData->MorphCurveId)
progress = sDB2Manager.GetCurveValueAt(m_areaTriggerData->MorphCurveId, progress); progress = sDB2Manager.GetCurveValueAt(m_areaTriggerData->MorphCurveId, progress);
@@ -815,35 +893,73 @@ void AreaTrigger::SearchUnitInDisk(UF::AreaTriggerDisk const& disk, std::vector<
if (!HasAreaTriggerFlag(AreaTriggerFieldFlags::HeightIgnoresScale)) if (!HasAreaTriggerFlag(AreaTriggerFieldFlags::HeightIgnoresScale))
height *= scale; height *= scale;
float minZ = GetPositionZ() - height; float zOffset = G3D::lerp(disk.LocationZOffset, disk.LocationZOffsetTarget, progress) * scale;
float maxZ = GetPositionZ() + height;
SearchUnits(targetList, outerRadius, false); SearchUnits(targetList, std::sqrt(outerRadius * outerRadius + height * height), false);
Trinity::Containers::EraseIf(targetList, [this, innerRadius, minZ, maxZ](Unit const* unit) -> bool if (targetList.empty())
return;
G3D::Cylinder innerCylinder = G3D::CoordinateFrame(G3D::Quat(_rotation.x, _rotation.y, _rotation.z, _rotation.w), PositionToVector3(GetPosition()))
.toWorldSpace(G3D::Cylinder(
{ 0.0f, 0.0f, 0.0f + zOffset },
{ 0.0f, 0.0f, 0.0f + zOffset + height },
innerRadius));
G3D::Cylinder outerCylinder(innerCylinder.point(0), innerCylinder.point(1), outerRadius);
Trinity::Containers::EraseIf(targetList, [&innerCylinder, &outerCylinder](Unit const* unit) -> bool
{ {
return unit->IsInDist2d(this, innerRadius) || unit->GetPositionZ() < minZ || unit->GetPositionZ() > maxZ; G3D::Vector3 position = PositionToVector3(*unit);
return innerCylinder.contains(position) || !outerCylinder.contains(position);
}); });
#ifdef TRINITY_DEBUG
// DebugVisualizeShape
if (Player* caster = Object::ToPlayer(GetCaster()); caster && caster->isDebugAreaTriggers)
for (int32 end = 0; end < 2; ++end)
caster->SummonCreature(1, Vector3ToPosition(innerCylinder.point(end)), TEMPSUMMON_TIMED_DESPAWN, 50ms);
#endif
} }
void AreaTrigger::SearchUnitInBoundedPlane(UF::AreaTriggerBoundedPlane const& boundedPlane, std::vector<Unit*>& targetList) void AreaTrigger::SearchUnitInBoundedPlane(UF::AreaTriggerBoundedPlane const& boundedPlane, std::vector<Unit*>& targetList)
{ {
float progress = GetProgress(); float progress = GetShapeProgress();
if (m_areaTriggerData->MorphCurveId) if (m_areaTriggerData->MorphCurveId)
progress = sDB2Manager.GetCurveValueAt(m_areaTriggerData->MorphCurveId, progress); progress = sDB2Manager.GetCurveValueAt(m_areaTriggerData->MorphCurveId, progress);
float scale = CalcCurrentScale(); float scale = CalcCurrentScale();
float extentsX = G3D::lerp(boundedPlane.ExtentsX, boundedPlane.ExtentsTargetX, progress) * scale;
float extentsY = G3D::lerp(boundedPlane.ExtentsY, boundedPlane.ExtentsTargetY, progress) * scale; float extentsY = G3D::lerp(boundedPlane.ExtentsY, boundedPlane.ExtentsTargetY, progress) * scale;
float radius = std::sqrt(extentsX * extentsX + extentsY * extentsY); float extentsZ = G3D::lerp(boundedPlane.ExtentsZ, boundedPlane.ExtentsTargetZ, progress) * scale;
float radius = std::sqrt(extentsY * extentsY + extentsZ * extentsZ);
SearchUnits(targetList, radius, false); SearchUnits(targetList, radius, false);
Position const& boxCenter = GetPosition(); if (targetList.empty())
Trinity::Containers::EraseIf(targetList, [boxCenter, extentsX, extentsY](Unit const* unit) -> bool return;
G3D::CoordinateFrame coordinateFrame = G3D::CoordinateFrame(G3D::Quat(_rotation.x, _rotation.y, _rotation.z, _rotation.w), PositionToVector3(GetPosition()));
G3D::Vector3 corners[4] =
{ {
return !unit->IsWithinBox(boxCenter, extentsX, extentsY, MAP_SIZE); coordinateFrame.pointToWorldSpace(G3D::Vector3(0.0f, -extentsY, -extentsZ)),
coordinateFrame.pointToWorldSpace(G3D::Vector3(0.0f, extentsY, -extentsZ)),
coordinateFrame.pointToWorldSpace(G3D::Vector3(0.0f, -extentsY, extentsZ)),
coordinateFrame.pointToWorldSpace(G3D::Vector3(0.0f, extentsY, extentsZ))
};
Trinity::Containers::EraseIf(targetList, [&corners](Unit const* unit) -> bool
{
G3D::Vector3 closestPoint = G3D::CollisionDetection::closestPointToRectangle(corners[0], corners[1], corners[2], corners[3], PositionToVector3(*unit));
return !unit->IsInDist(closestPoint.x, closestPoint.y, closestPoint.z, unit->GetCombatReach());
}); });
#ifdef TRINITY_DEBUG
// DebugVisualizeShape
if (Player* caster = Object::ToPlayer(GetCaster()); caster && caster->isDebugAreaTriggers)
for (G3D::Vector3 const& corner : corners)
caster->SummonCreature(1, Vector3ToPosition(corner), TEMPSUMMON_TIMED_DESPAWN, 50ms);
#endif
} }
void AreaTrigger::HandleUnitEnterExit(std::vector<Unit*> const& newTargetList, AreaTriggerExitReason exitMode) void AreaTrigger::HandleUnitEnterExit(std::vector<Unit*> const& newTargetList, AreaTriggerExitReason exitMode)
@@ -1035,10 +1151,10 @@ void AreaTrigger::SetShape(AreaTriggerShapeInfo const& shape)
{ {
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::ShapeType), 8); SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::ShapeType), 8);
auto boundedPlane = areaTriggerData.ModifyValue(&UF::AreaTriggerData::ShapeData, UF::VariantCase<UF::AreaTriggerBoundedPlane>); auto boundedPlane = areaTriggerData.ModifyValue(&UF::AreaTriggerData::ShapeData, UF::VariantCase<UF::AreaTriggerBoundedPlane>);
SetUpdateFieldValue(boundedPlane.ModifyValue(&UF::AreaTriggerBoundedPlane::ExtentsX), shapeData.Extents.Pos.GetPositionX()); SetUpdateFieldValue(boundedPlane.ModifyValue(&UF::AreaTriggerBoundedPlane::ExtentsY), shapeData.ExtentsY);
SetUpdateFieldValue(boundedPlane.ModifyValue(&UF::AreaTriggerBoundedPlane::ExtentsY), shapeData.Extents.Pos.GetPositionY()); SetUpdateFieldValue(boundedPlane.ModifyValue(&UF::AreaTriggerBoundedPlane::ExtentsZ), shapeData.ExtentsZ);
SetUpdateFieldValue(boundedPlane.ModifyValue(&UF::AreaTriggerBoundedPlane::ExtentsTargetX), shapeData.ExtentsTarget.Pos.GetPositionX()); SetUpdateFieldValue(boundedPlane.ModifyValue(&UF::AreaTriggerBoundedPlane::ExtentsTargetY), shapeData.ExtentsTargetY);
SetUpdateFieldValue(boundedPlane.ModifyValue(&UF::AreaTriggerBoundedPlane::ExtentsTargetY), shapeData.ExtentsTarget.Pos.GetPositionY()); SetUpdateFieldValue(boundedPlane.ModifyValue(&UF::AreaTriggerBoundedPlane::ExtentsTargetZ), shapeData.ExtentsTargetZ);
} }
else else
static_assert(Trinity::dependant_false_v<ShapeType>, "Unsupported shape type"); static_assert(Trinity::dependant_false_v<ShapeType>, "Unsupported shape type");
@@ -1056,16 +1172,15 @@ float AreaTrigger::GetMaxSearchRadius() const
void AreaTrigger::UpdatePolygonVertices() void AreaTrigger::UpdatePolygonVertices()
{ {
UF::AreaTriggerPolygon const* shape = m_areaTriggerData->ShapeData.Get<UF::AreaTriggerPolygon>(); UF::AreaTriggerPolygon const* shape = m_areaTriggerData->ShapeData.Get<UF::AreaTriggerPolygon>();
float newOrientation = GetOrientation();
// No need to recalculate, orientation didn't change // No need to recalculate, orientation didn't change
if (G3D::fuzzyEq(_verticesUpdatePreviousOrientation, newOrientation) && shape->VerticesTarget.empty()) if (_verticesUpdatePreviousRotation == _rotation && shape->VerticesTarget.empty())
return; return;
_polygonVertices.assign(shape->Vertices.begin(), shape->Vertices.end()); _polygonVertices.assign(shape->Vertices.begin(), shape->Vertices.end());
if (!shape->VerticesTarget.empty()) if (!shape->VerticesTarget.empty())
{ {
float progress = GetProgress(); float progress = GetShapeProgress();
if (m_areaTriggerData->MorphCurveId) if (m_areaTriggerData->MorphCurveId)
progress = sDB2Manager.GetCurveValueAt(m_areaTriggerData->MorphCurveId, progress); progress = sDB2Manager.GetCurveValueAt(m_areaTriggerData->MorphCurveId, progress);
@@ -1079,18 +1194,16 @@ void AreaTrigger::UpdatePolygonVertices()
} }
} }
float angleSin = std::sin(newOrientation); G3D::Matrix3 rotationMatrix(G3D::Quat(_rotation.x, _rotation.y, _rotation.z, _rotation.w));
float angleCos = std::cos(newOrientation);
// This is needed to rotate the vertices, following orientation // This is needed to rotate the vertices, following orientation
for (Position& vertice : _polygonVertices) for (Position& vertice : _polygonVertices)
{ {
float x = vertice.GetPositionX() * angleCos - vertice.GetPositionY() * angleSin; G3D::Vector3 transformed = rotationMatrix * PositionToVector3(vertice);
float y = vertice.GetPositionY() * angleCos + vertice.GetPositionX() * angleSin; vertice.Relocate(transformed.x, transformed.y);
vertice.Relocate(x, y);
} }
_verticesUpdatePreviousOrientation = newOrientation; _verticesUpdatePreviousRotation = _rotation;
} }
bool AreaTrigger::HasOverridePosition() const bool AreaTrigger::HasOverridePosition() const
@@ -1214,43 +1327,23 @@ void AreaTrigger::UndoActions(Unit* unit)
void AreaTrigger::UpdatePositionAndRotation() void AreaTrigger::UpdatePositionAndRotation()
{ {
Position oldPosition = GetPosition(); auto [movementUpdateResult, newPosition, newRotation] = CalculateWorldPositionAndRotation();
Position newPosition;
float oldRotation = GetOrientation();
auto [movementUpdateResult, position, rotation] = CalculateLocalPositionAndRotation();
if (HasAreaTriggerFlag(AreaTriggerFieldFlags::Attached)) if (HasAreaTriggerFlag(AreaTriggerFieldFlags::Attached))
{
if (Unit* target = GetTarget()) if (Unit* target = GetTarget())
{
RelocateStationaryPosition(target->GetPosition()); RelocateStationaryPosition(target->GetPosition());
newPosition = target->GetPositionWithOffset(Vector3ToPosition(position)); Position oldPosition = GetPosition();
QuaternionData oldRotation = std::exchange(_rotation, { newRotation.x, newRotation.y, newRotation.z, newRotation.w });
if (!HasAreaTriggerFlag(AreaTriggerFieldFlags::AbsoluteOrientation))
rotation += target->GetOrientation();
if (movementUpdateResult == MovementUpdateResult::None)
movementUpdateResult = MovementUpdateResult::Moved;
}
}
else if (TransportBase const* transport = GetTransport())
{
newPosition = transport->GetPositionWithOffset(Vector3ToPosition(position));
if (!HasAreaTriggerFlag(AreaTriggerFieldFlags::AbsoluteOrientation))
rotation += transport->GetTransportOrientation();
}
else
newPosition = GetMovementOrigin().GetPositionWithOffset(Vector3ToPosition(position));
if (newPosition != oldPosition) if (newPosition != oldPosition)
{ {
GetMap()->AreaTriggerRelocation(this, newPosition.GetPositionX(), newPosition.GetPositionY(), newPosition.GetPositionZ(), rotation); GetMap()->AreaTriggerRelocation(this, newPosition.GetPositionX(), newPosition.GetPositionY(), newPosition.GetPositionZ(), newPosition.GetOrientation());
} }
else if (!G3D::fuzzyEq(rotation, oldRotation)) else
{ {
SetOrientation(rotation); SetOrientation(newPosition.GetOrientation());
if (oldRotation != _rotation)
UpdateShape(); UpdateShape();
} }
@@ -1268,26 +1361,78 @@ void AreaTrigger::UpdatePositionAndRotation()
} }
} }
AreaTrigger::MovementUpdateWorldResult AreaTrigger::CalculateWorldPositionAndRotation() const
{
auto [status, localPosition, localRotation] = CalculateLocalPositionAndRotation();
MovementUpdateWorldResult worldResult {
.Status = status,
.Position = Vector3ToPosition(localPosition),
.Rotation = G3D::Quat::fromYPRAngles(localRotation.z, localRotation.y, localRotation.x)
};
if (HasAreaTriggerFlag(AreaTriggerFieldFlags::Attached))
{
if (Unit* target = GetTarget())
{
worldResult.Position = target->GetPositionWithOffset(worldResult.Position);
if (!HasAreaTriggerFlag(AreaTriggerFieldFlags::AbsoluteOrientation))
worldResult.Rotation = G3D::Quat::fromAxisAngleRotation(G3D::Vector3::unitZ(), target->GetOrientation()) * worldResult.Rotation;
if (worldResult.Status == MovementUpdateResult::None)
worldResult.Status = MovementUpdateResult::Moved;
}
}
else if (TransportBase const* transport = GetTransport())
{
worldResult.Position = transport->GetPositionWithOffset(worldResult.Position);
if (!HasAreaTriggerFlag(AreaTriggerFieldFlags::AbsoluteOrientation))
worldResult.Rotation = G3D::Quat::fromAxisAngleRotation(G3D::Vector3::unitZ(), transport->GetTransportOrientation()) * worldResult.Rotation;
}
else
worldResult.Position = GetMovementOrigin().GetPositionWithOffset(worldResult.Position);
worldResult.Rotation.toYPRAngles(localRotation.z, localRotation.y, localRotation.x);
worldResult.Position.SetOrientation(localRotation.z);
return worldResult;
}
struct AreaTriggerPositionAndRotationCalcVisitor struct AreaTriggerPositionAndRotationCalcVisitor
{ {
AreaTrigger::MovementUpdateResult operator()(UF::AreaTriggerSplineCalculator const&) const { return at->CalculateLocalSplinePositionAndRotation(); } AreaTrigger::MovementUpdateLocalResult operator()(UF::AreaTriggerSplineCalculator const&) const { return at->CalculateLocalSplinePositionAndRotation(); }
AreaTrigger::MovementUpdateResult operator()(UF::AreaTriggerOrbit const& orbit) const { return at->CalculateLocalOrbitPositionAndRotation(orbit); } AreaTrigger::MovementUpdateLocalResult operator()(UF::AreaTriggerOrbit const& orbit) const { return at->CalculateLocalOrbitPositionAndRotation(orbit); }
AreaTrigger::MovementUpdateResult operator()(std::monostate) const { return at->CalculateLocalStationaryPositionAndRotation(); } AreaTrigger::MovementUpdateLocalResult operator()(std::monostate) const { return at->CalculateLocalStationaryPositionAndRotation(); }
AreaTrigger::MovementUpdateResult operator()(UF::AreaTriggerMovementScript const& /*script*/) const { ASSERT(false, "AreaTriggerMovementScript is not implemented"); } AreaTrigger::MovementUpdateLocalResult operator()(UF::AreaTriggerMovementScript const& /*script*/) const { ASSERT(false, "AreaTriggerMovementScript is not implemented"); }
AreaTrigger const* at; AreaTrigger const* at;
}; };
AreaTrigger::MovementUpdateResult AreaTrigger::CalculateLocalPositionAndRotation() const AreaTrigger::MovementUpdateLocalResult AreaTrigger::CalculateLocalPositionAndRotation() const
{ {
MovementUpdateResult result = m_areaTriggerData->PathData.Visit(AreaTriggerPositionAndRotationCalcVisitor{ this }); MovementUpdateLocalResult result = m_areaTriggerData->PathData.Visit(AreaTriggerPositionAndRotationCalcVisitor{ this });
if (m_areaTriggerData->TargetRollPitchYaw.has_value())
{
float progress = GetShapeProgress();
if (m_areaTriggerData->MorphCurveId)
progress = sDB2Manager.GetCurveValueAt(m_areaTriggerData->MorphCurveId, progress);
result.Rotation += PositionToVector3(m_areaTriggerData->RollPitchYaw->Pos)
.lerp(PositionToVector3(m_areaTriggerData->TargetRollPitchYaw->Pos), progress);
}
else
result.Rotation += PositionToVector3(m_areaTriggerData->RollPitchYaw->Pos);
if (HasOverridePosition()) if (HasOverridePosition())
{ {
result.Status = MovementUpdateResult::Moved; result.Status = MovementUpdateResult::Moved;
result.Position.x = GetOverrideCurveValue(*m_areaTriggerData->OverrideMoveCurveX, m_areaTriggerData->TimeToTargetPos);
result.Position.y = GetOverrideCurveValue(*m_areaTriggerData->OverrideMoveCurveY, m_areaTriggerData->TimeToTargetPos); float progress = GetOverridePosProgress();
result.Position.z = GetOverrideCurveValue(*m_areaTriggerData->OverrideMoveCurveZ, m_areaTriggerData->TimeToTargetPos); result.Position.x = GetOverrideCurveValueAtProgress(*m_areaTriggerData->OverrideMoveCurveX, progress);
result.Position.y = GetOverrideCurveValueAtProgress(*m_areaTriggerData->OverrideMoveCurveY, progress);
result.Position.z = GetOverrideCurveValueAtProgress(*m_areaTriggerData->OverrideMoveCurveZ, progress);
if (m_movementInfo.transport.guid.IsEmpty()) if (m_movementInfo.transport.guid.IsEmpty())
result.Position = PositionToVector3(GetMovementOrigin().GetPositionOffsetTo(Vector3ToPosition(result.Position))); result.Position = PositionToVector3(GetMovementOrigin().GetPositionOffsetTo(Vector3ToPosition(result.Position)));
@@ -1411,7 +1556,7 @@ void AreaTrigger::InitOrbit(AreaTriggerOrbitInfo const& orbit, Optional<float> o
SetUpdateFieldValue(pathData.ModifyValue(&UF::AreaTriggerOrbit::Center), center); SetUpdateFieldValue(pathData.ModifyValue(&UF::AreaTriggerOrbit::Center), center);
} }
AreaTrigger::MovementUpdateResult AreaTrigger::CalculateLocalSplinePositionAndRotation() const AreaTrigger::MovementUpdateLocalResult AreaTrigger::CalculateLocalSplinePositionAndRotation() const
{ {
float currentTimePercent = std::clamp(float(GetElapsedTimeForMovement()) / float(GetTimeToTarget()), 0.0f, 1.0f); float currentTimePercent = std::clamp(float(GetElapsedTimeForMovement()) / float(GetTimeToTarget()), 0.0f, 1.0f);
bool reachedDestination = currentTimePercent >= 1.0f; bool reachedDestination = currentTimePercent >= 1.0f;
@@ -1438,8 +1583,7 @@ AreaTrigger::MovementUpdateResult AreaTrigger::CalculateLocalSplinePositionAndRo
float orientation = 0.0f; float orientation = 0.0f;
if (m_areaTriggerData->FacingCurveId) if (m_areaTriggerData->FacingCurveId)
orientation += sDB2Manager.GetCurveValueAt(m_areaTriggerData->FacingCurveId, orientation += sDB2Manager.GetCurveValueAt(m_areaTriggerData->FacingCurveId, GetShapeProgress());
GetOverrideCurveProgress(m_areaTriggerData->OverrideFacingCurve, m_areaTriggerData->TimeToTargetFacing));
if (!HasAreaTriggerFlag(AreaTriggerFieldFlags::AbsoluteOrientation)) if (!HasAreaTriggerFlag(AreaTriggerFieldFlags::AbsoluteOrientation))
{ {
@@ -1449,13 +1593,30 @@ AreaTrigger::MovementUpdateResult AreaTrigger::CalculateLocalSplinePositionAndRo
orientation += std::atan2(derivative.y, derivative.x); orientation += std::atan2(derivative.y, derivative.x);
} }
return { .Status = reachedDestination ? MovementUpdateResult::Arrived : MovementUpdateResult::Moved, .Position = currentPosition, .Rotation = orientation }; return {
.Status = reachedDestination ? MovementUpdateResult::Arrived : MovementUpdateResult::Moved,
.Position = currentPosition,
.Rotation = G3D::Vector3(0.0f, 0.0f, orientation)
};
} }
AreaTrigger::MovementUpdateResult AreaTrigger::CalculateLocalOrbitPositionAndRotation(UF::AreaTriggerOrbit const& orbit) const AreaTrigger::MovementUpdateLocalResult AreaTrigger::CalculateLocalOrbitPositionAndRotation(UF::AreaTriggerOrbit const& orbit) const
{ {
// AreaTrigger make exactly "Duration / TimeToTarget" loops during his life time uint32 movementTime = GetElapsedTimeForMovement();
float pathProgress = float(GetElapsedTimeForMovement() + *orbit.ExtraTimeForBlending) / float(GetTimeToTarget()); uint32 timeToTarget = GetTimeToTarget() + orbit.ExtraTimeForBlending;
bool firstLoop = true;
if (HasAreaTriggerFlag(AreaTriggerFieldFlags::CanLoop) && timeToTarget)
{
// remove ExtraTimeForBlending if not on first loop
if (movementTime > timeToTarget)
{
timeToTarget -= orbit.ExtraTimeForBlending;
movementTime = (movementTime - orbit.ExtraTimeForBlending) % timeToTarget;
firstLoop = false;
}
}
float pathProgress = float(movementTime) / float(timeToTarget);
if (m_areaTriggerData->MoveCurveId) if (m_areaTriggerData->MoveCurveId)
pathProgress = sDB2Manager.GetCurveValueAt(m_areaTriggerData->MoveCurveId, pathProgress); pathProgress = sDB2Manager.GetCurveValueAt(m_areaTriggerData->MoveCurveId, pathProgress);
@@ -1464,30 +1625,31 @@ AreaTrigger::MovementUpdateResult AreaTrigger::CalculateLocalOrbitPositionAndRot
pathProgress = std::min(1.f, pathProgress); pathProgress = std::min(1.f, pathProgress);
float radius = orbit.Radius; float radius = orbit.Radius;
if (pathProgress <= 1.0f && G3D::fuzzyNe(orbit.BlendFromRadius, radius)) if (firstLoop && G3D::fuzzyNe(orbit.BlendFromRadius, radius))
{ {
float blendCurve = (orbit.BlendFromRadius - radius) / radius; float blendCurve = std::clamp((orbit.BlendFromRadius - radius) / radius, 1.0f, 4.0f);
RoundToInterval(blendCurve, 1.f, 4.f); float blendProgress = std::clamp(std::abs(4.0f * pathProgress / blendCurve), 0.0f, 1.0f);
float blendProgress = std::min(1.f, pathProgress / blendCurve * 0.63661975f);
radius = G3D::lerp(orbit.BlendFromRadius, radius, blendProgress); radius = G3D::lerp(orbit.BlendFromRadius, radius, blendProgress);
} }
// Adapt Path progress depending of circle direction float angle = 2.0f * float(M_PI) * pathProgress;
if (!orbit.CounterClockwise)
pathProgress *= -1; // Adapt angle depending of circle direction
if (!orbit.CounterClockwise)
angle *= -1;
angle += orbit.InitialAngle;
float angle = orbit.InitialAngle + 2.f * float(M_PI) * pathProgress;
G3D::Vector3 position = G3D::Vector3 position =
{ {
radius * std::cos(angle), radius * std::cos(angle),
radius * std::sin(angle), radius * std::sin(angle),
*m_areaTriggerData->ZOffset m_areaTriggerData->ZOffset
}; };
float orientation = 0.0f; float orientation = 0.0f;
if (m_areaTriggerData->FacingCurveId) if (m_areaTriggerData->FacingCurveId)
orientation = sDB2Manager.GetCurveValueAt(m_areaTriggerData->FacingCurveId, orientation = sDB2Manager.GetCurveValueAt(m_areaTriggerData->FacingCurveId, GetShapeProgress());
GetOverrideCurveProgress(m_areaTriggerData->OverrideFacingCurve, m_areaTriggerData->TimeToTargetFacing));
if (!HasAreaTriggerFlag(AreaTriggerFieldFlags::AbsoluteOrientation)) if (!HasAreaTriggerFlag(AreaTriggerFieldFlags::AbsoluteOrientation))
{ {
@@ -1495,20 +1657,27 @@ AreaTrigger::MovementUpdateResult AreaTrigger::CalculateLocalOrbitPositionAndRot
orientation += orbit.CounterClockwise ? float(M_PI_4) : -float(M_PI_4); orientation += orbit.CounterClockwise ? float(M_PI_4) : -float(M_PI_4);
} }
return { .Status = MovementUpdateResult::Moved, .Position = position, .Rotation = orientation }; return {
.Status = MovementUpdateResult::Moved,
.Position = position,
.Rotation = G3D::Vector3(0.0f, 0.0f, orientation)
};
} }
AreaTrigger::MovementUpdateResult AreaTrigger::CalculateLocalStationaryPositionAndRotation() const AreaTrigger::MovementUpdateLocalResult AreaTrigger::CalculateLocalStationaryPositionAndRotation() const
{ {
float orientation = 0.0f; float orientation = 0.0f;
if (m_areaTriggerData->FacingCurveId) if (m_areaTriggerData->FacingCurveId)
orientation = sDB2Manager.GetCurveValueAt(m_areaTriggerData->FacingCurveId, orientation = sDB2Manager.GetCurveValueAt(m_areaTriggerData->FacingCurveId, GetShapeProgress());
GetOverrideCurveProgress(m_areaTriggerData->OverrideFacingCurve, m_areaTriggerData->TimeToTargetFacing));
if (!HasAreaTriggerFlag(AreaTriggerFieldFlags::AbsoluteOrientation)) if (!HasAreaTriggerFlag(AreaTriggerFieldFlags::AbsoluteOrientation))
orientation += *m_areaTriggerData->Facing; orientation += *m_areaTriggerData->Facing;
return { .Status = MovementUpdateResult::None, .Position = G3D::Vector3::zero(), .Rotation = orientation }; return {
.Status = MovementUpdateResult::None,
.Position = G3D::Vector3::zero(),
.Rotation = G3D::Vector3(0.0f, 0.0f, orientation)
};
} }
struct AreaTriggerMovementOriginVisitor struct AreaTriggerMovementOriginVisitor
@@ -21,6 +21,7 @@
#include "Object.h" #include "Object.h"
#include "GridObject.h" #include "GridObject.h"
#include "MapObject.h" #include "MapObject.h"
#include "QuaternionData.h"
#include "AreaTriggerTemplate.h" #include "AreaTriggerTemplate.h"
class AuraEffect; class AuraEffect;
@@ -153,9 +154,9 @@ class TC_GAME_API AreaTrigger final : public WorldObject, public GridObject<Area
Optional<uint32> startTimeOffset = {}, CurveInterpolationMode interpolation = CurveInterpolationMode::Linear); Optional<uint32> startTimeOffset = {}, CurveInterpolationMode interpolation = CurveInterpolationMode::Linear);
void ClearOverrideMoveCurve(); void ClearOverrideMoveCurve();
void SetOverrideFacingCurve(float overrideFacing); void SetOverrideShapeCurve(float overrideFacing);
void SetOverrideFacingCurve(std::array<DBCPosition2D, 2> const& points, Optional<uint32> startTimeOffset = {}, CurveInterpolationMode interpolation = CurveInterpolationMode::Linear); void SetOverrideShapeCurve(std::array<DBCPosition2D, 2> const& points, Optional<uint32> startTimeOffset = {}, CurveInterpolationMode interpolation = CurveInterpolationMode::Linear);
void ClearOverrideFacingCurve(); void ClearOverrideShapeCurve();
uint32 GetTimeToTarget() const { return m_areaTriggerData->TimeToTarget; } uint32 GetTimeToTarget() const { return m_areaTriggerData->TimeToTarget; }
void SetTimeToTarget(uint32 timeToTarget) { SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::TimeToTarget), timeToTarget); } void SetTimeToTarget(uint32 timeToTarget) { SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::TimeToTarget), timeToTarget); }
@@ -169,11 +170,14 @@ class TC_GAME_API AreaTrigger final : public WorldObject, public GridObject<Area
uint32 GetTimeToTargetPos() const { return m_areaTriggerData->TimeToTargetPos; } uint32 GetTimeToTargetPos() const { return m_areaTriggerData->TimeToTargetPos; }
void SetTimeToTargetPos(uint32 timeToTargetPos) { SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::TimeToTargetPos), timeToTargetPos); } void SetTimeToTargetPos(uint32 timeToTargetPos) { SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::TimeToTargetPos), timeToTargetPos); }
uint32 GetTimeToTargetFacing() const { return m_areaTriggerData->TimeToTargetFacing; } uint32 GetTimeToTargetFacing() const { return m_areaTriggerData->TimeToTargetShape; }
void SetTimeToTargetFacing(uint32 timeToTargetFacing) { SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::TimeToTargetFacing), timeToTargetFacing); } void SetTimeToTargetFacing(uint32 timeToTargetShape) { SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::TimeToTargetShape), timeToTargetShape); }
void SetSpellVisual(SpellCastVisual const& visual); void SetSpellVisual(SpellCastVisual const& visual);
void SetRollPitchYaw(float roll, float pitch, float yaw,
Optional<float> targetRoll = {}, Optional<float> targetPitch = {}, Optional<float> targetYaw = {});
int32 GetDuration() const { return _duration; } int32 GetDuration() const { return _duration; }
int32 GetTotalDuration() const { return _totalDuration; } int32 GetTotalDuration() const { return _totalDuration; }
void SetDuration(int32 newDuration); void SetDuration(int32 newDuration);
@@ -218,7 +222,10 @@ class TC_GAME_API AreaTrigger final : public WorldObject, public GridObject<Area
protected: protected:
void _UpdateDuration(int32 newDuration); void _UpdateDuration(int32 newDuration);
float GetProgress() const; float GetScaleProgress() const { return GetOverrideCurveProgress(m_areaTriggerData->OverrideScaleCurve, m_areaTriggerData->TimeToTargetScale); }
float GetExtraScaleProgress() const { return GetOverrideCurveProgress(m_areaTriggerData->ExtraScaleCurve, m_areaTriggerData->TimeToTargetExtraScale); }
float GetOverridePosProgress() const { return GetOverrideCurveProgress(m_areaTriggerData->OverrideMoveCurveX, m_areaTriggerData->TimeToTargetPos); }
float GetShapeProgress() const { return GetOverrideCurveProgress(m_areaTriggerData->OverrideShapeCurve, m_areaTriggerData->TimeToTargetShape); }
struct OverrideCurveData struct OverrideCurveData
{ {
@@ -254,14 +261,16 @@ class TC_GAME_API AreaTrigger final : public WorldObject, public GridObject<Area
void UpdatePositionAndRotation(); void UpdatePositionAndRotation();
struct MovementUpdateResult; struct MovementUpdateWorldResult;
MovementUpdateWorldResult CalculateWorldPositionAndRotation() const;
MovementUpdateResult CalculateLocalPositionAndRotation() const; struct MovementUpdateLocalResult;
MovementUpdateLocalResult CalculateLocalPositionAndRotation() const;
friend struct AreaTriggerPositionAndRotationCalcVisitor; friend struct AreaTriggerPositionAndRotationCalcVisitor;
MovementUpdateResult CalculateLocalSplinePositionAndRotation() const; MovementUpdateLocalResult CalculateLocalSplinePositionAndRotation() const;
MovementUpdateResult CalculateLocalOrbitPositionAndRotation(UF::AreaTriggerOrbit const& orbit) const; MovementUpdateLocalResult CalculateLocalOrbitPositionAndRotation(UF::AreaTriggerOrbit const& orbit) const;
MovementUpdateResult CalculateLocalStationaryPositionAndRotation() const; MovementUpdateLocalResult CalculateLocalStationaryPositionAndRotation() const;
Position const& GetMovementOrigin() const; Position const& GetMovementOrigin() const;
@@ -279,9 +288,10 @@ class TC_GAME_API AreaTrigger final : public WorldObject, public GridObject<Area
AuraEffect const* _aurEff; AuraEffect const* _aurEff;
Position _stationaryPosition; Position _stationaryPosition;
QuaternionData _rotation;
int32 _duration; int32 _duration;
int32 _totalDuration; int32 _totalDuration;
float _verticesUpdatePreviousOrientation; QuaternionData _verticesUpdatePreviousRotation;
bool _isRemoved; bool _isRemoved;
std::vector<Position> _polygonVertices; std::vector<Position> _polygonVertices;
@@ -83,13 +83,13 @@ bool AreaTriggerShapeInfo::Disk::IsDynamic() const
float AreaTriggerShapeInfo::BoundedPlane::GetMaxSearchRadius() const float AreaTriggerShapeInfo::BoundedPlane::GetMaxSearchRadius() const
{ {
return std::sqrt(std::max( return std::sqrt(std::max(
Extents.Pos.GetPositionX() * Extents.Pos.GetPositionX() / 4 + Extents.Pos.GetPositionY() * Extents.Pos.GetPositionY() / 4, ExtentsY * ExtentsY + ExtentsZ * ExtentsZ,
ExtentsTarget.Pos.GetPositionX() * ExtentsTarget.Pos.GetPositionX() / 4 + ExtentsTarget.Pos.GetPositionY() * ExtentsTarget.Pos.GetPositionY() / 4)); ExtentsTargetY * ExtentsTargetY + ExtentsTargetZ * ExtentsTargetZ));
} }
bool AreaTriggerShapeInfo::BoundedPlane::IsDynamic() const bool AreaTriggerShapeInfo::BoundedPlane::IsDynamic() const
{ {
return Extents != ExtentsTarget; return ExtentsY != ExtentsTargetY || ExtentsZ != ExtentsTargetZ;
} }
float AreaTriggerShapeInfo::GetMaxSearchRadius() const float AreaTriggerShapeInfo::GetMaxSearchRadius() const
@@ -181,13 +181,14 @@ struct AreaTriggerShapeInfo
struct BoundedPlane struct BoundedPlane
{ {
BoundedPlane() BoundedPlane() = default;
: Extents(), ExtentsTarget() { }
explicit BoundedPlane(std::array<float, MAX_AREATRIGGER_ENTITY_DATA> const& raw) explicit BoundedPlane(std::array<float, MAX_AREATRIGGER_ENTITY_DATA> const& raw)
: Extents(raw[0], raw[1]), ExtentsTarget(raw[2], raw[3]) { } : ExtentsY(raw[0]), ExtentsZ(raw[1]), ExtentsTargetY(raw[2]), ExtentsTargetZ(raw[3]) { }
TaggedPosition<Position::XY> Extents; float ExtentsY = 0.0f;
TaggedPosition<Position::XY> ExtentsTarget; float ExtentsZ = 0.0f;
float ExtentsTargetY = 0.0f;
float ExtentsTargetZ = 0.0f;
float GetMaxSearchRadius() const; float GetMaxSearchRadius() const;
bool IsDynamic() const; bool IsDynamic() const;
@@ -8248,10 +8248,10 @@ namespace UF
void AreaTriggerBoundedPlane::WriteCreate(ByteBuffer& data, Player const* receiver, AreaTrigger const* owner) const void AreaTriggerBoundedPlane::WriteCreate(ByteBuffer& data, Player const* receiver, AreaTrigger const* owner) const
{ {
data << float(ExtentsX);
data << float(ExtentsY); data << float(ExtentsY);
data << float(ExtentsTargetX); data << float(ExtentsZ);
data << float(ExtentsTargetY); data << float(ExtentsTargetY);
data << float(ExtentsTargetZ);
} }
void AreaTriggerBoundedPlane::WriteUpdate(bool ignoreChangesMask, ByteBuffer& data, Player const* receiver, AreaTrigger const* owner) const void AreaTriggerBoundedPlane::WriteUpdate(bool ignoreChangesMask, ByteBuffer& data, Player const* receiver, AreaTrigger const* owner) const
@@ -8267,29 +8267,29 @@ namespace UF
{ {
if (changesMask[1]) if (changesMask[1])
{ {
data << float(ExtentsX); data << float(ExtentsY);
} }
if (changesMask[2]) if (changesMask[2])
{ {
data << float(ExtentsY); data << float(ExtentsZ);
} }
if (changesMask[3]) if (changesMask[3])
{ {
data << float(ExtentsTargetX); data << float(ExtentsTargetY);
} }
if (changesMask[4]) if (changesMask[4])
{ {
data << float(ExtentsTargetY); data << float(ExtentsTargetZ);
} }
} }
} }
void AreaTriggerBoundedPlane::ClearChangesMask() void AreaTriggerBoundedPlane::ClearChangesMask()
{ {
Base::ClearChangesMask(ExtentsX);
Base::ClearChangesMask(ExtentsY); Base::ClearChangesMask(ExtentsY);
Base::ClearChangesMask(ExtentsTargetX); Base::ClearChangesMask(ExtentsZ);
Base::ClearChangesMask(ExtentsTargetY); Base::ClearChangesMask(ExtentsTargetY);
Base::ClearChangesMask(ExtentsTargetZ);
_changesMask.ResetAll(); _changesMask.ResetAll();
} }
@@ -8300,14 +8300,14 @@ namespace UF
OverrideMoveCurveX->WriteCreate(data, receiver, owner); OverrideMoveCurveX->WriteCreate(data, receiver, owner);
OverrideMoveCurveY->WriteCreate(data, receiver, owner); OverrideMoveCurveY->WriteCreate(data, receiver, owner);
OverrideMoveCurveZ->WriteCreate(data, receiver, owner); OverrideMoveCurveZ->WriteCreate(data, receiver, owner);
OverrideFacingCurve->WriteCreate(data, receiver, owner); OverrideShapeCurve->WriteCreate(data, receiver, owner);
data << *Caster; data << *Caster;
data << uint32(Duration); data << uint32(Duration);
data << uint32(TimeToTarget); data << uint32(TimeToTarget);
data << uint32(TimeToTargetScale); data << uint32(TimeToTargetScale);
data << uint32(TimeToTargetExtraScale); data << uint32(TimeToTargetExtraScale);
data << uint32(TimeToTargetPos); data << uint32(TimeToTargetPos);
data << uint32(TimeToTargetFacing); data << uint32(TimeToTargetShape);
data << int32(SpellID); data << int32(SpellID);
data << int32(SpellForVisuals); data << int32(SpellForVisuals);
SpellVisual->WriteCreate(data, receiver, owner); SpellVisual->WriteCreate(data, receiver, owner);
@@ -8414,7 +8414,7 @@ namespace UF
} }
if (changesMask[6]) if (changesMask[6])
{ {
OverrideFacingCurve->WriteUpdate(ignoreNestedChangesMask, data, receiver, owner); OverrideShapeCurve->WriteUpdate(ignoreNestedChangesMask, data, receiver, owner);
} }
if (changesMask[7]) if (changesMask[7])
{ {
@@ -8442,7 +8442,7 @@ namespace UF
} }
if (changesMask[13]) if (changesMask[13])
{ {
data << uint32(TimeToTargetFacing); data << uint32(TimeToTargetShape);
} }
if (changesMask[14]) if (changesMask[14])
{ {
@@ -8616,14 +8616,14 @@ namespace UF
Base::ClearChangesMask(OverrideMoveCurveX); Base::ClearChangesMask(OverrideMoveCurveX);
Base::ClearChangesMask(OverrideMoveCurveY); Base::ClearChangesMask(OverrideMoveCurveY);
Base::ClearChangesMask(OverrideMoveCurveZ); Base::ClearChangesMask(OverrideMoveCurveZ);
Base::ClearChangesMask(OverrideFacingCurve); Base::ClearChangesMask(OverrideShapeCurve);
Base::ClearChangesMask(Caster); Base::ClearChangesMask(Caster);
Base::ClearChangesMask(Duration); Base::ClearChangesMask(Duration);
Base::ClearChangesMask(TimeToTarget); Base::ClearChangesMask(TimeToTarget);
Base::ClearChangesMask(TimeToTargetScale); Base::ClearChangesMask(TimeToTargetScale);
Base::ClearChangesMask(TimeToTargetExtraScale); Base::ClearChangesMask(TimeToTargetExtraScale);
Base::ClearChangesMask(TimeToTargetPos); Base::ClearChangesMask(TimeToTargetPos);
Base::ClearChangesMask(TimeToTargetFacing); Base::ClearChangesMask(TimeToTargetShape);
Base::ClearChangesMask(SpellID); Base::ClearChangesMask(SpellID);
Base::ClearChangesMask(SpellForVisuals); Base::ClearChangesMask(SpellForVisuals);
Base::ClearChangesMask(SpellVisual); Base::ClearChangesMask(SpellVisual);
@@ -1751,10 +1751,10 @@ namespace UF
struct AreaTriggerBoundedPlane : public IsUpdateFieldStructureTag, public HasChangesMask<5> struct AreaTriggerBoundedPlane : public IsUpdateFieldStructureTag, public HasChangesMask<5>
{ {
UpdateField<float, 0, 1> ExtentsX; UpdateField<float, 0, 1> ExtentsY;
UpdateField<float, 0, 2> ExtentsY; UpdateField<float, 0, 2> ExtentsZ;
UpdateField<float, 0, 3> ExtentsTargetX; UpdateField<float, 0, 3> ExtentsTargetY;
UpdateField<float, 0, 4> ExtentsTargetY; UpdateField<float, 0, 4> ExtentsTargetZ;
using OwnerObject = AreaTrigger; using OwnerObject = AreaTrigger;
void WriteCreate(ByteBuffer& data, Player const* receiver, AreaTrigger const* owner) const; void WriteCreate(ByteBuffer& data, Player const* receiver, AreaTrigger const* owner) const;
@@ -1769,14 +1769,14 @@ namespace UF
UpdateField<UF::OverrideCurve, 0, 3> OverrideMoveCurveX; UpdateField<UF::OverrideCurve, 0, 3> OverrideMoveCurveX;
UpdateField<UF::OverrideCurve, 0, 4> OverrideMoveCurveY; UpdateField<UF::OverrideCurve, 0, 4> OverrideMoveCurveY;
UpdateField<UF::OverrideCurve, 0, 5> OverrideMoveCurveZ; UpdateField<UF::OverrideCurve, 0, 5> OverrideMoveCurveZ;
UpdateField<UF::OverrideCurve, 0, 6> OverrideFacingCurve; UpdateField<UF::OverrideCurve, 0, 6> OverrideShapeCurve;
UpdateField<ObjectGuid, 0, 7> Caster; UpdateField<ObjectGuid, 0, 7> Caster;
UpdateField<uint32, 0, 8> Duration; UpdateField<uint32, 0, 8> Duration;
UpdateField<uint32, 0, 9> TimeToTarget; UpdateField<uint32, 0, 9> TimeToTarget;
UpdateField<uint32, 0, 10> TimeToTargetScale; UpdateField<uint32, 0, 10> TimeToTargetScale;
UpdateField<uint32, 0, 11> TimeToTargetExtraScale; UpdateField<uint32, 0, 11> TimeToTargetExtraScale;
UpdateField<uint32, 0, 12> TimeToTargetPos; // Linked to m_overrideMoveCurve UpdateField<uint32, 0, 12> TimeToTargetPos; // Linked to m_overrideMoveCurve
UpdateField<uint32, 0, 13> TimeToTargetFacing; // Linked to m_overrideFacingCurve UpdateField<uint32, 0, 13> TimeToTargetShape; // Linked to m_overrideShapeCurve
UpdateField<int32, 0, 14> SpellID; UpdateField<int32, 0, 14> SpellID;
UpdateField<int32, 0, 15> SpellForVisuals; UpdateField<int32, 0, 15> SpellForVisuals;
UpdateField<UF::SpellCastVisual, 0, 16> SpellVisual; UpdateField<UF::SpellCastVisual, 0, 16> SpellVisual;
@@ -548,7 +548,7 @@ struct at_ymiron_the_fallen_king_bane : AreaTriggerAI
return; return;
float radius = at->GetExactDist(caster); float radius = at->GetExactDist(caster);
float angle = at->GetOrientation(); float angle = caster->GetAbsoluteAngle(at);
AreaTriggerOrbitInfo orbitInfo; AreaTriggerOrbitInfo orbitInfo;
orbitInfo.CounterClockwise = false; orbitInfo.CounterClockwise = false;