#arma3_scripting
1 messages ยท Page 276 of 1
my dll is probably crashing it out yet running successfully, which would be return related
Are you ending your function with an assignment operator?
yes, _null = "bla" callExtension "";
try returning nil or a boolean
the assignment operator is fucked in SQF
repro:
_a = {_b = 0};
same error
fix never
yeah its gone now
@little eagle Do you hate or love arma 3 SQF?
Serious question?
so preStart script expects a return?
preinit you mean?
in functions?
so preStart script expects a return?
No. It's just a bug
Do I LOVE or HATE sqf? Hmm.
wait, a general bug for the assignment operator or just in this instance?
general bug
Every SQF command in C++ ends with return GameValueNil or whatever else the command is supposed to return in SQF
but the assignment operator is handled differently. As "keyword" and it ends with void
that's all
fix takes one minute
ยฏ_(ใ)_/ยฏ
Maybe I forgot about that bug, but I have always returned from scripts like this: _ret;
Dictionary/associative arrays/key-value data structures are incredibly valuable to programming. The *pair functions in (configfile >> "CfgFunctions" >> "A3" >> "Arrays") should probably be surfaced as scripting commands to the benefit of the community. Thanks to the contributors/authors.
@little eagle I've become disillusioned with arma 3.
The sorts of experiences I just can't do.
I've tried a bunch of mission generators Patrol Ops 3
Insurgency
They also feel..
Unimmersive? Along with repeative and boring?
I never tried those. All I ever play is some bare-bone MP missions with a milsim group.
a bunch of markers and preplaced enemies
It's all you need
30 or more players?
Yeah our milsim has been backstabbed a few times.
People branching off etc.
And I'm the "main" mission dev.
And server manager.
urg
Did you know any other programming languages before SQF?
I had a one semester class programming for whatever reason where we used Java
I try to keep things simple and make lot's of reusable code in the common component. I also use pen and paper for complex things, but most of the time I just write stuff
then rewrite it
then rewrite it again
and then it's usually done
I like simplifying and rewriting stuff as well as finding work arounds. Stuff real programmers seem to hate apparently
So? me writing this piece of code?
params [
["_object",objNull],
["_variableName",""],
["_state",false],
["_isPublic",false]
];
missionNameSpace setVariable [format ["%1",_variableName],false,true];
diag_log format ["_object: %1",_object];
_HandlerID = _object addEventHandler ["killed",{
// diag_log "EH Fired";
missionNameSpace setVariable [format ["%1",_variableName],_state,_isPublic];
"Generalised EH fired" remoteExec ["hint",0,false];
}];
Is good?
Smaller is better?
You cannot pass variables like that inside the scope of event handlers
and there is no need to store _HandlerID as variable if you're not gonna use it
format ["%1",_variableName] is pointless if _variableName is always a string anyways. it does nothing. might as well leave out the format part
the comment is pretty pointless too as it just repeats what the code is instead of describing what it does or why it's used
the note sounds confusing
isGroupDeletedWhenEmptyWithALongName
So is this a fully mission maker controlled thing or does Arma engine use this on it's own
the if is kinda superfluous
both of them
well
{
_x deleteGroupWhenEmpty true;
} count allGroups;
I think the point of this is, that you can use it after createGroup
could've just expanded this to support groups:
https://community.bistudio.com/wiki/addToRemainsCollector
addToRemainsCollector _units;
removeFromRemainsCollector _units;
vs:
{_x deleteGroupWhenEmpty true; } forEach _groups;
{_x deleteGroupWhenEmpty false; } forEach _groups;
awkward
The difference between addTo/removeFromRemainsCollector and deleteGroupWhenEmpty shows a lack of planing ahead
Both of these things should've been handled the same way
I have no idea.
If it were a SQF / FSM thing, then the addTo would be just a glorified setVariable
arma scripting is fun eh
Not sure if I have asked this before, is there a way to draw rectangles on the map with premade functions? I saw some missions and some developer debug screenshots marking specific squared in red
I could ghetto it with markers and manual measure ments but i wonder if functsions exist for that
createMarker
crap
what's the problem?
there is CBA_fnc_createMarker, but honestly
it's worse than just doing it all by yourself
I was fishing in the bis fncs and saw some GRID functions, hoping that would be it
Hey guys, I have a script that spawn 3 different type of crates from a flagpole ("B_CargoNet_01_ammo_F";"CargoNet_01_barrels_F";"CargoNet_01_box_F")
I am trying to figure out how these can have an addaction on them making them able to repair/rearm/refuel separately
I tried to find a simple script that would repair,rearm or refuel (depending on the crate) the nearest vehicle
I am not very experienced at scripting and I couln't find ressources online.
Can I make all crates lets say "B_CargoNet_01_ammo_F" have an action to rearm a nearby vehicle
which I don't know how
I went on all of these links before coming here and couldnt figure out how to properly use them
I even went in the fnc of the editor and still no clue
what's the problem?
could you show me an example of how I would make all crates "B_CargoNet_01_ammo_F" have an addaction
oh my, another r2d2
The black one? I thought that one was cut in the reshoots
the wiki has 4 examples for addAction @vague harness
bet there are hundreds on google
D :
wake me up when they add entityCreated
hope it's both
entityDeleted for mission
and I hope it triggers before the thing is deleted, so you can getVariable and stuff on the object reference
Hey, what's an easy way to make a Buzzard grey with scripts?
is there a grey texture available for it?
if you dont care about texture you can use RGBA as argument
e.g. "#(rgb,8,8,3)color(1,0,0,1)"
Thanks, @indigo snow. I do care about texture, but not a whole bunch right now. Just need some color splashed on there.
quick question
How to check whether an array is empty?
is it nil or null?
by empty I mean [], not ["",""]
isEqua... yep
you add one really weird element with pushBack
and then check if that's the first one afterwards
Anyone know if there is a way to allow AI to use the support requester modules?
To get transport to their task? (ex. sector that is 5km away)?
Thanks that worked
Is it possible to freeze an ais AIM so it wont idle wave the gun around?
I tried dowatch and dotarget
put them in danger mode
group _unit setBehaviour "AWARE";
if aware doesn't work, try COMBAT
I got them to shoot and aim per command
but when aiming the weapon still sways around
even after doTarget?
yes, he roughly aims ait it but still is swaying several degrees
hello is someone there?
xD
hello sniper
@finite mica remove their ammo and put them in a firing state. Then add ammo back to fire?
if its just the natural weapon sway then maybe fiddle with this https://community.bistudio.com/wiki/setCustomAimCoef
and if its a cutscene you might consider soldier disableAI "ANIM" after it's aimed up
not a good practice in actual game cause the unit is frozen
Thanks for the advice but that did not work, I am now trying to vectormath the shit out of it to get it 100% on target
is there a command in arma to convert a vector to gradient?
I got the vectors all on paper but the setvectordir command is not doign what I want
ok this is messed up
when I target a pop up target, the aim is DEAD on
however if it is a human target the aim is always at least half a meter off
Something in here?
https://community.bistudio.com/wiki/Math_Commands
Actually found it in:
alternative syntax had what I was looking for
I am trying to hack around the ai to make it shoot at a location, instead of an object.
got the rotation working however is there a way to force a firing stance so the barrel is pointing at it?
I've done it before but can't remember. I'll take a look
does it need to be super precise? doSuppressiveFire might do your trick
or maybe spawn like an invisible chicken to shoot at
for [{_i=0}, {_i<_burst}, {_i=_i+1}] do {
_offender forceWeaponFire [currentWeapon _offender, currentWeaponMode _offender];
sleep 0.3;
};``` from one of my scripts
ofc target first
Hey @jade abyss Has anyone updated the scripts by catagory section again yet?
in the biwiki?
No clue
@digital pulsar thanks but thats exactly what I wrote on my own lol. Its a small world. For some reason it does not like to aim precisely at the target if it is a human
@GeekyGuy5401 it hasn't been updated in awhile I believe
๐ฆ
Having everything catagorized is nice not having to dig through all the script commands
in a wall of text @cerulean whale
Catagorization is nice particularly if you put array types with array types etc.
Everything is neatly ordered.
I mean I could do this myself with bookmarks..
Eh yeah I might do that.
I just take an estimated guess at the command and chuck it in Google with 'Arma 3 scripting commands' on the end. Works most of the time xD
I've got my bookmarks catagorized
Arrays with arrays
control-structures with control-structures
multiplayer with multiplayer
I like ordered manuals.
Ye. I had something like that but I couldn't be bothered maintaining it when I was learning c#
dammit
I have tried to have the AI shoot at a specific position. However I found no way to force its aim to adjust up
is there perhaps animation commands to force the aim direction?
wait a sec, perhaps I can spawn a dummy object on the exact point and ahve the ai target that
disable the auto-aiming FSM
myUnit disableAI "AUTOTARGET";
He should now obey
Should make a new AI caching script
that disables all AI when the AI are not active.
What is he not doing?
the weapon bore is directly looking at the target but the bullet goes straight into terrain
Considered getting ASR_AI's hithub?
I can paste you the code if you want to test it
Hahah
Sure.
Sorry I am laughing because if you go into Zeus
and watch an AI target a player or another AI
they have a lockon reticle like a missile
_pos = screenToWorld [getMousePosition select 0, getMousePosition select 1];
_pos_asl = ATLToASL _pos;
_dummytarget = createSimpleObject ["a3\misc_f\Helpers\Sign_sphere100cm_F.p3d", _pos_asl];
_pos = [_pos select 0, _pos select 1, (_pos select 2)+ 0];
_azimuth = thedude1 getDir _pos;
_distance = thedude1 distance _pos;
systemchat format ["%1 deg | %2 m | %3", _azimuth, _distance, _pos];
thedude1 setdir _azimuth;
thedude1 dowatch _dummytarget;
thedude1 lookat _dummytarget;
thedude1 forceWeaponFire [ weaponState thedude1 select 1, weaponState thedude1 select 2];```
this is a script I call with a keypress
waituntil {!isnull (finddisplay 312)};
(findDisplay 312) displayAddEventHandler ["KeyDown","_this select 1 call ACTION_KEY_FNC;false;"];
ACTION_KEY_FNC =
{
switch (_this) do
{
// T key (20)
case 20 :
{
[player] execVM "client\interface\keypress.sqf";
};
};
}; ```
where do I put that
```sqf (codehere) ```
sqf
ACTION_KEY_FNC =
{
switch (_this) do
{
// T key (20)
case 20 :
{
[player] execVM "client\interface\keypress.sqf";
};
};
}; sqf
ACTION_KEY_FNC =
{
switch (_this) do
{
// T key (20)
case 20 :
{
[player] execVM "client\interface\keypress.sqf";
};
};
}; ```
3 backticks following the letters sqf
ACTION_KEY_FNC =
{
switch (_this) do
{
// T key (20)
case 20 :
{
[player] execVM "client\interface\keypress.sqf";
};
};
}; ```
there we go
There you go.
thanks
so this script will order the dude to fire and look at the target, and the place will be marked with a sphere
I discovered that and went oh? So they do have a syntax highlighter
I tried adjusting the position on its Z but it had no effect
could make your life easier and unpack your vars using params
for me this script is an attempt to find otu how precisely I can command an AI with commands.
actually, should I send you the whole mission folder if you want to take al ook?
then you just start and press T
_pos = screenToWorld [getMousePosition select 0, getMousePosition select 1];
_pos_asl = ATLToASL _pos;
_dummytarget = createSimpleObject ["a3\misc_f\Helpers\Sign_sphere100cm_F.p3d", _pos_asl];
_pos = [_pos select 0, _pos select 1, (_pos select 2)+ 0];
_azimuth = thedude1 getDir _pos;
_distance = thedude1 distance _pos;
systemchat format ["%1 deg | %2 m | %3", _azimuth, _distance, _pos];
thedude1 setdir _azimuth;
thedude1 dowatch _dummytarget;
thedude1 lookat _dummytarget;
weaponState thedude1 = params ["_weaponName","_MuzzleName","_ModeName","_MagazineName"];
thedude1 forceWeaponFire [ _MuzzleName, _ModeName];
thanks that is very handy
@Python for that idea.
import sys argv
Unpacking variables into multiple assignment
If this aim thing wont work out I will look at forcing animations or something
with params
you can even do this
(getPos thing) params ["_xPosition","_yPosition","_zPosition];
@finite mica What is your exact goal?
to get the weapon to fire at a point on the map
Through terrain?
the problem is that teh ai ignores the Z it appears
the base position already is AGL, and the dummy sphere correctly spawns on that point
but when the shot is fired, the ai always aims dead horizontal, ignoring all z
even on very close targets it will always fire horizontally
lets have a looksee at ASR_AI and see how they do it.
actually I think I got suppressive fire to work
still got to hammer out the exact amount of shots but at least it gets the position right
yeah the AI will ignore horizontal with lookAt
I think you also need this @finite mica https://community.bistudio.com/wiki/doMove
Hmmm I will test
@finite mica Yep that confirms it
You need doMove
Is this AI following this target?
currently I only need it to fire at something, not move to it
ok so here is what is weird. dosuppressivefire can use a prceise position to shoot at somethign, however dofire needs an object and even then it fails to account for z
if the devs would add a dofire suppressive with only firing one shot, that would fix all my problems
I wonder @finite mica if this is related to the fact you are using simpleObject
because simpleObject removes all raycasting, etc data, and simulation data.
Yeah I should check that right away
that does not change it
tried with createvehicle
perhaps the object is at fault
Is it possible to find doSuppressiveFire in the functions viewer?
no since its a command
If only that command had the option to fire oen shot it would solve all my problems
Its the only command that allows to fire at a specific position.
I tried disabling ai after one shot, but when teh ai resumes it continutes. Is there away to flush what the ai wants to do?
And is there a place where I can make puppy eyes at the devs so they add a new command?
@finite mica I got your AI to track
TargetFunc = {
params ["_unit","_target"];
_unit doFire _target;
_unit commandFire _target;
_unitDir = _unit getDir _target;
_unit setDir _unitDir;
(weaponState _unit) params ["_weaponName","_MuzzleName","_ModeName","_MagazineName"];
_unit forceWeaponFire [_MuzzleName, _ModeName];
};
[MrAI,OpforTarget] call TargetFunc;
And syntax highlighting doesn't want to cooperate.
He must be facing to target
He also doesn't move.
๐
getDir from pos1 to pos 2
No more relative dir crap
Now builtin to getDir
does not work for me, perhaps I am fitting it into the stuff wrong
I think I like liberation in comparison to Insurgency
More stuff to do.
Codes much more efficient and uses cfgFunctions.hpp
along with being able to throttle the AI ALOT
I like domination but it's hard to change.
Never built a script like this before. Anyone have tips on finding a safe LZ about 200-300m outisde a point? On a random side?
selectBestPlaces might be your friend
oh that gradient check is nice
awesome, that findSafePos will work perfectly
@tough abyss Cloud also try
isFlatEmpty
The findSafePos is exactly everything I need. Thanks though for the help!
Interesting thing is findSafePos
is surprisingly simple ๐
the code of it.
heh
it already does it internally
if (!((count (_testPos isFlatEmpty [_objDist, 0, _maxGradient, _objDist max 5, _waterMode, _shoreMode, objNull])) == 0)) then {}
I was thinking. Is it possible to set a waypoint for a vehi vehicle without a driver?
waypoints are given to groups, not vehicles
There is any way to write a txt file without the need of a extension?
I did a no-ExtDB3 mode in my mission that store all database data in variables. When the server shut down the info is lost. But if i could write the data to a TXT file, i can store all that to use on next server start.
Have you thought about using the server's profileNamespace?
^ Fast and it's binarized
@native hemlock @tough abyss thanks. No. But its persistent to server restart?
๐
Can i store data for 320 vehicles (inventory, position angle, damage, fuel) and lots of players (position, complete gear, health, ext)?
Yes
OMG!
its just not "as" secure as a database
Ahh... its saved in each client?
Or can i save all at server profileNamespace?
Right now all the "table" vars are on the server.
OK, but the server profileNameSpace can hold all the data without problems?
Since i will keep zero data on clients profileNamespace
All data will be on server profileNamespace
If the mission became famous (๐ ) it can have 1000+ registered players.
One step at a time ๐
If you want it to be played by 1000's (and store all that data), perhaps you should spend the extra time using something other than PNS
Ah ok.
I mean you can but try
But I'm doubtful anyone here has tried storing that much in it
Stood to be corrected though
profileNameSpace will be acessed only two times: on server start and before server shut down.
This helps, right?
Of course yeah
Hey guys, if I want to get a bool as a param, what would the expected data type be?
So like [ "_properties", false, [ expectedDataType ] ];
@tough abyss thanks.
I guess I'll just use false?
bool
It will be like this [ "_properties", false, [ false ] ];
I know what BOOL is
I just didn't know what to put instead of bool in there, cause bool wouldnt work in a param, or not write bool anyways
But yeah, false worked
Yep
I actually wrote a script that used selectBestPlaces
Had the Viper-squads spawn in the trees @tough abyss
you cant write bool in there wont work
You can't write bool in there, but you can write !bool in there and it'll work!
true param [0, false, [!bool]]
-> true, no error
๐
It's all just a question of proper preparations.
bool = [not nil];
true param [0, false, bool]
works like a charm
@BoGuu#1044 using profileNameSpace now. Everything saves on the server profileNameSpace.
Since Apex all spaceObject particles start disappearing right away, is there any way to prevent this?
It also seems that only some of them start to disappear, rarely particles doesn't fade at all
I only know of a bug since APEX where particles disappear if their center is off screen instead of the whole particle
Since Apex? I thought it was like this all the time with particles
I heard it started to happen specifically after APEX
baermitumlaut did stuff with them
@meager granite i spent two hours trying all kinds of different particle parameters and commands. I couldn't stop the random disappearing either
I found that it doesn't always happen though when you use setparticleclass on certain base classes iirc.
Its also random with "drop" command
sometimes particles disappear, sometimes they dont
Also if you move camera far away and then back to particle it will appear back even though it faded (if it still has time to live)
Is there something different in the "lifetime" of the particles?
Or is it also a quality-setting-"issue"?
I think particles fade regardless of quality settings
time to live doesn't seem to affect fading at all, it still fades under will of RNJesus
How do I make and addaction only available for a vehicle commander?
you use the condition parameter: https://community.bistudio.com/wiki/addAction
"_this == effectiveCommander _target" if the addAction has been added to the vehicle
Thanks!
tried this
player addAction ["<t color='#FF0000'>Prepare for Airlift</t>","editmass.sqf",[1],0,false,true,""," driver _target == _this"];
and it dosent show up in the driver seat. Anyone?
you added it to the player, so both _this and _target are the player
and the player in mp is _unit right?
no
spawn BIS_fnc_MP
added it at the end btw
looks like this now
[[_unit,"<t shadow='1.5' color='#FF0000'>Prepare for Airlift</t>","call ask"]," driver _unit == _unit",nil,false]spawn BIS_fnc_MP;
correction
that wont work, _unit wont be defined in the scope created on other clients
wait what even is this syntax
does this makes sense
[[_unit,"<t shadow='1.5' color='#FF0000'>Prepare for Airlift</t>","call ask"],"driver _target == _this",nil,false]spawn BIS_fnc_MP;
not at all
rip
you'd not even use BIS_fnc_MP anymore
you'd use remoteExec
taking a step back what are you attempting to even do
BIS_fnc_MP is just wrapper for remoteExec
fair enough, but still
and these vehicles are pre placed?
Why not add it just to player and then check if you're on driver seat
thats what I wanted to do
Add action locally on client, have some variable in condition and have a thread which updates this variable depending on where you are
showMyAction = false;
player addAction ["Action", {systemChat "something"}, nil, 0, false, false, "", "showMyAction"];
0 spawn {
waitUntil {
showMyAction = (vehicle player != player && driver vehicle player == player);
sleep 1;
false;
};
};
in init.sqf or somewhere else where it executes once on client
@meager granite Thanks
so I would put the script that it executes in "showMyAction"
No, showMyAction is just flag which shows or hides the action
AH!
your code should be where {systemChat "something"} is
be it file name or script right there
"Action" will appear if you're in any vehicle on driver seat, executing it will show "something" in chat
Understand how it works and then change to your needs
Alright, I got it. Thanks a lot
(typed unit instead of player, got too much of my own scripts in my head)
Oh also if you're putting this into init.sqf you'll need to add
waitUntil {player == player};
before everything else
as player is not initialized and you need to wait for it, so you can add action
also action will disappear after respawn, you'll need to add it again
Ok, sorry but how would I do that?
CTRL+C CTRL+V ๐
@dusk sage Yep and after that I will know by myself
I have no scripting background at all either at school or work
so I am learning step by step
tried it stock and it dosen't work :/
tried it stock and it dosen't work :/
here's my init.sqf
waitUntil {player == player};
showMyAction = false;
player addAction ["Action", {systemChat "something"}, nil, 0, false, false, "", "showMyAction"];
0 spawn {
waitUntil {
showMyAction = (vehicle player != player && driver vehicle player == player);
sleep 1;
false;
};
};
enableSaving [false, false];
waitUntil {!isNil "CLib_fnc_loadModules"};
call CLib_fnc_loadModules;
@meager granite
yes
I just checked it and it works just fine
Hold on
Also I don't know how 3DEN editor works, maybe init.sqf is not executed each time you start the mission, no idea
Anyway as long as code is executed, it works
so could I make an sqf out of this and run it in the init?
Yes you can have this in init
Regarding AddAction:
showMyAction = false;
player addAction ["Action", {systemChat "something"}, nil, 0, false, false, "", "showMyAction"];
0 spawn {
waitUntil {
showMyAction = (vehicle player != player && driver vehicle player == player);
sleep 1;
false;
};
};```
iirc the check inside addAction is executed eachFrame.
So locating it to an outside script -> Better choice
Comes in handy, when you check for several things at once.
Well, I did exactly this, full condition is checked each 1 second
while addAction only checks boolean flag
@vague harness Change player to this and add this code into init field of player unit
You'll need to get rid of waitUntil {player == player} too
Yeah, just explained why its "outside"
Ah, alright
Because: I just remembered some Mass-AddAction adds, wich... idk how many checks inside it
@jade abyss @meager granite So am I correct if I do this 1. Removed the "waitUntil {player == player}" 2. added the whole addaction to all player units 3. changed "player" to "this" in the addaction
thin thats it
it gives me this message when I try to add it to playable units:
Init:Type Script, expected Nothing
- Why?
- erm, okay (" init.sqf " <- ?)
- Sa-Matra: You'll need to get rid of waitUntil {player == player} too
2 : Sa-Matra: Change player to this and add this code into init field of player unit
- Remove waitUntil {player == player} line
- Change player to this in addAction line
- Add code into init line of player unit
As for error, add
nil;
at the end of code
Stupid editor doesn't want anything returned by Init
nil as the very last line?
Same error
Try 1=1
@meager granite No luck
1==1 ๐
@jade abyss Nope :S
Damn stupid editor
1 = 0 spawn {
Do this
I mean change
0 spawn {
into
1 = 0 spawn {
yep just accepted it
@meager granite sebt you a photo in pm
"this" is causing it to fail
lol
Hey can anyone here help with setting up rcon for Arma2
Is the Loiter Waypoint not accessible through scripting? When I add a waypoint to a flying unit with the type "Loiter", the waypoint gets marked as "Waypoint" in Zeus and the unit is treating it as a "Move" WP
Of course. I am setting the type that way
I figured out the problem. The following waypoints were the problem
on this array: _glugluArray = [ [ [01,02,03], [04,05,06], [07,08,09], [10,11,12] ], [ [13,14,15], [16,17,18], [19,20,21], [22,23,24] ] ]; There is a easy way to change the value 11 to 99?
The code i use is far from simple ๐ฆ
_arr1 = _glugluArray select 0;
_arr2 = _arr1 select 3;
_arr2 set [1,99];
_arr1 set [3,_arr2];
_glugluArray set [0,_arr1];```
Q: How would one go about scripting it where if a teamkill happens, the killer gets zeus smited?
nope... I'm thinking zeus lightning bolt and a message across the entire server that teamkillers will be smited. This is destined for a public map
and since it's coded into the map itself, I'm removing that option from player zeuses. I'm also running with demigods, a zeus player who can only operate within his home area and when his officer unit is killed, game over for that side.
the reason I wanted a map scripted option is so it's /immediate/ when someone TK's.
no chance to blame it on someone else, no weasling out of it...
that same code can be used to slaughter anyone who kills an innocent ai.
If it was a door gunner, the entire vehicle is gone.
then they get to explain to the vehicle commander and zeus why he opened fire on team mates.
I'm also looking at scripting to enforce that only a group can enter the vehicle, starting with the group leader. If you ain't in his group, you don't have a seat. Which means if that group leader has a TK'er.. it's as much on him as it is on the TK'er.
it's called being responsible for your people. Something sorely lacking in a lot of players I see on public servers.
What would I set a default value for a param if I wanted to say, pass in position player?
Would that be just 0 or something?
@rotund cypress e.g. [0,0,0]
what do you mean? ๐
do you want to [position player] call funcA; funcA params [['_pos', [0,0,0], [[]]; _marker =createMarker....
or what? ๐
[0,0,0], [[]] as insane said
@dusk sage Do you know if AI's still don't fire a trigger?
if they are transfered to the HC?
is there somewhere around using Visual Studio 2015 Enterprise for SQF scripting? If so is there a good plugin for syntax highlighting and co ?
Why would you want to?
because I like VS 2015 and feel comfortable with
Is there a function for force zoom a scope?
should he still have other interactions like shooting ?
is that to me? If so yes. They should be able to shoot but i just need to force zoom a scope in
@dusk sage yeah I saw that and also tried to import the plugin to VS 15 ENT but that wasn't working. I don't want another programm I just want to use my VS. If there is none well then I just stick with Dash
https://community.bistudio.com/wiki/switchCamera could work.. Can not test right since I am on mac
player switchCamera "Gunner";
@tough abyss
thanks
hey folks. I'm porting the ambient combat module from arma 2. seems to be kinda working, but it keeps calling the garbage collector module function that seems to be not available. It was used to remove units that went beyond the spawning radius.
it calls for: "BIS_GC_trashItFunc"
Is there any arma 3 equivalent of this function?
look at it closer the script only calls this function twice, maybe I should just do away with it
if (_obj) then
{
_array = _scope getVariable "objects";
{
//Triggers need to be deleted immidiately.
if ((typeOf _x) == "EmptyDetector") then
{
deleteVehicle _x;
}
else
{
[_x] call BIS_GC_trashItFunc;
};
} forEach _array;
_scope setVariable ["objects", []];
};
if (_grp) then
{
_array = _scope getVariable "groups";
{
[_x] call BIS_GC_trashItFunc;
} forEach _array;
_scope setVariable ["groups", []];
};
replace it with deletevehicle or something
wtf
@thorn saffron
if (_obj) ?
Never seen that before.
Kind of counter intuitive
Boolean flag to control the flow. Particularly with that name.
that is just bis ambient combat manager module, I didn't change a thing
how?
/*
File: cleanDyn.sqf
Author: Joris-Jan van 't Land
Description:
Cleans dynamically created content by either deleting it straight away
or by sending it to the general Garbage Collector.
Parameter(s):
_this select 0: mode - String
obj: objects only
grp: groups only
all: all content
_this select 1: ACM object
_this select 2: patrol ID
*/
private ["_mode", "_acm", "_id", "_scope", "_obj", "_mrk", "_grp"];
_mode = _this select 0;
_acm = _this select 1;
_id = _this select 2;
_scope = [_acm, _id] call BIS_ACM_returnPatrolScopeFunc;
_obj = false;
_grp = false;
switch (_mode) do
{
case "obj":
{
_obj = true;
};
case "grp":
{
_grp = true;
};
case "all":
{
_obj = true;
_grp = true;
};
default {};
};
private ["_array"];
if (_obj) then
{
_array = _scope getVariable "objects";
{
//Triggers need to be deleted immidiately.
if ((typeOf _x) == "EmptyDetector") then
{
deleteVehicle _x;
}
else
{
[_x] call BIS_GC_trashItFunc;
};
} forEach _array;
_scope setVariable ["objects", []];
};
if (_grp) then
{
_array = _scope getVariable "groups";
{
[_x] call BIS_GC_trashItFunc;
} forEach _array;
_scope setVariable ["groups", []];
};
There
```sqf {code} ```
thanks
this a clean up script for the arma 2 Ambient Combat Manager. It is called by an fsm. I'm pretty sure that it used to remove units that got out of the spawn area around the player
the whole thing seems to work perfectly fine. The thing is it is calling for the garbage collector module function that is no longer in Arma 3 (AFAIK). I just want to repalce the call to GC for removal with something similar that won't throw errors
{[_x] call BIS_GC_trashItFunc;}
_x addToRemainsCollector;
no square brackets around the _x ?
I thing the _x is the array of each unit of the squad that will be deleted
add this.
Most of that garbage collection is incorporated in engine now using description ext parameters
Not all features tho iirc
{scriptName "garbage_collector\data\scripts\trashIt.sqf";
/*
File: trashIt.sqf
Author: Joris-Jan van 't Land
Description:
Sends an object to the garbage collection queue.
Parameter(s):
_this select 0: the object.
Returns:
Success flag (Boolean).
*/
//Valid parameter count
if (isNil "_this") exitWith {};
private ["_object", "_queue", "_timeToDie"];
_object = _this select 0;
waitUntil{!(isNil "BIS_GC")};
_queue = BIS_GC getVariable "queue";
switch (typeName _object) do
{
case (typeName objNull):
{
if (alive _object) then
{
_timeToDie = time + 30;
}
else
{
_timeToDie = time + 60;
};
};
case (typeName grpNull):
{
_timeToDie = time + 60;
};
default
{
_timeToDie = time;
};
};
if (isNil "_queue") then
{
_queue = [[_object, _timeToDie]];
}
else
{
_queue = _queue + [[_object, _timeToDie]];
};
BIS_GC setVariable ["queue", _queue, true];
true}
// -----Garbage Collection-----
// -----Corpse Cleanup-----
corpseManagerMode = 3;
corpseLimit = 15;
corpseRemovalMinTime = 120;
corpseRemovalMaxTime = 300;
// ------------------------
// -----Wreck Cleanup-----
wreckManagerMode = 3;
wreckLimit = 15;
wreckRemovalMinTime = 60;
wreckRemovalMaxTime = 300;
// -----------------------
@thorn saffron
the thing is the deleted squad is not dead
it is simply beyond the range set in ACM
Ah.
then.
deleteVehicle _x; ?
Ahhhhh
It's a _queue data-structure
Hmmm thats easy to deal with.
GC deletes stuff that is out of sight of the player AFAIK
hmm
Bet BIS_GC is a module
yeah
if thats the case you can replace it for a GameLogic
its the garbace coletor module from arma 2
All that trash fnc did was delay removal by 30 secs I assume
^
Tbh taro why not write from scratch?
And append the queue.
cause I have no idea about this whole scripting witchery
I think that deleteVehicle might be enough
Try it :)
its only about removing those units after all
Just experiment
@thin pine Do you know whether triggers respond to HC's?
after they transfer from the server?
Actually, thats a minor problem. I can just spawn the AI directly on the HC and have the triggers hooked to the HC's
And hopefully they'll remain sync'd?
I believe global triggers are evaluated by everyone. Are you creating local ones?
I also thought for a sec you meant HC as in High Command lool @thorn saffron is that what you're on about?
@thin pine No this is apart of our Communities framework
I've been writing got a hole bunch of API functions that search terrain for trees, and makes AI laydown for auto-ambushing
me? no I'm porting the Ambient Combat Manager module from Arma 2
And IED's
Are you asking whether hc controlled ais trigger triggers?
Or are you asking whether trigger activation code is also executed on hc?
Will the code activate on the HC
as in will the trigger "fire"
If the AI is on the HC
and the trigger is on the server?
They do now.
Ais in player group are local to player
Those should also fire triggers
It's just HC controlled AI for a while wouldn't respond to the triggers or waypoints
Hmm
Ha
Hey @thorn saffron
I found the actual arma 3 function
That does exactly what Trashit did
@tough abyss cant you help me with my question some pages above (_glugluArray)?
Tbh its another case of go in-game and verify ๐
@tough abyss Linear search the embedded array
by passing an array.
Returning the index
@tough abyss what function is it?
I find it odd to hear that AIs local to HC would not activate a trigger on the server, even if that trigger is locally created on serverside. If that's a thing it must be a bug
It was.
Not sure if it is fixed.
@thin pine an AI on clients activate that triggers on server?
If that bug is still present I wonder if AIs local to player group leaders won't activate serversided triggers either
Sounds like too big of a bug to be still present
Is this a question for the @BIMINIONS ?
Naw
It's sumn you could test yourself :P
Im on mobile though so I can't unfortunately
@tough abyss your gluglu array question. Is this just curiosity while experimenting nested arrays or is it a prototype of something you're working on? It seems simple enough to me
@thin pine is for my new save method that uses server profileNameSpace vars instead of MySql.
You can do it more than 1 way.
You can search your array first.
I'd say setting single values in a nested array like that is uncommon.
then return the index of the array
then get the next array
and run it through a seperate loop
Ah
@thin pine You know I feel like making a binary search.
I can actually do it now.
With the new sortability command
pushBack is amazing because i can do (_array select 0 select 2) pushBack 15;
And you were wondering if set does sumn similar?
I got ya. I wouldn't know a quick route like that. Looks like you're going to have to do it the non simple route
There is probably a more efficient way of doing that.
a for loop embedded in a forEach would probably achieve what you want.
this way you could use the following
for "_i" from 0 to count(_largeArray) do {
{
_x select _i;
} forEach _largeArray;
};
First pass selects the index
And if you wanted to specifically step n numbers
I assume Donnovan knows how to find the value he's looking to replace. Which is why his prototype uses static indexes and values
You can loop each index at 3 at a time
by using.
for "_i" from 0 to count(_largeArray) step 3 do {
{
if (_x select _i == _element) then exitWith { ret = _x select _i; };
} forEach _largeArray;
};
I'm using find function that must do the same
find looks for the index
it's like pythons list.index() method
_playersArray = [[id1,id2,id3],[playerdata1,playerdsta2,playerdata3]];
You need to know what your looking for.
Just two huh?
With the player id and player data indexes defined, it gets pretty easy indeed. But yeah unfortunately the pushback type of usage won't work with set
Would be rad if it did
Oh that is a triple nested array
id1, id2, id3 are the player steam id
omg
BI added SLICES!
((_playersArray select 1) select 2) set [2,getPosATL _unit] won't work unfortunately
:(
Test it
I will
Somewhere i hope it works :) after all set modifies the original array
I will try
Fyi you did imply that you tested it. I quote: But i cant do (_array select 0 select 1) set [2,"aaa"];
Wow
I did it
I got a double nested array to search
largeArray = [
[01,02,03],
[04,05,06],
[07,08,09],
[10,11,12],
[13,14,15],
[16,17,18],
[19,20,21],
[22,23,24]
];
[] spawn {
{
for "_i" from 0 to count(_x) do {
ret = _x select _i;
sleep 1;
};
} forEach largeArray;
};
Lets up the anty.
Triple nesting
@MrSanchez#5319 this is because there is nothing about that on the set WIKI, but the WIKI can be outdated.
I did it
@thin pine
tripleNested = [
[
[01,02,03],
[04,05,06],
[07,08,09],
[10,11,12]
],
[
[13,14,15],
[16,17,18],
[19,20,21],
[22,23,24]
]
];[] spawn {
{
for "_i" from 0 to count(_x) do {
ret = _x select _i;
{
subRet = _x;
true;
sleep 1
} count ret;
};
} forEach tripleNested;
};
@tough abyss That what you were looking for?
Triplenested searcher
That thing is nuts.
I think I'' replace forEach with count again.
It's extremely expensive though
Triplenested datastructures and arma 3 do not play nice.
Yep ArmA 3 definitely doesn't like triple nested DS's
There is simpiler solution which is using a count in a count
it works I tested it.
But it's reliability is so so
Yes correction it definitely works
@tough abyss my example was not the best. The actual structure of the array is like that: _array = [[player 1 id,player 2 id,player 3 id],[player 1 data, player 2 data, player 3 data]];
Yeah it will mine that fine
All you do is check subRet matches your index you want.
Or the item you want.
You'd probably need to use breakTo in this case.
Can this be done with the function find?
Maybe.
So we don't need the comparison loop
never tried.
So we don't need the comparison loop
When i will access the array i know only the player id.
and need to find the player data.
You know this is computer science grade stuff?
not aware of that
DSA (Datastructures and algorithms)
if i had player id in the player data, and a array like: _array = [player 1 data, player 2 data, player 3 data,..., player 567 data];
should be harder to search a specific player
I work with databases
So this must have helped a bit
There is actually 2 approaches to what you are doing
Recursive
and Iterative.
The solutions I provided are iterative.
Recursive is when you call a function inside the function you called
Recursion
func { {code operations up here} [] call func; };
@tough abyss did you try that set thing yet?
@thin pine will try now in the game console. Back in one minute.
What are you specifically looking for in the array?
@tough abyss
Because _array find 0;
Won't work
it will return -1
@tough abyss i have an know player object, so i use getPlayerUID on that object and get its Steam ID, and then i need to find its data (gear, weapons, mags, uniform, etc...) in the array.
i use _findIndex = (_array select 0) find _playerUID
then i use
_playerData = _array select 1 select _findIndex
Patiently awaiting the results ^^
f***
for "_i" from 0 to count(tripleNested) do {
for "_n" from 0 to count (_i) do {
ret = _i select _n;
};
};
Arma 3 not letting me do what I need to do.
Hmm
Global vars?
Its a global var yes, my fault to add the _ at the begining.
I store the var into the server profileNameSpace
and get it on server start
An hour later I still have no idea what the both of you want. Hehe
Same here
I know what he wants
I ignore Don usualy @thin pine ๐
Yep
@thin pine ([1,[2,3,5]] select 1) set [2,4]; this don't give a error
([1,[2,3,5]] select 1) set [2,4]; this don't give a error when i run it on the editor console
ok
If so then hurray saves you lot of code
So unreliable
[] spawn {
for "i" from 0 to count (tripleNested) do {
ret = (tripleNested select i);
for "j" from 0 to count(ret) do {
subRet = (ret select j);
sleep 1;
};
};
};
@thin pine ๐ฉ
Define unreliable
Dawn WIKI!
Shit?
Happy face
Worksidoodles yes or no
it worked
Good
_arr1 = _glugluArray select 0;
_arr2 = _arr1 select 3;
_arr2 set [1,99];
_arr1 set [3,_arr2];
_glugluArray set [0,_arr1];```
This was your original question
Its now solved
Easier way found
Thanks a lot...
I'm already with my ccooffee on my side ๐
So great news. It worked.
On a side note.
I did some nuttery, other languages allow
fn_iterativeDeepSearch = {
param ["toFind"];
for "i" from 0 to count (tripleNested) do {
ret = (tripleNested select i);
for "j" from 0 to count(ret) do {
subRet = (ret select j);
for "n" from 0 to count(subret) do {
subOfSub = subRet select n;
checkForReturn = subOfSub find toFind;
if (checkForReturn isEqualTo toFind) then {
breakTo "LowerScope"
sleep 1;
};
};
};
ScopeName "LowerScope";
};
Need to go. Thanks for all the motivational help. Motivation to go over the WIKI. ๐
Hey I got it work
fn_iterativeDeepSearch = {
params ["_toFind"];
ret = 0;
subRet = 0;
finalRet = 0;
for "i" from 0 to count (tripleNested) do {
ret = (tripleNested select i);
for "j" from 0 to count(ret) do {
subRet = (ret select j);
finalRet = subRet find _toFind;
sleep 0.05;
};
};
};
[5] spawn fn_iterativeDeepSearch;
Problem is on each pass _ret becomes undefined
So it works
But it doesn't at the same time.
Uh, it seems that the Ambient combat also needs the Functions Manager module from Arma 2. Again, I'm careful about porting stuff like that as I'm afraid it might break something in Arma 3
Code?
556 various files
I think this is a list of what functions the Functions Manager module has
http://pastebin.com/bwgfsGEU
taken from the Functions manager config
Where does this all plugin to?
fn_iterativeDeepSearch = {
params [
["_ret",0],
["_toFind",0],
["_finalRet",0],
["_i",0],
["_j",0]];
for "_i" from 0 to count (tripleNested) do {
_ret = (tripleNested select _i);
for "_j" from 0 to count(_ret) do {
_subRet = (_ret select _j);
_finalRet = _subRet find _toFind;
};
};
_finalRet;
};
``` ArmA 3 really doesn't like that.
spams "_i" and "_j" are undefined
try:
_Temp = _i;
inside the 2nd forEach ->
use _Temp
I cracked it.
using old syntax
I think this gets evaluated different
tripleNested = [
[
[01,02,03],
[04,05,06],
[07,08,09],
[10,11,12]
],
[
[13,14,15],
[16,17,18],
[19,20,21],
[22,23,24]
]
];
fn_iterativeDeepSearch = {
params [
["_toFind",0],
["_finalRet",0],
["_i",0],
["_j",0]];
hint format ["%1",_toFind];
for [{_i=0}, {_i<count(tripleNested)}, {_i=_i+1}] do {
ret = (tripleNested select _i);
for [{_j=0}, {_j<count(ret)}, {_j=_j+1}] do {
subRet = (ret select _j);
finalRet = subRet find _toFind;
sleep 0.05;
};
};
finalRet;
}; [] spawn { [05] call fn_iterativeDeepSearch; };
For some reason.
It won't work in unscheduled environment
@jade abyss
Ignoring the sleep and spawn
I know that.
tripleNested = [
[
[01,02,03],
[04,05,06],
[07,08,09],
[10,11,12]
],
[
[13,14,15],
[16,17,18],
[19,20,21],
[22,23,24]
]
];
fn_iterativeDeepSearch = {
params [
["_toFind",0],
["_finalRet",0],
["_i",0],
["_j",0]];
hint format ["%1",_toFind];
for [{_i=0}, {_i<count(tripleNested)}, {_i=_i+1}] do {
ret = (tripleNested select _i);
for [{_j=0}, {_j<count(ret)}, {_j=_j+1}] do {
subRet = (ret select _j);
finalRet = subRet find _toFind;
};
};
finalRet;
};
[05] call fn_iterativeDeepSearch;
Why would you ever do that though?
boredom
So what is this supposed to report? [0,1,1] ?
@jade abyss hehehe
Hey Guys, I was wondering if I could set a ACE3 Rearming Point on any other objects, other then the HEMMT/Zamak ammo trucks?
so I have a question about audio
is it possible to trigger a gunshot sound by script without a unit? and have it use proper processing?
a) yes
b) probably not without an elaborate config for that soudn that replicatest he one for the gun sound. haven't looked into the filter stuff but my guess is that not all of it is available outside of the egnine's gunshot implementation. you should probably ask someone who made a sound mod to get complete info on how processing works and is applied
thanks
This might be a silly question, but I keep getting errors with this:
_theGroup = 0;
while {_theGroup == 0} do { _theGroup = [] call getTheGroup; };
The function returns 0 unless it can get something
I have tried this as well:
_theGroup = 0;
while {if (_theGroup == 0) then {true} else {false}} do { _theGroup = [] call getTheGroup; };
Keeps saying "Generic error in expression" with the position of >== 0
Does anyone here know where the mission files for the endgame and similar is located in addons?
It is locked up @rotund cypress
@tough abyss that probably means the datatypes dont match. Check what getTheGroup actually returns, if its not a number itll error. you get the same error if you do var = 0 + "a";
What do you mean, EBO? @tough abyss
Doesn't exactly exist as a .pbo somewhere. I had a look around a while back with no luck.
It has to be somewhere
It's not like it's getting pulled out from the computers ass
Of course, and I think I came across something, but it wasn't able to be opened.
It is in the marksman ebo files I think
packaged with the dlc
Wait endgame is only for marksmen dlc?
@indigo snow I am trying to get the closest group to a location to prioritize pickups:
closestGroup = {
_returnValue = 0;
_aliveGroups = aiAliveGroups;
_currentlyTransported = aiAliveGroupsTransported;
_grps = _aliveGroups - _currentlyTransported;
if (count _grps == 0) exitWith { _returnValue };
_spawn = getMarkerPos "AISpawn";
_closestGroup = _grps select 0;
_closestDistance = leader (_grps select 0) distance2D _spawn;
{
_distanceTo = leader _x distance2D _spawn;
if (_distanceTo < _closestDistance) then {
_closestDistance = _distanceTo;
_closestGroup = _x;
}
} forEach _grps;
if ((leader _closestGroup distance2D _spawn) <= 1000) then {
_returnValue = _closestGroup;
};
_returnValue;
};
It was released with the marksman dlc, so it is packaged in there if I recall
It will return a group if it is applicable
so _returnValue is a group type from what I see? you can't use == to compare different datatypes
use isEqualTo or isEqualType or something
What would be the ideal value to return for no applicable group?
grpNull?
cool!
Let me shorten your function, because i'm bored
closestGroup = {
private _groups = (aiAliveGroups - aiAliveGroupsTransported) apply {
[leader _x distance2d _this, _x]
};
if(count _groups == 0) exitWith {grpNull};
_groups sort true;
if(_groups select 0 select 0 > 1000) exitWith {grpNull};
_groups select 0 select 1;
};
_closest_group = getMarkerPos "AISpawn" call closestGroup;
@rotund cypress Look into addons\missions_f_exp_a.pbo
:/
... -.- and posting Discord of PR... wow
Cheers @meager granite just noticed this
is there an FSM syntax for notepad++?
Is it possible to display dialogues while the map is open?
yeah
@thorn saffron Do you mean you want to code out an FSM by hand instead of using the FSM editor?
Hasnt been done before afaik
Inside the FSM you just use SQF
Can anyone point me to a doc on using trigger areas to spawn enemy units?
if youre in a contect where you can suspend, yes.
Figured that may be the issue.
check with https://community.bistudio.com/wiki/canSuspend if youre unsure
if canSuspend then {
waitUntil { !musicPlaying };
} else {
hint "ERROR: can't suspend now!";
};
Is it possible to read a float variable and select each digit separately like this select?
I want to code a grid system and I would liketo check for teh first 3 digits of a position variable
Turn your float to a string first. str
mapgridposition is not accessible with this select
Have a look at the new alternative syntaxes of "select" that deal with strings.
Thanks, ran into an issue though:
(str mapGridPosition player)
returns:
"""121188"""```
how am I supposed to peel off the triple quotations.
actually, wait I think I see the problem
? mapGridPosition already is a string
whoops
I wrapped an orange into foil and complained about the extra peel
_var = mapGridPosition player;
_var = _var select [0,3];
hintsilent format["%1", _var];```
this works as intended, thanks for the help kalband nick
amazing how the true power of scripting lies with string operation
However one thing appears to maek no sense:
However one thing appears to maek no sense:
//x-grid position
_x = mapGridPosition player;
_x = _x select [0,3];
//y-grid position
_y = mapGridPosition player;
_y = _y select [3,5];
hintsilent format["%1 %2", _x, _y];
Test
Why do I have to start at 3,5 for the second part?
the string is 6 digits
0 1 2 -3 4 5
first index is 0
well thats the wrong part
I only get the first 3 digits if I go 0,3
if its 0,2 I only get teh first 2
Unless I am overlooking something the logic is wrong
no
If anyone wants to see this ingame, you can do so in the developer console.
I end up with 30 pages open quickly
always dumpster diving in the script commands
If I fill the altis map witha few thousand 100meter rectangular markers, is that a performance concern?
looking at it it would almost a 100 thousand markers so i think that would be a dumb idea
i would just compare fps with nothing else in the mission. i guess it depends on how the game handles them. probably waaaaay less data than an entity
i would be interested in that too though. sounds like you are working on insurgency? me too actually. kind of ;D
@finite mica Yes it will hog performance particularly, as you will need a means to watch them
@little eagle And the reason I did that, is because it's a valid programming technique
but arma 3 hates it.
It was to iteratively search a triple nested array
but just idle markers are fine? because there is ways to handle them efficiently i think
tripleNested = [
[
[01,02,03],
[04,05,06],
[07,08,09],
[10,11,12]
],
[
[13,14,15],
[16,17,18],
[19,20,21],
[22,23,24]
]
];
fn_iterativeDeepSearch = {
params [
["_toFind",0],
["_finalRet",0],
["_i",0],
["_j",0]];
hint format ["%1",_toFind];
for [{_i=0}, {_i<count(tripleNested)}, {_i=_i+1}] do {
ret = (tripleNested select _i);
for [{_j=0}, {_j<count(ret)}, {_j=_j+1}] do {
subRet = (ret select _j);
finalRet = subRet find _toFind;
};
};
finalRet;
};
[05] call fn_iterativeDeepSearch;
did anyone find a way to fully reset AI. i tried _unit disableAI "Autocombat" and it looks good but once i reenable the AI goes back to danger walk. is there no way to erase all the enemies a unit is aware of from its consciousness?
set knowabout value to 0 for all spotted enemies
and then set the behavior to SAFE
wait what? how recent is example 3 on the reveal wiki page?!
also thx a lot!
idk. it's a wiki. should be able to figure it out
hm. it says the value can only be increased not decreased. is that outdated info?
so did you use this and it worked? i'm confused. to my knowledge knowsabout could never be decreased
if you tested it i will blindly trust ofc ;D
Thanks a lot.
is 51 the whole map interface?
I think systemchat is broken.
It wont show up for me at all.
I used systemChat today just fine @finite mica
when I use it with format it wont work for me.
paste how you are using it?
I used it with format today
@little eagle Was my script design terrible?
Or is there a better way to deep search an array?
well it's pretty specific and won't work with 4 deep arrays
so it's kinda pointless
unless you happen to find an application for exactly that
but there are then probably better ways to store data than nested arrays
Kewl ๐ all good. Everyone (mostly) is here to help
I'm here to point and laugh at the mistakes of others.
I consider myself very advance with specific scripting topics but I trip over random stuff like a total newbcake