Action Context Setup – Arma Reforger

From Bohemia Interactive Community
Jump to navigation Jump to search
(Add parameters example courtesy of Spyke#4598 on Discord)
m (Text replacement - "ized" to "ised")
 
(7 intermediate revisions by 2 users not shown)
Line 5: Line 5:


{{Feature|important|
{{Feature|important|
* For user actions to be properly synchronized and work as intended, the entity requires a '''RplComponent'''.
* For user actions to be properly synchronised and work as intended, the entity requires a '''RplComponent'''.
* ActionsManagerComponent is not the same thing as ActionManager. The former manages user actions, the latter input actions!
* ActionsManagerComponent is not the same thing as ActionManager. The former manages user actions, the latter input actions!
* To be able to interact with the entity properly, such entity must have valid physical representation.<!--
* To be able to interact with the entity properly, such entity must have valid physical representation.<!--
Line 18: Line 18:
== Define Context ==
== Define Context ==


Fill the {{hl|ActionContexts}} array with your contexts for this entity.
Fill the {{hl|Action Contexts}} 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 {{hl|Position}} field with valid {{hl|PointInfo}} or derived class instance.
The context name is a unique identifier used to register child actions. Do not forget to fill the {{hl|Position}} field with valid {{hl|PointInfo}} or derived class instance.
The component {{hl|UIInfo}} is required too.
The component {{hl|UIInfo}} is required too.
Line 29: Line 29:
=== General Action ===
=== General Action ===


For general actions use the {{hl|additionalActions}} field in the {{hl|ActionsManagerComponent}}.
For general actions use the {{hl|Additional Actions}} field in the {{hl|ActionsManagerComponent}}.


[[File:armareforger-actioncontext_add_action_general.png|600px]]
[[File:armareforger-actioncontext_add_action_general.png|600px]]
Line 44: Line 44:
=== General Action ===
=== General Action ===


For '''general''' actions add the action straight into the '''"additionalActions"''' field in the '''ActionsManagerComponent'''.
For '''general''' actions add the action straight into the '''"Additional Actions"''' 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.
To set a parent context for our new action add an entry to the '''"Parent Context List"''' field of the action. As the value choose one of the context names you specified in the '''"Action Contexts"''' 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.
If an action should be visible in multiple contexts, add that unique identifier (target context's '''Context Name''') to the "'''Parent Context List'''" too.


[[File:armareforger-actioncontext_setup_action_general.png|600px]]
[[File:armareforger-actioncontext_setup_action_general.png|600px]]
Line 53: Line 53:


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"'''.
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.
To set a parent context for our new action add an entry to the '''"Parent Context List"''' field of the action. As the value choose one of the context names you specified in the '''"Action Contexts"''' 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.
If an action should be visible in multiple contexts, add that unique identifier (target context's '''Context Name''') to the "'''Parent Context List'''" too.


[[File:armareforger-actioncontext_setup_action_component.png|600px]]
[[File:armareforger-actioncontext_setup_action_component.png|600px]]
Line 63: Line 63:
=== Example ===
=== Example ===


<syntaxhighlight lang="c#">
<enforce>
class myTeleportScriptedUserAction : ScriptedUserAction
class TAG_MyTeleportScriptedUserAction : ScriptedUserAction
{
{
[Attribute(defvalue: "", uiwidget: UIWidgets.Coords, desc: "Teleport destination")]
[Attribute(defvalue: "0 0 0", uiwidget: UIWidgets.Coords, desc: "Teleport destination")]
protected vector m_vTeleportDestination;
protected vector m_vTeleportDestination;


Line 80: Line 80:
RandomGenerator randomGenerator = new RandomGenerator();
RandomGenerator randomGenerator = new RandomGenerator();
vector teleportPosition = randomGenerator.GenerateRandomPointInRadius(m_iSpawnMinDist, m_iSpawnMaxDist, m_vTeleportDestination);
vector teleportPosition = randomGenerator.GenerateRandomPointInRadius(m_iSpawnMinDist, m_iSpawnMaxDist, m_vTeleportDestination);
pUserEntity.SetOrigin(destinationPos);
pUserEntity.SetOrigin(teleportPosition);
}
}


Line 100: Line 100:
return true;
return true;
}
}
};
}
</syntaxhighlight>
</enforce>




Line 109: Line 109:


# Create this directory: {{hl|Scripts/Game/generated/UserAction/Modded}}
# Create this directory: {{hl|Scripts/Game/generated/UserAction/Modded}}
# In in, create {{hl|ScriptedUserAction.c}}
# In it, create {{hl|TAG_MyScriptedUserAction.c}}
# Inside this file put this: <syntaxhighlight lang="c#">
# Inside this file put this: <enforce>
class MyScriptedUserAction : ScriptedUserAction
class TAG_MyScriptedUserAction : ScriptedUserAction
{
{
//------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------
override void PerformAction(IEntity pOwnerEntity, IEntity pUserEntity)
override void PerformAction(IEntity pOwnerEntity, IEntity pUserEntity)
{
{
Print("MyScriptedUserAction.PerformAction() method reached");
Print("MyScriptedUserAction.PerformAction() method reached", LogLevel.NORMAL);
SCR_HintManagerComponent.GetInstance().ShowCustomHint("My test ground world - DONE", "TEST GROUND", 3.0);
SCR_HintManagerComponent.GetInstance().ShowCustomHint("My test ground world - DONE", "TEST GROUND", 3.0);
}
}
Line 137: Line 137:
return true;
return true;
}
}
};
}
</syntaxhighlight>
</enforce>


=== World/Entity Setup ===
=== World/Entity Setup ===


# If not present, add an ActionsManagerComponent (read wiky for minimum components present in order to work)
# If not present, add an ActionsManagerComponent (read wiky for minimum components present in order to work)
# Add one {{hl|ActionContext}}
# Add one {{hl|Action Context}}
# In it:
# In it:
#* input some '''ContextName''' (myContext)
#* input some '''Context Name''' (myContext)
#* set '''Position''' to PointInfo and move up the Y offset (you will se the point moving in the world editor)
#* 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 {{hl|ScriptedUserAction.c}}, in this example {{hl|MyScriptedUserAction}}
# Add one Additional Actions selecting your class inside {{hl|TAG_MyScriptedUserAction.c}}, in this example {{hl|TAG_MyScriptedUserAction}}
# In {{hl|Additional Actions/MyScriptedUserAction}}:
# In {{hl|Additional Actions/TAG_MyScriptedUserAction}}:
#* add one parent context list and select the ContextName created before (myContext)
#* add one parent context list and select the Context Name created before (myContext)
#* add '''UiInfo''' and input some '''Name''' to be shown
#* add '''UiInfo''' and input some '''Name''' to be shown
#* set '''visibility range''' to some value, e.g 2
#* set '''visibility range''' to some value, e.g 2

Latest revision as of 21:07, 24 May 2024

Select Entity

Select the entity you want to add contexts and actions into. Select the "ActionsManagerComponent" or add one if it doesn't exist.

  • For user actions to be properly synchronised and work as intended, the entity requires a RplComponent.
  • ActionsManagerComponent is not the same thing as ActionManager. The former manages user actions, the latter input actions!
  • To be able to interact with the entity properly, such entity must have valid physical representation. For most entities, this is already the case. If you are setting up an entity from scratch, please make sure that:
    • Entity has MeshObject component with valid mesh
    • Entity has RigidBody component with Model Geometry checked.

armareforger-actioncontext add component.png


Define Context

Fill the Action Contexts 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.

armareforger-actioncontext add context.png


Add Action Location

General Action

For general actions use the Additional Actions field in the ActionsManagerComponent.

armareforger-actioncontext add action general.png

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.

armareforger-actioncontext add action component.png


Add Action

General Action

For general actions add the action straight into the "Additional Actions" field in the ActionsManagerComponent. To set a parent context for our new action add an entry to the "Parent Context List" field of the action. As the value choose one of the context names you specified in the "Action Contexts" 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 Context Name) to the "Parent Context List" too.

armareforger-actioncontext setup action general.png

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 "Parent Context List" field of the action. As the value choose one of the context names you specified in the "Action Contexts" 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 Context Name) to the "Parent Context List" too.

armareforger-actioncontext setup action component.png


Add Parameters

Example

class TAG_MyTeleportScriptedUserAction : ScriptedUserAction { [Attribute(defvalue: "0 0 0", 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(teleportPosition); } //------------------------------------------------------------------------------------------------ override bool CanBeShownScript(IEntity user) { return true; } //------------------------------------------------------------------------------------------------ override bool CanBePerformedScript(IEntity user) { return true; } //------------------------------------------------------------------------------------------------ override bool HasLocalEffectOnlyScript() { return true; } }


Walkthrough

Script Setup

  1. Create this directory: Scripts/Game/generated/UserAction/Modded
  2. In it, create TAG_MyScriptedUserAction.c
  3. Inside this file put this:
    class TAG_MyScriptedUserAction : ScriptedUserAction { //------------------------------------------------------------------------------------------------ override void PerformAction(IEntity pOwnerEntity, IEntity pUserEntity) { Print("MyScriptedUserAction.PerformAction() method reached", LogLevel.NORMAL); 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

  1. If not present, add an ActionsManagerComponent (read wiky for minimum components present in order to work)
  2. Add one Action Context
  3. In it:
    • input some Context Name (myContext)
    • set Position to PointInfo and move up the Y offset (you will se the point moving in the world editor)
  4. Add one Additional Actions selecting your class inside TAG_MyScriptedUserAction.c, in this example TAG_MyScriptedUserAction
  5. In Additional Actions/TAG_MyScriptedUserAction:
    • add one parent context list and select the Context Name 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
  6. ????
  7. Profit!