..::lanara's Blog::..
Diablo 2 - Necromancer Guide
Tags diablo 2, guide, guides, necro, necromancer
..::lanara's Blog::..
Heute möchte ich euch einen 'kleinen' Necromancer Guide vorstellen, mit dem Schwerpunkt auf PvE. Vielleicht kann ich ja damit den ein oder anderen überzeugen mal eine Klasse auszuprobieren die nicht ganz so beliebt ist, aber dennoch sehr stark ist. Die Rede ist vom Summoner.
Vielen ist dieser Char zu langweilig, weil sie ihn einfach falsch spielen. Wer denkt, dass der Summoner einfach herumsteht, während er wartet bis die Skelette alles getötet haben, der wird überrascht sein, was man aus dem Char noch herausholen kann. Dieser Spec ist vor allem für Anfänger geeignet, da er auch mit schlechtem Equipment sehr stark und extrem sicher zu spielen ist.
In Stärke stecken wir genau soviele Punkte, um unser gesamtes Equip tragen zu können. Mit einer Enigma die wenig Stärke benötigt kann in der Regel komplett darauf verzichtet werden hier Punkte zu setzen.
Da wir kaum Stärke brauchen, können wir es uns locker leisten auf Maxblock zu gehen, da Homunkulus sowieso mit 72% Blockchance wie dafür geschaffen ist. Also stecken wir hier genau soviele Punkte rein, um auf Maxblock zu kommen, je nach Level sind das so um die 200 Dex inklusive Items.
Den Rest der verbliebenen Statpunkte spenden wir komplett in Vitalität. Pro investiertem Punkt bekommt der Necromancer 2 Lebenspunkte hinzu.
Denkt nichtmal daran hier Punkte zu verschwenden, es lohnt sich einfach nicht. Man bekommt pro Punkt in Energy 2 Manapunkte, wer wirklich Manaprobleme hat der sollte das eher mit dem Equipment ausgleichen, z.B. mit SoJ und/oder Frostburn. Mehr dazu beim Equipment.
Einzig beim leveln nach einem Ladderreset könnte man darüber nachdenken hier ein paar Punkte reinzustecken, aber selbst da ist es sinnvoller dem Merc ein billiges Insight zu bauen.
Kommen wir nun zum wohl wichtigsten Teil, der Skillung. Das Grundgerüst dieses Builds benötigt nur 68 Punkte, daher bleibt noch genug Spielraum den Char nach seinen Wünschen anzupassen. Ich persönlich bevorzuge nacht intensivem testen aller möglichen Specs die Safety Variante, weil sie vor allem beim botten den Char noch sicherer macht, falls er doch mal auf irgendeine Monsterhorde ported.
Diese Fähigkeiten bilden das Grundgerüst des Summoners, sie sollten unbedingt wie angegeben geskillt werden, um die maximale Effektivität zu erreichen.
Summoning Spells:
Raise Skeleton / Skelett beleben
20 Punkte - Das ist unser Summoning Skill, also definitiv maxen. Mit Amplify Damage machen sie sogar im Endgame noch guten Schaden. Dazu sind sie ein prima Meatshield und mit BO quasi unsterblich, obwohl sie laut Anzeige garnicht so viel TP haben.
Skeleton Mastery / Skelett-Beherrschung
20 Punkte - Gibt unseren Summons mehr Leben und Schaden, also auch maxen.
Clay Golem / Ton Golem
1 Punkt - Zum einen Prereq für Monster-Widerstand, als auch ein zuverlässiger Summon, der zwar kaum Schaden macht, aber dafür selbst mit nur einem Punkt extrem viel TP auf Hölle hat und dazu noch Gegner stark verlangsamt.
Golem Mastery / Golem-Beherrschung
1 Punkt - Prereq für Monster-Widerstand und gibt unserem Golem noch einen kleinen Bonus.
Summon Resist / Monster-Widerstand
1-5 Punkte - Erhöht die Resistenzen unserer Summons, dazu sei angemerkt, dass Summons nicht von der Resipenalty in NM+Hell betroffen sind, sie haben also unabhängig vom Schwierigkeitsgrad immer die gleichen Resis. Ein Punkt reicht mit Endequip locker aus, beim leveln kann man aber darüber nachdenken ein paar Punkte zu investieren, wenn man noch nicht genug +Skill Items hat.
Poison and Bone Spells:Teeth / Zähne
1 Punkt - Prereq für Corpse Explosion.
Corpse Explosion / Kadaverexplosion
20 Punkte - Der wohl wichtigste Skill des gesamten Builds und einer der stärksten im Gesamten Spiel. Mit jedem Punkt steigt der Radius um 0.33 yards, der Schaden bleibt konstant bei 70-120% des Monsterlebens das für den Spell genutzt wurde. CE macht zu 50% Feuer und 50% Physischen Schaden. Da man dank Amplify Damage die Phyischen Resistenzen der Monster um 100% senken kann, ist es wohl klar, dass man vor der Nutzung immer fleißig cursed.
Curses:
Amplify Damage / Verstärkter Schaden
1-5 Punkte - Das ist unser Hauptfluch, den wir außer gegen Bosse immer einsetzen. Er senkt die Physischen Resistenzen der Monster um 100% und verstärkt dadurch den Schaden den wir mit Corpse Explosion machen enorm. Mit genug +Skill Items reicht ein Punkt hier locker aus, damit der Radius groß genug ist um den ganzen Screen auf einmal zu verfluchen. Wenn man gerade levelt oder noch nicht soviele +Skill Items hat, kann man aber auch ruhig ein paar Punkte investieren, um einen größeren Radius zu bekommen.
, Weaken, Terror / Schwächen, Terror
1 Skill - Prereq für Decrepify.
Decrepify / Altern
1 Punkt - Das ist unser Hauptfluch gegen Bosse, er senkt die Resistenzen um 50% und verlangsamt sie stark. Dank diesem Fluch sind Diablo und Baal ein Kinderspiel, da sie sich kaum noch wehren.
Bei dieser Variante werden die restlichen Punkte in Bone Armor und die dazugehörigen Synergien gesteckt. Dadurch kommt man in etwa auf 800 Punkte Absorb, die einen zusätzlichen Schutz gegen Meleeangriffe bieten, falls doch mal ein Monster durchkommt, oder man in eine Monstergruppe ported die einen selbst statt die Summons angreifen.
Meiner Meinung nach ist das der sinnvollste Verbleib für die restlichen Punkte, da man bereits genug Summons hat und CE auch vollkommen ausreicht was den Schaden anbelangt.
Poison and Bone Spells:
Bone Armor / Knochen-Rüstung
1 Punkt: Dieser Skill ist zwar der Kern dieses Unterbuilds, allerdings bringt ein Punkt darin nur 10 Absorb, während ein Punkt in die Synergien 15 Absorb gibt. Daher belassen wir es bei einem Punkt und investieren die restlichen Skillpunkte lieber in Bone Wall und Bone Prison.
, Bone Wall, Bone Prison / Knochenwand, Knochengefängnis
20 Punkte - Beide Skills geben gleichviel Absorb zu Bone Shield, daher ist es eigentlich egal in welcher Reihenfolge man sie skillt, allerdings benötigt man für Bone Prison noch Bone Spear als Prereq.
Bei diesem Subspec wird mehr Wert auf den Summoning Tree gelegt, dadurch hat man neben den Skeleton Mages auch noch Revives und wahlweise einen stärkeren Golem.
Summoning Spells:
Raise Skeletal Mage / Skelettmagier beleben
20 Punkte - Die Mages bringen uns etwas mehr magischen Schaden, allerdings ist er nicht gerade berauschend. Hinzu kommt, dass Cold Mages ab und an Leichen zum platzen bringen, die man dann nichtmehr für CE nutzen kann. Nützlich wenn ab und an mal ein Mob Fire+Phys immun ist.
Revive / Wiederbeleben
1 Punkt - Auf den ersten Blick wirkt dieser Spell sehr stark, allerdings sind die meissten Monster die man wiederbelebt sehr schwach. Dazu kommt, dass größere Monster die Kollisionskontrolle nach dem Teleportieren triggern und sich dann kein Summon/Revive/Merc mehr vom Fleck bewegt, bis der Necro einen Schritt zur Seite macht, was extrem nervig sein kann. Außerdem sind mehr Monster nicht unbedingt besser, zwar blocken sie andere Monster die so nicht zum Necro durchkommen, aber sie blocken auch viel zu oft den Merc, wodurch es länger dauert bis etwas stirbt. Wie auch immer, ein Punkt hier ist sicherlich nicht verschwendet, mehr aber auf keinen Fall, da +Skills völlig ausreichen um genug Monster wiederbeleben zu können.
Iron Golem / Eisen Golem
1 Punkt - Mit diesem Spec kann man auch gut den Iron Golem skillen und aus ihm eine weitere Aura generieren. Wenn man den Golem zum Beispiel aus einem Insight macht, das ja nicht gerade teuer ist, dann erhält der Golem die Meditationsaura davon. Die restlichen Punkte sollte man dann in Golem Mastery stecken, damit der Iron Golem mehr TP bekommt.
Golem Mastery / Golem-Beherrschung
20 Punkte - Das wichtigste daran ist, dass er das Leben des Iron Golems erhöht, dadurch sollte eben jener eigentlich nicht mehr sterben. Zusätzlich bekommt er noch mehr Attack Bonus und etwas mehr Run/Walkspeed.
Beim Boner werden die restlichen Skills in Bone Spear und Bone Wall/Prison gesteckt. Allerdings sollte man sich bewusst sein, dass der Schaden den man macht nicht vergleichbar mit einem richtigen Bone Necro ist. Bei Bots besteht außerdem noch die Gefahr, dass der Necro ewig versucht mit Bone Spear etwas zu töten, statt einfach Corpse Explosion zu nutzen. Man könnte auch Bone Spirit skillen, allerdings halte ich davon nichts, da er weniger Schaden als Bone Spear macht und dazu noch ein Single Target Angriff ist. Bone Wall/Prison gibt zudem noch etwas bonus auf Bone Shield.
Summoning Spells:
Bone Spear / Knochenspeer
20 Punkte - Bietet einen alternativen Angriff zu CE, und kann den Merc dabei unterstützen die erste Leiche zu bekommen. Außerdem nützlich gegen Bosse und immune Mobs, als zusätzliche Schadensquelle.
, Bone Wall, Bone Prison / Knochenwand, Knochengefängnis
20 Punkte - Sucht euch eien davon aus, als Synergie zu Bone Spear und Bone Shield.
Der Poison Necro setzt auf Poison Nova als zusätzlichen Schaden. Der Schaden der Nova ist allerdings nicht wirklich berauschend, daher dient sie auch eher als kleiner Damage Add und Angriff gegen immune Gegner.
Poison and Bone Spells:
Poison Nova / Gift-Nova
20 Punkte - Der Hauptskill, demzufolge maxen. Man sollte jedoch bedenken, dass Corpse Explosion der weitaus bessere Crowd Killer ist.
, Poison Dagger, Poison Explosion / Gift-Dolch, Gift-Explosion
20 Punkte - Hier kommen die restlichen Punkte rein, als Synergie zu Poison Nova. Die Skills selbst sind eigentlich nicht zu gebrauchen, Poison Explosion braucht wie Corpse Explosion eine Leiche und fällt daher aus, weil der Schaden einfach zu schwach ist. Poison Dagger macht ebenfalls nicht genug Schaden, um für irgendetwas gut zu sein.
Summoning Spells:
Blood Golem / Blut Golem
Kann ganz nützlich sein, weil er dem Necro ab und an Life leeched, vom Schaden her unterscheidet er sich allerdings nicht von den anderen, da die Golems generell kaum Schaden machen.
Fire Golem / Feuer Golem
Meiner Meinung nach der schlechteste von allen Golems, daher würde ich eher noch den Clay Golem nehmen, als diesen.
Curses:
Lower Resists / Widerstandsschwund
Dieser Fluch ist vor allem nützlich, wenn man viel mit Chars zusammenspielt die magischen Schaden machen, wie Sorcs oder Javas. Zum Solo spielen aber eher ungeeignet, zwar macht CE auch 50% Feuerschaden, aber Amplify Damage ist da effektiver, weil es mehr debuffed und dazu auch Merc+Skeletten etwas bringt.
Dim Vison / Schwache Sicht
Dieser Fluch schränkt die Sicht anderer Monster ein, wodurch sie erst angreifen wenn man direkt bei ihnen steht. Sehr nützlich ist das zum Beispiel gegen Souls, da man sie so recht einfach ausschalten kann.
Attract / Mittelpunkt
Ein weiterer nützlicher Skill der ein Monster verflucht, damit es von anderen Monstern angegriffen wird. Das kann vor allem nützlich sein, wenn man gegen eine Gruppe sehr starker Monster kämpft und man selbst noch kein so gutes Equipment hat.
Rüstung
Empfohlen: Enigma, da führt einfach kein Weg vorbei, Teleport ist unersetzlich. Auch die restlichen Stats sind perfekt. Am besten sockelt man es in eine Rüstung die wenig Stärke benötigt, z.B. Breastplate oder Mageplate.
Alternative: Zu Enigma gibt es eigentlich keine Alternative, aber wenn man sich noch keine Leisten kann, muss ja solang etwas anderes herhalten. Hier wären unter anderem denkbar:
- [Sol Um Um] - +2 Necro Skills, viel Mana, Resis und Bone Armor Proc
- - +1 Skill, Resis, Faster Cast Rate
- - +2 Summoning Skills, hohe Defense, Faster Run/Walk, ggf. andere Setboni
Helm
Empfohlen: Harlequin Crest aka Shako, das einzige was noch besser wäre, ist ein Rare Circlet mit sehr guten Stats. Vom Preis-/Leistungsverhältnis ist Harle unschlagbar.
Alternative:
- Rare Circlet - +2 Necro Skills, Str/Dex, Life/Mana, Resis
- - +1 Skill, Energie, Vitalität, FRW
- - +1 Necro Skills, Mana, Giftresi
- - Viel Mana, allerdings nur in Verbindungen mit anderen Set Items eine ernsthafte Alternative
Handschuhe
Empfohlen: Magefist gibt 20% FCR, 25%Manareg und +1 Fire Skill (gibt +1 auf Corpse Explosion, also sehr nett), ist außerdem recht leicht zu bekommen. Allerdings gibt es bei den Handschuhen auch gute Alternativen.
Alternative:
- - +2 Curses, 20%FCR, 30% Kälteresi und, vor allem für Poisoner sehr nett, +25% Giftschaden
- - Wer Manaprobleme hat, sollte sich diese Handschuhe für den ultimativen Manaboost holen.
- - Wer schon genug FCR hat und/oder FastMod nutzt, kann die Handschuhe auch für ein bisschen mehr MF+GF nutzen.
Schuhe
Empfohlen: Bei den Schuhen gibt es ebenfalls mehrere Kandidaten, ich habe mich bei meinem Necro für Waterwalk entschieden wegen gutem Dex- und Lifebonus, aber einen eindeutigen Gewinner gibt es hier nicht.
Alternative:
- - Stärke, Vitalität, hohe Giftresistenzen und kann Ätherisch sein dank Selfrepair
- - Stärke, Vitalität und bis zu 50% MF
- - +1-2 Skeleton Mastery, Stärke und Geschick
Gürtel
Empfohlen: Arachnid Mesh ist der einzige Gürtel mit +Skill, also ist er eigentlich optimal für uns, dazu kommen noch 20% FCR sowie 5% mehr Mana.
Alternative:
- - Sehr viel Vitalität, FHR, %Damage Reduce
- - Für die Leute die kein FCR mehr brauchen und stattdessen mehr MF/GF wollen
- - Viel Leben und Mana, Cannot be frozen und ggf. noch weitere Setboni
Amulett
Empfohlen: Mara's Kaleidoscope ist eigentlich das Standardamulett, einzig Rares oder Crafted Amulette stellen gute Alternativen dar.
Alternative:
- Rare, Crafted oder Unique Amulette mit +Skill und guten Adds wie Stärke, Resis, Life etc.
Ringe
Empfohlen: Entweder Stone of Jordan, oder Bul Kathos' Wedding Band, natürlich wegen den +1 Skill darauf. Da ich kein Mana mehr benötige, hab ich mich für 2x Bul Kathos' entschieden für mehr Leben.
Alternative:
- - +1 Skill, sehr viel Mana
- Rare Ringe - FCR, Str, Life, Resis oder andere gute Stats
- - Für die MF Freaks
Waffe
Empfohlen: Heart of the Oak ist eigentlich das beste was man bekommen kann, +3 Skills, viel FCR, 15% Mana, Dex und noch Resis obendrauf, was will man mehr?
Alternative:
- Magische, Rare oder Unique Necrostäbe mit möglichst vielen +Skills, an HotO kommt allerdings nichts ran
- [Ber Tir Um Mal Lum] - Level 9 Fanatismus Aura on Equip, dazu viel Stärke und etwas Crushing Blow, wenn man gegen Bosse selbst etwas nachhelfen will.
Schild
Empfohlen: Hier führt kein Weg an Homunculus vorbei, dieses Schild hat einfach alles was man braucht. Skills, Faster Blockrate, hohe Resis, viel Mana und dazu noch eine super Blockchance.
Alternative:
- - nur in Verbindung mit dem kompletten Set
2. Waffenslot
Empfohlen: + , logischerweise wegen BO.
Alternative: + für MF.
Inventar
Empfohlen:
- - +Skill, Stats/Resis, +%XP
- - +Skills, Stats, Resis
- Small Charms - Leben und fehlende Resistenzen
Alternative:
- - MF, GF und reduzierte Händlerpreise, schadet nicht
- Small Charms - Magic Find
- Grand Charms - Skiller werden für den Summoner eigentlich nicht benötigt
Der Merc ist für den Summoner extrem wichtig, da er nicht nur ein Auraspender ist, wie für andere Chars, sondern aktiv am Geschehen beteiligt ist. Mit dem richtigen Equip kommt ein guter Merc auf ~10.000 Schaden, dazu kommt noch, dass er nahezu immer auf Gegner schlägt die mit Amplify Damage verflucht sind, was den Schaden nochmal stark anhebt. Dadurch kann der Merc sehr einfach einzelne Gegner töten und uns somit die Leichen bringen, die wir für Corpse Explosion benötigen.
Stellt sich nun natürlich noch die Frage welchen Merc wir nehmen, wobei es da eigentlich keine zwei Meinungen gibt. Der Akt 2 Merc hat einfach die besten Vorraussetzungen, da er von Haus aus eine Aura mitbringt und auch die besten Waffen tragen kann, da können andere Mercs einfach nicht mithalten.
Nun müssen wir nurnoch wissen welche Aura es sein soll, am Anfang würde ich hier noch zu Prayer raten, weil die Aura dafür sorgt, dass die Skelette sich immer fleißig selbst heilen und nicht sterben. Wenn man aber erstmal genug +Skills hat gibt es nurnoch eine Wahl, den Might Merc, der sowohl seinen Schaden, als auch den unserer Skelette nochmal gut pushed.
Da wir jetzt also wissen, dass wir einen Akt2 Might Merc wollen, fehlt noch das passende Equipment für ihn:
Waffe
Empfohlen: Vom Preis-/Leistungsverhältnis gibt es hier nur eine Wahl, Obedience. Die Waffe hat eigentlich alles was unser Merc braucht, viel Crushing Blow gegen Bosse, sehr hoher Schaden, FHR, Enchant Proc, Stärke, Geschick etc. Dazu sind die Runen sehr einfach zu besorgen, Rohling sollte natürlich eine Ätherische Waffe sein, z.B. Thresher oder Cryptic Axe.
Alternative:
- [Ber Mal Ber Ist] - Die Conviction Aura macht die Monster gegen Corpse Explosion noch anfälliger und senkt zudem noch die Verteidigung. Dazu kommen wie bei Obedience 40% Crushing Blow, hoher Schaden und 35% Faster Run/Walk und Prevent Monsterheal
- [Ral Tir Tal Sol] - Eigentlich nur in frühen Charleveln eine Alternative, wenn man vor allem auf die Meditation Aura angewiesen ist. Der Schaden ist zwar ganz passabel, aber das Crushing Blow fehlt leider.
Rüstung
Empfohlen: Natürlich kommt hier nur Fortitude infrage, allein wegen den 300% Extraschaden, aber auch wegen den sonstigen Boni. Rohling ist eine Eth Bugged Armor mit 1000+ Defense
Alternative:
- - Stärke, Resis, Life, Cannot be frozen, am besten Eth+Upped
- [Shael Um Pul Lum] - Extrem hohe Verteidigung, daher am besten in eine Eth Bugged Armor bauen. Dazu noch viel FHR und ein paar Resis.
Helm
Empfohlen: Als Helm ist Andariel's Visage die beste Wahl, am besten gesockelt mit einem IAS+Fireresi Juwel und Ätherisch. Der Helm hat alles was man braucht, Lifeleech, Stärke, IAS, +Skills und eine gute Defense.
Alternative:
- - Viel Leech, Geschick, Leben, Fireresi und Extragold
- - Leech und %Damage Reduce
- - Sehr viel Crushing Blow, daher ist dieser Helm vor allem wenn man viele Bosse farmt eine ernsthafte Überlegung wert.
Am Anfang sollte man erstmal seine Skelette summonen, wenn der Char und Merc noch nicht so stark sind, macht man das am besten in Akt1, da die Mobs dort nicht so stark sind. Wenn man gutes Equip hat, kann man aber auch Pindle oder Eldritch/Shenk dafür nutzen und hat dabei direkt noch die Chance auf ein paar Items. Bei Pindle kann man zudem die Untoten die vor dem Tempel herumliegen summonen, bevor diese auferstehen. +Skills von Items oder Schreinen wirken nur zum Zeitpunkt des Summonens, dadurch kann man z.B. zum Beschwören der Skelette eine Waffe+Schild mit möglichst vielen +Skills anziehen und dannach auf MF Equip switchen, die Skelette bleiben trotzdem gleich stark.
Der Kampf gegen normale Monster läuft so ab, dass man in die Nähe einer Monstergruppe ported, Amplify Damage casted und zusieht, wie die Skelette und der Merc den ersten Mob töten. Sobald das geschafft ist, wird 1-2x Corpse Explosion gecastet, bis nichts mehr steht. Gegen Aktbosse oder besonders hartnäckige Unique Monster nehmen wir Decrepify statt Amplify Damage, damit werden sie zum Kinderspiel, da sie teilweise sogar in ihrer Hitrecovery gelocked werden und nichts mehr machen.
Dieser Char ist auch für Hardcore besonders geeignet, da er dank den vielen Skeletten gut geschützt ist und sich dadurch auch mit schlechtem Equip sicher spielen lässt. Ebenso ist es natürlich am Ladderanfang, der einzige Char der da noch besser ist, ist die Sorc dank Teleport. Aber kein anderer Char kann so viel MF Equip anziehen wie der Necro und dabei kaum an Killspeed verlieren.
Hier noch ein paar Wissenswerte Informationen bezüglich der Breakpoints für den Necro:
Faster Cast Rate
Faster Hit Recorvery
Frames 15 14 13 12 11 10 9 %FCR 0 9 18 30 48 75 125
Faster Block Rate
Frames 13 12 11 10 9 8 7 6 5 4 %FHR 0 5 10 16 26 39 56 86 152 377
Frames 11 10 9 8 7 6 5 4 3 %FBR 0 6 13 20 32 52 86 174 600
Wenn ihr Muddy's D2NT oder den Etalbot nutzt könnt ihr diesen Teil überspringen, denn mit den aktuellen Versionen sollte der Summoner auch ohne Änderungen funktionieren.
Wer den Sternenlooper D2NT nutzt, sollte sich meine NTAttack.ntj nehmen, bei der ich einige Änderungen für den Necro vorgenommen habe:
PHP 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 _holyCount = 0;
var _castCount = 0;
var _CurseState;
var _RevCount =0;
var _SpearCount =0;
function NTA_Initialize()
{
if(NTConfig_AttackSkill[1] == 0 || NTConfig_AttackSkill[3] == 0)
NTA_DetectAttackPattern();
for(var i = 0 ; i < 9 ; 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]);
if(me.areaid == 132)
_NTA_SkillRange[i] = 3;
else
switch(NTConfig_AttackSkill[i])
{
case 6: //Magic Arrow
case 7: //Fire Arrow
_NTA_SkillRange[i] = 15;
break;
case 10: //Jab
_NTA_SkillRange[i] = 3;
break;
case 11: //Cold Arrow
case 12: //Multiple Shot
case 16: //Exploding Arrow
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] = 15;
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 44: //Frost Nova
case 48: // Nova
_NTA_SkillRange[i] = 10;
break;
case 64: // Frozen Orb
_NTA_SkillRange[i] = 15;
break;
case 74: // Corpse Explosion
_NTA_SkillRange[i] = 10;
break;
case 97: //Smite
_NTA_SkillRange[i] = 3;
break;
case 101: //holy bolt
_NTA_SkillRange[i] = 3;
break;
case 106: //Zeal
case 112: //Blessed Hammer
_NTA_SkillRange[i] = 3;
break;
case 147:
_NTA_SkillRange[i] = 3;
break;
case 151: //Whirlwind
_NTA_SkillRange[i] = 8;
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] = 6;
break;
case 248: //Fury
_NTA_SkillRange[i] = 3;
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())
{
var _attackcount = 0;
while(_attackcount < 150 && NTA_IsValidMonster(_target))
{
if(NTA_Attack(_target, (_attackcount%30) == 0) < 2)
break;
_attackcount++;
}
}
return (_target.hp <= 0 || _target.mode == 0 || _target.mode == 12);
}
function ReviveDead()
{
var _breaker=0;
var _skiplist;
_target = NTC_FindUnit(NTC_UNIT_MONSTER);
_RevCount = _RevCount - 2;
do
{
_skiplist = new Array();
if(_target.mode == 12 && !_target.GetState(96))
{
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,_target.y))
{
_RevCount++;
_breaker++;
_skiplist.push(_target.gid);
}
else
{
_RevCount++;
_breaker++;
}
}
}
else
_skiplist.push(_target.gid);
}
}
if (_breaker >= 7 || _target == null || _RevCount >= 15)
{
break;
_breaker = 0;
}
}while(_target.GetNext());
}
function NTTMGR_TownManager2()
{
_NTTMGR_BuyTP = (NTTMGR_CheckScrolls(1) < 4);
_NTTMGR_DoHeal = NTT_CheckHeal();
_NTTMGR_DoRepair = NTT_CheckRepair(1);
_NTTMGR_RemoveCurse = NTTMGR_CheckCurse(NTConfig_CheckSelfSafe > 0x01 ? 0x7E : 0, NTConfig_CheckMercSafe > 0x01 ? 0x7E : 0);
NTC_PutSkill(115, NTC_HAND_RIGHT);
switch(me.act)
{
case 1:
if(_NTTMGR_DoHeal || _NTTMGR_RemoveCurse || _NTTMGR_BuyTP )
NTTMGR_VisitAkara();
if(_NTTMGR_DoRepair)
NTTMGR_VisitCharsi();
break;
case 2:
if(_NTTMGR_DoHeal || _NTTMGR_RemoveCurse || _NTTMGR_DoRepair)
NTTMGR_VisitFara();
if( _NTTMGR_BuyTP)
NTTMGR_VisitDrognan();
break;
case 3:
if(_NTTMGR_DoHeal || _NTTMGR_RemoveCurse || _NTTMGR_BuyTP)
NTTMGR_VisitOrmus();
if(_NTTMGR_DoRepair || _NTTMGR_BuyKey)
NTTMGR_VisitHratli();
break;
case 4:
if(_NTTMGR_DoHeal || _NTTMGR_RemoveCurse || _NTTMGR_BuyTP)
NTTMGR_VisitJamella(false);
if(_NTTMGR_DoRepair)
NTTMGR_VisitHalbu();
break;
case 5:
if(_NTTMGR_DoHeal || _NTTMGR_RemoveCurse || _NTTMGR_BuyTP)
NTTMGR_VisitMalah();
if(_NTTMGR_DoRepair)
NTTMGR_VisitLarzuk();
break;
}
}
function IsBroken()
{
var _weapon;
_weapon = me.GetItems();
if(_weapon)
{
for(var i = 0 ; i < _weapon.length ; i++)
{
if(_weapon[i].itemflag&0x100)
{
if(_weapon[i].itemloc == 4 || _weapon[i].itemloc == 5)
{
NTTMGR_VisitTown();
NTTMGR_TownManager2();
}
else
{
NTTMGR_VisitTown();
NTTMGR_TownManager2();
}
break;
}
}
}
}
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;
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)*30)
{
_mindistance = 100000;
_target = NTC_FindUnit(NTC_UNIT_MONSTER);
if(NTConfig_FastPick)
{
var _fastpickx = me.x;
var _fastpicky = me.y;
NTSI_PickItems();
NTM_MoveTo(me.areaid, _fastpickx, _fastpicky);
}
NTTMGR_TeleChick()
NTTMGR_TownChick()
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(5))
{
//Print("ÿc<No Monsters close - looting");
NTA_FindItem(NTConfig_FindItemRange);
}
}
if(me.classid == NTC_CHAR_CLASS_NECROMANCER && _RevCount <= 15)
{
if(_attackcount > 2)
ReviveDead();
}
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(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(NTConfig_OpenAllNearbyChests)
NTL_OpenNearbyChests();
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)
{
if(NTConfig_uniq)
{
var _room;
var _spectype = [0x0A];
var _skiplist;
var _attackcount = 0;
var _target;
var _distance, _mingid, _mindistance;
var _result;
}
else
{
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]))
{
NTTMGR_TeleChick()
NTTMGR_TownChick()
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 <= 15)
{
if(_attackcount > 2)
ReviveDead();
}
if(NTConfig_OpenChest)
{
_target = NTC_GetSpecialChest();
if(_target && _room.UnitInRoom(_target) && NTC_OpenChest(_target))
_attackcount++;
}
if(pickitem && _attackcount > 0)
NTSI_PickItems();
if(NTConfig_OpenAllNearbyChests)
NTL_OpenNearbyChests();
switch(safelevel)
{
case 1:
return NTTMGR_CheckSafe(0x00, NTConfig_CheckMercSafe&0x01);
case 2:
return NTTMGR_CheckSafe(NTConfig_CheckSelfSafe, NTConfig_CheckMercSafe);
}
return true;
}
function IsBroken()
{
var _weapon;
_weapon = me.GetItems();
if(_weapon)
{
for(var i = 0 ; i < _weapon.length ; i++)
{
if(_weapon[i].itemflag&0x100)
{
if(_weapon[i].itemloc == 4 || _weapon[i].itemloc == 5)
{
Print("ÿc8My weapon broke, going to town to repair it.")
NTTMGR_VisitTown();
NTTMGR_TownManager();
}
break;
}
}
}
}
function 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) < 15)
{
Print("ÿc8I'm low on "+ _weapon[i].name + ", going to town to buy more.")
NTTMGR_VisitTown();
NTTMGR_TownManager();
}
_haveAmmo = true;
break;
}
}
}
if(!_haveAmmo)
{
Print("ÿc8I have no ammo, going to town to buy some.")
NTC_PutSkill(NTConfig_AttackSkill[1], NTC_HAND_LEFT);
NTTMGR_VisitTown();
NTTMGR_TownManager();
}
}
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(_classid == 543 || _classid == 545)
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.GetState(53) || monster.GetState(96)) // Conversion, Revive
return false;
if(me.classid == NTC_CHAR_CLASS_AMAZON)
{
if(me.areaid == 131)
NTC_PingDelay(25);
if(me.GetSkill(12, true) > 1)
HaveArrows();
else
IsBroken();
}
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_MAGIC;
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;
}
// 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;
NTConfig_AttackSkill[8] = 35;
NTConfig_AttackSkill[9] = 35;
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;
NTConfig_AttackSkill[8] = 31;
NTConfig_AttackSkill[9] = 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;
NTConfig_AttackSkill[8] = 26;
NTConfig_AttackSkill[9] = 26;
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(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(me.GetSkill(12, true) < 1 && target.spectype == 9)
{
if(!NTA_AmazonCastSkillInt(7, target))
return 2;
return 3;
}
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(NTConfig_AttackSkill[8] > 0)
{
if(!NTA_AmazonCastSkillInt(8, 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);
}
//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] = 64;
NTConfig_AttackSkill[2] = 47;
NTConfig_AttackSkill[3] = 64;
NTConfig_AttackSkill[4] = 47;
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;
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 && 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 == "Baal" || target.name == "Diablo" || target.name == "Duriel" || target.name == "The Countess"))
{
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;
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(_castCount >= 3)
{
NTC_CastSkill(NTConfig_AttackSkill[3], _NTA_SkillHand[0], target)
_castCount = 0;
}
else
_castCount++;
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_NecromancerAttackPatternInt()
{
var _maxindex, _maxskill;
var _avgskilllevel = new Array();
_avgskilllevel[0] = me.GetSkill(84, 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[0] = 84;
NTConfig_AttackSkill[1] = 84;
NTConfig_AttackSkill[2] = 84;
NTConfig_AttackSkill[6] = 74;
break;
case 1:
NTConfig_AttackSkill[1] = 92;
NTConfig_AttackSkill[2] = 92;
NTConfig_AttackSkill[3] = 84;
NTConfig_AttackSkill[4] = 74;
NTConfig_AttackSkill[6] = 74;
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(me.GetSkill(87, true) > 1 && !target.GetState(GetCurseState()) && (target.name == "Baal" && target.name == "Diablo" && target.name == "Mephisto" && target.name == "Duriel"))
NTC_CastSkill(87, NTC_HAND_RIGHT, target)
else if(!target.GetState(GetCurseState()))
NTC_CastSkill(NTConfig_Curse, NTC_HAND_RIGHT, target)
if(target.name == "Lord De Seis")
_RevCount = _RevCount - 1;
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(_castCount >= 3)
{
NTC_CastSkill(NTConfig_AttackSkill[6], _NTA_SkillHand[0], target)
_castCount = 0;
}
else
_castCount++;
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];
}
}
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)
{
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)
{
var _castx, _casty;
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);
if(NTConfig_AttackSkill[index] == 101)
{
if(GetDistance(me, target) > 20 || !CheckCollision(me, target, 4))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, 10, 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[1], 0);
}
if(_holyCount < 1)
{
NTM_WalkTo(me.x-3,me.y);
_holyCount++;
}
else
{
NTM_WalkTo(me.x+3,me.y);
_holyCount--;
}
for(var i = 0; i < 5; i++)
NTC_CastSkill(101, NTC_HAND_LEFT, target);
return;
}
else if(target.name == "Stygian Doll")
{
_castx = target.x > me.x ? target.x+3 : target.x-3;
_casty = target.y > me.y ? target.y+3 : target.y-3;
NTM_MoveTo(target.areaid, _castx, _casty,0);
return NTC_CastSkill(101, NTC_HAND_LEFT, target);
}
else
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(target.name == "Baal" || target.name == "Diablo" || target.name == "Mephisto")
{
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(152, NTC_HAND_LEFT, target);
}
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);
}
return NTC_CastSkill(NTConfig_AttackSkill[index], NTC_HAND_LEFT, 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;
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()
{
var _maxindex, _maxskill;
var _avgskilllevel = new Array();
_avgskilllevel[0] = me.GetSkill(271, 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 Sentry + Fire Blast + Physical Hammer
NTConfig_AttackSkill[1] = 271;
NTConfig_AttackSkill[3] = 251;
NTConfig_AttackSkill[5] = 253;
break;
}
return (NTConfig_AttackSkill[1] && NTConfig_AttackSkill[3]);
}
function NTA_AssassinAttackInt(target, firstorder)
{
var _primaryindex;
if(NTTMGR_CheckCurse(NTConfig_CheckSelfSafe&0x04, NTConfig_CheckMercSafe&0x04))
{
if(!NTTMGR_VisitTown())
return 0;
}
if(firstorder && NTConfig_AttackSkill[0] > 0 && NTA_GetResistance(target, _NTA_SkillDamage[0]) < 100)
{
if(GetDistance(me, target) > _NTA_SkillRange[15] || !CheckCollision(me, target, 10))
{
var _pos = me.GetOptimalAttackPos(target.areaid, target.x, target.y, _NTA_SkillRange[0], 4);
if(_pos)
NTM_MoveTo(target.areaid, _pos[0], _pos[10], 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] == 271) && !CheckCollision(target.areaid, target.x, target.y, 1))
return 1;
if(!NTA_AssassinCastSkillInt(_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] == 271) && !CheckCollision(target.areaid, target.x, target.y, 1))
return 1;
if(!NTA_AssassinCastSkillInt(5, target))
return 2;
return 3;
}
return 1;
}
function NTA_AssassinCastSkillInt(index, target)
{
if(NTConfig_AttackSkill[index] == 271)
{
var _castx, _casty;
if(GetDistance(me, target) > _NTA_SkillRange[300] || !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[1], _pos[5], 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[1], _pos[5], 0);
}
return NTC_CastSkill(NTConfig_AttackSkill[index], _NTA_SkillHand[index], target);
}
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_FindItem(range)
{
var _corpse;
var _orgx;
var _orgy;
var _startTick;
var _reposition = false;
if(me.classid != NTC_CHAR_CLASS_BARBARIAN || NTC_GetSkillLevel(142) < 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(142, 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 151: // An evil force
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;
}
}
function NTTMGR_TownChick(simple)
{
var _LifeMax, _ManaMax;
_LifeMax = me.hpmax;
_ManaMax = me.mpmax;
if(NTConfig_TownChicken > 0)
{
if(parseInt(me.hp*100/_LifeMax) < NTConfig_TownChicken)
{
NTC_SendLogToOOG(NTC_LOG_COMMON, "ÿE00000TownChicken")
NTTMGR_VisitTown()
}
}
}
function NTTMGR_TeleChick(simple)
{
var _LifeMax, _ManaMax;
_LifeMax = me.hpmax;
_ManaMax = me.mpmax;
if(NTConfig_TeleChicken > 0)
{
if(parseInt(me.hp*100/_LifeMax) < NTConfig_TeleChicken)
{
NTC_SendLogToOOG(NTC_LOG_COMMON, "ÿE00000TeleChicken")
NTM_MoveTo(me.areaid, me.x+30, me.y+30);
NTC_Delay(4500);
NTM_MoveTo(me.areaid, me.x-30, me.y-30);
}
}
}
Positiv:
- Auch mit schlechtem Equip sehr sicher und daher ein sehr guter Char für Ladderanfang und/oder Hardcore.
- Es gibt fast keine Mobs die Fire+Phys immun sind und deren Immunity nicht durch Amplify Damage gebrochen wird.
- Viele Necrospezifische Items sind oft sehr billig zu bekommen.
- Hoher Schaden mit Corpse Explosion und Amplify Damage.
- Ist eine gute Ergänzung als CoFighter, dank Curses und Blocksummons.
- Lässt sich zur Not auch betrunken spielen, da Skelette immer nüchtern sind!
Negativ:
- Benötigt Enigma um teleportieren zu können.
- In vollen Games mit 8 Spielern ist er nicht so stark wie ein Hammerdin, bekommt aber trotzdem noch genug getötet, dauert halt nur etwas länger.
- Ungeeignet als Leader für Dia/Baalruns in Public Games, da er erst Skelette holen muss.
- Wenn man nur Bosse farmen will, gibt es bessere Chars. Der Necro entwickelt seine volle Kraft erst gegen mehrere Gegner.
So, das wars auch erstmal, vielleicht werde ich später noch das ein oder andere hinzueditieren, aber da ich den ganzen Guide an einem Stück geschrieben habe, bin ich nu auch erstmal kaputt. Über Verbesserungsvorschläge, Kritik oder Kommentare würde ich mich freuen, also immer her damit.
Total Comments 29
Comments
-
Huhu,
hab nen Tippfehler in deinem klasse Guide entdeckt
Quote:[...]Poison Nova braucht wie Corpse Explosion eine Leiche und fällt daher aus[...]
GrüßePosted 04/24/2011 at 00:03 by Aceridos -
Danke, Tippfehler beseitigt.
Posted 04/24/2011 at 10:02 by lanara -
Hi,
als passionierter Summoner-Spieler sind mir ein paar Details aufgefallen, die du noch ändern, anpassen oder einfügen könntest:
1. zweiter Waffenslot: als Schild nen eth Spirit-Monarch (spätestens ab lvl 80 tragbar bei Eni in Mage-Plate ohne Str zu statten)
2. Schilde: hier fehlt Boneflame (Knochenflamme) 3/30 mit ner "Um" gesockelt. Erste Wahl für Sumoner die nicht auf Maxblock gehen. Damit sind wir direkt bei
3. Maxblock: mMn eine Frage der Überzeugung. Meiner Erfahrung nach (lvl 97 hc Ut-Summoner) reichen 1 Punkt in Bone Armor und 10 Punkte in Bonewall aus um Maxblock witzlos zu machen, denn 1. erreicht so gut wie nie irgendein Monster den Necro, 2. trifft nichtmal 1 aus 5 Monstern den Necro bevor es tot ist oder der Char wegteleportiert (selbst wenn man zum Thron telt) und 3. selbst wenn (!) das Monster trifft UND die Bone Armor weg ist UND nicht nachgecastet wurde hat der Nec (dank CtA und Vita-only-build) noch knapp 5k Leben... Man könnte, wer auf Block nicht verzichten will/kann, auch mit 50% Block spielen, was ungefähr die Hälfte der zu stattenden Punkte einspart. Damit bleiben nur 5 Hassgegner übrig: Souls, Mages, Bogenschützen, Speerkatzen (wegen Minion-Bug) und Puppen (wegen verbuggter Explosion). Und da hilft
4. Dim Vision: Das ist ein Pflichtskill! Ohne Diskussion. Ein Summoner ohne DV ist in einer guten Baalparty (ohne Bot) so nützlich wie ein Klotz am Bein, weil er außer gegen Puppen und Souls nicht helfen kann (zwar führen Summons nicht, wie oft behauptet zu Lags, aber machen, verglichen mit den anderen Party-Membern, zu wenig dmg; und CE führt wegn der Animation uU zu Server-Crashes, siehe Meteor, Torch etc.). Damitzu
5. Life Tap: Grade für UT- und DC-Summoner sehr zu empfehlen, da er (speziell bei Uber-Meph) dem Söldner und den Minions den A***h retten kann, wenn es mal brenzlig wird. Terror sollte auch noch erwähnt werden, da er (grad im UT) ein unheimlich guter Fluch zur Crowd-Control ist, der die Minions der Bosse vom Nec vertreibt und zu den Skletten bringt.
6. Revives: Hier gehe ich in zweierlei Hinsicht nicht mit dir einig, denn erstens ist der Dmg ganz beachtlich (man sollte halt Urdars (wegen Smite) und Mondfürsten wiederbeleben) und zweitens WILL die Kollisionskonrolle getriggert werden. Warum? Weil beim Bosskill sich die Monster sonst blockieren. Um einen Boss zu killen teleportiert man schließlich direkt drauf, alle Minions bleiben (inkl. Golem und Söldner) auf einem Fleck und es treffen alle (!): Skelette, Revives, Golem und der Merc (das sollte bei er Spielweise übrigenserklärt weden: Altern fluchen, auf den Boss teleportieren, einen Schritt zur Seite gehen, AD fluchen --> der Boss ist tot).
Apropos Merc: ich würde hier anfangs zum Blessed Aim-Merc raten, da die Skellis dann deutlich besser treffen, Bosse (gerade Duriel und Diablo, die auf Norm für nen schwachen Summoner ja schon recht haarig sein können) deutlich schneller sterben und die Prayer-Aura echt nicht viel heilt auf niedrigem Level. Ab Alp natürlich Might-Merc, keine Frage.
Ansonsten nen toller Guide, gute Arbeit.
*Thumbs up*Posted 05/23/2011 at 15:19 by BotFreakMan -
Ich hätte noch ne Frage zum botten mit deinem build : wie kann ich dem nec denn beibringen einen Toni zu kreieren?
und gibts ne möglichkeit dass der nec bei bossen altern statt AD verwendet?
ansonsten bin ich scherst begeistert von meinem neu umgestalteten summoner =)Posted 09/01/2011 at 06:01 by Metal God -
Das ist je nachdem welchen Bot du nutzt mehr oder weniger einfach einzubinden. Wie ich dir im Sternenlooper(?) Thread bereits gesagt habe wird es das beste für dich sein, Muddy's D2NT zu nehmen. Dort kannst du den Golem in den Precasteinstellungen mit hinzufügen und er nutzt gegen starke Gegner automatisch Altern.
Posted 09/01/2011 at 13:03 by lanara -
iron-golem
hi
Hat schon mal jemand aus nem Beast nen Iron Golem generiert? verwendet? Ich meine, dann müsste der Nec abgehen wie Schmitz- Katze oder?
Klar, ist ja nich billig...aber geht das auch theoretisch?Posted 11/23/2011 at 01:29 by palados -
iron-golem
Quote:
Ok...ich habs mal gemacht...und siehe da...ist eine brutale Kampfmaschine geworden...sehr, sehr geil:-)))
Schnell, effizient dank corps und infinity auf machter-merc:-))
hoffe der golem rippt nicht so schnell:-)
schade, dass kein 200fcr cap vorhanden...Posted 11/23/2011 at 10:04 by palados -
Wäre mir persönlich ja zu teuer. :P Da zieh ich dem Necro selbst lieber Beast an. Aber kannst ja mal berichten wie der Iron Golem sich so schlägt. Bist du dann auf Golem Mastery gegangen für mehr Life?
Posted 11/25/2011 at 10:26 by lanara -
nice =D
sehr gut gelungen =)Posted 04/11/2012 at 15:08 by Deamonsface