docs: enhance documentation structure and clarify repository layout

- Updated the README and various documentation files to reflect the new flat layout of the `gregFramework`, emphasizing the direct placement of repositories like `gregMod.<Name>/` and `gregExt.<Name>/` under `gregFramework/`.
- Added details about the `gregModmanager/` and `gregDataCenterExporter/` directories, clarifying their roles and contents.
- Improved descriptions and links throughout the documentation to ensure consistency and accuracy, enhancing user navigation and understanding of the project structure.
- Adjusted language in several sections to better communicate the purpose and organization of the repositories.

This commit improves the overall clarity and usability of the documentation.
This commit is contained in:
Marvin
2026-04-10 02:03:00 +02:00
parent 28a75eeb1c
commit cfaa5550d4
16 changed files with 212 additions and 211 deletions

View File

@@ -1,6 +1,16 @@
# gregWiki — gregFramework documentation # 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`**. Docusaurus site for **gregFramework** / Data Center modding: configuration (`docusaurus.config.js`, `sidebars.js`), React under `src/`, content under [`docs/`](./docs/). Published route base path: **`/wiki`**.
---
## Part of gregFramework
This directory is part of the **[gregFramework](https://github.com/mleem97/gregFramework)** workspace. Clone sibling repositories side by side so each project lives at `gregFramework/<RepoName>/`. See the workspace [README](https://github.com/mleem97/gregFramework/blob/master/README.md) for the full layout and migration notes.
**Remote:** [`mleem97/gregWiki`](https://github.com/mleem97/gregWiki) — on-disk path: `gregFramework/gregWiki/`.
---
## Local development ## Local development
@@ -15,24 +25,50 @@ Production build:
npm run build npm run build
``` ```
Optional: refresh the legacy GitHub Wiki mirror from a sibling `../.wiki/` clone under `gregFramework/` — see [`docs/getting-started/documentation-layout.md`](./docs/getting-started/documentation-layout.md) and `npm run wiki:sync` / `wiki:normalize-i18n`. 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`.
---
## Deployment (Coolify / CI) ## Deployment (Coolify / CI)
- **Default branch:** `main` — use this for new work and PRs. - **Default branch:** `main` — use this for new work and PRs.
- **`master`:** 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. - **`master`:** may still exist for older deployments; in Coolify, set the branch to **`main`** when possible.
## Docker ### Coolify (Dockerfile) — missing `/app/package.json`
Build context **must** be this repository root (the folder that contains `package.json`): 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.
| 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`. |
Symptom: `docker-entrypoint: ERROR: /app/package.json not found` → wrong context or volume.
---
## Docker (local)
Build context = **this** repository (folder that contains `package.json`):
```bash ```bash
cd path/to/gregWiki
docker compose up --build docker compose up --build
# or
docker build -t gregwiki-docs .
docker run --rm -p 3000:3000 gregwiki-docs
``` ```
## Related repositories If gregWiki lives inside **gregFramework**, from the workspace root:
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. ```bash
cd path/to/gregFramework
docker compose -f docker-compose.gregwiki.yml up --build
```
(`docker-compose.gregwiki.yml` sets `build.context: ./gregWiki`.)
---
## See also
- [gregFramework README](../README.md) — flat layout `gregFramework/{RepoName}/`
- Source code and builds: **gregCore**, **gregMod.*** , **gregExt.*** as separate repositories (not only this documentation)

View File

@@ -19,8 +19,14 @@ These folders typically sit **next to each other** in a developer workspace (see
| **Mods (split repos)** | `gregMod.<Name>/` (directly under `gregFramework/`) | Standalone gameplay mods (`FMF.*` assemblies); **not** nested under a `gregMods/` umbrella | | **Mods (split repos)** | `gregMod.<Name>/` (directly under `gregFramework/`) | Standalone gameplay mods (`FMF.*` assemblies); **not** nested under a `gregMods/` umbrella |
| **Extensions / framework plugins (split repos)** | `gregExt.<Name>/` (directly under `gregFramework/`) | FFM framework plugins (`FFM.Plugin.*`); **not** under legacy `StandaloneMods/` paths | | **Extensions / framework plugins (split repos)** | `gregExt.<Name>/` (directly under `gregFramework/`) | FFM framework plugins (`FFM.Plugin.*`); **not** under legacy `StandaloneMods/` paths |
| **Documentation** | `gregWiki/` ([`mleem97/gregWiki`](https://github.com/mleem97/gregWiki)) | **This site**: Docusaurus app at repo root, all authored pages under `docs/` | | **Documentation** | `gregWiki/` ([`mleem97/gregWiki`](https://github.com/mleem97/gregWiki)) | **This site**: Docusaurus app at repo root, all authored pages under `docs/` |
| **Tools** | `gregModmanager/` (WorkshopManager), `gregDataCenterExporter/`, etc. | Supporting apps and templates | | **Workshop / Modmanager** | `gregModmanager/` | **Gregtools Modmanager** (MAUI; `WorkshopUploader.csproj``WorkshopUploader.exe`) |
| **Other** | `gregIPAM/`, `gregReferences/`, … | Side projects and references | | **Exporter & templates** | `gregDataCenterExporter/` | DC exporter, `FrikaModFramework/` assets, shared templates |
| **Mod store (optional clone)** | `gregStore/` | Web/modstore stack when the private repo is present |
| **IPAM / DHCP tooling** | `gregIPAM/` | e.g. `DHCPSwitches.csproj` |
| **References** | `gregReferences/` | IL2CPP unpack, baseline refs |
| **Meta / internal** | `gregMeta/`, `gregInternalDocs/` | Notes and non-public docs |
| **Examples** | `exGregFramework/` | Sample workspace layout |
| **Other** | `siblingRepos/`, … | Helper scripts and side repos |
## Canonical code locations (split repos) ## Canonical code locations (split repos)

View File

@@ -6,13 +6,14 @@ description: "Split-repo workspace: gregFramework layout, building the core, and
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, for example:
- `gregCore/`**framework core**: translations, hooks, Harmony/event runtime, templates, bridges, and related core features - `gregCore/`core SDK (`gregCore/framework/FrikaMF.csproj`), MCP server under `gregCore/mcp-server/`
- `gregMod.<Name>/` (per-mod repositories, directly under `gregFramework/`) - `gregMod.<Name>/` — gameplay mods (`FMF.*`), **flat** next to `gregCore/` (legacy umbrella `gregMods/` is deprecated)
- `gregExt.<Name>/` (per-extension repositories, directly under `gregFramework/`) - `gregExt.<Name>/` — framework plugins (`FFM.Plugin.*`), same flat layout (legacy `gregExtensions/` deprecated)
- `gregWiki/` (this documentation site) - `gregModmanager/`**Gregtools Modmanager** (WorkshopManager; `WorkshopUploader.csproj`)
- `gregStore/` (**Gregweb**, private repository — modstore web + infra; Next.js under `web/`) - `gregDataCenterExporter/` — exporter, templates, hook JSON mirrors
- `gregWiki/` — this documentation site
The upstream **DataCenter-RustBridge** project is integrated into the core tree at: The **Rust** bridge lives under:
- `gregCore/bridges/gregSta.RustBridge/` - `gregCore/bridges/gregSta.RustBridge/`
@@ -24,20 +25,16 @@ dotnet build gregCore/FrikaMF.sln -c Release
Or open `gregCore/FrikaMF.sln` in your IDE. Or open `gregCore/FrikaMF.sln` in your IDE.
## Language (mods / plugins / extensions)
**Mandatory:** implement **all** gameplay and integration logic for mods, MelonLoader plugins, and extensions in **C#**. See [Modding language (C# only)](./reference/modding-language-requirement.md).
## Hook naming ## Hook naming
- **Target convention:** `FMF.<DOMAIN>.<Event>` (see [`CONTRIBUTING.md`](https://github.com/mleem97/gregFramework/blob/master/CONTRIBUTING.md)). - **Target convention:** `FMF.<DOMAIN>.<Event>` (see [`CONTRIBUTING.md`](https://github.com/mleem97/gregFramework/blob/main/CONTRIBUTING.md)).
- **Registry:** [`FrikaModFramework/fmf_hooks.json`](https://github.com/mleem97/gregFramework/blob/master/FrikaModFramework/fmf_hooks.json) (path may vary by branch). - **Registry (example path in workspace):** [`gregDataCenterExporter/FrikaModFramework/fmf_hooks.json`](https://github.com/mleem97/gregFramework/blob/main/gregDataCenterExporter/FrikaModFramework/fmf_hooks.json) (exact copy may exist in other repos).
- **Legacy runtime strings** may still use `FFM.*` in [`HookNames`](https://github.com/mleem97/gregFramework/blob/master/framework/FrikaMF/HookNames.cs) until migrated. - **Legacy runtime strings** may still use `FFM.*` in [`HookNames.cs`](https://github.com/mleem97/gregFramework/blob/main/gregCore/framework/FrikaMF/HookNames.cs) until migrated.
## Start a mod ## Start a mod
1. Create a new mod repo folder `gregMod.<Name>/` under `gregFramework/` using the `gregMod.<Name>` pattern. 1. Add a new mod repo as `gregMod.<Name>/` under `gregFramework/` (clone or create next to `gregCore/`).
2. Use templates from `gregCore/Templates/`. 2. Use templates from `gregCore/Templates/` (and mirrored templates under `gregDataCenterExporter/Templates/` where applicable).
3. Maintain hook metadata and version the mod in its own repository. 3. Maintain hook metadata and version the mod in its own repository.
## Documentation site ## Documentation site
@@ -51,4 +48,4 @@ From the `gregWiki` root: `docker build -t gregwiki-docs .` then `docker run --r
### MCP ### MCP
See [`reference/mcp-server`](./reference/mcp-server.md) — the server lives next to the core sources (`gregCore/mcp-server/`). See [`reference/mcp-server`](./reference/mcp-server.md) — implementation under **`gregCore/mcp-server/`** (install and `--data-root` per that folders `README.md`).

View File

@@ -115,7 +115,7 @@ After publishing, the app re-downloads the item from Steam and replaces your loc
## Extending the service layer ## Extending the service layer
The `SteamWorkshopService` in `WorkshopUploader/Services/SteamWorkshopService.cs` wraps the Facepunch.Steamworks 2.3.3 API. Key methods: The `SteamWorkshopService` in `gregModmanager/Services/SteamWorkshopService.cs` wraps the Facepunch.Steamworks 2.3.3 API. Key methods:
| Method | Purpose | | Method | Purpose |
|--------|---------| |--------|---------|

View File

@@ -21,7 +21,7 @@ This guide is for players who want to **install and manage mods** for Data Cente
## Installation ## Installation
You can run WorkshopManager from **any folder you prefer** (for example `Program Files`, Desktop, Downloads, or `<Data Center install>/WorkshopUploader/`). You can run WorkshopManager from **any folder you prefer** (for example `Program Files`, Desktop, Downloads, or a folder next to the game). **Source code** for the app lives in the repo folder **`gregModmanager/`** (release ZIPs ship `WorkshopUploader.exe` / **Gregtools Modmanager**).
### Option A — Installer setup (recommended) ### Option A — Installer setup (recommended)

View File

@@ -21,9 +21,11 @@ This documentation describes the **current split layout**: a local `gregFramewor
## Repository hub ## Repository hub
- [Workspace map](./workspace/index.mdx) — how folders map to repos - [Workspace map](./workspace/index.mdx) — how folders map to repos
- Core: `gregCore/FrikaMF-StandaloneRepo/` - Core: `gregCore/` (`framework/FrikaMF`, `mcp-server/`, `bridges/gregSta.RustBridge/`)
- Mods: `gregMod.<Name>/` (split repos, directly under `gregFramework/`) - Mods: `gregMod.<Name>/` (split repos, directly under `gregFramework/`)
- Extensions (FFM plugins): `gregExt.<Name>/` (split repos, directly under `gregFramework/`) - Extensions (FFM plugins): `gregExt.<Name>/` (split repos, directly under `gregFramework/`)
- Workshop app: `gregModmanager/` (Gregtools Modmanager — `WorkshopUploader.exe`)
- Exporter / templates: `gregDataCenterExporter/`
- Wiki: `gregWiki/` (this site) - Wiki: `gregWiki/` (this site)
## Hooks and releases ## Hooks and releases
@@ -36,10 +38,10 @@ This documentation describes the **current split layout**: a local `gregFramewor
## Layout (contributors) ## Layout (contributors)
- [Repo inventory](./contributors/repo-inventory.md) — project and repository overview - [Repo inventory](./contributors/repo-inventory.md) — project and repository overview
- Split naming: `gregMod.<Name>`, `gregExt.<Name>`, `gregSta.<Name>` - Split naming: `gregMod.<Name>`, `gregExt.<Name>`, `gregSta.<Name>` (Rust bridge repo), plus apps like `gregModmanager/`, `gregDataCenterExporter/`, `gregIPAM/`, `gregStore/`
## Source model ## Source model
- **Authoring:** Markdown/MDX lives in the **gregWiki** repository. - **Authoring:** Markdown/MDX lives in the **gregWiki** repository.
- **Technical source of truth:** runtime and bridge details come from **gregCore**. - **Technical source of truth:** runtime and bridge details come from **gregCore**.
- **Rust bridge:** integrated in the core tree under `FrikaMF-StandaloneRepo/bridges/gregSta.RustBridge/`. - **Rust bridge:** `gregCore/bridges/gregSta.RustBridge/`.

View File

@@ -27,7 +27,7 @@ Do **not** commit `*.dll` from `lib/references/` (see `.gitignore`).
Official upload and item layout for *Data Center* Workshop content may be undocumented by the developer. Until documented: Official upload and item layout for *Data Center* Workshop content may be undocumented by the developer. Until documented:
- Treat Workshop delivery as **game-defined** (often content under game data / `StreamingAssets`; MelonLoader mods remain **DLLs in `Mods/`**). - Treat Workshop delivery as **game-defined** (often content under game data / `StreamingAssets`; MelonLoader mods remain **DLLs in `Mods/`**).
- The **WorkshopUploader** desktop app (see `WorkshopUploader/`) is the supported path for authors to manage Workshop items and DevServer betas once Steamworks is configured. - The **WorkshopUploader** / **Gregtools Modmanager** desktop app (repo folder `gregModmanager/`) is the supported path for authors to manage Workshop items and DevServer betas once Steamworks is configured.
## Legal ## Legal
@@ -36,4 +36,4 @@ Do not redistribute game binaries or extracted assets. Workshop packages should
## CI / agents ## CI / agents
- `FrikaMF.csproj` builds on Windows agents that have either a Steam *Data Center* install **or** a populated `lib/references/MelonLoader/` (from `refresh_refs.py`). - `FrikaMF.csproj` builds on Windows agents that have either a Steam *Data Center* install **or** a populated `lib/references/MelonLoader/` (from `refresh_refs.py`).
- `WorkshopUploader` targets `net6.0-windows`; build it on Windows (not Linux-hosted runners unless cross-compilation is configured). - `gregModmanager/WorkshopUploader.csproj` targets **.NET 9** MAUI (`net9.0-windows`); build it on Windows (not Linux-hosted runners unless cross-compilation is configured).

View File

@@ -6,7 +6,7 @@ description: Model Context Protocol server bundled with the docs Docker image fo
# MCP server (FrikaMF modding) # MCP server (FrikaMF modding)
The repository ships a **Model Context Protocol (MCP)** server (`mcp-server/`) that exposes: The **gregCore** repository ships a **Model Context Protocol (MCP)** server at **`gregCore/mcp-server/`** that exposes:
- **Docs search & read** — Markdown under `docs/` (same source as Docusaurus). - **Docs search & read** — Markdown under `docs/` (same source as Docusaurus).
- **Hook registry** — `fmf_hooks.json` (and the same registry path in the monorepo). - **Hook registry** — `fmf_hooks.json` (and the same registry path in the monorepo).
@@ -42,14 +42,9 @@ Binding to `0.0.0.0` exposes the MCP endpoint on your network. Use only on trust
## Local (stdio) for Cursor ## Local (stdio) for Cursor
From `mcp-server/` with the repo root as data (so `docs/`, `CONTRIBUTING.md`, and `FrikaModFramework/fmf_hooks.json` resolve): Source: **`gregCore/mcp-server/`** (see **`README.md`** in that folder). Install dependencies with `npm install`, then run `node src/index.mjs --stdio --data-root <root>`, where `<root>` is a directory that contains **`docs/`**, **`CONTRIBUTING.md`**, and **`FrikaModFramework/fmf_hooks.json`** (or a flat `fmf_hooks.json`). The READMEs example uses `--data-root ..` relative to `mcp-server/`; in a **split-repo** workspace you may need a different `<root>` or `FMF_MCP_DATA_ROOT` so all three paths resolve.
```bash Point your MCP client at this command (stdio transport).
cd mcp-server
node src/index.mjs --stdio --data-root ..
```
Point your MCP client at this command (stdio transport). Adjust `--data-root` if your layout differs.
## Tools (summary) ## Tools (summary)

View File

@@ -20,7 +20,7 @@ That applies to anything shipped as a **`gregMod.*`**, **`gregExt.*`**, or **`FF
## What this does *not* restrict ## What this does *not* restrict
- **Framework core** (`gregCore`) may still contain **non-C#** components maintained by core maintainers (for example the **Rust** FFI bridge under `bridges/gregSta.RustBridge/`, build scripts, or tooling). Those are **not** substitutes for implementing mod/plugin/extension behavior outside C#. - **Framework core** (`gregCore`) may still contain **non-C#** components maintained by core maintainers (for example the **Rust** FFI bridge under `gregCore/bridges/gregSta.RustBridge/`, build scripts, or tooling). Those are **not** substitutes for implementing mod/plugin/extension behavior outside C#.
- **Documentation**, **config** (JSON/YAML), and **assets** are not “logic” in this sense. - **Documentation**, **config** (JSON/YAML), and **assets** are not “logic” in this sense.
- **gregStore**, **gregWiki**, and other nonin-game stacks may use other languages as appropriate. - **gregStore**, **gregWiki**, and other nonin-game stacks may use other languages as appropriate.

View File

@@ -35,7 +35,7 @@ Push tag **`gregtools-modmanager-v1.0.0`** on `main` (or run the workflow manual
- [Workshop uploader (full guide)](/wiki/tools/workshop-uploader) - [Workshop uploader (full guide)](/wiki/tools/workshop-uploader)
- [End-user Workshop guide](/wiki/guides/players/enduser-workshop) - [End-user Workshop guide](/wiki/guides/players/enduser-workshop)
- Open-source and third-party components: [`WorkshopUploader/EXTERNAL_DEPENDENCIES.md`](https://github.com/mleem97/gregFramework/blob/main/WorkshopUploader/EXTERNAL_DEPENDENCIES.md) in the repository - Open-source and third-party components: [`gregModmanager/EXTERNAL_DEPENDENCIES.md`](https://github.com/mleem97/gregFramework/blob/main/gregModmanager/EXTERNAL_DEPENDENCIES.md) in the repository
## Scope of 1.0 ## Scope of 1.0

View File

@@ -11,7 +11,6 @@ description: Windows desktop app for managing Steam Workshop content, browsing m
## Features ## Features
### Author tools (Projects / Editor / My Uploads) ### Author tools (Projects / Editor / My Uploads)
- Create workshop projects from templates (vanilla assets, MelonLoader mods, FMF plugins). - Create workshop projects from templates (vanilla assets, MelonLoader mods, FMF plugins).
- Edit **title**, **description** (with BBCode toolbar), **visibility**, **tags**, and **preview image**; stored in `metadata.json`. - Edit **title**, **description** (with BBCode toolbar), **visibility**, **tags**, and **preview image**; stored in `metadata.json`.
- **BBCode formatting toolbar** — insert Steam-compatible formatting (bold, italic, headings, URL, image, list, code, quote, spoiler, horizontal rule, table) directly in the description editor. - **BBCode formatting toolbar** — insert Steam-compatible formatting (bold, italic, headings, URL, image, list, code, quote, spoiler, horizontal rule, table) directly in the description editor.
@@ -26,7 +25,6 @@ description: Windows desktop app for managing Steam Workshop content, browsing m
- **Per-item stats** — subscriptions, votes, score, size. - **Per-item stats** — subscriptions, votes, score, size.
### Mod Store (integrated in Mod Manager) ### 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). - **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. - **Search** mods by text.
- **Subscribe / Unsubscribe** to mods directly from the store. - **Subscribe / Unsubscribe** to mods directly from the store.
@@ -35,20 +33,17 @@ description: Windows desktop app for managing Steam Workshop content, browsing m
- **Item detail view** — full statistics, description, tags, gallery images, action buttons, and links to changelog/comments. - **Item detail view** — full statistics, description, tags, gallery images, action buttons, and links to changelog/comments.
### Mod Manager / Health ### Mod Manager / Health
- **Dependency health** checks: game installed, MelonLoader, Il2Cpp assemblies, FMF core, FMF plugins directory, ModCfg directory. - **Dependency health** checks: game installed, MelonLoader, Il2Cpp assemblies, FMF core, FMF plugins directory, ModCfg directory.
- **MelonLoader** download page link and game folder access. - **MelonLoader** download page link and game folder access.
- **FMF Plugin channels** — stable (local scan) and beta (server, TODO). - **FMF Plugin channels** — stable (local scan) and beta (server, TODO).
### Settings ### Settings
- **Workspace path** — change where projects are stored (defaults to `<GameRoot>/workshop`). - **Workspace path** — change where projects are stored (defaults to `<GameRoot>/workshop`).
- **Language** — switch between EN, DE, RU, ES, IT, JP, PL, CN (defaults to system language). Restart button applies the change instantly. - **Language** — switch between EN, DE, RU, ES, IT, JP, PL, CN (defaults to system language). Restart button applies the change instantly.
- **Mod Store toggle** — enable/disable the Mod Store tab (disabled by default). Restart button included. - **Mod Store toggle** — enable/disable the Mod Store tab (disabled by default). Restart button included.
- **Community links** — quick access to Discord, Modding Channel, and GregFramework.eu. - **Community links** — quick access to Discord, Modding Channel, and GregFramework.eu.
### FMF dependency notice ### FMF dependency notice
- Projects can be marked as **"Needs FrikaModFramework"** in the editor. When uploading, a notice is automatically appended to the Steam description telling users to install FMF. - Projects can be marked as **"Needs FrikaModFramework"** in the editor. When uploading, a notice is automatically appended to the Steam description telling users to install FMF.
## Requirements ## Requirements
@@ -56,7 +51,7 @@ description: Windows desktop app for managing Steam Workshop content, browsing m
- **Windows 10** (version 1809+). - **Windows 10** (version 1809+).
- **Steam** with a signed-in account that **owns Data Center** (App ID **4170200**). - **Steam** with a signed-in account that **owns Data Center** (App ID **4170200**).
- **No additional dependencies** — the release is fully self-contained (includes .NET runtime and Windows App SDK). - **No additional dependencies** — the release is fully self-contained (includes .NET runtime and Windows App SDK).
- `steam_appid.txt` must be next to the executable (included in the release build). The app loads `**steam_api64.dll`** from `**Data Center_Data/Plugins/x86_64/**` in the Data Center install when possible; otherwise it uses the copy shipped next to the uploader. - `steam_appid.txt` must be next to the executable (included in the release build). The app loads **`steam_api64.dll`** from **`Data Center_Data/Plugins/x86_64/`** in the Data Center install when possible; otherwise it uses the copy shipped next to the uploader.
## Paths and directories {#paths} ## Paths and directories {#paths}
@@ -114,11 +109,11 @@ Data Center has a **built-in mod system** (`ModLoader`) that loads mods from `co
The game's `ModLoader` (a Unity `MonoBehaviour`) runs the following on startup: The game's `ModLoader` (a Unity `MonoBehaviour`) runs the following on startup:
1. `**SyncWorkshopThenLoadAll()`** — a coroutine that: 1. **`SyncWorkshopThenLoadAll()`** — a coroutine that:
- Queries all subscribed Steam Workshop items (`PublishedFileId_t[]`) - Queries all subscribed Steam Workshop items (`PublishedFileId_t[]`)
- Waits for downloads to complete (with timeout) - Waits for downloads to complete (with timeout)
- Copies each Workshop item folder into `StreamingAssets/Mods/workshop_<ID>` via `CopyDirectory()` - Copies each Workshop item folder into `StreamingAssets/Mods/workshop_<ID>` via `CopyDirectory()`
2. `**LoadAllMods()**` — scans all subdirectories in the mods path: 2. **`LoadAllMods()`** — scans all subdirectories in the mods path:
- Calls `LoadModPack(folderPath)` for each mod folder - Calls `LoadModPack(folderPath)` for each mod folder
- Reads `config.json`, then for each entry calls: - Reads `config.json`, then for each entry calls:
- `LoadShopItem()``CreateShopTemplate()` + `CreateShopButton()` for purchasable items - `LoadShopItem()``CreateShopTemplate()` + `CreateShopButton()` for purchasable items
@@ -129,7 +124,6 @@ The `LoadDll()` method exists in the `ModLoader` but **object assets (shopItems,
::: :::
Internal state tracked by `ModLoader`: Internal state tracked by `ModLoader`:
- `modTemplates``Dictionary<int, GameObject>` of loaded shop item prefabs by mod ID - `modTemplates``Dictionary<int, GameObject>` of loaded shop item prefabs by mod ID
- `modTemplatesByFolder``Dictionary<string, GameObject>` of prefabs by folder name - `modTemplatesByFolder``Dictionary<string, GameObject>` of prefabs by folder name
- `staticInstances``List<GameObject>` of instantiated static decorations - `staticInstances``List<GameObject>` of instantiated static decorations
@@ -202,20 +196,17 @@ The `workshop_` prefix distinguishes Workshop-downloaded mods from manually inst
### config.json fields ### config.json fields
| Field | Description | | Field | Description |
| --------------- | ------------------------------------------------------------------------- | |-------|-------------|
| `modName` | Display name of the mod | | `modName` | Display name of the mod |
| `shopItems[]` | Purchasable objects that appear in the in-game shop | | `shopItems[]` | Purchasable objects that appear in the in-game shop |
| `staticItems[]` | Decorations placed at fixed world positions | | `staticItems[]` | Decorations placed at fixed world positions |
| `dlls[]` | Native plugin DLLs (see [DLL mods without MelonLoader](#native-dll-mods)) | | `dlls[]` | Native plugin DLLs (see [DLL mods without MelonLoader](#native-dll-mods)) |
### shopItems fields ### shopItems fields
| Field | Type | Description | | Field | Type | Description |
| ---------------- | ----------- | --------------------------------------------------------- | |-------|------|-------------|
| `itemName` | `string` | Display name in the shop | | `itemName` | `string` | Display name in the shop |
| `price` | `int` | Purchase price | | `price` | `int` | Purchase price |
| `xpToUnlock` | `int` | XP threshold to unlock (0 = immediately available) | | `xpToUnlock` | `int` | XP threshold to unlock (0 = immediately available) |
@@ -229,14 +220,12 @@ The `workshop_` prefix distinguishes Workshop-downloaded mods from manually inst
| `iconFile` | `string` | Path to `.png` shop icon (loaded via `LoadIcon`) | | `iconFile` | `string` | Path to `.png` shop icon (loaded via `LoadIcon`) |
| `objectType` | `int` | `0` = passive object | | `objectType` | `int` | `0` = passive object |
The `ModShopItem` UI component displays each shop item with `itemIcon`, `txtName`, and `txtPrice`. Purchasing calls `ButtonBuyItem()`. The `ModShopItem` UI component displays each shop item with `itemIcon`, `txtName`, and `txtPrice`. Purchasing calls `ButtonBuyItem()`.
### staticItems fields ### staticItems fields
| Field | Type | Description | | Field | Type | Description |
| ---------------- | ----------- | --------------------------- | |-------|------|-------------|
| `itemName` | `string` | Display name | | `itemName` | `string` | Display name |
| `modelFile` | `string` | Path to `.obj` model file | | `modelFile` | `string` | Path to `.obj` model file |
| `textureFile` | `string` | Path to `.png` texture file | | `textureFile` | `string` | Path to `.png` texture file |
@@ -246,18 +235,15 @@ The `ModShopItem` UI component displays each shop item with `itemIcon`, `txtName
| `position` | `[x, y, z]` | World position | | `position` | `[x, y, z]` | World position |
| `rotation` | `[x, y, z]` | Euler rotation in degrees | | `rotation` | `[x, y, z]` | Euler rotation in degrees |
### Asset loading pipeline ### Asset loading pipeline
| Method | Input | Output | | Method | Input | Output |
| ----------------------------------------- | ----------- | ----------------- | |--------|-------|--------|
| `LoadMesh(folderPath, modelFile)` | `.obj` file | Unity `Mesh` | | `LoadMesh(folderPath, modelFile)` | `.obj` file | Unity `Mesh` |
| `CreateMaterial(folderPath, textureFile)` | `.png` file | Unity `Material` | | `CreateMaterial(folderPath, textureFile)` | `.png` file | Unity `Material` |
| `LoadIcon(folderPath, iconFile)` | `.png` file | Unity `Sprite` | | `LoadIcon(folderPath, iconFile)` | `.png` file | Unity `Sprite` |
| `LoadTexture(path)` | `.png` file | Unity `Texture2D` | | `LoadTexture(path)` | `.png` file | Unity `Texture2D` |
- **3D models**: Wavefront OBJ format (`.obj`) - **3D models**: Wavefront OBJ format (`.obj`)
- **Textures**: PNG format (`.png`) - **Textures**: PNG format (`.png`)
- **Icons**: PNG format (`.png`) — shown in the shop UI - **Icons**: PNG format (`.png`) — shown in the shop UI
@@ -282,9 +268,8 @@ The game's `ModLoader` has **built-in DLL loading** — no MelonLoader required.
``` ```
**How it works internally:** **How it works internally:**
1. `ModLoader.LoadDll(folderPath, DllEntry)` loads the DLL from the mod folder 1. `ModLoader.LoadDll(folderPath, DllEntry)` loads the DLL from the mod folder
2. The `entryClass` must reference a class that implements the `**IModPlugin`** interface 2. The `entryClass` must reference a class that implements the **`IModPlugin`** interface
3. Loaded plugins are stored in `ModLoader.loadedPlugins` (`List<IModPlugin>`) 3. Loaded plugins are stored in `ModLoader.loadedPlugins` (`List<IModPlugin>`)
:::warning Loading timing :::warning Loading timing
@@ -293,25 +278,21 @@ Unlike asset objects (`shopItems`, `staticItems`) which are loaded at game start
**DLL entry requirements:** **DLL entry requirements:**
| Field | Description | | Field | Description |
| ------------ | ------------------------------------------------------------------------------------- | |-------|-------------|
| `fileName` | The `.dll` file in the mod folder | | `fileName` | The `.dll` file in the mod folder |
| `entryClass` | Fully qualified class name (e.g. `MyNamespace.MyPlugin`) that implements `IModPlugin` | | `entryClass` | Fully qualified class name (e.g. `MyNamespace.MyPlugin`) that implements `IModPlugin` |
:::caution Experimental feature :::caution Experimental feature
The developer has marked DLL loading as **untested**. The `LoadDll` method and `IModPlugin` interface exist in the game code, but stability is not guaranteed. A mod that uses only `shopItems` and `staticItems` (asset-only) is the safest approach. The developer has marked DLL loading as **untested**. The `LoadDll` method and `IModPlugin` interface exist in the game code, but stability is not guaranteed. A mod that uses only `shopItems` and `staticItems` (asset-only) is the safest approach.
::: :::
**Advantages over MelonLoader:** **Advantages over MelonLoader:**
- No external framework needed — works with the vanilla game - No external framework needed — works with the vanilla game
- Distributed via Workshop like any other mod (just include the DLL in the mod folder) - Distributed via Workshop like any other mod (just include the DLL in the mod folder)
- The game manages loading/unloading through its own lifecycle - The game manages loading/unloading through its own lifecycle
**Limitations:** **Limitations:**
- The `IModPlugin` interface contract is not publicly documented — you need to reference the game's IL2CPP assemblies to implement it - The `IModPlugin` interface contract is not publicly documented — you need to reference the game's IL2CPP assemblies to implement it
- Less flexibility than MelonLoader's Harmony patching - Less flexibility than MelonLoader's Harmony patching
- Only the entry class specified in `entryClass` is instantiated - Only the entry class specified in `entryClass` is instantiated
@@ -327,15 +308,13 @@ For now, only **passive objects** are supported for shop items (`objectType: 0`)
The game loads native mods from `Data Center_Data\StreamingAssets\Mods\`. Workshop items are copied into subfolders named `workshop_<PublishedFileId>` under that path (see [Steam install path](#steam-install-path)). The game loads native mods from `Data Center_Data\StreamingAssets\Mods\`. Workshop items are copied into subfolders named `workshop_<PublishedFileId>` under that path (see [Steam install path](#steam-install-path)).
**ModPathRedirector** is a **MelonLoader plugin** (not a MelonMod): install the DLL under `**{GameRoot}/Plugins/`**. It does **not** change native mod paths. It calls `**steam_api64.dll`** directly (Steam flat API: `SteamAPI_ISteamUGC_*`). The game ships this DLL under `**Data Center_Data/Plugins/x86_64/**`; the plugin loads it from there first, then falls back next to the executable. After the Il2Cpp assembly step (see MelonLoader log: `Il2CppAssemblyGenerator`), `**OnPreModsLoaded**` blocks loading MelonMods until each subscribed Workshop item reports installed in Steam and a matching `**Data Center_Data/StreamingAssets/Mods/workshop_<ID>/**` folder exists (per-item `**DownloadItem**`, `**SteamAPI_RunCallbacks**`, timeouts). If the game has not copied Workshop content into `StreamingAssets/Mods` yet, the plugin continues after a short grace period and logs a warning — restart once if mods are missing. **ModPathRedirector** is a **MelonLoader plugin** (not a MelonMod): install the DLL under **`{GameRoot}/Plugins/`**. It does **not** change native mod paths. It calls **`steam_api64.dll`** directly (Steam flat API: `SteamAPI_ISteamUGC_*`). The game ships this DLL under **`Data Center_Data/Plugins/x86_64/`**; the plugin loads it from there first, then falls back next to the executable. After the Il2Cpp assembly step (see MelonLoader log: `Il2CppAssemblyGenerator`), **`OnPreModsLoaded`** blocks loading MelonMods until each subscribed Workshop item reports installed in Steam and a matching **`Data Center_Data/StreamingAssets/Mods/workshop_<ID>/`** folder exists (per-item **`DownloadItem`**, **`SteamAPI_RunCallbacks`**, timeouts). If the game has not copied Workshop content into `StreamingAssets/Mods` yet, the plugin continues after a short grace period and logs a warning — restart once if mods are missing.
**What it does:** **What it does:**
- On each frame (from `OnApplicationStarted`), waits for `SteamAPI_IsSteamRunning` and resolves `SteamAPI_SteamUGC_v0xx``ISteamUGC*`, then calls the native UGC APIs (no Il2Cpp Steamworks wrapper)
- On each frame (from `OnApplicationStarted`), waits for `SteamAPI_IsSteamRunning` and resolves `SteamAPI_SteamUGC_v0xx``ISteamUGC`*, then calls the native UGC APIs (no Il2Cpp Steamworks wrapper)
- Leaves `ModLoader.LoadAllMods` / `CopyDirectory` unchanged — Workshop sync still uses `Data Center_Data/StreamingAssets/Mods/workshop_<ID>/` - Leaves `ModLoader.LoadAllMods` / `CopyDirectory` unchanged — Workshop sync still uses `Data Center_Data/StreamingAssets/Mods/workshop_<ID>/`
**Installation:** **Installation:**
1. Copy `FMF.ModPathRedirector.dll` into `<GameRoot>/Plugins/` (MelonLoader **Plugins** folder next to the executable) 1. Copy `FMF.ModPathRedirector.dll` into `<GameRoot>/Plugins/` (MelonLoader **Plugins** folder next to the executable)
2. Start the game — subscribed Workshop content is requested early; manual native mods still go under `Data Center_Data/StreamingAssets/Mods/<folder>/` (each folder with a `config.json`) 2. Start the game — subscribed Workshop content is requested early; manual native mods still go under `Data Center_Data/StreamingAssets/Mods/<folder>/` (each folder with a `config.json`)
@@ -412,9 +391,8 @@ workshop/
### metadata.json schema ### metadata.json schema
| Field | Type | Description | | Field | Type | Description |
| -------------------------- | ---------- | -------------------------------------------------------------- | |-------|------|-------------|
| `publishedFileId` | `number` | Steam file ID (0 if unpublished) | | `publishedFileId` | `number` | Steam file ID (0 if unpublished) |
| `title` | `string` | Workshop item title (max 128 chars) | | `title` | `string` | Workshop item title (max 128 chars) |
| `description` | `string` | Description, supports [Steam BBCode](#bbcode) (max 8000 chars) | | `description` | `string` | Description, supports [Steam BBCode](#bbcode) (max 8000 chars) |
@@ -424,20 +402,17 @@ workshop/
| `needsFmf` | `boolean` | Appends FMF dependency notice on upload | | `needsFmf` | `boolean` | Appends FMF dependency notice on upload |
| `additionalPreviews` | `string[]` | Relative paths to gallery screenshot images | | `additionalPreviews` | `string[]` | Relative paths to gallery screenshot images |
## Using the app ## Using the app
### Tabs ### Tabs
| Tab | Purpose | | Tab | Purpose |
| -------------- | ------------------------------------------------- | |-----|---------|
| **Projects** | Local workshop projects; search, open editor | | **Projects** | Local workshop projects; search, open editor |
| **New** | Create from template (vanilla, MelonLoader, FMF) | | **New** | Create from template (vanilla, MelonLoader, FMF) |
| **My Uploads** | Paginated list of your published items with stats | | **My Uploads** | Paginated list of your published items with stats |
| **Mod Store** | Browse, search, subscribe, vote, and manage mods | | **Mod Store** | Browse, search, subscribe, vote, and manage mods |
### Publish workflow ### Publish workflow
1. Open a project from the **Projects** tab. 1. Open a project from the **Projects** tab.
@@ -466,7 +441,6 @@ WorkshopUploader.exe --mode publish --path <project-folder>
``` ```
Optional flags: Optional flags:
- `--autocommit` — writes a status JSON for external tools. - `--autocommit` — writes a status JSON for external tools.
## Steam BBCode reference {#bbcode} ## Steam BBCode reference {#bbcode}
@@ -577,9 +551,8 @@ Subscribe to this Workshop item — the game loads it automatically.
Before uploading, the editor runs automated checks: Before uploading, the editor runs automated checks:
| Check | Error condition | Warning condition | | Check | Error condition | Warning condition |
| ------------------ | --------------------------- | ------------------- | |-------|----------------|-------------------|
| **Content folder** | `content/` missing or empty | — | | **Content folder** | `content/` missing or empty | — |
| **Title** | Empty or > 128 characters | — | | **Title** | Empty or > 128 characters | — |
| **Description** | > 8000 characters | Empty (recommended) | | **Description** | > 8000 characters | Empty (recommended) |
@@ -589,20 +562,17 @@ Before uploading, the editor runs automated checks:
| **Content size** | — | > 100 MB | | **Content size** | — | > 100 MB |
| **Changelog** | Empty on first publish | Empty on update | | **Changelog** | Empty on first publish | Empty on update |
Items with **errors** cannot be uploaded. **Warnings** are informational — upload is still possible. Items with **errors** cannot be uploaded. **Warnings** are informational — upload is still possible.
## Preview images {#preview-images} ## Preview images {#preview-images}
### Main preview image ### Main preview image
- Supports **PNG**, **JPG**, **JPEG**, **GIF**, and **WebP**. - Supports **PNG**, **JPG**, **JPEG**, **GIF**, and **WebP**.
- Auto-detected by filename: `preview.png`, `preview.jpg`, etc. - Auto-detected by filename: `preview.png`, `preview.jpg`, etc.
- Recommended size: under **1 MB**. - Recommended size: under **1 MB**.
- The app auto-detects the format from the file's magic bytes when syncing from Steam. - The app auto-detects the format from the file's magic bytes when syncing from Steam.
### Gallery screenshots ### Gallery screenshots
- Up to **9** additional images per item. - Up to **9** additional images per item.
- Stored in `screenshots/` under the project root. - Stored in `screenshots/` under the project root.
- Uploaded in a separate pass after the main content publish. - Uploaded in a separate pass after the main content publish.
@@ -615,10 +585,10 @@ Items with **errors** cannot be uploaded. **Warnings** are informational — upl
The app is published as a **self-contained** Windows executable — no .NET runtime or Windows App SDK install required on the target machine. The app is published as a **self-contained** Windows executable — no .NET runtime or Windows App SDK install required on the target machine.
```bash ```bash
dotnet publish WorkshopUploader/WorkshopUploader.csproj -c Release -p:SelfContained=true -p:RuntimeIdentifier=win10-x64 dotnet publish gregModmanager/WorkshopUploader.csproj -c Release -p:SelfContained=true -p:RuntimeIdentifier=win10-x64
``` ```
Output: `WorkshopUploader/bin/Release/net9.0-windows10.0.19041.0/win10-x64/publish/` Output: `gregModmanager/bin/Release/net9.0-windows10.0.19041.0/win10-x64/publish/`
### Deploy all mods + Gregtools Modmanager to Workshop folders ### Deploy all mods + Gregtools Modmanager to Workshop folders
@@ -665,7 +635,6 @@ Yes. Use **My Uploads** → select the item → **Import**. The app downloads ev
**Q: Why can't I upload? The button is greyed out / shows errors.** **Q: Why can't I upload? The button is greyed out / shows errors.**
The upload readiness checker found issues. Common blockers: The upload readiness checker found issues. Common blockers:
- `content/` folder is missing or empty. - `content/` folder is missing or empty.
- Title is empty. - Title is empty.
- No changelog provided on first publish. - No changelog provided on first publish.
@@ -675,7 +644,6 @@ Check the readiness panel at the bottom of the editor for details.
Yes for the **first publish** (error if empty). For updates it's recommended but not enforced (warning only). Yes for the **first publish** (error if empty). For updates it's recommended but not enforced (warning only).
**Q: What happens after I click "Save and upload to Steam"?** **Q: What happens after I click "Save and upload to Steam"?**
1. Metadata is saved locally. 1. Metadata is saved locally.
2. Content and preview are uploaded to Steam. 2. Content and preview are uploaded to Steam.
3. Gallery screenshots are uploaded (if any). 3. Gallery screenshots are uploaded (if any).
@@ -722,21 +690,18 @@ Yes. After publishing and during import, gallery screenshots are downloaded from
**Q: How does the game load Workshop mods?** **Q: How does the game load Workshop mods?**
At startup, the game's `ModLoader.SyncWorkshopThenLoadAll()` queries all subscribed items from Steam, waits for downloads to complete, and copies each into `Data Center_Data/StreamingAssets/Mods/workshop_<ID>/`. Then `LoadAllMods()` scans that folder. Asset objects (shopItems, staticItems) load immediately; DLL mods load later at SaveLoad time. The content structure determines what kind of mod it is: At startup, the game's `ModLoader.SyncWorkshopThenLoadAll()` queries all subscribed items from Steam, waits for downloads to complete, and copies each into `Data Center_Data/StreamingAssets/Mods/workshop_<ID>/`. Then `LoadAllMods()` scans that folder. Asset objects (shopItems, staticItems) load immediately; DLL mods load later at SaveLoad time. The content structure determines what kind of mod it is:
- **Native mods** (vanilla): `config.json` + OBJ/PNG assets directly in `content/` — no extra tools needed. - **Native mods** (vanilla): `config.json` + OBJ/PNG assets directly in `content/` — no extra tools needed.
- **MelonLoader mods**: `content/Mods/` with `.dll` files — requires MelonLoader. - **MelonLoader mods**: `content/Mods/` with `.dll` files — requires MelonLoader.
- **FMF plugins**: `content/FMF/Plugins/` with `.dll` files — requires MelonLoader + FMF. - **FMF plugins**: `content/FMF/Plugins/` with `.dll` files — requires MelonLoader + FMF.
**Q: What are the three mod types?** **Q: What are the three mod types?**
| Type | Requirements | Content structure | Use case | | Type | Requirements | Content structure | Use case |
| -------------------- | ----------------- | ------------------------------- | --------------------------------------- | |------|-------------|-------------------|----------|
| **Vanilla (native)** | None | `config.json` + `.obj` + `.png` | Custom objects, decorations, shop items | | **Vanilla (native)** | None | `config.json` + `.obj` + `.png` | Custom objects, decorations, shop items |
| **MelonLoader** | MelonLoader | `Mods/*.dll` | Code mods (IL2CPP) | | **MelonLoader** | MelonLoader | `Mods/*.dll` | Code mods (IL2CPP) |
| **FMF plugin** | MelonLoader + FMF | `FMF/Plugins/*.dll` | FrikaModFramework plugins | | **FMF plugin** | MelonLoader + FMF | `FMF/Plugins/*.dll` | FrikaModFramework plugins |
**Q: What model format does the native mod system use?** **Q: What model format does the native mod system use?**
Wavefront OBJ (`.obj`) for 3D models and PNG (`.png`) for textures and icons. Wavefront OBJ (`.obj`) for 3D models and PNG (`.png`) for textures and icons.
@@ -763,33 +728,28 @@ Yes. Browse or search for mods, then click **Subscribe**. Steam will download th
### Troubleshooting ### Troubleshooting
**Q: The app won't start / crashes on launch.** **Q: The app won't start / crashes on launch.**
- Ensure `steam_appid.txt` is next to the executable; `steam_api64.dll` should resolve from the Data Center install (`Data Center_Data/Plugins/x86_64/`) or from the uploader folder. - Ensure `steam_appid.txt` is next to the executable; `steam_api64.dll` should resolve from the Data Center install (`Data Center_Data/Plugins/x86_64/`) or from the uploader folder.
- Steam must be running and logged in. - Steam must be running and logged in.
- Check the Windows Event Viewer (Application log) for .NET crash details. - Check the Windows Event Viewer (Application log) for .NET crash details.
- On Windows 10 < 1809, the app may not work due to WinUI requirements. - On Windows 10 < 1809, the app may not work due to WinUI requirements.
**Q: "Steam init failed" error in the app.** **Q: "Steam init failed" error in the app.**
- Make sure Steam is running and you are logged in. - Make sure Steam is running and you are logged in.
- Verify you own Data Center (App ID 4170200). - Verify you own Data Center (App ID 4170200).
- Check that `steam_appid.txt` contains `4170200`. - Check that `steam_appid.txt` contains `4170200`.
**Q: My content doesn't show up after subscribing.** **Q: My content doesn't show up after subscribing.**
- Restart the game — Workshop content is loaded at startup. - Restart the game — Workshop content is loaded at startup.
- Check `steamapps/workshop/content/4170200/` to verify the download exists. - Check `steamapps/workshop/content/4170200/` to verify the download exists.
- If the folder is empty, try unsubscribing and re-subscribing. - If the folder is empty, try unsubscribing and re-subscribing.
**Q: The preview image doesn't load in the Mod Store.** **Q: The preview image doesn't load in the Mod Store.**
- The image is loaded from Steam's CDN. Check your internet connection. - The image is loaded from Steam's CDN. Check your internet connection.
- Very large images may take a moment to appear. - Very large images may take a moment to appear.
## See also ## See also
- Repository README: `[WorkshopUploader/README.md](https://github.com/mleem97/gregFramework/blob/master/WorkshopUploader/README.md)` - Repository README: [`gregModmanager/README.md`](https://github.com/mleem97/gregFramework/blob/main/gregModmanager/README.md) (product **Gregtools Modmanager**; `WorkshopUploader.csproj`)
- [End-User Guide](/wiki/guides/players/enduser-workshop) - [End-User Guide](/wiki/guides/players/enduser-workshop)
- [Contributor Guide](/wiki/guides/contributors/contributor-workshop) - [Contributor Guide](/wiki/guides/contributors/contributor-workshop)
- [Release](/wiki/guides/contributors/release) - [Release](/wiki/guides/contributors/release)

View File

@@ -10,13 +10,19 @@ The **gregFramework** folder groups several repositories (split layout). Use thi
| Area | Folder | Role | | Area | Folder | Role |
|------|--------|------| |------|--------|------|
| Framework core | `gregCore/` | **Framework core**: translations, hooks, runtime (Harmony/events), MelonLoader host, plugins (`FFM.Plugin.*`), templates, bridges | | **Framework core** | `gregCore/` | MelonLoader host (`gregCore/framework/FrikaMF.csproj`), templates, **`gregCore/mcp-server/`**, optional `gregCore/plugins/` mirrors |
| Mods | `gregMod.<Name>/` (direkt unter `gregFramework/`) | Standalone gameplay mods (`FMF.*`) | | **Gameplay mods** | `gregMod.<Name>/` | Standalone mods (`FMF.*`) — **directly under `gregFramework/`** (the `gregMods/` umbrella is deprecated) |
| Extensions | `gregExt.<Name>/` (direkt unter `gregFramework/`) | Extension modules (e.g. player models) | | **Framework plugins** | `gregExt.<Name>/` | FFM plugins (`FFM.Plugin.*`) — **directly under `gregFramework/`** (the `gregExtensions/` umbrella is deprecated) |
| Documentation | `gregWiki/` | This Docusaurus site (`docs/`) | | **Workshop desktop app** | `gregModmanager/` | **Gregtools Modmanager** (MAUI); project file `WorkshopUploader.csproj`, executable **`WorkshopUploader.exe`** |
| Legacy / tools | `gregDataCenterExporter/` | Historical monolith; migration staging | | **Data Center exporter / assets** | `gregDataCenterExporter/` | Templates, exporter tooling, `FrikaModFramework/fmf_hooks.json` (among copies) |
| Modstore / infra | `gregStore/` | **Gregweb** (private repo): Next.js app (`web/`), Docker stack (`infra/`, compose at repo root) | | **Documentation** | `gregWiki/` | This Docusaurus site (`docs/`) |
| IPAM / DHCP | `gregIPAM/` | **DHCP** and **IPAM** gameplay mod (MelonLoader; in-repo project still `DHCPSwitches` / `DHCPSwitches.csproj`) | | **Mod store / web (if cloned)** | `gregStore/` | Private Next.js modstore stack (`web/`, …) — optional sibling repo |
| Misc | `gregReferences/`, `gregMeta/`, `gregInternalDocs/` | Supporting repos and notes | | **IPAM / DHCP mod** | `gregIPAM/` | Gameplay tooling (e.g. `DHCPSwitches.csproj`) |
| **References & IL2CPP** | `gregReferences/` | Unpacked assemblies, tooling baselines |
| **Meta / internal docs** | `gregMeta/`, `gregInternalDocs/` | Notes and internal documentation |
| **Examples** | `exGregFramework/` | Example / bootstrap layout |
| **Helper** | `siblingRepos/` | Scripts to clone related repos |
**Rust FFI bridge:** `gregCore/bridges/gregSta.RustBridge/` (not under a separate `DataCenter-RustBridge` top-level folder).
**Detailed inventory** (paths, `.csproj`, hooks): [Repository inventory](../contributors/repo-inventory). **Detailed inventory** (paths, `.csproj`, hooks): [Repository inventory](../contributors/repo-inventory).

View File

@@ -4,15 +4,16 @@ sidebar_label: Erste Schritte
description: "Split-Repo-Workspace: gregFramework-Layout, Core bauen und wo die Doku liegt." 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.: Die Struktur ist **Multi-Repo** mit `gregFramework/` als lokalem Wrapper-Ordner. Darin liegen die eigenständigen Repositories, z.B.:
- `gregCore/`**Framework-Kern**: Übersetzung, Hooks, Harmony-/Event-Laufzeit, Templates, Bridges und übrige Kernfunktionen - `gregCore/`Core-SDK (`gregCore/framework/FrikaMF.csproj`), MCP unter `gregCore/mcp-server/`
- `gregMod.<Name>/` (einzelne Mod-Repos, direkt unter `gregFramework/`) - `gregMod.<Name>/` — Gameplay-Mods (`FMF.*`), **flach** neben `gregCore/` (älteres `gregMods/` ist obsolet)
- `gregExt.<Name>/` (einzelne Extension-Repos, direkt unter `gregFramework/`) - `gregExt.<Name>/` — Framework-Plugins (`FFM.Plugin.*`), ebenfalls flach (älteres `gregExtensions/` obsolet)
- `gregWiki/` (Dokumentation) - `gregModmanager/`**Gregtools Modmanager** (WorkshopManager; `WorkshopUploader.csproj`)
- `gregStore/` (**Gregweb**, privates Repository — Modstore Web + Infra; Next.js unter `web/`) - `gregDataCenterExporter/` — Exporter, Templates, Hook-JSON-Spiegel
- `gregWiki/` — diese Dokumentation
Das Upstream-Projekt **DataCenter-RustBridge** wird in den Core integriert und liegt unter: Die **Rust**-Bridge liegt unter:
- `gregCore/bridges/gregSta.RustBridge/` - `gregCore/bridges/gregSta.RustBridge/`
@@ -24,20 +25,16 @@ dotnet build gregCore/FrikaMF.sln -c Release
Alternativ in der IDE: `gregCore/FrikaMF.sln` öffnen. Alternativ in der IDE: `gregCore/FrikaMF.sln` öffnen.
## Sprache (Mods / Plugins / Extensions)
**Pflicht:** Gameplay- und Integrationslogik für Mods, MelonLoader-Plugins und Extensions ausschließlich in **C#**. Siehe [Modding-Sprache (nur C#)](/wiki/reference/modding-language-requirement).
## Hook-Naming ## Hook-Naming
- **Zielkonvention:** `FMF.<DOMAIN>.<Event>` (siehe [`CONTRIBUTING.md`](https://github.com/mleem97/gregFramework/blob/master/CONTRIBUTING.md)). - **Zielkonvention:** `FMF.<DOMAIN>.<Event>` (siehe [`CONTRIBUTING.md`](https://github.com/mleem97/gregFramework/blob/main/CONTRIBUTING.md)).
- **Registry:** [`FrikaModFramework/fmf_hooks.json`](https://github.com/mleem97/gregFramework/blob/master/FrikaModFramework/fmf_hooks.json). - **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`](https://github.com/mleem97/gregFramework/blob/master/framework/FrikaMF/HookNames.cs) nutzen, bis migriert. - **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 ## Mod starten
1. Neues Mod-Repo als Ordner `gregMod.<Name>/` unter `gregFramework/` anlegen. 1. Neues Mod-Repo als `gregMod.<Name>/` unter `gregFramework/` anlegen (neben `gregCore/` klonen oder anlegen).
2. Templates aus `gregCore/Templates/` nutzen. 2. Templates aus `gregCore/Templates/` nutzen (Spiegel unter `gregDataCenterExporter/Templates/` wo vorhanden).
3. Hook-Metadaten pflegen und Mod im eigenen Repo versionieren. 3. Hook-Metadaten pflegen und Mod im eigenen Repo versionieren.
## Dokumentations-Site ## Dokumentations-Site
@@ -51,4 +48,4 @@ Im `gregWiki`-Root: `docker build -t gregwiki-docs .` und `docker run --rm -p 30
### MCP ### MCP
Siehe [`reference/mcp-server`](/wiki/reference/mcp-server) im Core (`gregCore/mcp-server/`). Siehe [`reference/mcp-server`](/wiki/reference/mcp-server) — Implementierung unter **`gregCore/mcp-server/`** (Installation und `--data-root` laut `README.md` dort).

View File

@@ -21,9 +21,11 @@ Diese Dokumentation beschreibt den **aktuellen Split-Stand**: `gregFramework/` a
## Repository-Hub ## Repository-Hub
- [Workspace-Karte](/wiki/workspace/) — Ordner → Repos - [Workspace-Karte](/wiki/workspace/) — Ordner → Repos
- Core: `gregCore/FrikaMF-StandaloneRepo/` - Core: `gregCore/` (`framework/FrikaMF`, `mcp-server/`, `bridges/gregSta.RustBridge/`)
- Mods: `gregMod.<Name>/` (Split-Repos, direkt unter `gregFramework/`) - Mods: `gregMod.<Name>/` (Split-Repos, direkt unter `gregFramework/`)
- Extensions (FFM-Plugins): `gregExt.<Name>/` (Split-Repos, direkt unter `gregFramework/`) - Extensions (FFM-Plugins): `gregExt.<Name>/` (Split-Repos, direkt unter `gregFramework/`)
- Workshop-App: `gregModmanager/` (Gregtools Modmanager — `WorkshopUploader.exe`)
- Exporter/Templates: `gregDataCenterExporter/`
- Wiki: `gregWiki/` - Wiki: `gregWiki/`
## Hooks und Releases ## Hooks und Releases
@@ -36,10 +38,10 @@ Diese Dokumentation beschreibt den **aktuellen Split-Stand**: `gregFramework/` a
## Layout (Contributors) ## Layout (Contributors)
- [Repo-Inventar](/wiki/contributors/repo-inventory) — Projekt- und Repo-Übersicht - [Repo-Inventar](/wiki/contributors/repo-inventory) — Projekt- und Repo-Übersicht
- Split-Konvention: `gregMod.<Name>`, `gregExt.<Name>`, `gregSta.<Name>` - Split-Konvention: `gregMod.<Name>`, `gregExt.<Name>`, `gregSta.<Name>` (Rust-Bridge-Repo), plus Apps wie `gregModmanager/`, `gregDataCenterExporter/`, `gregIPAM/`, `gregStore/`
## Quellenmodell ## Quellenmodell
- **Authoring:** Inhalte liegen im **gregWiki**-Repo. - **Authoring:** Inhalte liegen im **gregWiki**-Repo.
- **Technische Wahrheit:** Runtime/Bridge-Details kommen aus **gregCore**. - **Technische Wahrheit:** Runtime/Bridge-Details kommen aus **gregCore**.
- **RustBridge:** im Core unter `FrikaMF-StandaloneRepo/bridges/gregSta.RustBridge/`. - **RustBridge:** `gregCore/bridges/gregSta.RustBridge/`.

View File

@@ -20,7 +20,7 @@ Das gilt für alles, was als **`gregMod.*`**, **`gregExt.*`** oder **`FFM.Plugin
## Was hiervon *nicht* betroffen ist ## Was hiervon *nicht* betroffen ist
- Der **Framework-Kern** (`gregCore`) kann weiterhin **Nicht-C#**-Bestandteile enthalten (z. B. **Rust**-FFI unter `bridges/gregSta.RustBridge/`, Build-Skripte, Tools). Das ersetzt **nicht** Mod-/Plugin-/Extension-Logik außerhalb von C#. - 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“. - **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. - **gregStore**, **gregWiki** und andere Nicht-In-Game-Stacks dürfen andere Sprachen nutzen.

View File

@@ -100,10 +100,10 @@ WorkshopUploader.exe --mode publish --path <project-folder>
Die App wird als **eigenständige** Windows-Executable veröffentlicht — auf dem Zielrechner ist keine Installation von .NET-Runtime oder Windows App SDK erforderlich. 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 ```bash
dotnet publish WorkshopUploader/WorkshopUploader.csproj -c Release -p:SelfContained=true -p:RuntimeIdentifier=win10-x64 dotnet publish gregModmanager/WorkshopUploader.csproj -c Release -p:SelfContained=true -p:RuntimeIdentifier=win10-x64
``` ```
Ausgabe: `WorkshopUploader/bin/Release/net9.0-windows10.0.19041.0/win10-x64/publish/` Ausgabe: `gregModmanager/bin/Release/net9.0-windows10.0.19041.0/win10-x64/publish/`
### Alle Mods + Gregtools Modmanager in Workshop-Ordner bereitstellen ### Alle Mods + Gregtools Modmanager in Workshop-Ordner bereitstellen
@@ -121,7 +121,7 @@ pwsh -File scripts/Deploy-Release-ToDataCenter.ps1 -IncludeWorkshopUploader
## See also ## See also
- Repository README: [`WorkshopUploader/README.md`](https://github.com/mleem97/gregFramework/blob/master/WorkshopUploader/README.md) - 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) - [End-User Guide](/wiki/guides/players/enduser-workshop)
- [Contributor Guide](/wiki/guides/contributors/contributor-workshop) - [Contributor Guide](/wiki/guides/contributors/contributor-workshop)
- [Release](/wiki/guides/contributors/release) - [Release](/wiki/guides/contributors/release)