

Utilities for creating InputActions and having them be accessible in-game. InputActions created through this mod are accessible in-game via the keybinds menu added in update v45.
This mod is just a dependency for other mods, it doesn't add content, but it allows mods to add keybinds.
Depends on the version of InputUtils:
BepInEx/config/controlsBepInEx/controlsUse a Mod manager. I won't provide support if a mod manager wasn't used, a mod manager makes it far easier to debug issues since users can just share a modpack code.
This Api/Mod is still in beta, please keep in mind that stuff may change. Feedback is appreciated.
Download the latest release from either the Thunderstore or the Releases. Extract the zip and add a reference to the dll file of the mod in Visual Studio or Rider.
LcInputActions
InputActions your mod wishes to bind inputs forpublic class MyExampleInputClass : LcInputActions
{
[InputAction("<Keyboard>/g", Name = "Explode")]
public InputAction ExplodeKey { get; set; }
[InputAction("<Keyboard>/h", Name = "Another")]
public InputAction AnotherKey { get; set; }
}
InputActions[InputAction(...)] annotation[!IMPORTANT]
For actions to be registered to the API, Properties MUST be annotated with[InputAction(...)][InputAction("YourkbmPath", Name = "", GamepadPath = "", KbmInteractions = "", GamepadInteractions = "", ActionID = "", ActionType = InputActionType...)]
kbmPath: The default bind for Keyboard and Mouse devicesName: The Displayed text in the game keybinds menu
GamepadPath: The default bind for Gamepad devices
KbmInteractions: Sets the interactions of the kbm binding. See Interactions Docs
GamepadInteractions: Sets the interactions of the gamepad binding. See Interactions Docs
ActionID: Overrides the generated actionId (Generally you don't want to change this)
ActionType: Determines the behavior with which the action triggers. See ActionType Docs
So your Attribute could be written like this:
[InputAction("<Keyboard>/minus", Name = "Explode")]
public InputAction ExplodeKey { get; set; }
Or with any combination of optional parameters:
[InputAction("<Keyboard>/minus", Name = "Explode", GamepadPath = "<Gamepad>/Button North", KbmInteractions = "hold(duration = 5)")]
public InputAction ExplodeKey { get; set; }
[!NOTE] In this case above the Hold Interaction is being used. This keybind triggers after being held for 5 seconds. See Interactions Docs
void CreateInputActions(in InputActionMapBuilder builder)Asset["actionId"] in your class[!IMPORTANT] Make sure you call
Finish()after you're done creating each InputAction.
Here's an example usage of the runtime api
public class MyExampleInputClass : LcInputActions
{
public static readonly MyExampleInputClass Instance = new();
public InputAction ExplodeKey => Asset["explodekey"];
public override void CreateInputActions(in InputActionMapBuilder builder)
{
builder.NewActionBinding()
.WithActionId("explodekey")
.WithActionType(InputActionType.Button)
.WithKbmPath("<Keyboard>/j")
.WithBindingName("Explode")
.Finish();
}
}
To use your InputActions class, you need to instantiate it.
[!IMPORTANT] Do not create more than one instance of your InputActions class. If your class is instantiated more than once, your InputActions are unlikely to work as intended.
The easiest (opinionated) way to do so would be to have a static instance in your plugin class.
[BepInPlugin(...)]
public class MyExamplePlugin : BaseUnityPlugin
{
internal static MyExampleInputClass InputActionsInstance = new MyExampleInputClass();
}
You could also opt for instantiating the instance in the InputActions class (Singleton-style).
public class MyExamplePlugin : LcInputActions
{
public static MyExampleInputClass Instance = new();
[InputAction("explodekey", "<Keyboard>/j", "<Gamepad>/Button North", Name = "Explode")]
public InputAction ExplodeKey { get; set; }
}
[!IMPORTANT]
But How Do I Get My Binds String?
You may have noticed that
<keyboard>/yourKeycan be a little confusing for the special buttons. So try this:
- First, arbitrarily set the value to some regular value or just an empty string
- Then, load up your mod and change the keybind to the desired key
- After, look in your
.../BepInEx/controls/YOURMODID.jsonfile- Find the
{"action":"myaction","origPath":"","path":"<Keyboard>/f8"}]}- Last, copy that
path:""from the far right i.e."<Keyboard>/f8"
You could then simply reference the instance anywhere you need to have your actions at.
public class MyOtherClassOrMonoBehavior
{
public void DoSomething()
{
MyExamplePlugin.InputActionsInstance.ExplodeKey ...
}
}
or
public class MyOtherClassOrMonoBehavior
{
public void DoSomething()
{
MyExampleInputClass.Instance.ExplodeKey ...
}
}
It is common to see tutorials call InputAction.ReadValue<>() or InputAction.triggered from mono-behaviour Update() functions.
public class MyOtherClassOrMonoBehavior
{
public void Update()
{
DoSomething();
}
public void DoSomething()
{
if (!MyExamplePlugin.InputActionsInstance.ExplodeKey.triggered) return;
//Your executing code here
}
}
This approach is sufficient for 'continuous' actions, e.g. movement.
For 'discrete' actions, it's more appropriate to create event listeners that accept an InputAction.CallbackContext
and subscribe to InputAction.performed.
public class MyOtherClassOrMonoBehavior
{
public void Awake()
{
SetupKeybindCallbacks();
}
// Name this whatever you like. It needs to be called exactly once, so
public void SetupKeybindCallbacks()
{
MyExamplePlugin.InputActionsInstance.ExplodeKey.performed += OnExplodeKeyPressed;
}
public void OnExplodeKeyPressed(InputAction.CallbackContext explodeConext)
{
if (!explodeConext.performed) return;
// Add more context checks if desired
// Your executing code here
}
}
Check out Unity's documentation for their InputSystem
--target=TARGET
GAME_DIR env var)--configuration=MSBUILDCONFIGURATION
Check Build/Build.cs for the source code of the build script.
Clone and enter the repo.
git clone https://github.com/Rune580/LethalCompanyInputUtils && cd LethalCompanyInputUtils
Copy and rename .env.example to .env.
cp .env.example .env
Edit .env to fit your needs, a valid installation of Lethal Company is required unless USE_STUBBED_LIBS is set.
Run ./build.sh to run the default build task.
./build.sh
Clone the repo.
git clone https://github.com/Rune580/LethalCompanyInputUtils
Enter the cloned repo.
cd LethalCompanyInputUtils
Copy and rename .env.example to .env.
cp .env.example .env
Edit .env to fit your needs, a valid installation of Lethal Company is required unless USE_STUBBED_LIBS is set.
Run ./build.ps1 to run the default build task.
.\build.ps1
Discord: @rune
Github: Rune580
Thanks to the following contributers:
All notable changes to this project will be documented here.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Hotfix for applying migrations when the new file already existed, no longer crashes the mod.
Bind overrides have been moved from BepInEx/controls to BepInEx/config/controls allowing for bind overrides to be distributed with modpacks.
InputActions can now be made at runtime by overriding the method CreateInputActions(...) and using the provided builder.
The only required parameter for the InputActions attribute is now only just the kbmPath, the rest are now optional. Should help improve DX.
Interactions for the kbm and gamepad bindings can now be set in the attribute.
Initial Beta Release.