Difference between revisions of "Script Snippets"

From ALiVE Wiki
Jump to: navigation, search
(Adding Custom Inits to Spawned Units)
Line 165: Line 165:
 
if ((side _obj == west) and (!isPlayer _obj)) then {
 
if ((side _obj == west) and (!isPlayer _obj)) then {
 
   removeallweapons _obj;
 
   removeallweapons _obj;
   removeGoggles _obj;removeHeadgear _obj;removeVest _obj;removeUniform _obj;removeAllAssignedItems _obj;removeBackpack _obj; _obj addHeadgear 'Helmet_ACU';_obj addUniform 'Uniform_ACU';_obj addVest 'Vest_ACU';_obj addBackPack 'ACU_Backpack'; { _obj addItemToBackpack"rhs_mag_30Rnd_556x45_M855A1_Stanag"; } forEach [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,18, 19, 20, 21];{ _obj addItemToBackpack "rhs_mag_m67"; } forEach [1, 2, 3, 4];{ _obj addItemToBackpack "SmokeShell"; } forEach [1, 2, 3, 4]; _obj addweapon 'rhs_m4_grip_acog';_obj addPrimaryWeaponItem 'rhsusf_acc_ACOG';{ _obj addItem "FirstAidKit"; } forEach [1, 2, 3, 4, 5];_obj linkItem "ItemMap";
+
   removeGoggles _obj;removeHeadgear _obj;removeVest _obj;removeUniform _obj;removeAllAssignedItems _obj;removeBackpack _obj;
 +
  _obj addHeadgear 'Helmet_ACU';_obj addUniform 'Uniform_ACU';_obj addVest 'Vest_ACU';_obj addBackPack 'ACU_Backpack';
 +
{ _obj addItemToBackpack"rhs_mag_30Rnd_556x45_M855A1_Stanag"; } forEach [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,18, 19, 20, 21];
 +
{ _obj addItemToBackpack "rhs_mag_m67"; } forEach [1, 2, 3, 4];
 +
{ _obj addItemToBackpack "SmokeShell"; } forEach [1, 2, 3, 4];
 +
{ _obj addItem "FirstAidKit"; } forEach [1, 2, 3, 4, 5];
 +
_obj addweapon 'rhs_m4_grip_acog';_obj addPrimaryWeaponItem 'rhsusf_acc_ACOG';_obj linkItem "ItemMap";
 
};
 
};
  
 
</syntaxhighlight>
 
</syntaxhighlight>
 
  
 
=OPCOM=
 
=OPCOM=

Revision as of 08:18, 7 March 2015


Profiles

Spawn & Profile Group Script By Jman

Filename:  fnc_spawnProfileGroup.sqf 
Locality: Runs on server
Description: Spawns a group faction and sends them to a waypoint.
 
Params:
* _spawnPosition  -> Array. Position to spawn group
* _spawnExactLocation -> Boolean. Set to false if you want to spawn it in an exact position.
* _destinationPosition -> Array. Position of waypoint destination.
* _group -> String. CfgGroups name 
* _faction -> String. CfgGroups faction
 
Optional Params:
* _debug -> Boolean. Enable debug output
* _waypointPlacementRadius -> Scalar. Random placement radius. http://community.bistudio.com/wiki/Mission_Editor:_Waypoints#Placement_Radius
* _waypointType -> String. Type of waypoint. NOTE: at the moment only MOVE is supported by the profiler. http://community.bistudio.com/wiki/Mission_Editor:_Waypoints#Select_Type
* _waypointMovement -> String. Speed of waypoint movement. http://community.bistudio.com/wiki/Mission_Editor:_Waypoints#Speed
* _waypointCompletionRadius -> Scalar. Completion radius of waypoint. http://community.bistudio.com/wiki/Mission_Editor:_Waypoints#Completion_Radius
* _waypointTimeoutCounters -> Array.  Timeout counters. http://community.bistudio.com/wiki/Mission_Editor:_Waypoints#Timeout_Counters
* _waypointFormation -> String. Formation type. http://community.bistudio.com/wiki/Mission_Editor:_Waypoints#Formation
* _waypointCombatMode -> String. Combat mode. http://community.bistudio.com/wiki/Mission_Editor:_Waypoints#Combat_Mode
* _waypointBehaviour -> String. Behaviour type. http://community.bistudio.com/wiki/Mission_Editor:_Waypoints#Behaviour
* _waypointDescription -> String. Description. http://community.bistudio.com/wiki/Mission_Editor:_Waypoints#Description
* 
 
Usage:
 
init.sqf:
* ALIVE_spawnProfileGroup = compile (preprocessFileLineNumbers "fnc_spawnProfileGroup.sqf");
 
Create a trigger or call in script:
 
Syntax: [array, boolean, array, string, string, boolean, scalar, string, string, scalar, array, string, string, string, string] call ALIVE_spawnProfileGroup;
 
Example(s):
* [getMarkerPos "nmeGrp01_spawn_pos", false, getMarkerPos "nmeGrp01_dest_pos", "10_men_ME", "caf_ag_me"] call ALIVE_spawnProfileGroup;
* [getMarkerPos "nmeGrp01_spawn_pos", false, getMarkerPos "nmeGrp01_dest_pos", "10_men_ME", "caf_ag_me", true, 0, "Move", "Full", 0, [0,0,0], "Delta", "Open Fire, Engage At Will", "Aware", ""] call ALIVE_spawnProfileGroup;
 
Credits: ALiVE functions: The ALiVE team. Web: http://www.alivemod.com
* Script Created by [KH]Jman
* Creation date: 06/02/2014
* Email: jman@kellys-heroes.eu
* Web: http://www.kellys-heroes.eu
 
// ====================================================================================
if (!isServer) exitWith {};
// ====================================================================================
 
// SCOPE -------------------------------------------------------------------------------------
private["_spawnposition","_spawnExactLocation","_destinationPosition","_faction","_profile","_profiles","_profileWaypoint","_group","_debug",
"_waypointPlacementRadius","_waypointType","_waypointMovement","_waypointCompletionRadius","_waypointTimeoutCounters","_waypointFormation",
"_waypointCombatMode","_waypointBehaviour","_waypointDescription","_groupName", "_groupName","_config"];
_config = [];
// SCOPE -------------------------------------------------------------------------------------
 
waitUntil {!isNil "ALIVE_profileSystemInit"};
 
// PARMS -------------------------------------------------------------------------------------
_spawnPosition = _this select 0;
_spawnExactLocation = _this select 1;  
_destinationPosition = _this select 2;
_group = _this select 3;
_faction = _this select 4;
_debug = if(count _this > 5) then {_this select 5} else {false};
_waypointPlacementRadius = if(count _this > 6) then {_this select 6} else {0};
_waypointType = if(count _this > 7) then {_this select 7} else {"Move"};
_waypointMovement = if(count _this > 8) then {_this select 8} else {"Full"};
_waypointCompletionRadius = if(count _this > 9) then {_this select 9} else {0};
_waypointTimeoutCounters  = if(count _this > 10) then {_this select 10} else {[0,0,0]};
_waypointFormation = if(count _this > 11) then {_this select 11} else {"Delta"};
_waypointCombatMode = if(count _this > 12) then {_this select 12} else {"Open Fire, Engage At Will"};
_waypointBehaviour = if(count _this > 13) then {_this select 13} else {"Aware"};
_waypointDescription = if(count _this > 14) then {_this select 14} else {""};
// PARMS -------------------------------------------------------------------------------------
 
// DEBUG -------------------------------------------------------------------------------------
if(_debug) then {
 ["ALIVE_spawnProfileGroup -> _spawnPosition: %1, _spawnExactLocation: %2, _destinationPosition: %3, _group: %4, _faction: %5, 
 _debug: %6, _waypointPlacementRadius: %7, _waypointType: %8, _waypointMovement: %9, _waypointCompletionRadius: %10, 
 _waypointTimeoutCounters: %11, _waypointFormation: %12, _waypointCombatMode: %13, _waypointBehaviour: %14, 
 _waypointDescription: %15,", _spawnPosition,_spawnExactLocation,_destinationPosition,_group,_faction,_debug,_waypointPlacementRadius,
 _waypointType,_waypointMovement,_waypointCompletionRadius,_waypointTimeoutCounters,_waypointFormation,_waypointCombatMode,
 _waypointBehaviour,_waypointDescription] call ALIVE_fnc_dump;
};
// DEBUG -------------------------------------------------------------------------------------
 
// MAIN -------------------------------------------------------------------------------------
_profiles = [_group, _spawnposition, random(360), _spawnExactLocation, _faction] call ALIVE_fnc_createProfilesFromGroupConfig;
 
 
if(_debug) then { ["ALIVE_spawnProfileGroup -> _groupData: %1, _config: %2, _groupName: %3", _groupData, _config, _groupName] call ALIVE_fnc_dump; };
_profileWaypoint = [_destinationPosition, _waypointPlacementRadius, _waypointType, _waypointMovement, _waypointCompletionRadius, 
 _waypointTimeoutCounters,_waypointFormation, _waypointCombatMode, _waypointBehaviour, _waypointDescription] call ALIVE_fnc_createProfileWaypoint;
 
{ _profile = _x;_profileType = _profile select 2 select 5;
 if(_profileType == "entity") then {[_profile, "addWaypoint", _profileWaypoint] call ALIVE_fnc_profileEntity;};
} forEach _profiles;
 
// MAIN -------------------------------------------------------------------------------------
 
// ====================================================================================


Detect Virtual Units (Profiles) in a Trigger Area

Will be true if there are virtualized AI groups of side EAST (string) within 50 mtrs of the triggers position EAST

((count ([getposATL thisTrigger, 50, ["EAST","entity"]] call ALIVE_fnc_getNearProfiles)) > 0);

Will be true if there are virtualized vehicles of side EAST (string) within 500 mtrs of trigger position EAST

((count ([getposATL thisTrigger, 500, ["EAST","vehicle"]] call ALIVE_fnc_getNearProfiles)) > 0);

Example: Place this line of code in the condition field of an end mission (f.e. lose) trigger, optionally with timeout. It will fire when there are virtualized groups in the selected area (for a certain amount of time). It doesnt matter if they are spawned or not.


Profiling all non profiled units on the map

You can trigger the profiler to profile all non profiled units (handy for MCC and Zeus or scripts that spawn units during gameplay). This function needs to be called on the server locality after a short pause to enable ALiVE to finish initialising:

if (isServer) then {
    [] spawn {
        while {true} do {
            sleep 60;
            [] call ALiVE_fnc_createProfilesFromUnitsRuntime;
        };
    };
};


Adding Custom Inits to Spawned Units

The following is one method for adding custom scripts to every spawned unit or object of that class, for example running a script that adds custom gear to a class of units. This will work for units spawned with MP/MCP, the Profiles system and any other spawning method such as Zeus.

HEALTH WARNING: you will need to know the basics of scripting to setup the gear script so it only applies to AI (and not players) or specific factions. Place the following in description.ext and create my_code.sqf with whatever code you want to add to the spawned units. Also be aware that anything added to player units will duplicate if player persistence is on, so it's better to use regular methods for players (or include isPlayer check in your script).


class Extended_Init_EventHandlers {
 class Man {
  init = "_obj call (compile preprocessFileLineNumbers 'my_script.sqf')";
 };
};


This is an example my_script.sqf thanks to SpyderBlack723 on the BI Forums:

if ((side _obj == west) and (!isPlayer _obj)) then {
  removeallweapons _obj;
  removeGoggles _obj;removeHeadgear _obj;removeVest _obj;removeUniform _obj;removeAllAssignedItems _obj;removeBackpack _obj;
  _obj addHeadgear 'Helmet_ACU';_obj addUniform 'Uniform_ACU';_obj addVest 'Vest_ACU';_obj addBackPack 'ACU_Backpack';
 { _obj addItemToBackpack"rhs_mag_30Rnd_556x45_M855A1_Stanag"; } forEach [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,18, 19, 20, 21];
 { _obj addItemToBackpack "rhs_mag_m67"; } forEach [1, 2, 3, 4];
 { _obj addItemToBackpack "SmokeShell"; } forEach [1, 2, 3, 4];
 { _obj addItem "FirstAidKit"; } forEach [1, 2, 3, 4, 5];
 _obj addweapon 'rhs_m4_grip_acog';_obj addPrimaryWeaponItem 'rhsusf_acc_ACOG';_obj linkItem "ItemMap";
};

OPCOM

Add a Custom OPCOM Objective

This will register a position as an objective to all OPCOMs in the current mission.

Parameters:
 
select 0: _id (String);
select 1: _position (Array);
select 2: _size (Integer);
select 3: _type (String of "MIL" or "CIV");
select 4: _priority (Integer);
 
Code:
 
if (isServer) then {{[_x,"addObjective", ["OPCOM_custom_1", [25657.2,22175.8,0.00129318], 100, "MIL", 200] ] call ALiVE_fnc_OPCOM; } foreach OPCOM_INSTANCES};

Example: Place these lines of code (without the comments) in the on activation field of a "detected by..."-trigger (500mtrs radius). As the trigger fires your base will be registered to all OPCOMs, who will then send troops there (either to attack or defend). You can use these in combination with triggers and tasks. For example if you are detected by a trigger within a certain radius of your base, your base will be registered to OPCOM! OPCOMs will send their troops there and if you don't manage to defend your base the mission will fail.

This little gem comes from Cameroon on the BI Forum. It enables you to set a custom objective on the fly for one side only. The first parameter is an array that is passed straight to ALiVE_fnc_OPCOM - set it as you would when calling addObjective. The second argument is an array of strings for the factions that should get the objective.

It's worth noting that the OPCOM may not immediately notice the new objective and of course it's still prioritized so there might not be any units to send. Also, if you have a marker with the same name as the first argument ("opfoComRetake_obj"), ALIVE will take it over. It is recommended that you do not use a marker name same as the objective name.

Example:[["opforComRetake_obj", getMarkerPos "opforComRetake", 200,"MIL"],["EAST"]] call cjb_addObjectiveToSides;

cjb_addObjectiveToSides = {
	private["_objectiveParams","_factions","_faction","_opcom","_opcomSide"];
	_objectiveParams = _this select 0;
	_factions = _this select 1;
	{
		_opcom = _x;
		{
			_faction = _x;
			_opcomSide = [_opcom,"side",""] call ALiVE_fnc_HashGet;
 
			if( _opcomSide == _faction) then {
				[_opcom, "addObjective", _objectiveParams] call ALiVE_fnc_OPCOM;
			};
		} forEach _factions;
	} forEach OPCOM_INSTANCES;
};

Assign a Custom Group & Vehicle to OPCOM

[your_editor_unit, your_editor_vehicle] spawn ALiVE_fnc_createProfileVehicleAssignment

Can either have an object or a hash passed to it. Note that if OPCOM already has enough groups it may take some time until it uses the newly assigned groups.

For example:

_customVehicleAssignments = [[leader1,vehicle1]];
{
  _leader = _x select 0;
  _vehicle = _x select 1;
  _group = group _leader;
  [_group, _vehicle, true] call ALIVE_fnc_vehicleAssignGroup;
} forEach _customVehicleAssignments;
};


Jump To The Action!

ALiVE_fnc_JoinNearestGroup will select the most important objective that is currently being attacked/defended by your forces and join you to an AI group that is on an assault or defend mission. This will send you directly into the action! Execute the function locally on any player client. Possible params are "attacking" or "defending".

[player,"attacking"] call ALiVE_fnc_OPCOMjoinNearestGroup

ALiVE_fnc_OPCOMJoinObjective will display all objectives that are currently being attacked/defended, lets you select the objective of choice and HALO drops your group to an AI group that is currently ordered to assault/defend this objective! Execute the function locally on any player client. Possible params are "attacking" or "defending".

[player,"attacking"] call ALiVE_fnc_OPCOMjoinObjective

Example: put in the Init field of a unit or object in editor

this addAction ["Select Assault Mission",{[_this select 1,"attacking"] call ALiVE_fnc_OPCOMJoinObjective},[],1,false,true,"","true"];

Modules

Wait for Player Persistence to Initialise

Will wait until the persistent data of a player has been loaded (place in init.sqf f.e.)

waituntil {(player getvariable ["alive_sys_player_playerloaded",false])};

Example: Use this in init.sqf if you have a player-depended scripts and use "player persistence";


Spawning a Custom Composition via Script

_composition = ["mediumMilitaryCamp1"] call ALIVE_fnc_findComposition;
 
if(count _composition > 0) then {
                                [_composition, _position, _direction] call ALIVE_fnc_spawnComposition;
                                };


Pausing Modules

Use the following code on the server to pause and un pause modules completely. Pausing sys_profile will stop all simulation of profiles, and prevent spawning / despawning. Pausing OPCOM will stop OPCOM from issuing orders and running battlefield analysis. Pausing civ_population will stop all civilian AI commands and prevent spawning / despawning.

Pause and unpause the profile system

["ALIVE_SYS_PROFILE"] call ALiVE_fnc_pauseModule;
 
["ALIVE_SYS_PROFILE"] call ALiVE_fnc_unPauseModule;

Pause and unpause a whole lot of modules

["ALIVE_SYS_PROFILE","ALIVE_MIL_OPCOM","ALIVE_AMB_CIV_POPULATION","ALIVE_MIL_LOGISTICS","ALIVE_SYS_AISKILL"] call ALiVE_fnc_pauseModule;
 
["ALIVE_SYS_PROFILE","ALIVE_MIL_OPCOM","ALIVE_AMB_CIV_POPULATION","ALIVE_MIL_LOGISTICS","ALIVE_SYS_AISKILL"] call ALiVE_fnc_unPauseModule;


Adjust Logistics Force Pool

Military Logistics and the Player Resupply module both work from the Global Force Pool to establish the allowed reinforcement levels for a faction. You can adjust this value on the fly in your own missions to add or remove from the global force pool. If running on a dedicated server, this must be performed on the server side only.

if(isServer) then {
 
	// example: get the global force pool count for the BLU_F faction
        _currentBLUFORForcepool = [ALIVE_globalForcePool,"BLU_F"] call ALIVE_fnc_hashGet;
 
        // example: alter the current BLU_F force pool
        [ALIVE_globalForcePool,"BLU_F",20] call ALIVE_fnc_hashSet;
 
};