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.
๐ 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
| Dependency | Version | Required |
|---|---|---|
| Paper / Spigot | 1.20+ | โ Required |
| Java | 17 or higher | โ Required |
| Vault | Latest | โ ๏ธ For Vault economy |
| Economy plugin | EssentialsX / CMIโฆ | โ ๏ธ Paired with Vault |
| LuckPerms | Any | โน๏ธ Recommended |
| ItemsAdder / Nexo | Any | โน๏ธ Optional |
Download the plugin JAR
Grab oSHOPGUI-Premium.jar from the OreoStudios Spigot page or your purchase receipt.
Place in /plugins/
Drop the JAR into your server's plugins/ folder alongside Vault and your economy provider.
Start the server
The plugin generates plugins/OSHOPGUI/config.yml, messages.yml, and all default shop files in plugins/OSHOPGUI/shops/.
Set economy backend
Open config.yml, set economy.backend to VAULT, EXP_POINTS, or EXP_LEVELS, then run /shop reload.
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
| Key | Type | Default | Description |
|---|---|---|---|
main-menu.title | String | "&8ยป &6&lSHOP &8ยซ" | GUI title. Supports color codes. |
main-menu.rows | int 1โ6 | 4 | Number of inventory rows. |
main-menu.fill-empty | boolean | true | Fill empty slots with decorative glass. |
main-menu.fill-material | Material | GRAY_STAINED_GLASS_PANE | Material used as the filler. |
Economy
| Key | Type | Default | Description |
|---|---|---|---|
economy.backend | Enum | VAULT | VAULT, EXP_POINTS, or EXP_LEVELS. |
Anti-Dupe
| Key | Type | Default | Description |
|---|---|---|---|
anti-dupe.cooldown-ms | long | 300 | Milliseconds between consecutive transactions. |
anti-dupe.max-transactions-per-second | int | 5 | Max transactions in any 1-second window. |
anti-dupe.verify-inventory | boolean | true | Verify player inventory before completing a sale. |
anti-dupe.lock-during-transaction | boolean | true | Lock the player during an active transaction. |
Amount Selection GUI
| Key | Type | Default | Description |
|---|---|---|---|
amount-selection.enabled | boolean | true | Show the amount-selection GUI before transactions. |
amount-selection.presets | List<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
| Key | Type | Description |
|---|---|---|
transaction-log.format | String | Log line format. Placeholders: {player} {action} {item} {amount} {price} {time} |
transaction-log.file | String | Filename 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
| Placeholder | Available in | Description |
|---|---|---|
{item} | buy/sell messages | Human-readable item name |
{amount} | buy/sell messages | Quantity purchased or sold |
{price} | buy/sell messages | Total price with economy symbol |
{balance} | error messages | Player's current balance |
{shop} | GUI labels | Shop category name |
{page} | navigation | Current page number |
{max-page} | navigation | Total page count |
{modifier} | modifier messages | Modifier multiplier, e.g. 1.2 |
{player} | check command | Target 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
| Field | Type | Required | Description |
|---|---|---|---|
slot | int | โ | Inventory slot (0-indexed). Slots 45โ53 are reserved for navigation. |
buy-price | double | โ | Purchase price. Set -1 to disable buying. |
sell-price | double | โ | Sell price. Set -1 to disable selling. |
display-name | String | โ | Override display name. Supports color codes. |
lore | List | โ | Custom lore lines shown in the GUI. |
page | int | โ | Page number for this item. Defaults to 1. |
custom-item | boolean | โ | true to use a custom item from ItemsAdder or Nexo. |
custom-item-id | String | โ | Namespaced ID of the custom item, e.g. ia:ruby. |
enchantments | List | โ | 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.
| Backend | Config Value | Description |
|---|---|---|
| Vault | VAULT | Any Vault-compatible economy plugin (EssentialsX, CMI, etc.). Displays currency symbol from Vault API. |
| EXP Points | EXP_POINTS | Uses raw experience points. Ideal for vanilla-friendly servers with no Vault dependency. |
| EXP Levels | EXP_LEVELS | Uses 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.
Main Menu
Shows all shop category buttons. Empty slots filled with glass pane. Fully configurable layout.
Shop GUI
Displays items for the selected category with automatic pagination. Left-click to buy, right-click to sell.
Amount Selection
Optional GUI to pick a preset quantity (1, 16, 32, 64, 128โฆ) before confirming. Fully configurable or can be disabled.
Transaction
Processor checks balance, applies modifiers, verifies inventory, executes the transfer, logs it, and returns the player to the shop.
Click Behavior
| Action | Result |
|---|---|
| Left Click on item | Opens amount selection for buying |
| Right Click on item | Opens amount selection for selling |
| Left Click Back button | Returns to main menu |
| Left Click Prev / Next | Paginates 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.
| Tier | Scope | Priority |
|---|---|---|
| Global | All shops, all items for that player | Lowest |
| Shop | All items within a specific shop category | Medium |
| Item | One specific item in one specific shop | Highest |
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_naturefor a harvest event. - Item rarity: 2.0 buy modifier on
NETHERITE_INGOTto double its cost.
๐ Plugin Hooks
Third-party integrations are detected and initialized automatically at startup.
| Plugin | Hook Type | What it enables |
|---|---|---|
| Vault | Economy API | Use any Vault-compatible economy as the currency backend. |
| ItemsAdder | Custom items | Reference ItemsAdder items using custom-item: true + custom-item-id: ia:namespace:item. |
| Nexo | Custom items | Same custom-item fields โ hook auto-detects which plugin is present. |
| SmartInvs | GUI framework | Powers 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.
| Command | Aliases | Permission | Description |
|---|---|---|---|
/shop | /s /store | oshopgui.shop | Opens the main shop menu. |
/shop reload | โ | oshopgui.reload | Reloads config, messages, and all shop files. |
/shop check <player> | โ | oshopgui.check | Shows a player's active price modifiers. |
/shop <player> | โ | oshopgui.shop.others | Opens the shop for another player. |
/shop modifier set โฆ | โ | oshopgui.modifier.set | Set a global, shop, or item modifier. |
/shop modifier reset <player> | โ | oshopgui.modifier.reset | Remove all price modifiers for a player. |
/sell | /sellall | oshopgui.sell | Sell all sellable items in inventory at once. |
๐ Permissions
All permissions in the oshopgui.* namespace.
| Node | Default | Description |
|---|---|---|
| oshopgui.* | op | Wildcard โ grants all permissions below. |
| oshopgui.shop | true | Open /shop. Grant to all players. |
| oshopgui.reload | op | Run /shop reload. |
| oshopgui.check | op | Run /shop check <player>. |
| oshopgui.shop.others | op | Open shop GUI for another player. |
| oshopgui.sell | true | Use /sell command. |
| oshopgui.modifier.set | op | Set price modifiers for players. |
| oshopgui.modifier.reset | op | Reset all price modifiers for a player. |
| oshopgui.bypass.cooldown | op | Bypass 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.
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.