|
You last visited: Today at 13:11
Advertisement
attacking a corpse
Discussion on attacking a corpse within the Diablo 2 Programming forum part of the Diablo 2 category.
04/17/2014, 23:52
|
#1
|
elite*gold: 0
Join Date: Dec 2013
Posts: 39
Received Thanks: 0
|
attacking a corpse
is still for the potion finder im working on , as current setup the barb will use the potion find only when one or more monsters are around
he still wont attack the corpse when none are around , any ideas?
thanks
and heres the ntattack ive modded up sofar with NO errors
Code:
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_SkillHand = new Array(7);
var _NTA_SkillDamage = new Array(7);
var _NTA_SkillRange = new Array(7);
var _CurseState;
var _SpearCount = 0;
var _SumCount = 0;
var _SkeleCount = 0;
var _MageCount = 0;
var _SumBreak = 0;
var _sorcattack = 0;
function NTA_Initialize()
{
if(NTConfig_AttackSkill[1] == 0 || NTConfig_AttackSkill[3] == 0)
NTA_DetectAttackPattern();
for(var i = 0 ; i < 8 ; 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]);
switch(NTConfig_AttackSkill[i])
{
case 280: // Normal Attack
_NTA_SkillRange[i] = 2;
break;
case 131: //potion find
_NTA_SkillRange[i] = 2;
break;
}
}
}
if(me.classid == NTC_CHAR_CLASS_ASSASSIN)
{
NTA_InitializeAssassinAttacks();
}
}
function NTA_InitializeAssassinAttacks()
{
// Find maximum range value for traps.
// No attacks should be set a high range value.
NTConfig_MinTrapRange = 999;
NTConfig_MinBossTrapRange = 999;
NTConfig_NumTraps = 0;
NTConfig_NumBossTrap = 0;
for(var i=0; i < 5; i++) {
if(NTConfig_TrapSet[i] > 0) {
// Find the lowest trap range
switch(NTConfig_TrapSet[i]) {
case 271: // Lightning Sentry
case 276: // Death Sentry
NTConfig_NumTraps++;
if(25 < NTConfig_MinTrapRange) // Trap range 25
NTConfig_MinTrapRange = 25;
break;
case 261: // Charged Bolt Sentry
NTConfig_NumTraps++;
if(10 < NTConfig_MinTrapRange) // Trap range 10
NTConfig_MinTrapRange = 10;
break;
case 262: // Wake of Fire
NTConfig_NumTraps++;
if(25 < NTConfig_MinTrapRange) // Trap range 25
NTConfig_MinTrapRange = 25;
break;
case 272: // Wake of Inferno
NTConfig_NumTraps++;
if(15 < NTConfig_MinTrapRange) // Trap range 15
NTConfig_MinTrapRange = 15;
break;
default: // User using invalid trap
// Do Nothing
break;
}
}
if(NTConfig_ActBossTrapSet[i] > 0) {
// Find the lowest trap range
switch(NTConfig_ActBossTrapSet[i]) {
case 271: // Lightning Sentry
case 276: // Death Sentry
NTConfig_NumBossTrap++;
if(25 < NTConfig_MinBossTrapRange) // Trap range 25
NTConfig_MinBossTrapRange = 25;
break;
case 261: // Charged Bolt Sentry
NTConfig_NumBossTrap++;
if(10 < NTConfig_MinBossTrapRange) // Trap range 10
NTConfig_MinBossTrapRange = 10;
break;
case 262: // Wake of Fire
NTConfig_NumBossTrap++;
if(25 < NTConfig_MinBossTrapRange) // Trap range 25
NTConfig_MinBossTrapRange = 25;
break;
case 272: // Wake of Inferno
NTConfig_NumBossTrap++;
if(15 < NTConfig_MinBossTrapRange) // Trap range 15
NTConfig_MinBossTrapRange = 15;
break;
default: // User using invalid trap
// Do Nothing
break;
}
}
}
}
function NTA_KillMonster(classid)
{
var _target;
if(NTConfig_AttackSkill[1] < 1)
return false;
_target = NTC_FindUnit(NTC_UNIT_MONSTER, classid, 5);
if(!_target)
return false;
if(_target.IsAttackable())
{
var _attackcount = 0;
while(_attackcount < 300 && NTA_IsValidMonster(_target))
{
if(NTA_Attack(_target, (_attackcount%30) == 0) < 2)
break;
_attackcount++;
_sorcattack++;
}
}
return (_target.hp <= 0 || _target.mode == 0 || _target.mode == 12);
}
function ReviveDead()
{
var _breaker=0;
_target = NTC_FindUnit(NTC_UNIT_MONSTER);
do
{
_skiplist = new Array();
if(_target.mode == 12 && !_target.GetState(96) && !_target.GetState(56) && (_target.spectype == 1 || _target.spectype == 17) && !_target.GetState(172) && !_target.GetState(173) && !_target.GetState(154) && _target.classid != 363 && _target.classid != 364 && _target.classid != 351 && _target.classid != 352 && _target.classid != 353)
{
if(_skiplist.indexOf(_target.gid) < 0)
{
if((GetDistance(me, _target) < 15))
{
var _pos = me.GetOptimalAttackPos(_target.areaid, _target.x, _target.y, 3, 4);
if(_pos)
{
NTM_MoveTo(_target.areaid, _pos[0], _pos[1], 0);
if(!NTC_CastSkill(95, NTC_HAND_RIGHT,_target.x+2,_target.y+1))
{
_breaker++;
_skiplist.push(_target.gid);
}
else
{
_breaker++;
}
}
}
else
_skiplist.push(_target.gid);
}
}
if (_breaker >= 1 || _target == null)
{
break;
_breaker = 0;
}
}
while(_target.GetNext());
}
function SkeleDead()
{
var _breaker=0;
_target = NTC_FindUnit(NTC_UNIT_MONSTER);
do
{
_skiplist = new Array();
if(_target.mode == 12 && !_target.GetState(96) && !_target.GetState(56) && (_target.spectype == 1 || _target.spectype == 17) && !_target.GetState(172) && !_target.GetState(173) && !_target.GetState(154) && _target.classid != 363 && _target.classid != 364 && _target.classid != 351 && _target.classid != 352 && _target.classid != 353)
{
if(_skiplist.indexOf(_target.gid) < 0)
{
if((GetDistance(me, _target) < 15))
{
var _pos = me.GetOptimalAttackPos(_target.areaid, _target.x, _target.y, 3, 4);
if(_pos)
{
NTM_MoveTo(_target.areaid, _pos[0], _pos[1], 0);
if(!NTC_CastSkill(70, NTC_HAND_RIGHT,_target.x+2,_target.y+1))
{
_breaker++;
_skiplist.push(_target.gid);
}
else
{
_breaker++;
_SkeleCount++;
_SumCount++;
}
}
}
else
_skiplist.push(_target.gid);
}
}
if (_breaker >= 1 || _target == null)
{
break;
_breaker = 0;
}
}
while(_target.GetNext());
}
function MageDead()
{
var _breaker=0;
_target = NTC_FindUnit(NTC_UNIT_MONSTER);
do
{
_skiplist = new Array();
if(_target.mode == 12 && !_target.GetState(96) && !_target.GetState(56) && (_target.spectype == 1 || _target.spectype == 17) && !_target.GetState(172) && !_target.GetState(173) && !_target.GetState(154) && _target.classid != 363 && _target.classid != 364 && _target.classid != 351 && _target.classid != 352 && _target.classid != 353)
{
if(_skiplist.indexOf(_target.gid) < 0)
{
if((GetDistance(me, _target) < 15))
{
var _pos = me.GetOptimalAttackPos(_target.areaid, _target.x, _target.y, 3, 4);
if(_pos)
{
NTM_MoveTo(_target.areaid, _pos[0], _pos[1], 0);
if(!NTC_CastSkill(80, NTC_HAND_RIGHT,_target.x+2,_target.y+1))
{
_breaker++;
_skiplist.push(_target.gid);
}
else
{
_breaker++;
_MageCount++;
_SumCount++;
}
}
}
else
_skiplist.push(_target.gid);
}
}
if (_breaker >= 1 || _target == null)
{
break;
_breaker = 0;
}
}
while(_target.GetNext());
}
function NTA_ClearPosition(range, pickitem, safelevel)
{
var _orgx, _orgy;
var _spectype = [0x0A, 0x01, 0x01];
var _skiplist;
var _attackcount = 0;
var _target;
var _distance, _mingid, _mindistance;
var _result;
var _sum = 0;
if(NTConfig_AttackSkill[1] < 1 || NTConfig_AttackSkill[3] < 1)
return false;
switch(arguments.length)
{
case 0:
range = 20;
case 1:
pickitem = false;
case 2:
safelevel = 0;
default:
if(NTConfig_CheckSelfSafe < 0x01 && NTConfig_CheckMercSafe < 0x01)
safelevel = 0;
break;
}
_orgx = me.x;
_orgy = me.y;
for(var i = 0 ; i < _spectype.length ; i++)
{
_skiplist = new Array();
while(_attackcount < (i+1)*100)
{
_mindistance = 100000;
_target = NTC_FindUnit(NTC_UNIT_MONSTER);
if(_target)
{
do
{
if(_skiplist.indexOf(_target.gid) < 0)
{
if(_target.IsAttackable() && (_target.spectype&_spectype[i]))
{
if(GetDistance(_orgx, _orgy, _target.x, _target.y) <= range && NTA_IsValidMonster(_target))
{
_distance = GetDistance(me, _target);
if(_distance < _mindistance)
{
_mingid = _target.gid;
_mindistance = _distance;
}
}
}
else
_skiplist.push(_target.gid);
}
} while(_target.GetNext());
}
if(_mindistance < 100000)
{
_target = NTC_FindUnit(NTC_UNIT_MONSTER, _mingid);
if(_target)
{
_result = NTA_Attack(_target, (_attackcount%30) == 0);
switch(_result)
{
case 1:
_skiplist.push(_mingid);
break;
case 2:
case 3:
_attackcount++;
_sorcattack++;
break;
default:
return false;
}
}
}
else
break;
}
}
if(me.classid == NTC_CHAR_CLASS_PALADIN)
{
if(_attackcount > 2 && (parseInt(me.hp*100/me.hpmax) < NTConfig_UseRedemptionHP || parseInt(me.mp*100/me.mpmax) < NTConfig_UseRedemptionMP))
{
if(NTC_PutSkill(124, NTC_HAND_RIGHT))
NTC_PingDelay(1000);
}
}
if(NTConfig_UseFindItem && me.classid == NTC_CHAR_CLASS_BARBARIAN && _attackcount > 2)
{
if(!NTA_CheckForCloseMonsters(10))
{
//Print("ÿc<No Monsters close - looting");
NTA_FindItem(NTConfig_FindItemRange);
}
else
{
//Print("ÿc1Close Monster detected - clearing area");
if(recursion)
{
NTA_ClearPosition(15, false, 0, false);
NTA_FindItem(NTConfig_FindItemRange);
}
}
}
if(me.classid == NTC_CHAR_CLASS_NECROMANCER)
{
_SumBreak = 0;
if(_attackcount > 2)
{
NTC_CastSkill(68, NTC_HAND_RIGHT); // Bone Armor
if(_SkeleCount < NTConfig_Skele + 1 || _MageCount < NTConfig_Mage + 1)
{
if(_SkeleCount == _MageCount)
{
for(var i = 0 ; i < 5 ; i++)
{
SkeleDead();
}
}
else if(_SkeleCount > _MageCount || _SkeleCount > NTConfig_Skele + 1)
{
for(var i = 0 ; i < 5 ; i++)
{
MageDead();
}
}
else if(_MageCount > _SkeleCount || _SkeleMage > NTConfig_Mage + 1)
{
for(var i = 0 ; i < 5 ; i++)
{
SkeleDead();
}
}
}
else
{
if(_SumCount >= 200)
{
_SumCount = 30;
_SkeleCount = _SkeleCount - 3;
_MageCount = _MageCount - 3;
}
for(var i = 0 ; i < 10 ; i++)
{
ReviveDead();
}
}
}
}
if(NTConfig_OpenChest)
{
_target = NTC_GetSpecialChest();
if(_target && GetDistance(_orgx, _orgy, _target.x, _target.y) <= range && NTC_OpenChest(_target))
_attackcount++;
}
if(pickitem && _attackcount > 0)
NTSI_PickItems();
switch(safelevel)
{
case 1:
return NTTMGR_CheckSafe(0x00, NTConfig_CheckMercSafe&0x01);
case 2:
return NTTMGR_CheckSafe(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe);
}
return true;
}
function NTA_ClearLevel(pickitem, safelevel)
{
var i;
var _room, _rooms;
var _distance, _minindex, _mindistance;
_room = GetRoom();
if(!_room)
return false;
switch(arguments.length)
{
case 0:
pickitem = true;
case 1:
safelevel = 2;
default:
if(NTConfig_CheckSelfSafe < 0x01 && NTConfig_CheckMercSafe < 0x01)
safelevel = 0;
break;
}
_rooms = new Array();
do
{
_rooms.push([parseInt(_room.x*5 + _room.xsize*5/2), parseInt(_room.y*5 + _room.ysize*5/2)]);
} while(_room.GetNext());
while(_rooms.length > 0)
{
_mindistance = 100000;
for(i = 0 ; i < _rooms.length ; i++)
{
_distance = GetDistance(me.x, me.y, _rooms[i][0], _rooms[i][1]);
if(_distance < _mindistance)
{
_minindex = i;
_mindistance = _distance;
}
}
if(NTM_MoveTo(me.areaid, _rooms[_minindex][0], _rooms[_minindex][1], 1))
{
if(!NTA_ClearRoom(pickitem, safelevel))
return false;
NTP_DoPrecast(false);
}
_rooms.splice(_minindex, 1);
}
return true;
}
function NTA_ClearRoom(pickitem, safelevel)
{
var _room;
var _spectype = [0x0A, 0x01, 0x01];
var _skiplist;
var _attackcount = 0;
var _target;
var _distance, _mingid, _mindistance;
var _result;
if(NTConfig_AttackSkill[1] < 1 || NTConfig_AttackSkill[3] < 1)
return false;
_room = me.GetRoom();
if(!_room)
return false;
switch(arguments.length)
{
case 0:
pickitem = false;
case 1:
safelevel = 0;
default:
if(NTConfig_CheckSelfSafe < 0x01 && NTConfig_CheckMercSafe < 0x01)
safelevel = 0;
break;
}
for(var i = 0 ; i < _spectype.length ; i++)
{
_skiplist = new Array();
while(_attackcount < (i+1)*100)
{
_mindistance = 100000;
_target = NTC_FindUnit(NTC_UNIT_MONSTER);
if(_target)
{
do
{
if(_skiplist.indexOf(_target.gid) < 0)
{
if(_target.IsAttackable() && (_target.spectype&_spectype[i]))
{
if(_room.UnitInRoom(_target) && NTA_IsValidMonster(_target))
{
_distance = GetDistance(me, _target);
if(_distance < _mindistance)
{
_mingid = _target.gid;
_mindistance = _distance;
}
}
}
else
_skiplist.push(_target.gid);
}
} while(_target.GetNext());
}
if(_mindistance < 100000)
{
_target = NTC_FindUnit(NTC_UNIT_MONSTER, _mingid);
if(_target)
{
_result = NTA_Attack(_target, (_attackcount%30) == 0);
switch(_result)
{
case 1:
_skiplist.push(_mingid);
break;
case 2:
case 3:
_attackcount++;
break;
default:
return false;
}
}
}
else
break;
}
}
if(me.classid == NTC_CHAR_CLASS_PALADIN)
{
if(_attackcount > 2 && (parseInt(me.hp*100/me.hpmax) < NTConfig_UseRedemptionHP || parseInt(me.mp*100/me.mpmax) < NTConfig_UseRedemptionMP))
{
if(NTC_PutSkill(124, NTC_HAND_RIGHT))
NTC_PingDelay(1000);
}
}
if(NTConfig_UseFindItem && me.classid == NTC_CHAR_CLASS_BARBARIAN && _attackcount > 2)
{
if(!NTA_CheckForCloseMonsters(5))
{
//Print("ÿc<No Monsters close - looting");
NTA_FindItem(NTConfig_FindItemRange);
}
}
if(me.classid == NTC_CHAR_CLASS_NECROMANCER && _RevCount <= 25)
{
if(_attackcount > 2)
ReviveDead();
}
if(me.classid == NTC_CHAR_CLASS_NECROMANCER)
{
_SumBreak = 0;
if(_attackcount > 2)
{
NTC_CastSkill(68, NTC_HAND_RIGHT); // Bone Armor
if(_SkeleCount < NTConfig_Skele + 1 || _MageCount < NTConfig_Mage + 1)
{
if(_SkeleCount == _MageCount)
{
for(var i = 0 ; i < 5 ; i++)
{
SkeleDead();
}
}
else if(_SkeleCount > _MageCount || _SkeleCount > NTConfig_Skele + 1)
{
for(var i = 0 ; i < 5 ; i++)
{
MageDead();
}
}
else if(_MageCount > _SkeleCount || _SkeleMage > NTConfig_Mage + 1)
{
for(var i = 0 ; i < 5 ; i++)
{
SkeleDead();
}
}
}
else
{
if(_SumCount >= 200)
{
_SumCount = 30;
_SkeleCount = _SkeleCount - 3;
_MageCount = _MageCount - 3;
}
for(var i = 0 ; i < 10 ; i++)
{
ReviveDead();
}
}
}
}
if(pickitem && _attackcount > 0)
NTSI_PickItems();
switch(safelevel)
{
case 1:
return NTTMGR_CheckSafe(0x00, NTConfig_CheckMercSafe&0x01);
case 2:
return NTTMGR_CheckSafe(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe);
}
return true;
}
function NTA_IsValidMonster(monster)
{
var _classid;
if(monster.hp <= 0 || monster.mode == 0 || monster.mode == 12)
return false;
_classid = monster.classid;
if((me.areaid == 108) && ((7759 <= me.x <= 7761) && (me.y == 5267)) && GetDistance(me.x,me.y,monster.x,monster.y) <= 10 )
return false;
if (_classid >= 419 && _classid <= 427)
return false;
if(monster.name == GetLocaleString(3162) && GetDistance(me.x,me.y,monster.x,monster.y) <= 25 )
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;
if(monster.hp <= 0 || monster.mode == 0 || monster.mode == 12)
return false;
if(((_classid >= 110 && _classid <= 113) || _classid == 608) && monster.mode == 8) // ignore flying scavengers
return false;
if(_classid == 68 && monster.mode == 14) // ignore burrowing maggots
return false;
if(_classid >= 258 && _classid <= 263 && monster.mode == 14) // ignore submerged WaterWatchers
return false;
if(monster.GetState(53) || monster.GetState(96)) // Conversion, Revive
return false;
if(me.classid == NTC_CHAR_CLASS_DRUID)
{
if(!me.GetState(144))
NTC_CastSkill(250, NTC_HAND_RIGHT);
if(!me.GetState(151))
NTC_CastSkill(235, NTC_HAND_RIGHT);
if(!me.GetState(149))
NTC_CastSkill(226, NTC_HAND_RIGHT);
}
if(me.classid == NTC_CHAR_CLASS_NECROMANCER)
{
if(!me.GetState(14))
NTC_CastSkill(68, NTC_HAND_RIGHT)
}
return true;
}
function NTA_GetDamageType(skillid)
{
if(skillid == 74) // Corpse Explosion
return NTA_DAMAGE_PHYSICAL;
if(skillid == 112) // Blessed Hammer
return NTA_DAMAGE_NONE;
switch(GetBaseStat("skills.txt", skillid, 233))
{
case "cold":
return NTA_DAMAGE_COLD;
case "fire":
return NTA_DAMAGE_FIRE;
case "ltng":
return NTA_DAMAGE_LIGHTNING;
case "mag":
return NTA_DAMAGE_MAGIC;
case "pois":
return NTA_DAMAGE_POISON;
case "stun":
return NTA_DAMAGE_NONE;
default:
if(GetBaseStat("skills.txt", skillid, 178) || GetBaseStat("skills.txt", skillid, 182)) // aura or passive
return NTA_DAMAGE_NONE;
}
return NTA_DAMAGE_PHYSICAL;
}
function NTA_GetResistance(enemy, type)
{
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_DetectAttackPattern()
{
switch(me.classid)
{
case NTC_CHAR_CLASS_AMAZON:
return NTA_AmazonAttackPatternInt();
case NTC_CHAR_CLASS_SORCERESS:
return NTA_SorceressAttackPatternInt();
case NTC_CHAR_CLASS_NECROMANCER:
return NTA_NecromancerAttackPatternInt();
case NTC_CHAR_CLASS_PALADIN:
return NTA_PaladinAttackPatternInt();
case NTC_CHAR_CLASS_BARBARIAN:
return NTA_BarbarianAttackPatternInt();
case NTC_CHAR_CLASS_DRUID:
return NTA_DruidAttackPatternInt();
case NTC_CHAR_CLASS_ASSASSIN:
return NTA_AssassinAttackPatternInt();
}
return false;
}
// Return value : 0 = Unrecoverable process, 1 = Unavailable attack, 2 = Onetime fail, 3 = Success
function NTA_Attack(target, firstorder)
{
switch(me.classid)
{
case NTC_CHAR_CLASS_AMAZON:
return NTA_AmazonAttackInt(target, firstorder);
case NTC_CHAR_CLASS_SORCERESS:
return NTA_SorceressAttackInt(target, firstorder);
case NTC_CHAR_CLASS_NECROMANCER:
return NTA_NecromancerAttackInt(target, firstorder);
case NTC_CHAR_CLASS_PALADIN:
return NTA_PaladinAttackInt(target, firstorder);
case NTC_CHAR_CLASS_BARBARIAN:
return NTA_BarbarianAttackInt(target, firstorder);
case NTC_CHAR_CLASS_DRUID:
return NTA_DruidAttackInt(target, firstorder);
case NTC_CHAR_CLASS_ASSASSIN:
return NTA_AssassinAttackInt(target, firstorder);
}
return 0;
}
function NTA_IsWeaponBroken()
{
var _weapon;
_weapon = me.GetItems();
if(_weapon)
{
for(var i = 0 ; i < _weapon.length ; i++)
{
if(_weapon[i].itemflag&0x100)
{
if(_weapon[i].mode == 1 && _weapon[i].itemloc == 4 || _weapon[i].itemloc == 5)
{
Print("ÿc8My weapon broke, I am going to town to repair it.")
NTTMGR_VisitTown();
NTTMGR_TownManager();
break;
}
}
}
}
}
function NTA_HaveArrows()
{
var _weapon;
var _haveAmmo = false;
_weapon = me.GetItems();
if(_weapon)
{
for(var i = 0 ; i < _weapon.length ; i++)
{
if((_weapon[i].classid == 526 || _weapon[i].classid == 528) && _weapon[i].itemloc == 5)
{
if(_weapon[i].GetStat(70) < 10)
{
Print("ÿc8I'm low on "+ _weapon[i].name + ", I am going to town to buy more.")
NTTMGR_VisitTown();
NTTMGR_TownManager();
}
_haveAmmo = true;
break;
}
}
}
if(!_haveAmmo)
{
Print("ÿc8I have no ammo, I am going to town to buy some.")
NTTMGR_VisitTown();
NTTMGR_TownManager();
}
}
// Internal function
function NTA_AmazonAttackPatternInt()
{
var _maxindex, _maxskill;
var _avgskilllevel = new Array();
_avgskilllevel[0] = me.GetSkill(35, false);
_avgskilllevel[1] = parseInt((me.GetSkill(31, false) + me.GetSkill(11, false) + me.GetSkill(21, false)) /3 );
_avgskilllevel[2] = me.GetSkill(26, false);
_maxindex = -1;
_maxskill = 0;
for(var i = 0 ; i < _avgskilllevel.length ; i++)
{
if(_avgskilllevel[i] > _maxskill)
{
_maxindex = i;
_maxskill = _avgskilllevel[i];
}
}
switch(_maxindex)
{
case 0: // Lightning Fury for Javazon
NTConfig_AttackSkill[1] = 35;
NTConfig_AttackSkill[2] = 35;
NTConfig_AttackSkill[3] = 35;
NTConfig_AttackSkill[4] = 35;
NTConfig_AttackSkill[5] = 35;
NTConfig_AttackSkill[6] = 35;
NTConfig_AttackSkill[7] = 24;
break;
case 1: // Freezing Arrow for Bowzon
NTConfig_AttackSkill[1] = 31;
NTConfig_AttackSkill[2] = 31;
NTConfig_AttackSkill[3] = 31;
NTConfig_AttackSkill[4] = 31;
NTConfig_AttackSkill[5] = 31;
NTConfig_AttackSkill[6] = 31;
NTConfig_AttackSkill[7] = 31;
break;
case 2: // Cold Arrow + Strafe for Bowzon
NTConfig_AttackSkill[0] = 11;
NTConfig_AttackSkill[1] = 26;
NTConfig_AttackSkill[2] = 26;
NTConfig_AttackSkill[3] = 26;
NTConfig_AttackSkill[4] = 26;
NTConfig_AttackSkill[5] = 26;
NTConfig_AttackSkill[6] = 26;
NTConfig_AttackSkill[7] = 22;
break;
}
return (NTConfig_AttackSkill[1] && NTConfig_AttackSkill[3]);
}
function NTA_AmazonAttackInt(target, firstorder)
{
var _primaryindex;
if(NTTMGR_CheckCurse(NTConfig_CheckSelfSafe&0x10, NTConfig_CheckMercSafe&0x10))
{
if(!NTTMGR_VisitTown())
return 0;
}
if(me.GetSkill(12, false) >= 1)
NTA_HaveArrows();
else
NTA_IsWeaponBroken();
if(firstorder && NTConfig_AttackSkill[0] > 0 && NTA_GetResistance(target, _NTA_SkillDamage[0]) < 100)
{
if(GetDistance(me, target) > _NTA_SkillRange[0] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[0], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(!NTC_CastSkill(NTConfig_AttackSkill[0], _NTA_SkillHand[0], target))
return 2;
return 3;
}
_primaryindex = (target.spectype&0x0A) ? 1 : 3;
switch(target.classid)
{
case 243://Diablo
case 544://Baal
case 242:
if(!NTA_AmazonCastSkillInt(7, target))
return 2;
return 3;
default:
break;
}
if(NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) <= 90)
{
if(!NTA_AmazonCastSkillInt(_primaryindex, target))
return 2;
return 3;
}
if(NTConfig_AttackSkill[5] > 0 && NTA_GetResistance(target, _NTA_SkillDamage[5]) > 80)
{
if(!NTA_AmazonCastSkillInt(5, target))
return 2;
return 3;
}
if(NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) < 100 || (_primaryindex == 1 && NTC_GetMerc()))
{
if(!NTA_AmazonCastSkillInt(_primaryindex, target))
return 2;
return 3;
}
return 1;
}
function NTA_AmazonCastSkillInt(index, target)
{
if(GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[index], NTC_HAND_LEFT, target);
if(NTConfig_AttackSkill[index+1] > 0)
{
if(GetDistance(me, target) > _NTA_SkillRange[index+1] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index+1], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[index+1], _NTA_SkillHand[index+1], target);
}
}
function NTA_SorceressAttackPatternInt()
{
var _maxindex, _maxskill;
var _avgskilllevel = new Array();
_avgskilllevel[0] = parseInt((me.GetSkill(59, false)+me.GetSkill(39, false)+me.GetSkill(45, false)+me.GetSkill(55, false))/4);
_avgskilllevel[1] = parseInt((me.GetSkill(53, false)+me.GetSkill(38, false)+me.GetSkill(48, false)+me.GetSkill(49, false))/4);
_avgskilllevel[2] = parseInt((me.GetSkill(47, false)+me.GetSkill(36, false)+me.GetSkill(56, false)+me.GetSkill(64, false))/4);
_avgskilllevel[3] = parseInt((me.GetSkill(47, false)+me.GetSkill(36, false)+me.GetSkill(56, false))/3);
_maxindex = -1;
_maxskill = 0;
for(var i = 0 ; i < _avgskilllevel.length ; i++)
{
if(_avgskilllevel[i] > _maxskill)
{
_maxindex = i;
_maxskill = _avgskilllevel[i];
}
}
switch(_maxindex)
{
case 0: // Blizzard + Glacial Spike
NTConfig_AttackSkill[1] = 59;
NTConfig_AttackSkill[2] = 55;
NTConfig_AttackSkill[3] = 59;
NTConfig_AttackSkill[4] = 55;
break;
case 1: // Chain Lightning + Lightning
NTConfig_AttackSkill[1] = 49;
NTConfig_AttackSkill[3] = 53;
break;
case 2: // Fire Ball + Frozen Orb
NTConfig_AttackSkill[0] = 64;
NTConfig_AttackSkill[1] = 47;
NTConfig_AttackSkill[3] = 47;
NTConfig_AttackSkill[5] = 64;
NTConfig_AttackSkill[6] = 55;
break;
case 3: // Fire Ball + Meteor
NTConfig_AttackSkill[1] = 56;
NTConfig_AttackSkill[2] = 47;
NTConfig_AttackSkill[3] = 56;
NTConfig_AttackSkill[4] = 47;
break;
}
return (NTConfig_AttackSkill[1] && NTConfig_AttackSkill[3]);
}
function NTA_SorceressAttackInt(target, firstorder)
{
var _primaryindex;
var _attackSkill;
if(NTTMGR_CheckCurse(NTConfig_CheckSelfSafe&0x10, NTConfig_CheckMercSafe&0x10))
{
if(!NTTMGR_VisitTown())
return 0;
}
if(firstorder && NTConfig_AttackSkill[0] > -1 && NTA_GetResistance(target, _NTA_SkillDamage[0]) < 100 && me.GetSkillStatus(NTConfig_AttackSkill[0]) != 8)
{
if(GetDistance(me, target) > _NTA_SkillRange[0] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[0], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(!NTC_CastSkill(NTConfig_AttackSkill[0], _NTA_SkillHand[0], target))
return 2;
return 3;
}
if(NTConfig_CastStatic < 100 && parseInt(target.hp*100/target.hpmax) > NTConfig_CastStatic && NTA_GetResistance(target, NTA_DAMAGE_LIGHTNING) <= 80 && (target.name == "Mephisto" || target.name == "Andariel" || target.name == "Duriel" ||target.name == "Diablo" || target.name == "Baal"))
{
var _staticlevel = NTC_GetSkillLevel(42);
if(_staticlevel > 0)
{
var _staticrange;
var _castx, _casty;
_staticrange = Math.floor((5+_staticlevel-1)*2/3);
if(GetDistance(me, target) > _staticrange || !CheckCollision(me, target, 6))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _staticrange, 6);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(target.x < me.x)
_castx = me.x - 1;
else if(target.x > me.x)
_castx = me.x + 1;
else
_castx = me.x;
if(target.y < me.y)
_casty = me.y - 1;
else if(target.y > me.y)
_casty = me.y + 1;
else
_casty = me.y;
if(!CheckCollision(target.areaid, _castx, _casty, 1))
{
_castx = me.x;
_casty = me.y;
}
if(!NTC_CastSkill(42, NTC_HAND_RIGHT, _castx, _casty))
return 2;
return 3;
}
}
_primaryindex = (target.spectype&0x0A) ? 1 : 3;
_attackSkill = NTA_GetAttackType(target, _primaryindex, 91, 81, 81); // delete
if(NTConfig_AttackSkill[_attackSkill] > -1)
{
if(!NTA_SorceressCastSkillInt(_attackSkill, target, _primaryindex))
return 2;
return 3;
}
if(NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) < 100 || (_primaryindex == 1 && NTC_GetMerc()))
{
if(!NTA_SorceressCastSkillInt(_primaryindex, target, _primaryindex))
return 2;
return 3;
}
return 1;
}
function NTA_SorceressCastSkillInt(index, target, primaryIndex)
{
var secondarySkill = 0;
_haveCL = NTC_GetSkillLevel(53); // check to see if we even have CL
_havetele = NTC_GetSkillLevel(54);
if(_sorcattack >= 20)
_sorcattack = 0;
if(_havetele && NTConfig_DancingSorc)
{
NTTMGR_CheckSafe(false, 0x01); // revive merc
if((NTA_CheckMyHp() || ((target.GetState(28) <= 0) && NTA_CheckMercInfinity())) || (_sorcattack%NTConfig_AttackJump) == 0)
{
if(target.GetState(28) <= 0){Print("ÿc;target not convicted");Print("ÿc;let's dance");}
NTA_Bounce(target);
}
}
if(me.GetSkillStatus(NTConfig_AttackSkill[index]) != 8)
{
if(GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(target.name == "Baal" && NTConfig_AttackSkill[10] > -1 )
return NTC_CastSkill(NTConfig_AttackSkill[10], _NTA_SkillHand[10], target);
if((target.name == "Mephisto" || target.name == "Andariel" || target.name == "Duriel" || target.name == "Diablo") && NTConfig_AttackSkill[9] > -1 && target.name != "Baal")
return NTC_CastSkill(NTConfig_AttackSkill[9], _NTA_SkillHand[9], target);
if(target.name == "Duriel" && NTConfig_UseColdOnDury)
{
if(NTConfig_UseOrb)
{
return (NTC_CastSkill(64, NTC_HAND_LEFT, target))
}
if(NTConfig_UseBlizz)
{
return (NTC_CastSkill(59, NTC_HAND_LEFT, target))
}
}
if(NTConfig_ChainLightOnLightImmunes && NTA_GetResistance(target, NTA_DAMAGE_LIGHTNING) >= 90 && _haveCL > 0)
{
return(NTC_CastSkill(53, NTC_HAND_LEFT, target))
}
return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], target);
}
secondarySkill = NTA_GetAttackType (target, primaryIndex+1, 81, 81, 81); // delete
if(NTConfig_AttackSkill[secondarySkill] > -1)
{
if(GetDistance(me, target) > _NTA_SkillRange[secondarySkill] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index+1], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[secondarySkill], _NTA_SkillHand[secondarySkill], target);
}
for(var i = 0 ; i < 25 ; i++)
{
NTC_Delay(NTC_DELAY_FRAME);
if(me.GetSkillStatus(NTConfig_AttackSkill[index]) != 8)
break;
}
return false;
}
function NTA_NecromancerAttackPatternInt()
{
var _maxindex, _maxskill;
var _avgskilllevel = new Array();
_avgskilllevel[0] = me.GetSkill(84, fasle);
_maxindex = -1;
_maxskill = 0;
for(var i = 0 ; i < _avgskilllevel.length ; i++)
{
if(_avgskilllevel[i] > _maxskill)
{
_maxindex = i;
_maxskill = _avgskilllevel[i];
}
}
switch(_maxindex)
{
case 0:
NTConfig_AttackSkill[0] = 84;
NTConfig_AttackSkill[1] = 84;
NTConfig_AttackSkill[3] = 84;
break;
}
return (NTConfig_AttackSkill[1] && NTConfig_AttackSkill[3]);
}
function GetCurseState(skillid)
{
if(NTConfig_Curse == 66)
return 9;
if(NTConfig_Curse == 71)
return 23;
if(NTConfig_Curse == 76)
return 55;
if(NTConfig_Curse == 77)
return 56;
if(NTConfig_Curse == 81)
return 59;
if(NTConfig_Curse == 82)
return 58;
if(NTConfig_Curse == 86)
return 57;
if(NTConfig_Curse == 87)
return 60;
if(NTConfig_Curse == 91)
return 61;
}
function NTA_NecromancerAttackInt(target, firstorder)
{
var _primaryindex;
if(NTTMGR_CheckCurse(NTConfig_CheckSelfSafe&0x10, NTConfig_CheckMercSafe&0x10))
{
if(!NTTMGR_VisitTown())
return 0;
}
if(!target.GetState(GetCurseState()))
NTC_CastSkill(NTConfig_Curse, NTC_HAND_RIGHT, target)
if(firstorder && NTConfig_AttackSkill[0] > 0 && NTA_GetResistance(target, _NTA_SkillDamage[0]) < 100 && me.GetSkillStatus(NTConfig_AttackSkill[0]) != 8)
{
if(GetDistance(me, target) > _NTA_SkillRange[0] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[0], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
}
_primaryindex = (target.spectype&0x0A) ? 1 : 3;
if(NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) <= 90)
{
if(!NTA_NecromancerCastSkillInt(_primaryindex, target))
return 2;
return 3;
}
if(NTConfig_AttackSkill[5] > 0 && NTA_GetResistance(target, _NTA_SkillDamage[5]) <= 80)
{
if(_SpearCount < 6 && target.name == "Achmel the Cursed" )
{
if(_SpearCount < 1)
NTM_WalkTo(me.x+3, me.y);
NTC_CastSkill(67, NTC_HAND_RIGHT, target);
_SpearCount++;
//Print(_SpearCount);
}
else if(target.name == "Horadrim Ancient")
{
NTM_MoveTo(target.areaid, target.x, target.y, 0);
NTC_PingDelay(1000);
}
else
{
NTA_NecromancerCastSkillInt(5, target)
return 2;
}
return 3;
}
if(NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) < 100 || (_primaryindex == 1 && NTC_GetMerc()))
{
if(!NTA_NecromancerCastSkillInt(_primaryindex, target))
return 2;
return 3;
}
return 1;
}
function NTA_NecromancerCastSkillInt(index, target)
{
if(me.GetSkillStatus(NTConfig_AttackSkill[index]) != 8)
{
if(GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], target);
}
if(NTConfig_AttackSkill[index+1] > 0)
{
if(GetDistance(me, target) > _NTA_SkillRange[index+1] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index+1], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[index+1], _NTA_SkillHand[index+1], target);
}
for(var i = 0 ; i < 25 ; i++)
{
NTC_Delay(NTC_DELAY_FRAME);
if(me.GetSkillStatus(NTConfig_AttackSkill[index]) != 8)
break;
}
return false;
}
function NTA_PaladinAttackPatternInt()
{
var _maxindex, _maxskill;
var _avgskilllevel = new Array();
_avgskilllevel[0] = parseInt((me.GetSkill(112, false)+me.GetSkill(108, false)+me.GetSkill(115, false))/3);
_avgskilllevel[1] = parseInt((me.GetSkill(106, false)+me.GetSkill(96, false))/2);
_avgskilllevel[2] = parseInt((me.GetSkill(121, false)+me.GetSkill(101, false)+me.GetSkill(118, false))/3);
_maxindex = -1;
_maxskill = 0;
for(var i = 0 ; i < _avgskilllevel.length ; i++)
{
if(_avgskilllevel[i] > _maxskill)
{
_maxindex = i;
_maxskill = _avgskilllevel[i];
}
}
_maxindex = 0;
switch(_maxindex)
{
case 0: // Blessed Hammer
NTConfig_AttackSkill[1] = 112;
NTConfig_AttackSkill[2] = 113;
NTConfig_AttackSkill[3] = 112;
NTConfig_AttackSkill[4] = 113;
NTConfig_AttackSkill[5] = 101;
NTConfig_AttackSkill[6] = 113;
break;
case 1: // Zeal
NTConfig_AttackSkill[1] = 106;
NTConfig_AttackSkill[2] = 122;
NTConfig_AttackSkill[3] = 106;
NTConfig_AttackSkill[4] = 122;
break;
case 2: // Fist of the Heavens
NTConfig_AttackSkill[1] = 121;
NTConfig_AttackSkill[2] = 123;
NTConfig_AttackSkill[3] = 121;
NTConfig_AttackSkill[4] = 123;
break;
}
return (NTConfig_AttackSkill[1] && NTConfig_AttackSkill[3]);
}
function NTA_PaladinAttackInt(target, firstorder)
{
var _primaryindex;
if(NTTMGR_CheckCurse(NTConfig_CheckSelfSafe&0x10, NTConfig_CheckMercSafe&0x10))
{
if(!NTTMGR_VisitTown())
return 0;
}
if(firstorder && NTConfig_AttackSkill[0] > 0 && NTA_GetResistance(target, NTA_DAMAGE_MAGIC) < 100)
{
if(GetDistance(me, target) > _NTA_SkillRange[0] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[0], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(!NTC_CastSkill(NTConfig_AttackSkill[0], _NTA_SkillHand[0], target))
return 2;
return 3;
}
_primaryindex = (target.spectype&0x0A) ? 1 : 3;
if(NTA_GetResistance(target, NTA_DAMAGE_MAGIC) < 100)
{
if(_NTA_SkillRange[_primaryindex] < 4 && !CheckCollision(target.areaid, target.x, target.y, 1))
return 1;
if(!NTA_PaladinCastSkillInt(_primaryindex, target))
return 2;
return 3;
}
if(NTConfig_AttackSkill[5] > 0 && NTA_GetResistance(target, NTA_DAMAGE_MAGIC) >= 100)
{
if(_NTA_SkillRange[5] < 4 && !CheckCollision(target.areaid, target.x, target.y, 1))
return 1;
if(!NTA_PaladinCastSkillInt(5, target))
return 2;
return 3;
}
return 1;
}
function NTA_PaladinCastSkillInt(index, target)
{
if(NTConfig_AttackSkill[index] == 112)
{
if(me.x-target.x < 1 || me.x-target.x > 2 || me.y-target.y < 1 || me.y-target.y > 2)
{
if(CheckCollision(target.areaid, target.x+2, target.y+2, 1))
NTM_MoveTo(target.areaid, target.x+2, target.y+2, 0);
else if(me.x-target.x < -4 || me.x-target.x > 2 || me.y-target.y < 0 || me.y-target.y > 2)
NTM_MoveTo(target.areaid, target.x-4, target.y, 0);
}
}
else
{
if(GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
}
if(NTConfig_AttackSkill[index+1] > 0)
NTC_PutSkill(NTConfig_AttackSkill[index+1], NTC_HAND_RIGHT);
return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], target);
}
function NTA_BarbarianAttackPatternInt()
{
var _maxindex, _maxskill;
var _avgskilllevel = new Array();
_avgskilllevel[0] = me.GetSkill(151, false);
_maxindex = -1;
_maxskill = 0;
for(var i = 0 ; i < _avgskilllevel.length ; i++)
{
if(_avgskilllevel[i] > _maxskill)
{
_maxindex = i;
_maxskill = _avgskilllevel[i];
}
}
switch(_maxindex)
{
case 0: // Whirlwind
NTConfig_AttackSkill[1] = 151;
NTConfig_AttackSkill[3] = 151;
NTConfig_AttackSkill[5] = 152;
break;
}
return (NTConfig_AttackSkill[1] && NTConfig_AttackSkill[3]);
}
function NTA_BarbarianAttackInt(target, firstorder)
{
var _primaryindex;
if(NTTMGR_CheckCurse(NTConfig_CheckSelfSafe&0x10, NTConfig_CheckMercSafe&0x10))
{
if(!NTTMGR_VisitTown())
return 0;
}
if(firstorder && NTConfig_AttackSkill[0] > 0 && NTA_GetResistance(target, _NTA_SkillDamage[0]) < 100)
{
if(GetDistance(me, target) > _NTA_SkillRange[0] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[0], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(!NTC_CastSkill(NTConfig_AttackSkill[0], _NTA_SkillHand[0], target))
return 2;
return 3;
}
_primaryindex = (target.spectype&0x0A) ? 1 : 3;
if(NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) < 100)
{
if((_NTA_SkillRange[_primaryindex] < 4 || NTConfig_AttackSkill[_primaryindex] == 151) && !CheckCollision(target.areaid, target.x, target.y, 1))
return 1;
if(!NTA_BarbarianCastSkillInt(_primaryindex, target))
return 2;
return 3;
}
if(NTConfig_AttackSkill[5] > 0 && NTA_GetResistance(target, _NTA_SkillDamage[5]) < 100)
{
if((_NTA_SkillRange[5] < 4 || NTConfig_AttackSkill[5] == 151) && !CheckCollision(target.areaid, target.x, target.y, 1))
return 1;
if(!NTA_BarbarianCastSkillInt(5, target))
return 2;
return 3;
}
return 1;
}
function NTA_BarbarianCastSkillInt(index, target)
{
if(NTConfig_AttackSkill[index] == 151)
{
var _castx, _casty;
if(GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 5))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 5);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
_castx = target.x > me.x ? target.x+3 : target.x-3;
_casty = target.y > me.y ? target.y+3 : target.y-3;
return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], _castx, _casty);
}
if(GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], target);
}
function NTA_DruidAttackInt(target, firstorder)
{
var _primaryindex;
if(NTTMGR_CheckCurse(NTConfig_CheckSelfSafe&0x10, NTConfig_CheckMercSafe&0x10))
{
if(!NTTMGR_VisitTown())
return 0;
}
if(firstorder && NTConfig_AttackSkill[0] > 0 && NTA_GetResistance(target, _NTA_SkillDamage[0]) < 100)
{
if(GetDistance(me, target) > NTConfig_AttackSkill[0] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(!NTC_CastSkill(NTConfig_AttackSkill[0], _NTA_SkillHand[0], target))
return 2;
return 3;
}
_primaryindex = (target.spectype&0x0A) ? 1 : 3;
if(me.GetSkill(245, true) > 1)
if(target.name == "Andariel" || target.name == "Baal" || target.name == "Mephisto" || target.name == "Diablo")
{
if(!NTA_DruidCastSkillIntNear(_primaryindex, target))
return 2;
return 3;
}
if(NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) <= 90)
{
if(!NTA_DruidCastSkillInt(_primaryindex, target))
return 2;
return 3;
}
if(NTConfig_AttackSkill[5] > 0 && NTA_GetResistance(target, _NTA_SkillDamage[5]) <= 80)
{
if(!NTA_DruidCastSkillInt(5, target))
return 2;
return 3;
}
if(NTA_GetResistance(target, _NTA_SkillDamage[index]) < 100 || (_primaryindex == 1 && NTC_GetMerc()))
{
if(!NTA_DruidCastSkillInt(_primaryindex, target))
return 2;
return 3;
}
return 1;
}
function NTA_DruidCastSkillIntNear(index, target)
{
if(GetDistance(me, target) > 3 || !CheckCollision(me, target, 4))
NTM_MoveTo(target.areaid, target.x, target.y, 0);
return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], target);
if(NTConfig_AttackSkill[index+1] > 0)
{
if(GetDistance(me, target) > 3 || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, 3, 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[index+1], _NTA_SkillHand[index+1], target);
}
}
function NTA_DruidCastSkillInt(index, target)
{
if(GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(!me.GetState(139))
NTC_CastSkill(223, NTC_HAND_RIGHT) // Werewolf
else if(!me.GetState(140))
NTC_CastSkill(228, NTC_HAND_RIGHT) // Werebear
return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], target);
if(NTConfig_AttackSkill[index+1] > 0)
{
if(GetDistance(me, target) > _NTA_SkillRange[index+1] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index+1], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[index+1], _NTA_SkillHand[index+1], target);
}
}
function NTA_AssassinAttackPatternInt()
{
return false;
}
function NTA_AssassinAttackInt(target, firstorder)
{
var _primaryindex;
var _attackIndex;
var _skillCasted = 0;
if(NTTMGR_CheckCurse(NTConfig_CheckSelfSafe&0x10, NTConfig_CheckMercSafe&0x10))
{
if(!NTTMGR_VisitTown())
return 0;
}
if(firstorder && NTConfig_AttackSkill[0] > -1 && NTA_GetResistance(target, _NTA_SkillDamage[0]) < 100)
{
if(GetDistance(me, target) > _NTA_SkillRange[0] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[0], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(!NTC_CastSkill(NTConfig_AttackSkill[0], _NTA_SkillHand[0], target))
return 2;
return 3;
}
if(NTConfig_UseTraps)
NTA_CheckTraps(target);
_primaryindex = (target.spectype&0x0A) ? 1 : 3;
_attackIndex = NTA_GetAttackType(target, _primaryindex, 91, 81, 81);
if(NTConfig_AttackSkill[_attackIndex] > -1 )
{
_skillCasted = _attackIndex;
if(_NTA_SkillRange[_attackIndex] < 4 && !CheckCollision(target.areaid, target.x, target.y, 1))
return 1;
if(!NTA_AssassinCastSkillInt(_attackIndex, target, _primaryindex))
return 2;
return 3;
}
if(NTConfig_UseTraps) {
if(_skillCasted == 0)
NTC_Delay(NTConfig_AttackSkill);
return 3;
}
return 1;
}
function NTA_AssassinCastSkillInt(index, target, primaryIndex)
{
var secondarySkill = 0;
if(me.GetSkillStatus(NTConfig_AttackSkill[index]) != 8)
{
if(GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], target);
}
secondarySkill = NTA_GetAttackType (target, primaryIndex+1, 81, 81, 81);
if(NTConfig_AttackSkill[secondarySkill] > -1)
{
if(GetDistance(me, target) > _NTA_SkillRange[secondarySkill] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[secondarySkill], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[secondarySkill], _NTA_SkillHand[secondarySkill], target);
}
for(var i = 0 ; i < 25 ; i++)
{
NTC_Delay(NTC_DELAY_FRAME);
if(me.GetSkillStatus(NTConfig_AttackSkill[index]) != 8)
break;
}
return false;
}
function NTA_CheckTraps(target)
{
var traps=NTC_FindUnit(NTC_UNIT_MONSTER);
var trapcount =0;
//var warr=0;
var x,y;
var parent;
var _isActBoss = false;
var _trapOffset;
// || target.name == GetLocaleString(3021) - Andariel
if(target.name == GetLocaleString(3062) || target.name == GetLocaleString(3054)
|| target.name == GetLocaleString(3060) || target.name == GetLocaleString(3061))
_isActBoss = true;
if (traps){
do{
if (traps.classid == 412 || traps.classid == 413 || traps.classid == 416 || traps.classid == 417){
parent = traps.GetParent();
if(parent != null && parent.name == me.name) {
if(GetDistance(target.x,target.y,traps.x,traps.y)< (_isActBoss?NTConfig_MinBossTrapRange:NTConfig_MinTrapRange) && traps.hp > 100 ) {
trapcount=trapcount+1;
}
}
}
/*if ((traps.classid == 418 || traps.classid == 419) && traps.mode == 12){ // apparently 417/418 are warrior/master. commented out for now
warr=1;
}*/
}while(traps.GetNext())
if (trapcount < (_isActBoss?NTConfig_NumBossTrap:NTConfig_NumTraps) && target.hp>0){
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, 13, 10);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
_trapOffset = NTA_GetTrapAttackPattern(_isActBoss);
for(var i=0; i < 5; i++) {
if(NTConfig_TrapSet[i] > 0) {
if(i == 0 || i == 2 || i == 3) // Added delays to prevent trap miscast
NTC_Delay(25);
NTC_CastSkill((_isActBoss?NTConfig_TrapSet[0]:NTConfig_TrapSet[i]), NTC_HAND_RIGHT, target.x + _trapOffset[i][0], target.y + _trapOffset[i][1]);
}
}
}
/*if (warr!=0)
NTP_DoPrecast(false);*/
}
}
function NTA_GetTrapAttackPattern(isActBoss) {
var _attackPattern = new Array(5);
var _bossOffset = 1;
if(NTConfig_TrapAttackPattern == 1) { // Pentagram
_attackPattern[0] = [-2 - (isActBoss?_bossOffset:0), -2 - (isActBoss?_bossOffset:0)];
_attackPattern[1] = [0, 2 + (isActBoss?_bossOffset:0)];
_attackPattern[2] = [2 + (isActBoss?_bossOffset:0), -2 - (isActBoss?_bossOffset:0)];
_attackPattern[3] = [-3 - (isActBoss?_bossOffset:0), 1 + (isActBoss?_bossOffset:0)];
_attackPattern[4] = [3 + (isActBoss?_bossOffset:0), 1 + (isActBoss?_bossOffset:0)];
}
else if(NTConfig_TrapAttackPattern == 2) { // X - axis
_attackPattern[0] = [0, 0];
_attackPattern[1] = [1 + (isActBoss?_bossOffset:0), 0];
_attackPattern[2] = [-1 - (isActBoss?_bossOffset:0), 0];
_attackPattern[3] = [2 + (isActBoss?_bossOffset:0), 0];
_attackPattern[4] = [-2 - (isActBoss?_bossOffset:0), 0];
}
else if(NTConfig_TrapAttackPattern == 3) { // Y - axis
_attackPattern[0] = [0, 0];
_attackPattern[1] = [0, 1 + (isActBoss?_bossOffset:0)];
_attackPattern[2] = [0, -1 - (isActBoss?_bossOffset:0)];
_attackPattern[3] = [0, 2 + (isActBoss?_bossOffset:0)];
_attackPattern[4] = [0, -2 - (isActBoss?_bossOffset:0)];
}
else { // quincunx
_attackPattern[0] = [2 + (isActBoss?_bossOffset:0), 2 + (isActBoss?_bossOffset:0)];
_attackPattern[1] = [-2 - (isActBoss?_bossOffset:0), -2 - (isActBoss?_bossOffset:0)];
_attackPattern[2] = [-2 - (isActBoss?_bossOffset:0), 2 + (isActBoss?_bossOffset:0)];
_attackPattern[3] = [2 + (isActBoss?_bossOffset:0), -2 - (isActBoss?_bossOffset:0)];
_attackPattern[4] = [0, 0];
}
return _attackPattern;
}
function NTA_CheckMercInfinity()
{
var _weapon, _merc;
var Merc_HaveInfinty = false;
_merc = NTC_GetMerc();
if(!_merc)
{
{
//Print("ÿc8merc is dead or not hired");
}
return false;
}
if(_merc && _merc.hp > 0 && _merc.mode != 0 && _merc.mode != 12)
{
_weapon = _merc.GetItems();
if(_weapon){
for(var i = 0 ; i < _weapon.length && !Merc_HaveInfinty ; i++){
if((_weapon[i].itemflag&0x4000000) && _weapon[i].itemprefix == 20566){
Merc_HaveInfinty = true;
{
//Print("ÿc8merc has infinity");
}
return true;
}
}
}
}
if(!Merc_HaveInfinty)
{
// Print("ÿc8merc has no infinity");
return false;
}
}
function NTA_CheckMyHp()
{
_LifeMax = me.hpmax;
_ManaMax = me.mpmax;
if(NTConfig_DanceStartHp > 0 || NTConfig_DanceStartMp > 0)
{
if(parseInt(me.hp*100/_LifeMax) < NTConfig_DanceStartHp || parseInt(me.mp*100/_ManaMax) < NTConfig_DanceStartMp)
{
return true;
}
}
else
return false;
}
function NTA_Bounce(target)
{
if (me.x - target.x >= 0 && me.y - target.y >= 0)
NTC_CastSkill(54, NTC_HAND_RIGHT, target.x - 9, target.y - 9);
else if (me.x - target.x >= 0 && me.y - target.y < 0)
NTC_CastSkill(54, NTC_HAND_RIGHT, target.x - 9, target.y + 9);
else if (me.x - target.x < 0 && me.y - target.y >= 0)
NTC_CastSkill(54, NTC_HAND_RIGHT, target.x + 9, target.y + 9);
else
NTC_CastSkill(54, NTC_HAND_RIGHT, target.x + 9, target.y - 9);
_sorcattack = 0;
}
function NTA_IsActBoss(classid)
{
switch(classid)
{
case 156: //Andariel
case 211: //Duriel
case 242: //Mephisto
case 243: //Diablo
case 544: //Baal
return true;
}
return false;
}
function NTA_FindItem(range)
{
var _corpse;
var _orgx;
var _orgy;
var _startTick;
var _reposition = false;
if(NTC_GetSkillLevel(131) < 1)
return false;
if(arguments.length < 1 || !range)
range = 25;
_corpse = NTC_FindUnit(NTC_UNIT_MONSTER);
_orgx = me.x;
_orgy = me.y;
NTC_PingDelay(100);
NTC_SwapWeapons(2);
if(_corpse)
{
do
{
if(GetDistance(_orgx, _orgy, _corpse.x, _corpse.y) <= range && (_corpse.hp <= 0 || _corpse.mode == 0 || _corpse.mode == 12) && _corpse.GetState(118) == 0 && NTA_IsLootable(_corpse.classid))
{
if(GetDistance(me.x, me.y, _corpse.x, _corpse.y) >= 8)
{
if(!NTM_MoveTo(me.areaid, _corpse.x, _corpse.y))
continue;
}
_startTick = GetTickCount();
while(_corpse.GetState(118) != 0x400000 && (_corpse.hp <= 0 || _corpse.mode == 0 || _corpse.mode == 12) && !_corpse.IsAttackable())
{
NTC_CastSkill(131, NTC_HAND_RIGHT, _corpse);
NTC_PingDelay(50);
if(GetTickCount() >= _startTick + 1000 && !_reposition) // repositioning after 1sec
{
_reposition = true;
if(!NTM_MoveTo(me.areaid, _corpse.x+1, _corpse.y+1))
break;
}
if(GetTickCount() >= _startTick + 2500) // skipping monster after 2.5sec
{
var filehandle = FileOpen("FailedtoLoot.txt", 2);
var dateString = new Date().toLocaleFormat("%a %m/%d/%y %H:%M:%S");
if(filehandle)
{
filehandle.WriteLine("[" + dateString + "] Could not loot: " + _corpse.name +" [" + _corpse.classid + "](Location: " + me.areaid + ")");
filehandle.Close();
}
Print("ÿc;Could not loot: " + _corpse.name +" [" + _corpse.classid + "](Location: " + me.areaid + ")");
break;
}
}
}
} while(_corpse.GetNext());
NTC_PingDelay(100);
NTC_SwapWeapons(0);
NTC_PingDelay(100);
NTSI_PickItems();
return true;
}
return false;
}
function NTA_IsLootable(classid)
{
switch(classid)
{
case 179: // Cow
return false;
break;
default:
return true;
break;
}
}
|
|
|
04/26/2014, 22:43
|
#2
|
elite*gold: 0
Join Date: Dec 2013
Posts: 39
Received Thanks: 0
|
bump
I don't know why it wont attack the dead bodies
please help
|
|
|
04/28/2014, 17:30
|
#3
|
Administrator
elite*gold: 41364
Join Date: Jan 2010
Posts: 22,729
Received Thanks: 12,625
|
Looks like you screwed up attack ranges for about just any skill, but normal attack and find potion (which is not even an attack). The latter is probably also your problem: you are trying to assign find potion as an attack skill even though it is not one - it's more like an auxiliary skill if you will.
Attacks will be used to target monsters that are still alive (in other words: attackable) whereas find potion can only be used on corpses. Unless you change the whole definition of what is to be considered a valid target by the attack algorithm, your approach cannot work.
If this is the only thing you've changed so far in that library, I suggest you start over from scratch with a clean version of that library.
Apparently, there is an existing implementation of find item in that library. Find item and find potion work extremely similar, so the best approach - that is if you don't want to develop your own solution from scratch - is to use what you have in terms of find item and merely adapt it to find potion. If you don't need find item, this will be as simple as replacing the respective skill ID for find item with the one for find potion.
P.S.: No errors merely indicates that the syntax is okay; it does, however, in no way reflect, that your code actually solves the problem at hand.
|
|
|
04/28/2014, 20:13
|
#4
|
elite*gold: 0
Join Date: Dec 2013
Posts: 39
Received Thanks: 0
|
I appreciate the respond im sure it will help
yea I found the other threads reguarding item find implementation and I followed it and didn't work I even changed the skill codes from 142 to 131
and heres the links that I followed
and here
ok here is the original nt attack
Code:
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_SkillHand = new Array(7);
var _NTA_SkillDamage = new Array(7);
var _NTA_SkillRange = new Array(7);
var _CurseState;
var _SpearCount = 0;
var _SumCount = 0;
var _SkeleCount = 0;
var _MageCount = 0;
var _SumBreak = 0;
var _sorcattack = 0;
function NTA_Initialize()
{
if(NTConfig_AttackSkill[1] == 0 || NTConfig_AttackSkill[3] == 0)
NTA_DetectAttackPattern();
for(var i = 0 ; i < 8 ; 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]);
switch(NTConfig_AttackSkill[i])
{
case 280: // Normal Attack
_NTA_SkillRange[i] = 2;
break;
case 6: //Magic Arrow
case 7: //Fire Arrow
_NTA_SkillRange[i] = 20;
break;
case 8: //Inner Sight
_NTA_SkillRange[i] = 13;
break;
case 10: //Jab
_NTA_SkillRange[i] = 3;
break;
case 11: //Cold Arrow
case 12: //Multiple Shot
_NTA_SkillRange[i] = 20;
break;
case 14: //Power Strike
_NTA_SkillRange[i] = 20;
break;
case 15: //Poison Javelin
_NTA_SkillRange[i] = 10;
break;
case 16: //Exploding Arrow
_NTA_SkillRange[i] = 10;
break;
case 17: //Slow Missiles
_NTA_SkillRange[i] = 13;
break;
case 19: //Impale
_NTA_SkillRange[i] = 3;
break;
case 20: //Lightning Bolt
case 21: //Ice arrow
case 22: //Guided arrow
_NTA_SkillRange[i] = 20;
break;
case 24: //Charged Strike
_NTA_SkillRange[i] = 3;
break;
case 25: //Plague jav
_NTA_SkillRange[i] = 10;
break;
case 26://Strafe
case 27://Immolation Arrow
_NTA_SkillRange[i] = 20;
break;
case 30: //Fend
_NTA_SkillRange[i] = 3;
break;
case 31: //Freezing arrow
_NTA_SkillRange[i] = 15;
break;
case 35: //Lightning Fury
_NTA_SkillRange[i] = 12;
break;
case 38: //Charged Bolt
_NTA_SkillRange[i] = 20;
break;
case 44: //Frost Nova
case 48: //Nova
_NTA_SkillRange[i] = 10;
break;
case 64: //Frozen Orb
_NTA_SkillRange[i] = 15;
break;
case 74: //Corpse Explosion
case 84: //Bone Spear
_NTA_SkillRange[i] = 15;
break;
case 92://Poison Nova
_NTA_SkillRange[i] = 7;
break;
case 93://Bone Spirit
_NTA_SkillRange[i] = 25;
break;
case 95: //Revive
_NTA_SkillRange[i] = 20;
case 97: //Smite
_NTA_SkillRange[i] = 3;
break;
case 101: //Holy Bolt
_NTA_SkillRange[i] = 15;
break;
case 106: //Zeal
case 112: //Blessed Hammer
_NTA_SkillRange[i] = 3;
break;
case 144: //Concentrate
_NTA_SkillRange[i] = 8;
break;
case 147: //Frenzy
_NTA_SkillRange[i] = 2;
break;
case 151: //Whirlwind
_NTA_SkillRange[i] = 8;
break;
case 152: //Berserk
_NTA_SkillRange[i] = 3;
break;
case 225: //Fire Storm
case 229: //Molten Boulder
case 230: //Arctic Blast
case 232: //Feral Rage
case 233: //Maul
case 238: //Rabies
case 239: //Fire Claws
case 240: //Twister
case 242: //Hunger
case 243: //Shockwave
case 244: //Volcano
_NTA_SkillRange[i] = 3;
break;
case 245: //Tornado
_NTA_SkillRange[i] = 3;
break;
case 248: //Fury
_NTA_SkillRange[i] = 3;
break;
case 271: // Lightning Sentry
case 276: // Death Sentry
case 261: // Charged Bolt Sentry
_NTA_SkillRange[i] = 20;
break;
case 251: // Fire Blast
case 256: // Shockweb Sentry
_NTA_SkillRange[i] = 15;
break;
default:
_NTA_SkillRange[i] = 25;
break;
}
}
}
if(me.classid == NTC_CHAR_CLASS_ASSASSIN)
{
NTA_InitializeAssassinAttacks();
}
}
function NTA_InitializeAssassinAttacks()
{
// Find maximum range value for traps.
// No attacks should be set a high range value.
NTConfig_MinTrapRange = 999;
NTConfig_MinBossTrapRange = 999;
NTConfig_NumTraps = 0;
NTConfig_NumBossTrap = 0;
for(var i=0; i < 5; i++) {
if(NTConfig_TrapSet[i] > 0) {
// Find the lowest trap range
switch(NTConfig_TrapSet[i]) {
case 271: // Lightning Sentry
case 276: // Death Sentry
NTConfig_NumTraps++;
if(25 < NTConfig_MinTrapRange) // Trap range 25
NTConfig_MinTrapRange = 25;
break;
case 261: // Charged Bolt Sentry
NTConfig_NumTraps++;
if(10 < NTConfig_MinTrapRange) // Trap range 10
NTConfig_MinTrapRange = 10;
break;
case 262: // Wake of Fire
NTConfig_NumTraps++;
if(25 < NTConfig_MinTrapRange) // Trap range 25
NTConfig_MinTrapRange = 25;
break;
case 272: // Wake of Inferno
NTConfig_NumTraps++;
if(15 < NTConfig_MinTrapRange) // Trap range 15
NTConfig_MinTrapRange = 15;
break;
default: // User using invalid trap
// Do Nothing
break;
}
}
if(NTConfig_ActBossTrapSet[i] > 0) {
// Find the lowest trap range
switch(NTConfig_ActBossTrapSet[i]) {
case 271: // Lightning Sentry
case 276: // Death Sentry
NTConfig_NumBossTrap++;
if(25 < NTConfig_MinBossTrapRange) // Trap range 25
NTConfig_MinBossTrapRange = 25;
break;
case 261: // Charged Bolt Sentry
NTConfig_NumBossTrap++;
if(10 < NTConfig_MinBossTrapRange) // Trap range 10
NTConfig_MinBossTrapRange = 10;
break;
case 262: // Wake of Fire
NTConfig_NumBossTrap++;
if(25 < NTConfig_MinBossTrapRange) // Trap range 25
NTConfig_MinBossTrapRange = 25;
break;
case 272: // Wake of Inferno
NTConfig_NumBossTrap++;
if(15 < NTConfig_MinBossTrapRange) // Trap range 15
NTConfig_MinBossTrapRange = 15;
break;
default: // User using invalid trap
// Do Nothing
break;
}
}
}
}
function NTA_KillMonster(classid)
{
var _target;
if(NTConfig_AttackSkill[1] < 1)
return false;
_target = NTC_FindUnit(NTC_UNIT_MONSTER, classid, 5);
if(!_target)
return false;
if(_target.IsAttackable())
{
var _attackcount = 0;
while(_attackcount < 300 && NTA_IsValidMonster(_target))
{
if(NTA_Attack(_target, (_attackcount%30) == 0) < 2)
break;
_attackcount++;
_sorcattack++;
}
}
return (_target.hp <= 0 || _target.mode == 0 || _target.mode == 12);
}
function ReviveDead()
{
var _breaker=0;
_target = NTC_FindUnit(NTC_UNIT_MONSTER);
do
{
_skiplist = new Array();
if(_target.mode == 12 && !_target.GetState(96) && !_target.GetState(56) && (_target.spectype == 1 || _target.spectype == 17) && !_target.GetState(172) && !_target.GetState(173) && !_target.GetState(154) && _target.classid != 363 && _target.classid != 364 && _target.classid != 351 && _target.classid != 352 && _target.classid != 353)
{
if(_skiplist.indexOf(_target.gid) < 0)
{
if((GetDistance(me, _target) < 15))
{
var _pos = me.GetOptimalAttackPos(_target.areaid, _target.x, _target.y, 3, 4);
if(_pos)
{
NTM_MoveTo(_target.areaid, _pos[0], _pos[1], 0);
if(!NTC_CastSkill(95, NTC_HAND_RIGHT,_target.x+2,_target.y+1))
{
_breaker++;
_skiplist.push(_target.gid);
}
else
{
_breaker++;
}
}
}
else
_skiplist.push(_target.gid);
}
}
if (_breaker >= 1 || _target == null)
{
break;
_breaker = 0;
}
}
while(_target.GetNext());
}
function SkeleDead()
{
var _breaker=0;
_target = NTC_FindUnit(NTC_UNIT_MONSTER);
do
{
_skiplist = new Array();
if(_target.mode == 12 && !_target.GetState(96) && !_target.GetState(56) && (_target.spectype == 1 || _target.spectype == 17) && !_target.GetState(172) && !_target.GetState(173) && !_target.GetState(154) && _target.classid != 363 && _target.classid != 364 && _target.classid != 351 && _target.classid != 352 && _target.classid != 353)
{
if(_skiplist.indexOf(_target.gid) < 0)
{
if((GetDistance(me, _target) < 15))
{
var _pos = me.GetOptimalAttackPos(_target.areaid, _target.x, _target.y, 3, 4);
if(_pos)
{
NTM_MoveTo(_target.areaid, _pos[0], _pos[1], 0);
if(!NTC_CastSkill(70, NTC_HAND_RIGHT,_target.x+2,_target.y+1))
{
_breaker++;
_skiplist.push(_target.gid);
}
else
{
_breaker++;
_SkeleCount++;
_SumCount++;
}
}
}
else
_skiplist.push(_target.gid);
}
}
if (_breaker >= 1 || _target == null)
{
break;
_breaker = 0;
}
}
while(_target.GetNext());
}
function MageDead()
{
var _breaker=0;
_target = NTC_FindUnit(NTC_UNIT_MONSTER);
do
{
_skiplist = new Array();
if(_target.mode == 12 && !_target.GetState(96) && !_target.GetState(56) && (_target.spectype == 1 || _target.spectype == 17) && !_target.GetState(172) && !_target.GetState(173) && !_target.GetState(154) && _target.classid != 363 && _target.classid != 364 && _target.classid != 351 && _target.classid != 352 && _target.classid != 353)
{
if(_skiplist.indexOf(_target.gid) < 0)
{
if((GetDistance(me, _target) < 15))
{
var _pos = me.GetOptimalAttackPos(_target.areaid, _target.x, _target.y, 3, 4);
if(_pos)
{
NTM_MoveTo(_target.areaid, _pos[0], _pos[1], 0);
if(!NTC_CastSkill(80, NTC_HAND_RIGHT,_target.x+2,_target.y+1))
{
_breaker++;
_skiplist.push(_target.gid);
}
else
{
_breaker++;
_MageCount++;
_SumCount++;
}
}
}
else
_skiplist.push(_target.gid);
}
}
if (_breaker >= 1 || _target == null)
{
break;
_breaker = 0;
}
}
while(_target.GetNext());
}
function NTA_ClearPosition(range, pickitem, safelevel)
{
var _orgx, _orgy;
var _spectype = [0x0A, 0x01, 0x01];
var _skiplist;
var _attackcount = 0;
var _target;
var _distance, _mingid, _mindistance;
var _result;
var _sum = 0;
if(NTConfig_AttackSkill[1] < 1 || NTConfig_AttackSkill[3] < 1)
return false;
switch(arguments.length)
{
case 0:
range = 20;
case 1:
pickitem = false;
case 2:
safelevel = 0;
default:
if(NTConfig_CheckSelfSafe < 0x01 && NTConfig_CheckMercSafe < 0x01)
safelevel = 0;
break;
}
_orgx = me.x;
_orgy = me.y;
for(var i = 0 ; i < _spectype.length ; i++)
{
_skiplist = new Array();
while(_attackcount < (i+1)*100)
{
_mindistance = 100000;
_target = NTC_FindUnit(NTC_UNIT_MONSTER);
if(_target)
{
do
{
if(_skiplist.indexOf(_target.gid) < 0)
{
if(_target.IsAttackable() && (_target.spectype&_spectype[i]))
{
if(GetDistance(_orgx, _orgy, _target.x, _target.y) <= range && NTA_IsValidMonster(_target))
{
_distance = GetDistance(me, _target);
if(_distance < _mindistance)
{
_mingid = _target.gid;
_mindistance = _distance;
}
}
}
else
_skiplist.push(_target.gid);
}
} while(_target.GetNext());
}
if(_mindistance < 100000)
{
_target = NTC_FindUnit(NTC_UNIT_MONSTER, _mingid);
if(_target)
{
_result = NTA_Attack(_target, (_attackcount%30) == 0);
switch(_result)
{
case 1:
_skiplist.push(_mingid);
break;
case 2:
case 3:
_attackcount++;
_sorcattack++;
break;
default:
return false;
}
}
}
else
break;
}
}
if(me.classid == NTC_CHAR_CLASS_PALADIN)
{
if(_attackcount > 2 && (parseInt(me.hp*100/me.hpmax) < NTConfig_UseRedemptionHP || parseInt(me.mp*100/me.mpmax) < NTConfig_UseRedemptionMP))
{
if(NTC_PutSkill(124, NTC_HAND_RIGHT))
NTC_PingDelay(1000);
}
}
if(me.classid == NTC_CHAR_CLASS_NECROMANCER)
{
_SumBreak = 0;
if(_attackcount > 2)
{
NTC_CastSkill(68, NTC_HAND_RIGHT); // Bone Armor
if(_SkeleCount < NTConfig_Skele + 1 || _MageCount < NTConfig_Mage + 1)
{
if(_SkeleCount == _MageCount)
{
for(var i = 0 ; i < 5 ; i++)
{
SkeleDead();
}
}
else if(_SkeleCount > _MageCount || _SkeleCount > NTConfig_Skele + 1)
{
for(var i = 0 ; i < 5 ; i++)
{
MageDead();
}
}
else if(_MageCount > _SkeleCount || _SkeleMage > NTConfig_Mage + 1)
{
for(var i = 0 ; i < 5 ; i++)
{
SkeleDead();
}
}
}
else
{
if(_SumCount >= 200)
{
_SumCount = 30;
_SkeleCount = _SkeleCount - 3;
_MageCount = _MageCount - 3;
}
for(var i = 0 ; i < 10 ; i++)
{
ReviveDead();
}
}
}
}
if(NTConfig_OpenChest)
{
_target = NTC_GetSpecialChest();
if(_target && GetDistance(_orgx, _orgy, _target.x, _target.y) <= range && NTC_OpenChest(_target))
_attackcount++;
}
if(pickitem && _attackcount > 0)
NTSI_PickItems();
switch(safelevel)
{
case 1:
return NTTMGR_CheckSafe(0x00, NTConfig_CheckMercSafe&0x01);
case 2:
return NTTMGR_CheckSafe(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe);
}
return true;
}
function NTA_ClearLevel(pickitem, safelevel)
{
var i;
var _room, _rooms;
var _distance, _minindex, _mindistance;
_room = GetRoom();
if(!_room)
return false;
switch(arguments.length)
{
case 0:
pickitem = true;
case 1:
safelevel = 2;
default:
if(NTConfig_CheckSelfSafe < 0x01 && NTConfig_CheckMercSafe < 0x01)
safelevel = 0;
break;
}
_rooms = new Array();
do
{
_rooms.push([parseInt(_room.x*5 + _room.xsize*5/2), parseInt(_room.y*5 + _room.ysize*5/2)]);
} while(_room.GetNext());
while(_rooms.length > 0)
{
_mindistance = 100000;
for(i = 0 ; i < _rooms.length ; i++)
{
_distance = GetDistance(me.x, me.y, _rooms[i][0], _rooms[i][1]);
if(_distance < _mindistance)
{
_minindex = i;
_mindistance = _distance;
}
}
if(NTM_MoveTo(me.areaid, _rooms[_minindex][0], _rooms[_minindex][1], 1))
{
if(!NTA_ClearRoom(pickitem, safelevel))
return false;
NTP_DoPrecast(false);
}
_rooms.splice(_minindex, 1);
}
return true;
}
function NTA_ClearRoom(pickitem, safelevel)
{
var _room;
var _spectype = [0x0A, 0x01, 0x01];
var _skiplist;
var _attackcount = 0;
var _target;
var _distance, _mingid, _mindistance;
var _result;
if(NTConfig_AttackSkill[1] < 1 || NTConfig_AttackSkill[3] < 1)
return false;
_room = me.GetRoom();
if(!_room)
return false;
switch(arguments.length)
{
case 0:
pickitem = false;
case 1:
safelevel = 0;
default:
if(NTConfig_CheckSelfSafe < 0x01 && NTConfig_CheckMercSafe < 0x01)
safelevel = 0;
break;
}
for(var i = 0 ; i < _spectype.length ; i++)
{
_skiplist = new Array();
while(_attackcount < (i+1)*100)
{
_mindistance = 100000;
_target = NTC_FindUnit(NTC_UNIT_MONSTER);
if(_target)
{
do
{
if(_skiplist.indexOf(_target.gid) < 0)
{
if(_target.IsAttackable() && (_target.spectype&_spectype[i]))
{
if(_room.UnitInRoom(_target) && NTA_IsValidMonster(_target))
{
_distance = GetDistance(me, _target);
if(_distance < _mindistance)
{
_mingid = _target.gid;
_mindistance = _distance;
}
}
}
else
_skiplist.push(_target.gid);
}
} while(_target.GetNext());
}
if(_mindistance < 100000)
{
_target = NTC_FindUnit(NTC_UNIT_MONSTER, _mingid);
if(_target)
{
_result = NTA_Attack(_target, (_attackcount%30) == 0);
switch(_result)
{
case 1:
_skiplist.push(_mingid);
break;
case 2:
case 3:
_attackcount++;
break;
default:
return false;
}
}
}
else
break;
}
}
if(me.classid == NTC_CHAR_CLASS_PALADIN)
{
if(_attackcount > 2 && (parseInt(me.hp*100/me.hpmax) < NTConfig_UseRedemptionHP || parseInt(me.mp*100/me.mpmax) < NTConfig_UseRedemptionMP))
{
if(NTC_PutSkill(124, NTC_HAND_RIGHT))
NTC_PingDelay(1000);
}
}
if(me.classid == NTC_CHAR_CLASS_NECROMANCER && _RevCount <= 25)
{
if(_attackcount > 2)
ReviveDead();
}
if(me.classid == NTC_CHAR_CLASS_NECROMANCER)
{
_SumBreak = 0;
if(_attackcount > 2)
{
NTC_CastSkill(68, NTC_HAND_RIGHT); // Bone Armor
if(_SkeleCount < NTConfig_Skele + 1 || _MageCount < NTConfig_Mage + 1)
{
if(_SkeleCount == _MageCount)
{
for(var i = 0 ; i < 5 ; i++)
{
SkeleDead();
}
}
else if(_SkeleCount > _MageCount || _SkeleCount > NTConfig_Skele + 1)
{
for(var i = 0 ; i < 5 ; i++)
{
MageDead();
}
}
else if(_MageCount > _SkeleCount || _SkeleMage > NTConfig_Mage + 1)
{
for(var i = 0 ; i < 5 ; i++)
{
SkeleDead();
}
}
}
else
{
if(_SumCount >= 200)
{
_SumCount = 30;
_SkeleCount = _SkeleCount - 3;
_MageCount = _MageCount - 3;
}
for(var i = 0 ; i < 10 ; i++)
{
ReviveDead();
}
}
}
}
if(pickitem && _attackcount > 0)
NTSI_PickItems();
switch(safelevel)
{
case 1:
return NTTMGR_CheckSafe(0x00, NTConfig_CheckMercSafe&0x01);
case 2:
return NTTMGR_CheckSafe(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe);
}
return true;
}
function NTA_IsValidMonster(monster)
{
var _classid;
if(monster.hp <= 0 || monster.mode == 0 || monster.mode == 12)
return false;
_classid = monster.classid;
if((me.areaid == 108) && ((7759 <= me.x <= 7761) && (me.y == 5267)) && GetDistance(me.x,me.y,monster.x,monster.y) <= 10 )
return false;
if (_classid >= 419 && _classid <= 427)
return false;
if(monster.name == GetLocaleString(3162) && GetDistance(me.x,me.y,monster.x,monster.y) <= 25 )
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;
if(monster.hp <= 0 || monster.mode == 0 || monster.mode == 12)
return false;
if(((_classid >= 110 && _classid <= 113) || _classid == 608) && monster.mode == 8) // ignore flying scavengers
return false;
if(_classid == 68 && monster.mode == 14) // ignore burrowing maggots
return false;
if(_classid >= 258 && _classid <= 263 && monster.mode == 14) // ignore submerged WaterWatchers
return false;
if(monster.GetState(53) || monster.GetState(96)) // Conversion, Revive
return false;
if(me.classid == NTC_CHAR_CLASS_DRUID)
{
if(!me.GetState(144))
NTC_CastSkill(250, NTC_HAND_RIGHT);
if(!me.GetState(151))
NTC_CastSkill(235, NTC_HAND_RIGHT);
if(!me.GetState(149))
NTC_CastSkill(226, NTC_HAND_RIGHT);
}
if(me.classid == NTC_CHAR_CLASS_NECROMANCER)
{
if(!me.GetState(14))
NTC_CastSkill(68, NTC_HAND_RIGHT)
}
return true;
}
function NTA_GetDamageType(skillid)
{
if(skillid == 74) // Corpse Explosion
return NTA_DAMAGE_PHYSICAL;
if(skillid == 112) // Blessed Hammer
return NTA_DAMAGE_NONE;
switch(GetBaseStat("skills.txt", skillid, 233))
{
case "cold":
return NTA_DAMAGE_COLD;
case "fire":
return NTA_DAMAGE_FIRE;
case "ltng":
return NTA_DAMAGE_LIGHTNING;
case "mag":
return NTA_DAMAGE_MAGIC;
case "pois":
return NTA_DAMAGE_POISON;
case "stun":
return NTA_DAMAGE_NONE;
default:
if(GetBaseStat("skills.txt", skillid, 178) || GetBaseStat("skills.txt", skillid, 182)) // aura or passive
return NTA_DAMAGE_NONE;
}
return NTA_DAMAGE_PHYSICAL;
}
function NTA_GetResistance(enemy, type)
{
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_DetectAttackPattern()
{
switch(me.classid)
{
case NTC_CHAR_CLASS_AMAZON:
return NTA_AmazonAttackPatternInt();
case NTC_CHAR_CLASS_SORCERESS:
return NTA_SorceressAttackPatternInt();
case NTC_CHAR_CLASS_NECROMANCER:
return NTA_NecromancerAttackPatternInt();
case NTC_CHAR_CLASS_PALADIN:
return NTA_PaladinAttackPatternInt();
case NTC_CHAR_CLASS_BARBARIAN:
return NTA_BarbarianAttackPatternInt();
case NTC_CHAR_CLASS_DRUID:
return NTA_DruidAttackPatternInt();
case NTC_CHAR_CLASS_ASSASSIN:
return NTA_AssassinAttackPatternInt();
}
return false;
}
// Return value : 0 = Unrecoverable process, 1 = Unavailable attack, 2 = Onetime fail, 3 = Success
function NTA_Attack(target, firstorder)
{
switch(me.classid)
{
case NTC_CHAR_CLASS_AMAZON:
return NTA_AmazonAttackInt(target, firstorder);
case NTC_CHAR_CLASS_SORCERESS:
return NTA_SorceressAttackInt(target, firstorder);
case NTC_CHAR_CLASS_NECROMANCER:
return NTA_NecromancerAttackInt(target, firstorder);
case NTC_CHAR_CLASS_PALADIN:
return NTA_PaladinAttackInt(target, firstorder);
case NTC_CHAR_CLASS_BARBARIAN:
return NTA_BarbarianAttackInt(target, firstorder);
case NTC_CHAR_CLASS_DRUID:
return NTA_DruidAttackInt(target, firstorder);
case NTC_CHAR_CLASS_ASSASSIN:
return NTA_AssassinAttackInt(target, firstorder);
}
return 0;
}
function NTA_IsWeaponBroken()
{
var _weapon;
_weapon = me.GetItems();
if(_weapon)
{
for(var i = 0 ; i < _weapon.length ; i++)
{
if(_weapon[i].itemflag&0x100)
{
if(_weapon[i].mode == 1 && _weapon[i].itemloc == 4 || _weapon[i].itemloc == 5)
{
Print("ÿc8My weapon broke, I am going to town to repair it.")
NTTMGR_VisitTown();
NTTMGR_TownManager();
break;
}
}
}
}
}
function NTA_HaveArrows()
{
var _weapon;
var _haveAmmo = false;
_weapon = me.GetItems();
if(_weapon)
{
for(var i = 0 ; i < _weapon.length ; i++)
{
if((_weapon[i].classid == 526 || _weapon[i].classid == 528) && _weapon[i].itemloc == 5)
{
if(_weapon[i].GetStat(70) < 10)
{
Print("ÿc8I'm low on "+ _weapon[i].name + ", I am going to town to buy more.")
NTTMGR_VisitTown();
NTTMGR_TownManager();
}
_haveAmmo = true;
break;
}
}
}
if(!_haveAmmo)
{
Print("ÿc8I have no ammo, I am going to town to buy some.")
NTTMGR_VisitTown();
NTTMGR_TownManager();
}
}
// Internal function
function NTA_AmazonAttackPatternInt()
{
var _maxindex, _maxskill;
var _avgskilllevel = new Array();
_avgskilllevel[0] = me.GetSkill(35, false);
_avgskilllevel[1] = parseInt((me.GetSkill(31, false) + me.GetSkill(11, false) + me.GetSkill(21, false)) /3 );
_avgskilllevel[2] = me.GetSkill(26, false);
_maxindex = -1;
_maxskill = 0;
for(var i = 0 ; i < _avgskilllevel.length ; i++)
{
if(_avgskilllevel[i] > _maxskill)
{
_maxindex = i;
_maxskill = _avgskilllevel[i];
}
}
switch(_maxindex)
{
case 0: // Lightning Fury for Javazon
NTConfig_AttackSkill[1] = 35;
NTConfig_AttackSkill[2] = 35;
NTConfig_AttackSkill[3] = 35;
NTConfig_AttackSkill[4] = 35;
NTConfig_AttackSkill[5] = 35;
NTConfig_AttackSkill[6] = 35;
NTConfig_AttackSkill[7] = 24;
break;
case 1: // Freezing Arrow for Bowzon
NTConfig_AttackSkill[1] = 31;
NTConfig_AttackSkill[2] = 31;
NTConfig_AttackSkill[3] = 31;
NTConfig_AttackSkill[4] = 31;
NTConfig_AttackSkill[5] = 31;
NTConfig_AttackSkill[6] = 31;
NTConfig_AttackSkill[7] = 31;
break;
case 2: // Cold Arrow + Strafe for Bowzon
NTConfig_AttackSkill[0] = 11;
NTConfig_AttackSkill[1] = 26;
NTConfig_AttackSkill[2] = 26;
NTConfig_AttackSkill[3] = 26;
NTConfig_AttackSkill[4] = 26;
NTConfig_AttackSkill[5] = 26;
NTConfig_AttackSkill[6] = 26;
NTConfig_AttackSkill[7] = 22;
break;
}
return (NTConfig_AttackSkill[1] && NTConfig_AttackSkill[3]);
}
function NTA_AmazonAttackInt(target, firstorder)
{
var _primaryindex;
if(NTTMGR_CheckCurse(NTConfig_CheckSelfSafe&0x10, NTConfig_CheckMercSafe&0x10))
{
if(!NTTMGR_VisitTown())
return 0;
}
if(me.GetSkill(12, false) >= 1)
NTA_HaveArrows();
else
NTA_IsWeaponBroken();
if(firstorder && NTConfig_AttackSkill[0] > 0 && NTA_GetResistance(target, _NTA_SkillDamage[0]) < 100)
{
if(GetDistance(me, target) > _NTA_SkillRange[0] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[0], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(!NTC_CastSkill(NTConfig_AttackSkill[0], _NTA_SkillHand[0], target))
return 2;
return 3;
}
_primaryindex = (target.spectype&0x0A) ? 1 : 3;
switch(target.classid)
{
case 243://Diablo
case 544://Baal
case 242:
if(!NTA_AmazonCastSkillInt(7, target))
return 2;
return 3;
default:
break;
}
if(NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) <= 90)
{
if(!NTA_AmazonCastSkillInt(_primaryindex, target))
return 2;
return 3;
}
if(NTConfig_AttackSkill[5] > 0 && NTA_GetResistance(target, _NTA_SkillDamage[5]) > 80)
{
if(!NTA_AmazonCastSkillInt(5, target))
return 2;
return 3;
}
if(NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) < 100 || (_primaryindex == 1 && NTC_GetMerc()))
{
if(!NTA_AmazonCastSkillInt(_primaryindex, target))
return 2;
return 3;
}
return 1;
}
function NTA_AmazonCastSkillInt(index, target)
{
if(GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[index], NTC_HAND_LEFT, target);
if(NTConfig_AttackSkill[index+1] > 0)
{
if(GetDistance(me, target) > _NTA_SkillRange[index+1] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index+1], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[index+1], _NTA_SkillHand[index+1], target);
}
}
function NTA_SorceressAttackPatternInt()
{
var _maxindex, _maxskill;
var _avgskilllevel = new Array();
_avgskilllevel[0] = parseInt((me.GetSkill(59, false)+me.GetSkill(39, false)+me.GetSkill(45, false)+me.GetSkill(55, false))/4);
_avgskilllevel[1] = parseInt((me.GetSkill(53, false)+me.GetSkill(38, false)+me.GetSkill(48, false)+me.GetSkill(49, false))/4);
_avgskilllevel[2] = parseInt((me.GetSkill(47, false)+me.GetSkill(36, false)+me.GetSkill(56, false)+me.GetSkill(64, false))/4);
_avgskilllevel[3] = parseInt((me.GetSkill(47, false)+me.GetSkill(36, false)+me.GetSkill(56, false))/3);
_maxindex = -1;
_maxskill = 0;
for(var i = 0 ; i < _avgskilllevel.length ; i++)
{
if(_avgskilllevel[i] > _maxskill)
{
_maxindex = i;
_maxskill = _avgskilllevel[i];
}
}
switch(_maxindex)
{
case 0: // Blizzard + Glacial Spike
NTConfig_AttackSkill[1] = 59;
NTConfig_AttackSkill[2] = 55;
NTConfig_AttackSkill[3] = 59;
NTConfig_AttackSkill[4] = 55;
break;
case 1: // Chain Lightning + Lightning
NTConfig_AttackSkill[1] = 49;
NTConfig_AttackSkill[3] = 53;
break;
case 2: // Fire Ball + Frozen Orb
NTConfig_AttackSkill[0] = 64;
NTConfig_AttackSkill[1] = 47;
NTConfig_AttackSkill[3] = 47;
NTConfig_AttackSkill[5] = 64;
NTConfig_AttackSkill[6] = 55;
break;
case 3: // Fire Ball + Meteor
NTConfig_AttackSkill[1] = 56;
NTConfig_AttackSkill[2] = 47;
NTConfig_AttackSkill[3] = 56;
NTConfig_AttackSkill[4] = 47;
break;
}
return (NTConfig_AttackSkill[1] && NTConfig_AttackSkill[3]);
}
function NTA_SorceressAttackInt(target, firstorder)
{
var _primaryindex;
var _attackSkill;
if(NTTMGR_CheckCurse(NTConfig_CheckSelfSafe&0x10, NTConfig_CheckMercSafe&0x10))
{
if(!NTTMGR_VisitTown())
return 0;
}
if(firstorder && NTConfig_AttackSkill[0] > -1 && NTA_GetResistance(target, _NTA_SkillDamage[0]) < 100 && me.GetSkillStatus(NTConfig_AttackSkill[0]) != 8)
{
if(GetDistance(me, target) > _NTA_SkillRange[0] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[0], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(!NTC_CastSkill(NTConfig_AttackSkill[0], _NTA_SkillHand[0], target))
return 2;
return 3;
}
if(NTConfig_CastStatic < 100 && parseInt(target.hp*100/target.hpmax) > NTConfig_CastStatic && NTA_GetResistance(target, NTA_DAMAGE_LIGHTNING) <= 80 && (target.name == "Mephisto" || target.name == "Andariel" || target.name == "Duriel" ||target.name == "Diablo" || target.name == "Baal"))
{
var _staticlevel = NTC_GetSkillLevel(42);
if(_staticlevel > 0)
{
var _staticrange;
var _castx, _casty;
_staticrange = Math.floor((5+_staticlevel-1)*2/3);
if(GetDistance(me, target) > _staticrange || !CheckCollision(me, target, 6))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _staticrange, 6);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(target.x < me.x)
_castx = me.x - 1;
else if(target.x > me.x)
_castx = me.x + 1;
else
_castx = me.x;
if(target.y < me.y)
_casty = me.y - 1;
else if(target.y > me.y)
_casty = me.y + 1;
else
_casty = me.y;
if(!CheckCollision(target.areaid, _castx, _casty, 1))
{
_castx = me.x;
_casty = me.y;
}
if(!NTC_CastSkill(42, NTC_HAND_RIGHT, _castx, _casty))
return 2;
return 3;
}
}
_primaryindex = (target.spectype&0x0A) ? 1 : 3;
_attackSkill = NTA_GetAttackType(target, _primaryindex, 91, 81, 81); // delete
if(NTConfig_AttackSkill[_attackSkill] > -1)
{
if(!NTA_SorceressCastSkillInt(_attackSkill, target, _primaryindex))
return 2;
return 3;
}
if(NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) < 100 || (_primaryindex == 1 && NTC_GetMerc()))
{
if(!NTA_SorceressCastSkillInt(_primaryindex, target, _primaryindex))
return 2;
return 3;
}
return 1;
}
function NTA_SorceressCastSkillInt(index, target, primaryIndex)
{
var secondarySkill = 0;
_haveCL = NTC_GetSkillLevel(53); // check to see if we even have CL
_havetele = NTC_GetSkillLevel(54);
if(_sorcattack >= 20)
_sorcattack = 0;
if(_havetele && NTConfig_DancingSorc)
{
NTTMGR_CheckSafe(false, 0x01); // revive merc
if((NTA_CheckMyHp() || ((target.GetState(28) <= 0) && NTA_CheckMercInfinity())) || (_sorcattack%NTConfig_AttackJump) == 0)
{
if(target.GetState(28) <= 0){Print("ÿc;target not convicted");Print("ÿc;let's dance");}
NTA_Bounce(target);
}
}
if(me.GetSkillStatus(NTConfig_AttackSkill[index]) != 8)
{
if(GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(target.name == "Baal" && NTConfig_AttackSkill[10] > -1 )
return NTC_CastSkill(NTConfig_AttackSkill[10], _NTA_SkillHand[10], target);
if((target.name == "Mephisto" || target.name == "Andariel" || target.name == "Duriel" || target.name == "Diablo") && NTConfig_AttackSkill[9] > -1 && target.name != "Baal")
return NTC_CastSkill(NTConfig_AttackSkill[9], _NTA_SkillHand[9], target);
if(target.name == "Duriel" && NTConfig_UseColdOnDury)
{
if(NTConfig_UseOrb)
{
return (NTC_CastSkill(64, NTC_HAND_LEFT, target))
}
if(NTConfig_UseBlizz)
{
return (NTC_CastSkill(59, NTC_HAND_LEFT, target))
}
}
if(NTConfig_ChainLightOnLightImmunes && NTA_GetResistance(target, NTA_DAMAGE_LIGHTNING) >= 90 && _haveCL > 0)
{
return(NTC_CastSkill(53, NTC_HAND_LEFT, target))
}
return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], target);
}
secondarySkill = NTA_GetAttackType (target, primaryIndex+1, 81, 81, 81); // delete
if(NTConfig_AttackSkill[secondarySkill] > -1)
{
if(GetDistance(me, target) > _NTA_SkillRange[secondarySkill] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index+1], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[secondarySkill], _NTA_SkillHand[secondarySkill], target);
}
for(var i = 0 ; i < 25 ; i++)
{
NTC_Delay(NTC_DELAY_FRAME);
if(me.GetSkillStatus(NTConfig_AttackSkill[index]) != 8)
break;
}
return false;
}
function NTA_NecromancerAttackPatternInt()
{
var _maxindex, _maxskill;
var _avgskilllevel = new Array();
_avgskilllevel[0] = me.GetSkill(84, fasle);
_maxindex = -1;
_maxskill = 0;
for(var i = 0 ; i < _avgskilllevel.length ; i++)
{
if(_avgskilllevel[i] > _maxskill)
{
_maxindex = i;
_maxskill = _avgskilllevel[i];
}
}
switch(_maxindex)
{
case 0:
NTConfig_AttackSkill[0] = 84;
NTConfig_AttackSkill[1] = 84;
NTConfig_AttackSkill[3] = 84;
break;
}
return (NTConfig_AttackSkill[1] && NTConfig_AttackSkill[3]);
}
function GetCurseState(skillid)
{
if(NTConfig_Curse == 66)
return 9;
if(NTConfig_Curse == 71)
return 23;
if(NTConfig_Curse == 76)
return 55;
if(NTConfig_Curse == 77)
return 56;
if(NTConfig_Curse == 81)
return 59;
if(NTConfig_Curse == 82)
return 58;
if(NTConfig_Curse == 86)
return 57;
if(NTConfig_Curse == 87)
return 60;
if(NTConfig_Curse == 91)
return 61;
}
function NTA_NecromancerAttackInt(target, firstorder)
{
var _primaryindex;
if(NTTMGR_CheckCurse(NTConfig_CheckSelfSafe&0x10, NTConfig_CheckMercSafe&0x10))
{
if(!NTTMGR_VisitTown())
return 0;
}
if(!target.GetState(GetCurseState()))
NTC_CastSkill(NTConfig_Curse, NTC_HAND_RIGHT, target)
if(firstorder && NTConfig_AttackSkill[0] > 0 && NTA_GetResistance(target, _NTA_SkillDamage[0]) < 100 && me.GetSkillStatus(NTConfig_AttackSkill[0]) != 8)
{
if(GetDistance(me, target) > _NTA_SkillRange[0] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[0], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
}
_primaryindex = (target.spectype&0x0A) ? 1 : 3;
if(NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) <= 90)
{
if(!NTA_NecromancerCastSkillInt(_primaryindex, target))
return 2;
return 3;
}
if(NTConfig_AttackSkill[5] > 0 && NTA_GetResistance(target, _NTA_SkillDamage[5]) <= 80)
{
if(_SpearCount < 6 && target.name == "Achmel the Cursed" )
{
if(_SpearCount < 1)
NTM_WalkTo(me.x+3, me.y);
NTC_CastSkill(67, NTC_HAND_RIGHT, target);
_SpearCount++;
//Print(_SpearCount);
}
else if(target.name == "Horadrim Ancient")
{
NTM_MoveTo(target.areaid, target.x, target.y, 0);
NTC_PingDelay(1000);
}
else
{
NTA_NecromancerCastSkillInt(5, target)
return 2;
}
return 3;
}
if(NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) < 100 || (_primaryindex == 1 && NTC_GetMerc()))
{
if(!NTA_NecromancerCastSkillInt(_primaryindex, target))
return 2;
return 3;
}
return 1;
}
function NTA_NecromancerCastSkillInt(index, target)
{
if(me.GetSkillStatus(NTConfig_AttackSkill[index]) != 8)
{
if(GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], target);
}
if(NTConfig_AttackSkill[index+1] > 0)
{
if(GetDistance(me, target) > _NTA_SkillRange[index+1] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index+1], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[index+1], _NTA_SkillHand[index+1], target);
}
for(var i = 0 ; i < 25 ; i++)
{
NTC_Delay(NTC_DELAY_FRAME);
if(me.GetSkillStatus(NTConfig_AttackSkill[index]) != 8)
break;
}
return false;
}
function NTA_PaladinAttackPatternInt()
{
var _maxindex, _maxskill;
var _avgskilllevel = new Array();
_avgskilllevel[0] = parseInt((me.GetSkill(112, false)+me.GetSkill(108, false)+me.GetSkill(115, false))/3);
_avgskilllevel[1] = parseInt((me.GetSkill(106, false)+me.GetSkill(96, false))/2);
_avgskilllevel[2] = parseInt((me.GetSkill(121, false)+me.GetSkill(101, false)+me.GetSkill(118, false))/3);
_maxindex = -1;
_maxskill = 0;
for(var i = 0 ; i < _avgskilllevel.length ; i++)
{
if(_avgskilllevel[i] > _maxskill)
{
_maxindex = i;
_maxskill = _avgskilllevel[i];
}
}
_maxindex = 0;
switch(_maxindex)
{
case 0: // Blessed Hammer
NTConfig_AttackSkill[1] = 112;
NTConfig_AttackSkill[2] = 113;
NTConfig_AttackSkill[3] = 112;
NTConfig_AttackSkill[4] = 113;
NTConfig_AttackSkill[5] = 101;
NTConfig_AttackSkill[6] = 113;
break;
case 1: // Zeal
NTConfig_AttackSkill[1] = 106;
NTConfig_AttackSkill[2] = 122;
NTConfig_AttackSkill[3] = 106;
NTConfig_AttackSkill[4] = 122;
break;
case 2: // Fist of the Heavens
NTConfig_AttackSkill[1] = 121;
NTConfig_AttackSkill[2] = 123;
NTConfig_AttackSkill[3] = 121;
NTConfig_AttackSkill[4] = 123;
break;
}
return (NTConfig_AttackSkill[1] && NTConfig_AttackSkill[3]);
}
function NTA_PaladinAttackInt(target, firstorder)
{
var _primaryindex;
if(NTTMGR_CheckCurse(NTConfig_CheckSelfSafe&0x10, NTConfig_CheckMercSafe&0x10))
{
if(!NTTMGR_VisitTown())
return 0;
}
if(firstorder && NTConfig_AttackSkill[0] > 0 && NTA_GetResistance(target, NTA_DAMAGE_MAGIC) < 100)
{
if(GetDistance(me, target) > _NTA_SkillRange[0] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[0], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(!NTC_CastSkill(NTConfig_AttackSkill[0], _NTA_SkillHand[0], target))
return 2;
return 3;
}
_primaryindex = (target.spectype&0x0A) ? 1 : 3;
if(NTA_GetResistance(target, NTA_DAMAGE_MAGIC) < 100)
{
if(_NTA_SkillRange[_primaryindex] < 4 && !CheckCollision(target.areaid, target.x, target.y, 1))
return 1;
if(!NTA_PaladinCastSkillInt(_primaryindex, target))
return 2;
return 3;
}
if(NTConfig_AttackSkill[5] > 0 && NTA_GetResistance(target, NTA_DAMAGE_MAGIC) >= 100)
{
if(_NTA_SkillRange[5] < 4 && !CheckCollision(target.areaid, target.x, target.y, 1))
return 1;
if(!NTA_PaladinCastSkillInt(5, target))
return 2;
return 3;
}
return 1;
}
function NTA_PaladinCastSkillInt(index, target)
{
if(NTConfig_AttackSkill[index] == 112)
{
if(me.x-target.x < 1 || me.x-target.x > 2 || me.y-target.y < 1 || me.y-target.y > 2)
{
if(CheckCollision(target.areaid, target.x+2, target.y+2, 1))
NTM_MoveTo(target.areaid, target.x+2, target.y+2, 0);
else if(me.x-target.x < -4 || me.x-target.x > 2 || me.y-target.y < 0 || me.y-target.y > 2)
NTM_MoveTo(target.areaid, target.x-4, target.y, 0);
}
}
else
{
if(GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
}
if(NTConfig_AttackSkill[index+1] > 0)
NTC_PutSkill(NTConfig_AttackSkill[index+1], NTC_HAND_RIGHT);
return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], target);
}
function NTA_BarbarianAttackPatternInt()
{
var _maxindex, _maxskill;
var _avgskilllevel = new Array();
_avgskilllevel[0] = me.GetSkill(151, false);
_maxindex = -1;
_maxskill = 0;
for(var i = 0 ; i < _avgskilllevel.length ; i++)
{
if(_avgskilllevel[i] > _maxskill)
{
_maxindex = i;
_maxskill = _avgskilllevel[i];
}
}
switch(_maxindex)
{
case 0: // Whirlwind
NTConfig_AttackSkill[1] = 151;
NTConfig_AttackSkill[3] = 151;
NTConfig_AttackSkill[5] = 152;
break;
}
return (NTConfig_AttackSkill[1] && NTConfig_AttackSkill[3]);
}
function NTA_BarbarianAttackInt(target, firstorder)
{
var _primaryindex;
if(NTTMGR_CheckCurse(NTConfig_CheckSelfSafe&0x10, NTConfig_CheckMercSafe&0x10))
{
if(!NTTMGR_VisitTown())
return 0;
}
if(firstorder && NTConfig_AttackSkill[0] > 0 && NTA_GetResistance(target, _NTA_SkillDamage[0]) < 100)
{
if(GetDistance(me, target) > _NTA_SkillRange[0] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[0], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(!NTC_CastSkill(NTConfig_AttackSkill[0], _NTA_SkillHand[0], target))
return 2;
return 3;
}
_primaryindex = (target.spectype&0x0A) ? 1 : 3;
if(NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) < 100)
{
if((_NTA_SkillRange[_primaryindex] < 4 || NTConfig_AttackSkill[_primaryindex] == 151) && !CheckCollision(target.areaid, target.x, target.y, 1))
return 1;
if(!NTA_BarbarianCastSkillInt(_primaryindex, target))
return 2;
return 3;
}
if(NTConfig_AttackSkill[5] > 0 && NTA_GetResistance(target, _NTA_SkillDamage[5]) < 100)
{
if((_NTA_SkillRange[5] < 4 || NTConfig_AttackSkill[5] == 151) && !CheckCollision(target.areaid, target.x, target.y, 1))
return 1;
if(!NTA_BarbarianCastSkillInt(5, target))
return 2;
return 3;
}
return 1;
}
function NTA_BarbarianCastSkillInt(index, target)
{
if(NTConfig_AttackSkill[index] == 151)
{
var _castx, _casty;
if(GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 5))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 5);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
_castx = target.x > me.x ? target.x+3 : target.x-3;
_casty = target.y > me.y ? target.y+3 : target.y-3;
return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], _castx, _casty);
}
if(GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], target);
}
function NTA_DruidAttackInt(target, firstorder)
{
var _primaryindex;
if(NTTMGR_CheckCurse(NTConfig_CheckSelfSafe&0x10, NTConfig_CheckMercSafe&0x10))
{
if(!NTTMGR_VisitTown())
return 0;
}
if(firstorder && NTConfig_AttackSkill[0] > 0 && NTA_GetResistance(target, _NTA_SkillDamage[0]) < 100)
{
if(GetDistance(me, target) > NTConfig_AttackSkill[0] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(!NTC_CastSkill(NTConfig_AttackSkill[0], _NTA_SkillHand[0], target))
return 2;
return 3;
}
_primaryindex = (target.spectype&0x0A) ? 1 : 3;
if(me.GetSkill(245, true) > 1)
if(target.name == "Andariel" || target.name == "Baal" || target.name == "Mephisto" || target.name == "Diablo")
{
if(!NTA_DruidCastSkillIntNear(_primaryindex, target))
return 2;
return 3;
}
if(NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) <= 90)
{
if(!NTA_DruidCastSkillInt(_primaryindex, target))
return 2;
return 3;
}
if(NTConfig_AttackSkill[5] > 0 && NTA_GetResistance(target, _NTA_SkillDamage[5]) <= 80)
{
if(!NTA_DruidCastSkillInt(5, target))
return 2;
return 3;
}
if(NTA_GetResistance(target, _NTA_SkillDamage[index]) < 100 || (_primaryindex == 1 && NTC_GetMerc()))
{
if(!NTA_DruidCastSkillInt(_primaryindex, target))
return 2;
return 3;
}
return 1;
}
function NTA_DruidCastSkillIntNear(index, target)
{
if(GetDistance(me, target) > 3 || !CheckCollision(me, target, 4))
NTM_MoveTo(target.areaid, target.x, target.y, 0);
return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], target);
if(NTConfig_AttackSkill[index+1] > 0)
{
if(GetDistance(me, target) > 3 || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, 3, 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[index+1], _NTA_SkillHand[index+1], target);
}
}
function NTA_DruidCastSkillInt(index, target)
{
if(GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(!me.GetState(139))
NTC_CastSkill(223, NTC_HAND_RIGHT) // Werewolf
else if(!me.GetState(140))
NTC_CastSkill(228, NTC_HAND_RIGHT) // Werebear
return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], target);
if(NTConfig_AttackSkill[index+1] > 0)
{
if(GetDistance(me, target) > _NTA_SkillRange[index+1] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index+1], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[index+1], _NTA_SkillHand[index+1], target);
}
}
function NTA_AssassinAttackPatternInt()
{
return false;
}
function NTA_AssassinAttackInt(target, firstorder)
{
var _primaryindex;
var _attackIndex;
var _skillCasted = 0;
if(NTTMGR_CheckCurse(NTConfig_CheckSelfSafe&0x10, NTConfig_CheckMercSafe&0x10))
{
if(!NTTMGR_VisitTown())
return 0;
}
if(firstorder && NTConfig_AttackSkill[0] > -1 && NTA_GetResistance(target, _NTA_SkillDamage[0]) < 100)
{
if(GetDistance(me, target) > _NTA_SkillRange[0] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[0], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(!NTC_CastSkill(NTConfig_AttackSkill[0], _NTA_SkillHand[0], target))
return 2;
return 3;
}
if(NTConfig_UseTraps)
NTA_CheckTraps(target);
_primaryindex = (target.spectype&0x0A) ? 1 : 3;
_attackIndex = NTA_GetAttackType(target, _primaryindex, 91, 81, 81);
if(NTConfig_AttackSkill[_attackIndex] > -1 )
{
_skillCasted = _attackIndex;
if(_NTA_SkillRange[_attackIndex] < 4 && !CheckCollision(target.areaid, target.x, target.y, 1))
return 1;
if(!NTA_AssassinCastSkillInt(_attackIndex, target, _primaryindex))
return 2;
return 3;
}
if(NTConfig_UseTraps) {
if(_skillCasted == 0)
NTC_Delay(NTConfig_AttackSkill);
return 3;
}
return 1;
}
function NTA_AssassinCastSkillInt(index, target, primaryIndex)
{
var secondarySkill = 0;
if(me.GetSkillStatus(NTConfig_AttackSkill[index]) != 8)
{
if(GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], target);
}
secondarySkill = NTA_GetAttackType (target, primaryIndex+1, 81, 81, 81);
if(NTConfig_AttackSkill[secondarySkill] > -1)
{
if(GetDistance(me, target) > _NTA_SkillRange[secondarySkill] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[secondarySkill], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[secondarySkill], _NTA_SkillHand[secondarySkill], target);
}
for(var i = 0 ; i < 25 ; i++)
{
NTC_Delay(NTC_DELAY_FRAME);
if(me.GetSkillStatus(NTConfig_AttackSkill[index]) != 8)
break;
}
return false;
}
function NTA_CheckTraps(target)
{
var traps=NTC_FindUnit(NTC_UNIT_MONSTER);
var trapcount =0;
//var warr=0;
var x,y;
var parent;
var _isActBoss = false;
var _trapOffset;
// || target.name == GetLocaleString(3021) - Andariel
if(target.name == GetLocaleString(3062) || target.name == GetLocaleString(3054)
|| target.name == GetLocaleString(3060) || target.name == GetLocaleString(3061))
_isActBoss = true;
if (traps){
do{
if (traps.classid == 412 || traps.classid == 413 || traps.classid == 416 || traps.classid == 417){
parent = traps.GetParent();
if(parent != null && parent.name == me.name) {
if(GetDistance(target.x,target.y,traps.x,traps.y)< (_isActBoss?NTConfig_MinBossTrapRange:NTConfig_MinTrapRange) && traps.hp > 100 ) {
trapcount=trapcount+1;
}
}
}
/*if ((traps.classid == 418 || traps.classid == 419) && traps.mode == 12){ // apparently 417/418 are warrior/master. commented out for now
warr=1;
}*/
}while(traps.GetNext())
if (trapcount < (_isActBoss?NTConfig_NumBossTrap:NTConfig_NumTraps) && target.hp>0){
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, 13, 10);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
_trapOffset = NTA_GetTrapAttackPattern(_isActBoss);
for(var i=0; i < 5; i++) {
if(NTConfig_TrapSet[i] > 0) {
if(i == 0 || i == 2 || i == 3) // Added delays to prevent trap miscast
NTC_Delay(25);
NTC_CastSkill((_isActBoss?NTConfig_TrapSet[0]:NTConfig_TrapSet[i]), NTC_HAND_RIGHT, target.x + _trapOffset[i][0], target.y + _trapOffset[i][1]);
}
}
}
/*if (warr!=0)
NTP_DoPrecast(false);*/
}
}
function NTA_GetTrapAttackPattern(isActBoss) {
var _attackPattern = new Array(5);
var _bossOffset = 1;
if(NTConfig_TrapAttackPattern == 1) { // Pentagram
_attackPattern[0] = [-2 - (isActBoss?_bossOffset:0), -2 - (isActBoss?_bossOffset:0)];
_attackPattern[1] = [0, 2 + (isActBoss?_bossOffset:0)];
_attackPattern[2] = [2 + (isActBoss?_bossOffset:0), -2 - (isActBoss?_bossOffset:0)];
_attackPattern[3] = [-3 - (isActBoss?_bossOffset:0), 1 + (isActBoss?_bossOffset:0)];
_attackPattern[4] = [3 + (isActBoss?_bossOffset:0), 1 + (isActBoss?_bossOffset:0)];
}
else if(NTConfig_TrapAttackPattern == 2) { // X - axis
_attackPattern[0] = [0, 0];
_attackPattern[1] = [1 + (isActBoss?_bossOffset:0), 0];
_attackPattern[2] = [-1 - (isActBoss?_bossOffset:0), 0];
_attackPattern[3] = [2 + (isActBoss?_bossOffset:0), 0];
_attackPattern[4] = [-2 - (isActBoss?_bossOffset:0), 0];
}
else if(NTConfig_TrapAttackPattern == 3) { // Y - axis
_attackPattern[0] = [0, 0];
_attackPattern[1] = [0, 1 + (isActBoss?_bossOffset:0)];
_attackPattern[2] = [0, -1 - (isActBoss?_bossOffset:0)];
_attackPattern[3] = [0, 2 + (isActBoss?_bossOffset:0)];
_attackPattern[4] = [0, -2 - (isActBoss?_bossOffset:0)];
}
else { // quincunx
_attackPattern[0] = [2 + (isActBoss?_bossOffset:0), 2 + (isActBoss?_bossOffset:0)];
_attackPattern[1] = [-2 - (isActBoss?_bossOffset:0), -2 - (isActBoss?_bossOffset:0)];
_attackPattern[2] = [-2 - (isActBoss?_bossOffset:0), 2 + (isActBoss?_bossOffset:0)];
_attackPattern[3] = [2 + (isActBoss?_bossOffset:0), -2 - (isActBoss?_bossOffset:0)];
_attackPattern[4] = [0, 0];
}
return _attackPattern;
}
function NTA_CheckMercInfinity()
{
var _weapon, _merc;
var Merc_HaveInfinty = false;
_merc = NTC_GetMerc();
if(!_merc)
{
{
Print("ÿc8merc is dead or not hired");
}
return false;
}
if(_merc && _merc.hp > 0 && _merc.mode != 0 && _merc.mode != 12)
{
_weapon = _merc.GetItems();
if(_weapon){
for(var i = 0 ; i < _weapon.length && !Merc_HaveInfinty ; i++){
if((_weapon[i].itemflag&0x4000000) && _weapon[i].itemprefix == 20566){
Merc_HaveInfinty = true;
{
Print("ÿc8merc has infinity");
}
return true;
}
}
}
}
if(!Merc_HaveInfinty)
{
// Print("ÿc8merc has no infinity");
return false;
}
}
function NTA_CheckMyHp()
{
_LifeMax = me.hpmax;
_ManaMax = me.mpmax;
if(NTConfig_DanceStartHp > 0 || NTConfig_DanceStartMp > 0)
{
if(parseInt(me.hp*100/_LifeMax) < NTConfig_DanceStartHp || parseInt(me.mp*100/_ManaMax) < NTConfig_DanceStartMp)
{
return true;
}
}
else
return false;
}
function NTA_Bounce(target)
{
if (me.x - target.x >= 0 && me.y - target.y >= 0)
NTC_CastSkill(54, NTC_HAND_RIGHT, target.x - 9, target.y - 9);
else if (me.x - target.x >= 0 && me.y - target.y < 0)
NTC_CastSkill(54, NTC_HAND_RIGHT, target.x - 9, target.y + 9);
else if (me.x - target.x < 0 && me.y - target.y >= 0)
NTC_CastSkill(54, NTC_HAND_RIGHT, target.x + 9, target.y + 9);
else
NTC_CastSkill(54, NTC_HAND_RIGHT, target.x + 9, target.y - 9);
_sorcattack = 0;
}
function NTA_CheckForCloseMonsters(range)
{
if(range < 1 || arguments.length < 1)
return false;
var _monstersClose = false;
var _checkMonster = NTC_FindUnit(NTC_UNIT_MONSTER);
if(_checkMonster)
{
do
{
if(_checkMonster.IsAttackable() && GetDistance(me.x, me.y, _checkMonster.x, _checkMonster.y) < range && NTA_IsValidMonster(_checkMonster))
{
_monstersClose = true;
break;
}
} while(_checkMonster.GetNext());
}
return _monstersClose;
}
function NTA_GetAttackType(target, startIndex, resistMaxPrimary, resistMaxSecondary, resistMaxTertiary) {
var _currIndex;
var _holdMinResist = [999, startIndex];
var _resistArray = [999,999,999];
var _holdResistMax = [resistMaxPrimary, resistMaxSecondary, resistMaxTertiary];
var i;
for(i=0, _currIndex=startIndex; i < 3;i++, _currIndex += 2) {
if(NTConfig_AttackSkill[_currIndex] > -1 )
{
_resistArray[i] = NTA_GetResistance(target, _NTA_SkillDamage[_currIndex]);
if(_resistArray[i] < _holdResistMax[i]) // Return index if attack is < our max resist requirement
return _currIndex;
}
if(_resistArray[i] < _holdMinResist[0]) { // Store lowest resist attack
_holdMinResist[0] = _resistArray[i];
_holdMinResist[1] = _currIndex;
}
if(_currIndex == 1 || _currIndex == 2) // Skip non boss primary if boss attack
_currIndex += 2;
}
if(_holdMinResist[0] >= 100) // Every attack is immune
return startIndex;
else // At this point all available skills are greater than given max resist settings. Use lowest resist skill.
return _holdMinResist[1];
}
im also only running the barb as a follower using this script
Code:
/*///////////////////////////////////////////////////////////////
Author: DysfunctionaI @ BlizzHackers, DysfunctionaI @ D2JSP
/////////////////////////////////////////////////////////////////
This file MUST be named NTHelperBotv2.ntj
If you're having a problem, then read the release thread first,
to see if your problem has already been discussed. If it hasn't,
then post your problem there; don't PM me. All command edits go
in NTHCommands.ntj
//////////////////////////////////////////////////////////////////
DON'T EDIT THIS FILE UNLESS YOU KNOW WHAT YOU'RE DOING!
////////////////////////////////////////////////////////////////*/
//Variable Declaration
Include("libs/common/NTCommon.ntl");
NTC_IncludeConfig("NTBot/char_configs");
var _leader = null;
var _leaderhandle = null;
var _leadername = NTH_Leader;
var _verbal = NTH_Verbal;
var _attack = NTH_Attack;
var _trigger = NTH_Trigger;
var _autoskill = NTH_AutoSkill;
var _useteleport = NTH_Teleport;
var _updatedleader = null;
var _target;
var _wp;
var _level = me.GetStat(12);
var _stay = false;
var _stuckx;
var _stucky;
var _stuckcount = 0;
var _autoskillcount = 0;
var _levelcount = 0;
var _getleadercount = 10;
function NTMain()
{
//Initialization
Include("NTBot/tools/NTHCommands.ntj");
NTC_IncludeLibs();
NT_LoadConfig();
NTSI_LoadNIPFiles("NTBot/item_configs");
NTA_Initialize();
RegisterEvent(EVENT_GAMEMSG, NTH_Talk);
NTConfig_PublicMode = false;
me.maxgametime = 0;
//Start Game
if(_autoskill)
{
switch(me.classid)
{
case NTC_CHAR_CLASS_AMAZON:
case NTC_CHAR_CLASS_BARBARIAN:
case NTC_CHAR_CLASS_DRUID:
case NTC_CHAR_CLASS_ASSASSIN:
NTH_Say("AutoSkill is not currently availible for my class. Disabling.");
_autoskill = false;
break;
default:
NTH_AttackSetup();
break;
}
}
while(!NTC_InMyParty(_leadername))
{
NTH_PartyLeader();
Delay(1000);
}
NTH_GetLeaderHandle();
//Bot
while(NTH_InGame(_leadername))
{
if(me.hp < 1 && (me.mode == 17 || me.mode == 0))
NTH_Revive();
if(!_stay && NTC_InMyParty(_leadername))
{
if(_getleadercount++ > 9)
{
_getleadercount = 0;
_updatedleader = NTH_GetLeader();
}
if(_updatedleader != null)
NTH_Follow();
else
{
if(me.areaid != _leaderhandle.areaid)
NTH_ChangeArea();
else
_updatedleader = NTH_GetLeader();
}
}
else
{
NTH_PartyLeader();
if(_attack && !NTC_InTown())
NTH_ClearPosition();
Delay(500);
}
Delay(100)
}
NTC_SendMsgToScript("NTBotGame.ntj", "SCRIPT_END");
return;
}
//GetLeader
function NTH_GetLeader()
{
_target = NTC_FindUnit(NTC_UNIT_PLAYER);
if(_target)
{
do
{
if(_target.name == _leadername)
return _target;
} while(_target.GetNext());
}
return null;
}
//Follow
function NTH_Follow()
{
if(GetDistance(me.x, me.y, _leader.x, _leader.y) > 4)
{
if(_stuckcount > 11)
{
_stuckcount = 0;
NTH_MoveTo(_leaderhandle.areaid, _leader.x, _leader.y, 15);
if(GetDistance(me.x, me.y, _leader.x, _leader.y) > 8)
NTH_ClearPosition(true);
}
_stuckx = me.x;
_stucky = me.y;
ClickMap(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, _leader.x, _leader.y);
ClickMap(NTC_CLICK_LUP, NTC_SHIFT_NONE, null);
Delay(100);
if(me.x == _stuckx && me.y == _stucky)
_stuckcount++;
}
else if(!NTC_InTown() && _attack)
{
_stuckcount = 0;
NTH_ClearPosition();
}
else
{
_stuckcount = 0;
Delay(200);
}
}
//ChangeArea
function NTH_ChangeArea()
{
var i;
var _orgcoords;
while(me.areaid == 0 || _leaderhandle.areaid == 0)
Delay(200);
// Walking Into New Area
if(GetDistance(me.x, me.y, _leader.x, _leader.y) < 50)
{
for(i = 0; i < 8; i++)
{
_orgcoords = _leader.x + _leader.y;
Delay(100);
if(_leader.x+_leader.y != _orgcoords)
{
ClickMap(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, _leader.x, _leader.y);
ClickMap(NTC_CLICK_LUP, NTC_SHIFT_NONE, null);
Delay(500);
return;
}
}
}
if(!NTH_TakeWaypoint(_leaderhandle.areaid))
{
if(!NTH_TakeStair(_leaderhandle.areaid))
{
if(!NTH_UsePortal("none"))
{
Say("I'm stuck");
Delay(50);
while(!NTH_GetLeader())
{
if(!NTC_InTown() && _attack)
NTH_ClearPosition(true);
Delay(500);
}
}
}
}
if(!NTC_InTown())
NTP_DoPrecast(true);
}
//Talk
function NTH_Talk(msg, type)
{
if(msg.indexOf(_leadername) != -1 && msg.charAt(_leadername.length+8) == _trigger)
{
var _command;
var _variable;
msg = msg.toLowerCase();
msg = msg.substring(_leadername.length+9)
msg = msg.split(" ");
_command = msg[0];
_variable = msg[1];
if(_variable == "")
_variable = undefined;
NTH_Commands(_command, _variable);
return;
}
}
//GetLeaderHandle
function NTH_GetLeaderHandle()
{
while(!_leaderhandle)
{
_target = GetPlayerUnit();
if(_target)
{
while(_target.GetNext())
{
if(_target.name == _leadername)
{
_leaderhandle = _target;
break;
}
}
}
Delay(500);
}
while(!_leader)
{
_leader = NTH_GetLeader();
Delay(100);
}
}
//Revive
function NTH_Revive()
{
var _message = new Array(4);
while(!NTC_InTown())
{
me.Cancel(0);
Delay(1000);
}
NTTM_TownMove("portalspot");
_message[1] = "Lmk when it's safe";
_message[2] = "TP and tell me if it's safe";
_message[3] = "Call me when it's safe";
_message[4] = "Just waiting for a safe TP";
_message[0] = _message[Random(1, 4)];
Say(_message[0]);
Delay(50);
while(!NTH_GetLeader())
Delay(500);
return;
}
//InGame
function NTH_InGame(playerName)
{
_target = GetPlayerUnit();
if(_target)
{
do
{
if(_target.name == playerName)
return true;
} while(_target.GetNext());
}
return false;
}
//Say
function NTH_Say(response)
{
if(_verbal)
{
Say(response);
Delay(50);
}
else
Print(response);
}
//TakeStair
function NTH_TakeStair(areaid)
{
var _unit;
var i;
_unit = NTM_GetStairInt(areaid);
if(!_unit)
return false;
for(i = 0; i < 6; i++)
{
NTM_MoveTo(me.areaid, _unit.x+1, _unit.y, 10);
NTC_DoClick(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, _unit);
Delay(500);
if(me.areaid == areaid)
return true;
}
return false;
}
//UsePortal
function NTH_UsePortal(leader, areaid)
{
var _portal;
var _preareaid = me.areaid;
if(arguments.length < 2)
areaid = 0;
if(me.areaid == 102) // Portal to A4
{
_portal = NTC_FindUnit(NTC_UNIT_OBJECT, 342);
for(var i = 0; i < 10; i++)
{
NTC_DoClick(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, _portal);
Delay(500);
if(me.areaid != _preareaid)
return true;
}
return false;
}
_portal = NTC_FindUnit(NTC_UNIT_OBJECT, GetLocaleString(3226));
if(_portal)
{
if(leader != "none")
{
do
{
if(_portal.mode == 2 && NTC_CheckOwner(_portal, leader) && GetDistance(me, _portal) <= 30)
{
if(areaid != 0)
if(_portal.subareaid != areaid)
return false;
while(me.areaid == _preareaid && _portal)
{
NTM_MoveTo(me.areaid, _portal.x+1, _portal.y, 10);
NTC_DoClick(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, _portal);
Delay(500);
if(me.areaid != _preareaid)
return true;
}
}
} while(_portal.GetNext());
}
else
{
do
{
if(_portal.mode == 2 && GetDistance(me, _portal) <= 30)
{
while(me.areaid == _preareaid && _portal)
{
NTM_MoveTo(me.areaid, _portal.x+1, _portal.y, 10);
NTC_DoClick(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, _portal);
Delay(500);
if(me.areaid != _preareaid)
return true;
}
}
} while(_portal.GetNext());
}
}
return false;
}
//TakeWaypoint
function NTH_TakeWaypoint(areaid)
{
if(me.areaid == areaid)
return true;
switch(areaid)
{
case 1:
case 3:
case 4:
case 5:
case 6:
case 27:
case 29:
case 32:
case 35:
case 40:
case 42:
case 43:
case 44:
case 46:
case 48:
case 52:
case 57:
case 74:
case 75:
case 76:
case 77:
case 78:
case 79:
case 80:
case 81:
case 83:
case 101:
case 103:
case 106:
case 107:
case 109:
case 111:
case 112:
case 113:
case 115:
case 117:
case 118:
case 129:
break;
default:
return false;
}
var _unit = NTM_GetWaypointInt();
if(!_unit)
return false;
if(NTC_InTown())
me.Cancel(1);
for(var i = 0 ; i < 20 ; i++)
{
if(me.areaid == _leaderhandle.areaid)
return true;
if((i % 10) == 0)
{
NTH_MoveTo(_unit.areaid, _unit.x, _unit.y, 10);
NTC_DoClick(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, _unit);
}
Delay(200);
if(GetUIState(0x14))
{
if(me.TakeWaypoint(areaid))
{
Delay(200);
return true;
}
else
{
NTH_Say("I don't have that waypoint!");
while(!NTH_GetLeader())
{
if(!NTC_InTown() && _attack)
NTH_ClearPosition(true);
Delay(500);
}
return true;
}
break;
}
}
return false;
}
//PartyLeader
function NTH_PartyLeader()
{
var _player = GetPlayerUnit();
if(_player)
{
var _mypartyid = _player.partyid;
while(_player.GetNext())
{
if(_player.name == _leadername)
{
if(_player.partyid == 65535 || _player.partyid != _mypartyid)
{
if(_player.partyflag == 2)
{
me.ClickParty(_player, 2);
return;
}
if(_player.partyid == 65535)
{
if(_player.partyflag == 4)
return;
me.ClickParty(_player, 2);
NTC_Delay(NTC_DELAY_FRAME);
if(_player.partyflag == 4 || (_player.partyid != 65535 && _player.partyid == _mypartyid))
return;
}
}
}
}
}
}
//Attack Setup
function NTH_AttackSetup()
{
var i;
var n = 0;
var _skillset = new Array;
var _build = new Array;
_skillset[0] = 0;
switch(me.classid)
{
case NTC_CHAR_CLASS_AMAZON:
return;
case NTC_CHAR_CLASS_SORCERESS:
_skillset[1] = NTC_GetSkillLevel(36); // Fire Bolt
_skillset[2] = NTC_GetSkillLevel(39); // Ice Bolt
_skillset[3] = NTC_GetSkillLevel(38); // Charged Bolt
for(i = 1; i <= 3; i++)
if(_skillset[i] > _skillset[n])
{
_skillset[0] = i;
n = i;
}
if(_skillset[0] == 1)
_build = [47, 36];
else if(_skillset[0] == 2)
_build = [59, 55, 45, 39];
else if(_skillset[0] == 3)
_build = [49, 38];
if(_skillset[0])
{
for(i = 0; i < _build.length; i++)
{
if(NTC_GetSkillLevel(_build[i]))
{
NTConfig_AttackSkill[1] = _build[i];
NTConfig_AttackSkill[3] = _build[i];
break;
}
}
}
else
{
NTConfig_AttackSkill[1] = 0;
NTConfig_AttackSkill[3] = 0;
}
return;
case NTC_CHAR_CLASS_NECROMANCER:
return;
case NTC_CHAR_CLASS_PALADIN:
_skillset[1] = NTC_GetSkillLevel(96); // Sacrifice
_skillset[2] = NTC_GetSkillLevel(112); // Blessed Hammer
for(i = 1; i <= 3; i++)
if(_skillset[i] > _skillset[n])
{
_skillset[0] = i;
n = i;
}
if(_skillset[0] == 1)
_build = [106, 96];
else if(_skillset[0] == 2)
_build = [112];
if(_skillset[0])
{
for(i = 0; i < _build.length; i++)
{
if(NTC_GetSkillLevel(_build[i]))
{
NTConfig_AttackSkill[1] = _build[i];
NTConfig_AttackSkill[3] = _build[i];
break;
}
}
}
else
{
NTConfig_AttackSkill[1] = 0;
NTConfig_AttackSkill[3] = 0;
}
return;
case NTC_CHAR_CLASS_BARBARIAN:
return;
case NTC_CHAR_CLASS_DRUID:
return;
case NTC_CHAR_CLASS_ASSASSIN:
return;
}
}
//ClearPosition
function NTH_ClearPosition(stuck)
{
NTP_DoPrecast(false);
if(_autoskill)
{
if(_autoskillcount++ > 30)
{
_autoskillcount = 0;
NTH_AttackSetup();
}
}
var _orgx, _orgy;
var _spectype = [0x01,0x01,0x0A];
var _skiplist;
var _attackcount = 0;
var _target;
var _distance, _mingid, _mindistance;
var _result;
var range = 20;
if(arguments.length == 1)
range = 3;
else
stuck = false;
if(NTConfig_AttackSkill[1] < 1 || NTConfig_AttackSkill[3] < 1)
return false;
_orgx = me.x;
_orgy = me.y;
for(var i = 0 ; i < _spectype.length ; i++)
{
_skiplist = new Array();
while(_attackcount < (i+1)*100)
{
if(_attackcount > 49)
break;
_mindistance = 100000;
_target = NTC_FindUnit(NTC_UNIT_MONSTER);
if(_target)
{
do
{
if(_skiplist.indexOf(_target.gid) < 0)
{
if(_target.IsAttackable() && (_target.spectype&_spectype[i]))
{
if(GetDistance(_orgx, _orgy, _target.x, _target.y) <= range && NTA_IsValidMonster(_target))
{
_distance = GetDistance(me, _target);
if(_distance < _mindistance)
{
_mingid = _target.gid;
_mindistance = _distance;
}
}
}
else
_skiplist.push(_target.gid);
}
} while(_target.GetNext());
}
if(_mindistance < 100000)
{
_target = NTC_FindUnit(NTC_UNIT_MONSTER, _mingid);
if(_target)
{
_result = NTA_Attack(_target, (_attackcount%30) == 0);
if((!stuck && GetDistance(me.x, me.y, _leader.x, _leader.y) > 20 && !_stay) || !_attack || me.mode == 17 || me.hp < 1)
return;
switch(_result)
{
case 1:
_skiplist.push(_mingid);
break;
case 2:
case 3:
_attackcount++;
break;
default:
return false;
}
}
}
else
break;
}
}
if(_attackcount > 0)
NTH_PickItems();
if(_levelcount++ > 10)
{
_levelcount = 0;
if(me.GetStat(12) > _level)
{
Say("!I feel much stronger now");
Delay(50);
_level = me.GetStat(12);
}
}
return true;
}
//MoveTo
function NTH_MoveTo(areaid, x, y, force)
{
var i, n;
var _teleport;
var _path;
if(x == me.x && y == me.y)
return true;
if(arguments.length < 4)
force = 0;
if(NTC_InTown() || NTC_GetSkillLevel(54) < 1 || !_useteleport)
_teleport = false;
else
_teleport = true;
_path = GetPath(areaid, me.x, me.y, x, y, _teleport);
if(_path)
{
for(i = 0 ; i < _path.length ; i++)
{
for(n = 0 ; n < 2 ; n++)
{
if(_teleport)
{
if(NTM_TeleportTo(_path[i][0]+Random(-n, n), _path[i][1]+Random(-n, n)))
break;
}
else
{
if(!NTH_WalkTo(_path[i][0], _path[i][1], force))
return;
break;
}
}
}
}
return true;
}
//WalkTo
function NTH_WalkTo(x, y, force)
{
// force of 10 is just force
// force of 15 is to return to leader
var i;
var _prex1, _prey1;
var _prex2, _prey2;
if(arguments.length < 3)
force = 0;
if(me.runwalk == 0)
me.runwalk = 1;
for(i = 0 ; i < 90 ; i++)
{
if((i % 10) == 0)
{
if((i % 60) == 0)
{
_prex1 = me.x;
_prey1 = me.y;
if((i % 120) == 0)
{
_prex2 = me.x;
_prey2 = me.y;
}
}
if((!_stay && force == 0 && GetDistance(me.x, me.y, _leader.x, _leader.y) > 20) || !_attack || me.mode == 17 || me.hp < 1)
return false;
if(force == 15 && GetDistance(me.x, me.y, _leader.x, _leader.y) < 10)
return false;
ClickMap(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, x, y);
}
NTC_Delay(NTC_DELAY_FRAME);
if(Math.abs(me.x-x) < 2 && Math.abs(me.y-y) < 2)
break;
if((i % 10) == 9)
{
ClickMap(NTC_CLICK_LUP, NTC_SHIFT_NONE, null);
NTC_Delay(NTC_DELAY_FRAME);
if((i % 60) == 59)
{
if(me.x == _prex1 && me.y == _prey1 && !NTC_InTown())
{
NTH_ClearPosition(2);
NTP_DoPrecast(false);
}
if((i % 120) == 119 && me.x == _prex2 && me.y == _prey2)
return true;
}
}
}
ClickMap(NTC_CLICK_LUP, NTC_SHIFT_NONE, null);
NTC_Delay(NTC_DELAY_FRAME);
return true;
}
//PickItems
function NTH_PickItems()
{
var i, _mode;
for(i = 0 ; i < 25 ; i++)
{
_mode = me.mode;
if((_mode >= 1 && _mode <= 3) || _mode == 5 || _mode == 6)
break;
NTC_Delay(NTC_DELAY_FRAME);
}
if(i < parseInt(100/NTC_DELAY_FRAME))
NTC_PingDelay(NTConfig_SnagDelay-(i*NTC_DELAY_FRAME));
var i;
var _item;
var _checkeditem, _checkeditems;
var _value;
var _minindex, _mindistance;
_item = NTC_FindUnit(NTC_UNIT_ITEM);
if(!_item)
return;
_checkeditems = new Array();
do
{
if(_item.mode == 3 || _item.mode == 5)
{
if(NTSI_IsIgnoredItemInt(_item.classid))
continue;
if(GetDistance(me, _item) <= NTConfig_SnagRange)
{
_value = NTSI_CheckItem(_item);
if(_value)
_checkeditems.push(new NTSI_ItemInt(_item, _value));
}
}
} while(_item.GetNext());
while(_checkeditems.length > 0)
{
_mindistance = 100000;
for(i = 0 ; i < _checkeditems.length ; i++)
{
_value = GetDistance(me.x, me.y, _checkeditems[i].x, _checkeditems[i].y);
if(_value < _mindistance)
{
_minindex = i;
_mindistance = _value;
}
}
_checkeditem = _checkeditems.splice(_minindex, 1)[0];
_item = NTC_FindUnit(NTC_UNIT_ITEM, _checkeditem.GID);
if(_item)
{
if(!NTSI_IsLimitedItemInt(_item))
{
if(NTT_CheckSpace(_item.xsize, _item.ysize))
{
if(NTH_SnagItem(_item))
{
switch(_checkeditem.ClassID)
{
case 515: // Rejuvenation Potion
case 516: // Full Rejuvenation Potion
Print("Picked up " + GetLocaleString(2209+_checkeditem.ClassID-515));
break;
case 587: // Minor Healing Potion
case 588: // Light Healing Potion
case 589: // Healing Potion
case 590: // Greater Healing Potion
case 591: // Super Healing Potion
case 592: // Minor Mana Potion
case 593: // Light Mana Potion
case 594: // Mana Potion
case 595: // Greater Mana Potion
case 596: // Super Mana Potion
Print("Picked up " + GetLocaleString(2266+_checkeditem.ClassID-587));
break;
default:
Print("Picked up " + NTC_ItemQualityToD2Color[_item.quality] + _item.name.split("\n")[0]);
if(_item.quality < 4 && _checkeditem.Status < 2 && _item.itemtype != 4 && (_item.itemtype < 76 || _item.itemtype > 81))
NTC_SendLogToOOG(NTC_LOG_ITEM, "Kept " + NTC_ItemQualityToMGRColor[_item.quality] + _item.name.split("\n")[0] + ";" + _item.itemdesc);
break;
}
}
}
else
{
NTH_Say("My inventory is full!");
return;
}
}
}
}
}
//SnagItem
function NTH_SnagItem(snagitem)
{
var i;
var _classid;
_classid = snagitem.classid;
for(i = 0 ; i < 40 ; i++)
{
if((i % 10) == 0 && (snagitem.mode == 3 || snagitem.mode == 5))
{
if(GetDistance(me, snagitem) > 3)
NTH_MoveTo(snagitem.areaid, snagitem.x, snagitem.y, 10);
if(NTC_ClearCursor())
NTC_DoClick(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, snagitem);
}
NTC_Delay(NTC_DELAY_FRAME);
if(_classid == 523)
{
Print("Picked up " + GetLocaleString(2215));
return false;
}
else if(snagitem.mode != 3 && snagitem.mode != 5)
{
var _parent;
NTC_PingDelay(100);
_parent = snagitem.GetParent();
return (_parent && _parent.gid == me.gid);
}
}
return false;
}
|
|
|
05/12/2014, 22:28
|
#5
|
elite*gold: 0
Join Date: Dec 2013
Posts: 39
Received Thanks: 0
|
Quote:
Originally Posted by Muddy Waters
P.S.: No errors merely indicates that the syntax is okay; it does, however, in no way reflect, that your code actually solves the problem at hand.
|
[code]
(47) : reference error : nta_initialize
Code:
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_SkillHand = new Array(7);
var _NTA_SkillDamage = new Array(7);
var _NTA_SkillRange = new Array(7);
var _CurseState;
var _SpearCount = 0;
var _SumCount = 0;
var _SkeleCount = 0;
var _MageCount = 0;
var _SumBreak = 0;
var _sorcattack = 0;
function NTA_Initialize()
{
if(NTConfig_AttackSkill[1] == 0 || NTConfig_AttackSkill[3] == 0)
NTA_DetectAttackPattern();
for(var i = 0 ; i < 8 ; 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]);
switch(NTConfig_AttackSkill[i])
{
case 280: // Normal Attack
_NTA_SkillRange[i] = 2;
break;
case 6: //Magic Arrow
case 7: //Fire Arrow
_NTA_SkillRange[i] = 20;
break;
case 8: //Inner Sight
_NTA_SkillRange[i] = 13;
break;
case 10: //Jab
_NTA_SkillRange[i] = 3;
break;
case 11: //Cold Arrow
case 12: //Multiple Shot
_NTA_SkillRange[i] = 20;
break;
case 14: //Power Strike
_NTA_SkillRange[i] = 20;
break;
case 15: //Poison Javelin
_NTA_SkillRange[i] = 10;
break;
case 16: //Exploding Arrow
_NTA_SkillRange[i] = 10;
break;
case 17: //Slow Missiles
_NTA_SkillRange[i] = 13;
break;
case 19: //Impale
_NTA_SkillRange[i] = 3;
break;
case 20: //Lightning Bolt
case 21: //Ice arrow
case 22: //Guided arrow
_NTA_SkillRange[i] = 20;
break;
case 24: //Charged Strike
_NTA_SkillRange[i] = 3;
break;
case 25: //Plague jav
_NTA_SkillRange[i] = 10;
break;
case 26://Strafe
case 27://Immolation Arrow
_NTA_SkillRange[i] = 20;
break;
case 30: //Fend
_NTA_SkillRange[i] = 3;
break;
case 31: //Freezing arrow
_NTA_SkillRange[i] = 15;
break;
case 35: //Lightning Fury
_NTA_SkillRange[i] = 12;
break;
case 38: //Charged Bolt
_NTA_SkillRange[i] = 20;
break;
case 44: //Frost Nova
case 48: //Nova
_NTA_SkillRange[i] = 10;
break;
case 64: //Frozen Orb
_NTA_SkillRange[i] = 15;
break;
case 74: //Corpse Explosion
case 84: //Bone Spear
_NTA_SkillRange[i] = 15;
break;
case 92://Poison Nova
_NTA_SkillRange[i] = 7;
break;
case 93://Bone Spirit
_NTA_SkillRange[i] = 25;
break;
case 95: //Revive
_NTA_SkillRange[i] = 20;
case 97: //Smite
_NTA_SkillRange[i] = 3;
break;
case 101: //Holy Bolt
_NTA_SkillRange[i] = 15;
break;
case 106: //Zeal
case 112: //Blessed Hammer
_NTA_SkillRange[i] = 3;
break;
case 144: //Concentrate
_NTA_SkillRange[i] = 8;
break;
case 147: //Frenzy
_NTA_SkillRange[i] = 2;
break;
case 151: //Whirlwind
_NTA_SkillRange[i] = 8;
break;
case 152: //Berserk
_NTA_SkillRange[i] = 3;
break;
case 225: //Fire Storm
case 229: //Molten Boulder
case 230: //Arctic Blast
case 232: //Feral Rage
case 233: //Maul
case 238: //Rabies
case 239: //Fire Claws
case 240: //Twister
case 242: //Hunger
case 243: //Shockwave
case 244: //Volcano
_NTA_SkillRange[i] = 3;
break;
case 245: //Tornado
_NTA_SkillRange[i] = 3;
break;
case 248: //Fury
_NTA_SkillRange[i] = 3;
break;
case 271: // Lightning Sentry
case 276: // Death Sentry
case 261: // Charged Bolt Sentry
_NTA_SkillRange[i] = 20;
break;
case 251: // Fire Blast
case 256: // Shockweb Sentry
_NTA_SkillRange[i] = 15;
break;
default:
_NTA_SkillRange[i] = 25;
break;
}
}
}
if(me.classid == NTC_CHAR_CLASS_ASSASSIN)
{
NTA_InitializeAssassinAttacks();
}
}
function NTA_InitializeAssassinAttacks()
{
// Find maximum range value for traps.
// No attacks should be set a high range value.
NTConfig_MinTrapRange = 999;
NTConfig_MinBossTrapRange = 999;
NTConfig_NumTraps = 0;
NTConfig_NumBossTrap = 0;
for(var i=0; i < 5; i++) {
if(NTConfig_TrapSet[i] > 0) {
// Find the lowest trap range
switch(NTConfig_TrapSet[i]) {
case 271: // Lightning Sentry
case 276: // Death Sentry
NTConfig_NumTraps++;
if(25 < NTConfig_MinTrapRange) // Trap range 25
NTConfig_MinTrapRange = 25;
break;
case 261: // Charged Bolt Sentry
NTConfig_NumTraps++;
if(10 < NTConfig_MinTrapRange) // Trap range 10
NTConfig_MinTrapRange = 10;
break;
case 262: // Wake of Fire
NTConfig_NumTraps++;
if(25 < NTConfig_MinTrapRange) // Trap range 25
NTConfig_MinTrapRange = 25;
break;
case 272: // Wake of Inferno
NTConfig_NumTraps++;
if(15 < NTConfig_MinTrapRange) // Trap range 15
NTConfig_MinTrapRange = 15;
break;
default: // User using invalid trap
// Do Nothing
break;
}
}
if(NTConfig_ActBossTrapSet[i] > 0) {
// Find the lowest trap range
switch(NTConfig_ActBossTrapSet[i]) {
case 271: // Lightning Sentry
case 276: // Death Sentry
NTConfig_NumBossTrap++;
if(25 < NTConfig_MinBossTrapRange) // Trap range 25
NTConfig_MinBossTrapRange = 25;
break;
case 261: // Charged Bolt Sentry
NTConfig_NumBossTrap++;
if(10 < NTConfig_MinBossTrapRange) // Trap range 10
NTConfig_MinBossTrapRange = 10;
break;
case 262: // Wake of Fire
NTConfig_NumBossTrap++;
if(25 < NTConfig_MinBossTrapRange) // Trap range 25
NTConfig_MinBossTrapRange = 25;
break;
case 272: // Wake of Inferno
NTConfig_NumBossTrap++;
if(15 < NTConfig_MinBossTrapRange) // Trap range 15
NTConfig_MinBossTrapRange = 15;
break;
default: // User using invalid trap
// Do Nothing
break;
}
}
}
}
function NTA_KillMonster(classid)
{
var _target;
if(NTConfig_AttackSkill[1] < 1)
return false;
_target = NTC_FindUnit(NTC_UNIT_MONSTER, classid, 5);
if(!_target)
return false;
if(_target.IsAttackable())
{
var _attackcount = 0;
while(_attackcount < 300 && NTA_IsValidMonster(_target))
{
if(NTA_Attack(_target, (_attackcount%30) == 0) < 2)
break;
_attackcount++;
_sorcattack++;
}
}
return (_target.hp <= 0 || _target.mode == 0 || _target.mode == 12);
}
function ReviveDead()
{
var _breaker=0;
_target = NTC_FindUnit(NTC_UNIT_MONSTER);
do
{
_skiplist = new Array();
if(_target.mode == 12 && !_target.GetState(96) && !_target.GetState(56) && (_target.spectype == 1 || _target.spectype == 17) && !_target.GetState(172) && !_target.GetState(173) && !_target.GetState(154) && _target.classid != 363 && _target.classid != 364 && _target.classid != 351 && _target.classid != 352 && _target.classid != 353)
{
if(_skiplist.indexOf(_target.gid) < 0)
{
if((GetDistance(me, _target) < 15))
{
var _pos = me.GetOptimalAttackPos(_target.areaid, _target.x, _target.y, 3, 4);
if(_pos)
{
NTM_MoveTo(_target.areaid, _pos[0], _pos[1], 0);
if(!NTC_CastSkill(95, NTC_HAND_RIGHT,_target.x+2,_target.y+1))
{
_breaker++;
_skiplist.push(_target.gid);
}
else
{
_breaker++;
}
}
}
else
_skiplist.push(_target.gid);
}
}
if (_breaker >= 1 || _target == null)
{
break;
_breaker = 0;
}
}
while(_target.GetNext());
}
function SkeleDead()
{
var _breaker=0;
_target = NTC_FindUnit(NTC_UNIT_MONSTER);
do
{
_skiplist = new Array();
if(_target.mode == 12 && !_target.GetState(96) && !_target.GetState(56) && (_target.spectype == 1 || _target.spectype == 17) && !_target.GetState(172) && !_target.GetState(173) && !_target.GetState(154) && _target.classid != 363 && _target.classid != 364 && _target.classid != 351 && _target.classid != 352 && _target.classid != 353)
{
if(_skiplist.indexOf(_target.gid) < 0)
{
if((GetDistance(me, _target) < 15))
{
var _pos = me.GetOptimalAttackPos(_target.areaid, _target.x, _target.y, 3, 4);
if(_pos)
{
NTM_MoveTo(_target.areaid, _pos[0], _pos[1], 0);
if(!NTC_CastSkill(70, NTC_HAND_RIGHT,_target.x+2,_target.y+1))
{
_breaker++;
_skiplist.push(_target.gid);
}
else
{
_breaker++;
_SkeleCount++;
_SumCount++;
}
}
}
else
_skiplist.push(_target.gid);
}
}
if (_breaker >= 1 || _target == null)
{
break;
_breaker = 0;
}
}
while(_target.GetNext());
}
function MageDead()
{
var _breaker=0;
_target = NTC_FindUnit(NTC_UNIT_MONSTER);
do
{
_skiplist = new Array();
if(_target.mode == 12 && !_target.GetState(96) && !_target.GetState(56) && (_target.spectype == 1 || _target.spectype == 17) && !_target.GetState(172) && !_target.GetState(173) && !_target.GetState(154) && _target.classid != 363 && _target.classid != 364 && _target.classid != 351 && _target.classid != 352 && _target.classid != 353)
{
if(_skiplist.indexOf(_target.gid) < 0)
{
if((GetDistance(me, _target) < 15))
{
var _pos = me.GetOptimalAttackPos(_target.areaid, _target.x, _target.y, 3, 4);
if(_pos)
{
NTM_MoveTo(_target.areaid, _pos[0], _pos[1], 0);
if(!NTC_CastSkill(80, NTC_HAND_RIGHT,_target.x+2,_target.y+1))
{
_breaker++;
_skiplist.push(_target.gid);
}
else
{
_breaker++;
_MageCount++;
_SumCount++;
}
}
}
else
_skiplist.push(_target.gid);
}
}
if (_breaker >= 1 || _target == null)
{
break;
_breaker = 0;
}
}
while(_target.GetNext());
}
function NTA_ClearPosition(range, pickitem, safelevel)
{
var _orgx, _orgy;
var _spectype = [0x0A, 0x01, 0x01];
var _skiplist;
var _attackcount = 0;
var _target;
var _distance, _mingid, _mindistance;
var _result;
var _sum = 0;
if(NTConfig_AttackSkill[1] < 1 || NTConfig_AttackSkill[3] < 1)
return false;
switch(arguments.length)
{
case 0:
range = 20;
case 1:
pickitem = false;
case 2:
safelevel = 0;
default:
if(NTConfig_CheckSelfSafe < 0x01 && NTConfig_CheckMercSafe < 0x01)
safelevel = 0;
break;
}
_orgx = me.x;
_orgy = me.y;
for(var i = 0 ; i < _spectype.length ; i++)
{
_skiplist = new Array();
while(_attackcount < (i+1)*100)
{
_mindistance = 100000;
_target = NTC_FindUnit(NTC_UNIT_MONSTER);
if(_target)
{
do
{
if(_skiplist.indexOf(_target.gid) < 0)
{
if(_target.IsAttackable() && (_target.spectype&_spectype[i]))
{
if(GetDistance(_orgx, _orgy, _target.x, _target.y) <= range && NTA_IsValidMonster(_target))
{
_distance = GetDistance(me, _target);
if(_distance < _mindistance)
{
_mingid = _target.gid;
_mindistance = _distance;
}
}
}
else
_skiplist.push(_target.gid);
}
} while(_target.GetNext());
}
if(_mindistance < 100000)
{
_target = NTC_FindUnit(NTC_UNIT_MONSTER, _mingid);
if(_target)
{
_result = NTA_Attack(_target, (_attackcount%30) == 0);
switch(_result)
{
case 1:
_skiplist.push(_mingid);
break;
case 2:
case 3:
_attackcount++;
_sorcattack++;
break;
default:
return false;
}
}
}
else
break;
}
}
if(me.classid == NTC_CHAR_CLASS_PALADIN)
{
if(_attackcount > 2 && (parseInt(me.hp*100/me.hpmax) < NTConfig_UseRedemptionHP || parseInt(me.mp*100/me.mpmax) < NTConfig_UseRedemptionMP))
{
if(NTC_PutSkill(124, NTC_HAND_RIGHT))
NTC_PingDelay(1000);
}
}
if(NTConfig_UseFindItem && me.classid == NTC_CHAR_CLASS_BARBARIAN && _attackcount > 2)
{
if(!NTA_CheckForCloseMonsters(10))
{
//Print("ÿc<No Monsters close - looting");
NTA_FindItem(NTConfig_FindItemRange);
}
else
{
//Print("ÿc1Close Monster detected - clearing area");
if(recursion)
{
NTA_ClearPosition(15, false, 0, false);
NTA_FindItem(NTConfig_FindItemRange);
}
}
if(me.classid == NTC_CHAR_CLASS_NECROMANCER)
{
_SumBreak = 0;
if(_attackcount > 2)
{
NTC_CastSkill(68, NTC_HAND_RIGHT); // Bone Armor
if(_SkeleCount < NTConfig_Skele + 1 || _MageCount < NTConfig_Mage + 1)
{
if(_SkeleCount == _MageCount)
{
for(var i = 0 ; i < 5 ; i++)
{
SkeleDead();
}
}
else if(_SkeleCount > _MageCount || _SkeleCount > NTConfig_Skele + 1)
{
for(var i = 0 ; i < 5 ; i++)
{
MageDead();
}
}
else if(_MageCount > _SkeleCount || _SkeleMage > NTConfig_Mage + 1)
{
for(var i = 0 ; i < 5 ; i++)
{
SkeleDead();
}
}
}
else
{
if(_SumCount >= 200)
{
_SumCount = 30;
_SkeleCount = _SkeleCount - 3;
_MageCount = _MageCount - 3;
}
for(var i = 0 ; i < 10 ; i++)
{
ReviveDead();
}
}
}
}
if(NTConfig_OpenChest)
{
_target = NTC_GetSpecialChest();
if(_target && GetDistance(_orgx, _orgy, _target.x, _target.y) <= range && NTC_OpenChest(_target))
_attackcount++;
}
if(pickitem && _attackcount > 0)
NTSI_PickItems();
switch(safelevel)
{
case 1:
return NTTMGR_CheckSafe(0x00, NTConfig_CheckMercSafe&0x01);
case 2:
return NTTMGR_CheckSafe(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe);
}
return true;
}
function NTA_ClearLevel(pickitem, safelevel)
{
var i;
var _room, _rooms;
var _distance, _minindex, _mindistance;
_room = GetRoom();
if(!_room)
return false;
switch(arguments.length)
{
case 0:
pickitem = true;
case 1:
safelevel = 2;
default:
if(NTConfig_CheckSelfSafe < 0x01 && NTConfig_CheckMercSafe < 0x01)
safelevel = 0;
break;
}
_rooms = new Array();
do
{
_rooms.push([parseInt(_room.x*5 + _room.xsize*5/2), parseInt(_room.y*5 + _room.ysize*5/2)]);
} while(_room.GetNext());
while(_rooms.length > 0)
{
_mindistance = 100000;
for(i = 0 ; i < _rooms.length ; i++)
{
_distance = GetDistance(me.x, me.y, _rooms[i][0], _rooms[i][1]);
if(_distance < _mindistance)
{
_minindex = i;
_mindistance = _distance;
}
}
if(NTM_MoveTo(me.areaid, _rooms[_minindex][0], _rooms[_minindex][1], 1))
{
if(!NTA_ClearRoom(pickitem, safelevel))
return false;
NTP_DoPrecast(false);
}
_rooms.splice(_minindex, 1);
}
return true;
}
function NTA_ClearRoom(pickitem, safelevel)
{
var _room;
var _spectype = [0x0A, 0x01, 0x01];
var _skiplist;
var _attackcount = 0;
var _target;
var _distance, _mingid, _mindistance;
var _result;
if(NTConfig_AttackSkill[1] < 1 || NTConfig_AttackSkill[3] < 1)
return false;
_room = me.GetRoom();
if(!_room)
return false;
switch(arguments.length)
{
case 0:
pickitem = false;
case 1:
safelevel = 0;
default:
if(NTConfig_CheckSelfSafe < 0x01 && NTConfig_CheckMercSafe < 0x01)
safelevel = 0;
break;
}
for(var i = 0 ; i < _spectype.length ; i++)
{
_skiplist = new Array();
while(_attackcount < (i+1)*100)
{
_mindistance = 100000;
_target = NTC_FindUnit(NTC_UNIT_MONSTER);
if(_target)
{
do
{
if(_skiplist.indexOf(_target.gid) < 0)
{
if(_target.IsAttackable() && (_target.spectype&_spectype[i]))
{
if(_room.UnitInRoom(_target) && NTA_IsValidMonster(_target))
{
_distance = GetDistance(me, _target);
if(_distance < _mindistance)
{
_mingid = _target.gid;
_mindistance = _distance;
}
}
}
else
_skiplist.push(_target.gid);
}
} while(_target.GetNext());
}
if(_mindistance < 100000)
{
_target = NTC_FindUnit(NTC_UNIT_MONSTER, _mingid);
if(_target)
{
_result = NTA_Attack(_target, (_attackcount%30) == 0);
switch(_result)
{
case 1:
_skiplist.push(_mingid);
break;
case 2:
case 3:
_attackcount++;
break;
default:
return false;
}
}
}
else
break;
}
}
if(me.classid == NTC_CHAR_CLASS_PALADIN)
{
if(_attackcount > 2 && (parseInt(me.hp*100/me.hpmax) < NTConfig_UseRedemptionHP || parseInt(me.mp*100/me.mpmax) < NTConfig_UseRedemptionMP))
{
if(NTC_PutSkill(124, NTC_HAND_RIGHT))
NTC_PingDelay(1000);
}
}
if(NTConfig_UseFindItem && me.classid == NTC_CHAR_CLASS_BARBARIAN && _attackcount > 2)
{
if(!NTA_CheckForCloseMonsters(10))
{
//Print("ÿc<No Monsters close - looting");
NTA_FindItem(NTConfig_FindItemRange);
}
else
{
//Print("ÿc1Close Monster detected - clearing area");
if(recursion)
{
NTA_ClearPosition(15, false, 0, false);
NTA_FindItem(NTConfig_FindItemRange);
}
}
if(me.classid == NTC_CHAR_CLASS_NECROMANCER && _RevCount <= 25)
{
if(_attackcount > 2)
ReviveDead();
}
if(me.classid == NTC_CHAR_CLASS_NECROMANCER)
{
_SumBreak = 0;
if(_attackcount > 2)
{
NTC_CastSkill(68, NTC_HAND_RIGHT); // Bone Armor
if(_SkeleCount < NTConfig_Skele + 1 || _MageCount < NTConfig_Mage + 1)
{
if(_SkeleCount == _MageCount)
{
for(var i = 0 ; i < 5 ; i++)
{
SkeleDead();
}
}
else if(_SkeleCount > _MageCount || _SkeleCount > NTConfig_Skele + 1)
{
for(var i = 0 ; i < 5 ; i++)
{
MageDead();
}
}
else if(_MageCount > _SkeleCount || _SkeleMage > NTConfig_Mage + 1)
{
for(var i = 0 ; i < 5 ; i++)
{
SkeleDead();
}
}
}
else
{
if(_SumCount >= 200)
{
_SumCount = 30;
_SkeleCount = _SkeleCount - 3;
_MageCount = _MageCount - 3;
}
for(var i = 0 ; i < 10 ; i++)
{
ReviveDead();
}
}
}
}
if(pickitem && _attackcount > 0)
NTSI_PickItems();
switch(safelevel)
{
case 1:
return NTTMGR_CheckSafe(0x00, NTConfig_CheckMercSafe&0x01);
case 2:
return NTTMGR_CheckSafe(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe);
}
return true;
}
function NTA_IsValidMonster(monster)
{
var _classid;
if(monster.hp <= 0 || monster.mode == 0 || monster.mode == 12)
return false;
_classid = monster.classid;
if((me.areaid == 108) && ((7759 <= me.x <= 7761) && (me.y == 5267)) && GetDistance(me.x,me.y,monster.x,monster.y) <= 10 )
return false;
if (_classid >= 419 && _classid <= 427)
return false;
if(monster.name == GetLocaleString(3162) && GetDistance(me.x,me.y,monster.x,monster.y) <= 25 )
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;
if(monster.hp <= 0 || monster.mode == 0 || monster.mode == 12)
return false;
if(((_classid >= 110 && _classid <= 113) || _classid == 608) && monster.mode == 8) // ignore flying scavengers
return false;
if(_classid == 68 && monster.mode == 14) // ignore burrowing maggots
return false;
if(_classid >= 258 && _classid <= 263 && monster.mode == 14) // ignore submerged WaterWatchers
return false;
if(monster.GetState(53) || monster.GetState(96)) // Conversion, Revive
return false;
if(me.classid == NTC_CHAR_CLASS_DRUID)
{
if(!me.GetState(144))
NTC_CastSkill(250, NTC_HAND_RIGHT);
if(!me.GetState(151))
NTC_CastSkill(235, NTC_HAND_RIGHT);
if(!me.GetState(149))
NTC_CastSkill(226, NTC_HAND_RIGHT);
}
if(me.classid == NTC_CHAR_CLASS_NECROMANCER)
{
if(!me.GetState(14))
NTC_CastSkill(68, NTC_HAND_RIGHT)
}
return true;
}
function NTA_GetDamageType(skillid)
{
if(skillid == 74) // Corpse Explosion
return NTA_DAMAGE_PHYSICAL;
if(skillid == 112) // Blessed Hammer
return NTA_DAMAGE_NONE;
switch(GetBaseStat("skills.txt", skillid, 233))
{
case "cold":
return NTA_DAMAGE_COLD;
case "fire":
return NTA_DAMAGE_FIRE;
case "ltng":
return NTA_DAMAGE_LIGHTNING;
case "mag":
return NTA_DAMAGE_MAGIC;
case "pois":
return NTA_DAMAGE_POISON;
case "stun":
return NTA_DAMAGE_NONE;
default:
if(GetBaseStat("skills.txt", skillid, 178) || GetBaseStat("skills.txt", skillid, 182)) // aura or passive
return NTA_DAMAGE_NONE;
}
return NTA_DAMAGE_PHYSICAL;
}
function NTA_GetResistance(enemy, type)
{
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_DetectAttackPattern()
{
switch(me.classid)
{
case NTC_CHAR_CLASS_AMAZON:
return NTA_AmazonAttackPatternInt();
case NTC_CHAR_CLASS_SORCERESS:
return NTA_SorceressAttackPatternInt();
case NTC_CHAR_CLASS_NECROMANCER:
return NTA_NecromancerAttackPatternInt();
case NTC_CHAR_CLASS_PALADIN:
return NTA_PaladinAttackPatternInt();
case NTC_CHAR_CLASS_BARBARIAN:
return NTA_BarbarianAttackPatternInt();
case NTC_CHAR_CLASS_DRUID:
return NTA_DruidAttackPatternInt();
case NTC_CHAR_CLASS_ASSASSIN:
return NTA_AssassinAttackPatternInt();
}
return false;
}
// Return value : 0 = Unrecoverable process, 1 = Unavailable attack, 2 = Onetime fail, 3 = Success
function NTA_Attack(target, firstorder)
{
switch(me.classid)
{
case NTC_CHAR_CLASS_AMAZON:
return NTA_AmazonAttackInt(target, firstorder);
case NTC_CHAR_CLASS_SORCERESS:
return NTA_SorceressAttackInt(target, firstorder);
case NTC_CHAR_CLASS_NECROMANCER:
return NTA_NecromancerAttackInt(target, firstorder);
case NTC_CHAR_CLASS_PALADIN:
return NTA_PaladinAttackInt(target, firstorder);
case NTC_CHAR_CLASS_BARBARIAN:
return NTA_BarbarianAttackInt(target, firstorder);
case NTC_CHAR_CLASS_DRUID:
return NTA_DruidAttackInt(target, firstorder);
case NTC_CHAR_CLASS_ASSASSIN:
return NTA_AssassinAttackInt(target, firstorder);
}
return 0;
}
function NTA_IsWeaponBroken()
{
var _weapon;
_weapon = me.GetItems();
if(_weapon)
{
for(var i = 0 ; i < _weapon.length ; i++)
{
if(_weapon[i].itemflag&0x100)
{
if(_weapon[i].mode == 1 && _weapon[i].itemloc == 4 || _weapon[i].itemloc == 5)
{
Print("ÿc8My weapon broke, I am going to town to repair it.")
NTTMGR_VisitTown();
NTTMGR_TownManager();
break;
}
}
}
}
}
function NTA_HaveArrows()
{
var _weapon;
var _haveAmmo = false;
_weapon = me.GetItems();
if(_weapon)
{
for(var i = 0 ; i < _weapon.length ; i++)
{
if((_weapon[i].classid == 526 || _weapon[i].classid == 528) && _weapon[i].itemloc == 5)
{
if(_weapon[i].GetStat(70) < 10)
{
Print("ÿc8I'm low on "+ _weapon[i].name + ", I am going to town to buy more.")
NTTMGR_VisitTown();
NTTMGR_TownManager();
}
_haveAmmo = true;
break;
}
}
}
if(!_haveAmmo)
{
Print("ÿc8I have no ammo, I am going to town to buy some.")
NTTMGR_VisitTown();
NTTMGR_TownManager();
}
}
// Internal function
function NTA_AmazonAttackPatternInt()
{
var _maxindex, _maxskill;
var _avgskilllevel = new Array();
_avgskilllevel[0] = me.GetSkill(35, false);
_avgskilllevel[1] = parseInt((me.GetSkill(31, false) + me.GetSkill(11, false) + me.GetSkill(21, false)) /3 );
_avgskilllevel[2] = me.GetSkill(26, false);
_maxindex = -1;
_maxskill = 0;
for(var i = 0 ; i < _avgskilllevel.length ; i++)
{
if(_avgskilllevel[i] > _maxskill)
{
_maxindex = i;
_maxskill = _avgskilllevel[i];
}
}
switch(_maxindex)
{
case 0: // Lightning Fury for Javazon
NTConfig_AttackSkill[1] = 35;
NTConfig_AttackSkill[2] = 35;
NTConfig_AttackSkill[3] = 35;
NTConfig_AttackSkill[4] = 35;
NTConfig_AttackSkill[5] = 35;
NTConfig_AttackSkill[6] = 35;
NTConfig_AttackSkill[7] = 24;
break;
case 1: // Freezing Arrow for Bowzon
NTConfig_AttackSkill[1] = 31;
NTConfig_AttackSkill[2] = 31;
NTConfig_AttackSkill[3] = 31;
NTConfig_AttackSkill[4] = 31;
NTConfig_AttackSkill[5] = 31;
NTConfig_AttackSkill[6] = 31;
NTConfig_AttackSkill[7] = 31;
break;
case 2: // Cold Arrow + Strafe for Bowzon
NTConfig_AttackSkill[0] = 11;
NTConfig_AttackSkill[1] = 26;
NTConfig_AttackSkill[2] = 26;
NTConfig_AttackSkill[3] = 26;
NTConfig_AttackSkill[4] = 26;
NTConfig_AttackSkill[5] = 26;
NTConfig_AttackSkill[6] = 26;
NTConfig_AttackSkill[7] = 22;
break;
}
return (NTConfig_AttackSkill[1] && NTConfig_AttackSkill[3]);
}
function NTA_AmazonAttackInt(target, firstorder)
{
var _primaryindex;
if(NTTMGR_CheckCurse(NTConfig_CheckSelfSafe&0x10, NTConfig_CheckMercSafe&0x10))
{
if(!NTTMGR_VisitTown())
return 0;
}
if(me.GetSkill(12, false) >= 1)
NTA_HaveArrows();
else
NTA_IsWeaponBroken();
if(firstorder && NTConfig_AttackSkill[0] > 0 && NTA_GetResistance(target, _NTA_SkillDamage[0]) < 100)
{
if(GetDistance(me, target) > _NTA_SkillRange[0] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[0], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(!NTC_CastSkill(NTConfig_AttackSkill[0], _NTA_SkillHand[0], target))
return 2;
return 3;
}
_primaryindex = (target.spectype&0x0A) ? 1 : 3;
switch(target.classid)
{
case 243://Diablo
case 544://Baal
case 242:
if(!NTA_AmazonCastSkillInt(7, target))
return 2;
return 3;
default:
break;
}
if(NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) <= 90)
{
if(!NTA_AmazonCastSkillInt(_primaryindex, target))
return 2;
return 3;
}
if(NTConfig_AttackSkill[5] > 0 && NTA_GetResistance(target, _NTA_SkillDamage[5]) > 80)
{
if(!NTA_AmazonCastSkillInt(5, target))
return 2;
return 3;
}
if(NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) < 100 || (_primaryindex == 1 && NTC_GetMerc()))
{
if(!NTA_AmazonCastSkillInt(_primaryindex, target))
return 2;
return 3;
}
return 1;
}
function NTA_AmazonCastSkillInt(index, target)
{
if(GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[index], NTC_HAND_LEFT, target);
if(NTConfig_AttackSkill[index+1] > 0)
{
if(GetDistance(me, target) > _NTA_SkillRange[index+1] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index+1], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[index+1], _NTA_SkillHand[index+1], target);
}
}
function NTA_SorceressAttackPatternInt()
{
var _maxindex, _maxskill;
var _avgskilllevel = new Array();
_avgskilllevel[0] = parseInt((me.GetSkill(59, false)+me.GetSkill(39, false)+me.GetSkill(45, false)+me.GetSkill(55, false))/4);
_avgskilllevel[1] = parseInt((me.GetSkill(53, false)+me.GetSkill(38, false)+me.GetSkill(48, false)+me.GetSkill(49, false))/4);
_avgskilllevel[2] = parseInt((me.GetSkill(47, false)+me.GetSkill(36, false)+me.GetSkill(56, false)+me.GetSkill(64, false))/4);
_avgskilllevel[3] = parseInt((me.GetSkill(47, false)+me.GetSkill(36, false)+me.GetSkill(56, false))/3);
_maxindex = -1;
_maxskill = 0;
for(var i = 0 ; i < _avgskilllevel.length ; i++)
{
if(_avgskilllevel[i] > _maxskill)
{
_maxindex = i;
_maxskill = _avgskilllevel[i];
}
}
switch(_maxindex)
{
case 0: // Blizzard + Glacial Spike
NTConfig_AttackSkill[1] = 59;
NTConfig_AttackSkill[2] = 55;
NTConfig_AttackSkill[3] = 59;
NTConfig_AttackSkill[4] = 55;
break;
case 1: // Chain Lightning + Lightning
NTConfig_AttackSkill[1] = 49;
NTConfig_AttackSkill[3] = 53;
break;
case 2: // Fire Ball + Frozen Orb
NTConfig_AttackSkill[0] = 64;
NTConfig_AttackSkill[1] = 47;
NTConfig_AttackSkill[3] = 47;
NTConfig_AttackSkill[5] = 64;
NTConfig_AttackSkill[6] = 55;
break;
case 3: // Fire Ball + Meteor
NTConfig_AttackSkill[1] = 56;
NTConfig_AttackSkill[2] = 47;
NTConfig_AttackSkill[3] = 56;
NTConfig_AttackSkill[4] = 47;
break;
}
return (NTConfig_AttackSkill[1] && NTConfig_AttackSkill[3]);
}
function NTA_SorceressAttackInt(target, firstorder)
{
var _primaryindex;
var _attackSkill;
if(NTTMGR_CheckCurse(NTConfig_CheckSelfSafe&0x10, NTConfig_CheckMercSafe&0x10))
{
if(!NTTMGR_VisitTown())
return 0;
}
if(firstorder && NTConfig_AttackSkill[0] > -1 && NTA_GetResistance(target, _NTA_SkillDamage[0]) < 100 && me.GetSkillStatus(NTConfig_AttackSkill[0]) != 8)
{
if(GetDistance(me, target) > _NTA_SkillRange[0] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[0], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(!NTC_CastSkill(NTConfig_AttackSkill[0], _NTA_SkillHand[0], target))
return 2;
return 3;
}
if(NTConfig_CastStatic < 100 && parseInt(target.hp*100/target.hpmax) > NTConfig_CastStatic && NTA_GetResistance(target, NTA_DAMAGE_LIGHTNING) <= 80 && (target.name == "Mephisto" || target.name == "Andariel" || target.name == "Duriel" ||target.name == "Diablo" || target.name == "Baal"))
{
var _staticlevel = NTC_GetSkillLevel(42);
if(_staticlevel > 0)
{
var _staticrange;
var _castx, _casty;
_staticrange = Math.floor((5+_staticlevel-1)*2/3);
if(GetDistance(me, target) > _staticrange || !CheckCollision(me, target, 6))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _staticrange, 6);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(target.x < me.x)
_castx = me.x - 1;
else if(target.x > me.x)
_castx = me.x + 1;
else
_castx = me.x;
if(target.y < me.y)
_casty = me.y - 1;
else if(target.y > me.y)
_casty = me.y + 1;
else
_casty = me.y;
if(!CheckCollision(target.areaid, _castx, _casty, 1))
{
_castx = me.x;
_casty = me.y;
}
if(!NTC_CastSkill(42, NTC_HAND_RIGHT, _castx, _casty))
return 2;
return 3;
}
}
_primaryindex = (target.spectype&0x0A) ? 1 : 3;
_attackSkill = NTA_GetAttackType(target, _primaryindex, 91, 81, 81); // delete
if(NTConfig_AttackSkill[_attackSkill] > -1)
{
if(!NTA_SorceressCastSkillInt(_attackSkill, target, _primaryindex))
return 2;
return 3;
}
if(NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) < 100 || (_primaryindex == 1 && NTC_GetMerc()))
{
if(!NTA_SorceressCastSkillInt(_primaryindex, target, _primaryindex))
return 2;
return 3;
}
return 1;
}
function NTA_SorceressCastSkillInt(index, target, primaryIndex)
{
var secondarySkill = 0;
_haveCL = NTC_GetSkillLevel(53); // check to see if we even have CL
_havetele = NTC_GetSkillLevel(54);
if(_sorcattack >= 20)
_sorcattack = 0;
if(_havetele && NTConfig_DancingSorc)
{
NTTMGR_CheckSafe(false, 0x01); // revive merc
if((NTA_CheckMyHp() || ((target.GetState(28) <= 0) && NTA_CheckMercInfinity())) || (_sorcattack%NTConfig_AttackJump) == 0)
{
if(target.GetState(28) <= 0){Print("");Print("");}
NTA_Bounce(target);
}
}
if(me.GetSkillStatus(NTConfig_AttackSkill[index]) != 8)
{
if(GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(target.name == "Baal" && NTConfig_AttackSkill[10] > -1 )
return NTC_CastSkill(NTConfig_AttackSkill[10], _NTA_SkillHand[10], target);
if((target.name == "Mephisto" || target.name == "Andariel" || target.name == "Duriel" || target.name == "Diablo") && NTConfig_AttackSkill[9] > -1 && target.name != "Baal")
return NTC_CastSkill(NTConfig_AttackSkill[9], _NTA_SkillHand[9], target);
if(target.name == "Duriel" && NTConfig_UseColdOnDury)
{
if(NTConfig_UseOrb)
{
return (NTC_CastSkill(64, NTC_HAND_LEFT, target))
}
if(NTConfig_UseBlizz)
{
return (NTC_CastSkill(59, NTC_HAND_LEFT, target))
}
}
if(NTConfig_ChainLightOnLightImmunes && NTA_GetResistance(target, NTA_DAMAGE_LIGHTNING) >= 90 && _haveCL > 0)
{
return(NTC_CastSkill(53, NTC_HAND_LEFT, target))
}
return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], target);
}
secondarySkill = NTA_GetAttackType (target, primaryIndex+1, 81, 81, 81); // delete
if(NTConfig_AttackSkill[secondarySkill] > -1)
{
if(GetDistance(me, target) > _NTA_SkillRange[secondarySkill] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index+1], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[secondarySkill], _NTA_SkillHand[secondarySkill], target);
}
for(var i = 0 ; i < 25 ; i++)
{
NTC_Delay(NTC_DELAY_FRAME);
if(me.GetSkillStatus(NTConfig_AttackSkill[index]) != 8)
break;
}
return false;
}
function NTA_NecromancerAttackPatternInt()
{
var _maxindex, _maxskill;
var _avgskilllevel = new Array();
_avgskilllevel[0] = me.GetSkill(84, fasle);
_maxindex = -1;
_maxskill = 0;
for(var i = 0 ; i < _avgskilllevel.length ; i++)
{
if(_avgskilllevel[i] > _maxskill)
{
_maxindex = i;
_maxskill = _avgskilllevel[i];
}
}
switch(_maxindex)
{
case 0:
NTConfig_AttackSkill[0] = 84;
NTConfig_AttackSkill[1] = 84;
NTConfig_AttackSkill[3] = 84;
break;
}
return (NTConfig_AttackSkill[1] && NTConfig_AttackSkill[3]);
}
function GetCurseState(skillid)
{
if(NTConfig_Curse == 66)
return 9;
if(NTConfig_Curse == 71)
return 23;
if(NTConfig_Curse == 76)
return 55;
if(NTConfig_Curse == 77)
return 56;
if(NTConfig_Curse == 81)
return 59;
if(NTConfig_Curse == 82)
return 58;
if(NTConfig_Curse == 86)
return 57;
if(NTConfig_Curse == 87)
return 60;
if(NTConfig_Curse == 91)
return 61;
}
function NTA_NecromancerAttackInt(target, firstorder)
{
var _primaryindex;
if(NTTMGR_CheckCurse(NTConfig_CheckSelfSafe&0x10, NTConfig_CheckMercSafe&0x10))
{
if(!NTTMGR_VisitTown())
return 0;
}
if(!target.GetState(GetCurseState()))
NTC_CastSkill(NTConfig_Curse, NTC_HAND_RIGHT, target)
if(firstorder && NTConfig_AttackSkill[0] > 0 && NTA_GetResistance(target, _NTA_SkillDamage[0]) < 100 && me.GetSkillStatus(NTConfig_AttackSkill[0]) != 8)
{
if(GetDistance(me, target) > _NTA_SkillRange[0] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[0], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
}
_primaryindex = (target.spectype&0x0A) ? 1 : 3;
if(NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) <= 90)
{
if(!NTA_NecromancerCastSkillInt(_primaryindex, target))
return 2;
return 3;
}
if(NTConfig_AttackSkill[5] > 0 && NTA_GetResistance(target, _NTA_SkillDamage[5]) <= 80)
{
if(_SpearCount < 6 && target.name == "Achmel the Cursed" )
{
if(_SpearCount < 1)
NTM_WalkTo(me.x+3, me.y);
NTC_CastSkill(67, NTC_HAND_RIGHT, target);
_SpearCount++;
//Print(_SpearCount);
}
else if(target.name == "Horadrim Ancient")
{
NTM_MoveTo(target.areaid, target.x, target.y, 0);
NTC_PingDelay(1000);
}
else
{
NTA_NecromancerCastSkillInt(5, target)
return 2;
}
return 3;
}
if(NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) < 100 || (_primaryindex == 1 && NTC_GetMerc()))
{
if(!NTA_NecromancerCastSkillInt(_primaryindex, target))
return 2;
return 3;
}
return 1;
}
function NTA_NecromancerCastSkillInt(index, target)
{
if(me.GetSkillStatus(NTConfig_AttackSkill[index]) != 8)
{
if(GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], target);
}
if(NTConfig_AttackSkill[index+1] > 0)
{
if(GetDistance(me, target) > _NTA_SkillRange[index+1] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index+1], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[index+1], _NTA_SkillHand[index+1], target);
}
for(var i = 0 ; i < 25 ; i++)
{
NTC_Delay(NTC_DELAY_FRAME);
if(me.GetSkillStatus(NTConfig_AttackSkill[index]) != 8)
break;
}
return false;
}
function NTA_PaladinAttackPatternInt()
{
var _maxindex, _maxskill;
var _avgskilllevel = new Array();
_avgskilllevel[0] = parseInt((me.GetSkill(112, false)+me.GetSkill(108, false)+me.GetSkill(115, false))/3);
_avgskilllevel[1] = parseInt((me.GetSkill(106, false)+me.GetSkill(96, false))/2);
_avgskilllevel[2] = parseInt((me.GetSkill(121, false)+me.GetSkill(101, false)+me.GetSkill(118, false))/3);
_maxindex = -1;
_maxskill = 0;
for(var i = 0 ; i < _avgskilllevel.length ; i++)
{
if(_avgskilllevel[i] > _maxskill)
{
_maxindex = i;
_maxskill = _avgskilllevel[i];
}
}
_maxindex = 0;
switch(_maxindex)
{
case 0: // Blessed Hammer
NTConfig_AttackSkill[1] = 112;
NTConfig_AttackSkill[2] = 113;
NTConfig_AttackSkill[3] = 112;
NTConfig_AttackSkill[4] = 113;
NTConfig_AttackSkill[5] = 101;
NTConfig_AttackSkill[6] = 113;
break;
case 1: // Zeal
NTConfig_AttackSkill[1] = 106;
NTConfig_AttackSkill[2] = 122;
NTConfig_AttackSkill[3] = 106;
NTConfig_AttackSkill[4] = 122;
break;
case 2: // Fist of the Heavens
NTConfig_AttackSkill[1] = 121;
NTConfig_AttackSkill[2] = 123;
NTConfig_AttackSkill[3] = 121;
NTConfig_AttackSkill[4] = 123;
break;
}
return (NTConfig_AttackSkill[1] && NTConfig_AttackSkill[3]);
}
function NTA_PaladinAttackInt(target, firstorder)
{
var _primaryindex;
if(NTTMGR_CheckCurse(NTConfig_CheckSelfSafe&0x10, NTConfig_CheckMercSafe&0x10))
{
if(!NTTMGR_VisitTown())
return 0;
}
if(firstorder && NTConfig_AttackSkill[0] > 0 && NTA_GetResistance(target, NTA_DAMAGE_MAGIC) < 100)
{
if(GetDistance(me, target) > _NTA_SkillRange[0] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[0], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(!NTC_CastSkill(NTConfig_AttackSkill[0], _NTA_SkillHand[0], target))
return 2;
return 3;
}
_primaryindex = (target.spectype&0x0A) ? 1 : 3;
if(NTA_GetResistance(target, NTA_DAMAGE_MAGIC) < 100)
{
if(_NTA_SkillRange[_primaryindex] < 4 && !CheckCollision(target.areaid, target.x, target.y, 1))
return 1;
if(!NTA_PaladinCastSkillInt(_primaryindex, target))
return 2;
return 3;
}
if(NTConfig_AttackSkill[5] > 0 && NTA_GetResistance(target, NTA_DAMAGE_MAGIC) >= 100)
{
if(_NTA_SkillRange[5] < 4 && !CheckCollision(target.areaid, target.x, target.y, 1))
return 1;
if(!NTA_PaladinCastSkillInt(5, target))
return 2;
return 3;
}
return 1;
}
function NTA_PaladinCastSkillInt(index, target)
{
if(NTConfig_AttackSkill[index] == 112)
{
if(me.x-target.x < 1 || me.x-target.x > 2 || me.y-target.y < 1 || me.y-target.y > 2)
{
if(CheckCollision(target.areaid, target.x+2, target.y+2, 1))
NTM_MoveTo(target.areaid, target.x+2, target.y+2, 0);
else if(me.x-target.x < -4 || me.x-target.x > 2 || me.y-target.y < 0 || me.y-target.y > 2)
NTM_MoveTo(target.areaid, target.x-4, target.y, 0);
}
}
else
{
if(GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
}
if(NTConfig_AttackSkill[index+1] > 0)
NTC_PutSkill(NTConfig_AttackSkill[index+1], NTC_HAND_RIGHT);
return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], target);
}
function NTA_BarbarianAttackPatternInt()
{
var _maxindex, _maxskill;
var _avgskilllevel = new Array();
_avgskilllevel[0] = me.GetSkill(151, false);
_maxindex = -1;
_maxskill = 0;
for(var i = 0 ; i < _avgskilllevel.length ; i++)
{
if(_avgskilllevel[i] > _maxskill)
{
_maxindex = i;
_maxskill = _avgskilllevel[i];
}
}
switch(_maxindex)
{
case 0: // Whirlwind
NTConfig_AttackSkill[1] = 151;
NTConfig_AttackSkill[3] = 151;
NTConfig_AttackSkill[5] = 152;
break;
}
return (NTConfig_AttackSkill[1] && NTConfig_AttackSkill[3]);
}
function NTA_BarbarianAttackInt(target, firstorder)
{
var _primaryindex;
if(NTTMGR_CheckCurse(NTConfig_CheckSelfSafe&0x10, NTConfig_CheckMercSafe&0x10))
{
if(!NTTMGR_VisitTown())
return 0;
}
if(firstorder && NTConfig_AttackSkill[0] > 0 && NTA_GetResistance(target, _NTA_SkillDamage[0]) < 100)
{
if(GetDistance(me, target) > _NTA_SkillRange[0] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[0], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(!NTC_CastSkill(NTConfig_AttackSkill[0], _NTA_SkillHand[0], target))
return 2;
return 3;
}
_primaryindex = (target.spectype&0x0A) ? 1 : 3;
if(NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) < 100)
{
if((_NTA_SkillRange[_primaryindex] < 4 || NTConfig_AttackSkill[_primaryindex] == 151) && !CheckCollision(target.areaid, target.x, target.y, 1))
return 1;
if(!NTA_BarbarianCastSkillInt(_primaryindex, target))
return 2;
return 3;
}
if(NTConfig_AttackSkill[5] > 0 && NTA_GetResistance(target, _NTA_SkillDamage[5]) < 100)
{
if((_NTA_SkillRange[5] < 4 || NTConfig_AttackSkill[5] == 151) && !CheckCollision(target.areaid, target.x, target.y, 1))
return 1;
if(!NTA_BarbarianCastSkillInt(5, target))
return 2;
return 3;
}
return 1;
}
function NTA_BarbarianCastSkillInt(index, target)
{
if(NTConfig_AttackSkill[index] == 151)
{
var _castx, _casty;
if(GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 5))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 5);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
_castx = target.x > me.x ? target.x+3 : target.x-3;
_casty = target.y > me.y ? target.y+3 : target.y-3;
return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], _castx, _casty);
}
if(GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], target);
}
function NTA_DruidAttackInt(target, firstorder)
{
var _primaryindex;
if(NTTMGR_CheckCurse(NTConfig_CheckSelfSafe&0x10, NTConfig_CheckMercSafe&0x10))
{
if(!NTTMGR_VisitTown())
return 0;
}
if(firstorder && NTConfig_AttackSkill[0] > 0 && NTA_GetResistance(target, _NTA_SkillDamage[0]) < 100)
{
if(GetDistance(me, target) > NTConfig_AttackSkill[0] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(!NTC_CastSkill(NTConfig_AttackSkill[0], _NTA_SkillHand[0], target))
return 2;
return 3;
}
_primaryindex = (target.spectype&0x0A) ? 1 : 3;
if(me.GetSkill(245, true) > 1)
if(target.name == "Andariel" || target.name == "Baal" || target.name == "Mephisto" || target.name == "Diablo")
{
if(!NTA_DruidCastSkillIntNear(_primaryindex, target))
return 2;
return 3;
}
if(NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) <= 90)
{
if(!NTA_DruidCastSkillInt(_primaryindex, target))
return 2;
return 3;
}
if(NTConfig_AttackSkill[5] > 0 && NTA_GetResistance(target, _NTA_SkillDamage[5]) <= 80)
{
if(!NTA_DruidCastSkillInt(5, target))
return 2;
return 3;
}
if(NTA_GetResistance(target, _NTA_SkillDamage[index]) < 100 || (_primaryindex == 1 && NTC_GetMerc()))
{
if(!NTA_DruidCastSkillInt(_primaryindex, target))
return 2;
return 3;
}
return 1;
}
function NTA_DruidCastSkillIntNear(index, target)
{
if(GetDistance(me, target) > 3 || !CheckCollision(me, target, 4))
NTM_MoveTo(target.areaid, target.x, target.y, 0);
return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], target);
if(NTConfig_AttackSkill[index+1] > 0)
{
if(GetDistance(me, target) > 3 || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, 3, 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[index+1], _NTA_SkillHand[index+1], target);
}
}
function NTA_DruidCastSkillInt(index, target)
{
if(GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(!me.GetState(139))
NTC_CastSkill(223, NTC_HAND_RIGHT) // Werewolf
else if(!me.GetState(140))
NTC_CastSkill(228, NTC_HAND_RIGHT) // Werebear
return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], target);
if(NTConfig_AttackSkill[index+1] > 0)
{
if(GetDistance(me, target) > _NTA_SkillRange[index+1] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index+1], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[index+1], _NTA_SkillHand[index+1], target);
}
}
function NTA_AssassinAttackPatternInt()
{
return false;
}
function NTA_AssassinAttackInt(target, firstorder)
{
var _primaryindex;
var _attackIndex;
var _skillCasted = 0;
if(NTTMGR_CheckCurse(NTConfig_CheckSelfSafe&0x10, NTConfig_CheckMercSafe&0x10))
{
if(!NTTMGR_VisitTown())
return 0;
}
if(firstorder && NTConfig_AttackSkill[0] > -1 && NTA_GetResistance(target, _NTA_SkillDamage[0]) < 100)
{
if(GetDistance(me, target) > _NTA_SkillRange[0] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[0], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(!NTC_CastSkill(NTConfig_AttackSkill[0], _NTA_SkillHand[0], target))
return 2;
return 3;
}
if(NTConfig_UseTraps)
NTA_CheckTraps(target);
_primaryindex = (target.spectype&0x0A) ? 1 : 3;
_attackIndex = NTA_GetAttackType(target, _primaryindex, 91, 81, 81);
if(NTConfig_AttackSkill[_attackIndex] > -1 )
{
_skillCasted = _attackIndex;
if(_NTA_SkillRange[_attackIndex] < 4 && !CheckCollision(target.areaid, target.x, target.y, 1))
return 1;
if(!NTA_AssassinCastSkillInt(_attackIndex, target, _primaryindex))
return 2;
return 3;
}
if(NTConfig_UseTraps) {
if(_skillCasted == 0)
NTC_Delay(NTConfig_AttackSkill);
return 3;
}
return 1;
}
function NTA_AssassinCastSkillInt(index, target, primaryIndex)
{
var secondarySkill = 0;
if(me.GetSkillStatus(NTConfig_AttackSkill[index]) != 8)
{
if(GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], target);
}
secondarySkill = NTA_GetAttackType (target, primaryIndex+1, 81, 81, 81);
if(NTConfig_AttackSkill[secondarySkill] > -1)
{
if(GetDistance(me, target) > _NTA_SkillRange[secondarySkill] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[secondarySkill], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[secondarySkill], _NTA_SkillHand[secondarySkill], target);
}
for(var i = 0 ; i < 25 ; i++)
{
NTC_Delay(NTC_DELAY_FRAME);
if(me.GetSkillStatus(NTConfig_AttackSkill[index]) != 8)
break;
}
return false;
}
function NTA_CheckTraps(target)
{
var traps=NTC_FindUnit(NTC_UNIT_MONSTER);
var trapcount =0;
//var warr=0;
var x,y;
var parent;
var _isActBoss = false;
var _trapOffset;
// || target.name == GetLocaleString(3021) - Andariel
if(target.name == GetLocaleString(3062) || target.name == GetLocaleString(3054)
|| target.name == GetLocaleString(3060) || target.name == GetLocaleString(3061))
_isActBoss = true;
if (traps){
do{
if (traps.classid == 412 || traps.classid == 413 || traps.classid == 416 || traps.classid == 417){
parent = traps.GetParent();
if(parent != null && parent.name == me.name) {
if(GetDistance(target.x,target.y,traps.x,traps.y)< (_isActBoss?NTConfig_MinBossTrapRange:NTConfig_MinTrapRange) && traps.hp > 100 ) {
trapcount=trapcount+1;
}
}
}
/*if ((traps.classid == 418 || traps.classid == 419) && traps.mode == 12){ // apparently 417/418 are warrior/master. commented out for now
warr=1;
}*/
}while(traps.GetNext())
if (trapcount < (_isActBoss?NTConfig_NumBossTrap:NTConfig_NumTraps) && target.hp>0){
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, 13, 10);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
_trapOffset = NTA_GetTrapAttackPattern(_isActBoss);
for(var i=0; i < 5; i++) {
if(NTConfig_TrapSet[i] > 0) {
if(i == 0 || i == 2 || i == 3) // Added delays to prevent trap miscast
NTC_Delay(25);
NTC_CastSkill((_isActBoss?NTConfig_TrapSet[0]:NTConfig_TrapSet[i]), NTC_HAND_RIGHT, target.x + _trapOffset[i][0], target.y + _trapOffset[i][1]);
}
}
}
/*if (warr!=0)
NTP_DoPrecast(false);*/
}
}
function NTA_GetTrapAttackPattern(isActBoss) {
var _attackPattern = new Array(5);
var _bossOffset = 1;
if(NTConfig_TrapAttackPattern == 1) { // Pentagram
_attackPattern[0] = [-2 - (isActBoss?_bossOffset:0), -2 - (isActBoss?_bossOffset:0)];
_attackPattern[1] = [0, 2 + (isActBoss?_bossOffset:0)];
_attackPattern[2] = [2 + (isActBoss?_bossOffset:0), -2 - (isActBoss?_bossOffset:0)];
_attackPattern[3] = [-3 - (isActBoss?_bossOffset:0), 1 + (isActBoss?_bossOffset:0)];
_attackPattern[4] = [3 + (isActBoss?_bossOffset:0), 1 + (isActBoss?_bossOffset:0)];
}
else if(NTConfig_TrapAttackPattern == 2) { // X - axis
_attackPattern[0] = [0, 0];
_attackPattern[1] = [1 + (isActBoss?_bossOffset:0), 0];
_attackPattern[2] = [-1 - (isActBoss?_bossOffset:0), 0];
_attackPattern[3] = [2 + (isActBoss?_bossOffset:0), 0];
_attackPattern[4] = [-2 - (isActBoss?_bossOffset:0), 0];
}
else if(NTConfig_TrapAttackPattern == 3) { // Y - axis
_attackPattern[0] = [0, 0];
_attackPattern[1] = [0, 1 + (isActBoss?_bossOffset:0)];
_attackPattern[2] = [0, -1 - (isActBoss?_bossOffset:0)];
_attackPattern[3] = [0, 2 + (isActBoss?_bossOffset:0)];
_attackPattern[4] = [0, -2 - (isActBoss?_bossOffset:0)];
}
else { // quincunx
_attackPattern[0] = [2 + (isActBoss?_bossOffset:0), 2 + (isActBoss?_bossOffset:0)];
_attackPattern[1] = [-2 - (isActBoss?_bossOffset:0), -2 - (isActBoss?_bossOffset:0)];
_attackPattern[2] = [-2 - (isActBoss?_bossOffset:0), 2 + (isActBoss?_bossOffset:0)];
_attackPattern[3] = [2 + (isActBoss?_bossOffset:0), -2 - (isActBoss?_bossOffset:0)];
_attackPattern[4] = [0, 0];
}
return _attackPattern;
}
function NTA_CheckMercInfinity()
{
var _weapon, _merc;
var Merc_HaveInfinty = false;
_merc = NTC_GetMerc();
if(!_merc)
{
{
//Print("ÿc8merc is dead or not hired");
}
return false;
}
if(_merc && _merc.hp > 0 && _merc.mode != 0 && _merc.mode != 12)
{
_weapon = _merc.GetItems();
if(_weapon){
for(var i = 0 ; i < _weapon.length && !Merc_HaveInfinty ; i++){
if((_weapon[i].itemflag&0x4000000) && _weapon[i].itemprefix == 20566){
Merc_HaveInfinty = true;
{
//Print("ÿc8merc has infinity");
}
return true;
}
}
}
}
if(!Merc_HaveInfinty)
{
// Print("ÿc8merc has no infinity");
return false;
}
}
function NTA_CheckMyHp()
{
_LifeMax = me.hpmax;
_ManaMax = me.mpmax;
if(NTConfig_DanceStartHp > 0 || NTConfig_DanceStartMp > 0)
{
if(parseInt(me.hp*100/_LifeMax) < NTConfig_DanceStartHp || parseInt(me.mp*100/_ManaMax) < NTConfig_DanceStartMp)
{
return true;
}
}
else
return false;
}
function NTA_Bounce(target)
{
if (me.x - target.x >= 0 && me.y - target.y >= 0)
NTC_CastSkill(54, NTC_HAND_RIGHT, target.x - 9, target.y - 9);
else if (me.x - target.x >= 0 && me.y - target.y < 0)
NTC_CastSkill(54, NTC_HAND_RIGHT, target.x - 9, target.y + 9);
else if (me.x - target.x < 0 && me.y - target.y >= 0)
NTC_CastSkill(54, NTC_HAND_RIGHT, target.x + 9, target.y + 9);
else
NTC_CastSkill(54, NTC_HAND_RIGHT, target.x + 9, target.y - 9);
_sorcattack = 0;
}
function NTA_CheckForCloseMonsters(range)
{
if(range < 1 || arguments.length < 1)
return false;
var _monstersClose = false;
var _checkMonster = NTC_FindUnit(NTC_UNIT_MONSTER);
if(_checkMonster)
{
do
{
if(_checkMonster.IsAttackable() && GetDistance(me.x, me.y, _checkMonster.x, _checkMonster.y) < range && NTA_IsValidMonster(_checkMonster))
{
_monstersClose = true;
break;
}
} while(_checkMonster.GetNext());
}
return _monstersClose;
}
function NTA_GetAttackType(target, startIndex, resistMaxPrimary, resistMaxSecondary, resistMaxTertiary) {
var _currIndex;
var _holdMinResist = [999, startIndex];
var _resistArray = [999,999,999];
var _holdResistMax = [resistMaxPrimary, resistMaxSecondary, resistMaxTertiary];
var i;
for(i=0, _currIndex=startIndex; i < 3;i++, _currIndex += 2) {
if(NTConfig_AttackSkill[_currIndex] > -1 )
{
_resistArray[i] = NTA_GetResistance(target, _NTA_SkillDamage[_currIndex]);
if(_resistArray[i] < _holdResistMax[i]) // Return index if attack is < our max resist requirement
return _currIndex;
}
if(_resistArray[i] < _holdMinResist[0]) { // Store lowest resist attack
_holdMinResist[0] = _resistArray[i];
_holdMinResist[1] = _currIndex;
}
if(_currIndex == 1 || _currIndex == 2) // Skip non boss primary if boss attack
_currIndex += 2;
}
if(_holdMinResist[0] >= 100) // Every attack is immune
return startIndex;
else // At this point all available skills are greater than given max resist settings. Use lowest resist skill.
return _holdMinResist[1];
}
function NTA_FindItem(range)
{
var _corpse;
var _orgx;
var _orgy;
var _startTick;
var _reposition = false;
if(me.classid != NTC_CHAR_CLASS_BARBARIAN || NTC_GetSkillLevel(131) < 1)
return false;
if(arguments.length < 1 || !range)
range = 25;
_corpse = NTC_FindUnit(NTC_UNIT_MONSTER);
_orgx = me.x;
_orgy = me.y;
NTC_PingDelay(50);
NTC_SwapWeapons(2);
if(_corpse)
{
do
{
if(GetDistance(_orgx, _orgy, _corpse.x, _corpse.y) <= range && NTA_CheckLootStatus(_corpse) && NTA_IsLootable(_corpse.classid))
{
if(GetDistance(me.x, me.y, _corpse.x, _corpse.y) >= 8)
{
if(!NTM_MoveTo(me.areaid, _corpse.x, _corpse.y))
continue;
}
_startTick = GetTickCount();
_reposition = false;
while(NTA_CheckLootStatus(_corpse) && !_corpse.IsAttackable())
{
NTC_CastSkill(131, NTC_HAND_RIGHT, _corpse);
NTC_PingDelay(50);
if(GetTickCount() >= _startTick + 1000 && !_reposition) // repositioning after 1sec
{
_reposition = true;
if(!NTM_MoveTo(me.areaid, _corpse.x, _corpse.y))
break;
}
if(GetTickCount() >= _startTick + 2500) // skipping monster after 2.5sec
{
if(me.mp < 10)
{
//Print("Lack of ÿc3Manaÿc0!");
if(NTConfig_BuyPotsIfLackOfMana)
{
if(NTTMGR_VisitTown())
NTC_SwapWeapons(2);
}
break;
}
var _filehandle = FileOpen("FailedtoLoot.txt", 2);
var _dateString = new Date().toLocaleFormat("%a %m/%d/%y %H:%M:%S");
if(_filehandle)
{
var _states = "States:: ";
for(var i = 0; i < 144; i++)
{
if(_corpse.GetState(i))
_states += "State(" + i + "): " + _corpse.GetState(i) + "<--> ";
}
_filehandle.WriteLine("[" + _dateString + "] Could not loot: " + _corpse.name +" [" + _corpse.classid + "] (Location: " + me.areaid + ") " + _states);
_filehandle.Close();
}
Print("ÿc;Could not loot: " + _corpse.name +" [" + _corpse.classid + "] <Mode: " + _corpse.mode + "> (Location: " + me.areaid + ")");
break;
}
}
/*if(GetTickCount() < _startTick + 2000)
NTC_SendMsgToScript("NTBotGame.ntj", "SET_LOOTED_NULL");*/
}
} while(_corpse.GetNext());
NTC_SwapWeapons(0);
NTC_PingDelay(50);
NTSI_PickItems();
return true;
}
return false;
}
function NTA_CheckForCloseMonsters(range)
{
if(range < 1 || arguments.length < 1)
return false;
var _monstersClose = false;
var _checkMonster = NTC_FindUnit(NTC_UNIT_MONSTER);
if(_checkMonster)
{
do
{
if(_checkMonster.IsAttackable() && GetDistance(me.x, me.y, _checkMonster.x, _checkMonster.y) < range && NTA_IsValidMonster(_checkMonster))
{
_monstersClose = true;
break;
}
} while(_checkMonster.GetNext());
}
return _monstersClose;
}
function NTA_CheckLootStatus(monsterunit)
{
if(!monsterunit.GetState(107) // Shattered
&& !monsterunit.GetState(104) // Corpse Explosion
&& !monsterunit.GetState(118) // Already Looted/Unlootable
&& (monsterunit.hp <= 0 || monsterunit.mode == 0 || monsterunit.mode == 12)) // Dead
return true;
else
return false;
}
return _monstersClose;
}
function NTA_CheckLootStatus(monsterunit)
{
if(!monsterunit.GetState(107) // Shattered
&& !monsterunit.GetState(104) // Corpse Explosion
&& !monsterunit.GetState(118) // Already Looted/Unlootable
&& (monsterunit.hp <= 0 || monsterunit.mode == 0 || monsterunit.mode == 12)) // Dead
return true;
else
return false;
}
function NTA_IsLootable(classid)
{
switch(classid)
{
case 179: // cow
case 156: // Andariel
case 180: // Sand Maggot Young
case 181: // Rock Worm Young
case 182: // Devourer Young
case 183: // Giant Lamprey Young
case 184: // World Killer Young
case 190: // Sand Maggot Egg
case 191: // Rock Worm Egg
case 192: // Devourer Egg
case 193: // Giant Lamprey Egg
case 194: // World Killer Egg
case 206: // Fould Crow Nest
case 207: // Blood Hawk Nest
case 208: // Black Vulture Nest
case 209: // Cloud Stalker Nest
case 221: // Duriel
case 227: // Maggot
case 228: // Mummy Generator
case 234: // Flying Scimitar
case 242: // Mephisto
case 243: // Diablo
case 250: // Summoner
case 258: // Water Watcher Limb
case 259: // River Stalker Limb
case 260: // Sygain Watcher Limb
case 261: // Water Watcher Head
case 262: // River Stalker Head
case 263: // Sygain Watcher Head
case 267: // Blood Raven
case 269: // An evil force
case 270: // Rogue Scout (== Merc)
case 273: // Gargoyle Trap
case 289: // Clay Golem
case 290: // Blood Golem
case 291: // Iron Golem
case 292: // Fire Golem
case 301: // Flesh Beast
case 302: // Stygian Dog
case 303: // Grotesque Wyrm
case 318: // An Evil Force
case 326: // A Trap
case 327: // A Trap
case 328: // A Trap
case 329: // A Trap
case 330: // A Trap
case 334: // Sucker Nest
case 335: // Fleeder Nest
case 336: // Blood Hook Nest
case 337: // Blood Wing Nest
case 338: // Act 2 guard (== Merc)
case 348: // Turret
case 349: // Turret
case 350: // Turret
case 351: // Hydra
case 352: // Hydra
case 353: // Hydra
case 354: // A Trap
case 356: // Dopplezon
case 357: // Valkyrie
case 359: // Iron Wolf (== Merc)
case 366: // Compelling Orb
case 369: // A Trap
case 371: // Lightning Spire
case 372: // Fire Tower
case 403: // Traped Soul
case 404: // Traped Soul
case 406: // Izual
case 410: // Wake Of Destruction
case 411: // Charged Bolt Sentry
case 412: // Lightning Sentry
case 413: // Blade Creeper
case 414: // Invisible Pet
case 415: // Inferno Sentry
case 416: // Death Sentry
case 417: // Shadow Warrior
case 418: // Shadow Master
case 419: // Druid Hawk
case 420: // Druid Spirit Wolf
case 421: // Druid Fenris
case 422: // Spirit of Barbs
case 423: // Heart Of Wolverine
case 424: // Oak Sage
case 425: // Druid Plague Poppy
case 426: // Druid Cycle of Life
case 427: // Vine Creature
case 428: // Druid Bear
case 429: // Eagle
case 430: // Wolf
case 431: // Bear
case 432: // Barricaded Door
case 433: // Barricaded Door
case 434: // Prison Door
case 435: // Barricaded Door
case 461: // Fanatic Minion
case 462: // Beserk Slayer
case 463: // Consumed Fire Boar
case 464: // Consumed Ice Boar
case 465: // Frenzied Hell Spawn
case 466: // Frenzied Hell Spawn
case 467: // Insane Hell Spawn
case 468: // Insane Ice Spawn
case 497: // Catapult
case 498: // Catapult
case 499: // Catapult
case 500: // Catapult
case 501: // Frozen Horror 1
case 502: // Frozen Horror 2
case 503: // Frozen Horror 3
case 504: // Frozen Horror 4
case 505: // Frozen Horror 5
case 516: // Catapult
case 517: // Catapult
case 518: // Catapult
case 519: // Catapult
case 522: // Barbarian Fighter
case 523: // Barbarian Fighter
case 524: // Barricade Wall Right
case 525: // Barricade Wall Left
case 526: // Nihlatak
case 528: // Evil Hut
case 535: // Barbarian Fighter
case 536: // Barbarian Fighter
case 537: // Ancient Statue 1
case 538: // Ancient Statue 2
case 539: // Ancient Statue 3
case 540: // Ancient Barbarian 1
case 541: // Ancient Barbarian 2
case 542: // Ancient Barbarian 3
case 543: // Baal Throne
case 544: // Baal Crab
case 545: // Baal Taunt
case 551: // Pain Worm
case 552: // Pain Worm
case 553: // Pain Worm
case 554: // Pain Worm
case 555: // Pain Worm
case 556: // Bunny
case 559: // Baal Crab to Stairs
case 560: // Hireling
case 561: // Hireling
case 562: // Baal Tentacle
case 563: // Baal Tentacle
case 564: // Baal Tentacle
case 565: // Baal Tentacle
case 566: // Baal Tentacle
case 567: // Injured Barbarian
case 568: // Injured Barbarian
case 569: // Injured Barbarian
case 570: // Baal Crab Clone
case 571: // Baals Minions
case 572: // Baals Minionse
case 573: // Baals Minions
case 574: // Worldstone Effect
case 662: // Flayer Shaman
return false;
break;
default:
return true;
break;
}
}
|
|
|
05/18/2014, 01:46
|
#6
|
elite*gold: 0
Join Date: Dec 2013
Posts: 39
Received Thanks: 0
|
ok well here I FINALLY got NO error but still wont attack corpse even tho I have changed all the skill codes from 142 to 131
Code:
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_SkillHand = new Array(7);
var _NTA_SkillDamage = new Array(7);
var _NTA_SkillRange = new Array(7);
var _CurseState;
var _SpearCount = 0;
var _SumCount = 0;
var _SkeleCount = 0;
var _MageCount = 0;
var _SumBreak = 0;
var _sorcattack = 0;
function NTA_Initialize()
{
if(NTConfig_AttackSkill[1] == 0 || NTConfig_AttackSkill[3] == 0)
NTA_DetectAttackPattern();
for(var i = 0 ; i < 8 ; 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]);
switch(NTConfig_AttackSkill[i])
{
case 280: // Normal Attack
_NTA_SkillRange[i] = 2;
break;
case 6: //Magic Arrow
case 7: //Fire Arrow
_NTA_SkillRange[i] = 20;
break;
case 8: //Inner Sight
_NTA_SkillRange[i] = 13;
break;
case 10: //Jab
_NTA_SkillRange[i] = 3;
break;
case 11: //Cold Arrow
case 12: //Multiple Shot
_NTA_SkillRange[i] = 20;
break;
case 14: //Power Strike
_NTA_SkillRange[i] = 20;
break;
case 15: //Poison Javelin
_NTA_SkillRange[i] = 10;
break;
case 16: //Exploding Arrow
_NTA_SkillRange[i] = 10;
break;
case 17: //Slow Missiles
_NTA_SkillRange[i] = 13;
break;
case 19: //Impale
_NTA_SkillRange[i] = 3;
break;
case 20: //Lightning Bolt
case 21: //Ice arrow
case 22: //Guided arrow
_NTA_SkillRange[i] = 20;
break;
case 24: //Charged Strike
_NTA_SkillRange[i] = 3;
break;
case 25: //Plague jav
_NTA_SkillRange[i] = 10;
break;
case 26://Strafe
case 27://Immolation Arrow
_NTA_SkillRange[i] = 20;
break;
case 30: //Fend
_NTA_SkillRange[i] = 3;
break;
case 31: //Freezing arrow
_NTA_SkillRange[i] = 15;
break;
case 35: //Lightning Fury
_NTA_SkillRange[i] = 12;
break;
case 38: //Charged Bolt
_NTA_SkillRange[i] = 20;
break;
case 44: //Frost Nova
case 48: //Nova
_NTA_SkillRange[i] = 10;
break;
case 64: //Frozen Orb
_NTA_SkillRange[i] = 15;
break;
case 74: //Corpse Explosion
case 84: //Bone Spear
_NTA_SkillRange[i] = 15;
break;
case 92://Poison Nova
_NTA_SkillRange[i] = 7;
break;
case 93://Bone Spirit
_NTA_SkillRange[i] = 25;
break;
case 95: //Revive
_NTA_SkillRange[i] = 20;
case 97: //Smite
_NTA_SkillRange[i] = 3;
break;
case 101: //Holy Bolt
_NTA_SkillRange[i] = 15;
break;
case 106: //Zeal
case 112: //Blessed Hammer
_NTA_SkillRange[i] = 3;
break;
case 144: //Concentrate
_NTA_SkillRange[i] = 8;
break;
case 147: //Frenzy
_NTA_SkillRange[i] = 2;
break;
case 151: //Whirlwind
_NTA_SkillRange[i] = 8;
break;
case 152: //Berserk
_NTA_SkillRange[i] = 3;
break;
case 225: //Fire Storm
case 229: //Molten Boulder
case 230: //Arctic Blast
case 232: //Feral Rage
case 233: //Maul
case 238: //Rabies
case 239: //Fire Claws
case 240: //Twister
case 242: //Hunger
case 243: //Shockwave
case 244: //Volcano
_NTA_SkillRange[i] = 3;
break;
case 245: //Tornado
_NTA_SkillRange[i] = 3;
break;
case 248: //Fury
_NTA_SkillRange[i] = 3;
break;
case 271: // Lightning Sentry
case 276: // Death Sentry
case 261: // Charged Bolt Sentry
_NTA_SkillRange[i] = 20;
break;
case 251: // Fire Blast
case 256: // Shockweb Sentry
_NTA_SkillRange[i] = 15;
break;
default:
_NTA_SkillRange[i] = 25;
break;
}
}
}
if(me.classid == NTC_CHAR_CLASS_ASSASSIN) {
NTA_InitializeAssassinAttacks();
}
}
function NTA_InitializeAssassinAttacks() {
// Find maximum range value for traps.
// No attacks should be set a high range value.
NTConfig_MinTrapRange = 999;
NTConfig_MinBossTrapRange = 999;
NTConfig_NumTraps = 0;
NTConfig_NumBossTrap = 0;
for(var i=0; i < 5; i++) {
if(NTConfig_TrapSet[i] > 0) {
// Find the lowest trap range
switch(NTConfig_TrapSet[i]) {
case 271: // Lightning Sentry
case 276: // Death Sentry
NTConfig_NumTraps++;
if(25 < NTConfig_MinTrapRange) // Trap range 25
NTConfig_MinTrapRange = 25;
break;
case 261: // Charged Bolt Sentry
NTConfig_NumTraps++;
if(10 < NTConfig_MinTrapRange) // Trap range 10
NTConfig_MinTrapRange = 10;
break;
case 262: // Wake of Fire
NTConfig_NumTraps++;
if(25 < NTConfig_MinTrapRange) // Trap range 25
NTConfig_MinTrapRange = 25;
break;
case 272: // Wake of Inferno
NTConfig_NumTraps++;
if(15 < NTConfig_MinTrapRange) // Trap range 15
NTConfig_MinTrapRange = 15;
break;
default: // User using invalid trap
// Do Nothing
break;
}
}
if(NTConfig_ActBossTrapSet[i] > 0) {
// Find the lowest trap range
switch(NTConfig_ActBossTrapSet[i]) {
case 271: // Lightning Sentry
case 276: // Death Sentry
NTConfig_NumBossTrap++;
if(25 < NTConfig_MinBossTrapRange) // Trap range 25
NTConfig_MinBossTrapRange = 25;
break;
case 261: // Charged Bolt Sentry
NTConfig_NumBossTrap++;
if(10 < NTConfig_MinBossTrapRange) // Trap range 10
NTConfig_MinBossTrapRange = 10;
break;
case 262: // Wake of Fire
NTConfig_NumBossTrap++;
if(25 < NTConfig_MinBossTrapRange) // Trap range 25
NTConfig_MinBossTrapRange = 25;
break;
case 272: // Wake of Inferno
NTConfig_NumBossTrap++;
if(15 < NTConfig_MinBossTrapRange) // Trap range 15
NTConfig_MinBossTrapRange = 15;
break;
default: // User using invalid trap
// Do Nothing
break;
}
}
}
}
function NTA_KillMonster(classid)
{
var _target;
if(NTConfig_AttackSkill[1] < 0)
return false;
_target = NTC_FindUnit(NTC_UNIT_MONSTER, classid, 5);
if(!_target)
return false;
if(_target.IsAttackable())
{
var _attackcount = 0;
while(_attackcount < 300 && NTA_IsValidMonster(_target))
{
if(NTA_Attack(_target, (_attackcount%30) == 0) < 2)
break;
_attackcount++;
_sorcattack++;
}
}
return (_target.hp <= 0 || _target.mode == 0 || _target.mode == 12);
}
function NTA_ClearPosition(range, pickitem, safelevel)
{
var _orgx, _orgy;
//var _spectype = [0x0A, 0x01, 0x01];
var _spectype = [0x0A, 0x01];
var _skiplist;
var _gid_attackcount;
var _attackcount = 0;
var _target;
var _distance, _mingid, _minshamangid, _mindistance, _minshamandistance;
var _result;
if(NTConfig_AttackSkill[1] < 0 || NTConfig_AttackSkill[3] < 0)
return false;
switch(arguments.length)
{
case 0:
range = 20;
case 1:
pickitem = true;
case 2:
safelevel = 0;
default:
if(NTConfig_CheckSelfSafe < 0x01 && NTConfig_CheckMercSafe < 0x01)
safelevel = 0;
break;
}
_orgx = me.x;
_orgy = me.y;
for(var i = 0 ; i < _spectype.length ; i++)
{
_skiplist = new Array();
_gid_attackcount = new Array();
while(_attackcount < (i+1)*100)
{
_minshamandistance = 100000;
_mindistance = 100000;
_target = NTC_FindUnit(NTC_UNIT_MONSTER);
if(_target)
{
do
{
if(_skiplist.indexOf(_target.gid) < 0)
{
if(_target.IsAttackable() && (_target.spectype&_spectype[i]))
{
if(GetDistance(_orgx, _orgy, _target.x, _target.y) <= range && NTA_IsValidMonster(_target))
{
_distance = GetDistance(me, _target);
if(_distance < _mindistance)
{
_mingid = _target.gid;
_mindistance = _distance;
}
if((MonstersToAttackFirst.indexOf(_target.classid) > -1)
&& _distance < _minshamandistance)
{
_minshamangid = _target.gid;
_minshamandistance = _distance;
}
}
}
else
_skiplist.push(_target.gid);
}
} while(_target.GetNext());
}
if(_minshamandistance < 100000)
{
_target = NTC_FindUnit(NTC_UNIT_MONSTER, _minshamangid);
if(_target)
{
if (_gid_attackcount[_minshamangid] == undefined)
_gid_attackcount[_minshamangid] = 1;
else
_gid_attackcount[_minshamangid]++;
if(NTconfig_HighMaxAttack || NTA_HighMaxAttackAreas())
{
if (_gid_attackcount[_minshamangid] > NTConfig_HighMaxAttacks)
{
_skiplist.push(_minshamangid);
}
}
else if(!NTconfig_HighMaxAttack || !NTA_HighMaxAttackAreas())
{
if(_gid_attackcount[_minshamangid] > NTConfig_LowMaxAttacks)
{
Print("ÿc1I can't hit him!!! -> skipped");
_skiplist.push(_minshamangid);
}
}
_result = NTA_Attack(_target, (_attackcount%30) == 0);
switch(_result)
{
case 1:
_skiplist.push(_minshamangid);
break;
case 2:
case 3:
if(NTConfig_FastPickit)
NTSI_PickItems();
_attackcount++;
_sorcattack++;
break;
default:
return false;
}
}
}
else if(_mindistance < 100000)
{
_target = NTC_FindUnit(NTC_UNIT_MONSTER, _mingid);
if(_target)
{
if (_gid_attackcount[_mingid] == undefined)
_gid_attackcount[_mingid] = 1;
else
_gid_attackcount[_mingid]++;
if(NTconfig_HighMaxAttack || NTA_HighMaxAttackAreas())
{
if (_gid_attackcount[_mingid] > NTConfig_HighMaxAttacks)
{
_skiplist.push(_mingid);
}
}
else if(!NTconfig_HighMaxAttack || !NTA_HighMaxAttackAreas()){
if(_gid_attackcount[_mingid] > NTConfig_LowMaxAttacks)
{
Print("ÿc1I can't hit him!!! -> skipped");
_skiplist.push(_mingid);
}
}
_result = NTA_Attack(_target, (_attackcount%30) == 0);
switch(_result)
{
case 1:
_skiplist.push(_mingid);
break;
case 2:
case 3:
if(NTConfig_FastPickit)
NTSI_PickItems();
_attackcount++;
_sorcattack++;
break;
default:
return false;
}
}
}
else
break;
}
}
if(me.classid == NTC_CHAR_CLASS_PALADIN)
{
if(_attackcount > 2 && (parseInt(me.hp*100/me.hpmax) < NTConfig_UseRedemptionHP || parseInt(me.mp*100/me.mpmax) < NTConfig_UseRedemptionMP))
{
if(NTC_PutSkill(124, NTC_HAND_RIGHT))
NTC_PingDelay(1000);
}
}
else if(me.classid == NTC_CHAR_CLASS_NECROMANCER)
{
NTA_SkeletonArmy(NTConfig_SkeletonArmy);
NTA_MageArmy(NTConfig_MageArmy);
NTA_ReviveArmy(NTConfig_ReviveArmy);
}
else if(me.classid == NTC_CHAR_CLASS_BARBARIAN)
{
if(NTConfig_UseFindItem && _attackcount > 2)
{
if(!NTA_CheckForCloseMonsters(10))
{
//Print("ÿc<No Monsters close - looting");
NTA_FindItem(NTConfig_FindItemRange);
}
}
}
if(NTConfig_OpenChest)
{
_target = NTC_GetSpecialChest();
if(_target && GetDistance(_orgx, _orgy, _target.x, _target.y) <= range && NTC_OpenChest(_target))
_attackcount++;
_sorcattack++;
}
if(NTConfig_OpenChestsInAreaClearing && NTConfig_AreasToOpenChestClearing.indexOf(me.areaid) != -1){
NTC_OpenChestsInAreaNear(_orgx, _orgy, range);
}
if(pickitem && _attackcount > 0)
NTSI_PickItems();
switch(safelevel)
{
case 1:
return NTTMGR_CheckSafe(0x00, NTConfig_CheckMercSafe&0x01);
case 2:
return NTTMGR_CheckSafe(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe);
}
return true;
}
function NTA_ClearLevel(pickitem, safelevel)
{
var i;
var _room, _rooms;
var _distance, _minindex, _mindistance;
_room = GetRoom();
if(!_room)
return false;
switch(arguments.length)
{
case 0:
pickitem = true;
case 1:
safelevel = 2;
default:
if(NTConfig_CheckSelfSafe < 0x01 && NTConfig_CheckMercSafe < 0x01)
safelevel = 0;
break;
}
_rooms = new Array();
do
{
_rooms.push([parseInt(_room.x*5 + _room.xsize*5/2), parseInt(_room.y*5 + _room.ysize*5/2)]);
} while(_room.GetNext());
while(_rooms.length > 0)
{
_mindistance = 100000;
for(i = 0 ; i < _rooms.length ; i++)
{
_distance = GetDistance(me.x, me.y, _rooms[i][0], _rooms[i][1]);
if(_distance < _mindistance)
{
_minindex = i;
_mindistance = _distance;
}
}
if(NTM_MoveTo(me.areaid, _rooms[_minindex][0], _rooms[_minindex][1], 1))
{
if(!NTA_ClearRoom(pickitem, safelevel))
return false;
NTP_DoPrecast(false);
}
_rooms.splice(_minindex, 1);
}
return true;
}
function NTA_ClearRoom(pickitem, safelevel)
{
var _room;
var _spectype = [0x0A, 0x01, 0x01];
var _skiplist, _gid_attackcount;
var _attackcount = 0;
var _target;
var _distance, _mingid, _mindistance, _minshamangid, _minshamandistance;
var _result;
if(NTConfig_AttackSkill[1] < 0 || NTConfig_AttackSkill[3] < 0)
return false;
_room = me.GetRoom();
if(!_room)
return false;
switch(arguments.length)
{
case 0:
pickitem = false;
case 1:
safelevel = 0;
default:
if(NTConfig_CheckSelfSafe < 0x01 && NTConfig_CheckMercSafe < 0x01)
safelevel = 0;
break;
}
for(var i = 0 ; i < _spectype.length ; i++)
{
_skiplist = new Array();
_gid_attackcount = new Array();
while(_attackcount < (i+1)*100)
{
_mindistance = 100000;
_minshamandistance = 100000;
_target = NTC_FindUnit(NTC_UNIT_MONSTER);
if(_target)
{
do
{
if(_skiplist.indexOf(_target.gid) < 0)
{
if(_target.IsAttackable() && (_target.spectype&_spectype[i]))
{
if(_room.UnitInRoom(_target) && NTA_IsValidMonster(_target))
{
if(MonstersToAttackFirst.indexOf(_target.classid) > -1)
{
_distance = GetDistance(me, _target);
if(_distance < _minshamandistance)
{
_minshamangid = _target.gid;
_minshamandistance = _distance;
}
}
else
{
_distance = GetDistance(me, _target);
if(_distance < _mindistance)
{
_mingid = _target.gid;
_mindistance = _distance;
}
}
}
}
else
_skiplist.push(_target.gid);
}
} while(_target.GetNext());
}
if(_minshamandistance < 100000)
{
_target = NTC_FindUnit(NTC_UNIT_MONSTER, _minshamangid);
if(_target)
{
_result = NTA_Attack(_target, (_attackcount%30) == 0);
if (_gid_attackcount[_minshamangid] == undefined)
_gid_attackcount[_minshamangid] = 1;
else
_gid_attackcount[_minshamangid]++;
if(NTconfig_HighMaxAttack || NTA_HighMaxAttackAreas())
{
if (_gid_attackcount[_minshamangid] > NTConfig_HighMaxAttacks)
{
_skiplist.push(_minshamangid);
}
}
else if(!NTconfig_HighMaxAttack || !NTA_HighMaxAttackAreas())
{
if(_gid_attackcount[_minshamangid] > NTConfig_LowMaxAttacks)
{
Print("ÿc1I can't hit him!!! -> skipped");
_skiplist.push(_minshamangid);
}
}
switch(_result)
{
case 1:
_skiplist.push(_minshamangid);
break;
case 2:
case 3:
if(NTConfig_FastPickit)
NTSI_PickItems();
_attackcount++;
_sorcattack++;
break;
default:
return false;
}
}
}
else if(_mindistance < 100000)
{
_target = NTC_FindUnit(NTC_UNIT_MONSTER, _mingid);
if(_target)
{
_result = NTA_Attack(_target, (_attackcount%30) == 0);
if (_gid_attackcount[_mingid] == undefined)
_gid_attackcount[_mingid] = 1;
else
_gid_attackcount[_mingid]++;
if(NTconfig_HighMaxAttack || NTA_HighMaxAttackAreas())
{
if (_gid_attackcount[_mingid] > NTConfig_HighMaxAttacks)
{
_skiplist.push(_mingid);
}
}
else if(!NTconfig_HighMaxAttack || !NTA_HighMaxAttackAreas())
{
if(_gid_attackcount[_mingid] > NTConfig_LowMaxAttacks)
{
Print("ÿc1I can't hit him!!! -> skipped");
_skiplist.push(_mingid);
}
}
switch(_result)
{
case 1:
_skiplist.push(_mingid);
break;
case 2:
case 3:
if(NTConfig_FastPickit)
NTSI_PickItems();
_attackcount++;
_sorcattack++;
break;
default:
return false;
}
}
}
else
break;
}
}
if(me.classid == NTC_CHAR_CLASS_PALADIN)
{
if(_attackcount > 2 && (parseInt(me.hp*100/me.hpmax) < NTConfig_UseRedemptionHP || parseInt(me.mp*100/me.mpmax) < NTConfig_UseRedemptionMP))
{
if(NTC_PutSkill(124, NTC_HAND_RIGHT))
NTC_PingDelay(1000);
}
}
else if(me.classid == NTC_CHAR_CLASS_NECROMANCER)
{
NTA_SkeletonArmy(NTConfig_SkeletonArmy);
NTA_MageArmy(NTConfig_MageArmy);
NTA_ReviveArmy(NTConfig_ReviveArmy);
}
else if(me.classid == NTC_CHAR_CLASS_BARBARIAN)
{
if(NTConfig_UseFindItem && _attackcount > 2)
{
if(!NTA_CheckForCloseMonsters(10))
{
//Print("ÿc<No Monsters close - looting");
NTA_FindItem(NTConfig_FindItemRange);
}
}
}
if(NTConfig_OpenChest)
{
_target = NTC_GetSpecialChest();
if(_target && _room.UnitInRoom(_target) && NTC_OpenChest(_target))
_attackcount++;
_sorcattack++;
}
if(NTConfig_OpenChestsInAreaClearing && NTConfig_AreasToOpenChestClearing.indexOf(me.areaid) != -1){
NTC_OpenChestsInAreaNear(me.x, me.y, 20);
}
if(pickitem && _attackcount > 0)
NTSI_PickItems();
switch(safelevel)
{
case 1:
return NTTMGR_CheckSafe(0x00, NTConfig_CheckMercSafe&0x01);
case 2:
return NTTMGR_CheckSafe(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe);
}
return true;
}
function NTA_IsValidMonster(monster)
{
var _classid;
if(monster.hp <= 0 || monster.mode == 0 || monster.mode == 12)
return false;
_classid = monster.classid;
if(((_classid >= 110 && _classid <= 113) || _classid == 608) && monster.mode == 8) // ignore flying scavengers
return false;
if(_classid == 68 && monster.mode == 14) // ignore burrowing maggots
return false;
if(_classid >= 258 && _classid <= 263 && monster.mode == 14) // ignore submerged WaterWatchers
return false;
if(monster.GetState(53) || monster.GetState(96)) // Conversion, Revive
return false;
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;
if(NTConfig_SkipRegularMonsters)
if(monster.spectype == 1 && me.areaid != 131)
return false;
if(me.classid == NTC_CHAR_CLASS_DRUID)
{
if(!me.GetState(144))
NTC_CastSkill(250, NTC_HAND_RIGHT);
if(!me.GetState(151))
NTC_CastSkill(235, NTC_HAND_RIGHT);
if(!me.GetState(149))
NTC_CastSkill(226, NTC_HAND_RIGHT);
}
return true;
}
function NTA_GetDamageType(skillid)
{
if(skillid == 74 || skillid == 147) // Corpse Explosion && Frenzy
return NTA_DAMAGE_PHYSICAL;
if(me.classid == NTC_CHAR_CLASS_PALADIN && (NTConfig_AttackSkill[1] == 112 && NTConfig_AttackSkill[5] > -1)){
if(skillid == 101) //holy bolt
return NTA_DAMAGE_NONE;
}
else {
if(skillid == 112) // Blessed Hammer
return NTA_DAMAGE_NONE;
}
switch(GetBaseStat("skills.txt", skillid, 233))
{
case "cold":
return NTA_DAMAGE_COLD;
case "fire":
return NTA_DAMAGE_FIRE;
case "ltng":
return NTA_DAMAGE_LIGHTNING;
case "mag":
return NTA_DAMAGE_MAGIC;
case "pois":
return NTA_DAMAGE_POISON;
case "stun":
return NTA_DAMAGE_NONE;
default:
if(GetBaseStat("skills.txt", skillid, 178) || GetBaseStat("skills.txt", skillid, 182)) // aura or passive
return NTA_DAMAGE_NONE;
}
return NTA_DAMAGE_PHYSICAL;
}
function NTA_GetResistance(enemy, type)
{
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_DetectAttackPattern()
{
switch(me.classid)
{
case NTC_CHAR_CLASS_AMAZON:
return NTA_AmazonAttackPatternInt();
case NTC_CHAR_CLASS_SORCERESS:
return NTA_SorceressAttackPatternInt();
case NTC_CHAR_CLASS_NECROMANCER:
return NTA_NecromancerAttackPatternInt();
case NTC_CHAR_CLASS_PALADIN:
return NTA_PaladinAttackPatternInt();
case NTC_CHAR_CLASS_BARBARIAN:
return NTA_BarbarianAttackPatternInt();
case NTC_CHAR_CLASS_DRUID:
return NTA_DruidAttackPatternInt();
case NTC_CHAR_CLASS_ASSASSIN:
return NTA_AssassinAttackPatternInt();
}
return false;
}
// Return value : 0 = Unrecoverable process, 1 = Unavailable attack, 2 = Onetime fail, 3 = Success
function NTA_Attack(target, firstorder)
{
switch(me.classid)
{
case NTC_CHAR_CLASS_AMAZON:
return NTA_AmazonAttackInt(target, firstorder);
case NTC_CHAR_CLASS_SORCERESS:
return NTA_SorceressAttackInt(target, firstorder);
case NTC_CHAR_CLASS_NECROMANCER:
return NTA_NecromancerAttackInt(target, firstorder);
case NTC_CHAR_CLASS_PALADIN:
return NTA_PaladinAttackInt(target, firstorder);
case NTC_CHAR_CLASS_BARBARIAN:
return NTA_BarbarianAttackInt(target, firstorder);
case NTC_CHAR_CLASS_DRUID:
return NTA_DruidAttackInt(target, firstorder);
case NTC_CHAR_CLASS_ASSASSIN:
return NTA_AssassinAttackInt(target, firstorder);
}
return 0;
}
function NTA_IsWeaponBroken()
{
var _weapon;
_weapon = me.GetItems();
if(_weapon)
{
for(var i = 0 ; i < _weapon.length ; i++)
{
if(_weapon[i].itemflag&0x100)
{
if(_weapon[i].mode == 1 && _weapon[i].itemloc == 4 || _weapon[i].itemloc == 5)
{
Print("ÿc8My weapon broke, I am going to town to repair it.")
NTTMGR_VisitTown();
NTTMGR_TownManager();
break;
}
}
}
}
}
function NTA_HaveArrows()
{
var _weapon;
var _haveAmmo = false;
_weapon = me.GetItems();
if(_weapon)
{
for(var i = 0 ; i < _weapon.length ; i++)
{
if((_weapon[i].classid == 526 || _weapon[i].classid == 528) && _weapon[i].itemloc == 5)
{
if(_weapon[i].GetStat(70) < 10)
{
Print("ÿc8I'm low on "+ _weapon[i].name + ", I am going to town to buy more.")
NTTMGR_VisitTown();
NTTMGR_TownManager();
}
_haveAmmo = true;
break;
}
}
}
if(!_haveAmmo)
{
Print("ÿc8I have no ammo, I am going to town to buy some.")
NTTMGR_VisitTown();
NTTMGR_TownManager();
}
}
// Internal function
function NTA_AmazonAttackPatternInt()
{
var _maxindex, _maxskill;
var _avgskilllevel = new Array();
_avgskilllevel[0] = me.GetSkill(35, false);
_avgskilllevel[1] = parseInt((me.GetSkill(31, false) + me.GetSkill(11, false) + me.GetSkill(21, false)) /3 );
_avgskilllevel[2] = me.GetSkill(26, false);
_maxindex = -1;
_maxskill = 0;
for(var i = 0 ; i < _avgskilllevel.length ; i++)
{
if(_avgskilllevel[i] > _maxskill)
{
_maxindex = i;
_maxskill = _avgskilllevel[i];
}
}
switch(_maxindex)
{
case 0: // Lightning Fury for Javazon
NTConfig_AttackSkill[1] = 35;
NTConfig_AttackSkill[2] = 35;
NTConfig_AttackSkill[3] = 35;
NTConfig_AttackSkill[4] = 35;
NTConfig_AttackSkill[5] = 35;
NTConfig_AttackSkill[6] = 35;
NTConfig_AttackSkill[7] = 24;
break;
case 1: // Freezing Arrow for Bowzon
NTConfig_AttackSkill[1] = 31;
NTConfig_AttackSkill[2] = 31;
NTConfig_AttackSkill[3] = 31;
NTConfig_AttackSkill[4] = 31;
NTConfig_AttackSkill[5] = 31;
NTConfig_AttackSkill[6] = 31;
NTConfig_AttackSkill[7] = 31;
break;
case 2: // Cold Arrow + Strafe for Bowzon
NTConfig_AttackSkill[0] = 11;
NTConfig_AttackSkill[1] = 26;
NTConfig_AttackSkill[2] = 26;
NTConfig_AttackSkill[3] = 26;
NTConfig_AttackSkill[4] = 26;
NTConfig_AttackSkill[5] = 26;
NTConfig_AttackSkill[6] = 26;
NTConfig_AttackSkill[7] = 22;
break;
}
return (NTConfig_AttackSkill[1] && NTConfig_AttackSkill[3]);
}
function NTA_AmazonAttackInt(target, firstorder)
{
var _primaryindex;
var _attackSkill;
if(NTTMGR_CheckCurse(NTConfig_CheckSelfSafe&0x10, NTConfig_CheckMercSafe&0x10) || me.hp <= parseInt(me.hpmax*NTConfig_TPChicken)/100)
{
if(!NTTMGR_VisitTown())
return 0;
}
if(me.GetSkill(12, false) > 1)
NTA_HaveArrows();
else
NTA_IsWeaponBroken();
if(firstorder && NTConfig_AttackSkill[0] > -1 && NTA_GetResistance(target, _NTA_SkillDamage[0]) < 100)
{
if(GetDistance(me, target) > _NTA_SkillRange[0] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[0], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(!NTC_CastSkill(NTConfig_AttackSkill[0], _NTA_SkillHand[0], target))
return 2;
return 3;
}
_primaryindex = (target.spectype&0x0A) ? 1 : 3;
_attackSkill = NTA_GetAttackType(target, _primaryindex, 91, 81, 81);
switch(target.classid)
{
case 243://Diablo
case 544://Baal
case 242:
if(!NTA_AmazonCastSkillInt(9, target, _primaryindex))
return 2;
return 3;
default:
break;
}
if(NTConfig_AttackSkill[_attackSkill] > -1)
{
if(!NTA_AmazonCastSkillInt(_primaryindex, target, _primaryindex))
return 2;
return 3;
}
if(NTConfig_AttackSkill[5] > -1 && NTA_GetResistance(target, _NTA_SkillDamage[5]) > 80)
{
if(!NTA_AmazonCastSkillInt(5, target))
return 2;
return 3;
}
if(NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) < 100 || (_primaryindex == 1 && NTC_GetMerc()))
{
if(!NTA_AmazonCastSkillInt(_primaryindex, target))
return 2;
return 3;
}
return 1;
}
function NTA_AmazonCastSkillInt(index, target, primaryIndex)
{
var secondarySkill = 0;
if(me.GetSkillStatus(NTConfig_AttackSkill[index]) != 8)
{
if(GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[index], NTC_HAND_LEFT, target);
}
secondarySkill = NTA_GetAttackType (target, primaryIndex+1, 81, 81, 81);
if(NTConfig_AttackSkill[secondarySkill] > -1)
{
if(GetDistance(me, target) > _NTA_SkillRange[secondarySkill] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[secondarySkill], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[secondarySkill], _NTA_SkillHand[secondarySkill], target);
}
for(var i = 0 ; i < 25 ; i++)
{
NTC_Delay(NTC_DELAY_FRAME);
if(me.GetSkillStatus(NTConfig_AttackSkill[index]) != 8)
break;
}
}
function NTA_SorceressAttackPatternInt()
{
var _maxindex, _maxskill;
var _avgskilllevel = new Array();
_avgskilllevel[0] = parseInt((me.GetSkill(59, false)+me.GetSkill(39, false)+me.GetSkill(45, false)+me.GetSkill(55, false))/4);
_avgskilllevel[1] = parseInt((me.GetSkill(53, false)+me.GetSkill(38, false)+me.GetSkill(48, false)+me.GetSkill(49, false))/4);
_avgskilllevel[2] = parseInt((me.GetSkill(47, false)+me.GetSkill(36, false)+me.GetSkill(56, false)+me.GetSkill(64, false))/4);
_avgskilllevel[3] = parseInt((me.GetSkill(47, false)+me.GetSkill(36, false)+me.GetSkill(56, false))/3);
_maxindex = -1;
_maxskill = 0;
for(var i = 0 ; i < _avgskilllevel.length ; i++)
{
if(_avgskilllevel[i] > _maxskill)
{
_maxindex = i;
_maxskill = _avgskilllevel[i];
}
}
switch(_maxindex)
{
case 0: // Blizzard + Glacial Spike
NTConfig_AttackSkill[1] = 59;
NTConfig_AttackSkill[2] = 55;
NTConfig_AttackSkill[3] = 59;
NTConfig_AttackSkill[4] = 55;
break;
case 1: // Chain Lightning + Lightning
NTConfig_AttackSkill[1] = 49;
NTConfig_AttackSkill[3] = 53;
break;
case 2: // Fire Ball + Frozen Orb
NTConfig_AttackSkill[0] = 64;
NTConfig_AttackSkill[1] = 47;
NTConfig_AttackSkill[3] = 47;
NTConfig_AttackSkill[5] = 64;
NTConfig_AttackSkill[6] = 55;
break;
case 3: // Fire Ball + Meteor
NTConfig_AttackSkill[1] = 56;
NTConfig_AttackSkill[2] = 47;
NTConfig_AttackSkill[3] = 56;
NTConfig_AttackSkill[4] = 47;
break;
}
return (NTConfig_AttackSkill[1] && NTConfig_AttackSkill[3]);
}
function NTA_SorceressAttackInt(target, firstorder)
{
var _primaryindex;
var _attackSkill;
if(NTTMGR_CheckCurse(NTConfig_CheckSelfSafe&0x10, NTConfig_CheckMercSafe&0x10) || me.hp <= parseInt((me.hpmax*NTConfig_TPChicken)/100))
{
if(!NTTMGR_VisitTown())
return 0;
}
if(firstorder && NTConfig_AttackSkill[0] > -1 && NTA_GetResistance(target, _NTA_SkillDamage[0]) < 100 && me.GetSkillStatus(NTConfig_AttackSkill[0]) != 8)
{
if(GetDistance(me, target) > _NTA_SkillRange[0] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[0], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(!NTC_CastSkill(NTConfig_AttackSkill[0], _NTA_SkillHand[0], target))
return 2;
return 3;
}
if(NTConfig_CastStatic < 100 && parseInt(target.hp*100/target.hpmax) > NTConfig_CastStatic && NTA_GetResistance(target, NTA_DAMAGE_LIGHTNING) <= 80 && (target.name == "Mephisto" || target.name == "Andariel" || target.name == "Duriel" ||target.name == "Diablo" || target.name == "Baal"))
{
var _staticlevel = NTC_GetSkillLevel(42);
if(_staticlevel > 0)
{
var _staticrange;
var _castx, _casty;
_staticrange = Math.floor((5+_staticlevel-1)*2/3);
if(GetDistance(me, target) > _staticrange || !CheckCollision(me, target, 6))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _staticrange, 6);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(target.x < me.x)
_castx = me.x - 1;
else if(target.x > me.x)
_castx = me.x + 1;
else
_castx = me.x;
if(target.y < me.y)
_casty = me.y - 1;
else if(target.y > me.y)
_casty = me.y + 1;
else
_casty = me.y;
if(!CheckCollision(target.areaid, _castx, _casty, 1))
{
_castx = me.x;
_casty = me.y;
}
if(!NTC_CastSkill(42, NTC_HAND_RIGHT, _castx, _casty))
return 2;
return 3;
}
}
_primaryindex = (target.spectype&0x0A) ? 1 : 3;
_attackSkill = NTA_GetAttackType(target, _primaryindex, 91, 81, 81);
if(NTConfig_AttackSkill[_attackSkill] > -1)
{
if(!NTA_SorceressCastSkillInt(_attackSkill, target, _primaryindex))
return 2;
return 3;
}
if(NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) < 100 || (_primaryindex == 1 && NTC_GetMerc()))
{
if(!NTA_SorceressCastSkillInt(_primaryindex, target, _primaryindex))
return 2;
return 3;
}
return 1;
}
function NTA_SorceressCastSkillInt(index, target, primaryIndex)
{
var secondarySkill = 0;
_haveCL = NTC_GetSkillLevel(53); // check to see if we even have CL
_havetele = NTC_GetSkillLevel(54);
if(DebugAttacksInGame){Print("ÿc3 sorc attack count = " + _sorcattack);}
if(DebugAttacksInGame && target.GetState(28) > 0){Print("ÿc2target convicted");Print("ÿc2continue attack");}
if(_sorcattack >= 20)
_sorcattack = 0;
if(_havetele && NTConfig_DancingSorc)
{
NTTMGR_CheckSafe(false, 0x01); // revive merc
if((NTA_CheckMyHp() || ((target.GetState(28) <= 0) && NTA_CheckMercInfinity())) || (_sorcattack%NTConfig_AttackJump) == 0)
{
if(DebugAttacksInGame && target.GetState(28) <= 0){Print("ÿc;target not convicted");Print("ÿc;let's dance");}
NTA_Bounce(target);
}
}
if(me.GetSkillStatus(NTConfig_AttackSkill[index]) != 8)
{
if(GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(target.name == "Baal" && NTConfig_AttackSkill[10] > -1 )
return NTC_CastSkill(NTConfig_AttackSkill[10], _NTA_SkillHand[10], target);
if((target.name == "Mephisto" || target.name == "Andariel" || target.name == "Duriel" || target.name == "Diablo") && NTConfig_AttackSkill[9] > -1 && target.name != "Baal")
return NTC_CastSkill(NTConfig_AttackSkill[9], _NTA_SkillHand[9], target);
if(NTConfig_ChainLightOnLightImmunes && NTA_GetResistance(target, NTA_DAMAGE_LIGHTNING) >= 90 && _haveCL > 0)
{
if(DebugAttacksInGame){Print("ÿc9 Target Light resist = " + NTA_GetResistance(target, NTA_DAMAGE_LIGHTNING));Print("ÿc9Switching to CL");} // need to add debug to config
return(NTC_CastSkill(53, NTC_HAND_LEFT, target))
}
return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], target);
}
secondarySkill = NTA_GetAttackType (target, primaryIndex+1, 81, 81, 81);
if(NTConfig_AttackSkill[secondarySkill] > -1)
{
if(GetDistance(me, target) > _NTA_SkillRange[secondarySkill] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[secondarySkill], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[secondarySkill], _NTA_SkillHand[secondarySkill], target);
}
for(var i = 0 ; i < 25 ; i++)
{
NTC_Delay(NTC_DELAY_FRAME);
if(me.GetSkillStatus(NTConfig_AttackSkill[index]) != 8)
break;
}
return false;
}
function NTA_NecromancerAttackPatternInt()
{
return false;
}
function NTA_NecromancerAttackInt(target, firstorder)
{
var _primaryindex;
var _curse1state;
var _curse2state;
switch(NTConfig_CurseBoss)
{
case 0: //nothing
_curse1state = 0;
break;
case 66: //amplify damage
_curse1state = 9;
break;
case 71: //dim vision
_curse1state = 23;
break;
case 72: //weaken
_curse1state = 19;
break;
case 76: //iron maiden
_curse1state = 55;
break;
case 77: //terror
_curse1state = 56;
break;
case 81: //confuse
_curse1state = 59;
break;
case 82: //life tap
_curse1state = 58;
break;
case 86: //attract
_curse1state = 57;
break;
case 87: //decrepify
_curse1state = 60;
break;
case 91: //lower resist
_curse1state = 61;
break;
default:
Print("Invalid curse id");
break;
}
switch(NTConfig_CurseOthers)
{
case 0: //nothing
_curse2state = 0;
break;
case 66: //amplify damage
_curse2state = 9;
break;
case 71: //dim vision
_curse2state = 23;
break;
case 72: //weaken
_curse2state = 19;
break;
case 76: //iron maiden
_curse2state = 55;
break;
case 77: //terror
_curse2state = 56;
break;
case 81: //confuse
_curse2state = 59;
break;
case 82: //life tap
_curse2state = 58;
break;
case 86: //attract
_curse2state = 57;
break;
case 87: //decrepify
_curse2state = 60;
break;
case 91: //lower resist
_curse2state = 61;
break;
default:
Print("Invalid curse id");
break;
}
if(NTTMGR_CheckCurse(NTConfig_CheckSelfSafe&0x10, NTConfig_CheckMercSafe&0x10))
{
if(!NTTMGR_VisitTown())
return 0;
}
//////////////////////////////
NTTMGR_CheckSafe(false, 0x01); //instant merc revive
//////////////////////////////
if(!me.GetState(14)) //check and recast bone armor
NTC_CastSkill(68, NTC_HAND_RIGHT);
if(firstorder && NTConfig_AttackSkill[0] > -1 && NTA_GetResistance(target, _NTA_SkillDamage[0]) < 100 && me.GetSkillStatus(NTConfig_AttackSkill[0]) != 8)
{
if(GetDistance(me, target) > _NTA_SkillRange[0] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[0], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(!NTC_CastSkill(NTConfig_AttackSkill[0], _NTA_SkillHand[0], target))
return 2;
return 3;
}
if(NTConfig_CurseBoss > 0 && (target.spectype&0x0A) && !target.GetState(_curse1state) && target.name.indexOf(GetLocaleString(11086)) == -1)
{
if(GetDistance(me, target) > 25 || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, 25, 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(!NTC_CastSkill(NTConfig_CurseBoss, NTC_HAND_RIGHT, target))
return 2;
return 3;
}
else if(NTConfig_CurseOthers > 0 && !(target.spectype&0x0A) && !target.GetState(_curse2state))
{
if(GetDistance(me, target) > 25 || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, 25, 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(!NTC_CastSkill(NTConfig_CurseOthers, NTC_HAND_RIGHT, target))
return 2;
return 3;
}
_primaryindex = (target.spectype&0x0A) ? 1 : 3;
if(NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) <= 90)
{
if(!NTA_NecromancerCastSkillInt(_primaryindex, target))
return 2;
if(NTConfig_ActiveSummon)
if(!NTA_SkeletonArmy(NTConfig_SkeletonArmy))
if(!NTA_MageArmy(NTConfig_MageArmy))
NTA_ReviveArmy(NTConfig_ReviveArmy);
NTA_ExplodeCorpses(target);
return 3;
}
if(NTConfig_AttackSkill[5] > -1 && NTA_GetResistance(target, _NTA_SkillDamage[5]) <= 80)
{
if(!NTA_NecromancerCastSkillInt(5, target))
return 2;
if(NTConfig_ActiveSummon)
if(!NTA_SkeletonArmy(NTConfig_SkeletonArmy))
if(!NTA_MageArmy(NTConfig_MageArmy))
NTA_ReviveArmy(NTConfig_ReviveArmy);
NTA_ExplodeCorpses(target);
return 3;
}
if(NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) < 100 || (_primaryindex == 1 && NTC_GetMerc())) //this means attack even immune bosses if your merc is alive
{
if(!NTA_NecromancerCastSkillInt(_primaryindex, target))
return 2;
if(NTConfig_ActiveSummon)
if(!NTA_SkeletonArmy(NTConfig_SkeletonArmy))
if(!NTA_MageArmy(NTConfig_MageArmy))
NTA_ReviveArmy(NTConfig_ReviveArmy);
NTA_ExplodeCorpses(target);
return 3;
}
return 1;
}
function NTA_NecromancerCastSkillInt(index, target)
{
if(me.GetSkillStatus(NTConfig_AttackSkill[index]) != 8)
{
if(GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], target);
}
if(NTConfig_AttackSkill[index+1] > -1)
{
if(GetDistance(me, target) > _NTA_SkillRange[index+1] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index+1], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[index+1], _NTA_SkillHand[index+1], target);
}
for(var i = 0 ; i < 25 ; i++)
{
NTC_Delay(NTC_DELAY_FRAME);
if(me.GetSkillStatus(NTConfig_AttackSkill[index]) != 8)
break;
}
return false;
}
function NTA_SkeletonArmy(num)
{
if(NTConfig_SkeletonArmy <= 0)
return false;
var _skeletoncount = 0;
var _skeleton = NTC_FindUnit(NTC_UNIT_MONSTER, 363);
if(_skeleton)
{
do
{
if(NTC_CheckOwner(_skeleton) && _skeleton.hp > 0)
{
//Print(_skeleton.GetParent().name);
_skeletoncount++;
}
}while(_skeleton.GetNext());
}
//Print("We have " + _skeletoncount + " skeletons"); //debug 1
if(_skeletoncount >= num)
return false;
var _corpse = NTC_FindUnit(NTC_UNIT_MONSTER);
if(_corpse)
{
do
{
if(
_corpse != null &&
_corpse.mode == 12 &&
GetDistance(me, _corpse) < 25 &&
!(_corpse.GetState(96)) && //revive
!(_corpse.GetState(104)) && //nodraw
!(_corpse.GetState(107)) && //shatter
!(_corpse.GetState(118)) && //noselect
_corpse.classid != 289 && //clay golem
_corpse.classid != 290 && //blood golem
_corpse.classid != 291 && //iron golem
_corpse.classid != 292 && //fire golem
_corpse.classid != 351 && //hydra
_corpse.classid != 352 && //hydra
_corpse.classid != 353 && //hydra
_corpse.classid != 363 && //necro skeleton
_corpse.classid != 364 && //necro mage
_corpse.classid != 563 && //baal tentacle
_corpse.classid != 564 && //baal tentacle
_corpse.classid != 565 && //baal tentacle
_corpse.classid != 566 && //baal tentacle
_corpse.classid != 567 //baal tentacle
)
{
if(NTC_CastSkill(70, NTC_HAND_RIGHT, _corpse))
_skeletoncount++;
if(_skeletoncount >= num)
return false;
}
}while(_corpse.GetNext());
}
return true;
}
function NTA_MageArmy(num)
{
if(NTConfig_MageArmy <= 0)
return false;
var _magecount = 0;
var _mage = NTC_FindUnit(NTC_UNIT_MONSTER, 364);
if(_mage)
{
do
{
if(NTC_CheckOwner(_mage) && _mage.hp > 0)
{
//Print(_mage.GetParent().name);
_magecount++;
}
}while(_mage.GetNext());
}
//Print("We have " + _magecount + " mages"); //debug 3
if(_magecount >= num)
return false;
var _corpse = NTC_FindUnit(NTC_UNIT_MONSTER);
if(_corpse)
{
do
{
if(
_corpse != null &&
_corpse.mode == 12 &&
GetDistance(me, _corpse) < 25 &&
!(_corpse.GetState(96)) && //revive
!(_corpse.GetState(104)) && //nodraw
!(_corpse.GetState(107)) && //shatter
!(_corpse.GetState(118)) && //noselect
_corpse.classid != 289 && //clay golem
_corpse.classid != 290 && //blood golem
_corpse.classid != 291 && //iron golem
_corpse.classid != 292 && //fire golem
_corpse.classid != 351 && //hydra
_corpse.classid != 352 && //hydra
_corpse.classid != 353 && //hydra
_corpse.classid != 363 && //necro skeleton
_corpse.classid != 364 && //necro mage
_corpse.classid != 563 && //baal tentacle
_corpse.classid != 564 && //baal tentacle
_corpse.classid != 565 && //baal tentacle
_corpse.classid != 566 && //baal tentacle
_corpse.classid != 567 //baal tentacle
)
{
if(NTC_CastSkill(80, NTC_HAND_RIGHT, _corpse))
_magecount++;
if(_magecount >= num)
return false;
}
}while(_corpse.GetNext());
}
return true;
}
function NTA_ReviveArmy(num)
{
if(NTConfig_ReviveArmy <= 0)
return false;
var _revivecount = 0;
var _revive = NTC_FindUnit(NTC_UNIT_MONSTER);
if(_revive)
{
do
{
if(NTC_CheckOwner(_revive) && _revive.GetState(96) && _revive.hp > 0)
{
//Print(_revive.GetParent().name);
_revivecount++;
}
}while(_revive.GetNext());
}
//Print("We have " + _revivecount + " revives"); //debug 2
if(_revivecount >= num)
return false;
var _corpse = NTC_FindUnit(NTC_UNIT_MONSTER);
if(_corpse)
{
do
{
if(
_corpse != null &&
_corpse.mode == 12 &&
GetDistance(me, _corpse) < 25 &&
!(_corpse.spectype&0x0A) &&
!(_corpse.GetState(96)) && //revive
!(_corpse.GetState(104)) && //nodraw
!(_corpse.GetState(107)) && //shatter
!(_corpse.GetState(118)) && //noselect
_corpse.classid != 289 && //clay golem
_corpse.classid != 290 && //blood golem
_corpse.classid != 291 && //iron golem
_corpse.classid != 292 && //fire golem
_corpse.classid != 351 && //hydra
_corpse.classid != 352 && //hydra
_corpse.classid != 353 && //hydra
_corpse.classid != 363 && //necro skeleton
_corpse.classid != 364 && //necro mage
_corpse.classid != 461 && //greater ice spawn
_corpse.classid != 563 && //baal tentacle
_corpse.classid != 564 && //baal tentacle
_corpse.classid != 565 && //baal tentacle
_corpse.classid != 566 && //baal tentacle
_corpse.classid != 567 && //baal tentacle
_corpse.classid != 571 //baal crab clone (minion of destruction)
)
{
Print("Reviving " + _corpse.classid + " " + _corpse.name);
if(NTC_CastSkill(95, NTC_HAND_RIGHT, _corpse))
_revivecount++;
if(_revivecount >= num)
return false;
}
}while(_corpse.GetNext());
}
return true;
}
function NTA_ExplodeCorpses(who)
{
if(NTConfig_ExplodeCorpses == 0)
return false;
var _exploded = 0;
var _corpse = NTC_FindUnit(NTC_UNIT_MONSTER);
if(_corpse)
{
do
{
if(
_corpse != null &&
_corpse.mode == 12 &&
GetDistance(who, _corpse) <= 10 &&
!(_corpse.GetState(96)) && //revive
!(_corpse.GetState(104)) && //nodraw
!(_corpse.GetState(107)) && //shatter
!(_corpse.GetState(118)) && //noselect
_corpse.classid != 289 && //clay golem
_corpse.classid != 290 && //blood golem
_corpse.classid != 291 && //iron golem
_corpse.classid != 292 && //fire golem
_corpse.classid != 351 && //hydra
_corpse.classid != 352 && //hydra
_corpse.classid != 353 && //hydra
_corpse.classid != 363 && //necro skeleton
_corpse.classid != 364 && //necro mage
_corpse.classid != 563 && //baal tentacle
_corpse.classid != 564 && //baal tentacle
_corpse.classid != 565 && //baal tentacle
_corpse.classid != 566 && //baal tentacle
_corpse.classid != 567 //baal tentacle
)
{
//Print(_corpse.classid + " " + _corpse.name);
if(NTC_CastSkill(NTConfig_ExplodeCorpses, NTC_HAND_RIGHT, _corpse))
_exploded++;
if(_exploded >= 2)
return false;
}
}while(_corpse.GetNext());
}
return true;
}
function NTA_PaladinAttackPatternInt()
{
var _maxindex, _maxskill;
var _avgskilllevel = new Array();
_avgskilllevel[0] = parseInt((me.GetSkill(112, false)+me.GetSkill(108, false)+me.GetSkill(115, false))/3);
_avgskilllevel[1] = parseInt((me.GetSkill(106, false)+me.GetSkill(96, false))/2);
_avgskilllevel[2] = parseInt((me.GetSkill(121, false)+me.GetSkill(101, false)+me.GetSkill(118, false))/3);
_maxindex = -1;
_maxskill = 0;
for(var i = 0 ; i < _avgskilllevel.length ; i++)
{
if(_avgskilllevel[i] > _maxskill)
{
_maxindex = i;
_maxskill = _avgskilllevel[i];
}
}
switch(_maxindex)
{
case 0: // Blessed Hammer
NTConfig_AttackSkill[1] = 112;
NTConfig_AttackSkill[2] = 113;
NTConfig_AttackSkill[3] = 112;
NTConfig_AttackSkill[4] = 113;
break;
case 1: // Zeal
NTConfig_AttackSkill[1] = 106;
NTConfig_AttackSkill[2] = 122;
NTConfig_AttackSkill[3] = 106;
NTConfig_AttackSkill[4] = 122;
break;
case 2: // Fist of the Heavens
NTConfig_AttackSkill[1] = 121;
NTConfig_AttackSkill[2] = 123;
NTConfig_AttackSkill[3] = 121;
NTConfig_AttackSkill[4] = 123;
break;
}
return (NTConfig_AttackSkill[1] && NTConfig_AttackSkill[3]);
}
function NTA_PaladinAttackInt(target, firstorder)
{
var _primaryindex;
var _attackSkill;
if(NTTMGR_CheckCurse(NTConfig_CheckSelfSafe&0x10, NTConfig_CheckMercSafe&0x10) || me.hp <= parseInt((me.hpmax*NTConfig_TPChicken)/100))
{
if(!NTTMGR_VisitTown())
return 0;
}
if(firstorder && NTConfig_AttackSkill[0] > -1 && NTA_GetResistance(target, _NTA_SkillDamage[0]) < 100)
{
if(GetDistance(me, target) > _NTA_SkillRange[0] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[0], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(!NTC_CastSkill(NTConfig_AttackSkill[0], _NTA_SkillHand[0], target))
return 2;
return 3;
}
_primaryindex = (target.spectype&0x0A) ? 1 : 3;
_attackIndex = NTA_GetAttackType(target, _primaryindex, 100, 100, 100);
if(NTConfig_AttackSkill[_attackIndex] > -1)
{
if(_NTA_SkillRange[_attackIndex] < 4 && !CheckCollision(target.areaid, target.x, target.y, 1))
return 1;
if(!NTA_PaladinCastSkillInt(_attackIndex, target))
return 2;
return 3;
}
return 1;
}
function NTA_PaladinCastSkillInt(index, target)
{
if(NTConfig_AttackSkill[index] == 112)
{
if(me.x-target.x < 1 || me.x-target.x > 2 || me.y-target.y < 1 || me.y-target.y > 2)
{
if(CheckCollision(target.areaid, target.x+2, target.y+2, 1))
NTM_MoveTo(target.areaid, target.x+2, target.y+2, 0);
else if(me.x-target.x < -4 || me.x-target.x > 2 || me.y-target.y < 0 || me.y-target.y > 2)
NTM_MoveTo(target.areaid, target.x-4, target.y, 0);
}
}
else
{
if(GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
}
if(NTConfig_AttackSkill[index+1] > -1)
NTC_PutSkill(NTConfig_AttackSkill[index+1], NTC_HAND_RIGHT);
return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], target);
}
function NTA_BarbarianAttackPatternInt()
{
var _maxindex, _maxskill;
var _avgskilllevel = new Array();
_avgskilllevel[0] = me.GetSkill(151, false);
_maxindex = -1;
_maxskill = 0;
for(var i = 0 ; i < _avgskilllevel.length ; i++)
{
if(_avgskilllevel[i] > _maxskill)
{
_maxindex = i;
_maxskill = _avgskilllevel[i];
}
}
switch(_maxindex)
{
case 0: // Whirlwind
NTConfig_AttackSkill[1] = 151;
NTConfig_AttackSkill[3] = 151;
NTConfig_AttackSkill[5] = 152;
break;
}
return (NTConfig_AttackSkill[1] && NTConfig_AttackSkill[3]);
}
function NTA_BarbarianAttackInt(target, firstorder)
{
var _primaryindex;
var _attackSkill;
if(NTTMGR_CheckCurse(NTConfig_CheckSelfSafe&0x10, NTConfig_CheckMercSafe&0x10) || me.hp <= parseInt((me.hpmax*NTConfig_TPChicken)/100))
{
if(!NTTMGR_VisitTown())
return 0;
}
if(firstorder && NTConfig_AttackSkill[0] > -1 && NTA_GetResistance(target, _NTA_SkillDamage[0]) < 100)
{
if(GetDistance(me, target) > _NTA_SkillRange[0] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[0], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(!NTC_CastSkill(NTConfig_AttackSkill[0], _NTA_SkillHand[0], target))
return 2;
return 3;
}
_primaryindex = (target.spectype&0x0A) ? 1 : 3;
_attackIndex = NTA_GetAttackType(target, _primaryindex, 100, 100, 100);
if(NTConfig_AttackSkill[_attackIndex] > -1)
{
if(_NTA_SkillRange[_attackIndex] < 4 && !CheckCollision(target.areaid, target.x, target.y, 1))
return 1;
if(!NTA_BarbarianCastSkillInt(_attackIndex, target))
return 2;
return 3;
}
/*
if(NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) < 100)
{
if((_NTA_SkillRange[_primaryindex] < 4 || NTConfig_AttackSkill[_primaryindex] == 151) && !CheckCollision(target.areaid, target.x, target.y, 1))
return 1;
if(!NTA_BarbarianCastSkillInt(_primaryindex, target))
return 2;
return 3;
}
if(NTConfig_AttackSkill[5] > -1 && NTA_GetResistance(target, _NTA_SkillDamage[5]) < 100)
{
if((_NTA_SkillRange[5] < 4 || NTConfig_AttackSkill[5] == 151) && !CheckCollision(target.areaid, target.x, target.y, 1))
return 1;
if(!NTA_BarbarianCastSkillInt(5, target))
return 2;
return 3;
}
*/
return 1;
}
function NTA_BarbarianCastSkillInt(index, target)
{
if(NTConfig_AttackSkill[index] == 151)
{
var _castx, _casty;
if(GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 5))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 5);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
_castx = target.x > me.x ? target.x+3 : target.x-3;
_casty = target.y > me.y ? target.y+3 : target.y-3;
return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], _castx, _casty);
}
if(GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], target);
}
function NTA_DruidAttackPatternInt()
{
var _maxindex, _maxskill;
var _avgskilllevel = new Array();
_avgskilllevel[0] = me.GetSkill(245, false);
_maxindex = -1;
_maxskill = 0;
for(var i = 0 ; i < _avgskilllevel.length ; i++)
{
if(_avgskilllevel[i] > _maxskill)
{
_maxindex = i;
_maxskill = _avgskilllevel[i];
}
}
switch(_maxindex)
{
case 0: //
NTConfig_AttackSkill[1] = 245;
NTConfig_AttackSkill[2] = 245;
NTConfig_AttackSkill[3] = 245;
NTConfig_AttackSkill[4] = 245;
NTConfig_AttackSkill[5] = 245;
NTConfig_AttackSkill[6] = 245;
break;
}
return (NTConfig_AttackSkill[1] && NTConfig_AttackSkill[3]);
}
function NTA_DruidAttackInt(target, firstorder)
{
var _primaryindex;
var _attackSkill;
if(NTTMGR_CheckCurse(NTConfig_CheckSelfSafe&0x10, NTConfig_CheckMercSafe&0x10) || me.hp <= parseInt((me.hpmax*NTConfig_TPChicken)/100))
{
if(!NTTMGR_VisitTown())
return 0;
}
if(firstorder && NTConfig_AttackSkill[0] > -1 && NTA_GetResistance(target, _NTA_SkillDamage[0]) < 100)
{
if(GetDistance(me, target) > NTConfig_AttackSkill[0] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(!NTC_CastSkill(NTConfig_AttackSkill[0], _NTA_SkillHand[0], target))
return 2;
return 3;
}
_primaryindex = (target.spectype&0x0A) ? 1 : 3;
_attackIndex = NTA_GetAttackType(target, _primaryindex, 91, 81, 81);
if(me.GetSkill(245, true) > 1)
if(target.name == "Andariel" || target.name == "Baal" || target.name == "Mephisto" || target.name == "Diablo")
{
if(!NTA_DruidCastSkillIntNear(_primaryindex, target))
return 2;
return 3;
}
if(NTConfig_AttackSkill[_attackIndex] > -1)
{
if(_NTA_SkillRange[_attackIndex] < 4 && !CheckCollision(target.areaid, target.x, target.y, 1))
return 1;
if(!NTA_DruidCastSkillInt(_attackIndex, target))
return 2;
return 3;
}
/*
if(NTA_GetResistance(target, _NTA_SkillDamage[_primaryindex]) <= 90)
{
if(!NTA_DruidCastSkillInt(_primaryindex, target))
return 2;
return 3;
}
if(NTConfig_AttackSkill[5] > -1 && NTA_GetResistance(target, _NTA_SkillDamage[5]) <= 80)
{
if(!NTA_DruidCastSkillInt(5, target))
return 2;
return 3;
}
*/
if(NTA_GetResistance(target, _NTA_SkillDamage[index]) < 100 || (_primaryindex == 1 && NTC_GetMerc()))
{
if(!NTA_DruidCastSkillInt(_primaryindex, target))
return 2;
return 3;
}
return 1;
}
function NTA_DruidCastSkillIntNear(index, target)
{
if(NTConfig_AttackSkill[index] == 245)
{
var _castx, _casty;
if(GetDistance(me, target) > 2 || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 5);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
_castx = target.x > me.x ? target.x+NTConfig_CastPast : target.x-NTConfig_CastPast;
_casty = target.y > me.y ? target.y+NTConfig_CastPast : target.y-NTConfig_CastPast;
return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], _castx, _casty);
}
if(NTConfig_AttackSkill[index+1] > -1 && NTConfig_AttackSkill[index] != 245)
{
if(GetDistance(me, target) > 3 || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, 3, 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[index+1], _NTA_SkillHand[index+1], target);
}
}
function NTA_DruidCastSkillInt(index, target)
{
if(NTConfig_AttackSkill[index] == 245)
{
var _castx, _casty;
if(GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 5);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
_castx = target.x > me.x ? target.x+NTConfig_CastPast : target.x-NTConfig_CastPast;
_casty = target.y > me.y ? target.y+NTConfig_CastPast : target.y-NTConfig_CastPast;
return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], _castx, _casty);
}
if(GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(!me.GetState(139))
NTC_CastSkill(223, NTC_HAND_RIGHT) // Werewolf
else if(!me.GetState(140))
NTC_CastSkill(228, NTC_HAND_RIGHT) // Werebear
return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], target);
if(NTConfig_AttackSkill[index+1] > -1)
{
if(GetDistance(me, target) > _NTA_SkillRange[index+1] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index+1], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[index+1], _NTA_SkillHand[index+1], target);
}
}
function NTA_AssassinAttackPatternInt()
{
return false;
}
function NTA_AssassinAttackInt(target, firstorder)
{
var _primaryindex;
var _attackIndex;
var _skillCasted = 0;
if(NTTMGR_CheckCurse(NTConfig_CheckSelfSafe&0x10, NTConfig_CheckMercSafe&0x10) || me.hp <= parseInt((me.hpmax*NTConfig_TPChicken)/100))
{
if(!NTTMGR_VisitTown())
return 0;
}
if(firstorder && NTConfig_AttackSkill[0] > -1 && NTA_GetResistance(target, _NTA_SkillDamage[0]) < 100)
{
if(GetDistance(me, target) > _NTA_SkillRange[0] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[0], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(!NTC_CastSkill(NTConfig_AttackSkill[0], _NTA_SkillHand[0], target))
return 2;
return 3;
}
if(NTConfig_UseTraps)
NTA_CheckTraps(target);
_primaryindex = (target.spectype&0x0A) ? 1 : 3;
_attackIndex = NTA_GetAttackType(target, _primaryindex, 91, 81, 81);
if(NTConfig_AttackSkill[_attackIndex] > -1 )
{
_skillCasted = _attackIndex;
if(_NTA_SkillRange[_attackIndex] < 4 && !CheckCollision(target.areaid, target.x, target.y, 1))
return 1;
if(!NTA_AssassinCastSkillInt(_attackIndex, target, _primaryindex))
return 2;
return 3;
}
if(NTConfig_UseTraps) {
if(_skillCasted == 0)
NTC_Delay(NTConfig_AttackSkill);
return 3;
}
return 1;
}
function NTA_AssassinCastSkillInt(index, target, primaryIndex)
{
var secondarySkill = 0;
if(me.GetSkillStatus(NTConfig_AttackSkill[index]) != 8)
{
if(GetDistance(me, target) > _NTA_SkillRange[index] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[index], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], target);
}
secondarySkill = NTA_GetAttackType (target, primaryIndex+1, 81, 81, 81);
if(NTConfig_AttackSkill[secondarySkill] > -1)
{
if(GetDistance(me, target) > _NTA_SkillRange[secondarySkill] || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[secondarySkill], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[secondarySkill], _NTA_SkillHand[secondarySkill], target);
}
for(var i = 0 ; i < 25 ; i++)
{
NTC_Delay(NTC_DELAY_FRAME);
if(me.GetSkillStatus(NTConfig_AttackSkill[index]) != 8)
break;
}
return false;
}
function NTA_CheckTraps(target)
{
var traps=NTC_FindUnit(NTC_UNIT_MONSTER);
var trapcount =0;
//var warr=0;
var x,y;
var parent;
var _isActBoss = false;
var _trapOffset;
// || target.name == GetLocaleString(3021) - Andariel
if(target.name == GetLocaleString(3062) || target.name == GetLocaleString(3054)
|| target.name == GetLocaleString(3060) || target.name == GetLocaleString(3061))
_isActBoss = true;
if (traps){
do{
if (traps.classid == 412 || traps.classid == 413 || traps.classid == 416 || traps.classid == 417){
parent = traps.GetParent();
if(parent != null && parent.name == me.name) {
if(GetDistance(target.x,target.y,traps.x,traps.y)< (_isActBoss?NTConfig_MinBossTrapRange:NTConfig_MinTrapRange) && traps.hp > 100 ) {
trapcount=trapcount+1;
}
}
}
/*if ((traps.classid == 418 || traps.classid == 419) && traps.mode == 12){ // apparently 417/418 are warrior/master. commented out for now
warr=1;
}*/
}while(traps.GetNext())
if (trapcount < (_isActBoss?NTConfig_NumBossTrap:NTConfig_NumTraps) && target.hp>0){
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, 13, 10);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
_trapOffset = NTA_GetTrapAttackPattern(_isActBoss);
for(var i=0; i < 5; i++) {
if(NTConfig_TrapSet[i] > 0) {
if(i == 0 || i == 2 || i == 3) // Added delays to prevent trap miscast
NTC_Delay(25);
NTC_CastSkill((_isActBoss?NTConfig_TrapSet[0]:NTConfig_TrapSet[i]), NTC_HAND_RIGHT, target.x + _trapOffset[i][0], target.y + _trapOffset[i][1]);
}
}
}
/*if (warr!=0)
NTP_DoPrecast(false);*/
}
}
function NTA_GetTrapAttackPattern(isActBoss) {
var _attackPattern = new Array(5);
var _bossOffset = 1;
if(NTConfig_TrapAttackPattern == 1) { // Pentagram
_attackPattern[0] = [-2 - (isActBoss?_bossOffset:0), -2 - (isActBoss?_bossOffset:0)];
_attackPattern[1] = [0, 2 + (isActBoss?_bossOffset:0)];
_attackPattern[2] = [2 + (isActBoss?_bossOffset:0), -2 - (isActBoss?_bossOffset:0)];
_attackPattern[3] = [-3 - (isActBoss?_bossOffset:0), 1 + (isActBoss?_bossOffset:0)];
_attackPattern[4] = [3 + (isActBoss?_bossOffset:0), 1 + (isActBoss?_bossOffset:0)];
}
else if(NTConfig_TrapAttackPattern == 2) { // X - axis
_attackPattern[0] = [0, 0];
_attackPattern[1] = [1 + (isActBoss?_bossOffset:0), 0];
_attackPattern[2] = [-1 - (isActBoss?_bossOffset:0), 0];
_attackPattern[3] = [2 + (isActBoss?_bossOffset:0), 0];
_attackPattern[4] = [-2 - (isActBoss?_bossOffset:0), 0];
}
else if(NTConfig_TrapAttackPattern == 3) { // Y - axis
_attackPattern[0] = [0, 0];
_attackPattern[1] = [0, 1 + (isActBoss?_bossOffset:0)];
_attackPattern[2] = [0, -1 - (isActBoss?_bossOffset:0)];
_attackPattern[3] = [0, 2 + (isActBoss?_bossOffset:0)];
_attackPattern[4] = [0, -2 - (isActBoss?_bossOffset:0)];
}
else { // quincunx
_attackPattern[0] = [2 + (isActBoss?_bossOffset:0), 2 + (isActBoss?_bossOffset:0)];
_attackPattern[1] = [-2 - (isActBoss?_bossOffset:0), -2 - (isActBoss?_bossOffset:0)];
_attackPattern[2] = [-2 - (isActBoss?_bossOffset:0), 2 + (isActBoss?_bossOffset:0)];
_attackPattern[3] = [2 + (isActBoss?_bossOffset:0), -2 - (isActBoss?_bossOffset:0)];
_attackPattern[4] = [0, 0];
}
return _attackPattern;
}
/*
We want an attack that is less than our given max resist for a particular skill. If all of our attacks don't meet our
requirement, return the lowest resist skill.
*/
function NTA_GetAttackType(target, startIndex, resistMaxPrimary, resistMaxSecondary, resistMaxTertiary) {
var _currIndex;
var _holdMinResist = [999, startIndex];
var _resistArray = [999,999,999];
var _holdResistMax = [resistMaxPrimary, resistMaxSecondary, resistMaxTertiary];
var i;
for(i=0, _currIndex=startIndex; i < 3;i++, _currIndex += 2) {
if(NTConfig_AttackSkill[_currIndex] > -1 )
{
_resistArray[i] = NTA_GetResistance(target, _NTA_SkillDamage[_currIndex]);
if(_resistArray[i] < _holdResistMax[i]) // Return index if attack is < our max resist requirement
return _currIndex;
}
if(_resistArray[i] < _holdMinResist[0]) { // Store lowest resist attack
_holdMinResist[0] = _resistArray[i];
_holdMinResist[1] = _currIndex;
}
if(_currIndex == 1 || _currIndex == 2) // Skip non boss primary if boss attack
_currIndex += 2;
}
if(_holdMinResist[0] >= 100) // Every attack is immune
return startIndex;
else // At this point all available skills are greater than given max resist settings. Use lowest resist skill.
return _holdMinResist[1];
}
function NTA_HighMaxAttackAreas() {
var _presentarea = me.areaid
for (var i = 0; i < NTConfig_HighMaxAttackAreas.length; i++) {
if (_presentarea == NTConfig_HighMaxAttackAreas[i]){
return true;
}
}
return false;
}
function NTA_ClearPositionGoodMonsters(range, pickitem, safelevel)
{
var _orgx, _orgy;
var _spectype = [0x0A];
var _skiplist;
var _attackcount = 0;
var _target;
var _distance, _mingid, _mindistance;
var _result;
if(NTConfig_AttackSkill[1] < 0 || NTConfig_AttackSkill[3] < 0)
return false;
switch(arguments.length)
{
case 0:
range = 20;
case 1:
pickitem = false;
case 2:
safelevel = 0;
default:
if(NTConfig_CheckSelfSafe < 0x01 && NTConfig_CheckMercSafe < 0x01)
safelevel = 0;
break;
}
_orgx = me.x;
_orgy = me.y;
for(var i = 0 ; i < _spectype.length ; i++)
{
_skiplist = new Array();
while(_attackcount < (i+1)*100)
{
_mindistance = 100000;
_target = NTC_FindUnit(NTC_UNIT_MONSTER);
if(_target)
{
do
{
if(_skiplist.indexOf(_target.gid) < 0)
{
if(_target.IsAttackable() && (_target.spectype&_spectype[i]))
{
if(GetDistance(_orgx, _orgy, _target.x, _target.y) <= range && NTA_IsValidMonster(_target))
{
_distance = GetDistance(me, _target);
if(_distance < _mindistance)
{
_mingid = _target.gid;
_mindistance = _distance;
}
}
}
else
_skiplist.push(_target.gid);
}
} while(_target.GetNext());
}
if(_mindistance < 100000)
{
_target = NTC_FindUnit(NTC_UNIT_MONSTER, _mingid);
if(_target)
{
_result = NTA_Attack(_target, (_attackcount%30) == 0);
switch(_result)
{
case 1:
_skiplist.push(_mingid);
break;
case 2:
case 3:
_attackcount++;
_sorcattack++;
if(NTConfig_FastPickit) //----------------------------------edited lines
NTSI_PickItems(); //----------------------------------------
break;
default:
return false;
}
}
}
else
break;
}
}
if(me.classid == NTC_CHAR_CLASS_PALADIN)
{
if(_attackcount > 2 && (parseInt(me.hp*100/me.hpmax) < NTConfig_UseRedemptionHP || parseInt(me.mp*100/me.mpmax) < NTConfig_UseRedemptionMP))
{
if(NTC_PutSkill(124, NTC_HAND_RIGHT))
NTC_PingDelay(1000);
}
}
else if(me.classid == NTC_CHAR_CLASS_NECROMANCER)
{
NTA_SkeletonArmy(NTConfig_SkeletonArmy);
NTA_MageArmy(NTConfig_MageArmy);
NTA_ReviveArmy(NTConfig_ReviveArmy);
}
else if(me.classid == NTC_CHAR_CLASS_BARBARIAN)
{
if(NTConfig_UseFindItem && _attackcount > 2)
{
if(!NTA_CheckForCloseMonsters(10))
{
//Print("ÿc<No Monsters close - looting");
NTA_FindItem(NTConfig_FindItemRange);
}
}
}
if(NTConfig_OpenChest)
{
_target = NTC_GetSpecialChest();
if(_target && GetDistance(_orgx, _orgy, _target.x, _target.y) <= range && NTC_OpenChest(_target))
_attackcount++;
_sorcattack++;
}
if(pickitem && _attackcount > 0)
NTSI_PickItems();
switch(safelevel)
{
case 1:
return NTTMGR_CheckSafe(0x00, NTConfig_CheckMercSafe&0x01);
case 2:
return NTTMGR_CheckSafe(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe);
}
return true;
}
function NTA_CheckMercInfinity(){
var _weapon, _merc;
var Merc_HaveInfinty = false;
_merc = NTC_GetMerc();
if(!_merc){
if(DebugAttacksInGame){Print("ÿc8");}
return false;
}
if(_merc && _merc.hp > 0 && _merc.mode != 0 && _merc.mode != 12){
_weapon = _merc.GetItems();
if(_weapon){
for(var i = 0 ; i < _weapon.length && !Merc_HaveInfinty ; i++){
if((_weapon[i].itemflag&0x4000000) && _weapon[i].itemprefix == 20566){
Merc_HaveInfinty = true;
if(DebugAttacksInGame){Print("ÿc8merc has infinity");}
return true;
}
}
}
}
if(!Merc_HaveInfinty){
if(DebugAttacksInGame){Print("ÿc8");}
return false;
}
}
function NTA_CheckMyHp(){
_LifeMax = me.hpmax;
_ManaMax = me.mpmax;
if(NTConfig_DanceStartHp > 0 || NTConfig_DanceStartMp > 0){
if(parseInt(me.hp*100/_LifeMax) < NTConfig_DanceStartHp || parseInt(me.mp*100/_ManaMax) < NTConfig_DanceStartMp)
return true;
}
else
return false;
}
function NTA_Bounce(target){
if (me.x - target.x >= 0 && me.y - target.y >= 0)
NTC_CastSkill(54, NTC_HAND_RIGHT, target.x - 9, target.y - 9);
else if (me.x - target.x >= 0 && me.y - target.y < 0)
NTC_CastSkill(54, NTC_HAND_RIGHT, target.x - 9, target.y + 9);
else if (me.x - target.x < 0 && me.y - target.y >= 0)
NTC_CastSkill(54, NTC_HAND_RIGHT, target.x + 9, target.y + 9);
else
NTC_CastSkill(54, NTC_HAND_RIGHT, target.x + 9, target.y - 9);
_sorcattack = 0;
}
function NTA_ClearPos(repeat, range, delay, backxy){
var presx = me.x;
var presy = me.y;
if(arguments.length < 4)
backxy = false;
if(arguments.length < 3)
delay = 0;
if(arguments.length < 2)
range = 25;
if(arguments.length < 1)
repeat = 2;
if(DebugAttacksInGame){Print("ÿc&delay= " + delay + ", range =" + range + ", repeat =" + repeat);}
for(var k = 0 ; k < repeat ; k ++){
NTA_ClearPosition(range);
if(backxy)
NTM_MoveTo(108, presx, presy);
Delay(delay);
if(DebugAttacksInGame){Print("ÿc8Loop" + "[" + k + "]");}
}
}
Code:
function NTA_FindItem(range)
{
var _corpse;
var _orgx;
var _orgy;
var _startTick;
var _reposition = false;
if(me.classid != NTC_CHAR_CLASS_BARBARIAN || NTC_GetSkillLevel(131) < 1)
return false;
if(arguments.length < 1 || !range)
range = 25;
_corpse = NTC_FindUnit(NTC_UNIT_MONSTER);
_orgx = me.x;
_orgy = me.y;
NTC_PingDelay(100);
NTC_SwapWeapons(2);
if(_corpse)
{
do
{
if(GetDistance(_orgx, _orgy, _corpse.x, _corpse.y) <= range && NTA_CheckLootStatus(_corpse) && NTA_IsLootable(_corpse.classid))
{
if(GetDistance(me.x, me.y, _corpse.x, _corpse.y) >= 8)
{
if(!NTM_MoveTo(me.areaid, _corpse.x, _corpse.y))
continue;
}
_startTick = GetTickCount();
_reposition = false;
while(NTA_CheckLootStatus(_corpse) && !_corpse.IsAttackable())
{
NTC_CastSkill(131, NTC_HAND_RIGHT, _corpse);
NTC_PingDelay(50);
if(GetTickCount() >= _startTick + 1000 && !_reposition) // repositioning after 1sec
{
_reposition = true;
if(!NTM_MoveTo(me.areaid, _corpse.x, _corpse.y))
break;
}
if(GetTickCount() >= _startTick + 2500) // skipping monster after 2.5sec
{
if(me.mp < 10)
{
Print("Lack of ÿc3Manaÿc0!");
if(NTConfig_BuyPotsIfLackOfMana)
{
if(NTTMGR_VisitTown())
NTC_SwapWeapons(2);
}
break;
}
var _filehandle = FileOpen("FailedtoLoot.txt", 2);
var _dateString = new Date().toLocaleFormat("%a %m/%d/%y %H:%M:%S");
if(_filehandle)
{
var _states = "States:: ";
for(var i = 0; i < 144; i++)
{
if(_corpse.GetState(i))
_states += "State(" + i + "): " + _corpse.GetState(i) + "<--> ";
}
_filehandle.WriteLine("[" + _dateString + "] Could not loot: " + _corpse.name +" [" + _corpse.classid + "] (Location: " + me.areaid + ") " + _states);
_filehandle.Close();
}
Print("ÿc;Could not loot: " + _corpse.name +" [" + _corpse.classid + "] <Mode: " + _corpse.mode + "> (Location: " + me.areaid + ")");
break;
}
}
/*if(GetTickCount() < _startTick + 2000)
NTC_SendMsgToScript("NTBotGame.ntj", "SET_LOOTED_NULL");*/
}
} while(_corpse.GetNext());
NTC_SwapWeapons(0);
NTC_PingDelay(100);
NTSI_PickItems();
return true;
}
return false;
}
function NTA_CheckForCloseMonsters(range)
{
if(range < 1 || arguments.length < 1)
return false;
var _monstersClose = false;
var _checkMonster = NTC_FindUnit(NTC_UNIT_MONSTER);
if(_checkMonster)
{
do
{
if(_checkMonster.IsAttackable() && GetDistance(me.x, me.y, _checkMonster.x, _checkMonster.y) < range && NTA_IsValidMonster(_checkMonster))
{
_monstersClose = true;
break;
}
} while(_checkMonster.GetNext());
}
return _monstersClose;
}
function NTA_CheckLootStatus(monsterunit)
{
if(!monsterunit.GetState(107) // Shattered
&& !monsterunit.GetState(104) // Corpse Explosion
&& !monsterunit.GetState(118) // Already Looted/Unlootable
&& (monsterunit.hp <= 0 || monsterunit.mode == 0 || monsterunit.mode == 12)) // Dead
return true;
else
return false;
}
function NTA_IsLootable(classid)
{
switch(classid)
{
case 179: // cow
case 156: // Andariel
case 180: // Sand Maggot Young
case 181: // Rock Worm Young
case 182: // Devourer Young
case 183: // Giant Lamprey Young
case 184: // World Killer Young
case 190: // Sand Maggot Egg
case 191: // Rock Worm Egg
case 192: // Devourer Egg
case 193: // Giant Lamprey Egg
case 194: // World Killer Egg
case 206: // Fould Crow Nest
case 207: // Blood Hawk Nest
case 208: // Black Vulture Nest
case 209: // Cloud Stalker Nest
case 221: // Duriel
case 227: // Maggot
case 228: // Mummy Generator
case 234: // Flying Scimitar
case 242: // Mephisto
case 243: // Diablo
case 250: // Summoner
case 258: // Water Watcher Limb
case 259: // River Stalker Limb
case 260: // Sygain Watcher Limb
case 261: // Water Watcher Head
case 262: // River Stalker Head
case 263: // Sygain Watcher Head
case 267: // Blood Raven
case 269: // An evil force
case 270: // Rogue Scout (== Merc)
case 273: // Gargoyle Trap
case 289: // Clay Golem
case 290: // Blood Golem
case 291: // Iron Golem
case 292: // Fire Golem
case 301: // Flesh Beast
case 302: // Stygian Dog
case 303: // Grotesque Wyrm
case 318: // An Evil Force
case 326: // A Trap
case 327: // A Trap
case 328: // A Trap
case 329: // A Trap
case 330: // A Trap
case 334: // Sucker Nest
case 335: // Fleeder Nest
case 336: // Blood Hook Nest
case 337: // Blood Wing Nest
case 338: // Act 2 guard (== Merc)
case 348: // Turret
case 349: // Turret
case 350: // Turret
case 351: // Hydra
case 352: // Hydra
case 353: // Hydra
case 354: // A Trap
case 356: // Dopplezon
case 357: // Valkyrie
case 359: // Iron Wolf (== Merc)
case 366: // Compelling Orb
case 369: // A Trap
case 371: // Lightning Spire
case 372: // Fire Tower
case 403: // Traped Soul
case 404: // Traped Soul
case 406: // Izual
case 410: // Wake Of Destruction
case 411: // Charged Bolt Sentry
case 412: // Lightning Sentry
case 413: // Blade Creeper
case 414: // Invisible Pet
case 415: // Inferno Sentry
case 416: // Death Sentry
case 417: // Shadow Warrior
case 418: // Shadow Master
case 419: // Druid Hawk
case 420: // Druid Spirit Wolf
case 421: // Druid Fenris
case 422: // Spirit of Barbs
case 423: // Heart Of Wolverine
case 424: // Oak Sage
case 425: // Druid Plague Poppy
case 426: // Druid Cycle of Life
case 427: // Vine Creature
case 428: // Druid Bear
case 429: // Eagle
case 430: // Wolf
case 431: // Bear
case 432: // Barricaded Door
case 433: // Barricaded Door
case 434: // Prison Door
case 435: // Barricaded Door
case 461: // Fanatic Minion
case 462: // Beserk Slayer
case 463: // Consumed Fire Boar
case 464: // Consumed Ice Boar
case 465: // Frenzied Hell Spawn
case 466: // Frenzied Hell Spawn
case 467: // Insane Hell Spawn
case 468: // Insane Ice Spawn
case 497: // Catapult
case 498: // Catapult
case 499: // Catapult
case 500: // Catapult
case 501: // Frozen Horror 1
case 502: // Frozen Horror 2
case 503: // Frozen Horror 3
case 504: // Frozen Horror 4
case 505: // Frozen Horror 5
case 516: // Catapult
case 517: // Catapult
case 518: // Catapult
case 519: // Catapult
case 522: // Barbarian Fighter
case 523: // Barbarian Fighter
case 524: // Barricade Wall Right
case 525: // Barricade Wall Left
case 526: // Nihlatak
case 528: // Evil Hut
case 535: // Barbarian Fighter
case 536: // Barbarian Fighter
case 537: // Ancient Statue 1
case 538: // Ancient Statue 2
case 539: // Ancient Statue 3
case 540: // Ancient Barbarian 1
case 541: // Ancient Barbarian 2
case 542: // Ancient Barbarian 3
case 543: // Baal Throne
case 544: // Baal Crab
case 545: // Baal Taunt
case 551: // Pain Worm
case 552: // Pain Worm
case 553: // Pain Worm
case 554: // Pain Worm
case 555: // Pain Worm
case 556: // Bunny
case 559: // Baal Crab to Stairs
case 560: // Hireling
case 561: // Hireling
case 562: // Baal Tentacle
case 563: // Baal Tentacle
case 564: // Baal Tentacle
case 565: // Baal Tentacle
case 566: // Baal Tentacle
case 567: // Injured Barbarian
case 568: // Injured Barbarian
case 569: // Injured Barbarian
case 570: // Baal Crab Clone
case 571: // Baals Minions
case 572: // Baals Minionse
case 573: // Baals Minions
case 574: // Worldstone Effect
case 662: // Flayer Shaman
return false;
break;
default:
return true;
break;
}
}
|
|
|
|
Similar Threads
|
corpse rez even if under the map
12/06/2008 - WoW PServer Exploits, Hacks & Tools - 3 Replies
The function "/script RetrieveCorpse()" is what the accept button on a corpse run does, but this function does not check the z-axis and therefore allows you to corpse rez even if your corpse is under the map and too far away to pop up the message.
Simply run back to your tombstone and use this script, and viola no more having to sit for 15 minutes with rez sickness.
Also, just fyi, "/script RepopMe()" is how you release if you die from falling under the map.
credits to ironblitzkrieg
|
Never corpse-run!!!
09/25/2006 - World of Warcraft - 1 Replies
Never corpse-run!!!
1)Die in an instance Sad
2)Write /logout (or click esc and do it that way)
3)wait
4)wait
5)When it\'s 1 sec left on countdown, click release as fast as you can!
6)you will be logged out
7)you log back in
8)you will be a spirit on top of your body
|
BWL fast Corpse run
09/10/2006 - WoW Exploits, Hacks, Tools & Macros - 4 Replies
if you wipe in Blackwing Lair and get sick of the long corpse runs from Thorium Point, there's a handy little bug you can take advantage of. if you have a bit of lag when you release spirit quickly run, in ghost form, to the BWL exit. if you can get out before it throws your ghost to Thorium Point then you'll be in ghost form outside the UBRS entrance and have a quick walk back to BWL
obviously this works best on Razorgore, but if you have especially bad lag it's also doable on Vael. It'd...
|
Move corpse trick
12/14/2005 - WoW Exploits, Hacks, Tools & Macros - 3 Replies
Ok, heres what you do. As soon as you die, before you hit release spirit, you need to lag. For you 56k people, call the phoneline you are using, or just pick up the phone and hit it. I dont know about broadband or cable, i guess start a really huge download or something. After that, you will end up at the spirit healer but the tombstone will not appear on the mini map. So go to where you want your new corpse to be, and log out. Log back in and you will be dead again and it will ask if you want...
|
Move your corpse to rez
01/09/2005 - WoW Exploits, Hacks, Tools & Macros - 0 Replies
When you die and go into spirit form there are usually always server side lag, creating the RIP symbol/corpse area to not load in. Simple log off and just log back on, and your corpse will move to where you logged off and you can rez right there! Anyways its just something fun to play around with when theres lots of corpse lag. Ive been able to do this everytime ive tried it when my corpse doesnt load.
PS - Excuse my poor writing skills, if you have any questions please just reply and ill...
|
All times are GMT +2. The time now is 13:11.
|
|