Buhuhuhu ich programmiere so schlecht ...

04/22/2012 23:37 whoranzone123#1
Ich komm grad mal wieder nicht weiter bei meinen Problemen ....
Momentan lasse ich 3 Bots im selben Spiel laufen. Ich möchte, dass meine Leecher vor Skriptbeginn erstmal abfragen ob der Leader noch am aktuellen Skript ist. Es passiert von Zeit zu Zeit, dass die Bots nichtmehr Synchron laufen und im schlimmsten Fall passierts, dass ein Bot in einem Spiel hängen bleibt und nichts passiert.

Grundsätzlich: ich benutze Bluebirds Version des D2NT.

Ich habe nun beispielsweise folgendes im Dialeechskript eingebaut:

Code:
NTConfig_Leader = "shoooopp";
scheffe = GetPlayerUnit(NTConfig_Leader);
if (scheffe.areaid >= 109)
{
  NTC_SendMsgToScript("NTBotGame.ntj", "SCRIPT_END");
}
Allerdings tut sich rein garnichts, vollkommen egal wo der Leader steht.
Was habe ich wieder übersehen / falsch gemacht ?

Danke schonmal.
04/23/2012 00:30 Northern Light#2
use muddys ;)
04/23/2012 19:49 whoranzone123#3
Und wo genau muss ich das jetzt im Programmcode einfügen ?

:P

Ja das habe ich mir auch schon überlegt... Das Problem ist nur, dass ich bei meinem Bot mittlerweile so viel "entwickelt" (seis verändert oder einfach nur verschlechtert ^^) habe, dass es wohl erstmal wieder eine Weile dauern wird bis Muddys bei mir so läuft wie ich das gerne hätte ^^
04/24/2012 17:15 Stibi#4
deklarier mal die variable :D
04/24/2012 19:41 Muddy Waters#5
Die fehlende Deklaration ist nicht das Problem, sofern diese fehlt, wird die Variable implizit als global deklariert. Obwohl du recht hast, anständige, explizite Deklarierungen sind sauberer, weil sie klarere Verhältnisse schaffen und daher grundsätzlich vorzuziehen.

Woher weißt du, dass GetPlayerUnit Argumente akzeptiert? Das wird eigentlich in sämtlichen standard Libraries zu Fuß gelöst, darum wäre ich mir nicht so sicher, ob die Funktion Selektoren annimmt. Aber wenn sie dies tut, dann ist der Vergleich definitiv case sensitive - ein Grund mehr, das ganze besser zu Fuß über eine geignete Funktion zu machen. Lass dir am besten mal scheffe ausgeben und stell sicher, dass es sich dabei um ein valides Objekt handelt.
04/25/2012 00:18 whoranzone123#6
Quote:
Originally Posted by Muddy Waters View Post
Die fehlende Deklaration ist nicht das Problem, sofern diese fehlt, wird die Variable implizit als global deklariert. Obwohl du recht hast, anständige, explizite Deklarierungen sind sauberer, weil sie klarere Verhältnisse schaffen und daher grundsätzlich vorzuziehen.

Woher weißt du, dass GetPlayerUnit Argumente akzeptiert? Das wird eigentlich in sämtlichen standard Libraries zu Fuß gelöst, darum wäre ich mir nicht so sicher, ob die Funktion Selektoren annimmt. Aber wenn sie dies tut, dann ist der Vergleich definitiv case sensitive - ein Grund mehr, das ganze besser zu Fuß über eine geignete Funktion zu machen. Lass dir am besten mal scheffe ausgeben und stell sicher, dass es sich dabei um ein valides Objekt handelt.
Die Variable ist deklariert.
Dass GetPlayerUnit Argumente akzeptiert wusste ich nicht, allerdings fand ichs seltsam dass es leere Klammern nach der Funktion gibt und dachte dass der Nick eines Spielers da am meisten Sinn machen würde ^^
Was bedeutet zu Fuß ?

Und vielleicht noch wichtiger: Was muss ich tun um mir die Variable ausgeben zu lassen ?

Ich dachte ich hatte mal eine Beschreibung irgendwo (vielleicht auch hier im Forum...) zu der Funktion gefunden. Inklusive aller Eigenschaften wie .areaid usw. allerdings habe ich die Erklärung nichtmehr gefunden als ich da rumgebastelt habe :(
04/25/2012 12:40 Muddy Waters#7
Mit solchen Annahmen wäre ich vorsichtig, vor allem wenn du noch nichtmal eine Ahnung hast, wie du denn Überprüfen kannst, ob deine Vermutung stimmt. ;)

Zum Thema Ausgabe:
Gemeint ist eine simple Ausgabe auf die Konsole, nicht mehr und nicht weniger.

Code:
Print("Leader: " + scheffe);
Sofern scheffe definiert ist, würde der Rückgabewert von scheffe.toString() ausgegeben; ist scheffe nicht definiert dann undefined oder in diesem Fall vielleicht auch null.

Und zu Fuß heißt hier schreib dir eine Funktion, in der du die mit GetPlayerUnit() angeforderte (einfach verkettete) Liste von Objekten durchläufst und gib bei einer Übereinstimmung den Pointer aufs aktuelle Objekt zurück, oder sofern dieses nicht gefunden werden kann, eben den Nullpointer.

Das ist schnell gemacht, funktioniert sicher und sieht dann in etwa so aus:
Code:
function GetLeaderUnit(name)
{
	var _unit = GetPlayerUnit();
	
	while(_unit && _unit.GetNext())
	{
		if(_unit.name.toLowerCase() == name.toLowerCase())
			return _unit;
	}

	return null;
}