Remove documentation files - moved to main docs repo
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -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!** 📱💾
|
||||
@@ -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.** 🏁✨
|
||||
@@ -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*
|
||||
@@ -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*
|
||||
@@ -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! 🎮
|
||||
@@ -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.
|
||||
@@ -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!)
|
||||
@@ -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. 🏁✨**
|
||||
@@ -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
|
||||
@@ -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.
|
||||
@@ -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! 🎮💾
|
||||
@@ -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*
|
||||
@@ -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! 🏁
|
||||
@@ -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!
|
||||
@@ -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
|
||||
@@ -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! 🏁
|
||||
@@ -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.*
|
||||
418
PROJECT_INDEX.md
418
PROJECT_INDEX.md
@@ -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*
|
||||
@@ -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.
|
||||
@@ -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.** 🌐✅
|
||||
@@ -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! 🏁
|
||||
@@ -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!** 🚀
|
||||
@@ -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! 🏁
|
||||
217
jadx/README.md
217
jadx/README.md
@@ -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
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
[](https://search.maven.org/search?q=g:io.github.skylot%20AND%20jadx)
|
||||

|
||||
[](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: ](https://github.com/skylot/jadx/releases/latest)
|
||||
- latest [unstable build ](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
|
||||
[](https://archlinux.org/packages/extra/any/jadx/)
|
||||
[](https://aur.archlinux.org/packages/jadx-git)
|
||||
```bash
|
||||
sudo pacman -S jadx
|
||||
```
|
||||
- macOS
|
||||
[](https://formulae.brew.sh/formula/jadx)
|
||||
```bash
|
||||
brew install jadx
|
||||
```
|
||||
- Flathub
|
||||
[](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*
|
||||
@@ -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.
|
||||
Reference in New Issue
Block a user