Construction Set Wie geht die IF-Abfrage?

E

Ehemaliger Benutzer

Gast
Hallo an alle,

ich arbeite gerade an meinem Projekt "Dordranos" und stehe vor einem kleinen Problem wo ich gar nicht weiter weiß.

Ich will, dass ein NPC mir etwas aus dem Inventar nimmt so bald ich das Item besitze und den NPC anspreche (Quest, wo ich etwas für ihn besorgen soll).

Nebenbei: Hier ist mein Projekt an dem ich gerade arbeite.

Hier könnt ich noch einmal lesen worum es bei meinem Problem geht. Ich hoffe jemand kann mir helfen....


Ich bitte um Hilfe.....:

Ich bin nun schon so "weit", dass mir Torban (mein 1. NPC) eine Quest gibt die auch im Questbuch steht, und er mir eine Landkarte gibt. Ich soll zu Max gehen (dem 2. NPC in Dordranos) und für ihn etwas erledigen. Der gibt mir dann den Auftrag im Wald in einer Kiste "Fenchelsamen" zu besorgen. Diese soll ich Max geben wenn ich sie gefunden habe......

Bis hier hin habe ich alles komplett und fehlerfrei hinbekommen. Wenn ich in den Wald gehe und die Fenchelsamen (z.b. 15 stück) aus der Kiste nehme und zurück zu Max gehe. Dann möchte ich natürlich, so bald ich 15 Fenchelsamen in meinem Inventar habe, dass er sie mir abnimmt (player.RemoveItem FennelSeeds 15). Jetzt fehlt mir nur noch die IF-Abfrage ob ich sie auch wirklich besitze... oder?

Erreichen möchte ich nun, dass Max mir die 15 Fenchelsamen abnimmt so bald ich sie in meinem Inventar besitze.

Wer kann mir helfen? Hat jemand eine Idee? Wie soll ich nun fortführen? Kann mir jemand helfen? :)

Lieben Gruß
Matti :) :)

PS:
Hier einige Bilder zu meiner 1. Quest. Auch die beiden NPCs werde ich hiermit schon einmal präsentieren. Ich hoffe ihr könnt mir bei meinem kleinen Problem mit der IF-Abfrage helfen... :) :)

Meine 1. Quest:

Quest1.jpg


KartevonTorban.jpg

Ganz nebenbei: Wie kriege ich das ">" ganz oben in der Überschrift weg?
<div align=”center”><br>
Kleine Übersicht<br>
<br><br>
<IMG SRC="Data\Textures\MattisLandkarteNPCTorban1.dds" width=404 height=384> <br>
NPCs:

NPC_Torban.jpg
NPC_Max.jpg

Torban und Max sind befreundet. Sie haben beide nicht viel und schlafen in einem Zelt. Sie helfen sich gegenseitig aus. Wobei Torban derjenige ist der die Hauptquest einleiten wird, nachdem man für ihn das eine oder andere erledigt hat. (so in etwa startet das Abenteuer). Ich werde diese NPCs, wenn das Projekt fertig ist, nur an einem anderen Ort plazieren damit alles passt wenn man durch das Portal nach Dordranos kommt.
 
Bis hier hin habe ich alles komplett und fehlerfrei hinbekommen. Wenn ich in den Wald gehe und die Fenchelsamen (z.b. 15 stück) aus der Kiste nehme und zurück zu Max gehe. Dann möchte ich natürlich, so bald ich 15 Fenchelsamen in meinem Inventar habe, dass er sie mir abnimmt (player.RemoveItem FennelSeeds 15). Jetzt fehlt mir nur noch die IF-Abfrage ob ich sie auch wirklich besitze... oder?
Hi Matti,
du könntest es so machen:

Du könntest es so machen.
Der NPC, der dir den Auftrag gibt löst eine Queststage aus (zum Beispiel Stage 5). Wenn die 15 Samen in einer Kiste liegen, dann kannst du folgendest Skript auf den Samen legen und erneut eine Stage auslösen, sobald der Player sie aufnimmt.(Stage 10).
SCN Name
Begin OnAdd player
setstage Quest Stage
end
Der Samen sollte allerdings eine eigene ID besitzen, da sonst diese Stage auch ausgelöst werden würde, wenn du irgendwo einen anderen findest. Wenn du nun zum NPC zurück kommst, dann hat er, wenn du die Einstellungen im Zitat übernimmst, ein neues Gesprächstopic für dich, sofern du natürlich eins angelegt hast.
"Condition Function" > GetStage; bei "Function Parameter" stellst du deine Quest ID ein; bei "Comparson" sollte == stehen und bei Value die Stage 10 (auf jeden Fall die Stage die durch den Samen ausgelöst wurde).
Im Result Skript Fenster trägst du dann deinen Befehl ein, den du bereits erwähnt hast und löst mit dem Topic erneut eine Stage aus (setstage xyz Stage).
Wenn die Samen, wie von dir beschrieben, an einer Stelle liegen, kannst du das so machen, da eine Abfrage ob du die 15 wirklich im Inventar hast, nicht nötig ist. Sollten sie verteilt liegen, dann geht es so nicht.
Grüße
Bernd009
 
  • Like
Reaktionen: 1 Person
Hi

Script (Typ Objektscript) auf den NPC, dem du das Zeuge besorgen sollst:

PHP:
Scriptname MeinNPCScript

short ZeugBesorgt 						;short damit der Passus nur 1x durchläuft


Begin OnActivate Player

	Activate
	if Player.GetItemCount MeinZeug >= 15 		;Hat der Spieler min. 15?		
		if ZeugBesorgt == 0 				;Ist es schon einmal durchgelaufen?
			player.RemoveItem MeinZeug 15	; Nimm dem Spieler 15 Weg
			set ZeugBesorgt to 1			; Damit es nur 1x durchläuft
			setStage QuestZeugBesorgen to 15	; Auslösen der QuestStage Bsp. 15
		endif
	endif
end

Topics GREETING im Quest:

NPC: "Was kann ich für Euch tuen?" ;Quest ist noch nicht vergeben.
Bedingung: GetStage - QuestZeugBesorgen <= 10

NPC: "Habt ihr mir das Zeug besorgen können?" ;Das "Besorgen" läuft.
Bedingung: GetStage - QuestZeugBesorgen == 10

NPC: "Ich kann es immer noch nicht glauben, dass ihr es besorgen konntet." ; Besogen vorbei.
Bedingung: GetStage - QuestZeugBesorgen >= 15


Anmerkung:
Wenn der Spieler etwas besorgen soll, wie z.B. Fenchelsamen, so kann er ihn überall besorgen.

Auslösen der QuestStage:
If Player.GetItemCount FenchelSamen >= 15

Alles andere führt zu Verwirrungen. Es sei denn, du weißt darauf hin, dass es eine besondere Art ist, die nur da oder dort wächst.

Z.B. ist der Samen in einer Kiste:
Script auf die Kiste --> QuestStage

Eintrag beim öffnen:
"Ich habe den Samen gefunden. Ich sollte ihn an mich nehmen und zu Max zurückkehren."

Eintrag wenn der Spieler 15 Stück im Inventar hat:
if Player.GetItemCount Fenchelsamen >= 15
"Ich habe 15 Fenchelsamen sammeln können. Ich sollte sie zu Max bringen."

PS:
Das Thema gehört in den CS-Bereich. ;)
 
Zuletzt bearbeitet:
  • Like
Reaktionen: 1 Person
Sicher? Ich meine mich nämlich zu erinnern, dass es bei mir einmal Probleme gab, als ich das über die RefID regeln wollte. Ist natürlich auch möglich, dass ich mich falsch erinnere, aber who knows. o.o
 
Hi Matti,
du könntest es so machen:

Du könntest es so machen.
Der NPC, der dir den Auftrag gibt löst eine Queststage aus (zum Beispiel Stage 5). Wenn die 15 Samen in einer Kiste liegen, dann kannst du folgendest Skript auf den Samen legen und erneut eine Stage auslösen, sobald der Player sie aufnimmt.(Stage 10).
Der Samen sollte allerdings eine eigene ID besitzen, da sonst diese Stage auch ausgelöst werden würde, wenn du irgendwo einen anderen findest. Wenn du nun zum NPC zurück kommst, dann hat er, wenn du die Einstellungen im Zitat übernimmst, ein neues Gesprächstopic für dich, sofern du natürlich eins angelegt hast.
Im Result Skript Fenster trägst du dann deinen Befehl ein, den du bereits erwähnt hast und löst mit dem Topic erneut eine Stage aus (setstage xyz Stage).
Wenn die Samen, wie von dir beschrieben, an einer Stelle liegen, kannst du das so machen, da eine Abfrage ob du die 15 wirklich im Inventar hast, nicht nötig ist. Sollten sie verteilt liegen, dann geht es so nicht.
Grüße
Bernd009

Hi Bernd009!! :) :)

Danke für Deine super Lösung! Ich muss sagen, in DIESEM Fall ist Deine Idee eine super Lösung.

Begründung:
Ich könnte mir ja auch die Samen ercheaten, oder anderswo holen (insofern im Spiel in irgendwelchen Tonnen auch schon diese Samen vorhanden sind). Dann hätte ich die Quest erfüllt, jedoch nicht "sauber" erfüllt. Also von daher ist die Idee mit der Queststage super.

Trotzdem werde ich beide Lösungen (auch die von Eddy Kaschinski) abspeichern und GARANTIERT beide immer wieder nutzen bzw. nutzen müssen. Sind ja noch viele viele Quests die ich noch aufbauen will. Da sind diese beiden Lösungen vonnützen.

Lieben Dank! :)

Matti :)

Hi

Script (Typ Objektscript) auf den NPC, dem du das Zeuge besorgen sollst:

PHP:
Scriptname MeinNPCScript

short ZeugBesorgt                         ;short damit der Passus nur 1x durchläuft


Begin OnActivate Player

    Activate
    if Player.GetItemCount MeinZeug >= 15         ;Hat der Spieler min. 15?        
        if ZeugBesorgt == 0                 ;Ist es schon einmal durchgelaufen?
            player.RemoveItem MeinZeug 15    ; Nimm dem Spieler 15 Weg
            set ZeugBesorgt to 1            ; Damit es nur 1x durchläuft
            setStage QuestZeugBesorgen to 15    ; Auslösen der QuestStage Bsp. 15
        endif
    endif
end


Anmerkung:
Wenn der Spieler etwas besorgen soll, wie z.B. Fenchelsamen, so kann er ihn überall besorgen.

Auslösen der QuestStage:
If Player.GetItemCount FenchelSamen >= 15

Alles andere führt zu Verwirrungen. Es sei denn, du weißt darauf hin, dass es eine besondere Art ist, die nur da oder dort wächst.

Z.B. ist der Samen in einer Kiste:
Script auf die Kiste --> QuestStage

Eintrag beim öffnen:
"Ich habe den Samen gefunden. Ich sollte ihn an mich nehmen und zu Max zurückkehren."

Eintrag wenn der Spieler 15 Stück im Inventar hat:
if Player.GetItemCount Fenchelsamen >= 15
"Ich habe 15 Fenchelsamen sammeln können. Ich sollte sie zu Max bringen."

PS:
Das Thema gehört in den CS-Bereich. ;)

Hallo Eddy Kaschinski,

lieben Dank für Deine sehr ausführliche Lösung. Ich werde mich heute da dran machen und diese Quest zum Abschluss bringen. Wenn alles funktioniert werde ich es hier posten.

Oh tut mir leid, vielleicht kann der Moderator mein Thread in den construction set-Bereich verschieben? Das wäre super. Demnächst weiß ich das dann auch (habe wohl nicht genug nachgesehen vorher).

Lieben Gruß
Matti :)
 
Zuletzt bearbeitet von einem Moderator:
Hi

Script (Typ Objektscript) auf den NPC, dem du das Zeuge besorgen sollst:

PHP:
Scriptname MeinNPCScript

short ZeugBesorgt                         ;short damit der Passus nur 1x durchläuft


Begin OnActivate Player

    Activate
    if Player.GetItemCount MeinZeug >= 15         ;Hat der Spieler min. 15?        
        if ZeugBesorgt == 0                 ;Ist es schon einmal durchgelaufen?
            player.RemoveItem MeinZeug 15    ; Nimm dem Spieler 15 Weg
            set ZeugBesorgt to 1            ; Damit es nur 1x durchläuft
            setStage QuestZeugBesorgen to 15    ; Auslösen der QuestStage Bsp. 15
        endif
    endif
end


Anmerkung:
Wenn der Spieler etwas besorgen soll, wie z.B. Fenchelsamen, so kann er ihn überall besorgen.

Auslösen der QuestStage:
If Player.GetItemCount FenchelSamen >= 15

Alles andere führt zu Verwirrungen. Es sei denn, du weißt darauf hin, dass es eine besondere Art ist, die nur da oder dort wächst.

Z.B. ist der Samen in einer Kiste:
Script auf die Kiste --> QuestStage

Eintrag beim öffnen:
"Ich habe den Samen gefunden. Ich sollte ihn an mich nehmen und zu Max zurückkehren."

Eintrag wenn der Spieler 15 Stück im Inventar hat:
if Player.GetItemCount Fenchelsamen >= 15
"Ich habe 15 Fenchelsamen sammeln können. Ich sollte sie zu Max bringen."

PS:
Das Thema gehört in den CS-Bereich. ;)

Hallo Eddy Kaschinski,

eine Frage habe ich aber noch. Du hast geschrieben

Z.B. ist der Samen in einer Kiste:
Script auf die Kiste --> QuestStage

Wie meinst Du das? Ich habe nun das Skriptfenster geöffnet und weiß gar nicht was ich hineinschreiben soll. Immerhin weiß ich nun wie der Text

"Ich habe den Samen gefunden. Ich sollte ihn an mich nehmen und zu Max zurückkehren."


angezeigt werden kann. (mit MessageBox)....

Lieben Gruß
Matti
 
PHP:
Scriptname MeineKisteScript

short ItemGefunden

Begin OnActivate Player

	activate
	if ItemGefunden == 0
		if Player.GetStage MeinQuest < 15 ; Beispiel
			setStage MeinQuest 15
			set ItemGefunden to 1
		endif
	endif
end

In der Stagemeldung kommt dann: Ich habe die Samen gefunden.......
 
  • Like
Reaktionen: 1 Person
Hi Eddy,

Nun werde ich schauen ob ich das umsetzen kann. Ich meld mich wieder wenn der gescriptete Part von meiner Quest funktioniert. Ich bin grad dabei es im Spiel zu testen. :)

Lieben Gruß
Matti

PS: Sorry, hatte lange telefoniert vorhin. Ich arbeite aber weiter an dem Skript. Wenn es Neuigkeiten gibt (ob es funktioniert hat) sag ich hier bescheid. :) Danke nochmal für Deine große Mühe @ Eddy. Find ich wirklich gut. So kann ich auch sehr gut dazulernen, und es soll nicht umsonst gewesen sein. :)

Nachtrag:

Jaaaaaaaaaaa!! *händehochhalt* :) :) :)

Ich habe es geschafft. Meine Skripte funktionieren. Ich habe nun alles hinbekommen. Und das wichtigste: Ich habe dazugelernt! Danke an Eddy und auch an Bernd009. Ihr ward mir eine super Hilfe!

Hier meine (selbstzusammengebastelten und nachvollziehbaren Skripte):


Scriptname 0_Fenchelsamen

short TonneNochNichtGeoeffnet

Begin OnActivate Player

if TonneNochNichtGeoeffnet == 1
MessageBox "Diese Tonne hast Du doch schon entleert! Du findest nichts Neues."
endif

if TonneNochNichtGeoeffnet == 0
activate
MessageBox "Ich habe die Tonne mit dem speziellen Fenchelsamen gefunden. Ich sollte ihn an mich nehmen."
set TonneNochNichtGeoeffnet to 1
endif
end

ScriptName 1_Fenchelsamen
Begin OnAdd Player

if Player.GetItemCount MattiFennelSeeds == 15 ;Wenn ich 15 Samen habe...
MessageBox "Ich habe den besonderen Fenchelsamen nun an mich genommen und sollte zu Max zurückkehren."
setStage 001NPCMax 10
endif

End

:) :) Ich freu mich.

Jetzt brauch ich nur noch im Questeditor weitermachen..... (ihr wisst ja was ich meine. Meine Stage ist ja nun 10, und kann so weitermachen)....

Nachtrag:

Ich habe mein Skript getestet und mir ist aufgefallen, dass wenn ich z.b. nur einen Teil von den Fenchelsamen herausnehme, der Skript dann nicht richtig funktioniert. Mir wird dann der Zugang zur Tonne verwährt, obwohl ich noch gar nicht alle Samen herausgenommen habe. Ich habe mein Skript an der Tonne nun verändert. Und nun funktioniert alles:

Scriptname 0_Fenchelsamen

short TonneNochNichtGeoeffnet

Begin OnActivate Player

activate

if TonneNochNichtGeoeffnet == 0
MessageBox "Ich habe die Tonne mit dem speziellen Fenchelsamen gefunden. Ich sollte ihn an mich nehmen."
endif

if Player.GetItemCount "MattiFennelSeeds" == 15
MessageBox "Diese Tonne hast Du doch schon entleert! Du findest nichts Neues."
set TonneNochNichtGeoeffnet to 1
endif
end

So wird zwar jedes mal die Message erscheinen, dass ich den Samen gefunden habe, aber das ist in diesem Fall ja gar nicht schlimm, find ich.

Meine 1. Quest ist komplett fertig. :)

Ich verweise nun wieder auf mein Projekt.

Lieben Gruß
Matti :)
 
Zuletzt bearbeitet von einem Moderator: