commit d377ff70a85c21eb7cb88ac6d8afa3c5d1f16e38 Author: Marvin <52848568+mleem97@users.noreply.github.com> Date: Wed Apr 8 00:10:25 2026 +0200 chore: initialize gregWiki standalone repository diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..346ace3 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,5 @@ +github: [mleem97] +custom: + - https://github.com/sponsors/mleem97 + - https://gregframework.eu + - https://datacentermods.com \ No newline at end of file diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 0000000..ebeeb48 --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,21 @@ +# Copilot Instructions + +## Core Runtime Guardrails +- Keep all gameplay/runtime-facing components compatible with `.NET 6.x`. +- Do not retarget runtime projects beyond `net6.0` unless explicitly requested and validated for Unity IL2CPP + MelonLoader. + +## Mandatory System Architecture Prompt +- Apply `.github/instructions/gregframework_system_architecture.instructions.md` to all implementation and design decisions. +- If constraints conflict, prioritize runtime stability, clean layered boundaries, and `.NET 6` compatibility. + +## SonarQube MCP Rules +- Apply `.github/instructions/sonarqube_mcp.instructions.md` whenever SonarQube MCP tooling is used. + +## Collaboration Defaults +- Respond in technical German unless a file or repository policy explicitly requires English-only artifacts. +- Summarize intent before code changes. +- Keep refactors minimal and architecture-safe. + +## Wiki Currency Check (Mandatory) +- At the end of every change request, verify whether relevant wiki pages are up to date. +- If updates are required, list the pages and include them in follow-up recommendations. diff --git a/.github/instructions/gregframework_system_architecture.instructions.md b/.github/instructions/gregframework_system_architecture.instructions.md new file mode 100644 index 0000000..e2af21b --- /dev/null +++ b/.github/instructions/gregframework_system_architecture.instructions.md @@ -0,0 +1,237 @@ +--- +applyTo: "**/*" +--- + +# GregFramework – Technischer Systemarchitektur-Prompt + +## Identität & Rolle + +Du bist ein hochspezialisierter technischer Architekt und Senior-Entwickler für folgendes Gesamtsystem: + +**GregFramework** – Ein modulares, user-erweiterbares All-in-One Modding-SDK für Unity/IL2CPP-Spiele, das als zentrale Bridge zwischen dem Spiel und externen Mods dient, und über eine .NET MAUI-Anwendung (ModManager) verwaltet wird. + +Du hast gleichzeitig tiefes Fachwissen in: +- Unity (IL2CPP und Mono), MelonLoader und Harmony +- .NET 6 / C# (Reflection, AppDomain, Assembly-Loading, Code-Generierung) +- .NET MAUI (Deployment, Installer, Debugging, Release-Build-Fixes) +- Model Context Protocol (MCP) für AI-Integration +- Mehrsprachige Runtime-Bridges (C#, Lua, Python, TypeScript/JS, Rust, Go, extensible) +- Modularer Plugin-Architektur (MEF, AssemblyLoadContext, Extension Points) +- Harmony/HarmonyX Patching (Prefix, Postfix, Transpiler, dynamische TargetMethod) +- IL2CPP-Metadaten-Analyse (Il2CppDumper, Il2CppInspector, Cpp2IL, Reflection zur Laufzeit) + +--- + +## Zielarchitektur (Pflicht: immer im Kopf behalten) + +Die Systemhierarchie ist unveränderlich wie folgt: + +``` +[MAUI ModManager] + │ + ▼ +[GregFramework Core SDK] + │ + ├──▶ [Plugin Layer] ← Interne Erweiterungen des Frameworks + │ │ + │ ▼ + │ [Language Bridges] ← C#, Lua, Python, TS/JS, Rust, Go, extensible + │ + ▼ +[Mod Layer] ← User-Mods (geschrieben in beliebiger Sprache) + │ + ▼ +[Unity Spiel / IL2CPP Assembly] ← via Harmony Hooks als Event-Proxy +``` + +Jede deiner Antworten muss explizit benennen, in welcher Schicht eine Komponente lebt. + +--- + +## greg.* – Das kanonische API-Schema + +**JEDE Funktion im Framework folgt diesem Namensschema – in ALLEN Sprachen identisch:** + +``` +greg.... + +Beispiele: + greg.Economy.SetMoney.plus.now + greg.Economy.SetMoney.minus.timed(30) + greg.Economy.SetMoney.plus.repeating(5) + greg.Player.SetHealth.plus.now + greg.Inventory.AddItem.byId.now + greg.World.SetTime.to.timed(10) +``` + +Aufbau: + - greg → Namespace-Root (global, unveränderlich) + - Domain → Fachbereich (Economy, Player, Inventory, World, UI, ...) + - Action → Was gemacht wird (SetMoney, AddItem, SpawnEnemy, ...) + - Variant → Wie es gemacht wird (plus, minus, to, byId, byName, ...) + - Timing → Wann es gemacht wird: now | timed(seconds) | repeating(seconds) + (Timing ist optional, Default ist "now") + +Dieses Schema ist SPRACHUNABHÄNGIG. Lua, Python, Rust, TS – alle verwenden +identische Namen. Die Sprache ist nur der Host, nicht das API. + +--- + +## Technische Kernkomponenten (Pflicht: du kennst alle Details) + +### 1. MelonLoader MCP Plugin (Assembly Scanner + MCP Server) + +**Zweck:** Läuft im Spielprozess, scannt zur Laufzeit alle geladenen Assemblies +und hostet einen MCP-kompatiblen HTTP-Server auf localhost:8081, den AI-Tools +(Claude, Cursor, GitHub Copilot) direkt abfragen können. + +**Tools die der MCP-Server exposed:** + - `list_assemblies` → Alle geladenen Assemblies mit Typenanzahl + - `search_types(query)` → Typen nach Name/Namespace suchen + - `search_methods(query)` → Methoden nach Name suchen (mit Signaturen) + - `get_type_detail(fullname)` → Alle Members eines Typs (Methoden, Fields, Props, Events) + - `suggest_greg_api(method)` → Vorschlag für greg.* Mapping einer Methode + - `export_full_scan()` → Vollständiger JSON-Export aller Assemblies + - `get_hook_candidates()` → Methoden die sinnvoll hookbar sind (heuristisch) + +**Technischer Stack:** + - MelonLoader Mod (erbt von MelonMod) + - HttpListener auf localhost:8081 (kein externen Dep nötig) + - JSON via System.Text.Json + - Reflection (BindingFlags.Public | NonPublic | Instance | Static) + - AppDomain.CurrentDomain.GetAssemblies() + - IL2CPP-kompatibel durch MelonLoader-Interop + +**Fehlerbehandlung:** Jeder Typ/Methoden-Scan in try/catch, fehlerhafte Typen +werden geloggt aber übersprungen. Server läuft in Task.Run() um Gameloop nicht +zu blockieren. + +### 2. Assembly-Analyse Pipeline (Offline AI-Workflow) + +**Zweck:** Aus dem MCP-Export einen vollständigen greg.*-API-Tree erstellen. + +**Pipeline:** +``` +MCP Export (JSON) + │ + ▼ +AI Klassifikation + → Gruppierung in Domains (Economy, Player, ...) + → Mapping: Spielmethode → greg.* Name + → Risiko-Bewertung (safe/risky/unsafe) + → Dokumentations-Generierung + │ + ▼ +greg-manifest.json ← Das kanonische API-Manifest des Frameworks + │ + ▼ +Code-Generierung + → C# Harmony-Patches (auto-generiert) + → Wiki-Seiten (Markdown) + → Language Bridge Stubs +``` + +### 3. GregFramework Core SDK + +**Zweck:** Runtime-Schicht im Spielprozess. Lädt greg-manifest.json, +initialisiert Harmony, registriert alle Hooks als Event-Proxy. + +**Namespaces:** +``` +GregFramework.Core → Bootstrap, Lifecycle, EventBus +GregFramework.Hooks → Harmony-Patches (auto-generiert oder manuell) +GregFramework.API → Öffentliches API für Mods (greg.* Aufrufe) +GregFramework.Loader → Mod-Loading, Hotload, Abhängigkeiten +GregFramework.Bridges → Language Bridge Interfaces +GregFramework.Extensions → Plugin/Extension-System +``` + +### 4. Language Bridges + +**Prinzip:** Jede Bridge implementiert `IGregLanguageBridge` und hostet eine +Runtime (Lua-VM, Python.NET, JS-Engine, Rust-FFI, etc.) die gegen +`IGregContext` arbeitet. Die Bridge ist ein Plugin im Plugin-Layer. + +**Neue Sprachen per Extension:** + - User erstellt Plugin-DLL die `IGregLanguageBridge` implementiert + - Wird automatisch im Extensions-Ordner entdeckt (MEF oder DirectoryWatcher) + - Keine Änderung am Core nötig + +### 5. MAUI ModManager + +**Zweck:** Desktop-Anwendung für Mod-Verwaltung. Kommuniziert mit +GregFramework über MCP oder Named Pipes (localhost). + +**Deployment-Anforderungen:** + - Windows Installer (MSIX oder Inno Setup) + - Kein Crash nach Installation (Release-Build stabil) + - Globaler Exception-Handler mit File-Logging für Release-Crashes + - Visual Studio Attach-to-Process Support für Release-Debugging + +--- + +## Deine Verhaltenspflichten + +### Bei Code-Anfragen: +1. Benenne immer die Schicht (MCP Plugin / Core SDK / Bridge / ModManager) +2. Kompatibilität mit IL2CPP und MelonLoader prüfen +3. Fehlerbehandlung ist nicht optional – jede kritische Stelle bekommt try/catch + Logging +4. IDisposable korrekt implementieren, Event-Handler deregistrieren +5. Async-Code: ConfigureAwait(false) wo kein UI-Thread nötig, keine Blocking-Calls in UI + +### Bei Refactoring: +1. Erst: Was soll der Code tun? (Intent-Summary) +2. Dann: Was ist falsch / fragil / riskant? +3. Dann: Konkreter Verbesserungsvorschlag mit Begründung +4. Optional: Umgeschriebener Code + +### Bei Architekturentscheidungen: +1. Immer prüfen: Welche Schicht ist zuständig? +2. Kein Direct-Access von Mods auf Unity-Typen (immer über greg.* API) +3. Language Bridges sind isoliert – ein Crash in Lua killt nicht den C#-Stack +4. Neue Features: erst Manifest anpassen, dann Hook generieren, dann Bridge updaten + +### Bei MAUI-Problemen: +1. Unterschied Debug/Release benennen (Trimming, AOT, Linking) +2. Global Exception Handler in App.xaml.cs und MauiProgram.cs +3. Logging in %AppData%\GregModManager\logs\ für Release-Diagnose +4. Installer-Probleme: Permissions, PATH, missing Runtimes prüfen + +### Bei KI/MCP-Integration: +1. MCP-Server ist im MelonLoader-Mod, nicht im Framework selbst +2. greg-manifest.json ist das einzige "Wahrheits-Dokument" des Frameworks +3. Code-Generierung aus manifest.json ist deterministisch und reproduzierbar + +--- + +## Fokus-Prioritäten (in dieser Reihenfolge) + +1. **Stabilität & Fehlertoleranz** – Ein kaputter Mod darf das System nicht killen +2. **Saubere Architektur** – Schichten respektieren, keine Querverlinkungen +3. **Developer Experience** – greg.* API muss intuitiv sein, gute Fehlermeldungen +4. **Sprachunabhängigkeit** – Naming ist in allen Bridges identisch +5. **Performance** – Kein unnötiger Overhead, Hooks gezielt und sparsam +6. **Erweiterbarkeit** – Neue Sprachen/Plugins per Drop-in, kein Core-Edit nötig + +--- + +## Kontext zur Spielumgebung + +- Spiel: Data Center (Unity, IL2CPP) +- Pfad: C:\Program Files (x86)\Steam\steamapps\common\Data Center +- MelonLoader: im MelonLoader-Ordner des Spiels +- MCP Plugin Port: localhost:8081 +- Framework Config: im Spielordner unter GregFramework\config\ +- Mod-Ordner: im Spielordner unter GregFramework\mods\ +- Extension-Ordner: im Spielordner unter GregFramework\extensions\ + +--- + +## Gesprächsregeln + +- Antworte auf Deutsch, technisch präzise +- Fass vor jedem Codevorschlag kurz zusammen, was du verstanden hast +- Wenn Kontext fehlt (Unity-Version, MelonLoader-Version, etc.), frage gezielt – aber nur eine Sache auf einmal +- Erkläre Entscheidungen kurz (warum dieser Ansatz, nicht nur was) +- Code in C# Blöcken, kompilierbar oder klar mit Platzhaltern markiert +- Verweise immer auf die relevante Schicht im Architektur-Tree diff --git a/.github/workflows/sponsor-tier-sync.yml b/.github/workflows/sponsor-tier-sync.yml new file mode 100644 index 0000000..4fb7bf8 --- /dev/null +++ b/.github/workflows/sponsor-tier-sync.yml @@ -0,0 +1,120 @@ +name: Sponsor Tier Sync + +on: + workflow_dispatch: + schedule: + - cron: "17 * * * *" + +permissions: + contents: write + +jobs: + sync: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Export sponsor tiers + uses: actions/github-script@v7 + env: + SPONSOR_OWNER: mleem97 + SPONSOR_TOKEN: ${{ secrets.SPONSORS_READ_TOKEN }} + with: + github-token: ${{ secrets.SPONSORS_READ_TOKEN != '' && secrets.SPONSORS_READ_TOKEN || github.token }} + script: | + const fs = require('fs'); + const path = require('path'); + const core = require('@actions/core'); + + const owner = process.env.SPONSOR_OWNER || context.repo.owner; + const now = new Date().toISOString(); + const outDir = path.join(process.cwd(), 'sponsors'); + const outFile = path.join(outDir, 'sponsors.json'); + + const emptyPayload = { + generatedAt: now, + owner, + totals: { activeSponsors: 0, monthlyUsd: 0 }, + tiers: {}, + sponsors: [] + }; + + fs.mkdirSync(outDir, { recursive: true }); + + const query = ` + query($login: String!) { + user(login: $login) { + sponsorshipsAsMaintainer(first: 100, activeOnly: true) { + nodes { + sponsorEntity { + __typename + ... on User { login url } + ... on Organization { login url } + } + tier { + name + monthlyPriceInDollars + isOneTime + } + privacyLevel + createdAt + } + } + } + } + `; + + try { + const result = await github.graphql(query, { login: owner }); + const nodes = result?.user?.sponsorshipsAsMaintainer?.nodes || []; + + const sponsors = nodes + .filter(n => n?.tier && !n.tier.isOneTime && n?.sponsorEntity?.login) + .map(n => ({ + login: n.sponsorEntity.login, + url: n.sponsorEntity.url, + tierName: n.tier.name, + monthlyUsd: n.tier.monthlyPriceInDollars, + privacyLevel: n.privacyLevel, + createdAt: n.createdAt + })) + .sort((a, b) => b.monthlyUsd - a.monthlyUsd || a.login.localeCompare(b.login)); + + const tiers = {}; + let monthlyUsd = 0; + for (const s of sponsors) { + monthlyUsd += s.monthlyUsd; + if (!tiers[s.monthlyUsd]) { + tiers[s.monthlyUsd] = { count: 0, sponsors: [] }; + } + tiers[s.monthlyUsd].count += 1; + tiers[s.monthlyUsd].sponsors.push({ login: s.login, url: s.url, tierName: s.tierName }); + } + + const payload = { + generatedAt: now, + owner, + totals: { activeSponsors: sponsors.length, monthlyUsd }, + tiers, + sponsors + }; + + fs.writeFileSync(outFile, JSON.stringify(payload, null, 2) + '\n', 'utf8'); + core.notice(`Exported ${sponsors.length} active sponsors for ${owner}.`); + } catch (error) { + core.warning(`Sponsor export failed: ${error.message}`); + fs.writeFileSync(outFile, JSON.stringify(emptyPayload, null, 2) + '\n', 'utf8'); + } + + - name: Commit sponsor export + run: | + if [[ -n "$(git status --porcelain sponsors/sponsors.json)" ]]; then + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add sponsors/sponsors.json + git commit -m "chore(sponsors): sync sponsor tiers" + git push + else + echo "No sponsor changes detected." + fi diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8f82a77 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +bin/ +obj/ +node_modules/ +.DS_Store diff --git a/IDEA_BACKLOG.md b/IDEA_BACKLOG.md new file mode 100644 index 0000000..f8d696e --- /dev/null +++ b/IDEA_BACKLOG.md @@ -0,0 +1,13 @@ +# Idea backlog (Discord and manual) + +Add one line per idea. Unchecked items can be turned into GitHub issues with `python tools/auto_issue_creator.py`. + +## Pending + +- [ ] (example) Add a smoke test for the FFI bridge. + +## Process + +1. Discord: `!request Your idea` (requires `DISCORD_BOT_TOKEN` and `tools/discord_bridge.py`). +2. Or edit this file manually. +3. Run `python tools/auto_issue_creator.py` to create issues from unchecked lines (requires `gh` CLI and auth). diff --git a/README (2).md b/README (2).md new file mode 100644 index 0000000..9769413 --- /dev/null +++ b/README (2).md @@ -0,0 +1,12 @@ +--- +title: Monorepo wiki (curated stubs) +sidebar_label: Monorepo wiki +description: Small curated pages for the target monorepo layout — not the GitHub Wiki import. +--- + +# Monorepo wiki (curated) + +This folder holds **short, maintained** pages that describe the **intended** repository layout (e.g. Hexmod, framework hooks). It is separate from **`docs/wiki-import/`**, which mirrors the **GitHub Wiki**. + +- Prefer **new documentation** in [`topics/`](../topics/index.md) or [`reference/`](../reference/fmf-hook-naming.md) when the content is not tied to a single mod stub. +- Optional manifest: [`mods/mod-index.json`](./mods/mod-index.json) (for future tooling; not consumed by Docusaurus automatically yet). diff --git a/README.md b/README.md new file mode 100644 index 0000000..c89e817 --- /dev/null +++ b/README.md @@ -0,0 +1,46 @@ +# Documentation layout (`docs/`) + +This folder is the **single source of truth** for the public Docusaurus site. The app lives in [`wiki/`](../wiki/); built pages are served under the **`/wiki`** base path. + +## How content is organized + +| Area | Path | Purpose | +|------|------|--------| +| **Landing** | [`intro.md`](./intro.md) | Site home (`/wiki/docs`). | +| **Curated topics** | [`topics/`](./topics/) | Hubs: **Rollen** (Spieler, Moddevs, Contributor, Sponsoren → [`audiences/overview`](./topics/audiences/overview.md)), Roadmap, Security, Wiki-Import. | +| **Mods & plugins** | [`mods/`](./mods/) | Framework, plugin wiki, mod wiki, standalone index. | +| **Releases** | [`releases/`](./releases/) | Per-artifact release notes. | +| **Reference** | [`reference/`](./reference/) | Hooks, naming, MCP, generated catalogs. | +| **Contributors** | [`contributors/`](./contributors/) | Repo layout, Docusaurus workflow, design system. | +| **Audiences** | [`audiences/`](./audiences/) | Newbies / intermediates / professionals. | +| **Roadmap** | [`roadmap/`](./roadmap/) | Planning docs. | +| **Meta** | [`meta/`](./meta/) | Workshop, devserver, backlog. | +| **Monorepo wiki stubs** | [`wiki/`](./wiki/) | Short pages tied to the target repo layout (e.g. Hexmod). **Not** the GitHub Wiki import. | +| **Legacy GitHub Wiki import** | [`wiki-import/`](./wiki-import/) | Bulk import from `.wiki/` (see below). | + +## Legacy GitHub Wiki (`docs/wiki-import/`) + +Long-form pages that originally lived in the **GitHub Wiki** are mirrored here so they are searchable and versioned with the repo. + +1. **Clone or update** the wiki working tree at the repo root as **`.wiki/`** (separate clone: `https://github.com//.wiki.git`). +2. From **`wiki/`**, refresh the mirror and split locales: + - `npm run wiki:refresh` + - Or stepwise: `npm run wiki:sync` → `npm run wiki:normalize-i18n` (optional `--dry-run` first). +3. **German** translations for paired pages live under `wiki/i18n/de/docusaurus-plugin-content-docs/current/wiki-import/` after normalization. +4. **New curated docs** should usually be added as normal Markdown under `docs/` (topics, reference, mods), not only under `wiki-import/`, so they stay easy to find. Use `wiki-import/` for bulk legacy material and incremental fixes; migrate important pages into `docs/topics/` or `docs/reference/` when you rewrite them. + +Details: [`topics/wiki-import/overview.md`](./topics/wiki-import/overview.md). + +## URLs + +- Doc id `intro` → `/wiki/docs` (see front matter). +- Most docs → `/wiki/` (e.g. `mods/framework` → `/wiki/mods/framework`). +- The monorepo stub folder uses ids like `wiki/mods/hexmod` → `/wiki/wiki/mods/hexmod` (double `wiki` in the path). Prefer linking by **doc id** or stable titles rather than hand-typing URLs. + +## Scripts (repo root / `wiki/`) + +| Script | Location | Role | +|--------|------------|------| +| Sync `.wiki` → `docs/wiki-import/` | `wiki/scripts/sync-wiki-to-docs.mjs` | Copies `*.md` from `.wiki/`. | +| Split DE/EN pairs | `wiki/scripts/normalize-wiki-import-i18n.mjs` | EN default locale, DE under `wiki/i18n/de/...`. | +| Sidebar category keys | `wiki/scripts/write-wiki-import-category-keys.mjs` | Regenerates `_category_.json` keys under Guides/Reference/Troubleshooting. | diff --git a/SPONSORS.md b/SPONSORS.md new file mode 100644 index 0000000..e9ff3a1 --- /dev/null +++ b/SPONSORS.md @@ -0,0 +1,54 @@ +# Sponsors + +Thank you for supporting the GregFramework ecosystem. + +## Top Sponsor (VIP) + +- **💎 The Ecosystem Architect ($50/month):** [@tobiasreichel](https://github.com/tobiasreichel) + +Premium benefits currently assigned: + +- Top sponsor placement on ecosystem-facing surfaces (Wiki front page + Mod Store footer) +- Private 1-on-1 Discord lounge +- Featured mod spotlight option + +## Sponsorship Tiers + +### ☕ $1 / month – The Coffee Supporter + +- GitHub sponsor badge +- Discord `Supporter` role +- Eternal gratitude + +### 🥉 $5 / month – Bronze Backer (Active Player) + +Includes all previous perks, plus: + +- Credits entry in GregTools Mod Manager (`Special Thanks / Sponsors`) +- Access to sponsor-only Discord chat for spoilers/WIP/dev updates + +### 🥈 $15 / month – Silver Tester (Early Access) + +Includes all previous perks, plus: + +- Early access to pre-release and beta builds +- Roadmap voting access for Silver+ backers + +### 🥇 $25 / month – Gold Developer (Pro Modder) + +Includes all previous perks, plus: + +- Priority handling for framework bug reports +- Official Gold sponsor mention in repository `README.md` + +### 💎 $50 / month – The Ecosystem Architect (Premium/VIP) + +Includes all previous perks, plus: + +- Top sponsor placement on Wiki front page and Mod Store footer +- Private 1-on-1 Discord lounge +- Featured mod spot on `datacentermods.com` + +## Automation + +Use a repository workflow file at `.github/workflows/sponsor-tier-sync.yml` to export current sponsor tiers and drive Discord/website sync jobs. diff --git a/architecture.md b/architecture.md new file mode 100644 index 0000000..a9be755 --- /dev/null +++ b/architecture.md @@ -0,0 +1,30 @@ +--- +title: Monorepo — Architecture +sidebar_label: Monorepo architecture +description: Core vs bindings vs mods; hook scanner; Game2Framework compatibility. +--- + +# Monorepo — Architecture + +## Layers + +| Layer | Role | +|------|------| +| **Core** | MelonLoader mod + event dispatch — today under `framework/FrikaMF/` (C#). Target layout: `FrikaModFramework/src/core/`. | +| **Bindings** | Language-specific surfaces — placeholders under `FrikaModFramework/src/bindings/`. | +| **Mods / plugins** | Shipped sources in `mods/` and `plugins/`; optional pilot tree `HexMod/` (VDF + hooks metadata). | +| **Docs** | Docusaurus consumes repo-root `docs/`; app lives in `wiki/`. | + +## Hook registry + +`FrikaModFramework/fmf_hooks.json` is the declarative **single source of truth** for documented `FMF.*` hooks. The runtime still exposes legacy `FFM.*` strings where not yet migrated. + +## Tools + +- **`tools/fmf-hook-scanner`** — emit the [FMF Hook Reference](./fmf-hooks) page from the registry. +- **`tools/game2framework-migrator`** — dry-run mapping using `tools/fmf-hook-scanner/mapping/game2framework-map.json`. +- **`mcp-server/`** — Model Context Protocol server (docs + registry) for IDEs; can run in Docker with the static wiki — see [MCP server](../../reference/mcp-server.md). + +## Steam & Workshop + +Workshop templates: `templates/workshop/`. CLI/upload scripts: `tools/steam-workshop-upload/`. Desktop uploader (Windows MAUI): `WorkshopUploader/` (see `WorkshopUploader/README.md`). diff --git a/audiences/intermediates.md b/audiences/intermediates.md new file mode 100644 index 0000000..8fa441d --- /dev/null +++ b/audiences/intermediates.md @@ -0,0 +1,30 @@ +--- +id: intermediates +title: Intermediates +slug: /audiences/intermediates +--- + +## Goal + +Build and debug your own mods with stable framework workflows. + +## Learning path + +1. Pick one track: C# or Rust. +2. Learn hooks/events flow. +3. Use verified targets from `HOOKS.md`. +4. Implement mod config and diagnostics. + +## Read next + +- `.wiki/Mod-Developer-Debug.md` +- `.wiki/Mod-Developer-Debug-en.md` +- `.wiki/Modding-Guide.md` +- `.wiki/FFI-Bridge-Reference.md` +- `.wiki/Web-UI-Bridge.md` + +## Practical checkpoints + +- Build passes in debug/release +- Hook target is verified in `HOOKS.md` +- Events are version-safe and documented diff --git a/audiences/newbies.md b/audiences/newbies.md new file mode 100644 index 0000000..089e89e --- /dev/null +++ b/audiences/newbies.md @@ -0,0 +1,29 @@ +--- +id: newbies +title: Newbies +slug: /audiences/newbies +--- + +## Goal + +Get FrikaMF running safely and understand the minimum concepts. + +## Start here + +1. Install MelonLoader and run the game once. +2. Copy `FrikaModdingFramework.dll` into `Data Center/Mods`. +3. Add the mod that depends on FrikaMF. +4. Check `MelonLoader/Latest.log`. + +## Read next + +- `.wiki/End-User-Release.md` +- `.wiki/End-User-Release-en.md` +- `.wiki/Known-Incompatibilities-en.md` +- `.wiki/Bekannte-Inkompatibilitaeten.md` + +## Common mistakes + +- Wrong folder (`Mods` vs `RustMods`) +- Missing first game start after MelonLoader install +- Mixing incompatible game/framework versions diff --git a/audiences/professionals.md b/audiences/professionals.md new file mode 100644 index 0000000..5b89af3 --- /dev/null +++ b/audiences/professionals.md @@ -0,0 +1,32 @@ +--- +id: professionals +title: Pros +slug: /audiences/professionals +--- + +## Goal + +Work on framework internals, ABI stability, CI quality, and long-term maintainability. + +## Focus areas + +- Runtime architecture and ownership boundaries +- C#↔Rust ABI evolution +- Compatibility arbitration and diagnostics +- Release assets and template integrity +- Security review pipeline for future Mod Store + +## Read next + +- `.wiki/Architecture.md` +- `.wiki/Framework-Features-Use-Cases.md` +- `.wiki/StandaloneMods.md` +- `.wiki/Repository-Status-2026-04-04.md` +- `.wiki/ROADMAP.md` +- `.wiki/TASKLIST.md` + +## Professional quality gates + +- Explicit migration notes for contracts/events +- Reproducible build and release pipelines +- Documented rollback and incompatibility strategy diff --git a/contributors/docusaurus-workflow.md b/contributors/docusaurus-workflow.md new file mode 100644 index 0000000..205b3f6 --- /dev/null +++ b/contributors/docusaurus-workflow.md @@ -0,0 +1,40 @@ +--- +id: docusaurus-workflow +title: Docusaurus Contributor Workflow +slug: /contributors/docusaurus-workflow +--- + +## Local workflow + +Markdown and MDX live in the repo-root `docs/` folder. The Docusaurus app is in `wiki/`. + +```bash +cd wiki +npm install +npm run start +``` + +## Build workflow + +```bash +cd wiki +npm run build +npm run serve +``` + +## Can we hide Docusaurus build stuff from non-contributors? + +Short answer for a **public repo**: **not fully**. + +What you can do: + +- Keep generated output (`build/`, `.docusaurus/`, `node_modules/`) out of Git using `.gitignore`. +- Put docs tooling under `wiki/` so core runtime contributors can ignore it; content stays in `docs/`. +- Use path-based CODEOWNERS to limit review noise. +- Trigger docs CI on `docs/**` and `wiki/**` changes. + +What you cannot do in a public repo: + +- Fully hide tracked source files from non-contributors. + +If you need true visibility restriction, use a private repo/submodule for docs infra. diff --git a/contributors/luminescent-design-system.md b/contributors/luminescent-design-system.md new file mode 100644 index 0000000..71afe7d --- /dev/null +++ b/contributors/luminescent-design-system.md @@ -0,0 +1,97 @@ +--- +sidebar_label: Luminescent design system +description: Visual and interaction guidelines for the docs site (Luminescent Architect). +--- + +The **Frika Mod Framework** (FMF) is the product name for all Docusaurus branding (site title, navbar, page titles). **Luminescent Architect** names this visual design system only. + +# Design System Specification: The Luminescent Architect + +## 1. Overview & Creative North Star + +**The Creative North Star: "The Luminescent Architect"** +This design system moves away from the "flat-and-boxy" utility of standard modding sites. It treats code and community interaction as an architectural feat. We achieve a high-end editorial feel through **Tonal Depth** and **Intentional Asymmetry**. Instead of rigid grids that feel like a spreadsheet, we use overlapping layers and "light-bleed" to guide the user’s eye. The goal is a digital environment that feels like a high-end laboratory: sterile, precise, yet pulsing with the energy of the teal primary accent. + +## 2. Color & Atmospheric Theory + +We do not use color simply to decorate; we use it to define space. + +### The "No-Line" Rule + +**Explicit Instruction:** Prohibit 1px solid borders for sectioning. +Boundaries are defined solely through background color shifts. For example, a `surface-container-low` section sitting on a `surface` background creates a natural edge. This "Editorial Bleed" makes the interface feel expansive and premium rather than boxed-in. + +### Surface Hierarchy & Nesting + +Treat the UI as physical layers of "Synthetic Glass." + +- **Layer 0 (Base):** `surface` (#001110) - The deep abyss. +- **Layer 1 (Sub-sections):** `surface-container-low` (#001715). +- **Layer 2 (Cards/Containers):** `surface-container` (#001E1C). +- **Layer 3 (Modals/Popovers):** `surface-container-high` (#002422). + +### The Glass & Gradient Rule + +Floating elements (Navigation, Tooltips) must use **Glassmorphism**. + +- **Formula:** `surface-container` at 80% opacity + `backdrop-filter: blur(12px)`. +- **Signature Texture:** Primary CTAs must utilize a subtle linear gradient from `primary` (#61F4D8) to `primary-container` (#08C1A6) at a 135-degree angle. This prevents "flatness" and gives the button a machined, metallic quality. + +Implementation reference: `wiki/src/css/custom.css` (`@theme` tokens, `.btn-primary`, `.glass-card`, `.navbar`). + +## 3. Typography: The Editorial Edge + +The contrast between the technical precision of **Inter** and the geometric authority of **Space Grotesk** defines the brand. + +- **Display & Headlines (Space Grotesk):** Use these for hero sections and documentation titles. High-contrast and slightly wider tracking (+2%) creates an authoritative, "tech-brochure" aesthetic. Tailwind / utility: `font-headline`. +- **Body & Labels (Inter):** Reserved for technical data and long-form wiki content. Inter’s tall x-height ensures readability against the dark `background`. Default body uses `font-sans`. +- **Code Blocks:** Must use a monospaced font (JetBrains Mono) nested in `surface-container-highest` to differentiate logic from documentation. Utility: `font-mono` / Infima monospace variables. + +## 4. Elevation & Depth + +We abandon the traditional drop-shadow. Depth is achieved via **Tonal Layering**. + +- **The Layering Principle:** To lift a card, place a `surface-container-lowest` card inside a `surface-container-low` section. The "inverse lift" creates a sophisticated, recessed look. +- **Ambient Glows:** For "floating" primary elements, use a shadow with the color `primary` at 10% opacity, a blur of `32px`, and a spread of `-4px`. This mimics the glow of a physical LED. +- **The Ghost Border Fallback:** If a border is required for accessibility, use the `outline-variant` token at **15% opacity**. This creates a "suggestion" of a line that disappears into the background. + +## 5. Component Architecture + +### Buttons: The Kinetic Core + +- **Primary:** Gradient fill (`primary` to `primary-container`), `on-primary` text. Add a 2px outer glow of `primary` on hover. +- **Secondary (Outlined):** No fill. A "Ghost Border" of `outline-variant` at 40%. On hover, the border opacity jumps to 100%. +- **Tertiary:** Pure text in `secondary`. Used for low-priority actions in the Sidebar. + +### Navigation: Structural Fixed Points + +- **Top Bar (Global):** Height: 72px. Background: `surface` (80% opacity) with `backdrop-blur`. No bottom border; use a subtle transition to `surface-container-low` for the content area. +- **Wiki Sidebar (Contextual):** Sticky position. Uses `surface-container-low`. Active links use a left-aligned 4px vertical pill in `primary` and high-contrast `on-surface` text. + +### Cards & Information Architecture + +- **Rule:** Forbid divider lines within cards. +- **Implementation:** Use 24px vertical padding (from the spacing scale) to separate the header from the body. Use `surface-variant` for metadata badges (e.g., "v1.2.0") to provide a "recessed" look. + +### Code Blocks & Documentation + +- **Container:** `surface-container-highest` with a `md` (0.75rem) corner radius. +- **Syntax Highlighting:** Use `tertiary` (#64D0FF) for functions, `secondary` (#1CEDE1) for strings, and `error_dim` (#D7383B) for keywords. + +## 6. Do’s and Don’ts + +### Do: + +- **Do** use `primary_fixed_dim` for icons to ensure they don't overpower the text. +- **Do** allow for generous "negative space." High-end editorial design requires breathing room to feel premium. +- **Do** use `surface_bright` as a very subtle "top-light" gradient on large containers to simulate overhead lighting. + +### Don’t: + +- **Don’t** use pure white (#FFFFFF) for text. Always use `on_surface` (#C0FCF6) to reduce eye strain in dark mode. +- **Don’t** use 1px solid borders to separate sidebar items; use vertical spacing or a subtle background hover state. +- **Don’t** use standard "drop shadows" (Black/Grey). Always tint your shadows with the background or accent color to maintain tonal harmony. + +## 7. Token map (implementation) + +Semantic colors are defined as Tailwind v4 `@theme` variables in `wiki/src/css/custom.css` (e.g. `--color-primary`, `--color-on-surface`, `--color-surface-container-low`). Prefer those utilities in React pages (`bg-background`, `text-on-surface`, `border-outline-variant/15`) so the site stays aligned with this spec. diff --git a/contributors/monorepo-target-layout.md b/contributors/monorepo-target-layout.md new file mode 100644 index 0000000..97218ee --- /dev/null +++ b/contributors/monorepo-target-layout.md @@ -0,0 +1,55 @@ +--- +id: monorepo-target-layout +title: Monorepo target layout and migration phases +sidebar_label: Monorepo target layout +description: Planned top-level structure and phased migration without a single big-bang refactor. +--- + +# Monorepo target layout and migration phases + +The repository **stays one Git repo**. The goal is **clear boundaries** between framework, mods, plugins, templates, docs, and tooling so users, modders, and contributors can navigate predictably. + +## Target topology (directional) + +| Top-level | Purpose | +|-----------|---------| +| `framework/` | Core MelonLoader framework (`framework/FrikaMF.csproj`, `framework/FrikaMF/`, entry `Main.cs`) | +| `mods/` | Gameplay mods (`FMF.Mod.*`, `FMF.*.dll` style) | +| `plugins/` | FFM plugins (`FFM.Plugin.*`) | +| `Templates/` | Scaffolds for new mods/plugins | +| `wiki/` | Docusaurus site (product docs; route base `/wiki`) | +| `tools/` | Repo maintenance: hook catalog generator, codegen stubs | +| `scripts/` | Release automation (existing) | + +**Binaries**: prefer **GitHub Releases** (and pre-releases for beta) over committing DLLs. See [Release channels](../reference/release-channels.md). + +## Phased migration (no big-bang) + +```mermaid +flowchart LR + p1[Phase1_DocsAndTools] + p2[Phase2_MoveModsPlugins] + p3[Phase3_FrameworkExtract] + p4[Phase4_CIRedirects] + p1 --> p2 --> p3 --> p4 +``` + +| Phase | Scope | Exit criteria | +|-------|--------|---------------| +| **1** | Docs, `tools/`, naming wiki, hook catalog script | Docusaurus build green; script generates catalog | +| **2** | `git mv` former `ModsAndPlugins/` → `mods/` / `plugins/` | Done — `.csproj` relative paths unchanged (depth preserved); CI/docs updated | +| **3** | Framework sources under `framework/` | Done — `FrikaMF.sln` points at `framework\framework/FrikaMF.csproj`; plugins reference `..\..\framework\framework/FrikaMF.csproj` | +| **4** | CI matrix: docs + dotnet; `plugin-client-redirects` for old URLs | PR checks match local workflow | + +## Path updates checklist (Phase 2 applied) + +- [x] `FrikaMF.sln` project paths (`plugins\FFM.Plugin.*`) +- [x] `.github/workflows` (CodeQL, release assets, Discord feed) +- [x] Contributor docs and mod/plugin wiki pages (`Project Path` lines) +- [ ] [`wiki/docusaurus.config.js`](https://github.com/mleem97/gregFramework/blob/master/wiki/docusaurus.config.js) redirects (only if public URLs must map old paths) +- [ ] Historical wiki-import pages may still mention `StandaloneMods/` — update when editing those files + +## Related + +- [Repo inventory](./repo-inventory.md) +- [FMF hook naming](../reference/fmf-hook-naming.md) diff --git a/contributors/plugin-submission-audit.md b/contributors/plugin-submission-audit.md new file mode 100644 index 0000000..dee1969 --- /dev/null +++ b/contributors/plugin-submission-audit.md @@ -0,0 +1,31 @@ +--- +id: plugin-submission-audit +title: Plugin Submission & Security Audit Workflow +slug: /contributors/plugin-submission-audit +--- + +## Goal + +Provide a repeatable workflow where community authors submit plugins through a Git repository URL, then pass an automated security/quality audit before publication in the wiki and release channels. + +## Submission Model + +1. Author opens a **Plugin Submission** issue. +2. Author provides a public Git repository URL (`https://...git`). +3. Maintainer triggers the security-audit workflow. + +## Automated Audit Steps + +- Clone submitted repository in CI. +- Run static scan for suspicious calls and execution vectors. +- Run secret and credential pattern checks. +- Produce an auditable report artifact. + +## Release Gate Policy + +- If audit result is **fail**, publication is blocked. +- If audit result is **pass**, maintainers can mark module as `releaseReady` and publish wiki/release visibility. + +## Multiplayer Clarification + +Steamworks multiplayer remains a planned direction but is currently blocked by missing Steamworks implementation on the game developer side. diff --git a/contributors/repo-inventory.md b/contributors/repo-inventory.md new file mode 100644 index 0000000..dbbf612 --- /dev/null +++ b/contributors/repo-inventory.md @@ -0,0 +1,76 @@ +--- +id: repo-inventory +title: Repository inventory +sidebar_label: Repo inventory +description: Current monorepo layout, projects, and known solution drift (contributors). +--- + +# Repository inventory + +This page is the **source of truth snapshot** for how the DataCenterExporter / gregFramework monorepo is organized today. Use it before large refactors or when onboarding. + +## Top-level areas + +| Area | Path | Role | +|------|------|------| +| Framework core | [`framework/FrikaMF.csproj`](https://github.com/mleem97/gregFramework/blob/master/framework/FrikaMF.csproj) | MelonLoader mod hosting runtime hooks, Harmony, bridge, events | +| Target layout / registry | [`FrikaModFramework/`](https://github.com/mleem97/gregFramework/tree/master/FrikaModFramework) | `fmf_hooks.json`, bindings stubs, migration docs | +| Workshop tooling | [`workshopuploader/`](https://github.com/mleem97/gregFramework/tree/master/workshopuploader) (rename from `WorkshopUploader/`; see `WorkshopUploader/MIGRATION_PUBLIC_REPO.md`) | Steam Workshop / workspace uploader — **.NET MAUI** (Windows) | +| MCP (LLM / IDE) | [`mcp-server/`](https://github.com/mleem97/gregFramework/tree/master/mcp-server) | Model Context Protocol over docs + `fmf_hooks.json`; Docker: `docker compose up docs-mcp` | +| Mods (sources) | [`mods/`](https://github.com/mleem97/gregFramework/tree/master/mods) | Gameplay mods (`FMF.*`, `FMF.Mod.*` folders) | +| Plugins (sources) | [`plugins/`](https://github.com/mleem97/gregFramework/tree/master/plugins) | Framework plugins (`FFM.Plugin.*`) | +| Templates | [`Templates/`](https://github.com/mleem97/gregFramework/tree/master/Templates) | Scaffolds for new mods/plugins | +| Documentation content | [`docs/`](https://github.com/mleem97/gregFramework/tree/master/docs) | Markdown/MDX sources for the wiki | +| Documentation site (Docusaurus) | [`wiki/`](https://github.com/mleem97/gregFramework/tree/master/wiki) | App shell, theme, `npm run build` | +| Scripts | [`scripts/`](https://github.com/mleem97/gregFramework/tree/master/scripts) | Release metadata, changelog (e.g. `Update-ReleaseMetadata.ps1`) | +| Wiki import (legacy) | [`docs/wiki-import/`](./../wiki-import/Home.md) | Imported `.wiki` content; still linked from many pages | + +## .NET projects on disk (`*.csproj`) + +| Project | Location | In `FrikaMF.sln`? | +|---------|----------|-------------------| +| FrikaMF | `framework/FrikaMF.csproj` | Yes | +| WorkshopUploader | `workshopuploader/WorkshopUploader.csproj` (after folder rename) | No — use `WorkshopUploader.sln` in that folder | +| FFM.Plugin.* (x5) | `plugins/FFM.Plugin.*/` | Yes — paths in [`FrikaMF.sln`](https://github.com/mleem97/gregFramework/blob/master/FrikaMF.sln) use `plugins\...` | +| FMF.HexLabelMod | `mods/FMF.Mod.HexLabelMod/` | No (build standalone or add to solution) | +| FMF.ConsoleInputGuard | `mods/FMF.ConsoleInputGuard/` | No | +| FMF.GregifyEmployees | `mods/FMF.Mod.GregifyEmployees/` | No | +| FMF.JoniMLCompatMod | `mods/FMF.Plugin.LangCompatBridge/` | No | +| Templates | `Templates/FMF.*`, `Templates/StandaloneModTemplate/` | No | + +## Build status (framework project) + +- `framework/FrikaMF.csproj` explicitly **excludes** `workshopuploader/**` from compile (that app builds only via `workshopuploader/WorkshopUploader.csproj` / `WorkshopUploader.sln` in that folder). +- `dotnet build FrikaMF.sln` builds framework and plugin projects under `plugins\` — **not** the MAUI Workshop app (MelonLoader/game refs still required locally unless `CI=true`). + +## `FrikaMF.sln` drift (action items) + +1. **Mods not in solution**: Standalone mod projects under `mods/` are intentionally omitted from the solution to keep the graph small; add them if you want `dotnet build` for every module in one shot. + +2. **Templates in `framework/FrikaMF.csproj`**: Template sources under `Templates/` may fail `dotnet build framework/FrikaMF.csproj` with `CS0122` if `Core` visibility does not match template expectations — treat templates as **samples** until the project graph is cleaned up. + +## Documentation (Docusaurus) + +- **Entry**: `/wiki` → [`intro`](../intro.md) +- **Sidebar**: [`sidebars.js`](https://github.com/mleem97/gregFramework/blob/master/wiki/sidebars.js) +- **Module catalog** (downloads table): [`wiki/src/data/moduleCatalog.ts`](https://github.com/mleem97/gregFramework/blob/master/wiki/src/data/moduleCatalog.ts) +- **Landing**: `/` → [`src/pages/index.tsx`](https://github.com/mleem97/gregFramework/blob/master/wiki/src/pages/index.tsx) +- **Static catalog page**: `/mods` + +## Hook / event sources of truth (code) + +- String constants: [`framework/FrikaMF/HookNames.cs`](https://github.com/mleem97/gregFramework/blob/master/framework/FrikaMF/HookNames.cs) (`FFM.*` hook IDs today). +- Numeric IDs: [`framework/FrikaMF/EventIds.cs`](https://github.com/mleem97/gregFramework/blob/master/framework/FrikaMF/EventIds.cs). +- Generated wiki mirror: run [`tools/Generate-FmfHookCatalog.ps1`](https://github.com/mleem97/gregFramework/blob/master/tools/Generate-FmfHookCatalog.ps1) → [`fmf-hooks-catalog`](../reference/fmf-hooks-catalog.md). + +## Debugging (MelonLoader, IL2CPP, Unity) + +- **Build first:** `dotnet build FrikaMF.sln -c Debug` (requires MelonLoader + IL2CPP interop under `MelonLoader/` for your game install, or `lib/references/MelonLoader` — see `tools/refresh_refs.py`). +- **Attach:** Run **Data Center** with MelonLoader, then attach your IDE’s **.NET / CoreCLR** debugger to the game process (process name usually matches the game executable). Breakpoints hit in **Debug** builds of mods/plugins copied into `Mods/`. +- **`FFM.Plugin.AssetExporter`:** The project links `framework/Main.cs` (and related files) **and** references `FrikaMF.csproj`, which would normally produce **CS0436** duplicate-type warnings. Those are **suppressed** in the plugin `.csproj` (`NoWarn`); do not remove the project reference without linking the rest of the `FrikaMF` sources. + +## Related + +- [Monorepo target layout](./monorepo-target-layout.md) — phased folder goals +- [FMF hook naming](../reference/fmf-hook-naming.md) — naming convention +- [Release channels](../reference/release-channels.md) — Steam vs GitHub beta diff --git a/contributors/sponsorship-automation.md b/contributors/sponsorship-automation.md new file mode 100644 index 0000000..17f0c71 --- /dev/null +++ b/contributors/sponsorship-automation.md @@ -0,0 +1,65 @@ +# Sponsorship Automation + +This document describes the standard automation flow for GregFramework sponsorship tiers. + +## Goal + +Keep sponsor tier data synchronized and use it as a source of truth for: + +- Discord role sync +- private/VIP channel access +- website and wiki placements +- Mod Store footer sponsor block +- in-repo sponsor pages and credits + +## Repository Workflow + +Each repository contains `.github/workflows/sponsor-tier-sync.yml`. + +The workflow: + +1. runs hourly (and on manual trigger), +2. queries active GitHub Sponsors, +3. exports normalized data to `sponsors/sponsors.json`, +4. commits changes automatically when sponsor data changes. + +## Required Secret + +Add this repository secret: + +- `SPONSORS_READ_TOKEN`: GitHub PAT with access to read sponsor relationships. + +Without this secret, the workflow still completes but exports an empty snapshot. + +## Tier Mapping + +Use this mapping in downstream systems: + +- `$1` -> `coffee_supporter` +- `$5` -> `bronze_backer` +- `$15` -> `silver_tester` +- `$25` -> `gold_developer` +- `$50+` -> `ecosystem_architect` + +## VIP Operational Rules + +For `$50+` sponsors: + +- assign top sponsor placement (Wiki front page + Mod Store footer) +- create/maintain private 1-on-1 Discord lounge +- offer featured mod spotlight + +## Example Consumer Script (Discord/Wiki Sync) + +Use `sponsors/sponsors.json` as input and run a separate scheduled job (bot or CI worker) that: + +1. maps each sponsor to a tier role, +2. grants/revokes Discord roles, +3. maintains VIP private channels, +4. updates website/wiki data endpoints. + +## First Verified VIP + +Current VIP sponsor: + +- [@tobiasreichel](https://github.com/tobiasreichel) – `ecosystem_architect` (`$50/month`) diff --git a/devserver-betas.md b/devserver-betas.md new file mode 100644 index 0000000..c8aa371 --- /dev/null +++ b/devserver-betas.md @@ -0,0 +1,25 @@ +# DevServer API — beta channels (`gregframework.eu`) + +This document defines the **intended** client contract for the FrikaMF **WorkshopUploader** “Betas” panel. The server may be implemented separately; keep URLs and tokens configurable. + +## Base URL + +- Default: `https://gregframework.eu` +- Override: user settings file next to the app (not committed to git). + +## Endpoints (proposed) + +| Method | Path | Purpose | +|--------|------|---------| +| `GET` | `/api/v1/betas` | List available beta channels (id, name, description). | +| `POST` | `/api/v1/betas/{id}/subscribe` | Enroll the current user (body: Steam ID or bearer token from OAuth). | +| `POST` | `/api/v1/betas/{id}/unsubscribe` | Leave a channel. | + +## Authentication + +- **Preferred:** Short-lived JWT after browser OAuth to `gregframework.eu`, stored in user settings. +- **Alternative:** Steam ID from Steamworks session in the WorkshopUploader process, plus server-side verification. + +## Rate limiting and errors + +Clients should show HTTP status and response body on failure; retry with backoff. diff --git a/fmf-hooks.mdx b/fmf-hooks.mdx new file mode 100644 index 0000000..93d95c1 --- /dev/null +++ b/fmf-hooks.mdx @@ -0,0 +1,98 @@ +--- +id: fmf-hooks +title: FMF Hook Reference +sidebar_label: FMF Hook Reference +description: Auto-generated from FrikaModFramework/fmf_hooks.json — run tools/fmf-hook-scanner. +--- + +:::info +This page is generated by `tools/fmf-hook-scanner`. Do not edit by hand. +::: + +# FMF Hook Reference + +## EMPLOYEE + +### FMF.EMPLOYEE.Hired + +**Description:** An employee was hired into the roster. + +**Payload:** + +- `employeeId` (string) +- `role` (string) + +**Example (C#)** + +```csharp +FmfApi.On("FMF.EMPLOYEE.Hired", payload => { }); +``` + +## GAMEPLAY + +### FMF.GAMEPLAY.JobCompleted + +**Description:** Emitted when a job has been fully processed. + +**Payload:** + +- `jobId` (string) +- `durationSeconds` (number) +- `revenue` (number) + +**Example (C#)** + +```csharp +FmfApi.On("FMF.GAMEPLAY.JobCompleted", payload => { }); +``` + +## PLAYER + +### FMF.PLAYER.LevelUp + +**Description:** Player progression level increased. + +**Payload:** + +- `newLevel` (number) +- `previousLevel` (number) + +**Example (C#)** + +```csharp +FmfApi.On("FMF.PLAYER.LevelUp", payload => { }); +``` + +## RACK + +### FMF.RACK.PowerLimitExceeded + +**Description:** Power draw or allocation for a rack exceeded configured limits. + +**Payload:** + +- `rackId` (string) +- `watts` (number) + +**Example (C#)** + +```csharp +FmfApi.On("FMF.RACK.PowerLimitExceeded", payload => { }); +``` + +## SERVER + +### FMF.SERVER.RackOverheated + +**Description:** Server rack exceeded a critical temperature threshold. + +**Payload:** + +- `rackId` (string) +- `temperature` (number) + +**Example (C#)** + +```csharp +FmfApi.On("FMF.SERVER.RackOverheated", payload => { }); +``` diff --git a/getting-started.md b/getting-started.md new file mode 100644 index 0000000..a05c13b --- /dev/null +++ b/getting-started.md @@ -0,0 +1,43 @@ +--- +title: Monorepo — Getting started +sidebar_label: Monorepo getting started +description: Target layout (FrikaModFramework, templates, tools) and how it maps to this repo today. +--- + +# Monorepo — Getting started + +The **goal** is a clear split between the framework (`FrikaModFramework/` registry + planned bindings), the **live** MelonLoader code (`framework/`), gameplay mods (`mods/`), FFM plugins (`plugins/`), templates (`templates/` / `Templates/`), and tooling (`tools/`). Migration is incremental: production C# still lives under [`framework/`](https://github.com/mleem97/gregFramework/tree/master/framework). + +## Clone and build the framework + +```text +dotnet build framework/FrikaMF.csproj +``` + +Or open [`FrikaMF.sln`](https://github.com/mleem97/gregFramework/blob/master/FrikaMF.sln) in Visual Studio / Rider. + +## Hook naming + +- **Target convention:** `FMF..` (see [`CONTRIBUTING.md`](https://github.com/mleem97/gregFramework/blob/master/CONTRIBUTING.md)). +- **Registry:** [`FrikaModFramework/fmf_hooks.json`](https://github.com/mleem97/gregFramework/blob/master/FrikaModFramework/fmf_hooks.json). +- **Legacy runtime strings** may still use `FFM.*` in [`HookNames`](https://github.com/mleem97/gregFramework/blob/master/framework/FrikaMF/HookNames.cs) until migrated. + +## Create a mod from the template + +1. Copy [`templates/mod/`](https://github.com/mleem97/gregFramework/tree/master/templates/mod) to a new folder (or start from [`Templates/`](https://github.com/mleem97/gregFramework/tree/master/Templates) scaffolds). +2. Edit `fmf/hooks.json` and add sources under `src/`. +3. For a **pilot** layout (Workshop VDF + hooks metadata), see [`HexMod/`](https://github.com/mleem97/gregFramework/tree/master/HexMod); shipped mod examples live under [`mods/`](https://github.com/mleem97/gregFramework/tree/master/mods) (e.g. `mods/FMF.Mod.HexLabelMod/`). + +## Documentation site + +- **Content:** [`docs/`](https://github.com/mleem97/gregFramework/tree/master/docs) +- **Docusaurus app:** [`wiki/`](https://github.com/mleem97/gregFramework/tree/master/wiki) — `npm install` and `npm run start` (dev) or `npm run build` (static output). + +### Docker + +- **Dev server with hot reload:** `docker compose up docs` (port **3000**, mounts `./wiki` and `./docs`). +- **Static wiki + MCP in one container:** `docker compose up docs-mcp` — see [`reference/mcp-server`](../../reference/mcp-server.md). + +## Assistants / MCP + +The repo includes [`mcp-server/`](https://github.com/mleem97/gregFramework/tree/master/mcp-server) for Model Context Protocol (search docs, read `fmf_hooks.json`, CONTRIBUTING). Use **stdio** locally or the **HTTP** endpoint bundled with the `docs-mcp` Docker image — details in [`docs/reference/mcp-server.md`](https://github.com/mleem97/gregFramework/blob/master/docs/reference/mcp-server.md). diff --git a/guides/contributor-workshop.md b/guides/contributor-workshop.md new file mode 100644 index 0000000..5219739 --- /dev/null +++ b/guides/contributor-workshop.md @@ -0,0 +1,136 @@ +--- +id: contributor-workshop +title: Contributor Guide — WorkshopManager +sidebar_label: Contributor Guide +description: Development setup, building, publishing workflow, and release process for the WorkshopManager. +sidebar_position: 20 +tags: + - audience:contributor + - workshop +--- + +# Contributor Guide — WorkshopManager + +This guide covers the development workflow for the WorkshopManager and how to publish mods to the Steam Workshop. + +## Prerequisites + +- **Visual Studio 2022** with **.NET Multi-platform App UI** and **Windows App SDK** workloads. +- **.NET 9 SDK** (for the WorkshopManager MAUI app). +- **.NET 6 SDK** (for framework, plugins, and mods targeting MelonLoader). +- **Steam** with Data Center installed (App ID 4170200). + +## Repository structure + +| Path | Purpose | +|------|---------| +| `framework/FrikaMF.csproj` | Core MelonLoader framework DLL | +| `plugins/FFM.Plugin.*/` | FMF extension plugins (5 projects) | +| `mods/FMF.*/` | Standalone mods (4 projects) | +| `WorkshopUploader/` | WorkshopManager MAUI app | +| `scripts/Deploy-Release-ToWorkshop.ps1` | Package all builds into Workshop folders | +| `scripts/Deploy-Release-ToDataCenter.ps1` | Deploy to game for local testing | + +## Building + +### Build everything (solution) + +```bash +dotnet build FrikaMF.sln -c Release +``` + +### Build standalone mods (not in solution) + +```bash +dotnet build mods/FMF.ConsoleInputGuard/FMF.ConsoleInputGuard.csproj -c Release +dotnet build mods/FMF.Mod.GregifyEmployees/FMF.GregifyEmployees.csproj -c Release +dotnet build mods/FMF.Mod.HexLabelMod/FMF.HexLabelMod.csproj -c Release +dotnet build mods/FMF.Plugin.LangCompatBridge/FMF.JoniMLCompatMod.csproj -c Release +``` + +### Build WorkshopManager only + +```bash +dotnet build WorkshopUploader/WorkshopUploader.csproj -c Release +``` + +## Workshop project structure + +Each mod/plugin gets its own folder under `/workshop/`: + +```text +/workshop/ +├── FrikaModFramework/ +│ ├── content/ +│ │ └── Mods/ +│ │ └── FrikaModdingFramework.dll +│ ├── metadata.json +│ └── preview.png +├── FFM.Plugin.Multiplayer/ +│ ├── content/ +│ │ └── FMF/ +│ │ └── Plugins/ +│ │ └── FFM.Plugin.Multiplayer.dll +│ ├── metadata.json +│ └── preview.png +└── ... +``` + +The `content/` folder mirrors the game directory structure and is what Steam uploads. + +## Deploy to Workshop folders + +```bash +pwsh -File scripts/Deploy-Release-ToWorkshop.ps1 +``` + +This script: +1. Builds all framework, plugin, and mod projects. +2. Creates a Workshop project folder for each under `/workshop/`. +3. Copies the built DLL into `content//`. +4. Creates `metadata.json` with title, description, tags, and visibility. + +## Publishing workflow + +### GUI (recommended) + +1. Run the WorkshopManager app. +2. Open a project from the **Projects** tab. +3. Edit title, description, tags, visibility, and preview image. +4. Write **change notes** describing what changed. +5. Click **Save and upload to Steam**. +6. After upload, the app **syncs** your local `content/` with Steam's version. + +### CLI (headless) + +```bash +WorkshopUploader.exe --mode publish --path +``` + +### Post-upload sync + +After publishing, the app re-downloads the item from Steam and replaces your local `content/` folder. This ensures your working copy matches exactly what Steam has — similar to `git pull` after `git push`. + +## Extending the service layer + +The `SteamWorkshopService` in `WorkshopUploader/Services/SteamWorkshopService.cs` wraps the Facepunch.Steamworks 2.3.3 API. Key methods: + +| Method | Purpose | +|--------|---------| +| `PublishAsync` | Create or update a Workshop item with change notes | +| `SyncAfterPublishAsync` | Re-download from Steam to sync local content | +| `BrowseAsync` | Browse all Workshop items with sort/tag filters | +| `SearchAsync` | Text search across Workshop items | +| `ListSubscribedAsync` | List user's subscribed items | +| `ListFavoritedAsync` | List user's favorited items | +| `SubscribeAsync` / `UnsubscribeAsync` | Toggle subscription | +| `AddFavoriteAsync` / `RemoveFavoriteAsync` | Toggle favorite | +| `VoteAsync` | Vote up or down | +| `GetItemDetailsAsync` | Full item details with stats | + +## Adding a new mod to the release + +1. Create the mod project under `mods/`. +2. Add it to the `$mods` array in `Deploy-Release-ToWorkshop.ps1`. +3. Run the deploy script. +4. Open the new workshop project in the WorkshopManager and publish. diff --git a/guides/enduser-workshop.md b/guides/enduser-workshop.md new file mode 100644 index 0000000..e2007c2 --- /dev/null +++ b/guides/enduser-workshop.md @@ -0,0 +1,134 @@ +--- +id: enduser-workshop +title: End-User Guide — WorkshopManager +sidebar_label: End-User Guide +description: How to browse, install, and manage Data Center mods using the WorkshopManager. +sidebar_position: 10 +tags: + - audience:enduser + - workshop +--- + +# End-User Guide — WorkshopManager + +This guide is for players who want to **install and manage mods** for Data Center using the WorkshopManager desktop app. + +## What you need + +- **Data Center** installed via Steam. +- **Steam** running and logged in. +- **WorkshopManager** (`WorkshopUploader.exe`) — either built from source or provided as a release. + +## Installation + +You can run WorkshopManager from **any folder you prefer** (for example `Program Files`, Desktop, Downloads, or `/WorkshopUploader/`). + +### Option A — Installer setup (recommended) + +1. Run the latest `GregToolsModmanager--Setup.exe`. +2. Complete the installer wizard (default path is under `Program Files`). +3. Start the app from the Start Menu or desktop shortcut. + +### Option B — Portable / ZIP build + +1. Download or build the WorkshopManager files. +2. Extract/copy the folder to any location you want. +3. Launch `WorkshopUploader.exe` directly from that folder. + +After startup, the Steam status indicator in the top-right should turn green. + +## Browsing mods (Mod Store) + +1. Open the **Mod Store** tab. +2. Use the **Store** sub-tab to browse all available mods. +3. Filter by tag (vanilla, modded, melonloader, fmf, framework) or sort by popularity, date, score, etc. +4. Use the **Search** bar to find specific mods by name. +5. Click on any mod to see its **detail page** with full stats, description, and action buttons. + +## Installing mods (Subscribe) + +1. In the Store or on an item's detail page, click **Subscribe**. +2. Steam downloads the mod automatically. +3. Check the **Installed** sub-tab to see all your subscribed mods. + +Subscribed mods are managed by Steam — they update automatically when the author publishes changes. + +## Favorites + +1. On an item's detail page, click **Favorite** to bookmark it. +2. View all your favorites in the **Favorites** sub-tab. +3. Click **Unfavorite** to remove. + +## Voting + +On an item's detail page: + +- Click **Vote Up** to recommend the mod. +- Click **Vote Down** if there's a quality issue. + +Your votes help the community find the best mods. + +## Dependency Health (Health tab) + +The **Health** sub-tab checks whether your game has: + +- MelonLoader installed +- Il2Cpp interop assemblies generated +- FrikaModFramework core DLL +- FMF plugins directory +- Mod config directory + +If anything is missing, follow the instructions shown. + +### Installing MelonLoader + +1. Go to the Health tab and click **Download page**. +2. Download the latest **MelonLoader Installer** from GitHub. +3. Run the installer, select **Data Center** as the game, choose **IL2CPP**. +4. Start the game once and close it (this generates required assemblies). + +## Troubleshooting + +### "Steam - offline" in the title bar + +- Make sure Steam is running and you are logged in. +- Ensure `steam_appid.txt` (containing `4170200`) exists next to `WorkshopUploader.exe`. +- If you use the portable/ZIP variant, make sure you copied the full app folder (not just the `.exe`). + +### Mod does not load in-game + +- Check `MelonLoader/Latest.log` in the game directory. +- Ensure `FrikaModdingFramework.dll` is in `/Mods/`. +- Verify the mod DLL is also in `/Mods/` or `/FMF/Plugins/`. + +### Subscription does not appear + +- Wait a few seconds and refresh the Installed list. +- Steam may need a moment to process the subscription. + +### App crashes only after installer install + +- Reinstall using the latest setup build. +- Open **Settings -> Logs** and include the newest log lines when reporting the issue. +- If available, report crash details via GitHub Issues. + +## Reporting bugs and issues + +If you find a bug, crash, or unexpected behavior, please open an issue on GitHub: + +- [Report an issue](https://github.com/mleem97/GregToolsModmanager/issues) + +To help us fix issues faster, include: + +- What you were doing when the problem happened +- Clear steps to reproduce +- Your app version and Windows version +- Error message or screenshot (if any) +- Relevant logs from **Settings -> Logs** +- A repro ZIP from **Settings -> Create repro bundle** + +## Uninstalling mods + +1. Go to the **Installed** sub-tab. +2. Click **Unsubscribe** on the mod you want to remove. +3. Steam removes the mod files automatically. diff --git a/guides/release.md b/guides/release.md new file mode 100644 index 0000000..7635204 --- /dev/null +++ b/guides/release.md @@ -0,0 +1,118 @@ +--- +id: release +title: Release +sidebar_label: Release +description: Current release artifacts, version matrix, and download instructions for FrikaModFramework. +sidebar_position: 30 +tags: + - release +--- + +# Release + +## Release artifacts + +The following components are built and packaged for Steam Workshop distribution: + +### Core Framework + +| Component | Assembly | Workshop content path | Tags | +|-----------|----------|----------------------|------| +| FrikaModFramework | `FrikaModdingFramework.dll` | `content/Mods/` | modded, melonloader, framework, fmf | + +### FMF Plugins + +| Plugin | Assembly | Workshop content path | Tags | +|--------|----------|----------------------|------| +| FFM.Plugin.Multiplayer | `FFM.Plugin.Multiplayer.dll` | `content/FMF/Plugins/` | modded, fmf, plugin | +| FFM.Plugin.Sysadmin | `FFM.Plugin.Sysadmin.dll` | `content/FMF/Plugins/` | modded, fmf, plugin | +| FFM.Plugin.AssetExporter | `FFM.Plugin.AssetExporter.dll` | `content/FMF/Plugins/` | modded, fmf, plugin | +| FFM.Plugin.WebUIBridge | `FFM.Plugin.WebUIBridge.dll` | `content/FMF/Plugins/` | modded, fmf, plugin | +| FFM.Plugin.PlayerModels | `FFM.Plugin.PlayerModels.dll` | `content/FMF/Plugins/` | modded, fmf, plugin | + +### Gameplay Mods + +| Mod | Assembly | Workshop content path | Tags | +|-----|----------|----------------------|------| +| FMF.ConsoleInputGuard | `FMF.ConsoleInputGuard.dll` | `content/Mods/` | modded, melonloader, mod | +| FMF.GregifyEmployees | `FMF.GregifyEmployees.dll` | `content/Mods/` | modded, melonloader, mod | +| FMF.HexLabelMod | `FMF.HexLabelMod.dll` | `content/Mods/` | modded, melonloader, mod | +| FMF.JoniMLCompatMod | `FMF.JoniMLCompatMod.dll` | `content/Mods/` | modded, melonloader, mod | + +### Gregtools Modmanager (WorkshopManager) + +| Version | Component | Target | Description | +|---------|-----------|--------|-------------| +| **1.0** | Gregtools Modmanager | `net9.0-windows` (win10-x64), self-contained | Steam Workshop client + Mod Store + Mod Manager. No .NET runtime required. See [GregTools 1.0 Modmanager release](/wiki/releases/tools/gregtools-modmanager-1.0-release). | + +## Installation for end users + +### Quick start + +1. Install **MelonLoader** (IL2CPP) for Data Center. +2. Start the game once, then close it. +3. Subscribe to mods via the **WorkshopManager** Mod Store or the [Steam Workshop](https://steamcommunity.com/app/4170200/workshop/). +4. Start the game. + +### Manual installation + +1. Download the DLL from the Workshop or a release. +2. Framework: place `FrikaModdingFramework.dll` in `/Mods/`. +3. Plugins: place `FFM.Plugin.*.dll` in `/FMF/Plugins/`. +4. Mods: place `FMF.*.dll` in `/Mods/`. +5. Start the game and check `MelonLoader/Latest.log`. + +## Game directory structure + +```text +Data Center/ +├── Mods/ +│ ├── FrikaModdingFramework.dll +│ ├── FMF.ConsoleInputGuard.dll +│ ├── FMF.GregifyEmployees.dll +│ ├── FMF.HexLabelMod.dll +│ └── FMF.JoniMLCompatMod.dll +├── FMF/ +│ └── Plugins/ +│ ├── FFM.Plugin.Multiplayer.dll +│ ├── FFM.Plugin.Sysadmin.dll +│ ├── FFM.Plugin.AssetExporter.dll +│ ├── FFM.Plugin.WebUIBridge.dll +│ └── FFM.Plugin.PlayerModels.dll +├── MelonLoader/ +│ └── Latest.log +├── UserData/ +│ └── ModCfg/ +└── workshop/ + ├── FrikaModFramework/ + │ ├── content/Mods/FrikaModdingFramework.dll + │ └── metadata.json + ├── FFM.Plugin.Multiplayer/ + │ ├── content/FMF/Plugins/FFM.Plugin.Multiplayer.dll + │ └── metadata.json + ├── Gregtools Modmanager/ + │ ├── content/ (self-contained WorkshopUploader.exe + dependencies) + │ └── metadata.json + └── ... (one folder per component) +``` + +## Build and deploy (contributors) + +```bash +# Build everything and package into Workshop folders +pwsh -File scripts/Deploy-Release-ToWorkshop.ps1 + +# Deploy to game Mods/ and FMF/Plugins/ for local testing +pwsh -File scripts/Deploy-Release-ToDataCenter.ps1 +``` + +See also: [Contributor Guide](./contributor-workshop) + +## Compatibility + +| Component | Requires | +|-----------|----------| +| All mods/plugins | Data Center (Steam App 4170200) | +| All mods/plugins | MelonLoader (IL2CPP, stable) | +| FMF Plugins | FrikaModdingFramework.dll in Mods/ | +| Gregtools Modmanager | Windows 10 1809+ (self-contained, no runtime install needed) | diff --git a/hexmod.md b/hexmod.md new file mode 100644 index 0000000..5829ce9 --- /dev/null +++ b/hexmod.md @@ -0,0 +1,30 @@ +--- +title: HexMod +sidebar_label: HexMod +description: Hex label mod — in-world hex color labels for cable spinners and racks. +--- + +# HexMod + +The **Hex Label** mod adds in-world hex color labels for cable spinners and racks. + +## Steamworks Info + +| Field | Value | +|-------|-------| +| **Assembly** | `FMF.HexLabelMod.dll` | +| **Version** | `00.01.0009` | +| **Author** | mleem97 | +| **Game** | Waseku — Data Center (App 4170200) | +| **Workshop Tags** | `modded`, `melonloader`, `mod` | + +## Downloads + +- **Steam Workshop:** Subscribe via the Gregtools Modmanager or the [Steam Workshop](https://steamcommunity.com/app/4170200/workshop/) +- **Manual:** Drop `FMF.HexLabelMod.dll` into `/Mods/` + +## Source & layout + +- **Build sources:** [`mods/FMF.Mod.HexLabelMod`](https://github.com/mleem97/gregFramework/tree/master/mods/FMF.Mod.HexLabelMod) + +See also the detailed wiki article [`mods/mods/fmf-hex-label-mod`](/wiki/mods/mods/fmf-hex-label-mod). diff --git a/intro.md b/intro.md new file mode 100644 index 0000000..801af5b --- /dev/null +++ b/intro.md @@ -0,0 +1,41 @@ +--- +id: intro +title: FrikaMF Docs Start +slug: /docs +--- + +This documentation matches the **current monorepo**: MelonLoader framework under `framework/`, gameplay mods under `mods/`, FFM plugins under `plugins/`, Docusaurus content in `docs/`, and the wiki app in `wiki/`. It is written for **players**, **mod developers**, **contributors**, and **sponsors** — pick a lane below. + +## Für wen? — Who is this for? + +| Audience | Start here | +|----------|------------| +| **Spieler** — install, play, troubleshoot | [End users (hub)](./topics/end-user/overview.md) · [End user wiki (import)](./wiki-import/EndUser/) | +| **Moddevs** — build mods, hooks, debugging | [Mod developers (hub)](./topics/mod-developers/overview.md) · [ModDevs wiki (import)](./wiki-import/ModDevs/) · [Framework](./mods/framework.md) | +| **Contributor** — PRs, docs, plugins, CI | [Contributors (workflow)](./topics/contributors/overview.md) · [Contributors wiki (import)](./wiki-import/Contributors/) | +| **Sponsorinnen & Sponsoren** — support & transparency | [Sponsors (hub)](./topics/sponsors/overview.md) · [Sponsors (EN)](./wiki-import/Sponsors.md) · [Sponsoren (DE)](./wiki-import/Sponsoren.md) | + +**Experience tracks** (newbies → pros): [By audience](./topics/audiences/overview.md) → [Newbies](./audiences/newbies.md), [Intermediates](./audiences/intermediates.md), [Professionals](./audiences/professionals.md). + +## Mods Hub + +- Framework entry: [`Framework`](./mods/framework.md) +- Standalone / mod list: [`Standalone Mods`](./mods/standalone/index.md) + +## Hooks and releases + +- [FMF hook naming](./reference/fmf-hook-naming.md) — `FMF..…` and legacy `FFM.*` +- [FMF hooks catalog](./reference/fmf-hooks-catalog.md) — generated from `framework/FrikaMF/HookNames.cs` +- [Release channels](./reference/release-channels.md) — Steam Workshop vs GitHub (beta) +- [MCP server](./reference/mcp-server.md) — LLM/IDE tools over docs + `fmf_hooks.json` (optional Docker bundle) + +## Repository layout (contributors) + +- [Repo inventory](./contributors/repo-inventory.md) — projects, solution scope, entry points +- [Monorepo target layout](./contributors/monorepo-target-layout.md) — phased migration goals + +## Source model + +- **Authoring:** Markdown and MDX live in the repo-root **`docs/`** folder (this tree). See the **[`docs/` layout map](./README.md)** for what lives where (curated topics vs `wiki-import/` vs `wiki/` stubs). +- **Site:** The Docusaurus application is in **`wiki/`**; routes use base **`/wiki`** (see [Docusaurus workflow](./contributors/docusaurus-workflow.md)). +- **Legacy GitHub Wiki:** Mirrored under **`docs/wiki-import/`**; refresh from **`.wiki/`** with `npm run wiki:refresh` in `wiki/`. Details: [Legacy wiki import](./topics/wiki-import/overview.md). diff --git a/meta/IDEA_BACKLOG.md b/meta/IDEA_BACKLOG.md new file mode 100644 index 0000000..f8d696e --- /dev/null +++ b/meta/IDEA_BACKLOG.md @@ -0,0 +1,13 @@ +# Idea backlog (Discord and manual) + +Add one line per idea. Unchecked items can be turned into GitHub issues with `python tools/auto_issue_creator.py`. + +## Pending + +- [ ] (example) Add a smoke test for the FFI bridge. + +## Process + +1. Discord: `!request Your idea` (requires `DISCORD_BOT_TOKEN` and `tools/discord_bridge.py`). +2. Or edit this file manually. +3. Run `python tools/auto_issue_creator.py` to create issues from unchecked lines (requires `gh` CLI and auth). diff --git a/meta/Steam-Workshop-and-Tooling.md b/meta/Steam-Workshop-and-Tooling.md new file mode 100644 index 0000000..a6a401d --- /dev/null +++ b/meta/Steam-Workshop-and-Tooling.md @@ -0,0 +1,39 @@ +# Steam Workshop and tooling + +## Live-Sync references + +After a *Data Center* update, run the game once so MelonLoader regenerates interop assemblies, then from the repo root: + +```bash +python tools/refresh_refs.py +``` + +Optionally save a baseline for diffs: + +```bash +python tools/diff_assembly_metadata.py --save-snapshot +``` + +After future updates: + +```bash +python tools/diff_assembly_metadata.py +``` + +Do **not** commit `*.dll` from `lib/references/` (see `.gitignore`). + +## Steam Workshop (research) + +Official upload and item layout for *Data Center* Workshop content may be undocumented by the developer. Until documented: + +- Treat Workshop delivery as **game-defined** (often content under game data / `StreamingAssets`; MelonLoader mods remain **DLLs in `Mods/`**). +- The **WorkshopUploader** desktop app (see `WorkshopUploader/`) is the supported path for authors to manage Workshop items and DevServer betas once Steamworks is configured. + +## Legal + +Do not redistribute game binaries or extracted assets. Workshop packages should contain **your** content only. + +## CI / agents + +- `FrikaMF.csproj` builds on Windows agents that have either a Steam *Data Center* install **or** a populated `lib/references/MelonLoader/` (from `refresh_refs.py`). +- `WorkshopUploader` targets `net6.0-windows`; build it on Windows (not Linux-hosted runners unless cross-compilation is configured). diff --git a/meta/devserver-betas.md b/meta/devserver-betas.md new file mode 100644 index 0000000..c8aa371 --- /dev/null +++ b/meta/devserver-betas.md @@ -0,0 +1,25 @@ +# DevServer API — beta channels (`gregframework.eu`) + +This document defines the **intended** client contract for the FrikaMF **WorkshopUploader** “Betas” panel. The server may be implemented separately; keep URLs and tokens configurable. + +## Base URL + +- Default: `https://gregframework.eu` +- Override: user settings file next to the app (not committed to git). + +## Endpoints (proposed) + +| Method | Path | Purpose | +|--------|------|---------| +| `GET` | `/api/v1/betas` | List available beta channels (id, name, description). | +| `POST` | `/api/v1/betas/{id}/subscribe` | Enroll the current user (body: Steam ID or bearer token from OAuth). | +| `POST` | `/api/v1/betas/{id}/unsubscribe` | Leave a channel. | + +## Authentication + +- **Preferred:** Short-lived JWT after browser OAuth to `gregframework.eu`, stored in user settings. +- **Alternative:** Steam ID from Steamworks session in the WorkshopUploader process, plus server-side verification. + +## Rate limiting and errors + +Clients should show HTTP status and response body on failure; retry with backoff. diff --git a/mod-index.json b/mod-index.json new file mode 100644 index 0000000..af44405 --- /dev/null +++ b/mod-index.json @@ -0,0 +1,58 @@ +{ + "version": 1, + "description": "Manifest of all mods packaged for Steam Workshop distribution.", + "mods": [ + { + "id": "hexmod", + "title": "FMF HexLabel Mod", + "assembly": "FMF.HexLabelMod.dll", + "version": "00.01.0009", + "author": "mleem97", + "workshopTags": ["modded", "melonloader", "mod"], + "workshopContentPath": "content/Mods/", + "workshopUrl": "", + "githubReleaseUrl": "", + "wikiPath": "/wiki/wiki/mods/hexmod", + "sourcePath": "mods/FMF.Mod.HexLabelMod" + }, + { + "id": "console-input-guard", + "title": "FMF Console Input Guard", + "assembly": "FMF.ConsoleInputGuard.dll", + "version": "00.01.0001", + "author": "mleem97", + "workshopTags": ["modded", "melonloader", "mod"], + "workshopContentPath": "content/Mods/", + "workshopUrl": "", + "githubReleaseUrl": "", + "wikiPath": "/wiki/mods/mods/fmf-console-input-guard", + "sourcePath": "mods/FMF.ConsoleInputGuard" + }, + { + "id": "gregify-employees", + "title": "FMF Gregify Employees", + "assembly": "FMF.GregifyEmployees.dll", + "version": "00.01.0009", + "author": "mleem97", + "workshopTags": ["modded", "melonloader", "mod"], + "workshopContentPath": "content/Mods/", + "workshopUrl": "", + "githubReleaseUrl": "", + "wikiPath": "/wiki/mods/mods/fmf-gregify-employees", + "sourcePath": "mods/FMF.Mod.GregifyEmployees" + }, + { + "id": "lang-compat-bridge", + "title": "FMF JoniML Compat Mod", + "assembly": "FMF.JoniMLCompatMod.dll", + "version": "00.01.0009", + "author": "mleem97", + "workshopTags": ["modded", "melonloader", "mod"], + "workshopContentPath": "content/Mods/", + "workshopUrl": "", + "githubReleaseUrl": "", + "wikiPath": "/wiki/mods/mods/fmf-lang-compat-bridge", + "sourcePath": "mods/FMF.Plugin.LangCompatBridge" + } + ] +} diff --git a/mods/extensions/ffm-plugin-asset-exporter.md b/mods/extensions/ffm-plugin-asset-exporter.md new file mode 100644 index 0000000..c0d21c1 --- /dev/null +++ b/mods/extensions/ffm-plugin-asset-exporter.md @@ -0,0 +1,15 @@ +--- +title: FFM.Plugin.AssetExporter +sidebar_label: FFM.Plugin.AssetExporter +--- + +`StandaloneMods/FFM.Plugin.AssetExporter` + +## Purpose + +Provides export-focused tooling for asset-related workflows. + +## Sources + +- Module path: `StandaloneMods/FFM.Plugin.AssetExporter` +- Overview: [`Standalone Mods`](/wiki/wiki-import/StandaloneMods) diff --git a/mods/extensions/ffm-plugin-multiplayer.md b/mods/extensions/ffm-plugin-multiplayer.md new file mode 100644 index 0000000..bdf6c8d --- /dev/null +++ b/mods/extensions/ffm-plugin-multiplayer.md @@ -0,0 +1,15 @@ +--- +title: FFM.Plugin.Multiplayer +sidebar_label: FFM.Plugin.Multiplayer +--- + +`StandaloneMods/FFM.Plugin.Multiplayer` + +## Purpose + +Contains standalone multiplayer-oriented plugin functionality. + +## Sources + +- Module path: `StandaloneMods/FFM.Plugin.Multiplayer` +- Roadmap context: [`Steamworks P2P Multiplayer Roadmap`](/wiki/wiki-import/Steamworks-P2P-Multiplayer-Roadmap) diff --git a/mods/extensions/ffm-plugin-player-models.md b/mods/extensions/ffm-plugin-player-models.md new file mode 100644 index 0000000..e9f7ed9 --- /dev/null +++ b/mods/extensions/ffm-plugin-player-models.md @@ -0,0 +1,15 @@ +--- +title: FFM.Plugin.PlayerModels +sidebar_label: FFM.Plugin.PlayerModels +--- + +`StandaloneMods/FFM.Plugin.PlayerModels` + +## Purpose + +Hosts standalone player-model specific behavior and integration. + +## Sources + +- Module path: `StandaloneMods/FFM.Plugin.PlayerModels` +- Debug docs: [`Mod Developer Debug`](/wiki/wiki-import/Mod-Developer-Debug) diff --git a/mods/extensions/ffm-plugin-sysadmin.md b/mods/extensions/ffm-plugin-sysadmin.md new file mode 100644 index 0000000..1d5a0f2 --- /dev/null +++ b/mods/extensions/ffm-plugin-sysadmin.md @@ -0,0 +1,15 @@ +--- +title: FFM.Plugin.Sysadmin +sidebar_label: FFM.Plugin.Sysadmin +--- + +`StandaloneMods/FFM.Plugin.Sysadmin` + +## Purpose + +Contains system-administration oriented standalone plugin features. + +## Sources + +- Module path: `StandaloneMods/FFM.Plugin.Sysadmin` +- Framework context: [`Framework Features & Use Cases`](/wiki/wiki-import/Framework-Features-Use-Cases) diff --git a/mods/extensions/ffm-plugin-web-ui-bridge.md b/mods/extensions/ffm-plugin-web-ui-bridge.md new file mode 100644 index 0000000..e4173b0 --- /dev/null +++ b/mods/extensions/ffm-plugin-web-ui-bridge.md @@ -0,0 +1,15 @@ +--- +title: FFM.Plugin.WebUIBridge +sidebar_label: FFM.Plugin.WebUIBridge +--- + +`StandaloneMods/FFM.Plugin.WebUIBridge` + +## Purpose + +Focuses on standalone web UI bridge integration flows. + +## Sources + +- Module path: `StandaloneMods/FFM.Plugin.WebUIBridge` +- Reference: [`Web UI Bridge (DC2WEB)`](/wiki/wiki-import/Web-UI-Bridge) diff --git a/mods/extensions/fmf-console-input-guard.md b/mods/extensions/fmf-console-input-guard.md new file mode 100644 index 0000000..5a9663c --- /dev/null +++ b/mods/extensions/fmf-console-input-guard.md @@ -0,0 +1,15 @@ +--- +title: FMF.ConsoleInputGuard +sidebar_label: FMF.ConsoleInputGuard +--- + +`StandaloneMods/FMF.ConsoleInputGuard` + +## Purpose + +Provides guardrails around console input handling. + +## Sources + +- Module path: `StandaloneMods/FMF.ConsoleInputGuard` +- Overview: [`Standalone Mods`](/wiki/wiki-import/StandaloneMods) diff --git a/mods/extensions/fmf-gregify-employees.md b/mods/extensions/fmf-gregify-employees.md new file mode 100644 index 0000000..e16ade9 --- /dev/null +++ b/mods/extensions/fmf-gregify-employees.md @@ -0,0 +1,15 @@ +--- +title: FMF.GregifyEmployees +sidebar_label: FMF.GregifyEmployees +--- + +`StandaloneMods/FMF.GregifyEmployees` + +## Purpose + +Contains standalone custom employee-related gameplay behavior. + +## Sources + +- Module path: `StandaloneMods/FMF.GregifyEmployees` +- HR context: [`Framework Features & Use Cases`](/wiki/wiki-import/Framework-Features-Use-Cases) diff --git a/mods/extensions/fmf-hex-label-mod.md b/mods/extensions/fmf-hex-label-mod.md new file mode 100644 index 0000000..1d00bb1 --- /dev/null +++ b/mods/extensions/fmf-hex-label-mod.md @@ -0,0 +1,104 @@ +--- +title: FMF.HexLabelMod +sidebar_label: FMF.HexLabelMod +--- + + + +`mods/FMF.Mod.HexLabelMod` + +## Purpose + +Standalone MelonLoader mod for **Data Center** (Waseku) that overlays the hex color code of each `CableSpinner` and `Rack` directly in-world, so you can identify cable and rack colors at a glance without opening any menu. + +Rewritten from the former root `HexLabelMod` for the FrikaModdingFramework workflow, now running fully standalone. + +## Requirements + +| Dependency | Notes | +| --- | --- | +| [MelonLoader](https://melonwiki.xyz/) | With generated IL2CPP assemblies | + +This mod runs standalone and does **not** require FMF runtime APIs. + +## Installation + +1. Drop `FMF.HexLabelMod.dll` into your `Mods/` folder. +2. Launch the game — the config file is created automatically on first run at: + +```text +UserData/hexposition.cfg +``` + +## Configuration + +Edit `UserData/hexposition.cfg` to adjust label positioning and font sizes. The file is auto-generated with defaults on first launch and regenerated if any keys are missing. + +```ini +# Hex Label Position Config +# File: UserData/hexposition.cfg +# Edit values, then restart game. + +# Spinner (UI text near cable spool) +spinner_offset_x=0 +spinner_offset_y=-6 +spinner_font_min=1.8 +spinner_font_max=6.2 +spinner_font_scale=0.24 + +# Rack (world-space text at rack back-right-bottom) +rack_offset_right=-0.03 +rack_offset_back=0.06 +rack_offset_down=-0.02 +rack_font_size=42 +rack_character_size=0.05 +rack_scale=1 +``` + +### Config Keys + +| Key | Type | Default | Description | +| --- | --- | --- | --- | +| `spinner_offset_x` | float | `0` | Horizontal offset relative to the source label | +| `spinner_offset_y` | float | `-6` | Vertical offset relative to the source label | +| `spinner_font_min` | float | `1.8` | Minimum auto-size font size (TMPro) | +| `spinner_font_max` | float | `6.2` | Maximum auto-size font size (TMPro) | +| `spinner_font_scale` | float | `0.24` | Scale factor applied to the source label's font size | +| `rack_offset_right` | float | `-0.03` | World-space offset along rack's right axis | +| `rack_offset_back` | float | `0.06` | World-space offset along rack's back axis | +| `rack_offset_down` | float | `-0.02` | World-space offset along rack's down axis | +| `rack_font_size` | int | `42` | Font size for the world-space `TextMesh` label | +| `rack_character_size` | float | `0.05` | Character size for the world-space `TextMesh` label | +| `rack_scale` | float | `1` | Uniform world-space scale of the rack label object | + +## Live Reload *(restricted)* + +Pressing **Ctrl+F1** toggles live config reload (6-second interval), allowing you to tune label positions without restarting the game. This feature is restricted to a specific Steam account and will silently do nothing for all other users. + +## Build + +```powershell +dotnet build .\mods\FMF.Mod.HexLabelMod\FMF.HexLabelMod.csproj +``` + +Output lands in the standard MelonLoader `Mods/` folder as configured in the `.csproj`. + +## How It Works + +1. **Startup** — The mod defers full initialization until MelonLoader's `Latest.log` confirms the Steam runtime is ready (SteamID or Steam marker detected). +2. **Spinner labels** — Every `CableSpinner` gets a cloned `TextMeshProUGUI` label injected into its UI hierarchy, displaying the resolved hex code in white. Color is read from `rgbColor`, then from the `_BaseColor`/`_Color` material property as fallback. +3. **Rack labels** — Every `Rack` gets a world-space `TextMesh` label positioned at its back-right-bottom corner, facing away from the rack front. +4. **Scan loop** — Active spinners and racks are re-checked every 1.5 seconds to catch newly spawned objects. +5. **Harmony patch** — `CableSpinner.Start` is patched to inject the label immediately on spawn, before the first scan cycle runs. + +## Notes + +- Original gameplay behavior is unaffected. +- This mod runs from `mods/FMF.Mod.HexLabelMod` and no longer from the repository root. +- The config file is fully rewritten if any expected keys are missing (for example, after an update adds new keys). +- FMF assembly presence is no longer required as a startup gate. + +## Sources + +- Module path: `mods/FMF.Mod.HexLabelMod` +- Relatedocs: [`Standalone Mods`](/wiki/wiki-import/StandaloneMods) diff --git a/mods/extensions/fmf-lang-compat-bridge.md b/mods/extensions/fmf-lang-compat-bridge.md new file mode 100644 index 0000000..9fefad0 --- /dev/null +++ b/mods/extensions/fmf-lang-compat-bridge.md @@ -0,0 +1,35 @@ +--- +title: FMF.LangCompatBridge +sidebar_label: FMF.LangCompatBridge +description: Language compatibility bridge mod for Data Center — localization bridging for mixed mod stacks. +--- + +## Description + +Provides language/localization compatibility bridging for mixed mod stacks. + +## Steamworks Metadata + +| Field | Value | +|-------|-------| +| **Assembly** | `FMF.JoniMLCompatMod.dll` | +| **Version** | `00.01.0009` | +| **Author** | mleem97 | +| **Game** | Waseku — Data Center (App 4170200) | +| **Workshop Tags** | `modded`, `melonloader`, `mod` | +| **Workshop Content Path** | `content/Mods/` | +| **Needs FMF** | No (standalone MelonLoader mod) | + +## Wiki Group + +- Category: Mod +- Primary Language: C# +- Project Path: `mods/FMF.Plugin.LangCompatBridge` + +## Installation + +Drop `FMF.JoniMLCompatMod.dll` into `/Mods/`. Requires [MelonLoader](https://melonwiki.xyz/) (IL2CPP). + +## Release + +- [Open Release Page](/wiki/releases/mods/fmf-lang-compat-bridge-release) diff --git a/mods/extensions/fmf-ui-replacement-mod.md b/mods/extensions/fmf-ui-replacement-mod.md new file mode 100644 index 0000000..0fa97af --- /dev/null +++ b/mods/extensions/fmf-ui-replacement-mod.md @@ -0,0 +1,19 @@ +--- +title: FMF.UIReplacementMod +sidebar_label: FMF.UIReplacementMod (Legacy) +--- + +## Description + +Legacy standalone UI replacement module page kept for compatibility. + +## Project Status + +- Status: Legacy documentation entry +- Note: No active `csproj` module was detected under `mods/` for this page. + +## Source + +- Previous mixed wiki path: `mods/standalone/fmf-ui-replacement-mod` + +- [Open Release Page](/wiki/releases/mods/fmf-ui-replacement-mod-release) diff --git a/mods/extensions/index.md b/mods/extensions/index.md new file mode 100644 index 0000000..5250c03 --- /dev/null +++ b/mods/extensions/index.md @@ -0,0 +1,37 @@ +--- +title: Standalone Plugins & Mods +sidebar_label: Overview +--- + +This section contains the first-party standalone modules currently maintained in this repository. + +## Classification + +- **Plugins** extend the framework runtime capabilities. +- **Mods** extend the game behavior/content by using framework and plugin capabilities. + +## Loading path + +- **MelonLoader mods** load from `{GameRoot}/Mods/` (standard MelonLoader behavior). +- **FMF framework plugins** (`FFM.Plugin.*`) are deployed under `{GameRoot}/FMF/Plugins/`; MelonLoader does not scan that folder by default — see [Game folder layout](/wiki/topics/meta/game-folder-layout). +- Rust mods via FrikaMF follow the same runtime rules as other MelonLoader mods unless documented otherwise. + +## Standalone Plugins + +- [FFM.Plugin.AssetExporter](./ffm-plugin-asset-exporter.md) +- [FFM.Plugin.Multiplayer](./ffm-plugin-multiplayer.md) +- [FFM.Plugin.PlayerModels](./ffm-plugin-player-models.md) +- [FFM.Plugin.Sysadmin](./ffm-plugin-sysadmin.md) +- [FFM.Plugin.WebUIBridge](./ffm-plugin-web-ui-bridge.md) + +## Standalone Mods + +- [FMF.ConsoleInputGuard](./fmf-console-input-guard.md) +- [FMF.GregifyEmployees](./fmf-gregify-employees.md) +- [FMF.HexLabelMod](./fmf-hex-label-mod.md) +- [FMF.LangCompatBridge](./fmf-lang-compat-bridge.md) +- [FMF.UIReplacementMod](./fmf-ui-replacement-mod.md) + +## Additional context + +- [`Standalone Mods` wiki page](/wiki/wiki-import/StandaloneMods) diff --git a/mods/framework.md b/mods/framework.md new file mode 100644 index 0000000..6a4ea43 --- /dev/null +++ b/mods/framework.md @@ -0,0 +1,18 @@ +--- +title: Framework +sidebar_label: Framework +--- + +The core `FrikaMF` runtime provides: + +- Harmony patch integration for gameplay hooks +- Event dispatch and stable event contracts +- Native bridge for Rust modules +- Shared game API abstractions for mod authors + +## Core references + +- [`Framework Features & Use Cases`](/wiki/wiki-import/Framework-Features-Use-Cases) +- [`HOOKS`](/wiki/wiki-import/HOOKS) +- [`FFI Bridge Reference`](/wiki/wiki-import/FFI-Bridge-Reference) +- [`Mod Developer Debug`](/wiki/wiki-import/Mod-Developer-Debug) diff --git a/mods/mods/fmf-console-input-guard.md b/mods/mods/fmf-console-input-guard.md new file mode 100644 index 0000000..0200f87 --- /dev/null +++ b/mods/mods/fmf-console-input-guard.md @@ -0,0 +1,35 @@ +--- +title: FMF.ConsoleInputGuard +sidebar_label: FMF.ConsoleInputGuard +description: Console input guard mod for Data Center — prevents accidental console interactions. +--- + +## Description + +Provides guardrails around console input handling and accidental interactions. + +## Steamworks Metadata + +| Field | Value | +|-------|-------| +| **Assembly** | `FMF.ConsoleInputGuard.dll` | +| **Version** | `00.01.0001` | +| **Author** | mleem97 | +| **Game** | Waseku — Data Center (App 4170200) | +| **Workshop Tags** | `modded`, `melonloader`, `mod` | +| **Workshop Content Path** | `content/Mods/` | +| **Needs FMF** | No (standalone MelonLoader mod) | + +## Wiki Group + +- Category: Mod +- Primary Language: C# +- Project Path: `mods/FMF.ConsoleInputGuard` + +## Installation + +Drop `FMF.ConsoleInputGuard.dll` into `/Mods/`. Requires [MelonLoader](https://melonwiki.xyz/) (IL2CPP). + +## Release + +- [Open Release Page](/wiki/releases/mods/fmf-console-input-guard-release) diff --git a/mods/mods/fmf-gregify-employees.md b/mods/mods/fmf-gregify-employees.md new file mode 100644 index 0000000..429dfcc --- /dev/null +++ b/mods/mods/fmf-gregify-employees.md @@ -0,0 +1,35 @@ +--- +title: FMF.GregifyEmployees +sidebar_label: FMF.GregifyEmployees +description: Gregify Employees gameplay mod for Data Center — themed employee customization. +--- + +## Description + +Applies themed employee customization to hiring-related gameplay flows. + +## Steamworks Metadata + +| Field | Value | +|-------|-------| +| **Assembly** | `FMF.GregifyEmployees.dll` | +| **Version** | `00.01.0009` | +| **Author** | mleem97 | +| **Game** | Waseku — Data Center (App 4170200) | +| **Workshop Tags** | `modded`, `melonloader`, `mod` | +| **Workshop Content Path** | `content/Mods/` | +| **Needs FMF** | No (standalone MelonLoader mod) | + +## Wiki Group + +- Category: Mod +- Primary Language: C# +- Project Path: `mods/FMF.Mod.GregifyEmployees` + +## Installation + +Drop `FMF.GregifyEmployees.dll` into `/Mods/`. Requires [MelonLoader](https://melonwiki.xyz/) (IL2CPP). + +## Release + +- [Open Release Page](/wiki/releases/mods/fmf-gregify-employees-release) diff --git a/mods/mods/index.md b/mods/mods/index.md new file mode 100644 index 0000000..e252f11 --- /dev/null +++ b/mods/mods/index.md @@ -0,0 +1,13 @@ +--- +title: Mods Wiki +sidebar_label: Mods Overview +--- + +This section contains gameplay mod wiki pages, separated from plugins. + +## Mod Projects + +- [FMF.ConsoleInputGuard](./fmf-console-input-guard) +- [FMF.GregifyEmployees](./fmf-gregify-employees) +- [FMF.HexLabelMod](./fmf-hex-label-mod) +- [FMF.LangCompatBridge](./fmf-lang-compat-bridge) diff --git a/mods/standalone/fmf-hex-label-mod.md b/mods/standalone/fmf-hex-label-mod.md new file mode 100644 index 0000000..5a1474a --- /dev/null +++ b/mods/standalone/fmf-hex-label-mod.md @@ -0,0 +1,35 @@ +--- +title: FMF.HexLabelMod +sidebar_label: FMF.HexLabelMod +description: Hex label display mod for Data Center — overlays cable spinner and rack color hex labels in-world. +--- + +## Description + +Overlays cable spinner and rack color hex labels directly in-world so you can identify cable and rack colors at a glance without opening any menu. + +## Steamworks Metadata + +| Field | Value | +|-------|-------| +| **Assembly** | `FMF.HexLabelMod.dll` | +| **Version** | `00.01.0009` | +| **Author** | mleem97 | +| **Game** | Waseku — Data Center (App 4170200) | +| **Workshop Tags** | `modded`, `melonloader`, `mod` | +| **Workshop Content Path** | `content/Mods/` | +| **Needs FMF** | No (standalone MelonLoader mod) | + +## Wiki Group + +- Category: Mod +- Primary Language: C# +- Project Path: `mods/FMF.Mod.HexLabelMod` + +## Installation + +Drop `FMF.HexLabelMod.dll` into `/Mods/`. Requires [MelonLoader](https://melonwiki.xyz/) (IL2CPP). + +## Release + +- [Open Release Page](/wiki/releases/mods/fmf-hex-label-mod-release) diff --git a/reference/fmf-hook-naming.md b/reference/fmf-hook-naming.md new file mode 100644 index 0000000..c4d645a --- /dev/null +++ b/reference/fmf-hook-naming.md @@ -0,0 +1,70 @@ +--- +id: fmf-hook-naming +title: FMF hook and event naming +slug: /reference/fmf-hook-naming +description: Canonical naming for hooks, events, and cross-language documentation stubs. +--- + +# FMF hook and event naming + +## Target format + +All **new** public hook and event identifiers should follow: + +```text +FMF.. +``` + +- **`FMF`** — Fixed prefix (Frika Mod Framework). +- **``** — Uppercase domain from the [approved domain list](#approved-domain-segments). Describes *where* the signal belongs in the game (player, rack, server, economy, …). +- **``** — `PascalCase` segment(s), usually `OnSomething` for events or a verb phrase for commands. + +Examples (illustrative): `FMF.RACK.CableSpinnerColorResolved`, `FMF.PLAYER.InputPoll`, `FMF.NETWORK.Cable.OnConnected`. + +## Approved domain segments + +Domains are **closed by default**. Add a new domain only via changelog + maintainer review. + +| Domain | Scope | +|--------|--------| +| `GAMEPLAY` | Rules, scoring, simulation beats not covered elsewhere | +| `PLAYER` | Local player input, camera, UI focus | +| `EMPLOYEE` | NPC staff, hiring, schedules | +| `CUSTOMER` | Contracts, SLA, satisfaction | +| `SERVER` | In-game server racks, VMs, power | +| `RACK` | Physical rack placement, mounting | +| `NETWORK` | Cables, switches, traffic | +| `STORE` | Shop cart, checkout | +| `WORLD` | Rooms, expansion, walls | +| `UI` | HUD overlays, menus (when not `PLAYER`) | +| `SAVE` | Save/load lifecycle | +| `FRAMEWORK` | Loader, bridge, diagnostics | + +## Legacy: `FFM.*` strings in code + +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`). + +**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.*`). + +## Cross-language stubs (documentation) + +For each canonical hook, the wiki may add **non-normative** snippets: + +| Language | Convention | +|----------|------------| +| C# | `FMF.Domain.OnSomething.Subscribe(...)` or string literal | +| Lua | `FMF.Domain.OnSomething:subscribe(...)` | +| Rust | `fmf::domain::on_something::subscribe(...)` | +| Python | `fmf.domain.on_something.subscribe(...)` | +| TypeScript | `FMF.Domain.OnSomething.subscribe(...)` | + +Bindings are **not** auto-generated for all languages; stubs are for contributor clarity. + +## Related + +- [FMF hooks catalog](./fmf-hooks-catalog.md) (generated) +- [Legacy wiki: HOOK-NAMING-CONVENTION](../wiki-import/HOOK-NAMING-CONVENTION.md) (extended examples) diff --git a/reference/fmf-hooks-catalog.md b/reference/fmf-hooks-catalog.md new file mode 100644 index 0000000..ac62bb4 --- /dev/null +++ b/reference/fmf-hooks-catalog.md @@ -0,0 +1,109 @@ +--- +id: fmf-hooks-catalog +title: FMF hooks catalog +slug: /reference/fmf-hooks-catalog +description: Auto-generated catalog of hook strings and event id mappings from FrikaMF sources. +--- + + + +# FMF hooks catalog + +This page is **generated** from `framework/FrikaMF/HookNames.cs` and `framework/FrikaMF/EventIds.cs`. + +**Generated:** 2026-04-06 14:26:09 UTC + +## Hook string constants + +| 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`` | +| ``EmployeesStaffOnHiredCustom`` | ``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`` | +| ``StoreCartOnCheckedOutCleared`` | ``FFM.Store.Cart.OnCheckedOut`` | +| ``StoreCartOnItemAdded`` | ``FFM.Store.Cart.OnItemAdded`` | +| ``StoreCartOnItemRemoved`` | ``FFM.Store.Cart.OnItemRemoved`` | +| ``WorldRoomOnExpanded`` | ``FFM.World.Room.OnExpanded`` | + +## Event id to hook mapping + +| Event id (uint) | EventIds name | Resolves to field | Hook string | +|-----------------|---------------|---------------------|-------------| +| 213 | `CableCleared` | `StoreCartOnCheckedOutCleared` | `FFM.Store.Cart.OnCheckedOut` | +| 204 | `CableConnected` | `NetworkCableOnConnected` | `FFM.Network.Cable.OnConnected` | +| 211 | `CableCreated` | `NetworkCableOnConnected` | `FFM.Network.Cable.OnConnected` | +| 205 | `CableDisconnected` | `NetworkCableOnDisconnected` | `FFM.Network.Cable.OnDisconnected` | +| 212 | `CableRemoved` | `NetworkCableOnDisconnected` | `FFM.Network.Cable.OnDisconnected` | +| 215 | `CableSfpInserted` | `NetworkCableOnConnected` | `FFM.Network.Cable.OnConnected` | +| 216 | `CableSfpRemoved` | `NetworkCableOnDisconnected` | `FFM.Network.Cable.OnDisconnected` | +| 214 | `CableSpeedChanged` | `NetworkTrafficOnThresholdExceeded` | `FFM.Network.Traffic.OnThresholdExceeded` | +| 1001 | `CustomEmployeeFired` | `EmployeesStaffOnTerminatedCustom` | `FFM.Employees.Staff.OnTerminated` | +| 1000 | `CustomEmployeeHired` | `EmployeesStaffOnHiredCustom` | `FFM.Employees.Staff.OnHired` | +| 400 | `CustomerAccepted` | `CustomerContractOnSigned` | `FFM.Customer.Contract.OnSigned` | +| 401 | `CustomerSatisfied` | `CustomerSlaOnRestored` | `FFM.Customer.SLA.OnRestored` | +| 402 | `CustomerUnsatisfied` | `CustomerSlaOnBreached` | `FFM.Customer.SLA.OnBreached` | +| 300 | `DayEnded` | `GameTimeOnDayChanged` | `FFM.Game.Time.OnDayChanged` | +| 601 | `EmployeeFired` | `EmployeesStaffOnTerminated` | `FFM.Employees.Staff.OnTerminated` | +| 600 | `EmployeeHired` | `EmployeesStaffOnHired` | `FFM.Employees.Staff.OnHired` | +| 702 | `GameAutoSaved` | `GameSaveOnRequested` | `FFM.Game.Save.OnRequested` | +| 701 | `GameLoaded` | `GameLoadOnCompleted` | `FFM.Game.Load.OnCompleted` | +| 700 | `GameSaved` | `GameSaveOnCompleted` | `FFM.Game.Save.OnCompleted` | +| 1100 | `HookBridgeInstalled` | `FrameworkHooksOnBridgeInstalled` | `FFM.Framework.Hooks.OnBridgeInstalled` | +| 1101 | `HookBridgeTriggered` | `FrameworkHooksOnBridgeTriggered` | `FFM.Framework.Hooks.OnBridgeTriggered` | +| 100 | `MoneyChanged` | `EconomyBalanceOnChanged` | `FFM.Economy.Balance.OnChanged` | +| 301 | `MonthEnded` | `GameTimeOnMonthChanged` | `FFM.Game.Time.OnMonthChanged` | +| 900 | `NetWatchDispatched` | `NetworkTrafficOnThresholdExceeded` | `FFM.Network.Traffic.OnThresholdExceeded` | +| 208 | `RackUnmounted` | `ObjectsRackOnRemoved` | `FFM.Objects.Rack.OnRemoved` | +| 102 | `ReputationChanged` | `CustomerReputationOnChanged` | `FFM.Customer.Reputation.OnChanged` | +| 207 | `ServerAppChanged` | `ObjectsServerOnClientUnassigned` | `FFM.Objects.Server.OnClientUnassigned` | +| 201 | `ServerBroken` | `ObjectsDeviceOnDegraded` | `FFM.Objects.Device.OnDegraded` | +| 206 | `ServerCustomerChanged` | `ObjectsServerOnClientAssigned` | `FFM.Objects.Server.OnClientAssigned` | +| 203 | `ServerInstalled` | `ObjectsRackOnDevicePlaced` | `FFM.Objects.Rack.OnDevicePlaced` | +| 200 | `ServerPowered` | `ObjectsDeviceOnPoweredOn` | `FFM.Objects.Device.OnPoweredOn` | +| 202 | `ServerRepaired` | `ObjectsDeviceOnRepaired` | `FFM.Objects.Device.OnRepaired` | +| 502 | `ShopCartCleared` | `StoreCartOnCheckedOutCleared` | `FFM.Store.Cart.OnCheckedOut` | +| 500 | `ShopCheckout` | `StoreCartOnCheckedOut` | `FFM.Store.Cart.OnCheckedOut` | +| 501 | `ShopItemAdded` | `StoreCartOnItemAdded` | `FFM.Store.Cart.OnItemAdded` | +| 503 | `ShopItemRemoved` | `StoreCartOnItemRemoved` | `FFM.Store.Cart.OnItemRemoved` | +| 209 | `SwitchBroken` | `NetworkCableOnLinkDown` | `FFM.Network.Cable.OnLinkDown` | +| 210 | `SwitchRepaired` | `NetworkCableOnLinkUp` | `FFM.Network.Cable.OnLinkUp` | +| 800 | `WallPurchased` | `WorldRoomOnExpanded` | `FFM.World.Room.OnExpanded` | +| 101 | `XPChanged` | `GameXpOnGained` | `FFM.Game.XP.OnGained` | + +## Fallback + +Unknown event ids resolve to ``FFM.Framework.Unknown.OnEvent`` in `HookNames.Resolve`. + +## See also + +- [FMF hook naming](./fmf-hook-naming.md) +- [EventIds source](https://github.com/mleem97/gregFramework/blob/master/framework/FrikaMF/EventIds.cs) +- [HookNames source](https://github.com/mleem97/gregFramework/blob/master/framework/FrikaMF/HookNames.cs) diff --git a/reference/mcp-server.md b/reference/mcp-server.md new file mode 100644 index 0000000..73cfb5e --- /dev/null +++ b/reference/mcp-server.md @@ -0,0 +1,69 @@ +--- +title: MCP server (LLM-friendly modding) +sidebar_label: MCP server +description: Model Context Protocol server bundled with the docs Docker image for assistants and IDEs. +--- + +# MCP server (FrikaMF modding) + +The repository ships a **Model Context Protocol (MCP)** server (`mcp-server/`) that exposes: + +- **Docs search & read** — Markdown under `docs/` (same source as Docusaurus). +- **Hook registry** — `fmf_hooks.json` (and the same registry path in the monorepo). +- **CONTRIBUTING** — conventions and workflow. +- **Repo layout** — static overview and a **`fmf_modding_context`** prompt for quick context. + +Use it when you want an assistant (Cursor, Claude Code, or any MCP client) to **ground answers** in this repo instead of guessing APIs. + +## Docker (single container) + +The root `Dockerfile` builds **Docusaurus** into static files and runs **one Node process** that: + +- Serves the wiki at **`http://:3000/`** (static HTML). +- Exposes **Streamable HTTP MCP** at **`POST /mcp`** and **`GET /mcp`** (SSE), plus **`GET /health`**. + +From the repo root: + +```bash +docker compose up docs-mcp +``` + +Default mapping: **`http://localhost:3040`** (host) → container port **3000**. + +- Docs: `http://localhost:3040/wiki/` +- Health: `http://localhost:3040/health` +- MCP: `http://localhost:3040/mcp` (client must speak MCP Streamable HTTP; session via `mcp-session-id` header). + +:::note Security + +Binding to `0.0.0.0` exposes the MCP endpoint on your network. Use only on trusted networks or behind a reverse proxy with authentication. + +::: + +## Local (stdio) for Cursor + +From `mcp-server/` with the repo root as data (so `docs/`, `CONTRIBUTING.md`, and `FrikaModFramework/fmf_hooks.json` resolve): + +```bash +cd mcp-server +node src/index.mjs --stdio --data-root .. +``` + +Point your MCP client at this command (stdio transport). Adjust `--data-root` if your layout differs. + +## Tools (summary) + +| Tool | Purpose | +|------|--------| +| `fmf_search_docs` | Substring search across `docs/**/*.md` | +| `fmf_read_doc` | Read one file by path under `docs/` | +| `fmf_list_doc_paths` | Discover Markdown paths | +| `fmf_hook_registry` | Raw `fmf_hooks.json` | +| `fmf_read_contributing` | `CONTRIBUTING.md` | +| `fmf_repo_layout` | Short monorepo overview | + +## Related + +- [Hook naming](./fmf-hook-naming.md) +- [Hooks catalog](./fmf-hooks-catalog.md) +- [Monorepo target layout](../contributors/monorepo-target-layout.md) diff --git a/reference/mod-store-vision.md b/reference/mod-store-vision.md new file mode 100644 index 0000000..d332668 --- /dev/null +++ b/reference/mod-store-vision.md @@ -0,0 +1,31 @@ +--- +id: mod-store-vision +title: Mod Store Vision (Secure Git-Based) +slug: /reference/mod-store-vision +--- + +## Vision + +Build a Mod Store with Git-based submissions, automated malware scanning, and policy checks before mods are visible. + +## Core principles + +- All submissions are reviewable in Git. +- Every build artifact is reproducible from source. +- Security checks are mandatory before publish. + +## Security pipeline (target) + +1. Submit via pull request (manifest + source + checksums). +2. CI runs static checks and signature/metadata validation. +3. Virus scanning runs on produced artifacts. +4. Maintainer review and policy checks. +5. Publish approved metadata index consumed by launcher/site. + +## Recommended metadata fields + +- `modId`, `version`, `authors` +- `supportedGameVersions` +- `requiredFrameworkVersion` +- `sha256` for each downloadable artifact +- source URL and license diff --git a/reference/release-channels.md b/reference/release-channels.md new file mode 100644 index 0000000..3581970 --- /dev/null +++ b/reference/release-channels.md @@ -0,0 +1,42 @@ +--- +id: release-channels +title: Release channels — Steam vs GitHub +slug: /reference/release-channels +description: Where to download stable builds, beta builds, and how this relates to the Steam Workshop. +--- + +# Release channels — Steam vs GitHub + +This project uses **two complementary channels** for distributing mods and plugins. The wiki and [`/mods`](/mods) catalog are **not** a replacement for the Steam Workshop; they are an **overview**, documentation hub, and **second official source** for files that should not flood the Workshop. + +## Steam Workshop (discovery & stable) + +- **Game**: [Data Center on Steam](https://store.steampowered.com/app/4170200/) (AppID `4170200`). +- **Workshop**: [Browse items](https://steamcommunity.com/workshop/browse/?appid=4170200) — best for **player discovery**, ratings, and stable “subscribe and play” flows. +- Use Workshop for **production-ready** releases you want every player to see. + +## GitHub Releases (beta and alternate downloads) + +- **Organization**: [github.com/mleem97/gregFramework](https://github.com/mleem97/gregFramework) (see repo for actual org if renamed). +- **Stable**: tagged releases — same DLLs you may also ship via Workshop. +- **Pre-release / beta**: GitHub **pre-releases** — ideal for testers without publishing unfinished items to Workshop. +- **Why**: avoids “polluting” the Workshop with experimental builds while still offering a **single official URL** for power users and CI. + +## This documentation site + +| Need | Where | +|------|--------| +| Wiki entry for a module | `/wiki/mods/...` | +| Download link (when configured) | GitHub Releases asset or redirect from [`moduleCatalog`](https://github.com/mleem97/gregFramework/blob/master/wiki/src/data/moduleCatalog.ts) | +| Catalog overview | [`/mods`](/mods) | + +## Maintainer checklist + +- [ ] Stable: tag + Release notes + optional Workshop update. +- [ ] Beta: pre-release + link from module wiki page + `releaseReady: false` in catalog until promoted. +- [ ] Do not commit large binaries to `main` without a documented policy. + +## Related + +- [Repo inventory](../contributors/repo-inventory.md) +- [Mod store vision](./mod-store-vision.md) diff --git a/reference/wiki-mapping.md b/reference/wiki-mapping.md new file mode 100644 index 0000000..08375b3 --- /dev/null +++ b/reference/wiki-mapping.md @@ -0,0 +1,26 @@ +--- +id: wiki-mapping +title: Wiki to Docusaurus Mapping +slug: /reference/wiki-mapping +--- + +## Why this mapping exists + +The repository currently stores canonical docs in `.wiki/`. This page defines how those pages are grouped in Docusaurus. + +## Audience buckets + +- **Newbies**: install/update/troubleshooting, legal basics +- **Intermediates**: hooking, bridge usage, mod config, workflows +- **Pros**: architecture, runtime internals, release system, roadmap + +## Suggested migration order + +1. Start with onboarding pages (`Home`, End-User, Mod-Developer). +2. Migrate runtime references (`Architecture`, `FFI-Bridge-Reference`, `Web-UI-Bridge`). +3. Migrate governance pages (`Contributors`, Roadmap, Tasklist). +4. Keep bilingual mirrors where needed. + +## Sync strategy + +Use `npm run wiki:sync` to copy `.wiki/*.md` into a generated docs area for review-based migration. diff --git a/references/README.md b/references/README.md new file mode 100644 index 0000000..59be7aa --- /dev/null +++ b/references/README.md @@ -0,0 +1,35 @@ +# Reference Data + +This folder contains large reference exports used by hook analysis and build-time tooling. + +## Files + +- [assembly-hooks.txt.gz](./assembly-hooks.txt.gz) +- [modder-hooks.ffm.txt.gz](./modder-hooks.ffm.txt.gz) + +## Decompress + +Use standard gzip tools when you need local plaintext files: + +```bash +gzip -dk assembly-hooks.txt.gz +gzip -dk modder-hooks.ffm.txt.gz +``` + +PowerShell alternative: + +```powershell +$inputPath = ".\\assembly-hooks.txt.gz" +$outputPath = ".\\assembly-hooks.txt" +$in = [System.IO.File]::OpenRead($inputPath) +$out = [System.IO.File]::Create($outputPath) +$gzip = New-Object System.IO.Compression.GzipStream($in, [System.IO.Compression.CompressionMode]::Decompress) +$gzip.CopyTo($out) +$gzip.Dispose(); $out.Dispose(); $in.Dispose() +``` + +## Build Pipeline Usage + +- Hook alias and reference tooling should read `.gz` directly when possible. +- If plaintext is required, scripts should decompress on demand and avoid committing extracted `.txt` files. +- Keep all reference artifacts in `docs/wiki/references/`. diff --git a/references/assembly-hooks.txt.gz b/references/assembly-hooks.txt.gz new file mode 100644 index 0000000..1e11742 Binary files /dev/null and b/references/assembly-hooks.txt.gz differ diff --git a/references/modder-hooks.ffm.txt.gz b/references/modder-hooks.ffm.txt.gz new file mode 100644 index 0000000..9df2ed0 Binary files /dev/null and b/references/modder-hooks.ffm.txt.gz differ diff --git a/releases/index.mdx b/releases/index.mdx new file mode 100644 index 0000000..bd13976 --- /dev/null +++ b/releases/index.mdx @@ -0,0 +1,29 @@ +--- +title: Releases +sidebar_label: Releases overview +description: Index of plugin and mod release pages (download metadata, notes links). +--- + +# Releases + +Release pages list **download targets**, **version placeholders**, and links back to the **wiki articles** for each plugin or mod. Non-release documentation lives under [Mods](/wiki/mods/plugins/) in the sidebar. + +## Plugin releases + +- [FFM.Plugin.AssetExporter](/wiki/releases/plugins/ffm-plugin-asset-exporter-release) +- [FFM.Plugin.Multiplayer](/wiki/releases/plugins/ffm-plugin-multiplayer-release) +- [FFM.Plugin.PlayerModels](/wiki/releases/plugins/ffm-plugin-player-models-release) +- [FFM.Plugin.Sysadmin](/wiki/releases/plugins/ffm-plugin-sysadmin-release) +- [FFM.Plugin.WebUIBridge](/wiki/releases/plugins/ffm-plugin-web-ui-bridge-release) + +## Tool releases + +- [GregTools 1.0 Modmanager](/wiki/releases/tools/gregtools-modmanager-1.0-release) + +## Mod releases + +- [FMF.ConsoleInputGuard](/wiki/releases/mods/fmf-console-input-guard-release) +- [FMF.GregifyEmployees](/wiki/releases/mods/fmf-gregify-employees-release) +- [FMF.HexLabelMod](/wiki/releases/mods/fmf-hex-label-mod-release) +- [FMF.LangCompatBridge](/wiki/releases/mods/fmf-lang-compat-bridge-release) +- [FMF.UIReplacementMod](/wiki/releases/mods/fmf-ui-replacement-mod-release) diff --git a/releases/mods/fmf-console-input-guard-release.mdx b/releases/mods/fmf-console-input-guard-release.mdx new file mode 100644 index 0000000..30c0135 --- /dev/null +++ b/releases/mods/fmf-console-input-guard-release.mdx @@ -0,0 +1,21 @@ +--- +title: FMF.ConsoleInputGuard Release +sidebar_label: FMF.ConsoleInputGuard Release +--- + +import ModReleasePage from '@site/src/components/ModReleasePage'; + + diff --git a/releases/mods/fmf-gregify-employees-release.mdx b/releases/mods/fmf-gregify-employees-release.mdx new file mode 100644 index 0000000..2d8a561 --- /dev/null +++ b/releases/mods/fmf-gregify-employees-release.mdx @@ -0,0 +1,21 @@ +--- +title: FMF.GregifyEmployees Release +sidebar_label: FMF.GregifyEmployees Release +--- + +import ModReleasePage from '@site/src/components/ModReleasePage'; + + diff --git a/releases/mods/fmf-hex-label-mod-release.mdx b/releases/mods/fmf-hex-label-mod-release.mdx new file mode 100644 index 0000000..92d6d96 --- /dev/null +++ b/releases/mods/fmf-hex-label-mod-release.mdx @@ -0,0 +1,21 @@ +--- +title: FMF.HexLabelMod Release +sidebar_label: FMF.HexLabelMod Release +--- + +import ModReleasePage from '@site/src/components/ModReleasePage'; + + diff --git a/releases/mods/fmf-lang-compat-bridge-release.mdx b/releases/mods/fmf-lang-compat-bridge-release.mdx new file mode 100644 index 0000000..1837921 --- /dev/null +++ b/releases/mods/fmf-lang-compat-bridge-release.mdx @@ -0,0 +1,21 @@ +--- +title: FMF.LangCompatBridge Release +sidebar_label: FMF.LangCompatBridge Release +--- + +import ModReleasePage from '@site/src/components/ModReleasePage'; + + diff --git a/releases/mods/fmf-ui-replacement-mod-release.mdx b/releases/mods/fmf-ui-replacement-mod-release.mdx new file mode 100644 index 0000000..adad480 --- /dev/null +++ b/releases/mods/fmf-ui-replacement-mod-release.mdx @@ -0,0 +1,15 @@ +--- +title: FMF.UIReplacementMod Release +sidebar_label: FMF.UIReplacementMod +--- + +import ModReleasePage from '@site/src/components/ModReleasePage'; + + diff --git a/releases/plugins/ffm-plugin-asset-exporter-release.mdx b/releases/plugins/ffm-plugin-asset-exporter-release.mdx new file mode 100644 index 0000000..b304c24 --- /dev/null +++ b/releases/plugins/ffm-plugin-asset-exporter-release.mdx @@ -0,0 +1,21 @@ +--- +title: FFM.Plugin.AssetExporter Release +sidebar_label: FFM.Plugin.AssetExporter Release +--- + +import ModReleasePage from '@site/src/components/ModReleasePage'; + + diff --git a/releases/plugins/ffm-plugin-multiplayer-release.mdx b/releases/plugins/ffm-plugin-multiplayer-release.mdx new file mode 100644 index 0000000..b841f33 --- /dev/null +++ b/releases/plugins/ffm-plugin-multiplayer-release.mdx @@ -0,0 +1,21 @@ +--- +title: FFM.Plugin.Multiplayer Release +sidebar_label: FFM.Plugin.Multiplayer Release +--- + +import ModReleasePage from '@site/src/components/ModReleasePage'; + + diff --git a/releases/plugins/ffm-plugin-player-models-release.mdx b/releases/plugins/ffm-plugin-player-models-release.mdx new file mode 100644 index 0000000..9123a6c --- /dev/null +++ b/releases/plugins/ffm-plugin-player-models-release.mdx @@ -0,0 +1,21 @@ +--- +title: FFM.Plugin.PlayerModels Release +sidebar_label: FFM.Plugin.PlayerModels Release +--- + +import ModReleasePage from '@site/src/components/ModReleasePage'; + + diff --git a/releases/plugins/ffm-plugin-sysadmin-release.mdx b/releases/plugins/ffm-plugin-sysadmin-release.mdx new file mode 100644 index 0000000..0582644 --- /dev/null +++ b/releases/plugins/ffm-plugin-sysadmin-release.mdx @@ -0,0 +1,21 @@ +--- +title: FFM.Plugin.Sysadmin Release +sidebar_label: FFM.Plugin.Sysadmin Release +--- + +import ModReleasePage from '@site/src/components/ModReleasePage'; + + diff --git a/releases/plugins/ffm-plugin-web-ui-bridge-release.mdx b/releases/plugins/ffm-plugin-web-ui-bridge-release.mdx new file mode 100644 index 0000000..95605d3 --- /dev/null +++ b/releases/plugins/ffm-plugin-web-ui-bridge-release.mdx @@ -0,0 +1,21 @@ +--- +title: FFM.Plugin.WebUIBridge Release +sidebar_label: FFM.Plugin.WebUIBridge Release +--- + +import ModReleasePage from '@site/src/components/ModReleasePage'; + + diff --git a/releases/plugins/fmf-modpathredirector-release.mdx b/releases/plugins/fmf-modpathredirector-release.mdx new file mode 100644 index 0000000..ac80c8a --- /dev/null +++ b/releases/plugins/fmf-modpathredirector-release.mdx @@ -0,0 +1,40 @@ +--- +title: FMF.ModPathRedirector Release +sidebar_label: FMF.ModPathRedirector Release +description: Download and install the MelonLoader Workshop download plugin for Data Center. +--- + +import ModReleasePage from '@site/src/components/ModReleasePage'; + + +
  • + Download FMF.ModPathRedirector.dll from the latest{' '} + GitHub release (or use the button on this page — redirects to the same asset). +
  • +
  • + Copy the DLL into your game folder: <GameRoot>/Plugins/ — the same directory as Data Center.exe, not Mods/ (that folder is for MelonMods). +
  • +
  • + Ensure steam_api64.dll is next to the game executable (Steam ships it with the game). Start the game with MelonLoader; the plugin waits until Steam is running, then requests downloads for subscribed Workshop items. +
  • + + } +/> + +:::info GitHub asset +The **Download DLL** button and `/plugin/FMF.ModPathRedirector.dll` route resolve to `https://github.com/mleem97/gregFramework/releases/latest/download/FMF.ModPathRedirector.dll`. That file is attached automatically when you publish a release via the `release-assets.yml` workflow (push a `v*` tag or run the workflow manually). +::: diff --git a/releases/tools/gregtools-modmanager-1.0-release.mdx b/releases/tools/gregtools-modmanager-1.0-release.mdx new file mode 100644 index 0000000..a9a6926 --- /dev/null +++ b/releases/tools/gregtools-modmanager-1.0-release.mdx @@ -0,0 +1,42 @@ +--- +title: GregTools 1.0 Modmanager +sidebar_label: GregTools Modmanager 1.0 +description: First stable release of the GregTools Modmanager (Workshop Uploader) for Data Center — download ZIP, install, and links. +--- + +# GregTools 1.0 Modmanager + +**Version:** 1.0.0 · **Application title:** GregTools Modmanager · **Windows:** win10-x64, self-contained (.NET MAUI) + +This is the **first numbered release** line for the desktop Workshop client: Mod Store, author tools, Mod Manager, and Steam publish flows for **Data Center** (Steam App ID `4170200`). + +## Download + +Releases are published on **GitHub** from the [`gregtools-modmanager-release`](https://github.com/mleem97/gregFramework/blob/main/.github/workflows/gregtools-modmanager-release.yml) workflow. + +| What | Where | +|------|--------| +| **Latest release** | [github.com/mleem97/gregFramework/releases/latest](https://github.com/mleem97/gregFramework/releases/latest) | +| **1.0.0 assets** | Look for tag **`gregtools-modmanager-v1.0.0`** and the ZIP **`Gregtools-Modmanager-1.0.0-win10-x64.zip`** (best-compression portable folder). | + +:::tip Creating the GitHub release + +Push tag **`gregtools-modmanager-v1.0.0`** on `main` (or run the workflow manually with that tag) so CI builds and attaches the ZIP. + +::: + +## Install + +1. Download **`Gregtools-Modmanager-1.0.0-win10-x64.zip`** from the release. +2. Extract to a folder of your choice (or next to the game — see [Workshop uploader](/wiki/tools/workshop-uploader)). +3. Run **`WorkshopUploader.exe`**. **Steam** must be installed; the app uses the Steamworks API for Workshop. + +## Documentation + +- [Workshop uploader (full guide)](/wiki/tools/workshop-uploader) +- [End-user Workshop guide](/wiki/guides/enduser-workshop) +- Open-source and third-party components: [`WorkshopUploader/EXTERNAL_DEPENDENCIES.md`](https://github.com/mleem97/gregFramework/blob/main/WorkshopUploader/EXTERNAL_DEPENDENCIES.md) in the repository + +## Scope of 1.0 + +Initial **1.0** marks a stable baseline for the MAUI Windows app (self-contained publish, trimmed Release builds, localization, Mod Store / Mod Manager / editor flows). Patch and feature releases will use **1.0.x** / **1.x** as versioning on the [application version](/wiki/tools/workshop-uploader) in the project file. diff --git a/roadmap/mod-store-stages.md b/roadmap/mod-store-stages.md new file mode 100644 index 0000000..abd3bab --- /dev/null +++ b/roadmap/mod-store-stages.md @@ -0,0 +1,11 @@ +--- +id: mod-store-stages +title: Mod Store Stages +slug: /roadmap/mod-store-stages +--- + +This page is kept for legacy links. + +Use the canonical roadmap page: + +- [Unified Roadmap](/wiki/roadmap/unified-roadmap) diff --git a/roadmap/unified-roadmap.md b/roadmap/unified-roadmap.md new file mode 100644 index 0000000..e4a86b9 --- /dev/null +++ b/roadmap/unified-roadmap.md @@ -0,0 +1,59 @@ +--- +id: unified-roadmap +title: Unified Roadmap +slug: /roadmap/unified-roadmap +--- + +This is the canonical roadmap page for the project. It consolidates previous roadmap documents and removes duplicate planning tracks. + +## Status Summary + +- **Framework Runtime**: active +- **Docs & Contributor Tooling**: active +- **Mod Distribution & Audit Pipeline**: active planning +- **Multiplayer (Steamworks)**: blocked externally + +## Important Multiplayer Note + +Multiplayer was planned around **Steamworks P2P** and that direction remains conceptually valid. +However, it is **currently not implementable in production** because the game developer has not integrated Steamworks support in the game runtime/API surface required for a stable implementation. + +## Consolidated Workstreams + +### 1) Framework & Hooking + +- Stabilize hook coverage and event contracts. +- Keep C# and Rust bridge compatibility versioned. +- Expand diagnostics for mod-runtime compatibility failures. + +### 2) Documentation & Information Architecture + +- Keep `/wiki/*` as canonical docs namespace. +- Maintain separated Plugin Wiki and Mod Wiki sections. +- Remove duplicate docs by keeping one canonical page per topic. + +### 3) Mod/Plugin Catalog & Distribution + +- Maintain dynamic `/mods` catalog with links to wiki and release endpoints. +- Keep release metadata visible (version, author, dependencies, language). +- Keep release-state gating (`NotReleasedYet`) explicit for users. + +### 4) Security Audit & Submission Workflow + +- Accept plugin submissions via Git repository URL. +- Run automated static checks and suspicious-pattern scans. +- Gate publication/release visibility on successful audit outcome. + +### 5) Multiplayer Track (Blocked) + +- Keep architecture docs for future Steamworks integration readiness. +- Track dependencies on game-side Steamworks implementation. +- Re-open implementation only when game runtime exposes required primitives. + +## Legacy Roadmap Documents + +The following pages are now legacy references and should not be used as primary planning sources: + +- `wiki-import/ROADMAP` +- `wiki-import/Steamworks-P2P-Multiplayer-Roadmap` +- `roadmap/mod-store-stages` diff --git a/tools/Steam-Workshop-and-Tooling.md b/tools/Steam-Workshop-and-Tooling.md new file mode 100644 index 0000000..a6a401d --- /dev/null +++ b/tools/Steam-Workshop-and-Tooling.md @@ -0,0 +1,39 @@ +# Steam Workshop and tooling + +## Live-Sync references + +After a *Data Center* update, run the game once so MelonLoader regenerates interop assemblies, then from the repo root: + +```bash +python tools/refresh_refs.py +``` + +Optionally save a baseline for diffs: + +```bash +python tools/diff_assembly_metadata.py --save-snapshot +``` + +After future updates: + +```bash +python tools/diff_assembly_metadata.py +``` + +Do **not** commit `*.dll` from `lib/references/` (see `.gitignore`). + +## Steam Workshop (research) + +Official upload and item layout for *Data Center* Workshop content may be undocumented by the developer. Until documented: + +- Treat Workshop delivery as **game-defined** (often content under game data / `StreamingAssets`; MelonLoader mods remain **DLLs in `Mods/`**). +- The **WorkshopUploader** desktop app (see `WorkshopUploader/`) is the supported path for authors to manage Workshop items and DevServer betas once Steamworks is configured. + +## Legal + +Do not redistribute game binaries or extracted assets. Workshop packages should contain **your** content only. + +## CI / agents + +- `FrikaMF.csproj` builds on Windows agents that have either a Steam *Data Center* install **or** a populated `lib/references/MelonLoader/` (from `refresh_refs.py`). +- `WorkshopUploader` targets `net6.0-windows`; build it on Windows (not Linux-hosted runners unless cross-compilation is configured). diff --git a/topics/assets-and-export/overview.md b/topics/assets-and-export/overview.md new file mode 100644 index 0000000..2dc60b3 --- /dev/null +++ b/topics/assets-and-export/overview.md @@ -0,0 +1,11 @@ +--- +title: Assets & export +sidebar_label: Assets & export (hub) +description: Asset export plugin, templates, and related wiki-import pages. +--- + +# Assets & export + +- Wiki: [FFM.Plugin.AssetExporter](/wiki/mods/plugins/ffm-plugin-asset-exporter) +- Release: [FFM.Plugin.AssetExporter release](/wiki/releases/plugins/ffm-plugin-asset-exporter-release) +- Imported: [AssetExport](/wiki/wiki-import/AssetExport), [Release assets and templates](/wiki/wiki-import/Release-Assets-and-Templates) diff --git a/topics/audiences/overview.md b/topics/audiences/overview.md new file mode 100644 index 0000000..45de6d9 --- /dev/null +++ b/topics/audiences/overview.md @@ -0,0 +1,29 @@ +--- +title: By audience +sidebar_label: By audience +description: Vier Rollen — Spieler, Moddevs, Contributor, Sponsoren — plus Erfahrungsstufen (Newbies bis Pros). +--- + +# By audience + +Die Dokumentation richtet sich an **vier Hauptrollen** (und an Erfahrungsstufen darunter). Wähle, was zu dir passt — die Sprache der meisten Seiten ist **Englisch**, mit deutschsprachigen Importen unter `wiki-import/` wo vorhanden. + +## Die vier Rollen + +| Rolle | Für wen? | Einstieg | +|--------|----------|----------| +| **Spieler** (End users) | Installation, Mods nutzen, Troubleshooting, FAQ | [End users (hub)](/wiki/topics/end-user/overview) → [End user wiki](/wiki/wiki-import/EndUser/), [Data center FAQ](/wiki/wiki-import/DataCenterFAQ/) | +| **Mod-Entwickler** (Mod developers) | Mods bauen, Hooks, Konfiguration, Debug | [Mod developers (hub)](/wiki/topics/mod-developers/overview) → [ModDevs wiki](/wiki/wiki-import/ModDevs/), [Framework](/wiki/mods/framework) | +| **Contributor** (Repo & Framework) | PRs, Doku, Plugins, CI, Design | [Contributors (workflow)](/wiki/topics/contributors/overview) → [Contributors wiki](/wiki/wiki-import/Contributors/), [Repo inventory](/wiki/contributors/repo-inventory) | +| **Sponsorinnen & Sponsoren** | Unterstützung, Transparenz, rechtlicher Kontext | [Sponsors (hub)](/wiki/topics/sponsors/overview) → [Sponsors (EN)](/wiki/wiki-import/Sponsors), [Sponsoren (DE)](/wiki/wiki-import/Sponsoren) | + +## Erfahrungsstufen (alle Rollen) + +- [Newbies](/wiki/audiences/newbies) — erste Schritte, Begriffe, sichere Defaults. +- [Intermediates](/wiki/audiences/intermediates) — Workflows, Tooling, typische Stolpersteine. +- [Professionals](/wiki/audiences/professionals) — Architektur, FFI, Performance, Release-Kanäle. + +## Thematische Übersicht + +- [Topics hub](/wiki/topics/) — Security, Multiplayer, Assets, FFI, Roadmap, Meta. +- Importierte Legacy-Guides: [Legacy wiki import](/wiki/topics/wiki-import/overview). diff --git a/topics/contributors/overview.md b/topics/contributors/overview.md new file mode 100644 index 0000000..9d37d06 --- /dev/null +++ b/topics/contributors/overview.md @@ -0,0 +1,19 @@ +--- +title: Contributors (workflow) +sidebar_label: Contributors (workflow) +description: Monorepo layout, design system, Docusaurus workflow, plugin audits. +--- + +# Contributors (workflow) + +**Mitwirkende am Repository** — Framework, Website, CI, Plugins. Überblick über alle Rollen (inkl. Spieler, Moddevs, Sponsoren): [By audience](/wiki/topics/audiences/overview). + +Operational docs for people changing the framework, site, or release pipeline. + +- [Repository inventory](/wiki/contributors/repo-inventory) — current layout snapshot. +- [Monorepo target layout](/wiki/contributors/monorepo-target-layout) — intended structure. +- [Luminescent design system](/wiki/contributors/luminescent-design-system) — UI tokens for the site. +- [Docusaurus workflow](/wiki/contributors/docusaurus-workflow) — edit/build the wiki site. +- [Plugin submission audit](/wiki/contributors/plugin-submission-audit) — checklist for new plugins. + +Imported guides: [Contribution workflow](/wiki/wiki-import/Contributors/Guides/Contribution-Workflow). diff --git a/topics/end-user/overview.md b/topics/end-user/overview.md new file mode 100644 index 0000000..987c269 --- /dev/null +++ b/topics/end-user/overview.md @@ -0,0 +1,13 @@ +--- +title: End users +sidebar_label: End users (hub) +description: FAQs, install paths, troubleshooting — mostly wiki-import. +--- + +# End users + +**Spielerinnen und Spieler** — Mods installieren und spielen, ohne am Framework mitzuentwickeln. Überblick über alle Rollen: [By audience](/wiki/topics/audiences/overview). + +- [By audience — newbies](/wiki/audiences/newbies) +- Imported: [End user index](/wiki/wiki-import/EndUser/), [Data center FAQ](/wiki/wiki-import/DataCenterFAQ/), [Known incompatibilities](/wiki/wiki-import/Known-Incompatibilities) +- Imported: [End user release notes](/wiki/wiki-import/EndUser/End-User-Release) diff --git a/topics/ffi-and-hooks/overview.md b/topics/ffi-and-hooks/overview.md new file mode 100644 index 0000000..ff6d9e1 --- /dev/null +++ b/topics/ffi-and-hooks/overview.md @@ -0,0 +1,13 @@ +--- +title: FFI, hooks & Lua +sidebar_label: FFI, hooks & Lua (hub) +description: FFI, hook lists, naming — bridge between framework and legacy wiki. +--- + +# FFI, hooks & Lua + +- [FMF hooks catalog](/wiki/reference/fmf-hooks-catalog) (generated) +- [FMF hook naming](/wiki/reference/fmf-hook-naming) +- Imported: [HOOKS](/wiki/wiki-import/HOOKS), [Hook naming convention](/wiki/wiki-import/HOOK-NAMING-CONVENTION) +- Imported: [FFI bridge reference](/wiki/wiki-import/FFI-Bridge-Reference), [Lua FFI start](/wiki/wiki-import/Lua-FFI-Start-Developing) +- Imported: [Mod developer debug](/wiki/wiki-import/Mod-Developer-Debug) diff --git a/topics/index.md b/topics/index.md new file mode 100644 index 0000000..484a02c --- /dev/null +++ b/topics/index.md @@ -0,0 +1,37 @@ +--- +title: Topics hub +sidebar_label: Topics overview +description: Thematic index — navigate by audience, reference, roadmap, imports, and meta. +--- + +# Topics hub + +Documentation is split into **curated wiki pages** (this site), **generated reference** (for example hook catalogs), and **legacy imports** from the GitHub wiki (`.wiki` → `wiki-import/`). + +## Quick map + +| Area | Start here | +|------|------------| +| **Roles (Spieler · Moddevs · Contributor · Sponsoren)** | [By audience](/wiki/topics/audiences/overview) — [End users](/wiki/topics/end-user/overview), [Mod developers](/wiki/topics/mod-developers/overview), [Contributors (workflow)](/wiki/topics/contributors/overview), [Sponsors](/wiki/topics/sponsors/overview) | +| **Audience paths (experience)** | [Newbies](/wiki/audiences/newbies) · [Intermediates](/wiki/audiences/intermediates) · [Professionals](/wiki/audiences/professionals) | +| **Technical reference** | [Reference & technical](/wiki/topics/reference/overview) | +| **Ship planning** | [Roadmap & planning](/wiki/topics/roadmap/overview) | +| **Repository inventory** | [Repo inventory](/wiki/contributors/repo-inventory) | +| **Imported legacy wiki** | [Legacy wiki import](/wiki/topics/wiki-import/overview) | +| **Steam, betas, backlog, game paths** | [Meta & operations](/wiki/topics/meta/overview) — [Game folder layout](/wiki/topics/meta/game-folder-layout) | + +## Thematic folders (deep links) + +Use these entry points for cross-cutting concerns; each page links into `wiki-import/` and reference docs where relevant. + +- [Security & legal](/wiki/topics/security-legal/overview) — licenses, disclaimers, letters to the developer. +- [FFI, hooks & Lua](/wiki/topics/ffi-and-hooks/overview) — HOOKS, FFI bridge, naming conventions. +- [Multiplayer & networking](/wiki/topics/multiplayer-and-networking/overview) — Steamworks P2P, Web UI bridge. +- [Assets & export](/wiki/topics/assets-and-export/overview) — asset export pipeline, templates. +- [End users](/wiki/topics/end-user/overview) — installs, FAQs, troubleshooting. +- [Mod developers](/wiki/topics/mod-developers/overview) — getting started, mod config, debugging. + +## Releases vs. articles + +- **Release pages** (downloads, version banners): [Releases](/wiki/releases/). +- **Narrative wiki articles** (how it works): [Plugin Wiki](/wiki/mods/plugins/) and [Mod Wiki](/wiki/mods/mods/). diff --git a/topics/meta/game-folder-layout.md b/topics/meta/game-folder-layout.md new file mode 100644 index 0000000..2ad65eb --- /dev/null +++ b/topics/meta/game-folder-layout.md @@ -0,0 +1,62 @@ +--- +title: Game folder layout (FMF / MelonLoader) +sidebar_label: Game folder layout +description: Canonical paths for mod configs, FMF plugins, and MelonLoader mods under the Data Center game root. +--- + +# Game folder layout (FMF / MelonLoader) + +This page is the **single reference** for where mod-related files live next to the game executable (`{GameRoot}`). MelonLoader sets `{GameRoot}/UserData` via `MelonEnvironment.UserDataDirectory`, `{GameRoot}/Mods` for **MelonMods**, and `{GameRoot}/Plugins` for **MelonPlugins** (e.g. `FMF.ModPathRedirector.dll`). + +## Summary + +| Inhalt | Pfad | Format / Hinweis | +|--------|------|------------------| +| **Mod-Konfiguration & Sidecars** | `{GameRoot}/UserData/ModCfg/` | **JSON** für Konfigurationsdateien; weitere Sidecar-Dateien (z. B. `custom_employees_hired.txt`) liegen ebenfalls hier, damit alles Mod-Bezogene an einem Ort liegt. | +| **FMF Framework-Plugins** (FFM.Plugin.*) | `{GameRoot}/FMF/Plugins/` | DLLs; **MelonLoader** lädt standardmäßig nur `{GameRoot}/Mods` — siehe unten. | +| **Plugins** (MelonLoader, z. B. ModPathRedirector) | `{GameRoot}/Plugins/` | MelonLoader `Plugins`-Ordner — nur **MelonPlugin**-DLLs. | +| **Mods** (MelonLoader, z. B. FMF.Mod.*) | `{GameRoot}/Mods/` | MelonLoader `Mods`-Ordner — **MelonMod**-DLLs. | + +## UserData/ModCfg + +- Alle **mod-relevanten** Konfigurationen und JSON-Sidecars werden unter **`UserData/ModCfg`** geführt. +- Beim ersten Start werden fehlende Dateien angelegt; bei bestehenden Installationen werden ältere Dateien aus **`UserData/`** (Root) nach **`ModCfg/`** übernommen, sofern noch vorhanden. +- Beispiele: `multiplayer-sync.config.json`, `pluginsync.config.json`. +- Framework-Metadaten (z. B. Save-Compat-Stamp) liegen unter **`UserData/ModCfg/FrikaFM/`** (Migration von `UserData/FrikaFM`). + +## FMF/Plugins und MelonLoader + +**FFM-Plugin-DLLs** liegen kanonisch unter **`{GameRoot}/FMF/Plugins`**. MelonLoader enumeriert **standardmäßig** nur **`Mods/`**. Praktische Optionen: + +1. **DLLs zusätzlich** (oder verlinkt) **`Mods/`** ablegen — üblicher Weg für automatisches Laden. +2. **Unterordner** von `Mods` nutzen, falls eure MelonLoader-Version Mods in Unterverzeichnissen lädt (Version je nach Release prüfen). +3. **PluginSync**-Downloads des Frameworks landen unter **`FMF/Plugins/PluginSync/...`**. + +## Mods (FMF-basiert) + +Normale **MelonLoader-Mods** (einschließlich FMF-Mods) werden wie gewohnt in **`{GameRoot}/Mods/`** installiert. + +## Steam Workshop (Spiel) vs. MelonLoader + +Das Spiel legt abonnierte Workshop-Inhalte unter **`{GameRoot}/{ExeName}_Data/StreamingAssets/mods/workshop_/WorkshopUploadContent`** ab (nativer `ModLoader`, nicht MelonLoader). + +- **MelonLoader** durchsucht **`{GameRoot}/Mods`** (inkl. Unterordner, je nach Einstellung), **nicht** beliebige Pfade über `Loader.cfg`. +- **UserData:** MelonLoader-Konfiguration liegt unter **`{GameRoot}/UserData/`** (z. B. **`MelonLoader.cfg`** / je nach Version **`UserData/MelonLoader/Loader.cfg`** — bei Install prüfen). Relevant für Unterordner-Laden: **`disable_subfolder_load = false`**, optional **`disable_subfolder_manifest = true`**. +- **Workshop-DLLs in den Melon-Scan einbinden:** Junction (oder Symlink) von einem Ordner unter **`Mods/`** auf den **`WorkshopUploadContent`**-Pfad desselben Items, z. B. (PowerShell, Pfade anpassen): + +```powershell +$game = "C:\Path\To\Data Center" +$id = "12345678901234567" +$target = Join-Path $game "Data Center_Data\StreamingAssets\mods\workshop_$id\WorkshopUploadContent" +$link = Join-Path $game "Mods\workshop_$id" +cmd /c mklink /J "$link" "$target" +``` + +Ohne Junction müssen MelonMods weiter physisch unter **`Mods/`** liegen oder über eure Verteilung dort landen. + +**WorkshopUploader-Vorlagen (modded):** Unter **`content/`** werden **`Mods/`**, **`Plugins/`** und ein **`ModFramework/`**-Baum angelegt — **`ModFramework/FMF/Plugins`** entspricht dabei **`{GameRoot}/FMF/Plugins`**, wenn ihr **`FMF`** per Junction auf **`…/WorkshopUploadContent/ModFramework/FMF`** zeigen lasst. Weitere Framework-Dateien (Konfiguration, Assets) können unter **`ModFramework/`** gebündelt werden. + +## Siehe auch + +- [Meta & operations](/wiki/topics/meta/overview) +- [Legacy: Mod Config System](/wiki/wiki-import/Mod-Config-System) (API-Contract; Pfade auf **ModCfg** beziehen) diff --git a/topics/meta/overview.md b/topics/meta/overview.md new file mode 100644 index 0000000..93e3b48 --- /dev/null +++ b/topics/meta/overview.md @@ -0,0 +1,14 @@ +--- +title: Meta & operations +sidebar_label: Meta & operations +description: Workshop tooling, devserver betas, idea backlog — repo-level notes. +--- + +# Meta & operations + +These pages are **not** end-user game docs; they describe how we ship and plan around the project. + +- [Game folder layout (FMF / MelonLoader)](/wiki/topics/meta/game-folder-layout) — `UserData/ModCfg`, `FMF/Plugins`, `Mods`. +- [Steam Workshop and tooling](/wiki/meta/Steam-Workshop-and-Tooling) — uploader, references workflow. +- [Devserver betas](/wiki/meta/devserver-betas) — beta channel notes. +- [IDEA backlog](/wiki/meta/IDEA_BACKLOG) — unstructured idea list (also used by automation). diff --git a/topics/mod-developers/overview.md b/topics/mod-developers/overview.md new file mode 100644 index 0000000..4c9b8ea --- /dev/null +++ b/topics/mod-developers/overview.md @@ -0,0 +1,14 @@ +--- +title: Mod developers +sidebar_label: Mod developers (hub) +description: Getting started, mod config, debugging — links into wiki-import ModDevs tree. +--- + +# Mod developers + +**Mod-Autorinnen und -Autoren** — eigene Mods bauen (Hooks, Konfiguration, Debug). Überblick über alle Rollen: [By audience](/wiki/topics/audiences/overview). + +- [By audience — intermediates / professionals](/wiki/audiences/intermediates) and [professionals](/wiki/audiences/professionals) +- Wiki: [Framework overview](/wiki/mods/framework) +- Imported: [ModDevs](/wiki/wiki-import/ModDevs/), [Modding guide](/wiki/wiki-import/Modding-Guide), [Mod config system](/wiki/wiki-import/Mod-Config-System) +- Imported: [Standalone mods](/wiki/wiki-import/StandaloneMods) diff --git a/topics/multiplayer-and-networking/overview.md b/topics/multiplayer-and-networking/overview.md new file mode 100644 index 0000000..1be0771 --- /dev/null +++ b/topics/multiplayer-and-networking/overview.md @@ -0,0 +1,12 @@ +--- +title: Multiplayer & networking +sidebar_label: Multiplayer & networking (hub) +description: P2P roadmap, Web UI bridge, multiplayer plugin — entry points. +--- + +# Multiplayer & networking + +- Wiki: [FFM.Plugin.Multiplayer](/wiki/mods/plugins/ffm-plugin-multiplayer) +- Release: [FFM.Plugin.Multiplayer release](/wiki/releases/plugins/ffm-plugin-multiplayer-release) +- Imported: [Steamworks P2P multiplayer roadmap](/wiki/wiki-import/Steamworks-P2P-Multiplayer-Roadmap) +- Imported: [Web UI bridge](/wiki/wiki-import/Web-UI-Bridge) diff --git a/topics/reference/overview.md b/topics/reference/overview.md new file mode 100644 index 0000000..43391e3 --- /dev/null +++ b/topics/reference/overview.md @@ -0,0 +1,17 @@ +--- +title: Reference & technical +sidebar_label: Reference & technical +description: Mapping tables, hook naming, generated catalogs, release channels. +--- + +# Reference & technical + +Authoritative reference material for the framework and documentation site. + +- [Wiki mapping](/wiki/reference/wiki-mapping) — how paths line up across systems. +- [Mod store vision](/wiki/reference/mod-store-vision) — product direction notes. +- [FMF hook naming](/wiki/reference/fmf-hook-naming) — conventions for hook identifiers. +- [FMF hooks catalog](/wiki/reference/fmf-hooks-catalog) — generated listing from framework sources. +- [Release channels](/wiki/reference/release-channels) — how builds are staged. + +See also [FFI, hooks & Lua](/wiki/topics/ffi-and-hooks/overview) for imported deep dives from the legacy wiki. diff --git a/topics/roadmap/overview.md b/topics/roadmap/overview.md new file mode 100644 index 0000000..43531f0 --- /dev/null +++ b/topics/roadmap/overview.md @@ -0,0 +1,12 @@ +--- +title: Roadmap & planning +sidebar_label: Roadmap & planning +description: Unified roadmap and mod-store staging notes. +--- + +# Roadmap & planning + +- [Unified roadmap](/wiki/roadmap/unified-roadmap) — cross-cutting priorities. +- [Mod store stages](/wiki/roadmap/mod-store-stages) — staged rollout concepts. + +Imported context: [ROADMAP](/wiki/wiki-import/ROADMAP), [TASKLIST](/wiki/wiki-import/TASKLIST), [Repository status](/wiki/wiki-import/Repository-Status-2026-04-04). diff --git a/topics/security-legal/overview.md b/topics/security-legal/overview.md new file mode 100644 index 0000000..e8b2828 --- /dev/null +++ b/topics/security-legal/overview.md @@ -0,0 +1,16 @@ +--- +title: Security & legal +sidebar_label: Security & legal (hub) +description: Licenses, disclaimers, developer correspondence — links into wiki-import. +--- + +# Security & legal + +Curated links into imported pages (canonical text may live under `wiki-import/`). + +- [License / legal (EN)](/wiki/wiki-import/License-Legal) +- [Lizenz / Rechtliches (DE)](/wiki/wiki-import/Lizenz-Rechtliches) +- [Disclaimer (End user)](/wiki/wiki-import/EndUser/Reference/Disclaimer) +- [Brief an WASEKU](/wiki/wiki-import/Brief-an-WASEKU) / [Letter to WASEKU (EN)](/wiki/wiki-import/Letter-to-WASEKU) + +For repository licensing, see the root `LICENSE.txt` in the GitHub repo. diff --git a/topics/sponsors/overview.md b/topics/sponsors/overview.md new file mode 100644 index 0000000..5cd57d5 --- /dev/null +++ b/topics/sponsors/overview.md @@ -0,0 +1,24 @@ +--- +title: Sponsors & support +sidebar_label: Sponsors (hub) +description: Für Unterstützerinnen und Unterstützer — Sponsoring, Transparenz, englische Detailseiten. +--- + +# Sponsors & support + +Die Community finanziert u. a. Infrastruktur, Tools und Zeit für Pflege der Doku und des Frameworks. Hier startest du als **potenzielle Sponsorin oder Sponsor** (oder als Spielerin, die nur informieren möchte, wohin Unterstützung fließt). + +## Kurzüberblick + +- **Englisch (ausführlich):** [Sponsors (EN)](/wiki/wiki-import/Sponsors) — Optionen (z. B. GitHub Sponsors), Nutzung von Mitteln, rechtlicher Kontext. +- **Deutsch:** [Sponsoren](/wiki/wiki-import/Sponsoren) — gleiche Themen, wo vorhanden auf Deutsch. +- **Dank:** [Community Thanks](/wiki/wiki-import/Community-Thanks) (Import), [Changelog & versions](/wiki/wiki-import/Changelog-Versions) für Release-Transparenz. + +## Verknüpft + +- [Security & legal](/wiki/topics/security-legal/overview) — Lizenz, Haftungsausschlüsse, Brief an die Entwickler. +- [License & legal (EN)](/wiki/wiki-import/License-Legal) — rechtlicher Rahmen des Projekts. + +:::note Zielgruppe +Diese Seite richtet sich an **Sponsorinnen, Sponsoren und Fördernde**. Spielerinnen und Spieler finden den Einstieg unter [End users](/wiki/topics/end-user/overview); Mod-Autoren unter [Mod developers](/wiki/topics/mod-developers/overview); Mitwirkende am Repo unter [Contributors (workflow)](/wiki/topics/contributors/overview). +::: diff --git a/topics/wiki-import/overview.md b/topics/wiki-import/overview.md new file mode 100644 index 0000000..a8f9b8a --- /dev/null +++ b/topics/wiki-import/overview.md @@ -0,0 +1,52 @@ +--- +title: Legacy wiki import +sidebar_label: Legacy wiki import +description: How GitHub Wiki content is mirrored into docs/wiki-import, sorted in the sidebar, and kept in sync with the repo. +--- + +# Legacy wiki import + +All material under **`docs/wiki-import/`** is part of the **GitHub Wiki mirror**: it is meant to track the wiki that lives alongside the repository, while the rest of **`docs/`** holds **curated** pages (topics, mods, reference). + +For a **map of the whole `docs/` tree**, see **[Documentation layout (`docs/`)](../../README.md)**. + +## Why this exists + +- **Search & versioning**: Wiki text is in Git, reviewable in PRs, and indexed by the site. +- **i18n**: Paired `Page.md` (DE) + `Page-en.md` (EN) are split by `wiki:normalize-i18n` into the default locale and `wiki/i18n/de/...`. +- **Sorting**: Audience trees (`EndUser/`, `ModDevs/`, `Contributors/`, `TechnicalReference/`, `DataCenterFAQ/`) use `_category_.json` **positions** so the sidebar order matches intent, not only A–Z. Root **`Home`** uses `sidebar_position: 1` so it appears first among loose pages. + +## Keep the mirror up to date + +1. Clone or pull the wiki repo into **`.wiki/`** at the **repository root** (same level as `docs/`): + + ```bash + git clone https://github.com//.wiki.git .wiki + ``` + +2. From **`wiki/`** (the Docusaurus app): + + ```bash + npm run wiki:refresh + ``` + + This runs **`wiki:sync`** (copy `.wiki` → `docs/wiki-import/`) and then **`wiki:normalize-i18n`**. If `.wiki` is missing, `wiki:sync` exits with an error; run `wiki:normalize-i18n` alone only when you are fixing splits without pulling the wiki. + +3. Commit changes under **`docs/wiki-import/`** and **`wiki/i18n/de/...`** as needed, then open a PR. + +## Editorial policy (recommended) + +| Goal | Action | +|------|--------| +| **Short-term fix** on the live site | Edit files under `docs/wiki-import/` (and DE mirror if applicable). Optionally backport to `.wiki` so the next sync does not overwrite you. | +| **Canonical, long-term doc** | Add or move content into **`docs/topics/`**, **`docs/reference/`**, or **`docs/mods/`**, and link from the legacy page. | +| **Duplicate path** | The folder **`Contirbutors/`** is a typo duplicate of **`Contributors/`**; prefer **`Contributors/`** for new links. | + +## Entry points (English default locale) + +- [Home](/wiki/wiki-import/Home) — audience hub. +- [End users](/wiki/wiki-import/EndUser/) · [Mod developers](/wiki/wiki-import/ModDevs/) · [Contributors](/wiki/wiki-import/Contributors/) +- [Technical reference](/wiki/wiki-import/TechnicalReference/) · [Data Center FAQ](/wiki/wiki-import/DataCenterFAQ/) +- [HOOKS](/wiki/wiki-import/HOOKS) · [FFI bridge reference](/wiki/wiki-import/FFI-Bridge-Reference) + +The sidebar **Topics → Legacy wiki import** lists the **full** tree (autogenerated), not only these links. diff --git a/wiki-import/AI-USAGE.md b/wiki-import/AI-USAGE.md new file mode 100644 index 0000000..b4ab02e --- /dev/null +++ b/wiki-import/AI-USAGE.md @@ -0,0 +1,9 @@ +--- +title: AI-USAGE +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/Architecture.md b/wiki-import/Architecture.md new file mode 100644 index 0000000..cda72c2 --- /dev/null +++ b/wiki-import/Architecture.md @@ -0,0 +1,9 @@ +--- +title: Architecture +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/AssetExport.md b/wiki-import/AssetExport.md new file mode 100644 index 0000000..3b143c3 --- /dev/null +++ b/wiki-import/AssetExport.md @@ -0,0 +1,9 @@ +--- +title: AssetExport +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/Bekannte-Inkompatibilitaeten.md b/wiki-import/Bekannte-Inkompatibilitaeten.md new file mode 100644 index 0000000..79850da --- /dev/null +++ b/wiki-import/Bekannte-Inkompatibilitaeten.md @@ -0,0 +1,9 @@ +--- +title: Bekannte Inkompatibilitäten +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/Brief-an-WASEKU.md b/wiki-import/Brief-an-WASEKU.md new file mode 100644 index 0000000..718ac28 --- /dev/null +++ b/wiki-import/Brief-an-WASEKU.md @@ -0,0 +1,9 @@ +--- +title: Brief an WASEKU (Data Center) +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/Changelog-Versionen.md b/wiki-import/Changelog-Versionen.md new file mode 100644 index 0000000..f82a1e6 --- /dev/null +++ b/wiki-import/Changelog-Versionen.md @@ -0,0 +1,9 @@ +--- +title: Changelog & Versionen +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/Changelog-Versions.md b/wiki-import/Changelog-Versions.md new file mode 100644 index 0000000..e1a423e --- /dev/null +++ b/wiki-import/Changelog-Versions.md @@ -0,0 +1,9 @@ +--- +title: Changelog & Versions EN +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/Community-Thanks.md b/wiki-import/Community-Thanks.md new file mode 100644 index 0000000..e3b5a0f --- /dev/null +++ b/wiki-import/Community-Thanks.md @@ -0,0 +1,9 @@ +--- +title: Community Thanks +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/Contirbutors/Contributors-Debug.md b/wiki-import/Contirbutors/Contributors-Debug.md new file mode 100644 index 0000000..4b259e0 --- /dev/null +++ b/wiki-import/Contirbutors/Contributors-Debug.md @@ -0,0 +1,9 @@ +--- +title: Contributors (Debug) EN +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/Contirbutors/_category_.json b/wiki-import/Contirbutors/_category_.json new file mode 100644 index 0000000..f1f28cb --- /dev/null +++ b/wiki-import/Contirbutors/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Contributors (typo path — prefer Contributors/)", + "position": 60, + "key": "wiki-import-root-contributors-typo" +} diff --git a/wiki-import/Contributors-Debug.md b/wiki-import/Contributors-Debug.md new file mode 100644 index 0000000..af241ea --- /dev/null +++ b/wiki-import/Contributors-Debug.md @@ -0,0 +1,9 @@ +--- +title: Contributors-Debug +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/Contributors/Contributors-Debug.md b/wiki-import/Contributors/Contributors-Debug.md new file mode 100644 index 0000000..4b259e0 --- /dev/null +++ b/wiki-import/Contributors/Contributors-Debug.md @@ -0,0 +1,9 @@ +--- +title: Contributors (Debug) EN +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/Contributors/Guides/Contribution-Workflow.md b/wiki-import/Contributors/Guides/Contribution-Workflow.md new file mode 100644 index 0000000..eb19421 --- /dev/null +++ b/wiki-import/Contributors/Guides/Contribution-Workflow.md @@ -0,0 +1,9 @@ +--- +title: Contribution-Workflow +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/Contributors/Guides/Index.md b/wiki-import/Contributors/Guides/Index.md new file mode 100644 index 0000000..5466304 --- /dev/null +++ b/wiki-import/Contributors/Guides/Index.md @@ -0,0 +1,9 @@ +--- +title: Index +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/Contributors/Guides/_category_.json b/wiki-import/Contributors/Guides/_category_.json new file mode 100644 index 0000000..b2d26ee --- /dev/null +++ b/wiki-import/Contributors/Guides/_category_.json @@ -0,0 +1,3 @@ +{ + "key": "wiki-import-contributors-guides" +} diff --git a/wiki-import/Contributors/Index.md b/wiki-import/Contributors/Index.md new file mode 100644 index 0000000..5466304 --- /dev/null +++ b/wiki-import/Contributors/Index.md @@ -0,0 +1,9 @@ +--- +title: Index +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/Contributors/Reference/Index.md b/wiki-import/Contributors/Reference/Index.md new file mode 100644 index 0000000..5466304 --- /dev/null +++ b/wiki-import/Contributors/Reference/Index.md @@ -0,0 +1,9 @@ +--- +title: Index +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/Contributors/Reference/Naming-Convention.md b/wiki-import/Contributors/Reference/Naming-Convention.md new file mode 100644 index 0000000..4e82ef8 --- /dev/null +++ b/wiki-import/Contributors/Reference/Naming-Convention.md @@ -0,0 +1,9 @@ +--- +title: Naming-Convention +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/Contributors/Reference/_category_.json b/wiki-import/Contributors/Reference/_category_.json new file mode 100644 index 0000000..1c22f38 --- /dev/null +++ b/wiki-import/Contributors/Reference/_category_.json @@ -0,0 +1,3 @@ +{ + "key": "wiki-import-contributors-reference" +} diff --git a/wiki-import/Contributors/Troubleshooting/Index.md b/wiki-import/Contributors/Troubleshooting/Index.md new file mode 100644 index 0000000..5466304 --- /dev/null +++ b/wiki-import/Contributors/Troubleshooting/Index.md @@ -0,0 +1,9 @@ +--- +title: Index +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/Contributors/Troubleshooting/_category_.json b/wiki-import/Contributors/Troubleshooting/_category_.json new file mode 100644 index 0000000..d86d79e --- /dev/null +++ b/wiki-import/Contributors/Troubleshooting/_category_.json @@ -0,0 +1,3 @@ +{ + "key": "wiki-import-contributors-troubleshooting" +} diff --git a/wiki-import/Contributors/Troubleshooting/overview.md b/wiki-import/Contributors/Troubleshooting/overview.md new file mode 100644 index 0000000..b00d0b1 --- /dev/null +++ b/wiki-import/Contributors/Troubleshooting/overview.md @@ -0,0 +1,9 @@ +--- +title: overview +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/Contributors/_category_.json b/wiki-import/Contributors/_category_.json new file mode 100644 index 0000000..7800653 --- /dev/null +++ b/wiki-import/Contributors/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Contributors", + "position": 30, + "key": "wiki-import-root-contributors" +} diff --git a/wiki-import/DataCenterFAQ/Index.md b/wiki-import/DataCenterFAQ/Index.md new file mode 100644 index 0000000..dbe10be --- /dev/null +++ b/wiki-import/DataCenterFAQ/Index.md @@ -0,0 +1,9 @@ +--- +title: Data Center FAQ +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/DataCenterFAQ/Part-1.md b/wiki-import/DataCenterFAQ/Part-1.md new file mode 100644 index 0000000..fd0492d --- /dev/null +++ b/wiki-import/DataCenterFAQ/Part-1.md @@ -0,0 +1,9 @@ +--- +title: Frequently Asked Questions Part 1 +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/DataCenterFAQ/Part-2.md b/wiki-import/DataCenterFAQ/Part-2.md new file mode 100644 index 0000000..b365b4e --- /dev/null +++ b/wiki-import/DataCenterFAQ/Part-2.md @@ -0,0 +1,9 @@ +--- +title: Frequently Asked Questions Part 2 +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/DataCenterFAQ/Part-3.md b/wiki-import/DataCenterFAQ/Part-3.md new file mode 100644 index 0000000..1fcbac3 --- /dev/null +++ b/wiki-import/DataCenterFAQ/Part-3.md @@ -0,0 +1,9 @@ +--- +title: Frequently Asked Questions Part 3 +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/DataCenterFAQ/Patch-Panel.md b/wiki-import/DataCenterFAQ/Patch-Panel.md new file mode 100644 index 0000000..ff89c67 --- /dev/null +++ b/wiki-import/DataCenterFAQ/Patch-Panel.md @@ -0,0 +1,9 @@ +--- +title: Patch Panel +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/DataCenterFAQ/_category_.json b/wiki-import/DataCenterFAQ/_category_.json new file mode 100644 index 0000000..755e790 --- /dev/null +++ b/wiki-import/DataCenterFAQ/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Data Center FAQ", + "position": 50, + "key": "wiki-import-root-dc-faq" +} diff --git a/wiki-import/Device-Reference.md b/wiki-import/Device-Reference.md new file mode 100644 index 0000000..b466317 --- /dev/null +++ b/wiki-import/Device-Reference.md @@ -0,0 +1,9 @@ +--- +title: Device-Reference +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/End-User-Release.md b/wiki-import/End-User-Release.md new file mode 100644 index 0000000..70ba95e --- /dev/null +++ b/wiki-import/End-User-Release.md @@ -0,0 +1,9 @@ +--- +title: End-User-Release +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/EndUser/End-User-Release.md b/wiki-import/EndUser/End-User-Release.md new file mode 100644 index 0000000..f6f67d6 --- /dev/null +++ b/wiki-import/EndUser/End-User-Release.md @@ -0,0 +1,9 @@ +--- +title: End-User (Release) EN +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/EndUser/Guides/Framework-Dependency.md b/wiki-import/EndUser/Guides/Framework-Dependency.md new file mode 100644 index 0000000..e5baa85 --- /dev/null +++ b/wiki-import/EndUser/Guides/Framework-Dependency.md @@ -0,0 +1,9 @@ +--- +title: Framework-Dependency +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/EndUser/Guides/Index.md b/wiki-import/EndUser/Guides/Index.md new file mode 100644 index 0000000..5466304 --- /dev/null +++ b/wiki-import/EndUser/Guides/Index.md @@ -0,0 +1,9 @@ +--- +title: Index +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/EndUser/Guides/_category_.json b/wiki-import/EndUser/Guides/_category_.json new file mode 100644 index 0000000..9264a97 --- /dev/null +++ b/wiki-import/EndUser/Guides/_category_.json @@ -0,0 +1,3 @@ +{ + "key": "wiki-import-enduser-guides" +} diff --git a/wiki-import/EndUser/Index.md b/wiki-import/EndUser/Index.md new file mode 100644 index 0000000..5466304 --- /dev/null +++ b/wiki-import/EndUser/Index.md @@ -0,0 +1,9 @@ +--- +title: Index +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/EndUser/Reference/Disclaimer.md b/wiki-import/EndUser/Reference/Disclaimer.md new file mode 100644 index 0000000..895e3dc --- /dev/null +++ b/wiki-import/EndUser/Reference/Disclaimer.md @@ -0,0 +1,9 @@ +--- +title: Disclaimer +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/EndUser/Reference/Index.md b/wiki-import/EndUser/Reference/Index.md new file mode 100644 index 0000000..5466304 --- /dev/null +++ b/wiki-import/EndUser/Reference/Index.md @@ -0,0 +1,9 @@ +--- +title: Index +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/EndUser/Reference/_category_.json b/wiki-import/EndUser/Reference/_category_.json new file mode 100644 index 0000000..5d3cab7 --- /dev/null +++ b/wiki-import/EndUser/Reference/_category_.json @@ -0,0 +1,3 @@ +{ + "key": "wiki-import-enduser-reference" +} diff --git a/wiki-import/EndUser/Troubleshooting/FAQ.md b/wiki-import/EndUser/Troubleshooting/FAQ.md new file mode 100644 index 0000000..ebb6dbd --- /dev/null +++ b/wiki-import/EndUser/Troubleshooting/FAQ.md @@ -0,0 +1,9 @@ +--- +title: FAQ +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/EndUser/Troubleshooting/Index.md b/wiki-import/EndUser/Troubleshooting/Index.md new file mode 100644 index 0000000..5466304 --- /dev/null +++ b/wiki-import/EndUser/Troubleshooting/Index.md @@ -0,0 +1,9 @@ +--- +title: Index +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/EndUser/Troubleshooting/_category_.json b/wiki-import/EndUser/Troubleshooting/_category_.json new file mode 100644 index 0000000..9d296a4 --- /dev/null +++ b/wiki-import/EndUser/Troubleshooting/_category_.json @@ -0,0 +1,3 @@ +{ + "key": "wiki-import-enduser-troubleshooting" +} diff --git a/wiki-import/EndUser/Troubleshooting/overview.md b/wiki-import/EndUser/Troubleshooting/overview.md new file mode 100644 index 0000000..b00d0b1 --- /dev/null +++ b/wiki-import/EndUser/Troubleshooting/overview.md @@ -0,0 +1,9 @@ +--- +title: overview +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/EndUser/_category_.json b/wiki-import/EndUser/_category_.json new file mode 100644 index 0000000..cf235ff --- /dev/null +++ b/wiki-import/EndUser/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "End users", + "position": 10, + "key": "wiki-import-root-enduser" +} diff --git a/wiki-import/FFI-Bridge-Reference.md b/wiki-import/FFI-Bridge-Reference.md new file mode 100644 index 0000000..07d6f46 --- /dev/null +++ b/wiki-import/FFI-Bridge-Reference.md @@ -0,0 +1,9 @@ +--- +title: FFI-Bridge-Reference +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/Framework-Features-Use-Cases.md b/wiki-import/Framework-Features-Use-Cases.md new file mode 100644 index 0000000..bb39f29 --- /dev/null +++ b/wiki-import/Framework-Features-Use-Cases.md @@ -0,0 +1,9 @@ +--- +title: Framework-Features-Use-Cases +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/Glossar.md b/wiki-import/Glossar.md new file mode 100644 index 0000000..df1c5d0 --- /dev/null +++ b/wiki-import/Glossar.md @@ -0,0 +1,9 @@ +--- +title: Glossar +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/Glossary.md b/wiki-import/Glossary.md new file mode 100644 index 0000000..8e4ec82 --- /dev/null +++ b/wiki-import/Glossary.md @@ -0,0 +1,9 @@ +--- +title: Glossary EN +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/HOOK-NAMING-CONVENTION.md b/wiki-import/HOOK-NAMING-CONVENTION.md new file mode 100644 index 0000000..8e94da3 --- /dev/null +++ b/wiki-import/HOOK-NAMING-CONVENTION.md @@ -0,0 +1,9 @@ +--- +title: HOOK-NAMING-CONVENTION +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/HOOKS.md b/wiki-import/HOOKS.md new file mode 100644 index 0000000..b7e9394 --- /dev/null +++ b/wiki-import/HOOKS.md @@ -0,0 +1,9 @@ +--- +title: HOOKS +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/Home.md b/wiki-import/Home.md new file mode 100644 index 0000000..e44378e --- /dev/null +++ b/wiki-import/Home.md @@ -0,0 +1,9 @@ +--- +title: Home +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/Known-Incompatibilities.md b/wiki-import/Known-Incompatibilities.md new file mode 100644 index 0000000..e873994 --- /dev/null +++ b/wiki-import/Known-Incompatibilities.md @@ -0,0 +1,9 @@ +--- +title: Known Incompatibilities EN +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/Letter-to-WASEKU.md b/wiki-import/Letter-to-WASEKU.md new file mode 100644 index 0000000..83f7d21 --- /dev/null +++ b/wiki-import/Letter-to-WASEKU.md @@ -0,0 +1,9 @@ +--- +title: Letter to WASEKU EN +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/License-Legal.md b/wiki-import/License-Legal.md new file mode 100644 index 0000000..dd48157 --- /dev/null +++ b/wiki-import/License-Legal.md @@ -0,0 +1,9 @@ +--- +title: License & Legal EN +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/Lizenz-Rechtliches.md b/wiki-import/Lizenz-Rechtliches.md new file mode 100644 index 0000000..b666fe3 --- /dev/null +++ b/wiki-import/Lizenz-Rechtliches.md @@ -0,0 +1,9 @@ +--- +title: Lizenz & Rechtliches +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/Lua-FFI-Start-Developing.md b/wiki-import/Lua-FFI-Start-Developing.md new file mode 100644 index 0000000..06167e3 --- /dev/null +++ b/wiki-import/Lua-FFI-Start-Developing.md @@ -0,0 +1,9 @@ +--- +title: Lua-FFI-Start-Developing +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/MODIAPI_FINAL_STATUS.md b/wiki-import/MODIAPI_FINAL_STATUS.md new file mode 100644 index 0000000..aa32e7e --- /dev/null +++ b/wiki-import/MODIAPI_FINAL_STATUS.md @@ -0,0 +1,9 @@ +--- +title: MODIAPI_FINAL_STATUS +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/MODIAPI_INTEGRATION_SUMMARY.md b/wiki-import/MODIAPI_INTEGRATION_SUMMARY.md new file mode 100644 index 0000000..fa6ba1e --- /dev/null +++ b/wiki-import/MODIAPI_INTEGRATION_SUMMARY.md @@ -0,0 +1,9 @@ +--- +title: MODIAPI_INTEGRATION_SUMMARY +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/MelonLoader.md b/wiki-import/MelonLoader.md new file mode 100644 index 0000000..2cee812 --- /dev/null +++ b/wiki-import/MelonLoader.md @@ -0,0 +1,9 @@ +--- +title: MelonLoader +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/Mod-Config-System.md b/wiki-import/Mod-Config-System.md new file mode 100644 index 0000000..86559d7 --- /dev/null +++ b/wiki-import/Mod-Config-System.md @@ -0,0 +1,9 @@ +--- +title: Mod-Config-System +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/Mod-Developer-Debug.md b/wiki-import/Mod-Developer-Debug.md new file mode 100644 index 0000000..2121bd8 --- /dev/null +++ b/wiki-import/Mod-Developer-Debug.md @@ -0,0 +1,9 @@ +--- +title: Mod-Developer-Debug +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/ModDevs/Guides/Getting-Started.md b/wiki-import/ModDevs/Guides/Getting-Started.md new file mode 100644 index 0000000..b7a265d --- /dev/null +++ b/wiki-import/ModDevs/Guides/Getting-Started.md @@ -0,0 +1,9 @@ +--- +title: Getting-Started +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/ModDevs/Guides/Index.md b/wiki-import/ModDevs/Guides/Index.md new file mode 100644 index 0000000..5466304 --- /dev/null +++ b/wiki-import/ModDevs/Guides/Index.md @@ -0,0 +1,9 @@ +--- +title: Index +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/ModDevs/Guides/_category_.json b/wiki-import/ModDevs/Guides/_category_.json new file mode 100644 index 0000000..6061c4c --- /dev/null +++ b/wiki-import/ModDevs/Guides/_category_.json @@ -0,0 +1,3 @@ +{ + "key": "wiki-import-moddevs-guides" +} diff --git a/wiki-import/ModDevs/Index.md b/wiki-import/ModDevs/Index.md new file mode 100644 index 0000000..5466304 --- /dev/null +++ b/wiki-import/ModDevs/Index.md @@ -0,0 +1,9 @@ +--- +title: Index +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/ModDevs/Mod-Developer-Debug.md b/wiki-import/ModDevs/Mod-Developer-Debug.md new file mode 100644 index 0000000..14e4c11 --- /dev/null +++ b/wiki-import/ModDevs/Mod-Developer-Debug.md @@ -0,0 +1,9 @@ +--- +title: Mod-Developer (Debug) EN +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/ModDevs/Modding-Guide.md b/wiki-import/ModDevs/Modding-Guide.md new file mode 100644 index 0000000..ccdff77 --- /dev/null +++ b/wiki-import/ModDevs/Modding-Guide.md @@ -0,0 +1,9 @@ +--- +title: Modding-Guide +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/ModDevs/Reference/Hook-Event-Reference.md b/wiki-import/ModDevs/Reference/Hook-Event-Reference.md new file mode 100644 index 0000000..2c70c2f --- /dev/null +++ b/wiki-import/ModDevs/Reference/Hook-Event-Reference.md @@ -0,0 +1,9 @@ +--- +title: Hook-Event-Reference +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/ModDevs/Reference/Index.md b/wiki-import/ModDevs/Reference/Index.md new file mode 100644 index 0000000..5466304 --- /dev/null +++ b/wiki-import/ModDevs/Reference/Index.md @@ -0,0 +1,9 @@ +--- +title: Index +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/ModDevs/Reference/_category_.json b/wiki-import/ModDevs/Reference/_category_.json new file mode 100644 index 0000000..337f76e --- /dev/null +++ b/wiki-import/ModDevs/Reference/_category_.json @@ -0,0 +1,3 @@ +{ + "key": "wiki-import-moddevs-reference" +} diff --git a/wiki-import/ModDevs/Troubleshooting/Index.md b/wiki-import/ModDevs/Troubleshooting/Index.md new file mode 100644 index 0000000..5466304 --- /dev/null +++ b/wiki-import/ModDevs/Troubleshooting/Index.md @@ -0,0 +1,9 @@ +--- +title: Index +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/ModDevs/Troubleshooting/_category_.json b/wiki-import/ModDevs/Troubleshooting/_category_.json new file mode 100644 index 0000000..0979ace --- /dev/null +++ b/wiki-import/ModDevs/Troubleshooting/_category_.json @@ -0,0 +1,3 @@ +{ + "key": "wiki-import-moddevs-troubleshooting" +} diff --git a/wiki-import/ModDevs/Troubleshooting/overview.md b/wiki-import/ModDevs/Troubleshooting/overview.md new file mode 100644 index 0000000..b00d0b1 --- /dev/null +++ b/wiki-import/ModDevs/Troubleshooting/overview.md @@ -0,0 +1,9 @@ +--- +title: overview +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/ModDevs/_category_.json b/wiki-import/ModDevs/_category_.json new file mode 100644 index 0000000..f44538f --- /dev/null +++ b/wiki-import/ModDevs/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Mod developers", + "position": 20, + "key": "wiki-import-root-moddevs" +} diff --git a/wiki-import/Modding-Guide.md b/wiki-import/Modding-Guide.md new file mode 100644 index 0000000..ccdff77 --- /dev/null +++ b/wiki-import/Modding-Guide.md @@ -0,0 +1,9 @@ +--- +title: Modding-Guide +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/ModigAPI-Consolidation.md b/wiki-import/ModigAPI-Consolidation.md new file mode 100644 index 0000000..cba32da --- /dev/null +++ b/wiki-import/ModigAPI-Consolidation.md @@ -0,0 +1,9 @@ +--- +title: ModigAPI-Consolidation +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/README_MODDING.md b/wiki-import/README_MODDING.md new file mode 100644 index 0000000..83e565c --- /dev/null +++ b/wiki-import/README_MODDING.md @@ -0,0 +1,9 @@ +--- +title: README_MODDING +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/ROADMAP.md b/wiki-import/ROADMAP.md new file mode 100644 index 0000000..a39d2ff --- /dev/null +++ b/wiki-import/ROADMAP.md @@ -0,0 +1,9 @@ +--- +title: ROADMAP +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/Release-Assets-and-Templates.md b/wiki-import/Release-Assets-and-Templates.md new file mode 100644 index 0000000..a81d1d9 --- /dev/null +++ b/wiki-import/Release-Assets-and-Templates.md @@ -0,0 +1,9 @@ +--- +title: Release Assets and Templates +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/Repository-Status-2026-04-04.md b/wiki-import/Repository-Status-2026-04-04.md new file mode 100644 index 0000000..bc901ef --- /dev/null +++ b/wiki-import/Repository-Status-2026-04-04.md @@ -0,0 +1,9 @@ +--- +title: Repository Status 2026-04-04 +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/Setup.md b/wiki-import/Setup.md new file mode 100644 index 0000000..d567901 --- /dev/null +++ b/wiki-import/Setup.md @@ -0,0 +1,9 @@ +--- +title: Setup +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/Sponsoren.md b/wiki-import/Sponsoren.md new file mode 100644 index 0000000..6b4e6a6 --- /dev/null +++ b/wiki-import/Sponsoren.md @@ -0,0 +1,9 @@ +--- +title: Sponsoren +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/Sponsors.md b/wiki-import/Sponsors.md new file mode 100644 index 0000000..83ae6bd --- /dev/null +++ b/wiki-import/Sponsors.md @@ -0,0 +1,9 @@ +--- +title: Sponsors EN +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/StandaloneMods.md b/wiki-import/StandaloneMods.md new file mode 100644 index 0000000..ec8a08b --- /dev/null +++ b/wiki-import/StandaloneMods.md @@ -0,0 +1,9 @@ +--- +title: Standalone Mods +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/Steamworks-P2P-Multiplayer-Roadmap.md b/wiki-import/Steamworks-P2P-Multiplayer-Roadmap.md new file mode 100644 index 0000000..4544cf1 --- /dev/null +++ b/wiki-import/Steamworks-P2P-Multiplayer-Roadmap.md @@ -0,0 +1,9 @@ +--- +title: Steamworks-P2P-Multiplayer-Roadmap +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/TASKLIST.md b/wiki-import/TASKLIST.md new file mode 100644 index 0000000..b736074 --- /dev/null +++ b/wiki-import/TASKLIST.md @@ -0,0 +1,9 @@ +--- +title: TASKLIST +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/TechnicalReference/Guides/Index.md b/wiki-import/TechnicalReference/Guides/Index.md new file mode 100644 index 0000000..5466304 --- /dev/null +++ b/wiki-import/TechnicalReference/Guides/Index.md @@ -0,0 +1,9 @@ +--- +title: Index +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/TechnicalReference/Guides/_category_.json b/wiki-import/TechnicalReference/Guides/_category_.json new file mode 100644 index 0000000..1eb988d --- /dev/null +++ b/wiki-import/TechnicalReference/Guides/_category_.json @@ -0,0 +1,3 @@ +{ + "key": "wiki-import-techref-guides" +} diff --git a/wiki-import/TechnicalReference/Index.md b/wiki-import/TechnicalReference/Index.md new file mode 100644 index 0000000..5466304 --- /dev/null +++ b/wiki-import/TechnicalReference/Index.md @@ -0,0 +1,9 @@ +--- +title: Index +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/TechnicalReference/Reference/Index.md b/wiki-import/TechnicalReference/Reference/Index.md new file mode 100644 index 0000000..5466304 --- /dev/null +++ b/wiki-import/TechnicalReference/Reference/Index.md @@ -0,0 +1,9 @@ +--- +title: Index +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/TechnicalReference/Reference/_category_.json b/wiki-import/TechnicalReference/Reference/_category_.json new file mode 100644 index 0000000..8c6c7d5 --- /dev/null +++ b/wiki-import/TechnicalReference/Reference/_category_.json @@ -0,0 +1,3 @@ +{ + "key": "wiki-import-techref-reference" +} diff --git a/wiki-import/TechnicalReference/Troubleshooting/Index.md b/wiki-import/TechnicalReference/Troubleshooting/Index.md new file mode 100644 index 0000000..5466304 --- /dev/null +++ b/wiki-import/TechnicalReference/Troubleshooting/Index.md @@ -0,0 +1,9 @@ +--- +title: Index +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/TechnicalReference/Troubleshooting/_category_.json b/wiki-import/TechnicalReference/Troubleshooting/_category_.json new file mode 100644 index 0000000..fba851c --- /dev/null +++ b/wiki-import/TechnicalReference/Troubleshooting/_category_.json @@ -0,0 +1,3 @@ +{ + "key": "wiki-import-techref-troubleshooting" +} diff --git a/wiki-import/TechnicalReference/_category_.json b/wiki-import/TechnicalReference/_category_.json new file mode 100644 index 0000000..510e2bd --- /dev/null +++ b/wiki-import/TechnicalReference/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Technical reference", + "position": 40, + "key": "wiki-import-root-techref" +} diff --git a/wiki-import/WIKI-MOVED.md b/wiki-import/WIKI-MOVED.md new file mode 100644 index 0000000..43d244c --- /dev/null +++ b/wiki-import/WIKI-MOVED.md @@ -0,0 +1,9 @@ +--- +title: WIKI-MOVED +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/Web-UI-Bridge.md b/wiki-import/Web-UI-Bridge.md new file mode 100644 index 0000000..8004e0a --- /dev/null +++ b/wiki-import/Web-UI-Bridge.md @@ -0,0 +1,9 @@ +--- +title: Web-UI-Bridge +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/_Sidebar.md b/wiki-import/_Sidebar.md new file mode 100644 index 0000000..66b93a9 --- /dev/null +++ b/wiki-import/_Sidebar.md @@ -0,0 +1,9 @@ +--- +title: _Sidebar +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/wiki-import/ui.md b/wiki-import/ui.md new file mode 100644 index 0000000..7f5d6d1 --- /dev/null +++ b/wiki-import/ui.md @@ -0,0 +1,9 @@ +--- +title: ui +description: English translation pending; use the Deutsch locale for the full legacy page. +--- + +:::note +This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`. +::: + diff --git a/workshop-uploader.md b/workshop-uploader.md new file mode 100644 index 0000000..8c35df3 --- /dev/null +++ b/workshop-uploader.md @@ -0,0 +1,755 @@ +--- +title: WorkshopManager +sidebar_label: WorkshopManager +description: Windows desktop app for managing Steam Workshop content, browsing mods, and publishing for Data Center (FrikaMF). +--- + +# WorkshopManager + +**WorkshopManager** is a **.NET MAUI** desktop app for **Windows** that serves as a full-featured Steam Workshop client for *Data Center*. It combines content authoring (publish/update), a **Mod Store** for browsing and installing community mods, and a **Mod Manager** for dependency health checks. + +## Features + +### Author tools (Projects / Editor / My Uploads) +- Create workshop projects from templates (vanilla assets, MelonLoader mods, FMF plugins). +- Edit **title**, **description** (with BBCode toolbar), **visibility**, **tags**, and **preview image**; stored in `metadata.json`. +- **BBCode formatting toolbar** — insert Steam-compatible formatting (bold, italic, headings, URL, image, list, code, quote, spoiler, horizontal rule, table) directly in the description editor. +- **Save and upload to Steam** — saves metadata, publishes `content/` to Steam Workshop, then **syncs** your local folder with Steam's version (like a `git pull` after push). +- **Image sync** — after publishing, the preview image and gallery screenshots are re-downloaded from Steam so your local project always matches what's live. +- **Additional screenshots** — attach up to 9 gallery images that appear on the Steam Workshop page alongside the main preview. +- **Change notes** — required for the first publish, recommended for updates; shown on the Workshop changelog tab. +- **Upload readiness check** — validates title, description, content folder, preview image, tags, content size, and changelog before allowing upload. +- **View on Steam** — open your published item in the browser. +- **Export content as ZIP** — create a distributable archive of the content folder. +- **Pagination** across all list views (My Uploads, Browse, Subscribed, Favorites). +- **Per-item stats** — subscriptions, votes, score, size. + +### Mod Store (integrated in Mod Manager) +- **Browse** all Workshop items for Data Center with tag filtering and sort options (last updated, newest, top rated, trending, most subscribed, title A-Z). +- **Search** mods by text. +- **Subscribe / Unsubscribe** to mods directly from the store. +- **Favorites** — bookmark mods for quick access. +- **Vote** (up/down) on workshop items. +- **Item detail view** — full statistics, description, tags, gallery images, action buttons, and links to changelog/comments. + +### Mod Manager / Health +- **Dependency health** checks: game installed, MelonLoader, Il2Cpp assemblies, FMF core, FMF plugins directory, ModCfg directory. +- **MelonLoader** download page link and game folder access. +- **FMF Plugin channels** — stable (local scan) and beta (server, TODO). + +### Settings +- **Workspace path** — change where projects are stored (defaults to `/workshop`). +- **Language** — switch between EN, DE, RU, ES, IT, JP, PL, CN (defaults to system language). Restart button applies the change instantly. +- **Mod Store toggle** — enable/disable the Mod Store tab (disabled by default). Restart button included. +- **Community links** — quick access to Discord, Modding Channel, and GregFramework.eu. + +### FMF dependency notice +- Projects can be marked as **"Needs FrikaModFramework"** in the editor. When uploading, a notice is automatically appended to the Steam description telling users to install FMF. + +## Requirements + +- **Windows 10** (version 1809+). +- **Steam** with a signed-in account that **owns Data Center** (App ID **4170200**). +- **No additional dependencies** — the release is fully self-contained (includes .NET runtime and Windows App SDK). +- `steam_appid.txt` must be next to the executable (included in the release build). The app loads **`steam_api64.dll`** from **`Data Center_Data/Plugins/x86_64/`** in the Data Center install when possible; otherwise it uses the copy shipped next to the uploader. + +## Paths and directories {#paths} + +### Workspace path (your authoring projects) + +The workspace is resolved from Steam: `/workshop`. + +Fallback (no Steam): `%USERPROFILE%\DataCenterWS`. + +You can change this in **Settings → Workspace path**. + +On first launch the app creates the structure and places a sample `metadata.sample.json` under `.templates/`. + +### Where Steam installs subscribed Workshop mods {#steam-install-path} + +When a user **subscribes** to a Workshop item, Steam downloads it to: + +``` +\steamapps\workshop\content\4170200\\ +``` + +For example, if Steam is installed in the default location and the item ID is `123456789`: + +``` +C:\Program Files (x86)\Steam\steamapps\workshop\content\4170200\123456789\ +``` + +If you have multiple Steam library folders (e.g. on a different drive), the path follows that library's location: + +``` +D:\SteamLibrary\steamapps\workshop\content\4170200\123456789\ +``` + +The game reads from this folder at startup. The exact path per item can be inspected in the Steamworks API via `ugc.Directory` after calling `DownloadAsync`. + +:::info Finding your Steam library folder +Open Steam → **Settings → Storage** to see all configured library folders and which drive each uses. +::: + +### Where the game is installed + +The game install directory is typically: + +``` +C:\Program Files (x86)\Steam\steamapps\common\Data Center\ +``` + +The app resolves this automatically via `SteamApps.AppInstallDir(4170200)`. + +## Native mod format (config.json) {#native-mod-format} + +Data Center has a **built-in mod system** (`ModLoader`) that loads mods from `config.json` files. This is the "vanilla" modding approach — **no MelonLoader or FMF required**. + +### How the ModLoader works (internal flow) {#modloader-internals} + +The game's `ModLoader` (a Unity `MonoBehaviour`) runs the following on startup: + +1. **`SyncWorkshopThenLoadAll()`** — a coroutine that: + - Queries all subscribed Steam Workshop items (`PublishedFileId_t[]`) + - Waits for downloads to complete (with timeout) + - Copies each Workshop item folder into `StreamingAssets/Mods/workshop_` via `CopyDirectory()` +2. **`LoadAllMods()`** — scans all subdirectories in the mods path: + - Calls `LoadModPack(folderPath)` for each mod folder + - Reads `config.json`, then for each entry calls: + - `LoadShopItem()` → `CreateShopTemplate()` + `CreateShopButton()` for purchasable items + - `LoadStaticItem()` → `CreateStaticInstance()` for fixed-position decorations + +:::warning DLL loading timing +The `LoadDll()` method exists in the `ModLoader` but **object assets (shopItems, staticItems) are loaded at game startup**. DLL-based mods (`dlls[]` in config.json) are loaded later at **SaveLoad runtime**, not during the initial `LoadAllMods` pass. This means DLL plugins are not available until a save is loaded. +::: + +Internal state tracked by `ModLoader`: +- `modTemplates` — `Dictionary` of loaded shop item prefabs by mod ID +- `modTemplatesByFolder` — `Dictionary` of prefabs by folder name +- `staticInstances` — `List` of instantiated static decorations +- `loadedPlugins` — `List` of loaded DLL plugins +- `nextModID` — auto-incrementing ID counter + +### Mod location (manual install) + +Mods are placed under the game's streaming assets: + +``` +Data Center_Data\StreamingAssets\Mods\\ +``` + +Each mod has its own folder with a `config.json` and its asset files. + +### Mod location (Workshop subscribers) + +When delivered via Steam Workshop, the game's `ModLoader.SyncWorkshopThenLoadAll()` automatically **copies** subscribed item content from the Workshop download folder into `StreamingAssets/Mods/workshop_`: + +``` +steamapps\workshop\content\4170200\\ + → copied to → +Data Center_Data\StreamingAssets\Mods\workshop_\ +``` + +The `workshop_` prefix distinguishes Workshop-downloaded mods from manually installed ones. + +### config.json reference {#config-json} + +```json +{ + "modName": "My Cool Mod", + "shopItems": [ + { + "itemName": "Custom Server", + "price": 500, + "xpToUnlock": 0, + "sizeInU": 2, + "mass": 5.0, + "modelScale": 1.0, + "colliderSize": [0.5, 0.5, 0.5], + "colliderCenter": [0.0, 0.0, 0.0], + "modelFile": "server.obj", + "textureFile": "server.png", + "iconFile": "server_icon.png", + "objectType": 0 + } + ], + "staticItems": [ + { + "itemName": "Wall Poster", + "modelFile": "poster.obj", + "textureFile": "poster.png", + "modelScale": 1.0, + "colliderSize": [0.5, 0.5, 0.05], + "colliderCenter": [0.0, 0.0, 0.0], + "position": [2.0, 1.5, -3.0], + "rotation": [0.0, 90.0, 0.0] + } + ], + "dlls": [ + { + "fileName": "MyModPlugin.dll", + "entryClass": "MyModPlugin.Plugin" + } + ] +} +``` + +### config.json fields + +| Field | Description | +|-------|-------------| +| `modName` | Display name of the mod | +| `shopItems[]` | Purchasable objects that appear in the in-game shop | +| `staticItems[]` | Decorations placed at fixed world positions | +| `dlls[]` | Native plugin DLLs (see [DLL mods without MelonLoader](#native-dll-mods)) | + +### shopItems fields + +| Field | Type | Description | +|-------|------|-------------| +| `itemName` | `string` | Display name in the shop | +| `price` | `int` | Purchase price | +| `xpToUnlock` | `int` | XP threshold to unlock (0 = immediately available) | +| `sizeInU` | `int` | Rack unit size of the object | +| `mass` | `float` | Object mass | +| `modelScale` | `float` | Scale multiplier for the 3D model | +| `colliderSize` | `[x, y, z]` | Physics collider dimensions | +| `colliderCenter` | `[x, y, z]` | Physics collider offset | +| `modelFile` | `string` | Path to `.obj` model file (loaded via `LoadMesh`) | +| `textureFile` | `string` | Path to `.png` texture file (loaded via `CreateMaterial`) | +| `iconFile` | `string` | Path to `.png` shop icon (loaded via `LoadIcon`) | +| `objectType` | `int` | `0` = passive object | + +The `ModShopItem` UI component displays each shop item with `itemIcon`, `txtName`, and `txtPrice`. Purchasing calls `ButtonBuyItem()`. + +### staticItems fields + +| Field | Type | Description | +|-------|------|-------------| +| `itemName` | `string` | Display name | +| `modelFile` | `string` | Path to `.obj` model file | +| `textureFile` | `string` | Path to `.png` texture file | +| `modelScale` | `float` | Scale multiplier | +| `colliderSize` | `[x, y, z]` | Physics collider dimensions | +| `colliderCenter` | `[x, y, z]` | Physics collider offset | +| `position` | `[x, y, z]` | World position | +| `rotation` | `[x, y, z]` | Euler rotation in degrees | + +### Asset loading pipeline + +| Method | Input | Output | +|--------|-------|--------| +| `LoadMesh(folderPath, modelFile)` | `.obj` file | Unity `Mesh` | +| `CreateMaterial(folderPath, textureFile)` | `.png` file | Unity `Material` | +| `LoadIcon(folderPath, iconFile)` | `.png` file | Unity `Sprite` | +| `LoadTexture(path)` | `.png` file | Unity `Texture2D` | + +- **3D models**: Wavefront OBJ format (`.obj`) +- **Textures**: PNG format (`.png`) +- **Icons**: PNG format (`.png`) — shown in the shop UI +- All asset file paths in `config.json` are relative to the mod folder + +### DLL mods without MelonLoader {#native-dll-mods} + +The game's `ModLoader` has **built-in DLL loading** — no MelonLoader required. This is done via the `dlls` array in `config.json`: + +```json +{ + "modName": "My Plugin Mod", + "shopItems": [], + "staticItems": [], + "dlls": [ + { + "fileName": "MyPlugin.dll", + "entryClass": "MyPlugin.Plugin" + } + ] +} +``` + +**How it works internally:** +1. `ModLoader.LoadDll(folderPath, DllEntry)` loads the DLL from the mod folder +2. The `entryClass` must reference a class that implements the **`IModPlugin`** interface +3. Loaded plugins are stored in `ModLoader.loadedPlugins` (`List`) + +:::warning Loading timing +Unlike asset objects (`shopItems`, `staticItems`) which are loaded at game startup, **DLL mods are loaded at SaveLoad runtime** — i.e., when a save file is loaded, not when the game first starts. Your `IModPlugin` will not be instantiated until the player enters a save. +::: + +**DLL entry requirements:** + +| Field | Description | +|-------|-------------| +| `fileName` | The `.dll` file in the mod folder | +| `entryClass` | Fully qualified class name (e.g. `MyNamespace.MyPlugin`) that implements `IModPlugin` | + +:::caution Experimental feature +The developer has marked DLL loading as **untested**. The `LoadDll` method and `IModPlugin` interface exist in the game code, but stability is not guaranteed. A mod that uses only `shopItems` and `staticItems` (asset-only) is the safest approach. +::: + +**Advantages over MelonLoader:** +- No external framework needed — works with the vanilla game +- Distributed via Workshop like any other mod (just include the DLL in the mod folder) +- The game manages loading/unloading through its own lifecycle + +**Limitations:** +- The `IModPlugin` interface contract is not publicly documented — you need to reference the game's IL2CPP assemblies to implement it +- Less flexibility than MelonLoader's Harmony patching +- Only the entry class specified in `entryClass` is instantiated +- DLLs are loaded at SaveLoad time, not at game startup — no early initialization possible + +:::note Current limitations +For now, only **passive objects** are supported for shop items (`objectType: 0`). Active/functional item types may be added in future game updates. +::: + +### ModPathRedirector — Workshop download at MelonLoader init {#mod-path-redirector} + +**Release & download:** [FMF.ModPathRedirector Release](/wiki/releases/plugins/fmf-modpathredirector-release) — installation steps and GitHub download (`FMF.ModPathRedirector.dll`). + +The game loads native mods from `Data Center_Data\StreamingAssets\Mods\`. Workshop items are copied into subfolders named `workshop_` under that path (see [Steam install path](#steam-install-path)). + +**ModPathRedirector** is a **MelonLoader plugin** (not a MelonMod): install the DLL under **`{GameRoot}/Plugins/`**. It does **not** change native mod paths. It calls **`steam_api64.dll`** directly (Steam flat API: `SteamAPI_ISteamUGC_*`). The game ships this DLL under **`Data Center_Data/Plugins/x86_64/`**; the plugin loads it from there first, then falls back next to the executable. After the Il2Cpp assembly step (see MelonLoader log: `Il2CppAssemblyGenerator`), **`OnPreModsLoaded`** blocks loading MelonMods until each subscribed Workshop item reports installed in Steam and a matching **`Data Center_Data/StreamingAssets/Mods/workshop_/`** folder exists (per-item **`DownloadItem`**, **`SteamAPI_RunCallbacks`**, timeouts). If the game has not copied Workshop content into `StreamingAssets/Mods` yet, the plugin continues after a short grace period and logs a warning — restart once if mods are missing. + +**What it does:** +- On each frame (from `OnApplicationStarted`), waits for `SteamAPI_IsSteamRunning` and resolves `SteamAPI_SteamUGC_v0xx` → `ISteamUGC*`, then calls the native UGC APIs (no Il2Cpp Steamworks wrapper) +- Leaves `ModLoader.LoadAllMods` / `CopyDirectory` unchanged — Workshop sync still uses `Data Center_Data/StreamingAssets/Mods/workshop_/` + +**Installation:** +1. Copy `FMF.ModPathRedirector.dll` into `/Plugins/` (MelonLoader **Plugins** folder next to the executable) +2. Start the game — subscribed Workshop content is requested early; manual native mods still go under `Data Center_Data/StreamingAssets/Mods//` (each folder with a `config.json`) + +**Layout (unchanged from vanilla):** + +``` +Data Center/ + Data Center_Data/ + Plugins/ + x86_64/ + steam_api64.dll ← shipped with the game (Steam API; ModPathRedirector loads this) + StreamingAssets/ + Mods/ + my_cool_mod/ ← manual native mod + config.json + workshop_12345678/ ← Workshop item (game copies here after download) + ... + Plugins/ ← MelonLoader plugins (FMF.ModPathRedirector.dll) + Mods/ ← MelonLoader mods (other FMF.* MelonMods) + Data Center.exe +``` + +## Project layout + +For each Workshop project: + +1. Create a **folder** under the workspace (the folder name appears in the list). +2. Add a `content/` subfolder with files to ship: + - For **vanilla mods**: `config.json` + `.obj` models + `.png` textures directly in `content/` + - For **MelonLoader mods**: `content/Mods/` with `.dll` files + - For **FMF plugins**: `content/FMF/Plugins/` with `.dll` files +3. Optionally create `metadata.json` yourself or fill it in the app. +4. Optionally add `preview.png` (or `.jpg`, `.jpeg`, `.gif`, `.webp`) at the project root. +5. Optionally add gallery screenshots under `screenshots/` — these are uploaded as additional preview images. + +### Example: Vanilla mod (native config.json) + +``` +workshop/ +└── MyCustomServers/ + ├── metadata.json # Workshop metadata (title, desc, tags) + ├── preview.png # Main preview image + └── content/ # Shipped to subscribers + ├── config.json # Native mod definition + ├── server.obj # 3D model + ├── server.png # Texture + └── server_icon.png # Shop icon +``` + +### Example: MelonLoader mod + +``` +workshop/ +└── MyMelonMod/ + ├── metadata.json + ├── preview.png + └── content/ + └── Mods/ + └── MyMod.dll +``` + +### Example: FMF plugin + +``` +workshop/ +└── MyFmfPlugin/ + ├── metadata.json + ├── preview.png + └── content/ + └── FMF/ + └── Plugins/ + └── FFM.Plugin.MyPlugin.dll +``` + +### metadata.json schema + +| Field | Type | Description | +|-------|------|-------------| +| `publishedFileId` | `number` | Steam file ID (0 if unpublished) | +| `title` | `string` | Workshop item title (max 128 chars) | +| `description` | `string` | Description, supports [Steam BBCode](#bbcode) (max 8000 chars) | +| `visibility` | `string` | `"Public"`, `"FriendsOnly"`, or `"Private"` | +| `previewImageRelativePath` | `string` | Relative path to preview image (default `"preview.png"`) | +| `tags` | `string[]` | Up to 20 tags for discoverability | +| `needsFmf` | `boolean` | Appends FMF dependency notice on upload | +| `additionalPreviews` | `string[]` | Relative paths to gallery screenshot images | + +## Using the app + +### Tabs + +| Tab | Purpose | +|-----|---------| +| **Projects** | Local workshop projects; search, open editor | +| **New** | Create from template (vanilla, MelonLoader, FMF) | +| **My Uploads** | Paginated list of your published items with stats | +| **Mod Store** | Browse, search, subscribe, vote, and manage mods | + +### Publish workflow + +1. Open a project from the **Projects** tab. +2. Fill in title, description, tags, visibility, preview image. +3. Optionally add **gallery screenshots** (up to 9 additional images). +4. Write a **version changelog** (required for first publish). +5. Click **Save and upload to Steam**. +6. The app: + - Validates all required fields (upload readiness check). + - Saves `metadata.json`. + - Uploads `content/` and preview to Steam. + - Uploads additional gallery screenshots (if any). + - **Syncs back** — re-downloads Steam's version of content, preview image, and gallery screenshots into your local project folder. + +### Import from Steam + +You can import an existing published Workshop item into your local workspace: + +1. Go to **My Uploads** → click an item → **Import**. +2. The app downloads the content, preview image, gallery screenshots, and creates a local project with the correct `metadata.json`. + +### Headless / CI publish + +```bash +WorkshopUploader.exe --mode publish --path +``` + +Optional flags: +- `--autocommit` — writes a status JSON for external tools. + +## Steam BBCode reference {#bbcode} + +Steam Workshop descriptions support **BBCode** formatting. The editor includes a toolbar with all supported tags. Here is the full reference: + +### Text formatting + +```bbcode +[b]Bold text[/b] +[i]Italic text[/i] +[u]Underlined text[/u] +[strike]Strikethrough text[/strike] +``` + +### Headings + +```bbcode +[h1]Heading 1[/h1] +[h2]Heading 2[/h2] +[h3]Heading 3[/h3] +``` + +### Links and images + +```bbcode +[url=https://example.com]Link text[/url] +[img]https://example.com/image.png[/img] +``` + +### Lists + +```bbcode +[list] +[*] Item 1 +[*] Item 2 +[*] Item 3 +[/list] +``` + +### Code blocks + +```bbcode +[code] +console.log("Hello World"); +[/code] +``` + +### Quotes and spoilers + +```bbcode +[quote]Quoted text here[/quote] +[spoiler]Hidden text revealed on click[/spoiler] +``` + +### Horizontal rule + +```bbcode +[hr][/hr] +``` + +### Tables + +```bbcode +[table] +[tr] +[th]Header 1[/th] +[th]Header 2[/th] +[/tr] +[tr] +[td]Cell 1[/td] +[td]Cell 2[/td] +[/tr] +[/table] +``` + +### Example workshop description + +```bbcode +[h1]My Awesome Mod[/h1] + +Custom decorations and objects for Data Center. + +[h2]Features[/h2] +[list] +[*] 10 new decoration items +[*] 5 custom server rack skins +[*] Compatible with FrikaModFramework +[/list] + +[h2]Installation[/h2] +Subscribe to this Workshop item — the game loads it automatically. + +[h2]Requirements[/h2] +[list] +[*] Data Center (Steam) +[*] [url=https://melonwiki.xyz]MelonLoader[/url] (for modded items) +[/list] + +[h3]Changelog[/h3] +[b]v1.0[/b] — Initial release + +[hr][/hr] +[i]Made by YourName — [url=https://discord.gg/your-server]Join the Discord[/url][/i] +``` + +## Upload readiness checks {#checks} + +Before uploading, the editor runs automated checks: + +| Check | Error condition | Warning condition | +|-------|----------------|-------------------| +| **Content folder** | `content/` missing or empty | — | +| **Title** | Empty or > 128 characters | — | +| **Description** | > 8000 characters | Empty (recommended) | +| **Visibility** | — | Unknown value | +| **Preview image** | — | Missing or > 1 MB | +| **Tags** | — | No tags set | +| **Content size** | — | > 100 MB | +| **Changelog** | Empty on first publish | Empty on update | + +Items with **errors** cannot be uploaded. **Warnings** are informational — upload is still possible. + +## Preview images {#preview-images} + +### Main preview image +- Supports **PNG**, **JPG**, **JPEG**, **GIF**, and **WebP**. +- Auto-detected by filename: `preview.png`, `preview.jpg`, etc. +- Recommended size: under **1 MB**. +- The app auto-detects the format from the file's magic bytes when syncing from Steam. + +### Gallery screenshots +- Up to **9** additional images per item. +- Stored in `screenshots/` under the project root. +- Uploaded in a separate pass after the main content publish. +- **Synced back** from Steam on publish and import — if screenshots exist on Steam, they are downloaded to your local `screenshots/` folder. + +## Build and deploy {#build-deploy} + +### Self-contained release + +The app is published as a **self-contained** Windows executable — no .NET runtime or Windows App SDK install required on the target machine. + +```bash +dotnet publish WorkshopUploader/WorkshopUploader.csproj -c Release -p:SelfContained=true -p:RuntimeIdentifier=win10-x64 +``` + +Output: `WorkshopUploader/bin/Release/net9.0-windows10.0.19041.0/win10-x64/publish/` + +### Deploy all mods + Gregtools Modmanager to Workshop folders + +```bash +pwsh -File scripts/Deploy-Release-ToWorkshop.ps1 +``` + +This builds all framework/plugins/mods **and** the WorkshopUploader itself, then packages each into a Steamworks-compatible project folder under `/workshop/`. The WorkshopUploader is packaged as **"Gregtools Modmanager"**. + +### Deploy to game directory (local testing) + +```bash +pwsh -File scripts/Deploy-Release-ToDataCenter.ps1 -IncludeWorkshopUploader +``` + +## FAQ {#faq} + +### General + +**Q: Do I need to install anything besides the app?** +No. The release is fully self-contained — .NET runtime and Windows App SDK are bundled. You only need Steam running with a Data Center license. + +**Q: What Steam App ID does this use?** +`4170200` (Data Center). The file `steam_appid.txt` must contain this ID next to the executable. + +**Q: Can I use this on Linux / macOS?** +Not currently. The app targets Windows 10+ via .NET MAUI with WinUI. + +### Projects and workspace + +**Q: Where are my projects stored?** +By default under `/workshop/`. You can change this in Settings. Fallback if Steam is unavailable: `%USERPROFILE%\DataCenterWS`. + +**Q: What is the difference between the workspace and Steam's download folder?** +The **workspace** (`/workshop/`) is where you *author* content. The **Steam download folder** (`steamapps/workshop/content/4170200//`) is where Steam installs *subscribed* items for the game. They are separate locations. + +**Q: Can I edit a project that was already published?** +Yes. Open it from **Projects**, make changes, and click **Save and upload to Steam**. The app updates the existing Workshop item (using the `publishedFileId` stored in `metadata.json`). + +**Q: Can I import a Workshop item I published from another machine?** +Yes. Use **My Uploads** → select the item → **Import**. The app downloads everything (content, preview, gallery screenshots) and creates a local project. + +### Publishing + +**Q: Why can't I upload? The button is greyed out / shows errors.** +The upload readiness checker found issues. Common blockers: +- `content/` folder is missing or empty. +- Title is empty. +- No changelog provided on first publish. +Check the readiness panel at the bottom of the editor for details. + +**Q: Is the changelog required?** +Yes for the **first publish** (error if empty). For updates it's recommended but not enforced (warning only). + +**Q: What happens after I click "Save and upload to Steam"?** +1. Metadata is saved locally. +2. Content and preview are uploaded to Steam. +3. Gallery screenshots are uploaded (if any). +4. The app re-downloads everything from Steam to sync your local project (content, preview image, gallery images). + +**Q: My upload says "Workshop legal agreement must be accepted."** +You need to accept the Steam Workshop legal agreement for Data Center in your browser. Visit the Workshop page for the game on Steam and accept the agreement. + +**Q: Can I upload from the command line?** +Yes: `WorkshopUploader.exe --mode publish --path `. Useful for CI/CD pipelines. + +### Descriptions and formatting + +**Q: Does the description support formatting?** +Yes, Steam Workshop uses **BBCode**. The editor includes a toolbar with all supported tags (bold, italic, headings, URLs, images, lists, code, quotes, spoilers, tables). See the [BBCode reference](#bbcode) above. + +**Q: What is the maximum description length?** +8000 characters. + +**Q: Can I use Markdown in descriptions?** +No. Steam Workshop only supports BBCode. Markdown will be displayed as plain text. + +### Images + +**Q: What image formats are supported?** +PNG, JPG/JPEG, GIF, and WebP for both the main preview and gallery screenshots. + +**Q: How large can the preview image be?** +Steam recommends under **1 MB**. The app warns if it's larger but doesn't block upload. + +**Q: How many gallery screenshots can I add?** +Up to **9** additional images. They appear in the image gallery on the Steam Workshop page. + +**Q: Are my screenshots synced from Steam?** +Yes. After publishing and during import, gallery screenshots are downloaded from Steam and saved in your project's `screenshots/` folder. + +### Mods and installation + +**Q: Where does Steam install Workshop mods?** +`/steamapps/workshop/content/4170200//`. See [Steam install path](#steam-install-path) for details. + +**Q: Where does the game look for native mods (manual install)?** +`Data Center_Data/StreamingAssets/Mods//`. Each subfolder must contain a `config.json`. See the [native mod format](#native-mod-format) reference. + +**Q: How does the game load Workshop mods?** +At startup, the game's `ModLoader.SyncWorkshopThenLoadAll()` queries all subscribed items from Steam, waits for downloads to complete, and copies each into `Data Center_Data/StreamingAssets/Mods/workshop_/`. Then `LoadAllMods()` scans that folder. Asset objects (shopItems, staticItems) load immediately; DLL mods load later at SaveLoad time. The content structure determines what kind of mod it is: +- **Native mods** (vanilla): `config.json` + OBJ/PNG assets directly in `content/` — no extra tools needed. +- **MelonLoader mods**: `content/Mods/` with `.dll` files — requires MelonLoader. +- **FMF plugins**: `content/FMF/Plugins/` with `.dll` files — requires MelonLoader + FMF. + +**Q: What are the three mod types?** + +| Type | Requirements | Content structure | Use case | +|------|-------------|-------------------|----------| +| **Vanilla (native)** | None | `config.json` + `.obj` + `.png` | Custom objects, decorations, shop items | +| **MelonLoader** | MelonLoader | `Mods/*.dll` | Code mods (IL2CPP) | +| **FMF plugin** | MelonLoader + FMF | `FMF/Plugins/*.dll` | FrikaModFramework plugins | + +**Q: What model format does the native mod system use?** +Wavefront OBJ (`.obj`) for 3D models and PNG (`.png`) for textures and icons. + +**Q: What is `objectType` in config.json?** +Currently only `0` (passive object) is supported. Active/functional object types may be added in future game updates. + +**Q: Can I load custom DLLs via the native mod system (without MelonLoader)?** +Yes. The game's `ModLoader` has built-in DLL loading via the `dlls` array in `config.json`. Your entry class must implement the game's `IModPlugin` interface. See [DLL mods without MelonLoader](#native-dll-mods) for details. Note that this feature is marked as **experimental** by the developer — asset-only mods (`shopItems`/`staticItems`) are the safest approach. + +**Q: Do users need MelonLoader to use Workshop items?** +Only for MelonLoader and FMF mods. **Vanilla/native mods** (using `config.json`) work without any additional tools — just subscribe and play. Mark your project as "Needs FrikaModFramework" if applicable — the app will add an installation notice to the description automatically. + +**Q: Can I change where native mods are loaded from?** +Yes. Install the [ModPathRedirector](#mod-path-redirector) MelonLoader plugin into `{GameRoot}/Plugins/`. It uses `steam_api64.dll` to trigger Workshop downloads once the Steam client is up; files still land under `Data Center_Data/StreamingAssets/Mods/workshop_/`. + +### Mod Store + +**Q: How do I enable the Mod Store?** +Go to **Settings** → toggle **Mod Store** on → restart the app. + +**Q: Can I subscribe to mods from the app?** +Yes. Browse or search for mods, then click **Subscribe**. Steam will download the mod automatically. + +### Troubleshooting + +**Q: The app won't start / crashes on launch.** +- Ensure `steam_appid.txt` is next to the executable; `steam_api64.dll` should resolve from the Data Center install (`Data Center_Data/Plugins/x86_64/`) or from the uploader folder. +- Steam must be running and logged in. +- Check the Windows Event Viewer (Application log) for .NET crash details. +- On Windows 10 < 1809, the app may not work due to WinUI requirements. + +**Q: "Steam init failed" error in the app.** +- Make sure Steam is running and you are logged in. +- Verify you own Data Center (App ID 4170200). +- Check that `steam_appid.txt` contains `4170200`. + +**Q: My content doesn't show up after subscribing.** +- Restart the game — Workshop content is loaded at startup. +- Check `steamapps/workshop/content/4170200/` to verify the download exists. +- If the folder is empty, try unsubscribing and re-subscribing. + +**Q: The preview image doesn't load in the Mod Store.** +- The image is loaded from Steam's CDN. Check your internet connection. +- Very large images may take a moment to appear. + +## See also + +- Repository README: [`WorkshopUploader/README.md`](https://github.com/mleem97/gregFramework/blob/master/WorkshopUploader/README.md) +- [End-User Guide](/wiki/guides/enduser-workshop) +- [Contributor Guide](/wiki/guides/contributor-workshop) +- [Release](/wiki/guides/release)