Modding:Block Json Properties: Difference between revisions

From Vintage Story Wiki
no edit summary
No edit summary
No edit summary
(40 intermediate revisions by 5 users not shown)
Line 1: Line 1:
__NOTOC__
__NOTOC__
== Overview ==
== Overview ==
An incomplete list of all available properties
A complete list of all available properties


<table id="treeviewtable" class="table table-bordered tt-table" style='table-layout: fixed'>
<table id="treeviewtable" class="table table-bordered tt-table" style='table-layout: fixed'>
   <tr style='background-color: gray;'>
   <tr>
     <th width='300' align='left'>Property</th>
     <th width='300' align='left'>Property</th>
     <th width='200' align='left'>Type</th>
     <th width='200' align='left'>Type</th>
     <th width='80' align='left'>Default</th>
     <th width='120' align='left'>Default</th>
     <th align='left'>Usage</th>
     <th align='left'>Usage</th>
   </tr>
   </tr>
Line 17: Line 17:
   </tr>
   </tr>
   <tr>
   <tr>
     <td colspan="4" style='font-size: 14pt; border-bottom: 2pt solid black; padding-left: 100px;'><b>Common</b></td>
     <td colspan="4" class="propHeader"><b>Core (no byType available)</b></td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_code" data-tt-parent="root">code</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_code" data-tt-parent="root">Code</div></td>
     <td>string</td>
     <td>string</td>
     <td>-</td>
     <td>required</td>
     <td>A unique identifier for the block.</td>
     <td>A unique identifier for the block.</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_maxstacksize" data-tt-parent="root">maxstacksize</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_code_info" data-tt-parent="p_code" data-invisible="true"></div></td>
     <td>number</td>
     <td colspan="3">
    <td>64</td>
A '''domain prefix''' will be added dynamically depending on the location of the file. Every mod and VintageStory itself have a unique prefix.
     <td>Determines the maximum amount you can stack the block in one slot.</td>
 
For example the code '''<code>stone</code>''' turns into '''<code>game:stone</code>'''.
 
The code identifier has to be unique inside its domain. In theory there could be equal identifiers with different domain prefixes.
Find out more about [[Basic Modding#Domains|Domains]].
     </td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_enabled " data-tt-parent="root">enabled</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_enabled" data-tt-parent="root">Enabled</div></td>
     <td>boolean</td>
     <td>boolean</td>
     <td>true</td>
     <td>true</td>
     <td>If the block will be added to game or not.</td>
     <td>If the block will be loaded or not. Can be used to temporarily remove the block.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_variantgroups" data-tt-parent="root">VariantGroups</div></td>
    <td>array of object</td>
    <td>-</td>
    <td>Allows you define multiple variants of the same block.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_variantgroups_info" data-tt-parent="p_variantgroups" data-invisible="true"></div></td>
    <td colspan="3">
The variantgroups property allows you to define multiple variants of this block. All of them will have their unique pattern, which will be added to the block code.
 
An easy example would be a bowl, which can either be raw or burned:
<syntaxhighlight lang="json">
variantgroups: [
{ code:"type", states: ["raw", "burned"] },
],
</syntaxhighlight>
 
Meaning there will be two blocks <code>bowl-raw</code> and <code>bowl-burned</code>.
 
----
 
It's also possible to define multiple groups.
 
<syntaxhighlight lang="json">
variantgroups: [
{ code:"state", states: ["closed", "opened"] },
{ code:"contents", states: ["empty", "cabbage"] },
],
</syntaxhighlight>
 
As a result you will have 2x2 groups, which will be added one after each other: <code>barrel-closed-empty</code>, <code>barrel-closed-cabbage</code>, <code>barrel-opened-empty</code> and <code>barrel-opened-cabbage</code>.
 
----
 
Additionally it is possible to refer to external lists that are found in the worldproperties folder, such as <code>block/rock</code>, which contains all states of all rock types. This used for <code>gravel</code>, <code>sand</code> and <code>rock</code>. It's a good way to keep everything organized:
<syntaxhighlight lang="json">
variantgroups: [
{ loadFromProperties: "block/rock" },
],
</syntaxhighlight>
 
Here is a full list of all groups and their variants (you can also find them in the <code>assets/worldproperties</code> folder):
{{:json:block:worldvariantgroups}}
----
 
Furthermore there are two ways of combining groups together. So far we covered the default combination mode, which is <code>multiplicative</code> (the total count of variants is the product of all states).
 
Let's take a look at a different example (flowerpot), which uses the <code>additive</code> combination mode:
<syntaxhighlight lang="json">
variantgroups: [
{ code: "type", states: ["raw"] },
{ code: "empty", states: ["empty"], combine: "additive" },
{ code: "flower", loadFromProperties: "block/flower", combine: "additive" },
{ code: "mushroom", loadFromProperties: "block/mushroom", combine: "additive" },
{ code: "sapling", loadFromProperties: "block/wood", combine: "additive" },
],
</syntaxhighlight>
 
The variants are <code>flowerpot-raw</code>, <code>flowerpot-empty</code>, <code>flowerpot-{all flowers}</code>, <code>flowerpot-{all mushrooms}</code> and <code>flowerpot-{all saplings}</code>.
 
<code>Additive</code> mode could also be called separate, since it defines a variant separate from all the other groups:
 
<syntaxhighlight lang="json">
variantgroups: [
{ code: "something", states: ["same", "different"] },
{ code: "type", states: ["raw", "baked"] },
{ code: "empty", states: ["red", "green"], "combine": "additive" },
],
</syntaxhighlight>
 
In this case, the result would be <code>same-raw</code>, <code>same-baked</code>, <code>different-raw</code>, <code>different-baked</code>, <code>red</code> and <code>green</code>
    </td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_byType" data-tt-parent="root">(any) byType</div></td>
    <td>key: string; value: object</td>
    <td>-</td>
    <td>You can create properties for certain variants of the block.</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_class" data-tt-parent="root">class</div></td>
    <td scope="row"><div class="tt" data-tt-id="p_byType_info" data-tt-parent="p_byType" data-invisible="true"></div></td>
    <td colspan="3">
In order to define properties for specific variants you can add '''byType''' to the property name. This allows you to define it depending on the type and always follows the same syntax:
<syntaxhighlight lang="json">
(property)ByType: {
"selector": property,
"selector2": property2,
...
}
</syntaxhighlight>
 
If the selector matches the name of the variant the given property will be used. Keep in mind that only the first matching one will be used (everything below will be ignored).
 
A slab for example has two variants ('''up''', '''down'''), which have different collision boxes:
<syntaxhighlight lang="json">
collisionboxByType: {
"*-down": { x1: 0, y1: 0, z1: 0,  x2: 1, y2: 0.5, z2: 1 },
"*-up": { x1: 0, y1: 0.5, z1: 0,  x2: 1, y2: 1, z2: 1 }
},
</syntaxhighlight>
 
The char '''<code>*</code>''' stands for anything. In this case it ignores the code of the block.
 
Furthermore this opens up even more possbilities for more advanced selectors like this one for doors:
<code>*-north-*-opened-left</code>. This will ignore the second variantgroup. Additionally ByType can also be used for child properties:
<syntaxhighlight lang="json">
collisionboxnbox: {
x1: 0, y1: 0, z1: 0.875, x2: 1, y2: 1, z2: 1,
rotateYByType: {
"*-north-*-opened-left": 90,
"*-north-*-closed-left": 0,
"*-west-*-opened-left": 180,
"*-west-*-closed-left": 90,
 
"*-east-*-opened-left": 0,
"*-east-*-closed-left": 270,
"*-south-*-opened-left": 270,
"*-south-*-closed-left": 180,
 
"*-north-*-opened-right": 270,
"*-north-*-closed-right": 0,
"*-west-*-opened-right": 0,
"*-west-*-closed-right": 90,
 
"*-east-*-opened-right": 180,
"*-east-*-closed-right": 270,
"*-south-*-opened-right": 90,
"*-south-*-closed-right": 180
}
},
</syntaxhighlight>
 
Since Vintagestory v1.8 it is also possible to use the variantgroup as a placeholder:
<syntaxhighlight lang="json">
variantgroups: [
{ code: "type", states: ["normal", "bamboo"] },
],
textures: {
horizontals: { base: "block/hay/{type}-side" },
verticals: { base: "block/hay/{type}-top" },
},
</syntaxhighlight>
</td>
  </tr>
  <tr>
    <td colspan="4" class="propHeader"><b>Specific</b></td>
  </tr>
  <tr>
     <td scope="row"><div class="tt" data-tt-id="p_class" data-tt-parent="root">Class</div></td>
     <td>string</td>
     <td>string</td>
     <td>block</td>
     <td>&quot;block&quot;</td>
     <td>The block class</td>
     <td>The block class can add special functionalities for the block.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_class_info" data-tt-parent="p_class" data-invisible="true"></div></td>
    <td colspan="3">
It can be used to open guis or adding other extra functionality to the block. A complete tutorial of how to add your own class to the game can be found [[Advanced Blocks|here]].
</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_code" data-tt-parent="root">entityclass</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_entityclass" data-tt-parent="root">EntityClass</div></td>
     <td>string</td>
     <td>string</td>
     <td>-</td>
     <td>-</td>
     <td>The blockentity class</td>
     <td>The block entity class is able to tick and to store extra data.</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_behaviors" data-tt-parent="root">behaviors</div></td>
    <td scope="row"><div class="tt" data-tt-id="p_entityclass_info" data-tt-parent="p_entityclass" data-invisible="true"></div></td>
     <td>array of strings</td>
    <td colspan="3">
     <td>empty</td>
A chest for example uses the BlockEntity to store the inventory. A tutorial of creating your own entityclass can be found [[Block Entity|here]].
     <td></td>
</td>
  </tr>
  <tr>
     <td scope="row"><div class="tt" data-tt-id="p_behaviors" data-tt-parent="root">Behaviors</div></td>
     <td>array of object</td>
     <td>-</td>
     <td>A behavior adds custom abilities such as falling block.</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_behaviors_info" data-tt-parent="p_behaviors" data-invisible="true"></div></td>
     <td scope="row"><div class="tt" data-tt-id="p_behaviors_info" data-tt-parent="p_behaviors" data-invisible="true"></div></td>
     <td colspan="3">
     <td colspan="3">
Here is an overview of most exisiting behaviors, if you want to create your own custom behavior you can read [[Adding Block Behavior]].
To see all of the current behaviors in the game see [[Json:block:behaviors|All Block Behaviors]]
{{:json:block:behavior}}
{{:json:block:behavior}}
     </td>
</td>
  </tr>
  <tr>
     <td scope="row"><div class="tt" data-tt-id="p_blockmaterial" data-tt-parent="root">BlockMaterial</div></td>
    <td>string</td>
    <td>-</td>
    <td>A behavior adds custom abilities such as falling block.</td>
  </tr>
  <tr>
    <td scope="row">
  <div class="tt" data-tt-id="p_blockmaterial_soil" data-tt-parent="p_blockmaterial">Soil</div><br>
  <div class="tt" data-tt-id="p_blockmaterial_gravel" data-tt-parent="p_blockmaterial">Gravel</div><br>
  <div class="tt" data-tt-id="p_blockmaterial_sand" data-tt-parent="p_blockmaterial">Sand</div><br>
  <div class="tt" data-tt-id="p_blockmaterial_wood" data-tt-parent="p_blockmaterial">Wood</div><br>
  <div class="tt" data-tt-id="p_blockmaterial_leaves" data-tt-parent="p_blockmaterial">Leaves</div><br>
  <div class="tt" data-tt-id="p_blockmaterial_stone" data-tt-parent="p_blockmaterial">Stone</div><br>
  <div class="tt" data-tt-id="p_blockmaterial_liquid" data-tt-parent="p_blockmaterial">Liquid</div><br>
  <div class="tt" data-tt-id="p_blockmaterial_snow" data-tt-parent="p_blockmaterial">Snow</div><br>
  <div class="tt" data-tt-id="p_blockmaterial_ice" data-tt-parent="p_blockmaterial">Ice</div><br>
  <div class="tt" data-tt-id="p_blockmaterial_metal" data-tt-parent="p_blockmaterial">Metal</div><br>
  <div class="tt" data-tt-id="p_blockmaterial_mantle" data-tt-parent="p_blockmaterial">Mantle</div><br>
  <div class="tt" data-tt-id="p_blockmaterial_plant" data-tt-parent="p_blockmaterial">Plant</div><br>
  <div class="tt" data-tt-id="p_blockmaterial_glass" data-tt-parent="p_blockmaterial">Glass</div><br>
  <div class="tt" data-tt-id="p_blockmaterial_ceramic" data-tt-parent="p_blockmaterial">Ceramic</div><br>
  <div class="tt" data-tt-id="p_blockmaterial_cloth" data-tt-parent="p_blockmaterial">Cloth</div><br>
  <div class="tt" data-tt-id="p_blockmaterial_lava" data-tt-parent="p_blockmaterial">Lava</div><br>
  <div class="tt" data-tt-id="p_blockmaterial_brick" data-tt-parent="p_blockmaterial">Brick</div><br>
  <div class="tt" data-tt-id="p_blockmaterial_fire" data-tt-parent="p_blockmaterial">Fire</div><br>
  <div class="tt" data-tt-id="p_blockmaterial_other" data-tt-parent="p_blockmaterial">Other</div>
</td>
    <td colspan="3" valign="top">
Materials are hardcoded and currently only used to determine mining speed with a specific tool.
</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_matterstate" data-tt-parent="root">MatterState</div></td>
    <td>array of object</td>
    <td>&quot;block&quot;</td>
    <td>Determines whether the block is in a '''''solid''''', a '''''liquid''''', a '''''gas''''' or a '''''plasma''''' state.</td>
  </tr>
  <tr>
    <td scope="row">
  <div class="tt" data-tt-id="p_matterstate_solid" data-tt-parent="p_matterstate">solid</div><br><br>
  <div class="tt" data-tt-id="p_matterstate_liquid" data-tt-parent="p_matterstate">liquid</div><br><br>
  <div class="tt" data-tt-id="p_matterstate_gas" data-tt-parent="p_matterstate">gas</div><br><br>
  <div class="tt" data-tt-id="p_matterstate_plasma" data-tt-parent="p_matterstate">plasma</div><br><br>
</td>
    <td colspan="3">
Used for special collision behavior and rendering. Currently used for:
 
Liquid:
*Lava
*Water
*Water with particles
 
Gas/Plasma:
none added yet
</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_resistance" data-tt-parent="root">Resistance</div></td>
    <td>decimal number</td>
    <td>6</td>
    <td>How long it takes to break this block in seconds (with a mining speed of 1).</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_resistance_info" data-tt-parent="p_resistance" data-invisible="true"></div></td>
    <td colspan="3">
Same examples of resistance's values used in VintageStory:
<table class="wikitable">
  <tr style="background-color: rgba(0,0,0,0.2);">
    <th style="background-color: rgba(0,0,0,0.2);">Block</th>
    <th style="background-color: rgba(0,0,0,0.2);">Value</th>
  </tr>
  <tr>
    <td>'''leave'''</td>
<td>''0.5''</td>
  </tr>
  <tr>
    <td>'''wool'''</td>
<td>''1.0''</td>
  </tr>
  <tr>
    <td>'''bowl'''</td>
<td>''1.5''</td>
  </tr>
  <tr>
    <td>'''obsidian'''</td>
<td>''2''</td>
  </tr>
  <tr>
    <td>'''plank'''</td>
<td>''3.5''</td>
  </tr>
  <tr>
    <td>'''log'''</td>
<td>''4.5''</td>
  </tr>
  <tr>
    <td>'''rock'''</td>
<td>''6''</td>
  </tr>
</table>
</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_requiredminingtier" data-tt-parent="root">RequiredMiningTier</div></td>
    <td>integer</td>
    <td>0</td>
    <td>Minimum required mining tier to get the drop out of the block.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_requiredminingtier_info" data-tt-parent="p_requiredminingtier" data-invisible="true"></div></td>
    <td colspan="3">
<table class="wikitable">
  <tr style="background-color: rgba(0,0,0,0.2);">
    <th style="background-color: rgba(0,0,0,0.2);">Tier</th>
    <th style="background-color: rgba(0,0,0,0.2);">Ores</th>
  </tr>
  <tr>
    <td>'''1'''</td>
<td>'''''gelena''''' and '''''rocksalt_sylvite'''''</td>
  </tr>
  <tr>
    <td>'''2'''</td>
<td>'''''lignite''''', '''''cassiterite''''', '''''sphalerite''''', '''''rocksalt''''', '''''sulfur''''' and '''''nativecopper'''''</td>
  </tr>
  <tr>
    <td>'''3'''</td>
<td>'''''bituminouscoal''''', '''''quartz_nativegold''''', '''''quartz_nativesilver''''', '''''lapislazuli''''', '''''bismuthinite''''', '''''quartz''''', '''''magnetite''''' and '''''limonite'''''</td>
  </tr>
  <tr>
    <td>'''4'''</td>
<td>'''''diamond''''' and '''''emerald'''''</td>
  </tr>
  <tr>
    <td>'''5'''</td>
<td>'''''chromite''''', '''''platinum''''' and '''''ilmenite'''''</td>
  </tr>
</table>
</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_climbable" data-tt-parent="root">Climbable</div></td>
    <td>boolean</td>
    <td>false</td>
    <td>If true, walking against this block will make the player climb (used for ladders).</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_rainpermeable" data-tt-parent="root">RainPermeable</div></td>
    <td>boolean</td>
    <td>false</td>
    <td>If rain can fall through this block.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_snowcoverage" data-tt-parent="root">SnowCoverage</div></td>
    <td>boolean</td>
    <td>-</td>
    <td>Whether snow may rest on top of this block.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_snowcoverage_info" data-tt-parent="p_snowcoverage" data-invisible="true"></div></td>
    <td colspan="3">
All none solid blocks can't be covered by snow unless it's defined different:
*Leaves (also branchy): '''true''',
*Water with particles, Lakeice: '''false'''
</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_collisionbox" data-tt-parent="root">CollisionBox</div></td>
    <td>object</td>
    <td>box (0,0,0 -> 1,1,1)</td>
    <td>Defines a box with which the player collides with.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_collisionbox_info" data-tt-parent="p_collisionbox" data-invisible="true"></div></td>
    <td colspan="3">
A '''half slab''' for example, has either a box going from 0,0,0 to 1,0.5,1 or going from 0,0.5,0 to 1,1,1, depending on whether it is a slab is down or up:
<syntaxhighlight lang="json">
collisionboxByType: {
"*-down": { x1: 0, y1: 0, z1: 0,  x2: 1, y2: 0.5, z2: 1 },
"*-up": { x1: 0, y1: 0.5, z1: 0,  x2: 1, y2: 1, z2: 1 }
},
</syntaxhighlight>
 
Collision and selection boxes are most likely equal.
</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_collisionboxes" data-tt-parent="root">CollisionBoxes</div></td>
    <td>array of object</td>
    <td>-</td>
    <td>Defines multiple boxes with which the player collides with.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_collisionboxes_info" data-tt-parent="p_collisionboxes" data-invisible="true"></div></td>
    <td colspan="3">
A '''crate''' for example requires multiple collision boxes:
<syntaxhighlight lang="json">
collisionboxesByType: {
"*-opened": [
{ x1: 0, y1: 0, z1: 0, x2: 1, y2: 0.0625, z2: 1 },
{ x1: 0, y1: 0, z1: 0, x2: 1, y2: 1, z2: 0.0625 },
{ x1: 0, y1: 0, z1: 0, x2: 1, y2: 1, z2: 0.0625, rotateY: 90 },
{ x1: 0, y1: 0, z1: 0, x2: 1, y2: 1, z2: 0.0625, rotateY: 180 },
{ x1: 0, y1: 0, z1: 0, x2: 1, y2: 1, z2: 0.0625, rotateY: 270 },
]
},
</syntaxhighlight>
</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_selectionbox" data-tt-parent="root">SelectionBox</div></td>
    <td>object</td>
    <td>box (0,0,0 -> 1,1,1)</td>
    <td>Defines a box which the player's mouse pointer collides with for selection.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_selectionbox_info" data-tt-parent="p_selectionbox" data-invisible="true"></div></td>
    <td colspan="3">
A '''half slab''' for example, has either a box going from 0,0,0 to 1,0.5,1 or going from 0,0.5,0 to 1,1,1, depending on whether it is a slab is down or up:
<syntaxhighlight lang="json">
selectionboxByType: {
"*-down": { x1: 0, y1: 0, z1: 0,  x2: 1, y2: 0.5, z2: 1 },
"*-up": { x1: 0, y1: 0.5, z1: 0,  x2: 1, y2: 1, z2: 1 }
},
</syntaxhighlight>
 
Collision and selection boxes are most likely equal.
</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_selectionboxes" data-tt-parent="root">SelectionBoxes</div></td>
    <td>array of object</td>
    <td>-</td>
    <td>Defines multiple boxes which the player's mouse pointer collides with for selection.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_selectionboxes_info" data-tt-parent="p_selectionboxes" data-invisible="true"></div></td>
    <td colspan="3">
A '''crate''' for example requires multiple selection boxes:
<syntaxhighlight lang="json">
selectionboxesByType: {
"*-opened": [
{ x1: 0, y1: 0, z1: 0, x2: 1, y2: 0.0625, z2: 1 },
{ x1: 0, y1: 0, z1: 0, x2: 1, y2: 1, z2: 0.0625 },
{ x1: 0, y1: 0, z1: 0, x2: 1, y2: 1, z2: 0.0625, rotateY: 90 },
{ x1: 0, y1: 0, z1: 0, x2: 1, y2: 1, z2: 0.0625, rotateY: 180 },
{ x1: 0, y1: 0, z1: 0, x2: 1, y2: 1, z2: 0.0625, rotateY: 270 },
]
},
</syntaxhighlight>
</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_replaceable" data-tt-parent="root">Replaceable</div></td>
    <td>integer</td>
    <td>0</td>
    <td>A value usually between 0-9999 that indicates which blocks may be replaced with others.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_replaceable_info" data-tt-parent="p_replaceable" data-invisible="true"></div></td>
    <td colspan="3">
<table class="wikitable">
  <tr style="background-color: rgba(0,0,0,0.2);">
    <th style="background-color: rgba(0,0,0,0.2);">Value</th>
    <th style="background-color: rgba(0,0,0,0.2);">Effect (Blocks)</th>
  </tr>
  <tr>
    <td>'''0'''</td>
<td>'''''ordinary blocks''''' (stone for example)</td>
  </tr>
  <tr>
    <td>'''5000'''</td>
<td>Everything equal or above will be washed away by water (such as '''''Fruit''''').</td>
  </tr>
  <tr>
    <td>'''6000'''</td>
<td>Everything equal or above wwill replaced when the player tries to place a block (such as '''''Tallgrass''''').</td>
  </tr>
  <tr>
    <td>'''9000'''</td>
<td>'''''Lava'''''</td>
  </tr>
  <tr>
    <td>'''9500'''</td>
<td>'''''Water'''''</td>
  </tr>
  <tr>
    <td>'''9999'''</td>
<td>'''''Air'''''</td>
  </tr>
</table>
</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_fertility" data-tt-parent="root">Fertility</div></td>
    <td>integer</td>
    <td>0</td>
    <td>Which plants can grow on top of this block.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_fertility_info" data-tt-parent="p_fertility" data-invisible="true"></div></td>
    <td colspan="3">
<table class="wikitable">
  <tr style="background-color: rgba(0,0,0,0.2);">
    <th style="background-color: rgba(0,0,0,0.2);">Value</th>
    <th style="background-color: rgba(0,0,0,0.2);">Effect</th>
  </tr>
  <tr>
    <td>'''0'''</td>
<td>''nothing can grow.''</td>
  </tr>
  <tr>
    <td>'''10'''</td>
<td>''some tallgrass and small trees can be grow on it.''</td>
  </tr>
  <tr>
    <td>'''100'''</td>
<td>''all grass and trees can grow on it.''</td>
  </tr>
</table>
</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_glowlevel" data-tt-parent="root">GlowLevel</div></td>
    <td>0 ... 255</td>
    <td>0</td>
    <td>Causes the block to visually glow if Bloom is enabled. Basic glow level for all the blocks model elements.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_glowlevel_info" data-tt-parent="p_glowlevel" data-invisible="true"></div></td>
    <td colspan="3">
<table class="wikitable">
  <tr style="background-color: rgba(0,0,0,0.2);">
    <th style="background-color: rgba(0,0,0,0.2);">Blocks</th>
    <th style="background-color: rgba(0,0,0,0.2);">Value</th>
  </tr>
  <tr>
    <td>''Glacierice''</td>
<td>'''8'''</td>
  </tr>
  <tr>
    <td>''Paperlantern''</td>
<td>'''32'''</td>
  </tr>
  <tr>
    <td>''Ember''</td>
<td>'''48'''</td>
  </tr>
  <tr>
    <td>''Fire'', ''Firepit'', ''Oillamp'', ''Torch''</td>
<td>'''64'''</td>
  </tr>
  <tr>
    <td>''Lava''</td>
<td>'''128'''</td>
  </tr>
</table>
</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_lightabsorption" data-tt-parent="root">LightAbsorption</div></td>
    <td>0 ... 32</td>
    <td>0</td>
    <td>For light blocking blocks. Any value above 32 will completely block all light.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_walkspeedmultiplier" data-tt-parent="root">WalkspeedMultiplier</div></td>
    <td>decimal number</td>
    <td>1.0</td>
    <td>Percentage walk-speed when standing on or inside this block.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_walkspeedmultiplier_info" data-tt-parent="p_walkspeedmultiplier" data-invisible="true"></div></td>
    <td colspan="3">
<table class="wikitable">
  <tr style="background-color: rgba(0,0,0,0.2);">
    <th style="background-color: rgba(0,0,0,0.2);">Blocks</th>
    <th style="background-color: rgba(0,0,0,0.2);">Value</th>
  </tr>
  <tr>
    <td>''Spiderweb''</td>
<td>'''0.25'''</td>
  </tr>
  <tr>
    <td>''Stonepath''</td>
<td>'''1.15'''</td>
  </tr>
</table>
</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_dragmultiplier" data-tt-parent="root">DragMultiplier</div></td>
    <td>decimal number</td>
    <td>1.0</td>
    <td>Drag multiplier applied to entities standing on it (slipperiness factor).</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_dragmultiplier_info" data-tt-parent="p_dragmultiplier" data-invisible="true"></div></td>
    <td colspan="3">
<table class="wikitable">
  <tr style="background-color: rgba(0,0,0,0.2);">
    <th style="background-color: rgba(0,0,0,0.2);">Blocks</th>
    <th style="background-color: rgba(0,0,0,0.2);">Value</th>
  </tr>
  <tr>
    <td>''Glacierice'', ''Lakeice''</td>
<td>'''0.02'''</td>
  </tr>
</table>
</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_drops" data-tt-parent="root">Drops</div></td>
    <td>array of object</td>
    <td>-</td>
    <td>The items that should drop from breaking this block.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_drops_info" data-tt-parent="p_drops" data-invisible="true"></div></td>
    <td colspan="3">
 
'''Drop itself'''
 
If this property does not exist the block will drop itself.
 
----
 
'''No drop'''
 
A '''firepit''' for example doesn't drop anything. You can do so if you specify an empty array:
<syntaxhighlight lang="json">
drops: [],
</syntaxhighlight>
 
----
 
'''Special drop'''
 
You can also specify a special item/ block. Therefore you need to define an '''ItemStack''', with the given properties:
 
<table class="wikitable">
  <tr style="background-color: rgba(0,0,0,0.2);">
    <th style="background-color: rgba(0,0,0,0.2);">Property</th>
    <th style="background-color: rgba(0,0,0,0.2);">Default</th>
<th style="background-color: rgba(0,0,0,0.2);">Explanation</th>
  </tr>
  <tr>
    <td>'''type'''</td>
<td>''block''</td>
<td>Can either be '''''block''''' or '''''item'''''.</td>
  </tr>
  <tr>
    <td>'''code''' (required)</td>
<td>-</td>
<td>The complete code (can also include domain) of the item or block.</td>
  </tr>
  <tr>
    <td>'''lastdrop'''</td>
<td>false</td>
<td>If true and the quantity dropped is >=1 any subsequent drop in the list will be ignored.</td>
  </tr>
  <tr>
    <td>'''attributes'''</td>
<td>-</td>
<td>Tree Attributes that will be attached to the resulting itemstack.</td>
  </tr>
  <tr>
    <td>'''tool'''</td>
<td>-</td>
<td>If specified then given tool is required to break this block.</td>
  </tr>
  <tr>
    <td>'''quantity'''</td>
<td>- (one)</td>
<td>Determines the quantity of items which will be dropped.</td>
  </tr>
</table>
 
For example, the drop of a '''charcoalpile''' looks like this:
 
<syntaxhighlight lang="json">
drops: [
{ type: "item", code: "charcoal" }
],
</syntaxhighlight>
 
'''Tallgrass''' will only drop something if it's mined by a knife:
 
<syntaxhighlight lang="json">
drops: [
{ type: "item", code: "drygrass", tool: "knife"  },
],
</syntaxhighlight>
 
----
 
'''Chance drops'''
 
Let's take a look at an example. This is the drop property of rock:
 
<syntaxhighlight lang="json">
drops: [
{
type: "item",
code: "stone-{rock}",
quantity: { avg: 2.5, var: 0.5 }
},
]
</syntaxhighlight>
 
This will drop 2-3 blocks.
 
'''''avg''''': Stands for the default drop quantity. If var is 0 or not specified it will always drop the given average.
 
'''''var''''': How much the drop rate can vary. Meaning the drop rate can be <code>avg - var</code> at minimum and <code>age + var</code> at maximum.
 
For more information see [[NatFloat]] page.
 
----
'''Multiple Drops'''
 
Of course you can also define multiple drops at once. '''Sapling''' can drop a sapling and a stick:
 
<syntaxhighlight lang="json">
drops: [
{
type: "block",
code: "sapling-{wood}",
quantity: { avg: 0.02, var: 0 },
},
{
type: "item",
code: "stick",
quantity: { avg: 0.02, var: 0 },
}
],
</syntaxhighlight>
 
----
 
'''Last Drop'''
 
In order to add a special drop, which (if dropped) prevents all other drops, you can use the lastDrop property:
 
<syntaxhighlight lang="json">
dropsByType: {
"ore-quartz-*": [
{ type: "item", code: "clearquartz",  quantity: { avg: 0.2, var: 0 }, lastDrop: true },
{ type: "item", code: "ore-{ore}",  quantity: { avg: 1.25, var: 0 }  }
],
"*": [
{ type: "item", code: "ore-{ore}",  quantity: { avg: 1.25, var: 0 }  }
],
}
</syntaxhighlight>
 
Quartz ore will drop with a 20% chance clearquartz, if not it will drop the regular ore. If lastDrop wouldn't be true it could drop both at the same time.
</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_particleproperties" data-tt-parent="root">ParticleProperties</div></td>
    <td>array of object</td>
    <td>-</td>
    <td>Particles that should spawn in regular intervals from this block.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_particleproperties_info" data-tt-parent="p_particleproperties" data-invisible="true"></div></td>
    <td colspan="3">
{{:json:block:particle}}
</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_liquidlevel" data-tt-parent="root">LiquidLevel</div></td>
    <td>0 ... 7</td>
    <td>0</td>
    <td>Value between 0...7 for Liquids to determine the height of the liquid.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_cropprops" data-tt-parent="root">CropProps</div></td>
    <td>object</td>
    <td>-</td>
    <td>Information about the block as a crop.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_sounds" data-tt-parent="root">Sounds</div></td>
    <td>key: string, value: string</td>
    <td>-</td>
    <td>The sounds played for this block during step, break, build and walk.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_sounds_walk" data-tt-parent="p_sounds">Walk</div></td>
    <td colspan="3">An entity walks over it.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_sounds_inside" data-tt-parent="p_sounds">Inside</div></td>
    <td colspan="3">The player is inside the block.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_sounds_break" data-tt-parent="p_sounds">Break</div></td>
    <td colspan="3">Breaking the block.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_sounds_place" data-tt-parent="p_sounds">Place</div></td>
    <td colspan="3">Placing the block.</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_variantgroups" data-tt-parent="root">variantgroups</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_sounds_hit" data-tt-parent="p_sounds">Hit</div></td>
     <td>arrays</td>
     <td colspan="3">While mining the block.</td>
    <td></td>
    <td>Allows you define multiple variants of the same block.</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_blockmaterial" data-tt-parent="root">blockmaterial</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_sounds_ambient" data-tt-parent="p_sounds">Ambient</div></td>
     <td>string</td>
     <td colspan="3">Played from time to time if the player is close to it.</td>
    <td></td>
    <td>The blocks material. Amongst others, it will determine how quickly a specific tool can mine it.</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_blockmaterial_info" data-tt-parent="p_blockmaterial" data-invisible="true"></div></td>
     <td scope="row"><div class="tt" data-tt-id="p_sounds_info" data-tt-parent="p_sounds" data-invisible="true"></div></td>
     <td colspan="3">{{:json:block:material}}</td>
     <td colspan="3">
'''Anvil''':
<syntaxhighlight lang="json">
    sounds: {
        "place": "block/anvil",
        "break": "block/anvil"
    }
</syntaxhighlight>
 
'''Rails''':
<syntaxhighlight lang="json">
    sounds: {
        place": "block/planks",
        "walk": "walk/wood"
    }
</syntaxhighlight>
 
'''Water''':
<syntaxhighlight lang="json">
    sounds: {
        place: "block/water",
        inside: "walk/water",
        ambient: "environment/creek"
    },
</syntaxhighlight>
</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_resistance" data-tt-parent="root">resistance</div></td>
     <td colspan="4" class="propHeader"><b>Common</b></td>
    <td></td>
    <td></td>
    <td>How many seconds it takes to break the block (excluding speed mining bonus). Decimal numbers are allowed.</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_creativeinventory" data-tt-parent="root">creativeinventory</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_creativeinventory" data-tt-parent="root">CreativeInventory</div></td>
     <td>arrays</td>
     <td>key: string, value: string[]</td>
     <td></td>
     <td>-</td>
     <td>In which creative inventory tabs the block should be visible in.</td>
     <td>In which creative inventory tabs the block should be visible in.</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td colspan="4" style='font-size: 14pt; border-bottom: 2pt solid black; padding-left: 100px;'><b>Rendering</b></td>
    <td scope="row"><div class="tt" data-tt-id="p_creativeinventory_info" data-tt-parent="p_creativeinventory" data-invisible="true"></div></td>
     <td colspan="3">
There are several tabs to you can add your stuff. Note that general should always be included, since it should contain everything.
 
*general
*terrain
*flora
*construction
*decorative
*items
 
'''Rock''' adds all of it's variantions to general, terrain and construction:
<syntaxhighlight lang="json">
creativeinventory: { "general": ["*"], "terrain": ["*"], "construction": ["*"] },
</syntaxhighlight>
 
'''<code>*</code>''' reprents the variants which will be added. You can specify multiple and separate them with a comma. It follows the same way as the '''byType''' property.
 
A '''Torch''' on the other hand only adds the variation '''<code>up</code>''':
<syntaxhighlight lang="json">
creativeinventory: { "general": ["*-up"], "decorative": ["*-up"] },
</syntaxhighlight>
</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_maxstacksize" data-tt-parent="root">MaxStackSize</div></td>
    <td>integer</td>
    <td>64</td>
    <td>Determines the maximum amount you can stack the block in one slot.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_attackpower" data-tt-parent="root">AttackPower</div></td>
    <td>decimal number</td>
    <td>0.5</td>
    <td>The damage the deals when hitting an entity.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_attackrange" data-tt-parent="root">AttackRange</div></td>
    <td>decimal number</td>
    <td>1.5</td>
    <td>The maximum distance you can hit an entity.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_materialdensity" data-tt-parent="root">MaterialDensity</div></td>
    <td>integer</td>
    <td>9999</td>
    <td>Determines on whether an object floats on liquids or not.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_materialdensity_info" data-tt-parent="p_materialdensity" data-invisible="true"></div></td>
    <td colspan="3">
Water has a density of 1000, meaning everything below or equal will float on water. The same goes for lava which has a density of 5000.
</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_liquidselectable" data-tt-parent="root">LiquidSelectable</div></td>
    <td>boolean</td>
    <td>false</td>
    <td>If the block can select a liquid while holding it in hand.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_liquidselectable_info" data-tt-parent="p_liquidselectable" data-invisible="true"></div></td>
    <td colspan="3">
Used for buckets in order to fill it with water and to place waterlily on top of water.
</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_renderpass" data-tt-parent="root">renderpass</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_miningspeed" data-tt-parent="root">MiningSpeed</div></td>
     <td>string (of enum)</td>
     <td>key: string, value: decimal number</td>
     <td>opaque</td>
     <td>-</td>
     <td>Determines how the block will be drawn.</td>
     <td>The mining speed for each material.</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_opaque" data-tt-parent="p_renderpass">opaque</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_miningspeed" data-tt-parent="root">MiningTier</div></td>
     <td></td>
     <td>integer</td>
     <td>0</td>
     <td>0</td>
     <td>Used for solid blocks with no half transparency.</td>
     <td>Determines which blocks it can break. If the required miningtier is above the defined one there will be no drop from it.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_attributes" data-tt-parent="root">Attributes</div></td>
    <td>key: string, value: object</td>
    <td>-</td>
    <td>Custom Attributes associated with this block.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_attributes_info" data-tt-parent="p_attributes" data-invisible="true"></div></td>
    <td colspan="3">
Extra attributes added to a block. Those are final and cannot be modified. It's a good way to keep things organized and and modifiable. The '''oreblastingbomb''' for example has attributes, which define its radius and type. These can be used by behaviors and blockentities:
<syntaxhighlight lang="json">
    attributes: {
"blastRadius": 4,
"blastType": 0,
},
</syntaxhighlight>
</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_combustibleprops" data-tt-parent="root">CombustibleProps</div></td>
    <td>object</td>
    <td>-</td>
    <td>Information about the blocks burnable states.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_burntemperature" data-tt-parent="p_combustibleprops">BurnTemperature</div></td>
    <td>integer</td>
    <td>-</td>
    <td>The temperature at which it burns in degrees Celsius.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_burnduration" data-tt-parent="p_combustibleprops">BurnDuration</div></td>
    <td>decimal number</td>
    <td>-</td>
    <td>For how long it burns in seconds.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_heatresistance" data-tt-parent="p_combustibleprops">HeatResistance</div></td>
    <td>integer</td>
    <td>500</td>
    <td>How many degrees celsius it can resists before it ignites (not implemented yet).</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_meltingpoint" data-tt-parent="p_combustibleprops">MeltingPoint</div></td>
    <td>integer</td>
    <td>-</td>
    <td>How many degrees celsius it takes to smelt/transform this into another. Only used when put in a stove and SmeltedStack is set.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_meltingduration" data-tt-parent="p_combustibleprops">MeltingDuration</div></td>
    <td>decimal number</td>
    <td>-</td>
    <td>For how many seconds the temperature has to be above the melting point until the item is smelted.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_smokelevel" data-tt-parent="p_combustibleprops">SmokeLevel</div></td>
    <td>decimal number</td>
    <td>1</td>
    <td>How much smoke this item produces when being used as fuel.</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_opaquenocull" data-tt-parent="p_renderpass">opaquenocull</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_smeltedratio" data-tt-parent="p_combustibleprops">SmeltedRatio</div></td>
     <td></td>
     <td>integer</td>
     <td>1</td>
     <td>1</td>
     <td>Used for non-solid single faced blocks, such as tall grass.</td>
     <td>How many ores are required to produce one output stack.</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_transparent" data-tt-parent="p_renderpass">transparent</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_liquidlevel" data-tt-parent="p_combustibleprops">SmeltedStack</div></td>
     <td></td>
     <td>object</td>
     <td>2</td>
     <td>-</td>
     <td>Use for solid halftransparent blocks, such as glass</td>
     <td>If set, the block/item is smeltable in a furnace and this is the resulting itemstack once the MeltingPoint has been reached for the supplied duration.</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_liquid" data-tt-parent="p_renderpass">liquid</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_requirescontainer" data-tt-parent="p_combustibleprops">RequiresContainer</div></td>
     <td></td>
     <td>boolean</td>
     <td>3</td>
     <td>true</td>
     <td>Used for liquids, produces waves.</td>
     <td>If set to true, the block/item requires a smelting/cooking/baking container such as the Crucible. If false, it can be directly baked/melted without smelting/cooking/baking container.</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_topsoil" data-tt-parent="p_renderpass">topsoil</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_combustibleprops_info" data-tt-parent="p_combustibleprops" data-invisible="true"></div></td>
     <td></td>
     <td colspan="3">
     <td>4</td>
This property can be used to define a burning material. '''Plank''' for example can get on fire:
     <td>Used for grass covered blocks. Allows for a smooth transition from grass to soil, while still allowing climate tinting of grass.</td>
<syntaxhighlight lang="json">
     combustibleProps: {
        burnTemperature: 800,
        burnDuration: 12,
    },
</syntaxhighlight>
 
Furthermore it can be used to define smelting processes. An example would be an '''ingotmold''' which turns into an ingotmold-burned:
<syntaxhighlight lang="json">
     combustiblePropsByType: {
        "ingotmold-raw": {
            meltingPoint: 600,
            meltingDuration: 30,
            smeltedRatio: 1,
            smeltedStack: { type: "block", code: "ingotmold-burned" },
            requiresContainer: false
        }
    },
</syntaxhighlight>
</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_shape" data-tt-parent="root">shape</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_nutritionprops" data-tt-parent="root">NutritionProps</div></td>
     <td>shape</td>
     <td>object</td>
     <td></td>
     <td>-</td>
     <td>For the json drawtype, the shape definition of the block as shown in the world, dropped on the ground or held in hand.</td>
     <td>Information about the blocks nutrients.</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_base" data-tt-parent="p_shape">base</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_nutritionprops_foodcategory" data-tt-parent="p_nutritionprops">FoodCategory</div></td>
     <td></td>
     <td>string</td>
     <td></td>
     <td>-</td>
     <td>The path to the shape json file, the base dir is ''assets/shapes/''.</td>
     <td>Defines the type of food. It can be '''''fruit''''', '''''vegetable''''', '''''protein''''', '''''grain''''' and '''''dairy'''''.</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_rotateX" data-tt-parent="p_shape">rotateX</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_nutritionprops_saturation" data-tt-parent="p_nutritionprops">Saturation</div></td>
     <td>float</td>
     <td>decimal number</td>
     <td>0</td>
     <td>0</td>
     <td></td>
     <td>How much saturation it can restore.</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_rotateY" data-tt-parent="p_shape">rotateY</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_nutritionprops_health" data-tt-parent="p_nutritionprops">Health</div></td>
     <td>float</td>
     <td>decimal number</td>
     <td>0</td>
     <td>0</td>
    <td>How much health it can restore.</td>
  </tr>
  <tr>
    <td colspan="4" class="propHeader"><b>Rendering</b></td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_textures" data-tt-parent="root">Textures</div></td>
    <td>key: string, value: object</td>
     <td></td>
     <td></td>
    <td>The texture definitions for the block as seen in the world, when dropped on the ground or held in the hand. Within a mod, to refer to a texture from the base game, prefix the path with "game:" (i.e. base: "game:path/to/texture") </td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_rotateZ" data-tt-parent="p_shape">rotateZ</div></td>
     <td scope="row" valign="top"><div class="tt" data-tt-id="p_textures_base" data-tt-parent="p_textures">base</div><br><br><div class="tt" data-tt-id="p_textures_overlays" data-tt-parent="p_textures">overlays</div><br><br><div class="tt" data-tt-id="p_textures_base" data-tt-parent="p_textures">alternates</div></td>
     <td>float</td>
     <td colspan="3">{{:json:block:texture}}</td>
     <td>0</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_texturesinventory" data-tt-parent="root">TexturesInventory</div></td>
     <td>key: string, value: object</td>
     <td></td>
     <td></td>
    <td>The texture definitions for the block as seen in the player inventory. Overrides the textures.</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_shapeinventory" data-tt-parent="root">shapeinventory</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_shape" data-tt-parent="root">Shape</div></td>
     <td>shape</td>
     <td>object</td>
     <td></td>
     <td>-</td>
     <td>For the json drawtype, the shape definition of the block as shown in the players inventory.</td>
     <td>For the json drawtype, the shape definition of the block as shown in the world, dropped on the ground or held in hand.</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_invbase" data-tt-parent="p_shapeinventory">base</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_base" data-tt-parent="p_shape">base</div></td>
     <td></td>
     <td></td>
     <td></td>
     <td></td>
Line 171: Line 1,119:
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_invrotateX" data-tt-parent="p_shapeinventory">rotateX</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_rotateX" data-tt-parent="p_shape">rotateX</div></td>
     <td>float</td>
     <td>float</td>
     <td>0</td>
     <td>0</td>
     <td></td>
     <td>Only 90 degree rotations are possible.</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_invrotateY" data-tt-parent="p_shapeinventory">rotateY</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_rotateY" data-tt-parent="p_shape">rotateY</div></td>
     <td>float</td>
     <td>float</td>
     <td>0</td>
     <td>0</td>
     <td></td>
     <td>Only 90 degree rotations are possible.</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_invrotateZ" data-tt-parent="p_shapeinventory">rotateZ</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_rotateZ" data-tt-parent="p_shape">rotateZ</div></td>
     <td>float</td>
     <td>float</td>
     <td>0</td>
     <td>0</td>
     <td></td>
     <td>Only 90 degree rotations are possible.</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_ambientocclusion" data-tt-parent="root">ambientocclusion</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_shapeinventory" data-tt-parent="root">ShapeInventory</div></td>
     <td>boolean</td>
     <td>object</td>
     <td>true</td>
     <td>-</td>
     <td>If ambient occlusion will be applied to the block.</td>
     <td>For the json drawtype, the shape definition of the block as shown in the players inventory.</td>
   </tr>
   </tr>
  <tr>
  <tr>
     <td scope="row"><div class="tt" data-tt-id="p_drawtype" data-tt-parent="root" hide="children">drawtype</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_drawtype" data-tt-parent="root">DrawType</div></td>
     <td>string (of enum)</td>
     <td>string</td>
     <td>cube</td>
     <td>&quot;cube&quot;</td>
     <td>Determines how the block is tesselated, select JSON for being able to use custom JSON Models. The other values are hardcoded methods of tesselating the block. Check [[Drawtypes]] for a full list.</td>
     <td>Determines how the block is tesselated, select JSON for being able to use custom JSON Models. The other values are hardcoded methods of tesselating the block.</td>
   </tr>
   </tr>
   <tr>
   <tr>
Line 285: Line 1,233:
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_textures" data-tt-parent="root">textures</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_renderpass" data-tt-parent="root">RenderPass</div></td>
     <td>key: direction, value: texture</td>
     <td>string</td>
    <td>&quot;opaque&quot;</td>
    <td>Determines how the block will be drawn.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_opaque" data-tt-parent="p_renderpass">opaque</div></td>
    <td></td>
    <td>0</td>
    <td>Used for solid blocks with no half transparency.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_opaquenocull" data-tt-parent="p_renderpass">opaquenocull</div></td>
     <td></td>
     <td></td>
     <td>The texture definitions for the block as seen in the world, when dropped on the ground or held in the hand.</td>
     <td>1</td>
    <td>Used for non-solid single faced blocks, such as tall grass.</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row" valign="top"><div class="tt" data-tt-id="p_textures_base" data-tt-parent="p_textures">base</div><br><br><div class="tt" data-tt-id="p_textures_overlays" data-tt-parent="p_textures">overlays</div><br><br><div class="tt" data-tt-id="p_textures_base" data-tt-parent="p_textures">alternates</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_transparent" data-tt-parent="p_renderpass">transparent</div></td>
     <td colspan="3">{{:json:block:texture}}</td>
    <td></td>
    <td>2</td>
    <td>Use for solid halftransparent blocks, such as glass</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_liquid" data-tt-parent="p_renderpass">liquid</div></td>
     <td></td>
    <td>3</td>
    <td>Used for liquids, produces waves.</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_texturesinventory" data-tt-parent="root">texturesinventory</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_topsoil" data-tt-parent="p_renderpass">topsoil</div></td>
    <td>key: direction, value: texture</td>
     <td></td>
     <td></td>
     <td>The texture definitions for the block as seen in the player inventory. Overrides the textures definition if set.</td>
     <td>4</td>
    <td>Used for grass covered blocks. Allows for a smooth transition from grass to soil, while still allowing climate tinting of grass.</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_sideopaque" data-tt-parent="root">sideopaque</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_ambientocclusion" data-tt-parent="root">AmbientOcclusion</div></td>
     <td>key: direction, value: boolean</td>
     <td>boolean</td>
     <td>true</td>
     <td>true</td>
    <td>If ambient occlusion will be applied to the block.</td>
  </tr>
<tr>
    <td scope="row"><div class="tt" data-tt-id="p_tintindex" data-tt-parent="root">TintIndex</div></td>
    <td>integer</td>
    <td>0</td>
    <td>'''''0''''' for no tint, '''''1''''' for plant climate tint, '''''2''''' for water climate tint.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_renderflags" data-tt-parent="root">RenderFlags</div></td>
    <td>0 ... 255</td>
    <td>0</td>
    <td>8 bits that are sent to the graphics card for each vertex of the blocks shape. The lower 3 bits are currently used for altering the vertexes z-depth to fix a bunch of z-fighting issues.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_facecullmode" data-tt-parent="root">FaceCullMode</div></td>
    <td>string</td>
    <td>&quot;default&quot;</td>
    <td>Determines which sides of the blocks should be rendered.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_facecullmode_default" data-tt-parent="p_facecullmode">Default</div></td>
    <td></td>
    <td>0</td>
    <td>Culls faces if they are opaque faces adjacent to opaque faces.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_facecullmode_default" data-tt-parent="p_facecullmode">NeverCull</div></td>
    <td></td>
    <td>1</td>
    <td>Never culls any faces.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_facecullmode_default" data-tt-parent="p_facecullmode">Merge</div></td>
    <td></td>
    <td>2</td>
    <td>Culls all faces that are adjacent to opaque faces and faces adjacent to blocks of the same id (Example usage: Ice blocks).</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_facecullmode_default" data-tt-parent="p_facecullmode">Collapse</div></td>
    <td></td>
    <td>3</td>
    <td>Culls all faces that are adjacent to opaque faces and the bottom, east or south faces adjacent to blocks of the same id. This causes to still leave one single face in between instead of 2, eliminating any z-fighting.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_facecullmode_default" data-tt-parent="p_facecullmode">MergeMaterial</div></td>
    <td></td>
    <td>4</td>
    <td>Same as Merge but checks for equal material (Example usage: Plain glass and all colored glass blocks).</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_facecullmode_default" data-tt-parent="p_facecullmode">CollapseMaterial</div></td>
    <td></td>
    <td>5</td>
    <td>Same as Collapse but checks for equal material (Example usage: All leaves blocks).</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_facecullmode_default" data-tt-parent="p_facecullmode">Liquid</div></td>
    <td></td>
    <td>6</td>
    <td>Same as CollapseMaterial but also culls faces towards opaque blocks.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_sideopaque" data-tt-parent="root">SideOpaque</div></td>
    <td>key: string, value: boolean</td>
    <td>-</td>
     <td>Determines if given block face is fully opaque. If yes, the opposite face of the adjacent block will not be drawn for efficiency reasons.</td>
     <td>Determines if given block face is fully opaque. If yes, the opposite face of the adjacent block will not be drawn for efficiency reasons.</td>
   </tr>
   </tr>
Line 309: Line 1,343:
     <td scope="row">
     <td scope="row">
         <div class="tt" data-tt-id="p_sideopaque_all" data-tt-parent="p_sideopaque">all</div><br>
         <div class="tt" data-tt-id="p_sideopaque_all" data-tt-parent="p_sideopaque">all</div><br>
<div class="tt" data-tt-id="p_sideopaque_horizontals" data-tt-parent="p_sideopaque">horizontals</div><br>
<div class="tt" data-tt-id="p_sideopaque_verticals" data-tt-parent="p_sideopaque">verticals</div><br>
         <div class="tt" data-tt-id="p_sideopaque_east" data-tt-parent="p_sideopaque">east</div><br>
         <div class="tt" data-tt-id="p_sideopaque_east" data-tt-parent="p_sideopaque">east</div><br>
         <div class="tt" data-tt-id="p_sideopaque_west" data-tt-parent="p_sideopaque">west</div><br>
         <div class="tt" data-tt-id="p_sideopaque_west" data-tt-parent="p_sideopaque">west</div><br>
Line 321: Line 1,357:
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_sidesolid" data-tt-parent="root">sidesolid</div></td>
    <td scope="row"><div class="tt" data-tt-id="p_sideao" data-tt-parent="root">SideAo</div></td>
     <td>key: direction, value: boolean</td>
    <td>key: string, value: boolean</td>
     <td>true</td>
    <td>-</td>
     <td>Determins if given block side is solid. If true, other blocks like torches can be attached to it</td>
    <td>If AmbientOcclusion will be applied for each side.</td>
  </tr>
  <tr>
    <td scope="row">
        <div class="tt" data-tt-id="p_sideao_all" data-tt-parent="p_sideao">all</div><br>
<div class="tt" data-tt-id="p_sideao_horizontals" data-tt-parent="p_sideao">horizontals</div><br>
<div class="tt" data-tt-id="p_sideao_verticals" data-tt-parent="p_sideao">verticals</div><br>
        <div class="tt" data-tt-id="p_sideao_east" data-tt-parent="p_sideao">east</div><br>
        <div class="tt" data-tt-id="p_sideao_west" data-tt-parent="p_sideao">west</div><br>
        <div class="tt" data-tt-id="p_sideao_up" data-tt-parent="p_sideao">up</div><br>
        <div class="tt" data-tt-id="p_sideao_down" data-tt-parent="p_sideao">down</div><br>
        <div class="tt" data-tt-id="p_sideao_north" data-tt-parent="p_sideao">north</div><br>
        <div class="tt" data-tt-id="p_sideao_south" data-tt-parent="p_sideao">south</div>
    </td>
    <td></td>
    <td></td>
    <td></td>
  </tr>
  <tr>
     <td scope="row"><div class="tt" data-tt-id="p_sidesolid" data-tt-parent="root">SideSolid</div></td>
     <td>key: string, value: boolean</td>
     <td>-</td>
     <td>Determins if given block side is solid. If true, other blocks like torches can be attached to it.</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row">
     <td scope="row">
         <div class="tt" data-tt-id="p_sidesolid_all" data-tt-parent="p_sidesolid">all</div><br>
         <div class="tt" data-tt-id="p_sidesolid_all" data-tt-parent="p_sidesolid">all</div><br>
<div class="tt" data-tt-id="p_sidesolid_horizontals" data-tt-parent="p_sidesolid">horizontals</div><br>
<div class="tt" data-tt-id="p_sidesolid_verticals" data-tt-parent="p_sidesolid">verticals</div><br>
         <div class="tt" data-tt-id="p_sidesolid_east" data-tt-parent="p_sidesolid">east</div><br>
         <div class="tt" data-tt-id="p_sidesolid_east" data-tt-parent="p_sidesolid">east</div><br>
         <div class="tt" data-tt-id="p_sidesolid_west" data-tt-parent="p_sidesolid">west</div><br>
         <div class="tt" data-tt-id="p_sidesolid_west" data-tt-parent="p_sidesolid">west</div><br>
Line 341: Line 1,401:
   </tr>
   </tr>
   <tr>
   <tr>
     <td colspan="4" style='font-size: 14pt; border-bottom: 2pt solid black; padding-left: 100px;'><b>Sound</b></td>
     <td scope="row"><div class="tt" data-tt-id="p_randomdrawoffset" data-tt-parent="root">RandomDrawOffset</div></td>
    <td>boolean</td>
    <td>false</td>
    <td>If true then the block will be randomly offseted by 1/3 of a block when placed.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_lighthsv" data-tt-parent="root">LightHsv</div></td>
    <td>byte array with 3 elements. See http://tyron.at/vs/vslightwheel.html for valid values</td>
    <td>-</td>
    <td>For light emitting blocks: hue, saturation and brightness value.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_lightabsorption" data-tt-parent="root">LightAbsorption</div></td>
    <td>0 ... 255</td>
    <td>99</td>
    <td>For light blocking blocks. Any value above 32 will completely block all light.</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_sounds" data-tt-parent="root">sounds</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_guitransform" data-tt-parent="root">GuiTransform</div></td>
     <td>key: string, value: string</td>
     <td>object</td>
     <td></td>
    <td>block default</td>
     <td>The sounds to be played when a player interacts with this block.</td>
    <td>Used for scaling, rotation or offseting the block when rendered in guis.</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_fphandtransform" data-tt-parent="root">FpHandTransform</div></td>
    <td>object</td>
     <td>block default</td>
     <td>Used for scaling, rotation or offseting the block when rendered in the first person mode hand.</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_place" data-tt-parent="p_sounds">place</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_tphandtransform" data-tt-parent="root">TpHandTransform</div></td>
     <td></td>
     <td>object</td>
     <td>player/build</td>
     <td>block default</td>
     <td>Sound to played when placing this block.</td>
     <td>Used for scaling, rotation or offseting the block when rendered in the third person mode hand.</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_walk" data-tt-parent="p_sounds">walk</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_groundtransform" data-tt-parent="root">GroundTransform</div></td>
     <td></td>
     <td>object</td>
     <td>walk/default</td>
     <td>block default</td>
     <td>Sound to played when walking on this block.</td>
     <td>Used for scaling, rotation or offseting the rendered as a dropped item on the ground.</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_break" data-tt-parent="p_sounds">break</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_randomizeaxes" data-tt-parent="root">RandomizeAxes</div></td>
     <td></td>
     <td>string</td>
     <td>player/destruct</td>
     <td>&quot;xyz&quot;</td>
     <td>Sound to played when breaking this block.</td>
     <td>Random texture selection - whether or not to use the Y axis during randomization (for multiblock plants).</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_hit" data-tt-parent="p_sounds">hit</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_randomizeaxes_xyz" data-tt-parent="p_randomizeaxes">XYZ</div></td>
    <td></td>
    <td>0</td>
     <td></td>
     <td></td>
    <td>-</td>
    <td>Currently unused.</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_inside" data-tt-parent="p_sounds">inside</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_randomizeaxes_xz" data-tt-parent="p_randomizeaxes">XZ</div></td>
    <td></td>
    <td>1</td>
     <td></td>
     <td></td>
    <td>-</td>
    <td>Sound to played when moving inside block (only works for blocks that have no collisionbox, naturally).</td>
   </tr>
   </tr>
</table>
</table>
{{Navbox/modding|Vintage Story}}
Confirmedusers, Bureaucrats, editor, Administrators
1,778

edits