Base de Datos

Base de Datos

Firelands usa MySQL 8.0 / MariaDB con tres bases de datos lógicas. Los adaptadores en src/infrastructure/persistence/ implementan los ports de repositorio como clases MySql*.

Bases de Datos

Base de DatosPropósito
firelands_authCuentas (SRP-6a), lista de reinos, sesiones, migraciones
firelands_charactersPersonajes, hechizos, cooldowns, correo, tickets GM
firelands_worldDatos estáticos: spawns, gossip, misiones, playercreateinfo

Desarrollo Local

docker-compose up -d db
  • Imagen: mysql:8.0
  • Puerto: 3306
  • Root: root/root
  • Usuario: firelands/firelands
  • El esquema bundled se carga desde sql/bundled/ al crear el contenedor

Archivos SQL

sql/
├── init/           # Esquema base (auth_schema, characters_schema, world_schema)
├── migrations/     # Cambios incrementales (prefijos numerados, ~26 archivos)
└── bundled/        # Esquema fusionado para Docker e instalaciones nuevas

Esquema Bundled

  • firelands_auth.sql
  • firelands_characters.sql
  • firelands_world.sql
  • zz_seed_schema_migrations.sql — siembra el seguimiento de migraciones en Docker

Fusionar Migraciones

python3 tools/merge_migrations.py
# or
cmake --build build --target merge-migrations

Migraciones en Tiempo de Ejecución

DatabaseMigrator se ejecuta al arrancar auth y world en este orden:

  1. sql/bundled/*.sql (omite archivos con prefijo zz_*.sql en aplicación normal)
  2. sql/init/*.sql
  3. sql/migrations/*.sql (orden lexicográfico)

Los archivos aplicados se registran en firelands_auth.schema_migrations. Cada sentencia se divide y ejecuta de forma segura.

Base Auth (firelands_auth)

TablaPropósito
accountCuentas — salt/verifier SRP (nunca se guarda la contraseña), nivel de acceso, bloqueo
realmlistNombre, dirección, puerto, icono, población del reino
account_sessionClaves de sesión activas
account_dataDatos UI del cliente en caché (macros, keybinds)
schema_migrationsSeguimiento de migraciones aplicadas

La autenticación usa SRP-6a vía SRPService + MySqlAccountRepository. Los comandos .account de consola modifican esta BD.

Base Characters (firelands_characters)

TablaPropósito
charactersFila principal: posición, dinero, nivel, apariencia, stats
character_spellHechizos extra (p. ej. .learn)
character_spell_cooldownCooldowns de hechizo y categoría persistidos
gm_ticketTickets de ayuda y respuestas GM
mail / mail_itemsCorreo en juego

Base World (firelands_world)

TablaPropósito
playercreateinfoPosición inicial por raza/clase
playercreateinfo_spell / playercreateinfo_skillHechizos y skills iniciales (máscaras + filtro por nivel). Ver Player Create Info.
creature_templatePlantillas NPC (gossip_menu_id, stats, flags)
creatureFilas de spawn de criaturas
gossip_menu, gossip_menu_option, …Menús gossip
npc_textTexto de diálogo
quest_template, creature_queststarterLíneas de misiones (máscaras clase/raza)
phase_areaÁrea → IDs de fase del jugador
phase_x_phase_groupPhaseGroup → fases miembro
conditions (tipo 26)Puertas misión/aura para phase_area

Las tablas de misiones en characters alimentan las condiciones de fase. Ver Sistema de Fases.

Datos world regenerables con scripts de importación:

python3 tools/sql/import_ref_playercreateinfo.py   # → migraciones 42/43
python3 tools/sql/generate_playercreateinfo_dbc_spells.py # → migración 62
python3 tools/sql/import_ref_gossip.py      # → migración 35
python3 tools/sql/import_ref_npc_text.py    # → migración 34
python3 tools/sql/import_ref_quest_gossip.py # → migración 38
python3 tools/sql/import_ref_phase_data.py       # → migración 55
python3 tools/sql/import_ref_phase_conditions.py # → migración 57

Mapeo de Repositorios

Port de DominioAdaptador InfrastructureBase de datos
IAccountRepositoryMySqlAccountRepositoryauth
IRealmRepositoryMySqlRealmRepositoryauth
ICharacterRepositoryMySqlCharacterRepositorycharacters
IGmTicketRepositoryMySqlGmTicketRepositorycharacters
IPlayerCreateInfoRepositoryMySqlPlayerCreateInfoRepositoryworld
IGossipRepositoryMySqlGossipRepositoryworld
INpcTextRepositoryMySqlNpcTextRepositoryworld
IQuestGossipRepositoryMySqlQuestGossipRepositoryworld
ICreatureSpawnRepositoryMySqlCreatureSpawnRepositoryworld
IPhaseAreaCatalogRepositoryMySqlPhaseAreaCatalogRepositoryworld
IPhaseConditionRepositoryMySqlPhaseConditionRepositoryworld
IPhaseGroupCatalogRepositoryMySqlPhaseGroupCatalogRepositoryworld
IPlayerQuestProgressRepositoryMySqlPlayerQuestProgressRepositorycharacters

Buenas prácticas de migraciones

  • Usar IF NOT EXISTS, ADD COLUMN IF NOT EXISTS
  • Nunca DROP TABLE en migraciones
  • Prefijos numéricos: 001_, 002_, …
  • Tras cambios: cmake --build build --target merge-migrations

Consultas locales

mysql -u firelands -p firelands_auth
docker exec -it firelands-db-1 mysql -u firelands -p

Relacionado