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(); }