Visa ämne
Anrop » ArmA 2 » Editering
 Skriv ut ämne
Flytta till random spawn
Tjollivipp

Jag håller på med ett pvp där jag vill flytta ut spelare till en random spawn, så här gjorde jag först:

init.sqf
Kod Källa  

if (IsServer) then {
   _positionArray = [
      spawn1,
      spawn2,
      spawn3,
      spawn4,
      spawn5,
      spawn6,
      spawn7,
      spawn8,
      spawn9,
      spawn10,
      spawn11
   ];


   // Get WEST position
   _randMarker = _positionArray select (random count _PositionArray);
   _positionArray = _positionArray - [_randMarker];
   _posWest = getPos _randMarker;

   // Get EAST position
   _randMarker = _positionArray select (random count _PositionArray);
   _positionArray = _positionArray - [_randMarker];
   _posEast = getPos _randMarker;

   // Get INDEPENDENT position
   _randMarker = _positionArray select (random count _PositionArray);
   _positionArray = _positionArray - [_randMarker];
   _posGuer = getPos _randMarker;


   // Set unit positions
   {
      if (side _x == west) then {
         _x setPos _posWest;
      };

      if (side _x == east) then {
         _x setPos _posEast;
      };

      if (side _x == resistance) then {
      _   x setPos _posGuer;
      };
   } forEach allUnits;
};


Funkade jättebra lokalt med AI, alla från dom olika lagen hamnar på en random plats som tänkt men när jag testar i multiplayer där:
Blufor lead är en human och resten är AI
Opfor lead är en human (jag) och resten AI
Resistance är helt AI

så flyttas alla utom blufor lead som är spelaren som hjälper mig debugga.
Så antingen ligger han inte ens med i allUnits eller så flyttas han inte av någon annan skum anledning?

Jag funderade på omdet kunde vara något problem med att man bara kan flytta enhter som är lokala på datorn så jag modifierade scriptet enligt följande:

Kod Källa  

// Variable initialision
posWest = [0,0,0];
posEast = [0,0,0];
posGuer = [0,0,0];
initDone = false;

/* Move squads to one of the random positions */
if (IsServer) then {
   _positionArray = [
      spawn1,
      spawn2,
      spawn3,
      spawn4,
      spawn5,
      spawn6,
      spawn7,
      spawn8,
      spawn9,
      spawn10,
      spawn11
   ];


   // Get WEST position
   _randMarker = _positionArray select (random count _PositionArray);
   _positionArray = _positionArray - [_randMarker];
   posWest = getPos _randMarker;
   publicVariable "posWest";

   // Get EAST position
   _randMarker = _positionArray select (random count _PositionArray);
   _positionArray = _positionArray - [_randMarker];
   posEast = getPos _randMarker;
   publicVariable "posEast";

   // Get INDEPENDENT position
   _randMarker = _positionArray select (random count _PositionArray);
   _positionArray = _positionArray - [_randMarker];
   posGuer = getPos _randMarker;
   publicVariable "posGuer";

   initDone = true;
   publicVariable "initDone";


   /* Moved code to actually move the units outside the IsServer scope */
};


/* Make sure server has ran the code above in a MP environment */
waitUntil {initDone};


// Set unit positions
{
   if (side _x == west) then {
      _x setPos posWest;
   };

   if (side _x == east) then {
      _x setPos posEast;
   };

   if (side _x == resistance) then {
      _x setPos posGuer;
   };
} forEach allUnits;


men det gjorde ingen skillnad :facepalm: så nu vet jag fasen inte vad som är felet.
några idéer?
Redigerat av xealot den 2012-02-02 13:33
The enemy cannot predict your actions if you have no idea what you're doing.
Ok. Jag löste det själv med lite hjälp från granq där han bl.a. bekräftade att man bara får flytta lokala enheter.
Problemet var alltså ett i början av scriptet.

Tänk att servern börjar köra scriptet, den sätter initDone till true och skickar ut det till klienterna.
Klienten i sin tur börjar köra scriptet långt efter servern redan är klar och det första scriptet gör är att nollställa (initialisera) värdena.

Dvs den skriver om initDone till False igen även om den var True innan, lösningen är:
Kod Källa  

if (isNil "initDone") then {
   initDone = false;
};


samt att man kan ta bort posWest = [0,0,0] (och dom andra två) helt och hållet.
Tack för visat intresse!
The enemy cannot predict your actions if you have no idea what you're doing.
inti.sqf

{
if(local _x) then { _x setPosATL getPosATL umeåFlygplats }
} forEach (if(isMultiplayer) then { playableUnits} else { switchableUnits })
odenhouse.servegame.com/OdenSig512.jpg