Action Context Setup – Arma Reforger
Select Entity
Select the entity you want to add contexts and actions into. Select the "ActionsManagerComponent" or add one if it doesn't exist.
Define Context
Fill the ActionContexts array with your contexts for this entity. The context name is a unique identifier used to register child actions. Do not forget to fill the Position field with valid PointInfo or derived class instance. The component UIInfo is required too.
Add Action Location
General Action
For general actions use the additionalActions field in the ActionsManagerComponent.
Contextual Action
For actions provided by a component (compartments - GetInAction, doors - DoorAction) find the proper component. In this case it will be one of this entity's DoorComponent.
Add Action
General Action
For general actions add the action straight into the "additionalActions" field in the ActionsManagerComponent. To set a parent context for our new action add an entry to the "ParentContextList" field of the action. As the value choose one of the context names you specified in the "ActionContexts" field in the "ActionsManagerComponent". Don't forget to add UIInfo and fill it with desired data. If an action should be visible in multiple contexts, add that unique identifier (target context's ContextName) to the "ParentContextList" too.
Contextual Action
For actions provided by a component add the action to a slot provided by the component. In this case the field "DoorAction" provided by the "DoorComponent". To set a parent context for our new action add an entry to the "ParentContextList" field of the action. As the value choose one of the context names you specified in the "ActionContexts" field in the "ActionsManagerComponent". Don't forget to add UIInfo and fill it with desired data. If an action should be visible in multiple contexts, add that unique identifier (target context's ContextName) to the "ParentContextList" too.
Add Parameters
Example
class myTeleportScriptedUserAction : ScriptedUserAction
{
[Attribute(defvalue: "", uiwidget: UIWidgets.Coords, desc: "Teleport destination")]
protected vector m_vTeleportDestination;
[Attribute(defvalue: "2", uiwidget: UIWidgets.EditBox, desc: "Spawn min. distance")]
protected int m_iSpawnMinDist;
[Attribute(defvalue: "4", uiwidget: UIWidgets.EditBox, desc: "Spawn max. distance")]
protected int m_iSpawnMaxDist;
//------------------------------------------------------------------------------------------------
override void PerformAction(IEntity pOwnerEntity, IEntity pUserEntity)
{
RandomGenerator randomGenerator = new RandomGenerator();
vector teleportPosition = randomGenerator.GenerateRandomPointInRadius(m_iSpawnMinDist, m_iSpawnMaxDist, m_vTeleportDestination);
pUserEntity.SetOrigin(destinationPos);
}
//------------------------------------------------------------------------------------------------
override bool CanBeShownScript(IEntity user)
{
return true;
}
//------------------------------------------------------------------------------------------------
override bool CanBePerformedScript(IEntity user)
{
return true;
}
//------------------------------------------------------------------------------------------------
override bool HasLocalEffectOnlyScript()
{
return true;
}
};
Walkthrough
Script Setup
- Create this directory: Scripts
/Game /generated /UserAction /Modded - In in, create ScriptedUserAction.c
- Inside this file put this:
class MyScriptedUserAction : ScriptedUserAction { //------------------------------------------------------------------------------------------------ override void PerformAction(IEntity pOwnerEntity, IEntity pUserEntity) { Print("MyScriptedUserAction.PerformAction() method reached"); SCR_HintManagerComponent.GetInstance().ShowCustomHint("My test ground world - DONE", "TEST GROUND", 3.0); } //------------------------------------------------------------------------------------------------ override bool CanBeShownScript(IEntity user) { return true; } //------------------------------------------------------------------------------------------------ override bool CanBePerformedScript(IEntity user) { return true; } //------------------------------------------------------------------------------------------------ override bool HasLocalEffectOnlyScript() { return true; } };
World/Entity Setup
- If not present, add an ActionsManagerComponent (read wiky for minimum components present in order to work)
- Add one ActionContext
- In it:
- input some ContextName (myContext)
- set Position to PointInfo and move up the Y offset (you will se the point moving in the world editor)
- Add one Additional Actions selecting your class inside ScriptedUserAction.c, in this example MyScriptedUserAction
- In Additional Actions
/MyScriptedUserAction: - add one parent context list and select the ContextName created before (myContext)
- add UiInfo and input some Name to be shown
- set visibility range to some value, e.g 2
- set duration to some value, e.g 2
- ????
- Profit!