Jump to content
pierremgi

AI VEHICLE RESPAWN script, an alternative for BI module

Recommended Posts

Getting an error now, line 62: undefined variable in expression:  _cont

My spawn line is pretty simple:

0 = [[EAST,WEST],["start","start"],5,false,false] spawn MGI_fnc_VehicleRespawn;

Works with previous version (minus the original heading). This version respawns the vehicle at death position and then won't respawn the vehicle again.

Share this post


Link to post
Share on other sites

I can't reproduce that. Could you give me more info about vehicle type and specific loadout? empty or not? Did it occur on crates? Did you notice a difference between the two last versions for all vehicles? Tks for your feedback.

 

Note apart: There is an unwanted effect with specific loadout on vehicles with modified loadout via 3den. It seems the simple fact to open the "attributes" equipment storage, lets an unwanted arsenal addAction (hidden in Vanilla menu) visible as menu after respawn, with my script.

This arsenal addAction comes from BI. You can test it just modifying the storage in 3den, and run the preview, testing cursorObject actionParams 0 in the debug console. This "action param" disappear after some time if player is close enough to the vehicle... and the script becomes OK.

The workaround is to script any specific loadout, instead of opening the equipment storage in Eden.

On the other hand, I can forget the idea to "respawn" all addAction which could be added in the init field of the vehicle.

Share this post


Link to post
Share on other sites

I'm getting inconsistent results now, and I know my methodology is at least a part of the problem. I need to create a proper repro mission.

Share this post


Link to post
Share on other sites

OK, I had to add "sideEmpty" to the spawn line, which is fine. 
This is sort of a TDM tank battle I have put together for my group as a warm-up before operations and for teamwork/communication training. Each side gets four tanks with unlimited respawns, so there's no endgame. The "sideEmpty" will be necessary as players tend to bail upon receiving critical damage as a matter of reflex.

I guess this issue is sorted, but there may be another. I have a modded version of this mission using ACE/RHS (the actual reason I came looking this scripted respawn solution), and my first test exhibited multiple problems. Again, likely things on my end, so I'll have to build a repro version.

Thanks again!

Share this post


Link to post
Share on other sites

No problem. I didn't test with sideEmpty. I will have a look at this. I set a multi-variable on vehicle, then, its side stays defined, alive or not, until I delete the vehicle and its associated variable. So, there is no reason to fail, even if the crew bails out, or dies before destruction.

I can't cope with ACE because this mod is too preemptive for many behaviors. But RHS should be fine.

I'll appreciate a repro if you have time, not asking for ACE. Tks.

Share this post


Link to post
Share on other sites

So i'm really green when it comes to scripting things like this. So I'm trying to have the planes and helis (empty) respawn with their custom pylon loadouts. The current vehicle respawn module is set up with a desertion distance of 150m so that when they leave the vehicle, it essentially reparks itself. But when they respawn, they come with the default loadout. So do I just use the second script in the initServer.sqf or do I use both of them?

Share this post


Link to post
Share on other sites
4 hours ago, Riverman23 said:

So i'm really green when it comes to scripting things like this. So I'm trying to have the planes and helis (empty) respawn with their custom pylon loadouts. The current vehicle respawn module is set up with a desertion distance of 150m so that when they leave the vehicle, it essentially reparks itself. But when they respawn, they come with the default loadout. So do I just use the second script in the initServer.sqf or do I use both of them?

Just the second, the first one is a light version without loadout and pylons consideration.

I didn't implement a "deserted distance". Not too difficult but some more things to be checked and that could be CPU consuming if you respawn too many vehicles.

Disabled vehicle: can't fire, can't move, (see BI definitions), and no more crew inside, are already respawnable (4th parameter).

Share this post


Link to post
Share on other sites
4 hours ago, Riverman23 said:

Okay thanks. And I'm supposed to use this in lieu of the respawn modules?

Yup!

Share this post


Link to post
Share on other sites

In reference to:

[_newVeh, compile Format ["%1=_This",_varName]] remoteExec ["call"];

->

[missionNamespace, [_varName, _newVeh]] remoteExec ["setVariable"];

Actually.. that is global remoteExec right?

https://community.bistudio.com/wiki/setVariable public parameter

missionNamespace setVariable [_varName, _newVeh, true];

This will now also be added to the JIP queue.

  • Like 1

Share this post


Link to post
Share on other sites

Yep! thanks. MissionNameSpace works fine! This way, you have also a true respawned vehicle with its name. More elegant than compile format. Tks.

Share this post


Link to post
Share on other sites

Hi, pierremgi

 

I folllow your video to use 3den triget and paste all your "MGI_fnc_vehicleRespawn" code inside.

But it seem not work...

 

PHLmRRN.png

Share this post


Link to post
Share on other sites
On 2018/5/21 at 3:40 AM, pierremgi said:

corrected.

I think i have some problem on setting.

 

I try to paste your corrected code in triget.

It will show a warning once after i setting triget.

And it dosen't respawn anything after i destroy them.

 

0 = [WEST,"death",10,true,false] spawn MGI_fnc_VehicleRespawn;

15E5HAB.png

 

By the way,

If i want to respawan some empty vehicles.

Can i move all them to a  Layer ex:"Vehs"

and use the code like:

 

0 = [[Vehs],["death"],10,true,false] spawn MGI_fnc_VehicleRespawn; 

Share this post


Link to post
Share on other sites

Sorry. I can' reproduce this error with:

0 = [WEST,"death",10,true,false] spawn MGI_fnc_VehicleRespawn;

in both script versions, using a trigger set to true condition.

In what context do you get this error? MP/SP? mods? type(s) of vehicles? custom loadout?... What is your trigger code?

 

For empty vehicles, [vehs] of vehs will not work if vehs is a layer name. You can respawn all empty vehicles (see last parameter) or an array of them [veh1,veh2,...] . This list can be updated while in game. Automatically, for example if you're using the last parameter (all empty vehs concerned), or if you gave a name to your array, or even adding a new line:

0 = [yourNewVeh,"death",10,true,false] spawn MGI_fnc_vehicleRespawn;

Share this post


Link to post
Share on other sites

Thanks, pierremgi

 

I finally found the mistake because I use layer name in function.

Now it will not show warning again.

But I try it again and use a name "Veh1" F/A 181 with custom loadout.

It still not work,After I destory it.

In MP without MOD.

 

0 = [Veh1,"death",10,true,false] spawn MGI_fnc_vehicleRespawn; 

 

I just need to change this line in your code,right?

 

Here is the all of code:

MGI_fnc_getVehicleLoadout = { 
  _veh = param [0,objNull, [objNull]]; 
  _veh setVariable ["MGIallCont",[]]; 
  (_veh getVariable "MGIallCont") pushBack [_veh,itemCargo _veh,magazineCargo _veh,weaponCargo _veh,backpackCargo _veh]; 
  {(_veh getVariable "MGIallCont") pushBack [_x select 0,itemCargo (_x select 1),magazineCargo (_x select 1),weaponCargo (_x select 1),[]]} forEach everyContainer _veh; 
}; 
 
MGI_fnc_setVehicleLoadout = { 
  params [["_newVeh",objNull,[objNull]], ["_oldVeh",objNull,[objNull]]]; 
  if ( {_x isKindOf "CAManBase"} count [_newVeh,_oldVeh] >0 or isnil {_oldVeh getVariable "MGIallCont"}) exitWith {}; 
  if (!isnil {_oldVeh actionParams 0}) then { 
    private _flagArsenalDbl = false; 
    if (!isnil {_oldVeh getVariable "bis_addVirtualWeaponCargo_cargo"}) then {_newVeh setVariable ["bis_addvirtualweaponcargo_cargo", _oldVeh getVariable ["bis_addvirtualweaponcargo_cargo",""]]}; 
    for "_i" from 0 to (_oldVeh addAction ["",""]) -1 do { 
      if (!_flagArsenalDbl or !(["bis_fnc_arsenal",_oldVeh actionParams _i select 1] call bis_fnc_instring)) then { 
        private _act = _oldVeh actionParams _i; 
        {_act deleteAt 10;true} count [1,2]; 
        [_newVeh,_act] remoteExec ["addaction",0,true]; 
        if(["bis_fnc_arsenal",_oldVeh actionParams _i select 1] call bis_fnc_instring) then {_flagArsenalDbl = true}; 
      }; 
    }; 
  }; 
 
  if (typeOf _newVeh isEqualTo typeOf _oldVeh) then { 
    private _oldTexture = getObjectTextures _oldVeh; 
    if ( count _oldTexture > 0) then { 
      for "_i" from 0 to count _oldTexture - 1 do { 
        _oldTexture  set [_i,[_i,_oldTexture select _i]] 
      }; 
      {_newVeh setObjectTextureGlobal _x } forEach _oldTexture; 
    }; 
    private _animList = animationNames _oldVeh; 
    if (count _animList > 0) then { 
      _ll = []; 
      for "_i" from 0 to count _animList -1 do { 
        _ll pushBack [_animList select _i,_oldVeh animationPhase (_animList select _i)]; 
      {_newVeh animate _x} forEach _ll; 
      }; 
    }; 
    if (_newVeh isKindOf "air") then { 
      private _pylons = getPylonMagazines _oldVeh; 
      private _pylonPaths = (configProperties [configFile >> "CfgVehicles" >> typeOf _oldVeh >> "Components" >> "TransportPylonsComponent" >> "Pylons", "isClass _x"]) apply {getArray (_x >> "turret")}; 
      { 
        _newVeh removeWeaponGlobal getText (configFile >> "CfgMagazines" >> _x >> "pylonWeapon") 
      } forEach getPylonMagazines _newVeh; 
      { 
       _newVeh setPylonLoadOut [_forEachIndex + 1, _x, true, _pylonPaths select _forEachIndex] 
      } forEach _pylons; 
    }; 
    private _oldTrt = magazinesAllTurrets _oldVeh; 
    {_newVeh removeMagazineTurret _x} forEach (magazinesAllTurrets _newVeh apply {[_x select 0,_x select 1]}); 
    {_newVeh addMagazineTurret _x} forEach _oldTrt; 
  }; 
  if (!isnil {_oldVeh getVariable "MGIallCont"} && {(_oldveh getVariable "MGIallCont") isEqualType []}) then { 
  { 
    _x params ["_cont",["_it",[]],["_mag",[]],["_wp",[]],["_bpk",[]]]; 
    if (_cont isEqualType "") then { 
      _cont = everyContainer _newVeh select (_foreachindex -1) select 1; 
    } else { 
      _cont = _newVeh; 
    }; 
    clearItemCargoGlobal _cont; 
    clearMagazineCargoGlobal _cont; 
    clearWeaponCargoGlobal _cont; 
    clearBackpackCargoGlobal _cont; 
    {_cont addItemCargoGlobal [_x,1];true} count _it; 
    {_cont addMagazineCargoGlobal [_x,1];true} count _mag; 
    {_cont addWeaponCargoGlobal [_x,1];true} count _wp; 
    {_cont addBackpackCargoGlobal [_x,1];true} count _bpk; 
  } forEach (_oldVeh getVariable ["MGIallCont",[]]); 
} }; 
 
MGI_fnc_VehicleRespawn = { 
  if (!isServer && hasInterface) exitWith {}; 
 
  params [["_vehs",[],[[],objNull,WEST],[]],["_positions","death",["",[]],[]],["_delay",10,[0]],["_respOnDisabled",false,[true]],["_empty",true,[true]]]; 
  private ["_pos","_positionArray"]; 
   MGIrespVehDelay = _delay max 2; 
  MGIrespOnDisabled = _respOnDisabled; 
  if (isnil "MGIrespVeh") then {MGIrespVeh = []}; 
  if (_vehs isEqualType objnull or _vehs isEqualType WEST) then {_vehs = [_vehs]}; 
  if (_empty) then { 
    {_Vehs pushBackUnique _x} forEach (vehicles select {!(_x isKindOf "weaponHolderSimulated") && count crew _x == 0}) 
  }; 
  {MGIrespVeh pushBackUnique _x} forEach _vehs; 
  if (_positions isEqualType "") then { _positions = [_positions]}; 
 
  fn_pos = { 
    params ["_position","_veh","_pos"]; 
    call { 
      if !(getMarkerPos _position isEqualTo [0,0,0]) exitWith {_pos = getMarkerPos _position}; 
      if (_position == "start" or (_x getVariable ["emptyVeh",false])) exitWith {_pos = getPos _veh}; 
        _pos = [0,0,0]; 
     }; 
    _pos 
  }; 
 
  _nbrEntries = count _vehs; 
  _nbrPos = count _positions; 
  if (_nbrPos < _nbrEntries) then { 
    for "_i" from 0 to (_nbrEntries - _nbrPos - 1) do { 
      _positions pushback "death"; 
    }; 
  }; 
 
  private ["_idx","_position"]; 
 
  while {true} do { 
    sleep 1; 
    _allVehicles = vehicles select {!(_x isKindOf "WeaponHolderSimulated") && !isPlayer _x && local _x && alive _x}; 
    { 
      _x addEventHandler ["handledamage", { 
        params ["_veh","_hit","_dam"]; 
          if (alive _veh) then { 
          _veh call MGI_fnc_getVehicleLoadout; _dam 
        }; 
      }]; 
      if (side _x in _vehs or _x in MGIrespVeh) then { 
        _x setVariable ["MGIrespVehOK",true]; 
        if (fullCrew _x isEqualTo []) then { 
          _x setVariable ["emptyVeh",true] 
        } else { 
          _x setVariable ["emptyVeh",false] 
        }; 
        call { 
          if (side _x in _vehs) exitWith {_idx = _vehs find (side _x); _position = _positions select _idx}; 
         if (_x in MGIrespVeh) exitWith {_idx = MGIrespVeh find _x; _position = _positions select _idx}; 
          _position = "death" 
          }; 
        _pos = [_position,_x] call fn_pos; 
        _x setVariable ["MGIrespVehDATA",[typeOf _x ,_pos, side _x, fullcrew _x,vehicleVarName _x,getDir _x]]; 
 
        if (_position == "death" && !(_x getVariable ["emptyVeh",false])) then { 
          _x spawn { 
            _veh = _this; 
            while {alive _veh} do { 
              if ({alive (_x select 0)} count (fullCrew _veh) > 0) then { 
                _fullOldCrew = +(fullCrew _veh select {alive (_x select 0)}); 
                {(_x select 0) setVariable ["oldGrp",group (_x select 0)]} forEach _fullOldCrew; 
                (_veh getVariable "MGIrespVehDATA") set [3,_fullOldCrew]; 
              } else { 
                if(MGIrespOnDisabled && !canmove _veh) exitWith { 
                  _veh spawn { 
                    params ["_veh"]; 
                    sleep MGIrespVehDelay/2; 
                    if ({alive _x} count crew _veh == 0) then { 
                      _veh setDamage [1,false]; 
                    }; 
                  }; 
                }; 
              }; 
              sleep 2; 
            }; 
          }; 
        } else { 
          {(_x select 0) setVariable ["oldGrp",group (_x select 0)]} forEach fullCrew _x; 
        }; 
      }; 
    } foreach (_allVehicles select {isNil {_x getVariable "MGIrespVehOK"}}); 
  }; 
}; 
 
addMissionEventHandler ["EntityKilled",{ 
  _destroyed = _this select 0; 
  if (!isNil {_destroyed getVariable "MGIrespVehOK"}) then { 
    _destroyed spawn { 
      _destroyed = _this; 
      _type = (_destroyed getVariable "MGIrespVehDATA") select 0; 
      _pos = (_destroyed getVariable "MGIrespVehDATA") select 1; 
      _side = (_destroyed getVariable "MGIrespVehDATA") select 2; 
      _fullOldCrew = (_destroyed getVariable "MGIrespVehDATA") select 3; 
      _varName = (_destroyed getVariable "MGIrespVehDATA") select 4; 
      _initDir = (_destroyed getVariable "MGIrespVehDATA") select 5; 
      _oldSpeed = speed _destroyed; 
      _oldCrew = _fullOldCrew apply {_x select 0}; 
      _respawnName =["initial point","grid"] select (_pos isEqualTo [0,0,0]); 
      _cfgVeh = configfile >> "cfgvehicles" >> typeOf _destroyed; 
      _displayName = gettext (_cfgVeh >> "displayName"); 
      _picture = (gettext (_cfgVeh >> "picture")) call bis_fnc_textureVehicleIcon; 
      _curr = currentWaypoint group _destroyed; 
      if (_pos isEqualTo [0,0,0]) then {_pos = getpos _destroyed}; 
      _dir = if (_destroyed getVariable ["emptyVeh",false]) then [{_initDir},{getDir _destroyed}]; 
      _onGround = (isTouchingGround _destroyed); 
      _timer = diag_tickTime; 
      waitUntil {isTouchingGround _destroyed or diag_tickTime > _timer + 10}; 
      sleep MGIrespVehDelay; 
      _destroyed hideObjectGlobal true; 
      sleep 0.1; 
      _newVeh =  createVehicle [_type, _pos, [], 0, ["FLY","CAN_COLLIDE"] select _onGround]; 
      _newVeh hideObjectGlobal true; 
      sleep 0.5; 
      _newVeh setDir _dir; 
      _newVeh hideObjectGlobal false; 
      if !(_varName isEqualTo "") then { 
        [_newVeh,_varname] remoteExec ["setVehicleVarName",0,true]; 
        missionNameSpace setVariable [_varName, _newVeh, true]; 
      }; 
      if (_destroyed in MGIrespVeh) then { 
        _idx = MGIrespVeh find _destroyed; 
        MGIrespVeh set [_idx, _newVeh]; 
        MGIrespVeh = MGIrespVeh - [objNull] 
      }; 
      [_newVeh,_destroyed] call MGI_fnc_setVehicleLoadout; 
      if (_respawnName == "grid") then { 
        _respawnName = format [localize "str_a3_bis_fnc_respawnmenuposition_grid",mapgridposition (position _newVeh)]; 
      } else { _curr = 1}; 
      sleep 0.1; 
      if (["UAV",typeOf _newVeh] call bis_fnc_inString or ["UGV",typeOf _newVeh] call bis_fnc_inString) then { 
          createVehicleCrew _newVeh; 
          if (["UAV",typeOf _newVeh] call bis_fnc_inString) then { 
            _newVeh setVelocityModelSpace [0,_oldSpeed/3.6,0]; 
          }; 
      }; 
      if (count _fullOldCrew > 0) then { 
        _grps = []; 
        { 
          _unit = _x select 0; 
          _grp = _unit getVariable ["oldGrp",createGroup civilian]; 
          _grps pushBackUnique _grp; 
          if (!alive _unit or !isTouchingGround _newVeh) then { 
            (typeOf _unit) createUnit [getpos _newVeh, _grp, "this allowDamage false; switch toLower (_x select 1) do { 
              case 'driver': {this moveInDriver _newVeh}; 
              case 'commander': {this moveInCommander _newVeh}; 
              case 'gunner': {this moveInGunner _newVeh}; 
              case 'cargo': {this moveInCargo [_newVeh,(_x select 2)]}; 
              case 'turret': {this moveInturret  [_newVeh,(_x select 3)]}; 
              }; 
              this allowDamage true; 
              if (vehicle _newVeh isKindOf 'plane') then {_newVeh setVelocityModelSpace [0,_oldSpeed/3.6,0]}"]; 
            } else { 
              _unit allowDamage false; 
              switch toLower (_x select 1) do { 
                case 'driver': {_unit moveInDriver _newVeh}; 
                case 'commander': {_unit moveInCommander _newVeh}; 
                case 'gunner': {_unit moveInGunner _newVeh}; 
                case 'cargo': {_unit moveInCargo [_newVeh,(_x select 2)]}; 
                case 'turret': {_unit moveInturret  [_newVeh,(_x select 3)]}; 
              }; 
              _unit allowDamage true; 
            }; 
        } forEach _fullOldCrew; 
        { 
          _grp = _x; 
          if (count waypoints _grp >1 && (effectiveCommander _newVeh in units _grp)) then { 
            _grp selectLeader (effectiveCommander _newVeh); 
            [_grp,_curr] spawn { 
              params ["_grp","_curr"]; 
              waituntil {sleep 1; unitReady leader _grp}; 
              _grp setCurrentWaypoint [_grp,_curr]; 
              leader _grp doMove (waypointPosition [_grp,_curr]); 
            }; 
          }; 
        } forEach _grps; 
      } else { 
        _sideNbr = getNumber (configfile >> "CfgVehicles" >> typeOf _newVeh >> "side"); 
        _side = [EAST,WEST,INDEPENDENT,CIVILIAN,sideUnknown,sideEnemy,sideFriendly] select _sideNbr; 
      }; 
      ["RespawnVehicle",[_displayName,_respawnName,_picture]] remoteExec ["BIS_fnc_showNotification",_side]; 
 
      {deleteVehicle _x} forEach (_oldCrew select {!alive _x}); 
       sleep 0.1; 
      _destroyed setVariable ["MGIrespVehDATA",nil]; 
      _destroyed setVariable ["MGIrespVehOK",nil]; 
      deleteVehicle _destroyed; 
    }; 
  }; 
}]; 
 
0 = [Veh1,"death",10,true,false] spawn MGI_fnc_vehicleRespawn; 

 

Share this post


Link to post
Share on other sites

Yes. veh1 will work if it's a vehicle.

For custom loadout, I had to call an event handler (EH handleDamage) , just to update loadout when the vehicle is hit, (then killed). Unfortunately, the EH entityKilled doesn't work for that, because there is no way to "catch" the loadout at death. (If you have a solution, I'm interested. The workaround is a loop updating the loadout for concerned vehicle... CPU expensive.).

The result is that the script works on normal play . A vehicle is fired by units, then hit/damaged and can explode almost instantaneously. The EH handleDamage catch the loadout and a vehicle is created with this exact loadout.

BUT, if you test the code with veh1 setDamage 1, this EH is not triggered. The vehicle explodes at once, without damage parts, so the respawn will work (EH entityKilled works) but not the loadout (EH handleDamage fails).

Share this post


Link to post
Share on other sites

Hello Pierremgi. I apologize right now, but I'm a real noob with the scripts and I can not figure out how to position yours inside my mission. My interest is to regenerate the vehicles with the inventory that I assigned to them during the preparation of the mission. Could you help me? thank you

Share this post


Link to post
Share on other sites

Simplest way:

Add a trigger (no matter the area and position), server only, none /none (preset-condition, let as is),

in condition field: true    (instead of this)

 

in on act field: the whole script. I mean the second one of the front paged first thread ( = 3rd spoiler).

replace the last line:

0 = [[crate2,WEST,karl,CIVILIAN],["death","start","start","start"],10,true,false] spawn MGI_fnc_VehicleRespawn; // example

by:

0 = [<yourArrayOfVehiclesHere>,"start",10,true,true] spawn MGI_fnc_VehicleRespawn;

 

where <yourArrayOfVehiclesHere> can be any array of vehicles you want. If [ ] and last param is true, you'll respawn all empty vehicles. See the first spoiler for more details.

 

Share this post


Link to post
Share on other sites
10 hours ago, pierremgi said:

Simplest way:

Add a trigger (no matter the area and position), server only, none /none (preset-condition, let as is),

in condition field: true    (instead of this)

 

in on act field: the whole script. I mean the second one of the front paged first thread ( = 3rd spoiler).

replace the last line:

0 = [[crate2,WEST,karl,CIVILIAN],["death","start","start","start"],10,true,false] spawn MGI_fnc_VehicleRespawn; // example

by:

0 = [<yourArrayOfVehiclesHere>,"start",10,true,true] spawn MGI_fnc_VehicleRespawn;

 

where <yourArrayOfVehiclesHere> can be any array of vehicles you want. If [ ] and last param is true, you'll respawn all empty vehicles. See the first spoiler for more details.

 

Hello pierremgi. Thank you so much for your quick response. I tried to insert as above, but the exploded vehicle does not regenerate. I enclose the screen of the work done by me. Thanks again.

https://imgur.com/a/c7L5JXe

Share this post


Link to post
Share on other sites

It seems you forgot to set the condition of the trigger to true            (instead of this)

 

If you let this for a none,none trigger, nothing appens

if you set to true (just write true), the code will always run at mission start. (almost same as if you placed it in init.sqf)

Share this post


Link to post
Share on other sites

New version (2nd script):

- modified the code for better performance (i hope so);

- corrected a little bug for native virtual arsenal for clients (now reproducible with the exact 3den virtual equipment storage);

- added possibility to "respawn"  the code written in the init field of a vehicle (need to wrap it with specific variable. See front page).

 

To do list: add parameters to choose what is necessary to keep on respawn and avoid temporary desync.

  • Like 2

Share this post


Link to post
Share on other sites

Hello guys

 

I am totally lay with programming and I need help to do an aerial combat training mission for me and my friends to play

 

I'm not able to make the script work. I do not know what I'm doing wrong. I destroy the AI vehicle and it does not spawn again

 

I just need to follow the steps in the video and create two .sqf files (MGI_fnc_getVehicleLoadout and MGI_setVehicleLoadout) in the root folder, right?

 

Do you have any mission as an example for me to look at?

 

I would like to spawn AI vehicles that are the enemy of everyone, including AI previously spawned

 

thank you

Share this post


Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

×