Construction Set [Tutorial] Triggerskripten

sinHHHans

Bürger
Ich schreib hier einfach mal mein Tutorial rein,vielleicht interessiert es ja jemanden^^

sinHHHans’ Skript Tutorial

-Triggerskripts-
=>Download der .doc Version(Übersichtlicher)<=​
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.



Zunächst mal gibt es 3 unterschiedliche Begin-Blöcke die mit Triggern zu tun haben. Hier eine kurze Erklärung:

  • · Begin OnTrigger [TriggerReferenz] (optional)
    Dieser Block wird einmal durchlaufen, wenn jemand oder etwas mit der Triggerzone kollidiert.

    · Begin OnTriggerActor [Actor Referenz] (optional)
    Dieser Block wird einmal durchlaufen, wenn jemand mit der Triggerzone kollidiert .Er reagiert also nur auf Kreaturen und NPCs.

    · 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 mehr machen als du vielleicht 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 :
PHP:
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.

PHP:
 Scn MeinZweitesTriggerScript

ref TrigRef
Ref  TriggerRef
ref self
Short passed  ;

Begin OnTriggerActor 
set self to getself

Set TrigRef to GetActionRef  ; mit GetActionRef  kann man sich die Referenz von jedem Objekt oder Actor holen , der durch die Triggerzone läuft. 
if TrigRef != player  ;Sicherstellen das der Spieler unversehrt bleibt
	set TriggerRef to Trigref
endif

If IsActionRef player == 1 || TriggerRef == player ; noch mal absichern vom Spieler
	return
	message "Spieler"
elseif IsActionRef player == 0 && TriggerRef != player ; wenn derjenige der durch die Triggerzone läuft, nicht der Spieler ist, dann mache folgendes:
	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 das man für andauernde Effekte,zum Beispiel Timer oder Shader Effekte immer einen zusätzlichen Gamemode–Block brauchen, weil der die Trigger-Blöcke nur in dem Moment durchlaufen werden in dem jemand die Triggerbox passiert.

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 :

PHP:
 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 vergeben
			Set 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. Bei Fragen bitte auf www.Ei-der-Zeit.com oder bei www.Scharesoft.de .

Gutes Gelingen bei Euren weiteren Triggerscripts wünscht
Euer sinHHHans :)
 
Zuletzt bearbeitet: