Register for your free account! | Forgot your password?

You last visited: Today at 18:42

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

Advertisement



D2NT "Please Wait" Loop

Discussion on D2NT "Please Wait" Loop within the Diablo 2 Programming forum part of the Diablo 2 category.

Reply
 
Old   #1
 
eXoo~'s Avatar
 
elite*gold: 0
Join Date: Dec 2010
Posts: 73
Received Thanks: 12
D2NT "Please Wait" Loop

Kennen ja bestimmt einige, dass der Bot manchmal nach verlassen eines Spiels in ner "Please Wait" Schleife steckt und nicht weiterläuft

Hab versucht das mal zu fixen mit:
Code:
case 25: // Lobby - Please Wait
     			 if(!locationTimeout(pleaseWaitTimeout, location))
      			 sendEventToOOG(D2NT_MGR_RESTART,location.name,5);
      			 break;
in NTBot.ntj

Allerdings startet er nach ca 90% der Spiele komplett neu, was da ja auch eigentlich steht... -.-"

Jemand ne Idee wie ich das hinkriege, dass er nur dann neustartet, wenn er wirklich in der Schleife hängt und nicht nur nen kleinen Delay?:S
eXoo~ is offline  
Old 04/12/2011, 18:43   #2
Administrator
 
Muddy Waters's Avatar
 
elite*gold: 41364
Join Date: Jan 2010
Posts: 22,727
Received Thanks: 12,652
Mit dem Ansatz wird das nichts. Es wäre vielleicht hilfreich, wenn man sich anschaut, was die locationTimeout() eigentlich macht, bevor man deren Rückgabewert auswertet.

In Kurzform:
Die Funktion führt ein Delay aus, solange sich der Char an einer festgelegten Location befindet. (Wie der Begriff Location zu verstehen ist, ist der controlInfo Klasse zu entnehmen)
Ändert sich die Location in der Zwischenzeit, wird die Funktion vorzeitig abgebrochen. Rückgabewert ist aber in jedem Fall der Vergleich der Location zu Anfang im Vergleich zur Location zum Ende der Funktion hin.

Hat sich die Location verändert, gibt die Funktion true zurück, ist die Funktion nach wie vor dieselbe, wird false zurückgegeben.

Der Punkt ist ganz einfach, dass die Funktion eben nicht nur dann false zurückgibt, wenn das Fenster hängt und eine Endlosschleife durchlaufen wird.
Wie du schon gemerkt hast, passiert das auch durchaus mal, während alle in Ordnung ist.

Ich habe die Problematik daher bei mir etwas anders gelöst, wobei meine Lösung eigentlich erschreckend einfach ist.

Hier mal meine aktuelle NTBot.ntj:

Ich habe mal ein paar interessante Teile hervorgehoben, auch wenn man es im passigen Editor sicherlich noch sehr viel besser sieht.

Die Lösung ergibt sich fast automatisch, nachdem man festgestellt hat, dass auch während einer Endlosschleife immer wieder die Funktion NT_LocationAction() aufgerufen wird.
Man macht nun eigentlich nichts anderes, als mitzuzählen, wie oft diese Funktion von derselben location aus aufgerufen wird.
Dazu nimmt man sich ein globales Array und speichert darin zum einen das location Objekt, zum anderen die Anzahl der durchläufe.

In meinem Fall heisst dieses globale Array LocationLoops.

Nun braucht man nurnoch eine kleine Funktion, die das Mitzählen übernimmt.
Bei mir heisst diese Funktion MW_CheckLocationLoops(), als Parameter wird das location Objekt der aktuellen Position übergeben, welches dann mit dem vorher gespeicherten verglichen wird.

Die Implementierung der Funktion sieht so aus:
Code:
function MW_CheckLocationLoops(location)
{
	if(!location)
		return false;
	
	if(!LocationLoops[0] || location.id != LocationLoops[0].id)
	{
		LocationLoops[0] = location;
		LocationLoops[1] = 0;
	}
	else if(LocationLoops[0].id != 5)
	{
		LocationLoops[1]++;
		
		if(LocationLoops[1] >= MaximumLocationLoops)
		{
			if(LocationLoops[1] < 1000)
				NT_SendEventToOOG(D2NT_MGR_PRINT_LOG, "ÿBE0000Location Loop Restart!;ÿc1Location Loops: " + LocationLoops[1] + "\nÿBE0000Location: " + LocationLoops[0].name + "\nÿBE0000Location ID: " + LocationLoops[0].id, 0);
			
			LocationLoops[1] = 1000; // Make sure the location loop notification is only shown once
			
			NT_SendEventToOOG(D2NT_MGR_RESTART, location.name, 0);
		}
	}
	
	return true;
}
Nun passiert eigentlich genau das, was ich oben schon gesagt habe.
Es wird zunächst überprüft, ob das übergebene location Objekt mit dem zuletzt gespeicherten identisch ist respektive die location ids dieselben sind.

Ist dem nicht so, wird das übergeben Objekt im globalen Array zwischengespeichert, sowie der Zähler auf Null gesetzt.
Sind die ids gleich und ist die Location nicht "Join Game" (id == 5), wird nur der Zähler inkrementiert.

Ausserdem wird noch überprüft, ob der Zähler mit der letzten Inkrementierung den vorher festgelegten Grenzwert überschritten kann.
Ist dies der Fall, wird ein Restart des Fensters durchgeführt, sowie eine Ausgabe ins Common Log des Managers ausgeführt.

Die Zählvariable wird ausserdem auf einen unrealistisch hohen Wert gesetzt, um zu verhindern, dass die Ausgabe ins Common Log mehrfach durchgeführt wird.

Das ist es auch eigentlich schon. Alles in allem extrem einfach und eine Arbeit von 5-10 Minuten.

LG
Muddy
Muddy Waters is offline  
Old 04/12/2011, 19:19   #3
 
eXoo~'s Avatar
 
elite*gold: 0
Join Date: Dec 2010
Posts: 73
Received Thanks: 12
Werd das ganze mal overnight testen.
Sofern es funktioniert lass ich dir gerne ne Belohnung zukommen :P

Edit:
Also für den Mainbot funzt es.
Problem habe ich allerdings mit Leechern
da diese /f l commands im channel spammen( quasi loops)
gibt es immer restart nach 5 /f l spams
hab die maxloop anzahl schon aufgedreht, aber trotzdem fliegen sie nach der zahl dann
lässt sich da irgendwie ne ausname für /f l spams einfügen?
eXoo~ is offline  
Old 04/12/2011, 21:56   #4
Administrator
 
Muddy Waters's Avatar
 
elite*gold: 41364
Join Date: Jan 2010
Posts: 22,727
Received Thanks: 12,652
Auch nach 30 Minuten darfst auch du noch zum Button greifen.

Bau eben eine Ausnahme für bestimmte Chars ein. Oder sollen die das auch mit benutzen?

In dem Fall könnte man auch einfach die betroffene Location ignorieren, so wie ich das bei mir mit der Location "Join Game" mache.

LG
Muddy
Muddy Waters is offline  
Reply


Similar Threads Similar Threads
Kann mir bitte jemmand eine Hmachi HP erstellen """""SOS HELP""""
09/15/2010 - Metin2 Private Server - 11 Replies
SO wie der Titel schon sagt ich suche einen der mir per Teamviwer eine hp machen kann habe schon alles ausprobiert aber es klappt nie!!!! PLS HELP...
D2NT: Problem "please wait"
04/22/2010 - Diablo 2 - 0 Replies
Moin, ab und zu kommt es vor das 2 Bots zur selben Zeit versuchen, ein neues Spiel aufzumachen. Einer von beiden gerät dann in einen Zustand wo im D2NT Controlcenter und im Game selbst immer "please wait" steht und er kommt dort von selbst nicht wieder raus. Macht die Felder für Gamenamen etc. nicht mehr leer sondern hängt alles nur noch hinten dran und scheint dort wirklich von allein nicht mehr rauszukommen. Kennt jemand das Problem?



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


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.