Forum

> > Stranded II > Scripts > gelagerte Items prüfen
Forums overviewStranded II overview Scripts overviewLog in to reply

German gelagerte Items prüfen

25 replies
Page
To the start Previous 1 2 Next To the start

old gelagerte Items prüfen

-tony316-
User Off Offline

Quote
Hi Leute, in meiner derzeitigen Map soll an einer Stelle geprüft werden, wie viele Items von mehreren Typen gelagert sind. Allerdings passiert bei diesem Script (auch im Debugmode) nichts. Hier das Script:

1
2
3
4
5
6
7
8
9
10
on:load {
local $bananen,$blätter;
$bananen=count_stored("object",1,14);
$blätter=count_stored("object",1,15);
}

on:trigger {
if ($bananen==1;) {speech "positive";}
if ($blätter==20) {speech "positive";}
}

Das Lager hat die ID 1, ID 14 und 15 gehören zu den Items. Kann mir jemand helfen?

old Re: gelagerte Items prüfen

Hurri04
Super User Off Offline

Quote
also in zeile 8 solltest du schonmal das erste semikolon rausnehmen, das gehört das nicht hin.

ansonsten würde ich vielleicht noch empfehlen, in zeile 7 statt "trigger" "hit" zu verwenden und in den zeilen 8 und 9 statt des s2 cmd speech befehls einfach eine ausgabe der anzahl der jeweiligen items über s2 cmd msg zu machen. ist aber nur so nen allgemeiner hinweis, den du vielleicht für die zukunft beherzigen solltest. für schnelle debug-ausgaben ist sowas immer besser.

hast du denn auch genau 1 banane und 20 blätter in dem lager eingelagert?
ist der auslöser für den trigger, den du drin hast (von dem ich dir ja oben abgeraten habe) vielleicht momentan falsch eingestellt?
werden in der konsole irgendwelche fehlermeldungen angezeigt?

old Re: gelagerte Items prüfen

Mc Leaf
Super User Off Offline

Quote
user -tony316- has written
Hi Leute, in meiner derzeitigen Map soll an einer Stelle geprüft werden, wie viele Items von mehreren Typen gelagert sind. Allerdings passiert bei diesem Script (auch im Debugmode) nichts.

Ich empfehle Bugtracking, auch bei künftigeren Scripten:
1
2
3
4
5
6
7
8
9
10
11
12
on:load {
local $bananen,$blaetter;
$bananen=count_stored("object",1,14);
$blätter=count_stored("object",1,15);
msg "load: $bananen, $blaetter";
}

on:trigger {
msg "trigger: $bananen, $blaetter";
if ($bananen==1) {speech "positive";}
if ($blätter==20) {speech "positive";}
}
Ist eigentlich nicht schwer, so den Fehler zu finden, oder?

Übrigens sind auch Umlaute und Sonderzeichen in Variablennamen keine gute Idee...

old Re: gelagerte Items prüfen

-tony316-
User Off Offline

Quote
@user Hurri04:
Der Einsatzort von dem Script ist ja ein Zeitrigger, der alle paar Sekunden überprüft (nachdem aktiviert wurde, später wird er per free Befehl gelöscht), ob die Items im Lager sind. Die speech befehle habe ich erstmal nur als Lückenfüller eingesetzt, später werde ich passend zur Aufgabe auf der Map neue Befehle einsezten. Durch das Script wird ja eigentlich geprüft, ob die entsprechenden Items drin sind, also konnte das ja auch nicht der Fehler sein.

@user Mc Leaf:
Danke erstmal für das Script, ich werde es mal ausprobieren.
Trotzdem hab ich noch eine Frage: Wofür ist in deinem Script Zeile 5 zuständig?


Außerdem würde ich noch gerne wissen, ob man in die Folgeklammern vom if Befehl einen weiteren if Befehl setzten kann (ich meine nicht eine Erweiterung durch else oder so, sondern einen Befehl der ausgeführt wird, nachdem der erste ausgeführt wurde, else tritt ja nur in Kraft, wenn die vorherige Bedingung nicht erfüllt wurde.)

Danke für eure bisherigen Beiträge, würde mich über Lösungen für meine jetztigen Fragen freuen

old Re: gelagerte Items prüfen

Nova
User Off Offline

Quote
Bei fehlerhaften Scripten sollte man immer erst nachgucken, ob der eine wichtige Befehl nicht ausgeführt wird, oder ob vielleicht der ganze Block nicht erreicht wird. user Mc Leaf hat dabei in Zeile 5 mit s2 cmd msg eine Ausgabe gemacht. wenn diese aufgerufen wird, dann erreicht Stranded wenigstens den Block und führt ihn auch aus, der Fehler liegt dann wahrscheinlich in einem bestimmten Befehl in diesem Block.

Hier mal ein Beispiel zu s2 cmd if. Experimentiere einfach mal mit den zugewiesenen Werten in Zeile 3 bis 5 und schaue nach, was passiert.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
on:start
{
	$bla = 1;
	$blub = 2;
	$blonk = 2;

	if ($bla == 1)
	{
		msg "bla ist gleich 1";

		if ($blub == 798)
		{
			msg "blub ist gleich 789";
		}
		elseif ($blonk == 2)
		{
			msg "blonk ist gleich 2";
		}
		else
		{
			msg "blub ist nicht gleich 789";
			msg "und blonk ist nicht gleich 2";
		}
	}
	else
	{
		msg "bla ist nicht gleich 1";
	}
}

old Re: gelagerte Items prüfen

Hurri04
Super User Off Offline

Quote
user Nova has written
1
2
3
4
5
6
7
...
if ($blub == 798) {
...
}elseif ($blonk == 2) {
...
}
...

es kommt zwar immer auf die situation an, aber ich hab die erfahrung gemacht, dass solche abfragen besser zu vermeiden sind, wenn sie nicht gerade explizit (absichtlich) so geschrieben werden müssen.

generell würde ich dann eher vorschlagen, das ganze wie folgt zu schreiben:
1
2
3
4
5
6
7
8
9
...
if ($blub == 798) {
...
}else{
	if ($blonk == 2) {
	...
	}
}
...
sind zwar dann wieder zwei zeilen mehr, ist dafür aber wahrscheinlich syntaktisch sinnvoller, da man hier nicht $äpfel mit $birnen vergleicht ( ).

old Re: gelagerte Items prüfen

Nova
User Off Offline

Quote
elseif ist dabei einfach nur eine "Kurzform" deiner Schreibweise user Hurri04, von der Syntax her gibt es da keine Unterschiede. Als würdest du $bla = $bla +1; statt einfach $bla++; schreiben.
Bei Stranded II muss man manchmal aufpassen, da der "Umwandler" für die Scripte (Parser genannt), sich an manchen Schreibweisen verschlucken kann und dann Fehler macht, obwohl die Syntax eigentlich korrekt ist. Daher gebe ich manchmal etwas umständlichere Schreibweisen an, obwohl es dafür auch kleinere Arten gibt. Bei elseif mache ich dies aber meistens nicht.



An alle: Es ist aber richtig, dass es manchmal vom Sinn her besser ist, wenn man keine elseif benutzt. (Das meinte user Hurri04 wohl auch.)
Wenn man beispielsweise per if-Abfrage prüfen will, welchen Schritt der Spieler gerade bei einer Aufgabe durchläuft, aber auch gleichzeitig bei Schritt 2 nachprüfen will, ob der Spieler ein bestimmtes Item hat oder nicht.
So sollte man das nicht schreiben:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
on:use
{
	if ($aufgabeSchritt == 1)
	{
		// Mache was.
	}
	elseif (($spielerHatItem == "ja") && ($aufgabeSchritt == 2))
	{
		// Mache was.
	}
	elseif (($spielerHatItem == "nein") && ($aufgabeSchritt == 2))
	{
		// Mache was.
	}
}

Dort ist es wohl besser, die beiden elseif so zu schreiben, wie user Hurri04 es meinte. Hier der "verbesserte" Code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
on:use
{
	if ($aufgabeSchritt == 1)
	{
		// Mache was.
	}
	elseif ($aufgabeSchritt == 2)
	{
		if ($spielerHatItem == "ja")
		{
			// Mache was.
		}
		elseif ($spielerHatItem == "nein")
		{
			// Mache was.
			// Man könnte dieses elseif auch durch
			//  nur else ersetzen.
		}
	}
}
edited 2×, last 09.07.12 11:58:42 pm

old Re: gelagerte Items prüfen

Mr Stranded
User Off Offline

Quote
1
2
3
4
5
6
7
8
9
10
on:load {
local $bananen,$blätter;
$bananen=count_stored("object",1,14);
$blätter=count_stored("object",1,15);
}

on:trigger {
if ($bananen==1;) {speech "positive";}
if ($blätter==20) {speech "positive";}
}

Die Anzahl Bananen und Blätter wird ja nur beim Laden der Map geprüft! Wenn du wissen willst, wieviele Bananen und Blätter in dem Ding drin sind, musst du das auch jedes Mal neu überprüfen.

old Re: gelagerte Items prüfen

Hurri04
Super User Off Offline

Quote
solange sich die anzahl der items nicht ändert, solange der zeittrigger läuft, dürfte das eigentlich egal sein, deswegen versteh ich auch grade nicht so ganz, was hier noch das problem ist, weshalb ich gerne mal ne rückmeldung von user -tony316- diesbezüglich hätte.

old Re: gelagerte Items prüfen

Mc Leaf
Super User Off Offline

Quote
Nö, ich denke Mr. Stranded hat hier schon Recht...

E geht hier sicherlich darum, zu einem gewissen Zeitpunkt an einem gewissen Ort eine gewisse Anzahl an Bananen und Blättern zu besitzen, bzw. eingelagert zu haben. Und nicht darum, wieviele es beim Laden der Map waren - das weiß der Mapper nämlich schon.

user Nova has written
Bei fehlerhaften Scripten sollte man immer erst nachgucken, ob der eine wichtige Befehl nicht ausgeführt wird, oder ob vielleicht der ganze Block nicht erreicht wird. user Mc Leaf hat dabei in Zeile 5 mit s2 cmd msg eine Ausgabe gemacht. wenn diese aufgerufen wird, dann erreicht Stranded wenigstens den Block und führt ihn auch aus, der Fehler liegt dann wahrscheinlich in einem bestimmten Befehl in diesem Block.

Wenn es nur darum ginge, hätte
1
msg "blubber";
genügt. Aber die Belegung der Variablen dürfte ja auch nicht uninteressant sein.

old Re: gelagerte Items prüfen

-tony316-
User Off Offline

Quote
Mr Stranded hat Recht, in der Map gibt es eine Aufgabe, bei der an einer bestimmten Stelle der Zeittrigger mit dem Script gestartet wird. Daran hab ich bei meinem Originalscript auch nicht dran gedacht

@user Hurri04:
Also muss ich in meinem Script immer ein Minus vor die Variablen schreiben?
Aber meines Wissens gibt es auch einen Befehl, der eine negative Zahl in eine positive umwandelt, mir fällt nur der Name nicht ein...


Danke für eure ganzen Antworten, ich werde die Scripts mal ausprobieren.

old Re: gelagerte Items prüfen

Hurri04
Super User Off Offline

Quote
jo, gibts: s2 cmd abs.

wäre wahrscheinlich zu empfehlen, den zu benutzen, andernfalls müsstest du immer extra drauf achten, wo die items eingelagert sind.
bei einem lager gibts eben nen negativen wert zurück und bei anderen objekten nen positiven (z.b. die früchte, die an einem baum hängen, sind ja auch bei diesem "eingelagert").


Edit: siehe mein vorheriger post & nachfolgende.
der befehl wird also hier garnicht gebraucht.
edited 1×, last 10.07.12 09:47:37 pm

old Re: gelagerte Items prüfen

-tony316-
User Off Offline

Quote
Ich hab jetzt ein Script geschrieben, dass perfekt funktioniert. Das hier ist mein Script:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
on:load {
local $bananen,$blaetter,$fleisch,$blau;
}

on:trigger {
$bananen=count_stored("object",1,14);
$blaetter=count_stored("object",1,15);
$fleisch=count_stored("object",1,11);
$blau=count_stored("object",1,13);
abs $bananen;
abs $blaetter;
abs $fleisch;
abs $blau;
	if ($bananen>=1) 
		{
		if ($blaetter>=20) 
			{
			if ($fleisch>=4) 
				{
				if ($blau>=6) 
					{
					addscript "self","3";
					}
				}
			}
		}
}

Ich habe das Ganze noch mit diesen Variablen erweitert. Es wird alle 2 Sekunden geprüft, ob mindestens 1 Banane, 20 Blätter, 4 mal kleines Fleisch und 6 Blaublüten drin sind. Dann wird das Script von einem Textcontainer überschrieben (ID 3). Das ist dieses Script:

1
2
3
4
5
6
7
8
on:trigger {
freestored "object",1,14,1;
freestored "object",1,15,20;
freestored "object",1,11,4;
freestored "object",1,13,6;
msg "Ich habs geschafft!",4,5000;
free "self";
}

Dann wird die Anzahl der benötigten Items entfernt.
Hätte nie gedacht, dass ich das Script so gut hinkriege. Durch euch habe ich viel gelernt.
Wenn die Map fertig ist lade ich sie hoch. Kann aber noch ein paar Tage dauern, aber ich bin schon ziemlich weit.

old Re: gelagerte Items prüfen

Hurri04
Super User Off Offline

Quote
noch mehr zeug, das hier nicht gebraucht wird >


außerdem würde ich vorschlagen, bei der kiste dieses script einzubauen:
1
2
3
on:use {
	timer "self", 100, 1;
}
dadurch wird ein timer gestartet, sobald man das lager benutzt. da während der zeit, die man im lager-menü drin ist die spielwelt pausiert wird, wird er auch erst ausgeführt, wenn das lager-menü wieder geschlossen wird.
dadurch kannst du dir sparen, das script alle 2 sekunden aufzurufen, was bei mehreren solcher timer wahnsinnig auf die rechenzeit gehen würde.

achte außerdem darauf, dass ich hier als zweiten parameter "self" angeben habe statt 0, wodurch der timer nur bei dem lager ausgeführt wird und nicht überall global, was auch nochmal rechenleistung spart.


Edit: bisschen unnötiges zeug versteckt, um nicht unnötig fehlinformationen zu verbreiten.
der rest kann aber eigentlich so stehen bleiben.
edited 1×, last 10.07.12 09:50:06 pm

old Re: gelagerte Items prüfen

Mc Leaf
Super User Off Offline

Quote
user Hurri04 has written
user Nova meinte gestern abend in ner PM-diskussion zu mir, dass die anzahl der items, die in objekten mit dem behaviour "storage" gelagert sind, durch den befehl count_stored wohl mit einem negativen vorzeichen zurückgegeben wird.
problem gefunden würd ich sagen.

Wäre mir neu...

user -tony316- has written
@user Hurri04:
Also muss ich in meinem Script immer ein Minus vor die Variablen schreiben?

Warum... warum... warum...?! Warum hab' ich bloß die Debuglines oben vorgeschlagen...? Rrrrrichtig! Damit lassen sich nämlich all' diese Fragen gaaaaaanz einfach klären. :p

So. Du bist jetzt auch genau einen Monat hier registriert, sehe ich gerade. Damit läuft dein Welpenschutz heute ab.

Hab' jetzt selbst auch noch einmal das Script und so getestet. Inklusive meiner "Debuglines"... Und Hurri04 bekommt definitiv einen dumme-Vorschläge-Award.

old Re: gelagerte Items prüfen

Hurri04
Super User Off Offline

Quote
user Mc Leaf has written
Hab' jetzt selbst auch noch einmal das Script und so getestet. Inklusive meiner "Debuglines"... Und Hurri04 bekommt definitiv einen dumme-Vorschläge-Award.

nebensächliches zeug, weil ich den award verdient hab (siehe vorherige posts) >


aber spiel dich mal nicht so auf, dass du das mit den debug-lines gesagt hast, ich hab das als erstes vorgeschlagen
edited 1×, last 10.07.12 09:53:12 pm

old Re: gelagerte Items prüfen

Mc Leaf
Super User Off Offline

Quote
Tzä... und wenn Nova dir erzählt, es regnet Schweine...?

Und die Idee mit s2 cmd msg hast du auch nur von mir, und zwar aus der PN vom... äh... 18.03.2009.

old Re: gelagerte Items prüfen

Nova
User Off Offline

Quote
Oh, da gab es wohl Probleme mit der Kommunikation user Hurri04. Ich sagte, dass der Befehl s2 cmd storage mit dem Modus 1 einen falschen Wert zurückgibt. Sollte der Spieler also eigentlich 2000 Gramm seines internen "Lagers" nutzen, dann wird -2000 zurückgegeben. Sollte er aber durch beispielsweise Schmetterlinge sogar einen negativen Lagerwert nutzen, dann wird ein positiver Wert zurückgegeben.
(Ein Schmetterling reduziert das Gewicht um 500, also bei 2 Schmetterlingen und sonst nichts im Inventar hat der Spieler -1000 Gewicht. Der Befehl allerdings gibt dann +1000 zurück.)
Dieser Fehler ist mir aufgefallen, als ich mein Gewichtsscript geschrieben haben (je weniger der Spieler trägt, desto schneller ist er.) Ich weiß allerdings nicht, ob dieser Fehler nur beim Spieler oder bei allen Objekten / Einheiten auftaucht.
Einen Fehler bei s2 cmd count_stored kann es auch geben, allerdings ist mir dort keiner bekannt. Das s2 cmd abs ist deswegen zwar nicht schädlich (da der Wert sich nicht ändert), aber nutzlos.

Achtung: Der Befehl s2 cmd abs gibt immer einen positiven Wert zurück, er ist also nicht dafür geeignet, den Fehler bei s2 cmd storage mit Modus 1 zu beheben. Ein positiver Wert bleibt nämlich auch mit s2 cmd abs positiv.

@user Mc Leaf: Wenn ich was von regnenden Schweinen sagen würde, dann sollte man mir das auch glauben. (Jedenfalls wenn ich das ernst meine. Da es aber keine Schweine in Stranded II gibt, wird das wohl nicht so schnell passieren. )
edited 1×, last 10.07.12 07:08:00 pm
To the start Previous 1 2 Next To the start
Log in to reply Scripts overviewStranded II overviewForums overview