EmakiLevel | Parallel Progression Lines
1.6.0Thirteen independent level lines with configurable sources, curves, multipliers, caps and anti-abuse.
1.6.0latestEmaki Level 1.6.0Aug 31, 2026 Added
- Ten additional level disciplines, new gameplay experience-source definitions, configurable upgrade requirements, and placed-block tracking.Changed
- Experience-source item conditions now use CoreLib matchers, with structured operation results and explicit player owner-thread boundaries.Breaking Changes
- Migrateresult_item_sourcestorules[].matcherand replaceLevelCostTransactionintegrations with the current operations API.Upgrade Notes
- Back up the plugin directory and stage-test custom sources, requirements, new disciplines, placed-block handling, attribution, multipliers, daily caps, and third-party operations.1.5.0Emaki Level 1.5.0Aug 11, 2026 Added
-extensions().registerExpSource(Plugin, ExpSourceProvider), so a third-party plugin can grant exp of its own by returningExpSourceGrantat these gameplay triggers:entity_kill,mythic_mob_kill,block_place,block_break,crop_harvest,craft_item,furnace_extract,player_fish,entity_tameandbrew_complete. Providers are keyed by owner and provider id, dropped automatically when the owner is disabled, and the returnedExpSourceRegistrationhandle can be closed more than once. - CancellablePlayerPreLevelUpEvent, fired after every check passes and before charging or writing begins. Cancelling prevents the level-up with nothing charged, no level change, no rewards and no actions, and the runtime reportsevent_cancelled. It is the only supported way to veto an upgrade. It fires only for an online, thread-owned player and not when an earlier check already failed, so treat a missing event as "no committed upgrade to veto" and listen toPlayerLevelUpEventto confirm a completed upgrade. - Leaderboard queriescatalog().top(typeId, limit)andcatalog().topCount(typeId), exp adjustment previewcatalog().previewAdjustment(), andoperations().syncPlayer(),operations().openGui()andoperations().openTopGui(). - Config precheck lines are coloured by severity: red for fatal and error, yellow for warning, the original grey for info.Changed
- Actions use a new syntax, and most of it is rewritten for you. On first startup CoreLib rewrites the config files of every Emaki plugin underplugins/, once only. Each edited file keeps the original beside it with a.legacy-backupsuffix. A line that cannot be converted leaves your config untouched and goes into a separate.v2-failedfile, with the file and line listed in the console. Common actions such assendmessageintypes/*.ymland@chance=5 sendactionbarinsources/*.ymlare covered. - Level's own eight actions need renaming by hand; automatic rewriting does not cover them, and the rewriter does not even recognise the old names, so they stay in your config untouched and the console reports an unknown line on load: -emakileveladdexp→level_add_exp-emakilevelsetexp→level_set_exp-emakilevelremoveexp→level_remove_exp-emakileveladdlevel→level_add_level-emakilevelsetlevel→level_set_level-emakilevelremovelevel→level_remove_level-emakilevelreset→level_reset-emakilevellevelup→level_up- Thetarget=playerNameargument on those eight actions is replaced by a source segment in front of the action:emakileveladdexp type=main amount=10 target=Stevebecomesplayer_by_name Steve | level_add_exp type=main amount=10. With no source segment the action applies to the player who triggered it, as leavingtargetempty used to. -auto_upgradeandsilentare only accepted bylevel_add_exp. On any other level action they are treated as an unknown argument. - Placeholders reading level data inside action lines need avar.prefix. This only concerns you if you have edited your level types or exp sources: the bundledtypes/andsources/files already use the new form. If your own config writes%old_level%,%new_level%,%amount%or%failure_reason%underactions.success,actions.failureoractions.gain, change them to%var.old_level%,%var.new_level%,%var.amount%and%var.failure_reason%, or messages will show%new_level%instead of the number. The full list available in action lines istype,type_display_name,level,old_level,new_level,exp,old_exp,new_exp,total_exp,required_exp,progress,progress_percent,amount,reasonandfailure_reason. - Placeholders in formulas are unchanged and must stay bare. Only action lines, the ones underactions:, take the prefix.%result_amount%and%mythic_level%inexp_formula, and%level%in theattributesformulas, go through a separate arithmetic path; prefixing them stops them evaluating. PlaceholderAPI%emakilevel_...%placeholders are unaffected. - For developers:EmakiLevelApiProvideris removed; call the static methods onEmakiLevelApidirectly. The static methods that used to sit on the facade (available(),type(),types(),getPlayerData(),getLevel(),getExp(),getTotalExp(),getRequiredExp(),addExp()/removeExp()/setExp(),addLevel()/removeLevel()/setLevel(),levelUp()and the matching*Async()variants) are replaced bystatus(),catalog(),operations()andextensions().available()becomesstatus(), returningApiStatuswithusable(),ready()and the version and plugin-name fields, whereready()means the data is loaded rather than the components exist. Apart fromcatalog().types()andcatalog().type(), these methods returnEmakiResult<T>and report unavailability instead of throwing.EmakiLevelApi.Bridgeis now@ApiStatus.NonExtendable. - For developers: a cancelledPlayerExpGainEventnow reportsevent_cancelledinstead ofinvalid_amount. The event classes document their threading: all are synchronous, fire only while the runtime owns the player, and listeners must return quickly without blocking on other threads.Fixed
- The daily exp cap being charged even when another plugin blocked the gain, on servers running a plugin that listens to level events. The gain was counted towards the daily total before other plugins were notified, so a cancelled or reduced gain had already been counted and players saw their allowance shrink without receiving exp. Counting now happens after the other plugins have had their say, using only the amount that lands. - Compensation records being lost as a batch when a level-up went wrong midway. One corrupt pending record made the plugin abandon the whole batch, leaving every waiting player without a refund. A corrupt record is now moved aside intodata/operation-journal/quarantine/and the rest recover as usual, with the pending operations listed in the console. - Writing that pending record stalling players and breaking the level-up. The write happened on the player's own thread, so a slow disk slowed level-ups and a failed write aborted the level-up. It now happens in the background, and a failed write only logs and leaves the record for the next recovery pass. - Some players' level data not refreshing after/emakilevel reload, on Folia servers. The rewrite ran entirely on the command thread, so players not owned by that thread were skipped with an error. They are now handed back to their own thread.Removed
- JS experience rules and level-up hooks, with no automatic conversion. Scripts adjusting exp throughlevel.registerExpRuleor hooking level-ups throughlevel.onLevelUpno longer run. Usemultipliersinconfig.ymlfor rates andactions.successon the level type for level-up effects. The bundledscripts/examples/level_exp_rule.jsandscripts/examples/level_status.jssamples are gone as well. - Seven config options that never did anything:storage.type,storage.save_on_quit,storage.save_on_shutdown,pdc.sync_on_join,pdc.sync_on_exp_change,pdc.sync_on_level_changeandpdc.sync_on_reload. They sat in the config file but were never read, so no value ever had an effect. Delete them from your own config whenever you like.pdc.enabledandpdc.namespaceare unchanged.Notes
- Update EmakiCoreLib to4.7.0first. - Back up your wholeplugins/EmakiLevel/folder before upgrading. - Three things need doing by hand: renaming the eight level actions, replacingtargetwith aplayer_by_namesource segment, and droppingauto_upgradeandsilentfrom anything other thanlevel_add_exp. Everything else in the action syntax is rewritten for you. If you have edited your level types or exp sources, also check that the placeholders in your action lines carry thevar.prefix; the ones in formulas stay as the1.4.0Emaki Level 1.4.0Jul 27, 2026 Added
- Asynchronous mutation entry points for exp and level changes in the public API, each returning a future with an operation result and reporting unavailability cleanly when the API is not installed. - Transactional level-up cost charging: if currency or material deduction partially fails, the already-deducted part is rolled back, with a dedicated failure reason for compensation failure. - Player data readiness protection: a new failure reason and message reject writes while data is loading or read-only, instead of writing corrupt data. - New placeholders exposed through the CoreLib placeholder system:level,exp,total/totalexp/total_exp,required/requiredexp/required_exp,progress,progresspercent/progress_percent. - Config precheck messages at file and directory level: missing required file, path not a file, unreadable file, missing required directory, path not a directory, unreadable directory.Changed
- Descriptor migrated topaper-plugin.ymlwith structured dependencies (EmakiCoreLib required; MythicMobs / EmakiAttribute / EmakiCooking / EmakiForge / PlaceholderAPI optional). Permission keys and defaults are unchanged;/emakilevel(aliaseselv,elevel) registers in code with aliases preserved. - Default GUI files (gui/level_gui.yml,gui/top_gui.yml) use the nesteditem.source+item.componentsform. Slot layout and all placeholders are unchanged and the old form is still parsed. - Leaderboard rebuilds are now asynchronous, so player join/quit no longer triggers a full main-thread table scan. - Player data loading moved to a generation-aware asynchronous session model. - Message prefix switched to a new brand gradient. -api-versionraised from1.21to1.21.8and the build base moved from spigot-api to paper-api;folia-supported: trueand the Java 25 target are unchanged.Fixed
- Level-up cost charging could consume resources without granting the level: currency and material deductions were applied without checking their results and without rollback, so a player could lose currency when materials were insufficient, or the reverse. Charging is now transactional with rollback.Removed
- PlaceholderAPI placeholder resolution is now cache-only. An uncached player's placeholder previously loaded synchronously and returned a value; it now returns an empty string. Online players are cached on join, but any display that relies on placeholders for offline or not-yet-cached players must be re-checked. - The browser-based Web Console layer, includingweb-console.yml, the config and CSS web extensions, and theweb-console/frontend project with its level curve preview. - The internal level curve preview service is removed with it. It only served that browser preview and had no config key or command, so there is no equivalent owner-facing loss; curves are still driven by level type configuration.Notes
- Requires EmakiCoreLib 4.6.0. -config.ymlhas no key additions or removals, so existing config works as-is, and the player level data file structure is unchanged, so no migration is required. After upgrading, re-check any placeholder-driven display, especially for offline players, and confirm you have a replacement for anything previously done through the Web Console.1.3.0Emaki Level 1.3.0Jul 14, 2026 Added
- Level exp sources now use CoreLib's shared gameplay-event channel. - Native CoreLib Level placeholders for other plugin condition expressions. - Improved Level action-chain integration. - Manifest v2 Web Console integration. - Command suggestions after/emakilevelor/elv.Improved
- Reduced duplicated source listener logic through a unified subscriber. - Improved level messages and Web curve preview styling. - Aligned with the Paper API /paper-plugin.yml1.21.8+ baseline.Notes
- Update with the matching CoreLib release. - Breaking: Action aliases were removed; use canonical action IDs. - If other plugins use Level placeholders, ensure EmakiLevel is enabled and the referenced level type exists.1.2.0Emaki Level 1.2.0Jun 29, 2026 Added
- Experience multipliers (global / per type / per source), defaulting to 1.0. - Per-type daily experience caps (unlimited by default; in-memory, reset on restart). - Public Bukkit events:PlayerExpGainEvent,PlayerLevelUpEvent,PlayerLevelChangeEvent,PlayerMaxLevelReachedEvent. - Completed publicEmakiLevelApi. - JavaScript extensions for experience rules and level-up hooks viaemaki.module("level"). - Config precheck on startup and reload.Fixed
- Fixed level panel and ranking GUI titles showing raw page placeholders on first open.Improved
- Better default level types, sources, grouping, and language content.Notes
- Multipliers and daily caps default to no change; enable as needed. - Daily cap counters are in-memory only and reset on restart.1.1.0Emaki Level 1.1.0Jun 16, 2026 Added
- Level panel and ranking views. - Web Console level curve previews. - Clearer default level types, experience sources, and group resources.Fixed
- Fixed unclear default requirement group naming. - Fixed unclear experience source, anti-abuse, and progression rule wording. - Fixed unclear cross-plugin growth source descriptions.Refactored
- Default level type and experience source resources. - Requirement group naming. - Curve and ranking preview data.Improved
- Better experience source configuration and type definitions. - Better level panel, ranking display, and default language content. - Better Web Console level editing with curve previews.Notes
- Review custom level types, sources, requirement groups, and curves after updating. - Back up level-related data before production updates.1.0.0EmakiLevel 1.0.0Jun 5, 2026
Similar projects
Config →VeinMiner
Mine the whole vein on mining a single ore/block. Make the tedious mining experience to something satisfying and fun! FTB Ultimine alternative
99.3MSueta
Simple Voice Chat
A working voice chat in Minecraft!
76.8MSueta
Chunky
Pre-generates chunks, quickly and efficiently
18.4MSueta
VeinMiner Enchantment
Veinminer Addon - Adds vineminer enchantment to enchanting tables. Only tools with the enchantment can veinmine
18MSueta
JourneyMap
Real-time map used for mapping in-game or your browser as you explore.
14.7MSueta
WorldEdit
A Minecraft Map Editor... that runs in-game! With selections, schematics, copy and paste, brushes, and scripting. Use it in creative, or use it temporarily in survival.
11.6MSueta