Changelog
Current Version Line
EmakiCoreLib:3.4.0EmakiAttribute:3.3.0EmakiForge:3.3.0EmakiStrengthen:3.4.0EmakiCooking:2.2.0EmakiGem:1.2.0EmakiSkills:1.1.0
Runtime baseline: Java 25 (GraalVM) · Spigot API 1.21.11-R0.1-SNAPSHOT
3.4.0 / 2.2.0 — Custom Block Integration & PDC Attribute API Refactor
EmakiCoreLib — Custom Block Bridge System (CustomBlockBridge)
New CustomBlockBridge interface — a shared block identification API for three custom block plugins:
| Bridge Implementation | Target Plugin |
|---|---|
CraftEngineBlockBridge | CraftEngine |
ItemsAdderBlockBridgeProvider | ItemsAdder |
NexoBlockBridgeProvider | Nexo |
Interface methods: available(), isCustomBlock(Block), identifyBlock(Block), matches(Block, String). All three are soft dependencies — when the corresponding plugin is not installed, available() returns false and nothing breaks.
EmakiCoreLib — PDC Attribute API Refactor
ReflectivePdcAttributeGateway has been refactored to PdcAttributeGateway, replacing reflection with Bukkit ServicesManager discovery of the PdcAttributeApi service instance. API methods remain unchanged: write, clear, readAll, copyPayloads, registerSource, unregisterSource.
EmakiCoreLib — Item Source Resolver Refactor
Item source resolvers have been refactored from reflection-based implementations (Reflective*) to direct plugin API calls. The CraftEngine resolver additionally listens to CraftEngineReloadEvent to automatically refresh the item table after reloads.
EmakiCooking — ItemsAdder & Nexo Custom Block Station Support
CookingBlockMatcher now supports four block source types:
| Source Type | Matching Method |
|---|---|
VANILLA | Compares Material |
CRAFTENGINE | Delegates to CraftEngineBlockBridge |
ITEMSADDER | Delegates to ItemsAdderBlockBridge |
NEXO | Delegates to NexoBlockBridge |
New CraftEngineCookingStationListener listens to CraftEngine's CustomBlockInteractEvent and CustomBlockBreakEvent. EmakiCooking's soft dependencies now include ItemsAdder and Nexo.
EmakiAttribute — weight → score Terminology Rename
AttributeBalanceRegistry internal fields renamed from weights to scores, with corresponding method renames: weightOf → scoreOf, weights → scores.
Version Changes
| Module | Old Version | New Version |
|---|---|---|
| EmakiCoreLib | 3.3.0 | 3.4.0 |
| EmakiCooking | 2.1.0 | 2.2.0 |
| EmakiStrengthen | 3.3.0 | 3.4.0 |
| EmakiSkills | 1.0.0 | 1.1.0 |
EmakiCoreLib / EmakiSkills — Random Text Config & Item Rendering Enhancement
EmakiCoreLib — Expression Engine Random Text Configuration
The expression engine now supports the random_text string configuration type, which randomly selects a specified number of text lines from a candidate list. Ideal for random affixes, random descriptions, etc.
random_bonus_lines:
type: "random_text"
rolls: 2
allow_duplicates: false
lines:
- "Physical Attack: +{phys_atk}"
- "Physical Defense: +{phys_def}"
variables:
phys_atk:
type: "range"
min: 2
max: 6rollssupports numeric configuration types (constant, range, expression, etc.), allowing draw count to scale with levelvariablessupports local variable definitions, each supporting full numeric configuration types- Candidate line list field supports four aliases:
lines,values,options,texts
Also added string configuration evaluation APIs: evaluateStringConfig and evaluateStringLinesConfig for evaluating complex text configuration objects.
EmakiCoreLib — Assembly System Lore Rendering Enhancement
The structured presentation template resolver (StructuredPresentationTemplateResolver) now uses the expression engine's string configuration evaluation for Lore lines. This means lore_sections' lines field now supports complex text configuration types like random_text, no longer limited to simple string template substitution.
EmakiCoreLib — Item Component Name Writer
Added SpigotItemComponentNameWriter for writing item names via the minecraft:custom_name component, supporting item translation keys and humanized name generation. This is an internal implementation optimization that does not affect the configuration API.
EmakiSkills — New random_text Parameter Type
The skill parameter system now supports the random_text parameter type (aliases: random_text_lines, random_lines, random_line, text_lines), allowing random text parameters in skill definitions. The drawn results are injected into MythicMobs as strings.
EmakiSkills — Expression Parameters Support Nested Variables
expression type parameters now support nested variable definitions via the variables field, where each nested variable is itself a numeric configuration object. This allows complex formulas to be broken into more readable parts:
damage:
type: "expression"
expression: "{base_damage} + {level_bonus}"
variables:
base_damage:
type: "constant"
value: 18
level_bonus:
type: "expression"
expression: "({level} - 1) * 4"EmakiSkills — Skill Level & Parameter System
Added skill level and parameter system. Skills can be upgraded, and parameters automatically scale with level.
Skill Parameters
- Skill definitions now support
skill_parametersnode withnumber,string, andbooleanparameter types - Number parameters support formula calculation (e.g.,
18 + ({level} - 1) * 4), scaling automatically with level - Parameters are auto-injected into MythicMobs on cast, referenced via
<skill.var.parameter_name> - 5 built-in variables auto-injected:
emaki_skill_id,emaki_skill_level,emaki_trigger_id,emaki_is_passive,emaki_has_target
Skill Upgrades
- Skill definitions now support
upgradenode for max level, economy costs, success rates, and material requirements - Per-level configuration for different costs, materials, success rates, and parameter overrides
- Configurable failure penalty (
noneordowngrade) - Automatic refund on charge failure
New Commands
/eskills upgrade <skill_id>— Player self-service skill upgrade/eskills level get/set/add <player> <skill> [value]— Admin level management
EmakiSkills — Passive Skill System
Added passive skill support. Passive skills are automatically triggered by game events without requiring cast mode or slot bindings.
New Features
trigger_typefield: skill definitions now supporttrigger_type: "passive"to mark passive skillspassive_triggersfield: declares which events a passive skill responds to- 22 passive triggers: attack, damage, death, kill, bow, trident, block interaction, item drop, sneak, teleport, timer, etc.
passive_trigger_settings.timer_interval_ticks: configurable timer trigger check interval- Passive skills automatically pass event targets to MythicMobs (e.g., attacked entity as
@target)
Passive Skill Example
id: attack_passive
trigger_type: "passive"
passive_triggers:
- "attack"
mythic_skill: "ExampleAttackPassive"
cooldown_ticks: 40Active vs Passive
| Aspect | Active Skill | Passive Skill |
|---|---|---|
| Trigger method | Cast mode + key press | Game events auto-trigger |
| Slot binding | Required | Not required |
| GUI display | Equippable to slots | Not shown in skill pool |
| Cooldown/resources | ✅ | ✅ |
3.3.0 Performance & Dependency Upgrade
Runtime Upgrade
Java compilation target upgraded from 21 to 25. GraalVM 25 is recommended.
EmakiCoreLib — Caffeine Cache
CacheManager replaced from hand-written LinkedHashMap + ReentrantReadWriteLock to Caffeine. The original get() held a writeLock causing all reads to serialize; Caffeine uses segmented locks for true concurrent reads.
EmakiCoreLib — Economy Bridge Migration to ExcellentEconomy
CoinsEngine has been renamed to ExcellentEconomy. The economy provider ID changed from coinsengine to excellenteconomy. API access now uses Bukkit ServicesManager lookup instead of depending on the plugin main class.
Migration Note
provider: coinsengine in config must be changed to provider: excellenteconomy. Same for provider=coinsengine in actions.
EmakiCoreLib — Expression Engine Dual-Layer Cache
Expression pre-compilation cache upgraded from single-layer ThreadLocal to L1 (ThreadLocal, 256 entries / 30min TTL) + L2 (global ConcurrentHashMap, 1024 entries) dual-layer architecture, sharing compiled results across threads.
EmakiCoreLib — Virtual Thread Support
AsyncTaskScheduler added forPluginVirtual factory method for executing async tasks via Java virtual threads. Virtual threads are only used for pure computation tasks without Bukkit API access; all world/entity operations still go through BukkitScheduler.
EmakiAttribute — PDC Hot Path Memoization
Attack cooldown, synthetic damage marker, and damage type override — three high-frequency states migrated from PDC read/write to ConcurrentHashMap in-memory cache, eliminating NBT serialization overhead per damage event.
EmakiAttribute — Damage Calculation Cache Optimization
DamageCalculationCache's internal BoundedCache replaced with Caffeine. Cache key double fields changed to long (doubleToRawLongBits), signature strings changed to long hash, significantly reducing cache lookup overhead.
EmakiCooking — Recipe Lookup Cache
CookingRecipeService added parsedSourceCache to cache parsed ItemSource objects, avoiding repeated parsing of recipe input sources on each findByInput call.
EmakiSkills — Trigger Index
PlayerSkillProfile added bindingByTrigger index, reducing trigger lookup from O(n) linear scan to O(1) hash lookup.
3.3.0 / 1.2.0 Feature Updates
EmakiAttribute — Temporary Attributes
New TemporaryAttributeService for attaching time-limited temporary attributes to players. Two modes:
ADD— Stacks on existing attribute values. Same effectId repeated calls accumulate value and refresh expirySET— Directly overrides attribute value. Later writes override earlier ones
Temporary attributes are automatically removed on expiry, and attribute snapshots refresh immediately. Expiry check interval is 250ms, handled by a dedicated daemon thread.
New temporary_attribute action for direct use in the action system:
actions:
- "temporary_attribute mode=add effect_id=buff_atk attribute=physical_attack value=50 duration=200"
- "temporary_attribute mode=set effect_id=override_def attribute=physical_defense value=100 duration=100"
- "temporary_attribute mode=remove effect_id=buff_atk"EmakiAttribute — MMOItems Bridge Improvement
MMOItems bridge changed from reflection to direct API calls, no longer depending on MMOItems internal implementation details.
EmakiSkills — Cast Mode Changed to F Key
Cast mode entry key is now fixed to F key (PlayerSwapHandItemsEvent). Previous auto and g options have been removed.
cast_mode:
entry_key: "f"
restore_last_state_on_join: true注意
If you previously configured entry_key: "auto" or entry_key: "g", it will automatically become "f" after upgrade. The F key's original swap-hand function will be intercepted by cast mode.
EmakiSkills — Trigger Validity Check
During skill pool sync, the system now additionally checks whether bound triggers are still valid (triggerRegistry.isEnabled()). If a trigger is disabled in config, the corresponding slot binding is automatically cleared.
Forge / Strengthen / Gem — Skill ID Writing
All three equipment growth modules added the skill effect type. Recipe materials, strengthen star stages, and gem definitions can declare skill IDs. After forging/strengthening/inlaying, skill IDs are automatically written to the product's PDC (via ReflectiveSkillPdcGateway).
Forge material example:
effects:
- type: skill
skills:
- "fireball"
- "ice_bolt"Strengthen star stage example:
stars:
5:
effects:
- type: skill
skills:
- "flame_burst"Gem definition example:
effects:
- type: skill
skill: "mana_shield"EmakiCoreLib — Skill PDC Gateway
New ReflectiveSkillPdcGateway for reading/writing skill ID lists in item PDC. Key is emaki_skills:item.skills.ids, value is semicolon-separated skill ID string.
Version Changes
| Module | Old Version | New Version |
|---|---|---|
| EmakiCoreLib | 3.2.0 | 3.3.0 |
| EmakiAttribute | 3.2.0 | 3.3.0 |
| EmakiForge | 3.2.0 | 3.3.0 |
| EmakiStrengthen | 3.2.0 | 3.3.0 |
| EmakiGem | 1.1.0 | 1.2.0 |
3.2.0 Update Summary
The core goal of this release is to converge the entire Emaki series onto the current structured presentation, pure Spigot runtime, and clearer configuration boundaries. The center of item rebuilding and layer rollback has shifted from "reverse-modifying the final text" to "modifying the corresponding namespace's layer state, then having CoreLib uniformly re-render the entire item".
Key Changes
EmakiCoreLib
- Structured presentation is now the sole active pipeline; the legacy presentation compiler, lore search-insert chain, and
edititemaction have been removed from the current runtime path - Vanilla item/block sources now only accept
minecraft-,mc-,v-, or bare ID formats - Added CraftEngine block bridging and unified vanilla texture resolution
- Runtime loading of Adventure, exp4j, and BoostedYaml is now unified through
plugin.yml libraries
EmakiAttribute
- The damage hot path has been split into settlement, recovery, messaging, and synthetic feedback responsibility modules
previewnow preserves the localized names of vanilla items- PDC condition files have been unified to use
conditionsas the primary format
EmakiForge
- Recipe DSL unified to root-level
forge_capacity+result.output_item - Resource editor text input changed to
/emakiforge input <content|cancel> - Invalid
condition_typevalues are now rejected at load time
EmakiStrengthen
- Default recipes and presentations fully migrated to top-level
structured_presentation - Strengthening material consumption unified to GUI-only rules
- Added
/emakistrengthen clearstateand configurable local/server-wide broadcast thresholds
EmakiGem
- GUI entry unified to
/emakigem gui [inlay|extract|open|upgrade] - Default gems and socket openers changed to
item_sourcedriven givesubcommand has been removed- Fixed failure actions and upgrade-close refund regression
Upgrade Recommendations
- Back up custom configurations, language files, and default resource copies before upgrading, especially Strengthen / Forge / Gem presentation and GUI-related YAML files
- Migrate all custom vanilla item/block sources to
minecraft-xxx,mc-xxx,v-xxx, or bare ID format; the legacyminecraft:xxxformat no longer conforms to CoreLib's unified source rules - Migrate custom presentations to
structured_presentation; the legacypresentation,name_operations,lore_operations,edititem, and other old presentation chains are no longer supported paths in the current version - Forge custom recipes should use root-level
forge_capacityandresult.output_item - Strengthen now requires all materials involved in evaluation to be placed in the GUI first; the legacy "auto-fill materials from inventory" flow is no longer the current behavior
- Attribute new configurations should use
conditionsuniformly;checksis retained only for compatibility reading - When deploying the new
EmakiCoreLib 3.2.0for the first time, make sure the server allows downloading runtime libraries viaplugin.yml libraries
Compatibility Notes
- The current release targets
Java 21 + Spigot API 1.21.11-R0.1-SNAPSHOT EmakiCoreLibretains only the structured presentation path; vanilla item/block sources only acceptminecraft-,mc-,v-, or no-prefix — four formatsEmakiForge's legacytarget_itemoutput structure andEmakiStrengthen's legacypresentationschema are no longer supported inputsEmakiGemis a closed-source module;1.1.0changes are summarized from.codex/change-reports