Skip to content

EmakiForge ​

EmakiForge runs the whole forging flow: you place the target equipment, blueprint, and materials; it checks the recipe, capacity, and conditions, then modifies the target item or creates a new result. Quality, material contribution, and result presentation are all configured here

Module facts ​

ItemValue
Module version4.8.7
Main command/emakiforge
Aliases/eforge, /ef
Hard dependencyEmakiCoreLib
Soft dependencyEmakiAttribute, EmakiItem, PlaceholderAPI
Main permissionsemakiforge.use, emakiforge.book, emakiforge.reload, emakiforge.debug, emakiforge.admin

Core concepts ​

ConceptDescription
BlueprintControls whether a player can use a forging recipe
MaterialResources the player adds to influence success, quality, or final attributes
RecipeDefines input requirements, capacity, conditions, results, and actions
CapacityLimits the sum of capacity_cost across inserted materials
QualityDeterministic weighted outcome tier, optionally with pity
Recipe bookGUI used to inspect available recipes

Default runtime folder ​

text
plugins/EmakiForge/
├── config.yml
├── recipes/
│   └── example_recipe.yml
├── gui/
│   ├── forge_gui.yml
│   └── recipe_book.yml
├── lang/
│   ├── zh_CN.yml
│   └── en_US.yml
└── data/

Start with recipes/. It defines forging inputs, capacity, conditions, results, and actions. data/ stores one file per player keyed by UUID, a <uuid>.yml holding that player's craft counters and pity counters

Main config.yml ​

See Quality for the quality sub-keys and Forge history for the history sub-keys; they are not repeated here

FieldTypeRequiredDefaultAllowed valuesDescription
versionstringNo4.8.7—Configuration-structure marker maintained by the resource sync flow. The internal version-migration constant is a separate 4.5.11; the two are not the same number
languagestringNozh_CNAn existing language file name without .ymlSelects lang/<language>.yml. When that file is missing, or a key is missing from it, the bundled zh_CN language resource is used as fallback
release_default_databooleanNotruetrue / falseWhen true, the missing bundled default data recipes/example_recipe.yml is released; when false that step is skipped. config.yml and lang/*.yml are versioned resources (missing keys are merged in from the bundled copy) and gui/*.yml are static resources (created from the bundled copy when absent); neither is affected by this key
op_bypassbooleanNofalsetrue / falseWhen true, OPs bypass command permission checks. The legacy key permission.op_bypass is read only when the top-level key is absent (with a startup warning), and is then migrated to the top-level key
number_format.defaultstringNo0.##Any DecimalFormat patternDisplay format for general numbers
number_format.integerstringNo0Any DecimalFormat patternDisplay format for integer values
number_format.percentagestringNo0.##%Any DecimalFormat patternDisplay format for percentage values
condition.invalid_as_failurebooleanNotruetrue / falseWhen true, a condition expression that fails to parse is treated as "condition not met"; when false, it does not block the forge
qualityobjectNosee below—Global quality pool, pity, and quality item metadata; the full key set is in Quality
historyobjectNosee below—Forge history switches and autosave; the full key set is in Forge history

Shipped defaults (the config.yml published with the module; repeated quality.tiers entries are abbreviated):

yaml
version: "4.8.7"
language: "zh_CN"
release_default_data: true
quality:
  tiers:
    - name: "平庸"
      weight: 60
      multiplier: 1.0
    - name: "完美"
      weight: 1
      multiplier: 1.2
  default_tier: "平庸"
  guarantee:
    enabled: true
    threshold: 60
    minimum: "无暇"
  item_meta:
    enabled: true
    tiers:
      无暇:
        name_actions:
          - action: "prepend_prefix"
            value: "<color:#4B64C8>[无暇] </color>"
        lore_actions:
        action:
          - 'broadcast_message text="..."'
      # the other 5 tiers share this structure, see quality.md
number_format:
  default: "0.##"
  integer: "0"
  percentage: "0.##%"
op_bypass: false
condition:
  invalid_as_failure: true
history:
  enabled: true
  auto_save: true
  save_interval: 6000

A minimal copyable example (switch language and reduce history write frequency):

yaml
language: "en_US"
number_format:
  percentage: "0.0%"
history:
  auto_save: true
  save_interval: 12000

Pages ​

PageContent
CommandsForging, recipe book, reload, list, and debug commands
RecipesInputs, blueprints, results, actions, and recipe matching
MaterialsMaterial contribution, capacity, quality modifiers, and effect writes
QualityQuality pools, pity, item metadata, and deterministic logic
Forge HistoryPlayer forging data, autosave, and troubleshooting
GUIForge UI and recipe book templates
AuditForge audit data and material signature on result items
PlaceholdersPlaceholderAPI output
CoreLib ActionsRefresh actions registered by Forge
APIThe EmakiForgeApi static facade
EventsForgeStartEvent, ForgeCompletedEvent

Typical forging flow ​

  1. Open the forge GUI with /ef forge
  2. Place a blueprint in the blueprint slots; Forge matches the recipe by blueprint item source
  3. Place materials in the required and optional material slots
  4. Check recipe, condition, capacity, and material count
  5. Click the confirm slot to run actions.pre
  6. Resolve deterministic quality and pity from the player, recipe, and material fingerprint (the fingerprint is an identifier derived from the exact mix of materials inserted)
  7. Create the primary item from result.success.outputs and attach the forge layer snapshot
  8. Run result.success.actions → actions.success → quality actions; on failure run actions.failure
  9. The CoreLib item assembly service rebuilds the item presentation
  10. With EmakiAttribute installed, ea_attribute material effects are written to the structured PDC attribute layer (PDC, the key-value data container stored on the item)

Relation with Attribute ​

Forge can run basic forging without Attribute. The ea_attribute material effect requires EmakiAttribute: attributes are then written into a structured PDC layer, so the numbers participate in real combat calculation instead of only appearing in lore

When EmakiAttribute is absent, this effect takes a no-op path: forging still completes, it simply does not write attribute data, no error is raised, and the flow is not interrupted