# 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**