@page @model RR3CommunityServer.Pages.AssetsModel @{ ViewData["Title"] = "Asset Management"; }

đŸ“Ļ Asset Management

Upload and manage game assets for client downloads

← Back to Dashboard
@if (!string.IsNullOrEmpty(Model.Message)) { }

@Model.Stats.TotalAssets

Total Assets

@Model.Stats.AvailableAssets

Available

@Model.Stats.TotalSizeMB MB

Total Size

@Model.Stats.TotalDownloads

Downloads

Supported: .pak, .z, .dat, .nct, .json, .xml, images, audio
Path format: /rr3/category/filename.ext
Patch-compatible: 14.0.x works with 14.0.0
ZIP Upload: Folder structure preserved â€ĸ Auto MD5 calculation â€ĸ Manifest.json support
Include manifest.json for auto-detection â€ĸ Example: cars/porsche_911.dat → /cars/porsche_911.dat
Or specify in manifest.json
Direct Download: Server downloads ZIP directly â€ĸ No browser upload needed â€ĸ Perfect for large files
Direct link to ZIP file (http:// or https://)
System will auto-detect categories from folder names
📋 Asset Inventory
@if (!Model.Assets.Any()) {
No assets uploaded yet. Use the form above to upload your first asset.
} else {
@foreach (var asset in Model.Assets) { }
File Name EA CDN Path Category Type Size MD5 Downloads Required Actions
@asset.FileName @if (!string.IsNullOrEmpty(asset.Description)) {
@asset.Description }
@asset.EaCdnPath @asset.Category @asset.AssetType @FormatFileSize(asset.FileSize) @(asset.Md5Hash?.Substring(0, 8) ?? "N/A")... @if (!string.IsNullOrEmpty(asset.Md5Hash)) { } @asset.AccessCount @if (asset.IsRequired) { Required } else { Optional }
}
â„šī¸ Nimble SDK Asset Download System
How RR3 Downloads Assets:
  1. Game Startup: UnpackAssetsActivity extracts bundled APK assets
  2. Manifest Request: Game calls GET /content/api/manifest
  3. Verification: Compares local assets with manifest (MD5 checksums)
  4. Download Missing: Calls GET /content/api/[asset-path] for missing files
  5. Storage: Saves to /external/storage/apk/ directory
  6. Launch Game: All required assets present, game starts
Asset Manifest Format:
{
  "resultCode": 0,
  "message": "Success",
  "data": [
    {
      "path": "/rr3/base/game_data.pak",
      "md5": "a1b2c3d4e5f6...",
      "compressedSize": 1048576,
      "uncompressedSize": 2097152,
      "category": "base"
    }
  ]
}
Nimble SDK Authentication Headers:
  • EAM-SESSION - Session UUID
  • EAM-USER-ID - User identifier
  • EA-SELL-ID - Marketplace (e.g., GOOGLE_PLAY)
  • SDK-VERSION - Nimble SDK version
Important: Assets must have correct MD5 hashes or the game will reject them and re-download.
@section Scripts { } @functions { private string FormatFileSize(long bytes) { string[] sizes = { "B", "KB", "MB", "GB" }; double len = bytes; int order = 0; while (len >= 1024 && order < sizes.Length - 1) { order++; len = len / 1024; } return $"{len:0.##} {sizes[order]}"; } }