
Some properties can now be defined per material and then references from modules and schematics.
Material data is organized in folders based on the type of the material (e.g. wood, metal or skin) with one file/resource per material. Modules and
schematics can then reference a specific material (e.g. wood/spruce or misc/bone) or all materials of a type (e.g. wood or metal) and defined how
the properties of those materials should be applied for the module.
Here's the material definition for oak:
{
"key": "oak",
"category": "wood",
"primary": "3",
"secondary": "4",
"tertiary": "6",
"durability": "5.2",
"integrityCost": "1",
"integrityGain": "4",
"magicCapacity": "90",
"toolLevel": "1",
"toolEfficiency": "2",
"tints": {
"glyph": "oak_glyph",
"texture": "oak"
},
"textures": ["crude", "default"],
"material": {
"tag": "minecraft:planks"
},
"requiredTools": {
"axe": 1
}
}
And here's diamond:
{
"key": "diamond",
"category": "gem",
"primary": "6",
"secondary": "7",
"tertiary": "0",
"durability": "156.1",
"integrityCost": "2",
"integrityGain": "2",
"magicCapacity": 60,
"toolLevel": "4",
"toolEfficiency": "8",
"tints": {
"glyph": "diamond_glyph",
"texture": "diamond"
},
"textures": ["shiny", "crude", "default"],
"material": {
"item": "minecraft:diamond"
},
"improvements": {
"arrested": 0
},
"requiredTools": {
"hammer": 3
}
}
Each material json file contain a single json object with the following fields:
Identifier for the material, will be used as suffix for module variants from this material
Applied to all module variants from this material, default: "misc"
Multiplier for primary attributes & effects. Should represent hardness, sharpness or the ability to shape this material into something with a hard/sharp edge
Multiplier for secondary attributes & effects. Should represent material density, rigidity or weight, how much kinetic energy does this carry as it's swung
Multiplier for tertiary attributes & effects. Should represent flexibility or tensile strength(?), how fast does this material spring back when bent
Durability base, modules use this to determine flat or multiplier durability bonuses
Multiplier for modules that provide integrity
Multiplier for modules that consume integrity
The magic capacity of major modules variants made from this material
Modules that provide tools that vary based on material use this to determine the level of the tools
Modules that provide tools that vary based on material use this to determine the efficiency of the tools
All modules made from this material will provide these attributes, e.g. mystical world amethyst items always provide luck
All modules made from this material will provide these effects, e.g. mana steel should always provide mana repair
All major modules made from this material will have these improvements, e.g. major diamond should always have the arrested improvement
- texture: Hexadecimal string for tinting of textures, can reference item colors
- glyph: Hexadecimal string for tinting glyphs in the workbench UI, can reference item colors
An array of texture suffixes that this material would prefer to use, the first one matching a texture provided by the module will be used
Force all modules variants of this material to use the first texture regardless if it matches one provided by the module (not sure about this, it would break when tetra updates and for pack<->pack compat)
Defines which items are required as materials for crafting module variants of this material, either tag or item is required
- tag: Reference to an item tag
- item: Reference to an item
- count: (optional) Multiplier for the number of items required, default: 1
Defines the tools (and which levels) that are required to craft module variants of this material, schematics may add additional tools and multiply/offset the levels provided here
For determining the properties I've used:
- sword/pickaxe durability to determine durability
- enchantability multiplied by 6 for magic capacity (multiplier fit well with cost of enchantments)
- vanilla harvest level values +1 for tool levels (note that tool level is subtracted by 1 before passed back to vanilla as harvest level)
- vanilla harvest efficiency for tool efficiency
- sword damage -1 for the primary multiplier
The remaining properties are based on research on the material and some balancing, and just feeling ¯\_(ツ)_/¯
Vanilla materials are grouped/structured like this:
├── fabric │ └── wool.json ├── fibre │ ├── phantom_membrane.json │ ├── string.json │ ├── twisting_vine.json │ ├── vine.json │ └── weeping_vine.json ├── gem │ ├── amethyst.json │ ├── diamond.json │ └── emerald.json ├── metal │ ├── gold.json │ ├── iron.json │ └── netherite.json ├── misc │ ├── blaze_rod.json │ ├── bone.json │ └── end_rod.json ├── scale │ └── turtle_scute.json ├── skin │ ├── hide.json │ └── leather.json ├── stone │ ├── andesite.json │ ├── blackstone.json │ ├── diorite.json │ ├── flint.json │ ├── granite.json │ ├── obsidian.json │ └── stone.json └── wood ├── acacia.json ├── birch.json ├── crimson.json ├── dark_oak.json ├── oak.json ├── spruce.json └── warped.json
Module variants that contain a materials field are treated as material entries. Multiple material variant entries may be provided per module, useful for when different types of materials should have their properties applied slightly different (e.g. axes). Material variant entries contain the following fields:
A list of resource locations referencing specific materials or types of materials
Combined with the material key to yield the key for each variant
Static attributes, used to offset attributes or to provide flat modifiers, e.g. attack speed for basic blades or pickaxes
Static durability, used to offset the durability extracted from the material
Static durability multiplier, used to offset the durability extracted from the material
Static integrity, used to offset the integrity extracted from the material
Static tools that should not base the level/efficiency on the material, e.g. cut for basic blades
Static effects that should not base the level/efficiency on the material, e.g. sweeping for basic blades
Static models that should not be suffixed or tinted based on material
Static magic capacity, can be used to offset to the magic capacity provided by the material
An object with fields that defines which (and how) properties should be extracted from the material
Attributes that will be multiplied by the material's primary multiplier
Attributes that will be multiplied by the material's secondary multiplier
Attributes that will be multiplied by the material's tertiary multiplier
Effects that will be multiplied (both level and efficiency) by the material's primary multiplier
Effects that will be multiplied (both level and efficiency) by the material's secondary multiplier
Effects that will be multiplied (both level and efficiency) by the material's tertiary multiplier
Defines durability that should be based on the material's durability factor
Defines a durability multiplier that should be based on the material's durability factor, skipped if not provided
Defines integrity gain/cost that should be based on the material's integrity factor. Decimal value are allowed, the result will be rounded off to the nearest integer
Defines how much of the material's magic capacity that should apply for this module. Typically a value of 1 should be used for modules that are enchantable, otherwise omitted
Tools that should be based the level/efficiency on the material, e.g. pickaxe for pickaxes
The glyph for the module, the tint from the material will be used
Module models that should be tinted and suffixed based on the material
Texture suffixes available for model textures, the first material texture that matches one of the available textures will be used, if none matches the first of the available textures will be used
The extracted durability multiplier is currently a bit broken, the durability of diamond is 30 times the durability of wood. Without a flat modifier a module/improvement that is balanced so that wood provides a 5% durability increase would then have the diamond variant provide a 150% durability increase.
Below is the material variant entry for the basic pickaxe:
{
/* ... */
"variants": [
{
"materials": [
"tetra:metal/",
"tetra:stone/",
"tetra:wood/",
"tetra:gem/",
"tetra:misc/bone"
],
"key": "basic_pickaxe/",
"attributes": {
"generic.attack_damage": -2,
"generic.attack_speed": -0.2
},
"tools": {
"pickaxe": -1
},
"durability": -10,
"extract": {
"primaryAttributes": {
"generic.attack_damage": 1
},
"tools": {
"pickaxe": [1, 0.8333]
},
"durability": 0.5,
"integrity": -1,
"magicCapacity": 1,
"glyph": {
"textureX": 176
},
"availableTextures": ["metal", "crude"],
"models": [
{ "location": "tetra:items/module/double/head/basic_pickaxe/" }
]
}
}
/* ... */
]
}
Double pickaxe heads gain 1 harvest level from a synergy bonus so there's a flat reduction of -1 pickaxe level for all variants and a 1x pickaxe level multiplier based on the material.
Here's the material variant entry for the heavy blade. Its damage is based on both the primary and the secondary attribute.
{
/* ... */
"variants": [
{
"materials": ["tetra:metal/", "tetra:stone/", "tetra:wood/"],
"key": "heavy_blade/",
"attributes": {
"generic.attack_speed": -1.2
},
"durability": -20,
"integrity": -1,
"extract": {
"primaryAttributes": {
"generic.attack_damage": 0.8
},
"secondaryAttributes": {
"generic.attack_damage": 0.4,
"generic.attack_speed": -0.2
},
"tools": {
"cut": [1, 2]
},
"durability": 1,
"integrity": -1,
"magicCapacity": 1,
"glyph": {
"textureX": 48
},
"availableTextures": ["metal", "shiny", "grainy", "crude"],
"models": [{ "location": "tetra:items/module/sword/blade/heavy/" }]
}
}
/* ... */
]
}
Schematic outcomes that contain a materials field are treated as material entries, they contain the following fields:
A list of resource locations referencing specific materials or types of materials
Reference to the module that should be crafted
Combined with the material key to yield the key for each variant
Offsets the number of required materials
Multiplies the number of required materials. Decimal values allowed, the result is rounded to the nearest integer
Offsets the level for required tools defined by the material
Multiplies the level for required tools defined by the material. Decimal values allowed, the result is rounded to the nearest integer
Adds additional tool requirements in addition to those required by the material
This is the outcomes array for the basic blade:
{
/* ... */
"outcomes": [
{
"materials": [
"tetra:wood/",
"tetra:stone/",
"tetra:metal/",
"tetra:gem/",
"tetra:misc/bone"
],
"moduleKey": "sword/basic_blade",
"moduleVariant": "basic_blade/"
}
]
}
It's possible to mix material entries with the old approach when defining module variants and schematic outcomes.
This should reduce the need for repetition when creating content, make it possible for datapacks/mod compat to work together and make material stats more consistent between modules.