Benutzer-Werkzeuge

Webseiten-Werkzeuge


Dies ist eine alte Version des Dokuments!


………………………………………………………. ……………………………..

oCTriggerScript

1. TimeLoop

Wir beginnen mit einer ganz gewöhnlichen Zeitschleife. Wozu dient eine Zeitschleife?:

  • In der Zeitschleife kann zum Beispiel abgefragt werden, ob der Spieler ein bestimmtes Item besitzt, da die Zeitschleife in wiederkehrenden Abständen, (Intervall einstellbar) durchliest, was in diesem Script alles eingetragen ist oder abgefragt werden soll.
  • Wir starten den Spacer und öffnen die zu bearbeitende *.ZEN
    • Wir nehmen uns das ObjektPagesFenster vor, setzen einen Haken bei „Hold“ und stellen jetzt die Zeit auf etwa 12:00. Jetzt wird es, egal wie lange wir arbeiten, nicht regnen im Spacer und auch nicht dunkel werden. 12:00 habe ich gewählt, weil es da eigentlich am hellsten sein müsste.

1.1 Einsetzen TriggerScript

  • Wir wenden uns dem Objektfenster zu und klicken uns durch den Pfad → zCVob → zCTriggerBase(abstract) → → zCTrigger → ocTriggerScript

pic_01

  • Wir klicken mit der rechten Maustaste in das Spacer Hauptfenster und erhalten das Vob-Fenster mit der Option „Insert(oCTriggerScript)“

  • Wir klicken auf „Insert(oCTriggerScript)“ und erhalten einen „grauen Würfel“ - ein Koordinaten-Kreuz welches „oCTriggerScript“ benannt ist.

  • Wir geben unserem oCTriggerScript einen Namen mit Bezug. In unserem Falle TS_TIMELOOP_05
  • TS = TRIGGERSCRIPT - TIMELOOP = ZEITSCHLEIFE - 05 = 0.5sec (Intervall der Abfrage)
    • vobName:TS_TIMELOOP_05 (IN GROSSBUCHSTABEN)

1.2 Einstellen TriggerScript

Dieser ocTriggerScript benötigt weder ein Visual, noch Kollision. Also belassen wir nachfolgende 4 Einträge unverändert

  • visual:(ohne Eintag)
  • cdStatic:FALSE (Kollision gegen statische Vobs)
  • cdDyn:FALSE (Kollision gegen dynamische Vobs)
  • staticVob:FALSE (ob das Objekt in die Lichtberechnung einbezogen wird)
  • Vorerst wenden wir uns jetzt den Einstellungen des Objektfenster im Ordner „Trigger“ zu
  • Trigger
    • ActivationFilter
      • reactOnTrigger:TRUE (Muss so bleiben, sonst reagiert der oCTriggerList nicht mehr auf Aufrufe, Script oder Direktlink im Spacer)
      • reactOnTouch:TRUE (Hat keine Auswirkungen bei unserer Beispielschleife, egal ob der Eintrag FALSE, oder TRUE heisst)
      • reactOnDamage:TRUE (Funktioniert nur mit Bogen und Armbrust, aber in unserem Falle auch nicht, da wir die Kollision ausgeschaltet haben.
      • respondToObject:TRUE (Ein Trigger reagiert zwar nicht auf die Berührung mit Objekten, habe noch nie diese Situation herbeiführen können, wenn man das aber, auf FALSE stellt, dann läuft zum Bsp. ein Mover, der angesteuert wird, nicht mehr an. Wir belassen das auf TRUE)
      • respondToPC:TRUE (Trigger reagiert zwar auf PC/Hero, aber nicht in unserem Falle, da wir die Kollision ausgeschaltet haben)
      • respondToNPC:TRUE (Trigger reagiert zwar auf NPC, aber nicht in unserem Falle, da wir die Kollision ausgeschaltet haben)
      • startEnabled:TRUE (Wenn das auf „FALSE“ steht reagiert der oCTriggerscript nicht mehr)
      • respondToVobName: (ohne Eintrag)
      • numCanBeActivated:-1 (unendlich oft, 1 wäre 1x, 10 wäre 10x, 0 = aus/gar nicht)
      • retriggerWaitSec:0 (Wartezeit bis zur nächsten Auslösung in sec)
      • damageTreshhold:0 (? habe ich noch nie benutzt)
    • FireBehavior
      • fireDelaySec:0.5 (Hier tragen wir unsere 1/2 Sekunde ein, denn unser TimeLoop soll alle 0.5sec aufgerufen werden. Wichtig = 0.5 → NULL_PUNKT_Fünf, nicht Komma)
      • sendUntrigger:TRUE
  • scriptFunc:MY_TIMELOOP (GROSSBUCHSTABEN)

Hier das komplette Objektfenster mit den Einstellungen für einen funktionierenden TimeLoop

1.3 TimeLoop Test

  • Wir benötigen einen Eintrag in der Startup.d um den TimeLoop bei Gamestart zu aktivieren
 Wld_SendTrigger("TS_TIMELOOP_05");
  • Dazu erstellen wir ein Script. In dieses Script könnt ihr später alle eure Abfragen reinpacken Wir setzen jetzt lediglich einen Print in die Schleife um die Funktion zu prüfen.
func void MY_TIMELOOP() // Scriptfunc des oCTriggerScript
{
  PRINT("TEST SCHLEIFE");
  
  
Wld_SendTrigger("TS_TIMELOOP_05"); // Am Ende des TimeLoop ruft die   
};                                 // Zeitschleife sich selbst wieder auf
  • Wenn wir jetzt das Game starten und die Testprints werden gedruckt, dann haben wir alles richtig gemacht.

2. Trigger Touch

  • Wie schon der Name sagt, ist das der oCTriggerScript, der berührt werden muss,
  • Das kann mit einem Pfeil oder Bolzen ausgelöst werden wenn man den Trigger beschiesst → switch_mit_fkw_beschiessen
  • oder ein NPC/PC muss den oCTriggerScript berühren.
  • Wir haben z.B eine Pendelklingenfalle, die der Hero bei Annäherung an die Pendelklingen auslösen soll. Wer diese nachbauen will, oder nicht kennt, der kann sich hier informieren → Mover Level 2
  • Da gibt es auch mehrere Möglichkeiten das bei Annäherung auszulösen:
  • Wir setzen einen Waypoint und schreiben in das Script unseres TimeLoop´s → timeloop
var int aufruf;
func void MY_TIMELOOP() // Scriptfunc des oCTriggerScript
{
  if (Npc_GetDistToWP (PC_Hero, "WP_FALLE")< 800) // kleiner 8m
  && (aufruf == 0)
  {
     Wld_SendTrigger("NAME");
     aufruf = 1;
  };
  
  Wld_SendTrigger("TS_TIMELOOP_05");// Am Ende des TimeLoop ruft die   
};                                  // Zeitschleife sich selbst wieder auf
  • oder ihr setzt beim oCTriggerScript den Eintrag „numCanBeActivated:1“, dann kann der oCTriggerScript nur 1x ausgelöst werden und ihr benötigt nicht die Variable „aufruf“.
  • oder wir setzen in angemessener Entfernung von der Falle eine Triggerbox, in die der NPC reinlatschen muss um den oCTriggerScript auszulösen.
  • 2.2 Wir geben dem oCTriggerScript einen vobName:FALLESTART
  • 2.3 Wir klicken im Objektfenster auf die Zeile „Edit the Box“

  • 2.4 und danach auf den Button „Define“

  • 2.5 und erhalten das BoundingBox-GrössenEinstellfenster

  • 2.6 Da ich weiss, dass mein Flur 4,8m breit ist gebe ich für „X“ 480 ein. Ihr müsst halt probieren, bis dass die BoundingBox des oCTriggerScript die Breite eures Raumes einnimmt. Für die Höhe „Y“ habe ich 150cm gewählt, damit der Hero nicht darüber springen kann und die Tiefe „Z“ 50cm. Wenn die Boundingbox zu dünn ist, löst sie unter Umständen nicht aus.

  • 2.7 Wir klicken auf „OK“ und anschliessend auf den Button Stop
  • 2.8 Wir stellen numCanBeActivated:1 (kann nur einmal ausgelöst werden), oder wir belassen das auf -1 (unendlich) und sperren weitere Auslösungen per Script.
  • 2.9 Einstellung cdDyn:TRUE Wenn der Player nicht mit der Box kollidieren kann, dann spricht sie nicht an.

Jetzt gibt es nur noch das Problem, dass an solch einer TriggerBox Pfeile und Bolzen abprallen. Ein Problem das wir lösen könnten, wenn wir die Triggerbox breitflächig anlegen, so dass man ebenfalls nicht drüber springen kann und extrem flach, ca 20 cm, was dem Bogenschiessen ja keinen Abbruch tut.

… oder aber ihr strebt eine Lösung mit Ikarus an → http://forum.worldofplayers.de/forum/threads/1299679-Skriptpaket-Ikarus-4

  • 2.10 Fassen wir mal zusammen. Damit ein oCTriggerScript reagiert, wenn der Hero in die BoundingBox läuft, die BoundinBox berührt oder von einer sich bewegenden BoundingBox berührt wird, müssen folgende Voraussetzungen erfüllt sein: Das sind jetzt nur die Einstellungen die verändert werden müssen
    • VobName:NAME_TRIGGER
    • cdDyn:TRUE
    • respondToPC:TRUE (so belassen)
    • respondToNPC:FALSE (es sei denn, der Trigger soll auch auf alle anderen NPC reagieren)
    • numCanBeActivated:alles ausser Null
    • fireDelaySec:Verzögerung kann man einstellen wenn man das benötigt
    • scriptFunc:Um ein Script aufzurufen, wo dann reguliert wird, was geschehen soll.
  • triggerTarget: könnt ihr nutzen, wenn ihr im Spacer direkt auf ein anderes Objekt, wie z.B. Mover, TriggerList, MoverControler usw. verlinken wollt. Ihr erhaltet dann im Spacer immer eine„Blaue Linie“ zwischen den verlinkten Objekten.

2A Mobiler Schadenstrigger

Für unsere Pendelbeilfalle → Mover Level 2 benötigen wir jetzt noch die Auslösung, damit ein NPC/PC, der von der Beilklinge berührt wird einen Schaden erleidet.

  • Wir klicken auf den Mover (eine von den Beilklingen)und anschliessend auf die Taste „M“ und stellen die Beilklinge snkrecht. (jetzt nicht mehr mit der linken Maustaste auf den Mover klicken, sonst springt der Zurück in seine Ausgangsstellung)

  • Wir klicken im Objektfenster auf „Create“ und wählen dort den Eintrag „oCTriggerScript“
  • Wir klicken auf eine leere Stelle im Spacer Hauptfenster (linke Maustaste)
  • Anschliessend auf unsere Beilklinge mit der rechten Maustaste und wir ehalten das Vobfenster mit der Option einen oCTriggerScript als Child of Mover einzusetzen.

  • Wir klicken mit der linken Maustaste auf „„Insert(oCTriggerScript)as child of „Name_Mover“
  • Ein Blick in das ObjektListFenster

  • Wir editieren die BoundingBox des Triggers und vollziehen die Schritte 2.2 → 2.5 wie beschrieben oberhalb nach
  • und stellen jetzt die Boundingbox des Schadentriggers von der Grösse her so ein, dass die BoundingBox die Beilklinge umschliesst.

  • Wir benennen den oCTriggerScript mit vobName:TS_BEILSCHADEN_D und wenn wir jetzt den Mover bewegen, bewegt sich der an die Beilklinge gehängte Schadenstrigger mit.

  • Das wiederholen wir jetzt mit den 3 anderen Beilklingen.
  • Wir stellen den Schadenstrigger so ein, dass er Berührung reagiert (siehe oben 2.10)
  • Beispiel scriptFunc:DAMAGE_D
  • Und jetzt benötigen wir noch ein Script um den Schaden zu erzeugen: Beispiel Schaden Hero
func void damage_d()
{
  if (Npc_IsPlayer(PC_Hero))
  {
    PRINT("AUA!"); //TESTPRINT
    Npc_ChangeAttribute(hero, ATR_HITPOINTS, -50);
  };
};

Dazu könnt ihr noch den Sound eintragen wenn ihr wollt, dass das Opfer schreit bei einem Treffer (DUMMY_WOUND)
und/oder Blut spritzen lassen….. wie es euch gefällt.

quickstart/triggerscript.1456145883.txt.gz · Zuletzt geändert: 2016/02/22 13:58 von 85.180.72.156