Module Framework – Arma 3

From Bohemia Interactive Community
Jump to navigation Jump to search
No edit summary
m (Text replacement - "#redirect " to "#REDIRECT ")
 
(12 intermediate revisions by 7 users not shown)
Line 1: Line 1:
[[Category:Arma_3:_Editing|Module Framework]]
#REDIRECT [[Modules]]
 
Arma 3 introduces a module framework, which lets designer to simplify the configuration and chose how the module function will be executed (e.g., globally and for every player who joins later).
 
== How to Create a Module ==
When creating a new module, follow these steps:
<ol starts="4">
<li><big>'''Create a module addon.'''</big></li>
* Make a folder named ''<span style="color:indigo">myTag</span>_addonName'' a create a ''config.cpp'' file in it.
* Inside, declare a CfgPatches class with your addon and its modules (in the ''units'' array). Without this, the game wouldn't recognize the addon.
* Make sure the addon and all objects start with your tag, e.g. <span style="color:indigo">myTag</span>
class CfgPatches
{
class <span style="color:indigo">myTag</span>_addonName
{
units[] = {"<span style="color:indigo">myTag</span>_<span style="color:green">Module</span><span style="color:orangered;">Nuke</span>"};
requiredVersion = 1.0;
requiredAddons[] = {"A3_Modules_F"};
};
};
 
 
<li><big>'''Select a module category'''</big></li>
* Modules are placed into basic categories which makes finding a desired module easier for an user. Use can use on of the existing categories:
{| class = "wikitable"
! class
! displayName
|-
| ''Effects''
| Effects
|-
| ''Events''
| Events
|-
| ''Modes''
| Gameplay Modes
|-
| ''GroupModifiers''
| Group Modifiers
|-
| ''Intel''
| Intel
|-
| ''NO_CATEGORY''
| Misc
|-
| ''Multiplayer''
| Multiplayer
|-
| ''ObjectModifiers''
| Object Modifiers
|-
| ''Sites''
| Sites
|-
| ''StrategicMap''
| Strategic
|-
| ''Supports''
| Supports
|}
Alternatively, you can create your own one:
class CfgFactionClasses
{
class NO_CATEGORY;
class <span style="color:indigo">myTag</span>_<span style="color:teal">explosions</span>: NO_CATEGORY
{
displayName = "Explosions";
};
};
 
 
<li><big>'''Create config for module logic'''</big></li>
* All in-game objects (soldiers, vehicles, buildings, logics, modules, ...) are defined in ''CfgVehicles'' class.
* '''All modules must inherit from Module_F''' parent class, either directly or through some additional sub-parent. While modules inherting from some other class will be still displayed in the Modules menu (F7), they won't be using the module framework and all benefits tied to it.
class CfgVehicles
{
class Logic;
class Module_F: Logic
{
class ArgumentsBaseUnits
{
class Units;
};
class ModuleDescription
{
class AnyBrain;
};
};
class <span style="color:indigo">myTag</span>_<span style="color:green">Module</span><span style="color:orangered;">Nuke</span>: Module_F
{
{{codecomment|// Standard object definitions}}
scope = 2; {{codecomment|// Editor visibility; 2 will show it in the menu, 1 will hide it.}}
displayName = "Nuclear Explosion"; {{codecomment|// Name displayed in the menu}}
icon = "\<span style="color:indigo">myTag</span>_addonName\data\icon<span style="color:orangered;">Nuke</span>_ca.paa"; {{codecomment|// Map icon. Delete this entry to use the default icon}}
category = "<span style="color:teal">Effects</span>";
{{codecomment|// Name of function triggered once conditions are met}}
function = "<span style="color:indigo">myTag</span>_fnc_module<span style="color:orangered;">Nuke</span>";
{{codecomment|// Execution priority, modules with lower number are executed first. 0 is used when the attribute is undefined}}
functionPriority = 1;
{{codecomment|// 0 for server only execution, 1 for remote execution on all clients upon mission start, 2 for persistent execution}}
isGlobal = 1;
{{codecomment|// 1 for module waiting until all synced triggers are activated}}
isTriggerActivated = 1;
{{codecomment|// 1 if modules is to be disabled once it's activated (i.e., repeated trigger activation won't work)}}
isDisposable = 1;
{{codecomment|// Menu displayed when the module is placed or double-clicked on by Zeus}}
curatorInfoType = "RscDisplayAttribute<span style="color:green">Module</span><span style="color:orangered;">Nuke</span>";
{{codecomment|// Module arguments}}
class Arguments: ArgumentsBaseUnits
{
{{codecomment|// Arguments shared by specific module type (have to be mentioned in order to be placed on top)}}
class Units: Units {};
{{codecomment|// Module specific arguments}}
class Yield
  {
displayName = "Nuclear weapon yield"; {{codecomment|// Argument label}}
description = "How strong will the explosion be"; {{codecomment|// Tooltip description}}
typeName = "NUMBER"; {{codecomment|// Value type, can be "NUMBER", "STRING" or "BOOL"}}
class values
{
class 50Mt {name = "50 megatons"; value = 50; default = 1;}; {{codecomment|// Listbox item}}
class 100Mt {name = "100 megatons"; value = 100;};
};
};
class Name
  {
displayName = "Name";
description = "Name of the nuclear device";
defaultValue = "Tsar Bomba"; {{codecomment|// Default text filled in the input box}}
{{codecomment|// When no 'values' are defined, input box is displayed instead of listbox}}
};
};
{{codecomment|// Module description. Must inherit from base class, otherwise pre-defined entities won't be available}}
class ModuleDescription: ModuleDescription
{
description = "Short module description"; {{codecomment|// Short description, will be formatted as structured text}}
sync[] = {"LocationArea_F"}; {{codecomment|// Array of synced entities (can contain base classes)}}
class LocationArea_F
{
description[] = { {{codecomment|// Multi-line descriptions are supported}}
"First line",
"Second line"
};
position = 1; {{codecomment|// Position is taken into effect}}
direction = 1; {{codecomment|// Direction is taken into effect}}
optional = 1; {{codecomment|// Synced entity is optional}}
duplicate = 1; {{codecomment|// Multiple entities of this type can be synced}}
synced[] = {"BLUFORunit","AnyBrain"}; {{codecomment|// Pre-define entities like "AnyBrain" can be used. See the list below}}
};
class BLUFORunit
{
description = "Short description";
displayName = "Any BLUFOR unit"; {{codecomment|// Custom name}}
icon = "iconMan"; {{codecomment|// Custom icon (can be file path or CfgVehicleIcons entry)}}
side = 1; {{codecomment|// Custom side (will determine icon color)}}
};
};
};
};
[[File:A3 modules info.jpg|300px|thumb|In the game, the description is available after clicking on "Show Info" button when inserting / editing the module]]
* Pre-defined sync preview entities are:
** '''Anything''' - Any object - persons, vehicles, static objects, etc.
** '''AnyPerson''' - Any person. Not vehicles or static objects.
** '''AnyVehicle''' - Any vehicle. No persons or static objects.
** '''AnyStaticObject''' - Any static object. Not persons or vehicles.
** '''AnyBrain''' - Any AI or player. Not empty objects
** '''AnyAI''' - Any AI unit. Not players or empty objects
** '''AnyPlayer''' - Any player. Not AI units or empty objects
** '''EmptyDetector''' - Any trigger
 
 
<li><big>'''Configure a module function'''</big></li>
* Place '' class CfgFunctions'' to ''config.cpp''. See [[Functions Library (Arma 3)]] for more info about functions configuration.
class CfgFunctions
{
class <span style="color:indigo">myTag</span>
{
class <span style="color:teal">Effects</span>
{
file = "\<span style="color:indigo">myTag</span>_addonName\functions";
class <span style="color:green">module</span><span style="color:orangered;">Nuke</span>{};
};
};
};
 
 
<li><big>'''Write the module function</big></li>
* Create the ''functions'' folder within the addon folder and place *.sqf or *.fsm files there.
* Example: ''\<span style="color:indigo">myTag</span>_addonName\functions\fn_<span style="color:green">module</span><span style="color:orangered;">Nuke</span>.sqf''
{{codecomment|// Argument 0 is module logic.}}
_logic = [_this,0,objNull,[objNull]] call [[BIS_fnc_param]];
{{codecomment|// Argument 1 is list of affected units (affected by value selected in the 'class Units' argument))}}
_units = [_this,1,[],[[]]] call BIS_fnc_param;
{{codecomment|// True when the module was activated, false when it's deactivated (i.e., synced triggers are no longer active)}}
_activated = [_this,2,true,[true]] call BIS_fnc_param;
{{codecomment|// Module specific behavior. Function can extract arguments from logic and use them.}}
if (_activated) then {
{{codecomment|// ... Splendid code here ...}}
{{codecomment|// If you'd like to access customly defined arguments' values as entered in the editor, }}
{{codecomment|// you'll need to use "getVariable" from _logic, example:}}
_bombYield = _logic getVariable "Yield"; {{codecomment|//(as per the previous example, but you can define your own.) }}
hint format ["Bomb yield is: %1", _bombYield ]; {{codecomment|// will display the bomb yield in once the game is started }}
};
{{codecomment|// Module function is executed by [[spawn]] command, so returned value is not necessary.}}
{{codecomment|// However, it's a good practice to include one.}}
true
 
 
<li><big>'''Create a module icon</big></li>
<div style="background-color:grey; width:64px; height:64px; float:left; margin-right:30px;">
[[File:IconModule_ca.png]]</div>
# Right click on the image on left and ''Save Image As''' to get the default module icon.
# Create a simple icon presenting the module in the circle. Avoid using too much detail, as the icon may downsized in the game.
# Save the image to ''\<span style="color:indigo">myTag</span>_addonName\data\icon<span style="color:orangered;">Nuke</span>_ca.paa''
If you cannot or don't want to create a custom image, avoid using ''icon'' entry in the module config. The default icon will then be inherited from Module_F base class.

Latest revision as of 10:50, 30 December 2020

Redirect to: