minetest_modding_book/_de/map/timers.md

110 lines
4.3 KiB
Markdown
Raw Normal View History

2022-08-17 23:17:41 +03:00
---
title: Node Timer und ABMs
layout: default
root: ../..
idx: 3.2
description: Lernen Sie, wie man ABMs zum Ändern von Mapblöcken erstellt.
redirect_from:
- /de/chapters/abms.html
- /de/map/abms.html
---
## Einleitung <!-- omit in toc -->
2022-12-18 13:20:09 +03:00
Die periodische Ausführung einer Funktion auf bestimmten Node ist eine häufige Aufgabe.
2022-12-13 19:27:27 +03:00
Minetest bietet dafür zwei Methoden: Aktive Map-Block Modifikatoren (ABMs) und Node-Timer(node timers).
2022-08-17 23:17:41 +03:00
ABMs scannen alle geladenen Map-Blöcke auf der Suche nach Blöcken, die einem Kriterium entsprechen.
Sie eignen sich am besten für Blöcken, die in der Welt häufig vorkommen,
wie zum Beispiel Gras.
Sie haben einen hohen CPU-Overhead, aber einen geringen Speicher- und Storage-Overhead.
Für Blöcke, die ungewöhnlich sind oder bereits Metadaten verwenden, wie Öfen
2022-12-13 19:27:27 +03:00
und Maschinen, sollten stattdessen Nodetimer verwendet werden.
Nodetimer funktionieren, indem sie die ausstehenden Timer in jedem Map-Block verfolgen und dann ausführen
2022-08-17 23:17:41 +03:00
wenn sie ablaufen.
Dies bedeutet, dass die Zeitgeber nicht alle geladenen Blöcke durchsuchen müssen, um Übereinstimmungen zu finden,
sondern stattdessen etwas mehr Speicherplatz für die Verfolgung
der ausstehenden Timer benötigen.
2022-12-13 19:27:27 +03:00
- [Nodetimer](#nodetimer)
- [Aktive Map-Block Modifikatoren](#aktive-mapblock-modifikatoren)
2022-08-17 23:17:41 +03:00
- [Sie sind dran](#sie-sind-dran)
2022-12-13 19:27:27 +03:00
## Nodetimer
2022-08-17 23:17:41 +03:00
2022-12-18 13:20:09 +03:00
Nodetimer sind direkt an einen einzelnen Node gebunden.
2022-12-13 19:27:27 +03:00
Sie können Nodetimer verwalten, indem Sie ein NodeTimerRef-Objekt erhalten.
2022-08-17 23:17:41 +03:00
```lua
local timer = minetest.get_node_timer(pos)
timer:start(10.5) -- in Sekunden
```
2022-12-13 19:27:27 +03:00
Wenn der Zeitgeber eines Nodes abgelaufen ist, wird die Methode `on_timer` in der Definitionstabelle des Nodes
aufgerufen. Die Methode benötigt nur einen einzigen Parameter, die Position des Nodes:
2022-08-17 23:17:41 +03:00
```lua
minetest.register_node("autotuer:offene_tuer", {
on_timer = function(pos)
minetest.set_node(pos, { name = "autotuer:offene_tuer" })
return false
end
})
```
Die Rückgabe von true in `on_timer` bewirkt, dass der Timer wieder für das gleiche Intervall läuft.
Es ist auch möglich, `get_node_timer(pos)` innerhalb von `on_timer` zu verwenden, stellen Sie nur sicher
dass Sie false zurückgeben, um Konflikte zu vermeiden.
Sie haben vielleicht eine Einschränkung bei den Zeitgebern bemerkt: Aus Optimierungsgründen ist
2022-12-13 19:27:27 +03:00
nur eine Art von Timern pro Nodetyp und nur ein Timer pro Node möglich.
2022-08-17 23:17:41 +03:00
## Aktive Mapblock Modifikatoren
Für die Zwecke dieses Kapitels ist Aliengras eine Grasart, die
in der Nähe von Wasser vorkommen kann.
```lua
minetest.register_node("aliens:gras", {
description = "Aliengras",
2022-12-13 19:27:27 +03:00
light_source = 3, -- Der Node strahlt Licht aus. Min 0, max 14
2022-08-17 23:17:41 +03:00
tiles = {"aliens_grass.png"},
groups = {choppy=1},
on_use = minetest.item_eat(20)
})
minetest.register_abm({
nodenames = {"default:dirt_with_grass"},
neighbors = {"default:water_source", "default:water_flowing"},
interval = 10.0, -- Wird alle 10 Sekunden ausgeführt
2022-12-13 19:27:27 +03:00
chance = 50, -- Jeder Node hat eine Chance von 1 zu 50 ausgewählt zu werden
2022-08-17 23:17:41 +03:00
action = function(pos, node, active_object_count,
active_object_count_wider)
local pos = {x = pos.x, y = pos.y + 1, z = pos.z}
minetest.set_node(pos, {name = "aliens:gras"})
end
})
```
2022-12-13 19:27:27 +03:00
Dieser ABM läuft alle zehn Sekunden, und für jeden passenden Node besteht eine
2022-08-17 23:17:41 +03:00
Chance von 1 zu 50, dass es ausgeführt wird.
2022-12-13 19:27:27 +03:00
Wenn die ABM auf einem Node ausgeführt wird, wird ein fremder Grasnode über ihm platziert.
2022-08-17 23:17:41 +03:00
Bitte seien Sie gewarnt, dies löscht alle Blöcke, die sich zuvor an dieser Position befanden.
Um dies zu verhindern, sollten Sie eine Überprüfung mit minetest.get_node einbauen, um sicherzustellen, dass Platz für das Gras vorhanden ist.
Die Angabe eines Nachbarn(neighbor) ist optional.
Wenn Sie mehrere Nachbarn angeben, muss nur einer von ihnen vorhanden sein
vorhanden sein, um die Anforderungen zu erfüllen.
Die Angabe der Chance ist ebenfalls optional.
Wenn Sie die Chance nicht angeben, wird der ABM immer ausgeführt, wenn die anderen Bedingungen erfüllt sind.
## Sie sind dran
* Midas Berührung: Verwandelt Wasser alle 5 Sekunden mit einer Wahrscheinlichkeit von 1 zu 100 in Goldblöcke.
* Fäulnis: Verwandelt Holz in Dreck um, wenn Wasser der Nachbar ist.
2022-12-18 13:20:09 +03:00
* Brennen: Bringt jeden LuftNode in Brand. (Tipp: "air" und "fire:basic_flame").
2022-08-17 23:17:41 +03:00
Warnung: Rechnen Sie damit, dass das Spiel abstürzt.