Finished storage.md

This commit is contained in:
debiankaios 2022-08-20 13:26:38 +02:00
parent a3eb294b25
commit dcdf4c3520
2 changed files with 123 additions and 110 deletions

View File

@ -15,16 +15,16 @@ In diesem Kapitel erfahren Sie, wie Sie Daten speichern können.
- [Metadaten](#metadaten) - [Metadaten](#metadaten)
- [Was sind Metadaten?](#was-sind-metadaten) - [Was sind Metadaten?](#was-sind-metadaten)
- [Obtaining a Metadata Object](#obtaining-a-metadata-object) - [Abrufen eines Metadatenobjekts](#abrufen-eines-metadatenobjekts)
- [Reading and Writing](#reading-and-writing) - [Lesen und Schreiben](#lesen-und-schreiben)
- [Special Keys](#special-keys) - [Besondere Schlüssel](#besondere-schlüssel)
- [Storing Tables](#storing-tables) - [Speichern von Tabellen](#speichern-von-tabellen)
- [Private Metadata](#private-metadata) - [Private Metadaten](#private-metadaten)
- [Lua Tables](#lua-tables) - [Lua Tabellen](#lua-tabellen)
- [Mod Storage](#mod-storage) - [Mod Storage](#mod-storage)
- [Databases](#databases) - [Datenbanken](#datenbanken)
- [Deciding Which to Use](#deciding-which-to-use) - [Entscheidung was man benutzt](#entscheidung-was-man-benutzt)
- [Your Turn](#your-turn) - [Sie sind dran](#sie-sind-dran)
## Metadata ## Metadata
@ -33,41 +33,41 @@ In diesem Kapitel erfahren Sie, wie Sie Daten speichern können.
In Minetest sind Metadaten ein Key-Value-Speicher, der verwendet wird, um benutzerdefinierte Daten an etwas anzuhängen. In Minetest sind Metadaten ein Key-Value-Speicher, der verwendet wird, um benutzerdefinierte Daten an etwas anzuhängen.
Sie können Metadaten verwenden, um Informationen zu einem Block, Spieler oder ItemStack zu speichern. Sie können Metadaten verwenden, um Informationen zu einem Block, Spieler oder ItemStack zu speichern.
Each type of metadata uses the exact same API. Jede Art von Metadaten verwendet genau dieselbe API.
Metadata stores values as strings, but there are a number of methods to Metadaten speichern Werte als Strings, aber es gibt eine Reihe von Methoden um
convert and store other primitive types. andere primitive Typen zu konvertieren und zu speichern.
Some keys in metadata may have special meaning. Einige Schlüssel in Metadaten können eine besondere Bedeutung haben.
For example, `infotext` in node metadata is used to store the tooltip which shows Zum Beispiel wird `infotext` in den Block-Metadaten verwendet, um den Tooltip zu speichern, der angezeigt wird
when hovering over the node using the crosshair. angezeigt wird, wenn man mit dem Fadenkreuz über den Block fährt.
To avoid conflicts with other mods, you should use the standard namespace Um Konflikte mit anderen Mods zu vermeiden, sollten Sie die Standard-Namensraum
convention for keys: `modname:keyname`. Konvention für Schlüssel verwenden: `Modname:Schlüsselname`.
The exception is for conventional data such as the owner name which is stored as Die Ausnahme sind konventionelle Daten wie der Name des Besitzers, der als
`owner`. `Besitzer`.
Metadata is data about data. Metadaten sind Daten über Daten.
The data itself, such as a node's type or an stack's count, is not metadata. Die Daten selbst, wie der Typ eines Blockes oder die Anzahl eines Stapels, sind keine Metadaten.
### Obtaining a Metadata Object ### Abrufen eines Metadatenobjekts
If you know the position of a node, you can retrieve its metadata: Wenn du die Position eines Blockes kennst, kannst du seine Metadaten abrufen:
```lua ```lua
local meta = minetest.get_meta({ x = 1, y = 2, z = 3 }) local meta = minetest.get_meta({ x = 1, y = 2, z = 3 })
``` ```
Player and ItemStack metadata are obtained using `get_meta()`: Spieler- und ItemStack-Metadaten werden mit `get_meta()` ermittelt.:
```lua ```lua
local pmeta = player:get_meta() local pmeta = player:get_meta()
local imeta = stack:get_meta() local imeta = stack:get_meta()
``` ```
### Reading and Writing ### Lesen und Schreiben
In most cases, `get_<type>()` and `set_<type>()` methods will be used to read In den meisten Fällen werden die Methoden `get_<type>()` und `set_<type>()` zum Lesen
and write to meta. und zum schreiben in Metadaten verwendet .
Metadata stores strings, so the string methods will directly set and get the value. Metadaten speichern Strings, so dass die String-Methoden direkt den Wert setzen und holen.
```lua ```lua
print(meta:get_string("foo")) --> "" print(meta:get_string("foo")) --> ""
@ -75,15 +75,15 @@ meta:set_string("foo", "bar")
print(meta:get_string("foo")) --> "bar" print(meta:get_string("foo")) --> "bar"
``` ```
All of the typed getters will return a neutral default value if the key doesn't Alle typisierten Getter geben einen neutralen Standardwert zurück, wenn der Schlüssel nicht
exist, such as `""` or `0`. nicht existiert, wie zum Beispiel `""` oder `0`.
You can use `get()` to return a string or nil. Sie können `get()` verwenden, um einen String oder nil zurückzugeben.
As Metadata is a reference, any changes will be updated to the source automatically. Da es sich bei Metadaten um eine Referenz handelt, werden alle Änderungen automatisch in der Quelle aktualisiert.
ItemStacks aren't references however, so you'll need to update the itemstack in the ItemStacks sind jedoch keine Referenzen, daher müssen Sie den Itemstack im
inventory. Inventar aktualisieren.
The non-typed getters and setters will convert to and from strings: Die nicht typisierten Getter und Setter werden in und aus Strings konvertiert:
```lua ```lua
print(meta:get_int("count")) --> 0 print(meta:get_int("count")) --> 0
@ -92,48 +92,48 @@ print(meta:get_int("count")) --> 3
print(meta:get_string("count")) --> "3" print(meta:get_string("count")) --> "3"
``` ```
### Special Keys ### Besondere Schlüssel
`infotext` is used in Node Metadata to show a tooltip when hovering the crosshair over a node. `infotext` wird in Block-Metadaten verwendet, um einen Tooltip anzuzeigen, wenn das Fadenkreuz über einem Block schwebt.
This is useful when showing the ownership or status of a node. Dies ist nützlich, um die Eigentümerschaft oder den Status eines Blockes anzuzeigen.
`description` is used in ItemStack Metadata to override the description when `description` wird in ItemStack-Metadaten verwendet, um die Beschreibung zu überschreiben,
hovering over the stack in an inventory. wenn der Mauszeiger über den Stack in einem Inventar bewegt wird.
You can use colours by encoding them with `minetest.colorize()`. Sie können Farben verwenden, indem Sie sie mit `minetest.colorize()` kodieren.
`owner` is a common key used to store the username of the player that owns the `owner` ist ein allgemeiner Schlüssel, der verwendet wird, um den Benutzernamen des Spielers zu speichern, der Eigentümer des
item or node. Element oder Block besitzt.
### Storing Tables ### Speichern von Tabellen
Tables must be converted to strings before they can be stored. Tabellen müssen in Strings umgewandelt werden, bevor sie gespeichert werden können.
Minetest offers two formats for doing this: Lua and JSON. Minetest bietet dafür zwei Formate an: Lua und JSON.
The Lua method tends to be a lot faster and matches the format Lua Die Lua-Methode ist in der Regel viel schneller und entspricht dem Format, das Lua
uses for tables, while JSON is a more standard format, is better für Tabellen verwendet, während JSON ein standardisierteres Format ist, das besser
structured, and is well suited for when you need to exchange information strukturiert und sich gut für den Austausch von Informationen mit
with another program. einem anderen Programm eignet.
```lua ```lua
local data = { username = "player1", score = 1234 } local daten = { benutzername = "spieler1", punktestand = 1234 }
meta:set_string("foo", minetest.serialize(data)) meta:set_string("foo", minetest.serialize(daten))
data = minetest.deserialize(minetest:get_string("foo")) daten = minetest.deserialize(minetest:get_string("foo"))
``` ```
### Private Metadata ### Private Metadaten
By default, all node metadata is sent to the client. Standardmäßig werden alle Block-Metadaten an den Client gesendet.
You can mark keys as private to prevent this. Sie können Schlüssel als privat markieren, um dies zu verhindern.
```lua ```lua
meta:set_string("secret", "asd34dn") meta:set_string("geheim", "asd34dn")
meta:mark_as_private("secret") meta:mark_as_private("geheim")
``` ```
### Lua Tables ### Lua Tabellen
You can convert to and from Lua tables using `to_table` and `from_table`: Sie können mit `to_table` und `from_table` in und aus Lua-Tabellen konvertieren:
```lua ```lua
local tmp = meta:to_table() local tmp = meta:to_table()
@ -143,105 +143,105 @@ meta:from_table(tmp)
## Mod Storage ## Mod Storage
Mod storage uses the exact same API as Metadata, although it's not technically Mod-Storage verwendet genau dieselbe API wie Metadaten, obwohl sie technisch gesehen keine
Metadata. Metadaten sind.
Mod storage is per-mod, and can only be obtained during load time in order to Mod-Speicher ist pro Mod und kann nur während der Ladezeit abgefragt werden, um zu wissen,
know which mod is requesting it. welche Mod sie anfordert.
```lua ```lua
local storage = minetest.get_mod_storage() local storage = minetest.get_mod_storage()
``` ```
You can now manipulate the storage just like metadata: Sie können den Speicher nun genau wie Metadaten manipulieren:
```lua ```lua
storage:set_string("foo", "bar") storage:set_string("foo", "bar")
``` ```
## Databases ## Datenbanken
If the mod is likely to be used on a server and will store lots of data, Wenn der Mod wahrscheinlich auf einem Server verwendet wird und viele Daten speichert,
it's a good idea to offer a database storage method. ist es eine gute Idee, eine Datenbank-Speichermethode anzubieten.
You should make this optional by separating how the data is stored and where Sie sollten dies optional machen, indem Sie trennen, wie die Daten gespeichert werden und wo
it is used. sie verwendet werden.
```lua ```lua
local backend local backend
if use_database then if verwende_datenbank then
backend = backend =
dofile(minetest.get_modpath("mymod") .. "/backend_sqlite.lua") dofile(minetest.get_modpath("meinemod") .. "/backend_sqlite.lua")
else else
backend = backend =
dofile(minetest.get_modpath("mymod") .. "/backend_storage.lua") dofile(minetest.get_modpath("meinemod") .. "/backend_storage.lua")
end end
backend.get_foo("a") backend.get_foo("a")
backend.set_foo("a", { score = 3 }) backend.set_foo("a", { score = 3 })
``` ```
The backend_storage.lua file should include a mod storage implementation: Die Datei backend_storage.lua sollte eine Mod-Storage-Implementierung enthalten:
```lua ```lua
local storage = minetest.get_mod_storage() local storage = minetest.get_mod_storage()
local backend = {} local backend = {}
function backend.set_foo(key, value) function backend.set_foo(schluessel, wert)
storage:set_string(key, minetest.serialize(value)) storage:set_string(schluessel, minetest.serialize(wert))
end end
function backend.get_foo(key) function backend.get_foo(schluessel)
return minetest.deserialize(storage:get_string(key)) return minetest.deserialize(storage:get_string(schluessel))
end end
return backend return backend
``` ```
The backend_sqlite would do a similar thing, but use the Lua *lsqlite3* library Das Backend_sqlite würde eine ähnliche Funktion erfüllen, aber die Lua-Bibliothek *lsqlite3* verwenden
instead of mod storage. anstelle des Mod-Speichers.
Using a database such as SQLite requires using an insecure environment. Die Verwendung einer Datenbank wie SQLite erfordert die Verwendung einer unsicheren Umgebung.
An insecure environment is a table that is only available to mods Eine unsichere Umgebung ist eine Tabelle, die nur für Mods verfügbar ist,
explicitly whitelisted by the user, and it contains a less restricted die vom Benutzer explizit auf eine Whitelist gesetzt wurden, und sie enthält eine weniger eingeschränkte
copy of the Lua API which could be abused if available to malicious mods. Kopie der Lua-API, die missbraucht werden könnte, wenn sie böswilligen Mods zur Verfügung stünde.
Insecure environments will be covered in more detail in the Unsichere Umgebungen werden im Detail in dem
[Security](../quality/security.html) chapter. Kapitel [Sicherheit](../quality/security.html) behandelt.
```lua ```lua
local ie = minetest.request_insecure_environment() local uu = minetest.request_insecure_environment()
assert(ie, "Please add mymod to secure.trusted_mods in the settings") assert(uu, "Bitte fügen Sie meinemod zu secure.trusted_mods in den Einstellungen hinzu")
local _sql = ie.require("lsqlite3") local _sql = uu.require("lsqlite3")
-- Prevent other mods from using the global sqlite3 library -- Andere Mods daran hindern, die globale sqlite3-Bibliothek zu verwenden
if sqlite3 then if sqlite3 then
sqlite3 = nil sqlite3 = nil
end end
``` ```
Teaching about SQL or how to use the lsqlite3 library is out of scope for this book. Die Vermittlung von Wissen über SQL oder die Verwendung der lsqlite3-Bibliothek ist nicht Gegenstand dieses Buches.
## Deciding Which to Use ## Entscheidung was man benutzt
The type of method you use depends on what the data is about, Welche Methode Sie verwenden, hängt davon ab, worum es sich bei den Daten handelt,
how it is formatted, and how large it is. wie sie formatiert sind und wie groß sie sind.
As a guideline, small data is up to 10K, medium data is up to 10MB, and large Als Richtlinie gilt, dass kleine Daten bis zu 10K, mittlere Daten bis zu 10MB und große
data is any size above that. Daten jede Größe darüber sind.
Node metadata is a good choice when you need to store node-related data. Block-Metadaten sind eine gute Wahl, wenn Sie blockbezogene Daten speichern müssen.
Storing medium data is fairly efficient if you make it private. Die Speicherung mittlerer Daten ist recht effizient, wenn Sie sie privat machen.
Item metadata should not be used to store anything but small amounts of data as it is not Item-Metadaten sollten nur zum Speichern kleiner Datenmengen verwendet werden, da es nicht möglich ist,
possible to avoid sending it to the client. sie an den Client zu senden.
The data will also be copied every time the stack is moved, or accessed from Lua. Die Daten werden auch jedes Mal kopiert, wenn der Stack verschoben oder von Lua aus aufgerufen wird.
Mod storage is good for medium data but writing large data may be inefficient. Mod-Storage ist gut für mittlere Daten, aber das Schreiben großer Daten kann ineffizient sein.
It's better to use a database for large data to avoid having to write all the Es ist besser, eine Datenbank für große Daten zu verwenden, um zu vermeiden,
data out on every save. dass alle Daten bei jedem Speichern geschrieben werden müssen.
Databases are only viable for servers due to the Datenbanken kommen nur für Server in Frage, da die
need to whitelist the mod to access an insecure environment. der Mod auf eine Whitelist gesetzt werden muss, um auf eine unsichere Umgebung zugreifen zu können.
They're well suited for large data sets. Sie sind gut geeignet für große Datenmengen.
## Your Turn ## Sie sind dran
* Make a node which disappears after it has been punched five times. * Erstellen Sie einen Block, der verschwindet, nachdem er fünfmal geschlagen wurde.
(Use `on_punch` in the node definition and `minetest.set_node`.) (Verwenden Sie `on_punch` in der Definition des Blockes und `minetest.set_node`.)

View File

@ -4,30 +4,40 @@ bulk = bulk
Chapter = Kapitel Chapter = Kapitel
Cubic Nodes = Würfelförmiger Block Cubic Nodes = Würfelförmiger Block
craft slots = Handwerksplätze craft slots = Handwerksplätze
database = Datenbank
detached inventory = freistehendes Inventar detached inventory = freistehendes Inventar
dig = abbauen dig = abbauen
drawtype = Zeichnungstyp drawtype = Zeichnungstyp
Entities = Entities Entities = Entities
Folder = Verzeichnis Folder = Verzeichnis
games = Spiele games = Spiele
getter = Getter
glasslike = Glasartig glasslike = Glasartig
grid = Raster grid = Raster
insecure environment = unsichere Umgebung
Introduction = Einleitung Introduction = Einleitung
Inventory = Inventar Inventory = Inventar
Inventory List = Inventarliste Inventory List = Inventarliste
Inventory Location = Inventarstandort Inventory Location = Inventarstandort
Inventory reference = Inventar-Referenz Inventory reference = Inventar-Referenz
Item metadata = Item-Metadaten
ItemStack = ItemStack ItemStack = ItemStack
key = Schlüssel
large data = große Daten
main inventory = Hauptinventar main inventory = Hauptinventar
map = Karte map = Karte
MapBlock = Map-Block MapBlock = Map-Block
medium data = mittlere Daten
Mesh = Mesh Mesh = Mesh
Mesh Nodes = Mesh Nodes Mesh Nodes = Mesh Nodes
Metadata Object = Metadatenobjekt
mod load paths = Mod-Lade-Verzeichnisse mod load paths = Mod-Lade-Verzeichnisse
mod's folder = Mod-Verzeichnis mod's folder = Mod-Verzeichnis
mods = Mods mods = Mods
Mod storage = Mod-Storage
module = Modul module = Modul
node = Block node = Block
Node metadata = Block-Metadaten
nodes = Blöcke nodes = Blöcke
nodebox = Nodebox nodebox = Nodebox
nodeboxes = Nodeboxen nodeboxes = Nodeboxen
@ -38,9 +48,12 @@ placer = plazierer
player inventory = Spielerinventar player inventory = Spielerinventar
player reference = Spielerreferenz player reference = Spielerreferenz
pointed_thing = angeschautes_ding pointed_thing = angeschautes_ding
small data = kleine Daten
Stack = Stack Stack = Stack
storage = Storage
table = Tabelle table = Tabelle
tile = Kachel tile = Kachel
tiles = Kacheln tiles = Kacheln
timer = timer timer = timer
wear = Abnutzung wear = Abnutzung
Your turn = Sie sind dran