const NTA_DAMAGE_NONE = 0; const NTA_DAMAGE_PHYSICAL = 1; const NTA_DAMAGE_MAGIC = 2; const NTA_DAMAGE_FIRE = 3; const NTA_DAMAGE_LIGHTNING = 4; const NTA_DAMAGE_COLD = 5; const NTA_DAMAGE_POISON = 6; var _NTA_SkillDamage=[]; var _NTA_SkillDelay =[]; var _NTA_SkillHand =[]; var ignoreKorpse =[]; const DEAD_MODE = (1<<29)|(1<<12); function NTA_KillBoss(classid) { var _target; if(NTConfig_AttackBoss < 1) return false; _target = NTC_FindMonster(classid); if(_target) { if(NTConfig_AttackFirst > 0 && NTA_GetResistance(_target, NTA_GetDamageType(NTConfig_AttackFirst)) < 100) { if(NTC_IsLeftSkill(NTConfig_AttackFirst)) NTC_DoCast(NTConfig_AttackFirst, 2, _target); else NTC_DoCast(NTConfig_AttackFirst, NTC_HAND_RIGHT, _target); } return NTA_Attack(_target, true, 100); } return false; } function NTA_ClearPosition(range, spectype) { var _orgx, _orgy; var _target; var _killnum = 0; var _units = 0; //if(NTConfig_AttackOthers < 1) // return false; if(arguments.length < 1) range = 20; if(arguments.length < 2) spectype = 0; _orgx = me.x; _orgy = me.y; _target = NTC_GetUnit(NTC_UNIT_MONSTER); _units = 0; if(_target) { // print("Start Unit Loop."); do { if(NTA_IsValidTarget(_target) && (spectype == 0 || (_target.spectype & spectype)) && getDistance(_orgx, _orgy, _target.x, _target.y) < range) { // print("Step 1"); _target = copyUnit(_target); // print("Step 2"); if(_killnum == 0 && _target.hp > 0) { // print("Step 3"); if(NTConfig_AttackFirst > 0 && NTA_GetResistance(_target, NTA_GetDamageType(NTConfig_AttackFirst)) < 100 && checkCollision(me, _target, 3) == 0) { // print("Step 4"); if(NTC_IsLeftSkill(NTConfig_AttackFirst)) { // print("Step 5A"); NTC_DoCast(NTConfig_AttackFirst, 2, _target); // print("Step 6A"); } else { // print("Step 5B"); NTC_DoCast(NTConfig_AttackFirst, NTC_HAND_RIGHT, _target); // print("Step 6B"); } // PickIt (FastSnag) NTSI_FastSnag(); // print("Step 7"); } } // print("Step 8"); if(NTA_Attack(_target, false, 20)) { // print("Step 9"); _killnum++; } // print("Step 10"); } // print("Unit : " + _units++); } while(_target.getNext() && _target); // print("End Unit Loop."); // print("-------------------------------------"); } if (me.classid == NTC_CHAR_CLASS_NECROMANCER){ //build army if (XP_useSkel) { var success = XP_CheckRevives(70,363); } // Check Skeleton Mages if (XP_useSkelMage && success) { success = XP_CheckRevives(80,364); } // Check Revives if (XP_useRevive && success) { success = XP_CheckRevives(95); } } if(me.classid == NTC_CHAR_CLASS_PALADIN) { if(NTConfig_UseRedemption && _killnum > 1 && NTC_PutSkill(124, NTC_HAND_RIGHT)) { NTC_PingDelay(750); } } return (_killnum > 0); } function isRoomReachable(room){ var col = room.getCollision(); //print("x size"+ room.xsize+" y size"+ room.ysize); /* for (var x =1; x < room.xsize; x++){ if (col[0][x] ==0) return [room.x*5+x,room.y*5] if (col[room.ysize-1][x] ==0) return [room.x*5+x,room.y*5+room.ysize] } for (var y =1; y < room.ysize; y++){ if (col[y][0] ==0) return [room.x*5,room.y*5+y] if (col[y][room.xsize-1] ==0) return [room.x*5+room.xsize,room.y*5+y] } */ var size = (room.ysize > room.xsize ? room.ysize : room.xsize) for (var y =1; y < room.xsize -1; y++){ for (var x =1; x < room.ysize-1; x++){ if (col[x][y] == 0) //if(col[x-1][y] == && col[x-1][y-1] == 0 && col[x+1][y] == 0 && col[x+1][y+1] == 0 ) return [room.x*5+y,room.y*5+x,size]; // this is probly wrong fixed x/y swap } } // dumpRoom(room) return false; } function dumpRoom(room){ var col = room.getCollision(); var output =""; sendCopyData(null, "OOG", 0,room.x+" "+room.y); for (var x =0; x < room.xsize ; x++){ output=" "; for (var y =0; y < room.ysize; y++){ output= output + col[x][y]; } sendCopyData(null, "OOG", 0,output+" "); } return false; } function NTA_ClearRooms(AttackRoutine,minX,minY,maxX,maxY) { if (minX > maxX){ var tempx = maxX; maxX = minX; minX = tempx; } if (minX > maxX){ var tempy = maxY; maxY = minY; minY = tempy; } var _room; var _rooms; var rx,ry,path,reachable; _room = getRoom(); if(!_room) return false; _rooms = new Array(); var size = (_room.xsize > _room.ysize) ? _room.xsize : _room.ysize ; do { rx = parseInt(_room.x*5 + _room.xsize/2); ry = parseInt(_room.y*5 + _room.ysize/2) //path= getPath(me.area, me.x, me.y, rx, ry,false); reachable =isRoomReachable(_room); if (reachable){ //if (reachable[0]==7741) // dumpRoom(_room); // if (maxX && maxY){ if (rx minX && ry > minY){ _rooms.push([reachable[0],reachable[1]])//([parseInt(_room.x*5 + _room.xsize/2), parseInt(_room.y*5 + _room.ysize/2)]); } }else{ _rooms.push([reachable[0],reachable[1]])//[parseInt(_room.x*5 + _room.xsize/2), parseInt(_room.y*5 + _room.ysize/2)]); } } } while(_room.getNext()); while(_rooms.length > 0) { _rooms.sort(NTA_SortRoomInt); _room = _rooms.shift(); // print(_rooms.toSource()); NTM_MoveTo(_room[0], _room[1]); if(typeof(AttackRoutine) == 'function'){ if(!AttackRoutine(size)) return false; }else{ NTA_ClearPosition(size); //clear as big as the room are some are up to 60 NTSI_PickItems(); NTP_UpdatePrecast(); } } return true; } function NTA_IsValidTarget(monster, simple) { if(!monster || monster.type != NTC_UNIT_MONSTER) return false; if(monster.mode == 0 || monster.mode == 12 || monster.hp <= 0) return false; if(arguments.length < 2) simple = false; if(!simple) { if(!monster.name) return false; switch(monster.name.toLowerCase()) { case "dummy": case "an evil force": return false; } switch(monster.classid) { case 271: // Merc case 338: case 359: case 561: case 356: // Decoy case 357: // Valkyrie case 418: // Shadow Warrior case 419: // Shadow Master case 363: // Necro Skeleton case 364: // Necro Mage case 366: // Compelling Orb case 406: // Izual's Spirit case 266: // Act1: Flavie (Navi) -> Between BloodMoor & ColdPlains case 408: // Act4: Hadriel (Malachai) -> Entrance of River of Flames case 516: // Act5: Impact point for Catapults (Invisible) -> Frigid Highlands case 517: // Act5: Impact point for Catapults (Invisible) case 518: // Act5: Impact point for Catapults (Invisible) -> Bloodyfoot Hill case 519: // Act5: Impact point for Catapults (Invisible) case 522: // Act5: Combatant Barbarian case 523: // Act5: Combatant Barbarian case 543: // Baal on stairs outside Worldstone Chamber case 545: // Baal taunts return false; } if(monster.classid >= 289 && monster.classid <= 292) // Necro's Golem return false; if((monster.classid >= 326 && monster.classid <= 330) || (monster.classid >= 410 && monster.classid <= 417)) // Traps return false; if(monster.classid >= 351 && monster.classid <= 353) // Hydra return false; if(monster.classid >= 420 && monster.classid <= 432) // Druid's friend return false; } if(((monster.classid >= 110 && monster.classid <= 113) || monster.classid == 608) && monster.mode == 8) return false; if(monster.classid == 68 && monster.mode == 14) return false; if((monster.classid == 258 || monster.classid == 261) && monster.mode == 14) return false; if(monster.getStat(172) == 2 || monster.getState(105) == 0) return false; if(monster.getState(53) || monster.getState(96)) // Conversion, Revive return false; //if(getBaseStat(1, monster.classid, 23)) // return false; return true; } // cwkim - Check later function NTA_GetDamageType(skillid) { switch(skillid) { case 74: // Corpse Explosion case 106: // Zeal case 107: // Charge case 151: // Whirlwind return NTA_DAMAGE_PHYSICAL; case 112: // Blessed Hammer return NTA_DAMAGE_MAGIC; case 47: // Fire Ball case 56: // Meteor return NTA_DAMAGE_FIRE; case 48: // Nova case 49: // Lightning case 53: // Chain Lightning return NTA_DAMAGE_LIGHTNING; case 59: // Blizzard case 64: // Frozen Orb return NTA_DAMAGE_COLD; case 92: // Poison Nova return NTA_DAMAGE_POISON; } var _etype; if(skillid == 74) return NTA_DAMAGE_PHYSICAL; if(skillid == 101) return NTA_DAMAGE_NONE; _etype = getBaseStat(3, parseInt(skillid, 10), 211); switch(_etype) { case 0: return NTA_DAMAGE_PHYSICAL; case 1: return NTA_DAMAGE_FIRE; case 2: return NTA_DAMAGE_LIGHTNING; case 3: return NTA_DAMAGE_MAGIC; case 4: return NTA_DAMAGE_COLD; case 5: return NTA_DAMAGE_POISON; } return NTA_DAMAGE_NONE; } function NTA_GetResistance(enemy, type) { if(!enemy) return false; if(arguments.length == 2) { switch(type) { case NTA_DAMAGE_PHYSICAL: return enemy.getStat(36); case NTA_DAMAGE_MAGIC: return enemy.getStat(37); case NTA_DAMAGE_FIRE: return enemy.getStat(39); case NTA_DAMAGE_LIGHTNING: return enemy.getStat(41); case NTA_DAMAGE_COLD: return enemy.getStat(43); case NTA_DAMAGE_POISON: return enemy.getStat(45); } } return 0; } function NTA_Attack(target, boss, maxattacks) { switch(me.classid) { case NTC_CHAR_CLASS_AMAZON: return NTA_AmazonAttackInt(target, boss, maxattacks); case NTC_CHAR_CLASS_SORCERESS: return NTA_SorceressAttackInt(target, boss, maxattacks); case NTC_CHAR_CLASS_NECROMANCER: return NTA_NecromancerAttackInt(target, boss, maxattacks); case NTC_CHAR_CLASS_PALADIN: return NTA_PaladinAttackInt(target, boss, maxattacks); case NTC_CHAR_CLASS_BARBARIAN: return NTA_BarbarianAttackInt(target, boss, maxattacks); case NTC_CHAR_CLASS_DRUID: return NTA_DruidAttackInt(target, boss, maxattacks); case NTC_CHAR_CLASS_ASSASSIN: return NTA_AssassinAttackInt(target, boss, maxattacks); } return false; } // Internal function function NTA_AmazonAttackInt(target, boss, maxattacks) { while(NTA_IsValidTarget(target, true)) { NTSI_FastSnag(); if(checkCollision(me, target, 3)) return false; if(getDistance(me,target)>5){ NTM_MoveTo(target.x, target.y) } NTC_DoCast(24, 3,target.x,target.y); } return true; } function NTA_SorceressAttackInt(target, boss, maxattacks) { var _attackprimary; var _primaryindex = boss ? 1 : 2; var _maxattacks = 0; var _usehand1, _usehand2; var _damagetype1, _damagetype2; var _range1, _range2; var _prehp; _attackprimary = boss ? NTConfig_AttackBoss : NTConfig_AttackOthers; _usehand1 = NTC_IsLeftSkill(_attackprimary) ? 2 : NTC_HAND_RIGHT; _damagetype1 = NTA_GetDamageType(_attackprimary); if(NTConfig_AttackSecondary > 0) { _usehand2 = NTC_IsLeftSkill(NTConfig_AttackSecondary) ? 2 : NTC_HAND_RIGHT; _damagetype2 = NTA_GetDamageType(NTConfig_AttackSecondary); } switch(_attackprimary) { case 106: // ZealChantress _range1 = 3; break; default: _range1 = 3; break; } switch(NTConfig_AttackSecondary) { case 48: // Nova _range2 = 10; break; default: _range2 = 20; break; } if(NTConfig_CastStatic < 100) { var _staticlevel = NTC_CheckSkill(42); if(_staticlevel > 0 && NTA_GetResistance(target, NTA_DAMAGE_LIGHTNING) < 100 && (boss || checkCollision(me, target, 3) == 0)) { var _cast = 0; var _staticrange = Math.floor(1.0 + 0.668*_staticlevel); while(_cast++ < 10 && parseInt(target.hp*100/128) > NTConfig_CastStatic) { if (me.area != 102 && NTConfig_Moattrick) NTA_MoveCloseInt(target, _staticrange); NTC_DoCast(42, NTC_HAND_RIGHT, target); NTSI_FastSnag(); } } } _prehp = target.hp; while(_maxattacks++ < maxattacks && NTA_IsValidTarget(target, true)) { NTSI_FastSnag(); if(NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) < 100) { if((_maxattacks % 2) == 1) { if (me.area != 102 && NTConfig_Moattrick){ if(!NTA_MoveCloseInt(target, _range1) && !boss) return false; } } NTA_DoCastInt(_primaryindex, target); } else if(NTConfig_AttackSkill[4] > 0 && NTA_GetResistance(target, _NTA_SkillDamage[4]) < 100) { if((_maxattacks % 2) == 1) { if (me.area != 102 && NTConfig_Moattrick){ if(!NTA_MoveCloseInt(target, _range2) && !boss) return false; } } NTA_DoCastInt(4, target); } else { if(boss) { if (me.area != 102 && NTConfig_Moattrick){ if((_maxattacks % 2) == 1) NTA_MoveCloseInt(target, _range1); } NTA_DoCastInt(_primaryindex, target); } else return false; } if(boss) { if((_maxattacks % 4) == 0 && target.hp >= _prehp) { if(target.classid == 526) return false; } if((_maxattacks % 8) == 0) { if(target.hp < _prehp) _prehp = target.hp; else return false; } } else { if((_maxattacks % 4) == 0) { if(target.hp < _prehp) _prehp = target.hp; else return false; } } if(NTConfig_CheckSafe) { if(!NTTMGR_CheckSafe(1)) return false; } } NTSI_FastSnag(); return true; } function getCurseState(curse){ if (curse == 66) // Amplify Damage return 9; if (curse == 76) //iron maden return 55; if (curse == 82) //life tap return 58; if (curse == 87)//Decrepify return 60; if (curse == 91) //lower resist return 61; return 1; } function getIntoLOS(target){ //for (var j = 0 ; j <15 ; j++){ // sendCopyData(null, "OOG", 0,"col "+j +" " +checkCollision(me, target,j)+ "x: "+target.x); //} if(checkCollision(me, target,10)){ //print("moving closer collision") NTA_MoveCloseInt(target, Math.round(getDistance(me, target)/2)); } if(checkCollision(me, target,2)){ //print("moving closer collision") NTA_MoveCloseInt(target, Math.round(getDistance(me, target)/2)); } if(checkCollision(me, target,1)){ //print("moving closer collision") NTA_MoveCloseInt(target, Math.round(getDistance(me, target)/2)); } } function NTA_NecromancerAttackInt(target, boss, maxattacks) { var _maxattacks = 0 //move these to global var armySize = 0; var success; while(_maxattacks++ < maxattacks && NTA_IsValidTarget(target, true) && target.hp > 0){ armySize =me.getMinionCount(4)+me.getMinionCount(5)+me.getMinionCount(6); if (armySize > XP_BuildArmyThresh){ if(target && (!target.getState(getCurseState(XP_Curse)) ) && target.classid != 371) NTC_DoCast(XP_Curse,0,target); }else{ if(target && (!target.getState(getCurseState(XP_BuildArmyCurse)) ) && target.classid != 371) NTC_DoCast(XP_BuildArmyCurse,0,target); } getIntoLOS(target); if (boss) NTC_DoCast(NTConfig_AttackBoss,0,target); else NTC_DoCast(NTConfig_AttackOthers,0,target); if (armySize > XP_BuildArmyThresh && getDistance(me.x,me.y,target.x,target.y)>5){ //sendCopyData(null, "OOG", 0,"going closer"); NTM_MoveTo(target.x+1, target.y, 0) //stay on mob if we got army going clickMap(0,0,me.x,me.y+1); } if (XP_CorpseExplosion) { XP_UseNecroCE(target); } if (XP_useSkel) { var success = XP_CheckRevives(70,363); } // Check Skeleton Mages if (XP_useSkelMage && success) { success = XP_CheckRevives(80,364); } // Check Revives if (XP_useRevive && success) { success = XP_CheckRevives(95); } } } function XP_CheckRevives(reviveSkill,reviveID) { if (reviveSkill != 70 && reviveSkill != 80 && reviveSkill != 95){ //DC_DPrint("XP_CheckRevives() -> Invalid skill passed!"); return false; } var success = false; var haveRevive = 0; var maxRevives = XP_MaxRevives(reviveSkill); var needMana = 0; var skeltype = 0; var XP_ToRevive = 3; var i = 0; // get the right skeltype id (4 = skeleton, 5 = skeletonmage, 6 = revive) switch(reviveSkill){ case 70: needMana = 5 + NTC_CheckSkill(reviveSkill); skeltype = 4; break; case 80: needMana = 7 + NTC_CheckSkill(reviveSkill); skeltype = 5; break; case 95: needMana = 45; skeltype = 6; break; } // Count my revives haveRevive = me.getMinionCount(skeltype);//0; success = (haveRevive >= maxRevives || me.mp <= needMana); //XP_ToRevive controls how many corpses to proccess per function call while (haveRevive < maxRevives && me.mp > needMana && i++ < XP_ToRevive) { var korpse = getBodyTarget(25); if (reviveSkill == 95) { if (korpse && ((korpse.spectype & 0x07) == 0) && korpse.classid != 571 && korpse.classid != 572 && korpse.classid != 573 && korpse.classid != 312 && korpse.classid != 702 && getBaseStat(6, korpse.classid, 8) && getBaseStat(6, korpse.classid, 9)) { //DC_DPrint("Reviving " + korpse.name + " from range " + DA_GetRange(korpse)); // print("Reviving " + korpse.name + " from range " + DA_GetRange(korpse)); getIntoLOS(korpse); //print("Raising " + (reviveSkill == 70 ? "Skel": "Mage") + " from " + korpse.name + " from range " + getDistance(me,korpse)); NTC_DoCast(reviveSkill,0,korpse.x,korpse.y,1); // casting revive fails some times so im just going to try once //delay(500); success = true; } else if (!korpse){ break; } } else { // Skel or SkelMage if(korpse){ var iLoop = 0; //DC_DPrint("Raising " + (reviveSkill == 70 ? "Skel": "Mage") + " from " + korpse.name + " from range " + DA_GetRange(korpse)); while(korpse && haveRevive == me.getMinionCount(skeltype) && iLoop++ < XP_ToRevive){ //print("in loop: "+iLoop+" haveRevive = " + haveRevive + " minionCount = " + me.getMinionCount(skeltype)); getIntoLOS(korpse); if(getDistance(me.x,me.y,korpse.x,korpse.y) <40){ //print("Raising " + (reviveSkill == 70 ? "Skel": "Mage") + " from " + korpse.name + " from range " + getDistance(me,korpse)); NTC_DoCast(reviveSkill,0,korpse.x,korpse.y,1); //delay(500); //delay(((typeof me.serverip !== "undefined") ? me.ping : 50)); } } success = true; } else{ break; } } delay(300); haveRevive = me.getMinionCount(skeltype); } return success; } function XP_MaxRevives(revSkill) { switch(revSkill){ case 70: return((me.getSkill(70,1) < 4) ? me.getSkill(70,1) : 2 + Math.floor(me.getSkill(70,1) / 3)); case 80: return((me.getSkill(80,1) < 4) ? me.getSkill(80,1) : 2 + Math.floor(me.getSkill(80,1) / 3)); case 95: return(me.getSkill(95,1)); } return false; } function XP_UseNecroCE(target) { if (!target || target.hp < 1 || (target.getStat(36) > 99 && target.getStat(39) > 99)) return; var CE_level = NTC_CheckSkill(74); var CEa = (CE_level - 1) / 3; var CE_rad = 2.6 + CEa; var bomb = getBodyTarget(25,target.x,target.y,CE_rad); //if (bomb && target && target.hp > 0 && me.mp > 20 && DA_GetRangeXY(target,bomb.x,bomb.y) <= CE_rad) { if (bomb && target && target.hp > 0 && me.mp > 20 && getDistance(target.x,target.y,bomb.x,bomb.y) <= CE_rad) { //DC_DoCast(74,0,bomb); NTC_DoCast(74,0, bomb); delay(100); } } function getBodyTarget(range,tagX,tagY,dist) { var body_target = false; var BodyTarget = getUnit(1, null, DEAD_MODE); if(BodyTarget) do { if (BodyTarget.getStat(172) == 2 || BodyTarget.getState(105) == 0) { continue; } if (BodyTarget.getState(99) || BodyTarget.getState(104) || BodyTarget.getState(118)) { continue; } // Use NeverCount base monstat for traps, hydra, etc. if (getBaseStat(1,BodyTarget.classid,23)) { continue; } if(getDistance(me, BodyTarget) < (!range ? 25 : range) && !BodyTarget.getParent() && /*BodyTarget.classid != 271 && BodyTarget.classid != 289 && BodyTarget.classid != 290 && BodyTarget.classid != 291 && BodyTarget.classid != 292 && BodyTarget.classid != 338 && BodyTarget.classid != 351 && BodyTarget.classid != 352 && BodyTarget.classid != 353 && BodyTarget.classid != 359 && BodyTarget.classid != 363 && BodyTarget.classid != 364 && BodyTarget.classid != 371 && BodyTarget.classid != 543 && BodyTarget.classid != 561 && */ getBaseStat(6, BodyTarget.classid, 8) && (((me.area == 132 || me.area == 131) && ((me.x < 15099) && (me.x > 15088)) && ((me.y < 5022) && (me.y > 5006))) || !checkCollision(me.area,me.x,me.y,3,BodyTarget.x,BodyTarget.y,3,7))) { var skipTarget=false; for(var tk = 0; tk dist) skipTarget = true; if(!skipTarget) { ignoreKorpse.push(BodyTarget.gid); return BodyTarget; } } }while(BodyTarget.getNext(null,DEAD_MODE)); return false; } function NTA_PaladinAttackInt(target, boss, maxattacks){ var _attackprimary; var _maxattacks = 0; var _usehand1, _usehand2; var _damagetype1, _damagetype2; var _range1, _range2; var _prehp1, _prehp2; var _nohit = true; _attackprimary = boss ? NTConfig_AttackBoss : NTConfig_AttackOthers; _usehand1 = NTC_IsLeftSkill(_attackprimary) ? 2 : NTC_HAND_RIGHT; _damagetype1 = NTA_GetDamageType(_attackprimary); if(NTConfig_AttackSecondary > 0) { _usehand2 = NTC_IsLeftSkill(NTConfig_AttackSecondary) ? 2 : NTC_HAND_RIGHT; _damagetype2 = NTA_GetDamageType(NTConfig_AttackSecondary); } switch(_attackprimary) { case 101: // Holy Bolt case 121: // Fist of the Heavens _range1 = 20; break; default: _range1 = 2; break; } switch(NTConfig_AttackSecondary) { case 101: // Holy Bolt case 121: // Fist of the Heavens _range2 = 20; break; default: _range2 = 2; break; } _prehp1 = target.hp; while(_maxattacks++ < maxattacks && NTA_IsValidTarget(target, true) && target.hp > 0) { //print("--Sub Step 1"); if(checkCollision(me, target, 3)) { if(boss) { if(_attackprimary == 101 || _attackprimary == 121) NTA_MoveCloseInt(target, Math.round(getDistance(me, target)/2)); } else if(me.area != 131) return false; } _prehp2 = target.hp; //print("--Sub Step 2"); if(NTA_GetResistance(target, _damagetype1) < 100) { //print("--Sub Step 3A"); if((_maxattacks % 2) == 1 && _nohit) { if(_attackprimary == 112) { //print("--Sub Step 3A-B"); if(!NTM_MoveTo(target.x+1, target.y, 0) && !boss) return false; } else { //print("--Sub Step 3A-C"); if(!NTA_MoveCloseInt(target, _range1) && !boss) return false; } //print("--Sub Step 3A-D"); if(NTConfig_PutAura > 0) NTC_PutSkill(NTConfig_PutAura, NTC_HAND_RIGHT); } //print("--Sub Step 3A-E"); NTC_DoCast(_attackprimary, _usehand1, target); //print("--Sub Step 3A-F"); NTSI_FastSnag(); //print("--Sub Step 4A"); } else if(NTConfig_AttackSecondary > 0 && NTA_GetResistance(target, _damagetype2) < 100) { //print("--Sub Step 3B"); if((_maxattacks % 2) == 1 && _nohit) { if(NTConfig_AttackSecondary == 112) { if(!NTM_MoveTo(target.x+1, target.y, 0) && !boss) return false; } else { if(!NTA_MoveCloseInt(target, _range2) && !boss) return false; } if(NTConfig_PutAura > 0) NTC_PutSkill(NTConfig_PutAura, NTC_HAND_RIGHT); } NTC_DoCast(NTConfig_AttackSecondary, _usehand2, target); NTSI_FastSnag(); //print("--Sub Step 4B"); } else { //print("--Sub Step 3C"); if(boss) { if((_maxattacks % 2) == 1 && _nohit) { if(_attackprimary == 112) NTM_MoveTo(target.x+1, target.y, 0); else NTA_MoveCloseInt(target, _range1); if(NTConfig_PutAura > 0) NTC_PutSkill(NTConfig_PutAura, NTC_HAND_RIGHT); } NTC_DoCast(_attackprimary, _usehand1, target); NTSI_FastSnag(); } else return false; //print("--Sub Step 4C"); } //print("--Sub Step 4"); if(boss) { if((_maxattacks % 8) == 0) { if(target.hp < _prehp1) _prehp1 = target.hp; else return false; } } else { if((_maxattacks % 4) == 0) { if(target.hp < _prehp1) _prehp1 = target.hp; else return false; } } //print("--Sub Step 5"); _nohit = (target.hp >= _prehp2); if(NTConfig_CheckSafe) { if(!NTTMGR_CheckSafe(1)) return false; } //print("--Sub Step 6"); } return true; } function NTA_BarbarianAttackInt(target, boss, maxattacks){ return false; } function NTA_DruidAttackInt(target, boss, maxattacks) { var _attackprimary; var _primaryindex = boss ? 1 : 2; var _maxattacks = 0; var _usehand1, _usehand2; var _damagetype1, _damagetype2; var _range1, _range2; var _prehp; _attackprimary = boss ? NTConfig_AttackBoss : NTConfig_AttackOthers; _usehand1 = NTC_IsLeftSkill(_attackprimary) ? 2 : NTC_HAND_RIGHT; _damagetype1 = NTA_GetDamageType(_attackprimary); if(NTConfig_AttackSecondary > 0) { _usehand2 = NTC_IsLeftSkill(NTConfig_AttackSecondary) ? 2 : NTC_HAND_RIGHT; _damagetype2 = NTA_GetDamageType(NTConfig_AttackSecondary); } switch(_attackprimary) { case 245: // Tornado _range1 = 2; break; default: _range1 = 2; break; } switch(NTConfig_AttackSecondary) { case 245: // Tornado _range2 = 2; break; default: _range2 = 2; break; } _prehp = target.hp; while(_maxattacks++ < maxattacks && NTA_IsValidTarget(target, true)) { NTSI_FastSnag(); if(NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) < 100) { if((_maxattacks % 2) == 1) { if(!NTA_MoveCloseInt(target, _range1) && !boss) return false; } NTA_DoCastInt(_primaryindex, target); if (!me.getState(149)) //refresh oak sage NTC_DoCast(226,0); if (!me.getState(144)) //refresh hurricane NTC_DoCast(250,0); if (!me.getState(151)) //refresh Cyclone Armor NTC_DoCast(235,0); } else if(NTConfig_AttackSkill[4] > 0 && NTA_GetResistance(target, _NTA_SkillDamage[4]) < 100) { if((_maxattacks % 2) == 1) { if(!NTA_MoveCloseInt(target, _range2) && !boss) return false; } NTA_DoCastInt(4, target); if (!me.getState(149)) //refresh oak sage NTC_DoCast(226,0); if (!me.getState(144)) //refresh hurricane NTC_DoCast(250,0); if (!me.getState(151)) //refresh Cyclone Armor NTC_DoCast(235,0); } else { if(boss) { if((_maxattacks % 2) == 1) NTA_MoveCloseInt(target, _range1); NTA_DoCastInt(_primaryindex, target); if (!me.getState(149)) //refresh oak sage NTC_DoCast(226,0); if (!me.getState(144)) //refresh hurricane NTC_DoCast(250,0); if (!me.getState(151)) //refresh Cyclone Armor NTC_DoCast(235,0); } else return false; } if(boss) { if((_maxattacks % 4) == 0 && target.hp >= _prehp) { if(target.classid == 526) return false; } if((_maxattacks % 8) == 0) { if(target.hp < _prehp) _prehp = target.hp; else return false; } } else { if((_maxattacks % 4) == 0) { if(target.hp < _prehp) _prehp = target.hp; else return false; } } if(NTConfig_CheckSafe) { if(!NTTMGR_CheckSafe(1)) return false; } } NTSI_FastSnag(); return true; } function NTA_AssassinAttackInt(target, boss, maxattacks) { var _primaryindex; var _maxattacks = 0; var _range1, _range2; var _prehp; _primaryindex = boss ? 1 : 2; switch(NTConfig_AttackSkill[_primaryindex]) { case 256: // Shock Field case 271: // Lightning Sentry _range1 = 10; break; default: _range1 = 20; break; } switch(NTConfig_AttackSkill[4]) { case 256: // Shock Field case 271: // Lightning Sentry _range2 = 10; break; default: _range2 = 20; break; } _prehp = target.hp; while(_maxattacks++ < maxattacks && NTA_IsValidTarget(target, true) && target.hp > 0) { if(NTConfig_UseTraps) NTA_CheckTraps(target,boss); NTSI_FastSnag(); if(!target.hp > 0) break; if(!getCollision(me.area, target.x,target.y)) { if(boss) NTA_MoveCloseInt(target, Math.round(getDistance(me, target)/2)); else if(me.area != 131) return false; } if(NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) < 100) { if((_maxattacks % 2) == 1) { if(!NTA_MoveCloseInt(target, _range1) && !boss) return false; } NTA_DoCastInt(_primaryindex, target); } else if(NTConfig_AttackSkill[4] > 0 && NTA_GetResistance(target, _NTA_SkillDamage[4]) < 100) { if((_maxattacks % 2) == 1) { if(!NTA_MoveCloseInt(target, _range2) && !boss) return false; } NTA_DoCastInt(4, target); } else { if(boss) { if((_maxattacks % 2) == 1) NTA_MoveCloseInt(target, _range1); NTA_DoCastInt(_primaryindex, target); } else return false; } if(boss) { if((_maxattacks % 4) == 0 && target.hp >= _prehp) { if(target.classid == 526) return false; } if((_maxattacks % 8) == 0) { if(target.hp < _prehp) _prehp = target.hp; else return false; } } else { if((_maxattacks % 4) == 0) { if(target.hp < _prehp) _prehp = target.hp; else return false; } } if(NTConfig_CheckSafe) { if(!NTTMGR_CheckSafe(1)) return false; } } return true; } function NTA_CheckTraps(target,boss) { var traps=NTC_GetUnit(NTC_UNIT_MONSTER); var trapcount =0; var warr=0; var secondTrap =276; var x,y; if (traps){ do{ if (traps.classid == 412 || traps.classid == 413 || traps.classid == 416 || traps.classid == 417){ if(traps.getParent() == me.name) if(getDistance(target.x,target.y,traps.x,traps.y)<35 && traps.hp > 100 ) trapcount=trapcount+1; } if (traps.classid == 418 || traps.classid == 419 && traps.mode != 12){ warr=1; } }while(traps.getNext()) if (trapcount < 5 && target.hp>0){ x=target.x; y=target.y; if(target.classid == 243 || target.classid == 544) secondTrap =271; NTSI_FastSnag(); NTC_DoCast(258, NTC_HAND_RIGHT); //quickness NTSI_FastSnag(); NTC_DoCast(271, NTC_HAND_RIGHT, x+2,y); NTC_DoCast(271, NTC_HAND_RIGHT, x+1,y); NTSI_FastSnag(); NTC_DoCast(271, NTC_HAND_RIGHT, x,y); NTSI_FastSnag(); NTC_DoCast(secondTrap, NTC_HAND_RIGHT, x-1,y); NTC_DoCast(secondTrap, NTC_HAND_RIGHT, x-2,y); if (NTConfig_CastFade) NTC_DoCast(267, NTC_HAND_RIGHT); //fade NTSI_FastSnag(); } if (warr==0) NTP_UpdatePrecast(); } } function NTA_MoveCloseInt(target, maxrange) { var _dist = getDistance(me, target); if(_dist > maxrange) { var _destx, _desty; _destx = me.x + Math.round((_dist-maxrange)*(target.x-me.x) / _dist); _desty = me.y + Math.round((_dist-maxrange)*(target.y-me.y) / _dist); return NTM_MoveTo(_destx, _desty, 0); } return true; } function NTA_SortRoomInt(a, b) { if(getDistance(me.x, me.y, a[0], a[1]) < getDistance(me.x, me.y, b[0], b[1])) return -1; return 1; } function NTA_Initialize() { if (me.classid == 1){ //NTConfig_AttackFirst=NTConfig_AttackSkill[0]; //NTConfig_AttackBoss=NTConfig_AttackSkill[1]; //NTConfig_AttackOthers=NTConfig_AttackSkill[2]; //NTConfig_AttackSecondary=NTConfig_AttackSkill[4]; //if (NTConfig_AttackSecondary == 0) // NTConfig_AttackSecondary = NTConfig_AttackSkill[4]; if (NTConfig_AttackSkill[0] == 0 && NTConfig_AttackSkill[1] == 0 && NTConfig_AttackSkill[2] == 0 && NTConfig_AttackSkill[3] == 0 && NTConfig_AttackSkill[4] == 0 ){ // old config file NTConfig_AttackSkill[0] = NTConfig_AttackFirst; NTConfig_AttackSkill[1] = NTConfig_AttackBoss; NTConfig_AttackSkill[2] = NTConfig_AttackOthers; NTConfig_AttackSkill[4] = NTConfig_AttackSecondary; } } for(var i = 0 ; i < 6 ; i++) { if(NTConfig_AttackSkill[i] > 0) { _NTA_SkillHand[i] = getBaseStat("skills.txt", NTConfig_AttackSkill[i], 166) ? 2 : NTC_HAND_RIGHT; _NTA_SkillDamage[i] = NTA_GetDamageType(NTConfig_AttackSkill[i]); _NTA_SkillDelay[i] = NTC_GetCastDelay(NTConfig_AttackSkill[i]); } } } function NTA_DoCastInt(index, target) { var _untimedindex = index < 4 ? 3 : 5; if (NTConfig_AttackSkill[index] == 0) return false; if(!NTC_DoCast(NTConfig_AttackSkill[index], _NTA_SkillHand[index], target)) return false; if (me.area != 102) getIntoLOS(target) if(_NTA_SkillDelay[index] > 0) { if(NTConfig_AttackSkill[_untimedindex] > 0) { var _starttick = getTickCount(); while(NTA_IsValidTarget(target, true)) { NTC_DoCast(NTConfig_AttackSkill[_untimedindex], _NTA_SkillHand[_untimedindex], target); if(getTickCount()-_starttick >= _NTA_SkillDelay[index]) break; } } else NTC_Delay(_NTA_SkillDelay[index]); } return true; }