⭐ Tiny Markets - Shops for anyone | 1.20.x - 1.21.x | Async & Packetbased icon

⭐ Tiny Markets - Shops for anyone | 1.20.x - 1.21.x | Async & Packetbased -----

The most feature rich playershop solution on the market




FIXED Currency symbol not being propagated across menus if changed

FIXED Missing item name and lore for hologram settings

NEW HuskClaims claiming support to allow for shops to be used inside claims without triggering warning messages (experimental/untested)

IMPROVED Better display of hybrid mode for shops

IMPROVED Consistent use of currency lang instead of built in $ sign across many menus

FIXED Missing messages
----------, Mar 22, 2026

IMPROVED Menu editor is visually more clear now (Premium only feature)
IMPROVED Some inconstistencies in menus for display icons

FIXED Some menus having titles and lores that weren't loaded
----------, Mar 21, 2026

Please update immediately if you downloaded v1.8.3!

FIXED
Failing on startup due to imports failing

FIXED Setup skipping storage step due to method call happening too early
----------, Mar 20, 2026

NEW Let users refund purchases after a mislick etc. for a limited time (if shop has space, money and user still has the original item)
NEW Let users select stack amounts easier with the new submenu to select amounts

IMPROVED Default purchase menu now has two extra buttons to set selected amount to nearest full stack.

FIXED Missing messages and formating errors
----------, Mar 20, 2026

FIXED Automigrator not updating config.yml and lang files

FIXED Added two missing messages to default internal message system
----------, Mar 18, 2026

NEW Players can now create hybrid shops (that both sell and buy the same item) by clicking on "set price" and entering "S{sellprice} B{buyprice}" i.e. "S15 B10"

NEW The plugin keeps track of hybrid shops and tracks sales individually

IMPROVED Onboarding remembers already completed steps, making sure you can exit GUI at any point and return to setup without having to worry about settings being lost.

IMPROVED Better DB connection checks (fallback safety)

FIXED Set "debug" to false by default - sorry if your console was very spammy, oops.
----------, Mar 18, 2026

FIXED Complete rewrite of the custom lang loader system - this should fix all menus that were previously having issues with loading custom itemnames and itemlores.

IMPROVED Lang files are now split. All files are in folder "lang" with messages in messages.yml and all menus having their own file in "menus".
IMPROVED Users can now filter their /market myshops page by stock, price, profit etc.

NEW Option for stacking permissions (inheriting higher limits via permissions for maxshops and maxstacksize)
NEW Command /market mystats to see list of stats including shop limits etc
----------, Mar 16, 2026

NEW Support for Towny
NEW Support for Bentobox-skyblock
NEW All menu configs are split into seperate files
NEW All messages and lang files are in folder "lang"
NEW Plugin startup was slimmed down a bit, some of its logging moved into a seperate logging file.
NEW Migration for ChestShop3 (Requires manual input from players due to technical limitations with ChestShop3)

FIXED Custom menu itemnames and lores not loading sometimes across a lot of menus (rewrite of the menu renderer)
FIXED Weird interaction warning messages when using shops on Plotsquared plots and other claims

IMPROVED Bidding system now comes with admin commands (/market admin featured) to set stage, remaining time etc.
IMPROVED Slots won in bidding process now are marked as "Featured"
IMPROVED Players can only have one featured slot
IMPROVED Players can now select a specific shop or a shopgroup for their featured slot.
----------, Mar 9, 2026

FIXED Classloader not working properly
----------, Mar 8, 2026

NEW Players can now issue refunds for trades they've completed within the last 5 minutes
NEW Added more sign-interactions and seperated shift and none-shift interactions (though this might be a bit buggy for bedrock, sorry guys, just nothing I can do about this)
NEW (Experimental) Itemcages: Creating a glass around the previewitem to seperate it more from "drops" if enabled
NEW (Experimental) Static previewitem rotation; Previewitems do not rotate towards players anymore if enabled

IMPROVED Visual clarity of settings menu
IMPROVED Loadbalancer
IMPROVED Modularized some systems like commands (does not affect players, just makes my life easier)

FIXED Pending offers button sometimes not working
FIXED Hologram and previewitem not shifting over when switching from default location to custom location

[​IMG]
----------, Mar 7, 2026

NEW Players can create shared shops (Free mode limited to 3 players per shop). In shared mode, players can assign permissions, handle shop parts they have perms for and work together
NEW Shop grouping. Shops can be grouped together for easier management
NEW Shop browser with featured slots (toggleable). If enabled, there is a server-wide blind bidding after which the winners will have one slot to advertise their shops in the global browser.
NEW Item-preview custom offset (with toggle and default preset)
NEW Optional creation and upkeep cost systems
IMPROVED Settings menu (split by category, toggles and with pages)
FIXED Permission check firing too often, causing 0.05% more server load than necessary (Yes, I take the "best optimized shop" thing very serious).
FIXED Automigrator duping lore lines when checking for old configs

I have made an (AI) Summary of the updated API for anyone that wants to use it. Please don't come at me for not hosting in publicly, just use reflections as described in the guide. I can't be arsed to manage the API library via maven.

https://www.markdownpaste.com/document/tiny-markets-api-1711-latest

I am very sorry to anyone that was affected by the automigrator duping lore lines. DM me or open a ticket in Discord and I'll personally sort this out for you! <3
----------, Mar 6, 2026

FIX Counteroffer menu for item-trades blocking all inventory interactions, effectively speaking blocking the player from using the "Offer different item" option. (silly bug)
----------, Mar 6, 2026

NEW Users can now create counteroffers, manage them easier and see pending offers. This comes with automatic nudges about unclaimed trades and new offers
NEW Toggle for admins to allow teleporting to shops (with warmup) to shops from browser and search function
NEW Global Browser for shops by category or player
NEW Categoryeditor for admins for browser
NEW Automatic migration from config.yml and messages.yml (premium only) when new update drops. The plugin will copy over your settings
IMPROVED Search is now more accurate and offers better filtering
----------, Mar 5, 2026

NEW Configurable time limits before old counteroffers are moved to new "history" tab.
NEW Auto-deletion from player gui of old counteroffers after 90 days (configurable)
IMPROVED Fixes for migration from Plugin "Shop" when in barter mode - hopefully fixes stock migration being broken.
----------, Mar 2, 2026

NEW Logging via DiscordSRV (experimental)
NEW config.yml now contains a link to all permissions ( https://www.markdownpaste.com/document/permissions-tiny-markets-v177)
NEW Better documentation and limit info on permissions
FIXED Some messages not loading fully

Reducing the amount of rows a menu has in Premium-mode does not work. I am working ont his <3
----------, Mar 1, 2026

NEW Players can make counter offers for shops (toggleable global and per shop)
NEW Players can offer bulk-purchase discounts i.e. 5% off from an order of 1000 items or more (default and permission based limits)
NEW Initial support for dynmap (though markers are having issues rendering for now - experimental)
NEW Support for plot-squared
NEW Claimables menu - unclaimed offers that got accepted land here
Improved Adding more message configs to messages.yml for bossbar and actionmar messages etc
Improved Better shop prechaching for statistics and price overviews

And some more I forgot to note down... will be appended in the next update info
----------, Feb 28, 2026

NEW Discord webhooks (fully working including batchmode or instant mode
NEW Public API (shade jar into your plugin as lib and use reflection. See below for list of api methods and examples.

IMPROVED Fixed a bug with migration from plugin Shop ( https://www.spigotmc.org/resources/shop-the-intuitive-shop-plugin.9628/) caused by the owner storing the location of shops not as the container but the sign... and in the wrong format... and not always the same depending on what side the container is facing.
Seriously, just avoid that plugin, its utter dog****...

API:

Code (YAML):
Available methods :
getAllShops ( ) - Get all registered shops
getShopById (long ) - Get shop by ID
getShopAt (Location ) - Get shop at location
getShopsByOwner (UUID ) - Get all shops by owner
getShopCount (UUID ) - Count shops owned by player
isShop (Location ) - Check if location has a shop
getMaxShopsFor (Player ) - Get max shops for player
setEconomyProvider (Economy ) - Set custom economy
getEconomyProvider ( ) - Get current economy
firePrePurchaseEvent ( ... ) - Fire purchase event
firePreSellEvent ( ... ) - Fire sell event
getVersion ( ) - Get plugin version
isPremium ( ) - Check if premium
getPlugin ( ) - Get raw plugin instance
Examples:


Code (Java):
@EventHandler (priority = EventPriority. MONITOR, ignoreCancelled = true )
    public void onShopSell (ShopPreSellEvent event ) {
        if ( !plugin. isLoggingEnabled ( ) || !plugin. isConsoleLoggingEnabled ( ) ) {
            return ;
        }

        Shop shop = event. getShop ( ) ;
        Player seller = event. getSeller ( ) ;
        int amount = event. getAmount ( ) ;
        double totalPrice = event. getTotalPrice ( ) ;

        String itemName = getItemName (shop ) ;
        String ownerName = shop. ownerName ( ) ;

        plugin. getLogger ( ). info ( String. format (
            "[SELL] %s sold %dx %s to %s's shop for %.2f",
            seller. getName ( ),
            amount,
            itemName,
            ownerName,
            totalPrice
        ) ) ;
    }

Code (Java):
@EventHandler (priority = EventPriority. MONITOR, ignoreCancelled = true )
    public void onShopPurchase (ShopPrePurchaseEvent event ) {
        if ( !plugin. isLoggingEnabled ( ) || !plugin. isConsoleLoggingEnabled ( ) ) {
            return ;
        }

        Shop shop = event. getShop ( ) ;
        Player buyer = event. getBuyer ( ) ;
        int amount = event. getAmount ( ) ;
        double totalPrice = event. getTotalPrice ( ) ;

        String itemName = getItemName (shop ) ;
        String ownerName = shop. ownerName ( ) ;

        plugin. getLogger ( ). info ( String. format (
            "[PURCHASE] %s bought %dx %s from %s's shop for %.2f",
            buyer. getName ( ),
            amount,
            itemName,
            ownerName,
            totalPrice
        ) ) ;
    }

Code (Java):
package me.netizdendev.marketsHooker ;

import me.netizdendev.marketsHooker.config.ConfigManager ;
import me.netizdendev.marketsHooker.listeners.ShopListener ;
import me.netizdendev.tinyMarkets.api.TinyMarketsAPI ;
import org.bukkit.Bukkit ;
import org.bukkit.plugin.java.JavaPlugin ;
import org.bukkit.scheduler.BukkitRunnable ;

public final class MarketsHooker extends JavaPlugin {

    private ConfigManager configManager ;
    private TinyMarketsAPI tinyMarketsAPI ;
    private boolean hooked = false ;

    @Override
    public void onEnable ( ) {
        // Initialize configuration
        configManager = new ConfigManager ( this ) ;
        configManager. loadConfig ( ) ;

        // TinyMarkets is a Paper plugin, so it may not be enabled yet when this Bukkit plugin enables.
        // We need to wait for the server to finish loading, then check for TinyMarkets.
        getLogger ( ). info ( "Waiting for TinyMarkets to be available..." ) ;

        // Schedule a delayed task to hook into TinyMarkets after server is fully loaded
        new BukkitRunnable ( ) {
            private int attempts = 0 ;
            private final int maxAttempts = 20 ; // Try for 10 seconds (20 * 10 ticks = 200 ticks = 10 seconds)

            @Override
            public void run ( ) {
                attempts ++;

                // Check if TinyMarkets API is available
                if (TinyMarketsAPI. isAvailable ( ) ) {
                    tinyMarketsAPI = TinyMarketsAPI. getInstance ( ) ;
                    hooked = true ;

                    // Register event listeners
                    Bukkit. getPluginManager ( ). registerEvents ( new ShopListener (MarketsHooker. this ), MarketsHooker. this ) ;

                    getLogger ( ). info ( "MarketsHooker hooked into TinyMarkets v" + tinyMarketsAPI. getVersion ( ) + " successfully!" ) ;
                    getLogger ( ). info ( "Logging module: " + (isLoggingEnabled ( ) ? "ENABLED" : "DISABLED" ) ) ;
                    this. cancel ( ) ;
                    return ;
                }

                // If we've exceeded max attempts, give up
                if (attempts >= maxAttempts ) {
                    getLogger ( ). warning ( "TinyMarkets API not available after " + maxAttempts + " attempts. MarketsHooker will not function." ) ;
                    getLogger ( ). warning ( "Please ensure TinyMarkets is installed and enabled." ) ;
                    this. cancel ( ) ;
                }
            }
        }. runTaskTimer ( this, 10L, 10L ) ; // Start after 10 ticks, repeat every 10 ticks (0.5 seconds)
    }

    @Override
    public void onDisable ( ) {
        getLogger ( ). info ( "MarketsHooker disabled!" + (hooked ? " (was hooked to TinyMarkets)" : " (was not hooked)" ) ) ;
    }

    public boolean isHooked ( ) {
        return hooked ;
    }

    public boolean isLoggingEnabled ( ) {
        return configManager. isLoggingEnabled ( ) ;
    }

    public boolean isConsoleLoggingEnabled ( ) {
        return configManager. isConsoleLoggingEnabled ( ) ;
    }

    public TinyMarketsAPI getTinyMarketsAPI ( ) {
        return tinyMarketsAPI ;
    }

    public ConfigManager getConfigManager ( ) {
        return configManager ;
    }
}
 
----------, Feb 26, 2026

ADDED - New ingame settings menu with /market admin settings
ADDED - Configurable glow colors for each of the actions
ADDED - Signs of shops are now considered part of it and various interactions can be "programmed" to them, allowing you to set different kinds of interactions to your own liking
ADDED - Internal shop protection system to prevent it from being blown up by entities, mobs etc.
ADDED - Configurable radius of /autostock command in config.yml
FIXED - Signs blocking you from interacting with shops and forcing you to use the container itself
FIXED - Very rare display error with chestshops rotating the wrong way around after toggling on/off
IMPROVED - Local-storage migration for plugin Shop ( https://www.spigotmc.org/resources/shop-the-intuitive-shop-plugin.9628/) now works and will load data properly (detection of different storage file formats)
----------, Feb 25, 2026

FIX - No longer shading the imports directly, reducing the jar size (and now once again hosted directly on spigot)
FIX - Players being able to set storage to database in freemode, causing dataloss after restart
FIX - Substore types "EXP" and "Playerpoints" now work properly with the menus to set them and retrieve them
FIX - Startup crashes when failing to load hikariCP
IMPROVED - Better checks for worldguard
IMPROVED - More stable checks when no claim system is installed
----------, Feb 22, 2026

Hey y'all.
This is a very small fix for some missing default messages in FREE-Plugin mode. No changes in config or anything, just a drag and drop fix.
Enjoy it! <3

Thanks a lot to Isaac for reporting this issue!
----------, Feb 21, 2026

Important: you NEED to update your jar, the plugin won't start otherwhise. I am looking for a more elegant fix but for now, I shaded the needed hikaricp libs into the plugin itself
----------, Feb 21, 2026

Resource Information
Author:
----------
Total Downloads: 87
First Release: Feb 21, 2026
Last Update: Yesterday at 4:51 PM
Category: ---------------
All-Time Rating:
2 ratings
Version -----
Released: --------------------
Downloads: ------
Version Rating:
----------------------
-- ratings