5.3 KiB
title, sidebar_label, description
| title | sidebar_label | description |
|---|---|---|
| Greg hooks & event runtime | Greg hooks & events | greg.* hooks, GregEventDispatcher, GregNativeEventHooks, greg_hooks.json, Rust FFI event ids, and compat aliases. |
Greg hooks & event runtime
The FrikaModdingFramework.dll assembly is built from gregCore/framework/FrikaMF.csproj and combines Harmony patches, C# events (GregEventDispatcher), and the Rust/native bridge. Mod authors mainly care about three surfaces:
| Surface | Role | Typical entry |
|---|---|---|
greg.* hook strings |
Canonical names for Harmony/mod code; registry in greg_hooks.json. |
GregEventDispatcher.On("greg....", handler, modId) in gregFramework.Core |
Native pipeline (EventIds → greg.*) |
Same gameplay moments as FFI events; centralized in GregNativeEventHooks. |
Constants / Resolve(uint) on gregFramework.Core.GregNativeEventHooks |
| Legacy aliases | Old spellings → canonical greg.*. |
GregCompatBridge (+ optional legacy entries in greg_hooks.json) |
New documentation identifiers still follow FMF.<Domain>.* — see FMF hook naming. Runtime strings for the native chain are greg.* as defined by GregNativeEventHooks and greg_hooks.json.
greg_hooks.json (version 2)
| Path | Role |
|---|---|
Repo root greg_hooks.json |
Source of truth: name, patchTarget, strategy, payloadSchema, optional legacy. |
Next to FrikaModdingFramework.dll |
Copied from the monorepo root on build so GregCompatBridge can resolve legacy names. |
Regenerate: gregCore/scripts/Generate-GregHooksFromIl2CppDump.ps1 when Il2Cpp/interop inputs change.
GregEventDispatcher / SDK
Implementation: gregCore/framework/src/Sdk/GregEventDispatcher.cs (namespace gregFramework.Core). API: On / Once / Off / Emit, OnCancelable / InvokeCancelable, UnregisterAll(modId).
Build stable hook strings with GregHookName.Create(GregDomain.*, "Action") or GregNativeEventHooks.* constants.
Native events (EventIds)
EventIdsandEventDispatcher:gregCore/framework/src/ModLoader/EventDispatcher.cs(numeric ids aligned with Rust).- Mapping →
greg.*:GregNativeEventHooks(gregCore/framework/src/Sdk/GregNativeEventHooks.cs); emission viaGregHookIntegrationin the same ModLoader tree. - Wiki table: greg hooks catalog (generator:
gregCore/tools/Generate-GregHookCatalog.ps1).
Lua event & hook subscriptions
Lua scripts subscribe to the same event surfaces through the greg.* API injected by GregHooksLuaModule:
| Lua API | C# backend | Purpose |
|---|---|---|
greg.on(hookName, fn) |
GregEventDispatcher.On() |
Subscribe to any greg.* event — receives payload as Lua table |
greg.off(hookName) |
GregEventDispatcher.Off() |
Unsubscribe all Lua handlers for a hook |
greg.emit(hookName, payload) |
GregEventDispatcher.Emit() |
Emit a custom event (other Lua/C# listeners receive it) |
greg.hook.before(hookName, fn) |
HookBinder.OnBefore() |
Harmony prefix — fn receives {hook_name, type_name, method_name, instance_handle, arg_count} |
greg.hook.after(hookName, fn) |
HookBinder.OnAfter() |
Harmony postfix — same context table |
greg.hook.off(hookName) |
HookBinder.Unregister() |
Remove all handlers for a Harmony hook |
Example — react to CableSpinner.Start in Lua:
greg.hook.after("greg.Misc.OnStart", function(ctx)
if ctx.type_name and ctx.type_name:find("CableSpinner") then
greg.log("new spinner spawned, handle: " .. tostring(ctx.instance_handle))
end
end)
Example — listen to game events:
greg.on("greg.PLAYER.CoinChanged", function(payload)
greg.log("coins changed by " .. tostring(payload.coinChangeAmount))
end)
All hook names from GregNativeEventHooks (e.g. greg.PLAYER.CoinChanged, greg.SERVER.PowerButton) and HookBinder aliases (e.g. greg.Misc.OnStart) are available to Lua.
Rust FFI
Rust/native mods receive numeric event ids; C# mirrors the same moments as greg.* through GregHookIntegration while the game runs. The RustLanguageBridgeAdapter fully delegates all lifecycle calls (OnUpdate, OnSceneLoaded, Shutdown, event dispatch) to FFIBridge. Bridge code: FfiBridge.cs / RustLanguageBridgeAdapter.cs under framework/ModLoader/.
MelonLoader entry points (one DLL)
Depending on the build, multiple MelonMod types may ship in the same assembly (e.g. main framework plugin vs. AssetExporter paths) — check MelonInfo / MelonGame in source.
Tooling
- MCP:
greg_hook_registry,greg_hook_search, … withdataRoot→gregCore/— MCP server. - FMF hooks catalog is now a short redirect to
GregNativeEventHooks/ greg hooks catalog (the oldHookNames.cstable is gone).