Construction Set Was mache ich Falsch?

Fluffy

Neuankömmling
Was mache ich hier nur falsch?

Eine Notiz startet eine Quest. Die Quest weist auf ein Buch hin, Durch ein Quest Target kommt man zum Buch hier der Script: ( Info: Die Namen der quests hab ich mir jetzt nur so ausgedacht, natürlich werden sie im CS dann richtig eingefügt und bearbeitet )

scn 00qutest
Short Doonce
Begin OnActivate
if ( IsActionRef Player == 1 ) && ( Doonce == 0 )
SetStage testquest 10
Set Doonce to 1
endif
Activate
end

So, das funzt auch so wies soll! Wie schon gesagt durch nen questmarker kommt man dann zu einem buch. Das funzt auch. Zum nicht funzenden Teil. Das Buch ist im Besitz von jemandem, dieses Buch sollte beim aufheben die queststage 20 aktivieren, unabhängig vom weg wie man das buch erhält ( Mord, Diebstahl.....).

Ich habe schonmal gemoddet, war sogar schon dabei nif files zu machen. Hab aber dann ca 1Jahr Pause gemacht und mit Scripten hab ich mich nur sehr wenig auseinandergesetzt. So hier....


scn 00qutest
Short Doonce
Begin OnAdd
if ( IsActionRef Player == 1 ) && ( Doonce == 0 )
SetStage testquest 20
Set Doonce to 1
endif <---?
Activate
end

1. Wieso funzt das nicht=?
2. Kann mir wer den Pfeil erklären, also den Befehl endif und else? BZW kann mir wer den kompletten script erklären.

scriptname NameSkript
short(variable) doonce ( Tu Einmal ) ?
Begin OnAdd ( Beginne wenn geaddet wird )
If -Wenn-? ( IsActionRef Player == 1 ???? ) && -und- ( doonce == 0 , die "Tueinmal" Variable" ist nun auf 0, wenn sie auf 1 gesetzt wird dann wird der script nicht mehr ausgeführt, also dann wird die quest nicht mehr geaddet weil diese Variable den script praktisch sperrt ist das so ca richtig?)
setstage quest 20 ( Setzt die erstellte quest auf die stage 20 damit es eigentlich weiter geht, da mein script für das buch nicht funzt setzt er es auch nicht auf stage 20)
set doonce to 1 , setzt die short Variable doonce auf 1 damit der quest nicht nocheinmal geaddet werden kann.)
ich habs mal ohne endif versucht, dann spuckt cs aus das kein endif oder else befehl gefunden werden kann.
.......


Nun zum rest vielleicht kann mir wer meinen fehler ausdeutschen und mir den script genau erklären bzw mir bestätigen das mein Erklärungsversuch richtig ist

Danke im Vorraus

Euer Fluffy
 
Hallo Fluffy,

Ein herzliches Willkommen im Forum.

Nun, der Script würde richtig lauten:
Code:
scn 00qutest
Short Doonce
Begin OnAdd player
if Doonce == 0
SetStage testquest 20
Set Doonce to 1
endif
end

Normalerweise würde ich dir jetzt nicht erklären, was jeder einzelnen Befehl macht, aber da du neu bist und deinen Post so schön verfasst hast, mache ich mal eine Ausnahme :lol:

Code:
scn 00qutest
scriptname 00qutest
scn ist die Abkürzung von scriptname, man kann also eines von beiden benutzen. Damit erstellt man die ID des Scriptes, die einmalig sein muss, dass heißt, dass es den scriptnamen noch nicht geben darf. Der Befehl kommt immer an den Anfang eines Scriptes und auch nur ein mal.

Code:
Short Doonce
der Befehl Short deklariert eine Variable, in diesem Fall eine short-variable, die Ganzzahlen von -32768 bis 32767 speichern kann. Doonce ist in diesem Beispiel der Name der Variable, den du bei der Deklaration festlegen musst. Du solltest der Variable immer eine treffende Bezeichnung geben, damit du, wenn du den Script eventuell später nochmal ändern willst, wieder schnell den Sinn der Variable erkennst. Außerdem solltest du die Variablen-namen kurz halten, das erleichtert die Schreibarbeit.
Es gibt übrigens noch 2 weitere Variablentypen, und zwar Float und Long. Long kann wesentlich mehr Ganzzahlen als short speichern (-2,147,483,648 to 2,147,483,647) und eine Float ist für Fließkommazahlen zuständig (1.18E-38 to 3.40E38 ).

Code:
Begin OnAdd
;...
End
Dieses ist ein Beispiel für einen Begin-End-Block. Jedesmal, wenn die Bedingung (hier: OnAdd) gegeben ist, wird der Teil in diesem Block ausgeführt. Von Begin bis End. Hier gibt es eine Liste der Blocktypen.
Code:
if Doonce == 0
;...
Elseif Doonce == 1
;...
Else
;...
Endif
Dies ist eine Anweisung, durch die du Befehle erst bei gegebenen Bedingungen ausführen lassen kannst. Damit es leichter fällt, kurz eine Übersetzung:
If - Wenn
Else - Sonst
In meinem Beispiel wird abgefragt, ob die Variable Doonce gleich 0 ist, ist das der Fall, wird das darunter ausgefährt, bis zum nächsten If-teil (Elseif, Else oder Endif).
Elseif Doonce == 1 wird ausgeführt, wenn Doonce nicht 0 ist, sondern 1.
Und das unter Else wird ausgeführt, wenn alle vorherigen Bedingungen nicht zutreffen, also Doonce weder 0 noch 1 ist.
Du kannst mehrere Abfragen Verknüpfen, indem du 2 mal das kaufmännische "Und" benutzt (&&), wenn die verknüften Bedingungen beide wahr sein sollen. Wenn nur eine der Bedingungen wahr sein soll, benutzt du die beiden Striche ||. Es gehen natürlich auch mehr als nur 2 Bedingungen.

Code:
SetStage testquest 20
Der Befehl setzt die Quest auf eine andere Stage, aber das weißt du ja schon. Das brauche ich ja nicht erklären.

Code:
Set Doonce to 1
Der Set-Befehl setzt eine Variable auf einen anderen Wert. Indem Doonce auf 1 gesetzt wird, wird in dem Script verhindert, dass die Stage der Wuest beim nächsten mal wieder auf 20 gesetzt wird. Das würde nämlich passieren, wenn
der Spieler das Buch abermals aufheben würde.
Short und Long sind Ganzzahlen. Solltest du aber eine Short oder Long auf zB. 1.73 setzen, dann würde der Wert auf 1 gesetzt werden. Denn die Zahl wird nicht ab- oder aufgerundet, sondern alles nach dem Komma wird abgeschnitten.

Ich hoffe das hilft dir.

Gildur
 
Zuletzt bearbeitet:
  • Like
Reaktionen: robinH und Fluffy
Cool das hat mir sehr weiter geholfen dankesehr! Also hab ich das mit Doonce falsch verstanden, Nach Float long oder short gibt man ja für gewöhnlich etwas ein wie zb:
Short Test; Dies wird dann im script selbst als Variable verwendet. Naja gut ich dachte mir das Doonce schon ein eigener befehl wäre, weil es ja so oft vorkommt im cs. Doonce dachte ich mir heisst dann so ca. Do Once, so bin ich auf Tu nur einmal gekommen, weil der zusammenhang der variablen und die variable selbst, also doonce auf dies hinweisen xD. Naja Wurst auf jeden fall ma vielen dank, und nochmals nen herzlichen dank zum willkommensgruß!
 
Wenn beim Aufheben eines Buches eine Queststage ausgelöst werden soll geht das auch einfacher. Mit diesem Script funktioniert es bisher immer.
Ein kleines Problem gibt es aber: Der Skript würde unendlich oft ausgeführt, immer wenn das Buch dem Spielerinventar hinzugefügt wird. So würde es beim zweiten Mal zu einem Fehler kommen, da die QuestStage ja bereits erreicht ist.
 
Ein kleines Problem gibt es aber: Der Skript würde unendlich oft ausgeführt, immer wenn das Buch dem Spielerinventar hinzugefügt wird. So würde es beim zweiten Mal zu einem Fehler kommen, da die QuestStage ja bereits erreicht ist.

Was man so beheben kann:

Code:
scn Name

short doonce

Begin Gamemode
    if getitemcount [I][Buch][/I] >= 1 && doonce == 0
        setstage Quest Stage
        set doonce to 1
    endif
end
 
Zuletzt bearbeitet: