Package: dcs-code-injector
Supported by JetBrains' Open Source Development Project📲 DCS Code InjectorDon't worry, I'll change the name to something cool later🌴🥥Questions or concerns? Find me under the namecoconutcockpiton my Discord server here:Here's a video of an older version in action:https://youtu.be/m2tGLFgLp8Y🙋‍What is it?It's a small program that you can run alongside DCS to influence a mission while it's running. I use it a lot to quickly try out scripting ideas without having to reload the mission all the time. It's a REPL (Read-Eval-Print-Loop) that I kind of based on Autodesk Maya's script editor.Some things other people have been using it for:Something happened in a mission that didn't fire a trigger. Instead of calling it quits we got to activate the event that was supposed to happenAdding extra functionality to paid campaigns, such as a splash damage script.Spawning new enemies in a mission without having to set up a bunch of radio commands...💾 How to downloadYou can grab a .zip file that contains an executable that should run on any Windows machine from the releases page here:https://github.com/nielsvaes/dcs_code_injector/releasesIf you have Python installed on your computer, you can also find it onPyPiandpipinstall (and upgrade) it with the following command:pip install --upgrade dcs-code-injectorIt also makes an entry point to the application, so typedcs-code-injectorto run it.⚠️ False antivirus positives!
All code is written in Python. To make it easier for people who don't have Python installed, I use a package calledNuitkato make it an executable that runs on Windows. A side effect of this is that sometimes it triggers antivirus software because they think it's a trojan. It is not. All the code for the program is available here on the github page. If you're running into troubles, it's easier to just use Python to run the program instead of the executable. Feel free to reach out to me if you need help getting it up and running with just Python.🥇First time useWhen you open the application for the first time, you need to tell it where yourdcs.logfile is saved. Browse to the file (it's in yourSaved Gamesfolder) and save the settings. You will then be presented with the main window and the log panel. The log gets updated automatically while DCS is running, so it's easy to see if you're getting any errors or warnings when running code.🪝 Add the hookA Lua hook needs to be loaded in order to tell DCS to connect to the application. The easiest way to do this is to go toTools > Copy hook file. ⚠️ You need to have set the path to yourdcs.logfile for this to work, since it uses that log's location to figure out where the hook should goIn case this doesn't work (but it really should!) you can copy the file over manually:
Find a file calleddcs-code-injector-hook.luain the Github repository or in the downloaded .zip archive. You need to copy this file into theScripts/Hooksfolder inside yourSaved Games/DCS.openbetaorSaved Games/DCSfolder. Remember where you put theSRShook file? This one goes right next alongside it :)✒️ Edit MissionScripting.luaIn theScriptsfolder if your DCS install directory, there's a file calledMissionScripting.lua. Comment out the lines that start with_Gto make sure the hook can load everything it needs to:MissionScripting.lua:localfunctionsanitizeModule(name)_G[name]=nilpackage.loaded[name]=nilenddosanitizeModule('os')sanitizeModule('io')sanitizeModule('lfs')--_G['require'] = nil--_G['loadlib'] = nil--_G['package'] = nilend❓How to usePressCtrl-Nto make a new tab. This will add a newUNNAMEDtab.UNNAMEDtabs are not saved on shutdown, so it's best to rename the tab if you want to keep the code around for later use. Double-click on the tab name to rename it. Anything you write in a tab is saved automatically.Select a block of code and pressCtrl-EnterorCtrl-Returnto execute it. The code block will appear in the log panel and will be run inside the mission. Any errors in the code will show up as red in the log.
If nothing is selected, all the code in the currrent active code tab will be executedYou can save code you run often toFavoritebuttons. I use this to reload MOOSE for example, when I've made changes to it. To save a button, select the lines of code you want to save and drag them to the blank strip beneath the code panel and above the connection icon. Pick a name and click save. To delete aFavoritebutton, right click on it and clickDelete.PressCtrl-Fto open a search box in the Log view. TheCctoggles between case sensitive and insensitive search.UseShift + Numpad+andShift + Numpad-to increase and decrease the log font size.UseCtrl + Numpad+andCtrl + Numpad-to increase and decrease the code font size.🎨 Log highlighting colorsI've added some "default" highlighting colors for the log. These are the colors that I'm using, but they might not be to everyone's liking. You can add new highlighting rules in the settings, they can be individual words or phrases or regular expressions. Select a rule and press thedeletekey to delete it.You need to restart the application for the new rules to be applied. If you want to get the defaults back, just delete all the rules and restart.🎨 Code completionThe Code Injector supports some basic code completion for lightweight Lua, MOOSE and MistYou can update code completion for MOOSE and Mist from the settingsLua keywords are completedVariable names in the document are completedFunction definitions in the document are completedIt's a "dumb" completion model, it doesn't understand context, meaning:my_group=GROUP:FindByName("goose_and_maverick")-- <=== GROUP:FindByName... will be auto completedmy_group:GetVec3()-- <== "my_group" will be autocompleted, but "GetVec3()" will not be, since it doesn't know that "my_group" is a MOOSE GROUP🗺️Future plansREPLBetter code highlightingOther partsThe REPL is actually just a small part of larger project I had in mind. Future plans include:Battlefield Commander Mode: This will show a map with all the units in the mission that you can manipulate in real time. In a limited testing mode I've used this to turn on SAM sites, spawn enemy fighters and things like that. I haven't really used LotATC, but I think it offers similar functionality.Integration with Standalone ServersPluginsand more!🤙ContributingI am not a hardcore coder or programmer, so if you are and want to lend a helping hand, GREAT! Fork the project and create a PR with your changes.
Other ways you can contribute is by reporting issues or posting feature requests on theIssuespage of the GitHub repository. I started this project just to make my own life easier, but I would to hear what you might want to use it for!📖LicenseLicensed under GNU GENERAL PUBLIC LICENSE v3