mirror of
https://github.com/mleem97/gregWiki.git
synced 2026-04-10 19:19:18 +02:00
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:
57
README.md
57
README.md
@@ -1,16 +1,6 @@
|
||||
# gregWiki
|
||||
# gregWiki — gregFramework documentation
|
||||
|
||||
Docusaurus site for **gregFramework** / Data Center modding: `docusaurus.config.js`, `sidebars.js`, React under `src/`, content under [`docs/`](./docs/). Published route base path: **`/wiki`**.
|
||||
|
||||
---
|
||||
|
||||
## Part of gregFramework
|
||||
|
||||
This directory is part of the **[gregFramework](https://github.com/mleem97/gregFramework)** workspace. Clone sibling repositories side by side so each project lives at `gregFramework/<RepoName>/`. See the workspace [README](https://github.com/mleem97/gregFramework/blob/master/README.md) for the full layout and migration notes.
|
||||
|
||||
**Remote:** [`mleem97/gregWiki`](https://github.com/mleem97/gregWiki) — on-disk path: `gregFramework/gregWiki/`.
|
||||
|
||||
---
|
||||
This repository contains the **Docusaurus site** (`docusaurus.config.js`, `src/`, `sidebars.js`) and all **Markdown/MDX content** under [`docs/`](./docs/). Published docs use the route base path **`/wiki`**.
|
||||
|
||||
## Local development
|
||||
|
||||
@@ -25,50 +15,47 @@ Production build:
|
||||
npm run build
|
||||
```
|
||||
|
||||
Optional: mirror the legacy GitHub Wiki — see [`docs/getting-started/documentation-layout.md`](./docs/getting-started/documentation-layout.md) and scripts `wiki:sync` / `wiki:normalize-i18n`.
|
||||
|
||||
---
|
||||
Content is edited directly under [`docs/`](./docs/). **Canonical architecture & doc rules:** [`docs/meta/system-architecture-principles.md`](./docs/meta/system-architecture-principles.md) (ModManager → Framework → Plugins → Mods). The old GitHub Wiki bulk-import scripts (`wiki:sync`, `wiki:normalize-i18n`) are no-ops; see [`docs/getting-started/documentation-layout.md`](./docs/getting-started/documentation-layout.md).
|
||||
|
||||
## Deployment (Coolify / CI)
|
||||
|
||||
- **Default branch:** `main` — use this for new work and PRs.
|
||||
- **`master`:** may still exist for older deployments; in Coolify, set the branch to **`main`** when possible.
|
||||
- **`master`:** kept in sync with `main` for hosts that still clone `master` (e.g. older Coolify defaults). Prefer setting the deployment **branch to `main`** in Coolify → Application → **Git** → Branch.
|
||||
|
||||
### Coolify (Dockerfile) — missing `/app/package.json`
|
||||
### Coolify (Dockerfile) — avoid `/app/package.json` missing
|
||||
|
||||
The image expects **`package.json` at the image root `/app`**. That only works if the **Docker build context** is this repository (gregWiki), not a parent monorepo folder without adjustments.
|
||||
The image expects **`package.json` at the image root `/app`**. That only happens if the **Docker build context** is this repo (gregWiki), not a parent monorepo folder.
|
||||
|
||||
| Setting | Value |
|
||||
|---------|--------|
|
||||
| **Dockerfile** | `Dockerfile` at the gregWiki root |
|
||||
| **Base directory** | **`.`** when only `gregWiki` is cloned. If gregWiki sits **next to** gregCore in the same clone, often set **`gregWiki`** as the subdirectory. |
|
||||
| **Volumes** | Do not use an empty host mount over `/app` that hides `package.json`. |
|
||||
|--------|--------|
|
||||
| **Dockerfile location** | `Dockerfile` (or `gregWiki/Dockerfile` if the Git repo is the parent workspace) |
|
||||
| **Base directory / Root directory** | **`gregWiki`** when the cloned repo contains `gregCore/`, `gregWiki/`, … next to each other. If Coolify only clones **`mleem97/gregWiki`**, base directory is **`.`** (repo root). |
|
||||
| **Do not** | Set build context to the parent `gregFramework` folder unless Dockerfile uses `COPY gregWiki/…` (this Dockerfile does not). |
|
||||
| **Volumes** | Do **not** bind-mount an empty host path over `/app` — that hides `package.json` from the image. |
|
||||
|
||||
Symptom: `docker-entrypoint: ERROR: /app/package.json not found` → wrong context or volume.
|
||||
Symptom: `docker-entrypoint: ERROR: /app/package.json not found` → wrong build context or a bad volume on `/app`.
|
||||
|
||||
---
|
||||
## Docker
|
||||
|
||||
## Docker (local)
|
||||
|
||||
Build context = **this** repository (folder that contains `package.json`):
|
||||
Build context **must** be this repository root (the folder that contains `package.json`):
|
||||
|
||||
```bash
|
||||
cd path/to/gregWiki
|
||||
cd path/to/gregWiki # directory that contains package.json
|
||||
docker compose up --build
|
||||
# or
|
||||
docker build -t gregwiki-docs .
|
||||
docker run --rm -p 3000:3000 gregwiki-docs
|
||||
```
|
||||
|
||||
If gregWiki lives inside **gregFramework**, from the workspace root:
|
||||
If the wiki lives inside a **gregFramework** workspace, run Compose from the parent folder:
|
||||
|
||||
```bash
|
||||
cd path/to/gregFramework
|
||||
docker compose -f docker-compose.gregwiki.yml up --build
|
||||
```
|
||||
|
||||
(`docker-compose.gregwiki.yml` sets `build.context: ./gregWiki`.)
|
||||
(`docker-compose.gregwiki.yml` sets `build.context: ./gregWiki` and mounts `./gregWiki` to `/app` for dev.)
|
||||
|
||||
---
|
||||
## Related repositories
|
||||
|
||||
## See also
|
||||
|
||||
- [gregFramework README](../README.md) — flat layout `gregFramework/{RepoName}/`
|
||||
- Source code and builds: **gregCore**, **gregMod.*** , **gregExt.*** as separate repositories (not only this documentation)
|
||||
The [`gregFramework`](https://github.com/mleem97/gregFramework) workspace groups **gregCore**, **gregMods**, **gregExtensions**, **gregWiki**, and related tools. Source-of-truth code paths for hooks and builds live in those repos, not only in this documentation tree.
|
||||
|
||||
36
docs/README.md
Normal file
36
docs/README.md
Normal 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
84
docs/developers.md
Normal 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)
|
||||
@@ -1,34 +1,45 @@
|
||||
---
|
||||
title: Repository architecture
|
||||
sidebar_label: Repository architecture
|
||||
description: Aktuelle Multi-Repo-Architektur mit `gregFramework` als Wrapper und klarer Repo-Trennung.
|
||||
description: Current multi-repo layout with `gregFramework` as a local wrapper and clear repository boundaries.
|
||||
---
|
||||
|
||||
## Modding language
|
||||
|
||||
Mods, MelonLoader-Plugins und Extensions liefern ihre **Logik ausschließlich in C#** (MelonLoader / .NET). Details und Abgrenzung zum Framework-Kern (z. B. Rust-Bridge): [Modding language (C# only)](/wiki/reference/modding-language-requirement).
|
||||
Mods, MelonLoader plugins, and extensions ship their **logic in C# only** (MelonLoader / .NET). Scope vs framework core (e.g. Rust bridge): [Modding language (C# only)](/wiki/reference/modding-language-requirement).
|
||||
|
||||
## Layers
|
||||
## Target runtime layers
|
||||
|
||||
Above the raw repositories, the **logical** model is **ModManager → Framework → Plugins → Mods** (see [System architecture & documentation principles](/wiki/meta/system-architecture-principles)):
|
||||
|
||||
| Layer | Role | Repo / folder |
|
||||
|--------|--------|----------------|
|
||||
| **ModManager** | MAUI front-end: manage mods/plugins, surface game status; talks to the framework through defined interfaces. | `gregModmanager/` |
|
||||
| **Framework (SDK)** | Hooks, events, versioning, logging; bridge to IL2CPP / MelonLoader. | `gregCore/` |
|
||||
| **Plugins** | Framework extensions (`FFM.Plugin.*`). | `gregExt.<Name>/` |
|
||||
| **Mods** | User mods (`FMF.*`). | `gregMod.<Name>/` |
|
||||
|
||||
## On-disk repositories
|
||||
|
||||
| Layer | Role |
|
||||
| ------ | ------ |
|
||||
| **Wrapper** | `gregFramework/` enthält lokal alle Einzel-Repositories. |
|
||||
| **Core** | `gregCore/` — **Framework-Kern**: Übersetzung, Hooks, Harmony/Event-Laufzeit, MCP, Templates und zugehörige Kernfunktionen. |
|
||||
| **Rust bridge** | In Core integriert unter `gregCore/bridges/gregSta.RustBridge/`. |
|
||||
| **Mods** | `gregMod.<Name>/` — jeweils eigenes Repo direkt unter `gregFramework/`. |
|
||||
| **Extensions** | `gregExt.<Name>/` — jeweils eigenes Repo direkt unter `gregFramework/`. |
|
||||
| **Docs** | `gregWiki/` als eigenes Repo für Dokumentation. |
|
||||
| **Wrapper** | `gregFramework/` holds local checkouts of individual repositories. |
|
||||
| **Core** | `gregCore/` — **framework core**: translation, hooks, Harmony/event runtime, MCP, templates, and related core features. |
|
||||
| **Rust bridge** | Integrated in core under `gregCore/bridges/gregSta.RustBridge/`. |
|
||||
| **Mods** | `gregMod.<Name>/` — one repo each, directly under `gregFramework/`. |
|
||||
| **Extensions** | `gregExt.<Name>/` — one repo each, directly under `gregFramework/`. |
|
||||
| **Docs** | `gregWiki/` — documentation site repository. |
|
||||
|
||||
## Hook registry
|
||||
|
||||
Hook-Naming und Registry bleiben fachlich im Core verankert; bei Split-Änderungen gilt immer der Core-Stand als Referenz.
|
||||
Hook naming and the registry are owned by core; when repos split, **core** remains the source of truth.
|
||||
|
||||
## Tools
|
||||
|
||||
- **Core tools:** `gregCore/tools/`
|
||||
- **MCP runtime:** `gregCore/mcp-server/`
|
||||
- **Hook-/Mapping-Utilities:** ebenfalls unter Core-Tools, versioniert mit dem Core-Repo.
|
||||
- **Hook / mapping utilities:** also under core tools, versioned with the core repo.
|
||||
|
||||
## Steam & Workshop
|
||||
|
||||
Workshop-Templates und Deployment-Skripte liegen im Core-Repo unter `gregCore/Templates/` und `gregCore/scripts/`.
|
||||
Workshop templates and deployment scripts live in the core repo under `gregCore/Templates/` and `gregCore/scripts/`.
|
||||
|
||||
@@ -4,7 +4,7 @@ sidebar_label: Getting started
|
||||
description: "Split-repo workspace: gregFramework layout, building the core, and where docs live."
|
||||
---
|
||||
|
||||
The workspace is **multi-repo** with a local `gregFramework/` folder containing standalone repositories, for example:
|
||||
The workspace is **multi-repo** with a local `gregFramework/` folder containing standalone repositories. **Logical stack:** **ModManager → framework / SDK → plugins → mods** — see [System architecture & documentation principles](/wiki/meta/system-architecture-principles).
|
||||
|
||||
- `gregCore/` — core SDK (`gregCore/framework/FrikaMF.csproj`), MCP server under `gregCore/mcp-server/`
|
||||
- `gregMod.<Name>/` — gameplay mods (`FMF.*`), **flat** next to `gregCore/` (legacy umbrella `gregMods/` is deprecated)
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
id: documentation-layout
|
||||
title: Documentation layout (`docs/`)
|
||||
sidebar_label: Documentation layout
|
||||
description: How curated docs, guides, and the legacy GitHub Wiki mirror are organized under docs/.
|
||||
description: How curated docs, guides, and reference material are organized under docs/.
|
||||
---
|
||||
|
||||
# Documentation layout (`docs/`)
|
||||
@@ -26,34 +26,17 @@ This folder is the **single source of truth** for the public Docusaurus site. Th
|
||||
| **Contributors** | [`contributors/`](../contributors/repo-inventory.md) | Repo inventory, Docusaurus workflow, design system. |
|
||||
| **Roadmap** | [`roadmap/`](../roadmap/unified-roadmap.md) | Planning docs. |
|
||||
| **Topics hub** | [`topics/`](../topics/index.md) | Cross-cutting overviews (assets, multiplayer, security, …). |
|
||||
| **Meta** | [`meta/`](../meta/Steam-Workshop-and-Tooling.md) | Workshop tooling notes, devserver API, backlog. |
|
||||
| **Legacy** | [`legacy/`](../legacy/index.md) | GitHub Wiki mirror under `legacy/wiki-import/`. |
|
||||
|
||||
## Legacy GitHub Wiki (`docs/legacy/wiki-import/`)
|
||||
|
||||
Long-form pages mirrored from the **GitHub Wiki** live here (synced from `.wiki/`).
|
||||
|
||||
1. Clone the wiki working tree as **`../.wiki/`** under `gregFramework/` (same level as sibling repos).
|
||||
2. From **gregWiki** root: `npm run wiki:refresh` (or `wiki:sync` → `wiki:normalize-i18n`).
|
||||
3. German paired pages live under `i18n/de/docusaurus-plugin-content-docs/current/legacy/wiki-import/` after normalization.
|
||||
4. Prefer **new curated docs** under `guides/`, `reference/`, or `framework/`; keep bulk legacy material in `legacy/wiki-import/` until migrated.
|
||||
|
||||
Details: [`topics/wiki-import/overview`](../topics/wiki-import/overview.md).
|
||||
| **Meta** | [`meta/`](../meta/Steam-Workshop-and-Tooling.md) | Workshop tooling notes, devserver API, backlog; **[architecture principles](../meta/system-architecture-principles.md)** (stack model & doc rules). |
|
||||
|
||||
## URLs
|
||||
|
||||
- Doc id `intro` → `/wiki/docs`.
|
||||
- Typical doc → `/wiki/<doc-id-path>` (e.g. `mods/framework` → `/wiki/mods/framework`).
|
||||
|
||||
## Scripts (gregWiki root)
|
||||
|
||||
| Script | Role |
|
||||
|--------|------|
|
||||
| `wiki:sync` | Copies `.wiki/` → `docs/legacy/wiki-import/`. |
|
||||
| `wiki:normalize-i18n` | Splits DE/EN pairs into default locale + `i18n/de/...`. |
|
||||
| `write-wiki-import-category-keys` | Refreshes `_category_.json` keys under imported trees. |
|
||||
|
||||
## Locales
|
||||
|
||||
- **Default:** `en` — files under `docs/`.
|
||||
- **Deutsch (`de`):** overrides under `i18n/de/docusaurus-plugin-content-docs/current/` mirroring `docs/` paths where translated files exist; otherwise Docusaurus falls back to English.
|
||||
- **Language:** English only — all curated content lives under `docs/`.
|
||||
|
||||
## Historical note
|
||||
|
||||
The former GitHub Wiki bulk import under `docs/legacy/wiki-import/` has been **removed**. Author new material under the folders above; use Git history if you need obsolete text.
|
||||
|
||||
@@ -6,14 +6,14 @@ description: Monorepo layout, design system, Docusaurus workflow, plugin audits.
|
||||
|
||||
# Contributors (workflow)
|
||||
|
||||
**Mitwirkende am Repository** — Framework, Website, CI, Plugins. Überblick über alle Rollen (inkl. Spieler, Moddevs, Sponsoren): [By audience](/wiki/guides/players/audiences-overview).
|
||||
**Repository contributors** — framework, website, CI, plugins. Role overview (including players, mod developers, sponsors): [By audience](/wiki/guides/players/audiences-overview).
|
||||
|
||||
Operational docs for people changing the framework, site, or release pipeline.
|
||||
|
||||
- [System architecture & documentation principles](/wiki/meta/system-architecture-principles) — layer model, priorities, wiki rules (**required reading** for substantive doc changes).
|
||||
- [Repository inventory](/wiki/contributors/repo-inventory) — current layout snapshot.
|
||||
- [Monorepo target layout](/wiki/contributors/monorepo-target-layout) — intended structure.
|
||||
- [Luminescent design system](/wiki/contributors/luminescent-design-system) — UI tokens for the site.
|
||||
- [Docusaurus workflow](/wiki/contributors/docusaurus-workflow) — edit/build the wiki site.
|
||||
- [Plugin submission audit](/wiki/contributors/plugin-submission-audit) — checklist for new plugins.
|
||||
|
||||
- [Contributor workshop](./contributor-workshop) — branching, reviews, and release expectations.
|
||||
|
||||
@@ -6,8 +6,9 @@ description: Getting started, mod config, debugging — curated docs for FMF mod
|
||||
|
||||
# Mod developers
|
||||
|
||||
**Mod-Autorinnen und -Autoren** — eigene Mods bauen (Hooks, Konfiguration, Debug). Überblick über alle Rollen: [By audience](/wiki/guides/players/audiences-overview).
|
||||
**Mod authors** — build your own mods (hooks, configuration, debugging). Role overview: [By audience](/wiki/guides/players/audiences-overview).
|
||||
|
||||
- [System architecture & documentation principles](/wiki/meta/system-architecture-principles) — layer model **ModManager → Framework → Plugins → Mods**, priorities, wiki rules
|
||||
- [By audience — intermediates](/wiki/audiences/intermediates) and [professionals](/wiki/audiences/professionals)
|
||||
- [Framework overview](/wiki/mods/framework) — runtime capabilities and repo layout
|
||||
- [FMF hooks](/wiki/framework/fmf-hooks) — hook surface (generated article)
|
||||
|
||||
@@ -2,28 +2,28 @@
|
||||
id: audiences-overview
|
||||
title: By audience
|
||||
sidebar_label: By audience
|
||||
description: Vier Rollen — Spieler, Moddevs, Contributor, Sponsoren — plus Erfahrungsstufen (Newbies bis Pros).
|
||||
description: Four roles — players, mod developers, contributors, sponsors — plus experience levels (newbies through pros).
|
||||
---
|
||||
|
||||
# By audience
|
||||
|
||||
Die Dokumentation richtet sich an **vier Hauptrollen** (und an Erfahrungsstufen darunter). Die meisten Seiten sind **Englisch**; ausgewählte Einstiege gibt es auch auf **Deutsch** (z. B. in dieser Übersicht und in `i18n/de`).
|
||||
Documentation is aimed at **four primary roles** (and experience levels under each). All curated pages are **English**.
|
||||
|
||||
## Die vier Rollen
|
||||
## The four roles
|
||||
|
||||
| Rolle | Für wen? | Einstieg |
|
||||
| Role | Who | Start here |
|
||||
|--------|----------|----------|
|
||||
| **Spieler** (End users) | Installation, Mods nutzen, Troubleshooting | [End users (hub)](./overview) · [End-user workshop](./enduser-workshop) |
|
||||
| **Mod-Entwickler** (Mod developers) | Mods bauen, Hooks, Konfiguration, Debug | [Mod developers (hub)](../mod-developers/overview) · [Framework](/wiki/mods/framework) |
|
||||
| **Contributor** (Repo & Framework) | PRs, Doku, Plugins, CI | [Contributors (workflow)](../contributors/topics-overview) · [Repo inventory](/wiki/contributors/repo-inventory) |
|
||||
| **Sponsorinnen & Sponsoren** | Unterstützung, Transparenz | [Sponsors (hub)](../sponsors/overview) |
|
||||
| **Players** (end users) | Install, use mods, troubleshooting | [End users (hub)](./overview) · [End-user workshop](./enduser-workshop) |
|
||||
| **Mod developers** | Build mods, hooks, configuration, debugging | [Mod developers (hub)](../mod-developers/overview) · [Framework](/wiki/mods/framework) |
|
||||
| **Contributors** (repo & framework) | PRs, docs, plugins, CI | [Contributors (workflow)](../contributors/topics-overview) · [Repo inventory](/wiki/contributors/repo-inventory) |
|
||||
| **Sponsors** | Support, transparency | [Sponsors (hub)](../sponsors/overview) |
|
||||
|
||||
## Erfahrungsstufen (alle Rollen)
|
||||
## Experience levels (all roles)
|
||||
|
||||
- [Newbies](/wiki/audiences/newbies) — erste Schritte, Begriffe, sichere Defaults.
|
||||
- [Intermediates](/wiki/audiences/intermediates) — Workflows, Tooling, typische Stolpersteine.
|
||||
- [Professionals](/wiki/audiences/professionals) — Architektur, FFI, Performance, Release-Kanäle.
|
||||
- [Newbies](/wiki/audiences/newbies) — first steps, terminology, safe defaults.
|
||||
- [Intermediates](/wiki/audiences/intermediates) — workflows, tooling, common pitfalls.
|
||||
- [Professionals](/wiki/audiences/professionals) — architecture, FFI, performance, release channels.
|
||||
|
||||
## Thematische Übersicht
|
||||
## Thematic overview
|
||||
|
||||
- [Topics hub](/wiki/topics/) — Security, Multiplayer, Assets, FFI, Roadmap, Meta.
|
||||
- [Topics hub](/wiki/topics/) — security, multiplayer, assets, FFI, roadmap, meta.
|
||||
|
||||
@@ -6,7 +6,7 @@ description: FAQs, install paths, troubleshooting — entry point for players us
|
||||
|
||||
# End users
|
||||
|
||||
**Spielerinnen und Spieler** — Mods installieren und spielen, ohne am Framework mitzuentwickeln. Überblick über alle Rollen: [By audience](/wiki/guides/players/audiences-overview).
|
||||
**Players** — install and play with mods without developing the framework. Role overview: [By audience](/wiki/guides/players/audiences-overview).
|
||||
|
||||
- [By audience — newbies](/wiki/audiences/newbies)
|
||||
- [End-user workshop](/wiki/guides/players/enduser-workshop) — install, updates, Workshop
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
---
|
||||
title: Sponsors & support
|
||||
sidebar_label: Sponsors (hub)
|
||||
description: Für Unterstützerinnen und Unterstützer — Sponsoring, Transparenz, Anlaufstellen.
|
||||
description: For supporters — sponsorship, transparency, where to start.
|
||||
---
|
||||
|
||||
# Sponsors & support
|
||||
|
||||
Die Community finanziert u. a. Infrastruktur, Tools und Zeit für Pflege der Doku und des Frameworks. Hier startest du als **potenzielle Sponsorin oder Sponsor** (oder als Spielerin, die nur informieren möchte, wohin Unterstützung fließt).
|
||||
The community funds infrastructure, tools, and time to maintain documentation and the framework. Use this page if you are a **potential sponsor** (or a player who wants to see where support goes).
|
||||
|
||||
## Kurzüberblick
|
||||
## At a glance
|
||||
|
||||
- **GitHub:** [mleem97/gregFramework](https://github.com/mleem97/gregFramework) — Sponsoring- und Community-Richtlinien stehen in `README`, `LICENSE` und `CONTRIBUTING`.
|
||||
- **Transparenz:** Release-Notes und [Release-Kanäle](/wiki/reference/release-channels) beschreiben, wie Builds verteilt werden.
|
||||
- **Rechtliches:** [Security & legal](/wiki/topics/security-legal/overview) — verbindliche Texte liegen im Repository, nicht nur im Wiki.
|
||||
- **GitHub:** [mleem97/gregFramework](https://github.com/mleem97/gregFramework) — sponsorship and community policies are in `README`, `LICENSE`, and `CONTRIBUTING`.
|
||||
- **Transparency:** Release notes and [Release channels](/wiki/reference/release-channels) describe how builds are distributed.
|
||||
- **Legal:** [Security & legal](/wiki/topics/security-legal/overview) — binding text lives in the repository, not only in the wiki.
|
||||
|
||||
:::note Zielgruppe
|
||||
Diese Seite richtet sich an **Sponsorinnen, Sponsoren und Fördernde**. Spielerinnen und Spieler finden den Einstieg unter [End users](/wiki/guides/players/overview); Mod-Autoren unter [Mod developers](/wiki/guides/mod-developers/overview); Mitwirkende am Repo unter [Contributors (workflow)](/wiki/guides/contributors/topics-overview).
|
||||
:::note Audience
|
||||
This page is for **sponsors and supporters**. Players start at [End users](/wiki/guides/players/overview); mod authors at [Mod developers](/wiki/guides/mod-developers/overview); repo contributors at [Contributors (workflow)](/wiki/guides/contributors/topics-overview).
|
||||
:::
|
||||
|
||||
@@ -1,47 +1,29 @@
|
||||
---
|
||||
id: intro
|
||||
title: gregFramework documentation
|
||||
title: Documentation
|
||||
slug: /docs
|
||||
description: Entry point for the split-repo workspace — core, mods, extensions, and this wiki.
|
||||
description: Help for Data Center players using mods — install, Workshop, troubleshooting. Technical docs for authors are separated.
|
||||
---
|
||||
|
||||
This documentation describes the **current split layout**: a local `gregFramework/` workspace with separate repositories for **core**, **mods**, **extensions**, and **wiki**. It is written for **players**, **mod developers**, **contributors**, and **sponsors**.
|
||||
# Welcome
|
||||
|
||||
## Who is this for?
|
||||
**gregFramework** is the modding stack for *Data Center*. If you **play with mods**, you only need a short path: install, browse the Workshop, and fix common issues.
|
||||
|
||||
| Audience | Start here |
|
||||
|----------|------------|
|
||||
| **Players** — install, play, troubleshoot | [End users (hub)](./guides/players/overview.md) · [End-user workshop](./guides/players/enduser-workshop.md) |
|
||||
| **Mod developers** — build mods, hooks, debugging | [Mod developers (hub)](./guides/mod-developers/overview.md) · [Framework](./mods/framework.md) · [FMF hooks](/wiki/framework/fmf-hooks) |
|
||||
| **Contributors** — PRs, docs, plugins, CI | [Contributors (workflow)](./guides/contributors/topics-overview.md) · [Contributor workshop](./guides/contributors/contributor-workshop.md) |
|
||||
| **Sponsors** — support & transparency | [Sponsors (hub)](./guides/sponsors/overview.md) · [GitHub Sponsors](https://github.com/sponsors) (project policies in repo `LICENSE` / `CONTRIBUTING`) |
|
||||
## Players — start here
|
||||
|
||||
**Experience tracks** (newbies → pros): [By audience](./guides/players/audiences-overview.md) → [Newbies](/wiki/audiences/newbies), [Intermediates](/wiki/audiences/intermediates), [Professionals](/wiki/audiences/professionals).
|
||||
1. **[End users](/wiki/guides/players/overview)** — install, update, troubleshooting
|
||||
2. **[WorkshopManager guide](/wiki/guides/players/enduser-workshop)** — browse and install mods
|
||||
3. **[Release channels](/wiki/reference/release-channels)** — Steam Workshop vs GitHub
|
||||
4. **[WorkshopManager (tool)](/wiki/tools/workshop-uploader)** — desktop app for Workshop content
|
||||
|
||||
## Repository hub
|
||||
[**Mod catalog**](/mods) lists modules with links to docs and downloads.
|
||||
|
||||
- [Workspace map](./workspace/index.mdx) — how folders map to repos
|
||||
- Core: `gregCore/` (`framework/FrikaMF`, `mcp-server/`, `bridges/gregSta.RustBridge/`)
|
||||
- Mods: `gregMod.<Name>/` (split repos, directly under `gregFramework/`)
|
||||
- Extensions (FFM plugins): `gregExt.<Name>/` (split repos, directly under `gregFramework/`)
|
||||
- Workshop app: `gregModmanager/` (Gregtools Modmanager — `WorkshopUploader.exe`)
|
||||
- Exporter / templates: `gregDataCenterExporter/`
|
||||
- Wiki: `gregWiki/` (this site)
|
||||
## Mod authors, plugins, and repo work
|
||||
|
||||
## Hooks and releases
|
||||
Everything for **building mods**, **FFM plugins**, hooks, CI, and **contributing** lives in one place:
|
||||
|
||||
- [FMF hook naming](./reference/fmf-hook-naming.md) — `FMF.<Domain>.…` and legacy `FFM.*`
|
||||
- [FMF hooks catalog](./reference/fmf-hooks-catalog.md) — generated from core `HookNames.cs`
|
||||
- [Release channels](./reference/release-channels.md) — Steam Workshop vs GitHub (beta)
|
||||
- [MCP server](./reference/mcp-server.md) — optional LLM/IDE tooling over docs + `fmf_hooks.json`
|
||||
**[Developers & contributors →](/wiki/developers)**
|
||||
|
||||
## Layout (contributors)
|
||||
Technical docs follow one stack model: **ModManager (MAUI) → framework / SDK → plugins → mods** — explained in **[System architecture & documentation principles](/wiki/meta/system-architecture-principles)**.
|
||||
|
||||
- [Repo inventory](./contributors/repo-inventory.md) — project and repository overview
|
||||
- Split naming: `gregMod.<Name>`, `gregExt.<Name>`, `gregSta.<Name>` (Rust bridge repo), plus apps like `gregModmanager/`, `gregDataCenterExporter/`, `gregIPAM/`, `gregStore/`
|
||||
|
||||
## Source model
|
||||
|
||||
- **Authoring:** Markdown/MDX lives in the **gregWiki** repository.
|
||||
- **Technical source of truth:** runtime and bridge details come from **gregCore**.
|
||||
- **Rust bridge:** `gregCore/bridges/gregSta.RustBridge/`.
|
||||
Do not use the sidebar’s technical sections unless you are developing — the default view stays short on purpose.
|
||||
|
||||
67
docs/meta/system-architecture-principles.md
Normal file
67
docs/meta/system-architecture-principles.md
Normal 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)
|
||||
@@ -101,4 +101,4 @@ Output lands in the standard MelonLoader `Mods/` folder as configured in the `.c
|
||||
## Sources
|
||||
|
||||
- Module path: `gregMod.HexLabelMod/`
|
||||
- Relatedocs: [`Standalone Mods`](/wiki/legacy/wiki-import/StandaloneMods)
|
||||
- See also: [Mods overview](/wiki/mods/)
|
||||
|
||||
@@ -5,6 +5,8 @@ sidebar_label: Framework
|
||||
|
||||
**Language:** mod, plugin, and extension **logic must be written in C#** — see [Modding language (C# only)](/wiki/reference/modding-language-requirement).
|
||||
|
||||
**Stack position:** gameplay **mods** sit on top of **plugins** and the **framework SDK**; the **ModManager** (MAUI) is the out-of-game front-end — see [System architecture & documentation principles](/wiki/meta/system-architecture-principles).
|
||||
|
||||
The core `FrikaMF` runtime provides:
|
||||
|
||||
- Harmony patch integration for gameplay hooks
|
||||
|
||||
@@ -6,7 +6,7 @@ description: Standalone MelonLoader gameplay mods (FMF.*) — separate from FFM
|
||||
|
||||
# Gameplay mods
|
||||
|
||||
These pages document **gameplay mods** (`FMF.*` assemblies). **Source of truth** on disk: split-repo folders **`gregMod.<Name>/`** directly under the gregFramework workspace root (not under a legacy `gregMods/` umbrella). They are **not** the same as [FFM plugins](../plugins/index.md), which extend the framework inside the game process.
|
||||
These pages document **gameplay mods** (`FMF.*` assemblies) — **layer 4** in **ModManager → Framework → Plugins → Mods** ([architecture principles](/wiki/meta/system-architecture-principles)). **Source of truth** on disk: split-repo folders **`gregMod.<Name>/`** directly under the gregFramework workspace root (not under a legacy `gregMods/` umbrella). They are **not** the same as [FFM plugins](../plugins/index.md), which extend the framework inside the game process.
|
||||
|
||||
## Mods
|
||||
|
||||
|
||||
@@ -12,4 +12,4 @@ Provides export-focused tooling for asset-related workflows.
|
||||
## Sources
|
||||
|
||||
- Module path: `gregExt.AssetExporter/`
|
||||
- Overview: [`Standalone Mods`](/wiki/legacy/wiki-import/StandaloneMods)
|
||||
- See also: [Mods overview](/wiki/mods/)
|
||||
|
||||
@@ -12,4 +12,4 @@ Contains **multiplayer / networking** runtime (bridge, sync). **Not** the same a
|
||||
## Sources
|
||||
|
||||
- Module path: `gregExt.Multiplayer/`
|
||||
- Roadmap context: [`Steamworks P2P Multiplayer Roadmap`](/wiki/legacy/wiki-import/Steamworks-P2P-Multiplayer-Roadmap)
|
||||
- Roadmap: [Unified roadmap](/wiki/roadmap/unified-roadmap) · [Multiplayer topic](/wiki/topics/multiplayer-and-networking/overview)
|
||||
|
||||
@@ -12,4 +12,4 @@ Hosts standalone player-model specific behavior and integration.
|
||||
## Sources
|
||||
|
||||
- Module path: `gregExt.PlayerModels/`
|
||||
- Debug docs: [`Mod Developer Debug`](/wiki/legacy/wiki-import/Mod-Developer-Debug)
|
||||
- Debug: [Mod developers (hub)](/wiki/guides/mod-developers/overview)
|
||||
|
||||
@@ -12,4 +12,4 @@ Contains **sysadmin-oriented UI** features (Unity UI modernization, mod settings
|
||||
## Sources
|
||||
|
||||
- Module path: `gregExt.Sysadmin/`
|
||||
- Framework context: [`Framework Features & Use Cases`](/wiki/legacy/wiki-import/Framework-Features-Use-Cases)
|
||||
- Framework context: [Framework](/wiki/mods/framework)
|
||||
|
||||
@@ -12,4 +12,4 @@ Focuses on standalone web UI bridge integration flows.
|
||||
## Sources
|
||||
|
||||
- Module path: `gregExt.WebUIBridge/`
|
||||
- Reference: [`Web UI Bridge (DC2WEB)`](/wiki/legacy/wiki-import/Web-UI-Bridge)
|
||||
- Related: [Multiplayer & networking hub](/wiki/topics/multiplayer-and-networking/overview)
|
||||
|
||||
@@ -6,7 +6,7 @@ description: FFM.Plugin.* modules that extend the framework runtime — distinct
|
||||
|
||||
# Framework plugins (`FFM.Plugin.*`)
|
||||
|
||||
These **plugins** ship as `FFM.Plugin.*` assemblies and extend the **framework runtime**. **Source of truth** on disk: one split-repo folder per plugin under the workspace root, named **`gregExt.<Name>/`** (for example `gregExt.AssetExporter/`). Mirrored copies may also exist under `gregCore/plugins/` for solution builds. Deploy built DLLs under the game’s 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 game’s 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.
|
||||
|
||||
|
||||
@@ -26,5 +26,6 @@ That applies to anything shipped as a **`gregMod.*`**, **`gregExt.*`**, or **`FF
|
||||
|
||||
## See also
|
||||
|
||||
- [System architecture & documentation principles](/wiki/meta/system-architecture-principles) — stack model and documentation rules
|
||||
- [Framework](/wiki/mods/framework) — runtime surface for mod authors
|
||||
- [FMF hook naming](/wiki/reference/fmf-hook-naming)
|
||||
|
||||
@@ -6,6 +6,8 @@ description: FFI, hook lists, naming — curated reference for mod and plugin au
|
||||
|
||||
# FFI, hooks & Lua
|
||||
|
||||
The framework is intended to act as a **hook proxy**: Unity / IL2CPP events are surfaced as **stable framework events** for mods — see [System architecture & documentation principles](/wiki/meta/system-architecture-principles).
|
||||
|
||||
- [FMF hooks](/wiki/framework/fmf-hooks) — generated hook surface
|
||||
- [FMF hooks catalog](/wiki/reference/fmf-hooks-catalog) — strings from core sources
|
||||
- [FMF hook naming](/wiki/reference/fmf-hook-naming) — `FMF.*` vs legacy `FFM.*`
|
||||
|
||||
@@ -8,6 +8,8 @@ description: Thematic index — cross-cutting overviews (assets, multiplayer, se
|
||||
|
||||
Documentation is **curated** in this repository: guides, framework articles, reference data (hook catalogs), and contributor workflow — versioned with **gregFramework** and **gregWiki**.
|
||||
|
||||
**Stack model:** [System architecture & documentation principles](/wiki/meta/system-architecture-principles) — **ModManager → Framework → Plugins → Mods**, priorities, and author guidelines.
|
||||
|
||||
## Quick map
|
||||
|
||||
| Area | Start here |
|
||||
|
||||
@@ -10,39 +10,39 @@ This page is the **single reference** for where mod-related files live next to t
|
||||
|
||||
## Summary
|
||||
|
||||
| Inhalt | Pfad | Format / Hinweis |
|
||||
|--------|------|------------------|
|
||||
| **Mod-Konfiguration & Sidecars** | `{GameRoot}/UserData/ModCfg/` | **JSON** für Konfigurationsdateien; weitere Sidecar-Dateien (z. B. `custom_employees_hired.txt`) liegen ebenfalls hier, damit alles Mod-Bezogene an einem Ort liegt. |
|
||||
| **FMF Framework-Plugins** (FFM.Plugin.*) | `{GameRoot}/FMF/Plugins/` | DLLs; **MelonLoader** lädt standardmäßig nur `{GameRoot}/Mods` — siehe unten. |
|
||||
| **Plugins** (MelonLoader, z. B. ModPathRedirector) | `{GameRoot}/Plugins/` | MelonLoader `Plugins`-Ordner — nur **MelonPlugin**-DLLs. |
|
||||
| **Mods** (MelonLoader, z. B. FMF.Mod.*) | `{GameRoot}/Mods/` | MelonLoader `Mods`-Ordner — **MelonMod**-DLLs. |
|
||||
| Content | Path | Format / notes |
|
||||
|--------|------|----------------|
|
||||
| **Mod configuration & sidecars** | `{GameRoot}/UserData/ModCfg/` | **JSON** config files; additional sidecar files (e.g. `custom_employees_hired.txt`) live here so mod-related files stay in one place. |
|
||||
| **FMF framework plugins** (FFM.Plugin.*) | `{GameRoot}/FMF/Plugins/` | DLLs; **MelonLoader** only scans `{GameRoot}/Mods` by default — see below. |
|
||||
| **Plugins** (MelonLoader, e.g. ModPathRedirector) | `{GameRoot}/Plugins/` | MelonLoader `Plugins` folder — **MelonPlugin** DLLs only. |
|
||||
| **Mods** (MelonLoader, e.g. FMF.Mod.*) | `{GameRoot}/Mods/` | MelonLoader `Mods` folder — **MelonMod** DLLs. |
|
||||
|
||||
## UserData/ModCfg
|
||||
|
||||
- Alle **mod-relevanten** Konfigurationen und JSON-Sidecars werden unter **`UserData/ModCfg`** geführt.
|
||||
- Beim ersten Start werden fehlende Dateien angelegt; bei bestehenden Installationen werden ältere Dateien aus **`UserData/`** (Root) nach **`ModCfg/`** übernommen, sofern noch vorhanden.
|
||||
- Beispiele: `multiplayer-sync.config.json`, `pluginsync.config.json`.
|
||||
- Framework-Metadaten (z. B. Save-Compat-Stamp) liegen unter **`UserData/ModCfg/FrikaFM/`** (Migration von `UserData/FrikaFM`).
|
||||
- All **mod-related** configuration and JSON sidecars live under **`UserData/ModCfg`**.
|
||||
- On first start, missing files are created; on existing installs, older files may be migrated from **`UserData/`** (root) into **`ModCfg/`** when still present.
|
||||
- Examples: `multiplayer-sync.config.json`, `pluginsync.config.json`.
|
||||
- Framework metadata (e.g. save-compat stamp) lives under **`UserData/ModCfg/FrikaFM/`** (migrated from `UserData/FrikaFM`).
|
||||
|
||||
## FMF/Plugins und MelonLoader
|
||||
## FMF/Plugins and MelonLoader
|
||||
|
||||
**FFM-Plugin-DLLs** liegen kanonisch unter **`{GameRoot}/FMF/Plugins`**. MelonLoader enumeriert **standardmäßig** nur **`Mods/`**. Praktische Optionen:
|
||||
**FFM plugin DLLs** canonically live under **`{GameRoot}/FMF/Plugins`**. MelonLoader enumerates **`Mods/`** by default. Practical options:
|
||||
|
||||
1. **DLLs zusätzlich** (oder verlinkt) **`Mods/`** ablegen — üblicher Weg für automatisches Laden.
|
||||
2. **Unterordner** von `Mods` nutzen, falls eure MelonLoader-Version Mods in Unterverzeichnissen lädt (Version je nach Release prüfen).
|
||||
3. **PluginSync**-Downloads des Frameworks landen unter **`FMF/Plugins/PluginSync/...`**.
|
||||
1. **Also place** (or link) DLLs under **`Mods/`** — common path for automatic loading.
|
||||
2. Use **subfolders** under `Mods` if your MelonLoader version loads mods from subdirectories (check your ML version).
|
||||
3. **PluginSync** downloads from the framework land under **`FMF/Plugins/PluginSync/...`**.
|
||||
|
||||
## Mods (FMF-basiert)
|
||||
## Mods (FMF-based)
|
||||
|
||||
Normale **MelonLoader-Mods** (einschließlich FMF-Mods) werden wie gewohnt in **`{GameRoot}/Mods/`** installiert.
|
||||
Standard **MelonLoader mods** (including FMF-based mods) install under **`{GameRoot}/Mods/`** as usual.
|
||||
|
||||
## Steam Workshop (Spiel) vs. MelonLoader
|
||||
## Steam Workshop (game) vs MelonLoader
|
||||
|
||||
Das Spiel legt abonnierte Workshop-Inhalte unter **`{GameRoot}/{ExeName}_Data/StreamingAssets/mods/workshop_<PublishedFileId>/WorkshopUploadContent`** ab (nativer `ModLoader`, nicht MelonLoader).
|
||||
The game stores subscribed Workshop content under **`{GameRoot}/{ExeName}_Data/StreamingAssets/mods/workshop_<PublishedFileId>/WorkshopUploadContent`** (native `ModLoader`, not MelonLoader).
|
||||
|
||||
- **MelonLoader** durchsucht **`{GameRoot}/Mods`** (inkl. Unterordner, je nach Einstellung), **nicht** beliebige Pfade über `Loader.cfg`.
|
||||
- **UserData:** MelonLoader-Konfiguration liegt unter **`{GameRoot}/UserData/`** (z. B. **`MelonLoader.cfg`** / je nach Version **`UserData/MelonLoader/Loader.cfg`** — bei Install prüfen). Relevant für Unterordner-Laden: **`disable_subfolder_load = false`**, optional **`disable_subfolder_manifest = true`**.
|
||||
- **Workshop-DLLs in den Melon-Scan einbinden:** Junction (oder Symlink) von einem Ordner unter **`Mods/`** auf den **`WorkshopUploadContent`**-Pfad desselben Items, z. B. (PowerShell, Pfade anpassen):
|
||||
- **MelonLoader** scans **`{GameRoot}/Mods`** (including subfolders, depending on settings), **not** arbitrary paths via `Loader.cfg`.
|
||||
- **UserData:** MelonLoader config lives under **`{GameRoot}/UserData/`** (e.g. **`MelonLoader.cfg`** or, depending on version, **`UserData/MelonLoader/Loader.cfg`** — verify on install). For subfolder loading: **`disable_subfolder_load = false`**, optionally **`disable_subfolder_manifest = true`**.
|
||||
- **Point Workshop DLLs into Melon’s scan:** use a junction (or symlink) from a folder under **`Mods/`** to the item’s **`WorkshopUploadContent`** path, e.g. (PowerShell, adjust paths):
|
||||
|
||||
```powershell
|
||||
$game = "C:\Path\To\Data Center"
|
||||
@@ -52,11 +52,11 @@ $link = Join-Path $game "Mods\workshop_$id"
|
||||
cmd /c mklink /J "$link" "$target"
|
||||
```
|
||||
|
||||
Ohne Junction müssen MelonMods weiter physisch unter **`Mods/`** liegen oder über eure Verteilung dort landen.
|
||||
Without a junction, Melon mods must still live physically under **`Mods/`** or be deployed there by your distribution.
|
||||
|
||||
**WorkshopUploader-Vorlagen (modded):** Unter **`content/`** werden **`Mods/`**, **`Plugins/`** und ein **`ModFramework/`**-Baum angelegt — **`ModFramework/FMF/Plugins`** entspricht dabei **`{GameRoot}/FMF/Plugins`**, wenn ihr **`FMF`** per Junction auf **`…/WorkshopUploadContent/ModFramework/FMF`** zeigen lasst. Weitere Framework-Dateien (Konfiguration, Assets) können unter **`ModFramework/`** gebündelt werden.
|
||||
**WorkshopUploader templates (modded):** Under **`content/`**, **`Mods/`**, **`Plugins/`**, and a **`ModFramework/`** tree are created — **`ModFramework/FMF/Plugins`** maps to **`{GameRoot}/FMF/Plugins`** if you junction **`FMF`** to **`…/WorkshopUploadContent/ModFramework/FMF`**. Additional framework files (config, assets) can be bundled under **`ModFramework/`**.
|
||||
|
||||
## Siehe auch
|
||||
## See also
|
||||
|
||||
- [Meta & operations](/wiki/topics/meta/overview)
|
||||
- Mod configuration contracts are described alongside runtime docs in [Framework](/wiki/mods/framework) and core `README` in **gregFramework** (paths under **`UserData/ModCfg/`** follow the game + framework conventions above).
|
||||
- Mod configuration contracts are described with runtime docs in [Framework](/wiki/mods/framework) and the core `README` in **gregFramework** (paths under **`UserData/ModCfg/`** follow the conventions above).
|
||||
|
||||
@@ -13,7 +13,7 @@ The **gregFramework** folder groups several repositories (split layout). Use thi
|
||||
| **Framework core** | `gregCore/` | MelonLoader host (`gregCore/framework/FrikaMF.csproj`), templates, **`gregCore/mcp-server/`**, optional `gregCore/plugins/` mirrors |
|
||||
| **Gameplay mods** | `gregMod.<Name>/` | Standalone mods (`FMF.*`) — **directly under `gregFramework/`** (the `gregMods/` umbrella is deprecated) |
|
||||
| **Framework plugins** | `gregExt.<Name>/` | FFM plugins (`FFM.Plugin.*`) — **directly under `gregFramework/`** (the `gregExtensions/` umbrella is deprecated) |
|
||||
| **Workshop desktop app** | `gregModmanager/` | **Gregtools Modmanager** (MAUI); project file `WorkshopUploader.csproj`, executable **`WorkshopUploader.exe`** |
|
||||
| **ModManager (MAUI)** | `gregModmanager/` | **Gregtools Modmanager** — grafisches Frontend zur Verwaltung von Mods/Plugins; `WorkshopUploader.csproj`, **`WorkshopUploader.exe`**. Siehe [Architecture principles](/wiki/meta/system-architecture-principles). |
|
||||
| **Data Center exporter / assets** | `gregDataCenterExporter/` | Templates, exporter tooling, `FrikaModFramework/fmf_hooks.json` (among copies) |
|
||||
| **Documentation** | `gregWiki/` | This Docusaurus site (`docs/`) |
|
||||
| **Mod store / web (if cloned)** | `gregStore/` | Private Next.js modstore stack (`web/`, …) — optional sibling repo |
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
const config = {
|
||||
title: 'gregFramework',
|
||||
tagline: 'Community docs for gregFramework — Data Center mods, FMF plugins, hooks, and split-repo layout',
|
||||
tagline: 'Player-first help for Data Center mods; full technical docs for authors under Developers.',
|
||||
favicon: 'img/logo.svg',
|
||||
url: 'https://frikadellental.de',
|
||||
baseUrl: '/',
|
||||
@@ -24,10 +24,9 @@ const config = {
|
||||
],
|
||||
i18n: {
|
||||
defaultLocale: 'en',
|
||||
locales: ['en', 'de'],
|
||||
locales: ['en'],
|
||||
localeConfigs: {
|
||||
en: {label: 'English', htmlLang: 'en-GB'},
|
||||
de: {label: 'Deutsch', htmlLang: 'de-DE'},
|
||||
},
|
||||
},
|
||||
presets: [
|
||||
@@ -204,23 +203,15 @@ const config = {
|
||||
items: [
|
||||
{to: '/', label: 'Home', position: 'left'},
|
||||
{
|
||||
label: 'Docs Hub',
|
||||
label: 'Docs',
|
||||
position: 'left',
|
||||
items: [
|
||||
{to: '/wiki', label: 'Overview'},
|
||||
{to: '/wiki/mods/framework', label: 'Framework'},
|
||||
{to: '/wiki/plugins/', label: 'Plugins'},
|
||||
{to: '/wiki/mods/', label: 'Mods'},
|
||||
{to: '/wiki/roadmap/unified-roadmap', label: 'Roadmap'},
|
||||
{to: '/wiki/guides/players/overview', label: 'For players'},
|
||||
{to: '/wiki/developers', label: 'Developers'},
|
||||
{to: '/mods', label: 'Mod catalog'},
|
||||
],
|
||||
},
|
||||
{
|
||||
type: 'localeDropdown',
|
||||
className: 'nav-locale nav-right-icon nav-icon-only',
|
||||
position: 'right',
|
||||
dropdownItemsBefore: [],
|
||||
dropdownItemsAfter: [],
|
||||
},
|
||||
{to: '/mods', label: 'Mods', position: 'right', className: 'nav-right-icon nav-icon-only nav-link-mods', 'aria-label': 'Mods'},
|
||||
{href: 'https://discord.gg/greg', label: 'Discord', position: 'right', className: 'nav-right-icon nav-icon-only nav-link-discord', 'aria-label': 'Discord'},
|
||||
{href: 'https://github.com/mleem97/gregFramework/issues', label: 'Support', position: 'right', className: 'nav-right-icon nav-icon-only nav-link-support', 'aria-label': 'Support'},
|
||||
@@ -230,6 +221,14 @@ const config = {
|
||||
footer: {
|
||||
style: 'dark',
|
||||
links: [
|
||||
{
|
||||
title: 'Wiki',
|
||||
items: [
|
||||
{label: 'Home', to: '/wiki'},
|
||||
{label: 'For players', to: '/wiki/guides/players/overview'},
|
||||
{label: 'Developers', to: '/wiki/developers'},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Community',
|
||||
items: [
|
||||
@@ -251,7 +250,7 @@ const config = {
|
||||
],
|
||||
},
|
||||
],
|
||||
copyright: `Copyright ${new Date().getFullYear()} <a href="https://meyermedia.eu" target="_blank" rel="noopener noreferrer">Meyer Media</a><br/>Dieses Wiki ist ein Community-Projekt und steht in keiner Verbindung zu WASEKU oder dem Spiel selbst.`,
|
||||
copyright: `Copyright ${new Date().getFullYear()} <a href="https://meyermedia.eu" target="_blank" rel="noopener noreferrer">Meyer Media</a><br/>This wiki is a community project and is not affiliated with WASEKU or the game.`,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -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).
|
||||
@@ -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/`.
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -11,8 +11,8 @@
|
||||
"wiki:sync": "node ./scripts/sync-wiki-to-docs.mjs",
|
||||
"wiki:normalize-i18n": "node ./scripts/normalize-wiki-import-i18n.mjs",
|
||||
"wiki:refresh": "node ./scripts/sync-wiki-to-docs.mjs && node ./scripts/normalize-wiki-import-i18n.mjs",
|
||||
"format": "prettier --write src scripts docusaurus.config.js sidebars.js README.md docs/getting-started/documentation-layout.md package.json .prettierrc.json docker-compose.yml",
|
||||
"format:check": "prettier --check src scripts docusaurus.config.js sidebars.js README.md docs/getting-started/documentation-layout.md package.json .prettierrc.json docker-compose.yml"
|
||||
"format": "prettier --write src scripts docusaurus.config.js sidebars.js README.md docs/README.md docs/getting-started/documentation-layout.md package.json .prettierrc.json docker-compose.yml",
|
||||
"format:check": "prettier --check src scripts docusaurus.config.js sidebars.js README.md docs/README.md docs/getting-started/documentation-layout.md package.json .prettierrc.json docker-compose.yml"
|
||||
},
|
||||
"dependencies": {
|
||||
"@docusaurus/core": "^3.10.0",
|
||||
|
||||
@@ -24,13 +24,7 @@ function walk(dir) {
|
||||
}
|
||||
}
|
||||
|
||||
const roots = [
|
||||
path.resolve(import.meta.dirname, '../docs/legacy/wiki-import'),
|
||||
path.resolve(
|
||||
import.meta.dirname,
|
||||
'../i18n/de/docusaurus-plugin-content-docs/current/legacy/wiki-import',
|
||||
),
|
||||
];
|
||||
const roots = [path.resolve(import.meta.dirname, '../docs/legacy/wiki-import')];
|
||||
for (const r of roots) {
|
||||
if (fs.existsSync(r)) walk(r);
|
||||
}
|
||||
|
||||
@@ -1,164 +1,8 @@
|
||||
/**
|
||||
* Split legacy wiki-import pairs (Base.md = DE, Base-en.md = EN) into:
|
||||
* - docs/legacy/wiki-import/** → default locale (en), Docusaurus
|
||||
* - i18n/de/.../current/legacy/wiki-import/** → Deutsch
|
||||
*
|
||||
* German-only pages (no Base-en.md) → DE in i18n/de, EN stub in docs/legacy/wiki-import.
|
||||
*
|
||||
* Usage (from gregWiki repo root):
|
||||
* node scripts/normalize-wiki-import-i18n.mjs
|
||||
* node scripts/normalize-wiki-import-i18n.mjs --dry-run
|
||||
* Legacy: split DE/EN wiki-import pairs. Retired together with docs/legacy/wiki-import/.
|
||||
*/
|
||||
|
||||
import {
|
||||
existsSync,
|
||||
mkdirSync,
|
||||
readFileSync,
|
||||
readdirSync,
|
||||
rmSync,
|
||||
statSync,
|
||||
writeFileSync,
|
||||
} from 'node:fs';
|
||||
import {basename, dirname, join, relative, resolve} from 'node:path';
|
||||
|
||||
const repoRoot = resolve(import.meta.dirname, '..');
|
||||
const docsWikiImport = join(repoRoot, 'docs', 'legacy', 'wiki-import');
|
||||
const deWikiImport = join(
|
||||
repoRoot,
|
||||
'i18n',
|
||||
'de',
|
||||
'docusaurus-plugin-content-docs',
|
||||
'current',
|
||||
'legacy',
|
||||
'wiki-import',
|
||||
console.log(
|
||||
'[wiki:normalize-i18n] Skipped: legacy wiki-import i18n split is no longer used.\n' +
|
||||
'Curated docs are English-only under docs/.',
|
||||
);
|
||||
|
||||
const dryRun = process.argv.includes('--dry-run');
|
||||
|
||||
function englishStub(title) {
|
||||
return `---
|
||||
title: ${title}
|
||||
description: English translation pending; use the Deutsch locale for the full legacy page.
|
||||
---
|
||||
|
||||
:::note
|
||||
This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under \`docs/legacy/wiki-import\`.
|
||||
:::
|
||||
|
||||
`;
|
||||
}
|
||||
|
||||
function ensureDir(p) {
|
||||
mkdirSync(p, {recursive: true});
|
||||
}
|
||||
|
||||
function walkMarkdownFiles(root, base = root) {
|
||||
const out = [];
|
||||
for (const name of readdirSync(root)) {
|
||||
const full = join(root, name);
|
||||
const st = statSync(full);
|
||||
if (st.isDirectory()) {
|
||||
out.push(...walkMarkdownFiles(full, base));
|
||||
} else if (st.isFile() && name.toLowerCase().endsWith('.md')) {
|
||||
out.push(relative(base, full).replace(/\\/g, '/'));
|
||||
}
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
function toEnSibling(rel) {
|
||||
if (!rel.endsWith('.md')) return null;
|
||||
const d = dirname(rel);
|
||||
const base = basename(rel, '.md');
|
||||
return d === '.' ? `${base}-en.md` : `${d}/${base}-en.md`;
|
||||
}
|
||||
|
||||
function main() {
|
||||
if (!existsSync(docsWikiImport)) {
|
||||
console.error(`Missing ${docsWikiImport}`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const allRel = new Set(walkMarkdownFiles(docsWikiImport));
|
||||
const pairBases = new Set();
|
||||
const germanOnly = [];
|
||||
|
||||
for (const rel of allRel) {
|
||||
const file = basename(rel);
|
||||
if (file.endsWith('-en.md')) continue;
|
||||
|
||||
const enRel = toEnSibling(rel);
|
||||
if (enRel && allRel.has(enRel)) {
|
||||
pairBases.add(rel);
|
||||
continue;
|
||||
}
|
||||
|
||||
germanOnly.push(rel);
|
||||
}
|
||||
|
||||
// Paired: Base.md + Base-en.md
|
||||
for (const relBase of pairBases) {
|
||||
const enRel = toEnSibling(relBase);
|
||||
const pathBase = join(docsWikiImport, relBase);
|
||||
const pathEn = join(docsWikiImport, enRel);
|
||||
const german = readFileSync(pathBase, 'utf8');
|
||||
const english = readFileSync(pathEn, 'utf8');
|
||||
const deTarget = join(deWikiImport, relBase);
|
||||
const enTarget = join(docsWikiImport, relBase);
|
||||
|
||||
if (dryRun) {
|
||||
console.log(`[pair] ${relBase} + ${enRel} → EN docs + DE i18n`);
|
||||
continue;
|
||||
}
|
||||
|
||||
ensureDir(dirname(deTarget));
|
||||
writeFileSync(deTarget, german, 'utf8');
|
||||
writeFileSync(enTarget, english, 'utf8');
|
||||
rmSync(pathEn);
|
||||
console.log(`[pair] ${relBase}`);
|
||||
}
|
||||
|
||||
// English-only sibling (Home-en.md without Home.md) — rare
|
||||
for (const rel of allRel) {
|
||||
if (!rel.endsWith('-en.md')) continue;
|
||||
const baseRel = rel.replace(/-en\.md$/, '.md');
|
||||
if (pairBases.has(baseRel)) continue;
|
||||
|
||||
const pathEn = join(docsWikiImport, rel);
|
||||
const pathBase = join(docsWikiImport, baseRel);
|
||||
const english = readFileSync(pathEn, 'utf8');
|
||||
|
||||
if (dryRun) {
|
||||
console.log(`[en-only] ${rel} → ${baseRel}`);
|
||||
continue;
|
||||
}
|
||||
|
||||
ensureDir(dirname(pathBase));
|
||||
writeFileSync(pathBase, english, 'utf8');
|
||||
rmSync(pathEn);
|
||||
console.log(`[en-only] ${rel} → ${baseRel}`);
|
||||
}
|
||||
|
||||
// German-only: no Base-en.md (pair bases are excluded from germanOnly)
|
||||
for (const rel of germanOnly) {
|
||||
const pathBase = join(docsWikiImport, rel);
|
||||
const german = readFileSync(pathBase, 'utf8');
|
||||
const deTarget = join(deWikiImport, rel);
|
||||
const titleMatch = german.match(/^title:\s*(.+)$/m);
|
||||
const title = titleMatch ? titleMatch[1].trim().replace(/"/g, '\\"') : basename(rel, '.md');
|
||||
|
||||
if (dryRun) {
|
||||
console.log(`[de-only] ${rel} → i18n/de + EN stub`);
|
||||
continue;
|
||||
}
|
||||
|
||||
ensureDir(dirname(deTarget));
|
||||
writeFileSync(deTarget, german, 'utf8');
|
||||
writeFileSync(pathBase, englishStub(title), 'utf8');
|
||||
console.log(`[de-only] ${rel}`);
|
||||
}
|
||||
|
||||
console.log(dryRun ? 'Dry run complete.' : 'Done. Next: npm run build');
|
||||
}
|
||||
|
||||
main();
|
||||
process.exit(0);
|
||||
|
||||
@@ -1,50 +1,9 @@
|
||||
import {existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync} from 'node:fs';
|
||||
import {join, resolve} from 'node:path';
|
||||
|
||||
const projectRoot = resolve(process.cwd());
|
||||
const gregFrameworkRoot = resolve(projectRoot, '..');
|
||||
const wikiDir = join(gregFrameworkRoot, '.wiki');
|
||||
const outDir = join(projectRoot, 'docs', 'legacy', 'wiki-import');
|
||||
|
||||
if (!existsSync(wikiDir)) {
|
||||
console.error(
|
||||
`Missing ${wikiDir}. Clone or restore the GitHub Wiki working tree there, then re-run this script.\n` +
|
||||
'Existing files under docs/legacy/wiki-import/ are left unchanged.',
|
||||
);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
mkdirSync(outDir, {recursive: true});
|
||||
|
||||
function collectMarkdownFiles(rootDir, prefix = '') {
|
||||
const entries = readdirSync(join(rootDir, prefix), {withFileTypes: true});
|
||||
const results = [];
|
||||
|
||||
for (const entry of entries) {
|
||||
const relativePath = prefix ? join(prefix, entry.name) : entry.name;
|
||||
if (entry.isDirectory()) {
|
||||
results.push(...collectMarkdownFiles(rootDir, relativePath));
|
||||
continue;
|
||||
}
|
||||
|
||||
if (entry.isFile() && entry.name.toLowerCase().endsWith('.md')) {
|
||||
results.push(relativePath);
|
||||
}
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
const files = collectMarkdownFiles(wikiDir);
|
||||
|
||||
for (const file of files) {
|
||||
const source = join(wikiDir, file);
|
||||
const sanitizedRelative = file.replace(/\s+/g, '-');
|
||||
const target = join(outDir, sanitizedRelative);
|
||||
const targetDir = resolve(target, '..');
|
||||
mkdirSync(targetDir, {recursive: true});
|
||||
const raw = readFileSync(source, 'utf8');
|
||||
writeFileSync(target, raw, 'utf8');
|
||||
}
|
||||
|
||||
console.log(`Synced ${files.length} wiki files to ${outDir}`);
|
||||
/**
|
||||
* Legacy GitHub Wiki → docs/ mirror. Removed: content now lives only under docs/ (curated).
|
||||
* Keep this script as a no-op so old CI or docs do not reference a missing file.
|
||||
*/
|
||||
console.log(
|
||||
'[wiki:sync] Skipped: the bulk wiki-import under docs/legacy/wiki-import/ was retired.\n' +
|
||||
'Author and edit Markdown under docs/ in gregWiki; use git history for old mirror text.',
|
||||
);
|
||||
process.exit(0);
|
||||
|
||||
@@ -17,13 +17,7 @@ const pairs = [
|
||||
['TechnicalReference/Troubleshooting', 'wiki-import-techref-troubleshooting'],
|
||||
];
|
||||
|
||||
const bases = [
|
||||
path.resolve(import.meta.dirname, '../docs/legacy/wiki-import'),
|
||||
path.resolve(
|
||||
import.meta.dirname,
|
||||
'../i18n/de/docusaurus-plugin-content-docs/current/legacy/wiki-import',
|
||||
),
|
||||
];
|
||||
const bases = [path.resolve(import.meta.dirname, '../docs/legacy/wiki-import')];
|
||||
|
||||
for (const base of bases) {
|
||||
if (!fs.existsSync(base)) continue;
|
||||
|
||||
335
sidebars.js
335
sidebars.js
@@ -4,184 +4,191 @@ const sidebars = {
|
||||
'intro',
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Getting started',
|
||||
items: ['getting-started', 'getting-started/documentation-layout'],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Workspace',
|
||||
items: ['workspace/index'],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Framework',
|
||||
items: ['framework/architecture', 'framework/fmf-hooks', 'framework/hexmod'],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Plugins (FFM)',
|
||||
label: 'Play & mods',
|
||||
collapsed: false,
|
||||
items: [
|
||||
'plugins/index',
|
||||
'plugins/ffm-plugin-asset-exporter',
|
||||
'plugins/ffm-plugin-multiplayer',
|
||||
'plugins/ffm-plugin-player-models',
|
||||
'plugins/ffm-plugin-sysadmin',
|
||||
'plugins/ffm-plugin-web-ui-bridge',
|
||||
],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Mods (FMF)',
|
||||
link: {type: 'doc', id: 'mods/index'},
|
||||
items: [
|
||||
'mods/index',
|
||||
'mods/framework',
|
||||
'mods/fmf-console-input-guard',
|
||||
'mods/fmf-gregify-employees',
|
||||
'mods/fmf-hex-label-mod',
|
||||
'mods/fmf-lang-compat-bridge',
|
||||
'mods/fmf-ui-replacement-mod',
|
||||
],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Tools & operations',
|
||||
items: [
|
||||
'tools/workshop-uploader',
|
||||
'meta/Steam-Workshop-and-Tooling',
|
||||
'meta/devserver-betas',
|
||||
'meta/IDEA_BACKLOG',
|
||||
],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Guides',
|
||||
items: [
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Players',
|
||||
key: 'guides-players',
|
||||
items: [
|
||||
'guides/players/overview',
|
||||
'guides/players/audiences-overview',
|
||||
'guides/players/newbies',
|
||||
'guides/players/intermediates',
|
||||
'guides/players/professionals',
|
||||
'guides/players/enduser-workshop',
|
||||
],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Mod developers',
|
||||
key: 'guides-mod-developers',
|
||||
items: ['guides/mod-developers/overview'],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Contributors',
|
||||
key: 'guides-contributors',
|
||||
items: [
|
||||
'guides/contributors/topics-overview',
|
||||
'guides/contributors/contributor-workshop',
|
||||
'guides/contributors/release',
|
||||
],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Sponsors',
|
||||
key: 'guides-sponsors',
|
||||
items: ['guides/sponsors/overview'],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Releases',
|
||||
link: {type: 'doc', id: 'releases/index'},
|
||||
items: [
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Plugin releases',
|
||||
items: [
|
||||
'releases/plugins/ffm-plugin-asset-exporter-release',
|
||||
'releases/plugins/ffm-plugin-multiplayer-release',
|
||||
'releases/plugins/ffm-plugin-player-models-release',
|
||||
'releases/plugins/ffm-plugin-sysadmin-release',
|
||||
'releases/plugins/ffm-plugin-web-ui-bridge-release',
|
||||
'releases/plugins/fmf-modpathredirector-release',
|
||||
],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Tool releases',
|
||||
items: ['releases/tools/gregtools-modmanager-1.0-release'],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Mod releases',
|
||||
items: [
|
||||
'releases/mods/fmf-console-input-guard-release',
|
||||
'releases/mods/fmf-gregify-employees-release',
|
||||
'releases/mods/fmf-hex-label-mod-release',
|
||||
'releases/mods/fmf-lang-compat-bridge-release',
|
||||
'releases/mods/fmf-ui-replacement-mod-release',
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Reference',
|
||||
items: [
|
||||
'reference/wiki-mapping',
|
||||
'reference/mod-store-vision',
|
||||
'reference/fmf-hook-naming',
|
||||
'reference/fmf-hooks-catalog',
|
||||
'reference/mcp-server',
|
||||
'guides/players/overview',
|
||||
'guides/players/enduser-workshop',
|
||||
'reference/release-channels',
|
||||
'reference/reference-data-files',
|
||||
],
|
||||
},
|
||||
'tools/workshop-uploader',
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Contributors (workflow)',
|
||||
label: 'Developers & contributors',
|
||||
collapsed: true,
|
||||
link: {type: 'doc', id: 'developers'},
|
||||
items: [
|
||||
'contributors/repo-inventory',
|
||||
'contributors/monorepo-target-layout',
|
||||
'contributors/luminescent-design-system',
|
||||
'contributors/docusaurus-workflow',
|
||||
'contributors/plugin-submission-audit',
|
||||
'contributors/sponsorship-automation',
|
||||
],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Roadmap',
|
||||
items: ['roadmap/unified-roadmap', 'roadmap/mod-store-stages'],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Topics hub',
|
||||
link: {type: 'doc', id: 'topics/index'},
|
||||
items: [
|
||||
'topics/index',
|
||||
'developers',
|
||||
'meta/system-architecture-principles',
|
||||
'getting-started',
|
||||
'getting-started/documentation-layout',
|
||||
'workspace/index',
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Cross-cutting topics',
|
||||
label: 'Framework',
|
||||
items: ['framework/architecture', 'framework/fmf-hooks', 'framework/hexmod'],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Plugins (FFM)',
|
||||
items: [
|
||||
'topics/assets-and-export/overview',
|
||||
'topics/multiplayer-and-networking/overview',
|
||||
'topics/ffi-and-hooks/overview',
|
||||
'topics/security-legal/overview',
|
||||
'topics/reference/overview',
|
||||
'topics/roadmap/overview',
|
||||
'topics/meta/overview',
|
||||
'topics/meta/game-folder-layout',
|
||||
'plugins/index',
|
||||
'plugins/ffm-plugin-asset-exporter',
|
||||
'plugins/ffm-plugin-multiplayer',
|
||||
'plugins/ffm-plugin-player-models',
|
||||
'plugins/ffm-plugin-sysadmin',
|
||||
'plugins/ffm-plugin-web-ui-bridge',
|
||||
],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Mods (FMF)',
|
||||
link: {type: 'doc', id: 'mods/index'},
|
||||
items: [
|
||||
'mods/index',
|
||||
'mods/framework',
|
||||
'mods/fmf-console-input-guard',
|
||||
'mods/fmf-gregify-employees',
|
||||
'mods/fmf-hex-label-mod',
|
||||
'mods/fmf-lang-compat-bridge',
|
||||
'mods/fmf-ui-replacement-mod',
|
||||
],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Tools & operations',
|
||||
items: [
|
||||
'meta/Steam-Workshop-and-Tooling',
|
||||
'meta/devserver-betas',
|
||||
'meta/IDEA_BACKLOG',
|
||||
],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Guides',
|
||||
items: [
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Players (extra)',
|
||||
items: [
|
||||
'guides/players/audiences-overview',
|
||||
'guides/players/newbies',
|
||||
'guides/players/intermediates',
|
||||
'guides/players/professionals',
|
||||
],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Mod developers',
|
||||
items: ['guides/mod-developers/overview'],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Contributors',
|
||||
items: [
|
||||
'guides/contributors/topics-overview',
|
||||
'guides/contributors/contributor-workshop',
|
||||
'guides/contributors/release',
|
||||
],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Sponsors',
|
||||
items: ['guides/sponsors/overview'],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Releases',
|
||||
link: {type: 'doc', id: 'releases/index'},
|
||||
items: [
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Plugin releases',
|
||||
items: [
|
||||
'releases/plugins/ffm-plugin-asset-exporter-release',
|
||||
'releases/plugins/ffm-plugin-multiplayer-release',
|
||||
'releases/plugins/ffm-plugin-player-models-release',
|
||||
'releases/plugins/ffm-plugin-sysadmin-release',
|
||||
'releases/plugins/ffm-plugin-web-ui-bridge-release',
|
||||
'releases/plugins/fmf-modpathredirector-release',
|
||||
],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Tool releases',
|
||||
items: ['releases/tools/gregtools-modmanager-1.0-release'],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Mod releases',
|
||||
items: [
|
||||
'releases/mods/fmf-console-input-guard-release',
|
||||
'releases/mods/fmf-gregify-employees-release',
|
||||
'releases/mods/fmf-hex-label-mod-release',
|
||||
'releases/mods/fmf-lang-compat-bridge-release',
|
||||
'releases/mods/fmf-ui-replacement-mod-release',
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Reference',
|
||||
items: [
|
||||
'reference/wiki-mapping',
|
||||
'reference/mod-store-vision',
|
||||
'reference/fmf-hook-naming',
|
||||
'reference/fmf-hooks-catalog',
|
||||
'reference/mcp-server',
|
||||
'reference/reference-data-files',
|
||||
'reference/modding-language-requirement',
|
||||
],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Contributors (workflow)',
|
||||
items: [
|
||||
'contributors/repo-inventory',
|
||||
'contributors/monorepo-target-layout',
|
||||
'contributors/luminescent-design-system',
|
||||
'contributors/docusaurus-workflow',
|
||||
'contributors/plugin-submission-audit',
|
||||
'contributors/sponsorship-automation',
|
||||
],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Roadmap',
|
||||
items: ['roadmap/unified-roadmap', 'roadmap/mod-store-stages'],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Topics hub',
|
||||
link: {type: 'doc', id: 'topics/index'},
|
||||
items: [
|
||||
'topics/index',
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Cross-cutting topics',
|
||||
items: [
|
||||
'topics/assets-and-export/overview',
|
||||
'topics/multiplayer-and-networking/overview',
|
||||
'topics/ffi-and-hooks/overview',
|
||||
'topics/security-legal/overview',
|
||||
'topics/reference/overview',
|
||||
'topics/roadmap/overview',
|
||||
'topics/meta/overview',
|
||||
'topics/meta/game-folder-layout',
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
'SPONSORS',
|
||||
],
|
||||
},
|
||||
'SPONSORS',
|
||||
],
|
||||
};
|
||||
|
||||
|
||||
@@ -431,7 +431,11 @@ body {
|
||||
|
||||
/* Doc canvas — editorial bleed (wiki layout alignment); no hard section borders */
|
||||
.theme-doc-wrapper {
|
||||
background: linear-gradient(180deg, var(--color-surface-container-low) 0%, var(--color-background) 42%);
|
||||
background: linear-gradient(
|
||||
180deg,
|
||||
var(--color-surface-container-low) 0%,
|
||||
var(--color-background) 42%
|
||||
);
|
||||
}
|
||||
|
||||
.theme-doc-root .theme-doc-sidebar-container {
|
||||
@@ -576,7 +580,9 @@ body {
|
||||
flex-shrink: 0;
|
||||
opacity: 0.85;
|
||||
color: rgba(192, 252, 246, 0.45);
|
||||
transition: color 0.2s ease, opacity 0.2s ease;
|
||||
transition:
|
||||
color 0.2s ease,
|
||||
opacity 0.2s ease;
|
||||
}
|
||||
|
||||
.footer__link-item:hover .footer-icon-svg {
|
||||
|
||||
@@ -97,7 +97,8 @@ export const moduleCatalog: ModuleEntry[] = [
|
||||
name: 'FMF.ModPathRedirector',
|
||||
repoFolder: 'gregMod.PathRedirector',
|
||||
type: 'plugin',
|
||||
description: 'MelonLoader plugin: waits for each subscribed Workshop item (Steam + StreamingAssets/Mods/workshop_*) before MelonMods load.',
|
||||
description:
|
||||
'MelonLoader plugin: waits for each subscribed Workshop item (Steam + StreamingAssets/Mods/workshop_*) before MelonMods load.',
|
||||
version: '1.5.0',
|
||||
author: 'DataCenterExporter / gregFramework Community',
|
||||
languages: ['C#'],
|
||||
|
||||
@@ -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',
|
||||
};
|
||||
@@ -5,20 +5,21 @@ export const en: HomepageContent = {
|
||||
...homepageShellEn,
|
||||
heroLine1: 'DATACENTER MODDING HUB.',
|
||||
heroLine2: 'SMART LIKE GREG.',
|
||||
heroSub1: 'Streamlined. Flexible. Community-curated.',
|
||||
heroSub2: 'gregFramework, Rust stacks, multiplayer, and plugins.',
|
||||
ctaStart: 'START MODDING',
|
||||
ctaMods: 'AVAILABLE STANDALONE MODS & PLUGINS',
|
||||
heroSub1: 'Install mods, use the Workshop, fix common issues — without digging through engine docs.',
|
||||
heroSub2: 'Technical reference for authors lives under Developers in the wiki.',
|
||||
ctaStart: 'HELP FOR PLAYERS',
|
||||
ctaMods: 'MOD CATALOG',
|
||||
docsPaths: 'Documentation paths',
|
||||
featureTitles: ['Dual-track modding', 'Runtime hook bridge', 'Wiki-driven docs', 'Community ecosystem'],
|
||||
featureTitles: ['Play with mods', 'Workshop & updates', 'Clear docs', 'Community'],
|
||||
featureDescriptions: [
|
||||
'Build mods in C# or natively in Rust via C-ABI/FFI.',
|
||||
'Harmony patches, event IDs, and deterministic hook forwarding.',
|
||||
'Source of truth from .wiki with end-user and mod-dev paths.',
|
||||
'Core framework docs plus standalone plugin and ecosystem docs.',
|
||||
'Step-by-step paths for installing and troubleshooting — no repo jargon on day one.',
|
||||
'WorkshopManager and release channels explain where builds come from.',
|
||||
'Player pages are short; author pages stay under one Developers section.',
|
||||
'Discord and GitHub for help — framework internals only when you need them.',
|
||||
],
|
||||
comingSoon: 'Coming soon',
|
||||
comingSoonText: '`datacentermods.com` is in preparation. Until launch, use `Docs Hub → Standalone Mods`.',
|
||||
comingSoonText:
|
||||
'`datacentermods.com` is in preparation. Until launch, use the wiki **For players** and the **Mod catalog**.',
|
||||
communityTitle: 'Community & maintainers',
|
||||
communityText: 'This portal is designed for gregFramework docs and community-built plugins across the Data Center ecosystem.',
|
||||
docsEndUserTitle: 'End-user',
|
||||
|
||||
@@ -1,25 +1,8 @@
|
||||
import { de } from './de';
|
||||
import { en } from './en';
|
||||
import type { HomepageContent, LocaleKey } from './types';
|
||||
import {en} from './en';
|
||||
import type {HomepageContent} from './types';
|
||||
|
||||
const homepageByLocale: Record<LocaleKey, HomepageContent> = {
|
||||
en,
|
||||
de,
|
||||
};
|
||||
export type {HomepageContent, LocaleKey} from './types';
|
||||
|
||||
export type { HomepageContent, LocaleKey } from './types';
|
||||
|
||||
export function getHomepageContent(locale: string): HomepageContent {
|
||||
const normalizedLocale = (locale || 'en').toLowerCase();
|
||||
const languageOnly = normalizedLocale.split('-')[0] as LocaleKey;
|
||||
|
||||
if (normalizedLocale in homepageByLocale) {
|
||||
return homepageByLocale[normalizedLocale as LocaleKey];
|
||||
}
|
||||
|
||||
if (languageOnly in homepageByLocale) {
|
||||
return homepageByLocale[languageOnly];
|
||||
}
|
||||
|
||||
return homepageByLocale.en;
|
||||
export function getHomepageContent(_locale: string): HomepageContent {
|
||||
return en;
|
||||
}
|
||||
|
||||
@@ -1,122 +1,81 @@
|
||||
import type { HomepageContent, HomepageDocLink } from './types';
|
||||
import type {HomepageContent, HomepageDocLink} from './types';
|
||||
|
||||
/** English link hub — reused for locales without dedicated translations. */
|
||||
/** Player-first links — technical docs live under /wiki/developers */
|
||||
export const sharedKnowledgeLinksEn: HomepageDocLink[] = [
|
||||
{ title: 'Wiki Overview', description: 'Canonical docs entry under /wiki.', link: '/wiki' },
|
||||
{title: 'Wiki home', description: 'Short entry — players vs developers.', link: '/wiki'},
|
||||
{
|
||||
title: 'Framework Core',
|
||||
description: 'Runtime hooks, bridge, events, and architecture.',
|
||||
link: '/wiki/mods/framework',
|
||||
},
|
||||
{
|
||||
title: 'Plugins (FFM)',
|
||||
description: 'FFM.Plugin.* docs and release pages.',
|
||||
link: '/wiki/plugins/',
|
||||
},
|
||||
{ title: 'Mods (FMF)', description: 'Gameplay mods, releases, and module docs.', link: '/wiki/mods/' },
|
||||
{
|
||||
title: 'FMF Hooks Catalog',
|
||||
description: 'Hook strings and event IDs generated from core sources.',
|
||||
link: '/wiki/reference/fmf-hooks-catalog',
|
||||
},
|
||||
{
|
||||
title: 'Release Channels',
|
||||
description: 'Steam Workshop vs GitHub for discovery and betas.',
|
||||
link: '/wiki/reference/release-channels',
|
||||
},
|
||||
{
|
||||
title: 'Unified Roadmap',
|
||||
description: 'Consolidated planning with duplicate tracks removed.',
|
||||
link: '/wiki/roadmap/unified-roadmap',
|
||||
},
|
||||
{ title: 'Mods Catalog', description: 'Dynamic /mods page with wiki and download links.', link: '/mods' },
|
||||
];
|
||||
|
||||
export const sharedWorkflowLinksEn: HomepageDocLink[] = [
|
||||
{
|
||||
title: 'End-user docs',
|
||||
description: 'Install, update, and troubleshooting paths.',
|
||||
title: 'For players',
|
||||
description: 'Install, update, troubleshooting.',
|
||||
link: '/wiki/guides/players/overview',
|
||||
},
|
||||
{
|
||||
title: 'Mod developer docs',
|
||||
description: 'Setup, debugging, and hook integration.',
|
||||
title: 'WorkshopManager',
|
||||
description: 'Browse and install Workshop mods.',
|
||||
link: '/wiki/guides/players/enduser-workshop',
|
||||
},
|
||||
{
|
||||
title: 'Release channels',
|
||||
description: 'Steam Workshop vs GitHub for builds.',
|
||||
link: '/wiki/reference/release-channels',
|
||||
},
|
||||
{title: 'Mod catalog', description: 'Modules with docs and download links.', link: '/mods'},
|
||||
];
|
||||
|
||||
/** Authors & contributors — one hop to the full technical tree */
|
||||
export const sharedWorkflowLinksEn: HomepageDocLink[] = [
|
||||
{
|
||||
title: 'Developers (hub)',
|
||||
description: 'Framework, mods, plugins, reference, roadmap — all technical links.',
|
||||
link: '/wiki/developers',
|
||||
},
|
||||
{
|
||||
title: 'Mod developer guide',
|
||||
description: 'Hooks, setup, and workflow entry.',
|
||||
link: '/wiki/guides/mod-developers/overview',
|
||||
},
|
||||
{
|
||||
title: 'Repo inventory',
|
||||
description: 'Split-repo layout and drift notes for contributors.',
|
||||
link: '/wiki/contributors/repo-inventory',
|
||||
},
|
||||
{
|
||||
title: 'Contributor workflow',
|
||||
description: 'Standards, CI, and documentation workflow.',
|
||||
description: 'Docs site and repo conventions.',
|
||||
link: '/wiki/contributors/docusaurus-workflow',
|
||||
},
|
||||
{
|
||||
title: 'Plugin security audit',
|
||||
description: 'Submission and malicious-code review process.',
|
||||
link: '/wiki/contributors/plugin-submission-audit',
|
||||
},
|
||||
];
|
||||
|
||||
export const sharedKnowledgeLinksDe: HomepageDocLink[] = [
|
||||
{ title: 'Wiki-Übersicht', description: 'Einstieg unter /wiki.', link: '/wiki' },
|
||||
{title: 'Wiki-Start', description: 'Kurzüberblick — Spieler vs. Entwickler.', link: '/wiki'},
|
||||
{
|
||||
title: 'Framework-Core',
|
||||
description: 'Runtime-Hooks, Bridge, Events und Architektur.',
|
||||
link: '/wiki/mods/framework',
|
||||
title: 'Für Spieler',
|
||||
description: 'Installation, Updates, Fehlerbehebung.',
|
||||
link: '/wiki/guides/players/overview',
|
||||
},
|
||||
{
|
||||
title: 'Plugins (FFM)',
|
||||
description: 'FFM.Plugin.*-Doku und Release-Seiten.',
|
||||
link: '/wiki/plugins/',
|
||||
},
|
||||
{ title: 'Mods (FMF)', description: 'Gameplay-Mods, Releases und Modul-Doku.', link: '/wiki/mods/' },
|
||||
{
|
||||
title: 'FMF-Hooks-Katalog',
|
||||
description: 'Hook-Strings und Event-IDs aus den Core-Quellen.',
|
||||
link: '/wiki/reference/fmf-hooks-catalog',
|
||||
title: 'WorkshopManager',
|
||||
description: 'Workshop-Mods suchen und installieren.',
|
||||
link: '/wiki/guides/players/enduser-workshop',
|
||||
},
|
||||
{
|
||||
title: 'Release-Kanäle',
|
||||
description: 'Steam Workshop vs GitHub für Discovery und Betas.',
|
||||
description: 'Steam Workshop vs GitHub.',
|
||||
link: '/wiki/reference/release-channels',
|
||||
},
|
||||
{
|
||||
title: 'Einheitliche Roadmap',
|
||||
description: 'Zusammengeführte Planung ohne doppelte Tracks.',
|
||||
link: '/wiki/roadmap/unified-roadmap',
|
||||
},
|
||||
{ title: 'Mods-Katalog', description: 'Dynamische /mods-Seite mit Wiki- und Download-Links.', link: '/mods' },
|
||||
{title: 'Mod-Katalog', description: 'Module mit Doku- und Download-Links.', link: '/mods'},
|
||||
];
|
||||
|
||||
export const sharedWorkflowLinksDe: HomepageDocLink[] = [
|
||||
{
|
||||
title: 'Endnutzer-Doku',
|
||||
description: 'Installation, Updates und Fehlerbehebung.',
|
||||
link: '/wiki/guides/players/overview',
|
||||
title: 'Entwickler (Hub)',
|
||||
description: 'Framework, Mods, Plugins, Referenz — alle technischen Links.',
|
||||
link: '/wiki/developers',
|
||||
},
|
||||
{
|
||||
title: 'Mod-Entwickler-Doku',
|
||||
description: 'Setup, Debugging und Hook-Integration.',
|
||||
title: 'Mod-Entwickler-Guide',
|
||||
description: 'Hooks, Setup, Einstieg.',
|
||||
link: '/wiki/guides/mod-developers/overview',
|
||||
},
|
||||
{
|
||||
title: 'Repo-Inventar',
|
||||
description: 'Split-Repo-Layout und Drift-Hinweise.',
|
||||
link: '/wiki/contributors/repo-inventory',
|
||||
},
|
||||
{
|
||||
title: 'Contributor-Workflow',
|
||||
description: 'Standards, CI und Doku-Workflow.',
|
||||
description: 'Doku-Site und Repo-Konventionen.',
|
||||
link: '/wiki/contributors/docusaurus-workflow',
|
||||
},
|
||||
{
|
||||
title: 'Plugin-Security-Audit',
|
||||
description: 'Einreichung und Review auf Schadcode.',
|
||||
link: '/wiki/contributors/plugin-submission-audit',
|
||||
},
|
||||
];
|
||||
|
||||
export const homepageShellEn: Pick<
|
||||
@@ -137,13 +96,13 @@ export const homepageShellEn: Pick<
|
||||
heroBadge: 'gregFramework · docs live',
|
||||
heroBrandLine1: 'greg',
|
||||
heroBrandLine2Gradient: 'Framework',
|
||||
knowledgeSectionTitle: 'Knowledge architecture',
|
||||
workflowSectionTitle: 'Workflows',
|
||||
codeSectionTitle: 'Engineered for mod authors',
|
||||
knowledgeSectionTitle: 'Players — start here',
|
||||
workflowSectionTitle: 'Authors & contributors',
|
||||
codeSectionTitle: 'Building on gregFramework',
|
||||
codeSectionLead:
|
||||
'C# mods on MelonLoader, FMF plugins, and optional Rust FFI bridges — one documentation hub, versioned with the split repos.',
|
||||
ctaDiscordTitle: 'Build with the community',
|
||||
ctaDiscordLead: 'Ask questions, share mods, and follow framework releases alongside core development.',
|
||||
'C# mods on MelonLoader, FFM plugins, and optional Rust bridges — details for authors are under Developers.',
|
||||
ctaDiscordTitle: 'Community',
|
||||
ctaDiscordLead: 'Questions about playing or building — ask in Discord.',
|
||||
ctaDiscordButton: 'Join Discord',
|
||||
knowledgeLinks: sharedKnowledgeLinksEn,
|
||||
workflowLinks: sharedWorkflowLinksEn,
|
||||
@@ -167,13 +126,13 @@ export const homepageShellDe: Pick<
|
||||
heroBadge: 'gregFramework · Live-Dokumentation',
|
||||
heroBrandLine1: 'greg',
|
||||
heroBrandLine2Gradient: 'Framework',
|
||||
knowledgeSectionTitle: 'Wissensarchitektur',
|
||||
workflowSectionTitle: 'Arbeitsabläufe',
|
||||
codeSectionTitle: 'Für Mod-Autoren gebaut',
|
||||
knowledgeSectionTitle: 'Spieler — Einstieg',
|
||||
workflowSectionTitle: 'Autoren & Contributors',
|
||||
codeSectionTitle: 'Auf gregFramework aufbauen',
|
||||
codeSectionLead:
|
||||
'C#-Mods auf MelonLoader, FMF-Plugins und optionale Rust-FFI-Brücken — ein Dokumentations-Hub, versioniert mit den Split-Repos.',
|
||||
ctaDiscordTitle: 'Mit der Community bauen',
|
||||
ctaDiscordLead: 'Fragen stellen, Mods teilen und Releases parallel zur Core-Entwicklung verfolgen.',
|
||||
'C#-Mods auf MelonLoader, FFM-Plugins, optionale Rust-Brücken — Details für Autoren unter Entwickler.',
|
||||
ctaDiscordTitle: 'Community',
|
||||
ctaDiscordLead: 'Fragen zum Spielen oder Bauen — im Discord.',
|
||||
ctaDiscordButton: 'Discord beitreten',
|
||||
knowledgeLinks: sharedKnowledgeLinksDe,
|
||||
workflowLinks: sharedWorkflowLinksDe,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
export type LocaleKey = 'en' | 'de';
|
||||
export type LocaleKey = 'en';
|
||||
|
||||
export type HomepageDocLink = {
|
||||
title: string;
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
import type { LocaleKey } from './homepage/types';
|
||||
|
||||
export type ModsPageStrings = {
|
||||
title: string;
|
||||
description: string;
|
||||
@@ -13,36 +11,20 @@ export type ModsPageStrings = {
|
||||
legacyNoSplitRepo: string;
|
||||
};
|
||||
|
||||
const byLocale: Record<LocaleKey, ModsPageStrings> = {
|
||||
en: {
|
||||
title: 'Mods & plugins catalog',
|
||||
description:
|
||||
'Generated from the module catalog. Each entry links to its wiki article, release page, and download route.',
|
||||
pluginsHeading: 'Plugins',
|
||||
modsHeading: 'Mods',
|
||||
wiki: 'Wiki',
|
||||
release: 'Release',
|
||||
download: 'Download DLL',
|
||||
notReleased: 'Not released yet',
|
||||
repoFolder: 'gregFramework folder',
|
||||
legacyNoSplitRepo: 'Legacy — no split repo in workspace',
|
||||
},
|
||||
de: {
|
||||
title: 'Mods- & Plugin-Katalog',
|
||||
description:
|
||||
'Aus dem Modul-Katalog erzeugt. Jeder Eintrag verweist auf Wiki, Release-Seite und Download-Route.',
|
||||
pluginsHeading: 'Plugins',
|
||||
modsHeading: 'Mods',
|
||||
wiki: 'Wiki',
|
||||
release: 'Release',
|
||||
download: 'DLL laden',
|
||||
notReleased: 'Noch nicht veröffentlicht',
|
||||
repoFolder: 'Ordner unter gregFramework',
|
||||
legacyNoSplitRepo: 'Legacy — kein Split-Repo im Workspace',
|
||||
},
|
||||
const strings: ModsPageStrings = {
|
||||
title: 'Mods & plugins catalog',
|
||||
description:
|
||||
'Generated from the module catalog. Each entry links to its wiki article, release page, and download route.',
|
||||
pluginsHeading: 'Plugins',
|
||||
modsHeading: 'Mods',
|
||||
wiki: 'Wiki',
|
||||
release: 'Release',
|
||||
download: 'Download DLL',
|
||||
notReleased: 'Not released yet',
|
||||
repoFolder: 'gregFramework folder',
|
||||
legacyNoSplitRepo: 'Legacy — no split repo in workspace',
|
||||
};
|
||||
|
||||
export function getModsPageStrings(locale: string): ModsPageStrings {
|
||||
const languageOnly = (locale || 'en').toLowerCase().split('-')[0] as LocaleKey;
|
||||
return byLocale[languageOnly] ?? byLocale.en;
|
||||
export function getModsPageStrings(_locale: string): ModsPageStrings {
|
||||
return strings;
|
||||
}
|
||||
|
||||
@@ -69,7 +69,7 @@ export default function HomePage(): JSX.Element {
|
||||
return (
|
||||
<Layout
|
||||
title="Home"
|
||||
description="Community documentation for gregFramework — Data Center modding, plugins, and hooks."
|
||||
description="Help for Data Center players using mods — plus developer docs under /wiki/developers."
|
||||
>
|
||||
<main className="bg-background text-on-surface font-sans min-h-screen editorial-bleed bg-hero-gradient">
|
||||
<section className="hero-motion-wrap relative flex min-h-[72vh] flex-col items-center justify-center overflow-hidden px-4 py-24 text-center">
|
||||
@@ -138,7 +138,7 @@ export default function HomePage(): JSX.Element {
|
||||
transition={{delay: reducedMotion ? 0 : 0.22}}
|
||||
>
|
||||
<Link
|
||||
to="/wiki/mods/framework"
|
||||
to="/wiki/guides/players/overview"
|
||||
className="btn-primary hero-glow rounded-lg px-10 py-4 text-lg"
|
||||
>
|
||||
{t.ctaStart}
|
||||
|
||||
@@ -48,7 +48,8 @@ export default function FooterLinkItem({item}: Props): ReactNode {
|
||||
: {
|
||||
to: toUrl,
|
||||
})}
|
||||
{...props}>
|
||||
{...props}
|
||||
>
|
||||
{icon ? (
|
||||
<span className="footer-link-with-icon">
|
||||
{icon}
|
||||
|
||||
@@ -25,9 +25,7 @@ function useLocaleDropdownUtils() {
|
||||
const getLocaleConfig = (locale: string) => {
|
||||
const localeConfig = localeConfigs[locale];
|
||||
if (!localeConfig) {
|
||||
throw new Error(
|
||||
`Docusaurus bug, no locale config found for locale=${locale}`,
|
||||
);
|
||||
throw new Error(`Docusaurus bug, no locale config found for locale=${locale}`);
|
||||
}
|
||||
return localeConfig;
|
||||
};
|
||||
@@ -49,10 +47,7 @@ function useLocaleDropdownUtils() {
|
||||
|
||||
return {
|
||||
getURL: (locale: string, options: {queryString: string | undefined}) => {
|
||||
const finalSearch = mergeSearchStrings(
|
||||
[search, options.queryString],
|
||||
'append',
|
||||
);
|
||||
const finalSearch = mergeSearchStrings([search, options.queryString], 'append');
|
||||
return `${getBaseURLForLocale(locale)}${finalSearch}${hash}`;
|
||||
},
|
||||
getLabel: (locale: string) => {
|
||||
@@ -85,11 +80,7 @@ export default function LocaleDropdownNavbarItem({
|
||||
target: '_self',
|
||||
autoAddBaseUrl: false,
|
||||
className:
|
||||
locale === currentLocale
|
||||
? mobile
|
||||
? 'menu__link--active'
|
||||
: 'dropdown__link--active'
|
||||
: '',
|
||||
locale === currentLocale ? (mobile ? 'menu__link--active' : 'dropdown__link--active') : '',
|
||||
};
|
||||
});
|
||||
|
||||
@@ -103,15 +94,11 @@ export default function LocaleDropdownNavbarItem({
|
||||
})
|
||||
: utils.getLabel(currentLocale);
|
||||
|
||||
const iconOnlyDesktop =
|
||||
!mobile && String(className ?? '').includes('nav-icon-only');
|
||||
const iconOnlyDesktop = !mobile && String(className ?? '').includes('nav-icon-only');
|
||||
|
||||
const label: ReactNode = (
|
||||
<>
|
||||
<IoLanguage
|
||||
className={iconOnlyDesktop ? styles.iconOnly : styles.iconLanguage}
|
||||
aria-hidden
|
||||
/>
|
||||
<IoLanguage className={iconOnlyDesktop ? styles.iconOnly : styles.iconLanguage} aria-hidden />
|
||||
{mobile || !iconOnlyDesktop ? (
|
||||
dropdownLabel
|
||||
) : (
|
||||
|
||||
@@ -80,9 +80,7 @@ export default function NavbarNavLink({
|
||||
<>
|
||||
{label}
|
||||
{isExternalLink && (
|
||||
<IconExternalLink
|
||||
{...(isDropdownLink && {width: 12, height: 12})}
|
||||
/>
|
||||
<IconExternalLink {...(isDropdownLink && {width: 12, height: 12})} />
|
||||
)}
|
||||
</>
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user