f58dbf7756
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>
115 lines
5.9 KiB
Markdown
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**
|