Object Oriented scripting shell
During the implementation phase of the Multiplayer Armory, it was decided to make a scripted system which uses as many Object Oriented (OO) techniques as possible (without altering the engine). This page will describe the scripted scripting shell which is used to this effect.
CfgOO
Classes, their attributes and methods are defined in configs:
class CfgOO
{
// Name used in method prefix
class SomeClass
{
// All attributes for this class, which will be configured for
// each instantiated object of this class
class Attributes
{
// Class name determines the name of the attribute in Logic variable space
// Initialized with default value for this type
class someAttribute
{
type = "SCALAR"; // Game variable type (see supported types below) (String)
defaultValue = 0; // Default value [optional] (Any)
};
};
// All methods for this class, which will be precompiled and stored in BIS_OO_<Class>_<Method>
class Methods
{
// Class name determines the name of the method
class SomeMethod
{
parameterTypes[] = { "STRING", "SCALAR" }; // Types of each parameter, used for validation (Array of String)
returnType = "SCALAR"; // The default return value is based on this (String)
script = "path\someMethod.sqf"; // Function implementing the method to precompile (String)
};
};
};
};
Supported types
These are the Data Types supported by the OO shell:
- "SCALAR"
- "STRING"
- "BOOL"
- "ARRAY"
- "OBJECT"
- "CONFIG"
- "GROUP"
- "TASK"
Functions
addClass
This function loads a class in the shell and it precompiles all of its methods. These methods are then stored in global variables with the following name: BIS_OO_<ClassName>_<methodName>.
createObject
To instantiate an object of a loaded class, use this function. It will create a Logic object with all of the defined attributes as variables. This function will also automatically call the class' constructor. This constructor will already receive a reference to the created object as parameter, but additional parameters can be provided.
Example
Config:
class CfgOO
{
class MyClass
{
class Attributes
{
class myAttribute { type = "SCALAR"; };
};
class Methods
{
// Constructor method
class MyClass
{
parameterTypes[] = { "OBJECT" };
script = "path\data\scripts\classes\MyClass\MyClass.sqf";
};
class myMethod
{
parameterTypes[] = { "OBJECT", "SCALAR", "STRING" };
returnType = "SCALAR";
script = "path\data\scripts\classes\MyClass\myMethod.sqf";
};
};
};
};
Script: