Skip to content

Useful Commands

Mike-MF edited this page Nov 11, 2022 · 37 revisions

This page is for utilising fun or immersive things in missions.

Most if not all of these should be placed inside init.sqf and never in the object init field in the editor.


A.I

This section is dedicated to things you can do with AI.


Combat Unloading

When utilising helicopters in missions units being held in vehicles away from the AO more often than not do spot helicopters, eject from their vehicles and go into combat mode. Essentially even if the pilot doesn't see these units they have become useless. The vehicle will move away without the QRF when activated.

The example on the wiki is: _veh setUnloadInCombat [true, false];

The first part of the command needs to be a vehicle variable name, not the driver.

The second parts are allowing Cargo to dismount and allowing Turrets to dismount.

To prevent any units from dismounting before you force them to you simply need to use Example_Vehicle setUnloadInCombat [false, false];

This doesn't need to be changed if you use a waypoint for "Transport Unload" as they will be ordered to dismount by themselves.


Disable Movement

the disableAI command is worthwhile to use for multiple purposes.

This is designed for preventing moving, firing, cover etc. The use cases are available on the wiki

For the example we'll be disabling AI Pathing. They can't move, but can still turn and aim. (Disabling Move also disables turning)

The example on the wiki is _soldier1 disableAI "PATH";

This would disable the soldiers ability to move. But if you wish to disable a full groups to hold a garrison position you would want the command to be ran on all of them. Give the AI group a variable name, i.e Example_Group_1 and then in init.sqf you can do

{
    {
        _x disableAI "PATH";
    } forEach (units _x);
} forEach [Example_Group_1];

This disables the path on every unit inside Example_Group_1 and you can expand this for as many groups as you like by changing } forEach [Example_Group_1]; to } forEach [Example_Group_1, Example_Group_2, Example_Group_3];

Ensure that you have a comma between each group variable otherwise it will give you an error.

This example works with all of the available AI behaviours. And if you wish to re-enable any of the ones you disable, you can use the same example as above but using enableAI instead of disableAI


Forcing Flashlight Use

This uses the command enableGunLights

This can be done via:
Example_Group_1 enableGunLights "ForceOn";

or if you have multiple groups you want lights on:

{
    _x enableGunLights "ForceOn";
} forEach [Example_Group_1, Example_Group_2, Example_Group_3];

Limit Speed

Vehicles in Arma can have their speed limited if required, in my experience it does seemingly limit the amount of accidents the AI get into.

A basic example of utilising this is:

ExampleVehicle limitSpeed 50;

The vehicle itself (not the unit driving it) needs a variable name and using the above command will not allow it to go above the speed specified until it reaches it's destination or you change the speed it's allowed to travel at.

The wiki has examples of using loops but that is for much older versions of Arma, it now remains set without being looped.


Reaction Event Handlers

Sometimes AI feels a bit sluggish or useless with reacting to contact. Patrols just continue their route while being engaged or they'll just stand there and take it. (The code blocks can be thrown into init.sqf)

For Patrols:

{
    private _leader = leader _x;
    _leader addEventHandler ["Suppressed", {
        params ["_unit", "", "_shooter"];

        _unit removeEventHandler [_thisEvent, _thisEventHandler];

        private _unitGroup = units (group _unit);
        private _enemyPos = getPos _shooter;
        _unitGroup doMove _enemyPos;
    }];
} forEach [My_Group_One, My_Group_Two];

This will have a patrol unit that gets engaged stop using it's waypoints and directly move and engage the players firing at them.

For Static Units:

{
    {
        _x addEventHandler ["Suppressed", {
            params ["_unit", "", "_shooter"];

            _unit removeEventHandler [_thisEvent, _thisEventHandler];

            private _unitGroup = group _unit;
            _unitGroup reveal [_shooter, 1.5];
        }];
    } forEach (units _x);
} forEach [My_Group_One, My_Group_Two];

This will have units being suppressed or fired at gain immediate knowledge of the players position who are engaging and will start returning fire much earlier.


CBA Functions

This section is for utilising CBA functions.

Wait and Execute

Wait and Execute is the ONLY option when wanting to execute code with delays. There will be no sleep.

A useful method to using it is:

if (isServer) then {
    ied_1 setDamage 1;

    [{
        ied_2 setDamage 1;
    }, [], 1] call CBA_fnc_waitAndExecute;

    [{
        ied_3 setDamage 1;
    }, [], 2] call CBA_fnc_waitAndExecute;

    [{
        ied_4 setDamage 1;
    }, [], 3] call CBA_fnc_waitAndExecute;
};

In this example, when the code runs it will detonate ied_1 then the others with a 1 second delay.

[{ CODE HERE }, [PARAMS], DELAY] call CBA_fnc_waitAndExecute;

The delay is not time since the last one ran, it is time after the block starts. So for code that runs in sequence of 5, it's 5, 10, 15 & 20 instead of using only 5 in each.


Task Patrol

Task Patrol is a useful function for having units dynamically patrol an area with optional "searching" capabilities.

Note: Using this requires you to toggle the "Headless Blacklist" checkbox under Attributes > ACE Options.

Parameters:

  1. Group Variable Name
  2. Position (Default: Group, for markers use getMarkerPos "MarkerName")
  3. Radius in meters
  4. Waypoint count (How many waypoints this will generate)
  5. Waypoint Type (Example: "MOVE")
  6. Behaviour ("CARELESS", "SAFE", "AWARE", "COMBAT", "STEALTH")
  7. Combat Mode (See Here)
  8. Speed Mode ("UNCHANGED", "LIMITED", "NORMAL", "FULL")
  9. Formation (See Here)
  10. Code to execute at each waypoint (Default: "this call CBA_fnc_searchNearby", Can simply change to "" to not use this feature.)
  11. Timeout at each waypoint, Min/Med/Max gravitating towards Medium.

Example:

[MyGroup, nil, 300, 7, "MOVE", "AWARE", "YELLOW", "FULL", "STAG COLUMN", "this call CBA_fnc_searchNearby", [3, 6, 9]] call CBA_fnc_taskPatrol;

This example will setup a 300m, 7 waypoint patrol in staggered column around the group. Stopping for 3-9s between waypoints and conducting a small search.

Alternative Example:

[MyGroup, getMarkerPos "MyMarker", 100, 3, "MOVE", "COMBAT", "RED", "LIMITED", "WEDGE", "", [0, 0, 0]] call CBA_fnc_taskPatrol;

This example will have your group setup a 100m, 3 waypoint patrol in Wedge around your marker position with no delay on waypoints or searching involved.

Code should be ran from initServer.sqf

Note: Because these won't be ran on the headless client, don't spam usage of this in a single mission. We use headless clients for a reason.


Task Defend

Task Defend is a function for having a group take control of an area by garrisoning buildings, manning unmanned turrets and patrolling the vicinity.

Note: Using this requires you to toggle the "Headless Blacklist" checkbox under Attributes > ACE Options.

Parameters:

  1. Group Variable Name
  2. Position (Can be Group, Object or Marker.)
  3. Radius in meters
  4. Threshold, minimal amount of positions in building to be considered for garrison.
  5. Patrol Chance, can be true (100%) or false (0%) or a number between 0.1 - 1
  6. Hold Garrison Chance, works the same as above. Can be used to simulate units moving to engage instead of waiting to die.

Example:

[MyGroup, getMarkerPos "MyMarker", 100, 1, 0.5, 0.5] call CBA_fnc_taskDefend;

The example should have your group search for buildings and setup patrol routes 100m around your marker with a 50% chance of patrolling and 50% chance of leaving the garrison to engage.

Alternative Example:

[MyGroup, MyGroup, 50, 3, false, true] call CBA_fnc_taskDefend;

This example should have your group search for buildings 50m around the groups starting position with 0% chance of patrols and 100% chance of leaving the garrison to engage.

Code should be ran from initServer.sqf

Note: Because these won't be ran on the headless client, don't spam usage of this in a single mission. We use headless clients for a reason.


Immersion

This has examples of some commands for useful immersion features in missions.


Cellphone Ringing

This uses the playSound3D command.

playSound3D ["z\ace\addons\explosives\data\audio\cellphone_ring.wss", example, false, getPosASL example, 1, 1, 50];

for this to work properly, you must specify a path to the sound which is already present. Then follow it with the Object that will make the sound, this can be anything but it must have a variable name.

example, false, getPosASL example, 1, 1, 50]; These are the last parameters required.

  • example = Object making the sound
  • false = is inside
  • getPosASL example = location of the object making the sound
  • 1 = Volume, this is capped to 5.
  • 1 = sound pitch, don't touch this.
  • 50 = distance, the distance at which you can hear the sound.

Base Alarms or Ambient Firefights

This uses the createSoundSource command.

You can create a simple base alarm by utilising the following:

if (isServer) then {
    tac_baseAlarm = createSoundSource ["Sound_Alarm", position Example_Object, [], 0];
};

This is wrapped in if (isServer) then { for a reason. If it is not it will execute globally and you'll have more than 1 alarm playing at once and it's bad. There will be no global sound sources.

The parameters of this are:

  • The Sound (the wiki has a list of preconfigured ones)
  • Position of an object, usually using a loudspeaker or something.
  • Marker array, unless you want a randomly placed soundSource leave it as []
  • Random radius around the object for the soundSource to be placed in, recommended to leave as 0.

One final note on using this: Have a way of stopping it.

in this case, the "vehicle" is tac_baseAlarm and can be deleted with deleteVehicle.

if (isServer) then {
    deleteVehicle tac_baseAlarm;
};

This will end the looped sound and bring peace and quiet.


Map Markers

If you want your map markers to be toggled on and off in the mission to not clutter the map you can use the following.

Enter into fn_briefing.sqf

_player createDiaryRecord ["Diary", ["Toggle Markers", "
            <br/><font face='RobotoCondensedBold'>Toggled markers are local to you, not global.</font face>
            <br/>
            <br/><font color='#39823b' face='RobotoCondensedBold'>Objective Markers</font color>
            <br/><execute expression = '{_x setMarkerAlphaLocal 1} forEach tac_ObjectiveMarkers;'>On</execute>/<execute expression = '{_x setMarkerAlphaLocal 0} forEach tac_ObjectiveMarkers;'>Off</execute>
            <br/>
        "]];

Then enter the following line into init.sqf with the markers you want to be togglable.

tac_ObjectiveMarkers = ["Marker_1", "Marker_2", "Marker_3", "Marker_4"];

Other

This section covers anything that doesn't fit into other categories.


Adding wheels to vehicles

Friendly vehicles should have wheels inside the cargo space. It can be done in 2 ways either via the vehicle init box or by initServer.sqf

This is one of the rare cases using an editor init field is acceptable, it's also much easier than doing it via initServer

Init Box:

if (isServer) then { 
    ["ACE_Wheel", this, 4] call ace_cargo_fnc_addCargoItem;
};

initServer:

["ACE_Wheel", My_Vehicle, 4] call ACEFUNC(cargo,addCargoItem);
{
    ["ACE_Wheel", _x, 4] call ACEFUNC(cargo,addCargoItem);
} forEach [My_Vehicle, My_Vehicle2];
Clone this wiki locally