Advertisement
Guest User

Untitled

a guest
Sep 19th, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 91.60 KB | None | 0 0
  1. const NTA_DAMAGE_NONE = 0;
  2. const NTA_DAMAGE_PHYSICAL = 1;
  3. const NTA_DAMAGE_MAGIC = 2;
  4. const NTA_DAMAGE_FIRE = 3;
  5. const NTA_DAMAGE_LIGHTNING = 4;
  6. const NTA_DAMAGE_COLD = 5;
  7. const NTA_DAMAGE_POISON = 6;
  8.  
  9. var _NTA_SkillHand = new Array(10);
  10. var _NTA_SkillDamage = new Array(10);
  11. var _NTA_SkillRange = new Array(10);
  12.  
  13. var _sorcattack = 0;
  14. var skippedImmuneBoss = false;
  15.  
  16. function NTA_Initialize() {
  17. if (NTConfig_AttackSkill[1] == -1 || NTConfig_AttackSkill[3] == -1) {
  18. //NTA_DetectAttackPattern(); // the onld detection method disabling unless someone updates the list for the default attacks
  19. switch (me.classid) {
  20. case NTC_CHAR_CLASS_AMAZON:
  21. Print("No attacks where set in your NTConfig_Amazon_" + me.charname + ".ntl file!");
  22. break;
  23. case NTC_CHAR_CLASS_SORCERESS:
  24. Print("No attacks where set in your NTConfig_Sorceress_" + me.charname + ".ntl file!");
  25. break;
  26. case NTC_CHAR_CLASS_NECROMANCER:
  27. Print("No attacks where set in your NTConfig_Necromancer_" + me.charname + ".ntl file!");
  28. break;
  29. case NTC_CHAR_CLASS_PALADIN:
  30. Print("No attacks where set in your NTConfig_Paladin_" + me.charname + ".ntl file!");
  31. break;
  32. case NTC_CHAR_CLASS_BARBARIAN:
  33. Print("No attacks where set in your NTConfig_Barbarian_" + me.charname + ".ntl file!");
  34. break;
  35. case NTC_CHAR_CLASS_DRUID:
  36. Print("No attacks where set in your NTConfig_Druid_" + me.charname + ".ntl file!");
  37. break;
  38. case NTC_CHAR_CLASS_ASSASSIN:
  39. Print("No attacks where set in your NTConfig_Assassin_" + me.charname + ".ntl file!");
  40. break;
  41. default:
  42. Print("No attacks where set in your NTConfig_Class_" + me.charname + ".ntl file!");
  43. break;
  44.  
  45. }
  46. Print("Please set them then restart the bot");
  47. while (1) {
  48. Delay(500);
  49. }
  50. }
  51. for (var i = 0; i < 10; i++) {
  52. if (NTConfig_AttackSkill[i] > -1) {
  53. _NTA_SkillHand[i] = GetBaseStat("skills.txt", NTConfig_AttackSkill[i], 166) ? 2 : NTC_HAND_RIGHT;
  54. _NTA_SkillDamage[i] = NTA_GetDamageType(NTConfig_AttackSkill[i]);
  55.  
  56. switch (NTConfig_AttackSkill[i]) {
  57. case 0:
  58. //Normal Attack
  59. if (NTA_RangedNormal()) {
  60. _NTA_SkillRange[i] = 20;
  61. } else {
  62. _NTA_SkillRange[i] = 2;
  63. }
  64. break;
  65. case 1:
  66. //Kicks
  67. _NTA_SkillRange[i] = 2;
  68. break;
  69. case 5:
  70. // Left Hand Swing
  71. _NTA_SkillRange[i] = 2;
  72. break;
  73. case 6:
  74. //Magic Arrow
  75. break;
  76. case 7:
  77. //Fire Arrow
  78. _NTA_SkillRange[i] = 20;
  79. break;
  80. case 8:
  81. //Inner Sight
  82. _NTA_SkillRange[i] = 13;
  83. break;
  84. case 10:
  85. //Jab
  86. _NTA_SkillRange[i] = 3;
  87. break;
  88. case 11:
  89. //Cold Arrow
  90. break;
  91. case 12:
  92. //Multiple Shot
  93. _NTA_SkillRange[i] = 20;
  94. break;
  95. case 14:
  96. //Power Strike
  97. _NTA_SkillRange[i] = 3;
  98. break;
  99. case 15:
  100. //Poison Javelin
  101. _NTA_SkillRange[i] = 10;
  102. break;
  103. case 16:
  104. //Exploding Arrow
  105. _NTA_SkillRange[i] = 20;
  106. break;
  107. case 17:
  108. //Slow Missiles
  109. _NTA_SkillRange[i] = 13;
  110. break;
  111. case 19:
  112. //Impale
  113. _NTA_SkillRange[i] = 3;
  114. break;
  115. case 20:
  116. //Lightning Bolt
  117. break;
  118. case 21:
  119. //Ice arrow
  120. break;
  121. case 22:
  122. //Guided arrow
  123. _NTA_SkillRange[i] = 20;
  124. break;
  125. case 24:
  126. //Charged Strike
  127. _NTA_SkillRange[i] = 3;
  128. break;
  129. case 25:
  130. //Plague jav
  131. _NTA_SkillRange[i] = 10;
  132. break;
  133. case 26:
  134. //Strafe
  135. break;
  136. case 27:
  137. //Immolation Arrow
  138. _NTA_SkillRange[i] = 20;
  139. break;
  140. case 30:
  141. //Fend
  142. _NTA_SkillRange[i] = 3;
  143. break;
  144. case 31:
  145. //Freezing arrow
  146. _NTA_SkillRange[i] = 20;
  147. break;
  148. case 34:
  149. //Lightning Strike
  150. _NTA_SkillRange[i] = 3;
  151. break;
  152. case 35:
  153. //Lightning Fury
  154. _NTA_SkillRange[i] = 15;
  155. break;
  156. case 38:
  157. //charged bolt
  158. _NTA_SkillRange[i] = 7;
  159. break;
  160. case 41:
  161. // Inferno
  162. break;
  163. case 42:
  164. // Static
  165. _NTA_SkillRange[i] = 3;
  166. break;
  167. case 44:
  168. //Frost Nova
  169. _NTA_SkillRange[i] = 7;
  170. break;
  171. case 46:
  172. // Blaze
  173. _NTA_SkillRange[i] = 2;
  174. break;
  175. case 48:
  176. // Nova
  177. _NTA_SkillRange[i] = 7;
  178. break;
  179. case 64:
  180. // Frozen Orb
  181. _NTA_SkillRange[i] = 15;
  182. break;
  183. case 84:
  184. // Bone Spear
  185. _NTA_SkillRange[i] = 15;
  186. break;
  187. case 91:
  188. //Lower Resist
  189. _NTA_SkillRange[i] = 50;
  190. break;
  191. case 92:
  192. // Poison Nova
  193. _NTA_SkillRange[i] = 15;
  194. break;
  195. case 93:
  196. //Bone Spirit
  197. _NTA_SkillRange[i] = 15;
  198. break;
  199. case 95:
  200. //Revive
  201. _NTA_SkillRange[i] = 20;
  202. break;
  203. case 96:
  204. //Sacrifice
  205. break;
  206. case 97:
  207. //Smite
  208. _NTA_SkillRange[i] = 2;
  209. break;
  210. case 101:
  211. //Holy Bolt
  212. _NTA_SkillRange[i] = 15;
  213. break;
  214. case 106:
  215. //Zeal
  216. _NTA_SkillRange[i] = 3;
  217. break;
  218. case 111:
  219. //Vengeance
  220. _NTA_SkillRange[i] = 2;
  221. break;
  222. case 112:
  223. //Blessed Hammer
  224. _NTA_SkillRange[i] = 3;
  225. break;
  226. case 121:
  227. // FOH
  228. _NTA_SkillRange[i] = 20;
  229. break;
  230. case 126:
  231. // Bash
  232. break;
  233. case 130:
  234. // Howl
  235. _NTA_SkillRange[i] = 2;
  236. break;
  237. case 131:
  238. // find Potion
  239. _NTA_SkillRange[i] = 3;
  240. break;
  241. case 132:
  242. // Leap // this is limited by lvl so i set it to lvl 1 increase as needed
  243. _NTA_SkillRange[i] = 4;
  244. break;
  245. case 133:
  246. // Double Swing
  247. break;
  248. case 139:
  249. // stun
  250. _NTA_SkillRange[i] = 2;
  251. break;
  252. case 140:
  253. // Double Throw
  254. _NTA_SkillRange[i] = 20;
  255. break;
  256. case 142:
  257. // Find item
  258. _NTA_SkillRange[i] = 3;
  259. break;
  260. case 144:
  261. //Concentrate
  262. _NTA_SkillRange[i] = 3;
  263. break;
  264. case 146:
  265. // Battle cry
  266. _NTA_SkillRange[i] = 3;
  267. break;
  268. case 147:
  269. //Frenzy
  270. _NTA_SkillRange[i] = 2;
  271. break;
  272. case 150:
  273. //grim ward
  274. _NTA_SkillRange[i] = 3;
  275. break;
  276. case 151:
  277. //Whirlwind
  278. _NTA_SkillRange[i] = 8;
  279. break;
  280. case 152:
  281. //Berserk
  282. _NTA_SkillRange[i] = 2;
  283. break;
  284. case 154:
  285. // War Cry
  286. _NTA_SkillRange[i] = 4;
  287. break;
  288. case 225:
  289. //Fire Storm
  290. break;
  291. case 229:
  292. //Molten Boulder
  293. break;
  294. case 230:
  295. //Arctic Blast
  296. break;
  297. case 232:
  298. //Feral Rage
  299. break;
  300. case 233:
  301. //Maul
  302. break;
  303. case 234:
  304. //Fissure
  305. break;
  306. case 238:
  307. //Rabies
  308. break;
  309. case 239:
  310. //Fire Claws
  311. break;
  312. case 240:
  313. //Twister
  314. break;
  315. case 242:
  316. //Hunger
  317. break;
  318. case 243:
  319. //Shockwave
  320. break;
  321. case 244:
  322. //Volcano
  323. _NTA_SkillRange[i] = 3;
  324. break;
  325. case 245:
  326. //Tornado
  327. _NTA_SkillRange[i] = NTConfig_NadoDist;
  328. break;
  329. case 248:
  330. //Fury
  331. _NTA_SkillRange[i] = 3;
  332. break;
  333. case 249:
  334. //Armageddon
  335. _NTA_SkillRange[i] = 9;
  336. break;
  337. case 255:
  338. //Dragon Talon
  339. _NTA_SkillRange[i] = 2;
  340. break;
  341. case 271:
  342. // Lightning Sentry
  343. break;
  344. case 276:
  345. // Death Sentry
  346. break;
  347. case 261:
  348. // Charged Bolt Sentry
  349. _NTA_SkillRange[i] = 20;
  350. break;
  351. case 251:
  352. // Fire Blast
  353. break;
  354. case 256:
  355. // Shockweb Sentry
  356. _NTA_SkillRange[i] = 15;
  357. break;
  358. default:
  359. _NTA_SkillRange[i] = 25;
  360. break;
  361. }
  362. }
  363. }
  364.  
  365. if (me.classid == NTC_CHAR_CLASS_ASSASSIN) {
  366. NTA_InitializeAssassinAttacks();
  367. }
  368. }
  369.  
  370. function NTA_InitializeAssassinAttacks() {
  371. // Find maximum range value for traps.
  372. // No attacks should be set a high range value.
  373. NTConfig_MinTrapRange = 999;
  374. NTConfig_MinBossTrapRange = 999;
  375. NTConfig_NumTraps = 0;
  376. NTConfig_NumBossTrap = 0;
  377.  
  378. for (var i = 0; i < 5; i++) {
  379. if (NTConfig_TrapSet[i] > 0) {
  380. // Find the lowest trap range
  381. switch (NTConfig_TrapSet[i]) {
  382. case 271:
  383. // Lightning Sentry
  384. case 276:
  385. // Death Sentry
  386. NTConfig_NumTraps++;
  387. if (25 < NTConfig_MinTrapRange) {
  388. NTConfig_MinTrapRange = 25;
  389. }
  390. break;
  391. case 261:
  392. // Charged Bolt Sentry
  393. NTConfig_NumTraps++;
  394. if (10 < NTConfig_MinTrapRange) {
  395. NTConfig_MinTrapRange = 10;
  396. }
  397. break;
  398. case 262:
  399. // Wake of Fire
  400. NTConfig_NumTraps++;
  401. if (25 < NTConfig_MinTrapRange) {
  402. NTConfig_MinTrapRange = 25;
  403. }
  404. break;
  405. case 272:
  406. // Wake of Inferno
  407. NTConfig_NumTraps++;
  408. if (15 < NTConfig_MinTrapRange) {
  409. NTConfig_MinTrapRange = 15;
  410. }
  411. break;
  412. default:
  413. // User using invalid trap
  414. // Do Nothing
  415. break;
  416. }
  417.  
  418. }
  419.  
  420. if (NTConfig_ActBossTrapSet[i] > 0) {
  421. // Find the lowest trap range
  422. switch (NTConfig_ActBossTrapSet[i]) {
  423. case 271:
  424. // Lightning Sentry
  425. case 276:
  426. // Death Sentry
  427. NTConfig_NumBossTrap++;
  428. if (25 < NTConfig_MinBossTrapRange) {
  429. NTConfig_MinBossTrapRange = 25;
  430. }
  431. break;
  432. case 261:
  433. // Charged Bolt Sentry
  434. NTConfig_NumBossTrap++;
  435. if (10 < NTConfig_MinBossTrapRange) {
  436. NTConfig_MinBossTrapRange = 10;
  437. }
  438. break;
  439. case 262:
  440. // Wake of Fire
  441. NTConfig_NumBossTrap++;
  442. if (25 < NTConfig_MinBossTrapRange) {
  443. NTConfig_MinBossTrapRange = 25;
  444. }
  445. break;
  446. case 272:
  447. // Wake of Inferno
  448. NTConfig_NumBossTrap++;
  449. if (15 < NTConfig_MinBossTrapRange) {
  450. NTConfig_MinBossTrapRange = 15;
  451. }
  452. break;
  453. default:
  454. // User using invalid trap
  455. // Do Nothing
  456. break;
  457. }
  458. }
  459. }
  460.  
  461. }
  462.  
  463. function NTA_KillMonster(classid) {
  464. var _target;
  465.  
  466. if (NTConfig_AttackSkill[1] < 0) {
  467. return false;
  468. }
  469.  
  470. _target = NTC_FindUnit(NTC_UNIT_MONSTER, classid, 5);
  471.  
  472. if (!_target) {
  473. return false;
  474. }
  475.  
  476. if (_target.IsAttackable()) {
  477. var _attackcount = 0;
  478.  
  479. while (_attackcount < 300 && NTA_IsValidMonster(_target)) {
  480. if (NTA_Attack(_target, (_attackcount % 30) == 0) < 2) {
  481. break;
  482. }
  483.  
  484. _attackcount++;
  485. _sorcattack++;
  486. }
  487. }
  488. if(skippedImmuneBoss){
  489. Print(COLOR_2 + "skipping " + _target.name + " because of your skip immune settings");
  490. return true;
  491. }
  492. return (_target.hp <= 0 || _target.mode == 0 || _target.mode == 12);
  493. }
  494.  
  495. function NTA_ClearPosition(range, pickitem, safelevel) {
  496. var _orgx, _orgy;
  497. //var _spectype = [0x0A, 0x01, 0x01];
  498. var _spectype = [0x0A, 0x01];
  499. var _skiplist;
  500. var _gid_attackcount;
  501. var _attackcount = 0;
  502. var _target;
  503. var _distance, _mingid, _minshamangid, _mindistance, _minshamandistance;
  504. var _result;
  505.  
  506. if (NTConfig_AttackSkill[1] < 0 || NTConfig_AttackSkill[3] < 0) { return false; }
  507.  
  508. switch (arguments.length) {
  509. case 0:
  510. range = 20;
  511. break;
  512. case 1:
  513. pickitem = true;
  514. break;
  515. case 2:
  516. safelevel = 0;
  517. break;
  518. default:
  519. if ((NTConfig_CheckSelfSafe.length < 1) && (NTConfig_CheckMercSafe.length < 1)) { safelevel = 0; }
  520. break;
  521. }
  522.  
  523. _orgx = me.x;
  524. _orgy = me.y;
  525.  
  526. for (var i = 0; i < _spectype.length; i++) {
  527. _skiplist = new Array();
  528. _gid_attackcount = new Array();
  529.  
  530. while (_attackcount < (i + 1) * 100) {
  531. _minshamandistance = 100000;
  532. _mindistance = 100000;
  533.  
  534. _target = NTC_FindUnit(NTC_UNIT_MONSTER);
  535. if(NTConfig_TestFastSnag){
  536. NTSI_PickItems();
  537. }
  538. if (_target) {
  539. do {
  540. if (_skiplist.indexOf(_target.gid) < 0) {
  541. if (_target.IsAttackable() && (_target.spectype & _spectype[i])) {
  542. if (GetDistance(_orgx, _orgy, _target.x, _target.y) <= range && NTA_IsValidMonster(_target)) {
  543. _distance = GetDistance(me, _target);
  544. if (_distance < _mindistance) {
  545. _mingid = _target.gid;
  546. _mindistance = _distance;
  547. }
  548. if ((MonstersToAttackFirst.indexOf(_target.classid) > -1) && _distance < _minshamandistance) {
  549. _minshamangid = _target.gid;
  550. _minshamandistance = _distance;
  551. }
  552. }
  553. } else { _skiplist.push(_target.gid);
  554. }
  555. }
  556. } while(_target.GetNext());
  557. }
  558.  
  559. if (_minshamandistance < 100000) {
  560. _target = NTC_FindUnit(NTC_UNIT_MONSTER, _minshamangid);
  561.  
  562. if (_target) {
  563. if (_gid_attackcount[_minshamangid] == undefined) { _gid_attackcount[_minshamangid] = 1; }
  564. else { _gid_attackcount[_minshamangid]++; }
  565. if (NTconfig_HighMaxAttack || NTA_HighMaxAttackAreas()) {
  566. if (_gid_attackcount[_minshamangid] > NTConfig_HighMaxAttacks) {
  567. _skiplist.push(_minshamangid);
  568. }
  569. } else if (!NTconfig_HighMaxAttack || !NTA_HighMaxAttackAreas()) {
  570. if (_gid_attackcount[_minshamangid] > NTConfig_LowMaxAttacks) {
  571. Print(COLOR_1 + "I can't hit him!!! -> skipped");
  572. _skiplist.push(_minshamangid);
  573. }
  574. }
  575.  
  576. _result = NTA_Attack(_target, (_attackcount % 30) === 0);
  577.  
  578. switch (_result) {
  579. case 1:
  580. _skiplist.push(_minshamangid);
  581. break;
  582. case 2:
  583. break;
  584. case 3:
  585. if (NTConfig_FastPickit) { NTSI_PickItems(); }
  586. _attackcount++;
  587. _sorcattack++;
  588. break;
  589. default:
  590. return false;
  591. }
  592. }
  593. } else if (_mindistance < 100000) {
  594. _target = NTC_FindUnit(NTC_UNIT_MONSTER, _mingid);
  595. if(NTConfig_TestFastSnag){
  596. NTSI_PickItems();
  597. }
  598. if (_target) {
  599. if (_gid_attackcount[_mingid] == undefined) { _gid_attackcount[_mingid] = 1; }
  600. else { _gid_attackcount[_mingid]++; }
  601. if (NTconfig_HighMaxAttack || NTA_HighMaxAttackAreas()) {
  602. if (_gid_attackcount[_mingid] > NTConfig_HighMaxAttacks) {
  603. _skiplist.push(_mingid);
  604. }
  605. } else if (!NTconfig_HighMaxAttack || !NTA_HighMaxAttackAreas()) {
  606. if (_gid_attackcount[_mingid] > NTConfig_LowMaxAttacks) {
  607. Print(COLOR_1 + "I can't hit him!!! -> skipped");
  608. _skiplist.push(_mingid);
  609. }
  610. }
  611.  
  612. _result = NTA_Attack(_target, (_attackcount % 30) === 0);
  613.  
  614. switch (_result) {
  615. case 1:
  616. _skiplist.push(_mingid);
  617. break;
  618. case 2:
  619. break;
  620. case 3:
  621. if (NTConfig_FastPickit) { NTSI_PickItems(); }
  622. _attackcount++;
  623. _sorcattack++;
  624. break;
  625. default:
  626. return false;
  627. }
  628. }
  629. } else { break; }
  630. }
  631. }
  632.  
  633. if (me.classid == NTC_CHAR_CLASS_PALADIN) {
  634. if (_attackcount > 2 && ((parseFloat(me.hp * 100 / me.hpmax) < NTConfig_UseRedemptionHP) || (parseInt(me.mp * 100 / me.mpmax, 10) < NTConfig_UseRedemptionMP))) {
  635. if (NTC_PutSkill(124, NTC_HAND_RIGHT)) { NTC_PingDelay(1000); }
  636. }
  637. } else if (me.classid == NTC_CHAR_CLASS_NECROMANCER) {
  638. NTA_SkeletonArmy(NTConfig_SkeletonArmy);
  639. NTA_MageArmy(NTConfig_MageArmy);
  640. NTA_ReviveArmy(NTConfig_ReviveArmy);
  641. } else if (me.classid == NTC_CHAR_CLASS_BARBARIAN) {
  642. if (NTConfig_UseFindItem && _attackcount > 2) {
  643. if (!NTA_CheckForCloseMonsters(10)) {
  644. //Print(COLOR_25 + "No Monsters close - looting");
  645. NTA_FindItem(NTConfig_FindItemRange);
  646. }
  647. }
  648. }
  649.  
  650. if (NTConfig_OpenChest) {
  651. _target = NTC_GetSpecialChest();
  652.  
  653. if (_target && GetDistance(_orgx, _orgy, _target.x, _target.y) <= range && NTC_OpenChest(_target)) { _attackcount++; _sorcattack++; }
  654. }
  655. if (NTConfig_OpenChestsInAreaClearing && NTConfig_AreasToOpenChestClearing.indexOf(me.areaid) != -1) {
  656. NTC_OpenChestsInAreaNear(_orgx, _orgy, range);
  657. }
  658.  
  659. if(NTConfig_IdInField){
  660. if (!NTT_CheckSpace(3, 2)) {
  661. NT_FieldID();
  662. } // id in field add
  663. }
  664. if (pickitem && _attackcount > 0) { NTSI_PickItems(); }
  665.  
  666. if(NTConfig_IdInField){
  667. if (!NTT_CheckSpace(3, 2)) {
  668. NT_FieldID();
  669. } // id in field add
  670. }
  671.  
  672. switch (safelevel) {
  673. case 1:
  674. return NTTMGR_CheckSafe(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe);
  675. case 2:
  676. return NTTMGR_CheckSafe(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe);
  677. default:
  678. break;
  679. }
  680.  
  681. return true;
  682. }
  683.  
  684. function NTA_ClearLevel(pickitem, safelevel) {
  685. var i;
  686. var _room, _rooms;
  687. var _distance, _minindex, _mindistance;
  688.  
  689. _room = GetRoom();
  690.  
  691. if (!_room) { return false; }
  692.  
  693. switch (arguments.length) {
  694. case 0:
  695. pickitem = true;
  696. break;
  697. case 1:
  698. safelevel = 2;
  699. break;
  700. default:
  701. if ((NTConfig_CheckSelfSafe.length < 1) && (NTConfig_CheckMercSafe.length < 1)) { safelevel = 0; }
  702. break;
  703. }
  704.  
  705. _rooms = new Array();
  706.  
  707. do {
  708. _rooms.push([parseFloat(_room.x * 5 + _room.xsize * 5 / 2), parseFloat(_room.y * 5 + _room.ysize * 5 / 2)]);
  709. } while(_room.GetNext());
  710.  
  711. while (_rooms.length > 0) {
  712. _mindistance = 100000;
  713.  
  714. for (i = 0; i < _rooms.length; i++) {
  715. _distance = GetDistance(me.x, me.y, _rooms[i][0], _rooms[i][1]);
  716.  
  717. if (_distance < _mindistance) {
  718. _minindex = i;
  719. _mindistance = _distance;
  720. }
  721. }
  722.  
  723. if (NTM_MoveTo(me.areaid, _rooms[_minindex][0], _rooms[_minindex][1], 1, false, false)) {
  724. if (!NTA_ClearRoom(pickitem, safelevel)) { return false; }
  725.  
  726. NTP_DoPrecast(false);
  727. }
  728.  
  729. _rooms.splice(_minindex, 1);
  730. }
  731.  
  732. return true;
  733. }
  734.  
  735. function NTA_ClearRoom(pickitem, safelevel) {
  736. var _room;
  737. var _spectype = [0x0A, 0x01, 0x01];
  738. var _skiplist, _gid_attackcount;
  739. var _attackcount = 0;
  740. var _target;
  741. var _distance, _mingid, _mindistance, _minshamangid, _minshamandistance;
  742. var _result;
  743.  
  744. if (NTConfig_AttackSkill[1] < 0 || NTConfig_AttackSkill[3] < 0) return false;
  745.  
  746. _room = me.GetRoom();
  747.  
  748. if (!_room) return false;
  749.  
  750. switch (arguments.length) {
  751. case 0:
  752. pickitem = false;
  753. case 1:
  754. safelevel = 0;
  755. default:
  756. if ((NTConfig_CheckSelfSafe.length < 1) && (NTConfig_CheckMercSafe.length < 1)) safelevel = 0;
  757. break;
  758. }
  759.  
  760. for (var i = 0; i < _spectype.length; i++) {
  761. _skiplist = new Array();
  762. _gid_attackcount = new Array();
  763.  
  764. while (_attackcount < (i + 1) * 100) {
  765. _mindistance = 100000;
  766. _minshamandistance = 100000;
  767.  
  768. _target = NTC_FindUnit(NTC_UNIT_MONSTER);
  769. if(NTConfig_TestFastSnag){
  770. NTSI_PickItems();
  771. }
  772.  
  773. if (_target) {
  774. do {
  775. if (_skiplist.indexOf(_target.gid) < 0) {
  776. if (_target.IsAttackable() && (_target.spectype & _spectype[i])) {
  777. if (_room.UnitInRoom(_target) && NTA_IsValidMonster(_target)) {
  778. if (MonstersToAttackFirst.indexOf(_target.classid) > -1) {
  779. _distance = GetDistance(me, _target);
  780.  
  781. if (_distance < _minshamandistance) {
  782. _minshamangid = _target.gid;
  783. _minshamandistance = _distance;
  784. }
  785. } else {
  786. _distance = GetDistance(me, _target);
  787.  
  788. if (_distance < _mindistance) {
  789. _mingid = _target.gid;
  790. _mindistance = _distance;
  791. }
  792. }
  793. }
  794. } else _skiplist.push(_target.gid);
  795. }
  796. } while (_target.GetNext());
  797. }
  798.  
  799. if (_minshamandistance < 100000) {
  800. _target = NTC_FindUnit(NTC_UNIT_MONSTER, _minshamangid);
  801. if(NTConfig_TestFastSnag){
  802. NTSI_PickItems();
  803. }
  804.  
  805. if (_target) {
  806. _result = NTA_Attack(_target, (_attackcount % 30) == 0);
  807.  
  808. if (_gid_attackcount[_minshamangid] == undefined) _gid_attackcount[_minshamangid] = 1;
  809. else _gid_attackcount[_minshamangid]++;
  810. if (NTconfig_HighMaxAttack || NTA_HighMaxAttackAreas()) {
  811. if (_gid_attackcount[_minshamangid] > NTConfig_HighMaxAttacks) {
  812. _skiplist.push(_minshamangid);
  813. }
  814. } else if (!NTconfig_HighMaxAttack || !NTA_HighMaxAttackAreas()) {
  815. if (_gid_attackcount[_minshamangid] > NTConfig_LowMaxAttacks) {
  816. Print(COLOR_1 + "I can't hit him!!! -> skipped");
  817. _skiplist.push(_minshamangid);
  818. }
  819. }
  820.  
  821. switch (_result) {
  822. case 1:
  823. _skiplist.push(_minshamangid);
  824. break;
  825. case 2:
  826. case 3:
  827. if (NTConfig_FastPickit) NTSI_PickItems();
  828. _attackcount++;
  829. _sorcattack++;
  830. break;
  831. default:
  832. return false;
  833. }
  834. }
  835. } else if (_mindistance < 100000) {
  836. _target = NTC_FindUnit(NTC_UNIT_MONSTER, _mingid);
  837. if(NTConfig_TestFastSnag){
  838. NTSI_PickItems();
  839. }
  840.  
  841. if (_target) {
  842. _result = NTA_Attack(_target, (_attackcount % 30) == 0);
  843.  
  844. if (_gid_attackcount[_mingid] == undefined) _gid_attackcount[_mingid] = 1;
  845. else _gid_attackcount[_mingid]++;
  846. if (NTconfig_HighMaxAttack || NTA_HighMaxAttackAreas()) {
  847. if (_gid_attackcount[_mingid] > NTConfig_HighMaxAttacks) {
  848. _skiplist.push(_mingid);
  849. }
  850. } else if (!NTconfig_HighMaxAttack || !NTA_HighMaxAttackAreas()) {
  851. if (_gid_attackcount[_mingid] > NTConfig_LowMaxAttacks) {
  852. Print(COLOR_1 + "I can't hit him!!! -> skipped");
  853. _skiplist.push(_mingid);
  854. }
  855. }
  856.  
  857. switch (_result) {
  858. case 1:
  859. _skiplist.push(_mingid);
  860. break;
  861. case 2:
  862. case 3:
  863. if (NTConfig_FastPickit) NTSI_PickItems();
  864. _attackcount++;
  865. _sorcattack++;
  866. break;
  867. default:
  868. return false;
  869. }
  870. }
  871. } else break;
  872. }
  873. }
  874.  
  875. if (me.classid == NTC_CHAR_CLASS_PALADIN) {
  876. if (_attackcount > 2 && (parseInt(me.hp * 100 / me.hpmax) < NTConfig_UseRedemptionHP || parseInt(me.mp * 100 / me.mpmax) < NTConfig_UseRedemptionMP)) {
  877. if (NTC_PutSkill(124, NTC_HAND_RIGHT)) NTC_PingDelay(1000);
  878. }
  879. } else if (me.classid == NTC_CHAR_CLASS_NECROMANCER) {
  880. NTA_SkeletonArmy(NTConfig_SkeletonArmy);
  881. NTA_MageArmy(NTConfig_MageArmy);
  882. NTA_ReviveArmy(NTConfig_ReviveArmy);
  883. } else if (me.classid == NTC_CHAR_CLASS_BARBARIAN) {
  884. if (NTConfig_UseFindItem && _attackcount > 2) {
  885. if (!NTA_CheckForCloseMonsters(10)) {
  886. //Print(COLOR_25 + "No Monsters close - looting");
  887. NTA_FindItem(NTConfig_FindItemRange);
  888. }
  889. }
  890. }
  891.  
  892. if (NTConfig_OpenChest) {
  893. _target = NTC_GetSpecialChest();
  894.  
  895. if (_target && _room.UnitInRoom(_target) && NTC_OpenChest(_target)) _attackcount++;
  896. _sorcattack++;
  897. }
  898.  
  899. if (NTConfig_OpenChestsInAreaClearing && NTConfig_AreasToOpenChestClearing.indexOf(me.areaid) != -1) {
  900. NTC_OpenChestsInAreaNear(me.x, me.y, 20);
  901. }
  902.  
  903. if(NTConfig_IdInField){
  904. if (!NTT_CheckSpace(3, 2)) {
  905. NT_FieldID();
  906. } // id in field add
  907. }
  908.  
  909. if (pickitem && _attackcount > 0) { NTSI_PickItems(); }
  910.  
  911. if(NTConfig_IdInField){
  912. if (!NTT_CheckSpace(3, 2)) {
  913. NT_FieldID();
  914. } // id in field add
  915. }
  916.  
  917. switch (safelevel) {
  918. case 1:
  919. return NTTMGR_CheckSafe(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe);
  920. case 2:
  921. return NTTMGR_CheckSafe(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe);
  922. }
  923.  
  924. return true;
  925. }
  926.  
  927. function NTA_IsValidMonster(monster) {
  928. var _classid;
  929. var _ES = NTC_GetSkillLevel(58);
  930.  
  931. if (monster.hp <= 0 || monster.mode == 0 || monster.mode == 12) return false;
  932.  
  933. _classid = monster.classid;
  934.  
  935. if (((_classid >= 110 && _classid <= 113) || _classid == 608) && monster.mode == 8) // ignore flying scavengers
  936. return false;
  937.  
  938. if (_classid == 68 && monster.mode == 14) // ignore burrowing maggots
  939. return false;
  940.  
  941. if (_classid >= 258 && _classid <= 263 && monster.mode == 14) // ignore submerged WaterWatchers
  942. return false;
  943.  
  944. if (monster.GetState(53) || monster.GetState(96)) // Conversion, Revive
  945. return false;
  946.  
  947. if (monster.name == GetLocaleString(3162) && GetDistance(me.x, me.y, monster.x, monster.y) < 20) if (!CheckCollision(me.areaid, monster.x, monster.y, 0) || !CheckCollision(me.areaid, monster.x, monster.y, 1) || !CheckCollision(me.areaid, monster.x, monster.y, 5)) return false;
  948.  
  949. if (NTConfig_SkipRegularMonsters) if (monster.spectype == 1 && me.areaid != 131) return false;
  950.  
  951. if (me.classid == NTC_CHAR_CLASS_DRUID) {
  952. if (!me.GetState(144)) NTC_CastSkill(250, NTC_HAND_RIGHT);
  953. if (!me.GetState(151)) NTC_CastSkill(235, NTC_HAND_RIGHT);
  954. if (!me.GetState(149)) NTC_CastSkill(226, NTC_HAND_RIGHT);
  955.  
  956. }
  957. //var haveBO = NTC_GetSkillLevel(149);
  958. //if((NTA_CheckForCTA() || haveBO > 1) && !me.GetState(32)){
  959. //NTP_DoPrecast();
  960. //}
  961. if (NTConfig_AreasToNotSkipImmunes.indexOf(me.areaid) == -1) {
  962. skippedImuneBoss = false;
  963. if (NTConfig_SkipSingle[0]) {
  964. if (NTA_GetResistance(monster, NTA_DAMAGE_PHYSICAL) > 95) {
  965. skippedImmuneBoss = true;
  966. return false;
  967. }
  968. }
  969. if (NTConfig_SkipSingle[1]) {
  970. if (NTA_GetResistance(monster, NTA_DAMAGE_MAGIC) > 95) {
  971. skippedImmuneBoss = true;
  972. return false;
  973. }
  974. }
  975. if (NTConfig_SkipSingle[2]) {
  976. if (NTA_GetResistance(monster, NTA_DAMAGE_FIRE) > 95) {
  977. skippedImmuneBoss = true;
  978. return false;
  979. }
  980. }
  981. if (NTConfig_SkipSingle[3]) {
  982. if (NTA_GetResistance(monster, NTA_DAMAGE_LIGHTNING) > 95) {
  983. skippedImmuneBoss = true;
  984. return false;
  985. }
  986. }
  987. if (NTConfig_SkipSingle[4]) {
  988. if (NTA_GetResistance(monster, NTA_DAMAGE_COLD) > 95) {
  989. skippedImmuneBoss = true;
  990. return false;
  991. }
  992. }
  993. if (NTConfig_SkipSingle[5]) {
  994. if (NTA_GetResistance(monster, NTA_DAMAGE_POISON) > 95) {
  995. skippedImmuneBoss = true;
  996. return false;
  997. }
  998. }
  999. if (NTConfig_SkipDual[0]) {
  1000. if (NTA_GetResistance(monster, NTA_DAMAGE_PHYSICAL) > 95 && NTA_GetResistance(monster, NTA_DAMAGE_MAGIC) > 95) {
  1001. skippedImmuneBoss = true;
  1002. return false;
  1003. }
  1004. }
  1005. if (NTConfig_SkipDual[1]) {
  1006. if (NTA_GetResistance(monster, NTA_DAMAGE_PHYSICAL) > 95 && NTA_GetResistance(monster, NTA_DAMAGE_FIRE) > 95) {
  1007. skippedImmuneBoss = true;
  1008. return false;
  1009. }
  1010. }
  1011. if (NTConfig_SkipDual[2]) {
  1012. if (NTA_GetResistance(monster, NTA_DAMAGE_PHYSICAL) > 95 && NTA_GetResistance(monster, NTA_DAMAGE_LIGHTNING) > 95) {
  1013. skippedImmuneBoss = true;
  1014. return false;
  1015. }
  1016. }
  1017. if (NTConfig_SkipDual[3]) {
  1018. if (NTA_GetResistance(monster, NTA_DAMAGE_PHYSICAL) > 95 && NTA_GetResistance(monster, NTA_DAMAGE_COLD) > 95) {
  1019. skippedImmuneBoss = true;
  1020. return false;
  1021. }
  1022. }
  1023. if (NTConfig_SkipDual[4]) {
  1024. if (NTA_GetResistance(monster, NTA_DAMAGE_PHYSICAL) > 95 && NTA_GetResistance(monster, NTA_DAMAGE_POISON) > 95) {
  1025. skippedImmuneBoss = true;
  1026. return false;
  1027. }
  1028. }
  1029. if (NTConfig_SkipDual[5]) {
  1030. if (NTA_GetResistance(monster, NTA_DAMAGE_MAGIC) > 95 && NTA_GetResistance(monster, NTA_DAMAGE_FIRE) > 95) {
  1031. skippedImmuneBoss = true;
  1032. return false;
  1033. }
  1034. }
  1035. if (NTConfig_SkipDual[6]) {
  1036. if (NTA_GetResistance(monster, NTA_DAMAGE_MAGIC) > 95 && NTA_GetResistance(monster, NTA_DAMAGE_LIGHTNING) > 95) {
  1037. skippedImmuneBoss = true;
  1038. return false;
  1039. }
  1040. }
  1041. if (NTConfig_SkipDual[7]) {
  1042. if (NTA_GetResistance(monster, NTA_DAMAGE_MAGIC) > 95 && NTA_GetResistance(monster, NTA_DAMAGE_COLD) > 95) {
  1043. skippedImmuneBoss = true;
  1044. return false;
  1045. }
  1046. }
  1047. if (NTConfig_SkipDual[8]) {
  1048. if (NTA_GetResistance(monster, NTA_DAMAGE_MAGIC) > 95 && NTA_GetResistance(monster, NTA_DAMAGE_POISON) > 95) {
  1049. skippedImmuneBoss = true;
  1050. return false;
  1051. }
  1052. }
  1053. if (NTConfig_SkipDual[9]) {
  1054. if (NTA_GetResistance(monster, NTA_DAMAGE_FIRE) > 95 && NTA_GetResistance(monster, NTA_DAMAGE_LIGHTNING) > 95) {
  1055. skippedImmuneBoss = true;
  1056. return false;
  1057. }
  1058. }
  1059. if (NTConfig_SkipDual[10]) {
  1060. if (NTA_GetResistance(monster, NTA_DAMAGE_FIRE) > 95 && NTA_GetResistance(monster, NTA_DAMAGE_COLD) > 95) {
  1061. skippedImmuneBoss = true;
  1062. return false;
  1063. }
  1064. }
  1065. if (NTConfig_SkipDual[11]) {
  1066. if (NTA_GetResistance(monster, NTA_DAMAGE_FIRE) > 95 && NTA_GetResistance(monster, NTA_DAMAGE_POISON) > 95) {
  1067. skippedImmuneBoss = true;
  1068. return false;
  1069. }
  1070. }
  1071. if (NTConfig_SkipDual[12]) {
  1072. if (NTA_GetResistance(monster, NTA_DAMAGE_LIGHTNING) > 95 && NTA_GetResistance(monster, NTA_DAMAGE_COLD) > 95) {
  1073. skippedImmuneBoss = true;
  1074. return false;
  1075. }
  1076. }
  1077. if (NTConfig_SkipDual[13]) {
  1078. if (NTA_GetResistance(monster, NTA_DAMAGE_LIGHTNING) > 95 && NTA_GetResistance(monster, NTA_DAMAGE_POISON) > 95) {
  1079. skippedImmuneBoss = true;
  1080. return false;
  1081. }
  1082. }
  1083. if (NTConfig_SkipDual[14]) {
  1084. if (NTA_GetResistance(monster, NTA_DAMAGE_COLD) > 95 && NTA_GetResistance(monster, NTA_DAMAGE_POISON) > 95) {
  1085. skippedImmuneBoss = true;
  1086. return false;
  1087. }
  1088. }
  1089. }
  1090. if(_ES > 0 && me.GetState(30) == 0) { NTC_CastSkill(58, NTC_HAND_RIGHT); } //Check Energy Shield
  1091. return true;
  1092. }
  1093.  
  1094. function NTA_GetDamageType(skillid) {
  1095. if (skillid == 74 || skillid == 147 || skillid == 97) // Corpse Explosion && Frenzy && Smite
  1096. return NTA_DAMAGE_PHYSICAL;
  1097. if (skillid == 111) // Vengeance
  1098. return NTA_DAMAGE_NONE;
  1099. if (me.classid == NTC_CHAR_CLASS_PALADIN && (NTConfig_AttackSkill[1] == 112 && NTConfig_AttackSkill[5] > -1)) {
  1100. if (skillid == 101) //holy bolt
  1101. return NTA_DAMAGE_NONE;
  1102. } else {
  1103. if (skillid == 112) // Blessed Hammer
  1104. return NTA_DAMAGE_NONE;
  1105. }
  1106.  
  1107. switch (GetBaseStat("skills.txt", skillid, 233)) {
  1108. case "cold":
  1109. return NTA_DAMAGE_COLD;
  1110. case "fire":
  1111. return NTA_DAMAGE_FIRE;
  1112. case "ltng":
  1113. return NTA_DAMAGE_LIGHTNING;
  1114. case "mag":
  1115. return NTA_DAMAGE_MAGIC;
  1116. case "pois":
  1117. return NTA_DAMAGE_POISON;
  1118. case "stun":
  1119. return NTA_DAMAGE_NONE;
  1120. default:
  1121. if (GetBaseStat("skills.txt", skillid, 178) || GetBaseStat("skills.txt", skillid, 182)) // aura or passive
  1122. return NTA_DAMAGE_NONE;
  1123. }
  1124.  
  1125. return NTA_DAMAGE_PHYSICAL;
  1126. }
  1127.  
  1128. function NTA_GetResistance(enemy, type) {
  1129. switch (type) {
  1130. case NTA_DAMAGE_PHYSICAL:
  1131. return enemy.GetStat(36);
  1132. case NTA_DAMAGE_MAGIC:
  1133. return enemy.GetStat(37);
  1134. case NTA_DAMAGE_FIRE:
  1135. return enemy.GetStat(39);
  1136. case NTA_DAMAGE_LIGHTNING:
  1137. return enemy.GetStat(41);
  1138. case NTA_DAMAGE_COLD:
  1139. return enemy.GetStat(43);
  1140. case NTA_DAMAGE_POISON:
  1141. return enemy.GetStat(45);
  1142. }
  1143.  
  1144. return 0;
  1145. }
  1146.  
  1147. function NTA_DetectAttackPattern() {
  1148. switch (me.classid) {
  1149. case NTC_CHAR_CLASS_AMAZON:
  1150. return NTA_AmazonAttackPatternInt();
  1151. case NTC_CHAR_CLASS_SORCERESS:
  1152. return NTA_SorceressAttackPatternInt();
  1153. case NTC_CHAR_CLASS_NECROMANCER:
  1154. return NTA_NecromancerAttackPatternInt();
  1155. case NTC_CHAR_CLASS_PALADIN:
  1156. return NTA_PaladinAttackPatternInt();
  1157. case NTC_CHAR_CLASS_BARBARIAN:
  1158. return NTA_BarbarianAttackPatternInt();
  1159. case NTC_CHAR_CLASS_DRUID:
  1160. return NTA_DruidAttackPatternInt();
  1161. case NTC_CHAR_CLASS_ASSASSIN:
  1162. return NTA_AssassinAttackPatternInt();
  1163. }
  1164.  
  1165. return false;
  1166. }
  1167.  
  1168. // Return value : 0 = Unrecoverable process, 1 = Unavailable attack, 2 = Onetime fail, 3 = Success
  1169.  
  1170. function NTA_Attack(target, firstorder) {
  1171. switch (me.classid) {
  1172. case NTC_CHAR_CLASS_AMAZON:
  1173. return NTA_AmazonAttackInt(target, firstorder);
  1174. case NTC_CHAR_CLASS_SORCERESS:
  1175. return NTA_SorceressAttackInt(target, firstorder);
  1176. case NTC_CHAR_CLASS_NECROMANCER:
  1177. return NTA_NecromancerAttackInt(target, firstorder);
  1178. case NTC_CHAR_CLASS_PALADIN:
  1179. return NTA_PaladinAttackInt(target, firstorder);
  1180. case NTC_CHAR_CLASS_BARBARIAN:
  1181. return NTA_BarbarianAttackInt(target, firstorder);
  1182. case NTC_CHAR_CLASS_DRUID:
  1183. return NTA_DruidAttackInt(target, firstorder);
  1184. case NTC_CHAR_CLASS_ASSASSIN:
  1185. return NTA_AssassinAttackInt(target, firstorder);
  1186. }
  1187.  
  1188. return 0;
  1189. }
  1190.  
  1191. function NTA_IsWeaponBroken() {
  1192. var _weapon;
  1193. _weapon = me.GetItems();
  1194.  
  1195. if (_weapon) {
  1196. for (var i = 0; i < _weapon.length; i++) {
  1197. if (_weapon[i].itemflag & 0x100) {
  1198. if (_weapon[i].mode == 1 && _weapon[i].itemloc == 4 || _weapon[i].itemloc == 5) {
  1199. Print(COLOR_8 + "My weapon broke, I am going to town to repair it.");
  1200. NTTMGR_VisitTown();
  1201. break;
  1202.  
  1203. }
  1204. }
  1205. }
  1206. }
  1207. }
  1208.  
  1209. function NTA_RangedNormal() {
  1210. var _weapon;
  1211. var _range;
  1212.  
  1213. _weapon = me.GetItems();
  1214.  
  1215. if (_weapon) {
  1216. for (var i = 0; i < _weapon.length; i++) {
  1217. if (_weapon[i].mode == 1 && (_weapon[i].itemloc == 4 || _weapon[i].itemloc == 5)) {
  1218. switch (_weapon[i].classid) {
  1219. //Bows
  1220. case 68:
  1221. //Short Bow
  1222. case 69:
  1223. //Hunter's Bow
  1224. case 70:
  1225. //Longbow
  1226. case 71:
  1227. //Composite Bow
  1228. case 72:
  1229. //Short Battle Bow
  1230. case 73:
  1231. //Long Battle Bow
  1232. case 74:
  1233. //short war bow
  1234. case 75:
  1235. //Long War Bow
  1236. case 161:
  1237. //Edge Bow
  1238. case 162:
  1239. //Razor Bow
  1240. case 163:
  1241. //Cedar Bow
  1242. case 164:
  1243. //Double Bow
  1244. case 165:
  1245. //Short Siege Bow
  1246. case 166:
  1247. //Large Siege Bow
  1248. case 167:
  1249. //Rune Bow
  1250. case 168:
  1251. //Gothic Bow
  1252. case 264:
  1253. //Spider Bow
  1254. case 265:
  1255. //Blade Bow
  1256. case 266:
  1257. //Shadow Bow
  1258. case 267:
  1259. //Great Bow
  1260. case 268:
  1261. //Diamond Bow
  1262. case 269:
  1263. //Crusader Bow
  1264. case 270:
  1265. //Ward Bow
  1266. case 271:
  1267. //Hydra Bow
  1268. case 281:
  1269. //Stag Bow
  1270. case 282:
  1271. //Reflex Bow
  1272. case 291:
  1273. //Ashwood Bow
  1274. case 292:
  1275. //Cermonial Bow
  1276. case 301:
  1277. //Matriarchal Bow
  1278. case 302:
  1279. //Grand Matron Bow
  1280. //CrossBows
  1281. case 76:
  1282. //Light Crossbow
  1283. case 77:
  1284. //Crossbow
  1285. case 78:
  1286. //Heavy Crossbow
  1287. case 79:
  1288. //Repeating Crossbow
  1289. case 169:
  1290. //Arbalest
  1291. case 170:
  1292. //Siege Crossbow
  1293. case 171:
  1294. //Ballista
  1295. case 172:
  1296. //Chu-Ko-Nu
  1297. case 272:
  1298. //Pellet Bow
  1299. case 273:
  1300. //Gorgon Crossbow
  1301. case 274:
  1302. //Colossus Crossbow
  1303. case 275:
  1304. //Demon Crossbow
  1305. _range = true;
  1306. break;
  1307.  
  1308. default:
  1309.  
  1310. _range = false;
  1311. break;
  1312. }
  1313. }
  1314. }
  1315. }
  1316. if (_range) return true;
  1317. else return false;
  1318. }
  1319.  
  1320. function NTA_HaveArrows() {
  1321. var _weapon;
  1322. var _haveAmmo = false;
  1323. _weapon = me.GetItems();
  1324.  
  1325. if (_weapon) {
  1326. for (var i = 0; i < _weapon.length; i++) {
  1327. if ((_weapon[i].classid == 526 || _weapon[i].classid == 528) && _weapon[i].itemloc == 5) {
  1328. if (_weapon[i].GetStat(70) < 10) {
  1329. Print(COLOR_8 + "I'm low on " + _weapon[i].name + ", I am going to town to buy more.")
  1330. NTTMGR_VisitTown();
  1331. }
  1332. _haveAmmo = true;
  1333. break;
  1334. }
  1335. }
  1336. }
  1337.  
  1338. if (!_haveAmmo) {
  1339. Print(COLOR_8 + "I have no ammo, I am going to town to buy some.")
  1340. NTTMGR_VisitTown();
  1341. }
  1342. }
  1343.  
  1344. // Internal function
  1345.  
  1346. function NTA_AmazonAttackPatternInt() {
  1347.  
  1348. var _maxindex, _maxskill;
  1349. var _avgskilllevel = new Array();
  1350.  
  1351. _avgskilllevel[0] = me.GetSkill(35, false);
  1352. _avgskilllevel[1] = parseInt((me.GetSkill(31, false) + me.GetSkill(11, false) + me.GetSkill(21, false)) / 3);
  1353. _avgskilllevel[2] = me.GetSkill(26, false);
  1354.  
  1355.  
  1356. _maxindex = -1;
  1357. _maxskill = 0;
  1358.  
  1359. for (var i = 0; i < _avgskilllevel.length; i++) {
  1360. if (_avgskilllevel[i] > _maxskill) {
  1361. _maxindex = i;
  1362. _maxskill = _avgskilllevel[i];
  1363. }
  1364. }
  1365.  
  1366. switch (_maxindex) {
  1367. case 0:
  1368. // Lightning Fury for Javazon
  1369. NTConfig_AttackSkill[1] = 35;
  1370. NTConfig_AttackSkill[2] = 35;
  1371. NTConfig_AttackSkill[3] = 35;
  1372. NTConfig_AttackSkill[4] = 35;
  1373. NTConfig_AttackSkill[5] = 35;
  1374. NTConfig_AttackSkill[6] = 35;
  1375. NTConfig_AttackSkill[7] = 24;
  1376. break;
  1377.  
  1378. case 1:
  1379. // Freezing Arrow for Bowzon
  1380. NTConfig_AttackSkill[1] = 31;
  1381. NTConfig_AttackSkill[2] = 31;
  1382. NTConfig_AttackSkill[3] = 31;
  1383. NTConfig_AttackSkill[4] = 31;
  1384. NTConfig_AttackSkill[5] = 31;
  1385. NTConfig_AttackSkill[6] = 31;
  1386. NTConfig_AttackSkill[7] = 31;
  1387. break;
  1388.  
  1389. case 2:
  1390. // Cold Arrow + Strafe for Bowzon
  1391. NTConfig_AttackSkill[0] = 11;
  1392. NTConfig_AttackSkill[1] = 26;
  1393. NTConfig_AttackSkill[2] = 26;
  1394. NTConfig_AttackSkill[3] = 26;
  1395. NTConfig_AttackSkill[4] = 26;
  1396. NTConfig_AttackSkill[5] = 26;
  1397. NTConfig_AttackSkill[6] = 26;
  1398. NTConfig_AttackSkill[7] = 22;
  1399. break;
  1400. }
  1401.  
  1402. return (NTConfig_AttackSkill[1] && NTConfig_AttackSkill[3]);
  1403. }
  1404.  
  1405. function NTA_AmazonAttackInt(target, firstorder) {
  1406. var _primaryindex;
  1407. var _attackSkill;
  1408.  
  1409. if ((NTTMGR_CheckCurse(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe, true)) || (me.hp <= parseInt(me.hpmax * NTConfig_TPChicken,10) / 100)) {
  1410. if (!NTTMGR_VisitTown()) { return 0; }
  1411. }
  1412.  
  1413.  
  1414. if (me.GetSkill(12, false) > 1) NTA_HaveArrows();
  1415. else NTA_IsWeaponBroken();
  1416.  
  1417.  
  1418. if (firstorder && NTConfig_AttackSkill[0] > -1 && NTA_GetResistance(target, _NTA_SkillDamage[0]) < 100) {
  1419. if (GetDistance(me, target) > _NTA_SkillRange[0] || !CheckCollision(me, target, 4)) {
  1420. var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[0], 4);
  1421.  
  1422. if (_pos) NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0, false, false);
  1423. }
  1424.  
  1425. if (!NTC_CastSkill(NTConfig_AttackSkill[0], _NTA_SkillHand[0], target)) return 2;
  1426.  
  1427. return 3;
  1428. }
  1429.  
  1430. _primaryindex = (target.spectype & 0x0A) ? 1 : 3;
  1431. _attackSkill = NTA_GetAttackType(target, _primaryindex, 91, 81, 81);
  1432. switch (target.classid) {
  1433. case 243:
  1434. //Diablo
  1435. case 544:
  1436. //Baal
  1437. case 242:
  1438. if (!NTA_AmazonCastSkillInt(9, target, _primaryindex)) return 2;
  1439.  
  1440. return 3;
  1441. default:
  1442. break;
  1443. }
  1444.  
  1445. if (NTConfig_AttackSkill[_attackSkill] > -1) {
  1446. if (!NTA_AmazonCastSkillInt(_primaryindex, target, _primaryindex)) return 2;
  1447.  
  1448. return 3;
  1449. }
  1450.  
  1451.  
  1452. if (NTConfig_AttackSkill[5] > -1 && NTA_GetResistance(target, _NTA_SkillDamage[5]) > 80) {
  1453. if (!NTA_AmazonCastSkillInt(5, target)) return 2;
  1454.  
  1455. return 3;
  1456. }
  1457.  
  1458. if (NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) < 100 || (_primaryindex == 1 && NTC_GetMerc())) {
  1459. if (!NTA_AmazonCastSkillInt(_primaryindex, target)) return 2;
  1460.  
  1461. return 3;
  1462. }
  1463.  
  1464. return 1;
  1465. }
  1466.  
  1467. function NTA_AmazonCastSkillInt(index, target, primaryIndex) {
  1468. var secondarySkill = 0;
  1469. if (me.GetSkillStatus(NTConfig_AttackSkill[index]) != 8) {
  1470. if (GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4)) {
  1471. var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
  1472.  
  1473. if (_pos) NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0, false, false);
  1474. }
  1475.  
  1476. return NTC_CastSkill(NTConfig_AttackSkill[index], NTC_HAND_LEFT, target);
  1477. }
  1478.  
  1479. secondarySkill = NTA_GetAttackType(target, primaryIndex + 1, 81, 81, 81);
  1480.  
  1481. if (NTConfig_AttackSkill[secondarySkill] > -1) {
  1482. if (GetDistance(me, target) > _NTA_SkillRange[secondarySkill] || !CheckCollision(me, target, 4)) {
  1483. var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[secondarySkill], 4);
  1484.  
  1485. if (_pos) NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0, false, false);
  1486. }
  1487.  
  1488. return NTC_CastSkill(NTConfig_AttackSkill[secondarySkill], _NTA_SkillHand[secondarySkill], target);
  1489. }
  1490.  
  1491. for (var i = 0; i < 25; i++) {
  1492. NTC_Delay(NTC_DELAY_FRAME);
  1493.  
  1494. if (me.GetSkillStatus(NTConfig_AttackSkill[index]) != 8) break;
  1495. }
  1496. }
  1497.  
  1498. function NTA_SorceressAttackPatternInt() {
  1499. var _maxindex, _maxskill;
  1500. var _avgskilllevel = new Array();
  1501.  
  1502. _avgskilllevel[0] = parseInt((me.GetSkill(59, false) + me.GetSkill(39, false) + me.GetSkill(45, false) + me.GetSkill(55, false)) / 4,10);
  1503. _avgskilllevel[1] = parseInt((me.GetSkill(53, false) + me.GetSkill(38, false) + me.GetSkill(48, false) + me.GetSkill(49, false)) / 4,10);
  1504. _avgskilllevel[2] = parseInt((me.GetSkill(47, false) + me.GetSkill(36, false) + me.GetSkill(56, false) + me.GetSkill(64, false)) / 4,10);
  1505. _avgskilllevel[3] = parseInt((me.GetSkill(47, false) + me.GetSkill(36, false) + me.GetSkill(56, false)) / 3,10);
  1506.  
  1507. _maxindex = -1;
  1508. _maxskill = 0;
  1509.  
  1510. for (var i = 0; i < _avgskilllevel.length; i++) {
  1511. if (_avgskilllevel[i] > _maxskill) {
  1512. _maxindex = i;
  1513. _maxskill = _avgskilllevel[i];
  1514. }
  1515. }
  1516.  
  1517. switch (_maxindex) {
  1518. case 0:
  1519. // Blizzard + Glacial Spike
  1520. NTConfig_AttackSkill[1] = 59;
  1521. NTConfig_AttackSkill[2] = 55;
  1522. NTConfig_AttackSkill[3] = 59;
  1523. NTConfig_AttackSkill[4] = 55;
  1524. break;
  1525. case 1:
  1526. // Chain Lightning + Lightning
  1527. NTConfig_AttackSkill[1] = 49;
  1528. NTConfig_AttackSkill[3] = 53;
  1529. break;
  1530. case 2:
  1531. // Fire Ball + Frozen Orb
  1532. NTConfig_AttackSkill[0] = 64;
  1533. NTConfig_AttackSkill[1] = 47;
  1534. NTConfig_AttackSkill[3] = 47;
  1535. NTConfig_AttackSkill[5] = 64;
  1536. NTConfig_AttackSkill[6] = 55;
  1537. break;
  1538. case 3:
  1539. // Fire Ball + Meteor
  1540. NTConfig_AttackSkill[1] = 56;
  1541. NTConfig_AttackSkill[2] = 47;
  1542. NTConfig_AttackSkill[3] = 56;
  1543. NTConfig_AttackSkill[4] = 47;
  1544. break;
  1545. }
  1546.  
  1547. return (NTConfig_AttackSkill[1] && NTConfig_AttackSkill[3]);
  1548. }
  1549.  
  1550. function NTA_SorceressAttackInt(target, firstorder) {
  1551. var _primaryindex;
  1552. var _attackSkill;
  1553.  
  1554. if ((NTTMGR_CheckCurse(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe, true)) || (me.hp <= parseInt(me.hpmax * NTConfig_TPChicken,10) / 100)) {
  1555. if (!NTTMGR_VisitTown()) { return 0; }
  1556. }
  1557.  
  1558. if (firstorder && NTConfig_AttackSkill[0] > -1 && NTA_GetResistance(target, _NTA_SkillDamage[0]) < 100 && me.GetSkillStatus(NTConfig_AttackSkill[0]) != 8) {
  1559. if (GetDistance(me, target) > _NTA_SkillRange[0] || !CheckCollision(me, target, 4)) {
  1560. var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[0], 4);
  1561.  
  1562. if (_pos) NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0, false, false);
  1563. }
  1564.  
  1565. if (!NTC_CastSkill(NTConfig_AttackSkill[0], _NTA_SkillHand[0], target)) return 2;
  1566.  
  1567. return 3;
  1568. }
  1569.  
  1570. var _caststatic = true;
  1571.  
  1572. if (NTConfig_StaticBossesOnly) _caststatic = NTConfig_StaticBossesSelect.indexOf(target.name) > -1;
  1573.  
  1574. if (_caststatic && NTConfig_CastStatic < 100 && parseInt(target.hp * 100 / target.hpmax) > NTConfig_CastStatic && NTA_GetResistance(target, NTA_DAMAGE_LIGHTNING) <= 80) {
  1575. var _staticlevel = NTC_GetSkillLevel(42);
  1576.  
  1577. if (_staticlevel > 0) {
  1578. var _staticrange;
  1579. var _castx, _casty;
  1580.  
  1581. _staticrange = Math.floor((5 + _staticlevel - 1) * 2 / 3);
  1582.  
  1583. if (GetDistance(me, target) > _staticrange || !CheckCollision(me, target, 6)) {
  1584. var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _staticrange, 6);
  1585.  
  1586. if (_pos) NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0, false, false);
  1587. }
  1588.  
  1589. if (target.x < me.x) _castx = me.x - 1;
  1590. else if (target.x > me.x) _castx = me.x + 1;
  1591. else _castx = me.x;
  1592.  
  1593. if (target.y < me.y) _casty = me.y - 1;
  1594. else if (target.y > me.y) _casty = me.y + 1;
  1595. else _casty = me.y;
  1596.  
  1597. if (!CheckCollision(target.areaid, _castx, _casty, 1)) {
  1598. _castx = me.x;
  1599. _casty = me.y;
  1600. }
  1601.  
  1602. if (!NTC_CastSkill(42, NTC_HAND_RIGHT, _castx, _casty)) return 2;
  1603.  
  1604. return 3;
  1605. }
  1606. }
  1607.  
  1608. _primaryindex = (target.spectype & 0x0A) ? 1 : 3;
  1609.  
  1610. _attackSkill = NTA_GetAttackType(target, _primaryindex, 91, 81, 81);
  1611.  
  1612. if (NTConfig_AttackSkill[_attackSkill] > -1) {
  1613. if (!NTA_SorceressCastSkillInt(_attackSkill, target, _primaryindex)) return 2;
  1614.  
  1615. return 3;
  1616. }
  1617.  
  1618.  
  1619. if (NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) < 100 || (_primaryindex == 1 && NTC_GetMerc())) {
  1620. if (!NTA_SorceressCastSkillInt(_primaryindex, target, _primaryindex)) return 2;
  1621.  
  1622. return 3;
  1623. }
  1624.  
  1625. return 1;
  1626. }
  1627.  
  1628. function NTA_SorceressCastSkillInt(index, target, primaryIndex) {
  1629. var secondarySkill = 0;
  1630. _haveCL = NTC_GetSkillLevel(53); // check to see if we even have CL
  1631. _havetele = NTC_GetSkillLevel(54);
  1632. if (DebugAttacksInGame) {
  1633. Print(COLOR_3 + " sorc attack count = " + _sorcattack);
  1634. }
  1635. if (DebugAttacksInGame && target.GetState(28) > 0) {
  1636. Print(COLOR_2 + "target convicted");
  1637. Print(COLOR_2 + "continue attack");
  1638. }
  1639. if (_sorcattack >= 20) _sorcattack = 0;
  1640. if (_havetele && NTConfig_DancingSorc) {
  1641. NTT_CheckMerc(); // revive merc
  1642. if ((NTA_CheckMyHp() || ((target.GetState(28) <= 0) && NTA_CheckMercInfinity())) || (_sorcattack % NTConfig_AttackJump) == 0) {
  1643. if (DebugAttacksInGame && target.GetState(28) <= 0) {
  1644. Print(COLOR_11 + "target not convicted");
  1645. Print(COLOR_11 + "let's dance");
  1646. }
  1647. NTA_Bounce(target);
  1648. }
  1649. }
  1650. if (me.GetSkillStatus(NTConfig_AttackSkill[index]) != 8) {
  1651. if (GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4)) {
  1652. var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
  1653.  
  1654. if (_pos) NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0, false, false);
  1655. }
  1656. if (target.name == "Baal" && NTConfig_AttackSkill[10] > -1) return NTC_CastSkill(NTConfig_AttackSkill[10], _NTA_SkillHand[10], target);
  1657.  
  1658. if ((target.name == "Mephisto" || target.name == "Andariel" || target.name == "Duriel" || target.name == "Diablo") && NTConfig_AttackSkill[9] > -1 && target.name != "Baal") return NTC_CastSkill(NTConfig_AttackSkill[9], _NTA_SkillHand[9], target);
  1659.  
  1660. if (NTConfig_ChainLightOnLightImmunes && NTA_GetResistance(target, NTA_DAMAGE_LIGHTNING) >= 95 && _haveCL > 0) {
  1661. if (DebugAttacksInGame) {
  1662. Print(COLOR_9 + " Target Light resist = " + NTA_GetResistance(target, NTA_DAMAGE_LIGHTNING));
  1663. Print(COLOR_9 + "Switching to CL");
  1664. } // need to add debug to config
  1665. return (NTC_CastSkill(53, NTC_HAND_LEFT, target))
  1666. }
  1667.  
  1668. return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], target);
  1669. }
  1670.  
  1671. secondarySkill = NTA_GetAttackType(target, primaryIndex + 1, 81, 81, 81);
  1672. if (NTConfig_AttackSkill[secondarySkill] > -1) {
  1673. if (GetDistance(me, target) > _NTA_SkillRange[secondarySkill] || !CheckCollision(me, target, 4)) {
  1674. var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[secondarySkill], 4);
  1675.  
  1676. if (_pos) NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0, false, false);
  1677. }
  1678.  
  1679. return NTC_CastSkill(NTConfig_AttackSkill[secondarySkill], _NTA_SkillHand[secondarySkill], target);
  1680. }
  1681.  
  1682. for (var i = 0; i < 25; i++) {
  1683. NTC_Delay(NTC_DELAY_FRAME);
  1684.  
  1685. if (me.GetSkillStatus(NTConfig_AttackSkill[index]) != 8) break;
  1686. }
  1687.  
  1688. return false;
  1689. }
  1690.  
  1691. function NTA_NecromancerAttackPatternInt() {
  1692. return false;
  1693. }
  1694.  
  1695. function NTA_NecromancerAttackInt(target, firstorder) {
  1696. var _primaryindex;
  1697. var _curse1state;
  1698. var _curse2state;
  1699.  
  1700. switch (NTConfig_CurseBoss) {
  1701. case 0:
  1702. //nothing
  1703. _curse1state = 0;
  1704. break;
  1705. case 66:
  1706. //amplify damage
  1707. _curse1state = 9;
  1708. break;
  1709. case 71:
  1710. //dim vision
  1711. _curse1state = 23;
  1712. break;
  1713. case 72:
  1714. //weaken
  1715. _curse1state = 19;
  1716. break;
  1717. case 76:
  1718. //iron maiden
  1719. _curse1state = 55;
  1720. break;
  1721. case 77:
  1722. //terror
  1723. _curse1state = 56;
  1724. break;
  1725. case 81:
  1726. //confuse
  1727. _curse1state = 59;
  1728. break;
  1729. case 82:
  1730. //life tap
  1731. _curse1state = 58;
  1732. break;
  1733. case 86:
  1734. //attract
  1735. _curse1state = 57;
  1736. break;
  1737. case 87:
  1738. //decrepify
  1739. _curse1state = 60;
  1740. break;
  1741. case 91:
  1742. //lower resist
  1743. _curse1state = 61;
  1744. break;
  1745. default:
  1746. Print("Invalid curse id");
  1747. break;
  1748. }
  1749.  
  1750. switch (NTConfig_CurseOthers) {
  1751. case 0:
  1752. //nothing
  1753. _curse2state = 0;
  1754. break;
  1755. case 66:
  1756. //amplify damage
  1757. _curse2state = 9;
  1758. break;
  1759. case 71:
  1760. //dim vision
  1761. _curse2state = 23;
  1762. break;
  1763. case 72:
  1764. //weaken
  1765. _curse2state = 19;
  1766. break;
  1767. case 76:
  1768. //iron maiden
  1769. _curse2state = 55;
  1770. break;
  1771. case 77:
  1772. //terror
  1773. _curse2state = 56;
  1774. break;
  1775. case 81:
  1776. //confuse
  1777. _curse2state = 59;
  1778. break;
  1779. case 82:
  1780. //life tap
  1781. _curse2state = 58;
  1782. break;
  1783. case 86:
  1784. //attract
  1785. _curse2state = 57;
  1786. break;
  1787. case 87:
  1788. //decrepify
  1789. _curse2state = 60;
  1790. break;
  1791. case 91:
  1792. //lower resist
  1793. _curse2state = 61;
  1794. break;
  1795. default:
  1796. Print("Invalid curse id");
  1797. break;
  1798. }
  1799.  
  1800. if ((NTTMGR_CheckCurse(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe, true)) || (me.hp <= parseInt(me.hpmax * NTConfig_TPChicken,10) / 100)) {
  1801. if (!NTTMGR_VisitTown()) { return 0; }
  1802. }
  1803.  
  1804. //////////////////////////////
  1805. //NTTMGR_CheckSafe(NTConfig_CheckSelfSafe,NTConfig_CheckMercSafe); //instant merc revive
  1806. if(NTT_CheckMerc()){
  1807. NTTMGR_VisitTown();
  1808. }
  1809. //////////////////////////////
  1810. if (!me.GetState(14)) //check and recast bone armor
  1811. NTC_CastSkill(68, NTC_HAND_RIGHT);
  1812.  
  1813. if (firstorder && NTConfig_AttackSkill[0] > -1 && NTA_GetResistance(target, _NTA_SkillDamage[0]) < 100 && me.GetSkillStatus(NTConfig_AttackSkill[0]) != 8) {
  1814. if (GetDistance(me, target) > _NTA_SkillRange[0] || !CheckCollision(me, target, 4)) {
  1815. var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[0], 4);
  1816.  
  1817. if (_pos) NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0, false, false);
  1818. }
  1819.  
  1820. if (!NTC_CastSkill(NTConfig_AttackSkill[0], _NTA_SkillHand[0], target)) return 2;
  1821.  
  1822. return 3;
  1823. }
  1824.  
  1825. if (NTConfig_CurseBoss > 0 && (target.spectype & 0x0A) && !target.GetState(_curse1state) && target.name.indexOf(GetLocaleString(11086)) == -1) {
  1826. if (GetDistance(me, target) > 25 || !CheckCollision(me, target, 4)) {
  1827. var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, 25, 4);
  1828.  
  1829. if (_pos) NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0, false, false);
  1830. }
  1831.  
  1832. if (!NTC_CastSkill(NTConfig_CurseBoss, NTC_HAND_RIGHT, target)) return 2;
  1833.  
  1834. return 3;
  1835. } else if (NTConfig_CurseOthers > 0 && !(target.spectype & 0x0A) && !target.GetState(_curse2state)) {
  1836. if (GetDistance(me, target) > 25 || !CheckCollision(me, target, 4)) {
  1837. var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, 25, 4);
  1838.  
  1839. if (_pos) NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0, false, false);
  1840. }
  1841.  
  1842. if (!NTC_CastSkill(NTConfig_CurseOthers, NTC_HAND_RIGHT, target)) return 2;
  1843.  
  1844. return 3;
  1845. }
  1846.  
  1847. _primaryindex = (target.spectype & 0x0A) ? 1 : 3;
  1848.  
  1849. if (NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) <= 90) {
  1850. if (!NTA_NecromancerCastSkillInt(_primaryindex, target)) return 2;
  1851.  
  1852. if (NTConfig_ActiveSummon) if (!NTA_SkeletonArmy(NTConfig_SkeletonArmy)) if (!NTA_MageArmy(NTConfig_MageArmy)) NTA_ReviveArmy(NTConfig_ReviveArmy);
  1853. NTA_ExplodeCorpses(target);
  1854.  
  1855. return 3;
  1856. }
  1857.  
  1858. if (NTConfig_AttackSkill[5] > -1 && NTA_GetResistance(target, _NTA_SkillDamage[5]) <= 80) {
  1859. if (!NTA_NecromancerCastSkillInt(5, target)) return 2;
  1860.  
  1861. if (NTConfig_ActiveSummon) if (!NTA_SkeletonArmy(NTConfig_SkeletonArmy)) if (!NTA_MageArmy(NTConfig_MageArmy)) NTA_ReviveArmy(NTConfig_ReviveArmy);
  1862. NTA_ExplodeCorpses(target);
  1863.  
  1864. return 3;
  1865. }
  1866.  
  1867. if (NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) < 100 || (_primaryindex == 1 && NTC_GetMerc())) //this means attack even immune bosses if your merc is alive
  1868. {
  1869. if (!NTA_NecromancerCastSkillInt(_primaryindex, target)) return 2;
  1870.  
  1871. if (NTConfig_ActiveSummon) if (!NTA_SkeletonArmy(NTConfig_SkeletonArmy)) if (!NTA_MageArmy(NTConfig_MageArmy)) NTA_ReviveArmy(NTConfig_ReviveArmy);
  1872. NTA_ExplodeCorpses(target);
  1873.  
  1874. return 3;
  1875. }
  1876.  
  1877. return 1;
  1878. }
  1879.  
  1880. function NTA_NecromancerCastSkillInt(index, target) {
  1881. if (me.GetSkillStatus(NTConfig_AttackSkill[index]) != 8) {
  1882. if (GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4)) {
  1883. var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
  1884.  
  1885. if (_pos) NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0, false, false);
  1886. }
  1887.  
  1888. return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], target);
  1889. }
  1890.  
  1891. if (NTConfig_AttackSkill[index + 1] > -1) {
  1892. if (GetDistance(me, target) > _NTA_SkillRange[index + 1] || !CheckCollision(me, target, 4)) {
  1893. var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index + 1], 4);
  1894.  
  1895. if (_pos) NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0, false, false);
  1896. }
  1897.  
  1898. return NTC_CastSkill(NTConfig_AttackSkill[index + 1], _NTA_SkillHand[index + 1], target);
  1899. }
  1900.  
  1901. for (var i = 0; i < 25; i++) {
  1902. NTC_Delay(NTC_DELAY_FRAME);
  1903.  
  1904. if (me.GetSkillStatus(NTConfig_AttackSkill[index]) != 8) break;
  1905. }
  1906.  
  1907. return false;
  1908. }
  1909.  
  1910. function NTA_SkeletonArmy(num) {
  1911. if (NTConfig_SkeletonArmy <= 0) return false;
  1912.  
  1913. var _skeletoncount = 0;
  1914. var _skeleton = NTC_FindUnit(NTC_UNIT_MONSTER, 363);
  1915.  
  1916. if (_skeleton) {
  1917. do {
  1918. if (NTC_CheckOwner(_skeleton) && _skeleton.hp > 0) {
  1919. //Print(_skeleton.GetParent().name);
  1920. _skeletoncount++;
  1921. }
  1922. } while (_skeleton.GetNext());
  1923. }
  1924.  
  1925. //Print("We have " + _skeletoncount + " skeletons"); //debug 1
  1926. if (_skeletoncount >= num) return false;
  1927.  
  1928. var _corpse = NTC_FindUnit(NTC_UNIT_MONSTER);
  1929.  
  1930. if (_corpse) {
  1931. do {
  1932. if (
  1933. _corpse != null && _corpse.mode == 12 && GetDistance(me, _corpse) < 25 &&
  1934.  
  1935. !(_corpse.GetState(96)) && //revive
  1936. !(_corpse.GetState(104)) && //nodraw
  1937. !(_corpse.GetState(107)) && //shatter
  1938. !(_corpse.GetState(118)) && //noselect
  1939. _corpse.classid != 289 && //clay golem
  1940. _corpse.classid != 290 && //blood golem
  1941. _corpse.classid != 291 && //iron golem
  1942. _corpse.classid != 292 && //fire golem
  1943. _corpse.classid != 351 && //hydra
  1944. _corpse.classid != 352 && //hydra
  1945. _corpse.classid != 353 && //hydra
  1946. _corpse.classid != 363 && //necro skeleton
  1947. _corpse.classid != 364 && //necro mage
  1948. _corpse.classid != 563 && //baal tentacle
  1949. _corpse.classid != 564 && //baal tentacle
  1950. _corpse.classid != 565 && //baal tentacle
  1951. _corpse.classid != 566 && //baal tentacle
  1952. _corpse.classid != 567 //baal tentacle
  1953. ) {
  1954. if (NTC_CastSkill(70, NTC_HAND_RIGHT, _corpse)) _skeletoncount++;
  1955. if (_skeletoncount >= num) return false;
  1956. }
  1957. } while (_corpse.GetNext());
  1958. }
  1959.  
  1960. return true;
  1961. }
  1962.  
  1963. function NTA_MageArmy(num) {
  1964. if (NTConfig_MageArmy <= 0) return false;
  1965.  
  1966. var _magecount = 0;
  1967. var _mage = NTC_FindUnit(NTC_UNIT_MONSTER, 364);
  1968.  
  1969. if (_mage) {
  1970. do {
  1971. if (NTC_CheckOwner(_mage) && _mage.hp > 0) {
  1972. //Print(_mage.GetParent().name);
  1973. _magecount++;
  1974. }
  1975. } while (_mage.GetNext());
  1976. }
  1977.  
  1978. //Print("We have " + _magecount + " mages"); //debug 3
  1979. if (_magecount >= num) return false;
  1980.  
  1981. var _corpse = NTC_FindUnit(NTC_UNIT_MONSTER);
  1982.  
  1983. if (_corpse) {
  1984. do {
  1985. if (
  1986. _corpse != null && _corpse.mode == 12 && GetDistance(me, _corpse) < 25 &&
  1987.  
  1988. !(_corpse.GetState(96)) && //revive
  1989. !(_corpse.GetState(104)) && //nodraw
  1990. !(_corpse.GetState(107)) && //shatter
  1991. !(_corpse.GetState(118)) && //noselect
  1992. _corpse.classid != 289 && //clay golem
  1993. _corpse.classid != 290 && //blood golem
  1994. _corpse.classid != 291 && //iron golem
  1995. _corpse.classid != 292 && //fire golem
  1996. _corpse.classid != 351 && //hydra
  1997. _corpse.classid != 352 && //hydra
  1998. _corpse.classid != 353 && //hydra
  1999. _corpse.classid != 363 && //necro skeleton
  2000. _corpse.classid != 364 && //necro mage
  2001. _corpse.classid != 563 && //baal tentacle
  2002. _corpse.classid != 564 && //baal tentacle
  2003. _corpse.classid != 565 && //baal tentacle
  2004. _corpse.classid != 566 && //baal tentacle
  2005. _corpse.classid != 567 //baal tentacle
  2006. ) {
  2007. if (NTC_CastSkill(80, NTC_HAND_RIGHT, _corpse)) _magecount++;
  2008. if (_magecount >= num) return false;
  2009. }
  2010. } while (_corpse.GetNext());
  2011. }
  2012.  
  2013. return true;
  2014. }
  2015.  
  2016. function NTA_ReviveArmy(num) {
  2017. if (NTConfig_ReviveArmy <= 0) return false;
  2018.  
  2019. var _revivecount = 0;
  2020. var _revive = NTC_FindUnit(NTC_UNIT_MONSTER);
  2021.  
  2022. if (_revive) {
  2023. do {
  2024. if (NTC_CheckOwner(_revive) && _revive.GetState(96) && _revive.hp > 0) {
  2025. //Print(_revive.GetParent().name);
  2026. _revivecount++;
  2027. }
  2028. } while (_revive.GetNext());
  2029. }
  2030.  
  2031. //Print("We have " + _revivecount + " revives"); //debug 2
  2032. if (_revivecount >= num) return false;
  2033.  
  2034. var _corpse = NTC_FindUnit(NTC_UNIT_MONSTER);
  2035.  
  2036. if (_corpse) {
  2037. do {
  2038. if (
  2039. _corpse != null && _corpse.mode == 12 && GetDistance(me, _corpse) < 25 && !(_corpse.spectype & 0x0A) &&
  2040.  
  2041. !(_corpse.GetState(96)) && //revive
  2042. !(_corpse.GetState(104)) && //nodraw
  2043. !(_corpse.GetState(107)) && //shatter
  2044. !(_corpse.GetState(118)) && //noselect
  2045. _corpse.classid != 289 && //clay golem
  2046. _corpse.classid != 290 && //blood golem
  2047. _corpse.classid != 291 && //iron golem
  2048. _corpse.classid != 292 && //fire golem
  2049. _corpse.classid != 351 && //hydra
  2050. _corpse.classid != 352 && //hydra
  2051. _corpse.classid != 353 && //hydra
  2052. _corpse.classid != 363 && //necro skeleton
  2053. _corpse.classid != 364 && //necro mage
  2054. _corpse.classid != 461 && //greater ice spawn
  2055. _corpse.classid != 563 && //baal tentacle
  2056. _corpse.classid != 564 && //baal tentacle
  2057. _corpse.classid != 565 && //baal tentacle
  2058. _corpse.classid != 566 && //baal tentacle
  2059. _corpse.classid != 567 && //baal tentacle
  2060. _corpse.classid != 571 //baal crab clone (minion of destruction)
  2061. ) {
  2062. Print("Reviving " + _corpse.classid + " " + _corpse.name);
  2063. if (NTC_CastSkill(95, NTC_HAND_RIGHT, _corpse)) _revivecount++;
  2064. if (_revivecount >= num) return false;
  2065. }
  2066. } while (_corpse.GetNext());
  2067. }
  2068.  
  2069. return true;
  2070. }
  2071.  
  2072. function NTA_ExplodeCorpses(who) {
  2073. if (NTConfig_ExplodeCorpses == 0) return false;
  2074.  
  2075. var _exploded = 0;
  2076. var _corpse = NTC_FindUnit(NTC_UNIT_MONSTER);
  2077.  
  2078. if (_corpse) {
  2079. do {
  2080. if (
  2081. _corpse != null && _corpse.mode == 12 && GetDistance(who, _corpse) <= 10 &&
  2082.  
  2083. !(_corpse.GetState(96)) && //revive
  2084. !(_corpse.GetState(104)) && //nodraw
  2085. !(_corpse.GetState(107)) && //shatter
  2086. !(_corpse.GetState(118)) && //noselect
  2087. _corpse.classid != 289 && //clay golem
  2088. _corpse.classid != 290 && //blood golem
  2089. _corpse.classid != 291 && //iron golem
  2090. _corpse.classid != 292 && //fire golem
  2091. _corpse.classid != 351 && //hydra
  2092. _corpse.classid != 352 && //hydra
  2093. _corpse.classid != 353 && //hydra
  2094. _corpse.classid != 363 && //necro skeleton
  2095. _corpse.classid != 364 && //necro mage
  2096. _corpse.classid != 563 && //baal tentacle
  2097. _corpse.classid != 564 && //baal tentacle
  2098. _corpse.classid != 565 && //baal tentacle
  2099. _corpse.classid != 566 && //baal tentacle
  2100. _corpse.classid != 567 //baal tentacle
  2101. ) {
  2102. //Print(_corpse.classid + " " + _corpse.name);
  2103. if (NTC_CastSkill(NTConfig_ExplodeCorpses, NTC_HAND_RIGHT, _corpse)) _exploded++;
  2104. if (_exploded >= 2) return false;
  2105. }
  2106. } while (_corpse.GetNext());
  2107. }
  2108.  
  2109. return true;
  2110. }
  2111.  
  2112. function NTA_PaladinAttackPatternInt() {
  2113. var _maxindex, _maxskill;
  2114. var _avgskilllevel = new Array();
  2115.  
  2116. _avgskilllevel[0] = parseInt((me.GetSkill(112, false) + me.GetSkill(108, false) + me.GetSkill(115, false)) / 3);
  2117. _avgskilllevel[1] = parseInt((me.GetSkill(106, false) + me.GetSkill(96, false)) / 2);
  2118. _avgskilllevel[2] = parseInt((me.GetSkill(121, false) + me.GetSkill(101, false) + me.GetSkill(118, false)) / 3);
  2119.  
  2120. _maxindex = -1;
  2121. _maxskill = 0;
  2122.  
  2123. for (var i = 0; i < _avgskilllevel.length; i++) {
  2124. if (_avgskilllevel[i] > _maxskill) {
  2125. _maxindex = i;
  2126. _maxskill = _avgskilllevel[i];
  2127. }
  2128. }
  2129.  
  2130. switch (_maxindex) {
  2131. case 0:
  2132. // Blessed Hammer
  2133. NTConfig_AttackSkill[1] = 112;
  2134. NTConfig_AttackSkill[2] = 113;
  2135. NTConfig_AttackSkill[3] = 112;
  2136. NTConfig_AttackSkill[4] = 113;
  2137. break;
  2138. case 1:
  2139. // Zeal
  2140. NTConfig_AttackSkill[1] = 106;
  2141. NTConfig_AttackSkill[2] = 122;
  2142. NTConfig_AttackSkill[3] = 106;
  2143. NTConfig_AttackSkill[4] = 122;
  2144. break;
  2145. case 2:
  2146. // Fist of the Heavens
  2147. NTConfig_AttackSkill[1] = 121;
  2148. NTConfig_AttackSkill[2] = 123;
  2149. NTConfig_AttackSkill[3] = 121;
  2150. NTConfig_AttackSkill[4] = 123;
  2151. break;
  2152. }
  2153.  
  2154. return (NTConfig_AttackSkill[1] && NTConfig_AttackSkill[3]);
  2155. }
  2156.  
  2157. function NTA_PaladinAttackInt(target, firstorder) {
  2158. var _primaryindex;
  2159. var _attackSkill;
  2160.  
  2161. if ((NTTMGR_CheckCurse(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe, true)) || (me.hp <= parseInt(me.hpmax * NTConfig_TPChicken,10) / 100)) {
  2162. if (!NTTMGR_VisitTown()) return 0;
  2163. }
  2164.  
  2165. if (firstorder && NTConfig_AttackSkill[0] > -1 && NTA_GetResistance(target, _NTA_SkillDamage[0]) < 100) {
  2166. if (GetDistance(me, target) > _NTA_SkillRange[0] || !CheckCollision(me, target, 4)) {
  2167. var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[0], 4);
  2168.  
  2169. if (_pos) NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0, false, false);
  2170. }
  2171.  
  2172. if (!NTC_CastSkill(NTConfig_AttackSkill[0], _NTA_SkillHand[0], target)) return 2;
  2173.  
  2174. return 3;
  2175. }
  2176.  
  2177. _primaryindex = (target.spectype & 0x0A) ? 1 : 3;
  2178. if (NTConfig_OnlySmiteStationary && NTConfig_AttackSkill[1] == 97 && GetBaseStat("monstats2.txt", target.classid, 56) == 1) _primaryindex = 3;
  2179.  
  2180. _attackIndex = NTA_GetAttackType(target, _primaryindex, 100, 100, 100);
  2181.  
  2182. if (NTConfig_AttackSkill[_attackIndex] > -1) {
  2183. if (_NTA_SkillRange[_attackIndex] < 4 && !CheckCollision(target.areaid, target.x, target.y, 1)) return 1;
  2184.  
  2185. if (!NTA_PaladinCastSkillInt(_attackIndex, target)) return 2;
  2186.  
  2187. return 3;
  2188. }
  2189. return 1;
  2190. }
  2191.  
  2192. function NTA_PaladinCastSkillInt(index, target) {
  2193. if (NTConfig_AttackSkill[index] == 112) {
  2194. if (me.x - target.x < 1 || me.x - target.x > 2 || me.y - target.y < 1 || me.y - target.y > 2) {
  2195. if (CheckCollision(target.areaid, target.x + 2, target.y + 2, 1)) NTM_MoveTo(target.areaid, target.x + 2, target.y + 2, 0, false, false);
  2196. else if (me.x - target.x < -4 || me.x - target.x > 2 || me.y - target.y < 0 || me.y - target.y > 2) NTM_MoveTo(target.areaid, target.x - 4, target.y, 0, false, false);
  2197. }
  2198. } else {
  2199. if (GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4)) {
  2200. var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
  2201.  
  2202. if (_pos) NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0, false, false);
  2203. }
  2204. }
  2205.  
  2206. if (NTConfig_AttackSkill[index + 1] > -1) NTC_PutSkill(NTConfig_AttackSkill[index + 1], NTC_HAND_RIGHT);
  2207.  
  2208. return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], target);
  2209. }
  2210.  
  2211. function NTA_BarbarianAttackPatternInt() {
  2212. var _maxindex, _maxskill;
  2213. var _avgskilllevel = new Array();
  2214.  
  2215. _avgskilllevel[0] = me.GetSkill(151, false);
  2216.  
  2217. _maxindex = -1;
  2218. _maxskill = 0;
  2219.  
  2220. for (var i = 0; i < _avgskilllevel.length; i++) {
  2221. if (_avgskilllevel[i] > _maxskill) {
  2222. _maxindex = i;
  2223. _maxskill = _avgskilllevel[i];
  2224. }
  2225. }
  2226.  
  2227. switch (_maxindex) {
  2228. case 0:
  2229. // Whirlwind
  2230. NTConfig_AttackSkill[1] = 151;
  2231. NTConfig_AttackSkill[3] = 151;
  2232. NTConfig_AttackSkill[5] = 152;
  2233. break;
  2234. }
  2235.  
  2236. return (NTConfig_AttackSkill[1] && NTConfig_AttackSkill[3]);
  2237. }
  2238.  
  2239. function NTA_BarbarianAttackInt(target, firstorder) {
  2240. var _primaryindex;
  2241. var _attackSkill;
  2242.  
  2243. if ((NTTMGR_CheckCurse(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe, true)) || (me.hp <= parseInt(me.hpmax * NTConfig_TPChicken,10) / 100)) {
  2244. if (!NTTMGR_VisitTown()) return 0;
  2245. }
  2246.  
  2247. if (firstorder && NTConfig_AttackSkill[0] > -1 && NTA_GetResistance(target, _NTA_SkillDamage[0]) < 100) {
  2248. if (GetDistance(me, target) > _NTA_SkillRange[0] || !CheckCollision(me, target, 4)) {
  2249. var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[0], 4);
  2250.  
  2251. if (_pos) NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0, false, false);
  2252. }
  2253.  
  2254. if (!NTC_CastSkill(NTConfig_AttackSkill[0], _NTA_SkillHand[0], target)) return 2;
  2255.  
  2256. return 3;
  2257. }
  2258.  
  2259. _primaryindex = (target.spectype & 0x0A) ? 1 : 3;
  2260. _attackIndex = NTA_GetAttackType(target, _primaryindex, 100, 100, 100);
  2261.  
  2262. if (NTConfig_AttackSkill[_attackIndex] > -1) {
  2263. if (_NTA_SkillRange[_attackIndex] < 4 && !CheckCollision(target.areaid, target.x, target.y, 1)) return 1;
  2264.  
  2265. if (!NTA_BarbarianCastSkillInt(_attackIndex, target)) return 2;
  2266.  
  2267. return 3;
  2268. }
  2269.  
  2270. /*
  2271. if(NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) < 100)
  2272. {
  2273. if((_NTA_SkillRange[_primaryindex] < 4 || NTConfig_AttackSkill[_primaryindex] == 151) && !CheckCollision(target.areaid, target.x, target.y, 1))
  2274. return 1;
  2275.  
  2276. if(!NTA_BarbarianCastSkillInt(_primaryindex, target))
  2277. return 2;
  2278.  
  2279. return 3;
  2280. }
  2281.  
  2282. if(NTConfig_AttackSkill[5] > -1 && NTA_GetResistance(target, _NTA_SkillDamage[5]) < 100)
  2283. {
  2284. if((_NTA_SkillRange[5] < 4 || NTConfig_AttackSkill[5] == 151) && !CheckCollision(target.areaid, target.x, target.y, 1))
  2285. return 1;
  2286.  
  2287. if(!NTA_BarbarianCastSkillInt(5, target))
  2288. return 2;
  2289.  
  2290. return 3;
  2291. }
  2292. */
  2293. return 1;
  2294. }
  2295.  
  2296. function NTA_BarbarianCastSkillInt(index, target) {
  2297. if (NTConfig_AttackSkill[index] == 151) {
  2298. var _castx, _casty;
  2299.  
  2300. if (GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 5)) {
  2301. var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 5);
  2302.  
  2303. if (_pos) NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0, false, false);
  2304. }
  2305.  
  2306. _castx = target.x > me.x ? target.x + 3 : target.x - 3;
  2307. _casty = target.y > me.y ? target.y + 3 : target.y - 3;
  2308.  
  2309. return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], _castx, _casty);
  2310. }
  2311.  
  2312. if (GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4)) {
  2313. var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
  2314.  
  2315. if (_pos) NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0, false, false);
  2316. }
  2317.  
  2318. return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], target);
  2319. }
  2320.  
  2321.  
  2322. function NTA_DruidAttackPatternInt() {
  2323. var _maxindex, _maxskill;
  2324. var _avgskilllevel = new Array();
  2325.  
  2326. _avgskilllevel[0] = me.GetSkill(245, false);
  2327. _maxindex = -1;
  2328. _maxskill = 0;
  2329.  
  2330. for (var i = 0; i < _avgskilllevel.length; i++) {
  2331. if (_avgskilllevel[i] > _maxskill) {
  2332. _maxindex = i;
  2333. _maxskill = _avgskilllevel[i];
  2334. }
  2335. }
  2336.  
  2337. switch (_maxindex) {
  2338. case 0:
  2339. //
  2340. NTConfig_AttackSkill[1] = 245;
  2341. NTConfig_AttackSkill[2] = 245;
  2342. NTConfig_AttackSkill[3] = 245;
  2343. NTConfig_AttackSkill[4] = 245;
  2344. NTConfig_AttackSkill[5] = 245;
  2345. NTConfig_AttackSkill[6] = 245;
  2346. break;
  2347. }
  2348.  
  2349. return (NTConfig_AttackSkill[1] && NTConfig_AttackSkill[3]);
  2350. }
  2351.  
  2352. function NTA_DruidAttackInt(target, firstorder) {
  2353. var _primaryindex;
  2354. var _attackSkill;
  2355.  
  2356. if ((NTTMGR_CheckCurse(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe, true)) || (me.hp <= parseInt(me.hpmax * NTConfig_TPChicken,10) / 100)) {
  2357. if (!NTTMGR_VisitTown()) return 0;
  2358. }
  2359.  
  2360. if (firstorder && NTConfig_AttackSkill[0] > -1 && NTA_GetResistance(target, _NTA_SkillDamage[0]) < 100) {
  2361.  
  2362.  
  2363. if (GetDistance(me, target) > NTConfig_AttackSkill[0] || !CheckCollision(me, target, 4)) {
  2364. var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
  2365.  
  2366. if (_pos) NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0, false, false);
  2367. }
  2368.  
  2369. if (!NTC_CastSkill(NTConfig_AttackSkill[0], _NTA_SkillHand[0], target)) return 2;
  2370.  
  2371. return 3;
  2372. }
  2373.  
  2374.  
  2375. _primaryindex = (target.spectype & 0x0A) ? 1 : 3;
  2376. _attackIndex = NTA_GetAttackType(target, _primaryindex, 91, 81, 81);
  2377.  
  2378. if (me.GetSkill(245, true) > 1) if (target.name == "Andariel" || target.name == "Baal" || target.name == "Mephisto" || target.name == "Diablo") {
  2379. if (!NTA_DruidCastSkillIntNear(_primaryindex, target)) return 2;
  2380.  
  2381. return 3;
  2382. }
  2383.  
  2384.  
  2385. if (NTConfig_AttackSkill[_attackIndex] > -1) {
  2386. if (_NTA_SkillRange[_attackIndex] < 4 && !CheckCollision(target.areaid, target.x, target.y, 1)) return 1;
  2387.  
  2388. if (!NTA_DruidCastSkillInt(_attackIndex, target)) return 2;
  2389.  
  2390. return 3;
  2391. }
  2392.  
  2393. /*
  2394. if(NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) <= 90)
  2395. {
  2396. if(!NTA_DruidCastSkillInt(_primaryindex, target))
  2397. return 2;
  2398.  
  2399. return 3;
  2400. }
  2401.  
  2402. if(NTConfig_AttackSkill[5] > -1 && NTA_GetResistance(target, _NTA_SkillDamage[5]) <= 80)
  2403. {
  2404. if(!NTA_DruidCastSkillInt(5, target))
  2405. return 2;
  2406.  
  2407. return 3;
  2408. }
  2409. */
  2410.  
  2411. if (NTA_GetResistance(target, _NTA_SkillDamage[index]) < 100 || (_primaryindex == 1 && NTC_GetMerc())) {
  2412. if (!NTA_DruidCastSkillInt(_primaryindex, target)) return 2;
  2413.  
  2414. return 3;
  2415. }
  2416.  
  2417. return 1;
  2418. }
  2419.  
  2420. function NTA_DruidCastSkillIntNear(index, target) {
  2421. if (NTConfig_AttackSkill[index] == 245) {
  2422. var _castx, _casty;
  2423.  
  2424. if (GetDistance(me, target) > 2 || !CheckCollision(me, target, 4)) {
  2425. var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 5);
  2426.  
  2427. if (_pos) NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0, false, false);
  2428. }
  2429.  
  2430. _castx = target.x > me.x ? target.x + NTConfig_CastPast : target.x - NTConfig_CastPast;
  2431. _casty = target.y > me.y ? target.y + NTConfig_CastPast : target.y - NTConfig_CastPast;
  2432.  
  2433. return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], _castx, _casty);
  2434. }
  2435.  
  2436. if (NTConfig_AttackSkill[index + 1] > -1 && NTConfig_AttackSkill[index] != 245) {
  2437. if (GetDistance(me, target) > 3 || !CheckCollision(me, target, 4)) {
  2438. var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, 3, 4);
  2439.  
  2440. if (_pos) NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0, false, false);
  2441.  
  2442. }
  2443.  
  2444. return NTC_CastSkill(NTConfig_AttackSkill[index + 1], _NTA_SkillHand[index + 1], target);
  2445. }
  2446. }
  2447.  
  2448. function NTA_DruidCastSkillInt(index, target) {
  2449. if (NTConfig_AttackSkill[index] == 245) {
  2450. var _castx, _casty;
  2451.  
  2452. if (GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4)) {
  2453. var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 5);
  2454.  
  2455. if (_pos) NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0, false, false);
  2456. }
  2457.  
  2458. _castx = target.x > me.x ? target.x + NTConfig_CastPast : target.x - NTConfig_CastPast;
  2459. _casty = target.y > me.y ? target.y + NTConfig_CastPast : target.y - NTConfig_CastPast;
  2460.  
  2461. return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], _castx, _casty);
  2462. }
  2463.  
  2464.  
  2465. if (GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4)) {
  2466. var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
  2467.  
  2468. if (_pos) NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0, false, false);
  2469.  
  2470. }
  2471.  
  2472.  
  2473. if (!me.GetState(139)) NTC_CastSkill(223, NTC_HAND_RIGHT) // Werewolf
  2474. else if (!me.GetState(140)) NTC_CastSkill(228, NTC_HAND_RIGHT) // Werebear
  2475. return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], target);
  2476.  
  2477. if (NTConfig_AttackSkill[index + 1] > -1) {
  2478. if (GetDistance(me, target) > _NTA_SkillRange[index + 1] || !CheckCollision(me, target, 4)) {
  2479. var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index + 1], 4);
  2480.  
  2481. if (_pos) NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0, false, false);
  2482.  
  2483. }
  2484.  
  2485. return NTC_CastSkill(NTConfig_AttackSkill[index + 1], _NTA_SkillHand[index + 1], target);
  2486. }
  2487. }
  2488.  
  2489. function NTA_AssassinAttackPatternInt() {
  2490. return false;
  2491. }
  2492.  
  2493. function NTA_AssassinAttackInt(target, firstorder) {
  2494. var _primaryindex;
  2495. var _attackIndex;
  2496. var _skillCasted = 0;
  2497.  
  2498. if ((NTTMGR_CheckCurse(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe, true)) || (me.hp <= parseInt(me.hpmax * NTConfig_TPChicken,10) / 100)) {
  2499. if (!NTTMGR_VisitTown()) return 0;
  2500. }
  2501.  
  2502. if (firstorder && NTConfig_AttackSkill[0] > -1 && NTA_GetResistance(target, _NTA_SkillDamage[0]) < 100) {
  2503. if (GetDistance(me, target) > _NTA_SkillRange[0] || !CheckCollision(me, target, 4)) {
  2504. var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[0], 4);
  2505.  
  2506. if (_pos) NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0, false, false);
  2507. }
  2508.  
  2509. if (!NTC_CastSkill(NTConfig_AttackSkill[0], _NTA_SkillHand[0], target)) return 2;
  2510.  
  2511. return 3;
  2512. }
  2513.  
  2514. if (NTConfig_UseTraps) NTA_CheckTraps(target);
  2515.  
  2516. _primaryindex = (target.spectype & 0x0A) ? 1 : 3;
  2517.  
  2518. _attackIndex = NTA_GetAttackType(target, _primaryindex, 91, 81, 81);
  2519.  
  2520. if (NTConfig_AttackSkill[_attackIndex] > -1) {
  2521. _skillCasted = _attackIndex;
  2522. if (_NTA_SkillRange[_attackIndex] < 4 && !CheckCollision(target.areaid, target.x, target.y, 1)) return 1;
  2523.  
  2524. if (!NTA_AssassinCastSkillInt(_attackIndex, target, _primaryindex)) return 2;
  2525.  
  2526. return 3;
  2527. }
  2528.  
  2529. if (NTConfig_UseTraps) {
  2530. if (_skillCasted == 0) NTC_Delay(NTConfig_AttackSkill);
  2531.  
  2532. return 3;
  2533. }
  2534.  
  2535. return 1;
  2536. }
  2537.  
  2538. function NTA_AssassinCastSkillInt(index, target, primaryIndex) {
  2539. var secondarySkill = 0;
  2540. if (me.GetSkillStatus(NTConfig_AttackSkill[index]) != 8) {
  2541. if (GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4)) {
  2542. var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
  2543.  
  2544. if (_pos) NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0, false, false);
  2545. }
  2546.  
  2547. return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], target);
  2548. }
  2549.  
  2550. secondarySkill = NTA_GetAttackType(target, primaryIndex + 1, 81, 81, 81);
  2551. if (NTConfig_AttackSkill[secondarySkill] > -1) {
  2552. if (GetDistance(me, target) > _NTA_SkillRange[secondarySkill] || !CheckCollision(me, target, 4)) {
  2553. var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[secondarySkill], 4);
  2554.  
  2555. if (_pos) NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0, false, false);
  2556. }
  2557.  
  2558. return NTC_CastSkill(NTConfig_AttackSkill[secondarySkill], _NTA_SkillHand[secondarySkill], target);
  2559. }
  2560. for (var i = 0; i < 25; i++) {
  2561. NTC_Delay(NTC_DELAY_FRAME);
  2562.  
  2563. if (me.GetSkillStatus(NTConfig_AttackSkill[index]) != 8) break;
  2564. }
  2565.  
  2566. return false;
  2567. }
  2568.  
  2569. function NTA_CheckTraps(target) {
  2570. var traps = NTC_FindUnit(NTC_UNIT_MONSTER);
  2571. var trapcount = 0;
  2572. //var warr=0;
  2573. var x, y;
  2574. var parent;
  2575. var _isActBoss = false;
  2576. var _trapOffset;
  2577.  
  2578. // || target.name == GetLocaleString(3021) - Andariel
  2579. if (target.name == GetLocaleString(3062) || target.name == GetLocaleString(3054) || target.name == GetLocaleString(3060) || target.name == GetLocaleString(3061)) _isActBoss = true;
  2580.  
  2581. if (traps) {
  2582. do {
  2583. if (traps.classid == 412 || traps.classid == 413 || traps.classid == 416 || traps.classid == 417) {
  2584.  
  2585. parent = traps.GetParent();
  2586. if (parent != null && parent.name == me.name) {
  2587. if (GetDistance(target.x, target.y, traps.x, traps.y) < (_isActBoss ? NTConfig_MinBossTrapRange : NTConfig_MinTrapRange) && traps.hp > 100) {
  2588. trapcount = trapcount + 1;
  2589. }
  2590. }
  2591. }
  2592. /*if ((traps.classid == 418 || traps.classid == 419) && traps.mode == 12){ // apparently 417/418 are warrior/master. commented out for now
  2593. warr=1;
  2594. }*/
  2595. } while (traps.GetNext())
  2596.  
  2597. if (trapcount < (_isActBoss ? NTConfig_NumBossTrap : NTConfig_NumTraps) && target.hp > 0) {
  2598.  
  2599. var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, 13, 10);
  2600.  
  2601. if (_pos) NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0, false, false);
  2602.  
  2603.  
  2604. _trapOffset = NTA_GetTrapAttackPattern(_isActBoss);
  2605.  
  2606. for (var i = 0; i < 5; i++) {
  2607. if (NTConfig_TrapSet[i] > 0) {
  2608. if (i == 0 || i == 2 || i == 3) // Added delays to prevent trap miscast
  2609. NTC_Delay(25);
  2610. NTC_CastSkill((_isActBoss ? NTConfig_TrapSet[0] : NTConfig_TrapSet[i]), NTC_HAND_RIGHT, target.x + _trapOffset[i][0], target.y + _trapOffset[i][1]);
  2611. }
  2612. }
  2613. }
  2614. /*if (warr!=0)
  2615. NTP_DoPrecast(false);*/
  2616. }
  2617. }
  2618.  
  2619. function NTA_GetTrapAttackPattern(isActBoss) {
  2620. var _attackPattern = new Array(5);
  2621. var _bossOffset = 1;
  2622.  
  2623. if (NTConfig_TrapAttackPattern == 1) { // Pentagram
  2624. _attackPattern[0] = [-2 - (isActBoss ? _bossOffset : 0), -2 - (isActBoss ? _bossOffset : 0)];
  2625. _attackPattern[1] = [0, 2 + (isActBoss ? _bossOffset : 0)];
  2626. _attackPattern[2] = [2 + (isActBoss ? _bossOffset : 0), -2 - (isActBoss ? _bossOffset : 0)];
  2627. _attackPattern[3] = [-3 - (isActBoss ? _bossOffset : 0), 1 + (isActBoss ? _bossOffset : 0)];
  2628. _attackPattern[4] = [3 + (isActBoss ? _bossOffset : 0), 1 + (isActBoss ? _bossOffset : 0)];
  2629. } else if (NTConfig_TrapAttackPattern == 2) { // X - axis
  2630. _attackPattern[0] = [0, 0];
  2631. _attackPattern[1] = [1 + (isActBoss ? _bossOffset : 0), 0];
  2632. _attackPattern[2] = [-1 - (isActBoss ? _bossOffset : 0), 0];
  2633. _attackPattern[3] = [2 + (isActBoss ? _bossOffset : 0), 0];
  2634. _attackPattern[4] = [-2 - (isActBoss ? _bossOffset : 0), 0];
  2635.  
  2636. } else if (NTConfig_TrapAttackPattern == 3) { // Y - axis
  2637. _attackPattern[0] = [0, 0];
  2638. _attackPattern[1] = [0, 1 + (isActBoss ? _bossOffset : 0)];
  2639. _attackPattern[2] = [0, -1 - (isActBoss ? _bossOffset : 0)];
  2640. _attackPattern[3] = [0, 2 + (isActBoss ? _bossOffset : 0)];
  2641. _attackPattern[4] = [0, -2 - (isActBoss ? _bossOffset : 0)];
  2642. } else { // quincunx
  2643. _attackPattern[0] = [2 + (isActBoss ? _bossOffset : 0), 2 + (isActBoss ? _bossOffset : 0)];
  2644. _attackPattern[1] = [-2 - (isActBoss ? _bossOffset : 0), -2 - (isActBoss ? _bossOffset : 0)];
  2645. _attackPattern[2] = [-2 - (isActBoss ? _bossOffset : 0), 2 + (isActBoss ? _bossOffset : 0)];
  2646. _attackPattern[3] = [2 + (isActBoss ? _bossOffset : 0), -2 - (isActBoss ? _bossOffset : 0)];
  2647. _attackPattern[4] = [0, 0];
  2648. }
  2649.  
  2650. return _attackPattern;
  2651. }
  2652.  
  2653. /*
  2654. We want an attack that is less than our given max resist for a particular skill. If all of our attacks don't meet our
  2655. requirement, return the lowest resist skill.
  2656. */
  2657.  
  2658. function NTA_GetAttackType(target, startIndex, resistMaxPrimary, resistMaxSecondary, resistMaxTertiary) {
  2659.  
  2660. var _currIndex;
  2661. var _holdMinResist = [999, startIndex];
  2662. var _resistArray = [999, 999, 999];
  2663. var _holdResistMax = [resistMaxPrimary, resistMaxSecondary, resistMaxTertiary];
  2664. var i;
  2665.  
  2666. for (i = 0, _currIndex = startIndex; i < 3; i++, _currIndex += 2) {
  2667. if (NTConfig_AttackSkill[_currIndex] > -1) {
  2668. _resistArray[i] = NTA_GetResistance(target, _NTA_SkillDamage[_currIndex]);
  2669. if(_resistArray[i] < 100) {
  2670. switch(_NTA_SkillDamage[_currIndex])
  2671. {
  2672. case NTA_DAMAGE_PHYSICAL:
  2673. _resistArray[i] = target.GetStat(36);
  2674. break;
  2675. case NTA_DAMAGE_MAGIC:
  2676. _resistArray[i] = target.GetStat(37) - me.GetStat(358);
  2677. break;
  2678. case NTA_DAMAGE_FIRE:
  2679. _resistArray[i] = target.GetStat(39) - me.GetStat(333);
  2680. break;
  2681. case NTA_DAMAGE_LIGHTNING:
  2682. _resistArray[i] = target.GetStat(41) - me.GetStat(334);
  2683. break;
  2684. case NTA_DAMAGE_COLD:
  2685. _resistArray[i] = target.GetStat(43) - me.GetStat(335);
  2686. break;
  2687. case NTA_DAMAGE_POISON:
  2688. _resistArray[i] = target.GetStat(45) - me.GetStat(336);
  2689. break;
  2690. }
  2691.  
  2692. if(_resistArray[i] < -100)
  2693. _resistArray[i] = -100;
  2694. }
  2695. if (_resistArray[i] < _holdResistMax[i]) // Return index if attack is < our max resist requirement
  2696. return _currIndex;
  2697. }
  2698.  
  2699. if (_resistArray[i] < _holdMinResist[0]) { // Store lowest resist attack
  2700. _holdMinResist[0] = _resistArray[i];
  2701. _holdMinResist[1] = _currIndex;
  2702. }
  2703.  
  2704. if (_currIndex == 1 || _currIndex == 2) // Skip non boss primary if boss attack
  2705. _currIndex += 2;
  2706. }
  2707.  
  2708.  
  2709. if (_holdMinResist[0] >= 100) // Every attack is immune
  2710. return startIndex;
  2711. else // At this point all available skills are greater than given max resist settings. Use lowest resist skill.
  2712. return _holdMinResist[1];
  2713. }
  2714.  
  2715. function NTA_HighMaxAttackAreas() {
  2716.  
  2717. var _presentarea = me.areaid
  2718.  
  2719. for (var i = 0; i < NTConfig_HighMaxAttackAreas.length; i++) {
  2720. if (_presentarea == NTConfig_HighMaxAttackAreas[i]) {
  2721. return true;
  2722. }
  2723. }
  2724. return false;
  2725. }
  2726.  
  2727. function NTA_ClearPositionGoodMonsters(range, pickitem, safelevel) {
  2728. var _orgx, _orgy;
  2729. var _spectype = [0x0A];
  2730. var _skiplist;
  2731. var _attackcount = 0;
  2732. var _target;
  2733. var _distance, _mingid, _mindistance;
  2734. var _result;
  2735.  
  2736. if (NTConfig_AttackSkill[1] < 0 || NTConfig_AttackSkill[3] < 0) return false;
  2737.  
  2738. switch (arguments.length) {
  2739. case 0:
  2740. range = 20;
  2741. case 1:
  2742. pickitem = false;
  2743. case 2:
  2744. safelevel = 0;
  2745. default:
  2746. if (NTConfig_CheckSelfSafe.length < 1 && NTConfig_CheckMercSafe.length < 1) safelevel = 0;
  2747. break;
  2748. }
  2749.  
  2750. _orgx = me.x;
  2751. _orgy = me.y;
  2752.  
  2753. for (var i = 0; i < _spectype.length; i++) {
  2754. _skiplist = new Array();
  2755.  
  2756. while (_attackcount < (i + 1) * 100) {
  2757. _mindistance = 100000;
  2758.  
  2759. _target = NTC_FindUnit(NTC_UNIT_MONSTER);
  2760.  
  2761. if (_target) {
  2762. do {
  2763. if (_skiplist.indexOf(_target.gid) < 0) {
  2764. if (_target.IsAttackable() && (_target.spectype & _spectype[i])) {
  2765. if (GetDistance(_orgx, _orgy, _target.x, _target.y) <= range && NTA_IsValidMonster(_target)) {
  2766. _distance = GetDistance(me, _target);
  2767.  
  2768. if (_distance < _mindistance) {
  2769. _mingid = _target.gid;
  2770. _mindistance = _distance;
  2771. }
  2772. }
  2773. } else _skiplist.push(_target.gid);
  2774. }
  2775. } while (_target.GetNext());
  2776. }
  2777.  
  2778. if (_mindistance < 100000) {
  2779. _target = NTC_FindUnit(NTC_UNIT_MONSTER, _mingid);
  2780.  
  2781. if (_target) {
  2782. _result = NTA_Attack(_target, (_attackcount % 30) == 0);
  2783.  
  2784. switch (_result) {
  2785. case 1:
  2786. _skiplist.push(_mingid);
  2787. break;
  2788. case 2:
  2789. case 3:
  2790. _attackcount++;
  2791. _sorcattack++;
  2792. if (NTConfig_FastPickit) //----------------------------------edited lines
  2793. NTSI_PickItems(); //----------------------------------------
  2794. break;
  2795. default:
  2796. return false;
  2797. }
  2798. }
  2799. } else break;
  2800. }
  2801. }
  2802.  
  2803. if (me.classid == NTC_CHAR_CLASS_PALADIN) {
  2804. if (_attackcount > 2 && (parseInt(me.hp * 100 / me.hpmax) < NTConfig_UseRedemptionHP || parseInt(me.mp * 100 / me.mpmax) < NTConfig_UseRedemptionMP)) {
  2805. if (NTC_PutSkill(124, NTC_HAND_RIGHT)) NTC_PingDelay(1000);
  2806. }
  2807. } else if (me.classid == NTC_CHAR_CLASS_NECROMANCER) {
  2808. NTA_SkeletonArmy(NTConfig_SkeletonArmy);
  2809. NTA_MageArmy(NTConfig_MageArmy);
  2810. NTA_ReviveArmy(NTConfig_ReviveArmy);
  2811. } else if (me.classid == NTC_CHAR_CLASS_BARBARIAN) {
  2812. if (NTConfig_UseFindItem && _attackcount > 2) {
  2813. if (!NTA_CheckForCloseMonsters(10)) {
  2814. //Print(COLOR_25 + "No Monsters close - looting");
  2815. NTA_FindItem(NTConfig_FindItemRange);
  2816. }
  2817. }
  2818. }
  2819.  
  2820. if (NTConfig_OpenChest) {
  2821. _target = NTC_GetSpecialChest();
  2822.  
  2823. if (_target && GetDistance(_orgx, _orgy, _target.x, _target.y) <= range && NTC_OpenChest(_target)) _attackcount++;
  2824. _sorcattack++;
  2825. }
  2826.  
  2827. if (pickitem && _attackcount > 0) NTSI_PickItems();
  2828.  
  2829. switch (safelevel) {
  2830. case 1:
  2831. return NTTMGR_CheckSafe(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe);
  2832. case 2:
  2833. return NTTMGR_CheckSafe(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe);
  2834. }
  2835.  
  2836. return true;
  2837. }
  2838.  
  2839. function NTA_CheckMercInfinity() {
  2840. var _weapon, _merc;
  2841. var Merc_HaveInfinty = false;
  2842. _merc = NTC_GetMerc();
  2843. if (!_merc) {
  2844. if (DebugAttacksInGame) {
  2845. Print(COLOR_8 + "merc is dead or not hired");
  2846. }
  2847. return false;
  2848. }
  2849. if (_merc && _merc.hp > 0 && _merc.mode != 0 && _merc.mode != 12) {
  2850. _weapon = _merc.GetItems();
  2851. if (_weapon) {
  2852. for (var i = 0; i < _weapon.length && !Merc_HaveInfinty; i++) {
  2853. if ((_weapon[i].itemflag & 0x4000000) && _weapon[i].itemprefix == 20566) {
  2854. Merc_HaveInfinty = true;
  2855. if (DebugAttacksInGame) {
  2856. Print(COLOR_8 + "merc has infinity");
  2857. }
  2858. return true;
  2859. }
  2860. }
  2861. }
  2862. }
  2863. if (!Merc_HaveInfinty) {
  2864. if (DebugAttacksInGame) {
  2865. Print(COLOR_8 + "merc has no infinity");
  2866. }
  2867. return false;
  2868. }
  2869. }
  2870.  
  2871. function NTA_CheckMyHp() {
  2872. _LifeMax = me.hpmax;
  2873. _ManaMax = me.mpmax;
  2874.  
  2875. if (NTConfig_DanceStartHp > 0 || NTConfig_DanceStartMp > 0) {
  2876. if (parseInt(me.hp * 100 / _LifeMax) < NTConfig_DanceStartHp || parseInt(me.mp * 100 / _ManaMax) < NTConfig_DanceStartMp) return true;
  2877. } else return false;
  2878. }
  2879.  
  2880. function NTA_Bounce(target) {
  2881. if (me.x - target.x >= 0 && me.y - target.y >= 0) NTC_CastSkill(54, NTC_HAND_RIGHT, target.x - NTConfig_BounceRange, target.y - NTConfig_BounceRange);
  2882.  
  2883. else if (me.x - target.x >= 0 && me.y - target.y < 0) NTC_CastSkill(54, NTC_HAND_RIGHT, target.x - NTConfig_BounceRange, target.y + NTConfig_BounceRange);
  2884.  
  2885. else if (me.x - target.x < 0 && me.y - target.y >= 0) NTC_CastSkill(54, NTC_HAND_RIGHT, target.x + NTConfig_BounceRange, target.y + NTConfig_BounceRange);
  2886.  
  2887. else NTC_CastSkill(54, NTC_HAND_RIGHT, target.x + NTConfig_BounceRange, target.y - NTConfig_BounceRange);
  2888. _sorcattack = 0;
  2889. }
  2890.  
  2891. function NTA_ClearPos(repeat, range, delay, backxy) {
  2892. var presx = me.x;
  2893. var presy = me.y;
  2894. if (arguments.length < 4) backxy = false;
  2895. if (arguments.length < 3) delay = 0;
  2896. if (arguments.length < 2) range = 25;
  2897. if (arguments.length < 1) repeat = 2;
  2898. if (DebugAttacksInGame) {
  2899. Print(COLOR_17 + "delay= " + delay + ", range =" + range + ", repeat =" + repeat);
  2900. }
  2901. for (var k = 0; k < repeat; k++) {
  2902. NTA_ClearPosition(range);
  2903. if (backxy) NTM_MoveTo(108, presx, presy, 3, false, false);
  2904. Delay(delay);
  2905. if (DebugAttacksInGame) {
  2906. Print(COLOR_8 + "Loop" + "[" + k + "]");
  2907. }
  2908. }
  2909. }
  2910.  
  2911. function NTA_FindItem(range) {
  2912. var _corpse;
  2913. var _orgx;
  2914. var _orgy;
  2915. var _startTick;
  2916. var _reposition = false;
  2917.  
  2918. if (me.classid != NTC_CHAR_CLASS_BARBARIAN || NTC_GetSkillLevel(142) < 1) return false;
  2919.  
  2920. if (arguments.length < 1 || !range) range = 25;
  2921.  
  2922. _corpse = NTC_FindUnit(NTC_UNIT_MONSTER);
  2923. _orgx = me.x;
  2924. _orgy = me.y;
  2925.  
  2926. NTC_PingDelay(100);
  2927. NTC_SwapWeapons(2);
  2928.  
  2929. if (_corpse) {
  2930. do {
  2931. if (GetDistance(_orgx, _orgy, _corpse.x, _corpse.y) <= range && NTA_CheckLootStatus(_corpse) && NTA_IsLootable(_corpse.classid)) {
  2932. if (GetDistance(me.x, me.y, _corpse.x, _corpse.y) >= 8) {
  2933. if (!NTM_MoveTo(me.areaid, _corpse.x, _corpse.y, 3, false, false)) continue;
  2934. }
  2935. _startTick = GetTickCount();
  2936. _reposition = false;
  2937. while (NTA_CheckLootStatus(_corpse) && !_corpse.IsAttackable()) {
  2938. NTC_CastSkill(142, NTC_HAND_RIGHT, _corpse);
  2939. NTC_PingDelay(50);
  2940.  
  2941. if (GetTickCount() >= _startTick + 1000 && !_reposition) // repositioning after 1sec
  2942. {
  2943. _reposition = true;
  2944. if (!NTM_MoveTo(me.areaid, _corpse.x, _corpse.y, 3, false, false)) break;
  2945. }
  2946. if (GetTickCount() >= _startTick + 2500) // skipping monster after 2.5sec
  2947. {
  2948. if (me.mp < 10) {
  2949. Print("Lack of" + COLOR_3 + "Mana" + COLOR_0 + "!");
  2950. if (NTConfig_BuyPotsIfLackOfMana) {
  2951. if (NTTMGR_VisitTown()) NTC_SwapWeapons(2);
  2952. }
  2953. break;
  2954. }
  2955. var _filehandle = FileOpen("FailedtoLoot.txt", 2);
  2956. var _dateString = new Date().toLocaleFormat("%a %m/%d/%y %H:%M:%S");
  2957. if (_filehandle) {
  2958. var _states = "States:: ";
  2959. for (var i = 0; i < 144; i++) {
  2960. if (_corpse.GetState(i)) _states += "State(" + i + "): " + _corpse.GetState(i) + "<--> ";
  2961. }
  2962. _filehandle.WriteLine("[" + _dateString + "] Could not loot: " + _corpse.name + " [" + _corpse.classid + "] (Location: " + me.areaid + ") " + _states);
  2963. _filehandle.Close();
  2964. }
  2965. Print(COLOR_11 + "Could not loot: " + _corpse.name + " [" + _corpse.classid + "] <Mode: " + _corpse.mode + "> (Location: " + me.areaid + ")");
  2966. break;
  2967. }
  2968.  
  2969. }
  2970. /*if(GetTickCount() < _startTick + 2000)
  2971. NTC_SendMsgToScript("NTBotGame.ntj", "SET_LOOTED_NULL");*/
  2972. }
  2973. } while (_corpse.GetNext());
  2974.  
  2975. NTC_SwapWeapons(0);
  2976. NTC_PingDelay(100);
  2977.  
  2978. NTSI_PickItems();
  2979.  
  2980. return true;
  2981. }
  2982. return false;
  2983. }
  2984.  
  2985. function NTA_CheckForCloseMonsters(range) {
  2986. if (range < 1 || arguments.length < 1) return false;
  2987.  
  2988. var _monstersClose = false;
  2989. var _checkMonster = NTC_FindUnit(NTC_UNIT_MONSTER);
  2990.  
  2991. if (_checkMonster) {
  2992. do {
  2993. if (_checkMonster.IsAttackable() && GetDistance(me.x, me.y, _checkMonster.x, _checkMonster.y) < range && NTA_IsValidMonster(_checkMonster)) {
  2994. _monstersClose = true;
  2995. break;
  2996. }
  2997. } while (_checkMonster.GetNext());
  2998. }
  2999. return _monstersClose;
  3000. }
  3001.  
  3002. function NTA_CheckLootStatus(monsterunit) {
  3003. if (!monsterunit.GetState(107) // Shattered
  3004. && !monsterunit.GetState(104) // Corpse Explosion
  3005. && !monsterunit.GetState(118) // Already Looted/Unlootable
  3006. && (monsterunit.hp <= 0 || monsterunit.mode == 0 || monsterunit.mode == 12)) // Dead
  3007. return true;
  3008. else return false;
  3009. }
  3010.  
  3011. function NTA_IsLootable(classid) {
  3012. switch (classid) {
  3013. case 151:
  3014. // An evil force
  3015. case 156:
  3016. // Andariel
  3017. case 180:
  3018. // Sand Maggot Young
  3019. case 181:
  3020. // Rock Worm Young
  3021. case 182:
  3022. // Devourer Young
  3023. case 183:
  3024. // Giant Lamprey Young
  3025. case 184:
  3026. // World Killer Young
  3027. case 190:
  3028. // Sand Maggot Egg
  3029. case 191:
  3030. // Rock Worm Egg
  3031. case 192:
  3032. // Devourer Egg
  3033. case 193:
  3034. // Giant Lamprey Egg
  3035. case 194:
  3036. // World Killer Egg
  3037. case 206:
  3038. // Fould Crow Nest
  3039. case 207:
  3040. // Blood Hawk Nest
  3041. case 208:
  3042. // Black Vulture Nest
  3043. case 209:
  3044. // Cloud Stalker Nest
  3045. case 221:
  3046. // Duriel
  3047. case 227:
  3048. // Maggot
  3049. case 228:
  3050. // Mummy Generator
  3051. case 234:
  3052. // Flying Scimitar
  3053. case 242:
  3054. // Mephisto
  3055. case 243:
  3056. // Diablo
  3057. case 250:
  3058. // Summoner
  3059. case 258:
  3060. // Water Watcher Limb
  3061. case 259:
  3062. // River Stalker Limb
  3063. case 260:
  3064. // Sygain Watcher Limb
  3065. case 261:
  3066. // Water Watcher Head
  3067. case 262:
  3068. // River Stalker Head
  3069. case 263:
  3070. // Sygain Watcher Head
  3071. case 267:
  3072. // Blood Raven
  3073. case 269:
  3074. // An evil force
  3075. case 270:
  3076. // Rogue Scout (== Merc)
  3077. case 273:
  3078. // Gargoyle Trap
  3079. case 289:
  3080. // Clay Golem
  3081. case 290:
  3082. // Blood Golem
  3083. case 291:
  3084. // Iron Golem
  3085. case 292:
  3086. // Fire Golem
  3087. case 301:
  3088. // Flesh Beast
  3089. case 302:
  3090. // Stygian Dog
  3091. case 303:
  3092. // Grotesque Wyrm
  3093. case 318:
  3094. // An Evil Force
  3095. case 326:
  3096. // A Trap
  3097. case 327:
  3098. // A Trap
  3099. case 328:
  3100. // A Trap
  3101. case 329:
  3102. // A Trap
  3103. case 330:
  3104. // A Trap
  3105. case 334:
  3106. // Sucker Nest
  3107. case 335:
  3108. // Fleeder Nest
  3109. case 336:
  3110. // Blood Hook Nest
  3111. case 337:
  3112. // Blood Wing Nest
  3113. case 338:
  3114. // Act 2 guard (== Merc)
  3115. case 348:
  3116. // Turret
  3117. case 349:
  3118. // Turret
  3119. case 350:
  3120. // Turret
  3121. case 351:
  3122. // Hydra
  3123. case 352:
  3124. // Hydra
  3125. case 353:
  3126. // Hydra
  3127. case 354:
  3128. // A Trap
  3129. case 356:
  3130. // Dopplezon
  3131. case 357:
  3132. // Valkyrie
  3133. case 359:
  3134. // Iron Wolf (== Merc)
  3135. case 366:
  3136. // Compelling Orb
  3137. case 369:
  3138. // A Trap
  3139. case 371:
  3140. // Lightning Spire
  3141. case 372:
  3142. // Fire Tower
  3143. case 403:
  3144. // Traped Soul
  3145. case 404:
  3146. // Traped Soul
  3147. case 406:
  3148. // Izual
  3149. case 410:
  3150. // Wake Of Destruction
  3151. case 411:
  3152. // Charged Bolt Sentry
  3153. case 412:
  3154. // Lightning Sentry
  3155. case 413:
  3156. // Blade Creeper
  3157. case 414:
  3158. // Invisible Pet
  3159. case 415:
  3160. // Inferno Sentry
  3161. case 416:
  3162. // Death Sentry
  3163. case 417:
  3164. // Shadow Warrior
  3165. case 418:
  3166. // Shadow Master
  3167. case 419:
  3168. // Druid Hawk
  3169. case 420:
  3170. // Druid Spirit Wolf
  3171. case 421:
  3172. // Druid Fenris
  3173. case 422:
  3174. // Spirit of Barbs
  3175. case 423:
  3176. // Heart Of Wolverine
  3177. case 424:
  3178. // Oak Sage
  3179. case 425:
  3180. // Druid Plague Poppy
  3181. case 426:
  3182. // Druid Cycle of Life
  3183. case 427:
  3184. // Vine Creature
  3185. case 428:
  3186. // Druid Bear
  3187. case 429:
  3188. // Eagle
  3189. case 430:
  3190. // Wolf
  3191. case 431:
  3192. // Bear
  3193. case 432:
  3194. // Barricaded Door
  3195. case 433:
  3196. // Barricaded Door
  3197. case 434:
  3198. // Prison Door
  3199. case 435:
  3200. // Barricaded Door
  3201. case 461:
  3202. // Fanatic Minion
  3203. case 462:
  3204. // Beserk Slayer
  3205. case 463:
  3206. // Consumed Fire Boar
  3207. case 464:
  3208. // Consumed Ice Boar
  3209. case 465:
  3210. // Frenzied Hell Spawn
  3211. case 466:
  3212. // Frenzied Hell Spawn
  3213. case 467:
  3214. // Insane Hell Spawn
  3215. case 468:
  3216. // Insane Ice Spawn
  3217. case 497:
  3218. // Catapult
  3219. case 498:
  3220. // Catapult
  3221. case 499:
  3222. // Catapult
  3223. case 500:
  3224. // Catapult
  3225. case 501:
  3226. // Frozen Horror 1
  3227. case 502:
  3228. // Frozen Horror 2
  3229. case 503:
  3230. // Frozen Horror 3
  3231. case 504:
  3232. // Frozen Horror 4
  3233. case 505:
  3234. // Frozen Horror 5
  3235. case 516:
  3236. // Catapult
  3237. case 517:
  3238. // Catapult
  3239. case 518:
  3240. // Catapult
  3241. case 519:
  3242. // Catapult
  3243. case 522:
  3244. // Barbarian Fighter
  3245. case 523:
  3246. // Barbarian Fighter
  3247. case 524:
  3248. // Barricade Wall Right
  3249. case 525:
  3250. // Barricade Wall Left
  3251. case 526:
  3252. // Nihlatak
  3253. case 528:
  3254. // Evil Hut
  3255. case 535:
  3256. // Barbarian Fighter
  3257. case 536:
  3258. // Barbarian Fighter
  3259. case 537:
  3260. // Ancient Statue 1
  3261. case 538:
  3262. // Ancient Statue 2
  3263. case 539:
  3264. // Ancient Statue 3
  3265. case 540:
  3266. // Ancient Barbarian 1
  3267. case 541:
  3268. // Ancient Barbarian 2
  3269. case 542:
  3270. // Ancient Barbarian 3
  3271. case 543:
  3272. // Baal Throne
  3273. case 544:
  3274. // Baal Crab
  3275. case 545:
  3276. // Baal Taunt
  3277. case 551:
  3278. // Pain Worm
  3279. case 552:
  3280. // Pain Worm
  3281. case 553:
  3282. // Pain Worm
  3283. case 554:
  3284. // Pain Worm
  3285. case 555:
  3286. // Pain Worm
  3287. case 556:
  3288. // Bunny
  3289. case 559:
  3290. // Baal Crab to Stairs
  3291. case 560:
  3292. // Hireling
  3293. case 561:
  3294. // Hireling
  3295. case 562:
  3296. // Baal Tentacle
  3297. case 563:
  3298. // Baal Tentacle
  3299. case 564:
  3300. // Baal Tentacle
  3301. case 565:
  3302. // Baal Tentacle
  3303. case 566:
  3304. // Baal Tentacle
  3305. case 567:
  3306. // Injured Barbarian
  3307. case 568:
  3308. // Injured Barbarian
  3309. case 569:
  3310. // Injured Barbarian
  3311. case 570:
  3312. // Baal Crab Clone
  3313. case 571:
  3314. // Baals Minions
  3315. case 572:
  3316. // Baals Minionse
  3317. case 573:
  3318. // Baals Minions
  3319. case 574:
  3320. // Worldstone Effect
  3321. case 662:
  3322. // Flayer Shaman
  3323. return false;
  3324. break;
  3325. default:
  3326. return true;
  3327. break;
  3328. }
  3329. }
  3330.  
  3331. function NT_FieldID() {
  3332. var i, location, tome, scroll, length,
  3333. items = NTT_GetUnidItems();
  3334.  
  3335. if(!items || items.length < 1)
  3336. return false;
  3337.  
  3338. tome = NTT_GetTome();
  3339.  
  3340. if (!tome || tome.GetStat(70) < items.length) { // no tome or not enough scrolls in it
  3341. return false;
  3342. }
  3343. for (i = 0; i < items.length; i++) {
  3344. if(NTSI_CheckItem(items[i]) == -1){
  3345. SetUIState(0x01, true);
  3346. break;
  3347. }
  3348. }
  3349. length = items.length;
  3350. for (i = 0; i < length; i = i + 1) {
  3351. switch (NTSI_CheckItem(items[i])) {
  3352. case -1:
  3353. if (tome) {
  3354. NTT_IdItem(tome, items[i]);
  3355. }
  3356.  
  3357. break;
  3358. }
  3359. }
  3360. _location = GetArea();
  3361. for (i = length - 1; i > -1; i = i - 1) {
  3362. // item logger stuff here - location and ethereal
  3363.  
  3364. switch (NTSI_CheckItem(items[i])) {
  3365. case 1:
  3366. if(items[i].itemflag & 0x10){
  3367. NTC_SendLogToOOG(NTC_LOG_ITEM, COLOR_2 + "Field id Kept: " + NTC_ItemQualityToMGRColor[items[i].quality] + items[i].name.split("\n")[0]+ ";" + items[i].itemdesc + COLOR_2 + "\n iLvl: " + items[i].itemlevel + COLOR_2 + "\n Area: " + _location);
  3368. }
  3369. case 2:
  3370. break;
  3371. default:
  3372. if(NTConfig_LogSoldItemQuality != 0 && items[i].quality >= NTConfig_LogSoldItemQuality) {
  3373. NTC_SendLogToOOG(NTC_LOG_ITEM, COLOR_1 + "Field id Dropped " + NTC_ItemQualityToMGRColor[items[i].quality] + items[i].name.split("\n")[0]+ ";" + items[i].itemdesc + COLOR_2 + "\n iLvl: " + items[i].itemlevel + COLOR_2 + "\n Area: " + _location);
  3374. }
  3375. NTT_DropItem(items[i]);
  3376. break;
  3377. }
  3378. }
  3379. me.Cancel(1);
  3380. return true;
  3381. }
  3382.  
  3383. /*function NTA_CheckForCTA() {
  3384. var _weapon = me.GetItems();
  3385. var haveCTA = false;
  3386. if (_weapon ) {
  3387. for(var i = 0 ; i < _weapon.length ; i++){
  3388. if(_weapon[i].mode == 1 && (_weapon[i].itemflag&0x4000000) && _weapon[i].itemprefix == 0x5027){
  3389. haveCTA = true;
  3390. break;
  3391. }
  3392. }
  3393. }
  3394. return haveCTA;
  3395. }*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement