Ressourcen-Icon

sinHHHans’ Skript Tutorial - Triggerskripts

Vorwort:
Für dieses Tutorial sind grundlegende Skripting-Kenntnisse vorausgesetzt.

Trigger:
Trigger (dt. Auslöser) sind festgelegte Punkte, die ein bestimmtes Skriptereignis auslösen. Um diese Skriptereignisse geht es hier.

Triggerzone/Triggerbox:
Eine im CS vorhandene CollisionBox (Activators -> TrigZone..., die im Spiel nicht sichtbar ist, und die erkennen kann ob jemand oder etwas mit ihr kollidiert.

Eine .nif Datei mit bhkSPCollisionBox ist dazu notwendig.

Zunächst mal gibt es 3 unterschiedliche Begin-Blöcke die mit Triggern zu tun haben. Hier eine kurze Erklärung:
Code:
Begin OnTrigger  [TriggerReferenz] (optional)
Dieser Block wird einmal durchlaufen, wenn jemand oder etwas mit der Triggerzone kollidiert.
Code:
Begin OnTriggerActor [Actor Referenz] (optional)
Dieser Block wird einmal durchlaufen, wenn jemand mit der Triggerzone kollidiert .Er reagiert also nur auf Kreaturen und NPCs.
Code:
Begin OnTriggerMob  [TriggerReferenz] (optional)
Dieser Block wird einmal durchlaufen, wenn jemand, oder ein Projektil (z.B. Pfeil oder Feuerball) mit der Triggerzone kollidiert. Hauptsächlich zum erkennen von Projektilen gedacht.

Mit diesen Triggern kann man eine ganze Menge mehr machen als du denkst.

Skript 1:
Als erstes wollen wir ein Skript schreiben, was eine Queststage auslöst, sobald der Spieler durch eine Triggerzone läuft.
Dazu nehmen wir am besten den Begin OnTriggerActor Block und nehmen als Actor Referenz „player“.

Neben jeder Zeile steht eine Übersetzung, was in Zeile passiert

Also:

Code:
Scn MeinErstesTriggerscript

Short triggered

Begin OnTriggerActor player ; Sobald der Spieler mit der Triggerzone kollidiert...

If triggered == 0; ,und die triggered Variable noch unverändert bei null ist, mache folgendes:
Setstage MeinQuest 30 ; setzt die nächste Queststage auf 30
Set triggered to 1 ; setzte die triggered Variable auf 1, damit dieser Block nie wieder durchlaufen wird
Endif
End
Die triggered- Variable habe ich rein gemacht, damit die SetStage Funktion nicht mehrmals aufgerufen werden muss. Ist hier nicht dramatisch wenn man das weglassen würde, aber sobald das Skript länger wird, ist es vorteilhaft um nicht unnötig Rechenleistung zu verbrauchen.

Skript 2:
Jetzt wollen wir es etwas anspruchsvoller machen. Angenommen, wir bauen einen Gang.

Jeder Actor außer dem Spieler der diesen Gang passiert, soll versteinert werden und somit außer Gefecht gesetzt werden.

Wir verwenden auch hier wieder einen OnTriggerActor Block. Die Referenz lassen wir weg.

Code:
Scn MeinZweitesTriggerScript

Ref TriggerRef
Ref self
Short passed

Begin OnTriggerActor

If IsActionRef player ; Sicherstellen das der Spieler unversehrt bleibt
return
else ; wenn derjenige der durch die Triggerzone läuft, nicht der Spieler ist, dann mache folgendes:
Set TriggerRef to GetActionRef ; mit GetActionRef kann man sich die Referenz von jedem Objekt oder Actor holen , der durch die Triggerzone läuft.
TriggerRef.setghost 1
TriggerRef.setdestroyed 1
TriggerRef.addspell TrigSpellStone ; Der Zauber wird unten erklärt
set passed to 1
endif

End

Begin Gamemode ; Muss ein Gamemode-block sein weil der Stein-Effekt andauern soll, der Triggerblock allerdings nur durchlaufen wird wenn jemand mit dem Trigger kollidiert)
If passed == 1
TriggerRef.pms EffectStone ;Versteinerungs-Shader
TriggerRef.forceav speed 0
endif

End
Mit dem GetActionRef kriegt man also die Referenz von dem NPC oder der Kreatur die durch läuft.

Wenn man die Referenz hat kann man eigentlich alles mögliche ihr machen.

Man muss immer bedenken dass:
  • Man für andauernde Effekte, zum Beispiel Timer oder Shader Effekte immer einen zusätzlichen Gamemode–Block brauchen, weil ja die Trigger-Blöcke nur in dem Moment durchlaufen werden in dem jemand die Triggerbox passiert.
  • Die unterschiedlichen Blöcke in einem Script nicht nacheinander durchlaufen werden sondern je nach Blocktyp unterschiedlich. Der Gamemode Block kann zum Bespiel parallel zum Triggerblock durchlaufen werden oder auch davor, obwohl er im Skript unter dem Trigger Block steht .Das ist wichtig um Logik Fehler zu finden
Jetzt noch die Erklärung für den Zauber:

Der Zauber soll unser Ziel lähmen damit der Versteinerungseffekt besser wirkt weil die Opfer hart werden (wie Stein eben).

Das ganze habe ich als Eigenschaft gemacht weil dabei keine Magic Effekte auftreten. Hier 2 Bilder wie es dann aussieht:



Skript 3:
Als letztes gibt es etwas komplizierteres.

(Es geht natürlich beim skripten immer noch komplexer ,z.B. Guidobot’s Wurfsterne, diese Skripte sind mal nen Blick wert ^^, also sind diese Skripte im Tutorial natürlich eigentlich sehr sehr einfach.)

Man kann ja wie oben gezeigt auch Pfeile und sogar Zauber damit „einfangen“ und dann Sachen damit machen.

Jetzt geht es also um Pfeile und Magische Projektile (z.B. Feuerbälle).

Angenommen es ist ein Loch in der Decke einer Höhle.

Wir möchten das man mit 100 Gold belohnt wird, wenn man 10 mal einen Pfeil oder einen Zauber in das Loch getroffen hat.( Kann natürlich auch ein schwereres Ziel sein ^^)

Wir brauchen einen der 3 Triggerblöcken, na wisst ihr’s schon, hä?

  • Einen OnTriggerMob, genau.
Wer das wusste, braucht sich nur zu freuen dass er sich die Liste von oben gemerkt hat.

Alle anderen sollten sich die Liste oben noch mal anschauen ;-)

Und es geht los :

Code:
scn MeinDrittesTriggerScript

ref TrgRef
ref P1
ref P2
ref P3
ref P4
ref P5 ; Das werden die Projektile
ref P6
ref P7
ref P8
ref P9
ref P10
short Zaehler

Begin OnTriggerMob ; Immer wenn ein Projektil durch den grünen Kasten fliegt

Set TrgRef to GetActionRef ; Wie üblich die Referenz "einfangen"

If (TrgRef != p1) && (TrgRef != p2) && (TrgRef != p3) && (TrgRef != p4) && (TrgRef != p5) && (TrgRef != p6) && (TrgRef != p7) && (TrgRef != p8) && (TrgRef != p9) && (TrgRef !=p10) ; damit gehen wir sicher das kein Projektil zwei mal getriggert wird. Hier wird abgefragt ob das Skript die getriggerte Referenz schon kennt, nur wenn die Referenz unbekannt ist geht es weiter.
If Zaehler <= 10 ; Wenn noch nicht mehr als 10 Projektile durchgeflogen sind
Set Zaehler to (Zaehler + 1) ; dann zähle eins weiter Message "Treffer no. %.0f " , Zaehler ;zeige die Treffer Anzahl an

If P1 == 0 ;Das was hier steht ist dafür damit jeder Pfeil nur einmal gezählt wird
Set p1 to TrgRef
Elseif P2 == 0
Set p2 to TrgRef
Elseif P3 == 0
Set p3 to TrgRef
Elseif P4 == 0
Set p4 to TrgRef
Elseif P5 == 0
Set p5 to TrgRef
Elseif P6 == 0
Set p6 to TrgRef
Elseif P7 == 0
Set p7 to TrgRef
Elseif P8 == 0
Set p8 to TrgRef
Elseif P9 == 0
Set p9 to TrgRef
Elseif P10 == 0 ; Das heißt dass 10 unterschiedliche Projektile gezählt wurden
Set p10 to TrgRef
MessageBox "Ihr habt 10mal getroffen, damit habt Ihr euch 100 Gold verdient."
Player.additem Gold001 100 ; 100 Gold Belohnung an den Spieler vergebenSet p1 to 0
Set p2 to 0
Set p3 to 0
Set p4 to 0
Set p5 to 0 ; alle Referenzen wieder auf null setzen , damit das alles immer wiederholt werden kann.Set p6 to 0
Set p7 to 0
Set p8 to 0
Set p9 to 0
Set p10 to 0
Set zaehler to -1
return
Endif
Endif
endif
End
Soviel zu meinem ersten Tutorial.

Gutes Gelingen bei Euren weiteren Triggerscripts wünscht

Euer sinHHHans