Merge [SD2]

r1245 Update escortAI MAX_PLAYER_DISTANCE from 50 to 66 yards - skip
r1246 Not call JustDied() AI function when escortAI max range is over limit(not regular death). Some additional cleanup to apply code style.
r1247 Implement automated FailQuest in escortAI (if npc has specific death events, call npc_escortAI::JustDied()). Clean up scripts related to it.
      Restore original faction at escortAI's JustRespawned() in case faction changed (normal case for escorts). Remove in scripts where defined.
r1248 Add small delay before move to first point in escortAI.
r1249 Add support for quest 898
r1250 Add support for quest 10451. Original patch by Lightguard

--HG--
branch : trunk
This commit is contained in:
Kudlaty
2009-08-14 05:32:39 +02:00
parent 853f3a5ddd
commit 5b87f1fcdc
19 changed files with 551 additions and 455 deletions

View File

@@ -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, ''),

View File

@@ -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;

View File

@@ -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');

View File

@@ -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;
}

View File

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

View File

@@ -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);

View File

@@ -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);

View File

@@ -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)

View File

@@ -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
@@ -62,6 +63,111 @@ bool GossipSelect_npc_beaten_corpse(Player* pPlayer, Creature* pCreature, uint32
return true;
}
/*######
# 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)
@@ -560,6 +643,12 @@ void AddSC_the_barrens()
newscript->pGossipSelect = &GossipSelect_npc_beaten_corpse;
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;

View File

@@ -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)

View File

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

View File

@@ -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)

View File

@@ -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
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,
#define QUEST_ESCAPE_FROM_COILSKAR_CISTERN 10451
#define NPC_COILSKAR_ASSASSIN 21044
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) { }
bool Completed;
void EnterCombat(Unit *who)
{
Player* pPlayer = Unit::GetPlayer(PlayerGUID);
if (who->GetTypeId() == TYPEID_UNIT && who->GetEntry() == NPC_COILSKAR_ASSASSIN)
DoScriptText(SAY_AGGRO2, m_creature, pPlayer);
else DoScriptText(SAY_AGGRO1, m_creature, pPlayer);
}
uint32 m_uiHealingTimer;
void Reset()
{
m_creature->setFaction(1726);
Completed = false;
m_uiHealingTimer = 0;
}
void WaypointReached(uint32 i)
void WaypointReached(uint32 uiPointId)
{
Player* pPlayer = Unit::GetPlayer(PlayerGUID);
Player* pPlayer = (Player*)Unit::GetUnit(*m_creature, PlayerGUID);
if (!pPlayer)
return;
switch(i)
switch(uiPointId)
{
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;
}
}
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);
void SummonAssassin()
{
Player* pPlayer = Unit::GetPlayer(PlayerGUID);
if (Player* pPlayer = Unit::GetPlayer(PlayerGUID))
pPlayer->GroupEventHappens(QUEST_ESCAPE_COILSCAR, m_creature);
break;
}
}
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 JustSummoned(Creature* pSummoned)
{
if (pSummoned->GetEntry() == NPC_COILSKAR_ASSASSIN)
pSummoned->AI()->AttackStart(m_creature);
}
void JustDied(Unit* killer)
{
if (PlayerGUID && !Completed)
{
Player* pPlayer = Unit::GetPlayer(PlayerGUID);
if (pPlayer)
CAST_PLR(pPlayer)->FailQuest(QUEST_ESCAPE_FROM_COILSKAR_CISTERN);
}
}
//this is very unclear, random say without no real relevance to script/event
void DoRandomSay()
{
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 UpdateAI(const uint32 diff)
{
npc_escortAI::UpdateAI(diff);
}
void DoSpawnAssassin()
{
//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);
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;
//only aggro text if not player
if (pWho->GetTypeId() != TYPEID_PLAYER)
{
//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);
npc_earthmender_wildaAI* pTempAI = 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
pTempAI->FillPointMovementListForCreature();
return earthmender_wildaAI;
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;
}

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)
{

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)