master
rubenwardy 2014-12-12 20:04:24 +00:00
parent 624c1f1de2
commit 2333e32109
9 changed files with 330 additions and 75 deletions

View File

@ -11,15 +11,15 @@ You can contribute to this project on GitHub.
It uses Jekyll to turn Markdown into a website.
Book written by rubenwardy and contributers.
License: CC-BY-NC-SA 3.0
License: CC-BY-SA 3.0
Contributing
------------
You don't need to run jekyll, you can just edit and create files in
chapters. In fact, you don't even need to do markdown, send me a word document
and I can convert it into the correct formatting. It is the writing which is the hard
bit, not the formatting.
and I can convert it into the correct formatting.
It is the writing which is the hard bit, not the formatting.
Running as a Website
--------------------

View File

@ -1,5 +1,4 @@
name: Minetest Tutorial and Documentation
description: Simple and easy to understand tutorial book
author: rubenwardy and contributors
permalink: pretty
absolute_url: http://rubenwardy.github.io/minetest_doc

View File

@ -8,8 +8,11 @@
</head>
<body>
<ul id="navbar">
<li><a href="{{ page.root }}" class="title">Minetest Tutorials</a></li>
<li><a href="{{ page.root }}folders">1 - Folder Structure</a></li>
<li><a href="{{ page.root }}index.html" class="title">Minetest Tutorials</a></li>
<li><a href="{{ page.root }}chapters/folders.html">1 - Folder Structure</a></li>
<li><a href="{{ page.root }}chapters/nodes_items_crafting.html">2 - Nodes, Items and Crafting</a></li>
<li><hr></li>
<li><a href="{{ page.root }}book_index.html">Index</a></li>
</ul>
<div id="page">
<h1>{{ page.title }}</h1>

26
book_index.md Normal file
View File

@ -0,0 +1,26 @@
---
title: Index
permalink: book_index.html
layout: default
root: ../
---
## C
* Craft item
* [Registering Nodes and Items]({{ page.root }}chapters/nodes_items_crafting.html#registering-a-craftitem)
## F
* Food
* [Registering Nodes and Items]({{ page.root }}chapters/nodes_items_crafting.html#foods)
## I
* Item String
* [Registering Nodes and Items]({{ page.root }}chapters/nodes_items_crafting.html#item-strings)
## N
* Name
* [Registering Nodes and Items]({{ page.root }}chapters/nodes_items_crafting.html#item-strings)
* Nodes
* [Registering Nodes and Items]({{ page.root }}chapters/nodes_items_crafting.html#registering-a-basic-node)
* Node boxes
* [Registering Nodes and Items]({{ page.root }}chapters/nodes_items_crafting.html#node-boxes)

View File

@ -1,7 +1,6 @@
---
title: Folder Structure
layout: default
permalink: folders/index.html
root: ../
---
@ -11,16 +10,9 @@ Introduction
In this chapter we will learn how the basic structure of a mod's folder.
This is essential for creating mods.
### What you will need:
* A plain text editor (eg: NotePad+, ConTEXT, or GEdit)
* OR A Lua IDE such as Eclipse.
* A copy of Minetest in the 0.4 series. (eg: 0.4.10)
### Contents
* Mod Folders
* Dependencies
* Mod Packs
* Dependencies
* Registering a simple node
Mod Folders
-----------
@ -110,4 +102,3 @@ minetest.register_node("mymod:node",{
Our mod has a name of "mymod". It has two files: init.lua and depends.txt.
The script prints a message and then registers a node which will be explained in the next chapter.
The depends text file adds a dependency to the default mod, which is in minetest_game.

View File

@ -0,0 +1,218 @@
---
title: Nodes, Items and Crafting
layout: default
root: ../
---
Introduction
------------
In this chapter we will learn how to register a new node or craftitem,
and create craft recipes.
* Item Names
* Registering a Craftitem
* Registering a Node
* Drawtypes
Item Strings
------------
Each item, whether that be a node, craftitem, tool or entity, has an item string.\\
This is oftenly refered to as just name or registered name.
A string in programming terms is a piece of text.
modname:itemname
The modname is the name of the folder your mod is in.
You may call the itemname any thing you like, however it should be relevant to what the item is,
and it can't be already registered.
### Overriding
Overriding allows you to:
* Create an item in another mod's namespace.
* Override an existing item.
To override, you prefix the item string with a colon, ``:``.
Declaring an item as ``:default:dirt`` will override the default:dirt in the default mod.
Textures
--------
Normally textures have a resolution of 16x16, but they can be in the order of 2: 16, 32, 64, 128, etc.
Textures should be placed in textures/. Their name should match ``modname_itemname.png``.\\
JPEGs are supported, but PNGs are recommended for non-realistic textures.
Registering a Craftitem
-----------------------
Craftitems are the simplist item in Minetest. Craftitems cannot be placed in the world.
They are used in recipes to create other items, or they can be used be the player, such as food.
{% highlight lua %}
minetest.register_craftitem("mymod:diamond_fragments", {
description = "Alien Diamond Fragments",
inventory_image = "mymod_diamond_fragments.png"
})
{% endhighlight %}
Definitions are usually made up of an [item string](#item-strings) to identify the definition,
and a definition table.
### Foods
Foods are items that cure health. To create a food item, you need to define the on_use property like this:
{% highlight lua %}
minetest.register_craftitem("mymod:mudpie", {
description = "Alien Mud Pie",
inventory_image = "myfood_mudpie.png",
on_use = minetest.item_eat(20)
})
{% endhighlight %}
The number supplied to the minetest.item_eat function is the number of hit points that are healed by this food.
Two hit points make one heart, and because there are 10 hearts there are 20 hitpoints.
Hitpoints don't have to be integers (whole numbers), they can be decimals.
Registering a basic node
------------------------
In Minetest, a node is an item that you can place.
Most nodes are 1m x 1m x 1m cubes, however the shape doesn't
have to be a cube - as we will explore later.
Let's get onto it. A node's definition table is very similar to a craftitem's
definition table, however you need to set the textures for the faces of the cube.
{% highlight lua %}
minetest.register_node("mymod:diamond", {
description = "Alien Diamond",
tiles = {"mymod_diamond.png"},
is_ground_content = true,
groups = {cracky=3, stone=1}
})
{% endhighlight %}
Let's ignore ``groups`` for now, and take a look at the tiles.
The ``tiles`` property is a table of texture names the node will use.
When there is only one texture, this texture is used on every side.
What if you would like a different texture for each side?
Well, you give a table of 6 texture names, in this order:\\
up (+Y), down (-Y), right (+X), left (-X), back (+Z), front (-Z).
(+Y, -Y, +X, -X, +Z, -Z)
Remember: +Y is upwards in Minetest, along with most video games.
A plus direction means that it is facing positive co-ordinates,
a negative direction means that it is facing negative co-ordinates.
{% highlight lua %}
minetest.register_node("mymod:diamond", {
description = "Alien Diamond",
tiles = {
"mymod_diamond_up.png",
"mymod_diamond_down.png",
"mymod_diamond_right.png",
"mymod_diamond_left.png",
"mymod_diamond_back.png",
"mymod_diamond_front.png"
},
is_ground_content = true,
groups = {cracky = 3},
drop = "mymod:diamond_fragments"
-- ^ Rather than dropping diamond, drop mymod:diamond_fragments
})
{% endhighlight %}
Crafting
--------
There are several different types of crafting,
identified by the ``type`` property.
* shaped - Ingredients must be in the correct position.
* shapeless - It doesn't matter where the ingredients are,
just that there is the right amount.
* cooking - Recipes for the furnace to use.
* tool_repair - Used to allow the repairing of tools.
Craft recipes do not use Item Strings.
### Shaped
Shaped recipes are the normal recipes - the ingredients have to be in the
right place.
For example, when you are making a pickaxe the ingredients have to be in the
right place for it to work.
{% highlight lua %}
minetest.register_craft({
output = "mymod:diamond_chair",
recipe = {
{"mymod:diamond_fragments", "", ""},
{"mymod:diamond_fragments", "mymod:diamond_fragments", ""},
{"mymod:diamond_fragments", "mymod:diamond_fragments, ""}
}
})
{% endhighlight %}
This is pretty self-explanatory. You don't need to define the type, as
shaped crafts are default.
If you notice, there is a blank column at the far end.
This means that the craft must always be exactly that.
In most cases, such as the door recipe, you don't care if the ingredients
are always in an exact place, you just want them correct relative to each
other. In order to do this, delete any empty rows and columns.
In the above case, their is an empty last column, which, when removed,
allows the recipe to be crafted if it was all moved one place to the right.
{% highlight lua %}
minetest.register_craft({
output = "mymod:diamond_chair",
recipe = {
{"mymod:diamond_fragments", ""},
{"mymod:diamond_fragments", "mymod:diamond_fragments",
{"mymod:diamond_fragments", "mymod:diamond_fragments}
}
})
{% endhighlight %}
(Explainations of more crafting types are coming soon)
Groups
------
Items can be members of many groups, and groups may have many members.
Groups are usually identified using ``group:group_name``
There are several reason you use groups.
Groups can be used in crafting recipes to allow interchangeability
of ingredients. For example, you may use group:wood to allow any wood
item to be used in the recipe.
### Dig types
Let's look at our above ``mymod:diamond`` definition. You'll notice this line:
{% highlight lua %}
groups = {cracky = 3}
{% endhighlight %}
Cracky is a digtype. Dig types specify what type of the material the node is
physically, and what tools are best to destroy it.
| Group | Description |
|-------------------------|----------------------------------------------------------------------------------------------|
| crumbly | dirt, sand |
| cracky | tough but crackable stuff like stone. |
| snappy | something that can be cut using fine tools; e.g. leaves, smallplants, wire, sheets of metal |
| choppy | something that can be cut using force; e.g. trees, wooden planks |
| fleshy | Living things like animals and the player. This could imply some blood effects when hitting. |
| explody | Especially prone to explosions |
| oddly_breakable_by_hand | Torches, etc, quick to dig |

View File

@ -14,6 +14,13 @@ to complete.
This documentation was created by the Minetest community in order to help
new modders gain a foothold.
What you will need:
-------------------
* A plain text editor (eg: NotePad+, ConTEXT, or GEdit)
* OR A Lua IDE such as Eclipse.
* A copy of Minetest in the 0.4 series. (eg: 0.4.10)
Contribution
------------

View File

@ -5,6 +5,11 @@ html, body {
background: #333;
}
a {
color: blue;
text-decoration: underline;
}
#page {
background: white;
margin: 0;
@ -34,6 +39,12 @@ html, body {
padding: 0;
}
#navbar li hr {
height: 1px;
background: #666;
border: none;
}
#navbar li a {
display: block;
padding: 5px;

View File

@ -1,63 +1,63 @@
/* https://github.com/mojombo/tpw/blob/master/css/syntax.css -MIT licensed*/
/* https://raw.githubusercontent.com/richleland/pygments-css/master/friendly.css */
.highlight { background: #ffffff; }
.highlight .c { color: #999988; font-style: italic } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { font-weight: bold } /* Keyword */
.highlight .o { font-weight: bold } /* Operator */
.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */
.highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */
.highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #60a0b0; font-style: italic } /* Comment */
.highlight .err { border: 1px solid #FF0000 } /* Error */
.highlight .k { color: #007020; font-weight: bold } /* Keyword */
.highlight .o { color: #666666 } /* Operator */
.highlight .cm { color: #60a0b0; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #007020 } /* Comment.Preproc */
.highlight .c1 { color: #60a0b0; font-style: italic } /* Comment.Single */
.highlight .cs { color: #60a0b0; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #A00000 } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #999999 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gr { color: #FF0000 } /* Generic.Error */
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #00A000 } /* Generic.Inserted */
.highlight .go { color: #808080 } /* Generic.Output */
.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #aaaaaa } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { font-weight: bold } /* Keyword.Constant */
.highlight .kd { font-weight: bold } /* Keyword.Declaration */
.highlight .kp { font-weight: bold } /* Keyword.Pseudo */
.highlight .kr { font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #009999 } /* Literal.Number */
.highlight .s { color: #d14 } /* Literal.String */
.highlight .na { color: #008080 } /* Name.Attribute */
.highlight .nb { color: #0086B3 } /* Name.Builtin */
.highlight .nc { color: #445588; font-weight: bold } /* Name.Class */
.highlight .no { color: #008080 } /* Name.Constant */
.highlight .ni { color: #800080 } /* Name.Entity */
.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #990000; font-weight: bold } /* Name.Function */
.highlight .nn { color: #555555 } /* Name.Namespace */
.highlight .nt { color: #000080 } /* Name.Tag */
.highlight .nv { color: #008080 } /* Name.Variable */
.highlight .ow { font-weight: bold } /* Operator.Word */
.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
.highlight .gt { color: #0040D0 } /* Generic.Traceback */
.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #007020 } /* Keyword.Pseudo */
.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #902000 } /* Keyword.Type */
.highlight .m { color: #40a070 } /* Literal.Number */
.highlight .s { color: #4070a0 } /* Literal.String */
.highlight .na { color: #4070a0 } /* Name.Attribute */
.highlight .nb { color: #007020 } /* Name.Builtin */
.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */
.highlight .no { color: #60add5 } /* Name.Constant */
.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */
.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */
.highlight .ne { color: #007020 } /* Name.Exception */
.highlight .nf { color: #06287e } /* Name.Function */
.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */
.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */
.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #bb60d5 } /* Name.Variable */
.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mf { color: #009999 } /* Literal.Number.Float */
.highlight .mh { color: #009999 } /* Literal.Number.Hex */
.highlight .mi { color: #009999 } /* Literal.Number.Integer */
.highlight .mo { color: #009999 } /* Literal.Number.Oct */
.highlight .sb { color: #d14 } /* Literal.String.Backtick */
.highlight .sc { color: #d14 } /* Literal.String.Char */
.highlight .sd { color: #d14 } /* Literal.String.Doc */
.highlight .s2 { color: #d14 } /* Literal.String.Double */
.highlight .se { color: #d14 } /* Literal.String.Escape */
.highlight .sh { color: #d14 } /* Literal.String.Heredoc */
.highlight .si { color: #d14 } /* Literal.String.Interpol */
.highlight .sx { color: #d14 } /* Literal.String.Other */
.highlight .sr { color: #009926 } /* Literal.String.Regex */
.highlight .s1 { color: #d14 } /* Literal.String.Single */
.highlight .ss { color: #990073 } /* Literal.String.Symbol */
.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */
.highlight .vc { color: #008080 } /* Name.Variable.Class */
.highlight .vg { color: #008080 } /* Name.Variable.Global */
.highlight .vi { color: #008080 } /* Name.Variable.Instance */
.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */
.highlight .mf { color: #40a070 } /* Literal.Number.Float */
.highlight .mh { color: #40a070 } /* Literal.Number.Hex */
.highlight .mi { color: #40a070 } /* Literal.Number.Integer */
.highlight .mo { color: #40a070 } /* Literal.Number.Oct */
.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */
.highlight .sc { color: #4070a0 } /* Literal.String.Char */
.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */
.highlight .s2 { color: #4070a0 } /* Literal.String.Double */
.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */
.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */
.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */
.highlight .sx { color: #c65d09 } /* Literal.String.Other */
.highlight .sr { color: #235388 } /* Literal.String.Regex */
.highlight .s1 { color: #4070a0 } /* Literal.String.Single */
.highlight .ss { color: #517918 } /* Literal.String.Symbol */
.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */
.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */
.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */
.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */
.highlight .il { color: #40a070 } /* Literal.Number.Integer.Long */