Register for your free account! | Forgot your password?

Go Back   elitepvpers > Other Online Games > Diablo 2 > Diablo 2 Programming
You last visited: Today at 05:56

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

Advertisement



Verbesserungen am D2NT Chaos Script

Discussion on Verbesserungen am D2NT Chaos Script within the Diablo 2 Programming forum part of the Diablo 2 category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: Dec 2010
Posts: 152
Received Thanks: 23
Talking Verbesserungen am D2NT Chaos Script

Hier rein kommen alle Verbesserungen sowie Verbesserungsvorschläge zum D2NT Chaos Script
[Schon mal von Leuten gehört, die gemeint haben, dass es sich nicht lohnt, das D2NT Chaos Script zu verbessern, weil es ganz einfach bessere Bots für Chaos gibt? D2NT hat großes Potenzial, das es nur zu fördern gilt!]



Hi,
ich wollte euch mal fragen, ob ihr wisst, wo die Funktion für die Baal Wave PreAttack ist und wie sie funktioniert.
Ich habe mir die NTBaal angesehen und dort nichts gefunden. Glaube nicht, dass ich die Funktion übersehen habe.

Könnt ihr mir außerdem sagen, wie sich Dias state ändert wenn er spawnt?
D2NT findet Diablo ja auch, wenn er noch nicht 'sichtbar' ist.

Die Idee ist:
Nachdem alle Siegel geöffnet sind, soll der Bot zum Stern telen und dort Hammer casten, bis Dia erscheint.
Danach soll er wie gewohnt vorgehen und Dia erlegen.
tonk1 is offline  
Old 05/20/2011, 19:30   #2
Administrator
 
Muddy Waters's Avatar
 
elite*gold: 41364
Join Date: Jan 2010
Posts: 22,729
Received Thanks: 12,625
Es macht aus meiner Sicht wenig Sinn, Sammelthemen für Programmierfragen zu machen, denn sowas wird zu schnell zu speziell.

Wo ich gerade von speziell spreche: Da es wirklich diverse D2NT Versionen gibt, wäre es ratsam, das Baal Script zu posten, auf das du dich beziehst - ansonsten fehlt ganz einfach eine Basis zum Diskutieren bzw. die Diskussion wird schwammig und wenig konkret.
Normalerweise ist der Precast Teil eigentlich sehr offensichtlich, gerade deshalb ist es umso interessanter, dass es sich in deinem Script scheinbar nicht finden lässt.

Was du mit den State von Diablo meinst verstehe ich nicht; solange der nicht da ist und du nicht eine entsprechende Monster Unit instantiiert hast, ist Diablo auch für D2NT nicht da. Wenn du diesbezüglich bessere Informationen als ich hast, lasse ich mich aber natürlich gerne belehren.

Zu deiner Idee: ich halte das für wenig sinnvoll, da die meisten Hämmer aus dem Precast ohnehin nicht treffen werden und somit mehr schein als sein sind.
Aus meiner Sicht ist es sinnvoller, in der Zwischenzeit Cleansing anzustellen, um den Merc sowie den Char von etwaigen Flüchen zu befreien.

LG
Muddy
Muddy Waters is offline  
Thanks
1 User
Old 05/20/2011, 20:15   #3
 
elite*gold: 0
Join Date: Dec 2010
Posts: 152
Received Thanks: 23
Nur die wenigsten wissen, wie mans richtig macht. Leider.

Da ich scheinbar in Rätseln schreibe, mache ichs mal mit Markierungen...

Ich brauche eigentlich nur etwas, an dem ich festmachen kann, ob Dia gerade erschienen ist. Es soll so sein, dass er so lange hammert bis Dia erscheint, auf den Hammer genau - oder eine Maximalzeit (ca. 15 sec) abgelaufen ist.

Ob das jetzt für den Einzelnen Sinn ergibt sei mal so dahingestellt.
Der Bot soll 'intelligent' hammern, und mit der PreAttack aufhören, sobald Dia angreifbar ist.
Die Daten für Dia reichen mir, den Rest krieg ich auch so hin.

Baal PreAttack nn anymore.
tonk1 is offline  
Old 05/20/2011, 21:17   #4
 
elite*gold: 0
Join Date: Nov 2010
Posts: 605
Received Thanks: 109
als das mit den hämmern stimmt so nicht ganz.die treffen schon wie mann in einem video von firstplx sieht.
der castet hämmer bevor dia auftaucht und die treffen.

er steht ca. da und castet die hämmer



wenn dia dann auftaucht telt er erst zu ihm.
loki-d2 is offline  
Thanks
1 User
Old 05/20/2011, 21:19   #5
Administrator
 
Muddy Waters's Avatar
 
elite*gold: 41364
Join Date: Jan 2010
Posts: 22,729
Received Thanks: 12,625
Wenn es weiter nichts ist...

Code:
NTC_PutSkill(113, NTC_HAND_RIGHT);

for(var i = 0; i < 200; i++)
{
	if(!NTC_CastSkill(112, 2))
		NTC_Delay(200);
	
	if(NTC_FindUnit(NTC_UNIT_MONSTER, 243))
		break;
}
Du könntest natürlich auch eine while-Schleife nehmen, aber ohne eine absolut sichere Abbruchbedingung würde ich das nach Möglichkeit vermeiden und lieber zur for-Schleife greifen.

LG
Muddy
Muddy Waters is offline  
Thanks
1 User
Old 05/20/2011, 21:25   #6
 
elite*gold: 0
Join Date: Nov 2010
Posts: 605
Received Thanks: 109
eine frage muss man das nicht extra definieren mit

if(me.classid == NTC_CHAR_CLASS_PALADIN

else .....
loki-d2 is offline  
Thanks
2 Users
Old 05/20/2011, 21:32   #7
Administrator
 
Muddy Waters's Avatar
 
elite*gold: 41364
Join Date: Jan 2010
Posts: 22,729
Received Thanks: 12,625
Quote:
Originally Posted by loki-d2 View Post
eine frage muss man das nicht extra definieren mit

if(me.classid == NTC_CHAR_CLASS_PALADIN

else .....
Klar, aber tonk meinte, er würde den Rest selber machen, wenn er nur den besagten Teil hat. Und ich bin der letzte, der ihm das vorenthalten möchte.

Grundsätzlich hast du aber recht.

LG
Muddy
Muddy Waters is offline  
Thanks
1 User
Old 05/20/2011, 21:39   #8
 
elite*gold: 0
Join Date: Nov 2010
Posts: 605
Received Thanks: 109
ich wollt das auch schon mal machen aber kenn mich ja nicht so gut aus.da ich aber jetzt richtig lag mach ich es vl doch.hast mich angespornt.ansich ist das mit dem dia scripte verbessern ja eine gute sache.ich persönlich hätte ja gern ein dia scripte in dem 3 chars die siegel öffnen also jeder eine richtung im cs telt und cleant.das währe dann dia in 30 sec oder so.na ja man darf ja noch träumen.

lg loki
loki-d2 is offline  
Thanks
1 User
Old 05/20/2011, 21:45   #9
 
elite*gold: 0
Join Date: Dec 2010
Posts: 152
Received Thanks: 23
So wie das da steht muss ich ja nicht mal denken.
Danke, danke.
tonk1 is offline  
Old 05/20/2011, 21:55   #10
 
elite*gold: 0
Join Date: Nov 2010
Posts: 605
Received Thanks: 109
na ja denken solltest schon.sonnst verwechselst den pc mit einem toaster und dann hast du den salat.

lg loki
loki-d2 is offline  
Thanks
1 User
Old 05/20/2011, 21:58   #11
 
elite*gold: 0
Join Date: Dec 2010
Posts: 152
Received Thanks: 23
xD

Edit: Liebe macht blind.
Die NTC_FindUnit sucht nicht nur eine Sekunde, sondern so lange, bis sie das Monster gefunden hat oder die Suchzeit abgelaufen ist... kann schon mal... 1 Min dauern?
Heißt: er hammert ein Mal, dann is Schluss.

In meinem eigenen Ansatz habe ich mich mit der Funktion selbst beschäftigt, quasi als Import nur für das Dia Script, mit der besonderen "Hammer-während-du-suchst-Funktion".

Wenn das Baby bei mir läuft lass ich es euch wissen.
Aber falls ihr vor mir ne Lösung habt... Gieb free plx.

Edit2: Juhu, fertig.

Habe einfach NTC_FindUnit(NTC_UNIT_MONSTER, 243, 150); zu CS_FindUnit(NTC_UNIT_MONSTER, 243, 150); geändert und dem Dia Script hinzugefügt.

Hier die CS_FindUnit:

Code:
function CS_FindUnit(unittype, search, retry) // retry 150
{
	var _unit;

	switch(arguments.length)
	{
	case 0:
		return null;
	case 1:
		search = null;
	case 2:
		retry = 0;
		break;
	}
	
	if(me.classid == NTC_CHAR_CLASS_PALADIN)
		retry = 35;
	
	for(var i = 0 ; i <= retry ; i++)
	{
		_unit = GetUnit(unittype, search);

		if(_unit)
			return _unit;
			
		if(me.classid == NTC_CHAR_CLASS_PALADIN)
			NTC_CastSkill(112, 2);
		else
			NTC_Delay(200);
	}

	return null;
}
Nice Position zum Hammern ist:
Code:
	if(!NTM_MoveTo(me.areaid, 7795, 5282))
	{
		NTC_SendMsgToScript("MWBotGame.ntj", NTM_MoveTo, 145, me.areaid, 7795, 5282);
		return;
	}
Als Ganzes sieht meine Diakill-Sequenz jetzt so aus:

Code:
	if(!NTM_MoveTo(me.areaid, 7795, 5282))
	{
		NTC_SendMsgToScript("MWBotGame.ntj", NTM_MoveTo, 145, me.areaid, 7795, 5282);
		return;
	}
	
	NTP_DoPrecast(true);
	
	if(me.classid == NTC_CHAR_CLASS_PALADIN)
		NTC_PutSkill(113, NTC_HAND_RIGHT);

	CS_FindUnit(NTC_UNIT_MONSTER, 243, 150);

	if(!NTA_KillMonster(243))
	{
		NTC_SendMsgToScript("MWBotGame.ntj", NTA_KillMonster, 158, 243);
		return;
	}

	NTSI_PickItems();

	if(NTConfig_PublicMode)
		Say(_msgNG);

	NTC_SendMsgToScript("MWBotGame.ntj", "SCRIPT_END");
}
Beachtet, dass ich die Variable _msgNG eingeführt habe, um nicht immer im Script scrollen zu müssen...
Wenn ihr keine Errors wollt, müsst ihr das mit Say("EUER TEXT"); ergänzen

Edit3: Es wäre ratsam, bei der CS_FindUnit ein paar Zahlen zu ändern. Dazu später mehr.

Edit4: Ein paar Sachen im Script verändert. Das alte Script nicht mehr verwenden, stattdessen von hier neu kopieren und ersetzen.
tonk1 is offline  
Thanks
2 Users
Old 05/21/2011, 12:01   #12
Administrator
 
Muddy Waters's Avatar
 
elite*gold: 41364
Join Date: Jan 2010
Posts: 22,729
Received Thanks: 12,625
Das mag zwar funktionieren, ist aber stilistisch sehr ungeschickt.
Common library Funktionen zu kopieren, um dort dann zwei Zeilen zu ändern und das ganze als neue Funktion herzunehmen ist mehr als ungeschickt.

Stattdessen solltest du einfach die Normale NTC_FindUnit() Funktion aus der Common library einsetzen benutzen.
Und die Funktion sucht solange, wie man es angibt. Wenn man aber keinen 3. Parameter übergibt, wird retry der Wert 0 zugewiesen und es wird auch nur einmal gesucht (so wie ich es in dem Code Schnipsel geschrieben hatte).

Versuch einfach mal, die normale NTC_FindUnit() Funktion nachzuvollziehen, denn wenn man sich das oben so anschaut, verstehst du noch nicht wirklich, was dort eigentlich passiert.

Danach kannst du das dann etwas eleganter angehen.

LG
Muddy
Muddy Waters is offline  
Old 05/21/2011, 12:39   #13
 
elite*gold: 0
Join Date: Dec 2010
Posts: 152
Received Thanks: 23
Quote:
Originally Posted by Muddy_Waters View Post
Das mag zwar funktionieren, ist aber stilistisch sehr ungeschickt.
Common library Funktionen zu kopieren, um dort dann zwei Zeilen zu ändern und das ganze als neue Funktion herzunehmen ist mehr als ungeschickt.

Stattdessen solltest du einfach die Normale NTC_FindUnit() Funktion aus der Common library einsetzen benutzen.
Und die Funktion sucht solange, wie man es angibt. Wenn man aber keinen 3. Parameter übergibt, wird retry der Wert 0 zugewiesen und es wird auch nur einmal gesucht (so wie ich es in dem Code Schnipsel geschrieben hatte).

Versuch einfach mal, die normale NTC_FindUnit() Funktion nachzuvollziehen, denn wenn man sich das oben so anschaut, verstehst du noch nicht wirklich, was dort eigentlich passiert.

Danach kannst du das dann etwas eleganter angehen.

LG
Muddy
Ich habe schon mit anderen Mitteln herumexperimentiert, aber was ich dabei beobachtet habe ist: die NTC_FindUnit() bedient sich einer Schleife... Was ich meine ist, dass so lange die Schleife läuft unter normalen Bedingungen keine Hammer o.A. gecastet werden können.
Der aus meiner Sicht einzige Weg, ein Casten zu ermöglichen ist, die Funktion selbst zu verändern.
Da sie aber nur an einer Stelle in nur einem Script Verwendung findet, lohnt es sich aus meiner Sicht auch nicht, die Funktion NTC_FindUnit() in NTCommon zu verändern, weil dann jedes Mal auch die Änderungen durchlaufen, was aus meiner Sicht wenig Sinn macht.

Wenn du eine bessere/elegantere Lösung oder einen Ansatz hast, dann lass mal sehen.
Vielleicht bewegst du mich dazu, weniger auf das Ergebnis zu gucken und mehr Wert auf 'geschickte' Lösungen zu legen.
tonk1 is offline  
Old 05/21/2011, 13:22   #14
Administrator
 
Muddy Waters's Avatar
 
elite*gold: 41364
Join Date: Jan 2010
Posts: 22,729
Received Thanks: 12,625
Okay, in dem Fall erkläre ich es mal etwas genauer, denn was man hier sieht lässt sich auch auf beliebige andere Funktionen übertragen.

Dass dort eine Schleife verwendet wird ist ja soweit richtig, allerdings ist die Anzahl der Durchläufe gegeben durch den Wert der Variable retry + 1.

Schauen wir uns aber zunächst mal die Funktion NTC_FindUnit() genauer an:
Code:
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;
}
Die Funktion erwartet offenbar bis zu drei Parameter, nämlich gerade unittype, search und retry.
Typische für JavaScript/D2NT findet nun eine Abfrage statt, mit wievielen Parametern die Funktion denn nun tatsächlich aufgerufen wurde. Denn nur weil es bis zu drei sein können (genaugenommen können es grundsätzlich immer beliebig viele sein), heisst das nicht, dass wir automatisch auch immer alle 3 Parameter übergeben müssen.

Je nachdem wieviele Parameter übergeben, hat arguments.length einen anderen Wert, nämlich gerade die Anzahl der übergebenen Parameter.
Das Objekt arguments ist übrigens in jeder JavaScript Funktion definiert.

Zurück zur Funktion:
In der switch-Anweisung wird nun arguments.length überprüft.
Um das voll zu verstehen, muss man eigentlich auch switch-Anweisungen verstehen - man merkt schon, es hängt irgendwie alles zusammen, was die Sache für Einsteiger nicht immer ganz einfach macht.
Zu beachten ist hierbei, dass bei den einzelnen cases der switch-Anweisung die breaks fehlen. Dies hat zur Folge, dass sämtliche cases nach dem ersten Aufgerufenen case immer mit ausgeführt werden und nicht etwa nur der case, zu dem der Sprung erfolgt.

Wurden nun keine Parameter übergeben, ist der Aufruf zu unspezifisch, darum wird die Funktion in dem Fall direkt mit dem Rückgabewert null beendet.

Wurde nur nur ein Parameter übergeben, ist die Angabe spezifisch genug, um damit in der Nähe (~ 70 yards) befindliche Units zu finden.
In diesem Fall wird case 1 erreicht und search mit dem Wert null Initialisiert.
Wie oben erwäht, wird danach auch case 2 ausgeführt und retry mit 0 initialisiert. Nun sind alle Parameter initialisiert und es kann die globale Funktion GetUnit() aufgerufen werden.

Wurden nur zwei Parameter übergeben, wird nur case 2 erreicht, um den noch undefinierten Parameter retry zu initialisieren.

Dies ist ein recht schickes Beispiel für die Verwendung von Default Parametern in D2NT/JavaScript.
Achja, es gibt natürlich noch den Fall, dass alle 3 Parameter übergeben werden, in dem Fall sind aber alle Parameter definiert und es ist keine Initialisierung mit Defaultwerten von Nöten.

Nun schauen wir uns mal die Schleife an:
Nachdem wir nun wie in meinem Code Schnipsel zu sehen, nur zwei Parameter übergeben haben, wird retry mit dem Defaultwert 0 initialisiert.

Für die Schleife bedeutet dies, das genau ein Durchlauf stattfindet, denn die Bedingung i <= retry ist nur für den ersten Durchlauf true, nämlich dann wenn i und retry beide den Wert 0 haben.
Es ist zwar eine Schleife, aber bei entsprechenden Parametern verhält sie sich so, als wäre sie gar nicht vorhanden.
Demzufolge ist deine Aussage von oben, dass NTC_FindUnit() eine Schleife enthält und somit per se mehr als einmal sucht, ganz einfach falsch. Ich könnte mir höchstens vorstellen, dass du NTC_FindUnit() mit falschen Parametern aufgerufen hast, sprich du hast für retry einen Wert übergeben, der ungleich 0 ist. In dem Fall ist das genannte Verhalten nicht weiter verwunderlich.

Ich würde es daher einfach mal so versuchen:
Code:
	if(!NTM_MoveTo(me.areaid, 7795, 5282))
	{
		NTC_SendMsgToScript("MWBotGame.ntj", NTM_MoveTo, 145, me.areaid, 7795, 5282);
		return;
	}
	
	NTP_DoPrecast(true);
	
	if(me.classid == NTC_CHAR_CLASS_PALADIN)
	{
		NTC_PutSkill(113, NTC_HAND_RIGHT);
		
		for(var i = 0; i < 150; i++)
		{
			if(!NTC_CastSkill(112, 2)) 
				NTC_Delay(200); // 200ms Delay, falls das Casten aus irgendeinem Grund nicht funktioniert.
				
			if(NTC_FindUnit(NTC_UNIT_MONSTER, 243)) // Wird true, sobald Diablo auftaucht.
				break;
		}
	}
	else
		NTC_FindUnit(NTC_UNIT_MONSTER, 243, 150); // Hier wird NTC_FindUnit als Variables Delay genutzt, welches dann endet, wenn Diablo auftaucht.

	if(!NTA_KillMonster(243))
	{
		NTC_SendMsgToScript("MWBotGame.ntj", NTA_KillMonster, 158, 243);
		return;
	}

	NTSI_PickItems();

	if(NTConfig_PublicMode)
		Say(_msgNG);

	NTC_SendMsgToScript("MWBotGame.ntj", "SCRIPT_END");
Achja, was auch gegen deine vorherige Lösung spricht, ist die Lesbarkeit.
Denn wenn man sich ein bisschen damit beschäftigt, kennt man die Funktionen der common library und hat deren Verhalten im Hinterkopf.
Wenn ich nun meine Variante lese, weiss ich sofort, was dort passiert.
Bei deiner Variante sehe ich erstmal eine mir unbekannte Funktion und muss mir zunächst die Implementierung dieser Funktion anschauen, um zu verstehen, was dort passiert.
Mal abgesehen dass das Kopieren und minimale ändern von common library Funktionen einfach nicht elegant ist.

Sollten nach dieser kleinen Abhandlung noch Rückfragen bestehen, einfach nachfragen.

LG
Muddy
Muddy Waters is offline  
Thanks
2 Users
Old 05/21/2011, 18:29   #15
 
elite*gold: 0
Join Date: Dec 2010
Posts: 152
Received Thanks: 23
Lange keinen Aha!-Effekt mehr gehabt.
Danke.

Edit:
Code:
		for(var i = 0; i < 150; i++)
		{
			if(!NTC_CastSkill(112, 2)) 
				NTC_Delay(200); // 200ms Delay, falls das Casten aus irgendeinem Grund nicht funktioniert.
				
			if(NTC_FindUnit(NTC_UNIT_MONSTER, 243)) // Wird true, sobald Diablo auftaucht.
				break;
		}
Bisschen viele Hammer.
Ich hab mal nachgezählt, bei optimalen Bedingungen reichen ca. 30 Hammer (bei 125 fcr, wer bottet schon ohne fastmod... ) danach kommt Dia.
Edit:
Code:
		for(var i = 0; i < 35; i++)
		{
			if(!NTC_CastSkill(112, 2)) 
				NTC_Delay(200); // 200ms Delay, falls das Casten aus irgendeinem Grund nicht funktioniert.
				
			if(NTC_FindUnit(NTC_UNIT_MONSTER, 243)) // Wird true, sobald Diablo auftaucht.
				break;
		}
35 Hammer reichen dicke.
Wenn Dia schon tot ist, will doch keiner 150 mal hammern.
tonk1 is offline  
Reply

Tags
chaos, d2nt, ntdiablo, script, verbesserung


Similar Threads Similar Threads
D2NT Bo Script
05/02/2012 - Diablo 2 - 17 Replies
Also, ich habe einen Bo Barbar in Classic, ich hätte gerne, das wenn ein Tp von Leader Char geöffnet wird, er rein geht und ein tp macht . Sollte so aussehen, Char geht ins Game, Durchs Leader tp(in CS) dann Bo, das wars auch wieder. könnte jemand so was scripten/schreiben? würde auch fg offern E: Jetzt fällts mir auf :D
[D2NT] Hot-IP Script
06/04/2011 - Diablo 2 Programming - 32 Replies
Guten Abend! Hier mal ein ganz nützliches Script, um nicht "trocken" nach Hot-IP's zu suchen, sondern dies während der normalen Botsequenzen zu tun. Das D2NT-eigene Feature stoppt das Script soweit ich weiss nur bei der Meldung "Diablo wandelt auf der Erde". 1.) Neues Script erstellen Als erstes erstellt Ihr eine neue Script-Datei mit dem Namen "NTCloneHunter.ntj" im Ordner "scripts/NTBot/bots/". Der Name des Scripts kann natürlich jeder Beliebige sein. Das Script sieht folgendermaßen...
iso d2nt bluebird ele druide verbesserungen
05/10/2011 - Diablo 2 - 1 Replies
würde gern mein d2nt bluebird weiterbenutzen, aber bei ele druide is halt fail: die attack range (sollte sich näher ans / aufs mob telen) oak wird im laufenden script nicht neu gecasted wenn er stirbt wäre sehr dankbar für hilfe :)
[suche] d2nt level rush script 1-25 / follow script
06/23/2010 - Diablo 2 Programming - 5 Replies
moin erstmal sry falls es da doch schon was passendes zu gab - hab schonmal gesucht aber nur alte sachen gefunden oder eben antworten in richtung "geht so schnell dafür braucht man keinen bot" ^^ mein problem besteht darin dass ich für lvl 1 bis 20 immer x stunden brauche - trist geht ja noch halberwegs aber mit tombruns such ich mich immer dusselig ^^ - bzw cows sind noch schlimmer (dafür geht das cow-script für d2nt ausm bluebird zumindest halberwegs) die frage ist jetz die - giebt...



All times are GMT +2. The time now is 05:56.


Powered by vBulletin®
Copyright ©2000 - 2024, 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 ©2024 elitepvpers All Rights Reserved.