Scenario Framework – Arma Reforger
The goal of the Scenario Framework is to provide scenario creators simple way how to build their scenarios using World Editor without any scripting knowledge. It is expected that scenario creators are already familiar with the basic usage of World Editor. However, most of the work is done by drag and dropping components into the world and adjusting the attributes which is the least difficult and with using just that, you can build even more complex scenarios.
As always, people with scripting knowledge can modify and expand the framework to suit their needs.
Contents
|
Prerequisites
In order to properly work with the Scenario Framework, you need to have several things already set in your world that you are already working on. For this, we have created a very simple way how to setup any functional world on its own using the World Editor Plugin called Game Mode Setup. Here, you can choose from several Game Mode Templates, but for the Scenario Framework, you will want to use the ScenarioFramework.conf variant.
However if you do not want to use this Prefab, note that it contains the following Prefabs that are needed for an optimal functionality of your scenario:
- GameModeSF.et
- SCR_AIWorld.et
- FactionManager_USxUSSR.et
- LoadoutManager_USxUSSR.et
- RadioManager.et
- PerceptionManager.et
- TagManager.et
- ScriptedChatEntity.et
and in the Game Mode's Mission Header, SCR_MissionHeaderCombatOps is used.
Basics
Scenario Framework has a hierarchical setup which upon getting familiar with, you will be able to build your scenarios very quickly and do many interesting things. Once you have your world properly setup with all the requirements listed above, you are ready to build.
GameMode Manager Settings
The core entity of each Scenario is the GameMode entity. In the case of Scenario Framework, it is recommended to use the GameModeSF.et Prefab. It has many components already added to it and they can be adjusted according to your needs. It is recommended to go through them all and explore the possibilities that each component gives you.
The most important component on this GameMode is the SCR_GameModeSFManager which allows you to use the properties listed below.
Tasks
Task Types Available - Setup a random task generation on scenario start by setting which Task Types are available
Max Number Of Tasks - Maximal number of tasks that will get spawned using this system
After Tasks Init Actions - Actions that will be activated after task generation is finished (see Actions)
Here is the example from CombatOps Arland that has 4 possible Task Types set but only 3 of them will be randomly selected upon scenario start
Debug
Forced Area - Allows you to spawn only 1 selected Area for easier debugging
Forced Task Layer - Upon choosing an Area, you can further specify which Task Layer will get spawned
Dynamic Spawn/Despawn
Dynamic Despawn - In default, it is set to false, but upon setting it to true, it will enable the Dynamic Despawn feature
Update Rate - Controls the update rate for the Dynamic Spawn/Despawn on how frequently it is being checked to perform Spawn/Despawn of Areas
Basic Hierarchy Components
After setting up the GameMode entity and possibly other entities (listed above) we can get creative with the main part of the Scenario Framework and that are all the pieces from which the scenarios are built from.
We will go very briefly over the basic hierarchy of how it works, and detailed information about each component are provided.
Area
At top of the hierarchy stands so called Area. Idea behind this is that your scenario is divided into several areas (as you can for example see on CombatOps Arland) and each area is handling its own things and has its purpose. Area has all the other components under it in its own hierarchy and it also serves with the Dynamic Spawn/Despawn as an enclosure.
Layer
Right under the Area is the so-called Layer. Note that there is a "basic" Layer that serves as a hierarchical tool to further divide things and it can contain other layers or slots. It is one of the most powerful entities that you will be using when building your scenario because it allows you to set the layout exactly how you will want it and knowing how it works will allow you to create all sorts of scenarios.
LayerTask
One of the types of the Layer is a LayerTask which has many subtypes depending on the task it is focused on and it serves to handle the Task creation and workflow.
Slot
At the bottom of the hierarchy, there is a Slot. "Basic" Slot allows you to spawn any prefab which is the main purpose of it, but you do not have to spawn anything and attach some components onto it as well (for example smart action component for the AI). It has other subtypes focused on the AI and also the SlotTask which is designed to work in sync with the corresponding LayerTask.
Logic
There are also Logic entities (LogicCounter, LogicOR and LogicSwitch) that are similar to Slots but their main purpose is to receive inputs and activate actions further down the line to allow you to design more sophisticated workflows
Example
For starters, here is one of the most simple task you can create within seconds using Scenario Framework. Here it will be very briefly commented, all the examples are documented in more detail.
At the top, there is Area, right under it is LayerTaskMove intended to encapsulate the SlotMoveTo which spawns said task.
In this view, we have three columns. In the left column, there is an unique name of this entity. In the middle, there is a name of the Prefab and on the right column, it is the class.
Tutorial
Log Messages
Scenario Framework prints messages into the log. Some of them are there to inform you about the most important things and usually, you do not need to worry about them as much. They always have Scenario Framework word contained in them. However, there are two other types of log messages that vary in severity:
- (W) - Warnings - These messages warn you about improper usage of the system and can give you a hint as to why is something not working as you might expect. This can help you troubleshoot your scenarios
- (E) - Errors - These messages have high severity and mark that something is technically not working (not necessarily user fault). They can help you understanding an issue in configuration
Components
All Scenario Framework components can be found in Prefabs/Scenario Framework/Components
All of the listed components bellow contain a lot of shared attributes and we are going to quickly go through them. Some of those categories are then further expanded by the specific components but that will be explained within them.
Attributes are divided into categories:
Children
This Category contains handling of the child layers that is affecting spawning of them
Spawn Children - Controls how many child layers will get spawned. It provides 4 different options:
- ALL - Spawns all Children
- RANDOM_ONE - Spawns random child
- RANDOM_MULTIPLE - It spawns random number of children based on the Random Percent attribute setting and number of children according to this equation: NumberOfChildren
/ 100 * RandomPercentAttribute - RANDOM_BASED_ON_PLAYER_COUNT - It spawns number of children based on how many children are there compared to the number of players according to this equation: NumberOfChildren
/ 100 * (CurrentNumberOfPlayers / MaximumNumberOfPlayers) * 100
Spawn Percent - Sets the random chance for the Spawn Children
Enable Repeated Spawn - Enables repeated Spawn of children layers in hierarchy
Repeated Spawn Number - If Repeated Spawn is enabled, how many times can children be spawned? If set to -1, it is unlimited
Repeated Spawn Timer - If Repeated Spawn is enabled, how frequently it will spawn next wave of children? Value -1 means disabled, thus children will not be spawned by the elapsed time.
Asset
This Category handles the Asset properties. More specific layers/slots have expanded attributes in this category, but here is the only one for the inheritance purposes
Faction Key - Faction key that corresponds with the SCR_Faction set in FactionManager. It also applies this attribute to all the child layers unless they override it there with different key
Debug
This Category handles debug visuals
Show Debug Shapes During Runtime - When enabled, there will be a colored sphere on the position of the layer. In some instances, size of a sphere is set by the trigger range or Dynamic Despawn range.
Activation
This Category handles activation type and Dynamic Spawn/Despawn.
Activation Type - Sets how the layer is activated and spawned. It has the following options:
- SAME_AS_PARENT - It activates the same way how the parent layer gets activated
- ON_TRIGGER_ACTIVATION - It gets activated from the trigger or actions that are using this activation type to activate it
- ON_AREA_TRIGGER_ACTIVATION - It gets activated when the parent area of this layer has trigger and that gets activated
- ON_INIT - It gets activated right after said layer is created (which does not need to happen on scenario start, but for example when said layer is being spawned somehow else)
- ON_TASKS_INIT - It activates after scenario is started and the system for random task generation is triggered
- CUSTOM1, CUSTOM2, CUSTOM3, CUSTOM4 - These are for modders to activate this layer via custom ways and you will not use it in common scenario creating
Exclude From Dynamic Despawn - It excludes this layer from being despawned by Dynamic Spawn/Despawn system. Layer will get spawned, but it will be skipped and will not get despawned, including all the children layers of this layer
OnActivation
This Category handles what happens after this layer is fully spawned and activated
Activation Actions - Executes Scenario Framework actions in listed order (see Actions)
Plugins
This Category handles what happens after this layer is fully spawned and activated
Plugins - Attaches Scenario Framework plugins in listed order (see Plugins)
Area
See Area
Same Attributes as Layer
Debug
Show Debug Shapes In Workbech - Due the fact that Area can handle both triggers and Dynamic Spawn/Despawn, this sets whether or not debug sphere is visible in workbench or not
Activation
Dynamic Despawn - Enables/Disables Dynamic Spawn/Despawn feature for particular area - see Dynamic Spawn/Despawn
Dynamic Despawn Range - How close at least one observer camera must be in order to activate spawn/despawn - see Dynamic Spawn/Despawn
OnActivation
Trigger Actions - Executes Scenario Framework actions in listed order when the Trigger attached to this Area is activated (see Actions)
Trigger
This category handles attached trigger spawning. Also check out the Plugins for the Trigger Plugin to have greater control over the trigger
Trigger Resource - Sets which Trigger prefab will be used
Area Radius - Sets the radius of the Area for this trigger
Once - If trigger is activated (conditions are true), it will be activated just one or every time it is true
Layer
See Layer
No additional attributes
LayerTask
See LayerTask
No additional attributes
Task
This Category handles setting of task properties
Task Title - Sets name of the task the player Task List
Task Description - Sets text description of the task in the player Task List
Task Prefab - Contains which Task Prefab is going to be spawned. This will differ according to the LayerTask type
Place Marker On Subject Slot - Whether or not the marker should be placed directly on the position of task subject slot
Override Object Display Name - In case of some task having an entity that is named (for example UAZ-469), you can rename it using this attribute
OnTaskFinished
This Category handles what happens after task from this layer task is finished
Trigger Actions On Finish - Executes Scenario Framework actions in listed order after task from this layer task is finished (see Actions)
LayerTaskMove
Layer Task specialised for Task Move. It is expecting to have SlotMove in its spawned hierarchy.
Same Attributes as LayerTask
LayerTaskDestroy
Layer Task specialised for Task Destroy. It is expecting to have SlotDestroy in its spawned hierarchy.
No additional attributes
LayerTaskKill
Layer Task specialised for Task Kill. It is expecting to have SlotKill in its spawned hierarchy.
No additional attributes
LayerTaskDefend
Layer Task specialised for Task Defend. It is expecting to have SlotDefend in its spawned hierarchy.
No additional attributes
Task
This Category is further expanded for the Task Defend by additional attributes:
Trigger Name - Task Defends requires trigger attached to it for it to work in cases where you want to set this task to defend some entity or both entity and area. Input the name of the slot that spawns trigger
Defend Params
This category contains all the Defend parameters that you can set for this type of task
Countdown Title Text - Text that will be displayed above the countdown number
Defend Time - For how long you have to Defend the objective of the task. Value -1 is for indefinitely.
Display Countdown HUD - When enabled, it will display the text and how much time remains for the Task Defend
Countdown HUD - Layout of the Countdown HUD
Faction Settings - Here you set who is considered as a Defender and Attacker for this Task. Each entry then contains these two attributes:
- FactionKey - Faction key that corresponds with the SCR_Faction set in FactionManager
- Count Only Players - When disabled, all units from this faction will be counted with for other Task Defend conditions
Min Defender Percentage Ratio - When compared to the number of attackers, minimum of how much of the characters present in the task area must be from defending side to successfully complete the objective on evaluation
Attacker Layer Names - Layer containing attacker forces. Can be more layers, but these layers must include only AI units/groups and nothing else
Earlier Evaluation - When enabled, it will can finish the task earlier than the countdown when all attackers are eliminated. Can be combined with Delayed Evaluation.
Delayed Evaluation - When enabled, the evaluation will be delayed and defenders will need to eliminate all attackers in order for the task to be successfully completed. Can be combined with Earlier Evaluation.
Display Delayed Evaluation Text - When enabled, it will display the text to inform players that they have to eliminate all attacker units
Delayed Evaluation Text - Text that will be displayed to inform players that they have to eliminate all attacker units
LayerTaskClearArea
Layer Task specialised for Task Clear Area. It is expecting to have SlotClearArea in its spawned hierarchy.
No additional attributes
LayerTaskDeliver
Layer Task specialised for Task Deliver. It is expecting to have SlotPick in its hierarchy spawned and then SlotDelivery spawned somewhere else or to be spawned for full funtionality.
No additional attributes
Task
This Category is further expanded for the Task Deliver by additional attributes:
Task Title Updated - Sets new task title when task gets updated
Task Description Updated - Sets new task description when task gets updated
Intel Map Marker Update Delay - If Place Marker On Subject Slot is true, the task marker will be on position of the task item and this attribute can set a delay between the updates for the position
Slot
See Slot
No additional attributes
Asset
This Category is further expanded by following attributes:
Object To Spawn - Prefab name of the object to be spawned
ID - Unique name of the entity that can be later used for identification and finding via Getters in the scenario
Use Existing World Asset - If enabled, slot will not spawn new object, but it will rather use the object already existing in the world in the vicinity of it
Override Object Display Name - Overrides display name of the spawned object for task purposes
Randomization
This Category handles the randomisation of asset that is supposed to be spawned
Randomize Per Faction - Randomise spawned asset(s) per Faction Key Attribute which needs to be filled as well. Overrides Object To Spawn Attribute.
Entity Catalog Type - Select Entity Catalog type for random spawn
Include Editable Entity Labels - Select Entity Labels which you want to optionally include to random spawn. If you want to spawn everything, you can leave it out empty and also leave Include Only Selected Labels attribute to false.
Exclude Editable Entity Labels - Select Entity Labels which you want to exclude from random spawn
Include Only Selected Labels - If true, it will spawn only the entities that are from Included Editable Entity Labels and also do not contain Label to be Excluded
Composition
This Category handles setting behavior for potential composition to be spawned. It currently has only one attribute:
Ignore Orient Children To Terrain - When disabled orientation to terrain will be skipped for the next composition. This is used for example when placing sandbags and you want "stack" them at top of each other.
SlotAI
SlotAI is specialised to handle AI units. It can spawn both singular units or groups. Using the Waypoints category and Misc AIs can be further directed and adjusted.
No additional attributes
Waypoints
This Category handles the setting of task properties and can override what is set in the parent TaskLayer of this SlotTask
Waypoint Group Names - Here you can define and set the layer containing waypoints and further adjust how they are going to be used
- Name - Here you put name of the layer that contains slots which spawn Waypoints
- Use Random Order - If the order of waypoints should be randomized or it will use them as they are in a hierarchy
- Cycle Waypoints - If the waypoints should be Cycled (using the Cycle WP Prefab)
Spawn AI on WP Pos - If true, it will spawn AI on the first WP Slot
WP To Spawn - Default waypoint that will be spawned for the AI
Group Prefab - Each AI needs to have their group and here is the default group prefab defined
Cycle WP Prefab - Here is the Cycle WP prefab defined used for cycling between waypoints
Misc
This Category handles the setting of task properties and can override what is set in the parent TaskLayer of this SlotTask
Balance On Players Count - Spawns number of AIs in the group based on the player count according to this equation: Math.Map(GetPlayersCount(), 1, GetMaxPlayersForGameMode(), Math.RandomInt(1, 3), maxUnitsInGroup)
SlotTrigger
Slot specialised to spawn trigger prefabs and then be further adjusted via Plugins
No additional attributes
SlotTask
This slot is actually not spawnable but other SlotTask types are inheriting from it. We will be mentioning it here due to the shared attributes.
No additional attributes
Task
This Category handles the setting of task properties and can override what is set in the parent TaskLayer of this SlotTask
Task Title - Sets name of the task the player Task List
Task Description - Sets text description of the task in the player Task List
Task Execution Briefing - Here you can put text that can then get written into the Execution part of the Briefing via this action (see Actions)
SlotMoveTo
This slot is designed to work with LayerTaskMove and it is supposed to spawn a Trigger prefab with attached Plugin Trigger for the desired functionality of Task Move creation.
No additional attributes
SlotDestroy
This slot is designed to work with LayerTaskDestroy. It attaches listener to the spawned entity which listens whether or not the entity is destroyed. If the target entity is a vehicle, it will also gets triggered by flooding the engine with water.
No additional attributes
SlotKill
This slot is designed to work with LayerTaskKill. It works very similarly as SlotDestroy but this is intended for AI characters.
No additional attributes
SlotDefend
This slot is designed to work with LayerTaskDefend. It can either spawn Trigger to work as a Defend Area task, or it can spawn an entity (can be a character or vehicle, anything that has a DamageManager component) and then the task is about to defend provided entity. Or you can combine it by spawning entity to defend and linking trigger in the LayerTaskDefend from the outside SlotTrigger to expand the possibilities and parameters of this task.
No additional attributes
SlotClearArea
This slot is designed to work with LayerTaskClearArea. It spawns TriggerDominance that is adjusted via Plugin Trigger that needs to be tweaked for each usage and you have to put FactionKey of the faction that will receive the task to Clear Area into the Activated By This Faction Attribute.
No additional attributes
SlotPick
This slot is designed to work with LayerTaskDeliver. It will spawn the desired item that will be used for this task and it handles updates of the task title + description in the Task category.
No additional attributes
Task
Task Title Updated1 - Sets name of the task the player Task List when target Intel is picked up
Task Description Updated1 - Sets text description of the task in the player Task List when target Intel is picked up
Task Title Updated2 - Sets name of the task the player Task List when target Intel is dropped
Task Description Updated2 - Sets text description of the task in the player Task List when target Intel is dropped
SlotDelivery
This slot is designed to work with LayerTaskDeliver. It spawns TriggerCharacterSlow and Plugin Trigger that is used to detect items spawned from SlotPick.
No additional attributes
Task
Associated Task Layers - Here you can define which LayerTaskDeliver is associated with this SlotDelivery in order to deliver Intel there
SlotExtraction
This slot is designed to work with LayerTaskMove. It is just a slightly adjusted variant of SlotMove but with countdown mechanics set in the Plugin Trigger
No additional attributes
SlotTriggerClearArea
Plugins
Plugins allow you to add more functionalities, usually to slots, that can further help you creating more specific things. Some of the plugins are already in use, most notably the Plugin Trigger to set attributes to the spawned triggers. You can inherit from the base class of the plugin to script your own plugins to easily add new features to your scenarios.
OnDestroyEvent
Plugin intended to be used on Any slot to activate actions upon asset destruction
Actions On Destroy - Upon asset destruction, it will activate set actions (see Actions)
OnInventoryChange
Plugin intended to be used on Any slot to activate actions upon asset inventory changes in terms of item addition/removal.
Actions On item Added - Once upon an item is added to the inventory of the asset, it will activate set actions (see Actions)
Actions On Item Removed- Once upon an item is removed from the inventory of the asset, it will activate set actions (see Actions)
Trigger
Trigger Plugin is used to set attributes for the triggers that are being spawned. It is designed to work with trigger prefabs that inherit from the SCR_CharacterTriggerEntity (TriggerCharacterSlow and TriggerAnyPlayerSlow) which has variety of use-cases even though its name would suggest it is mainly used for Characters. With the variety of attributes to set, it allows you to modify the trigger in very interesting way and create a lot of different tasks/scenarios/logics once you understand what each attribute does and what it allows.
One of the most common use-cases for triggers are tasks which are also included in Samples such as Task Move, Task Exfil, Task Clear Area, Deliver Weapons In Vehicle to certain Area or Deliver cars/any other items to certain area.
Area Radius - Radius of the trigger coverage
Activation Presence - This controls the category of presence that can activate this trigger.
- PLAYER - Trigger will require at least 1 player character inside for it to activate
- ANY_CHARACTER - Trigger will require any character inside for it to activate
- SPECIFIC_CLASS - This setting is supposed to be used when you are working with Specific Class Names attribute and it will require to have them inside the trigger for it to activate
- SPECIFIC_PREFAB_NAME - Works similarly as SPECIFIC_CLASS but intended mainly for Prefab Filter. However it will use OR with Specific Class Names and other conditions for the trigger to activate
Specific Class Names - Allows you to set list of classnames that will be detected by the trigger (such as ChimeraCharacter, Vehicle and so on).
Prefab Filter - Allows you to add list of Prefab Filters that each will allow you to specify a prefab name and whether or not it should include child prefabs.
Activated By This Faction - For which faction this trigger is assigned. This also influences the Activation Presence which will additionally check the Faction for all the filtered entities inside.
Custom Trigger Conditions - This allows you to extend the trigger conditions for when the trigger gets activated. There are already two conditions in-place, but this is created in a way that you can create your own conditions in script and you will see them here. Conditions are then evaluated in the listed order and if one fails, it will not continue to the other one.
- Specific Class Name Count - Used for counting how many times specific class name is inside the trigger. It works similarly like the Specific Class Names attribute but with addition of a Classname count attribute where you can set the desired number. Additionally, this will add the class name to the trigger filter from this condition so you do not have to add it again in the Specific Class Names attribute.
- Specific Prefab Count - Used for counting how many times specific prefab is inside the trigger. It works similarly like the Prefab Filter attribute but with addition of a Prefab count attribute where you can set the desired number. Additionally, this will add the prefab to the trigger filter from this condition so you do not have to add it again in the Prefab Filter attribute.
Search Vehicle Inventory - Entities (usually items) that are in inventory of vehicles are not detected by triggers in default. However, this Plugin added the such behavior as it is sometimes needed to detect entities that are situated in inventories of vehicles and this attribute allows just that.
Once - If set to true, the trigger will be activated only once if conditions are true. If set to false, the trigger will get activated every time its conditions are true.
Update Rate - How frequently is the trigger updated and performing calculations. Lower numbers will decrease performance.
Minimum Players Needed Percentage - Minimum players needed to activate this trigger when PLAYER Activation presence is selected
Activation Countdown Timer - For how long the trigger conditions must be true in order for the trigger to activate. If conditions become false, timer resets
Notification Enabled - Whether or not the notification is allowed to be displayed
Player Activation Notification Title - Notification title text that will be displayed when the PLAYER Activation presence is selected
Enable Audio - Whether or not the audio sound is played and affected by the trigger
Countdown Audio - Audio sound that will be playing when countdown is active.
Logic
Logic entities will allow you to create "systems" that can drive scenario logic based on how you build it.
Input
Allows you to set Inputs for this counter via the Input Action - do not confuse with Scenario Framework Actions.
Input Action
These actions if conditions are true, will increase the counter.
On Task Event Increase Counter
Optional, used to increase the counter based on the task event update and Task Layer name
Task Layer Name - optional attribute, to either set specific LayerTask or if left empty, it will be processing all the LayerTasks
Event Name - On Which Task Event update it will increase the counter.
Check Entities In Trigger
Used to increase the counter based on the selected comparison operator on how many entities are there in the trigger. This is supposed to be used for SlotTrigger.
Getter - To link which Trigger will be compared.
Comparison Operator - Which comparison operator will be used. You can choose from: LESS_THAN, LESS_OR_EQUAL, GREATER_THEN, GREATER_OR_EQUAL or EQUAL
Value - To which value will it be compared using the Comparsion Operator attribute and number of entities from trigger linked from Getter attribute
Check Entities In Area Trigger
Same as Check Entities In Trigger but it is supposed to be used directly to Area rather than SlotTrigger.
LogicCounter
Logic Counter allows you to store the count of something and then it can execute actions (see Actions) either on Activation (a.k.a upon reaching certain count) or on Increase. It also has Input that can listen to other events but other Scenario Framework components can also have actions that can increase the counter from their side.
Attribute categories are exactly the same as in Shared Attributes with one category as an addition
Counter
Specific category for the Counter which is keeping the count
Count To - Up until which number it should count towards for it to trigger actions in OnActivate.
LogicOR
Attribute categories are exactly the same as in Shared Attributes
LogicSwitch
Attribute categories are exactly the same as in Shared Attributes
Getters
Getters allow you to retrieve usually entity or a number from something already existing in the Scenario for the purposes of using it usually in some Actions.
GetArea
Area Name - the name of the wanted Area
Return value: IEntity
GetAreaTrigger
Area Name - the name of the Area from which you want the trigger
Return value: IEntity
GetClosestPlayerEntity
This Getter will return the closest Player entity you want to work with using another Getter to to get the position of a an object to search from.
Return value: IEntity
- Getter - Supposed to be a getter that will return some entity from which position you want to find the closest player
GetCountEntitiesInTrigger
Trigger Name - Input name of the trigger to get the entity count inside it
Return value: int
GetEntityByName
This one is one of the most powerful one which will allow you to get any Scenario Framework entity to further work with it.
Return value: IEntity
- Entity Name - the name of the entity you want to obtain (can be be any entity)
GetLastFinishedTaskEntity
This will return the last finished task's entity
Return value: IEntity
GetLayerBase
Layer Base Name - the name of the wanted Layer
Return value: IEntity
GetLayerTask
Layer Base Name - the name of the wanted LayerTask
Return value: IEntity
GetListEntitiesInTrigger
Trigger Name - Input name of the trigger to get array of all the entities inside it
GetPlayerEntity
This will return the first player entity it finds. It is supposed to be used mainly for 1-player scenarios.
Return value: IEntity
GetSpawnedEntity
This is one of the most powerful getter to use as it will allow you to get get access to the entities that Slots are spawning.
Return value: IEntity
- Layer Name - Insert name of the Layer you want to get the Spawned Entity from. This name could be a bit misleading, but main usage is on Slot, SlotAI, SlotTrigger and so on.
GetTask
This is one of the most powerful getter to use as it will allow you to get get access to the task that the LayerTask has attached to it.
Return value: IEntity
- Layer Task Name - name of the wanted LayerTask from which to get the attached Task
Actions
Actions allow you to perform runtime changes to many aspects of the game, alter different states, adjust entities and so much more. In many cases, there are things that you would be able to do in-game as a player or as a Game Master very easily. Currently not everything will be here, but things will be added as time goes on and you can add your own actions as well if you properly inherit from the base class.
All of the actions have one shared attribute that is the Max Number of Activations. In default, it is set to -1, which means infinite number of activations. You can restrict the number of activations of each action if you happen to be in a situation where certain action could be called several times from different sources but you only want it to be activated once or x amount of times.
Add Item To Inventory
It uses the Getter, but for this action, expected target is some entity that has Inventory component (such as GetSpawnedEntity, GetPlayerEntity or GetEntityByName)
It uses the Prefab Filter to add prefabs of items and their count into the target inventory
Append Briefing Entry Text
Appends existing briefing entry texts with the new string on a new line
- Faction Key - Target Faction key
- Custom Entry Name - Name of the entry to be appended
- Target Text - Text that will be appended
Append Briefing Entry Text Based On Task
Appends existing briefing entry texts with the new string on a new line that is based on Task Execution Briefing
- Faction Key - Target Faction key
- Custom Entry Name - Name of the entry to be appended
- Getter - Here, it is expected to use the GetTask which will contain the Task Execution Briefing attribute that will get appended
Change Layer Activation Type
This will change the Layer Activation Type attribute. It is mainly used for example when you have a layer that is set to be activated via trigger and the trigger activates it and when you have Dynamic Despawn Enabled (see Dynamic Spawn/Despawn) and you would like the layer to be respawned with subsequent activations, you will need it to change it to SAME_AS_PARENT
- Getter - the name of the wanted Layer
- Activation Type - Sets the Activation Type (see Activation)
Change Task State
This action changes the state of the Task. It also triggers other things that listen to the task changed events.
- Getter - Designed to work with the GetTask getter
- Task State - Sets the task's new state once this action is activated
Change Trigger Activation Presence
This will change the trigger activation presence for a given trigger.
- Getter - You can either use the GetEntityByName provided that the entity you are searching for is indeed the Trigger, you can also put there a GetSpawnedEntity, or even the Area as this action will try to retrieve the trigger from numerous types of getters
- Activation Presence
Compare Counter And Execute
This will compare Logic Counter value to the set value and if conditions are true, it can execute other actions
- Comparison Operator
- Value - Value that is the counter is to be compared to
- Counter Name - Name of the counter entity
- Actions - Actions that will be executed (see Actions)
Count Inventory Items And Execute Action
This will compare Logic Counter value to the set value and if conditions are true, it can execute other actions
- Comparison Operator
- Value - Value that is the counter is to be compared to
- Counter Name - Name of the counter entity
- Actions - Actions that will be executed (see Actions)
Delete Entity
This will delete provided entity. Be careful as this can be very dangerous action with dire consequences and it cannot be reversed!
- Getter - Any getter that returns an Entity (see Getters)
Delete Entity
This will delete provided entity. Be careful as this can be very dangerous action with dire consequences and it cannot be reversed!
- Getter - Any getter that returns an Entity (see Getters)
End Mission
Action to end mission with further adjustments
- Override Game Over Type - If this action should override what is already set as a Game Over Type or not. This can be used to end mission via some specific thing and either let it end with the Game Over Type that is already set there by the flow of the mission previously or you can choose to override it and in the Overriden Game Over Type choose a new type.
- Overriden Game Over Type - If Override Game Over Type is set to true, you can choose which type will be used for the end.
Execute Function
This is intended for advanced usages and it is expected some scripting knowledge. It will allow you to call methods on certain objects with parameters.
- Object To Call The Method From - It is basically a getter, but it will limit you with the methods depending on which class you will choose. You can for example trigger a despawn or repeated spawn on Slots if getting them that way and using their methods.
- Method to Call - Name of the method to call
- Parameter...Parameter5 - There are the method parameters that you can pass. It is however very limited as it operates with strings.
Fail Task If Vehicles In Trigger Destroyed
This can fail task (even a previously finished one) when vehicles in trigger provided by the Getter attribute will get destroyed.
- Getter - Here you are supposed to link the trigger (see Getters)
- Target Layer Task - Name of the Layer Task of which Task will get failed
- Caused By Player - If set to true, it will fail the task only when player caused the destruction
Increment Counter
This action increments Counter by 1
- Counter Name - Name of the target Counter
Kill Entity
This action allows you to kill any provided entity. Be careful as this is quite dangerous action and it cannot be reverted back.
- Getter - Any getter that returns an Entity (see Getters)
Lock or Unlock All Target Vehicles In Trigger
This action will either lock or unlock all target vehicles in trigger provided by the Getter attribute.
- Getter - To get the trigger you want to work with to influence all vehicles inside it (see Getters)
- Lock - If true, it will lock vehicle, if false, it will unlock vehicles
Lock or Unlock Vehicle
This action will either lock or unlock target vehicle provided by the Getter attribute.
- Getter - To get the entity of a vehicle you want to work with (see Getters)
- Lock - If true, it will lock vehicle, if false, it will unlock the vehicle
ActionMedical
Allows you to change target character medical values or states.
It uses the Getter, but for these actions, expected target is ChimeraCharacter. Usually you will want to use GetSpawnedEntity from some Slot or GetPlayerEntity.
Medical Actions
Add Particular Bleeding
Adds bleeding to the specific Hit Zone according to its name
Add Random Bleeding
Adds random bleeding
Remove All Bleedings
Removes all bleedings
Remove Group Bleeding
Removes bleeding from target hit zone group that you can choose from provided ENUM
Set Bleeding Rate
Sets bleeding rate for the target character
Set Blood
Sets blood level for the target character
Set Permit Unconsciousness
Sets whether or not unconsciousness is enabled for target character
Set Regeneration Rate
Sets regeneration rate for the target character
Set Resilience
Sets resilience value (used for unconsciousness) for the target character
Set Saline Bagged Group
Sets whether target hit zone group is saline bagged or not
Set Tourniquetted Group
Sets whether target hit zone group is tourniquetted or not
Play Sound
This action will play sound on player entity position
- Sound - String of with the name of the sound
Play Sound On Entity
This action will play sound on entity position provided by the Getter Attribute
- Getter - Supposed to be any that will return entity (see Getters)
- Sound - String of with the name of the sound
Prepare Area From Dynamic Despawn
It adds target Area into the Dynamic Spawn/Despawn during runtime.
- Getter - Supposed to be a GetArea (see Getters)
- Stay Spawned - If set to false, area will be despawned upon activation of this action
- Dynamic Despawn Range - How close at least player character must be in order to trigger dynamic spawn/despawn
Remove Area From Dynamic Despawn
It removes target Area from the Dynamic Spawn/Despawn during runtime.
- Getter - Supposed to be a GetArea (see Getters)
- Stay Spawned - If set to false, area will be despawned upon activation of this action
Remove Item From Inventory
This action is used to remove items from target inventory. This can be quite dangerous as it will delete it and it cannot be reversed.
- Getter - target entity that has inventory (see Getters)
- Prefab Filter - Here you can set which items and how many out of each will be removed
Reset Counter
This action will reset the counter back to 0. It is supposed to be activated only from the counter it is to reset.
Set Briefing Entry Text
Sets Briefing category text with the one you provide
- Faction Key - Target Faction key
- Custom Entry Name - Name of the entry to be changed
- Target Text - Text that you want to use
Set Briefing Entry Text Based On Generated Tasks
Sets Briefing category text based on generated tasks. This is used to dynamically the texts based on which tasks are actually spawned.
- Faction Key - Target Faction key
- Custom Entry Name - Name of the entry to be changed based on generated tasks
- Target Text - Text that you want to use. Leave empty if you want to utilise the one set in config.
Set Entity Position
Moves entity to a different position. Similar to setPosASL from previous titles, teleports the entity.
- Entity Getter - Getter of which Entity we want to work with (see Getters)
- Destination - world coordinates
- Destination Entity Getter - (Optional) You can also use some other entity as a destination coordinates
- Destination Entity Relative Position - (Optional) you can further define offset from the destination entity where to move you entity
Set Execution Entry Text Based On Generated Tasks
Sets Execution category text based on generated tasks. This is used to dynamically the texts based on which tasks are actually spawned.
- Faction Key - Target Faction key
- Custom Entry Name - Name of the entry to be changed based on generated tasks
- Target Text - Text that you want to use. Leave empty if you want to utilise the one set in config.
Set Mission End Screen
Sets mission end screen based on the Game Over Type attribute and it can also provide which Subtitle will be used
- Game Over Type - Which Game Over Type will be set upon using this action.
- Subtitle - Which subtitle text will be used
Show Hint
Supposed to show very simple hint with Title and Text for certain duration.
- Title - Title of the hint
- Text - Text in the body of the hint
- Timeout - duration in seconds how long will the hint stay before disappearing
Spawn Closest Object From List
This action is used to trigger spawning of certain layers that are set with ON_TRIGGER_ACTIVATION and you are supposed to put their names into the attribute List Of Objects. It will then find the closest one to the entity provided by Getter Attribute.
- Getter - Supposed to be the one that returns any entity you want to look the closest objects from (see Getters)
- List Of Objects - List of the named Scenario Framework components that are supposed to be spawned. In most cases, you just need to put there the top layer which was not activated by other means.
Spawn Objects
This action is used to trigger spawning of certain layers that are set with ON_TRIGGER_ACTIVATION based on their names listed into the Name Of Objects To Spawn On Activation attribute.
- Name Of Objects To Spawn On Activation - List of the named Scenario Framework components that are supposed to be spawned. In most cases, you just need to put there the top layer which was not activated by other means.
Wait And Execute
This is used to activate other actions with timed delay.
- Delay In Seconds - How long it will wait before activating set actions.
- Actions - Actions to be activated after delay has passed.
Dynamic Spawn/Despawn
This system works on Areas that are then handling their hierarchy and its purpose is to save performance by having spawned only things that need to be spawned.
There is a continuous check that is being triggered every 4 seconds in default (can be adjusted on GameMode component called SCR_GameModeCombatOpsManager) for all the Areas that have Dynamic Spawn/Despawn enabled. Furthermore, when Dynamic Spawn is initiated, it is spawning its children with slight delays between them in order to avoid huge stutters when a lot of different things are spawned at once, so upon successful Dynamic Spawn initiation, it can take few seconds for the Area to completely spawn (depending on the complexity of each Area setup).
Each Area has a range that is then compared to the distance from player characters. If just one player is within a range, Area will spawn all of its content that has Activation Type SAME_AS_PARENT set in workbench or this activation was changed in runtime via ScenarioFrameworkAction.
Runtime change is the case for QRF units in CombatOps on Arland Scenario where they are initially not spawned with the Area but via trigger. Once the trigger spawns these units, it also changes the Activation Type to SAME_AS_PARENT so when said Area would despawn and then spawn again, it will spawn these units as well.
On layers that are under the Area, there is an option to "Exclude from Dynamic Despawn" which if set to true will prevent said layer to despawn once it is spawned. This is used for example for Spawn Points, where we want to spawn them, but then we are not dynamically despawning them using this system.
Furthermore, all of the Slots that are spawning vehicles are set in a way that once someone gets inside of them, it will "Exclude" them from the Dynamic Despawn as well to prevent vehicle deletion upon moving away from Area range.
Slots and AI Slots retain their position where their spawned entity was located before Spawn/Despawn, so for example AI units that moved to different position will get their position saved and once respawned, they will be spawned on their previously saved position. If AI units are killed, their bodies will remain there for the GarbageCollector to handle and for the vehicles, it will remove their wreck and destroyed wreck will not be spawned again.
Samples
Samples are simple "scenarios" that usually focus on one particular feature of the Scenario Framework or a goal to show how it could be done. There are many ways how to achieve things and here will be the small selection of endless possibilities that this system can provide. You can use it to learn from it, copy it and adapt it as you please.
All the samples already have prepared necessary entities for the Framework to work so if you would just copy-pasted it into the empty world, it would not straight up work.
They are located in the /worlds/Scenario Framework directory where there are root files and Tutorial and then the Samples are in the Samples folder.
Task Move is one of the most simple tasks to have presented here and recommended to start learning the Framework with it.
TaskMove
Goal: Create a Task Move for the US Faction.
Setup: It is achieved by having an Area with LayerTaskMove and the SlotMoveTo) placed in the hierarchy as seen in the image below. Everything is set basically in default.
Mechanics: Area spawns LayerTaskMove which Spawns SlotMoveTo that spawns Task Move and assigns it to the default US faction and the slot also spawns trigger that is used to detect if some player entered it in order to finish the Task. Here the radius set to 10 meters and it will require at least 1 player to enter for it to finish this task.
TaskKill
Goal: Create a Task Kill for the US Faction.
Setup: It is achieved by having an Area with LayerTaskKill) and the SlotKill) placed in the hierarchy as seen in the image below. LayerTaskKill has set Task Title and Task Description attributes and SlotKill has Object To Spawn attribute set to spawn Unarmed soldier. This is done for the sample purposes, having Unarmed soldiers as targets for SlotKill is a war crime.
Mechanics: Area spawns LayerTaskKill which Spawns SlotKill that spawns Task Move and assigns it to the default US faction and the slot also spawns Unarmed soldier which is the target of the Task Kill. LayerTaskKill will also process display name of the entity and can display it in provided description, in this case: Unarmed. In order to finish this task, target entity must be killed.
TaskExfil
Goal: Create a Task Exfil for the US Faction.
Setup: It is achieved by having an Area with LayerTaskMove and the SlotExtraction) placed in the hierarchy as seen in the image below. Everything is set basically in default apart from the SlotExtraction timer set to 20 seconds.
Mechanics: Area spawns LayerTaskMove which Spawns SlotExtraction that spawns Task Exfil (which is basically the Task Move) and assigns it to the default US faction and the slot also spawns trigger that is used to detect if some player entered it and been there for 20 seconds in order to finish the Task. Here the radius set to 10 meters and it will require at least 1 player to stay inside for 20 seconds to finish this task. After finishing the task, mission is ended via End Mission action that is attached in OnTaskFinished in LayerTaskMove.
TaskDestroyRock
Goal: Create a Task Destroy Rock for the US Faction. This example is here to show how to link entities either already in world or newly spawned before the Slot will be spawned and then being able to work with them.
Setup: It is achieved by having an Area with LayerTaskDestroy which has Layer that contains normal Slots that will spawn RPG-7 and SlotDestroy that in this case will not spawn anything but it will search in the vicinity for the prefab that was set in the Object To Spawn attribute thanks to Use Exsiting World Asset attribute being set to true. Outside of the Scenario Framework, there is a Granite_Boulder_01 prefab put into the world and named RockToDestroy. It was modified in a way that we have added destruction to it via the SCR_DestructionMultiPhaseComponent and also the RplComponent so it can be properly destroyed.
Mechanics: First the RockToDestroy is placed in the world and then the Area spawns the LayerTaskDestroy which spawns Layer that spawns all the Slots with RPG-7 and SlotDestroy that will search for the Granite_Boulder_01 and then it will use it as target entity for the Task. Task is then finished upon destroying target entity, in this case, the rock.
TaskDestroy
Goal: Create a Task Destroy for the US Faction - in this case, target will be a vehicle.
Setup: It is achieved by having an Area with LayerTaskDestroy which has Layer that contains normal Slots that will spawn RPG-7 and SlotDestroy that spawns UAZ-469 which is linked to the created Task.
Mechanics: Area spawns the LayerTaskDestroy which spawns Layer that spawns all the Slots with RPG-7 and SlotDestroy that spawns UAZ-469. LayerTaskKill will also process display name of the entity and can display it in provided description, in this case: UAZ-469. In order to finish this task, you need to destroy the vehicle (you can also drown it in the water).
TaskDeliverIntel
Goal: Create a Task Deliver Intel for the US Faction. In this case, we want a specific item to be delivered there it cannot be interchanged with the same prefab.
Setup: It is achieved by having an Area with LayerTaskDeliverIntel and the SlotPick) together with SlotDelivery) placed in the hierarchy as seen in the image below. Everything is set basically in default, but SlotPick has texts filled in the Task category and it is supposed to spawn IntelligenceFolder_E_01.et from the Object To Spawn attribute. SlotDelivery then spawns Trigger and LayerTaskDeliver is linked there in Associated Task Layers attribute.
Mechanics: Area spawns the LayerTaskDeliverIntel which spawns SlotPick that will spawn the intelligence folder for you to pick it up and carry. In this particular example, SlotDelivery is also spawned from thy LayerTask right from the start and it spawns trigger that is used to detect player character and search for the folder in it. The spawned asset from SlotPick is linked to this task so truly have to deliver this specific item. In order to finish the task, deliver the intel to the trigger with the player character.
TaskDefendTarget
Goal: Create a Task Defend Target for the US Faction. It can be any entity that can be destroyed, in this case, we chose unarmed US Soldier.
Setup: it is achieved by having an Area with LayerTaskDefend that spawns SlotDefend that will further spawn the Unarmed US Soldier.
Mechanics: Area spawns LayerTaskDefend which spawns SlotDefend which spawns target to defend, in our case Unarmed US Soldier. There is a timer set for 15 seconds and in order to finish this scenario successfully, you just have to wait whilst Unarmed Soldier still being alive. If he dies, the task will fail.
TaskDefendArea
Goal: Create a Task Defend Area for the US Faction. Goal will be to repel enemy forces and have majority at the end of the task countdown.
Setup: It is achieved by having an Area with LayerTaskDefend that has two layers under it. Attacker_USSR which is defined in Attacker Layer Names contains three SlotAI that each will spawn Unarmed USSR Soldier on repeated basis. Each slot has the Repeated Spawn enabled and the layer has it enabled as well and set it to spawn repeatedly 2x each 15 seconds. Defender_US layer then contains SlotTrigger that will spawn Trigger, Slot1 which spawns M60 machinegun turret and SlotDefend which will not spawn anything but the trigger is set there instead. LayerTaskDefend also has Faction Settings set in a way that the attacking faction is considered USSR and it counts all the characters. Defending faction is set to be US and it will count all the characters as well. Defend time is set to 60 seconds and Defender percentage ratio is set to 0.51 which means that at the evaluation, there needs to be a majority of defenders in comparison to attackers.
Mechanics: Area spawns LayerTaskDefend which spawns Attacker_USSR layer that will spawn 3 Unarmed USSR Soldiers initially and 15 seconds later, it will spawn additional wave using the Repeated Spawn feature. Alongside it, Defender_US layer will spawn SlotTrigger which will spawn trigger that will be used to detect characters inside the designated area. Slot1 then spawns M60 machinegun that can be used to quickly eliminate all the attackers. SlotDefend then spawns trigger. Area needs to be cleared out of the enemy presence in ratio that the majority of the units inside need to be of US faction. If it is below this ratio, task will fail.
TaskDefendAreaAndTarget
Goal: Create a Task Defend Area and Target for the US Faction. This will be a combination of Defend Area and Defend Target and indeed both conditions will apply at the same time.
Setup: It is achieved by having an Area with LayerTaskDefend that has two layers under it. Attacker_USSR which is defined in Attacker Layer Names contains three SlotAI that each will spawn Unarmed USSR Soldier on repeated basis. Each slot has the Repeated Spawn enabled and the layer has it enabled as well and set it to spawn repeatedly twice every 15 seconds. Defender_US layer then contains SlotTrigger that will spawn Trigger, Slot1 which spawns M60 machinegun turret and SlotDefend which spawns Unarmed US Soldier. LayerTaskDefend also has Faction Settings set in a way that the attacking faction is considered USSR and it counts all the characters. Defending faction is set to be US and it will count all the characters as well. Defend time is set to 60 seconds and Defender percentage ratio is set to 0.51 which means that at the evaluation, there needs to be majority of defenders in comparison to attackers.
Mechanics: Area spawns LayerTaskDefend which spawns Attacker_USSR layer that will spawn 3 Unarmed USSR Soldiers initially and 15 seconds later, it will spawn additional wave using the Repeated Spawn feature. Alongside it, Defender_US layer will spawn SlotTrigger which will spawn trigger that will be used to detect characters inside the designated area. Slot1 then spawns M60 machinegun that can be used to quickly eliminate all the attackers. SlotDefend then spawns Unarmed US Soldier that is supposed to be defended. This combines both conditions so the whole time the Unarmed US Soldier needs to be kept alive and at the end of the timer, area needs to be cleared out of the enemy presence in ratio that the majority of the units inside need to be of US faction. If one of the conditions will fail, it will fail the task.
TaskClearArea
Goal: Create a Task Clear Area for US Faction. There is some area that is occupied by enemy forces and you need to clear it out.
Setup: It is achieved by having an Area with LayerTaskClearArea that has two layers under it. First layer holds SlotClearArea which spawns TriggerDominance trigger that is set in a way that it is activated by Player and detects all -unknown class ("SCR_ChimeraCharacters") provided!-. Second Layer contains 3x SlotAI that will spawn Unarmed USSR soldiers.
Mechanics: Area spawns LayerTaskClearArea which spawns Layer that spawns SlotClearArea which spawns TriggerDominance that is used to periodically check the set area for the enemy presence. Then Layer_AI spawns 3 SlotAIs that each spawns 1 Unarmed USSR Soldier. In order to finish this task, you need to clear out all the enemies in the area.
PatrollingGroup
Goal: Create a AI group that will be patrolling in set patern indefinitely.
Setup: It is achieved by having an Area that has Layer AI_group which has Layer Patrol1 that has SlotAI1 which spawns US Sentry group. Then there is Layer Patrol_Waypoints that contains three slots, each spawning Patrol waypoint. SlotAI1 has modified attribute category Waypoints where in the Wypoint Group Names, there was added a WaypointSet which contains Patrol_Waypoints and attribute Cycle Waypoints is set to true. Also Spawn AI On WP Pos is enabled for the SlotAI1.
Mechanics: Area Spawns AI_group which spawns Patrol1 which Spawns SlotAI1 which spawns US Sentry group that has link to the Patrol_Waypoints Layer that is spawned right after it which spawns 3 Patrol waypoints. These waypoints are then assigned to the AI group and are being cycled indefinitely. There is no end state, this group will conduct patrol for eternity.
FinishTaskToCreateTask
Goal: Create simple sequence of tasks that once one is completed, next one is spawned upon finishing it showing one possible way how to create this workflow.
Setup: It is achieved by having 3 distinct Areas. Each Area has LayerTaskMove with SlotMoveTo in their hierarchy that works exactly the same as TaskMove sample. Additionally, Area_A and Area_B also has LogicCounter. Each listen to their respective TaskMove set in the Input for the task finish via OnTaskEventIncreaseCounter action and then OnActivate, there is an action Spawn Objects which will spawn next LayerTask. There are many ways how to create this sequence, Here, we used Counters to showcase them, but it can be achieved without them just by putting the action Sapwn Objects to the LayerTask OnTaskFinished action. LayerTaskMove in Area_B and Area_C both have Activation Type attribute set to ON_TRIGGER_ACTIVATION which prevents these layers being spawned on scenario start of task generation init. These Layers will be able to spawn only when called with ON_TRIGGER_ACTIVATION action, such as is set in LogicCounter.
Mechanics: All Areas spawn in, but only the Area_A will spawn the LayerTaskMove with the SlotMoveTo and LogicCounter. Upon entering trigger that the SlotMoveTo spawns, finishing the objective will increase the counter which will trigger spawning of next LayerTaskMove from Area_B. That will do the same as in Area_A and spawning LayerTaskMove in Area_C as a final objective.
EndScreenBasedOnCompletedTasks
Goal: Create a workflow that will alter end screen based on the completed tasks.
Setup: There are 4 areas each containing their respective tasks. Documents have similar setup to TaskDeliverIntel Sample, but SlotPick 2 upon picking up documents ends the scenario via OnTaskProgress action End mission. Extraction bears similarities from TaskExfil, but additionaly, it has SlotDelivery_01 there that is linked for the D_Documents and Slot_1 which spawns american flag. Upon finishing it, it will also end the mission via OnTaskFinished action End Mission. It has the endScreenCounter as well that is set in a way that upon each task finish, it increases its count up until 4. OnIncrease actions are then set with Compare Counter And Execute with nested action to Set Mission End Screen. Task Kill is very similar to TaskKill Sample and those 4 BrickWall_01_4m_1 surround its target. Move is the same as TaskMove Sample.
Mechanics: All of the Areas spawn their tasks as you may know it from samples mentioned above with minor tweaks to them. Under the USSR flag, the folder with intel can end the scenario right away and you will get end screen where you did not manage to complete any of the tasks if you do just that. If you finish at least one, you will get different ending and this goes on and on according to what is set in the endScreenCounter. In order to finish the scenario completely, you need to finish all the objectives and then end the scenario by exfilling under the US flag an not picking up the intel under the USSR flag.
DynamicDespawn
Goal: This Sample is here to showcase how to use the Dynamic Spawn/Despawn feature.
Setup: It is achieved by having Area that has three layers in the hierarchy. Area has Dynamic Despawn attribute enabled and Dynamic Despawn Range set to 30. Layer AI that has several AI slots that each is setup to spawn either group or singular unit. LayerTaskDestroy which has Spawn Children attribute set to RANDOM_ONE that can spawn either Layer1 or Layer2 which each would spawn SlotDestroy that spawns different vehicle. Layer RandomFlag is set to RANDOM_ONE as well and it will randomly pick one of three Slots that each has different flag set (US, USSR or FIA). On a GameMode component called SCR_GameModeSFManager, Dynamic Despawn attribute is set to true and Update Rate is lowered to 1 second from 4 seconds for the Sample purposes.
Mechanics: At first, Area is Spawned but it does not do anything and does not spawn any children until you move player character inside its Dynamic Despawn Range which is set to 30 meters. This check is in Sample worlds performed every 1 second, but it is recommended to have it set around 4 seconds in real scenarios to save up the performance. Area is also set to visualise this range to make it easier for you to see the range. Upon entering, Dynamic Spawn will be triggered that will spawn Layer AI with all the AI slots and their groups. Then LayerTaskDestroy will perform random pick of the child layer and spawn selected task with vehicle to be destroyed. Lastly, RandomFlag layer is spawned where again, one of three slots will be spawned. All the random selections are saved and layers will remember it. Upon leaving the range, everything inside will get despawned. Upon reentry, everything will get spawned in back again, random selection will use the saved layers, positions of vehicles/AIs will be also set to where these entites were before and if some of it got killed/destroyed, it will not spawn (see Dynamic Spawn/Despawn).
DetectPrefabInTrigger
Goal: Create a Task to Deliver specific vehicle prefabs in specific counts into the trigger for US Faction.
Setup: It is achieved by having Area that spawns Layer1 which spawns Slots that each will spawn vehicles. Then LayerTaskMove that spawns SlotMoveTo which has adjusted Plugin Trigger attributes (see image below) to detect specific prefabs in specific numbers.
Mechanics: Area spawns Layer1 which spawns Slots that each spawn vehicles. Then LayerTaskMove spawns SlotMoveTo that has adjusted Plugin Trigger to be activated by SPECIFIC_PREFAB_NAME and using Custom Trigger Conditions, in order to activate this trigger, there needs to be at least two Ural-4320 vehicles or any of their child prefabs aka variants of Ural. UAZ-469 is requiered to be there in number of three but there needs to be this specific one, not any other variants. Otherwise, the trigger will not get activated and the Task will never finish. This setup can be used for any prefabs or even classnames to create variety of different tasks and logics.
Attributes of SlotMoveTo1 for Plugin Trigger
DeliverWeaponsToCrate
Goal: Create a Task Deliver weapons into crate for US Faction.
Setup: It is achieved by having Area that spawns Layer1 with Slot1 that is set to detect a prefab of a crate set in Object To Spawn attribute via Use Existing World Asset attribute. Then It has Plugin On Inventory Change attached to (see in the image below) it and set Actions On Item Added to Count Inventory Items And Execute Action which then can execute Change Task State and Remove Item From Inventory actions. LayerTaskMove then spawns SlotMoveTo that spawns trigger which is set to detect a medical crate 10x which will never be in the scenario spawned to create this "dummy" task. Then outside of the Scenario Framework, there is a WeaponsCrate spawned and adjusted to have inventory. Lastly there are 5x M9 Handgun spawned around the crate.
Mechanics: Area spawns Layer1 which spawns Slot1 that finds the WeaponsCrate in the vicinity and attaches the Plugin On Inventory Change to it that is set to detect 5x M9 Handgun inside it and upon reaching desired count, it will finish the objective and remove those weapons from the crate. LayerTaskMove spawns SlotMoveTo but that is just used as "dummy" task to have some to work with and set in a way that conditions cannot be fulfilled in this scenario any other way than by that Scenario Framework action.
Attributes of Slot1 for Plugin On Inventory Change
DeliverWeaponsInVehicle
Goal: Create a Task to Deliver weapons in a vehicle for the US Faction.
Setup: It is achieved by having Area that Spawns Layer1 which spawns Slot1 that will spawn M1025 Humvee that has OnActivation action set with Add Item To Inventory that will add 10x M16A2 into its inventory after spawning. Then LayerTaskMove has OnTaskFinished action set to Remove Item From Inventory that will target the Slot1 spawned entity and attempt to remove it from there. Lastly, this Layer will spawn SlotMoveTo that has adjusted Plugin Trigger to search for M16A2 inside of it (see second image below) - it is important to set the Specific Class Names for this use case to the Vehicle so it can search vehicle inventories. In default cases, items in inventory are not searched by the trigger.
Mechanics: Area spawns Layer1 which spawns Slot1 that spawns M1025 Humvee and adds 10x M16A2 to its inventory. Then gets spawned LayerTaskMove which spawns SlotMove to that spawns trigger which is responsible for searching all for the M16A2 inside it and set in a way that it also searches inventory of vehicles. This task can be finished either by driving the vehicle straight to the trigger or putting 10x M16A2 by any means. If they are delivered via provided vehicle, weapons will be removed from said vehicle to showcase this action here.
Trigger
LastStand
Goal: Create a sequence of Task Defend to hold off enemy waves of attack for the US faction.
Setup: It is split into 4 Areas called Stages. Stage_0 contains LayerTaskMove with SlotMoveTo and Slot2 that spawns an M60 machinegun. Each of the following Stage is then set to be activated by previous stage finishing task and it contains slightly modified version of DefendArea Sample where most notable differences are in Title, different timer and not requiering to having majority in said area.
Mechanics: Area Stage_0 spawns LayerTaskMove with SlotMoveTo that spawns Task prompting you to move to said area. It also Spawns M60 machinegun from Slot2. Upon moving to the designated area and finishing the task, LayerTaskDefend from Stage_1 will spawn and alongside it the AIs from attached Attacker Layer. Once the timer runs out, it will spawn contents of Stage_2 and similarly for the Stage_3 which then ends the scenario after 4 seconds via the Wait And Execute action to then End Mission.
TutorialFull
Goal: Create a small show-case mission that can serve as a tutorial for a bit more advanced workflow than it is shown in Samples. It expects knowledge of the basic Scenario Framework samples.
Setup: It is achieved by having several areas that splits the parts of the scenario. Area_1_island spawns LayerTaskDeliver with spawns SlotDelivery that is set to detect Barrel.et and SlotPick which is set to find the nearest barrel and link it as an item to be delivered. It also spawns two SlotTriggers that upon entry, they will display a hint, play sound and TriggerHintNoFuel spawns TaskMoveToFacility. Area_2_Facility holds previously mentioned task layer that has ON_TRIGGER_ACTIVATION. Once that is activated, it spawns SlotMoveTo which spawns Task Move To and it also spawns SlotTrigger that is set to check for Vehicles in order to display a hint. Upon finishing the Task Move from the TaskMoveToFacility, it will display a hint to Search for the barrels with oil. You then need to move to the Area_3_Garage near the rock where LayerTaskDestroy spawns SlotDestroy that has in target nearest rock. Upon task Destroy rock being spawned, it will provide a hint. After the rock being destroyed, Ural-4320 that is spawned there outside of the Framework can be moved to the previously mentioned trigger that is set to check vehicles - the TriggerHintLoadBarrels. Once there, upon loading barel into the truck and then moving it to the SlotDelivery_1 trigger, it will finish this task and display hint set in TaskDeliverFuel. Then it will spawn contents of the Area_4_Landing that will spawn ClearAreaAI which will spawn SlotAI that spawns a group and WPInvasion Slot that spawns attack waypoint. It also spawns TaskClearArea similar to what you know from the Samples. Upon clearing the Area, the TaskClearArea sets the Mission End Screen and Ends the mission via actions attached in OnTaskFinished.
Mechanics: Area_1_island spawns LayerTaskDeliver with Pickup and Delivery points and two SlotTriggers. Player is spawned directly to the TriggerHintWelcome which issues a hint saying: Your primary task is to activate the radar located on top of the hill. Check your tasks.
After that, you are supposed to go to the hill where the radar is located and here TriggerHintNoFuel says: The radar is not working since the generator lacks the fuel. Find it and transport it to here.
This leads you to the Area_1_Facility to finish the LayerTaskMove and then going to the Area_3_Garage where the Ural-4320 behind the rock is located. Upon destroying the rock, you are supposed to move the Ural-4320 back to the facility where oil barrels are located and there you are prompted with another hint telling you to load the barrel. Upon loading the barel to the truck, move it to the SlotDelivery_1 and unload it there. This will spawn enemy AI going to attack your position with TaskClearArea. Upon finishing it, it ends the scenario.
Compositions
Scenario Framework Compositions are just Scenario Framework components put together for easier and quicker use when creating your scenarios. In fact, many of these are directly taken from the Scenario Framework Samples so you do not have to reopen those and you can easily put them into your scenarios, perform few adjustments and you are good to go.
- TaskMove sample
- TaskKill sample
- TaskExfil sample
- TaskDestroy sample
- TaskDeliverVehicles sample (if the prefab is in the trigger, it is delivered)
- TaskDeliverIntel sample
- TaskDefendTarget sample
- TaskDefendAreaAndTarget sample
- TaskDefendArea sample
- TaskClearArea sample