Hytale Custom Blocks
Reference for creating custom blocks in Hytale plugins via asset packs and JSON item definitions with BlockType configuration, including animated model-based blocks.
Source: https://hytalemodding.dev/en/docs/guides/plugin/creating-block, https://hytalemodding.dev/en/docs/guides/plugin/animated-block-textures
Related skills: For block components and ECS ticking behavior, see hytale-ecs. For items and interactions, see hytale-items.
Quick Reference
| Task |
Approach |
| Enable asset packs |
Set "IncludesAssetPack": true in manifest.json |
| Define a block |
Create Server/Item/Items/<name>.json with a BlockType section |
| Set block texture |
"Textures": [{ "All": "BlockTextures/<name>.png" }] |
| Set block material |
"Material": "Solid" (or Liquid, NonSolid, etc.) |
| Set draw type |
"DrawType": "Cube" (or Cross, Slab, etc.) |
| Use an animated model block |
Set "DrawType": "Model" with CustomModel, CustomModelTexture, and CustomModelAnimation |
| Add localized name |
Server/Languages/en-US/items.lang → <name>.name = Display Name |
| Set gathering/breaking |
"Gathering": { "Breaking": { "GatherType": "...", "ItemId": "..." } } |
| Set block icon |
"Icon": "Icons/ItemsGenerated/<name>.png" |
Prerequisites
Enable Asset Packs
Your plugin's manifest.json must declare asset pack inclusion:
{
"IncludesAssetPack": true,
"dependencies": ["Hytale:EntityModule", "Hytale:BlockModule"]
}
Folder Structure
src/main/resources/
├── manifest.json
├── Server/
│ ├── Item/
│ │ └── Items/
│ │ └── my_new_block.json # Block definition
│ └── Languages/
│ └── en-US/
│ └── items.lang # Translations
└── Common/
├── Icons/ # Item icons
├── Blocks/
│ └── my_new_block/
│ └── model.blockymodel # Block model
└── BlockTextures/
└── my_new_block.png # Block texture
Translations
Create Server/Languages/en-US/items.lang:
my_new_block.name = My New Block
my_new_block.description = My Description
The filename items becomes the translation key prefix, so "items.my_new_block.name" resolves to My New Block.
Block JSON Definition
Create Server/Item/Items/my_new_block.json:
{
"TranslationProperties": {
"Name": "items.my_new_block.name",
"Description": "items.my_new_block.description"
},
"Id": "My_New_Block",
"MaxStack": 100,
"Icon": "Icons/ItemsGenerated/my_new_block.png",
"Categories": [
"Blocks.Rocks"
],
"PlayerAnimationsId": "Block",
"Set": "Rock_Stone",
"BlockType": {
"Material": "Solid",
"DrawType": "Cube",
"Group": "Stone",
"Flags": {},
"Gathering": {
"Breaking": {
"GatherType": "Rocks",
"ItemId": "my_new_block"
}
},
"BlockParticleSetId": "Stone",
"Textures": [
{
"All": "BlockTextures/my_new_block.png"
}
],
"ParticleColor": "#aeae8c",
"BlockSoundSetId": "Stone",
"BlockBreakingDecalId": "Breaking_Decals_Rock"
},
"ResourceTypes": [
{
"Id": "Rock"
}
]
}
BlockType Properties
| Property |
Description |
Examples |
Material |
Physics material type |
"Solid", "Liquid", "NonSolid" |
DrawType |
How the block is rendered |
"Cube", "Cross", "Slab" |
Group |
Block category group |
"Stone", "Wood", "Sand" |
Flags |
Additional block flags |
{} (empty object for defaults) |
Gathering.Breaking.GatherType |
Tool type needed to break |
"Rocks", "Wood", "Sand" |
Gathering.Breaking.ItemId |
Item dropped when broken |
ID string matching the block's Id |
BlockParticleSetId |
Particle effect when breaking |
"Stone", "Wood", "Sand" |
Textures |
Array of texture definitions |
See Texture Configuration below |
ParticleColor |
Break particle color |
Hex color string "#aeae8c" |
BlockSoundSetId |
Sound set for interactions |
"Stone", "Wood", "Sand" |
BlockBreakingDecalId |
Breaking animation decal |
"Breaking_Decals_Rock" |
Texture Configuration
Textures are defined as an array of objects. Use "All" to apply one texture to all faces, or specify per-face:
"Textures": [
{
"All": "BlockTextures/my_block.png"
}
]
Per-face texturing (when supported):
"Textures": [
{
"Top": "BlockTextures/my_block_top.png",
"Bottom": "BlockTextures/my_block_bottom.png",
"Side": "BlockTextures/my_block_side.png"
}
]
Animated Model Blocks
The newer animated block textures guide extends block creation with model-backed visuals.
Use a model draw type and point the block at a .blockymodel, texture asset, and .blockyanim:
"BlockType": {
"DrawType": "Model",
"CustomModel": "VFX/Blue_Fire/Blue_Fire.blockymodel",
"CustomModelAnimation": "Blocks/Animations/Blue_Fire/Blue_Fire_Burn.blockyanim",
"CustomModelTexture": [
{
"Texture": "VFX/Blue_Fire/Blue_Fire.png",
"Weight": 1
}
],
"Looping": true,
"RequiresAlphaBlending": false
}
Use this pattern for animated fire, magical effects, or other blocks that are really model-driven visuals instead of face-textured cubes.
Item Properties (Top-Level)
These properties are standard item fields that the block also uses:
| Property |
Description |
TranslationProperties |
Name and Description translation keys |
Id |
Unique identifier for the item/block |
MaxStack |
Maximum stack size in inventory |
Icon |
Path to inventory icon image |
Categories |
Array of category tags (e.g., "Blocks.Rocks") |
PlayerAnimationsId |
Animation set when held (e.g., "Block") |
Set |
Visual set grouping (e.g., "Rock_Stone") |
ResourceTypes |
Array of resource type objects with Id field |
Edge Cases & Gotchas
- All referenced files (textures, models, icons) must exist at the specified paths or the block will fail to load
- The
Id field is case-sensitive and must be unique across all items and blocks
- Translation keys follow the pattern
<lang-filename>.<key>.name — the .lang filename is the prefix
IncludesAssetPack must be true in manifest — without it, Common/ assets are ignored
- Block textures go in
Common/BlockTextures/, not Common/Textures/
- The
ItemId in Gathering.Breaking should match the block's Id for the block to drop itself when broken
- Check
lib/Server/ for existing block definitions to see all available property values
1---2name: hytale-blocks3description: Documents how to create custom blocks in Hytale plugins using asset packs and JSON definitions. Use when creating blocks, defining block JSON, configuring static or animated block visuals, materials, gathering, block types, or setting up block asset folder structure. Triggers - block, create block, custom block, BlockType, block JSON, block definition, block texture, animated block texture, .blockyanim, block material, DrawType, CustomModel, CustomModelTexture, CustomModelAnimation, Gathering, block creation, asset pack, IncludesAssetPack, block item, Cube block, block sound, block particle.4---56# Hytale Custom Blocks78Reference for creating custom blocks in Hytale plugins via asset packs and JSON item definitions with `BlockType` configuration, including animated model-based blocks.910> **Source:** <https://hytalemodding.dev/en/docs/guides/plugin/creating-block>, <https://hytalemodding.dev/en/docs/guides/plugin/animated-block-textures>11> **Related skills:** For block *components* and ECS ticking behavior, see `hytale-ecs`. For items and interactions, see `hytale-items`.1213---1415## Quick Reference1617| Task | Approach |18|------|----------|19| Enable asset packs | Set `"IncludesAssetPack": true` in `manifest.json` |20| Define a block | Create `Server/Item/Items/<name>.json` with a `BlockType` section |21| Set block texture | `"Textures": [{ "All": "BlockTextures/<name>.png" }]` |22| Set block material | `"Material": "Solid"` (or `Liquid`, `NonSolid`, etc.) |23| Set draw type | `"DrawType": "Cube"` (or `Cross`, `Slab`, etc.) |24| Use an animated model block | Set `"DrawType": "Model"` with `CustomModel`, `CustomModelTexture`, and `CustomModelAnimation` |25| Add localized name | `Server/Languages/en-US/items.lang` → `<name>.name = Display Name` |26| Set gathering/breaking | `"Gathering": { "Breaking": { "GatherType": "...", "ItemId": "..." } }` |27| Set block icon | `"Icon": "Icons/ItemsGenerated/<name>.png"` |2829---3031## Prerequisites3233### Enable Asset Packs3435Your plugin's `manifest.json` must declare asset pack inclusion:3637```json38{39 "IncludesAssetPack": true,40 "dependencies": ["Hytale:EntityModule", "Hytale:BlockModule"]41}42```4344### Folder Structure4546```47src/main/resources/48├── manifest.json49├── Server/50│ ├── Item/51│ │ └── Items/52│ │ └── my_new_block.json # Block definition53│ └── Languages/54│ └── en-US/55│ └── items.lang # Translations56└── Common/57 ├── Icons/ # Item icons58 ├── Blocks/59 │ └── my_new_block/60 │ └── model.blockymodel # Block model61 └── BlockTextures/62 └── my_new_block.png # Block texture63```6465---6667## Translations6869Create `Server/Languages/en-US/items.lang`:7071```72my_new_block.name = My New Block73my_new_block.description = My Description74```7576> The filename `items` becomes the translation key prefix, so `"items.my_new_block.name"` resolves to `My New Block`.7778---7980## Block JSON Definition8182Create `Server/Item/Items/my_new_block.json`:8384```json85{86 "TranslationProperties": {87 "Name": "items.my_new_block.name",88 "Description": "items.my_new_block.description"89 },90 "Id": "My_New_Block",91 "MaxStack": 100,92 "Icon": "Icons/ItemsGenerated/my_new_block.png",93 "Categories": [94 "Blocks.Rocks"95 ],96 "PlayerAnimationsId": "Block",97 "Set": "Rock_Stone",98 "BlockType": {99 "Material": "Solid",100 "DrawType": "Cube",101 "Group": "Stone",102 "Flags": {},103 "Gathering": {104 "Breaking": {105 "GatherType": "Rocks",106 "ItemId": "my_new_block"107 }108 },109 "BlockParticleSetId": "Stone",110 "Textures": [111 {112 "All": "BlockTextures/my_new_block.png"113 }114 ],115 "ParticleColor": "#aeae8c",116 "BlockSoundSetId": "Stone",117 "BlockBreakingDecalId": "Breaking_Decals_Rock"118 },119 "ResourceTypes": [120 {121 "Id": "Rock"122 }123 ]124}125```126127---128129## BlockType Properties130131| Property | Description | Examples |132|----------|-------------|---------|133| `Material` | Physics material type | `"Solid"`, `"Liquid"`, `"NonSolid"` |134| `DrawType` | How the block is rendered | `"Cube"`, `"Cross"`, `"Slab"` |135| `Group` | Block category group | `"Stone"`, `"Wood"`, `"Sand"` |136| `Flags` | Additional block flags | `{}` (empty object for defaults) |137| `Gathering.Breaking.GatherType` | Tool type needed to break | `"Rocks"`, `"Wood"`, `"Sand"` |138| `Gathering.Breaking.ItemId` | Item dropped when broken | ID string matching the block's `Id` |139| `BlockParticleSetId` | Particle effect when breaking | `"Stone"`, `"Wood"`, `"Sand"` |140| `Textures` | Array of texture definitions | See Texture Configuration below |141| `ParticleColor` | Break particle color | Hex color string `"#aeae8c"` |142| `BlockSoundSetId` | Sound set for interactions | `"Stone"`, `"Wood"`, `"Sand"` |143| `BlockBreakingDecalId` | Breaking animation decal | `"Breaking_Decals_Rock"` |144145### Texture Configuration146147Textures are defined as an array of objects. Use `"All"` to apply one texture to all faces, or specify per-face:148149```json150"Textures": [151 {152 "All": "BlockTextures/my_block.png"153 }154]155```156157Per-face texturing (when supported):158159```json160"Textures": [161 {162 "Top": "BlockTextures/my_block_top.png",163 "Bottom": "BlockTextures/my_block_bottom.png",164 "Side": "BlockTextures/my_block_side.png"165 }166]167```168169### Animated Model Blocks170171The newer animated block textures guide extends block creation with model-backed visuals.172173Use a model draw type and point the block at a `.blockymodel`, texture asset, and `.blockyanim`:174175```json176"BlockType": {177 "DrawType": "Model",178 "CustomModel": "VFX/Blue_Fire/Blue_Fire.blockymodel",179 "CustomModelAnimation": "Blocks/Animations/Blue_Fire/Blue_Fire_Burn.blockyanim",180 "CustomModelTexture": [181 {182 "Texture": "VFX/Blue_Fire/Blue_Fire.png",183 "Weight": 1184 }185 ],186 "Looping": true,187 "RequiresAlphaBlending": false188}189```190191Use this pattern for animated fire, magical effects, or other blocks that are really model-driven visuals instead of face-textured cubes.192193---194195## Item Properties (Top-Level)196197These properties are standard item fields that the block also uses:198199| Property | Description |200|----------|-------------|201| `TranslationProperties` | `Name` and `Description` translation keys |202| `Id` | Unique identifier for the item/block |203| `MaxStack` | Maximum stack size in inventory |204| `Icon` | Path to inventory icon image |205| `Categories` | Array of category tags (e.g., `"Blocks.Rocks"`) |206| `PlayerAnimationsId` | Animation set when held (e.g., `"Block"`) |207| `Set` | Visual set grouping (e.g., `"Rock_Stone"`) |208| `ResourceTypes` | Array of resource type objects with `Id` field |209210---211212## Edge Cases & Gotchas213214- All referenced files (textures, models, icons) must exist at the specified paths or the block will fail to load215- The `Id` field is case-sensitive and must be unique across all items and blocks216- Translation keys follow the pattern `<lang-filename>.<key>.name` — the `.lang` filename is the prefix217- `IncludesAssetPack` must be `true` in manifest — without it, `Common/` assets are ignored218- Block textures go in `Common/BlockTextures/`, not `Common/Textures/`219- The `ItemId` in `Gathering.Breaking` should match the block's `Id` for the block to drop itself when broken220- Check `lib/Server/` for existing block definitions to see all available property values221222```