Files
rr3-server/RR3CommunityServer/Controllers/DirectorController.cs
Daniel Elliott 3970ecd9a3 Add Asset Download System with CDN Support
ASSET CONTENT DELIVERY:
+ ContentController.cs
  - Serves game assets (cars, tracks, textures, audio)
  - Downloads from EA CDN (while available)
  - Caches for offline serving
  - Manifest endpoint for asset lists
  - Health check endpoint

FEATURES:
- Asset manifest (/synergy/content/manifest)
- Download assets (/synergy/content/download/{type}/{id})
- Asset metadata (/synergy/content/info/{type}/{id})
- List by type (/synergy/content/list/{type})
- Status checking (HEAD requests)
- MD5 checksums for integrity
- Automatic directory structure

STORAGE:
+ Assets/ directory with structure:
  - cars/
  - tracks/
  - textures/
  - audio/
+ README.md - Complete asset guide
+ .gitignore - Excludes .pak files (copyrighted)

DIRECTOR UPDATE:
* DirectorController.cs
  - Added synergy.content URL
  - Game will request assets from community server

DOCUMENTATION:
+ Assets/README.md
  - How to extract assets
  - Legal guidelines (preservation only)
  - Testing instructions
  - Asset formats and naming

PURPOSE:
Game preservation after EA shutdown.
Users extract assets they own, server hosts them.
Post-shutdown: Full offline gameplay possible.

LEGAL:
- For preservation of owned content only
- Do not distribute EA's copyrighted assets
- Private server use

This enables complete game functionality
independent of EA's servers! 🎮

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-17 22:46:12 -08:00

53 lines
1.7 KiB
C#

using Microsoft.AspNetCore.Mvc;
using RR3CommunityServer.Models;
namespace RR3CommunityServer.Controllers;
[ApiController]
[Route("director/api/android")]
public class DirectorController : ControllerBase
{
private readonly ILogger<DirectorController> _logger;
private readonly IConfiguration _configuration;
public DirectorController(ILogger<DirectorController> logger, IConfiguration configuration)
{
_logger = logger;
_configuration = configuration;
}
[HttpGet("getDirectionByPackage")]
public ActionResult<SynergyResponse<DirectorResponse>> GetDirection([FromQuery] string packageName)
{
_logger.LogInformation("Director request for package: {Package}", packageName);
var baseUrl = $"{Request.Scheme}://{Request.Host}";
var response = new SynergyResponse<DirectorResponse>
{
resultCode = 0,
message = "Success",
data = new DirectorResponse
{
serverUrls = new Dictionary<string, string>
{
{ "synergy.product", baseUrl },
{ "synergy.drm", baseUrl },
{ "synergy.user", baseUrl },
{ "synergy.tracking", baseUrl },
{ "synergy.rewards", baseUrl },
{ "synergy.progression", baseUrl },
{ "synergy.content", baseUrl }, // Asset downloads
{ "synergy.s2s", baseUrl },
{ "nexus.portal", baseUrl },
{ "ens.url", baseUrl }
},
environment = "COMMUNITY",
version = "1.0.0"
}
};
return Ok(response);
}
}