Autor Thema: [Scripting for Dummies] Trigger Trigger - Teil 1  (Gelesen 8944 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline FG28_Kodiak

  • Blasenteetrinker
  • *****
  • Beiträge: 1.893
Wie wohl schon jedem Missiondesigner in Cliffs of Dover aufgefallen sein dürfte, sind die Möglichkeiten des FMB in Sachen Missionslogik doch stark eingeschränkt.
Man hat zwar die Möglichkeit vier verschiedene Triggertypen auszuwählen, aber bei den Aktionen für diese Trigger kann man zur Zeit nur Flugzeuge spawnen lassen. Möchte man mehr muss man sich wohl oder übel mit dem Scripting beschäftigen.
Die Fähigkeiten der Scriptsprache reichen von einer simplen Textmeldung am Bildschirm bis zu einem komplett dynamischen Onlinewar, sind also extrem Mächtig und nur der Fantasie des Missionbuilder und dessen Programmierkünsten unterworfen.

Ziel dieses Threads ist es unter anderem dem Missionsdesigner möglichst universale Script-"Schnippsel" zur Verfügung zu stellen, die dieser selbst bei seinen Missionen verwenden bzw. nach eigenen Wünschen anpassen kann.


Da bereits Trigger angesprochen wurden, möchte ich auch damit beginnen.

Im FMB kann man 4 verschiedene Triggertypen wählen, die deutschen Begriffe wurden allerdings sehr holprig übersetzt ;).
- Zeit in Sekunden (TTime). Soundsoviele Sekunden nach dem Missionsstart (Allerdings nimmt es Cliffs of Dover da nicht so genau).
- Zielgruppe zerstört (TGroupDestroyed). Eine bestimmte Gruppe Flugzeuge wurde zu soundsoviel Prozent zerstört.
- Zielfahrzeug zerstört (TGroundDestroyed). Eine bestimmter Prozentsatz von Bodenzielen im Gebiet XY mit Radius R wurde zerstört.
- Zielkurs (TPassThrough). Etwas (Spieler, KI-Flieger, Bodeneinheiten etc.) dringt in ein Gebiet an der Position XY mit Radius R ein.

Mit den Hausmitteln des FMBs wäre es jetzt nur möglich eine vorher festgelegte Gruppe Flugzeuge (wobei das natürlich auch nur eins sein kann) spawnen zu lassen. Dazu müssen der Triggername und der Aktionsname gleich sein.

Für mehr Möglichkeiten sind wir momentan auf Scripting angewiesen, es kann natürlich sein das die Aktionen durch die Entwickler noch erweitert werden.

Das erstes Beispiel soll eine Erfolgsmeldung ausgeben, wenn ein bestimmter Prozentsatz an Bodenzielen zerstört wurde.


Erstmal ein paar Ziele zum kaputtmachen ;).


Dann auf Bearbeiten->Script gehen:


Als nächstes fügt man einen Trigger hinzu:


Es ist sinnvoll den Standardnamen gegen was aussagekräftigeres zu tauschen, in diesem Fall "WinCondition1":


Als Typ nimmt man in diesem Fall Zielfahrzeug zerstört (TGroundDestroyed)


Mit Hilfe der kleinen Schaltfläche legt man ...


...das Zentrum des Zielgebiets fest


danach den Radius des Zielgebiets (im Beispiel 50m) und ...



... und die Anzahl der zerstörten Bodenziele in %, 50% bedeuten in diesem Fall also 3 Fahrzeuge


So nun gibt man den zugehörigen Code (mehr dazu unten) in das Codefenster unter Script ein:


In der Mission bekommt man dann diese Meldung, wenn drei Ziele zerstört wurden:




Nun zum Code:
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)
{
    if ("WinCondition1".Equals(shortName) && active)
        {
        GamePlay.gpHUDLogCenter("Ziel erreicht");
        GamePlay.gpGetTrigger(shortName).Enable = false;
}
}
}

Script Sprache von Cliffs of Dover ist C# (C Sharp) eine von Microsoft für die .Net Programmierung geschaffene Programmiersprache, sollten sich also Fragen zur Syntax etc. ergeben ist Microsoft die erste Anlaufstelle (http://msdn.microsoft.com/de-de/vcsharp/default.aspx).


So schauen wir uns den Code genauer an, zu Beginn finden sich drei Using Anweisungen.
using System;
using maddox.game;
using maddox.game.world;
Diese dienen dazu für die Programmierung nötige Bibliotheken zu laden. System gehört zur .Net umgebung und beinhaltet grundlegende Funktionen von C#, wird also fast immer benötigt. maddox.game und maddox.game.world enthalten die Bibliotheken die zum Scripting von Cliffs of Dover benötigt werden. Es gibt noch mehr aber diese fügt man nur hinzu, wenn sie auch benötigt werden. maddox.game und maddox.game.world werden für das Missionscripting wohl am häufigsten benötigt.

public class Mission : maddox.game.AMission
{
}
Ist die für das Missionsscripting am häufigsten benötigte Klasse. Diese Klasse stellt uns die für das Missionsscripting benötigten Methoden, Variablen etc. zur Verfügung. Neben AMission gibt es noch "campaign.Mission" diese wird allerding nur für Kampagnen benötigt, dazu in einem späteren Modul mehr.


Eine Methode die von AMission zur Verfügung gestellt wird ist OnTrigger(...), diese wird immer aufgerufen wenn ein Trigger aktiviert wird.
public void OnTrigger(int missionNumber, string shortName, bool active)
{
}
Normalerweise passiert gar nichts, wenn diese Methode aufgerufen wird, es sei denn die ursprüngliche Methode wird vom Benutzer überschrieben, dazu dient das Schlüsselwort "override". Damit tauscht man die Standardmethode durch eine eigene aus. Also:

public override void OnTrigger(int missionNumber, string shortName, bool active)
{
}
Die Methode OnTrigger hat drei Übergabeparameter, diese werden von Cliffs of Dover im Spiel geliefert, können aber von uns wenn erwünscht verarbeitet werden.
int missionNumber
Die gerade gültige Missionsnummer, wird nur interessant wenn mehrere Missionen ineinander geladen wurden, für Standardmissionen also uninteressant ;).
string shortName
shortName enthält den Namen des Triggers der ausgelöst wurde.
bool active
sagt aus ob der Trigger Aktiv ist (true) oder nicht (false).

if ("WinCondition1".Equals(shortName) && active)
{
}
Diese If Anweisung fragt ab ob der Trigger mit dem Namen "WinCondition1" mit dem von CloDo in shortName übergebenen Namen übereinstimmt und noch aktiv ist. Dazu wird Equals() verwendet, das ist eine C#-Methode, die zwei Zeichenfolgen miteinander vergleicht und wenn die beiden übereinstimmen den Wert true liefert.
&& bedeutet UND: also müssen "WinCondition1".Equals(shortName) UND active beide den Wert true haben, dann wird das innere der If-Anweisung ausgeführt.

GamePlay.gpHUDLogCenter("Ziel erreicht");         
GamePlay.gpGetTrigger(shortName).Enable = false;
Die Klasse GamePlay stellt ein paar nützliche Hilfsmehtoden zur Verfügung. gpHUDLogCenter(...) gibt eine Zeichenkette auf dem Bildschirm aus und mit .gpGetTrigger(shortName).Enable = false; wird der gerade aktive Trigger deaktiviert, macht man das nicht, bleibt der Trigger aktiv und könnte ein zweites Mal ausgelöst werden.




So kommen wir zum Fazit: das Script
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)
{
    if ("WinCondition1".Equals(shortName) && active)
        {
        GamePlay.gpHUDLogCenter("Ziel erreicht");
        GamePlay.gpGetTrigger(shortName).Enable = false;
}
}
}
Ist immer dann nützlich wenn man einen Trigger hat und wenn dieser ausgelöst wird, etwas auf dem Bildschirm ausgeben werden soll.
Dabei ist es nicht wichtig von was für einem Typ der Trigger ist, würde man Zeit wählen würde die Meldung eben nach soundso viel Sekunden erscheinen.

So das war dann mal der erste Teil, mit einem recht einfachen Thema, aber more to come...

Wenn es noch Fragen oder Anregungen gibt, nur zu. Wenn ich Feedback erhalte weis ich wenigstens das es auch andere interessiert und ich hier nicht ne One Man Show abliefere ;).

Anbei habe ich noch die Beispielmission hochgeladen.

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

Offline Priester

  • Flugschüler
  • ***
  • Beiträge: 197
Re: [Scripting for Dummies] Trigger Trigger - Teil 1
« Antwort #1 am: 24.Mai.2011, 16:23 »
WOW!  :o

Toll! Kann nur eins dazu sagen: ab ins Sturmowiki!

Ok, das andere sage ich auch noch: "Danke schön, eine super Anleitung!"

Priester  ;)
"Quidquid agis, prudenter agas et respice finem!"


Offline Lucky

  • Flugschüler
  • ***
  • Beiträge: 62
Re: [Scripting for Dummies] Trigger Trigger - Teil 1
« Antwort #2 am: 24.Mai.2011, 16:27 »
Vielen Dank für deine Mühe!

Offline Rudi

  • Flugschüler
  • ***
  • Beiträge: 228
Re: [Scripting for Dummies] Trigger Trigger - Teil 1
« Antwort #3 am: 24.Mai.2011, 17:06 »
Moin 8)


Offline Hyde

  • Flugschüler
  • ***
  • Beiträge: 134
Re: [Scripting for Dummies] Trigger Trigger - Teil 1
« Antwort #4 am: 24.Mai.2011, 17:33 »
@ Kodiac

Super Tutorial, Danke !

Offline wurzel

  • Flieger
  • ****
  • Beiträge: 272
Re: [Scripting for Dummies] Trigger Trigger - Teil 1
« Antwort #5 am: 24.Mai.2011, 19:39 »
Sehr anfängerfreundlich geschrieben. Danke!

Ist die Dauer der sichtbaren Meldung in einer der geladenen Bibliotheken definiert?

Offline FG28_Kodiak

  • Blasenteetrinker
  • *****
  • Beiträge: 1.893
Re: [Scripting for Dummies] Trigger Trigger - Teil 1
« Antwort #6 am: 24.Mai.2011, 19:48 »
Die Dauer lässt sich auch angeben (überladene Methode), denke aber die normale Länge ist ausreichend.
void gpHUDLogCenter(maddox.game.Player[] to, string msg, object[] parms, double lifeTime)

Offline windbeutel

  • Flieger
  • ****
  • Beiträge: 713
Re: [Scripting for Dummies] Trigger Trigger - Teil 1
« Antwort #7 am: 24.Mai.2011, 21:46 »
Klasse, Kodiak. Ich denke, Du bist bald reif für den Community-Award ...
"Life is just another bugged script."

Offline LoHan

  • Blasenteetrinker
  • *****
  • Beiträge: 2.296
    • Zerstörergeschwader 1
Re: [Scripting for Dummies] Trigger Trigger - Teil 1
« Antwort #8 am: 24.Mai.2011, 22:06 »
Klasse Kodiak!

Unser Server soll ab Juni auf CoD laufen und ich werde jeden Missionsbauer bei uns auf Dich ansetzen ;)

Nochmals, Klasse .... und Danke!

Offline III./JG27_Culli

  • Hallenfeger
  • **
  • Beiträge: 39
Re: [Scripting for Dummies] Trigger Trigger - Teil 1
« Antwort #9 am: 25.Mai.2011, 07:21 »
Das ging ja schnell Kodiak!

Viele Dank

Offline ulyssesOne

  • Blasenteetrinker
  • *****
  • Beiträge: 970
  • No Panic !!!
Re: [Scripting for Dummies] Trigger Trigger - Teil 1
« Antwort #10 am: 27.Mai.2011, 16:13 »
Herrlich ... DANKE und weiter So.  ;)
We ask you to react professionally – exactly this type of reaction will help us to fix everything as soon as possible.

Offline Sattlergeselle

  • Hallenfeger
  • **
  • Beiträge: 3
Re: [Scripting for Dummies] Trigger Trigger - Teil 1
« Antwort #11 am: 31.Juli.2011, 18:22 »
Vielen Dank. Sehr instruktiv!

Offline JG2001_Eule

  • Flugschüler
  • ***
  • Beiträge: 57
Re: [Scripting for Dummies] Trigger Trigger - Teil 1
« Antwort #12 am: 24.April.2012, 15:11 »
Zu Hülfe Kodiak
Bin wahrscheinlich zu blöd, aber trotzdem frag ich. Wie bekomm ich das Script geschrieben.? Im Reiter von Clod kann ich das Feld "script"  z.B. nicht mit geschweiften Klammer bestücken. Muss ich den Text in Visual C# schreiben und dann in Clod kopieren.? Wie Speicher ich denn dann in Visual Studio ab.?
Fragen über Fragen. Das empfohlende Buch ist gekommen, aber bis ich da durch bin...das dauert. Wollte eigentlich nur deine Beispiele schon mal durchgehen, bzw. ausprobieren.
Gruß Eule

Offline FG28_Kodiak

  • Blasenteetrinker
  • *****
  • Beiträge: 1.893
Re: [Scripting for Dummies] Trigger Trigger - Teil 1
« Antwort #13 am: 24.April.2012, 15:35 »
Zuerst speicherst du die Mission im FMB und dann gehst du auf Bearbeiten -> Script und wählst den letzten Reiter "Script". Dahin kopierst du dann das Script (Copy & Paste) und speicherst es ebenfalls. Dadurch legt der FMB ein .cs - file mit dem richtigen Namen im richtigen Verzeichnis an. Danach kannst du die Mission zum testen, spielen.

Offline JG2001_Eule

  • Flugschüler
  • ***
  • Beiträge: 57
Re: [Scripting for Dummies] Trigger Trigger - Teil 1
« Antwort #14 am: 24.April.2012, 15:47 »
Danke für die schnelle Antwort. Das ging ja auch ;D Aber ich wollte selber ein Script schreiben, aber das ging nicht in Clod siehe geschweifte Klammer ließ sich nicht einsetzen . Muss ich das Script in Visual Studio erst schreiben und dann ins CLod Script kopieren. Und wenn ja wie speicher ich das in Visual Studio.
Gruß Eule

Offline FG28_Kodiak

  • Blasenteetrinker
  • *****
  • Beiträge: 1.893
Re: [Scripting for Dummies] Trigger Trigger - Teil 1
« Antwort #15 am: 24.April.2012, 16:07 »
http://forum.sturmovik.de/index.php/topic,1294.0.html
Visual Studio speichert das Projekt in einem eigenen Ordner unter
..\Documents\Visual Studio 2010\Projects

Am einfachsten ist es das Script in VS zu schreiben und dann in das Script Fenster zu kopieren. 

Offline JG2001_Eule

  • Flugschüler
  • ***
  • Beiträge: 57
Re: [Scripting for Dummies] Trigger Trigger - Teil 1
« Antwort #16 am: 24.April.2012, 16:28 »
Nochmals Danke
Habe  es jetzt verstanden (hoffe ich) werde mich jetzt mit den Buch beschäftigen. Hatte deine Anleitung  schon durchgeführt gehabt, aber eben nicht "gelesen"
Gruß Eule