Files
CypherCore/PORTING_12.0.7_FASE5.md
T
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

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 compiladoBuild/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:
    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