Modding:Content Tutorial Further Recipes: Difference between revisions

From Vintage Story Wiki
m
no edit summary
(Upload page.)
 
mNo edit summary
Line 31: Line 31:


== Navigating Assets ==
== Navigating Assets ==
This tutorial is simply to create new recipes - The only file is ''recipes/grid/sleekdoor.json''. This is a simple recipe, which inputs an oak solid door and outputs an oak sleek door.<syntaxhighlight lang="json">
{
"ingredientPattern": "D",
"width": 1,
"height": 1,
"ingredients": {
"D": {
"type": "block",
"code": "game:door-solid-oak"
}
},
"output": {
"type": "block",
"code": "game:door-sleek-windowed-oak"
}
}
</syntaxhighlight>


== Variant-Based Recipes ==
This tutorial is simply to create new recipes - The only file is ''recipes/grid/sleekdoor.json''. This is a simple recipe, which inputs an oak solid door and outputs an oak sleek door.
The code that is given within the recipe file works to create an oak sleek door from an oak solid door. However, there exists a sleek door for every solid door, ''so let's go ahead and create 13 or so other recipes for the other wood types''.
 
Of course, there's a much easier way of doing that, and it uses the variant system.
 
Firstly, let's add a wildcard into out ingredient's code to allow us to use a solid door of any type.<syntaxhighlight lang="json">
"D": {
"type": "block",
"code": "game:door-solid-*"
}
</syntaxhighlight>So, the recipe now inputs any type of solid door, but will always return an ''oak'' sleek door. There needs to be a way of copying the text from the wildcard ( '''*''' ) and using it within the output.
 
By using the "''name''" property in the ingredient, you can achieve exactly that.<syntaxhighlight lang="json">
"D": {
"type": "block",
"code": "game:door-solid-*",
"name": "wood"
}
</syntaxhighlight>This now marks the recipe as containing a variant called "''wood''". Note that this name can be anything, it does not have to match with the variant code used when the item or block was defined.
 
To use this in the output, you can use a ''variant substitution'' ('''{ }''') in the output code.<syntaxhighlight lang="json">
"output": {
"type": "block",
"code": "game:door-sleek-windowed-{wood}"
}
</syntaxhighlight>Make sure that you use the variant code you defined earlier (using "''name''") is the same as the substitution in your output.
 
'''Important:''' You cannot name more than one variant per ingredient.
 
If you test your recipe now, you'll find that you can create any sleek door from its appropriate solid door type.
 
== More Tool-Usage ==
In the previous recipes tutorial, you used a hammer to create gold brick blocks. Add another ingredient to the sleek door recipe to make the recipe require a saw of any type.<syntaxhighlight lang="json">
{
"ingredientPattern": "S,D",
"width": 1,
"height": 2,
"ingredients": {
"S": {
"type": "item",
"code": "game:saw-*",
"isTool": true
},
"D": {
"type": "block",
"code": "game:door-solid-*",
"name": "wood"
}
},
"output": {
"type": "block",
"code": "game:door-sleek-windowed-{wood}"
}
}
</syntaxhighlight>This is a fairly simple modification, it just changes the pattern, height, and adds the extra saw ingredient.
 
The saw is marked as a tool, so it will lose a single durability point when the recipe is created. However, you may be aware that some recipes use more tool durability than others. To achieve this, you can add a "toolDurabilityCost" property to the tool ingredient.<syntaxhighlight lang="json">
"S": {
"type": "item",
"code": "game:saw-*",
"isTool": true,
"toolDurabilityCost": 10
},
</syntaxhighlight>If you test this, you will find that the door now requires a saw to make, which will lose 10 durability when the recipe is complete.
 
[[File:ContentTutorialComplexGridRecipe Sleek Door With Saw Shaped.png|frameless]]
 
== Shapeless Recipes ==
All the examples given so far have been ''shaped'' recipes, meaning that the ingredients must be placed in the order defined in the "''ingredientPattern''" property. However, there are some instances where we might now want to worry about the layout of the ingredients. To now make the sleek door recipe shapeless, add the "''shapeless"'' property.
{| class="wikitable mw-collapsible mw-collapsed"
|Shapeless sleek door recipe...
|-
|<syntaxhighlight lang="json">
{
"ingredientPattern": "S,D",
"width": 1,
"height": 2,
"shapeless": true,
"ingredients": {
"S": {
"type": "item",
"code": "game:saw-*",
"isTool": true,
"toolDurabilityCost": 10
},
"D": {
"type": "block",
"code": "game:door-solid-*",
"name": "wood"
}
},
"output": {
"type": "block",
"code": "game:door-sleek-windowed-{wood}"
}
}
</syntaxhighlight>
|}
Now, the saw and door can be arranged in any order in the crafting grid.
 
[[File:ContentTutorialComplexGridRecipes Shapeless Recipe.png|frameless]]
 
== Extra-Outputs & Returned Stacks ==
In some recipes, ingredients can be turned into a different itemstack instead of being consumed.
 
The sleek door looks like a solid door with a couple of planks removed for a window, so you should return two wooden planks to the player when they create it.
 
To do this, you can use the "''returnedStack"'' property on an ingredient.<syntaxhighlight lang="json">
"D": {
"type": "block",
"code": "game:door-solid-*",
"name": "wood",
"returnedStack": {
"type": "item",
"code": "game:plank-{wood}",
"quantity": 2
}
}
</syntaxhighlight>Notice that you can still use variant substitutions here, as well as a quantity value. If you test your recipe now, your recipe will give you two wooden planks when the sleek door is created. Note that you have to create the door for the returnedStacks to be created.
 
You can only have one returned stack per ingredient.


== Conclusion ==
== Conclusion ==
Line 181: Line 44:
== Going Further ==
== Going Further ==
Want to make some additional changes to this mod? Try and achieve the following things!
Want to make some additional changes to this mod? Try and achieve the following things!
Create a new recipe that allows you to change any sleek door back into a solid door. What gameplay problem would arise from this, and how could you solve it?
{| class="wikitable mw-collapsible mw-collapsed"
|To achieve this...
|-
|Copy the appropriate recipe, however make the input a sleek door with a wood variant, and the output code a solid door using the defined wood variant.
The issue with this is the returned two planks when creating a sleek door - Which could result in an infinite number of wooden planks if the player kept exchanging between solid and sleek doors. To fix this, you could add another ingredient of two planks for the sleek to solid door recipe.
|}
Change the original recipe to stop the player from using a copper saw to make sleek doors. (Hint: The "''skipVariants"'' property (which accepts an array) in an ingredient allows you to control what variants cannot be used in a wildcard.)
{| class="wikitable mw-collapsible mw-collapsed"
|To achieve this...
|-
|Add the "''skipVariants''" property to the saw ingredient, with an array containing just "''copper''".<syntaxhighlight lang="json">
"S": {
"type": "item",
"code": "game:saw-*",
"skipVariants": [ "copper" ],
"isTool": true,
"toolDurabilityCost": 10
},
</syntaxhighlight>
|}


{{Navbox/contentmodding}}
{{Navbox/contentmodding}}
</translate>
</translate>
Confirmedusers
615

edits