Files
CypherCore/PORTING_12.0.7_FASE5.md
adevopg f58dbf7756 Port to WoW client 12.0.7 (build 68453)
Adapt CypherCore from 11.2.5.63796 to 12.0.7.68453 using TrinityCore as
byte-exact reference.

- Fase 1: build gate 68453 (build_info + build_auth_key SQL, keys from TC)
- Fase 2: Opcodes.cs remapped by name to 12.0.7 values
- Fase 3: 32 DB2 structs + HotfixDatabase.cs SELECTs realigned; fixed
  ReputationManager/SpellInfo refs
- Fase 4: UpdateFields ported (GameObject/Conversation/AreaTrigger/Player/
  Unit/ActivePlayer + nested VisibleItem/QuestLog/BitVectors/CraftingOrderItem/
  SkillInfo)
- Critical protocol fixes: CreateObject header +3 bits (Room/Decor/MeshObject);
  EntityFragment enum renumbered to 12.0.7 (was 11.2.5 values, breaking every
  object packet)
- New-entity foundation: TypeId/TypeMask/HighGuid.MeshObject, fragment tags
- MeshObject entity scaffold (Midnight features are wire-format only)

Builds clean (dotnet build -c Release, 0 errors).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-12 19:44:16 +02:00

115 lines
5.9 KiB
Markdown

# Fase 5 — Poner el cliente 12.0.7 (build 68453) a funcionar en CypherCore
Guía práctica para validar el port 11.2.5 → 12.0.7. El core ya compila con Fases 1-4 aplicadas.
---
## 0. Prerequisitos
- **Cliente WoW 12.0.7 build 68453** completo (CASC descargado).
- **MySQL/MariaDB** corriendo en `127.0.0.1:3306`.
- **Core compilado** → `Build/Release/AnyCPU/` (`WorldServer.exe`, `BNetServer.exe`).
- **Extractores de TrinityCore master** (soportan 12.0.7). Descarga los binarios de TC o compílalos: `mapextractor`, `vmap4extractor` + `vmap4assembler`, `mmaps_generator`, y el extractor de DB2/DBC/CASC.
> El core NO trae extractores propios: usa los de TrinityCore (ver README de Cypher).
---
## 1. Extraer datos del cliente 12.0.7
Copia los extractores de TC a la **raíz del cliente 12.0.7** y ejecútalos ahí, en este orden:
1. **DB2/DBC + mapas** (`mapextractor`) → genera `dbc/` y `maps/`.
2. **VMaps** (`vmap4extractor` luego `vmap4assembler`) → genera `vmaps/`.
3. **MMaps** (`mmaps_generator`) → genera `mmaps/`. (Lento; puedes lanzarlo por mapa.)
Copia las carpetas resultantes (`dbc`, `maps`, `vmaps`, `mmaps`) al **DataDir** del WorldServer (por defecto `Build/Release/AnyCPU/Data/`).
> ⚠️ Los `.db2` extraídos DEBEN ser del cliente 12.0.7. Si extraes con datos de otra versión, las structs DB2 (Fase 3) no cuadrarán.
---
## 2. Bases de datos (4)
Cypher usa 4 DBs: **auth**, **characters**, **world**, **hotfixes**.
1. Crea las 4 vacías en MySQL:
```sql
CREATE DATABASE auth; CREATE DATABASE characters; CREATE DATABASE world; CREATE DATABASE hotfixes;
```
2. **auth + characters**: se auto-aplican desde `sql/base/` al arrancar (ver §3, `Updates.AutoSetup=1`).
3. **world + hotfixes**: ⚠️ **NO están en `sql/base/`** — necesitas el **dump completo de world/hotfixes de CypherCore** (su equivalente al TDB de TrinityCore). Sin la world DB no hay mundo. Consíguelo del release de CypherCore correspondiente e impórtalo.
4. **Mi SQL de Fase 1** (`sql/updates/auth/master/2026_07_12_00_auth.sql`) lo aplica el updater solo — mete build 68453 en `build_info`/`build_auth_key` y pone `realmlist.gamebuild=68453`.
5. Verifica `realmlist`: `address=127.0.0.1`, `localAddress`, `gamebuild=68453`.
---
## 3. Configuración
```
cd Build/Release/AnyCPU
copy WorldServer.conf.dist WorldServer.conf
copy BNetServer.conf.dist BNetServer.conf
```
**WorldServer.conf**:
- `DataDir = "./Data"` (donde copiaste dbc/maps/vmaps/mmaps).
- `LoginDatabaseInfo` / `WorldDatabaseInfo` / `CharacterDatabaseInfo` / `HotfixDatabaseInfo` → host/port/user/pass/DB.
- `Updates.EnableDatabases = 15` (las 4) y `Updates.AutoSetup = 1` → aplica base + updates al arrancar.
- `PacketLogFile = "CypherCore.pkt"` → **déjalo activo para depurar** (§6).
**BNetServer.conf**:
- `LoginDatabaseInfo` (auth), `BattlenetPort = 1119`, `LoginREST.Port = 8081`, `LoginREST.ExternalAddress = 127.0.0.1`.
---
## 4. Arranque (orden importa)
1. MySQL arriba.
2. **`BNetServer.exe`** primero (login Battle.net + portal REST).
3. **`WorldServer.exe`** después. Al arrancar: aplica updates SQL, carga DB2/mapas, abre el mundo. Espera a `World initialized` **sin errores** de carga de DB2/mapas.
4. Crea cuenta desde la consola del WorldServer:
```
bnetaccount create EMAIL@x.com PASSWORD
```
---
## 5. Conectar el cliente 12.0.7
El cliente retail NO usa `realmlist` clásico: usa login Battle.net contra el **portal REST** del BNetServer, y **valida el certificado del servidor**. Necesitas:
- Un **launcher/patcher de conexión** (tipo *Arctium WoW Client Launcher*) que apunte el cliente al portal local (`127.0.0.1:8081`) y saltee la validación de certificado.
- Config del portal: normalmente el launcher inyecta el `--portal 127.0.0.1`. Ajusta según el launcher que uses.
- Login con la cuenta creada en §4.
---
## 6. Depuración reactiva (lo importante)
Aquí es donde se validan/arreglan las Fases 3-4. Síntomas → causa:
| Síntoma | Causa probable | Acción |
|---|---|---|
| "Bad version" / no pasa auth | build 68453 no en `build_info`/`build_auth_key` | verifica que mi SQL Fase 1 se aplicó (`SELECT * FROM build_info WHERE build=68453`) |
| Desconecta en pantalla de personajes | opcode/estructura de CharEnum | packet log (§abajo) |
| Desconecta/crash **al entrar al mundo** | desalineación byte de UpdateFields / CreateObject header / EntityFragment | packet log + comparar contra TC |
| Log: `No defined handler for opcode X` | opcode nuevo 12.0.7 sin handler (feature no portada) | normal; no crashea. Solo importa si es del camino crítico |
| Log worldserver: errores al cargar `*.db2` | struct DB2 desalineada o datos de otra versión | revisar esa struct vs TC / re-extraer |
| Error en SELECT de hotfix (columna no existe) | esquema de tabla hotfix sin la columna nueva 12.0.7 | ajustar esquema world/hotfixes o poblar hotfix data 12.0.7 |
**Packet logging (clave para byte-mismatches):**
1. Con `PacketLogFile` activo, se genera `CypherCore.pkt`.
2. Ábrelo con **WowPacketParser** (de TrinityCore) apuntando a build 68453.
3. Busca el último opcode antes de la desconexión y compara la estructura enviada vs lo que el cliente espera.
---
## 7. Cómo reportar para que yo depure
Cuando falle, pásame:
- El **error exacto** del log de `WorldServer`/`BNetServer`.
- Si desconecta al entrar: el **último opcode** enviado/recibido (del log o del `.pkt`).
- Si es carga de DB2: el nombre del `.db2` y el error.
Con eso ataco el mismatch concreto (struct, opcode o header) contra la referencia de TrinityCore.
---
## Estado del port (referencia)
- ✅ Fase 1 build gate 68453 · Fase 2 opcodes · Fase 3 DB2+hotfix · Fase 4 UpdateFields
- ✅ Fixes críticos: cabecera CreateObject (+3 bits), enum `EntityFragment` renumerado a 12.0.7
- ✅ B-A0 fundación + B1 MeshObject (scaffold)
- ⏳ Features Midnight (Housing/Neighborhood/Initiative): solo wire-format; sin gameplay (ni TC lo tiene)
- **Compila: `dotnet build CypherCore.sln -c Release` → 0 errores**