sinHHHans’ Skript Tutorial - Triggerskripts

Ein Tutorial für Scripter um Trigger zu erstellen

Schlagworte:
  1. sinHHHans
    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:
    [​IMG]
    [​IMG]

    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
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden