Modding Intro/de

From Minetest Developer Wiki
Jump to: navigation, search
Language: English  • Deutsch

Eine andere Hilfe ist verfügbar:

Das Minetest Modding Online Tutorial Buch ist eine vollständigere und einfacher zu verstehende Anleitung. Allerdings ist sie nur auf Englisch verfügbar.




Minetest hat ein Scripting API'. ('Application 'Programming 'Interface), mit dem mods (kurz für "Modifikationen") für das Spiel programmiert, seine Funktionen erweitert und neue Elemente hinzugefügt werden.

Auf diese API wird über eine einfach zu bedienende Programmiersprache namens LUA zugegriffen.

Das Einzige, was Sie benötigen, sind grundlegende Programmierkenntnisse. Wenn du keine Programmierkenntnisse hast, kannst du dieCodecademy benutzen, um zu lernen. Es wird dir die Grundlagen der Programmierung beibringen (es ist JavaScript, nicht Lua, aber es hilft trotzdem).

Genauer gesagt, ist die Version von Lua 5.1 (Referenzhandbuch,Buch).


Contents

Installationsverzeichniss

Siehe Installing_Mods.

Modding basics

Arten von Objekten in Minetest

Es gibt die drei Arten von Objekten, die in Minetest definiert werden können. Der Typ des Objekts ist wichtig, da er eine Rolle in den Eigenschaften dieses Objekts spielt.

Mod-Pakete und Item-Namen

Jeder Block, jedes Werkzeug und jedes Item benötigt einen eindeutigen Namen, um es in der API zu identifizieren.

Das Format des Namens ist: modname:itemname. In diesem Fall heißt die Mod modname (der Name wird durch den Ordnernamen vorgegeben oder einen in der mod.conf festgelegten Namen) und der Block wird itemname genannt. In diesem Tutorial werden wir den Block tutorial:decowood erstellen.

Beispielsweise ist default:dirt der eindeutige Name für Dirt/Erde.

Mod-Ordnerstruktur

Im Folgenden wird die Ordnerstruktur einer Mod beschrieben. Die einzige benötigte Datei ist init.lua.

mods
|-- modname
|   |-- description.txt
|   |-- init.lua
|   |-- mod.conf
|   |-- readme.md
|   |-- screenshot.png
|   |-- settingtypes.txt
|   |-- textures
|   |   |-- modname_stuff.png
|   |   \-- modname_something_else.png
|   |-- sounds
|   |-- media
|   \-- custom_data
|
\-- another_mod

mods - Pfad zu den Minetest Mods. modname - Der Name deiner Mods. description.txt - Eine Beschreibung deiner Mod (wird von Mod-Managern verwendet). Der erste Satz sollte weniger als 100 Zeichen lang sein. Es sollte ausreichen, um die Mod zu beschreiben. Weitere Informationen können in andere Sätze eingefügt werden.

  • init.lua - Haupt Lua-Skript.
    Das Haupt Lua-Skript. Die Ausführung dieses Skripts sollte alles registrieren, was es registrieren möchte. Die anschließende Ausführung hängt davon ab, dass Minetest die registrierten Callbacks aufruft.
  • mod.conf - Config-Datei für die Mod. Enthält `name=modname` und depends=depencies
  • readme.md - Markdown-Seite, die deine Mod beschreibt und erklärt, wenn du Github benutzt.

screenshot.png - Screenshot deiner Mods (wird von Mod-Managern verwendet). Es sollte im Verhältnis 3:2 mit einer Mindestgröße von 300x200px vorliegen. settingtypes.txt - Modseinstellungen, die im Einstellungsmenü angezeigt werden.

  • textures, sounds, media - Mediendateien (Texturen, Sounds, was auch immer).
    Diese werden auf den Client übertragen und stehen der Mod zur Verfügung.

Siehe modding standards forum thread für aktuelle Informationen über Mod-Dateien.

Definiere einen eigenen Block

Wir werden eine Mod machen, die eine spezielle Art von Holz hinzufügt, das nur zur Dekoration verwendet werden kann.

Erstellen Sie zunächst einen Ordner mit dem Namen tutorial im Minetest mods Ordner (siehe installing mods]).

Als nächstes erstellen wir eine Datei mit dem Namen init.lua und fügen Sie sie so ein:

minetest.register_node("tutorial:decowood", {
	tiles = {"tutorial_decowood.png"},
	groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3},
})

Sie können das Bild herunterladen, indem Sie mit der rechten Maustaste auf tutorial_decowood.png klicken und dann auf Speichern unter klicken.

Die Funktion minetest.register_node(name, table) ist für das Hinzufügen neuer Blöcke zum Spiel verantwortlich. Nodes sind Blöcke sowie Fackeln, Schilder, etc. Anmerkung: In minetest werden alle Platzierbaren Objekte als "Nodes" bezeichnet. Im deutschen scheint es allerdings kein vernünftiges wort dafür zu geben, deshalb wird "node" hier mit "Block" übersetzt.

Es werden 2 Parameter benötigt: Der Name des neuen Blocks tutorial:decowood und eine Tabelle mit den Eigenschaften des Blocks.

Der Name des Blocks MUSS mit dem Mod-Namen beginnen, gefolgt von einem Doppelpunkt, z.B. tutorial:..

In this example we define the following properties:

  • tiles — Sets the texture of the block; You can use only 1 texture or multiple textures, separated by commas {"tex1.png", "tex2.png", …}. The game checks for the texture files in ALL textures folders of the game.
  • groups — This sets attributes about the block including the time it takes to destroy the block, and the tool required. It also defines that the node will burn when is close to fire or lava.

Try it out

Starte das Spiel jetzt und du wirst feststellen, dass die Mods automatisch geladen und kompiliert werden.

Das bedeutet, dass Sie beim Ändern des Codes einfach "Exit to Menu" und "Start Game/Connect" erneut ausführen müssen, um die Änderungen auszuprobieren.

Lasst uns unsere erste Mod ausprobieren! Öffne das Chatfenster im Spiel (drücken Sie t) und geben Sie /giveme tutorial:decowood 99 ein. Dadurch werden 99 Blöcke des dekorativen Holzes zu deinem Inventar hinzugefügt! (Du kannst es dir im Kreativmodus natürlich auch aus dem Inventar nehmen.)

Template:Vorlage:Hinweis} ausführen.

Define a crafting recipe

Minetest also uses different crafting recipes. Therefore it is important to know what crafting means and how to code it.

Crafting means to create tools, blocks and other stuff. Minetest offers a 3 × 3 crafting grid by default with one output slot.

A stone pickaxe can be made out of 2 sticks and 3 cobblestone:

C C C     <--- S = stick, C = stone group (cobblestone, stone, desert stone, …)
  S
  S

Let's make a crafting recipe for the decorative wood.

Just add this to your init.lua file:

minetest.register_craft({
	output = 'tutorial:decowood 2',
	recipe = {
		{'default:wood', 'default:wood', ''},
		{'default:wood', 'default:wood', ''},
		{'', '', ''},
	}
})

The function minetest.register_craft() registers a crafting process, it defines the recipe for something.

It takes 1 parameter which is a table that contains 2 properties: (and an optional third)

  • output — which sets the outcome of the crafting process and recipe which is the actual recipe for the output.
  • recipe — must be a table with other tables inside. Every of the 3 tables defines another row of the crafting field. Every row contains 3 columns.
  • type — if you want to make it a furnace craft add type="cook"

Let's define a cooking recipe to see how that works. This will allow the node to be placed in the top of a furnace which will convert it to another item. Fuel must be added to the bottom of the furnace for the craft to take effect.

minetest.register_craft({
	type = "cooking",
	recipe = "tutorial:decowood",
	output = "default:wood",
})

Let's also define a fuel recipe. This will allow the node to be placed in the furnace to fuel cooking recipes.

minetest.register_craft({
	type = "fuel",
	recipe = "tutorial:decowood",
	burntime = 7,
})

You can use the craft recipe checker when modding to check for typos.

Why are wooden planks not simply called wood but default:wood?
Indeed, The name of a node/tool/craftitem object must be modname:name (with two exceptions: air and ignore which are built-in). In this case, the mod is called tutorial (name is preset by the folder name) and the block is called decowood, so it's tutorial:decowood.
The default mod is the most important “mod” in Minetest, in fact Minetest itself is more like just a game engine, all the contents, materials, and other stuff are in several mods, like default (standard tools/blocks), bucket (Buckets: Lava/Water), and many more.
If you want to find out more about these mods and maybe use features they contain, just have a look in their init.lua!
Windows: Minetest/games/minetest_game/
GNU/Linux, run-in-place: ~/.minetest/games/minetest_game/
GNU/Linux, non-run-in-place (such as a package): /usr/share/minetest/games/minetest_game

Define an ABM

ABMs add actions to blocks. For instance, the tutorial-wood could become normal wood after a few seconds.

Append this code to your init.lua:

minetest.register_abm({
	nodenames = {"tutorial:decowood"},
	interval = 30,
	chance = 1,
	action = function(pos)
		minetest.add_node(pos, {name="default:wood"})
	end,
})

Try it out! It's really annoying to see all your decowood creations destroyed after 30 seconds, they simply become normal wood.

But how does this work? The function minetest.register_abm() registers an action for each block of the same type.

  • nodenames = {"tutorial:decowood'} means that the action is processed for each decowood block. You could also try "default:stone" instead of that to turn all stone blocks into wood.
  • interval = 30 means that the action is performed every 30 seconds. It starts counting at the beginning of the game. After 30 seconds all actions are processed, it doesn't matter when the block was placed. - This is not a per-block timer!
  • chance = 1 means that the probability of the action is 1:1, it happens in every case. A higher value means that it's less probable (eg. 1:2, 1:3, …).
  • action = function(pos) is the function that is actually performed.

It contains the command minetest.add_node(). This takes two parameters:

First of all the position parameter (more information later) and also a table which defines the properties of the block, e.g. the name, the direction it faces. In this case the name is enough to define what block you can see.

So let's assume we want to create a mod that makes junglegrass grow above every dirt-with-grass block. This should be a slow process, one dirt-with-grass block after the other should be grown over. This is what we do:

minetest.register_abm({
	nodenames = {"default:dirt_with_grass"},
	interval = 2,
	chance = 100,
	action = function(pos)
		pos.y = pos.y + 1
		minetest.add_node(pos, {name="default:junglegrass"})
	end,
})

You should already know everything else but the line pos.y=pos.y+1. What is that for?

To understand it, you should know what a position variable in Minetest is a table made up out of 3 values: x, y and z.

x and z are forward/backward; left/right values. y is the up/down value. The player usually spawns near 0,0,0.

The line pos.y = pos.y + 1 manipulates the position to 1 block above the dirt-with-grass node.

There are some small other differences to our first abm. The interval is 1 in this case, but the chance (probability) is 100. Therefore the function is executed every second, but only in 1 of 100 cases. This makes your Minetest garden slowly been overgrown by junglegrass.

Where to go next

Have a look at the Minetest Modding Online Tutorial Book for more complete guide.

Check out the Mod Releases forum to see mods that have been published by the community.

Get mod help from the modding questions thread.

Suggest a mod idea in the mod request thread.

Personal tools
Namespaces

Variants
Actions
Navigation
API
Toolbox