Files
gregWiki/docs/framework/greg-hooks-and-events.md
2026-04-10 16:41:04 +02:00

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 (EventIdsgreg.*) 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)

  • EventIds and EventDispatcher: gregCore/framework/src/ModLoader/EventDispatcher.cs (numeric ids aligned with Rust).
  • Mapping → greg.*: GregNativeEventHooks (gregCore/framework/src/Sdk/GregNativeEventHooks.cs); emission via GregHookIntegration in 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

See also