zealot111 13 Posted January 8, 2014 (edited) Hi, I am proud to present new civilian vehicles script. It automatically spawns(when players are near the city or town) and despawn civilian vehicles in cities around all Altis (will work with other islands as well). Vehicles just stand empty near houses in the cities and towns. Useful when you want to give your players additional backup vehicles. Script tested in MP with ~50 users. Installation: Copy to your unpacked mission folder Include in init.sqf next string: [] execvm "zlt_civveh.sqf"; zlt_civveh.sqf: // v1d Civilian Vehicles from [sTELS]Zealot if (not isserver) exitwith {}; zlt_civveh_round = 0; zlt_civveh_vehicles = []; zlt_civveh_spawnedloc = []; zlt_rnd_seed = 3; zlt_fnc_random = { private ["_a","_c","_m"]; _a = 75; _c = 0; _m = 65537; zlt_rnd_seed = ( zlt_rnd_seed * _a + _c ) mod (_m); (zlt_rnd_seed / _m) ; }; zlt_fnc_selectrandom = { _this select floor ( ([] call zlt_fnc_random) * count (_this)); }; zlt_fnc_civvehs = { _debug = [_this, 1, false] call bis_fnc_param; _lrange = _this select 2; _cars = _this select 3; _t1 = diag_ticktime; _startpos= _this select 0; _houses = _startpos nearobjects ["House",_lrange]; //_vehmax = _cars; _vehmax = (round ((sqrt (count _houses)) * 0.5)) max 1; _classes = ["C_Offroad_01_F"]; _vehs = 0; _attemps = 0; _class = _classes select 0; zlt_rnd_seed = ((_startpos select 0) + (_startpos select 1) mod 65537); while {_vehs < _vehmax and _attemps < 10} do { //diag_log ["CV",_startpos, _lrange, _houses]; _house = _houses call zlt_fnc_selectrandom; _housepos = _house modeltoworld [0,0,0]; _newpos = _housepos findEmptyPosition [ 3 , 15, _class ]; _houses = _houses - [_house]; if (count _newpos == 0) then { _attemps = _attemps + 1; } else { _veh = _class createVehicle (_newpos ) ; _veh setvariable ["zlt_civveh", true]; zlt_civveh_vehicles set [count zlt_civveh_vehicles, _veh]; _direction = (random 360); _nearRoads = _newpos nearRoads 10; if(count _nearRoads > 0) then { _road = _nearRoads select 0; _roadConnectedTo = roadsConnectedTo _road; if (count _roadConnectedTo > 0) then { _connectedRoad = _roadConnectedTo select 0; _direction = [_road, _connectedRoad] call BIS_fnc_DirTo; }; }; _veh setdir _direction; _attemps = 0; _vehs = _vehs + 1; if (_debug) then { ["crt"+str(_newpos), _newpos] call zlt_fnc_createmarkerlocal; }; }; }; _t2 = diag_ticktime; if (_debug) then { diag_log str ["civeh.sqf", _t2-_t1]; }; }; zlt_civ_checkloop = { zlt_civveh_notemptyloc = []; { _veh = vehicle _x; _isInVeh = (vehicle _x != _x); // or _veh getvariable ["zlt_civ_round", -1] != zlt_civveh_round if (!_isInVeh || {_veh isKindOf "LandVehicle"}) then { _dist = 1000; _locations = nearestLocations [(getpos vehicle _x), ["NameCityCapital","NameCity","NameVillage"], _dist]; _locations2 = nearestLocations [(getpos vehicle _x), ["NameCityCapital","NameCity","NameVillage"], 2500]; { if ( not (_x in zlt_civveh_spawnedloc) ) then { _lrange = 50; _cars = 1; switch (type _x) do { case ("NameCityCapital") : {_lrange = 250; _cars = 7;}; case ("NameCity") : {_lrange = 150; _cars = 3;}; }; _pos = position _x; [ [_pos select 0, _pos select 1, 0], false, _lrange, _cars] call zlt_fnc_civvehs; zlt_civveh_spawnedloc pushBack _x; // _x setside east; }; } foreach _locations; { zlt_civveh_notemptyloc pushBack _x; } foreach _locations2; if (_isInVeh) then { _veh setvariable ["zlt_civ_round", zlt_civveh_round];}; }; } foreach (if (player in playableunits) then {playableunits} else {[player]}); { _pos = [(position _x) select 0, (position _x) select 1, 0]; _ent = ( (_pos) nearEntities ["C_Offroad_01_F", 300] ); { if ( _x getvariable ["zlt_civveh", false] and {count crew _x == 0 and fuel _x == 1}) then { deletevehicle _x; }; } foreach _ent; zlt_civveh_spawnedloc = zlt_civveh_spawnedloc - [_x]; } foreach (zlt_civveh_spawnedloc-zlt_civveh_notemptyloc); zlt_civveh_round = zlt_civveh_round + 1; }; while {true} do { //scan loop sleep 3.4; //magic number [] call zlt_civ_checkloop; }; Edited March 4, 2015 by zealot111 Share this post Link to post Share on other sites
Guest Posted January 8, 2014 Release frontpaged on the Armaholic homepage. Civilian Vehicles v1c ================================================ We have also "connected" these pages to your account on Armaholic. This means in the future you will be able to maintain these pages yourself if you wish to do so. Once this new feature is ready we will contact you about it and explain how things work and what options you have. When you have any questions already feel free to PM or email me! Share this post Link to post Share on other sites
meatball 25 Posted January 8, 2014 This looks awesome! I'll definitely give it a shot, but have you looked at the load it puts on the server? As in, is this better than just randomly placing a bunch of empty vehicles yourself in the editor? Share this post Link to post Share on other sites
dark_spectre 2 Posted January 8, 2014 (edited) Thanks! you rock, and simultaneously just complicated my life : D Edited January 8, 2014 by Dark_Spectre Share this post Link to post Share on other sites
SavageCDN 231 Posted January 8, 2014 Thanks for this .. .do the civs spawn on clients or server? Share this post Link to post Share on other sites
meatball 25 Posted January 8, 2014 (edited) Appears to be the server. First line of the script exits if the script is run on anything other than the server. ---------- Post added at 19:33 ---------- Previous post was at 18:49 ---------- Did a quick test and looks good so far, but a couple of comments/questions. 1) Looks like it only spawns pickup trucks. Think it's just a matter of adding other civilian options to the _classes array and then selecting one at random from that. Something like: _classes = ["C_Offroad_01_F","C_Quadbike_01_F","C_Hatchback_01_F","C_Hatchback_01_sport_F","C_SUV_01_F","C_Van_01_transport_F","C_Van_01_box_F","C_Van_01_fuel_F"]; ... _class = (_classes call BIS_fnc_selectRandom); 2) Be nice to be able to feed the script parameters for the range that spawn/despawn occurs. 3) Do you 'reset' the variables on these vehicles so if players take them, they don't get cleaned up by despawn? Edited January 8, 2014 by Meatball Share this post Link to post Share on other sites
oktyabr 12 Posted January 8, 2014 2) Be nice to be able to feed the script parameters for the range that spawn/despawn occurs. 3) Do you 'reset' the variables on these vehicles so if players take them, they don't get cleaned up by despawn? Excellent question, #3! I've been using TPW's excellent "park" script for this in single player missions but he doesn't really optimize anything for MP/DED use so this will be a nice addition! One thing I do like about his park script though is that vehicles spawn with a random amount of fuel in them. I haven't been able to test this new script yet to see if it's similar or? Share this post Link to post Share on other sites
meatball 25 Posted January 8, 2014 Changing this script to have random fuel should be extremely easy (and a great idea!). Where Zealot creates the vehicle on line 55, just add this after that line. _veh setFuel (random 1); Should set the fuel to random percent between 0 and 1, 0 being empty, 1 being full. Share this post Link to post Share on other sites
zealot111 13 Posted January 8, 2014 Changing this script to have random fuel should be extremely easy (and a great idea!). Where Zealot creates the vehicle on line 55, just add this after that line. _veh setFuel (random 1); Should set the fuel to random percent between 0 and 1, 0 being empty, 1 being full. Right now it is not very good idea, because fuel value now used by script to determine whether vehicle were used by players or not. ---------- Post added at 21:21 ---------- Previous post was at 21:09 ---------- Appears to be the server. First line of the script exits if the script is run on anything other than the server.---------- Post added at 19:33 ---------- Previous post was at 18:49 ---------- Did a quick test and looks good so far, but a couple of comments/questions. 1) Looks like it only spawns pickup trucks. Think it's just a matter of adding other civilian options to the _classes array and then selecting one at random from that. Something like: _classes = ["C_Offroad_01_F","C_Quadbike_01_F","C_Hatchback_01_F","C_Hatchback_01_sport_F","C_SUV_01_F","C_Van_01_transport_F","C_Van_01_box_F","C_Van_01_fuel_F"]; ... _class = (_classes call BIS_fnc_selectRandom); 2) Be nice to be able to feed the script parameters for the range that spawn/despawn occurs. 3) Do you 'reset' the variables on these vehicles so if players take them, they don't get cleaned up by despawn? 1) and 2) will update in the next version. 3) Script checks fuel state of the vehicles to determine if they were touched by player. If fuel value is not 1, then vehicle was touched and will not be cleaned on despawn. Share this post Link to post Share on other sites
meatball 25 Posted January 8, 2014 Ah... I see. That's actually a pretty smart way to see if the players have it :) Share this post Link to post Share on other sites
zealot111 13 Posted January 8, 2014 This looks awesome! I'll definitely give it a shot, but have you looked at the load it puts on the server? As in, is this better than just randomly placing a bunch of empty vehicles yourself in the editor? Script itself doesnt demand much from the server. Sure, if your players scatters on the Altis trying to visit as many cities as possible it could create many vehicles (usually 4-5, 8-9 in the big cities) which can cause syncronization lags, but I tested this script in MP games with 50 players and there were no problems with it. Share this post Link to post Share on other sites
whiztler 137 Posted January 8, 2014 3) Script checks fuel state of the vehicles to determine if they were touched by player. If fuel value is not 1, then vehicle was touched and will not be cleaned on despawn. WHat an excellent idea. Great thinking out of the box mate. One suggestion, perhaps an option to lock/unlock the vehicles Great script! Share this post Link to post Share on other sites
meatball 25 Posted January 9, 2014 Another thought too. Maybe once one of the vehicles is 'taken' by the players (fuel goes below 1), just wipe out any of the variables related to the script on the vehicle. No reason to have your cleanup constantly pulling those vehicles back through it's loop when normal cleanup scripts can grab it. Share this post Link to post Share on other sites
synnr 3 Posted February 8, 2014 Is it me? I see a call to the function zlt_fnc_createmarkerlocal but I do not see the function in the script. I can't get this working. Share this post Link to post Share on other sites
zyg0tic 12 Posted February 26, 2015 I'm trying to get this to work, or something similar anyway. I just want some vehicles to spawn randomly around the map without me having to set the markers for where they spawn. Followed the OP's instructions but no vehicles spawn. Tested in Kavala. Share this post Link to post Share on other sites
zealot111 13 Posted February 27, 2015 I'm trying to get this to work, or something similar anyway. I just want some vehicles to spawn randomly around the map without me having to set the markers for where they spawn.Followed the OP's instructions but no vehicles spawn. Tested in Kavala. Try this script variant // v1d Civilian Vehicles from [sTELS]Zealot if (not isserver) exitwith {}; zlt_civveh_round = 0; zlt_civveh_vehicles = []; zlt_civveh_spawnedloc = []; zlt_rnd_seed = 3; zlt_fnc_random = { private ["_a","_c","_m"]; _a = 75; _c = 0; _m = 65537; zlt_rnd_seed = ( zlt_rnd_seed * _a + _c ) mod (_m); (zlt_rnd_seed / _m) ; }; zlt_fnc_selectrandom = { _this select floor ( ([] call zlt_fnc_random) * count (_this)); }; zlt_fnc_civvehs = { _debug = [_this, 1, false] call bis_fnc_param; _lrange = _this select 2; _cars = _this select 3; _t1 = diag_ticktime; _startpos= _this select 0; _houses = _startpos nearobjects ["House",_lrange]; //_vehmax = _cars; _vehmax = (round ((sqrt (count _houses)) * 0.5)) max 1; _classes = ["C_Offroad_01_F"]; _vehs = 0; _attemps = 0; _class = _classes select 0; zlt_rnd_seed = ((_startpos select 0) + (_startpos select 1) mod 65537); while {_vehs < _vehmax and _attemps < 10} do { //diag_log ["CV",_startpos, _lrange, _houses]; _house = _houses call zlt_fnc_selectrandom; _housepos = _house modeltoworld [0,0,0]; _newpos = _housepos findEmptyPosition [ 3 , 15, _class ]; _houses = _houses - [_house]; if (count _newpos == 0) then { _attemps = _attemps + 1; } else { _veh = _class createVehicle (_newpos ) ; _veh setvariable ["zlt_civveh", true]; zlt_civveh_vehicles set [count zlt_civveh_vehicles, _veh]; _direction = (random 360); _nearRoads = _newpos nearRoads 10; if(count _nearRoads > 0) then { _road = _nearRoads select 0; _roadConnectedTo = roadsConnectedTo _road; if (count _roadConnectedTo > 0) then { _connectedRoad = _roadConnectedTo select 0; _direction = [_road, _connectedRoad] call BIS_fnc_DirTo; }; }; _veh setdir _direction; _attemps = 0; _vehs = _vehs + 1; if (_debug) then { ["crt"+str(_newpos), _newpos] call zlt_fnc_createmarkerlocal; }; }; }; _t2 = diag_ticktime; if (_debug) then { diag_log str ["civeh.sqf", _t2-_t1]; }; }; zlt_civ_checkloop = { zlt_civveh_notemptyloc = []; { _veh = vehicle _x; _isInVeh = (vehicle _x != _x); // or _veh getvariable ["zlt_civ_round", -1] != zlt_civveh_round if (!_isInVeh || {_veh isKindOf "LandVehicle"}) then { _dist = 1000; _locations = nearestLocations [(getpos vehicle _x), ["NameCityCapital","NameCity","NameVillage"], _dist]; _locations2 = nearestLocations [(getpos vehicle _x), ["NameCityCapital","NameCity","NameVillage"], 2500]; { if ( not (_x in zlt_civveh_spawnedloc) ) then { _lrange = 50; _cars = 1; switch (type _x) do { case ("NameCityCapital") : {_lrange = 250; _cars = 7;}; case ("NameCity") : {_lrange = 150; _cars = 3;}; }; _pos = position _x; [ [_pos select 0, _pos select 1, 0], false, _lrange, _cars] call zlt_fnc_civvehs; zlt_civveh_spawnedloc pushBack _x; // _x setside east; }; } foreach _locations; { zlt_civveh_notemptyloc pushBack _x; } foreach _locations2; if (_isInVeh) then { _veh setvariable ["zlt_civ_round", zlt_civveh_round];}; }; } foreach (if (player in playableunits) then {playableunits} else {[player]}); { _pos = [(position _x) select 0, (position _x) select 1, 0]; _ent = ( (_pos) nearEntities ["C_Offroad_01_F", 300] ); { if ( _x getvariable ["zlt_civveh", false] and {count crew _x == 0 and fuel _x == 1}) then { deletevehicle _x; }; } foreach _ent; zlt_civveh_spawnedloc = zlt_civveh_spawnedloc - [_x]; } foreach (zlt_civveh_spawnedloc-zlt_civveh_notemptyloc); zlt_civveh_round = zlt_civveh_round + 1; }; while {true} do { //scan loop sleep 3.4; //magic number [] call zlt_civ_checkloop; }; Share this post Link to post Share on other sites
Vectif 380 Posted October 17, 2015 How do you add different vehicles? All it spawns for me is the Offroad, I've modified the classes and all but it doesn't seem to work. Share this post Link to post Share on other sites
barbolani 198 Posted October 19, 2015 hi zealot! Just a suggestion you may see working in Antistasi. I use more or less the same method to spawn the vehicles, but I create them slightly (1-2 meters) on one side of the road, so they visually seem parked. 1/20 times they may explode because the road hasn't room enough and you spawn them in a house... but I think it worth the risk. Share this post Link to post Share on other sites
XOSPECTRE 40 Posted July 3, 2019 Not working at all nothing spawns Share this post Link to post Share on other sites