Skip to content

Configuration

Each shop is defined as a JSON file in the shops/ folder inside your KyuubiSoft Core data directory. The server extracts default shops on first startup, and you can freely edit them afterward — your changes are preserved across updates.

kyuubisoft_core/
shops/
example_shop.json
general_store.json
blacksmith.json
alchemist.json
daily_deals.json
rare_collector.json
custom/
custom_example_shop.json <-- your overrides (never overwritten)
custom_example_shop.json.example <-- auto-generated template
{
"id": "example_shop",
"title": "shop.example.title",
"currencyId": "item:Ingredient_Bar_Gold",
"settings": {
"itemsPerPage": 9,
"dailyShopSize": 0,
"showSoldOut": true,
"allowBuyMultiple": false
},
"items": [
{
"itemId": "Food_Bread",
"name": "Bread",
"quantity": 5,
"cost": 2,
"description": "5x Bread",
"weight": 100,
"category": "food",
"maxPurchases": 0
}
]
}
FieldTypeDescription
idstringUnique shop identifier (matches the filename without .json).
titlestringDisplay title. Can be a localization key or plain text.
currencyIdstringCurrency used for purchases. See Currencies.
settingsobjectShop behavior settings (see below).
itemsarrayList of items available in this shop.
FieldDefaultDescription
itemsPerPage9Items displayed per page (3x3 grid).
dailyShopSize0Set to 0 for a fixed catalog. Any value above zero enables daily rotation with that many items.
showSoldOuttrueWhether to show items that have reached their purchase limit.
allowBuyMultiplefalseWhether players can buy more than one of an item in a single transaction.

Shops can support both buying and selling. The following top-level fields control sell behavior:

FieldDefaultDescription
buyEnabledtrueWhether buying is enabled. Set to false for sell-only shops.
sellEnabledfalseWhether players can sell items at this shop.
sellCurrencyIdnullCurrency for sell payouts. null = same as the shop’s currencyId.
sellPricePercent50Default sell price as a percentage of the buy cost.
sellWhitelistnullIf set, only these item IDs can be sold. null = all items.
sellBlacklistnullThese item IDs can never be sold.
sellItemsnullExplicit sell prices per item (see below).

When a player sells an item, the sell price is determined by:

  1. Per-item sellPrice on a catalog item (if > 0).
  2. Explicit sellItems list entry for the item.
  3. Percentage fallbacksellPricePercent of the item’s buy cost.

Items not in the catalog and not in sellItems cannot be sold.

Use sellItems to define sell prices for items that are not in the shop catalog, or to override the percentage calculation:

{
"sellItems": [
{ "itemId": "Ore_Gold", "sellPrice": 3, "maxSellsPerDay": 50 },
{ "itemId": "Ore_Iron", "sellPrice": 1, "maxSellsPerDay": 100 }
]
}
FieldDescription
itemIdThe Hytale item ID.
sellPriceFixed sell price for this item.
maxSellsPerDayMaximum sells per player per day. 0 = unlimited.

Command items (items with a command field) are never sellable, regardless of whitelist/blacklist settings.

FieldRequiredDefaultDescription
itemIdyesThe Hytale item ID (e.g. Tool_Pickaxe_Crude). Also used as a unique key for command items.
namenoDisplay name. Can be a localization key or plain text.
quantityno1How many of the item the player receives per purchase.
costyesPrice in the shop’s currency.
sellPriceno0Explicit sell price. 0 = use the sellPricePercent fallback.
descriptionnoShort description shown in the shop UI.
weightno100Selection weight for daily rotation shops. Higher values mean the item appears more often.
categorynoOptional category string used for filtering (e.g. food, tools, armor).
maxPurchasesno0Maximum purchases per player per day. 0 means unlimited.
maxSellsno0Maximum sells per player per day. 0 means unlimited.
permissionnoOptional permission node required to see and buy this item.
commandnoCommand to execute instead of granting an item. Supports {player}, {PlayerName}, {uuid} placeholders.
commandRunAsServernotruetrue = execute command as console, false = execute as the player.

Instead of granting a physical item, a shop entry can execute a command:

{
"itemId": "xp_boost",
"name": "100 XP Boost",
"cost": 10,
"command": "/ksadmin addxp {player} 100",
"commandRunAsServer": true
}

When command is set, the shop executes the command instead of adding items to the player’s inventory. The itemId is used as a unique identifier for the entry (it does not need to be a real Hytale item ID for command purchases).

If the command fails, the currency is refunded to the player automatically.

When dailyShopSize is greater than zero, the shop selects a random subset of items each day using weighted random selection. The rotation is deterministic per player — the same player sees the same daily shop on the same day. Purchase counts and rotation state reset daily.

You can override or extend any shop without modifying the default files. Place a file named custom_<shopId>.json inside the custom/ folder.

custom/custom_example_shop.json
{
"items": [
{
"itemId": "Food_Bread",
"quantity": 10,
"cost": 3,
"category": "food",
"maxPurchases": 5
},
{
"itemId": "Potion_Health_Greater",
"name": "Greater Health Potion",
"quantity": 1,
"cost": 20,
"description": "Full heal",
"category": "potions",
"maxPurchases": 1
}
]
}

The merge logic works as follows:

  • Items with the same itemId as a base item replace that base item entirely.
  • Items with a new itemId are appended to the shop.