Identified what's needed to host actual game content: - Car database (200+ vehicles with stats) - Track database (40+ circuits with layouts) - Events database (career mode, time trials) - Asset files (2-4 GB of .pak files) - Multiplayer configuration - Catalog/shop items Plan includes: ✅ Infrastructure ready (96 endpoints, 36 tables) ❌ Content data extraction needed ❌ Database seeding required ❌ Asset file hosting setup ❌ APK integration testing Documented extraction methods, storage requirements, and phased approach. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
14 KiB
Game Content Hosting - Implementation Plan
Date: February 25, 2026
Status: 🟡 INFRASTRUCTURE READY - NEEDS CONTENT
📊 Current Status
✅ What We Have (Infrastructure)
- ✅ 96 API endpoints implemented
- ✅ 36 database tables created
- ✅ AssetsController for serving files
- ✅ Asset directory structure (E:\rr3\RR3CommunityServer\RR3CommunityServer\Assets)
- ✅ Database entities for cars, tracks, events, leaderboards
- ✅ Multiplayer/social system ready
- ✅ Server routing configured
❌ What We Need (Content Data)
- ❌ Car database (definitions, stats, prices)
- ❌ Track database (layouts, AI data)
- ❌ Event database (championships, time trials)
- ❌ Asset files (.pak files for 3D models, textures)
- ❌ Initial leaderboard data
- ❌ Server configuration values
- ❌ Catalog/shop items
🎯 Game Content Categories
1. Cars Database 🏎️
What's Needed:
- Car definitions (make, model, class, stats)
- Performance specs (power, weight, handling)
- Upgrade tiers and costs
- Purchase prices (in-game currency)
- Unlock requirements
Database Tables:
Cars- Base car definitionsCatalogItems- Shop listingsOwnedCars- Player-owned cars (per user)CarUpgrades- Applied upgrades (per user)
Example Data Structure:
public class Car {
public int Id { get; set; }
public string Make { get; set; } // "Nissan"
public string Model { get; set; } // "Silvia Spec-R"
public string Class { get; set; } // "C"
public int BasePower { get; set; } // 250 HP
public int BaseWeight { get; set; } // 1240 kg
public int BasePrice { get; set; } // 50000 R$
public string AssetPath { get; set; } // "/cars/nissan_silvia_s15.pak"
}
Where to Get Data:
- 📱 Extract from APK:
/assets/data/cars.jsonor similar - 🌐 Scrape from RR3 wikis/databases
- 📊 Reverse engineer from game files
- 🔍 Network traffic analysis from official servers (before shutdown)
2. Tracks Database 🏁
What's Needed:
- Track definitions (name, location, length)
- Layout variants (GP, National, Indy)
- Sector times for AI
- Weather conditions
- Track limits data
Database Tables:
GameAssets(filtered by Category='tracks')- Custom
Trackstable (optional)
Example Data:
public class Track {
public int Id { get; set; }
public string Name { get; set; } // "Silverstone"
public string Layout { get; set; } // "GP"
public string Country { get; set; } // "UK"
public float LengthKm { get; set; } // 5.891
public int Corners { get; set; } // 18
public string AssetPath { get; set; } // "/tracks/silverstone_gp.pak"
}
3. Events Database 🏆
What's Needed:
- Event definitions (career mode, specials)
- Requirements (car class, PR level)
- Rewards (currency, cars, unlocks)
- AI difficulty settings
- Time-limited events
Database Tables:
EventsEventCompletions(per user)EventAttempts(per user)
Example Data:
public class Event {
public int Id { get; set; }
public string Name { get; set; } // "American Muscle Cup"
public string Type { get; set; } // "championship"
public string RequiredClass { get; set; } // "B"
public int RequiredPR { get; set; } // 50
public int RewardGold { get; set; } // 50
public int RewardCash { get; set; } // 25000
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
}
4. Asset Files 📦
What's Needed:
- Car 3D models (.pak files)
- Track 3D models (.pak files)
- Texture packs
- Audio files (engine sounds)
- UI assets
File Structure:
Assets/
├── cars/
│ ├── nissan_silvia_s15.pak (10-20 MB)
│ ├── ford_focus_rs.pak
│ └── ...
├── tracks/
│ ├── silverstone_gp.pak (50-100 MB)
│ ├── laguna_seca.pak
│ └── ...
├── textures/
│ ├── ui_textures.pak (5-10 MB)
│ └── car_textures_pack1.pak
└── audio/
├── engine_sounds_pack1.pak (1-5 MB)
└── ambient_sounds.pak
Total Storage Estimate: 2-4 GB for full game content
How to Extract:
# From installed game
adb pull /data/data/com.ea.games.r3_row/files/ ./rr3-assets/
# From APK
apktool d realracing3.apk -o rr3-decompiled
cp rr3-decompiled/assets/*.pak ./Assets/
5. Time Trials / Leaderboards ⏱️
What's Needed:
- Active time trial definitions
- Target times (gold/silver/bronze)
- Initial leaderboard entries (for testing)
- Ghost data (optional)
Database Tables:
TimeTrialsTimeTrialResults(per user)LeaderboardEntriesPersonalRecords(per user)GhostData(optional multiplayer feature)
Example Data:
public class TimeTrial {
public int Id { get; set; }
public string Name { get; set; } // "Silverstone Sprint"
public int TrackId { get; set; } // FK to Track
public int CarClassId { get; set; } // "A"
public int GoldTime { get; set; } // 95000 ms
public int SilverTime { get; set; } // 98000 ms
public int BronzeTime { get; set; } // 102000 ms
public int RewardGold { get; set; } // 25
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
}
6. Multiplayer Data 🎮
What's Needed:
- Matchmaking rules (by class, PR)
- Race session configurations
- Default ghost data (for solo races)
- Competitive rating tiers
Database Tables:
MatchmakingQueues(active players)RaceSessions(lobbies)RaceParticipants(who's in each race)GhostData(recorded laps)CompetitiveRatings(ELO system)
Default Configuration:
{
"matchmakingRules": {
"maxPRDifference": 10,
"matchTimeout": 30,
"minPlayers": 2,
"maxPlayers": 8
},
"ratingTiers": [
{ "name": "Bronze", "minRating": 0, "maxRating": 1000 },
{ "name": "Silver", "minRating": 1000, "maxRating": 1500 },
{ "name": "Gold", "minRating": 1500, "maxRating": 2000 },
{ "name": "Platinum", "minRating": 2000, "maxRating": 999999 }
]
}
7. Shop/Catalog 🛒
What's Needed:
- Item catalog (cars, gold, VIP)
- Prices (real money or fake for community)
- Availability windows
- Special offers
Database Table:
CatalogItems
Example Data:
public class CatalogItem {
public int Id { get; set; }
public string Sku { get; set; } // "gold_500"
public string Name { get; set; } // "500 Gold"
public string Type { get; set; } // "currency"
public int Price { get; set; } // 0 (free for community)
public bool Available { get; set; } // true
}
🛠️ Implementation Steps
Phase 1: Extract Game Data (From APK/Game Files)
Tools Needed:
- apktool (APK decompilation)
- jadx (Java decompilation)
- QuickBMS (asset extraction)
- adb (device file access)
Commands:
# 1. Decompile APK
apktool d realracing3.apk -o rr3-decompiled
# 2. Extract assets
cd rr3-decompiled/assets
cp *.pak E:/rr3/RR3CommunityServer/RR3CommunityServer/Assets/
# 3. Find game data files
find . -name "*.json" -o -name "*.xml" -o -name "*.dat"
# 4. Parse data files into database format
# (Manual or script)
Phase 2: Create Database Seed Script
Create: E:\rr3\RR3CommunityServer\RR3CommunityServer\Data\SeedData.cs
public static class SeedData
{
public static void Initialize(RR3DbContext context)
{
// Seed cars
if (!context.Cars.Any())
{
context.Cars.AddRange(
new Car { Make = "Nissan", Model = "Silvia Spec-R", Class = "C", BasePower = 250, BaseWeight = 1240, BasePrice = 50000, AssetPath = "/cars/nissan_silvia_s15.pak" },
new Car { Make = "Ford", Model = "Focus RS", Class = "B", BasePower = 350, BaseWeight = 1524, BasePrice = 75000, AssetPath = "/cars/ford_focus_rs.pak" },
// ... more cars
);
}
// Seed tracks
if (!context.GameAssets.Any(a => a.Category == "tracks"))
{
context.GameAssets.AddRange(
new GameAsset { FileName = "silverstone_gp.pak", Category = "tracks", FileSize = 85000000, EaCdnPath = "/tracks/silverstone_gp.pak" },
new GameAsset { FileName = "laguna_seca.pak", Category = "tracks", FileSize = 72000000, EaCdnPath = "/tracks/laguna_seca.pak" },
// ... more tracks
);
}
// Seed events
if (!context.Events.Any())
{
context.Events.AddRange(
new Event { Name = "Rookie Cup", Type = "championship", RequiredClass = "D", RequiredPR = 10, RewardGold = 10, RewardCash = 5000, StartDate = DateTime.UtcNow, EndDate = DateTime.UtcNow.AddYears(10) },
// ... more events
);
}
// Seed time trials
if (!context.TimeTrials.Any())
{
context.TimeTrials.AddRange(
new TimeTrial { Name = "Silverstone Sprint", TrackName = "Silverstone GP", CarClass = "A", GoldTime = 95000, SilverTime = 98000, BronzeTime = 102000, RewardGold = 25, StartDate = DateTime.UtcNow, EndDate = DateTime.UtcNow.AddMonths(1) },
// ... more time trials
);
}
context.SaveChanges();
}
}
Call from Program.cs:
using (var scope = app.Services.CreateScope())
{
var db = scope.ServiceProvider.GetRequiredService<RR3DbContext>();
db.Database.EnsureCreated();
SeedData.Initialize(db); // <-- Add this
}
Phase 3: Populate Assets Directory
Manual Steps:
- Extract .pak files from game installation
- Copy to
Assets/subdirectories - Verify files are accessible
Automated Script (PowerShell):
# Copy assets from extracted game files
$source = "E:\rr3\phone-assets-full"
$dest = "E:\rr3\RR3CommunityServer\RR3CommunityServer\Assets"
# Cars
Copy-Item "$source\cars\*.pak" "$dest\cars\" -Force
# Tracks
Copy-Item "$source\tracks\*.pak" "$dest\tracks\" -Force
# Textures
Copy-Item "$source\textures\*.pak" "$dest\textures\" -Force
# Audio
Copy-Item "$source\audio\*.pak" "$dest\audio\" -Force
Write-Host "Assets copied successfully!"
Phase 4: Test Content Delivery
Test Endpoints:
# 1. Get asset manifest
curl http://localhost:5555/content/api/manifest
# 2. Download a car asset
curl http://localhost:5555/content/api/cars/nissan_silvia_s15.pak -o test.pak
# 3. Get car list
curl http://localhost:5555/synergy/progression/cars
# 4. Get active events
curl http://localhost:5555/synergy/events/active
# 5. Get time trials
curl http://localhost:5555/synergy/rewards/timetrials
Phase 5: APK Integration Test
Required:
- Modify APK to point to community server
- Install on device/emulator
- Launch game and monitor logs
- Verify assets download correctly
- Test gameplay (career, time trials, multiplayer)
Network Configuration:
# hosts file (Windows: C:\Windows\System32\drivers\etc\hosts)
127.0.0.1 firemonkeys-akamai-eac.eaprojects.com
127.0.0.1 cloudcellcdn-eaprojects.akamaized.net
Or update APK's Director URL to point directly to:
http://your-server-ip:5555/director/api/android/getDirectionByPackage
📝 TODO List
High Priority (Needed for Basic Gameplay)
- Extract car data from APK
- Seed Cars table with 20-30 common cars
- Extract track data from APK
- Seed Events table with career mode events
- Copy asset .pak files to Assets directory
- Create SeedData.cs script
- Test asset delivery
Medium Priority (Needed for Full Experience)
- Seed all 200+ cars
- Seed all tracks
- Create time trial definitions
- Populate catalog items
- Set up leaderboard defaults
- Configure multiplayer rules
Low Priority (Optional Enhancements)
- Community-created events
- Custom car mods
- Enhanced ghost data
- Dynamic events system
- CDN setup for assets
🚀 Quick Start (Minimal Viable Data)
To get the server working with minimal data:
- Extract 5 cars from APK (most popular)
- Extract 3 tracks (Silverstone, Laguna Seca, Brands Hatch)
- Create 1 event (test championship)
- Copy corresponding .pak files
- Seed database
- Test with APK
This gives you a playable demo to verify the infrastructure works before committing to extracting all 2-4 GB of content.
📊 Storage Requirements
| Content Type | Estimated Size | Priority |
|---|---|---|
| Car Assets (200+) | 2-3 GB | High |
| Track Assets (40+) | 1-2 GB | High |
| Texture Packs | 200-400 MB | Medium |
| Audio Files | 100-200 MB | Medium |
| UI Assets | 50-100 MB | Low |
| Total | ~4-6 GB | - |
Recommendation: Start with 10% of content (400-600 MB) for testing.
🎯 Next Actions
-
Locate game assets on your system
- Check:
E:\rr3\phone-assets-full\ - Check:
E:\rr3\rr3-assets\ - Check APK:
E:\rr3\realracing3.apk
- Check:
-
Extract game data files (cars, tracks, events)
- Use jadx to decompile APK
- Look for JSON/XML files in
/assets/ - Parse into database format
-
Create seed script
- Add
SeedData.cs - Call from
Program.cs - Test database population
- Add
-
Copy asset files
- Copy .pak files to
Assets/subdirectories - Test file serving via AssetsController
- Copy .pak files to
-
Test with APK
- Modify APK to use community server
- Install and launch game
- Verify content loads
Status: Infrastructure 100% ready, waiting for content data population.
Would you like me to start extracting game data from the files we have?