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.
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.
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 tiendaMuShop_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:
- Decodifica
MuShop.bmdusando el editor BMD de tu build. - Agrega una nueva fila para el item: define los campos
Index,Name,CategoryIDeIconPath. - Vuelve a codificar y distribuye el archivo actualizado a los jugadores a través de tu patcher.
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:
- Inicia sesión con una cuenta de prueba que tenga un saldo de WCoin conocido.
- Abre la Cash Shop con la tecla de acceso rápido designada (por defecto:
Pen la mayoría de los builds). - Verifica que las categorías aparezcan en el orden correcto y que todas las categorías habilitadas sean visibles.
- Intenta una compra de un item de bajo costo. Confirma que el saldo de WCoin disminuye exactamente en el precio indicado.
- Verifica que el item llegó al inventario con el nivel, habilidad y opciones correctas.
- 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.
- Revisa la tabla de log (
MuShop_BuyListo 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
IsVisibley actualizandoSortOrderen lugar de eliminar e insertar filas nuevamente. Esto preserva la integridad del historial de compras. - Archiva las promociones antiguas estableciendo
IsVisible = 0en 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_ItemInfoque 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.