All pastes #1967620 Raw Edit

Untitled

public text v1 · immutable
#1967620 ·published 2010-10-20 03:14 UTC
rendered paste body
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 <maxX && ry <maxY && 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<ignoreKorpse.length; tk++) {
				if(ignoreKorpse[tk] == BodyTarget.gid) {
					skipTarget=true;
					break;
				}
			}
			if (tagX  && getDistance (tagX,tagY, BodyTarget.x,BodyTarget.y) > 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;
}