Remove documentation files - moved to main docs repo

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
2026-02-18 14:43:36 -08:00
parent 6451b45afa
commit cc210a65ea
25 changed files with 0 additions and 8206 deletions

View File

@@ -1,182 +0,0 @@
# 📱 ADB TRANSFER INSTRUCTIONS
**Transfer RR3 Assets from Phone to Your Windows PC, then to OVH Server**
---
## 🔧 STEP 1: Enable USB Debugging on Phone
1. **Settings → About Phone**
2. Tap "Build Number" 7 times (enables Developer Mode)
3. **Settings → Developer Options**
4. Enable **USB Debugging**
5. Connect phone to your Windows PC via USB
---
## 💻 STEP 2: Install ADB on Your Windows PC
### Option A: Download Minimal ADB
```
https://dl.google.com/android/repository/platform-tools-latest-windows.zip
```
- Extract to `C:\adb\`
- Add `C:\adb\platform-tools` to PATH (optional)
### Option B: Use Existing Android SDK
- If you have Android Studio, ADB is in:
- `C:\Users\YourName\AppData\Local\Android\Sdk\platform-tools\`
---
## 📥 STEP 3: Pull Assets from Phone (Run on YOUR Windows PC)
### Open Command Prompt or PowerShell on YOUR PC:
```powershell
# Navigate to ADB folder (adjust path if different)
cd C:\adb\platform-tools
# Check if phone is connected
adb devices
# Should show: List of devices attached
# XXXXXXXX device
```
**If you see "unauthorized":**
- Check your phone screen
- Tap "Allow USB Debugging"
- Check "Always allow from this computer"
---
### Pull the RR3 Assets:
```powershell
# Pull entire RR3 data folder (1.44 GB)
adb pull /sdcard/Android/data/com.ea.games.r3_row/files/ "C:\RR3-Assets\"
# This will take 5-10 minutes depending on USB speed
# Watch the progress: [100%] /sdcard/Android/data/...
```
**Alternative paths if first doesn't work:**
```powershell
# Try OBB folder
adb pull /sdcard/Android/obb/com.ea.games.r3_row/ "C:\RR3-Assets-OBB\"
# Try alternative data location
adb pull /data/data/com.ea.games.r3_row/files/ "C:\RR3-Assets-Data\"
```
---
## 📤 STEP 4: Transfer to OVH Server
### Option A: Direct RDP File Transfer
1. In your RDP session (connected to OVH server)
2. Open File Explorer on local PC
3. Copy `C:\RR3-Assets\` folder
4. Paste into RDP window at: `E:\rr3\phone-assets-full\`
### Option B: Upload to Google Drive (You Already Use This)
```powershell
# Compress first to speed up upload
Compress-Archive -Path "C:\RR3-Assets\*" -DestinationPath "C:\RR3-Assets-Full.zip"
# Upload to Google Drive manually
# Then on OVH server, download from: G:\My Drive\RR3-Assets-Full.zip
```
### Option C: Network Share (if on same network)
- Share `C:\RR3-Assets\` on your PC
- Map network drive on OVH server
- Copy directly
---
## 🎯 QUICK REFERENCE COMMANDS (Run on YOUR PC):
```powershell
# 1. Check connection
adb devices
# 2. List what's on phone (verify path exists)
adb shell ls /sdcard/Android/data/com.ea.games.r3_row/files/
# 3. Check total size before pulling
adb shell du -sh /sdcard/Android/data/com.ea.games.r3_row/files/
# 4. Pull everything
adb pull /sdcard/Android/data/com.ea.games.r3_row/files/ "C:\RR3-Assets\"
# 5. Verify what you got
dir C:\RR3-Assets /s
```
---
## ⚠️ TROUBLESHOOTING:
**"adb: command not found"**
- Use full path: `C:\adb\platform-tools\adb.exe devices`
**"device unauthorized"**
- Check phone screen for popup
- Revoke USB debugging authorizations and try again
- Settings → Developer Options → Revoke USB debugging authorizations
**"adb: error: failed to stat remote object"**
- Path doesn't exist on phone
- Try alternative paths listed above
- Or use: `adb shell ls /sdcard/Android/data/` to see what's there
**"adb: device offline"**
- Unplug and replug USB cable
- Run: `adb kill-server` then `adb start-server`
**Transfer is slow:**
- Use USB 3.0 port if available
- Close other apps on phone
- Disable phone screen lock during transfer
---
## 📊 EXPECTED RESULT:
```
After successful pull:
C:\RR3-Assets\
├── pak files (car/track models)
├── pka files (asset archives)
├── z files (textures)
├── audio files
├── manifest files
└── config files
Total: ~1.4 GB
Files: Thousands
```
---
## 🏁 NEXT STEPS AFTER TRANSFER:
1. Verify file count and size
2. Transfer to OVH server: `E:\rr3\phone-assets-full\`
3. Analyze asset structure
4. Extract and catalog all assets
5. Map to CDN URLs
6. Archive for preservation
---
**START HERE:**
1. Enable USB debugging on phone
2. Download ADB: https://dl.google.com/android/repository/platform-tools-latest-windows.zip
3. Extract to C:\adb\
4. Connect phone via USB
5. Run: `C:\adb\platform-tools\adb.exe devices`
**Then tell me what you see!** 📱💾

View File

@@ -1,315 +0,0 @@
# 🔧 RR3 APK DECOMPILATION METHOD
**For Discord User Asking About APK Decompilation**
---
## 📋 QUESTIONS ANSWERED
### A) "jadx to convert it to what?"
**Answer:** JADX converts DEX bytecode → **Java source code (.java files)**
### B) "How did you circumvent apktool corrupting textures?"
**Answer:** **I didn't use apktool for textures. I used JADX only, which doesn't reprocess resources.**
---
## 🛠️ THE METHOD I USED
### Tool: JADX (NOT apktool)
- **Download:** https://github.com/skylot/jadx/releases
- **Version:** Latest release (jadx-1.5.0 or newer)
- **Type:** GUI or CLI
### What JADX Does:
```
Input: realracing3.apk (100 MB)
└── classes.dex (DEX bytecode)
Output: decompiled/
├── sources/ (Java .java files)
│ └── com/ea/... (Readable source code)
└── resources/ (Extracted AS-IS)
├── AndroidManifest.xml
├── res/ (Resources)
└── assets/ (Game assets)
```
### Why JADX Doesn't Corrupt Textures:
1. **JADX only decompiles CODE** (DEX → Java)
2. **Resources are extracted, not converted**
3. **No reprocessing/recompression** of images
4. **Files stay in original format**
---
## ⚠️ WHY APKTOOL CORRUPTS TEXTURES
### The Problem with apktool:
```
apktool tries to:
├── Decode resources.arsc
├── Decompile XML files
├── Extract PNG/9-patch images
└── Reprocess drawable resources ❌
Result: Textures get corrupted during:
├── PNG recompression
├── 9-patch processing
└── Resource table rebuilding
```
### When apktool is useful:
- Modifying AndroidManifest.xml
- Changing app resources (icons, strings)
- Rebuilding APK after modifications
- **NOT for preserving original assets!**
---
## ✅ RECOMMENDED APPROACH FOR RR3
### For Source Code Analysis:
```bash
# Use JADX (GUI or CLI)
jadx realracing3.apk -d decompiled/
# Result: Clean Java source code
# No corruption, just decompiled code
```
### For Asset Extraction:
```bash
# Option 1: Unzip APK directly (APK = ZIP file)
unzip realracing3.apk -d extracted/
# Option 2: Use JADX to extract resources
jadx realracing3.apk --export-gradle
# Option 3: Manual extraction from phone (what we did!)
adb pull /sdcard/Android/data/com.ea.games.r3_row/files/
```
### For Texture Preservation:
**DON'T USE:** apktool (corrupts textures)
**DO USE:**
- Direct APK extraction (unzip)
- JADX resource extraction
- ADB pull from phone (gets runtime assets)
---
## 📦 COMPLETE WORKFLOW
### Step 1: Get the APK
```bash
# From phone
adb pull /system/app/RealRacing3/base.apk
# Or from installed apps
adb shell pm path com.ea.games.r3_row
adb pull /data/app/com.ea.games.r3_row-[hash]/base.apk
# Or download from APKMirror/APKPure
```
### Step 2: Decompile Code with JADX
```bash
# GUI method (recommended for beginners)
1. Download JADX from: https://github.com/skylot/jadx/releases
2. Run jadx-gui.exe (Windows) or jadx-gui.sh (Linux)
3. File → Open → Select realracing3.apk
4. Wait for decompilation (2-5 minutes)
5. Browse source code in GUI
6. File → Save All → Choose output folder
# CLI method (for automation)
jadx realracing3.apk -d decompiled/
```
### Step 3: Extract Resources WITHOUT Corruption
```bash
# Method A: JADX extraction (safe)
jadx realracing3.apk --export-gradle -d output/
# Method B: Direct unzip (safest for textures)
unzip realracing3.apk -d apk-contents/
# Method C: 7-Zip (Windows)
7z x realracing3.apk -oapk-contents/
```
### Step 4: Get Runtime Assets from Phone
```bash
# This gets assets downloaded from EA CDN
adb pull /sdcard/Android/data/com.ea.games.r3_row/files/ phone-assets/
# Also check OBB files
adb pull /sdcard/Android/obb/com.ea.games.r3_row/ obb-assets/
```
---
## 🎯 WHAT YOU GET FROM EACH METHOD
### JADX Output:
```
decompiled/
├── sources/
│ └── com/ea/nimble/ (Network code)
│ └── com/firemonkeys/ (Game logic)
│ └── com/ea/games/r3/ (RR3 specific)
└── resources/
├── AndroidManifest.xml (App config)
├── res/ (App resources)
│ ├── drawable/ (Icons, UI)
│ ├── layout/ (UI layouts)
│ └── values/ (Strings, configs)
└── assets/ (Base game assets)
```
### APK Direct Extraction (unzip):
```
apk-contents/
├── AndroidManifest.xml (Binary XML)
├── classes.dex (Bytecode)
├── res/ (Resources - intact!)
│ ├── drawable/ (PNG files - NOT corrupted)
│ └── layout/ (Binary XML)
├── assets/ (Game base assets)
│ └── (whatever APK contains)
├── lib/ (Native libraries)
│ ├── armeabi-v7a/
│ └── arm64-v8a/
└── META-INF/ (Signatures)
```
### Phone Asset Pull (ADB):
```
phone-assets/
├── pak files (3D models)
├── pka files (Archives)
├── z files (Compressed textures)
├── audio/ (Sound files)
└── data/ (Game data)
Size: 1.44 GB (full game content)
```
---
## 💡 TELL YOUR DISCORD FRIEND
### Quick Answer:
```
Q: How did you decompile without corruption?
A: I used JADX, not apktool.
JADX = Decompiles code only, extracts resources AS-IS
apktool = Tries to decode/rebuild everything (corrupts textures)
For RR3:
1. Use JADX for source code
2. Use unzip/7-zip for APK resources
3. Use ADB to pull runtime assets from phone (best quality)
DO NOT use apktool if you want intact textures!
```
### Detailed Answer:
```
The "res.zip" I extracted came from:
1. Install RR3 on phone
2. Let it download assets from EA CDN (1.44 GB)
3. ADB pull from phone storage
4. These are the ACTUAL game assets, not APK resources
For source code analysis:
1. Use JADX to decompile DEX → Java
2. No corruption, clean code output
3. Resources extracted as-is (no reprocessing)
apktool is NOT needed for RR3 preservation!
```
---
## 🔗 TOOLS & LINKS
### JADX (Recommended)
- **GitHub:** https://github.com/skylot/jadx
- **Releases:** https://github.com/skylot/jadx/releases/latest
- **Download:** jadx-1.5.0.zip (Windows/Linux/Mac)
- **GUI:** jadx-gui.exe / jadx-gui.sh
- **CLI:** jadx.bat / jadx.sh
### Alternative Tools
- **APKTool:** https://apktool.org/ (use only for rebuilding, NOT preservation)
- **7-Zip:** https://www.7-zip.org/ (for direct APK extraction)
- **ADB:** https://developer.android.com/tools/adb (for phone asset pull)
### APK Sources
- **APKMirror:** https://www.apkmirror.com/
- **APKPure:** https://apkpure.com/
- **Your own device:** `adb pull` from phone
---
## 📊 COMPARISON TABLE
| Method | Source Code | Resources | Texture Quality | Use Case |
|--------|-------------|-----------|-----------------|----------|
| **JADX** | ✅ Clean Java | ✅ Intact | ✅ Perfect | Analysis |
| **apktool** | ❌ Smali only | ⚠️ Decoded | ❌ Corrupted | Modding |
| **unzip/7-zip** | ❌ Bytecode | ✅ Binary | ✅ Perfect | Extraction |
| **ADB pull** | ❌ N/A | ✅ Runtime | ✅ Perfect | Preservation |
---
## ✅ MY FINAL WORKFLOW FOR RR3
```
1. Decompile with JADX:
jadx realracing3.apk -d E:\rr3\decompiled\
2. Extract APK resources:
unzip realracing3.apk -d E:\rr3\apk-contents\
3. Pull runtime assets from phone:
adb pull /sdcard/Android/data/com.ea.games.r3_row/files/ E:\rr3\phone-assets-full\
4. Analyze source code:
- Read decompiled Java in E:\rr3\decompiled\sources\
- Find network endpoints in com/ea/nimble/
- Map API calls to server implementation
5. Preserve assets:
- Use phone-pulled assets (best quality)
- Extract .z files with custom tools
- Archive everything for preservation
```
**Result: No corruption, complete preservation, full source access**
---
## 🚨 TL;DR FOR DISCORD
**Tell them:**
> "I used **JADX** (not apktool) to decompile the APK. JADX only decompiles the code (DEX → Java) and extracts resources without reprocessing them, so nothing gets corrupted.
>
> For the actual game assets (textures, models, audio), I pulled them directly from my phone using ADB after letting the game download everything from EA's CDN. That's 1.44 GB of pristine assets.
>
> **Don't use apktool for RR3** - it tries to decode and rebuild resources, which corrupts textures. Use JADX for code analysis and ADB for asset preservation.
>
> Tools:
> - JADX: https://github.com/skylot/jadx/releases
> - ADB: Part of Android SDK platform-tools
>
> Method: `jadx realracing3.apk -d output/` - done!"
---
**This is the RIGHT way to preserve RR3 without corruption.** 🏁✨

View File

@@ -1,527 +0,0 @@
# Real Racing 3 APK Modification Guide - Community Server Support
## 🎯 Overview
This guide shows how to modify the Real Racing 3 APK to support **community server URLs** without breaking the original game. The game already has built-in support for custom servers through its configuration system!
---
## ✨ Good News!
The app **already supports custom server URLs** via its configuration system! We just need to:
1. Change the configuration from `"live"` to `"custom"`
2. Add a meta-data entry with your community server URL
3. Repackage and re-sign the APK
**No code changes needed!** Just AndroidManifest.xml modifications.
---
## 📋 Prerequisites
### Tools Required
1. **APKTool** - For decompiling/recompiling APKs
2. **Uber APK Signer** - For signing the modified APK
3. **Java JDK 8+** - Required by APKTool
### Installation
**Windows:**
```bash
# Install Chocolatey (if not installed)
Set-ExecutionPolicy Bypass -Scope Process -Force
iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
# Install Java
choco install openjdk11
# Download APKTool
# https://ibotpeaches.github.io/Apktool/
# Place apktool.bat and apktool.jar in C:\Windows\
# Download Uber APK Signer
# https://github.com/patrickfav/uber-apk-signer/releases
```
**Linux/macOS:**
```bash
# Install Java
sudo apt install openjdk-11-jdk # Ubuntu/Debian
brew install openjdk@11 # macOS
# Install APKTool
brew install apktool # macOS
sudo apt install apktool # Ubuntu/Debian
# Download Uber APK Signer
wget https://github.com/patrickfav/uber-apk-signer/releases/download/v1.3.0/uber-apk-signer-1.3.0.jar
```
---
## 🔧 Method 1: Simple Configuration Change (Recommended)
This method uses the game's **built-in custom server support**.
### Step 1: Decompile the APK
```bash
# Navigate to APK location
cd E:\rr3
# Decompile
apktool d realracing3.apk -o rr3-modded
```
### Step 2: Edit AndroidManifest.xml
Open `rr3-modded\AndroidManifest.xml` and find this section (around line 225):
**BEFORE:**
```xml
<meta-data
android:name="com.ea.nimble.configuration"
android:value="live"/>
```
**AFTER:**
```xml
<meta-data
android:name="com.ea.nimble.configuration"
android:value="custom"/>
<meta-data
android:name="NimbleCustomizedSynergyServerEndpointUrl"
android:value="https://your-server.com"/>
```
**Replace `https://your-server.com` with your actual community server URL!**
### Step 3: Recompile the APK
```bash
apktool b rr3-modded -o realracing3-community.apk
```
### Step 4: Sign the APK
```bash
# Using Uber APK Signer
java -jar uber-apk-signer.jar --apks realracing3-community.apk
# Or using jarsigner (manual)
keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-key-alias
jarsigner -verbose -sigalg SHA256withRSA -digestalg SHA-256 -keystore my-release-key.jks realracing3-community.apk my-key-alias
```
### Step 5: Install on Device
```bash
# Uninstall original (if installed)
adb uninstall com.ea.games.r3_row
# Install modified APK
adb install realracing3-community-signed.apk
```
**Done!** The game will now connect to your community server.
---
## 🔧 Method 2: Dynamic Server Switching (Advanced)
This creates **two separate APK versions** - one for official servers, one for community servers.
### Create Community APK
1. Follow Method 1 steps 1-4
2. Rename the output: `realracing3-community.apk`
### Create Official APK (Unmodified)
1. Keep original `realracing3.apk`
2. Re-sign it with the same certificate:
```bash
java -jar uber-apk-signer.jar --apks realracing3.apk
```
### Usage
- **Official servers**: Install `realracing3.apk`
- **Community servers**: Install `realracing3-community.apk`
Switch by uninstalling one and installing the other.
---
## 🔧 Method 3: Shared Preferences Override (Requires Root)
For advanced users with rooted devices - override server URL at runtime.
### Create Override Script
```bash
# Create override script
cat > /data/data/com.ea.games.r3_row/shared_prefs/rr3_community.xml << 'EOF'
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="community_server_url">https://your-server.com</string>
<boolean name="use_community_server" value="true" />
</map>
EOF
# Set permissions
chmod 660 /data/data/com.ea.games.r3_row/shared_prefs/rr3_community.xml
chown u0_a123:u0_a123 /data/data/com.ea.games.r3_row/shared_prefs/rr3_community.xml
```
### Modify Java Code to Read Preferences
This requires smali editing - see Advanced section below.
---
## 🛠️ Advanced: Add In-Game Server Switcher
For maximum flexibility, add a settings UI to switch servers in-game.
### Step 1: Create Settings Activity
Create `rr3-modded/smali/com/firemint/realracing/CommunityServerSettings.smali`:
```smali
.class public Lcom/firemint/realracing/CommunityServerSettings;
.super Landroid/app/Activity;
.method protected onCreate(Landroid/os/Bundle;)V
.locals 2
# Show simple dialog with server URL input
# Implementation details omitted for brevity
return-void
.end method
```
### Step 2: Add Settings Button
This is complex and requires understanding of the game's UI structure. Alternative: use external app.
---
## 📱 Automated Solution: Community Server Manager App
The easiest approach for users: Create a separate **Community Server Manager** app.
### Create Android App
```kotlin
// MainActivity.kt
class ServerManagerActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val serverUrlInput = findViewById<EditText>(R.id.serverUrl)
val applyButton = findViewById<Button>(R.id.applyButton)
applyButton.setOnClickListener {
val serverUrl = serverUrlInput.text.toString()
modifyRR3APK(serverUrl)
}
}
private fun modifyRR3APK(serverUrl: String) {
// Extract RR3 APK
val pm = packageManager
val appInfo = pm.getApplicationInfo("com.ea.games.r3_row", 0)
val apkPath = appInfo.sourceDir
// Decompile, modify, recompile, sign
// (Requires APKTool library integration)
// Prompt user to install
installAPK(modifiedApkPath)
}
}
```
**This gives users a simple UI to enter server URLs without manual APK editing.**
---
## 🔒 Security Considerations
### Certificate Pinning
Real Racing 3 may have SSL certificate pinning. If connections fail:
1. **Disable Certificate Verification** (modify CloudcellTrustManager.java):
```java
// Change checkServerTrusted to do nothing
public void checkServerTrusted(X509Certificate[] chain, String authType) {
// Commented out validation
// Original validation code...
}
```
2. **Install Custom CA Certificate** on device:
```bash
# Push certificate to device
adb push my-ca-cert.crt /sdcard/
# Install via Settings > Security > Install from SD card
```
3. **Use mitmproxy** to intercept and re-sign traffic
---
## 📋 Complete Automated Script
Here's a complete PowerShell script to automate the entire process:
```powershell
# RR3-Community-Mod.ps1
param(
[Parameter(Mandatory=$true)]
[string]$ServerUrl,
[string]$ApkPath = "realracing3.apk",
[string]$OutputPath = "realracing3-community.apk"
)
Write-Host "🏎️ Real Racing 3 Community Server Modifier" -ForegroundColor Cyan
Write-Host "================================================" -ForegroundColor Cyan
# Step 1: Decompile
Write-Host "`n[1/4] Decompiling APK..." -ForegroundColor Yellow
apktool d $ApkPath -o rr3-modded -f
# Step 2: Modify AndroidManifest.xml
Write-Host "[2/4] Modifying configuration..." -ForegroundColor Yellow
$manifestPath = "rr3-modded\AndroidManifest.xml"
$manifest = Get-Content $manifestPath -Raw
# Change configuration to 'custom'
$manifest = $manifest -replace 'android:value="live"/>', 'android:value="custom"/>'
# Add custom server URL
$customServerMeta = @"
<meta-data
android:name="NimbleCustomizedSynergyServerEndpointUrl"
android:value="$ServerUrl"/>
"@
$manifest = $manifest -replace '(<meta-data\s+android:name="com.ea.nimble.configuration"[^>]*/>)', "`$1`n$customServerMeta"
Set-Content -Path $manifestPath -Value $manifest
# Step 3: Recompile
Write-Host "[3/4] Recompiling APK..." -ForegroundColor Yellow
apktool b rr3-modded -o $OutputPath
# Step 4: Sign
Write-Host "[4/4] Signing APK..." -ForegroundColor Yellow
java -jar uber-apk-signer.jar --apks $OutputPath
Write-Host "`n✅ Done! Modified APK: $OutputPath" -ForegroundColor Green
Write-Host "📱 Install with: adb install $OutputPath" -ForegroundColor Green
```
**Usage:**
```powershell
.\RR3-Community-Mod.ps1 -ServerUrl "https://your-server.com" -ApkPath "realracing3.apk"
```
---
## 🧪 Testing the Modified APK
### Verify Server URL
```bash
# Extract and check AndroidManifest.xml
unzip -p realracing3-community.apk AndroidManifest.xml | xmllint --format -
# Look for:
# <meta-data android:name="NimbleCustomizedSynergyServerEndpointUrl"
# android:value="https://your-server.com"/>
```
### Monitor Network Traffic
```bash
# Use adb logcat to see connection attempts
adb logcat | grep -i "synergy\|nimble\|director"
# Expected output:
# SynergyEnv: Using custom configuration
# SynergyEnv: Director URL = https://your-server.com
```
### Test Connection
```bash
# Check if app connects to your server
# Monitor server logs for incoming requests
# Expected request:
# GET /director/api/android/getDirectionByPackage?packageName=com.ea.games.r3_row
```
---
## 📦 Distribution
### Option 1: Distribute Modified APK
**Pros:**
- Users just install the APK
- No technical knowledge required
**Cons:**
- Different signature than official app
- Users must uninstall official version first
- Updates require re-distribution
### Option 2: Distribute Patch File
Create a patch file users apply:
```bash
# Create patch
diff -u original/AndroidManifest.xml modified/AndroidManifest.xml > community-server.patch
# Users apply patch
patch rr3-modded/AndroidManifest.xml < community-server.patch
```
### Option 3: Server Manager App
Best option - create a companion app that:
1. Detects installed RR3 APK
2. Extracts it
3. Applies modifications
4. Re-signs
5. Prompts installation
Users just enter server URL in the app!
---
## 🔄 Switching Back to Official Servers
### Method 1: Reinstall Official APK
```bash
adb uninstall com.ea.games.r3_row
adb install realracing3-original.apk
```
### Method 2: Keep Both Versions
Modify package name to run both side-by-side:
```xml
<!-- In AndroidManifest.xml -->
<manifest package="com.ea.games.r3_row.community" ...>
```
Now you can have:
- `com.ea.games.r3_row` - Official
- `com.ea.games.r3_row.community` - Community
**⚠️ Note:** Requires changing package references throughout the codebase (complex).
---
## 📝 Configuration Examples
### Local Server (LAN)
```xml
<meta-data
android:name="NimbleCustomizedSynergyServerEndpointUrl"
android:value="http://192.168.1.100:5001"/>
```
### Remote Server (Internet)
```xml
<meta-data
android:name="NimbleCustomizedSynergyServerEndpointUrl"
android:value="https://rr3.community-server.net"/>
```
### Localhost (Android Emulator)
```xml
<meta-data
android:name="NimbleCustomizedSynergyServerEndpointUrl"
android:value="http://10.0.2.2:5001"/>
```
*(10.0.2.2 is the special IP for host machine from emulator)*
---
## 🐛 Troubleshooting
### Issue: APK Won't Install
**Solution:**
- Uninstall official version first: `adb uninstall com.ea.games.r3_row`
- Check signature: Different signatures can't overwrite
### Issue: App Crashes on Launch
**Solution:**
- Check APKTool version: `apktool --version` (should be 2.7.0+)
- Recompile with: `apktool b -f rr3-modded`
### Issue: Still Connects to Official Servers
**Solution:**
- Verify manifest changes: `unzip -p apk AndroidManifest.xml`
- Check logcat for configuration being read
- Ensure configuration is set to `"custom"`
### Issue: SSL Certificate Error
**Solution:**
- Install custom CA cert on device
- Or disable certificate validation (see Security section)
---
## ✅ Verification Checklist
- [ ] APKTool installed and working
- [ ] Original APK decompiled successfully
- [ ] AndroidManifest.xml modified correctly
- [ ] Configuration changed to `"custom"`
- [ ] Custom server URL added
- [ ] APK recompiled without errors
- [ ] APK signed successfully
- [ ] Signature verification passed
- [ ] APK installed on device
- [ ] App launches without crashes
- [ ] Logcat shows custom server URL
- [ ] Server receives connection requests
---
## 🎉 Success!
You now have three ways to enable community servers:
1. **Method 1 (Simple)**: Modify AndroidManifest.xml - best for most users
2. **Method 2 (Flexible)**: Create separate APKs for switching
3. **Method 3 (Advanced)**: Build a companion manager app
**Recommended:** Use Method 1 + automated script for easy distribution.
---
## 📚 References
- **APKTool Documentation**: https://ibotpeaches.github.io/Apktool/
- **Uber APK Signer**: https://github.com/patrickfav/uber-apk-signer
- **Android Manifest Reference**: https://developer.android.com/guide/topics/manifest/manifest-intro
---
*Created: February 2026*
*Real Racing 3 Community Server Project*

View File

@@ -1,471 +0,0 @@
# Real Racing 3 Community Server - Complete APK Modification Solution
## 🎯 Overview
**GREAT NEWS!** Real Racing 3 **already has built-in support** for custom servers! No complex code modifications needed - just a simple configuration change in the AndroidManifest.xml.
---
## ✨ What's Included
### 1. **Comprehensive Modification Guide**
📄 **APK_MODIFICATION_GUIDE.md** (14,000+ words)
- Three different modification methods
- Step-by-step instructions
- Troubleshooting guide
- Security considerations
- Distribution strategies
### 2. **Automated PowerShell Script**
📜 **RR3-Community-Mod.ps1**
- One-command APK modification
- Automatic decompile/recompile/sign
- ADB installation support
- User-friendly interface with color output
- Error handling and validation
### 3. **Server Implementation**
📂 **RR3CommunityServer/** (.NET 8)
- Fully functional community server
- Cross-platform (Windows/Linux/macOS)
- 12 API endpoints
- Database persistence
- Production-ready
---
## 🚀 Quick Start
### For Users (Simple)
**1. Run the automated script:**
```powershell
cd E:\rr3
.\RR3-Community-Mod.ps1 -ServerUrl "https://localhost:5001" -ApkPath "realracing3.apk"
```
**2. Install on device:**
```bash
adb uninstall com.ea.games.r3_row
adb install realracing3-community.apk
```
**3. Done!** Game connects to your community server.
---
## 🔍 How It Works
### Built-in Configuration System
Real Racing 3 uses EA's Nimble SDK which has these configuration modes:
| Mode | Purpose | Server URL |
|------|---------|------------|
| **LIVE** | Production (default) | `https://syn-dir.sn.eamobile.com` |
| **STAGE** | Testing/staging | `https://director-stage.sn.eamobile.com` |
| **INTEGRATION** | Development | `https://director-int.sn.eamobile.com` |
| **CUSTOM** | **Community servers** | User-defined URL |
### Configuration Location
**AndroidManifest.xml:**
```xml
<!-- Change this line -->
<meta-data
android:name="com.ea.nimble.configuration"
android:value="live"/>
<!-- To this -->
<meta-data
android:name="com.ea.nimble.configuration"
android:value="custom"/>
<!-- And add this -->
<meta-data
android:name="NimbleCustomizedSynergyServerEndpointUrl"
android:value="https://your-server.com"/>
```
### Code Reference
**SynergyEnvironmentImpl.java (Line 166-183):**
```java
public String getSynergyDirectorServerUrl(NimbleConfiguration config) {
switch (config) {
case INTEGRATION:
return SYNERGY_INT_SERVER_URL;
case STAGE:
return SYNERGY_STAGE_SERVER_URL;
case LIVE:
return SYNERGY_LIVE_SERVER_URL;
case CUSTOMIZED:
// 🎯 This is what we use!
return NimbleApplicationConfiguration.getConfigValueAsString(
"NimbleCustomizedSynergyServerEndpointUrl",
SYNERGY_LIVE_SERVER_URL
);
default:
return SYNERGY_LIVE_SERVER_URL;
}
}
```
---
## 📋 Prerequisites
### Required Tools
1. **APKTool** - APK decompile/recompile
2. **Java JDK 8+** - Required by APKTool
3. **Uber APK Signer** (optional but recommended) - APK signing
### Installation
**Windows (PowerShell as Admin):**
```powershell
# Install Chocolatey
Set-ExecutionPolicy Bypass -Scope Process -Force
iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
# Install Java
choco install openjdk11
# Download APKTool
Invoke-WebRequest -Uri "https://github.com/iBotPeaches/Apktool/releases/download/v2.9.3/apktool_2.9.3.jar" -OutFile "C:\Windows\apktool.jar"
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/windows/apktool.bat" -OutFile "C:\Windows\apktool.bat"
# Download Uber APK Signer
Invoke-WebRequest -Uri "https://github.com/patrickfav/uber-apk-signer/releases/download/v1.3.0/uber-apk-signer-1.3.0.jar" -OutFile "E:\rr3\uber-apk-signer-1.3.0.jar"
```
**Linux/macOS:**
```bash
# Install Java
sudo apt install openjdk-11-jdk # Ubuntu/Debian
brew install openjdk@11 # macOS
# Install APKTool
sudo apt install apktool # Ubuntu/Debian
brew install apktool # macOS
# Download Uber APK Signer
wget https://github.com/patrickfav/uber-apk-signer/releases/download/v1.3.0/uber-apk-signer-1.3.0.jar
```
---
## 🛠️ Modification Methods
### Method 1: Automated Script (Recommended)
**One-line command:**
```powershell
.\RR3-Community-Mod.ps1 -ServerUrl "https://your-server.com" -ApkPath "realracing3.apk"
```
**Features:**
- ✅ Automatic decompile/modify/recompile/sign
- ✅ Input validation
- ✅ Error handling
- ✅ Optional ADB installation
- ✅ Color-coded output
### Method 2: Manual (Step-by-Step)
```bash
# 1. Decompile
apktool d realracing3.apk -o rr3-modded
# 2. Edit AndroidManifest.xml
# (See guide for exact changes)
# 3. Recompile
apktool b rr3-modded -o realracing3-community.apk
# 4. Sign
java -jar uber-apk-signer.jar --apks realracing3-community.apk
# 5. Install
adb install realracing3-community-aligned-debugSigned.apk
```
### Method 3: Companion App (Advanced)
Create an Android app that modifies the APK programmatically:
- Users just enter server URL in a UI
- App handles all technical details
- Best for non-technical users
*(See full implementation in APK_MODIFICATION_GUIDE.md)*
---
## 📱 Complete Workflow
### 1. Set Up Community Server
```bash
# Start the server
cd E:\rr3\RR3CommunityServer\RR3CommunityServer
dotnet run
# Server starts on https://localhost:5001
```
### 2. Modify APK
```powershell
# Modify APK to point to server
.\RR3-Community-Mod.ps1 -ServerUrl "https://localhost:5001" -ApkPath "realracing3.apk"
```
### 3. Install on Device
```bash
# Uninstall original (different signature)
adb uninstall com.ea.games.r3_row
# Install modified APK
adb install realracing3-community.apk
```
### 4. Play!
Launch Real Racing 3 - it automatically connects to your community server!
---
## 🌐 Configuration Examples
### Local Server (Same PC)
```powershell
.\RR3-Community-Mod.ps1 -ServerUrl "https://localhost:5001"
```
### LAN Server
```powershell
.\RR3-Community-Mod.ps1 -ServerUrl "https://192.168.1.100:5001"
```
### Internet Server
```powershell
.\RR3-Community-Mod.ps1 -ServerUrl "https://rr3-community.mydomain.com"
```
### Android Emulator (from host PC)
```powershell
# 10.0.2.2 is the special IP for host machine from Android emulator
.\RR3-Community-Mod.ps1 -ServerUrl "http://10.0.2.2:5001"
```
---
## 🔒 Security Considerations
### SSL/HTTPS Support
**For localhost testing (HTTP):**
- Works out of the box
- No certificate needed
**For production (HTTPS):**
- Use valid SSL certificate (Let's Encrypt)
- Or install custom CA certificate on device
- Or disable certificate validation (see guide)
### Certificate Pinning
If the app has certificate pinning, you may need to:
1. Install custom CA certificate on device
2. Use mitmproxy to intercept/re-sign traffic
3. Modify CloudcellTrustManager.java to disable validation
*(Detailed instructions in APK_MODIFICATION_GUIDE.md)*
---
## 📊 Verification
### Check Modified APK
```bash
# Extract and verify AndroidManifest.xml
unzip -p realracing3-community.apk AndroidManifest.xml | grep -A2 "NimbleCustomizedSynergyServerEndpointUrl"
# Expected output:
# <meta-data
# android:name="NimbleCustomizedSynergyServerEndpointUrl"
# android:value="https://your-server.com"/>
```
### Monitor Network Traffic
```bash
# Use adb logcat to see connections
adb logcat | grep -i "synergy\|nimble\|director"
# Expected output:
# SynergyEnv: Using CUSTOMIZED configuration
# SynergyEnv: Director URL = https://your-server.com
```
### Test Server Connection
Check server logs for incoming requests:
```
[INFO] Synergy Request: Path=/director/api/android/getDirectionByPackage
[INFO] GetDeviceID request: existing=null, hardware=abc123
```
---
## 🔄 Switching Between Servers
### Option 1: Multiple APKs
Keep two versions:
- `realracing3-official.apk` - Points to EA servers
- `realracing3-community.apk` - Points to your server
Uninstall one, install the other to switch.
### Option 2: Change Package Name
Modify package name to run both side-by-side:
```xml
<manifest package="com.ea.games.r3_row.community" ...>
```
Now you can have:
- `com.ea.games.r3_row` - Official version
- `com.ea.games.r3_row.community` - Community version
**Note:** Requires changing all package references (advanced).
---
## 🐛 Troubleshooting
| Issue | Solution |
|-------|----------|
| **APK won't install** | Uninstall original first: `adb uninstall com.ea.games.r3_row` |
| **App crashes on launch** | Check APKTool version (2.7.0+), recompile with `-f` flag |
| **Still connects to EA** | Verify manifest changes, check logcat for config being read |
| **SSL certificate error** | Install custom CA cert or disable certificate validation |
| **"Signature conflict"** | Different signatures can't overwrite - uninstall first |
---
## 📦 Distribution
### Distribute Modified APK
**Pros:**
- Easy for users (just install)
- No technical knowledge required
**Cons:**
- Different signature than official
- Must uninstall official first
- Updates need re-distribution
### Distribute Script + Instructions
**Pros:**
- Users modify their own APK
- More trustworthy (users see what changes)
**Cons:**
- Requires technical knowledge
- Need to install tools
### Create Companion App
**Pros:**
- Best user experience
- Handles everything automatically
- Can switch servers easily
**Cons:**
- Requires developing Android app
- More complex to maintain
---
## ✅ Complete Checklist
**Server Setup:**
- [ ] .NET 8 SDK installed
- [ ] Community server built successfully
- [ ] Server running and accessible
- [ ] Firewall allows connections
**APK Modification:**
- [ ] APKTool installed
- [ ] Java JDK installed
- [ ] Uber APK Signer downloaded
- [ ] Original APK obtained
- [ ] Script executed successfully
- [ ] Modified APK signed
**Device Installation:**
- [ ] ADB installed and working
- [ ] Device connected (USB debugging enabled)
- [ ] Original app uninstalled
- [ ] Modified APK installed
- [ ] App launches without errors
**Connection Test:**
- [ ] Server logs show incoming requests
- [ ] Logcat shows custom server URL
- [ ] Device registered successfully
- [ ] Catalog loaded
---
## 📚 Documentation
| Document | Description | Size |
|----------|-------------|------|
| **APK_MODIFICATION_GUIDE.md** | Complete modification guide | 14,000 words |
| **RR3-Community-Mod.ps1** | Automated script | 320 lines |
| **NETWORK_COMMUNICATION_ANALYSIS.md** | Protocol analysis | 13,000 words |
| **IMPLEMENTATION_GUIDE.md** | Server setup guide | 15,000 words |
| **Total** | Complete documentation | 42,000+ words |
---
## 🎉 Success!
You now have everything needed to:
1.**Run a community server** (.NET 8, cross-platform)
2.**Modify APK** (automated script or manual)
3.**Connect game to server** (simple configuration change)
4.**Switch between servers** (multiple methods)
5.**Distribute to users** (APK or companion app)
**The game's built-in support for custom servers makes this incredibly clean!**
No hacky workarounds, no complex code modifications - just a simple configuration change that the developers intentionally included.
---
## 🏁 Next Steps
1. **Test locally**: Modify APK with localhost URL, test on emulator
2. **Deploy server**: Set up on cloud (Azure/AWS/etc.)
3. **Get SSL certificate**: Use Let's Encrypt for production
4. **Distribute**: Share modified APK with community
5. **Enjoy**: Play Real Racing 3 on your own terms!
**Happy racing on your community server! 🏎️💨**
---
*Project Status: ✅ Complete*
*APK Modification: ✅ Automated*
*Server: ✅ Production-ready*
*Documentation: ✅ 42,000+ words*
*Date: February 2026*

View File

@@ -1,86 +0,0 @@
# RR3 Asset CDN URL - What We Need
## Current Situation
The emulator approach is taking too long. Here's what we actually need:
## Just Need ONE Thing: The CDN Base URL
Once we have it, we can download everything with our script.
## Questions for RR3 Resurrection Discord
Hey! Working on preserving RR3 assets. Quick question:
**Do you know the Cloudcell CDN base URL EA uses?**
Looking for something like:
- `https://[something].cloudfront.net`
- `https://cdn-rr3.ea.com`
- `https://rr3-assets.ea.com`
We have:
- ✅ All 1,236 asset manifests (complete file lists)
- ✅ Automated downloader with MD5 verification
- ✅ Just need the base URL!
With the URL we can download and preserve all 2-5 GB of assets.
---
## If They Have the CDN URL
Once we get it, update this file and run:
```powershell
# Edit E:\rr3\RR3CommunityServer\download-assets.ps1
# Change line 18:
$EaCdnBaseUrl = "https://[ACTUAL-CDN-URL]"
# Then run:
cd E:\rr3\RR3CommunityServer
.\download-assets.ps1 -TestMode # Test with 10 files first
.\download-assets.ps1 # Download everything (2-5 GB)
```
## If They Have Assets Already Preserved
Ask if they can share:
1. The CDN URL they used
2. Or their cached assets directly
3. We'll upload to our private repo: https://github.com/ssfdre38/rr3-assets
---
## Alternative: Check Their Resources
Since they mentioned Google Drive (but outdated), they might have:
- Asset archives
- CDN documentation
- Server setup guides
- Working community servers already
Ask them for the **latest** resource links!
---
## What to Share with Them
Our project:
- **Backend**: https://github.com/ssfdre38/rr3-server
- **APK Mod**: https://github.com/ssfdre38/rr3-apk
- **Assets**: https://github.com/ssfdre38/rr3-assets (private)
We've built:
- Complete server implementation (Director, Account, Commerce, Progression)
- Server browser in APK (no rebuild needed!)
- Asset preservation system
- Just need the CDN URL or actual assets!
---
## Bottom Line
**Ask the Discord: "What CDN URL does EA use for asset downloads?"**
They're already preserving RR3, so they definitely know this! 🎮

View File

@@ -1,539 +0,0 @@
# 🎨 RR3 Asset Download System - Community Server Support
## Overview
Real Racing 3 downloads game assets (cars, tracks, textures, etc.) from EA's CDN after installation. We can redirect these downloads to community servers for **game preservation**.
## 🔍 How RR3 Asset Downloads Work
### Director Pattern
When the game starts, it calls the `/director` endpoint which returns URLs for various services:
```json
{
"serverUrls": {
"synergy.account": "http://your-server:5001/synergy/account",
"synergy.commerce": "http://your-server:5001/synergy/commerce",
"synergy.content": "http://your-server:5001/synergy/content", // <-- ASSETS!
"synergy.rewards": "http://your-server:5001/synergy/rewards",
"synergy.progression": "http://your-server:5001/synergy/progression"
}
}
```
### Key Service: `synergy.content`
This service handles **all asset downloads**:
- Car models (.pak files)
- Track data
- Textures
- Audio files
- Updates
### URL Structure
From `SynergyEnvironmentImpl.java`, we can see:
```java
// Line 109-116
public String getServerUrlWithKey(String str) {
// Returns URL for service key like "synergy.content"
return environmentDataContainer.getServerUrlWithKey(str);
}
```
The game asks for URLs by key, and the Director response tells it where to download content.
## 🎯 Solution: Community Asset Server
### Phase 1: Intercept Asset Requests
Update `DirectorController.cs` to include content service:
```csharp
[HttpGet("director")]
public IActionResult GetDirector()
{
var baseUrl = $"{Request.Scheme}://{Request.Host}";
return Ok(new
{
serverUrls = new Dictionary<string, string>
{
["synergy.account"] = $"{baseUrl}/synergy/account",
["synergy.commerce"] = $"{baseUrl}/synergy/commerce",
["synergy.rewards"] = $"{baseUrl}/synergy/rewards",
["synergy.progression"] = $"{baseUrl}/synergy/progression",
["synergy.content"] = $"{baseUrl}/synergy/content" // NEW!
},
// ... rest of response
});
}
```
### Phase 2: Create Content Controller
Handle asset download requests:
```csharp
[ApiController]
[Route("synergy/content")]
public class ContentController : ControllerBase
{
private readonly IWebHostEnvironment _env;
private readonly string _assetsPath;
public ContentController(IWebHostEnvironment env)
{
_env = env;
_assetsPath = Path.Combine(_env.ContentRootPath, "Assets");
// Create assets directory if not exists
Directory.CreateDirectory(_assetsPath);
}
// Get asset manifest (list of available content)
[HttpGet("manifest")]
public IActionResult GetManifest()
{
return Ok(new
{
version = "1.0.0",
assets = GetAssetList()
});
}
// Download specific asset
[HttpGet("download/{assetType}/{assetId}")]
public IActionResult DownloadAsset(string assetType, string assetId)
{
var assetPath = Path.Combine(_assetsPath, assetType, $"{assetId}.pak");
if (!System.IO.File.Exists(assetPath))
{
return NotFound(new { error = $"Asset not found: {assetType}/{assetId}" });
}
var fileBytes = System.IO.File.ReadAllBytes(assetPath);
return File(fileBytes, "application/octet-stream", $"{assetId}.pak");
}
// Get asset metadata
[HttpGet("info/{assetType}/{assetId}")]
public IActionResult GetAssetInfo(string assetType, string assetId)
{
var assetPath = Path.Combine(_assetsPath, assetType, $"{assetId}.pak");
if (!System.IO.File.Exists(assetPath))
{
return NotFound();
}
var fileInfo = new FileInfo(assetPath);
return Ok(new
{
assetId = assetId,
assetType = assetType,
size = fileInfo.Length,
checksum = CalculateMD5(assetPath),
version = "1.0.0"
});
}
private List<object> GetAssetList()
{
var assets = new List<object>();
if (Directory.Exists(_assetsPath))
{
foreach (var typeDir in Directory.GetDirectories(_assetsPath))
{
var assetType = Path.GetFileName(typeDir);
foreach (var file in Directory.GetFiles(typeDir, "*.pak"))
{
var assetId = Path.GetFileNameWithoutExtension(file);
var fileInfo = new FileInfo(file);
assets.Add(new
{
id = assetId,
type = assetType,
size = fileInfo.Length,
url = $"/synergy/content/download/{assetType}/{assetId}"
});
}
}
}
return assets;
}
private string CalculateMD5(string filePath)
{
using var md5 = System.Security.Cryptography.MD5.Create();
using var stream = System.IO.File.OpenRead(filePath);
var hash = md5.ComputeHash(stream);
return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
}
}
```
## 📁 Asset Directory Structure
Create this structure on your community server:
```
RR3CommunityServer/
└── Assets/
├── cars/
│ ├── nissan_silvia_s15.pak
│ ├── ford_focus_rs.pak
│ └── porsche_911_gt3.pak
├── tracks/
│ ├── silverstone_national.pak
│ ├── dubai_autodrome.pak
│ └── brands_hatch.pak
├── textures/
│ ├── ui_textures.pak
│ └── car_textures.pak
└── audio/
├── engine_sounds.pak
└── music.pak
```
## 🔧 How to Get Original Assets
### Method 1: Extract from Existing Installation (Legal if you own the game)
```bash
# Connect Android device
adb shell
# Find RR3 data directory
cd /data/data/com.ea.games.r3_row/
# List downloaded assets
ls -la files/
# Pull assets to PC (for backup/preservation)
adb pull /data/data/com.ea.games.r3_row/files/ ./rr3-assets/
```
### Method 2: Intercept Downloads (Monitor what gets downloaded)
```bash
# Monitor network traffic while game downloads assets
adb shell tcpdump -i any -w /sdcard/rr3_traffic.pcap
# Or use Charles Proxy / Fiddler to see requests
# Game will request: https://cdn.ea.com/rr3/assets/cars/xxx.pak
```
### Method 3: APK Assets (Some are bundled)
```bash
# Decompile APK
apktool d realracing3.apk -o rr3-decompiled
# Check assets folder
cd rr3-decompiled/assets/
ls -la
# Look for .pak, .unity3d, or compressed files
```
## 🌐 Admin Panel for Asset Management
Add to `Pages/Assets.cshtml`:
```html
@page
@model AssetsModel
@{
ViewData["Title"] = "Asset Management";
}
<div class="container-fluid">
<div class="row">
<div class="col-12">
<h2>🎨 Asset Management</h2>
<p>Manage game assets (cars, tracks, textures)</p>
</div>
</div>
<div class="row mb-3">
<div class="col-md-3">
<div class="card">
<div class="card-body">
<h5>Cars</h5>
<h3>@Model.CarAssetCount</h3>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card">
<div class="card-body">
<h5>Tracks</h5>
<h3>@Model.TrackAssetCount</h3>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card">
<div class="card-body">
<h5>Textures</h5>
<h3>@Model.TextureAssetCount</h3>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card">
<div class="card-body">
<h5>Total Size</h5>
<h3>@Model.TotalSizeMB MB</h3>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-header">
<button class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#uploadModal">
📤 Upload Asset
</button>
</div>
<div class="card-body">
<table class="table">
<thead>
<tr>
<th>Type</th>
<th>Asset ID</th>
<th>Size</th>
<th>Checksum</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
@foreach (var asset in Model.Assets)
{
<tr>
<td><span class="badge bg-info">@asset.Type</span></td>
<td>@asset.Id</td>
<td>@asset.SizeMB MB</td>
<td><code>@asset.Checksum</code></td>
<td>
<a href="/synergy/content/download/@asset.Type/@asset.Id" class="btn btn-sm btn-success">Download</a>
<button class="btn btn-sm btn-danger" onclick="deleteAsset('@asset.Type', '@asset.Id')">Delete</button>
</td>
</tr>
}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<!-- Upload Modal -->
<div class="modal fade" id="uploadModal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Upload Asset</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<form method="post" enctype="multipart/form-data">
<div class="modal-body">
<div class="mb-3">
<label class="form-label">Asset Type</label>
<select class="form-select" name="AssetType" required>
<option value="cars">Cars</option>
<option value="tracks">Tracks</option>
<option value="textures">Textures</option>
<option value="audio">Audio</option>
</select>
</div>
<div class="mb-3">
<label class="form-label">Asset ID</label>
<input type="text" class="form-control" name="AssetId" placeholder="e.g., nissan_silvia_s15" required />
</div>
<div class="mb-3">
<label class="form-label">File (.pak)</label>
<input type="file" class="form-control" name="AssetFile" accept=".pak" required />
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
<button type="submit" class="btn btn-primary">Upload</button>
</div>
</form>
</div>
</div>
</div>
```
## 🎮 Testing Asset Downloads
### 1. Start Server with Assets
```bash
cd RR3CommunityServer/RR3CommunityServer
dotnet run
```
### 2. Check Asset Manifest
```bash
curl http://localhost:5001/synergy/content/manifest
```
### 3. Download Test Asset
```bash
curl http://localhost:5001/synergy/content/download/cars/nissan_silvia_s15 -o test.pak
```
### 4. Verify in Game
- Connect APK to community server
- Start game
- Game should request assets from your server
- Monitor logs:
```bash
adb logcat | grep -E "(Download|Asset|Content)"
```
## 📝 Asset Metadata Format
Each asset should have a companion `.json` metadata file:
```json
{
"id": "nissan_silvia_s15",
"type": "car",
"name": "Nissan Silvia Spec-R",
"version": "1.0.0",
"size": 15728640,
"checksum": "5d41402abc4b2a76b9719d911017c592",
"dependencies": [
"car_textures",
"engine_sounds"
],
"tags": ["class_c", "nissan", "drift"]
}
```
## 🔐 Security Considerations
### For Game Preservation (Legal Use)
**Allowed**:
- Backing up assets from games you own
- Running private servers for personal use
- Preserving games after shutdown
- Using with legally obtained APK
**Not Allowed**:
- Distributing EA's copyrighted assets
- Pirating the game
- Selling assets
- Public redistribution without permission
### Asset Checksums
Always verify integrity:
```csharp
private bool VerifyAssetChecksum(string filePath, string expectedChecksum)
{
var actualChecksum = CalculateMD5(filePath);
return actualChecksum.Equals(expectedChecksum, StringComparison.OrdinalIgnoreCase);
}
```
## 🚀 Implementation Steps
### Server Side (rr3-server)
1. ✅ Add `ContentController.cs`
2. ✅ Create `Assets/` directory structure
3. ✅ Update `DirectorController` to include `synergy.content`
4. ✅ Add admin page for asset management
5. ✅ Implement upload/download endpoints
### APK Side (rr3-apk)
**No changes needed!** 🎉
The APK already uses the Director pattern. Once your community server returns the `synergy.content` URL, the game will automatically use it!
### Asset Extraction
1. Install original RR3 from Play Store
2. Let it download all assets
3. Use `adb pull` to extract assets
4. Upload to your community server
5. Share with community (if legally allowed)
## 📊 Asset Types in RR3
### Cars (~10-20 MB each)
- 3D models
- Physics data
- Paint variants
- Upgrade visual changes
### Tracks (~50-100 MB each)
- 3D environment
- AI pathfinding data
- Weather variants
- Time of day variants
### Textures (~5-10 MB per pack)
- UI elements
- Car liveries
- Environmental textures
- Effects
### Audio (~1-5 MB per pack)
- Engine sounds per car
- Music tracks
- UI sounds
- Ambient audio
## 💡 Future Enhancements
- [ ] **Asset CDN**: Distribute assets via CDN for faster downloads
- [ ] **Compression**: Serve compressed .pak files
- [ ] **Versioning**: Support multiple asset versions
- [ ] **Differential Updates**: Only download changed files
- [ ] **P2P Distribution**: BitTorrent for large assets
- [ ] **Asset Workshop**: Community-created content
- [ ] **Mod Support**: Custom cars/tracks
## 🎯 Expected Behavior
### Without Community Assets
- Game connects to community server ✅
- Gameplay works (with existing assets) ✅
- New cars might not load properly ❌
- Missing tracks won't be available ❌
### With Community Assets
- Game connects to community server ✅
- Downloads assets from community server ✅
- All content available ✅
- Full offline gameplay ✅
## 📚 Resources
- **Unity .pak Format**: Research Unity asset bundle format
- **EA Nimble SDK**: Understanding the download system
- **Asset Extraction Tools**: QuickBMS, Unity Asset Bundle Extractor
- **Network Analysis**: Charles Proxy, Wireshark
---
**This enables TRUE game preservation!** 🎮
Players can download all game content from community servers, making RR3 fully playable even if EA shuts down their servers!
**Legal Note**: Only use assets you legally own. This is for preservation, not piracy.

View File

@@ -1,469 +0,0 @@
# 🎮 Real Racing 3 Asset Preservation - Complete Analysis
## Executive Summary
Successfully reverse-engineered Real Racing 3's asset delivery system and extracted all asset manifests. Discovered that the game uses **"Cloudcell"** - EA's internal CDN system. CDN URL is provided dynamically at runtime, not hardcoded in the APK.
**Result:** We have everything needed for complete game preservation except the Cloudcell CDN URL.
---
## 🔍 What We Discovered
### 1. Cloudcell CDN System
Found in game binary (`libRealRacing3.so`):
```
"Downloading from CDN has failed! NO Cloudcell"
"CC_AssetManager_Class::AssetDownloadError()"
"Download attempt %d of %d from CDN has failed"
```
**Cloudcell** is EA's proprietary content delivery network for Real Racing 3.
### 2. Asset Manifests (1,236 Files)
Extracted from APK's `res/xR.zip`:
**Core Assets:**
- `asset_list_base.txt` - 271 KB of core game data
- `asset_list_audio_base.txt` - 70 KB of engine sounds
- `asset_list_base_gui.txt` - 244 KB of menu assets
**Vehicle Assets (400+ files):**
- Formula 1 (2019-2024 seasons)
- NASCAR
- GT3/GT4
- Endurance racing (LMP1, LMP2)
- WRC
- Classic cars
- 500+ individual vehicles
**Track Assets (30+ files):**
- Silverstone, Monaco, Spa-Francorchamps
- Le Mans, Nürburgring, Laguna Seca
- Formula E tracks (Berlin, NYC)
- NASCAR ovals (Daytona, Richmond)
**Special Content:**
- Time trial events
- Career progression data
- Championships
- Liveries and customization
**Total Estimated Size:**
- 10,000+ individual asset files
- 2-5 GB when fully downloaded
- Critical assets only: ~500 MB
### 3. Manifest Format
```
/path/to/asset.ext<TAB>md5hash<TAB>compressed_size<TAB>uncompressed_size
```
Example:
```
/data/events.dat.nct 0a21c68abefbfcac00e7387f025e8012 14461497 14461497
```
This allows:
- Asset verification via MD5
- Download progress tracking
- Integrity checking
- Version management
---
## 🏗️ How RR3 Asset System Works
### Normal Flow (EA Servers Active)
```
1. Game Launches
2. Contacts EA Director Service
GET https://[director-url]/director
3. Director Returns Service URLs:
{
"synergy.account": "https://...",
"synergy.commerce": "https://...",
"synergy.content": "https://[cloudcell-cdn]/", ← CDN URL!
...
}
4. CC_AssetManager checks manifests
5. Downloads missing assets from Cloudcell CDN
6. Verifies MD5 hashes
7. Game ready to play!
```
### Community Server Flow (Our Solution)
```
1. Game Launches
2. Contacts COMMUNITY Director Service
GET https://community-server.com/director
3. Our Director Returns:
{
"synergy.content": "https://community-server.com/assets/", ← OUR CDN!
...
}
4. Game downloads from COMMUNITY SERVER
5. Complete offline preservation!
```
---
## 📦 What We Have Ready
### ✅ Extracted & Organized
- **1,236 manifest files** in `Assets/manifests/`
- **Complete asset list** for entire game
- **Organized structure**: cars/, tracks/, audio/, textures/, ui/
- **Documentation**: Format specs, extraction guide
### ✅ Downloader Script Created
`download-assets.ps1` features:
- Parses manifests automatically
- Downloads from CDN
- Verifies MD5 integrity
- Resumes interrupted downloads
- Skips already cached files
- Detailed logging
- Test mode for verification
### ✅ Storage Infrastructure
```
E:\rr3\RR3CommunityServer\RR3CommunityServer\Assets\
├── manifests\ ✅ 1,236 manifests ready
├── downloaded\ ⏳ Waiting for CDN URL
├── cars\ 📁 Structure ready
├── tracks\ 📁 Structure ready
├── audio\ 📁 Structure ready
├── textures\ 📁 Structure ready
└── ui\ 📁 Structure ready
```
---
## ❌ What We're Missing
### Cloudcell CDN URL
**Not found in:**
- ❌ APK configuration files (checked all .json, .xml, .bin)
- ❌ Game binary strings (searched 31.5 MB libRealRacing3.so)
- ❌ Smali bytecode
- ❌ AndroidManifest.xml
- ❌ Resource files
**Why:** EA provides it dynamically via Director service at runtime for security/flexibility.
---
## 🎯 Solutions to Get Assets
### Solution A: Network Capture (Active EA Servers)
**Best if EA servers still online:**
1. **Setup mitmproxy:**
```bash
pip install mitmproxy
mitmweb --listen-port 8080
```
2. **Configure Android device:**
- WiFi settings → Manual proxy
- Point to PC IP:8080
- Install mitmproxy CA certificate
3. **Capture traffic:**
- Launch Real Racing 3
- Watch for Director service call
- Extract `synergy.content` URL from JSON response
4. **Download assets:**
```powershell
# Update script with discovered URL
.\download-assets.ps1 -TestMode # Verify
.\download-assets.ps1 # Download all
```
**Time sensitive!** EA servers may shut down March 2026.
### Solution B: Community Server (RECOMMENDED!)
**Best for long-term preservation:**
1. **Accept community contributions:**
- Players extract assets from their devices
- Upload via web panel
- Verify MD5 matches manifests
- Store in community server
2. **Serve from our Director:**
```csharp
// DirectorController.cs
{ "synergy.content", "https://your-server.com/assets/" }
```
3. **Game downloads from us:**
- No EA servers needed
- Complete offline capability
- Community-powered preservation
### Solution C: Device Extraction
**If you have RR3 installed:**
```bash
# Connect via USB
adb devices
# Pull game data
adb pull /data/data/com.ea.games.r3_row/files/ rr3-backup/
adb pull /sdcard/Android/data/com.ea.games.r3_row/files/ rr3-backup/
# Copy to server
Copy-Item rr3-backup\* E:\rr3\RR3CommunityServer\RR3CommunityServer\Assets\ -Recurse
```
---
## 📊 Asset Priority Guide
### Priority 1: Critical (Game Won't Start)
- `/data/events.dat.nct` (14.4 MB) - All race events
- `/data/jobs.bin.nct` (3.5 MB) - Job system
- `/data/championships.bin.nct` (157 KB) - Championships
- `/camTweaks.dat` (131 KB) - Camera settings
- Base GUI assets (menus/HUD)
**Size: ~500 MB**
### Priority 2: Core Gameplay
- Audio base (engine sounds)
- Starter vehicles (Silvia, Focus RS, 911)
- Basic tracks (Silverstone, Laguna Seca)
- UI elements
**Size: ~1 GB**
### Priority 3: Extended Content
- F1 seasons (2019-2024)
- NASCAR series
- Additional tracks
- Premium vehicles
**Size: ~2 GB**
### Priority 4: Optional
- Special events
- Time trials
- Seasonal content
- Exclusive vehicles
**Size: ~3-5 GB total**
---
## 🛠️ Tools & Documentation
### Scripts Created
1. **download-assets.ps1** - Automated downloader with MD5 verification
2. **Test scripts** - Verify CDN URLs and connectivity
### Documentation Created
1. **CLOUDCELL_DISCOVERY.md** - Technical findings
2. **CDN_URL_DISCOVERY.md** - Discovery methods
3. **ASSET_DOWNLOAD_STATUS.md** - Complete guide
4. **Assets/manifests/README.md** - Manifest format reference
### Usage Examples
```powershell
# Test downloader (10 assets)
.\download-assets.ps1 -TestMode
# Download critical assets
.\download-assets.ps1 -ManifestFiles @(
"asset_list_base.txt",
"asset_list_base_gui.txt",
"asset_list_audio_base.txt"
)
# Download everything
$all = Get-ChildItem Assets\manifests\*.txt | % { $_.Name }
.\download-assets.ps1 -ManifestFiles $all
```
---
## 🚀 Recommended Implementation Plan
### Phase 1: Build Community Infrastructure (NOW)
✅ Director service - Done!
✅ Database for asset tracking - Done! (GameAsset entity)
⏳ AssetsController with upload endpoint - TODO
⏳ Web panel for asset management - TODO
### Phase 2: Network Capture (If EA Still Online)
1. Setup mitmproxy
2. Capture Cloudcell URL
3. Download critical assets (~500 MB)
4. Archive for community
### Phase 3: Community Contributions (After EA Shutdown)
1. Users extract from devices
2. Upload via web panel
3. Verify MD5 hashes
4. Distribute to all players
### Phase 4: Complete Preservation
1. All critical assets cached
2. Game fully playable offline
3. Community-hosted forever
4. New players can join anytime
---
## 💡 Key Insights
### 1. Dynamic Configuration is GOOD for Us!
Since the CDN URL isn't hardcoded, we can:
- Point our Director to OUR asset server
- Game doesn't know the difference
- Complete control over asset delivery
### 2. Manifests are the Treasure Map
The 1,236 manifest files tell us:
- Every single asset the game needs
- Exact file sizes
- MD5 hashes for verification
- Complete preservation checklist
### 3. Community-Powered Preservation Works
Instead of relying on one person to download everything:
- 100 players each contribute 50 MB = 5 GB complete
- Crowdsourced preservation
- Distributed effort
- Guaranteed success
---
## 📈 Current Status
| Item | Status | Progress |
|------|--------|----------|
| Manifests Extracted | ✅ Complete | 1,236/1,236 files |
| Storage Structure | ✅ Complete | Organized & ready |
| Downloader Script | ✅ Complete | MD5 verification included |
| Database Schema | ✅ Complete | GameAsset entity added |
| CDN URL Discovery | ⏳ Pending | Network capture needed |
| Asset Downloads | ⏳ Pending | 0/10,000 files |
| AssetsController | ⏳ TODO | Upload/serve endpoints |
| Web Admin Panel | ⏳ TODO | Asset management UI |
---
## 🎯 Next Steps
### Immediate (This Week)
- [ ] Try network capture to find Cloudcell URL
- [ ] Test downloader script with test assets
- [ ] Implement AssetsController endpoints
- [ ] Create asset upload web page
### Short-term (This Month)
- [ ] Download critical assets if CDN found (~500 MB)
- [ ] Build community contribution system
- [ ] Test end-to-end asset delivery
- [ ] Document extraction procedures
### Long-term (Before March 2026)
- [ ] Download complete asset library (2-5 GB)
- [ ] Organize community contribution effort
- [ ] Create asset mirror network
- [ ] Ensure complete preservation
---
## 🏁 Success Criteria
**Minimum Viable Preservation (500 MB):**
- ✅ Game launches successfully
- ✅ Basic races work
- ✅ Core cars/tracks available
- ✅ Can complete career mode
**Complete Preservation (2-5 GB):**
- ✅ All vehicles available
- ✅ All tracks playable
- ✅ All events accessible
- ✅ Full game experience
- ✅ Community server self-sufficient
---
## ⚠️ Legal & Ethical Considerations
**Copyright Notice:**
- Assets are copyrighted by Electronic Arts Inc.
- Firemonkeys Studio (developer)
**Acceptable Use:**
- ✅ Personal game preservation after EA shutdown
- ✅ Players who own the game
- ✅ Historical preservation
- ✅ Non-commercial use
**NOT Acceptable:**
- ❌ Public piracy distribution
- ❌ Commercial exploitation
- ❌ Trademark infringement
- ❌ Reselling assets
**Our Position:**
This is a preservation effort for a game that will be shut down. All users must own Real Racing 3 to use community servers.
---
## 📞 Resources & References
**Files:**
- Manifests: `E:\rr3\RR3CommunityServer\RR3CommunityServer\Assets\manifests\`
- Downloader: `E:\rr3\RR3CommunityServer\download-assets.ps1`
- Documentation: `E:\rr3\CLOUDCELL_DISCOVERY.md`, `CDN_URL_DISCOVERY.md`
**GitHub Repositories:**
- Backend: https://github.com/ssfdre38/rr3-server
- APK Mod: https://github.com/ssfdre38/rr3-apk
**Tools Used:**
- 7-Zip (APK extraction)
- apktool (future decompilation)
- PowerShell (automation)
- mitmproxy (network capture - recommended)
---
## 🎮 Final Thoughts
We've successfully:
1. ✅ Reverse-engineered the asset system
2. ✅ Extracted ALL asset manifests
3. ✅ Created automated download tools
4. ✅ Built preservation infrastructure
5. ✅ Documented everything thoroughly
**What's left:** Find the Cloudcell CDN URL OR implement community contributions.
**The good news:** Since we control the Director service, we don't NEED EA's CDN. We can serve assets from our own community infrastructure!
**This project ensures Real Racing 3 will live on forever, even after EA shuts down in March 2026.** 🏁
---
**Last Updated:** February 18, 2026
**Status:** Infrastructure Complete, Awaiting Asset Downloads
**Progress:** 90% Complete (just need the CDN URL!)

View File

@@ -1,268 +0,0 @@
# 🎯 RR3 ASSET PRESERVATION - CURRENT STATUS
**Date:** 2026-02-18
**Critical Discovery:** EA CDN still active, assets captured!
---
## ✅ WHAT WE HAVE
### 1. Base APK Assets (res.zip)
- **Location:** `E:\rr3\phone-assets-res\res\`
- **Size:** 22 MB uncompressed (11.5 MB zip)
- **Files:** 1,516 files
- **Contents:**
- 1,236 asset manifest files (asset_list_*.txt)
- 40 .z texture files (6 MB)
- 1,238 .txt config files (13 MB)
- Fonts, shaders, materials, scripts
- GUI assets (base resolution)
### 2. Asset Manifests
- **Total Assets Catalogued:** 114,307 files
- **Format:** `Path | MD5 Hash | Compressed Size | Uncompressed Size`
- **Categories:**
- Cars (F1, NASCAR, GT3, GT4, Formula E, etc.)
- Tracks (circuits worldwide)
- GUI assets (multiple resolutions)
- Audio packs
- Exclusive content
- Season packs (1-5)
### 3. Full Game Assets (ON PHONE - NEED TO TRANSFER)
- **Size:** 1.44 GB ✅ **SUCCESSFULLY DOWNLOADED FROM CDN**
- **Location:** Phone at `/sdcard/Android/data/com.ea.games.r3_row/files/`
- **Status:** ⏳ Waiting for ADB transfer to PC, then to OVH server
- **Expected Contents:**
- .pak files (3D models)
- .pka files (asset archives)
- .z files (compressed textures)
- Audio files
- Full game data
### 4. Network Traffic Capture (HAR)
- **File:** `G:\My Drive\pin-river.data.ea.com_2026_02_18_10_37_48.har`
- **Size:** 2.46 MB
- **Requests:** 2,355 HTTPS connections
- **Key Discovery:** CDN domain = `firemonkeys.akamaized.net`
---
## 🎯 CRITICAL ACHIEVEMENTS
**CDN Discovery:** firemonkeys.akamaized.net (Akamai)
**CDN Status:** Still active as of 2026-02-18
**Assets Downloaded:** 1.44 GB captured before shutdown
**Asset Index:** Complete manifest of 114,307 files with MD5 hashes
**File Format:** ZLIB compression (.z files) - extraction tools ready
**APK Decompiled:** Full source code analyzed
**Server Ready:** 19/11 endpoints operational (173% coverage)
---
## ⏳ NEXT CRITICAL STEPS
### IMMEDIATE (Emergency Preservation)
1. **Transfer phone assets to PC via ADB** ⏳ IN PROGRESS
- Enable USB debugging on phone
- Install ADB on Windows PC
- Run: `adb pull /sdcard/Android/data/com.ea.games.r3_row/files/`
- Target: `C:\RR3-Assets\` (1.44 GB)
2. **Transfer to OVH Server**
- Via RDP file copy, or
- Upload to Google Drive, download on server
- Destination: `E:\rr3\phone-assets-full\`
3. **Verify Asset Integrity**
- Compare file counts with manifests
- Verify MD5 hashes
- Document what assets are present
### ANALYSIS PHASE
4. **Map Asset Structure**
- Correlate phone files with asset_list manifests
- Reverse engineer CDN URL patterns
- Document file naming conventions
5. **Extract Compressed Assets**
- Use AssetExtractionService to decompress .z files
- Extract textures from .pak/.pka archives
- Convert to usable formats (DDS → PNG)
6. **Catalog Complete Asset Library**
- Create master index
- Document all cars, tracks, content
- Map to original CDN paths
### PRESERVATION PHASE
7. **Archive for Posterity**
- Create compressed archive with metadata
- Upload to Internet Archive (archive.org)
- Share with RR3 Resurrection Discord community
- Create torrent for redundancy
8. **Test CDN Mirroring**
- Test URL patterns: `https://firemonkeys.akamaized.net/rr3/assets/...`
- Attempt to download remaining assets
- Document what's still accessible vs. shut down
9. **Integrate with Community Server**
- Add asset delivery endpoints
- Map custom assets to manifest format
- Enable modding system for custom cars/tracks
---
## 📊 PRESERVATION STATISTICS
### Assets Captured
- **Base APK:** 1,516 files (22 MB)
- **Phone Download:** ~1.44 GB (file count TBD)
- **Total Catalogued:** 114,307 files in manifests
- **Preservation %:** TBD after analysis
### Coverage Status
| Category | Status | Notes |
|----------|--------|-------|
| Base Assets | ✅ 100% | Extracted from APK |
| Asset Manifests | ✅ 100% | All 1,236 lists present |
| Game Assets | ⏳ Transfer | 1.44 GB on phone |
| CDN Mirroring | ❓ Unknown | Need to test URLs |
| High-Res Packs | ❓ Unknown | May be in phone assets |
| Audio Packs | ❓ Unknown | May be in phone assets |
---
## 🔥 WHY THIS MATTERS
### Before This Session:
- RR3 shutting down March 2026
- No known preservation efforts
- Assets presumed lost forever
### After This Session:
- ✅ CDN discovered and documented
- ✅ 1.44 GB of assets captured
- ✅ Complete manifest of 114K+ files
- ✅ Extraction tools built
- ✅ Community server operational
- ✅ Modding system ready
### Impact:
- **Game can be preserved permanently**
- **Community can continue playing post-shutdown**
- **Custom content creation enabled**
- **Historical preservation achieved**
---
## 📁 KEY FILES & LOCATIONS
### On OVH Server (Current Working Directory)
```
E:\rr3\
├── phone-assets-res\ (Base APK assets - 22 MB)
│ └── res\
│ ├── asset_list_*.txt (1,236 manifests)
│ ├── *.z (40 texture files)
│ └── eds/, gui/, etc.
├── phone-assets-full\ (⏳ Awaiting transfer - 1.44 GB)
├── RR3CommunityServer\ (Server implementation)
│ ├── Tools\ (Asset extraction scripts)
│ └── Services\ (AssetExtractionService)
├── decompiled\ (APK source code)
├── ENDPOINT_AUDIT.md (19 endpoints verified)
├── CC_SYNC_INVESTIGATION.md (Encryption false alarm)
├── ASSET_EXTRACTION_GUIDE.md (Extraction documentation)
└── HAR_ANALYSIS_RESULTS.md (CDN discovery)
```
### On Your Windows PC (Local)
```
G:\My Drive\
├── res.zip (Base assets - source)
├── Rr3\files\ (Sync folder - empty)
├── pin-river...har (Network capture)
└── (TBD) RR3-Assets-Full.zip (After ADB pull)
C:\RR3-Assets\ (⏳ ADB pull destination)
└── (1.44 GB from phone)
```
### On Phone
```
/sdcard/Android/data/com.ea.games.r3_row/files/
└── 1.44 GB assets (READY TO TRANSFER)
```
---
## 🎯 SUCCESS METRICS
### Phase 1: Discovery ✅ COMPLETE
- [x] Decompile APK
- [x] Analyze network protocol
- [x] Build community server
- [x] Test APK compatibility
- [x] Document all endpoints
### Phase 2: Asset Capture ⏳ IN PROGRESS
- [x] Discover CDN domain
- [x] Capture network traffic
- [x] Download assets from CDN
- [ ] Transfer assets to server
- [ ] Verify asset integrity
- [ ] Catalog all assets
### Phase 3: Preservation ⏳ PENDING
- [ ] Archive assets
- [ ] Upload to Internet Archive
- [ ] Share with community
- [ ] Test CDN mirroring
- [ ] Document URL patterns
### Phase 4: Integration ⏳ PENDING
- [ ] Add asset delivery to server
- [ ] Enable custom content system
- [ ] Test end-to-end gameplay
- [ ] Document modding workflow
- [ ] Release to community
---
## 🚨 TIME-SENSITIVE ITEMS
**URGENT (Do Now):**
- Transfer 1.44 GB from phone before it gets deleted/lost
- Test CDN URLs while still active
- Document everything while fresh
**HIGH PRIORITY (This Week):**
- Complete asset analysis
- Archive to Internet Archive
- Share findings with Discord community
**MEDIUM PRIORITY (Before March 2026):**
- Mirror remaining CDN assets
- Complete preservation documentation
- Test restored gameplay
**ONGOING:**
- Monitor EA servers for shutdown date
- Update community on progress
- Coordinate with other preservationists
---
## 📞 CURRENT BLOCKER
**Waiting for:** User to run ADB commands on their Windows PC to transfer phone assets
**Instructions provided in:** `E:\rr3\ADB_TRANSFER_INSTRUCTIONS.md`
**Next update:** After assets transferred to server
---
**This is historic game preservation work. Every asset counts. 🏁✨**

View File

@@ -1,278 +0,0 @@
# Real Racing 3 - Asset Recovery Status
**Date**: 2026-02-18
**Status**: ❌ **EA CDN OFFLINE - Assets Likely Lost**
---
## 🔍 Investigation Results
### CDN Discovery
**FOUND CDN Domain**: `cloudcell.ea.com`
**DNS Status**: Domain does not resolve (offline)
**Server Status**: Unreachable - likely shut down early
### Evidence Found
**In libRealRacing3.so binary:**
```
- cloudcell.ea.com
- connect-dev-ss.cloudcell.ea.com
- contentapi.ea.com (also offline)
- CC_AssetManager_Class::AssetDownloadError()
- "Downloading from CDN has failed! NO Cloudcell Fallback server"
```
### What We Have
**APK**: realracing3.apk (100 MB)
**Manifests**: 1,238 asset manifest files (from 2 sources)
**Asset List**: Complete inventory of ~10,000 game assets
**Actual Assets**: 0 .pak files downloaded
---
## 📊 Asset Inventory (Manifests Only)
### Sources
1. **From APK** (`E:\rr3\RR3CommunityServer\RR3CommunityServer\Assets\manifests\`)
- 1,236 manifest .txt files
- Extracted from `res/xR.zip` inside APK
2. **From Google Drive** (`E:\rr3\res-from-drive\`)
- 1,516 files (23 MB total)
- 1,238 .txt manifest files
- Additional files: .fsh, .vsh, .atlas, .json, .otf, .plist
- **NO .pak files included**
### What Manifests Contain
Each manifest line format:
```
/path/to/asset.ext<TAB>md5hash<TAB>compressed_size<TAB>uncompressed_size
```
Example:
```
/gui_assets/2048x1536/apple_tv/sprites_0.rgb.pvr.z
371bde454749108a976a98eb2be4617c 70799 70799
```
### Asset Categories
- 🏎️ **Cars**: 400+ vehicles (F1, NASCAR, GT3, Formula E, classics)
- 🏁 **Tracks**: 30+ circuits (Silverstone, Monaco, Spa, Nürburgring, etc.)
- 🎵 **Audio**: Engine sounds, music, UI sounds
- 🎨 **Textures**: Car skins, track textures, UI elements
- 🎮 **UI Assets**: Menus, HUD, loading screens
- 📦 **Events**: Time trials, cups, championships
**Estimated Total Size**: 2-5 GB (based on manifest compressed sizes)
**Actual Downloaded**: 0 GB ❌
---
## 🌐 CDN URL Testing Results
### Tested Patterns (All Failed)
```
❌ https://cloudcell.ea.com
❌ http://cloudcell.ea.com
❌ https://connect-dev-ss.cloudcell.ea.com
❌ https://contentapi.ea.com
❌ d1q35ni3zsr8wd.cloudfront.net (wrong guess)
```
### DNS Resolution
```
❌ cloudcell.ea.com → Not found (NXDOMAIN)
❌ contentapi.ea.com → Not found
✅ www.ea.com → 23.52.116.192 (still online)
✅ help.ea.com → 184.86.166.231 (still online)
```
**Conclusion**: EA shut down the Cloudcell CDN infrastructure early (before March 2026 announced date).
---
## 🔧 Attempted Methods
### 1. APK Decompilation ✅
- Extracted APK with 7-Zip
- Found libRealRacing3.so (31.5 MB binary)
- Discovered Cloudcell CDN references
- **Result**: Found CDN domain, but domain is dead
### 2. Binary String Analysis ✅
- Searched for URL patterns in native libraries
- Found Java package: `com.firemonkeys.cloudcellapi`
- Found asset manager functions
- **Result**: CDN URL was dynamic (provided by Director service)
### 3. Network Capture Attempt 🕐
- Started mitmproxy on port 8080
- Launched Android emulator
- **Result**: Abandoned (too slow, CDN already confirmed dead)
### 4. Google Drive Check ✅
- Downloaded res.zip from RR3 Resurrection community
- 1,516 files extracted (23 MB)
- **Result**: Only manifests, no actual assets
### 5. MediaFire Check ❌
- Checked provided MediaFire folder
- **Result**: Empty folder
---
## 🚨 Critical Timeline Discovery
**Announced Shutdown**: March 17, 2026 (EA press release)
**Actual Shutdown**: **Before February 18, 2026** (DNS down during investigation)
**Gap**: EA shut down servers **at least 1 month early**
This means:
- Director service offline (can't get CDN URL dynamically)
- Cloudcell CDN offline (can't download assets)
- Game likely unplayable already
---
## 🆘 Remaining Options
### 1. Contact RR3 Resurrection Discord ⭐ **RECOMMENDED**
**They have active preservation project and likely know:**
- If anyone captured assets before shutdown
- Alternative asset sources
- Whether full game preservation is still possible
**Discord**: RR3 Resurrection community
**Google Drive**: https://drive.google.com/drive/folders/1EXJ1w5Sjsi8qNqip_I6cADzkDxmZ1UYl
### 2. Check Personal Game Installations
If you or anyone has RR3 installed on their device:
- Assets stored at: `/data/data/com.ea.games.r3_row/files/`
- Could extract from rooted Android device
- Or extract from Android backup
### 3. Internet Archive / Wayback Machine
- Check if cloudcell.ea.com was archived
- Look for old captures of asset downloads
- Low probability but worth checking
### 4. Contact Other Preservation Communities
- Reddit: r/DataHoarder
- Archive Team
- Game Preservation societies
### 5. Check for Modded APKs
Some modified APKs might have bundled assets offline
---
## 📝 What We Can Save NOW
Even without assets, we can preserve:
1.**APK** - Game binary
2.**Manifests** - Complete asset inventory
3.**Documentation** - How game worked
4.**Server Code** - Your RR3CommunityServer implementation
5.**Database Schema** - Game data structures
**Uploaded to GitHub:**
- https://github.com/ssfdre38/rr3-assets (manifests)
- https://github.com/ssfdre38/rr3-server (server code)
- https://github.com/ssfdre38/rr3-apk (APK)
---
## 💡 Next Steps
### Immediate Action
**Ask RR3 Resurrection Discord:**
```
Hey everyone, I'm trying to preserve RR3 assets before shutdown.
I discovered EA shut down cloudcell.ea.com CDN early (DNS dead as of Feb 18).
Questions:
1. Did anyone capture the asset .pak files before CDN went down?
2. Does anyone have a full game installation they can backup?
3. Are there any alternative sources for the game assets?
I have all 1,236 manifest files with MD5 hashes and can help organize
a preservation effort if we can locate the actual files.
```
### If Assets Are Found
1. Update `download-assets.ps1` with correct source URL
2. Download and verify all assets (MD5 check)
3. Upload to private GitHub repo (rr3-assets)
4. Share with preservation community
5. Document full recovery process
### If Assets Are Lost Forever
1. Document what we learned
2. Preserve manifests and metadata
3. Help others who may have local copies
4. Focus on server emulation without assets
---
## 📦 Repository Status
### GitHub Repos Created
1. **rr3-assets** (Private)
- 1,236 manifest files
- Asset documentation
- Size: ~13 MB
2. **rr3-server** (Status?)
- Community server implementation
- GameAsset database schema
- API endpoints
3. **rr3-apk** (Status?)
- Original APK
- Decompilation tools
---
## 🎓 Technical Lessons Learned
### How Real Racing 3 Asset System Works
1. **Game Launch**: APK is only 100 MB (installer)
2. **Director Service**: Game contacts EA server for config
3. **CDN Discovery**: Director returns Cloudcell CDN URL dynamically
4. **Asset Check**: Game parses manifests to see what it needs
5. **Download**: Uses `CC_AssetManager` to fetch from Cloudcell
6. **Verification**: Checks MD5 hash of each downloaded file
7. **Storage**: Saves to device at `/data/data/com.ea.games.r3_row/files/`
### Why We Couldn't Get Assets
- ❌ CDN URL not hardcoded in APK
- ❌ Director service offline (can't get URL dynamically)
- ❌ Cloudcell domain DNS dead
- ❌ No backup CDN available
- ❌ Shutdown happened earlier than announced
### Success Indicators
- ✅ Found CDN domain name (cloudcell.ea.com)
- ✅ Understood asset download flow
- ✅ Extracted all manifests
- ✅ Documented complete system
- ✅ Created preservation infrastructure
---
## 📧 Contact & Resources
**Your Setup:**
- Server: E:\rr3\
- Manifests: E:\rr3\RR3CommunityServer\RR3CommunityServer\Assets\manifests\
- APK: E:\rr3\realracing3.apk
- Download Script: E:\rr3\RR3CommunityServer\download-assets.ps1
**Community Resources:**
- RR3 Resurrection Discord
- Google Drive: https://drive.google.com/drive/folders/1EXJ1w5Sjsi8qNqip_I6cADzkDxmZ1UYl
---
**Status**: Investigation complete. EA CDN is offline.
**Next Action**: Contact RR3 Resurrection Discord for asset sources.
**Date**: February 18, 2026

View File

@@ -1,193 +0,0 @@
# 🔍 CDN URL Discovery - Critical Finding
## The Problem: CDN URL Not in APK
After thorough analysis:
- ❌ CDN URL is **NOT hardcoded** in the APK
- ❌ Not in config files (checked all .json, .bin, .xml)
- ❌ Not in game binary strings
- ❌ Not in smali bytecode
## The Solution: Dynamic Discovery via Director Service
### How RR3 Actually Works:
```
1. Game starts
2. Connects to EA Director Service
GET https://prod.director-services.firemonkeys.com.au/director
3. Director returns service URLs including:
{
"synergy.account": "https://...",
"synergy.commerce": "https://...",
"synergy.content": "https://ACTUAL-CDN-URL", ← THIS!
...
}
4. Game uses synergy.content URL to download assets
```
**The CDN URL is returned dynamically by EA's Director service!**
---
## 🎯 Two Approaches to Get the URL
### Approach 1: Intercept Live Game Traffic (BEST)
**Tools Needed:**
- mitmproxy, Charles Proxy, or Fiddler
- Android device with RR3 installed
- USB debugging enabled
**Steps:**
```bash
# 1. Install mitmproxy on PC
pip install mitmproxy
# 2. Start mitmproxy
mitmweb --listen-port 8080
# 3. Configure Android device proxy to PC's IP:8080
# 4. Install mitmproxy CA certificate on device
# 5. Launch Real Racing 3
# 6. Watch for Director service request/response
# 7. Look for "synergy.content" URL in the JSON response
```
**Expected Response:**
```json
{
"synergy.account": "https://prd1.echo.ea-mct-live.com/synergy/account",
"synergy.commerce": "https://prd1.echo.ea-mct-live.com/synergy/commerce",
"synergy.content": "https://[ACTUAL-CDN]/",
"synergy.social": "https://...",
...
}
```
### Approach 2: Call EA's Director Service Directly
**Try these Director URLs:**
```bash
# Primary (from binary strings)
curl https://prod.director-services.firemonkeys.com.au/director
# Alternatives
curl https://director.firemonkeys.com.au/director
curl https://prod1.director.ea.com/director
curl https://director-services.ea.com/director
```
**Expected JSON response will contain the CDN URL!**
---
## 🧪 Quick Test Script
```powershell
# Test EA Director Services
$directorUrls = @(
"https://prod.director-services.firemonkeys.com.au/director",
"https://director.firemonkeys.com.au/director",
"https://prod1.director.ea.com/director"
)
foreach ($url in $directorUrls) {
Write-Host "Testing: $url"
try {
$headers = @{
"User-Agent" = "RealRacing3/12.6.0 (Android)"
"X-App-Version" = "12.6.0"
}
$response = Invoke-RestMethod -Uri $url -Headers $headers
if ($response.'synergy.content') {
Write-Host "✅ FOUND CDN URL: $($response.'synergy.content')" -ForegroundColor Green
$response | ConvertTo-Json
}
} catch {
Write-Host "❌ Failed: $_"
}
}
```
---
## 📝 URLs Found in APK (for reference)
From binary analysis:
- `https://media.contentapi.ea.com` - EA content API (404 for direct asset access)
- `https://prd1.echo.ea-mct-live.com` - EA Echo services (account/commerce)
- `https://prd1.gevs.glulive.com` - Glu analytics (timeout)
**None of these are the asset CDN!** They're service endpoints.
---
## 🚀 Once We Have the CDN URL
Update the downloader:
```powershell
# Edit download-assets.ps1
$EaCdnBaseUrl = "https://[CDN-FROM-DIRECTOR]"
# Run downloader
.\download-assets.ps1 -TestMode # Test first
.\download-assets.ps1 # Download critical assets
```
---
## 🎯 Action Items
### Option A: You have Android device with RR3
1. Setup mitmproxy on your PC
2. Configure device to use proxy
3. Launch RR3 and capture Director response
4. Extract `synergy.content` URL
5. Update downloader script
6. Download assets while EA servers are up!
### Option B: No device available
1. Try calling Director service directly (test script above)
2. If that fails, wait for EA shutdown
3. Use community contributions approach
4. Players with the game installed extract from their devices
### Option C: Check our community server
Since we're building a replacement Director service:
1. When a real device connects to our server
2. We can capture what Director URL they expect
3. Or we can make up our own URL structure
4. Point it at our downloaded assets
---
## 💡 Key Insight
**The APK doesn't know the CDN URL - it discovers it at runtime!**
This is actually GOOD for our community server:
- We can return OUR OWN CDN URL from our Director
- Game will happily download from our server
- We control the entire asset delivery chain!
Our DirectorController should return:
```csharp
{
"synergy.content": "https://your-community-server.com/assets/",
...
}
```
Game downloads from YOUR server, problem solved! 🎉
---
**Next Step**: Try the test script above to call EA's Director directly, or setup mitmproxy to capture from a real device.

View File

@@ -1,249 +0,0 @@
# 🎯 CRITICAL FINDING: RR3 Asset System Uses "Cloudcell"
## Key Discovery
From analyzing the game binary (`libRealRacing3.so`), we found:
```
"Downloading from CDN has failed! NO Cloudcell"
"Download attempt %d of %d from CDN has failed"
"CC_AssetManager_Class::AssetDownloadError()"
```
**Real Racing 3 uses a system called "Cloudcell" for asset delivery!**
---
## What is Cloudcell?
**Cloudcell** appears to be Electronic Arts' internal content delivery network system. Based on the code references:
- `CC_AssetManager_Class` - "CC" likely stands for "Cloudcell"
- Downloads assets from a CDN
- Has retry logic for failed downloads
- Part of the game's asset management system
---
## How It Works
Based on our findings:
### 1. Game Flow
```
Game Starts
Contacts Director Service
Gets service URLs (including Cloudcell CDN URL)
Uses CC_AssetManager to download assets
Checks manifests (the 1,236 .txt files we found)
Downloads missing assets from Cloudcell CDN
```
### 2. Asset Manifest Format
We already have all the manifests! Each lists:
```
/path/to/asset<TAB>md5hash<TAB>compressed_size<TAB>uncompressed_size
```
### 3. CDN URL Structure (Likely)
```
https://[cloudcell-domain]/[asset-path]
```
Example:
```
Manifest: /data/events.dat.nct
CDN URL: https://[cloudcell-cdn]/data/events.dat.nct
```
---
## Possible Cloudcell CDN Domains
Based on EA's infrastructure patterns, try:
1. **Cloudcell-specific:**
- `https://cloudcell.ea.com`
- `https://cdn-cloudcell.ea.com`
- `https://cloudcell-cdn.ea.com`
- `https://assets.cloudcell.ea.com`
2. **RR3-specific:**
- `https://rr3-assets.ea.com`
- `https://cdn-rr3.ea.com`
- `https://realracing3-assets.ea.com`
3. **CloudFront (AWS):**
- `https://d[random-id].cloudfront.net`
- EA likely uses AWS CloudFront for Cloudcell
4. **Akamai:**
- `https://[id].akamaihd.net`
- EA also uses Akamai for CDN
---
## Testing Script
```powershell
# Test possible Cloudcell CDN URLs
$possibleCdns = @(
"https://cloudcell.ea.com",
"https://cdn-cloudcell.ea.com",
"https://rr3-assets.ea.com",
"https://cdn-rr3.ea.com",
"https://realracing3-cdn.ea.com"
)
# Try downloading a known asset from manifests
$testAsset = "/0.dat" # First asset from asset_list_base.txt
foreach ($cdn in $possibleCdns) {
$url = "$cdn$testAsset"
Write-Host "Testing: $url"
try {
$response = Invoke-WebRequest -Uri $url -Method Head -TimeoutSec 10
Write-Host " ✅ SUCCESS! Found: $cdn" -ForegroundColor Green
break
} catch {
Write-Host " ❌ Failed" -ForegroundColor Red
}
}
```
---
## Alternative: Network Capture
Since the CDN URL isn't hardcoded, we MUST capture it from a live game session:
### Method 1: mitmproxy (Best)
```bash
# Install
pip install mitmproxy
# Run
mitmproxy --mode transparent --showhost
# Configure Android device to use proxy
# Launch RR3
# Capture the Cloudcell CDN URL from traffic
```
### Method 2: tcpdump on rooted device
```bash
adb shell
su
tcpdump -i wlan0 -w /sdcard/rr3-traffic.pcap
# Launch RR3
# Stop capture
# Analyze with Wireshark
```
### Method 3: Hosts file redirect (Advanced)
```bash
# Add to Android hosts file (/system/etc/hosts)
# Redirect potential domains to your PC running Wireshark
# See which domain the game tries to contact
```
---
## For Community Server
**Good news:** We control the Director service!
Our `DirectorController.cs` can return ANY URL for `synergy.content`:
```csharp
[HttpGet("director")]
public IActionResult GetServiceUrls()
{
var baseUrl = $"{Request.Scheme}://{Request.Host}";
return Ok(new
{
serverUrls = new Dictionary<string, string>
{
{ "synergy.content", $"{baseUrl}/assets/" }, // OUR CDN!
...
}
});
}
```
Then create `/assets/` endpoint that serves files from:
```
RR3CommunityServer/Assets/downloaded/
```
**The game will download from YOUR server instead of EA's!**
---
## Current Status
**Found:** Cloudcell asset delivery system
**Have:** All 1,236 asset manifests
**Know:** Asset download flow
**Missing:** Actual Cloudcell CDN URL
---
## Next Steps
### Option A: Network Capture (Recommended)
1. Setup mitmproxy
2. Configure Android device
3. Launch RR3
4. Capture Cloudcell CDN URL
5. Update downloader script
6. Download all assets (2-5 GB)
### Option B: Serve from Community Server
1. Don't download from EA
2. Let community members extract from their devices
3. Upload to community server via web panel
4. Our Director returns our server URL
5. Game downloads from us!
### Option C: Hybrid
1. Try to find Cloudcell URL with network capture
2. Download critical assets (~500 MB)
3. After EA shutdown, crowdsource the rest
4. Complete preservation over time
---
## Key Insight
**Real Racing 3 uses "Cloudcell" - EA's internal CDN system!**
The URL is provided dynamically by the Director service, not hardcoded in the APK. This is actually GREAT for us because:
1. We control the Director in our community server
2. We can point it at OUR asset storage
3. Game will happily download from us
4. No need to find EA's CDN if we have the assets!
---
## Files to Reference
- Binary strings: `libRealRacing3.so` (31.5 MB)
- Asset manifests: `E:\rr3\RR3CommunityServer\RR3CommunityServer\Assets\manifests\` (1,236 files)
- Downloader: `E:\rr3\RR3CommunityServer\download-assets.ps1`
---
**Conclusion:** The CDN URL is NOT in the APK. We need to either:
1. Capture it from live game traffic, OR
2. Serve assets from our own community server (recommended!)
The second option is actually BETTER for long-term preservation! 🎮💾

View File

@@ -1,435 +0,0 @@
# RR3 Community Server - Complete Solution Summary
## ✅ What's Been Created
You now have a **complete Real Racing 3 community server solution** consisting of three main components:
### 1. 🔍 Reverse-Engineered Protocol Documentation
- **Complete network analysis** of RR3's communication with EA's servers
- Detailed documentation of 12 API endpoints
- Authentication flow and header requirements
- SSL/certificate validation behavior
- File: `NETWORK_COMMUNICATION_ANALYSIS.md` (13,000 words)
### 2. 🖥️ ASP.NET Core Community Server
- **Full-featured .NET 8 server** that emulates EA's Synergy backend
- 12 REST API endpoints across 5 controllers
- SQLite database with Entity Framework Core
- Session management with 24-hour expiration
- Auto-approved purchases for community play
- **NEW: Web admin panel** for server management
### 3. 🎮 APK Modification System
- **Built-in support discovered** in RR3 for custom servers
- Automated PowerShell script for APK modification
- No code changes needed - just manifest configuration
- Side-by-side installation with official game
- File: `RR3-Community-Mod.ps1` (320 lines)
### 4. 🌐 Web Administration Panel
- **Beautiful, responsive web interface** for managing the server
- Dashboard with real-time statistics
- User management (view, search, delete)
- Catalog management (add, edit, enable/disable items)
- Session monitoring and cleanup
- Purchase history tracking
- Server settings and configuration
- Built with Bootstrap 5 and modern design
## 📦 What You Can Do Now
### Start the Server
```powershell
cd E:\rr3\RR3CommunityServer\RR3CommunityServer
dotnet run
```
### Access Web Panel
Open browser to: **http://localhost:5000**
### Connect Game Clients
```powershell
cd E:\rr3
.\RR3-Community-Mod.ps1 -ServerUrl "http://your-server-ip:5000"
```
### Test with Swagger API
Open: **http://localhost:5000/swagger**
## 🗂️ Complete File Index
### Documentation (42,000+ words)
```
E:\rr3\
├── NETWORK_COMMUNICATION_ANALYSIS.md (13,000 words - Protocol docs)
├── APK_MODIFICATION_GUIDE.md (14,000 words - APK modification)
├── APK_MODIFICATION_SUMMARY.md (12,000 words - Quick overview)
├── PROJECT_INDEX.md (Master navigation file)
└── RR3-Community-Mod.ps1 (Automated APK tool)
```
### Server Code
```
E:\rr3\RR3CommunityServer\RR3CommunityServer\
├── Program.cs (ASP.NET Core setup)
├── appsettings.json (Configuration)
├── Controllers/
│ ├── DirectorController.cs (Service discovery)
│ ├── UserController.cs (Device/user management)
│ ├── ProductController.cs (Item catalog)
│ ├── DrmController.cs (Purchase/DRM)
│ └── TrackingController.cs (Analytics)
├── Services/
│ ├── IServices.cs (Service interfaces)
│ └── ServiceImplementations.cs (Business logic)
├── Data/
│ └── RR3DbContext.cs (Database + entities)
├── Models/
│ └── ApiModels.cs (DTOs)
├── Middleware/
│ └── SynergyMiddleware.cs (Headers/auth)
└── Pages/ (Web admin panel)
├── Admin.cshtml (Dashboard)
├── Users.cshtml (User management)
├── Catalog.cshtml (Catalog management)
├── Sessions.cshtml (Session monitoring)
├── Purchases.cshtml (Purchase history)
├── Settings.cshtml (Server settings)
├── _Layout.cshtml (Master layout)
└── *.cshtml.cs (Code-behind files)
```
### Server Documentation
```
E:\rr3\RR3CommunityServer\
├── README.md (Project overview)
├── IMPLEMENTATION_GUIDE.md (15,000 words - Setup guide)
├── PROJECT_SUMMARY.md (Technical summary)
├── COMPLETE_SOLUTION.md (Verification guide)
├── QUICK_REFERENCE.md (Quick reference card)
└── WEB_PANEL_GUIDE.md (NEW - Web panel docs)
```
## 🎯 Key Features Implemented
### Web Admin Panel Features
**Dashboard**
- Real-time statistics (users, sessions, devices, items)
- Recent activity feed
- Server information panel
- Quick action buttons
**User Management**
- View all registered users
- Search by Synergy ID or Device ID
- View detailed user information
- Delete user accounts
**Catalog Management**
- Add new catalog items (cars, upgrades, currency, consumables)
- Edit existing items (SKU, name, type, price)
- Toggle item availability (enable/disable)
- Delete items
- Visual categorization
**Session Management**
- View active and expired sessions
- Real-time countdown for session expiration
- Terminate sessions manually
- Bulk cleanup of expired sessions
- Color-coded status indicators
**Purchase History**
- View all in-game purchases
- Search by SKU or User ID
- Purchase statistics dashboard
- Detailed purchase information
- Delete purchase records
**Server Settings**
- Server configuration display
- APK modification instructions with copy-paste commands
- System information (OS, .NET version, memory, uptime)
- Database statistics
- Quick links to documentation
- Database reset functionality (danger zone)
### Server API Features
**12 RESTful endpoints** matching EA's Synergy protocol
**Director service** for service discovery
**User service** for device/user registration
**Product service** for item catalog
**DRM service** for purchase validation
**Tracking service** for analytics (stub)
**Session management** with 24-hour expiration
**SQLite persistence** with Entity Framework Core
**Custom middleware** for Synergy headers
**Swagger documentation** for API testing
**CORS support** for web clients
**Auto-approved purchases** for community servers
### APK Modification Features
**Automated PowerShell script** for one-command modification
**Decompile, modify, recompile, sign** - all automated
**Custom server URL injection** via metadata
**Side-by-side installation** (different package name)
**Manual modification guide** as alternative
**Tool detection and download** (APKTool, Uber APK Signer)
## 🌟 What Makes This Special
### 1. Built-In Custom Server Support
Unlike other game reverse engineering projects, RR3 **already has built-in support** for custom servers. We didn't need to patch code - just change a configuration flag in `AndroidManifest.xml`. This means:
- ✅ No fragile code patches
- ✅ Works across RR3 versions
- ✅ Clean, maintainable solution
- ✅ No security compromise
### 2. Complete Documentation
Over **42,000 words** of comprehensive documentation covering:
- Every aspect of the protocol
- Step-by-step implementation guides
- APK modification procedures
- Troubleshooting guides
- Quick reference cards
### 3. Production-Ready Architecture
- Proper separation of concerns (Controllers → Services → Data)
- Dependency injection throughout
- Entity Framework with migrations support
- Middleware pipeline for cross-cutting concerns
- Swagger for API documentation
- Modern Razor Pages for web UI
### 4. Cross-Platform Support
- ✅ Runs on **Windows, Linux, macOS**
- ✅ .NET 8 for maximum compatibility
- ✅ SQLite for zero-config database
- ✅ Can be containerized with Docker
- ✅ Can be hosted on any ASP.NET Core platform
### 5. Beautiful, Modern Web UI
- Responsive Bootstrap 5 design
- Racing-themed color scheme
- Intuitive navigation
- Real-time statistics
- Modal dialogs for details
- Search and filter functionality
- Mobile-friendly layout
## 🚀 Deployment Options
### Option 1: Local Development (Current)
```powershell
cd E:\rr3\RR3CommunityServer\RR3CommunityServer
dotnet run
```
Access at: `http://localhost:5000`
### Option 2: Production Windows Server (IIS)
1. Publish: `dotnet publish -c Release`
2. Install IIS and ASP.NET Core Module
3. Create IIS site pointing to publish folder
4. Configure bindings and SSL
### Option 3: Linux Server (systemd + Kestrel)
```bash
dotnet publish -c Release
# Copy to /var/www/rr3server
# Create systemd service
# Configure nginx reverse proxy
```
### Option 4: Docker Container
```dockerfile
FROM mcr.microsoft.com/dotnet/aspnet:8.0
COPY publish/ /app
WORKDIR /app
ENTRYPOINT ["dotnet", "RR3CommunityServer.dll"]
```
### Option 5: Cloud Hosting
- **Azure App Service** - Native .NET hosting
- **AWS Elastic Beanstalk** - Container or native
- **Google Cloud Run** - Containerized
- **DigitalOcean App Platform** - Git-based deploy
- **Heroku** - With buildpack
## 📊 Database Schema
```
Devices
├── Id (PK)
├── DeviceId (unique)
├── HardwareId
├── CreatedAt
└── LastSeenAt
Users
├── Id (PK)
├── SynergyId (unique)
├── DeviceId
├── CreatedAt
└── Nickname
Sessions
├── Id (PK)
├── SessionId (unique UUID)
├── SynergyId
├── DeviceId
├── UserId (nullable)
├── CreatedAt
└── ExpiresAt (CreatedAt + 24h)
Purchases
├── Id (PK)
├── SynergyId
├── ItemId
├── Sku
├── OrderId
├── PurchaseTime
├── Token
├── Price
├── Status
└── UserId (nullable)
CatalogItems
├── Id (PK)
├── Sku (unique)
├── Name
├── Type (car/upgrade/currency/consumable)
├── Price
└── Available (boolean)
```
## 🔒 Security Considerations
### Current State (Development)
⚠️ **No authentication** on web panel
⚠️ **HTTP only** (no SSL)
⚠️ **Open access** to all endpoints
⚠️ **Swagger UI enabled**
⚠️ **Debug logging active**
### For Production
Before going live, implement:
1.**Add authentication** (ASP.NET Identity, OAuth, JWT)
2.**Enable HTTPS** (Let's Encrypt, commercial cert)
3.**Firewall rules** (restrict admin panel access)
4.**Rate limiting** (prevent abuse)
5.**Input validation** (sanitize user input)
6.**SQL injection protection** (EF Core provides this)
7.**Disable Swagger** in production builds
8.**Logging** (Application Insights, Serilog)
9.**Backup strategy** (database backups)
10.**Monitoring** (health checks, alerts)
## 🎓 How It Works
### Game Boot Flow
1. **Game starts** → Reads `AndroidManifest.xml`
2. **Finds custom config**`NimbleConfiguration.CUSTOMIZED`
3. **Reads server URL** → From `NimbleCustomizedSynergyServerEndpointUrl` metadata
4. **Calls director**`GET /synergy/director`
5. **Gets service URLs** → Receives map of all services
6. **Makes API calls** → To various services as needed
### Web Panel Flow
1. **User opens browser**`http://server:5000`
2. **Root redirects** → To `/admin`
3. **Dashboard loads** → Fetches stats from database
4. **User navigates** → To Users, Catalog, Sessions, etc.
5. **CRUD operations** → Via POST handlers in Razor Pages
6. **Database updates** → Via Entity Framework Core
7. **Page reloads** → Shows updated data
### APK Modification Flow
1. **Run script**`.\RR3-Community-Mod.ps1 -ServerUrl "http://server:5000"`
2. **Downloads tools** → APKTool, Uber APK Signer (if needed)
3. **Decompiles APK**`apktool d realracing3.apk`
4. **Modifies manifest** → Changes config to "custom", adds URL metadata
5. **Recompiles APK**`apktool b`
6. **Signs APK** → With debug or custom keystore
7. **Optionally installs**`adb install`
8. **Done!** → Game connects to your server
## 📈 What's Next?
### Immediate Next Steps
1.**Test the web panel** - Explore all features
2.**Add catalog items** - Populate with cars and upgrades
3.**Modify an APK** - Connect a game client
4.**Monitor activity** - Watch the dashboard
### Future Enhancements (Optional)
- [ ] Add authentication to web panel
- [ ] Implement proper DRM validation
- [ ] Add player progression tracking
- [ ] Create leaderboards
- [ ] Add multiplayer race sessions
- [ ] Implement time trials
- [ ] Add event management
- [ ] Create mod support
- [ ] Add telemetry visualization
- [ ] Build mobile app for admin
- [ ] Add Discord integration
- [ ] Create backup/restore tools
- [ ] Add multi-server support
- [ ] Implement CDN for assets
## 🏆 Achievement Unlocked
You now have:
- ✅ A fully functional RR3 community server
- ✅ Complete protocol documentation
- ✅ Automated APK modification tools
- ✅ Beautiful web administration panel
- ✅ Professional-grade code architecture
- ✅ Comprehensive documentation (50,000+ words!)
- ✅ Cross-platform compatibility
- ✅ Production deployment options
## 📞 Support & Resources
### Documentation Files
- **Protocol**: `NETWORK_COMMUNICATION_ANALYSIS.md`
- **Server Setup**: `IMPLEMENTATION_GUIDE.md`
- **APK Modification**: `APK_MODIFICATION_GUIDE.md`
- **Web Panel**: `WEB_PANEL_GUIDE.md`
- **Quick Reference**: `QUICK_REFERENCE.md`
- **Navigation**: `PROJECT_INDEX.md`
### Quick Commands
```powershell
# Start server
dotnet run
# Build project
dotnet build
# Modify APK
.\RR3-Community-Mod.ps1 -ServerUrl "http://192.168.1.100:5000"
# View API docs
Start-Process "http://localhost:5000/swagger"
# View web panel
Start-Process "http://localhost:5000"
```
## 🎉 Conclusion
This is a **complete, production-ready solution** for hosting your own Real Racing 3 community server. The combination of:
- Reverse-engineered protocol knowledge
- Professional server implementation
- Automated client modification
- **Beautiful web administration interface**
...makes this one of the most comprehensive game preservation projects available.
**Enjoy your private RR3 server! 🏎️💨**
---
*Created for game preservation, educational purposes, and the RR3 community*
*Made with ❤️ and lots of reverse engineering*

View File

@@ -1,379 +0,0 @@
# 🚨 EMERGENCY: EA CDN ASSET CAPTURE GUIDE
**DATE:** 2026-02-18
**STATUS:** 🔴 **TIME-SENSITIVE PRESERVATION EMERGENCY**
**PRIORITY:** 🔥 **CRITICAL - ACT NOW**
---
## 🎯 SITUATION
The EA CDN is **STILL ALIVE** and serving RR3 assets!
- ✅ Game is downloading assets RIGHT NOW
- ⚠️ EA may shut down CDN at ANY TIME
- 🚨 This is our ONLY CHANCE to get official assets
- ⏱️ March 2026 shutdown - could be pulled early
**WE NEED TO MIRROR EVERYTHING BEFORE IT'S TOO LATE!**
---
## 📱 STEP 1: CAPTURE THE CDN TRAFFIC
### Option A: HTTP Canary (EASIEST - ANDROID)
**Download:**
- Google Play Store: "HTTP Canary" (free)
- Or: "Packet Capture" app
**Setup:**
```
1. Install HTTP Canary
2. Open app
3. Tap "Target Applications" → Select "Real Racing 3"
4. Return to main screen
5. Tap the play button (starts VPN mode)
6. Switch to RR3 and let it download
7. Return to HTTP Canary
8. Tap stop button
9. View captured requests
10. Export/Share the session
```
**What to Look For:**
```
- Any URLs starting with:
• cloudcell.ea.com
• cdn.ea.com
• s3.amazonaws.com
• cloudfront.net
- Files ending with:
• .pak
• .pka
• .manifest
• .z (ZLIB compressed)
• .json
```
---
### Option B: Charles Proxy (DESKTOP + PHONE)
**Download:** https://www.charlesproxy.com/
**Setup:**
```
1. Install Charles on PC
2. Start Charles
3. Note your PC's IP address
4. On phone WiFi settings:
- Set HTTP Proxy to MANUAL
- Hostname: [Your PC IP]
- Port: 8888
5. Install Charles SSL cert on phone:
- Open browser on phone
- Go to chls.pro/ssl
- Download and install cert
6. In Charles: Proxy → SSL Proxying Settings
- Add: *cloudcell.ea.com:443
- Add: *.ea.com:443
7. Run RR3 on phone
8. Watch traffic in Charles
9. File → Export Session (save everything)
```
---
### Option C: mitmproxy (TECHNICAL)
**Install:**
```bash
# Ubuntu/Debian
sudo apt install mitmproxy
# macOS
brew install mitmproxy
# Windows
pip install mitmproxy
```
**Run:**
```bash
# Start proxy
mitmproxy -p 8888 --set block_global=false
# Or web interface:
mitmweb -p 8888
# Configure phone proxy to PC IP:8888
# Install cert from mitm.it on phone
```
---
### Option D: ADB tcpdump (ROOT REQUIRED)
```bash
# Connect phone via USB
adb devices
# Start packet capture
adb shell
su
tcpdump -i any -w /sdcard/rr3_traffic.pcap
# Let RR3 download assets
# Stop with Ctrl+C
# Pull capture file
exit
adb pull /sdcard/rr3_traffic.pcap
# Analyze with Wireshark
wireshark rr3_traffic.pcap
```
---
## 📋 STEP 2: DOCUMENT THE URLS
Once you capture traffic, send me:
1. **CDN Base URL**
```
Example: https://cloudcell.ea.com/rr3/assets/
```
2. **Manifest URL**
```
Example: https://cloudcell.ea.com/rr3/manifest.json
```
3. **Sample Asset URLs**
```
Example:
https://cloudcell.ea.com/rr3/assets/cars/car_001.pak
https://cloudcell.ea.com/rr3/assets/tracks/track_spa.pak
```
4. **Any authentication/headers required**
```
X-EA-Auth: [token]
X-Game-Version: [version]
etc.
```
---
## 💾 STEP 3: DOWNLOAD EVERYTHING
### Quick Script (Once We Have URLs)
I'll create a script to:
```bash
#!/bin/bash
# Mass download all RR3 assets
CDN_BASE="https://cloudcell.ea.com/rr3"
OUTPUT_DIR="rr3-assets-mirror"
# Download manifest
wget "$CDN_BASE/manifest.json" -O manifest.json
# Parse manifest and download all files
# (We'll generate this based on your captures)
# Download all .pak files
wget -r -np -nH --cut-dirs=2 \
-A pak,pka,z,json \
-e robots=off \
"$CDN_BASE/assets/"
```
---
## 🔍 WHAT TO CAPTURE
### Priority Files:
```
1. Asset manifest (CRITICAL)
- Lists all game assets
- File hashes/versions
- Download locations
2. Car assets (.pak)
- All car models
- Textures
- Physics data
3. Track assets (.pak)
- All track models
- Environment data
- Textures
4. UI assets (.pak)
- Sprites
- Fonts
- Menu graphics
5. Audio assets
- Engine sounds
- Music
- SFX
6. Game data
- Car specifications
- Upgrade data
- Event configurations
```
---
## 🚀 STEP 4: UPLOAD TO ARCHIVE
Once we have everything:
```
1. Create archive:
tar -czf rr3-assets-$(date +%Y%m%d).tar.gz rr3-assets-mirror/
2. Upload to:
- Internet Archive (archive.org)
- GitHub Release (if <2GB)
- Your own hosting
- Google Drive
- IPFS
3. Share with community:
- RR3 Resurrection Discord
- r/RealRacing3 Reddit
- Archive.org metadata
```
---
## ⏱️ TIMELINE
```
NOW: Capture traffic (THIS STEP!)
+1 hour: Document all URLs
+2 hours: Create download script
+4 hours: Start mass download
+24 hours: Complete mirror
+48 hours: Upload to archive
```
**DO NOT WAIT!** EA could shut down CDN at any moment!
---
## 📱 QUICK START (RIGHT NOW!)
```
1. Open phone settings
2. Go to Google Play Store
3. Search "HTTP Canary"
4. Install
5. Open HTTP Canary
6. Select RR3 as target
7. Start capture (play button)
8. Switch to RR3
9. Let it download
10. Switch back to HTTP Canary
11. Stop capture
12. Screenshot ALL the URLs you see
13. Send screenshots to me!
```
---
## 🔴 QUESTIONS TO ANSWER
1. **What URLs do you see in the traffic?**
- CDN domain?
- Paths?
- File extensions?
2. **Are downloads HTTPS or HTTP?**
- Need to know for capture
3. **How much is downloading?**
- MB? GB?
- How many files?
4. **Does game show progress?**
- "Downloading X MB"
- File names visible?
5. **Where is it saving files on phone?**
- /sdcard/Android/data/com.ea.games.r3_row/
- Check with file manager
---
## 💡 PRO TIP: CHECK PHONE STORAGE NOW!
```
adb shell
# Find RR3 data directory
cd /sdcard/Android/data/com.ea.games.r3_row/files/
# List downloaded files
ls -lh
# Look for:
# - .pak files
# - .pka files
# - .z files
# - manifest files
# Copy from phone to PC:
adb pull /sdcard/Android/data/com.ea.games.r3_row/files/ ./rr3-phone-assets/
```
**IF THE FILES ARE ALREADY ON YOUR PHONE, WE CAN EXTRACT THEM DIRECTLY!**
---
## 🎯 IMMEDIATE ACTIONS (RIGHT NOW!)
```
☐ 1. Install HTTP Canary on phone
☐ 2. Start capture
☐ 3. Let RR3 download assets
☐ 4. Screenshot ALL URLs
☐ 5. Check phone storage for downloaded files
☐ 6. Send me:
- Screenshots of URLs
- List of files on phone
- How much downloaded (MB/GB)
```
---
## 🔥 THIS IS IT!
This is our **ONE CHANCE** to preserve Real Racing 3 properly!
**The CDN being alive is a GIFT.** We must act NOW!
I'll help you:
1. Analyze the traffic
2. Create download scripts
3. Mirror everything
4. Upload to permanent storage
5. Share with community
**But we need to start RIGHT NOW before EA pulls the plug!**
---
**Status:** 🔴 **WAITING FOR YOUR TRAFFIC CAPTURES**
Send me screenshots or text dump of the URLs you see in HTTP Canary!
🏁 LET'S SAVE THIS GAME! 🏁

View File

@@ -1,265 +0,0 @@
# 🎯 HAR FILE ANALYSIS RESULTS
**File:** pin-river.data.ea.com_2026_02_18_10_37_48.har
**Size:** 2.46 MB
**Requests:** 2,355 HTTP requests captured
**Date:** 2026-02-18
---
## ✅ KEY DISCOVERIES
### 1. CDN Domain Found! 🎉
**Primary Asset CDN:**
```
firemonkeys.akamaized.net
```
- **What it is:** Akamai CDN (Content Delivery Network)
- **Purpose:** Hosts Real Racing 3 game assets
- **Connections:** 30+ HTTPS connections captured
- **Status:** ✅ **STILL ACTIVE**
---
### 2. EA Server Domains
#### Core Services:
```
gateway.ea.com - API Gateway
syn-dir.sn.eamobile.com - Synergy Director (routing)
product.sn.eamobile.com - Product Catalog (IAP)
user.sn.eamobile.com - User Management
```
#### Analytics/Telemetry:
```
pin-river.data.ea.com - Analytics
river-mobile.data.ea.com - Mobile analytics
```
#### Other Services:
```
0037-connect.cloudcell.com - Connection service
ping1.tnt-ea.com - Network monitoring
```
---
## 📊 Traffic Analysis
### HTTP Methods:
- **CONNECT:** 2,355 (100%)
- All HTTPS tunnel setups
- Actual content was encrypted
### Status Codes:
- **200 OK:** 2,352 (99.9%)
- **0 (No Response):** 3 (0.1%)
### What This Means:
- ✅ Connections successful
- ⚠️ Actual asset URLs not captured (HTTPS encrypted)
- ✅ We know the CDN domain
- ❓ Need to find asset paths
---
## 🔍 What We DON'T Have Yet
### Missing Information:
```
❌ Exact asset URLs (e.g., /rr3/cars/car_001.pak)
❌ Asset manifest URL
❌ File directory structure
❌ Authentication headers (if any)
```
### Why:
The HAR was captured by an HTTP proxy that couldn't decrypt HTTPS traffic. It only saw the connection setup (CONNECT method), not the actual data transfer.
---
## 🎯 NEXT STEPS
### Step 1: Check Downloaded Files on Phone
**Go to:**
```
Settings → Apps → Real Racing 3 → Storage
```
**Tell me:**
- Total size (e.g., "2.5 GB")
- Cache size
- Data size
### Step 2: Access Files with File Manager
**Navigate to:**
```
Internal Storage/Android/data/com.ea.games.r3_row/files/
```
**Look for:**
- `.pak` files (packed assets)
- `.pka` files (packed assets alternate)
- `.z` files (compressed)
- `.dat` files (data)
- `.bin` files (binary)
- `manifest` or `.json` files
**Send me:**
- Screenshots of file list
- Or file names via text
### Step 3: Transfer Files to Server
**Best methods:**
**USB + ADB:**
```bash
adb devices
adb pull /sdcard/Android/data/com.ea.games.r3_row/files/ E:\rr3\phone-assets\
```
**Cloud Upload:**
- Google Drive (you already use this)
- Upload folder to Drive
- Download on OVH server
---
## 🔬 Asset URL Discovery Methods
### Method A: Reverse Engineer APK (Already Done)
```
✅ APK decompiled at E:\rr3\decompiled\
❓ Search for asset URL patterns
```
### Method B: Inspect Downloaded Files
```
- Manifest files may contain URLs
- Config files may have CDN paths
- We have extraction tools ready
```
### Method C: Test Common Patterns
```
Try URLs like:
https://firemonkeys.akamaized.net/rr3/assets/[filename]
https://firemonkeys.akamaized.net/realracing3/[filename]
https://firemonkeys.akamaized.net/mobile/rr3/[filename]
```
### Method D: HTTPS Decryption Capture
```
- Install mitmproxy with SSL cert on phone
- Recapture with decryption
- See actual asset URLs
(Only if needed - files on phone might be enough!)
```
---
## 💡 Probable Asset Structure
Based on typical EA/Akamai CDN patterns:
```
https://firemonkeys.akamaized.net/
├── rr3/
│ ├── manifest.json
│ ├── assets/
│ │ ├── cars/
│ │ │ ├── car_001.pak
│ │ │ ├── car_002.pak
│ │ │ └── ...
│ │ ├── tracks/
│ │ │ ├── track_spa.pak
│ │ │ └── ...
│ │ └── ui/
│ │ └── ...
│ └── version.txt
```
---
## 🚨 CRITICAL: Files Already Downloaded!
**The game already downloaded assets to your phone!**
These files are sitting in:
```
/sdcard/Android/data/com.ea.games.r3_row/files/
```
**We can:**
1. ✅ Copy files from phone NOW
2. ✅ Preserve what's already downloaded
3. ✅ Analyze to find URL patterns
4. ✅ Mirror remaining assets (if any)
**No need to re-download if files are already there!**
---
## 📋 ACTION ITEMS
### Immediate (DO NOW):
```
☐ Check phone: Settings → Apps → RR3 → Storage (how many GB?)
☐ Open file manager: Android/data/com.ea.games.r3_row/files/
☐ Screenshot or list files found
☐ Tell me file names and sizes
```
### Next (Once we know what you have):
```
☐ Transfer files to OVH server
☐ Analyze file structure
☐ Find asset manifest
☐ Mirror remaining files from firemonkeys.akamaized.net
☐ Preserve everything to Internet Archive
```
---
## 🎯 What We've Learned
### ✅ Confirmed:
- CDN is alive: `firemonkeys.akamaized.net`
- EA servers operational
- Game successfully downloaded assets
- HTTPS encryption prevents easy URL capture
### ❓ Unknown:
- Exact asset URLs
- Total asset count
- Manifest location
- Authentication requirements
### 🎯 Goal:
- Get files from phone → server
- Analyze structure
- Mirror CDN
- Preserve forever
---
## 💬 Reply With:
**Right now, tell me:**
1. **Phone storage:** "Settings shows RR3 is using [X] GB"
2. **Files visible:** "I can see [description] in file manager"
3. **Transfer method:** "I prefer [USB/Cloud/FTP]"
Then we'll proceed with preservation! 🏁
---
**Status:** 🟡 **Waiting for file information from phone**
**Next:** Transfer and preserve downloaded assets!

View File

@@ -1,389 +0,0 @@
# Real Racing 3 - Network Communication Analysis
## Overview
Real Racing 3 uses a **custom HTTP/HTTPS-based communication system** built on top of EA's proprietary "CloudCell API" and "Nimble SDK" frameworks. The app communicates with EA's backend servers using JSON over HTTPS with custom authentication headers.
---
## 1. Core Network Architecture
### 1.1 HTTP Request System
**Location**: `com.firemonkeys.cloudcellapi.HttpRequest` and `HttpThread`
**Key Components**:
- **HttpRequest**: Main request manager with native JNI callbacks
- **HttpThread**: Worker thread that executes the actual HTTP operations
- **CloudcellTrustManager**: Custom SSL/TLS certificate validation
**Implementation Details**:
```java
// Request initialization from native code
public void init(String userAgent, String method, String url,
byte[] data, int readCapacity, long callbackPointer,
boolean failOnError, double serverTime,
boolean sslCheck, boolean addDefaultHeaders,
int timeoutSeconds)
```
**Key Features**:
- Uses `HttpURLConnection` (standard Java HTTP client)
- Wrapped with Firebase Performance monitoring (`FirebasePerfUrlConnection`)
- Custom user agent combining app version + system HTTP agent
- SSL/TLS 1.2+ with custom certificate validation
- Native callbacks for data streaming (header, data, error, complete)
- Configurable timeouts (default: 30 seconds)
- Support for HTTP methods: GET, POST, PUT, DELETE
### 1.2 SSL/TLS Configuration
**Location**: `com.firemonkeys.cloudcellapi.CloudcellTrustManager` & `TLSSocketFactory`
**Security Setup**:
```java
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, new TrustManager[]{new CloudcellTrustManager(this)}, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(new TLSSocketFactory(sslContext.getSocketFactory()));
HttpsURLConnection.setDefaultHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
```
**Certificate Validation**:
- Custom X509TrustManager implementation
- Validates certificate expiration against server-provided time
- Can be optionally disabled (m_bSSLCheck flag)
- **NOTE**: Uses `ALLOW_ALL_HOSTNAME_VERIFIER` (accepts any hostname!)
---
## 2. Server Infrastructure
### 2.1 Primary API Servers
**Synergy Director Servers** (EA's service orchestration layer):
- **Production (LIVE)**: `https://syn-dir.sn.eamobile.com`
- **Staging**: `https://director-stage.sn.eamobile.com`
- **Integration (INT)**: `https://director-int.sn.eamobile.com`
The "Director" server provides configuration that routes the client to specialized service endpoints.
### 2.2 Network Reachability Test URLs
Located in EA Nimble SDK:
- Primary: `https://ping1.tnt-ea.com`
- Backup: `https://www.google.com`
Used to detect if the device has internet connectivity before making API calls.
### 2.3 API Endpoint Structure
**Base Pattern**: `https://<director-host>/<service>/api/<platform>/<endpoint>`
**Example Endpoints**:
| Endpoint Path | Purpose |
|---------------|---------|
| `/director/api/android/getDirectionByPackage` | Get service configuration/routing |
| `/user/api/android/getDeviceID` | Retrieve unique device ID |
| `/user/api/android/validateDeviceID` | Validate existing device ID |
| `/user/api/android/getAnonUid` | Generate anonymous user ID |
| `/product/api/core/getAvailableItems` | Fetch in-game item catalog |
| `/product/api/core/getMTXGameCategories` | Get microtransaction categories |
| `/product/api/core/getDownloadItemUrl` | Get download URLs for assets |
| `/drm/api/core/getNonce` | Get DRM nonce for validation |
| `/drm/api/core/getPurchasedItems` | Retrieve purchase history |
| `/drm/api/android/verifyAndRecordPurchase` | Verify and record IAP purchases |
| `/tracking/api/core/logEvent` | Submit analytics/telemetry events |
---
## 3. Authentication & Authorization
### 3.1 HTTP Headers
**Standard Headers**:
- `User-Agent`: `<AppIdentifier> <SystemHttpAgent>`
- `Content-Type`: `application/json` or `application/x-www-form-urlencoded`
- `Content-Length`: Auto-calculated for POST/PUT requests
**EA Custom Headers** (from Nimble SDK):
- `EAM-SESSION`: Session ID (UUID generated per app session)
- `EAM-USER-ID`: Synergy user ID (persistent user identifier)
- `EA-SELL-ID`: Marketplace/seller ID (e.g., Google Play, App Store)
- `SDK-VERSION`: EA Nimble SDK version string
- `SDK-TYPE`: "Nimble" (framework identifier)
### 3.2 Device & User Identification
**Multiple ID Types Used**:
1. **EA Device ID** (`eADeviceId`)
- Generated on first launch
- Persisted in shared preferences
- Used for device-level tracking
2. **EA Hardware ID** (`eAHardwareId`)
- Derived from device hardware characteristics
- More persistent than device ID
3. **Synergy ID**
- Primary user account identifier
- Links game progress across devices
- Required for cloud save/sync
4. **Anonymous UID**
- Fallback identifier for users without accounts
- Used for analytics before login
5. **Google/Facebook OAuth Tokens**
- For social login integration
- Google Web Client ID: `1056053393768-2irtr6olub9uil5dsp16apf9p5f0ge0k.apps.googleusercontent.com`
### 3.3 Session Management
**Session Flow**:
1. App launches → Generate session UUID
2. Contact Director server → Get service configuration
3. Retrieve/validate device ID → Get or create EA Device ID
4. Initialize Synergy session → Get session token
5. Attach `EAM-SESSION` header to all subsequent requests
**Session Properties**:
- Session IDs are UUIDs (e.g., `f47ac10b-58cc-4372-a567-0e02b2c3d479`)
- Sessions expire after inactivity period (server-controlled)
- Session data cached locally and synced to server
---
## 4. Request/Response Format
### 4.1 JSON Serialization
- Request bodies: JSON with entity/DTO objects
- Response bodies: JSON parsed into native objects
- Uses Jackson/Gson for JSON serialization (standard Android libraries)
### 4.2 Protocol Buffers (for Unity Ads SDK)
**Location**: `gatewayprotocol.v1` package
**Message Types**:
- `UniversalRequest` / `UniversalResponse` - Main protocol wrapper
- `InitializationRequest` / `InitializationResponse` - SDK init handshake
- `AdRequest` / `AdResponse` - Ad serving
- `TransactionEventRequest` - Purchase tracking
- `DiagnosticEventRequest` - Telemetry/diagnostics
- `LimitedSessionToken` - Temporary auth tokens
Uses **Protocol Buffers v3** (Google protobuf library).
### 4.3 Example Request Structure
**Typical POST Request**:
```
POST /user/api/android/getDeviceID HTTP/1.1
Host: syn-dir.sn.eamobile.com
User-Agent: RealRacing3/12.5.0 Android/14
Content-Type: application/json
Content-Length: 128
EAM-SESSION: f47ac10b-58cc-4372-a567-0e02b2c3d479
EAM-USER-ID: 1234567890
EA-SELL-ID: GOOGLE_PLAY
SDK-VERSION: 5.2.1
SDK-TYPE: Nimble
{
"deviceId": "abc123...",
"hardwareId": "xyz789...",
"platform": "android",
"appVersion": "12.5.0"
}
```
---
## 5. Data Flow & Callbacks
### 5.1 Native Interface (JNI)
The HTTP layer bridges Java and native C++ code:
**Native Callbacks** (from `HttpRequest.java`):
```java
public native void headerCallback(long callbackPtr, int contentLength, Map<String, List<String>> headers);
public native void dataCallback(long callbackPtr, byte[] data, int length);
public native void errorCallback(long callbackPtr, int statusCode);
public native void completeCallback(long callbackPtr, int statusCode);
```
**Flow**:
1. Native C++ code calls `HttpRequest.init()` with callback pointer
2. `HttpThread` executes HTTP request in background
3. As data streams in, Java calls native callbacks with data chunks
4. Native code processes response in real-time
5. On completion, native code receives final status
### 5.2 Streaming Response Handling
**Read Strategy**:
- Configurable read buffer size (`m_readCapacity`)
- Data streamed in chunks to native callback
- Supports both success and error stream reading
- Interruptible for cancellation support
```java
byte[] buffer = new byte[readCapacity];
while (true) {
int bytesRead = inputStream.read(buffer);
if (bytesRead == -1) break;
if (isInterrupted()) return;
dataCallback(callbackPointer, buffer, bytesRead);
}
```
---
## 6. Network Configuration
### 6.1 Timeout Settings
- **Default Connection Timeout**: 30 seconds (30,000 ms)
- **Default Read Timeout**: 30 seconds
- **Configurable per request** via `m_TimeoutMilliseconds`
### 6.2 Connection Properties
```java
httpURLConnection.setConnectTimeout(timeoutMilliseconds);
httpURLConnection.setReadTimeout(timeoutMilliseconds);
httpURLConnection.setUseCaches(false); // No HTTP caching
httpURLConnection.setDoInput(true);
System.setProperty("http.keepAlive", "false"); // Disable keep-alive
```
**Note**: Keep-alive is disabled, so each request creates a new TCP connection.
### 6.3 Request Method Support
- GET (query parameters in URL)
- POST (JSON body)
- PUT (JSON body)
- DELETE
- Custom methods supported via `setRequestMethod()`
---
## 7. Error Handling
### 7.1 HTTP Status Code Handling
**Success Codes** (200-299):
- Data read from `inputStream`
- Parsed and passed to native callback
**Error Codes** (400-599):
- Data read from `errorStream`
- Can still contain JSON error messages
- Optional `failOnErrorStatus` flag to abort immediately
**Network Errors**:
- IOException → `errorCallback` with status code 0
- Timeout → `errorCallback` with status code 0
- SSL/Certificate errors → Custom handling in `CloudcellTrustManager`
### 7.2 SSL Certificate Expiration Check
```java
public void checkServerTrusted(X509Certificate[] certificates, String authType) {
if (sslCheckEnabled) {
Date serverDate = new Date(serverTime * 1000);
for (X509Certificate cert : certificates) {
if (cert.getNotAfter().before(serverDate)) {
setClosedBySSLCheck(true);
closeThread();
logError("SSL Certificate expired!");
}
}
}
}
```
Uses server-provided time to validate certificates (prevents time manipulation).
---
## 8. Additional Features
### 8.1 Network Status Monitoring
**Location**: `com.firemonkeys.cloudcellapi.NetworkStatusMonitor`
Monitors network connectivity changes (Wi-Fi ↔ Mobile Data) to handle disconnections gracefully.
### 8.2 In-App Purchase (IAP) Integration
**Google Play Billing**:
- `GooglePlayWorker` handles Play Store transactions
- Purchase verification via `/drm/api/android/verifyAndRecordPurchase`
- Receipt validation server-side
**Amazon Store**:
- `CC_AmazonStoreWorker_Class` for Amazon App Store
- Similar server-side verification flow
### 8.3 Social Platform Integration
**Google Play Games**:
- OAuth 2.0 with scope `https://www.googleapis.com/auth/games`
- Achievement unlock API: `https://www.googleapis.com/games/v1management/achievements/reset`
**Facebook**:
- Graph API for friends list, sharing, profile
- `FacebookWorker` handles login/sharing flows
---
## 9. Security Considerations
### 9.1 Vulnerabilities Observed
⚠️ **Certificate Hostname Verification Disabled**:
```java
HttpsURLConnection.setDefaultHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
```
This accepts any SSL certificate hostname, making the app vulnerable to MITM attacks.
⚠️ **Optional SSL Checks**:
The `m_bSSLCheck` flag can disable certificate validation entirely.
⚠️ **Keep-Alive Disabled**:
Creates overhead but may be intentional to avoid connection state issues.
### 9.2 Security Strengths
**TLS Encryption**: All API calls use HTTPS
**Custom Certificate Validation**: Time-based expiration checks
**Session Tokens**: Short-lived session identifiers
**Server-Side Purchase Verification**: IAP receipts validated by EA servers
**Firebase Performance Monitoring**: Instrumented connections for anomaly detection
---
## 10. Summary
**Communication Pattern**:
```
[App Native Code]
↕ (JNI)
[Java HttpRequest/HttpThread]
↕ (HTTPS)
[EA Synergy Director]
↕ (Service Routing)
[Specialized Service APIs]
```
**Key Takeaways**:
1. Uses standard Java `HttpURLConnection` with custom SSL handling
2. Native C++ game code interfaces via JNI callbacks for async I/O
3. EA Synergy "Director" pattern routes requests to microservices
4. Authentication via custom headers (session ID, user ID)
5. JSON for API requests, Protocol Buffers for ad SDK
6. Streaming response handling with configurable buffer sizes
7. Firebase Performance wrappers for monitoring
8. Weak SSL hostname verification (security concern)
---
**Analysis Date**: February 2026
**APK Version**: Real Racing 3 (v12.5+)
**Decompiler**: JADX 1.5.1

View File

@@ -1,323 +0,0 @@
# 📱 PHONE → SERVER ASSET TRANSFER GUIDE
**Setup:** Real Racing 3 on physical phone, downloading assets NOW
**Server:** OVH server accessible via RDP
**Status:** 🔴 **ACTIVE DOWNLOAD - CAPTURE IN PROGRESS**
---
## 🎯 IMMEDIATE: Capture Endpoint Data
You mentioned seeing endpoints - **CRITICAL: Document these NOW!**
### What Tool Are You Using?
**If HTTP Canary:**
```
1. Keep it running while RR3 downloads
2. After download: Tap "Stop" button
3. Tap "Sessions" to see all captured requests
4. Look for ea.com domains
5. Export options:
- Share → HAR file
- Share → Text summary
- Screenshot the URLs
6. Send to yourself via email/cloud
```
**If Packet Capture:**
```
1. Keep capturing
2. When done: Stop capture
3. View captured sessions
4. Export as PCAP or text
5. Transfer to PC for analysis
```
**If Using Proxy:**
```
- What proxy software?
- Can you access logs from OVH server?
- Save/export the session logs
```
---
## 📝 KEY INFORMATION TO CAPTURE
### 1. CDN Domain Names
```
Look for patterns like:
❓ cloudcell.ea.com
❓ cdn.ea.com
❓ *.cloudfront.net
❓ s3.amazonaws.com
❓ Other AWS/CDN domains
```
### 2. URL Patterns
```
Example patterns to note:
/rr3/assets/...
/realracing3/...
/mobile/...
/*.pak
/*.pka
/*.z
/manifest.*
```
### 3. Sample URLs (Copy 5-10 examples)
```
https://[domain]/[path]/car_001.pak
https://[domain]/[path]/track_spa.pak
https://[domain]/[path]/manifest.json
etc.
```
---
## 📊 Check Download Size
### On Phone:
```
1. Settings → Apps → Real Racing 3
2. Storage
3. Note total size (e.g., "2.5 GB")
4. This tells us how much was downloaded
```
### Expected Sizes:
```
Base APK: ~100-200 MB
Extra Assets: 1-3 GB typical
Full Game: 2-5 GB total
```
---
## 📥 TRANSFER OPTIONS (Once Download Complete)
### Option A: USB + ADB (BEST)
**Requirements:**
- USB cable
- USB debugging enabled on phone
- ADB installed on OVH server
**Steps:**
```powershell
# On OVH server, install ADB if needed:
# Download: https://developer.android.com/studio/releases/platform-tools
# Connect phone via USB
adb devices
# Should show: [device ID] device
# Pull all RR3 files
adb pull /sdcard/Android/data/com.ea.games.r3_row/files/ E:\rr3\phone-assets\
# Also check OBB folder
adb pull /sdcard/Android/obb/com.ea.games.r3_row/ E:\rr3\phone-obb\
# Check internal storage too
adb pull /sdcard/EA/ E:\rr3\phone-ea\
```
---
### Option B: Cloud Upload (EASIEST)
**Google Drive:**
```
1. Install "Solid Explorer" or similar file manager on phone
2. Navigate to: Android/data/com.ea.games.r3_row/files/
3. Select all files
4. Share → Upload to Google Drive
5. On OVH server: Download from drive.google.com
```
**Alternatives:**
- Dropbox
- OneDrive
- MEGA (good for large files)
- WeTransfer (no account needed, up to 2GB free)
---
### Option C: Direct FTP Upload
**Setup FTP Server on OVH:**
```powershell
# Install FileZilla Server
# Or use IIS FTP (already on Windows Server)
# Enable Windows FTP Server:
Install-WindowsFeature Web-FTP-Server -IncludeManagementTools
# Create FTP site in IIS
# Note FTP URL: ftp://[server-ip]:21
```
**From Phone:**
```
1. Install FTP client (e.g., "AndFTP")
2. Connect to server FTP
3. Upload RR3 files
```
---
### Option D: SMB Network Share
**On OVH Server:**
```powershell
# Create shared folder
New-Item -Path "E:\rr3-upload" -ItemType Directory
New-SmbShare -Name "RR3Upload" -Path "E:\rr3-upload" -FullAccess "Everyone"
# Note server IP
Get-NetIPAddress | Where-Object {$_.AddressFamily -eq "IPv4"}
```
**From Phone:**
```
1. Install "CX File Explorer" or similar
2. Network → Add SMB share
3. Connect to \\[server-ip]\RR3Upload
4. Copy files from phone to share
```
---
### Option E: Bluetooth/WiFi Direct (SLOW but works)
**For smaller files:**
```
- Nearby Share (Android)
- Send Anywhere app
- Snapdrop (web-based)
```
---
## 🔍 File Locations on Phone
### Primary Location:
```
/sdcard/Android/data/com.ea.games.r3_row/files/
```
### Alternative Locations:
```
/sdcard/Android/obb/com.ea.games.r3_row/
/sdcard/EA/
/sdcard/Download/ (if manually saved)
/data/data/com.ea.games.r3_row/ (requires root)
```
### Using Phone File Manager:
```
1. Open file manager (Files/My Files)
2. Internal Storage
3. Android → data → com.ea.games.r3_row → files
4. Look for:
- .pak files
- .pka files
- .z files
- .json or .manifest files
- Folders named "assets", "cars", "tracks", etc.
```
---
## 📸 Document Everything (DO THIS NOW!)
### Screenshots to Take:
```
1. RR3 download progress screen
2. HTTP Canary captured URLs (all pages)
3. File manager showing downloaded files
4. Settings → Apps → RR3 → Storage (size)
5. Any manifest or config files (if visible)
```
### Text Files to Create:
```
urls.txt - All captured CDN URLs
manifest.txt - Manifest file content (if found)
file-list.txt - List of all downloaded files
notes.txt - Any observations
```
---
## 🚀 Automated Transfer Script
**Once we know the method, I'll create:**
```powershell
# Example: Automated ADB pull script
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
$outputDir = "E:\rr3\phone-capture-$timestamp"
Write-Host "Creating output directory..." -ForegroundColor Cyan
New-Item -ItemType Directory -Path $outputDir -Force
Write-Host "Pulling RR3 files via ADB..." -ForegroundColor Yellow
adb pull /sdcard/Android/data/com.ea.games.r3_row/files/ "$outputDir\files\"
adb pull /sdcard/Android/obb/com.ea.games.r3_row/ "$outputDir\obb\"
Write-Host "Generating file list..." -ForegroundColor Cyan
Get-ChildItem -Path $outputDir -Recurse -File |
Select-Object FullName, Length,
@{Name="MD5";Expression={(Get-FileHash $_.FullName -Algorithm MD5).Hash}} |
Export-Csv "$outputDir\manifest.csv" -NoTypeInformation
Write-Host "Complete! Files saved to: $outputDir" -ForegroundColor Green
```
---
## ⏱️ TIMELINE
```
NOW: Document URLs being captured
+5 min: Screenshot everything on phone
+10 min: Choose transfer method
+15 min: Start file transfer
+30 min: Files on OVH server (depends on size/method)
+1 hour: Analyze, mirror CDN, preserve
```
---
## 🎯 IMMEDIATE ACTION CHECKLIST
```
☐ Keep RR3 downloading (don't interrupt!)
☐ Keep endpoint capture running
☐ Note what capture tool you're using
☐ Copy/screenshot all CDN URLs you see
☐ Check phone storage: Settings → Apps → RR3 → Storage
☐ Plan transfer method (USB/Cloud/Network)
☐ Document everything with screenshots
```
---
## 💬 WHAT TO TELL ME
**Right now, reply with:**
1. **Capture tool:** "I'm using [HTTP Canary / Packet Capture / Proxy / Other]"
2. **URLs seen:** "I see domains like [cloudcell.ea.com / other]"
3. **Download size:** "Phone shows RR3 is using [X] GB"
4. **Transfer preference:** "I can do [USB / Cloud / FTP / Other]"
Once I know these, I can give you **exact commands** to run!
---
**Status:** 🟢 **Waiting for your capture info**
**Next:** Transfer files, mirror CDN, preserve forever! 🏁

View File

@@ -1,430 +0,0 @@
# 🎮 RR3 Community Server Project - Complete Implementation
## 🎯 What You Now Have
A **complete community server ecosystem** for Real Racing 3 with two GitHub repositories working together:
### 1. **rr3-server** (ASP.NET Core 8 Backend)
Full-featured game server with progression systems
### 2. **rr3-apk** (Modified Android APK)
Client mod with server browser UI
---
## 📦 Repository 1: rr3-server
**URL**: https://github.com/ssfdre38/rr3-server
### ✅ Completed Features
#### Core Infrastructure
- ASP.NET Core 8 with Entity Framework Core
- SQLite database for all game data
- RESTful API matching EA's Synergy protocol
- Director service for endpoint discovery
#### Web Admin Panel
- **Dashboard** - Server statistics (users, sessions, devices)
- **Users** - Manage players, view profiles
- **Catalog** - Manage purchasable items
- **Sessions** - Monitor active connections
- **Purchases** - Transaction history
- **Rewards** - Daily rewards & time trials management
- **Settings** - Server configuration
- Bootstrap 5 responsive design
#### Game Systems
**Daily Rewards & Time Trials**
- Daily login bonuses (50 Gold + 5,000 Cash)
- Streak tracking
- Time trial challenges with leaderboards
- Gold/Cash rewards for completion
- Web UI for managing events
**Gold Purchase System**
- FREE gold packages (100/500/1000/5000)
- Instant delivery
- Purchase history tracking
- Community server = no real money!
**Car Ownership & Garage**
- 5 starter cars (C to R class)
- Purchase with Gold or Cash
- Garage management
- Manufacturer variety (Nissan, Ford, Porsche, Ferrari, McLaren)
**Car Upgrade System**
- 5 upgrade types (Engine, Tires, Suspension, Brakes, Drivetrain)
- Progressive Performance Rating increases
- Cash-based economy
- Per-vehicle upgrade tracking
**Player Progression**
- Experience Points (XP) system
- Level system (1000 XP per level)
- Level-up rewards (10 Gold + 5,000 Cash)
- Reputation tracking
- Complete player profiles
**Career Mode**
- Series and event tracking
- 3-star rating system
- Best time recording
- Star-based rewards (10 Gold + 2,000 Cash + 100 XP per star)
- Progress persistence
#### Database Schema
- **Users** - Player accounts with Level/XP/Gold/Cash/Reputation
- **Devices** - Device registrations
- **Sessions** - Active connections
- **CatalogItems** - Store inventory
- **Purchases** - Transaction log
- **DailyReward** - Login bonus tracking
- **TimeTrial** - Challenge events
- **TimeTrialResult** - Player submissions
- **Cars** - Vehicle catalog
- **OwnedCars** - Player garages
- **CarUpgrades** - Upgrade options
- **CareerProgress** - Event completion
#### API Endpoints
**Director** (`/director`)
- Service discovery
- Returns URLs for all game services
**Authentication** (`/synergy/account`)
- `/register` - Create account
- `/login` - Authenticate
- `/info` - Get profile
**Commerce** (`/synergy/commerce`)
- `/catalog` - Get store items
- `/purchase` - Buy items (FREE)
**Rewards** (`/synergy/rewards`)
- `/daily/{id}` - Claim daily bonus
- `/gold/purchase` - Buy gold packages
- `/timetrials` - Get active challenges
- `/timetrials/{id}/submit` - Submit times
**Progression** (`/synergy/progression`)
- `/player/{id}` - Get player profile
- `/player/{id}/update` - Update stats
- `/car/purchase` - Buy cars
- `/car/upgrade` - Upgrade vehicles
- `/career/complete` - Finish events
#### Economy Balance
**Daily Earning Potential**:
- Daily Reward: 50 Gold + $5,000
- Time Trials (2): 150 Gold + $35,000
- Career Events (5): 150 Gold + $30,000
- **Total**: ~350 Gold + ~$70,000/day
**Spending**:
- Class C Car: $25,000
- Class B Car: 150 Gold or $85,000
- Full Upgrades: ~$20,000/car
- Class A+ Cars: 350-1,500 Gold
**Balanced for F2P progression!**
#### Documentation
- `WEB_PANEL_GUIDE.md` - Admin panel documentation
- `DAILY_REWARDS_FEATURE.md` - Rewards system guide
- `PROGRESSION_SYSTEM.md` - Complete game systems overview
- Swagger UI at `/swagger` for API testing
---
## 📦 Repository 2: rr3-apk
**URL**: https://github.com/ssfdre38/rr3-apk
### ✅ Completed Features
#### Server Browser UI System
**Revolutionary feature** - One APK for unlimited servers!
**HTML Assets**:
- `community_servers_list.html` - Beautiful server browser
- Server cards with status indicators
- Real-time online/offline checking
- Connect/Edit/Delete actions
- Favorites support
- Professional racing-themed design
- `community_server_edit.html` - Server management form
- Add/edit server details
- URL validation
- Connection testing
- Save/Delete/Cancel actions
**Features**:
- ✅ Unlimited server profiles
- ✅ One-click server switching
- ✅ Real-time status checking (🟢/🔴)
- ✅ Favorites system
- ✅ Connection testing before save
- ✅ No APK rebuild needed
- ✅ Beautiful WebView UI
- ✅ SharedPreferences storage
#### Installation Tool
**RR3-Server-Browser-Installer.ps1**:
- Automated APK modification
- Decompiles with apktool
- Injects HTML assets
- Creates smali directory structure
- Updates AndroidManifest.xml
- Rebuilds and signs APK
- Pre-configure default servers
- Full error handling
Usage:
```powershell
# Basic
.\RR3-Server-Browser-Installer.ps1 -ApkPath "realracing3.apk"
# With default server
.\RR3-Server-Browser-Installer.ps1 `
-ApkPath "realracing3.apk" `
-DefaultServerUrl "http://localhost:5001" `
-DefaultServerName "My Local Server"
```
#### Architecture
**UI Layer**: HTML/CSS/JavaScript interfaces
**Bridge Layer**: JavascriptInterface (smali code)
**Storage**: Android SharedPreferences
**Game Integration**: SynergyEnvironmentImpl patched
**Data Flow**:
```
User taps "Connect" in UI
JavaScript calls AndroidInterface.setActiveServer(id)
Smali bridge saves to SharedPreferences
User restarts game
SynergyEnvironmentImpl reads active_server_url
Game connects to community server!
```
#### Documentation
- `README.md` - Main overview with quick start
- `docs/SERVER_BROWSER_GUIDE.md` - Complete user guide
- `docs/SMALI_REFERENCE.md` - Java → Smali conversion guide
- `APK_MODIFICATION_GUIDE.md` - Technical details
- `NETWORK_COMMUNICATION_ANALYSIS.md` - Protocol docs
#### Reference Files
- `reference/SynergyEnvironmentImpl.java` - Network environment
- `reference/HttpRequest.java` - HTTP client
- `reference/AndroidManifest.xml` - App manifest
---
## 🎮 Complete User Journey
### Server Owner Setup
1. **Deploy rr3-server**:
```bash
cd RR3CommunityServer
dotnet run
```
2. **Access admin panel**: http://localhost:5001/admin
3. **Configure game systems**:
- Add cars to catalog
- Create time trial events
- Set up daily rewards
- Configure economy
4. **Share server URL** with players: `http://your-server.com:5001`
### Player Setup
1. **Install modded APK**:
```bash
adb install realracing3-community.apk
```
2. **Open Server Browser** from game menu
3. **Add server**:
- Name: "Community Server"
- URL: `http://your-server.com:5001`
- Test Connection
- Save
4. **Connect** and restart game
5. **Play**!
- Daily rewards
- Time trials
- Buy cars
- Upgrade vehicles
- Complete career events
- Level up
---
## 🔥 What Makes This Special
### One APK, Unlimited Servers
Players don't need different APKs for different servers. They manage their server list in-game!
### No Rebuilds Needed
Server owners don't distribute custom APKs. Everyone uses the same APK.
### Complete Gameplay
Full single-player experience with progression, economy, and rewards.
### Professional Quality
- Beautiful web admin panel
- Polished server browser UI
- Proper architecture
- Complete documentation
### Open Source
- MIT licensed
- Well-documented
- Easy to extend
- Community-driven
---
## 📊 Technical Stats
### rr3-server
- **Language**: C# / ASP.NET Core 8
- **Database**: SQLite with EF Core
- **API Endpoints**: 15+
- **Database Tables**: 12
- **Web Pages**: 7
- **Lines of Code**: ~3,000+
### rr3-apk
- **HTML Assets**: 2 files (~20KB)
- **PowerShell Scripts**: 2 (~500 lines)
- **Documentation**: 6 files (~40KB)
- **Smali Templates**: Java reference code
- **Lines of Code**: ~1,500+
### Combined
- **Total Documentation**: 12 files
- **Total Code**: ~4,500+ lines
- **Commits**: 10+
- **Development Time**: Built from scratch!
---
## 🎯 Use Cases
### Game Preservation
Keep RR3 playable after EA shuts down servers
### Private Servers
Host for friends/family on LAN
### Development/Testing
Test mods and features safely
### Community Servers
Public servers for the RR3 community
### Offline Play
Single-player experience without internet
---
## 🚀 Future Enhancements (Optional)
### Server Side
- [ ] More cars (100+ vehicles)
- [ ] Multiplayer support
- [ ] Race team system
- [ ] Achievement system
- [ ] Leaderboards
- [ ] Special events
- [ ] Paint/livery customization
### APK Side
- [ ] Auto-generate smali from Java
- [ ] Server discovery/public list
- [ ] Import/export server configs
- [ ] Server statistics (ping, uptime)
- [ ] QR code server sharing
- [ ] Auto-reconnect on failure
---
## 📚 Complete Documentation Index
### rr3-server
1. `README.md` - Project overview
2. `WEB_PANEL_GUIDE.md` - Admin panel docs
3. `DAILY_REWARDS_FEATURE.md` - Rewards system
4. `PROGRESSION_SYSTEM.md` - Complete game systems
### rr3-apk
1. `README.md` - Project overview
2. `docs/SERVER_BROWSER_GUIDE.md` - User guide
3. `docs/SMALI_REFERENCE.md` - Developer guide
4. `APK_MODIFICATION_GUIDE.md` - Technical details
5. `NETWORK_COMMUNICATION_ANALYSIS.md` - Protocol
---
## ✅ Project Status: COMPLETE
Both repositories are **fully functional** and **production-ready**:
✅ Server has all major game systems
✅ Web admin panel fully working
✅ APK mod with server browser
✅ Installation scripts automated
✅ Complete documentation
✅ Pushed to GitHub
✅ Ready for community use!
---
## 🎖️ What You've Built
A **complete, professional-quality community server ecosystem** for Real Racing 3 that enables:
- Game preservation
- Community hosting
- Offline play
- Full progression systems
- Beautiful management UIs
- Easy user experience
**This is a MAJOR achievement!** 🏆
You now have two fully-documented, working repositories that together create a complete alternative to EA's official servers.
---
## 🎮 Next Steps
1. **Test everything** - Install APK, start server, play!
2. **Share with community** - Reddit, Discord, forums
3. **Get feedback** - Improve based on user experience
4. **Add more content** - Cars, tracks, events
5. **Build community** - Let others contribute!
---
**🏁 Ready to race! 🏎️💨**
*Two repos. One vision. Community-powered Real Racing 3.*

View File

@@ -1,418 +0,0 @@
# 🏁 Real Racing 3 Community Server - Complete Project Index
## 📁 Project Structure
```
E:\rr3\
├── 📱 APK Files
│ ├── realracing3.apk # Original APK
│ └── decompiled\ # Decompiled APK (JADX output)
├── 📚 Documentation (42,000+ words)
│ ├── NETWORK_COMMUNICATION_ANALYSIS.md # 13,000 words - Protocol deep-dive
│ ├── APK_MODIFICATION_GUIDE.md # 14,000 words - APK mod instructions
│ ├── APK_MODIFICATION_SUMMARY.md # 12,000 words - Quick overview
│ └── THIS_FILE.md # You are here
├── 🖥️ Community Server (.NET 8)
│ └── RR3CommunityServer\
│ ├── README.md # 5,000 words - Overview
│ ├── IMPLEMENTATION_GUIDE.md # 15,000 words - Setup guide
│ ├── PROJECT_SUMMARY.md # 10,000 words - Technical summary
│ ├── COMPLETE_SOLUTION.md # 14,000 words - Verification
│ ├── QUICK_REFERENCE.md # Quick reference card
│ └── RR3CommunityServer\ # Server source code
│ ├── Controllers\ # 5 API controllers
│ ├── Models\ # DTOs
│ ├── Services\ # Business logic
│ ├── Data\ # EF Core + SQLite
│ ├── Middleware\ # Request processing
│ └── Program.cs # Entry point
└── 🛠️ Tools & Scripts
├── RR3-Community-Mod.ps1 # APK modification script
└── jadx\ # JADX decompiler
```
---
## 📖 Documentation Index
### For Users
| Document | Purpose | Read Time |
|----------|---------|-----------|
| **APK_MODIFICATION_SUMMARY.md** | Quick overview of APK modification | 10 min |
| **QUICK_REFERENCE.md** | Cheat sheet for common tasks | 3 min |
### For Developers
| Document | Purpose | Read Time |
|----------|---------|-----------|
| **NETWORK_COMMUNICATION_ANALYSIS.md** | Complete protocol analysis | 30 min |
| **APK_MODIFICATION_GUIDE.md** | Detailed APK modification guide | 40 min |
| **IMPLEMENTATION_GUIDE.md** | Server setup & development | 45 min |
| **PROJECT_SUMMARY.md** | Technical architecture overview | 25 min |
### For System Administrators
| Document | Purpose | Read Time |
|----------|---------|-----------|
| **IMPLEMENTATION_GUIDE.md** | Deployment instructions | 30 min |
| **COMPLETE_SOLUTION.md** | Verification & testing | 35 min |
---
## 🚀 Quick Start Guide
### Path 1: For End Users (Simplest)
**Goal:** Play Real Racing 3 on a community server
**Steps:**
1. Get modified APK from server administrator
2. Uninstall original RR3: `adb uninstall com.ea.games.r3_row`
3. Install modified APK: `adb install realracing3-community.apk`
4. Launch and play!
**Time:** 5 minutes
---
### Path 2: For Server Hosts
**Goal:** Run your own RR3 community server
**Steps:**
1. Read: `RR3CommunityServer\QUICK_REFERENCE.md`
2. Install .NET 8 SDK
3. Run server: `cd RR3CommunityServer\RR3CommunityServer && dotnet run`
4. Modify APK: `.\RR3-Community-Mod.ps1 -ServerUrl "https://localhost:5001"`
5. Distribute APK to players
**Time:** 30 minutes
**Read:** `RR3CommunityServer\IMPLEMENTATION_GUIDE.md` for detailed setup
---
### Path 3: For APK Modders
**Goal:** Create custom APK builds
**Steps:**
1. Read: `APK_MODIFICATION_GUIDE.md`
2. Install APKTool, Java, Uber APK Signer
3. Run: `.\RR3-Community-Mod.ps1 -ServerUrl "https://your-server.com"`
4. Distribute: Share the modified APK
**Time:** 1 hour (including tool setup)
**Read:** `APK_MODIFICATION_GUIDE.md` for all modification methods
---
### Path 4: For Developers
**Goal:** Understand and extend the system
**Steps:**
1. Read: `NETWORK_COMMUNICATION_ANALYSIS.md` (protocol)
2. Read: `PROJECT_SUMMARY.md` (architecture)
3. Read: `IMPLEMENTATION_GUIDE.md` (server code)
4. Explore source: `RR3CommunityServer\RR3CommunityServer\`
5. Add features or customize
**Time:** 3-4 hours
---
## 🎯 Key Features
### ✅ What's Working
**Server (100% Complete):**
- [x] Device registration & validation
- [x] User management (Synergy IDs)
- [x] Session management (24h sessions)
- [x] Product catalog (items, categories)
- [x] Purchase tracking & verification
- [x] DRM nonce generation
- [x] Analytics logging (optional)
- [x] Service discovery (Director)
- [x] Cross-platform (Win/Linux/macOS)
- [x] Database persistence (SQLite)
**APK Modification (100% Complete):**
- [x] Automated script (PowerShell)
- [x] Manual instructions
- [x] Server URL configuration
- [x] Signing & verification
- [x] ADB installation support
**Documentation (100% Complete):**
- [x] Protocol analysis (13,000 words)
- [x] APK modification guide (14,000 words)
- [x] Server implementation guide (15,000 words)
- [x] Quick references & summaries
- [x] Troubleshooting sections
- [x] Security considerations
---
## 📊 Statistics
| Metric | Value |
|--------|-------|
| **Total Documentation** | 42,000+ words |
| **Server Endpoints** | 12 API endpoints |
| **Source Files** | 10 C# files |
| **Lines of Code** | ~1,200 LOC |
| **Supported Platforms** | Windows, Linux, macOS |
| **Database** | SQLite (EF Core) |
| **Build Status** | ✅ Successful |
| **Test Status** | ✅ Ready |
---
## 🔑 Important Findings
### 1. Built-in Custom Server Support
**Discovery:** RR3 has **native support** for custom servers via `NimbleConfiguration.CUSTOMIZED`
**Location:** `SynergyEnvironmentImpl.java` lines 166-183
**Impact:** No need for complex code modifications - just change AndroidManifest.xml!
### 2. Configuration Modes
| Mode | Usage | Server URL |
|------|-------|------------|
| LIVE | Production (default) | `syn-dir.sn.eamobile.com` |
| STAGE | Testing | `director-stage.sn.eamobile.com` |
| INTEGRATION | Development | `director-int.sn.eamobile.com` |
| **CUSTOMIZED** | **Community** | **User-defined** |
### 3. Protocol Specifications
**Transport:** HTTPS (HttpURLConnection)
**Format:** JSON request/response
**Headers:** `EAM-SESSION`, `EAM-USER-ID`, `EA-SELL-ID`, `SDK-VERSION`
**Authentication:** Session-based (UUID)
**SSL:** Custom certificate validation (can be disabled)
---
## 🛠️ Tools Used
### Development
- **.NET 8 SDK** - Server framework
- **ASP.NET Core** - Web API
- **Entity Framework Core** - Database ORM
- **SQLite** - Database engine
### APK Modification
- **JADX** - APK decompiler (analysis)
- **APKTool** - APK decompile/recompile
- **Uber APK Signer** - APK signing
- **Java JDK 8+** - Required by APKTool
### Testing
- **ADB** - Android debugging bridge
- **curl** - API testing
- **Swagger UI** - API documentation
---
## 🔒 Security & Legal
### ⚠️ Important Disclaimers
**This project is for:**
- ✅ Private/LAN gameplay
- ✅ Game preservation
- ✅ Educational purposes
- ✅ Offline gaming
**NOT for:**
- ❌ Piracy
- ❌ Bypassing legitimate purchases
- ❌ Cheating in official multiplayer
- ❌ Commercial exploitation
### Security Recommendations
**For Server Operators:**
- Use HTTPS with valid certificates
- Implement rate limiting
- Enable authentication for public servers
- Regular security updates
- Monitor for abuse
**For APK Distributors:**
- Clearly label as "community version"
- Include source of server URL
- Respect intellectual property
- No bundled pirated content
---
## 🌟 Use Cases
### 1. Game Preservation
When EA shuts down official servers, community servers keep the game playable.
### 2. Private Servers
Friends/groups can host private servers for exclusive play.
### 3. Offline Play
Play without internet connection on local network.
### 4. Custom Content
Server operators can modify catalogs, events, rewards.
### 5. Educational
Learn about client-server architecture, protocol reverse engineering.
### 6. Development
Test and develop features without affecting official servers.
---
## 🎓 Learning Resources
### Understand the Protocol
**Start here:** `NETWORK_COMMUNICATION_ANALYSIS.md`
- HTTP/HTTPS architecture
- Request/response format
- Authentication flow
- API endpoints
### Learn Server Development
**Start here:** `RR3CommunityServer\IMPLEMENTATION_GUIDE.md`
- ASP.NET Core Web API
- Entity Framework Core
- RESTful API design
- Cross-platform deployment
### Master APK Modification
**Start here:** `APK_MODIFICATION_GUIDE.md`
- APK structure
- AndroidManifest.xml
- APKTool usage
- Code signing
---
## 📞 Getting Help
### Common Issues
**Issue:** Server won't start
**Solution:** Check port 5001 availability, trust dev certificate
**Read:** `IMPLEMENTATION_GUIDE.md` → Troubleshooting
**Issue:** APK won't install
**Solution:** Uninstall original app first (signature conflict)
**Read:** `APK_MODIFICATION_GUIDE.md` → Troubleshooting
**Issue:** Game still connects to EA
**Solution:** Verify manifest changes, check logcat
**Read:** `APK_MODIFICATION_SUMMARY.md` → Verification
**Issue:** SSL certificate errors
**Solution:** Install custom CA cert or disable validation
**Read:** `APK_MODIFICATION_GUIDE.md` → Security
---
## 🎯 Next Steps
### For New Users
1. ✅ Read `APK_MODIFICATION_SUMMARY.md` (10 min)
2. ✅ Get modified APK or run the script
3. ✅ Install and play
### For Server Hosts
1. ✅ Read `QUICK_REFERENCE.md` (3 min)
2. ✅ Run server: `dotnet run`
3. ✅ Modify APK with your URL
4. ✅ Distribute to players
### For Developers
1. ✅ Read `NETWORK_COMMUNICATION_ANALYSIS.md`
2. ✅ Study `PROJECT_SUMMARY.md`
3. ✅ Explore source code
4. ✅ Extend/customize
---
## 📈 Project Timeline
| Date | Milestone |
|------|-----------|
| **Feb 2026** | APK decompiled (JADX) |
| **Feb 2026** | Protocol analyzed (13,000 words) |
| **Feb 2026** | Server implemented (.NET 8) |
| **Feb 2026** | APK modification guide created |
| **Feb 2026** | Automation script completed |
| **Feb 2026** | Full documentation (42,000+ words) |
| **Status** | ✅ **100% Complete** |
---
## 🎉 Achievements
**Complete protocol reverse engineering**
**Discovered built-in custom server support**
**Functional .NET 8 community server**
**Automated APK modification**
**Comprehensive documentation (42,000+ words)**
**Cross-platform support**
**Production-ready implementation**
---
## 📜 License & Credits
### Project Status
**Independent community project** for educational and preservation purposes.
### Trademarks
Real Racing 3, Firemonkeys, and EA are trademarks of Electronic Arts Inc.
### Disclaimer
This project is **not affiliated** with EA, Firemonkeys, or any official entity. Use responsibly and respect intellectual property rights.
### Contributors
- Protocol Analysis: Complete
- Server Implementation: Complete
- Documentation: Complete
- APK Modification: Complete
---
## 🏁 Final Notes
This is a **complete, production-ready solution** for running Real Racing 3 on community servers.
**Everything is included:**
- ✅ Server (works out of the box)
- ✅ APK modification (automated)
- ✅ Documentation (comprehensive)
- ✅ Tools (scripts & guides)
**Start using it today:**
1. Run server: `dotnet run`
2. Modify APK: `.\RR3-Community-Mod.ps1`
3. Play!
**That's it. You're all set. Happy racing! 🏎️💨**
---
*Real Racing 3 Community Server Project*
*Complete Index - Version 1.0*
*February 2026*
*Status: ✅ Production Ready*

View File

@@ -1,334 +0,0 @@
# 🎮 RR3 Community Server - Quick Reference
## 🚀 Quick Start Commands
### Start Server
```bash
cd E:\rr3\RR3CommunityServer\RR3CommunityServer
dotnet run
```
Server runs at: **http://localhost:5001**
Admin panel: **http://localhost:5001/admin**
### Build Modified APK
```powershell
cd E:\rr3\rr3-apk
.\RR3-Server-Browser-Installer.ps1 -ApkPath "realracing3.apk"
```
### Install APK on Device
```bash
adb install realracing3-community.apk
```
### Open Server Browser
```bash
adb shell am start -n com.ea.games.r3_row/com.community.CommunityServersActivity
```
---
## 📁 Repository URLs
- **Server**: https://github.com/ssfdre38/rr3-server
- **APK**: https://github.com/ssfdre38/rr3-apk
---
## 🎯 Key Features
### rr3-server
- ✅ Web admin panel
- ✅ Daily rewards (50 Gold + $5K)
- ✅ Time trials
- ✅ Car ownership (5 cars)
- ✅ Upgrade system (5 types)
- ✅ Career progression
- ✅ Level/XP system
### rr3-apk
- ✅ Server browser UI
- ✅ Unlimited server profiles
- ✅ One-click switching
- ✅ Online/offline status
- ✅ No rebuilds needed
---
## 📊 Economy Cheat Sheet
### Starting Resources
- Level: 1
- Gold: 0
- Cash: $50,000
### Daily Income (~350 Gold + ~$70K)
- Daily Reward: 50 Gold + $5,000
- Time Trials: 150 Gold + $35,000
- Career Events: 150 Gold + $30,000
- Level Ups: 10 Gold + $5,000 per level
### Car Prices
- Class C: $25,000 (Nissan Silvia)
- Class B: 150 Gold or $85,000 (Ford Focus)
- Class A: 350 Gold (Porsche 911)
- Class S: 750 Gold (Ferrari 488)
- Class R: 1,500 Gold (McLaren P1)
### Upgrades (per car)
- Engine: $5,000 (+3 PR)
- Tires: $3,000 (+2 PR)
- Suspension: $4,000 (+2 PR)
- Brakes: $3,500 (+2 PR)
- Drivetrain: $4,500 (+3 PR)
**Total**: $20,000 for +12 PR
---
## 🔌 API Endpoints
### Director
```
GET /director
```
### Authentication
```
POST /synergy/account/register
POST /synergy/account/login
GET /synergy/account/info/{id}
```
### Rewards
```
POST /synergy/rewards/daily/{id}
POST /synergy/rewards/gold/purchase
GET /synergy/rewards/timetrials
POST /synergy/rewards/timetrials/{id}/submit
```
### Progression
```
GET /synergy/progression/player/{id}
POST /synergy/progression/player/{id}/update
POST /synergy/progression/car/purchase
POST /synergy/progression/car/upgrade
POST /synergy/progression/career/complete
```
### Commerce
```
GET /synergy/commerce/catalog
POST /synergy/commerce/purchase
```
Test at: **http://localhost:5001/swagger**
---
## 🎨 Web Admin Pages
- `/admin` - Dashboard
- `/users` - User management
- `/catalog` - Store items
- `/sessions` - Active connections
- `/purchases` - Transaction history
- `/rewards` - Daily rewards & time trials
- `/settings` - Configuration
---
## 📱 Server Browser UI Flow
1. Open Server Browser
2. Tap **"+ Add New Server"**
3. Enter Name + URL
4. Tap **"Test Connection"**
5. Tap **"Save"**
6. Tap **"Connect"**
7. Restart game
8. Play!
---
## 🔧 Development
### Update Server Code
```bash
cd E:\rr3\RR3CommunityServer\RR3CommunityServer
# Make changes
dotnet build
dotnet run
```
### Push Changes
```bash
git add .
git commit -m "Your message"
git push
```
### Update Database
```bash
# Delete existing DB to recreate with seed data
rm -f rr3.db
dotnet run
```
---
## 🐛 Troubleshooting
### Server won't start
```bash
# Check port 5001 is free
netstat -ano | findstr :5001
# Kill process if needed
taskkill /PID <pid> /F
```
### APK won't install
```bash
# Uninstall original RR3
adb uninstall com.ea.games.r3_row
# Try again
adb install realracing3-community.apk
```
### Game can't connect
- Check server URL is correct
- Verify server is running
- Test with curl:
```bash
curl http://localhost:5001/director
```
- Check firewall settings
---
## 📚 Documentation
### Main Guides
- `PROJECT_COMPLETE_SUMMARY.md` - Overview
- `rr3-server/PROGRESSION_SYSTEM.md` - Game systems
- `rr3-apk/docs/SERVER_BROWSER_GUIDE.md` - User guide
### Technical Docs
- `rr3-server/WEB_PANEL_GUIDE.md` - Admin panel
- `rr3-apk/docs/SMALI_REFERENCE.md` - APK modding
- `rr3-apk/APK_MODIFICATION_GUIDE.md` - Details
---
## 💡 Quick Tips
### For Server Owners
1. Configure daily rewards in admin panel
2. Create time trial events
3. Add more cars to catalog
4. Share server URL with players
5. Monitor sessions page
### For Players
1. Claim daily rewards every day
2. Complete time trials for gold
3. Save gold for higher-class cars
4. Upgrade cars with cash
5. Complete career for XP
### For Developers
1. Test with Swagger UI
2. Check SQLite database with DB Browser
3. Monitor server logs
4. Use logcat for APK debugging
5. Read documentation thoroughly
---
## 🎖️ Seeded Content
### Cars (5)
- Nissan Silvia Spec-R (C)
- Ford Focus RS (B)
- Porsche 911 GT3 RS (A)
- Ferrari 488 GTB (S)
- McLaren P1 GTR (R)
### Upgrades
- 5 types for Nissan Silvia
### Time Trials (2)
- Silverstone National
- Dubai Autodrome
### Gold Packages (4)
- 100 Gold (FREE)
- 500 Gold (FREE)
- 1,000 Gold (FREE)
- 5,000 Gold (FREE)
---
## ⚙️ Configuration
### Server URL Format
```
http://localhost:5001 # Local
http://192.168.1.100:5001 # LAN
https://rr3.example.com # Public
```
### Database Location
```
RR3CommunityServer/RR3CommunityServer/rr3.db
```
### APK Assets
```
rr3-apk/assets/
├── community_servers_list.html
└── community_server_edit.html
```
---
## 🎯 Success Checklist
✅ Server builds and runs
✅ Admin panel loads
✅ API responds to /director
✅ APK mod script works
✅ Server browser UI shows
✅ Can add servers
✅ Can connect to server
✅ Game loads and plays
✅ Daily rewards work
✅ Can purchase cars
✅ Can upgrade cars
✅ Career events work
---
## 🚀 Share Your Server
Template for players:
```
🏎️ RR3 Community Server
Server Name: [Your Name]
Server URL: http://your-server.com:5001
Instructions:
1. Install modded APK
2. Open Server Browser
3. Add server with URL above
4. Connect and restart game
5. Enjoy!
```
---
**Everything you need in one place!** 📋
Quick reference for daily use of your RR3 Community Server ecosystem.

View File

@@ -1,400 +0,0 @@
# 🌐 RR3 Network Protocol & Port Analysis
**Based on APK Source Code Decompilation**
---
## 🎯 QUICK ANSWER
### Ports Used by RR3:
```
Port 443 (HTTPS) - ALL server communication
```
**That's it. Just standard HTTPS on port 443.**
---
## 📊 DETAILED ANALYSIS
### 1. Protocol
```
Protocol: HTTPS (HTTP over TLS/SSL)
Port: 443 (standard HTTPS port)
Method: HttpURLConnection (Java standard library)
```
### 2. Server Endpoints
**All use HTTPS on port 443:**
#### Production Servers:
```
https://syn-dir.sn.eamobile.com (Director)
https://product.sn.eamobile.com (Product Catalog)
https://user.sn.eamobile.com (User Management)
https://gateway.ea.com (API Gateway)
```
#### Network Testing:
```
https://ping1.tnt-ea.com (EA Network Check)
https://www.google.com (Backup Reachability Check)
```
#### CDN (Asset Delivery):
```
https://firemonkeys.akamaized.net (Akamai CDN)
```
#### Analytics:
```
https://pin-river.data.ea.com (Analytics)
https://river-mobile.data.ea.com (Mobile Analytics)
```
---
## 🔍 SOURCE CODE EVIDENCE
### From: `com/ea/nimble/SynergyEnvironmentImpl.java`
```java
Line 20: private static final String SYNERGY_INT_SERVER_URL =
"https://director-int.sn.eamobile.com";
Line 21: private static final String SYNERGY_LIVE_SERVER_URL =
"https://syn-dir.sn.eamobile.com";
Line 22: private static final String SYNERGY_STAGE_SERVER_URL =
"https://director-stage.sn.eamobile.com";
```
### From: `com/ea/nimble/NetworkImpl.java`
```java
Line 30: private static final String BACKUP_NETWORK_REACHABILITY_CHECK_URL =
"https://www.google.com";
Line 32: private static final String MAIN_NETWORK_REACHABILITY_CHECK_URL =
"https://ping1.tnt-ea.com";
```
### From: `com/ea/nimble/NetworkConnection.java`
```java
Line 180: httpURLConnection.setConnectTimeout((int)(this.m_request.timeout * 1000.0d));
Line 181: httpURLConnection.setReadTimeout((int)(this.m_request.timeout * 1000.0d));
// Uses standard HttpURLConnection - no custom port configuration
// URL.getDefaultPort() returns 443 for HTTPS protocol
```
---
## 🛠️ CONNECTION DETAILS
### Connection Method
```java
Class: java.net.HttpURLConnection
SSL/TLS: Automatic via HTTPS protocol
Port Resolution: URL.getDefaultPort()
- For "https://" URLs returns 443
- No explicit port specified in any URL
- No custom port configuration found
```
### Timeout Configuration
```java
Default Timeout: 30 seconds
Connect Timeout: 30,000 ms (30 seconds)
Read Timeout: 30,000 ms (30 seconds)
Source: com/ea/nimble/HttpRequest.java:11
private static int DEFAULT_NETWORK_TIMEOUT = 30;
```
### Connection Properties
```java
Method: Standard HTTP methods (GET, POST, PUT, DELETE)
Protocol: HTTP/1.1 over TLS
Keep-Alive: Disabled (new connection per request)
SSL Verification: Relaxed (accepts self-signed certs)
- Source: ALLOW_ALL_HOSTNAME_VERIFIER found in APK
```
---
## 🔐 SSL/TLS CONFIGURATION
### SSL Socket Factory
```
Uses: Default SSLSocketFactory
Certificate Validation: Permissive
- Accepts self-signed certificates
- Uses ALLOW_ALL_HOSTNAME_VERIFIER
- No certificate pinning
This means your community server can use:
✅ Self-signed certificates
✅ Let's Encrypt certificates
✅ Any valid SSL certificate
```
### Why This Matters for Community Server:
```
Your server at: https://your-domain.com:443
OR simplified: https://your-domain.com
✅ Game will connect on port 443
✅ No need for custom port configuration
✅ Standard web hosting works perfectly
✅ Can use free SSL from Let's Encrypt
```
---
## 📡 NETWORK REQUEST FLOW
### 1. Director Service (Initial Connection)
```
URL: https://syn-dir.sn.eamobile.com/director/api/android/getDirectionByPackage
Port: 443 (implicit)
Method: GET
Headers:
- SDK-VERSION
- SDK-TYPE
- Package-Name
- Platform-Version
- Carrier
- Language
```
### 2. User Management
```
URL: https://user.sn.eamobile.com/user/api/android/getDeviceID
Port: 443 (implicit)
Method: GET
Headers:
- Same as Director +
- EAM-SESSION (after auth)
```
### 3. Product Catalog
```
URL: https://product.sn.eamobile.com/product/api/core/getAvailableItems
Port: 443 (implicit)
Method: POST
Headers:
- EAM-SESSION
- EAM-USER-ID
- EA-SELL-ID
```
### 4. Asset Delivery (CDN)
```
URL: https://firemonkeys.akamaized.net/rr3/assets/[path]
Port: 443 (implicit)
Method: GET
Headers:
- Standard HTTP headers
- No authentication required
```
---
## 🚫 WHAT RR3 DOES NOT USE
### No Custom Ports:
```
❌ 8080 (HTTP alternate)
❌ 8443 (HTTPS alternate)
❌ 3000 (Development servers)
❌ 9000 (Game server ports)
❌ Any non-standard port
```
### No Alternative Protocols:
```
❌ WebSocket (no real-time communication)
❌ UDP (no game state sync)
❌ TCP sockets (no raw socket communication)
❌ QUIC/HTTP3 (uses HTTP/1.1)
```
### No P2P:
```
❌ No peer-to-peer networking
❌ No multiplayer matchmaking ports
❌ No NAT traversal
❌ All communication is client → server only
```
---
## 🔥 IMPLICATIONS FOR COMMUNITY SERVER
### Your Server Configuration:
```nginx
# Nginx/Apache configuration
server {
listen 443 ssl;
server_name your-rr3-server.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://localhost:5000; # Your ASP.NET Core app
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
# That's it! Just HTTPS on port 443.
```
### Firewall Rules Needed:
```bash
# Incoming
Allow TCP port 443 (HTTPS)
# Outgoing (if your server needs to contact other services)
Allow TCP port 443 (HTTPS)
# That's all you need!
```
### DNS Configuration:
```
APK Modification Required:
- Change hardcoded URLs in APK
- Point to your domain
- OR use DNS hijacking (hosts file on phone)
Example:
syn-dir.sn.eamobile.com → your-server.com
product.sn.eamobile.com → your-server.com
user.sn.eamobile.com → your-server.com
```
---
## 📊 NETWORK TRAFFIC CHARACTERISTICS
### Request Volume:
```
Startup: 3-5 requests (Director, User auth, Product catalog)
Gameplay: ~1 request per minute (telemetry, leaderboards)
Asset Download: Hundreds of CDN requests (initial download only)
```
### Bandwidth:
```
API Requests: <10 KB per request (JSON)
API Responses: <50 KB per response (JSON)
Asset Downloads: 1.44 GB total (one-time download)
```
### Connection Pattern:
```
Type: Short-lived HTTP requests
Duration: <5 seconds per request
Keep-Alive: Disabled (new connection each time)
Concurrent: Max 4 concurrent connections
```
---
## 🎯 PORT SCANNING RR3 SERVERS (Historical)
### Known EA Server IPs:
```bash
# These were active before shutdown announcement
nslookup syn-dir.sn.eamobile.com
# Result: Various AWS/Akamai IPs
# Port scan would show:
Port 443: OPEN (HTTPS)
Port 80: CLOSED (HTTP disabled)
All other ports: CLOSED
```
### CDN Configuration:
```bash
nslookup firemonkeys.akamaized.net
# Result: Akamai edge servers (multiple IPs)
# Only port 443 open for asset delivery
```
---
## 💡 FOR YOUR DISCORD FRIEND
**Quick Answer:**
```
Q: What ports does RR3 use?
A: Just HTTPS on port 443. That's it.
No custom ports, no UDP, no websockets.
Plain old HTTPS like any website.
Community server only needs:
- Port 443 open (HTTPS)
- Valid SSL certificate
- Standard web server (Nginx/Apache)
- Backend API (ASP.NET Core, Node, etc.)
Source code proof:
E:\rr3\decompiled\sources\com\ea\nimble\SynergyEnvironmentImpl.java
E:\rr3\decompiled\sources\com\ea\nimble\NetworkConnection.java
All URLs use https:// with no port specified = port 443 by default.
```
---
## 🔗 RELATED DOCUMENTATION
- **Endpoint Audit:** `E:\rr3\RR3CommunityServer\ENDPOINT_AUDIT.md`
- **APK Decompilation:** `E:\rr3\APK_DECOMPILATION_METHOD.md`
- **Server Implementation:** `E:\rr3\RR3CommunityServer\`
---
## ✅ VERIFICATION
### How to Verify:
```bash
# 1. Check HAR file (network capture)
# Location: G:\My Drive\pin-river.data.ea.com_2026_02_18_10_37_48.har
# Result: All requests use port 443
# 2. Check APK source code
# Files: NetworkConnection.java, SynergyEnvironmentImpl.java
# Result: No port configuration, uses URL defaults
# 3. Test with Wireshark/tcpdump
# Filter: tcp.port == 443
# Result: All RR3 traffic on port 443 only
```
---
## 📝 SUMMARY TABLE
| Aspect | Value |
|--------|-------|
| **Protocol** | HTTPS (HTTP over TLS/SSL) |
| **Port** | 443 (standard HTTPS) |
| **Connection Type** | HttpURLConnection (Java) |
| **Timeout** | 30 seconds (connect + read) |
| **SSL Verification** | Permissive (self-signed OK) |
| **Keep-Alive** | Disabled |
| **Max Concurrent** | 4 connections |
| **HTTP Version** | HTTP/1.1 |
| **Custom Ports?** | ❌ None |
| **UDP?** | ❌ No |
| **WebSocket?** | ❌ No |
---
**Bottom Line: RR3 is just a standard HTTPS client. Port 443 only.** 🌐✅

View File

@@ -1,332 +0,0 @@
# 🎯 SERVER-SIDE RR3 ASSET CAPTURE GUIDE
**Environment:** OVH Server via RDP
**Status:** 🟢 **OPTIMAL SETUP FOR PRESERVATION**
**Date:** 2026-02-18
---
## ✅ Your Advantages
Server environment is **PERFECT** for this task:
- ✅ Plenty of storage (can mirror everything)
- ✅ Fast network (OVH bandwidth)
- ✅ 24/7 availability
- ✅ Easy traffic capture (Wireshark available)
- ✅ Direct file access (no USB needed)
- ✅ Can run scripts unattended
---
## 📍 STEP 1: Locate Downloaded Assets
### BlueStacks File Locations
```
C:\ProgramData\BlueStacks_nxt\Engine\UserData\SharedFolder\
C:\ProgramData\BlueStacks_nxt\Engine\Android\
%USERPROFILE%\AppData\Local\BlueStacks_nxt\Engine\UserData\SharedFolder\
Inside emulator:
/sdcard/Android/data/com.ea.games.r3_row/files/
/sdcard/Android/obb/com.ea.games.r3_row/
```
### NoxPlayer File Locations
```
C:\Users\%USERNAME%\Nox_share\
C:\Program Files\Nox\bin\BignoxVMS\
Inside emulator:
/mnt/shared/
/sdcard/Android/data/com.ea.games.r3_row/files/
```
### LDPlayer File Locations
```
C:\Users\%USERNAME%\Documents\LDPlayer\
C:\LDPlayer\LDPlayer4.0\vms\
Inside emulator:
/sdcard/Android/data/com.ea.games.r3_row/files/
```
### MEmu File Locations
```
C:\Users\%USERNAME%\Documents\MEmu\
D:\MEmu\MemuHyperv VMs\
Inside emulator:
/sdcard/Android/data/com.ea.games.r3_row/files/
```
---
## 🔍 STEP 2: Find RR3 Assets
### Option A: Use Emulator's File Manager
```
1. Open emulator
2. Open file manager app
3. Navigate to: Android/data/com.ea.games.r3_row/files/
4. Look for:
- .pak files (car/track assets)
- .pka files (asset packages)
- .z files (compressed textures)
- manifest files
5. Share/export to Windows (emulator shared folder)
```
### Option B: ADB Command (From Server)
```powershell
# Check if ADB is available
adb devices
# If emulator is listed, pull files:
adb pull /sdcard/Android/data/com.ea.games.r3_row/files/ E:\rr3\captured-assets\
# Also check OBB directory:
adb pull /sdcard/Android/obb/com.ea.games.r3_row/ E:\rr3\captured-obb\
```
### Option C: Search Windows Filesystem
```powershell
# Search for RR3 asset files on entire server
Get-ChildItem -Path C:\ -Recurse -Include *.pak,*.pka,*.z -ErrorAction SilentlyContinue |
Where-Object { $_.FullName -like "*com.ea.games.r3_row*" } |
Select-Object FullName, Length, LastWriteTime
```
---
## 📡 STEP 3: Capture Network Traffic
### Option A: Wireshark (GUI)
```
1. Download: https://www.wireshark.org/download.html
2. Install on server
3. Start capture on active network interface
4. Filter: http or tls or ssl
5. Let RR3 download
6. Stop capture
7. Filter display: http.host contains "ea.com"
8. Export: File → Export Objects → HTTP
```
### Option B: Microsoft Message Analyzer (Built-in)
```
1. Start → Microsoft Message Analyzer
2. New Session → Live Trace
3. Select network adapter
4. Start capture
5. Let RR3 download
6. Stop and analyze
```
### Option C: tcpdump (Command Line)
```powershell
# If tcpdump is available (WSL or native)
tcpdump -i any -w E:\rr3\capture.pcap host ea.com
# Let it run while RR3 downloads
# Press Ctrl+C when done
# Analyze with Wireshark later
```
### Option D: Fiddler (HTTP Proxy)
```
1. Download: https://www.telerik.com/fiddler
2. Install and run
3. Tools → Options → HTTPS → Capture HTTPS CONNECTs
4. Tools → Options → HTTPS → Decrypt HTTPS traffic
5. Emulator should auto-detect proxy
6. Watch traffic in Sessions panel
7. File → Export → All Sessions
```
---
## 🌐 STEP 4: Extract CDN URLs
Once you have captured traffic, look for:
### URL Patterns to Find:
```
https://cloudcell.ea.com/...
https://cdn.ea.com/...
https://*.cloudfront.net/...
https://s3.amazonaws.com/ea-*/...
Common paths:
/rr3/assets/...
/realracing3/...
/mobile/rr3/...
```
### In Wireshark:
```
1. File → Export Objects → HTTP
2. Look at hostnames column
3. Filter for .pak, .pka, .z files
4. Note the full URLs
5. Export to text file
```
### In Fiddler:
```
1. Filter to show only ea.com hosts
2. Right-click session → Copy → Just URL
3. Paste all URLs to text file
4. Look for asset download patterns
```
---
## 📥 STEP 5: Mass Download Assets
### Once You Have the CDN Base URL:
```powershell
# Example: CDN is at https://cloudcell.ea.com/rr3/assets/
$cdnBase = "https://cloudcell.ea.com/rr3/assets"
$outputDir = "E:\rr3\cdn-mirror"
# Create output directory
New-Item -ItemType Directory -Path $outputDir -Force
# Download with wget (if available)
wget -r -np -nH --cut-dirs=3 -A pak,pka,z,json -e robots=off $cdnBase
# Or use PowerShell (slower but built-in)
# We'll create a script once we know the structure
```
---
## 🔧 QUICK COMMANDS
### Find All Asset Files on Server:
```powershell
Get-ChildItem -Path C:\ -Recurse -Include *.pak,*.pka,*.z |
Select-Object FullName, @{Name="SizeMB";Expression={[math]::Round($_.Length/1MB,2)}} |
Sort-Object SizeMB -Descending
```
### Check Emulator Process Details:
```powershell
Get-Process | Where-Object {$_.ProcessName -like "*Nox*" -or $_.ProcessName -like "*BlueStacks*" -or $_.ProcessName -like "*MEmu*" -or $_.ProcessName -like "*LD*"} |
Select-Object ProcessName, Id, Path, @{Name="MemoryMB";Expression={[math]::Round($_.WorkingSet/1MB,0)}}
```
### Monitor Network Usage:
```powershell
Get-NetAdapterStatistics | Select-Object Name, ReceivedBytes, SentBytes
```
### Check Free Disk Space:
```powershell
Get-PSDrive C | Select-Object Used, Free, @{Name="FreeMB";Expression={[math]::Round($_.Free/1GB,2)}}
```
---
## 📦 STEP 6: Package and Preserve
### Create Archive:
```powershell
# Once all assets are captured
$timestamp = Get-Date -Format "yyyyMMdd"
$archivePath = "E:\rr3\rr3-assets-$timestamp.zip"
# Compress with maximum compression
Compress-Archive -Path "E:\rr3\captured-assets\*" -DestinationPath $archivePath -CompressionLevel Optimal
# Check size
(Get-Item $archivePath).Length / 1GB
```
### Generate Manifest:
```powershell
# Create file list with hashes
Get-ChildItem -Path "E:\rr3\captured-assets" -Recurse -File |
Select-Object FullName, Length,
@{Name="MD5";Expression={(Get-FileHash $_.FullName -Algorithm MD5).Hash}} |
Export-Csv "E:\rr3\asset-manifest.csv" -NoTypeInformation
```
---
## 🎯 WHAT TO DO RIGHT NOW
```powershell
# 1. Check where assets are being downloaded
Get-ChildItem -Path "C:\ProgramData" -Recurse -Include *.pak,*.pka -ErrorAction SilentlyContinue |
Where-Object { $_.LastWriteTime -gt (Get-Date).AddHours(-1) } |
Select-Object FullName, Length, LastWriteTime
# 2. Check emulator's shared folders
Get-ChildItem -Path "$env:USERPROFILE\*" -Recurse -Include *.pak,*.pka -ErrorAction SilentlyContinue |
Where-Object { $_.LastWriteTime -gt (Get-Date).AddHours(-1) } |
Select-Object FullName, @{Name="SizeMB";Expression={[math]::Round($_.Length/1MB,2)}}, LastWriteTime
# 3. Start network capture (if Wireshark installed)
# Or use built-in Windows tools
```
---
## 💡 TIPS FOR SERVER ENVIRONMENT
1. **Keep RDP session active**
- Prevent auto-logout
- Keep emulator running
2. **Monitor disk space**
- Assets could be several GB
- Ensure 20+ GB free
3. **Backup immediately**
- Copy files to separate location
- Consider OVH backup service
4. **Document everything**
- Save URLs to text file
- Screenshot download progress
- Log all steps
5. **Share with community**
- Upload to Internet Archive
- Share in Discord
- Create torrent
---
## 🚨 IF DOWNLOAD STOPS
```powershell
# Check if RR3 process is still running
Get-Process | Where-Object {$_.ProcessName -like "*RealRacing*" -or $_.MainWindowTitle -like "*Real Racing*"}
# Check network activity
Get-NetTCPConnection | Where-Object {$_.OwningProcess -in (Get-Process | Where-Object {$_.ProcessName -like "*Nox*" -or $_.ProcessName -like "*BlueStacks*"}).Id}
# Restart if needed and let it resume
```
---
## 📞 WHAT TO REPORT BACK
1. **What emulator are you using?**
2. **How much has it downloaded?** (MB/GB)
3. **Where are the files located?** (path)
4. **Can you see any URLs in network monitor?**
5. **Do you have Wireshark or Fiddler available?**
Once I know these details, I can give you exact commands to run!
---
**Status:** 🟢 **Waiting for download to complete**
**Next:** Extract URLs, mirror CDN, preserve forever! 🏁

View File

@@ -1,146 +0,0 @@
# 📥 WAITING FOR ASSET TRANSFER
**Status:** User is pulling 1.44 GB of RR3 assets from phone using Copilot CLI on their local Windows PC
---
## ✅ CURRENT ACTIVITY (User's Local PC)
User's local Copilot CLI is:
- Running ADB commands to pull from phone
- Extracting everything RR3-related
- Organizing into local folder
- **Size:** 1.44 GB (full game assets from EA CDN)
---
## 📋 WHEN TRANSFER COMPLETES - NEXT STEPS
### 1. Tell Me What You Got
Let me know:
- How many files extracted?
- What file types (.pak, .pka, .z, etc.)?
- Total size after extraction?
- Any interesting folder structure?
### 2. Transfer to OVH Server
**Option A: RDP Copy (Fastest if on same network)**
```
1. In RDP session to OVH server
2. Copy from your PC folder
3. Paste to: E:\rr3\phone-assets-full\
```
**Option B: Google Drive (Reliable, slower)**
```
1. On YOUR PC: Compress folder to ZIP
2. Upload to Google Drive
3. On OVH server: Download from G:\My Drive\
4. Extract to E:\rr3\phone-assets-full\
```
**Option C: Direct Network Share (If possible)**
```
1. Share folder on your PC
2. Map network drive on OVH server
3. Copy directly
```
### 3. Analysis Phase (I'll Handle This)
Once files are on server at `E:\rr3\phone-assets-full\`:
- Count and categorize all files
- Compare against asset manifests (114,307 files catalogued)
- Extract .z compressed textures
- Map file structure to CDN paths
- Identify cars, tracks, and content
- Create master asset index
- Verify MD5 hashes
### 4. Preservation
- Archive complete asset collection
- Document findings
- Prepare for Internet Archive upload
- Share with RR3 community
---
## 🎯 EXPECTED FILES
Based on asset manifests, you should get:
### File Types:
- `.pak` - 3D model packages
- `.pka` - Asset archives
- `.z` - Compressed textures (ZLIB)
- `.dds` - DirectDraw Surface textures
- `.pvr` - PowerVR textures
- `.bin` / `.dat` - Binary game data
- `.txt` - Configuration files
- Audio files (`.mp3`, `.ogg`, etc.)
### Folder Structure (Predicted):
```
RR3-Assets/
├── cars/ (Car models by manufacturer)
├── tracks/ (Track models and textures)
├── audio/ (Sound effects, music)
├── gui/ (UI elements)
├── data/ (Game data files)
├── effects/ (Visual effects)
└── misc/ (Fonts, shaders, etc.)
```
### Asset Categories (From Manifests):
- Formula 1 cars
- NASCAR vehicles
- GT3/GT4 racing
- Formula E
- Endurance prototypes
- Various tracks/circuits
- Multiple resolution packs (480x320, 960x640, 2048x1536)
- Audio packs (base, extended)
- Seasonal content (Seasons 1-5)
- Exclusive content
---
## 🔥 WHAT THIS MEANS
**You're capturing game assets that:**
- Cost EA millions to create
- Were downloaded from live CDN before shutdown
- May never be accessible again after March 2026
- Represent years of racing game development
- Include licensed F1, NASCAR, GT content
- Enable complete game preservation
**This is HISTORIC game preservation work!** 🏁✨
---
## ⏰ ESTIMATED TIMELINE
| Step | Time | Status |
|------|------|--------|
| ADB Pull (1.44 GB) | 5-15 min | ⏳ In Progress |
| Transfer to OVH | 10-30 min | ⏳ Waiting |
| Extract & Analyze | 20-40 min | ⏳ Waiting |
| Document & Archive | 30-60 min | ⏳ Waiting |
**Total:** ~1-2 hours to complete full preservation
---
## 💬 PING ME WHEN:
✅ Your local Copilot finishes the pull
✅ You want to transfer to OVH server
✅ Files are on server and ready to analyze
✅ You have questions or issues
---
**Meanwhile, I'm standing by ready to analyze the assets!** 🚀

View File

@@ -1,393 +0,0 @@
# Real Racing 3 - Asset Import Quick Start Guide
**FOR WHEN DISCORD SENDS YOU THE FILES**
---
## 📥 Step 1: Receive the Assets
Discord will likely send you:
- A .zip/.7z/.tar.gz archive (2-5 GB)
- Or a Google Drive/Mega/Dropbox link
- Or multiple .pak/.pvr/.dat files
---
## 📦 Step 2: Extract & Organize
### If it's an archive:
```powershell
# Extract to temporary location
cd E:\rr3\
7z x assets-from-discord.zip -o"assets-temp"
```
### Check what you got:
```powershell
cd E:\rr3\assets-temp
Get-ChildItem -Recurse | Group-Object Extension | Sort-Object Count -Descending
```
**You should see:**
- `.pak` files (main game assets)
- `.pvr` files (textures - PowerVR format)
- `.dat` files (game data)
- `.atlas` files (sprite sheets)
- `.z` files (compressed data)
- `.fsh`/`.vsh` files (shaders)
---
## ✅ Step 3: Verify with Manifests (CRITICAL!)
Run the verification script:
```powershell
cd E:\rr3\
# Create verification script
@'
$manifestPath = "E:\rr3\RR3CommunityServer\RR3CommunityServer\Assets\manifests\"
$assetsPath = "E:\rr3\assets-temp\"
Write-Host "Verifying assets against manifests..." -ForegroundColor Cyan
Write-Host ""
$verified = 0
$failed = 0
$missing = 0
# Read all manifests
Get-ChildItem $manifestPath -Filter "*.txt" | ForEach-Object {
$manifest = Get-Content $_.FullName
foreach ($line in $manifest) {
if ($line -match '^/') {
$parts = $line -split "`t"
$path = $parts[0]
$expectedMd5 = $parts[1]
$fileName = [System.IO.Path]::GetFileName($path)
# Find file
$file = Get-ChildItem $assetsPath -Recurse -Filter $fileName | Select-Object -First 1
if ($file) {
# Calculate MD5
$md5 = Get-FileHash $file.FullName -Algorithm MD5
$actualMd5 = $md5.Hash.ToLower()
if ($actualMd5 -eq $expectedMd5) {
$verified++
Write-Host "✅ $fileName" -ForegroundColor Green
} else {
$failed++
Write-Host "❌ $fileName - MD5 mismatch!" -ForegroundColor Red
Write-Host " Expected: $expectedMd5" -ForegroundColor Gray
Write-Host " Got: $actualMd5" -ForegroundColor Gray
}
} else {
$missing++
Write-Host "⚠️ $fileName - NOT FOUND" -ForegroundColor Yellow
}
}
}
}
Write-Host ""
Write-Host "═══════════════════════════════════════════" -ForegroundColor Cyan
Write-Host "VERIFICATION COMPLETE" -ForegroundColor Cyan
Write-Host "═══════════════════════════════════════════" -ForegroundColor Cyan
Write-Host "✅ Verified: $verified" -ForegroundColor Green
Write-Host "❌ Failed: $failed" -ForegroundColor Red
Write-Host "⚠️ Missing: $missing" -ForegroundColor Yellow
Write-Host ""
if ($failed -eq 0 -and $missing -lt 100) {
Write-Host "🎉 Assets are GOOD! Ready to deploy!" -ForegroundColor Green -BackgroundColor DarkGreen
} else {
Write-Host "⚠️ Some issues found - check with Discord" -ForegroundColor Yellow
}
'@ | Out-File verify-assets.ps1
# Run it
.\verify-assets.ps1
```
---
## 📂 Step 4: Copy to Server
Once verified, copy to the server:
```powershell
# Copy all verified assets to server
$destination = "E:\rr3\RR3CommunityServer\RR3CommunityServer\Assets\downloaded\"
# Create directory structure
New-Item -ItemType Directory -Force -Path $destination
# Copy files (preserving structure if possible)
Copy-Item -Path "E:\rr3\assets-temp\*" -Destination $destination -Recurse -Force
Write-Host "✅ Assets copied to server!" -ForegroundColor Green
```
---
## 🗄️ Step 5: Import to Database
Create asset records in database:
```powershell
cd E:\rr3\RR3CommunityServer
# Create import script
@'
using System;
using System.IO;
using System.Linq;
using Microsoft.EntityFrameworkCore;
using RR3CommunityServer.Data;
var dbPath = "rr3community.db";
var assetsPath = "Assets/downloaded";
var manifestsPath = "Assets/manifests";
Console.WriteLine("Importing assets to database...");
using var db = new RR3DbContext(
new DbContextOptionsBuilder<RR3DbContext>()
.UseSqlite($"Data Source={dbPath}")
.Options
);
int imported = 0;
// Read manifests
foreach (var manifestFile in Directory.GetFiles(manifestsPath, "*.txt"))
{
var lines = File.ReadAllLines(manifestFile);
foreach (var line in lines)
{
if (line.StartsWith("/"))
{
var parts = line.Split('\t');
var path = parts[0];
var md5 = parts[1];
var compressedSize = long.Parse(parts[2]);
var uncompressedSize = long.Parse(parts[3]);
var fileName = Path.GetFileName(path);
// Check if asset exists
if (!db.GameAssets.Any(a => a.EaCdnPath == path))
{
// Find local file
var localFiles = Directory.GetFiles(assetsPath, fileName, SearchOption.AllDirectories);
var localPath = localFiles.FirstOrDefault();
var asset = new GameAsset
{
AssetType = DetermineAssetType(path),
FileName = fileName,
EaCdnPath = path,
LocalPath = localPath,
FileSize = uncompressedSize,
CompressedSize = compressedSize,
Md5Hash = md5,
ContentType = DetermineContentType(path),
Category = DetermineCategory(path),
DownloadedAt = localPath != null ? DateTime.UtcNow : null,
AccessCount = 0
};
db.GameAssets.Add(asset);
imported++;
if (imported % 100 == 0)
{
Console.WriteLine($"Imported {imported} assets...");
db.SaveChanges();
}
}
}
}
}
db.SaveChanges();
Console.WriteLine($"✅ Import complete! {imported} assets added to database.");
static string DetermineAssetType(string path)
{
if (path.Contains("car")) return "car";
if (path.Contains("track")) return "track";
if (path.Contains("audio")) return "audio";
if (path.Contains("gui")) return "ui";
return "other";
}
static string DetermineContentType(string path)
{
var ext = Path.GetExtension(path).ToLower();
return ext switch
{
".pak" => "application/octet-stream",
".pvr" => "image/pvr",
".dat" => "application/octet-stream",
".atlas" => "application/octet-stream",
".z" => "application/x-compress",
_ => "application/octet-stream"
};
}
static string DetermineCategory(string path)
{
if (path.Contains("/car")) return "cars";
if (path.Contains("/track")) return "tracks";
if (path.Contains("/audio")) return "audio";
if (path.Contains("/gui")) return "ui";
return "general";
}
'@ | Out-File -Encoding UTF8 import-assets.csx
# Run with dotnet-script (if installed) or manually add to server
Write-Host "⚠️ Import script created: import-assets.csx" -ForegroundColor Yellow
Write-Host "Run this inside your server project to populate the database" -ForegroundColor Gray
```
---
## 🚀 Step 6: Test Server
```powershell
cd E:\rr3\RR3CommunityServer\RR3CommunityServer
# Start server
dotnet run
# In another terminal, test:
curl https://localhost:5001/content/api/status
# Should return JSON with:
# "availableAssets": (big number)
# "status": "ready"
```
---
## 📱 Step 7: Modify APK
### Option A: APK Tool (Full Recompile)
```powershell
# Decompile
apktool d realracing3.apk -o rr3-decompiled
# Edit smali or resources to change Director URL
# From: https://syn-dir.sn.eamobile.com
# To: https://YOUR_SERVER_IP:5001
# Recompile
apktool b rr3-decompiled -o rr3-modded.apk
# Sign
jarsigner -keystore my.keystore rr3-modded.apk my-key
# Install
adb install rr3-modded.apk
```
### Option B: Hosts File (Easier but requires root)
**On Android device:**
```bash
# Root required
su
mount -o remount,rw /system
echo "YOUR_SERVER_IP syn-dir.sn.eamobile.com" >> /etc/hosts
echo "YOUR_SERVER_IP cloudcell.ea.com" >> /etc/hosts
```
**On Windows (for emulator):**
```powershell
# Edit C:\Windows\System32\drivers\etc\hosts
# Add these lines:
192.168.1.100 syn-dir.sn.eamobile.com
192.168.1.100 cloudcell.ea.com
```
---
## 🎮 Step 8: LAUNCH THE GAME!
1. Install modded APK or set up hosts file
2. Launch Real Racing 3
3. Game contacts your server (not EA!)
4. Downloads assets from your server
5. **PROFIT!** 🏎️💨
---
## 📊 Expected Results
### First Launch:
```
Game → Director Service (your server) ✅
Game → Authentication (your server) ✅
Game → Asset manifest (your server) ✅
Game → Downloads .pak files (your server) ✅
Game → PLAYABLE! 🎮
```
### What You'll See in Server Logs:
```
[INFO] Director request for package: com.ea.games.r3_row
[INFO] GetDeviceID request: hardware=abc123
[INFO] Asset download request: /gui_assets/sprites.atlas
[INFO] Serving asset: /gui_assets/sprites.atlas (3015 bytes)
[INFO] Asset download request: /cars/porsche_911_gt3.pak
[INFO] Serving asset: /cars/porsche_911_gt3.pak (5.2 MB)
```
---
## 🔥 Quick Checklist
When assets arrive:
- [ ] Download/extract files
- [ ] Run verification script (check MD5s)
- [ ] Copy to `Assets/downloaded/`
- [ ] Import to database (optional but recommended)
- [ ] Test server: `curl https://localhost:5001/content/api/status`
- [ ] Modify APK or hosts file
- [ ] Install & launch game
- [ ] **CELEBRATE!** 🎉
---
## 🆘 Troubleshooting
### Assets downloaded but game shows black screen?
- Check server logs for 404 errors
- Verify file paths match manifest paths
- Ensure file permissions are correct
### Game can't connect to server?
- Check firewall allows port 5001
- Verify APK modification worked
- Try hosts file method instead
- Check server is running: `netstat -an | findstr 5001`
### MD5 verification failed?
- Files might be corrupted during transfer
- Ask Discord for re-upload
- Check if files were unzipped correctly
---
## 📞 Next Step
**Just wait for Discord response now!**
When they send files, follow this guide step-by-step and you'll have RR3 running in no time! 🏁

View File

@@ -1,217 +0,0 @@
<img src="https://raw.githubusercontent.com/skylot/jadx/master/jadx-gui/src/main/resources/logos/jadx-logo.png" width="64" align="left" />
## JADX
![Build status](https://img.shields.io/github/actions/workflow/status/skylot/jadx/build-artifacts.yml)
![GitHub contributors](https://img.shields.io/github/contributors/skylot/jadx)
![GitHub all releases](https://img.shields.io/github/downloads/skylot/jadx/total)
![GitHub release (latest by SemVer)](https://img.shields.io/github/downloads/skylot/jadx/latest/total)
![Latest release](https://img.shields.io/github/release/skylot/jadx.svg)
[![Maven Central](https://img.shields.io/maven-central/v/io.github.skylot/jadx-core)](https://search.maven.org/search?q=g:io.github.skylot%20AND%20jadx)
![Java 11+](https://img.shields.io/badge/Java-11%2B-blue)
[![License](http://img.shields.io/:license-apache-blue.svg)](http://www.apache.org/licenses/LICENSE-2.0.html)
**jadx** - Dex to Java decompiler
Command line and GUI tools for producing Java source code from Android Dex and Apk files
> [!WARNING]
> Please note that in most cases **jadx** can't decompile all 100% of the code, so errors will occur.<br />
> Check [Troubleshooting guide](https://github.com/skylot/jadx/wiki/Troubleshooting-Q&A#decompilation-issues) for workarounds.
**Main features:**
- decompile Dalvik bytecode to Java code from APK, dex, aar, aab and zip files
- decode `AndroidManifest.xml` and other resources from `resources.arsc`
- deobfuscator included
**jadx-gui features:**
- view decompiled code with highlighted syntax
- jump to declaration
- find usage
- full text search
- smali debugger, check [wiki page](https://github.com/skylot/jadx/wiki/Smali-debugger) for setup and usage
Jadx-gui key bindings can be found [here](https://github.com/skylot/jadx/wiki/JADX-GUI-Key-bindings)
See these features in action here: [jadx-gui features overview](https://github.com/skylot/jadx/wiki/jadx-gui-features-overview)
<img src="https://user-images.githubusercontent.com/118523/142730720-839f017e-38db-423e-b53f-39f5f0a0316f.png" width="700"/>
### Download
- release
from [github: ![Latest release](https://img.shields.io/github/release/skylot/jadx.svg)](https://github.com/skylot/jadx/releases/latest)
- latest [unstable build ![GitHub commits since tagged version (branch)](https://img.shields.io/github/commits-since/skylot/jadx/latest/master)](https://nightly.link/skylot/jadx/workflows/build-artifacts/master)
After download unpack zip file go to `bin` directory and run:
- `jadx` - command line version
- `jadx-gui` - UI version
On Windows run `.bat` files with double-click\
**Note:** ensure you have installed Java 11 or later 64-bit version.
For Windows, you can download it from [oracle.com](https://www.oracle.com/java/technologies/downloads/#jdk17-windows) (select x64 Installer).
### Install
- Arch Linux
[![Arch Linux package](https://img.shields.io/archlinux/v/extra/any/jadx)](https://archlinux.org/packages/extra/any/jadx/)
[![AUR Version](https://img.shields.io/aur/version/jadx-git)](https://aur.archlinux.org/packages/jadx-git)
```bash
sudo pacman -S jadx
```
- macOS
[![homebrew version](https://img.shields.io/homebrew/v/jadx)](https://formulae.brew.sh/formula/jadx)
```bash
brew install jadx
```
- Flathub
[![Flathub Version](https://img.shields.io/flathub/v/com.github.skylot.jadx)](https://flathub.org/apps/com.github.skylot.jadx)
```bash
flatpak install flathub com.github.skylot.jadx
```
### Use jadx as a library
You can use jadx in your java projects, check details on [wiki page](https://github.com/skylot/jadx/wiki/Use-jadx-as-a-library)
### Build from source
JDK 11 or higher must be installed:
```
git clone https://github.com/skylot/jadx.git
cd jadx
./gradlew dist
```
(on Windows, use `gradlew.bat` instead of `./gradlew`)
Scripts for run jadx will be placed in `build/jadx/bin`
and also packed to `build/jadx-<version>.zip`
### Usage
```
jadx[-gui] [command] [options] <input files> (.apk, .dex, .jar, .class, .smali, .zip, .aar, .arsc, .aab, .xapk, .jadx.kts)
commands (use '<command> --help' for command options):
plugins - manage jadx plugins
options:
-d, --output-dir - output directory
-ds, --output-dir-src - output directory for sources
-dr, --output-dir-res - output directory for resources
-r, --no-res - do not decode resources
-s, --no-src - do not decompile source code
--single-class - decompile a single class, full name, raw or alias
--single-class-output - file or dir for write if decompile a single class
--output-format - can be 'java' or 'json', default: java
-e, --export-gradle - save as android gradle project
-j, --threads-count - processing threads count, default: 4
-m, --decompilation-mode - code output mode:
'auto' - trying best options (default)
'restructure' - restore code structure (normal java code)
'simple' - simplified instructions (linear, with goto's)
'fallback' - raw instructions without modifications
--show-bad-code - show inconsistent code (incorrectly decompiled)
--no-xml-pretty-print - do not prettify XML
--no-imports - disable use of imports, always write entire package name
--no-debug-info - disable debug info parsing and processing
--add-debug-lines - add comments with debug line numbers if available
--no-inline-anonymous - disable anonymous classes inline
--no-inline-methods - disable methods inline
--no-move-inner-classes - disable move inner classes into parent
--no-inline-kotlin-lambda - disable inline for Kotlin lambdas
--no-finally - don't extract finally block
--no-restore-switch-over-string - don't restore switch over string
--no-replace-consts - don't replace constant value with matching constant field
--escape-unicode - escape non latin characters in strings (with \u)
--respect-bytecode-access-modifiers - don't change original access modifiers
--mappings-path - deobfuscation mappings file or directory. Allowed formats: Tiny and Tiny v2 (both '.tiny'), Enigma (.mapping) or Enigma directory
--mappings-mode - set mode for handling the deobfuscation mapping file:
'read' - just read, user can always save manually (default)
'read-and-autosave-every-change' - read and autosave after every change
'read-and-autosave-before-closing' - read and autosave before exiting the app or closing the project
'ignore' - don't read or save (can be used to skip loading mapping files referenced in the project file)
--deobf - activate deobfuscation
--deobf-min - min length of name, renamed if shorter, default: 3
--deobf-max - max length of name, renamed if longer, default: 64
--deobf-whitelist - space separated list of classes (full name) and packages (ends with '.*') to exclude from deobfuscation, default: android.support.v4.* android.support.v7.* android.support.v4.os.* android.support.annotation.Px androidx.core.os.* androidx.annotation.Px
--deobf-cfg-file - deobfuscation mappings file used for JADX auto-generated names (in the JOBF file format), default: same dir and name as input file with '.jobf' extension
--deobf-cfg-file-mode - set mode for handling the JADX auto-generated names' deobfuscation map file:
'read' - read if found, don't save (default)
'read-or-save' - read if found, save otherwise (don't overwrite)
'overwrite' - don't read, always save
'ignore' - don't read and don't save
--deobf-res-name-source - better name source for resources:
'auto' - automatically select best name (default)
'resources' - use resources names
'code' - use R class fields names
--use-source-name-as-class-name-alias - use source name as class name alias:
'always' - always use source name if it's available
'if-better' - use source name if it seems better than the current one
'never' - never use source name, even if it's available
--use-kotlin-methods-for-var-names - use kotlin intrinsic methods to rename variables, values: disable, apply, apply-and-hide, default: apply
--rename-flags - fix options (comma-separated list of):
'case' - fix case sensitivity issues (according to --fs-case-sensitive option),
'valid' - rename java identifiers to make them valid,
'printable' - remove non-printable chars from identifiers,
or single 'none' - to disable all renames
or single 'all' - to enable all (default)
--integer-format - how integers are displayed:
'auto' - automatically select (default)
'decimal' - use decimal
'hexadecimal' - use hexadecimal
--fs-case-sensitive - treat filesystem as case sensitive, false by default
--cfg - save methods control flow graph to dot file
--raw-cfg - save methods control flow graph (use raw instructions)
-f, --fallback - set '--decompilation-mode' to 'fallback' (deprecated)
--use-dx - use dx/d8 to convert java bytecode
--comments-level - set code comments level, values: error, warn, info, debug, user-only, none, default: info
--log-level - set log level, values: quiet, progress, error, warn, info, debug, default: progress
-v, --verbose - verbose output (set --log-level to DEBUG)
-q, --quiet - turn off output (set --log-level to QUIET)
--version - print jadx version
-h, --help - print this help
Plugin options (-P<name>=<value>):
dex-input: Load .dex and .apk files
- dex-input.verify-checksum - verify dex file checksum before load, values: [yes, no], default: yes
java-convert: Convert .class, .jar and .aar files to dex
- java-convert.mode - convert mode, values: [dx, d8, both], default: both
- java-convert.d8-desugar - use desugar in d8, values: [yes, no], default: no
kotlin-metadata: Use kotlin.Metadata annotation for code generation
- kotlin-metadata.class-alias - rename class alias, values: [yes, no], default: yes
- kotlin-metadata.method-args - rename function arguments, values: [yes, no], default: yes
- kotlin-metadata.fields - rename fields, values: [yes, no], default: yes
- kotlin-metadata.companion - rename companion object, values: [yes, no], default: yes
- kotlin-metadata.data-class - add data class modifier, values: [yes, no], default: yes
- kotlin-metadata.to-string - rename fields using toString, values: [yes, no], default: yes
- kotlin-metadata.getters - rename simple getters to field names, values: [yes, no], default: yes
rename-mappings: various mappings support
- rename-mappings.format - mapping format, values: [AUTO, TINY_FILE, TINY_2_FILE, ENIGMA_FILE, ENIGMA_DIR, SRG_FILE, XSRG_FILE, JAM_FILE, CSRG_FILE, TSRG_FILE, TSRG_2_FILE, PROGUARD_FILE, RECAF_SIMPLE_FILE, JOBF_FILE], default: AUTO
- rename-mappings.invert - invert mapping on load, values: [yes, no], default: no
smali-input: Load .smali files
- smali-input.api-level - Android API level, default: 27
Environment variables:
JADX_DISABLE_XML_SECURITY - set to 'true' to disable all security checks for XML files
JADX_DISABLE_ZIP_SECURITY - set to 'true' to disable all security checks for zip files
JADX_ZIP_MAX_ENTRIES_COUNT - maximum allowed number of entries in zip files (default: 100 000)
JADX_CONFIG_DIR - custom config directory, using system by default
JADX_CACHE_DIR - custom cache directory, using system by default
JADX_TMP_DIR - custom temp directory, using system by default
Examples:
jadx -d out classes.dex
jadx --rename-flags "none" classes.dex
jadx --rename-flags "valid, printable" classes.dex
jadx --log-level ERROR app.apk
jadx -Pdex-input.verify-checksum=no app.apk
```
These options also work in jadx-gui running from command line and override options from preferences' dialog
### Troubleshooting
Please check wiki page [Troubleshooting Q&A](https://github.com/skylot/jadx/wiki/Troubleshooting-Q&A)
### Contributing
To support this project you can:
- Post thoughts about new features/optimizations that important to you
- Submit decompilation issues, please read before proceed: [Open issue](CONTRIBUTING.md#Open-Issue)
- Open pull request, please follow these rules: [Pull Request Process](CONTRIBUTING.md#Pull-Request-Process)
---------------------------------------
*Licensed under the Apache 2.0 License*

View File

@@ -1,168 +0,0 @@
# 🏎️ Real Racing 3 Texture Tools
A complete toolkit for extracting, editing, converting, and repacking Real Racing 3 texture assets.
This toolset allows you to go from original `.z` game files → editable `.png` → game-ready assets → back into the game.
---
## ✨ Features
- Extract `.z` texture files
- Convert DDS ↔ PNG for editing
- Export universal assets (Android & PC)
- Repack textures into `.z` format
- Batch processing support
- Automatic folder organisation
- Built-in Compressonator, Noesis, and Zlib tools
---
## 📁 Folder Structure
See `Directory.txt` for the full file layout.
Important folders:
- `Run_tool/` → All main batch tools
- `PNG_Universal/` → Put edited PNG files here
- `Converted to .z assets/` → Final game-ready files
- `output_dds/` → Temporary DDS output
- `extracted_dds/` → Extracted textures
- `universal_assets/` → Platform-specific exports
---
## 🚀 Quick Start
### 1⃣ Extract Game Textures
Run:
```bat
Run_tool\run.bat
```
or
```bat
Run_tool\batch_extraction.bat
```
This extracts `.z` files into readable formats.
---
### 2⃣ Convert DDS to PNG (For Editing)
```bat
Run_tool\dds_to_png.bat
```
Edit the PNG files using any image editor.
---
### 3⃣ Export Universal Assets
Put your edited PNG files into:
```
Run_tool\PNG_Universal\
```
Then run:
```bat
Run_tool\export_universal.bat
```
This creates:
- Android (ETC2)
- PC (BC3)
versions.
---
### 4⃣ Convert PNG Back to Game-Ready `.z`
After editing, run:
```bat
Run_tool\png_to_game_ready.bat
```
This converts:
PNG → DDS → ZLIB (.z)
Final files appear in:
```
Converted to .z assets\
```
These can be placed back into the game.
---
## 🛠️ Main Batch Tools
| File | Purpose |
|------|----------|
| `run.bat` | Extract single `.z` file |
| `batch_extraction.bat` | Extract multiple `.z` files |
| `dds_to_png.bat` | Convert DDS → PNG |
| `export_universal.bat` | Create Android & PC assets |
| `png_to_game_ready.bat` | Repack PNG → `.z` |
---
## ⚠️ Important Notes
- Always back up original game files
- Use matching filenames when replacing assets
- Incorrect formats may cause crashes
- Android and PC formats are supported
- iOS support is limited
---
## 📦 Requirements
- Windows 10/11
- Python 3+
- Compressonator CLI (Included)
- Noesis (Included)
All required tools are bundled in the `Tools` folder.
---
## ❓ Troubleshooting
If something does not work:
- Check file paths
- Make sure tools are installed correctly
- Run `.bat` files as Administrator
- See `Support.txt` for help
---
## 📜 Disclaimer
This project is for educational and modding purposes only.
You are responsible for how you use these tools.
---
## ⭐ Credits
- AMD Compressonator
- Noesis Tools
- PVRTexTool
- Python Zlib
Developed for the RR3 modding community.