diff options
19 files changed, 556 insertions, 460 deletions
diff --git a/sql/FULL/world_script_waypoints.sql b/sql/FULL/world_script_waypoints.sql index 07f6a020a35..3d705cd501d 100644 --- a/sql/FULL/world_script_waypoints.sql +++ b/sql/FULL/world_script_waypoints.sql @@ -13,6 +13,117 @@ CREATE TABLE script_waypoint ( PRIMARY KEY (entry, pointid) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Script Creature waypoints'; +DELETE FROM script_waypoint WHERE entry=21027; +INSERT INTO script_waypoint VALUES +(21027, 0, -2714.697266, 1326.879395, 34.306953, 0, ''), +(21027, 1, -2666.364990, 1348.222656, 34.445557, 0, ''), +(21027, 2, -2693.789307, 1336.964966, 34.445557, 0, ''), +(21027, 3, -2715.495361, 1328.054443, 34.106014, 0, ''), +(21027, 4, -2742.530762, 1314.138550, 33.606144, 0, ''), +(21027, 5, -2745.077148, 1311.108765, 33.630898, 0, ''), +(21027, 6, -2749.855225, 1302.737915, 33.475632, 0, ''), +(21027, 7, -2753.639648, 1294.059448, 33.314930, 0, ''), +(21027, 8, -2756.796387, 1285.122192, 33.391262, 0, ''), +(21027, 9, -2750.042969, 1273.661987, 33.188259, 0, ''), +(21027, 10, -2740.378418, 1258.846680, 33.212521, 0, ''), +(21027, 11, -2733.629395, 1248.259766, 33.640598, 0, ''), +(21027, 12, -2727.212646, 1238.606445, 33.520847, 0, ''), +(21027, 13, -2726.377197, 1237.264526, 33.461823, 3000, 'SAY_WIL_PROGRESS1'), +(21027, 14, -2746.383301, 1266.390625, 33.191952, 2000, ''), +(21027, 15, -2746.383301, 1266.390625, 33.191952, 4000, 'SAY_WIL_FIND_EXIT'), +(21027, 16, -2758.927734, 1285.134155, 33.341728, 0, ''), +(21027, 17, -2761.845703, 1292.313599, 33.209042, 0, ''), +(21027, 18, -2758.871826, 1300.677612, 33.285332, 0, ''), +(21027, 19, -2753.928955, 1307.755859, 33.452457, 0, ''), +(21027, 20, -2738.612061, 1316.191284, 33.482975, 0, ''), +(21027, 21, -2727.897461, 1320.013916, 33.381111, 0, ''), +(21027, 22, -2709.458740, 1315.739990, 33.301838, 0, ''), +(21027, 23, -2704.658936, 1301.620361, 32.463303, 0, ''), +(21027, 24, -2704.120117, 1298.922607, 32.768162, 0, ''), +(21027, 25, -2691.798340, 1292.846436, 33.852642, 0, ''), +(21027, 26, -2682.879639, 1288.853882, 32.995399, 0, ''), +(21027, 27, -2661.869141, 1279.682495, 26.686783, 0, ''), +(21027, 28, -2648.943604, 1270.272827, 24.147522, 0, ''), +(21027, 29, -2642.506836, 1262.938721, 23.512444, 0, ''), +(21027, 30, -2636.984863, 1252.429077, 20.418257, 0, ''), +(21027, 31, -2648.113037, 1224.984863, 8.691818, 0, ''), +(21027, 32, -2658.393311, 1200.136719, 5.492243, 0, ''), +(21027, 33, -2668.504395, 1190.450562, 3.127407, 0, ''), +(21027, 34, -2685.930420, 1174.360840, 5.163924, 0, ''), +(21027, 35, -2701.613770, 1160.026367, 5.611311, 0, ''), +(21027, 36, -2714.659668, 1149.980347, 4.342373, 0, ''), +(21027, 37, -2721.443359, 1145.002808, 1.913474, 0, ''), +(21027, 38, -2733.962158, 1143.436279, 2.620415, 0, ''), +(21027, 39, -2757.876709, 1146.937500, 6.184002, 2000, 'SAY_WIL_JUST_AHEAD'), +(21027, 40, -2772.300537, 1166.052734, 6.331811, 0, ''), +(21027, 41, -2790.265381, 1189.941650, 5.207958, 0, ''), +(21027, 42, -2805.448975, 1208.663940, 5.557623, 0, ''), +(21027, 43, -2820.617676, 1225.870239, 6.266103, 0, ''), +(21027, 44, -2831.926758, 1237.725830, 5.808506, 0, ''), +(21027, 45, -2842.578369, 1252.869629, 6.807481, 0, ''), +(21027, 46, -2846.344971, 1258.727295, 7.386168, 0, ''), +(21027, 47, -2847.556396, 1266.771729, 8.208790, 0, ''), +(21027, 48, -2841.654541, 1285.809204, 7.933223, 0, ''), +(21027, 49, -2841.754883, 1289.832520, 6.990304, 0, ''), +(21027, 50, -2871.398438, 1302.348145, 6.807335, 7500, 'SAY_WIL_END'); + +DELETE FROM script_waypoint WHERE entry=3465; +INSERT INTO script_waypoint VALUES +(3465, 0, -2095.840820, -3650.001221, 61.716, 0, ''), +(3465, 1, -2100.193604, -3613.949219, 61.604, 0, ''), +(3465, 2, -2098.549561, -3601.557129, 59.154, 0, ''), +(3465, 3, -2093.796387, -3595.234375, 56.658, 0, ''), +(3465, 4, -2072.575928, -3578.827637, 48.844, 0, ''), +(3465, 5, -2023.858398, -3568.146240, 24.636, 0, ''), +(3465, 6, -2013.576416, -3571.499756, 22.203, 0, ''), +(3465, 7, -2009.813721, -3580.547852, 21.791, 0, ''), +(3465, 8, -2015.296021, -3597.387695, 21.760, 0, ''), +(3465, 9, -2020.677368, -3610.296143, 21.759, 0, ''), +(3465, 10, -2019.990845, -3640.155273, 21.759, 0, ''), +(3465, 11, -2016.110596, -3664.133301, 21.758, 0, ''), +(3465, 12, -1999.397095, -3679.435059, 21.316, 0, ''), +(3465, 13, -1987.455811, -3688.309326, 18.495, 0, ''), +(3465, 14, -1973.966553, -3687.666748, 14.996, 0, ''), +(3465, 15, -1949.163940, -3678.054932, 11.293, 0, ''), +(3465, 16, -1934.091187, -3682.859619, 9.897, 30000, 'SAY_GIL_AT_LAST'), +(3465, 17, -1935.383911, -3682.322021, 10.029, 1500, 'SAY_GIL_PROCEED'), +(3465, 18, -1879.039185, -3699.498047, 6.582, 7500, 'SAY_GIL_FREEBOOTERS'), +(3465, 19, -1852.728149, -3703.778809, 6.875, 0, ''), +(3465, 20, -1812.989990, -3718.500732, 10.572, 0, ''), +(3465, 21, -1788.171265, -3722.867188, 9.663, 0, ''), +(3465, 22, -1767.206665, -3739.923096, 10.082, 0, ''), +(3465, 23, -1750.194580, -3747.392090, 10.390, 0, ''), +(3465, 24, -1729.335571, -3776.665527, 11.779, 0, ''), +(3465, 25, -1715.997925, -3802.404541, 12.618, 0, ''), +(3465, 26, -1690.711548, -3829.262451, 13.905, 0, ''), +(3465, 27, -1674.700684, -3842.398682, 13.872, 0, ''), +(3465, 28, -1632.726318, -3846.109619, 14.401, 0, ''), +(3465, 29, -1592.734497, -3842.225342, 14.981, 0, ''), +(3465, 30, -1561.614746, -3839.320801, 19.118, 0, ''), +(3465, 31, -1544.567627, -3834.393311, 18.761, 0, ''), +(3465, 32, -1512.514404, -3831.715820, 22.914, 0, ''), +(3465, 33, -1486.889771, -3836.639893, 23.964, 0, ''), +(3465, 34, -1434.193604, -3852.702881, 18.843, 0, ''), +(3465, 35, -1405.794678, -3854.488037, 17.276, 0, ''), +(3465, 36, -1366.592041, -3852.383789, 19.273, 0, ''), +(3465, 37, -1337.360962, -3837.827148, 17.352, 2000, 'SAY_GIL_ALMOST'), +(3465, 38, -1299.744507, -3810.691406, 20.801, 0, ''), +(3465, 39, -1277.144409, -3782.785156, 25.918, 0, ''), +(3465, 40, -1263.686768, -3781.251953, 26.447, 0, ''), +(3465, 41, -1243.674438, -3786.328125, 25.281, 0, ''), +(3465, 42, -1221.875488, -3784.124512, 24.051, 0, ''), +(3465, 43, -1204.011230, -3775.943848, 24.437, 0, ''), +(3465, 44, -1181.706787, -3768.934082, 23.368, 0, ''), +(3465, 45, -1156.913818, -3751.559326, 21.074, 0, ''), +(3465, 46, -1138.830688, -3741.809326, 17.843, 0, ''), +(3465, 47, -1080.101196, -3738.780029, 19.805, 0, 'SAY_GIL_SWEET'), +(3465, 48, -1069.065186, -3735.006348, 19.302, 0, ''), +(3465, 49, -1061.941040, -3724.062256, 21.086, 0, ''), +(3465, 50, -1053.593262, -3697.608643, 27.320, 0, ''), +(3465, 51, -1044.110474, -3690.133301, 24.856, 0, ''), +(3465, 52, -1040.260986, -3690.739014, 25.342, 0, ''), +(3465, 53, -1028.146606, -3688.718750, 23.843, 7500, 'SAY_GIL_FREED'); + DELETE FROM script_waypoint WHERE entry=10646; INSERT INTO script_waypoint VALUES (10646, 0, -4792.401855, -2137.775146, 82.423, 0, ''), diff --git a/sql/FULL/world_scripts_full.sql b/sql/FULL/world_scripts_full.sql index 57c392494c8..26e51a5534f 100644 --- a/sql/FULL/world_scripts_full.sql +++ b/sql/FULL/world_scripts_full.sql @@ -182,6 +182,7 @@ UPDATE `creature_template` SET `ScriptName`='npc_draenei_survivor' WHERE `entry` /* BARRENS */ UPDATE `creature_template` SET `ScriptName`='npc_beaten_corpse' WHERE `entry`=10668; +UPDATE `creature_template` SET `ScriptName`='npc_gilthares' WHERE `entry`=3465; UPDATE `creature_template` SET `ScriptName`='npc_sputtervalve' WHERE `entry`=3442; UPDATE `creature_template` SET `ScriptName`='npc_taskmaster_fizzule' WHERE `entry`=7233; UPDATE `creature_template` SET `ScriptName`='npc_twiggy_flathead' WHERE `entry`=6248; diff --git a/sql/updates/5001_world_scripts.sql b/sql/updates/5001_world_scripts.sql new file mode 100644 index 00000000000..37a4a8620ac --- /dev/null +++ b/sql/updates/5001_world_scripts.sql @@ -0,0 +1,112 @@ +UPDATE creature_template SET ScriptName='npc_gilthares' WHERE entry=3465; + +DELETE FROM script_waypoint WHERE entry=3465; +INSERT INTO script_waypoint VALUES +(3465, 0, -2095.840820, -3650.001221, 61.716, 0, ''), +(3465, 1, -2100.193604, -3613.949219, 61.604, 0, ''), +(3465, 2, -2098.549561, -3601.557129, 59.154, 0, ''), +(3465, 3, -2093.796387, -3595.234375, 56.658, 0, ''), +(3465, 4, -2072.575928, -3578.827637, 48.844, 0, ''), +(3465, 5, -2023.858398, -3568.146240, 24.636, 0, ''), +(3465, 6, -2013.576416, -3571.499756, 22.203, 0, ''), +(3465, 7, -2009.813721, -3580.547852, 21.791, 0, ''), +(3465, 8, -2015.296021, -3597.387695, 21.760, 0, ''), +(3465, 9, -2020.677368, -3610.296143, 21.759, 0, ''), +(3465, 10, -2019.990845, -3640.155273, 21.759, 0, ''), +(3465, 11, -2016.110596, -3664.133301, 21.758, 0, ''), +(3465, 12, -1999.397095, -3679.435059, 21.316, 0, ''), +(3465, 13, -1987.455811, -3688.309326, 18.495, 0, ''), +(3465, 14, -1973.966553, -3687.666748, 14.996, 0, ''), +(3465, 15, -1949.163940, -3678.054932, 11.293, 0, ''), +(3465, 16, -1934.091187, -3682.859619, 9.897, 30000, 'SAY_GIL_AT_LAST'), +(3465, 17, -1935.383911, -3682.322021, 10.029, 1500, 'SAY_GIL_PROCEED'), +(3465, 18, -1879.039185, -3699.498047, 6.582, 7500, 'SAY_GIL_FREEBOOTERS'), +(3465, 19, -1852.728149, -3703.778809, 6.875, 0, ''), +(3465, 20, -1812.989990, -3718.500732, 10.572, 0, ''), +(3465, 21, -1788.171265, -3722.867188, 9.663, 0, ''), +(3465, 22, -1767.206665, -3739.923096, 10.082, 0, ''), +(3465, 23, -1750.194580, -3747.392090, 10.390, 0, ''), +(3465, 24, -1729.335571, -3776.665527, 11.779, 0, ''), +(3465, 25, -1715.997925, -3802.404541, 12.618, 0, ''), +(3465, 26, -1690.711548, -3829.262451, 13.905, 0, ''), +(3465, 27, -1674.700684, -3842.398682, 13.872, 0, ''), +(3465, 28, -1632.726318, -3846.109619, 14.401, 0, ''), +(3465, 29, -1592.734497, -3842.225342, 14.981, 0, ''), +(3465, 30, -1561.614746, -3839.320801, 19.118, 0, ''), +(3465, 31, -1544.567627, -3834.393311, 18.761, 0, ''), +(3465, 32, -1512.514404, -3831.715820, 22.914, 0, ''), +(3465, 33, -1486.889771, -3836.639893, 23.964, 0, ''), +(3465, 34, -1434.193604, -3852.702881, 18.843, 0, ''), +(3465, 35, -1405.794678, -3854.488037, 17.276, 0, ''), +(3465, 36, -1366.592041, -3852.383789, 19.273, 0, ''), +(3465, 37, -1337.360962, -3837.827148, 17.352, 2000, 'SAY_GIL_ALMOST'), +(3465, 38, -1299.744507, -3810.691406, 20.801, 0, ''), +(3465, 39, -1277.144409, -3782.785156, 25.918, 0, ''), +(3465, 40, -1263.686768, -3781.251953, 26.447, 0, ''), +(3465, 41, -1243.674438, -3786.328125, 25.281, 0, ''), +(3465, 42, -1221.875488, -3784.124512, 24.051, 0, ''), +(3465, 43, -1204.011230, -3775.943848, 24.437, 0, ''), +(3465, 44, -1181.706787, -3768.934082, 23.368, 0, ''), +(3465, 45, -1156.913818, -3751.559326, 21.074, 0, ''), +(3465, 46, -1138.830688, -3741.809326, 17.843, 0, ''), +(3465, 47, -1080.101196, -3738.780029, 19.805, 0, 'SAY_GIL_SWEET'), +(3465, 48, -1069.065186, -3735.006348, 19.302, 0, ''), +(3465, 49, -1061.941040, -3724.062256, 21.086, 0, ''), +(3465, 50, -1053.593262, -3697.608643, 27.320, 0, ''), +(3465, 51, -1044.110474, -3690.133301, 24.856, 0, ''), +(3465, 52, -1040.260986, -3690.739014, 25.342, 0, ''), +(3465, 53, -1028.146606, -3688.718750, 23.843, 7500, 'SAY_GIL_FREED'); + +DELETE FROM script_waypoint WHERE entry=21027; +INSERT INTO script_waypoint VALUES +(21027, 0, -2714.697266, 1326.879395, 34.306953, 0, ''), +(21027, 1, -2666.364990, 1348.222656, 34.445557, 0, ''), +(21027, 2, -2693.789307, 1336.964966, 34.445557, 0, ''), +(21027, 3, -2715.495361, 1328.054443, 34.106014, 0, ''), +(21027, 4, -2742.530762, 1314.138550, 33.606144, 0, ''), +(21027, 5, -2745.077148, 1311.108765, 33.630898, 0, ''), +(21027, 6, -2749.855225, 1302.737915, 33.475632, 0, ''), +(21027, 7, -2753.639648, 1294.059448, 33.314930, 0, ''), +(21027, 8, -2756.796387, 1285.122192, 33.391262, 0, ''), +(21027, 9, -2750.042969, 1273.661987, 33.188259, 0, ''), +(21027, 10, -2740.378418, 1258.846680, 33.212521, 0, ''), +(21027, 11, -2733.629395, 1248.259766, 33.640598, 0, ''), +(21027, 12, -2727.212646, 1238.606445, 33.520847, 0, ''), +(21027, 13, -2726.377197, 1237.264526, 33.461823, 3000, 'SAY_WIL_PROGRESS1'), +(21027, 14, -2746.383301, 1266.390625, 33.191952, 2000, ''), +(21027, 15, -2746.383301, 1266.390625, 33.191952, 4000, 'SAY_WIL_FIND_EXIT'), +(21027, 16, -2758.927734, 1285.134155, 33.341728, 0, ''), +(21027, 17, -2761.845703, 1292.313599, 33.209042, 0, ''), +(21027, 18, -2758.871826, 1300.677612, 33.285332, 0, ''), +(21027, 19, -2753.928955, 1307.755859, 33.452457, 0, ''), +(21027, 20, -2738.612061, 1316.191284, 33.482975, 0, ''), +(21027, 21, -2727.897461, 1320.013916, 33.381111, 0, ''), +(21027, 22, -2709.458740, 1315.739990, 33.301838, 0, ''), +(21027, 23, -2704.658936, 1301.620361, 32.463303, 0, ''), +(21027, 24, -2704.120117, 1298.922607, 32.768162, 0, ''), +(21027, 25, -2691.798340, 1292.846436, 33.852642, 0, ''), +(21027, 26, -2682.879639, 1288.853882, 32.995399, 0, ''), +(21027, 27, -2661.869141, 1279.682495, 26.686783, 0, ''), +(21027, 28, -2648.943604, 1270.272827, 24.147522, 0, ''), +(21027, 29, -2642.506836, 1262.938721, 23.512444, 0, ''), +(21027, 30, -2636.984863, 1252.429077, 20.418257, 0, ''), +(21027, 31, -2648.113037, 1224.984863, 8.691818, 0, ''), +(21027, 32, -2658.393311, 1200.136719, 5.492243, 0, ''), +(21027, 33, -2668.504395, 1190.450562, 3.127407, 0, ''), +(21027, 34, -2685.930420, 1174.360840, 5.163924, 0, ''), +(21027, 35, -2701.613770, 1160.026367, 5.611311, 0, ''), +(21027, 36, -2714.659668, 1149.980347, 4.342373, 0, ''), +(21027, 37, -2721.443359, 1145.002808, 1.913474, 0, ''), +(21027, 38, -2733.962158, 1143.436279, 2.620415, 0, ''), +(21027, 39, -2757.876709, 1146.937500, 6.184002, 2000, 'SAY_WIL_JUST_AHEAD'), +(21027, 40, -2772.300537, 1166.052734, 6.331811, 0, ''), +(21027, 41, -2790.265381, 1189.941650, 5.207958, 0, ''), +(21027, 42, -2805.448975, 1208.663940, 5.557623, 0, ''), +(21027, 43, -2820.617676, 1225.870239, 6.266103, 0, ''), +(21027, 44, -2831.926758, 1237.725830, 5.808506, 0, ''), +(21027, 45, -2842.578369, 1252.869629, 6.807481, 0, ''), +(21027, 46, -2846.344971, 1258.727295, 7.386168, 0, ''), +(21027, 47, -2847.556396, 1266.771729, 8.208790, 0, ''), +(21027, 48, -2841.654541, 1285.809204, 7.933223, 0, ''), +(21027, 49, -2841.754883, 1289.832520, 6.990304, 0, ''), +(21027, 50, -2871.398438, 1302.348145, 6.807335, 7500, 'SAY_WIL_END'); diff --git a/src/bindings/scripts/scripts/npc/npc_escortAI.cpp b/src/bindings/scripts/scripts/npc/npc_escortAI.cpp index 48991193e51..b04c349eb96 100644 --- a/src/bindings/scripts/scripts/npc/npc_escortAI.cpp +++ b/src/bindings/scripts/scripts/npc/npc_escortAI.cpp @@ -20,27 +20,53 @@ enum extern std::list<PointMovement> PointMovementList; -void npc_escortAI::AttackStart(Unit *who) +void npc_escortAI::AttackStart(Unit* pWho) { - if (!who) + if (!pWho) return; - if (m_creature->Attack(who, true)) + if (m_creature->Attack(pWho, true)) { if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == POINT_MOTION_TYPE) m_creature->GetMotionMaster()->MovementExpired(); if (IsCombatMovement()) - m_creature->GetMotionMaster()->MoveChase(who); + m_creature->GetMotionMaster()->MoveChase(pWho); } } -void npc_escortAI::MoveInLineOfSight(Unit *who) +void npc_escortAI::MoveInLineOfSight(Unit* pWho) { if (IsBeingEscorted && !m_bIsActiveAttacker) return; - ScriptedAI::MoveInLineOfSight(who); + ScriptedAI::MoveInLineOfSight(pWho); +} + +void npc_escortAI::JustDied(Unit* pKiller) +{ + if (!IsBeingEscorted || !PlayerGUID || !m_pQuestForEscort) + return; + + if (Player* pPlayer = Unit::GetPlayer(PlayerGUID)) + { + if (Group* pGroup = pPlayer->GetGroup()) + { + for(GroupReference* pRef = pGroup->GetFirstMember(); pRef != NULL; pRef = pRef->next()) + { + if (Player* pMember = pRef->getSource()) + { + if (pPlayer->GetQuestStatus(m_pQuestForEscort->GetQuestId()) == QUEST_STATUS_INCOMPLETE) + pPlayer->FailQuest(m_pQuestForEscort->GetQuestId()); + } + } + } + else + { + if (pPlayer->GetQuestStatus(m_pQuestForEscort->GetQuestId()) == QUEST_STATUS_INCOMPLETE) + pPlayer->FailQuest(m_pQuestForEscort->GetQuestId()); + } + } } void npc_escortAI::JustRespawned() @@ -51,7 +77,11 @@ void npc_escortAI::JustRespawned() if (!IsCombatMovement()) SetCombatMovement(true); - m_uiWPWaitTimer = 0; + //add a small delay before going to first waypoint, normal in near all cases + m_uiWPWaitTimer = 2500; + + if (m_creature->getFaction() != m_creature->GetCreatureInfo()->faction_A) + me->RestoreFaction(); Reset(); } @@ -82,12 +112,12 @@ void npc_escortAI::EnterEvadeMode() Reset(); } -void npc_escortAI::UpdateAI(const uint32 diff) +void npc_escortAI::UpdateAI(const uint32 uiDiff) { //Waypoint Updating if (IsBeingEscorted && !m_creature->getVictim() && m_uiWPWaitTimer && !m_bIsReturning) { - if (m_uiWPWaitTimer <= diff) + if (m_uiWPWaitTimer <= uiDiff) { //End of the line if (CurrentWP == WaypointList.end()) @@ -133,13 +163,15 @@ void npc_escortAI::UpdateAI(const uint32 diff) debug_log("TSCR: EscortAI Next WP is: %u, %f, %f, %f", CurrentWP->id, CurrentWP->x, CurrentWP->y, CurrentWP->z); m_uiWPWaitTimer = 0; } - }else m_uiWPWaitTimer -= diff; + } + else + m_uiWPWaitTimer -= uiDiff; } //Check if player or any member of his group is within range if (IsBeingEscorted && PlayerGUID && !m_creature->getVictim() && !m_bIsReturning) { - if (m_uiPlayerCheckTimer < diff) + if (m_uiPlayerCheckTimer < uiDiff) { bool bIsMaxRangeExceeded = true; @@ -167,9 +199,7 @@ void npc_escortAI::UpdateAI(const uint32 diff) if (DespawnAtFar && bIsMaxRangeExceeded) { - debug_log("TSCR: EscortAI Evaded back to spawn point because player/group was to far away or not found"); - - JustDied(m_creature); + debug_log("TSCR: EscortAI failed because player/group was to far away or not found"); if (m_bCanInstantRespawn) { @@ -183,20 +213,22 @@ void npc_escortAI::UpdateAI(const uint32 diff) } m_uiPlayerCheckTimer = 1000; - }else m_uiPlayerCheckTimer -= diff; + } + else + m_uiPlayerCheckTimer -= uiDiff; } if (CanMelee && UpdateVictim()) DoMeleeAttackIfReady(); } -void npc_escortAI::MovementInform(uint32 type, uint32 id) +void npc_escortAI::MovementInform(uint32 uiMoveType, uint32 uiPointId) { - if (type != POINT_MOTION_TYPE || !IsBeingEscorted) + if (uiMoveType != POINT_MOTION_TYPE || !IsBeingEscorted) return; //Combat start position reached, continue waypoint movement - if (id == POINT_LAST_POINT) + if (uiPointId == POINT_LAST_POINT) { debug_log("TSCR: EscortAI has returned to original position before combat"); @@ -210,7 +242,7 @@ void npc_escortAI::MovementInform(uint32 type, uint32 id) if (!m_uiWPWaitTimer) m_uiWPWaitTimer = 1; } - else if (id == POINT_HOME) + else if (uiPointId == POINT_HOME) { debug_log("TSCR: EscortAI has returned to original home location and will continue from beginning of waypoint list."); @@ -220,9 +252,9 @@ void npc_escortAI::MovementInform(uint32 type, uint32 id) else { //Make sure that we are still on the right waypoint - if (CurrentWP->id != id) + if (CurrentWP->id != uiPointId) { - debug_log("TSCR ERROR: EscortAI reached waypoint out of order %d, expected %d", id, CurrentWP->id); + debug_log("TSCR ERROR: EscortAI reached waypoint out of order %d, expected %d", uiPointId, CurrentWP->id); return; } @@ -352,8 +384,5 @@ void npc_escortAI::Start(bool bIsActiveAttacker, bool bRun, uint64 uiPlayerGUID, else m_creature->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE); - //Start WP - m_creature->GetMotionMaster()->MovePoint(CurrentWP->id, CurrentWP->x, CurrentWP->y, CurrentWP->z); - debug_log("TSCR: EscortAI Next WP is: %d, %f, %f, %f", CurrentWP->id, CurrentWP->x, CurrentWP->y, CurrentWP->z); IsBeingEscorted = true; } diff --git a/src/bindings/scripts/scripts/npc/npc_escortAI.h b/src/bindings/scripts/scripts/npc/npc_escortAI.h index cda331e6121..90a99152b68 100644 --- a/src/bindings/scripts/scripts/npc/npc_escortAI.h +++ b/src/bindings/scripts/scripts/npc/npc_escortAI.h @@ -31,7 +31,7 @@ struct TRINITY_DLL_DECL npc_escortAI : public ScriptedAI { public: explicit npc_escortAI(Creature* pCreature) : ScriptedAI(pCreature), - IsBeingEscorted(false), IsOnHold(false), PlayerGUID(0), MaxPlayerDistance(DEFAULT_MAX_PLAYER_DISTANCE), CanMelee(true), m_uiPlayerCheckTimer(1000), m_uiWPWaitTimer(0), m_bIsReturning(false), m_bIsActiveAttacker(true), m_bIsRunning(false), DespawnAtEnd(true), DespawnAtFar(true), m_pQuestForEscort(NULL), m_bCanInstantRespawn(false), m_bCanReturnToStart(false) {} + IsBeingEscorted(false), IsOnHold(false), PlayerGUID(0), MaxPlayerDistance(DEFAULT_MAX_PLAYER_DISTANCE), CanMelee(true), m_uiPlayerCheckTimer(1000), m_uiWPWaitTimer(2500), m_bIsReturning(false), m_bIsActiveAttacker(true), m_bIsRunning(false), DespawnAtEnd(true), DespawnAtFar(true), m_pQuestForEscort(NULL), m_bCanInstantRespawn(false), m_bCanReturnToStart(false) {} ~npc_escortAI() {} // Pure Virtual Functions @@ -42,6 +42,8 @@ struct TRINITY_DLL_DECL npc_escortAI : public ScriptedAI void MoveInLineOfSight(Unit* who); + void JustDied(Unit*); + void JustRespawned(); void ReturnToLastPoint(); diff --git a/src/bindings/scripts/scripts/zone/arathi_highlands/arathi_highlands.cpp b/src/bindings/scripts/scripts/zone/arathi_highlands/arathi_highlands.cpp index 45261fb745e..98d589ed009 100644 --- a/src/bindings/scripts/scripts/zone/arathi_highlands/arathi_highlands.cpp +++ b/src/bindings/scripts/scripts/zone/arathi_highlands/arathi_highlands.cpp @@ -88,7 +88,6 @@ struct TRINITY_DLL_DECL npc_professor_phizzlethorpeAI : public npc_escortAI void Reset() { m_bCompleted = true; - m_creature->setFaction(35); } void EnterCombat(Unit* who) @@ -96,16 +95,6 @@ struct TRINITY_DLL_DECL npc_professor_phizzlethorpeAI : public npc_escortAI DoScriptText(SAY_AGGRO, m_creature, NULL); } - void JustDied(Unit* killer) - { - if (PlayerGUID && !m_bCompleted) - { - Player* pPlayer = Unit::GetPlayer(PlayerGUID); - if (pPlayer) - CAST_PLR(pPlayer)->FailQuest(QUEST_SUNKEN_TREASURE); - } - } - void UpdateAI(const uint32 diff) { npc_escortAI::UpdateAI(diff); diff --git a/src/bindings/scripts/scripts/zone/ashenvale_forest/ashenvale.cpp b/src/bindings/scripts/scripts/zone/ashenvale_forest/ashenvale.cpp index 646192c983a..3fd7d1ef791 100644 --- a/src/bindings/scripts/scripts/zone/ashenvale_forest/ashenvale.cpp +++ b/src/bindings/scripts/scripts/zone/ashenvale_forest/ashenvale.cpp @@ -106,18 +106,6 @@ struct TRINITY_DLL_DECL npc_torekAI : public npc_escortAI summoned->AI()->AttackStart(m_creature); } - void JustDied(Unit* killer) - { - if (killer->GetEntry() == m_creature->GetEntry()) - return; - - if (PlayerGUID && !Completed) - { - if (Player* pPlayer = Unit::GetPlayer(PlayerGUID)) - CAST_PLR(pPlayer)->FailQuest(QUEST_TOREK_ASSULT); - } - } - void UpdateAI(const uint32 diff) { npc_escortAI::UpdateAI(diff); @@ -212,9 +200,6 @@ struct TRINITY_DLL_DECL npc_ruul_snowhoofAI : public npc_escortAI void Reset() { - if (!IsBeingEscorted) - m_creature->setFaction(1602); - GameObject* Cage = m_creature->FindNearestGameObject(GO_CAGE, 20); if (Cage) Cage->SetGoState(GO_STATE_READY); @@ -225,16 +210,6 @@ struct TRINITY_DLL_DECL npc_ruul_snowhoofAI : public npc_escortAI summoned->AI()->AttackStart(m_creature); } - void JustDied(Unit* killer) - { - if (PlayerGUID) - { - Player* pPlayer = Unit::GetPlayer(PlayerGUID); - if (pPlayer) - CAST_PLR(pPlayer)->FailQuest(QUEST_FREEDOM_TO_RUUL); - } - } - void UpdateAI(const uint32 diff) { npc_escortAI::UpdateAI(diff); diff --git a/src/bindings/scripts/scripts/zone/azuremyst_isle/azuremyst_isle.cpp b/src/bindings/scripts/scripts/zone/azuremyst_isle/azuremyst_isle.cpp index 414a2468b52..8fc97d40228 100644 --- a/src/bindings/scripts/scripts/zone/azuremyst_isle/azuremyst_isle.cpp +++ b/src/bindings/scripts/scripts/zone/azuremyst_isle/azuremyst_isle.cpp @@ -367,26 +367,7 @@ struct TRINITY_DLL_DECL npc_magwinAI : public npc_escortAI DoScriptText(SAY_AGGRO, m_creature, who); } - void Reset() - { - if (!IsBeingEscorted) - m_creature->setFaction(80); - } - - void JustDied(Unit* killer) - { - if (PlayerGUID) - { - Player* pPlayer = Unit::GetPlayer(PlayerGUID); - if (pPlayer) - pPlayer->FailQuest(QUEST_A_CRY_FOR_SAY_HELP); - } - } - - void UpdateAI(const uint32 diff) - { - npc_escortAI::UpdateAI(diff); - } + void Reset() { } }; bool QuestAccept_npc_magwin(Player* pPlayer, Creature* pCreature, Quest const* quest) diff --git a/src/bindings/scripts/scripts/zone/barrens/the_barrens.cpp b/src/bindings/scripts/scripts/zone/barrens/the_barrens.cpp index 4fc39d1dcdf..0d6d176fd41 100644 --- a/src/bindings/scripts/scripts/zone/barrens/the_barrens.cpp +++ b/src/bindings/scripts/scripts/zone/barrens/the_barrens.cpp @@ -17,12 +17,13 @@ /* ScriptData SDName: The_Barrens SD%Complete: 90 -SDComment: Quest support: 2458, 4921, 6981, 1719, 863 +SDComment: Quest support: 863, 898, 1719, 2458, 4921, 6981, SDCategory: Barrens EndScriptData */ /* ContentData npc_beaten_corpse +npc_gilthares npc_sputtervalve npc_taskmaster_fizzule npc_twiggy_flathead @@ -63,6 +64,111 @@ bool GossipSelect_npc_beaten_corpse(Player* pPlayer, Creature* pCreature, uint32 } /*###### +# npc_gilthares +######*/ + +enum +{ + SAY_GIL_START = -1000370, + SAY_GIL_AT_LAST = -1000371, + SAY_GIL_PROCEED = -1000372, + SAY_GIL_FREEBOOTERS = -1000373, + SAY_GIL_AGGRO_1 = -1000374, + SAY_GIL_AGGRO_2 = -1000375, + SAY_GIL_AGGRO_3 = -1000376, + SAY_GIL_AGGRO_4 = -1000377, + SAY_GIL_ALMOST = -1000378, + SAY_GIL_SWEET = -1000379, + SAY_GIL_FREED = -1000380, + + QUEST_FREE_FROM_HOLD = 898, + AREA_MERCHANT_COAST = 391, + FACTION_ESCORTEE = 232 //guessed, possible not needed for this quest +}; + +struct TRINITY_DLL_DECL npc_giltharesAI : public npc_escortAI +{ + npc_giltharesAI(Creature* pCreature) : npc_escortAI(pCreature) { } + + void Reset() { } + + void WaypointReached(uint32 uiPointId) + { + Player* pPlayer = (Player*)Unit::GetUnit(*m_creature, PlayerGUID); + + if (!pPlayer) + return; + + switch(uiPointId) + { + case 16: + DoScriptText(SAY_GIL_AT_LAST, m_creature, pPlayer); + break; + case 17: + DoScriptText(SAY_GIL_PROCEED, m_creature, pPlayer); + break; + case 18: + DoScriptText(SAY_GIL_FREEBOOTERS, m_creature, pPlayer); + break; + case 37: + DoScriptText(SAY_GIL_ALMOST, m_creature, pPlayer); + break; + case 47: + DoScriptText(SAY_GIL_SWEET, m_creature, pPlayer); + break; + case 53: + DoScriptText(SAY_GIL_FREED, m_creature, pPlayer); + pPlayer->GroupEventHappens(QUEST_FREE_FROM_HOLD, m_creature); + break; + } + } + + void Aggro(Unit* pWho) + { + //not always use + if (rand()%4) + return; + + //only aggro text if not player and only in this area + if (pWho->GetTypeId() != TYPEID_PLAYER && m_creature->GetAreaId() == AREA_MERCHANT_COAST) + { + //appears to be pretty much random (possible only if escorter not in combat with pWho yet?) + switch(rand()%4) + { + case 0: DoScriptText(SAY_GIL_AGGRO_1, m_creature, pWho); break; + case 1: DoScriptText(SAY_GIL_AGGRO_2, m_creature, pWho); break; + case 2: DoScriptText(SAY_GIL_AGGRO_3, m_creature, pWho); break; + case 3: DoScriptText(SAY_GIL_AGGRO_4, m_creature, pWho); break; + } + } + } +}; + +CreatureAI* GetAI_npc_gilthares(Creature* pCreature) +{ + npc_giltharesAI* pTempAI = new npc_giltharesAI(pCreature); + + pTempAI->FillPointMovementListForCreature(); + + return (CreatureAI*)pTempAI; +} + +bool QuestAccept_npc_gilthares(Player* pPlayer, Creature* pCreature, const Quest* pQuest) +{ + if (pQuest->GetQuestId() == QUEST_FREE_FROM_HOLD) + { + pCreature->setFaction(FACTION_ESCORTEE); + pCreature->SetStandState(UNIT_STAND_STATE_STAND); + + DoScriptText(SAY_GIL_START, pCreature, pPlayer); + + if (npc_giltharesAI* pEscortAI = CAST_AI(npc_giltharesAI, pCreature->AI())) + pEscortAI->Start(false, false, pPlayer->GetGUID(), pQuest); + } + return true; +} + +/*###### ## npc_sputtervalve ######*/ @@ -424,12 +530,7 @@ enum struct TRINITY_DLL_DECL npc_wizzlecrank_shredderAI : public npc_escortAI { - npc_wizzlecrank_shredderAI(Creature* c) : npc_escortAI(c) - { - uiNormFaction = c->getFaction(); - } - - uint32 uiNormFaction; + npc_wizzlecrank_shredderAI(Creature* c) : npc_escortAI(c) { } bool Completed; @@ -475,28 +576,10 @@ struct TRINITY_DLL_DECL npc_wizzlecrank_shredderAI : public npc_escortAI Completed = false; if (!IsBeingEscorted) { - m_creature->setFaction(uiNormFaction); if (m_creature->getStandState() == UNIT_STAND_STATE_DEAD) m_creature->SetStandState(UNIT_STAND_STATE_STAND); } } - - void EnterCombat(Unit* who){} - - void JustDied(Unit* killer) - { - if (PlayerGUID && !Completed) - { - Player* pPlayer = Unit::GetPlayer(PlayerGUID); - if (pPlayer) - pPlayer->FailQuest(QUEST_ESCAPE); - } - } - - void UpdateAI(const uint32 diff) - { - npc_escortAI::UpdateAI(diff); - } }; bool QuestAccept_npc_wizzlecrank_shredder(Player* pPlayer, Creature* pCreature, Quest const* quest) @@ -561,6 +644,12 @@ void AddSC_the_barrens() newscript->RegisterSelf(); newscript = new Script; + newscript->Name = "npc_gilthares"; + newscript->GetAI = &GetAI_npc_gilthares; + newscript->pQuestAccept = &QuestAccept_npc_gilthares; + newscript->RegisterSelf(); + + newscript = new Script; newscript->Name="npc_sputtervalve"; newscript->pGossipHello = &GossipHello_npc_sputtervalve; newscript->pGossipSelect = &GossipSelect_npc_sputtervalve; diff --git a/src/bindings/scripts/scripts/zone/feralas/feralas.cpp b/src/bindings/scripts/scripts/zone/feralas/feralas.cpp index 7383b2b23c2..f0320a5e443 100644 --- a/src/bindings/scripts/scripts/zone/feralas/feralas.cpp +++ b/src/bindings/scripts/scripts/zone/feralas/feralas.cpp @@ -80,12 +80,7 @@ enum struct TRINITY_DLL_DECL npc_oox22feAI : public npc_escortAI { - npc_oox22feAI(Creature* pCreature) : npc_escortAI(pCreature) - { - normFaction = pCreature->getFaction(); - } - - uint32 normFaction; + npc_oox22feAI(Creature* pCreature) : npc_escortAI(pCreature) { } void WaypointReached(uint32 i) { @@ -127,10 +122,7 @@ struct TRINITY_DLL_DECL npc_oox22feAI : public npc_escortAI void Reset() { if (!IsBeingEscorted) - { - m_creature->setFaction(normFaction); m_creature->SetStandState(UNIT_STAND_STATE_DEAD); - } } void EnterCombat(Unit* who) @@ -147,24 +139,6 @@ struct TRINITY_DLL_DECL npc_oox22feAI : public npc_escortAI { summoned->AI()->AttackStart(m_creature); } - - void JustDied(Unit* killer) - { - if (!IsBeingEscorted) - return; - - if (Player* pPlayer = Unit::GetPlayer(PlayerGUID)) - { - // If NPC dies, player fails the quest - if (pPlayer->GetQuestStatus(QUEST_RESCUE_OOX22FE) != QUEST_STATUS_COMPLETE) - pPlayer->FailQuest(QUEST_RESCUE_OOX22FE); - } - } - - void UpdateAI(const uint32 diff) - { - npc_escortAI::UpdateAI(diff); - } }; CreatureAI* GetAI_npc_oox22fe(Creature* pCreature) diff --git a/src/bindings/scripts/scripts/zone/ghostlands/ghostlands.cpp b/src/bindings/scripts/scripts/zone/ghostlands/ghostlands.cpp index f1cf9688354..94c45af786a 100644 --- a/src/bindings/scripts/scripts/zone/ghostlands/ghostlands.cpp +++ b/src/bindings/scripts/scripts/zone/ghostlands/ghostlands.cpp @@ -213,31 +213,10 @@ struct TRINITY_DLL_DECL npc_ranger_lilathaAI : public npc_escortAI } } - void EnterCombat(Unit* who) {} - void Reset() { - if (!IsBeingEscorted) - m_creature->setFaction(1602); - - GameObject* Cage = me->FindNearestGameObject(GO_CAGE, 20); - if (Cage) - Cage->SetGoState(GO_STATE_READY); - } - - void JustDied(Unit* killer) - { - if (PlayerGUID) - { - Player* pPlayer = Unit::GetPlayer(PlayerGUID); - if (pPlayer) - CAST_PLR(pPlayer)->FailQuest(QUEST_ESCAPE_FROM_THE_CATACOMBS); - } - } - - void UpdateAI(const uint32 diff) - { - npc_escortAI::UpdateAI(diff); + if (GameObject* Cage = me->FindNearestGameObject(GO_CAGE, 20)) + Cage->SetGoState(GO_STATE_READY); } }; diff --git a/src/bindings/scripts/scripts/zone/hellfire_peninsula/hellfire_peninsula.cpp b/src/bindings/scripts/scripts/zone/hellfire_peninsula/hellfire_peninsula.cpp index 5aaf6e342b7..ec2f1c91f13 100644 --- a/src/bindings/scripts/scripts/zone/hellfire_peninsula/hellfire_peninsula.cpp +++ b/src/bindings/scripts/scripts/zone/hellfire_peninsula/hellfire_peninsula.cpp @@ -181,11 +181,7 @@ struct TRINITY_DLL_DECL npc_wounded_blood_elfAI : public npc_escortAI } } - void Reset() - { - if (!IsBeingEscorted) - m_creature->setFaction(1604); - } + void Reset() { } void EnterCombat(Unit* who) { @@ -197,25 +193,6 @@ struct TRINITY_DLL_DECL npc_wounded_blood_elfAI : public npc_escortAI { summoned->AI()->AttackStart(m_creature); } - - void JustDied(Unit* killer) - { - if (!IsBeingEscorted) - return; - - if (PlayerGUID) - { - // If NPC dies, player fails the quest - Player* pPlayer = Unit::GetPlayer(PlayerGUID); - if (pPlayer) - pPlayer->FailQuest(QUEST_ROAD_TO_FALCON_WATCH); - } - } - - void UpdateAI(const uint32 diff) - { - npc_escortAI::UpdateAI(diff); - } }; CreatureAI* GetAI_npc_wounded_blood_elf(Creature* pCreature) diff --git a/src/bindings/scripts/scripts/zone/shadowmoon_valley/shadowmoon_valley.cpp b/src/bindings/scripts/scripts/zone/shadowmoon_valley/shadowmoon_valley.cpp index 77d8b52cd1b..04cc0140864 100644 --- a/src/bindings/scripts/scripts/zone/shadowmoon_valley/shadowmoon_valley.cpp +++ b/src/bindings/scripts/scripts/zone/shadowmoon_valley/shadowmoon_valley.cpp @@ -855,211 +855,184 @@ bool QuestAccept_npc_overlord_morghor(Player* pPlayer, Creature* pCreature, cons # npc_earthmender_wilda ####*/ -#define SAY_START -1000223 -#define SAY_AGGRO1 -1000224 -#define SAY_AGGRO2 -1000225 -#define ASSASSIN_SAY_AGGRO1 -1000226 -#define ASSASSIN_SAY_AGGRO2 -1000227 -#define SAY_PROGRESS1 -1000228 -#define SAY_PROGRESS2 -1000229 -#define SAY_PROGRESS3 -1000230 -#define SAY_PROGRESS4 -1000231 -#define SAY_PROGRESS5 -1000232 -#define SAY_PROGRESS6 -1000233 -#define SAY_END -1000234 - -#define QUEST_ESCAPE_FROM_COILSKAR_CISTERN 10451 -#define NPC_COILSKAR_ASSASSIN 21044 +enum +{ + SAY_WIL_START = -1000381, + SAY_WIL_AGGRO1 = -1000382, + SAY_WIL_AGGRO2 = -1000383, + SAY_WIL_PROGRESS1 = -1000384, + SAY_WIL_PROGRESS2 = -1000385, + SAY_WIL_FIND_EXIT = -1000386, + SAY_WIL_PROGRESS4 = -1000387, + SAY_WIL_PROGRESS5 = -1000388, + SAY_WIL_JUST_AHEAD = -1000389, + SAY_WIL_END = -1000390, + + SPELL_CHAIN_LIGHTNING = 16006, + SPELL_EARTHBING_TOTEM = 15786, + SPELL_FROST_SHOCK = 12548, + SPELL_HEALING_WAVE = 12491, + + QUEST_ESCAPE_COILSCAR = 10451, + NPC_COILSKAR_ASSASSIN = 21044, + FACTION_EARTHEN = 1726 //guessed +}; struct TRINITY_DLL_DECL npc_earthmender_wildaAI : public npc_escortAI { - npc_earthmender_wildaAI(Creature *c) : npc_escortAI(c) {} + npc_earthmender_wildaAI(Creature* pCreature) : npc_escortAI(pCreature) { } + + uint32 m_uiHealingTimer; - bool Completed; + void Reset() + { + m_uiHealingTimer = 0; + } - void EnterCombat(Unit *who) + void WaypointReached(uint32 uiPointId) { - Player* pPlayer = Unit::GetPlayer(PlayerGUID); + Player* pPlayer = (Player*)Unit::GetUnit(*m_creature, PlayerGUID); + + if (!pPlayer) + return; + + switch(uiPointId) + { + case 13: + DoScriptText(SAY_WIL_PROGRESS1, m_creature, pPlayer); + DoSpawnAssassin(); + break; + case 14: + DoSpawnAssassin(); + break; + case 15: + DoScriptText(SAY_WIL_FIND_EXIT, m_creature, pPlayer); + break; + case 19: + DoRandomSay(); + break; + case 20: + DoSpawnAssassin(); + break; + case 26: + DoRandomSay(); + break; + case 27: + DoSpawnAssassin(); + break; + case 33: + DoRandomSay(); + break; + case 34: + DoSpawnAssassin(); + break; + case 37: + DoRandomSay(); + break; + case 38: + DoSpawnAssassin(); + break; + case 39: + DoScriptText(SAY_WIL_JUST_AHEAD, m_creature, pPlayer); + break; + case 43: + DoRandomSay(); + break; + case 44: + DoSpawnAssassin(); + break; + case 50: + DoScriptText(SAY_WIL_END, m_creature, pPlayer); + + if (Player* pPlayer = Unit::GetPlayer(PlayerGUID)) + pPlayer->GroupEventHappens(QUEST_ESCAPE_COILSCAR, m_creature); + break; + } + } - if (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_COILSKAR_ASSASSIN) - DoScriptText(SAY_AGGRO2, m_creature, pPlayer); - else DoScriptText(SAY_AGGRO1, m_creature, pPlayer); + void JustSummoned(Creature* pSummoned) + { + if (pSummoned->GetEntry() == NPC_COILSKAR_ASSASSIN) + pSummoned->AI()->AttackStart(m_creature); } - void Reset() + //this is very unclear, random say without no real relevance to script/event + void DoRandomSay() { - m_creature->setFaction(1726); - Completed = false; + switch(rand()%3) + { + case 0: DoScriptText(SAY_WIL_PROGRESS2, m_creature); break; + case 1: DoScriptText(SAY_WIL_PROGRESS4, m_creature); break; + case 2: DoScriptText(SAY_WIL_PROGRESS5, m_creature); break; + } } - void WaypointReached(uint32 i) + void DoSpawnAssassin() { - Player* pPlayer = Unit::GetPlayer(PlayerGUID); + //unknown where they actually appear + float fX, fY, fZ; + m_creature->GetRandomPoint(m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), 15.0f, fX, fY, fZ); - if (!pPlayer) + m_creature->SummonCreature(NPC_COILSKAR_ASSASSIN, fX, fY, fZ, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); + } + + void Aggro(Unit* pWho) + { + //don't always use + if (rand()%5) return; - switch(i) + //only aggro text if not player + if (pWho->GetTypeId() != TYPEID_PLAYER) { - case 0: DoScriptText(SAY_START, m_creature, pPlayer); break; - case 13: DoScriptText(SAY_PROGRESS1, m_creature, pPlayer); - SummonAssassin(); - break; - case 14: SummonAssassin(); break; - case 15: DoScriptText(SAY_PROGRESS3, m_creature, pPlayer); break; - case 19: - switch(rand()%3) - { - case 0: DoScriptText(SAY_PROGRESS2, m_creature, pPlayer); break; - case 1: DoScriptText(SAY_PROGRESS4, m_creature, pPlayer); break; - case 2: DoScriptText(SAY_PROGRESS5, m_creature, pPlayer); break; - } - break; - case 20: SummonAssassin(); break; - case 26: - switch(rand()%3) - { - case 0: DoScriptText(SAY_PROGRESS2, m_creature, pPlayer); break; - case 1: DoScriptText(SAY_PROGRESS4, m_creature, pPlayer); break; - case 2: DoScriptText(SAY_PROGRESS5, m_creature, pPlayer); break; - } - break; - case 27: SummonAssassin(); break; - case 33: - switch(rand()%3) - { - case 0: DoScriptText(SAY_PROGRESS2, m_creature, pPlayer); break; - case 1: DoScriptText(SAY_PROGRESS4, m_creature, pPlayer); break; - case 2: DoScriptText(SAY_PROGRESS5, m_creature, pPlayer); break; - } - break; - case 34: SummonAssassin(); break; - case 37: - switch(rand()%3) - { - case 0: DoScriptText(SAY_PROGRESS2, m_creature, pPlayer); break; - case 1: DoScriptText(SAY_PROGRESS4, m_creature, pPlayer); break; - case 2: DoScriptText(SAY_PROGRESS5, m_creature, pPlayer); break; - } - break; - case 38: SummonAssassin(); break; - case 39: DoScriptText(SAY_PROGRESS6, m_creature, pPlayer); break; - case 43: - switch(rand()%3) - { - case 0: DoScriptText(SAY_PROGRESS2, m_creature, pPlayer); break; - case 1: DoScriptText(SAY_PROGRESS4, m_creature, pPlayer); break; - case 2: DoScriptText(SAY_PROGRESS5, m_creature, pPlayer); break; - } - break; - case 44: SummonAssassin(); break; - case 50: - DoScriptText(SAY_END, m_creature, pPlayer); - CAST_PLR(pPlayer)->GroupEventHappens(QUEST_ESCAPE_FROM_COILSKAR_CISTERN, m_creature); - Completed = true; - break; - } - } - - void SummonAssassin() - { - Player* pPlayer = Unit::GetPlayer(PlayerGUID); - - Unit* CoilskarAssassin = m_creature->SummonCreature(NPC_COILSKAR_ASSASSIN, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), m_creature->GetOrientation(), TEMPSUMMON_DEAD_DESPAWN, 0); - if (CoilskarAssassin) - { - switch(rand()%2) - { - case 0: DoScriptText(ASSASSIN_SAY_AGGRO1, CoilskarAssassin, pPlayer); break; - case 1: DoScriptText(ASSASSIN_SAY_AGGRO2, CoilskarAssassin, pPlayer); break; - } - CAST_CRE(CoilskarAssassin)->AI()->AttackStart(m_creature); - } - else error_log("TSCR ERROR: Coilskar Assassin couldn't be summmoned"); - } - - void JustDied(Unit* killer) - { - if (PlayerGUID && !Completed) - { - Player* pPlayer = Unit::GetPlayer(PlayerGUID); - if (pPlayer) - CAST_PLR(pPlayer)->FailQuest(QUEST_ESCAPE_FROM_COILSKAR_CISTERN); - } - } - - void UpdateAI(const uint32 diff) - { - npc_escortAI::UpdateAI(diff); - } + //appears to be random + switch(rand()%4) + { + case 0: DoScriptText(SAY_WIL_AGGRO1, m_creature, pWho); break; + case 1: DoScriptText(SAY_WIL_AGGRO2, m_creature, pWho); break; + } + } + } + + void UpdateAI(const uint32 uiDiff) + { + npc_escortAI::UpdateAI(uiDiff); + + if (!m_creature->SelectHostilTarget() || !m_creature->getVictim()) + return; + + //TODO: add more abilities + if (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 30) + { + if (m_uiHealingTimer < uiDiff) + { + DoCast(m_creature, SPELL_HEALING_WAVE); + m_uiHealingTimer = 15000; + } + else + m_uiHealingTimer -= uiDiff; + } + } }; -CreatureAI* GetAI_npc_earthmender_wildaAI(Creature* pCreature) +CreatureAI* GetAI_npc_earthmender_wilda(Creature* pCreature) { - npc_earthmender_wildaAI* earthmender_wildaAI = new npc_earthmender_wildaAI(pCreature); - - earthmender_wildaAI->AddWaypoint(0, -2637.466064, 1359.977905, 35.889114, 2000); // SAY_START - earthmender_wildaAI->AddWaypoint(1, -2666.364990, 1348.222656, 34.445557); - earthmender_wildaAI->AddWaypoint(2, -2693.789307, 1336.964966, 34.445557); - earthmender_wildaAI->AddWaypoint(3, -2715.495361, 1328.054443, 34.106014); - earthmender_wildaAI->AddWaypoint(4, -2742.530762, 1314.138550, 33.606144); - earthmender_wildaAI->AddWaypoint(5, -2745.077148, 1311.108765, 33.630898); - earthmender_wildaAI->AddWaypoint(6, -2749.855225, 1302.737915, 33.475632); - earthmender_wildaAI->AddWaypoint(7, -2753.639648, 1294.059448, 33.314930); - earthmender_wildaAI->AddWaypoint(8, -2756.796387, 1285.122192, 33.391262); - earthmender_wildaAI->AddWaypoint(9, -2750.042969, 1273.661987, 33.188259); - earthmender_wildaAI->AddWaypoint(10, -2740.378418, 1258.846680, 33.212521); - earthmender_wildaAI->AddWaypoint(11, -2733.629395, 1248.259766, 33.640598); - earthmender_wildaAI->AddWaypoint(12, -2727.212646, 1238.606445, 33.520847); - earthmender_wildaAI->AddWaypoint(13, -2726.377197, 1237.264526, 33.461823, 4000); // SAY_PROGRESS1 - earthmender_wildaAI->AddWaypoint(14, -2746.383301, 1266.390625, 33.191952, 2000); - earthmender_wildaAI->AddWaypoint(15, -2746.383301, 1266.390625, 33.191952, 4000); // SAY_PROGRESS3 - earthmender_wildaAI->AddWaypoint(16, -2758.927734, 1285.134155, 33.341728); - earthmender_wildaAI->AddWaypoint(17, -2761.845703, 1292.313599, 33.209042); - earthmender_wildaAI->AddWaypoint(18, -2758.871826, 1300.677612, 33.285332); - earthmender_wildaAI->AddWaypoint(19, -2758.871826, 1300.677612, 33.285332); - earthmender_wildaAI->AddWaypoint(20, -2753.928955, 1307.755859, 33.452457); - earthmender_wildaAI->AddWaypoint(20, -2738.612061, 1316.191284, 33.482975); - earthmender_wildaAI->AddWaypoint(21, -2727.897461, 1320.013916, 33.381111); - earthmender_wildaAI->AddWaypoint(22, -2709.458740, 1315.739990, 33.301838); - earthmender_wildaAI->AddWaypoint(23, -2704.658936, 1301.620361, 32.463303); - earthmender_wildaAI->AddWaypoint(24, -2704.120117, 1298.922607, 32.768162); - earthmender_wildaAI->AddWaypoint(25, -2691.798340, 1292.846436, 33.852642); - earthmender_wildaAI->AddWaypoint(26, -2682.879639, 1288.853882, 32.995399); - earthmender_wildaAI->AddWaypoint(27, -2661.869141, 1279.682495, 26.686783); - earthmender_wildaAI->AddWaypoint(28, -2648.943604, 1270.272827, 24.147522); - earthmender_wildaAI->AddWaypoint(29, -2642.506836, 1262.938721, 23.512444); - earthmender_wildaAI->AddWaypoint(20, -2636.984863, 1252.429077, 20.418257); - earthmender_wildaAI->AddWaypoint(31, -2648.113037, 1224.984863, 8.691818); - earthmender_wildaAI->AddWaypoint(32, -2658.393311, 1200.136719, 5.492243); - earthmender_wildaAI->AddWaypoint(33, -2668.504395, 1190.450562, 3.127407); - earthmender_wildaAI->AddWaypoint(34, -2685.930420, 1174.360840, 5.163924); - earthmender_wildaAI->AddWaypoint(35, -2701.613770, 1160.026367, 5.611311); - earthmender_wildaAI->AddWaypoint(36, -2714.659668, 1149.980347, 4.342373); - earthmender_wildaAI->AddWaypoint(37, -2721.443359, 1145.002808, 1.913474); - earthmender_wildaAI->AddWaypoint(38, -2733.962158, 1143.436279, 2.620415); - earthmender_wildaAI->AddWaypoint(39, -2757.876709, 1146.937500, 6.184002, 2000); // SAY_PROGRESS6 - earthmender_wildaAI->AddWaypoint(40, -2772.300537, 1166.052734, 6.331811); - earthmender_wildaAI->AddWaypoint(41, -2790.265381, 1189.941650, 5.207958); - earthmender_wildaAI->AddWaypoint(42, -2805.448975, 1208.663940, 5.557623); - earthmender_wildaAI->AddWaypoint(43, -2820.617676, 1225.870239, 6.266103); - earthmender_wildaAI->AddWaypoint(44, -2831.926758, 1237.725830, 5.808506); - earthmender_wildaAI->AddWaypoint(45, -2842.578369, 1252.869629, 6.807481); - earthmender_wildaAI->AddWaypoint(46, -2846.344971, 1258.727295, 7.386168); - earthmender_wildaAI->AddWaypoint(47, -2847.556396, 1266.771729, 8.208790); - earthmender_wildaAI->AddWaypoint(48, -2841.654541, 1285.809204, 7.933223); - earthmender_wildaAI->AddWaypoint(49, -2841.754883, 1289.832520, 6.990304); - earthmender_wildaAI->AddWaypoint(50, -2871.398438, 1302.348145, 6.807335, 8000); // SAY_END - - return earthmender_wildaAI; + npc_earthmender_wildaAI* pTempAI = new npc_earthmender_wildaAI(pCreature); + + pTempAI->FillPointMovementListForCreature(); + + return (CreatureAI*)pTempAI; } -bool QuestAccept_npc_earthmender_wilda(Player* pPlayer, Creature* creature, Quest const* quest) +bool QuestAccept_npc_earthmender_wilda(Player* pPlayer, Creature* pCreature, const Quest* pQuest) { - if (quest->GetQuestId() == QUEST_ESCAPE_FROM_COILSKAR_CISTERN) + if (pQuest->GetQuestId() == QUEST_ESCAPE_COILSCAR) { - creature->setFaction(113); - CAST_AI(npc_escortAI, (creature->AI()))->Start(true, false, pPlayer->GetGUID()); + DoScriptText(SAY_WIL_START, pCreature, pPlayer); + pCreature->setFaction(FACTION_EARTHEN); + + if (npc_earthmender_wildaAI* pEscortAI = CAST_AI(npc_earthmender_wildaAI, pCreature->AI())) + pEscortAI->Start(false, false, pPlayer->GetGUID(), pQuest); } return true; } diff --git a/src/bindings/scripts/scripts/zone/silverpine_forest/silverpine_forest.cpp b/src/bindings/scripts/scripts/zone/silverpine_forest/silverpine_forest.cpp index aee7c19e8e7..7a9ee81af08 100644 --- a/src/bindings/scripts/scripts/zone/silverpine_forest/silverpine_forest.cpp +++ b/src/bindings/scripts/scripts/zone/silverpine_forest/silverpine_forest.cpp @@ -159,11 +159,6 @@ struct TRINITY_DLL_DECL npc_deathstalker_erlandAI : public npc_escortAI case 1: DoScriptText(SAY_AGGRO_2, m_creature, who);break; } } - - void UpdateAI(const uint32 diff) - { - npc_escortAI::UpdateAI(diff); - } }; bool QuestAccept_npc_deathstalker_erland(Player* pPlayer, Creature* pCreature, Quest const* quest) diff --git a/src/bindings/scripts/scripts/zone/stonetalon_mountains/stonetalon_mountains.cpp b/src/bindings/scripts/scripts/zone/stonetalon_mountains/stonetalon_mountains.cpp index 3cb0ed0abac..92cf6598531 100644 --- a/src/bindings/scripts/scripts/zone/stonetalon_mountains/stonetalon_mountains.cpp +++ b/src/bindings/scripts/scripts/zone/stonetalon_mountains/stonetalon_mountains.cpp @@ -128,23 +128,6 @@ struct TRINITY_DLL_DECL npc_kaya_flathoofAI : public npc_escortAI } void Reset(){} - - void EnterCombat(Unit* who){} - - void JustDied(Unit* killer) - { - if (PlayerGUID) - { - Player* pPlayer = Unit::GetPlayer(PlayerGUID); - if (pPlayer) - CAST_PLR(pPlayer)->FailQuest(QUEST_PROTECT_KAYA); - } - } - - void UpdateAI(const uint32 diff) - { - npc_escortAI::UpdateAI(diff); - } }; bool QuestAccept_npc_kaya_flathoof(Player* pPlayer, Creature* pCreature, Quest const* quest) diff --git a/src/bindings/scripts/scripts/zone/tanaris/tanaris.cpp b/src/bindings/scripts/scripts/zone/tanaris/tanaris.cpp index 6b19c687116..a44aa564c2e 100644 --- a/src/bindings/scripts/scripts/zone/tanaris/tanaris.cpp +++ b/src/bindings/scripts/scripts/zone/tanaris/tanaris.cpp @@ -407,24 +407,7 @@ struct TRINITY_DLL_DECL npc_OOX17AI : public npc_escortAI { summoned->AI()->AttackStart(m_creature); } - - void JustDied(Unit* killer) - { - if (PlayerGUID) - { - if (Player* pPlayer = Unit::GetPlayer(PlayerGUID)) - CAST_PLR(pPlayer)->FailQuest(Q_OOX17); - } - } - - - void UpdateAI(const uint32 diff) - { - npc_escortAI::UpdateAI(diff); - if (!UpdateVictim()) - return; - } - }; +}; bool QuestAccept_npc_OOX17(Player* pPlayer, Creature* pCreature, Quest const* quest) { diff --git a/src/bindings/scripts/scripts/zone/thousand_needles/thousand_needles.cpp b/src/bindings/scripts/scripts/zone/thousand_needles/thousand_needles.cpp index 7ce66b28430..c0b4f806916 100644 --- a/src/bindings/scripts/scripts/zone/thousand_needles/thousand_needles.cpp +++ b/src/bindings/scripts/scripts/zone/thousand_needles/thousand_needles.cpp @@ -22,6 +22,7 @@ SDCategory: Thousand Needles EndScriptData */ /* ContentData +npc_lakota_windsong npc_swiftmountain npc_plucky EndContentData */ @@ -96,15 +97,6 @@ struct TRINITY_DLL_DECL npc_lakota_windsongAI : public npc_escortAI m_afBanditLoc[i+uiAmbushId][0], m_afBanditLoc[i+uiAmbushId][1], m_afBanditLoc[i+uiAmbushId][2], 0.0f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); } - - void JustDied(Unit* pKiller) - { - if (Player* pPlayer = (Player*)Unit::GetUnit(*m_creature, PlayerGUID)) - { - if (pPlayer->GetQuestStatus(QUEST_FREE_AT_LAST) == QUEST_STATUS_INCOMPLETE) - pPlayer->FailQuest(QUEST_FREE_AT_LAST); - } - } }; CreatureAI* GetAI_npc_lakota_windsong(Creature* pCreature) @@ -182,15 +174,6 @@ struct TRINITY_DLL_DECL npc_paoka_swiftmountainAI : public npc_escortAI m_afWyvernLoc[i][0], m_afWyvernLoc[i][1], m_afWyvernLoc[i][2], 0.0f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000); } - - void JustDied(Unit* pKiller) - { - if (Player* pPlayer = (Player*)Unit::GetUnit(*m_creature, PlayerGUID)) - { - if (pPlayer->GetQuestStatus(QUEST_HOMEWARD) == QUEST_STATUS_INCOMPLETE) - pPlayer->FailQuest(QUEST_HOMEWARD); - } - } }; CreatureAI* GetAI_npc_paoka_swiftmountain(Creature* pCreature) diff --git a/src/bindings/scripts/scripts/zone/westfall/westfall.cpp b/src/bindings/scripts/scripts/zone/westfall/westfall.cpp index f2329271df0..50a0a8564e0 100644 --- a/src/bindings/scripts/scripts/zone/westfall/westfall.cpp +++ b/src/bindings/scripts/scripts/zone/westfall/westfall.cpp @@ -144,15 +144,6 @@ struct TRINITY_DLL_DECL npc_daphne_stilwellAI : public npc_escortAI pSummoned->AI()->AttackStart(m_creature); } - void JustDied(Unit* killer) - { - if (Player* pPlayer = Unit::GetPlayer(PlayerGUID)) - { - if (pPlayer->GetQuestStatus(QUEST_TOME_VALOR) == QUEST_STATUS_INCOMPLETE) - pPlayer->FailQuest(QUEST_TOME_VALOR); - } - } - void Update(const uint32 diff) { npc_escortAI::UpdateAI(diff); @@ -241,22 +232,7 @@ struct TRINITY_DLL_DECL npc_defias_traitorAI : public npc_escortAI } } - void Reset() - {} - - void JustDied(Unit* killer) - { - if (PlayerGUID) - { - if (Player* pPlayer = Unit::GetPlayer(PlayerGUID)) - pPlayer->FailQuest(QUEST_DEFIAS_BROTHERHOOD); - } - } - - void UpdateAI(const uint32 diff) - { - npc_escortAI::UpdateAI(diff); - } + void Reset() {} }; bool QuestAccept_npc_defias_traitor(Player* pPlayer, Creature* pCreature, Quest const* quest) diff --git a/src/bindings/scripts/scripts/zone/zangarmarsh/zangarmarsh.cpp b/src/bindings/scripts/scripts/zone/zangarmarsh/zangarmarsh.cpp index ccc19148674..c297819764f 100644 --- a/src/bindings/scripts/scripts/zone/zangarmarsh/zangarmarsh.cpp +++ b/src/bindings/scripts/scripts/zone/zangarmarsh/zangarmarsh.cpp @@ -282,8 +282,6 @@ struct TRINITY_DLL_DECL npc_kayra_longmaneAI : public npc_escortAI void Reset() { } - void EnterCombat(Unit* who){} - void WaypointReached(uint32 i) { Player* pUnit = Unit::GetPlayer(PlayerGUID); @@ -317,20 +315,6 @@ struct TRINITY_DLL_DECL npc_kayra_longmaneAI : public npc_escortAI break; } } - - void JustDied(Unit* killer) - { - if (Player* pUnit = Unit::GetPlayer(PlayerGUID)) - { - if (pUnit->GetQuestStatus(QUEST_ESCAPE_FROM) == QUEST_STATUS_INCOMPLETE) - pUnit->FailQuest(QUEST_ESCAPE_FROM); - } - } - - void UpdateAI(const uint32 diff) - { - npc_escortAI::UpdateAI(diff); - } }; bool QuestAccept_npc_kayra_longmane(Player* pPlayer, Creature* pCreature, Quest const* pQuest) |