English
GUI Templates
You get four window templates under plugins/EmakiStation/gui/
| Template | Window | Station configuration key |
|---|---|---|
station_catalog.yml | Recipe catalog (page 1) | layout |
station_preview.yml | Material preview (page 2) | preview_layout |
station_queue.yml | Craft queue (page 3) | queue_layout |
station_dismantle.yml | Dismantle window | layout of a dismantle station |
The first three form the three-page crafting flow: in the catalog, left click submits and right click opens the material preview; the preview confirms the submission; the queue page lets you view, cancel, claim and buy queue slots. The dismantle window is separate, and you enter it through /emakistation dismantle <station>
Slots Must Declare type Explicitly
Every EmakiStation slot must declare type explicitly. The CoreLib template parser only infers types for a few Forge-specific key names, so a custom key name without type is nothing but decoration
Resolution works as "use type first, fall back to the slot key name", so you can only omit type when the key name happens to equal the type name
yaml
slots:
recipe_list:
slots: [10, 11, 12]
type: "recipe_list"Recipe Catalog Types
type | Purpose |
|---|---|
recipe_list | List recipes. Required, or layout validation fails |
queue_open | Open the craft queue page |
batch_multiplier | Cycle the multiplier; left click increases, right click decreases |
output_toggle | Switch output routing |
prev_page / next_page / page_info | Pagination |
close | Close the window |
The recipe catalog page has no input slot. You do not place materials into the window; materials are deducted from the merged inventory-plus-warehouse pool at submission time
Catalog click behaviour: left-clicking an entry submits it at the current multiplier; right-clicking opens the material preview; an entry that is not unlocked (display_condition unsatisfied) does nothing on click
Material Preview Types
type | Purpose |
|---|---|
material_list | List the selected recipe's material requirements. Required |
recipe_display | Show the recipe being previewed |
cost_display | Show the currency cost and the player's balance |
max_craftable | Show how many crafts the materials and balance allow, and jump straight to the maximum on click |
batch_multiplier | Cycle the multiplier |
confirm | Submit |
back | Return to the catalog, landing on the original page |
prev_page / next_page / page_info | Material list pagination |
close | Close the window |
The material preview page is read-only and does not accept inserted items
The multiplier button cycles through the fixed steps 1 → 10 → 64 → 1000 (left click forward, right click backward, wrapping around). max_craftable computes the ceiling from your materials and balance and sets it as the current multiplier
Material Amount Display Rules
| Requirement | Display |
|---|---|
| ≤ 99 | The icon carries the real number, drawn directly by the client |
| ≥ 100 | The icon amount is fixed at 1 with no number drawn; the real amount appears only in the lore's %required_exact% |
Always keep %required_exact% in the lore, or there is no way to see large requirements
Amounts of 65–99 exceed the natural stack size of most items, so the plugin temporarily raises the max_stack_size component of the rendered icon. That change applies only to the display icon inside the window and is never handed to the player
Craft Queue Types
type | Purpose |
|---|---|
queue_view | List queue entries. Required |
capacity_display | Show used / ceiling along with where the ceiling comes from |
queue_purchase | Buy extra queue slots; left click buys one, Shift buys a whole batch |
claim_all | Claim every pending output |
back | Return to the catalog, landing on the original page |
prev_page / next_page / page_info | Queue pagination |
close | Close the window |
The craft queue page is read-only too: it does not accept inserted items
Queue entry click behaviour: click a PENDING_CLAIM entry and it acts as "claim all"; click any other entry and it is cancelled. The queue_purchase "whole batch" click uses the largest batch option (see Paid Queue Slots)
Dismantle Window Types
type | Purpose |
|---|---|
dismantle_input | Show the selected recipe's input item icon (a read-only preview; no item is placed) |
dismantle_item_display | Alias of dismantle_input |
dismantle_rolls_display | Show the roll count range (%rolls_min% / %rolls_max%) |
dismantle_output_list | Output list across several paginated cells, using the pool_entry / rolled_output virtual items |
dismantle_confirm | Confirm the dismantle, or claim already-rolled outputs |
prev_page / next_page / page_info | Output list pagination |
back | Return to the catalog |
close | Close the window |
The pagination controls serve both the probability-pool preview and the rolled-output list, and the page ceiling switches with the current state
Complete Placeholder Reference
The %...% tokens inside window templates are internal template placeholders rendered by EmakiStation itself, unrelated to PlaceholderAPI (PAPI variables are only resolved inside condition-expression text)
Title Placeholders (top-level template title)
| Placeholder | Recipe catalog | Material preview | Craft queue | Dismantle window |
|---|---|---|---|---|
%station_name% | ✓ | ✓ | ✓ | ✓ |
%station% | ✓ | ✓ | ✓ | ✓ |
%player% | ✓ | ✓ | ✓ | ✓ |
%recipe% | — | ✓ | — | ✓ |
%recipe_name% | — | ✓ | — | ✓ |
%page% | ✓ | — | — | — |
%pages% | ✓ | — | — | — |
%used% / %max% | — | — | ✓ | — |
Note that on the catalog title, %pages% resolves to the total number of recipe entries (as implemented), not the page count; use the page_info slot for the real page count
Catalog Slot Placeholders
| Slot type | Available placeholders |
|---|---|
recipe_list | %recipe%, %recipe_name%, %result_name%, %result_amount%, %duration%, %batch%, %index%, %page%, %pages%, %conditions%, %costs%, %materials%; locked entries additionally have %lock_reason% |
batch_multiplier | %batch%, %batch_exact% |
output_toggle | %output%, %output_state% |
page_info / prev_page / next_page | %page%, %pages%, %total% |
%conditions% / %costs% / %materials% are whole-line expansion placeholders: in lore each must occupy a line of its own, and CoreLib expands that line into as many lines as there are entries. Writing Materials: %materials% does not expand
Preview Slot Placeholders
| Slot type | Available placeholders |
|---|---|
material_list | %material%, %material_id%, %requirement_id%, %count_key%, %required%, %required_exact%, %owned%, %owned_exact%, %satisfied%, %consumed%, %alternatives%, %index%, %page%, %pages% |
recipe_display | %recipe%, %recipe_name%, %result_name%, %result_amount%, %duration%, %batch% |
cost_display | %cost%, %cost_exact%, %currency%, %balance%, %affordable%, %free% |
max_craftable | %max%, %max_exact%, %batch% |
batch_multiplier | %batch%, %batch_exact% |
confirm | %recipe%, %recipe_name%, %batch%; when blocked (switching to the confirm_blocked virtual item): %block_reason%, %block_text% |
page_info / prev_page / next_page | %page%, %pages%, %total% |
Queue Slot Placeholders
| Slot type | Available placeholders |
|---|---|
queue_view | Normal entries: %index%, %recipe%, %batch%, %state%, %remaining%, %cost%, %currency%, %page%, %pages% (pending entries switch to the queue_pending virtual item with the same placeholder set) |
capacity_display | %used%, %max%, %purchased%, %base%, %ceiling%, %pending% |
queue_purchase | When purchasable: %slots%, %cost%, %currency%, %items%; when not (switching to the purchase_unavailable virtual item): %reason%, %reason_text% |
claim_all | %pending% |
page_info / prev_page / next_page | %page%, %pages%, %total% |
Dismantle Slot Placeholders
| Slot type | Available placeholders |
|---|---|
dismantle_input / dismantle_item_display | %recipe%, %recipe_name%, %input% (switches to the no_recipe virtual item when nothing matches) |
dismantle_rolls_display | %rolls_min%, %rolls_max%, %recipe_name% |
dismantle_output_list | Pool entries: %item%, %amount_min%, %amount_max%, %weight%, %chance%, %index%, %page%, %pages%; rolled outputs: %item%, %amount%, %amount_exact%, %index%, %total% |
dismantle_confirm | Before rolling: %recipe%, %recipe_name%; after rolling (switching to the dismantle_claim virtual item): %recipe_name%, %output_count% |
page_info / prev_page / next_page | %page%, %pages%, %total% |
%chance% is the weight-derived percentage (one decimal place), and %weight% is the raw weight
virtual_items and texts
All four templates have a virtual_items section that defines the icon forms of list entries:
| Template | virtual_items keys in use |
|---|---|
station_catalog.yml | recipe_entry, recipe_locked |
station_preview.yml | material_satisfied, material_missing, confirm_blocked |
station_queue.yml | queue_entry, queue_pending, purchase_unavailable |
station_dismantle.yml | no_recipe, dismantle_input, pool_entry, rolled_output, dismantle_claim |
When a key is missing, the renderer falls back to a built-in icon and text (for example a grey dye for a locked catalog entry, or a barrier for a blocked confirm). The three crafting templates also have a texts section for configurable line fragments: texts.recipe.* and texts.output_state.* on the catalog, texts.block_reason.* and texts.output_state.* on the preview, and texts.purchase_reason.* on the queue page. The dismantle window has no texts section
The texts.block_reason.* and texts.purchase_reason.* keys correspond to the plugin's internal rejection reason keys (such as insufficient_materials, station.queue_full, no_price_defined); if a key is missing, the raw reason key is shown instead
Interaction Constraints
- Every click on a top-inventory slot is cancelled, so icons cannot be taken, and dragging into the top inventory is blocked
- Number-key, offhand-swap and unsupported combination clicks are ignored
- Rapid clicking in one session is throttled by
gui.click_throttle_ms - Open windows repaint on the
gui.refresh_interval_ticksinterval, and they never repaint off your owner thread