English
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
| Item | Value |
|---|---|
| Module version | 1.1.8 |
| API coordinates | emaki.jiuwu.craft:emaki-station-api:1.1.7 |
| Main class | emaki.jiuwu.craft.station.EmakiStationPlugin |
| Main command | /emakistation |
| Aliases | /estation, /est |
| Required dependency | EmakiCoreLib |
| Optional dependencies | EmakiStorage, PlaceholderAPI |
| Descriptor baseline | api-version: "26.1", folia-supported: true |
| Java | Java 25 |
| Main permissions | emakistation.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
| Page | Contents |
|---|---|
| Commands and Permissions | The 9 functional subcommands (plus help), 6 permission nodes and two access-permission prefixes of /emakistation |
| Configuration | The queue, limits, storage, persistence and gui sections of config.yml, with full key tables and defaults |
| Station Definitions | Layouts, permissions, queue parameters, material channels, output routing and the condition gate in stations/<id>.yml |
| Recipe Definitions | Ownership, materials, outputs, duration, currency cost, action sections and the two condition gates in recipes/<recipe>.yml |
| Craft Queue | The three sources of queue length, serial progression, cancellation refunds and the pending-claim state |
| Paid Queue Slots | The tiers, per-slot pricing, three switches and the unlocks.yml purchased-slot save of queue_costs.yml |
| Dismantling | Independent dismantle stations plus item_sources, rolls and weighted pool rolling |
| GUI Templates | Slot types of the four GUI templates, the complete placeholder reference and the "type: must be explicit" rule |
| API and Integration | The facade, query and operation layers of emaki-station-api and their thread constraints |
| Event API | StationCraftSubmitEvent, 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_sourcesis 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.
waitingandrunningoccupy queue length whilepending_claimdoes 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, andmax_lengthclamps 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 claimor 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/andrecipes_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| Path | Description |
|---|---|
config.yml | Main configuration: queue defaults, capacity limits, warehouse channel, persistence, GUI throttling |
queue_costs.yml | Paid queue slot tiers. A business data file: released once when missing, never overwritten by version upgrades |
stations/<id>.yml | Crafting station definition. The file name matches id |
recipes/<recipe>.yml | Crafting recipe definition. One recipe per file; ownership is declared recipe-side via station_ids |
stations_dismantle/<id>.yml | Dismantle station definition, unrelated to crafting stations |
recipes_dismantle/<recipe>.yml | Dismantle recipe definition with an input item and a weighted output pool |
gui/*.yml | Four window templates: recipe catalog, material preview, craft queue, dismantle window |
data/<player UUID>/unlocks.yml | Per-player purchased-slot save, maintained by the plugin; not created when there are no purchased slots. See Paid Queue Slots |
lang/*.yml | Command, window, precheck and console messages |
Getting Started
- Drop
EmakiCoreLib-*.jarandEmakiStation-*.jarinto the serverplugins/folder - Do not put
emaki-station-api-*.jarintoplugins/-- the API Jar is a compile-time dependency for developers only - After the first start, open
plugins/EmakiStation/config.ymland the example stationstations/blacksmith.ymland give them a look - Open the example station:
text
/emakistation open blacksmith- Check your queue and claim your outputs:
text
/emakistation queue
/emakistation claim- After you edit the configuration, reload to apply it:
text
/emakistation reloadUsage Notes
- Watch out: a station's
channels.backpackandchannels.storagecannot 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.defaultis 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 theemakistorage:atomic_batchcapability (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: offlineonly 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 reportsmissing_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-levelconditionblocks are all parsed and stored but have no execution entry point today;limits.batch_multiplier_maxis likewise parsed without taking part in any check. See Recipe Definitions, Station Definitions, Dismantling and Configuration