
New Features
- Bedrock Inventory Support: Added full Bedrock inventory support via Geyser/Floodgate integration. Includes Bedrock-specific actions, buttons, input builders (with placeholders support and legacy color code conversion), drag button, inventory replacement, dialog support, and Bedrock player validation.
- Inventory Replacement: Implemented inventory replacement functionality, allowing inventories to be dynamically replaced across various classes.
- ItemStack Build Context: Added
ItemStacksupport to build context and updated durability handling in menu item stack. - PaperProfileComponent: Added new
PaperProfileComponentfor Paper-specific profile handling.
Bug Fixes
- Clear Inventory + BACK Button: Fixed items being restored to the player when clicking a BACK button between two inventories with
clear-inventory: trueandclear-inventory-type: PACKET_EVENT. Items are now physically cleared from the player inventory during storage, ensuring container content packets don't reveal hidden items. The close handler also uses physical restoration (giveInventory) instead of packet-based restoration. - Item Pickup with Clear Inventory: Fixed items being picked up by the player when
clear-inventoryis enabled. - Lore Metadata Duplication: Fixed "lore" metadata duplication when loading items.
- Color Handling: Fixed and simplified color handling for leather armor and banner patterns in
MenuItemStackLoader. - NPE Fix: Fixed null pointer exception.
- Import Fix: Fixed import for
ZBuildContextinItemEditAction. - API Errors: Fixed errors and updated API version.
Improvements
- Requirement Configuration Validation: Added validation for
click-requirement,view-requirement, andopen-requirementconfigurations. Detects common misconfiguration where users place requirement keys directly under the requirement section instead of using named groups (for click-requirement) or arequirementslist (for view/open-requirement). Displays a clear warning message with an example of the correct structure and a link to the documentation. - Inventory Lookup Optimization: Optimized inventory lookup with a map cache for better performance.
- CraftEngine Compatibility: Updated compatibility with the latest version of CraftEngine.
- Color Parsing: Added color parsing support.
Changes
- Time Placeholders: Changed
time_unix_timestamp,time_next_day_unix_timestamp, andtime_today_start_unix_timestampplaceholders to return values in seconds instead of milliseconds.
Internal Changes
- Standardized method parameter annotations to use
@NonNullacross action and button classes. - Standardized
thiskeyword usage in method return statements for clarity. - Streamlined item stack creation by consolidating special item stack application.
- Enhanced click handling in
Buttonclass and simplified click requirement configuration. - Updated Nexo dependency version.
- Updated Gradle repositories URL for Floodgate.
- Removed unused library files (
FirstCore.jar,zEssentials.jar,zMenu-1.1.0.0.jar). - Removed debug messages.
New Features
- Pagination Management System: Introduced
PaginationManagerwithPaginationButton,PaginationNextButton, andPaginationPreviousButtonclasses, allowing a single button to handle pagination. Includes max page tracking and optimized page size handling. - Pagination Placeholders: Added pagination-related placeholders to
MenuPlaceholdersfor enhanced inventory navigation. - Reset Pagination Action: New
ResetPaginationActionand loader to reset pagination state for button paginations. - Skip Close Actions on Inventory Switch: Added
skip-close-actions-on-switchconfiguration option to prevent close actions from firing when switching between inventories, fixing issues with back/inventory actions triggering on close. - PacketManager Interface: Introduced
PacketManagerAPI interface and refactored title name handling in packet events for cleaner architecture. - ClickAction Enum: Added
ClickActionenum to streamline action handling inInventoryLoader.
Bug Fixes
- Fixed
CustomModelDataComponentdata handling (removed Optional) and added Paper-specific implementation (PaperCustomModelDataComponent) for proper Paper compatibility. - Fixed head cache issue in
ZMenuItemStack. - Fixed unnecessary
toLowerCaseconversion on dialog names inCommandDialogOpen. - Fixed item button click handling by removing redundant null check for clickable buttons.
Internal Changes
- Added javadocs.
- API fixes.
- Removed unused class.
- Pagination Management System: Introduced
Bug Fixes
- Fixed
openWithOldInventoriesmethod crash on 1.20 by usingCompatibilityUtil.getTopInventory()for safe inventory access. - Fixed trim pattern and material validation: now uses Bukkit
Registryinstead of the hardcodedTrimHelper, with proper error messages listing all available patterns/materials when a key is not found. - Fixed null
ItemFlagentries causing errors when applying flags to item meta. - Fixed
EnchantmentGlintOverrideComponentnot handlingfalsevalues correctly — previously onlytruewas applied, now bothtrueandfalseare respected. - Fixed click requirements defaulting to an empty click list when none are specified — now defaults to all click types.
- Fixed
AttributeWrapperto support an optionalNamespacedKeyinstead of always generating a random UUID, preventing attribute duplication on item rebuild. - Fixed database connection logger initialization order in
ZStorageManager. - Fixed item loading from map (
loadItemStack) to useMenuItemStackLoaderinstead of the removedMenuItemStackFormMapclass.
Improvements
- Command Permissions: Added dedicated permissions for
CommandMenuEditor(ZMENU_EDITOR),CommandMenuVersion(ZMENU_VERSION), andCommandMenuGiveOpenItem(ZMENU_GIVE_OPEN_ITEM). - API: Added
getClickRequirementKeys()method toMenuPlugininterface, allowing addons to retrieve the supported click requirement configuration keys. - Default Configs: Updated default configuration files (
pro_inventory.yml,playtime_reward.yml) to use kebab-case (view-requirement,click-requirement,open-requirement) matching current conventions. - Dependencies: Added
adventure-text-minimessageas a library dependency inplugin.yml.
Internal Changes
- Removed unused
PlayerSkinclass. - Removed unused
MenuItemStackFormMapclass and associatedfromMapstatic method. - Cleaned up imports and formatting across multiple files.
- Fixed
New Features
- MMOItems Support: Added material loader for MMOItems plugin integration.
- Enchantments Component: Added enchantments component support for item configuration.
Performance
- Performance improvement for items that will use a player's nickname to be displayed (player-head optimization).
Bug Fixes
- Fixed enchant key parsing in configuration.
- Fixed enchantments component initialization.
- Fixed title parsing before sending to player in
PlayerTitleAnimation. - Fixed dynamic material check in menu item stack caching logic.
- Fixed
%player%as a valid player argument in validators. - Fixed error handling and formatting in various loaders and actions.
- Fixed basehead itemstack rendering.
- Fixed French translations in message strings.
- Fixed wrong format issues.
- Fixed null checks for player in packet listeners.
- Fixed
[]display when placeholder returns an empty list. - Fixed null message handling in
getLegacyMessagemethod.
Internal Changes
- Refactored placeholder package structure and usage.
- Renamed
SpigotDyeColorItemComponentLoadertoSpigotDyedColorItemComponentLoader. - Changed item model type from
StringtoNamespacedKeyin MenuItemStack classes. - Updated
@Contractannotations inBaseInventory.javafor clarity. - Removed unnecessary whitespace in
ComponentMeta.java. - Removed debug messages.
New Features
- Performance Debug System: Added per-operation performance monitoring for inventory opening. Measures execution time for each step (permission checks, button building, item rendering, etc.) and logs results to console. Configurable via
enable-performance-debug, with threshold filtering and whitelist/blacklist support for operation names.
Performance
- ItemStack Build Optimization: Optimized
ZMenuItemStack.build()to reduce redundant work on each inventory open:- Eliminated duplicate PlaceholderAPI resolution for material strings (was called twice per build)
- Pre-resolve
Materialat load time when no placeholders are present, skipping PAPI parsing at runtime - Replaced exception-based control flow for numeric material IDs with a simple numeric check
- Pre-compute
NamespacedKeyfortooltipStyle,itemModel, andequippedModelin setters instead of splitting/creating on every build - Cache the glowing enchantment lookup instead of querying the enchantment registry on every build
- Pre-split lore lines containing
\nat load time instead of splitting on every build - Added early exit in
Placeholders.parse()when the string contains no%character, avoiding unnecessary iteration over all placeholder entries
Internal Changes
- MiniMessage Color Parsing Refactor: Consolidated color parsing methods into
MiniMessageColorUtilsclass for better maintainability and code reuse. - Added unit tests to verify preservation of MiniMessage color tags.
Bug Fixes
- Fixed hex color parsing regex to correctly handle edge cases.
- Fixed typo in
PlayerCommandLoaderconstructor parameter list.
- Performance Debug System: Added per-operation performance monitoring for inventory opening. Measures execution time for each step (permission checks, button building, item rendering, etc.) and logs results to console. Configurable via
New Features
- Dynamic Inventory Title Updates: Added
PacketEventChangeTitleNameandPacketTitleListenerfor changing inventory titles dynamically without reopening the inventory. Requires PacketEvents. - ClearInvType for Inventory Management: Introduced
ClearInvTypeenum and temporary inventory storage system for better inventory state management. - Per-Inventory Click Limiter: The click limiter now only applies to zMenu inventories and can be configured per inventory with
click-limiter-enabled: true/false. It no longer interferes with non-zMenu inventories. - Enhanced ItemButton Context:
ItemButtonnow includes inventory context for improved button logic and interactions.
Bug Fixes
- Fixed parsing of map structures inside arrays in YAML configuration. #219
- Fixed click limiter applying to all inventories instead of only zMenu inventories. #219
- Fixed inventory restoration on plugin disable. #215
- Fixed PacketEvents warning on plugin disable. #215
- Resolved scheduler compatibility issue with Folia.
- Fixed task registration during plugin shutdown.
- Enhanced variant component initialization with proper error handling and version checks.
- Dynamic Inventory Title Updates: Added
New Features
- New Item Component System (1.20.5+) - Complete overhaul with 30+ components (Enchantments, Lore, Trim, Tool, PotionContents, WrittenBook, AttributeModifiers, etc.). Improved error handling and case sensitivity.
- Animated Inventory Titles - Requires PacketEvents.
- Local Placeholders -
local-placeholderssection in inventory/pattern configs, cached with Guava for better performance. - Actions Pattern System - Define default actions for all buttons in
actions_patterns/directory. - New Actions:
message-to(send to specific player),open-actionsandclose-actionsfor inventories. - Console Commands - Commands can now be executed from console (
console: true). - LuckPerms - Permission expiration support with time unit configuration.
- MiniMessage support in toasts.
- Multi-line inventory names (useful with zTextGenerator).
- Resin trim material support.
Bug Fixes
- Fixed Avast false positive on VirusTotal.
- Fixed async access block and container component issues.
- Fixed PacketAnimationListener task execution when plugin is disabled.
- Fixed button reference in updatedButtons iteration.
- Various minor fixes.
Internal Changes
- Removed
getCustomItemStack(Player player)method. UsegetCustomItemStack(Player player, Placeholders placeholders)instead. - Renamed package
zcore→common. - Moved Component classes to API module.
- Added nullability annotations and new interfaces (
BuildContext,MenuItemStackContext). - Improved JavaDoc documentation.
Fixed the removal of default attributes. Improved attribute configuration, you now have more comprehensive options. More information available here. Added more configuration options for patterns. Added Brewery support to create your items. Added an option to run actions as an administrator. Added support for Oraxen fonts. Fixed the loading of certain plugins. Added a system to apply actions to items.
- Improved and optimized internal code. These consist of micro-optimizations that will only be noticeable on servers with several hundred players.
- Added an option to disable toasts.
- Fixed antivirus-related flag issues.
- Fixed default attributes applied to items.
- Added support for MythicMobs.
- Added a placeholder for global placeholders.
Update to Sarah 1.20. Added MARIADB support Fixed NONE database settings Improve pattern file loading
Added dialogs inventories /zm dialog #186 by 1robie and saildrag Added %player% placeholder for each action Added a view requirement system with the ability to define an else for another pattern Added option to disable inventory loading: enable: false Added reason for withdraw and deposit action Fixed withdraw and deposit action with zEssentials Improve update checker #183 Fix openInventoryWithOldInventories method Fixed inventory button drop on death when clear inv is active Fixed item giving on disconnect when clear inv is active Fixed textures of offline players’ heads Optimized Enum NmsVersion → no more repeated calls to getVersion (unnecessary since the version doesn’t change at startup) Fixed commands not displaying the "No permission" message during setup New command: /zm contributors New command: /zm addons New command: /zm dumplog Update to Sarah 1.19
Added toast action
Added more API methods
Added equipped model, for custom armor
Fixed error if button is not found
Fixed luckperm action
Fixed discord parsing
Fixed inventory reloading issues #173
Updated source code to java 21 #166
Updated to last CurrenciesAPI version
Some fixs #170Added player target with inventory name #169 Added player data convert with /zm player convert, convert old JSON data to SQL Update to last CurrenciesAPI version Use EntityScheduler instead of RegionScheduler #168 Fix items attributes
Codebase structure overhaul: the project now uses Gradle. This major change has enabled numerous modifications and improvements to the API. The API is now cleaner, more efficient, and easier to use. You will need to update all your plugins that use zMenu at the same time to avoid compatibility issues. Upgraded to Java 21, and the minimum supported Minecraft version is now 1.19. Since very few servers using zMenu were still on older versions, we decided to drop support for legacy Minecraft versions. This simplifies the codebase and opens the door to many new enhancements. Added a config.yml file. You can now delete the old config.json file. New configuration options are also available. Integrated database support. This allows logging of opened inventories by players and enables cleaner data storage compared to JSON files. Added /zm players removeall
command, which removes a specific key from all players. Added support for mathematical expressions in placeholder requirements and player data actions. To enable math operations, set math: true. See cookie.yml for examples on how to use math expressions. Added %zmenu_math_ % placeholder to perform math operations via a placeholder. Added %zmenu_formatted_math_ % placeholder to perform math operations and return a formatted value. Introduced a validation system for command arguments. This lets you define the expected argument type to ensure correct values are used in your commands. Added tooltip-style: Added action discord, Send a classic webhook discord. Added action discord component, Send a webhook discord with the new component system #132. Added requirements for broadcast action. Added a new way to load messages action. Fixed enchant loader. Fixed magiccosmetics loader. Fixed MenuItemStack when loaded by an ItemStack. Fixed MenuItemStack attributes. Change broadcast action placeholder for %receiver% and %sender% Disabling the /zm download command by default, you must enable it in the configuration if you want to use it.
Fixed placeholders in actions Fixed commands with arguments Fixed minimessage #124 Added RoyaleEconomy support
Added dependency management for inventory loading. If an inventory needs to be loaded but one of its dependencies is not yet loaded, it will be put on hold until all dependencies are loaded. This allows you to use any element from any other plugin in any zMenu inventory. Added teleport action. Added default value for commands. This allows having optional arguments with a default value. Added API method : InventoryManager#loadYamlConfiguration(File file), load a YAML file using the file’s placeholders global-placeholders.yml. This allows you to reduce the size of your configurations by avoiding the repetition of certain values. Added API method : ZPermissibleLoader#loadPermissible(ButtonManager buttonManager, TypedMapAccessor accessor, String key, String path, File file), Allows you to load a list of permissible. Added API method : ButtonManager#loadPermissible(YamlConfiguration configuration, String path, File file), allows you to load a list of permissible list from a configuration. Added API method : ButtonManager#loadActions(YamlConfiguration configuration, String path, File file), allows you to load a list of action list from a configuration. Added conditional-name, allows you to change the name of the inventory based on conditions. (available with zMenu+). Added MagicCosmestics material loader. Added the ability to include \n in actions. This allows you to send a list of commands in an inventory argument and more ! Added lore-type, allows you to define how the lore should interact with the itemstack. If you are using a material loader, you can specify that the lore is added at the end of the existing lore, added before the existing lore, or replaces the existing lore. Added and and or permissible. Allows you to create more complex requirements. (available with zMenu+). Fixed ConcurrentModificationException that could occur when using PlayerData #104. Fixed material's loaders. Fixed commands and messages placeholders. Fixed buttons with multiple slots that could not be on another page. You can now define a list of slots and a page for your buttons. Fixed next and back button with old inventories Rework messages.yml, you need to redo your configuration. You can use trims in 1.20. Updated miniumRequirement to minimum-requirement for requirements. Updated maxPage to max-page for inventory name. Register command permissions in Spigot. This prevents the command from appearing in the player's tab completion if they do not have permission.
Added Global Placeholders, which allows you to define values that will be available across all inventory configuration files. Fixed custom heads with URLs Fixed inventories that do not have a default type Added sound category Removed deprecated method onInventoryOpen(Player player, InventoryDefault inventory) Improved code, removed the slot variable to use only the list of slots for each button Fixed actions withdraw, deposit and requirement money, now allowing lowercase Added API code for use of slots in player inventory. Coming soon in zMenu+ ! Updated folia API All configuration keys are now in kebab case. Old configurations will still work but the documentation has been updated to reflect the new format. Improved pagination performance by avoiding unnecessary list management operations
Added inventory type #97 Added placeholder priority #96 Added the possibility to include a prefix for lists when using a pattern. You need to add text in front of your placeholder Modified the money permissible to support more economies using CurrenciesAPI Modified the deposit and withdraw action to support more economies using CurrenciesAPI Added deny-message for commands. Allows to send a custom error message if the player does not have permission. Fixed the max page placeholder that says 0, it will now say 1 by default
Added the ability to use font ItemsAdder with format :font-name: Improve TypedMapAccessor Added API method InventoryManager#openInventoryWithOldInventories Added API method ZButton#paginate Added action set permission, allows setting a permission to a player with luckperms Added aliases command and commands for console command action. Fixed max-stack-size for itemstack with 1.21

