# MU Nexora — Perfil avanzado + equipamiento V4

## Resultado

Se conserva el perfil existente y se añade una capa independiente de equipamiento público de solo lectura.

### Detectado en el proyecto

- WebEngine/X-Team usa `Character.Inventory` y `Character.DbVersion`.
- Legado y Seasonal contienen la misma familia de estructuras/procedimientos X-Team observada durante la auditoría.
- El template actual ya incluye **5.862 imágenes de items** en `img/item_images/<section>/<index>.*`.
- El template ya incluye portraits de clases en `img/character-avatars/` y fondos de perfiles.
- No se encontró en la web entregada un catálogo textual `ItemList`/`Item.txt` fiable con los nombres exactos de los items.

### Decoder

`NexoraItemDecoder` procesa únicamente el formato que puede reconocer de forma segura.

- `DbVersion = 3`: bloques de 16 bytes.
- Slots equipados leídos: 12.
- El tamaño real de `Inventory` se obtiene en runtime mediante `DATALENGTH`.
- El binario se convierte a hexadecimal en SQL y nunca se envía al navegador.
- Si el formato no es soportado, el perfil normal permanece operativo y solo el panel de equipo muestra una advertencia.

### Slots

0. Arma derecha
1. Arma izquierda / Escudo
2. Casco
3. Armadura
4. Pantalones
5. Guantes
6. Botas
7. Alas
8. Pet
9. Pendant
10. Anillo 1
11. Anillo 2

### Información pública decodificada

Cuando el formato lo permite se muestran: nivel, Skill, Luck, opción adicional en su valor de nivel, durabilidad, cantidad de flags Excellent, detección Ancient, Harmony y estado de sockets.

No se publica el serial del item.

### Nombres exactos

No se inventaron nombres. Si no existe una entrada verificada, la interfaz usa el rol del slot y el código `section:index` junto con la imagen real que ya posee la web.

Para incorporar el catálogo exacto, copiar:

`includes/config/nexora.itemnames.php.example`

a:

`includes/config/nexora.itemnames.php`

y completar pares:

`'section:index' => 'Nombre exacto'`

usando únicamente el ItemList real del servidor.

### Actualización

- Lectura inicial al abrir el perfil.
- Botón `Actualizar equipo` con feedback local.
- Si el personaje está online, polling de 30 segundos solamente mientras la pestaña está visible.
- Si está offline, no se genera polling automático.
- Se usa la etiqueta `Último equipamiento guardado por el servidor` porque el instante de persistencia depende del GameServer.

### Privacidad

El endpoint público no devuelve:

- AccountID
- email
- password
- IP
- raw Inventory
- seriales
- warehouse
- inventario no equipado

### Base de datos

No hay migraciones. No se modifica el esquema ni los datos de MU.
