Brazil's biggest MU Online portal — since 2003
Tutorial Intermediate Servidor

How to Configure the Cash Shop on Your MU Online Server

Learn how to set up and fine-tune the Cash Shop on your MU Online private server, from database tables to in-game WCoin item listings.

VI ViciadosMU Team · Updated on 4 jul 2026 · ⏱ 18 min read

Understanding the Cash Shop Architecture

The Cash Shop (also called the WCoin Shop or MuShop) is one of the most visible player-facing systems on a private MU Online server. Before touching any configuration file, you need to understand how its three layers fit together.

Layer 1 — Database stores every item listing, price, category, and purchase record. This is the source of truth the server reads from.

Layer 2 — GameServer loads shop data at startup, validates purchases against the WCoin balance tables, and writes transaction logs.

Layer 3 — Client reads a local MuShop.bmd file that maps item graphics and category labels to the IDs sent by the server. Client and server item IDs must match or items appear blank or with wrong icons.

Nota: Season 6 and later seasons store shop configuration entirely in the database. Earlier seasons (Season 2–4) may still rely on a mix of MuShop.ini text files and a partial database table. Confirm which approach your server build uses before making changes.

Step 1 — Setting Up the Database Tables

Connect to your MuOnline database with any SQL client. The two core tables are:

  • MuShop_List — defines categories shown in the shop interface
  • MuShop_ItemInfo — defines each purchasable item

Creating a Category in MuShop_List

-- MuShop_List structure overview
-- Column          → Purpose
-- ShopCode        → Unique category ID (integer)
-- ShopName        → Category label shown in client
-- ShopType        → 0 = WCoin, 1 = KKoin, 2 = Goblin Points
-- SortOrder       → Display position (lower = higher in list)
-- IsVisible       → 1 = visible, 0 = hidden

INSERT INTO MuShop_List (ShopCode, ShopName, ShopType, SortOrder, IsVisible)
VALUES
  (1, 'Weapons',        0, 10, 1),
  (2, 'Armors',         0, 20, 1),
  (3, 'Potions',        0, 30, 1),
  (4, 'Wings',          0, 40, 1),
  (5, 'Event Items',    0, 50, 1),
  (99, 'Hidden Deals',  0, 99, 0);  -- → hidden category example

Adding Items in MuShop_ItemInfo

-- MuShop_ItemInfo structure overview
-- Column           → Purpose
-- ItemCode         → Unique item entry ID
-- ShopCode         → Foreign key → MuShop_List.ShopCode
-- ItemIndex        → In-game item ID (matches MuShop.bmd)
-- ItemSubIndex     → Item sub-type (0 for most items)
-- ItemLevel        → Level the item is sold at
-- ItemSkill        → 1 = skill option on item, 0 = none
-- ItemLuck         → 1 = luck option, 0 = none
-- ItemOpt          → Additional option value
-- Price            → Cost in WCoin (0 = free)
-- WCoinType        → 0 = WCoin C, 1 = WCoin P, 2 = Goblin Points
-- LimitBuyCount    → Max purchases allowed (0 = unlimited)
-- LimitBuyCountType→ 0 = total, 1 = daily, 2 = weekly
-- IsVisible        → 1 = show, 0 = hide

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),  -- → Wing of Elf   500 WCoin
  (1002, 4, 36, 0, 0, 0, 0, 0, 800,  0, 0, 0, 1),  -- → Wing of Devil 800 WCoin
  (1003, 3, 14, 0, 0, 0, 0, 0, 30,   0, 5, 1, 1),  -- → Large HP Pot  30 WCoin, max 5/day
  (1004, 3,  0, 0, 0, 0, 0, 0, 0,    0, 1, 0, 1);  -- → Free item,    claim once total

> [!WARNING] > Never duplicate an ItemCode value in MuShop_ItemInfo. Duplicate primary keys cause the GameServer to silently skip the conflicting row, leaving items invisible in-game with no error in the logs.


Step 2 — Configuring the GameServer Shop Settings

Open your GameServer configuration directory. The relevant files are typically:

GameServer/
  Config/
    MuShop.ini         → (older builds) item list override
    GameServerInfo.ini → main server settings

In GameServerInfo.ini, locate the [ShopSystem] section and adjust these keys:

[ShopSystem]
; Enable or disable the Cash Shop entirely
EnableMuShop          = 1          ; → 1 = enabled, 0 = disabled

; Currency type accepted by default (matches WCoinType in DB)
DefaultWCoinType      = 0          ; → 0 = WCoin C

; Reload shop data without server restart (1 = allow GM command)
AllowShopHotReload    = 1

; Log every purchase to the transaction log table
EnablePurchaseLog     = 1

; Maximum WCoin a player can spend in a single session (0 = no cap)
SessionSpendCap       = 0

; Minimum character level to use the Cash Shop
MinLevelForShop       = 10         ; → prevents fresh characters from buying

> [!TIP] > Set AllowShopHotReload = 1 during the initial configuration phase. This lets you issue /reloadshop in the server console and test new item additions instantly without a full server restart that disconnects all players.


Step 3 — Syncing the Client BMD File

Players must have a matching MuShop.bmd (or MuShop.bmd.enc if encrypted) inside their client's Data/ folder. This file tells the client which icon and name to display for each ItemIndex.

If you add a new ItemIndex to the database that does not exist in MuShop.bmd, players see either a blank slot or a generic icon. The process to update it depends on your toolchain:

  1. Decode MuShop.bmd using your build's BMD editor.
  2. Add a new row for the item: set the Index, Name, CategoryID, and IconPath fields.
  3. Re-encode and distribute the updated file to players via your patcher.
Nota: The IconPath field points to a texture file inside Data/Interface/GFx/Shop/. If you reference a texture that does not exist in the client package, the slot shows correctly in structure but renders with a missing-image placeholder. Always package the icon texture alongside any BMD update.

Step 4 — WCoin Balance Integration

The Cash Shop deducts WCoin from a balance table in the database. The typical structure is:

-- WCoin balance table (name varies by build: WCoin, T_WCoin, AccountWCoin)
-- AccountID  → linked to account login
-- WCoinC     → WCoin C balance (WCoinType = 0)
-- WCoinP     → WCoin P balance (WCoinType = 1)
-- GPoints    → Goblin Points   (WCoinType = 2)

-- Check a player's current balance
SELECT AccountID, WCoinC, WCoinP, GPoints
FROM   WCoin
WHERE  AccountID = 'player_account';

-- Manually grant WCoin for testing purposes
UPDATE WCoin
SET    WCoinC = WCoinC + 1000
WHERE  AccountID = 'test_account';

> [!WARNING] > Never modify player balances directly in production unless you are correcting a verified error and have a backup. Always record manual adjustments in a separate admin log table so you can audit changes. Unexplained balance increases are a common source of player disputes.


Step 5 — Testing and Verifying the Configuration

After all database rows are inserted and the GameServer is reloaded or restarted, follow this checklist:

  1. Log in with a test account that has a known WCoin balance.
  2. Open the Cash Shop with the designated hotkey (default: P on most builds).
  3. Verify categories appear in the correct order and all enabled categories are visible.
  4. Attempt a purchase of a low-cost item. Confirm the WCoin balance decreases by the exact price.
  5. Check the item landed in inventory with the correct level, skill, and option settings.
  6. Verify purchase limits by buying a limited item the maximum allowed times, then confirming the shop greys it out or blocks further purchases.
  7. Check the log table (MuShop_BuyList or equivalent) to confirm the transaction was recorded with the correct timestamp, account ID, and item details.

If a purchase succeeds in-game but the item does not appear in inventory, check the GameServer error log for a [ShopError] tag — this usually indicates an ItemIndex mismatch between the database row and the BMD file.


Maintenance and Ongoing Management

Once the shop is live, treat it like any other service that needs regular audits:

  • Rotate featured items by toggling IsVisible and updating SortOrder rather than deleting and re-inserting rows. This preserves purchase history integrity.
  • Archive old promotions by setting IsVisible = 0 on expired event items. Delete only after confirming no refund requests are pending.
  • Back up the shop tables before every season update. Season migrations often include schema changes to MuShop_ItemInfo that can silently drop custom columns if you apply a migration script without reviewing it first.
  • Monitor the transaction log weekly for anomalous purchase patterns such as one account buying a capped item at a rate that suggests a timing exploit or race condition in the purchase lock.

A well-maintained Cash Shop is transparent to players and easy to audit. Keep your configurations version-controlled — even a simple SQL script committed to a private repository lets you reconstruct the shop state after an accidental table drop.

Perguntas frequentes

What database tables control the Cash Shop inventory?

The main tables are MuShop_List and MuShop_ItemInfo (names may vary by season). MuShop_List holds category groupings and display order, while MuShop_ItemInfo stores each item's ItemSerial, Price, WCoinType, and stock settings.

How do I set a WCoin purchase limit per account per day?

In the MuShop_ItemInfo table, set the LimitBuyCount column to the maximum allowed purchases and LimitBuyCountType to 1 (daily) or 2 (total). A value of 0 means unlimited purchases.

Why are items not showing in the Cash Shop in-game after I add them to the database?

The GameServer caches shop data on startup. You must reload the shop data via the server console command /reloadshop or restart the GameServer process for changes to appear.

Can I offer free items through the Cash Shop?

Yes. Set the Price column to 0 and the WCoinType to 0 in MuShop_ItemInfo. You can then use LimitBuyCount to cap how many times a player can claim the free item.

VI

ViciadosMU Team

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

Keep reading

Related articles