Scripting Modding – Arma Reforger
Lou Montana (talk | contribs) m (Text replacement - "<syntaxhighlight lang="C#">" to "<enforce>") |
Lou Montana (talk | contribs) m (Text replacement - "</syntaxhighlight>" to "</enforce>") |
||
Line 30: | Line 30: | ||
// SCR_BaseScoringSystemComponent.c | // SCR_BaseScoringSystemComponent.c | ||
void AddSuicide(int playerID) // method which increases suicides & deaths count in score system | void AddSuicide(int playerID) // method which increases suicides & deaths count in score system | ||
</ | </enforce> | ||
<enforce> | <enforce> | ||
// SCR_ScoringSystemComponent.c | // SCR_ScoringSystemComponent.c | ||
int CalculateScore(SCR_ScoreInfo info) // method used to calculate total score | int CalculateScore(SCR_ScoreInfo info) // method used to calculate total score | ||
</ | </enforce> | ||
Line 82: | Line 82: | ||
{ | { | ||
} | } | ||
</ | </enforce> | ||
Next, we can proceed with replacing the CalculateScore method by using the override keyword: | Next, we can proceed with replacing the CalculateScore method by using the override keyword: | ||
Line 93: | Line 93: | ||
} | } | ||
} | } | ||
</ | </enforce> | ||
As there is no intention to modify regular kill, team kills or objective score, lines containing: | As there is no intention to modify regular kill, team kills or objective score, lines containing: | ||
* <enforce>info.m_iKills * m_iKillScoreMultiplier</ | * <enforce>info.m_iKills * m_iKillScoreMultiplier</enforce> | ||
* <enforce>info.m_iTeamKills * m_iTeamKillScoreMultiplier</ | * <enforce>info.m_iTeamKills * m_iTeamKillScoreMultiplier</enforce> | ||
* <enforce>info.m_iObjectives * m_iObjectiveScoreMultiplier</ | * <enforce>info.m_iObjectives * m_iObjectiveScoreMultiplier</enforce> | ||
are left untouched. | are left untouched. | ||
Line 107: | Line 107: | ||
info.m_iSuicides * m_iSuicideScoreMultiplier + | info.m_iSuicides * m_iSuicideScoreMultiplier + | ||
info.m_iObjectives * m_iObjectiveScoreMultiplier; | info.m_iObjectives * m_iObjectiveScoreMultiplier; | ||
</ | </enforce> | ||
We are replacing their modifiers which would normally be provided via parameters | We are replacing their modifiers which would normally be provided via parameters | ||
Line 120: | Line 120: | ||
info.m_iSuicides * 10 + | info.m_iSuicides * 10 + | ||
info.m_iObjectives * m_iObjectiveScoreMultiplier; | info.m_iObjectives * m_iObjectiveScoreMultiplier; | ||
</ | </enforce> | ||
This translates into what we want: for every death or suicide, ten points are obtained. | This translates into what we want: for every death or suicide, ten points are obtained. | ||
Line 130: | Line 130: | ||
return 0; | return 0; | ||
return score; | return score; | ||
</ | </enforce> | ||
=== Super === | === Super === | ||
Line 151: | Line 151: | ||
} | } | ||
} | } | ||
</ | </enforce> | ||
A more mod-friendly way would be the following: | A more mod-friendly way would be the following: | ||
Line 166: | Line 166: | ||
} | } | ||
} | } | ||
</ | </enforce> | ||
The code is now ready to compile ({{Controls|Shift|F7}}) and the result can be tested in-game. | The code is now ready to compile ({{Controls|Shift|F7}}) and the result can be tested in-game. |
Revision as of 19:18, 30 July 2022
Before starting working on modified scripts, we need to prepare the basic structure for our new version of the scoring system. Therefore we will create:
- Basic folder structure (see Directory Structure)
- Empty script files ready for our new code
In this tutorial, the scoring system will be used as an example of script modding and following things will be changed:
Permanently changing scoring coefficients for death & suicide
- Playing a sound upon character suicide
- Those changes are fairly simple and should be a good showcase about how to proceed when modding files.
File structure
Before writing any code, let's start with investigating which files we need to modify and then, prepare structure for our modded files.
Since we want to modify the scoring system, we can begin by searching for terms related to it. By typing scoring into the Find Symbol search field, we should see SCR_ScoringSystemComponent.c on the first place. Double clicking opens the file containing that class and reveals its location in the file structure. Next to it is SCR_BaseScoringSystemComponent.c and those two files should be enough to achieve the goals stated above.
Note that these two files are located in the Scripts
We will be interested in changing the behaviour of:
SampleMod_ModdedScript/Scripts/Game/GameMode/Scoring/Modded
Once the directory is prepared, create two new script files inside the Modded folder. To do so, right-click on the Resource Browser field to open the context menu. From there, select "Script" to create a new script file. From here, it is time to create actual code!
- Create a new Script File: In Resources Manager, click the Create button then "Script" to create a script file
- Name the new Script File: the files should have the same name as the modded ones; namely SCR_BaseScoringSystemComponent.c and SCR_ScoringSystemComponent.c
It is usually a good habit to keep the original script and file structures; for the purpose of this tutorial, it assumed that following addon structure is used:
Create a Modified Script
Syntax
It is possible to modify already existing scripts by using some of special keyword:
- modded - keyword used to modify existing scripting class
- override - keyword to override methods in modded classes
- super - allows to invoke content of overridden method
We will use all these three words to create modded variants of SCR_ScoringSystemComponent.
Writing
First, we will begin with the modded keyword:
Next, we can proceed with replacing the CalculateScore method by using the override keyword:
As there is no intention to modify regular kill, team kills or objective score, lines containing:
- info.m_iKills * m_iKillScoreMultiplier
- info.m_iTeamKills * m_iTeamKillScoreMultiplier
- info.m_iObjectives * m_iObjectiveScoreMultiplier
are left untouched.
We are replacing their modifiers which would normally be provided via parameters
- m_iDeathScoreMultiplier is replaced by 10
- m_iSuicideScoreMultiplier is also replaced by 10
This translates into what we want: for every death or suicide, ten points are obtained.
Original code - calculated score is only returned if its above 0, otherwise method returns 0.
Super
Same as with SCR_ScoringSystemComponent, we will use the modded keyword on SCR_BaseScoringSystemComponent to modify the content of that class. The AddSuicide method is called every time the player commits suicide and adds score according to previously defined modifiers. Since we don't want to change that part and instead want to add a new behaviour to it, we will use the super keyword to call the overridden method's code.
Once this is done, we can use the PlaySound method from the AudioSystem class - this takes one argument, ResourceName of a sound file - and plays a 2D, non spatial, sound.
A more mod-friendly way would be the following:
The code is now ready to compile (⇧ Shift + F7) and the result can be tested in-game.
Mod Test
Terrain Preparation
At minimum, a new test scenario built in World Editor requires the following prefabs:
- GameMode_Deathmatch_Automatic.et - this prefab contains Deathmatch game mode configuration
- FactionManager_FFA.et - prefab defining which factions are participating in the game. FFA means represents Free For All, meaning there is only one faction
- SpawnPoint_FFA.et - spawn point with FFA specific configuration
- LoadoutManager_FFA.et - respawn loadout manager - the FFA variants contains all available loadouts for both USSR & US characters
All those prefabs can be placed in World Editor's viewport by drag and dropping them from the Resource Browser.
Debug Process
While testing scripts, built-in debugging options such as Breakpoints, Console and Watch features - see Script Editor - Debugging for more information.