Script Editor Plugin – Arma Reforger

From Bohemia Interactive Community
Jump to navigation Jump to search
m (Fix)
m (Some wiki formatting)
Line 2: Line 2:
This tutorial teaches how to create a {{Link|Arma Reforger:Script Editor}}-specific plugin.
This tutorial teaches how to create a {{Link|Arma Reforger:Script Editor}}-specific plugin.


{{Feature|important|Please read {{Link|Arma Reforger:Workbench Plugin}} first.}}
{{Feature|important|Please read {{Link|Arma Reforger:Workbench Plugin}} before following this tutorial.}}




Line 22: Line 22:
== ScriptEditor Module API ==
== ScriptEditor Module API ==


{{Feature|informative|See {{Link/Enfusion|armaR|ScriptEditor}}.}}
{{Feature|informative|See the {{Link/Enfusion|armaR|ScriptEditor}} class.}}


In the below code, the {{hl|GetCurrentLine}} method is used to get the cursor location's line number.
In the below code, the {{hl|GetCurrentLine}} method is used to get the cursor location's line number (0-based index, first line = 0, second line = 1, etc).
The {{hl|GetLineText}}/{{hl|SetLineText}} methods is used to obtain and change the line's value by adding an inline comment indicating the current line number ("hardcoded" into the comment).
The {{hl|GetLineText}}/{{hl|SetLineText}} methods are used to obtain and change the line's value by adding an inline comment indicating the current line number ("hardcoded" into the comment).


<enforce>
<enforce>
Line 31: Line 31:
class TAG_TutorialPlugin : WorkbenchPlugin
class TAG_TutorialPlugin : WorkbenchPlugin
{
{
//------------------------------------------------------------------------------------------------
override void Run()
override void Run()
{
{
Line 42: Line 43:
}
}
</enforce>
</enforce>


{{Feature|important|Each text operation goes into one {{Controls|Ctrl|Z}} '''each''', making reverting a multi-line text operation successive Ctrl+Zs.}}
{{Feature|important|Each text operation goes into one {{Controls|Ctrl|Z}} '''each''', making reverting a multi-line text operation successive Ctrl+Zs.}}
Line 57: Line 59:
protected bool m_bOnlyLineNumber;
protected bool m_bOnlyLineNumber;


//------------------------------------------------------------------------------------------------
override void Run()
override void Run()
{
{
Line 78: Line 81:
}
}


//------------------------------------------------------------------------------------------------
override void Configure()
override void Configure()
{
{
Line 84: Line 88:
}
}
</enforce>
</enforce>


{{Feature|informative|
{{Feature|informative|

Revision as of 22:43, 28 April 2024

This tutorial teaches how to create a Script Editor-specific plugin.

Please read Workbench Plugin before following this tutorial.


Setup

  • Open Script Editor
  • In an addon, create a new script in WorkbenchGame/ScriptEditor - name it TAG_TutorialPlugin.c (must end with Plugin by convention)
  • Double-click the file to open it
  • Press Ctrl + T to use the Script Template plugin
    • In its window, select "Class Type: WorkbenchPlugin", leave the other fields blank/default
    • A Workbench plugin skeleton is inserted.
  • In the WorkbenchPluginAttribute, replace wbModules: { "ResourceManager" } by wbModules: { "ScriptEditor" }
  • In the Run() method, write Print("It works!"); and save the file
  • Press Ctrl + ⇧ Shift + R to reload scripts
  • The TAG_TutorialPlugin plugin should appear in the Script Editor's Plugins list, available in the top bar - click on the plugin entry
  • "It works!" gets printed in the output console.


ScriptEditor Module API

See the ScriptEditor class.

In the below code, the GetCurrentLine method is used to get the cursor location's line number (0-based index, first line = 0, second line = 1, etc). The GetLineText/SetLineText methods are used to obtain and change the line's value by adding an inline comment indicating the current line number ("hardcoded" into the comment).

[WorkbenchPluginAttribute(name: "Tutorial Plugin", description: "This tutorial plugin does something.", shortcut: "Ctrl+Shift+H", wbModules: { "ScriptEditor" }, awesomeFontCode: 0xF188)] class TAG_TutorialPlugin : WorkbenchPlugin { //------------------------------------------------------------------------------------------------ override void Run() { ScriptEditor scriptEditor = Workbench.GetModule(ScriptEditor); int lineNumber = scriptEditor.GetCurrentLine(); string lineContent; scriptEditor.GetLineText(lineContent); lineContent += " // current line is " + (lineNumber + 1); scriptEditor.SetLineText(lineContent); } }


Each text operation goes into one Ctrl + Z each, making reverting a multi-line text operation successive Ctrl+Zs.


Configuration

Displayed parameters are declared values decorated with an Attribute; a full setup is done as follow:

[WorkbenchPluginAttribute(name: "Tutorial Plugin", description: "This tutorial plugin does something.", shortcut: "Ctrl+Shift+H", wbModules: { "ScriptEditor" }, awesomeFontCode: 0xF188)] class TAG_TutorialPlugin : WorkbenchPlugin { [Attribute(desc: "Only display the line number without any other text")] protected bool m_bOnlyLineNumber; //------------------------------------------------------------------------------------------------ override void Run() { ScriptEditor scriptEditor = Workbench.GetModule(ScriptEditor); int lineNumber = scriptEditor.GetCurrentLine(); string lineContent; scriptEditor.GetLineText(lineContent); if (lineContent.IsEmpty()) { Workbench.Dialog("Empty line", "You cannot add a comment to a completely empty line."); // absolutely arbitrary tutorial decision :) return; } if (m_bOnlyLineNumber) lineContent += " // " + (lineNumber + 1).ToString(); else lineContent += " // current line is " + (lineNumber + 1).ToString(); scriptEditor.SetLineText(lineContent); } //------------------------------------------------------------------------------------------------ override void Configure() { Workbench.ScriptDialog("Tutorial Plugin Configuration", "Usage:\nTick the checkbox or not, depending on if the line number should be written or not", this); } }


Think of the plugin's behaviour: should the end user encounter a configuration popup on each plugin usage (e.g from the Run method) or can it be configured once, or should some settings be offered on every usage?