Skip to content

Changelog

Current Version Line

  • EmakiCoreLib: 3.4.0
  • EmakiAttribute: 3.3.0
  • EmakiForge: 3.3.0
  • EmakiStrengthen: 3.4.0
  • EmakiCooking: 2.2.0
  • EmakiGem: 1.2.0
  • EmakiSkills: 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 ImplementationTarget Plugin
CraftEngineBlockBridgeCraftEngine
ItemsAdderBlockBridgeProviderItemsAdder
NexoBlockBridgeProviderNexo

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 TypeMatching Method
VANILLACompares Material
CRAFTENGINEDelegates to CraftEngineBlockBridge
ITEMSADDERDelegates to ItemsAdderBlockBridge
NEXODelegates 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: weightOfscoreOf, weightsscores.

Version Changes

ModuleOld VersionNew Version
EmakiCoreLib3.3.03.4.0
EmakiCooking2.1.02.2.0
EmakiStrengthen3.3.03.4.0
EmakiSkills1.0.01.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.

yaml
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: 6
  • rolls supports numeric configuration types (constant, range, expression, etc.), allowing draw count to scale with level
  • variables supports 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:

yaml
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_parameters node with number, string, and boolean parameter 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 upgrade node 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 (none or downgrade)
  • 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_type field: skill definitions now support trigger_type: "passive" to mark passive skills
  • passive_triggers field: 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

yaml
id: attack_passive
trigger_type: "passive"
passive_triggers:
  - "attack"
mythic_skill: "ExampleAttackPassive"
cooldown_ticks: 40

Active vs Passive

AspectActive SkillPassive Skill
Trigger methodCast mode + key pressGame events auto-trigger
Slot bindingRequiredNot required
GUI displayEquippable to slotsNot 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 expiry
  • SET — 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:

yaml
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.

yaml
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:

yaml
effects:
  - type: skill
    skills:
      - "fireball"
      - "ice_bolt"

Strengthen star stage example:

yaml
stars:
  5:
    effects:
      - type: skill
        skills:
          - "flame_burst"

Gem definition example:

yaml
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

ModuleOld VersionNew Version
EmakiCoreLib3.2.03.3.0
EmakiAttribute3.2.03.3.0
EmakiForge3.2.03.3.0
EmakiStrengthen3.2.03.3.0
EmakiGem1.1.01.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 edititem action 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
  • preview now preserves the localized names of vanilla items
  • PDC condition files have been unified to use conditions as 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_type values 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 clearstate and 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_source driven
  • give subcommand 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 legacy minecraft:xxx format no longer conforms to CoreLib's unified source rules
  • Migrate custom presentations to structured_presentation; the legacy presentation, 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_capacity and result.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 conditions uniformly; checks is retained only for compatibility reading
  • When deploying the new EmakiCoreLib 3.2.0 for the first time, make sure the server allows downloading runtime libraries via plugin.yml libraries

Compatibility Notes

  • The current release targets Java 21 + Spigot API 1.21.11-R0.1-SNAPSHOT
  • EmakiCoreLib retains only the structured presentation path; vanilla item/block sources only accept minecraft-, mc-, v-, or no-prefix — four formats
  • EmakiForge's legacy target_item output structure and EmakiStrengthen's legacy presentation schema are no longer supported inputs
  • EmakiGem is a closed-source module; 1.1.0 changes are summarized from .codex/change-reports

Released under the GPL-3.0 License