Skip to content

Block Textures

Block textures define the visual appearance of blocks in the game world. The texture system supports per-face textures, weighted texture variants, and biome-based tinting.

  • DirectoryAssets/Common/
    • DirectoryBlockTextures/
      • Soil_Dirt.png
      • Soil_Grass_Side.png
      • Soil_Grass_Top_GS.png
      • Rock_Basalt.png
      • Rock_Basalt_Brick.png
      • Clay_Blue.png
      • …645 texture files
    • DirectoryBlocks/
      • DirectoryDecorative_Sets/
        • DirectoryVillage/
        • DirectoryTavern/
        • DirectoryAncient/
      • DirectoryStone/
      • DirectoryFoliage/
      • DirectoryFarming/
    • DirectoryTintGradients/
      • Grass_Cold.png
      • Grass_Warm.png

The BlockTextures/ directory contains ~645 PNG texture files for standard blocks. Textures are organized by naming convention rather than subdirectories.

{Category}_{Material}.png

Examples:

  • Soil_Dirt.png - Basic dirt texture
  • Rock_Basalt.png - Basalt rock texture
  • Clay_Blue.png - Blue clay texture
  • Chalk.png - Chalk texture

Blocks with different appearances on different faces use suffixes:

SuffixDescription
_TopTop face of block
_SideSide faces
_BottomBottom face

Examples:

  • Soil_Grass_Top.png - Grass top face
  • Soil_Grass_Side.png - Grass side face (dirt with grass edge)
  • Bone_Top.png - Bone block top
  • Bone_Side.png - Bone block sides

Multiple visual variants use numeric suffixes:

{Name}_{Variant}.png

Examples:

  • Peachstone_Brick.png
  • Peachstone_Brick02.png
  • Peachstone_Brick03.png
  • Peachstone_Brick04.png
SuffixDescription
_BrickBrick pattern
_CobbleCobblestone pattern
_SmoothSmooth surface
_OrnateDecorative pattern
_DecorativeComplex decorative pattern

Examples:

  • Calcite.png - Base calcite
  • Calcite_Brick.png - Calcite bricks
  • Calcite_Brick_Smooth.png - Smooth calcite bricks
  • Calcite_Brick_Ornate.png - Ornate calcite bricks
  • Calcite_Cobble.png - Calcite cobblestone

Suffix _GS indicates a grayscale texture used with biome tinting:

  • Soil_Grass_Top_GS.png - Grayscale grass for tinting
  • Soil_Grass_Side_GS.png - Grayscale grass side
  • Moss_Block_GS_Top.png - Grayscale moss

In a block type’s JSON definition, the Textures property is an array of BlockTypeTextures objects. Each entry assigns a texture path to specific faces and has an optional weight for random selection.

KeyFaceProtocol Mapping
UpTop (+Y)top
DownBottom (-Y)bottom
NorthNorthback
SouthSouthfront
EastEastright
WestWestleft
KeySets
AllAll six faces at once
SidesNorth, South, East, West
UpDownUp and Down
{
"Textures": [
{
"All": "BlockTextures/Soil_Dirt.png"
}
]
}

A block with different top and side textures:

{
"Textures": [
{
"Up": "BlockTextures/Soil_Grass_Top.png",
"Down": "BlockTextures/Soil_Dirt.png",
"Sides": "BlockTextures/Soil_Grass_Side.png"
}
]
}

Multiple texture entries with Weight values allow random variation. The weights are normalized into ratios when sent to the client.

{
"Textures": [
{
"All": "BlockTextures/Rock_Stone.png",
"Weight": 3
},
{
"All": "BlockTextures/Rock_Stone02.png",
"Weight": 1
}
]
}

The first variant appears 75% of the time (3/4), the second 25% (1/4). Default weight is 1.

If no textures are specified, all faces fall back to BlockTextures/Unknown.png.

The BiomeTint property is an integer index applied per face. You can set it for all faces at once or individually with BiomeTintUp, BiomeTintDown, BiomeTintNorth, BiomeTintSouth, BiomeTintEast, BiomeTintWest.

{
"BiomeTint": 1
}

The TextureSideMask property specifies a separate texture path used as a side mask overlay. It follows the same asset validation rules as regular textures (must be a .png in a valid root directory).

CategoryCountExamples
Soil~40Soil_Dirt, Soil_Grass, Soil_Clay
Rock~100Rock_Basalt, Rock_Aqua, Rock_Crystal
Sand~15Sand, Sand_Red, Sand_Volcanic
Clay~30Clay_Blue, Clay_Smooth_Red
CategoryCountExamples
Brick~50Calcite_Brick, Rock_Basalt_Brick
Plank~20Plank_Oak, Plank_Pine
Metal~15Metal_Iron, Metal_Gold
Glass~10Glass, Glass_Stained_*
CategoryCountExamples
Crystal~20Rock_Crystal_Blue, Rock_Crystal_Purple
Mushroom~15Mushroom_Block_Blue, Mushroom_Block_Brown
Cloth~15Cloth_Black, Cloth_Blue

Block types are organized into lists for tool interactions and game logic.

  • DirectoryAssets/Server/BlockTypeList/
    • Soils.json
    • Rock.json
    • Ores.json
    • Snow.json
    • TreeWood.json
    • TreeLeaves.json
    • Gravel.json
    • PlantsAndTrees.json
Soils.json
{
"Blocks": [
"Soil_Dirt",
"Soil_Dirt_Burnt",
"Soil_Dirt_Cold",
"Soil_Dirt_Dry",
"Soil_Dirt_Poisoned",
"Soil_Grass",
"Soil_Grass_Burnt",
"Soil_Grass_Cold",
"Soil_Grass_Deep",
"Soil_Grass_Dry",
"Soil_Grass_Full",
"Soil_Grass_Sunny",
"Soil_Grass_Wet"
]
}

These lists are used by tools to determine mining behavior and durability loss.

The Blocks/Decorative_Sets/ directory contains themed block collections with models and textures.

SetContentsTheme
VillageFurniture, containersHuman village
TavernTables, chairs, barrelsInn furnishings
AncientRuins, artifactsAncient civilization
DesertDesert structuresArid region
Frozen_CastleIce furnitureFrozen region
JungleJungle structuresTropical region
KweebecKweebec-styleKweebec architecture
Temple_LightTemple blocksLight temple
Temple_DarkTemple blocksDark temple
Temple_EmeraldTemple blocksEmerald temple
Scarak_HiveOrganic shapesScarak structures
Scarak_TempleTemple blocksScarak temple

Each decorative set typically includes:

  • Directoryfunction Set() { [native code] }/
    • Barrel.blockymodel
    • Barrel_*.png texture variants
    • Bed.blockymodel
    • Bed_Texture.png
    • Chair.blockymodel
    • Chair_Texture.png
    • Chest.blockymodel
    • Chest_Texture.png
    • Door.blockymodel
    • Door_Texture.png
    • Table.blockymodel
    • Table_Texture.png
    • Lantern.blockymodel
    • Lantern_Texture.png
  • DirectoryVillage/
    • Barrel.blockymodel
    • Barrel_Ancient.png
    • Barrel_Crude.png
    • Barrel_Tavern.png
    • Bed.blockymodel
    • Bed_Texture.png
    • Bench.blockymodel
    • Chest.blockymodel
    • Chest_Small.blockymodel
    • Door.blockymodel
    • Lantern.blockymodel
    • Lantern_Ceiling.blockymodel
    • Painting*.blockymodel various sizes
    • Pot.blockymodel
    • Pot_Broken.blockymodel
    • Table.blockymodel
    • Wardrobe.blockymodel
    • Window*.blockymodel connected block variants

The server validates that all block textures must be .png files located in one of these root directories: BlockTextures/, Blocks/, Items/, NPC/, Resources/, or VFX/.

RequirementValue
Standard block32x32 pixels
High-detail64x64 or 128x128 pixels
FormatPNG
  • Opaque blocks: No alpha needed
  • Transparent blocks (glass, leaves): Alpha for transparency
  • Connected blocks: Alpha for edge blending

Create a 32x32 PNG file and place it in your plugin’s BlockTextures/ directory:

BlockTextures/MyPlugin_Block_Custom.png

Then reference it in your block type definition:

{
"Id": "MyPlugin_CustomBlock",
"Textures": [
{
"All": "BlockTextures/MyPlugin_Block_Custom.png"
}
]
}

Create separate texture files for different faces, then assign them using face keys:

{
"Id": "MyPlugin_GrassBlock",
"Textures": [
{
"Up": "BlockTextures/MyPlugin_Grass_Top.png",
"Down": "BlockTextures/MyPlugin_Dirt.png",
"Sides": "BlockTextures/MyPlugin_Grass_Side.png"
}
]
}

Create a grayscale texture (conventionally using a _GS suffix) and set the BiomeTint index:

{
"Id": "MyPlugin_TintedGrass",
"Textures": [
{
"Up": "BlockTextures/MyPlugin_Grass_Top_GS.png",
"Down": "BlockTextures/MyPlugin_Dirt.png",
"Sides": "BlockTextures/MyPlugin_Grass_Side_GS.png"
}
],
"BiomeTint": 1
}

Use multiple entries in the Textures array with weights for random variation:

{
"Id": "MyPlugin_StoneBlock",
"Textures": [
{ "All": "BlockTextures/MyPlugin_Stone.png", "Weight": 2 },
{ "All": "BlockTextures/MyPlugin_Stone02.png", "Weight": 1 },
{ "All": "BlockTextures/MyPlugin_Stone03.png", "Weight": 1 }
]
}
BiomeGrass TintSoil Color
PlainsBright greenBrown
DesertYellow-greenTan
Cold/TaigaBlue-greenGray-brown
JungleDeep greenDark brown
VolcanicOrangeBlack/gray
BurntBrownCharred

Available clay colors:

  • Black, Blue, Cyan, Green, Grey
  • Lime, Orange, Pink, Purple
  • Red, White, Yellow

Each has both rough (Clay_*) and smooth (Clay_Smooth_*) variants.

  • Blue, Cyan, Green, Pink, Purple, Red

Each crystal color has base and _Top variants.

  1. Follow naming conventions - Use established prefixes and suffixes
  2. Match existing style - Study vanilla textures for art direction
  3. Use weights for variation - Multiple weighted texture entries reduce visual repetition
  4. Use grayscale for tinting - Pair _GS textures with BiomeTint for biome adaptation
  5. Prefix custom IDs - Use your plugin name to avoid asset path collisions
  6. Place in valid roots - Textures must be in BlockTextures/, Blocks/, or other validated directories