Einzelnen Beitrag anzeigen
Alt 13.09.2014, 17:28   #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

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 ===================================================================
Vienna ist offline