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;
}
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 ())
{
_attackcount var = 0;
while (_attackcount <300 && NTA_IsValidMonster (_target))
{
if (NTA_Attack (_target, (_attackcount% 30) == 0) <2)
break;
_attackcount + +;
}
}
return (_target.hp <= 0 | | _target.mode == 0 | | _target.mode == 12);
}
function NTA_ClearPosition (range, pickitem, safe level, recursion)
{
var _orgx, _orgy;
var _spectype = [0x0A, 0x01, 0x01];
var _skiplist;
_attackcount var = 0;
var _target;
var _distance, _mingid, _mindistance;
var _result;
if (NTConfig_AttackSkill [1] <1 | | NTConfig_AttackSkill [3] <1)
return false;
switch (arguments.length)
{
case 0:
range = 20;
case 1:
pickitem = false;
case 2:
safe level = 0;
case 3:
recursion = true;
default:
if (NTConfig_CheckSelfSafe <0x01 && NTConfig_CheckMercSafe <0x01)
safe level = 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 + +;
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 ("YC <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 (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 ();
/ *
if (! NTA_CheckForCloseMonsters (15))
NTA_OpenChests ();
* /
switch (safe level)
{
case 1:
return NTTMGR_CheckSafe (0x00, 0x01 & NTConfig_CheckMercSafe);
case 2:
return NTTMGR_CheckSafe (NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe);
}
return true;
}
function NTA_ClearLevel (pickitem, safe level)
{
var i;
var _room, _rooms;
var _distance, _minindex, _mindistance;
_room = getRoom ();
if (! _room)
return false;
switch (arguments.length)
{
case 0:
pickitem = true;
case 1:
safe level = 2;
default:
if (NTConfig_CheckSelfSafe <0x01 && NTConfig_CheckMercSafe <0x01)
safe level = 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, safe level))
return false;
NTP_DoPrecast (false);
}
_rooms.splice (_minindex, 1);
}
return true;
}
function NTA_ClearRoom (pickitem, safe level)
{
var _room;
var _spectype = [0x0A, 0x01, 0x01];
var _skiplist;
_attackcount var = 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:
safe level = 0;
default:
if (NTConfig_CheckSelfSafe <0x01 && NTConfig_CheckMercSafe <0x01)
safe level = 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 ("YC <No Monsters close - looting");
NTA_FindItem (NTConfig_FindItemRange);
}
}
if (NTConfig_OpenChest)
{
_target = NTC_GetSpecialChest ();
if (_target && _room.UnitInRoom (_target) && NTC_OpenChest (_target))
_attackcount + +;
}
if (pickitem && _attackcount> 0)
NTSI_PickItems ();
/ *
if (! NTA_CheckForCloseMonsters (15))
NTA_OpenChests ();
* /
switch (safe level)
{
case 1:
return NTTMGR_CheckSafe (0x00, 0x01 & NTConfig_CheckMercSafe);
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 Water Watchers
return false;
if (monster.GetState (53) | | monster.GetState (96)) / / Conversion, Revive
return false;
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 "like":
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:
enemy.GetStat return (36);
case NTA_DAMAGE_MAGIC:
enemy.GetStat return (37);
case NTA_DAMAGE_FIRE:
enemy.GetStat return (39);
case NTA_DAMAGE_LIGHTNING:
enemy.GetStat return (41);
case NTA_DAMAGE_COLD:
enemy.GetStat return (43);
case NTA_DAMAGE_POISON:
enemy.GetStat return (45);
}
return 0;
}
NTA_DetectAttackPattern function ()
{
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
NTA_Attack function (target, first order)
{
switch (me.classid)
{
case NTC_CHAR_CLASS_AMAZON:
NTA_AmazonAttackInt return (target, first order);
case NTC_CHAR_CLASS_SORCERESS:
NTA_SorceressAttackInt return (target, first order);
case NTC_CHAR_CLASS_NECROMANCER:
NTA_NecromancerAttackInt return (target, first order);
case NTC_CHAR_CLASS_PALADIN:
NTA_PaladinAttackInt return (target, first order);
case NTC_CHAR_CLASS_BARBARIAN:
NTA_BarbarianAttackInt return (target, first order);
case NTC_CHAR_CLASS_DRUID:
NTA_DruidAttackInt return (target, first order);
case NTC_CHAR_CLASS_ASSASSIN:
NTA_AssassinAttackInt return (target, first order);
}
return 0;
}
/ / Internal function
NTA_AmazonAttackPatternInt function ()
{
return false;
}
NTA_AmazonAttackInt function (target, first order)
{
return 1;
}
function NTA_AmazonCastSkillInt (index, target)
{
return false;
}
NTA_SorceressAttackPatternInt function ()
{
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: / / Fireball + 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: / / Fireball 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]);
}
NTA_SorceressAttackInt function (target, first order)
{
var _primaryindex;
if (NTTMGR_CheckCurse (NTConfig_CheckSelfSafe & 0x10, NTConfig_CheckMercSafe & 0x10))
{
if (! NTTMGR_VisitTown ())
return 0;
}
if (first order && NTConfig_AttackSkill [0]> 0 && NTA_GetResistance (target, _NTA_SkillDamage [0]) <100 && me.GetSkillStatus (NTConfig_AttackSkill [0])! = 8)
{
if (GetDistance (me, target)> _NTA_SkillRange [0] | |! Check Collision (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 (NTA_IsActBoss (target.classid) && NTConfig_CastStatic <100 && parseInt (target.hp * 100/target.hpmax)> NTConfig_CastStatic NTA_GetResistance && (target, NTA_DAMAGE_LIGHTNING) <= 80)
{
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 | |! Check Collision (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 (! Check Collision (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;
if (NTA_GetResistance (target, _NTA_SkillDamage [_primaryindex]) <= 90)
{
if (! NTA_SorceressCastSkillInt (_primaryindex, target))
return 2;
return 3;
}
if (NTConfig_AttackSkill [5]> 0 && NTA_GetResistance (target, _NTA_SkillDamage [5]) <= 80)
{
if (! NTA_SorceressCastSkillInt (5, target))
return 2;
return 3;
}
if (NTA_GetResistance (target, _NTA_SkillDamage [_primaryindex]) <100 | | (_primaryindex == 1 && NTC_GetMerc ()))
{
if (! NTA_SorceressCastSkillInt (_primaryindex, target))
return 2;
return 3;
}
return 1;
}
function NTA_SorceressCastSkillInt (index, target)
{
if (me.GetSkillStatus (NTConfig_AttackSkill [index])! = 8)
{
if (GetDistance (me, target)> _NTA_SkillRange [index] | |! Check Collision (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 (NTConfig_AttackSkill [7]> 0 && (NTA_GetResistance (target, _NTA_SkillDamage [index +1]) <= 90 | | NTA_GetResistance (target, _NTA_SkillDamage [7]) <= 90))
{
if (NTA_GetResistance (target, _NTA_SkillDamage [index +1]) <= 90)
{
if (GetDistance (me, target)> _NTA_SkillRange [index +1] | |! Check Collision (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);
}
else
{
if (GetDistance (me, target)> _NTA_SkillRange [7] | |! Check Collision (me, target, 4))
{
var = _pos me.GetOptimalAttackPos (target.areaid, target.x, target.y, _NTA_SkillRange [7], 4);
if (_pos)
NTM_MoveTo (target.areaid, _pos [0], _pos [1], 0);
}
return NTC_CastSkill (NTConfig_AttackSkill [7], _NTA_SkillHand [7], target);
}
}
else
{
if (GetDistance (me, target)> _NTA_SkillRange [index +1] | |! Check Collision (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;
}
NTA_NecromancerAttackPatternInt function ()
{
return false;
}
NTA_NecromancerAttackInt function (target, first order)
{
return 1;
}
function NTA_NecromancerCastSkillInt (index, target)
{
return false;
}
NTA_PaladinAttackPatternInt function ()
{
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]);
}
NTA_PaladinAttackInt function (target, first order)
{
var _primaryindex;
if (NTTMGR_CheckCurse (NTConfig_CheckSelfSafe & 0x10, NTConfig_CheckMercSafe & 0x10))
{
if (! NTTMGR_VisitTown ())
return 0;
}
if (first order && NTConfig_AttackSkill [0]> 0 && NTA_GetResistance (target, _NTA_SkillDamage [0]) <100)
{
if (GetDistance (me, target)> _NTA_SkillRange [0] | |! Check Collision (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 &&! Check Collision (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_SkillDamage [5]) <100)
{
if (_NTA_SkillRange [5] <4 &&! Check Collision (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 (check Collision (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] | |! Check Collision (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);
}
NTA_BarbarianAttackPatternInt function ()
{
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]);
}
NTA_BarbarianAttackInt function (target, first order)
{
var _primaryindex;
if (NTTMGR_CheckCurse (NTConfig_CheckSelfSafe & 0x10, NTConfig_CheckMercSafe & 0x10))
{
if (! NTTMGR_VisitTown ())
return 0;
}
if (first order && NTConfig_AttackSkill [0]> 0 && NTA_GetResistance (target, _NTA_SkillDamage [0]) <100)
{
if (GetDistance (me, target)> _NTA_SkillRange [0] | |! Check Collision (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) && Check Collision (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) && Check Collision (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] | |! Check Collision (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] | |! Check Collision (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);
}
NTA_DruidAttackPatternInt function ()
{
return false;
}
NTA_DruidAttackInt function (target, first order)
{
return 1;
}
function NTA_DruidCastSkillInt (index, target)
{
return false;
}
NTA_AssassinAttackPatternInt function ()
{
return false;
}
NTA_AssassinAttackInt function (target, first order)
{
return 1;
}
function NTA_AssassinCastSkillInt (index, target)
{
return false;
}
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 (50);
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 file handle = FileOpen ("FailedtoLoot.txt", 2);
var date string = new Date () toLocaleFormat ("% a% m /% d /% y% H:% M:% S").;
if (filehandle)
{
filehandle.WriteLine ("[" + date string + "] Could not loot:" + _corpse.name + "[" + _corpse.classid + "] (Location:" + me.areaid + ")");
filehandle.Close ();
}
Print ("YC; Could not loot:" + _corpse.name + "[" + _corpse.classid + "] (Location:" + me.areaid + ")");
break;
}
}
}
} While (_corpse.GetNext ());
NTC_PingDelay (50);
NTC_SwapWeapons (0);
NTC_PingDelay (50);
NTSI_PickItems ();
return true;
}
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's 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 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: / / Berserk 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: / / Left Wall Barricade
case 526: / / Nihlatak
case 528: / / Evil Hat
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: / / Baal's Minions
case 572: / / Baal Minionse
case 573: / / Baal's Minions
case 574: / / World Stone Effect
return false;
break;
default:
return true;
break;
}
}
/ *
NTA_OpenChests function ()
{
var _orgx;
var _orgy;
var _chest;
if (! NTA_AreaCheckChests (me.areaid))
return false;
_orgx = me.x;
_orgy = me.y;
_chest = NTC_FindUnit (NTC_UNIT_OBJECT);
if (_chest)
{
do
{
if (_chest.mode == 0 && GetDistance (_orgx, _orgy, _chest.x, _chest.y) <20 && NTA_IsLootableChest (_chest.classid) &&! (_chest.classid == 371 && _chest.areaid == 25) && _chest.name.toLowerCase ()! = "an evil force")
{
NTC_PingDelay (100);
/ / Print ("ÿc2Opening:" + _chest.name + "[" + _chest.classid + "]");
if (! NTC_OpenChest (_chest))
{
Print ("ÿc1Could not open: Object (" + _chest.x + "|" + _chest.y + "):" + + _chest.name "[ClassID:" + _chest.classid + "mode:" + _chest. mode + "]");
var file handle = FileOpen ("FailedToOpenChest.txt", 2);
var date string = new Date () toLocaleFormat ("% a% m /% d /% y% H:% M:% S").;
if (filehandle)
{
filehandle.WriteLine ("[" + date string + "] Failed to open" + _chest.name + "[" + _chest.classid + "] ... Fashion | Area:" + _chest.mode + "|" + me. areaid);
filehandle.Close ();
}
}
}
} While (_chest.GetNext ());
NTSI_PickItems ();
return true;
}
return false;
}
function NTA_IsLootableChest (classid)
{
switch (classid)
{
case 1: / / Casket
case 3: / / Casket
case 4: / / Large Urn
case 5: / / Chest
case 6: / / Chest
case 7: / / barrel
case 8:
case 9: / / Urn
case 28: / / Undefiled Grave
case 46:
case 50:
case 51: / / Casket
case 52: / / Urn
case 53: / / Casket
case 54: / / Rogue Dead
case 55: / / Rogue Dead
case 56: / / Rogue Dead
case 57: / / Rogue Dead
case 58: / / Rogue Dead
case 79: / / Casket
case 84:
case 85:
case 87: / / Chest
case 88: / / Chest
case 89:
case 94: / / Large Urn
case 95: / / Large Urn
case 96:
case 104:
case 105: / / Armor Stand
case 106: / / Weapon Rack
case 107: / / Weapon Rack
case 109:
case 111:
case 113:
case 115:
case 118:
case 120:
case 139: / / Chest
case 140: / / Chest
case 141: / / Chest
case 141:
case 142: / / Jug
case 143: / / Jug
case 144: / / Chest
case 146: / / Chest
case 147: / / Chest
case 148: / / Chest
case 154: / / Corpse
case 155: / / Hidden Stash
case 158:
case 164:
case 166:
case 167:
case 168:
case 170:
case 171: / / Skeleton
case 173:
case 174: / / Loose rock
case 175: / / Loose Boulder
case 176:
case 177:
case 178: / / Guard Corpse
case 181: / / Chest
case 182:
case 183: / / Chest
case 185: / / stash
case 186: / / stash
case 198:
case 203: / / stash
case 204: / / stash
case 205: / / stash
case 208: / / Basket
case 209: / / Basket
case 223:
case 224:
case 225: / / Skullpile
case 239: / / Body
case 240: / / Chest
case 241: / / Chest
case 242: / / Chest
case 243:
case 244: / / Rat's Nest
case 247: / / Bed
case 266: / / Goo Pile
case 270: / / Corpse
case 271: / / Corpse
case 329: / / Chest
case 330: / / Chest
case 331:
case 332: / / Chest
case 333:
case 334:
case 335:
case 336:
case 360:
case 362:
case 363:
case 365:
case 371:
case 372:
case 389:
case 390:
case 391:
case 397: / / (Super) Chest
case 405: / / (Super) Chest
case 413:
case 416:
case 418: / / barrel
case 419: / / barrel
case 420: / / Wooden Chest
case 424: / / Burial Chest
case 425:
case 430: / / Chest
case 431:
case 432:
case 433:
case 443: / / Jar
case 444: / / Jar
case 445: / / Jar
case 455:
case 463:
/ / Case 466: / / Evil Urn
case 467:
case 468:
case 469:
case 470:
case 471:
case 477: / / Dead Barbarian
case 501:
case 502:
case 504:
case 505:
case 548:
case 549:
case 550:
case 551:
return true;
break;
default:
return false;
break;
}
}
* /
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))
{
/ / Print ("ÿc1Close Monster detected:" + _checkMonster.name);
_monstersClose = true;
break;
}
} While (_checkMonster.GetNext ());
}
return _monstersClose;
}
/ *
function NTA_AreaCheckChests (areaid)
{
var exeptionsArray = new Array ();
exeptionsArray.push (25); / / Tower Cellar Level 5
for (var i = 0; i <exeptionsArray.length; i + +)
{
if (areaid == exeptionsArray [i])
return false;
}
return true;
}
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)))
if(NTConfig_UsePotionFInd && me.classid == NTC_CHAR_CLASS_BARBARIAN && _attackcount > 2)
{
if(!NTA_CheckForCloseMonsters(10))
{
//Print("ÿc<No Monsters close - looting");
NTA_FindItem(NTConfig_FindItemRange);
}
}
break;
}
else
{
if(!NTH_WalkTo(_path[i][0], _path[i][1], force))
if(NTConfig_UsePotionFInd && me.classid == NTC_CHAR_CLASS_BARBARIAN && _attackcount > 2)
{
if(!NTA_CheckForCloseMonsters(10))
{
//Print("ÿc<No Monsters close - looting");
NTA_FindItem(NTConfig_FindItemRange);
}
}
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);
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);
}
}
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;
}