El mayor portal de MU Online de Brasil — desde 2003
Tutorial Intermedio Servidor

Cómo Configurar la Cash Shop en tu Servidor de MU Online

Aprende a configurar y ajustar la Cash Shop en tu servidor privado de MU Online, desde las tablas de base de datos hasta el listado de items con WCoin.

EQ Equipo ViciadosMU · Actualizado el 4 jul 2026 · ⏱ 18 min de lectura

Entendiendo la Arquitectura de la Cash Shop

La Cash Shop (también llamada WCoin Shop o MuShop) es uno de los sistemas más visibles para los jugadores en un servidor privado de MU Online. Antes de modificar cualquier archivo de configuración, es fundamental comprender cómo se articulan sus tres capas.

Capa 1 — Base de datos: almacena cada listado de items, precios, categorías y registros de compra. Es la fuente de verdad que el servidor lee en todo momento.

Capa 2 — GameServer: carga los datos de la tienda al iniciarse, valida las compras contra las tablas de saldo de WCoin y escribe los registros de transacciones.

Capa 3 — Cliente: lee un archivo local MuShop.bmd que vincula los gráficos de items y las etiquetas de categoría con los IDs enviados por el servidor. Los IDs de items entre cliente y servidor deben coincidir, o los items aparecen en blanco o con iconos incorrectos.

Nota: A partir de la Season 6, la configuración de la tienda se almacena completamente en la base de datos. Las seasons anteriores (Season 2 a 4) pueden depender de una combinación de archivos de texto MuShop.ini y tablas de base de datos parciales. Confirma qué enfoque utiliza tu build antes de realizar cambios.

Paso 1 — Configuración de las Tablas de Base de Datos

Conéctate a tu base de datos MuOnline con cualquier cliente SQL. Las dos tablas principales son:

  • MuShop_List — define las categorías que se muestran en la interfaz de la tienda
  • MuShop_ItemInfo — define cada item comprable

Crear una Categoría en MuShop_List

-- Estructura de MuShop_List
-- Columna         → Propósito
-- ShopCode        → ID único de categoría (entero)
-- ShopName        → Etiqueta de categoría mostrada en el cliente
-- ShopType        → 0 = WCoin, 1 = KKoin, 2 = Goblin Points
-- SortOrder       → Posición de visualización (menor = más arriba)
-- IsVisible       → 1 = visible, 0 = oculto

INSERT INTO MuShop_List (ShopCode, ShopName, ShopType, SortOrder, IsVisible)
VALUES
  (1, 'Armas',           0, 10, 1),
  (2, 'Armaduras',       0, 20, 1),
  (3, 'Pociones',        0, 30, 1),
  (4, 'Alas',            0, 40, 1),
  (5, 'Items de Evento', 0, 50, 1),
  (99, 'Ofertas Ocultas',0, 99, 0);  -- → categoría oculta de ejemplo

Agregar Items en MuShop_ItemInfo

-- Estructura de MuShop_ItemInfo
-- Columna            → Propósito
-- ItemCode           → ID único del item en la tienda
-- ShopCode           → Clave foránea → MuShop_List.ShopCode
-- ItemIndex          → ID del item en el juego (coincide con MuShop.bmd)
-- ItemSubIndex       → Sub-tipo del item (0 para la mayoría)
-- ItemLevel          → Nivel con el que se vende el item
-- ItemSkill          → 1 = opción de habilidad, 0 = ninguna
-- ItemLuck           → 1 = opción suerte, 0 = ninguna
-- ItemOpt            → Valor de opción adicional
-- Price              → Costo en WCoin (0 = gratuito)
-- WCoinType          → 0 = WCoin C, 1 = WCoin P, 2 = Goblin Points
-- LimitBuyCount      → Máx. de compras permitidas (0 = ilimitado)
-- LimitBuyCountType  → 0 = total, 1 = diario, 2 = semanal
-- IsVisible          → 1 = mostrar, 0 = ocultar

INSERT INTO MuShop_ItemInfo
  (ItemCode, ShopCode, ItemIndex, ItemSubIndex, ItemLevel,
   ItemSkill, ItemLuck, ItemOpt, Price, WCoinType,
   LimitBuyCount, LimitBuyCountType, IsVisible)
VALUES
  (1001, 4, 12, 0, 0, 0, 0, 0, 500,  0, 0, 0, 1),  -- → Ala de Elfa    500 WCoin
  (1002, 4, 36, 0, 0, 0, 0, 0, 800,  0, 0, 0, 1),  -- → Ala del Diablo 800 WCoin
  (1003, 3, 14, 0, 0, 0, 0, 0, 30,   0, 5, 1, 1),  -- → Poción HP Grande 30 WCoin, máx 5/día
  (1004, 3,  0, 0, 0, 0, 0, 0, 0,    0, 1, 0, 1);  -- → Item gratuito, reclamar una vez total

> [!ATENCION] > Nunca dupliques un valor de ItemCode en MuShop_ItemInfo. Las claves primarias duplicadas hacen que el GameServer omita silenciosamente la fila en conflicto, dejando los items invisibles en el juego sin ningún error en los registros.


Paso 2 — Configuración del GameServer para la Tienda

Abre el directorio de configuración de tu GameServer. Los archivos relevantes generalmente son:

GameServer/
  Config/
    MuShop.ini         → (builds antiguas) lista de items alternativa
    GameServerInfo.ini → configuración principal del servidor

En GameServerInfo.ini, localiza la sección [ShopSystem] y ajusta estas claves:

[ShopSystem]
; Habilitar o deshabilitar la Cash Shop por completo
EnableMuShop          = 1          ; → 1 = habilitado, 0 = deshabilitado

; Tipo de moneda aceptada por defecto (coincide con WCoinType en la BD)
DefaultWCoinType      = 0          ; → 0 = WCoin C

; Recargar datos de la tienda sin reiniciar el servidor
AllowShopHotReload    = 1          ; → 1 = permite comando GM

; Registrar cada compra en la tabla de log de transacciones
EnablePurchaseLog     = 1

; Máximo de WCoin que un jugador puede gastar en una sesión (0 = sin límite)
SessionSpendCap       = 0

; Nivel mínimo de personaje para usar la Cash Shop
MinLevelForShop       = 10         ; → evita que personajes nuevos compren

> [!CONSEJO] > Configura AllowShopHotReload = 1 durante la fase de configuración inicial. Esto te permite ejecutar /reloadshop en la consola del servidor y probar nuevos items al instante sin un reinicio completo que desconecte a todos los jugadores en línea.


Paso 3 — Sincronización del Archivo BMD del Cliente

Los jugadores deben tener un archivo MuShop.bmd coincidente (o MuShop.bmd.enc si está cifrado) dentro de la carpeta Data/ de su cliente. Este archivo le indica al cliente qué icono y nombre mostrar para cada ItemIndex.

Si agregas un nuevo ItemIndex en la base de datos que no existe en MuShop.bmd, los jugadores verán una ranura en blanco o un icono genérico. El proceso para actualizarlo depende de tu conjunto de herramientas:

  1. Decodifica MuShop.bmd usando el editor BMD de tu build.
  2. Agrega una nueva fila para el item: define los campos Index, Name, CategoryID e IconPath.
  3. Vuelve a codificar y distribuye el archivo actualizado a los jugadores a través de tu patcher.
Nota: El campo IconPath apunta a un archivo de textura dentro de Data/Interface/GFx/Shop/. Si referencias una textura que no existe en el paquete del cliente, la ranura se muestra correctamente en estructura pero se renderiza con un marcador de imagen faltante. Siempre empaqueta la textura del icono junto con cualquier actualización del BMD.

Paso 4 — Integración del Saldo de WCoin

La Cash Shop descuenta WCoin de una tabla de saldo en la base de datos. La estructura típica es:

-- Tabla de saldo WCoin (el nombre varía según el build: WCoin, T_WCoin, AccountWCoin)
-- AccountID  → vinculado al login de la cuenta
-- WCoinC     → saldo WCoin C (WCoinType = 0)
-- WCoinP     → saldo WCoin P (WCoinType = 1)
-- GPoints    → Goblin Points  (WCoinType = 2)

-- Consultar el saldo actual de un jugador
SELECT AccountID, WCoinC, WCoinP, GPoints
FROM   WCoin
WHERE  AccountID = 'cuenta_jugador';

-- Otorgar WCoin manualmente para pruebas
UPDATE WCoin
SET    WCoinC = WCoinC + 1000
WHERE  AccountID = 'cuenta_prueba';

> [!ATENCION] > Nunca modifiques saldos de jugadores directamente en producción a menos que estés corrigiendo un error verificado y tengas una copia de seguridad. Registra siempre los ajustes manuales en una tabla de log de administración separada para poder auditar los cambios. Los aumentos de saldo sin explicación son una fuente frecuente de disputas entre jugadores.


Paso 5 — Pruebas y Verificación de la Configuración

Después de insertar todas las filas en la base de datos y recargar o reiniciar el GameServer, sigue esta lista de verificación:

  1. Inicia sesión con una cuenta de prueba que tenga un saldo de WCoin conocido.
  2. Abre la Cash Shop con la tecla de acceso rápido designada (por defecto: P en la mayoría de los builds).
  3. Verifica que las categorías aparezcan en el orden correcto y que todas las categorías habilitadas sean visibles.
  4. Intenta una compra de un item de bajo costo. Confirma que el saldo de WCoin disminuye exactamente en el precio indicado.
  5. Verifica que el item llegó al inventario con el nivel, habilidad y opciones correctas.
  6. Verifica los límites de compra adquiriendo un item limitado el máximo de veces permitido y confirmando que la tienda lo bloquea en intentos posteriores.
  7. Revisa la tabla de log (MuShop_BuyList o equivalente) para confirmar que la transacción fue registrada con el timestamp correcto, el ID de cuenta y los detalles del item.

Si una compra es exitosa en el juego pero el item no aparece en el inventario, revisa el log de errores del GameServer buscando la etiqueta [ShopError]. Esto generalmente indica una discrepancia de ItemIndex entre la fila de la base de datos y el archivo BMD.


Mantenimiento y Gestión Continua

Una vez que la tienda esté activa, trátala como cualquier otro servicio que requiere auditorías regulares:

  • Rota los items destacados cambiando IsVisible y actualizando SortOrder en lugar de eliminar e insertar filas nuevamente. Esto preserva la integridad del historial de compras.
  • Archiva las promociones antiguas estableciendo IsVisible = 0 en los items de eventos vencidos. Elimina solo después de confirmar que no hay solicitudes de reembolso pendientes.
  • Haz copias de seguridad de las tablas de la tienda antes de cada actualización de season. Las migraciones de season frecuentemente incluyen cambios de esquema en MuShop_ItemInfo que pueden eliminar columnas personalizadas silenciosamente si aplicas un script de migración sin revisarlo.
  • Monitorea el log de transacciones semanalmente en busca de patrones de compra anómalos, como una cuenta comprando un item con límite a una velocidad que sugiere un exploit de sincronización o una condición de carrera en el bloqueo de compra.

Una Cash Shop bien mantenida es transparente para los jugadores y fácil de auditar. Mantén tus configuraciones bajo control de versiones. Incluso un simple script SQL confirmado en un repositorio privado te permite reconstruir el estado de la tienda después de una eliminación accidental de tabla.

Perguntas frequentes

¿Qué tablas de base de datos controlan el inventario de la Cash Shop?

Las tablas principales son MuShop_List y MuShop_ItemInfo (los nombres pueden variar según la season). MuShop_List define las categorías y su orden de visualización, mientras que MuShop_ItemInfo almacena el ItemSerial, Price, WCoinType y configuración de stock de cada item.

¿Cómo establezco un límite de compras por cuenta por día?

En la tabla MuShop_ItemInfo, define la columna LimitBuyCount con el máximo de compras permitidas y LimitBuyCountType en 1 (diario) o 2 (total). El valor 0 significa compras ilimitadas.

¿Por qué los items no aparecen en la Cash Shop después de agregarlos a la base de datos?

El GameServer almacena en caché los datos de la tienda al iniciarse. Debes recargar los datos con el comando de consola /reloadshop o reiniciar el proceso GameServer para que los cambios sean visibles.

¿Se pueden ofrecer items gratuitos a través de la Cash Shop?

Sí. Establece la columna Price en 0 y WCoinType en 0 en MuShop_ItemInfo. Luego puedes usar LimitBuyCount para limitar cuántas veces un jugador puede reclamar el item gratuito.

EQ

Equipo ViciadosMU

Equipe editorial do ViciadosMU — portal de MU Online no ar desde 2003.

Sigue leyendo

Artículos relacionados