|
|
(15 intermediate revisions by 7 users not shown) |
Line 1: |
Line 1: |
| [[Category:Arma_3:_Editing]] | | #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|// 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|// 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.
| |