Skip to content

GUI Templates ​

You get four window templates under plugins/EmakiStation/gui/

TemplateWindowStation configuration key
station_catalog.ymlRecipe catalog (page 1)layout
station_preview.ymlMaterial preview (page 2)preview_layout
station_queue.ymlCraft queue (page 3)queue_layout
station_dismantle.ymlDismantle windowlayout 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 ​

typePurpose
recipe_listList recipes. Required, or layout validation fails
queue_openOpen the craft queue page
batch_multiplierCycle the multiplier; left click increases, right click decreases
output_toggleSwitch output routing
prev_page / next_page / page_infoPagination
closeClose 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 ​

typePurpose
material_listList the selected recipe's material requirements. Required
recipe_displayShow the recipe being previewed
cost_displayShow the currency cost and the player's balance
max_craftableShow how many crafts the materials and balance allow, and jump straight to the maximum on click
batch_multiplierCycle the multiplier
confirmSubmit
backReturn to the catalog, landing on the original page
prev_page / next_page / page_infoMaterial list pagination
closeClose 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 ​

RequirementDisplay
≤ 99The icon carries the real number, drawn directly by the client
≥ 100The 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 ​

typePurpose
queue_viewList queue entries. Required
capacity_displayShow used / ceiling along with where the ceiling comes from
queue_purchaseBuy extra queue slots; left click buys one, Shift buys a whole batch
claim_allClaim every pending output
backReturn to the catalog, landing on the original page
prev_page / next_page / page_infoQueue pagination
closeClose 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 ​

typePurpose
dismantle_inputShow the selected recipe's input item icon (a read-only preview; no item is placed)
dismantle_item_displayAlias of dismantle_input
dismantle_rolls_displayShow the roll count range (%rolls_min% / %rolls_max%)
dismantle_output_listOutput list across several paginated cells, using the pool_entry / rolled_output virtual items
dismantle_confirmConfirm the dismantle, or claim already-rolled outputs
prev_page / next_page / page_infoOutput list pagination
backReturn to the catalog
closeClose 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) ​

PlaceholderRecipe catalogMaterial previewCraft queueDismantle 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 typeAvailable 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 typeAvailable 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 typeAvailable placeholders
queue_viewNormal 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_purchaseWhen 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 typeAvailable 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_listPool entries: %item%, %amount_min%, %amount_max%, %weight%, %chance%, %index%, %page%, %pages%; rolled outputs: %item%, %amount%, %amount_exact%, %index%, %total%
dismantle_confirmBefore 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:

Templatevirtual_items keys in use
station_catalog.ymlrecipe_entry, recipe_locked
station_preview.ymlmaterial_satisfied, material_missing, confirm_blocked
station_queue.ymlqueue_entry, queue_pending, purchase_unavailable
station_dismantle.ymlno_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_ticks interval, and they never repaint off your owner thread