Skip to content

EmakiStation ​

EmakiStation is the general-purpose crafting station of the Emaki series. You submit materials against a recipe, the craft joins a queue, and you collect the output when it is ready. The whole flow is a GUI station you can configure, and the module also ships a fully independent dismantling station

The crafting side is a three-page window (recipe catalog → material preview → craft queue) with a serial queue: only the head entry advances. Materials come from one merged pool of your inventory and the warehouse, and the warehouse joins in once EmakiStorage is installed. Outputs go to the warehouse or your inventory; when neither can accept them, the entry becomes pending-claim and waits for you, and nothing is ever dropped or destroyed

Basic Information ​

ItemValue
Module version1.1.8
API coordinatesemaki.jiuwu.craft:emaki-station-api:1.1.7
Main classemaki.jiuwu.craft.station.EmakiStationPlugin
Main command/emakistation
Aliases/estation, /est
Required dependencyEmakiCoreLib
Optional dependenciesEmakiStorage, PlaceholderAPI
Descriptor baselineapi-version: "26.1", folia-supported: true
JavaJava 25
Main permissionsemakistation.use (default true), emakistation.purchase (default true), emakistation.dismantle (default true), emakistation.reload (op), emakistation.debug (op), emakistation.admin (op)

Three version numbers appear here, so sort them out first: the module and its default config.yml both carry 1.1.8, while the API artifact is 1.1.7. The source constant AppConfig.CURRENT_VERSION = "1.0.2" is a configuration-migration marker with a different job, so do not mix the three up

Feature Pages ​

PageContents
Commands and PermissionsThe 9 functional subcommands (plus help), 6 permission nodes and two access-permission prefixes of /emakistation
ConfigurationThe queue, limits, storage, persistence and gui sections of config.yml, with full key tables and defaults
Station DefinitionsLayouts, permissions, queue parameters, material channels, output routing and the condition gate in stations/<id>.yml
Recipe DefinitionsOwnership, materials, outputs, duration, currency cost, action sections and the two condition gates in recipes/<recipe>.yml
Craft QueueThe three sources of queue length, serial progression, cancellation refunds and the pending-claim state
Paid Queue SlotsThe tiers, per-slot pricing, three switches and the unlocks.yml purchased-slot save of queue_costs.yml
DismantlingIndependent dismantle stations plus item_sources, rolls and weighted pool rolling
GUI TemplatesSlot types of the four GUI templates, the complete placeholder reference and the "type: must be explicit" rule
API and IntegrationThe facade, query and operation layers of emaki-station-api and their thread constraints
Event APIStationCraftSubmitEvent, StationCraftCancelEvent and StationCraftCompletedEvent

Core Capabilities ​

  • Unordered set matching: a recipe only counts material kinds and totals, never where items sit, and there is no shaped concept. item_sources is an "any of these" set whose amount adds up across the whole set -- needing 64 is satisfied by 30 coal plus 34 charcoal
  • Merged inventory and warehouse supply: with both channels enabled, materials come from one merged pool that spends your inventory first. You see no channel toggle; the "owned" figure in the window is already the combined total
  • Serial single-line queue: you have one queue per station, and only the head entry advances. waiting and running occupy queue length while pending_claim does not
  • Three sources of queue length: your queue length comes from the base length, the emakistation.queue.<n> permission tier, and paid purchases. The tier replaces the base length, purchased slots stack on top, and max_length clamps the result
  • Outputs are never lost: when every configured target is full, the entry turns into pending-claim and waits for you to run /emakistation claim or click the in-window button
  • Dismantling is fully independent: dismantle station ids are unrelated to crafting station ids and load from their own stations_dismantle/ and recipes_dismantle/ directories. It is not a fourth page of a crafting station

File Layout ​

Once the server has run, these are the files you will work with:

text
plugins/EmakiStation/
├─ config.yml
├─ queue_costs.yml
├─ stations/
│  └─ blacksmith.yml
├─ recipes/
│  └─ example_recipe.yml
├─ stations_dismantle/
│  └─ example_dismantle_station.yml
├─ recipes_dismantle/
│  └─ example_dismantle_recipe.yml
├─ gui/
│  ├─ station_catalog.yml
│  ├─ station_preview.yml
│  ├─ station_queue.yml
│  └─ station_dismantle.yml
├─ data/
│  └─ <player UUID>/
│     └─ unlocks.yml
└─ lang/
   ├─ zh_CN.yml
   └─ en_US.yml
PathDescription
config.ymlMain configuration: queue defaults, capacity limits, warehouse channel, persistence, GUI throttling
queue_costs.ymlPaid queue slot tiers. A business data file: released once when missing, never overwritten by version upgrades
stations/<id>.ymlCrafting station definition. The file name matches id
recipes/<recipe>.ymlCrafting recipe definition. One recipe per file; ownership is declared recipe-side via station_ids
stations_dismantle/<id>.ymlDismantle station definition, unrelated to crafting stations
recipes_dismantle/<recipe>.ymlDismantle recipe definition with an input item and a weighted output pool
gui/*.ymlFour window templates: recipe catalog, material preview, craft queue, dismantle window
data/<player UUID>/unlocks.ymlPer-player purchased-slot save, maintained by the plugin; not created when there are no purchased slots. See Paid Queue Slots
lang/*.ymlCommand, window, precheck and console messages

Getting Started ​

  1. Drop EmakiCoreLib-*.jar and EmakiStation-*.jar into the server plugins/ folder
  2. Do not put emaki-station-api-*.jar into plugins/ -- the API Jar is a compile-time dependency for developers only
  3. After the first start, open plugins/EmakiStation/config.yml and the example station stations/blacksmith.yml and give them a look
  4. Open the example station:
text
/emakistation open blacksmith
  1. Check your queue and claim your outputs:
text
/emakistation queue
/emakistation claim
  1. After you edit the configuration, reload to apply it:
text
/emakistation reload

Usage Notes ​

  • Watch out: a station's channels.backpack and channels.storage cannot both be false, or the station is refused at load time. A station that opens but can never be used is worse than a startup error, so the plugin fails fast
  • channels.default is a retained key that no longer has any effect. After the channels were merged, "which channel you are on" no longer exists; the source still reads the key, but nothing consumes it, and it only remains so old configuration files do not report an unknown key
  • The warehouse channel needs more than storage.enabled: true: EmakiStorage must also provide the emakistorage:atomic_batch capability (a batch operation that either does everything or nothing). Without it the plugin will not fall back to withdrawing item by item, because that would make materials flash through your inventory
  • progress_mode: offline only means "the timer keeps running", not "delivery while offline". Entries that come due while you are offline are merely due; settlement happens at your next login
  • Keep all three layout files (layout, preview_layout, queue_layout) in place. If one is missing, the startup precheck reports missing_layout
  • Deterministic maximum-flow material allocation: when you hit submit, the plugin puts every inventory stack and every warehouse item source into one graph and searches for a complete assignment across all requirements, instead of relying on declaration order. Narrower matcher requirements join the graph first, but the outcome is still judged globally; a failure means the current candidates genuinely cannot satisfy all requirements at once
  • Not yet wired up: EmakiStation registers no action-stage ids and no PlaceholderAPI expansion. The recipe actions.pre / success / failure, result.actions, and the station-level and dismantle-station-level condition blocks are all parsed and stored but have no execution entry point today; limits.batch_multiplier_max is likewise parsed without taking part in any check. See Recipe Definitions, Station Definitions, Dismantling and Configuration