AirTrade provides a reliable trading system that allows players to exchange items safely through a synchronized GUI.
It includes request handling, restrictions, blacklists, and complete GUI customization.
Designed to remain lightweight while still offering flexible configuration options.
Features ✅ Configurable trading GUI (`gui/trade.yml`)
✅ Shift-right-click option to send trade requests
✅ Trade confirmation countdown
✅ Item, world, distance, and gamemode restrictions
✅ Blacklist support (materials, names, lore, enchants, exact items)
✅ Customizable sounds for all trade events
✅ Request cooldowns and expiration timers
✅ Automatic cancellation on logout, death, or closing the GUI
✅ MiniMessage-based messages and PlaceholderAPI support
✅ MySQL or SQLite for persistent player toggles
✅ Option to disable item dropping during trades
# Blacklist specific item names (no need to include colours)
# Prefix with * for case-insensitive matching
names:
- "Ilegal Item"
- "*banned item"
# Blacklist specific item lore (no need to include colours)
# Prefix with * for case-insensitive matching
lore:
- "0:Banned Lore" # Any item with the lore line 0 as "Banned Lore" will be blacklisted
- "1:*ilegal lore"
# Blacklist very specific items (no need to include colours)
items:
admin-sword:
material: DIAMOND_SWORD
name: "Admin Sword"
lore:
- "Only for admins"
- "Do not trade!"
enchantments:
- SHARPNESS:5
- FIRE_ASPECT:2
# Requests
request-sent: "%prefix% <green>Trade request sent to <yellow>%target%</yellow>."
request-received: "%prefix% <yellow>%player%</yellow> <green>wants to trade with you."
expired: "%prefix% <red>Your trade request to <yellow>%target%</yellow> has expired."
request-expired: "%prefix% <red>The trade request from <yellow>%player%</yellow> has expired."
# Toggle Preferences
toggle-on: "%prefix% <green>You can now receive trade requests."
toggle-off: "%prefix% <red>You will no longer receive trade requests."
target-toggle-disabled: "%prefix% <red>You cannot send a trade request to <yellow>%target%</yellow> because they have trades disabled."
# Accept / Deny
no-requests: "%prefix% <red>You have no pending trade requests."
no-request-from: "%prefix% <red>You have no trade request from <yellow>%player%</yellow>."
request-accepted: "%prefix% <green>You accepted the trade request from <yellow>%target%</yellow>."
request-accepted-target: "%prefix% <yellow>%player%</yellow> <green>accepted your trade request."
request-denied: "%prefix% <red>You declined the trade request from <yellow>%target%</yellow>."
request-denied-target: "%prefix% <yellow>%player%</yellow> <red>declined your trade request."
all-requests-denied: "%prefix% <red>You declined all previous trade requests."
# Session
cancelled: "%prefix% <red>Trade cancelled."
completed: "%prefix% <green>Trade completed successfully!"
summary:
header: "%prefix% <green>Trade summary:"
received: "<green>+ x%amount% %item%"
given: "<red>- x%amount% %item%"
item-cooldown: "%prefix% <red>You must wait <yellow>%seconds%</yellow> seconds before using this item again!"
item-blacklisted: "%prefix% <red>This item is blacklisted!"
# Limits / Restrictions
cooldown: "%prefix% <red>You must wait <yellow>%seconds%</yellow> seconds before sending another trade request to <yellow>%target%</yellow>."
too-far: "%prefix% <red>You cannot trade with <yellow>%target%</yellow>. Maximum distance allowed is <yellow>%blocks%</yellow> blocks."
different-world: "%prefix% <red>You must be in the same world as <yellow>%target%</yellow> to trade."
blacklisted-gamemode-sender: "%prefix% <red>You cannot send trade requests while in your current gamemode."
blacklisted-gamemode-target: "%prefix% <red>You cannot trade with <yellow>%target%</yellow> because they are in a blocked gamemode."
blacklisted-world-sender: "%prefix% <red>You cannot send trade requests while in this world."
blacklisted-world-target: "%prefix% <red>You cannot trade with <yellow>%target%</yellow> because they are in a blocked world."
# ------------------------------------------
# Errors
# ------------------------------------------
errors:
player-not-found: "%prefix% <red>Player not found or not online."
self-trade: "%prefix% <red>You cannot trade with yourself."
no-permission: "%prefix% <red>You do not have permission to use this command."
/airtrade <player> - Send a trade request
/airtrade accept - Accept the most recent request
/airtrade accept [player] - Accept a specific player request
/airtrade deny - Deny a trade request
/airtrade deny [player] - Deny a specific player request
/airtrade toggle - Enable/disable receiving trade requests
/airtrade reload - Reload config and GUI files
Aliases can be added in `config.yml`.
Permissions
Permission
Description
airtrade.use
Allows using the trade command
airtrade.admin
Access to admin commands
airtrade.bypass.all
Grants all bypass permissions
airtrade.bypass.distance
Bypass distance restriction
airtrade.bypass.world
Bypass world restrictions
airtrade.bypass.gamemode
Bypass gamemode restrictions
airtrade.bypass.toggle
Allow trading with players who disabled trades
airtrade.bypass.blacklist
Bypass item blacklist
PlaceholderAPI Placeholders
Placeholder
Description
%airtrade_trade_toggled%
Returns "true" if the player has trade requests enabled
%airtrade_player_is_ready%
Returns "true" if the player is marked as ready inside an active trade
%airtrade_target_is_ready%
Returns "true" if the player’s trade partner is ready
%airtrade_confirm_countdown%
Remaining countdown seconds before the trade completes (or full countdown value if not started yet)
%airtrade_is_trading%
Returns "true" if the player is currently in a trade session
%airtrade_active_trades%
Returns the number of active trade sessions on the server
To-Do
Vault compatibility for trading money
Optional trade logging
Additional GUI action types
If you find any bug, need help, or want to suggest a feature, feel free to contact me on Discord (@featxeven) or use the plugin’s discussion section!