Finished storage.md
This commit is contained in:
parent
a3eb294b25
commit
dcdf4c3520
@ -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`.)
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user