diff --git a/README.md b/README.md index d2749bf..8bb3b3c 100644 --- a/README.md +++ b/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//`. 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. diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..bc61700 --- /dev/null +++ b/docs/README.md @@ -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/` (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/`. diff --git a/docs/developers.md b/docs/developers.md new file mode 100644 index 0000000..8f49da8 --- /dev/null +++ b/docs/developers.md @@ -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) diff --git a/docs/framework/architecture.md b/docs/framework/architecture.md index a325f01..7e07a72 100644 --- a/docs/framework/architecture.md +++ b/docs/framework/architecture.md @@ -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./` | +| **Mods** | User mods (`FMF.*`). | `gregMod./` | + +## 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./` — jeweils eigenes Repo direkt unter `gregFramework/`. | -| **Extensions** | `gregExt./` — 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./` — one repo each, directly under `gregFramework/`. | +| **Extensions** | `gregExt./` — 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/`. diff --git a/docs/getting-started.md b/docs/getting-started.md index 92953a3..83ba002 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -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./` — gameplay mods (`FMF.*`), **flat** next to `gregCore/` (legacy umbrella `gregMods/` is deprecated) diff --git a/docs/getting-started/documentation-layout.md b/docs/getting-started/documentation-layout.md index 600bcc1..55e6a95 100644 --- a/docs/getting-started/documentation-layout.md +++ b/docs/getting-started/documentation-layout.md @@ -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/` (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. diff --git a/docs/guides/contributors/topics-overview.md b/docs/guides/contributors/topics-overview.md index 3c45cc9..df22dda 100644 --- a/docs/guides/contributors/topics-overview.md +++ b/docs/guides/contributors/topics-overview.md @@ -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. diff --git a/docs/guides/mod-developers/overview.md b/docs/guides/mod-developers/overview.md index f261be3..d700e86 100644 --- a/docs/guides/mod-developers/overview.md +++ b/docs/guides/mod-developers/overview.md @@ -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) diff --git a/docs/guides/players/audiences-overview.md b/docs/guides/players/audiences-overview.md index c18f884..302815e 100644 --- a/docs/guides/players/audiences-overview.md +++ b/docs/guides/players/audiences-overview.md @@ -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. diff --git a/docs/guides/players/overview.md b/docs/guides/players/overview.md index ba72cc0..43af92b 100644 --- a/docs/guides/players/overview.md +++ b/docs/guides/players/overview.md @@ -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 diff --git a/docs/guides/sponsors/overview.md b/docs/guides/sponsors/overview.md index 02d9450..e2b528e 100644 --- a/docs/guides/sponsors/overview.md +++ b/docs/guides/sponsors/overview.md @@ -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). ::: diff --git a/docs/intro.md b/docs/intro.md index 46c89f2..c89d490 100644 --- a/docs/intro.md +++ b/docs/intro.md @@ -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./` (split repos, directly under `gregFramework/`) -- Extensions (FFM plugins): `gregExt./` (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..…` 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.`, `gregExt.`, `gregSta.` (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. diff --git a/docs/meta/system-architecture-principles.md b/docs/meta/system-architecture-principles.md new file mode 100644 index 0000000..49e7ec4 --- /dev/null +++ b/docs/meta/system-architecture-principles.md @@ -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./`**. | +| **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./`**. | + +**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) diff --git a/docs/mods/fmf-hex-label-mod.md b/docs/mods/fmf-hex-label-mod.md index 86d8270..8357b8a 100644 --- a/docs/mods/fmf-hex-label-mod.md +++ b/docs/mods/fmf-hex-label-mod.md @@ -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/) diff --git a/docs/mods/framework.md b/docs/mods/framework.md index 17d1148..b10256d 100644 --- a/docs/mods/framework.md +++ b/docs/mods/framework.md @@ -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 diff --git a/docs/mods/index.md b/docs/mods/index.md index 27f96dc..9b8deec 100644 --- a/docs/mods/index.md +++ b/docs/mods/index.md @@ -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./`** 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./`** 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 diff --git a/docs/plugins/ffm-plugin-asset-exporter.md b/docs/plugins/ffm-plugin-asset-exporter.md index cc6f91e..89e0100 100644 --- a/docs/plugins/ffm-plugin-asset-exporter.md +++ b/docs/plugins/ffm-plugin-asset-exporter.md @@ -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/) diff --git a/docs/plugins/ffm-plugin-multiplayer.md b/docs/plugins/ffm-plugin-multiplayer.md index 9ce4e5d..189f5b7 100644 --- a/docs/plugins/ffm-plugin-multiplayer.md +++ b/docs/plugins/ffm-plugin-multiplayer.md @@ -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) diff --git a/docs/plugins/ffm-plugin-player-models.md b/docs/plugins/ffm-plugin-player-models.md index c6fbfc7..dfe7898 100644 --- a/docs/plugins/ffm-plugin-player-models.md +++ b/docs/plugins/ffm-plugin-player-models.md @@ -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) diff --git a/docs/plugins/ffm-plugin-sysadmin.md b/docs/plugins/ffm-plugin-sysadmin.md index e861ea5..2a90e40 100644 --- a/docs/plugins/ffm-plugin-sysadmin.md +++ b/docs/plugins/ffm-plugin-sysadmin.md @@ -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) diff --git a/docs/plugins/ffm-plugin-web-ui-bridge.md b/docs/plugins/ffm-plugin-web-ui-bridge.md index a15edc1..55f1cbb 100644 --- a/docs/plugins/ffm-plugin-web-ui-bridge.md +++ b/docs/plugins/ffm-plugin-web-ui-bridge.md @@ -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) diff --git a/docs/plugins/index.md b/docs/plugins/index.md index ba7fe9e..7fb175b 100644 --- a/docs/plugins/index.md +++ b/docs/plugins/index.md @@ -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./`** (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./`** (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. diff --git a/docs/reference/modding-language-requirement.md b/docs/reference/modding-language-requirement.md index 406a83e..b714751 100644 --- a/docs/reference/modding-language-requirement.md +++ b/docs/reference/modding-language-requirement.md @@ -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) diff --git a/docs/topics/ffi-and-hooks/overview.md b/docs/topics/ffi-and-hooks/overview.md index 242f019..c8f6f25 100644 --- a/docs/topics/ffi-and-hooks/overview.md +++ b/docs/topics/ffi-and-hooks/overview.md @@ -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.*` diff --git a/docs/topics/index.md b/docs/topics/index.md index 9d8b140..0867524 100644 --- a/docs/topics/index.md +++ b/docs/topics/index.md @@ -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 | diff --git a/docs/topics/meta/game-folder-layout.md b/docs/topics/meta/game-folder-layout.md index 62287c0..d5171e1 100644 --- a/docs/topics/meta/game-folder-layout.md +++ b/docs/topics/meta/game-folder-layout.md @@ -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_/WorkshopUploadContent`** ab (nativer `ModLoader`, nicht MelonLoader). +The game stores subscribed Workshop content under **`{GameRoot}/{ExeName}_Data/StreamingAssets/mods/workshop_/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). diff --git a/docs/workspace/index.mdx b/docs/workspace/index.mdx index 018d381..77acb3a 100644 --- a/docs/workspace/index.mdx +++ b/docs/workspace/index.mdx @@ -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./` | Standalone mods (`FMF.*`) — **directly under `gregFramework/`** (the `gregMods/` umbrella is deprecated) | | **Framework plugins** | `gregExt./` | 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 | diff --git a/docusaurus.config.js b/docusaurus.config.js index 10db676..a533b79 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -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()} Meyer Media
Dieses Wiki ist ein Community-Projekt und steht in keiner Verbindung zu WASEKU oder dem Spiel selbst.`, + copyright: `Copyright ${new Date().getFullYear()} Meyer Media
This wiki is a community project and is not affiliated with WASEKU or the game.`, }, }, }; diff --git a/i18n/de/docusaurus-plugin-content-docs/current/getting-started.md b/i18n/de/docusaurus-plugin-content-docs/current/getting-started.md deleted file mode 100644 index 1ead518..0000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/getting-started.md +++ /dev/null @@ -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./` — Gameplay-Mods (`FMF.*`), **flach** neben `gregCore/` (älteres `gregMods/` ist obsolet) -- `gregExt./` — 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..` (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./` 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). diff --git a/i18n/de/docusaurus-plugin-content-docs/current/intro.md b/i18n/de/docusaurus-plugin-content-docs/current/intro.md deleted file mode 100644 index a01a30e..0000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/intro.md +++ /dev/null @@ -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./` (Split-Repos, direkt unter `gregFramework/`) -- Extensions (FFM-Plugins): `gregExt./` (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..…` 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.`, `gregExt.`, `gregSta.` (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/`. diff --git a/i18n/de/docusaurus-plugin-content-docs/current/reference/modding-language-requirement.md b/i18n/de/docusaurus-plugin-content-docs/current/reference/modding-language-requirement.md deleted file mode 100644 index 21478c3..0000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/reference/modding-language-requirement.md +++ /dev/null @@ -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) diff --git a/i18n/de/docusaurus-plugin-content-docs/current/wiki/tools/workshop-uploader.md b/i18n/de/docusaurus-plugin-content-docs/current/wiki/tools/workshop-uploader.md deleted file mode 100644 index 207f1d9..0000000 --- a/i18n/de/docusaurus-plugin-content-docs/current/wiki/tools/workshop-uploader.md +++ /dev/null @@ -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: `/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: `/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 -``` - -## 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 `/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) diff --git a/package.json b/package.json index 2125cd8..d7bb036 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/scripts/fix-wiki-import-en-links.mjs b/scripts/fix-wiki-import-en-links.mjs index 65fb39f..431b408 100644 --- a/scripts/fix-wiki-import-en-links.mjs +++ b/scripts/fix-wiki-import-en-links.mjs @@ -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); } diff --git a/scripts/normalize-wiki-import-i18n.mjs b/scripts/normalize-wiki-import-i18n.mjs index 7a45686..1c4f9fc 100644 --- a/scripts/normalize-wiki-import-i18n.mjs +++ b/scripts/normalize-wiki-import-i18n.mjs @@ -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); diff --git a/scripts/sync-wiki-to-docs.mjs b/scripts/sync-wiki-to-docs.mjs index 7187b4b..34c32cb 100644 --- a/scripts/sync-wiki-to-docs.mjs +++ b/scripts/sync-wiki-to-docs.mjs @@ -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); diff --git a/scripts/write-wiki-import-category-keys.mjs b/scripts/write-wiki-import-category-keys.mjs index 2ff99c2..ccdfbe1 100644 --- a/scripts/write-wiki-import-category-keys.mjs +++ b/scripts/write-wiki-import-category-keys.mjs @@ -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; diff --git a/sidebars.js b/sidebars.js index 05e3c44..f8da0ce 100644 --- a/sidebars.js +++ b/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', ], }; diff --git a/src/css/custom.css b/src/css/custom.css index 03a1c1f..776143f 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -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 { diff --git a/src/data/moduleCatalog.ts b/src/data/moduleCatalog.ts index ab35317..9113aa9 100644 --- a/src/data/moduleCatalog.ts +++ b/src/data/moduleCatalog.ts @@ -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#'], diff --git a/src/i18n/homepage/de.ts b/src/i18n/homepage/de.ts deleted file mode 100644 index 22a0d76..0000000 --- a/src/i18n/homepage/de.ts +++ /dev/null @@ -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', -}; diff --git a/src/i18n/homepage/en.ts b/src/i18n/homepage/en.ts index 1d9fe42..bd1bc03 100644 --- a/src/i18n/homepage/en.ts +++ b/src/i18n/homepage/en.ts @@ -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', diff --git a/src/i18n/homepage/index.ts b/src/i18n/homepage/index.ts index cb67f55..6f9082b 100644 --- a/src/i18n/homepage/index.ts +++ b/src/i18n/homepage/index.ts @@ -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 = { - 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; } diff --git a/src/i18n/homepage/sharedLinks.ts b/src/i18n/homepage/sharedLinks.ts index 86fbb0f..a326e57 100644 --- a/src/i18n/homepage/sharedLinks.ts +++ b/src/i18n/homepage/sharedLinks.ts @@ -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, diff --git a/src/i18n/homepage/types.ts b/src/i18n/homepage/types.ts index e8b8264..e79d84f 100644 --- a/src/i18n/homepage/types.ts +++ b/src/i18n/homepage/types.ts @@ -1,4 +1,4 @@ -export type LocaleKey = 'en' | 'de'; +export type LocaleKey = 'en'; export type HomepageDocLink = { title: string; diff --git a/src/i18n/modsPage.ts b/src/i18n/modsPage.ts index 6c6007c..7c2b230 100644 --- a/src/i18n/modsPage.ts +++ b/src/i18n/modsPage.ts @@ -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 = { - 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; } diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 4efa660..da871ca 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -69,7 +69,7 @@ export default function HomePage(): JSX.Element { return (
@@ -138,7 +138,7 @@ export default function HomePage(): JSX.Element { transition={{delay: reducedMotion ? 0 : 0.22}} > {t.ctaStart} diff --git a/src/theme/Footer/LinkItem/index.tsx b/src/theme/Footer/LinkItem/index.tsx index 59b8962..8d6c0ea 100644 --- a/src/theme/Footer/LinkItem/index.tsx +++ b/src/theme/Footer/LinkItem/index.tsx @@ -48,7 +48,8 @@ export default function FooterLinkItem({item}: Props): ReactNode { : { to: toUrl, })} - {...props}> + {...props} + > {icon ? ( {icon} diff --git a/src/theme/NavbarItem/LocaleDropdownNavbarItem/index.tsx b/src/theme/NavbarItem/LocaleDropdownNavbarItem/index.tsx index 08c047b..7ecbc04 100644 --- a/src/theme/NavbarItem/LocaleDropdownNavbarItem/index.tsx +++ b/src/theme/NavbarItem/LocaleDropdownNavbarItem/index.tsx @@ -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 = ( <> - + {mobile || !iconOnlyDesktop ? ( dropdownLabel ) : ( diff --git a/src/theme/NavbarItem/NavbarNavLink.tsx b/src/theme/NavbarItem/NavbarNavLink.tsx index 72f51fb..fc796fc 100644 --- a/src/theme/NavbarItem/NavbarNavLink.tsx +++ b/src/theme/NavbarItem/NavbarNavLink.tsx @@ -80,9 +80,7 @@ export default function NavbarNavLink({ <> {label} {isExternalLink && ( - + )} ),