docs(skills): add comprehensive ananta-ps-engine skill with architecture, runbooks, and reference guides
This commit is contained in:
1 parent
1262765438
commit
77feff697b
8 files changed
+626
No files matched your search
@@ -0,0 +1,122 @@
|
||||
---
|
||||
name: ananta-ps-engine
|
||||
description: >-
|
||||
Expert toolkit, procedures, and architectural patterns for reverse engineering,
|
||||
proxying, and emulating NetEase Unity/il2cpp games (specifically Project Mugen /
|
||||
Ananta CBT 4229938 and similar NetEase titles). Use when the user asks to analyze,
|
||||
build, configure, debug, patch, or run private servers, proxies, authentication bypasses,
|
||||
combat routers, NPC/monster spawners, weather engines, or protocol handlers.
|
||||
---
|
||||
|
||||
# Ananta & NetEase Unity Private Server Engine Skill
|
||||
|
||||
This skill provides the comprehensive architectural blueprint, protocol specifications, and operational runbooks for developing and maintaining private servers for **Project Mugen / Ananta (client 4229938)** and similar NetEase Unity/il2cpp titles.
|
||||
|
||||
---
|
||||
|
||||
## Architecture Overview
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
subgraph Client["Ananta Client (Unity IL2CPP 4229938)"]
|
||||
CA["GameAssembly.dll\n(TLS & Anti-Cheat Bypassed)"]
|
||||
UI["Unity UI & MPay WebView"]
|
||||
GameWorld["In-Game World\n(Combat / NPCs / Weather)"]
|
||||
end
|
||||
|
||||
subgraph Proxy["HTTPS Proxy Stack (:443, :80, :5801)"]
|
||||
Cert["DRMK Local Proxy Root CA"]
|
||||
AuthBypass["MPay JS Bridge Auth Bypass"]
|
||||
ShaderOOM["Shader Warmup OOM Suppressor"]
|
||||
ServerList["7-Column Server List Provider"]
|
||||
end
|
||||
|
||||
subgraph Server["Game Server (.NET 8 C#)"]
|
||||
LoginGate["Login & Gate Service (:5200, :5201)"]
|
||||
WorldRouter["UXRPC Game Router (:5202)"]
|
||||
CombatRouter["Pure DRMK Combat Router"]
|
||||
NpcRouter["Unified Agent & POI Spawner"]
|
||||
DebugAPI["Embedded Debug WebUI (:5809)"]
|
||||
end
|
||||
|
||||
UI -->|HTTPS Login & Gateway| Proxy
|
||||
CA -->|UXRPC Protocol| Server
|
||||
Proxy -->|Redirect to Gate| LoginGate
|
||||
LoginGate -->|Hand off to World| WorldRouter
|
||||
WorldRouter --> CombatRouter
|
||||
WorldRouter --> NpcRouter
|
||||
DebugAPI -->|REST Controls| WorldRouter
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Core System Pillars & Reference Manuals
|
||||
|
||||
### 1. Unified NPC & Monster Entity System
|
||||
- **Single Agent Model**: Monsters, bosses, street citizens, police officers, and domestic animals all share the exact same entity schema defined in `AgentConfig.json` (9,347 records).
|
||||
- **Faction Camps**: Camp `0`/`26` for hostile monsters/bosses, Camp `2` for civilians, Camp `11` for animals, Camp `16..25` for police/guards.
|
||||
- **POI Actions**: Idle (`2`), Walk (`1`), Run (`4`), Phone Call (`11`), Lean on Wall (`10`), Sit (`12`/`13`), Clapping (`6`), and Panic (`3`).
|
||||
- **Player-Relative Grid**: Spawns groups in front of the player based on live yaw angle and configurable X/Z spacing.
|
||||
- 📖 [Detailed NPC & Monster System Guide](./references/npc_and_monster_system.md)
|
||||
|
||||
### 2. Pure DRMK Combat & Character Switching
|
||||
- **Unbroken Combos**: Eliminates artificial server-side cooldown ticks (`SkillCooldownUntilTicks`) so multi-hit light attacks, heavy attacks, and skills chain smoothly without animation stutter.
|
||||
- **Authoritative Replenish**: Stamina and ultimate charge are replenished exclusively when the full combo chain finishes (`restoreResources == true`).
|
||||
- **Clean Despawn (`SyncLogicAgentLeave`)**: Formally removes previous characters from the world when switching, completely preventing character lockups, ghost entities, and floating "F" interaction prompts.
|
||||
- 📖 [Detailed Combat & Switching Architecture Guide](./references/combat_and_switching_system.md)
|
||||
|
||||
### 3. Scene ("Raid") Switching, Weather & Map Warp
|
||||
- **Triad ID Architecture**: Scene transitions require authoritative `raidId`, `instanceId`, and `universeId` matching `RaidConfig.json` and `MapentranceConfig.json`.
|
||||
- **Hybrid Atmospheric Control**: 5 standard weather states (`WeatherCatalog4229938`) coupled with client overrides for GPU particle rain (`SetGPURainActive`) and Volumetric Exponential Fog (`SetFogDensity`).
|
||||
- **2-Click Pin & Warp**: Click once to place pin, click pin again to warp. Protects against fallback to void coordinates `(0, 0, 0)`.
|
||||
- 📖 [Detailed Scene, Weather & Map Warp Guide](./references/scene_and_weather_system.md)
|
||||
|
||||
### 4. Embedded Debug API & Web Management Panel
|
||||
- **Integrated Daemon**: Self-contained HTTP REST server on `http://127.0.0.1:5809/` with frontend `index.html` compiled into `Ananta.App.dll`.
|
||||
- **Interactive Catalog Table**: Realtime search across all 9,347 agents with category tabs, pose picker, and `[➕ Add]` buttons to queue spawn commands instantly.
|
||||
- 📖 [Detailed Debug API & WebUI Guide](./references/debug_api_and_webui.md)
|
||||
|
||||
### 5. Multi-Domain HTTPS Proxy & Auth Bypass
|
||||
- **Native MPay JS Bridge**: Auto-authenticates web logins without touching NetEase authentication servers.
|
||||
- **Shader Warmup OOM Prevention**: Suppresses the 11k shader pre-warmup routine (`triggerWarmupBelowVersion: ""`) to prevent 19GB memory exhaustion.
|
||||
- **7-Column Server List**: Passes client Contract MD5 verification.
|
||||
- 📖 [Detailed Proxy & Security Bypass Guide](./references/proxy_and_security_bypass.md)
|
||||
|
||||
### 6. Protocol Codec & V7 4-Step World Entry
|
||||
- Strict handoff sequence: `SyncLogicAgentEnter` $\to$ `SyncManagedLogicAgent` $\to$ `SyncRaidBattleUnitSpirit` $\to$ `SyncPlayerCurrentSpirit` $\to$ `SyncSceneLoadCompleted`.
|
||||
- 📖 [Detailed Protocol & World Entry Guide](./references/protocol_and_world_entry.md)
|
||||
|
||||
### 7. Client Binary Patching (`GameAssembly.dll`)
|
||||
- TLS certificate pinning bypass (`ValidateCertificate` $\to$ `31 C0 C3`).
|
||||
- NEAC anti-cheat driver suppression.
|
||||
- 📖 [Detailed Binary Patching Guide](./references/binary_patching_guide.md)
|
||||
|
||||
---
|
||||
|
||||
## Standard Runbook
|
||||
|
||||
### Step 1: Network & Certificate Preparation
|
||||
1. Verify `C:\Windows\System32\drivers\etc\hosts` redirects `l50.update.netease.com` and related domains to `127.0.0.1`.
|
||||
2. Ensure `DRMK Local Proxy Root` CA is installed in `Cert:\LocalMachine\Root`.
|
||||
3. Verify ports `80`, `443`, `5801`, `5200`, `5201`, `5202`, and `5809` are free.
|
||||
|
||||
### Step 2: Game Directory Verification
|
||||
- `NtUniSdkBase.dll`: Must be original NetEase DLL (~6.16 MB), never a dummy stub.
|
||||
- `GameAssembly.dll`: Patched with TLS pinning bypass (`31 C0 C3`).
|
||||
- `boot.config`: Original game version (`pkg-version=20260804051818394p0`).
|
||||
|
||||
### Step 3: Launching Stack
|
||||
Run proxy and server together:
|
||||
```powershell
|
||||
# From workspace root:
|
||||
.\START.cmd
|
||||
```
|
||||
|
||||
### Step 4: Verification Checklist
|
||||
- [ ] Proxy logs `[PX] listening on https://0.0.0.0:443`.
|
||||
- [ ] Server prints `[READY] Приватный Сервер | client=4229938 | login=:5200,:5201 | game=:5202`.
|
||||
- [ ] Launch `Ananta.exe`.
|
||||
- [ ] No "Configuration content is corrupted" dialog.
|
||||
- [ ] No 19GB RAM OOM crash.
|
||||
- [ ] WebUI accessible at `http://127.0.0.1:5809/`.
|
||||
- [ ] Entering world completes with active character controllable.
|
||||
@@ -0,0 +1,48 @@
|
||||
# GameAssembly.dll (Il2Cpp) Binary Patching Reference
|
||||
|
||||
This document outlines the standard binary patch patterns for NetEase Il2Cpp Unity clients to allow offline private server analysis.
|
||||
|
||||
---
|
||||
|
||||
## 1. Unity TLS / Certificate Validation Bypass
|
||||
|
||||
### Target:
|
||||
`UnityEngine.Networking.CertificateHandler.ValidateCertificate`
|
||||
|
||||
### Patch:
|
||||
Replace function prologue with immediate return `true` / `0`:
|
||||
```assembly
|
||||
xor eax, eax
|
||||
ret
|
||||
```
|
||||
Opcode: `31 C0 C3` (or `B0 01 C3` for `mov al, 1; ret`).
|
||||
This allows `UnityWebRequest` to communicate with custom local HTTPS proxies without certificate verification failures.
|
||||
|
||||
---
|
||||
|
||||
## 2. PSO Warmup / Shader Compiling Stub
|
||||
|
||||
### Target:
|
||||
`UnityEngine.PSOWarmupAsyncOperation..ctor`
|
||||
|
||||
### Patch:
|
||||
```assembly
|
||||
ret
|
||||
```
|
||||
Opcode: `C3 CC CC CC`
|
||||
Stubs out the engine-level warmup operation if boot configuration or remote JSON flags fail to suppress it.
|
||||
|
||||
---
|
||||
|
||||
## 3. NetEase Anti-Cheat (NEAC) Stubbing
|
||||
|
||||
### Target:
|
||||
`NeacUtils.Initialize` or `AntiCheat` initialization routines.
|
||||
|
||||
### Patch:
|
||||
```assembly
|
||||
xor eax, eax
|
||||
ret
|
||||
```
|
||||
Opcode: `31 C0 C3`
|
||||
Prevents NEAC background thread monitoring and process termination during local debugging.
|
||||
@@ -0,0 +1,44 @@
|
||||
# Combat Combo & Character Switching Architecture Reference
|
||||
|
||||
This document explains the technical implementation of Ananta's combat mechanics and character switching router (derived from the pure DRMK architecture).
|
||||
|
||||
---
|
||||
|
||||
## 1. Combat System Architecture (`GameRouter.Combat.cs`)
|
||||
|
||||
### Problem in Previous Implementations
|
||||
In naive server implementations, servers artificially tracked server-side skill cooldowns (e.g. `SkillCooldownUntilTicks`) and rejected skill execution packets if sent within a cooldown window. Because Ananta's combat system relies on rapid, fluid multi-hit combo animations and animation cancel windows, artificial cooldowns resulted in:
|
||||
- Interrupted combo chains (player character freezes after hit 2 or 3 of a light attack combo).
|
||||
- Skills refusing to fire when triggered from a dodge/dash.
|
||||
- Desynchronized charge energy meters.
|
||||
|
||||
### The DRMK Pure Combat Solution
|
||||
The DRMK model trusts the client-side animation state machine for combo continuity:
|
||||
1. **Unconstrained Combo Chaining**: Remove artificial cooldown ticks on standard attacks and skills.
|
||||
2. **`OnReportSkillEnd` Handling**:
|
||||
- When a skill animation or combo phase completes, the client reports `report.newSkillId`.
|
||||
- The server maintains the active skill context and avoids clearing resource snapshots mid-chain.
|
||||
3. **Authoritative Resource Replenishment**:
|
||||
- Stamina, ultimate gauge, and skill charges are only replenished when the full combo sequence finishes (`restoreResources == true`).
|
||||
- This ensures continuous, uninterrupted combat combos while keeping resource states valid.
|
||||
|
||||
---
|
||||
|
||||
## 2. Character Switching Architecture (`GameRouter.Switching.cs`)
|
||||
|
||||
### The Floating "F" Prompt and Character Lockup Bug
|
||||
When switching characters, naive implementations swapped the active character ID without formally despawning the previous character from the scene. This caused two major bugs:
|
||||
1. **Ghost Unit Stalling**: The previous character remained in the scene hierarchy as a ghost entity.
|
||||
2. **Floating "F" Key Interaction**: Because the previous character was an interactable NPC/companion, an "F: Switch Character" prompt hovered permanently over the active player's head.
|
||||
3. **CharacterController Locking**: The newly spawned character had incomplete input authority, preventing movement, jumping, or turning.
|
||||
|
||||
### The Clean Switch Solution
|
||||
In `GameRouter.Switching.cs`:
|
||||
1. **Authoritative Despawn of Previous Character**:
|
||||
- Before bringing in the new character, the server sends `SyncLogicAgentLeave(oldUnitId)`.
|
||||
- This forces the client to clean up the previous character's GameObject, SkinnedMeshRenderers, and interaction colliders.
|
||||
2. **Clean Identity Assignment**:
|
||||
- Spawns the incoming character with `isAgentSwitch: false` in `WorldCodec.CurrentSpirit`.
|
||||
- Sends `SyncGamePause(false)` to guarantee the player controller receives unhindered input focus.
|
||||
3. **Instant Responsiveness**:
|
||||
- The player immediately gains 100% control over the new character (WASD, sprint, jump, attacks) with zero ghosting or floating UI elements.
|
||||
@@ -0,0 +1,89 @@
|
||||
# Debug API & Web Management Panel Reference
|
||||
|
||||
This document details the architecture and REST API of the embedded Debug Panel (`DebugApiServer.cs`) and WebUI (`index.html`).
|
||||
|
||||
---
|
||||
|
||||
## 1. Architecture Overview
|
||||
|
||||
The Debug API server is an embedded HTTP daemon running on `http://127.0.0.1:5809/`:
|
||||
- **Self-Contained**: The web frontend (`index.html`) is embedded directly as an assembly resource inside `Ananta.App.dll`.
|
||||
- **Zero-Dependency**: No external web server (Nginx/Apache/Node) is needed for debug operations.
|
||||
- **Localhost Restricted**: Bound exclusively to loopback `127.0.0.1` for safety.
|
||||
|
||||
---
|
||||
|
||||
## 2. Complete REST API Specifications
|
||||
|
||||
### `GET /api/status`
|
||||
Returns live state of the connected game session.
|
||||
```json
|
||||
{
|
||||
"online": true,
|
||||
"player": { "x": 3142.7, "y": 0.0, "z": 2522.8, "yaw": 85.5 },
|
||||
"spawn": { "x": 3142.7, "y": 0.0, "z": 2522.8 },
|
||||
"ready": true,
|
||||
"activeUnit": 1001
|
||||
}
|
||||
```
|
||||
|
||||
### `GET /api/npc/catalog?cat={category}&q={query}&limit={limit}`
|
||||
Queries the unified Agent database (`AgentConfig.json`) across 9,347 entities.
|
||||
- **Parameters**:
|
||||
- `cat`: `"all"` | `"monster"` | `"citizen"` | `"police"` | `"animal"` | `"ally"`
|
||||
- `q`: Free-text search term (matches Chinese name, English name, or numeric ID)
|
||||
- `limit`: Number of records (default `150`, max `300`)
|
||||
- **Response**:
|
||||
```json
|
||||
{
|
||||
"categories": [ { "id": "monster", "label": "⚔️ Monsters & Bosses" }, ... ],
|
||||
"poiActions": [ { "id": 2, "name": "🧍 Idle" }, { "id": 1, "name": "🚶 Walk" }, ... ],
|
||||
"items": [
|
||||
{
|
||||
"id": 40900579,
|
||||
"name": "谜面帮哨兵 (Enigma Gang Sentry)",
|
||||
"category": "monster",
|
||||
"model": 86971020,
|
||||
"camp": 26,
|
||||
"defaultPoi": 0
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### `POST /api/npc/spawn`
|
||||
Spawns a batch of NPCs or monsters in a player-relative grid.
|
||||
- **Request Payload**:
|
||||
```json
|
||||
{
|
||||
"items": [
|
||||
{ "npcFormworkId": 40900579, "poiActionId": 0 },
|
||||
{ "npcFormworkId": 40130709, "poiActionId": 2 }
|
||||
],
|
||||
"xSpacing": 1.5,
|
||||
"zSpacing": 1.5,
|
||||
"maxPerRow": 10
|
||||
}
|
||||
```
|
||||
|
||||
### `GET /api/scenes`
|
||||
Returns dynamically parsed scene and raid entrance presets from `RaidConfig.json` and `MapentranceConfig.json`.
|
||||
|
||||
### `POST /api/world/switch-scene`
|
||||
Executes an authoritative world transition.
|
||||
- **Payload**: `{ "preset": "longqi_temple" }` or custom `{ "raidId": 23300999, "instanceId": 20001223, "universeId": 76000888, "x": -4306.0, "y": 156.8, "z": -3240.8, "facing": 133 }`.
|
||||
|
||||
### `POST /api/player/teleport`
|
||||
Instantly teleports the player's active character.
|
||||
- **Payload**: `{ "x": 100.0, "y": 20.0, "z": -50.0, "facing": 90.0 }`.
|
||||
|
||||
### `POST /api/weather/set` & `POST /api/weather/fog`
|
||||
- **Weather Payload**: `{ "weatherId": 3 }` (1: Sunny, 2: Cloudy, 3: Rain, 4: Storm, 5: Afterrain).
|
||||
- **Fog Payload**: `{ "density": 0.08 }` (0.00 to 0.15).
|
||||
|
||||
### `POST /api/player/toggle-clothes`
|
||||
Toggles visibility of `SkinnedMeshRenderer` clothing meshes without hiding body geometry.
|
||||
|
||||
### `POST /api/player/unstuck` & `POST /api/player/rollback-10s`
|
||||
- **Unstuck**: Clears animation controller locks and restores player input.
|
||||
- **Rollback**: Restores position from a rolling 10-second coordinate buffer.
|
||||
@@ -0,0 +1,63 @@
|
||||
# Ananta NPC & Monster Entity System Reference
|
||||
|
||||
This document details the unified Agent architecture for Project Mugen / Ananta CBT (Client 4229938), covering NPC civilians, hostile enemies/bosses, animals, and POI actions.
|
||||
|
||||
---
|
||||
|
||||
## 1. Unified Agent Concept (`AgentConfig.json`)
|
||||
|
||||
In Ananta (NetEase L50 engine), all living non-player entities in the world—whether they are street pedestrians, patrolling police officers, stray cats, or colossal bosses—share the exact same underlying entity model defined in `AgentConfig.json` (9,347 records).
|
||||
|
||||
### Camp Classification (Factions)
|
||||
The engine separates entity behaviors and combat hostility primarily using the `Camp` integer:
|
||||
|
||||
| Camp | Category | Description & Examples | Default Behavior |
|
||||
| :---: | :--- | :--- | :--- |
|
||||
| **`0`, `26`** | **⚔️ Monsters & Enemies** | Hostile gangsters (谜面帮), thugs, mech bikers (狂飙引擎), TV-heads (电视脑), mutant bosses, and slime creatures. | Hostile, targets Player on sight, combat AI active. |
|
||||
| **`2`** | **🚶 Citizens & Civilians** | Urban civilians, students, workers, passersby (e.g. Nanami McIntyre [40130709], Liam Brown [40130001], Fujiwara Kazuma [4065053]). | Neutral, wanders or plays idle/social POI animations. |
|
||||
| **`11`** | **🐱 Animals & Mascots** | Domestic animals and quirky world mascots (e.g. Chaos Radio Duck [4065051], Squirrel Radio [4065052], Cats [40120100], Ducks [40120325], Pigeons [40120319]). | Ambient animal behaviors, flees or wanders, non-combatant. |
|
||||
| **`1`** | **🤝 Allies & Story Companions** | Friendly NPCs, party members in narrative mode, quest givers. | Friendly to player, non-targetable by basic attacks. |
|
||||
| **`16..25`** | **👮 Police & Security** | Baton patrol officers, shield riot guards, armed security enforcers. | Neutral/Law enforcement, attacks hostile gang factions. |
|
||||
|
||||
---
|
||||
|
||||
## 2. POI Actions & Animation System (`UrbanDiversityPOIActionConfig.json`)
|
||||
|
||||
NPCs and non-hostile entities can be spawned with specific Points of Interest (POI) action IDs that dictate their visual posture and interaction animation:
|
||||
|
||||
| POI ID | Animation / Action Name | Description & Usage |
|
||||
| :---: | :--- | :--- |
|
||||
| **`0`** | `Auto / Default` | No specific POI; uses entity's default idle or combat stance. Ideal for monsters. |
|
||||
| **`1`** | `走路 (Walk)` | Natural urban walking locomotion. |
|
||||
| **`2`** | `idle (Idle Stand)` | Standard standing idle pose. Ideal for street citizens and guards. |
|
||||
| **`3`** | `受惊 (Scared / Panic)` | Panic/frightened posture with hands raised. |
|
||||
| **`4`** | `跑步 (Run)` | Jogging/running locomotion. |
|
||||
| **`5`** | `围观 (Spectate)` | Standing and curiously watching an event / crowd gathering. |
|
||||
| **`6`** | `站姿_通用_鼓掌 (Clap)` | Standing and applauding / cheering. |
|
||||
| **`8`** | `使用售货机 (Vending Machine)` | Interaction with drinks/vending machines. |
|
||||
| **`10`** | `站姿_通用_靠墙休息 (Lean Wall)` | Relaxed posture leaning back against a wall or lamp post. |
|
||||
| **`11`** | `停驻拍照打电话 (Phone / Photo)` | Holding smartphone up to ear or taking photos. |
|
||||
| **`12`** | `正式坐闲置 (Formal Sit)` | Sitting upright formally (on bench or chair). |
|
||||
| **`13`** | `放松坐闲置 (Relaxed Sit)` | Casual sitting posture with relaxed limbs. |
|
||||
| **`15`** | `坐着交谈 (Sit & Talk)` | Sitting while gesturing and talking to nearby companions. |
|
||||
|
||||
---
|
||||
|
||||
## 3. Server-Side Spawning Pipeline (`GameRouter.Npc.cs`)
|
||||
|
||||
When spawning an agent via `/api/npc/spawn`, the server executes the following pipeline:
|
||||
|
||||
1. **Transform Calculation**:
|
||||
- Computes player forward vector from player's current yaw rotation.
|
||||
- Places the entity batch in an offset grid in front of the player (e.g. 5m forward, distributed with configurable X and Z spacing).
|
||||
- Facing angle is rotated $180^\circ$ relative to player so spawned agents face toward the player.
|
||||
|
||||
2. **Catalog Validation**:
|
||||
- `NpcCatalog4229938.TryGet(npcFormworkId, out var npc)` ensures the ID exists in `AgentConfig.json`.
|
||||
- Resolves model ID (`GeneralModelId`), anim set tag (`AnimStereotype` / `BattleAnimType`), and persona ID.
|
||||
|
||||
3. **Packet Transmission Sequence**:
|
||||
- **`SyncLogicAgentEnter`**: Instantiates entity ID, archetype, position (`Vec3`), rotation (`Vec3`), and base logic state.
|
||||
- **`SyncManagedLogicAgent`**: Attaches AI controller, perception component, and behavior action group.
|
||||
- **`SyncRaidBattleUnitSpirit`**: Links 3D visual model prefab and combat component asset.
|
||||
- **`SyncNpcPoiAction`** (if POI ID > 0): Triggers POI animation cycle.
|
||||
@@ -0,0 +1,54 @@
|
||||
# NetEase Unity / UX-RPC Protocol & World Entry Handoff Reference
|
||||
|
||||
This document defines the packet framing, protocol conventions, and runtime handoff transactions required to successfully enter the world, switch characters, and manage gameplay state in Project Mugen / Ananta CBT 4229938.
|
||||
|
||||
---
|
||||
|
||||
## 1. Frame Structure & Encryption
|
||||
|
||||
The client communicates over TCP using binary packets:
|
||||
- **Frame Header**: 4-byte payload length (big-endian).
|
||||
- **Packet Structure**:
|
||||
- `Header`: Packet Kind (`Invoke = 1`, `Return = 2`, `Notify = 3`) + Method ID (u32) + Sequence ID (u32).
|
||||
- `Payload`: Binary serialized according to `RPCSerializeAuto.lua` / Il2Cpp `TypeSerializer`.
|
||||
- **Encryption**: UxChaCha8 stream cipher. Disabled or transparently negotiated during local private server handshakes.
|
||||
|
||||
---
|
||||
|
||||
## 2. The Strict 4-Step World Entry Handoff (V7 Protocol)
|
||||
|
||||
When `Game_LoginGame` or `Game_RequestGameSceneData` is received, the server MUST NOT send presentation, buffs, or combat deltas until the canonical 4-step world entry transaction finishes:
|
||||
|
||||
```text
|
||||
Step 1: SyncLogicAgentEnter (Unit ID)
|
||||
Step 2: SyncManagedLogicAgent (Unit ID, Player Pid, 0)
|
||||
Step 3: SyncRaidBattleUnitSpirit (AOI / Position / Facing / Template)
|
||||
Step 4: SyncPlayerCurrentSpirit (Player Pid, Template ID, Unit ID, isAgentSwitch: false)
|
||||
```
|
||||
|
||||
### Loading Synchronization Sequence:
|
||||
1. Server sends `SyncEnterScene`.
|
||||
2. Client loads assets and sends `AskLoadSceneCompleted(sceneId, sessionId)`.
|
||||
3. Server executes the 4-step handoff above.
|
||||
4. Client sends `AskLoadingFinished(sceneId, sessionId)`.
|
||||
5. Server sends `SyncSceneLoadCompleted(sceneId)` as the **first and only** response.
|
||||
6. Once the client receives `SyncSceneLoadCompleted`, gameplay control is enabled!
|
||||
|
||||
---
|
||||
|
||||
## 3. Character Switching & Position Persistence
|
||||
|
||||
When switching spirits via `AskSwitchSpirit`:
|
||||
1. Server saves current position & rotation from movement reports.
|
||||
2. Server executes spirit swap without despawning or moving the actor.
|
||||
3. Sends `SyncPlayerCurrentSpirit(pid, newTemplateId, newUnitId, isAgentSwitch: true)`.
|
||||
4. The client plays the switch animation while preserving coordinate continuity.
|
||||
|
||||
---
|
||||
|
||||
## 4. Web Traversal (Spider-Man Traversal Buffs)
|
||||
|
||||
Ananta traversal mechanics (web swinging, wall-running, parkour) rely on persistent buff states applied to the player unit:
|
||||
- `PersistentGrappleBuffId`: `52853760`
|
||||
- `SharedBuffIds`: `[52607001, 52606154, 52606102, 52606124, 52853760, 52601457, 52601458, 52601459, 52800600, 52959514, 52959516, 52606105, 52605817]`
|
||||
- When entering combat or traversal, server notifies `AskAddClientBuff` with these IDs.
|
||||
@@ -0,0 +1,150 @@
|
||||
# Proxy, SSL, UniSDK Auth, and Shader Warmup Bypass Reference
|
||||
|
||||
This document details the exact mechanisms required to intercept, authenticate, and run NetEase Unity (il2cpp) clients (specifically Project Mugen / Ananta CBT 4229938 and similar NetEase titles) without modifying client binaries or using brittle fake DLLs.
|
||||
|
||||
---
|
||||
|
||||
## 1. Two-Tier PKI Certificate Architecture
|
||||
|
||||
Unity's modern HTTP/TLS stack rejects self-signed server certificates that have `CA=TRUE` directly on the leaf certificate. The correct solution is a clean two-tier PKI:
|
||||
|
||||
1. **Root CA (`DRMK Local Proxy Root`)**:
|
||||
- `Subject`: `CN=DRMK Local Proxy Root`
|
||||
- `Basic Constraints`: `critical, CA=TRUE, pathlength=1`
|
||||
- `Key Usage`: `CertSign, CRLSign, DigitalSignature`
|
||||
- Installed into `Cert:\LocalMachine\Root` (Windows Trusted Root Certification Authorities).
|
||||
2. **Leaf Certificate (`l50.update.netease.com`)**:
|
||||
- `Subject`: `CN=l50.update.netease.com`
|
||||
- `Basic Constraints`: `critical, CA=FALSE`
|
||||
- `Enhanced Key Usage`: `1.3.6.1.5.5.7.3.1` (Server Authentication)
|
||||
- Signed by the Root CA above.
|
||||
- Includes full SAN (Subject Alternative Name) list for all NetEase update/auth domains.
|
||||
|
||||
### Required Redirect Domains in `hosts`:
|
||||
```text
|
||||
127.0.0.1 l50.update.netease.com
|
||||
127.0.0.1 serverlist-test.l50.leihuo.netease.com
|
||||
127.0.0.1 l50.gdl.netease.com
|
||||
127.0.0.1 l50.gph.netease.com
|
||||
127.0.0.1 l50.gsgph.netease.com
|
||||
127.0.0.1 service.mkey.163.com
|
||||
127.0.0.1 qatest.g.mkey.163.com
|
||||
127.0.0.1 bind-mobile.g.mkey.163.com
|
||||
127.0.0.1 mpay-common-server.g.mkey.163.com
|
||||
127.0.0.1 whoami.nie.netease.com
|
||||
127.0.0.1 protocol.unisdk.netease.com
|
||||
127.0.0.1 tpsl.nie.netease.com
|
||||
127.0.0.1 applog.matrix.netease.com
|
||||
127.0.0.1 mgbsdk.matrix.netease.com
|
||||
127.0.0.1 mgbsdktest.matrix.netease.com
|
||||
127.0.0.1 dns.update.netease.com
|
||||
127.0.0.1 openapi.music.163.com
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. Authentic `NtUniSdkBase.dll` WebView Bridge Auth Bypass
|
||||
|
||||
Do **NOT** replace `NtUniSdkBase.dll` with a fake stub DLL. Use the authentic NetEase DLL (6.16 MB) and intercept the WebView login request:
|
||||
|
||||
1. In the HTTPS proxy (port 443), intercept:
|
||||
- `GET /local-mpay-login`
|
||||
- `GET /sdk/uni_sauth`
|
||||
- `POST /sdk/check_enter`
|
||||
2. When UniSDK requests `service.mkey.163.com/local-mpay-login`, return a lightweight HTML payload containing a client-side JavaScript bridge trigger:
|
||||
```javascript
|
||||
const user = { /* account payload */ };
|
||||
const payload = {
|
||||
methodId: "ngwebview_notify_native",
|
||||
reqData: {
|
||||
methodId: "onUserLogin",
|
||||
device_id: user.device_id,
|
||||
deviceid: user.deviceid,
|
||||
udid: user.udid,
|
||||
user: user
|
||||
}
|
||||
};
|
||||
|
||||
function sendLogin() {
|
||||
try {
|
||||
if (window.NeteaseMpayJSBridge?.Common?.onUserLogin) {
|
||||
window.NeteaseMpayJSBridge.Common.onUserLogin(user);
|
||||
}
|
||||
} catch (e) {}
|
||||
try {
|
||||
if (window.UniSDKJSBridge?.postMsgToNative) {
|
||||
window.UniSDKJSBridge.postMsgToNative(payload);
|
||||
}
|
||||
} catch (e) {}
|
||||
}
|
||||
window.addEventListener("NeteaseMpayJSBridgeReady", sendLogin);
|
||||
setTimeout(sendLogin, 200);
|
||||
```
|
||||
3. This delivers the login callback straight into `NtUniSdkBase.dll` natively.
|
||||
|
||||
---
|
||||
|
||||
## 3. Shader Warmup OOM & RAM 100% Suppression
|
||||
|
||||
When `triggerWarmupBelowVersion` in `pc_netease_version.json` contains a version string, the engine triggers warmup for all 11,384 shaders simultaneously across all CPU threads at full speed (`d3d12-pso-warmup-full-speed=true`), causing a 19+ GB memory surge and a `CreateCommittedResource (8007000e)` crash.
|
||||
|
||||
**Fix**:
|
||||
In `pc_netease_version.json`:
|
||||
```json
|
||||
{
|
||||
"resUpdate": [{
|
||||
"minV": "0",
|
||||
"maxV": "18446744073709551615",
|
||||
"resV": "20260805061659654p0",
|
||||
"resC": "b5481abf8e882801b424fe2c0bf0adfe",
|
||||
"soResC": "",
|
||||
"enableDlc": "False",
|
||||
"triggerWarmupBelowVersion": "",
|
||||
"codeV": "4229938",
|
||||
"artifactV": "4221361",
|
||||
"enableIBT": "False",
|
||||
"enableIBTOneInN": "1"
|
||||
}]
|
||||
}
|
||||
```
|
||||
Setting `triggerWarmupBelowVersion: ""` (empty string) completely skips full PSO shader compilation!
|
||||
|
||||
---
|
||||
|
||||
## 4. ServerList Contract MD5 Bypass
|
||||
|
||||
Client 4229938 calculates its runtime Contract MD5. If `serverlist.txt` includes extra columns (hash, artifact, branch), `LoginManager.CheckVersion` checks the hash and rejects the server with *"Server is under maintenance"*.
|
||||
|
||||
**Fix**:
|
||||
Serve exactly 7 basic columns:
|
||||
```text
|
||||
*,801,QA101,Outer,http://127.0.0.1:5801/LoginList,1,14
|
||||
```
|
||||
Omitting the hash/version columns causes `CheckVersion` to skip validation entirely.
|
||||
|
||||
---
|
||||
|
||||
## 5. System.Text.Json Case-Insensitive Collision Fix
|
||||
|
||||
In C# .NET 8, building an anonymous object with both `deviceid` and `deviceId` throws:
|
||||
```text
|
||||
System.ArgumentException: An item with the same key has already been added. Key: deviceid
|
||||
```
|
||||
This causes `CheckAccount` to fail silently and send an empty response, trapping the client at the start menu.
|
||||
|
||||
**Fix**:
|
||||
Use `Dictionary<string, object?>` instead of anonymous objects:
|
||||
```csharp
|
||||
var loginJson = JsonSerializer.Serialize(new Dictionary<string, object?>
|
||||
{
|
||||
["deviceid"] = deviceId,
|
||||
["device_id"] = deviceId,
|
||||
["udid"] = deviceId,
|
||||
["unisdk_device_id"] = deviceId,
|
||||
["code"] = 200,
|
||||
["subcode"] = 0,
|
||||
["msg"] = "ok",
|
||||
["uid"] = Profile.AccountId,
|
||||
["pid"] = Profile.PlayerPid
|
||||
});
|
||||
```
|
||||
@@ -0,0 +1,56 @@
|
||||
# Scene Switching, Weather Engine, and Map Warp Reference
|
||||
|
||||
This document covers the mechanics for world region ("raid") switching, atmospheric/weather control, and the 2-click pin & warp map interaction.
|
||||
|
||||
---
|
||||
|
||||
## 1. Scene ("Raid") Switching (`SceneCatalog4229938.cs`)
|
||||
|
||||
Ananta's open world is partitioned into distinct sub-regions, instances, and raids defined in `RaidConfig.json` and `MapentranceConfig.json`:
|
||||
|
||||
### Triad ID Architecture
|
||||
Every scene transition requires three authoritative identifiers:
|
||||
1. **`raidId`**: The specific map/dungeon region (e.g. `23300888` for Main City, `23300999` for Longqi Mountain).
|
||||
2. **`instanceId`**: The active scene instance (e.g. `20001222`, `20001223`).
|
||||
3. **`universeId`**: The overarching world universe context (standard: `76000888`).
|
||||
|
||||
### Dynamic Presets
|
||||
The server parses all valid map entrances dynamically into `SceneCatalog4229938.Presets`:
|
||||
- **Main City Center**: `raid: 23300888`, `x: 3142.7`, `y: 0`, `z: 2522.8`
|
||||
- **Airport District**: `raid: 23300888`, `x: -4468.3`, `y: -6.2`, `z: -2597.5`
|
||||
- **Longqi Ancient Temple**: `raid: 23300999`, `x: -4306.0`, `y: 156.8`, `z: -3240.8`
|
||||
- **Longqi Tea Plantation**: `raid: 23300999`, `x: -4818.4`, `y: 192.3`, `z: -2690.1`
|
||||
|
||||
When a switch is requested, the server sends `SyncSceneLoadCompleted` and teleports the player's managed spirit into the new instance.
|
||||
|
||||
---
|
||||
|
||||
## 2. Weather & Atmospheric Control (`WeatherCatalog4229938.cs`)
|
||||
|
||||
Ananta features an advanced hybrid weather pipeline combining server RPC state with client shader/particle overrides:
|
||||
|
||||
### Standard Weather States (`WeatherCatalog4229938`)
|
||||
| ID | Weather Name | Environment Visuals |
|
||||
| :---: | :--- | :--- |
|
||||
| **`1`** | **☀️ Sunny (晴天)** | Clear sky, bright sunlight, natural shadows. |
|
||||
| **`2`** | **⛅ Cloudy (多云)** | Overcast clouds, diffused indirect lighting. |
|
||||
| **`3`** | **🌧️ Rain (小雨)** | Light precipitation, road puddle reflections. |
|
||||
| **`4`** | **⛈️ Storm (暴风雨)** | Heavy rain, thunderstorm lighting, active wind vectors. |
|
||||
| **`5`** | **🌤️ Afterrain (雨后)** | High-clarity atmosphere, wet asphalt specular glimmers. |
|
||||
|
||||
### Hybrid GPU Rain & Volumetric Fog
|
||||
To guarantee visual effects render immediately without waiting for client transition cycles:
|
||||
- **`CMD:SET_WEATHER:<id>`**: Dispatched via `SyncNotice` to activate client-side GPU particle rain (`SetGPURainActive`).
|
||||
- **`CMD:SET_FOG:<density>`**: Direct override for Unity's Volumetric Exponential Fog density (e.g. `0.08` for heavy fog, `0.00` for crystal clear).
|
||||
|
||||
---
|
||||
|
||||
## 3. 2-Click Pin & Warp Map Interaction
|
||||
|
||||
### Problem with Standard Teleport
|
||||
In default CBT clients, clicking on the mini-map or full map frequently triggered coordinate conversion errors, causing players to teleport to $(0, 0, 0)$ (ocean fall or out-of-bounds void).
|
||||
|
||||
### The 2-Click Pin & Warp Pattern
|
||||
1. **Click 1**: Left-clicking anywhere on the map drops a navigation pin and notifies the player: `"Pin set! Click again to Warp"`.
|
||||
2. **Click 2**: Clicking directly on the set pin executes the warp to those precise world coordinates and automatically dismisses the map screen.
|
||||
3. **Zero-Coordinate Safety Interceptor**: Both client proxy and server packet handlers intercept any destination vector matching $(0, 0, 0)$ or invalid NaN/Infinity coordinates, protecting the player from void death.
|
||||
Reference in new issue
Block a user