Naja, okay, ich kenn' mich mit Linux nicht so aus, kann sein.
Forum
Stranded II Allgemein Bug ThreadNaja, okay, ich kenn' mich mit Linux nicht so aus, kann sein.
1
$test = int ($bla -0.5);
1
$test = int (($bla) -0.5);
Ich werde diesen Fehler in Zukunft umgehen, aber trotzdem wollte ich ihn melden. Vielleicht werden sich die momentanen Modder des Quelltextes dazu bequemen, diesen Fehler in ihrer Modifikation zu entfernen.
Ps: Nette Abfrage, ob man übersehen hat, dass der Thread alt ist. Ich hatte das zwar nicht übersehen, aber so ein Hinweis ist nicht schlecht.
1
$test = int (($bla +0) -0.5);
wenn ja, dann könnte das ganz einfach heißen, dass es probleme gibt, wenn man variablen einfach so in klammern schreibt, ohne dass da noch irgend eine rechenoperation durchgeführt wird, wobei ich da jetzt zwar nicht wirklich nen sinn drin sehe aber du wirst wahrscheinlich deine gründe dafür haben, warum du das so machst.
Mit Variablen hat das auch anscheinend nichts zu tun, folgendes funktioniert genau so wenig:
1
$bla = int(7.5*(2.5*3)+2);
Möglicherweise hat Stranded bei dem Befehl int oder vielleicht bei noch mehr ein Problem mit inneren Klammern.
ich weiß, dass Stranded 2 da einige macken hat, aber der beste weg, wenn man sowas findet, ist einfach ne andere möglichkeit zu probieren um ans ziel zu kommen. not macht erfinderisch
Wenn ich tauch und dann beim tauchen angel, friert die Luftanzeige ein... sie sinkt erst wieder nach dem Angelprozess.
Hoffentlich richtiger Thread...
Du kannst ja mal versuchen, ob das auch bei anderen Prozessen passieren, beispielsweise wenn du etwas unter Wasser schmieden willst.
Nova has written
Das dürfte dann wahrscheinlich bei jedem Prozess so sein.
Meines Wissens ja. Sinnvoll wäre wohl eine Abfrage bei on:use, ob der Spieler sich ober/unter Wasser befindet.
Zu dem Klammerzeugs oben:
Der Parser bei S2 ist ja auch unter aller Sau. Aber für einen (damals noch) Abiturienten natürlich wirklich klasse.
Es gibt eine ganze Menge solcher Bugs und die wird es wohl auch in Zukunft noch geben, d.h. sofern sich Workarounds dafür finden lassen. Ansonsten müsste man den Parser komplett neu auflegen, was dazu führen würde, dass ältere Skripte nicht mehr funzen würden, oder bspw. Codekonstruktionen welche sich gerade solche 'Bugs' zu nutze machen...
Sollten also beim ersten Tag zwei Schmetterlinge rumfliegen und beim zweiten auch einer, dann wird nie wieder ein Schmetterling erstellt, da der Wert immer über oder gleich 3 ist.
Hier der fehlerhafte Code:
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:use { 	msgbox "Garten","sys/scripts/butterflygarden.s2s"; } on:build_finish { 	event "gardenbuild",0,0; } on:changeday { 	local $c; 	$c+=count_inrange("unit",6,250,"self"); 	$c+=count_inrange("unit",7,250,"self"); 	if ($c<3){ 		create "unit",random(6,7),getx("self"),getz("self"); 		if (random(2)==1){ 			create "unit",random(6,7),getx("self"),getz("self"); 		} 	} }
Und hier eine korrigierte Fassung:
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:use { 	msgbox "Garten","sys/scripts/butterflygarden.s2s"; } on:build_finish { 	event "gardenbuild",0,0; } on:changeday { 	local $c; 	$c+=count_inrange("unit",6,250,"self"); 	$c+=count_inrange("unit",7,250,"self"); 	if ($c<3){ 		create "unit",random(6,7),getx("self"),getz("self"); 		if (random(2)==1){ 			create "unit",random(6,7),getx("self"),getz("self"); 		} 	} 	freevar $c; }
Man beachte die vorletzte Zeile für die Fehlerbehebung.
Gruß, Nova
edited 1×, last 16.07.12 11:51:16 am
mfg
Man könnte meinen, dass das local $c den Variablenwert zurücksetzt oder die Variable neu erstellt. Das ist aber nicht der Fall, wenn die Variable bereits existiert. Es sorgt lediglich dafür, dass die Variable als lokale Variable behandelt wird.
Ich habe beim Schreiben wohl selbst nicht bedacht, dass die Variable bestehen bleibt. Noch effektiver wäre es, sie nicht nur auf 0 zu setzen, sondern sie komplett zu löschen ( freevar). So würde sie nicht in Spielständen gespeichert, was eh nur Platzverschwendung ist.
Hurri04 has written
EDIT:
habe gerade wieder eine lösung zu einem bug gefunden, der mir schon vor einiger zeit aufgefallen war:
und zwar geht es diesmal um den befehl getlocal, der bisher bisher beim auslösen des events, dem er untergeordnet war, in der konsole eine fehlermeldung ausspuckte.
hier ist mal der code, mit dem ich es ursprünglich versucht habe:
ich habe ein wenig herumexperimentiert und bin zu folgender lösung gekommen:
wenn man hinter der geschlossenen klammer beim getlocal -befehl noch zwei kommata anhängt, dann tritt das problem nicht mehr auf und das script funktioniert wunderbar:
habe gerade wieder eine lösung zu einem bug gefunden, der mir schon vor einiger zeit aufgefallen war:
und zwar geht es diesmal um den befehl getlocal, der bisher bisher beim auslösen des events, dem er untergeordnet war, in der konsole eine fehlermeldung ausspuckte.
hier ist mal der code, mit dem ich es ursprünglich versucht habe:
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
on:start { 	local "$bag_amount"; 	$bag_amount=count("item", 1); } on:hit { 	$temp_class=currentclass(); 	$temp_id=currentid(); 	$glob_bag_amount=count("item", 1); 	setlocal "$temp_class", $temp_id, "$bag_amount", $glob_bag_amount; 	getlocal("item", $temp_id, "$bag_amount"); 	msg "$bag_amount"; }
ich habe ein wenig herumexperimentiert und bin zu folgender lösung gekommen:
wenn man hinter der geschlossenen klammer beim getlocal -befehl noch zwei kommata anhängt, dann tritt das problem nicht mehr auf und das script funktioniert wunderbar:
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
on:start { 	local "$bag_amount"; 	$bag_amount=count("item", 1); } on:hit { 	$temp_class=currentclass(); 	$temp_id=currentid(); 	$glob_bag_amount=count("item", 1); 	setlocal "$temp_class", $temp_id, "$bag_amount", $glob_bag_amount; 	getlocal("item", $temp_id, "$bag_amount"),,;		// HIER MÜSSEN ZWEI KOMMATA SEIN! 	msg "$bag_amount"; }
Ist zwar schon recht alt, aber hier noch eine andere Variante welche ebenfalls klappen sollte.
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
on:start { 	local $bag_amount; 	$bag_amount=count("item", 1); } on:hit { 	$temp_class=currentclass(); 	$temp_id=currentid(); 	$glob_bag_amount=count("item", 1); 	setlocal "$temp_class", $temp_id, "bag_amount", $glob_bag_amount; 	getlocal("item", $temp_id, "bag_amount"); 	msg "$bag_amount"; }
der fehler war halt, dass der getlocal befehl auch funktionierte, wenn davor keine variable stand, also z.b.
1
$var=getlocal("item", $temp_id, "$bag_amount");
ich glaub das war dann irgendwie so, dass der wert in die zuletzt verwendete variable geschrieben wurde oder so, jedenfalls recht fragwürdig, ob man das normalerweise je so verwenden würde.
das ganze hatte ich damals auch nur rein zufällig entdeckt, aber natürlich nicht so in meiner modifikation verwendet. eigentlich versuche ich auch generell, die setlocal und getlocal befehle zu vermeiden. ich mein mich erinnern zu können, dass die recht viel leistung ziehen, wenn man sie schon nen paarmal auf einmal verwendet und manchmal gibts dann da andere lösungen, die effektiver sind
Naja, ich nutze die beiden Befehle ebenfalls so gut wie nie...
andererseits gibt es auch 1 oder 2 befehle, bei denen mann es weglassen muss...
Den Bug da oben (mit den beiden Kommata) schaue ich mir bei Gelegenheit auch noch einmal an...