Translated timers.md
This commit is contained in:
parent
797314ac03
commit
cb1abbb7b4
109
_de/map/timers.md
Normal file
109
_de/map/timers.md
Normal file
@ -0,0 +1,109 @@
|
||||
---
|
||||
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 -->
|
||||
|
||||
Die periodische Ausführung einer Funktion auf bestimmten Knoten ist eine häufige Aufgabe.
|
||||
Minetest bietet dafür zwei Methoden: Aktive Mapblock Modifikatoren (ABMs) und Block-Timer(node timers).
|
||||
|
||||
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
|
||||
und Maschinen, sollten stattdessen Blocktimer verwendet werden.
|
||||
Blocktimer funktionieren, indem sie die ausstehenden Timer in jedem MapBlock verfolgen und dann ausführen
|
||||
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.
|
||||
|
||||
- [Blocktimer](#blocktimer)
|
||||
- [Aktive Mapblock Modifikatoren](#aktive-mapblock-modifikatoren)
|
||||
- [Sie sind dran](#sie-sind-dran)
|
||||
|
||||
## Blocktimer
|
||||
|
||||
Blocktimer sind direkt an einen einzelnen Knoten gebunden.
|
||||
Sie können Blocktimer verwalten, indem Sie ein NodeTimerRef-Objekt erhalten.
|
||||
|
||||
```lua
|
||||
local timer = minetest.get_node_timer(pos)
|
||||
timer:start(10.5) -- in Sekunden
|
||||
```
|
||||
|
||||
Wenn der Zeitgeber eines Blockes abgelaufen ist, wird die Methode `on_timer` in der Definitionstabelle des Blockes
|
||||
aufgerufen. Die Methode benötigt nur einen einzigen Parameter, die Position des Blockes:
|
||||
|
||||
```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
|
||||
nur eine Art von Timern pro Blocktyp und nur ein Timer pro Block möglich.
|
||||
|
||||
|
||||
## 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",
|
||||
light_source = 3, -- Der Block strahlt Licht aus. Min 0, max 14
|
||||
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
|
||||
chance = 50, -- Jeder Block hat eine Chance von 1 zu 50 ausgewählt zu werden
|
||||
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
|
||||
})
|
||||
```
|
||||
|
||||
Dieser ABM läuft alle zehn Sekunden, und für jeden passenden Block besteht eine
|
||||
Chance von 1 zu 50, dass es ausgeführt wird.
|
||||
Wenn die ABM auf einem Block ausgeführt wird, wird ein fremder Grasblock über ihm platziert.
|
||||
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.
|
||||
* Brennen: Bringt jeden Luftknoten in Brand. (Tipp: "air" und "fire:basic_flame").
|
||||
Warnung: Rechnen Sie damit, dass das Spiel abstürzt.
|
Loading…
x
Reference in New Issue
Block a user