Add 12.0.7 port handoff doc for cross-machine continuation

Self-contained continuation context: goal, methodology, per-phase status,
critical protocol fixes, pending work (Fase 5 + B2/B3/B4), and how to resume
on another machine (clone repo + TrinityCore reference, build, read the docs).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
adevopg
2026-07-12 19:49:31 +02:00
parent f58dbf7756
commit a63dd14564
+112
View File
@@ -0,0 +1,112 @@
# CypherCore → WoW 12.0.7 (build 68453) — Handoff / Continuation
Documento para retomar el port desde otra máquina/sesión sin perder contexto.
Última actualización: 2026-07-12.
---
## Objetivo
Adaptar **CypherCore** (emulador C# de WoW) de cliente **11.2.5.63796** a **12.0.7.68453**,
porque 11.x ya no conecta con el cliente 12.x. Se usa **TrinityCore** (que ya soporta 12.0.7)
como **referencia byte-exacta** para opcodes, estructuras DB2, UpdateFields, auth keys y fragments.
## Entorno / repos
- **CypherCore** (este repo). Base de partida: 11.2.5.63796 (commit `c968aa3c3`).
- **TrinityCore master** = referencia 12.0.7. **Hay que clonarlo aparte** en la nueva máquina:
`git clone --depth 1 https://github.com/TrinityCore/TrinityCore.git`
(contiene los datos de build 68453: opcodes, DB2Structure.h/DB2LoadInfo.h, UpdateFields.h/.cpp,
auth keys en sql/base/auth_database.sql, BaseEntity.h/.cpp, WowCSEntityDefinitions.h).
- .NET 10 SDK (target net9.0). Build: `dotnet build CypherCore.sln -c Release`.
- Git remote de trabajo: `nightspire` → https://git.nightspire.gg/Inna/CypherCore.git
## Estado: COMPILA 0 ERRORES. Fases 1-4 + fundación de features hechas.
---
## Metodología clave (para continuar el estilo)
1. **TC es la referencia byte-exacta.** Todo cambio de wire-format se copia campo a campo de TC.
2. **Compilar tras cada cambio** (`dotnet build ... -c Release`). Nunca dejar el build roto.
3. **Lector DB2 (WDC5) de Cypher**: lee el ancho de bits del *archivo*, no del tipo C#. Y
`1 campo de struct = 1 fieldIndex = 1 columna`. Por eso, en DB2, solo el **nº de campos
agrupados** causa corrupción en cascada; ancho de tipo/longitud de array son solo
corrección de valor. (Ver `Source/Game/DataStorage/ClientReader/DBReader.cs`.)
4. **UpdateFields**: serialización manual con `new(block, bit)`; añadir un campo obliga a
renumerar bits y actualizar `WriteCreate`/`WriteUpdate`/`ClearChangesMask` + el contador
`HasChangesMask(N)` + (multi-bloque) `GetBlocksMask(0), NUMBLOCKS` y el loop. Ver
`GameObjectFieldData` en `UpdateFields.cs` como ejemplo trabajado.
5. **Verificación real solo con cliente** (Fase 5) — los byte-mismatches no se ven al compilar.
---
## Lo hecho (por fase) — todo commiteado en `f58dbf775`
### Fase 1 — Gate de build ✅
- `sql/updates/auth/master/2026_07_12_00_auth.sql`: build 68453 en `build_info` (12,0,7) +
`build_auth_key` (7 keys copiadas de TC) + `realmlist.gamebuild=68453`. El gate es data-driven
(no hay constante de build en código). Ver `Source/Framework/Realm/ClientBuildInfo.cs`.
### Fase 2 — Opcodes ✅
- `Source/Framework/Constants/Network/Opcodes.cs` remapeado **por nombre** a valores 12.0.7 de TC
(885 client + 1233 server, 0 duplicados). OJO: solo se remapearon los opcodes que Cypher YA
tenía; los ~287 opcodes nuevos de 12.0.7 (housing, etc.) NO se añadieron.
- `CompressedPacket`/`MultiplePackets` fijados a 0x49000e/0x49000d (estaban atados a AuthChallenge+offset).
### Fase 3 — DB2 + hotfix ✅
- 32 structs DB2 alineadas a 12.0.7 (`Source/Game/DataStorage/Structs/*_Records.cs`).
- `HotfixDatabase.cs`: ~29 SELECT re-alineados al orden de campos del struct (script determinista,
no copia de TC porque TC parte racemasks en columnas y Cypher usa 1 long).
- Refs de código arregladas: `ReputationManager.cs` (propiedad `ReputationRaceMask` en FactionRecord),
`SpellInfo.cs` (campo `ScalesFromItemLevel` retirado en 12.0.7).
- PENDIENTE datos: esquemas de las tablas hotfix (world DB) necesitan columnas nuevas 12.0.7.
### Fase 4 — UpdateFields ✅
- Top-level: GameObject(+FlagsB), Conversation(+1), AreaTrigger(+3), Player(+2), Unit(+5, 7→8 bloques),
ActivePlayer(+12: Housing/TransmogOutfits/PVP mods).
- Anidados: VisibleItem(6→11), QuestLog(30→31), BitVectors, CraftingOrderItem(7→12), SkillInfo(256→300).
- ~29 clases de serialización de features Midnight añadidas (INERTES, sin cablear).
### Fixes críticos de protocolo base ✅ (fáciles de olvidar)
- **CreateObject header** (`WorldObject.cs` ~línea 313): 12.0.7 añade 3 bits `Room, Decor, MeshObject`
tras `Conversation`. Afecta a TODO create. Verificado vs TC `BaseEntity.cpp`.
- **`EntityFragment` enum** (`WowCSEntityDefinitions.cs`): valores RENUMERADOS en 12.0.7 (se escriben
en cada paquete). CGObject 0→2, tags al rango 200+ (Tag_Unit 5→204, Tag_Player 6→205), FVendor_C
117→17, FEntityPosition 112→1. Sin esto el cliente NO parsea ningún objeto. Ya a valores 12.0.7.
### Proyecto B — features Midnight desde cero (el usuario lo pidió explícitamente)
Contexto: 12.0.7="Midnight" añadió Housing/Neighborhoods/PlayerInitiative/Mesh. **Ni TC las
implementó como gameplay** — solo wire-format (structs, opcodes, DB2). Gameplay = diseño original
sin referencia ni forma de validar.
- **B-A0 (fundación) ✅**: `TypeId.MeshObject=14` (Max→15), `TypeMask.MeshObject=0x4000`,
`HighGuid` Housing=55/MeshObject=56/Entity=57, tags de fragment (Tag_MeshObject=221, Housing/etc.)
en `ObjectConst.cs` y `WowCSEntityDefinitions.cs`. (Todo mirroring TC.)
- **B1 (MeshObject) ✅**: `Source/Game/Entities/MeshObject.cs` — entidad `: WorldObject` con el patrón
de **fragmento Vendor** (MeshObjectData es fragmento `FMeshObjectData_C`, no data del bloque CGObject).
Wiring en `Map.cs` (GetMeshObject) y `ObjectGuid.cs`. INERTE hasta que Housing la instancie.
Referencia del patrón: `Creature.cs` (vendor, ~líneas 3140-3190, 3815-3845).
---
## PENDIENTE (tareas abiertas)
### Fase 5 — validar con cliente real (SIGUIENTE PASO)
Ver **`PORTING_12.0.7_FASE5.md`** (guía completa): extraer datos 12.0.7 (extractores de TC),
montar 4 DBs (auth/characters auto; world/hotfixes = dump completo de CypherCore),
config, arranque bnet→world, cliente vía launcher tipo Arctium, y **depuración reactiva** por
packet log (`.pkt` + WowPacketParser). Aquí se validan/arreglan Fases 3-4.
### B2/B3/B4 — gameplay de features Midnight (opcional, especulativo)
- B2 Housing: ~111 opcodes (46 CMSG + 65 SMSG), packet structs (TC no las tiene), handlers,
entidades PlayerHouse/Room/Decor (patrón MeshObject), tablas DB. Sin referencia de gameplay.
- B3 Neighborhoods (73 opcodes) + B4 PlayerInitiative (12 opcodes, componente en Player).
- Recomendación: tratarlas como features independientes; NO son port. El servidor NO crashea con
opcodes sin handler (los loguea).
---
## Cómo retomar en otra máquina
1. Clonar este repo (rama `master`) desde nightspire.
2. Clonar TrinityCore master aparte (referencia 12.0.7).
3. `dotnet build CypherCore.sln -c Release` → confirmar 0 errores.
4. Leer este doc + `PORTING_12.0.7_FASE5.md`.
5. Continuar por Fase 5 (validación) o B2+ (features), según prioridad.
6. Al depurar un mismatch: coger el opcode/struct del log, comparar con TC, arreglar, recompilar.