Skip to content

Adding Recipes

Pack location: Server/Item/Recipes/
Base game reference: Assets.zip/Server/Item/Recipes/

Here’s a complete recipe file:

{
"Input": [
{ "ItemId": "hytale:iron_ingot", "Quantity": 3 },
{ "ItemId": "hytale:wood_stick", "Quantity": 2 }
],
"PrimaryOutput": { "ItemId": "hytale:iron_pickaxe" },
"OutputQuantity": 1,
"BenchRequirement": [
{
"Type": "Crafting",
"Id": "Anvil",
"Categories": ["Tools"],
"RequiredTierLevel": 1
}
],
"TimeSeconds": 0,
"KnowledgeRequired": false
}

Input lists the ingredients — each needs at least an ItemId, ResourceTypeId (wildcard matching like “any wood”), or ItemTag. PrimaryOutput is what gets crafted. BenchRequirement controls where the recipe can be crafted (see Choosing a Bench Type).

FieldDefaultDescription
Input(required)List of ingredients (MaterialQuantity)
PrimaryOutput(required)The main output item
OutputQuantity1How many of the primary output to produce
Output[]Additional outputs beyond the primary
BenchRequirementWhich bench(es) can craft this recipe
TimeSeconds0Crafting duration in seconds (0 = instant)
KnowledgeRequiredfalseMust the player learn this recipe first?
RequiredMemoriesLevel1World progression gate

Each ingredient (MaterialQuantity) can match items in three ways:

FieldDescription
ItemIdExact item (e.g. "hytale:iron_ingot")
ResourceTypeIdAny item of a resource type (any wood, any ore)
ItemTagTag-based matching

Set Quantity for how many are needed (default: 1). Use Metadata for specific item variants.

Items can embed a Recipe field directly in their item JSON asset. These are auto-generated as "{itemId}_Recipe_Generated_0" at load time — no separate recipe file needed.

{
"Parent": "Template_Weapon_Sword",
"Recipe": {
"Input": [
{ "ItemId": "hytale:iron_ingot", "Quantity": 3 },
{ "ItemId": "hytale:wood_stick", "Quantity": 2 }
],
"BenchRequirement": [{ "Type": "Crafting", "Id": "Anvil" }]
}
}

The BenchRequirement on each recipe controls which bench(es) can craft it. A recipe can list multiple bench requirements to be craftable at different stations.

Each bench requirement has:

  • Type — the crafting mechanic (defaults to Crafting, see table below)
  • Id — which specific bench (e.g. "Anvil", "Fieldcraft")
  • Categories — UI organization tags (e.g. ["Tools"], ["Weapons"])
  • RequiredTierLevel — minimum bench tier to unlock this recipe (default: 0)
TypeHow it works
CraftingGrid-based. Ingredients consumed in any order. Instant or timed.
DiagramCraftingSlot-based with diagrams. Items placed in specific positions. Auto-learns recipes on success. Limited to 1 output.
StructuralCrafting1 input item, select from multiple outputs. Used for block variant crafting.
ProcessingFuel-based (furnace-like). Runs without the player — see Processing Benches.

Crafting benches support tier levels. Higher tiers unlock recipes with higher RequiredTierLevel and reduce crafting time via a tier-based modifier. Tier upgrades are handled through the TierUpgradeAction window action.

Benches search for materials in the player’s inventory and nearby chests. The search radius is configurable per-world in WorldConfig:

FieldDefaultDescription
BenchMaterialChestHorizontalSearchRadius14Horizontal block radius (max 14)
BenchMaterialChestVerticalSearchRadius6Vertical block radius (max 14)
BenchMaterialChestLimit100Max chests to search (max 200)

Fieldcraft lets players craft from their inventory without interacting with a bench block. The client opens it directly (via ClientOpenWindow packet) and the server responds with an UpdateWindow containing the available recipes.

To make a recipe available in Fieldcraft, set the bench requirement to "Id": "Fieldcraft":

{
"Input": [
{ "ItemId": "hytale:flint", "Quantity": 2 },
{ "ItemId": "hytale:wood_stick", "Quantity": 1 }
],
"PrimaryOutput": { "ItemId": "hytale:flint_knife" },
"BenchRequirement": [
{
"Type": "Crafting",
"Id": "Fieldcraft",
"Categories": ["Tools"]
}
]
}

Fieldcraft has its own category system separate from bench categories. Categories are JSON assets that control how recipes are organized in the pocket crafting UI.

Pack location: Server/Item/Category/Fieldcraft/
Base game reference: Assets.zip/Server/Item/Category/Fieldcraft/

Each category has:

FieldDescription
idCategory identifier
nameDisplay name (i18n key)
iconIcon reference
orderDisplay order in UI

Categories are synced to clients via the UpdateFieldcraftCategories packet during connection setup. Category removal at runtime is not supported.

Fieldcraft differs from bench-based crafting in several ways:

  • Instant onlyTimeSeconds is ignored (triggers a validation warning if set)
  • Player inventory only — no nearby chest scanning for materials
  • No tiersRequiredTierLevel must be 0 (no bench block to upgrade)
  • No queuing — each craft is processed immediately

KnowledgeRequired and RequiredMemoriesLevel both work with Fieldcraft.

Fieldcraft is fully server-authoritative. The client sends a CraftRecipeAction with a recipe ID and quantity — the server validates everything (recipe existence, materials, knowledge, memories level) and fires CraftRecipeEvent before producing output. See Crafting & Recipes for event details.


Processing benches work differently from other bench types:

  • Backed by ProcessingBenchState, a block-level tickable state
  • Operates independently of the player being present — place inputs and fuel, close the UI, come back later
  • Automatically matches recipes based on current input slot contents
  • Consumes fuel over time, processes items when fuel is available. Benches without fuel slots auto-activate.
  • Supports extra outputs per fuel consumed (e.g. byproducts)
  • Toggled on/off via the SetActiveAction window action

For adding/removing recipes in code, the knowledge system API, and crafting events, see Crafting & Recipes.