So tadellos wird das auf Dauer nicht klappen. z.B. wenn die beide Respawn-Positionen über Wasser liegen oder du an beiden Positionen immer gleich getötet wirst.
Hier eine bessere Lösung mit einem Skript, wo ich versucht habe dem vorzubeugen. Anweisung für die Anwendung im Skript-Kopf.
schleppRespawn.sqf Skript nur einmal aufrufen!
Code:
// 10 Respawn-Positionen im Bewegungsbereich des Spielers [Vienna 13.08.2014]
//
// Es ist zu beachten, dass sich der Spieler beim Skriptstart nicht über Wasser befindet!
//
// Aufruf: [<a>,<b>,<c>] execVM "schleppRespawn.sqf"
// <a> in Meter der Abstand bis zum Setzen der nächsten Position.
// <b> in Meter der maximale Abstand beim Respawn.
// <c> in Sekunden die Zeit, innerhalb der bei zwei Respawns eine
// Rückstellung an die Skriptstart-Position erfolgt.
//
// Beispiel für Auslöser: temp = [50,400,60] execVM "schleppRespawn.sqf";
//
// SKRIPT NUR EINMAL AUFRUFEN!
//Lokal nur für Spieler.
sleep 1;
if (!local player) exitwith {};
private ["_anzahl","_abstand","_maxAbst","_zeit","_minZeit","_i","_j","_index","_posX","_startPos","_positionen","_distanzen","_temp","_wahl"];
//Parameter
_abstand = _this select 0; //Abstand der Positionen
_maxAbst = _this select 1; //maximaler Abstand beim Respawn
_minZeit = _this select 2; //Zeitbereich innerhalb der bei 2 Toden die Rückstellung zur _startPos erfolgt
//Anzahl der Positionsspeicherungen
_anzahl = 10;
//Schleifenzähler für die Positionen
_j = 0;
//Positionen initialisieren
_startPos = [getPos player select 0,getPos player select 1]; //Position beim Skriptstart
_posX = _startPos;
_positionen = [];
for "_i" from 0 to _anzahl -1 do {_positionen =_positionen + [_startPos]};
//Endlosschleife ===============================================================
while {true} do
{
//warten auf lebenden Spieler
waitUntil {alive player};
_zeit = Time; //Referenzzeit
//wenn Spieler nicht in Fahr-/Flugobjet, dann zur Respawn-Position versetzen.
if (player == vehicle player) then {player setPos _posX};
//falls Position im Wasser, dann zur _startPos
if (surfaceIsWater position player) then {player setPos _startPos};
//Schleife solange Spieler lebt ----------------------------------------------
while {alive player} do
{
//Respawn-Positionen in Array _positionen speichern
if (_j==0) then {_index = _anzahl-1} else {_index = _j-1};
//vorherige Position zum Vergleich
_temp = _positionen select _index;
//Vergleichsposition rückstellen wenn Abstand über _maxAbst
if (_temp distance getPos player > _maxAbst) then
{
_temp = [getPos player select 0,getPos player select 1];
_positionen set [_index,_temp]
};
//warten bis Spieler tot oder Bedingung für neue Position-Speicherung erfüllt
waitUntil {sleep 0.5; !alive player or _temp distance getPos player > _abstand};
if (alive player) then
{
_positionen set [_j,[getPos player select 0,getPos player select 1]];
_j = _j + 1;
if (_j == _anzahl) then {_j = 0}
}
};//Schleifenende nach Spielertod -------------------------------------------
//Todesposition speichern
_posX = [getPos player select 0,getPos player select 1];
//Respawn-Position festlegen
_distanzen = [];
//Distanzen der Positionen zur Todesposition speichern
{_distanzen = _distanzen + [_posX distance _x]}forEach _positionen;
//zufällige Wahl aus den Distanzen
for "_i" from 1 to _anzahl*5 do
{
_wahl = (_distanzen select (floor(random _anzahl)));
if (_wahl < _maxAbst and _wahl > _abstand) exitwith {} //wenn innerhalb des Bereichs, dann fertig.
};
//Respawn-Position aus _positionen entnehmen und in _posX speichern
{if (_posX distance _x == _wahl) exitwith {_posX = _x}} forEach _positionen;
//zwei Tode im Zeitbereich?
if (time < _zeit + _minZeit) then {_posX = _startPos}//wenn ja, dann zur _startPos
}
//Skriptende ===================================================================