[Updated] D2NT Leechbot

04/30/2011 02:31 ldevil#1
Ich bin mir nicht sicher, was der aktuelle Standard "Leechbot" ist, aber da ich den für Muddies ja eh grad geschrieben und veröffentlich hab, jetzt noch für alle die nicht Muddies verwenden.

Credits: An alle die was damit zu tun hatten, weiss leider nimmer wo die Scripte herkommen die ich als Vorlage genommen habe. Aber auf alle Fälle Danke!

Features:
- Automatische Erkennung ob 2 oder 3 Zeilen
- Kein /f l Spamm
- 1 EntryPoint deckt Leader und Leecher ab
- AutoMule[1], KeyChange etc. sollten damit funktionieren
[1] Muss natürlich im Bot enthalten sein

Einfach NTBot.ntj anpassen!

Variablen (zum selber definieren):
Code:
[COLOR="Green"]// Leech settings[/COLOR]
[B][I][COLOR="Navy"]var [/COLOR][/I][/B]LeaderAccountName = [COLOR="DimGray"]"DefaultAccount"[/COLOR];	[COLOR="Green"]// leader account name here[/COLOR]
[B][I][COLOR="Navy"]var [/COLOR][/I][/B]LeaderGamePW = [COLOR="DimGray"]"default"[/COLOR];			[COLOR="Green"]// The password used for the games you want to join[/COLOR]
[COLOR="Navy"][B][I]var [/I][/B][/COLOR]LeecherAccounts = [[COLOR="DimGray"]"DefaultAccount"[/COLOR]];	[COLOR="Green"]// List ALL accounts that use leechscript[/COLOR]
Der Teil gehört über das "// DONT EDIT ANYTHING BELOW THIS"

Variablen (vorgegeben)/Initialisierung:
Code:
[COLOR="Green"]// Set Leecher Settings[/COLOR]
[B][I][COLOR="Navy"]var [/COLOR][/I][/B]isLeecher = [I][B][COLOR="Navy"]false[/COLOR][/B][/I];
[B][I][COLOR="Navy"]for [/COLOR][/I][/B]([B][I][COLOR="Navy"]var [/COLOR][/I][/B]i = [COLOR="Red"]0[/COLOR]; i < LeecherAccounts.length; i++)
{
	[B][I][COLOR="Navy"]if [/COLOR][/I][/B](me.account == LeecherAccounts[i])
	{
		isLeecher = [B][I][COLOR="Navy"]true[/COLOR][/I][/B];
	}
}
[B][I][COLOR="Navy"]var [/COLOR][/I][/B]OldGame = [COLOR="DimGray"]''[/COLOR];
[I][COLOR="Navy"]var[/COLOR][/I] Check = [COLOR="Red"]1[/COLOR];
Der Teil gehört unter das "// DONT EDIT ANYTHING BELOW THIS" und vor die NTMain() Funktion

Und eine If .. else .. - Schleife (+ paar Variablen):
Code:
[B][I][COLOR="Navy"]case [/COLOR][/I][/B][COLOR="Red"]1[/COLOR]:  // Lobby
	[B][I][COLOR="Navy"]var [/COLOR][/I][/B]_Lines;
	[B][I][COLOR="Navy"]var [/COLOR][/I][/B]chat;
	[B][I][COLOR="Navy"]var [/COLOR][/I][/B]_Game = [COLOR="DimGray"]""[/COLOR];
	[B][I][COLOR="Navy"]var [/COLOR][/I][/B]_Errors = [COLOR="DimGray"]""[/COLOR];
	[B][I][COLOR="Navy"]var [/COLOR][/I][/B]_FoundLeader = [B][I][COLOR="Navy"]false[/COLOR][/I][/B];
	[B][I][COLOR="Navy"]var [/COLOR][/I][/B]_LineWithName = [COLOR="DimGray"]""[/COLOR];

	[B][I][COLOR="Navy"]if [/COLOR][/I][/B](isLeecher)
	{
		Delay([COLOR="Red"]1000[/COLOR]);
		[B][I][COLOR="Navy"]if [/COLOR][/I][/B](chat = controlData.get(controlData.controls.lobby.chat.textBox.channelText))
		{
			_Lines = chat.GetText();
			[B][I][COLOR="Navy"]if [/COLOR][/I][/B](_Lines.length > [COLOR="Red"]1[/COLOR])
			{
				[B][I][COLOR="Navy"]for [/COLOR][/I][/B]([B][I][COLOR="Navy"]var [/COLOR][/I][/B]_Friend = [COLOR="Red"]0[/COLOR]; _Friend < _Lines.length; _Friend++)
				{
					[B][I][COLOR="Navy"]if [/COLOR][/I][/B](_Lines[_Friend].indexOf(LeaderAccountName) > [COLOR="Red"]-1[/COLOR])
					{
						_Game = [COLOR="DimGray"]''[/COLOR];
						_FoundLeader = [B][I][COLOR="Navy"]true[/COLOR][/I][/B];
						[B][I][COLOR="Navy"]var [/COLOR][/I][/B]regOfflineEnglish=/^\d\s?:\s?(\w*)\s?,\s?offline\s*$/gi;

						[B][I][COLOR="Navy"]if [/COLOR][/I][/B](_Lines[_Friend].match(regOfflineEnglish))
						{
							_Errors += (_Errors == [COLOR="DimGray"]''[/COLOR] ? [COLOR="DimGray"]''[/COLOR] : [COLOR="DimGray"]' '[/COLOR]) + [COLOR="DimGray"]'leader is offline'[/COLOR];
							Delay([COLOR="Red"]5000[/COLOR]);
							[B][I][COLOR="Navy"]break[/COLOR][/I][/B];
						}

						_LineWithName = _Lines[_Friend + [COLOR="Red"]2[/COLOR]];
						[B][I][COLOR="Navy"]if [/COLOR][/I][/B](_LineWithName === undefined)
							_LineWithName = _Lines[_Friend + [COLOR="Red"]1[/COLOR]];

						[B][I][COLOR="Navy"]if [/COLOR][/I][/B](_LineWithName !== undefined)
							_LineWithName = _LineWithName.replace(/^\s+/,[COLOR="DimGray"]""[/COLOR]);
						[B][I][COLOR="Navy"]else[/COLOR][/I][/B]
							[B][I][COLOR="Navy"]break[/COLOR][/I][/B];

						[B][I][COLOR="Navy"]if [/COLOR][/I][/B](_LineWithName.indexOf([COLOR="DimGray"]'called'[/COLOR]) > [COLOR="Red"]-1[/COLOR])
							_Game = _LineWithName.substring(_LineWithName.indexOf([COLOR="DimGray"]'called'[/COLOR])+[COLOR="Red"]7[/COLOR],_LineWithName.indexOf([COLOR="DimGray"]'.'[/COLOR]));
						[B][I][COLOR="Navy"]else[/COLOR][/I][/B]
							_Game = _LineWithName.substring([COLOR="Red"]0[/COLOR],_LineWithName.indexOf([COLOR="DimGray"]'.'[/COLOR]));
							
						_LineWithName = [COLOR="DimGray"]''[/COLOR];

						[B][I][COLOR="Navy"]if [/COLOR][/I][/B](_Game != [COLOR="DimGray"]''[/COLOR] && _Game != OldGame)
						{
							controlData.click(controlData.controls.lobby.button.join);
							Delay([COLOR="Red"]200[/COLOR]);
							controlData.setText(controlData.controls.lobby.join.editBox.gameName, _Game);
							Delay ([COLOR="Red"]200[/COLOR]);
							controlData.setText(controlData.controls.lobby.join.editBox.password, LeaderGamePW);
							Delay ([COLOR="Red"]1234[/COLOR]);
							controlData.click(controlData.controls.lobby.join.button.joinGame);
							Check = [COLOR="Red"]1[/COLOR];
						}
						[B][I][COLOR="Navy"]else[/COLOR][/I][/B]
						{
							[B][I][COLOR="Navy"]if [/COLOR][/I][/B](!_Errors)
								_Errors = [COLOR="DimGray"]'leader is not in game.'[/COLOR];
						}
					}
				}
			}
			[B][I][COLOR="Navy"]if [/COLOR][/I][/B](!_FoundLeader && joinChannelInChat)
			{
				[B][I][COLOR="Navy"]if [/COLOR][/I][/B](_Errors)
					Say([COLOR="DimGray"]'Errors : '[/COLOR] + _Errors);
				[B][I][COLOR="Navy"]else[/COLOR][/I][/B]
					Delay([COLOR="Red"]15000[/COLOR]);
			}
		}
		[B][I][COLOR="Navy"]else[/COLOR][/I][/B]
		{
			Delay([COLOR="Red"]1500[/COLOR]);
		}
		_Errors = [COLOR="DimGray"]''[/COLOR];
		[B][I][COLOR="Navy"]if [/COLOR][/I][/B](_Game != [COLOR="DimGray"]''[/COLOR])
			OldGame = _Game;
		[B][I][COLOR="Navy"]break[/COLOR][/I][/B];
	}
	[B][I][COLOR="Navy"]else[/COLOR][/I][/B]
	{
	[COLOR="DarkGreen"]// der original Code kommt hier hin
	// das ist alles* zwischen "case 1: //Lobby" und dem "break;" am Ende[/COLOR]
	}
	[B][I][COLOR="Navy"]break[/COLOR][/I][/B];
Das ist der einzige etwas kompliziertere Teil, ihr müsst eure locationAction(location) oder wie die bei euch heisst finden und da den "case 1: // Lobby" finden und anpassen. Sprich den original Code ausschneiden und im "else" einfügen (da wo der Kommentar ist).

Wenn ihr wollt dass eure Leecher einen Channel betreten, dann müsst ihr nicht ganz alles ins "else" kopieren sondern einen kleinen Teil vor das "if".

*Den Teil hier (oder ähnlich je nach Version) könnt ihr direkt nach das "case 1: // Lobby" kopieren, wenn der Leecher den Channel auch joinen soll (ist aber nicht nötig).
Code:
	[B][I][COLOR="Navy"]if [/COLOR][/I][/B](location.id == [COLOR="Red"]1[/COLOR] && joinChatAfterLogin)
	{
		Delay(Random(waitBeforeEnterChatMin, waitBeforeEnterChatMax));
		controlData.click(controlData.controls.lobby.button.enterChat);
		[B][I][COLOR="Navy"]break[/COLOR][/I][/B];
	}
Hab das Mal für den standard D2NT gemacht, zwar nicht getestet aber ich bin zuversichtlich :)

Achtung!: Ihr müsst uU folgende 2 Variablen anpassen:
controlData
joinChatAfterLogin

Die sind z.B. bei Muddy anders geschrieben. Schaut also kurz wie die bei eurer Version heissen, sollte aber eigentlich meistens korrekt sein.


edit: (Sop nun sollte auch in belebten Chats alles klappen ;))
Das PW für die NTBot.ntj für Muddy V1.2 (ohne AutoMule!) ist muddy
04/30/2011 16:22 Eichenlaub#2
Beim Muddys Bot heißt der Code dann:
Code:
		if(location.id == 1 && JoinChatAfterLogin)
		{
			Delay(Random(WaitBeforeEnterChatMin, WaitBeforeEnterChatMax));
			ControlData.click(ControlData.controls.lobby.button.enterChat);
			break;
		}
und wie genau soll das funktionieren? Bei mir tut sich nichts! Der Leader macht seinen Run ganz normal und der Leecher loggt ein, joint channel (publich nicht den von mir angegebenen?), wartet ein wenig und dann restartet er (Location Loop Restart) :(

habe noch hinzugefügt:
Code:
				Delay(500);
				
				Say("/join " + (JoinRandomChannel ? _randomChannel : JoinChannelInChat));
				JoinedChannel = true;
damit er meinen benannten channel joint. aber wie geht es von hier aus weiter? warum joint er keine spiele vom leader char?
04/30/2011 17:46 ldevil#3
Bei Muddy musste noch etwas mehr anpassen ;)

[Only registered and activated users can see links. Click Here To Register...]

Da hab ich das erklärt. Und da ist auch der Code komplett auf Muddies angepast. Hast du den Leecher auch in die "ChannelUsers" eigetragen?

Code:
ChannelUsers.push("Acc oder Charname");
04/30/2011 21:49 DeathFromHeaven#4
hmm hab Muddy's und auch die Funktionen, etc, aus dem entsprechenden Forum, aber er macht bei mir gar nix, also der leecher :(
sind beide im selben Channel...

hab mir mal selber ein paar Statustext-Anzeigen eingebaut, um zu wissen, wo er jetzt ist, und er erkennt das er leecher ist und wartet auch brav auf die Frienmessage, aber irgendiwe erkennt er sie anscheinend, nicht, jedenfalls wartet er auch nachdem die entsprechende Message kam immernoch darauf :(
05/01/2011 00:11 ldevil#5
Ich hab ne Idee an was es liegt, evtl. hab ich vom Auto Mule her ne Funktion schon drin die ihr auch braucht... ich muss das wohl Mal mit dem Original Muddies testen :)

omg, was ein bescheuerter Fehler...

Da hat's ein paar "else;" das muss natürlich nur "else" sein,... hab wohl das Replace für Syntaxhighlight vergeigt.


edit: Sop ist getestet, ohne die doofen "else;" geht's... da will man's schön anschaulich machen und dann baut man sowas ein -.-
05/01/2011 00:17 DeathFromHeaven#6
XD aber ich hab ja dein Automulee auch drin, wahrscheinlich nicht das, was du jetzt hast, aber die Version die du mir mal geschickt hast, falls es dir hilft :P
05/01/2011 00:50 ldevil#7
Quote:
Originally Posted by DeathFromHeaven View Post
XD aber ich hab ja dein Automulee auch drin, wahrscheinlich nicht das, was du jetzt hast, aber die Version die du mir mal geschickt hast, falls es dir hilft :P
Ok, hab deinen Post nicht gesehen, aber ist jetzt gefixt. Einfach nochmal den "case 1: // Lobby" kopieren.

Jetzt muss ich nur noch rausfinden wie ich den Gamename hinbekomm wenn er über 2 Zeilen geht ;) aber solange du keinen Abstand im Namen verwendest geht's richtig gut.
05/01/2011 10:08 Eichenlaub#8
so script funktioniert nun richtig - danke :)

Jetzt noch einmal eine dumme Frage von mir: was genau kann ich nun damit anstellen? Lasse meinen Leader seinen Run ganz normal machen und der Leecher das NTFollow.ntj script. Aber TPs werden trotzdem nicht aufgemacht??
05/01/2011 12:23 Snake1972#9
kannst du bitte das sofort da mit rein basteln ^^
"AutoMule mit Muddies D2NT "
05/01/2011 12:59 Jatu88#10
Quote:
Originally Posted by Eichenlaub View Post
so script funktioniert nun richtig - danke :)

Jetzt noch einmal eine dumme Frage von mir: was genau kann ich nun damit anstellen? Lasse meinen Leader seinen Run ganz normal machen und der Leecher das NTFollow.ntj script. Aber TPs werden trotzdem nicht aufgemacht??
Du musst in der Config vom leader auch public mode auf true setzen sonst macht er keine tps auf! :)
05/01/2011 14:21 ldevil#11
Quote:
Originally Posted by Snake1972 View Post
kannst du bitte das sofort da mit rein basteln ^^
"AutoMule mit Muddies D2NT "
Ja das wird dann im nächsten Release dabei sein, muss nur Zeit finden... hat auch noch paar andere kleine Anpassungen, v.a. hab ich versucht alles unnötige raus zu löschen damit's übersichtlich wird.

Quote:
Originally Posted by Jatu88 View Post
Du musst in der Config vom leader auch public mode auf true setzen sonst macht er keine tps auf! :)
Genau. Halt einfach dafür, dass du nur noch einen Entry Point hast und der unterstützt nun auch Leecher. Solls einfach schöner und einfacher machen ;)
05/01/2011 17:24 Eichenlaub#12
Quote:
Originally Posted by Jatu88 View Post
Du musst in der Config vom leader auch public mode auf true setzen sonst macht er keine tps auf! :)
PublicMode auf true habe ich schon probiert - trotzdem tut sich nichts...

Leader macht seine Runs (Sorc mit Tele) und mein Leecher (Paladin) kommt ihr eh nicht hinterher. Einzig die Chance auf NoDrop wird dadurch verringert...

Eventuell muss ich warten bis ich ne Enigma fertig habe??
05/01/2011 18:25 ldevil#13
Quote:
Originally Posted by Eichenlaub View Post
PublicMode auf true habe ich schon probiert - trotzdem tut sich nichts...

Leader macht seine Runs (Sorc mit Tele) und mein Leecher (Paladin) kommt ihr eh nicht hinterher. Einzig die Chance auf NoDrop wird dadurch verringert...

Eventuell muss ich warten bis ich ne Enigma fertig habe??
Du musst natürlich schon Scripte machen, die für das ausgelegt sind was glaub ich ohne Modifikation nur Dia und Baal sind. Den Leecher solltest du dann mit Dia / Baal Leech-Fight Script laufen lassen. Ansonsten musst du "von Hand" jeweils vor dem Boss ein TP machen. Dazu diese Zeilen in die Bot Scripte einfügen:
Code:
NTM_MakeTP();
Say("COMMAND FÜR FOLLOW BOT");
Wobei du natürlich das passende Kommando für den Follow Bot brauchst. Und wohl jeweils noch am Anfang von jedem Script ein Say("wait") oder was das command bei dir ist, damit der Followbot nicht versucht mit zu laufen ;)

Das was du willst, hat allerdings mehr mit den Scripts an sich zu tun als mit dem EntryPoint. (Evtl. verwirrt da der Titel etwas ;))
05/02/2011 12:45 Eichenlaub#14
Achso, ja das klingt einleuchtend ;)

Dann werde ich noch ein wenig die scripte aufpeppeln. Wird denn auch mein Leader auf den Leecher warten?
05/02/2011 15:06 ldevil#15
Quote:
Originally Posted by Eichenlaub View Post
Achso, ja das klingt einleuchtend ;)

Dann werde ich noch ein wenig die scripte aufpeppeln. Wird denn auch mein Leader auf den Leecher warten?
Du könntest es natürlich so schrieben, dass er das macht, nur wäre das extrem kompliziert und wohl kaum den Aufwand wert. Oder du baust einfach ein kurzes Delay nach dem Portal-Cast ein (müsstest halt testen wie lange das in etwa sein muss).