Create an Entity – Arma Reforger
A World Editor entity is a scripted entity that can be placed from the World Editor's Create tab.
In this example, we will create an Entity that once placed in the world, will print the player's position with a certain frequency.
Declaration
Entity
Create a new file and name it as your entity - here, we will go with TAG_PrintPlayerPositionEntity so the file should be TAG_PrintPlayerPositionEntity.c.
Entity Class
An Entity requires an Entity Class declaration. This allows it to be visible in World Editor. The name must be exactly the Entity name suffixed by Class, here TAG_PrintPlayerPositionClass. An Entity Class is usually placed just above the Entity definition as such:
The class is decorated using EntityEditorProps; the category is where the Entity will be found in World Editor's Create tab - see below.
EntityEditorProps
- category
- the "Create" tab's category in which the Entity can be found
- description
- unused (for now)
- color
- the bounding box's unselected line colour - useful only when visible is set to true
- visible
- have the bounding box always visible - drawn in color
- configRoot
- unused
- icon
- unused: direct path to a png file, e.g WBData
/EntityEditorProps /entityEditor.png
- style
- can be "none", "box", "sphere", "cylinder", "capsule", "pyramid", "diamond"
- sizeMin
- bounding box's lower dimensions
- sizeMax
- bounding box's higher dimensions
- color2
- the bounding box's surface colour
- dynamicBox
- enables the entity visualiser using custom dimensions (provided by _WB_GetBoundBox)
Filling
The Entity is now visible in World Editor, the next step is to make it do something.
Add Code
Let's use the IEntity's constructor to call code.
Make It Unique
Let's assume we do not want the Print to be displayed multiple times in the case someone placed multiple Entities in the world.
For that we will use the static keyword to keep a single reference:
Add Properties
Now, we can declare properties with the Attribute in order to be able to adjust some settings from the World Editor interface. The following code only contains the added attributes:
The following code contains code with the implemented attributes:
Now all there is to do is to place one TAG_PrintPlayerPositionEntity entity in the world and see the player's position printed in logs!
Final Code
The final file content can be found here:
class TAG_PrintPlayerPositionEntityClass : [./enfusion://ScriptEditor/scripts/GameLib/entities/gameLibEntities.c%3B17 GenericEntityClass] { }
class TAG_PrintPlayerPositionEntity : [./enfusion://ScriptEditor/scripts/GameLib/generated/Entities/GenericEntity.c%3B15 GenericEntity] { [Attribute(defvalue: "1", desc: "Print player position")] protected [./enfusion://ScriptEditor/scripts/Core/generated/Types/bool.c%3B12 bool] m_bPrintPlayerPosition;
[Attribute(defvalue: "1", desc: "Print a message when player is null")] protected [./enfusion://ScriptEditor/scripts/Core/generated/Types/bool.c%3B12 bool] m_bPrintWhenPlayerIsNull;
[Attribute(defvalue: "1", uiwidget: [./enfusion://ScriptEditor/scripts/Core/attributes.c%3B37 UIWidgets].Slider, desc: "Print cycle period (in seconds)", params: "1 30 1")] protected [./enfusion://ScriptEditor/scripts/Core/generated/Types/int.c%3B12 int] m_iCycleDuration;
protected [./enfusion://ScriptEditor/scripts/Core/generated/Types/float.c%3B12 float] m_fWaitingTime = [./enfusion://ScriptEditor/scripts/Core/generated/Types/float.c%3B12 float].MAX; // trigger Print on start
protected static TAG_PrintPlayerPositionEntity s_Instance;
//------------------------------------------------------------------------------------------------ protected void PrintPlayerPosition() { [./enfusion://ScriptEditor/scripts/Game/generated/Player/PlayerController.c%3B16 PlayerController] playerController = GetGame().GetPlayerController(); if (!playerController) return;
[./enfusion://ScriptEditor/scripts/Core/generated/Entities/IEntity.c%3B12 IEntity] player = playerController.GetControlledEntity(); if (!player) { if (m_bPrintWhenPlayerIsNull) Print("Player entity position: no player", [./enfusion://ScriptEditor/scripts/Core/generated/Debug/LogLevel.c%3B13 LogLevel].NORMAL); return; }
Print("Player entity position: " + player.GetOrigin(), [./enfusion://ScriptEditor/scripts/Core/generated/Debug/LogLevel.c%3B13 LogLevel].NORMAL); }
//------------------------------------------------------------------------------------------------ override void EOnFrame([./enfusion://ScriptEditor/scripts/Core/generated/Entities/IEntity.c%3B12 IEntity] owner, [./enfusion://ScriptEditor/scripts/Core/generated/Types/float.c%3B12 float] timeSlice) { m_fWaitingTime += timeSlice; if (m_fWaitingTime < m_iCycleDuration) return;
m_fWaitingTime = 0; PrintPlayerPosition(); }
//------------------------------------------------------------------------------------------------ void TAG_PrintPlayerPositionEntity([./enfusion://ScriptEditor/scripts/Core/generated/Containers/IEntitySource.c%3B12 IEntitySource] src, [./enfusion://ScriptEditor/scripts/Core/generated/Entities/IEntity.c%3B12 IEntity] parent) { if (s_Instance) { Print("Only one instance of TAG_PrintPlayerPositionEntity is allowed in the world!", [./enfusion://ScriptEditor/scripts/Core/generated/Debug/LogLevel.c%3B13 LogLevel].WARNING); delete this; return; }
if (!m_bPrintPlayerPosition) { delete this; return; }
s_Instance = this;
SetFlags([./enfusion://ScriptEditor/scripts/Core/generated/Entities/EntityFlags.c%3B13 EntityFlags].ACTIVE | [./enfusion://ScriptEditor/scripts/Core/generated/Entities/EntityFlags.c%3B13 EntityFlags].NO_LINK, false); SetEventMask( [./enfusion://ScriptEditor/scripts/Core/generated/Entities/EntityEvent.c%3B13 EntityEvent].FRAME); }
}