Script Editor Plugin – Arma Reforger

From Bohemia Interactive Community
Revision as of 18:01, 26 April 2024 by Lou Montana (talk | contribs) (Page creation)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

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

Please read Workbench Plugin first.


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

In the below code, the GetCurrentLine method is used to get the cursor location's line number. The GetLineText/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).

[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.

Dialog

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."); 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 tool usage (e.g from the Run method) or can it be configured once, or should some settings be offered on every usage?