PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Respawnscript für Fahrzeuge


JoeJoe87577
09.03.2013, 15:33
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:
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, 17:32
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.


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, 16: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, 18: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, 17:41
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, 20:18
Du erstellst in der Schleife deines Skripts Abfragen, für welches es mit den Befehlen von Arma einfachere Möglichkeiten gibt.


// 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
11.03.2013, 23:06
Was muss ich machen damit dass Fahrzeug nur neu gespawnt wird wenn es zerstört wurde? :)

Tajin
12.03.2013, 08:53
Kannste in dem Fall nicht sogar einfach die Standardfunktion verwenden?

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

JoeJoe87577
12.03.2013, 09: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, 10: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:
if (isServer) then {
_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 _x} count crew _obj > 0) then {
_count = 0;
} else {
if (!canMove _obj) then {
_count = _count + 2;
};
if ((getPos _obj distance _pos) > 10) then {
_count = _count + 1;
};
if (_fire != canFire _obj) then {
_count = _count + 1;
};
if (damage _obj > 0.95) then {
_count = _count + 3;
};
};
sleep 1;
};

deleteVehicle _obj;
sleep _time;

if (_count != 0) then {
_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:
if (!canMove _obj) then {
_count = _count + 2;
};
if ((getPos _obj distance _pos) > 10) then {
_count = _count + 1;
};
if (_fire != canFire _obj) then {
_count = _count + 1;
};
if (damage _obj > 0.95) then {
_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, 14: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, 14:20
Keine Ursache.

Hab grad gesehen das es den original Thread davon sogar noch gibt:
Vehicle Respawn with Name & Init (http://forums.bistudio.com/showthread.php?79070-Vehicle-Respawn-with-Name-amp-Init)

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

Vienna
12.03.2013, 15: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

// 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
}
}