Create comprehensive game content hosting plan
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>
This commit is contained in:
514
GAME-CONTENT-HOSTING-PLAN.md
Normal file
514
GAME-CONTENT-HOSTING-PLAN.md
Normal file
@@ -0,0 +1,514 @@
|
||||
# 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 definitions
|
||||
- `CatalogItems` - Shop listings
|
||||
- `OwnedCars` - Player-owned cars (per user)
|
||||
- `CarUpgrades` - Applied upgrades (per user)
|
||||
|
||||
**Example Data Structure:**
|
||||
```csharp
|
||||
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.json` or 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 `Tracks` table (optional)
|
||||
|
||||
**Example Data:**
|
||||
```csharp
|
||||
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:**
|
||||
- `Events`
|
||||
- `EventCompletions` (per user)
|
||||
- `EventAttempts` (per user)
|
||||
|
||||
**Example Data:**
|
||||
```csharp
|
||||
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:**
|
||||
```bash
|
||||
# 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:**
|
||||
- `TimeTrials`
|
||||
- `TimeTrialResults` (per user)
|
||||
- `LeaderboardEntries`
|
||||
- `PersonalRecords` (per user)
|
||||
- `GhostData` (optional multiplayer feature)
|
||||
|
||||
**Example Data:**
|
||||
```csharp
|
||||
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:**
|
||||
```json
|
||||
{
|
||||
"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:**
|
||||
```csharp
|
||||
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:**
|
||||
```bash
|
||||
# 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`
|
||||
|
||||
```csharp
|
||||
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:**
|
||||
```csharp
|
||||
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:**
|
||||
1. Extract .pak files from game installation
|
||||
2. Copy to `Assets/` subdirectories
|
||||
3. Verify files are accessible
|
||||
|
||||
**Automated Script (PowerShell):**
|
||||
```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:**
|
||||
```bash
|
||||
# 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:**
|
||||
1. Modify APK to point to community server
|
||||
2. Install on device/emulator
|
||||
3. Launch game and monitor logs
|
||||
4. Verify assets download correctly
|
||||
5. 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:**
|
||||
|
||||
1. **Extract 5 cars from APK** (most popular)
|
||||
2. **Extract 3 tracks** (Silverstone, Laguna Seca, Brands Hatch)
|
||||
3. **Create 1 event** (test championship)
|
||||
4. **Copy corresponding .pak files**
|
||||
5. **Seed database**
|
||||
6. **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
|
||||
|
||||
1. **Locate game assets** on your system
|
||||
- Check: `E:\rr3\phone-assets-full\`
|
||||
- Check: `E:\rr3\rr3-assets\`
|
||||
- Check APK: `E:\rr3\realracing3.apk`
|
||||
|
||||
2. **Extract game data files** (cars, tracks, events)
|
||||
- Use jadx to decompile APK
|
||||
- Look for JSON/XML files in `/assets/`
|
||||
- Parse into database format
|
||||
|
||||
3. **Create seed script**
|
||||
- Add `SeedData.cs`
|
||||
- Call from `Program.cs`
|
||||
- Test database population
|
||||
|
||||
4. **Copy asset files**
|
||||
- Copy .pak files to `Assets/` subdirectories
|
||||
- Test file serving via AssetsController
|
||||
|
||||
5. **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?
|
||||
Reference in New Issue
Block a user