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>
5.9 KiB
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:
- DB2/DBC + mapas (
mapextractor) → generadbc/ymaps/. - VMaps (
vmap4extractorluegovmap4assembler) → generavmaps/. - MMaps (
mmaps_generator) → generammaps/. (Lento; puedes lanzarlo por mapa.)
Copia las carpetas resultantes (dbc, maps, vmaps, mmaps) al DataDir del WorldServer (por defecto Build/Release/AnyCPU/Data/).
⚠️ Los
.db2extraí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.
- Crea las 4 vacías en MySQL:
CREATE DATABASE auth; CREATE DATABASE characters; CREATE DATABASE world; CREATE DATABASE hotfixes; - auth + characters: se auto-aplican desde
sql/base/al arrancar (ver §3,Updates.AutoSetup=1). - 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. - Mi SQL de Fase 1 (
sql/updates/auth/master/2026_07_12_00_auth.sql) lo aplica el updater solo — mete build 68453 enbuild_info/build_auth_keyy ponerealmlist.gamebuild=68453. - 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) yUpdates.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)
- MySQL arriba.
BNetServer.exeprimero (login Battle.net + portal REST).WorldServer.exedespués. Al arrancar: aplica updates SQL, carga DB2/mapas, abre el mundo. Espera aWorld initializedsin errores de carga de DB2/mapas.- 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):
- Con
PacketLogFileactivo, se generaCypherCore.pkt. - Ábrelo con WowPacketParser (de TrinityCore) apuntando a build 68453.
- 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
.db2y 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
EntityFragmentrenumerado 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