CoinOp
A dynamic order-book economy plugin where players trade items at player-driven prices. Features instant buy/sell, lore-based price tooltips, multi-server sync, optional GUI, and anvil cost rework.
Quick challenge
How far can you run before the mobs catch you?
Minecraft check
Confirm your run
Complete the quick check to get your code.
CoinOp
CoinOp
A dynamic, order-book-based economy plugin for Minecraft servers.
What This Plugin Does
This plugin creates a marketplace where players can trade items with each other. Instead of fixed prices, the market determines prices based on supply and demand - similar to how stock markets or Hypixel's Bazaar works.
Key Features: - Players can place buy orders ("I want to buy 100 diamonds for $50 each") - Players can place sell orders ("I want to sell 100 diamonds for $50 each") - When prices match, trades happen automatically - Instant buy/sell at current market price - Item tooltips show current market prices - Works across multiple servers (using Redis) - Optional GUI for easier trading - Anvil cost rework (no more "Too Expensive!")
Requirements
Before installing, make sure you have:
1. Vault running Paper or Spigot (versions 1.19.x - 1.21.x) 2. Vault for Minecraft 1.19-1.20, or Vault for Minecraft 1.21+ 3. Vault like EssentialsX, CMI, or PlayerPoints 4. Vault (will auto-download if missing)
Server Compatibility
CoinOp works with all major Minecraft server software:
| Server | Status | Notes | |--------|--------|-------| | Paper | ✅ Full | Primary target - uses Paper API | | Spigot | ✅ Full | Compatible via Spigot API | | Bukkit | ✅ Full | Basic Bukkit API | | Purpur | ✅ Full | Paper fork, 100% compatible | | Pufferfish | ✅ Full | Paper fork, 100% compatible | | Airplane | ✅ Full | Paper fork, 100% compatible | | TacoSpigot | ✅ Full | Paper/Spigot fork, compatible | | Akarin | ✅ Full | Paper fork, compatible |
Minecraft Versions: - 1.19.x (1.19, 1.19.1, 1.19.2, 1.19.3, 1.19.4) - 1.20.x (1.20, 1.20.1, 1.20.2, 1.20.3, 1.20.4, 1.20.5, 1.20.6) - 1.21.x (1.21, 1.21.1, 1.21.2, 1.21.3, 1.21.4, etc.)
Installation
1. Download the JAR file for your Minecraft version from the releases 2. Put it in your server's `plugins` folder 3. Start the server 4. The plugin will create a `plugins/CoinOp/` folder with configuration files 5. Edit `config.yml` to customize the plugin 6. Restart the server or run `/coa reload`
Configuration Guide
The main configuration file is `config.yml` located in `plugins/CoinOp/`. Here's a detailed explanation of each section:
Economy Settings
```yaml economy: tax-rate: 0.0 ```
- `tax-rate`: A percentage taken from each trade. Set to `0.0` for no tax, `0.05` for 5% tax. The tax money disappears from the economy (it's not collected by anyone).
Example: If you set `0.05` and a player sells diamonds for $100, they only receive $95.
Order Settings
```yaml orders: min-amount: 1 max-amount: 2304 expiration-minutes: -1 ```
- `min-amount`: Minimum items per order. Default is 1. - `max-amount`: Maximum items per order. Default is 2304 (36 stacks = one double chest). Set to `-1` for unlimited. - `expiration-minutes`: How long orders stay active. Default `-1` means orders never expire. Set to `1440` for 24 hours, `10080` for 1 week.
Commodities Configuration
```yaml commodities: allowed: [] categories: ores: - DIAMOND - IRON_INGOT - GOLD_INGOT crops: - WHEAT - CARROT ```
- `allowed`: Leave empty `[]` to allow all items. Or list specific items like `[DIAMOND, IRON_INGOT]` to only allow those. - `categories`: Groups items together for the GUI. You can add your own categories.
Adding a new category: ```yaml commodities: categories: nether: - NETHERITE_INGOT - QUARTZ - GLOWSTONE_DUST ```
Trade Limits
```yaml limits: global-daily-limit: 0 daily-limits: DIAMOND: 1000 ```
- `global-daily-limit`: Maximum total items a player can trade per day. `0` means unlimited. - `daily-limits`: Per-item limits. The example limits players to 1000 diamonds per day.
Why use limits? Prevents players from manipulating the market or laundering money.
Price Bounds
```yaml price-bounds: enabled: true global-min: 0.01 global-max: 1000000000 commodities: DIAMOND: min: 10.0 max: 10000.0 ```
- `enabled`: Turn price bounds on/off - `global-min`: Minimum price for any item (default: $0.01) - `global-max`: Maximum price for any item (default: $1 billion) - `commodities`: Set specific limits per item
Why use price bounds? Prevents players from: - Selling items for $0.01 to transfer money between accounts - Buying items for extreme prices to manipulate the market
Example scenario: You want diamonds to trade between $10 and $10,000: ```yaml price-bounds: enabled: true commodities: DIAMOND: min: 10.0 max: 10000.0 ```
Now if someone tries to place a buy order for $5, it will be rejected. If someone tries to sell for $15,000, it will be rejected.
Multi-Server Sync (Redis)
If you run multiple servers and want them to share the same market:
```yaml sync: enabled: true redis: host: localhost port: 6379 password: "" database: 0 ```
- `enabled`: Turn sync on/off - `host`: Redis server IP address - `port`: Redis port (default 6379) - `password`: Redis password (leave empty if none) - `database`: Redis database number (0-15)
How it works: When a player places an order on Server A, it instantly appears on Server B. Trades are synchronized across all connected servers.
Do I need Redis? Only if you run multiple servers. For a single server, leave `enabled: false`.
Database Configuration
```yaml database: type: sqlite host: localhost port: 3306 name: CoinOp user: root password: "" ```
- `type`: Either `sqlite` or `mysql` - `sqlite`: Stores data in a local file. Good for single servers. - `mysql`: Connects to a MySQL server. Good for multi-server setups. - `host`, `port`, `name`, `user`, `password`: MySQL connection details (ignored if using SQLite)
When to use MySQL: If you run multiple servers and want them to share order history and player data.
Lore Display Settings
```yaml lore: enabled: true update-interval: 20 show-history: true history-points: 5 ```
- `enabled`: Show market prices in item tooltips - `update-interval`: How often to refresh prices (in ticks, 20 ticks = 1 second) - `show-history`: Show price trend in tooltip - `history-points`: How many price points to show
What players see: When they hover over a diamond in their inventory, they'll see: ``` ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ CoinOp Market Data ━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Buy Price: $50.00 each Sell Price: $48.50 each 24h Volume: 125,300 Trend: ▲ Up ```
Anvil Rework Settings
```yaml anvil-rework: enabled: true enchantment-extraction: true max-cost: 0 material-costs: NETHERITE_INGOT: 15 DIAMOND: 10 ```
- `enabled`: Turn the anvil rework on/off - `enchantment-extraction`: Allow moving enchants to books - `max-cost`: Maximum anvil cost. `0` means unlimited (no "Too Expensive!") - `material-costs`: Base costs for different materials
How it works: Instead of exponential costs (2^n - 1), the anvil uses linear costs based on material rarity. This means you can combine many enchantments without hitting the "Too Expensive!" limit.
Enchantment Extraction: Put an enchanted item in the left slot and a book in the right slot. The enchantments will transfer to the book.
GUI Settings
```yaml gui: enabled: true open-on-command: true title: "&6CoinOp &8- &7Market" main-menu-size: 54 sounds: open: "BLOCK_CHEST_OPEN" click: "UI_BUTTON_CLICK" icons: ores: "DIAMOND" crops: "WHEAT" ```
- `enabled`: Turn the GUI on/off - `open-on-command`: Open GUI when player runs `/CoinOp` without arguments - `title`: GUI title (supports color codes: `&6` = gold, `&8` = dark gray, `&7` = gray) - `main-menu-size`: GUI size (must be multiple of 9, max 54) - `sounds`: Sound effects for different actions - `icons`: Which items represent each category
Color Codes: - `&0` - Black - `&1` - Dark Blue - `&2` - Dark Green - `&3` - Dark Aqua - `&4` - Dark Red - `&5` - Dark Purple - `&6` - Gold - `&7` - Gray - `&8` - Dark Gray - `&9` - Blue - `&a` - Green - `&b` - Aqua - `&c` - Red - `&d` - Light Purple - `&e` - Yellow - `&f` - White
Commands
Player Commands
| Command | Aliases | Description | Example | |---------|---------|-------------|---------| | `/coinop` | `/co`, `/market` | Open the CoinOp menu | `/coinop` | | `/coinop buy <item> <amount> <price>` | `/coinbuy` | Place a buy order | `/coinbuy DIAMOND 100 50` | | `/coinop sell <item> <amount> <price>` | `/coinsell` | Place a sell order | `/coinsell DIAMOND 100 50` | | `/coinop instant buy <item> <amount>` | `/coininstant` | Buy at market price | `/coininstant buy DIAMOND 64` | | `/coinop instant sell <item> <amount>` | `/coininstant` | Sell at market price | `/coininstant sell DIAMOND 64` | | `/coinop orders` | `/coinorders` | View your active orders | `/coinorders` | | `/coinop orders cancel <item> <id>` | - | Cancel an order | `/coinop orders cancel DIAMOND 12345` | | `/coinop price <item>` | `/coinprice` | Check current prices | `/coinprice DIAMOND` | | `/coinop history <item>` | - | View recent trades | `/coinop history DIAMOND` |
Admin Commands
| Command | Aliases | Description | |---------|---------|-------------| | `/coinadmin reload` | `/coa reload` | Reload configuration | | `/coinadmin bounds list` | `/coa bounds list` | List all price bounds | | `/coinadmin bounds set <item> <min> <max>` | `/coa bounds set` | Set price bounds | | `/coinadmin bounds remove <item>` | `/coa bounds remove` | Remove price bounds | | `/coinadmin limits list` | `/coa limits list` | List all trade limits | | `/coinadmin limits set <item> <limit>` | `/coa limits set` | Set daily trade limit | | `/coinadmin stats [item]` | `/coa stats` | View trading statistics | | `/coinadmin cleanup` | `/coa cleanup` | Remove inactive orders | | `/coinadmin sync status` | `/coa sync status` | Check Redis connection |
Permissions
| Permission | Description | Default | |------------|-------------|---------| | `CoinOp.use` | Basic CoinOp usage | Everyone | | `CoinOp.buy` | Place buy orders | Everyone | | `CoinOp.sell` | Place sell orders | Everyone | | `CoinOp.instant` | Use instant buy/sell | Everyone | | `CoinOp.orders` | View own orders | Everyone | | `CoinOp.cancel` | Cancel own orders | Everyone | | `CoinOp.admin` | Admin commands | OPs only | | `CoinOp.admin.bounds` | Set price bounds | OPs only | | `CoinOp.admin.limits` | Set trade limits | OPs only | | `CoinOp.admin.reload` | Reload config | OPs only | | `CoinOp.admin.sync` | Manage sync settings | OPs only | | `CoinOp.bypass.limit` | Bypass trade limits | OPs only | | `CoinOp.bypass.bounds` | Bypass price bounds | OPs only |
How Trading Works
Order Book System
The CoinOp uses an order book - the same system used by real stock markets:
1. Buy Orders (Bids): Players say "I want to buy X items at $Y each" - Highest prices are matched first - Example: If someone is willing to pay $55 and another $50, the $55 order trades first
2. Sell Orders (Asks): Players say "I want to sell X items at $Y each" - Lowest prices are matched first - Example: If someone is selling at $45 and another at $50, the $45 order trades first
3. Matching: When a buy order's price meets or exceeds a sell order's price, a trade happens at the sell order's price.
Example Trade: - Alice places a buy order: "I want to buy 100 diamonds at $50 each" - Bob places a sell order: "I want to sell 50 diamonds at $48 each" - Since $50 ≥ $48, they trade: Bob sells 50 diamonds to Alice for $48 each - Alice's order now has 50 diamonds remaining at $50 each
Instant Buy/Sell
For players who want immediate trades:
- Instant Sell: Buys at the lowest available sell price - Instant Sell: Sells at the highest available buy price
If no matching orders exist, the trade is rejected.
Troubleshooting
"Vault not found" error
The plugin will auto-download Vault on first run. If it fails: 1. Download Vault from https://www.spigotmc.org/resources/vault.34315/ 2. Put it in your `plugins` folder 3. Restart the server
"No economy plugin found" error
You need an economy plugin. Install one of these: - EssentialsX (recommended): https://essentialsx.net/ or https://modrinth.com/plugin/essentialsx - CMI: https://www.spigotmc.org/resources/cmi.3742/ or if you want to stay on modrinth SunLight - PlayerPoints: https://www.spigotmc.org/resources/playerpoints.1997/ or https://modrinth.com/plugin/playerpoints
"Price outside allowed bounds" error
The price is outside the limits set in config.yml. Either: - Change the price bounds in the config - Give the player `CoinOp.bypass.bounds` permission
"Daily trade limit reached" error
The player has traded too much of that item today. Either: - Wait until tomorrow (limits reset daily) - Increase the limit in config.yml - Give the player `CoinOp.bypass.limit` permission
GUI not opening
Check these settings in config.yml: ```yaml gui: enabled: true open-on-command: true ```
Redis connection failed
1. Make sure Redis is installed and running 2. Check the connection details in config.yml 3. Test with `/coa sync status`
Building from Source
If you want to modify the plugin:
1. Install Java 17 or Java 21 2. Clone or download the source code 3. Run `./gradlew build` (Linux/Mac) or `gradlew.bat build` (Windows) 4. Find the JARs in `versions/*/build/libs/`
Support
- Report bugs on the **issue tracker** - For questions, ask in the **discussion forum**
License
Credits
Developer: APPLEPIE6969
Inspired by Hypixel's Bazaar system and the Minecraft community's requests for a dynamic economy plugin.