- Updated database schema to set stackable items as non-stackable. - Implemented migration script to convert existing stackable items to instances with durability. - Fixed combat logic to ensure players lose if no weapon is equipped. - Added admin commands for inventory debugging and resetting. - Enhanced item display to show durability instead of quantity. - Conducted thorough testing and validation of changes.
5.1 KiB
🔧 Guía de Corrección de Bugs de Durabilidad y Combate
Fecha: 2025-10-09
Problemas Resueltos:
- Items degradándose por cantidad (x16→x15) en lugar de durabilidad
- Combate ganado sin arma equipada
✅ Cambios Implementados
1. Migración de Base de Datos
- ✅ 10 items actualizados a
stackable: false(herramientas/armas/armaduras/capas) - ✅ Script de migración ejecutado:
scripts/migrateStackableToInstanced.ts - ✅ Schema sincronizado con
prisma db push
2. Corrección de Lógica de Combate
Archivo: src/game/minigames/service.ts (línea 470)
Cambio:
// ANTES (ambiguo):
if (!eff.damage || eff.damage <= 0) {
// DESPUÉS (explícito):
const hasWeapon = eff.damage > 0;
if (!hasWeapon) {
Ahora el jugador pierde automáticamente si no tiene arma equipada al enfrentar mobs.
3. Nuevos Comandos de Admin
!debug-inv [@user]
Muestra información detallada del inventario para diagnóstico:
- Stackable status de cada item
- Quantity vs Instances
- Durabilidad de cada instancia
- Equipo actual
!reset-inventory [@user]
Migra inventarios corruptos de stackable a non-stackable con durabilidad correcta.
🚀 Pasos Para Probar
1. Reiniciar el Bot
# Detener bot actual (Ctrl+C o kill process)
npm run dev
2. Verificar Inventario Actual
En Discord, ejecuta:
a!debug-inv
Salida esperada (items correctos):
**Pico Básico** (`tool.pickaxe.basic`)
• Stackable: false
• Quantity: 16
• Instances: 16
└ [0] dur: 100
└ [1] dur: 95
└ [2] dur: 100
...
Salida problemática (items corruptos):
**Pico Básico** (`tool.pickaxe.basic`)
• Stackable: false
• Quantity: 16
• Instances: 0
⚠️ CORRUPTO: Non-stackable con qty>1 sin instances
3. Si Aparece Inventario Corrupto
Ejecuta el comando de migración manual:
a!reset-inventory @TuUsuario
Este comando:
- Convierte
quantityastate.instances[] - Inicializa durabilidad máxima en cada instancia
- Actualiza items en DB a
stackable: false
4. Probar Combate Sin Arma (Debe Perder)
a!desequipar weapon
a!minar
Resultado esperado:
❌ Combate (🪦 Derrota)
• Mobs: 1 | Derrotados: 0/1
• Daño hecho: 0 | Daño recibido: 0
• HP: 50 → 25 (regenerado al 50%)
• Penalización: -X monedas, FATIGUE aplicada
5. Probar Combate Con Arma (Debe Ganar)
a!equipar weapon weapon.sword.iron
a!minar
Resultado esperado:
✅ Combate (🏆 Victoria)
• Mobs: 1 | Derrotados: 1/1
• Daño hecho: 15-20 | Daño recibido: 5-10
• HP: 50 → 40
6. Probar Degradación de Durabilidad
Ejecuta a!minar varias veces y verifica con a!inventario o a!debug-inv:
Progresión esperada:
Ejecución 1: Pico (95/100) - Espada (149/150)
Ejecución 2: Pico (90/100) - Espada (148/150)
Ejecución 3: Pico (85/100) - Espada (148/150) [espada no usada si no hay mobs]
🐛 Diagnóstico de Problemas
Problema: "Sigue mostrando (x16) en lugar de durabilidad"
Causa Posible: El comando a!minar muestra cantidad de instancias, no durabilidad individual.
Verificación:
// En src/commands/messages/game/mina.ts
// Buscar la línea que formatea el tool display
formatToolLabel(tool, { /* ... */ })
Solución: Modificar formato para mostrar durabilidad de la instancia usada:
// ANTES:
`${toolName} (x${instances.length})`
// DESPUÉS:
`${toolName} (${usedInstance.durability}/${maxDurability}) [x${instances.length}]`
Problema: "Item se rompe al primer uso"
Causa: durabilityPerUse > maxDurability o durabilidad no inicializada.
Verificación:
a!debug-inv
Busca:
• Breakable: enabled=true, max=100
└ [0] dur: N/A <-- ❌ PROBLEMA
Solución:
a!reset-inventory @Usuario
📝 Archivos Modificados
src/game/minigames/service.ts # Línea 470: Fix combate sin arma
src/commands/messages/admin/
├── resetInventory.ts # Comando migración manual
└── debugInv.ts # Comando debug inventario
scripts/
├── migrateStackableToInstanced.ts # Script migración automática
└── debugInventory.ts # Script CLI debug
prisma/migrations/
└── fix_stackable_items.sql # Migración SQL (solo referencia)
README/
├── AUDITORIA_ECOSISTEMA_GAME.md # Auditoría completa
└── FIX_DURABILIDAD_STACKABLE.md # Este documento
🎯 Checklist Final
- Bot reiniciado con nuevos comandos cargados
a!debug-invejecutado y verificado- Inventario corrupto migrado con
a!reset-inventory(si aplica) - Combate sin arma testado (debe perder)
- Combate con arma testado (debe ganar)
- Durabilidad degrada progresivamente (100→95→90)
- Mensaje muestra durabilidad correctamente en lugar de cantidad
Si persisten problemas después de seguir esta guía:
- Ejecuta
a!debug-invy comparte la salida - Verifica logs del bot durante
a!minar - Revisa que
formatToolLabelen_helpers.tsmuestre durabilidad correctamente