
EzFlyTime
Sell flight time with customizable vouchers, and make flying players look awesome with highly configurable particles. Also includes configurable bossbar for countdown and has PlaceholderAPI support.
Changed
- Split unlimited-flight disabled message - Show a different message when a player disables flight while they have unlimited flight. Added the
flight-disabled-unlimitedmessage key and updated the command and teams subcommand to use it when appropriate.
- Split unlimited-flight disabled message - Show a different message when a player disables flight while they have unlimited flight. Added the
Changed
- TeamsAPI dependency bumped 1.8.0 → 2.0.0 - the 2.0.0 release adds
TeamRelation.MEMBERand adjusts the default colours ofALLYandTRUCE. EzFlyTime does not useTeamRelation, so no code changes were required.
Added
- TeamsAPI integration smoke tests - 112 parameterized tests across all
compatible server software (Paper, Spigot, Purpur, Folia) and Minecraft
versions (1.16.5 – 1.21.5) guard against regressions of the
NoClassDefFoundErrorcrash fixed in 3.0.1.
Fixed
-
Spurious
particle-shop-gui.ymlsave warning -StartupBootstrapcalledsaveResource("particle-shop-gui.yml", false)unconditionally on every startup, producingCould not save … because … already existsafter the first run. The call was redundant:ParticleShopGUIalready guards the samesaveResourcebehind an existence check, so theStartupBootstrapcall has been removed. -
TeamsAPI soft-dependency crash -
NoClassDefFoundError: com/skyblockexp/teamsapi/api/TeamsSubcommandwas thrown on startup whenever TeamsAPI was absent. Bukkit's class loader eagerly loads field-type classes in the same jar, soFlySubcommand(and transitively itsTeamsSubcommandinterface) was resolved the momentTeamsIntegrationwas instantiated, before any availability guard ran. TheflySubcommandfield is now typed asObject; all TeamsAPI references remain in method bodies and are resolved lazily at execution time.
- TeamsAPI dependency bumped 1.8.0 → 2.0.0 - the 2.0.0 release adds
Fixed
- TeamsAPI soft-dependency crash -
NoClassDefFoundError: com/skyblockexp/teamsapi/api/TeamsSubcommandwas thrown on startup whenever TeamsAPI was absent. Bukkit's class loader eagerly loads field-type classes in the same jar, soFlySubcommand(and transitively itsTeamsSubcommandinterface) was resolved the momentTeamsIntegrationwas instantiated — before any availability guard ran. TheflySubcommandfield is now typed asObject; all TeamsAPI references remain in method bodies and are resolved lazily at execution time.
Added
{time}placeholder inflight-disabledmessage - the remaining flight time is now substituted intoflight-disabledmessages (e.g.&cFlight disabled. Remaining time: {time}.). Updated all 8 bundled locales (en, nl, de, fr, es, ru, tr, zh) to include the placeholder by default.
- TeamsAPI soft-dependency crash -
This release is a major overhaul of EzFlyTime. Nearly every system has been rewritten or significantly extended. Existing
config.ymland message files will need to be updated - delete them and let the plugin regenerate defaults, then re-apply your customisations.Added
- TeamsAPI integration (optional soft dependency) - integrates with
TeamsAPI when the plugin is present:
- Registers a
/f flysubcommand in the team plugin's command tree so players can toggle EzFlyTime flight from within their team commands. - New
teams.claimed-chunks-onlyconfig option (defaultfalse): when enabled, EzFlyTime-managed flight is restricted to the player's own team-claimed chunks. Entering an unclaimed or enemy chunk mid-flight automatically lands the player. - New
teams.enabledconfig toggle to disable the integration entirely. - New permission
ezflytime.teams.fly.bypass(defaultfalse): exempts a player from the claimed-chunks-only restriction. - New message keys:
teams-no-fly-unclaimed,teams-fly-zone-left,teams-not-in-team(all 8 locales).
- Registers a
- Timed flight system - players now have a flight-time balance instead of unlimited flight. The remaining time counts down live and is shown in a boss bar above the screen.
- Physical flight vouchers - voucher items are backed by Persistent Data Container (PDC) metadata and carry a unique identifier, making each item traceable and preventing duplication exploits.
- In-game voucher shop GUI - players open the shop with
/flytimeand purchase vouchers directly using Vault economy currency. The GUI is fully configurable invoucher-gui.yml(title, slots, items, sounds, prices). - Configurable commands on voucher buy / use - add
on-buy-commandsandon-use-commandsto any voucher inconfig.ymlto run console or player commands automatically. Supports placeholders:{player},{voucher},{voucher_name},{duration_seconds},{amount}. - Particle trail shop - players can unlock and equip particle effects
during flight. The shop and selection GUI are configured in
particle-shop-gui.ymlandparticles.yml. - Auto-flight reward system - grant flight time automatically on a timer. Rewards can be flat, permission-based (rank groups), or tied to mcMMO skill level thresholds.
- Fuel display mode - optionally show remaining flight as a percentage
fuel bar instead of a time value (
display.flytime-mode: fuel). - MySQL storage backend - store flight-time data in a MySQL database for multi-server / BungeeCord setups alongside the default YAML backend.
- PlaceholderAPI expansion - use
%ezflytime_time%,%ezflytime_seconds%,%ezflytime_minutes%, and%ezflytime_fuel%in any PlaceholderAPI-compatible plugin. - Multilingual messages - built-in translations for English, Dutch, Spanish,
French, Russian, Turkish, Chinese, and German. Set
language:inconfig.ymlto switch instantly. - Tab-complete permission gating -
/flyvouchertab completions now respect permissions:giveis only suggested to players withezflytime.give, andbuyonly to players withezflytime.buy. /flytime topleaderboard command (permissionezflytime.top, default: true).- Per-session flight cap - limit how long a single uninterrupted flight
session can last (
max-single-flight-seconds). A per-player bypass permission is available. - Flight preservation across death - optionally keep or clear a player's
remaining flight time when they die (
preserve-on-death). - Creative / Spectator bypass - players in Creative or Spectator mode can be configured to fly freely without consuming time.
- SpigotMC update checker - notifies online operators/admins when a new version is available. Configurable and can be disabled entirely.
- bStats metrics - anonymous usage statistics to help guide future development (opt-out supported via bStats global config).
- GitHub Pages documentation at https://ez-plugins.github.io/EzFlyTime/.
Changed
/flytimewith no arguments now opens the voucher shop GUI for all players who have theezflytime.buypermission (default: true). Previously only server operators saw the shop; regular players received only a "remaining time" message.ezflytime.buyis now declared inplugin.ymlwithdefault: true, making the shop accessible to all players out of the box. Restrict it via your permission manager if needed./flyand/flytimeno longer operate independently of each other - both draw from and update the same flight-time balance.- Admin time-management commands (
give,set,remove) no longer send a duplicate notification to the target player. The command handler sends one message;FlyTimeManageris toldnotify=false.
Fixed
- Modrinth release workflow now lists
vaultunlockedinstead ofvaultas an optional dependency; Vault has no Modrinth listing whereas VaultUnlocked is the actively maintained fork. plugin.ymlnow includes bothVaultandVaultUnlockedinsoftdependso EzFlyTime loads correctly regardless of which economy provider is installed./flyvouchertab completions are now gated on sender permissions:giveis only suggested to players withezflytime.giveandbuyonly to players withezflytime.buy.- Players without
ezflytime.buycould never open the voucher shop GUI because the permission was used in code but not registered inplugin.yml, causing it to silently default to OP-only. - Tab-complete for
/flyvouchersuggestedgiveandbuyto every sender regardless of what they were actually allowed to do. - Right-clicking a voucher during the 1-second anti-spam cooldown did not cancel the event, allowing the click to propagate to the server.
- Granting, setting, or removing flight time via admin commands sent two
notifications to the target player (one from the command, one from
FlyTimeManager).
- TeamsAPI integration (optional soft dependency) - integrates with
TeamsAPI when the plugin is present:
- Added new configuration option
preserve-on-deathin theconfig.yml. Example usage:
flight: # Preserve flight state across death/respawn. If true, players keep plugin-granted # flight after they die and respawn (defaults to true). preserve-on-death: true- Added new configuration option
- Added option to show formatted money (1k, 2m, 3b, etc.)

- Added formatting to enter price formatted in the config
- Added option to show formatted money (1k, 2m, 3b, etc.)
- Fixed issue in creative/spectator bypass still counting down the timer
- Added permission bypass for creative mode (
ezflytime.bypass.creative) - Added configurable bypass for creative mode (
flight.allow-creative-bypass: trueinconfig.yml) - Added permission bypass for spectator mode (
ezflytime.bypass.spectator) - Added configurable bypass for spectator mode (
flight.allow-spectator-bypass: trueinconfig.yml)
- Added permission bypass for creative mode (
- Fixed
/flyvoucherusage message - Fixed
/flyvoucherdefault permission to prevent require*.givepermission for opening the shop GUI. Permissions are now handled per subcommand.
- Fixed
- Added
de(German) as language (translated by FurubaFox) - Fixed issue not being able to use custom language files (outside of the default languages)
- Added
- Improved multi-language support
- Added language support and default messages for Chinese
- Added language support and default messages for Russian
- Added language support and default messages for Turkisch
- Added language support and default messages for French
- Moved messages files to the
messsages/folder inside the plugin data folder.- For this version only old messages files are backwords compatible and will load
- Added option to limit time per flight in
config.yml
flight: # Maximum seconds allowed for a single continuous flight session. # Set to 0 to disable per-session limits (default). max-single-flight-seconds: 0- Added single flight bypass permission
ezflytime.maxsingle.bypass
- Improved multi-language support
- Fixed issue in setting slot for information button
- Fixed issue in setting slot for back button
- Improved issue in
min-speedper particle configuration option - Added speed counter placeholder to bossbar

- Added
spreadoption per particle
particles: <effect-name>: spread: 0.0- Added
require-sprintingoption per particle
particles: <effect-name>: require-sprinting: false- Improved issue in
Summary
Release 2.1.0 improves particles, debug logging, reload behaviour and the voucher shop GUI. These updates target stability (bossbar/manager lifecycle), compatibility across server versions, and clearer diagnostics for server owners.
Particles
- New: comprehensive particles configuration (particles.yml templates included: low / medium / high).
- New: example images and gallery link for reference.
- Preview:

- Preview:
- Config options:
- effect: (enum) particle type
- density: integer (affects visual intensity and cost)
- interval: ticks between spawns
- radius/offset: spawn area
- cost-per-second: economy cost (if using Vault)
- Performance notes:
- Use low/medium templates for busy servers.
- Disable particle features per-world or via permissions to reduce load.
- Troubleshooting:
- If particles don't appear, verify
particles.enabled: trueand permission nodes (e.g.,ezflytime.particles.*).
- If particles don't appear, verify
Debug mode
- Expanded debug logging across voucher detection, PDC reads, material resolution, bossbar lifecycle, and reload flow.
- How to enable:
- config.yml:
debug: true - Logs will print: item types, display names, lore, PDC presence, material resolution fallback paths.
- config.yml:
- Use cases:
- Diagnose voucher mismatches (PAPER vs FEATHER vs legacy names).
- Verify bossbar creation/cleanup during reload.
- Tip: capture full server log when reproducing issues and share only relevant debug blocks.
/flytime reload- Now reloads ALL configuration files and safely recreates managers:
- Calls
dispose()on existing managers to stop tasks, unregister events and clear bossbars. - Reloads vouchers, bossbar, particles and GUI resources from disk.
- Calls
- Fixes:
- Prevents bossbar duplication on reload by clearing previous bossbars before creating new ones.
- Ensures plugin version in
plugin.ymlis filtered frompom.xmlat build time.
- Recommended workflow:
- Edit configs →
/flytime reload(or restart). - If bossbar is missing after reload: check logs for "BossBar:" debug lines, ensure
bossbar.enabled: true, and confirm player has required permission.
- Edit configs →
Voucher Shop GUI
- Detection robustness:
- Voucher matching now prefers PersistentDataContainer (PDC) but falls back to legacy display-name and lore when PDC is absent.
- Material resolution unified via
MaterialResolverto avoidLEGACY_*mismatches across server versions.
- GUI changes:
- GUI creation uses the same resolver/path as voucher parsing — eliminates inconsistencies between shop display item and stored voucher.
- Improved user-facing display names & lore templates; shop screenshot link:

- Diagnostics:
- Debug logs show: item type, meta (name/lore), expected voucher material and resolution path.
- Troubleshooting:
- If vouchers are not redeemed:
- Check debug logs for PDC keys presence.
- Confirm GUI-made items and given vouchers share material/name/custom-model-data.
- Test on a clean server to rule out external plugins stripping metadata.
- If vouchers are not redeemed:
Administrative & Misc
- Commands:
/fly— toggle flight (with fallbacks)./flytime— show remaining time or (no args) open voucher shop GUI for players withezflytime.buy./flytime reload— reloads configuration and safely recreates managers.
- Added Minecraft compatibility for 1.7 - 1.21.*
- Added improved compatibility for Bukkit / Spigot
- Added SpigotMC.org integration for checking new updates
