Modding:Block Json Properties: Difference between revisions

From Vintage Story Wiki
no edit summary
(Marked this version for translation)
No edit summary
 
(12 intermediate revisions by one other user not shown)
Line 3: Line 3:
__NOTOC__
__NOTOC__
== Overview == <!--T:1-->
== Overview == <!--T:1-->
A complete list of all available propertiesr
This table was once complete, but it is now missing some new properties. In the code, these come from the fields listed with the "[JsonProperty]" attribute in [https://github.com/anegostudios/vsessentialsmod/blob/master/Loading/BlockType.cs BlockType.cs], plus the fields from the parent classes [https://github.com/anegostudios/vsessentialsmod/blob/master/Loading/CollectibleType.cs CollectibleType.cs] and [https://github.com/anegostudios/vsessentialsmod/blob/master/Loading/RegistryObjectType.cs RegistryObjectType.cs]. The json parser is case insensitive, which is how the property names can have different capitalization in the code and in the table below.


<!--T:2-->
<!--T:2-->
Line 80: Line 80:
     <td>array of objects</td>
     <td>array of objects</td>
     <td>-</td>
     <td>-</td>
     <td>Allows you define multiple variants of the same item.</td>
     <td>Allows you define multiple [[Modding:Registry_Object_JSON_Parsing|variants]] of the same block.</td>
     <td>armor, ore-graded, plank, </td>
     <td>armor, ore-graded, plank, </td>
   </tr>
   </tr>
   <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 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>Allows different property values to be [[Modding:Registry_Object_JSON_Parsing#ByType_properties|specified]] based on the variant code.</td>
  </tr>
<tr>
  <td scope="row"><div class="tt" data-tt-id="p_allowedVariants" data-tt-parent="root">allowedVariants</div></td>
  <td>array of strings</td>
  <td>-</td>
  <td>Used to [[Modding:Registry_Object_JSON_Parsing#Filtering_out_variants|trim]] unnecessary blocks generated by combined variants. </td>
  <td>crystalizedore-graded, ore-graded, ore-ungraded</td>
</tr>
<tr>
  <td scope="row"><div class="tt" data-tt-id="p_skipVariants" data-tt-parent="root">skipVariants</div></td>
  <td>array of strings</td>
  <td>-</td>
  <td>Similar to allowedVariants, but instead [[Modding:Registry_Object_JSON_Parsing#Filtering_out_variants|skips]] the creation of listed variants rather than assigning which are allowed. </td>
  <td>armor</td>
</tr>
  <tr>
    <td colspan="5" style='font-size: 14pt; border-bottom: 2pt solid black; padding-left: 100px;'><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>&quot;block&quot;</td>
    <td>The block class can add special functionalities for the block.</td>
    <td>anvil, firepit, quern, skep</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="4">
     <td colspan="4">
The variantgroups property allows you to define multiple variants of this item. All of them will have their unique pattern, which will be added to the item code.
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]]. An ongoing list of block classes used in JSONS can also be found [[Block Classes|here]].
 
</td>
An easy example would be a bowl, which can either be raw or burned:
  </tr>
<syntaxhighlight lang="json">
  <tr>
code: "bowl",
    <td scope="row"><div class="tt" data-tt-id="p_entityclass" data-tt-parent="root">entityclass</div></td>
variantgroups: [
    <td>string</td>
{ code:"type", states: ["raw", "burned"] },
    <td>-</td>
],
    <td>The block entity class is able to tick and to store extra data. Allows for much more advanced properties.</td>
</syntaxhighlight>
    <td>anvil, firepit, quern, skep</td>
 
  </tr>
Meaning there will be two variants <code>bowl-raw</code> and <code>bowl-burned</code>.
<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>
It's also possible to define multiple groups.  
    <td>A behavior adds custom abilities such as falling block.</td>
 
    <td>gravel, lantern, log, rock, torch</td>
<syntaxhighlight lang="json">
  </tr>
code: "barrel",
  <tr>
variantgroups: [
    <td scope="row"><div class="tt" data-tt-id="p_behaviors_info" data-tt-parent="p_behaviors" data-invisible="true"></div></td>
{ code:"state", states: ["closed", "opened"] },
    <td colspan="4">
{ code:"contents", states: ["empty", "cabbage"] },
Behaviors are useful traits as many can be assigned to a single block. 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]]
</syntaxhighlight>
</td>
 
  </tr>
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>.
<tr>
 
    <td scope="row"><div class="tt" data-tt-id="p_ebehaviors" data-tt-parent="root">entityBehaviors</div></td>
----
    <td>array of object</td>
 
    <td>-</td>
Additionally it is possible to refer to external lists (used for blocks) 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:
    <td>An entity behavior adds custom abilities to an entity assigned to a block, such as the mechanical power properties of the windmill.</td>
<syntaxhighlight lang="json">
    <td>angledgears, axle, brake, clutch, helvehammerbase, toggle, transmission, windmillrotor</td>
variantgroups: [
  </tr>
{ loadFromProperties: "block/rock" },
  <tr>
],
    <td scope="row"><div class="tt" data-tt-id="p_ebehaviors_info" data-tt-parent="p_ebehaviors" data-invisible="true"></div></td>
</syntaxhighlight>
    <td colspan="4">
Block entity behaviors are expanded capabilities that regular behaviors cannot accomplish. At the moment they are only used for Mechanical Power blocks, but if you're looking to make your own you can look through the existing files at the Vintage Story Github [https://github.com/anegostudios/vssurvivalmod/tree/master/Systems/MechanicalPower/BlockEntityBehavior here ].


Here is a full list of all groups and their variants (you can also find them in the <code>assets/worldproperties</code> folder):
To see all of the current block entity behaviors in the game see [[Modding:Block_Entity_Behaviors|All Block Entity Behaviors]].
{{:json:block:worldvariantgroups}}
</td>
  </tr>
----
  <tr>
 
    <td scope="row"><div class="tt" data-tt-id="p_entityclass_info" data-tt-parent="p_entityclass" data-invisible="true"></div></td>
Furthermore there are other ways of combining groups together. So far we covered the default combination mode, which is <code>Multiply</code> (the total count of variants is the product of all states). There are two other methods, Add and SelectiveMultiply.
    <td colspan="4">
 
A chest for example uses the BlockEntity to store the inventory. A tutorial of creating your own entityclass can be found [[Block Entity|here]]. You can also find every existing block entity and their relevant github links [[Block Entities|here]].
Let's take a look at the <code>Add</code> combination mode used in this example of a flowerpot block:
</td>
 
<syntaxhighlight lang="json">
code: "flowerpot",
variantgroups: [
{ code: "type", states: ["raw"] },
{ code: "empty", states: ["empty"], combine: "Add" },
{ code: "flower", loadFromProperties: "block/flower", combine: "Add" },
{ code: "mushroom", loadFromProperties: "block/mushroom", combine: "Add" },
{ code: "sapling", loadFromProperties: "block/wood", combine: "Add" },
],
</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>Add</code> mode could also be called separate, since it defines a variant separate from all the other groups:
 
<syntaxhighlight lang="json">
code: "thingy",
variantgroups: [
{ code: "something", states: ["same", "different"] },
{ code: "type", states: ["raw", "baked"] },
{ code: "empty", states: ["red", "green"], "combine": "Add" },
],
</syntaxhighlight>
 
In this case, the result would be <code>thingy-same-raw</code>, <code>thingy-same-baked</code>, <code>thingy-different-raw</code>, <code>thingy-different-baked</code>, <code>thingy-red</code> and <code>thingy-green</code>
 
The third combination mode <code>"SelectiveMultiply"</code> which allows you to specify which variant groups you want to combine multiplicatively with. There are many examples of this in the clothing item JSONS, as shown below with this example of a lowerbody asset:
 
<syntaxhighlight lang="json">
    code: "clothes",
    variantgroups: [
{ code: "category",  states: ["lowerbody"] },
{ code: "lowerbody", combine: "SelectiveMultiply", onVariant: "category", states: [
"aristocrat-leggings", "dirty-linen-trousers", "fine-trousers", "jailor-pants", "lackey-breeches", "merchant-pants", "messenger-trousers", "minstrel-pants", "noble-pants", "prince-breeches", "raindeer-trousers", "raw-hide-trousers", "shepherd-pants", "squire-pants", "steppe-shepherds-trousers", "tattered-peasent-gown", "torn-riding-pants", "warm-woolen-pants", "woolen-leggings", "workmans-gown"
        ] },
],
</syntaxhighlight>
 
The parameter <code>onVariant</code> specifies which variant group (by using that groups <code>code</code>) to target and the <code>code</code> specifies which of the target variant groups <code>states</code> (only one) to selectively combine with, ignoring all other variants without that specific state.
 
Using this will result items called <code>clothes-lowerbody-aristocrat-leggings</code>, <code>clothes-lowerbody-dirty-linen-trousers</code>, etc.
 
'''Variant group placeholder:'''
 
Since Vintagestory v1.8 it is also possible to use the variantgroups codes as placeholders (<code>{variant_group_code}</code>) in for example paths to textures.:
<syntaxhighlight lang="json">
code: "axe",
variantgroups: [
{ code: "metal", states: ["copper", "tinbronze", "bismuthbronze", "blackbronze", "gold", "silver", "iron" ] },
],
textures: {
"metal": { base: "block/metal/ingot/{metal}" },
"wood": { base: "item/tool/material/wood" }
},
</syntaxhighlight>
 
Now the <code>metal</code> texture path will change based on the variant. For example the variant <code>axe-copper</code> will use <code>block/metal/ingot/copper</code> as its <code>metal</code> texture.
 
    </td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_byType" data-tt-parent="root">(any) bytype</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_blockmaterial" data-tt-parent="root">blockmaterial</div></td>
     <td>key: string; value: object</td>
     <td>string</td>
     <td>-</td>
     <td>-</td>
     <td>You can create properties for certain variants of the item.</td>
     <td>A behavior adds custom abilities such as falling block.</td>
    <td>gravel</td>   
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_byType_info" data-tt-parent="p_byType" data-invisible="true"></div></td>
     <td scope="row"><div class="tt" data-tt-id="p_blockmaterial_info" data-tt-parent="p_blockmaterial" data-invisible="true"></div></td>
     <td colspan="4">
     <td colspan="4">
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:
Materials are hardcoded and currently only used to determine mining speed with a specific tool. The following materials are available:
<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).
''Brick, Ceramic, Cloth, Fire, Glass, Gravel, Ice, Lava, Leaves, Liquid, Mantle, Metal, Other, Plant, Sand, Snow, Soil, Stone, Wood''
</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>
    <td> water </td>
  </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 colspan="4">
Used for special collision behavior and rendering. Currently used for lava and water, which are liquids (All other blocks default to solid).


A slab for example has two variants ('''up''', '''down'''), which have different collision boxes:
Gas and plasma are not yet implemented.
<syntaxhighlight lang="json">
    </td>
collisionboxByType: {
  </tr>
"*-down": { x1: 0, y1: 0, z1: 0,  x2: 1, y2: 0.5, z2: 1 },
  <tr>
"*-up": { x1: 0, y1: 0.5, z1: 0,  x2: 1, y2: 1, z2: 1 }
    <td scope="row"><div class="tt" data-tt-id="p_resistance" data-tt-parent="root">resistance</div></td>
},
    <td>decimal number</td>
</syntaxhighlight>
    <td>6</td>
 
    <td>How long it takes to break this block in seconds (with a mining speed of 1).</td>
The char '''<code>*</code>''' stands for anything. In this case it ignores the code of the item.
     <td>leaves, meteorite, sand</td>
 
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>
 
     </td>
   </tr>
   </tr>
<tr>
  <tr>
  <td scope="row"><div class="tt" data-tt-id="p_allowedVariants" data-tt-parent="root">allowedVariants</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_resistance_info" data-tt-parent="p_resistance" data-invisible="true"></div></td>
  <td>array of strings</td>
  <td>-</td>
  <td>Used to trim unnecessary items generated by combined variants. </td>
  <td>crystalizedore-graded, ore-graded, ore-ungraded</td>
</tr>
<tr>  
     <td scope="row"><div class="tt" data-tt-id="p_allowedVariants_info" data-tt-parent="p_allowedVariants" data-invisible="true"></div></td>
     <td colspan="4">
     <td colspan="4">
By using the <code>allowedVariants</code> you can specify which variants you want to be generated. Looks at this example of different armor parts (uses both <code>allowedVariants</code> and <code>skipVariants</code>):
Resistance values range from very low with leaves (0.5) to the average of stone (6) to the very high resistance value of meteoric iron deposits (60).
<syntaxhighlight lang="json">
code: "armor",
variantgroups: [
{ code: "bodypart",  states: ["head", "body", "legs"] },
{ code: "construction",  states: [
"improvised",
"jerkin",
"lamellar",
"sewn",
"brigandine",
"chain",
"scale",
"plate"
]},
{ code: "material", states: [
"wood",
"leather",
"linen",
"copper",
"tinbronze",
"bismuthbronze",
"blackbronze",
"iron",
"steel",
"gold",
"silver"
]},
],
skipVariants: [
"armor-*-brigandine-leather",
"armor-*-brigandine-linen",
"armor-*-brigandine-wood",
"armor-*-brigandine-gold",
"armor-*-brigandine-silver",
"armor-*-chain-leather",
"armor-*-chain-linen",
"armor-*-chain-wood",
"armor-*-scale-leather",
"armor-*-scale-linen",
"armor-*-scale-wood",
"armor-*-scale-gold",
"armor-*-scale-silver",
"armor-*-plate-leather",
"armor-*-plate-linen",
"armor-*-plate-wood",
"armor-*-sewn-wood",
],
allowedVariants: [
"armor-body-improvised-wood",
"armor-body-jerkin-leather",
"armor-legs-jerkin-leather",
"armor-*-lamellar-wood",
"armor-*-lamellar-copper",
"armor-*-lamellar-tinbronze",
"armor-*-lamellar-bismuthbronze",
"armor-*-lamellar-blackbronze",
 
"armor-*-sewn-linen",
"armor-*-sewn-leather",
"armor-*-scale-*",
"armor-*-chain-*",
"armor-*-plate-*",
"armor-*-brigandine-*",
],</syntaxhighlight>
 
The wildcard char '''<code>*</code>''' stands for anything, and can be used to target many variants with one string instead of having to write them all down.
     </td>
     </td>
   </tr>
   </tr>
<tr>
  <tr>
  <td scope="row"><div class="tt" data-tt-id="p_skipVariants" data-tt-parent="root">skipVariants</div></td>
    <td scope="row"><div class="tt" data-tt-id="p_requiredminingtier" data-tt-parent="root">requiredminingtier</div></td>
  <td>array of strings</td>
    <td>integer</td>
  <td>-</td>
    <td>0</td>
  <td>Similar to allowedVariants, but instead skips the creation of listed variants rather than assigning which are allowed. </td>
    <td>Minimum required mining tier to get the drop out of the block.</td>
  <td>armor</td>
    <td>ore-graded, rock</td>
</tr>
  </tr>
<tr>  
  <tr>
     <td scope="row"><div class="tt" data-tt-id="p_skipVariants_info" data-tt-parent="p_skipVariants" data-invisible="true"></div></td>
     <td scope="row"><div class="tt" data-tt-id="p_requiredminingtier_info" data-tt-parent="p_requiredminingtier" data-invisible="true"></div></td>
     <td colspan="4">
     <td colspan="4">
By using the <code>skipVariants</code> you can specify which variants you do NOT want to be generated. For an example look above under <code>allowedVariants</code> which shows both <code>allowedVariants</code> and <code>skipVariants</code> in use at the same time.
The following are examples of the mining tiers required for certian ores in Vintage Story:
    </td>
 
<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>
   <tr>
   <tr>
     <td colspan="5" style='font-size: 14pt; border-bottom: 2pt solid black; padding-left: 100px;'><b>Specific</b></td>
     <td>'''1'''</td>
<td>'''''galena''''' and '''''rocksalt_sylvite'''''</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_class" data-tt-parent="root">class</div></td>
     <td>'''2'''</td>
    <td>string</td>
<td>'''''lignite''''', '''''cassiterite''''', '''''sphalerite''''', '''''rocksalt''''', '''''sulfur''''' and '''''nativecopper'''''</td>
    <td>&quot;block&quot;</td>
    <td>The block class can add special functionalities for the block.</td>
    <td>anvil, firepit, quern, skep</td>
   </tr>
   </tr>
   <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>'''3'''</td>
    <td colspan="4">
<td>'''''bituminouscoal''''', '''''quartz_nativegold''''', '''''quartz_nativesilver''''', '''''lapislazuli''''', '''''bismuthinite''''', '''''quartz''''', '''''magnetite''''' and '''''limonite'''''</td>
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]]. An ongoing list of block classes used in JSONS can also be found [[Block Classes|here]].
</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_entityclass" data-tt-parent="root">entityclass</div></td>
     <td>'''4'''</td>
    <td>string</td>
<td>'''''diamond''''' and '''''emerald'''''</td>
    <td>-</td>
    <td>The block entity class is able to tick and to store extra data. Allows for much more advanced properties.</td>
    <td>anvil, firepit, quern, skep</td>
   </tr>
   </tr>
<tr>
  <tr>
     <td scope="row"><div class="tt" data-tt-id="p_behaviors" data-tt-parent="root">behaviors</div></td>
     <td>'''5'''</td>
    <td>array of object</td>
<td>'''''chromite''''', '''''platinum''''' and '''''ilmenite'''''</td>
    <td>-</td>
    <td>A behavior adds custom abilities such as falling block.</td>
    <td>gravel, lantern, log, rock, torch</td>
   </tr>
   </tr>
  <tr>
</table>
    <td scope="row"><div class="tt" data-tt-id="p_behaviors_info" data-tt-parent="p_behaviors" data-invisible="true"></div></td>
    <td colspan="4">
Behaviors are useful traits as many can be assigned to a single block. 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]]
</td>
</td>
  </tr>
<tr>
    <td scope="row"><div class="tt" data-tt-id="p_ebehaviors" data-tt-parent="root">entityBehaviors</div></td>
    <td>array of object</td>
    <td>-</td>
    <td>An entity behavior adds custom abilities to an entity assigned to a block, such as the mechanical power properties of the windmill.</td>
    <td>angledgears, axle, brake, clutch, helvehammerbase, toggle, transmission, windmillrotor</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_ebehaviors_info" data-tt-parent="p_ebehaviors" data-invisible="true"></div></td>
     <td scope="row"><div class="tt" data-tt-id="p_climbable" data-tt-parent="root">climbable</div></td>
     <td colspan="4">
     <td>boolean</td>
Block entity behaviors are expanded capabilities that regular behaviors cannot accomplish. At the moment they are only used for Mechanical Power blocks, but if you're looking to make your own you can look through the existing files at the Vintage Story Github [https://github.com/anegostudios/vssurvivalmod/tree/master/Systems/MechanicalPower/BlockEntityBehavior here ].
    <td>false</td>
 
    <td>If true, walking against this block will make the player climb (used for ladders).</td>
To see all of the current block entity behaviors in the game see [[Modding:Block_Entity_Behaviors|All Block Entity Behaviors]].
    <td>ladder</td>
</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_entityclass_info" data-tt-parent="p_entityclass" data-invisible="true"></div></td>
     <td scope="row"><div class="tt" data-tt-id="p_rainpermeable" data-tt-parent="root">rainpermeable</div></td>
     <td colspan="4">
     <td>boolean</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]]. You can also find every existing block entity and their relevant github links [[Block Entities|here]].
    <td>false</td>
</td>
    <td>If rain can fall through this block.</td>
    <td>torch, torchholder</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_snowcoverage" data-tt-parent="root">snowcoverage</div></td>
     <td>string</td>
     <td>boolean</td>
     <td>-</td>
     <td>-</td>
     <td>A behavior adds custom abilities such as falling block.</td>
     <td>Whether snow may rest on top of this block.</td>
     <td>gravel</td>  
     <td>leavesbranchy</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_snowcoverage_info" data-tt-parent="p_snowcoverage" data-invisible="true"></div></td>
     <td colspan="4">
     <td colspan="4">
Materials are hardcoded and currently only used to determine mining speed with a specific tool. The following materials are available:
All non-solid blocks can't be covered by snow unless it's defined different:
 
*Leaves (also branchy): '''true''',
''Brick, Ceramic, Cloth, Fire, Glass, Gravel, Ice, Lava, Leaves, Liquid, Mantle, Metal, Other, Plant, Sand, Snow, Soil, Stone, Wood''
*Water with particles, Lakeice: '''false'''
</td>
</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_matterstate" data-tt-parent="root">matterstate</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_collisionbox" data-tt-parent="root">collisionbox</div></td>
     <td>array of object</td>
     <td>object</td>
     <td>&quot;block&quot;</td>
     <td>box (0,0,0 -> 1,1,1)</td>
     <td>Determines whether the block is in a '''''solid''''', a '''''liquid''''', a '''''gas''''' or a '''''plasma''''' state.</td>
     <td>Defines a box with which the player collides with.</td>
     <td> water </td>
     <td>carcass, door, fence, all slabs</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_collisionbox_info" data-tt-parent="p_collisionbox" data-invisible="true"></div></td>
     <td colspan="4">
     <td colspan="4">
Used for special collision behavior and rendering. Currently used for lava and water, which are liquids (All other blocks default to solid).
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.


Gas and plasma are not yet implemented.
Also, setting the entire property to <code>null</code> will eliminate the collision box entirely.
    </td>
</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_resistance" data-tt-parent="root">resistance</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_collisionboxes" data-tt-parent="root">collisionboxes</div></td>
     <td>decimal number</td>
     <td>array of object</td>
     <td>6</td>
     <td>-</td>
     <td>How long it takes to break this block in seconds (with a mining speed of 1).</td>
     <td>Defines multiple boxes with which the player collides with.</td>
     <td>leaves, meteorite, sand</td>
     <td>all stairs, crate</td>
   </tr>
   </tr>
   <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 scope="row"><div class="tt" data-tt-id="p_collisionboxes_info" data-tt-parent="p_collisionboxes" data-invisible="true"></div></td>
     <td colspan="4">
     <td colspan="4">
Resistance values range from very low with leaves (0.5) to the average of stone (6) to the very high resistance value of meteoric iron deposits (60).
A '''crate''' for example requires multiple collision boxes:
     </td>
<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>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_requiredminingtier" data-tt-parent="root">requiredminingtier</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_collisionselectionboxes" data-tt-parent="root">collisionSelectionBoxes</div></td>
     <td>integer</td>
     <td>array of object</td>
     <td>0</td>
     <td>-</td>
     <td>Minimum required mining tier to get the drop out of the block.</td>
     <td>Simultaneously defines multiple boxes with which the player collides with and can select.</td>
     <td>ore-graded, rock</td>
     <td>all stairs</td>
   </tr>
   </tr>
   <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 scope="row"><div class="tt" data-tt-id="p_colselsboxes_info" data-tt-parent="p_collisionselectionboxes" data-invisible="true"></div></td>
     <td colspan="4">
     <td colspan="4">
The following are examples of the mining tiers required for certian ores in Vintage Story:
A '''crate''' for example requires multiple collision boxes:
 
<syntaxhighlight lang="json">
<table class="wikitable">
collisionSelectionBoxesByType: {
  <tr style="background-color: rgba(0,0,0,0.2);">
"*-down-*": [
    <th style="background-color: rgba(0,0,0,0.2);">Tier</th>
{ x1: 0, y1: 0.5, z1: 0, x2: 1, y2: 1, z2: 1 },
    <th style="background-color: rgba(0,0,0,0.2);">Ores</th>
{
  </tr>
x1: 0, y1: 0, z1: 0.5, x2: 1, y2: 0.5, z2: 1,
  <tr>
rotateYByType: {
    <td>'''1'''</td>
"*-north": 180,
<td>'''''galena''''' and '''''rocksalt_sylvite'''''</td>
"*-east": 90,
  </tr>
"*-south": 0,
  <tr>
"*-west": 270,
    <td>'''2'''</td>
}
<td>'''''lignite''''', '''''cassiterite''''', '''''sphalerite''''', '''''rocksalt''''', '''''sulfur''''' and '''''nativecopper'''''</td>
}
],
"*-up-*": [
{ x1: 0, y1: 0, z1: 0, x2: 1, y2: 0.5, z2: 1 },
{
x1: 0, y1: 0.5, z1: 0.5, x2: 1, y2: 1, z2: 1,
rotateYByType: {
"*-north": 180,
"*-east": 90,
"*-south": 0,
"*-west": 270,
}
}
],
},
</syntaxhighlight>
</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td>'''3'''</td>
     <td scope="row"><div class="tt" data-tt-id="p_selectionbox" data-tt-parent="root">selectionbox</div></td>
<td>'''''bituminouscoal''''', '''''quartz_nativegold''''', '''''quartz_nativesilver''''', '''''lapislazuli''''', '''''bismuthinite''''', '''''quartz''''', '''''magnetite''''' and '''''limonite'''''</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>
    <td>carcass, door, fence, all slabs</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td>'''4'''</td>
     <td scope="row"><div class="tt" data-tt-id="p_selectionbox_info" data-tt-parent="p_selectionbox" data-invisible="true"></div></td>
<td>'''''diamond''''' and '''''emerald'''''</td>
     <td colspan="4">
  </tr>
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:
  <tr>
<syntaxhighlight lang="json">
     <td>'''5'''</td>
selectionboxByType: {
<td>'''''chromite''''', '''''platinum''''' and '''''ilmenite'''''</td>
"*-down": { x1: 0, y1: 0, z1: 0,  x2: 1, y2: 0.5, z2: 1 },
   </tr>
"*-up": { x1: 0, y1: 0.5, z1: 0,   x2: 1, y2: 1, z2: 1 }
</table>
},
</syntaxhighlight>
 
Collision and selection boxes are most likely equal.
</td>
</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_climbable" data-tt-parent="root">climbable</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_selectionboxes" data-tt-parent="root">selectionboxes</div></td>
     <td>boolean</td>
     <td>array of object</td>
    <td>false</td>
    <td>If true, walking against this block will make the player climb (used for ladders).</td>
    <td>ladder</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>
    <td>torch, torchholder</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>-</td>
     <td>Whether snow may rest on top of this block.</td>
     <td>Defines multiple boxes which the player's mouse pointer collides with for selection.</td>
     <td>leavesbranchy</td>
     <td>carcass, door, fence, all slabs</td>
   </tr>
   </tr>
   <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 scope="row"><div class="tt" data-tt-id="p_selectionboxes_info" data-tt-parent="p_selectionboxes" data-invisible="true"></div></td>
     <td colspan="4">
     <td colspan="4">
All non-solid blocks can't be covered by snow unless it's defined different:
A '''crate''' for example requires multiple selection boxes:
*Leaves (also branchy): '''true''',
<syntaxhighlight lang="json">
*Water with particles, Lakeice: '''false'''
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>
</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_collisionbox" data-tt-parent="root">collisionbox</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_replaceable" data-tt-parent="root">replaceable</div></td>
     <td>object</td>
     <td>integer</td>
     <td>box (0,0,0 -> 1,1,1)</td>
     <td>0</td>
     <td>Defines a box with which the player collides with.</td>
     <td>A value usually between 0-9999 that indicates which blocks may be replaced with others.</td>
     <td>carcass, door, fence, all slabs</td>
     <td>bigberrybush, tallgrass, water</td>
   </tr>
   </tr>
   <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 scope="row"><div class="tt" data-tt-id="p_replaceable_info" data-tt-parent="p_replaceable" data-invisible="true"></div></td>
     <td colspan="4">
     <td colspan="4">
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:
<table class="wikitable">
<syntaxhighlight lang="json">
  <tr style="background-color: rgba(0,0,0,0.2);">
collisionboxByType: {
    <th style="background-color: rgba(0,0,0,0.2);">value</th>
"*-down": { x1: 0, y1: 0, z1: 0,   x2: 1, y2: 0.5, z2: 1 },
    <th style="background-color: rgba(0,0,0,0.2);">effect (blocks)</th>
"*-up": { x1: 0, y1: 0.5, z1: 0,  x2: 1, y2: 1, z2: 1 }
   </tr>
},
  <tr>
</syntaxhighlight>
    <td>'''0'''</td>
 
<td>'''''ordinary blocks''''' (stone for example)</td>
Collision and selection boxes are most likely equal.
 
Also, setting the entire property to <code>null</code> will eliminate the collision box entirely.
</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_collisionboxes" data-tt-parent="root">collisionboxes</div></td>
     <td>'''5000'''</td>
    <td>array of object</td>
<td>Everything equal or above will be washed away by water (such as '''''Fruit''''').</td>
    <td>-</td>
    <td>Defines multiple boxes with which the player collides with.</td>
    <td>all stairs, crate</td>
   </tr>
   </tr>
   <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>'''6000'''</td>
     <td colspan="4">
<td>Everything equal or above wwill replaced when the player tries to place a block (such as '''''Tallgrass''''').</td>
A '''crate''' for example requires multiple collision boxes:
  </tr>
<syntaxhighlight lang="json">
  <tr>
collisionboxesByType: {
     <td>'''9000'''</td>
   "*-opened": [
<td>'''''Lava'''''</td>
     { x1: 0, y1: 0, z1: 0, x2: 1, y2: 0.0625, z2: 1 },
  </tr>
    { x1: 0, y1: 0, z1: 0, x2: 1, y2: 1, z2: 0.0625 },
   <tr>
    { x1: 0, y1: 0, z1: 0, x2: 1, y2: 1, z2: 0.0625, rotateY: 90 },
     <td>'''9500'''</td>
     { x1: 0, y1: 0, z1: 0, x2: 1, y2: 1, z2: 0.0625, rotateY: 180 },
<td>'''''Water'''''</td>
    { x1: 0, y1: 0, z1: 0, x2: 1, y2: 1, z2: 0.0625, rotateY: 270 },
  </tr>
   ]
  <tr>
},
     <td>'''9999'''</td>
</syntaxhighlight>
<td>'''''Air'''''</td>
   </tr>
</table>
</td>
</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_collisionselectionboxes" data-tt-parent="root">collisionSelectionBoxes</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_fertility" data-tt-parent="root">fertility</div></td>
     <td>array of object</td>
     <td>integer</td>
     <td>-</td>
     <td>0</td>
     <td>Simultaneously defines multiple boxes with which the player collides with and can select.</td>
     <td>Which plants can grow on top of this block.</td>
     <td>all stairs</td>
     <td>clay, gravel, sand, soil</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_colselsboxes_info" data-tt-parent="p_collisionselectionboxes" data-invisible="true"></div></td>
     <td scope="row"><div class="tt" data-tt-id="p_fertility_info" data-tt-parent="p_fertility" data-invisible="true"></div></td>
     <td colspan="4">
     <td colspan="4">
A '''crate''' for example requires multiple collision boxes:
<table class="wikitable">
<syntaxhighlight lang="json">
  <tr style="background-color: rgba(0,0,0,0.2);">
collisionSelectionBoxesByType: {
    <th style="background-color: rgba(0,0,0,0.2);">value</th>
"*-down-*": [
    <th style="background-color: rgba(0,0,0,0.2);">effect</th>
{ x1: 0, y1: 0.5, z1: 0, x2: 1, y2: 1, z2: 1 },
  </tr>
{
  <tr>
x1: 0, y1: 0, z1: 0.5, x2: 1, y2: 0.5, z2: 1,
    <td>'''0'''</td>
rotateYByType: {
<td>''(rock) nothing can grow.''</td>
"*-north": 180,
  </tr>
"*-east": 90,
  <tr>
"*-south": 0,
    <td>'''10'''</td>
"*-west": 270,
<td>''(sand) some tallgrass and small trees can be grow on it.''</td>
}
  </tr>
}
  <tr>
],
    <td>'''100'''</td>
"*-up-*": [
<td>''(soil) all grass and trees can grow on it.''</td>
{ x1: 0, y1: 0, z1: 0, x2: 1, y2: 0.5, z2: 1 },
  </tr>
{
</table>
x1: 0, y1: 0.5, z1: 0.5, x2: 1, y2: 1, z2: 1,
rotateYByType: {
"*-north": 180,
"*-east": 90,
"*-south": 0,
"*-west": 270,
}
}
],
},
</syntaxhighlight>
</td>
</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_selectionbox" data-tt-parent="root">selectionbox</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_lightabsorption" data-tt-parent="root">lightabsorption</div></td>
     <td>object</td>
     <td>0 ... 32</td>
     <td>box (0,0,0 -> 1,1,1)</td>
     <td>0</td>
     <td>Defines a box which the player's mouse pointer collides with for selection.</td>
     <td>For light blocking blocks. Any value above 32 will completely block all light.</td>
     <td>carcass, door, fence, all slabs</td>
     <td>full-plain (glass), water </td>
   </tr>
   </tr>
   <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 scope="row"><div class="tt" data-tt-id="p_walkspeedmultiplier" data-tt-parent="root">walkspeedmultiplier</div></td>
     <td colspan="4">
    <td>decimal number</td>
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:
    <td>1.0</td>
<syntaxhighlight lang="json">
    <td>Percentage walk-speed when standing on or inside this block.</td>
selectionboxByType: {
    <td>path, spiderweb, stonepath </td>
"*-down": { x1: 0, y1: 0, z1: 0,   x2: 1, y2: 0.5, z2: 1 },
  </tr>
"*-up": { x1: 0, y1: 0.5, z1: 0,   x2: 1, y2: 1, z2: 1 }
  <tr>
},
    <td scope="row"><div class="tt" data-tt-id="p_walkspeedmultiplier_info" data-tt-parent="p_walkspeedmultiplier" data-invisible="true"></div></td>
</syntaxhighlight>
     <td colspan="4">
 
<table class="wikitable">
Collision and selection boxes are most likely equal.
  <tr style="background-color: rgba(0,0,0,0.2);">
</td>
    <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>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_selectionboxes" data-tt-parent="root">selectionboxes</div></td>
     <td>''Spiderweb''</td>
    <td>array of object</td>
<td>'''0.25'''</td>
    <td>-</td>
    <td>Defines multiple boxes which the player's mouse pointer collides with for selection.</td>
    <td>carcass, door, fence, all slabs</td>
   </tr>
   </tr>
   <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>''Stonepath''</td>
    <td colspan="4">
<td>'''1.15'''</td>
A '''crate''' for example requires multiple selection boxes:
  </tr>
<syntaxhighlight lang="json">
</table>
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>
</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_replaceable" data-tt-parent="root">replaceable</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_dragmultiplier" data-tt-parent="root">dragmultiplier</div></td>
     <td>integer</td>
     <td>decimal number</td>
     <td>0</td>
     <td>1.0</td>
     <td>A value usually between 0-9999 that indicates which blocks may be replaced with others.</td>
     <td>Drag multiplier applied to entities standing on it (slipperiness factor).</td>
     <td>bigberrybush, tallgrass, water</td>
     <td>Glacierice, Lakeice</td>
   </tr>
   </tr>
   <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 scope="row"><div class="tt" data-tt-id="p_dragmultiplier_info" data-tt-parent="p_dragmultiplier" data-invisible="true"></div></td>
     <td colspan="4">
     <td colspan="4">
<table class="wikitable">
<table class="wikitable">
   <tr style="background-color: rgba(0,0,0,0.2);">
   <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>
     <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>
   <tr>
   <tr>
     <td>'''0'''</td>
     <td>''Glacierice'', ''Lakeice''</td>
<td>'''''ordinary blocks''''' (stone for example)</td>
<td>'''0.02'''</td>
   </tr>
   </tr>
  <tr>
</table>
    <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>
</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_fertility" data-tt-parent="root">fertility</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_drops" data-tt-parent="root">drops</div></td>
     <td>integer</td>
     <td>array of object</td>
     <td>0</td>
     <td>-</td>
     <td>Which plants can grow on top of this block.</td>
     <td>The items that should drop from breaking this block.</td>
     <td>clay, gravel, sand, soil</td>
     <td>crops, skep</td>
   </tr>
   </tr>
   <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 scope="row"><div class="tt" data-tt-id="p_drops_info" data-tt-parent="p_drops" data-invisible="true"></div></td>
     <td colspan="4">
     <td colspan="4">
'''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">
<table class="wikitable">
   <tr style="background-color: rgba(0,0,0,0.2);">
   <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);">property</th>
     <th style="background-color: rgba(0,0,0,0.2);">effect</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>
   <tr>
   <tr>
     <td>'''0'''</td>
     <td>'''type'''</td>
<td>''(rock) nothing can grow.''</td>
<td>''block''</td>
<td>Can either be '''''block''''' or '''''item'''''.</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td>'''10'''</td>
     <td>'''code''' (required)</td>
<td>''(sand) some tallgrass and small trees can be grow on it.''</td>
<td>-</td>
<td>The complete code (can also include domain) of the item or block.</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td>'''100'''</td>
     <td>'''lastdrop'''</td>
<td>''(soil) all grass and trees can grow on it.''</td>
<td>false</td>
  </tr>
<td>If true and the quantity dropped is >=1 any subsequent drop in the list will be ignored.</td>
</table>
</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_lightabsorption" data-tt-parent="root">lightabsorption</div></td>
     <td>'''attributes'''</td>
    <td>0 ... 32</td>
<td>-</td>
    <td>0</td>
<td>Tree Attributes that will be attached to the resulting itemstack.</td>
    <td>For light blocking blocks. Any value above 32 will completely block all light.</td>
    <td>full-plain (glass), water </td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_walkspeedmultiplier" data-tt-parent="root">walkspeedmultiplier</div></td>
     <td>'''tool'''</td>
    <td>decimal number</td>
<td>-</td>
    <td>1.0</td>
<td>If specified then given tool is required to break this block.</td>
    <td>Percentage walk-speed when standing on or inside this block.</td>
    <td>path, spiderweb, stonepath </td>
   </tr>
   </tr>
   <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>'''quantity'''</td>
    <td colspan="4">
<td>- (one)</td>
<table class="wikitable">
<td>Determines the quantity of items which will be dropped.</td>
  <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>
   </tr>
</table>
</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>
    <td>Glacierice, Lakeice</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="4">
<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>
    <td>crops, skep</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="4">


'''Drop itself'''
For example, the drop of a '''charcoalpile''' looks like this:
 
 
If this property does not exist the block will drop itself.
<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>


----
----


'''No drop'''
'''Chance drops'''
 
Let's take a look at an example. This is the drop property of rock:


A '''firepit''' for example doesn't drop anything. You can do so if you specify an empty array:
<syntaxhighlight lang="json">
<syntaxhighlight lang="json">
drops: [
drops: [],
{
type: "item",
code: "stone-{rock}",
quantity: { avg: 2.5, var: 0.5 }
},
]
</syntaxhighlight>
</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.


'''Special drop'''
For more information see [[NatFloat]] page.


You can also specify a special item/ block. Therefore you need to define an '''ItemStack''', with the given properties:
----
'''Multiple Drops'''


<table class="wikitable">
Of course you can also define multiple drops at once. '''Sapling''' can drop a sapling and a stick:
  <tr style="background-color: rgba(0,0,0,0.2);">
 
    <th style="background-color: rgba(0,0,0,0.2);">property</th>
<syntaxhighlight lang="json">
    <th style="background-color: rgba(0,0,0,0.2);">default</th>
drops: [
<th style="background-color: rgba(0,0,0,0.2);">explanation</th>
{
  </tr>
type: "block",  
  <tr>
code: "sapling-{wood}",
    <td>'''type'''</td>
quantity: { avg: 0.02, var: 0 },
<td>''block''</td>
},
<td>Can either be '''''block''''' or '''''item'''''.</td>
{
  </tr>
type: "item",
  <tr>
code: "stick",
    <td>'''code''' (required)</td>
quantity: { avg: 0.02, var: 0 },
<td>-</td>
}
<td>The complete code (can also include domain) of the item or block.</td>
],
  </tr>
</syntaxhighlight>
  <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>
'''Last Drop'''
  </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:
In order to add a special drop, which (if dropped) prevents all other drops, you can use the lastDrop property:


<syntaxhighlight lang="json">
<syntaxhighlight lang="json">
drops: [
dropsByType: {
{ type: "item", code: "charcoal" }
"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>
</syntaxhighlight>


'''Tallgrass''' will only drop something if it's mined by a knife:
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>
<syntaxhighlight lang="json">
  </tr>
drops: [
  <tr>
{ type: "item", code: "drygrass", tool: "knife" },
    <td scope="row"><div class="tt" data-tt-id="p_particleproperties" data-tt-parent="root">particleproperties</div></td>
],
    <td>array of object</td>
</syntaxhighlight>
    <td>-</td>
 
    <td>Particles that should spawn in regular intervals from this block.</td>
----
    <td>torch>
 
  </tr>
'''Chance drops'''
  <tr>
 
    <td scope="row"><div class="tt" data-tt-id="p_particleproperties_info" data-tt-parent="p_particleproperties" data-invisible="true"></div></td>
Let's take a look at an example. This is the drop property of rock:
    <td colspan="4">
 
{{:json:block:particle}}
<syntaxhighlight lang="json">
</td>
drops: [
  </tr>
{
  <tr>
type: "item",
    <td scope="row"><div class="tt" data-tt-id="p_liquidlevel" data-tt-parent="root">liquidlevel</div></td>
code: "stone-{rock}",
    <td>0 ... 7</td>
quantity: { avg: 2.5, var: 0.5 }  
    <td>0</td>
},
    <td>Value between 0...7 for Liquids to determine the height of the liquid.</td>
]
    <td>water</td>
</syntaxhighlight>
  </tr>
 
  <tr>
This will drop 2-3 blocks.
    <td scope="row"><div class="tt" data-tt-id="p_cropprops" data-tt-parent="root">cropprops</div></td>
 
    <td>object</td>
'''''avg''''': Stands for the default drop quantity. If var is 0 or not specified it will always drop the given average.
    <td>-</td>
 
    <td>Information about the block as a crop.</td>
'''''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.
    <td>all crops</td>
 
  </tr>
For more information see [[NatFloat]] page.
  <tr>
 
    <td scope="row"><div class="tt" data-tt-id="p_cprops_reqN" data-tt-parent="p_cropprops">requiredNutrient</div></td>
----
    <td>Nutrient (N, P, or K)</td>
    <td>-</td>
'''Multiple Drops'''
    <td>The primary nutrient this crop uses and consumes from farmland.</td>
 
    <td>all crops</td>
Of course you can also define multiple drops at once. '''Sapling''' can drop a sapling and a stick:
  </tr>
 
  <tr>
<syntaxhighlight lang="json">
    <td scope="row"><div class="tt" data-tt-id="p_cprops_consume" data-tt-parent="p_cropprops">nutrientConsumption</div></td>
drops: [
    <td>number</td>
{
    <td>-</td>
type: "block",
    <td>The percentage value of the nutrient this plant will consume from farmland. This value should be whole, as in 50 = 50% consumption.</td>
code: "sapling-{wood}",
    <td>all crops</td>
quantity: { avg: 0.02, var: 0 },
  </tr>
},
  <tr>
{
    <td scope="row"><div class="tt" data-tt-id="p_cprops_gstages" data-tt-parent="p_cropprops">growthStages</div></td>
type: "item",
    <td>number</td>
code: "stick",
    <td>-</td>
quantity: { avg: 0.02, var: 0 },
    <td>The number of growth stages this plant will go through before it can be harvested.</td>
}
    <td>all crops</td>
],
</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>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_particleproperties" data-tt-parent="root">particleproperties</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_cprops_gdays" data-tt-parent="p_cropprops">totalGrowthDays</div></td>
     <td>array of object</td>
     <td>Number</td>
     <td>-</td>
     <td>-</td>
     <td>Particles that should spawn in regular intervals from this block.</td>
     <td>The average number of days required for a plant to reach maturity. This value can include decimals, such as 4.5 days.</td>
    <td>torch>
  </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="4">
{{: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>
    <td>water</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>
     <td>all crops</td>
     <td>all crops</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_cprops_reqN" data-tt-parent="p_cropprops">requiredNutrient</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_cprops_behaviors" data-tt-parent="p_cropprops">behaviors (crop)</div></td>
     <td>Nutrient (N, P, or K)</td>
     <td>string</td>
     <td>-</td>
     <td>-</td>
     <td>The primary nutrient this crop uses and consumes from farmland.</td>
     <td>Crops can have additional functionality with special crop behaviors, currently used only by pumpkins.</td>
     <td>all crops</td>
     <td>motherplant (pumpkin)</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_cprops_consume" data-tt-parent="p_cropprops">nutrientConsumption</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_pumpkin" data-tt-parent="p_cprops_behaviors">Pumpkin</div></td>
     <td>number</td>
     <td>number</td>
     <td>-</td>
     <td>-</td>
    <td>The percentage value of the nutrient this plant will consume from farmland. This value should be whole, as in 50 = 50% consumption.</td>
     <td>A unique pumpkin behavior utilize only by the pumpkin motherplant block.</td>
    <td>all crops</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_cprops_gstages" data-tt-parent="p_cropprops">growthStages</div></td>
    <td>number</td>
    <td>-</td>
    <td>The number of growth stages this plant will go through before it can be harvested.</td>
    <td>all crops</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_cprops_gdays" data-tt-parent="p_cropprops">totalGrowthDays</div></td>
    <td>Number</td>
    <td>-</td>
    <td>The average number of days required for a plant to reach maturity. This value can include decimals, such as 4.5 days.</td>
    <td>all crops</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_cprops_behaviors" data-tt-parent="p_cropprops">behaviors (crop)</div></td>
    <td>string</td>
    <td>-</td>
    <td>Crops can have additional functionality with special crop behaviors, currently used only by pumpkins.</td>
    <td>motherplant (pumpkin)</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_pumpkin" data-tt-parent="p_cprops_behaviors">Pumpkin</div></td>
    <td>number</td>
    <td>-</td>
     <td>A unique pumpkin behavior utilize only by the pumpkin motherplant block.</td>
     <td>motherplant (pumpkin)</td>
     <td>motherplant (pumpkin)</td>
   </tr>
   </tr>
Line 1,071: Line 826:
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_sounds_ambient" data-tt-parent="p_sounds">ambientBlockCount</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_sounds_ambient" data-tt-parent="p_sounds">ambientBlockCount</div></td>
     <td colspan="4">The max number of blocks allowed to produce ambient sounds.</td>
     <td colspan="4">The amount of blocks required to be in the vicinity of the player to play the sound at full volume.</td>
   </tr>
   </tr>
   <tr>
   <tr>
Line 2,315: Line 2,070:
   </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_textures_base" data-tt-parent="p_textures" data-invisible="true"></div></td>
     <td colspan="4">{{:json:block:texture}}</td>
     <td colspan="4">{{:json:block:texture}}</td>
   </tr>
   </tr>
Line 2,392: Line 2,147:
     <td>string</td>
     <td>string</td>
     <td>&quot;cube&quot;</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.</td>
     <td>Determines which [[Modding:Block_Tessellator|block tessellator]] processes the block. Select JSON for being able to use custom JSON Models. Use Cube for basic cubes.</td>
     <td>-</td>
     <td>-</td>
   </tr>
   </tr>
   <tr>
   <tr>
    <td scope="row"><div class="tt" data-tt-id="p_blockLayer_1" data-tt-parent="p_drawtype">blockLayer_1</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_renderpass" data-tt-parent="root">renderpass</div></td>
    <td></td>
     <td>string</td>
    <td>0</td>
    <td></td>
    <td>-</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_blockLayer_2" data-tt-parent="p_drawtype">blockLayer_2</div></td>
    <td></td>
    <td>1</td>
    <td></td>
    <td>-</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_blockLayer_3" data-tt-parent="p_drawtype">blockLayer_3</div></td>
    <td></td>
    <td>2</td>
    <td></td>
    <td>-</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_blockLayer_4" data-tt-parent="p_drawtype">blockLayer_4</div></td>
    <td></td>
    <td>3</td>
    <td></td>
    <td>-</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_blockLayer_5" data-tt-parent="p_drawtype">blockLayer_5</div></td>
    <td></td>
    <td>4</td>
    <td></td>
    <td>-</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_blockLayer_6" data-tt-parent="p_drawtype">blockLayer_6</div></td>
    <td></td>
    <td>5</td>
    <td></td>
    <td>-</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_blockLayer_7" data-tt-parent="p_drawtype">blockLayer_7</div></td>
    <td></td>
    <td>6</td>
    <td></td>
    <td>-</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_json" data-tt-parent="p_drawtype">json</div></td>
    <td></td>
    <td>7</td>
    <td>Will draw a json model.</td>
    <td>-</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_empty" data-tt-parent="p_drawtype">empty</div></td>
    <td></td>
    <td>8</td>
    <td>Nothing will be drawn.</td>
    <td>-</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_cube" data-tt-parent="p_drawtype">cube</div></td>
    <td></td>
    <td>9</td>
    <td>Draws an ordinary cube.</td>
    <td>-</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_cross" data-tt-parent="p_drawtype">cross</div></td>
    <td></td>
    <td>10</td>
    <td></td>
    <td>-</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_transparent" data-tt-parent="p_drawtype">transparent</div></td>
    <td></td>
    <td>11</td>
    <td></td>
    <td>-</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_liquid" data-tt-parent="p_drawtype">liquid</div></td>
    <td></td>
    <td>12</td>
    <td></td>
    <td>-</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_crossandsnowlayer" data-tt-parent="p_drawtype">crossandsnowlayer</div></td>
    <td></td>
    <td>13</td>
    <td></td>
    <td>-</td>
  </tr>
  <tr>
     <td scope="row"><div class="tt" data-tt-id="p_renderpass" data-tt-parent="root">renderpass</div></td>
     <td>string</td>
     <td>&quot;opaque&quot;</td>
     <td>&quot;opaque&quot;</td>
     <td>Determines how the block will be drawn.</td>
     <td>Determines which [[Modding:Render_Stages#Chunk_render_passes|pass]] the block is drawn in.</td>
     <td>-</td>
     <td>-</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_doNotRenderAtLod2" data-tt-parent="root">doNotRenderAtLod2</div></td>
     <td></td>
     <td>boolean</td>
     <td>0</td>
     <td>false</td>
    <td>Used for solid blocks with no half transparency.</td>
     <td>When false, render the block at [[Modding:Level_of_detail|level of detail]] 1, which is visible at all distances within the frustum. When true, only render the block at short and medium distances. This property is only respected by some [[Modding:Block_Tessellator|block tessellators]].</td>
    <td>-</td>
     <td>torch</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>1</td>
    <td>Used for non-solid single faced blocks, such as tall grass.</td>
    <td>-</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_transparent" data-tt-parent="p_renderpass">transparent</div></td>
    <td></td>
    <td>2</td>
    <td>Use for solid halftransparent blocks, such as glass</td>
    <td>-</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>
    <td>-</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_topsoil" data-tt-parent="p_renderpass">topsoil</div></td>
    <td></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>
     <td>-</td>
   </tr>
   </tr>
   <tr>
   <tr>
Line 2,652: Line 2,281:
     <td>key: string, value: boolean</td>
     <td>key: string, value: boolean</td>
     <td>-</td>
     <td>-</td>
     <td>Determines if given block side is solid. If true, other blocks like torches can be attached to it.</td>
     <td>Determines if given block side is solid. If true, other blocks like torches can be [[Modding:Block_Attachment|attached]] to it.</td>
<td>all stairs</td>
<td>all stairs</td>
   </tr>
   </tr>
Confirmedusers, Bureaucrats, editor, Administrators
1,779

edits