Server, Trigger, ExecVM, remoteExec

Server/Client-Bedingungen abfragen

Eine Liste von "machine types" (singleplayer, server, client) und wie sie jeweils abgefragt werden können. Um an allen Ecken und Enden Performance zu sparen, macht es Sinn, möglichst viele Prozesse nur dort berechnen zu lassen, wo sie wirklich laufen müssen. Der Dedicated Server hat z.B. kein Interface, aber Achtung: Auch ein Client kann Server sein, hat dann also auch ein Interface! Will man zum Beispiel erfragen, ob die Recheneinheit ein Multiplayer-Host ist, aber KEIN Dedicated Server, muss man abfragen:

          if (hasInterface) then {

und
          if (isServer) then {...};              

 Zur Abfrage eines reinen Servers also:

          if (isServer) then {...}; 

Beispiel:
          if (isServer) then {v1 animate ["terc",1]};

Normalerweise muss man nur ein oder maximal zwei Rechnertypen abfragen. Als Missionsbauer ohne permanenten Zugriff auf einen Dedicated Server macht es beispielsweise keinen Sinn,

          if (isDedicated) then {...};

abzufragen, auch wenn die Mission letztlich auf einem DS läuft. Es genügt eine reine Serverabfrage (siehe oben), damit der Prozess nur beim Host (ob Dedicated oder nicht) berechnet wird. Alles andere erschwert nur das das Debugging.

Link (siehe auch Kommentar von Killzone Kid!):
https://community.bistudio.com/wiki/isServer

Hier eine Liste für die Ausgabewerte aller drei Varianten:

EDITOR PREVIEW / SINGLEPLAYER:
     isMultiplayer returns false
     isServer returns true
     isDedicated returns false

MULTIPLAYER (NON-DEDICATED) HOST SERVER
     isMultiplayer returns true
     isServer returns true
     isDedicated returns false

MULTIPLAYER DEDICATED SERVER
     isMultiplayer returns true
     isServer returns true
     isDedicated returns true

MULTIPLAYER CLIENT
     isMultiplayer returns true
     isServer returns false
     isDedicated returns false

Externes Script lokal (ExecVM)

Führt ein Script LOKAL aus. Pfad und Lokalität des Kommandos beachten!

nul=execVM "scripts\test.sqf";

Externes Script global (remoteExec)

Scripting-Intention: Ein ext. Script für alle Clients im MP ausführen.

Je nach Kommando können externe Scripts mit ExecVM ausgeführt werden, wenn der Effekt des Scripting-Kommandos von Haus aus global ist. Ist er lokal, muss der Befehl per remoteExec ausgeführt werden, um an alle Clients gebroadcastet zu werden. Beispiel:

          [speaker1, ["anruf", 100, 1, true]] remoteExec ["say3D", 0, true];

Hier ist remoteExec nötig, weil say3D ein Command mit lokalem Effekt ist. Für alle anderen Parameter siehe Eintrag zu say3D!


Tutorial zu remoteExec:

https://www.youtube.com/watch?v=qazpxE_m4Xs&feature=emb_logo

https://community.bistudio.com/wiki/remoteExec

 

 

 

Getriggerte Wegpunkte

siehe "Der KI auf die Sprünge helfen"

Triggered Despawn

1. Via Trigger kann man Einheiten, Fahrzeuge und deren Crews verschwinden lassen. Der Effekt ist global:

{
deleteVehicle _x;
} forEach crew VariableName2;
deleteVehicle VariableName2;

Um auch die Gruppen zu löschen, muss man mit deleteGroup arbeiten:

https://community.bistudio.com/wiki/deleteGroup

 

Hitpoints per Trigger/WP

Fügt einer Einheit/einem Fahrzeug einen bestimmten Schaden ("Model-Hitpoint") in bestimmter Stärke zu.

          varname setHitPointDamage ["hitpoint", Schaden, Effekt];

Geht gut mit KI-Wegpunkten ("onAct."), aber auch mit Triggern. Die Hitpoints kann man über die Damage-Funktion von Zeus ermitteln, der Schaden reicht von 0 bis 1. Sichtbarer Effekt: true/false?

Wichtig hierbei: setHitpointDamage ist ein Kommando mit lokalen Argumenten. Sofern es per Trigger ausgeführt werden soll, muss dieser Trigger GLOBAL (also nicht nur serverseitig) berechnet werden (Haken "Server only" darf NICHT gesetzt sein). Auch alle Variablen, die die zu beschädigenden Objekte (z.B. das Fahrzeug) benennen, sollten global sein (also ohne Unterstrich).

!alive-Trigger

Trigger löst aus, wenn ein Objekt/Spieler nicht mehr "am Leben" (getötet, zerstört) ist. Eignet sich, um zum Beispiel einen Dead-Man-Switch ohne ACE zu erzeugen oder um eine Alarm-Auslösung zu erzeugen, wenn ein Objekt zerstört wurde. Da Intel bei der Aufnahme auch "zerstört" wird, kann auch damit ein Effekt ausgelöst werden.

Der Trigger muss Bedingungen (Condition) folgender Art aufweisen:

a) Wenn man nur ein Objekt hat:

          !alive "object name"

b) Bei mehreren Objekten:

          !(alive obj1) && !(alive obj2)

c) Entweder oder:

          !(alive obj1) OR !(alive obj2)

Trigger-Artillerie (Module)

1. Trigger setzen, Größe einstellen, ggf. Zeitverzögerung einstellen

2. Präsenz (OPFOR/BLUEFOR) einstellen

3. Trigger ggf. kopieren, um Effekt zu wiederholen

4. Modul "Ordnance" setzen, Artillerietyp auswählen und mit Trigger verknüpfen - Entfernung zu den eigenen Einheiten beachten, sonst gibt es ungewollt Tote

Hints via Trigger

Hinweise (Hints) können global oder lokal getriggert werden.

1. GLOBAL (Hint erscheint für jeden, sollte aber per hints.sqf ausgeführt werden):

a) In der .sqf:

_textOne = "<t color='#E22020'>I am a script, everyone can see me.</t>";
hint parseText (_textOne);

b) Im Trigger On Act.:

nul=execVM "scripts\hints.sqf";

 


2. LOCAL (Hint erscheint nur für den Client, der den Trigger auslöst)

a) Im Trigger On Act.:

Hint "Write here";

 

Auch per addAction möglich (siehe entsprechenes Buch)

Trigger-CAS

Das ist hier ist nur für das Ambiente gemacht. Der CAS findet nicht wirklich durch die CAS-Einheiten statt, Effekt und Einheit agieren vom Editing her getrennt. Das alles lässt sich per Zeus mit einem Klick machen. Soll die Mission aber ohne Zeus ablaufen, kann man das so machen:

1. CAS Modul platzieren, Angriffsart auswählen

2.  Trigger platzieren oder auswählen, ggf. Bedingungen setzen, Trigger mit CAS-Modul verknüpfen; DIESER TRIGGER LÖST DEN CAS-EFFEKT AUS!

3.  Trigger (nennen wir ihn "Trig1") um die Spieler platzieren, der bei Präsenz von BLUFOR (Bedingung!) die CAS-Einheiten bei Missionsbeginn versteckt; Radius einstellen, der alle Spieler umfasst;

4.  CAS-Einheiten platzieren, ggf. gruppieren, damit sie in Formation bleiben, ggf. Schaden deaktivieren, MOTOR an (Häkchen setzen)!

5.  CAS-Crew Schaden deaktivieren, fleeing coeff. auf 0, set captive (macht sie friendly), courage = 100%

6.  Für CAS-Einheiten Wegpunkte setzen, ggf. Flughöhe anpassen:

                      this flyInHeight 1000; this setPos [getPos this select 0, getPos this select 1, 1000];

7.  Show/Hide-Modul erstellen und mit der CAS-Gruppe bzw. den Gruppen (falls mehrere) verlinken. Anwenden auf die Gruppe(n) der synchronisierten Objekte; Aktion: HIDE; Modul mit "Trig1" (siehe oben) synchronisieren

9.  Zweites Show/Hide-Modul erstellen und mit CAS-Gruppe verlinken; Aktion diesmal: SHOW!

10.  Modul mit einem anderen Trigger verknüpfen; DIESER TRIGGER LÖST DAS SHOW-MODUL DER CAS-EINHEITEN AUS!

// HINWEIS: Alle Trigger müssen so gesetzt sein, dass das Timing stimmt, da es ja um den Gesamteffekt geht. Die CAS-Einheiten sollen spawnen, überfliegen und im richtigen Moment soll der Effekt ausgelöst werden.

11.  Nach dem durchgeführten Angriff sollen die CAS-Einheiten verschwinden. Sie brauchen also jeweils einen Var. Namen.

12.  Der letzte Waypoint soll das Despawn auslösen. Er benötigt folgende On Act. für jede Einheit der Gruppe:

{
deleteVehicle _x;
} forEach crew VariableName;
deleteVehicle VariableName;


 

 

 

Trigger-IED

1. Im Editor IED oder Sprengsatz setzen, einen Var.Namen (z. B. bomb) geben;

2. Trigger setzen, Bedingungen definieren;

3. OnAct:

   bomb setDamage 1;

Der Effekt ist global, kann also allein vom Server berechnet werden ("Server only").

Will man zum Beispiel eine genaue Abfolge von zeitlich verzögerten Sprengungen mit nur einem Trigger durchführen, muss man in der Trigger-OnAct. ein externes SQF-Script ausführen (siehe ExecVM), da nur in SQF-Dateien der sleep-Befehl verwendet werden kann (funktioniert bei Triggern nicht).

Das kann dann so aussehen:

sleep 2;
bomb1 setDamage 1;
bomb2 setDamage 1;
sleep 3;
bomb3 setDamage 1;
bomb4 setDamage 1;
sleep 3;
bomb5 setDamage 1;
bomb6 setDamage 1;
sleep 3;
bomb7 setDamage 1;
bomb8 setDamage 1;

Man kann auch mit addAction und ohne Trigger arbeiten, wenn man die Sprengung manuell auslösen möchte.

Trigger allgemein

Zum Thema Trigger:

Trigger fragen ununterbrochen die Erfülltheit ihrer Bedingungen ab und ziehen somit Leistung. Sie sollten daher (wenn möglich!) nur auf dem Server berechnet werden ("Server only"-Häkchen) und eine bestimmte Zahl nicht übersteigen (Richtwert: 30 pro Mission).

Der voreingestellte Eintrag "this" in der Box "Bedingung" bezieht sich stets auf die oben vorgenommenen Einstellungen. Weitere Bedingungen müssen also hinzugefügt werden. Beispiel:

this && !alive "tank1"

Oben müssen also die Einstellungen UND der Umstand, dass "tank1" nicht mehr "am Leben" sein darf, gegeben sein.

 

https://community.bistudio.com/wiki/Eden_Editor:_Trigger

http://killzonekid.com/arma-scripting-tutorials-triggers-v3/

Tasks erstellen (JIP-proof)

https://forums.bohemia.net/forums/topic/167564-how-to-arma-3-editor-creating-a-jip-proof-coop-mp-mission-task-setup/