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>
155 lines
4.6 KiB
Markdown
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
|