diff --git a/data/sql/updates/pending_db_world/rev_1625408455420649354.sql b/data/sql/updates/pending_db_world/rev_1625408455420649354.sql
new file mode 100644
index 000000000..443001ce5
--- /dev/null
+++ b/data/sql/updates/pending_db_world/rev_1625408455420649354.sql
@@ -0,0 +1,76 @@
+INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1625408455420649354');
+
+-- Artorius the Amiable
+SET @ARTORIUS_WPID := 4230100;
+
+INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES
+(@ARTORIUS_WPID,1,7909.71,-4598.67,710.008,0,0,0,0,100,0),
+(@ARTORIUS_WPID,2,7934.25,-4580.27,712.914,0,0,0,0,100,0),
+(@ARTORIUS_WPID,3,7951.73,-4563.34,715.987,0,0,0,0,100,0),
+(@ARTORIUS_WPID,4,7959.83,-4516.89,706.184,0,0,0,0,100,0),
+(@ARTORIUS_WPID,5,7951.14,-4478.79,712.931,0,0,0,0,100,0),
+(@ARTORIUS_WPID,6,7926.2,-4464.49,710.084,0,0,0,0,100,0),
+(@ARTORIUS_WPID,7,7908.85,-4439.49,705.869,0,0,0,0,100,0),
+(@ARTORIUS_WPID,8,7893.66,-4403.93,703.423,0,0,0,0,100,0),
+(@ARTORIUS_WPID,9,7888.36,-4391.52,701.7,0,0,0,0,100,0),
+(@ARTORIUS_WPID,10,7881.92,-4376.5,698.441,0,0,0,0,100,0),
+(@ARTORIUS_WPID,11,7873.08,-4371.23,698.733,0,0,0,0,100,0),
+(@ARTORIUS_WPID,12,7850.84,-4359.52,699.886,0,0,0,0,100,0),
+(@ARTORIUS_WPID,13,7831.77,-4378.83,690.036,0,0,0,0,100,0),
+(@ARTORIUS_WPID,14,7830.91,-4405.68,680.437,0,0,0,0,100,0),
+(@ARTORIUS_WPID,15,7836.71,-4419.45,676.768,0,0,0,0,100,0),
+(@ARTORIUS_WPID,16,7818.71,-4440.08,668.523,0,0,0,0,100,0),
+(@ARTORIUS_WPID,17,7718.32,-4463.39,639.431,0,0,0,0,100,0),
+(@ARTORIUS_WPID,18,7687.59,-4464.45,632.542,0,0,0,0,100,0),
+(@ARTORIUS_WPID,19,7628.2,-4459.5,617.491,0,0,0,0,100,0),
+(@ARTORIUS_WPID,20,7614.45,-4457.25,613.87,0,0,0,0,100,0),
+(@ARTORIUS_WPID,21,7589.69,-4449.63,608.208,0,0,0,0,100,0),
+(@ARTORIUS_WPID,22,7559.67,-4464.89,605.417,0,0,0,0,100,0),
+(@ARTORIUS_WPID,23,7562.68,-4511.61,607.263,0,0,0,0,100,0),
+(@ARTORIUS_WPID,24,7600.13,-4535.22,625.163,0,0,0,0,100,0),
+(@ARTORIUS_WPID,25,7607.41,-4567.44,634.095,0,0,0,0,100,0),
+(@ARTORIUS_WPID,26,7632.49,-4565.44,642.315,0,0,0,0,100,0),
+(@ARTORIUS_WPID,27,7641.09,-4570.59,647.803,0,0,0,0,100,0),
+(@ARTORIUS_WPID,28,7651.98,-4575.47,656.282,0,0,0,0,100,0),
+(@ARTORIUS_WPID,29,7654.18,-4576.26,658.338,0,0,0,0,100,0),
+(@ARTORIUS_WPID,30,7668.75,-4585.71,668.173,0,0,0,0,100,0),
+(@ARTORIUS_WPID,31,7683.88,-4603.07,677.795,0,0,0,0,100,0),
+(@ARTORIUS_WPID,32,7702.21,-4622.01,696.909,0,0,0,0,100,0),
+(@ARTORIUS_WPID,33,7711.36,-4625.5,701.57,0,0,0,0,100,0),
+(@ARTORIUS_WPID,34,7731.22,-4639.03,705.861,0,0,0,0,100,0),
+(@ARTORIUS_WPID,35,7733.53,-4640.61,706.981,0,0,0,0,100,0),
+(@ARTORIUS_WPID,36,7735.64,-4641.46,707.987,0,0,0,0,100,0),
+(@ARTORIUS_WPID,37,7750.55,-4639.44,708.368,0,0,0,0,100,0),
+(@ARTORIUS_WPID,38,7767.45,-4640.24,706.967,0,0,0,0,100,0),
+(@ARTORIUS_WPID,39,7809.5,-4629.89,703.353,0,0,0,0,100,0),
+(@ARTORIUS_WPID,40,7834.76,-4631.76,709.151,0,0,0,0,100,0),
+(@ARTORIUS_WPID,41,7848.44,-4638.85,714.236,0,0,0,0,100,0),
+(@ARTORIUS_WPID,42,7860.56,-4635.37,714.247,0,0,0,0,100,0),
+(@ARTORIUS_WPID,43,7869.19,-4632.91,714.093,0,0,0,0,100,0),
+(@ARTORIUS_WPID,44,7907.84,-4600.24,709.876,0,0,0,0,100,0);
+
+SET @ARTORIUS_ENTRY := 14531;
+SET @ARTORIUS_GUID := 42301;
+
+-- Set MovementType and path_id
+UPDATE `creature` SET `MovementType` = 2 WHERE (`id` = @ARTORIUS_ENTRY) AND (`guid` = @ARTORIUS_GUID);
+UPDATE `creature_addon` SET `path_id` = @ARTORIUS_WPID WHERE (`guid` = @ARTORIUS_GUID);
+
+-- Allow player interaction, remove the quest item from the humanoid form, set Movement Type and change the Script Name
+UPDATE `creature_template`
+SET `npcflag` = 1,
+ `unit_flags2` = 18432,
+ `lootid` = 0,
+ `MovementType` = 2,
+ `ScriptName` = 'npc_artorius'
+WHERE (`entry` = @ARTORIUS_ENTRY);
+
+-- Delete the unused loot_template
+DELETE FROM `creature_loot_template` WHERE `Entry` = @ARTORIUS_ENTRY;
+
+-- Add creature text for gossip option
+INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `comment`) VALUES
+(@ARTORIUS_ENTRY, 0, 0, "I know you as Artorius the Doombringer. Show yourself, demon! Face me!", 0, 0, 0, 0, 0, 0, 9751, "Artorius the Amiable");
+
+-- Correct Artorius evil entry speed_walk
+UPDATE `creature_template` SET `speed_walk` = 1 WHERE (`entry` = 14535);
diff --git a/data/sql/updates/pending_db_world/rev_1626440153363170757.sql b/data/sql/updates/pending_db_world/rev_1626440153363170757.sql
new file mode 100644
index 000000000..1bd1c44c3
--- /dev/null
+++ b/data/sql/updates/pending_db_world/rev_1626440153363170757.sql
@@ -0,0 +1,408 @@
+INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1626440153363170757');
+
+-- -- Simone the Inconspicuous
+SET @SIMONE_WPID := 2443900;
+
+INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
+(@SIMONE_WPID,1,-7135.38,-632.426,-267.289,0,0,0,0,100,0),
+(@SIMONE_WPID,2,-7123.46,-632.183,-270.63,0,0,0,0,100,0),
+(@SIMONE_WPID,3,-7111.61,-632.079,-272.327,0,0,0,0,100,0),
+(@SIMONE_WPID,4,-7102.19,-625.129,-270.782,0,0,0,0,100,0),
+(@SIMONE_WPID,5,-7093.09,-618.408,-271.013,0,0,0,0,100,0),
+(@SIMONE_WPID,6,-7083.48,-611.314,-270.053,0,0,0,0,100,0),
+(@SIMONE_WPID,7,-7073.85,-604.336,-270.318,0,0,0,0,100,0),
+(@SIMONE_WPID,8,-7064.50,-611.130,-271.627,0,0,0,0,100,0),
+(@SIMONE_WPID,9,-7055.15,-617.920,-271.757,0,0,0,0,100,0),
+(@SIMONE_WPID,10,-7045.73,-624.768,-272.084,0,0,0,0,100,0),
+(@SIMONE_WPID,11,-7036.41,-631.543,-271.606,0,0,0,0,100,0),
+(@SIMONE_WPID,12,-7028.90,-637.001,-271.888,0,0,0,0,100,0),
+(@SIMONE_WPID,13,-7021.6,-642.837,-272.155,0,0,0,0,100,0),
+(@SIMONE_WPID,14,-7015.69,-652.915,-272.221,0,0,0,0,100,0),
+(@SIMONE_WPID,15,-7009.78,-662.996,-272.221,0,0,0,0,100,0),
+(@SIMONE_WPID,16,-7003.90,-673.045,-272.215,0,0,0,0,100,0),
+(@SIMONE_WPID,17,-6999.91,-679.855,-271.857,0,0,0,0,100,0),
+(@SIMONE_WPID,18,-6994.73,-688.690,-270.518,0,0,0,0,100,0),
+(@SIMONE_WPID,19,-6989.87,-698.109,-269.301,0,0,0,0,100,0),
+(@SIMONE_WPID,20,-6987.37,-709.513,-268.536,0,0,0,0,100,0),
+(@SIMONE_WPID,21,-6984.88,-720.872,-267.025,0,0,0,0,100,0),
+(@SIMONE_WPID,22,-6982.18,-733.157,-265.618,0,0,0,0,100,0),
+(@SIMONE_WPID,23,-6979.9,-745.278,-265.937,0,0,0,0,100,0),
+(@SIMONE_WPID,24,-6984.47,-759.746,-267.759,0,0,0,0,100,0),
+(@SIMONE_WPID,25,-6989.49,-774.052,-269.931,0,0,0,0,100,0),
+(@SIMONE_WPID,26,-6996.69,-783.043,-272.410,0,0,0,0,100,0),
+(@SIMONE_WPID,27,-7003.04,-790.963,-273.025,0,0,0,0,100,0),
+(@SIMONE_WPID,28,-7009.76,-799.344,-272.041,0,0,0,0,100,0),
+(@SIMONE_WPID,29,-7016.69,-807.647,-271.597,0,0,0,0,100,0),
+(@SIMONE_WPID,30,-7027.44,-809.139,-272.117,0,0,0,0,100,0),
+(@SIMONE_WPID,31,-7037.96,-810.598,-271.845,0,0,0,0,100,0),
+(@SIMONE_WPID,32,-7048.82,-812.106,-271.697,0,0,0,0,100,0),
+(@SIMONE_WPID,33,-7059.61,-813.457,-271.303,0,0,0,0,100,0),
+(@SIMONE_WPID,34,-7063.79,-824.968,-271.531,0,0,0,0,100,0),
+(@SIMONE_WPID,35,-7067.83,-836.058,-272.202,0,0,0,0,100,0),
+(@SIMONE_WPID,36,-7072.05,-847.054,-272.178,0,0,0,0,100,0),
+(@SIMONE_WPID,37,-7083.01,-857.189,-272.220,0,0,0,0,100,0),
+(@SIMONE_WPID,38,-7093.29,-866.690,-272.204,0,0,0,0,100,0),
+(@SIMONE_WPID,39,-7102.90,-875.574,-271.450,0,0,0,0,100,0),
+(@SIMONE_WPID,40,-7112.65,-884.181,-271.47,0,0,0,0,100,0),
+(@SIMONE_WPID,41,-7131.26,-888.674,-272.03,0,0,0,0,100,0),
+(@SIMONE_WPID,42,-7149.97,-892.875,-271.069,0,0,0,0,100,0),
+(@SIMONE_WPID,43,-7164.34,-890.150,-271.235,0,0,0,0,100,0),
+(@SIMONE_WPID,44,-7179.54,-887.271,-272.052,0,0,0,0,100,0),
+(@SIMONE_WPID,45,-7195.90,-884.171,-271.957,0,0,0,0,100,0),
+(@SIMONE_WPID,46,-7212.15,-880.771,-271.128,0,0,0,0,100,0),
+(@SIMONE_WPID,47,-7224.42,-889.063,-272.044,0,0,0,0,100,0),
+(@SIMONE_WPID,48,-7236.21,-897.030,-271.225,0,0,0,0,100,0),
+(@SIMONE_WPID,49,-7248.12,-904.753,-272.24,0,0,0,0,100,0),
+(@SIMONE_WPID,50,-7262.07,-911.279,-271.53,0,0,0,0,100,0),
+(@SIMONE_WPID,51,-7274.82,-917.243,-271.10,0,0,0,0,100,0),
+(@SIMONE_WPID,52,-7287.81,-923.019,-269.745,0,0,0,0,100,0),
+(@SIMONE_WPID,53,-7304.25,-925.122,-270.666,0,0,0,0,100,0),
+(@SIMONE_WPID,54,-7320.84,-926.977,-270.566,0,0,0,0,100,0),
+(@SIMONE_WPID,55,-7332.81,-937.077,-268.705,0,0,0,0,100,0),
+(@SIMONE_WPID,56,-7344.05,-946.554,-269.778,0,0,0,0,100,0),
+(@SIMONE_WPID,57,-7355.48,-955.622,-271.426,0,0,0,0,100,0),
+(@SIMONE_WPID,58,-7363.46,-971.058,-271.653,0,0,0,0,100,0),
+(@SIMONE_WPID,59,-7370.96,-985.551,-270.788,0,0,0,0,100,0),
+(@SIMONE_WPID,60,-7379.42,-1001.29,-271.409,0,0,0,0,100,0),
+(@SIMONE_WPID,61,-7382.82,-1016.07,-271.634,0,0,0,0,100,0),
+(@SIMONE_WPID,62,-7386.35,-1030.34,-271.884,0,0,0,0,100,0),
+(@SIMONE_WPID,63,-7396.97,-1042.43,-271.297,0,0,0,0,100,0),
+(@SIMONE_WPID,64,-7407.61,-1054.53,-270.546,0,0,0,0,100,0),
+(@SIMONE_WPID,65,-7418.18,-1066.56,-270.011,0,0,0,0,100,0),
+(@SIMONE_WPID,66,-7428.43,-1078.22,-269.067,0,0,0,0,100,0),
+(@SIMONE_WPID,67,-7439.16,-1089.87,-270.483,0,0,0,0,100,0),
+(@SIMONE_WPID,68,-7448.63,-1101.55,-271.191,0,0,0,0,100,0),
+(@SIMONE_WPID,69,-7458.12,-1113.23,-271.741,0,0,0,0,100,0),
+(@SIMONE_WPID,70,-7467.71,-1125.05,-271.785,0,0,0,0,100,0),
+(@SIMONE_WPID,71,-7477.41,-1137.00,-272.383,0,0,0,0,100,0),
+(@SIMONE_WPID,72,-7486.49,-1148.19,-271.035,0,0,0,0,100,0),
+(@SIMONE_WPID,73,-7495.84,-1159.14,-269.334,0,0,0,0,100,0),
+(@SIMONE_WPID,74,-7505.72,-1168.37,-271.077,0,0,0,0,100,0),
+(@SIMONE_WPID,75,-7516.62,-1178.08,-271.383,0,0,0,0,100,0),
+(@SIMONE_WPID,76,-7513.66,-1192.83,-269.189,0,0,0,0,100,0),
+(@SIMONE_WPID,77,-7510.67,-1207.70,-268.987,0,0,0,0,100,0),
+(@SIMONE_WPID,78,-7507.72,-1222.45,-269.740,0,0,0,0,100,0),
+(@SIMONE_WPID,79,-7504.78,-1237.10,-269.414,0,0,0,0,100,0),
+(@SIMONE_WPID,80,-7502.42,-1252.06,-269.497,0,0,0,0,100,0),
+(@SIMONE_WPID,81,-7508.60,-1268.31,-270.367,0,0,0,0,100,0),
+(@SIMONE_WPID,82,-7515.1,-1284.46,-271.69,0,0,0,0,100,0),
+(@SIMONE_WPID,83,-7525.54,-1295.88,-272.203,0,0,0,0,100,0),
+(@SIMONE_WPID,84,-7536.01,-1307.33,-271.797,0,0,0,0,100,0),
+(@SIMONE_WPID,85,-7546.40,-1318.69,-271.423,0,0,0,0,100,0),
+(@SIMONE_WPID,86,-7557.08,-1330.10,-271.315,0,0,0,0,100,0),
+(@SIMONE_WPID,87,-7567.9,-1341.3,-271.944,0,0,0,0,100,0),
+(@SIMONE_WPID,88,-7580.95,-1348.04,-272.221,0,0,0,0,100,0),
+(@SIMONE_WPID,89,-7593.97,-1354.76,-272.221,0,0,0,0,100,0),
+(@SIMONE_WPID,90,-7607.09,-1361.54,-272.221,0,0,0,0,100,0),
+(@SIMONE_WPID,91,-7620.15,-1368.28,-271.951,0,0,0,0,100,0),
+(@SIMONE_WPID,92,-7633.01,-1374.92,-270.888,0,0,0,0,100,0),
+(@SIMONE_WPID,93,-7646.1,-1381.3,-269.631,0,0,0,0,100,0),
+(@SIMONE_WPID,94,-7656.14,-1389.83,-269.454,0,0,0,0,100,0),
+(@SIMONE_WPID,95,-7666.01,-1398.22,-270.739,0,0,0,0,100,0),
+(@SIMONE_WPID,96,-7676.36,-1406.48,-270.633,0,0,0,0,100,0),
+(@SIMONE_WPID,97,-7692.53,-1413.05,-269.726,0,0,0,0,100,0),
+(@SIMONE_WPID,98,-7708.69,-1419.4,-269.638,0,0,0,0,100,0),
+(@SIMONE_WPID,99,-7724.40,-1420.53,-271.224,0,0,0,0,100,0),
+(@SIMONE_WPID,100,-7740.18,-1421.67,-271.859,0,0,0,0,100,0),
+(@SIMONE_WPID,101,-7755.93,-1422.77,-272.221,0,0,0,0,100,0),
+(@SIMONE_WPID,102,-7771.74,-1423.79,-272.130,0,0,0,0,100,0),
+(@SIMONE_WPID,103,-7787.49,-1424.71,-270.971,0,0,0,0,100,0),
+(@SIMONE_WPID,104,-7798.61,-1412.12,-271.319,0,0,0,0,100,0),
+(@SIMONE_WPID,105,-7809.72,-1399.56,-270.861,0,0,0,0,100,0),
+(@SIMONE_WPID,106,-7821.00,-1386.80,-271.654,0,0,0,0,100,0),
+(@SIMONE_WPID,107,-7832.38,-1374.35,-272.021,0,0,0,0,100,0),
+(@SIMONE_WPID,108,-7845.21,-1366.23,-272.197,0,0,0,0,100,0),
+(@SIMONE_WPID,109,-7858.07,-1357.97,-272.209,0,0,0,0,100,0),
+(@SIMONE_WPID,110,-7860.70,-1341.49,-273.100,0,0,0,0,100,0),
+(@SIMONE_WPID,111,-7863.34,-1324.98,-273.682,0,0,0,0,100,0),
+(@SIMONE_WPID,112,-7865.98,-1308.50,-273.433,0,0,0,0,100,0),
+(@SIMONE_WPID,113,-7868.57,-1291.81,-272.151,0,0,0,0,100,0),
+(@SIMONE_WPID,114,-7872.47,-1273.80,-270.707,0,0,0,0,100,0),
+(@SIMONE_WPID,115,-7876.33,-1255.73,-270.227,0,0,0,0,100,0),
+(@SIMONE_WPID,116,-7887.35,-1249.17,-270.749,0,0,0,0,100,0),
+(@SIMONE_WPID,117,-7898.39,-1242.60,-269.129,0,0,0,0,100,0),
+(@SIMONE_WPID,118,-7909.28,-1236.23,-268.122,0,0,0,0,100,0),
+(@SIMONE_WPID,119,-7925.09,-1237.18,-268.189,0,0,0,0,100,0),
+(@SIMONE_WPID,120,-7940.84,-1238.14,-271.266,0,0,0,0,100,0),
+(@SIMONE_WPID,121,-7956.59,-1239.09,-275.543,0,0,0,0,100,0),
+(@SIMONE_WPID,122,-7972.21,-1240.03,-272.528,0,0,0,0,100,0),
+(@SIMONE_WPID,123,-7988.08,-1240.85,-268.771,0,0,0,0,100,0),
+(@SIMONE_WPID,124,-7999.08,-1234.36,-270.929,0,0,0,0,100,0),
+(@SIMONE_WPID,125,-8010.71,-1227.33,-271.689,0,0,0,0,100,0),
+(@SIMONE_WPID,126,-8015.59,-1214.45,-271.088,0,0,0,0,100,0),
+(@SIMONE_WPID,127,-8021.35,-1199.28,-272.097,0,0,0,0,100,0),
+(@SIMONE_WPID,128,-8025.09,-1189.04,-271.573,0,0,0,0,100,0),
+(@SIMONE_WPID,129,-8022.23,-1176.40,-270.534,0,0,0,0,100,0),
+(@SIMONE_WPID,130,-8019.31,-1163.49,-269.757,0,0,0,0,100,0),
+(@SIMONE_WPID,131,-8016.32,-1150.74,-269.61,0,0,0,0,100,0),
+(@SIMONE_WPID,132,-8015.35,-1137.60,-269.69,0,0,0,0,100,0),
+(@SIMONE_WPID,133,-8014.40,-1124.57,-269.72,0,0,0,0,100,0),
+(@SIMONE_WPID,134,-8013.32,-1110.68,-270.044,0,0,0,0,100,0),
+(@SIMONE_WPID,135,-8021.14,-1093.60,-271.817,0,0,0,0,100,0),
+(@SIMONE_WPID,136,-8028.9,-1076.55,-272.221,0,0,0,0,100,0),
+(@SIMONE_WPID,137,-8032.49,-1062.30,-272.217,0,0,0,0,100,0),
+(@SIMONE_WPID,138,-8036.17,-1047.71,-272.020,0,0,0,0,100,0),
+(@SIMONE_WPID,139,-8039.74,-1032.95,-270.213,0,0,0,0,100,0),
+(@SIMONE_WPID,140,-8035.83,-1020.34,-270.697,0,0,0,0,100,0),
+(@SIMONE_WPID,141,-8031.94,-1007.78,-271.425,0,0,0,0,100,0),
+(@SIMONE_WPID,142,-8028.18,-995.517,-271.951,0,0,0,0,100,0),
+(@SIMONE_WPID,143,-8027.03,-979.111,-271.886,0,0,0,0,100,0),
+(@SIMONE_WPID,144,-8025.88,-962.589,-272.389,0,0,0,0,100,0),
+(@SIMONE_WPID,145,-8024.66,-945.162,-272.090,0,0,0,0,100,0),
+(@SIMONE_WPID,146,-8023.5,-928.738,-271.488,0,0,0,0,100,0),
+(@SIMONE_WPID,147,-8014.73,-916.33,-272.090,0,0,0,0,100,0),
+(@SIMONE_WPID,148,-8005.56,-903.38,-271.879,0,0,0,0,100,0),
+(@SIMONE_WPID,149,-7996.5,-890.744,-270.785,0,0,0,0,100,0),
+(@SIMONE_WPID,150,-7978.12,-886.46,-271.507,0,0,0,0,100,0),
+(@SIMONE_WPID,151,-7961.41,-882.57,-272.429,0,0,0,0,100,0),
+(@SIMONE_WPID,152,-7944.55,-878.64,-272.776,0,0,0,0,100,0),
+(@SIMONE_WPID,153,-7927.47,-874.764,-273.239,0,0,0,0,100,0),
+(@SIMONE_WPID,154,-7911.44,-874.16,-271.360,0,0,0,0,100,0),
+(@SIMONE_WPID,155,-7895.53,-873.57,-269.631,0,0,0,0,100,0),
+(@SIMONE_WPID,156,-7878.9,-873.272,-269.206,0,0,0,0,100,0),
+(@SIMONE_WPID,157,-7861.82,-873.50,-267.549,0,0,0,0,100,0),
+(@SIMONE_WPID,158,-7843.57,-873.98,-267.831,0,0,0,0,100,0),
+(@SIMONE_WPID,159,-7828.47,-875.61,-265.442,0,0,0,0,100,0),
+(@SIMONE_WPID,160,-7814.7,-877.233,-263.584,0,0,0,0,100,0),
+(@SIMONE_WPID,161,-7801.57,-878.34,-265.669,0,0,0,0,100,0),
+(@SIMONE_WPID,162,-7788.56,-879.44,-268.830,0,0,0,0,100,0),
+(@SIMONE_WPID,163,-7775.41,-880.693,-270.838,0,0,0,0,100,0),
+(@SIMONE_WPID,164,-7760.87,-882.097,-271.186,0,0,0,0,100,0),
+(@SIMONE_WPID,165,-7746.63,-883.473,-271.493,0,0,0,0,100,0),
+(@SIMONE_WPID,166,-7731.77,-884.909,-271.199,0,0,0,0,100,0),
+(@SIMONE_WPID,167,-7716.72,-886.51,-271.764,0,0,0,0,100,0),
+(@SIMONE_WPID,168,-7705.04,-888.43,-270.271,0,0,0,0,100,0),
+(@SIMONE_WPID,169,-7693.3,-890.351,-269.212,0,0,0,0,100,0),
+(@SIMONE_WPID,170,-7678.78,-893.927,-270.579,0,0,0,0,100,0),
+(@SIMONE_WPID,171,-7663.54,-897.683,-271.093,0,0,0,0,100,0),
+(@SIMONE_WPID,172,-7648.84,-901.546,-271.142,0,0,0,0,100,0),
+(@SIMONE_WPID,173,-7636.72,-903.835,-269.725,0,0,0,0,100,0),
+(@SIMONE_WPID,174,-7624.75,-906.177,-268.369,0,0,0,0,100,0),
+(@SIMONE_WPID,175,-7636.72,-903.835,-269.725,0,0,0,0,100,0),
+(@SIMONE_WPID,176,-7648.84,-901.546,-271.142,0,0,0,0,100,0),
+(@SIMONE_WPID,177,-7663.54,-897.683,-271.093,0,0,0,0,100,0),
+(@SIMONE_WPID,178,-7678.78,-893.927,-270.579,0,0,0,0,100,0),
+(@SIMONE_WPID,179,-7693.3,-890.351,-269.212,0,0,0,0,100,0),
+(@SIMONE_WPID,180,-7705.04,-888.43,-270.271,0,0,0,0,100,0),
+(@SIMONE_WPID,181,-7716.72,-886.51,-271.764,0,0,0,0,100,0),
+(@SIMONE_WPID,182,-7731.77,-884.909,-271.199,0,0,0,0,100,0),
+(@SIMONE_WPID,183,-7746.63,-883.473,-271.493,0,0,0,0,100,0),
+(@SIMONE_WPID,184,-7760.87,-882.097,-271.186,0,0,0,0,100,0),
+(@SIMONE_WPID,185,-7775.41,-880.693,-270.838,0,0,0,0,100,0),
+(@SIMONE_WPID,186,-7788.56,-879.44,-268.830,0,0,0,0,100,0),
+(@SIMONE_WPID,187,-7801.57,-878.34,-265.669,0,0,0,0,100,0),
+(@SIMONE_WPID,188,-7814.7,-877.233,-263.584,0,0,0,0,100,0),
+(@SIMONE_WPID,189,-7828.47,-875.61,-265.442,0,0,0,0,100,0),
+(@SIMONE_WPID,190,-7843.57,-873.98,-267.831,0,0,0,0,100,0),
+(@SIMONE_WPID,191,-7861.82,-873.50,-267.549,0,0,0,0,100,0),
+(@SIMONE_WPID,192,-7878.9,-873.272,-269.206,0,0,0,0,100,0),
+(@SIMONE_WPID,193,-7895.53,-873.57,-269.631,0,0,0,0,100,0),
+(@SIMONE_WPID,194,-7911.44,-874.16,-271.360,0,0,0,0,100,0),
+(@SIMONE_WPID,195,-7927.47,-874.764,-273.239,0,0,0,0,100,0),
+(@SIMONE_WPID,196,-7944.55,-878.64,-272.776,0,0,0,0,100,0),
+(@SIMONE_WPID,197,-7961.41,-882.57,-272.429,0,0,0,0,100,0),
+(@SIMONE_WPID,198,-7978.12,-886.46,-271.507,0,0,0,0,100,0),
+(@SIMONE_WPID,199,-7996.5,-890.744,-270.785,0,0,0,0,100,0),
+(@SIMONE_WPID,200,-8005.56,-903.38,-271.879,0,0,0,0,100,0),
+(@SIMONE_WPID,201,-8014.73,-916.33,-272.090,0,0,0,0,100,0),
+(@SIMONE_WPID,202,-8023.5,-928.738,-271.488,0,0,0,0,100,0),
+(@SIMONE_WPID,203,-8024.66,-945.162,-272.090,0,0,0,0,100,0),
+(@SIMONE_WPID,204,-8025.88,-962.589,-272.389,0,0,0,0,100,0),
+(@SIMONE_WPID,205,-8027.03,-979.111,-271.886,0,0,0,0,100,0),
+(@SIMONE_WPID,206,-8028.18,-995.517,-271.951,0,0,0,0,100,0),
+(@SIMONE_WPID,207,-8031.94,-1007.78,-271.425,0,0,0,0,100,0),
+(@SIMONE_WPID,208,-8035.83,-1020.34,-270.697,0,0,0,0,100,0),
+(@SIMONE_WPID,209,-8039.74,-1032.95,-270.213,0,0,0,0,100,0),
+(@SIMONE_WPID,210,-8036.17,-1047.71,-272.020,0,0,0,0,100,0),
+(@SIMONE_WPID,211,-8032.49,-1062.30,-272.217,0,0,0,0,100,0),
+(@SIMONE_WPID,212,-8028.9,-1076.55,-272.221,0,0,0,0,100,0),
+(@SIMONE_WPID,213,-8021.14,-1093.60,-271.817,0,0,0,0,100,0),
+(@SIMONE_WPID,214,-8013.32,-1110.68,-270.044,0,0,0,0,100,0),
+(@SIMONE_WPID,215,-8014.40,-1124.57,-269.72,0,0,0,0,100,0),
+(@SIMONE_WPID,216,-8015.35,-1137.60,-269.69,0,0,0,0,100,0),
+(@SIMONE_WPID,217,-8016.32,-1150.74,-269.61,0,0,0,0,100,0),
+(@SIMONE_WPID,218,-8019.31,-1163.49,-269.757,0,0,0,0,100,0),
+(@SIMONE_WPID,219,-8022.23,-1176.40,-270.534,0,0,0,0,100,0),
+(@SIMONE_WPID,220,-8025.09,-1189.04,-271.573,0,0,0,0,100,0),
+(@SIMONE_WPID,221,-8021.35,-1199.28,-272.097,0,0,0,0,100,0),
+(@SIMONE_WPID,222,-8015.59,-1214.45,-271.088,0,0,0,0,100,0),
+(@SIMONE_WPID,223,-8010.71,-1227.33,-271.689,0,0,0,0,100,0),
+(@SIMONE_WPID,224,-7999.08,-1234.36,-270.929,0,0,0,0,100,0),
+(@SIMONE_WPID,225,-7988.08,-1240.85,-268.771,0,0,0,0,100,0),
+(@SIMONE_WPID,226,-7972.21,-1240.03,-272.528,0,0,0,0,100,0),
+(@SIMONE_WPID,227,-7956.59,-1239.09,-275.543,0,0,0,0,100,0),
+(@SIMONE_WPID,228,-7940.84,-1238.14,-271.266,0,0,0,0,100,0),
+(@SIMONE_WPID,229,-7925.09,-1237.18,-268.189,0,0,0,0,100,0),
+(@SIMONE_WPID,230,-7909.28,-1236.23,-268.122,0,0,0,0,100,0),
+(@SIMONE_WPID,231,-7898.39,-1242.60,-269.129,0,0,0,0,100,0),
+(@SIMONE_WPID,232,-7887.35,-1249.17,-270.749,0,0,0,0,100,0),
+(@SIMONE_WPID,233,-7876.33,-1255.73,-270.227,0,0,0,0,100,0),
+(@SIMONE_WPID,234,-7872.47,-1273.80,-270.707,0,0,0,0,100,0),
+(@SIMONE_WPID,235,-7868.57,-1291.81,-272.151,0,0,0,0,100,0),
+(@SIMONE_WPID,236,-7865.98,-1308.50,-273.433,0,0,0,0,100,0),
+(@SIMONE_WPID,237,-7863.34,-1324.98,-273.682,0,0,0,0,100,0),
+(@SIMONE_WPID,238,-7860.70,-1341.49,-273.100,0,0,0,0,100,0),
+(@SIMONE_WPID,239,-7858.07,-1357.97,-272.209,0,0,0,0,100,0),
+(@SIMONE_WPID,240,-7845.21,-1366.23,-272.197,0,0,0,0,100,0),
+(@SIMONE_WPID,241,-7832.38,-1374.35,-272.021,0,0,0,0,100,0),
+(@SIMONE_WPID,242,-7821.00,-1386.80,-271.654,0,0,0,0,100,0),
+(@SIMONE_WPID,243,-7809.72,-1399.56,-270.861,0,0,0,0,100,0),
+(@SIMONE_WPID,244,-7798.61,-1412.12,-271.319,0,0,0,0,100,0),
+(@SIMONE_WPID,245,-7787.49,-1424.71,-270.971,0,0,0,0,100,0),
+(@SIMONE_WPID,246,-7771.74,-1423.79,-272.130,0,0,0,0,100,0),
+(@SIMONE_WPID,247,-7755.93,-1422.77,-272.221,0,0,0,0,100,0),
+(@SIMONE_WPID,248,-7740.18,-1421.67,-271.859,0,0,0,0,100,0),
+(@SIMONE_WPID,249,-7724.40,-1420.53,-271.224,0,0,0,0,100,0),
+(@SIMONE_WPID,250,-7708.69,-1419.4,-269.638,0,0,0,0,100,0),
+(@SIMONE_WPID,251,-7692.53,-1413.05,-269.726,0,0,0,0,100,0),
+(@SIMONE_WPID,252,-7676.36,-1406.48,-270.633,0,0,0,0,100,0),
+(@SIMONE_WPID,253,-7666.01,-1398.22,-270.739,0,0,0,0,100,0),
+(@SIMONE_WPID,254,-7656.14,-1389.83,-269.454,0,0,0,0,100,0),
+(@SIMONE_WPID,255,-7646.1,-1381.3,-269.631,0,0,0,0,100,0),
+(@SIMONE_WPID,256,-7633.01,-1374.92,-270.888,0,0,0,0,100,0),
+(@SIMONE_WPID,257,-7620.15,-1368.28,-271.951,0,0,0,0,100,0),
+(@SIMONE_WPID,258,-7607.09,-1361.54,-272.221,0,0,0,0,100,0),
+(@SIMONE_WPID,259,-7593.97,-1354.76,-272.221,0,0,0,0,100,0),
+(@SIMONE_WPID,260,-7580.95,-1348.04,-272.221,0,0,0,0,100,0),
+(@SIMONE_WPID,261,-7567.9,-1341.3,-271.944,0,0,0,0,100,0),
+(@SIMONE_WPID,262,-7557.08,-1330.10,-271.315,0,0,0,0,100,0),
+(@SIMONE_WPID,263,-7546.40,-1318.69,-271.423,0,0,0,0,100,0),
+(@SIMONE_WPID,264,-7536.01,-1307.33,-271.797,0,0,0,0,100,0),
+(@SIMONE_WPID,265,-7525.54,-1295.88,-272.203,0,0,0,0,100,0),
+(@SIMONE_WPID,266,-7515.1,-1284.46,-271.69,0,0,0,0,100,0),
+(@SIMONE_WPID,267,-7508.60,-1268.31,-270.367,0,0,0,0,100,0),
+(@SIMONE_WPID,268,-7502.42,-1252.06,-269.497,0,0,0,0,100,0),
+(@SIMONE_WPID,269,-7504.78,-1237.10,-269.414,0,0,0,0,100,0),
+(@SIMONE_WPID,270,-7507.72,-1222.45,-269.740,0,0,0,0,100,0),
+(@SIMONE_WPID,271,-7510.67,-1207.70,-268.987,0,0,0,0,100,0),
+(@SIMONE_WPID,272,-7513.66,-1192.83,-269.189,0,0,0,0,100,0),
+(@SIMONE_WPID,273,-7516.62,-1178.08,-271.383,0,0,0,0,100,0),
+(@SIMONE_WPID,274,-7505.72,-1168.37,-271.077,0,0,0,0,100,0),
+(@SIMONE_WPID,275,-7495.84,-1159.14,-269.334,0,0,0,0,100,0),
+(@SIMONE_WPID,276,-7486.49,-1148.19,-271.035,0,0,0,0,100,0),
+(@SIMONE_WPID,277,-7477.41,-1137.00,-272.383,0,0,0,0,100,0),
+(@SIMONE_WPID,278,-7467.71,-1125.05,-271.785,0,0,0,0,100,0),
+(@SIMONE_WPID,279,-7458.12,-1113.23,-271.741,0,0,0,0,100,0),
+(@SIMONE_WPID,280,-7448.63,-1101.55,-271.191,0,0,0,0,100,0),
+(@SIMONE_WPID,281,-7439.16,-1089.87,-270.483,0,0,0,0,100,0),
+(@SIMONE_WPID,282,-7428.43,-1078.22,-269.067,0,0,0,0,100,0),
+(@SIMONE_WPID,283,-7418.18,-1066.56,-270.011,0,0,0,0,100,0),
+(@SIMONE_WPID,284,-7407.61,-1054.53,-270.546,0,0,0,0,100,0),
+(@SIMONE_WPID,285,-7396.97,-1042.43,-271.297,0,0,0,0,100,0),
+(@SIMONE_WPID,286,-7386.35,-1030.34,-271.884,0,0,0,0,100,0),
+(@SIMONE_WPID,287,-7382.82,-1016.07,-271.634,0,0,0,0,100,0),
+(@SIMONE_WPID,288,-7379.42,-1001.29,-271.409,0,0,0,0,100,0),
+(@SIMONE_WPID,289,-7370.96,-985.551,-270.788,0,0,0,0,100,0),
+(@SIMONE_WPID,290,-7363.46,-971.058,-271.653,0,0,0,0,100,0),
+(@SIMONE_WPID,291,-7355.48,-955.622,-271.426,0,0,0,0,100,0),
+(@SIMONE_WPID,292,-7344.05,-946.554,-269.778,0,0,0,0,100,0),
+(@SIMONE_WPID,293,-7332.81,-937.077,-268.705,0,0,0,0,100,0),
+(@SIMONE_WPID,294,-7320.84,-926.977,-270.566,0,0,0,0,100,0),
+(@SIMONE_WPID,295,-7304.25,-925.122,-270.666,0,0,0,0,100,0),
+(@SIMONE_WPID,296,-7287.81,-923.019,-269.745,0,0,0,0,100,0),
+(@SIMONE_WPID,297,-7274.82,-917.243,-271.10,0,0,0,0,100,0),
+(@SIMONE_WPID,298,-7262.07,-911.279,-271.53,0,0,0,0,100,0),
+(@SIMONE_WPID,299,-7248.12,-904.753,-272.24,0,0,0,0,100,0),
+(@SIMONE_WPID,300,-7236.21,-897.030,-271.225,0,0,0,0,100,0),
+(@SIMONE_WPID,301,-7224.42,-889.063,-272.044,0,0,0,0,100,0),
+(@SIMONE_WPID,302,-7212.15,-880.771,-271.128,0,0,0,0,100,0),
+(@SIMONE_WPID,303,-7195.90,-884.171,-271.957,0,0,0,0,100,0),
+(@SIMONE_WPID,304,-7179.54,-887.271,-272.052,0,0,0,0,100,0),
+(@SIMONE_WPID,305,-7164.34,-890.150,-271.235,0,0,0,0,100,0),
+(@SIMONE_WPID,306,-7149.97,-892.875,-271.069,0,0,0,0,100,0),
+(@SIMONE_WPID,307,-7131.26,-888.674,-272.03,0,0,0,0,100,0),
+(@SIMONE_WPID,308,-7112.65,-884.181,-271.47,0,0,0,0,100,0),
+(@SIMONE_WPID,309,-7102.90,-875.574,-271.450,0,0,0,0,100,0),
+(@SIMONE_WPID,310,-7093.29,-866.690,-272.204,0,0,0,0,100,0),
+(@SIMONE_WPID,311,-7083.01,-857.189,-272.220,0,0,0,0,100,0),
+(@SIMONE_WPID,312,-7072.05,-847.054,-272.178,0,0,0,0,100,0),
+(@SIMONE_WPID,313,-7067.83,-836.058,-272.202,0,0,0,0,100,0),
+(@SIMONE_WPID,314,-7063.79,-824.968,-271.531,0,0,0,0,100,0),
+(@SIMONE_WPID,315,-7059.61,-813.457,-271.303,0,0,0,0,100,0),
+(@SIMONE_WPID,316,-7048.82,-812.106,-271.697,0,0,0,0,100,0),
+(@SIMONE_WPID,317,-7037.96,-810.598,-271.845,0,0,0,0,100,0),
+(@SIMONE_WPID,318,-7027.44,-809.139,-272.117,0,0,0,0,100,0),
+(@SIMONE_WPID,319,-7016.69,-807.647,-271.597,0,0,0,0,100,0),
+(@SIMONE_WPID,320,-7009.76,-799.344,-272.041,0,0,0,0,100,0),
+(@SIMONE_WPID,321,-7003.04,-790.963,-273.025,0,0,0,0,100,0),
+(@SIMONE_WPID,322,-6996.69,-783.043,-272.410,0,0,0,0,100,0),
+(@SIMONE_WPID,323,-6989.49,-774.052,-269.931,0,0,0,0,100,0),
+(@SIMONE_WPID,324,-6984.47,-759.746,-267.759,0,0,0,0,100,0),
+(@SIMONE_WPID,325,-6979.9,-745.278,-265.937,0,0,0,0,100,0),
+(@SIMONE_WPID,326,-6982.18,-733.157,-265.618,0,0,0,0,100,0),
+(@SIMONE_WPID,327,-6984.88,-720.872,-267.025,0,0,0,0,100,0),
+(@SIMONE_WPID,328,-6987.37,-709.513,-268.536,0,0,0,0,100,0),
+(@SIMONE_WPID,329,-6989.87,-698.109,-269.301,0,0,0,0,100,0),
+(@SIMONE_WPID,330,-6994.73,-688.690,-270.518,0,0,0,0,100,0),
+(@SIMONE_WPID,331,-6999.91,-679.855,-271.857,0,0,0,0,100,0),
+(@SIMONE_WPID,332,-7003.90,-673.045,-272.215,0,0,0,0,100,0),
+(@SIMONE_WPID,333,-7009.78,-662.996,-272.221,0,0,0,0,100,0),
+(@SIMONE_WPID,334,-7015.69,-652.915,-272.221,0,0,0,0,100,0),
+(@SIMONE_WPID,335,-7021.6,-642.837,-272.155,0,0,0,0,100,0),
+(@SIMONE_WPID,336,-7028.90,-637.001,-271.888,0,0,0,0,100,0),
+(@SIMONE_WPID,337,-7036.41,-631.543,-271.606,0,0,0,0,100,0),
+(@SIMONE_WPID,338,-7045.73,-624.768,-272.084,0,0,0,0,100,0),
+(@SIMONE_WPID,339,-7055.15,-617.920,-271.757,0,0,0,0,100,0),
+(@SIMONE_WPID,340,-7064.50,-611.130,-271.627,0,0,0,0,100,0),
+(@SIMONE_WPID,341,-7073.85,-604.336,-270.318,0,0,0,0,100,0),
+(@SIMONE_WPID,342,-7083.48,-611.314,-270.053,0,0,0,0,100,0),
+(@SIMONE_WPID,343,-7093.09,-618.408,-271.013,0,0,0,0,100,0),
+(@SIMONE_WPID,344,-7102.19,-625.129,-270.782,0,0,0,0,100,0),
+(@SIMONE_WPID,345,-7111.61,-632.079,-272.327,0,0,0,0,100,0),
+(@SIMONE_WPID,346,-7123.46,-632.183,-270.63,0,0,0,0,100,0),
+(@SIMONE_WPID,347,-7135.38,-632.426,-267.289,0,0,0,0,100,0);
+
+SET @SIMONE_ENTRY := 14527;
+SET @SIMONE_GUID := 24439;
+
+-- Set MovementType and path_id
+UPDATE `creature` SET `MovementType` = 2 WHERE (`id` = @SIMONE_ENTRY) AND (`guid` = @SIMONE_GUID);
+UPDATE `creature_addon` SET `path_id` = @SIMONE_WPID WHERE (`guid` = @SIMONE_GUID);
+
+-- Change the spawn location coordinates
+DELETE FROM `creature` WHERE (`id` = @SIMONE_ENTRY) AND (`guid` IN (@SIMONE_GUID));
+INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `VerifiedBuild`) VALUES
+(@SIMONE_GUID, @SIMONE_ENTRY, 1, 0, 0, 1, 1, 14588, 0, -7135.380859, -632.425903, -267.28894, 6.260877, 600, 0, 0, 19536, 12170, 2, 0, 0, 0, '', 0);
+
+-- Allow player interaction, remove the quest item from the humanoid form, set Movement Type and change the Script Name
+UPDATE `creature_template`
+SET `npcflag` = 1,
+ `unit_flags2` = 18432,
+ `MovementType` = 2,
+ `lootid` = 0,
+ `ScriptName` = 'npc_simone'
+WHERE (`entry` = @SIMONE_ENTRY);
+
+-- Delete the unused loot_template
+DELETE FROM `creature_loot_template` WHERE `Entry` = @SIMONE_ENTRY;
+
+-- Add creature text for gossip option
+INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `comment`) VALUES
+(@SIMONE_ENTRY, 0, 0, "I am not fooled by your disguise, temptress. Your time to die has come.", 0, 0, 0, 0, 0, 0, 9755, "Simone the Inconspicuous");
+
+-- Correct Simone evil entry speed_walk
+UPDATE `creature_template` SET `speed_walk` = 1 WHERE (`entry` = 14533);
+
+-- Precious - Simone's pet
+SET @PRECIOUS_ENTRY := 14528;
+SET @PRECIOUS_GUID := 24440;
+
+-- Change the spawn location coordinates
+DELETE FROM `creature` WHERE (`id` = @PRECIOUS_ENTRY) AND (`guid` IN (@PRECIOUS_GUID));
+INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnMask`, `phaseMask`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curhealth`, `curmana`, `MovementType`, `npcflag`, `unit_flags`, `dynamicflags`, `ScriptName`, `VerifiedBuild`) VALUES
+(@PRECIOUS_GUID, @PRECIOUS_ENTRY, 1, 0, 0, 1, 1, 855, 0, -7140.185547, -632.318848, -265.525787, 6.26088, 600, 0, 0, 3052, 0, 0, 0, 0, 0, '', 0);
+
+-- Allow player interaction and change the Script Name
+UPDATE `creature_template`
+SET `npcflag` = 1,
+ `unit_flags2` = 18432,
+ `ScriptName` = 'npc_precious'
+WHERE (`entry` = @PRECIOUS_ENTRY);
+
+-- Correct Precious evil entry speed_walk
+UPDATE `creature_template` SET `speed_walk` = 1 WHERE (`entry` = 14538);
+
+-- Create a creature formation for Simone and Precious
+INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
+(@SIMONE_GUID, @SIMONE_GUID, 0, 0, 515, 0, 0),
+(@SIMONE_GUID, @PRECIOUS_GUID, 5, 180, 515, 0, 0);
diff --git a/data/sql/updates/pending_db_world/rev_1631173309078216738.sql b/data/sql/updates/pending_db_world/rev_1631173309078216738.sql
new file mode 100644
index 000000000..d48e4d9da
--- /dev/null
+++ b/data/sql/updates/pending_db_world/rev_1631173309078216738.sql
@@ -0,0 +1,106 @@
+INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1631173309078216738');
+
+-- -- Nelson the Nice
+SET @NELSON_WPID := 4322400;
+
+INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
+(@NELSON_WPID,1,-7724.21,1676.43,7.05759,0,0,0,0,100,0),
+(@NELSON_WPID,2,-7733.06,1688.73,7.71128,0,0,0,0,100,0),
+(@NELSON_WPID,3,-7747.69,1695.995,4.364,0,0,0,0,100,0),
+(@NELSON_WPID,4,-7762.220,1703.208,2.005,0,0,0,0,100,0),
+(@NELSON_WPID,5,-7776.71,1710.39,1.8921,0,0,0,0,100,0),
+(@NELSON_WPID,6,-7778.698,1726.611,2.312,0,0,0,0,100,0),
+(@NELSON_WPID,7,-7780.469,1744.140,1.427,0,0,0,0,100,0),
+(@NELSON_WPID,8,-7782.158,1760.855,0.021,0,0,0,0,100,0),
+(@NELSON_WPID,9,-7783.868,1777.784,0.938,0,0,0,0,100,0),
+(@NELSON_WPID,10,-7785.598,1794.902,0.469,0,0,0,0,100,0),
+(@NELSON_WPID,11,-7787.22,1811.91,1.06598,0,0,0,0,100,0),
+(@NELSON_WPID,12,-7790.603,1822.960,1.821,0,0,0,0,100,0),
+(@NELSON_WPID,13,-7793.95,1833.97,2.33555,0,0,0,0,100,0),
+(@NELSON_WPID,14,-7807.091,1836.017,4.011,0,0,0,0,100,0),
+(@NELSON_WPID,15,-7820.3,1838.11,4.71981,0,0,0,0,100,0),
+(@NELSON_WPID,16,-7836.246,1835.991,4.563,0,0,0,0,100,0),
+(@NELSON_WPID,17,-7851.99,1833.99,2.63924,0,0,0,0,100,0),
+(@NELSON_WPID,18,-7865.563,1825.987,3.917,0,0,0,0,100,0),
+(@NELSON_WPID,19,-7879.830,1817.575,1.494,0,0,0,0,100,0),
+(@NELSON_WPID,20,-7894.841,1808.725,1.520,0,0,0,0,100,0),
+(@NELSON_WPID,21,-7909.313,1800.193,2.558,0,0,0,0,100,0),
+(@NELSON_WPID,22,-7923.43,1791.55,2.32481,0,0,0,0,100,0),
+(@NELSON_WPID,23,-7929.228,1777.654,1.062,0,0,0,0,100,0),
+(@NELSON_WPID,24,-7935.053,1763.802,-2.753,0,0,0,0,100,0),
+(@NELSON_WPID,25,-7940.930,1749.826,-3.905,0,0,0,0,100,0),
+(@NELSON_WPID,26,-7946.756,1735.967,-2.015,0,0,0,0,100,0),
+(@NELSON_WPID,27,-7953.225,1720.585,-2.273,0,0,0,0,100,0),
+(@NELSON_WPID,28,-7959.83,1705.47,-2.79899,0,0,0,0,100,0),
+(@NELSON_WPID,29,-7956.756,1692.529,-3.825,0,0,0,0,100,0),
+(@NELSON_WPID,30,-7953.331,1678.105,-3.835,0,0,0,0,100,0),
+(@NELSON_WPID,31,-7949.98,1663.59,-3.32333,0,0,0,0,100,0),
+(@NELSON_WPID,32,-7941.660,1650.552,-4.973,0,0,0,0,100,0),
+(@NELSON_WPID,33,-7932.747,1636.584,-3.027,0,0,0,0,100,0),
+(@NELSON_WPID,34,-7923.472,1622.051,-1.661,0,0,0,0,100,0),
+(@NELSON_WPID,35,-7914.17,1607.52,-3.11146,0,0,0,0,100,0),
+(@NELSON_WPID,36,-7900.821,1598.480,0.627,0,0,0,0,100,0),
+(@NELSON_WPID,37,-7887.451,1589.426,2.230,0,0,0,0,100,0),
+(@NELSON_WPID,38,-7873.95,1580.5,3.04117,0,0,0,0,100,0),
+(@NELSON_WPID,39,-7863.373,1570.436,2.732,0,0,0,0,100,0),
+(@NELSON_WPID,40,-7852.92,1560.24,1.5244,0,0,0,0,100,0),
+(@NELSON_WPID,41,-7838.393,1555.745,-1.005,0,0,0,0,100,0),
+(@NELSON_WPID,42,-7824.891,1551.567,-1.685,0,0,0,0,100,0),
+(@NELSON_WPID,43,-7811.29,1547.2,0.534844,0,0,0,0,100,0),
+(@NELSON_WPID,44,-7800.038,1536.851,1.423,0,0,0,0,100,0),
+(@NELSON_WPID,45,-7788.91,1526.39,1.35146,0,0,0,0,100,0),
+(@NELSON_WPID,46,-7776.083,1524.080,0.854,0,0,0,0,100,0),
+(@NELSON_WPID,47,-7763.28,1521.68,0.441107,0,0,0,0,100,0),
+(@NELSON_WPID,48,-7747.104,1522.547,-0.491,0,0,0,0,100,0),
+(@NELSON_WPID,49,-7731,1523.34,-2.33413,0,0,0,0,100,0),
+(@NELSON_WPID,50,-7715.639,1526.94,0.265,0,0,0,0,100,0),
+(@NELSON_WPID,51,-7700.29,1530.48,3.78541,0,0,0,0,100,0),
+(@NELSON_WPID,52,-7686.12,1543.72,5.65941,0,0,0,0,100,0),
+(@NELSON_WPID,53,-7678.839,1557.686,5.651,0,0,0,0,100,0),
+(@NELSON_WPID,54,-7671.578,1571.616,3.642,0,0,0,0,100,0),
+(@NELSON_WPID,55,-7664.272,1585.63,1.946,0,0,0,0,100,0),
+(@NELSON_WPID,56,-7656.79,1599.46,3.04037,0,0,0,0,100,0),
+(@NELSON_WPID,57,-7667.404,1611.825,3.916,0,0,0,0,100,0),
+(@NELSON_WPID,58,-7677.943,1624.102,5.435,0,0,0,0,100,0),
+(@NELSON_WPID,59,-7688.485,1636.382,5.052,0,0,0,0,100,0),
+(@NELSON_WPID,60,-7699.277,1648.954,7.374,0,0,0,0,100,0),
+(@NELSON_WPID,61,-7710.01,1661.66,6.96938,0,0,0,0,100,0);
+
+SET @NELSON_ENTRY := 14536;
+SET @NELSON_GUID := 43224;
+
+-- Set MovementType and path_id
+UPDATE `creature` SET `MovementType` = 2 WHERE (`id` = @NELSON_ENTRY) AND (`guid` = @NELSON_GUID);
+UPDATE `creature_addon` SET `path_id` = @NELSON_WPID WHERE (`guid` = @NELSON_GUID);
+
+-- Allow player interaction, remove the quest item from the humanoid form, set Movement Type and change the Script Name
+UPDATE `creature_template`
+SET `npcflag` = 1,
+ `unit_flags2` = 18432,
+ `MovementType` = 2,
+ `lootid` = 0,
+ `ScriptName` = 'npc_nelson'
+WHERE (`entry` = @NELSON_ENTRY);
+
+-- Delete the unused loot_template
+DELETE FROM `creature_loot_template` WHERE `Entry` = @NELSON_ENTRY;
+
+-- Add creature text for gossip option
+INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `comment`) VALUES
+(@NELSON_ENTRY, 0, 0, "A gnome? How pathetic. Face me, demon!", 0, 0, 0, 0, 0, 0, 9753, "Nelson the Nice");
+
+-- Correct Nelson evil entry(Solenor the Slayer) speed_walk
+UPDATE `creature_template` SET `speed_walk` = 1 WHERE (`entry` = 14530);
+
+-- Reduce Creeping Doom speed and increase the damage
+UPDATE `creature_template`
+SET `speed_run` = 0.33,
+ `speed_walk` = 0.33,
+ `DamageModifier` = 2.25
+WHERE `entry` = 14761;
+
+-- Soul Flame spell_dbc addition
+-- the change is needed because otherwise EnterEvadeMode() removes the aura from the creature and a C++ workaround is needed
+INSERT IGNORE INTO spell_dbc (`ID`,`Category`,`DispelType`,`Mechanic`,`Attributes`,`AttributesEx`,`AttributesEx2`,`AttributesEx3`,`AttributesEx4`,`AttributesEx5`,`AttributesEx6`,`AttributesEx7`,`ShapeshiftMask`,`unk_320_2`,`ShapeshiftExclude`,`unk_320_3`,`Targets`,`TargetCreatureType`,`RequiresSpellFocus`,`FacingCasterFlags`,`CasterAuraState`,`TargetAuraState`,`ExcludeCasterAuraState`,`ExcludeTargetAuraState`,`CasterAuraSpell`,`TargetAuraSpell`,`ExcludeCasterAuraSpell`,`ExcludeTargetAuraSpell`,`CastingTimeIndex`,`RecoveryTime`,`CategoryRecoveryTime`,`InterruptFlags`,`AuraInterruptFlags`,`ChannelInterruptFlags`,`ProcTypeMask`,`ProcChance`,`ProcCharges`,`MaxLevel`,`BaseLevel`,`SpellLevel`,`DurationIndex`,`PowerType`,`ManaCost`,`ManaCostPerLevel`,`ManaPerSecond`,`ManaPerSecondPerLevel`,`RangeIndex`,`Speed`,`ModalNextSpell`,`CumulativeAura`,`Totem_1`,`Totem_2`,`Reagent_1`,`Reagent_2`,`Reagent_3`,`Reagent_4`,`Reagent_5`,`Reagent_6`,`Reagent_7`,`Reagent_8`,`ReagentCount_1`,`ReagentCount_2`,`ReagentCount_3`,`ReagentCount_4`,`ReagentCount_5`,`ReagentCount_6`,`ReagentCount_7`,`ReagentCount_8`,`EquippedItemClass`,`EquippedItemSubclass`,`EquippedItemInvTypes`,`Effect_1`,`Effect_2`,`Effect_3`,`EffectDieSides_1`,`EffectDieSides_2`,`EffectDieSides_3`,`EffectRealPointsPerLevel_1`,`EffectRealPointsPerLevel_2`,`EffectRealPointsPerLevel_3`,`EffectBasePoints_1`,`EffectBasePoints_2`,`EffectBasePoints_3`,`EffectMechanic_1`,`EffectMechanic_2`,`EffectMechanic_3`,`ImplicitTargetA_1`,`ImplicitTargetA_2`,`ImplicitTargetA_3`,`ImplicitTargetB_1`,`ImplicitTargetB_2`,`ImplicitTargetB_3`,`EffectRadiusIndex_1`,`EffectRadiusIndex_2`,`EffectRadiusIndex_3`,`EffectAura_1`,`EffectAura_2`,`EffectAura_3`,`EffectAuraPeriod_1`,`EffectAuraPeriod_2`,`EffectAuraPeriod_3`,`EffectMultipleValue_1`,`EffectMultipleValue_2`,`EffectMultipleValue_3`,`EffectChainTargets_1`,`EffectChainTargets_2`,`EffectChainTargets_3`,`EffectItemType_1`,`EffectItemType_2`,`EffectItemType_3`,`EffectMiscValue_1`,`EffectMiscValue_2`,`EffectMiscValue_3`,`EffectMiscValueB_1`,`EffectMiscValueB_2`,`EffectMiscValueB_3`,`EffectTriggerSpell_1`,`EffectTriggerSpell_2`,`EffectTriggerSpell_3`,`EffectPointsPerCombo_1`,`EffectPointsPerCombo_2`,`EffectPointsPerCombo_3`,`EffectSpellClassMaskA_1`,`EffectSpellClassMaskA_2`,`EffectSpellClassMaskA_3`,`EffectSpellClassMaskB_1`,`EffectSpellClassMaskB_2`,`EffectSpellClassMaskB_3`,`EffectSpellClassMaskC_1`,`EffectSpellClassMaskC_2`,`EffectSpellClassMaskC_3`,`SpellVisualID_1`,`SpellVisualID_2`,`SpellIconID`,`ActiveIconID`,`SpellPriority`,`Name_Lang_enUS`,`Name_Lang_enGB`,`Name_Lang_koKR`,`Name_Lang_frFR`,`Name_Lang_deDE`,`Name_Lang_enCN`,`Name_Lang_zhCN`,`Name_Lang_enTW`,`Name_Lang_zhTW`,`Name_Lang_esES`,`Name_Lang_esMX`,`Name_Lang_ruRU`,`Name_Lang_ptPT`,`Name_Lang_ptBR`,`Name_Lang_itIT`,`Name_Lang_Unk`,`Name_Lang_Mask`,`NameSubtext_Lang_enUS`,`NameSubtext_Lang_enGB`,`NameSubtext_Lang_koKR`,`NameSubtext_Lang_frFR`,`NameSubtext_Lang_deDE`,`NameSubtext_Lang_enCN`,`NameSubtext_Lang_zhCN`,`NameSubtext_Lang_enTW`,`NameSubtext_Lang_zhTW`,`NameSubtext_Lang_esES`,`NameSubtext_Lang_esMX`,`NameSubtext_Lang_ruRU`,`NameSubtext_Lang_ptPT`,`NameSubtext_Lang_ptBR`,`NameSubtext_Lang_itIT`,`NameSubtext_Lang_Unk`,`NameSubtext_Lang_Mask`,`Description_Lang_enUS`,`Description_Lang_enGB`,`Description_Lang_koKR`,`Description_Lang_frFR`,`Description_Lang_deDE`,`Description_Lang_enCN`,`Description_Lang_zhCN`,`Description_Lang_enTW`,`Description_Lang_zhTW`,`Description_Lang_esES`,`Description_Lang_esMX`,`Description_Lang_ruRU`,`Description_Lang_ptPT`,`Description_Lang_ptBR`,`Description_Lang_itIT`,`Description_Lang_Unk`,`Description_Lang_Mask`,`AuraDescription_Lang_enUS`,`AuraDescription_Lang_enGB`,`AuraDescription_Lang_koKR`,`AuraDescription_Lang_frFR`,`AuraDescription_Lang_deDE`,`AuraDescription_Lang_enCN`,`AuraDescription_Lang_zhCN`,`AuraDescription_Lang_enTW`,`AuraDescription_Lang_zhTW`,`AuraDescription_Lang_esES`,`AuraDescription_Lang_esMX`,`AuraDescription_Lang_ruRU`,`AuraDescription_Lang_ptPT`,`AuraDescription_Lang_ptBR`,`AuraDescription_Lang_itIT`,`AuraDescription_Lang_Unk`,`AuraDescription_Lang_Mask`,`ManaCostPct`,`StartRecoveryCategory`,`StartRecoveryTime`,`MaxTargetLevel`,`SpellClassSet`,`SpellClassMask_1`,`SpellClassMask_2`,`SpellClassMask_3`,`MaxTargets`,`DefenseType`,`PreventionType`,`StanceBarOrder`,`EffectChainAmplitude_1`,`EffectChainAmplitude_2`,`EffectChainAmplitude_3`,`MinFactionID`,`MinReputation`,`RequiredAuraVision`,`RequiredTotemCategoryID_1`,`RequiredTotemCategoryID_2`,`RequiredAreasID`,`SchoolMask`,`RuneCostID`,`SpellMissileID`,`PowerDisplayID`,`Field227`,`Field228`,`Field229`,`SpellDescriptionVariableID`,`SpellDifficultyID`) VALUES
+(23272,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,101,0,0,0,0,21,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,6,6,46,91,1,0,0,0,0,554,99,0,0,0,0,1,1,0,0,0,0,0,0,0,15,101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6803,0,937,0,0,'Soul Flame','','','','','','','','','','','','','','','',16712190,'','','','','','','','','','','','','','','','',16712172,'','','','','','','','','','','','','','','','',16712188,'','','','','','','','','','','','','','','','',16712188,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,0,0,0,1,1,1,0,0);
+UPDATE `spell_dbc` SET `ImplicitTargetA_3` = 1 WHERE ID = 23272;
diff --git a/data/sql/updates/pending_db_world/rev_1631371074636591511.sql b/data/sql/updates/pending_db_world/rev_1631371074636591511.sql
new file mode 100644
index 000000000..802bec47a
--- /dev/null
+++ b/data/sql/updates/pending_db_world/rev_1631371074636591511.sql
@@ -0,0 +1,117 @@
+INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1631371074636591511');
+
+-- -- Franklin the Friendly
+SET @FRANKLIN_WPID := 460200;
+
+INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`, `move_type`, `action`, `action_chance`, `wpguid`) VALUES
+(@FRANKLIN_WPID,1,-8316.99,-1006.56,177.641,0,0,0,0,100,0),
+(@FRANKLIN_WPID,2,-8305.2,-1011.45,172.119,0,0,0,0,100,0),
+(@FRANKLIN_WPID,3,-8291.97,-1017.28,162.798,0,0,0,0,100,0),
+(@FRANKLIN_WPID,4,-8278.362,-1025.672,153.739,0,0,0,0,100,0),
+(@FRANKLIN_WPID,5,-8264.753,-1034.065,148.866,0,0,0,0,100,0),
+(@FRANKLIN_WPID,6,-8251.152,-1042.453,146.348,0,0,0,0,100,0),
+(@FRANKLIN_WPID,7,-8237.310,-1050.990,143.320,0,0,0,0,100,0),
+(@FRANKLIN_WPID,8,-8223.46,-1059.57,142.632,0,0,0,0,100,0),
+(@FRANKLIN_WPID,9,-8213.409,-1067.735,143.325,0,0,0,0,100,0),
+(@FRANKLIN_WPID,10,-8203.453,-1075.824,146.251,0,0,0,0,100,0),
+(@FRANKLIN_WPID,11,-8193.54,-1083.9,148.981,0,0,0,0,100,0),
+(@FRANKLIN_WPID,12,-8183.38,-1086.576,150.362,0,0,0,0,100,0),
+(@FRANKLIN_WPID,13,-8167.484,-1090.767,142.01,0,0,0,0,100,0),
+(@FRANKLIN_WPID,14,-8151.57,-1095.01,135.284,0,0,0,0,100,0),
+(@FRANKLIN_WPID,15,-8135.705,-1090.979,131.24,0,0,0,0,100,0),
+(@FRANKLIN_WPID,16,-8119.748,-1086.925,130.316,0,0,0,0,100,0),
+(@FRANKLIN_WPID,17,-8103.913,-1082.902,130.549,0,0,0,0,100,0),
+(@FRANKLIN_WPID,18,-8088.07,-1078.876,129.343,0,0,0,0,100,0),
+(@FRANKLIN_WPID,19,-8072.27,-1074.97,129.596,0,0,0,0,100,0),
+(@FRANKLIN_WPID,20,-8056.285,-1065.265,129.378,0,0,0,0,100,0),
+(@FRANKLIN_WPID,21,-8040.16,-1055.54,130.915,0,0,0,0,100,0),
+(@FRANKLIN_WPID,22,-8030.153,-1041.759,130.299,0,0,0,0,100,0),
+(@FRANKLIN_WPID,23,-8020.17,-1028.09,130.082,0,0,0,0,100,0),
+(@FRANKLIN_WPID,24,-8011.435,-1011.860,129.200,0,0,0,0,100,0),
+(@FRANKLIN_WPID,25,-8002.57,-995.689,128.183,0,0,0,0,100,0),
+(@FRANKLIN_WPID,26,-7999.169,-979.507,127.616,0,0,0,0,100,0),
+(@FRANKLIN_WPID,27,-7995.779,-963.324,127.869,0,0,0,0,100,0),
+(@FRANKLIN_WPID,28,-7992.436,-947.095,128.584,0,0,0,0,100,0),
+(@FRANKLIN_WPID,29,-7989.077,-930.786,129.41,0,0,0,0,100,0),
+(@FRANKLIN_WPID,30,-7985.57,-914.513,129.488,0,0,0,0,100,0),
+(@FRANKLIN_WPID,31,-7978.095,-899.513,129.657,0,0,0,0,100,0),
+(@FRANKLIN_WPID,32,-7970.6,-884.63,129.096,0,0,0,0,100,0),
+(@FRANKLIN_WPID,33,-7971.895,-872.093,129.856,0,0,0,0,100,0),
+(@FRANKLIN_WPID,34,-7973.25,-859.507,130.788,0,0,0,0,100,0),
+(@FRANKLIN_WPID,35,-7982.222,-843.672,131.085,0,0,0,0,100,0),
+(@FRANKLIN_WPID,36,-7991.21,-827.825,131.034,0,0,0,0,100,0),
+(@FRANKLIN_WPID,37,-8003.523,-817.578,131.838,0,0,0,0,100,0),
+(@FRANKLIN_WPID,38,-8015.894,-807.285,131.929,0,0,0,0,100,0),
+(@FRANKLIN_WPID,39,-8028.179,-797.063,131.616,0,0,0,0,100,0),
+(@FRANKLIN_WPID,40,-8040.458,-786.846,131.146,0,0,0,0,100,0),
+(@FRANKLIN_WPID,41,-8052.81,-776.616,131.194,0,0,0,0,100,0),
+(@FRANKLIN_WPID,42,-8066.924,-771.172,131.246,0,0,0,0,100,0),
+(@FRANKLIN_WPID,43,-8080.99,-765.609,132.48,0,0,0,0,100,0),
+(@FRANKLIN_WPID,44,-8094.912,-763.642,133.229,0,0,0,0,100,0),
+(@FRANKLIN_WPID,45,-8109.003,-761.652,133.502,0,0,0,0,100,0),
+(@FRANKLIN_WPID,46,-8123.15,-759.628,133.418,0,0,0,0,100,0),
+(@FRANKLIN_WPID,47,-8133.863,-766.926,131.14,0,0,0,0,100,0),
+(@FRANKLIN_WPID,48,-8144.492,-774.167,128.998,0,0,0,0,100,0),
+(@FRANKLIN_WPID,49,-8155.13,-781.265,129.619,0,0,0,0,100,0),
+(@FRANKLIN_WPID,50,-8164.803,-791.834,129.902,0,0,0,0,100,0),
+(@FRANKLIN_WPID,51,-8174.491,-802.420,129.545,0,0,0,0,100,0),
+(@FRANKLIN_WPID,52,-8184.21,-813.102,129.499,0,0,0,0,100,0),
+(@FRANKLIN_WPID,53,-8188.647,-829.914,129.508,0,0,0,0,100,0),
+(@FRANKLIN_WPID,54,-8193.06,-846.649,131.526,0,0,0,0,100,0),
+(@FRANKLIN_WPID,55,-8192.838,-859.842,131.906,0,0,0,0,100,0),
+(@FRANKLIN_WPID,56,-8192.618,-873.027,132.604,0,0,0,0,100,0),
+(@FRANKLIN_WPID,57,-8192.45,-886.107,132.995,0,0,0,0,100,0),
+(@FRANKLIN_WPID,58,-8196.933,-902.065,133.216,0,0,0,0,100,0),
+(@FRANKLIN_WPID,59,-8201.440,-918.107,133.240,0,0,0,0,100,0),
+(@FRANKLIN_WPID,60,-8205.974,-934.253,133.378,0,0,0,0,100,0),
+(@FRANKLIN_WPID,61,-8210.51,-950.259,133.334,0,0,0,0,100,0),
+(@FRANKLIN_WPID,62,-8221.936,-958.579,133.523,0,0,0,0,100,0),
+(@FRANKLIN_WPID,63,-8233.356,-966.895,135.174,0,0,0,0,100,0),
+(@FRANKLIN_WPID,64,-8244.73,-975.171,135.976,0,0,0,0,100,0),
+(@FRANKLIN_WPID,65,-8249.922,-982.952,139.239,0,0,0,0,100,0),
+(@FRANKLIN_WPID,66,-8255.06,-990.76,142.55,0,0,0,0,100,0),
+(@FRANKLIN_WPID,67,-8254.280,-1008.357,145.246,0,0,0,0,100,0),
+(@FRANKLIN_WPID,68,-8256.648,-1019.407,147.487,0,0,0,0,100,0),
+(@FRANKLIN_WPID,69,-8259.07,-1030.48,148.679,0,0,0,0,100,0),
+(@FRANKLIN_WPID,70,-8269.588,-1025.644,151.828,0,0,0,0,100,0),
+(@FRANKLIN_WPID,71,-8280.13,-1020.75,155.286,0,0,0,0,100,0),
+(@FRANKLIN_WPID,72,-8288.718,-1015.341,161.123,0,0,0,0,100,0),
+(@FRANKLIN_WPID,73,-8297.302,-1009.934,170.018,0,0,0,0,100,0),
+(@FRANKLIN_WPID,74,-8305.89,-1004.62,173.304,0,0,0,0,100,0),
+(@FRANKLIN_WPID,75,-8317.888,-994.580,176.718,0,0,0,0,100,0),
+(@FRANKLIN_WPID,76,-8329.91,-984.533,181.675,0,0,0,0,100,0),
+(@FRANKLIN_WPID,77,-8338.235,-975.403,184.932,0,0,0,0,100,0),
+(@FRANKLIN_WPID,78,-8346.570,-966.264,187.763,0,0,0,0,100,0),
+(@FRANKLIN_WPID,79,-8354.9,-957.027,190.596,0,0,0,0,100,0),
+(@FRANKLIN_WPID,80,-8362.666,-967.062,188.836,0,0,0,0,100,0),
+(@FRANKLIN_WPID,81,-8370.491,-977.171,187.538,0,0,0,0,100,0),
+(@FRANKLIN_WPID,82,-8378.37,-987.249,187.333,0,0,0,0,100,0),
+(@FRANKLIN_WPID,83,-8362.346,-995.818,186.122,0,0,0,0,100,0),
+(@FRANKLIN_WPID,84,-8346.49,-1004.44,186.726,0,0,0,0,100,0),
+(@FRANKLIN_WPID,85,-8331.710,-1005.412,184.642,0,0,0,0,100,0);
+
+SET @FRANKLIN_ENTRY := 14529;
+SET @FRANKLIN_GUID := 4602;
+
+-- Set MovementType and path_id
+UPDATE `creature` SET `MovementType` = 2 WHERE (`id` = @FRANKLIN_ENTRY) AND (`guid` = @FRANKLIN_GUID);
+UPDATE `creature_addon` SET `path_id` = @FRANKLIN_WPID WHERE (`guid` = @FRANKLIN_GUID);
+
+-- Allow player interaction, remove the quest item from the humanoid form, set Movement Type and change the Script Name
+UPDATE `creature_template`
+SET `npcflag` = 1,
+ `unit_flags2` = 18432,
+ `MovementType` = 2,
+ `lootid` = 0,
+ `ScriptName` = 'npc_franklin'
+WHERE (`entry` = @FRANKLIN_ENTRY);
+
+-- Delete the unused loot_template
+DELETE FROM `creature_loot_template` WHERE `Entry` = @FRANKLIN_ENTRY;
+
+-- Add creature text for gossip option
+INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `comment`) VALUES
+(@FRANKLIN_ENTRY, 0, 0, "So you are Klinfran the Crazed? Sad, I was expecting an actual challenge. Do you dare face me in your true form?", 0, 0, 0, 0, 0, 0, 9754, "Franklin the Friendly");
+
+-- Correct Franklin evil entry(Klinfran the Crazed) speed_walk
+UPDATE `creature_template` SET `speed_walk` = 1 WHERE (`entry` = 14534);
diff --git a/data/sql/updates/pending_db_world/rev_1634741438848895794.sql b/data/sql/updates/pending_db_world/rev_1634741438848895794.sql
new file mode 100644
index 000000000..3c15fc56c
--- /dev/null
+++ b/data/sql/updates/pending_db_world/rev_1634741438848895794.sql
@@ -0,0 +1,28 @@
+INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1634741438848895794');
+
+SET @SIMONE_MENUID := 5868;
+SET @PRECIOUS_MENUID := 5869;
+SET @FRANKLIN_MENUID := 5870;
+SET @ARTORIUS_MENUID := 5871;
+SET @NELSON_MENUID := 5872;
+
+-- Add the new gossip menus
+INSERT INTO `gossip_menu` (`MenuID`, `TextID`) VALUES
+(@FRANKLIN_MENUID, 7043),
+(@ARTORIUS_MENUID, 7045),
+(@NELSON_MENUID, 7044);
+
+-- Add the gossip options
+INSERT INTO `gossip_menu_option` (`MenuID`, `OptionID`, `OptionIcon`, `OptionText`, `OptionBroadcastTextID`, `OptionType`, `OptionNpcFlag`, `ActionMenuID`, `ActionPoiID`, `BoxCoded`, `BoxMoney`, `BoxText`, `BoxBroadcastTextID`, `VerifiedBuild`) VALUES
+(@SIMONE_MENUID, 0, 0, "I am not fooled by your disguise, temptress. Your time to die has come.", 9755, 1, 1, 0, 0, 0, 0, NULL, 0, 0),
+(@FRANKLIN_MENUID, 0, 0, "So you are Klinfran the Crazed? Sad, I was expecting an actual challenge. Do you dare face me in your true form?", 9754, 1, 1, 0, 0, 0, 0, NULL, 0, 0),
+(@ARTORIUS_MENUID, 0, 0, "I know you as Artorius the Doombringer. Show yourself, demon! Face me!", 9751, 1, 1, 0, 0, 0, 0, NULL, 0, 0),
+(@NELSON_MENUID, 0, 0, "A gnome? How pathetic. Face me, demon!", 9753, 1, 1, 0, 0, 0, 0, NULL, 0, 0);
+
+-- Update creature template gossip_menu_id
+UPDATE `creature_template` SET `gossip_menu_id` = @FRANKLIN_MENUID WHERE (`entry` = 14529);
+UPDATE `creature_template` SET `gossip_menu_id` = @ARTORIUS_MENUID WHERE (`entry` = 14531);
+UPDATE `creature_template` SET `gossip_menu_id` = @NELSON_MENUID WHERE (`entry` = 14536);
+
+-- Delete the unneeded/unused creature texts
+DELETE FROM `creature_text` WHERE `CreatureID` IN (14527, 14529, 14531, 14536);
diff --git a/src/server/scripts/Kalimdor/zone_winterspring.cpp b/src/server/scripts/Kalimdor/zone_winterspring.cpp
index 9fc0e3bc3..db1be90f7 100644
--- a/src/server/scripts/Kalimdor/zone_winterspring.cpp
+++ b/src/server/scripts/Kalimdor/zone_winterspring.cpp
@@ -35,192 +35,6 @@ EndContentData */
#include "ScriptMgr.h"
#include "WorldSession.h"
-// Ours
-enum eStaveQuest
-{
- QUEST_STAVE_OF_THE_ANCIENTS = 7636,
-
- NPC_SIMONE_NORMAL = 14527,
- NPC_FRANKLIN_NORMAL = 14529,
- NPC_ARTORIUS_NORMAL = 14531,
- NPC_NELSON_NORMAL = 14536,
- NPC_PRECIOUS = 14528,
-
- NPC_SIMONE_EVIL = 14533,
- NPC_FRANKLIN_EVIL = 14534,
- NPC_ARTORIUS_EVIL = 14535,
- NPC_NELSON_EVIL = 14530,
- NPC_PRECIOUS_EVIL = 14538,
-
- EVENT_CHECK_PLAYER = 1,
- EVENT_SPELL_CHAIN_LIGHTNING = 23206,
- EVENT_SPELL_TEMPTRESS_KISS = 23205,
- EVENT_SPELL_DEMONIC_ENRAGE = 23257,
- EVENT_SPELL_ENTROPIC_STING = 23260,
- EVENT_SPELL_DEMONIC_DOOM = 23298,
- EVENT_SPELL_STINGING_TRAUMA = 23299,
- EVENT_SPELL_DREADFUL_FRIGHT = 23275,
-
- SPELL_FOOLS_PLIGHT = 23504,
- SPELL_SOUL_FLAME = 23272,
-};
-
-class npc_stave_of_the_ancients : public CreatureScript
-{
-public:
- npc_stave_of_the_ancients() : CreatureScript("npc_stave_of_the_ancients") { }
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return new npc_stave_of_the_ancientsAI(creature);
- }
-
- struct npc_stave_of_the_ancientsAI : public ScriptedAI
- {
- npc_stave_of_the_ancientsAI(Creature* creature) : ScriptedAI(creature)
- {
- changeEntry = me->GetEntry();
- switch (me->GetEntry())
- {
- case NPC_SIMONE_NORMAL:
- changeEntry = NPC_SIMONE_EVIL;
- break;
- case NPC_FRANKLIN_NORMAL:
- changeEntry = NPC_FRANKLIN_EVIL;
- break;
- case NPC_ARTORIUS_NORMAL:
- changeEntry = NPC_ARTORIUS_EVIL;
- break;
- case NPC_NELSON_NORMAL:
- changeEntry = NPC_NELSON_EVIL;
- break;
- case NPC_PRECIOUS:
- changeEntry = NPC_PRECIOUS_EVIL;
- break;
- }
- }
-
- ObjectGuid playerGUID;
- EventMap events;
- uint32 changeEntry;
- bool damaged;
-
- void Reset() override
- {
- if (me->GetOriginalEntry() != me->GetEntry())
- me->UpdateEntry(me->GetOriginalEntry());
-
- events.Reset();
- playerGUID.Clear();
- damaged = false;
- }
-
- void DamageTaken(Unit* who, uint32&, DamageEffectType, SpellSchoolMask) override
- {
- if (!damaged)
- {
- if (who && who->GetGUID() != playerGUID && (who->GetTypeId() == TYPEID_PLAYER || who->GetOwnerGUID().IsPlayer()))
- {
- damaged = true;
- me->CastSpell(who, SPELL_FOOLS_PLIGHT, true);
- }
- }
- else
- damaged = false;
- }
-
- void EnterCombat(Unit*) override
- {
- switch (changeEntry)
- {
- case NPC_SIMONE_EVIL:
- events.ScheduleEvent(EVENT_SPELL_CHAIN_LIGHTNING, 3000);
- events.ScheduleEvent(EVENT_SPELL_TEMPTRESS_KISS, 1000);
- break;
- case NPC_FRANKLIN_EVIL:
- events.ScheduleEvent(EVENT_SPELL_DEMONIC_ENRAGE, 3000);
- events.ScheduleEvent(EVENT_SPELL_ENTROPIC_STING, 5000);
- break;
- case NPC_ARTORIUS_EVIL:
- events.ScheduleEvent(EVENT_SPELL_DEMONIC_DOOM, 3000);
- events.ScheduleEvent(EVENT_SPELL_STINGING_TRAUMA, 5000);
- break;
- case NPC_NELSON_EVIL:
- me->CastSpell(me, SPELL_SOUL_FLAME, true);
- events.ScheduleEvent(EVENT_SPELL_DREADFUL_FRIGHT, 5000);
- break;
- }
- }
-
- void MoveInLineOfSight(Unit* who) override
- {
- if (me->GetEntry() != changeEntry && who->GetTypeId() == TYPEID_PLAYER && who->ToPlayer()->GetQuestStatus(QUEST_STAVE_OF_THE_ANCIENTS) == QUEST_STATUS_INCOMPLETE)
- {
- playerGUID = who->GetGUID();
- me->UpdateEntry(changeEntry);
- events.ScheduleEvent(EVENT_CHECK_PLAYER, 5000);
- return;
- }
- ScriptedAI::MoveInLineOfSight(who);
- }
-
- void UpdateAI(uint32 diff) override
- {
- events.Update(diff);
- uint32 eventId = events.ExecuteEvent();
- if (eventId == EVENT_CHECK_PLAYER)
- {
- Player* player = ObjectAccessor::GetPlayer(*me, playerGUID);
- if (!player || !player->IsWithinDist2d(me, 60.0f))
- EnterEvadeMode();
- else
- events.RepeatEvent(5000);
- return;
- }
-
- if (!UpdateVictim())
- return;
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- switch (eventId)
- {
- case EVENT_SPELL_CHAIN_LIGHTNING:
- me->CastSpell(me->GetVictim(), eventId, false);
- events.RepeatEvent(7000);
- break;
- case EVENT_SPELL_TEMPTRESS_KISS:
- me->CastSpell(me->GetVictim(), eventId, false);
- events.RepeatEvent(45000);
- break;
- case EVENT_SPELL_DEMONIC_ENRAGE:
- me->CastSpell(me, eventId, false);
- events.RepeatEvent(20000);
- break;
- case EVENT_SPELL_ENTROPIC_STING:
- me->CastSpell(me->GetVictim(), eventId, false);
- events.RepeatEvent(20000);
- break;
- case EVENT_SPELL_DEMONIC_DOOM:
- me->CastSpell(me->GetVictim(), eventId, false);
- events.RepeatEvent(50000);
- break;
- case EVENT_SPELL_STINGING_TRAUMA:
- me->CastSpell(me->GetVictim(), eventId, false);
- events.RepeatEvent(20000);
- break;
- case EVENT_SPELL_DREADFUL_FRIGHT:
- me->CastSpell(me->GetVictim(), eventId, false);
- events.RepeatEvent(15000);
- break;
- }
-
- DoMeleeAttackIfReady();
- }
- };
-};
-
// Theirs
/*######
## npc_rivern_frostwind
@@ -804,9 +618,6 @@ public:
void AddSC_winterspring()
{
- // Ours
- new npc_stave_of_the_ancients();
-
// Theirs
new npc_rivern_frostwind();
new npc_ranshalla();
diff --git a/src/server/scripts/World/npc_stave_of_ancients.cpp b/src/server/scripts/World/npc_stave_of_ancients.cpp
new file mode 100644
index 000000000..4e5ca456f
--- /dev/null
+++ b/src/server/scripts/World/npc_stave_of_ancients.cpp
@@ -0,0 +1,1213 @@
+/*
+ * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation; either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see .
+ */
+
+#include "CreatureGroups.h"
+#include "Player.h"
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "ScriptedGossip.h"
+#include "Spell.h"
+#include "npc_stave_of_ancients.h"
+
+uint32 NPCStaveQuestAI::GetFormEntry(std::string type)
+{
+ uint32 currentEntry = me->GetEntry();
+ uint32 entryKey = entryKeys[currentEntry];
+ return entryList[entryKey][type];
+}
+
+bool NPCStaveQuestAI::InNormalForm()
+{
+ return me->GetEntry() == GetFormEntry("normal");
+}
+
+void NPCStaveQuestAI::RevealForm()
+{
+ if (encounterStarted && InNormalForm())
+ {
+ me->UpdateEntry(GetFormEntry("evil"));
+ me->SetFullHealth();
+ me->DespawnOrUnsummon(900000);
+ }
+}
+
+void NPCStaveQuestAI::StorePlayerGUID()
+{
+ if (!playerGUID.IsEmpty())
+ {
+ return;
+ }
+
+ for (ThreatContainer::StorageType::const_iterator itr = threatList.begin(); itr != threatList.end(); ++itr)
+ {
+ if ((*itr)->getTarget()->GetTypeId() == TYPEID_PLAYER)
+ {
+ playerGUID = (*itr)->getUnitGuid();
+ }
+ }
+}
+
+Player* NPCStaveQuestAI::GetGossipPlayer()
+{
+ return ObjectAccessor::GetPlayer(*me, gossipPlayerGUID);
+}
+
+bool NPCStaveQuestAI::IsAllowedEntry(uint32 entry)
+{
+ uint32 allowedEntries[4] = { 0, 12999, 19833, 19921 }; //player, World Invisible Trigger(traps) and snake trap snakes
+ bool isAllowed = std::find(std::begin(allowedEntries), std::end(allowedEntries), entry) != std::end(allowedEntries);
+ return isAllowed;
+}
+
+bool NPCStaveQuestAI::UnitIsUnfair(Unit* unit)
+{
+ if (!unit || playerGUID.IsEmpty())
+ {
+ return false;
+ }
+
+ if (unit->IsPlayer())
+ {
+ if (playerGUID != unit->GetGUID())
+ {
+ return true;
+ }
+ }
+ else
+ {
+ if (unit->GetOwnerGUID() != playerGUID)
+ {
+ // if a creature attacking isn't owned by the player its unfair
+ return true;
+ }
+ else if (!IsAllowedEntry(unit->GetEntry()))
+ {
+ // if not in the whitelist its unfair
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool NPCStaveQuestAI::IsFairFight()
+{
+ for (ThreatContainer::StorageType::const_iterator itr = threatList.begin(); itr != threatList.end(); ++itr)
+ {
+ Unit* unit = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid());
+
+ if (!(*itr)->getThreat())
+ {
+ // if target threat is 0 its fair, this prevents despawn in the case when
+ // there is a bystander since UpdateVictim adds nearby enemies to the threatlist
+ continue;
+ }
+
+ if (UnitIsUnfair(unit))
+ {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool NPCStaveQuestAI::ValidThreatlist()
+{
+ if (threatList.size() == 1)
+ {
+ return true;
+ }
+
+ bool isFair = IsFairFight();
+
+ return isFair;
+}
+
+void NPCStaveQuestAI::SetHomePosition()
+{
+ Position homePosition;
+ me->GetPosition(&homePosition);
+
+ if (homePosition.IsPositionValid())
+ {
+ me->SetHomePosition(homePosition);
+ }
+}
+
+void NPCStaveQuestAI::PrepareForEncounter()
+{
+ encounterStarted = true;
+ me->GetMotionMaster()->MoveIdle();
+ me->GetMotionMaster()->Clear();
+ SetHomePosition();
+
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
+}
+
+void NPCStaveQuestAI::ClearLootIfUnfair(Unit* killer)
+{
+ // Remove loot if there is more than 1 attacker or Player doesn't have the quest
+ // this should prevent party kills and looting the quest item without putting any effort
+ if (attackerGuids.size() > 1 || !PlayerEligibleForReward(killer))
+ {
+ me->loot.clear();
+ return;
+ }
+}
+
+bool NPCStaveQuestAI::PlayerEligibleForReward(Unit* killer)
+{
+ if (!killer)
+ {
+ return true;
+ }
+
+ if (Player* player = killer->ToPlayer())
+ {
+ if (player->GetQuestStatus(QUEST_STAVE_OF_THE_ANCIENTS) != QUEST_STATUS_INCOMPLETE)
+ {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+void NPCStaveQuestAI::StoreAttackerGuidValue(Unit* attacker)
+{
+ if (!attacker)
+ {
+ return;
+ }
+
+ uint64 guidValue = attacker->GetGUID().GetRawValue();
+ bool isGUIDPresent = std::find(attackerGuids.begin(), attackerGuids.end(), guidValue) != attackerGuids.end();
+
+ // don't store snaketrap's snakes and trap triggers
+ if (isGUIDPresent || (IsAllowedEntry(attacker->GetEntry()) && attacker->GetTypeId() != TYPEID_PLAYER))
+ {
+ return;
+ }
+ else
+ {
+ attackerGuids.push_back(guidValue);
+ }
+}
+
+bool NPCStaveQuestAI::QuestIncomplete(Unit* unit, uint32 questItem)
+{
+ if (!unit || !unit->IsPlayer())
+ {
+ return true;
+ }
+
+ QuestStatus questStatus = unit->ToPlayer()->GetQuestStatus(QUEST_STAVE_OF_THE_ANCIENTS);
+ bool hasQuestItem = unit->ToPlayer()->HasItemCount(questItem, 1, true);
+ bool isIncomplete = questStatus == QUEST_STATUS_INCOMPLETE && !hasQuestItem;
+
+ return isIncomplete;
+}
+
+void NPCStaveQuestAI::ResetState(uint32 aura = 0)
+{
+ encounterStarted = false;
+ playerGUID.Clear();
+ attackerGuids.clear();
+
+ if (InNormalForm())
+ {
+ me->m_Events.KillAllEvents(true);
+ me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
+ }
+
+ me->RemoveAura(aura);
+}
+
+void NPCStaveQuestAI::EvadeOnFeignDeath()
+{
+ Player* player = ObjectAccessor::GetPlayer(*me, playerGUID);
+ if (player && player->HasAura(SPELL_FEIGN_DEATH))
+ {
+ EnterEvadeMode();
+ }
+}
+
+void NPCStaveQuestAI::AttackStart(Unit* target)
+{
+ if (playerGUID.IsEmpty() && !InNormalForm())
+ {
+ StorePlayerGUID();
+ }
+
+ ScriptedAI::AttackStart(target);
+}
+
+void NPCStaveQuestAI::AttackedBy(Unit* attacker)
+{
+ StoreAttackerGuidValue(attacker);
+}
+
+void NPCStaveQuestAI::JustDied(Unit* killer)
+{
+ // Prevent looting if killer doesn't have the quest
+ ClearLootIfUnfair(killer);
+}
+
+class npc_artorius : public CreatureScript
+{
+public:
+ npc_artorius() : CreatureScript("npc_artorius") { }
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_artoriusAI(creature);
+ }
+
+ struct npc_artoriusAI : public NPCStaveQuestAI
+ {
+ npc_artoriusAI(Creature *creature) : NPCStaveQuestAI(creature) { }
+
+ EventMap events;
+
+ void Reset() override
+ {
+ ResetState(ARTORIUS_SPELL_STINGING_TRAUMA);
+ events.Reset();
+ }
+
+ void EnterCombat(Unit* victim) override
+ {
+ RevealForm();
+ me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
+
+ if (InNormalForm())
+ {
+ return;
+ }
+
+ if (victim && (UnitIsUnfair(victim) || !QuestIncomplete(victim, ARTORIUS_HEAD)))
+ {
+ me->CastSpell(victim, SPELL_FOOLS_PLIGHT, true);
+ }
+
+ events.ScheduleEvent(EVENT_FOOLS_PLIGHT, urand(2000, 3000));
+ events.ScheduleEvent(EVENT_RANGE_CHECK, 1000);
+ events.ScheduleEvent(EVENT_UNFAIR_FIGHT, 1000);
+ events.ScheduleEvent(ARTORIUS_EVENT_DEMONIC_DOOM, urand(3000, 5000));
+ events.ScheduleEvent(ARTORIUS_EVENT_DEMONIC_ENRAGE, urand(6000, 8000));
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ events.Update(diff);
+ uint32 eventId = events.ExecuteEvent();
+
+ // Out of combat events
+ switch (eventId)
+ {
+ case EVENT_ENCOUNTER_START:
+ me->Say(ARTORIUS_SAY);
+ me->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ events.ScheduleEvent(EVENT_REVEAL, 5000);
+ break;
+ case EVENT_REVEAL:
+ RevealForm();
+ break;
+ }
+
+ if (UpdateVictim())
+ {
+ // This should prevent hunters from staying in combat when feign death is used and there is a bystander with 0 threat
+ EvadeOnFeignDeath();
+ }
+ else
+ {
+ return;
+ }
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ {
+ return;
+ }
+
+ // In combat events
+ switch (eventId)
+ {
+ case EVENT_FOOLS_PLIGHT:
+ if (UnitIsUnfair(me->GetVictim()) || !QuestIncomplete(me->GetVictim(), ARTORIUS_HEAD))
+ {
+ me->CastSpell(me->GetVictim(), SPELL_FOOLS_PLIGHT, true);
+ }
+ events.RepeatEvent(urand(3000, 6000));
+ break;
+ case EVENT_RANGE_CHECK:
+ if (!me->GetVictim()->IsWithinDist2d(me, 60.0f))
+ {
+ EnterEvadeMode();
+ }
+ else
+ {
+ events.RepeatEvent(2000);
+ }
+ break;
+ case EVENT_UNFAIR_FIGHT:
+ if (!ValidThreatlist())
+ {
+ SetHomePosition();
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_ATTACKABLE_1 | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
+ me->DespawnOrUnsummon(5000);
+ break;
+ }
+ events.RepeatEvent(2000);
+ break;
+ case ARTORIUS_EVENT_DEMONIC_DOOM:
+ if (!me->GetVictim()->HasAura(ARTORIUS_SPELL_DEMONIC_DOOM))
+ {
+ me->CastSpell(me->GetVictim(), ARTORIUS_SPELL_DEMONIC_DOOM, false);
+ }
+ events.RepeatEvent(urand(5000, 10000));
+ break;
+ case ARTORIUS_EVENT_DEMONIC_ENRAGE:
+ me->CastSpell(me, SPELL_DEMONIC_ENRAGE, false);
+ events.RepeatEvent(urand(22000, 39000));
+ break;
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ void SpellHit(Unit* /*Caster*/, const SpellInfo* Spell) override
+ {
+ uint32 serpentStings[12] = { 1978, 13549, 13550, 13551, 13552, 13553, 13554, 13555, 25295, 27016, 49000, 49001 };
+
+ if (!InNormalForm())
+ {
+ bool applyAura = std::find(std::begin(serpentStings), std::end(serpentStings), Spell->Id) != std::end(serpentStings);
+
+ if (applyAura)
+ {
+ me->AddAura(ARTORIUS_SPELL_STINGING_TRAUMA, me);
+ me->TextEmote(ARTORIUS_WEAKNESS_EMOTE);
+ }
+ }
+ }
+
+ void DoAction(int32 action) override
+ {
+ if (action == EVENT_ENCOUNTER_START)
+ {
+ PrepareForEncounter();
+ events.ScheduleEvent(EVENT_ENCOUNTER_START, 5000);
+ }
+ }
+ };
+
+ bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 /*action*/) override
+ {
+ CloseGossipMenuFor(player);
+ creature->AI()->DoAction(EVENT_ENCOUNTER_START);
+
+ return true;
+ }
+
+ bool OnGossipHello(Player* player, Creature* creature) override
+ {
+ if (player->GetQuestStatus(QUEST_STAVE_OF_THE_ANCIENTS) == QUEST_STATUS_INCOMPLETE && !player->HasItemCount(ARTORIUS_HEAD, 1, true))
+ {
+ uint32 gossipMenuId = creature->GetCreatureTemplate()->GossipMenuId;
+ AddGossipItemFor(player, gossipMenuId, GOSSIP_EVENT_START_OPTION_ID, GOSSIP_SENDER_MAIN, 0);
+ }
+
+ SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
+
+ return true;
+ }
+};
+
+class npc_precious : public CreatureScript
+{
+public:
+ npc_precious() : CreatureScript("npc_precious") { }
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_preciousAI(creature);
+ }
+
+ struct npc_preciousAI : public NPCStaveQuestAI
+ {
+ npc_preciousAI(Creature *creature) : NPCStaveQuestAI(creature) { }
+
+ EventMap events;
+ bool flaggedForDespawn;
+
+ void InitializeAI() override
+ {
+ flaggedForDespawn = false;
+ }
+
+ void JustReachedHome() override
+ {
+ if (flaggedForDespawn)
+ {
+ me->DespawnOrUnsummon(0);
+ flaggedForDespawn = false;
+ }
+ }
+
+ void Reset() override
+ {
+ ResetState();
+ }
+
+ void EnterCombat(Unit* /*victim*/) override
+ {
+ RevealForm();
+ me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
+ }
+
+ void UpdateAI(uint32 /*diff*/) override
+ {
+ if (UpdateVictim())
+ {
+ // This should prevent hunters from staying in combat when feign death is used and there is a bystander with 0 threat
+ EvadeOnFeignDeath();
+ }
+ else
+ {
+ return;
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ void FlagForDespawn()
+ {
+ flaggedForDespawn = true;
+ }
+ };
+};
+
+class npc_simone : public CreatureScript
+{
+public:
+ npc_simone() : CreatureScript("npc_simone") { }
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_simoneAI(creature);
+ }
+
+ struct npc_simoneAI : public NPCStaveQuestAI
+ {
+ npc_simoneAI(Creature *creature) : NPCStaveQuestAI(creature) { }
+
+ EventMap events;
+ ObjectGuid preciousGUID;
+
+ void SetPreciousGUID()
+ {
+ if (CreatureGroup* formation = me->GetFormation())
+ {
+ const CreatureGroup::CreatureGroupMemberType& members = formation->GetMembers();
+ for (CreatureGroup::CreatureGroupMemberType::const_iterator itr = members.begin(); itr != members.end(); ++itr)
+ {
+ if (itr->first && itr->first->GetOriginalEntry() == PRECIOUS_NORMAL_ENTRY)
+ {
+ preciousGUID = itr->first->GetGUID();
+ }
+ }
+ }
+ }
+
+ Creature* Precious()
+ {
+ if (preciousGUID.IsEmpty())
+ {
+ SetPreciousGUID();
+ }
+
+ if (!preciousGUID.IsEmpty())
+ {
+ return ObjectAccessor::GetCreature(*me, preciousGUID);
+ }
+
+ return nullptr;
+ }
+
+ npc_precious::npc_preciousAI* PreciousAI()
+ {
+ if (Precious())
+ {
+ return CAST_AI(npc_precious::npc_preciousAI, Precious()->AI());
+ }
+
+ return nullptr;
+ }
+
+ void RespawnPet()
+ {
+ Position current;
+ me->GetNearPosition(current, -5.0f, 0.0f);
+ Precious()->RemoveCorpse(false, false);
+ Precious()->SetPosition(current);
+ Precious()->SetHomePosition(current);
+ Precious()->setDeathState(JUST_RESPAWNED);
+ Precious()->UpdateObjectVisibility(true);
+ }
+
+ void HandlePetRespawn()
+ {
+ if (Precious() && Precious()->isDead())
+ {
+ RespawnPet();
+ }
+ }
+
+ void JustRespawned() override
+ {
+ // Using Respawn() instead of HandlePetRespawn because we want to respawn pet in
+ // normal entry form
+ if (Precious())
+ {
+ Precious()->Respawn();
+ }
+ Reset();
+ }
+
+ void JustDied(Unit* killer) override
+ {
+ NPCStaveQuestAI::JustDied(killer);
+
+ if (!Precious())
+ {
+ return;
+ }
+
+ if (Precious()->isDead())
+ {
+ // Make it so that Precious respawns after Simone
+ uint32 respawnTime = me->GetRespawnTime() - time(nullptr);
+ Precious()->SetRespawnTime(respawnTime);
+ return;
+ }
+
+ Position petResetPos;
+ me->GetNearPosition(petResetPos, -5.0f, 0.0f);
+
+ if (petResetPos.IsPositionValid())
+ {
+ Precious()->SetHomePosition(petResetPos);
+ }
+ }
+
+ void CorpseRemoved(uint32& /*respawnDelay*/) override
+ {
+ if (!Precious())
+ {
+ return;
+ }
+
+ if (Precious()->IsInCombat())
+ {
+ // If Simone corpse is removed but pet is InCombat, EnterEvadeMode and auto despawn on pet reaching home
+ PreciousAI()->EnterEvadeMode();
+ PreciousAI()->FlagForDespawn();
+ }
+ else
+ {
+ Precious()->DespawnOrUnsummon(0);
+ }
+ }
+
+ void Reset() override
+ {
+ ResetState(SIMONE_SPELL_SILENCE);
+ events.Reset();
+
+ events.ScheduleEvent(SIMONE_EVENT_CHECK_PET_STATE, 2000);
+ }
+
+ void EnterCombat(Unit* victim) override
+ {
+ RevealForm();
+ me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
+
+ if (!InNormalForm())
+ {
+ if (victim && (UnitIsUnfair(victim) || !QuestIncomplete(victim, SIMONE_HEAD)))
+ {
+ me->CastSpell(victim, SPELL_FOOLS_PLIGHT, true);
+ }
+
+ events.ScheduleEvent(EVENT_RANGE_CHECK, 1000);
+ events.ScheduleEvent(EVENT_UNFAIR_FIGHT, 1000);
+ events.ScheduleEvent(SIMONE_EVENT_CHAIN_LIGHTNING, 3000);
+ events.ScheduleEvent(SIMONE_EVENT_TEMPTRESS_KISS, 1000);
+ }
+
+ events.ScheduleEvent(EVENT_FOOLS_PLIGHT, urand(2000, 3000));
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ events.Update(diff);
+ uint32 eventId = events.ExecuteEvent();
+
+ // Out of combat events
+ switch (eventId)
+ {
+ case EVENT_ENCOUNTER_START:
+ me->TextEmote(SIMONE_EMOTE, GetGossipPlayer());
+ me->HandleEmoteCommand(EMOTE_ONESHOT_NONE);
+ me->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH);
+ events.ScheduleEvent(SIMONE_EVENT_TALK, 4000);
+ break;
+ case SIMONE_EVENT_TALK:
+ me->Say(SIMONE_SAY, GetGossipPlayer());
+ me->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ if (Precious())
+ {
+ Precious()->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ }
+ events.ScheduleEvent(EVENT_REVEAL, 5000);
+ break;
+ case EVENT_REVEAL:
+ RevealForm();
+ if (PreciousAI())
+ {
+ PreciousAI()->RevealForm();
+ }
+ break;
+ // Prevent hunters from figthing Simone alone
+ case SIMONE_EVENT_CHECK_PET_STATE:
+ if (!me->IsInCombat() && !me->IsInEvadeMode())
+ {
+ if (Precious() && Precious()->isDead())
+ {
+ HandlePetRespawn();
+ }
+
+ events.ScheduleEvent(SIMONE_EVENT_CHECK_PET_STATE, 1000);
+ }
+ break;
+ }
+
+ if (UpdateVictim())
+ {
+ // This should prevent hunters from staying in combat when feign death is used and there is a bystander with 0 threat
+ EvadeOnFeignDeath();
+ }
+ else
+ {
+ return;
+ }
+
+ if (me->HasUnitState(UNIT_STATE_CASTING) && eventId != EVENT_RANGE_CHECK && eventId != EVENT_UNFAIR_FIGHT)
+ {
+ events.RepeatEvent(1000);
+ return;
+ }
+
+ // In combat events
+ switch (eventId)
+ {
+ case EVENT_FOOLS_PLIGHT:
+ if (InNormalForm() || UnitIsUnfair(me->GetVictim()) || !QuestIncomplete(me->GetVictim(), SIMONE_HEAD))
+ {
+ me->CastSpell(me->GetVictim(), SPELL_FOOLS_PLIGHT, true);
+ }
+ events.RepeatEvent(urand(3000, 6000));
+ break;
+ case EVENT_RANGE_CHECK:
+ if (!me->GetVictim()->IsWithinDist2d(me, 60.0f))
+ {
+ EnterEvadeMode();
+ }
+ else
+ {
+ events.RepeatEvent(2000);
+ }
+ break;
+ case EVENT_UNFAIR_FIGHT:
+ if (!ValidThreatlist() || (PreciousAI() && !PreciousAI()->ValidThreatlist()))
+ {
+ SetHomePosition();
+ PreciousAI()->SetHomePosition();
+
+ Precious()->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_ATTACKABLE_1 | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_ATTACKABLE_1 | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
+
+ Precious()->DespawnOrUnsummon(5000);
+
+ me->DespawnOrUnsummon(5000);
+ break;
+ }
+ events.RepeatEvent(2000);
+ break;
+ case SIMONE_EVENT_CHAIN_LIGHTNING:
+ me->CastSpell(me->GetVictim(), SIMONE_SPELL_CHAIN_LIGHTNING, false);
+ events.RepeatEvent(7000);
+ break;
+ case SIMONE_EVENT_TEMPTRESS_KISS:
+ me->CastSpell(me->GetVictim(), SIMONE_SPELL_TEMPTRESS_KISS, false);
+ events.RepeatEvent(45000);
+ break;
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ void SpellHit(Unit* /*Caster*/, const SpellInfo* Spell) override
+ {
+ if (!InNormalForm())
+ {
+ if (Spell->Id == SIMONE_SPELL_WEAKNESS_VIPER_STING)
+ {
+ me->AddAura(SIMONE_SPELL_SILENCE, me);
+ me->TextEmote(SIMONE_WEAKNESS_EMOTE);
+ }
+ }
+ }
+
+ void ScheduleEncounterStart(ObjectGuid playerGUID)
+ {
+ PrepareForEncounter();
+ if (PreciousAI())
+ {
+ PreciousAI()->PrepareForEncounter();
+ }
+ gossipPlayerGUID = playerGUID;
+ events.ScheduleEvent(EVENT_ENCOUNTER_START, 1000);
+ }
+ };
+
+ bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 /*action*/) override
+ {
+ CloseGossipMenuFor(player);
+ if (creature->AI() && CAST_AI(npc_simone::npc_simoneAI, creature->AI()))
+ {
+ CAST_AI(npc_simone::npc_simoneAI, creature->AI())->ScheduleEncounterStart(player->GetGUID());
+ }
+
+ return true;
+ }
+
+ bool OnGossipHello(Player* player, Creature* creature) override
+ {
+ if (player->GetQuestStatus(QUEST_STAVE_OF_THE_ANCIENTS) == QUEST_STATUS_INCOMPLETE && !player->HasItemCount(SIMONE_HEAD, 1, true))
+ {
+ uint32 gossipMenuId = creature->GetCreatureTemplate()->GossipMenuId;
+ AddGossipItemFor(player, gossipMenuId, GOSSIP_EVENT_START_OPTION_ID, GOSSIP_SENDER_MAIN, 0);
+ }
+
+ SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
+
+ return true;
+ }
+};
+
+class npc_nelson : public CreatureScript
+{
+public:
+ npc_nelson() : CreatureScript("npc_nelson") { }
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_nelsonAI(creature);
+ }
+
+ struct npc_nelsonAI : public NPCStaveQuestAI
+ {
+ npc_nelsonAI(Creature *creature) : NPCStaveQuestAI(creature) { }
+
+ EventMap events;
+ bool shouldDespawn;
+
+ void JustSummoned(Creature* summon) override
+ {
+ if (!summon)
+ {
+ return;
+ }
+
+ // Workaround for increasing the Summoned Guardian damage by using the template modifier value
+ summon->Unit::UpdateDamagePhysical(BASE_ATTACK);
+
+ if (me->IsInCombat())
+ {
+ summon->AI()->AttackStart(me->GetVictim());
+ }
+ }
+
+ void SummonedCreatureDies(Creature* /*summon*/, Unit* killer) override
+ {
+ // This should trigger the despawn event when a another player or unit
+ // kills a creeping doom unit
+ if (UnitIsUnfair(killer))
+ {
+ shouldDespawn = true;
+ }
+ }
+
+ void Reset() override
+ {
+ ResetState(NELSON_SPELL_CRIPPLING_CLIP);
+ shouldDespawn = false;
+ events.Reset();
+
+ me->RemoveAllMinionsByEntry(CREEPING_DOOM_ENTRY);
+ }
+
+ void EnterCombat(Unit* victim) override
+ {
+ RevealForm();
+ me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
+
+ if (InNormalForm())
+ {
+ return;
+ }
+
+ if (encounterStarted)
+ {
+ me->CastSpell(me, NELSON_SPELL_SOUL_FLAME, true);
+ }
+
+ if (victim && (UnitIsUnfair(victim) || !QuestIncomplete(victim, NELSON_HEAD)))
+ {
+ me->CastSpell(victim, SPELL_FOOLS_PLIGHT, true);
+ }
+
+ events.ScheduleEvent(EVENT_FOOLS_PLIGHT, urand(2000, 3000));
+ events.ScheduleEvent(EVENT_RANGE_CHECK, 1000);
+ events.ScheduleEvent(EVENT_UNFAIR_FIGHT, 1000);
+ events.ScheduleEvent(NELSON_EVENT_DREADFUL_FRIGHT, 10000);
+ events.ScheduleEvent(NELSON_EVENT_CREEPING_DOOM, 5000);
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ events.Update(diff);
+ uint32 eventId = events.ExecuteEvent();
+
+ // Out of combat events
+ switch (eventId)
+ {
+ case EVENT_ENCOUNTER_START:
+ me->Say(NELSON_SAY);
+ me->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ events.ScheduleEvent(EVENT_REVEAL, 5000);
+ break;
+ case EVENT_REVEAL:
+ RevealForm();
+ break;
+ }
+
+ if (UpdateVictim())
+ {
+ // This should prevent hunters from staying in combat when feign death is used and there is a bystander with 0 threat
+ EvadeOnFeignDeath();
+ }
+ else
+ {
+ return;
+ }
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ {
+ events.RepeatEvent(1000);
+ return;
+ }
+
+ // In combat events
+ switch (eventId)
+ {
+ case EVENT_FOOLS_PLIGHT:
+ if (UnitIsUnfair(me->GetVictim()) || !QuestIncomplete(me->GetVictim(), NELSON_HEAD))
+ {
+ me->CastSpell(me->GetVictim(), SPELL_FOOLS_PLIGHT, true);
+ }
+ events.RepeatEvent(urand(3000, 6000));
+ break;
+ case EVENT_RANGE_CHECK:
+ if (!me->GetVictim()->IsWithinDist2d(me, 60.0f))
+ {
+ EnterEvadeMode();
+ }
+ else
+ {
+ events.RepeatEvent(2000);
+ }
+ break;
+ case EVENT_UNFAIR_FIGHT:
+ if (!ValidThreatlist() || shouldDespawn)
+ {
+ SetHomePosition();
+ me->RemoveAllMinionsByEntry(CREEPING_DOOM_ENTRY);
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_ATTACKABLE_1 | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
+ me->CombatStop(true);
+ me->Say(NELSON_DESPAWN_SAY);
+ me->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
+ me->DespawnOrUnsummon(5000);
+ break;
+ }
+ events.RepeatEvent(2000);
+ break;
+ case NELSON_EVENT_DREADFUL_FRIGHT:
+ me->CastSpell(me->GetVictim(), NELSON_SPELL_DREADFUL_FRIGHT, false);
+ events.RepeatEvent(urand(12000, 19000));
+ break;
+ case NELSON_EVENT_CREEPING_DOOM:
+ me->CastSpell(me->GetVictim(), NELSON_SPELL_CREEPING_DOOM, false);
+ events.RepeatEvent(urand(10000, 12000));
+ break;
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ void SpellHit(Unit* /*Caster*/, const SpellInfo* Spell) override
+ {
+ if (InNormalForm())
+ {
+ return;
+ }
+
+ if (me->HasAura(NELSON_SPELL_SOUL_FLAME) && me->HasAura(NELSON_WEAKNESS_FROST_TRAP))
+ {
+ me->RemoveAura(NELSON_SPELL_SOUL_FLAME);
+ }
+
+ if (!me->HasAura(NELSON_SPELL_CRIPPLING_CLIP) && Spell->Id == NELSON_WEAKNESS_WING_CLIP)
+ {
+ me->AddAura(NELSON_SPELL_CRIPPLING_CLIP, me);
+ me->TextEmote(NELSON_WEAKNESS_EMOTE);
+ }
+ }
+
+ void DoAction(int32 action) override
+ {
+ if (action == EVENT_ENCOUNTER_START)
+ {
+ PrepareForEncounter();
+ events.ScheduleEvent(EVENT_ENCOUNTER_START, 5000);
+ }
+ }
+ };
+
+ bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 /*action*/) override
+ {
+ CloseGossipMenuFor(player);
+ creature->AI()->DoAction(EVENT_ENCOUNTER_START);
+
+ return true;
+ }
+
+ bool OnGossipHello(Player* player, Creature* creature) override
+ {
+ if (player->GetQuestStatus(QUEST_STAVE_OF_THE_ANCIENTS) == QUEST_STATUS_INCOMPLETE && !player->HasItemCount(NELSON_HEAD, 1, true))
+ {
+ uint32 gossipMenuId = creature->GetCreatureTemplate()->GossipMenuId;
+ AddGossipItemFor(player, gossipMenuId, GOSSIP_EVENT_START_OPTION_ID, GOSSIP_SENDER_MAIN, 0);
+ }
+
+ SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
+
+ return true;
+ }
+};
+
+class npc_franklin : public CreatureScript
+{
+public:
+ npc_franklin() : CreatureScript("npc_franklin") { }
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_franklinAI(creature);
+ }
+
+ struct npc_franklinAI : public NPCStaveQuestAI
+ {
+ npc_franklinAI(Creature *creature) : NPCStaveQuestAI(creature) { }
+
+ EventMap events;
+
+ void Reset() override
+ {
+ ResetState();
+ events.Reset();
+ }
+
+ void EnterCombat(Unit* victim) override
+ {
+ RevealForm();
+ me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
+
+ if (!InNormalForm())
+ {
+ if (victim && (UnitIsUnfair(victim) || !QuestIncomplete(victim, FRANKLIN_HEAD)))
+ {
+ me->CastSpell(victim, SPELL_FOOLS_PLIGHT, true);
+ }
+
+ events.ScheduleEvent(FRANKLIN_EVENT_DEMONIC_ENRAGE, urand(9000, 13000));
+ events.ScheduleEvent(EVENT_RANGE_CHECK, 1000);
+ events.ScheduleEvent(EVENT_UNFAIR_FIGHT, 1000);
+ }
+
+ events.ScheduleEvent(EVENT_FOOLS_PLIGHT, urand(2000, 3000));
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ events.Update(diff);
+ uint32 eventId = events.ExecuteEvent();
+
+ // Out of combat events
+ switch (eventId)
+ {
+ case EVENT_ENCOUNTER_START:
+ me->Say(FRANKLIN_SAY, GetGossipPlayer());
+ me->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ events.ScheduleEvent(EVENT_REVEAL, 5000);
+ break;
+ case EVENT_REVEAL:
+ RevealForm();
+ break;
+ }
+
+ if (UpdateVictim())
+ {
+ // This should prevent hunters from staying in combat when feign death is used and there is a bystander with 0 threat
+ EvadeOnFeignDeath();
+ }
+ else
+ {
+ return;
+ }
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ {
+ events.RepeatEvent(1000);
+ return;
+ }
+
+ // In combat events
+ switch (eventId)
+ {
+ case EVENT_FOOLS_PLIGHT:
+ if (InNormalForm() || UnitIsUnfair(me->GetVictim()) || !QuestIncomplete(me->GetVictim(), FRANKLIN_HEAD))
+ {
+ me->CastSpell(me->GetVictim(), SPELL_FOOLS_PLIGHT, true);
+ }
+ events.RepeatEvent(urand(3000, 6000));
+ break;
+ case EVENT_RANGE_CHECK:
+ if (!me->GetVictim()->IsWithinDist2d(me, 60.0f))
+ {
+ EnterEvadeMode();
+ }
+ else
+ {
+ events.RepeatEvent(2000);
+ }
+ break;
+ case EVENT_UNFAIR_FIGHT:
+ if (!ValidThreatlist())
+ {
+ SetHomePosition();
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_ATTACKABLE_1 | UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
+ me->CombatStop(true);
+ me->Say(FRANKLIN_DESPAWN_SAY);
+ me->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
+ me->DespawnOrUnsummon(5000);
+ break;
+ }
+ events.RepeatEvent(2000);
+ break;
+ case FRANKLIN_EVENT_DEMONIC_ENRAGE:
+ me->CastSpell(me, SPELL_DEMONIC_ENRAGE, false);
+ me->TextEmote(FRANKLIN_ENRAGE_EMOTE);
+ events.RepeatEvent(urand(9000, 22000));
+ break;
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ void SpellHit(Unit* /*Caster*/, const SpellInfo* Spell) override
+ {
+ if (InNormalForm())
+ {
+ return;
+ }
+
+ if (Spell->Id == FRANKLIN_WEAKNESS_SCORPID_STING)
+ {
+ me->CastSpell(me, FRANKLIN_SPELL_ENTROPIC_STING, false);
+ }
+ }
+
+ void ScheduleEncounterStart(ObjectGuid playerGUID)
+ {
+ PrepareForEncounter();
+ gossipPlayerGUID = playerGUID;
+ events.ScheduleEvent(EVENT_ENCOUNTER_START, 5000);
+ }
+ };
+
+ bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 /*action*/) override
+ {
+ CloseGossipMenuFor(player);
+ if (creature->AI() && CAST_AI(npc_franklin::npc_franklinAI, creature->AI()))
+ {
+ CAST_AI(npc_franklin::npc_franklinAI, creature->AI())->ScheduleEncounterStart(player->GetGUID());
+ }
+
+ return true;
+ }
+
+ bool OnGossipHello(Player* player, Creature* creature) override
+ {
+ if (player->GetQuestStatus(QUEST_STAVE_OF_THE_ANCIENTS) == QUEST_STATUS_INCOMPLETE && !player->HasItemCount(FRANKLIN_HEAD, 1, true))
+ {
+ uint32 gossipMenuId = creature->GetCreatureTemplate()->GossipMenuId;
+ AddGossipItemFor(player, gossipMenuId, GOSSIP_EVENT_START_OPTION_ID, GOSSIP_SENDER_MAIN, 0);
+ }
+
+ SendGossipMenuFor(player, player->GetGossipTextId(creature), creature->GetGUID());
+
+ return true;
+ }
+};
+
+void AddSC_npc_stave_of_ancients()
+{
+ new npc_artorius();
+ new npc_precious();
+ new npc_simone();
+ new npc_nelson();
+ new npc_franklin();
+}
diff --git a/src/server/scripts/World/npc_stave_of_ancients.h b/src/server/scripts/World/npc_stave_of_ancients.h
new file mode 100644
index 000000000..8cd6b4054
--- /dev/null
+++ b/src/server/scripts/World/npc_stave_of_ancients.h
@@ -0,0 +1,212 @@
+/*
+ * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Affero General Public License as published by the
+ * Free Software Foundation; either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see .
+ */
+
+#ifndef NPC_STAVE_OF_ANCIENTS_H
+#define NPC_STAVE_OF_ANCIENTS_H
+
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+
+enum Common
+{
+ // Gossip
+ GOSSIP_EVENT_START_OPTION_ID = 0,
+
+ // Events
+ EVENT_ENCOUNTER_START = 1,
+ EVENT_REVEAL = 2,
+ EVENT_FOOLS_PLIGHT = 3,
+ EVENT_RANGE_CHECK = 4,
+ EVENT_UNFAIR_FIGHT = 5,
+
+ QUEST_STAVE_OF_THE_ANCIENTS = 7636,
+
+ // Spells
+ // Player
+ SPELL_FEIGN_DEATH = 5384,
+ // NPC
+ SPELL_DEMONIC_ENRAGE = 23257,
+ SPELL_FOOLS_PLIGHT = 23504,
+};
+
+enum NPCArtorius
+{
+ ARTORIUS_EVENT_DEMONIC_DOOM = 6,
+ ARTORIUS_EVENT_DEMONIC_ENRAGE = 7,
+
+ ARTORIUS_WEAKNESS_EMOTE = 9786, // broadcast_text.ID "%s is stricken by a virulent poison."
+ ARTORIUS_SAY = 9787, // broadcast_text.ID "Your soul is mine, weakling."
+
+ ARTORIUS_NORMAL_ENTRY = 14531, // creature_template.entry
+ ARTORIUS_EVIL_ENTRY = 14535, // creature_template.entry
+
+ ARTORIUS_HEAD = 18955, // item_template.entry
+
+ ARTORIUS_SPELL_DEMONIC_DOOM = 23298,
+ ARTORIUS_SPELL_STINGING_TRAUMA = 23299
+};
+
+enum NPCSimone
+{
+ SIMONE_EVENT_TALK = 6,
+ SIMONE_EVENT_CHECK_PET_STATE = 7,
+ SIMONE_EVENT_CHAIN_LIGHTNING = 8,
+ SIMONE_EVENT_TEMPTRESS_KISS = 9,
+
+ SIMONE_EMOTE = 9759, // broadcast_text.ID "%s laughs at your foolish request."
+ SIMONE_SAY = 9760, // broadcast_text.ID "As you wish, $c."
+ SIMONE_WEAKNESS_EMOTE = 9762, // broadcast_text.ID "%s is silenced by the venomous sting."
+
+ SIMONE_NORMAL_ENTRY = 14527, // creature_template.entry
+ SIMONE_EVIL_ENTRY = 14533, // creature_template.entry
+
+ SIMONE_HEAD = 18952, // item_template.entry
+
+ SIMONE_SPELL_WEAKNESS_VIPER_STING = 3034,
+ SIMONE_SPELL_TEMPTRESS_KISS = 23205,
+ SIMONE_SPELL_CHAIN_LIGHTNING = 23206,
+ // Found 23207 using spell editor it matches the duration, it doesn't have animation and the id is close to the other simone spells
+ SIMONE_SPELL_SILENCE = 23207
+};
+
+enum NPCPrecious
+{
+ PRECIOUS_NORMAL_ENTRY = 14528,
+ PRECIOUS_EVIL_ENTRY = 14538
+};
+
+enum NPCNelson
+{
+ NELSON_EVENT_DREADFUL_FRIGHT = 6,
+ NELSON_EVENT_CREEPING_DOOM = 7,
+
+ NELSON_SAY = 9782, // broadcast_text.ID "You dare challenge me? Prepare for an e..."
+ NELSON_WEAKNESS_EMOTE = 9785, // breadcast_text.ID "%s is immobilized."
+ NELSON_DESPAWN_SAY = 9815, // breadcast_text.ID "Only a fool would remain in this battle..."
+
+ NELSON_NORMAL_ENTRY = 14536, // creature_template.entry
+ NELSON_EVIL_ENTRY = 14530, // creature_template.entry
+ CREEPING_DOOM_ENTRY = 14761,
+
+ NELSON_HEAD = 18954, // item_template.entry
+
+ NELSON_WEAKNESS_WING_CLIP = 2974,
+ NELSON_WEAKNESS_FROST_TRAP = 13810,
+
+ NELSON_SPELL_SOUL_FLAME = 23272,
+ NELSON_SPELL_DREADFUL_FRIGHT = 23275,
+ NELSON_SPELL_CRIPPLING_CLIP = 23279,
+ NELSON_SPELL_CREEPING_DOOM = 23589
+};
+
+enum NPCFranklin
+{
+ FRANKLIN_EVENT_DEMONIC_ENRAGE = 6,
+
+ FRANKLIN_SAY = 9772, // broadcast_text.ID "I shall enjoy this, $c."
+ FRANKLIN_ENRAGE_EMOTE = 9764, // broadcast_text.ID "%s goes into a killing frenzy!"
+ FRANKLIN_DESPAWN_SAY = 9815, // breadcast_text.ID "Only a fool would remain in this battle..."
+
+ FRANKLIN_NORMAL_ENTRY = 14529,
+ FRANKLIN_EVIL_ENTRY = 14534,
+
+ FRANKLIN_HEAD = 18953, // item_template.entry
+
+ FRANKLIN_WEAKNESS_SCORPID_STING = 3043,
+
+ FRANKLIN_SPELL_ENTROPIC_STING = 23260
+};
+
+struct NPCStaveQuestAI : public ScriptedAI
+{
+ NPCStaveQuestAI(Creature *creature) : ScriptedAI(creature) { }
+
+ ObjectGuid gossipPlayerGUID;
+ ObjectGuid playerGUID;
+ bool encounterStarted;
+ ThreatContainer::StorageType const& threatList = me->getThreatMgr().getThreatList();
+
+ std::map entryKeys = {
+ { ARTORIUS_NORMAL_ENTRY, 1 },
+ { ARTORIUS_EVIL_ENTRY, 1 },
+ { SIMONE_NORMAL_ENTRY, 2 },
+ { SIMONE_EVIL_ENTRY, 2 },
+ { PRECIOUS_NORMAL_ENTRY, 3 },
+ { PRECIOUS_EVIL_ENTRY, 3 },
+ { NELSON_NORMAL_ENTRY, 4 },
+ { NELSON_EVIL_ENTRY, 4 },
+ { FRANKLIN_NORMAL_ENTRY, 5 },
+ { FRANKLIN_EVIL_ENTRY, 5 }
+ };
+ std::map> entryList = {
+ {
+ 1, {
+ {"normal", ARTORIUS_NORMAL_ENTRY},
+ {"evil", ARTORIUS_EVIL_ENTRY}
+ }
+ },
+ {
+ 2, {
+ {"normal", SIMONE_NORMAL_ENTRY},
+ {"evil", SIMONE_EVIL_ENTRY}
+ }
+ },
+ {
+ 3, {
+ {"normal", PRECIOUS_NORMAL_ENTRY},
+ {"evil", PRECIOUS_EVIL_ENTRY}
+ }
+ },
+ {
+ 4, {
+ {"normal", NELSON_NORMAL_ENTRY},
+ {"evil", NELSON_EVIL_ENTRY}
+ }
+ },
+ {
+ 5, {
+ {"normal", FRANKLIN_NORMAL_ENTRY},
+ {"evil", FRANKLIN_EVIL_ENTRY}
+ }
+ }
+ };
+ std::vector attackerGuids;
+
+ uint32 GetFormEntry(std::string /*type*/);
+ bool InNormalForm();
+ void RevealForm();
+ void StorePlayerGUID();
+ Player* GetGossipPlayer();
+ bool IsAllowedEntry(uint32 /*entry*/);
+ bool UnitIsUnfair(Unit* unit);
+ bool IsFairFight();
+ bool ValidThreatlist();
+ void SetHomePosition();
+ void PrepareForEncounter();
+ void ClearLootIfUnfair(Unit* killer);
+ bool PlayerEligibleForReward(Unit* killer);
+ void StoreAttackerGuidValue(Unit* attacker);
+ bool QuestIncomplete(Unit* unit, uint32 questItem);
+ void ResetState(uint32 /*aura*/);
+ void EvadeOnFeignDeath();
+
+ virtual void AttackStart(Unit* /*target*/);
+ virtual void AttackedBy(Unit* /*attacker*/);
+ virtual void JustDied(Unit* /*killer*/);
+};
+
+#endif
diff --git a/src/server/scripts/World/world_script_loader.cpp b/src/server/scripts/World/world_script_loader.cpp
index c814d4134..e5be6e0aa 100644
--- a/src/server/scripts/World/world_script_loader.cpp
+++ b/src/server/scripts/World/world_script_loader.cpp
@@ -31,6 +31,7 @@ void AddSC_chat_log(); // location: scripts\World\chat_log.cpp
void AddSC_character_creation();
void AddSC_action_ip_logger(); // location: scripts\World\action_ip_logger.cpp
void AddSC_player_scripts();
+void AddSC_npc_stave_of_ancients();
// The name of this function should match:
// void Add${NameOfDirectory}Scripts()
@@ -51,4 +52,5 @@ void AddWorldScripts()
AddSC_character_creation();
AddSC_action_ip_logger(); // location: scripts\World\action_ip_logger.cpp
AddSC_player_scripts();
+ AddSC_npc_stave_of_ancients();
}