1. // D2NT Cow script
  2. // Version 1.4.1
  3. //--- CONFIG ---
  4. const _NTR_FAIL_CHECKS = 4; // Number of failed teleports before script ends. Ex. Edge of map causes a fail teleport. DEFAULT: 25
  5. const _NTR_PRE_EVERY = 25; // Number of seconds before precasting again. -1 for never. DEFAULT: 40
  6. const _NTR_CHEST_AND_ROCKS = true; // Open chest and rocks. DEFAULT: true
  7. //--- END ---
  8.  
  9. const _NTR_STRING_PORTAL = GetLocaleString(3226);
  10.  
  11. function NTMain()
  12. {
  13. Include("libs/common/NTCommon.ntl");
  14. NTC_IncludeLibs();
  15. NTC_IncludeConfig("NTBot/char_configs");
  16. NT_LoadConfig();
  17. NTSI_LoadNIPFiles("NTBot/item_configs");
  18. NTA_Initialize();
  19. if(!NTTM_CheckAct())
  20. {
  21. NTC_SendMsgToScript("NTBotGame.ntj", "NTTM_CheckAct()");
  22. return;
  23. }
  24. NTTMGR_TownManager();
  25.  
  26. var _wirtbody, _cube, _leg, _portal, _stash, _items, i, _npc, prearea;
  27.  
  28. for (i = 0; i < 10; i++)
  29. {
  30. _leg = NTC_FindUnit(NTC_UNIT_ITEM, 88);
  31. if (_leg)
  32. break;
  33. }
  34. if (!_leg)
  35. {
  36. if(!NTTM_TownMove("waypoint"))
  37. {
  38. NTC_SendMsgToScript("NTBotGame.ntj", "NTTM_TownMove()");
  39. return;
  40. }
  41. if(!NTM_TakeWaypoint(4))
  42. {
  43. NTC_SendMsgToScript("NTBotGame.ntj", "NTM_TakeWaypoint()");
  44. return;
  45. }
  46. NTP_DoPrecast(true);
  47. if(!NTM_MoveToPresetUnit(me.areaid, NTC_UNIT_MONSTER, 737, 10, 10))
  48. {
  49. NTC_SendMsgToScript("NTBotGame.ntj", "NTM_MoveToPresetUnit()");
  50. return;
  51. }
  52. if(NTConfig_KillRakanishuCows)
  53. {
  54. if(!NTTMGR_CheckSafe(0x00, NTConfig_CheckMercSafe&0x01))
  55. {
  56. NTC_SendMsgToScript("NTBotGame.ntj", "NTTMGR_CheckSafe()");
  57. return;
  58. }
  59. if(NTA_KillMonster(GetLocaleString(2872)))
  60. {
  61. if(NTConfig_ClearPosition)
  62. NTA_ClearPosition();
  63. NTSI_PickItems();
  64. }
  65. }
  66. if(!NTM_UsePortal("Portal", 38))
  67. {
  68. NTC_SendMsgToScript("NTBotGame.ntj", "NTM_UsePortal()");
  69. return;
  70. }
  71. if(NTConfig_TristExtension)
  72. {
  73. if(!NTA_ClearLevel())
  74. {
  75. NTC_SendMsgToScript("NTBotGame.ntj", "NTA_ClearLevel()");
  76. }
  77. }
  78. NTM_MoveTo(me.areaid, 25047, 5178);
  79. if(NTA_ClearPosition(10))
  80. NTSI_PickItems();
  81. _wirtbody = NTC_FindUnit(NTC_UNIT_OBJECT, 268);
  82. if(!_wirtbody)
  83. {
  84. NTC_SendMsgToScript("NTBotGame.ntj", "Wirt's body not found.");
  85. return;
  86. }
  87. if(NTM_MoveTo(_wirtbody.areaid, _wirtbody.x+3, _wirtbody.y))
  88. {
  89. if(NTC_OpenChest(_wirtbody))
  90. {
  91. NTC_PingDelay(500);
  92. for (i = 0; i < 10; i++)
  93. {
  94. _leg = NTC_FindUnit(NTC_UNIT_ITEM, 88);
  95. if (_leg)
  96. break;
  97. }
  98. if(!NTT_CheckSpace(_leg.xsize, _leg.ysize))
  99. {
  100. _prearea = me.areaid;
  101. if(NTTM_CheckAct())
  102. {
  103. NTTMGR_TownManager(true);
  104. NTTM_TownMove("portalspot")
  105. NTM_UsePortal("BluePortal", _prearea)
  106. }
  107. }
  108. for (i = 0; i < 20; i++)
  109. {
  110. if ((i % 5) == 0)
  111. {
  112. if (_leg.mode == 3 || _leg.mode == 5)
  113. {
  114. if (NTC_ClearCursor())
  115. NTC_DoClick(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, _leg);
  116. }
  117. }
  118. NTC_PingDelay(100);
  119. if (_leg.mode != 3 && _leg.mode != 5)
  120. {
  121. Print("ÿc4Got Leg");
  122. NTC_PingDelay(200);
  123. break;
  124. }
  125. }
  126. }
  127. }
  128. if(!_leg)
  129. {
  130. NTC_SendMsgToScript("NTBotGame.ntj", "No leg found.");
  131. return;
  132. }
  133. NTM_MakeTP();
  134. NTM_UsePortal("BluePortal");
  135. }
  136. else
  137. {
  138. if(!NTT_CheckSpace(_leg.xsize, _leg.ysize))
  139. {
  140. _prearea = me.areaid;
  141. if(NTTM_CheckAct())
  142. {
  143. NTTMGR_TownManager(true);
  144. NTTM_TownMove("portalspot")
  145. NTM_UsePortal("BluePortal", _prearea)
  146. }
  147. }
  148. for (i = 0; i < 20; i++)
  149. {
  150. if ((i % 5) == 0)
  151. {
  152. if (_leg.mode == 3 || _leg.mode == 5)
  153. {
  154. if (NTC_ClearCursor())
  155. NTC_DoClick(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, _leg);
  156. }
  157. }
  158. NTC_PingDelay(100);
  159. if (_leg.mode != 3 && _leg.mode != 5)
  160. {
  161. Print("ÿc4Who caries a leg around?");
  162. NTC_PingDelay(200);
  163. Print("ÿc4Dude, thats sick.");
  164. break;
  165. }
  166. }
  167. }
  168. NTTM_TownMove("akara");
  169. for(var i = 0 ; i < 10 ; i++)
  170. {
  171. _npc = NTC_FindUnit(NTC_UNIT_NPC, NTC_NPC_ID_AKARA);
  172. if(_npc)
  173. break;
  174. }
  175. if(_npc)
  176. {
  177. if(NTT_DoInteract(_npc))
  178. {
  179. if(NTT_DoTrade(_npc))
  180. {
  181. _NTR_DoID = NTT_CheckUnids();
  182. if(_NTR_DoID)
  183. NTTMGR_IDItems(_npc);
  184. NTT_FillTome(_npc, 1);
  185. NTT_FillTome(_npc, 0);
  186. NTT_SecondTomeTP(_npc, "tbk", 1);
  187. _portal = NTR_GetTP();
  188. if(!_portal)
  189. {
  190. NTC_SendMsgToScript("NTBotGame.ntj", "No extra tome of townportal found.");
  191. return;
  192. }
  193. }
  194. }
  195. me.Cancel(1);
  196. }
  197. NTTM_TownMove("stash");
  198. for(var i = 0 ; i < 10 ; i++)
  199. {
  200. _stash = NTC_FindUnit(NTC_UNIT_OBJECT, NTC_UNIT_STASH);
  201. if(_stash)
  202. break;
  203. }
  204. if(NTT_DoInteract(_stash))
  205. {
  206. _items = me.GetItems(NTC_UNIT_CUBE);
  207. _cube = _items[0];
  208. if(!_cube)
  209. {
  210. NTC_SendMsgToScript("NTBotGame.ntj", "No cube found.");
  211. return;
  212. }
  213. if(NTCU_CheckCubeInventoryInt() > 0)
  214. {
  215. NTCU_OpenCubeInt(_cube)
  216. if(NTCU_ClearCubeInt() < 1)
  217. {
  218. NTC_SendMsgToScript("NTBotGame.ntj", "Cube cannot be emptied.");
  219. return;
  220. }
  221. NTCU_CloseCubeInt();
  222. }
  223. NTCU_MoveItemToCubeInt(_cube,_leg)
  224. NTCU_MoveItemToCubeInt(_cube,_portal)
  225. NTCU_OpenCubeInt(_cube);
  226. Transmute();
  227. NTCU_CloseCubeInt();
  228. me.Cancel(1);
  229. }
  230. NTC_PingDelay(500);
  231. if(!NTR_TakeCowPortal(18))
  232. {
  233. NTC_SendMsgToScript("NTBotGame.ntj", "Failed to take Cow Portal.");
  234. return;
  235. }
  236. NTP_DoPrecast();
  237. NTR_ClearRooms();
  238. NTC_SendMsgToScript("NTBotGame.ntj", "SCRIPT_END");
  239. }
  240.  
  241. // Internal functions
  242. function NTR_GetTP()
  243. {
  244. var _portals = me.GetItems("tbk");
  245.  
  246. if (_portals)
  247. {
  248. for (var i = 0; i < _portals.length; i++)
  249. {
  250. if (_portals[i].mode == 0 && (_portals[i].itemloc != 0 || NTConfig_Columns[_portals[i].y][_portals[i].x] > 0))
  251. {
  252. return _portals[i];
  253. }
  254. }
  255. }
  256. return false;
  257. }
  258. function abs(integer)
  259. {
  260. if(integer < 0){
  261. integer = -integer;
  262. }
  263. return integer;
  264. }
  265. function NTR_TakeCowPortal(range)
  266. {
  267. var _portal = NTC_FindUnit(NTC_UNIT_OBJECT, _NTR_STRING_PORTAL);
  268.  
  269. if (_portal)
  270. {
  271. var _isClick;
  272. var _preAreaId = me.areaid;
  273. do
  274. {
  275. if (GetDistance(me, _portal) < range && _portal.mode == 2)
  276. {
  277. for (var i = 0; i < 40; i++)
  278. {
  279. if ((i % 10) == 0)
  280. {
  281. if(NTM_GetCloserInt(_portal))
  282. _isClick = NTC_DoClick(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, _portal);
  283. }
  284. if (_isClick)
  285. {
  286. NTC_Delay(200);
  287. break;
  288. }
  289. }
  290. NTC_PingDelay(1000);
  291. var j = 0;
  292. var check = true;
  293. do
  294. {
  295. if (me.areaid != _preAreaId)
  296. {
  297. NTC_PingDelay(500);
  298. return true;
  299. check = false;
  300. }
  301. j++;
  302. } while(j < 40 && check == true);
  303. }
  304. } while (_portal.GetNext());
  305. }
  306. return false;
  307. }
  308. function NTR_ClearPosition(range, pickitem, safelevel, failed)
  309. {
  310. var _orgx, _orgy;
  311. var _spectype = [0x0A, 0x01, 0x01];
  312. var _skiplist;
  313. var _attackcount = 0;
  314. var _target;
  315. var _distance, _mingid, _mindistance;
  316. var _result;
  317. var _cowKing;
  318. var _test;
  319.  
  320. if(NTConfig_AttackSkill[1] < 1 || NTConfig_AttackSkill[3] < 1)
  321. return false;
  322.  
  323. switch(arguments.length)
  324. {
  325. case 0:
  326. range = 20;
  327. case 1:
  328. pickitem = false;
  329. case 2:
  330. safelevel = 0;
  331. default:
  332. if(NTConfig_CheckSelfSafe < 0x01 && NTConfig_CheckMercSafe < 0x01)
  333. safelevel = 0;
  334. break;
  335. }
  336.  
  337. _orgx = me.x;
  338. _orgy = me.y;
  339.  
  340. for(var i = 0 ; i < _spectype.length ; i++)
  341. {
  342. _skiplist = new Array();
  343. while(_attackcount < (i+1)*100)
  344. {
  345. _mindistance = 100000;
  346. _target = NTC_FindUnit(NTC_UNIT_MONSTER);
  347. if(_target)
  348. {
  349. do
  350. {
  351. if(_skiplist.indexOf(_target.gid) < 0)
  352. {
  353. if(_target.IsAttackable() && (_target.spectype&_spectype[i]))
  354. {
  355. if(GetDistance(_orgx, _orgy, _target.x, _target.y) <= range && NTA_IsValidMonster(_target))
  356. {
  357. _distance = GetDistance(me, _target);
  358.  
  359. if(_distance < _mindistance)
  360. {
  361. _mingid = _target.gid;
  362. _mindistance = _distance;
  363. }
  364. }
  365. }
  366. else
  367. _skiplist.push(_target.gid);
  368. }
  369. } while(_target.GetNext());
  370. }
  371. if(_mindistance < 100000)
  372. {
  373. _target = NTC_FindUnit(NTC_UNIT_MONSTER, _mingid);
  374.  
  375. if(_target)
  376. {
  377. _cowKing = GetUnit(NTC_UNIT_MONSTER, GetLocaleString(2850));
  378. if(_cowKing){
  379. return true;
  380. }
  381. _result = NTA_Attack(_target, (_attackcount%30) == 0);
  382.  
  383. switch(_result)
  384. {
  385. case 1:
  386. _skiplist.push(_mingid);
  387. break;
  388. case 2:
  389. case 3:
  390. _attackcount++;
  391. break;
  392. default:
  393. return false;
  394. }
  395. }
  396. }
  397. else
  398. break;
  399. }
  400. }
  401. if(me.classid == NTC_CHAR_CLASS_PALADIN)
  402. {
  403. if(_attackcount > 2 && (parseInt(me.hp*100/me.hpmax) < NTConfig_UseRedemptionHP || parseInt(me.mp*100/me.mpmax) < NTConfig_UseRedemptionMP))
  404. {
  405. if(NTC_PutSkill(124, NTC_HAND_RIGHT))
  406. NTC_PingDelay(1000);
  407. }
  408. }
  409. _cowKing = GetUnit(NTC_UNIT_MONSTER, GetLocaleString(2850));
  410. if(_cowKing){
  411. return true;
  412. }
  413. if(_NTR_CHEST_AND_ROCKS && failed == false)
  414. {
  415. _target = NTR_GetChest();
  416. if(_target){
  417. do
  418. {
  419. if(_target && GetDistance(_orgx, _orgy, _target.x, _target.y) <= range)
  420. {
  421. if(NTC_OpenChest(_target))
  422. NTSI_PickItems();
  423.  
  424. }
  425. }while(_target.GetNext());
  426. }
  427. _target = NTR_GetObj(174);
  428. if(_target){
  429. do
  430. {
  431. if(_target && GetDistance(_orgx, _orgy, _target.x, _target.y) <= range)
  432. {
  433. if(NTM_MoveTo(me.areaid, _target.x, _target.y))
  434. {
  435. if(NTC_DoClick(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, _target))
  436. {
  437. Delay(200);
  438. NTSI_PickItems();
  439. }
  440. }
  441. }
  442. }while(_target.GetNext());
  443. }
  444. _target = NTR_GetObj(175);
  445. if(_target){
  446. do
  447. {
  448. if(_target && GetDistance(_orgx, _orgy, _target.x, _target.y) <= range)
  449. {
  450. if(NTM_MoveTo(me.areaid, _target.x, _target.y))
  451. {
  452. if(NTC_DoClick(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, _target))
  453. {
  454. Delay(200);
  455. NTSI_PickItems();
  456. }
  457. }
  458. }
  459. }while(_target.GetNext());
  460. }
  461. _target = NTR_GetObj(159);
  462. if(_target){
  463. do
  464. {
  465. if(_target && GetDistance(_orgx, _orgy, _target.x, _target.y) <= range)
  466. {
  467. if(NTM_MoveTo(me.areaid, _target.x, _target.y))
  468. {
  469. if(NTC_DoClick(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, _target))
  470. {
  471. Delay(200);
  472. NTSI_PickItems();
  473. }
  474. }
  475. }
  476. }while(_target.GetNext());
  477. }
  478. _target = NTR_GetObj(155);
  479. if(_target){
  480. do
  481. {
  482. if(_target && GetDistance(_orgx, _orgy, _target.x, _target.y) <= range)
  483. {
  484. if(NTM_MoveTo(me.areaid, _target.x, _target.y))
  485. {
  486. if(NTC_DoClick(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, _target))
  487. {
  488. Delay(200);
  489. NTSI_PickItems();
  490. }
  491. }
  492. }
  493. }while(_target.GetNext());
  494. }
  495. }
  496. if(pickitem && _attackcount > 0)
  497. NTSI_PickItems();
  498. switch(safelevel)
  499. {
  500. case 1:
  501. return NTTMGR_CheckSafe(0x00, NTConfig_CheckMercSafe&0x01);
  502. case 2:
  503. return NTTMGR_CheckSafe(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe);
  504. }
  505. return true;
  506. }
  507. function NTR_ClearRooms()
  508. {
  509. var failcount = 0, precount = 0, x, y, offx = 0, offy = 0, goalx = 0, goaly = 0, cowoffx = 0, cowoffy = 0;
  510. var toggle = true;
  511. var _cowKing;
  512. var _faillast;
  513.  
  514. x = me.x;
  515. y = me.y;
  516.  
  517. //NTC_PingDelay(5000);
  518. while (failcount <= _NTR_FAIL_CHECKS)
  519. {
  520. if(toggle == true && offx == goalx){
  521. if(goaly < 0){
  522. goaly=(0-(goaly-20));
  523. }else{
  524. goaly=(0-(goaly+20));
  525. }
  526. toggle = false;
  527. }
  528. if(toggle == false && offy == goaly){
  529. if(goaly < 0){
  530. goalx=(0-(goalx-20));
  531. }else{
  532. goalx=(0-(goalx+20));
  533. }
  534. toggle = true;
  535. }
  536. if(offy > goaly){
  537. offy-=20;
  538. y-=20;
  539. }
  540. if(offy < goaly){
  541. offy+=20;
  542. y+=20;
  543. }
  544. if(offx < goalx){
  545. offx+=20;
  546. x+=20;
  547. }
  548. if(offx > goalx){
  549. offx-=20;
  550. x-=20;
  551. }
  552. _cowKing = GetUnit(NTC_UNIT_MONSTER, GetLocaleString(2850));
  553. if(!_cowKing){
  554. NTR_ClearPosition(20, true, 0, _faillast);
  555. if(((GetTickCount()-precount)/1000) >= _NTR_PRE_EVERY && _NTR_PRE_EVERY >= 0){
  556. NTP_DoPrecast();
  557. precount = GetTickCount();
  558. }
  559. }
  560. if(!NTM_MoveTo(me.areaid, x, y)){
  561. failcount++;
  562. _faillast = true;
  563. }else{
  564. _faillast = false;
  565. }
  566. }
  567. return true;
  568. }
  569. function NTT_SecondTomeTP(npc, type, amount)
  570. {
  571. var _items;
  572. var _counter = 0;
  573.  
  574. if(arguments.length < 1)
  575. return false;
  576.  
  577. if(arguments.length < 2)
  578. type = 0;
  579.  
  580. if(arguments.length < 0)
  581. amount = 1;
  582.  
  583. if(amount == 0)
  584. return false;
  585.  
  586. if(type)
  587. _items = npc.GetItems("tbk");
  588.  
  589. if(_items)
  590. {
  591. if(_items.length > 0)
  592. {
  593. for(var i = 0 ; i < amount ; i++)
  594. {
  595. if(NTT_ShopItem(_items[0], npc, 2))
  596. _counter++;
  597. }
  598. }
  599. }
  600. return (_counter > 0);
  601. }
  602. function NTR_GetChest()
  603. {
  604. var _chest;
  605.  
  606. _chest = NTC_FindUnit(NTC_UNIT_OBJECT, "chest");
  607. if(_chest)
  608. {
  609. return _chest;
  610. }
  611.  
  612. return null;
  613. }
  614. function NTR_GetObj(num)
  615. {
  616. var _chest;
  617.  
  618. _chest = NTC_FindUnit(NTC_UNIT_OBJECT, num);
  619. if(_chest)
  620. {
  621. return _chest;
  622. }
  623.  
  624. return null;
  625. }