๐Ÿ›’ Premium Plugin

oSHOP GUI Premium

A fully-featured, production-ready Minecraft shop plugin with multi-category GUI, flexible economy support, per-player price modifiers, anti-dupe protection, and hooks for custom item plugins.

๐Ÿ“Œ Paper / Spigot โ˜• Java 17+ ๐Ÿ”Œ Vault / XP ๐Ÿ“ฆ 14 Default Shops

๐Ÿ  What is oSHOP GUI Premium?

A premium Minecraft server shop plugin by OreoStudios โ€” fully paginated, multi-category, with real-time price previews and a lag-resistant transaction engine.

๐Ÿ›’

Multi-Shop System

Unlimited categories with per-page item layouts and full pagination.

๐Ÿ’ฐ

Flexible Economy

Vault, EXP Points, or EXP Levels โ€” switch anytime with a reload.

๐Ÿ“Š

Price Modifiers

3-tier modifier system: global โ†’ shop โ†’ item, stored persistently per player.

๐Ÿ›ก๏ธ

Anti-Dupe

Cooldown locks, rate limiting, inventory verification, concurrency guards.

๐ŸŽจ

Amount Selection

Configurable preset-amount GUI before every buy or sell transaction.

๐Ÿ”Œ

Custom Items

Native hooks for ItemsAdder and Nexo custom item namespaces.

๐Ÿ“ฆ Installation

Get oSHOP GUI Premium running in under five minutes.

Requirements

DependencyVersionRequired
Paper / Spigot1.20+โœ… Required
Java17 or higherโœ… Required
VaultLatestโš ๏ธ For Vault economy
Economy pluginEssentialsX / CMIโ€ฆโš ๏ธ Paired with Vault
LuckPermsAnyโ„น๏ธ Recommended
ItemsAdder / NexoAnyโ„น๏ธ Optional
1

Download the plugin JAR

Grab oSHOPGUI-Premium.jar from the OreoStudios Spigot page or your purchase receipt.

2

Place in /plugins/

Drop the JAR into your server's plugins/ folder alongside Vault and your economy provider.

3

Start the server

The plugin generates plugins/OSHOPGUI/config.yml, messages.yml, and all default shop files in plugins/OSHOPGUI/shops/.

4

Set economy backend

Open config.yml, set economy.backend to VAULT, EXP_POINTS, or EXP_LEVELS, then run /shop reload.

5

Open the shop

Run /shop in-game. Grant oshopgui.shop to players so they can access it.

โšก Quick Start

The fastest path from zero to a working shop.

๐Ÿ’ก

The plugin ships with 14 fully pre-configured categories. Pick an economy backend and reload โ€” you're ready to go.

# Minimum viable config.yml
economy:
  backend: VAULT   # or EXP_POINTS / EXP_LEVELS

main-menu:
  title: "&8ยป &6&lSHOP &8ยซ"
  rows: 4config.yml

After saving, run /shop reload. Players with oshopgui.shop can immediately use /shop.

โš™๏ธ config.yml Reference

Full reference for every key in plugins/OSHOPGUI/config.yml.

Main Menu

KeyTypeDefaultDescription
main-menu.titleString"&8ยป &6&lSHOP &8ยซ"GUI title. Supports color codes.
main-menu.rowsint 1โ€“64Number of inventory rows.
main-menu.fill-emptybooleantrueFill empty slots with decorative glass.
main-menu.fill-materialMaterialGRAY_STAINED_GLASS_PANEMaterial used as the filler.

Economy

KeyTypeDefaultDescription
economy.backendEnumVAULTVAULT, EXP_POINTS, or EXP_LEVELS.

Anti-Dupe

KeyTypeDefaultDescription
anti-dupe.cooldown-mslong300Milliseconds between consecutive transactions.
anti-dupe.max-transactions-per-secondint5Max transactions in any 1-second window.
anti-dupe.verify-inventorybooleantrueVerify player inventory before completing a sale.
anti-dupe.lock-during-transactionbooleantrueLock the player during an active transaction.

Amount Selection GUI

KeyTypeDefaultDescription
amount-selection.enabledbooleantrueShow the amount-selection GUI before transactions.
amount-selection.presetsList<int>[1,16,32,64,128]Quick-pick amounts shown as buttons.

Navigation Slots

navigation:
  back-slot:      45   # Return to main menu
  prev-slot:      48   # Previous page
  next-slot:      50   # Next page
  page-info-slot: 49   # "Page 1/2" indicatorconfig.yml

Transaction Logging

KeyTypeDescription
transaction-log.formatStringLog line format. Placeholders: {player} {action} {item} {amount} {price} {time}
transaction-log.fileStringFilename relative to plugins/OSHOPGUI/. Default: transactions.log

๐Ÿ’ฌ messages.yml Reference

All player-facing text lives in plugins/OSHOPGUI/messages.yml. Every string supports Minecraft color codes and MiniMessage.

Available Placeholders

PlaceholderAvailable inDescription
{item}buy/sell messagesHuman-readable item name
{amount}buy/sell messagesQuantity purchased or sold
{price}buy/sell messagesTotal price with economy symbol
{balance}error messagesPlayer's current balance
{shop}GUI labelsShop category name
{page}navigationCurrent page number
{max-page}navigationTotal page count
{modifier}modifier messagesModifier multiplier, e.g. 1.2
{player}check commandTarget player name

Example Messages

# Transaction feedback
buy-success:      "&aBought &f{amount}x {item} &afor &f{price}"
sell-success:     "&aSold &f{amount}x {item} &afor &f{price}"
not-enough-money: "&cInsufficient funds. Balance: &f{balance}"
item-not-sellable: "&cThis item cannot be sold."

# Navigation
back-button:    "&cยซ Back"
prev-button:    "&eยซ Previous"
next-button:    "&eNext ยป"
page-indicator: "&7Page &f{page}&7/&f{max-page}"

# Anti-dupe
cooldown-active: "&cTransaction cooldown active."
rate-limit-hit:  "&cSlow down! Too many transactions."messages.yml

๐Ÿ“„ Shop Files

Each shop category is a YAML file in plugins/OSHOPGUI/shops/. The plugin auto-loads every .yml in that folder.

File Structure

# plugins/OSHOPGUI/shops/example.yml
shop-name: "My Shop"
shop-id:   "my_shop"
page-size: 45    # items per page (max 45)

items:
  DIAMOND:              # Bukkit Material name
    slot:         0
    buy-price:    150.0
    sell-price:   75.0
    display-name: "&bโœฆ Diamond"
    lore:
      - "&7Buy: &a$150.00"
      - "&7Sell: &c$75.00"
    page:         1
    custom-item:  false
    custom-item-id: ""shops/example.yml

Item Field Reference

FieldTypeRequiredDescription
slotintโœ…Inventory slot (0-indexed). Slots 45โ€“53 are reserved for navigation.
buy-pricedoubleโœ…Purchase price. Set -1 to disable buying.
sell-pricedoubleโœ…Sell price. Set -1 to disable selling.
display-nameStringโŒOverride display name. Supports color codes.
loreListโŒCustom lore lines shown in the GUI.
pageintโŒPage number for this item. Defaults to 1.
custom-itembooleanโŒtrue to use a custom item from ItemsAdder or Nexo.
custom-item-idStringโŒNamespaced ID of the custom item, e.g. ia:ruby.
enchantmentsListโŒEnchantment list for enchanted book items.
โš ๏ธ

Slots 45โ€“53 are reserved for navigation buttons. Do not assign shop items to these slots or they will be overwritten.

๐Ÿ’ฐ Economy System

Three backends available, switched via a single config key โ€” no restart required.

BackendConfig ValueDescription
VaultVAULTAny Vault-compatible economy plugin (EssentialsX, CMI, etc.). Displays currency symbol from Vault API.
EXP PointsEXP_POINTSUses raw experience points. Ideal for vanilla-friendly servers with no Vault dependency.
EXP LevelsEXP_LEVELSUses player experience levels as the currency unit.
๐Ÿ’ก

Switch backends at any time by editing economy.backend and running /shop reload. Player data is not affected.

๐ŸŽจ GUI System

All GUIs are powered by SmartInvs (bundled) for safe, lag-resistant inventory management.

1

Main Menu

Shows all shop category buttons. Empty slots filled with glass pane. Fully configurable layout.

2

Shop GUI

Displays items for the selected category with automatic pagination. Left-click to buy, right-click to sell.

3

Amount Selection

Optional GUI to pick a preset quantity (1, 16, 32, 64, 128โ€ฆ) before confirming. Fully configurable or can be disabled.

4

Transaction

Processor checks balance, applies modifiers, verifies inventory, executes the transfer, logs it, and returns the player to the shop.

Click Behavior

ActionResult
Left Click on itemOpens amount selection for buying
Right Click on itemOpens amount selection for selling
Left Click Back buttonReturns to main menu
Left Click Prev / NextPaginates within the same shop category

๐Ÿ”„ Transaction System

Every buy and sell action goes through TransactionProcessor โ€” balance checks, modifier application, inventory verification, and logging in a single atomic flow.

Buy Flow

Player clicks item โ†’ Amount Selection โ†’ TransactionProcessor
  1. Permission check (oshopgui.shop)
  2. Anti-dupe: cooldown + rate-limit check
  3. Lock player (if lock-during-transaction: true)
  4. Final price = base_price ร— modifier
  5. Check player balance >= final_price
  6. Deduct balance via economy backend
  7. Give items to player inventory
  8. Verify items landed (anti-dupe check)
  9. Log transaction to file
 10. Unlock player + send success message

Sell Flow

Player right-clicks item โ†’ Amount Selection โ†’ TransactionProcessor
  1. Permission check + anti-dupe checks
  2. Verify player has sufficient quantity
  3. Payout = sell_price ร— modifier
  4. Remove items from inventory
  5. Add payout to player balance
  6. Log + send success message

Transaction Log Example

# plugins/OSHOPGUI/transactions.log
[2025-06-12 14:32:07] Steve BOUGHT 64x DIAMOND for $9600.00
[2025-06-12 14:33:15] Alex SOLD 128x WHEAT for $256.00transactions.log

๐Ÿ›ก๏ธ Anti-Dupe Protection

A multi-layer system to prevent exploit-based item generation.

โฑ๏ธ

Cooldown Lock

Configurable cooldown (default 300ms) prevents spam-clicking the shop GUI.

๐Ÿ“Š

Rate Limiting

Max 5 tx/second per player. Exceeding the limit blocks the transaction and warns the player.

๐Ÿ”

Inventory Verify

After giving items, the plugin verifies the inventory state before finalising.

๐Ÿ”’

Transaction Lock

Players are locked from all GUI interactions during an active transaction.

โ›”

Disabling both verify-inventory and lock-during-transaction simultaneously is strongly discouraged on production servers โ€” it removes critical duplication safeguards.

Players with oshopgui.bypass.cooldown skip the cooldown entirely. This node is intended for admin/test use only.

๐Ÿ“Š Price Modifiers

Per-player buy/sell price multipliers with three levels of specificity. Most specific wins.

TierScopePriority
GlobalAll shops, all items for that playerLowest
ShopAll items within a specific shop categoryMedium
ItemOne specific item in one specific shopHighest

Commands

# Set modifiers
/shop modifier set <player> global <multiplier>
/shop modifier set <player> shop <shop-id> <multiplier>
/shop modifier set <player> item <shop-id> <item> <multiplier>

# Check / reset
/shop check <player>
/shop modifier reset <player>
โ„น๏ธ

Modifiers are stored persistently per player in plugins/OSHOPGUI/data/. They survive restarts and reloads.

Example Use Cases

  • VIP 20% discount: /shop modifier set VIPPlayer global 0.8 (buy price ร— 0.8)
  • Donor sell bonus: /shop modifier set DonorPlayer global 1.25 (sell price ร— 1.25)
  • Seasonal event: Shop modifier on farming_nature for a harvest event.
  • Item rarity: 2.0 buy modifier on NETHERITE_INGOT to double its cost.

๐Ÿ”Œ Plugin Hooks

Third-party integrations are detected and initialized automatically at startup.

PluginHook TypeWhat it enables
VaultEconomy APIUse any Vault-compatible economy as the currency backend.
ItemsAdderCustom itemsReference ItemsAdder items using custom-item: true + custom-item-id: ia:namespace:item.
NexoCustom itemsSame custom-item fields โ€” hook auto-detects which plugin is present.
SmartInvsGUI frameworkPowers all chest GUIs. Bundled inside the JAR โ€” no separate install needed.

Custom Item Example

items:
  RUBY:
    slot:          0
    buy-price:     500.0
    sell-price:    250.0
    display-name:  "&c๐Ÿ’Ž Ruby Gem"
    custom-item:   true
    custom-item-id: "ia:gems:ruby"  # ItemsAdder namespaceshops/custom.yml

Hook status is logged at startup: [OSHOPGUI] ItemsAdder hook: โœ” or [OSHOPGUI] Nexo hook: โœ”. If neither is found, custom items fall back to standard Bukkit materials.

๐Ÿ’ป Commands

All commands registered by oSHOP GUI Premium.

CommandAliasesPermissionDescription
/shop/s /storeoshopgui.shopOpens the main shop menu.
/shop reloadโ€”oshopgui.reloadReloads config, messages, and all shop files.
/shop check <player>โ€”oshopgui.checkShows a player's active price modifiers.
/shop <player>โ€”oshopgui.shop.othersOpens the shop for another player.
/shop modifier set โ€ฆโ€”oshopgui.modifier.setSet a global, shop, or item modifier.
/shop modifier reset <player>โ€”oshopgui.modifier.resetRemove all price modifiers for a player.
/sell/sellalloshopgui.sellSell all sellable items in inventory at once.

๐Ÿ”‘ Permissions

All permissions in the oshopgui.* namespace.

NodeDefaultDescription
oshopgui.*opWildcard โ€” grants all permissions below.
oshopgui.shoptrueOpen /shop. Grant to all players.
oshopgui.reloadopRun /shop reload.
oshopgui.checkopRun /shop check <player>.
oshopgui.shop.othersopOpen shop GUI for another player.
oshopgui.selltrueUse /sell command.
oshopgui.modifier.setopSet price modifiers for players.
oshopgui.modifier.resetopReset all price modifiers for a player.
oshopgui.bypass.cooldownopBypass anti-dupe cooldown. Admin/test use only.

LuckPerms Setup Example

# All players โ€” basic shop access
/lp group default permission set oshopgui.shop true
/lp group default permission set oshopgui.sell true

# Admin group โ€” full control
/lp group admin permission set oshopgui.* true

๐Ÿ—ƒ๏ธ Default Shop Catalog

14 pre-configured categories, 600+ items covering all major Minecraft item groups. Every file is in plugins/OSHOPGUI/shops/ and fully editable.

โ›๏ธ
Ores & Minerals
45 items
๐Ÿ–
Food
45 items
๐ŸŒฟ
Farming & Nature
45 items
๐Ÿ”ด
Nether
45 items
๐Ÿ๏ธ
End & Misc
50 items, 2 pages
๐Ÿ”ง
Tools
46 items, 2 pages
โš”๏ธ
Weapons & Armor
43 items
๐Ÿ“š
Enchanted Books
39 max-level books
๐Ÿฆด
Mob Drops
46 items, 2 pages
๐Ÿงช
Potions
48 items, 2 pages
๐Ÿถ
Brewing
21 ingredients
๐Ÿ”ด
Redstone
37 components

Add new categories by creating a .yml file, adding a button in main-menu-items, and running /shop reload. No restart needed.

โ“ FAQ

Common questions and solutions.

Players can't open the shop

Ensure the player has oshopgui.shop. It defaults to true but may be overridden with an explicit deny. Check with /lp user <name> permission check oshopgui.shop.

Economy isn't working / balance not deducting

Confirm economy.backend: VAULT and that both Vault and an economy plugin (EssentialsX, CMIโ€ฆ) are loaded. Check the startup log for [OSHOPGUI] Economy: Vault โœ”.

Items show as "Invalid Material"

Material names must be ALL_CAPS with underscores โ€” e.g. DIAMOND_SWORD not diamondSword. Invalid items are skipped and logged to console. Fix and run /shop reload.

Custom items (ItemsAdder/Nexo) aren't loading

Ensure ItemsAdder or Nexo loads before oSHOP GUI. Set custom-item: true with the correct custom-item-id. The hook status is logged at startup.

How do I disable buy or sell for an item?

Set buy-price: -1 to disable buying, or sell-price: -1 to disable selling. Both can be -1 for a display-only item.

Price modifiers aren't saving after restart

Modifiers are stored in plugins/OSHOPGUI/data/. Check that the server has write permissions to the plugin directory. The plugin creates the folder on first run.

How do I add a new shop category?

Create a .yml file in plugins/OSHOPGUI/shops/, add a button under main-menu-items in config.yml, then run /shop reload. No restart required.

Amount selection GUI is not appearing

Ensure amount-selection.enabled: true and that amount-selection.presets has at least one value. Reload after changes.

Need help? Join the OreoStudios Discord for support.