marki980908 23 Posted January 9, 2021 I would like to do this array objArr = ["_object0","_object1","_object2"]; {_X enableSimulation false;} forEach objArr; at the end of a code which is used to spawn shit load of objects. Is there a way to make this array go from _object0 to _object99 for example, without typing out every single one of them? if not, is there any other way to solve this issue? Situation: I have an sqf code from Zeus Enhanced to spawn shit load of objects, I want to add a code at the end of it to make them all have disabled simulations. Share this post Link to post Share on other sites
UnDeaD. 81 Posted January 10, 2021 Hi, this solution worked for me: objArr = ((allMissionObjects "All") select {(vehicleVarName _x) find "_object" == 0}); {_x enableSimulation false} forEach objArr; What this does: Checks for every object that has _object in the begining of it's variable name. If you want to check objects that have _object not only at the begining but in the middle for example, then just change == to >= Also make sure the objects have distinguishable name, so the script won't run on unwanted objects. Hope could help 😉 1 Share this post Link to post Share on other sites
ZaellixA 383 Posted January 10, 2021 Hey there, you already have a nice working solution. I would like to suggest another one where you actually "synthesise" the array yourself as a string and then you make it an actual array. This could look like // Initialise array private _objArr = "_objArr = ["; // Create an array as a string (go from 0 to 99) for[{private _i = 0}, {_i < 100}, {_i = _i + 1}] do { // Append the "objectX" string, // where X is equal to the current value of _i _objArr = objArr + ("object" + (str _i)); // Add a comma if(_i < 99) then { _objArr = _objArr + ", "; }; }; // Add the closing bracket and the assignment to a variable _objArr = _objArr + "];"; // Now you can compile and call that to be an array call (compile _objArr); // Next step, disable simulation to all those objects _objArr apply {_x enableSimulation false;}; The same limitation with the object variable names applies here too. You have to make sure they are uniquely named and that their names match those of the array of course. Although the above code snippet may seem like an overburden in many ways (coding and extra work which can be done with fewer and possibly faster commands), it does provide a quite nice way to create objects "on the fly". You could use the array to create the objects via script commands (in the same way you use enableSimulation command). One more minor detail about the code above is that I used apply instead of forEach, which according to BIKI it is a wee bit faster (I don't believe you will notice some serious improvement though). Finally, please note that I have used similar code in the past but this specific snippet is not tested, so treat with caution. I do hope that this may help somehow. 2 Share this post Link to post Share on other sites
marki980908 23 Posted January 11, 2021 I got a generic expression error, let me showcase the situation _object0 = createVehicle ["B_Heli_Transport_03_unarmed_F", [0, 0, 0], [], 0, "CAN_COLLIDE"]; _object0 setVectorDirAndUp [[0.000118554,0.999834,0.0181859],[-1.05015e-005,-0.0181859,0.999834]]; _object0 setPosASL [6223.83,6934.69,45.3438]; [_object0, ["Black",1], [], true] call BIS_fnc_initVehicle; {_object0 removeMagazineTurret (_x select [0, 2])} forEach magazinesAllTurrets _object0; {_object0 addMagazineTurret _x} forEach [["168Rnd_CMFlare_Chaff_Magazine",[-1],168]]; _object1 = createVehicle ["B_Heli_Transport_03_unarmed_F", [0, 0, 0], [], 0, "CAN_COLLIDE"]; _object1 setVectorDirAndUp [[-0.000188412,0.999817,0.0191205],[1.06743e-005,-0.0191205,0.999817]]; _object1 setPosASL [6203.69,6936.69,45.3438]; [_object1, ["Black",1], [], true] call BIS_fnc_initVehicle; {_object1 removeMagazineTurret (_x select [0, 2])} forEach magazinesAllTurrets _object1; {_object1 addMagazineTurret _x} forEach [["168Rnd_CMFlare_Chaff_Magazine",[-1],168]]; This is the code created by a mod called "Zeus Enhanced". This code saved 2 helicopters ~10 meters above the ground. When I will spawn them in, I need them to have their simulations disabled. As you can see, the mod names all the objects _object# in increasing numerical order. For this example I could place 2 codes which would disable sims behind each object in this situation, but however if I will save huge number of objects, that thing, wont be practical anymore. For some reason even manual solution like: _object0 = createVehicle ["B_Heli_Light_01_F", [0, 0, 0], [], 0, "CAN_COLLIDE"]; _object0 setVectorDirAndUp [[-1.54855e-005,0.999999,0.00154038],[-1.99978e-007,-0.00154038,0.999999]]; _object0 setPosASL [6197.96,6936.02,51.7186]; [_object0, [], ["AddTread",1,"AddTread_Short",0], true] call BIS_fnc_initVehicle; {_object0 removeMagazineTurret (_x select [0, 2])} forEach magazinesAllTurrets _object0; {_object0 addMagazineTurret _x} forEach []; _object1 = createVehicle ["B_Heli_Light_01_F", [0, 0, 0], [], 0, "CAN_COLLIDE"]; _object1 setVectorDirAndUp [[-1.5478e-005,0.999999,0.00154037],[-2.4903e-007,-0.00154037,0.999999]]; _object1 setPosASL [6223.71,6933.9,51.7186]; [_object1, [], ["AddTread",1,"AddTread_Short",0], true] call BIS_fnc_initVehicle; {_object1 removeMagazineTurret (_x select [0, 2])} forEach magazinesAllTurrets _object1; {_object1 addMagazineTurret _x} forEach []; _objArr = ["_object0","_object1"]; {_X enableSimulation false;} forEach _objArr; For some reason doesnt work, I am getting generic error even with this Share this post Link to post Share on other sites
gc8 970 Posted January 11, 2021 You can loop through the _objectX variables like this: for "_i" from 0 to 10000 do { _varname = format["_object%1",_i]; if(isnil _varname) exitwith {}; _var = call compile _varname; _var enableSimulation false; }; 3 Share this post Link to post Share on other sites
marki980908 23 Posted January 12, 2021 On 1/11/2021 at 3:12 PM, gc8 said: You can loop through the _objectX variables like this: for "_i" from 0 to 10000 do { _varname = format["_object%1",_i]; if(isnil _varname) exitwith {}; _var = call compile _varname; _var enableSimulation false; }; It worked, I love you Share this post Link to post Share on other sites
ZaellixA 383 Posted January 12, 2021 On 1/11/2021 at 2:56 PM, marki980908 said: I got a generic expression error, let me showcase the situation _object0 = createVehicle ["B_Heli_Transport_03_unarmed_F", [0, 0, 0], [], 0, "CAN_COLLIDE"]; _object0 setVectorDirAndUp [[0.000118554,0.999834,0.0181859],[-1.05015e-005,-0.0181859,0.999834]]; _object0 setPosASL [6223.83,6934.69,45.3438]; [_object0, ["Black",1], [], true] call BIS_fnc_initVehicle; {_object0 removeMagazineTurret (_x select [0, 2])} forEach magazinesAllTurrets _object0; {_object0 addMagazineTurret _x} forEach [["168Rnd_CMFlare_Chaff_Magazine",[-1],168]]; _object1 = createVehicle ["B_Heli_Transport_03_unarmed_F", [0, 0, 0], [], 0, "CAN_COLLIDE"]; _object1 setVectorDirAndUp [[-0.000188412,0.999817,0.0191205],[1.06743e-005,-0.0191205,0.999817]]; _object1 setPosASL [6203.69,6936.69,45.3438]; [_object1, ["Black",1], [], true] call BIS_fnc_initVehicle; {_object1 removeMagazineTurret (_x select [0, 2])} forEach magazinesAllTurrets _object1; {_object1 addMagazineTurret _x} forEach [["168Rnd_CMFlare_Chaff_Magazine",[-1],168]]; This is the code created by a mod called "Zeus Enhanced". This code saved 2 helicopters ~10 meters above the ground. When I will spawn them in, I need them to have their simulations disabled. As you can see, the mod names all the objects _object# in increasing numerical order. For this example I could place 2 codes which would disable sims behind each object in this situation, but however if I will save huge number of objects, that thing, wont be practical anymore. For some reason even manual solution like: _object0 = createVehicle ["B_Heli_Light_01_F", [0, 0, 0], [], 0, "CAN_COLLIDE"]; _object0 setVectorDirAndUp [[-1.54855e-005,0.999999,0.00154038],[-1.99978e-007,-0.00154038,0.999999]]; _object0 setPosASL [6197.96,6936.02,51.7186]; [_object0, [], ["AddTread",1,"AddTread_Short",0], true] call BIS_fnc_initVehicle; {_object0 removeMagazineTurret (_x select [0, 2])} forEach magazinesAllTurrets _object0; {_object0 addMagazineTurret _x} forEach []; _object1 = createVehicle ["B_Heli_Light_01_F", [0, 0, 0], [], 0, "CAN_COLLIDE"]; _object1 setVectorDirAndUp [[-1.5478e-005,0.999999,0.00154037],[-2.4903e-007,-0.00154037,0.999999]]; _object1 setPosASL [6223.71,6933.9,51.7186]; [_object1, [], ["AddTread",1,"AddTread_Short",0], true] call BIS_fnc_initVehicle; {_object1 removeMagazineTurret (_x select [0, 2])} forEach magazinesAllTurrets _object1; {_object1 addMagazineTurret _x} forEach []; _objArr = ["_object0","_object1"]; {_X enableSimulation false;} forEach _objArr; For some reason doesnt work, I am getting generic error even with this Not sure this was the problem but you used a capital "x" instead of a small one. Since .sqf is case sensitive _X is different than _x, where the latter is the magic variable that corresponds to each object and (most probably) _X is undefined. Nevertheless, gc8 have you a nice solution to your problem. Alternatively, you could create the array in the way I showed you above and compile once in the end (instead of compiling the variable in each iteration) and use either a forEach to go through it, or apply to disable the simulation to all elements. Not sure which approach is faster since in gc8's solution you have to compile each time but in the one I suggest here you will have to go through the array twice (one time to create it and one to disable simulation). Share this post Link to post Share on other sites
marki980908 23 Posted January 12, 2021 Thank you for your answer, I will look into it, sounds it could be less resource intensive 1 Share this post Link to post Share on other sites
pierremgi 4737 Posted January 12, 2021 Not sure to understand why you don't use the local variables if you can add a line in the same scope of all that stuff... _objArr = [_object0,_object1,_object2]; {_x enableSimulation false} forEach _objArr; To clarify, see also this post, if _object0,_object1... are defined in this scope, you don't need to stringify them for call compiling them in the same scope ... It's just a waste to code. On the other hand, if you are trying to call compile such "_object0" "_object1", inside a scope ignoring what _object0 _object1 are referring to (so, in an other parallel scope) , your Goldberg machine will fail. Share this post Link to post Share on other sites
Larrow 2794 Posted January 13, 2021 14 hours ago, ZaellixA said: Since .sqf is case sensitive Erm, no its not. 1 Share this post Link to post Share on other sites
beno_83au 1362 Posted January 13, 2021 Agreeing with what Pierre said. But also, why not just add the unit to an array as you spawn it: _objectArray = []; for "_i" from 1 to 2 do { _object = createVehicle ... //the rest of your code _objectArray pushBack _object; }; { _x enableSimulation false; } forEach _objectArray; OR, just disable the simulation when it spawns (probably much better if there's a lot to spawn): for "_i" from 1 to 2 do { _object = createVehicle ... //the rest of your code _object enableSimulation false; }; With the second method you can still add them to an array to manipulate them later, incase you want to re-enable their simulation. Just use pushBack or append (I'm not sure which is faster) as in the first example. And remember, enableSimulation takes an object, not a string, so trying to do "objectName" enableSimulation false is never going to work. 2 Share this post Link to post Share on other sites
ZaellixA 383 Posted January 13, 2021 9 hours ago, Larrow said: Erm, no its not. I guess you are right... I, myself have typed forEach (and many more) like foreach many times... Not sure why I had this feeling that .sqf is case sensitive... I strongly apologize for that... Thanks a lot. 1 Share this post Link to post Share on other sites