Advertisement
DraculaxAOE

Revised NTHelper

Feb 18th, 2016
284
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 48.60 KB | None | 0 0
  1. // *** Global vars ***
  2.  
  3. var debug = false;
  4.  
  5. var pathRushBots = "NTRush/rushbots/";
  6. var isBusy = false;
  7. var isPaused;
  8. var isFollowingEnabled = true;
  9. var isAttackEnabled = true;
  10. var isAutoEnchantEnabled = false;
  11. var leaderUnit;
  12. var leaderPlayerUnit;
  13. var followRange = 5;
  14. var attackRange = 15;
  15. var _AvoidedDiabloExpOverflow = false;
  16. var _AvoidedNickExpOverflow = false;
  17. var _AvoidedBaalExpOverflow = false;
  18. // *** Global vars ***
  19.  
  20. function NTMain()
  21. {
  22. // From Diabolic's script
  23. Include("NTRush/funcs/RushCommon.ntl");
  24. Include("NTRush/funcs/Message.ntl");
  25. Common.IncludeFuncs();
  26.  
  27. Include("libs/common/NTCommon.ntl");
  28. NTC_IncludeLibs();
  29. NTC_IncludeConfig("NTBot/char_configs");
  30.  
  31. NT_LoadConfig();
  32. NTSI_LoadNIPFiles("NTBot/item_configs");
  33.  
  34. NTA_Initialize();
  35.  
  36. // Wait for the leader to join the game
  37. var leaderInGame = false;
  38. for(i = 0; i < NTConfig_PartyMaxTime+1; i++)
  39. {
  40. if(CheckLeader(NTConfig_Leader))
  41. {
  42. leaderName = NTConfig_Leader;
  43. leaderInGame = true;
  44. break;
  45. }
  46. else
  47. if(CheckLeader(NT_File("logs/" + me.account + ".leaderName.txt", 0)))
  48. {
  49. leaderName = NT_File("logs/" + me.account + ".leaderName.txt", 0);
  50. leaderInGame = true;
  51. break;
  52. }
  53. else
  54. if(CheckLeader(NT_File("AILS/Logs/TristLeader.leadername.txt", 0)))
  55. {
  56. leaderName = NT_File("AILS/Logs/TristLeader.leadername.txt", 0);
  57. leaderInGame = true;
  58. break;
  59. }
  60. Delay(1000);
  61. }
  62.  
  63. // End script if the leader wasn't found
  64. if(!leaderInGame)
  65. {
  66. if(debug)
  67. Say("Leader: " + leaderName + " - not found!");
  68. NTC_Delay(500);
  69. NTC_SendMsgToScript("NTBotGame.ntj", "SCRIPT_END");
  70. }
  71. else
  72. {
  73. RegisterEvent( EVENT_GAMEMSG, ChatHandler );
  74. if(debug)
  75. Say("!Leader: " + leaderName);
  76. leaderUnit = GetLeaderUnit(leaderName);
  77. leaderPlayerUnit = GetLeader(leaderName);
  78. }
  79.  
  80. if(NTC_InTown(me))
  81. {
  82. NTTMGR_TownManager();
  83. }
  84.  
  85. //Stop script every few minutes, need extra NTHelpers' in char config to cover leader's entire run!
  86. //minimum number of NTHelper.ntj push needed = leader's game length in minutes / _ScriptLengthInMinutes
  87. //If put too many NTHelper's in char config, may stall helpers exiting the game after leader left!
  88. var _endTime = null;
  89. _ScriptLengthInMinutes = 1440;
  90. _endTime = GetTickCount() + _ScriptLengthInMinutes*60*1000;
  91.  
  92. while(CheckLeader(leaderName) && GetTickCount() < _endTime)
  93. {
  94. Action();
  95. NTC_Delay(100);
  96. }
  97.  
  98. //Add the non-in-town check so the helper only stops the script when it's not in town. Otherwise it would town first then come back
  99. while(CheckLeader(leaderName) && !NTC_InTown(me))
  100. {
  101. Action();
  102. NTC_Delay(100);
  103. }
  104.  
  105. if(CheckLeader(leaderName))
  106. {
  107. Say("Reloading");
  108. }
  109. else
  110. {
  111. Say("Exiting");
  112. }
  113.  
  114. NTC_Delay(500);
  115. NTC_SendMsgToScript("NTBotGame.ntj", "SCRIPT_END");
  116. }
  117.  
  118. function Action()
  119. {
  120. if(me.mode === 0 || me.mode === 17)
  121. {
  122. isBusy = false;
  123. me.Cancel(0);
  124. me.Cancel(1);
  125. Delay(1000);
  126. if(me.mode !== 0 && me.mode !== 17)
  127. {
  128. if(debug)
  129. Say("I'm alive!");
  130. isFollowingEnabled = false;
  131. }
  132. }
  133.  
  134. if(!isBusy && NTC_InMyParty(leaderName))
  135. {
  136. if(isFollowingEnabled)
  137. {
  138. Follow();
  139. }
  140. }
  141.  
  142. if(!isBusy && isAutoEnchantEnabled)
  143. {
  144. // TBA with a global tick counter
  145. // Maybe a player array with some kind of player-specific timer
  146. // Who knows...
  147. }
  148.  
  149. if(NTC_InTown(me))
  150. {
  151. if(NTTMGR_CheckScrolls(1) < 8 || NTTMGR_CheckScrolls(0) < 10)
  152. {
  153. NTTMGR_TownManager();
  154. }
  155. }
  156. }
  157.  
  158. function ChatHandler( msg, type )
  159. {
  160. if(NTConfig_HelperHumor)
  161. {
  162. // My attempt at making the bot have humour
  163. // 3 checks per 1000 === 0.3% chance
  164. var _funny = Random(1, 1000);
  165. var _skip = false;
  166. switch(_funny)
  167. {
  168. case 1:
  169. Say("Hmm... I don't feel like it. Ask me later.");
  170. _skip = true;
  171. break;
  172. case 500:
  173. Say("Why don't you do it? I'm tired.");
  174. _skip = true;
  175. break;
  176. case 1000:
  177. Say("Hah, you wish...");
  178. _skip = true;
  179. break;
  180. }
  181. if(_skip)
  182. {
  183. return;
  184. }
  185. }
  186.  
  187. switch( type )
  188. {
  189. case 0: // white
  190. if(!NTConfig_AllowCommands)
  191. {
  192. return;
  193. }
  194. _msgsplit = msg.toLowerCase().split(":");
  195. if( _msgsplit.length >= 1 && _msgsplit[1] !== undefined )
  196. {
  197. var _name = _msgsplit[0].substring(3, _msgsplit[0].length - 3);
  198. var _commands = _msgsplit[1].substring(1).split(" ");
  199. }
  200. else
  201. return;
  202.  
  203. if(_name == me.name.toLowerCase())
  204. return;
  205.  
  206. if( _commands[0] == me.name.toLowerCase() ) // remove char name.
  207. for(var f = 0; f <= _commands.length-1; f++)
  208. _commands[f] = _commands[f+1];
  209.  
  210. if(_commands.length > 1) // make sure nothing is undefined. grr.
  211. for(var i = 0; i <= _commands.length-1; i++)
  212. if(!_commands[i])
  213. _commands[i] = "";
  214.  
  215. while(_commands.length < 5)
  216. _commands.push("");
  217.  
  218. if(_commands[0] == "p" && _name == leaderName)
  219. {
  220. isPaused = !isPaused;
  221. if(isPaused)
  222. Say("~Paused chat commands");
  223. else
  224. Say("~Unpaused chat commands");
  225. }
  226.  
  227. if( !isBusy && !isPaused && _name == leaderName.toLowerCase())
  228. CommandHandler( _commands[0], _commands[1], _commands[2], _commands[3], _commands[4] );
  229. break;
  230. case 1: // red
  231. break;
  232. case 2: // green
  233. if(!NTConfig_AllowCommands)
  234. {
  235. return;
  236. }
  237. if(msg.indexOf("From ") > -1 && msg.indexOf(" (*") > -1)
  238. {
  239. _msgsplit = msg.toLowerCase().split(" (*");
  240. if( _msgsplit.length == 2 && _msgsplit[1] !== undefined )
  241. {
  242. var _name = _msgsplit[0].split(" ")[1];
  243. var _commands = _msgsplit[1].split("):")[1].substring(1).split(" ");
  244. }
  245. else
  246. return;
  247. }
  248. else
  249. if(msg.indexOf(" whispers: ") > -1)
  250. {
  251. _msgsplit = msg.toLowerCase().split(" whispers:");
  252. if( _msgsplit.length == 2 && _msgsplit[1] !== undefined )
  253. {
  254. var _name = _msgsplit[0];
  255. var _commands = _msgsplit[1].substring(1).split(" ");
  256. }
  257. else
  258. return;
  259. }
  260. else
  261. {
  262. if(msg.indexOf("has joined your party to fight the forces of evil") > -1)
  263. {
  264. if(NTConfig_GreetPlayers)
  265. {
  266. _split = msg.split("has joined");
  267. _name = _split[0];
  268. var saystring;
  269. if(NTConfig_GreetMsg.indexOf("%name%") !== -1)
  270. {
  271. saystring = NTConfig_GreetMsg.replace("%name%", _name);
  272. Whisper(_name, saystring);
  273. }
  274. else
  275. {
  276. Whisper(_name, NTConfig_GreetMsg);
  277. }
  278. }
  279. }
  280. return;
  281. }
  282.  
  283. if(_name == me.name.toLowerCase())
  284. return;
  285.  
  286. if( _commands[0] == me.name.toLowerCase() ) // remove char name.
  287. for(var f = 0; f <= _commands.length-1; f++)
  288. _commands[f] = _commands[f+1];
  289.  
  290. if(_commands.length > 1) // make sure nothing is undefined. grr.
  291. for(var i = 0; i <= _commands.length-1; i++)
  292. if(!_commands[i])
  293. _commands[i] = "";
  294.  
  295. while(_commands.length < 5)
  296. _commands.push("");
  297.  
  298. if(_commands[0] == "p" && _name == leaderName)
  299. {
  300. isPaused = !isPaused;
  301. if(isPaused)
  302. Say("~Paused chat commands");
  303. else
  304. Say("~Unpaused chat commands");
  305. }
  306.  
  307. if( !isBusy && !isPaused && _name == leaderName.toLowerCase())
  308. CommandHandler( _commands[0], _commands[1], _commands[2], _commands[3], _commands[4] );
  309. break;
  310. case 3: // blue
  311. break;
  312. case 4: // brown
  313. /*
  314. if(NTConfig_GreetPlayers)
  315. {
  316. if(msg.indexOf("joined our world. Diablo") != -1)
  317. {
  318. _split = msg.split("(");
  319. _name = _split[0];
  320. var saystring;
  321. if(NTConfig_GreetMsg.indexOf("%name%") != -1)
  322. {
  323. saystring = NTConfig_GreetMsg.replace("%name%", _name);
  324. Whisper(_name, saystring);
  325. }
  326. else
  327. {
  328. Whisper(_name, NTConfig_GreetMsg);
  329. }
  330. }
  331. }
  332. */
  333. if(NTConfig_PortalAtLeechersCorpses)
  334. {
  335. if(msg.indexOf(" was slain by ") != -1)
  336. {
  337. _split = msg.split(" was slain by ");
  338. _name = _split[0].substring(3, _split[0].length - 3);
  339. TPAtPlayersBody(_split[0], _split[1]);
  340. }
  341. }
  342. break;
  343. default:
  344. break;
  345. }
  346. }
  347.  
  348. function CommandHandler( msg1, msg2, msg3, msg4, msg5 )
  349. {
  350. switch( msg1 )
  351. {
  352. case "dbg": // keep right above goto command without a break
  353. if(debug)
  354. Say("Debug: Leader Coordinates: X: " + leaderPlayerUnit.x + " " + "Y: " + leaderPlayerUnit.y);
  355. if(debug)
  356. Say("Debug: Leader Area ID: " + leaderPlayerUnit.areaid);
  357. msg2 = leaderPlayerUnit.areaid;
  358. msg3 = leaderPlayerUnit.x;
  359. msg4 = leaderPlayerUnit.y;
  360. case "goto":
  361. if(msg2 == 'trist')
  362. {
  363. if(!NTTM_CheckAct(1))
  364. {
  365. NTC_SendMsgToScript("NTBotGame.ntj", "NTTM_CheckAct()");
  366. return;
  367. }
  368. NTTMGR_TownManager();
  369. NTTM_TownMove("waypoint");
  370. NTM_TakeWaypoint(4);
  371. if(!NTM_MoveToPresetUnit(me.areaid, NTC_UNIT_MONSTER, 737, 10, 10, false))
  372. {
  373. NTM_MakeTP();
  374. Say("Failed to move to unit");
  375. //Delay(7500);
  376. //NTC_SendMsgToScript("NTBotGame.ntj", "NTM_MoveToPresetUnit()");
  377. return;
  378. }
  379. NTA_ClearPosition( 20 );
  380. NTM_MakeTP();
  381. }
  382. else
  383. if(me.areaid === parseInt(msg2))
  384. {
  385. if(parseInt(msg3) >= 0 && parseInt(msg4) >= 0)
  386. {
  387. Say("Moving to: " + msg3 + ", " + msg4);
  388. if(!NTM_MoveTo(parseInt(msg2), parseInt(msg3), parseInt(msg4)))
  389. {
  390. Say("!Failed to move");
  391. }
  392. }
  393. }
  394. break;
  395. case "exit":
  396. NTC_SendMsgToScript("NTBotGame.ntj", "SCRIPT_END");
  397. break;
  398. case "range":
  399. if(msg2 == "")
  400. followRange = 5;
  401. if(msg2 >= 3 && msg2 <= 30)
  402. followRange = msg2;
  403. else
  404. Say("~Valid range is 3-30. Default is 5.");
  405. Say("~Follow range set to: " + followRange);
  406. break;
  407. case "come":
  408. if(!isBusy && NTC_InTown(me))
  409. {
  410. NTTM_TownMove("portalspot");
  411. TakeLeaderTP();
  412. }
  413. break;
  414. case "my":
  415. if(msg2 == "tp" && !isBusy && NTC_InTown(me))
  416. {
  417. NTTM_TownMove("portalspot");
  418. Delay(250);
  419. TakeLeaderTP();
  420. }
  421. break;
  422. case "go":
  423. if(!isBusy && !NTC_InTown(me))
  424. if(!TakeLeaderTP())
  425. Town();
  426. break;
  427. case "follow":
  428. if(msg2 == "on")
  429. {
  430. isFollowingEnabled = true;
  431. break;
  432. }
  433. else
  434. if(msg2 == "off")
  435. {
  436. isFollowingEnabled = false;
  437. break;
  438. }
  439. else
  440. {
  441. isFollowingEnabled = !isFollowingEnabled;
  442. }
  443. if(isFollowingEnabled)
  444. Say("~Follow on");
  445. else
  446. Say("~Follow off");
  447. break;
  448. case "bo":
  449. if(!isBusy)
  450. {
  451. NTP_DoPrecast( true );
  452. }
  453. break;
  454. case "buff":
  455. if(!isBusy)
  456. {
  457. NTP_DoPrecast( true );
  458. Chant( msg2 );
  459. }
  460. break;
  461. case "help":
  462. if(!isBusy)
  463. DisplayHelp( msg2 ); // Display help menu.
  464. break;
  465. case "clear":
  466. if(!isBusy)
  467. CommandClear( msg2 ); // Clear function.
  468. break;
  469. case "tp":
  470. if(!isBusy)
  471. TP(msg2); // TP functions.
  472. break;
  473. case "quest":
  474. if(!isBusy)
  475. Quest( msg2 ); // Quest functions.
  476. break;
  477. case "rush":
  478. if(!isBusy)
  479. Rush( msg2 ); // Rush functions.
  480. break;
  481. case "chant":
  482. if(!isBusy)
  483. Chant( msg2 ); // Chant functions.
  484. break;
  485. case "town":
  486. if(!isBusy)
  487. {
  488. isFollowingEnabled = false;
  489. Say("~Follow off");
  490. if(!TakeLeaderTP())
  491. Town();
  492. }
  493. break;
  494. case "gold":
  495. if(!isBusy)
  496. GiveGold(msg2);
  497. break;
  498. default: // Say this when you receive an invalid command.
  499. //Say("!Invalid command: " + msg1 + " " + msg2 + " " + msg3 + "." );
  500. return 0;
  501. }
  502. return 1;
  503. }
  504.  
  505. function DisplayHelp(msg) // Eventually add multiple menus via 'help commandname'.
  506. {
  507. isBusy = true;
  508. switch(msg)
  509. {
  510. case "":
  511. Say("With multiple followers, you can speak to them individually by saying their name first. Example: '" + me.name + " follow' would make me follow!");
  512. Say("'follow' toggle following");
  513. Say("'tp' make tp");
  514. Say("'tp areaname' tp at waypoint");
  515. Say("'range 3-30' set following range");
  516. Say("'bo' prebuffs");
  517. Say("'rush' starts rush");
  518. Say("'rush 1-5' specific acts");
  519. Say("'quest questname' specific quests");
  520. Say("'chant' enchants players");
  521. Say("'come' or 'go' portal commands");
  522. Say("'gold 1-50000' drops gold");
  523. Say("'clear' clears my position");
  524. break;
  525. case "tp":
  526. Say("Type 'tp waypointname' and I will make a tp at that waypoint. For the Nith waypoint, you must say 'nit' instead.");
  527. Say("Example: tp stony");
  528. break;
  529. default:
  530. Say("'" + msg + "' does not have a help menu yet, or is an invalid command.");
  531. break;
  532. }
  533. NTC_Delay(500);
  534. isBusy = false;
  535. return;
  536. }
  537.  
  538. function Invalid(){Say("!Invalid Command");}
  539. function NI(){Say("Function not implemented. (yet)");}
  540. function Busy(){Say("I'm busy!");}
  541.  
  542. function Follow( target )
  543. {
  544. var _distance = -1;
  545. var leaderPlayerUnitintown, _meintown;
  546.  
  547. if(!leaderUnit) // Make sure we have the leaders unit.
  548. {
  549. leaderUnit = GetLeaderUnit(leaderName);
  550. }
  551.  
  552. if(leaderPlayerUnit.areaid <= 0) // Don't do anything if we don't know the area yet.
  553. {
  554. return;
  555. }
  556.  
  557. if(CheckAct(me) !== CheckAct(leaderPlayerUnit) && NTC_InTown(me) && NTC_InTown(leaderPlayerUnit))
  558. {
  559. NTTM_TownMove("waypoint");
  560. NTC_PingDelay(200);
  561. NTM_TakeWaypoint(GetPlayerActWaypointID(leaderPlayerUnit));
  562. }
  563.  
  564. //Force extra helpers to town prior to killing Diablo, in order to avoid experience overflow
  565. if(NTConfig_AvoidExpOverflow == true && _AvoidedDiabloExpOverflow == false && leaderPlayerUnit.areaid === 108 && me.areaid === leaderPlayerUnit.areaid)
  566. {
  567. if(InfectorOfSoulsDead() || NTC_FindUnit(NTC_UNIT_MONSTER, 243))
  568. {
  569. _AvoidedDiabloExpOverflow = true;
  570. var _PlayerTotal;
  571. var _PartyTotal;
  572. var _ListHelper;
  573. _PlayerTotal = PlayerCount();
  574. _PartyTotal = PartyCount();
  575. _ListHelper = ListHelpers();
  576. AvoidDiabloExpOverflow(_PlayerTotal, _PartyTotal, _ListHelper);
  577. }
  578. else
  579. {
  580. _AvoidedDiabloExpOverflow = false;
  581. }
  582. }
  583.  
  584. //Force extra helpers to town prior to killing Baal, in order to avoid experience overflow
  585. if(NTConfig_AvoidExpOverflow == true && _AvoidedBaalExpOverflow == false && leaderPlayerUnit.areaid === 131 && me.areaid === leaderPlayerUnit.areaid)
  586. {
  587. if(ListerTheTormentorDead())
  588. {
  589. _AvoidedBaalExpOverflow = true;
  590. var _PlayerTotal;
  591. var _PartyTotal;
  592. var _ListHelper;
  593. _PlayerTotal = PlayerCount();
  594. _PartyTotal = PartyCount();
  595. _ListHelper = ListHelpers();
  596. AvoidBaalExpOverflow(_PlayerTotal, _PartyTotal, _ListHelper);
  597. }
  598. else
  599. {
  600. _AvoidedBaalExpOverflow = false;
  601. }
  602. }
  603.  
  604. //Force extra helpers to town prior to killing Nihlathak, in order to avoid experience overflow
  605. //The overflow ONLY occurs at 8pp + all party + all within 2 screens of Nick, so do Not perform the same area check since the leader will do Nick real quick...
  606. if(NTConfig_AvoidExpOverflow == true && _AvoidedNickExpOverflow == false && leaderPlayerUnit.areaid === 124)
  607. {
  608. _AvoidedNickExpOverflow = true;
  609. var _PlayerTotal;
  610. var _PartyTotal;
  611. var _ListHelper;
  612. _PlayerTotal = PlayerCount();
  613. //No same area check
  614. _PartyTotal = PartyCountNick();
  615. _ListHelper = ListHelpers();
  616. AvoidNickExpOverflow(_PlayerTotal, _PartyTotal, _ListHelper);
  617. }
  618.  
  619. // Get the distance between our character and the leader
  620. if(leaderUnit)
  621. {
  622. _distance = GetDistance(me, leaderUnit);
  623. }
  624. else
  625. {
  626. _distance = -1;
  627. }
  628.  
  629. // If we get a valid distance, and we're inside the follow range, we don't need to do anything except attack.
  630. // if(_distance <= followRange && _distance !== -1 && me.areaid == leaderPlayerUnit.areaid && !NTC_InTown(me))
  631. if(_distance <= followRange && _distance !== -1 && me.areaid === leaderPlayerUnit.areaid && !NTC_InTown(me))
  632. {
  633. if(isAttackEnabled)
  634. {
  635. var _atk = true;
  636. if(NTConfig_DoNotAttackAreas.length >= 1)
  637. {
  638. for(var i = 0; i < NTConfig_DoNotAttackAreas.length; i++)
  639. {
  640. if(NTConfig_DoNotAttackAreas[i] === me.areaid)
  641. {
  642. _atk = false;
  643. break;
  644. }
  645. }
  646. }
  647. if(_atk)
  648. {
  649. if(me.areaid !== 131)
  650. {
  651. if(NTA_CheckForCloseMonsters(30))
  652. {
  653. hAttack();
  654. return;
  655. }
  656. }
  657. else if(me.areaid === 131)
  658. {
  659. if(NTA_CheckForCloseMonsters(30))
  660. {
  661. hAttackThrone();
  662. return;
  663. }
  664. }
  665. }
  666. }
  667. return;
  668. }
  669.  
  670. // If we get a valid distance, and we're outside the follow range, but still inside the range for GetDistance() to work, attempt to get closer!
  671. // if(_distance >= followRange && _distance !== -1 && me.areaid == leaderPlayerUnit.areaid)
  672. if(_distance >= followRange && _distance !== -1 && me.areaid === leaderPlayerUnit.areaid)
  673. {
  674. if(!NTC_InTown(me))
  675. {
  676. if(leaderUnit)
  677. {
  678. NTM_GetCloserInt(leaderUnit);
  679. }
  680. else
  681. {
  682. NTM_MoveTo(leaderPlayerUnit.areaid, leaderPlayerUnit.x, leaderPlayerUnit.y);
  683. }
  684. }
  685. else
  686. {
  687. switch(me.areaid)
  688. {
  689. case 1:
  690. // no!
  691. //NTM_GetCloserInt(leaderUnit);
  692. break;
  693. case 40:
  694. // no!
  695. //NTM_GetCloserInt(leaderUnit);
  696. break;
  697. case 75:
  698. // no!
  699. //NTM_GetCloserInt(leaderUnit);
  700. break;
  701. case 103:
  702. // no!
  703. //NTM_GetCloserInt(leaderUnit);
  704. break;
  705. case 109:
  706. // no!
  707. //NTM_GetCloserInt(leaderUnit);
  708. break;
  709. }
  710. }
  711. return;
  712. }
  713.  
  714. // If we get an INVALID distance (too far away for GetDistance()), but we're in the same area, attempt to move to the leader
  715. // if(_distance === -1 && me.areaid === leaderPlayerUnit.areaid && !NTC_InTown(me) && !NTC_InTown(leaderPlayerUnit))
  716. if(_distance === -1 && me.areaid === leaderPlayerUnit.areaid && !NTC_InTown(me) && !NTC_InTown(leaderPlayerUnit) && me.areaid >= 1 && leaderPlayerUnit.areaid >= 1)
  717. {
  718. NTM_MoveTo(leaderPlayerUnit.areaid, leaderPlayerUnit.x, leaderPlayerUnit.y);
  719. return;
  720. }
  721.  
  722. // If the leader is not in town, but we are
  723. if(!NTC_InTown(leaderPlayerUnit) && NTC_InTown(me))
  724. {
  725. // Get the distance between our character and the leader
  726. if(leaderUnit)
  727. {
  728. _distance = GetDistance(me, leaderUnit);
  729. }
  730. else
  731. {
  732. _distance = -1;
  733. }
  734.  
  735. // If we get a valid distance, and we're outside the follow range, attempt to get closer!
  736. // This covers walking out of acts
  737. if(_distance >= followRange && _distance !== -1)
  738. {
  739. if(leaderUnit)
  740. {
  741. NTM_GetCloserInt(leaderUnit);
  742. }
  743. else
  744. {
  745. NTM_MoveTo(leaderPlayerUnit.areaid, leaderPlayerUnit.x, leaderPlayerUnit.y);
  746. }
  747. return;
  748. }
  749.  
  750. // If leader took a WP to a different act, we want to try that wp, or just go to that act
  751. if(CheckAct(leaderPlayerUnit) !== CheckAct(me))
  752. {
  753. if(NTConfig_DoNotFollowAreas.length >= 1)
  754. {
  755. for(var i = 0; i < NTConfig_DoNotFollowAreas.length; i++)
  756. {
  757. if(NTConfig_DoNotFollowAreas[i] === leaderPlayerUnit.areaid)
  758. {
  759. NTTM_TownMove("waypoint");
  760. NTC_PingDelay(200);
  761. NTM_TakeWaypoint(GetPlayerActWaypointID(leaderPlayerUnit));
  762. Delay(200);
  763. NTTM_TownMove("portalspot");
  764. return;
  765. }
  766. }
  767. }
  768. var _mta = (AreaHasWaypoint(leaderPlayerUnit.areaid) ? leaderPlayerUnit.areaid : GetPlayerActWaypointID(leaderPlayerUnit));
  769. NTTM_TownMove("waypoint");
  770. NTC_PingDelay(200);
  771. NTM_TakeWaypoint(_mta);
  772. return;
  773. }
  774.  
  775. // Return if leader is in a no-follow-zone
  776. for(var i = 0; i < NTConfig_DoNotFollowAreas.length; i++)
  777. {
  778. if(NTConfig_DoNotFollowAreas[i] === leaderPlayerUnit.areaid)
  779. {
  780. return;
  781. }
  782. }
  783.  
  784. // Try to take any available portals
  785. if(NTC_InTown(me))
  786. {
  787. NTTM_TownMove("portalspot");
  788. Delay(250);
  789. }
  790.  
  791. if(TakeLeaderTP())
  792. {
  793. Delay(250);
  794. return;
  795. }
  796. else
  797. if(AreaHasWaypoint(leaderPlayerUnit.areaid))
  798. {
  799. for(var i = 0; i < NTConfig_DoNotFollowAreas.length; i++)
  800. {
  801. if(NTConfig_DoNotFollowAreas[i] === leaderPlayerUnit.areaid)
  802. {
  803. return;
  804. }
  805. }
  806. NTM_TakeWaypoint(leaderPlayerUnit.areaid);
  807. }
  808. return;
  809. }
  810.  
  811. // If we are not in town, but the leader is
  812. if(NTC_InTown(leaderPlayerUnit) && !NTC_InTown(me))
  813. {
  814. // Get the distance between our character and the leader
  815. if(leaderUnit)
  816. {
  817. _distance = GetDistance(me, leaderUnit);
  818. }
  819. else
  820. {
  821. _distance = -1;
  822. }
  823.  
  824. // If we get a valid distance, and we're outside the follow range, attempt to get closer!
  825. // This covers walking back in/out of acts and in/out of new areas
  826. if(_distance >= followRange && _distance !== -1)
  827. {
  828. if(leaderUnit)
  829. {
  830. NTM_GetCloserInt(leaderUnit);
  831. }
  832. else
  833. {
  834. NTM_MoveTo(leaderPlayerUnit.areaid, leaderPlayerUnit.x, leaderPlayerUnit.y);
  835. }
  836. return;
  837. }
  838.  
  839. // If leader took a WP to a different act, we want to try that wp, otherwise we simply get back to town
  840. if(_distance === -1 && CheckAct(me) !== CheckAct(leaderPlayerUnit))
  841. {
  842. if(!TakeLeaderTP())
  843. {
  844. if(!NTC_InTown(me))
  845. {
  846. // Last ditch effort, just go back to town
  847. if(!Town())
  848. {
  849. Whisper(leaderPlayerUnit.name, "I seem to be stuck!");
  850. }
  851. }
  852. }
  853. return;
  854. }
  855. // return;
  856.  
  857. // If leader went back to town
  858. // Try to take any available portals
  859. if(_distance === -1 && CheckAct(leaderPlayerUnit) == CheckAct(me) && me.areaid !== leaderPlayerUnit.areaid)
  860. {
  861. if(!TakeLeaderTP())
  862. {
  863. if(!NTC_InTown(me))
  864. {
  865. // Last ditch effort, just go back to town
  866. if(!Town())
  867. {
  868. Whisper(leaderPlayerUnit.name, "I seem to be stuck!");
  869. }
  870. }
  871. }
  872. //return;
  873. }
  874. return;
  875. }
  876.  
  877. // If we are both outside but in different areas
  878. if(me.areaid !== leaderPlayerUnit.areaid && !NTC_InTown(leaderPlayerUnit) && !NTC_InTown(me))
  879. {
  880. // Get the distance between our character and the leader
  881. if(leaderUnit)
  882. {
  883. _distance = GetDistance(me, leaderUnit);
  884. }
  885. else
  886. {
  887. _distance = -1;
  888. }
  889.  
  890. // If we get a valid distance, and we're outside the follow range, attempt to get closer!
  891. // This covers walking to new area id's
  892. if(_distance >= followRange && _distance !== -1 && me.areaid === leaderPlayerUnit.areaid)
  893. {
  894. if(leaderUnit)
  895. {
  896. NTM_GetCloserInt(leaderUnit);
  897. }
  898. else
  899. {
  900. NTM_MoveTo(leaderPlayerUnit.areaid, leaderPlayerUnit.x, leaderPlayerUnit.y);
  901. }
  902. return;
  903. }
  904.  
  905. // Check to see if we entered a doorway or stairs
  906. var _unit = GetPresetUnits(me.areaid, NTC_UNIT_TILE);
  907. if (_unit)
  908. {
  909. for (var i = 0; i < _unit.length; i += 1)
  910. {
  911. if (_unit[i].subareaid == leaderPlayerUnit.areaid)
  912. {
  913. if(!NTM_MoveToStair(me.areaid, leaderPlayerUnit.areaid)) {
  914. NTC_SendMsgToScript("NTBotGame.ntj", "NTM_MoveToStair()");
  915. return;
  916. }
  917. // Delay(1000);
  918. if(!NTM_TakeStair(leaderPlayerUnit.areaid)) {
  919. NTC_SendMsgToScript("NTBotGame.ntj", "NTM_TakeStair()");
  920. return;
  921. }
  922. return;
  923. }
  924. }
  925. }
  926.  
  927. // This covers outside-to-outside waypoint changes
  928. if(AreaHasWaypoint(leaderPlayerUnit.areaid))
  929. {
  930. if(NTM_TakeWaypoint(leaderPlayerUnit.areaid))
  931. {
  932. return;
  933. }
  934. }
  935.  
  936. // Check for special doors
  937. // Leaving Arcane Sanctuary
  938. if(me.areaid == 74 && leaderPlayerUnit.areaid == 54)
  939. {
  940. if(!NTM_TakeUnit(NTC_UNIT_OBJECT, 298))
  941. {
  942. Town();
  943. }
  944. return;
  945. }
  946.  
  947. // Entering Arcane Sanctuary
  948. if(me.areaid == 54 && leaderPlayerUnit.areaid == 74)
  949. {
  950. if(!NTM_TakeUnit(NTC_UNIT_OBJECT, 298))
  951. {
  952. Town();
  953. }
  954. return;
  955. }
  956.  
  957. // Entering Duriel's Chamber
  958. if(me.areaid >= 66 && me.areaid <= 72 && leaderPlayerUnit.areaid == 73)
  959. {
  960. if(!NTM_TakeUnit(NTC_UNIT_OBJECT, 100))
  961. {
  962. Town();
  963. }
  964. return;
  965. }
  966.  
  967. // Entering Tristram
  968. if(me.areaid == 4 && leaderPlayerUnit.areaid == 38)
  969. {
  970. if(!NTM_UsePortal("Portal", 38))
  971. {
  972. Town();
  973. }
  974. return;
  975. }
  976.  
  977. // Exiting Tristram
  978. if(me.areaid == 38 && leaderPlayerUnit.areaid == 4)
  979. {
  980. if(!NTM_UsePortal("Portal", 4))
  981. {
  982. Town();
  983. }
  984. return;
  985. }
  986.  
  987. // Entering Baal's Chamber
  988. if(me.areaid == 131 && leaderPlayerUnit.areaid == 132)
  989. {
  990. if(NTConfig_FollowtoWorldStone)
  991. {
  992. if(!NTM_TakeUnit(NTC_UNIT_OBJECT, 563))
  993. {
  994. Town();
  995. }
  996. return;
  997. }
  998. }
  999.  
  1000. Town();
  1001. return;
  1002. }
  1003. }
  1004.  
  1005. function PlayerCount()
  1006. {
  1007. var _player;
  1008. var _playercount = 1;
  1009.  
  1010. _player = GetPlayerUnit();
  1011.  
  1012. if(_player)
  1013. {
  1014. while(_player.GetNext())
  1015. {
  1016. _playercount += 1;
  1017. }
  1018. }
  1019. else
  1020. {
  1021. return undefined;
  1022. }
  1023.  
  1024. return _playercount;
  1025. }
  1026.  
  1027. function PartyCount()
  1028. {
  1029. var _player;
  1030. var _myPartyId;
  1031. var _partycount = 1;
  1032.  
  1033. _player = GetPlayerUnit();
  1034.  
  1035. if(_player)
  1036. {
  1037. _myPartyId = _player.partyid;
  1038. if(_myPartyId != 65535)
  1039. {
  1040. while(_player.GetNext())
  1041. {
  1042. if(_player.name != me.name && _myPartyId == _player.partyid && _player.areaid === leaderPlayerUnit.areaid) {
  1043. _partycount += 1;
  1044. }
  1045. }
  1046. }
  1047. }
  1048. else
  1049. {
  1050. return undefined;
  1051. }
  1052.  
  1053. return _partycount;
  1054. }
  1055.  
  1056. //No same area check
  1057. function PartyCountNick()
  1058. {
  1059. var _player;
  1060. var _myPartyId;
  1061. var _partycount = 1;
  1062.  
  1063. _player = GetPlayerUnit();
  1064.  
  1065. if(_player)
  1066. {
  1067. _myPartyId = _player.partyid;
  1068. if(_myPartyId != 65535)
  1069. {
  1070. while(_player.GetNext())
  1071. {
  1072. if(_player.name != me.name && _myPartyId == _player.partyid) {
  1073. _partycount += 1;
  1074. }
  1075. }
  1076. }
  1077. }
  1078. else
  1079. {
  1080. return undefined;
  1081. }
  1082.  
  1083. return _partycount;
  1084. }
  1085.  
  1086. function ListHelpers()
  1087. {
  1088. var hcount = [];
  1089.  
  1090. if(NTConfig_HelperTownList.length < 1){
  1091. return hcount = [];
  1092. }
  1093.  
  1094. var i;
  1095.  
  1096. //Re-construct the list with only chars in game
  1097. for(i = 0; i < NTConfig_HelperTownList.length; i++)
  1098. {
  1099. if(CheckLeader(NTConfig_HelperTownList[i]))
  1100. {
  1101. hcount.push(NTConfig_HelperTownList[i]);
  1102. }
  1103. }
  1104.  
  1105. return hcount;
  1106. }
  1107.  
  1108. function InfectorOfSoulsDead()
  1109. {
  1110. _target = NTC_FindUnit(NTC_UNIT_MONSTER, GetLocaleString(2853));
  1111. if (!_target) {return false;}
  1112. return _target.mode == 12;
  1113. }
  1114.  
  1115. function ListerTheTormentorDead()
  1116. {
  1117. _target = NTC_FindUnit(NTC_UNIT_MONSTER, GetLocaleString(21855));
  1118. if (!_target) {return false;}
  1119. return _target.mode == 12;
  1120. }
  1121.  
  1122. function AvoidDiabloExpOverflow(PlayerTotal, PartyTotal, ListHelper)
  1123. {
  1124. var num_player_desired;
  1125.  
  1126. if(PartyTotal == 1){
  1127. return;
  1128. }
  1129.  
  1130. if(ListHelper.length < 1){
  1131. return;
  1132. }
  1133.  
  1134. if(NTC_InTown(me))
  1135. {
  1136. while(leaderPlayerUnit.areaid === 108)
  1137. {
  1138. NTC_PingDelay(1000);
  1139. }
  1140. return;
  1141. }
  1142.  
  1143. switch(PlayerTotal)
  1144. {
  1145. case 1:
  1146. //No total exp penalty due to overflow
  1147. break;
  1148. case 2:
  1149. //No total exp penalty due to overflow
  1150. break;
  1151. case 3:
  1152. //No total exp penalty due to overflow
  1153. break;
  1154. case 4:
  1155. //No total exp penalty due to overflow
  1156. break;
  1157. case 5:
  1158. //Maximum total exp is attained when the number of party members nearby is 4
  1159. num_player_desired = 4;
  1160. if(PartyTotal > num_player_desired)
  1161. {
  1162. TownHelper(ListHelper, num_player_desired, PartyTotal);
  1163. }
  1164. break;
  1165. case 6:
  1166. //Maximum total exp is attained when the number of party members nearby is 4
  1167. num_player_desired = 4;
  1168. if(PartyTotal > num_player_desired)
  1169. {
  1170. TownHelper(ListHelper, num_player_desired, PartyTotal);
  1171. }
  1172. break;
  1173. case 7:
  1174. //Maximum total exp is attained when the number of party members nearby is 3
  1175. num_player_desired = 3;
  1176. if(PartyTotal > num_player_desired)
  1177. {
  1178. TownHelper(ListHelper, num_player_desired, PartyTotal);
  1179. }
  1180. break;
  1181. case 8:
  1182. //Maximum total exp is attained when the number of party members nearby is 8, but 3 is also okay...
  1183. //Do nothing if PartyTotal = 8 or 3
  1184. num_player_desired = 3;
  1185. if(PartyTotal > 3 && PartyTotal < 8)
  1186. {
  1187. TownHelper(ListHelper, num_player_desired, PartyTotal);
  1188. }
  1189. break;
  1190. }
  1191. return;
  1192. }
  1193.  
  1194. function AvoidBaalExpOverflow(PlayerTotal, PartyTotal, ListHelper)
  1195. {
  1196. var num_player_desired;
  1197.  
  1198. if(PartyTotal == 1){
  1199. return;
  1200. }
  1201.  
  1202. if(ListHelper.length < 1){
  1203. return;
  1204. }
  1205.  
  1206. if(NTC_InTown(me))
  1207. {
  1208. while(leaderPlayerUnit.areaid === 131 || leaderPlayerUnit.areaid === 132)
  1209. {
  1210. NTC_PingDelay(1000);
  1211. }
  1212. return;
  1213. }
  1214.  
  1215. switch(PlayerTotal)
  1216. {
  1217. case 1:
  1218. //No total exp penalty due to overflow
  1219. break;
  1220. case 2:
  1221. //No total exp penalty due to overflow
  1222. break;
  1223. case 3:
  1224. //No total exp penalty due to overflow
  1225. break;
  1226. case 4:
  1227. //Maximum total exp is attained when the number of party members nearby is 3
  1228. num_player_desired = 3;
  1229. if(PartyTotal > num_player_desired)
  1230. {
  1231. TownHelper(ListHelper, num_player_desired, PartyTotal);
  1232. }
  1233. break;
  1234. case 5:
  1235. //Maximum total exp is attained when the number of party members nearby is 2, but 5 is also okay...
  1236. //Do nothing if PartyTotal = 2
  1237. //Try to tackle the PartyTotal == 5 case anyway...
  1238. num_player_desired = 2;
  1239. if(PartyTotal > 2 && PartyTotal <= 5)
  1240. {
  1241. TownHelper(ListHelper, num_player_desired, PartyTotal);
  1242. }
  1243. break;
  1244. case 6:
  1245. //Maximum total exp is attained when the number of party members nearby is 5
  1246. num_player_desired = 5;
  1247. if(PartyTotal > num_player_desired)
  1248. {
  1249. TownHelper(ListHelper, num_player_desired, PartyTotal);
  1250. }
  1251. break;
  1252. case 7:
  1253. //Maximum total exp is attained when the number of party members nearby is 7, but 4 is also okay...
  1254. //Do nothing if PartyTotal = 7 or 4
  1255. num_player_desired = 4;
  1256. if(PartyTotal > 4 && PartyTotal < 7)
  1257. {
  1258. TownHelper(ListHelper, num_player_desired, PartyTotal);
  1259. }
  1260. break;
  1261. case 8:
  1262. //Maximum total exp is attained when the number of party members nearby is 4, but 6 is also okay... Maybe 8...
  1263. //Do nothing if PartyTotal = 4
  1264. //Try to tackle the PartyTotal == 6 case anyway...
  1265. num_player_desired = 4;
  1266. if(PartyTotal > 4 && PartyTotal <= 8)
  1267. {
  1268. TownHelper(ListHelper, num_player_desired, PartyTotal);
  1269. }
  1270. break;
  1271. }
  1272. return;
  1273. }
  1274.  
  1275. function AvoidNickExpOverflow(PlayerTotal, PartyTotal, ListHelper)
  1276. {
  1277. var num_player_desired;
  1278.  
  1279. if(PartyTotal == 1){
  1280. return;
  1281. }
  1282.  
  1283. if(ListHelper.length < 1){
  1284. return;
  1285. }
  1286.  
  1287. // if(NTC_InTown(me))
  1288. // {
  1289. // while(leaderPlayerUnit.areaid === 124)
  1290. // {
  1291. // NTC_PingDelay(1000);
  1292. // }
  1293. // return;
  1294. // }
  1295.  
  1296. switch(PlayerTotal)
  1297. {
  1298. case 1:
  1299. //No total exp penalty due to overflow
  1300. break;
  1301. case 2:
  1302. //No total exp penalty due to overflow
  1303. break;
  1304. case 3:
  1305. //No total exp penalty due to overflow
  1306. break;
  1307. case 4:
  1308. //No total exp penalty due to overflow
  1309. break;
  1310. case 5:
  1311. //No total exp penalty due to overflow
  1312. break;
  1313. case 6:
  1314. //No total exp penalty due to overflow
  1315. break;
  1316. case 7:
  1317. //No total exp penalty due to overflow
  1318. break;
  1319. case 8:
  1320. //Maximum total exp is attained when the number of party members nearby is 7
  1321. num_player_desired = 7;
  1322. if(PartyTotal > num_player_desired)
  1323. {
  1324. TownHelper(ListHelper, num_player_desired, PartyTotal);
  1325. }
  1326. break;
  1327. }
  1328. return;
  1329. }
  1330.  
  1331. function TownHelper(ListHelper, num_player_desired, PartyTotal)
  1332. {
  1333. var i;
  1334. var num_helper_kicked;
  1335.  
  1336. if(ListHelper.length < 1){
  1337. return false;
  1338. }
  1339.  
  1340. //The number of helpers that needs to be kicked back to town, this is always greater than 0 by definition
  1341. num_helper_kicked = PartyTotal - num_player_desired;
  1342.  
  1343. //For now, if can't reach num_player_desired after kicking all helpers back to town, do nothing. Will consider this case later...
  1344. if(num_helper_kicked > ListHelper.length){
  1345. return;
  1346. }
  1347.  
  1348. //Kick extra helpers back to town
  1349. for(i = 0; i < ListHelper.length; i++)
  1350. {
  1351. //Won't town if my name is not in the list
  1352. if(me.name == ListHelper[i] && i <= num_helper_kicked - 1)
  1353. {
  1354. Town();
  1355. while(leaderPlayerUnit.areaid === 108 || leaderPlayerUnit.areaid === 131 || leaderPlayerUnit.areaid === 132 || leaderPlayerUnit.areaid === 124)
  1356. {
  1357. NTC_PingDelay(1000);
  1358. }
  1359. break;
  1360. }
  1361. }
  1362. return;
  1363. }
  1364.  
  1365. function TPAtPlayersBody(playerName, enemysName)
  1366. {
  1367. var _playerUnit = aGetPlayerUnit(playerName);
  1368. var _playerUnit2 = GetLeader(playerName);
  1369. var _playerDistance;
  1370. if(_playerUnit)
  1371. _playerDistance = GetDistance(me, _playerUnit);
  1372. else
  1373. _playerDistance = -1;
  1374. var _playerArea = _playerUnit2.areaid;
  1375. var _myArea = me.areaid;
  1376.  
  1377. if(_playerDistance > 0 && _myArea == _playerArea)
  1378. {
  1379. if(_playerUnit)
  1380. NTM_GetCloserInt(_playerUnit);
  1381. else
  1382. NTM_MoveTo(leaderPlayerUnit.areaid, leaderPlayerUnit.x, leaderPlayerUnit.y);
  1383. TP("");
  1384. if(NTConfig_MessageDeadPlayers)
  1385. {
  1386. Whisper(playerName, NTConfig_DeadPlayerMsg);
  1387. }
  1388. }
  1389. }
  1390.  
  1391. function Guard() // Done
  1392. {
  1393. if(!NTC_InTown(me))
  1394. {
  1395. NTA_ClearPosition(15);
  1396. }
  1397. return;
  1398. }
  1399.  
  1400. function hAttack()
  1401. {
  1402. if(!NTC_InTown(me))
  1403. {
  1404. // if(NTA_CheckForCloseMonsters(30))
  1405. // {
  1406. NTA_ClearPosition(30);
  1407. Delay(1000);
  1408. return;
  1409. // }
  1410. // Say("Delay Now");
  1411. // return;
  1412. }
  1413. Delay(1000);
  1414. }
  1415.  
  1416. function hAttackThrone()
  1417. {
  1418. if(!NTC_InTown(me))
  1419. {
  1420. // if(NTA_CheckForCloseMonstersThrone(30))
  1421. // {
  1422. NTA_ClearPosition(30);
  1423. // NTA_ClearPosition(30, false);
  1424. Delay(1000);
  1425. return;
  1426. // }
  1427. // Say("Delay Now");
  1428. // return;
  1429. }
  1430. Delay(1000);
  1431. }
  1432.  
  1433. function isATown(id)
  1434. {
  1435. var _ret = false;
  1436. switch(id)
  1437. {
  1438. case 1: _ret = true; break;
  1439. case 40: _ret = true; break;
  1440. case 75: _ret = true; break;
  1441. case 103: _ret = true; break;
  1442. case 109: _ret = true; break;
  1443. }
  1444. return _ret;
  1445. }
  1446.  
  1447. function TakeLeaderTP() // Done
  1448. {
  1449. while(me.areaid == 0 || leaderPlayerUnit.areaid == 0)
  1450. {
  1451. NTC_Delay(100);
  1452. }
  1453. var _prearea = me.areaid;
  1454. var _preleaderarea = leaderPlayerUnit.areaid;
  1455. var _ret = false;
  1456. isBusy = true;
  1457.  
  1458. if(!NTC_InTown(me))
  1459. {
  1460. NTM_UsePortal("BluePortal", GetPlayerActWaypointID(me), leaderPlayerUnit.name);
  1461. NTC_PingDelay(NTConfig_AreaDelay);
  1462. if(NTC_InTown(me))
  1463. {
  1464. if(NTTMGR_CheckScrolls(1) < 8 || NTTMGR_CheckScrolls(0) < 10)
  1465. {
  1466. Whisper(leaderPlayerUnit.name, "Buying scrolls");
  1467. NTTMGR_TownManager();
  1468. }
  1469. }
  1470. }
  1471. else if(NTC_InTown(me))
  1472. {
  1473. NTM_UsePortal("BluePortal", _preleaderarea, leaderPlayerUnit.name);
  1474. NTC_PingDelay(NTConfig_AreaDelay);
  1475. if(!NTC_InTown(me))
  1476. {
  1477. NTP_DoPrecast(true);
  1478. }
  1479. }
  1480.  
  1481. if(_prearea !== me.areaid)
  1482. {
  1483. _ret = true;
  1484. }
  1485. else
  1486. {
  1487. _ret = false;
  1488. }
  1489.  
  1490. isBusy = false;
  1491. return _ret;
  1492. }
  1493.  
  1494. function GiveGold( amount ) // Done
  1495. {
  1496. isBusy = true;
  1497. _gold = me.GetStat(14);
  1498. if(amount != "")
  1499. {
  1500. if( parseInt(amount) <= 50000 && parseInt(amount) >= 1 )
  1501. {
  1502. if(parseInt(amount) <= _gold)
  1503. {
  1504. Gold(0, parseInt(amount))
  1505. }
  1506. else
  1507. {
  1508. Say("Sorry, I am out of gold!");
  1509. }
  1510. NTC_Delay(1000);
  1511. }
  1512. else
  1513. {
  1514. Say("Invalid amount. Valid range is 1-10000.");
  1515. }
  1516. }
  1517. else
  1518. {
  1519. Say("Invalid amount. Valid range is 1-10000.");
  1520. }
  1521. isBusy = false;
  1522. }
  1523.  
  1524. function Quest( msg ) // Done (needs testing)
  1525. {
  1526. if(!NTC_InTown(me))
  1527. Town();
  1528. switch(msg)
  1529. {
  1530. case "":
  1531. break;
  1532. case "cain":
  1533. Extras.Cain();
  1534. break;
  1535. case "andy":
  1536. case "andariel":
  1537. Quests.Andy();
  1538. break;
  1539. case "radament":
  1540. case "rada":
  1541. Extras.Radament();
  1542. break;
  1543. case "cube":
  1544. Quests.Cube();
  1545. break;
  1546. case "staff":
  1547. Quests.Staff();
  1548. break;
  1549. case "ammy":
  1550. Quests.Ammy();
  1551. break;
  1552. case "summoner":
  1553. Quests.Summoner();
  1554. break;
  1555. case "duriel":
  1556. Quests.Duriel();
  1557. break;
  1558. case "tome":
  1559. Extras.Tome();
  1560. break;
  1561. case "travincal":
  1562. case "trav":
  1563. Quests.Travincal();
  1564. break;
  1565. case "mephisto":
  1566. case "meph":
  1567. Quests.Mephisto();
  1568. break;
  1569. case "izual":
  1570. case "izzy":
  1571. Extras.Izual();
  1572. break;
  1573. case "diablo":
  1574. Quests.Diablo();
  1575. break;
  1576. case "shenk":
  1577. Extras.Shenk();
  1578. break;
  1579. case "anya":
  1580. Extras.Anya();
  1581. break;
  1582. case "ancients":
  1583. Quests.Ancients();
  1584. break;
  1585. case "baal":
  1586. Quests.Baal();
  1587. break;
  1588. case "imbue":
  1589. Imbue();
  1590. break;
  1591. default:
  1592. Invalid();
  1593. }
  1594. }
  1595.  
  1596. function Town() // Done
  1597. {
  1598. while(me.areaid == 0)
  1599. {
  1600. NTC_Delay(100);
  1601. }
  1602. var _ret = false;
  1603. var _prearea = me.areaid;
  1604.  
  1605. if(!NTC_InTown(me))
  1606. {
  1607. isBusy = true;
  1608. NTM_MakeTP();
  1609. NTC_PingDelay(500);
  1610.  
  1611. NTM_UsePortal("BluePortal", GetPlayerActWaypointID(me), me.charname);
  1612. NTC_PingDelay(NTConfig_AreaDelay);
  1613.  
  1614. if(NTC_InTown(me))
  1615. {
  1616. if(NTTMGR_CheckScrolls(1) < 8 || NTTMGR_CheckScrolls(0) < 10)
  1617. {
  1618. NTTMGR_TownManager();
  1619. }
  1620. }
  1621.  
  1622. if(_prearea !== me.areaid)
  1623. {
  1624. isBusy = false;
  1625. _ret = true;
  1626. return _ret;
  1627. }
  1628. else
  1629. {
  1630. isBusy = false;
  1631. _ret = false;
  1632. return _ret;
  1633. }
  1634. }
  1635. else if(NTC_InTown(me))
  1636. {
  1637. isBusy = true;
  1638. if(NTTMGR_CheckScrolls(1) < 8 || NTTMGR_CheckScrolls(0) < 10)
  1639. {
  1640. NTTMGR_TownManager();
  1641. }
  1642. isBusy = false;
  1643. _ret = true;
  1644. return _ret;
  1645. }
  1646. }
  1647.  
  1648. function Chant( msg ) // Done
  1649. {
  1650. if(msg == "on")
  1651. {
  1652. Say("!Auto enchant turned on!");
  1653. Say("Following and attacking disabled!");
  1654. isAutoEnchantEnabled = true;
  1655. return;
  1656. }
  1657.  
  1658. if(msg == "off")
  1659. {
  1660. Say("!Auto enchant turned off!");
  1661. isAutoEnchantEnabled = false;
  1662. return;
  1663. }
  1664.  
  1665. isBusy = true;
  1666. if(!NTC_InTown(me) && NTC_GetSkillLevel(52))
  1667. {
  1668. // Enchant player
  1669. var _player = NTC_FindUnit(NTC_UNIT_PLAYER);
  1670. //var _merc = NTC_FindUnit(NTC_UNIT_MERC);
  1671. if(!_player)
  1672. return;
  1673. do
  1674. {
  1675. if(_player.name !== me.name && GetDistance(me, _player) <= 20 && NTC_InMyParty(_player.name))
  1676. {
  1677. NTC_Delay(750);
  1678. NTC_CastSkill(52, NTC_HAND_RIGHT, _player);
  1679. }
  1680.  
  1681. // Enchant merc
  1682. var _merc = NTC_FindUnit(NTC_UNIT_MERC);
  1683. if (_merc)
  1684. {
  1685. do
  1686. {
  1687. if(NTC_CheckOwner(_merc, _player.name) && GetDistance(me, _merc) < 20 && _merc.hp > 0 && _player.name !== me.name)
  1688. {
  1689. NTC_Delay(750);
  1690. NTC_CastSkill(52, NTC_HAND_RIGHT, _merc);
  1691. }
  1692. } while (_merc.GetNext());
  1693. }
  1694. } while( _player.GetNext() )
  1695. }
  1696. // else
  1697. else if(NTC_InTown(me))
  1698. {
  1699. Say("I'm in town! Say 'help tp' for more information.");
  1700. }
  1701. isBusy = false;
  1702. }
  1703.  
  1704. function TP(msg) // Done
  1705. {
  1706. isBusy = true;
  1707. switch(msg)
  1708. {
  1709. case "":
  1710. if(!NTC_InTown(me))
  1711. {
  1712. if(!NTM_MakeTP())
  1713. {
  1714. Say("Failed to make a TP");
  1715. }
  1716. break;
  1717. }
  1718. if(NTC_InTown(me))
  1719. {
  1720. Say("I'm in town! Say 'help tp' for more information.");
  1721. }
  1722. isBusy = false;
  1723. break;
  1724.  
  1725. default:
  1726. var wpID = WaypointNameToID(msg);
  1727. if(wpID == -1)
  1728. {
  1729. Invalid();
  1730. isBusy = false;
  1731. return;
  1732. }
  1733.  
  1734. if(!NTC_InTown(me))
  1735. {
  1736. if(wpID != -1)
  1737. {
  1738. Town();
  1739. if(NTTMGR_CheckScrolls(1) <= 8)
  1740. {
  1741. Say("Buying scrolls first!");
  1742. NTTMGR_TownManager();
  1743. }
  1744. NTTM_TownMove("waypoint")
  1745. NTM_TakeWaypoint(wpID);
  1746. if(!NTM_MakeTP())
  1747. {
  1748. Say("Failed to make a TP");
  1749. }
  1750. break;
  1751. }
  1752. }
  1753. else
  1754. {
  1755. if(wpID != -1)
  1756. {
  1757. if(NTTMGR_CheckScrolls(1) <= 8)
  1758. {
  1759. Say("Buying scrolls first!");
  1760. NTTMGR_TownManager();
  1761. }
  1762. NTTM_TownMove("waypoint")
  1763. NTM_TakeWaypoint(wpID);
  1764. if(!NTM_MakeTP())
  1765. {
  1766. Say("Failed to make a TP"); // this too
  1767. }
  1768. }
  1769. }
  1770. break;
  1771. }
  1772. isBusy = false;
  1773. }
  1774.  
  1775. function CommandClear(msg) // Done
  1776. {
  1777. isBusy = true;
  1778. if(!NTC_InTown(me))
  1779. {
  1780. switch(msg)
  1781. {
  1782. case "":
  1783. NTA_ClearPosition( 30 )
  1784. break;
  1785. case "level":
  1786. NTA_ClearLevel();
  1787. break;
  1788. default:
  1789. if(msg >= 5 && msg <= 40)
  1790. NTA_ClearPosition(msg);
  1791. break;
  1792. }
  1793. }
  1794. else
  1795. {
  1796. Say("I'm in town!");
  1797. }
  1798. isBusy = false;
  1799. }
  1800.  
  1801. function Rush( msg ) // Done (needs testing)
  1802. {
  1803. isBusy = true;
  1804. isFollowingEnabled = false;
  1805. isAutoEnchantEnabled = false;
  1806. switch(msg)
  1807. {
  1808. case "":
  1809. Rush1();
  1810. Rush2();
  1811. Rush3();
  1812. Rush4();
  1813. Rush5();
  1814. break;
  1815. case "1":
  1816. Say("Starting act 1");
  1817. Rush1();
  1818. break;
  1819. case "2":
  1820. Say("Starting act 2");
  1821. Rush2();
  1822. break;
  1823. case "3":
  1824. Say("Starting act 3");
  1825. Rush3();
  1826. break;
  1827. case "4":
  1828. Say("Starting act 4");
  1829. Rush4();
  1830. break;
  1831. case "5":
  1832. Say("Starting act 5");
  1833. Rush5();
  1834. break;
  1835. default:
  1836. Invalid();
  1837. }
  1838. isBusy = false;
  1839. }
  1840.  
  1841. function Rush1()
  1842. {
  1843. if(NTConfig_Quest_Cain)
  1844. Extras.Cain();
  1845. Quests.Andy();
  1846. }
  1847.  
  1848. function Rush2()
  1849. {
  1850. if(NTConfig_Quest_Radament)
  1851. Extras.Radament();
  1852. if(me.diff == 0)
  1853. Quests.Cube();
  1854. Quests.Ammy();
  1855. Quests.Staff();
  1856. Quests.Summoner();
  1857. Quests.Duriel();
  1858. }
  1859.  
  1860. function Rush3()
  1861. {
  1862. if(NTConfig_Quest_Tome)
  1863. Extras.Tome();
  1864. Quests.Travincal();
  1865. Quests.Mephisto();
  1866. }
  1867.  
  1868. function Rush4()
  1869. {
  1870. if(NTConfig_Quest_Izual)
  1871. Extras.Izual();
  1872. Quests.Diablo();
  1873. }
  1874.  
  1875. function Rush5()
  1876. {
  1877. if(NTConfig_Quest_Shenk)
  1878. Extras.Shenk();
  1879. if(NTConfig_Quest_Anya)
  1880. Extras.Anya();
  1881. if(NTConfig_Quest_Ancients)
  1882. Quests.Ancients();
  1883. if(NTConfig_Quest_Baal)
  1884. Quests.Baal();
  1885. }
  1886.  
  1887. function Imbue()
  1888. {
  1889. if(!NTTM_CheckAct(1))
  1890. {
  1891. NTC_SendMsgToScript("NTBotGame.ntj", "NTTM_CheckAct()");
  1892. return;
  1893. }
  1894.  
  1895. NTTMGR_TownManager();
  1896.  
  1897. if(!NTTM_TownMove("waypoint"))
  1898. {
  1899. NTC_SendMsgToScript("NTBotGame.ntj", "NTTM_TownMove()");
  1900. return;
  1901. }
  1902.  
  1903. if(!NTM_TakeWaypoint(27))
  1904. {
  1905. NTC_SendMsgToScript("NTBotGame.ntj", "NTM_TakeWaypoint()");
  1906. return;
  1907. }
  1908.  
  1909. NTP_DoPrecast(true);
  1910.  
  1911. if(!NTM_MoveToPresetUnit(28, NTC_UNIT_OBJECT, 108, 5, 5, false))
  1912. {
  1913. NTC_SendMsgToScript("NTBotGame.ntj", "NTM_MoveToPresetUnit()");
  1914. return;
  1915. }
  1916. NTM_MakeTP();
  1917. NTC_Delay(500);
  1918.  
  1919. // if(!NTA_KillMonster(GetLocaleString(2889)))
  1920. // {
  1921. // NTC_SendMsgToScript("NTBotGame.ntj", "NTA_KillMonster()");
  1922. // return;
  1923. // }
  1924. NTA_ClearPosition(10);
  1925. Town();
  1926. }
  1927.  
  1928. // ******************************************************************************
  1929. // Internal functions
  1930. // ******************************************************************************
  1931.  
  1932. function WaypointNameToID(name) // for Nith, you have to say 'nit' instead of 'hal'. Conflicts with 'hal'ls of the dead.
  1933. {
  1934. var partial = name.substring(0, 3);
  1935. var returnID = -1;
  1936.  
  1937. // Area name to area ID
  1938. switch(partial)
  1939. {
  1940. // Act 1
  1941. case "col": // cold plains
  1942. returnID = 3;
  1943. break;
  1944. case "sto": // stony field
  1945. returnID = 4;
  1946. break;
  1947. case "dar": // dark wood
  1948. returnID = 5;
  1949. break;
  1950. case "bla": // black marsh
  1951. returnID = 6;
  1952. break;
  1953. case "out": // outer cloister
  1954. returnID = 27;
  1955. break;
  1956. case "jai": // jail level 1
  1957. returnID = 29;
  1958. break;
  1959. case "inn": // inner cloister
  1960. returnID = 32;
  1961. break;
  1962. case "cat": // catacombs level 2
  1963. returnID = 35;
  1964. break;
  1965.  
  1966. // Act 2
  1967. case "sew": // sewers level 2
  1968. returnID = 48;
  1969. break;
  1970. case "hal": // halls of the dead level 2
  1971. returnID = 57;
  1972. break;
  1973. case "far": // far oasis
  1974. returnID = 43;
  1975. break;
  1976. case "los": // lost city
  1977. returnID = 44;
  1978. break;
  1979. case "pal": // palace
  1980. returnID = 52;
  1981. break;
  1982. case "arc": // arcane
  1983. returnID = 74;
  1984. break;
  1985. case "can": // canyon
  1986. returnID = 46;
  1987. break;
  1988.  
  1989. // Act 3
  1990. case "spi": // spider forest
  1991. returnID = 76;
  1992. break;
  1993. case "gre": // great marsh
  1994. returnID = 77;
  1995. break;
  1996. case "fla": // flayer jungle
  1997. returnID = 78;
  1998. break;
  1999. case "low": // lower kurast
  2000. returnID = 79;
  2001. break;
  2002. case "kur": // kurast bazar
  2003. returnID = 80;
  2004. break;
  2005. case "upp": // upper kurast
  2006. returnID = 81;
  2007. break;
  2008. case "tra": // travincal
  2009. returnID = 83;
  2010. break;
  2011. case "dur": // durance of hate level 2
  2012. returnID = 101;
  2013. break;
  2014.  
  2015. // Act 4
  2016. case "cit": // city of the damned
  2017. returnID = 106;
  2018. break;
  2019. case "riv": // river of flame
  2020. returnID = 107;
  2021. break;
  2022.  
  2023. // Act 5
  2024. case "fri": // fridgid highlands
  2025. returnID = 111;
  2026. break;
  2027. case "arr": // arreat summit
  2028. returnID = 112;
  2029. break;
  2030. case "cry": // crystalline passage
  2031. returnID = 113;
  2032. break;
  2033. case "gla": // glacial trail
  2034. returnID = 115;
  2035. break;
  2036. case "fro": // frozen tundra
  2037. returnID = 117;
  2038. break;
  2039. case "nit": // nith
  2040. returnID = 123;
  2041. break;
  2042. case "anc": // ancients
  2043. returnID = 118;
  2044. break;
  2045. case "wor": // worldstone
  2046. returnID = 129;
  2047. break;
  2048. default:
  2049. returnID = -1;
  2050. }
  2051. return returnID;
  2052. }
  2053.  
  2054. function AreaHasWaypoint(area)
  2055. {
  2056. var _ret = false;
  2057. switch(area)
  2058. {
  2059. // ACT_1
  2060. case 3: _ret = true; break; // LEVEL_COLD_PLAINS
  2061. case 4: _ret = true; break; // LEVEL_STONY_FIELD
  2062. case 5: _ret = true; break; // LEVEL_DARK_WOOD
  2063. case 6: _ret = true; break; // LEVEL_BLACK_MARSH
  2064. case 27: _ret = true; break; // LEVEL_OUTER_CLOISTER
  2065. case 29: _ret = true; break; // LEVEL_JAIL_LEVEL_1
  2066. case 32: _ret = true; break; // LEVEL_INNER_CLOISTER
  2067. case 35: _ret = true; break; // LEVEL_CATACOMBS_LEVEL_2
  2068.  
  2069. // ACT_2
  2070. case 40: _ret = true; break; // LEVEL_LUT_GHOLEIN
  2071. case 42: _ret = true; break; // LEVEL_DRY_HILLS
  2072. case 43: _ret = true; break; // LEVEL_FAR_OASIS
  2073. case 44: _ret = true; break; // LEVEL_LOST_CITY
  2074. case 46: _ret = true; break; // LEVEL_CANYON_OF_THE_MAGI
  2075. case 48: _ret = true; break; // LEVEL_SEWERS_LEVEL_2
  2076. case 52: _ret = true; break; // LEVEL_PALACE_CELLAR_LEVEL_1
  2077. case 57: _ret = true; break; // LEVEL_HALLS_OF_THE_DEAD_LEVEL_2
  2078. case 74: _ret = true; break; // LEVEL_ARCANE_SANCTUARY
  2079.  
  2080. // ACT_3
  2081. case 76: _ret = true; break; // LEVEL_SPIDER_FOREST
  2082. case 77: _ret = true; break; // LEVEL_GREAT_MARSH
  2083. case 78: _ret = true; break; // LEVEL_FLAYER_JUNGLE
  2084. case 79: _ret = true; break; // LEVEL_LOWER_KURASH
  2085. case 80: _ret = true; break; // LEVEL_KURASH_BAZAAR
  2086. case 81: _ret = true; break; // LEVEL_UPPER_KURAST
  2087. case 83: _ret = true; break; // LEVEL_TRAVINCAL
  2088. case 101: _ret = true; break; // LEVEL_DURANCE_OF_HATE_LEVEL_2
  2089.  
  2090. // ACT_4
  2091. case 103: _ret = true; break; // LEVEL_PANDEMONIUM_FORTRESS
  2092. case 106: _ret = true; break; // LEVEL_CITY_OF_THE_DAMNED
  2093. case 107: _ret = true; break; // LEVEL_RIVER_OF_FLAME
  2094.  
  2095. // ACT_5
  2096. case 109: _ret = true; break; // LEVEL_HARROGATH
  2097. case 111: _ret = true; break; // LEVEL_FRIGID_HIGHLANDS
  2098. case 112: _ret = true; break; // LEVEL_ARREAT_PLATEAU
  2099. case 113: _ret = true; break; // LEVEL_CRYSTALLINE_PASSAGE
  2100. case 115: _ret = true; break; // LEVEL_GLACIAL_TRAIL
  2101. case 117: _ret = true; break; // LEVEL_FROZEN_TUNDRA
  2102. case 118: _ret = true; break; // LEVEL_GLACIAL_CAVES_LEVEL_1
  2103. case 123: _ret = true; break; // LEVEL_HALLS_OF_DEATHS_CALLING
  2104. case 129: _ret = true; break; // LEVEL_THE_WORLDSTONE_KEEP_LEVEL_2
  2105.  
  2106. default: _ret = false; break; // All other areas have no waypoints
  2107. }
  2108. return _ret;
  2109. }
  2110.  
  2111. // from koltons script
  2112. function GetLeader(name)
  2113. {
  2114. _party = GetPlayerUnit();
  2115.  
  2116. if (_party) {
  2117. do {
  2118. if (_party.name === name) {
  2119. return _party;
  2120. }
  2121. } while (_party.GetNext());
  2122. }
  2123.  
  2124. return false;
  2125. }
  2126.  
  2127. // from koltons script
  2128. function GetLeaderUnit(name)
  2129. {
  2130. var _unit = NTC_FindUnit(NTC_UNIT_PLAYER);
  2131.  
  2132. if (_unit) {
  2133. do {
  2134. if (_unit.name === name) {
  2135. return _unit;
  2136. }
  2137. } while (_unit.GetNext());
  2138. }
  2139. return false;
  2140. }
  2141.  
  2142. function aGetPlayerUnit(name)
  2143. {
  2144. var _unit = NTC_FindUnit(NTC_UNIT_PLAYER);
  2145.  
  2146. if (_unit) {
  2147. do {
  2148. if (_unit.name === name) {
  2149. return _unit;
  2150. }
  2151. } while (_unit.GetNext());
  2152. }
  2153. return false;
  2154. }
  2155.  
  2156. // from koltons script
  2157. function CheckAct(leaderPlayerUnit)
  2158. {
  2159. if (leaderPlayerUnit.areaid <= 39) {
  2160. return 1;
  2161. } else if(leaderPlayerUnit.areaid >= 40 && leaderPlayerUnit.areaid <= 74) {
  2162. return 2;
  2163. } else if(leaderPlayerUnit.areaid >= 75 && leaderPlayerUnit.areaid <= 102) {
  2164. return 3;
  2165. } else if(leaderPlayerUnit.areaid >= 103 && leaderPlayerUnit.areaid <= 108) {
  2166. return 4;
  2167. }
  2168. else return 5;
  2169. }
  2170.  
  2171. function GetPlayerActWaypointID(leaderPlayerUnit)
  2172. {
  2173. if (leaderPlayerUnit.areaid <= 39) {
  2174. return 1;
  2175. } else if(leaderPlayerUnit.areaid >= 40 && leaderPlayerUnit.areaid <= 74) {
  2176. return 40;
  2177. } else if(leaderPlayerUnit.areaid >= 75 && leaderPlayerUnit.areaid <= 102) {
  2178. return 75;
  2179. } else if(leaderPlayerUnit.areaid >= 103 && leaderPlayerUnit.areaid <= 108) {
  2180. return 103;
  2181. }
  2182. else return 109;
  2183. }
  2184.  
  2185. function CheckLeader(name)
  2186. {
  2187. _player = GetPlayerUnit();
  2188. if(_player)
  2189. {
  2190. do
  2191. {
  2192. if(_player.name != name)
  2193. continue;
  2194. if(_player.name == name)
  2195. return true;
  2196. } while(_player.GetNext())
  2197. }
  2198. return false;
  2199. }
  2200.  
  2201. function NTH_GetDistance(sx, sy, ex, ey)
  2202. {
  2203. // Laziness
  2204. }
  2205.  
  2206. function Whisper(name, msg)
  2207. {
  2208. // Sends a in-game whisper via @charname msg
  2209. // This does NOT get you IP bans or realms downs
  2210. // :)
  2211. Say("@" + name + " " + msg);
  2212. }
  2213.  
  2214. function LogActionPl0x(message)
  2215. {
  2216. // Debugging stuff
  2217. var time = new Date();
  2218. var hour = time.getHours();
  2219. var minute = time.getMinutes();
  2220. var second = time.getSeconds();
  2221. var millisecond = time.getMilliseconds();
  2222. var DoN = "AM";
  2223. if (hour > 11) { DoN = "PM"; }
  2224. if (hour > 12) { hour = hour - 12; }
  2225. if (hour == 0) { hour = 12; }
  2226. if (hour < 10) { hour = "0" + hour; }
  2227. if (minute < 10) { minute = "0" + minute; }
  2228. if (second < 10) { second = "0" + second; }
  2229. if (String(millisecond).length == 2) { millisecond = millisecond + "0"; }
  2230. if (String(millisecond).length == 1) { millisecond = millisecond + "00"; }
  2231. var timeString = "[" + hour + ':' + minute + ':' + second + ":" + millisecond + " " + DoN + "]";
  2232.  
  2233. var file = FileOpen("logs/NTHelperDebug.txt", 2);
  2234. if(!file)
  2235. file = FileOpen("logs/NTHelperDebug.txt", 1);
  2236.  
  2237. file.WriteLine(timeString + ": " + message);
  2238. file.Close();
  2239. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement