Firing Drills – Arma 3

From Bohemia Interactive Community
Jump to navigation Jump to search
m (Added CfgFiringDrills section)
m (Add magazinesCompetitor[] = { "16Rnd_9x21_Mag" } on "OPSEC" Discord user request)
Line 1: Line 1:
[[Category:Arma 3: Editing|Firing Drills]]
{{SideTOC}}
{{Cfg ref|abc}}
{{Cfg ref|abc}}
{{SideTOC}}


= Introduction =
This guide will describe how to design and implement a custom Firing Drill Challenge as available in the vanilla game.
This guide will describe how to design and implement a custom Firing Drill Challenge as available in the vanilla game.


Line 9: Line 7:
{{wip}}
{{wip}}


= Terminology =


= Terminology =
* '''Firing Drill (FD)''' - a live-fire exercise in which a competitor is graded for tactically moving through a course while engaging a set of targets
* '''Firing Drill (FD)''' - a live-fire exercise in which a competitor is graded for tactically moving through a course while engaging a set of targets
* '''Competitor''' - the actor performing the drill
* '''Competitor''' - the actor performing the drill
Line 36: Line 33:




= Setup =


= Setup =
{{Important|At time of writing it is not possible to add new Firing Drills as independent (Workshop) scenarios; they need to be added as 'mods' with configuration.}}
{{Important|At time of writing it is not possible to add new Firing Drills as independent (Workshop) scenarios; they need to be added as 'mods' with configuration.}}
# Insert a player character named {{Inline code|BIS_FD_Competitor}} {{cc|Fixed system name}}
# Insert a player character named {{Inline code|BIS_FD_Competitor}} {{cc|Fixed system name}}
Line 74: Line 70:


== Moving Targets ==
== Moving Targets ==
== Randomized Targets ==
== Randomized Targets ==
== Common Additions ==
== Common Additions ==
* CP marking objects
* CP marking objects
** Recolored objects
** Recolored objects
Line 81: Line 81:
* Ammunition containers
* Ammunition containers
* Decorative props / sponsoring
* Decorative props / sponsoring


= Configuration =
= Configuration =
== CfgFiringDrills ==
== CfgFiringDrills ==
=== Drill ===
=== Drill ===
<syntaxhighlight lang="cpp">
<syntaxhighlight lang="cpp">
class MyFirstFiringDrill //This class name must correspond to the missionName (also CfgMissions class)
class MyFirstFiringDrill // This class name must correspond to the missionName (also CfgMissions class)
{
{
displayName = "CoF: My First Drill"; //Vanilla drills use a format like this, but it's not enforced
displayName = "CoF: My First Drill"; // Vanilla drills use a format like this, but it's not enforced
//This color is used in many places
// This color is used in many places
//It can be any color, but for best results pick a fully supported color (see section below)
// It can be any color, but for best results pick a fully supported color (see section below)
color[] = {__EVAL(177/255), __EVAL(51/255), __EVAL(57/255), 1};
color[] = { __EVAL(177/255), __EVAL(51/255), __EVAL(57/255), 1 };
colorName = "red"; //This version of the color is more restrictive and can only use specific supported colors (see section below)
colorName = "red"; // This version of the color is more restrictive and can only use specific supported colors (see section below)
objectCOF = "BIS_FD_COF"; //The CoF trigger referenced in the setup guide
objectCOF = "BIS_FD_COF"; // The CoF trigger referenced in the setup guide
//statistic = ""; //Steam stats are not supported for user-generated drills (used for Achievements)
// statistic = ""; // Steam stats are not supported for user-generated drills (used for Achievements)
onReset = "reset.sqf"; //This script is executed each time the drill resets (restarts)
onReset = "reset.sqf"; // This script is executed each time the drill resets (restarts)
//leaderboard = ""; //Steam Leaderboards are not supported for user-generated drills
// leaderboard = ""; // Steam Leaderboards are not supported for user-generated drills
//List any number of objects that you want to be re-colored to the drill color above (f.e. road cones, small flags, etc.)
// List any number of objects that you want to be re-colored to the drill color above (f.e. road cones, small flags, etc.)
recolor[] =
recolor[] =
{
{
Line 105: Line 110:
};
};


//Set up objects that should have special decal textures applied (this was more useful before Eden Editor - see vanilla decals below)
// Set up objects that should have special decal textures applied (this was more useful before Eden Editor - see vanilla decals below)
//In vanilla drills these are often graffiti on wooden shoot house walls
// In vanilla drills these are often graffiti on wooden shoot house walls
decals[] =
decals[] =
{
{
{"BIS_FD_decal1", "A3\Missions_F_Beta\data\img\decals\decal_sidearm1_ca", 5} //Object reference, texture path, hidden selection index
{ "BIS_FD_decal1", "A3\Missions_F_Beta\data\img\decals\decal_sidearm1_ca", 5 } // Object reference, texture path, hidden selection index
};
};


//Object references to the 4 special targets for drill mechanics, as defined in the setup guide
// Object references to the 4 special targets for drill mechanics, as defined in the setup guide
ruleSelectors[] =  
ruleSelectors[] =  
{
{
Line 118: Line 123:
"BIS_FD_ruleSelector2"
"BIS_FD_ruleSelector2"
};
};
restartSelectors[] = {"BIS_FD_restartSelector1"};
restartSelectors[] = { "BIS_FD_restartSelector1" };
quitSelectors[] = {"BIS_FD_quitSelector1"};
quitSelectors[] = { "BIS_FD_quitSelector1" };
containersWeapons[] = {"BIS_weaponsFD1"}; //All containers that should be filled with the drill weapons
containersWeapons[] = { "BIS_weaponsFD1" }; // All containers that should be filled with the drill weapons
containersMagazines[] = {"BIS_ammoFD1_1", "BIS_ammoFD1_2", "BIS_ammoFD1_3", "BIS_ammoFD1_4"}; //All containers that should be filled with the drill ammunition
containersMagazines[] = { "BIS_ammoFD1_1", "BIS_ammoFD1_2", "BIS_ammoFD1_3", "BIS_ammoFD1_4" }; // All containers that should be filled with the drill ammunition
containersMagazinesCount[] = {10, 10}; //The count of magazines of each type in the containers
containersMagazinesCount[] = { 10, 10 }; // The count of magazines of each type in the containers
weapons[] = {"SMG_02_ACO_F", "hgun_Rook40_F"}; //The legal weapons for this drill
weapons[] = { "SMG_02_ACO_F", "hgun_Rook40_F" }; // The legal weapons for this drill
magazines[] = {"30Rnd_9x21_Mag", "16Rnd_9x21_Mag"}; //The legal magazines for this drill
magazines[] = { "30Rnd_9x21_Mag", "16Rnd_9x21_Mag" }; // The legal magazines for this drill
weaponsCompetitor[] = {"SMG_02_ACO_F", "hgun_Rook40_F"}; //The starting weapons for the competitor
weaponsCompetitor[] = { "SMG_02_ACO_F", "hgun_Rook40_F" }; // The starting weapons for the competitor
magazinesCompetitorCount = 6; //The starting magazine count per weapon for the competitor
magazinesCompetitor[] = { "16Rnd_9x21_Mag" }; // starting magazines
magazinesCompetitorCount = 6; // The starting magazine count per weapon for the competitor
timesMedals[] = {60, 45, 30}; //Bronze, silver, gold medal times (be sure to follow this order or results may glitch)
timesMedals[] = { 60, 45, 30 }; // Bronze, silver, gold medal times (be sure to follow this order or results may glitch)
timeSpecial = 15; //Optional special time that is faster than gold (when defining this, you do need to also provide the data below)
timeSpecial = 15; // Optional special time that is faster than gold (when defining this, you do need to also provide the data below)
nameSpecial = "Nemisis"; //Optional special time label for the HUD
nameSpecial = "Nemisis"; // Optional special time label for the HUD
colorSpecial = "#ffa500"; //Optional special time color for the HUD
colorSpecial = "#ffa500"; // Optional special time color for the HUD
iconSpecial = "\A3\Ui_f\data\GUI\Cfg\Ranks\colonel_gs"; //Optional special time icon for the HUD
iconSpecial = "\A3\Ui_f\data\GUI\Cfg\Ranks\colonel_gs"; // Optional special time icon for the HUD
//Rule-set parameters for competitive and training
// Rule-set parameters for competitive and training
//All vanilla drills use these same settings
// All vanilla drills use these same settings
//It is possible to tweak these values, but that will likely create confusion for players!
// It is possible to tweak these values, but that will likely create confusion for players!
class RuleSets  
class RuleSets  
{
{
//CP mode: 1 - CPs on but targets don't need shooting / 2 - CPs on and all non-optional targets need shooting
// CP mode: 1 - CPs on but targets don't need shooting / 2 - CPs on and all non-optional targets need shooting
//Target randomization: rule not used - ignored
// Target randomization: rule not used - ignored
//Weapons used: 1 - any weapon can be used everywhere / 2 - CPs may define a required weapon (or incur a time penalty)
// Weapons used: 1 - any weapon can be used everywhere / 2 - CPs may define a required weapon (or incur a time penalty)
//Shooting boxes: 1 - shooting boxes in CPs are ignored / 2 - shooting boxes in CPs are forced (shooting outside of them incurs a time penalty)
// Shooting boxes: 1 - shooting boxes in CPs are ignored / 2 - shooting boxes in CPs are forced (shooting outside of them incurs a time penalty)
//Stances used: 1 - any stance can be used everywhere / 2 - CPs may define a required stance (or incur a time penalty)
// Stances used: 1 - any stance can be used everywhere / 2 - CPs may define a required stance (or incur a time penalty)
//Medals: 0 - medal times are not tracked / 1 - medal times are tracked and feedback is given  
// Medals: 0 - medal times are not tracked / 1 - medal times are tracked and feedback is given  
competitive[] = {2, 0, 2, 2, 2, 1};
competitive[] = { 2, 0, 2, 2, 2, 1 };
training[] = {1, 2, 1, 1, 1, 0};
training[] = { 1, 2, 1, 1, 1, 0 };
};
};
class DynOs {}; //Legacy class used before Eden Editor to load precise object compositions (should not be needed anymore)
class DynOs {}; // Legacy class used before Eden Editor to load precise object compositions (should not be needed anymore)


//All of the drill's CPs
// All of the drill's CPs
class CheckPoints  
class CheckPoints  
{
{
class CP1 //Start
class CP1 // Start
{
{
object = "BIS_FD_CP1"; //The CP trigger referenced in the setup guide
object = "BIS_FD_CP1"; // The CP trigger referenced in the setup guide
};
};
class CP2 //CP #1
class CP2 // CP #1
{
{
object = "BIS_FD_CP2";
object = "BIS_FD_CP2";
};
};
class CP3 //Finish
class CP3 // Finish
{
{
object = "BIS_FD_CP3";
object = "BIS_FD_CP3";
Line 173: Line 179:


=== System ===
=== System ===
== CfgMissions ==
== CfgMissions ==




Line 180: Line 187:




= Run-Time Overrides =


= Run-Time Overrides =
* TODO: Competitor weapons / magazines
* TODO: Competitor weapons / magazines




= Colors =


= Colors =
TODO
TODO




= Decals =
= Decals =
TODO


* TODO




= Tips =
= Tips =
* Vanilla CoFs are designed to be somewhat realistic and safe as a non-lethal competitive shooting training / sport. Try to imagine and implement range safety concerns in your target and prop placement. For example, don't place targets in a line of sight of the start, Range Officer, or other spectators. Generally try to solidly block off areas behind targets where possible.
* Vanilla CoFs are designed to be somewhat realistic and safe as a non-lethal competitive shooting training / sport. Try to imagine and implement range safety concerns in your target and prop placement. For example, don't place targets in a line of sight of the start, Range Officer, or other spectators. Generally try to solidly block off areas behind targets where possible.
[[Category:Arma 3: Editing|Firing Drills]]

Revision as of 00:09, 21 October 2020

Template:SideTOC Template:Cfg ref

This guide will describe how to design and implement a custom Firing Drill Challenge as available in the vanilla game.

See also: Arma 3 Field Manual - Firing Drills (for players) Template:wip

Terminology

  • Firing Drill (FD) - a live-fire exercise in which a competitor is graded for tactically moving through a course while engaging a set of targets
  • Competitor - the actor performing the drill
  • Range Officer (RO) - the actor observing the drill and providing feedback / guidance
  • Course of Fire (CoF) - the physical space and layout in which the drill is performed
  • Checkpoint (CP) - a navigation point within a course which a competitor must follow in a fixed sequence (if so defined as a rule - see below)
    • The first CP is the start.
    • The last CP is the finish.
    • A strict CP contains a shooting box (marked area) from which to fire.
  • Target - an artificial object shot to complete a drill or to receive time bonuses
    • Appearing targets appear and disappear based on activation triggers (see below).
    • Accuracy targets contain zones corresponding to extra time bonuses.
    • Moving targets travel on rails between positions.
    • No-shoot targets are not allowed be hit (adding a time penalty).
    • Bonus targets are optional (rewarding a time bonus).
  • Rule - these help to determine the completion and scoring conditions for a drill
    • Training rules - a rule-set allowing familiarization of the CoF (targets at CPs do not need to be shot to move on)
    • Competitive rules - a rule-set used for Achievements / Leaderboards (targets at CPs need to be shot to move on)
  • Time - the time from the start it takes to complete a drill (raw)
    • Time bonuses / penalties are substracted / added to arrive at the final time.
    • The fastest / lowest time is the best and wins.
    • There are bronze, silver and gold medal times to beat.
    • There may be one special time to beat (typically faster than gold).


Setup

At time of writing it is not possible to add new Firing Drills as independent (Workshop) scenarios; they need to be added as 'mods' with configuration.
  1. Insert a player character named BIS_FD_Competitor // Fixed system name
  2. Insert a NPC Range Master character of type B_RangeMaster_F named BIS_rangeOfficer // Fixed system name
  3. Insert a Firing Drill module
    1. It's not exposed in Eden Editor, so place any other module. We may change this after this documentation is completed.
    2. Save the scenario.
    3. Close Eden Editor to avoid auto-saves.
    4. Open the scenario SQM file in a text editor.
    5. Replace the module's class by ModuleFiringDrill_F.
    6. Save the SQM.
    7. Re-open the scenario in Eden Editor.
  4. Insert an ellipse trigger with default properties named f.e. BIS_FD_COF // Referenced later
    1. Re-size the trigger to encompass your entire CoF and a little extra buffer area (you'll likely re-size it later as you progress).
  5. For each CP (including start and finish), insert a trigger with default properties named f.e. BIS_FD_CP1 // Referenced later
    1. Re-size the trigger to meet your CP activation expectations.
  6. Insert a Target - Oval (Ground) prop named BIS_FD_ruleSelector1 // Referenced later
    1. Using a similar workflow as above, manually change its class name to Land_Target_Oval_NoPop_F (all targets need their hidden NoPop variant).
    2. Position this target in comfortable shooting range / direction from the start CP (a few meters at most, oriented to be clearly visible and safe).
    3. In the target's Texture #0 field, enter: A3\modules_f_beta\data\FiringDrills\training_gray_ca // Other colors have corresponding textures - see below
  7. Copy and paste the first rule target and name it BIS_FD_ruleSelector2 // Referenced later
    1. Position it near the first rule target, typically right from it.
    2. In the target's Texture #0 field, enter: A3\modules_f_beta\data\FiringDrills\competitive_gray_ca // Other colors have corresponding textures - see below
  8. Copy and paste a rule target and name it BIS_FD_restartSelector1 // Referenced later
    1. Position it near the finish CP (a few meters from it, oriented to be clearly visible and safe).
    2. In the target's Texture #0 field, enter: A3\modules_f_beta\data\FiringDrills\restart_gray_ca // Other colors have corresponding textures - see below
  9. Copy and paste a rule target and name it BIS_FD_quitSelector1 // Referenced later
    1. Position it near the restart target, typically right from it.
    2. In the target's Texture #0 field, enter: A3\modules_f_beta\data\FiringDrills\quit_ca // Fixed texture no matter the drill color
  10. For each target at each CP, generally do the following (more specifics detailed below):
    1. Insert the desired target object named f.e. BIS_FD_target2_1 // Referenced later (apply a logical naming pattern, such as numbering based on CP index and target index)
    2. Using a similar workflow as above, manually replace its class name with the corresponding NoPop variant (see the look-up table below).
  11. TODO: description.ext
  12. Configure your drill via CfgFiringDrills and CfgMissions (see below).

Moving Targets

Randomized Targets

Common Additions

  • CP marking objects
    • Recolored objects
  • Start whiteboard
  • Ammunition containers
  • Decorative props / sponsoring


Configuration

CfgFiringDrills

Drill

class MyFirstFiringDrill // This class name must correspond to the missionName (also CfgMissions class)
{
	displayName = "CoF: My First Drill"; // Vanilla drills use a format like this, but it's not enforced
	// This color is used in many places
	// It can be any color, but for best results pick a fully supported color (see section below)
	color[] = { __EVAL(177/255), __EVAL(51/255), __EVAL(57/255), 1 };
	colorName = "red"; // This version of the color is more restrictive and can only use specific supported colors (see section below)
	objectCOF = "BIS_FD_COF"; // The CoF trigger referenced in the setup guide
	// statistic = ""; // Steam stats are not supported for user-generated drills (used for Achievements)
	onReset = "reset.sqf"; // This script is executed each time the drill resets (restarts)
	// leaderboard = ""; // Steam Leaderboards are not supported for user-generated drills
	
	// List any number of objects that you want to be re-colored to the drill color above (f.e. road cones, small flags, etc.)
	recolor[] =
	{
		"BIS_FD_recolor1", 
		"BIS_FD_recolor2"
	};

	// Set up objects that should have special decal textures applied (this was more useful before Eden Editor - see vanilla decals below)
	// In vanilla drills these are often graffiti on wooden shoot house walls
	decals[] =
	{
		{ "BIS_FD_decal1", "A3\Missions_F_Beta\data\img\decals\decal_sidearm1_ca", 5 } // Object reference, texture path, hidden selection index
	};

	// Object references to the 4 special targets for drill mechanics, as defined in the setup guide
	ruleSelectors[] = 
	{
		"BIS_FD_ruleSelector1", 
		"BIS_FD_ruleSelector2"
	};
	restartSelectors[] = { "BIS_FD_restartSelector1" };
	quitSelectors[] = { "BIS_FD_quitSelector1" };
		
	containersWeapons[] = { "BIS_weaponsFD1" }; // All containers that should be filled with the drill weapons
	containersMagazines[] = { "BIS_ammoFD1_1", "BIS_ammoFD1_2", "BIS_ammoFD1_3", "BIS_ammoFD1_4" }; // All containers that should be filled with the drill ammunition
	containersMagazinesCount[] = { 10, 10 }; // The count of magazines of each type in the containers
	weapons[] = { "SMG_02_ACO_F", "hgun_Rook40_F" }; // The legal weapons for this drill
	magazines[] = { "30Rnd_9x21_Mag", "16Rnd_9x21_Mag" }; // The legal magazines for this drill
	weaponsCompetitor[] = { "SMG_02_ACO_F", "hgun_Rook40_F" }; // The starting weapons for the competitor
	magazinesCompetitor[] = { "16Rnd_9x21_Mag" }; // starting magazines
	magazinesCompetitorCount = 6; // The starting magazine count per weapon for the competitor
		
	timesMedals[] = { 60, 45, 30 }; // Bronze, silver, gold medal times (be sure to follow this order or results may glitch)
		
	timeSpecial = 15; // Optional special time that is faster than gold (when defining this, you do need to also provide the data below)
	nameSpecial = "Nemisis"; // Optional special time label for the HUD
	colorSpecial = "#ffa500"; // Optional special time color for the HUD
	iconSpecial = "\A3\Ui_f\data\GUI\Cfg\Ranks\colonel_gs"; // Optional special time icon for the HUD
	
	// Rule-set parameters for competitive and training
	// All vanilla drills use these same settings
	// It is possible to tweak these values, but that will likely create confusion for players!
	class RuleSets 
	{
		// CP mode: 1 - CPs on but targets don't need shooting / 2 - CPs on and all non-optional targets need shooting
		// Target randomization: rule not used - ignored
		// Weapons used: 1 - any weapon can be used everywhere / 2 - CPs may define a required weapon (or incur a time penalty)
		// Shooting boxes: 1 - shooting boxes in CPs are ignored / 2 - shooting boxes in CPs are forced (shooting outside of them incurs a time penalty)
		// Stances used: 1 - any stance can be used everywhere / 2 - CPs may define a required stance (or incur a time penalty)
		// Medals: 0 - medal times are not tracked / 1 - medal times are tracked and feedback is given 
		competitive[] = { 2, 0, 2, 2, 2, 1 };
		training[] = { 1, 2, 1, 1, 1, 0 };
	};
	
	class DynOs {}; // Legacy class used before Eden Editor to load precise object compositions (should not be needed anymore)

	// All of the drill's CPs
	class CheckPoints 
	{
		class CP1 // Start
		{
			object = "BIS_FD_CP1"; // The CP trigger referenced in the setup guide
		};
		class CP2 // CP #1
		{
			object = "BIS_FD_CP2";
		};
		class CP3 // Finish
		{
			object = "BIS_FD_CP3";
		};
	};
};

System

CfgMissions

Targets

Run-Time Overrides

  • TODO: Competitor weapons / magazines


Colors

TODO


Decals

  • TODO


Tips

  • Vanilla CoFs are designed to be somewhat realistic and safe as a non-lethal competitive shooting training / sport. Try to imagine and implement range safety concerns in your target and prop placement. For example, don't place targets in a line of sight of the start, Range Officer, or other spectators. Generally try to solidly block off areas behind targets where possible.