Einzelnen Beitrag anzeigen
Alt 30.12.2012, 13:57   #12 (permalink)
Vienna
SQF Zauberer 10 Jahre hx3
500 Beiträge1000 Beiträge
 
Benutzerbild von Vienna
 
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
Standard

Für Objekte zum Entfernen und Wiederherstellen habe ich einmal ein Beispiel erstellt. Dabei werden die Objekte nicht versetzt, sonder gänzlich gelöscht.

Aufgerufen wird das z.B. über einen Auslöser mit Namen Trigger1 der einen bestimmten Radius aufweist in welchen die Objekte aufgestellt sind. Das sieht dann so aus:
Code:
temp =["Objekte1",["Car","Tank"],triggerArea Trigger1 select 0,position Trigger1] execVM "Objekte_entfernen_herstellen.sqf";
Aus Objekte sind Fahrzeuge und Tanks gewählt. Als Position wird die des Triggers genommen und für den Radius der des Triggers mit triggerArea Trigger1 select 0.

Durch wiederholten Aufruf des Skripts werden die Objekte gelöscht und wieder hergestellt. Von den Objekten wird die Position, die Richtung, Beschädigung und Tankfüllung beibehalten. Durch unterschiedliche Objekte-Namen (1. Parameter) ist das Skript für beliebig viele Bereiche anwendbar.



Skript Objekte_entfernen_herstellen.sqf
Code:
/*    Objektgruppen entfernen und wiederherstellen      [Vienna 30.12.2012]

Das Skript ist für beliebig viele Objekt-Gruppen verwendbar.
Die Objekt-Gruppen unterscheiden sich durch den Namen im 1. Parameter.
Die Objekte werden anhand der Klassen-Namen im Radiusbereich ermittelt.
   
Parameter: (der 1. Parameter bezeichnet den Namen der Gruppe und darf nicht doppelt vorkommen)
  "NameObjektGruppe",
  [Array mit ClassNamen],
  Radius für den Bereich der Objekte,
  Position Mittelpunkt des Radius

Aufrufbeispiel über Auslöser:
 temp =["Objekte1",["Car","Tank"],triggerArea Trigger1 select 0,position Trigger1] execVM "Objekte_entfernen_herstellen.sqf";
 
Erster  Aufruf des Skripts: die durch die Parameter bestimmten Objekte werden gelöscht.
Zweiter Aufruf des Skripts: die gelöschten Objekte werden im vorherigen Zustand wiedererstellt.
Dritter Aufruf des Skripts: gleich erster Aufruf. usw.
Nach dem ersten Aufruf ist nur noch der erste Parameter von Bedeutung, der die jeweilige Gruppe bezeichnet. 
*/

private ["_globaleVariable_IDs","_globaleVariable_Daten","_globaleVariable_Schalter","_Klassen","_radius","_position","_code","_IDs","_daten","_entfernen"];

_globaleVariable_IDs      = (_this select 0)+"_IDs";
_globaleVariable_Daten    = (_this select 0)+"_Daten";
_globaleVariable_Schalter = (_this select 0)+"_Schalter";

//eigene globale Variabel für jede Gruppe nach dem Namen im 1. Parameter erstellen
if (isNil _globaleVariable_Schalter) then
  {
    _Klassen  = _this select 1; 
    _radius   = _this select 2;
    _position = _this select 3;
    //Initialisieren der globalen Variablen gemäß _globaleVariable_IDs
    _code = format ["%1 = []",_globaleVariable_IDs];
    call compile _code;
    //Initialisieren der globalen Variablen gemäß _globaleVariable_Daten
    _code = format ["%1 = []",_globaleVariable_Daten];
    call compile _code;
    //Initialisieren der globalen Variablen gemäß _globaleVariable_Schalter
    _code = format ["%1 = true",_globaleVariable_Schalter];
    call compile _code;
    //1. sichern der Objekt-IDs (entspricht den Namen)
    _IDs  = nearestObjects [_position,_Klassen,_radius];
    //Übertragen der Daten in die globale Variable gemäß _globaleVariable_IDs
    _code = format ["%1 = _IDs",_globaleVariable_IDs];
    call compile _code
  };

//Auslesen der "Schalterstellung" in Variable _entfernen 
_code = format ["_entfernen = %1",_globaleVariable_Schalter];
call compile _code;

//Entfernen oder Wiederherstellen je nach Schalterstellung (true/false)

if (_entfernen) then // Sichern und Entfernen der Gruppe
  {
    //IDs aus globaler Variabler gemäß _globaleVariable_IDs übernehmen
    _code  = format ["_IDs = %1",_globaleVariable_IDs];
    call compile _code;
    //Daten der Objekte sichern und Objekte löschen
    _daten = [];
    {
     _daten = _daten +
      [[
        typeOf     _x,
        position   _x select 0,
        position   _x select 1,
        position   _x select 2,
        getDir     _x,
        getDammage _x,
        fuel       _x
      ]];
     deleteVehicle _x
    }forEach _IDs;
    //Daten aus _daten in globale Variable gemäß _globaleVariable_Daten übertragen
    _code  = format ["%1 = _daten",_globaleVariable_Daten];
    call compile _code;
    //globale Variable gemäß _globaleVariable_Schalter auf false stellen
    _code = format ["%1 = false",_globaleVariable_Schalter];
    call compile _code
  }
else   //Wiederherstellen  der Gruppe
  {
    //Daten aus globaler Variabler gemäß _globaleVariable_Daten übernehmen
    _code  = format ["_daten = %1",_globaleVariable_Daten];
    call compile _code;
    //Objekte der Gruppe aufstellen und Namen(IDs)der Objekte sichern
    _IDs = [];
    {
      _objekt =          (_x select 0) createVehicle [0,0];
      _objekt setPos     [_x select 1,
                          _x select 2,
                          _x select 3];
      _objekt setDir     (_x select 4);
      _objekt setDammage (_x select 5);
      _objekt setFuel    (_x select 6);
      _IDs = _IDs + [_objekt]
    } forEach _daten;
    //Daten aus _IDs in globale Variable gemäß _globaleVariable_IDs übertragen
    _code  = format ["%1 = _IDs",_globaleVariable_IDs];
    call compile _code;
    //globale Variable gemäß _globaleVariable_Schalter auf true stellen
    _code = format ["%1 = true",_globaleVariable_Schalter];
    call compile _code
  }
Im Anhang eine Beispielmission für zwei Objekt-Gruppen.
Angehängte Dateien
Dateityp: zip Objekte_save_del_load-utes.zip (2,9 KB, 59x aufgerufen)
Vienna ist offline