docs: update docusaurus configuration and documentation structure

- Revised the tagline in `docusaurus.config.js` for improved clarity on the documentation's focus.
- Removed German localization support from the configuration to streamline the user experience.
- Updated navigation items in the sidebar to better reflect the current structure, emphasizing player and developer resources.
- Enhanced the README and various documentation files to clarify the repository layout and improve accessibility for users.
- Adjusted links and descriptions throughout the documentation to ensure consistency and accuracy.

This commit aims to enhance the overall clarity and usability of the documentation.
This commit is contained in:
Marvin
2026-04-10 02:26:32 +02:00
parent 8d8fda49c4
commit 331847013d
50 changed files with 634 additions and 1070 deletions

View File

@@ -1,16 +1,6 @@
# gregWiki
# gregWiki — gregFramework documentation
Docusaurus site for **gregFramework** / Data Center modding: `docusaurus.config.js`, `sidebars.js`, React under `src/`, content under [`docs/`](./docs/). Published route base path: **`/wiki`**.
---
## Part of gregFramework
This directory is part of the **[gregFramework](https://github.com/mleem97/gregFramework)** workspace. Clone sibling repositories side by side so each project lives at `gregFramework/<RepoName>/`. See the workspace [README](https://github.com/mleem97/gregFramework/blob/master/README.md) for the full layout and migration notes.
**Remote:** [`mleem97/gregWiki`](https://github.com/mleem97/gregWiki) — on-disk path: `gregFramework/gregWiki/`.
---
This repository contains the **Docusaurus site** (`docusaurus.config.js`, `src/`, `sidebars.js`) and all **Markdown/MDX content** under [`docs/`](./docs/). Published docs use the route base path **`/wiki`**.
## Local development
@@ -25,50 +15,47 @@ Production build:
npm run build
```
Optional: mirror the legacy GitHub Wiki — see [`docs/getting-started/documentation-layout.md`](./docs/getting-started/documentation-layout.md) and scripts `wiki:sync` / `wiki:normalize-i18n`.
---
Content is edited directly under [`docs/`](./docs/). **Canonical architecture & doc rules:** [`docs/meta/system-architecture-principles.md`](./docs/meta/system-architecture-principles.md) (ModManager → Framework → Plugins → Mods). The old GitHub Wiki bulk-import scripts (`wiki:sync`, `wiki:normalize-i18n`) are no-ops; see [`docs/getting-started/documentation-layout.md`](./docs/getting-started/documentation-layout.md).
## Deployment (Coolify / CI)
- **Default branch:** `main` — use this for new work and PRs.
- **`master`:** may still exist for older deployments; in Coolify, set the branch to **`main`** when possible.
- **`master`:** kept in sync with `main` for hosts that still clone `master` (e.g. older Coolify defaults). Prefer setting the deployment **branch to `main`** in Coolify → Application → **Git** → Branch.
### Coolify (Dockerfile) — missing `/app/package.json`
### Coolify (Dockerfile) — avoid `/app/package.json` missing
The image expects **`package.json` at the image root `/app`**. That only works if the **Docker build context** is this repository (gregWiki), not a parent monorepo folder without adjustments.
The image expects **`package.json` at the image root `/app`**. That only happens if the **Docker build context** is this repo (gregWiki), not a parent monorepo folder.
| Setting | Value |
|---------|--------|
| **Dockerfile** | `Dockerfile` at the gregWiki root |
| **Base directory** | **`.`** when only `gregWiki` is cloned. If gregWiki sits **next to** gregCore in the same clone, often set **`gregWiki`** as the subdirectory. |
| **Volumes** | Do not use an empty host mount over `/app` that hides `package.json`. |
|--------|--------|
| **Dockerfile location** | `Dockerfile` (or `gregWiki/Dockerfile` if the Git repo is the parent workspace) |
| **Base directory / Root directory** | **`gregWiki`** when the cloned repo contains `gregCore/`, `gregWiki/`, … next to each other. If Coolify only clones **`mleem97/gregWiki`**, base directory is **`.`** (repo root). |
| **Do not** | Set build context to the parent `gregFramework` folder unless Dockerfile uses `COPY gregWiki/…` (this Dockerfile does not). |
| **Volumes** | Do **not** bind-mount an empty host path over `/app` — that hides `package.json` from the image. |
Symptom: `docker-entrypoint: ERROR: /app/package.json not found` → wrong context or volume.
Symptom: `docker-entrypoint: ERROR: /app/package.json not found` → wrong build context or a bad volume on `/app`.
---
## Docker
## Docker (local)
Build context = **this** repository (folder that contains `package.json`):
Build context **must** be this repository root (the folder that contains `package.json`):
```bash
cd path/to/gregWiki
cd path/to/gregWiki # directory that contains package.json
docker compose up --build
# or
docker build -t gregwiki-docs .
docker run --rm -p 3000:3000 gregwiki-docs
```
If gregWiki lives inside **gregFramework**, from the workspace root:
If the wiki lives inside a **gregFramework** workspace, run Compose from the parent folder:
```bash
cd path/to/gregFramework
docker compose -f docker-compose.gregwiki.yml up --build
```
(`docker-compose.gregwiki.yml` sets `build.context: ./gregWiki`.)
(`docker-compose.gregwiki.yml` sets `build.context: ./gregWiki` and mounts `./gregWiki` to `/app` for dev.)
---
## Related repositories
## See also
- [gregFramework README](../README.md) — flat layout `gregFramework/{RepoName}/`
- Source code and builds: **gregCore**, **gregMod.*** , **gregExt.*** as separate repositories (not only this documentation)
The [`gregFramework`](https://github.com/mleem97/gregFramework) workspace groups **gregCore**, **gregMods**, **gregExtensions**, **gregWiki**, and related tools. Source-of-truth code paths for hooks and builds live in those repos, not only in this documentation tree.

36
docs/README.md Normal file
View File

@@ -0,0 +1,36 @@
# Documentation layout (`docs/`)
This folder is the **single source of truth** for the public Docusaurus site. The app lives in the **gregWiki** repository root next to `docs/`; built pages are served under the **`/wiki`** base path.
## How content is organized
| Area | Path | Purpose |
|------|------|--------|
| **Landing** | [`intro` → `/wiki/docs`](/wiki/docs) | Site home (`/wiki/docs`). |
| **Topics hub** | [`topics/`](./topics/index.md) | Cross-cutting overviews (security, FFI, multiplayer, assets, meta). |
| **Mods & plugins** | [`mods/`](./mods/), [`plugins/`](./plugins/) | Gameplay mods (`FMF.*`) and framework plugins (`FFM.Plugin.*`). |
| **Releases** | [`releases/`](./releases/) | Per-artifact release notes. |
| **Reference** | [`reference/`](./reference/) | Hooks, naming, MCP, generated catalogs. |
| **Contributors** | [`contributors/`](./contributors/) | Repo layout, Docusaurus workflow, design system. |
| **Guides** | [`guides/`](./guides/players/overview.md) | Role-based paths (players, mod developers, contributors, sponsors). |
| **Roadmap** | [`roadmap/`](./roadmap/) | Planning docs. |
| **Meta** | [`meta/`](./meta/) | Workshop, devserver, backlog; [architecture principles](./meta/system-architecture-principles.md) (ModManager → Framework → Plugins → Mods). |
## URLs
- Doc id `intro``/wiki/docs` (see front matter).
- Most docs → `/wiki/<doc-path>` (e.g. `mods/framework``/wiki/mods/framework`).
## Scripts (repository root)
| Script | Role |
|--------|------|
| `wiki:sync` | **No-op** (legacy GitHub Wiki mirror removed). |
| `wiki:normalize-i18n` | **No-op** (same). |
| `wiki:refresh` | Runs both no-ops; safe for old CI hooks. |
Author new pages under `docs/`; use **git history** if you need text from the former bulk import.
## Locales
- **Language:** English only — files under `docs/`.

84
docs/developers.md Normal file
View File

@@ -0,0 +1,84 @@
---
id: developers
title: Developers & contributors
sidebar_label: Developers (hub)
slug: /developers
description: Technical documentation for mod authors, plugin authors, and repo contributors — hooks, workspace, releases, and internals.
---
# Developers & contributors
Use this hub if you **build mods or plugins**, work on **framework** code, or contribute to **repositories and docs**.
**Players** should start with **[Play & mods](/wiki/guides/players/overview)** (sidebar above) — install, Workshop, troubleshooting.
**Architecture:** read **[System architecture & documentation principles](/wiki/meta/system-architecture-principles)** first — canonical **ModManager → Framework → Plugins → Mods** model, priorities (stability, maintainability, DX), and wiki writing rules.
## Workspace & onboarding
- [Getting started](/wiki/getting-started) — split-repo layout, build core, hook naming
- [Documentation layout](/wiki/getting-started/documentation-layout) — how `docs/` is organized
- [Workspace map](/wiki/workspace/) — folders on disk
## Framework
- [Architecture](/wiki/framework/architecture)
- [FMF hooks](/wiki/framework/fmf-hooks)
- [Hexmod](/wiki/framework/hexmod)
## Plugins (`FFM.Plugin.*`) & mods (`FMF.*`)
- [Plugins overview](/wiki/plugins/)
- [Mods overview](/wiki/mods/) — gameplay mods and [Framework](/wiki/mods/framework) article
## Guides (authors & repo)
- [Mod developers](/wiki/guides/mod-developers/overview)
- [Contributors (workflow)](/wiki/guides/contributors/topics-overview)
- [Contributor workshop](/wiki/guides/contributors/contributor-workshop)
- [Release guide](/wiki/guides/contributors/release)
- [Sponsors](/wiki/guides/sponsors/overview)
- [By audience (paths)](/wiki/guides/players/audiences-overview) · [Newbies](/wiki/audiences/newbies) · [Intermediates](/wiki/audiences/intermediates) · [Professionals](/wiki/audiences/professionals)
## Tools & meta (advanced)
- [Steam Workshop & tooling](/wiki/meta/Steam-Workshop-and-Tooling)
- [Devserver betas](/wiki/meta/devserver-betas)
- [IDEA backlog](/wiki/meta/IDEA_BACKLOG)
## Releases
- [Releases index](/wiki/releases)
## Reference
- [Wiki mapping](/wiki/reference/wiki-mapping)
- [Mod store vision](/wiki/reference/mod-store-vision)
- [FMF hook naming](/wiki/reference/fmf-hook-naming)
- [FMF hooks catalog](/wiki/reference/fmf-hooks-catalog)
- [MCP server](/wiki/reference/mcp-server)
- [Release channels](/wiki/reference/release-channels) — also linked under **Play & mods**
- [Reference data files](/wiki/reference/reference-data-files)
- [Modding language requirement](/wiki/reference/modding-language-requirement)
## Topics
- [Topics hub](/wiki/topics/)
## Contributors (workflow)
- [Repo inventory](/wiki/contributors/repo-inventory)
- [Monorepo target layout](/wiki/contributors/monorepo-target-layout)
- [Design system](/wiki/contributors/luminescent-design-system)
- [Docusaurus workflow](/wiki/contributors/docusaurus-workflow)
- [Plugin submission audit](/wiki/contributors/plugin-submission-audit)
- [Sponsorship automation](/wiki/contributors/sponsorship-automation)
## Roadmap
- [Unified roadmap](/wiki/roadmap/unified-roadmap)
- [Mod store stages](/wiki/roadmap/mod-store-stages)
## Sponsors
- [SPONSORS](/wiki/SPONSORS)

View File

@@ -1,34 +1,45 @@
---
title: Repository architecture
sidebar_label: Repository architecture
description: Aktuelle Multi-Repo-Architektur mit `gregFramework` als Wrapper und klarer Repo-Trennung.
description: Current multi-repo layout with `gregFramework` as a local wrapper and clear repository boundaries.
---
## Modding language
Mods, MelonLoader-Plugins und Extensions liefern ihre **Logik ausschließlich in C#** (MelonLoader / .NET). Details und Abgrenzung zum Framework-Kern (z. B. Rust-Bridge): [Modding language (C# only)](/wiki/reference/modding-language-requirement).
Mods, MelonLoader plugins, and extensions ship their **logic in C# only** (MelonLoader / .NET). Scope vs framework core (e.g. Rust bridge): [Modding language (C# only)](/wiki/reference/modding-language-requirement).
## Layers
## Target runtime layers
Above the raw repositories, the **logical** model is **ModManager → Framework → Plugins → Mods** (see [System architecture & documentation principles](/wiki/meta/system-architecture-principles)):
| Layer | Role | Repo / folder |
|--------|--------|----------------|
| **ModManager** | MAUI front-end: manage mods/plugins, surface game status; talks to the framework through defined interfaces. | `gregModmanager/` |
| **Framework (SDK)** | Hooks, events, versioning, logging; bridge to IL2CPP / MelonLoader. | `gregCore/` |
| **Plugins** | Framework extensions (`FFM.Plugin.*`). | `gregExt.<Name>/` |
| **Mods** | User mods (`FMF.*`). | `gregMod.<Name>/` |
## On-disk repositories
| Layer | Role |
| ------ | ------ |
| **Wrapper** | `gregFramework/` enthält lokal alle Einzel-Repositories. |
| **Core** | `gregCore/`**Framework-Kern**: Übersetzung, Hooks, Harmony/Event-Laufzeit, MCP, Templates und zugehörige Kernfunktionen. |
| **Rust bridge** | In Core integriert unter `gregCore/bridges/gregSta.RustBridge/`. |
| **Mods** | `gregMod.<Name>/`jeweils eigenes Repo direkt unter `gregFramework/`. |
| **Extensions** | `gregExt.<Name>/`jeweils eigenes Repo direkt unter `gregFramework/`. |
| **Docs** | `gregWiki/` als eigenes Repo für Dokumentation. |
| **Wrapper** | `gregFramework/` holds local checkouts of individual repositories. |
| **Core** | `gregCore/`**framework core**: translation, hooks, Harmony/event runtime, MCP, templates, and related core features. |
| **Rust bridge** | Integrated in core under `gregCore/bridges/gregSta.RustBridge/`. |
| **Mods** | `gregMod.<Name>/`one repo each, directly under `gregFramework/`. |
| **Extensions** | `gregExt.<Name>/`one repo each, directly under `gregFramework/`. |
| **Docs** | `gregWiki/` — documentation site repository. |
## Hook registry
Hook-Naming und Registry bleiben fachlich im Core verankert; bei Split-Änderungen gilt immer der Core-Stand als Referenz.
Hook naming and the registry are owned by core; when repos split, **core** remains the source of truth.
## Tools
- **Core tools:** `gregCore/tools/`
- **MCP runtime:** `gregCore/mcp-server/`
- **Hook-/Mapping-Utilities:** ebenfalls unter Core-Tools, versioniert mit dem Core-Repo.
- **Hook / mapping utilities:** also under core tools, versioned with the core repo.
## Steam & Workshop
Workshop-Templates und Deployment-Skripte liegen im Core-Repo unter `gregCore/Templates/` und `gregCore/scripts/`.
Workshop templates and deployment scripts live in the core repo under `gregCore/Templates/` and `gregCore/scripts/`.

View File

@@ -4,7 +4,7 @@ sidebar_label: Getting started
description: "Split-repo workspace: gregFramework layout, building the core, and where docs live."
---
The workspace is **multi-repo** with a local `gregFramework/` folder containing standalone repositories, for example:
The workspace is **multi-repo** with a local `gregFramework/` folder containing standalone repositories. **Logical stack:** **ModManager → framework / SDK → plugins → mods** — see [System architecture & documentation principles](/wiki/meta/system-architecture-principles).
- `gregCore/` — core SDK (`gregCore/framework/FrikaMF.csproj`), MCP server under `gregCore/mcp-server/`
- `gregMod.<Name>/` — gameplay mods (`FMF.*`), **flat** next to `gregCore/` (legacy umbrella `gregMods/` is deprecated)

View File

@@ -2,7 +2,7 @@
id: documentation-layout
title: Documentation layout (`docs/`)
sidebar_label: Documentation layout
description: How curated docs, guides, and the legacy GitHub Wiki mirror are organized under docs/.
description: How curated docs, guides, and reference material are organized under docs/.
---
# Documentation layout (`docs/`)
@@ -26,34 +26,17 @@ This folder is the **single source of truth** for the public Docusaurus site. Th
| **Contributors** | [`contributors/`](../contributors/repo-inventory.md) | Repo inventory, Docusaurus workflow, design system. |
| **Roadmap** | [`roadmap/`](../roadmap/unified-roadmap.md) | Planning docs. |
| **Topics hub** | [`topics/`](../topics/index.md) | Cross-cutting overviews (assets, multiplayer, security, …). |
| **Meta** | [`meta/`](../meta/Steam-Workshop-and-Tooling.md) | Workshop tooling notes, devserver API, backlog. |
| **Legacy** | [`legacy/`](../legacy/index.md) | GitHub Wiki mirror under `legacy/wiki-import/`. |
## Legacy GitHub Wiki (`docs/legacy/wiki-import/`)
Long-form pages mirrored from the **GitHub Wiki** live here (synced from `.wiki/`).
1. Clone the wiki working tree as **`../.wiki/`** under `gregFramework/` (same level as sibling repos).
2. From **gregWiki** root: `npm run wiki:refresh` (or `wiki:sync``wiki:normalize-i18n`).
3. German paired pages live under `i18n/de/docusaurus-plugin-content-docs/current/legacy/wiki-import/` after normalization.
4. Prefer **new curated docs** under `guides/`, `reference/`, or `framework/`; keep bulk legacy material in `legacy/wiki-import/` until migrated.
Details: [`topics/wiki-import/overview`](../topics/wiki-import/overview.md).
| **Meta** | [`meta/`](../meta/Steam-Workshop-and-Tooling.md) | Workshop tooling notes, devserver API, backlog; **[architecture principles](../meta/system-architecture-principles.md)** (stack model & doc rules). |
## URLs
- Doc id `intro``/wiki/docs`.
- Typical doc → `/wiki/<doc-id-path>` (e.g. `mods/framework``/wiki/mods/framework`).
## Scripts (gregWiki root)
| Script | Role |
|--------|------|
| `wiki:sync` | Copies `.wiki/``docs/legacy/wiki-import/`. |
| `wiki:normalize-i18n` | Splits DE/EN pairs into default locale + `i18n/de/...`. |
| `write-wiki-import-category-keys` | Refreshes `_category_.json` keys under imported trees. |
## Locales
- **Default:** `en` — files under `docs/`.
- **Deutsch (`de`):** overrides under `i18n/de/docusaurus-plugin-content-docs/current/` mirroring `docs/` paths where translated files exist; otherwise Docusaurus falls back to English.
- **Language:** English only — all curated content lives under `docs/`.
## Historical note
The former GitHub Wiki bulk import under `docs/legacy/wiki-import/` has been **removed**. Author new material under the folders above; use Git history if you need obsolete text.

View File

@@ -6,14 +6,14 @@ 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/guides/players/audiences-overview).
**Repository contributors**framework, website, CI, plugins. Role overview (including players, mod developers, sponsors): [By audience](/wiki/guides/players/audiences-overview).
Operational docs for people changing the framework, site, or release pipeline.
- [System architecture & documentation principles](/wiki/meta/system-architecture-principles) — layer model, priorities, wiki rules (**required reading** for substantive doc changes).
- [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.
- [Contributor workshop](./contributor-workshop) — branching, reviews, and release expectations.

View File

@@ -6,8 +6,9 @@ description: Getting started, mod config, debugging — curated docs for FMF mod
# Mod developers
**Mod-Autorinnen und -Autoren**eigene Mods bauen (Hooks, Konfiguration, Debug). Überblick über alle Rollen: [By audience](/wiki/guides/players/audiences-overview).
**Mod authors**build your own mods (hooks, configuration, debugging). Role overview: [By audience](/wiki/guides/players/audiences-overview).
- [System architecture & documentation principles](/wiki/meta/system-architecture-principles) — layer model **ModManager → Framework → Plugins → Mods**, priorities, wiki rules
- [By audience — intermediates](/wiki/audiences/intermediates) and [professionals](/wiki/audiences/professionals)
- [Framework overview](/wiki/mods/framework) — runtime capabilities and repo layout
- [FMF hooks](/wiki/framework/fmf-hooks) — hook surface (generated article)

View File

@@ -2,28 +2,28 @@
id: audiences-overview
title: By audience
sidebar_label: By audience
description: Vier Rollen — Spieler, Moddevs, Contributor, Sponsoren — plus Erfahrungsstufen (Newbies bis Pros).
description: Four roles — players, mod developers, contributors, sponsors — plus experience levels (newbies through pros).
---
# By audience
Die Dokumentation richtet sich an **vier Hauptrollen** (und an Erfahrungsstufen darunter). Die meisten Seiten sind **Englisch**; ausgewählte Einstiege gibt es auch auf **Deutsch** (z. B. in dieser Übersicht und in `i18n/de`).
Documentation is aimed at **four primary roles** (and experience levels under each). All curated pages are **English**.
## Die vier Rollen
## The four roles
| Rolle | Für wen? | Einstieg |
| Role | Who | Start here |
|--------|----------|----------|
| **Spieler** (End users) | Installation, Mods nutzen, Troubleshooting | [End users (hub)](./overview) · [End-user workshop](./enduser-workshop) |
| **Mod-Entwickler** (Mod developers) | Mods bauen, Hooks, Konfiguration, Debug | [Mod developers (hub)](../mod-developers/overview) · [Framework](/wiki/mods/framework) |
| **Contributor** (Repo & Framework) | PRs, Doku, Plugins, CI | [Contributors (workflow)](../contributors/topics-overview) · [Repo inventory](/wiki/contributors/repo-inventory) |
| **Sponsorinnen & Sponsoren** | Unterstützung, Transparenz | [Sponsors (hub)](../sponsors/overview) |
| **Players** (end users) | Install, use mods, troubleshooting | [End users (hub)](./overview) · [End-user workshop](./enduser-workshop) |
| **Mod developers** | Build mods, hooks, configuration, debugging | [Mod developers (hub)](../mod-developers/overview) · [Framework](/wiki/mods/framework) |
| **Contributors** (repo & framework) | PRs, docs, plugins, CI | [Contributors (workflow)](../contributors/topics-overview) · [Repo inventory](/wiki/contributors/repo-inventory) |
| **Sponsors** | Support, transparency | [Sponsors (hub)](../sponsors/overview) |
## Erfahrungsstufen (alle Rollen)
## Experience levels (all roles)
- [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.
- [Newbies](/wiki/audiences/newbies) — first steps, terminology, safe defaults.
- [Intermediates](/wiki/audiences/intermediates) — workflows, tooling, common pitfalls.
- [Professionals](/wiki/audiences/professionals) — architecture, FFI, performance, release channels.
## Thematische Übersicht
## Thematic overview
- [Topics hub](/wiki/topics/) — Security, Multiplayer, Assets, FFI, Roadmap, Meta.
- [Topics hub](/wiki/topics/) — security, multiplayer, assets, FFI, roadmap, meta.

View File

@@ -6,7 +6,7 @@ description: FAQs, install paths, troubleshooting — entry point for players us
# End users
**Spielerinnen und Spieler** Mods installieren und spielen, ohne am Framework mitzuentwickeln. Überblick über alle Rollen: [By audience](/wiki/guides/players/audiences-overview).
**Players** — install and play with mods without developing the framework. Role overview: [By audience](/wiki/guides/players/audiences-overview).
- [By audience — newbies](/wiki/audiences/newbies)
- [End-user workshop](/wiki/guides/players/enduser-workshop) — install, updates, Workshop

View File

@@ -1,19 +1,19 @@
---
title: Sponsors & support
sidebar_label: Sponsors (hub)
description: Für Unterstützerinnen und UnterstützerSponsoring, Transparenz, Anlaufstellen.
description: For supporterssponsorship, transparency, where to start.
---
# 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).
The community funds infrastructure, tools, and time to maintain documentation and the framework. Use this page if you are a **potential sponsor** (or a player who wants to see where support goes).
## Kurzüberblick
## At a glance
- **GitHub:** [mleem97/gregFramework](https://github.com/mleem97/gregFramework) — Sponsoring- und Community-Richtlinien stehen in `README`, `LICENSE` und `CONTRIBUTING`.
- **Transparenz:** Release-Notes und [Release-Kanäle](/wiki/reference/release-channels) beschreiben, wie Builds verteilt werden.
- **Rechtliches:** [Security & legal](/wiki/topics/security-legal/overview) — verbindliche Texte liegen im Repository, nicht nur im Wiki.
- **GitHub:** [mleem97/gregFramework](https://github.com/mleem97/gregFramework) — sponsorship and community policies are in `README`, `LICENSE`, and `CONTRIBUTING`.
- **Transparency:** Release notes and [Release channels](/wiki/reference/release-channels) describe how builds are distributed.
- **Legal:** [Security & legal](/wiki/topics/security-legal/overview) — binding text lives in the repository, not only in the wiki.
:::note Zielgruppe
Diese Seite richtet sich an **Sponsorinnen, Sponsoren und Fördernde**. Spielerinnen und Spieler finden den Einstieg unter [End users](/wiki/guides/players/overview); Mod-Autoren unter [Mod developers](/wiki/guides/mod-developers/overview); Mitwirkende am Repo unter [Contributors (workflow)](/wiki/guides/contributors/topics-overview).
:::note Audience
This page is for **sponsors and supporters**. Players start at [End users](/wiki/guides/players/overview); mod authors at [Mod developers](/wiki/guides/mod-developers/overview); repo contributors at [Contributors (workflow)](/wiki/guides/contributors/topics-overview).
:::

View File

@@ -1,47 +1,29 @@
---
id: intro
title: gregFramework documentation
title: Documentation
slug: /docs
description: Entry point for the split-repo workspace — core, mods, extensions, and this wiki.
description: Help for Data Center players using mods — install, Workshop, troubleshooting. Technical docs for authors are separated.
---
This documentation describes the **current split layout**: a local `gregFramework/` workspace with separate repositories for **core**, **mods**, **extensions**, and **wiki**. It is written for **players**, **mod developers**, **contributors**, and **sponsors**.
# Welcome
## Who is this for?
**gregFramework** is the modding stack for *Data Center*. If you **play with mods**, you only need a short path: install, browse the Workshop, and fix common issues.
| Audience | Start here |
|----------|------------|
| **Players** — install, play, troubleshoot | [End users (hub)](./guides/players/overview.md) · [End-user workshop](./guides/players/enduser-workshop.md) |
| **Mod developers** — build mods, hooks, debugging | [Mod developers (hub)](./guides/mod-developers/overview.md) · [Framework](./mods/framework.md) · [FMF hooks](/wiki/framework/fmf-hooks) |
| **Contributors** — PRs, docs, plugins, CI | [Contributors (workflow)](./guides/contributors/topics-overview.md) · [Contributor workshop](./guides/contributors/contributor-workshop.md) |
| **Sponsors** — support & transparency | [Sponsors (hub)](./guides/sponsors/overview.md) · [GitHub Sponsors](https://github.com/sponsors) (project policies in repo `LICENSE` / `CONTRIBUTING`) |
## Players — start here
**Experience tracks** (newbies → pros): [By audience](./guides/players/audiences-overview.md) → [Newbies](/wiki/audiences/newbies), [Intermediates](/wiki/audiences/intermediates), [Professionals](/wiki/audiences/professionals).
1. **[End users](/wiki/guides/players/overview)** — install, update, troubleshooting
2. **[WorkshopManager guide](/wiki/guides/players/enduser-workshop)** — browse and install mods
3. **[Release channels](/wiki/reference/release-channels)** — Steam Workshop vs GitHub
4. **[WorkshopManager (tool)](/wiki/tools/workshop-uploader)** — desktop app for Workshop content
## Repository hub
[**Mod catalog**](/mods) lists modules with links to docs and downloads.
- [Workspace map](./workspace/index.mdx) — how folders map to repos
- Core: `gregCore/` (`framework/FrikaMF`, `mcp-server/`, `bridges/gregSta.RustBridge/`)
- Mods: `gregMod.<Name>/` (split repos, directly under `gregFramework/`)
- Extensions (FFM plugins): `gregExt.<Name>/` (split repos, directly under `gregFramework/`)
- Workshop app: `gregModmanager/` (Gregtools Modmanager — `WorkshopUploader.exe`)
- Exporter / templates: `gregDataCenterExporter/`
- Wiki: `gregWiki/` (this site)
## Mod authors, plugins, and repo work
## Hooks and releases
Everything for **building mods**, **FFM plugins**, hooks, CI, and **contributing** lives in one place:
- [FMF hook naming](./reference/fmf-hook-naming.md) — `FMF.<Domain>.…` and legacy `FFM.*`
- [FMF hooks catalog](./reference/fmf-hooks-catalog.md) — generated from core `HookNames.cs`
- [Release channels](./reference/release-channels.md) — Steam Workshop vs GitHub (beta)
- [MCP server](./reference/mcp-server.md) — optional LLM/IDE tooling over docs + `fmf_hooks.json`
**[Developers & contributors →](/wiki/developers)**
## Layout (contributors)
Technical docs follow one stack model: **ModManager (MAUI) → framework / SDK → plugins → mods** — explained in **[System architecture & documentation principles](/wiki/meta/system-architecture-principles)**.
- [Repo inventory](./contributors/repo-inventory.md) — project and repository overview
- Split naming: `gregMod.<Name>`, `gregExt.<Name>`, `gregSta.<Name>` (Rust bridge repo), plus apps like `gregModmanager/`, `gregDataCenterExporter/`, `gregIPAM/`, `gregStore/`
## Source model
- **Authoring:** Markdown/MDX lives in the **gregWiki** repository.
- **Technical source of truth:** runtime and bridge details come from **gregCore**.
- **Rust bridge:** `gregCore/bridges/gregSta.RustBridge/`.
Do not use the sidebars technical sections unless you are developing — the default view stays short on purpose.

View File

@@ -0,0 +1,67 @@
---
title: System architecture & documentation principles
sidebar_label: Architecture principles
description: Canonical stack model (ModManager → Framework → Plugins → Mods), priorities, and how wiki pages should align.
---
# System architecture & documentation principles
This page is the **canonical reference** for how gregFramework documentation describes the stack: **ModManager (MAUI) → modding framework / SDK → plugins → mods**, plus priorities (stability first), the hook-proxy idea, and **authoring rules**. All wiki content must be written in **English** only.
Detail pages (individual mods, plugins, releases) should align with this model without repeating the full narrative each time — **link here** for the big picture.
## Layer model (target architecture)
Describe the runtime as a **layered system**, not a flat list of DLLs:
| Layer | Role | Typical workspace artifacts |
|--------|--------|------------------------------|
| **1. ModManager (front-end)** | UI to enable/disable mods and plugins, ordering, configuration, game state (e.g. no save loaded, level loading). Talks to the framework through **well-defined** interfaces (shared library, config files, IPC, named pipes, HTTP — depending on implementation). | `gregModmanager/`**Gregtools Modmanager** (MAUI, e.g. `WorkshopUploader.csproj`). |
| **2. Modding framework / SDK** | Stable API surface for plugins and mods: lifecycle, events, versioning, dependencies, logging, error handling. Hooks Unity / MelonLoader / IL2CPP and **maps** low-level events to **framework events** (hook proxy). | `gregCore/` — e.g. `FrikaMF`, Harmony integration, bridges (e.g. Rust), hook registry. |
| **3. Plugins** | Extend the framework (new services, hook types, optional ModManager UI). Clear extension points. | `FFM.Plugin.*`, repos **`gregExt.<Name>/`**. |
| **4. Mods** | User extensions via the **documented** framework API; avoid direct IL2CPP details where possible; load in isolation; soft-fail on errors. | `FMF.*`, repos **`gregMod.<Name>/`**. |
**Mnemonic:** `ModManager → Framework → Plugins → Mods`.
### Hook proxy and hotloading (concept)
- The framework should map **Unity / IL2CPP events** (MelonLoader hooks, patches) to **stable, named framework events** (e.g. level loaded, scene changed, update) so mods do not couple to concrete Unity signatures.
- **Hotloading** mods is a target state: load only in **safe** states (e.g. no active save, menu), re-bind on level change — exact rules live in framework code and should appear in technical articles **only** when anchored in the repo.
These wiki pages do **not** mandate a specific implementation; they **align** authors and readers on the same vocabulary.
## Technical context (expertise areas)
Documentation and reviews in the gregFramework space typically assume:
- **C# / .NET** (modern language features, best practices)
- **Unity with IL2CPP**
- **MelonLoader** and modular **FMF** / **FFM** stacks
- **.NET MAUI** for the ModManager (deployment, installer, release vs debug issues)
- Debugging, logging, tracing, crash analysis (including outside the IDE)
## Priorities (when trade-offs arise)
When documentation or API design must choose, use this **order**:
1. **Stability and fault tolerance** — faulty mods must not tear down the whole system arbitrarily; clear error paths and logging.
2. **Clean architecture and maintainability** — clear layers, documented interfaces.
3. **Developer experience** — understandable APIs, hooks, logging for mod authors.
4. **Performance and low invasiveness** toward the game.
5. **Extensibility and long-term compatibility** — versioning, dependency rules.
## Rules for wiki authors
- **Terminology:** Always name the layer (ModManager, framework, plugin, mod). Do not conflate “plugin” and “mod” without context.
- **Language:** **English only** for all user-facing documentation in `docs/`, the homepage, and UI strings in this site.
- **Repos:** Keep paths such as `gregCore/`, `gregMod.*`, `gregExt.*`, `gregModmanager/` consistent with the [Workspace map](/wiki/workspace) and [Repository architecture](/wiki/framework/architecture).
- **No invented APIs:** New pages must not promise hooks or events that are not evidenced in core/registry — link to [FMF hooks](/wiki/framework/fmf-hooks) and the [Hooks catalog](/wiki/reference/fmf-hooks-catalog).
- **Cross-links:** Entry [Developers & contributors](/wiki/developers), architecture [Repository architecture](/wiki/framework/architecture), language rule [Modding language (C# only)](/wiki/reference/modding-language-requirement).
## See also
- [Repository architecture](/wiki/framework/architecture) — multi-repo layout, core, bridges
- [Getting started](/wiki/getting-started) — workspace and build
- [Mods — Framework](/wiki/mods/framework) — runtime from mod authors perspective
- [Plugins overview](/wiki/plugins/) — `FFM.Plugin.*`
- [Mod developers](/wiki/guides/mod-developers/overview)

View File

@@ -101,4 +101,4 @@ Output lands in the standard MelonLoader `Mods/` folder as configured in the `.c
## Sources
- Module path: `gregMod.HexLabelMod/`
- Relatedocs: [`Standalone Mods`](/wiki/legacy/wiki-import/StandaloneMods)
- See also: [Mods overview](/wiki/mods/)

View File

@@ -5,6 +5,8 @@ sidebar_label: Framework
**Language:** mod, plugin, and extension **logic must be written in C#** — see [Modding language (C# only)](/wiki/reference/modding-language-requirement).
**Stack position:** gameplay **mods** sit on top of **plugins** and the **framework SDK**; the **ModManager** (MAUI) is the out-of-game front-end — see [System architecture & documentation principles](/wiki/meta/system-architecture-principles).
The core `FrikaMF` runtime provides:
- Harmony patch integration for gameplay hooks

View File

@@ -6,7 +6,7 @@ description: Standalone MelonLoader gameplay mods (FMF.*) — separate from FFM
# Gameplay mods
These pages document **gameplay mods** (`FMF.*` assemblies). **Source of truth** on disk: split-repo folders **`gregMod.<Name>/`** directly under the gregFramework workspace root (not under a legacy `gregMods/` umbrella). They are **not** the same as [FFM plugins](../plugins/index.md), which extend the framework inside the game process.
These pages document **gameplay mods** (`FMF.*` assemblies)**layer 4** in **ModManager → Framework → Plugins → Mods** ([architecture principles](/wiki/meta/system-architecture-principles)). **Source of truth** on disk: split-repo folders **`gregMod.<Name>/`** directly under the gregFramework workspace root (not under a legacy `gregMods/` umbrella). They are **not** the same as [FFM plugins](../plugins/index.md), which extend the framework inside the game process.
## Mods

View File

@@ -12,4 +12,4 @@ Provides export-focused tooling for asset-related workflows.
## Sources
- Module path: `gregExt.AssetExporter/`
- Overview: [`Standalone Mods`](/wiki/legacy/wiki-import/StandaloneMods)
- See also: [Mods overview](/wiki/mods/)

View File

@@ -12,4 +12,4 @@ Contains **multiplayer / networking** runtime (bridge, sync). **Not** the same a
## Sources
- Module path: `gregExt.Multiplayer/`
- Roadmap context: [`Steamworks P2P Multiplayer Roadmap`](/wiki/legacy/wiki-import/Steamworks-P2P-Multiplayer-Roadmap)
- Roadmap: [Unified roadmap](/wiki/roadmap/unified-roadmap) · [Multiplayer topic](/wiki/topics/multiplayer-and-networking/overview)

View File

@@ -12,4 +12,4 @@ Hosts standalone player-model specific behavior and integration.
## Sources
- Module path: `gregExt.PlayerModels/`
- Debug docs: [`Mod Developer Debug`](/wiki/legacy/wiki-import/Mod-Developer-Debug)
- Debug: [Mod developers (hub)](/wiki/guides/mod-developers/overview)

View File

@@ -12,4 +12,4 @@ Contains **sysadmin-oriented UI** features (Unity UI modernization, mod settings
## Sources
- Module path: `gregExt.Sysadmin/`
- Framework context: [`Framework Features & Use Cases`](/wiki/legacy/wiki-import/Framework-Features-Use-Cases)
- Framework context: [Framework](/wiki/mods/framework)

View File

@@ -12,4 +12,4 @@ Focuses on standalone web UI bridge integration flows.
## Sources
- Module path: `gregExt.WebUIBridge/`
- Reference: [`Web UI Bridge (DC2WEB)`](/wiki/legacy/wiki-import/Web-UI-Bridge)
- Related: [Multiplayer & networking hub](/wiki/topics/multiplayer-and-networking/overview)

View File

@@ -6,7 +6,7 @@ description: FFM.Plugin.* modules that extend the framework runtime — distinct
# Framework plugins (`FFM.Plugin.*`)
These **plugins** ship as `FFM.Plugin.*` assemblies and extend the **framework runtime**. **Source of truth** on disk: one split-repo folder per plugin under the workspace root, named **`gregExt.<Name>/`** (for example `gregExt.AssetExporter/`). Mirrored copies may also exist under `gregCore/plugins/` for solution builds. Deploy built DLLs under the games FMF plugin path (see [Game folder layout](/wiki/topics/meta/game-folder-layout)).
These **plugins** ship as `FFM.Plugin.*` assemblies and extend the **framework runtime** (layer **3** in **ModManager → Framework → Plugins → Mods** — [architecture principles](/wiki/meta/system-architecture-principles)). **Source of truth** on disk: one split-repo folder per plugin under the workspace root, named **`gregExt.<Name>/`** (for example `gregExt.AssetExporter/`). Mirrored copies may also exist under `gregCore/plugins/` for solution builds. Deploy built DLLs under the games FMF plugin path (see [Game folder layout](/wiki/topics/meta/game-folder-layout)).
Gameplay mods (`FMF.*`) are documented under **[Mods](../mods/index.md)** — not here.

View File

@@ -26,5 +26,6 @@ That applies to anything shipped as a **`gregMod.*`**, **`gregExt.*`**, or **`FF
## See also
- [System architecture & documentation principles](/wiki/meta/system-architecture-principles) — stack model and documentation rules
- [Framework](/wiki/mods/framework) — runtime surface for mod authors
- [FMF hook naming](/wiki/reference/fmf-hook-naming)

View File

@@ -6,6 +6,8 @@ description: FFI, hook lists, naming — curated reference for mod and plugin au
# FFI, hooks & Lua
The framework is intended to act as a **hook proxy**: Unity / IL2CPP events are surfaced as **stable framework events** for mods — see [System architecture & documentation principles](/wiki/meta/system-architecture-principles).
- [FMF hooks](/wiki/framework/fmf-hooks) — generated hook surface
- [FMF hooks catalog](/wiki/reference/fmf-hooks-catalog) — strings from core sources
- [FMF hook naming](/wiki/reference/fmf-hook-naming) — `FMF.*` vs legacy `FFM.*`

View File

@@ -8,6 +8,8 @@ description: Thematic index — cross-cutting overviews (assets, multiplayer, se
Documentation is **curated** in this repository: guides, framework articles, reference data (hook catalogs), and contributor workflow — versioned with **gregFramework** and **gregWiki**.
**Stack model:** [System architecture & documentation principles](/wiki/meta/system-architecture-principles) — **ModManager → Framework → Plugins → Mods**, priorities, and author guidelines.
## Quick map
| Area | Start here |

View File

@@ -10,39 +10,39 @@ This page is the **single reference** for where mod-related files live next to t
## 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. |
| Content | Path | Format / notes |
|--------|------|----------------|
| **Mod configuration & sidecars** | `{GameRoot}/UserData/ModCfg/` | **JSON** config files; additional sidecar files (e.g. `custom_employees_hired.txt`) live here so mod-related files stay in one place. |
| **FMF framework plugins** (FFM.Plugin.*) | `{GameRoot}/FMF/Plugins/` | DLLs; **MelonLoader** only scans `{GameRoot}/Mods` by default — see below. |
| **Plugins** (MelonLoader, e.g. ModPathRedirector) | `{GameRoot}/Plugins/` | MelonLoader `Plugins` folder — **MelonPlugin** DLLs only. |
| **Mods** (MelonLoader, e.g. FMF.Mod.*) | `{GameRoot}/Mods/` | MelonLoader `Mods` folder — **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`).
- All **mod-related** configuration and JSON sidecars live under **`UserData/ModCfg`**.
- On first start, missing files are created; on existing installs, older files may be migrated from **`UserData/`** (root) into **`ModCfg/`** when still present.
- Examples: `multiplayer-sync.config.json`, `pluginsync.config.json`.
- Framework metadata (e.g. save-compat stamp) lives under **`UserData/ModCfg/FrikaFM/`** (migrated from `UserData/FrikaFM`).
## FMF/Plugins und MelonLoader
## FMF/Plugins and MelonLoader
**FFM-Plugin-DLLs** liegen kanonisch unter **`{GameRoot}/FMF/Plugins`**. MelonLoader enumeriert **standardmäßig** nur **`Mods/`**. Praktische Optionen:
**FFM plugin DLLs** canonically live under **`{GameRoot}/FMF/Plugins`**. MelonLoader enumerates **`Mods/`** by default. Practical options:
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/...`**.
1. **Also place** (or link) DLLs under **`Mods/`** — common path for automatic loading.
2. Use **subfolders** under `Mods` if your MelonLoader version loads mods from subdirectories (check your ML version).
3. **PluginSync** downloads from the framework land under **`FMF/Plugins/PluginSync/...`**.
## Mods (FMF-basiert)
## Mods (FMF-based)
Normale **MelonLoader-Mods** (einschließlich FMF-Mods) werden wie gewohnt in **`{GameRoot}/Mods/`** installiert.
Standard **MelonLoader mods** (including FMF-based mods) install under **`{GameRoot}/Mods/`** as usual.
## Steam Workshop (Spiel) vs. MelonLoader
## Steam Workshop (game) vs MelonLoader
Das Spiel legt abonnierte Workshop-Inhalte unter **`{GameRoot}/{ExeName}_Data/StreamingAssets/mods/workshop_<PublishedFileId>/WorkshopUploadContent`** ab (nativer `ModLoader`, nicht MelonLoader).
The game stores subscribed Workshop content under **`{GameRoot}/{ExeName}_Data/StreamingAssets/mods/workshop_<PublishedFileId>/WorkshopUploadContent`** (native `ModLoader`, not 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):
- **MelonLoader** scans **`{GameRoot}/Mods`** (including subfolders, depending on settings), **not** arbitrary paths via `Loader.cfg`.
- **UserData:** MelonLoader config lives under **`{GameRoot}/UserData/`** (e.g. **`MelonLoader.cfg`** or, depending on version, **`UserData/MelonLoader/Loader.cfg`** — verify on install). For subfolder loading: **`disable_subfolder_load = false`**, optionally **`disable_subfolder_manifest = true`**.
- **Point Workshop DLLs into Melons scan:** use a junction (or symlink) from a folder under **`Mods/`** to the items **`WorkshopUploadContent`** path, e.g. (PowerShell, adjust paths):
```powershell
$game = "C:\Path\To\Data Center"
@@ -52,11 +52,11 @@ $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.
Without a junction, Melon mods must still live physically under **`Mods/`** or be deployed there by your distribution.
**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.
**WorkshopUploader templates (modded):** Under **`content/`**, **`Mods/`**, **`Plugins/`**, and a **`ModFramework/`** tree are created**`ModFramework/FMF/Plugins`** maps to **`{GameRoot}/FMF/Plugins`** if you junction **`FMF`** to **`…/WorkshopUploadContent/ModFramework/FMF`**. Additional framework files (config, assets) can be bundled under **`ModFramework/`**.
## Siehe auch
## See also
- [Meta & operations](/wiki/topics/meta/overview)
- Mod configuration contracts are described alongside runtime docs in [Framework](/wiki/mods/framework) and core `README` in **gregFramework** (paths under **`UserData/ModCfg/`** follow the game + framework conventions above).
- Mod configuration contracts are described with runtime docs in [Framework](/wiki/mods/framework) and the core `README` in **gregFramework** (paths under **`UserData/ModCfg/`** follow the conventions above).

View File

@@ -13,7 +13,7 @@ The **gregFramework** folder groups several repositories (split layout). Use thi
| **Framework core** | `gregCore/` | MelonLoader host (`gregCore/framework/FrikaMF.csproj`), templates, **`gregCore/mcp-server/`**, optional `gregCore/plugins/` mirrors |
| **Gameplay mods** | `gregMod.<Name>/` | Standalone mods (`FMF.*`) — **directly under `gregFramework/`** (the `gregMods/` umbrella is deprecated) |
| **Framework plugins** | `gregExt.<Name>/` | FFM plugins (`FFM.Plugin.*`) — **directly under `gregFramework/`** (the `gregExtensions/` umbrella is deprecated) |
| **Workshop desktop app** | `gregModmanager/` | **Gregtools Modmanager** (MAUI); project file `WorkshopUploader.csproj`, executable **`WorkshopUploader.exe`** |
| **ModManager (MAUI)** | `gregModmanager/` | **Gregtools Modmanager** — grafisches Frontend zur Verwaltung von Mods/Plugins; `WorkshopUploader.csproj`, **`WorkshopUploader.exe`**. Siehe [Architecture principles](/wiki/meta/system-architecture-principles). |
| **Data Center exporter / assets** | `gregDataCenterExporter/` | Templates, exporter tooling, `FrikaModFramework/fmf_hooks.json` (among copies) |
| **Documentation** | `gregWiki/` | This Docusaurus site (`docs/`) |
| **Mod store / web (if cloned)** | `gregStore/` | Private Next.js modstore stack (`web/`, …) — optional sibling repo |

View File

@@ -2,7 +2,7 @@
const config = {
title: 'gregFramework',
tagline: 'Community docs for gregFramework — Data Center mods, FMF plugins, hooks, and split-repo layout',
tagline: 'Player-first help for Data Center mods; full technical docs for authors under Developers.',
favicon: 'img/logo.svg',
url: 'https://frikadellental.de',
baseUrl: '/',
@@ -24,10 +24,9 @@ const config = {
],
i18n: {
defaultLocale: 'en',
locales: ['en', 'de'],
locales: ['en'],
localeConfigs: {
en: {label: 'English', htmlLang: 'en-GB'},
de: {label: 'Deutsch', htmlLang: 'de-DE'},
},
},
presets: [
@@ -204,23 +203,15 @@ const config = {
items: [
{to: '/', label: 'Home', position: 'left'},
{
label: 'Docs Hub',
label: 'Docs',
position: 'left',
items: [
{to: '/wiki', label: 'Overview'},
{to: '/wiki/mods/framework', label: 'Framework'},
{to: '/wiki/plugins/', label: 'Plugins'},
{to: '/wiki/mods/', label: 'Mods'},
{to: '/wiki/roadmap/unified-roadmap', label: 'Roadmap'},
{to: '/wiki/guides/players/overview', label: 'For players'},
{to: '/wiki/developers', label: 'Developers'},
{to: '/mods', label: 'Mod catalog'},
],
},
{
type: 'localeDropdown',
className: 'nav-locale nav-right-icon nav-icon-only',
position: 'right',
dropdownItemsBefore: [],
dropdownItemsAfter: [],
},
{to: '/mods', label: 'Mods', position: 'right', className: 'nav-right-icon nav-icon-only nav-link-mods', 'aria-label': 'Mods'},
{href: 'https://discord.gg/greg', label: 'Discord', position: 'right', className: 'nav-right-icon nav-icon-only nav-link-discord', 'aria-label': 'Discord'},
{href: 'https://github.com/mleem97/gregFramework/issues', label: 'Support', position: 'right', className: 'nav-right-icon nav-icon-only nav-link-support', 'aria-label': 'Support'},
@@ -230,6 +221,14 @@ const config = {
footer: {
style: 'dark',
links: [
{
title: 'Wiki',
items: [
{label: 'Home', to: '/wiki'},
{label: 'For players', to: '/wiki/guides/players/overview'},
{label: 'Developers', to: '/wiki/developers'},
],
},
{
title: 'Community',
items: [
@@ -251,7 +250,7 @@ const config = {
],
},
],
copyright: `Copyright ${new Date().getFullYear()} <a href="https://meyermedia.eu" target="_blank" rel="noopener noreferrer">Meyer Media</a><br/>Dieses Wiki ist ein Community-Projekt und steht in keiner Verbindung zu WASEKU oder dem Spiel selbst.`,
copyright: `Copyright ${new Date().getFullYear()} <a href="https://meyermedia.eu" target="_blank" rel="noopener noreferrer">Meyer Media</a><br/>This wiki is a community project and is not affiliated with WASEKU or the game.`,
},
},
};

View File

@@ -1,51 +0,0 @@
---
title: Erste Schritte
sidebar_label: Erste Schritte
description: "Split-Repo-Workspace: gregFramework-Layout, Core bauen und wo die Doku liegt."
---
Die Struktur ist **Multi-Repo** mit `gregFramework/` als lokalem Wrapper-Ordner. Darin liegen die eigenständigen Repositories, z.B.:
- `gregCore/` — Core-SDK (`gregCore/framework/FrikaMF.csproj`), MCP unter `gregCore/mcp-server/`
- `gregMod.<Name>/` — Gameplay-Mods (`FMF.*`), **flach** neben `gregCore/` (älteres `gregMods/` ist obsolet)
- `gregExt.<Name>/` — Framework-Plugins (`FFM.Plugin.*`), ebenfalls flach (älteres `gregExtensions/` obsolet)
- `gregModmanager/`**Gregtools Modmanager** (WorkshopManager; `WorkshopUploader.csproj`)
- `gregDataCenterExporter/` — Exporter, Templates, Hook-JSON-Spiegel
- `gregWiki/` — diese Dokumentation
Die **Rust**-Bridge liegt unter:
- `gregCore/bridges/gregSta.RustBridge/`
## Core bauen
```text
dotnet build gregCore/FrikaMF.sln -c Release
```
Alternativ in der IDE: `gregCore/FrikaMF.sln` öffnen.
## Hook-Naming
- **Zielkonvention:** `FMF.<DOMAIN>.<Event>` (siehe [`CONTRIBUTING.md`](https://github.com/mleem97/gregFramework/blob/main/CONTRIBUTING.md)).
- **Registry (Beispielpfad):** [`gregDataCenterExporter/FrikaModFramework/fmf_hooks.json`](https://github.com/mleem97/gregFramework/blob/main/gregDataCenterExporter/FrikaModFramework/fmf_hooks.json).
- **Legacy-Runtime-Strings** können noch `FFM.*` in [`HookNames.cs`](https://github.com/mleem97/gregFramework/blob/main/gregCore/framework/FrikaMF/HookNames.cs) nutzen, bis migriert.
## Mod starten
1. Neues Mod-Repo als `gregMod.<Name>/` unter `gregFramework/` anlegen (neben `gregCore/` klonen oder anlegen).
2. Templates aus `gregCore/Templates/` nutzen (Spiegel unter `gregDataCenterExporter/Templates/` wo vorhanden).
3. Hook-Metadaten pflegen und Mod im eigenen Repo versionieren.
## Dokumentations-Site
- **Repo:** `gregWiki/`
- **Inhalt:** Markdown/MDX in diesem Repo, angepasst an den Split-Stand.
### Docker
Im `gregWiki`-Root: `docker build -t gregwiki-docs .` und `docker run --rm -p 3000:3000 gregwiki-docs`.
### MCP
Siehe [`reference/mcp-server`](/wiki/reference/mcp-server) — Implementierung unter **`gregCore/mcp-server/`** (Installation und `--data-root` laut `README.md` dort).

View File

@@ -1,47 +0,0 @@
---
id: intro
title: gregFramework Dokumentation
slug: /docs
description: Einstieg für den Split-Repo-Workspace — Core, Mods, Extensions und dieses Wiki.
---
Diese Dokumentation beschreibt den **aktuellen Split-Stand**: `gregFramework/` als Wrapper mit Einzel-Repositories für **Core**, **Mods**, **Extensions** und **Wiki**. Sie richtet sich an **Spieler**, **Mod-Developer**, **Contributors** und **Sponsoren**.
## Für wen?
| Zielgruppe | Einstieg |
|------------|----------|
| **Spieler** — installieren, spielen, Troubleshooting | [Endnutzer (Hub)](/wiki/guides/players/overview) · [Endnutzer-Workshop](/wiki/guides/players/enduser-workshop) |
| **Moddevs** — Mods bauen, Hooks, Debugging | [Mod-Entwickler (Hub)](/wiki/guides/mod-developers/overview) · [Framework](/wiki/mods/framework) · [FMF-Hooks](/wiki/framework/fmf-hooks) |
| **Contributor** — PRs, Doku, Plugins, CI | [Contributors (Workflow)](/wiki/guides/contributors/topics-overview) · [Contributor-Workshop](/wiki/guides/contributors/contributor-workshop) |
| **Sponsorinnen & Sponsoren** | [Sponsors (Hub)](/wiki/guides/sponsors/overview) · Lizenz & Richtlinien im GitHub-Repo (`LICENSE` / `CONTRIBUTING`) |
**Erfahrungspfade** (Einsteiger → Profis): [Nach Zielgruppe](/wiki/guides/players/audiences-overview) → [Newbies](/wiki/audiences/newbies), [Intermediates](/wiki/audiences/intermediates), [Professionals](/wiki/audiences/professionals).
## Repository-Hub
- [Workspace-Karte](/wiki/workspace/) — Ordner → Repos
- Core: `gregCore/` (`framework/FrikaMF`, `mcp-server/`, `bridges/gregSta.RustBridge/`)
- Mods: `gregMod.<Name>/` (Split-Repos, direkt unter `gregFramework/`)
- Extensions (FFM-Plugins): `gregExt.<Name>/` (Split-Repos, direkt unter `gregFramework/`)
- Workshop-App: `gregModmanager/` (Gregtools Modmanager — `WorkshopUploader.exe`)
- Exporter/Templates: `gregDataCenterExporter/`
- Wiki: `gregWiki/`
## Hooks und Releases
- [FMF Hook-Naming](/wiki/reference/fmf-hook-naming) — `FMF.<Domain>.…` und Legacy `FFM.*`
- [FMF-Hooks-Katalog](/wiki/reference/fmf-hooks-catalog) — generiert aus Core-`HookNames.cs`
- [Release-Kanäle](/wiki/reference/release-channels) — Steam Workshop vs GitHub (Beta)
- [MCP-Server](/wiki/reference/mcp-server) — optionale LLM/IDE-Tools über Doku + `fmf_hooks.json`
## Layout (Contributors)
- [Repo-Inventar](/wiki/contributors/repo-inventory) — Projekt- und Repo-Übersicht
- Split-Konvention: `gregMod.<Name>`, `gregExt.<Name>`, `gregSta.<Name>` (Rust-Bridge-Repo), plus Apps wie `gregModmanager/`, `gregDataCenterExporter/`, `gregIPAM/`, `gregStore/`
## Quellenmodell
- **Authoring:** Inhalte liegen im **gregWiki**-Repo.
- **Technische Wahrheit:** Runtime/Bridge-Details kommen aus **gregCore**.
- **RustBridge:** `gregCore/bridges/gregSta.RustBridge/`.

View File

@@ -1,30 +0,0 @@
---
id: modding-language-requirement
title: Modding-Sprache (nur C#)
slug: /reference/modding-language-requirement
description: Verpflichtende Sprache für Mods, MelonLoader-Plugins und Extensions — ausschließlich C#.
---
# Modding-Sprache (nur C#)
## Vorgabe
**Die gesamte Logik von Mods, MelonLoader-Plugins und Framework-Extensions muss in C# implementiert sein.**
Das gilt für alles, was als **`gregMod.*`**, **`gregExt.*`** oder **`FFM.Plugin.*`** / **`FMF.*`** über MelonLoader / IL2CPP geladen wird: Gameplay, Harmony-Patches, UI, Netzwerk-Hooks und Datenverarbeitung liegen in **C#** (üblicherweise **.NET** passend zur MelonLoader-Version).
## Begründung
- **MelonLoader** lädt verwaltete **.NET**-Assemblies; Harmony und Interop sind auf C# ausgelegt.
- Eine Sprache vereinfacht Review, Debugging und CI für Contributor.
## Was hiervon *nicht* betroffen ist
- Der **Framework-Kern** (`gregCore`) kann weiterhin **Nicht-C#**-Bestandteile enthalten (z. B. **Rust**-FFI unter `gregCore/bridges/gregSta.RustBridge/`, Build-Skripte, Tools). Das ersetzt **nicht** Mod-/Plugin-/Extension-Logik außerhalb von C#.
- **Dokumentation**, **Konfiguration** (JSON/YAML) und **Assets** zählen hier nicht als „Logik“.
- **gregStore**, **gregWiki** und andere Nicht-In-Game-Stacks dürfen andere Sprachen nutzen.
## Siehe auch
- [Framework](/wiki/mods/framework)
- [FMF Hook-Naming](/wiki/reference/fmf-hook-naming)

View File

@@ -1,127 +0,0 @@
---
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**, **visibility**, **tags**, and **preview image**; stored in `metadata.json`.
- **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).
- **Change notes** — when updating an existing item, describe what changed; shown on the Workshop changelog tab.
- **View on Steam** — open your published item in the browser.
- **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, 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).
### Einstellungen
- **Arbeitsbereichspfad** — legt fest, wo Projekte gespeichert werden (Standard: `<GameRoot>/workshop`).
- **Sprache** — Umschalten zwischen EN, DE, RU, ES, IT, JP, PL, CN (Standard: Systemsprache). Der Neustart-Button wendet die Änderung sofort an.
- **Mod-Store-Umschaltung** — Mod-Store-Tab ein-/ausblenden (standardmäßig aus). Neustart-Button enthalten.
- **Community-Links** — Schnellzugriff auf Discord, Modding-Kanal und GregFramework.eu.
### Hinweis zur FMF-Abhängigkeit
- Projekte können im Editor als **„Benötigt FrikaModFramework“** markiert werden. Beim Hochladen wird der Steam-Beschreibung automatisch ein Hinweis angehängt, der Nutzer zum Installieren von FMF auffordert.
## Requirements
- **Windows 10** (Version 1809+).
- **Steam** mit angemeldetem Konto, das **Data Center** besitzt (App-ID **4170200**).
- **Keine weiteren Abhängigkeiten** — die Release-Version ist vollständig eigenständig (enthält .NET-Runtime und Windows App SDK).
- `steam_api64.dll` und `steam_appid.txt` müssen neben der exe liegen (im Release-Build enthalten).
## Workspace path
The workspace is resolved from Steam: `<Data Center install>/workshop`.
Fallback (no Steam): `%USERPROFILE%\DataCenterWS`.
On first launch the app creates the structure and places a sample `metadata.sample.json` under `.templates/`.
## 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:
- `content/Mods/` for MelonLoader mods
- `content/FMF/Plugins/` for FMF plugins
- `content/Object/` and `content/Decoration/` for vanilla assets
3. Optionally create `metadata.json` yourself or fill it in the app.
4. Optionally add `preview.png` at the project root.
## 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 write **change notes** (visible on Steam's changelog).
4. Click **Save and upload to Steam**.
5. The app saves `metadata.json`, uploads `content/` to Steam, then **syncs** by re-downloading Steam's version into your local `content/` folder.
### Headless / CI publish
```bash
WorkshopUploader.exe --mode publish --path <project-folder>
```
## Build and deploy {#build-deploy}
### Eigenständiges Release
Die App wird als **eigenständige** Windows-Executable veröffentlicht — auf dem Zielrechner ist keine Installation von .NET-Runtime oder Windows App SDK erforderlich.
```bash
dotnet publish gregModmanager/WorkshopUploader.csproj -c Release -p:SelfContained=true -p:RuntimeIdentifier=win10-x64
```
Ausgabe: `gregModmanager/bin/Release/net9.0-windows10.0.19041.0/win10-x64/publish/`
### Alle Mods + Gregtools Modmanager in Workshop-Ordner bereitstellen
```bash
pwsh -File scripts/Deploy-Release-ToWorkshop.ps1
```
Dies baut alle Frameworks/Plugins/Mods **und** den WorkshopUploader selbst und packt jedes in einen Steamworks-kompatiblen Projektordner unter `<GameRoot>/workshop/`. Der WorkshopUploader wird als **„Gregtools Modmanager“** verpackt.
### Im Spieleverzeichnis bereitstellen (lokales Testen)
```bash
pwsh -File scripts/Deploy-Release-ToDataCenter.ps1 -IncludeWorkshopUploader
```
## See also
- Repository-README: [`gregModmanager/README.md`](https://github.com/mleem97/gregFramework/blob/main/gregModmanager/README.md) (Produkt **Gregtools Modmanager**; `WorkshopUploader.csproj`)
- [End-User Guide](/wiki/guides/players/enduser-workshop)
- [Contributor Guide](/wiki/guides/contributors/contributor-workshop)
- [Release](/wiki/guides/contributors/release)

View File

@@ -11,8 +11,8 @@
"wiki:sync": "node ./scripts/sync-wiki-to-docs.mjs",
"wiki:normalize-i18n": "node ./scripts/normalize-wiki-import-i18n.mjs",
"wiki:refresh": "node ./scripts/sync-wiki-to-docs.mjs && node ./scripts/normalize-wiki-import-i18n.mjs",
"format": "prettier --write src scripts docusaurus.config.js sidebars.js README.md docs/getting-started/documentation-layout.md package.json .prettierrc.json docker-compose.yml",
"format:check": "prettier --check src scripts docusaurus.config.js sidebars.js README.md docs/getting-started/documentation-layout.md package.json .prettierrc.json docker-compose.yml"
"format": "prettier --write src scripts docusaurus.config.js sidebars.js README.md docs/README.md docs/getting-started/documentation-layout.md package.json .prettierrc.json docker-compose.yml",
"format:check": "prettier --check src scripts docusaurus.config.js sidebars.js README.md docs/README.md docs/getting-started/documentation-layout.md package.json .prettierrc.json docker-compose.yml"
},
"dependencies": {
"@docusaurus/core": "^3.10.0",

View File

@@ -24,13 +24,7 @@ function walk(dir) {
}
}
const roots = [
path.resolve(import.meta.dirname, '../docs/legacy/wiki-import'),
path.resolve(
import.meta.dirname,
'../i18n/de/docusaurus-plugin-content-docs/current/legacy/wiki-import',
),
];
const roots = [path.resolve(import.meta.dirname, '../docs/legacy/wiki-import')];
for (const r of roots) {
if (fs.existsSync(r)) walk(r);
}

View File

@@ -1,164 +1,8 @@
/**
* Split legacy wiki-import pairs (Base.md = DE, Base-en.md = EN) into:
* - docs/legacy/wiki-import/** → default locale (en), Docusaurus
* - i18n/de/.../current/legacy/wiki-import/** → Deutsch
*
* German-only pages (no Base-en.md) → DE in i18n/de, EN stub in docs/legacy/wiki-import.
*
* Usage (from gregWiki repo root):
* node scripts/normalize-wiki-import-i18n.mjs
* node scripts/normalize-wiki-import-i18n.mjs --dry-run
* Legacy: split DE/EN wiki-import pairs. Retired together with docs/legacy/wiki-import/.
*/
import {
existsSync,
mkdirSync,
readFileSync,
readdirSync,
rmSync,
statSync,
writeFileSync,
} from 'node:fs';
import {basename, dirname, join, relative, resolve} from 'node:path';
const repoRoot = resolve(import.meta.dirname, '..');
const docsWikiImport = join(repoRoot, 'docs', 'legacy', 'wiki-import');
const deWikiImport = join(
repoRoot,
'i18n',
'de',
'docusaurus-plugin-content-docs',
'current',
'legacy',
'wiki-import',
console.log(
'[wiki:normalize-i18n] Skipped: legacy wiki-import i18n split is no longer used.\n' +
'Curated docs are English-only under docs/.',
);
const dryRun = process.argv.includes('--dry-run');
function englishStub(title) {
return `---
title: ${title}
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/legacy/wiki-import\`.
:::
`;
}
function ensureDir(p) {
mkdirSync(p, {recursive: true});
}
function walkMarkdownFiles(root, base = root) {
const out = [];
for (const name of readdirSync(root)) {
const full = join(root, name);
const st = statSync(full);
if (st.isDirectory()) {
out.push(...walkMarkdownFiles(full, base));
} else if (st.isFile() && name.toLowerCase().endsWith('.md')) {
out.push(relative(base, full).replace(/\\/g, '/'));
}
}
return out;
}
function toEnSibling(rel) {
if (!rel.endsWith('.md')) return null;
const d = dirname(rel);
const base = basename(rel, '.md');
return d === '.' ? `${base}-en.md` : `${d}/${base}-en.md`;
}
function main() {
if (!existsSync(docsWikiImport)) {
console.error(`Missing ${docsWikiImport}`);
process.exit(1);
}
const allRel = new Set(walkMarkdownFiles(docsWikiImport));
const pairBases = new Set();
const germanOnly = [];
for (const rel of allRel) {
const file = basename(rel);
if (file.endsWith('-en.md')) continue;
const enRel = toEnSibling(rel);
if (enRel && allRel.has(enRel)) {
pairBases.add(rel);
continue;
}
germanOnly.push(rel);
}
// Paired: Base.md + Base-en.md
for (const relBase of pairBases) {
const enRel = toEnSibling(relBase);
const pathBase = join(docsWikiImport, relBase);
const pathEn = join(docsWikiImport, enRel);
const german = readFileSync(pathBase, 'utf8');
const english = readFileSync(pathEn, 'utf8');
const deTarget = join(deWikiImport, relBase);
const enTarget = join(docsWikiImport, relBase);
if (dryRun) {
console.log(`[pair] ${relBase} + ${enRel} → EN docs + DE i18n`);
continue;
}
ensureDir(dirname(deTarget));
writeFileSync(deTarget, german, 'utf8');
writeFileSync(enTarget, english, 'utf8');
rmSync(pathEn);
console.log(`[pair] ${relBase}`);
}
// English-only sibling (Home-en.md without Home.md) — rare
for (const rel of allRel) {
if (!rel.endsWith('-en.md')) continue;
const baseRel = rel.replace(/-en\.md$/, '.md');
if (pairBases.has(baseRel)) continue;
const pathEn = join(docsWikiImport, rel);
const pathBase = join(docsWikiImport, baseRel);
const english = readFileSync(pathEn, 'utf8');
if (dryRun) {
console.log(`[en-only] ${rel}${baseRel}`);
continue;
}
ensureDir(dirname(pathBase));
writeFileSync(pathBase, english, 'utf8');
rmSync(pathEn);
console.log(`[en-only] ${rel}${baseRel}`);
}
// German-only: no Base-en.md (pair bases are excluded from germanOnly)
for (const rel of germanOnly) {
const pathBase = join(docsWikiImport, rel);
const german = readFileSync(pathBase, 'utf8');
const deTarget = join(deWikiImport, rel);
const titleMatch = german.match(/^title:\s*(.+)$/m);
const title = titleMatch ? titleMatch[1].trim().replace(/"/g, '\\"') : basename(rel, '.md');
if (dryRun) {
console.log(`[de-only] ${rel} → i18n/de + EN stub`);
continue;
}
ensureDir(dirname(deTarget));
writeFileSync(deTarget, german, 'utf8');
writeFileSync(pathBase, englishStub(title), 'utf8');
console.log(`[de-only] ${rel}`);
}
console.log(dryRun ? 'Dry run complete.' : 'Done. Next: npm run build');
}
main();
process.exit(0);

View File

@@ -1,50 +1,9 @@
import {existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync} from 'node:fs';
import {join, resolve} from 'node:path';
const projectRoot = resolve(process.cwd());
const gregFrameworkRoot = resolve(projectRoot, '..');
const wikiDir = join(gregFrameworkRoot, '.wiki');
const outDir = join(projectRoot, 'docs', 'legacy', 'wiki-import');
if (!existsSync(wikiDir)) {
console.error(
`Missing ${wikiDir}. Clone or restore the GitHub Wiki working tree there, then re-run this script.\n` +
'Existing files under docs/legacy/wiki-import/ are left unchanged.',
);
process.exit(1);
}
mkdirSync(outDir, {recursive: true});
function collectMarkdownFiles(rootDir, prefix = '') {
const entries = readdirSync(join(rootDir, prefix), {withFileTypes: true});
const results = [];
for (const entry of entries) {
const relativePath = prefix ? join(prefix, entry.name) : entry.name;
if (entry.isDirectory()) {
results.push(...collectMarkdownFiles(rootDir, relativePath));
continue;
}
if (entry.isFile() && entry.name.toLowerCase().endsWith('.md')) {
results.push(relativePath);
}
}
return results;
}
const files = collectMarkdownFiles(wikiDir);
for (const file of files) {
const source = join(wikiDir, file);
const sanitizedRelative = file.replace(/\s+/g, '-');
const target = join(outDir, sanitizedRelative);
const targetDir = resolve(target, '..');
mkdirSync(targetDir, {recursive: true});
const raw = readFileSync(source, 'utf8');
writeFileSync(target, raw, 'utf8');
}
console.log(`Synced ${files.length} wiki files to ${outDir}`);
/**
* Legacy GitHub Wiki → docs/ mirror. Removed: content now lives only under docs/ (curated).
* Keep this script as a no-op so old CI or docs do not reference a missing file.
*/
console.log(
'[wiki:sync] Skipped: the bulk wiki-import under docs/legacy/wiki-import/ was retired.\n' +
'Author and edit Markdown under docs/ in gregWiki; use git history for old mirror text.',
);
process.exit(0);

View File

@@ -17,13 +17,7 @@ const pairs = [
['TechnicalReference/Troubleshooting', 'wiki-import-techref-troubleshooting'],
];
const bases = [
path.resolve(import.meta.dirname, '../docs/legacy/wiki-import'),
path.resolve(
import.meta.dirname,
'../i18n/de/docusaurus-plugin-content-docs/current/legacy/wiki-import',
),
];
const bases = [path.resolve(import.meta.dirname, '../docs/legacy/wiki-import')];
for (const base of bases) {
if (!fs.existsSync(base)) continue;

View File

@@ -4,184 +4,191 @@ const sidebars = {
'intro',
{
type: 'category',
label: 'Getting started',
items: ['getting-started', 'getting-started/documentation-layout'],
},
{
type: 'category',
label: 'Workspace',
items: ['workspace/index'],
},
{
type: 'category',
label: 'Framework',
items: ['framework/architecture', 'framework/fmf-hooks', 'framework/hexmod'],
},
{
type: 'category',
label: 'Plugins (FFM)',
label: 'Play & mods',
collapsed: false,
items: [
'plugins/index',
'plugins/ffm-plugin-asset-exporter',
'plugins/ffm-plugin-multiplayer',
'plugins/ffm-plugin-player-models',
'plugins/ffm-plugin-sysadmin',
'plugins/ffm-plugin-web-ui-bridge',
],
},
{
type: 'category',
label: 'Mods (FMF)',
link: {type: 'doc', id: 'mods/index'},
items: [
'mods/index',
'mods/framework',
'mods/fmf-console-input-guard',
'mods/fmf-gregify-employees',
'mods/fmf-hex-label-mod',
'mods/fmf-lang-compat-bridge',
'mods/fmf-ui-replacement-mod',
],
},
{
type: 'category',
label: 'Tools & operations',
items: [
'tools/workshop-uploader',
'meta/Steam-Workshop-and-Tooling',
'meta/devserver-betas',
'meta/IDEA_BACKLOG',
],
},
{
type: 'category',
label: 'Guides',
items: [
{
type: 'category',
label: 'Players',
key: 'guides-players',
items: [
'guides/players/overview',
'guides/players/audiences-overview',
'guides/players/newbies',
'guides/players/intermediates',
'guides/players/professionals',
'guides/players/enduser-workshop',
],
},
{
type: 'category',
label: 'Mod developers',
key: 'guides-mod-developers',
items: ['guides/mod-developers/overview'],
},
{
type: 'category',
label: 'Contributors',
key: 'guides-contributors',
items: [
'guides/contributors/topics-overview',
'guides/contributors/contributor-workshop',
'guides/contributors/release',
],
},
{
type: 'category',
label: 'Sponsors',
key: 'guides-sponsors',
items: ['guides/sponsors/overview'],
},
],
},
{
type: 'category',
label: 'Releases',
link: {type: 'doc', id: 'releases/index'},
items: [
{
type: 'category',
label: 'Plugin releases',
items: [
'releases/plugins/ffm-plugin-asset-exporter-release',
'releases/plugins/ffm-plugin-multiplayer-release',
'releases/plugins/ffm-plugin-player-models-release',
'releases/plugins/ffm-plugin-sysadmin-release',
'releases/plugins/ffm-plugin-web-ui-bridge-release',
'releases/plugins/fmf-modpathredirector-release',
],
},
{
type: 'category',
label: 'Tool releases',
items: ['releases/tools/gregtools-modmanager-1.0-release'],
},
{
type: 'category',
label: 'Mod releases',
items: [
'releases/mods/fmf-console-input-guard-release',
'releases/mods/fmf-gregify-employees-release',
'releases/mods/fmf-hex-label-mod-release',
'releases/mods/fmf-lang-compat-bridge-release',
'releases/mods/fmf-ui-replacement-mod-release',
],
},
],
},
{
type: 'category',
label: 'Reference',
items: [
'reference/wiki-mapping',
'reference/mod-store-vision',
'reference/fmf-hook-naming',
'reference/fmf-hooks-catalog',
'reference/mcp-server',
'guides/players/overview',
'guides/players/enduser-workshop',
'reference/release-channels',
'reference/reference-data-files',
],
},
'tools/workshop-uploader',
{
type: 'category',
label: 'Contributors (workflow)',
label: 'Developers & contributors',
collapsed: true,
link: {type: 'doc', id: 'developers'},
items: [
'contributors/repo-inventory',
'contributors/monorepo-target-layout',
'contributors/luminescent-design-system',
'contributors/docusaurus-workflow',
'contributors/plugin-submission-audit',
'contributors/sponsorship-automation',
],
},
{
type: 'category',
label: 'Roadmap',
items: ['roadmap/unified-roadmap', 'roadmap/mod-store-stages'],
},
{
type: 'category',
label: 'Topics hub',
link: {type: 'doc', id: 'topics/index'},
items: [
'topics/index',
'developers',
'meta/system-architecture-principles',
'getting-started',
'getting-started/documentation-layout',
'workspace/index',
{
type: 'category',
label: 'Cross-cutting topics',
label: 'Framework',
items: ['framework/architecture', 'framework/fmf-hooks', 'framework/hexmod'],
},
{
type: 'category',
label: 'Plugins (FFM)',
items: [
'topics/assets-and-export/overview',
'topics/multiplayer-and-networking/overview',
'topics/ffi-and-hooks/overview',
'topics/security-legal/overview',
'topics/reference/overview',
'topics/roadmap/overview',
'topics/meta/overview',
'topics/meta/game-folder-layout',
'plugins/index',
'plugins/ffm-plugin-asset-exporter',
'plugins/ffm-plugin-multiplayer',
'plugins/ffm-plugin-player-models',
'plugins/ffm-plugin-sysadmin',
'plugins/ffm-plugin-web-ui-bridge',
],
},
{
type: 'category',
label: 'Mods (FMF)',
link: {type: 'doc', id: 'mods/index'},
items: [
'mods/index',
'mods/framework',
'mods/fmf-console-input-guard',
'mods/fmf-gregify-employees',
'mods/fmf-hex-label-mod',
'mods/fmf-lang-compat-bridge',
'mods/fmf-ui-replacement-mod',
],
},
{
type: 'category',
label: 'Tools & operations',
items: [
'meta/Steam-Workshop-and-Tooling',
'meta/devserver-betas',
'meta/IDEA_BACKLOG',
],
},
{
type: 'category',
label: 'Guides',
items: [
{
type: 'category',
label: 'Players (extra)',
items: [
'guides/players/audiences-overview',
'guides/players/newbies',
'guides/players/intermediates',
'guides/players/professionals',
],
},
{
type: 'category',
label: 'Mod developers',
items: ['guides/mod-developers/overview'],
},
{
type: 'category',
label: 'Contributors',
items: [
'guides/contributors/topics-overview',
'guides/contributors/contributor-workshop',
'guides/contributors/release',
],
},
{
type: 'category',
label: 'Sponsors',
items: ['guides/sponsors/overview'],
},
],
},
{
type: 'category',
label: 'Releases',
link: {type: 'doc', id: 'releases/index'},
items: [
{
type: 'category',
label: 'Plugin releases',
items: [
'releases/plugins/ffm-plugin-asset-exporter-release',
'releases/plugins/ffm-plugin-multiplayer-release',
'releases/plugins/ffm-plugin-player-models-release',
'releases/plugins/ffm-plugin-sysadmin-release',
'releases/plugins/ffm-plugin-web-ui-bridge-release',
'releases/plugins/fmf-modpathredirector-release',
],
},
{
type: 'category',
label: 'Tool releases',
items: ['releases/tools/gregtools-modmanager-1.0-release'],
},
{
type: 'category',
label: 'Mod releases',
items: [
'releases/mods/fmf-console-input-guard-release',
'releases/mods/fmf-gregify-employees-release',
'releases/mods/fmf-hex-label-mod-release',
'releases/mods/fmf-lang-compat-bridge-release',
'releases/mods/fmf-ui-replacement-mod-release',
],
},
],
},
{
type: 'category',
label: 'Reference',
items: [
'reference/wiki-mapping',
'reference/mod-store-vision',
'reference/fmf-hook-naming',
'reference/fmf-hooks-catalog',
'reference/mcp-server',
'reference/reference-data-files',
'reference/modding-language-requirement',
],
},
{
type: 'category',
label: 'Contributors (workflow)',
items: [
'contributors/repo-inventory',
'contributors/monorepo-target-layout',
'contributors/luminescent-design-system',
'contributors/docusaurus-workflow',
'contributors/plugin-submission-audit',
'contributors/sponsorship-automation',
],
},
{
type: 'category',
label: 'Roadmap',
items: ['roadmap/unified-roadmap', 'roadmap/mod-store-stages'],
},
{
type: 'category',
label: 'Topics hub',
link: {type: 'doc', id: 'topics/index'},
items: [
'topics/index',
{
type: 'category',
label: 'Cross-cutting topics',
items: [
'topics/assets-and-export/overview',
'topics/multiplayer-and-networking/overview',
'topics/ffi-and-hooks/overview',
'topics/security-legal/overview',
'topics/reference/overview',
'topics/roadmap/overview',
'topics/meta/overview',
'topics/meta/game-folder-layout',
],
},
],
},
'SPONSORS',
],
},
'SPONSORS',
],
};

View File

@@ -431,7 +431,11 @@ body {
/* Doc canvas — editorial bleed (wiki layout alignment); no hard section borders */
.theme-doc-wrapper {
background: linear-gradient(180deg, var(--color-surface-container-low) 0%, var(--color-background) 42%);
background: linear-gradient(
180deg,
var(--color-surface-container-low) 0%,
var(--color-background) 42%
);
}
.theme-doc-root .theme-doc-sidebar-container {
@@ -576,7 +580,9 @@ body {
flex-shrink: 0;
opacity: 0.85;
color: rgba(192, 252, 246, 0.45);
transition: color 0.2s ease, opacity 0.2s ease;
transition:
color 0.2s ease,
opacity 0.2s ease;
}
.footer__link-item:hover .footer-icon-svg {

View File

@@ -97,7 +97,8 @@ export const moduleCatalog: ModuleEntry[] = [
name: 'FMF.ModPathRedirector',
repoFolder: 'gregMod.PathRedirector',
type: 'plugin',
description: 'MelonLoader plugin: waits for each subscribed Workshop item (Steam + StreamingAssets/Mods/workshop_*) before MelonMods load.',
description:
'MelonLoader plugin: waits for each subscribed Workshop item (Steam + StreamingAssets/Mods/workshop_*) before MelonMods load.',
version: '1.5.0',
author: 'DataCenterExporter / gregFramework Community',
languages: ['C#'],

View File

@@ -1,54 +0,0 @@
import type { HomepageContent } from './types';
import { homepageShellDe } from './sharedLinks';
export const de: HomepageContent = {
...homepageShellDe,
heroLine1: 'DATACENTER MODDING HUB.',
heroLine2: 'SEI SMART WIE GREG.',
heroSub1: 'Klar. Flexibel. Community-getrieben.',
heroSub2: 'gregFramework, Rust-Stacks, Multiplayer und Plugins.',
ctaStart: 'MODDING STARTEN',
ctaMods: 'VERFÜGBARE STANDALONE MODS & PLUGINS',
docsPaths: 'Dokumentationspfade',
featureTitles: ['Dual-Track Modding', 'Runtime Hook Bridge', 'Wiki-basierte Doku', 'Community-Ökosystem'],
featureDescriptions: [
'Baue Mods direkt in C# oder nativ in Rust via C-ABI/FFI.',
'Harmony-Patches, Event-IDs und deterministische Hook-Weiterleitung.',
'Source of truth aus .wiki mit Enduser- und Moddev-Pfaden.',
'Core-Framework-Doku plus Standalone-Plugin- und Ökosystem-Doku.',
],
comingSoon: 'Kommt bald',
comingSoonText: '`datacentermods.com` wird gerade vorbereitet. Bis zum Launch findest du alles unter `Docs Hub → Standalone Mods`.',
communityTitle: 'Community & Maintainer',
communityText: 'Dieses Portal bündelt gregFramework-Doku und Community-Plugins für das Data-Center-Ökosystem.',
docsEndUserTitle: 'Endnutzer',
docsEndUserDescription: 'Installation, Updates, FAQ und Fehlerbehebung.',
docsModDevsTitle: 'Mod-Entwickler',
docsModDevsDescription: 'Debug-Workflows, Setup, Hooks und Referenzen.',
docsContributorsTitle: 'Mitwirkende',
docsContributorsDescription: 'Konventionen, CI-Checks und Contribution-Workflow.',
docsCapabilityTitle: 'Capability Matrix',
docsCapabilityDescription: 'Komplette Feature-Übersicht und konkrete Use Cases.',
ecosystemTitle: 'Ecosystem Coverage',
ecosystemCoreTitle: 'gregFramework Core',
ecosystemCoreDescription: 'Hook-System, FFI-Bridge, Event-Verträge und Runtime-Architektur.',
ecosystemCoreCta: 'Core-Doku öffnen →',
ecosystemRustTitle: 'Standalone Rust',
ecosystemRustDescription: 'Rust/FFI-Implementierungsleitfäden für externe und standalone Runtimes.',
ecosystemRustCta: 'Rust/FFI-Doku öffnen →',
ecosystemMultiplayerTitle: 'Multiplayer & Plugins',
ecosystemMultiplayerDescription: 'Multiplayer-Roadmap, Plugin-Doku und Community-Modul-Referenzen.',
ecosystemMultiplayerCta: 'Multiplayer-Doku öffnen →',
gregTitle: 'Die Legende von Greg',
gregText1:
'Greg ist der unermüdliche Server-Techniker des Projekts. Er wirkt zwar so, als hätte er seit Monaten nicht mehr geschlafen, und er ist meistens still — aber sobald ein Rack ausfällt oder ein Mod zickt, ist Greg schon da.',
gregText2:
'Unterwürfig erfüllt er all deine Wünsche: mehr Uptime, sauberere Configs, bessere Logs und weniger Drama im Deployment. Er fragt nicht viel, er liefert einfach.',
gregQuote: '"Be smart. Be like Greg."',
supportTitle: 'Support',
supportText: 'Melde Bugs, fordere Doku für neue Community-Plugins an und verfolge Workstreams.',
supportCta: 'GitHub Issues öffnen',
availableModsLabel: 'Verfügbare Mods',
repositoryLabel: 'Repository',
joinLabel: 'BEITRETEN',
};

View File

@@ -5,20 +5,21 @@ export const en: HomepageContent = {
...homepageShellEn,
heroLine1: 'DATACENTER MODDING HUB.',
heroLine2: 'SMART LIKE GREG.',
heroSub1: 'Streamlined. Flexible. Community-curated.',
heroSub2: 'gregFramework, Rust stacks, multiplayer, and plugins.',
ctaStart: 'START MODDING',
ctaMods: 'AVAILABLE STANDALONE MODS & PLUGINS',
heroSub1: 'Install mods, use the Workshop, fix common issues — without digging through engine docs.',
heroSub2: 'Technical reference for authors lives under Developers in the wiki.',
ctaStart: 'HELP FOR PLAYERS',
ctaMods: 'MOD CATALOG',
docsPaths: 'Documentation paths',
featureTitles: ['Dual-track modding', 'Runtime hook bridge', 'Wiki-driven docs', 'Community ecosystem'],
featureTitles: ['Play with mods', 'Workshop & updates', 'Clear docs', 'Community'],
featureDescriptions: [
'Build mods in C# or natively in Rust via C-ABI/FFI.',
'Harmony patches, event IDs, and deterministic hook forwarding.',
'Source of truth from .wiki with end-user and mod-dev paths.',
'Core framework docs plus standalone plugin and ecosystem docs.',
'Step-by-step paths for installing and troubleshooting — no repo jargon on day one.',
'WorkshopManager and release channels explain where builds come from.',
'Player pages are short; author pages stay under one Developers section.',
'Discord and GitHub for help — framework internals only when you need them.',
],
comingSoon: 'Coming soon',
comingSoonText: '`datacentermods.com` is in preparation. Until launch, use `Docs Hub → Standalone Mods`.',
comingSoonText:
'`datacentermods.com` is in preparation. Until launch, use the wiki **For players** and the **Mod catalog**.',
communityTitle: 'Community & maintainers',
communityText: 'This portal is designed for gregFramework docs and community-built plugins across the Data Center ecosystem.',
docsEndUserTitle: 'End-user',

View File

@@ -1,25 +1,8 @@
import { de } from './de';
import { en } from './en';
import type { HomepageContent, LocaleKey } from './types';
import {en} from './en';
import type {HomepageContent} from './types';
const homepageByLocale: Record<LocaleKey, HomepageContent> = {
en,
de,
};
export type {HomepageContent, LocaleKey} from './types';
export type { HomepageContent, LocaleKey } from './types';
export function getHomepageContent(locale: string): HomepageContent {
const normalizedLocale = (locale || 'en').toLowerCase();
const languageOnly = normalizedLocale.split('-')[0] as LocaleKey;
if (normalizedLocale in homepageByLocale) {
return homepageByLocale[normalizedLocale as LocaleKey];
}
if (languageOnly in homepageByLocale) {
return homepageByLocale[languageOnly];
}
return homepageByLocale.en;
export function getHomepageContent(_locale: string): HomepageContent {
return en;
}

View File

@@ -1,122 +1,81 @@
import type { HomepageContent, HomepageDocLink } from './types';
import type {HomepageContent, HomepageDocLink} from './types';
/** English link hub — reused for locales without dedicated translations. */
/** Player-first links — technical docs live under /wiki/developers */
export const sharedKnowledgeLinksEn: HomepageDocLink[] = [
{ title: 'Wiki Overview', description: 'Canonical docs entry under /wiki.', link: '/wiki' },
{title: 'Wiki home', description: 'Short entry — players vs developers.', link: '/wiki'},
{
title: 'Framework Core',
description: 'Runtime hooks, bridge, events, and architecture.',
link: '/wiki/mods/framework',
},
{
title: 'Plugins (FFM)',
description: 'FFM.Plugin.* docs and release pages.',
link: '/wiki/plugins/',
},
{ title: 'Mods (FMF)', description: 'Gameplay mods, releases, and module docs.', link: '/wiki/mods/' },
{
title: 'FMF Hooks Catalog',
description: 'Hook strings and event IDs generated from core sources.',
link: '/wiki/reference/fmf-hooks-catalog',
},
{
title: 'Release Channels',
description: 'Steam Workshop vs GitHub for discovery and betas.',
link: '/wiki/reference/release-channels',
},
{
title: 'Unified Roadmap',
description: 'Consolidated planning with duplicate tracks removed.',
link: '/wiki/roadmap/unified-roadmap',
},
{ title: 'Mods Catalog', description: 'Dynamic /mods page with wiki and download links.', link: '/mods' },
];
export const sharedWorkflowLinksEn: HomepageDocLink[] = [
{
title: 'End-user docs',
description: 'Install, update, and troubleshooting paths.',
title: 'For players',
description: 'Install, update, troubleshooting.',
link: '/wiki/guides/players/overview',
},
{
title: 'Mod developer docs',
description: 'Setup, debugging, and hook integration.',
title: 'WorkshopManager',
description: 'Browse and install Workshop mods.',
link: '/wiki/guides/players/enduser-workshop',
},
{
title: 'Release channels',
description: 'Steam Workshop vs GitHub for builds.',
link: '/wiki/reference/release-channels',
},
{title: 'Mod catalog', description: 'Modules with docs and download links.', link: '/mods'},
];
/** Authors & contributors — one hop to the full technical tree */
export const sharedWorkflowLinksEn: HomepageDocLink[] = [
{
title: 'Developers (hub)',
description: 'Framework, mods, plugins, reference, roadmap — all technical links.',
link: '/wiki/developers',
},
{
title: 'Mod developer guide',
description: 'Hooks, setup, and workflow entry.',
link: '/wiki/guides/mod-developers/overview',
},
{
title: 'Repo inventory',
description: 'Split-repo layout and drift notes for contributors.',
link: '/wiki/contributors/repo-inventory',
},
{
title: 'Contributor workflow',
description: 'Standards, CI, and documentation workflow.',
description: 'Docs site and repo conventions.',
link: '/wiki/contributors/docusaurus-workflow',
},
{
title: 'Plugin security audit',
description: 'Submission and malicious-code review process.',
link: '/wiki/contributors/plugin-submission-audit',
},
];
export const sharedKnowledgeLinksDe: HomepageDocLink[] = [
{ title: 'Wiki-Übersicht', description: 'Einstieg unter /wiki.', link: '/wiki' },
{title: 'Wiki-Start', description: 'Kurzüberblick — Spieler vs. Entwickler.', link: '/wiki'},
{
title: 'Framework-Core',
description: 'Runtime-Hooks, Bridge, Events und Architektur.',
link: '/wiki/mods/framework',
title: 'Für Spieler',
description: 'Installation, Updates, Fehlerbehebung.',
link: '/wiki/guides/players/overview',
},
{
title: 'Plugins (FFM)',
description: 'FFM.Plugin.*-Doku und Release-Seiten.',
link: '/wiki/plugins/',
},
{ title: 'Mods (FMF)', description: 'Gameplay-Mods, Releases und Modul-Doku.', link: '/wiki/mods/' },
{
title: 'FMF-Hooks-Katalog',
description: 'Hook-Strings und Event-IDs aus den Core-Quellen.',
link: '/wiki/reference/fmf-hooks-catalog',
title: 'WorkshopManager',
description: 'Workshop-Mods suchen und installieren.',
link: '/wiki/guides/players/enduser-workshop',
},
{
title: 'Release-Kanäle',
description: 'Steam Workshop vs GitHub für Discovery und Betas.',
description: 'Steam Workshop vs GitHub.',
link: '/wiki/reference/release-channels',
},
{
title: 'Einheitliche Roadmap',
description: 'Zusammengeführte Planung ohne doppelte Tracks.',
link: '/wiki/roadmap/unified-roadmap',
},
{ title: 'Mods-Katalog', description: 'Dynamische /mods-Seite mit Wiki- und Download-Links.', link: '/mods' },
{title: 'Mod-Katalog', description: 'Module mit Doku- und Download-Links.', link: '/mods'},
];
export const sharedWorkflowLinksDe: HomepageDocLink[] = [
{
title: 'Endnutzer-Doku',
description: 'Installation, Updates und Fehlerbehebung.',
link: '/wiki/guides/players/overview',
title: 'Entwickler (Hub)',
description: 'Framework, Mods, Plugins, Referenz — alle technischen Links.',
link: '/wiki/developers',
},
{
title: 'Mod-Entwickler-Doku',
description: 'Setup, Debugging und Hook-Integration.',
title: 'Mod-Entwickler-Guide',
description: 'Hooks, Setup, Einstieg.',
link: '/wiki/guides/mod-developers/overview',
},
{
title: 'Repo-Inventar',
description: 'Split-Repo-Layout und Drift-Hinweise.',
link: '/wiki/contributors/repo-inventory',
},
{
title: 'Contributor-Workflow',
description: 'Standards, CI und Doku-Workflow.',
description: 'Doku-Site und Repo-Konventionen.',
link: '/wiki/contributors/docusaurus-workflow',
},
{
title: 'Plugin-Security-Audit',
description: 'Einreichung und Review auf Schadcode.',
link: '/wiki/contributors/plugin-submission-audit',
},
];
export const homepageShellEn: Pick<
@@ -137,13 +96,13 @@ export const homepageShellEn: Pick<
heroBadge: 'gregFramework · docs live',
heroBrandLine1: 'greg',
heroBrandLine2Gradient: 'Framework',
knowledgeSectionTitle: 'Knowledge architecture',
workflowSectionTitle: 'Workflows',
codeSectionTitle: 'Engineered for mod authors',
knowledgeSectionTitle: 'Players — start here',
workflowSectionTitle: 'Authors & contributors',
codeSectionTitle: 'Building on gregFramework',
codeSectionLead:
'C# mods on MelonLoader, FMF plugins, and optional Rust FFI bridges — one documentation hub, versioned with the split repos.',
ctaDiscordTitle: 'Build with the community',
ctaDiscordLead: 'Ask questions, share mods, and follow framework releases alongside core development.',
'C# mods on MelonLoader, FFM plugins, and optional Rust bridges — details for authors are under Developers.',
ctaDiscordTitle: 'Community',
ctaDiscordLead: 'Questions about playing or building — ask in Discord.',
ctaDiscordButton: 'Join Discord',
knowledgeLinks: sharedKnowledgeLinksEn,
workflowLinks: sharedWorkflowLinksEn,
@@ -167,13 +126,13 @@ export const homepageShellDe: Pick<
heroBadge: 'gregFramework · Live-Dokumentation',
heroBrandLine1: 'greg',
heroBrandLine2Gradient: 'Framework',
knowledgeSectionTitle: 'Wissensarchitektur',
workflowSectionTitle: 'Arbeitsabläufe',
codeSectionTitle: 'Für Mod-Autoren gebaut',
knowledgeSectionTitle: 'Spieler — Einstieg',
workflowSectionTitle: 'Autoren & Contributors',
codeSectionTitle: 'Auf gregFramework aufbauen',
codeSectionLead:
'C#-Mods auf MelonLoader, FMF-Plugins und optionale Rust-FFI-Brücken — ein Dokumentations-Hub, versioniert mit den Split-Repos.',
ctaDiscordTitle: 'Mit der Community bauen',
ctaDiscordLead: 'Fragen stellen, Mods teilen und Releases parallel zur Core-Entwicklung verfolgen.',
'C#-Mods auf MelonLoader, FFM-Plugins, optionale Rust-Brücken — Details für Autoren unter Entwickler.',
ctaDiscordTitle: 'Community',
ctaDiscordLead: 'Fragen zum Spielen oder Bauen — im Discord.',
ctaDiscordButton: 'Discord beitreten',
knowledgeLinks: sharedKnowledgeLinksDe,
workflowLinks: sharedWorkflowLinksDe,

View File

@@ -1,4 +1,4 @@
export type LocaleKey = 'en' | 'de';
export type LocaleKey = 'en';
export type HomepageDocLink = {
title: string;

View File

@@ -1,5 +1,3 @@
import type { LocaleKey } from './homepage/types';
export type ModsPageStrings = {
title: string;
description: string;
@@ -13,36 +11,20 @@ export type ModsPageStrings = {
legacyNoSplitRepo: string;
};
const byLocale: Record<LocaleKey, ModsPageStrings> = {
en: {
title: 'Mods & plugins catalog',
description:
'Generated from the module catalog. Each entry links to its wiki article, release page, and download route.',
pluginsHeading: 'Plugins',
modsHeading: 'Mods',
wiki: 'Wiki',
release: 'Release',
download: 'Download DLL',
notReleased: 'Not released yet',
repoFolder: 'gregFramework folder',
legacyNoSplitRepo: 'Legacy — no split repo in workspace',
},
de: {
title: 'Mods- & Plugin-Katalog',
description:
'Aus dem Modul-Katalog erzeugt. Jeder Eintrag verweist auf Wiki, Release-Seite und Download-Route.',
pluginsHeading: 'Plugins',
modsHeading: 'Mods',
wiki: 'Wiki',
release: 'Release',
download: 'DLL laden',
notReleased: 'Noch nicht veröffentlicht',
repoFolder: 'Ordner unter gregFramework',
legacyNoSplitRepo: 'Legacy — kein Split-Repo im Workspace',
},
const strings: ModsPageStrings = {
title: 'Mods & plugins catalog',
description:
'Generated from the module catalog. Each entry links to its wiki article, release page, and download route.',
pluginsHeading: 'Plugins',
modsHeading: 'Mods',
wiki: 'Wiki',
release: 'Release',
download: 'Download DLL',
notReleased: 'Not released yet',
repoFolder: 'gregFramework folder',
legacyNoSplitRepo: 'Legacy — no split repo in workspace',
};
export function getModsPageStrings(locale: string): ModsPageStrings {
const languageOnly = (locale || 'en').toLowerCase().split('-')[0] as LocaleKey;
return byLocale[languageOnly] ?? byLocale.en;
export function getModsPageStrings(_locale: string): ModsPageStrings {
return strings;
}

View File

@@ -69,7 +69,7 @@ export default function HomePage(): JSX.Element {
return (
<Layout
title="Home"
description="Community documentation for gregFramework — Data Center modding, plugins, and hooks."
description="Help for Data Center players using mods — plus developer docs under /wiki/developers."
>
<main className="bg-background text-on-surface font-sans min-h-screen editorial-bleed bg-hero-gradient">
<section className="hero-motion-wrap relative flex min-h-[72vh] flex-col items-center justify-center overflow-hidden px-4 py-24 text-center">
@@ -138,7 +138,7 @@ export default function HomePage(): JSX.Element {
transition={{delay: reducedMotion ? 0 : 0.22}}
>
<Link
to="/wiki/mods/framework"
to="/wiki/guides/players/overview"
className="btn-primary hero-glow rounded-lg px-10 py-4 text-lg"
>
{t.ctaStart}

View File

@@ -48,7 +48,8 @@ export default function FooterLinkItem({item}: Props): ReactNode {
: {
to: toUrl,
})}
{...props}>
{...props}
>
{icon ? (
<span className="footer-link-with-icon">
{icon}

View File

@@ -25,9 +25,7 @@ function useLocaleDropdownUtils() {
const getLocaleConfig = (locale: string) => {
const localeConfig = localeConfigs[locale];
if (!localeConfig) {
throw new Error(
`Docusaurus bug, no locale config found for locale=${locale}`,
);
throw new Error(`Docusaurus bug, no locale config found for locale=${locale}`);
}
return localeConfig;
};
@@ -49,10 +47,7 @@ function useLocaleDropdownUtils() {
return {
getURL: (locale: string, options: {queryString: string | undefined}) => {
const finalSearch = mergeSearchStrings(
[search, options.queryString],
'append',
);
const finalSearch = mergeSearchStrings([search, options.queryString], 'append');
return `${getBaseURLForLocale(locale)}${finalSearch}${hash}`;
},
getLabel: (locale: string) => {
@@ -85,11 +80,7 @@ export default function LocaleDropdownNavbarItem({
target: '_self',
autoAddBaseUrl: false,
className:
locale === currentLocale
? mobile
? 'menu__link--active'
: 'dropdown__link--active'
: '',
locale === currentLocale ? (mobile ? 'menu__link--active' : 'dropdown__link--active') : '',
};
});
@@ -103,15 +94,11 @@ export default function LocaleDropdownNavbarItem({
})
: utils.getLabel(currentLocale);
const iconOnlyDesktop =
!mobile && String(className ?? '').includes('nav-icon-only');
const iconOnlyDesktop = !mobile && String(className ?? '').includes('nav-icon-only');
const label: ReactNode = (
<>
<IoLanguage
className={iconOnlyDesktop ? styles.iconOnly : styles.iconLanguage}
aria-hidden
/>
<IoLanguage className={iconOnlyDesktop ? styles.iconOnly : styles.iconLanguage} aria-hidden />
{mobile || !iconOnlyDesktop ? (
dropdownLabel
) : (

View File

@@ -80,9 +80,7 @@ export default function NavbarNavLink({
<>
{label}
{isExternalLink && (
<IconExternalLink
{...(isDropdownLink && {width: 12, height: 12})}
/>
<IconExternalLink {...(isDropdownLink && {width: 12, height: 12})} />
)}
</>
),