Ein Paar Fragen zu muddys d2nt

11/21/2011 14:50 Aion2k11#1
Hallo, hoffe es ist im richtigen unter Forum.

zu meinen Fragen:

1. Wie bzw wo kann ich beeinflussen, was ingame beim starten eines bot scripts gemacht wird? (will bei einem speziellen script nicht, dass die chars erstmal kaufen/verkaufen/truhe besuchen/etc gehen, sondern direkt an den zielort des scripts)

2. Wie benutze ich die funktion NT_GameMsgEvents(msg, type)
wenn ich auf eine bestimmte nachricht von einem bestimmten char eine bestimmte Aktion ausführen lassen will?
(als Bsp. was passiert hier?)
Code:
	if(type == 0 && _msg.indexOf(NTConfig_Leader.toLowerCase()) > -1 && MWConfig_Announcements.BaalTpSafe && _msg.indexOf(MWConfig_Announcements.BaalTpSafe.toLowerCase()))
3. Situation EntryPoint = NTBotLeech.ntj
In welcher Datei bzw an welcher Stelle steht die Anweisung, dass der Leechende Char direkt nach dem verlassen des Leaders das game verlässt?
€: bin über die Antwort zu Nr. 3 gestolpert :)
Soweit erstmal
hoffe ihr könnt mir helfen :)
Grüße
11/21/2011 15:09 vony#2
zu 2. ist der code sowieso falsch er müsste so aussehen

Code:
if(type == 0 && _msg.indexOf(NTConfig_Leader.toLowerCase()) > -1 && MWConfig_Announcements.BaalTpSafe && _msg.indexOf(MWConfig_Announcements.BaalTpSafe.toLowerCase()) > -1)
fehlte der > -1 check am ende ;)
11/21/2011 15:29 Aion2k11#3
danke für den hinweis :) wobei ich die direkt aus der NTBaalLeech.ntj kopiert hatte und ich kann mich nicht dran entsinnen, in der datei was verändert zu haben.
11/21/2011 15:41 vony#4
Ist auch ein Fehler im Script ansich.
11/21/2011 15:50 Aion2k11#5
I see.
auskennen tust du dich aber nicht genug, um mir sagen zu können, wie ich so eine abfrage gestalten muss bzw was die einzelnen befehle bewirken?
11/21/2011 20:06 Muddy Waters#6
1.
Du müsstest die NTTMGR_TownManager() Aufrufe entfernen bzw. auskommentieren. Sinnvoll ist dies allerdings nicht.

2.
Da passiert gar nichts, da du dort lediglich die Bedingung einer if-Anweisung gepostet hast. "Passieren" tut das, was im nachfolgenden Anweisungsblock respektive der nachfolgenden Zeile steht.

Um die ganze Zeile zu verstehen, braucht du ein bisschen Grundwissen im Bereich logischer Verknüpfungen. Auch solltest du wissen, was eine Kurzschlussauswertung ist - weniger der Begriff ist von interesse, mehr das, was er meint, nämlich dass die Auswertung boolscher Ausdrücke frühzeitig abgebrochen wird, wenn ein gesamtausdruck schon nach dem Auswerten eines Teilausdrucks eindeutig definiert ist. Klingt zunächst mal schwierig, ist es aber nicht, denn es meint ganz einfach folgendes:
Code:
var _thisIsFalse = false && true;
var _thisIsTrue = true || false;
Bei beiden Ausdrücken wird der jeweils zweite Ausdruck nicht ausgewertet werden.

Genau das gilt auch für die von dir genannte Bedingung. Die Handler Funktion bekommt als Argumente type und msg übergeben. type ist hierbei ein Objekt vom Typ number, welches den Typ der Nachricht beschreibt (Chat Nachricht, Server Nachricht, etc.), msg ist ein Objekt vom Typ string, welches die eigentliche Nachricht beinhaltet.

Kommen wir auf den Ausdurck zurück, der da war:
Code:
(type == 0 && _msg.indexOf(NTConfig_Leader.toLowerCase()) > -1 && MWConfig_Announcements.BaalTpSafe && _msg.indexOf(MWConfig_Announcements.BaalTpSafe.toLowerCase()) > -1)
Es wird also zunächst überprüft, ob type den Wert 0 hat, was nichts anderes heißt, dass gerade irgendein Spieler im Chatgeschrieben hat.
Ist das nicht der Fall, wird wie Auswertung schon abgebrochen (vgl. Kurzschlussauswertung) und - falls vorhanden in den else-Zweig gesprungen.

Wir nehmen jetzt der Einfachheit mal an, dass der Ausdruck true werden soll.
type ist demnach gerade 0, _msg ist hier vermutlich der in irgendeiner Form formatierte Parameter (gewöhn dir an, Quellcode immer mit genügend Kontext zu posten), NTConfig_Leader eine Variable vom Typ string, die den Namen des Leaders beinhaltet, MWConfig_Announcements.BaalTpSafe ebenfalls ein Member vom Typ string, der die in der globalen Config festgelegte Nachricht bei sicherem TP beinhaltet.

Wann wird der Ausdruck also true?
Im Prinzip ganz einfach, gerade dann, wenn type identisch 0 ist UND die Nachricht (also der String _msg bzw. msg) den Namen des Leaders beinhaltet UND eine Nachricht bei sicherem TP definiert ist UND die Nachricht bei sicherem TP enthalten ist. Sind alle 3 Bedingungen erfüllt, wird der im Anweisungsblock stehende Code ausgeführt.

Sofern die if-Anweisung keinen else-Zweig hat, kannst du diese übrigens durch 4 verschachtelte if-Anweisungen ersetzen, die zusammen eine äquivalente Funktion erfüllen.

Das sähe dann so aus:
Code:
if(type == 0 && _msg.indexOf(NTConfig_Leader.toLowerCase()) > -1 && MWConfig_Announcements.BaalTpSafe && _msg.indexOf(MWConfig_Announcements.BaalTpSafe.toLowerCase()) > -1)
{
	// Do somethin...
}
// Erfüllt dieselbe Funktion wie:
if(type == 0)
{
	if(_msg.indexOf(NTConfig_Leader.toLowerCase()) > -1)
	{
		if(MWConfig_Announcements.BaalTpSafe)
		{
			if(_msg.indexOf(MWConfig_Announcements.BaalTpSafe.toLowerCase()) > -1)
			{
				// Do somethin...
			}
		}
	}
}
Ich weiß, dass gerade diese logischen Sachen am Anfang schwer sind, aber je mehr du dich damit befasst, desto leichter wird das und desto weniger muss man überhaupt noch darüber nachdenken...da passiert es dann auch schonmal, dass man eine -1 vergisst. :o

3.
Hast du ja schon selbst gefunden. :)

LG
Muddy
11/22/2011 02:22 D2_sid#7
Aber wie du schon gesagt hast, interessant ist eigentlich, was danach passiert. Man könnte also diese Funktion (Sorry falls Funktion das falsche Wort ist - kenne ich eigentlich gar nicht aus) benutzen, um danach ein anderes Script auszuführen. Denn die Werte sind bis hier hin ja alle schon bestimmt.
11/22/2011 13:11 Aion2k11#8
Danke für die Antworten :) ging ja fix

zu 1. Auch wenns generell nicht sinnvoll seien mag, diese Funktion nicht aufzurufen, allerdings läufts nun gut, das sich meine chars am anfang eines games versammeln und sich nen bo vom barb abholen, ohne das dies ewig dauert :) hab ich mir gestern einen abgebrochen, bis das endlich lief, dass gewartet wird auf die anderen chars und erst dann gebo'ed wird. perfekt isses allerdings immer noch nicht - falls nen char wieder weggeht vom sammel wp wird dies nicht registriert. aber auch das werd ich wohl noch hinbekommen.

zu 2. Danke für die ausführliche veranschaulichung. Denke aber auch, ich hab meine Frage nicht genau genug formuliert. Den if satz hab ich soweit noch erkannt - wär auch schlimm wenn nicht :D Was ich eigt wissen wollte, war, was die einzelnen Bedingungen Bedeuten - sollte ich nun mindestens ansatzweise wissen. Werde später nochmal testen, eine abgeänderte Variante davon zum laufen zu bekommen.

nochn feedback zu 3. Durchs abschalten bzw verändern des Verlassens freezen nun bisher keine D2's mehr ein. (MPM war für mich keine Option, da Win XP..)

Grüße