diff --git a/docs/README.md b/docs/README.md index 8b20641..4a24ffc 100644 --- a/docs/README.md +++ b/docs/README.md @@ -18,7 +18,7 @@ This folder is the **single source of truth** for the public Docusaurus site. Th ## URLs -- Doc id `intro` → `/wiki` (see front matter `slug: /`). +- Doc id `intro` → `/wiki` (see `intro.md`, `slug: /`). - Most docs → `/wiki/` (e.g. `mods/framework` → `/wiki/mods/framework`). ## Scripts (repository root) diff --git a/docs/framework/greg-hooks-and-events.md b/docs/framework/greg-hooks-and-events.md index dae2833..5c723e5 100644 --- a/docs/framework/greg-hooks-and-events.md +++ b/docs/framework/greg-hooks-and-events.md @@ -1,53 +1,57 @@ --- title: Greg hooks & event runtime sidebar_label: Greg hooks & events -description: greg.* hook registry, GregEventDispatcher, Rust FFI event ids, and how they relate to legacy FFM strings. +description: greg.* hooks, GregEventDispatcher, GregNativeEventHooks, greg_hooks.json, Rust FFI event ids, and compat aliases. --- # Greg hooks & event runtime -The **FrikaModdingFramework** assembly (`gregCore/FrikaMF.csproj`, output **`FrikaModdingFramework.dll`**) combines Harmony patches, C# mod events, and the Rust/native bridge. Mod and plugin authors should understand **three related surfaces**: +Die Assembly **`FrikaModdingFramework.dll`** entsteht aus **`gregCore/framework/FrikaMF.csproj`** und bündelt Harmony-Patches, C#-Events (`GregEventDispatcher`), sowie die Rust-/Native-Bridge. Für Mod-Autor:innen sind im Wesentlichen **drei Flächen** relevant: -| Surface | Purpose | Typical entry | -|--------|---------|----------------| -| **`greg.*` string hooks** | Canonical hook names for new work; registry drives codegen and docs. | `GregEventDispatcher.On("greg....", handler, modId)` in **`gregFramework.Core`** | -| **Legacy `FFM.*` strings** | Numeric Rust/game pipeline still resolves through **`HookNames`** constants today. | [`FrikaMF/HookNames.cs`](https://github.com/mleem97/gregFramework/blob/main/gregCore/FrikaMF/HookNames.cs), [`EventIds.cs`](https://github.com/mleem97/gregFramework/blob/main/gregCore/FrikaMF/EventIds.cs) | -| **In-process mod messages** | Cross-mod C# notifications (not the same as `greg.*`). | `AssetExporter.ModFramework` / **`ModFramework.Events`** | +| Fläche | Zweck | Typischer Einstieg | +|--------|--------|---------------------| +| **`greg.*` Hook-Strings** | Kanonische Namen für Harmony-/Mod-Code; Registry in **`greg_hooks.json`**. | `GregEventDispatcher.On("greg....", handler, modId)` in **`gregFramework.Core`** | +| **Native Pipeline (`EventIds` → `greg.*`)** | Gleiche Spielmomente wie FFI-Events; zentral **`GregNativeEventHooks`**. | Konstanten / `Resolve(uint)` in **`gregFramework.Core.GregNativeEventHooks`** | +| **Legacy-Aliase** | Alte String-Schreibweisen → kanonisches **`greg.*`**. | **`GregCompatBridge`** (+ optional Einträge in **`greg_hooks.json`** `legacy`) | -Naming policy for **new** public identifiers remains **`FMF..*`** — see [FMF hook naming](/wiki/reference/fmf-hook-naming). The **`greg.*`** registry is generated from the Il2Cpp unpack and is the **runtime source of truth** for Harmony bridge patches in **`gregFramework.Hooks`** (auto-generated types under `gregCore/Hooks/`). +Neue **öffentliche Dokumentations-IDs** folgen weiterhin **`FMF..*`** — siehe [FMF hook naming](/wiki/reference/fmf-hook-naming). Die **Laufzeit** für die native Kette ist **`greg.*`** wie in **`GregNativeEventHooks`** und **`greg_hooks.json`**. -## `greg_hooks.json` (version 2) +## `greg_hooks.json` (Version 2) -- **Repo paths:** `gregCore/gregFramework/greg_hooks.json` (and a mirrored copy under `gregCore/framework/gregFramework/` for some builds). -- **Meaning:** canonical list of `greg..` hooks with patch targets, strategies, and payload hints. -- **Regenerate:** `gregCore/scripts/Generate-GregHooksFromIl2CppDump.ps1` when `gregReferences/` Il2Cpp unpack or merged interop changes. -- **Runtime compat:** **`GregCompatBridge`** (`gregFramework.Core`) can load **`greg_hooks.json`** next to the framework DLL to map legacy spellings. +| Pfad | Rolle | +|------|--------| +| **Repo-Root** `greg_hooks.json` | Quelle der Wahrheit: `name`, `patchTarget`, `strategy`, `payloadSchema`, optional `legacy`. | +| **Neben `FrikaModdingFramework.dll`** | Wird per `FrikaMF.csproj` aus dem Monorepo-Root kopiert, damit **`GregCompatBridge`** Legacy-Namen auflösen kann. | -## `GregEventDispatcher` +Regenerieren: `gregCore/scripts/Generate-GregHooksFromIl2CppDump.ps1` bei geändertem Il2Cpp-/Interop-Stand. -Implemented in **`gregCore/Core/GregEventDispatcher.cs`** (`namespace gregFramework.Core`). Use **`On` / `Once` / `Off` / `Emit`** (and cancelable overloads where exposed) for string-keyed hooks with optional **`modId`** for diagnostics. +## `GregEventDispatcher` / SDK -## Rust FFI and numeric events +Implementierung: **`gregCore/framework/src/Sdk/GregEventDispatcher.cs`** (`namespace gregFramework.Core`). API: **`On` / `Once` / `Off` / `Emit`**, **`OnCancelable` / `InvokeCancelable`**, **`UnregisterAll(modId)`**. -Rust/native mods receive **numeric** event ids; C# maps them via **`EventDispatcher`** / **`GregHookIntegration`** in **`gregCore/framework/src/ModLoader`** so that game and bridge traffic can still surface as **`greg.*`** where integrated. Native loading is **`FFIBridge`** (`FfiBridge.cs`) in the same tree — there is no separate `gregSta.RustBridge` project. +Hook-Strings stabil mit **`GregHookName.Create(GregDomain.*, "Action")`** oder den **`GregNativeEventHooks.*`**-Konstanten bauen. -## MelonLoader entry points (same DLL) +## Native Events (`EventIds`) -Two **`MelonMod`** types ship in one assembly for different scenarios (check `MelonInfo` / `MelonGame` attributes in source): +- **`EventIds`** und **`EventDispatcher`:** `gregCore/framework/src/ModLoader/EventDispatcher.cs` (Rust-kompatible numerische IDs). +- **Mapping → `greg.*`:** **`GregNativeEventHooks`** (`gregCore/framework/src/Sdk/GregNativeEventHooks.cs`); Emission über **`GregHookIntegration`** im selben ModLoader-Baum. +- **Katalog (Wiki):** [greg hooks catalog](/wiki/reference/greg-hooks-catalog) (Generator: `gregCore/tools/Generate-GregHookCatalog.ps1`). -- **`DataCenterModLoader.Core`** — primary Data Center + Rust load path (`FrikaMF/Core.cs`). -- **`AssetExporter.Main`** — broader tooling / dev entry (`Main.cs`), also participates in framework bootstrap paths. +## Rust FFI -Exact responsibilities evolve in **`gregCore`**; treat this split as **“two hosts, one framework DLL”** when debugging load order. +Rust-/Native-Mods erhalten **numerische** Event-IDs; C# spiegelt dieselben Momente als **`greg.*`** über **`GregHookIntegration`**, sobald der Code läuft (auch ohne aktive FFI-Verbindung für die greg-Oberfläche). Bridge-Code: **`FfiBridge` / `FFIBridge`** unter `framework/src/ModLoader/`. -## Tooling & assistants +## MelonLoader-Einstiege (eine DLL) -- **MCP:** `greg_hook_registry`, `greg_hook_search`, `greg_hook_stats` read **`greg_hooks.json`** when `dataRoot` points at **`gregCore/`** — see [MCP server](/wiki/reference/mcp-server). -- **Legacy catalog page:** [FMF hooks catalog](/wiki/reference/fmf-hooks-catalog) is generated from **`FrikaMF/HookNames.cs`** and **`FrikaMF/EventIds.cs`** (`tools/Generate-FmfHookCatalog.ps1`). -- **Declarative doc stub:** [FMF Hook Reference](/wiki/framework/fmf-hooks) (from `fmf_hooks.json` / scanner, may lag core). +Je nach Build können mehrere **`MelonMod`**-Typen in derselben Assembly liegen (z. B. Framework-Hauptplugin, AssetExporter-Pfade) — **`MelonInfo`** / **`MelonGame`** in den Quellen prüfen. -## See also +## Tooling + +- **MCP:** `greg_hook_registry`, `greg_hook_search`, … mit `dataRoot` → **`gregCore/`** — [MCP server](/wiki/reference/mcp-server). +- **Legacy-Seite [FMF hooks catalog](/wiki/reference/fmf-hooks-catalog)** verweist nur noch auf **`GregNativeEventHooks`** / greg-Katalog (kein `HookNames.cs` mehr). + +## Siehe auch - [Repository architecture](/wiki/framework/architecture) -- [FFI, hooks & Lua (hub)](/wiki/topics/ffi-and-hooks/overview) +- [FFI, hooks & Lua (Hub)](/wiki/topics/ffi-and-hooks/overview) - [Getting started](/wiki/getting-started) diff --git a/docs/getting-started.md b/docs/getting-started.md index 62d6716..ee6363c 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -1,50 +1,53 @@ --- title: Getting started sidebar_label: Getting started -description: "Split-repo workspace: gregFramework layout, building the core, and where docs live." +description: Workspace-Layout (gregFramework), gregCore bauen, Hooks & erste Mod-Schritte. --- -The workspace is **multi-repo** with a local `gregFramework/` folder containing standalone repositories. **Logical stack:** **ModManager → framework / SDK → plugins → mods** — see [System architecture & documentation principles](/wiki/meta/system-architecture-principles). +Der Workspace ist **multi-repo**: unter einem gemeinsamen Ordner `gregFramework/` liegen mehrere Git-Repos **flach** nebeneinander. **Logik:** **ModManager → Framework / SDK → Plugins → Mods** — siehe [System architecture & documentation principles](/wiki/meta/system-architecture-principles). -- `gregCore/` — core SDK: build **`gregCore/FrikaMF.sln`** (main project **`gregCore/framework/FrikaMF.csproj`**); MCP server under `gregCore/mcp-server/` -- `gregMod./` — gameplay mods (`FMF.*`), **flat** next to `gregCore/` (legacy umbrella `gregMods/` is deprecated) -- `gregExt./` — framework plugins (`FFM.Plugin.*`), same flat layout (legacy `gregExtensions/` deprecated) -- `gregModmanager/` — **GregModManager** / **Gregtools Modmanager** (`WorkshopUploader.csproj`) -- `gregDataCenterExporter/` — exporter, templates, hook JSON mirrors -- `gregWiki/` — this documentation site +| Ordner | Inhalt | +|--------|--------| +| **`gregCore/`** | Framework: **`gregCore/FrikaMF.sln`**, Hauptprojekt **`gregCore/framework/FrikaMF.csproj`**; SDK unter `framework/src/Sdk/`; MCP unter `gregCore/mcp-server/` | +| **`gregMod./`** | Gameplay-Mods (`FMF.*`-Assemblies üblich), **flach** neben `gregCore/` (Umbrella **`gregMods/`** ist veraltet) | +| **`gregExt./`** | Framework-Plugins (`FFM.Plugin.*` / `greg.Plugin.*`), ebenfalls flach (**`gregExtensions/`** veraltet) | +| **`gregModmanager/`** | GregModManager / Workshop-UI (`WorkshopUploader.csproj`) | +| **`gregDataCenterExporter/`** | Exporter, Templates, Spiegel | +| **`gregWiki/`** | Diese Doku (Docusaurus) | -**Rust / native mods** are loaded by the **core** via **`FFIBridge`** (`gregCore/framework/src/ModLoader/FfiBridge.cs`); there is no separate `bridges/gregSta.RustBridge` tree in the workspace anymore. +Rust-/Native-Mods werden vom Core über die FFI-Schicht geladen; Bridge-Code lebt im **`framework/src/ModLoader/`**-Baum von **gregCore**. -## Build the core +## Framework bauen -```text +```bash dotnet build gregCore/FrikaMF.sln -c Release ``` -Or open `gregCore/FrikaMF.sln` in your IDE. +Oder `gregCore/FrikaMF.sln` in der IDE öffnen. Für CI ohne lokale Spiel-Installation oft: **`-p:CI=true`** (siehe jeweilige `.csproj`-Targets). -## Hooks and registries +**Voraussetzungen:** MelonLoader **net6**-Assemblies und Il2Cpp-Interop des Spiels — entweder aus `{Game}/MelonLoader/` oder aus **`gregCore/lib/references/MelonLoader`** (z. B. via `python gregCore/tools/refresh_refs.py`). Umgebungsvariable **`DATA_CENTER_GAME_DIR`** hilft beim Auflösen des Spielpfads. -- **Docs / policy:** target public identifiers **`FMF..`** — [FMF hook naming](/wiki/reference/fmf-hook-naming) and [`CONTRIBUTING.md`](https://github.com/mleem97/gregFramework/blob/main/CONTRIBUTING.md). -- **Runtime string table + numeric `EventIds`:** [`gregCore/framework/FrikaMF/HookNames.cs`](https://github.com/mleem97/gregFramework/blob/main/gregCore/framework/FrikaMF/HookNames.cs) and [`EventIds.cs`](https://github.com/mleem97/gregFramework/blob/main/gregCore/framework/FrikaMF/EventIds.cs) — today these resolve the Rust/game pipeline to **`FFM.*`** literals; see [FMF hooks catalog](/wiki/reference/fmf-hooks-catalog). -- **Canonical `greg.*` registry (JSON v2):** `gregCore/gregFramework/greg_hooks.json` — Il2Cpp-driven list for codegen and MCP; regenerate with **`gregCore/scripts/Generate-GregHooksFromIl2CppDump.ps1`**. Overview: [Greg hooks & event runtime](/wiki/framework/greg-hooks-and-events). -- **Optional legacy declarative file:** `fmf_hooks.json` (e.g. under `gregDataCenterExporter/FrikaModFramework/`) for older tooling — see [MCP server](/wiki/reference/mcp-server). +## Hooks & Registries -## Start a mod +| Thema | Wo | +|--------|-----| +| **Kanonische `greg.*` (JSON, Il2Cpp)** | Repo-Root **`greg_hooks.json`**; Regeneration: **`gregCore/scripts/Generate-GregHooksFromIl2CppDump.ps1`** | +| **EventId → `greg.*` (FFI / natives Pipeline)** | **`GregNativeEventHooks`** — [greg hooks catalog](/wiki/reference/greg-hooks-catalog), Quellcode `gregCore/framework/src/Sdk/GregNativeEventHooks.cs` | +| **Doku-Namenskonvention `FMF.*`** | [FMF hook naming](/wiki/reference/fmf-hook-naming) | +| **Architektur Überblick** | [Greg hooks & event runtime](/wiki/framework/greg-hooks-and-events) | +| **Legacy-Strings** | **`GregCompatBridge`** lädt **`greg_hooks.json`** neben **`FrikaModdingFramework.dll`** | -1. Add a new mod repo as `gregMod./` under `gregFramework/` (clone or create next to `gregCore/`). -2. Use templates from `gregCore/Templates/` (and mirrored templates under `gregDataCenterExporter/Templates/` where applicable). -3. Maintain hook metadata and version the mod in its own repository. +## Ersten Mod starten -## Documentation site +1. Neues Repo **`gregMod./`** unter `gregFramework/` anlegen (oder Template klonen). +2. **`ProjectReference`** auf **`gregCore/framework/FrikaMF.csproj`** setzen (wie **`mods/GregShowcaseMod/`**). +3. API **`gregFramework.Core`** (`GregEventDispatcher`, `GregHookName`, `GregNativeEventHooks`, …). +4. Vorlagen: **`gregCore/Templates/greg.BasedModTemplate/`** oder gespiegelte Templates unter **`gregDataCenterExporter/Templates/`**. -- **Repository:** `gregWiki/` -- **Content:** Markdown/MDX in this repo, aligned with the split layout. +Referenz-Mod: **`mods/GregShowcaseMod/`** — [Greg hooks showcase](/wiki/guides/mod-developers/greg-hooks-showcase). -### Docker +## Dokumentations-Site (`gregWiki/`) -From the `gregWiki` root: `docker build -t gregwiki-docs .` then `docker run --rm -p 3000:3000 gregwiki-docs`. - -### MCP - -See [`reference/mcp-server`](./reference/mcp-server.md) — implementation under **`gregCore/mcp-server/`** (install and `--data-root` per that folder’s `README.md`). +- Markdown unter **`gregWiki/docs/`** +- Docker: im **`gregWiki/`**-Root `docker build` / `docker run` (siehe **`gregWiki/README.md`**) +- MCP: [mcp-server](/wiki/reference/mcp-server) — Server unter **`gregCore/mcp-server/`** diff --git a/docs/getting-started/documentation-layout.md b/docs/getting-started/documentation-layout.md index 8de0dc9..2c8c329 100644 --- a/docs/getting-started/documentation-layout.md +++ b/docs/getting-started/documentation-layout.md @@ -13,7 +13,7 @@ This folder is the **single source of truth** for the public Docusaurus site. Th | Area | Path | Purpose | |------|------|--------| -| **Landing** | [`intro` → `/wiki`](/wiki) | Mod author wiki home (`slug: /`). | +| **Landing** | [`intro` → `/wiki`](/wiki) | Mod author wiki home (`slug: /` under the docs plugin). | | **Getting started** | [`getting-started.md`](../getting-started.md) | Onboarding (`getting-started`) + this layout page. | | **Workspace** | [`workspace/`](../workspace/index.mdx) | Map of `gregFramework/` repos on disk. | | **Framework** | [`framework/`](../framework/architecture.md) | Architecture, hooks, Hexmod. | @@ -30,7 +30,7 @@ This folder is the **single source of truth** for the public Docusaurus site. Th ## URLs -- Doc id `intro` → `/wiki` (root of the docs plugin). +- Doc id `intro` → `/wiki` (`slug: /`; legacy `/wiki/docs` redirects here). - Typical doc → `/wiki/` (e.g. `mods/framework` → `/wiki/mods/framework`). ## Language diff --git a/docs/mods/framework.md b/docs/mods/framework.md index 607d502..eea2c0d 100644 --- a/docs/mods/framework.md +++ b/docs/mods/framework.md @@ -16,8 +16,9 @@ The core `FrikaMF` runtime provides: ## Core references -- [FMF hooks (generated)](/wiki/framework/fmf-hooks) — hook surface and categories -- [FMF hook naming](/wiki/reference/fmf-hook-naming) — `FMF.*` vs legacy `FFM.*` -- [FMF hooks catalog](/wiki/reference/fmf-hooks-catalog) — strings from core `HookNames.cs` -- [greg hooks registry (IL2CPP)](/wiki/reference/greg-hooks-registry) — `greg.*` Harmony hooks and `greg_hooks.json` +- [FMF hooks (generated)](/wiki/framework/fmf-hooks) — hook surface and categories (deklarativ; kann der JSON-Registry folgen) +- [FMF hook naming](/wiki/reference/fmf-hook-naming) — **`FMF.*`** Doku-Konvention +- [greg hooks catalog](/wiki/reference/greg-hooks-catalog) — **EventId → `greg.*`** (`GregNativeEventHooks`, generiert) +- [FMF hooks catalog](/wiki/reference/fmf-hooks-catalog) — Kurzüberblick / Redirect (ersetzt altes `HookNames`) +- [greg hooks registry (IL2CPP)](/wiki/reference/greg-hooks-registry) — `greg_hooks.json`, Generator, Harmony-Deduplizierung - [Framework architecture](/wiki/framework/architecture) — runtime layout and bridges diff --git a/docs/reference/fmf-hook-naming.md b/docs/reference/fmf-hook-naming.md index f53769e..e812ae5 100644 --- a/docs/reference/fmf-hook-naming.md +++ b/docs/reference/fmf-hook-naming.md @@ -44,15 +44,16 @@ Domains are **closed by default**. Add a new domain only via changelog + maintai Harmony patches in **gregFramework** emit stable **`greg..`** strings via `GregHookName` / `GregEventDispatcher`. That surface is documented in **[greg hooks registry (IL2CPP)](/wiki/reference/greg-hooks-registry)** (`greg_hooks.json`, regeneration, overlap with hand-written `HarmonyPatches`). It is separate from the `FMF.*` / `FFM.*` documentation constants below. -## Legacy: `FFM.*` strings in code +## Native pipeline: `GregNativeEventHooks` (replaces `HookNames`) -The runtime currently maps numeric event IDs to **`FFM.*`** string constants in [`FrikaMF/HookNames.cs`](https://github.com/mleem97/gregFramework/blob/master/FrikaMF/HookNames.cs) (e.g. `FFM.Economy.Balance.OnChanged`). That is **legacy naming** (four segments after `FFM`). +Numeric **`EventIds`** are mapped to canonical **`greg.*`** strings in **`GregNativeEventHooks`** ([source](https://github.com/mleem97/gregFramework/blob/main/gregCore/framework/src/Sdk/GregNativeEventHooks.cs)), aligned with **`greg_hooks.json`** where that file names the patched method. Logging uses **`GregNativeEventHooks.Resolve(uint)`**; unknown ids → **`greg.SYSTEM.UnmappedNativeEvent`**. + +**`GregCompatBridge`** ([source](https://github.com/mleem97/gregFramework/blob/main/gregCore/framework/src/Sdk/GregCompatBridge.cs)) redirects **deprecated** hook spellings (including older documentation-style names) to the current **`greg.*`** string — see also `legacy` entries in **`greg_hooks.json`**. **Policy** -- New documentation and greenfield APIs should use **`FMF..*`** as above. -- When touching `HookNames.cs`, prefer aligning new entries to **`FMF.*`**; otherwise keep **`FFM.*`** until a planned major version bump documents a rename map. -- The [generated hook catalog](./fmf-hooks-catalog.md) lists **what the code emits today** (including `FFM.*`). +- New **documentation** identifiers: **`FMF..*`** as above. +- New **runtime** subscriptions: always **`greg.*`** via **`GregHookName.Create`** or **`GregNativeEventHooks`** constants — see [greg hooks catalog](./greg-hooks-catalog.md). ## Cross-language stubs (documentation) @@ -70,5 +71,6 @@ Bindings are **not** auto-generated for all languages; stubs are for contributor ## Related -- [FMF hooks catalog](./fmf-hooks-catalog.md) (generated) -- [FMF hooks](/wiki/framework/fmf-hooks) — generated hook surface and categories +- [greg hooks catalog](./greg-hooks-catalog.md) — EventId → **`greg.*`** (generated) +- [FMF hooks catalog](./fmf-hooks-catalog.md) — Kurzüberblick / Redirect +- [FMF hooks](/wiki/framework/fmf-hooks) — deklarative Oberfläche (kann hinter der Core-Registry zurückstehen) diff --git a/docs/reference/fmf-hooks-catalog.md b/docs/reference/fmf-hooks-catalog.md index 79aeddb..5b5ea07 100644 --- a/docs/reference/fmf-hooks-catalog.md +++ b/docs/reference/fmf-hooks-catalog.md @@ -1,111 +1,36 @@ --- id: fmf-hooks-catalog -title: FMF hooks catalog +title: FMF hooks catalog (legacy) slug: /reference/fmf-hooks-catalog -description: Auto-generated catalog of hook strings and event id mappings from FrikaMF sources. +description: Redirect — native EventId → greg.* mapping now lives in GregNativeEventHooks; see greg hooks catalog. --- - + -# FMF hooks catalog +# FMF hooks catalog (legacy) -This page is **generated** from `gregCore/framework/FrikaMF/HookNames.cs` and `gregCore/framework/FrikaMF/EventIds.cs`. -Regenerate after hook changes: `./tools/Generate-FmfHookCatalog.ps1` +Die frühere, aus **`HookNames.cs`** generierte Tabelle wurde **entfernt**. Die Laufzeit mappt numerische **`EventIds`** heute zentral über **`GregNativeEventHooks`** auf kanonische **`greg.*`**-Strings (siehe auch **`GregCompatBridge`** für veraltete Schreibweisen). -**Generated:** 2026-04-10 01:36:21 UTC +## Aktuelle Quellen -## Hook string constants +| Thema | Wo | +|--------|-----| +| **EventId → `greg.*` (FFI / natives Pipeline)** | [greg hooks catalog](./greg-hooks-catalog.md) — generiert aus `gregCore/framework/src/Sdk/GregNativeEventHooks.cs` und `EventIds` in `EventDispatcher.cs` | +| **Il2Cpp-Hook-Registry (JSON)** | `greg_hooks.json` im Repo-Root; Kopie neben `FrikaModdingFramework.dll` beim Build | +| **Doku-Politik `FMF.*`** | [FMF hook naming](./fmf-hook-naming.md) — Namenskonvention für neue *Dokumentations*-IDs (nicht 1:1 jedes Runtime-Strings) | -| C# field | Hook string | -|----------|-------------| -| ``CustomerContractOnSigned`` | ``FFM.Customer.Contract.OnSigned`` | -| ``CustomerReputationOnChanged`` | ``FFM.Customer.Reputation.OnChanged`` | -| ``CustomerSlaOnBreached`` | ``FFM.Customer.SLA.OnBreached`` | -| ``CustomerSlaOnRestored`` | ``FFM.Customer.SLA.OnRestored`` | -| ``EconomyBalanceOnChanged`` | ``FFM.Economy.Balance.OnChanged`` | -| ``EmployeesStaffOnHired`` | ``FFM.Employees.Staff.OnHired`` | -| ``EmployeesStaffOnTerminatedCustom`` | ``FFM.Employees.Staff.OnTerminated`` | -| ``FrameworkHooksOnBridgeInstalled`` | ``FFM.Framework.Hooks.OnBridgeInstalled`` | -| ``FrameworkHooksOnBridgeTriggered`` | ``FFM.Framework.Hooks.OnBridgeTriggered`` | -| ``GameLoadOnCompleted`` | ``FFM.Game.Load.OnCompleted`` | -| ``GameSaveOnCompleted`` | ``FFM.Game.Save.OnCompleted`` | -| ``GameSaveOnRequested`` | ``FFM.Game.Save.OnRequested`` | -| ``GameTimeOnDayChanged`` | ``FFM.Game.Time.OnDayChanged`` | -| ``GameTimeOnMonthChanged`` | ``FFM.Game.Time.OnMonthChanged`` | -| ``GameXpOnGained`` | ``FFM.Game.XP.OnGained`` | -| ``NetworkCableOnConnected`` | ``FFM.Network.Cable.OnConnected`` | -| ``NetworkCableOnConnectedSuppress`` | ``FFM.Network.Cable.OnConnected.Suppress`` | -| ``NetworkCableOnDisconnected`` | ``FFM.Network.Cable.OnDisconnected`` | -| ``NetworkCableOnDisconnectedSuppress`` | ``FFM.Network.Cable.OnDisconnected.Suppress`` | -| ``NetworkCableOnLinkDown`` | ``FFM.Network.Cable.OnLinkDown`` | -| ``NetworkCableOnLinkUp`` | ``FFM.Network.Cable.OnLinkUp`` | -| ``NetworkTrafficOnThresholdExceeded`` | ``FFM.Network.Traffic.OnThresholdExceeded`` | -| ``ObjectsDeviceOnDegraded`` | ``FFM.Objects.Device.OnDegraded`` | -| ``ObjectsDeviceOnEOL`` | ``FFM.Objects.Device.OnEOL`` | -| ``ObjectsDeviceOnPoweredOff`` | ``FFM.Objects.Device.OnPoweredOff`` | -| ``ObjectsDeviceOnPoweredOn`` | ``FFM.Objects.Device.OnPoweredOn`` | -| ``ObjectsDeviceOnRepaired`` | ``FFM.Objects.Device.OnRepaired`` | -| ``ObjectsRackOnDevicePlaced`` | ``FFM.Objects.Rack.OnDevicePlaced`` | -| ``ObjectsRackOnRemoved`` | ``FFM.Objects.Rack.OnRemoved`` | -| ``ObjectsServerOnClientAssigned`` | ``FFM.Objects.Server.OnClientAssigned`` | -| ``ObjectsServerOnClientUnassigned`` | ``FFM.Objects.Server.OnClientUnassigned`` | -| ``StoreCartOnCheckedOut`` | ``FFM.Store.Cart.OnCheckedOut`` | -| ``StoreCartOnItemAdded`` | ``FFM.Store.Cart.OnItemAdded`` | -| ``StoreCartOnItemRemoved`` | ``FFM.Store.Cart.OnItemRemoved`` | -| ``WorldRoomOnExpanded`` | ``FFM.World.Room.OnExpanded`` | +## Katalog neu erzeugen -## Event id to hook mapping +Im **gregCore**-Repo (gregWiki-Checkout liegt typischerweise **nebendran**): -| Event id (uint) | EventIds name | Resolves to field | Hook string | -|-----------------|---------------|---------------------|-------------| -| 213 | `CableCleared` | `StoreCartOnCheckedOutCleared` | `greg.Store.Cart.OnCheckedOut` | -| 204 | `CableConnected` | `NetworkCableOnConnected` | `greg.Network.Cable.OnConnected` | -| 211 | `CableCreated` | `NetworkCableOnConnected` | `greg.Network.Cable.OnConnected` | -| 205 | `CableDisconnected` | `NetworkCableOnDisconnected` | `greg.Network.Cable.OnDisconnected` | -| 212 | `CableRemoved` | `NetworkCableOnDisconnected` | `greg.Network.Cable.OnDisconnected` | -| 215 | `CableSfpInserted` | `NetworkCableOnConnected` | `greg.Network.Cable.OnConnected` | -| 216 | `CableSfpRemoved` | `NetworkCableOnDisconnected` | `greg.Network.Cable.OnDisconnected` | -| 214 | `CableSpeedChanged` | `NetworkTrafficOnThresholdExceeded` | `greg.Network.Traffic.OnThresholdExceeded` | -| 1001 | `CustomEmployeeFired` | `EmployeesStaffOnTerminatedCustom` | `greg.Employees.Staff.OnTerminated` | -| 1000 | `CustomEmployeeHired` | `EmployeesStaffOnHiredCustom` | `greg.Employees.Staff.OnHired` | -| 400 | `CustomerAccepted` | `CustomerContractOnSigned` | `greg.Customer.Contract.OnSigned` | -| 401 | `CustomerSatisfied` | `CustomerSlaOnRestored` | `greg.Customer.SLA.OnRestored` | -| 402 | `CustomerUnsatisfied` | `CustomerSlaOnBreached` | `greg.Customer.SLA.OnBreached` | -| 300 | `DayEnded` | `GameTimeOnDayChanged` | `greg.Game.Time.OnDayChanged` | -| 601 | `EmployeeFired` | `EmployeesStaffOnTerminated` | `greg.Employees.Staff.OnTerminated` | -| 600 | `EmployeeHired` | `EmployeesStaffOnHired` | `greg.Employees.Staff.OnHired` | -| 702 | `GameAutoSaved` | `GameSaveOnRequested` | `greg.Game.Save.OnRequested` | -| 701 | `GameLoaded` | `GameLoadOnCompleted` | `greg.Game.Load.OnCompleted` | -| 700 | `GameSaved` | `GameSaveOnCompleted` | `greg.Game.Save.OnCompleted` | -| 1100 | `HookBridgeInstalled` | `FrameworkHooksOnBridgeInstalled` | `greg.Framework.Hooks.OnBridgeInstalled` | -| 1101 | `HookBridgeTriggered` | `FrameworkHooksOnBridgeTriggered` | `greg.Framework.Hooks.OnBridgeTriggered` | -| 100 | `MoneyChanged` | `EconomyBalanceOnChanged` | `greg.Economy.Balance.OnChanged` | -| 301 | `MonthEnded` | `GameTimeOnMonthChanged` | `greg.Game.Time.OnMonthChanged` | -| 900 | `NetWatchDispatched` | `NetworkTrafficOnThresholdExceeded` | `greg.Network.Traffic.OnThresholdExceeded` | -| 208 | `RackUnmounted` | `ObjectsRackOnRemoved` | `greg.Objects.Rack.OnRemoved` | -| 102 | `ReputationChanged` | `CustomerReputationOnChanged` | `greg.Customer.Reputation.OnChanged` | -| 207 | `ServerAppChanged` | `ObjectsServerOnClientUnassigned` | `greg.Objects.Server.OnClientUnassigned` | -| 201 | `ServerBroken` | `ObjectsDeviceOnDegraded` | `greg.Objects.Device.OnDegraded` | -| 206 | `ServerCustomerChanged` | `ObjectsServerOnClientAssigned` | `greg.Objects.Server.OnClientAssigned` | -| 203 | `ServerInstalled` | `ObjectsRackOnDevicePlaced` | `greg.Objects.Rack.OnDevicePlaced` | -| 200 | `ServerPowered` | `ObjectsDeviceOnPoweredOn` | `greg.Objects.Device.OnPoweredOn` | -| 202 | `ServerRepaired` | `ObjectsDeviceOnRepaired` | `greg.Objects.Device.OnRepaired` | -| 502 | `ShopCartCleared` | `StoreCartOnCheckedOutCleared` | `greg.Store.Cart.OnCheckedOut` | -| 500 | `ShopCheckout` | `StoreCartOnCheckedOut` | `greg.Store.Cart.OnCheckedOut` | -| 501 | `ShopItemAdded` | `StoreCartOnItemAdded` | `greg.Store.Cart.OnItemAdded` | -| 503 | `ShopItemRemoved` | `StoreCartOnItemRemoved` | `greg.Store.Cart.OnItemRemoved` | -| 209 | `SwitchBroken` | `NetworkCableOnLinkDown` | `greg.Network.Cable.OnLinkDown` | -| 210 | `SwitchRepaired` | `NetworkCableOnLinkUp` | `greg.Network.Cable.OnLinkUp` | -| 800 | `WallPurchased` | `WorldRoomOnExpanded` | `greg.World.Room.OnExpanded` | -| 101 | `XPChanged` | `GameXpOnGained` | `greg.Game.XP.OnGained` | +```powershell +./tools/Generate-GregHookCatalog.ps1 +``` -## Fallback +Aktualisiert `gregWiki/docs/reference/greg-hooks-catalog.md`. -Unknown event ids resolve to ``FFM.Framework.Unknown.OnEvent`` in `HookNames.Resolve`. +## Siehe auch -## See also - -- [FMF hook naming](./fmf-hook-naming.md) -- [EventIds source](https://github.com/mleem97/gregFramework/blob/main/gregCore/FrikaMF/EventIds.cs) -- [HookNames source](https://github.com/mleem97/gregFramework/blob/main/gregCore/FrikaMF/HookNames.cs) +- [greg hooks catalog](./greg-hooks-catalog.md) - [Greg hooks & event runtime](/wiki/framework/greg-hooks-and-events) +- [Greg hooks registry](./greg-hooks-registry.md) diff --git a/docs/reference/greg-hooks-registry.md b/docs/reference/greg-hooks-registry.md index 6ab265f..a050d8c 100644 --- a/docs/reference/greg-hooks-registry.md +++ b/docs/reference/greg-hooks-registry.md @@ -2,79 +2,67 @@ id: greg-hooks-registry title: greg.* hooks registry (IL2CPP) slug: /reference/greg-hooks-registry -description: greg_hooks.json, Harmony hook sources under gregCore, regeneration from Il2Cpp unpack, and overlap with Rust bridge patches. +description: greg_hooks.json, Harmony-Quellen unter gregCore, Regeneration, Überschneidung mit Hand-Patches. --- # greg.* hooks registry (IL2CPP) -This page documents the **canonical C# / MelonLoader hook surface** for *Data Center* IL2CPP interop: stable string ids, JSON registry, generated Harmony patches, and how they coexist with the existing Rust FFI bridge. +Diese Seite beschreibt die **kanonische MelonLoader-Hook-Oberfläche** für *Data Center* (IL2CPP): stabile String-IDs, JSON-Registry, erzeugte Harmony-Stubs und das Zusammenspiel mit **handgeschriebenen** Patches (z. B. `HarmonyPatches.cs`). -## Canonical hook ids - -Runtime identifiers follow: +## Kanonische Hook-IDs ```text greg.. ``` -- **`greg`** — fixed prefix (never `FMF`, `FFM`, or product-specific spellings in new APIs). -- **``** — uppercase segment from `GregDomain` (`PLAYER`, `EMPLOYEE`, `NETWORK`, `UI`, `SYSTEM`, …). Same logical areas as the framework domain model; see `GregHookName` in **gregFramework** sources. -- **``** — `PascalCase` verb or noun phrase (`MoneyChanged`, `Hired`, `ComponentInitialized`, …). +- **`greg`** — fester Präfix für neue APIs. +- **``** — u. a. aus **`GregDomain`** (`PLAYER`, `NETWORK`, `SYSTEM`, …). +- **``** — `PascalCase`. -Always build ids with `GregHookName.Create(GregDomain.*, "Action")` in mods — do not concatenate raw strings. +In Mods vorzugsweise **`GregHookName.Create(GregDomain.*, "Action")`** oder Konstanten aus **`GregNativeEventHooks`** verwenden. -## Registry file: `greg_hooks.json` +## Registry-Datei `greg_hooks.json` -| Location | Role | -|----------|------| -| **Repo root** `greg_hooks.json` | Source of truth checked into **gregFramework**; documents every emitted hook (`name`, `patchTarget`, `strategy`, `payloadSchema`, optional `legacy`). | -| **Next to `FrikaModdingFramework.dll`** (build output) | Copy via `FrikaMF.csproj` (`gregCore/framework/gregFramework/greg_hooks.json`) so `GregCompatBridge` can resolve legacy ids at runtime. | +| Ort | Rolle | +|-----|--------| +| **Repo-Root** `greg_hooks.json` | Eincheckter Katalog (`name`, `patchTarget`, `strategy`, `payloadSchema`, optional `legacy`). | +| **Neben `FrikaModdingFramework.dll`** | Build-Kopie für **`GregCompatBridge`**. | -The file is **generated**; edit the generator or whitelist (see below), then re-run the script — do not hand-edit hundreds of entries unless you are fixing metadata only. +## Code-Layout (gregFramework-Repo) -## Code layout (gregFramework repo) +| Pfad | Zweck | +|------|--------| +| **`gregCore/framework/src/Sdk/`** | **`gregFramework.Core`**: `GregEventDispatcher`, `GregHookName`, `GregDomain`, `GregPayload`, `GregCompatBridge`, **`GregNativeEventHooks`** | +| **`gregCore/framework/src/ModLoader/`** | `EventDispatcher`, `HarmonyPatches`, FFI, `GregHookIntegration`, Services | +| **`gregCore/framework/harmony/`** | Optional: generierte Domain-Harmony-Klassen (Skript **`Generate-GregHooksFromIl2CppDump.ps1`**) | -| Path | Purpose | -|------|---------| -| `gregCore/Core/` | `GregDomain`, `GregHookName`, `GregEventDispatcher`, `GregCompatBridge`, `GregPayload` | -| `gregCore/Hooks/` | `GregPlayerHooks`, `GregEmployeeHooks`, … — Harmony postfix patches compiled into the MelonLoader plugin | -| `gregCore/scripts/Generate-GregHooksFromIl2CppDump.ps1` | Regenerates `greg_hooks.json` and all `Greg*Hooks.cs` files | +Das Projekt **`gregCore/framework/FrikaMF.csproj`** fasst diese Quellen zusammen; Harmony erkennt alle `[HarmonyPatch]`-Typen in der Assembly. -The main plugin project (`gregCore/framework/FrikaMF.csproj`) references `..\Core\**\*.cs` and `..\Hooks\**\*.cs`. Harmony discovers any type in that assembly marked with `[HarmonyPatch]` (see `Core.ApplyHarmonyPatchesWithDiagnostics`). +## Regeneration -## Regeneration pipeline +```powershell +pwsh -NoProfile -File gregCore/scripts/Generate-GregHooksFromIl2CppDump.ps1 +``` -1. **Source of truth for patchable signatures** — Il2CppInterop C# under `gregReferences/il2cpp-unpack/Assembly-CSharp/Il2Cpp/*.cs` (stand-in when a single-file `MergedCode.md` dump is not in the repo). -2. Run from repo root (PowerShell): +Anschließend **FrikaMF** neu bauen. - ```powershell - pwsh -NoProfile -File gregCore/scripts/Generate-GregHooksFromIl2CppDump.ps1 - ``` +### Generator (Kurz) -3. Rebuild **FrikaMF** so hooks and copied JSON match. +- Emittiert Postfix-Stubs mit **`GregEventDispatcher.Emit`**, filtert häufige Unity-Loops und Lärm. +- **Harmony-Ausschluss:** Das Skript wertet **`framework/src/ModLoader/HarmonyPatches.cs`** aus, damit z. B. **`Player.UpdateCoin`** nicht doppelt generiert wird (Hand-Patch + **`InvokeCancelable`** / **`GregHookIntegration`**). -### Generator behaviour (summary) +## Mod-Autor:innen -- Emits **postfix** Harmony stubs with `GregEventDispatcher.Emit` and try/catch around each emit. -- Skips high-frequency Unity loops (`Update`, `FixedUpdate`, `LateUpdate`, `OnUpdate`), coroutine `IEnumerator` entrypoints, property accessors, and obvious IL2CPP noise (`codegen`, `MethodInternalStatic`, …). -- Skips **ECS-heavy** signatures unless Unity.Entities (and related) references are added to the project (`Entity`, `EntityCommandBuffer`, `SystemState`, `BlobArray`, …). -- Skips additional interop-only types where the project lacks references (e.g. some `Unity.InputSystem`, UI event types) — extend `Test-SkipInteropSignature` or add references when you need those patches. -- **Overload policy:** only the **first** overload per `Type|MethodName` per file is emitted (Harmony `nameof` ambiguity otherwise). -- **Whitelist (`gameHookClasses`)** — keeps the **FrikaMF** build green without pulling the entire game surface into scope; expand the list in the script when you add assembly references for more types. -- **Harmony exclusion set** — parses `gregCore/framework/FrikaMF/HarmonyPatches.cs` for `HarmonyPatch(typeof(...), nameof(...))` / string method names so **Rust bridge patches are not duplicated** by generated `Greg*Hooks` (e.g. `Player.UpdateCoin` stays owned by the hand-written patch that already forwards to `GregEventDispatcher`). +- [Greg hooks showcase](/wiki/guides/mod-developers/greg-hooks-showcase) — Beispielmod **`mods/GregShowcaseMod`** +- [FMF hook naming](/wiki/reference/fmf-hook-naming) — **`FMF.*`**-Doku-Konvention +- [greg hooks catalog](/wiki/reference/greg-hooks-catalog) — **EventId → `greg.*`** (`GregNativeEventHooks`) +- [FMF hooks catalog](/wiki/reference/fmf-hooks-catalog) — Hinweis/Redirect auf die neue Quelle -## Mod author entry points +## Legacy -- [Greg hooks showcase](/wiki/guides/mod-developers/greg-hooks-showcase) — subscribe to `greg.*`, use `GregPayload`, optional cancelable flows where the bridge exposes them. -- [FMF hook naming](/wiki/reference/fmf-hook-naming) — older **`FMF.*` / `FFM.*`** string catalog and domain policy for *documentation* constants; runtime IL2CPP Harmony surface is **`greg.*`** as above. -- [FMF hooks catalog](/wiki/reference/fmf-hooks-catalog) — generated table from legacy `HookNames` / `EventIds` sources (distinct from `greg_hooks.json`). +**`GregCompatBridge`** lädt **`legacy` → `name`** aus **`greg_hooks.json`**. Zusätzlich gibt es eingebaute Alias-Tabellen für ältere Schreibweisen — siehe Quellcode **`GregCompatBridge`**. -## Legacy hook ids - -`GregCompatBridge` loads optional `legacy` → `name` mappings from `greg_hooks.json` next to the assembly. Populate `legacy` only when you intentionally support old spellings; keep new public API strictly on **`greg.*`**. - -## See also +## Siehe auch - [FFI, hooks & Lua](/wiki/topics/ffi-and-hooks/overview) - [Framework architecture](/wiki/framework/architecture) -- [Reference & technical hub](/wiki/topics/reference/overview) diff --git a/docusaurus.config.js b/docusaurus.config.js index 79d0e2c..3115c12 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -77,8 +77,12 @@ const config = { return [`/wiki/mods/extensions/${slug}`, `/wiki/mods/mods/${slug}`]; } - if (existingPath.startsWith('/wiki/')) { - const legacyPath = existingPath.replace('/wiki', ''); + if (existingPath.startsWith('/wiki')) { + const legacyPath = existingPath.slice('/wiki'.length) || '/'; + // Never map site root (/) onto /wiki — that would override the homepage. + if (legacyPath === '/' || legacyPath === '') { + return undefined; + } // Avoid shadowing static pages and explicit redirects in `redirects` below if ( legacyPath === '/mods' ||