HX3 Foren

HX3 Foren (https://hx3.de/)
-   Editing & Scripting (https://hx3.de/editing-scripting-187/)
-   -   Respawnscript für Fahrzeuge (https://hx3.de/editing-scripting-187/respawnscript-fuer-fahrzeuge-22321/)

JoeJoe87577 09.03.2013 16:33

Respawnscript für Fahrzeuge
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,

im Zuge meiner Missionsentwicklung habe ich ein Respawnscript geschrieben, mit dem Fahrzeuge nachdem sie zerstört oder zurückgelassen wurden einfach neu spawnen lassen kann.
Das ist mein erstes Script das ich veröffentliche und es gibt sicherlich noch einiges zum verbessern.

Zur Benutzung:
Einfach in die Initzeile eines Fahrzeuges folgenden Aufruf:
Code:

nul = [this, 15,60] execVM "vehicle_respawn.sqf";
Der erste Parameter ist der Name des Fahrzeugs, der Zweite die Respawnzeit nach der Zerstörung und der dritte die Respawnzeit nachdem das Fahrzeug zurückgelassen wurde.
Das Script sollte auf Dedizierten Servern funktionieren.

Bekannte Fehler:
- Wenn Fahrzeuge unterhalb von Gebäuden (z.B. Tankstellen) oder auf schrägem Terrain gesetzt werden, spawnen sie erneut ein paar Meter weiter weg.

Eine Beispielmission hängt mit dran.

Edit: ihr dürft das Script natürlich ohne Rückfrage verwenden und bearbeiten, aber bitte meinen Namen als Ersteller drinlassen.

Vienna 09.03.2013 18:32

Zitat:

Zitat von JoeJoe87577 (Beitrag 444557)
Bekannte Fehler:
- Wenn Fahrzeuge unterhalb von Gebäuden (z.B. Tankstellen) oder auf schrägem Terrain gesetzt werden, spawnen sie erneut ein paar Meter weiter weg.

Das ist so gewollt, damit Objekte nicht mit anderen Objekten überschneiden, wie es z.B. mit setPos geschehen kann.



Es müsste reichen so ein Skript einmal aufzurufen.

Für diese Anwendung ist der Befehl waitUntil {} recht brauchbar.

Code:

Position und Richtung in der Basis sichern;

while {isServer} do
 {
  //warten bis Fahrzeug besetzt 
  waitUntil {count crew _vehicle > 0};
       
  //warten bis keine Crew im Fahrzeug (Tote werden nicht gezählt) 
  waitUntil {{alive _x} count crew _vehicle == 0};
 
  Wartezeit initialisieren;
 
  //warten bis Zeit abgelaufen oder Fahrzeug wieder besetzt
  waitUntil {Zeit abgelaufen or count crew _vehicle > 0};

  if (Zeit abgelaufen) then {Fahrzeug entfernen und neu erstellen}
 }

Edit: Fehler in dieser Zeile:

//warten bis Zeit abgelaufen oder Fahrzeug wieder besetzt
waitUntil {Zeit abgelaufen or count crew _vehicle > 0};

...or {alive _x} count crew _vehicle > 0 ist zu verwenden oder man entfernt vor der Abfrage eventuelle Tote aus dem Fahrzeug;
{if(!alive _x)then{moveOut _x}}forEach crew _vehicle;

Marscl 10.03.2013 17:39

Hey JoeJoe,

hab dein Script für meine Mission mal ausprobiert.
Funktioniert soweit auch ganz gut, nur bekomme ich wenn ein Fahrzeug zerstört wurde die Fehlermeldung:
"Script scripts\verhicle_respawn.sqf not found", das Fahrzeug wird allerdings trotzdem neu gespawnt.

Beim spawnen nach dem verlassen eines Fahrzeuges erscheint die Fehlermeldung nicht.

Gruß

JoeJoe87577 10.03.2013 19:30

Ah gut das du das gemerkt hast :D. Da steht ein Pfad fest im Script, den muss ich noch ändern. Abhilfe bis dahin, das Script in deinem Missionsordner in den Ordner scripts packen.

JoeJoe87577 11.03.2013 18:41

Liste der Anhänge anzeigen (Anzahl: 1)
So ich hab das Script angepasst und ein Kommentar eingefügt, welche Zeile mein ändern muss um einen eigenen Scriptordner zu verwenden.

Vienna 11.03.2013 21:18

Du erstellst in der Schleife deines Skripts Abfragen, für welches es mit den Befehlen von Arma einfachere Möglichkeiten gibt.

Code:

// Fahrzeug-Respawn wenn stark beschädigt oder unbesetzt.  [Vienna 11.03.2013]
// Einmaliger Aufruf. Läuft beim Server.
//
// Parameter: FahrzeugObjekt
//            Respawnzeit bei starker Beschädigung in Sekunden
//            Rewpawnzeit wenn unbesetzt in Sekunden
//
// Aufrufbeispiel in der Initialisierungszeile des Fahrzeuges:
//  temp = [this, 60, 120] execVM "Fahrzeug_Respawn.sqf";

private ["_vehicle","_warten1","_warten2","_type","_pos","_dir","_zeit"];

//Parameter übernehmen
_vehicle = _this select 0;
_warten1 = _this select 1;
_warten2 = _this select 2;
//Fahrzeugtype sowie Position und Ausrichtung vom Aufstellungsort speichern.
_type = typeOf _vehicle;
_pos  = getPos _vehicle;
_dir  = getDir _vehicle;

//Endlosschleife
while {isServer} do
 {
  waitUntil {count crew _vehicle > 0 or getDammage _vehicle > 0.8}; //warten bis Fahrzeug besetzt/beschädigt
  waitUntil {{alive _x} count crew _vehicle == 0}; //warten bis keine Crew im Fahrzeug (Tote werden nicht gezählt)
  sleep 5; //Pause damit Tote nicht zu schnell verschwinden
  {if(!alive _x)then{_x setPos [0,0];deleteVehicle _x}}forEach crew _vehicle; // Tote Crew löschen
  if (getDammage _vehicle > 0.8) then //Wartezeit wenn Fahrzeug stark beschädigt
  {_zeit = time + _warten1 - 5}
  else                                //Wartezeit wenn Fahrzeug unbesetzt
  {_zeit = time + _warten2 - 5};
  waitUntil {time > _zeit or count crew _vehicle > 0}; //warten bis Zeit abgelaufen oder Fahrzeug wieder besetzt
  if (time > _zeit) then //wenn Zeitablauf, dann neues Fahrzeug an Startposition erstellen
  {
    deleteVehicle _vehicle;
    _vehicle = _type createVehicle _pos;
    _vehicle setDir _dir
  }
 }


Marscl 12.03.2013 00:06

Was muss ich machen damit dass Fahrzeug nur neu gespawnt wird wenn es zerstört wurde? :)

Tajin 12.03.2013 09:53

Kannste in dem Fall nicht sogar einfach die Standardfunktion verwenden?

http://community.bistudio.com/wiki/respawnVehicle

JoeJoe87577 12.03.2013 10:48

Nicht wirklich, wenn man RespawnVehicle benutzt landet das Fahrzeug bei einem Zentralen marker und nicht an irgendeiner gewünschten Position. Da kann ich auch mein Script nehmen.

Tajin 12.03.2013 11:54

Ach stimmt da war ja was.

Könnte man aber mit nem Respawn Eventhandler lösen und das Fahrzeug dann an die gewünschte Stelle bewegen. Aber ok wenn es dann schon so anfängt macht man sich wohl doch einfach gleich nen eigenes Script. :confused:


Hier ist noch nen altes Fahrzeug-spawnscript das ich noch rumliegen hatte:
PHP-Code:

if (isServerthen {
    
_obj _this select 0;
    
_time _this select 1;
    
_delay _this select 2;
    
_count _this select 3;
    
_init _this select 4;
    
_name vehicleVarName _obj;
    
    
_pos getPos _obj;
    
_dmg getDamage _obj;
    
_vup vectorUp _obj;
    
_vdir vectorDir _obj;
    
_fuel fuel _obj;
    
_fire canFire _obj;
    
_type typeOf _obj;
    
    
_count 0;
    
    for [{
_loop=0},{(_count >= _delay)},{_loop=_loop}] do 
    {
    
        if ({
alive _xcount crew _obj 0then {
            
_count 0;
        } else {
            if (!
canMove _objthen {
                
_count _count 2;
            };
            if ((
getPos _obj distance _pos) > 10then {
                
_count _count 1;
            };
            if (
_fire != canFire _objthen {
                
_count _count 1;
            };    
            if (
damage _obj 0.95then {
                
_count _count 3;
            };    
        };
        
sleep 1;
    };
    
    
deleteVehicle _obj;
    
sleep _time;
    
    if (
_count != 0then {
        
_count _count 1;
        
_new _type createVehicle _pos;
        
_new setPos _pos;
        
_new setVectorDirAndUp [_vdir,_vup];
        
_new setDamage _dmg;
        
_new setFuel _fuel;
        
_new setVehicleInit format ["nul=[this,%1,%2,%3,%4] execVM 't-respawn.sqf';%5 = this;%4",_time,_delay,_count,_init,_name];
        
processInitCommands;
    };
}; 

In dem Fall respawnt das Fahrzeug unterschiedlich schnell wieder, jenachdem ob es kaputt ist, nichtmehr schiessen kann, bewegungsunfähig ist oder einfach irgendwo stehen gelassen wurde.

Wenn du also an dieser Stelle die Zahlen veränderst, kannst du diese Bedingungen beliebig anpassen:
PHP-Code:

            if (!canMove _objthen {
                
_count _count 2;
            };
            if ((
getPos _obj distance _pos) > 10then {
                
_count _count 1;
            };
            if (
_fire != canFire _objthen {
                
_count _count 1;
            };    
            if (
damage _obj 0.95then {
                
_count _count 3;
            }; 

Wenn eine Respawnzeit von 30 sekunden eingestellt ist, respawnt das Fahrzeut in dem Fall hier nach 30 sekunden wenn es stehen gelassen wurde.
Ist es zerstört, spawnt es bereits nach 10 sekunden. (sollte selbsterklärend sein)

[HSP] NoFu 12.03.2013 15:11

Ah sehr genial Tajin. Genau das, was ich für das Clan-ArmA-III-Bootcamp benötige.
Danke dafür !

Tajin 12.03.2013 15:20

Keine Ursache.

Hab grad gesehen das es den original Thread davon sogar noch gibt:
Vehicle Respawn with Name & Init

Kaum zu glauben wie lang das schonwieder her ist. :komisch:

Vienna 12.03.2013 16:06

Wie aus Tajins Post ersichtlich, sind Fahrzeuge oft schon unbrauchbar bevor sie zerstört wurden. Ein Auto kann z.B. durch einen zerschossenen Reifen bereits unbrauchbar sein. Wobei die Beschädigung unter 5% liegt.

Folgend ein Skirpt welches bereits nicht mehr brauchbare Fahrzeuge erneuert. canFire wurde dabei nicht berücksichtigt, weil hier bei einem unbesetzten Fahrzeug false angezeigt wird.

Beim Skript-Aufruf ist auch einstellbar ob das alte Fahrzeug gelöscht werden soll und wie oft ein Respawn möglich ist.

Skript Fahrzeug_Respawn_2.sqf
Code:

// Fahrzeug-Respawn wenn Fahrzeug zerstört oder unlenkbar. [Vienna 12.03.2013]
//  Die neuen Fahrzeuge werden an der ursprünglichen Position erstellt.
//  Einmaliger Aufruf. Läuft beim Server.
//
// Parameter: FahrzeugObjekt
//            Zeit in Sekunden bis zum Respawn
//            unbrauchbares Fahrzeug löschen (true/false)           
//            maximale Anzahl der neu zu erstelltenden Fahrzeuge
//
// Aufrufbeispiel in der Initialisierungszeile des Fahrzeuges:
//  temp = [this, 120, true, 5] execVM "Fahrzeug_Respawn_2.sqf";

private ["_vehicle","_respawnZeit","_entfernen","_respawnAnzahl","_type","_pos","_dir","_respawn"];

//Parameter übernehmen
_vehicle      = _this select 0;
_respawnZeit  = _this select 1;
_entfernen    = _this select 2;
_respawnAnzahl = _this select 3;
//Fahrzeugtype sowie Position und Ausrichtung vom Aufstellungsort speichern.
_type = typeOf _vehicle;
_pos  = getPos _vehicle;
_dir  = getDir _vehicle;

//Schleife bis maximale Anzahl erreicht. Letztes Fahrzeug wird, wenn gewollt, noch gelöscht.
_respawn = 0;
while {isServer and _respawn <= _respawnAnzahl} do
 {
  waitUntil {!canMove _vehicle or fuel _vehicle == 0}; //warten bis Fahrzeug zerstört oder unlenkbar
  waitUntil {{alive _x} count crew _vehicle == 0};    //warten bis keine Crew im Fahrzeug (Tote werden nicht gezählt)
  _vehicle lock true;                //Fahrzeug sperren (kein Einsteigen möglich)
  sleep 5;                            //Pause damit Tote nicht zu schnell verschwinden
  {if(!alive _x)then{_x setPos [0,0];deleteVehicle _x}}forEach crew _vehicle; // Tote Crew löschen
  sleep (_respawnZeit - 5);                      //warten bis Respawnzeit um
  if (_entfernen) then {deleteVehicle _vehicle}; //Fahrzeug löschen, wenn gewollt.
  if (_respawn < _respawnAnzahl) then            //neues Fahrzeug erstellen
  {
  _vehicle = _type createVehicle _pos;
  _vehicle setDir _dir;
  _respawn = _respawn + 1;
  sleep 1
  }
 }



Alle Zeitangaben in WEZ +1. Es ist jetzt 12:55 Uhr.

Angetrieben durch vBulletin, Entwicklung von Philipp Dörner & Tobias


SEO by vBSEO 3.2.0 ©2008, Crawlability, Inc.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119