Modding:Block Json Properties: Difference between revisions

From Vintage Story Wiki
no edit summary
No edit summary
 
(31 intermediate revisions by 7 users not shown)
Line 1: Line 1:
<languages/>
<translate>
__NOTOC__
__NOTOC__
== Overview ==
== Overview == <!--T:1-->
A complete list of all available properties
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-->
Definitions:
<!--T:3-->
'''Key''' - The name of the property, which should be used as it appears in the column.
<!--T:4-->
'''Value''' - A component of a property.
<!--T:5-->
'''Array''' - A list of objects or values that can be referenced in code.
<!--T:6-->
'''String''' - A sequence of characters that can be used as an identifier in code. Essentially a word that can be referenced and assigned to something. Generally does not use numbers.
<!--T:7-->
'''Boolean''' - A true or false value, essentially "on" or "off".
<!--T:8-->
'''Int''' - An integer, or whole number. Cannot use decimal values.
<!--T:9-->
'''Float''' - A decimal, specifically one that does not exceed more than 1 significant digit
<!--T:10-->
'''Object''' - This is a bit more complex, but essentially objects are the items, blocks and entities that can be interacted with. In most cases, when an "object" type appears it means you must use a specific item variant code, which follows the "itemcode-variant_1-variant_2-variant_n" style of naming.
</translate>
<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>
   <tr>
Line 8: Line 38:
     <th width='120' align='left'>Type</th>
     <th width='120' align='left'>Type</th>
     <th width='120' align='left'>Default</th>
     <th width='120' align='left'>Default</th>
     <th width='200' align='left'>Usage</th>
     <th width='400' align='left'>Usage</th>
     <th align='left'>Reference</th>
     <th align='left'>Reference</th>
   </tr>
   </tr>
Line 50: 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 colspan="4">
     <td>key: string; value: object</td>
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.
    <td>-</td>
 
    <td>Allows different property values to be [[Modding:Registry_Object_JSON_Parsing#ByType_properties|specified]] based on the variant code.</td>
An easy example would be a bowl, which can either be raw or burned:
  </tr>
<syntaxhighlight lang="json">
<tr>
variantgroups: [
  <td scope="row"><div class="tt" data-tt-id="p_allowedVariants" data-tt-parent="root">allowedVariants</div></td>
{ code:"type", states: ["raw", "burned"] },
  <td>array of strings</td>
],
  <td>-</td>
</syntaxhighlight>
  <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>
Meaning there will be two variants <code>bowl-raw</code> and <code>bowl-burned</code>.
</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>
It's also possible to define multiple groups.
  <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>
<syntaxhighlight lang="json">
  <td>armor</td>
variantgroups: [
</tr>
{ code:"state", states: ["closed", "opened"] },
  <tr>
{ code:"contents", states: ["empty", "cabbage"] },
    <td colspan="5" style='font-size: 14pt; border-bottom: 2pt solid black; padding-left: 100px;'><b>Specific</b></td>
],
  </tr>
</syntaxhighlight>
  <tr>
 
    <td scope="row"><div class="tt" data-tt-id="p_class" data-tt-parent="root">class</div></td>
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>.
    <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>
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:
  </tr>
<syntaxhighlight lang="json">
  <tr>
variantgroups: [
    <td scope="row"><div class="tt" data-tt-id="p_class_info" data-tt-parent="p_class" data-invisible="true"></div></td>
{ loadFromProperties: "block/rock" },
    <td colspan="4">
],
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]].
</syntaxhighlight>
</td>
 
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 other 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). There are two other methods, Additive and SelectiveMultiply.
 
Let's take a look at the <code>additive</code> combination mode used in the flowerpot block:
 
<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>
 
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 the 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 function <code>onVariant</code> specifies which variant group to selectively combine with, ignoring all other variants without it (in case some are combined additively).  
 
Using this will result items called <code>clothes-lowerbody-aristocrat-leggings</code>, <code>clothes-lowerbody-dirty-linen-trousers</code>, etc.
 
    </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_entityclass" data-tt-parent="root">entityclass</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>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_byType_info" data-tt-parent="p_byType" data-invisible="true"></div></td>
     <td scope="row"><div class="tt" data-tt-id="p_behaviors" data-tt-parent="root">behaviors</div></td>
     <td colspan="4">
     <td>array of object</td>
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:
    <td>-</td>
<syntaxhighlight lang="json">
    <td>A behavior adds custom abilities such as falling block.</td>
(property)ByType: {
    <td>gravel, lantern, log, rock, torch</td>
"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 item.
 
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: "metal", states: ["copper", "tinbronze", "bismuthbronze", "blackbronze", "gold", "silver", "iron" ] },
],
textures: {
"metal": { base: "block/metal/ingot/{metal}" },
"wood": { base: "item/tool/material/wood" }
},
</syntaxhighlight>
</td>
   </tr>
   </tr>
   <tr>
   <tr>
  <td scope="row"><div class="tt" data-tt-id="p_enabled" data-tt-parent="root">allowedVariants</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>array of objects</td>
    <td colspan="4">
  <td>-</td>
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]].
  <td>Used to trim unnecessary items generated by combined variants. </td>
To see all of the current behaviors in the game see [[Json:block:behaviors|All Block Behaviors]]
  <td>crystalizedore-graded, ore-graded, ore-ungraded</td>
</td>
</tr>  
  </tr>
<tr>
<tr>
  <td scope="row"><div class="tt" data-tt-id="p_enabled" data-tt-parent="root">skipVariants</div></td>
    <td scope="row"><div class="tt" data-tt-id="p_ebehaviors" data-tt-parent="root">entityBehaviors</div></td>
  <td>array of object</td>
    <td>array of object</td>
  <td>-</td>
    <td>-</td>
  <td>Similar to allowedVariants, but instead skips the creation of listed variants rather than assigning which are allowed. </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>armor</td>
     <td>angledgears, axle, brake, clutch, helvehammerbase, toggle, transmission, windmillrotor</td>
</tr>
  <tr>
     <td colspan="5" style='font-size: 14pt; border-bottom: 2pt solid black; padding-left: 100px;'><b>Specific</b></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_ebehaviors_info" data-tt-parent="p_ebehaviors" data-invisible="true"></div></td>
     <td>string</td>
     <td colspan="4">
    <td>&quot;block&quot;</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>The block class can add special functionalities for the block.</td>
 
    <td>anvil, firepit, quern, skep</td>
To see all of the current block entity behaviors in the game see [[Modding:Block_Entity_Behaviors|All Block Entity Behaviors]].
</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 scope="row"><div class="tt" data-tt-id="p_entityclass_info" data-tt-parent="p_entityclass" data-invisible="true"></div></td>
     <td colspan="4">
     <td colspan="4">
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]].
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>
</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_entityclass" data-tt-parent="root">entityclass</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_blockmaterial" data-tt-parent="root">blockmaterial</div></td>
     <td>string</td>
     <td>string</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>
    <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>-</td>
     <td>A behavior adds custom abilities such as falling block.</td>
     <td>A behavior adds custom abilities such as falling block.</td>
     <td>gravel, lantern, log, rock, torch</td>
     <td>gravel</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_blockmaterial_info" data-tt-parent="p_blockmaterial" data-invisible="true"></div></td>
     <td colspan="4">
     <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]].
Materials are hardcoded and currently only used to determine mining speed with a specific tool. The following materials are available:
To see all of the current behaviors in the game see [[Json:block:behaviors|All Block Behaviors]]
 
''Brick, Ceramic, Cloth, Fire, Glass, Gravel, Ice, Lava, Leaves, Liquid, Mantle, Metal, Other, Plant, Sand, Snow, Soil, Stone, Wood''
</td>
</td>
   </tr>
   </tr>
<tr>
  <tr>
     <td scope="row"><div class="tt" data-tt-id="p_ebehaviors" data-tt-parent="root">entityBehaviors</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_matterstate" data-tt-parent="root">matterstate</div></td>
     <td>array of object</td>
     <td>array of object</td>
     <td>-</td>
     <td>&quot;block&quot;</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>Determines whether the block is in a '''''solid''''', a '''''liquid''''', a '''''gas''''' or a '''''plasma''''' state.</td>
     <td>angledgears, axle, brake, clutch, helvehammerbase, toggle, transmission, windmillrotor</td>
     <td> water </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_blockmaterial_info" data-tt-parent="p_blockmaterial" data-invisible="true"></div></td>
     <td colspan="4">
     <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 ].
Used for special collision behavior and rendering. Currently used for lava and water, which are liquids (All other blocks default to solid).


To see all of the current block entity behaviors in the game see [[Json:block:behaviors|All Block Behaviors]].
Gas and plasma are not yet implemented.
</td>
    </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>
    <td>leaves, meteorite, sand</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_resistance_info" data-tt-parent="p_resistance" data-invisible="true"></div></td>
     <td colspan="4">
     <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]].
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).
</td>
    </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_requiredminingtier" data-tt-parent="root">requiredminingtier</div></td>
     <td>string</td>
     <td>integer</td>
     <td>-</td>
     <td>0</td>
     <td>A behavior adds custom abilities such as falling block.</td>
     <td>Minimum required mining tier to get the drop out of the block.</td>
     <td>gravel</td>  
     <td>ore-graded, rock</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_requiredminingtier_info" data-tt-parent="p_requiredminingtier" 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:
The following are examples of the mining tiers required for certian ores in Vintage Story:


''Brick, Ceramic, Cloth, Fire, Glass, Gravel, Ice, Lava, Leaves, Liquid, Mantle, Metal, Other, Plant, Sand, Snow, Soil, Stone, Wood''
<table class="wikitable">
</td>
  <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 scope="row"><div class="tt" data-tt-id="p_matterstate" data-tt-parent="root">matterstate</div></td>
     <td>'''1'''</td>
    <td>array of object</td>
<td>'''''galena''''' and '''''rocksalt_sylvite'''''</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>
<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>'''2'''</td>
    <td colspan="4">
<td>'''''lignite''''', '''''cassiterite''''', '''''sphalerite''''', '''''rocksalt''''', '''''sulfur''''' and '''''nativecopper'''''</td>
Used for special collision behavior and rendering. Currently used for lava and water, which are liquids (All other blocks default to solid).
 
Gas and plasma are not yet implemented.
    </td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_resistance" data-tt-parent="root">resistance</div></td>
     <td>'''3'''</td>
    <td>decimal number</td>
<td>'''''bituminouscoal''''', '''''quartz_nativegold''''', '''''quartz_nativesilver''''', '''''lapislazuli''''', '''''bismuthinite''''', '''''quartz''''', '''''magnetite''''' and '''''limonite'''''</td>
    <td>6</td>
    <td>How long it takes to break this block in seconds (with a mining speed of 1).</td>
    <td>leaves, meteorite, sand</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>'''4'''</td>
    <td colspan="4">
<td>'''''diamond''''' and '''''emerald'''''</td>
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).
    </td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_requiredminingtier" data-tt-parent="root">requiredminingtier</div></td>
     <td>'''5'''</td>
    <td>integer</td>
<td>'''''chromite''''', '''''platinum''''' and '''''ilmenite'''''</td>
    <td>0</td>
    <td>Minimum required mining tier to get the drop out of the block.</td>
    <td>ore-graded, rock</td>
   </tr>
   </tr>
  <tr>
</table>
    <td scope="row"><div class="tt" data-tt-id="p_requiredminingtier_info" data-tt-parent="p_requiredminingtier" data-invisible="true"></div></td>
</td>
    <td colspan="4">
The following are examples of the mining tiers required for certian ores in Vintage Story:
 
<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>'''1'''</td>
     <td scope="row"><div class="tt" data-tt-id="p_climbable" data-tt-parent="root">climbable</div></td>
<td>'''''galena''''' and '''''rocksalt_sylvite'''''</td>
    <td>boolean</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>
   <tr>
   <tr>
    <td>'''2'''</td>
     <td scope="row"><div class="tt" data-tt-id="p_rainpermeable" data-tt-parent="root">rainpermeable</div></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>
    <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>boolean</td>
     <td>false</td>
     <td>false</td>
Line 847: Line 725:
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_cprops_gstages" data-tt-parent="p_cropprops">grwothStages</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_cprops_gstages" data-tt-parent="p_cropprops">growthStages</div></td>
     <td>number</td>
     <td>number</td>
     <td>-</td>
     <td>-</td>
Line 940: Line 818:
},
},
</syntaxhighlight>
</syntaxhighlight>
</td>
</td>
   </tr>
   </tr>
Line 950: 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 983: Line 859:
</td>
</td>
   </tr>
   </tr>
   <tr>
<tr>
    <td scope="row"><div class="tt" data-tt-id="p_cprops_gstages" data-tt-parent="root">liquidCode</div></td>
    <td>string</td>
    <td>-</td>
    <td>An identifier for other liquids to utilize during collisions.</td>
    <td>lava, water</td>
  </tr>
   <tr>
     <td colspan="5" style='font-size: 14pt; border-bottom: 2pt solid black; padding-left: 100px;'><b>Common</b></td>
     <td colspan="5" style='font-size: 14pt; border-bottom: 2pt solid black; padding-left: 100px;'><b>Common</b></td>
   </tr>
   </tr>
Line 1,017: Line 900:
</syntaxhighlight>
</syntaxhighlight>
</td>
</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_creativestacks" data-tt-parent="root">CreativeInventoryStacks</div></td>
    <td>-</td>
    <td>-</td>
    <td>If you want to add itemstacks with custom attributes to the creative inventory, add them to this list.</td>
    <td>-</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_notincreative" data-tt-parent="root">notCreateveInventoryStacks</div></td>
    <td>-</td>
    <td>-</td>
    <td>Prevents the variant from being included in the creative inventory.</td>
    <td>tapestry</td>
   </tr>
   </tr>
   <tr>
   <tr>
Line 1,205: Line 1,102:
   </tr>
   </tr>
  <tr>
  <tr>
     <td colspan="5" style='font-size: 14pt; border-bottom: 2pt solid black; padding-left: 100px;'><b>Attributes</b></td>
     <td scope="row"><div class="tt" data-tt-id="p_transprops" data-tt-parent="root">transitionableProps</div></td>
    <td>-</td>
    <td>-</td>
    <td>Can be used to transition an item to another item or block.</td>
    <td>redmeat, hide</td>
   </tr>
   </tr>
<tr>
  <tr>
     <td scope="row"><div class="tt" data-tt-id="p_attributes_list" data-tt-parent="root">attributes</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_tprops_type" data-tt-parent="p_transprops">type</div></td>
    <td>-</td>
     <td>-</td>
     <td>-</td>
    <td>The type of transition method to utilize.</td>
    <td>redmeat, hide</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_tprops_type_cure" data-tt-parent="p_tprops_type">Cure</div></td>
    <td>string</td>
     <td>-</td>
     <td>-</td>
     <td>Custom Attributes associated with this item.</td>
     <td>Will "cure" an item by showing percent progress until cured.</td>
     <td>barrel, chest, pot, skep</td>  
     <td>hide</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_attributes_info" data-tt-parent="p_attributes_list" data-invisible="true"></div></td>
    <td scope="row"><div class="tt" data-tt-id="p_tprops_type_perish" data-tt-parent="p_tprops_type">Perish</div></td>
     <td colspan="4">
    <td>string</td>
Attributes constitute a large number of custom properties that an block can have, many of which are specific to unique blocks that rely on a C# class for additional functionality. If you wish to add your own JSON attributes to an item generally you must also have a class to utilize them.
    <td>-</td>
 
    <td>Will gradually reduce the saturation of a food item once it's fresh period has passed, eventually converting into the product item (usually rot).</td>
Values placed here are final and cannot be modified. For example, if you made a new type of block, say one that damages people when they get close you could define them here:
    <td>hide</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_tprops_fresh" data-tt-parent="p_transprops">freshHours</div></td>
    <td>number (hours)</td>
    <td>-</td>
    <td>An optional "fresh" period that must pass before the transition time starts. With food, this is the period of time that saturation is not affected.</td>
    <td>bread, vegetable, redmeat</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_tprops_ttime" data-tt-parent="p_transprops">transitionHours</div></td>
    <td>number (hours)</td>
    <td>-</td>
    <td>Number of hours before the item transitions into a different item.</td>
    <td>redmeat, hide</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_tprops_stack" data-tt-parent="p_transprops">transitionedStack</div></td>
    <td>object (item or block)</td>
    <td>-</td>
    <td>The item or block that the item will transition into.</td>
    <td>redmeat, hide</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_tprops_ratio" data-tt-parent="p_transprops">transitionRatio</div></td>
    <td>number</td>
    <td>-</td>
    <td>The quantity of the item that will be consumed after the transition period.</td>
    <td>redmeat, hide</td>
  </tr>
<tr>
    <td colspan="5" style='font-size: 14pt; border-bottom: 2pt solid black; padding-left: 100px;'><b>Attributes</b></td>
  </tr>
<tr>
    <td scope="row"><div class="tt" data-tt-id="p_attributes_list" data-tt-parent="root">attributes</div></td>
    <td>-</td>
    <td>-</td>
    <td>Custom Attributes associated with this item.</td>
    <td>barrel, chest, pot, skep</td>
  </tr>
  <tr>
     <td scope="row"><div class="tt" data-tt-id="p_attributes_info" data-tt-parent="p_attributes_list" data-invisible="true"></div></td>
     <td colspan="4">
Attributes constitute a large number of custom properties that an block can have, many of which are specific to unique blocks that rely on a C# class for additional functionality. If you wish to add your own JSON attributes to an item generally you must also have a class to utilize them.
 
Values placed here are final and cannot be modified. For example, if you made a new type of block, say one that damages people when they get close you could define them here:


<syntaxhighlight lang="json">
<syntaxhighlight lang="json">
Line 1,807: Line 1,760:
Attributes that define additional rendering information.
Attributes that define additional rendering information.
</tr>
</tr>
<tr>
    <td scope="row"><div class="tt" data-tt-id="p_alist_tintinventory" data-tt-parent="p_attributes_render">ignoreTintInventory</div></td>
    <td>boolean</td>
    <td>-</td>
    <td>If true, does not apply texture tints to the block model as an inventory item.</td>
    <td>soil</td>
  </tr>
<tr>
    <td scope="row"><div class="tt" data-tt-id="p_alist_mechpower" data-tt-parent="p_attributes_render">mechancialPower</div></td>
    <td>boolean</td>
    <td>-</td>
    <td>A special category of values reserved for mechanical power. Currently only "renderer" is used by the angled gears block to determine which combination of gears to render.</td>
    <td>angledgears</td>
  </tr>
<tr>
    <td scope="row"><div class="tt" data-tt-id="p_alist_pushvec" data-tt-parent="p_attributes_render">pushVector</div></td>
    <td>vector coordinates</td>
    <td>-</td>
    <td>Allows the vector shape of a block to be altered for slopes.</td>
    <td>lava, water</td>
  </tr>
<tr>
<tr>
<td scope="row"><div class="tt" data-tt-id="p_attributes_misc" data-tt-parent="root">(Misc Attributes)</div></td>
<td scope="row"><div class="tt" data-tt-id="p_attributes_misc" data-tt-parent="root">(Misc Attributes)</div></td>
Line 1,907: Line 1,881:
     <td>Can be used to prevent a solid block from connecting to fences.</td>
     <td>Can be used to prevent a solid block from connecting to fences.</td>
     <td>-</td>  
     <td>-</td>  
</tr>
<tr>
  <td scope="row"><div class="tt" data-tt-id="p_alist_grinding" data-tt-parent="p_attributes_misc">grindingProps</div></td>
  <td>-</td>
  <td>-</td>
  <td>Gives the block a grinding recipe in a quern.</td>
  <td>ore-ungraded</td>
</tr>
<tr>
  <td scope="row"><div class="tt" data-tt-id="p_gprops_type" data-tt-parent="p_alist_grinding">type</div></td>
  <td>object</td>
  <td>-</td>
  <td>Type of stack produced, either a <code>block</code> or <code>item</code>.</td>
  <td>-</td>
</tr>
<tr>
  <td scope="row"><div class="tt" data-tt-id="p_gprops_code" data-tt-parent="p_alist_grinding">code</div></td>
  <td>string</td>
  <td>-</td>
  <td>Name of the item or block produced by the recipe.''</td>
  <td>ore-ungraded</td>
</tr>
<tr>
  <td scope="row"><div class="tt" data-tt-id="p_gprops_stacksize" data-tt-parent="p_alist_grinding">stacksize</div></td>
  <td>number</td>
  <td>-</td>
  <td>The amount of the output produced after grinding.''</td>
  <td>ore-ungraded</td>
  </tr>
  </tr>
  <tr>
  <tr>
Line 2,058: Line 2,060:
     <td colspan="5" style='font-size: 14pt; border-bottom: 2pt solid black; padding-left: 100px;'><b>Rendering</b></td>
     <td colspan="5" style='font-size: 14pt; border-bottom: 2pt solid black; padding-left: 100px;'><b>Rendering</b></td>
   </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_textures" data-tt-parent="root">textures</div></td>
Line 2,063: Line 2,067:
     <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>
     <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>
    <td>all blocks</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_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,073: Line 2,078:
     <td></td>
     <td></td>
     <td>The texture definitions for the block as seen in the player inventory. Overrides the textures.</td>
     <td>The texture definitions for the block as seen in the player inventory. Overrides the textures.</td>
    <td>-</td>
   </tr>
   </tr>
   <tr>
   <tr>
Line 2,079: Line 2,085:
     <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>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>Barrel, firepit</td>
   </tr>
   </tr>
   <tr>
   <tr>
Line 2,085: Line 2,092:
     <td></td>
     <td></td>
     <td>The path to the shape json file, the base dir is ''assets/shapes/''.</td>
     <td>The path to the shape json file, the base dir is ''assets/shapes/''.</td>
    <td>-</td>
   </tr>
   </tr>
   <tr>
   <tr>
Line 2,091: Line 2,099:
     <td>0</td>
     <td>0</td>
     <td>Only 90 degree rotations are possible.</td>
     <td>Only 90 degree rotations are possible.</td>
    <td>-</td>
   </tr>
   </tr>
   <tr>
   <tr>
Line 2,097: Line 2,106:
     <td>0</td>
     <td>0</td>
     <td>Only 90 degree rotations are possible.</td>
     <td>Only 90 degree rotations are possible.</td>
    <td>-</td>
   </tr>
   </tr>
   <tr>
   <tr>
Line 2,103: Line 2,113:
     <td>0</td>
     <td>0</td>
     <td>Only 90 degree rotations are possible.</td>
     <td>Only 90 degree rotations are possible.</td>
    <td>-</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_offsetX" data-tt-parent="p_shape">offsetx</div></td>
    <td>float</td>
    <td>0</td>
    <td>Offsets the shape in the X axis.</td>
    <td>-</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_offsetY" data-tt-parent="p_shape">offsety</div></td>
    <td>float</td>
    <td>0</td>
    <td>Offsets the shape in the Y axis.</td>
    <td>-</td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_offsetZ" data-tt-parent="p_shape">offsetz</div></td>
    <td>float</td>
    <td>0</td>
    <td>Offsets the shape in the Z axis.</td>
    <td>-</td>
   </tr>
   </tr>
   <tr>
   <tr>
Line 2,109: Line 2,141:
     <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 players inventory.</td>
    <td>-</td>
   </tr>
   </tr>
   <tr>
   <tr>
Line 2,114: 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>
   </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>&quot;opaque&quot;</td>
     <td></td>
     <td>Determines which [[Modding:Render_Stages#Chunk_render_passes|pass]] the block is drawn in.</td>
    <td>-</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_blockLayer_2" data-tt-parent="p_drawtype">blockLayer_2</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>1</td>
     <td>false</td>
     <td></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>torch</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_blockLayer_3" data-tt-parent="p_drawtype">blockLayer_3</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_ambientocclusion" data-tt-parent="root">ambientocclusion</div></td>
     <td></td>
     <td>boolean</td>
     <td>2</td>
     <td>true</td>
     <td></td>
     <td>If ambient occlusion will be applied to the block.</td>
    <td>-</td>
   </tr>
   </tr>
  <tr>
<tr>
     <td scope="row"><div class="tt" data-tt-id="p_blockLayer_4" data-tt-parent="p_drawtype">blockLayer_4</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_tintindex" data-tt-parent="root">tintindex</div></td>
     <td></td>
     <td>integer</td>
     <td>3</td>
     <td>0</td>
     <td></td>
     <td>'''''0''''' for no tint, '''''1''''' for plant climate tint, '''''2''''' for water climate tint.</td>
    <td>-</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_blockLayer_5" data-tt-parent="p_drawtype">blockLayer_5</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_renderflags" data-tt-parent="root">renderflags</div></td>
     <td></td>
     <td>0 ... 255</td>
     <td>4</td>
     <td>0</td>
     <td></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>
    <td>-</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_blockLayer_6" data-tt-parent="p_drawtype">blockLayer_6</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_facecullmode" data-tt-parent="root">facecullmode</div></td>
     <td></td>
     <td>string</td>
     <td>5</td>
     <td>&quot;default&quot;</td>
     <td></td>
     <td>Determines which sides of the blocks should be rendered.</td>
    <td>-</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_blockLayer_7" data-tt-parent="p_drawtype">blockLayer_7</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_facecullmode_default" data-tt-parent="p_facecullmode">default</div></td>
    <td></td>
    <td>6</td>
     <td></td>
     <td></td>
    <td>0</td>
    <td>Culls faces if they are opaque faces adjacent to opaque faces.</td>
    <td>-</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_json" data-tt-parent="p_drawtype">json</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_facecullmode_default" data-tt-parent="p_facecullmode">nevercull</div></td>
     <td></td>
     <td></td>
     <td>7</td>
     <td>1</td>
     <td>Will draw a json model.</td>
     <td>Never culls any faces.</td>
    <td>-</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_empty" data-tt-parent="p_drawtype">empty</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_facecullmode_default" data-tt-parent="p_facecullmode">merge</div></td>
     <td></td>
     <td></td>
     <td>8</td>
     <td>2</td>
     <td>Nothing will be drawn.</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>
    <td>-</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_cube" data-tt-parent="p_drawtype">cube</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_facecullmode_default" data-tt-parent="p_facecullmode">collapse</div></td>
     <td></td>
     <td></td>
     <td>9</td>
     <td>3</td>
     <td>Draws an ordinary cube.</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>
    <td>-</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_cross" data-tt-parent="p_drawtype">cross</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_facecullmode_default" data-tt-parent="p_facecullmode">mergematerial</div></td>
    <td></td>
    <td>10</td>
     <td></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>
    <td>-</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_transparent" data-tt-parent="p_drawtype">transparent</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_facecullmode_default" data-tt-parent="p_facecullmode">collapsematerial</div></td>
    <td></td>
    <td>11</td>
     <td></td>
     <td></td>
    <td>5</td>
    <td>Same as Collapse but checks for equal material (Example usage: All leaves blocks).</td>
    <td>-</td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_liquid" data-tt-parent="p_drawtype">liquid</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_facecullmode_default" data-tt-parent="p_facecullmode">liquid</div></td>
     <td></td>
     <td></td>
     <td>12</td>
     <td>6</td>
     <td></td>
     <td>Same as CollapseMaterial but also culls faces towards opaque blocks.</td>
  </tr>
    <td>-</td>
</tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_crossandsnowlayer" data-tt-parent="p_drawtype">crossandsnowlayer</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_sideopaque" data-tt-parent="root">sideopaque</div></td>
     <td></td>
     <td>key: string, value: boolean</td>
     <td>13</td>
     <td>-</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>-</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_sideopauqe_info" data-tt-parent="p_sideopaque" data-invisible="true"></div></td>
     <td>string</td>
     <td colspan="4">
    <td>&quot;opaque&quot;</td>
Sides include: ''all; horizontals, verticals; east, west, up, down, north, south''.  
    <td>Determines how the block will be drawn.</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_sideao" data-tt-parent="root">sideao</div></td>
     <td></td>
     <td>key: string, value: boolean</td>
     <td>0</td>
     <td>-</td>
     <td>Used for solid blocks with no half transparency.</td>
     <td>If AmbientOcclusion will be applied for each side.</td>
    <td>-</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_ao_info" data-tt-parent="p_sideao" data-invisible="true"></div></td>
    <td></td>
     <td colspan="4">
    <td>1</td>
Sides include: ''all; horizontals, verticals; east, west, up, down, north, south''.  
    <td>Used for non-solid single faced blocks, such as tall grass.</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>
  </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>
    <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>
   </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_sideemitao" data-tt-parent="root">sideEmitAo</div></td>
    <td>boolean</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>
    <td>-</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>
    <td>-</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>
    <td>-</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>
    <td>-</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>
    <td>-</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>
    <td>-</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>
    <td>-</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>
    <td>-</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>
    <td>-</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>
    <td>-</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>key: string, value: boolean</td>
     <td>-</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>Defines which of the 6 block neighbours should receive AO if this block is in front of them.</td>
  </tr>
  <tr>
    <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_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_west" data-tt-parent="p_sideopaque">west</div><br>
        <div class="tt" data-tt-id="p_sideopaque_up" data-tt-parent="p_sideopaque">up</div><br>
        <div class="tt" data-tt-id="p_sideopaque_down" data-tt-parent="p_sideopaque">down</div><br>
        <div class="tt" data-tt-id="p_sideopaque_north" data-tt-parent="p_sideopaque">north</div><br>
        <div class="tt" data-tt-id="p_sideopaque_south" data-tt-parent="p_sideopaque">south</div>
    </td>
    <td></td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td scope="row"><div class="tt" data-tt-id="p_sideao" data-tt-parent="root">sideao</div></td>
    <td>key: string, value: boolean</td>
     <td>-</td>
     <td>-</td>
    <td>If AmbientOcclusion will be applied for each side.</td>
   </tr>
   </tr>
  <tr>
  <tr>
     <td scope="row">
     <td scope="row"><div class="tt" data-tt-id="p_sideemitao_info" data-tt-parent="p_sideemitao" data-invisible="true"></div></td>
        <div class="tt" data-tt-id="p_sideao_all" data-tt-parent="p_sideao">all</div><br>
    <td colspan="4">
<div class="tt" data-tt-id="p_sideao_horizontals" data-tt-parent="p_sideao">horizontals</div><br>
Sides include: ''all; horizontals, verticals; east, west, up, down, north, south''.
<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>
   <tr>
   <tr>
Line 2,360: Line 2,281:
     <td>key: string, value: boolean</td>
     <td>key: string, value: boolean</td>
     <td>-</td>
     <td>-</td>
     <td>Determins 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>
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row">
     <td scope="row"><div class="tt" data-tt-id="p_sidesolid_info" data-tt-parent="p_sidesolid" data-invisible="true"></div></td>
        <div class="tt" data-tt-id="p_sidesolid_all" data-tt-parent="p_sidesolid">all</div><br>
    <td colspan="4">
<div class="tt" data-tt-id="p_sidesolid_horizontals" data-tt-parent="p_sidesolid">horizontals</div><br>
Sides include: ''all; horizontals, verticals; east, west, up, down, north, south''.
<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_west" data-tt-parent="p_sidesolid">west</div><br>
        <div class="tt" data-tt-id="p_sidesolid_up" data-tt-parent="p_sidesolid">up</div><br>
        <div class="tt" data-tt-id="p_sidesolid_down" data-tt-parent="p_sidesolid">down</div><br>
        <div class="tt" data-tt-id="p_sidesolid_north" data-tt-parent="p_sidesolid">north</div><br>
        <div class="tt" data-tt-id="p_sidesolid_south" data-tt-parent="p_sidesolid">south</div>
    </td>
    <td></td>
    <td></td>
    <td></td>
   </tr>
   </tr>
   <tr>
   <tr>
Line 2,386: Line 2,297:
   </tr>
   </tr>
   <tr>
   <tr>
     <td scope="row"><div class="tt" data-tt-id="p_randomrotations" data-tt-parent="root">randomRotations</div></td>
     <td scope="row"><div class="tt" data-tt-id="p_randomrotations" data-tt-parent="root">randomizeRotations</div></td>
     <td>boolean</td>
     <td>boolean</td>
     <td>false</td>
     <td>false</td>
     <td>If true then the block will be randomly rotated when placed.</td>
     <td>If true then the block will be randomly rotated when placed. Note: Many random rotated blocks in one chunk will slow down block placement updates. You can increase efficieny by defining alternate shapes with random rotations instead.</td>
     <td>flower</td>
     <td>flower</td>
   </tr>
   </tr>
Confirmedusers, Bureaucrats, editor, Administrators
1,779

edits