4 Commits
3 changed files with 42 additions and 10 deletions
+13 -4
View File
@@ -54,6 +54,7 @@ public class CommandHookModSystem : ModSystem
/// <summary>
/// Registers a listener for the commands it returns from <see cref="ICommandHookListener.Commands"/>.
/// No-ops silently if CommandHook hasn't finished server-side startup yet.
/// </summary>
/// <remarks>
/// Calling this again for a <see cref="ICommandHookListener.ModId"/> that is already
@@ -63,8 +64,11 @@ public class CommandHookModSystem : ModSystem
/// list, this just calls <see cref="Unregister"/> instead.
/// </remarks>
/// <param name="listener">The listener to register or update.</param>
public void Register(ICommandHookListener listener)
public static void Register(ICommandHookListener listener)
{
if (Instance == null)
return;
var commands = listener.Commands;
if (commands == null || commands.Count == 0)
@@ -73,6 +77,7 @@ public class CommandHookModSystem : ModSystem
return;
}
var listeners = Instance.listeners;
int index = listeners.FindIndex(l => l.ModId == listener.ModId);
bool changed = false;
@@ -88,7 +93,7 @@ public class CommandHookModSystem : ModSystem
}
if (changed)
Rebuild();
Instance.Rebuild();
}
/// <summary>
@@ -96,15 +101,19 @@ public class CommandHookModSystem : ModSystem
/// that was never registered, this is a no-op in that case.
/// </summary>
/// <param name="listener">The listener to remove, matched by <see cref="ICommandHookListener.ModId"/>.</param>
public void Unregister(ICommandHookListener listener)
public static void Unregister(ICommandHookListener listener)
{
if (Instance == null)
return;
var listeners = Instance.listeners;
int index = listeners.FindIndex(l => l.ModId == listener.ModId);
if (index < 0)
return;
listeners.RemoveAt(index);
Rebuild();
Instance.Rebuild();
}
// Rebuilds the dispatch table from listeners. Runs unconditionally and
+1 -1
View File
@@ -6,7 +6,7 @@
"authors": [
"anth64"
],
"version": "2.0.0",
"version": "2.1.0",
"side": "Server",
"dependencies": {
"game": "1.22.3"
+28 -5
View File
@@ -11,12 +11,35 @@ depends on it.
## For mod development
Set the `COMMANDHOOK` environment variable to the folder containing
`CommandHook.dll` (i.e. wherever you've built CommandHook), the same way
`VINTAGE_STORY` points at your game install.
**Linux/macOS** (add to `~/.bashrc`, `~/.zshrc`, etc.):
```bash
export COMMANDHOOK="/path/to/CommandHook/CommandHook/bin/Release"
```
**Windows (PowerShell):**
```powershell
[Environment]::SetEnvironmentVariable("COMMANDHOOK", "C:\path\to\CommandHook\CommandHook\bin\Release", "User")
```
Then add a `Reference` to your `.csproj` next to your other game references:
```xml
<Reference Include="CommandHook">
<HintPath>$(COMMANDHOOK)/CommandHook.dll</HintPath>
<Private>false</Private>
</Reference>
```
Add it as a dependency in your `modinfo.json`:
```json
"dependencies": {
"game": "1.22.3",
"commandhook": "2.0.0"
"commandhook": "2.1.0"
}
```
@@ -93,16 +116,16 @@ Register it once your mod starts, unregister it on dispose:
```csharp
public override void StartServerSide(ICoreServerAPI api)
{
// CommandHookModSystem.Instance is null if CommandHook isn't loaded,
// hence the ?. Register your listener once, here.
CommandHookModSystem.Instance?.Register(myListener);
// Register your listener once, here. No-ops silently if CommandHook
// isn't loaded.
CommandHookModSystem.Register(myListener);
}
public override void Dispose()
{
// Always unregister on dispose, otherwise a stale listener stays in
// the dispatch table after your mod is gone.
CommandHookModSystem.Instance?.Unregister(myListener);
CommandHookModSystem.Unregister(myListener);
}
```