Module Framework – Arma 3

From Bohemia Interactive Community
Jump to navigation Jump to search
m (Removed: Mention of module icon, no longer needs a standardized frame in Eden)
m (Text replacement - "#redirect " to "#REDIRECT ")
 
(7 intermediate revisions by 5 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 inheriting 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.
* Modules functions are by default <u>not</u> executed when in [[Eden Editor]] workspace. It can be enabled using ''is3DEN'' property, but that will also change format of function params (see the section about writing a function below).
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 global execution, 2 for persistent global 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|// // 1 to run init function in [[Eden Editor]] as well}}
is3DEN = 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''
* Input parameters differ based on value of ''is3DEN'' property.
 
'''Default'''
{{codecomment|// Argument 0 is module logic.}}
_logic = param [0,objNull,[objNull]];
{{codecomment|// Argument 1 is list of affected units (affected by value selected in the 'class Units' argument))}}
_units = param [1,[],<nowiki>[</nowiki>[]]];
{{codecomment|// True when the module was activated, false when it's deactivated (i.e., synced triggers are no longer active)}}
_activated = param [2,true,[true]];
{{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, 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
 
'''Eden Editor Compatible'''
 
When ''is3DEN = 1'' is set in module config, different, more detailed params are passed to the function.
_mode = param [0,"",[""]];
_input = param [1,[],<nowiki>[</nowiki>[]]];
switch _mode do {
{{codecomment|// Default object init}}
case "init": {
_logic = _input param [0,objNull,[objNull]]; {{codecomment|// Module logic}}
_isActivated = _input param [1,true,[true]]; {{codecomment|// True when the module was activated, false when it's deactivated}}
_isCuratorPlaced = _input param [2,false,[true]]; {{codecomment|// True if the module was placed by Zeus}}
{{codecomment|// ... code here...}}
};
{{codecomment|// When some attributes were changed (including position and rotation)}}
case "attributesChanged3DEN": {
_logic = _input param [0,objNull,[objNull]]; {{codecomment|// Module logic}}
{{codecomment|// ... code here...}}
};
{{codecomment|// When added to the world (e.g., after undoing and redoing creation)}}
case "registeredToWorld3DEN": {
_logic = _input param [0,objNull,[objNull]]; {{codecomment|// Module logic}}
{{codecomment|// ... code here...}}
};
{{codecomment|// When removed from the world (i.e., by deletion or undoing creation)}}
case "unregisteredFromWorld3DEN": {
_logic = _input param [0,objNull,[objNull]]; {{codecomment|// Module logic}}
{{codecomment|// ... code here...}}
};
{{codecomment|// When connection to object changes (i.e., new one is added or existing one removed)}}
case "connectionChanged3DEN": {
_logic = _input param [0,objNull,[objNull]]; {{codecomment|// Module logic}}
{{codecomment|// ... code here...}}
};
};
true

Latest revision as of 09:50, 30 December 2020

Redirect to: