Autor Thema: [Scripting for Dummies] Trigger Trigger - Teil 2 - Noch mehr Trigger  (Gelesen 5602 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline FG28_Kodiak

  • Blasenteetrinker
  • *****
  • Beiträge: 1.893
Nachdem wir es im ersten Teil nur mit einem Trigger zu tun hatten, ist es an der Zeit das ganze zu steigern.

Hierzu modifizieren wir die Mission aus der vorherigen Lektion (http://forum.sturmovik.de/index.php/topic,689.msg12726.html#msg12726).
Indem wir eine zweite Fahrzeugkolonne hinzufügen.

Also noch mehr zum Kaputt machen ;):


Und fügen einen zweiten Trigger mit Namen WinCondition2 hinzu.
Als Typ auch diesmal Zielfahrzeug zerstört (TGroundDestroyed) als Zentrum nehmen wir die neu erstellte Kolonne


Umschließen die Kolonne mit dem Radius und legen auch hier die Anzahl der zerstörten Fahrzeuge auf 50% also 3 Fahrzeugen fest.


Für das erste Beispiel ersetzen wir den Code aus dem vorherigen Beispiel durch diesen:
using System;
using maddox.game;
using maddox.game.world;


public class Mission : maddox.game.AMission
{

public override void OnTrigger(int missionNumber, string shortName, bool active)
{
    base.OnTrigger(missionNumber, shortName, active);
   
    if ("WinCondition1".Equals(shortName) && active)
        {
        GamePlay.gpHUDLogCenter("TeilZiel Wincondition1 erreicht");
        GamePlay.gpGetTrigger(shortName).Enable = false;
}
if ("WinCondition2".Equals(shortName) && active)
        {
        GamePlay.gpHUDLogCenter("TeilZiel Wincondition2 erreicht");
        GamePlay.gpGetTrigger(shortName).Enable = false;
}
}
}

Der Code wurde folgendermassen geändert:
Es kam ein neues C# - Schlüsselwort hinzu und zwar "base" dieses wird folgendermassen verwendet:
base.OnTrigger(missionNumber, shortName, active);
Die Aufgabe von base ist es die ursprünglich vorhandene OnTrigger - Methode aufzurufen und dadurch alles ordnungsgemäß zu initialisieren. Bevor sie vom Entwickler modifiziert wird.
Als Missiondesigner muss man sich eigentlich nur merken, wenn man eine vorhandene Methode überschreibt (override) sollte man sie einmal mit base aufrufen damit man später keine unliebsamen Überraschungen erlebt ;).
Außerdem wurde eine zweite IF-Anweisung hinzugefügt und der am Bildschirm auszugebende Text zur besseren Demonstration geändert.
if ("WinCondition2".Equals(shortName) && active)
{
    GamePlay.gpHUDLogCenter("TeilZiel Wincondition2 erreicht");         
    GamePlay.gpGetTrigger(shortName).Enable = false;   
}
Die Aufgabe dieser If - Anweisung ist eigentlich nur einen Text auszugeben wenn der neu hinzugekommene Trigger ausgelöst wird.

Bringt man nun seine Schiesskünste zur Anwendung erhält man folgendes:
Wird der Trigger "Wincondition1" ausgelöst erscheint die Meldung:

Beim Trigger "Wincondition2" dann


Nachteil oder Vorteil, je nachdem was gebraucht wird, ist beim obigen Script das nach auslösen des einen Triggers nicht verhindert wird das auch der andere Trigger später noch aktiviert werden kann. Möchte man das verhindern muss man den obigen Code folgendermassen verändern.
using System;
using maddox.game;
using maddox.game.world;


public class Mission : maddox.game.AMission
{

public override void OnTrigger(int missionNumber, string shortName, bool active)
{
    base.OnTrigger(missionNumber, shortName, active);
   
    if ("WinCondition1".Equals(shortName) && active)
        {
        GamePlay.gpHUDLogCenter("TeilZiel Wincondition1 erreicht");
        GamePlay.gpGetTrigger(shortName).Enable = false;
        GamePlay.gpGetTrigger("WinCondition2").Enable = false;
}
if ("WinCondition2".Equals(shortName) && active)
        {
        GamePlay.gpHUDLogCenter("TeilZiel Wincondition2 erreicht");
        GamePlay.gpGetTrigger(shortName).Enable = false;
        GamePlay.gpGetTrigger("WinCondition1").Enable = false;
}
}
}   


Wie bereits im ersten Teil angesprochen kann man mit Hilfe von
GamePlay.gpGetTrigger("NameDesTriggers").Enable einen Trigger an bzw. ausschalten.
Man braucht also nicht mehr zu machen als den zweiten Trigger zu deaktivieren damit dieser später nicht mehr aufgerufen werden kann.
Wird also der Trigger WinCondition1 aktiviert schaltet man den zweiten Trigger mit "GamePlay.gpGetTrigger("WinCondition2").Enable = false;" einfach aus. Wird der hingegen der Trigger WinCondition2 zuerst aktiviert schaltet man den ersten Trigger mit GamePlay.gpGetTrigger("WinCondition1").Enable = false; aus.

Das führt im Spiel dann zu folgenden Ergebnis:
Zerstört man z.B. 3 Ziele des ersten Konvois.


Kann man auf den zweiten anschließend ballern was man will, es kommt keine Meldung mehr:


So und zum Abschluss modifizieren wir unsere Mission ein weiteres Mal:
Aus der WinCondition2 machen wir eine FailCondition1, ändern den Typ in Zeit und legen diese auf 120sek (wobei das Spiel das nicht so genau nimmt, notfalls muss man sich an die gewünschte Zeit rantasten) fest.


Dann noch den Trigger WinCondition1 ändern, in dem wir die Position


und den Radius ändern.



Beim Code ändern wir noch den Namen von WinCondition2 in FailCondition1 und passen den auszugebenden Text entsprechend an.
using System;
using maddox.game;
using maddox.game.world;


public class Mission : maddox.game.AMission
{

public override void OnTrigger(int missionNumber, string shortName, bool active)
{
    base.OnTrigger(missionNumber, shortName, active);
   
    if ("WinCondition1".Equals(shortName) && active)
        {
        GamePlay.gpHUDLogCenter("Ziel erreicht");
        GamePlay.gpGetTrigger(shortName).Enable = false;
        GamePlay.gpGetTrigger("FailCondition1").Enable = false;
}
if ("FailCondition1".Equals(shortName) && active)
        {
        GamePlay.gpHUDLogCenter("Sie haben die Zeit überschritten");
        GamePlay.gpGetTrigger(shortName).Enable = false;
        GamePlay.gpGetTrigger("WinCondition1").Enable = false;
}
}
}   

Wenn man also 6 Bodenziele zerstört, bekommt man folgende Meldung:


Lässt man sich allerdings zu lange Zeit:




Man kann so also recht einfach mit Triggern und etwas Code eine Sieg- bzw. Niederlagebedingung einbauen.
So mehr beim nächsten mal.
Wie immer sind Fragen, Anregungen und Kritik willkommen.


Das Attachment enthält die heutigen Beispiele.

[gelöscht durch Administrator]
« Letzte Änderung: 07.Juni.2011, 11:40 von Deichwart »

Offline III./JG27_Culli

  • Hallenfeger
  • **
  • Beiträge: 39
Bin begeistert  ;D

Mal eine Frage an die Admins!
Könnt Ihr nicht ein Unterforum machen in denen man die ganzen Scriptbeispiele von Kodjak und den anderen reinschieben kann.
Ansonsten verschwinden irgendwann die schönen Beispiele im endlosen Universum des Editor Threats  :D

Culli

Offline Rudi

  • Flugschüler
  • ***
  • Beiträge: 228
Moin  8)

Kommt wohl alles ins wiki.sturmovik.de ;)


Offline yogy

  • Blasenteetrinker
  • *****
  • Beiträge: 817
    • http://www.yogysoft.de/
Kommt wohl alles ins wiki.sturmovik.de ;)
Genau das dachte ich mri auch, als ich Kodiaks super Anleitung sah. Kodiak, hast Du Lust, das da rüber zu kopieren?  :-*
Cheers, yogy

Offline FG28_Kodiak

  • Blasenteetrinker
  • *****
  • Beiträge: 1.893
Das Kommt sicher noch, momentan bring ich aber erst noch ein paar Lektionen und sehe mir die Reaktionen darauf an. Dann kann ich eventuelle Fragen oder auch Unverständlichkeiten noch berücksichtigen bevor ich das ins Wiki übertrage.
Bei der unübersichtlichen Struktur des Wikis wüsste ich momentan auch nicht wo ich das unterbringen soll.  ::)
« Letzte Änderung: 27.Mai.2011, 10:25 von FG28_Kodiak »

Offline ulyssesOne

  • Blasenteetrinker
  • *****
  • Beiträge: 971
  • No Panic !!!
Supi ... auf jeden Fall weitermachen, kapiere zwar nicht alles auf Anhieb, aber wahrscheinlich sollte man es gleich am Rechner probieren.


Da ergeben sich wirklich tolle Möglichkeiten ... ich bin gespannt.


D A N K E.
We ask you to react professionally – exactly this type of reaction will help us to fix everything as soon as possible.

Offline LoHan

  • Blasenteetrinker
  • *****
  • Beiträge: 2.301
    • Zerstörergeschwader 1
Noch einmal ein DICKES Danke auch von uns!!!!

Unser Server läuft jetzt auch und wird Dank Deines Inputs, Kodiak, demnächst mit schönen gescripteten Missionen gefüttert, gell Culli! ;)

Offline JG53Frankyboy

  • Flieger
  • ****
  • Beiträge: 390
Jo, super Arbeit , RESPEKT !!

Aber alles in allem bin ich der Meinung die Jungs bei 1C hatten da einen 'Knall' !

Offline Deep Five

  • Hallenfeger
  • **
  • Beiträge: 11
    • 9.U-Flottille,Brest
Wenn man sich die Beispiele aus dem "Code-Fenstern" kopiert und in eine Textdatei vom Text-Editor einfügt,
wird das ohne Zeilenumbruch gemacht,bei mir zumindest.
Nun sind die Script-Zeilen nicht mehr so,wie sie im Beispiel angegeben wurden.
(Text im Code-Fenster markiert und im Texteditor eingefügt)
Nun müsste ich per Hand die Leerstellen und Zeilenumbrüche mühevoll
wieder herstellen.

Gibt es da einen Trick,die 1 zu 1 zu kopieren oder währe es möglich,
die Script-Beispiele als Dateianhang dem Beitrag hinzu zu fügen?
Q9550@2,83GHz
GTX 570 (OC)
4 GB RAM
Vista Home Premium 64

Offline FG28_Kodiak

  • Blasenteetrinker
  • *****
  • Beiträge: 1.893
Also damit habe ich kein Problem  :o

Uups seh grad das ich die Beispiele hier noch gar nicht hochgeladen habe  ::)
Edith: So hochladen nachgeholt  ;D
« Letzte Änderung: 28.Mai.2011, 10:24 von FG28_Kodiak »