Forum
Stranded II Scripts Scripting - Fragen/Probleme nmG has written
Was passiert denn, wenn man über loop ein event aufruft, welches dann erneut eine loop-Schleife ausführt?
Zuerst wird die eine und dann die anderen Schleife abgearbeitet. (Vermute ich jedenfalls, wäre logisch.)
1
2
3
4
2
3
4
on:kill{ 	$id=create("Item", Typ , 0, 0[, Menge]); 	store $id, "self"; }
in der units.inf bei der entsprechenden unit per loot=TYP-ID,MENGE
wobei du TYP-ID durch die ID des Itemtyps ersetzen musst und MENGE durch die Anzahl. Du kannst Menge auch weglassen, dann wird 1 Item erzeugt.
nmG has written
Was passiert denn, wenn man über loop ein event aufruft, welches dann erneut eine loop-Schleife ausführt?
Probiere es doch aus!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
on:start { 	local $i,$j; 	loop("count",5) { 		$i++; 		msg "Schleife 1: $i"; 		event "blub"; 	} 	msg "Juhu, geschachtelte Schleifen!"; } on:blub { 	$j=0; 	loop("count",5) { 		$j++; 		msg "Schleife 2: $j"; 	} }
Dass die Nachricht ("Juhu...") noch vor den anderen Schleifen (event blub) ausgeführt wird, zeigt bspw. dass es sich hier nicht wirklich um geschachtelte Schleifen handelt.
Der Ansatz ist von nmG aber trotzdem schon ganz gut und mit ein paar Überlegungen und Tricks kann man tatsächlich ein paar geschachtelte Schleifen realisieren. Es ist halt nur nicht möglich den loop-Befehl innerhalb eines loop-Befehls zu verwenden - was aber nicht die prinzipielle Möglichkeit geschachtelter Schleifen ausschließt:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
on:start { 	local $i,$j; 	event "event1"; } //äußere Schleife on:event1 { 	$j=0; 	$i++; 	//innere Schleife 	loop("count",5) { 		$j++; 		msg "$i $j"; 	} 	//Abbruchbedingung äußere Schleife 	if ($i<5) { event "event1"; } }
Was uns wieder zum Ausgangspunkt, also Texturieren aller Felsen, zurückführt:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
on:start{ local $i,$id; $i=62; event "event1"; } //äußere Schleife on:event1 { $i++; //innere Schleife loop("objects",$i) { $id = loop_id(); texture "maps/Deine Map/textur.png", "objects", $id; } //Abbruchbedingung äußere Schleife if ($i<75) { event "event1"; } else{ freevar $i, $id;} }
Auch wenn du's wahrscheinlich schon anders zum Laufen gebracht hast, bunnyhop.
habe den Script global hinzugefügt und auch beim object/unit
kann mir jemand sagen warum?
..Hmm, das ist interesant, jetzt weiß ich durch meine tollen magischen, psychotischen, hellseherischen Fähigkeiten den Fehler, hab aber durch dich 500 Gehirnzellen verloren.
Das wäre ein Preis von 0.50¤ pro Hirnzelle. Nach überweisung werd ich dir den Fehler sagen.
Überweisungsinformationen findest du auf www.lizardsiehteurescripts.de
1
2
3
2
3
on:load { def_free "unit", 220; }
Ach noch was wenn ich schon dabei bin zu schreiben, da hätte ich noch folgendes Problem ich habe eine Einheit mittels create erzeugt und die id in eine Variable gespeichert.
Dann habe ich noch einen Mann gemacht der mir befiehlt die Einheit zu töten und durch if Abfrage mit dem Befehl kill habe ich das gemacht ich habe in die If: if (kill $new){
geschrieben aber wenn ich die unit töte kommt trotzdem der else Zweig warum
Falsches Script:
1
2
3
4
5
6
7
2
3
4
5
6
7
on:use 	{ 	if (kill $new) 		{ 		// tu was... 		} 	}
Wenn ein Befehl ein Ergebnis zurück liefern soll, müssen seine Parameter in Klammern gesetzt werden.
Besser, aber immer noch falsch:
1
2
3
4
5
6
7
2
3
4
5
6
7
on:use 	{ 	if ( kill ($new) ) 		{ 		// tu was... 		} 	}
kill tötet eine Einheit, es überprüft nicht ob eine Einheit lebt. Nehm lives!
Noch falsch:
1
2
3
4
5
6
7
2
3
4
5
6
7
on:use 	{ 	if (lives ("unit", $new)) 		{ 		// tu was... 		} 	}
Dann musst du auch überprüfen ob der zurückgelieferte Wert auch 1 ist.
Endlich richtig:
1
2
3
4
5
6
7
2
3
4
5
6
7
on:use 	{ 	if (lives ("unit", $new) == 1) 		{ 		// tu was... 		} 	}
Edit: Mist, 3 Minuten schneller! Ich frage mich gerade, ob die Methode auch 100%ig sicher ist, es könnte ja über Nacht oder wenn der Spieler einen Schmetterling freilässt, die ID der (toten und verwesten) Einheit wieder neu belegt werden.
nmG has written
Edit: Mist, 3 Minuten schneller!
Muahahaha!
nmG has written
Ich frage mich gerade, ob die Methode auch 100%ig sicher ist, es könnte ja über Nacht oder wenn der Spieler einen Schmetterling freilässt, die ID der (toten und verwesten) Einheit wieder neu belegt werden.
Das könnte man umgehen, indem man die ID, wenn die Unit stirbt, auf 0 setzt. Dann überprüft man ob die ID 0 ist. Jetzt braucht man auch nicht mehr überprüfen ob die Unit lebt. Wenn sie es tut, ist die ID ja über 0.
Danke
Edit:
Schon wieder mal ein Problem aufgetreten, hoffentlich kann mir jemand dabei helfen.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
on:use { $tag++ if ($tag==5) { terraintexture "generate:snow"; climate "snow"; } if ($tag==10) { terraintexture "maps\Taiwai\Taiwai Island 2"; climate "normal"; $tag=0; } }
Warum geht das mit dem ([terraintexture "maps\Taiwai\Taiwai Island 2";] nicht mit generate gehts aber bei dem gehts nur einmal dann nicht mehr?
Bitte um Hilfe
Edit: Wie bringt man eine Unit zum stehen wenn sie im unitpath drinen ist und dann wieder weiter geht
edited 3×, last 09.01.09 10:17:56 pm
P.S.Wen es keinem was ausmacht bitte mit einem beispiel!
div Eddy
Denk mal selber anch, du brauchst vorallem einen Schalter derangibt wie der status ist, offen oder geschlossen. Dafür brauchst du nur eine Variable die von 0 auf 1 und wieder zurück gesetzt wird (natürlich beim benutzen) Je nachdem welchen Wert die Variable hat, must du dann das Object erstellen oder löschen. Allerdings würde ich es überhaupt nicht löschen, sondern einfach mit setpos im Boden versenken.
1
2
3
2
3
on:use { free "object" [,ID des objekts]; }
das müsste klappen
so wird die wand verschwinden, den script musst du an den hebel machen
@Flying Lizard
wieso nicht? ich dachte eine community wäre da um anderen zu helfen??