Visa ämne
Anrop » ArmA 3 » Editing
 Skriv ut ämne
ZluskeN's Wave Respawn
Grymt jobbat!
Uppdaterad version stresstestad på servern och fungerar som det ska, första posten uppdaterad.
Två frågor:

1) Vilken utrustning börjar man med när man respawnat? Är det beroende på default config på den unit man är?

2) Funkar detta att kombinera med ACE Revive?
Jag testade själv istället och kan nu besvara mina egna frågor...

1) Man respawnar med default config för den unit man är. Dvs om man placerar ut en vanlig civil och ger honom ett vapen i editorn, så kommer han att respawna utan vapen, eftersom det är den unitens default config.

2) Det verkar gå att kombinera med ACE Revive, i alla fall när jag testar på lokal server, okänt hur det blir på dedicated.
Följdfråga där då: hur gå till väga för att man inte ska respawna med skrotgare?
https://community...dInventory tror jag borde funka. Då får ni antingen definiera ett inventory i description.ext under cfgrespawninventory eller köra https://community...eInventory under spelets gång. Heads up på att BIS_fnc_saveInventory inte längre kan anropas i onplayerkilled.sqf.

Vad ACE anbelangar så borde det inte bli några konflikter. Man respawnar ju faktiskt omedelbart, precis som vanlig base respawn, mitt script kastar bara ut dig ur din kropp ett tag.
Det bästa är nog att spara undan all inventory för enheten när missionet startas och sedan återställa vid wave respawn
https://forums.bi...espawning/

initplayerlocal.sqf
Källa  Kod
[player, [missionNamespace, "inventory_var"]] call BIS_fnc_saveInventory;
player addMPEventHandler ["MPRespawn", {[player, [missionNamespace, "inventory_var"]] call BIS_fnc_loadInventory;}];
Jag insåg plötsligt att slutet "all players killed" inte kommer att fungera med det här scriptet. En situation som kan uppstå är att alla blir fast i spectator när antalet spawn waves tar slut.
Jag har lagt till några rader som skapar en extra trigger som avslutar uppdraget om det känner av att alla spelare från en viss sida är i vänteläge.

En känd feature är att det sannolikt kommer returnera mission fail för alla i PvP. Rekommenderar att man byter ut 'EveryoneLost' mot 'SideScore' om man gör ett PvP-uppdrag.
Jag skulle kunna lägga till en PvP true/false-variabel i första raden om det är något folk gärna vill använda i framtiden.
Implementerat

Jag upptäckte också att bohemia verkar ha lite svårt att bestämma sig för vad de ska kalla indep-sidan i koden (ibland guer, ibland guerrila (sic) ibland resistance, ibland independent).
Jag tror att jag har lyckats sätta rätt namn på rätt ställen nu. Passade dessutom på att optimera scriptet lite grann, det kan nu köras enbart på servern mha initserver.sqf vilket friar upp init.sqf till annat. Jag väntar med att uppdatera första posten tills det är testat.

onplayerkilled.sqf
Källa  Kod
[player] join grpnull;

["Initialize", [player, [side player], false, false, true, true, true, true, true, true]] call BIS_fnc_EGSpectator;

initserver.sqf
Källa  Kod
[] remoteExec ["zsn_waverespawn", 2];

zsn_waverespawn =
{
   params
   [
      ["_zsn_side", west, [east]],

      ["_zsn_wavesize", 4, [8]],

      ["_zsn_wavecount", -1, [8]],

      ["_zsn_radio", true, [false]],

      ["_zsn_pvp", false, [true]]
   ];

   if (_zsn_side == east) then
   {
      zsn_radio_east = _zsn_radio;

      publicVariable "zsn_radio_east";

      deleteVehicle zsn_espawn_trg;

      zsn_wavecount_east = _zsn_wavecount;

      publicVariable "zsn_wavecount_east";

      zsn_wavesize_east = _zsn_wavesize;

      publicVariable "zsn_wavesize_east";

      zsn_espawn_trg = createTrigger ["EmptyDetector", getmarkerPos "respawn_east"];

      zsn_espawn_trg setTriggerActivation ["east", "PRESENT", true];

      zsn_espawn_trg setTriggerStatements ["isServer && {Side _x == east} count thislist >= zsn_wavesize_east && (zsn_wavecount_east ^ 2) >= 1", "thisList call zsn_spawnwave_east;",""];

      deleteVehicle zsn_efail_trg;

      zsn_efail_trg = createTrigger ["EmptyDetector", getmarkerPos "respawn_east"];

      zsn_efail_trg setTriggerActivation ["east", "PRESENT", true];

      if (_zsn_pvp) then
      {
         zsn_efail_trg setTriggerStatements ["isServer && {isPlayer _x && alive _x && Side _x == east} count thisList == {alive _x && Side _x == east} count (allPlayers - entities 'HeadlessClient_F') && (zsn_wavecount_east ^ 2) < 1", "'SideScore' call BIS_fnc_endMissionServer;",""];
      }
      else
      {
         zsn_efail_trg setTriggerStatements ["isServer && {isPlayer _x && alive _x && Side _x == east} count thisList == {alive _x && Side _x == east} count (allPlayers - entities 'HeadlessClient_F') && (zsn_wavecount_east ^ 2) < 1", "'EveryoneLost' call BIS_fnc_endMissionServer;",""];
      };
   }
   else
   {
      if (_zsn_side == west) then
      {
         zsn_radio_west = _zsn_radio;

         publicVariable "zsn_radio_west";

         deleteVehicle zsn_wspawn_trg;

         zsn_wavecount_west = _zsn_wavecount;

         publicVariable "zsn_wavecount_west";

         zsn_wavesize_west = _zsn_wavesize;

         publicVariable "zsn_wavesize_west";
     
         zsn_wspawn_trg = createTrigger ["EmptyDetector", getmarkerPos "respawn_west"];

         zsn_wspawn_trg setTriggerActivation ["west", "PRESENT", true];

         zsn_wspawn_trg setTriggerStatements ["isServer && {Side _x == west} count thislist >= zsn_wavesize_west && (zsn_wavecount_west ^ 2) >= 1", "thisList call zsn_spawnwave_west;",""];

         deleteVehicle zsn_wfail_trg;

         zsn_wfail_trg = createTrigger ["EmptyDetector", getmarkerPos "respawn_west"];

         zsn_wfail_trg setTriggerActivation ["west", "PRESENT", true];

         if (_zsn_pvp) then
         {
            zsn_wfail_trg setTriggerStatements ["isServer && {isPlayer _x && alive _x && Side _x == west} count thisList == {alive _x && Side _x == west} count (allPlayers - entities 'HeadlessClient_F') && (zsn_wavecount_west ^ 2) < 1", "'SideScore' call BIS_fnc_endMissionServer;",""];
         }
         else
         {
            zsn_wfail_trg setTriggerStatements ["isServer && {isPlayer _x && alive _x && Side _x == west} count thisList == {alive _x && Side _x == west} count (allPlayers - entities 'HeadlessClient_F') && (zsn_wavecount_west ^ 2) < 1", "'EveryoneLost' call BIS_fnc_endMissionServer;",""];
         };
      }
      else
      {   
         if (_zsn_side == resistance) then
         {
            zsn_radio_resistance = _zsn_radio;

            publicVariable "zsn_radio_resistance";

            deleteVehicle zsn_gspawn_trg;

            zsn_wavecount_resistance = _zsn_wavecount;

            publicVariable "zsn_wavecount_resistance";

            zsn_wavesize_resistance = _zsn_wavesize;

            publicVariable "zsn_wavesize_resistance";
         
            zsn_gspawn_trg = createTrigger ["EmptyDetector", getmarkerPos "respawn_guerrila"];

            zsn_gspawn_trg setTriggerActivation ["guer", "PRESENT", true];

            zsn_gspawn_trg setTriggerStatements ["isServer && {Side _x == resistance} count thislist >= zsn_wavesize_resistance && (zsn_wavecount_resistance ^ 2) >= 1", "thisList call zsn_spawnwave_resistance;",""];

            deleteVehicle zsn_gfail_trg;

            zsn_gfail_trg = createTrigger ["EmptyDetector", getmarkerPos "respawn_guerrila"];

            zsn_gfail_trg setTriggerActivation ["guer", "PRESENT", true];

            if (_zsn_pvp) then
            {
               zsn_gfail_trg setTriggerStatements ["isServer && {isPlayer _x && alive _x && Side _x == resistance} count thisList == {alive _x && Side _x == resistance} count (allPlayers - entities 'HeadlessClient_F') && (zsn_wavecount_resistance ^ 2) < 1", "'SideScore' call BIS_fnc_endMissionServer;",""];
            }
            else
            {
               zsn_gfail_trg setTriggerStatements ["isServer && {isPlayer _x && alive _x && Side _x == resistance} count thisList == {alive _x && Side _x == resistance} count (allPlayers - entities 'HeadlessClient_F') && (zsn_wavecount_resistance ^ 2) < 1", "'EveryoneLost' call BIS_fnc_endMissionServer;",""];
            };
         }
         else
         {
            if (_zsn_side == civilian) then
            {
               zsn_radio_civilian = _zsn_radio;

               publicVariable "zsn_radio_civilian";

               deleteVehicle zsn_cspawn_trg;

               zsn_wavecount_civilian = _zsn_wavecount;

               publicVariable "zsn_wavecount_civilian";

               zsn_wavesize_civilian = _zsn_wavesize;

               publicVariable "zsn_wavesize_civilian";
         
               zsn_cspawn_trg = createTrigger ["EmptyDetector", getmarkerPos "respawn_civilian"];

               zsn_cspawn_trg setTriggerActivation ["civ", "PRESENT", true];
 
               zsn_cspawn_trg setTriggerStatements ["isServer && {Side _x == civilian} count thislist >= zsn_wavesize_civilian && (zsn_wavecount_civilian ^ 2) >= 1", "thisList call zsn_spawnwave_civilian;",""];

               deleteVehicle zsn_cfail_trg;

               zsn_cfail_trg = createTrigger ["EmptyDetector", getmarkerPos "respawn_civilian"];

               zsn_cfail_trg setTriggerActivation ["civ", "PRESENT", true];

               if (_zsn_pvp) then
               {
                  zsn_cfail_trg setTriggerStatements ["isServer && {isPlayer _x && alive _x && Side _x == civilian} count thisList == {alive _x && Side _x == civilian} count (allPlayers - entities 'HeadlessClient_F') && (zsn_wavecount_civilian ^ 2) < 1", "'SideScore' call BIS_fnc_endMissionServer;",""];
               }
               else
               {
                  zsn_cfail_trg setTriggerStatements ["isServer && {isPlayer _x && alive _x && Side _x == civilian} count thisList == {alive _x && Side _x == civilian} count (allPlayers - entities 'HeadlessClient_F') && (zsn_wavecount_civilian ^ 2) < 1", "'EveryoneLost' call BIS_fnc_endMissionServer;",""];
               };
            };
         };
      };
   };
};

zsn_spawnwave_east =
{
   _units = _this;

   _grp = createGroup east;

   _units join _grp;

   if (zsn_radio_east) then
   {
      leader _grp additem "itemradio";

      leader _grp assignItem "itemradio";
   };

   {_x setVehiclePosition [(["zsn_respawn_east"] call BIS_fnc_randomPosTrigger), [], 8]} forEach _units;

   if (zsn_respawn_east emptyPositions "cargo" >= zsn_wavesize_east) then
   {
      {_x assignascargo zsn_respawn_east} forEach _units;

      {_x moveincargo zsn_respawn_east} forEach _units;
   };

   ["Terminate"] remoteExec ["BIS_fnc_EGSpectator", _units];

   zsn_wavecount_east = zsn_wavecount_east - 1;

   publicVariable "zsn_wavecount_east";
};

zsn_spawnwave_west =
{
   _units = _this;

   _grp = createGroup west;

   _units join _grp;

   if (zsn_radio_west) then
   {
      leader _grp additem "itemradio";

      leader _grp assignItem "itemradio";
   };

   {_x setVehiclePosition [(["zsn_respawn_west"] call BIS_fnc_randomPosTrigger), [], 8]} forEach _units;

   if (zsn_respawn_west emptyPositions "cargo" >= zsn_wavesize_west) then
   {
      {_x assignascargo zsn_respawn_west} forEach _units;

      {_x moveincargo zsn_respawn_west} forEach _units;
   };

   ["Terminate"] remoteExec ["BIS_fnc_EGSpectator", _units];

   zsn_wavecount_west = zsn_wavecount_west - 1;

   publicVariable "zsn_wavecount_west";
};

zsn_spawnwave_resistance =
{
   _units = _this;

   _grp = createGroup resistance;

   _units join _grp;

   if (zsn_radio_resistance) then
   {
      leader _grp additem "itemradio";

      leader _grp assignItem "itemradio";
   };

   {_x setVehiclePosition [(["zsn_respawn_guerrila"] call BIS_fnc_randomPosTrigger), [], 8]} forEach _units;

   if (zsn_respawn_guerrila emptyPositions "cargo" >= zsn_wavesize_resistance) then
   {
      {_x assignascargo zsn_respawn_guerrila} forEach _units;

      {_x moveincargo zsn_respawn_guerrila} forEach _units;
   };

   ["Terminate"] remoteExec ["BIS_fnc_EGSpectator", _units];

   zsn_wavecount_resistance = zsn_wavecount_resistance - 1;

   publicVariable "zsn_wavecount_resistance";
};

zsn_spawnwave_civilian =
{
   _units = _this;

   _grp = createGroup civilian;

   _units join _grp;

   if (zsn_radio_civilian) then
   {
      leader _grp additem "itemradio";

      leader _grp assignItem "itemradio";
   };

   {_x setVehiclePosition [(["zsn_respawn_civilian"] call BIS_fnc_randomPosTrigger), [], 8]} forEach _units;

   if (zsn_respawn_civilian emptyPositions "cargo" >= zsn_wavesize_civilian) then
   {
      {_x assignascargo zsn_respawn_civilian} forEach _units;

      {_x moveincargo zsn_respawn_civilian} forEach _units;
   };

   ["Terminate"] remoteExec ["BIS_fnc_EGSpectator", _units];

   zsn_wavecount_civilian = zsn_wavecount_civilian - 1;

   publicVariable "zsn_wavecount_civilian";
};

initplayerlocal.sqf
Källa  Kod
[player, [missionNamespace, "inventory_var"]] call BIS_fnc_saveInventory;

player addMPEventHandler ["MPRespawn", {[player, [missionNamespace, "inventory_var"]] call BIS_fnc_loadInventory;}];

Redigerat av ZluskeN den 2017-01-29 03:20
Den fördefinerade variabeln resistance ger strängvärdet "GUER"

Den fördefinerade variabeln independent ger strängvärdet "GUER", den är mappad till resistance

Så länge du använder någon av de två variablerna blir allt bra Smile
Du har inte möjlighet att sätta upp ett exempel uppdrags templet. För oss som är tekniskt obegåvade Wink gillar de här starkt, blir respawn lite mer kontrollerat och viktigt samt gör att man får en vettig förstärknings funktion.
Zlusken: tror du att det funkar att flytta respawnpunkten under uppdraget med t ex setMarkerPos?
Grip: Lite osäker på hur man gör mission-templates, men ska se om jag kan slänga ihop nånting. Om någon vet bättre hur det funkar får ni gärna hjälpa till.
På sikt har jag planer på att göra det som en modul i stället, så man slipper rota i mission-mappen.

Alekanderu: Ja, setmarkerpos ska absolut funka.
Zlusken tänkt dig ett demo uppdrag med bara vanilla innehåll. Och inget annat än dina respawn script uppsatta så dom funkar. Så kan man titta var man ska lägga var för att få de fungera.
Fixade precis just ett sånt Smile

https://drive.goo...nFYaF9LemM

Exemplet är konfat för en (väldigt) rudimentär PvP-match mellan OPFOR och BLUFOR på Stratis med olika presets, plus ett simpelt Coop-uppdrag för INDEP på andra sidan ön.

Det innehåller dessutom en nyare version av scriptet med lite nya features:

- Man kan nu använda ett fordon som zsn_respawn_side. Finns det plats i fordonet kommer den nya gruppen flyttas i som cargo, finns det inte plats spawnar de invid fordonet.

- Två nya parametrar:
- Radio (true/false) för att ge nya grupper radio (eller inte).
- PvP (true/false) ser till att rätt sida vinner om den andra sidan får slut på spawns och blir dödade. Om false kommer spelarsidan alltid få game over-slut om alla dör och antalet vågor når noll.

- Scriptet kommer nu att returnera korrekta felmeddelanden om man matar in fel typ av värde [Side, Number, Number, Boolean, Boolean]
Notera att size (Spelare per våg) numera kommer före count (antal vågor)

Nu finns det default-värden, så man måste inte mata in alla parametrar för att använda scriptet. Default-värdena är:
- WEST (Blufor),
- 4 (Spelare per spawn-wave),
- -1 (Oändligt med waves)
- TRUE (Den nya vågen utrustas med en radio)
- FALSE (Inte pvp, alltså Coop. När alla dör är det game over)

Om det är de här inställningarna du tänker köra med behöver du inte mata in några parametrar alls (Se indep-exemplet). Fråga på om något verkar svårbegripligt.
Ovanstående post uppdaterad.
Redigerat av ZluskeN den 2017-01-29 17:03