|
You last visited: Today at 09:44
Advertisement
An alle: helft mir mal fix :P
Discussion on An alle: helft mir mal fix :P within the Diablo 2 Programming forum part of the Diablo 2 category.
12/10/2010, 19:04
|
#1
|
elite*gold: 20
Join Date: Mar 2009
Posts: 1,356
Received Thanks: 736
|
An alle: helft mir mal fix :P
Also Ausschnitt aus nem Script von mir der nicht so funktioniert wie es soll.
Code:
while(me.areaid == 1 || me.areaid == 40 || me.areaid == 75 || me.areaid == 103 || me.areaid == 109)
{
if(me.act != _leader.act)
{
Print("ÿc8Suche Akt");
if(_leader.act == 1)
{
NTTM_TownMove("waypoint");
Delay(50);
NTM_TakeWaypoint(1);
}
else if(_leader.act == 2)
{
NTTM_TownMove("waypoint")
Delay(50);
NTM_TakeWaypoint(40);
}
else if(_leader.act == 3)
{
NTTM_TownMove("waypoint")
Delay(50);
NTM_TakeWaypoint(75);
}
else if(_leader.act == 4)
{
NTTM_TownMove("waypoint")
Delay(50);
NTM_TakeWaypoint(103);
}
else if(_leader.act == 5)
{
NTTM_TownMove("waypoint")
Delay(50);
NTM_TakeWaypoint(109);
}
}
else if(me.act == _leader.act)
{
Print("ÿc8Gehe zum TPspot");
NTTM_TownMove("portalspot");
var _portal;
var _portalname;
_portalname = GetLocaleString(3226);
_portal = NTC_FindUnit(NTC_UNIT_OBJECT, _portalname);
Print("ÿc8Warte auf TP");
for(i = 0; i <= 100; i++)
{
if(_portal)
break;
Delay(300);
}
if(_portal)
{
Print("ÿc8TP gefunden");
NTM_UsePortal("BluePortal", 131, NTConfig_Leader);
Delay(1000);
NTP_DoPrecast(true);
}
}
}
Das Problem sieht wie folgt aus : Der Char spamt "Suche Akt" bis das game crasht. Wieso?
_leader hab ich wie folgt definiert:
Code:
//Richtigen Leader finden
var _leader;
_leader = GetPlayerUnit();
while(_leader.name != NTConfig_Leader)
{
_leader.GetNext();
Delay(600);
Print("ÿc8Suche Leader");
}
|
|
|
12/10/2010, 20:34
|
#2
|
Administrator
elite*gold: 41624
Join Date: Jan 2010
Posts: 22,728
Received Thanks: 12,654
|
Quote:
Originally Posted by njomnjomnjom
Also Ausschnitt aus nem Script von mir der nicht so funktioniert wie es soll.
Code:
while(me.areaid == 1 || me.areaid == 40 || me.areaid == 75 || me.areaid == 103 || me.areaid == 109)
{
if(me.act != _leader.act)
{
Print("ÿc8Suche Akt");
if(_leader.act == 1)
{
NTTM_TownMove("waypoint");
Delay(50);
NTM_TakeWaypoint(1);
}
else if(_leader.act == 2)
{
NTTM_TownMove("waypoint")
Delay(50);
NTM_TakeWaypoint(40);
}
else if(_leader.act == 3)
{
NTTM_TownMove("waypoint")
Delay(50);
NTM_TakeWaypoint(75);
}
else if(_leader.act == 4)
{
NTTM_TownMove("waypoint")
Delay(50);
NTM_TakeWaypoint(103);
}
else if(_leader.act == 5)
{
NTTM_TownMove("waypoint")
Delay(50);
NTM_TakeWaypoint(109);
}
}
else if(me.act == _leader.act)
{
Print("ÿc8Gehe zum TPspot");
NTTM_TownMove("portalspot");
var _portal;
var _portalname;
_portalname = GetLocaleString(3226);
_portal = NTC_FindUnit(NTC_UNIT_OBJECT, _portalname);
Print("ÿc8Warte auf TP");
for(i = 0; i <= 100; i++)
{
if(_portal)
break;
Delay(300);
}
if(_portal)
{
Print("ÿc8TP gefunden");
NTM_UsePortal("BluePortal", 131, NTConfig_Leader);
Delay(1000);
NTP_DoPrecast(true);
}
}
}
Das Problem sieht wie folgt aus : Der Char spamt "Suche Akt" bis das game crasht. Wieso?
_leader hab ich wie folgt definiert:
Code:
//Richtigen Leader finden
var _leader;
_leader = GetPlayerUnit();
while(_leader.name != NTConfig_Leader)
{
_leader.GetNext();
Delay(600);
Print("ÿc8Suche Leader");
}
|
Das mit dem Einrücken musst du nochmal üben, dein Code ist extrem schwer lesbar. 
Blockklammern werden im übrigen nicht eingerückt!
Dann mal die Anmerkung, dass es für diese Akt Wechsel Geschichte schon eine schicke Funktion aus den common libraries gibt: NTTM_CheckAct(act)
Wobei act eine Zahl zwischen 1 und 5 ist. 
Die Bedingung der oberen Schleife kannst du durch die Funktion NTC_InTown() ersetzen.
Die Abbruchbedingung für die Schleife unten finde ich auch recht unglücklich gewählt. Abgesehen davon instantiierst du ein Objekt, ohne zu überprüfen, ob es auch existiert. In dem moment, wo du die Methode GetNext() über ein undefiniertes Objekt aufrufst, sollte es zu einer Exception mit Restart kommen.
So rein aus dem Bauch heraus sollte dies auch der Fall sein, wenn GetNext() den Listenpointer auf den Nullpointer legt, also nach einer absehbaren Anzahl an durchläufen.
Soll _leader eigentlich global sein? Wenn ja solltest du den Bezeichner auch so wählen, also einen Großbuchstaben am Anfang, ein Kleinbuchstabe sagt aus, dass es sich um eine lokale Variable innerhalb einer Funktion handelt.
Aber so wird das nichts, du musst in jedem Fall überprüfen, ob das Objekt existiert, bevor du irgendwie damit arbeitest.
Eventuell hast du ja auch nur einen so unglücklichen Ausschnitt gewählt, dass der entsprechende Teil nicht dabei ist, obwohl dieser eigentlich vorhanden ist.
Ich gehe jetzt einfach mal davon aus, du kannst damit was anfangen und weisst was zu tun ist, ansonsten kannst du mich gerne nochmal Fragen.
Lg
Muddy
|
|
|
12/10/2010, 21:20
|
#3
|
elite*gold: 20
Join Date: Mar 2009
Posts: 1,356
Received Thanks: 736
|
Ich überprüfe nicht ob es existiert zumindest nicht direckt.
Aber wenn es nicht in meiner Party ist macht er einfach Pause, ich ging davon aus, dass dies ausreichend ist.
Code:
//Auf Leader Warten
while(!NTC_InMyParty(NTConfig_Leader))
Delay(600);
_leader = GetPlayerUnit(); muss nicht weiter überprüft werden, es liefert immer ein Ergebniss weil man selbst im Spiel ist. Der erste return ist immer man selbst, somit kann er nicht nix finden.
Ok die endbedingung der while schlaufe soll falsch sein, dass sollte erklären warum er "Suche Akt" immer wieder wiederholt.
Aber die endbedingung ist doch, dass er den selben Act hat wie der leader und somit klar logisch und schlüssig oder nicht?
Sind grad kollegen hier, ich kuck weiter wenn ich zeit hab, also morgen nachmittag oder heut nacht so 2.00.
Hoffentlich liegts daran, dass ich die variable nicht global gemacht hab :P
[Edit:]
Ich verschieb die klammern einfach immer so, bis ich find dases hübsch aussieht  Wusste nichtmal, dass es afür echt richtlinien gibt.
|
|
|
12/10/2010, 22:00
|
#4
|
Administrator
elite*gold: 41624
Join Date: Jan 2010
Posts: 22,728
Received Thanks: 12,654
|
Quote:
Originally Posted by njomnjomnjom
Ich überprüfe nicht ob es existiert zumindest nicht direckt.
Aber wenn es nicht in meiner Party ist macht er einfach Pause, ich ging davon aus, dass dies ausreichend ist.
Code:
//Auf Leader Warten
while(!NTC_InMyParty(NTConfig_Leader))
Delay(600);
_leader = GetPlayerUnit(); muss nicht weiter überprüft werden, es liefert immer ein Ergebniss weil man selbst im Spiel ist. Der erste return ist immer man selbst, somit kann er nicht nix finden.
Ok die endbedingung der while schlaufe soll falsch sein, dass sollte erklären warum er "Suche Akt" immer wieder wiederholt.
Aber die endbedingung ist doch, dass er den selben Act hat wie der leader und somit klar logisch und schlüssig oder nicht?
Sind grad kollegen hier, ich kuck weiter wenn ich zeit hab, also morgen nachmittag oder heut nacht so 2.00.
Hoffentlich liegts daran, dass ich die variable nicht global gemacht hab :P
[Edit:]
Ich verschieb die klammern einfach immer so, bis ich find dases hübsch aussieht  Wusste nichtmal, dass es afür echt richtlinien gibt.
|
Ein Stückweit ist das auch Geschmackssache, aber es gibt da durchaus auch Konventionen, abhängig von der verwendeten Sprache.
Bei den Klammern hat es aber eigentlich nichts mehr mit Geschmack zu tun, die müssen vorne sein, ansonsten geht die ganze Übersichtlichkeit, die man durchs Einrücken gewinnt, direkt wieder verloren, weil die Blöcke nicht mehr klar zu sehen sind.
Das mit dem Objekt mag zwar Stimmen, im Normalfall wirst du ein Objekt bekommen, davon kann man aber nicht ausgehen, darum wäre besser, das zu Überprüfen.
Ich würde auch immer drauf achten, dass du Strings zum Vergleichen immer nach lower- oder uppercase konvertierst. Das macht die Handhabung hinterher einfacher und schließt eine Fehlerquelle aus.
Und ich meine, dass act für party player objekte nicht definiert ist, darum waren vermutlich beide if Bedingungen immer false, sodass eigentlich die große Schleife die Endlosschleife war.
Ich habe das mal etwas umgeschrieben, in erster Linie damit du nochmal siehst, wieviel Übersichtlichkeit eine richtige Formatierung schafft.
Kannst ja mal schauen ob das jetzt irgendwie zum gewünschten resultat führt, ist natürlich ungetestet.
Code:
var _Leader;
function InitializeLeaderUnit()
{
_Leader = GetPlayerUnit();
if(_Leader)
{
while(_Leader.GetNext())
{
if(_Leader.name.toLowerCase() != NTConfig_Leader.toLowerCase())
break;
Delay(600);
Print("ÿc8Suche Leader");
}
}
}
function CheckLeaderAct(areaid)
{
if(areaid < 1 || areaid > 132)
return -1;
else if(areaid < 40)
return 1;
else if(areaid < 75)
return 2;
else if(areaid < 103)
return 3;
else if(areaid < 109)
return 4;
else
return 5;
}
while(NTC_InTown())
{
if(_Leader)
{
var _act = CheckLeaderAct(_Leader.areaid);
if(me.act == _act)
{
Print("ÿc8Gehe zum TPspot");
NTTM_TownMove("portalspot");
var _portal;
var _portalname;
_portalname = GetLocaleString(3226);
Print("ÿc8Warte auf TP");
var i;
for(i = 0; i <= 100; i++)
{
_portal = NTC_FindUnit(NTC_UNIT_OBJECT, _portalname);
if(_portal)
break;
Delay(300);
}
if(i <= 100)
{
Print("ÿc8TP gefunden");
NTM_UsePortal("BluePortal", 131, _Leader.name);
Delay(1000);
NTP_DoPrecast(true);
}
}
else
NTTM_CheckAct(_act);
}
else
InitializeLeaderUnit();
NTC_Delay(500);
}
Lg
Muddy
|
|
|
12/11/2010, 00:49
|
#5
|
elite*gold: 20
Join Date: Mar 2009
Posts: 1,356
Received Thanks: 736
|
Momentmal, ich hab jetzt zwar ein zwei bierchen intus aber:
Code:
if(_Leader)
{
while(_Leader.GetNext())
{
if(_Leader.name.toLowerCase() != NTConfig_Leader.toLowerCase())
break;
Ich hab jetzt erstmal 4 minuten gebraucht bis ich diese verschacherte abfrage durchschaut hatte :P
Der Stop der While schlaufe erfolgt wenn der Leadername ungleich dem leadernamen ist, das hat mich weng verwirrt.
Aber ist ja logisch, da die Sclaufe in der If abfrage nach der existenz des Leaders steht. Somit hört er auf zu suchen wenn er den richtigen hat und die Existenz des Objekts ist gleichzeitig gesichert 
Er soll ja dann mit "GetNext" aufhören wenn er den richtigen hat, nicht wenn er den falschen hat, deswegen dacht ich erst da müsste == stehen statt !=
Auf jeden vielen Dank für den Tip, dass ".act" bei partyobjekten nicht definiert ist, dass war mir unbekannt.
Und noch ein zweites danke für die viele Arbeit du dir für mich machst.
[Edit:]
Noch ne Frage.
Wenn function CheckLeaderAct(areaid) -1 returnt.
Dann wird NTTM_CheckAct(_act); ja mit -1 durchgeführt.
In der function NTTM_CheckAct ist aber nur Case 1-5 definiert. -1 ist nicht definiert.
Gibt es dann nicht nen Crash ?
|
|
|
12/11/2010, 11:35
|
#6
|
Administrator
elite*gold: 41624
Join Date: Jan 2010
Posts: 22,728
Received Thanks: 12,654
|
Quote:
Originally Posted by njomnjomnjom
Momentmal, ich hab jetzt zwar ein zwei bierchen intus aber:
Code:
if(_Leader)
{
while(_Leader.GetNext())
{
if(_Leader.name.toLowerCase() != NTConfig_Leader.toLowerCase())
break;
Ich hab jetzt erstmal 4 minuten gebraucht bis ich diese verschacherte abfrage durchschaut hatte :P
Der Stop der While schlaufe erfolgt wenn der Leadername ungleich dem leadernamen ist, das hat mich weng verwirrt.
Aber ist ja logisch, da die Sclaufe in der If abfrage nach der existenz des Leaders steht. Somit hört er auf zu suchen wenn er den richtigen hat und die Existenz des Objekts ist gleichzeitig gesichert 
Er soll ja dann mit "GetNext" aufhören wenn er den richtigen hat, nicht wenn er den falschen hat, deswegen dacht ich erst da müsste == stehen statt !=
Auf jeden vielen Dank für den Tip, dass ".act" bei partyobjekten nicht definiert ist, dass war mir unbekannt.
Und noch ein zweites danke für die viele Arbeit du dir für mich machst.
[Edit:]
Noch ne Frage.
Wenn function CheckLeaderAct(areaid) -1 returnt.
Dann wird NTTM_CheckAct(_act); ja mit -1 durchgeführt.
In der function NTTM_CheckAct ist aber nur Case 1-5 definiert. -1 ist nicht definiert.
Gibt es dann nicht nen Crash ?
|
Normalerweise sollte eine gute Funktion die übergebenen Parameter überprüfen, bevor sie damit weiterarbeitet.
Und wenn du in die Definition der Funktion schaust, dann tut sie das auch:
Code:
function NTTM_CheckAct(act)
{
var _townid;
if(!NTC_InTown())
{
switch(me.act)
{
case 1:
_townid = NTC_AREA_ID_ACT_1;
break;
case 2:
_townid = NTC_AREA_ID_ACT_2;
break;
case 3:
_townid = NTC_AREA_ID_ACT_3;
break;
case 4:
_townid = NTC_AREA_ID_ACT_4;
break;
case 5:
_townid = NTC_AREA_ID_ACT_5;
break;
}
if(!NTM_MakeTP(_townid))
return false;
}
if(arguments.length < 1)
return true;
[COLOR=Red] if(act < 1 || act > 5)
return false;[/COLOR]
if(act != me.act)
{
switch(act)
{
case 1:
_townid = NTC_AREA_ID_ACT_1;
break;
case 2:
_townid = NTC_AREA_ID_ACT_2;
break;
case 3:
_townid = NTC_AREA_ID_ACT_3;
break;
case 4:
_townid = NTC_AREA_ID_ACT_4;
break;
case 5:
_townid = NTC_AREA_ID_ACT_5;
break;
}
if(!NTTM_TownMove("waypoint"))
return false;
if(!NTM_TakeWaypoint(_townid))
return false;
}
return true;
}
Aber grundsätzlich hats du natürlich recht, besser man überprüft es gleich, jedenfalls wenn man nicht sicher weiss, wie die Funktion damit handtiert.
Und auch das != ist natürlich falsch, das liegt wohl daran, dass ich es schlicht übersehen habe.
Tut mir Leid für die entstandene Verwirrung. 
Im Zweifelsfall sind Dinge die nach Fehlern aussehen auch tatsächlich welche. Und ich mache leider immer recht viele davon...
So sollte es besser passen:
Code:
var _Leader;
function InitializeLeaderUnit()
{
_Leader = GetPlayerUnit();
if(_Leader)
{
while(_Leader.GetNext())
{
if(_Leader.name.toLowerCase() == NTConfig_Leader.toLowerCase())
break;
Delay(600);
Print("ÿc8Suche Leader");
}
}
}
function CheckLeaderAct(areaid)
{
if(areaid < 1 || areaid > 132)
return -1;
else if(areaid < 40)
return 1;
else if(areaid < 75)
return 2;
else if(areaid < 103)
return 3;
else if(areaid < 109)
return 4;
else
return 5;
}
while(NTC_InTown())
{
if(_Leader)
{
var _act = CheckLeaderAct(_Leader.areaid);
if(me.act == _act)
{
Print("ÿc8Gehe zum TPspot");
NTTM_TownMove("portalspot");
var _portal;
var _portalname;
_portalname = GetLocaleString(3226);
Print("ÿc8Warte auf TP");
var i;
for(i = 0; i <= 100; i++)
{
_portal = NTC_FindUnit(NTC_UNIT_OBJECT, _portalname);
if(_portal)
break;
Delay(300);
}
if(i <= 100)
{
Print("ÿc8TP gefunden");
NTM_UsePortal("BluePortal", 131, _Leader.name);
Delay(1000);
NTP_DoPrecast(true);
}
}
else if(_act != -1)
NTTM_CheckAct(_act);
}
else
InitializeLeaderUnit();
NTC_Delay(500);
}
Lg
Muddy
|
|
|
12/11/2010, 15:21
|
#7
|
elite*gold: 0
Join Date: Aug 2009
Posts: 33
Received Thanks: 3
|
Code:
while(_Leader.GetNext())
{
if(_Leader.name.toLowerCase() == NTConfig_Leader.toLowerCase())
break;
Delay(600);
Print("ÿc8Suche Leader");
}
umschreiben in
Code:
Print("ÿc8Suche Leader");
do
{
if(_Leader.name.toLowerCase() == NTConfig_Leader.toLowerCase())
break;
} while(_Leader.GetNext())
ansonsten überspringt man nämlich immer die allererste Unit. Ich bin kein Javascriptprofi aber ich gehe davon aus das eine while-schleife in Javascript genauso funktioniert wie eine in C.
Das Delay ist im übrigen nicht notwendig. und damit der dein Fenster nicht mit text vollgespammt wird dsa Print vor die Schleife.
|
|
|
12/11/2010, 17:26
|
#8
|
Administrator
elite*gold: 41624
Join Date: Jan 2010
Posts: 22,728
Received Thanks: 12,654
|
Quote:
Originally Posted by arthurion
Code:
while(_Leader.GetNext())
{
if(_Leader.name.toLowerCase() == NTConfig_Leader.toLowerCase())
break;
Delay(600);
Print("ÿc8Suche Leader");
}
umschreiben in
Code:
Print("ÿc8Suche Leader");
do
{
if(_Leader.name.toLowerCase() == NTConfig_Leader.toLowerCase())
break;
} while(_Leader.GetNext())
ansonsten überspringt man nämlich immer die allererste Unit. Ich bin kein Javascriptprofi aber ich gehe davon aus das eine while-schleife in Javascript genauso funktioniert wie eine in C.
Das Delay ist im übrigen nicht notwendig. und damit der dein Fenster nicht mit text vollgespammt wird dsa Print vor die Schleife.
|
Die erste unit ist aber in jedem Fall der eigene Char, darum erzeugt deine Änderung einen weiteren Schleifendurchlauf, auf den man eigentlich verzichten könnte. 
Obwohl dein Einwand natürlich berechtigt ist, bei den meisten anderen Fällen hättest du recht.
Das mit dem Delay stimmt aber voll und ganz.
Lg
Muddy
|
|
|
12/11/2010, 18:35
|
#9
|
elite*gold: 20
Join Date: Mar 2009
Posts: 1,356
Received Thanks: 736
|
Und ich hab mir gestern nach den bier diese genial unschlüssige erklärung ausgedacht warum != eben doch richtig sein muss XD
|
|
|
 |
Similar Threads
|
An alle Samp Leutee helft mir :P
06/08/2011 - Grand Theft Auto - 4 Replies
Hallo leute.. ich bins :D
Ich habe ein Problem mit meinen Samp server ( Grad neuen erstellt)
Das problem lautet folgendermaßen :
Ich möchte User haben doch keiner kann drauf
Wenn sie versuchen zu joinen ''Server didd'nt respont Retrying''
|
Alle Dateien Infiziert Bitte helft mir ._.
06/02/2010 - Technical Support - 45 Replies
Hallo ersmal bitte meckert nich über meine rechtschreibung da ich grade wirklich sehr panik habe D:
also ich hab eben ein paar hacks runtergeladen nix installiert oder so dann kam mitten ingame ein java update java6 oder so und auf einmal kamen so locker 20 virusmeldungen ich hab natürlich direckt alle gelöscht. ja brachte aber nix der pc hat sich automatisch neu gestartet und jetz kann ich garnix mehr öffnen sobald ich irgendeine .exe oder egal was öffnen möchte kommt "Application cannot be...
|
AN ALLE PLS HELFT MIR
03/08/2009 - Metin2 Private Server - 5 Replies
Hi ich habe das problem ich spiele auf VIPMT2 und kann mich nur sehr selten einloggen meistens steht fehler beim verbinden oder er bleibt bei der chara auswahl stecken wenn ich mich dann mal einloggen kann dann hängt alles und laggt -.- ( es liegt nich daran das mein internet zu langsamm ist ) ich hab schon den pc gewechselt aber nach einen tag ist es auf dem dann auch so wie vorher und bei meinem Kumpel läuft alles super ohne probleme wieso hab ich diese probleme weiß jemand einen rat ??
...
|
All times are GMT +1. The time now is 09:44.
|
|