Register for your free account! | Forgot your password?

You last visited: Today at 23:18

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[Release] Muddy's D2NT

Discussion on [Release] Muddy's D2NT within the Diablo 2 Programming forum part of the Diablo 2 category.

Reply
 
Old 01/07/2012, 17:06   #5191
 
elite*gold: 20
Join Date: Mar 2007
Posts: 840
Received Thanks: 452
Jo Leute,
erstmal ein riesiges Dankeschön an Muddy_Waters, dass er seine Version vom NTBot zur Verfügung stellt.
Nun habe ich eine Frage.

Pottet der Bot nicht wenn er als Rusher eingestellt ist (Entrypoint: MWRushEntry.ntj)?
bUTL9R is offline  
Old 01/07/2012, 20:05   #5192
 
elite*gold: 0
Join Date: Apr 2010
Posts: 51
Received Thanks: 0
wo stellt man ein das er bei public baalruns
bei w5 nicht town geht sondern da bleibt und monster killt ? =)
H!tman is offline  
Old 01/08/2012, 00:36   #5193
 
elite*gold: 0
Join Date: May 2009
Posts: 55
Received Thanks: 12
Hallo liebe Community,
erstmal gillt mein Dank natürlich "muddy", der uns diesen wunderbaren Bot zur Verfügung gestellt hat.Vor 2 Tagen habe ich dann mal wieder mein D2 ausgekramt und mir erstmal ne mf zauberin hochgezogen.Scheint auch super mit dem Bot zu funktionieren, hätte nur 2 Fragen bezüglich des Bots :
1.) Ich lasse den Bot bis jetzt mit der deutschen d2 version laufen, scheint aber pröchtig zu funktionieren, ist es also wirklich nötig, d2 auf english zu stellen (was ja kein prob. ist ?
2.) Der Bot schreibt , wenn er ein game aufmacht immer irgendetwas von d2nt.... in die Spielbeschreibung , was mich etwas stört, ebenso wie das ständige ingame schreiben wenn der bot läuft was er im moment macht (z.B Katakomben 55% tele balbalabla), lassen sich diese sachen irgendwie in der config abstellen ?!
Schonmal Danke im Vorraus und lg
DauerZocker123 is offline  
Old 01/08/2012, 01:39   #5194
 
elite*gold: 0
Join Date: May 2010
Posts: 212
Received Thanks: 40
Quote:
Originally Posted by ldevil View Post
So ich konnte mir das jetzt Mal anschauen (mit nem Level 23 Barb auf norm ).

Eni braucht man nicht zwingend, alle "MoveTo()" Befehle gehen auch ohne Eni - theoretisch - nur bleibt man halt die ganze Zeit irgendwo hängen. Ich weiss nicht, ob der D2NT einen Pfadalgorithmus für "Fussgänger" hat... falls ja dann lass ich mich gerne bei der folgenden Aussage korrigieren

Travincal geht ja ziemlich leicht zu Fuss auch ohne den Algorithmus, da steht wenig im Weg rum und wenn man aus dem WP Raum raus ist, sollte das auch klappen. Wenn man also direkt nach dem Precast erst einen Schritt raus macht geht's. (Hat zumindest bei mir geklappt)

Code:
	if(NTC_GetSkillLevel(MWS_TELEPORT) < 1)
	{
		if(!NTM_MoveTo(me.areaid, 5718 + _deltax, 1586 + _deltay))
		{
			NTC_SendMsgToScript("MWBotGame.ntj", NTM_MoveTo, 55, me.areaid, _waypoint.y + 3, _waypoint.x + 20);
			return;
		}
	}
Bei Meppel ist das meines Wissens nicht möglich, da (zumindest mir) kein Pfadfindungsalgorithmus für den D2NT bekannt ist, der den Fussweg berechnet. Und ohne so einen Algorithmus geht Meppel schlicht nicht.

Evtl. könntest du aber ja einfach noch ein offenes Gebiet suchen und das abfarmen nach Travi damit du auf 3+ Minuten Games kommst?

edit: Die Position muss natürlich relativ zum wp sein...
edit2: Ok auch so versucht er immer mal wohin zu laufen wo er gar nicht kann sogar wenn open chests und clear position aus is... kann man durch kurze max script laufzeit abhilfe schaffen, zumindest bleibt er dann nicht 5 min wo hängen ^^
Habe mir nun mal das Traviscript umgeschrieben für Fussgänger, habe das Original nicht kapiert
Aber mit Folgendem läuft mein Barb in Classic, hell.
Habe nur Schreine und Kisten in der charconfig noch deaktiviert.
Aso, ich benutze Muddys 1.13.
Code:
/**
*	This file was modified by 
*	Check the programming section for updates and further scripts
*	Last Update: 02/05/2011
	Modified for walkers, by fred9x9@elitepvpers, 01.07.2012
	Tested with barbar in Classic.
	My barb does not use shrines or chests.
*/

function NTMain()
{
	Include("libs/common/NTCommon.ntl");
	NTC_IncludeLibs();
	NTC_IncludeConfig("NTBot/char_configs");
	
	NT_LoadConfig();
	NTSI_LoadNIPFiles("NTBot/item_configs");

	MWC_Initialize();
	
	var _waypoint;
	var _deltax, _deltay;
	var _attackpos = [14, 1, 20, -25, 26, -25, 33, -25, 40, -25, 46, -25, 53, -25, 60, -25, 67, -25, 74, -30, 81, -30, 87, -30, 94, -37, 98, -44, 100, -51, 107, -58, 100, -57, 100, -44, 98, -44, 100, -51, 107, -58, 100, -57];
	
	if(!NTTM_CheckAct(me.act, true))
	{
		NTC_SendMsgToScript("MWBotGame.ntj", NTTM_CheckAct, 22, me.act, true);
		return;
	}
	
	NTTMGR_TownManager();

	if(!NTTM_TownMove("waypoint"))
	{
		NTC_SendMsgToScript("MWBotGame.ntj", NTTM_TownMove, 30, "waypoint");
		return;
	}

	if(!NTM_TakeWaypoint(83))
	{
		NTC_SendMsgToScript("MWBotGame.ntj", NTM_TakeWaypoint, 36, 83);
		return;
	}

	_waypoint = NTC_FindUnit(NTC_UNIT_OBJECT, GetLocaleString(22526), 5);

	if(!_waypoint)
	{
		NTC_SendMsgToScript("MWBotGame.ntj", NTC_FindUnit, 44, NTC_UNIT_OBJECT, GetLocaleString(22526), 5);
		return;
	}

	_deltax = _waypoint.x - 5699;
	_deltay = _waypoint.y - 1584;
	
	NTP_DoPrecast(true);
	
		
	for(var i = 0; i < _attackpos.length; i += 2)
	{
		NTM_MoveTo(me.areaid, _attackpos[i] + _waypoint.x, _attackpos[i + 1] + _waypoint.y);
		NTA_ClearPosition(15, true, 2);
		MWL_FindItem();
	}
	
	NTM_MoveTo(me.areaid, _waypoint.x + 98, _waypoint.y - 87, 3, true);
	NTA_ClearPosition(35, true, 2);
	
	MWL_FindItem();

	NTC_SendMsgToScript("MWBotGame.ntj", "SCRIPT_END");
}
Quote:
Originally Posted by prrovoss View Post
so leute, vllt könnt ihr mri ja helfen
ich hab eine amazone und die soll baalruns machen. allerdings ohne eni. dh durchrennen und alles killen was im weg steht^^
aber genau das macht sie leider nicht. die config sieht so aus:
Code:
MWConfig_Script.push(["NTBaal.ntj", 10]); NTConfig_KillBaal = false; MWConfig_SkipBaalOnDolls = true; MWConfig_SkipBaalOnSouls = false; MWConfig_DoBaalPreAttack = true; MWConfig_ClearPathSpectypes.Baal = 0x02|0x04|0x08|0x10;
ich habe auch schon viele verschiedene spectypes probiert wie 0x01 usw. bringt aber alles nichts, sie läuft einfach stumpf an den mobs vorbei und lässt sich so ziemlich schnell killen^^

die attack configs sind alle standard mit geladener schlag und blitzendes unheil.
Nach heutigem Stand dieses Bots, kommt die Ama ohne Eni oder Tp, nie zu Baal.
Der Weg ist einfach nicht beschreibbar. Wir können nur hoffen, dass Muddy mit seiner neuen Hausarbeit da etwas erreichen kann. Der neue Bot soll ja einiges mehr drauf haben.

Quote:
Originally Posted by DauerZocker123 View Post
Hallo liebe Community,
erstmal gillt mein Dank natürlich "muddy", der uns diesen wunderbaren Bot zur Verfügung gestellt hat.Vor 2 Tagen habe ich dann mal wieder mein D2 ausgekramt und mir erstmal ne mf zauberin hochgezogen.Scheint auch super mit dem Bot zu funktionieren, hätte nur 2 Fragen bezüglich des Bots :
1.) Ich lasse den Bot bis jetzt mit der deutschen d2 version laufen, scheint aber pröchtig zu funktionieren, ist es also wirklich nötig, d2 auf english zu stellen (was ja kein prob. ist ?
2.) Der Bot schreibt , wenn er ein game aufmacht immer irgendetwas von d2nt.... in die Spielbeschreibung , was mich etwas stört, ebenso wie das ständige ingame schreiben wenn der bot läuft was er im moment macht (z.B Katakomben 55% tele balbalabla), lassen sich diese sachen irgendwie in der config abstellen ?!
Schonmal Danke im Vorraus und lg
Zu1. Du kannst davon ausgehen, dass dein Bot irgendwann mal ein game nach dem anderen aufmacht und wieder schliesst, bzw. freezed, wenn du nicht auf engl. umstellst(.txt, use datei). Er kapiert ein picked item nicht und schmiert ab.
Zu 2. Wg. ingame writing schau mal in der GlobalCharConfig nach "overheadstatus" und schalte den ab.Um die zusätzliche Kopfleiste habe ich mich noch nicht bemüht, also. k. A.
fred9x9 is offline  
Thanks
2 Users
Old 01/08/2012, 05:49   #5195
 
prrovoss's Avatar
 
elite*gold: 0
Join Date: Jul 2010
Posts: 213
Received Thanks: 36
Quote:
Originally Posted by fred9x9 View Post
Nach heutigem Stand dieses Bots, kommt die Ama ohne Eni oder Tp, nie zu Baal.
Der Weg ist einfach nicht beschreibbar. Wir können nur hoffen, dass Muddy mit seiner neuen Hausarbeit da etwas erreichen kann. Der neue Bot soll ja einiges mehr drauf haben.
stimmt, hab ihr jetzt ne eni angezogen und läuft einwandfrei. sieht mit 0 fcr zwar sehr träge aus aber läuft

btw
müsste man den jetzigen pathalgorithmus nicht nur ein wenig anpassen damit er auch zu fuß funktioniert? die ama ist jedenfalls ohne eni auch öfters bis lvl 3 gekommen im turm. man muss nur irgendwie die hindernisse mit einberechnen
prrovoss is offline  
Old 01/08/2012, 09:53   #5196
 
fghtrt's Avatar
 
elite*gold: 0
Join Date: Jul 2010
Posts: 197
Received Thanks: 127
Quote:
Originally Posted by bUTL9R View Post
Pottet der Bot nicht wenn er als Rusher eingestellt ist (Entrypoint: MWRushEntry.ntj)?
Ich hab noch nie darauf geachtet, aber da mir noch nie n Rusher gestorben ist gehe ich mal davon aus daß er sich auch mal nen drink genehmigt. Wobei aber definitiv nix gepottet wird, ist beim Waypoint-Catcher.

Quote:
Originally Posted by H!tman View Post
wo stellt man ein das er bei public baalruns
bei w5 nicht town geht sondern da bleibt und monster killt ? =)
Was macht der Char denn in der Stadt? Ich tippe ganz stark auf Fluch heilen oder sowas. Das müßtest du in der Charconfig einstellen, z.B. so:
Code:
// Check self safe in field (NOT in town). Set to 0 if you won't.
	// 0x01 : Potion
	// 0x02 : Poison
	// 0x04 : Amplify Damage
	// 0x08 : Weaken
	// 0x10 : Iron Maiden
	// 0x20 : Decrepify
	// 0x40 : Lower Resist
	NTConfig_CheckSelfSafe = 0;
	
	// Check merc's safe in field (NOT in town). Set to 0 if you won't.
	// 0x01 : Death
	// 0x02 : Poison
	// 0x04 : Amplify Damage
	// 0x08 : Weaken
	// 0x10 : Iron Maiden
	// 0x20 : Decrepify
	// 0x40 : Lower Resist
	NTConfig_CheckMercSafe = 0x01;
Bei dieser Einstellung geht der Char nur zum Wiederbeleben des Mercs in die Stadt.

Quote:
Originally Posted by prrovoss View Post
müsste man den jetzigen pathalgorithmus nicht nur ein wenig anpassen damit er auch zu fuß funktioniert?
Gerade das "ein wenig" ist wohl ganz und gar nicht so einfach. Ich glaube ich habe irgendwo mal gelesen daß das sogar im D2NT-Core hardcodet ist, und der ist closed source.

u.A. die recht schlechte Wayfind-Routine vom D2NT ist ein Grund, daß Muddy jetzt an D2BS arbeitet.
fghtrt is offline  
Thanks
1 User
Old 01/08/2012, 12:09   #5197
 
elite*gold: 0
Join Date: Oct 2008
Posts: 25
Received Thanks: 2
Moin Männer,

also ich hab das mal mit der "MaxQuantity" bei mir probiert, aber irgendwie will das nicht klappen. Hier mal ein Auszug

PHP Code:
// ##### Keys ##########################
[MaxQuantity] == && [Name] == KeyOfTerror
[MaxQuantity] == && [Name] == KeyOfHate
[Name] == KeyOfDestruction 
Demnach sollte er ja nur 3 Terror und Hate Keys mitnehmen, aber er nimmt einfach alle mit, die ihm vor die Füße fallen. Liegt das am Automule? Das er nur 3 Keys in der Stash hat? Denn die Keys sind ja nach dem Automule nicht mehr in der Stash; logisch.
absh00ter is offline  
Old 01/08/2012, 13:54   #5198
 
fghtrt's Avatar
 
elite*gold: 0
Join Date: Jul 2010
Posts: 197
Received Thanks: 127
Quote:
Originally Posted by absh00ter View Post
Demnach sollte er ja nur 3 Terror und Hate Keys mitnehmen, aber er nimmt einfach alle mit, die ihm vor die Füße fallen. Liegt das am Automule? Das er nur 3 Keys in der Stash hat? Denn die Keys sind ja nach dem Automule nicht mehr in der Stash; logisch.
Richtig, liegt am Automule. Das Maxquantity bezieht sich auf den jeweiligen Char. Wenn er die eingestellte Anzahl gesammelt hat hört er auf aufzuheben, wenn es weggemult wird ist die Anzahl im Inventar niedriger als die maxquantity = es wird wieder gelootet.

Ich hab es zwar noch nicht ausprobiert, aber eigentlich müßte sich durch Aufnahme der 3 Keysorten in die ...\Muddy's D2NT\scripts\NTBot\item_configs\mule\dont_mule.nip verhindern lassen daß die Dinger den Char verlassen. Somit ersäufen deine Mules nicht mehr in den Keys, du mußt sie aber dann von Hand wegmulen.
fghtrt is offline  
Thanks
1 User
Old 01/08/2012, 14:10   #5199
 
elite*gold: 0
Join Date: Nov 2009
Posts: 4
Received Thanks: 1
hi hab ein problem mit dem bot und zwar entweder benutzt er kein bo oder er benutzt bo aber wechselt dann vom cta nicht mehr weg hab schon alles versucht kann mir da bitte wer helfen?
teleria is offline  
Thanks
1 User
Old 01/08/2012, 14:40   #5200
 
fghtrt's Avatar
 
elite*gold: 0
Join Date: Jul 2010
Posts: 197
Received Thanks: 127
Quote:
Originally Posted by teleria View Post
hi hab ein problem mit dem bot und zwar entweder benutzt er kein bo oder er benutzt bo aber wechselt dann vom cta nicht mehr weg hab schon alles versucht kann mir da bitte wer helfen?
Jetzt wäre Interessant was genau das "alles" ist was du schon probiert hast. War mit dabei? bzw. das Einzige? Falls ja, probier mal das CtA in den anderen Waffenslot zu legen. Das sollte zwar nach der Lösung von TheCrazy11 eigentlich nicht nötig sein, aber man weiß ja nie....

Sollte BO gecastet werden, der Char danach den Waffenslot aber nicht mehr wechseln (so ganz geht das aus deinem Post nicht hervor) kontrolliere bitte deine Charconfig nach:
Code:
// Set this to true if you would like to switch slots right after casting BC, BO and Shout. If set to false, your char will remain with the BO Slot until the whole precast procedure is done.
	MWConfig_SwitchSlotsAfterBoPrecast = true;
	
	// Set this to true to force your bot to swap slots before precast. In case you are using CTA, set this to false.
	MWConfig_SwitchSlotsForPrecast = false;
Bitte beachte daß der untere Eintrag tatsächlich auf false steht.
fghtrt is offline  
Thanks
3 Users
Old 01/08/2012, 14:52   #5201
 
elite*gold: 0
Join Date: Nov 2009
Posts: 4
Received Thanks: 1
ja das hab ich auch schon versucht&waffenslot wechsel auch aber ka iwie macht er kein bo

kann mir einer vllt mal seinen bot schicken?
teleria is offline  
Old 01/08/2012, 15:12   #5202
 
elite*gold: 0
Join Date: May 2010
Posts: 212
Received Thanks: 40
Quote:
Originally Posted by H!tman View Post
wo stellt man ein das er bei public baalruns
bei w5 nicht town geht sondern da bleibt und monster killt ? =)
Von alleine geht er m. E. nicht in die Stadt, er sollte einen Grund haben. Davon gibt es viele.
Inventar voll?
Getränke leer?
Verzaubert?
Merc?
Rep ?
usw.
fred9x9 is offline  
Old 01/08/2012, 18:53   #5203
 
elite*gold: 0
Join Date: May 2009
Posts: 55
Received Thanks: 12
Hallo,
seid heute mittag , meldet der bot sich nachdem er ein game aufgemacht hat, mit einem "syntaxfehler" in der datei itemparser.nip .
auszug der der fehlereie:

if(_NTIP_CheckList[i][0].indexOf("maxquantity") == -1)

da soll angeblich was nicht stimmen, weis wer weiter ?
lg
DauerZocker123 is offline  
Old 01/08/2012, 19:03   #5204
 
fghtrt's Avatar
 
elite*gold: 0
Join Date: Jul 2010
Posts: 197
Received Thanks: 127
Quote:
Originally Posted by teleria View Post
kann mir einer vllt mal seinen bot schicken?
Das ganz sicher nicht, da müßte man viel zuviele persönliche Einstellungen entfernen + das würde dir eh nicht viel nützen. Nja, ich steh zwar an sich mehr auf "Hilfe zur Selbsthilfe", aber *seufz* hier mal die komplette, bereits editierte, verdächtige Datei. Leg dir eine Kopie der ...\Muddy's D2NT\scripts\libs\Common\NTCommon.ntl an und ersetze dann den Inhalt der orignialen hiermit:
Code:
/**
*	This file was modified by 			
*	Check the programming section for updates and further scripts
*	Last Update: 18:00 04.09.2011
*/

Include("libs/common/MWSkills.ntl");

var DEBUG_MASKS = new Array();
DEBUG_MASKS.Common			= 0x000100;
DEBUG_MASKS.Itemlogger		= 0x000200;
DEBUG_MASKS.Loot			= 0x000400;	
DEBUG_MASKS.UserCommands	= 0x000800;
DEBUG_MASKS.Cubing			= 0x001000;
DEBUG_MASKS.ItemParser		= 0x002000;
DEBUG_MASKS.Move			= 0x004000;
DEBUG_MASKS.Precast			= 0x008000;
DEBUG_MASKS.SnagIt			= 0x010000;
DEBUG_MASKS.Town			= 0x020000;
DEBUG_MASKS.TownManager		= 0x040000;
DEBUG_MASKS.TownMove		= 0x080000;
DEBUG_MASKS.Attack			= 0x100000;

/*
	Bit - Function
	0x01: File output
	0x02: Console output
	0x08: Tons of details 
	0x04: Some details 
*/

const MWC_DEBUG_MODE = 0;

var MWC_BuyManaTriggered = false; // Status var to avoid infinite recursion

// Public D2BS constants
// Character Class
const NTC_CHAR_CLASS_AMAZON = 0;
const NTC_CHAR_CLASS_SORCERESS = 1;
const NTC_CHAR_CLASS_NECROMANCER = 2;
const NTC_CHAR_CLASS_PALADIN = 3;
const NTC_CHAR_CLASS_BARBARIAN = 4;
const NTC_CHAR_CLASS_DRUID = 5;
const NTC_CHAR_CLASS_ASSASSIN = 6;

// Act 1 NPCs
const NTC_NPC_ID_AKARA = 148;
const NTC_NPC_ID_WARRIV_ACT_1 = 155;
const NTC_NPC_ID_CHARSI = 154;
const NTC_NPC_ID_GHEED = 147;
const NTC_NPC_ID_KASHYA = 150;
const NTC_NPC_ID_CAIN_TRISTRAM = 146;
const NTC_NPC_ID_CAIN_ACT_1 = 265;

// Act 2 NPCs
const NTC_NPC_ID_FARA = 178;
const NTC_NPC_ID_LYSANDER = 202;
const NTC_NPC_ID_GREIZ = 198;
const NTC_NPC_ID_ELZIX = 199;
const NTC_NPC_ID_MESHIF_ACT_2 = 210;
const NTC_NPC_ID_DROGNAN = 177;
const NTC_NPC_ID_ATMA = 176;
const NTC_NPC_ID_WARRIV_ACT_2 = 175; 
const NTC_NPC_ID_CAIN_ACT_2 = 244;
const NTC_NPC_ID_JERHYN = 201;
const NTC_NPC_ID_TYRAEL_ACT_2 = 251;

// Act 3 NPCs
const NTC_NPC_ID_MESHIF_ACT_3 = 264;
const NTC_NPC_ID_CAIN_ACT_3 = 245;
const NTC_NPC_ID_ALKOR = 254;
const NTC_NPC_ID_ASHEARA = 252;
const NTC_NPC_ID_ORMUS = 255;
const NTC_NPC_ID_HRATLI = 253;

// Act 4 NPCs
const NTC_NPC_ID_CAIN_ACT_4 = 246;
const NTC_NPC_ID_HALBU = 257;
const NTC_NPC_ID_TYRAEL_ACT_4 = 367;
const NTC_NPC_ID_JAMELLA = 405;

// Act 5 NPCs
const NTC_NPC_ID_CAIN_ACT_5 = 520;
const NTC_NPC_ID_TYRAEL_ACT_5 = 521;
const NTC_NPC_ID_LARZUK = 511;
const NTC_NPC_ID_ANYA_FROZEN_RIVER = 527;
const NTC_NPC_ID_ANYA_TOWN = 512;
const NTC_NPC_ID_MALAH = 513;
const NTC_NPC_ID_QUALKEHK = 515;
const NTC_NPC_ID_NIHLATHAK_TOWN = 514;
const NTC_NPC_ID_NIHLATHAK_HALLS_OF_VAUGHT = 526;

// UNIT types
const NTC_UNIT_PLAYER = 0;
const NTC_UNIT_NPC = 1;
const NTC_UNIT_MERC = NTC_UNIT_NPC;
const NTC_UNIT_MONSTER = NTC_UNIT_NPC;
const NTC_UNIT_OBJECT = 2;
const NTC_UNIT_MISSILE = 3;
const NTC_UNIT_ITEM = 4;
const NTC_UNIT_TILE = 5;
const NTC_UNIT_STASH = 267;
const NTC_UNIT_CUBE = 549;

const NTC_AREA_ID_ACT_1 = 1;
const NTC_AREA_ID_ACT_2 = 40;
const NTC_AREA_ID_ACT_3 = 75;
const NTC_AREA_ID_ACT_4 = 103;
const NTC_AREA_ID_ACT_5 = 109;

// COLOR types
const NTC_COLOR_BASE_WHITE = 0;
const NTC_COLOR_BASE_RED = 1;
const NTC_COLOR_BASE_GREEN = 2;
const NTC_COLOR_BASE_BLUE = 3;
const NTC_COLOR_BASE_GOLD = 4;
const NTC_COLOR_BASE_GRAY = 5;
const NTC_COLOR_BASE_BLACK = 6;
const NTC_COLOR_BASE_GOLD2 = 7;
const NTC_COLOR_BASE_ORANGE = 8;
const NTC_COLOR_BASE_YELLOW = 9;

const NTC_HAND_RIGHT = 0;
const NTC_HAND_LEFT = 1;

const NTC_CLICK_LDOWN = 0;
const NTC_CLICK_LHOLD = 1;
const NTC_CLICK_LUP = 2;
const NTC_CLICK_RDOWN = 3;
const NTC_CLICK_RHOLD = 4;
const NTC_CLICK_RUP = 5;

const NTC_SHIFT_NONE = 0;
const NTC_SHIFT_HOLD = 1;

const NTC_LOG_COMMON = 0;
const NTC_LOG_ITEM = 1;

const NTC_DELAY_FRAME = 40;

const MWC_PARTY_ID_NONE = 65535;

// The party flags represent the status of the button in party screen
const MWC_PARTY_FLAG_INVITE = 0;
const MWC_PARTY_FLAG_NONE = 1;
const MWC_PARTY_FLAG_ACCEPT = 2;
const MWC_PARTY_FLAG_CANCEL = 4;

const MWC_LOC_INVENTORY = 0;
const MWC_LOC_TRADE_WINDOW = 2;
const MWC_LOC_CUBE = 3;
const MWC_LOC_STASH = 4;
const MWC_LOC_BELT = 5;

// Item locations (item.mode == 1)
const MWC_ITEMLOC_HELM = 1;
const MWC_ITEMLOC_AMULET = 2;
const MWC_ITEMLOC_BODY_ARMOR = 3;
const MWC_ITEMLOC_RIGHT_WEAPON_I = 4;
const MWC_ITEMLOC_LEFT_WEAPON_I = 5;
const MWC_ITEMLOC_RIGHT_RING = 6;
const MWC_ITEMLOC_LEFT_RING = 7;
const MWC_ITEMLOC_BELT = 8;
const MWC_ITEMLOC_BOOTS = 9;
const MWC_ITEMLOC_GLOVES = 10;
const MWC_ITEMLOC_RIGHT_WEAPON_II = 11;
const MWC_ITEMLOC_LEFT_WEAPON_II = 12;

var NTC_ItemQualityToName = new Array(9);
NTC_ItemQualityToName[0] = "None";
NTC_ItemQualityToName[1] = "Low Quality";
NTC_ItemQualityToName[2] = "Normal";
NTC_ItemQualityToName[3] = "Superior";
NTC_ItemQualityToName[4] = "Magic";
NTC_ItemQualityToName[5] = "Set";
NTC_ItemQualityToName[6] = "Rare";
NTC_ItemQualityToName[7] = "Unique";
NTC_ItemQualityToName[8] = "Crafted";

var NTC_ItemQualityToD2Color = new Array(10);
NTC_ItemQualityToD2Color[0] = "˙c0";
NTC_ItemQualityToD2Color[1] = "˙c0";
NTC_ItemQualityToD2Color[2] = "˙c0";
NTC_ItemQualityToD2Color[3] = "˙c0";
NTC_ItemQualityToD2Color[4] = "˙c3";
NTC_ItemQualityToD2Color[5] = "˙c2";
NTC_ItemQualityToD2Color[6] = "˙c9";
NTC_ItemQualityToD2Color[7] = "˙c4";
NTC_ItemQualityToD2Color[8] = "˙c8";
NTC_ItemQualityToD2Color[9] = "˙c5";

var NTC_ItemQualityToMGRColor = new Array(10);
NTC_ItemQualityToMGRColor[0] = "˙c6";
NTC_ItemQualityToMGRColor[1] = "˙c6";
NTC_ItemQualityToMGRColor[2] = "˙c6";
NTC_ItemQualityToMGRColor[3] = "˙c6";
NTC_ItemQualityToMGRColor[4] = "˙c3";
NTC_ItemQualityToMGRColor[5] = "˙c2";
NTC_ItemQualityToMGRColor[6] = "˙c9";
NTC_ItemQualityToMGRColor[7] = "˙c4";
NTC_ItemQualityToMGRColor[8] = "˙c8";
NTC_ItemQualityToMGRColor[9] = "˙c5";

// Minion classids
const MWC_MINION_SKELETON = 363;
const MWC_MINION_SKELETAL_MAGE = 364;
const MWC_MINION_CLAY_GOLEM = 289;
const MWC_MINION_BLOOD_GOLEM = 290;
const MWC_MINION_IRON_GOLEM = 291;
const MWC_MINION_FIRE_GOLEM = 292;

const MWC_MINION_WAKE_OF_FIRE = 410;
const MWC_MINION_CHARGED_BOLT_SENTRY = 411;
const MWC_MINION_LIGHTNING_SENTRY = 412;
const MWC_MINION_WAKE_OF_INFERNO = 415;
const MWC_MINION_DEATH_SENTRY = 416;
const MWC_MINION_SHADOW_WARRIOR = 417;
const MWC_MINION_SHADOW_MASTER = 418;

const MWC_MINION_RAVEN = 419;
const MWC_MINION_SPIRIT_WOLF = 420;
const MWC_MINION_DIRE_WOLF = 421;
const MWC_MINION_SPIRIT_OF_BARBS = 422;
const MWC_MINION_HEART_OF_THE_WOLVERINE = 423;
const MWC_MINION_OAK_SAGE = 424;
const MWC_MINION_POISON_CREEPER = 425;
const MWC_MINION_CARRION_VINE = 426;
const MWC_MINION_SOLAR_CREEPER = 427;
const MWC_MINION_GRIZZLY = 428;

const MWC_MINION_ROGUE_SCOUT = 271;
const MWC_MINION_DESERT_MERCENARY = 338;
const MWC_MINION_IRON_WOLF = 359;
const MWC_MINION_BARBARIAN = 561;

function NTC_IncludeConfig(filepath, loadDefault)
{
	var _configname, _configfile, _retVal;
	
	if(arguments.length < 2)
		loadDefault = true;
		
	_retVal = false;
	
	switch(me.classid)
	{
		case NTC_CHAR_CLASS_AMAZON:
			_configname = "NTConfig_Amazon_" + me.charname + ".ntl";
			break;
		case NTC_CHAR_CLASS_SORCERESS:
			_configname = "NTConfig_Sorceress_" + me.charname + ".ntl";
			break;
		case NTC_CHAR_CLASS_NECROMANCER:
			_configname = "NTConfig_Necromancer_" + me.charname + ".ntl";
			break;
		case NTC_CHAR_CLASS_PALADIN:
			_configname = "NTConfig_Paladin_" + me.charname + ".ntl";
			break;
		case NTC_CHAR_CLASS_BARBARIAN:
			_configname = "NTConfig_Barbarian_" + me.charname + ".ntl";
			break;
		case NTC_CHAR_CLASS_DRUID:
			_configname = "NTConfig_Druid_" + me.charname + ".ntl";
			break;
		case NTC_CHAR_CLASS_ASSASSIN:
			_configname = "NTConfig_Assassin_" + me.charname + ".ntl";
			break;
	}

	_configfile = FileOpen(filepath + "/" + _configname, 0);
	
	if(_configfile)
	{
		_configfile.Close();
		_retVal = true;
	}
	else if(loadDefault)
	{
		Print("˙c3Loaded default config!");

		switch(me.classid)
		{
			case NTC_CHAR_CLASS_AMAZON:
				_configname = "NTConfig_Amazon.ntl";
				break;
			case NTC_CHAR_CLASS_SORCERESS:
				_configname = "NTConfig_Sorceress.ntl";
				break;
			case NTC_CHAR_CLASS_NECROMANCER:
				_configname = "NTConfig_Necromancer.ntl";
				break;
			case NTC_CHAR_CLASS_PALADIN:
				_configname = "NTConfig_Paladin.ntl";
				break;
			case NTC_CHAR_CLASS_BARBARIAN:
				_configname = "NTConfig_Barbarian.ntl";
				break;
			case NTC_CHAR_CLASS_DRUID:
				_configname = "NTConfig_Druid.ntl";
				break;
			case NTC_CHAR_CLASS_ASSASSIN:
				_configname = "NTConfig_Assassin.ntl";
				break;
		}
	}
	else
		return false;

	Include(filepath + "/NTConfig.ntl");
	Include(filepath + "/" + _configname);
	
	return true;
}

function NTC_IncludeLibs()
{
	// Class libraries
	Include("libs/Classes/Vector.ntl");
	Include("libs/Classes/Point.ntl");
	Include("libs/Classes/Belt.ntl");
	Include("libs/Classes/Storage.ntl");
	
	// Common libraries
	Include("libs/Common/NTAttack.ntl");
	Include("libs/Common/NTCubing.ntl");
	Include("libs/Common/NTItemParser.ntl");
	Include("libs/Common/NTMove.ntl");
	Include("libs/Common/NTPrecast.ntl");
	Include("libs/Common/NTSnagIt.ntl");
	Include("libs/Common/NTTown.ntl");
	Include("libs/Common/NTTownManager.ntl");
	Include("libs/Common/NTTownMove.ntl");
	Include("libs/Common/MWItemlogger.ntl");
	Include("libs/Common/MWLoot.ntl");
	Include("libs/Common/MWUserCommands.ntl");
}	

function NTC_CastSkill(skillid, usehand, x, y)
{
	var _hand;
	var _shift;

	if(arguments.length < 1)
		return false;

	if(arguments.length == 1)
	{
		_hand = NTC_CLICK_RDOWN;
		_shift = NTC_SHIFT_NONE;
		usehand = NTC_HAND_RIGHT;
	}
	else
	{
		if(usehand == NTC_HAND_RIGHT)
		{
			_hand = NTC_CLICK_RDOWN;
			_shift = NTC_SHIFT_NONE;
		}
		else if(usehand == NTC_HAND_LEFT)
		{
			_hand = NTC_CLICK_LDOWN;
			_shift = NTC_SHIFT_NONE;
		}
		else
		{
			_hand = NTC_CLICK_LDOWN;
			_shift = NTC_SHIFT_HOLD;
			usehand = NTC_HAND_LEFT;
		}
	}

	if(NTC_PutSkill(skillid, usehand))
	{
		var i, n;
		var _mode;

		if(!NTC_ClearCursor())
			return false;

		for(i = 0; i < 5; i++)
		{
			switch(arguments.length)
			{
			case 1:
			case 2:
				ClickMap(_hand, _shift, me.x, me.y);
				break;
			case 3:
				if(!ClickMap(_hand, _shift, x))
				{
					NTC_Delay(NTC_DELAY_FRAME);
					return false;
				}
				break;
			default:
				ClickMap(_hand, _shift, x, y);
				break;
			}

			for(n = 0; n < 4; n++)
			{
				NTC_Delay(NTC_DELAY_FRAME);

				_mode = me.mode;
				if(_mode == 7 || _mode == 8 || (_mode >= 10 && _mode <= 16) || _mode == 18)
				{
					NTC_Delay(NTC_DELAY_FRAME);
					break;
				}
			}

			ClickMap(_hand + 2, NTC_SHIFT_NONE, null);

			if(n < 4)
			{
				for(i = 0; i < 100; i++)
				{
					NTC_Delay(20);

					if(me.mode != _mode)
						break;
				}

				return true;
			}

			NTC_Delay(NTC_DELAY_FRAME);
		}
	}

	return false;
}

function NTC_PutSkill(skillid, hand)
{
	if(me.GetSkill(hand) == skillid)
		return true;

	if(GetBaseStat("skills.txt", skillid, 182))
		return false;

	if(NTC_GetSkillLevel(skillid) < 1)
		return false;

	return me.SetSkill(skillid, hand);
}

function NTC_GetSkillLevel(skillid)
{
	var _level = me.GetSkill(skillid, true);

	if(_level != null)
		return _level;

	return 0;
}

function NTC_GetCastDelay(skillid)
{
	var _delay = GetBaseStat("skills.txt", skillid, 165);

	if(_delay)
		return (_delay * NTC_DELAY_FRAME);

	return 0;
}

function NTC_SwapWeapons(switchto)
{
	if(arguments.length > 0 && me.weaponstab == switchto || me.gametype == 0)
		return true;
	
	NTC_Delay(200);

	if(!NTC_WaitIdleMode())
		return false;

	return me.SwapWeapons();
}

function NTC_DoClick(button, shift, x, y)
{
	if(arguments.length < 2)
		return false;

	if(button != NTC_CLICK_LDOWN)
		button = NTC_CLICK_RDOWN;

	switch(arguments.length)
	{
	case 2:
		ClickMap(button, shift, me.x, me.y);
		break;
	case 3:
		if(!ClickMap(button, shift, x))
			return false;
		break;
	default:
		ClickMap(button, shift, x, y);
		break;
	}

	NTC_Delay(200);

	ClickMap(button+2, NTC_SHIFT_NONE, null);

	return true;
}

function NTC_MyGold()
{
	return me.GetStat(14) + me.GetStat(15);
}

function NTC_MyGoldCarry()
{
	return me.GetStat(14);
}

function NTC_StashGoldFull()
{
	return 2500000 <= me.GetStat(15);
}

function NTC_CharGoldFull()
{
	return (me.GetStat(14) >= (me.GetStat(12)*10000));
}

function NTC_CheckOwner(object, ownername)
{
	var _owner;

	if(!object)
		return false;

	_owner = object.GetParent();
	if(!_owner)
		return false;

	if(arguments.length < 2)
	{
		if(_owner == me.name || _owner.name == me.name)
			return true;
	}
	else
	{
		if(typeof _owner == "string" && _owner.toLowerCase() == ownername.toLowerCase() || typeof _owner.name == "string" && _owner.name.toLowerCase() == ownername.toLowerCase())
			return true;
	}

	return false;
}

function NTC_ItemToCursor(item, isMercItem)
{
	if(me.itemoncursor)
		return true;
		
	if(arguments.length < 2)
		isMercItem = false;

	for(var i = 0; i <= 80; i++)
	{
		NTC_Delay(100);
		
		if((i % 40) == 0)
		{
			if(!isMercItem)
			{
				if(typeof item == "number")
					me.ClickItem(item);
				else
					me.ClickItem(0, item);
			}
			else if(typeof item == "number")
				me.ClickMercItem(item);
		}

		if(me.itemoncursor)
		{
			NTC_PingDelay(200);

			return true;
		}
	}

	return false;
}
	
function NTC_ClearCursor()
{
	if(!me.itemoncursor)
		return true;

	for(var i = 0; i < 40; i++)
	{
		if(i % 20 == 0)
			NTC_DoClick(NTC_CLICK_LDOWN, NTC_SHIFT_NONE);
	
		NTC_Delay(100);
		
		if(!me.itemoncursor)
		{
			if(MWConfig_ResetArmorMode)
				MWSI_PickupItem(0x503B);
			
			return true;
		}
	}
	
	return false;
}

function NTC_GetMerc()
{
	var _merc;

	_merc = me.GetMerc();

	if(_merc)
	{
		if(_merc.hp > 0 && _merc.mode != 0 && _merc.mode != 12)
			return _merc;
	}

	return null;
}

function NTC_GetSpecialChest()
{
	var _chest;

	_chest = NTC_FindUnit(NTC_UNIT_OBJECT, GetLocaleString(3260));

	if(_chest)
	{
		do
		{
			switch(_chest.classid)
			{
				case 354:
				case 355:
				case 356:
				case 397:
				case 405:
				case 406:
				case 407:
					return _chest;
			}
		} while(_chest.GetNext());
	}

	return null;
}

function NTC_OpenChest(chest)
{
	if(!chest)
		return false;

	if(chest.mode > 0)
		return false;

	for(var i = 1; i <= 10; i++)
	{
		if(chest.mode > 0)
		{
			NTC_SendMsgToScript("MWBotGame.ntj", "SET_CHESTOPENEND_1");
			
			return true;
		}

		if(NTC_WaitIdleMode())
		{
			if(MWConfig_UseTelekinesisMode >= 2 && i < 5 && NTC_GetSkillLevel(43) > 0)
				MWC_CastTelekinesis(chest);
			else
			{
				if(GetDistance(me, chest) >= 2 || i % 5 == 0)
				{
					if(NTM_MoveTo(chest.areaid, chest.x + Random(-1, 1), chest.y + Random(-1, 1), 2))
						NTC_WaitIdleMode();
					else
						return false;
				}

				NTC_DoClick(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, chest);
			}
		}
	}

	return false;
}

function NTC_Delay(amount, random)
{
	if(arguments.length < 2)
		Delay(amount);
	else
		Delay(amount + Random(0, random));
}

function NTC_PingDelay(amount)
{
	var _currentping = me.ping;

	if(_currentping > 100)
		_currentping -= 100;
	else
		_currentping = 0;

	NTC_Delay(amount+_currentping);
}

function NTC_InTown(who)
{
	var _areaid;

	if(arguments.length < 1)
		who = me;

	while(who.areaid == 0)
		NTC_Delay(NTC_DELAY_FRAME);

	_areaid = who.areaid;

	return (_areaid == NTC_AREA_ID_ACT_1 || _areaid == NTC_AREA_ID_ACT_2 || _areaid == NTC_AREA_ID_ACT_3 || _areaid == NTC_AREA_ID_ACT_4 || _areaid == NTC_AREA_ID_ACT_5);
}

function NTC_InMyParty(playerName)
{
	var _player, _myPartyId;

	_player = GetPlayerUnit();
	
	if(arguments.length < 1 || !playerName)
		return false;

	if(_player)
	{
		_myPartyId = _player.partyid;

		if(_myPartyId != 65535)
		{
			do
			{
				if(_myPartyId == _player.partyid && _player.name.toLowerCase() == playerName.toLowerCase())
					return true;
			} while(_player.GetNext());
		}
	}

	return false;
}

function NTC_FindUnit(unittype, search, retry)
{
	var _unit;

	switch(arguments.length)
	{
	case 0:
		return null;
	case 1:
		search = null;
	case 2:
		retry = 0;
		break;
	}

	for(var i = 0 ; i <= retry ; i++)
	{
		_unit = GetUnit(unittype, search);

		if(_unit)
			return _unit;

		if(i < retry)
			NTC_Delay(200);
	}

	return null;
}

function NTC_GetBeltSize()
{
	var _items = me.GetItems();

	if(!_items)
		return 1;

	for(var i = 0 ; i < _items.length ; i++)
	{
		if(_items[i].mode == 1 && _items[i].itemloc == 8)
		{
			if(_items[i].classid == 344 || _items[i].classid == 345)
				return 2;
			else if(_items[i].classid == 346 || _items[i].classid == 347)
				return 3;

			return 4;
		}
	}

	return 1;
}

function NTC_FindScript(scriptname)
{
	var _script, _scriptpath;

	_script = GetScript();

	if(_script && scriptname)
	{
		do
		{
			_scriptpath = _script.name.toLowerCase();
			
			if(_scriptpath.indexOf(scriptname.toLowerCase()) != -1)
				return _script;
		} while(_script.GetNext());
	}

	return null;
}

function MWC_FindCurrentBotScript()
{
	var _script;

	_script = GetScript();

	if(_script)
	{
		do
		{
			if(_script.running && _script.name.indexOf("Tools") == -1 && _script.name.indexOf("Bot") == -1)
				return _script;
		} while(_script.GetNext());
	}

	return null;
}

function NTC_SendMsgToScript(scriptname, msg)
{
	var _script, _errorArgStartIndex, _msg;
		
	// Determine which is the first argument that belongs to the error description
	if(typeof msg == "string")
	{
		_errorArgStartIndex = 2;
		_msg = msg;
	}
	else // If msg is a pointer to a function object
	{
		_errorArgStartIndex = 1;
		_msg = msg.name + "()";
	}
	
	MWC_WriteErrorDescription(_errorArgStartIndex, arguments);
	
	_script = NTC_FindScript(scriptname);
	
	if(_script)
		return _script.Send(_msg);

	return false;
}

function NTC_StopScript(scriptname)
{
	var _script = NTC_FindScript(scriptname);

	if(_script)
	{
		if(_script.running)
			return _script.Stop();
		else
			return true;
	}
	
	return false;
}

function NTC_WaitIdleMode()
{
	var _mode;

	for(var i = 0; i < 25; i++)
	{
		_mode = me.mode;

		if((_mode >= 1 && _mode <= 3) || _mode == 5 || _mode == 6)
			return true;

		NTC_Delay(NTC_DELAY_FRAME);
	}

	return false;
}

function NTC_SendLogToOOG(type, logString)
{
	return SendCopyData("D2NT Manager", null, 9<<16|type, logString);
}

function MWC_GetItemColorInt(itemunit)
{
	if(!itemunit)
		return 0;
	
	if(NTC_UNIT_CUBE == itemunit.classid || (itemunit.itemflag&0x4000000) || 544 <= itemunit.classid && 555 >= itemunit.classid || 524 == itemunit.classid || 525 == itemunit.classid)
		return 7;
	else if(itemunit.itemtype == 74 || (itemunit.classid >= 644 && itemunit.classid <= 657))
		return 8;
	else if(itemunit.quality <= 3 && ((itemunit.itemflag & 0x400000) || itemunit.GetStat(194)))
		return 9;
	else
		return itemunit.quality;
	
}

function MWC_GetGameNumber(gamename)
{
	var myCount, countString;
	if(gamename)
		return -1;
	else
	{
		countString = lastGameString.slice(lastGameString.lastIndexOf('-')+1);
		switch(countString)
		{
			case "08":
				myCount = 9;
				break;
			case "09":
				myCount = 10;
				break;
			default:
				myCount = parseInt(countString) + 1;
				break;
		}
		return myCount;
	}
}

function MWC_GetPotionCountInt(type)
{
	var _items, _count;
	
	_items = me.GetItems();
	
	if(_items)
	{
		_count = 0;
		
		for(i = 0 ; i < _items.length ; i++)
		{
			if(_items[i].mode == 2 && _items[i].code.indexOf(type) != -1)
				_count++;
		}
		return _count;
	}
}

function MWC_GetRandomColor()
{
	var _colors = ['0', '1', '2', '3', '4', '5', '7', '8', '9', '<', ';', ':'];
	var _rndIndex = Random(0, _colors.length - 1);
	
	NTC_Delay(1);
	
	return "˙c" + _colors[_rndIndex];
}

function MWC_WriteToTextfile(text, filepath, mode, timestamp)
{
	var _fhandle, _lines, _time;
	
	if(arguments.length < 4)
		timestamp = false;
	
	_fhandle = FileOpen(filepath, mode);
	
	if(_fhandle)
	{
		if(timestamp)
		{
			_time = new Date().toLocaleFormat("%H:%M:%S");
			
			_lines = text.split("\n");
			
			for(var i = 0; i < _lines.length; i++)
				_fhandle.WriteLine("["+ _time + "] " + text);	
		}
		else
			_fhandle.WriteLine(text);
		
		_fhandle.Close();
	
		return true;
	}
	
	return false;
}

function MWC_CharClassIdToString(id)
{
	switch(id)
	{
		case NTC_CHAR_CLASS_AMAZON:
			return GetLocaleString(4011);
		case NTC_CHAR_CLASS_SORCERESS:
			return GetLocaleString(4010);
		case NTC_CHAR_CLASS_NECROMANCER:
			return GetLocaleString(4009);
		case NTC_CHAR_CLASS_PALADIN:
			return GetLocaleString(4008);
		case NTC_CHAR_CLASS_BARBARIAN:
			return GetLocaleString(4007);
		case NTC_CHAR_CLASS_DRUID:
			return GetLocaleString(4012);
		case NTC_CHAR_CLASS_ASSASSIN:
			return GetLocaleString(4013);
		default:
			return "Unknown";
	}
}

function MWC_PrintDesc(string, color)
{
	var _lines, _color;
	
	if(arguments.length > 1)
		_color = "˙c" + color;
	else
		_color = MWC_GetRandomColor();
	
	_lines = string.split("\n");
		
	for(var i = 0; i < _lines.length; i++)
		Print(_color + _lines[i]);
	
	return true;
}

function MWC_CheckForExpShrineUsers()
{
	var _player;
	
	_player = NTC_FindUnit(NTC_UNIT_PLAYER);
	
	if(_player)
	{
		do
		{
			if(_player.GetState(137) && NTC_InMyParty(_player.name) && _player.areaid == me.areaid)
				return true;
		} while(_player.GetNext());
	}

	return false;
}

function MWC_GetMinionName(type)
{
	switch(type)
	{
		case 70:
			return "Skeleton";
		case 80:
			return "Skeletal Mage";
		case 95:
			return "Revive";
	}

	return "Minion";
}

function MWC_GetMinionCount(type)
{
	var _monsters, _count, _classIds, _quickReturn;
	var i;
	
	_quickReturn = false;
	_classIds = new Array();
	_count = 0;
	
	switch(type)
	{
		case MWS_RAISE_SKELETON:
			_classIds.push(MWC_MINION_SKELETON);
			break;
		case MWS_RAISE_SKELETAL_MAGE:
			_classIds.push(MWC_MINION_SKELETAL_MAGE);
			break;
		case MWS_SUMMON_GRIZZLY:
			_classIds.push(MWC_MINION_GRIZZLY);
			_quickReturn = true;
			break;
		case MWS_VALKYRIE:
			return false; // TODO: Check classid
		case MWS_RAVEN:
			_classIds.push(MWC_MINION_RAVEN);
			break;
		case MWS_CLAY_GOLEM:
			_classIds.push(MWC_MINION_CLAY_GOLEM);
			_classIds.push(MWC_MINION_IRON_GOLEM);
			_quickReturn = true;
			break;
		case MWS_BLOOD_GOLEM:
			_classIds.push(MWC_MINION_BLOOD_GOLEM);
			_classIds.push(MWC_MINION_IRON_GOLEM);
			_quickReturn = true;
			break;
		case MWS_FIRE_GOLEM:
			_classIds.push(MWC_MINION_FIRE_GOLEM);
			_classIds.push(MWC_MINION_IRON_GOLEM);
			_quickReturn = true;
			break;		
		case MWS_SHADOW_WARRIOR:
			_classIds.push(MWC_MINION_SHADOW_WARRIOR);
			_quickReturn = true;
			break;
		case MWS_SHADOW_MASTER:
			_classIds.push(MWC_MINION_SHADOW_MASTER);
			_quickReturn = true;
			break;
		case MWS_SUMMON_SPIRIT_WOLF:
			_classIds.push(MWC_MINION_SPIRIT_WOLF);
			break;
		case MWS_SUMMON_DIRE_WOLF:
			_classIds.push(MWC_MINION_DIRE_WOLF);
			break;
		case MWS_POISON_CREEPER:
			_classIds.push(MWC_MINION_POISON_CREEPER);
			_quickReturn = true;
			break;
		case MWS_CARRION_VINE:
			_classIds.push(MWC_MINION_CARRION_VINE);
			_quickReturn = true;
			break;
		case MWS_SOLAR_CREEPER:
			_classIds.push(MWC_MINION_SOLAR_CREEPER);
			_quickReturn = true;
			break;
	}

	if(_classIds.length == 0 && type != MWS_REVIVE)
		return _count;
		
	_monsters = NTC_FindUnit(NTC_UNIT_MONSTER);

	if(_monsters)
	{
		do 
		{
			if(_monsters.hp > 0 && _monsters.mode != 12)
			{
				if(_classIds.indexOf(_monsters.classid) == -1 && !(type == MWS_REVIVE && _monsters.GetState(96)))
					continue;
					
				if(NTC_CheckOwner(_monsters))
				{
					if(_quickReturn)
						return 1;
					else
						_count++;
				}
			}
		} while(_monsters.GetNext());
	}
	
	return _count;
}

function MWC_GetMaxMinionCount(skillId)
{
	var _skillLevel;
	
	_skillLevel = NTC_GetSkillLevel(skillId);
	
	switch(skillId)
	{
		case MWS_REVIVE:
			return _skillLevel;
		case MWS_RAISE_SKELETON:
		case MWS_RAISE_SKELETAL_MAGE:
			if(_skillLevel <= 3)
				return _skillLevel;
			else
				return 2 + parseInt(_skillLevel / 3.0);
		case MWS_RAVEN:
		case MWS_SUMMON_SPIRIT_WOLF:
			if(_skillLevel <= 5)
				return _skillLevel;
			else
				return 5;
		case MWS_SUMMON_DIRE_WOLF:
			if(_skillLevel <= 3)
				return _skillLevel;
			else
				return 3;
	}

	return 1;
}

function MWC_GetSlotID(type)
{
	var _items, _slotVal, _slotIndex;
	
	if(arguments.length < 1 || me.gametype == 0)
		return me.weaponstab;
	
	// Array format: index 0: Value; index 1: Non-Class BO; index 2: CTA Slot
	//_slotVal = new Array([0, 0, false], [0, 0, false]); // auskommentiert
	
	_slotVal = new Array(); // ab hier neu eingefügt
	_slotVal[0] = new Array();
	_slotVal[0].IsCTASlot = false;
	_slotVal[0].BoLevel = 0;
	_slotVal[0].Primary = 0;
	
	_slotVal[1] = new Array();
	_slotVal[1].IsCTASlot = false;
	_slotVal[1].BoLevel = 0;
	_slotVal[1].Primary = 0; // bis hier neu eingefügt

	_items = me.GetItems();
	
	if(_items)
	{
		for(var i = 0; i < _items.length; i++)
		{
			if(_items[i].mode == 1)
			{
				if(_items[i].itemloc == 4 || _items[i].itemloc == 5)
					_slotIndex = 0;
				else if(_items[i].itemloc == 11 || _items[i].itemloc == 12)
					_slotIndex = 1;
				else
					continue;
				
				switch(type)
				{
					case "precast":
						if((_items[i].itemflag & 0x4000000) && _items[i].itemprefix == 0x5027) // Check if the item is a CTA
							_slotVal[_slotIndex][2] = true;
							
						_slotVal[_slotIndex][1] += _items[i].GetStat(97,149);		// Non Class Battle Orders
						_slotVal[_slotIndex][0] += _items[i].GetStat(127);							// All Skills
						if(me.classid == NTC_CHAR_CLASS_BARBARIAN)
						{
							_slotVal[_slotIndex][0] += _items[i].GetStat(107,149);	// Class Specific Battle Order
							_slotVal[_slotIndex][0] += _items[i].GetStat(83,4);		// Barbarian Skills
							_slotVal[_slotIndex][0] += _items[i].GetStat(188,34);	// Warcries Skilltab
						}
						break;
					case "teleport":
						_slotVal[_slotIndex][0] += _items[i].GetStat(105); 			// Faster Cast Rate
						_slotVal[_slotIndex][0] += _items[i].GetStat(127) * 5; 		// All Skills
						break;
					case "finditem":
						_slotVal[_slotIndex][0] += _items[i].GetStat(79) * 0.75; 	// Extra Gold
						_slotVal[_slotIndex][0] += _items[i].GetStat(80); 			// Magic Find
						_slotVal[_slotIndex][0] += _items[i].GetStat(240); 			// Magic Find per Level
						
						_slotVal[_slotIndex][0] += _items[i].GetStat(105); 			// Faster Cast Rate
						
						_slotVal[_slotIndex][0] += _items[i].GetStat(127) * 10; 	// All Skills
						
						_slotVal[_slotIndex][0] += _items[i].GetStat(83,4) * 10; 	// Barbarian Skills
						_slotVal[_slotIndex][0] += _items[i].GetStat(188,34) * 10;	// Warcries Skills
						break;
					case "attack":
						_slotVal[_slotIndex][0] += _items[i].GetStat(21) + (_items[i].GetStat(22) - _items[i].GetStat(21)) / 2;			// Base Damage 1H
						if(_items[i].GetStat(21) <= 0)
							_slotVal[_slotIndex][0] += _items[i].GetStat(23) + (_items[i].GetStat(24) - _items[i].GetStat(23)) / 2;		// Base Damage 2H
						_slotVal[_slotIndex][0] += (_items[i].GetStat(48) + (_items[i].GetStat(49) - _items[i].GetStat(48)) / 2) / 2;	// Fire Damage
						_slotVal[_slotIndex][0] += (_items[i].GetStat(50) + (_items[i].GetStat(51) - _items[i].GetStat(50)) / 2) / 2;	// Light Damage
						_slotVal[_slotIndex][0] += (_items[i].GetStat(52) + (_items[i].GetStat(53) - _items[i].GetStat(52)) / 2) / 2;	// Magic Damage
						_slotVal[_slotIndex][0] += (_items[i].GetStat(54) + (_items[i].GetStat(55) - _items[i].GetStat(54)) / 2) / 5;	// Cold Damage
						_slotVal[_slotIndex][0] += _items[i].GetStat(58) * _items[i].GetStat(59) / 256;									// Poison Damage
						_slotVal[_slotIndex][0] += _items[i].GetStat(111);																// + Damage
						break;
				}
			}
		}
	}
	
	for(var i = 0; i < _slotVal.length; i++)
	{
		if(me.classid == NTC_CHAR_CLASS_BARBARIAN && _slotVal[i][1] > 3)
			_slotVal[i][0] += 3;
		else
			_slotVal[i][0] += _slotVal[i][1];
	}

	if(_slotVal[0][0] > _slotVal[1][0] && me.classid == NTC_CHAR_CLASS_BARBARIAN || _slotVal[0][2] && !_slotVal[1][2])
		return 0;
	else if(_slotVal[0][0] < _slotVal[1][0] && me.classid == NTC_CHAR_CLASS_BARBARIAN || !_slotVal[0][2] && _slotVal[1][2])
		return 1;

	return -1;
}

function MWC_WriteErrorDescription(startIndex, args)
{
	var _output, _fhandle, _formalArguments, _arguments, _function, _errorLineIndex;
	
	_function = args[startIndex];
	_errorLineIndex = args[startIndex + 1];

	if(!_function || !_errorLineIndex)
		return false;
	
	// Extract the formal argument list
	_formalArguments = _function.toString().split(")")[0];
	_formalArguments = _formalArguments.split("(")[1];
	_formalArguments = _formalArguments.split(", ");
	
	_arguments = "";
	
	for(var i = 0; i < _formalArguments.length; i++)
	{
		if(i < args.length - 2 - startIndex)
			_arguments += "˙c0" + _formalArguments[i];
		else
			_arguments += "˙615C5C" + _formalArguments[i];
		
		if(i + 1 < _formalArguments.length)
			_arguments += "˙c0, ";
	}
		
	_output = "˙BE0000An Error occured executing ˙c8" + _function.name + "()˙BE0000 in ˙c8%script ˙BE0000[˙329B52" + _errorLineIndex + "˙BE0000]";
	_output += "\n˙BE0000Function Prototype: ˙c8" + _function.name + "(" + _arguments + "˙c8)";
	_output += "\n˙BE0000Function Call: ˙c8" + _function.name + "(";
		
	_arguments = "";
	
	for(var i = startIndex + 2; i < args.length; i++)
	{
		if(typeof args[i] == "string")
			_arguments += "˙767676\"" + args[i] + "\"";
		else 
		{
			switch(typeof args[i])
			{
				case "boolean":
					_arguments += "˙294AF0" + args[i];
					break;
				case "number":
					_arguments += "˙BE0000" + args[i];
					break;
				case "object":
					_arguments += "˙c8[";
					switch(args[i].type)
					{
						case NTC_UNIT_PLAYER:
							_arguments += "Player";
							break;
						case NTC_UNIT_NPC:
							_arguments += "NPC";
							break;
						case NTC_UNIT_OBJECT:
							_arguments += "Object";
							break;
						case NTC_UNIT_MISSILE:
							_arguments += "Missile";
							break;
						case NTC_UNIT_ITEM:
							_arguments += "Item";
							break;
						case NTC_UNIT_TILE:
							_arguments += "Tile";
							break;
						default:
							if(args[i].id)
								_arguments += "Area";
							else
								_arguments += "undefined";
							break;
					}
					
					if(!isNaN(args[i].classid))
						_arguments += " Unit " + args[i].classid + "]";
					else if(arguments[i].id)
						_arguments += " Unit " + args[i].id + "]";
					else
						_arguments += " Unit]";
					
					break;
			}
		}

		if(i + 1 < args.length)
			_arguments += "˙c0, ";
		else
			_arguments += "˙c8)";
	}
		
	if(_arguments[_arguments.length -1] != ")")
		_arguments += ")";
		
	_output += _arguments;
		
	_fhandle = FileOpen("Data/"+ me.charname + ".errdata", 1);
	
	if(_fhandle)
	{
		_output = _output.split("\n");
		
		for(var i = 0; i < _output.length; i++)
			_fhandle.WriteLine(_output[i]);
			
		_fhandle.Close();
		
		return true;
	}

	return false;
}

function MWC_InsertDigitSeperator(number, delimeter, blocksize)
{
	var _tempString, _outputString, _decFrac, _isNegative;
	
	if(arguments.length < 1)
		return "NaN";
	if(arguments.length < 2)
		delimeter = ",";
	if(arguments.length < 3)
		blocksize = 3;
	
	// Check the input argument
	if(typeof number == "string")
	{
		if(isNaN(number))
			return "NaN";
			
		_tempString = number;
	}
	else if(typeof number == "number")
		_tempString = number.toString();
	else
		return number;
		
	_decFrac = "";
	// If the number is float, seperate the decimal fraction which must not be altered
	if(_tempString.indexOf(".") > -1)
	{
		_decFrac = _tempString.split(".")[1];
		_tempString = _tempString.split(".")[0];
	}
	
	if(_tempString.indexOf("-") > -1)
	{
		_isNegative = true;
		_tempString = _tempString.replace("-", "");
	}
	else
		_isNegative = false;
		
	
	_outputString = "";
	// Loop while there are blocks left to seperate
	// The input string is processed from its end to its beginning
	while(_tempString.length > blocksize)
	{
		_outputString = delimeter + _tempString.substr(_tempString.length - blocksize) + _outputString;
		_tempString = _tempString.substring(0, _tempString.length - blocksize);
	}

	if(_isNegative)
		_tempString = "-" + _tempString;
		
	if(_decFrac != "")
		_outputString += "." + _decFrac;
	
	return _tempString + _outputString;
}

// This is just a workaround because GetArea() raises an exception when called with invalid arguments
function MWC_FindArea(areaid)
{
	if(arguments.length < 1)
		areaid = me.areaid;
		
	if(areaid < 1 || areaid > 136)
		return null;
		
	return GetArea(areaid);
}


function MWC_SetStatusText(start, end)
{
	var _output;
	
	if(arguments.length < 2 || typeof end != "string")
		end = "";
	
	if(arguments.length < 1 && typeof start != "string")
		start = "˙c1INVALID STATUSTEXT!";
		
	_output = start + end;
		
	if(_output.length > 39) // Trim the script name in case the output text exceeds the maximum length of 39 characters
		_output = _output.replace(start, start.substring(0, start.length - _output.length + 36) + "...");
	
	SetStatusText(_output);
}

// Format: %h, %m, %s will be replaced by the number of hours, minutes and seconds
// If an asterisk is added, the time will not be included in the output string, if its value is 00
// Example: if ticks was 65000 and formatString "%h*:%m:%s" the function would return "01:05"
function MWC_ConvertTicksToTimeString(ticks, formatString)
{
	var _timeString, _time, _hours, _minutes, _seconds;		
	
	_hours = "";
	_minutes = "";
	_seconds = "";
		
	if(arguments.length < 2)
		formatString = "%h*:%m:%s"; 
		
	_timeString = formatString;
	 
	// Handle hours
	_time = parseInt(ticks / 36E5);
	if(_time < 10)
		_hours += "0";
		
	_hours += _time;
	
	// Handle minutes
	_time = parseInt(ticks / 6E4) % 60;
	if(_time < 10)
		_minutes += "0";
	
	_minutes += _time;
	
	// Handle seconds
	_time = parseInt(ticks / 1E3) % 60;
	if(_time < 10)
		_seconds += "0";

	_seconds += _time;
	
	if(_timeString.indexOf("%h") > -1)
	{
		if(_timeString.indexOf("%h*") == -1 || _hours != "00")
			_timeString = _timeString.replace(/%h\*?/gi, _hours);
		else	
			_timeString = _timeString.replace(/%h\*[^%]/gi, "");
	}
	if(_timeString.indexOf("%m") > -1)
	{
		if(_timeString.indexOf("%m*") == -1 || _minutes != "00")
			_timeString = _timeString.replace(/%m\*?/gi, _minutes);
		else	
			_timeString = _timeString.replace(/%m\*[^%]/gi, "");
	}
	if(_timeString.indexOf("%s") > -1)
	{
		if(_timeString.indexOf("%s*") == -1 || _seconds != "00")
			_timeString = _timeString.replace(/%s\*?/gi, _seconds);
		else	
			_timeString = _timeString.replace(/%s\*[^%]/gi, "");
	}
	
	return _timeString;
}

function MWC_GetItems(location, mode, search)
{
	var _locItems, _items;
	
	if(arguments.length < 2)
		mode = 0;

	_locItems = new Array();
	
	_items = me.GetItems();
	
	if(_items)
	{
		for(var i = 0; i < _items.length; i++)
		{
			if(arguments.length < 3 || _items[i].gid == search || _items[i].classid == search || _items[i].code == search)
			{
				if((location == -1 || _items[i].itemloc == location) && _items[i].mode == mode)
				{
					if(mode == 1 && location > -1)
						return _items[i];
					else
						_locItems.push(_items[i]);
				}
			}
		}
	}

	return _locItems;
}

function MWC_CastTelekinesis(target)
{
	if(NTC_GetSkillLevel(MWS_TELEKINESIS) < 1)
		return false;
		
	if(GetDistance(me, target) > 20 || !CheckCollision(me, target, 4) || !CheckCollision(me, target, 2))
	{
		if(NTC_InTown())
			NTTM_TownMoveXY(target.x, target.y + 2);
		else
			NTM_MoveTo(target.areaid, target.x + Random(-1, 1), target.y + Random(-1, 1));
	}
	
	if(GetDistance(me, target) < 2.5)
		return NTC_DoClick(NTC_CLICK_LDOWN, NTC_SHIFT_NONE, target);
	
	return NTC_CastSkill(MWS_TELEKINESIS, NTC_HAND_RIGHT, target);
}

function MWC_Initialize()
{
	NTCU_InitCubing();
	
	NTA_Initialize();
}

function MWC_PrintOverheadStatus(text)
{
	if(GetUIState(0x05) || GetUIState(0x09) || GetUIState(0x0C) || GetUIState(0x18) || GetUIState(0x19))
		return false;
		
	return Say("! " + text);
}

function MWC_SortArrayDescending(a, b)
{
	if(a < b)
		return 1;

	if(a > b)
		return -1;

	if(a == b)
		return 0;
}

function MWC_ManageParty()
{
	var _player, _myPartyId, _existingPartyId;
	
	_player = GetPlayerUnit();

	if(_player)
	{
		_myPartyId = _player.partyid;
		
		while(_player.GetNext())
		{
			_existingPartyId = MWC_GetExistingParty();
			
			if(_player.partyflag == MWC_PARTY_FLAG_ACCEPT && (_existingPartyId == _player.partyid || _existingPartyId == MWC_PARTY_ID_NONE) || _player.partyflag == MWC_PARTY_FLAG_INVITE && (_existingPartyId == MWC_PARTY_ID_NONE || _existingPartyId == _myPartyId))
			{
				me.ClickParty(_player, 2);
				
				NTC_Delay(NTC_DELAY_FRAME);
			}
		}
	
		return true;
	}
	
	return false;
}

function MWC_GetExistingParty()
{
	var _player;
	
	_player = GetPlayerUnit();

	if(_player)
	{
		while(_player.GetNext())
		{
			if(_player.partyid != MWC_PARTY_ID_NONE)
				return _player.partyid;
		}
	}

	return MWC_PARTY_ID_NONE;
}

function MWC_Debug(string, mode)
{
	var _date;
	
	if(arguments.length == 1)
		mode = 0x03;
		
	if((mode&0x01) && (MWC_DEBUG_MODE&0x01))
	{
		_date = new Date();
		
		if(!_date)
			return;
			
		MWC_WriteToTextfile("[" + (_date.toLocaleFormat("%a %m/%d/%y %H:%M:%S")) + " - " + me.charname + "]: " + string , me.charname + "_DEBUG.txt", 2)
	}

	if((mode&0x02) && (MWC_DEBUG_MODE&0x02))
		Print("˙c8[DEBUG]: ˙c0" + string);
}

function MWC_GetColorGemName(name)
{
	var _retString;
	
	_retString = name.replace(/Ruby/gi, "˙c1Ruby");
	_retString = _retString.replace(/Emerald/gi, "˙c2Emerald");
	_retString = _retString.replace(/Sapphire/gi, "˙c3Sapphire");
	_retString = _retString.replace(/Amethyst/gi, "˙c;Amethyst");
	_retString = _retString.replace(/Skull/gi, "˙c5Skull");
	_retString = _retString.replace(/Topaz/gi, "˙c9Topaz");
	
	return _retString;
}
Quote:
Originally Posted by DauerZocker123 View Post
Hallo,
seid heute mittag , meldet der bot sich nachdem er ein game aufgemacht hat, mit einem "syntaxfehler" in der datei itemparser.nip .
auszug der der fehlereie:

if(_NTIP_CheckList[i][0].indexOf("maxquantity") == -1)

da soll angeblich was nicht stimmen, weis wer weiter ?
lg
Du hast kürzlich an den Pickits rumgebastelt? Da hat sich nen Schreibfehler eingeschlichen. Vermutlich hast du dort irgendwas mit einer maxquantity-Einstellung vergeigt. Bin mir jetzt nicht ganz sicher ob das -1 zur Fehlermeldung gehört oder ne Angabe des Fehlers ist. Solltest du tatsächtlich in einer maxquantity- Zeile -1 als Anzahl stehen haben: mach das Minus weg.

Nip-Checker aktivieren bringt dir hier glaube nichts, bei Fehlern die so grob sind daß es den Itemparser aus dem Tritt bringt kommt der glaub nicht zum Zuge. Ich fürchte hier ist manuelles Suchen angesagt.

EDIT: Mist geschrieben. Nip-Checker sollte doch was bringen, siehe hier:
fghtrt is offline  
Thanks
5 Users
Old 01/09/2012, 15:40   #5205
 
elite*gold: 0
Join Date: May 2009
Posts: 55
Received Thanks: 12
hallo,
meine bot läuft mir einer zauberin (FO/FB) und killt meppel und andy auf hell.sie benutzt auch einen merc.
nun "freezt" mein d2 fenster immer kurz nachdem sie bei meppel durch das rote portal in act 4 gegangen ist.weis irgendwer woran das liegen könnte ?
lg
DauerZocker123 is offline  
Reply


Similar Threads Similar Threads
[Release] D2NT 3.1 1.13c
07/17/2016 - Diablo 2 - 91 Replies
hi, hab eben den d2nt3.1 gefunden. ein neues baba script is dabei. release thread eon D2NT3.1
[Realease] Muddy's Waypoint Catcher
08/21/2013 - Diablo 2 Programming - 46 Replies
Moin zusammen, hier mal die erste Release Version eines kleinen Scripts genannt Waypoint Catcher. Das ganze ist jetzt nichtmal 24h alt, dementsprechend sind vermutlich noch einige Bugs vorhanden. Hinweise dazu nehme ich gerne entgegen. ;) Features: - Suchen sämtlicher Wegpunkte mit Ausnahme, wobei in Akt ein durch Probleme im Jail Bereich nach dem Wegpunkt Outer Cloister abgebrochen wird - Wahlweise auch mit TP an jedem gefundenen Wp, sodass man damit auch anderen (nicht-Bots) die...
[D2NT] Long Dia Release
05/10/2011 - Diablo 2 Programming - 28 Replies
Ein kleines Script für diablo, es startet beim eingang macht ein tp cleart den weg zum star macht am star noch ein tp dann läufts wie das normale nur cleart es schöner :) hoffe euch gefällts ich habs noch nicht wirklich getestet (2-3 runs) bugs können gerne hier gepostet werden verbesserungs vorschläge auch :D installation: 1.)Script in den Bot ordner kopieren 2.)Script im editor oder vergleichbaren öffnen 3.) Msg´s anpassen (ist nicht schwer) 4.) in der char config die zeile...
D2NT 3.0 Pickit release
10/22/2010 - Diablo 2 - 77 Replies
edit
Muddy's D2NT Help
07/29/2010 - Diablo 2 - 3 Replies
hi i just started to use the bot it work's great. how do i set up the skill's i use on my Sorc and pick up itme's? ..... if you reply to this post please use english



All times are GMT +1. The time now is 23:23.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.