DraculaxAOE

NTAttack.ntl

Nov 5th, 2016
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 44.36 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 = [];
  10. var _NTA_SkillDamage = [];
  11. var _NTA_SkillRange = [];
  12. var _NTA_CurseState = [];
  13.  
  14. var _NTA_Ranged = false;
  15.  
  16. var _NTA_NovaTick;
  17. var _sorcattack = 0;
  18. var skippedImmuneBoss = false;
  19.  
  20. function NTA_Initialize() {
  21. if (NTConfig_AttackSkill[1] == -1 || NTConfig_AttackSkill[3] == -1) {
  22. switch (me.classid) {
  23. case NTC_CHAR_CLASS_AMAZON: Print("No attacks where set in your NTConfig_Amazon_" + me.charname + ".ntl file!"); break;
  24. case NTC_CHAR_CLASS_SORCERESS: Print("No attacks where set in your NTConfig_Sorceress_" + me.charname + ".ntl file!"); break;
  25. case NTC_CHAR_CLASS_NECROMANCER: Print("No attacks where set in your NTConfig_Necromancer_" + me.charname + ".ntl file!"); break;
  26. case NTC_CHAR_CLASS_PALADIN: Print("No attacks where set in your NTConfig_Paladin_" + me.charname + ".ntl file!"); break;
  27. case NTC_CHAR_CLASS_BARBARIAN: Print("No attacks where set in your NTConfig_Barbarian_" + me.charname + ".ntl file!"); break;
  28. case NTC_CHAR_CLASS_DRUID: Print("No attacks where set in your NTConfig_Druid_" + me.charname + ".ntl file!"); break;
  29. case NTC_CHAR_CLASS_ASSASSIN: Print("No attacks where set in your NTConfig_Assassin_" + me.charname + ".ntl file!"); break;
  30. default: Print("No attacks where set in your NTConfig_Class_" + me.charname + ".ntl file!"); break;
  31. }
  32. Print("Please set them then restart the bot");
  33. while (1) {
  34. Delay(500);
  35. }
  36. }
  37.  
  38. //Check if we use a bow or crossbow;
  39. _NTA_Ranged = NTA_RangedNormal();
  40.  
  41. for (var i = 0; i < NTConfig_AttackSkill.length; i++) {
  42. if (NTConfig_AttackSkill[i] > -1) {
  43. _NTA_SkillHand[i] = GetBaseStat("skills.txt", NTConfig_AttackSkill[i], 166) ? 2 : NTC_HAND_RIGHT;
  44. _NTA_SkillDamage[i] = NTA_GetDamageType(NTConfig_AttackSkill[i]);
  45.  
  46. switch (NTConfig_AttackSkill[i]) {
  47. case 0: //Normal Attack
  48. if (_NTA_Ranged) { _NTA_SkillRange[i] = 20; }
  49. else { _NTA_SkillRange[i] = 2; }
  50. break;
  51. case 1: //Kicks
  52. _NTA_SkillRange[i] = 2;
  53. break;
  54. case 5: // Left Hand Swing
  55. _NTA_SkillRange[i] = 2;
  56. break;
  57. case 6: //Magic Arrow
  58. break;
  59. case 7: //Fire Arrow
  60. _NTA_SkillRange[i] = 20;
  61. break;
  62. case 8: //Inner Sight
  63. _NTA_SkillRange[i] = 13;
  64. break;
  65. case 10: //Jab
  66. _NTA_SkillRange[i] = 3;
  67. break;
  68. case 11: //Cold Arrow
  69. break;
  70. case 12: //Multiple Shot
  71. _NTA_SkillRange[i] = 20;
  72. break;
  73. case 14: //Power Strike
  74. _NTA_SkillRange[i] = 3;
  75. break;
  76. case 15: //Poison Javelin
  77. _NTA_SkillRange[i] = 10;
  78. break;
  79. case 16: //Exploding Arrow
  80. _NTA_SkillRange[i] = 20;
  81. break;
  82. case 17: //Slow Missiles
  83. _NTA_SkillRange[i] = 13;
  84. break;
  85. case 19: //Impale
  86. _NTA_SkillRange[i] = 3;
  87. break;
  88. case 20: //Lightning Bolt
  89. break;
  90. case 21: //Ice arrow
  91. break;
  92. case 22: //Guided arrow
  93. _NTA_SkillRange[i] = 20;
  94. break;
  95. case 24: //Charged Strike
  96. if(!NTConfig_FarCastAma) { _NTA_SkillRange[i] = 3; }
  97. else if(NTConfig_FarCastAma) { _NTA_SkillRange[i] = NTConfig_FCRange; }
  98. break;
  99. case 25: //Plague jav
  100. _NTA_SkillRange[i] = 10;
  101. break;
  102. case 26: //Strafe
  103. break;
  104. case 27: //Immolation Arrow
  105. _NTA_SkillRange[i] = 20;
  106. break;
  107. case 30: //Fend
  108. _NTA_SkillRange[i] = 3;
  109. break;
  110. case 31: //Freezing arrow
  111. _NTA_SkillRange[i] = 20;
  112. break;
  113. case 34: //Lightning Strike
  114. _NTA_SkillRange[i] = 3;
  115. break;
  116. case 35: //Lightning Fury
  117. _NTA_SkillRange[i] = 15;
  118. break;
  119. case 38: //charged bolt
  120. _NTA_SkillRange[i] = 7;
  121. break;
  122. case 41: // Inferno
  123. break;
  124. case 42: // Static
  125. _NTA_SkillRange[i] = 3;
  126. break;
  127. case 44: //Frost Nova
  128. _NTA_SkillRange[i] = 7;
  129. break;
  130. case 46: // Blaze
  131. _NTA_SkillRange[i] = 2;
  132. break;
  133. case 48: // Nova
  134. _NTA_SkillRange[i] = 7;
  135. break;
  136. case 64: // Frozen Orb
  137. _NTA_SkillRange[i] = 15;
  138. break;
  139. case 73: // Poison Dagger
  140. _NTA_SkillRange[i] = 2;
  141. break;
  142. case 84: // Bone Spear
  143. _NTA_SkillRange[i] = 15;
  144. break;
  145. case 91: //Lower Resist
  146. _NTA_SkillRange[i] = 50;
  147. break;
  148. case 92: // Poison Nova
  149. _NTA_SkillRange[i] = 15;
  150. break;
  151. case 93: //Bone Spirit
  152. _NTA_SkillRange[i] = 15;
  153. break;
  154. case 95: //Revive
  155. _NTA_SkillRange[i] = 20;
  156. break;
  157. case 96: //Sacrifice
  158. break;
  159. case 97: //Smite
  160. _NTA_SkillRange[i] = 2;
  161. break;
  162. case 101: //Holy Bolt
  163. _NTA_SkillRange[i] = 15;
  164. break;
  165. case 106: //Zeal
  166. _NTA_SkillRange[i] = 3;
  167. break;
  168. case 111: //Vengeance
  169. _NTA_SkillRange[i] = 2;
  170. break;
  171. case 112: //Blessed Hammer
  172. _NTA_SkillRange[i] = 3;
  173. break;
  174. case 121: // FOH
  175. _NTA_SkillRange[i] = 20;
  176. break;
  177. case 126: // Bash
  178. break;
  179. case 130: // Howl
  180. _NTA_SkillRange[i] = 2;
  181. break;
  182. case 131: // find Potion
  183. _NTA_SkillRange[i] = 3;
  184. break;
  185. case 132: // Leap // this is limited by lvl so i set it to lvl 1 increase as needed
  186. _NTA_SkillRange[i] = 4;
  187. break;
  188. case 133: // Double Swing
  189. break;
  190. case 139: // stun
  191. _NTA_SkillRange[i] = 2;
  192. break;
  193. case 140: // Double Throw
  194. _NTA_SkillRange[i] = 20;
  195. break;
  196. case 142: // Find item
  197. _NTA_SkillRange[i] = 3;
  198. break;
  199. case 144: //Concentrate
  200. _NTA_SkillRange[i] = 3;
  201. break;
  202. case 146: // Battle cry
  203. _NTA_SkillRange[i] = 3;
  204. break;
  205. case 147: //Frenzy
  206. _NTA_SkillRange[i] = 2;
  207. break;
  208. case 150: //grim ward
  209. _NTA_SkillRange[i] = 3;
  210. break;
  211. case 151: //Whirlwind
  212. _NTA_SkillRange[i] = 8;
  213. break;
  214. case 152: //Berserk
  215. _NTA_SkillRange[i] = 2;
  216. break;
  217. case 154: // War Cry
  218. _NTA_SkillRange[i] = 4;
  219. break;
  220. case 225: //Fire Storm
  221. break;
  222. case 229: //Molten Boulder
  223. break;
  224. case 230: //Arctic Blast
  225. break;
  226. case 232: //Feral Rage
  227. break;
  228. case 233: //Maul
  229. break;
  230. case 234: //Fissure
  231. break;
  232. case 238: //Rabies
  233. break;
  234. case 239: //Fire Claws
  235. break;
  236. case 240: //Twister
  237. break;
  238. case 242: //Hunger
  239. break;
  240. case 243: //Shockwave
  241. break;
  242. case 244: //Volcano
  243. _NTA_SkillRange[i] = 3;
  244. break;
  245. case 245: //Tornado
  246. _NTA_SkillRange[i] = NTConfig_NadoDist;
  247. break;
  248. case 248: //Fury
  249. _NTA_SkillRange[i] = 3;
  250. break;
  251. case 249: //Armageddon
  252. _NTA_SkillRange[i] = 9;
  253. break;
  254. case 255: //Dragon Talon
  255. _NTA_SkillRange[i] = 2;
  256. break;
  257. case 271: // Lightning Sentry
  258. break;
  259. case 276: // Death Sentry
  260. break;
  261. case 261: // Charged Bolt Sentry
  262. _NTA_SkillRange[i] = 20;
  263. break;
  264. case 251: // Fire Blast
  265. break;
  266. case 256: // Shockweb Sentry
  267. _NTA_SkillRange[i] = 15;
  268. break;
  269. default: _NTA_SkillRange[i] = 25;
  270. break;
  271. }
  272. }
  273. }
  274. if (me.classid == NTC_CHAR_CLASS_ASSASSIN) { NTA_InitializeAssassinAttacks(); }
  275.  
  276. if (me.classid == NTC_CHAR_CLASS_NECROMANCER) {
  277. for (var i = 0 ; i < 2 ; i+= 1) {
  278. if (NTConfig_Curse[i] > 0) {
  279. switch (NTConfig_Curse[i]) {
  280. case 0: //nothing
  281. _NTA_CurseState[i] = 0;
  282. break;
  283. case 66: //amplify damage
  284. _NTA_CurseState[i] = 9;
  285. break;
  286. case 71: //dim vision
  287. _NTA_CurseState[i] = 23;
  288. break;
  289. case 72: //weaken
  290. _NTA_CurseState[i] = 19;
  291. break;
  292. case 76: //iron maiden
  293. _NTA_CurseState[i] = 55;
  294. break;
  295. case 77: //terror
  296. _NTA_CurseState[i] = 56;
  297. break;
  298. case 81: //confuse
  299. _NTA_CurseState[i] = 59;
  300. break;
  301. case 82: //life tap
  302. _NTA_CurseState[i] = 58;
  303. break;
  304. case 86: //attract
  305. _NTA_CurseState[i] = 57;
  306. break;
  307. case 87: //decrepify
  308. _NTA_CurseState[i] = 60;
  309. break;
  310. case 91: //lower resist
  311. _NTA_CurseState[i] = 61;
  312. break;
  313. default:
  314. NTConfig_Curse[i] = 0;
  315. Print("Invalid curse id");
  316. break;
  317. }
  318. }
  319. }
  320. }
  321. }
  322.  
  323. function NTA_SetMonster(classid, targethp) {
  324.  
  325. if (NTConfig_AttackSkill[1] < 0) { return false; }
  326. var _target = NTC_FindUnit(NTC_UNIT_MONSTER, classid, 5);
  327. if (!_target) { return false; }
  328. var thp = Math.floor((targethp*_target.hpmax)/100);
  329. if (_target.IsAttackable()) {
  330. var _attackcount = 0;
  331. while (_attackcount < 300 && NTA_IsValidMonster(_target )&& _target.hp > thp) {
  332. if (NTA_Attack(_target, (_attackcount % 30) == 0) < 2) {
  333. break;
  334. }
  335. }
  336. }
  337. return true;
  338. }
  339.  
  340. function NTA_KillMonster(classid) {
  341. var _target;
  342.  
  343. if (NTConfig_AttackSkill[1] < 0) { return false; }
  344.  
  345. _target = NTC_FindUnit(NTC_UNIT_MONSTER, classid, 5);
  346.  
  347. if (!_target) { return false; }
  348.  
  349. if (NTConfig_PrioritizeWeakerFoes && NTConfig_PrioritizeWeakerFoesAreaDisable.indexOf(me.areaid) < 0) {
  350. NTA_ClearPosition(20, true, 2);
  351. }
  352.  
  353. if (_target.IsAttackable()) {
  354. var _attackcount = 0;
  355. while (_attackcount < 300 && NTA_IsValidMonster(_target)) {
  356. if (NTA_Attack(_target, (_attackcount % 30) == 0) < 2) {
  357. break;
  358. }
  359. if(_attackcount == 0) {
  360. if(NTTMGR_CheckCurse(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe, true)) {
  361. NTTMGR_VisitTown();
  362. } else if( NTTMGR_CheckSafe(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe, true)){
  363. NTTMGR_VisitTown();
  364. }
  365. }
  366. if((_attackcount % 5) == 0) {
  367. if(NTTMGR_CheckCurse(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe, true)) {
  368. NTTMGR_VisitTown();
  369. } else if( NTTMGR_CheckSafe(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe, true)){
  370. NTTMGR_VisitTown();
  371. }
  372. }
  373. _attackcount++;
  374. _sorcattack++;
  375. }
  376. }
  377. if(skippedImmuneBoss){
  378. Print(COLOR_2 + "skipping " + _target.name + " because of your skip immune settings");
  379. return true;
  380. }
  381. return (_target.hp <= 0 || _target.mode == 0 || _target.mode == 12);
  382. }
  383.  
  384. function NTA_ClearPosition(range, pickitem, safelevel) {
  385. var _orgx, _orgy;
  386. var _spectype = [0x0A, 0x01];
  387. var _skiplist;
  388. var _gid_attackcount;
  389. var _attackcount = 0;
  390. var _target;
  391. var _distance, _mingid, _minshamangid, _mindistance, _minshamandistance;
  392. var _result;
  393.  
  394. if (NTConfig_PrioritizeWeakerFoes && NTConfig_PrioritizeWeakerFoesAreaDisable.indexOf(me.areaid) < 0) {
  395. _spectype = [0x10, 0x01, 0x04, 0x0A];
  396. }
  397.  
  398. if (NTConfig_AttackSkill[1] < 0 || NTConfig_AttackSkill[3] < 0) { return false; }
  399.  
  400. switch (arguments.length) {
  401. case 0:
  402. range = 20;
  403. break;
  404. case 1:
  405. pickitem = true;
  406. break;
  407. case 2:
  408. safelevel = 0;
  409. break;
  410. default:
  411. if ((NTConfig_CheckSelfSafe.length < 1) && (NTConfig_CheckMercSafe.length < 1)) { safelevel = 0; }
  412. break;
  413. }
  414.  
  415. _orgx = me.x;
  416. _orgy = me.y;
  417.  
  418. for (var i = 0; i < _spectype.length; i++) {
  419. _skiplist = new Array();
  420. var _gid_lastKnownHealth = new Array();
  421. var _gid_goodattackcount = new Array();
  422.  
  423. while (_attackcount < (i + 1) * 100) {
  424. _minshamandistance = 100000;
  425. _mindistance = 100000;
  426.  
  427. _target = NTC_FindUnit(NTC_UNIT_MONSTER);
  428.  
  429. if (_target) {
  430. do {
  431. if (_skiplist.indexOf(_target.gid) < 0) {
  432. if (_target.IsAttackable() && (_target.spectype & _spectype[i])) {
  433. if (GetDistance(_orgx, _orgy, _target.x, _target.y) <= range && NTA_IsValidMonster(_target)) {
  434. _distance = GetDistance(me, _target);
  435. if (_distance < _mindistance) {
  436. _mingid = _target.gid;
  437. _mindistance = _distance;
  438. }
  439. if ((MonstersToAttackFirst.indexOf(_target.classid) > -1) && _distance < _minshamandistance) {
  440. _minshamangid = _target.gid;
  441. _minshamandistance = _distance;
  442. }
  443. }
  444. } else { _skiplist.push(_target.gid);
  445. }
  446. }
  447. } while(_target.GetNext());
  448. }
  449.  
  450. if (_minshamandistance < 100000) {
  451. _target = NTC_FindUnit(NTC_UNIT_MONSTER, _minshamangid);
  452.  
  453. if (_target) {
  454. if (_gid_lastKnownHealth[_minshamangid] == undefined) {
  455. _gid_lastKnownHealth[_minshamangid] = _target.hp;
  456. } else {
  457. if (_target.hp >= _gid_lastKnownHealth[_minshamangid]*0.98) {
  458. if (_gid_goodattackcount[_minshamangid] == undefined) {
  459. _gid_goodattackcount[_minshamangid] = 1;
  460. _gid_lastKnownHealth[_minshamangid] = _target.hp;
  461. } else {
  462. //Print(COLOR_1 + "Incrementing attack count: " + _target.name + ", " + _gid_lastKnownHealth[_minshamangid] + ", " + _target.hp + ", " + _gid_goodattackcount[_minshamangid]);
  463. _gid_goodattackcount[_minshamangid]++;
  464. _gid_lastKnownHealth[_minshamangid] = _target.hp;
  465. }
  466. }
  467. }
  468. if (NTconfig_HighMaxAttack || NTA_HighMaxAttackAreas()) {
  469. if (_gid_goodattackcount[_minshamangid] > NTConfig_HighMaxAttacks) {
  470. _skiplist.push(_minshamangid);
  471. }
  472. } else if (!NTconfig_HighMaxAttack || !NTA_HighMaxAttackAreas()) {
  473. if (_gid_goodattackcount[_minshamangid] > NTConfig_LowMaxAttacks) {
  474. //NTC_SendLogToOOG(NTC_LOG_COMMON, COLOR_2 + "Skipped: " + _target.name + ", " + _gid_lastKnownHealth[_minshamangid] + ", " + _target.hp + ", " + _gid_goodattackcount[_minshamangid]);
  475. Print(COLOR_1 + "I can't hit him!!! -> skipped");
  476. _skiplist.push(_minshamangid);
  477. }
  478. }
  479.  
  480. _result = NTA_Attack(_target, (_attackcount % 30) === 0);
  481.  
  482. switch (_result) {
  483. case 1:
  484. _skiplist.push(_minshamangid);
  485. break;
  486. case 2:
  487. break;
  488. case 3:
  489. if (_target.mode === 0 || _target.mode === 12) {
  490. NTSI_FastPick();
  491. }
  492. _attackcount++;
  493. _sorcattack++;
  494. break;
  495. default:
  496. return false;
  497. }
  498. }
  499. } else if (_mindistance < 100000) {
  500. _target = NTC_FindUnit(NTC_UNIT_MONSTER, _mingid);
  501.  
  502. if (_target) {
  503.  
  504. if (_gid_lastKnownHealth[_mingid] == undefined) {
  505. _gid_lastKnownHealth[_mingid] = _target.hp;
  506. } else {
  507. if (_target.hp >= _gid_lastKnownHealth[_mingid]*0.98) {
  508. if (_gid_goodattackcount[_mingid] == undefined) {
  509. _gid_goodattackcount[_mingid] = 1;
  510. _gid_lastKnownHealth[_mingid] = _target.hp;
  511. } else {
  512. //Print(COLOR_1 + "Incrementing attack count: " + _target.name + ", " + _gid_lastKnownHealth[_mingid] + ", " + _target.hp + ", " + _gid_goodattackcount[_mingid]);
  513. _gid_goodattackcount[_mingid]++;
  514. _gid_lastKnownHealth[_mingid] = _target.hp;
  515. }
  516. }
  517. }
  518. if (NTconfig_HighMaxAttack || NTA_HighMaxAttackAreas()) {
  519. if (_gid_goodattackcount[_mingid] > NTConfig_HighMaxAttacks) {
  520. _skiplist.push(_mingid);
  521. }
  522. } else if (!NTconfig_HighMaxAttack || !NTA_HighMaxAttackAreas()) {
  523. if (_gid_goodattackcount[_mingid] > NTConfig_LowMaxAttacks) {
  524. //NTC_SendLogToOOG(NTC_LOG_COMMON, COLOR_2 + "Skipped: " + _target.name + ", " + _gid_lastKnownHealth[_minshamangid] + ", " + _target.hp + ", " + _gid_goodattackcount[_minshamangid]);
  525. Print(COLOR_1 + "I can't hit him!!! -> skipped");
  526. _skiplist.push(_mingid);
  527. }
  528. }
  529.  
  530. _result = NTA_Attack(_target, (_attackcount % 30) === 0);
  531.  
  532. switch (_result) {
  533. case 1:
  534. _skiplist.push(_mingid);
  535. break;
  536. case 2:
  537. break;
  538. case 3:
  539. if (_target.mode === 0 || _target.mode === 12) {
  540. NTSI_FastPick();
  541. }
  542. _attackcount++;
  543. _sorcattack++;
  544. break;
  545. default:
  546. return false;
  547. }
  548. }
  549. } else { break; }
  550. }
  551. }
  552.  
  553. if (me.classid == NTC_CHAR_CLASS_PALADIN) {
  554. if (_attackcount > 2 && ((parseFloat(me.hp * 100 / me.hpmax) < NTConfig_UseRedemptionHP) || (parseInt(me.mp * 100 / me.mpmax, 10) < NTConfig_UseRedemptionMP))) {
  555. if (NTC_PutSkill(124, NTC_HAND_RIGHT)) { NTC_PingDelay(1000); }
  556. }
  557. } else if (me.classid == NTC_CHAR_CLASS_NECROMANCER) {
  558. NTA_SkeletonArmy(NTConfig_SkeletonArmy);
  559. NTA_MageArmy(NTConfig_MageArmy);
  560. NTA_ReviveArmy(NTConfig_ReviveArmy);
  561. } else if (me.classid == NTC_CHAR_CLASS_BARBARIAN) {
  562. if (NTConfig_UseFindItem && _attackcount > 2) {
  563. if (!NTA_CheckForCloseMonsters(10)) {
  564. //Print(COLOR_25 + "No Monsters close - looting");
  565. NTA_FindItem(NTConfig_FindItemRange);
  566. }
  567. }
  568. }
  569.  
  570. if (NTConfig_OpenChest) {
  571. _target = NTC_GetSpecialChest();
  572. if (_target && GetDistance(_orgx, _orgy, _target.x, _target.y) <= range && NTC_OpenChest(_target)) {
  573. _attackcount++;
  574. _sorcattack++;
  575. }
  576. }
  577. if (NTConfig_OpenChestsInAreaClearing && NTConfig_AreasToOpenChestClearing.indexOf(me.areaid) != -1) {
  578. NTC_OpenChestsInAreaNear(_orgx, _orgy, range);
  579. }
  580.  
  581. if(NTConfig_IdInField){
  582. if (!NTT_CheckSpace(NTConfig_FreeSpaceXY[0], NTConfig_FreeSpaceXY[1])) {
  583. NT_FieldID();
  584. } // id in field add
  585. }
  586.  
  587. if (pickitem && _attackcount > 0) { NTSI_PickItems(); }
  588.  
  589. if(NTConfig_IdInField){
  590. if (!NTT_CheckSpace(NTConfig_FreeSpaceXY[0], NTConfig_FreeSpaceXY[1])) {
  591. NT_FieldID();
  592. } // id in field add
  593. }
  594.  
  595. if(NTTMGR_CheckCurse(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe, true)) {
  596. NTTMGR_VisitTown();
  597. } else if( NTTMGR_CheckSafe(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe, true)) {
  598. NTTMGR_VisitTown();
  599. }
  600.  
  601. return true;
  602. }
  603.  
  604. function NTA_ClearLevel(pickitem, safelevel) {
  605. var i;
  606. var _room, _rooms;
  607. var _distance, _minindex, _mindistance;
  608.  
  609. _room = GetRoom();
  610.  
  611. if (!_room) { return false; }
  612.  
  613. switch (arguments.length) {
  614. case 0:
  615. pickitem = true;
  616. break;
  617. case 1:
  618. safelevel = 2;
  619. break;
  620. default:
  621. if ((NTConfig_CheckSelfSafe.length < 1) && (NTConfig_CheckMercSafe.length < 1)) { safelevel = 0; }
  622. break;
  623. }
  624.  
  625. _rooms = new Array();
  626.  
  627. do {
  628. _rooms.push([parseFloat(_room.x * 5 + _room.xsize * 5 / 2), parseFloat(_room.y * 5 + _room.ysize * 5 / 2)]);
  629. } while(_room.GetNext());
  630.  
  631. while (_rooms.length > 0) {
  632. _mindistance = 100000;
  633.  
  634. for (i = 0; i < _rooms.length; i++) {
  635. _distance = GetDistance(me.x, me.y, _rooms[i][0], _rooms[i][1]);
  636.  
  637. if (_distance < _mindistance) {
  638. _minindex = i;
  639. _mindistance = _distance;
  640. }
  641. }
  642.  
  643. if (NTM_MoveTo(me.areaid, _rooms[_minindex][0], _rooms[_minindex][1], 1, false, false)) {
  644. if (!NTA_ClearRoom(pickitem, safelevel)) { return false; }
  645.  
  646. NTP_DoPrecast(false);
  647. }
  648.  
  649. _rooms.splice(_minindex, 1);
  650. }
  651.  
  652. return true;
  653. }
  654.  
  655. function NTA_ClearRoom(pickitem, safelevel) {
  656. var _room;
  657. var _spectype = [0x0A, 0x01];
  658. var _skiplist, _gid_attackcount;
  659. var _attackcount = 0;
  660. var _target;
  661. var _distance, _mingid, _mindistance, _minshamangid, _minshamandistance;
  662. var _result;
  663.  
  664. if (NTConfig_PrioritizeWeakerFoes && NTConfig_PrioritizeWeakerFoesAreaDisable.indexOf(me.areaid) < 0) {
  665. _spectype = [0x10, 0x01, 0x04, 0x0A];
  666. }
  667.  
  668. if (NTConfig_AttackSkill[1] < 0 || NTConfig_AttackSkill[3] < 0) return false;
  669.  
  670. _room = me.GetRoom();
  671.  
  672. if (!_room) return false;
  673.  
  674. switch (arguments.length) {
  675. case 0:
  676. pickitem = false;
  677. case 1:
  678. safelevel = 0;
  679. default:
  680. if ((NTConfig_CheckSelfSafe.length < 1) && (NTConfig_CheckMercSafe.length < 1)) safelevel = 0;
  681. break;
  682. }
  683.  
  684. for (var i = 0; i < _spectype.length; i++) {
  685. _skiplist = new Array();
  686. var _gid_lastKnownHealth = new Array();
  687. var _gid_goodattackcount = new Array();
  688.  
  689. while (_attackcount < (i + 1) * 100) {
  690. _mindistance = 100000;
  691. _minshamandistance = 100000;
  692.  
  693. _target = NTC_FindUnit(NTC_UNIT_MONSTER);
  694.  
  695. if (_target) {
  696. do {
  697. if (_skiplist.indexOf(_target.gid) < 0) {
  698. if (_target.IsAttackable() && (_target.spectype & _spectype[i])) {
  699. if (_room.UnitInRoom(_target) && NTA_IsValidMonster(_target)) {
  700. if (MonstersToAttackFirst.indexOf(_target.classid) > -1) {
  701. _distance = GetDistance(me, _target);
  702.  
  703. if (_distance < _minshamandistance) {
  704. _minshamangid = _target.gid;
  705. _minshamandistance = _distance;
  706. }
  707. } else {
  708. _distance = GetDistance(me, _target);
  709.  
  710. if (_distance < _mindistance) {
  711. _mingid = _target.gid;
  712. _mindistance = _distance;
  713. }
  714. }
  715. }
  716. } else _skiplist.push(_target.gid);
  717. }
  718. } while (_target.GetNext());
  719. }
  720.  
  721. if (_minshamandistance < 100000) {
  722. _target = NTC_FindUnit(NTC_UNIT_MONSTER, _minshamangid);
  723.  
  724. if (_target) {
  725. _result = NTA_Attack(_target, (_attackcount % 30) == 0);
  726.  
  727. if (_gid_lastKnownHealth[_minshamangid] == undefined) {
  728. _gid_lastKnownHealth[_minshamangid] = _target.hp;
  729. } else {
  730. if (_target.hp >= _gid_lastKnownHealth[_minshamangid]*0.98) {
  731. if (_gid_goodattackcount[_minshamangid] == undefined) {
  732. _gid_goodattackcount[_minshamangid] = 1;
  733. _gid_lastKnownHealth[_minshamangid] = _target.hp;
  734. } else {
  735. //Print(COLOR_1 + "Incrementing attack count: " + _target.name + ", " + _gid_lastKnownHealth[_minshamangid] + ", " + _target.hp + ", " + _gid_goodattackcount[_minshamangid]);
  736. _gid_goodattackcount[_minshamangid]++;
  737. _gid_lastKnownHealth[_minshamangid] = _target.hp;
  738. }
  739. }
  740. }
  741. if (NTconfig_HighMaxAttack || NTA_HighMaxAttackAreas()) {
  742. if (_gid_goodattackcount[_minshamangid] > NTConfig_HighMaxAttacks) {
  743. _skiplist.push(_minshamangid);
  744. }
  745. } else if (!NTconfig_HighMaxAttack || !NTA_HighMaxAttackAreas()) {
  746. if (_gid_goodattackcount[_minshamangid] > NTConfig_LowMaxAttacks) {
  747. //NTC_SendLogToOOG(NTC_LOG_COMMON, COLOR_2 + "Skipped: " + _target.name + ", " + _gid_lastKnownHealth[_minshamangid] + ", " + _target.hp + ", " + _gid_goodattackcount[_minshamangid]);
  748. Print(COLOR_1 + "I can't hit him!!! -> skipped");
  749. _skiplist.push(_minshamangid);
  750. }
  751. }
  752.  
  753. switch (_result) {
  754. case 1:
  755. _skiplist.push(_minshamangid);
  756. break;
  757. case 2:
  758. case 3:
  759. if (_target.mode === 0 || _target.mode === 12) {
  760. NTSI_FastPick();
  761. }
  762. _attackcount++;
  763. _sorcattack++;
  764. break;
  765. default:
  766. return false;
  767. }
  768. }
  769. } else if (_mindistance < 100000) {
  770. _target = NTC_FindUnit(NTC_UNIT_MONSTER, _mingid);
  771.  
  772. if (_target) {
  773. _result = NTA_Attack(_target, (_attackcount % 30) == 0);
  774.  
  775. if (_gid_lastKnownHealth[_mingid] == undefined) {
  776. _gid_lastKnownHealth[_mingid] = _target.hp;
  777. } else {
  778. if (_target.hp >= _gid_lastKnownHealth[_mingid]*0.98) {
  779. if (_gid_goodattackcount[_mingid] == undefined) {
  780. _gid_goodattackcount[_mingid] = 1;
  781. _gid_lastKnownHealth[_mingid] = _target.hp;
  782. } else {
  783. //Print(COLOR_1 + "Incrementing attack count: " + _target.name + ", " + _gid_lastKnownHealth[_mingid] + ", " + _target.hp + ", " + _gid_goodattackcount[_mingid]);
  784. _gid_goodattackcount[_mingid]++;
  785. _gid_lastKnownHealth[_mingid] = _target.hp;
  786. }
  787. }
  788. }
  789. if (NTconfig_HighMaxAttack || NTA_HighMaxAttackAreas()) {
  790. if (_gid_goodattackcount[_mingid] > NTConfig_HighMaxAttacks) {
  791. _skiplist.push(_mingid);
  792. }
  793. } else if (!NTconfig_HighMaxAttack || !NTA_HighMaxAttackAreas()) {
  794. if (_gid_goodattackcount[_mingid] > NTConfig_LowMaxAttacks) {
  795. //NTC_SendLogToOOG(NTC_LOG_COMMON, COLOR_2 + "Skipped: " + _target.name + ", " + _gid_lastKnownHealth[_minshamangid] + ", " + _target.hp + ", " + _gid_goodattackcount[_minshamangid]);
  796. Print(COLOR_1 + "I can't hit him!!! -> skipped");
  797. _skiplist.push(_mingid);
  798. }
  799. }
  800.  
  801. switch (_result) {
  802. case 1:
  803. _skiplist.push(_mingid);
  804. break;
  805. case 2:
  806. case 3:
  807. if (_target.mode === 0 || _target.mode === 12) {
  808. NTSI_FastPick();
  809. }
  810. _attackcount++;
  811. _sorcattack++;
  812. break;
  813. default:
  814. return false;
  815. }
  816. }
  817. } else break;
  818. }
  819. }
  820.  
  821. if (me.classid == NTC_CHAR_CLASS_PALADIN) {
  822. if (_attackcount > 2 && (parseInt(me.hp * 100 / me.hpmax) < NTConfig_UseRedemptionHP || parseInt(me.mp * 100 / me.mpmax) < NTConfig_UseRedemptionMP)) {
  823. if (NTC_PutSkill(124, NTC_HAND_RIGHT)) NTC_PingDelay(1000);
  824. }
  825. } else if (me.classid == NTC_CHAR_CLASS_NECROMANCER) {
  826. NTA_SkeletonArmy(NTConfig_SkeletonArmy);
  827. NTA_MageArmy(NTConfig_MageArmy);
  828. NTA_ReviveArmy(NTConfig_ReviveArmy);
  829. } else if (me.classid == NTC_CHAR_CLASS_BARBARIAN) {
  830. if (NTConfig_UseFindItem && _attackcount > 2) {
  831. if (!NTA_CheckForCloseMonsters(10)) {
  832. //Print(COLOR_25 + "No Monsters close - looting");
  833. NTA_FindItem(NTConfig_FindItemRange);
  834. }
  835. }
  836. }
  837.  
  838. if (NTConfig_OpenChest) {
  839. _target = NTC_GetSpecialChest();
  840. if (_target && _room.UnitInRoom(_target) && NTC_OpenChest(_target)) {
  841. _attackcount++;
  842. _sorcattack++;
  843. }
  844. }
  845.  
  846. if (NTConfig_OpenChestsInAreaClearing && NTConfig_AreasToOpenChestClearing.indexOf(me.areaid) != -1) {
  847. if (me.areaid != 93) {
  848. NTC_OpenChestsInAreaNear(me.x, me.y, 20);
  849. }
  850. else if (me.areaid == 93) {
  851. NTC_OpenChestsInAreaNear(me.x, me.y, 40); //Increased Range if in Bazaar Sewer Level 2
  852. }
  853. }
  854.  
  855. if(NTConfig_IdInField){
  856. if (!NTT_CheckSpace(NTConfig_FreeSpaceXY[0], NTConfig_FreeSpaceXY[1])) {
  857. NT_FieldID();
  858. } // id in field add
  859. }
  860.  
  861. if (pickitem && _attackcount > 0) { NTSI_PickItems(); }
  862.  
  863. if(NTConfig_IdInField){
  864. if (!NTT_CheckSpace(NTConfig_FreeSpaceXY[0], NTConfig_FreeSpaceXY[1])) {
  865. NT_FieldID();
  866. } // id in field add
  867. }
  868.  
  869. if(NTTMGR_CheckCurse(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe, true)) {
  870. NTTMGR_VisitTown();
  871. } else if( NTTMGR_CheckSafe(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe, true)) {
  872. NTTMGR_VisitTown();
  873. }
  874. return true;
  875. }
  876.  
  877. function NTA_IsValidMonster(monster) {
  878. var _classid;
  879.  
  880. if (monster.hp <= 0 || monster.mode == 0 || monster.mode == 12) return false;
  881.  
  882. _classid = monster.classid;
  883.  
  884. if (((_classid >= 110 && _classid <= 113) || _classid == 608) && monster.mode == 8) // ignore flying scavengers
  885. return false;
  886.  
  887. if (_classid == 68 && monster.mode == 14) // ignore burrowing maggots
  888. return false;
  889.  
  890. if (_classid >= 258 && _classid <= 263 && monster.mode == 14) // ignore submerged WaterWatchers
  891. return false;
  892.  
  893. var getTeleSkill = NTC_GetSkillLevel(54);
  894.  
  895. if(getTeleSkill){
  896. if ((_classid >= 432 && _classid <= 435) || _classid == 524 || _classid == 525) // ignore breakable walls (we can tele!)
  897. return false;
  898. }
  899.  
  900. if (monster.GetState(53) || monster.GetState(96)) // Conversion, Revive
  901. return false;
  902.  
  903. 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;
  904.  
  905. if (NTConfig_SkipRegularMonsters) if (monster.spectype == 1 && me.areaid != 131) return false;
  906.  
  907. if (me.classid == NTC_CHAR_CLASS_DRUID) {
  908. if (!me.GetState(144)) NTC_CastSkill(250, NTC_HAND_RIGHT);
  909. if (!me.GetState(151)) NTC_CastSkill(235, NTC_HAND_RIGHT);
  910. if (!me.GetState(149)) NTC_CastSkill(226, NTC_HAND_RIGHT);
  911.  
  912. }
  913.  
  914. if (NTConfig_AreasToNotSkipImmunes.indexOf(me.areaid) == -1) {
  915. skippedImuneBoss = false;
  916. if (NTConfig_SkipSingle[0]) {
  917. if (NTA_GetResistance(monster, NTA_DAMAGE_PHYSICAL) > 95) {
  918. skippedImmuneBoss = true;
  919. return false;
  920. }
  921. }
  922. if (NTConfig_SkipSingle[1]) {
  923. if (NTA_GetResistance(monster, NTA_DAMAGE_MAGIC) > 95) {
  924. skippedImmuneBoss = true;
  925. return false;
  926. }
  927. }
  928. if (NTConfig_SkipSingle[2]) {
  929. if (NTA_GetResistance(monster, NTA_DAMAGE_FIRE) > 95) {
  930. skippedImmuneBoss = true;
  931. return false;
  932. }
  933. }
  934. if (NTConfig_SkipSingle[3]) {
  935. if (NTA_GetResistance(monster, NTA_DAMAGE_LIGHTNING) > 95) {
  936. skippedImmuneBoss = true;
  937. return false;
  938. }
  939. }
  940. if (NTConfig_SkipSingle[4]) {
  941. if (NTA_GetResistance(monster, NTA_DAMAGE_COLD) > 95) {
  942. skippedImmuneBoss = true;
  943. return false;
  944. }
  945. }
  946. if (NTConfig_SkipSingle[5]) {
  947. if (NTA_GetResistance(monster, NTA_DAMAGE_POISON) > 95) {
  948. skippedImmuneBoss = true;
  949. return false;
  950. }
  951. }
  952. if (NTConfig_SkipDual[0]) {
  953. if (NTA_GetResistance(monster, NTA_DAMAGE_PHYSICAL) > 95 && NTA_GetResistance(monster, NTA_DAMAGE_MAGIC) > 95) {
  954. skippedImmuneBoss = true;
  955. return false;
  956. }
  957. }
  958. if (NTConfig_SkipDual[1]) {
  959. if (NTA_GetResistance(monster, NTA_DAMAGE_PHYSICAL) > 95 && NTA_GetResistance(monster, NTA_DAMAGE_FIRE) > 95) {
  960. skippedImmuneBoss = true;
  961. return false;
  962. }
  963. }
  964. if (NTConfig_SkipDual[2]) {
  965. if (NTA_GetResistance(monster, NTA_DAMAGE_PHYSICAL) > 95 && NTA_GetResistance(monster, NTA_DAMAGE_LIGHTNING) > 95) {
  966. skippedImmuneBoss = true;
  967. return false;
  968. }
  969. }
  970. if (NTConfig_SkipDual[3]) {
  971. if (NTA_GetResistance(monster, NTA_DAMAGE_PHYSICAL) > 95 && NTA_GetResistance(monster, NTA_DAMAGE_COLD) > 95) {
  972. skippedImmuneBoss = true;
  973. return false;
  974. }
  975. }
  976. if (NTConfig_SkipDual[4]) {
  977. if (NTA_GetResistance(monster, NTA_DAMAGE_PHYSICAL) > 95 && NTA_GetResistance(monster, NTA_DAMAGE_POISON) > 95) {
  978. skippedImmuneBoss = true;
  979. return false;
  980. }
  981. }
  982. if (NTConfig_SkipDual[5]) {
  983. if (NTA_GetResistance(monster, NTA_DAMAGE_MAGIC) > 95 && NTA_GetResistance(monster, NTA_DAMAGE_FIRE) > 95) {
  984. skippedImmuneBoss = true;
  985. return false;
  986. }
  987. }
  988. if (NTConfig_SkipDual[6]) {
  989. if (NTA_GetResistance(monster, NTA_DAMAGE_MAGIC) > 95 && NTA_GetResistance(monster, NTA_DAMAGE_LIGHTNING) > 95) {
  990. skippedImmuneBoss = true;
  991. return false;
  992. }
  993. }
  994. if (NTConfig_SkipDual[7]) {
  995. if (NTA_GetResistance(monster, NTA_DAMAGE_MAGIC) > 95 && NTA_GetResistance(monster, NTA_DAMAGE_COLD) > 95) {
  996. skippedImmuneBoss = true;
  997. return false;
  998. }
  999. }
  1000. if (NTConfig_SkipDual[8]) {
  1001. if (NTA_GetResistance(monster, NTA_DAMAGE_MAGIC) > 95 && NTA_GetResistance(monster, NTA_DAMAGE_POISON) > 95) {
  1002. skippedImmuneBoss = true;
  1003. return false;
  1004. }
  1005. }
  1006. if (NTConfig_SkipDual[9]) {
  1007. if (NTA_GetResistance(monster, NTA_DAMAGE_FIRE) > 95 && NTA_GetResistance(monster, NTA_DAMAGE_LIGHTNING) > 95) {
  1008. skippedImmuneBoss = true;
  1009. return false;
  1010. }
  1011. }
  1012. if (NTConfig_SkipDual[10]) {
  1013. if (NTA_GetResistance(monster, NTA_DAMAGE_FIRE) > 95 && NTA_GetResistance(monster, NTA_DAMAGE_COLD) > 95) {
  1014. skippedImmuneBoss = true;
  1015. return false;
  1016. }
  1017. }
  1018. if (NTConfig_SkipDual[11]) {
  1019. if (NTA_GetResistance(monster, NTA_DAMAGE_FIRE) > 95 && NTA_GetResistance(monster, NTA_DAMAGE_POISON) > 95) {
  1020. skippedImmuneBoss = true;
  1021. return false;
  1022. }
  1023. }
  1024. if (NTConfig_SkipDual[12]) {
  1025. if (NTA_GetResistance(monster, NTA_DAMAGE_LIGHTNING) > 95 && NTA_GetResistance(monster, NTA_DAMAGE_COLD) > 95) {
  1026. skippedImmuneBoss = true;
  1027. return false;
  1028. }
  1029. }
  1030. if (NTConfig_SkipDual[13]) {
  1031. if (NTA_GetResistance(monster, NTA_DAMAGE_LIGHTNING) > 95 && NTA_GetResistance(monster, NTA_DAMAGE_POISON) > 95) {
  1032. skippedImmuneBoss = true;
  1033. return false;
  1034. }
  1035. }
  1036. if (NTConfig_SkipDual[14]) {
  1037. if (NTA_GetResistance(monster, NTA_DAMAGE_COLD) > 95 && NTA_GetResistance(monster, NTA_DAMAGE_POISON) > 95) {
  1038. skippedImmuneBoss = true;
  1039. return false;
  1040. }
  1041. }
  1042. }
  1043.  
  1044. if(NTConfig_AttackingThis && monster.IsAttackable()){
  1045. Print(COLOR_5 + "!" + "Attacking: " + monster.name + " - " + monster.classid);
  1046. }
  1047.  
  1048. return true;
  1049. }
  1050.  
  1051. function NTA_GetDamageType(skillid) {
  1052. if (skillid == 74 || skillid == 147 || skillid == 97) // Corpse Explosion && Frenzy && Smite
  1053. return NTA_DAMAGE_PHYSICAL;
  1054. if (skillid == 111) // Vengeance
  1055. return NTA_DAMAGE_NONE;
  1056. if (me.classid == NTC_CHAR_CLASS_PALADIN && (NTConfig_AttackSkill[1] == 112 && NTConfig_AttackSkill[5] > -1)) {
  1057. if (skillid == 101) //holy bolt
  1058. return NTA_DAMAGE_NONE;
  1059. } else {
  1060. if (skillid == 112) // Blessed Hammer
  1061. return NTA_DAMAGE_NONE;
  1062. }
  1063.  
  1064. switch (GetBaseStat("skills.txt", skillid, 233)) {
  1065. case "cold":
  1066. return NTA_DAMAGE_COLD;
  1067. case "fire":
  1068. return NTA_DAMAGE_FIRE;
  1069. case "ltng":
  1070. return NTA_DAMAGE_LIGHTNING;
  1071. case "mag":
  1072. return NTA_DAMAGE_MAGIC;
  1073. case "pois":
  1074. return NTA_DAMAGE_POISON;
  1075. case "stun":
  1076. return NTA_DAMAGE_NONE;
  1077. default:
  1078. if (GetBaseStat("skills.txt", skillid, 178) || GetBaseStat("skills.txt", skillid, 182)) // aura or passive
  1079. return NTA_DAMAGE_NONE;
  1080. }
  1081.  
  1082. return NTA_DAMAGE_PHYSICAL;
  1083. }
  1084.  
  1085. function NTA_GetResistance(enemy, type) {
  1086. switch (type) {
  1087. case NTA_DAMAGE_PHYSICAL:
  1088. return enemy.GetStat(36);
  1089. case NTA_DAMAGE_MAGIC:
  1090. return enemy.GetStat(37);
  1091. case NTA_DAMAGE_FIRE:
  1092. return enemy.GetStat(39);
  1093. case NTA_DAMAGE_LIGHTNING:
  1094. return enemy.GetStat(41);
  1095. case NTA_DAMAGE_COLD:
  1096. return enemy.GetStat(43);
  1097. case NTA_DAMAGE_POISON:
  1098. return enemy.GetStat(45);
  1099. }
  1100. return 0;
  1101. }
  1102.  
  1103. function NTA_GetAttackType(target, startIndex, resistMaxPrimary, resistMaxSecondary, resistMaxTertiary) {
  1104.  
  1105. var _currIndex;
  1106. var _holdMinResist = [999, startIndex];
  1107. var _resistArray = [999, 999, 999];
  1108. var _holdResistMax = [resistMaxPrimary, resistMaxSecondary, resistMaxTertiary];
  1109. var i;
  1110.  
  1111. for (i = 0, _currIndex = startIndex; i < 3; i++, _currIndex += 2) {
  1112. if (NTConfig_AttackSkill[_currIndex] > -1) {
  1113. _resistArray[i] = NTA_GetResistance(target, _NTA_SkillDamage[_currIndex]);
  1114. if(_resistArray[i] < 100) {
  1115. switch(_NTA_SkillDamage[_currIndex])
  1116. {
  1117. case NTA_DAMAGE_PHYSICAL:
  1118. _resistArray[i] = target.GetStat(36);
  1119. break;
  1120. case NTA_DAMAGE_MAGIC:
  1121. _resistArray[i] = target.GetStat(37) - me.GetStat(358);
  1122. break;
  1123. case NTA_DAMAGE_FIRE:
  1124. _resistArray[i] = target.GetStat(39) - me.GetStat(333);
  1125. break;
  1126. case NTA_DAMAGE_LIGHTNING:
  1127. _resistArray[i] = target.GetStat(41) - me.GetStat(334);
  1128. break;
  1129. case NTA_DAMAGE_COLD:
  1130. _resistArray[i] = target.GetStat(43) - me.GetStat(335);
  1131. break;
  1132. case NTA_DAMAGE_POISON:
  1133. _resistArray[i] = target.GetStat(45) - me.GetStat(336);
  1134. break;
  1135. }
  1136.  
  1137. if(_resistArray[i] < -100)
  1138. _resistArray[i] = -100;
  1139. }
  1140. if (_resistArray[i] < _holdResistMax[i]) // Return index if attack is < our max resist requirement
  1141. return _currIndex;
  1142. }
  1143.  
  1144. if (_resistArray[i] < _holdMinResist[0]) { // Store lowest resist attack
  1145. _holdMinResist[0] = _resistArray[i];
  1146. _holdMinResist[1] = _currIndex;
  1147. }
  1148.  
  1149. if (_currIndex == 1 || _currIndex == 2) // Skip non boss primary if boss attack
  1150. _currIndex += 2;
  1151. }
  1152.  
  1153.  
  1154. if (_holdMinResist[0] >= 100) // Every attack is immune
  1155. return startIndex;
  1156. else // At this point all available skills are greater than given max resist settings. Use lowest resist skill.
  1157. return _holdMinResist[1];
  1158. }
  1159.  
  1160. function NTA_HighMaxAttackAreas() {
  1161.  
  1162. var _presentarea = me.areaid
  1163.  
  1164. for (var i = 0; i < NTConfig_HighMaxAttackAreas.length; i++) {
  1165. if (_presentarea == NTConfig_HighMaxAttackAreas[i]) {
  1166. return true;
  1167. }
  1168. }
  1169. return false;
  1170. }
  1171.  
  1172. function NTA_CheckMercInfinity() {
  1173. var _weapon, _merc;
  1174. var Merc_HaveInfinty = false;
  1175. _merc = NTC_GetMerc();
  1176. if (!_merc) {
  1177. if (DebugAttacksInGame) {
  1178. Print(COLOR_8 + "merc is dead or not hired");
  1179. }
  1180. return false;
  1181. }
  1182. if (_merc && _merc.hp > 0 && _merc.mode != 0 && _merc.mode != 12) {
  1183. _weapon = _merc.GetItems();
  1184. if (_weapon) {
  1185. for (var i = 0; i < _weapon.length && !Merc_HaveInfinty; i++) {
  1186. if ((_weapon[i].itemflag & 0x4000000) && _weapon[i].itemprefix == 20566) {
  1187. Merc_HaveInfinty = true;
  1188. if (DebugAttacksInGame) {
  1189. Print(COLOR_8 + "merc has infinity");
  1190. }
  1191. return true;
  1192. }
  1193. }
  1194. }
  1195. }
  1196. if (!Merc_HaveInfinty) {
  1197. if (DebugAttacksInGame) {
  1198. Print(COLOR_8 + "merc has no infinity");
  1199. }
  1200. return false;
  1201. }
  1202. }
  1203.  
  1204. function NTA_CheckMyHp() {
  1205. _LifeMax = me.hpmax;
  1206. _ManaMax = me.mpmax;
  1207.  
  1208. if (NTConfig_DanceStartHp > 0 || NTConfig_DanceStartMp > 0) {
  1209. if (parseInt(me.hp * 100 / _LifeMax) < NTConfig_DanceStartHp || parseInt(me.mp * 100 / _ManaMax) < NTConfig_DanceStartMp){
  1210. return true;
  1211. }
  1212. } else {
  1213. return false;
  1214. }
  1215. }
  1216.  
  1217. function NTA_Bounce(target,damType) {
  1218. if(!NTA_CheckMyHp()){
  1219. if(NTA_GetResistance(target, _NTA_SkillDamage[damType]) >= 95){ // want to add another condition for this so it will only check if you are one attack short of a jump
  1220. //Print("Monster is immune if no monsters close not going to jump");
  1221. if(!NTA_CheckForCloseMonsters(10, target)){ // ^^^^actaully don't want to make this light only
  1222. _sorcattack = 0; // make all this config options resist amount before staying stationary, the # of monsters EVERYTHING
  1223. return;
  1224. }
  1225. }
  1226. }
  1227. //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);
  1228. if (me.x - target.x >= 0 && me.y - target.y >= 0) {
  1229. TD_Deploy(target.x - NTConfig_BounceRange, target.y - NTConfig_BounceRange, 5, 5);
  1230. }
  1231.  
  1232. //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);
  1233. else if (me.x - target.x >= 0 && me.y - target.y < 0) {
  1234. TD_Deploy(target.x - NTConfig_BounceRange, target.y + NTConfig_BounceRange, 5, 5);
  1235. }
  1236. //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);
  1237. else if (me.x - target.x < 0 && me.y - target.y >= 0) {
  1238. TD_Deploy(target.x + NTConfig_BounceRange, target.y + NTConfig_BounceRange, 5, 5);
  1239. }
  1240. //else NTC_CastSkill(54, NTC_HAND_RIGHT, target.x + NTConfig_BounceRange, target.y - NTConfig_BounceRange);
  1241. else {
  1242. TD_Deploy(target.x + NTConfig_BounceRange, target.y - NTConfig_BounceRange, 5, 5);
  1243. }
  1244. _sorcattack = 0;
  1245. }
  1246.  
  1247. function NTA_ClearPos(repeat, range, delay, backxy) {
  1248. var presx = me.x;
  1249. var presy = me.y;
  1250. if (arguments.length < 4) backxy = false;
  1251. if (arguments.length < 3) delay = 0;
  1252. if (arguments.length < 2) range = 25;
  1253. if (arguments.length < 1) repeat = 2;
  1254. if (DebugAttacksInGame) {
  1255. Print(COLOR_17 + "delay= " + delay + ", range =" + range + ", repeat =" + repeat);
  1256. }
  1257. for (var k = 0; k < repeat; k++) {
  1258. NTA_ClearPosition(range);
  1259. if (backxy) NTM_MoveTo(108, presx, presy, 3, false, false);
  1260. Delay(delay);
  1261. if (DebugAttacksInGame) {
  1262. Print(COLOR_8 + "Loop" + "[" + k + "]");
  1263. }
  1264. }
  1265. }
  1266.  
  1267. function NTA_CheckForCloseMonsters(range, target) {
  1268. if (range < 1 || arguments.length < 1) return false;
  1269.  
  1270. var _monstersClose = false;
  1271. var _checkMonster = NTC_FindUnit(NTC_UNIT_MONSTER);
  1272.  
  1273. if (_checkMonster) {
  1274. do {
  1275. if(arguments.length > 1 && target == _checkMonster){
  1276. continue;
  1277. }
  1278. if (_checkMonster.IsAttackable() && GetDistance(me.x, me.y, _checkMonster.x, _checkMonster.y) < range && NTA_IsValidMonster(_checkMonster)) {
  1279. _monstersClose = true;
  1280. break;
  1281. }
  1282. } while (_checkMonster.GetNext());
  1283. }
  1284. return _monstersClose;
  1285. }
  1286.  
  1287. function NT_FieldID() {
  1288. var result;
  1289. var resultArray = new Array();
  1290. var i, location, tome, scroll, length,
  1291. items = NTT_GetUnidItems();
  1292.  
  1293. if(!items || items.length < 1){
  1294. NTT_ClearInventory();
  1295. return false;
  1296. }
  1297.  
  1298. tome = NTT_GetTome();
  1299.  
  1300. if (!tome || tome.GetStat(70) < items.length) { // no tome or not enough scrolls in it
  1301. return false;
  1302. }
  1303. for (i = 0; i < items.length; i++) {
  1304. if(NTSI_CheckItem(items[i])[0] == -1){
  1305. SetUIState(0x01, true);
  1306. break;
  1307. }
  1308. }
  1309. length = items.length;
  1310. for (i = 0; i < length; i = i + 1) {
  1311. switch (NTSI_CheckItem(items[i])[0]) {
  1312. case -1:
  1313. if (tome) {
  1314. NTT_IdItem(tome, items[i]);
  1315. }
  1316.  
  1317. break;
  1318. }
  1319. }
  1320. _location = GetArea();
  1321. for (i = length - 1; i > -1; i = i - 1) {
  1322. // item logger stuff here - location and ethereal
  1323. resultArray = NTSI_CheckItem(items[i]);
  1324. result = resultArray[0];
  1325. switch (result) {
  1326. case 1:
  1327. if(items[i].itemflag & 0x10){
  1328. 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.name+ "\n" + COLOR_2 +resultArray[1]+", "+resultArray[2]);
  1329. }
  1330. case 2:
  1331. break;
  1332. default:
  1333. if(NTConfig_LogSoldItemQuality != 0 && items[i].quality >= NTConfig_LogSoldItemQuality) {
  1334. 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.name);
  1335. }
  1336. if(NTConfig_AnnounceDroppedItems){
  1337. Print(COLOR_5 + NTC_RandomSelect(NTConfig_dropMessages) + NTC_ItemQualityToName[items[i].quality] + " " + items[i].name.split("\n")[0]);
  1338. Delay(100);
  1339. }
  1340. NTT_DropItem(items[i]);
  1341. break;
  1342. }
  1343. }
  1344. NTT_ClearInventory();
  1345. me.Cancel(1);
  1346. return true;
  1347. }
  1348.  
  1349. function TD_Deploy(x, y, blocksize, range){
  1350. var _minimum = 999;
  1351. var _coords = new Array(2);
  1352. var c, dx, dy;
  1353. var _monster;
  1354.  
  1355. for(dx = -2 ; dx < 3 ; dx++){
  1356. for(dy = -2 ; dy < 3 ; dy++){
  1357. c = 0;
  1358.  
  1359. _monster = NTC_FindUnit(NTC_UNIT_MONSTER);
  1360. if(!_monster){
  1361. if (DebugAttacksInGame) {
  1362. Print("No monsters around");
  1363. }
  1364. return NTM_MoveTo(me.areaid, x, y);
  1365. }
  1366.  
  1367. do{
  1368. if(GetDistance(_monster.x, _monster.y, parseInt(x + dx*blocksize), parseInt(y + dy*blocksize)) <= range){
  1369. if(!CheckCollision(me.areaid, parseInt(x + dx*blocksize), parseInt(y + dy*blocksize), 0) ||
  1370. !CheckCollision(me.areaid, parseInt(x + dx*blocksize), parseInt(y + dy*blocksize), 4) ||
  1371. !CheckCollision(me.areaid, parseInt(x + dx*blocksize), parseInt(y + dy*blocksize), 5))
  1372. c = 9999;
  1373.  
  1374. if(_monster.hp > 0)
  1375. c++;
  1376. }
  1377. }while(_monster.GetNext());
  1378.  
  1379. if(dx == 0 && dy == 0 && c == 0){ //center position correction
  1380. _minimum = 0;
  1381. _coords = [parseInt(x + dx*blocksize), parseInt(y + dy*blocksize)];
  1382. }
  1383.  
  1384. if(c < _minimum){
  1385. _minimum = c;
  1386. _coords = [parseInt(x + dx*blocksize), parseInt(y + dy*blocksize)];
  1387. }
  1388. }
  1389. }
  1390. if (DebugAttacksInGame) {
  1391. Print("Safest position: " + parseInt((_coords[0] - x)) + ", " + parseInt((_coords[1] - y)) + ". Monsters: " + _minimum);
  1392. }
  1393.  
  1394. return NTM_MoveTo(me.areaid, _coords[0], _coords[1]);
  1395. }
  1396.  
  1397. function NTA_RangedNormal() {
  1398. var _weapon;
  1399. var _range;
  1400.  
  1401. _weapon = me.GetItems();
  1402.  
  1403. if (_weapon) {
  1404. for (var i = 0; i < _weapon.length; i++) {
  1405. if(_range){
  1406. break;
  1407. }
  1408. if (_weapon[i].mode == 1 && (_weapon[i].itemloc == 4 || _weapon[i].itemloc == 5)) {
  1409. switch (_weapon[i].classid) {
  1410. //Bows
  1411. case 68:
  1412. //Short Bow
  1413. case 69:
  1414. //Hunter's Bow
  1415. case 70:
  1416. //Longbow
  1417. case 71:
  1418. //Composite Bow
  1419. case 72:
  1420. //Short Battle Bow
  1421. case 73:
  1422. //Long Battle Bow
  1423. case 74:
  1424. //short war bow
  1425. case 75:
  1426. //Long War Bow
  1427. case 161:
  1428. //Edge Bow
  1429. case 162:
  1430. //Razor Bow
  1431. case 163:
  1432. //Cedar Bow
  1433. case 164:
  1434. //Double Bow
  1435. case 165:
  1436. //Short Siege Bow
  1437. case 166:
  1438. //Large Siege Bow
  1439. case 167:
  1440. //Rune Bow
  1441. case 168:
  1442. //Gothic Bow
  1443. case 264:
  1444. //Spider Bow
  1445. case 265:
  1446. //Blade Bow
  1447. case 266:
  1448. //Shadow Bow
  1449. case 267:
  1450. //Great Bow
  1451. case 268:
  1452. //Diamond Bow
  1453. case 269:
  1454. //Crusader Bow
  1455. case 270:
  1456. //Ward Bow
  1457. case 271:
  1458. //Hydra Bow
  1459. case 281:
  1460. //Stag Bow
  1461. case 282:
  1462. //Reflex Bow
  1463. case 291:
  1464. //Ashwood Bow
  1465. case 292:
  1466. //Cermonial Bow
  1467. case 301:
  1468. //Matriarchal Bow
  1469. case 302:
  1470. //Grand Matron Bow
  1471. //CrossBows
  1472. case 76:
  1473. //Light Crossbow
  1474. case 77:
  1475. //Crossbow
  1476. case 78:
  1477. //Heavy Crossbow
  1478. case 79:
  1479. //Repeating Crossbow
  1480. case 169:
  1481. //Arbalest
  1482. case 170:
  1483. //Siege Crossbow
  1484. case 171:
  1485. //Ballista
  1486. case 172:
  1487. //Chu-Ko-Nu
  1488. case 272:
  1489. //Pellet Bow
  1490. case 273:
  1491. //Gorgon Crossbow
  1492. case 274:
  1493. //Colossus Crossbow
  1494. case 275:
  1495. //Demon Crossbow
  1496. _range = true;
  1497. break;
  1498.  
  1499. default:
  1500.  
  1501. _range = false;
  1502. break;
  1503. }
  1504. }
  1505. }
  1506. }
  1507. if (_range) {
  1508. return true;
  1509. }
  1510. else {
  1511. return false;
  1512. }
  1513. }
  1514.  
  1515. function NTA_HaveArrows() {
  1516. var _weapon;
  1517. var _haveAmmo = false;
  1518. _weapon = me.GetItems();
  1519.  
  1520. if (_weapon) {
  1521. for (var i = 0; i < _weapon.length; i++) {
  1522. if ((_weapon[i].classid == 526 || _weapon[i].classid == 528) && (_weapon[i].itemloc == 4 || _weapon[i].itemloc == 5)) {
  1523. if (_weapon[i].GetStat(70) < 10) {
  1524. Print(COLOR_8 + "I'm low on " + _weapon[i].name + ", I am going to town to buy more.")
  1525. NTTMGR_VisitTown(true);
  1526. }
  1527. _haveAmmo = true;
  1528. break;
  1529. }
  1530. }
  1531. }
  1532.  
  1533. if (!_haveAmmo) {
  1534. Print(COLOR_8 + "I have no ammo, I am going to town to buy some.")
  1535. NTTMGR_VisitTown(true);
  1536. }
  1537. }
Add Comment
Please, Sign In to add comment