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`**. 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`**.
---
## 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/`.
---
## Local development ## Local development
@@ -25,50 +15,47 @@ Production build:
npm run 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) ## Deployment (Coolify / CI)
- **Default branch:** `main` — use this for new work and PRs. - **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 | | Setting | Value |
|---------|--------| |--------|--------|
| **Dockerfile** | `Dockerfile` at the gregWiki root | | **Dockerfile location** | `Dockerfile` (or `gregWiki/Dockerfile` if the Git repo is the parent workspace) |
| **Base directory** | **`.`** when only `gregWiki` is cloned. If gregWiki sits **next to** gregCore in the same clone, often set **`gregWiki`** as the subdirectory. | | **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). |
| **Volumes** | Do not use an empty host mount over `/app` that hides `package.json`. | | **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 **must** be this repository root (the folder that contains `package.json`):
Build context = **this** repository (folder that contains `package.json`):
```bash ```bash
cd path/to/gregWiki cd path/to/gregWiki # directory that contains package.json
docker compose up --build 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 ```bash
cd path/to/gregFramework cd path/to/gregFramework
docker compose -f docker-compose.gregwiki.yml up --build 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 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.
- [gregFramework README](../README.md) — flat layout `gregFramework/{RepoName}/`
- Source code and builds: **gregCore**, **gregMod.*** , **gregExt.*** as separate repositories (not only this documentation)

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 title: Repository architecture
sidebar_label: 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 ## 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 | | Layer | Role |
| ------ | ------ | | ------ | ------ |
| **Wrapper** | `gregFramework/` enthält lokal alle Einzel-Repositories. | | **Wrapper** | `gregFramework/` holds local checkouts of individual repositories. |
| **Core** | `gregCore/`**Framework-Kern**: Übersetzung, Hooks, Harmony/Event-Laufzeit, MCP, Templates und zugehörige Kernfunktionen. | | **Core** | `gregCore/`**framework core**: translation, hooks, Harmony/event runtime, MCP, templates, and related core features. |
| **Rust bridge** | In Core integriert unter `gregCore/bridges/gregSta.RustBridge/`. | | **Rust bridge** | Integrated in core under `gregCore/bridges/gregSta.RustBridge/`. |
| **Mods** | `gregMod.<Name>/`jeweils eigenes Repo direkt unter `gregFramework/`. | | **Mods** | `gregMod.<Name>/`one repo each, directly under `gregFramework/`. |
| **Extensions** | `gregExt.<Name>/`jeweils eigenes Repo direkt unter `gregFramework/`. | | **Extensions** | `gregExt.<Name>/`one repo each, directly under `gregFramework/`. |
| **Docs** | `gregWiki/` als eigenes Repo für Dokumentation. | | **Docs** | `gregWiki/` — documentation site repository. |
## Hook registry ## 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 ## Tools
- **Core tools:** `gregCore/tools/` - **Core tools:** `gregCore/tools/`
- **MCP runtime:** `gregCore/mcp-server/` - **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 ## 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." 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/` - `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) - `gregMod.<Name>/` — gameplay mods (`FMF.*`), **flat** next to `gregCore/` (legacy umbrella `gregMods/` is deprecated)

View File

@@ -2,7 +2,7 @@
id: documentation-layout id: documentation-layout
title: Documentation layout (`docs/`) title: Documentation layout (`docs/`)
sidebar_label: Documentation layout 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/`) # 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. | | **Contributors** | [`contributors/`](../contributors/repo-inventory.md) | Repo inventory, Docusaurus workflow, design system. |
| **Roadmap** | [`roadmap/`](../roadmap/unified-roadmap.md) | Planning docs. | | **Roadmap** | [`roadmap/`](../roadmap/unified-roadmap.md) | Planning docs. |
| **Topics hub** | [`topics/`](../topics/index.md) | Cross-cutting overviews (assets, multiplayer, security, …). | | **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. | | **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). |
| **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).
## URLs ## URLs
- Doc id `intro``/wiki/docs`. - Doc id `intro``/wiki/docs`.
- Typical doc → `/wiki/<doc-id-path>` (e.g. `mods/framework``/wiki/mods/framework`). - 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 ## Locales
- **Default:** `en` — files under `docs/`. - **Language:** English only — all curated content lives 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.
## 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) # 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. 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. - [Repository inventory](/wiki/contributors/repo-inventory) — current layout snapshot.
- [Monorepo target layout](/wiki/contributors/monorepo-target-layout) — intended structure. - [Monorepo target layout](/wiki/contributors/monorepo-target-layout) — intended structure.
- [Luminescent design system](/wiki/contributors/luminescent-design-system) — UI tokens for the site. - [Luminescent design system](/wiki/contributors/luminescent-design-system) — UI tokens for the site.
- [Docusaurus workflow](/wiki/contributors/docusaurus-workflow) — edit/build the wiki site. - [Docusaurus workflow](/wiki/contributors/docusaurus-workflow) — edit/build the wiki site.
- [Plugin submission audit](/wiki/contributors/plugin-submission-audit) — checklist for new plugins. - [Plugin submission audit](/wiki/contributors/plugin-submission-audit) — checklist for new plugins.
- [Contributor workshop](./contributor-workshop) — branching, reviews, and release expectations. - [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 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) - [By audience — intermediates](/wiki/audiences/intermediates) and [professionals](/wiki/audiences/professionals)
- [Framework overview](/wiki/mods/framework) — runtime capabilities and repo layout - [Framework overview](/wiki/mods/framework) — runtime capabilities and repo layout
- [FMF hooks](/wiki/framework/fmf-hooks) — hook surface (generated article) - [FMF hooks](/wiki/framework/fmf-hooks) — hook surface (generated article)

View File

@@ -2,28 +2,28 @@
id: audiences-overview id: audiences-overview
title: By audience title: By audience
sidebar_label: 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 # 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) | | **Players** (end users) | Install, use mods, 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) | | **Mod developers** | Build mods, hooks, configuration, debugging | [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) | | **Contributors** (repo & framework) | PRs, docs, plugins, CI | [Contributors (workflow)](../contributors/topics-overview) · [Repo inventory](/wiki/contributors/repo-inventory) |
| **Sponsorinnen & Sponsoren** | Unterstützung, Transparenz | [Sponsors (hub)](../sponsors/overview) | | **Sponsors** | Support, transparency | [Sponsors (hub)](../sponsors/overview) |
## Erfahrungsstufen (alle Rollen) ## Experience levels (all roles)
- [Newbies](/wiki/audiences/newbies) — erste Schritte, Begriffe, sichere Defaults. - [Newbies](/wiki/audiences/newbies) — first steps, terminology, safe defaults.
- [Intermediates](/wiki/audiences/intermediates) — Workflows, Tooling, typische Stolpersteine. - [Intermediates](/wiki/audiences/intermediates) — workflows, tooling, common pitfalls.
- [Professionals](/wiki/audiences/professionals) — Architektur, FFI, Performance, Release-Kanäle. - [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 # 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) - [By audience — newbies](/wiki/audiences/newbies)
- [End-user workshop](/wiki/guides/players/enduser-workshop) — install, updates, Workshop - [End-user workshop](/wiki/guides/players/enduser-workshop) — install, updates, Workshop

View File

@@ -1,19 +1,19 @@
--- ---
title: Sponsors & support title: Sponsors & support
sidebar_label: Sponsors (hub) sidebar_label: Sponsors (hub)
description: Für Unterstützerinnen und UnterstützerSponsoring, Transparenz, Anlaufstellen. description: For supporterssponsorship, transparency, where to start.
--- ---
# Sponsors & support # 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`. - **GitHub:** [mleem97/gregFramework](https://github.com/mleem97/gregFramework) — sponsorship and community policies are in `README`, `LICENSE`, and `CONTRIBUTING`.
- **Transparenz:** Release-Notes und [Release-Kanäle](/wiki/reference/release-channels) beschreiben, wie Builds verteilt werden. - **Transparency:** Release notes and [Release channels](/wiki/reference/release-channels) describe how builds are distributed.
- **Rechtliches:** [Security & legal](/wiki/topics/security-legal/overview) — verbindliche Texte liegen im Repository, nicht nur im Wiki. - **Legal:** [Security & legal](/wiki/topics/security-legal/overview) — binding text lives in the repository, not only in the wiki.
:::note Zielgruppe :::note Audience
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). 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 id: intro
title: gregFramework documentation title: Documentation
slug: /docs 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 — 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`) |
**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 ## Mod authors, plugins, and repo work
- 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)
## 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.*` **[Developers & contributors →](/wiki/developers)**
- [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`
## 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 Do not use the sidebars technical sections unless you are developing — the default view stays short on purpose.
- 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/`.

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 ## Sources
- Module path: `gregMod.HexLabelMod/` - 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). **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: The core `FrikaMF` runtime provides:
- Harmony patch integration for gameplay hooks - Harmony patch integration for gameplay hooks

View File

@@ -6,7 +6,7 @@ description: Standalone MelonLoader gameplay mods (FMF.*) — separate from FFM
# Gameplay mods # 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 ## Mods

View File

@@ -12,4 +12,4 @@ Provides export-focused tooling for asset-related workflows.
## Sources ## Sources
- Module path: `gregExt.AssetExporter/` - 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 ## Sources
- Module path: `gregExt.Multiplayer/` - 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 ## Sources
- Module path: `gregExt.PlayerModels/` - 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 ## Sources
- Module path: `gregExt.Sysadmin/` - 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 ## Sources
- Module path: `gregExt.WebUIBridge/` - 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.*`) # 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. 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 ## 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 - [Framework](/wiki/mods/framework) — runtime surface for mod authors
- [FMF hook naming](/wiki/reference/fmf-hook-naming) - [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 # 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](/wiki/framework/fmf-hooks) — generated hook surface
- [FMF hooks catalog](/wiki/reference/fmf-hooks-catalog) — strings from core sources - [FMF hooks catalog](/wiki/reference/fmf-hooks-catalog) — strings from core sources
- [FMF hook naming](/wiki/reference/fmf-hook-naming) — `FMF.*` vs legacy `FFM.*` - [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**. 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 ## Quick map
| Area | Start here | | 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 ## Summary
| Inhalt | Pfad | Format / Hinweis | | Content | Path | Format / notes |
|--------|------|------------------| |--------|------|----------------|
| **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. | | **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** lädt standardmäßig nur `{GameRoot}/Mods` — siehe unten. | | **FMF framework plugins** (FFM.Plugin.*) | `{GameRoot}/FMF/Plugins/` | DLLs; **MelonLoader** only scans `{GameRoot}/Mods` by default — see below. |
| **Plugins** (MelonLoader, z. B. ModPathRedirector) | `{GameRoot}/Plugins/` | MelonLoader `Plugins`-Ordner — nur **MelonPlugin**-DLLs. | | **Plugins** (MelonLoader, e.g. ModPathRedirector) | `{GameRoot}/Plugins/` | MelonLoader `Plugins` folder — **MelonPlugin** DLLs only. |
| **Mods** (MelonLoader, z. B. FMF.Mod.*) | `{GameRoot}/Mods/` | MelonLoader `Mods`-Ordner — **MelonMod**-DLLs. | | **Mods** (MelonLoader, e.g. FMF.Mod.*) | `{GameRoot}/Mods/` | MelonLoader `Mods` folder — **MelonMod** DLLs. |
## UserData/ModCfg ## UserData/ModCfg
- Alle **mod-relevanten** Konfigurationen und JSON-Sidecars werden unter **`UserData/ModCfg`** geführt. - All **mod-related** configuration and JSON sidecars live under **`UserData/ModCfg`**.
- Beim ersten Start werden fehlende Dateien angelegt; bei bestehenden Installationen werden ältere Dateien aus **`UserData/`** (Root) nach **`ModCfg/`** übernommen, sofern noch vorhanden. - On first start, missing files are created; on existing installs, older files may be migrated from **`UserData/`** (root) into **`ModCfg/`** when still present.
- Beispiele: `multiplayer-sync.config.json`, `pluginsync.config.json`. - Examples: `multiplayer-sync.config.json`, `pluginsync.config.json`.
- Framework-Metadaten (z. B. Save-Compat-Stamp) liegen unter **`UserData/ModCfg/FrikaFM/`** (Migration von `UserData/FrikaFM`). - 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. 1. **Also place** (or link) DLLs under **`Mods/`** — common path for automatic loading.
2. **Unterordner** von `Mods` nutzen, falls eure MelonLoader-Version Mods in Unterverzeichnissen lädt (Version je nach Release prüfen). 2. Use **subfolders** under `Mods` if your MelonLoader version loads mods from subdirectories (check your ML version).
3. **PluginSync**-Downloads des Frameworks landen unter **`FMF/Plugins/PluginSync/...`**. 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`. - **MelonLoader** scans **`{GameRoot}/Mods`** (including subfolders, depending on settings), **not** arbitrary paths via `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`**. - **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`**.
- **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): - **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 ```powershell
$game = "C:\Path\To\Data Center" $game = "C:\Path\To\Data Center"
@@ -52,11 +52,11 @@ $link = Join-Path $game "Mods\workshop_$id"
cmd /c mklink /J "$link" "$target" 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) - [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 | | **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) | | **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) | | **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) | | **Data Center exporter / assets** | `gregDataCenterExporter/` | Templates, exporter tooling, `FrikaModFramework/fmf_hooks.json` (among copies) |
| **Documentation** | `gregWiki/` | This Docusaurus site (`docs/`) | | **Documentation** | `gregWiki/` | This Docusaurus site (`docs/`) |
| **Mod store / web (if cloned)** | `gregStore/` | Private Next.js modstore stack (`web/`, …) — optional sibling repo | | **Mod store / web (if cloned)** | `gregStore/` | Private Next.js modstore stack (`web/`, …) — optional sibling repo |

View File

@@ -2,7 +2,7 @@
const config = { const config = {
title: 'gregFramework', 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', favicon: 'img/logo.svg',
url: 'https://frikadellental.de', url: 'https://frikadellental.de',
baseUrl: '/', baseUrl: '/',
@@ -24,10 +24,9 @@ const config = {
], ],
i18n: { i18n: {
defaultLocale: 'en', defaultLocale: 'en',
locales: ['en', 'de'], locales: ['en'],
localeConfigs: { localeConfigs: {
en: {label: 'English', htmlLang: 'en-GB'}, en: {label: 'English', htmlLang: 'en-GB'},
de: {label: 'Deutsch', htmlLang: 'de-DE'},
}, },
}, },
presets: [ presets: [
@@ -204,23 +203,15 @@ const config = {
items: [ items: [
{to: '/', label: 'Home', position: 'left'}, {to: '/', label: 'Home', position: 'left'},
{ {
label: 'Docs Hub', label: 'Docs',
position: 'left', position: 'left',
items: [ items: [
{to: '/wiki', label: 'Overview'}, {to: '/wiki', label: 'Overview'},
{to: '/wiki/mods/framework', label: 'Framework'}, {to: '/wiki/guides/players/overview', label: 'For players'},
{to: '/wiki/plugins/', label: 'Plugins'}, {to: '/wiki/developers', label: 'Developers'},
{to: '/wiki/mods/', label: 'Mods'}, {to: '/mods', label: 'Mod catalog'},
{to: '/wiki/roadmap/unified-roadmap', label: 'Roadmap'},
], ],
}, },
{
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'}, {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://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'}, {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: { footer: {
style: 'dark', style: 'dark',
links: [ links: [
{
title: 'Wiki',
items: [
{label: 'Home', to: '/wiki'},
{label: 'For players', to: '/wiki/guides/players/overview'},
{label: 'Developers', to: '/wiki/developers'},
],
},
{ {
title: 'Community', title: 'Community',
items: [ 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:sync": "node ./scripts/sync-wiki-to-docs.mjs",
"wiki:normalize-i18n": "node ./scripts/normalize-wiki-import-i18n.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", "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": "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/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": { "dependencies": {
"@docusaurus/core": "^3.10.0", "@docusaurus/core": "^3.10.0",

View File

@@ -24,13 +24,7 @@ function walk(dir) {
} }
} }
const roots = [ const roots = [path.resolve(import.meta.dirname, '../docs/legacy/wiki-import')];
path.resolve(import.meta.dirname, '../docs/legacy/wiki-import'),
path.resolve(
import.meta.dirname,
'../i18n/de/docusaurus-plugin-content-docs/current/legacy/wiki-import',
),
];
for (const r of roots) { for (const r of roots) {
if (fs.existsSync(r)) walk(r); 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: * Legacy: split DE/EN wiki-import pairs. Retired together with docs/legacy/wiki-import/.
* - 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
*/ */
console.log(
import { '[wiki:normalize-i18n] Skipped: legacy wiki-import i18n split is no longer used.\n' +
existsSync, 'Curated docs are English-only under docs/.',
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',
); );
process.exit(0);
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();

View File

@@ -1,50 +1,9 @@
import {existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync} from 'node:fs'; /**
import {join, resolve} from 'node:path'; * 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.
const projectRoot = resolve(process.cwd()); */
const gregFrameworkRoot = resolve(projectRoot, '..'); console.log(
const wikiDir = join(gregFrameworkRoot, '.wiki'); '[wiki:sync] Skipped: the bulk wiki-import under docs/legacy/wiki-import/ was retired.\n' +
const outDir = join(projectRoot, 'docs', 'legacy', 'wiki-import'); 'Author and edit Markdown under docs/ in gregWiki; use git history for old mirror text.',
);
if (!existsSync(wikiDir)) { process.exit(0);
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}`);

View File

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

View File

@@ -4,14 +4,26 @@ const sidebars = {
'intro', 'intro',
{ {
type: 'category', type: 'category',
label: 'Getting started', label: 'Play & mods',
items: ['getting-started', 'getting-started/documentation-layout'], collapsed: false,
items: [
'guides/players/overview',
'guides/players/enduser-workshop',
'reference/release-channels',
],
}, },
'tools/workshop-uploader',
{ {
type: 'category', type: 'category',
label: 'Workspace', label: 'Developers & contributors',
items: ['workspace/index'], collapsed: true,
}, link: {type: 'doc', id: 'developers'},
items: [
'developers',
'meta/system-architecture-principles',
'getting-started',
'getting-started/documentation-layout',
'workspace/index',
{ {
type: 'category', type: 'category',
label: 'Framework', label: 'Framework',
@@ -47,7 +59,6 @@ const sidebars = {
type: 'category', type: 'category',
label: 'Tools & operations', label: 'Tools & operations',
items: [ items: [
'tools/workshop-uploader',
'meta/Steam-Workshop-and-Tooling', 'meta/Steam-Workshop-and-Tooling',
'meta/devserver-betas', 'meta/devserver-betas',
'meta/IDEA_BACKLOG', 'meta/IDEA_BACKLOG',
@@ -59,27 +70,22 @@ const sidebars = {
items: [ items: [
{ {
type: 'category', type: 'category',
label: 'Players', label: 'Players (extra)',
key: 'guides-players',
items: [ items: [
'guides/players/overview',
'guides/players/audiences-overview', 'guides/players/audiences-overview',
'guides/players/newbies', 'guides/players/newbies',
'guides/players/intermediates', 'guides/players/intermediates',
'guides/players/professionals', 'guides/players/professionals',
'guides/players/enduser-workshop',
], ],
}, },
{ {
type: 'category', type: 'category',
label: 'Mod developers', label: 'Mod developers',
key: 'guides-mod-developers',
items: ['guides/mod-developers/overview'], items: ['guides/mod-developers/overview'],
}, },
{ {
type: 'category', type: 'category',
label: 'Contributors', label: 'Contributors',
key: 'guides-contributors',
items: [ items: [
'guides/contributors/topics-overview', 'guides/contributors/topics-overview',
'guides/contributors/contributor-workshop', 'guides/contributors/contributor-workshop',
@@ -89,7 +95,6 @@ const sidebars = {
{ {
type: 'category', type: 'category',
label: 'Sponsors', label: 'Sponsors',
key: 'guides-sponsors',
items: ['guides/sponsors/overview'], items: ['guides/sponsors/overview'],
}, },
], ],
@@ -138,8 +143,8 @@ const sidebars = {
'reference/fmf-hook-naming', 'reference/fmf-hook-naming',
'reference/fmf-hooks-catalog', 'reference/fmf-hooks-catalog',
'reference/mcp-server', 'reference/mcp-server',
'reference/release-channels',
'reference/reference-data-files', 'reference/reference-data-files',
'reference/modding-language-requirement',
], ],
}, },
{ {
@@ -183,6 +188,8 @@ const sidebars = {
}, },
'SPONSORS', 'SPONSORS',
], ],
},
],
}; };
module.exports = sidebars; module.exports = sidebars;

View File

@@ -431,7 +431,11 @@ body {
/* Doc canvas — editorial bleed (wiki layout alignment); no hard section borders */ /* Doc canvas — editorial bleed (wiki layout alignment); no hard section borders */
.theme-doc-wrapper { .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 { .theme-doc-root .theme-doc-sidebar-container {
@@ -576,7 +580,9 @@ body {
flex-shrink: 0; flex-shrink: 0;
opacity: 0.85; opacity: 0.85;
color: rgba(192, 252, 246, 0.45); 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 { .footer__link-item:hover .footer-icon-svg {

View File

@@ -97,7 +97,8 @@ export const moduleCatalog: ModuleEntry[] = [
name: 'FMF.ModPathRedirector', name: 'FMF.ModPathRedirector',
repoFolder: 'gregMod.PathRedirector', repoFolder: 'gregMod.PathRedirector',
type: 'plugin', 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', version: '1.5.0',
author: 'DataCenterExporter / gregFramework Community', author: 'DataCenterExporter / gregFramework Community',
languages: ['C#'], 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, ...homepageShellEn,
heroLine1: 'DATACENTER MODDING HUB.', heroLine1: 'DATACENTER MODDING HUB.',
heroLine2: 'SMART LIKE GREG.', heroLine2: 'SMART LIKE GREG.',
heroSub1: 'Streamlined. Flexible. Community-curated.', heroSub1: 'Install mods, use the Workshop, fix common issues — without digging through engine docs.',
heroSub2: 'gregFramework, Rust stacks, multiplayer, and plugins.', heroSub2: 'Technical reference for authors lives under Developers in the wiki.',
ctaStart: 'START MODDING', ctaStart: 'HELP FOR PLAYERS',
ctaMods: 'AVAILABLE STANDALONE MODS & PLUGINS', ctaMods: 'MOD CATALOG',
docsPaths: 'Documentation paths', 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: [ featureDescriptions: [
'Build mods in C# or natively in Rust via C-ABI/FFI.', 'Step-by-step paths for installing and troubleshooting — no repo jargon on day one.',
'Harmony patches, event IDs, and deterministic hook forwarding.', 'WorkshopManager and release channels explain where builds come from.',
'Source of truth from .wiki with end-user and mod-dev paths.', 'Player pages are short; author pages stay under one Developers section.',
'Core framework docs plus standalone plugin and ecosystem docs.', 'Discord and GitHub for help — framework internals only when you need them.',
], ],
comingSoon: 'Coming soon', 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', communityTitle: 'Community & maintainers',
communityText: 'This portal is designed for gregFramework docs and community-built plugins across the Data Center ecosystem.', communityText: 'This portal is designed for gregFramework docs and community-built plugins across the Data Center ecosystem.',
docsEndUserTitle: 'End-user', docsEndUserTitle: 'End-user',

View File

@@ -1,25 +1,8 @@
import { de } from './de'; import {en} from './en';
import { en } from './en'; import type {HomepageContent} from './types';
import type { HomepageContent, LocaleKey } from './types';
const homepageByLocale: Record<LocaleKey, HomepageContent> = { export type {HomepageContent, LocaleKey} from './types';
en,
de,
};
export type { HomepageContent, LocaleKey } from './types'; export function getHomepageContent(_locale: string): HomepageContent {
return en;
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;
} }

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[] = [ 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', title: 'For players',
description: 'Runtime hooks, bridge, events, and architecture.', description: 'Install, update, troubleshooting.',
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.',
link: '/wiki/guides/players/overview', link: '/wiki/guides/players/overview',
}, },
{ {
title: 'Mod developer docs', title: 'WorkshopManager',
description: 'Setup, debugging, and hook integration.', 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', 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', title: 'Contributor workflow',
description: 'Standards, CI, and documentation workflow.', description: 'Docs site and repo conventions.',
link: '/wiki/contributors/docusaurus-workflow', 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[] = [ 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', title: 'Für Spieler',
description: 'Runtime-Hooks, Bridge, Events und Architektur.', description: 'Installation, Updates, Fehlerbehebung.',
link: '/wiki/mods/framework', link: '/wiki/guides/players/overview',
}, },
{ {
title: 'Plugins (FFM)', title: 'WorkshopManager',
description: 'FFM.Plugin.*-Doku und Release-Seiten.', description: 'Workshop-Mods suchen und installieren.',
link: '/wiki/plugins/', link: '/wiki/guides/players/enduser-workshop',
},
{ 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: 'Release-Kanäle', title: 'Release-Kanäle',
description: 'Steam Workshop vs GitHub für Discovery und Betas.', description: 'Steam Workshop vs GitHub.',
link: '/wiki/reference/release-channels', link: '/wiki/reference/release-channels',
}, },
{ {title: 'Mod-Katalog', description: 'Module mit Doku- und Download-Links.', link: '/mods'},
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' },
]; ];
export const sharedWorkflowLinksDe: HomepageDocLink[] = [ export const sharedWorkflowLinksDe: HomepageDocLink[] = [
{ {
title: 'Endnutzer-Doku', title: 'Entwickler (Hub)',
description: 'Installation, Updates und Fehlerbehebung.', description: 'Framework, Mods, Plugins, Referenz — alle technischen Links.',
link: '/wiki/guides/players/overview', link: '/wiki/developers',
}, },
{ {
title: 'Mod-Entwickler-Doku', title: 'Mod-Entwickler-Guide',
description: 'Setup, Debugging und Hook-Integration.', description: 'Hooks, Setup, Einstieg.',
link: '/wiki/guides/mod-developers/overview', link: '/wiki/guides/mod-developers/overview',
}, },
{
title: 'Repo-Inventar',
description: 'Split-Repo-Layout und Drift-Hinweise.',
link: '/wiki/contributors/repo-inventory',
},
{ {
title: 'Contributor-Workflow', title: 'Contributor-Workflow',
description: 'Standards, CI und Doku-Workflow.', description: 'Doku-Site und Repo-Konventionen.',
link: '/wiki/contributors/docusaurus-workflow', 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< export const homepageShellEn: Pick<
@@ -137,13 +96,13 @@ export const homepageShellEn: Pick<
heroBadge: 'gregFramework · docs live', heroBadge: 'gregFramework · docs live',
heroBrandLine1: 'greg', heroBrandLine1: 'greg',
heroBrandLine2Gradient: 'Framework', heroBrandLine2Gradient: 'Framework',
knowledgeSectionTitle: 'Knowledge architecture', knowledgeSectionTitle: 'Players — start here',
workflowSectionTitle: 'Workflows', workflowSectionTitle: 'Authors & contributors',
codeSectionTitle: 'Engineered for mod authors', codeSectionTitle: 'Building on gregFramework',
codeSectionLead: codeSectionLead:
'C# mods on MelonLoader, FMF plugins, and optional Rust FFI bridges — one documentation hub, versioned with the split repos.', 'C# mods on MelonLoader, FFM plugins, and optional Rust bridges — details for authors are under Developers.',
ctaDiscordTitle: 'Build with the community', ctaDiscordTitle: 'Community',
ctaDiscordLead: 'Ask questions, share mods, and follow framework releases alongside core development.', ctaDiscordLead: 'Questions about playing or building — ask in Discord.',
ctaDiscordButton: 'Join Discord', ctaDiscordButton: 'Join Discord',
knowledgeLinks: sharedKnowledgeLinksEn, knowledgeLinks: sharedKnowledgeLinksEn,
workflowLinks: sharedWorkflowLinksEn, workflowLinks: sharedWorkflowLinksEn,
@@ -167,13 +126,13 @@ export const homepageShellDe: Pick<
heroBadge: 'gregFramework · Live-Dokumentation', heroBadge: 'gregFramework · Live-Dokumentation',
heroBrandLine1: 'greg', heroBrandLine1: 'greg',
heroBrandLine2Gradient: 'Framework', heroBrandLine2Gradient: 'Framework',
knowledgeSectionTitle: 'Wissensarchitektur', knowledgeSectionTitle: 'Spieler — Einstieg',
workflowSectionTitle: 'Arbeitsabläufe', workflowSectionTitle: 'Autoren & Contributors',
codeSectionTitle: 'Für Mod-Autoren gebaut', codeSectionTitle: 'Auf gregFramework aufbauen',
codeSectionLead: codeSectionLead:
'C#-Mods auf MelonLoader, FMF-Plugins und optionale Rust-FFI-Brücken — ein Dokumentations-Hub, versioniert mit den Split-Repos.', 'C#-Mods auf MelonLoader, FFM-Plugins, optionale Rust-Brücken — Details für Autoren unter Entwickler.',
ctaDiscordTitle: 'Mit der Community bauen', ctaDiscordTitle: 'Community',
ctaDiscordLead: 'Fragen stellen, Mods teilen und Releases parallel zur Core-Entwicklung verfolgen.', ctaDiscordLead: 'Fragen zum Spielen oder Bauen — im Discord.',
ctaDiscordButton: 'Discord beitreten', ctaDiscordButton: 'Discord beitreten',
knowledgeLinks: sharedKnowledgeLinksDe, knowledgeLinks: sharedKnowledgeLinksDe,
workflowLinks: sharedWorkflowLinksDe, workflowLinks: sharedWorkflowLinksDe,

View File

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

View File

@@ -1,5 +1,3 @@
import type { LocaleKey } from './homepage/types';
export type ModsPageStrings = { export type ModsPageStrings = {
title: string; title: string;
description: string; description: string;
@@ -13,8 +11,7 @@ export type ModsPageStrings = {
legacyNoSplitRepo: string; legacyNoSplitRepo: string;
}; };
const byLocale: Record<LocaleKey, ModsPageStrings> = { const strings: ModsPageStrings = {
en: {
title: 'Mods & plugins catalog', title: 'Mods & plugins catalog',
description: description:
'Generated from the module catalog. Each entry links to its wiki article, release page, and download route.', 'Generated from the module catalog. Each entry links to its wiki article, release page, and download route.',
@@ -26,23 +23,8 @@ const byLocale: Record<LocaleKey, ModsPageStrings> = {
notReleased: 'Not released yet', notReleased: 'Not released yet',
repoFolder: 'gregFramework folder', repoFolder: 'gregFramework folder',
legacyNoSplitRepo: 'Legacy — no split repo in workspace', 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',
},
}; };
export function getModsPageStrings(locale: string): ModsPageStrings { export function getModsPageStrings(_locale: string): ModsPageStrings {
const languageOnly = (locale || 'en').toLowerCase().split('-')[0] as LocaleKey; return strings;
return byLocale[languageOnly] ?? byLocale.en;
} }

View File

@@ -69,7 +69,7 @@ export default function HomePage(): JSX.Element {
return ( return (
<Layout <Layout
title="Home" 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"> <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"> <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}} transition={{delay: reducedMotion ? 0 : 0.22}}
> >
<Link <Link
to="/wiki/mods/framework" to="/wiki/guides/players/overview"
className="btn-primary hero-glow rounded-lg px-10 py-4 text-lg" className="btn-primary hero-glow rounded-lg px-10 py-4 text-lg"
> >
{t.ctaStart} {t.ctaStart}

View File

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

View File

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

View File

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