Files
rr3-server/ASSET-MANIFEST-SPECIFICATION.md
Daniel Elliott dd2c23000f Add game version management system with manifest support
Features:
- Version dropdown in single/ZIP upload (9.3.0, 9.2.0, etc.)
- Patch-compatible matching (9.3.x assets work with 9.3.0)
- manifest.json/xml support for automatic metadata detection
- Smart category auto-detection from folder structure
- Version field stored in GameAssets table

Manifest support:
- JSON format with gameVersion, category, assets array
- Per-file metadata overrides (type, required, description)
- Auto-detect falls back if no manifest present
- See ASSET-MANIFEST-SPECIFICATION.md for full spec

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-20 09:55:05 -08:00

155 lines
4.6 KiB
Markdown

# RR3 Asset Manifest Specification
## Overview
When uploading ZIP files to the RR3 Community Server, you can include a `manifest.json` or `manifest.xml` file to automatically configure asset metadata, version, and categorization.
## File Format Options
### Option 1: JSON Format (Recommended)
Place `manifest.json` in the root of your ZIP file:
```json
{
"version": "9.3.0",
"gameVersion": "9.3.0",
"description": "Porsche Pack - 911 Models",
"author": "CommunityModder",
"category": "cars",
"assets": [
{
"file": "porsche/911_turbo.dat",
"category": "cars/porsche",
"type": "Model",
"required": true,
"description": "Porsche 911 Turbo model"
},
{
"file": "textures/911_turbo_paint.tex",
"category": "textures/cars",
"type": "Texture",
"required": false
}
]
}
```
### Option 2: XML Format
Place `manifest.xml` in the root of your ZIP file:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<AssetManifest>
<Version>9.3.0</Version>
<GameVersion>9.3.0</GameVersion>
<Description>Porsche Pack - 911 Models</Description>
<Author>CommunityModder</Author>
<Category>cars</Category>
<Assets>
<Asset>
<File>porsche/911_turbo.dat</File>
<Category>cars/porsche</Category>
<Type>Model</Type>
<Required>true</Required>
<Description>Porsche 911 Turbo model</Description>
</Asset>
<Asset>
<File>textures/911_turbo_paint.tex</File>
<Category>textures/cars</Category>
<Type>Texture</Type>
<Required>false</Required>
</Asset>
</Assets>
</AssetManifest>
```
## Field Descriptions
### Root Fields
- **version**: Asset pack version (e.g., "1.0.0")
- **gameVersion**: RR3 game version this pack is for (e.g., "9.3.0")
- **description**: Brief description of the asset pack
- **author**: Creator name (optional)
- **category**: Default category if not specified per-asset
### Asset Fields
- **file**: Relative path to file within ZIP (required)
- **category**: Asset category (overrides root category)
- **type**: Asset type (Data, Texture, Audio, Model, Config)
- **required**: Whether clients must download this (true/false)
- **description**: Brief description (optional)
## Game Version Format
- Use semantic versioning: `MAJOR.MINOR.PATCH`
- Examples: `9.3.0`, `9.3.1`, `10.0.0`
- **Compatibility**: Patch versions are compatible (9.3.x works with 9.3.0)
## Categories
Standard categories:
- `base` - Core game files
- `cars` - Car models and data
- `tracks` - Track models and data
- `audio` - Sound effects and music
- `textures` - Texture files
- `ui` - User interface elements
- `events` - Event configurations
- `dlc` - Downloadable content
- `updates` - Game updates
Subcategories allowed (e.g., `cars/porsche`, `tracks/silverstone`)
## Asset Types
- `Data` - Generic data files (.dat, .pak, .z)
- `Texture` - Texture files (.tex, .dds, .png)
- `Audio` - Audio files (.ogg, .mp3, .wav)
- `Model` - 3D model files (.nct, .obj)
- `Config` - Configuration files (.json, .xml)
## Automatic Detection Fallback
If no manifest file is provided, the server uses smart detection:
1. Searches folder names for keywords (cars, tracks, audio, etc.)
2. Preserves folder structure as subcategories
3. Falls back to first folder name if no keywords match
4. Version defaults to manual selection or "unknown"
## Example ZIP Structure
```
my-asset-pack.zip
├── manifest.json # Metadata file
├── cars/
│ ├── porsche/
│ │ ├── 911_turbo.dat
│ │ └── 911_gt3.dat
│ └── ferrari/
│ └── 488_gtb.dat
└── textures/
└── cars/
└── paint_textures.pak
```
## Upload Behavior
1. Server extracts ZIP to temp location
2. Searches for `manifest.json` or `manifest.xml` in root
3. If found: Uses metadata from manifest
4. If not found: Uses smart folder detection
5. Processes each file according to configuration
6. Calculates MD5/SHA256 hashes automatically
7. Stores in database with version + category info
## Version Compatibility
When a game client requests assets:
- Client sends version: `9.3.1`
- Server returns assets for: `9.3.0`, `9.3.1` (patch-compatible)
- Server excludes: `9.2.x`, `9.4.x`, `10.x.x`
Major/minor versions must match exactly, patch versions are compatible within the same minor version.
## Best Practices
1. Always include a manifest file for large packs
2. Use semantic versioning for both pack and game version
3. Mark base game assets as `required: true`
4. Use descriptive categories and subcategories
5. Include author information for community tracking
6. Test with single-file upload before bulk ZIP upload
7. Use JSON format for better tool support