]> git.lizzy.rs Git - dragonfireclient.git/commitdiff
Hacked Client
authorElias Fleckenstein <eliasfleckenstein@web.de>
Wed, 13 May 2020 17:41:30 +0000 (19:41 +0200)
committerElias Fleckenstein <eliasfleckenstein@web.de>
Wed, 13 May 2020 17:41:30 +0000 (19:41 +0200)
24 files changed:
CMakeLists.txt
builtin/client/death_formspec.lua
builtin/client/init.lua
builtin/client/spoof.lua [new file with mode: 0644]
builtin/mainmenu/init.lua
builtin/settingtypes.txt
doc/client_lua_api.md [new file with mode: 0644]
doc/client_lua_api.txt [deleted file]
doc/fst_api.md [new file with mode: 0644]
doc/fst_api.txt [deleted file]
doc/lua_api.md [new file with mode: 0644]
doc/lua_api.txt [deleted file]
doc/protocol.md [new file with mode: 0644]
doc/protocol.txt [deleted file]
spoof.js [new file with mode: 0644]
spoof.txt [new file with mode: 0644]
src/client/client.cpp
src/client/client.h
src/client/clientlauncher.cpp
src/client/game.cpp
src/client/mapblock_mesh.cpp
src/nodedef.cpp
src/script/cpp_api/s_base.cpp
src/script/cpp_api/s_security.cpp

index b1734f0c7c368640e72a02dcb41a84847571a92d..3f36037effafaab559bc9bd2477339c30572857f 100644 (file)
@@ -18,7 +18,7 @@ set(CLANG_MINIMUM_VERSION "3.4")
 set(VERSION_MAJOR 5)
 set(VERSION_MINOR 2)
 set(VERSION_PATCH 0)
-set(VERSION_EXTRA "GalwayGirl Client" CACHE STRING "Stuff to append to version string")
+set(VERSION_EXTRA "" CACHE STRING "Stuff to append to version string")
 
 # Change to false for releases
 set(DEVELOPMENT_BUILD TRUE)
index e755ac5c16ef7e2f2bfb74bbd5c93bcc3da4cfc8..516a15efc2351b62f6f33545bcba1a1735abb6cd 100644 (file)
@@ -1,16 +1,29 @@
 -- CSM death formspec. Only used when clientside modding is enabled, otherwise
 -- handled by the engine.
 
+local dead = false
+
 core.register_on_death(function()
-       core.display_chat_message("You died.")
-       local formspec = "size[11,5.5]bgcolor[#320000b4;true]" ..
-               "label[4.85,1.35;" .. fgettext("You died") ..
-               "]button_exit[4,3;3,0.5;btn_respawn;".. fgettext("Respawn") .."]"
-       core.show_formspec("bultin:death", formspec)
+       if not dead then
+               core.display_chat_message("You died.")
+               local formspec = "size[11,5.5]bgcolor[#320000b4;true]" ..
+                       "label[4.85,1.35;" .. fgettext("You died") ..
+                       "]button_exit[4,3;3,0.5;btn_respawn;".. fgettext("Respawn") .."]"
+               core.show_formspec("bultin:death", formspec)
+               dead = true
+       end
 end)
 
 core.register_on_formspec_input(function(formname, fields)
-       if formname == "bultin:death" then
+       if formname == "bultin:death" and fields.btn_respawn then
                core.send_respawn()
+               dead = false
        end
 end)
+
+core.register_chatcommand("respawn", {
+       func = function()
+               core.send_respawn()
+               dead = false
+       end
+})
index 9633a7c714a4e7bf523c6748b47d3a04607e68dd..bcaa5244ea645f3a17b8b724ba1e6980a0d4b9c5 100644 (file)
@@ -6,6 +6,7 @@ local commonpath = scriptpath.."common"..DIR_DELIM
 dofile(clientpath .. "register.lua")
 dofile(commonpath .. "after.lua")
 dofile(commonpath .. "chatcommands.lua")
-dofile(clientpath .. "chatcommands.lua")
 dofile(commonpath .. "vector.lua")
 dofile(clientpath .. "death_formspec.lua")
+dofile(clientpath .. "spoof.lua")
+
diff --git a/builtin/client/spoof.lua b/builtin/client/spoof.lua
new file mode 100644 (file)
index 0000000..f053a8a
--- /dev/null
@@ -0,0 +1,4 @@
+local file = io.open("spoof.txt", "a")
+minetest.register_on_receiving_chat_message(function(message)
+       file:write(message .. "\n")
+end)
index 130c3e73cf61a518ab86486e3ee43f638487ddcd..21b74f34aa91f7504899db9b8076db0d4c91019e 100644 (file)
@@ -158,3 +158,4 @@ local function init_globals()
 end
 
 init_globals()
+
index e86acdf8da4e05f1bcd242c9a30dce27a30e8a31..ba0cf9610483af329b7082ff30975041473634ce 100644 (file)
@@ -2138,12 +2138,16 @@ contentdb_flag_blacklist (ContentDB Flag Blacklist) string nonfree, desktop_defa
 
 [Cheats]
 
-fullbright (Enable Fullbright) bool false
+fullbright (Enable fullbright) bool false
 
-xray (Enable Xray, requires Fullbright) bool false
+xray (Enable xray, requires fullbright) bool false
 
-bypass_fly (Fly Hack) bool false
+xray_texture (Texture to make transparent when xray is enabled) string default_stone.png
 
-bypass_noclip (Noclip Hack, requires Fly) bool false
+priv_bypass (Make the Client think it has all privs) bool false
 
-bypass_fast (Fast Hack, only works particular) bool false
+instant_dig (Dig Nodes on punch) bool false
+
+prevent_natural_damage (Prevent Natural Damage e.g Fall Damage) bool false
+
+freecam (Move around freely) bool false
diff --git a/doc/client_lua_api.md b/doc/client_lua_api.md
new file mode 100644 (file)
index 0000000..c24de8d
--- /dev/null
@@ -0,0 +1,1451 @@
+Minetest Lua Client Modding API Reference 5.2.0
+================================================
+* More information at <http://www.minetest.net/>
+* Developer Wiki: <http://dev.minetest.net/>
+
+Introduction
+------------
+
+** WARNING: The client API is currently unstable, and may break/change without warning. **
+
+Content and functionality can be added to Minetest 0.4.15-dev+ by using Lua
+scripting in run-time loaded mods.
+
+A mod is a self-contained bunch of scripts, textures and other related
+things that is loaded by and interfaces with Minetest.
+
+Transferring client-sided mods from the server to the client is planned, but not implemented yet.
+
+If you see a deficiency in the API, feel free to attempt to add the
+functionality in the engine and API. You can send such improvements as
+source code patches on GitHub (https://github.com/minetest/minetest).
+
+Programming in Lua
+------------------
+If you have any difficulty in understanding this, please read
+[Programming in Lua](http://www.lua.org/pil/).
+
+Startup
+-------
+Mods are loaded during client startup from the mod load paths by running
+the `init.lua` scripts in a shared environment.
+
+In order to load client-side mods, the following conditions need to be satisfied:
+
+1) `$path_user/minetest.conf` contains the setting `enable_client_modding = true`
+
+2) The client-side mod located in `$path_user/clientmods/<modname>` is added to
+    `$path_user/clientmods/mods.conf` as `load_mod_<modname> = true`.
+
+Note: Depending on the remote server's settings, client-side mods might not
+be loaded or have limited functionality. See setting `csm_restriction_flags` for reference.
+
+Paths
+-----
+* `RUN_IN_PLACE=1` (Windows release, local build)
+    * `$path_user`: `<build directory>`
+    * `$path_share`: `<build directory>`
+* `RUN_IN_PLACE=0`: (Linux release)
+    * `$path_share`:
+        * Linux: `/usr/share/minetest`
+        * Windows: `<install directory>/minetest-0.4.x`
+    * `$path_user`:
+        * Linux: `$HOME/.minetest`
+        * Windows: `C:/users/<user>/AppData/minetest` (maybe)
+
+Mod load path
+-------------
+Generic:
+
+* `$path_share/clientmods/`
+* `$path_user/clientmods/` (User-installed mods)
+
+In a run-in-place version (e.g. the distributed windows version):
+
+* `minetest-0.4.x/clientmods/` (User-installed mods)
+
+On an installed version on Linux:
+
+* `/usr/share/minetest/clientmods/`
+* `$HOME/.minetest/clientmods/` (User-installed mods)
+
+Modpack support
+----------------
+
+Mods can be put in a subdirectory, if the parent directory, which otherwise
+should be a mod, contains a file named `modpack.conf`.
+The file is a key-value store of modpack details.
+
+* `name`: The modpack name.
+* `description`: Description of mod to be shown in the Mods tab of the main
+                 menu.
+
+Mod directory structure
+------------------------
+
+    clientmods
+    ├── modname
+    │   ├── mod.conf
+    │   ├── init.lua
+    └── another
+
+### modname
+
+The location of this directory.
+
+### mod.conf
+
+An (optional) settings file that provides meta information about the mod.
+
+* `name`: The mod name. Allows Minetest to determine the mod name even if the
+          folder is wrongly named.
+* `description`: Description of mod to be shown in the Mods tab of the main
+                 menu.
+* `depends`: A comma separated list of dependencies. These are mods that must be
+             loaded before this mod.
+* `optional_depends`: A comma separated list of optional dependencies.
+                      Like a dependency, but no error if the mod doesn't exist.
+
+### `init.lua`
+
+The main Lua script. Running this script should register everything it
+wants to register. Subsequent execution depends on minetest calling the
+registered callbacks.
+
+**NOTE**: Client mods currently can't provide and textures, sounds or models by
+themselves. Any media referenced in function calls must already be loaded
+(provided by mods that exist on the server).
+
+Naming convention for registered textual names
+----------------------------------------------
+Registered names should generally be in this format:
+
+    "modname:<whatever>" (<whatever> can have characters a-zA-Z0-9_)
+
+This is to prevent conflicting names from corrupting maps and is
+enforced by the mod loader.
+
+### Example
+In the mod `experimental`, there is the ideal item/node/entity name `tnt`.
+So the name should be `experimental:tnt`.
+
+Enforcement can be overridden by prefixing the name with `:`. This can
+be used for overriding the registrations of some other mod.
+
+Example: Any mod can redefine `experimental:tnt` by using the name
+
+    :experimental:tnt
+
+when registering it.
+(also that mod is required to have `experimental` as a dependency)
+
+The `:` prefix can also be used for maintaining backwards compatibility.
+
+Sounds
+------
+**NOTE: Connecting sounds to objects is not implemented.**
+
+Only Ogg Vorbis files are supported.
+
+For positional playing of sounds, only single-channel (mono) files are
+supported. Otherwise OpenAL will play them non-positionally.
+
+Mods should generally prefix their sounds with `modname_`, e.g. given
+the mod name "`foomod`", a sound could be called:
+
+    foomod_foosound.ogg
+
+Sounds are referred to by their name with a dot, a single digit and the
+file extension stripped out. When a sound is played, the actual sound file
+is chosen randomly from the matching sounds.
+
+When playing the sound `foomod_foosound`, the sound is chosen randomly
+from the available ones of the following files:
+
+* `foomod_foosound.ogg`
+* `foomod_foosound.0.ogg`
+* `foomod_foosound.1.ogg`
+* (...)
+* `foomod_foosound.9.ogg`
+
+Examples of sound parameter tables:
+
+    -- Play locationless
+    {
+        gain = 1.0, -- default
+    }
+    -- Play locationless, looped
+    {
+        gain = 1.0, -- default
+        loop = true,
+    }
+    -- Play in a location
+    {
+        pos = {x = 1, y = 2, z = 3},
+        gain = 1.0, -- default
+    }
+    -- Play connected to an object, looped
+    {
+        object = <an ObjectRef>,
+        gain = 1.0, -- default
+        loop = true,
+    }
+
+Looped sounds must either be connected to an object or played locationless.
+
+### SimpleSoundSpec
+* e.g. `""`
+* e.g. `"default_place_node"`
+* e.g. `{}`
+* e.g. `{name = "default_place_node"}`
+* e.g. `{name = "default_place_node", gain = 1.0}`
+
+Representations of simple things
+--------------------------------
+
+### Position/vector
+
+    {x=num, y=num, z=num}
+
+For helper functions see "Vector helpers".
+
+### pointed_thing
+* `{type="nothing"}`
+* `{type="node", under=pos, above=pos}`
+* `{type="object", id=ObjectID}`
+
+Flag Specifier Format
+---------------------
+Flags using the standardized flag specifier format can be specified in either of
+two ways, by string or table.
+
+The string format is a comma-delimited set of flag names; whitespace and
+unrecognized flag fields are ignored. Specifying a flag in the string sets the
+flag, and specifying a flag prefixed by the string `"no"` explicitly
+clears the flag from whatever the default may be.
+
+In addition to the standard string flag format, the schematic flags field can
+also be a table of flag names to boolean values representing whether or not the
+flag is set. Additionally, if a field with the flag name prefixed with `"no"`
+is present, mapped to a boolean of any value, the specified flag is unset.
+
+E.g. A flag field of value
+
+    {place_center_x = true, place_center_y=false, place_center_z=true}
+
+is equivalent to
+
+    {place_center_x = true, noplace_center_y=true, place_center_z=true}
+
+which is equivalent to
+
+    "place_center_x, noplace_center_y, place_center_z"
+
+or even
+
+    "place_center_x, place_center_z"
+
+since, by default, no schematic attributes are set.
+
+Formspec
+--------
+Formspec defines a menu. It is a string, with a somewhat strange format.
+
+Spaces and newlines can be inserted between the blocks, as is used in the
+examples.
+
+### Examples
+
+#### Chest
+
+    size[8,9]
+    list[context;main;0,0;8,4;]
+    list[current_player;main;0,5;8,4;]
+
+#### Furnace
+
+    size[8,9]
+    list[context;fuel;2,3;1,1;]
+    list[context;src;2,1;1,1;]
+    list[context;dst;5,1;2,2;]
+    list[current_player;main;0,5;8,4;]
+
+#### Minecraft-like player inventory
+
+    size[8,7.5]
+    image[1,0.6;1,2;player.png]
+    list[current_player;main;0,3.5;8,4;]
+    list[current_player;craft;3,0;3,3;]
+    list[current_player;craftpreview;7,1;1,1;]
+
+### Elements
+
+#### `size[<W>,<H>,<fixed_size>]`
+* Define the size of the menu in inventory slots
+* `fixed_size`: `true`/`false` (optional)
+* deprecated: `invsize[<W>,<H>;]`
+
+#### `container[<X>,<Y>]`
+* Start of a container block, moves all physical elements in the container by (X, Y)
+* Must have matching container_end
+* Containers can be nested, in which case the offsets are added
+  (child containers are relative to parent containers)
+
+#### `container_end[]`
+* End of a container, following elements are no longer relative to this container
+
+#### `list[<inventory location>;<list name>;<X>,<Y>;<W>,<H>;]`
+* Show an inventory list
+
+#### `list[<inventory location>;<list name>;<X>,<Y>;<W>,<H>;<starting item index>]`
+* Show an inventory list
+
+#### `listring[<inventory location>;<list name>]`
+* Allows to create a ring of inventory lists
+* Shift-clicking on items in one element of the ring
+  will send them to the next inventory list inside the ring
+* The first occurrence of an element inside the ring will
+  determine the inventory where items will be sent to
+
+#### `listring[]`
+* Shorthand for doing `listring[<inventory location>;<list name>]`
+  for the last two inventory lists added by list[...]
+
+#### `listcolors[<slot_bg_normal>;<slot_bg_hover>]`
+* Sets background color of slots as `ColorString`
+* Sets background color of slots on mouse hovering
+
+#### `listcolors[<slot_bg_normal>;<slot_bg_hover>;<slot_border>]`
+* Sets background color of slots as `ColorString`
+* Sets background color of slots on mouse hovering
+* Sets color of slots border
+
+#### `listcolors[<slot_bg_normal>;<slot_bg_hover>;<slot_border>;<tooltip_bgcolor>;<tooltip_fontcolor>]`
+* Sets background color of slots as `ColorString`
+* Sets background color of slots on mouse hovering
+* Sets color of slots border
+* Sets default background color of tooltips
+* Sets default font color of tooltips
+
+#### `tooltip[<gui_element_name>;<tooltip_text>;<bgcolor>,<fontcolor>]`
+* Adds tooltip for an element
+* `<bgcolor>` tooltip background color as `ColorString` (optional)
+* `<fontcolor>` tooltip font color as `ColorString` (optional)
+
+#### `image[<X>,<Y>;<W>,<H>;<texture name>]`
+* Show an image
+* Position and size units are inventory slots
+
+#### `item_image[<X>,<Y>;<W>,<H>;<item name>]`
+* Show an inventory image of registered item/node
+* Position and size units are inventory slots
+
+#### `bgcolor[<color>;<fullscreen>]`
+* Sets background color of formspec as `ColorString`
+* If `true`, the background color is drawn fullscreen (does not effect the size of the formspec)
+
+#### `background[<X>,<Y>;<W>,<H>;<texture name>]`
+* Use a background. Inventory rectangles are not drawn then.
+* Position and size units are inventory slots
+* Example for formspec 8x4 in 16x resolution: image shall be sized
+  8 times 16px  times  4 times 16px.
+
+#### `background[<X>,<Y>;<W>,<H>;<texture name>;<auto_clip>]`
+* Use a background. Inventory rectangles are not drawn then.
+* Position and size units are inventory slots
+* Example for formspec 8x4 in 16x resolution:
+  image shall be sized 8 times 16px  times  4 times 16px
+* If `true` the background is clipped to formspec size
+  (`x` and `y` are used as offset values, `w` and `h` are ignored)
+
+#### `pwdfield[<X>,<Y>;<W>,<H>;<name>;<label>]`
+* Textual password style field; will be sent to server when a button is clicked
+* When enter is pressed in field, fields.key_enter_field will be sent with the name
+  of this field.
+* `x` and `y` position the field relative to the top left of the menu
+* `w` and `h` are the size of the field
+* Fields are a set height, but will be vertically centred on `h`
+* Position and size units are inventory slots
+* `name` is the name of the field as returned in fields to `on_receive_fields`
+* `label`, if not blank, will be text printed on the top left above the field
+* See field_close_on_enter to stop enter closing the formspec
+
+#### `field[<X>,<Y>;<W>,<H>;<name>;<label>;<default>]`
+* Textual field; will be sent to server when a button is clicked
+* When enter is pressed in field, fields.key_enter_field will be sent with the name
+  of this field.
+* `x` and `y` position the field relative to the top left of the menu
+* `w` and `h` are the size of the field
+* Fields are a set height, but will be vertically centred on `h`
+* Position and size units are inventory slots
+* `name` is the name of the field as returned in fields to `on_receive_fields`
+* `label`, if not blank, will be text printed on the top left above the field
+* `default` is the default value of the field
+    * `default` may contain variable references such as `${text}'` which
+      will fill the value from the metadata value `text`
+    * **Note**: no extra text or more than a single variable is supported ATM.
+* See field_close_on_enter to stop enter closing the formspec
+
+#### `field[<name>;<label>;<default>]`
+* As above, but without position/size units
+* When enter is pressed in field, fields.key_enter_field will be sent with the name
+  of this field.
+* Special field for creating simple forms, such as sign text input
+* Must be used without a `size[]` element
+* A "Proceed" button will be added automatically
+* See field_close_on_enter to stop enter closing the formspec
+
+#### `field_close_on_enter[<name>;<close_on_enter>]`
+* <name> is the name of the field
+* if <close_on_enter> is false, pressing enter in the field will submit the form but not close it
+* defaults to true when not specified (ie: no tag for a field)
+
+#### `textarea[<X>,<Y>;<W>,<H>;<name>;<label>;<default>]`
+* Same as fields above, but with multi-line input
+
+#### `label[<X>,<Y>;<label>]`
+* `x` and `y` work as per field
+* `label` is the text on the label
+* Position and size units are inventory slots
+
+#### `vertlabel[<X>,<Y>;<label>]`
+* Textual label drawn vertically
+* `x` and `y` work as per field
+* `label` is the text on the label
+* Position and size units are inventory slots
+
+#### `button[<X>,<Y>;<W>,<H>;<name>;<label>]`
+* Clickable button. When clicked, fields will be sent.
+* `x`, `y` and `name` work as per field
+* `w` and `h` are the size of the button
+* Fixed button height. It will be vertically centred on `h`
+* `label` is the text on the button
+* Position and size units are inventory slots
+
+#### `image_button[<X>,<Y>;<W>,<H>;<texture name>;<name>;<label>]`
+* `x`, `y`, `w`, `h`, and `name` work as per button
+* `texture name` is the filename of an image
+* Position and size units are inventory slots
+
+#### `image_button[<X>,<Y>;<W>,<H>;<texture name>;<name>;<label>;<noclip>;<drawborder>;<pressed texture name>]`
+* `x`, `y`, `w`, `h`, and `name` work as per button
+* `texture name` is the filename of an image
+* Position and size units are inventory slots
+* `noclip=true` means the image button doesn't need to be within specified formsize
+* `drawborder`: draw button border or not
+* `pressed texture name` is the filename of an image on pressed state
+
+#### `item_image_button[<X>,<Y>;<W>,<H>;<item name>;<name>;<label>]`
+* `x`, `y`, `w`, `h`, `name` and `label` work as per button
+* `item name` is the registered name of an item/node,
+   tooltip will be made out of its description
+   to override it use tooltip element
+* Position and size units are inventory slots
+
+#### `button_exit[<X>,<Y>;<W>,<H>;<name>;<label>]`
+* When clicked, fields will be sent and the form will quit.
+
+#### `image_button_exit[<X>,<Y>;<W>,<H>;<texture name>;<name>;<label>]`
+* When clicked, fields will be sent and the form will quit.
+
+#### `textlist[<X>,<Y>;<W>,<H>;<name>;<listelem 1>,<listelem 2>,...,<listelem n>]`
+* Scrollable item list showing arbitrary text elements
+* `x` and `y` position the itemlist relative to the top left of the menu
+* `w` and `h` are the size of the itemlist
+* `name` fieldname sent to server on doubleclick value is current selected element
+* `listelements` can be prepended by #color in hexadecimal format RRGGBB (only),
+     * if you want a listelement to start with "#" write "##".
+
+#### `textlist[<X>,<Y>;<W>,<H>;<name>;<listelem 1>,<listelem 2>,...,<listelem n>;<selected idx>;<transparent>]`
+* Scrollable itemlist showing arbitrary text elements
+* `x` and `y` position the item list relative to the top left of the menu
+* `w` and `h` are the size of the item list
+* `name` fieldname sent to server on doubleclick value is current selected element
+* `listelements` can be prepended by #RRGGBB (only) in hexadecimal format
+     * if you want a listelement to start with "#" write "##"
+* Index to be selected within textlist
+* `true`/`false`: draw transparent background
+* See also `minetest.explode_textlist_event` (main menu: `engine.explode_textlist_event`)
+
+#### `tabheader[<X>,<Y>;<name>;<caption 1>,<caption 2>,...,<caption n>;<current_tab>;<transparent>;<draw_border>]`
+* Show a tab**header** at specific position (ignores formsize)
+* `x` and `y` position the itemlist relative to the top left of the menu
+* `name` fieldname data is transferred to Lua
+* `caption 1`...: name shown on top of tab
+* `current_tab`: index of selected tab 1...
+* `transparent` (optional): show transparent
+* `draw_border` (optional): draw border
+
+#### `box[<X>,<Y>;<W>,<H>;<color>]`
+* Simple colored semitransparent box
+* `x` and `y` position the box relative to the top left of the menu
+* `w` and `h` are the size of box
+* `color` is color specified as a `ColorString`
+
+#### `dropdown[<X>,<Y>;<W>;<name>;<item 1>,<item 2>, ...,<item n>;<selected idx>]`
+* Show a dropdown field
+* **Important note**: There are two different operation modes:
+     1. handle directly on change (only changed dropdown is submitted)
+     2. read the value on pressing a button (all dropdown values are available)
+* `x` and `y` position of dropdown
+* Width of dropdown
+* Fieldname data is transferred to Lua
+* Items to be shown in dropdown
+* Index of currently selected dropdown item
+
+#### `checkbox[<X>,<Y>;<name>;<label>;<selected>]`
+* Show a checkbox
+* `x` and `y`: position of checkbox
+* `name` fieldname data is transferred to Lua
+* `label` to be shown left of checkbox
+* `selected` (optional): `true`/`false`
+
+#### `scrollbar[<X>,<Y>;<W>,<H>;<orientation>;<name>;<value>]`
+* Show a scrollbar
+* There are two ways to use it:
+     1. handle the changed event (only changed scrollbar is available)
+     2. read the value on pressing a button (all scrollbars are available)
+* `x` and `y`: position of trackbar
+* `w` and `h`: width and height
+* `orientation`:  `vertical`/`horizontal`
+* Fieldname data is transferred to Lua
+* Value this trackbar is set to (`0`-`1000`)
+* See also `minetest.explode_scrollbar_event` (main menu: `engine.explode_scrollbar_event`)
+
+#### `table[<X>,<Y>;<W>,<H>;<name>;<cell 1>,<cell 2>,...,<cell n>;<selected idx>]`
+* Show scrollable table using options defined by the previous `tableoptions[]`
+* Displays cells as defined by the previous `tablecolumns[]`
+* `x` and `y`: position the itemlist relative to the top left of the menu
+* `w` and `h` are the size of the itemlist
+* `name`: fieldname sent to server on row select or doubleclick
+* `cell 1`...`cell n`: cell contents given in row-major order
+* `selected idx`: index of row to be selected within table (first row = `1`)
+* See also `minetest.explode_table_event` (main menu: `engine.explode_table_event`)
+
+#### `tableoptions[<opt 1>;<opt 2>;...]`
+* Sets options for `table[]`
+* `color=#RRGGBB`
+     * default text color (`ColorString`), defaults to `#FFFFFF`
+* `background=#RRGGBB`
+     * table background color (`ColorString`), defaults to `#000000`
+* `border=<true/false>`
+     * should the table be drawn with a border? (default: `true`)
+* `highlight=#RRGGBB`
+     * highlight background color (`ColorString`), defaults to `#466432`
+* `highlight_text=#RRGGBB`
+     * highlight text color (`ColorString`), defaults to `#FFFFFF`
+* `opendepth=<value>`
+     * all subtrees up to `depth < value` are open (default value = `0`)
+     * only useful when there is a column of type "tree"
+
+#### `tablecolumns[<type 1>,<opt 1a>,<opt 1b>,...;<type 2>,<opt 2a>,<opt 2b>;...]`
+* Sets columns for `table[]`
+* Types: `text`, `image`, `color`, `indent`, `tree`
+    * `text`:   show cell contents as text
+    * `image`:  cell contents are an image index, use column options to define images
+    * `color`:   cell contents are a ColorString and define color of following cell
+    * `indent`: cell contents are a number and define indentation of following cell
+    * `tree`:   same as indent, but user can open and close subtrees (treeview-like)
+* Column options:
+    * `align=<value>`
+        * for `text` and `image`: content alignment within cells.
+          Available values: `left` (default), `center`, `right`, `inline`
+    * `width=<value>`
+        * for `text` and `image`: minimum width in em (default: `0`)
+        * for `indent` and `tree`: indent width in em (default: `1.5`)
+    * `padding=<value>`: padding left of the column, in em (default `0.5`).
+      Exception: defaults to 0 for indent columns
+    * `tooltip=<value>`: tooltip text (default: empty)
+    * `image` column options:
+        * `0=<value>` sets image for image index 0
+        * `1=<value>` sets image for image index 1
+        * `2=<value>` sets image for image index 2
+        * and so on; defined indices need not be contiguous empty or
+          non-numeric cells are treated as `0`.
+    * `color` column options:
+        * `span=<value>`: number of following columns to affect (default: infinite)
+
+**Note**: do _not_ use a element name starting with `key_`; those names are reserved to
+pass key press events to formspec!
+
+Spatial Vectors
+---------------
+* `vector.new(a[, b, c])`: returns a vector:
+    * A copy of `a` if `a` is a vector.
+    * `{x = a, y = b, z = c}`, if all `a, b, c` are defined
+* `vector.direction(p1, p2)`: returns a vector
+* `vector.distance(p1, p2)`: returns a number
+* `vector.length(v)`: returns a number
+* `vector.normalize(v)`: returns a vector
+* `vector.floor(v)`: returns a vector, each dimension rounded down
+* `vector.round(v)`: returns a vector, each dimension rounded to nearest int
+* `vector.apply(v, func)`: returns a vector
+* `vector.equals(v1, v2)`: returns a boolean
+
+For the following functions `x` can be either a vector or a number:
+
+* `vector.add(v, x)`: returns a vector
+* `vector.subtract(v, x)`: returns a vector
+* `vector.multiply(v, x)`: returns a scaled vector or Schur product
+* `vector.divide(v, x)`: returns a scaled vector or Schur quotient
+
+Helper functions
+----------------
+* `dump2(obj, name="_", dumped={})`
+     * Return object serialized as a string, handles reference loops
+* `dump(obj, dumped={})`
+    * Return object serialized as a string
+* `math.hypot(x, y)`
+    * Get the hypotenuse of a triangle with legs x and y.
+      Useful for distance calculation.
+* `math.sign(x, tolerance)`
+    * Get the sign of a number.
+      Optional: Also returns `0` when the absolute value is within the tolerance (default: `0`)
+* `string.split(str, separator=",", include_empty=false, max_splits=-1, sep_is_pattern=false)`
+    * If `max_splits` is negative, do not limit splits.
+    * `sep_is_pattern` specifies if separator is a plain string or a pattern (regex).
+    * e.g. `string:split("a,b", ",") == {"a","b"}`
+* `string:trim()`
+    * e.g. `string.trim("\n \t\tfoo bar\t ") == "foo bar"`
+* `minetest.wrap_text(str, limit)`: returns a string
+    * Adds new lines to the string to keep it within the specified character limit
+    * limit: Maximal amount of characters in one line
+* `minetest.pos_to_string({x=X,y=Y,z=Z}, decimal_places))`: returns string `"(X,Y,Z)"`
+    * Convert position to a printable string
+      Optional: 'decimal_places' will round the x, y and z of the pos to the given decimal place.
+* `minetest.string_to_pos(string)`: returns a position
+    * Same but in reverse. Returns `nil` if the string can't be parsed to a position.
+* `minetest.string_to_area("(X1, Y1, Z1) (X2, Y2, Z2)")`: returns two positions
+    * Converts a string representing an area box into two positions
+* `minetest.is_yes(arg)`
+    * returns whether `arg` can be interpreted as yes
+* `minetest.is_nan(arg)`
+    * returns true true when the passed number represents NaN.
+* `table.copy(table)`: returns a table
+    * returns a deep copy of `table`
+
+Minetest namespace reference
+------------------------------
+
+### Utilities
+
+* `minetest.get_current_modname()`: returns the currently loading mod's name, when we are loading a mod
+* `minetest.get_modpath(modname)`: returns virtual path of given mod including
+   the trailing separator. This is useful to load additional Lua files
+   contained in your mod:
+   e.g. `dofile(minetest.get_modpath(minetest.get_current_modname()) .. "stuff.lua")`
+* `minetest.get_language()`: returns two strings
+   * the current gettext locale
+   * the current language code (the same as used for client-side translations)
+* `minetest.get_version()`: returns a table containing components of the
+   engine version.  Components:
+    * `project`: Name of the project, eg, "Minetest"
+    * `string`: Simple version, eg, "1.2.3-dev"
+    * `hash`: Full git version (only set if available), eg, "1.2.3-dev-01234567-dirty"
+  Use this for informational purposes only. The information in the returned
+  table does not represent the capabilities of the engine, nor is it
+  reliable or verifiable. Compatible forks will have a different name and
+  version entirely. To check for the presence of engine features, test
+  whether the functions exported by the wanted features exist. For example:
+  `if minetest.check_for_falling then ... end`.
+* `minetest.sha1(data, [raw])`: returns the sha1 hash of data
+    * `data`: string of data to hash
+    * `raw`: return raw bytes instead of hex digits, default: false
+* `minetest.get_csm_restrictions()`: returns a table of `Flags` indicating the
+   restrictions applied to the current mod.
+   * If a flag in this table is set to true, the feature is RESTRICTED.
+   * Possible flags: `load_client_mods`, `chat_messages`, `read_itemdefs`,
+                   `read_nodedefs`, `lookup_nodes`, `read_playerinfo`
+
+### Logging
+* `minetest.debug(...)`
+    * Equivalent to `minetest.log(table.concat({...}, "\t"))`
+* `minetest.log([level,] text)`
+    * `level` is one of `"none"`, `"error"`, `"warning"`, `"action"`,
+      `"info"`, or `"verbose"`.  Default is `"none"`.
+
+### Global callback registration functions
+Call these functions only at load time!
+
+* `minetest.register_globalstep(function(dtime))`
+    * Called every client environment step, usually interval of 0.1s
+* `minetest.register_on_mods_loaded(function())`
+    * Called just after mods have finished loading.
+* `minetest.register_on_shutdown(function())`
+    * Called before client shutdown
+    * **Warning**: If the client terminates abnormally (i.e. crashes), the registered
+      callbacks **will likely not be run**. Data should be saved at
+      semi-frequent intervals as well as on server shutdown.
+* `minetest.register_on_receiving_chat_message(function(message))`
+    * Called always when a client receive a message
+    * Return `true` to mark the message as handled, which means that it will not be shown to chat
+* `minetest.register_on_sending_chat_message(function(message))`
+    * Called always when a client send a message from chat
+    * Return `true` to mark the message as handled, which means that it will not be sent to server
+* `minetest.register_chatcommand(cmd, chatcommand definition)`
+    * Adds definition to minetest.registered_chatcommands
+* `minetest.unregister_chatcommand(name)`
+    * Unregisters a chatcommands registered with register_chatcommand.
+* `minetest.register_on_death(function())`
+    * Called when the local player dies
+* `minetest.register_on_hp_modification(function(hp))`
+    * Called when server modified player's HP
+* `minetest.register_on_damage_taken(function(hp))`
+    * Called when the local player take damages
+* `minetest.register_on_formspec_input(function(formname, fields))`
+    * Called when a button is pressed in the local player's inventory form
+    * Newest functions are called first
+    * If function returns `true`, remaining functions are not called
+* `minetest.register_on_dignode(function(pos, node))`
+    * Called when the local player digs a node
+    * Newest functions are called first
+    * If any function returns true, the node isn't dug
+* `minetest.register_on_punchnode(function(pos, node))`
+    * Called when the local player punches a node
+    * Newest functions are called first
+    * If any function returns true, the punch is ignored
+* `minetest.register_on_placenode(function(pointed_thing, node))`
+    * Called when a node has been placed
+* `minetest.register_on_item_use(function(item, pointed_thing))`
+    * Called when the local player uses an item.
+    * Newest functions are called first.
+    * If any function returns true, the item use is not sent to server.
+* `minetest.register_on_modchannel_message(function(channel_name, sender, message))`
+    * Called when an incoming mod channel message is received
+    * You must have joined some channels before, and server must acknowledge the
+      join request.
+    * If message comes from a server mod, `sender` field is an empty string.
+* `minetest.register_on_modchannel_signal(function(channel_name, signal))`
+    * Called when a valid incoming mod channel signal is received
+    * Signal id permit to react to server mod channel events
+    * Possible values are:
+      0: join_ok
+      1: join_failed
+      2: leave_ok
+      3: leave_failed
+      4: event_on_not_joined_channel
+      5: state_changed
+* `minetest.register_on_inventory_open(function(inventory))`
+    * Called when the local player open inventory
+    * Newest functions are called first
+    * If any function returns true, inventory doesn't open
+### Sounds
+* `minetest.sound_play(spec, parameters)`: returns a handle
+    * `spec` is a `SimpleSoundSpec`
+    * `parameters` is a sound parameter table
+* `minetest.sound_stop(handle)`
+
+### Timing
+* `minetest.after(time, func, ...)`
+    * Call the function `func` after `time` seconds, may be fractional
+    * Optional: Variable number of arguments that are passed to `func`
+* `minetest.get_us_time()`
+    * Returns time with microsecond precision. May not return wall time.
+* `minetest.get_timeofday()`
+    * Returns the time of day: `0` for midnight, `0.5` for midday
+
+### Map
+* `minetest.get_node_or_nil(pos)`
+    * Returns the node at the given position as table in the format
+      `{name="node_name", param1=0, param2=0}`, returns `nil`
+      for unloaded areas or flavor limited areas.
+* `minetest.get_node_light(pos, timeofday)`
+    * Gets the light value at the given position. Note that the light value
+      "inside" the node at the given position is returned, so you usually want
+      to get the light value of a neighbor.
+    * `pos`: The position where to measure the light.
+    * `timeofday`: `nil` for current time, `0` for night, `0.5` for day
+    * Returns a number between `0` and `15` or `nil`
+* `minetest.find_node_near(pos, radius, nodenames, [search_center])`: returns pos or `nil`
+    * `radius`: using a maximum metric
+    * `nodenames`: e.g. `{"ignore", "group:tree"}` or `"default:dirt"`
+    * `search_center` is an optional boolean (default: `false`)
+      If true `pos` is also checked for the nodes
+* `minetest.find_nodes_in_area(pos1, pos2, nodenames)`: returns a list of
+  positions.
+    * `nodenames`: e.g. `{"ignore", "group:tree"}` or `"default:dirt"`
+    * First return value: Table with all node positions
+    * Second return value: Table with the count of each node with the node name
+      as index.
+    * Area volume is limited to 4,096,000 nodes
+* `minetest.find_nodes_in_area_under_air(pos1, pos2, nodenames)`: returns a
+  list of positions.
+    * `nodenames`: e.g. `{"ignore", "group:tree"}` or `"default:dirt"`
+    * Return value: Table with all node positions with a node air above
+    * Area volume is limited to 4,096,000 nodes
+* `minetest.line_of_sight(pos1, pos2)`: returns `boolean, pos`
+    * Checks if there is anything other than air between pos1 and pos2.
+    * Returns false if something is blocking the sight.
+    * Returns the position of the blocking node when `false`
+    * `pos1`: First position
+    * `pos2`: Second position
+* `minetest.raycast(pos1, pos2, objects, liquids)`: returns `Raycast`
+    * Creates a `Raycast` object.
+    * `pos1`: start of the ray
+    * `pos2`: end of the ray
+    * `objects`: if false, only nodes will be returned. Default is `true`.
+    * `liquids`: if false, liquid nodes won't be returned. Default is `false`.
+
+* `minetest.find_nodes_with_meta(pos1, pos2)`
+    * Get a table of positions of nodes that have metadata within a region
+      {pos1, pos2}.
+* `minetest.get_meta(pos)`
+    * Get a `NodeMetaRef` at that position
+* `minetest.get_node_level(pos)`
+    * get level of leveled node (water, snow)
+* `minetest.get_node_max_level(pos)`
+    * get max available level for leveled node
+
+### Player
+* `minetest.get_wielded_item()`
+    * Returns the itemstack the local player is holding
+* `minetest.send_chat_message(message)`
+    * Act as if `message` was typed by the player into the terminal.
+* `minetest.run_server_chatcommand(cmd, param)`
+    * Alias for `minetest.send_chat_message("/" .. cmd .. " " .. param)`
+* `minetest.clear_out_chat_queue()`
+    * Clears the out chat queue
+* `minetest.localplayer`
+    * Reference to the LocalPlayer object. See [`LocalPlayer`](#localplayer) class reference for methods.
+
+### Privileges
+* `minetest.get_privilege_list()`
+    * Returns a list of privileges the current player has in the format `{priv1=true,...}`
+* `minetest.string_to_privs(str)`: returns `{priv1=true,...}`
+* `minetest.privs_to_string(privs)`: returns `"priv1,priv2,..."`
+    * Convert between two privilege representations
+
+### Client Environment
+* `minetest.get_player_names()`
+    * Returns list of player names on server (nil if CSM_RF_READ_PLAYERINFO is enabled by server)
+* `minetest.disconnect()`
+    * Disconnect from the server and exit to main menu.
+    * Returns `false` if the client is already disconnecting otherwise returns `true`.
+* `minetest.get_server_info()`
+    * Returns [server info](#server-info).
+* `minetest.send_respawn()`
+    * Sends a respawn request to the server.
+
+### Storage API
+* `minetest.get_mod_storage()`:
+    * returns reference to mod private `StorageRef`
+    * must be called during mod load time
+
+### Mod channels
+![Mod channels communication scheme](docs/mod channels.png)
+
+* `minetest.mod_channel_join(channel_name)`
+    * Client joins channel `channel_name`, and creates it, if necessary. You
+      should listen from incoming messages with `minetest.register_on_modchannel_message`
+      call to receive incoming messages. Warning, this function is asynchronous.
+
+### Particles
+* `minetest.add_particle(particle definition)`
+
+* `minetest.add_particlespawner(particlespawner definition)`
+    * Add a `ParticleSpawner`, an object that spawns an amount of particles over `time` seconds
+    * Returns an `id`, and -1 if adding didn't succeed
+
+* `minetest.delete_particlespawner(id)`
+    * Delete `ParticleSpawner` with `id` (return value from `minetest.add_particlespawner`)
+
+### Misc.
+* `minetest.parse_json(string[, nullvalue])`: returns something
+    * Convert a string containing JSON data into the Lua equivalent
+    * `nullvalue`: returned in place of the JSON null; defaults to `nil`
+    * On success returns a table, a string, a number, a boolean or `nullvalue`
+    * On failure outputs an error message and returns `nil`
+    * Example: `parse_json("[10, {\"a\":false}]")`, returns `{10, {a = false}}`
+* `minetest.write_json(data[, styled])`: returns a string or `nil` and an error message
+    * Convert a Lua table into a JSON string
+    * styled: Outputs in a human-readable format if this is set, defaults to false
+    * Unserializable things like functions and userdata are saved as null.
+    * **Warning**: JSON is more strict than the Lua table format.
+        1. You can only use strings and positive integers of at least one as keys.
+        2. You can not mix string and integer keys.
+           This is due to the fact that JSON has two distinct array and object values.
+    * Example: `write_json({10, {a = false}})`, returns `"[10, {\"a\": false}]"`
+* `minetest.serialize(table)`: returns a string
+    * Convert a table containing tables, strings, numbers, booleans and `nil`s
+      into string form readable by `minetest.deserialize`
+    * Example: `serialize({foo='bar'})`, returns `'return { ["foo"] = "bar" }'`
+* `minetest.deserialize(string)`: returns a table
+    * Convert a string returned by `minetest.deserialize` into a table
+    * `string` is loaded in an empty sandbox environment.
+    * Will load functions, but they cannot access the global environment.
+    * Example: `deserialize('return { ["foo"] = "bar" }')`, returns `{foo='bar'}`
+    * Example: `deserialize('print("foo")')`, returns `nil` (function call fails)
+        * `error:[string "print("foo")"]:1: attempt to call global 'print' (a nil value)`
+* `minetest.compress(data, method, ...)`: returns `compressed_data`
+    * Compress a string of data.
+    * `method` is a string identifying the compression method to be used.
+    * Supported compression methods:
+    *     Deflate (zlib): `"deflate"`
+    * `...` indicates method-specific arguments.  Currently defined arguments are:
+    *     Deflate: `level` - Compression level, `0`-`9` or `nil`.
+* `minetest.decompress(compressed_data, method, ...)`: returns data
+    * Decompress a string of data (using ZLib).
+    * See documentation on `minetest.compress()` for supported compression methods.
+    * currently supported.
+    * `...` indicates method-specific arguments. Currently, no methods use this.
+* `minetest.rgba(red, green, blue[, alpha])`: returns a string
+    * Each argument is a 8 Bit unsigned integer
+    * Returns the ColorString from rgb or rgba values
+    * Example: `minetest.rgba(10, 20, 30, 40)`, returns `"#0A141E28"`
+* `minetest.encode_base64(string)`: returns string encoded in base64
+    * Encodes a string in base64.
+* `minetest.decode_base64(string)`: returns string
+    * Decodes a string encoded in base64.
+* `minetest.gettext(string)` : returns string
+    * look up the translation of a string in the gettext message catalog
+* `fgettext_ne(string, ...)`
+    * call minetest.gettext(string), replace "$1"..."$9" with the given
+      extra arguments and return the result
+* `fgettext(string, ...)` : returns string
+    * same as fgettext_ne(), but calls minetest.formspec_escape before returning result
+* `minetest.pointed_thing_to_face_pos(placer, pointed_thing)`: returns a position
+    * returns the exact position on the surface of a pointed node
+* `minetest.global_exists(name)`
+    * Checks if a global variable has been set, without triggering a warning.
+
+### UI
+* `minetest.ui.minimap`
+    * Reference to the minimap object. See [`Minimap`](#minimap) class reference for methods.
+    * If client disabled minimap (using enable_minimap setting) this reference will be nil.
+* `minetest.camera`
+    * Reference to the camera object. See [`Camera`](#camera) class reference for methods.
+* `minetest.show_formspec(formname, formspec)` : returns true on success
+       * Shows a formspec to the player
+* `minetest.display_chat_message(message)` returns true on success
+       * Shows a chat message to the current player.
+
+Class reference
+---------------
+
+### ModChannel
+
+An interface to use mod channels on client and server
+
+#### Methods
+* `leave()`: leave the mod channel.
+    * Client leaves channel `channel_name`.
+    * No more incoming or outgoing messages can be sent to this channel from client mods.
+    * This invalidate all future object usage
+    * Ensure your set mod_channel to nil after that to free Lua resources
+* `is_writeable()`: returns true if channel is writable and mod can send over it.
+* `send_all(message)`: Send `message` though the mod channel.
+    * If mod channel is not writable or invalid, message will be dropped.
+    * Message size is limited to 65535 characters by protocol.
+
+### Minimap
+An interface to manipulate minimap on client UI
+
+#### Methods
+* `show()`: shows the minimap (if not disabled by server)
+* `hide()`: hides the minimap
+* `set_pos(pos)`: sets the minimap position on screen
+* `get_pos()`: returns the minimap current position
+* `set_angle(deg)`: sets the minimap angle in degrees
+* `get_angle()`: returns the current minimap angle in degrees
+* `set_mode(mode)`: sets the minimap mode (0 to 6)
+* `get_mode()`: returns the current minimap mode
+* `set_shape(shape)`: Sets the minimap shape. (0 = square, 1 = round)
+* `get_shape()`: Gets the minimap shape. (0 = square, 1 = round)
+
+### Camera
+An interface to get or set information about the camera and camera-node.
+Please do not try to access the reference until the camera is initialized, otherwise the reference will be nil.
+
+#### Methods
+* `set_camera_mode(mode)`
+    * Pass `0` for first-person, `1` for third person, and `2` for third person front
+* `get_camera_mode()`
+    * Returns 0, 1, or 2 as described above
+* `get_fov()`
+    * Returns:
+
+```lua
+     {
+         x = number,
+         y = number,
+         max = number,
+         actual = number
+     }
+```
+
+* `get_pos()`
+    * Returns position of camera with view bobbing
+* `get_offset()`
+    * Returns eye offset vector
+* `get_look_dir()`
+    * Returns eye direction unit vector
+* `get_look_vertical()`
+    * Returns pitch in radians
+* `get_look_horizontal()`
+    * Returns yaw in radians
+* `get_aspect_ratio()`
+    * Returns aspect ratio of screen
+
+### LocalPlayer
+An interface to retrieve information about the player.
+
+Methods:
+
+* `get_pos()`
+    * returns current player current position
+* `get_velocity()`
+    * returns player speed vector
+* `get_hp()`
+    * returns player HP
+* `get_name()`
+    * returns player name
+* `is_attached()`
+    * returns true if player is attached
+* `is_touching_ground()`
+    * returns true if player touching ground
+* `is_in_liquid()`
+    * returns true if player is in a liquid (This oscillates so that the player jumps a bit above the surface)
+* `is_in_liquid_stable()`
+    * returns true if player is in a stable liquid (This is more stable and defines the maximum speed of the player)
+* `get_liquid_viscosity()`
+    * returns liquid viscosity (Gets the viscosity of liquid to calculate friction)
+* `is_climbing()`
+    * returns true if player is climbing
+* `swimming_vertical()`
+    * returns true if player is swimming in vertical
+* `get_physics_override()`
+    * returns:
+
+```lua
+    {
+        speed = float,
+        jump = float,
+        gravity = float,
+        sneak = boolean,
+        sneak_glitch = boolean
+    }
+```
+
+* `get_override_pos()`
+    * returns override position
+* `get_last_pos()`
+    * returns last player position before the current client step
+* `get_last_velocity()`
+    * returns last player speed
+* `get_breath()`
+    * returns the player's breath
+* `get_movement_acceleration()`
+    * returns acceleration of the player in different environments:
+
+```lua
+    {
+       fast = float,
+       air = float,
+       default = float,
+    }
+```
+
+* `get_movement_speed()`
+    * returns player's speed in different environments:
+
+```lua
+    {
+       walk = float,
+       jump = float,
+       crouch = float,
+       fast = float,
+       climb = float,
+    }
+```
+
+* `get_movement()`
+    * returns player's movement in different environments:
+
+```lua
+    {
+       liquid_fluidity = float,
+       liquid_sink = float,
+       liquid_fluidity_smooth = float,
+       gravity = float,
+    }
+```
+
+* `get_last_look_horizontal()`:
+    * returns last look horizontal angle
+* `get_last_look_vertical()`:
+    * returns last look vertical angle
+* `get_key_pressed()`:
+    * returns last key typed by the player
+* `hud_add(definition)`
+    * add a HUD element described by HUD def, returns ID number on success and `nil` on failure.
+    * See [`HUD definition`](#hud-definition-hud_add-hud_get)
+* `hud_get(id)`
+    * returns the [`definition`](#hud-definition-hud_add-hud_get) of the HUD with that ID number or `nil`, if non-existent.
+* `hud_remove(id)`
+    * remove the HUD element of the specified id, returns `true` on success
+* `hud_change(id, stat, value)`
+    * change a value of a previously added HUD element
+    * element `stat` values: `position`, `name`, `scale`, `text`, `number`, `item`, `dir`
+    * Returns `true` on success, otherwise returns `nil`
+
+### Settings
+An interface to read config files in the format of `minetest.conf`.
+
+It can be created via `Settings(filename)`.
+
+#### Methods
+* `get(key)`: returns a value
+* `get_bool(key)`: returns a boolean
+* `set(key, value)`
+* `remove(key)`: returns a boolean (`true` for success)
+* `get_names()`: returns `{key1,...}`
+* `write()`: returns a boolean (`true` for success)
+    * write changes to file
+* `to_table()`: returns `{[key1]=value1,...}`
+
+### NodeMetaRef
+Node metadata: reference extra data and functionality stored in a node.
+Can be obtained via `minetest.get_meta(pos)`.
+
+#### Methods
+* `get_string(name)`
+* `get_int(name)`
+* `get_float(name)`
+* `to_table()`: returns `nil` or a table with keys:
+    * `fields`: key-value storage
+    * `inventory`: `{list1 = {}, ...}}`
+
+### `Raycast`
+
+A raycast on the map. It works with selection boxes.
+Can be used as an iterator in a for loop as:
+
+    local ray = Raycast(...)
+    for pointed_thing in ray do
+        ...
+    end
+
+The map is loaded as the ray advances. If the map is modified after the
+`Raycast` is created, the changes may or may not have an effect on the object.
+
+It can be created via `Raycast(pos1, pos2, objects, liquids)` or
+`minetest.raycast(pos1, pos2, objects, liquids)` where:
+
+* `pos1`: start of the ray
+* `pos2`: end of the ray
+* `objects`: if false, only nodes will be returned. Default is true.
+* `liquids`: if false, liquid nodes won't be returned. Default is false.
+
+#### Methods
+
+* `next()`: returns a `pointed_thing` with exact pointing location
+    * Returns the next thing pointed by the ray or nil.
+
+-----------------
+### Definitions
+* `minetest.get_node_def(nodename)`
+       * Returns [node definition](#node-definition) table of `nodename`
+* `minetest.get_item_def(itemstring)`
+       * Returns item definition table of `itemstring`
+
+#### Node Definition
+
+```lua
+       {
+               has_on_construct = bool,        -- Whether the node has the on_construct callback defined
+               has_on_destruct = bool,         -- Whether the node has the on_destruct callback defined
+               has_after_destruct = bool,      -- Whether the node has the after_destruct callback defined
+               name = string,                  -- The name of the node e.g. "air", "default:dirt"
+               groups = table,                 -- The groups of the node
+               paramtype = string,             -- Paramtype of the node
+               paramtype2 = string,            -- ParamType2 of the node
+               drawtype = string,              -- Drawtype of the node
+               mesh = <string>,                -- Mesh name if existant
+               minimap_color = <Color>,        -- Color of node on minimap *May not exist*
+               visual_scale = number,          -- Visual scale of node
+               alpha = number,                 -- Alpha of the node. Only used for liquids
+               color = <Color>,                -- Color of node *May not exist*
+               palette_name = <string>,        -- Filename of palette *May not exist*
+               palette = <{                    -- List of colors
+                       Color,
+                       Color
+               }>,
+               waving = number,                -- 0 of not waving, 1 if waving
+               connect_sides = number,         -- Used for connected nodes
+               connects_to = {                 -- List of nodes to connect to
+                       "node1",
+                       "node2"
+               },
+               post_effect_color = Color,      -- Color overlayed on the screen when the player is in the node
+               leveled = number,               -- Max level for node
+               sunlight_propogates = bool,     -- Whether light passes through the block
+               light_source = number,          -- Light emitted by the block
+               is_ground_content = bool,       -- Whether caves should cut through the node
+               walkable = bool,                -- Whether the player collides with the node
+               pointable = bool,               -- Whether the player can select the node
+               diggable = bool,                -- Whether the player can dig the node
+               climbable = bool,               -- Whether the player can climb up the node
+               buildable_to = bool,            -- Whether the player can replace the node by placing a node on it
+               rightclickable = bool,          -- Whether the player can place nodes pointing at this node
+               damage_per_second = number,     -- HP of damage per second when the player is in the node
+               liquid_type = <string>,         -- A string containing "none", "flowing", or "source" *May not exist*
+               liquid_alternative_flowing = <string>, -- Alternative node for liquid *May not exist*
+               liquid_alternative_source = <string>, -- Alternative node for liquid *May not exist*
+               liquid_viscosity = <number>,    -- How fast the liquid flows *May not exist*
+               liquid_renewable = <boolean>,   -- Whether the liquid makes an infinite source *May not exist*
+               liquid_range = <number>,        -- How far the liquid flows *May not exist*
+               drowning = bool,                -- Whether the player will drown in the node
+               floodable = bool,               -- Whether nodes will be replaced by liquids (flooded)
+               node_box = table,               -- Nodebox to draw the node with
+               collision_box = table,          -- Nodebox to set the collision area
+               selection_box = table,          -- Nodebox to set the area selected by the player
+               sounds = {                      -- Table of sounds that the block makes
+                       sound_footstep = SimpleSoundSpec,
+                       sound_dig = SimpleSoundSpec,
+                       sound_dug = SimpleSoundSpec
+               },
+               legacy_facedir_simple = bool,   -- Whether to use old facedir
+               legacy_wallmounted = bool       -- Whether to use old wallmounted
+       }
+```
+
+#### Item Definition
+
+```lua
+       {
+               name = string,                  -- Name of the item e.g. "default:stone"
+               description = string,           -- Description of the item e.g. "Stone"
+               type = string,                  -- Item type: "none", "node", "craftitem", "tool"
+               inventory_image = string,       -- Image in the inventory
+               wield_image = string,           -- Image in wieldmesh
+               palette_image = string,         -- Image for palette
+               color = Color,                  -- Color for item
+               wield_scale = Vector,           -- Wieldmesh scale
+               stack_max = number,             -- Number of items stackable together
+               usable = bool,                  -- Has on_use callback defined
+               liquids_pointable = bool,       -- Whether you can point at liquids with the item
+               tool_capabilities = <table>,    -- If the item is a tool, tool capabilities of the item
+               groups = table,                 -- Groups of the item
+               sound_place = SimpleSoundSpec,  -- Sound played when placed
+               sound_place_failed = SimpleSoundSpec, -- Sound played when placement failed
+               node_placement_prediction = string -- Node placed in client until server catches up
+       }
+```
+-----------------
+
+### Chat command definition (`register_chatcommand`)
+
+    {
+        params = "<name> <privilege>", -- Short parameter description
+        description = "Remove privilege from player", -- Full description
+        func = function(param),        -- Called when command is run.
+                                       -- Returns boolean success and text output.
+    }
+### Server info
+```lua
+{
+       address = "minetest.example.org", -- The domain name/IP address of a remote server or "" for a local server.
+       ip = "203.0.113.156",             -- The IP address of the server.
+       port = 30000,                     -- The port the client is connected to.
+       protocol_version = 30             -- Will not be accurate at start up as the client might not be connected to the server yet, in that case it will be 0.
+}
+```
+
+### HUD Definition (`hud_add`, `hud_get`)
+```lua
+    {
+        hud_elem_type = "image", -- see HUD element types, default "text"
+    --  ^ type of HUD element, can be either of "image", "text", "statbar", or "inventory"
+        position = {x=0.5, y=0.5},
+    --  ^ Left corner position of element, default `{x=0,y=0}`.
+        name = "<name>",    -- default ""
+        scale = {x=2, y=2}, -- default {x=0,y=0}
+        text = "<text>",    -- default ""
+        number = 2,         -- default 0
+        item = 3,           -- default 0
+    --  ^ Selected item in inventory.  0 for no item selected.
+        direction = 0,      -- default 0
+    --  ^ Direction: 0: left-right, 1: right-left, 2: top-bottom, 3: bottom-top
+        alignment = {x=0, y=0},   -- default {x=0, y=0}
+    --  ^ See "HUD Element Types"
+        offset = {x=0, y=0},      -- default {x=0, y=0}
+    --  ^ See "HUD Element Types"
+        size = { x=100, y=100 },  -- default {x=0, y=0}
+    --  ^ Size of element in pixels
+    }
+```
+
+Escape sequences
+----------------
+Most text can contain escape sequences, that can for example color the text.
+There are a few exceptions: tab headers, dropdowns and vertical labels can't.
+The following functions provide escape sequences:
+* `minetest.get_color_escape_sequence(color)`:
+    * `color` is a [ColorString](#colorstring)
+    * The escape sequence sets the text color to `color`
+* `minetest.colorize(color, message)`:
+    * Equivalent to:
+      `minetest.get_color_escape_sequence(color) ..
+       message ..
+       minetest.get_color_escape_sequence("#ffffff")`
+* `minetest.get_background_escape_sequence(color)`
+    * `color` is a [ColorString](#colorstring)
+    * The escape sequence sets the background of the whole text element to
+      `color`. Only defined for item descriptions and tooltips.
+* `minetest.strip_foreground_colors(str)`
+    * Removes foreground colors added by `get_color_escape_sequence`.
+* `minetest.strip_background_colors(str)`
+    * Removes background colors added by `get_background_escape_sequence`.
+* `minetest.strip_colors(str)`
+    * Removes all color escape sequences.
+
+`ColorString`
+-------------
+`#RGB` defines a color in hexadecimal format.
+
+`#RGBA` defines a color in hexadecimal format and alpha channel.
+
+`#RRGGBB` defines a color in hexadecimal format.
+
+`#RRGGBBAA` defines a color in hexadecimal format and alpha channel.
+
+Named colors are also supported and are equivalent to
+[CSS Color Module Level 4](http://dev.w3.org/csswg/css-color/#named-colors).
+To specify the value of the alpha channel, append `#AA` to the end of the color name
+(e.g. `colorname#08`). For named colors the hexadecimal string representing the alpha
+value must (always) be two hexadecimal digits.
+
+`Color`
+-------------
+`{a = alpha, r = red, g = green, b = blue}` defines an ARGB8 color.
+
+HUD element types
+-----------------
+The position field is used for all element types.
+
+To account for differing resolutions, the position coordinates are the percentage
+of the screen, ranging in value from `0` to `1`.
+
+The name field is not yet used, but should contain a description of what the
+HUD element represents. The direction field is the direction in which something
+is drawn.
+
+`0` draws from left to right, `1` draws from right to left, `2` draws from
+top to bottom, and `3` draws from bottom to top.
+
+The `alignment` field specifies how the item will be aligned. It ranges from `-1` to `1`,
+with `0` being the center, `-1` is moved to the left/up, and `1` is to the right/down.
+Fractional values can be used.
+
+The `offset` field specifies a pixel offset from the position. Contrary to position,
+the offset is not scaled to screen size. This allows for some precisely-positioned
+items in the HUD.
+
+**Note**: `offset` _will_ adapt to screen DPI as well as user defined scaling factor!
+
+Below are the specific uses for fields in each type; fields not listed for that type are ignored.
+
+**Note**: Future revisions to the HUD API may be incompatible; the HUD API is still
+in the experimental stages.
+
+### `image`
+Displays an image on the HUD.
+
+* `scale`: The scale of the image, with 1 being the original texture size.
+  Only the X coordinate scale is used (positive values).
+  Negative values represent that percentage of the screen it
+  should take; e.g. `x=-100` means 100% (width).
+* `text`: The name of the texture that is displayed.
+* `alignment`: The alignment of the image.
+* `offset`: offset in pixels from position.
+
+### `text`
+Displays text on the HUD.
+
+* `scale`: Defines the bounding rectangle of the text.
+  A value such as `{x=100, y=100}` should work.
+* `text`: The text to be displayed in the HUD element.
+* `number`: An integer containing the RGB value of the color used to draw the text.
+  Specify `0xFFFFFF` for white text, `0xFF0000` for red, and so on.
+* `alignment`: The alignment of the text.
+* `offset`: offset in pixels from position.
+
+### `statbar`
+Displays a horizontal bar made up of half-images.
+
+* `text`: The name of the texture that is used.
+* `number`: The number of half-textures that are displayed.
+  If odd, will end with a vertically center-split texture.
+* `direction`
+* `offset`: offset in pixels from position.
+* `size`: If used, will force full-image size to this value (override texture pack image size)
+
+### `inventory`
+* `text`: The name of the inventory list to be displayed.
+* `number`: Number of items in the inventory to be displayed.
+* `item`: Position of item that is selected.
+* `direction`
+* `offset`: offset in pixels from position.
+
+### `waypoint`
+Displays distance to selected world position.
+
+* `name`: The name of the waypoint.
+* `text`: Distance suffix. Can be blank.
+* `number:` An integer containing the RGB value of the color used to draw the text.
+* `world_pos`: World position of the waypoint.
+
+### Particle definition (`add_particle`)
+
+    {
+        pos = {x=0, y=0, z=0},
+        velocity = {x=0, y=0, z=0},
+        acceleration = {x=0, y=0, z=0},
+    --  ^ Spawn particle at pos with velocity and acceleration
+        expirationtime = 1,
+    --  ^ Disappears after expirationtime seconds
+        size = 1,
+        collisiondetection = false,
+    --  ^ collisiondetection: if true collides with physical objects
+        collision_removal = false,
+    --  ^ collision_removal: if true then particle is removed when it collides,
+    --  ^ requires collisiondetection = true to have any effect
+        vertical = false,
+    --  ^ vertical: if true faces player using y axis only
+        texture = "image.png",
+    --  ^ Uses texture (string)
+        animation = {Tile Animation definition},
+    --  ^ optional, specifies how to animate the particle texture
+        glow = 0
+    --  ^ optional, specify particle self-luminescence in darkness
+    }
+
+### `ParticleSpawner` definition (`add_particlespawner`)
+
+    {
+        amount = 1,
+        time = 1,
+    --  ^ If time is 0 has infinite lifespan and spawns the amount on a per-second base
+        minpos = {x=0, y=0, z=0},
+        maxpos = {x=0, y=0, z=0},
+        minvel = {x=0, y=0, z=0},
+        maxvel = {x=0, y=0, z=0},
+        minacc = {x=0, y=0, z=0},
+        maxacc = {x=0, y=0, z=0},
+        minexptime = 1,
+        maxexptime = 1,
+        minsize = 1,
+        maxsize = 1,
+    --  ^ The particle's properties are random values in between the bounds:
+    --  ^ minpos/maxpos, minvel/maxvel (velocity), minacc/maxacc (acceleration),
+    --  ^ minsize/maxsize, minexptime/maxexptime (expirationtime)
+        collisiondetection = false,
+    --  ^ collisiondetection: if true uses collision detection
+        collision_removal = false,
+    --  ^ collision_removal: if true then particle is removed when it collides,
+    --  ^ requires collisiondetection = true to have any effect
+        vertical = false,
+    --  ^ vertical: if true faces player using y axis only
+        texture = "image.png",
+    --  ^ Uses texture (string)
+    }
diff --git a/doc/client_lua_api.txt b/doc/client_lua_api.txt
deleted file mode 100644 (file)
index c24de8d..0000000
+++ /dev/null
@@ -1,1451 +0,0 @@
-Minetest Lua Client Modding API Reference 5.2.0
-================================================
-* More information at <http://www.minetest.net/>
-* Developer Wiki: <http://dev.minetest.net/>
-
-Introduction
-------------
-
-** WARNING: The client API is currently unstable, and may break/change without warning. **
-
-Content and functionality can be added to Minetest 0.4.15-dev+ by using Lua
-scripting in run-time loaded mods.
-
-A mod is a self-contained bunch of scripts, textures and other related
-things that is loaded by and interfaces with Minetest.
-
-Transferring client-sided mods from the server to the client is planned, but not implemented yet.
-
-If you see a deficiency in the API, feel free to attempt to add the
-functionality in the engine and API. You can send such improvements as
-source code patches on GitHub (https://github.com/minetest/minetest).
-
-Programming in Lua
-------------------
-If you have any difficulty in understanding this, please read
-[Programming in Lua](http://www.lua.org/pil/).
-
-Startup
--------
-Mods are loaded during client startup from the mod load paths by running
-the `init.lua` scripts in a shared environment.
-
-In order to load client-side mods, the following conditions need to be satisfied:
-
-1) `$path_user/minetest.conf` contains the setting `enable_client_modding = true`
-
-2) The client-side mod located in `$path_user/clientmods/<modname>` is added to
-    `$path_user/clientmods/mods.conf` as `load_mod_<modname> = true`.
-
-Note: Depending on the remote server's settings, client-side mods might not
-be loaded or have limited functionality. See setting `csm_restriction_flags` for reference.
-
-Paths
------
-* `RUN_IN_PLACE=1` (Windows release, local build)
-    * `$path_user`: `<build directory>`
-    * `$path_share`: `<build directory>`
-* `RUN_IN_PLACE=0`: (Linux release)
-    * `$path_share`:
-        * Linux: `/usr/share/minetest`
-        * Windows: `<install directory>/minetest-0.4.x`
-    * `$path_user`:
-        * Linux: `$HOME/.minetest`
-        * Windows: `C:/users/<user>/AppData/minetest` (maybe)
-
-Mod load path
--------------
-Generic:
-
-* `$path_share/clientmods/`
-* `$path_user/clientmods/` (User-installed mods)
-
-In a run-in-place version (e.g. the distributed windows version):
-
-* `minetest-0.4.x/clientmods/` (User-installed mods)
-
-On an installed version on Linux:
-
-* `/usr/share/minetest/clientmods/`
-* `$HOME/.minetest/clientmods/` (User-installed mods)
-
-Modpack support
-----------------
-
-Mods can be put in a subdirectory, if the parent directory, which otherwise
-should be a mod, contains a file named `modpack.conf`.
-The file is a key-value store of modpack details.
-
-* `name`: The modpack name.
-* `description`: Description of mod to be shown in the Mods tab of the main
-                 menu.
-
-Mod directory structure
-------------------------
-
-    clientmods
-    ├── modname
-    │   ├── mod.conf
-    │   ├── init.lua
-    └── another
-
-### modname
-
-The location of this directory.
-
-### mod.conf
-
-An (optional) settings file that provides meta information about the mod.
-
-* `name`: The mod name. Allows Minetest to determine the mod name even if the
-          folder is wrongly named.
-* `description`: Description of mod to be shown in the Mods tab of the main
-                 menu.
-* `depends`: A comma separated list of dependencies. These are mods that must be
-             loaded before this mod.
-* `optional_depends`: A comma separated list of optional dependencies.
-                      Like a dependency, but no error if the mod doesn't exist.
-
-### `init.lua`
-
-The main Lua script. Running this script should register everything it
-wants to register. Subsequent execution depends on minetest calling the
-registered callbacks.
-
-**NOTE**: Client mods currently can't provide and textures, sounds or models by
-themselves. Any media referenced in function calls must already be loaded
-(provided by mods that exist on the server).
-
-Naming convention for registered textual names
-----------------------------------------------
-Registered names should generally be in this format:
-
-    "modname:<whatever>" (<whatever> can have characters a-zA-Z0-9_)
-
-This is to prevent conflicting names from corrupting maps and is
-enforced by the mod loader.
-
-### Example
-In the mod `experimental`, there is the ideal item/node/entity name `tnt`.
-So the name should be `experimental:tnt`.
-
-Enforcement can be overridden by prefixing the name with `:`. This can
-be used for overriding the registrations of some other mod.
-
-Example: Any mod can redefine `experimental:tnt` by using the name
-
-    :experimental:tnt
-
-when registering it.
-(also that mod is required to have `experimental` as a dependency)
-
-The `:` prefix can also be used for maintaining backwards compatibility.
-
-Sounds
-------
-**NOTE: Connecting sounds to objects is not implemented.**
-
-Only Ogg Vorbis files are supported.
-
-For positional playing of sounds, only single-channel (mono) files are
-supported. Otherwise OpenAL will play them non-positionally.
-
-Mods should generally prefix their sounds with `modname_`, e.g. given
-the mod name "`foomod`", a sound could be called:
-
-    foomod_foosound.ogg
-
-Sounds are referred to by their name with a dot, a single digit and the
-file extension stripped out. When a sound is played, the actual sound file
-is chosen randomly from the matching sounds.
-
-When playing the sound `foomod_foosound`, the sound is chosen randomly
-from the available ones of the following files:
-
-* `foomod_foosound.ogg`
-* `foomod_foosound.0.ogg`
-* `foomod_foosound.1.ogg`
-* (...)
-* `foomod_foosound.9.ogg`
-
-Examples of sound parameter tables:
-
-    -- Play locationless
-    {
-        gain = 1.0, -- default
-    }
-    -- Play locationless, looped
-    {
-        gain = 1.0, -- default
-        loop = true,
-    }
-    -- Play in a location
-    {
-        pos = {x = 1, y = 2, z = 3},
-        gain = 1.0, -- default
-    }
-    -- Play connected to an object, looped
-    {
-        object = <an ObjectRef>,
-        gain = 1.0, -- default
-        loop = true,
-    }
-
-Looped sounds must either be connected to an object or played locationless.
-
-### SimpleSoundSpec
-* e.g. `""`
-* e.g. `"default_place_node"`
-* e.g. `{}`
-* e.g. `{name = "default_place_node"}`
-* e.g. `{name = "default_place_node", gain = 1.0}`
-
-Representations of simple things
---------------------------------
-
-### Position/vector
-
-    {x=num, y=num, z=num}
-
-For helper functions see "Vector helpers".
-
-### pointed_thing
-* `{type="nothing"}`
-* `{type="node", under=pos, above=pos}`
-* `{type="object", id=ObjectID}`
-
-Flag Specifier Format
----------------------
-Flags using the standardized flag specifier format can be specified in either of
-two ways, by string or table.
-
-The string format is a comma-delimited set of flag names; whitespace and
-unrecognized flag fields are ignored. Specifying a flag in the string sets the
-flag, and specifying a flag prefixed by the string `"no"` explicitly
-clears the flag from whatever the default may be.
-
-In addition to the standard string flag format, the schematic flags field can
-also be a table of flag names to boolean values representing whether or not the
-flag is set. Additionally, if a field with the flag name prefixed with `"no"`
-is present, mapped to a boolean of any value, the specified flag is unset.
-
-E.g. A flag field of value
-
-    {place_center_x = true, place_center_y=false, place_center_z=true}
-
-is equivalent to
-
-    {place_center_x = true, noplace_center_y=true, place_center_z=true}
-
-which is equivalent to
-
-    "place_center_x, noplace_center_y, place_center_z"
-
-or even
-
-    "place_center_x, place_center_z"
-
-since, by default, no schematic attributes are set.
-
-Formspec
---------
-Formspec defines a menu. It is a string, with a somewhat strange format.
-
-Spaces and newlines can be inserted between the blocks, as is used in the
-examples.
-
-### Examples
-
-#### Chest
-
-    size[8,9]
-    list[context;main;0,0;8,4;]
-    list[current_player;main;0,5;8,4;]
-
-#### Furnace
-
-    size[8,9]
-    list[context;fuel;2,3;1,1;]
-    list[context;src;2,1;1,1;]
-    list[context;dst;5,1;2,2;]
-    list[current_player;main;0,5;8,4;]
-
-#### Minecraft-like player inventory
-
-    size[8,7.5]
-    image[1,0.6;1,2;player.png]
-    list[current_player;main;0,3.5;8,4;]
-    list[current_player;craft;3,0;3,3;]
-    list[current_player;craftpreview;7,1;1,1;]
-
-### Elements
-
-#### `size[<W>,<H>,<fixed_size>]`
-* Define the size of the menu in inventory slots
-* `fixed_size`: `true`/`false` (optional)
-* deprecated: `invsize[<W>,<H>;]`
-
-#### `container[<X>,<Y>]`
-* Start of a container block, moves all physical elements in the container by (X, Y)
-* Must have matching container_end
-* Containers can be nested, in which case the offsets are added
-  (child containers are relative to parent containers)
-
-#### `container_end[]`
-* End of a container, following elements are no longer relative to this container
-
-#### `list[<inventory location>;<list name>;<X>,<Y>;<W>,<H>;]`
-* Show an inventory list
-
-#### `list[<inventory location>;<list name>;<X>,<Y>;<W>,<H>;<starting item index>]`
-* Show an inventory list
-
-#### `listring[<inventory location>;<list name>]`
-* Allows to create a ring of inventory lists
-* Shift-clicking on items in one element of the ring
-  will send them to the next inventory list inside the ring
-* The first occurrence of an element inside the ring will
-  determine the inventory where items will be sent to
-
-#### `listring[]`
-* Shorthand for doing `listring[<inventory location>;<list name>]`
-  for the last two inventory lists added by list[...]
-
-#### `listcolors[<slot_bg_normal>;<slot_bg_hover>]`
-* Sets background color of slots as `ColorString`
-* Sets background color of slots on mouse hovering
-
-#### `listcolors[<slot_bg_normal>;<slot_bg_hover>;<slot_border>]`
-* Sets background color of slots as `ColorString`
-* Sets background color of slots on mouse hovering
-* Sets color of slots border
-
-#### `listcolors[<slot_bg_normal>;<slot_bg_hover>;<slot_border>;<tooltip_bgcolor>;<tooltip_fontcolor>]`
-* Sets background color of slots as `ColorString`
-* Sets background color of slots on mouse hovering
-* Sets color of slots border
-* Sets default background color of tooltips
-* Sets default font color of tooltips
-
-#### `tooltip[<gui_element_name>;<tooltip_text>;<bgcolor>,<fontcolor>]`
-* Adds tooltip for an element
-* `<bgcolor>` tooltip background color as `ColorString` (optional)
-* `<fontcolor>` tooltip font color as `ColorString` (optional)
-
-#### `image[<X>,<Y>;<W>,<H>;<texture name>]`
-* Show an image
-* Position and size units are inventory slots
-
-#### `item_image[<X>,<Y>;<W>,<H>;<item name>]`
-* Show an inventory image of registered item/node
-* Position and size units are inventory slots
-
-#### `bgcolor[<color>;<fullscreen>]`
-* Sets background color of formspec as `ColorString`
-* If `true`, the background color is drawn fullscreen (does not effect the size of the formspec)
-
-#### `background[<X>,<Y>;<W>,<H>;<texture name>]`
-* Use a background. Inventory rectangles are not drawn then.
-* Position and size units are inventory slots
-* Example for formspec 8x4 in 16x resolution: image shall be sized
-  8 times 16px  times  4 times 16px.
-
-#### `background[<X>,<Y>;<W>,<H>;<texture name>;<auto_clip>]`
-* Use a background. Inventory rectangles are not drawn then.
-* Position and size units are inventory slots
-* Example for formspec 8x4 in 16x resolution:
-  image shall be sized 8 times 16px  times  4 times 16px
-* If `true` the background is clipped to formspec size
-  (`x` and `y` are used as offset values, `w` and `h` are ignored)
-
-#### `pwdfield[<X>,<Y>;<W>,<H>;<name>;<label>]`
-* Textual password style field; will be sent to server when a button is clicked
-* When enter is pressed in field, fields.key_enter_field will be sent with the name
-  of this field.
-* `x` and `y` position the field relative to the top left of the menu
-* `w` and `h` are the size of the field
-* Fields are a set height, but will be vertically centred on `h`
-* Position and size units are inventory slots
-* `name` is the name of the field as returned in fields to `on_receive_fields`
-* `label`, if not blank, will be text printed on the top left above the field
-* See field_close_on_enter to stop enter closing the formspec
-
-#### `field[<X>,<Y>;<W>,<H>;<name>;<label>;<default>]`
-* Textual field; will be sent to server when a button is clicked
-* When enter is pressed in field, fields.key_enter_field will be sent with the name
-  of this field.
-* `x` and `y` position the field relative to the top left of the menu
-* `w` and `h` are the size of the field
-* Fields are a set height, but will be vertically centred on `h`
-* Position and size units are inventory slots
-* `name` is the name of the field as returned in fields to `on_receive_fields`
-* `label`, if not blank, will be text printed on the top left above the field
-* `default` is the default value of the field
-    * `default` may contain variable references such as `${text}'` which
-      will fill the value from the metadata value `text`
-    * **Note**: no extra text or more than a single variable is supported ATM.
-* See field_close_on_enter to stop enter closing the formspec
-
-#### `field[<name>;<label>;<default>]`
-* As above, but without position/size units
-* When enter is pressed in field, fields.key_enter_field will be sent with the name
-  of this field.
-* Special field for creating simple forms, such as sign text input
-* Must be used without a `size[]` element
-* A "Proceed" button will be added automatically
-* See field_close_on_enter to stop enter closing the formspec
-
-#### `field_close_on_enter[<name>;<close_on_enter>]`
-* <name> is the name of the field
-* if <close_on_enter> is false, pressing enter in the field will submit the form but not close it
-* defaults to true when not specified (ie: no tag for a field)
-
-#### `textarea[<X>,<Y>;<W>,<H>;<name>;<label>;<default>]`
-* Same as fields above, but with multi-line input
-
-#### `label[<X>,<Y>;<label>]`
-* `x` and `y` work as per field
-* `label` is the text on the label
-* Position and size units are inventory slots
-
-#### `vertlabel[<X>,<Y>;<label>]`
-* Textual label drawn vertically
-* `x` and `y` work as per field
-* `label` is the text on the label
-* Position and size units are inventory slots
-
-#### `button[<X>,<Y>;<W>,<H>;<name>;<label>]`
-* Clickable button. When clicked, fields will be sent.
-* `x`, `y` and `name` work as per field
-* `w` and `h` are the size of the button
-* Fixed button height. It will be vertically centred on `h`
-* `label` is the text on the button
-* Position and size units are inventory slots
-
-#### `image_button[<X>,<Y>;<W>,<H>;<texture name>;<name>;<label>]`
-* `x`, `y`, `w`, `h`, and `name` work as per button
-* `texture name` is the filename of an image
-* Position and size units are inventory slots
-
-#### `image_button[<X>,<Y>;<W>,<H>;<texture name>;<name>;<label>;<noclip>;<drawborder>;<pressed texture name>]`
-* `x`, `y`, `w`, `h`, and `name` work as per button
-* `texture name` is the filename of an image
-* Position and size units are inventory slots
-* `noclip=true` means the image button doesn't need to be within specified formsize
-* `drawborder`: draw button border or not
-* `pressed texture name` is the filename of an image on pressed state
-
-#### `item_image_button[<X>,<Y>;<W>,<H>;<item name>;<name>;<label>]`
-* `x`, `y`, `w`, `h`, `name` and `label` work as per button
-* `item name` is the registered name of an item/node,
-   tooltip will be made out of its description
-   to override it use tooltip element
-* Position and size units are inventory slots
-
-#### `button_exit[<X>,<Y>;<W>,<H>;<name>;<label>]`
-* When clicked, fields will be sent and the form will quit.
-
-#### `image_button_exit[<X>,<Y>;<W>,<H>;<texture name>;<name>;<label>]`
-* When clicked, fields will be sent and the form will quit.
-
-#### `textlist[<X>,<Y>;<W>,<H>;<name>;<listelem 1>,<listelem 2>,...,<listelem n>]`
-* Scrollable item list showing arbitrary text elements
-* `x` and `y` position the itemlist relative to the top left of the menu
-* `w` and `h` are the size of the itemlist
-* `name` fieldname sent to server on doubleclick value is current selected element
-* `listelements` can be prepended by #color in hexadecimal format RRGGBB (only),
-     * if you want a listelement to start with "#" write "##".
-
-#### `textlist[<X>,<Y>;<W>,<H>;<name>;<listelem 1>,<listelem 2>,...,<listelem n>;<selected idx>;<transparent>]`
-* Scrollable itemlist showing arbitrary text elements
-* `x` and `y` position the item list relative to the top left of the menu
-* `w` and `h` are the size of the item list
-* `name` fieldname sent to server on doubleclick value is current selected element
-* `listelements` can be prepended by #RRGGBB (only) in hexadecimal format
-     * if you want a listelement to start with "#" write "##"
-* Index to be selected within textlist
-* `true`/`false`: draw transparent background
-* See also `minetest.explode_textlist_event` (main menu: `engine.explode_textlist_event`)
-
-#### `tabheader[<X>,<Y>;<name>;<caption 1>,<caption 2>,...,<caption n>;<current_tab>;<transparent>;<draw_border>]`
-* Show a tab**header** at specific position (ignores formsize)
-* `x` and `y` position the itemlist relative to the top left of the menu
-* `name` fieldname data is transferred to Lua
-* `caption 1`...: name shown on top of tab
-* `current_tab`: index of selected tab 1...
-* `transparent` (optional): show transparent
-* `draw_border` (optional): draw border
-
-#### `box[<X>,<Y>;<W>,<H>;<color>]`
-* Simple colored semitransparent box
-* `x` and `y` position the box relative to the top left of the menu
-* `w` and `h` are the size of box
-* `color` is color specified as a `ColorString`
-
-#### `dropdown[<X>,<Y>;<W>;<name>;<item 1>,<item 2>, ...,<item n>;<selected idx>]`
-* Show a dropdown field
-* **Important note**: There are two different operation modes:
-     1. handle directly on change (only changed dropdown is submitted)
-     2. read the value on pressing a button (all dropdown values are available)
-* `x` and `y` position of dropdown
-* Width of dropdown
-* Fieldname data is transferred to Lua
-* Items to be shown in dropdown
-* Index of currently selected dropdown item
-
-#### `checkbox[<X>,<Y>;<name>;<label>;<selected>]`
-* Show a checkbox
-* `x` and `y`: position of checkbox
-* `name` fieldname data is transferred to Lua
-* `label` to be shown left of checkbox
-* `selected` (optional): `true`/`false`
-
-#### `scrollbar[<X>,<Y>;<W>,<H>;<orientation>;<name>;<value>]`
-* Show a scrollbar
-* There are two ways to use it:
-     1. handle the changed event (only changed scrollbar is available)
-     2. read the value on pressing a button (all scrollbars are available)
-* `x` and `y`: position of trackbar
-* `w` and `h`: width and height
-* `orientation`:  `vertical`/`horizontal`
-* Fieldname data is transferred to Lua
-* Value this trackbar is set to (`0`-`1000`)
-* See also `minetest.explode_scrollbar_event` (main menu: `engine.explode_scrollbar_event`)
-
-#### `table[<X>,<Y>;<W>,<H>;<name>;<cell 1>,<cell 2>,...,<cell n>;<selected idx>]`
-* Show scrollable table using options defined by the previous `tableoptions[]`
-* Displays cells as defined by the previous `tablecolumns[]`
-* `x` and `y`: position the itemlist relative to the top left of the menu
-* `w` and `h` are the size of the itemlist
-* `name`: fieldname sent to server on row select or doubleclick
-* `cell 1`...`cell n`: cell contents given in row-major order
-* `selected idx`: index of row to be selected within table (first row = `1`)
-* See also `minetest.explode_table_event` (main menu: `engine.explode_table_event`)
-
-#### `tableoptions[<opt 1>;<opt 2>;...]`
-* Sets options for `table[]`
-* `color=#RRGGBB`
-     * default text color (`ColorString`), defaults to `#FFFFFF`
-* `background=#RRGGBB`
-     * table background color (`ColorString`), defaults to `#000000`
-* `border=<true/false>`
-     * should the table be drawn with a border? (default: `true`)
-* `highlight=#RRGGBB`
-     * highlight background color (`ColorString`), defaults to `#466432`
-* `highlight_text=#RRGGBB`
-     * highlight text color (`ColorString`), defaults to `#FFFFFF`
-* `opendepth=<value>`
-     * all subtrees up to `depth < value` are open (default value = `0`)
-     * only useful when there is a column of type "tree"
-
-#### `tablecolumns[<type 1>,<opt 1a>,<opt 1b>,...;<type 2>,<opt 2a>,<opt 2b>;...]`
-* Sets columns for `table[]`
-* Types: `text`, `image`, `color`, `indent`, `tree`
-    * `text`:   show cell contents as text
-    * `image`:  cell contents are an image index, use column options to define images
-    * `color`:   cell contents are a ColorString and define color of following cell
-    * `indent`: cell contents are a number and define indentation of following cell
-    * `tree`:   same as indent, but user can open and close subtrees (treeview-like)
-* Column options:
-    * `align=<value>`
-        * for `text` and `image`: content alignment within cells.
-          Available values: `left` (default), `center`, `right`, `inline`
-    * `width=<value>`
-        * for `text` and `image`: minimum width in em (default: `0`)
-        * for `indent` and `tree`: indent width in em (default: `1.5`)
-    * `padding=<value>`: padding left of the column, in em (default `0.5`).
-      Exception: defaults to 0 for indent columns
-    * `tooltip=<value>`: tooltip text (default: empty)
-    * `image` column options:
-        * `0=<value>` sets image for image index 0
-        * `1=<value>` sets image for image index 1
-        * `2=<value>` sets image for image index 2
-        * and so on; defined indices need not be contiguous empty or
-          non-numeric cells are treated as `0`.
-    * `color` column options:
-        * `span=<value>`: number of following columns to affect (default: infinite)
-
-**Note**: do _not_ use a element name starting with `key_`; those names are reserved to
-pass key press events to formspec!
-
-Spatial Vectors
----------------
-* `vector.new(a[, b, c])`: returns a vector:
-    * A copy of `a` if `a` is a vector.
-    * `{x = a, y = b, z = c}`, if all `a, b, c` are defined
-* `vector.direction(p1, p2)`: returns a vector
-* `vector.distance(p1, p2)`: returns a number
-* `vector.length(v)`: returns a number
-* `vector.normalize(v)`: returns a vector
-* `vector.floor(v)`: returns a vector, each dimension rounded down
-* `vector.round(v)`: returns a vector, each dimension rounded to nearest int
-* `vector.apply(v, func)`: returns a vector
-* `vector.equals(v1, v2)`: returns a boolean
-
-For the following functions `x` can be either a vector or a number:
-
-* `vector.add(v, x)`: returns a vector
-* `vector.subtract(v, x)`: returns a vector
-* `vector.multiply(v, x)`: returns a scaled vector or Schur product
-* `vector.divide(v, x)`: returns a scaled vector or Schur quotient
-
-Helper functions
-----------------
-* `dump2(obj, name="_", dumped={})`
-     * Return object serialized as a string, handles reference loops
-* `dump(obj, dumped={})`
-    * Return object serialized as a string
-* `math.hypot(x, y)`
-    * Get the hypotenuse of a triangle with legs x and y.
-      Useful for distance calculation.
-* `math.sign(x, tolerance)`
-    * Get the sign of a number.
-      Optional: Also returns `0` when the absolute value is within the tolerance (default: `0`)
-* `string.split(str, separator=",", include_empty=false, max_splits=-1, sep_is_pattern=false)`
-    * If `max_splits` is negative, do not limit splits.
-    * `sep_is_pattern` specifies if separator is a plain string or a pattern (regex).
-    * e.g. `string:split("a,b", ",") == {"a","b"}`
-* `string:trim()`
-    * e.g. `string.trim("\n \t\tfoo bar\t ") == "foo bar"`
-* `minetest.wrap_text(str, limit)`: returns a string
-    * Adds new lines to the string to keep it within the specified character limit
-    * limit: Maximal amount of characters in one line
-* `minetest.pos_to_string({x=X,y=Y,z=Z}, decimal_places))`: returns string `"(X,Y,Z)"`
-    * Convert position to a printable string
-      Optional: 'decimal_places' will round the x, y and z of the pos to the given decimal place.
-* `minetest.string_to_pos(string)`: returns a position
-    * Same but in reverse. Returns `nil` if the string can't be parsed to a position.
-* `minetest.string_to_area("(X1, Y1, Z1) (X2, Y2, Z2)")`: returns two positions
-    * Converts a string representing an area box into two positions
-* `minetest.is_yes(arg)`
-    * returns whether `arg` can be interpreted as yes
-* `minetest.is_nan(arg)`
-    * returns true true when the passed number represents NaN.
-* `table.copy(table)`: returns a table
-    * returns a deep copy of `table`
-
-Minetest namespace reference
-------------------------------
-
-### Utilities
-
-* `minetest.get_current_modname()`: returns the currently loading mod's name, when we are loading a mod
-* `minetest.get_modpath(modname)`: returns virtual path of given mod including
-   the trailing separator. This is useful to load additional Lua files
-   contained in your mod:
-   e.g. `dofile(minetest.get_modpath(minetest.get_current_modname()) .. "stuff.lua")`
-* `minetest.get_language()`: returns two strings
-   * the current gettext locale
-   * the current language code (the same as used for client-side translations)
-* `minetest.get_version()`: returns a table containing components of the
-   engine version.  Components:
-    * `project`: Name of the project, eg, "Minetest"
-    * `string`: Simple version, eg, "1.2.3-dev"
-    * `hash`: Full git version (only set if available), eg, "1.2.3-dev-01234567-dirty"
-  Use this for informational purposes only. The information in the returned
-  table does not represent the capabilities of the engine, nor is it
-  reliable or verifiable. Compatible forks will have a different name and
-  version entirely. To check for the presence of engine features, test
-  whether the functions exported by the wanted features exist. For example:
-  `if minetest.check_for_falling then ... end`.
-* `minetest.sha1(data, [raw])`: returns the sha1 hash of data
-    * `data`: string of data to hash
-    * `raw`: return raw bytes instead of hex digits, default: false
-* `minetest.get_csm_restrictions()`: returns a table of `Flags` indicating the
-   restrictions applied to the current mod.
-   * If a flag in this table is set to true, the feature is RESTRICTED.
-   * Possible flags: `load_client_mods`, `chat_messages`, `read_itemdefs`,
-                   `read_nodedefs`, `lookup_nodes`, `read_playerinfo`
-
-### Logging
-* `minetest.debug(...)`
-    * Equivalent to `minetest.log(table.concat({...}, "\t"))`
-* `minetest.log([level,] text)`
-    * `level` is one of `"none"`, `"error"`, `"warning"`, `"action"`,
-      `"info"`, or `"verbose"`.  Default is `"none"`.
-
-### Global callback registration functions
-Call these functions only at load time!
-
-* `minetest.register_globalstep(function(dtime))`
-    * Called every client environment step, usually interval of 0.1s
-* `minetest.register_on_mods_loaded(function())`
-    * Called just after mods have finished loading.
-* `minetest.register_on_shutdown(function())`
-    * Called before client shutdown
-    * **Warning**: If the client terminates abnormally (i.e. crashes), the registered
-      callbacks **will likely not be run**. Data should be saved at
-      semi-frequent intervals as well as on server shutdown.
-* `minetest.register_on_receiving_chat_message(function(message))`
-    * Called always when a client receive a message
-    * Return `true` to mark the message as handled, which means that it will not be shown to chat
-* `minetest.register_on_sending_chat_message(function(message))`
-    * Called always when a client send a message from chat
-    * Return `true` to mark the message as handled, which means that it will not be sent to server
-* `minetest.register_chatcommand(cmd, chatcommand definition)`
-    * Adds definition to minetest.registered_chatcommands
-* `minetest.unregister_chatcommand(name)`
-    * Unregisters a chatcommands registered with register_chatcommand.
-* `minetest.register_on_death(function())`
-    * Called when the local player dies
-* `minetest.register_on_hp_modification(function(hp))`
-    * Called when server modified player's HP
-* `minetest.register_on_damage_taken(function(hp))`
-    * Called when the local player take damages
-* `minetest.register_on_formspec_input(function(formname, fields))`
-    * Called when a button is pressed in the local player's inventory form
-    * Newest functions are called first
-    * If function returns `true`, remaining functions are not called
-* `minetest.register_on_dignode(function(pos, node))`
-    * Called when the local player digs a node
-    * Newest functions are called first
-    * If any function returns true, the node isn't dug
-* `minetest.register_on_punchnode(function(pos, node))`
-    * Called when the local player punches a node
-    * Newest functions are called first
-    * If any function returns true, the punch is ignored
-* `minetest.register_on_placenode(function(pointed_thing, node))`
-    * Called when a node has been placed
-* `minetest.register_on_item_use(function(item, pointed_thing))`
-    * Called when the local player uses an item.
-    * Newest functions are called first.
-    * If any function returns true, the item use is not sent to server.
-* `minetest.register_on_modchannel_message(function(channel_name, sender, message))`
-    * Called when an incoming mod channel message is received
-    * You must have joined some channels before, and server must acknowledge the
-      join request.
-    * If message comes from a server mod, `sender` field is an empty string.
-* `minetest.register_on_modchannel_signal(function(channel_name, signal))`
-    * Called when a valid incoming mod channel signal is received
-    * Signal id permit to react to server mod channel events
-    * Possible values are:
-      0: join_ok
-      1: join_failed
-      2: leave_ok
-      3: leave_failed
-      4: event_on_not_joined_channel
-      5: state_changed
-* `minetest.register_on_inventory_open(function(inventory))`
-    * Called when the local player open inventory
-    * Newest functions are called first
-    * If any function returns true, inventory doesn't open
-### Sounds
-* `minetest.sound_play(spec, parameters)`: returns a handle
-    * `spec` is a `SimpleSoundSpec`
-    * `parameters` is a sound parameter table
-* `minetest.sound_stop(handle)`
-
-### Timing
-* `minetest.after(time, func, ...)`
-    * Call the function `func` after `time` seconds, may be fractional
-    * Optional: Variable number of arguments that are passed to `func`
-* `minetest.get_us_time()`
-    * Returns time with microsecond precision. May not return wall time.
-* `minetest.get_timeofday()`
-    * Returns the time of day: `0` for midnight, `0.5` for midday
-
-### Map
-* `minetest.get_node_or_nil(pos)`
-    * Returns the node at the given position as table in the format
-      `{name="node_name", param1=0, param2=0}`, returns `nil`
-      for unloaded areas or flavor limited areas.
-* `minetest.get_node_light(pos, timeofday)`
-    * Gets the light value at the given position. Note that the light value
-      "inside" the node at the given position is returned, so you usually want
-      to get the light value of a neighbor.
-    * `pos`: The position where to measure the light.
-    * `timeofday`: `nil` for current time, `0` for night, `0.5` for day
-    * Returns a number between `0` and `15` or `nil`
-* `minetest.find_node_near(pos, radius, nodenames, [search_center])`: returns pos or `nil`
-    * `radius`: using a maximum metric
-    * `nodenames`: e.g. `{"ignore", "group:tree"}` or `"default:dirt"`
-    * `search_center` is an optional boolean (default: `false`)
-      If true `pos` is also checked for the nodes
-* `minetest.find_nodes_in_area(pos1, pos2, nodenames)`: returns a list of
-  positions.
-    * `nodenames`: e.g. `{"ignore", "group:tree"}` or `"default:dirt"`
-    * First return value: Table with all node positions
-    * Second return value: Table with the count of each node with the node name
-      as index.
-    * Area volume is limited to 4,096,000 nodes
-* `minetest.find_nodes_in_area_under_air(pos1, pos2, nodenames)`: returns a
-  list of positions.
-    * `nodenames`: e.g. `{"ignore", "group:tree"}` or `"default:dirt"`
-    * Return value: Table with all node positions with a node air above
-    * Area volume is limited to 4,096,000 nodes
-* `minetest.line_of_sight(pos1, pos2)`: returns `boolean, pos`
-    * Checks if there is anything other than air between pos1 and pos2.
-    * Returns false if something is blocking the sight.
-    * Returns the position of the blocking node when `false`
-    * `pos1`: First position
-    * `pos2`: Second position
-* `minetest.raycast(pos1, pos2, objects, liquids)`: returns `Raycast`
-    * Creates a `Raycast` object.
-    * `pos1`: start of the ray
-    * `pos2`: end of the ray
-    * `objects`: if false, only nodes will be returned. Default is `true`.
-    * `liquids`: if false, liquid nodes won't be returned. Default is `false`.
-
-* `minetest.find_nodes_with_meta(pos1, pos2)`
-    * Get a table of positions of nodes that have metadata within a region
-      {pos1, pos2}.
-* `minetest.get_meta(pos)`
-    * Get a `NodeMetaRef` at that position
-* `minetest.get_node_level(pos)`
-    * get level of leveled node (water, snow)
-* `minetest.get_node_max_level(pos)`
-    * get max available level for leveled node
-
-### Player
-* `minetest.get_wielded_item()`
-    * Returns the itemstack the local player is holding
-* `minetest.send_chat_message(message)`
-    * Act as if `message` was typed by the player into the terminal.
-* `minetest.run_server_chatcommand(cmd, param)`
-    * Alias for `minetest.send_chat_message("/" .. cmd .. " " .. param)`
-* `minetest.clear_out_chat_queue()`
-    * Clears the out chat queue
-* `minetest.localplayer`
-    * Reference to the LocalPlayer object. See [`LocalPlayer`](#localplayer) class reference for methods.
-
-### Privileges
-* `minetest.get_privilege_list()`
-    * Returns a list of privileges the current player has in the format `{priv1=true,...}`
-* `minetest.string_to_privs(str)`: returns `{priv1=true,...}`
-* `minetest.privs_to_string(privs)`: returns `"priv1,priv2,..."`
-    * Convert between two privilege representations
-
-### Client Environment
-* `minetest.get_player_names()`
-    * Returns list of player names on server (nil if CSM_RF_READ_PLAYERINFO is enabled by server)
-* `minetest.disconnect()`
-    * Disconnect from the server and exit to main menu.
-    * Returns `false` if the client is already disconnecting otherwise returns `true`.
-* `minetest.get_server_info()`
-    * Returns [server info](#server-info).
-* `minetest.send_respawn()`
-    * Sends a respawn request to the server.
-
-### Storage API
-* `minetest.get_mod_storage()`:
-    * returns reference to mod private `StorageRef`
-    * must be called during mod load time
-
-### Mod channels
-![Mod channels communication scheme](docs/mod channels.png)
-
-* `minetest.mod_channel_join(channel_name)`
-    * Client joins channel `channel_name`, and creates it, if necessary. You
-      should listen from incoming messages with `minetest.register_on_modchannel_message`
-      call to receive incoming messages. Warning, this function is asynchronous.
-
-### Particles
-* `minetest.add_particle(particle definition)`
-
-* `minetest.add_particlespawner(particlespawner definition)`
-    * Add a `ParticleSpawner`, an object that spawns an amount of particles over `time` seconds
-    * Returns an `id`, and -1 if adding didn't succeed
-
-* `minetest.delete_particlespawner(id)`
-    * Delete `ParticleSpawner` with `id` (return value from `minetest.add_particlespawner`)
-
-### Misc.
-* `minetest.parse_json(string[, nullvalue])`: returns something
-    * Convert a string containing JSON data into the Lua equivalent
-    * `nullvalue`: returned in place of the JSON null; defaults to `nil`
-    * On success returns a table, a string, a number, a boolean or `nullvalue`
-    * On failure outputs an error message and returns `nil`
-    * Example: `parse_json("[10, {\"a\":false}]")`, returns `{10, {a = false}}`
-* `minetest.write_json(data[, styled])`: returns a string or `nil` and an error message
-    * Convert a Lua table into a JSON string
-    * styled: Outputs in a human-readable format if this is set, defaults to false
-    * Unserializable things like functions and userdata are saved as null.
-    * **Warning**: JSON is more strict than the Lua table format.
-        1. You can only use strings and positive integers of at least one as keys.
-        2. You can not mix string and integer keys.
-           This is due to the fact that JSON has two distinct array and object values.
-    * Example: `write_json({10, {a = false}})`, returns `"[10, {\"a\": false}]"`
-* `minetest.serialize(table)`: returns a string
-    * Convert a table containing tables, strings, numbers, booleans and `nil`s
-      into string form readable by `minetest.deserialize`
-    * Example: `serialize({foo='bar'})`, returns `'return { ["foo"] = "bar" }'`
-* `minetest.deserialize(string)`: returns a table
-    * Convert a string returned by `minetest.deserialize` into a table
-    * `string` is loaded in an empty sandbox environment.
-    * Will load functions, but they cannot access the global environment.
-    * Example: `deserialize('return { ["foo"] = "bar" }')`, returns `{foo='bar'}`
-    * Example: `deserialize('print("foo")')`, returns `nil` (function call fails)
-        * `error:[string "print("foo")"]:1: attempt to call global 'print' (a nil value)`
-* `minetest.compress(data, method, ...)`: returns `compressed_data`
-    * Compress a string of data.
-    * `method` is a string identifying the compression method to be used.
-    * Supported compression methods:
-    *     Deflate (zlib): `"deflate"`
-    * `...` indicates method-specific arguments.  Currently defined arguments are:
-    *     Deflate: `level` - Compression level, `0`-`9` or `nil`.
-* `minetest.decompress(compressed_data, method, ...)`: returns data
-    * Decompress a string of data (using ZLib).
-    * See documentation on `minetest.compress()` for supported compression methods.
-    * currently supported.
-    * `...` indicates method-specific arguments. Currently, no methods use this.
-* `minetest.rgba(red, green, blue[, alpha])`: returns a string
-    * Each argument is a 8 Bit unsigned integer
-    * Returns the ColorString from rgb or rgba values
-    * Example: `minetest.rgba(10, 20, 30, 40)`, returns `"#0A141E28"`
-* `minetest.encode_base64(string)`: returns string encoded in base64
-    * Encodes a string in base64.
-* `minetest.decode_base64(string)`: returns string
-    * Decodes a string encoded in base64.
-* `minetest.gettext(string)` : returns string
-    * look up the translation of a string in the gettext message catalog
-* `fgettext_ne(string, ...)`
-    * call minetest.gettext(string), replace "$1"..."$9" with the given
-      extra arguments and return the result
-* `fgettext(string, ...)` : returns string
-    * same as fgettext_ne(), but calls minetest.formspec_escape before returning result
-* `minetest.pointed_thing_to_face_pos(placer, pointed_thing)`: returns a position
-    * returns the exact position on the surface of a pointed node
-* `minetest.global_exists(name)`
-    * Checks if a global variable has been set, without triggering a warning.
-
-### UI
-* `minetest.ui.minimap`
-    * Reference to the minimap object. See [`Minimap`](#minimap) class reference for methods.
-    * If client disabled minimap (using enable_minimap setting) this reference will be nil.
-* `minetest.camera`
-    * Reference to the camera object. See [`Camera`](#camera) class reference for methods.
-* `minetest.show_formspec(formname, formspec)` : returns true on success
-       * Shows a formspec to the player
-* `minetest.display_chat_message(message)` returns true on success
-       * Shows a chat message to the current player.
-
-Class reference
----------------
-
-### ModChannel
-
-An interface to use mod channels on client and server
-
-#### Methods
-* `leave()`: leave the mod channel.
-    * Client leaves channel `channel_name`.
-    * No more incoming or outgoing messages can be sent to this channel from client mods.
-    * This invalidate all future object usage
-    * Ensure your set mod_channel to nil after that to free Lua resources
-* `is_writeable()`: returns true if channel is writable and mod can send over it.
-* `send_all(message)`: Send `message` though the mod channel.
-    * If mod channel is not writable or invalid, message will be dropped.
-    * Message size is limited to 65535 characters by protocol.
-
-### Minimap
-An interface to manipulate minimap on client UI
-
-#### Methods
-* `show()`: shows the minimap (if not disabled by server)
-* `hide()`: hides the minimap
-* `set_pos(pos)`: sets the minimap position on screen
-* `get_pos()`: returns the minimap current position
-* `set_angle(deg)`: sets the minimap angle in degrees
-* `get_angle()`: returns the current minimap angle in degrees
-* `set_mode(mode)`: sets the minimap mode (0 to 6)
-* `get_mode()`: returns the current minimap mode
-* `set_shape(shape)`: Sets the minimap shape. (0 = square, 1 = round)
-* `get_shape()`: Gets the minimap shape. (0 = square, 1 = round)
-
-### Camera
-An interface to get or set information about the camera and camera-node.
-Please do not try to access the reference until the camera is initialized, otherwise the reference will be nil.
-
-#### Methods
-* `set_camera_mode(mode)`
-    * Pass `0` for first-person, `1` for third person, and `2` for third person front
-* `get_camera_mode()`
-    * Returns 0, 1, or 2 as described above
-* `get_fov()`
-    * Returns:
-
-```lua
-     {
-         x = number,
-         y = number,
-         max = number,
-         actual = number
-     }
-```
-
-* `get_pos()`
-    * Returns position of camera with view bobbing
-* `get_offset()`
-    * Returns eye offset vector
-* `get_look_dir()`
-    * Returns eye direction unit vector
-* `get_look_vertical()`
-    * Returns pitch in radians
-* `get_look_horizontal()`
-    * Returns yaw in radians
-* `get_aspect_ratio()`
-    * Returns aspect ratio of screen
-
-### LocalPlayer
-An interface to retrieve information about the player.
-
-Methods:
-
-* `get_pos()`
-    * returns current player current position
-* `get_velocity()`
-    * returns player speed vector
-* `get_hp()`
-    * returns player HP
-* `get_name()`
-    * returns player name
-* `is_attached()`
-    * returns true if player is attached
-* `is_touching_ground()`
-    * returns true if player touching ground
-* `is_in_liquid()`
-    * returns true if player is in a liquid (This oscillates so that the player jumps a bit above the surface)
-* `is_in_liquid_stable()`
-    * returns true if player is in a stable liquid (This is more stable and defines the maximum speed of the player)
-* `get_liquid_viscosity()`
-    * returns liquid viscosity (Gets the viscosity of liquid to calculate friction)
-* `is_climbing()`
-    * returns true if player is climbing
-* `swimming_vertical()`
-    * returns true if player is swimming in vertical
-* `get_physics_override()`
-    * returns:
-
-```lua
-    {
-        speed = float,
-        jump = float,
-        gravity = float,
-        sneak = boolean,
-        sneak_glitch = boolean
-    }
-```
-
-* `get_override_pos()`
-    * returns override position
-* `get_last_pos()`
-    * returns last player position before the current client step
-* `get_last_velocity()`
-    * returns last player speed
-* `get_breath()`
-    * returns the player's breath
-* `get_movement_acceleration()`
-    * returns acceleration of the player in different environments:
-
-```lua
-    {
-       fast = float,
-       air = float,
-       default = float,
-    }
-```
-
-* `get_movement_speed()`
-    * returns player's speed in different environments:
-
-```lua
-    {
-       walk = float,
-       jump = float,
-       crouch = float,
-       fast = float,
-       climb = float,
-    }
-```
-
-* `get_movement()`
-    * returns player's movement in different environments:
-
-```lua
-    {
-       liquid_fluidity = float,
-       liquid_sink = float,
-       liquid_fluidity_smooth = float,
-       gravity = float,
-    }
-```
-
-* `get_last_look_horizontal()`:
-    * returns last look horizontal angle
-* `get_last_look_vertical()`:
-    * returns last look vertical angle
-* `get_key_pressed()`:
-    * returns last key typed by the player
-* `hud_add(definition)`
-    * add a HUD element described by HUD def, returns ID number on success and `nil` on failure.
-    * See [`HUD definition`](#hud-definition-hud_add-hud_get)
-* `hud_get(id)`
-    * returns the [`definition`](#hud-definition-hud_add-hud_get) of the HUD with that ID number or `nil`, if non-existent.
-* `hud_remove(id)`
-    * remove the HUD element of the specified id, returns `true` on success
-* `hud_change(id, stat, value)`
-    * change a value of a previously added HUD element
-    * element `stat` values: `position`, `name`, `scale`, `text`, `number`, `item`, `dir`
-    * Returns `true` on success, otherwise returns `nil`
-
-### Settings
-An interface to read config files in the format of `minetest.conf`.
-
-It can be created via `Settings(filename)`.
-
-#### Methods
-* `get(key)`: returns a value
-* `get_bool(key)`: returns a boolean
-* `set(key, value)`
-* `remove(key)`: returns a boolean (`true` for success)
-* `get_names()`: returns `{key1,...}`
-* `write()`: returns a boolean (`true` for success)
-    * write changes to file
-* `to_table()`: returns `{[key1]=value1,...}`
-
-### NodeMetaRef
-Node metadata: reference extra data and functionality stored in a node.
-Can be obtained via `minetest.get_meta(pos)`.
-
-#### Methods
-* `get_string(name)`
-* `get_int(name)`
-* `get_float(name)`
-* `to_table()`: returns `nil` or a table with keys:
-    * `fields`: key-value storage
-    * `inventory`: `{list1 = {}, ...}}`
-
-### `Raycast`
-
-A raycast on the map. It works with selection boxes.
-Can be used as an iterator in a for loop as:
-
-    local ray = Raycast(...)
-    for pointed_thing in ray do
-        ...
-    end
-
-The map is loaded as the ray advances. If the map is modified after the
-`Raycast` is created, the changes may or may not have an effect on the object.
-
-It can be created via `Raycast(pos1, pos2, objects, liquids)` or
-`minetest.raycast(pos1, pos2, objects, liquids)` where:
-
-* `pos1`: start of the ray
-* `pos2`: end of the ray
-* `objects`: if false, only nodes will be returned. Default is true.
-* `liquids`: if false, liquid nodes won't be returned. Default is false.
-
-#### Methods
-
-* `next()`: returns a `pointed_thing` with exact pointing location
-    * Returns the next thing pointed by the ray or nil.
-
------------------
-### Definitions
-* `minetest.get_node_def(nodename)`
-       * Returns [node definition](#node-definition) table of `nodename`
-* `minetest.get_item_def(itemstring)`
-       * Returns item definition table of `itemstring`
-
-#### Node Definition
-
-```lua
-       {
-               has_on_construct = bool,        -- Whether the node has the on_construct callback defined
-               has_on_destruct = bool,         -- Whether the node has the on_destruct callback defined
-               has_after_destruct = bool,      -- Whether the node has the after_destruct callback defined
-               name = string,                  -- The name of the node e.g. "air", "default:dirt"
-               groups = table,                 -- The groups of the node
-               paramtype = string,             -- Paramtype of the node
-               paramtype2 = string,            -- ParamType2 of the node
-               drawtype = string,              -- Drawtype of the node
-               mesh = <string>,                -- Mesh name if existant
-               minimap_color = <Color>,        -- Color of node on minimap *May not exist*
-               visual_scale = number,          -- Visual scale of node
-               alpha = number,                 -- Alpha of the node. Only used for liquids
-               color = <Color>,                -- Color of node *May not exist*
-               palette_name = <string>,        -- Filename of palette *May not exist*
-               palette = <{                    -- List of colors
-                       Color,
-                       Color
-               }>,
-               waving = number,                -- 0 of not waving, 1 if waving
-               connect_sides = number,         -- Used for connected nodes
-               connects_to = {                 -- List of nodes to connect to
-                       "node1",
-                       "node2"
-               },
-               post_effect_color = Color,      -- Color overlayed on the screen when the player is in the node
-               leveled = number,               -- Max level for node
-               sunlight_propogates = bool,     -- Whether light passes through the block
-               light_source = number,          -- Light emitted by the block
-               is_ground_content = bool,       -- Whether caves should cut through the node
-               walkable = bool,                -- Whether the player collides with the node
-               pointable = bool,               -- Whether the player can select the node
-               diggable = bool,                -- Whether the player can dig the node
-               climbable = bool,               -- Whether the player can climb up the node
-               buildable_to = bool,            -- Whether the player can replace the node by placing a node on it
-               rightclickable = bool,          -- Whether the player can place nodes pointing at this node
-               damage_per_second = number,     -- HP of damage per second when the player is in the node
-               liquid_type = <string>,         -- A string containing "none", "flowing", or "source" *May not exist*
-               liquid_alternative_flowing = <string>, -- Alternative node for liquid *May not exist*
-               liquid_alternative_source = <string>, -- Alternative node for liquid *May not exist*
-               liquid_viscosity = <number>,    -- How fast the liquid flows *May not exist*
-               liquid_renewable = <boolean>,   -- Whether the liquid makes an infinite source *May not exist*
-               liquid_range = <number>,        -- How far the liquid flows *May not exist*
-               drowning = bool,                -- Whether the player will drown in the node
-               floodable = bool,               -- Whether nodes will be replaced by liquids (flooded)
-               node_box = table,               -- Nodebox to draw the node with
-               collision_box = table,          -- Nodebox to set the collision area
-               selection_box = table,          -- Nodebox to set the area selected by the player
-               sounds = {                      -- Table of sounds that the block makes
-                       sound_footstep = SimpleSoundSpec,
-                       sound_dig = SimpleSoundSpec,
-                       sound_dug = SimpleSoundSpec
-               },
-               legacy_facedir_simple = bool,   -- Whether to use old facedir
-               legacy_wallmounted = bool       -- Whether to use old wallmounted
-       }
-```
-
-#### Item Definition
-
-```lua
-       {
-               name = string,                  -- Name of the item e.g. "default:stone"
-               description = string,           -- Description of the item e.g. "Stone"
-               type = string,                  -- Item type: "none", "node", "craftitem", "tool"
-               inventory_image = string,       -- Image in the inventory
-               wield_image = string,           -- Image in wieldmesh
-               palette_image = string,         -- Image for palette
-               color = Color,                  -- Color for item
-               wield_scale = Vector,           -- Wieldmesh scale
-               stack_max = number,             -- Number of items stackable together
-               usable = bool,                  -- Has on_use callback defined
-               liquids_pointable = bool,       -- Whether you can point at liquids with the item
-               tool_capabilities = <table>,    -- If the item is a tool, tool capabilities of the item
-               groups = table,                 -- Groups of the item
-               sound_place = SimpleSoundSpec,  -- Sound played when placed
-               sound_place_failed = SimpleSoundSpec, -- Sound played when placement failed
-               node_placement_prediction = string -- Node placed in client until server catches up
-       }
-```
------------------
-
-### Chat command definition (`register_chatcommand`)
-
-    {
-        params = "<name> <privilege>", -- Short parameter description
-        description = "Remove privilege from player", -- Full description
-        func = function(param),        -- Called when command is run.
-                                       -- Returns boolean success and text output.
-    }
-### Server info
-```lua
-{
-       address = "minetest.example.org", -- The domain name/IP address of a remote server or "" for a local server.
-       ip = "203.0.113.156",             -- The IP address of the server.
-       port = 30000,                     -- The port the client is connected to.
-       protocol_version = 30             -- Will not be accurate at start up as the client might not be connected to the server yet, in that case it will be 0.
-}
-```
-
-### HUD Definition (`hud_add`, `hud_get`)
-```lua
-    {
-        hud_elem_type = "image", -- see HUD element types, default "text"
-    --  ^ type of HUD element, can be either of "image", "text", "statbar", or "inventory"
-        position = {x=0.5, y=0.5},
-    --  ^ Left corner position of element, default `{x=0,y=0}`.
-        name = "<name>",    -- default ""
-        scale = {x=2, y=2}, -- default {x=0,y=0}
-        text = "<text>",    -- default ""
-        number = 2,         -- default 0
-        item = 3,           -- default 0
-    --  ^ Selected item in inventory.  0 for no item selected.
-        direction = 0,      -- default 0
-    --  ^ Direction: 0: left-right, 1: right-left, 2: top-bottom, 3: bottom-top
-        alignment = {x=0, y=0},   -- default {x=0, y=0}
-    --  ^ See "HUD Element Types"
-        offset = {x=0, y=0},      -- default {x=0, y=0}
-    --  ^ See "HUD Element Types"
-        size = { x=100, y=100 },  -- default {x=0, y=0}
-    --  ^ Size of element in pixels
-    }
-```
-
-Escape sequences
-----------------
-Most text can contain escape sequences, that can for example color the text.
-There are a few exceptions: tab headers, dropdowns and vertical labels can't.
-The following functions provide escape sequences:
-* `minetest.get_color_escape_sequence(color)`:
-    * `color` is a [ColorString](#colorstring)
-    * The escape sequence sets the text color to `color`
-* `minetest.colorize(color, message)`:
-    * Equivalent to:
-      `minetest.get_color_escape_sequence(color) ..
-       message ..
-       minetest.get_color_escape_sequence("#ffffff")`
-* `minetest.get_background_escape_sequence(color)`
-    * `color` is a [ColorString](#colorstring)
-    * The escape sequence sets the background of the whole text element to
-      `color`. Only defined for item descriptions and tooltips.
-* `minetest.strip_foreground_colors(str)`
-    * Removes foreground colors added by `get_color_escape_sequence`.
-* `minetest.strip_background_colors(str)`
-    * Removes background colors added by `get_background_escape_sequence`.
-* `minetest.strip_colors(str)`
-    * Removes all color escape sequences.
-
-`ColorString`
--------------
-`#RGB` defines a color in hexadecimal format.
-
-`#RGBA` defines a color in hexadecimal format and alpha channel.
-
-`#RRGGBB` defines a color in hexadecimal format.
-
-`#RRGGBBAA` defines a color in hexadecimal format and alpha channel.
-
-Named colors are also supported and are equivalent to
-[CSS Color Module Level 4](http://dev.w3.org/csswg/css-color/#named-colors).
-To specify the value of the alpha channel, append `#AA` to the end of the color name
-(e.g. `colorname#08`). For named colors the hexadecimal string representing the alpha
-value must (always) be two hexadecimal digits.
-
-`Color`
--------------
-`{a = alpha, r = red, g = green, b = blue}` defines an ARGB8 color.
-
-HUD element types
------------------
-The position field is used for all element types.
-
-To account for differing resolutions, the position coordinates are the percentage
-of the screen, ranging in value from `0` to `1`.
-
-The name field is not yet used, but should contain a description of what the
-HUD element represents. The direction field is the direction in which something
-is drawn.
-
-`0` draws from left to right, `1` draws from right to left, `2` draws from
-top to bottom, and `3` draws from bottom to top.
-
-The `alignment` field specifies how the item will be aligned. It ranges from `-1` to `1`,
-with `0` being the center, `-1` is moved to the left/up, and `1` is to the right/down.
-Fractional values can be used.
-
-The `offset` field specifies a pixel offset from the position. Contrary to position,
-the offset is not scaled to screen size. This allows for some precisely-positioned
-items in the HUD.
-
-**Note**: `offset` _will_ adapt to screen DPI as well as user defined scaling factor!
-
-Below are the specific uses for fields in each type; fields not listed for that type are ignored.
-
-**Note**: Future revisions to the HUD API may be incompatible; the HUD API is still
-in the experimental stages.
-
-### `image`
-Displays an image on the HUD.
-
-* `scale`: The scale of the image, with 1 being the original texture size.
-  Only the X coordinate scale is used (positive values).
-  Negative values represent that percentage of the screen it
-  should take; e.g. `x=-100` means 100% (width).
-* `text`: The name of the texture that is displayed.
-* `alignment`: The alignment of the image.
-* `offset`: offset in pixels from position.
-
-### `text`
-Displays text on the HUD.
-
-* `scale`: Defines the bounding rectangle of the text.
-  A value such as `{x=100, y=100}` should work.
-* `text`: The text to be displayed in the HUD element.
-* `number`: An integer containing the RGB value of the color used to draw the text.
-  Specify `0xFFFFFF` for white text, `0xFF0000` for red, and so on.
-* `alignment`: The alignment of the text.
-* `offset`: offset in pixels from position.
-
-### `statbar`
-Displays a horizontal bar made up of half-images.
-
-* `text`: The name of the texture that is used.
-* `number`: The number of half-textures that are displayed.
-  If odd, will end with a vertically center-split texture.
-* `direction`
-* `offset`: offset in pixels from position.
-* `size`: If used, will force full-image size to this value (override texture pack image size)
-
-### `inventory`
-* `text`: The name of the inventory list to be displayed.
-* `number`: Number of items in the inventory to be displayed.
-* `item`: Position of item that is selected.
-* `direction`
-* `offset`: offset in pixels from position.
-
-### `waypoint`
-Displays distance to selected world position.
-
-* `name`: The name of the waypoint.
-* `text`: Distance suffix. Can be blank.
-* `number:` An integer containing the RGB value of the color used to draw the text.
-* `world_pos`: World position of the waypoint.
-
-### Particle definition (`add_particle`)
-
-    {
-        pos = {x=0, y=0, z=0},
-        velocity = {x=0, y=0, z=0},
-        acceleration = {x=0, y=0, z=0},
-    --  ^ Spawn particle at pos with velocity and acceleration
-        expirationtime = 1,
-    --  ^ Disappears after expirationtime seconds
-        size = 1,
-        collisiondetection = false,
-    --  ^ collisiondetection: if true collides with physical objects
-        collision_removal = false,
-    --  ^ collision_removal: if true then particle is removed when it collides,
-    --  ^ requires collisiondetection = true to have any effect
-        vertical = false,
-    --  ^ vertical: if true faces player using y axis only
-        texture = "image.png",
-    --  ^ Uses texture (string)
-        animation = {Tile Animation definition},
-    --  ^ optional, specifies how to animate the particle texture
-        glow = 0
-    --  ^ optional, specify particle self-luminescence in darkness
-    }
-
-### `ParticleSpawner` definition (`add_particlespawner`)
-
-    {
-        amount = 1,
-        time = 1,
-    --  ^ If time is 0 has infinite lifespan and spawns the amount on a per-second base
-        minpos = {x=0, y=0, z=0},
-        maxpos = {x=0, y=0, z=0},
-        minvel = {x=0, y=0, z=0},
-        maxvel = {x=0, y=0, z=0},
-        minacc = {x=0, y=0, z=0},
-        maxacc = {x=0, y=0, z=0},
-        minexptime = 1,
-        maxexptime = 1,
-        minsize = 1,
-        maxsize = 1,
-    --  ^ The particle's properties are random values in between the bounds:
-    --  ^ minpos/maxpos, minvel/maxvel (velocity), minacc/maxacc (acceleration),
-    --  ^ minsize/maxsize, minexptime/maxexptime (expirationtime)
-        collisiondetection = false,
-    --  ^ collisiondetection: if true uses collision detection
-        collision_removal = false,
-    --  ^ collision_removal: if true then particle is removed when it collides,
-    --  ^ requires collisiondetection = true to have any effect
-        vertical = false,
-    --  ^ vertical: if true faces player using y axis only
-        texture = "image.png",
-    --  ^ Uses texture (string)
-    }
diff --git a/doc/fst_api.md b/doc/fst_api.md
new file mode 100644 (file)
index 0000000..c8bcb1e
--- /dev/null
@@ -0,0 +1,171 @@
+Formspec toolkit api 0.0.3
+==========================
+
+Formspec toolkit is a set of functions to create basic ui elements.
+
+
+File: fst/ui.lua
+----------------
+
+ui.lua adds base ui interface to add additional components to.
+
+ui.add(component) -> returns name of added component
+^ add component to ui
+^ component: component to add
+
+ui.delete(component) -> true/false if a component was deleted or not
+^ remove a component from ui
+^ component: component to delete
+
+ui.set_default(name)
+^ set component to show if not a single component is set visible
+^ name: name of component to set as default
+
+ui.find_by_name(name) --> returns component or nil
+^ find a component within ui
+^ name: name of component to look for
+
+File: fst/tabview.lua
+---------------------
+
+tabview_create(name, size, tabheaderpos) --> returns tabview component
+^ create a new tabview component
+^ name: name of tabview (has to be unique per ui)
+^ size: size of tabview
+       {
+               x,
+               y
+       }
+^ tabheaderpos: upper left position of tabheader (relative to upper left fs corner)
+       {
+               x,
+               y
+       }
+
+Class reference tabview:
+
+methods:
+- add_tab(tab)
+  ^ add a tab to this tabview
+  ^ tab:
+  {
+       name               = "tabname",      -- name of tab to create
+       caption            = "tab caption",  -- text to show for tab header
+       cbf_button_handler = function(tabview, fields, tabname, tabdata), -- callback for button events
+       --TODO cbf_events         = function(tabview, event, tabname),           -- callback for events
+       cbf_formspec       = function(tabview, name, tabdata),            -- get formspec
+       tabsize            =
+               {
+                       x, -- x width
+                       y  -- y height
+               },                                                            -- special size for this tab (only relevant if no parent for tabview set)
+       on_change          = function(type,old_tab,new_tab)               -- called on tab chang, type is "ENTER" or "LEAVE"
+  }
+- set_autosave_tab(value)
+  ^ tell tabview to automatically save current tabname as "tabview_name"_LAST
+  ^ value: true/false
+- set_tab(name)
+  ^ set's tab to tab named "name", returns true/false on success
+  ^ name: name of tab to set
+- set_global_event_handler(handler)
+  ^ set a handler to be called prior calling tab specific event handler
+  ^ handler: function(tabview,event) --> returns true to finish event processing false to continue
+- set_global_button_handler(handler)
+  ^ set a handler to be called prior calling tab specific button handler
+  ^ handler: function(tabview,fields) --> returns true to finish button processing false to continue
+- set_parent(parent)
+  ^ set parent to attach tabview to. TV's with parent are hidden if their parent
+       is hidden and they don't set their specified size.
+  ^ parent: component to attach to
+- show()
+  ^ show tabview
+- hide()
+  ^ hide tabview
+- delete()
+  ^ delete tabview
+- set_fixed_size(state)
+  ^ true/false set to fixed size, variable size
+
+File: fst/dialog.lua
+---------------------
+Only one dialog can be shown at a time. If a dialog is closed it's parent is
+gonna be activated and shown again.
+
+dialog_create(name, cbf_formspec, cbf_button_handler, cbf_events)
+^ create a dialog component
+^ name: name of component (unique per ui)
+^ cbf_formspec: function to be called to get formspec
+       function(dialogdata)
+^ cbf_button_handler: function to handle buttons
+       function(dialog, fields)
+^ cbf_events: function to handle events
+       function(dialog, event)
+
+Class reference dialog:
+
+methods:
+- set_parent(parent)
+  ^ set parent to attach a dialog to
+  ^ parent: component to attach to
+- show()
+  ^ show dialog
+- hide()
+  ^ hide dialog
+- delete()
+  ^ delete dialog from ui
+  
+members:
+- data
+  ^ variable data attached to this dialog
+- parent
+  ^ parent component to return to on exit
+  
+File: fst/buttonbar.lua
+-----------------------
+
+buttonbar_create(name, cbf_buttonhandler, pos, orientation, size)
+^ create a buttonbar
+^ name: name of component (unique per ui)
+^ cbf_buttonhandler: function to be called on button pressed
+       function(buttonbar,buttonname,buttondata)
+^ pos: position relative to upper left of current shown formspec
+       {
+               x,
+               y
+       }
+^ orientation: "vertical" or "horizontal"
+^ size: size of bar
+       {
+               width,
+               height
+       }
+
+Class reference buttonbar:
+
+methods:
+- add_button(btn_id, caption, button_image)
+- set_parent(parent)
+  ^ set parent to attach a buttonbar to
+  ^ parent: component to attach to
+- show()
+  ^ show buttonbar
+- hide()
+  ^ hide buttonbar
+- delete()
+  ^ delete buttonbar from ui
+
+Developer doc:
+==============
+Skeleton for any component:
+{
+       name           = "some id",               -- unique id
+       type           = "toplevel",              -- type of component
+                                                 -- toplevel: component can be show without additional components
+                                                 -- addon:    component is an addon to be shown along toplevel component
+       hide           = function(this) end,      -- called to hide the component
+       show           = function(this) end,      -- called to show the component
+       delete         = function(this) end,      -- called to delete component from ui
+       handle_buttons = function(this,fields)    -- called upon button press
+       handle_events  = function(this,event)     -- called upon event reception
+       get_formspec   = function(this)           -- has to return formspec to be displayed
+}
diff --git a/doc/fst_api.txt b/doc/fst_api.txt
deleted file mode 100644 (file)
index c8bcb1e..0000000
+++ /dev/null
@@ -1,171 +0,0 @@
-Formspec toolkit api 0.0.3
-==========================
-
-Formspec toolkit is a set of functions to create basic ui elements.
-
-
-File: fst/ui.lua
-----------------
-
-ui.lua adds base ui interface to add additional components to.
-
-ui.add(component) -> returns name of added component
-^ add component to ui
-^ component: component to add
-
-ui.delete(component) -> true/false if a component was deleted or not
-^ remove a component from ui
-^ component: component to delete
-
-ui.set_default(name)
-^ set component to show if not a single component is set visible
-^ name: name of component to set as default
-
-ui.find_by_name(name) --> returns component or nil
-^ find a component within ui
-^ name: name of component to look for
-
-File: fst/tabview.lua
----------------------
-
-tabview_create(name, size, tabheaderpos) --> returns tabview component
-^ create a new tabview component
-^ name: name of tabview (has to be unique per ui)
-^ size: size of tabview
-       {
-               x,
-               y
-       }
-^ tabheaderpos: upper left position of tabheader (relative to upper left fs corner)
-       {
-               x,
-               y
-       }
-
-Class reference tabview:
-
-methods:
-- add_tab(tab)
-  ^ add a tab to this tabview
-  ^ tab:
-  {
-       name               = "tabname",      -- name of tab to create
-       caption            = "tab caption",  -- text to show for tab header
-       cbf_button_handler = function(tabview, fields, tabname, tabdata), -- callback for button events
-       --TODO cbf_events         = function(tabview, event, tabname),           -- callback for events
-       cbf_formspec       = function(tabview, name, tabdata),            -- get formspec
-       tabsize            =
-               {
-                       x, -- x width
-                       y  -- y height
-               },                                                            -- special size for this tab (only relevant if no parent for tabview set)
-       on_change          = function(type,old_tab,new_tab)               -- called on tab chang, type is "ENTER" or "LEAVE"
-  }
-- set_autosave_tab(value)
-  ^ tell tabview to automatically save current tabname as "tabview_name"_LAST
-  ^ value: true/false
-- set_tab(name)
-  ^ set's tab to tab named "name", returns true/false on success
-  ^ name: name of tab to set
-- set_global_event_handler(handler)
-  ^ set a handler to be called prior calling tab specific event handler
-  ^ handler: function(tabview,event) --> returns true to finish event processing false to continue
-- set_global_button_handler(handler)
-  ^ set a handler to be called prior calling tab specific button handler
-  ^ handler: function(tabview,fields) --> returns true to finish button processing false to continue
-- set_parent(parent)
-  ^ set parent to attach tabview to. TV's with parent are hidden if their parent
-       is hidden and they don't set their specified size.
-  ^ parent: component to attach to
-- show()
-  ^ show tabview
-- hide()
-  ^ hide tabview
-- delete()
-  ^ delete tabview
-- set_fixed_size(state)
-  ^ true/false set to fixed size, variable size
-
-File: fst/dialog.lua
----------------------
-Only one dialog can be shown at a time. If a dialog is closed it's parent is
-gonna be activated and shown again.
-
-dialog_create(name, cbf_formspec, cbf_button_handler, cbf_events)
-^ create a dialog component
-^ name: name of component (unique per ui)
-^ cbf_formspec: function to be called to get formspec
-       function(dialogdata)
-^ cbf_button_handler: function to handle buttons
-       function(dialog, fields)
-^ cbf_events: function to handle events
-       function(dialog, event)
-
-Class reference dialog:
-
-methods:
-- set_parent(parent)
-  ^ set parent to attach a dialog to
-  ^ parent: component to attach to
-- show()
-  ^ show dialog
-- hide()
-  ^ hide dialog
-- delete()
-  ^ delete dialog from ui
-  
-members:
-- data
-  ^ variable data attached to this dialog
-- parent
-  ^ parent component to return to on exit
-  
-File: fst/buttonbar.lua
------------------------
-
-buttonbar_create(name, cbf_buttonhandler, pos, orientation, size)
-^ create a buttonbar
-^ name: name of component (unique per ui)
-^ cbf_buttonhandler: function to be called on button pressed
-       function(buttonbar,buttonname,buttondata)
-^ pos: position relative to upper left of current shown formspec
-       {
-               x,
-               y
-       }
-^ orientation: "vertical" or "horizontal"
-^ size: size of bar
-       {
-               width,
-               height
-       }
-
-Class reference buttonbar:
-
-methods:
-- add_button(btn_id, caption, button_image)
-- set_parent(parent)
-  ^ set parent to attach a buttonbar to
-  ^ parent: component to attach to
-- show()
-  ^ show buttonbar
-- hide()
-  ^ hide buttonbar
-- delete()
-  ^ delete buttonbar from ui
-
-Developer doc:
-==============
-Skeleton for any component:
-{
-       name           = "some id",               -- unique id
-       type           = "toplevel",              -- type of component
-                                                 -- toplevel: component can be show without additional components
-                                                 -- addon:    component is an addon to be shown along toplevel component
-       hide           = function(this) end,      -- called to hide the component
-       show           = function(this) end,      -- called to show the component
-       delete         = function(this) end,      -- called to delete component from ui
-       handle_buttons = function(this,fields)    -- called upon button press
-       handle_events  = function(this,event)     -- called upon event reception
-       get_formspec   = function(this)           -- has to return formspec to be displayed
-}
diff --git a/doc/lua_api.md b/doc/lua_api.md
new file mode 100644 (file)
index 0000000..86e8d65
--- /dev/null
@@ -0,0 +1,7828 @@
+Minetest Lua Modding API Reference
+==================================
+
+* More information at <http://www.minetest.net/>
+* Developer Wiki: <http://dev.minetest.net/>
+* (Unofficial) Minetest Modding Book by rubenwardy: <https://rubenwardy.com/minetest_modding_book/>
+
+Introduction
+------------
+
+Content and functionality can be added to Minetest using Lua scripting
+in run-time loaded mods.
+
+A mod is a self-contained bunch of scripts, textures and other related
+things, which is loaded by and interfaces with Minetest.
+
+Mods are contained and ran solely on the server side. Definitions and media
+files are automatically transferred to the client.
+
+If you see a deficiency in the API, feel free to attempt to add the
+functionality in the engine and API, and to document it here.
+
+Programming in Lua
+------------------
+
+If you have any difficulty in understanding this, please read
+[Programming in Lua](http://www.lua.org/pil/).
+
+Startup
+-------
+
+Mods are loaded during server startup from the mod load paths by running
+the `init.lua` scripts in a shared environment.
+
+Paths
+-----
+
+* `RUN_IN_PLACE=1` (Windows release, local build)
+    * `$path_user`: `<build directory>`
+    * `$path_share`: `<build directory>`
+* `RUN_IN_PLACE=0`: (Linux release)
+    * `$path_share`:
+        * Linux: `/usr/share/minetest`
+        * Windows: `<install directory>/minetest-0.4.x`
+    * `$path_user`:
+        * Linux: `$HOME/.minetest`
+        * Windows: `C:/users/<user>/AppData/minetest` (maybe)
+
+
+
+
+Games
+=====
+
+Games are looked up from:
+
+* `$path_share/games/<gameid>/`
+* `$path_user/games/<gameid>/`
+
+Where `<gameid>` is unique to each game.
+
+The game directory can contain the following files:
+
+* `game.conf`, with the following keys:
+    * `name`: Required, human readable name  e.g. `name = Minetest`
+    * `description`: Short description to be shown in the content tab
+    * `disallowed_mapgens = <comma-separated mapgens>`
+      e.g. `disallowed_mapgens = v5,v6,flat`
+      These mapgens are removed from the list of mapgens for the game.
+* `minetest.conf`:
+  Used to set default settings when running this game.
+* `settingtypes.txt`:
+  In the same format as the one in builtin.
+  This settingtypes.txt will be parsed by the menu and the settings will be
+  displayed in the "Games" category in the advanced settings tab.
+* If the game contains a folder called `textures` the server will load it as a
+  texturepack, overriding mod textures.
+  Any server texturepack will override mod textures and the game texturepack.
+
+Menu images
+-----------
+
+Games can provide custom main menu images. They are put inside a `menu`
+directory inside the game directory.
+
+The images are named `$identifier.png`, where `$identifier` is one of
+`overlay`, `background`, `footer`, `header`.
+If you want to specify multiple images for one identifier, add additional
+images named like `$identifier.$n.png`, with an ascending number $n starting
+with 1, and a random image will be chosen from the provided ones.
+
+
+
+
+Mods
+====
+
+Mod load path
+-------------
+
+Paths are relative to the directories listed in the [Paths] section above.
+
+* `games/<gameid>/mods/`
+* `mods/`
+* `worlds/<worldname>/worldmods/`
+
+World-specific games
+--------------------
+
+It is possible to include a game in a world; in this case, no mods or
+games are loaded or checked from anywhere else.
+
+This is useful for e.g. adventure worlds and happens if the `<worldname>/game/`
+directory exists.
+
+Mods should then be placed in `<worldname>/game/mods/`.
+
+Modpacks
+--------
+
+Mods can be put in a subdirectory, if the parent directory, which otherwise
+should be a mod, contains a file named `modpack.conf`.
+The file is a key-value store of modpack details.
+
+* `name`: The modpack name.
+* `description`: Description of mod to be shown in the Mods tab of the main
+                 menu.
+
+Note: to support 0.4.x, please also create an empty modpack.txt file.
+
+Mod directory structure
+-----------------------
+
+    mods
+    ├── modname
+    │   ├── mod.conf
+    │   ├── screenshot.png
+    │   ├── settingtypes.txt
+    │   ├── init.lua
+    │   ├── models
+    │   ├── textures
+    │   │   ├── modname_stuff.png
+    │   │   └── modname_something_else.png
+    │   ├── sounds
+    │   ├── media
+    │   ├── locale
+    │   └── <custom data>
+    └── another
+
+### modname
+
+The location of this directory can be fetched by using
+`minetest.get_modpath(modname)`.
+
+### mod.conf
+
+A `Settings` file that provides meta information about the mod.
+
+* `name`: The mod name. Allows Minetest to determine the mod name even if the
+          folder is wrongly named.
+* `description`: Description of mod to be shown in the Mods tab of the main
+                 menu.
+* `depends`: A comma separated list of dependencies. These are mods that must be
+             loaded before this mod.
+* `optional_depends`: A comma separated list of optional dependencies.
+                      Like a dependency, but no error if the mod doesn't exist.
+
+Note: to support 0.4.x, please also provide depends.txt.
+
+### `screenshot.png`
+
+A screenshot shown in the mod manager within the main menu. It should
+have an aspect ratio of 3:2 and a minimum size of 300×200 pixels.
+
+### `depends.txt`
+
+**Deprecated:** you should use mod.conf instead.
+
+This file is used if there are no dependencies in mod.conf.
+
+List of mods that have to be loaded before loading this mod.
+
+A single line contains a single modname.
+
+Optional dependencies can be defined by appending a question mark
+to a single modname. This means that if the specified mod
+is missing, it does not prevent this mod from being loaded.
+
+### `description.txt`
+
+**Deprecated:** you should use mod.conf instead.
+
+This file is used if there is no description in mod.conf.
+
+A file containing a description to be shown in the Mods tab of the main menu.
+
+### `settingtypes.txt`
+
+The format is documented in `builtin/settingtypes.txt`.
+It is parsed by the main menu settings dialogue to list mod-specific
+settings in the "Mods" category.
+
+### `init.lua`
+
+The main Lua script. Running this script should register everything it
+wants to register. Subsequent execution depends on minetest calling the
+registered callbacks.
+
+`minetest.settings` can be used to read custom or existing settings at load
+time, if necessary. (See [`Settings`])
+
+### `models`
+
+Models for entities or meshnodes.
+
+### `textures`, `sounds`, `media`
+
+Media files (textures, sounds, whatever) that will be transferred to the
+client and will be available for use by the mod.
+
+### `locale`
+
+Translation files for the clients. (See [Translations])
+
+Naming conventions
+------------------
+
+Registered names should generally be in this format:
+
+    modname:<whatever>
+
+`<whatever>` can have these characters:
+
+    a-zA-Z0-9_
+
+This is to prevent conflicting names from corrupting maps and is
+enforced by the mod loader.
+
+Registered names can be overridden by prefixing the name with `:`. This can
+be used for overriding the registrations of some other mod.
+
+The `:` prefix can also be used for maintaining backwards compatibility.
+
+### Example
+
+In the mod `experimental`, there is the ideal item/node/entity name `tnt`.
+So the name should be `experimental:tnt`.
+
+Any mod can redefine `experimental:tnt` by using the name
+
+    :experimental:tnt
+
+when registering it. That mod is required to have `experimental` as a
+dependency.
+
+
+
+
+Aliases
+=======
+
+Aliases of itemnames can be added by using
+`minetest.register_alias(alias, original_name)` or
+`minetest.register_alias_force(alias, original_name)`.
+
+This adds an alias `alias` for the item called `original_name`.
+From now on, you can use `alias` to refer to the item `original_name`.
+
+The only difference between `minetest.register_alias` and
+`minetest.register_alias_force` is that if an item named `alias` already exists,
+`minetest.register_alias` will do nothing while
+`minetest.register_alias_force` will unregister it.
+
+This can be used for maintaining backwards compatibility.
+
+This can also set quick access names for things, e.g. if
+you have an item called `epiclylongmodname:stuff`, you could do
+
+    minetest.register_alias("stuff", "epiclylongmodname:stuff")
+
+and be able to use `/giveme stuff`.
+
+Mapgen aliases
+--------------
+
+In a game, a certain number of these must be set to tell core mapgens which
+of the game's nodes are to be used for core mapgen generation. For example:
+
+    minetest.register_alias("mapgen_stone", "default:stone")
+
+### Aliases for non-V6 mapgens
+
+#### Essential aliases
+
+* mapgen_stone
+* mapgen_water_source
+* mapgen_river_water_source
+
+`mapgen_river_water_source` is required for mapgens with sloping rivers where
+it is necessary to have a river liquid node with a short `liquid_range` and
+`liquid_renewable = false` to avoid flooding.
+
+#### Optional aliases
+
+* mapgen_lava_source
+
+Fallback lava node used if cave liquids are not defined in biome definitions.
+Deprecated for non-V6 mapgens, define cave liquids in biome definitions instead.
+
+* mapgen_cobble
+
+Fallback node used if dungeon nodes are not defined in biome definitions.
+Deprecated for non-V6 mapgens, define dungeon nodes in biome definitions instead.
+
+### Aliases needed for Mapgen V6
+
+* mapgen_stone
+* mapgen_water_source
+* mapgen_lava_source
+* mapgen_dirt
+* mapgen_dirt_with_grass
+* mapgen_sand
+* mapgen_gravel
+* mapgen_desert_stone
+* mapgen_desert_sand
+* mapgen_dirt_with_snow
+* mapgen_snowblock
+* mapgen_snow
+* mapgen_ice
+
+* mapgen_tree
+* mapgen_leaves
+* mapgen_apple
+* mapgen_jungletree
+* mapgen_jungleleaves
+* mapgen_junglegrass
+* mapgen_pine_tree
+* mapgen_pine_needles
+
+* mapgen_cobble
+* mapgen_stair_cobble
+* mapgen_mossycobble
+* mapgen_stair_desert_stone
+
+### Setting the node used in Mapgen Singlenode
+
+By default the world is filled with air nodes. To set a different node use, for
+example:
+
+    minetest.register_alias("mapgen_singlenode", "default:stone")
+
+
+
+
+Textures
+========
+
+Mods should generally prefix their textures with `modname_`, e.g. given
+the mod name `foomod`, a texture could be called:
+
+    foomod_foothing.png
+
+Textures are referred to by their complete name, or alternatively by
+stripping out the file extension:
+
+* e.g. `foomod_foothing.png`
+* e.g. `foomod_foothing`
+
+Texture modifiers
+-----------------
+
+There are various texture modifiers that can be used
+to generate textures on-the-fly.
+
+### Texture overlaying
+
+Textures can be overlaid by putting a `^` between them.
+
+Example:
+
+    default_dirt.png^default_grass_side.png
+
+`default_grass_side.png` is overlaid over `default_dirt.png`.
+The texture with the lower resolution will be automatically upscaled to
+the higher resolution texture.
+
+### Texture grouping
+
+Textures can be grouped together by enclosing them in `(` and `)`.
+
+Example: `cobble.png^(thing1.png^thing2.png)`
+
+A texture for `thing1.png^thing2.png` is created and the resulting
+texture is overlaid on top of `cobble.png`.
+
+### Escaping
+
+Modifiers that accept texture names (e.g. `[combine`) accept escaping to allow
+passing complex texture names as arguments. Escaping is done with backslash and
+is required for `^` and `:`.
+
+Example: `cobble.png^[lowpart:50:color.png\^[mask\:trans.png`
+
+The lower 50 percent of `color.png^[mask:trans.png` are overlaid
+on top of `cobble.png`.
+
+### Advanced texture modifiers
+
+#### Crack
+
+* `[crack:<n>:<p>`
+* `[cracko:<n>:<p>`
+* `[crack:<t>:<n>:<p>`
+* `[cracko:<t>:<n>:<p>`
+
+Parameters:
+
+* `<t>`: tile count (in each direction)
+* `<n>`: animation frame count
+* `<p>`: current animation frame
+
+Draw a step of the crack animation on the texture.
+`crack` draws it normally, while `cracko` lays it over, keeping transparent
+pixels intact.
+
+Example:
+
+    default_cobble.png^[crack:10:1
+
+#### `[combine:<w>x<h>:<x1>,<y1>=<file1>:<x2>,<y2>=<file2>:...`
+
+* `<w>`: width
+* `<h>`: height
+* `<x>`: x position
+* `<y>`: y position
+* `<file>`: texture to combine
+
+Creates a texture of size `<w>` times `<h>` and blits the listed files to their
+specified coordinates.
+
+Example:
+
+    [combine:16x32:0,0=default_cobble.png:0,16=default_wood.png
+
+#### `[resize:<w>x<h>`
+
+Resizes the texture to the given dimensions.
+
+Example:
+
+    default_sandstone.png^[resize:16x16
+
+#### `[opacity:<r>`
+
+Makes the base image transparent according to the given ratio.
+
+`r` must be between 0 (transparent) and 255 (opaque).
+
+Example:
+
+    default_sandstone.png^[opacity:127
+
+#### `[invert:<mode>`
+
+Inverts the given channels of the base image.
+Mode may contain the characters "r", "g", "b", "a".
+Only the channels that are mentioned in the mode string will be inverted.
+
+Example:
+
+    default_apple.png^[invert:rgb
+
+#### `[brighten`
+
+Brightens the texture.
+
+Example:
+
+    tnt_tnt_side.png^[brighten
+
+#### `[noalpha`
+
+Makes the texture completely opaque.
+
+Example:
+
+    default_leaves.png^[noalpha
+
+#### `[makealpha:<r>,<g>,<b>`
+
+Convert one color to transparency.
+
+Example:
+
+    default_cobble.png^[makealpha:128,128,128
+
+#### `[transform<t>`
+
+* `<t>`: transformation(s) to apply
+
+Rotates and/or flips the image.
+
+`<t>` can be a number (between 0 and 7) or a transform name.
+Rotations are counter-clockwise.
+
+    0  I      identity
+    1  R90    rotate by 90 degrees
+    2  R180   rotate by 180 degrees
+    3  R270   rotate by 270 degrees
+    4  FX     flip X
+    5  FXR90  flip X then rotate by 90 degrees
+    6  FY     flip Y
+    7  FYR90  flip Y then rotate by 90 degrees
+
+Example:
+
+    default_stone.png^[transformFXR90
+
+#### `[inventorycube{<top>{<left>{<right>`
+
+Escaping does not apply here and `^` is replaced by `&` in texture names
+instead.
+
+Create an inventory cube texture using the side textures.
+
+Example:
+
+    [inventorycube{grass.png{dirt.png&grass_side.png{dirt.png&grass_side.png
+
+Creates an inventorycube with `grass.png`, `dirt.png^grass_side.png` and
+`dirt.png^grass_side.png` textures
+
+#### `[lowpart:<percent>:<file>`
+
+Blit the lower `<percent>`% part of `<file>` on the texture.
+
+Example:
+
+    base.png^[lowpart:25:overlay.png
+
+#### `[verticalframe:<t>:<n>`
+
+* `<t>`: animation frame count
+* `<n>`: current animation frame
+
+Crops the texture to a frame of a vertical animation.
+
+Example:
+
+    default_torch_animated.png^[verticalframe:16:8
+
+#### `[mask:<file>`
+
+Apply a mask to the base image.
+
+The mask is applied using binary AND.
+
+#### `[sheet:<w>x<h>:<x>,<y>`
+
+Retrieves a tile at position x,y from the base image
+which it assumes to be a tilesheet with dimensions w,h.
+
+#### `[colorize:<color>:<ratio>`
+
+Colorize the textures with the given color.
+`<color>` is specified as a `ColorString`.
+`<ratio>` is an int ranging from 0 to 255 or the word "`alpha`".  If
+it is an int, then it specifies how far to interpolate between the
+colors where 0 is only the texture color and 255 is only `<color>`. If
+omitted, the alpha of `<color>` will be used as the ratio.  If it is
+the word "`alpha`", then each texture pixel will contain the RGB of
+`<color>` and the alpha of `<color>` multiplied by the alpha of the
+texture pixel.
+
+#### `[multiply:<color>`
+
+Multiplies texture colors with the given color.
+`<color>` is specified as a `ColorString`.
+Result is more like what you'd expect if you put a color on top of another
+color, meaning white surfaces get a lot of your new color while black parts
+don't change very much.
+
+Hardware coloring
+-----------------
+
+The goal of hardware coloring is to simplify the creation of
+colorful nodes. If your textures use the same pattern, and they only
+differ in their color (like colored wool blocks), you can use hardware
+coloring instead of creating and managing many texture files.
+All of these methods use color multiplication (so a white-black texture
+with red coloring will result in red-black color).
+
+### Static coloring
+
+This method is useful if you wish to create nodes/items with
+the same texture, in different colors, each in a new node/item definition.
+
+#### Global color
+
+When you register an item or node, set its `color` field (which accepts a
+`ColorSpec`) to the desired color.
+
+An `ItemStack`'s static color can be overwritten by the `color` metadata
+field. If you set that field to a `ColorString`, that color will be used.
+
+#### Tile color
+
+Each tile may have an individual static color, which overwrites every
+other coloring method. To disable the coloring of a face,
+set its color to white (because multiplying with white does nothing).
+You can set the `color` property of the tiles in the node's definition
+if the tile is in table format.
+
+### Palettes
+
+For nodes and items which can have many colors, a palette is more
+suitable. A palette is a texture, which can contain up to 256 pixels.
+Each pixel is one possible color for the node/item.
+You can register one node/item, which can have up to 256 colors.
+
+#### Palette indexing
+
+When using palettes, you always provide a pixel index for the given
+node or `ItemStack`. The palette is read from left to right and from
+top to bottom. If the palette has less than 256 pixels, then it is
+stretched to contain exactly 256 pixels (after arranging the pixels
+to one line). The indexing starts from 0.
+
+Examples:
+
+* 16x16 palette, index = 0: the top left corner
+* 16x16 palette, index = 4: the fifth pixel in the first row
+* 16x16 palette, index = 16: the pixel below the top left corner
+* 16x16 palette, index = 255: the bottom right corner
+* 2 (width) x 4 (height) palette, index = 31: the top left corner.
+  The palette has 8 pixels, so each pixel is stretched to 32 pixels,
+  to ensure the total 256 pixels.
+* 2x4 palette, index = 32: the top right corner
+* 2x4 palette, index = 63: the top right corner
+* 2x4 palette, index = 64: the pixel below the top left corner
+
+#### Using palettes with items
+
+When registering an item, set the item definition's `palette` field to
+a texture. You can also use texture modifiers.
+
+The `ItemStack`'s color depends on the `palette_index` field of the
+stack's metadata. `palette_index` is an integer, which specifies the
+index of the pixel to use.
+
+#### Linking palettes with nodes
+
+When registering a node, set the item definition's `palette` field to
+a texture. You can also use texture modifiers.
+The node's color depends on its `param2`, so you also must set an
+appropriate `paramtype2`:
+
+* `paramtype2 = "color"` for nodes which use their full `param2` for
+  palette indexing. These nodes can have 256 different colors.
+  The palette should contain 256 pixels.
+* `paramtype2 = "colorwallmounted"` for nodes which use the first
+  five bits (most significant) of `param2` for palette indexing.
+  The remaining three bits are describing rotation, as in `wallmounted`
+  paramtype2. Division by 8 yields the palette index (without stretching the
+  palette). These nodes can have 32 different colors, and the palette
+  should contain 32 pixels.
+  Examples:
+    * `param2 = 17` is 2 * 8 + 1, so the rotation is 1 and the third (= 2 + 1)
+      pixel will be picked from the palette.
+    * `param2 = 35` is 4 * 8 + 3, so the rotation is 3 and the fifth (= 4 + 1)
+      pixel will be picked from the palette.
+* `paramtype2 = "colorfacedir"` for nodes which use the first
+  three bits of `param2` for palette indexing. The remaining
+  five bits are describing rotation, as in `facedir` paramtype2.
+  Division by 32 yields the palette index (without stretching the
+  palette). These nodes can have 8 different colors, and the
+  palette should contain 8 pixels.
+  Examples:
+    * `param2 = 17` is 0 * 32 + 17, so the rotation is 17 and the
+      first (= 0 + 1) pixel will be picked from the palette.
+    * `param2 = 35` is 1 * 32 + 3, so the rotation is 3 and the
+      second (= 1 + 1) pixel will be picked from the palette.
+
+To colorize a node on the map, set its `param2` value (according
+to the node's paramtype2).
+
+### Conversion between nodes in the inventory and on the map
+
+Static coloring is the same for both cases, there is no need
+for conversion.
+
+If the `ItemStack`'s metadata contains the `color` field, it will be
+lost on placement, because nodes on the map can only use palettes.
+
+If the `ItemStack`'s metadata contains the `palette_index` field, it is
+automatically transferred between node and item forms by the engine,
+when a player digs or places a colored node.
+You can disable this feature by setting the `drop` field of the node
+to itself (without metadata).
+To transfer the color to a special drop, you need a drop table.
+
+Example:
+
+    minetest.register_node("mod:stone", {
+        description = "Stone",
+        tiles = {"default_stone.png"},
+        paramtype2 = "color",
+        palette = "palette.png",
+        drop = {
+            items = {
+                -- assume that mod:cobblestone also has the same palette
+                {items = {"mod:cobblestone"}, inherit_color = true },
+            }
+        }
+    })
+
+### Colored items in craft recipes
+
+Craft recipes only support item strings, but fortunately item strings
+can also contain metadata. Example craft recipe registration:
+
+    minetest.register_craft({
+        output = minetest.itemstring_with_palette("wool:block", 3),
+        type = "shapeless",
+        recipe = {
+            "wool:block",
+            "dye:red",
+        },
+    })
+
+To set the `color` field, you can use `minetest.itemstring_with_color`.
+
+Metadata field filtering in the `recipe` field are not supported yet,
+so the craft output is independent of the color of the ingredients.
+
+Soft texture overlay
+--------------------
+
+Sometimes hardware coloring is not enough, because it affects the
+whole tile. Soft texture overlays were added to Minetest to allow
+the dynamic coloring of only specific parts of the node's texture.
+For example a grass block may have colored grass, while keeping the
+dirt brown.
+
+These overlays are 'soft', because unlike texture modifiers, the layers
+are not merged in the memory, but they are simply drawn on top of each
+other. This allows different hardware coloring, but also means that
+tiles with overlays are drawn slower. Using too much overlays might
+cause FPS loss.
+
+For inventory and wield images you can specify overlays which
+hardware coloring does not modify. You have to set `inventory_overlay`
+and `wield_overlay` fields to an image name.
+
+To define a node overlay, simply set the `overlay_tiles` field of the node
+definition. These tiles are defined in the same way as plain tiles:
+they can have a texture name, color etc.
+To skip one face, set that overlay tile to an empty string.
+
+Example (colored grass block):
+
+    minetest.register_node("default:dirt_with_grass", {
+        description = "Dirt with Grass",
+        -- Regular tiles, as usual
+        -- The dirt tile disables palette coloring
+        tiles = {{name = "default_grass.png"},
+            {name = "default_dirt.png", color = "white"}},
+        -- Overlay tiles: define them in the same style
+        -- The top and bottom tile does not have overlay
+        overlay_tiles = {"", "",
+            {name = "default_grass_side.png", tileable_vertical = false}},
+        -- Global color, used in inventory
+        color = "green",
+        -- Palette in the world
+        paramtype2 = "color",
+        palette = "default_foilage.png",
+    })
+
+
+
+
+Sounds
+======
+
+Only Ogg Vorbis files are supported.
+
+For positional playing of sounds, only single-channel (mono) files are
+supported. Otherwise OpenAL will play them non-positionally.
+
+Mods should generally prefix their sounds with `modname_`, e.g. given
+the mod name "`foomod`", a sound could be called:
+
+    foomod_foosound.ogg
+
+Sounds are referred to by their name with a dot, a single digit and the
+file extension stripped out. When a sound is played, the actual sound file
+is chosen randomly from the matching sounds.
+
+When playing the sound `foomod_foosound`, the sound is chosen randomly
+from the available ones of the following files:
+
+* `foomod_foosound.ogg`
+* `foomod_foosound.0.ogg`
+* `foomod_foosound.1.ogg`
+* (...)
+* `foomod_foosound.9.ogg`
+
+Examples of sound parameter tables:
+
+    -- Play locationless on all clients
+    {
+        gain = 1.0,   -- default
+        fade = 0.0,   -- default, change to a value > 0 to fade the sound in
+        pitch = 1.0,  -- default
+    }
+    -- Play locationless to one player
+    {
+        to_player = name,
+        gain = 1.0,   -- default
+        fade = 0.0,   -- default, change to a value > 0 to fade the sound in
+        pitch = 1.0,  -- default
+    }
+    -- Play locationless to one player, looped
+    {
+        to_player = name,
+        gain = 1.0,  -- default
+        loop = true,
+    }
+    -- Play at a location
+    {
+        pos = {x = 1, y = 2, z = 3},
+        gain = 1.0,  -- default
+        max_hear_distance = 32,  -- default, uses an euclidean metric
+    }
+    -- Play connected to an object, looped
+    {
+        object = <an ObjectRef>,
+        gain = 1.0,  -- default
+        max_hear_distance = 32,  -- default, uses an euclidean metric
+        loop = true,
+    }
+    -- Play at a location, heard by anyone *but* the given player
+    {
+        pos = {x = 32, y = 0, z = 100},
+        max_hear_distance = 40,
+        exclude_player = name,
+    }
+
+Looped sounds must either be connected to an object or played locationless to
+one player using `to_player = name`.
+
+A positional sound will only be heard by players that are within
+`max_hear_distance` of the sound position, at the start of the sound.
+
+`exclude_player = name` can be applied to locationless, positional and object-
+bound sounds to exclude a single player from hearing them.
+
+`SimpleSoundSpec`
+-----------------
+
+Specifies a sound name, gain (=volume) and pitch.
+This is either a string or a table.
+
+In string form, you just specify the sound name or
+the empty string for no sound.
+
+Table form has the following fields:
+
+* `name`: Sound name
+* `gain`: Volume (`1.0` = 100%)
+* `pitch`: Pitch (`1.0` = 100%)
+
+`gain` and `pitch` are optional and default to `1.0`.
+
+Examples:
+
+* `""`: No sound
+* `{}`: No sound
+* `"default_place_node"`: Play e.g. `default_place_node.ogg`
+* `{name = "default_place_node"}`: Same as above
+* `{name = "default_place_node", gain = 0.5}`: 50% volume
+* `{name = "default_place_node", gain = 0.9, pitch = 1.1}`: 90% volume, 110% pitch
+
+Special sound files
+-------------------
+
+These sound files are played back by the engine if provided.
+
+ * `player_damage`: Played when the local player takes damage (gain = 0.5)
+ * `player_falling_damage`: Played when the local player takes
+   damage by falling (gain = 0.5)
+ * `default_dig_<groupname>`: Default node digging sound
+   (see node sound definition for details)
+
+Registered definitions
+======================
+
+Anything added using certain [Registration functions] gets added to one or more
+of the global [Registered definition tables].
+
+Note that in some cases you will stumble upon things that are not contained
+in these tables (e.g. when a mod has been removed). Always check for
+existence before trying to access the fields.
+
+Example:
+
+All nodes register with `minetest.register_node` get added to the table
+`minetest.registered_nodes`.
+
+If you want to check the drawtype of a node, you could do:
+
+    local function get_nodedef_field(nodename, fieldname)
+        if not minetest.registered_nodes[nodename] then
+            return nil
+        end
+        return minetest.registered_nodes[nodename][fieldname]
+    end
+    local drawtype = get_nodedef_field(nodename, "drawtype")
+
+
+
+
+Nodes
+=====
+
+Nodes are the bulk data of the world: cubes and other things that take the
+space of a cube. Huge amounts of them are handled efficiently, but they
+are quite static.
+
+The definition of a node is stored and can be accessed by using
+
+    minetest.registered_nodes[node.name]
+
+See [Registered definitions].
+
+Nodes are passed by value between Lua and the engine.
+They are represented by a table:
+
+    {name="name", param1=num, param2=num}
+
+`param1` and `param2` are 8-bit integers ranging from 0 to 255. The engine uses
+them for certain automated functions. If you don't use these functions, you can
+use them to store arbitrary values.
+
+Node paramtypes
+---------------
+
+The functions of `param1` and `param2` are determined by certain fields in the
+node definition.
+
+The function of `param1` is determined by `paramtype` in node definition.
+`param1` is reserved for the engine when `paramtype != "none"`.
+
+* `paramtype = "light"`
+    * The value stores light with and without sun in its upper and lower 4 bits
+      respectively.
+    * Required by a light source node to enable spreading its light.
+    * Required by the following drawtypes as they determine their visual
+      brightness from their internal light value:
+        * torchlike
+        * signlike
+        * firelike
+        * fencelike
+        * raillike
+        * nodebox
+        * mesh
+        * plantlike
+        * plantlike_rooted
+* `paramtype = "none"`
+    * `param1` will not be used by the engine and can be used to store
+      an arbitrary value
+
+The function of `param2` is determined by `paramtype2` in node definition.
+`param2` is reserved for the engine when `paramtype2 != "none"`.
+
+* `paramtype2 = "flowingliquid"`
+    * Used by `drawtype = "flowingliquid"` and `liquidtype = "flowing"`
+    * The liquid level and a flag of the liquid are stored in `param2`
+    * Bits 0-2: Liquid level (0-7). The higher, the more liquid is in this node
+    * Bit 3: If set, liquid is flowing downwards (no graphical effect)
+* `paramtype2 = "wallmounted"`
+    * Supported drawtypes: "torchlike", "signlike", "normal", "nodebox", "mesh"
+    * The rotation of the node is stored in `param2`
+    * You can make this value by using `minetest.dir_to_wallmounted()`
+    * Values range 0 - 5
+    * The value denotes at which direction the node is "mounted":
+      0 = y+,   1 = y-,   2 = x+,   3 = x-,   4 = z+,   5 = z-
+* `paramtype2 = "facedir"`
+    * Supported drawtypes: "normal", "nodebox", "mesh"
+    * The rotation of the node is stored in `param2`. Furnaces and chests are
+      rotated this way. Can be made by using `minetest.dir_to_facedir()`.
+    * Values range 0 - 23
+    * facedir / 4 = axis direction:
+      0 = y+,   1 = z+,   2 = z-,   3 = x+,   4 = x-,   5 = y-
+    * facedir modulo 4 = rotation around that axis
+* `paramtype2 = "leveled"`
+    * Only valid for "nodebox" with 'type = "leveled"', and "plantlike_rooted".
+        * Leveled nodebox:
+            * The level of the top face of the nodebox is stored in `param2`.
+            * The other faces are defined by 'fixed = {}' like 'type = "fixed"'
+              nodeboxes.
+            * The nodebox height is (`param2` / 64) nodes.
+            * The maximum accepted value of `param2` is 127.
+        * Rooted plantlike:
+            * The height of the 'plantlike' section is stored in `param2`.
+            * The height is (`param2` / 16) nodes.
+* `paramtype2 = "degrotate"`
+    * Only valid for "plantlike" drawtype. The rotation of the node is stored in
+      `param2`.
+    * Values range 0 - 179. The value stored in `param2` is multiplied by two to
+      get the actual rotation in degrees of the node.
+* `paramtype2 = "meshoptions"`
+    * Only valid for "plantlike" drawtype. The value of `param2` becomes a
+      bitfield which can be used to change how the client draws plantlike nodes.
+    * Bits 0, 1 and 2 form a mesh selector.
+      Currently the following meshes are choosable:
+        * 0 = a "x" shaped plant (ordinary plant)
+        * 1 = a "+" shaped plant (just rotated 45 degrees)
+        * 2 = a "*" shaped plant with 3 faces instead of 2
+        * 3 = a "#" shaped plant with 4 faces instead of 2
+        * 4 = a "#" shaped plant with 4 faces that lean outwards
+        * 5-7 are unused and reserved for future meshes.
+    * Bits 3 through 7 are optional flags that can be combined and give these
+      effects:
+        * bit 3 (0x08) - Makes the plant slightly vary placement horizontally
+        * bit 4 (0x10) - Makes the plant mesh 1.4x larger
+        * bit 5 (0x20) - Moves each face randomly a small bit down (1/8 max)
+        * bits 6-7 are reserved for future use.
+* `paramtype2 = "color"`
+    * `param2` tells which color is picked from the palette.
+      The palette should have 256 pixels.
+* `paramtype2 = "colorfacedir"`
+    * Same as `facedir`, but with colors.
+    * The first three bits of `param2` tells which color is picked from the
+      palette. The palette should have 8 pixels.
+* `paramtype2 = "colorwallmounted"`
+    * Same as `wallmounted`, but with colors.
+    * The first five bits of `param2` tells which color is picked from the
+      palette. The palette should have 32 pixels.
+* `paramtype2 = "glasslikeliquidlevel"`
+    * Only valid for "glasslike_framed" or "glasslike_framed_optional"
+      drawtypes.
+    * `param2` values 0-63 define 64 levels of internal liquid, 0 being empty
+      and 63 being full.
+    * Liquid texture is defined using `special_tiles = {"modname_tilename.png"}`
+* `paramtype2 = "none"`
+    * `param2` will not be used by the engine and can be used to store
+      an arbitrary value
+
+Nodes can also contain extra data. See [Node Metadata].
+
+Node drawtypes
+--------------
+
+There are a bunch of different looking node types.
+
+Look for examples in `games/minimal` or `games/minetest_game`.
+
+* `normal`
+    * A node-sized cube.
+* `airlike`
+    * Invisible, uses no texture.
+* `liquid`
+    * The cubic source node for a liquid.
+* `flowingliquid`
+    * The flowing version of a liquid, appears with various heights and slopes.
+* `glasslike`
+    * Often used for partially-transparent nodes.
+    * Only external sides of textures are visible.
+* `glasslike_framed`
+    * All face-connected nodes are drawn as one volume within a surrounding
+      frame.
+    * The frame appearance is generated from the edges of the first texture
+      specified in `tiles`. The width of the edges used are 1/16th of texture
+      size: 1 pixel for 16x16, 2 pixels for 32x32 etc.
+    * The glass 'shine' (or other desired detail) on each node face is supplied
+      by the second texture specified in `tiles`.
+* `glasslike_framed_optional`
+    * This switches between the above 2 drawtypes according to the menu setting
+      'Connected Glass'.
+* `allfaces`
+    * Often used for partially-transparent nodes.
+    * External and internal sides of textures are visible.
+* `allfaces_optional`
+    * Often used for leaves nodes.
+    * This switches between `normal`, `glasslike` and `allfaces` according to
+      the menu setting: Opaque Leaves / Simple Leaves / Fancy Leaves.
+    * With 'Simple Leaves' selected, the texture specified in `special_tiles`
+      is used instead, if present. This allows a visually thicker texture to be
+      used to compensate for how `glasslike` reduces visual thickness.
+* `torchlike`
+    * A single vertical texture.
+    * If placed on top of a node, uses the first texture specified in `tiles`.
+    * If placed against the underside of a node, uses the second texture
+      specified in `tiles`.
+    * If placed on the side of a node, uses the third texture specified in
+      `tiles` and is perpendicular to that node.
+* `signlike`
+    * A single texture parallel to, and mounted against, the top, underside or
+      side of a node.
+* `plantlike`
+    * Two vertical and diagonal textures at right-angles to each other.
+    * See `paramtype2 = "meshoptions"` above for other options.
+* `firelike`
+    * When above a flat surface, appears as 6 textures, the central 2 as
+      `plantlike` plus 4 more surrounding those.
+    * If not above a surface the central 2 do not appear, but the texture
+      appears against the faces of surrounding nodes if they are present.
+* `fencelike`
+    * A 3D model suitable for a wooden fence.
+    * One placed node appears as a single vertical post.
+    * Adjacently-placed nodes cause horizontal bars to appear between them.
+* `raillike`
+    * Often used for tracks for mining carts.
+    * Requires 4 textures to be specified in `tiles`, in order: Straight,
+      curved, t-junction, crossing.
+    * Each placed node automatically switches to a suitable rotated texture
+      determined by the adjacent `raillike` nodes, in order to create a
+      continuous track network.
+    * Becomes a sloping node if placed against stepped nodes.
+* `nodebox`
+    * Often used for stairs and slabs.
+    * Allows defining nodes consisting of an arbitrary number of boxes.
+    * See [Node boxes] below for more information.
+* `mesh`
+    * Uses models for nodes.
+    * Tiles should hold model materials textures.
+    * Only static meshes are implemented.
+    * For supported model formats see Irrlicht engine documentation.
+* `plantlike_rooted`
+    * Enables underwater `plantlike` without air bubbles around the nodes.
+    * Consists of a base cube at the co-ordinates of the node plus a
+      `plantlike` extension above with a height of `param2 / 16` nodes.
+    * The `plantlike` extension visually passes through any nodes above the
+      base cube without affecting them.
+    * The base cube texture tiles are defined as normal, the `plantlike`
+      extension uses the defined special tile, for example:
+      `special_tiles = {{name = "default_papyrus.png", tileable_vertical = true}},`
+
+`*_optional` drawtypes need less rendering time if deactivated
+(always client-side).
+
+Node boxes
+----------
+
+Node selection boxes are defined using "node boxes".
+
+A nodebox is defined as any of:
+
+    {
+        -- A normal cube; the default in most things
+        type = "regular"
+    }
+    {
+        -- A fixed box (or boxes) (facedir param2 is used, if applicable)
+        type = "fixed",
+        fixed = box OR {box1, box2, ...}
+    }
+    {
+        -- A variable height box (or boxes) with the top face position defined
+        -- by the node parameter 'leveled = ', or if 'paramtype2 == "leveled"'
+        -- by param2.
+        -- Other faces are defined by 'fixed = {}' as with 'type = "fixed"'.
+        type = "leveled",
+        fixed = box OR {box1, box2, ...}
+    }
+    {
+        -- A box like the selection box for torches
+        -- (wallmounted param2 is used, if applicable)
+        type = "wallmounted",
+        wall_top = box,
+        wall_bottom = box,
+        wall_side = box
+    }
+    {
+        -- A node that has optional boxes depending on neighbouring nodes'
+        -- presence and type. See also `connects_to`.
+        type = "connected",
+        fixed = box OR {box1, box2, ...}
+        connect_top = box OR {box1, box2, ...}
+        connect_bottom = box OR {box1, box2, ...}
+        connect_front = box OR {box1, box2, ...}
+        connect_left = box OR {box1, box2, ...}
+        connect_back = box OR {box1, box2, ...}
+        connect_right = box OR {box1, box2, ...}
+        -- The following `disconnected_*` boxes are the opposites of the
+        -- `connect_*` ones above, i.e. when a node has no suitable neighbour
+        -- on the respective side, the corresponding disconnected box is drawn.
+        disconnected_top = box OR {box1, box2, ...}
+        disconnected_bottom = box OR {box1, box2, ...}
+        disconnected_front = box OR {box1, box2, ...}
+        disconnected_left = box OR {box1, box2, ...}
+        disconnected_back = box OR {box1, box2, ...}
+        disconnected_right = box OR {box1, box2, ...}
+        disconnected = box OR {box1, box2, ...} -- when there is *no* neighbour
+        disconnected_sides = box OR {box1, box2, ...} -- when there are *no*
+                                                      -- neighbours to the sides
+    }
+
+A `box` is defined as:
+
+    {x1, y1, z1, x2, y2, z2}
+
+A box of a regular node would look like:
+
+    {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
+
+
+
+
+Map terminology and coordinates
+===============================
+
+Nodes, mapblocks, mapchunks
+---------------------------
+
+A 'node' is the fundamental cubic unit of a world and appears to a player as
+roughly 1x1x1 meters in size.
+
+A 'mapblock' (often abbreviated to 'block') is 16x16x16 nodes and is the
+fundamental region of a world that is stored in the world database, sent to
+clients and handled by many parts of the engine.
+'mapblock' is preferred terminology to 'block' to help avoid confusion with
+'node', however 'block' often appears in the API.
+
+A 'mapchunk' (sometimes abbreviated to 'chunk') is usually 5x5x5 mapblocks
+(80x80x80 nodes) and is the volume of world generated in one operation by
+the map generator.
+The size in mapblocks has been chosen to optimise map generation.
+
+Coordinates
+-----------
+
+### Orientation of axes
+
+For node and mapblock coordinates, +X is East, +Y is up, +Z is North.
+
+### Node coordinates
+
+Almost all positions used in the API use node coordinates.
+
+### Mapblock coordinates
+
+Occasionally the API uses 'blockpos' which refers to mapblock coordinates that
+specify a particular mapblock.
+For example blockpos (0,0,0) specifies the mapblock that extends from
+node position (0,0,0) to node position (15,15,15).
+
+#### Converting node position to the containing blockpos
+
+To calculate the blockpos of the mapblock that contains the node at 'nodepos',
+for each axis:
+
+* blockpos = math.floor(nodepos / 16)
+
+#### Converting blockpos to min/max node positions
+
+To calculate the min/max node positions contained in the mapblock at 'blockpos',
+for each axis:
+
+* Minimum:
+  nodepos = blockpos * 16
+* Maximum:
+  nodepos = blockpos * 16 + 15
+
+
+
+
+HUD
+===
+
+HUD element types
+-----------------
+
+The position field is used for all element types.
+
+To account for differing resolutions, the position coordinates are the
+percentage of the screen, ranging in value from `0` to `1`.
+
+The name field is not yet used, but should contain a description of what the
+HUD element represents. The direction field is the direction in which something
+is drawn.
+
+`0` draws from left to right, `1` draws from right to left, `2` draws from
+top to bottom, and `3` draws from bottom to top.
+
+The `alignment` field specifies how the item will be aligned. It is a table
+where `x` and `y` range from `-1` to `1`, with `0` being central. `-1` is
+moved to the left/up, and `1` is to the right/down. Fractional values can be
+used.
+
+The `offset` field specifies a pixel offset from the position. Contrary to
+position, the offset is not scaled to screen size. This allows for some
+precisely positioned items in the HUD.
+
+**Note**: `offset` _will_ adapt to screen DPI as well as user defined scaling
+factor!
+
+The `z_index` field specifies the order of HUD elements from back to front.
+Lower z-index elements are displayed behind higher z-index elements. Elements
+with same z-index are displayed in an arbitrary order. Default 0.
+Supports negative values.
+
+Below are the specific uses for fields in each type; fields not listed for that
+type are ignored.
+
+### `image`
+
+Displays an image on the HUD.
+
+* `scale`: The scale of the image, with 1 being the original texture size.
+  Only the X coordinate scale is used (positive values).
+  Negative values represent that percentage of the screen it
+  should take; e.g. `x=-100` means 100% (width).
+* `text`: The name of the texture that is displayed.
+* `alignment`: The alignment of the image.
+* `offset`: offset in pixels from position.
+
+### `text`
+
+Displays text on the HUD.
+
+* `scale`: Defines the bounding rectangle of the text.
+  A value such as `{x=100, y=100}` should work.
+* `text`: The text to be displayed in the HUD element.
+* `number`: An integer containing the RGB value of the color used to draw the
+  text. Specify `0xFFFFFF` for white text, `0xFF0000` for red, and so on.
+* `alignment`: The alignment of the text.
+* `offset`: offset in pixels from position.
+
+### `statbar`
+
+Displays a horizontal bar made up of half-images.
+
+* `text`: The name of the texture that is used.
+* `number`: The number of half-textures that are displayed.
+  If odd, will end with a vertically center-split texture.
+* `direction`
+* `offset`: offset in pixels from position.
+* `size`: If used, will force full-image size to this value (override texture
+  pack image size)
+
+### `inventory`
+
+* `text`: The name of the inventory list to be displayed.
+* `number`: Number of items in the inventory to be displayed.
+* `item`: Position of item that is selected.
+* `direction`
+* `offset`: offset in pixels from position.
+
+### `waypoint`
+
+Displays distance to selected world position.
+
+* `name`: The name of the waypoint.
+* `text`: Distance suffix. Can be blank.
+* `number:` An integer containing the RGB value of the color used to draw the
+  text.
+* `world_pos`: World position of the waypoint.
+
+
+
+
+Representations of simple things
+================================
+
+Position/vector
+---------------
+
+    {x=num, y=num, z=num}
+
+For helper functions see [Spatial Vectors].
+
+`pointed_thing`
+---------------
+
+* `{type="nothing"}`
+* `{type="node", under=pos, above=pos}`
+    * Indicates a pointed node selection box.
+    * `under` refers to the node position behind the pointed face.
+    * `above` refers to the node position in front of the pointed face.
+* `{type="object", ref=ObjectRef}`
+
+Exact pointing location (currently only `Raycast` supports these fields):
+
+* `pointed_thing.intersection_point`: The absolute world coordinates of the
+  point on the selection box which is pointed at. May be in the selection box
+  if the pointer is in the box too.
+* `pointed_thing.box_id`: The ID of the pointed selection box (counting starts
+  from 1).
+* `pointed_thing.intersection_normal`: Unit vector, points outwards of the
+  selected selection box. This specifies which face is pointed at.
+  Is a null vector `{x = 0, y = 0, z = 0}` when the pointer is inside the
+  selection box.
+
+
+
+
+Flag Specifier Format
+=====================
+
+Flags using the standardized flag specifier format can be specified in either
+of two ways, by string or table.
+
+The string format is a comma-delimited set of flag names; whitespace and
+unrecognized flag fields are ignored. Specifying a flag in the string sets the
+flag, and specifying a flag prefixed by the string `"no"` explicitly
+clears the flag from whatever the default may be.
+
+In addition to the standard string flag format, the schematic flags field can
+also be a table of flag names to boolean values representing whether or not the
+flag is set. Additionally, if a field with the flag name prefixed with `"no"`
+is present, mapped to a boolean of any value, the specified flag is unset.
+
+E.g. A flag field of value
+
+    {place_center_x = true, place_center_y=false, place_center_z=true}
+
+is equivalent to
+
+    {place_center_x = true, noplace_center_y=true, place_center_z=true}
+
+which is equivalent to
+
+    "place_center_x, noplace_center_y, place_center_z"
+
+or even
+
+    "place_center_x, place_center_z"
+
+since, by default, no schematic attributes are set.
+
+
+
+
+Items
+=====
+
+Item types
+----------
+
+There are three kinds of items: nodes, tools and craftitems.
+
+* Node: Can be placed in the world's voxel grid
+* Tool: Has a wear property but cannot be stacked. The default use action is to
+  dig nodes or hit objects according to its tool capabilities.
+* Craftitem: Cannot dig nodes or be placed
+
+Amount and wear
+---------------
+
+All item stacks have an amount between 0 and 65535. It is 1 by
+default. Tool item stacks can not have an amount greater than 1.
+
+Tools use a wear (damage) value ranging from 0 to 65535. The
+value 0 is the default and is used for unworn tools. The values
+1 to 65535 are used for worn tools, where a higher value stands for
+a higher wear. Non-tools always have a wear value of 0.
+
+Item formats
+------------
+
+Items and item stacks can exist in three formats: Serializes, table format
+and `ItemStack`.
+
+When an item must be passed to a function, it can usually be in any of
+these formats.
+
+### Serialized
+
+This is called "stackstring" or "itemstring". It is a simple string with
+1-3 components: the full item identifier, an optional amount and an optional
+wear value. Syntax:
+
+    <identifier> [<amount>[ <wear>]]
+
+Examples:
+
+* `'default:apple'`: 1 apple
+* `'default:dirt 5'`: 5 dirt
+* `'default:pick_stone'`: a new stone pickaxe
+* `'default:pick_wood 1 21323'`: a wooden pickaxe, ca. 1/3 worn out
+
+### Table format
+
+Examples:
+
+5 dirt nodes:
+
+    {name="default:dirt", count=5, wear=0, metadata=""}
+
+A wooden pick about 1/3 worn out:
+
+    {name="default:pick_wood", count=1, wear=21323, metadata=""}
+
+An apple:
+
+    {name="default:apple", count=1, wear=0, metadata=""}
+
+### `ItemStack`
+
+A native C++ format with many helper methods. Useful for converting
+between formats. See the [Class reference] section for details.
+
+
+
+
+Groups
+======
+
+In a number of places, there is a group table. Groups define the
+properties of a thing (item, node, armor of entity, capabilities of
+tool) in such a way that the engine and other mods can can interact with
+the thing without actually knowing what the thing is.
+
+Usage
+-----
+
+Groups are stored in a table, having the group names with keys and the
+group ratings as values. Group ratings are integer values within the
+range [-32767, 32767]. For example:
+
+    -- Default dirt
+    groups = {crumbly=3, soil=1}
+
+    -- A more special dirt-kind of thing
+    groups = {crumbly=2, soil=1, level=2, outerspace=1}
+
+Groups always have a rating associated with them. If there is no
+useful meaning for a rating for an enabled group, it shall be `1`.
+
+When not defined, the rating of a group defaults to `0`. Thus when you
+read groups, you must interpret `nil` and `0` as the same value, `0`.
+
+You can read the rating of a group for an item or a node by using
+
+    minetest.get_item_group(itemname, groupname)
+
+Groups of items
+---------------
+
+Groups of items can define what kind of an item it is (e.g. wool).
+
+Groups of nodes
+---------------
+
+In addition to the general item things, groups are used to define whether
+a node is destroyable and how long it takes to destroy by a tool.
+
+Groups of entities
+------------------
+
+For entities, groups are, as of now, used only for calculating damage.
+The rating is the percentage of damage caused by tools with this damage group.
+See [Entity damage mechanism].
+
+    object.get_armor_groups() --> a group-rating table (e.g. {fleshy=100})
+    object.set_armor_groups({fleshy=30, cracky=80})
+
+Groups of tools
+---------------
+
+Groups in tools define which groups of nodes and entities they are
+effective towards.
+
+Groups in crafting recipes
+--------------------------
+
+An example: Make meat soup from any meat, any water and any bowl:
+
+    {
+        output = 'food:meat_soup_raw',
+        recipe = {
+            {'group:meat'},
+            {'group:water'},
+            {'group:bowl'},
+        },
+        -- preserve = {'group:bowl'}, -- Not implemented yet (TODO)
+    }
+
+Another example: Make red wool from white wool and red dye:
+
+    {
+        type = 'shapeless',
+        output = 'wool:red',
+        recipe = {'wool:white', 'group:dye,basecolor_red'},
+    }
+
+Special groups
+--------------
+
+The asterisk `(*)` after a group name describes that there is no engine
+functionality bound to it, and implementation is left up as a suggestion
+to games.
+
+### Node, item and tool groups
+
+* `not_in_creative_inventory`: (*) Special group for inventory mods to indicate
+  that the item should be hidden in item lists.
+
+
+### Node-only groups
+
+* `attached_node`: if the node under it is not a walkable block the node will be
+  dropped as an item. If the node is wallmounted the wallmounted direction is
+  checked.
+* `bouncy`: value is bounce speed in percent
+* `connect_to_raillike`: makes nodes of raillike drawtype with same group value
+  connect to each other
+* `dig_immediate`: Player can always pick up node without reducing tool wear
+    * `2`: the node always gets the digging time 0.5 seconds (rail, sign)
+    * `3`: the node always gets the digging time 0 seconds (torch)
+* `disable_jump`: Player (and possibly other things) cannot jump from node
+* `fall_damage_add_percent`: damage speed = `speed * (1 + value/100)`
+* `falling_node`: if there is no walkable block under the node it will fall
+* `float`: the node will not fall through liquids
+* `level`: Can be used to give an additional sense of progression in the game.
+     * A larger level will cause e.g. a weapon of a lower level make much less
+       damage, and get worn out much faster, or not be able to get drops
+       from destroyed nodes.
+     * `0` is something that is directly accessible at the start of gameplay
+     * There is no upper limit
+     * See also: `leveldiff` in [Tools]
+* `slippery`: Players and items will slide on the node.
+  Slipperiness rises steadily with `slippery` value, starting at 1.
+
+
+### Tool-only groups
+
+* `disable_repair`: If set to 1 for a tool, it cannot be repaired using the
+  `"toolrepair"` crafting recipe
+
+
+### `ObjectRef` groups
+
+* `immortal`: Skips all damage and breath handling for an object. This group
+  will also hide the integrated HUD status bars for players, and is
+  automatically set to all players when damage is disabled on the server.
+* `punch_operable`: For entities; disables the regular damage mechanism for
+  players punching it by hand or a non-tool item, so that it can do something
+  else than take damage.
+
+
+
+Known damage and digging time defining groups
+---------------------------------------------
+
+* `crumbly`: dirt, sand
+* `cracky`: tough but crackable stuff like stone.
+* `snappy`: something that can be cut using fine tools; e.g. leaves, small
+  plants, wire, sheets of metal
+* `choppy`: something that can be cut using force; e.g. trees, wooden planks
+* `fleshy`: Living things like animals and the player. This could imply
+  some blood effects when hitting.
+* `explody`: Especially prone to explosions
+* `oddly_breakable_by_hand`:
+   Can be added to nodes that shouldn't logically be breakable by the
+   hand but are. Somewhat similar to `dig_immediate`, but times are more
+   like `{[1]=3.50,[2]=2.00,[3]=0.70}` and this does not override the
+   speed of a tool if the tool can dig at a faster speed than this
+   suggests for the hand.
+
+Examples of custom groups
+-------------------------
+
+Item groups are often used for defining, well, _groups of items_.
+
+* `meat`: any meat-kind of a thing (rating might define the size or healing
+  ability or be irrelevant -- it is not defined as of yet)
+* `eatable`: anything that can be eaten. Rating might define HP gain in half
+  hearts.
+* `flammable`: can be set on fire. Rating might define the intensity of the
+  fire, affecting e.g. the speed of the spreading of an open fire.
+* `wool`: any wool (any origin, any color)
+* `metal`: any metal
+* `weapon`: any weapon
+* `heavy`: anything considerably heavy
+
+Digging time calculation specifics
+----------------------------------
+
+Groups such as `crumbly`, `cracky` and `snappy` are used for this
+purpose. Rating is `1`, `2` or `3`. A higher rating for such a group implies
+faster digging time.
+
+The `level` group is used to limit the toughness of nodes a tool can dig
+and to scale the digging times / damage to a greater extent.
+
+**Please do understand this**, otherwise you cannot use the system to it's
+full potential.
+
+Tools define their properties by a list of parameters for groups. They
+cannot dig other groups; thus it is important to use a standard bunch of
+groups to enable interaction with tools.
+
+
+
+
+Tools
+=====
+
+Tools definition
+----------------
+
+Tools define:
+
+* Full punch interval
+* Maximum drop level
+* For an arbitrary list of groups:
+    * Uses (until the tool breaks)
+        * Maximum level (usually `0`, `1`, `2` or `3`)
+        * Digging times
+        * Damage groups
+
+### Full punch interval
+
+When used as a weapon, the tool will do full damage if this time is spent
+between punches. If e.g. half the time is spent, the tool will do half
+damage.
+
+### Maximum drop level
+
+Suggests the maximum level of node, when dug with the tool, that will drop
+it's useful item. (e.g. iron ore to drop a lump of iron).
+
+This is not automated; it is the responsibility of the node definition
+to implement this.
+
+### Uses
+
+Determines how many uses the tool has when it is used for digging a node,
+of this group, of the maximum level. For lower leveled nodes, the use count
+is multiplied by `3^leveldiff`.
+`leveldiff` is the difference of the tool's `maxlevel` `groupcaps` and the
+node's `level` group. The node cannot be dug if `leveldiff` is less than zero.
+
+* `uses=10, leveldiff=0`: actual uses: 10
+* `uses=10, leveldiff=1`: actual uses: 30
+* `uses=10, leveldiff=2`: actual uses: 90
+
+### Maximum level
+
+Tells what is the maximum level of a node of this group that the tool will
+be able to dig.
+
+### Digging times
+
+List of digging times for different ratings of the group, for nodes of the
+maximum level.
+
+For example, as a Lua table, `times={2=2.00, 3=0.70}`. This would
+result in the tool to be able to dig nodes that have a rating of `2` or `3`
+for this group, and unable to dig the rating `1`, which is the toughest.
+Unless there is a matching group that enables digging otherwise.
+
+If the result digging time is 0, a delay of 0.15 seconds is added between
+digging nodes; If the player releases LMB after digging, this delay is set to 0,
+i.e. players can more quickly click the nodes away instead of holding LMB.
+
+### Damage groups
+
+List of damage for groups of entities. See [Entity damage mechanism].
+
+Example definition of the capabilities of a tool
+------------------------------------------------
+
+    tool_capabilities = {
+        full_punch_interval=1.5,
+        max_drop_level=1,
+        groupcaps={
+            crumbly={maxlevel=2, uses=20, times={[1]=1.60, [2]=1.20, [3]=0.80}}
+        }
+        damage_groups = {fleshy=2},
+    }
+
+This makes the tool be able to dig nodes that fulfil both of these:
+
+* Have the `crumbly` group
+* Have a `level` group less or equal to `2`
+
+Table of resulting digging times:
+
+    crumbly        0     1     2     3     4  <- level
+         ->  0     -     -     -     -     -
+             1  0.80  1.60  1.60     -     -
+             2  0.60  1.20  1.20     -     -
+             3  0.40  0.80  0.80     -     -
+
+    level diff:    2     1     0    -1    -2
+
+Table of resulting tool uses:
+
+    ->  0     -     -     -     -     -
+        1   180    60    20     -     -
+        2   180    60    20     -     -
+        3   180    60    20     -     -
+
+**Notes**:
+
+* At `crumbly==0`, the node is not diggable.
+* At `crumbly==3`, the level difference digging time divider kicks in and makes
+  easy nodes to be quickly breakable.
+* At `level > 2`, the node is not diggable, because it's `level > maxlevel`
+
+
+
+
+Entity damage mechanism
+=======================
+
+Damage calculation:
+
+    damage = 0
+    foreach group in cap.damage_groups:
+        damage += cap.damage_groups[group]
+            * limit(actual_interval / cap.full_punch_interval, 0.0, 1.0)
+            * (object.armor_groups[group] / 100.0)
+            -- Where object.armor_groups[group] is 0 for inexistent values
+    return damage
+
+Client predicts damage based on damage groups. Because of this, it is able to
+give an immediate response when an entity is damaged or dies; the response is
+pre-defined somehow (e.g. by defining a sprite animation) (not implemented;
+TODO).
+Currently a smoke puff will appear when an entity dies.
+
+The group `immortal` completely disables normal damage.
+
+Entities can define a special armor group, which is `punch_operable`. This
+group disables the regular damage mechanism for players punching it by hand or
+a non-tool item, so that it can do something else than take damage.
+
+On the Lua side, every punch calls:
+
+    entity:on_punch(puncher, time_from_last_punch, tool_capabilities, direction,
+                    damage)
+
+This should never be called directly, because damage is usually not handled by
+the entity itself.
+
+* `puncher` is the object performing the punch. Can be `nil`. Should never be
+  accessed unless absolutely required, to encourage interoperability.
+* `time_from_last_punch` is time from last punch (by `puncher`) or `nil`.
+* `tool_capabilities` can be `nil`.
+* `direction` is a unit vector, pointing from the source of the punch to
+   the punched object.
+* `damage` damage that will be done to entity
+Return value of this function will determine if damage is done by this function
+(retval true) or shall be done by engine (retval false)
+
+To punch an entity/object in Lua, call:
+
+  object:punch(puncher, time_from_last_punch, tool_capabilities, direction)
+
+* Return value is tool wear.
+* Parameters are equal to the above callback.
+* If `direction` equals `nil` and `puncher` does not equal `nil`, `direction`
+  will be automatically filled in based on the location of `puncher`.
+
+
+
+
+Metadata
+========
+
+Node Metadata
+-------------
+
+The instance of a node in the world normally only contains the three values
+mentioned in [Nodes]. However, it is possible to insert extra data into a node.
+It is called "node metadata"; See `NodeMetaRef`.
+
+Node metadata contains two things:
+
+* A key-value store
+* An inventory
+
+Some of the values in the key-value store are handled specially:
+
+* `formspec`: Defines a right-click inventory menu. See [Formspec].
+* `infotext`: Text shown on the screen when the node is pointed at
+
+Example:
+
+    local meta = minetest.get_meta(pos)
+    meta:set_string("formspec",
+            "size[8,9]"..
+            "list[context;main;0,0;8,4;]"..
+            "list[current_player;main;0,5;8,4;]")
+    meta:set_string("infotext", "Chest");
+    local inv = meta:get_inventory()
+    inv:set_size("main", 8*4)
+    print(dump(meta:to_table()))
+    meta:from_table({
+        inventory = {
+            main = {[1] = "default:dirt", [2] = "", [3] = "", [4] = "",
+                    [5] = "", [6] = "", [7] = "", [8] = "", [9] = "",
+                    [10] = "", [11] = "", [12] = "", [13] = "",
+                    [14] = "default:cobble", [15] = "", [16] = "", [17] = "",
+                    [18] = "", [19] = "", [20] = "default:cobble", [21] = "",
+                    [22] = "", [23] = "", [24] = "", [25] = "", [26] = "",
+                    [27] = "", [28] = "", [29] = "", [30] = "", [31] = "",
+                    [32] = ""}
+        },
+        fields = {
+            formspec = "size[8,9]list[context;main;0,0;8,4;]list[current_player;main;0,5;8,4;]",
+            infotext = "Chest"
+        }
+    })
+
+Item Metadata
+-------------
+
+Item stacks can store metadata too. See [`ItemStackMetaRef`].
+
+Item metadata only contains a key-value store.
+
+Some of the values in the key-value store are handled specially:
+
+* `description`: Set the item stack's description. Defaults to
+  `idef.description`.
+* `color`: A `ColorString`, which sets the stack's color.
+* `palette_index`: If the item has a palette, this is used to get the
+  current color from the palette.
+
+Example:
+
+    local meta = stack:get_meta()
+    meta:set_string("key", "value")
+    print(dump(meta:to_table()))
+
+
+
+
+Formspec
+========
+
+Formspec defines a menu. This supports inventories and some of the
+typical widgets like buttons, checkboxes, text input fields, etc.
+It is a string, with a somewhat strange format.
+
+A formspec is made out of formspec elements, which includes widgets
+like buttons but also can be used to set stuff like background color.
+
+Many formspec elements have a `name`, which is a unique identifier which
+is used when the server receives user input. You must not use the name
+"quit" for formspec elements.
+
+Spaces and newlines can be inserted between the blocks, as is used in the
+examples.
+
+Position and size units are inventory slots unless the new coordinate system
+is enabled. `X` and `Y` position the formspec element relative to the top left
+of the menu or container. `W` and `H` are its width and height values.
+
+If the new system is enabled, all elements have unified coordinates for all
+elements with no padding or spacing in between. This is highly recommended
+for new forms. See `real_coordinates[<bool>]` and `Migrating to Real
+Coordinates`.
+
+Inventories with a `player:<name>` inventory location are only sent to the
+player named `<name>`.
+
+When displaying text which can contain formspec code, e.g. text set by a player,
+use `minetest.formspec_escape`.
+For coloured text you can use `minetest.colorize`.
+
+Since formspec version 3, elements drawn in the order they are defined. All
+background elements are drawn before all other elements.
+
+**WARNING**: do _not_ use a element name starting with `key_`; those names are
+reserved to pass key press events to formspec!
+
+**WARNING**: Minetest allows you to add elements to every single formspec instance
+using `player:set_formspec_prepend()`, which may be the reason backgrounds are
+appearing when you don't expect them to, or why things are styled differently
+to normal. See [`no_prepend[]`] and [Styling Formspecs].
+
+Examples
+--------
+
+### Chest
+
+    size[8,9]
+    list[context;main;0,0;8,4;]
+    list[current_player;main;0,5;8,4;]
+
+### Furnace
+
+    size[8,9]
+    list[context;fuel;2,3;1,1;]
+    list[context;src;2,1;1,1;]
+    list[context;dst;5,1;2,2;]
+    list[current_player;main;0,5;8,4;]
+
+### Minecraft-like player inventory
+
+    size[8,7.5]
+    image[1,0.6;1,2;player.png]
+    list[current_player;main;0,3.5;8,4;]
+    list[current_player;craft;3,0;3,3;]
+    list[current_player;craftpreview;7,1;1,1;]
+
+Elements
+--------
+
+### `formspec_version[<version>]`
+
+* Set the formspec version to a certain number. If not specified,
+  version 1 is assumed.
+* Must be specified before `size` element.
+* Clients older than this version can neither show newer elements nor display
+  elements with new arguments correctly.
+* Available since feature `formspec_version_element`.
+
+### `size[<W>,<H>,<fixed_size>]`
+
+* Define the size of the menu in inventory slots
+* `fixed_size`: `true`/`false` (optional)
+* deprecated: `invsize[<W>,<H>;]`
+
+### `position[<X>,<Y>]`
+
+* Must be used after `size` element.
+* Defines the position on the game window of the formspec's `anchor` point.
+* For X and Y, 0.0 and 1.0 represent opposite edges of the game window,
+  for example:
+    * [0.0, 0.0] sets the position to the top left corner of the game window.
+    * [1.0, 1.0] sets the position to the bottom right of the game window.
+* Defaults to the center of the game window [0.5, 0.5].
+
+### `anchor[<X>,<Y>]`
+
+* Must be used after both `size` and `position` (if present) elements.
+* Defines the location of the anchor point within the formspec.
+* For X and Y, 0.0 and 1.0 represent opposite edges of the formspec,
+  for example:
+    * [0.0, 1.0] sets the anchor to the bottom left corner of the formspec.
+    * [1.0, 0.0] sets the anchor to the top right of the formspec.
+* Defaults to the center of the formspec [0.5, 0.5].
+
+* `position` and `anchor` elements need suitable values to avoid a formspec
+  extending off the game window due to particular game window sizes.
+
+### `no_prepend[]`
+
+* Must be used after the `size`, `position`, and `anchor` elements (if present).
+* Disables player:set_formspec_prepend() from applying to this formspec.
+
+### `real_coordinates[<bool>]`
+
+* INFORMATION: Enable it automatically using `formspec_version` version 2 or newer.
+* When set to true, all following formspec elements will use the new coordinate system.
+* If used immediately after `size`, `position`, `anchor`, and `no_prepend` elements
+  (if present), the form size will use the new coordinate system.
+* **Note**: Formspec prepends are not affected by the coordinates in the main form.
+  They must enable it explicitly.
+* For information on converting forms to the new coordinate system, see `Migrating
+  to Real Coordinates`.
+
+### `container[<X>,<Y>]`
+
+* Start of a container block, moves all physical elements in the container by
+  (X, Y).
+* Must have matching `container_end`
+* Containers can be nested, in which case the offsets are added
+  (child containers are relative to parent containers)
+
+### `container_end[]`
+
+* End of a container, following elements are no longer relative to this
+  container.
+
+### `list[<inventory location>;<list name>;<X>,<Y>;<W>,<H>;]`
+
+* Show an inventory list if it has been sent to the client. Nothing will
+  be shown if the inventory list is of size 0.
+* **Note**: With the new coordinate system, the spacing between inventory
+  slots is one-fourth the size of an inventory slot.
+
+### `list[<inventory location>;<list name>;<X>,<Y>;<W>,<H>;<starting item index>]`
+
+* Show an inventory list if it has been sent to the client. Nothing will
+  be shown if the inventory list is of size 0.
+* **Note**: With the new coordinate system, the spacing between inventory
+  slots is one-fourth the size of an inventory slot.
+
+### `listring[<inventory location>;<list name>]`
+
+* Allows to create a ring of inventory lists
+* Shift-clicking on items in one element of the ring
+  will send them to the next inventory list inside the ring
+* The first occurrence of an element inside the ring will
+  determine the inventory where items will be sent to
+
+### `listring[]`
+
+* Shorthand for doing `listring[<inventory location>;<list name>]`
+  for the last two inventory lists added by list[...]
+
+### `listcolors[<slot_bg_normal>;<slot_bg_hover>]`
+
+* Sets background color of slots as `ColorString`
+* Sets background color of slots on mouse hovering
+
+### `listcolors[<slot_bg_normal>;<slot_bg_hover>;<slot_border>]`
+
+* Sets background color of slots as `ColorString`
+* Sets background color of slots on mouse hovering
+* Sets color of slots border
+
+### `listcolors[<slot_bg_normal>;<slot_bg_hover>;<slot_border>;<tooltip_bgcolor>;<tooltip_fontcolor>]`
+
+* Sets background color of slots as `ColorString`
+* Sets background color of slots on mouse hovering
+* Sets color of slots border
+* Sets default background color of tooltips
+* Sets default font color of tooltips
+
+### `tooltip[<gui_element_name>;<tooltip_text>;<bgcolor>;<fontcolor>]`
+
+* Adds tooltip for an element
+* `bgcolor` tooltip background color as `ColorString` (optional)
+* `fontcolor` tooltip font color as `ColorString` (optional)
+
+### `tooltip[<X>,<Y>;<W>,<H>;<tooltip_text>;<bgcolor>;<fontcolor>]`
+
+* Adds tooltip for an area. Other tooltips will take priority when present.
+* `bgcolor` tooltip background color as `ColorString` (optional)
+* `fontcolor` tooltip font color as `ColorString` (optional)
+
+### `image[<X>,<Y>;<W>,<H>;<texture name>]`
+
+* Show an image
+
+### `animated_image[<X>,<Y>;<W>,<H>;<name>;<texture name>;<frame count>;<frame duration>;<frame start>]`
+
+* Show an animated image. The image is drawn like a "vertical_frames" tile
+    animation (See [Tile animation definition]), but uses a frame count/duration
+    for simplicity
+* `name`: Element name to send when an event occurs. The event value is the index of the current frame.
+* `texture name`: The image to use.
+* `frame count`: The number of frames animating the image.
+* `frame duration`: Milliseconds between each frame. `0` means the frames don't advance.
+* `frame start` (Optional): The index of the frame to start on. Default `1`.
+
+### `item_image[<X>,<Y>;<W>,<H>;<item name>]`
+
+* Show an inventory image of registered item/node
+
+### `bgcolor[<bgcolor>;<fullscreen>;<fbgcolor>]`
+
+* Sets background color of formspec.
+* `bgcolor` and `fbgcolor` (optional) are `ColorString`s, they define the color
+  of the non-fullscreen and the fullscreen background.
+* `fullscreen` (optional) can be one of the following:
+  * `false`: Only the non-fullscreen background color is drawn. (default)
+  * `true`: Only the fullscreen background color is drawn.
+  * `both`: The non-fullscreen and the fullscreen background color are drawn.
+  * `neither`: No background color is drawn.
+* Note: Leave a parameter empty to not modify the value.
+* Note: `fbgcolor`, leaving parameters empty and values for `fullscreen` that
+  are not bools are only available since formspec version 3.
+
+### `background[<X>,<Y>;<W>,<H>;<texture name>]`
+
+* Example for formspec 8x4 in 16x resolution: image shall be sized
+  8 times 16px  times  4 times 16px.
+
+### `background[<X>,<Y>;<W>,<H>;<texture name>;<auto_clip>]`
+
+* Example for formspec 8x4 in 16x resolution:
+  image shall be sized 8 times 16px  times  4 times 16px
+* If `auto_clip` is `true`, the background is clipped to the formspec size
+  (`x` and `y` are used as offset values, `w` and `h` are ignored)
+
+### `background9[<X>,<Y>;<W>,<H>;<texture name>;<auto_clip>;<middle>]`
+
+* 9-sliced background. See https://en.wikipedia.org/wiki/9-slice_scaling
+* Middle is a rect which defines the middle of the 9-slice.
+       * `x` - The middle will be x pixels from all sides.
+       * `x,y` - The middle will be x pixels from the horizontal and y from the vertical.
+       * `x,y,x2,y2` - The middle will start at x,y, and end at x2, y2. Negative x2 and y2 values
+               will be added to the width and height of the texture, allowing it to be used as the
+               distance from the far end.
+       * All numbers in middle are integers.
+* Example for formspec 8x4 in 16x resolution:
+  image shall be sized 8 times 16px  times  4 times 16px
+* If `auto_clip` is `true`, the background is clipped to the formspec size
+  (`x` and `y` are used as offset values, `w` and `h` are ignored)
+* Available since formspec version 2
+
+### `pwdfield[<X>,<Y>;<W>,<H>;<name>;<label>]`
+
+* Textual password style field; will be sent to server when a button is clicked
+* When enter is pressed in field, fields.key_enter_field will be sent with the
+  name of this field.
+* With the old coordinate system, fields are a set height, but will be vertically
+  centred on `H`. With the new coordinate system, `H` will modify the height.
+* `name` is the name of the field as returned in fields to `on_receive_fields`
+* `label`, if not blank, will be text printed on the top left above the field
+* See `field_close_on_enter` to stop enter closing the formspec
+
+### `field[<X>,<Y>;<W>,<H>;<name>;<label>;<default>]`
+
+* Textual field; will be sent to server when a button is clicked
+* When enter is pressed in field, `fields.key_enter_field` will be sent with
+  the name of this field.
+* With the old coordinate system, fields are a set height, but will be vertically
+  centred on `H`. With the new coordinate system, `H` will modify the height.
+* `name` is the name of the field as returned in fields to `on_receive_fields`
+* `label`, if not blank, will be text printed on the top left above the field
+* `default` is the default value of the field
+    * `default` may contain variable references such as `${text}` which
+      will fill the value from the metadata value `text`
+    * **Note**: no extra text or more than a single variable is supported ATM.
+* See `field_close_on_enter` to stop enter closing the formspec
+
+### `field[<name>;<label>;<default>]`
+
+* As above, but without position/size units
+* When enter is pressed in field, `fields.key_enter_field` will be sent with
+  the name of this field.
+* Special field for creating simple forms, such as sign text input
+* Must be used without a `size[]` element
+* A "Proceed" button will be added automatically
+* See `field_close_on_enter` to stop enter closing the formspec
+
+### `field_close_on_enter[<name>;<close_on_enter>]`
+
+* <name> is the name of the field
+* if <close_on_enter> is false, pressing enter in the field will submit the
+  form but not close it.
+* defaults to true when not specified (ie: no tag for a field)
+
+### `textarea[<X>,<Y>;<W>,<H>;<name>;<label>;<default>]`
+
+* Same as fields above, but with multi-line input
+* If the text overflows, a vertical scrollbar is added.
+* If the name is empty, the textarea is read-only and
+  the background is not shown, which corresponds to a multi-line label.
+
+### `label[<X>,<Y>;<label>]`
+
+* The label formspec element displays the text set in `label`
+  at the specified position.
+* **Note**: If the new coordinate system is enabled, labels are
+  positioned from the center of the text, not the top.
+* The text is displayed directly without automatic line breaking,
+  so label should not be used for big text chunks.  Newlines can be
+  used to make labels multiline.
+* **Note**: With the new coordinate system, newlines are spaced with
+  half a coordinate.  With the old system, newlines are spaced 2/5 of
+  an inventory slot.
+
+### `hypertext[<X>,<Y>;<W>,<H>;<name>;<text>]`
+* Displays a static formatted text with hyperlinks.
+* **Note**: This element is currently unstable and subject to change.
+* `x`, `y`, `w` and `h` work as per field
+* `name` is the name of the field as returned in fields to `on_receive_fields` in case of action in text.
+* `text` is the formatted text using `Markup Language` described below.
+
+### `vertlabel[<X>,<Y>;<label>]`
+* Textual label drawn vertically
+* `label` is the text on the label
+* **Note**: If the new coordinate system is enabled, vertlabels are
+  positioned from the center of the text, not the left.
+
+### `button[<X>,<Y>;<W>,<H>;<name>;<label>]`
+
+* Clickable button. When clicked, fields will be sent.
+* With the old coordinate system, buttons are a set height, but will be vertically
+  centred on `H`. With the new coordinate system, `H` will modify the height.
+* `label` is the text on the button
+
+### `image_button[<X>,<Y>;<W>,<H>;<texture name>;<name>;<label>]`
+
+* `texture name` is the filename of an image
+* **Note**: Height is supported on both the old and new coordinate systems
+  for image_buttons.
+
+### `image_button[<X>,<Y>;<W>,<H>;<texture name>;<name>;<label>;<noclip>;<drawborder>;<pressed texture name>]`
+
+* `texture name` is the filename of an image
+* `noclip=true` means the image button doesn't need to be within specified
+  formsize.
+* `drawborder`: draw button border or not
+* `pressed texture name` is the filename of an image on pressed state
+
+### `item_image_button[<X>,<Y>;<W>,<H>;<item name>;<name>;<label>]`
+
+* `item name` is the registered name of an item/node
+* The item description will be used as the tooltip. This can be overridden with
+  a tooltip element.
+
+### `button_exit[<X>,<Y>;<W>,<H>;<name>;<label>]`
+
+* When clicked, fields will be sent and the form will quit.
+* Same as `button` in all other respects.
+
+### `image_button_exit[<X>,<Y>;<W>,<H>;<texture name>;<name>;<label>]`
+
+* When clicked, fields will be sent and the form will quit.
+* Same as `image_button` in all other respects.
+
+### `textlist[<X>,<Y>;<W>,<H>;<name>;<listelem 1>,<listelem 2>,...,<listelem n>]`
+
+* Scrollable item list showing arbitrary text elements
+* `name` fieldname sent to server on doubleclick value is current selected
+  element.
+* `listelements` can be prepended by #color in hexadecimal format RRGGBB
+  (only).
+    * if you want a listelement to start with "#" write "##".
+
+### `textlist[<X>,<Y>;<W>,<H>;<name>;<listelem 1>,<listelem 2>,...,<listelem n>;<selected idx>;<transparent>]`
+
+* Scrollable itemlist showing arbitrary text elements
+* `name` fieldname sent to server on doubleclick value is current selected
+  element.
+* `listelements` can be prepended by #RRGGBB (only) in hexadecimal format
+    * if you want a listelement to start with "#" write "##"
+* Index to be selected within textlist
+* `true`/`false`: draw transparent background
+* See also `minetest.explode_textlist_event`
+  (main menu: `core.explode_textlist_event`).
+
+### `tabheader[<X>,<Y>;<name>;<caption 1>,<caption 2>,...,<caption n>;<current_tab>;<transparent>;<draw_border>]`
+
+* Show a tab**header** at specific position (ignores formsize)
+* `X` and `Y`: position of the tabheader
+* *Note*: Width and height are automatically chosen with this syntax
+* `name` fieldname data is transferred to Lua
+* `caption 1`...: name shown on top of tab
+* `current_tab`: index of selected tab 1...
+* `transparent` (optional): show transparent
+* `draw_border` (optional): draw border
+
+### `tabheader[<X>,<Y>;<H>;<name>;<caption 1>,<caption 2>,...,<caption n>;<current_tab>;<transparent>;<draw_border>]`
+
+* Show a tab**header** at specific position (ignores formsize)
+* **Important note**: This syntax for tabheaders can only be used with the
+  new coordinate system.
+* `X` and `Y`: position of the tabheader
+* `H`: height of the tabheader. Width is automatically determined with this syntax.
+* `name` fieldname data is transferred to Lua
+* `caption 1`...: name shown on top of tab
+* `current_tab`: index of selected tab 1...
+* `transparent` (optional): show transparent
+* `draw_border` (optional): draw border
+
+### `tabheader[<X>,<Y>;<W>,<H>;<name>;<caption 1>,<caption 2>,...,<caption n>;<current_tab>;<transparent>;<draw_border>]`
+
+* Show a tab**header** at specific position (ignores formsize)
+* **Important note**: This syntax for tabheaders can only be used with the
+  new coordinate system.
+* `X` and `Y`: position of the tabheader
+* `W` and `H`: width and height of the tabheader
+* `name` fieldname data is transferred to Lua
+* `caption 1`...: name shown on top of tab
+* `current_tab`: index of selected tab 1...
+* `transparent` (optional): show transparent
+* `draw_border` (optional): draw border
+
+### `box[<X>,<Y>;<W>,<H>;<color>]`
+
+* Simple colored box
+* `color` is color specified as a `ColorString`.
+  If the alpha component is left blank, the box will be semitransparent.
+
+### `dropdown[<X>,<Y>;<W>;<name>;<item 1>,<item 2>, ...,<item n>;<selected idx>]`
+
+* Show a dropdown field
+* **Important note**: There are two different operation modes:
+    1. handle directly on change (only changed dropdown is submitted)
+    2. read the value on pressing a button (all dropdown values are available)
+* `X` and `Y`: position of the dropdown
+* `W`: width of the dropdown. Height is automatically chosen with this syntax.
+* Fieldname data is transferred to Lua
+* Items to be shown in dropdown
+* Index of currently selected dropdown item
+
+### `dropdown[<X>,<Y>;<W>,<H>;<name>;<item 1>,<item 2>, ...,<item n>;<selected idx>]`
+
+* Show a dropdown field
+* **Important note**: This syntax for dropdowns can only be used with the
+  new coordinate system.
+* **Important note**: There are two different operation modes:
+    1. handle directly on change (only changed dropdown is submitted)
+    2. read the value on pressing a button (all dropdown values are available)
+* `X` and `Y`: position of the dropdown
+* `W` and `H`: width and height of the dropdown
+* Fieldname data is transferred to Lua
+* Items to be shown in dropdown
+* Index of currently selected dropdown item
+
+### `checkbox[<X>,<Y>;<name>;<label>;<selected>]`
+
+* Show a checkbox
+* `name` fieldname data is transferred to Lua
+* `label` to be shown left of checkbox
+* `selected` (optional): `true`/`false`
+* **Note**: If the new coordinate system is enabled, checkboxes are
+  positioned from the center of the checkbox, not the top.
+
+### `scrollbar[<X>,<Y>;<W>,<H>;<orientation>;<name>;<value>]`
+
+* Show a scrollbar using options defined by the previous `scrollbaroptions[]`
+* There are two ways to use it:
+    1. handle the changed event (only changed scrollbar is available)
+    2. read the value on pressing a button (all scrollbars are available)
+* `orientation`:  `vertical`/`horizontal`
+* Fieldname data is transferred to Lua
+* Value of this trackbar is set to (`0`-`1000`) by default
+* See also `minetest.explode_scrollbar_event`
+  (main menu: `core.explode_scrollbar_event`).
+
+### `scrollbaroptions[opt1;opt2;...]`
+* Sets options for all following `scrollbar[]` elements
+* `min=<int>`
+    * Sets scrollbar minimum value, defaults to `0`.
+* `max=<int>`
+    * Sets scrollbar maximum value, defaults to `1000`.
+      If the max is equal to the min, the scrollbar will be disabled.
+* `smallstep=<int>`
+    * Sets scrollbar step value when the arrows are clicked or the mouse wheel is
+      scrolled.
+    * If this is set to a negative number, the value will be reset to `10`.
+* `largestep=<int>`
+    * Sets scrollbar step value used by page up and page down.
+    * If this is set to a negative number, the value will be reset to `100`.
+* `thumbsize=<int>`
+    * Sets size of the thumb on the scrollbar. Size is calculated in the number of
+      units the thumb spans out of the range of the scrollbar values.
+    * Example: If a scrollbar has a `min` of 1 and a `max` of 100, a thumbsize of 10
+      would span a tenth of the scrollbar space.
+    * If this is set to zero or less, the value will be reset to `1`.
+* `arrows=<show/hide/default>`
+    * Whether to show the arrow buttons on the scrollbar. `default` hides the arrows
+      when the scrollbar gets too small, but shows them otherwise.
+
+### `table[<X>,<Y>;<W>,<H>;<name>;<cell 1>,<cell 2>,...,<cell n>;<selected idx>]`
+
+* Show scrollable table using options defined by the previous `tableoptions[]`
+* Displays cells as defined by the previous `tablecolumns[]`
+* `name`: fieldname sent to server on row select or doubleclick
+* `cell 1`...`cell n`: cell contents given in row-major order
+* `selected idx`: index of row to be selected within table (first row = `1`)
+* See also `minetest.explode_table_event`
+  (main menu: `core.explode_table_event`).
+
+### `tableoptions[<opt 1>;<opt 2>;...]`
+
+* Sets options for `table[]`
+* `color=#RRGGBB`
+    * default text color (`ColorString`), defaults to `#FFFFFF`
+* `background=#RRGGBB`
+    * table background color (`ColorString`), defaults to `#000000`
+* `border=<true/false>`
+    * should the table be drawn with a border? (default: `true`)
+* `highlight=#RRGGBB`
+    * highlight background color (`ColorString`), defaults to `#466432`
+* `highlight_text=#RRGGBB`
+    * highlight text color (`ColorString`), defaults to `#FFFFFF`
+* `opendepth=<value>`
+    * all subtrees up to `depth < value` are open (default value = `0`)
+    * only useful when there is a column of type "tree"
+
+### `tablecolumns[<type 1>,<opt 1a>,<opt 1b>,...;<type 2>,<opt 2a>,<opt 2b>;...]`
+
+* Sets columns for `table[]`
+* Types: `text`, `image`, `color`, `indent`, `tree`
+    * `text`:   show cell contents as text
+    * `image`:  cell contents are an image index, use column options to define
+                images.
+    * `color`:  cell contents are a ColorString and define color of following
+                cell.
+    * `indent`: cell contents are a number and define indentation of following
+                cell.
+    * `tree`:   same as indent, but user can open and close subtrees
+                (treeview-like).
+* Column options:
+    * `align=<value>`
+        * for `text` and `image`: content alignment within cells.
+          Available values: `left` (default), `center`, `right`, `inline`
+    * `width=<value>`
+        * for `text` and `image`: minimum width in em (default: `0`)
+        * for `indent` and `tree`: indent width in em (default: `1.5`)
+    * `padding=<value>`: padding left of the column, in em (default `0.5`).
+      Exception: defaults to 0 for indent columns
+    * `tooltip=<value>`: tooltip text (default: empty)
+    * `image` column options:
+        * `0=<value>` sets image for image index 0
+        * `1=<value>` sets image for image index 1
+        * `2=<value>` sets image for image index 2
+        * and so on; defined indices need not be contiguous empty or
+          non-numeric cells are treated as `0`.
+    * `color` column options:
+        * `span=<value>`: number of following columns to affect
+          (default: infinite).
+
+### `style[<name 1>,<name 2>,...;<prop1>;<prop2>;...]`
+
+* Set the style for the named element(s) `name`.
+* Note: this **must** be before the element is defined.
+* See [Styling Formspecs].
+
+
+### `style_type[<type 1>,<type 2>,...;<prop1>;<prop2>;...]`
+
+* Sets the style for all elements of type(s) `type` which appear after this element.
+* See [Styling Formspecs].
+
+Migrating to Real Coordinates
+-----------------------------
+
+In the old system, positions included padding and spacing. Padding is a gap between
+the formspec window edges and content, and spacing is the gaps between items. For
+example, two `1x1` elements at `0,0` and `1,1` would have a spacing of `5/4` between them,
+and a padding of `3/8` from the formspec edge. It may be easiest to recreate old layouts
+in the new coordinate system from scratch.
+
+To recreate an old layout with padding, you'll need to pass the positions and sizes
+through the following formula to re-introduce padding:
+
+```
+pos = (oldpos + 1)*spacing + padding
+where
+    padding = 3/8
+    spacing = 5/4
+```
+
+You'll need to change the `size[]` tag like this:
+
+```
+size = (oldsize-1)*spacing + padding*2 + 1
+```
+
+A few elements had random offsets in the old system. Here is a table which shows these
+offsets when migrating:
+
+| Element |  Position  |  Size   | Notes
+|---------|------------|---------|-------
+| box     | +0.3, +0.1 | 0, -0.4 |
+| button  |            |         | Buttons now support height, so set h = 2 * 15/13 * 0.35, and reposition if h ~= 15/13 * 0.35 before
+| list    |            |         | Spacing is now 0.25 for both directions, meaning lists will be taller in height
+| label   | 0, +0.3    |         | The first line of text is now positioned centered exactly at the position specified
+
+Styling Formspecs
+-----------------
+
+Formspec elements can be themed using the style elements:
+
+    style[<name 1>,<name 2>,...;<prop1>;<prop2>;...]
+    style_type[<type 1>,<type 2>,...;<prop1>;<prop2>;...]
+
+Where a prop is:
+
+    property_name=property_value
+
+A name/type can optionally be a comma separated list of names/types, like so:
+
+    world_delete,world_create,world_configure
+    button,image_button
+
+For example:
+
+    style_type[button;bgcolor=#006699]
+    style[world_delete;bgcolor=red;textcolor=yellow]
+    button[4,3.95;2.6,1;world_delete;Delete]
+
+Setting a property to nothing will reset it to the default value. For example:
+
+    style_type[button;bgimg=button.png;bgimg_pressed=button_pressed.png;border=false]
+    style[btn_exit;bgimg=;bgimg_pressed=;border=;bgcolor=red]
+
+
+### Supported Element Types
+
+Some types may inherit styles from parent types.
+
+* animated_image, inherits from image
+* button
+* button_exit, inherits from button
+* checkbox
+* scrollbar
+* table
+* textlist
+* dropdown
+* field
+* pwdfield, inherits from field
+* textarea
+* label
+* vertlabel, inherits from field
+* image_button
+* item_image_button
+* tabheader
+
+
+### Valid Properties
+
+* animated_image
+    * noclip - boolean, set to true to allow the element to exceed formspec bounds.
+* box
+    * noclip - boolean, set to true to allow the element to exceed formspec bounds.
+        * Default to false in formspec_version version 3 or higher
+* button, button_exit, image_button, item_image_button
+    * alpha - boolean, whether to draw alpha in bgimg. Default true.
+    * bgcolor - color, sets button tint.
+    * bgcolor_hovered - color when hovered. Defaults to a lighter bgcolor when not provided.
+    * bgcolor_pressed - color when pressed. Defaults to a darker bgcolor when not provided.
+    * bgimg - standard background image. Defaults to none.
+    * bgimg_hovered - background image when hovered. Defaults to bgimg when not provided.
+    * bgimg_middle - Makes the bgimg textures render in 9-sliced mode and defines the middle rect.
+                     See background9[] documentation for more details
+    * bgimg_pressed - background image when pressed. Defaults to bgimg when not provided.
+    * border - boolean, draw border. Set to false to hide the bevelled button pane. Default true.
+    * noclip - boolean, set to true to allow the element to exceed formspec bounds.
+    * textcolor - color, default white.
+* checkbox
+    * noclip - boolean, set to true to allow the element to exceed formspec bounds.
+* scrollbar
+    * noclip - boolean, set to true to allow the element to exceed formspec bounds.
+* table, textlist
+    * noclip - boolean, set to true to allow the element to exceed formspec bounds.
+* dropdown
+    * noclip - boolean, set to true to allow the element to exceed formspec bounds.
+* field, pwdfield, textarea
+    * border - set to false to hide the textbox background and border. Default true.
+    * noclip - boolean, set to true to allow the element to exceed formspec bounds.
+    * textcolor - color. Default white.
+* image
+    * noclip - boolean, set to true to allow the element to exceed formspec bounds.
+        * Default to false in formspec_version version 3 or higher
+* item_image
+    * noclip - boolean, set to true to allow the element to exceed formspec bounds. Default to false.
+* label, vertlabel
+    * noclip - boolean, set to true to allow the element to exceed formspec bounds.
+* image_button (additional properties)
+    * fgimg - standard image. Defaults to none.
+    * fgimg_hovered - image when hovered. Defaults to fgimg when not provided.
+    * fgimg_pressed - image when pressed. Defaults to fgimg when not provided.
+    * NOTE: The parameters of any given image_button will take precedence over fgimg/fgimg_pressed
+* tabheader
+    * noclip - boolean, set to true to allow the element to exceed formspec bounds.
+    * textcolor - color. Default white.
+
+Markup Language
+---------------
+
+Markup language used in `hypertext[]` elements uses tags that look like HTML tags.
+The markup language is currently unstable and subject to change. Use with caution.
+Some tags can enclose text, they open with `<tagname>` and close with `</tagname>`.
+Tags can have attributes, in that case, attributes are in the opening tag in
+form of a key/value separated with equal signs. Attribute values should not be quoted.
+
+These are the technically basic tags but see below for usual tags. Base tags are:
+
+`<style color=... font=... size=...>...</style>`
+
+Changes the style of the text.
+
+* `color`: Text color. Given color is a `colorspec`.
+* `size`: Text size.
+* `font`: Text font (`mono` or `normal`).
+
+`<global background=... margin=... valign=... color=... hovercolor=... size=... font=... halign=... >`
+
+Sets global style.
+
+Global only styles:
+* `background`: Text background, a `colorspec` or `none`.
+* `margin`: Page margins in pixel.
+* `valign`: Text vertical alignment (`top`, `middle`, `bottom`).
+
+Inheriting styles (affects child elements):
+* `color`: Default text color. Given color is a `colorspec`.
+* `hovercolor`: Color of <action> tags when mouse is over.
+* `size`: Default text size.
+* `font`: Default text font (`mono` or `normal`).
+* `halign`: Default text horizontal alignment (`left`, `right`, `center`, `justify`).
+
+This tag needs to be placed only once as it changes the global settings of the
+text. Anyway, if several tags are placed, each changed will be made in the order
+tags appear.
+
+`<tag name=... color=... hovercolor=... font=... size=...>`
+
+Defines or redefines tag style. This can be used to define new tags.
+* `name`: Name of the tag to define or change.
+* `color`: Text color. Given color is a `colorspec`.
+* `hovercolor`: Text color when element hovered (only for `action` tags). Given color is a `colorspec`.
+* `size`: Text size.
+* `font`: Text font (`mono` or `normal`).
+
+Following tags are the usual tags for text layout. They are defined by default.
+Other tags can be added using `<tag ...>` tag.
+
+`<normal>...</normal>`: Normal size text
+
+`<big>...</big>`: Big text
+
+`<bigger>...</bigger>`: Bigger text
+
+`<center>...</center>`: Centered text
+
+`<left>...</left>`: Left-aligned text
+
+`<right>...</right>`: Right-aligned text
+
+`<justify>...</justify>`: Justified text
+
+`<mono>...</mono>`: Monospaced font
+
+`<b>...</b>`, `<i>...</i>`, `<u>...</u>`: Bold, italic, underline styles.
+
+`<action name=...>...</action>`
+
+Make that text a clickable text triggering an action.
+
+* `name`: Name of the action (mandatory).
+
+When clicked, the formspec is send to the server. The value of the text field
+sent to `on_player_receive_fields` will be "action:" concatenated to the action
+name.
+
+`<img name=... float=... width=... height=...>`
+
+Draws an image which is present in the client media cache.
+
+* `name`: Name of the texture (mandatory).
+* `float`: If present, makes the image floating (`left` or `right`).
+* `width`: Force image width instead of taking texture width.
+* `height`: Force image height instead of taking texture height.
+
+If only width or height given, texture aspect is kept.
+
+`<item name=... float=... width=... height=... rotate=...>`
+
+Draws an item image.
+
+* `name`: Item string of the item to draw (mandatory).
+* `float`: If present, makes the image floating (`left` or `right`).
+* `width`: Item image width.
+* `height`: Item image height.
+* `rotate`: Rotate item image if set to `yes` or `X,Y,Z`. X, Y and Z being
+rotation speeds in percent of standard speed (-1000 to 1000). Works only if
+`inventory_items_animations` is set to true.
+* `angle`: Angle in which the item image is shown. Value has `X,Y,Z` form.
+X, Y and Z being angles around each three axes. Works only if
+`inventory_items_animations` is set to true.
+
+Inventory
+=========
+
+Inventory locations
+-------------------
+
+* `"context"`: Selected node metadata (deprecated: `"current_name"`)
+* `"current_player"`: Player to whom the menu is shown
+* `"player:<name>"`: Any player
+* `"nodemeta:<X>,<Y>,<Z>"`: Any node metadata
+* `"detached:<name>"`: A detached inventory
+
+Player Inventory lists
+----------------------
+
+* `main`: list containing the default inventory
+* `craft`: list containing the craft input
+* `craftpreview`: list containing the craft prediction
+* `craftresult`: list containing the crafted output
+* `hand`: list containing an override for the empty hand
+    * Is not created automatically, use `InvRef:set_size`
+    * Is only used to enhance the empty hand's tool capabilities
+
+Colors
+======
+
+`ColorString`
+-------------
+
+`#RGB` defines a color in hexadecimal format.
+
+`#RGBA` defines a color in hexadecimal format and alpha channel.
+
+`#RRGGBB` defines a color in hexadecimal format.
+
+`#RRGGBBAA` defines a color in hexadecimal format and alpha channel.
+
+Named colors are also supported and are equivalent to
+[CSS Color Module Level 4](http://dev.w3.org/csswg/css-color/#named-colors).
+To specify the value of the alpha channel, append `#AA` to the end of the color
+name (e.g. `colorname#08`). For named colors the hexadecimal string
+representing the alpha value must (always) be two hexadecimal digits.
+
+`ColorSpec`
+-----------
+
+A ColorSpec specifies a 32-bit color. It can be written in any of the following
+forms:
+
+* table form: Each element ranging from 0..255 (a, if absent, defaults to 255):
+    * `colorspec = {a=255, r=0, g=255, b=0}`
+* numerical form: The raw integer value of an ARGB8 quad:
+    * `colorspec = 0xFF00FF00`
+* string form: A ColorString (defined above):
+    * `colorspec = "green"`
+
+
+
+
+Escape sequences
+================
+
+Most text can contain escape sequences, that can for example color the text.
+There are a few exceptions: tab headers, dropdowns and vertical labels can't.
+The following functions provide escape sequences:
+
+* `minetest.get_color_escape_sequence(color)`:
+    * `color` is a ColorString
+    * The escape sequence sets the text color to `color`
+* `minetest.colorize(color, message)`:
+    * Equivalent to:
+      `minetest.get_color_escape_sequence(color) ..
+      message ..
+      minetest.get_color_escape_sequence("#ffffff")`
+* `minetest.get_background_escape_sequence(color)`
+    * `color` is a ColorString
+    * The escape sequence sets the background of the whole text element to
+      `color`. Only defined for item descriptions and tooltips.
+* `minetest.strip_foreground_colors(str)`
+    * Removes foreground colors added by `get_color_escape_sequence`.
+* `minetest.strip_background_colors(str)`
+    * Removes background colors added by `get_background_escape_sequence`.
+* `minetest.strip_colors(str)`
+    * Removes all color escape sequences.
+
+
+
+
+Spatial Vectors
+===============
+A spatial vector is similar to a position, but instead using
+absolute world coordinates, it uses *relative* coordinates, relative to
+no particular point.
+
+Internally, it is implemented as a table with the 3 fields
+`x`, `y` and `z`. Example: `{x = 0, y = 1, z = 0}`.
+
+For the following functions, `v`, `v1`, `v2` are vectors,
+`p1`, `p2` are positions:
+
+* `vector.new(a[, b, c])`:
+    * Returns a vector.
+    * A copy of `a` if `a` is a vector.
+    * `{x = a, y = b, z = c}`, if all of `a`, `b`, `c` are defined numbers.
+* `vector.direction(p1, p2)`:
+    * Returns a vector of length 1 with direction `p1` to `p2`.
+    * If `p1` and `p2` are identical, returns `{x = 0, y = 0, z = 0}`.
+* `vector.distance(p1, p2)`:
+    * Returns zero or a positive number, the distance between `p1` and `p2`.
+* `vector.length(v)`:
+    * Returns zero or a positive number, the length of vector `v`.
+* `vector.normalize(v)`:
+    * Returns a vector of length 1 with direction of vector `v`.
+    * If `v` has zero length, returns `{x = 0, y = 0, z = 0}`.
+* `vector.floor(v)`:
+    * Returns a vector, each dimension rounded down.
+* `vector.round(v)`:
+    * Returns a vector, each dimension rounded to nearest integer.
+* `vector.apply(v, func)`:
+    * Returns a vector where the function `func` has been applied to each
+      component.
+* `vector.equals(v1, v2)`:
+    * Returns a boolean, `true` if the vectors are identical.
+* `vector.sort(v1, v2)`:
+    * Returns in order minp, maxp vectors of the cuboid defined by `v1`, `v2`.
+* `vector.angle(v1, v2)`:
+    * Returns the angle between `v1` and `v2` in radians.
+* `vector.dot(v1, v2)`
+    * Returns the dot product of `v1` and `v2`
+* `vector.cross(v1, v2)`
+    * Returns the cross product of `v1` and `v2`
+
+For the following functions `x` can be either a vector or a number:
+
+* `vector.add(v, x)`:
+    * Returns a vector.
+    * If `x` is a vector: Returns the sum of `v` and `x`.
+    * If `x` is a number: Adds `x` to each component of `v`.
+* `vector.subtract(v, x)`:
+    * Returns a vector.
+    * If `x` is a vector: Returns the difference of `v` subtracted by `x`.
+    * If `x` is a number: Subtracts `x` from each component of `v`.
+* `vector.multiply(v, x)`:
+    * Returns a scaled vector or Schur product.
+* `vector.divide(v, x)`:
+    * Returns a scaled vector or Schur quotient.
+
+
+
+
+Helper functions
+================
+
+* `dump2(obj, name, dumped)`: returns a string which makes `obj`
+  human-readable, handles reference loops.
+    * `obj`: arbitrary variable
+    * `name`: string, default: `"_"`
+    * `dumped`: table, default: `{}`
+* `dump(obj, dumped)`: returns a string which makes `obj` human-readable
+    * `obj`: arbitrary variable
+    * `dumped`: table, default: `{}`
+* `math.hypot(x, y)`
+    * Get the hypotenuse of a triangle with legs x and y.
+      Useful for distance calculation.
+* `math.sign(x, tolerance)`: returns `-1`, `0` or `1`
+    * Get the sign of a number.
+    * tolerance: number, default: `0.0`
+    * If the absolute value of `x` is within the `tolerance` or `x` is NaN,
+      `0` is returned.
+* `math.factorial(x)`: returns the factorial of `x`
+* `string.split(str, separator, include_empty, max_splits, sep_is_pattern)`
+    * `separator`: string, default: `","`
+    * `include_empty`: boolean, default: `false`
+    * `max_splits`: number, if it's negative, splits aren't limited,
+      default: `-1`
+    * `sep_is_pattern`: boolean, it specifies whether separator is a plain
+      string or a pattern (regex), default: `false`
+    * e.g. `"a,b":split","` returns `{"a","b"}`
+* `string:trim()`: returns the string without whitespace pre- and suffixes
+    * e.g. `"\n \t\tfoo bar\t ":trim()` returns `"foo bar"`
+* `minetest.wrap_text(str, limit, as_table)`: returns a string or table
+    * Adds newlines to the string to keep it within the specified character
+      limit
+    * Note that the returned lines may be longer than the limit since it only
+      splits at word borders.
+    * `limit`: number, maximal amount of characters in one line
+    * `as_table`: boolean, if set to true, a table of lines instead of a string
+      is returned, default: `false`
+* `minetest.pos_to_string(pos, decimal_places)`: returns string `"(X,Y,Z)"`
+    * `pos`: table {x=X, y=Y, z=Z}
+    * Converts the position `pos` to a human-readable, printable string
+    * `decimal_places`: number, if specified, the x, y and z values of
+      the position are rounded to the given decimal place.
+* `minetest.string_to_pos(string)`: returns a position or `nil`
+    * Same but in reverse.
+    * If the string can't be parsed to a position, nothing is returned.
+* `minetest.string_to_area("(X1, Y1, Z1) (X2, Y2, Z2)")`: returns two positions
+    * Converts a string representing an area box into two positions
+* `minetest.formspec_escape(string)`: returns a string
+    * escapes the characters "[", "]", "\", "," and ";", which can not be used
+      in formspecs.
+* `minetest.is_yes(arg)`
+    * returns true if passed 'y', 'yes', 'true' or a number that isn't zero.
+* `minetest.is_nan(arg)`
+    * returns true when the passed number represents NaN.
+* `minetest.get_us_time()`
+    * returns time with microsecond precision. May not return wall time.
+* `table.copy(table)`: returns a table
+    * returns a deep copy of `table`
+* `table.indexof(list, val)`: returns the smallest numerical index containing
+      the value `val` in the table `list`. Non-numerical indices are ignored.
+      If `val` could not be found, `-1` is returned. `list` must not have
+      negative indices.
+* `table.insert_all(table, other_table)`:
+    * Appends all values in `other_table` to `table` - uses `#table + 1` to
+      find new indices.
+* `table.key_value_swap(t)`: returns a table with keys and values swapped
+    * If multiple keys in `t` map to the same value, the result is undefined.
+* `table.shuffle(table, [from], [to], [random_func])`:
+    * Shuffles elements `from` to `to` in `table` in place
+    * `from` defaults to `1`
+    * `to` defaults to `#table`
+    * `random_func` defaults to `math.random`. This function receives two
+      integers as arguments and should return a random integer inclusively
+      between them.
+* `minetest.pointed_thing_to_face_pos(placer, pointed_thing)`: returns a
+  position.
+    * returns the exact position on the surface of a pointed node
+* `minetest.get_dig_params(groups, tool_capabilities)`: Simulates a tool
+    that digs a node.
+    Returns a table with the following fields:
+    * `diggable`: `true` if node can be dug, `false` otherwise.
+    * `time`: Time it would take to dig the node.
+    * `wear`: How much wear would be added to the tool.
+    `time` and `wear` are meaningless if node's not diggable
+    Parameters:
+    * `groups`: Table of the node groups of the node that would be dug
+    * `tool_capabilities`: Tool capabilities table of the tool
+* `minetest.get_hit_params(groups, tool_capabilities [, time_from_last_punch])`:
+    Simulates an item that punches an object.
+    Returns a table with the following fields:
+    * `hp`: How much damage the punch would cause.
+    * `wear`: How much wear would be added to the tool.
+    Parameters:
+    * `groups`: Damage groups of the object
+    * `tool_capabilities`: Tool capabilities table of the item
+    * `time_from_last_punch`: time in seconds since last punch action
+
+
+
+
+Translations
+============
+
+Texts can be translated client-side with the help of `minetest.translate` and
+translation files.
+
+Translating a string
+--------------------
+
+Two functions are provided to translate strings: `minetest.translate` and
+`minetest.get_translator`.
+
+* `minetest.get_translator(textdomain)` is a simple wrapper around
+  `minetest.translate`, and `minetest.get_translator(textdomain)(str, ...)` is
+  equivalent to `minetest.translate(textdomain, str, ...)`.
+  It is intended to be used in the following way, so that it avoids verbose
+  repetitions of `minetest.translate`:
+
+      local S = minetest.get_translator(textdomain)
+      S(str, ...)
+
+  As an extra commodity, if `textdomain` is nil, it is assumed to be "" instead.
+
+* `minetest.translate(textdomain, str, ...)` translates the string `str` with
+  the given `textdomain` for disambiguation. The textdomain must match the
+  textdomain specified in the translation file in order to get the string
+  translated. This can be used so that a string is translated differently in
+  different contexts.
+  It is advised to use the name of the mod as textdomain whenever possible, to
+  avoid clashes with other mods.
+  This function must be given a number of arguments equal to the number of
+  arguments the translated string expects.
+  Arguments are literal strings -- they will not be translated, so if you want
+  them to be, they need to come as outputs of `minetest.translate` as well.
+
+  For instance, suppose we want to translate "@1 Wool" with "@1" being replaced
+  by the translation of "Red". We can do the following:
+
+      local S = minetest.get_translator()
+      S("@1 Wool", S("Red"))
+
+  This will be displayed as "Red Wool" on old clients and on clients that do
+  not have localization enabled. However, if we have for instance a translation
+  file named `wool.fr.tr` containing the following:
+
+      @1 Wool=Laine @1
+      Red=Rouge
+
+  this will be displayed as "Laine Rouge" on clients with a French locale.
+
+Operations on translated strings
+--------------------------------
+
+The output of `minetest.translate` is a string, with escape sequences adding
+additional information to that string so that it can be translated on the
+different clients. In particular, you can't expect operations like string.length
+to work on them like you would expect them to, or string.gsub to work in the
+expected manner. However, string concatenation will still work as expected
+(note that you should only use this for things like formspecs; do not translate
+sentences by breaking them into parts; arguments should be used instead), and
+operations such as `minetest.colorize` which are also concatenation.
+
+Translation file format
+-----------------------
+
+A translation file has the suffix `.[lang].tr`, where `[lang]` is the language
+it corresponds to. It must be put into the `locale` subdirectory of the mod.
+The file should be a text file, with the following format:
+
+* Lines beginning with `# textdomain:` (the space is significant) can be used
+  to specify the text domain of all following translations in the file.
+* All other empty lines or lines beginning with `#` are ignored.
+* Other lines should be in the format `original=translated`. Both `original`
+  and `translated` can contain escape sequences beginning with `@` to insert
+  arguments, literal `@`, `=` or newline (See [Escapes] below).
+  There must be no extraneous whitespace around the `=` or at the beginning or
+  the end of the line.
+
+Escapes
+-------
+
+Strings that need to be translated can contain several escapes, preceded by `@`.
+
+* `@@` acts as a literal `@`.
+* `@n`, where `n` is a digit between 1 and 9, is an argument for the translated
+  string that will be inlined when translated. Due to how translations are
+  implemented, the original translation string **must** have its arguments in
+  increasing order, without gaps or repetitions, starting from 1.
+* `@=` acts as a literal `=`. It is not required in strings given to
+  `minetest.translate`, but is in translation files to avoid being confused
+  with the `=` separating the original from the translation.
+* `@\n` (where the `\n` is a literal newline) acts as a literal newline.
+  As with `@=`, this escape is not required in strings given to
+  `minetest.translate`, but is in translation files.
+* `@n` acts as a literal newline as well.
+
+
+
+
+Perlin noise
+============
+
+Perlin noise creates a continuously-varying value depending on the input values.
+Usually in Minetest the input values are either 2D or 3D co-ordinates in nodes.
+The result is used during map generation to create the terrain shape, vary heat
+and humidity to distribute biomes, vary the density of decorations or vary the
+structure of ores.
+
+Structure of perlin noise
+-------------------------
+
+An 'octave' is a simple noise generator that outputs a value between -1 and 1.
+The smooth wavy noise it generates has a single characteristic scale, almost
+like a 'wavelength', so on its own does not create fine detail.
+Due to this perlin noise combines several octaves to create variation on
+multiple scales. Each additional octave has a smaller 'wavelength' than the
+previous.
+
+This combination results in noise varying very roughly between -2.0 and 2.0 and
+with an average value of 0.0, so `scale` and `offset` are then used to multiply
+and offset the noise variation.
+
+The final perlin noise variation is created as follows:
+
+noise = offset + scale * (octave1 +
+                          octave2 * persistence +
+                          octave3 * persistence ^ 2 +
+                          octave4 * persistence ^ 3 +
+                          ...)
+
+Noise Parameters
+----------------
+
+Noise Parameters are commonly called `NoiseParams`.
+
+### `offset`
+
+After the multiplication by `scale` this is added to the result and is the final
+step in creating the noise value.
+Can be positive or negative.
+
+### `scale`
+
+Once all octaves have been combined, the result is multiplied by this.
+Can be positive or negative.
+
+### `spread`
+
+For octave1, this is roughly the change of input value needed for a very large
+variation in the noise value generated by octave1. It is almost like a
+'wavelength' for the wavy noise variation.
+Each additional octave has a 'wavelength' that is smaller than the previous
+octave, to create finer detail. `spread` will therefore roughly be the typical
+size of the largest structures in the final noise variation.
+
+`spread` is a vector with values for x, y, z to allow the noise variation to be
+stretched or compressed in the desired axes.
+Values are positive numbers.
+
+### `seed`
+
+This is a whole number that determines the entire pattern of the noise
+variation. Altering it enables different noise patterns to be created.
+With other parameters equal, different seeds produce different noise patterns
+and identical seeds produce identical noise patterns.
+
+For this parameter you can randomly choose any whole number. Usually it is
+preferable for this to be different from other seeds, but sometimes it is useful
+to be able to create identical noise patterns.
+
+When used in mapgen this is actually a 'seed offset', it is added to the
+'world seed' to create the seed used by the noise, to ensure the noise has a
+different pattern in different worlds.
+
+### `octaves`
+
+The number of simple noise generators that are combined.
+A whole number, 1 or more.
+Each additional octave adds finer detail to the noise but also increases the
+noise calculation load.
+3 is a typical minimum for a high quality, complex and natural-looking noise
+variation. 1 octave has a slight 'gridlike' appearence.
+
+Choose the number of octaves according to the `spread` and `lacunarity`, and the
+size of the finest detail you require. For example:
+if `spread` is 512 nodes, `lacunarity` is 2.0 and finest detail required is 16
+nodes, octaves will be 6 because the 'wavelengths' of the octaves will be
+512, 256, 128, 64, 32, 16 nodes.
+Warning: If the 'wavelength' of any octave falls below 1 an error will occur.
+
+### `persistence`
+
+Each additional octave has an amplitude that is the amplitude of the previous
+octave multiplied by `persistence`, to reduce the amplitude of finer details,
+as is often helpful and natural to do so.
+Since this controls the balance of fine detail to large-scale detail
+`persistence` can be thought of as the 'roughness' of the noise.
+
+A positive or negative non-zero number, often between 0.3 and 1.0.
+A common medium value is 0.5, such that each octave has half the amplitude of
+the previous octave.
+This may need to be tuned when altering `lacunarity`; when doing so consider
+that a common medium value is 1 / lacunarity.
+
+### `lacunarity`
+
+Each additional octave has a 'wavelength' that is the 'wavelength' of the
+previous octave multiplied by 1 / lacunarity, to create finer detail.
+'lacunarity' is often 2.0 so 'wavelength' often halves per octave.
+
+A positive number no smaller than 1.0.
+Values below 2.0 create higher quality noise at the expense of requiring more
+octaves to cover a paticular range of 'wavelengths'.
+
+### `flags`
+
+Leave this field unset for no special handling.
+Currently supported are `defaults`, `eased` and `absvalue`:
+
+#### `defaults`
+
+Specify this if you would like to keep auto-selection of eased/not-eased while
+specifying some other flags.
+
+#### `eased`
+
+Maps noise gradient values onto a quintic S-curve before performing
+interpolation. This results in smooth, rolling noise.
+Disable this (`noeased`) for sharp-looking noise with a slightly gridded
+appearence.
+If no flags are specified (or defaults is), 2D noise is eased and 3D noise is
+not eased.
+Easing a 3D noise significantly increases the noise calculation load, so use
+with restraint.
+
+#### `absvalue`
+
+The absolute value of each octave's noise variation is used when combining the
+octaves. The final perlin noise variation is created as follows:
+
+noise = offset + scale * (abs(octave1) +
+                          abs(octave2) * persistence +
+                          abs(octave3) * persistence ^ 2 +
+                          abs(octave4) * persistence ^ 3 +
+                          ...)
+
+### Format example
+
+For 2D or 3D perlin noise or perlin noise maps:
+
+    np_terrain = {
+        offset = 0,
+        scale = 1,
+        spread = {x = 500, y = 500, z = 500},
+        seed = 571347,
+        octaves = 5,
+        persist = 0.63,
+        lacunarity = 2.0,
+        flags = "defaults, absvalue",
+    }
+
+For 2D noise the Z component of `spread` is still defined but is ignored.
+A single noise parameter table can be used for 2D or 3D noise.
+
+
+
+
+Ores
+====
+
+Ore types
+---------
+
+These tell in what manner the ore is generated.
+
+All default ores are of the uniformly-distributed scatter type.
+
+### `scatter`
+
+Randomly chooses a location and generates a cluster of ore.
+
+If `noise_params` is specified, the ore will be placed if the 3D perlin noise
+at that point is greater than the `noise_threshold`, giving the ability to
+create a non-equal distribution of ore.
+
+### `sheet`
+
+Creates a sheet of ore in a blob shape according to the 2D perlin noise
+described by `noise_params` and `noise_threshold`. This is essentially an
+improved version of the so-called "stratus" ore seen in some unofficial mods.
+
+This sheet consists of vertical columns of uniform randomly distributed height,
+varying between the inclusive range `column_height_min` and `column_height_max`.
+If `column_height_min` is not specified, this parameter defaults to 1.
+If `column_height_max` is not specified, this parameter defaults to `clust_size`
+for reverse compatibility. New code should prefer `column_height_max`.
+
+The `column_midpoint_factor` parameter controls the position of the column at
+which ore emanates from.
+If 1, columns grow upward. If 0, columns grow downward. If 0.5, columns grow
+equally starting from each direction.
+`column_midpoint_factor` is a decimal number ranging in value from 0 to 1. If
+this parameter is not specified, the default is 0.5.
+
+The ore parameters `clust_scarcity` and `clust_num_ores` are ignored for this
+ore type.
+
+### `puff`
+
+Creates a sheet of ore in a cloud-like puff shape.
+
+As with the `sheet` ore type, the size and shape of puffs are described by
+`noise_params` and `noise_threshold` and are placed at random vertical
+positions within the currently generated chunk.
+
+The vertical top and bottom displacement of each puff are determined by the
+noise parameters `np_puff_top` and `np_puff_bottom`, respectively.
+
+### `blob`
+
+Creates a deformed sphere of ore according to 3d perlin noise described by
+`noise_params`. The maximum size of the blob is `clust_size`, and
+`clust_scarcity` has the same meaning as with the `scatter` type.
+
+### `vein`
+
+Creates veins of ore varying in density by according to the intersection of two
+instances of 3d perlin noise with different seeds, both described by
+`noise_params`.
+
+`random_factor` varies the influence random chance has on placement of an ore
+inside the vein, which is `1` by default. Note that modifying this parameter
+may require adjusting `noise_threshold`.
+
+The parameters `clust_scarcity`, `clust_num_ores`, and `clust_size` are ignored
+by this ore type.
+
+This ore type is difficult to control since it is sensitive to small changes.
+The following is a decent set of parameters to work from:
+
+    noise_params = {
+        offset  = 0,
+        scale   = 3,
+        spread  = {x=200, y=200, z=200},
+        seed    = 5390,
+        octaves = 4,
+        persist = 0.5,
+        lacunarity = 2.0,
+        flags = "eased",
+    },
+    noise_threshold = 1.6
+
+**WARNING**: Use this ore type *very* sparingly since it is ~200x more
+computationally expensive than any other ore.
+
+### `stratum`
+
+Creates a single undulating ore stratum that is continuous across mapchunk
+borders and horizontally spans the world.
+
+The 2D perlin noise described by `noise_params` defines the Y co-ordinate of
+the stratum midpoint. The 2D perlin noise described by `np_stratum_thickness`
+defines the stratum's vertical thickness (in units of nodes). Due to being
+continuous across mapchunk borders the stratum's vertical thickness is
+unlimited.
+
+If the noise parameter `noise_params` is omitted the ore will occur from y_min
+to y_max in a simple horizontal stratum.
+
+A parameter `stratum_thickness` can be provided instead of the noise parameter
+`np_stratum_thickness`, to create a constant thickness.
+
+Leaving out one or both noise parameters makes the ore generation less
+intensive, useful when adding multiple strata.
+
+`y_min` and `y_max` define the limits of the ore generation and for performance
+reasons should be set as close together as possible but without clipping the
+stratum's Y variation.
+
+Each node in the stratum has a 1-in-`clust_scarcity` chance of being ore, so a
+solid-ore stratum would require a `clust_scarcity` of 1.
+
+The parameters `clust_num_ores`, `clust_size`, `noise_threshold` and
+`random_factor` are ignored by this ore type.
+
+Ore attributes
+--------------
+
+See section [Flag Specifier Format].
+
+Currently supported flags:
+`puff_cliffs`, `puff_additive_composition`.
+
+### `puff_cliffs`
+
+If set, puff ore generation will not taper down large differences in
+displacement when approaching the edge of a puff. This flag has no effect for
+ore types other than `puff`.
+
+### `puff_additive_composition`
+
+By default, when noise described by `np_puff_top` or `np_puff_bottom` results
+in a negative displacement, the sub-column at that point is not generated. With
+this attribute set, puff ore generation will instead generate the absolute
+difference in noise displacement values. This flag has no effect for ore types
+other than `puff`.
+
+
+
+
+Decoration types
+================
+
+The varying types of decorations that can be placed.
+
+`simple`
+--------
+
+Creates a 1 times `H` times 1 column of a specified node (or a random node from
+a list, if a decoration list is specified). Can specify a certain node it must
+spawn next to, such as water or lava, for example. Can also generate a
+decoration of random height between a specified lower and upper bound.
+This type of decoration is intended for placement of grass, flowers, cacti,
+papyri, waterlilies and so on.
+
+`schematic`
+-----------
+
+Copies a box of `MapNodes` from a specified schematic file (or raw description).
+Can specify a probability of a node randomly appearing when placed.
+This decoration type is intended to be used for multi-node sized discrete
+structures, such as trees, cave spikes, rocks, and so on.
+
+
+
+
+Schematics
+==========
+
+Schematic specifier
+--------------------
+
+A schematic specifier identifies a schematic by either a filename to a
+Minetest Schematic file (`.mts`) or through raw data supplied through Lua,
+in the form of a table.  This table specifies the following fields:
+
+* The `size` field is a 3D vector containing the dimensions of the provided
+  schematic. (required field)
+* The `yslice_prob` field is a table of {ypos, prob} slice tables. A slice table
+  sets the probability of a particular horizontal slice of the schematic being
+  placed. (optional field)
+  `ypos` = 0 for the lowest horizontal slice of a schematic.
+  The default of `prob` is 255.
+* The `data` field is a flat table of MapNode tables making up the schematic,
+  in the order of `[z [y [x]]]`. (required field)
+  Each MapNode table contains:
+    * `name`: the name of the map node to place (required)
+    * `prob` (alias `param1`): the probability of this node being placed
+      (default: 255)
+    * `param2`: the raw param2 value of the node being placed onto the map
+      (default: 0)
+    * `force_place`: boolean representing if the node should forcibly overwrite
+      any previous contents (default: false)
+
+About probability values:
+
+* A probability value of `0` or `1` means that node will never appear
+  (0% chance).
+* A probability value of `254` or `255` means the node will always appear
+  (100% chance).
+* If the probability value `p` is greater than `1`, then there is a
+  `(p / 256 * 100)` percent chance that node will appear when the schematic is
+  placed on the map.
+
+Schematic attributes
+--------------------
+
+See section [Flag Specifier Format].
+
+Currently supported flags: `place_center_x`, `place_center_y`, `place_center_z`,
+                           `force_placement`.
+
+* `place_center_x`: Placement of this decoration is centered along the X axis.
+* `place_center_y`: Placement of this decoration is centered along the Y axis.
+* `place_center_z`: Placement of this decoration is centered along the Z axis.
+* `force_placement`: Schematic nodes other than "ignore" will replace existing
+  nodes.
+
+
+
+
+Lua Voxel Manipulator
+=====================
+
+About VoxelManip
+----------------
+
+VoxelManip is a scripting interface to the internal 'Map Voxel Manipulator'
+facility. The purpose of this object is for fast, low-level, bulk access to
+reading and writing Map content. As such, setting map nodes through VoxelManip
+will lack many of the higher level features and concepts you may be used to
+with other methods of setting nodes. For example, nodes will not have their
+construction and destruction callbacks run, and no rollback information is
+logged.
+
+It is important to note that VoxelManip is designed for speed, and *not* ease
+of use or flexibility. If your mod requires a map manipulation facility that
+will handle 100% of all edge cases, or the use of high level node placement
+features, perhaps `minetest.set_node()` is better suited for the job.
+
+In addition, VoxelManip might not be faster, or could even be slower, for your
+specific use case. VoxelManip is most effective when setting large areas of map
+at once - for example, if only setting a 3x3x3 node area, a
+`minetest.set_node()` loop may be more optimal. Always profile code using both
+methods of map manipulation to determine which is most appropriate for your
+usage.
+
+A recent simple test of setting cubic areas showed that `minetest.set_node()`
+is faster than a VoxelManip for a 3x3x3 node cube or smaller.
+
+Using VoxelManip
+----------------
+
+A VoxelManip object can be created any time using either:
+`VoxelManip([p1, p2])`, or `minetest.get_voxel_manip([p1, p2])`.
+
+If the optional position parameters are present for either of these routines,
+the specified region will be pre-loaded into the VoxelManip object on creation.
+Otherwise, the area of map you wish to manipulate must first be loaded into the
+VoxelManip object using `VoxelManip:read_from_map()`.
+
+Note that `VoxelManip:read_from_map()` returns two position vectors. The region
+formed by these positions indicate the minimum and maximum (respectively)
+positions of the area actually loaded in the VoxelManip, which may be larger
+than the area requested. For convenience, the loaded area coordinates can also
+be queried any time after loading map data with `VoxelManip:get_emerged_area()`.
+
+Now that the VoxelManip object is populated with map data, your mod can fetch a
+copy of this data using either of two methods. `VoxelManip:get_node_at()`,
+which retrieves an individual node in a MapNode formatted table at the position
+requested is the simplest method to use, but also the slowest.
+
+Nodes in a VoxelManip object may also be read in bulk to a flat array table
+using:
+
+* `VoxelManip:get_data()` for node content (in Content ID form, see section
+  [Content IDs]),
+* `VoxelManip:get_light_data()` for node light levels, and
+* `VoxelManip:get_param2_data()` for the node type-dependent "param2" values.
+
+See section [Flat array format] for more details.
+
+It is very important to understand that the tables returned by any of the above
+three functions represent a snapshot of the VoxelManip's internal state at the
+time of the call. This copy of the data will not magically update itself if
+another function modifies the internal VoxelManip state.
+Any functions that modify a VoxelManip's contents work on the VoxelManip's
+internal state unless otherwise explicitly stated.
+
+Once the bulk data has been edited to your liking, the internal VoxelManip
+state can be set using:
+
+* `VoxelManip:set_data()` for node content (in Content ID form, see section
+  [Content IDs]),
+* `VoxelManip:set_light_data()` for node light levels, and
+* `VoxelManip:set_param2_data()` for the node type-dependent `param2` values.
+
+The parameter to each of the above three functions can use any table at all in
+the same flat array format as produced by `get_data()` etc. and is not required
+to be a table retrieved from `get_data()`.
+
+Once the internal VoxelManip state has been modified to your liking, the
+changes can be committed back to the map by calling `VoxelManip:write_to_map()`
+
+### Flat array format
+
+Let
+    `Nx = p2.X - p1.X + 1`,
+    `Ny = p2.Y - p1.Y + 1`, and
+    `Nz = p2.Z - p1.Z + 1`.
+
+Then, for a loaded region of p1..p2, this array ranges from `1` up to and
+including the value of the expression `Nx * Ny * Nz`.
+
+Positions offset from p1 are present in the array with the format of:
+
+    [
+        (0, 0, 0),   (1, 0, 0),   (2, 0, 0),   ... (Nx, 0, 0),
+        (0, 1, 0),   (1, 1, 0),   (2, 1, 0),   ... (Nx, 1, 0),
+        ...
+        (0, Ny, 0),  (1, Ny, 0),  (2, Ny, 0),  ... (Nx, Ny, 0),
+        (0, 0, 1),   (1, 0, 1),   (2, 0, 1),   ... (Nx, 0, 1),
+        ...
+        (0, Ny, 2),  (1, Ny, 2),  (2, Ny, 2),  ... (Nx, Ny, 2),
+        ...
+        (0, Ny, Nz), (1, Ny, Nz), (2, Ny, Nz), ... (Nx, Ny, Nz)
+    ]
+
+and the array index for a position p contained completely in p1..p2 is:
+
+`(p.Z - p1.Z) * Ny * Nx + (p.Y - p1.Y) * Nx + (p.X - p1.X) + 1`
+
+Note that this is the same "flat 3D array" format as
+`PerlinNoiseMap:get3dMap_flat()`.
+VoxelArea objects (see section [`VoxelArea`]) can be used to simplify calculation
+of the index for a single point in a flat VoxelManip array.
+
+### Content IDs
+
+A Content ID is a unique integer identifier for a specific node type.
+These IDs are used by VoxelManip in place of the node name string for
+`VoxelManip:get_data()` and `VoxelManip:set_data()`. You can use
+`minetest.get_content_id()` to look up the Content ID for the specified node
+name, and `minetest.get_name_from_content_id()` to look up the node name string
+for a given Content ID.
+After registration of a node, its Content ID will remain the same throughout
+execution of the mod.
+Note that the node being queried needs to have already been been registered.
+
+The following builtin node types have their Content IDs defined as constants:
+
+* `minetest.CONTENT_UNKNOWN`: ID for "unknown" nodes
+* `minetest.CONTENT_AIR`:     ID for "air" nodes
+* `minetest.CONTENT_IGNORE`:  ID for "ignore" nodes
+
+### Mapgen VoxelManip objects
+
+Inside of `on_generated()` callbacks, it is possible to retrieve the same
+VoxelManip object used by the core's Map Generator (commonly abbreviated
+Mapgen). Most of the rules previously described still apply but with a few
+differences:
+
+* The Mapgen VoxelManip object is retrieved using:
+  `minetest.get_mapgen_object("voxelmanip")`
+* This VoxelManip object already has the region of map just generated loaded
+  into it; it's not necessary to call `VoxelManip:read_from_map()` before using
+  a Mapgen VoxelManip.
+* The `on_generated()` callbacks of some mods may place individual nodes in the
+  generated area using non-VoxelManip map modification methods. Because the
+  same Mapgen VoxelManip object is passed through each `on_generated()`
+  callback, it becomes necessary for the Mapgen VoxelManip object to maintain
+  consistency with the current map state. For this reason, calling any of the
+  following functions:
+  `minetest.add_node()`, `minetest.set_node()`, or `minetest.swap_node()`
+  will also update the Mapgen VoxelManip object's internal state active on the
+  current thread.
+* After modifying the Mapgen VoxelManip object's internal buffer, it may be
+  necessary to update lighting information using either:
+  `VoxelManip:calc_lighting()` or `VoxelManip:set_lighting()`.
+
+### Other API functions operating on a VoxelManip
+
+If any VoxelManip contents were set to a liquid node,
+`VoxelManip:update_liquids()` must be called for these liquid nodes to begin
+flowing. It is recommended to call this function only after having written all
+buffered data back to the VoxelManip object, save for special situations where
+the modder desires to only have certain liquid nodes begin flowing.
+
+The functions `minetest.generate_ores()` and `minetest.generate_decorations()`
+will generate all registered decorations and ores throughout the full area
+inside of the specified VoxelManip object.
+
+`minetest.place_schematic_on_vmanip()` is otherwise identical to
+`minetest.place_schematic()`, except instead of placing the specified schematic
+directly on the map at the specified position, it will place the schematic
+inside the VoxelManip.
+
+### Notes
+
+* Attempting to read data from a VoxelManip object before map is read will
+  result in a zero-length array table for `VoxelManip:get_data()`, and an
+  "ignore" node at any position for `VoxelManip:get_node_at()`.
+* If either a region of map has not yet been generated or is out-of-bounds of
+  the map, that region is filled with "ignore" nodes.
+* Other mods, or the core itself, could possibly modify the area of map
+  currently loaded into a VoxelManip object. With the exception of Mapgen
+  VoxelManips (see above section), the internal buffers are not updated. For
+  this reason, it is strongly encouraged to complete the usage of a particular
+  VoxelManip object in the same callback it had been created.
+* If a VoxelManip object will be used often, such as in an `on_generated()`
+  callback, consider passing a file-scoped table as the optional parameter to
+  `VoxelManip:get_data()`, which serves as a static buffer the function can use
+  to write map data to instead of returning a new table each call. This greatly
+  enhances performance by avoiding unnecessary memory allocations.
+
+Methods
+-------
+
+* `read_from_map(p1, p2)`:  Loads a chunk of map into the VoxelManip object
+  containing the region formed by `p1` and `p2`.
+    * returns actual emerged `pmin`, actual emerged `pmax`
+* `write_to_map([light])`: Writes the data loaded from the `VoxelManip` back to
+  the map.
+    * **important**: data must be set using `VoxelManip:set_data()` before
+      calling this.
+    * if `light` is true, then lighting is automatically recalculated.
+      The default value is true.
+      If `light` is false, no light calculations happen, and you should correct
+      all modified blocks with `minetest.fix_light()` as soon as possible.
+      Keep in mind that modifying the map where light is incorrect can cause
+      more lighting bugs.
+* `get_node_at(pos)`: Returns a `MapNode` table of the node currently loaded in
+  the `VoxelManip` at that position
+* `set_node_at(pos, node)`: Sets a specific `MapNode` in the `VoxelManip` at
+  that position.
+* `get_data([buffer])`: Retrieves the node content data loaded into the
+  `VoxelManip` object.
+    * returns raw node data in the form of an array of node content IDs
+    * if the param `buffer` is present, this table will be used to store the
+      result instead.
+* `set_data(data)`: Sets the data contents of the `VoxelManip` object
+* `update_map()`: Does nothing, kept for compatibility.
+* `set_lighting(light, [p1, p2])`: Set the lighting within the `VoxelManip` to
+  a uniform value.
+    * `light` is a table, `{day=<0...15>, night=<0...15>}`
+    * To be used only by a `VoxelManip` object from
+      `minetest.get_mapgen_object`.
+    * (`p1`, `p2`) is the area in which lighting is set, defaults to the whole
+      area if left out.
+* `get_light_data()`: Gets the light data read into the `VoxelManip` object
+    * Returns an array (indices 1 to volume) of integers ranging from `0` to
+      `255`.
+    * Each value is the bitwise combination of day and night light values
+      (`0` to `15` each).
+    * `light = day + (night * 16)`
+* `set_light_data(light_data)`: Sets the `param1` (light) contents of each node
+  in the `VoxelManip`.
+    * expects lighting data in the same format that `get_light_data()` returns
+* `get_param2_data([buffer])`: Gets the raw `param2` data read into the
+  `VoxelManip` object.
+    * Returns an array (indices 1 to volume) of integers ranging from `0` to
+      `255`.
+    * If the param `buffer` is present, this table will be used to store the
+      result instead.
+* `set_param2_data(param2_data)`: Sets the `param2` contents of each node in
+  the `VoxelManip`.
+* `calc_lighting([p1, p2], [propagate_shadow])`:  Calculate lighting within the
+  `VoxelManip`.
+    * To be used only by a `VoxelManip` object from
+      `minetest.get_mapgen_object`.
+    * (`p1`, `p2`) is the area in which lighting is set, defaults to the whole
+      area if left out or nil. For almost all uses these should be left out
+      or nil to use the default.
+    * `propagate_shadow` is an optional boolean deciding whether shadows in a
+      generated mapchunk above are propagated down into the mapchunk, defaults
+      to `true` if left out.
+* `update_liquids()`: Update liquid flow
+* `was_modified()`: Returns `true` or `false` if the data in the voxel
+  manipulator had been modified since the last read from map, due to a call to
+  `minetest.set_data()` on the loaded area elsewhere.
+* `get_emerged_area()`: Returns actual emerged minimum and maximum positions.
+
+`VoxelArea`
+-----------
+
+A helper class for voxel areas.
+It can be created via `VoxelArea:new{MinEdge = pmin, MaxEdge = pmax}`.
+The coordinates are *inclusive*, like most other things in Minetest.
+
+### Methods
+
+* `getExtent()`: returns a 3D vector containing the size of the area formed by
+  `MinEdge` and `MaxEdge`.
+* `getVolume()`: returns the volume of the area formed by `MinEdge` and
+  `MaxEdge`.
+* `index(x, y, z)`: returns the index of an absolute position in a flat array
+  starting at `1`.
+    * `x`, `y` and `z` must be integers to avoid an incorrect index result.
+    * The position (x, y, z) is not checked for being inside the area volume,
+      being outside can cause an incorrect index result.
+    * Useful for things like `VoxelManip`, raw Schematic specifiers,
+      `PerlinNoiseMap:get2d`/`3dMap`, and so on.
+* `indexp(p)`: same functionality as `index(x, y, z)` but takes a vector.
+    * As with `index(x, y, z)`, the components of `p` must be integers, and `p`
+      is not checked for being inside the area volume.
+* `position(i)`: returns the absolute position vector corresponding to index
+  `i`.
+* `contains(x, y, z)`: check if (`x`,`y`,`z`) is inside area formed by
+  `MinEdge` and `MaxEdge`.
+* `containsp(p)`: same as above, except takes a vector
+* `containsi(i)`: same as above, except takes an index `i`
+* `iter(minx, miny, minz, maxx, maxy, maxz)`: returns an iterator that returns
+  indices.
+    * from (`minx`,`miny`,`minz`) to (`maxx`,`maxy`,`maxz`) in the order of
+      `[z [y [x]]]`.
+* `iterp(minp, maxp)`: same as above, except takes a vector
+
+### Y stride and z stride of a flat array
+
+For a particular position in a voxel area, whose flat array index is known,
+it is often useful to know the index of a neighboring or nearby position.
+The table below shows the changes of index required for 1 node movements along
+the axes in a voxel area:
+
+    Movement    Change of index
+    +x          +1
+    -x          -1
+    +y          +ystride
+    -y          -ystride
+    +z          +zstride
+    -z          -zstride
+
+If, for example:
+
+    local area = VoxelArea:new{MinEdge = emin, MaxEdge = emax}
+
+The values of `ystride` and `zstride` can be obtained using `area.ystride` and
+`area.zstride`.
+
+
+
+
+Mapgen objects
+==============
+
+A mapgen object is a construct used in map generation. Mapgen objects can be
+used by an `on_generate` callback to speed up operations by avoiding
+unnecessary recalculations, these can be retrieved using the
+`minetest.get_mapgen_object()` function. If the requested Mapgen object is
+unavailable, or `get_mapgen_object()` was called outside of an `on_generate()`
+callback, `nil` is returned.
+
+The following Mapgen objects are currently available:
+
+### `voxelmanip`
+
+This returns three values; the `VoxelManip` object to be used, minimum and
+maximum emerged position, in that order. All mapgens support this object.
+
+### `heightmap`
+
+Returns an array containing the y coordinates of the ground levels of nodes in
+the most recently generated chunk by the current mapgen.
+
+### `biomemap`
+
+Returns an array containing the biome IDs of nodes in the most recently
+generated chunk by the current mapgen.
+
+### `heatmap`
+
+Returns an array containing the temperature values of nodes in the most
+recently generated chunk by the current mapgen.
+
+### `humiditymap`
+
+Returns an array containing the humidity values of nodes in the most recently
+generated chunk by the current mapgen.
+
+### `gennotify`
+
+Returns a table mapping requested generation notification types to arrays of
+positions at which the corresponding generated structures are located within
+the current chunk. To set the capture of positions of interest to be recorded
+on generate, use `minetest.set_gen_notify()`.
+For decorations, the returned positions are the ground surface 'place_on'
+nodes, not the decorations themselves. A 'simple' type decoration is often 1
+node above the returned position and possibly displaced by 'place_offset_y'.
+
+Possible fields of the table returned are:
+
+* `dungeon`
+* `temple`
+* `cave_begin`
+* `cave_end`
+* `large_cave_begin`
+* `large_cave_end`
+* `decoration`
+
+Decorations have a key in the format of `"decoration#id"`, where `id` is the
+numeric unique decoration ID as returned by `minetest.get_decoration_id`.
+
+
+
+
+Registered entities
+===================
+
+Functions receive a "luaentity" as `self`:
+
+* It has the member `.name`, which is the registered name `("mod:thing")`
+* It has the member `.object`, which is an `ObjectRef` pointing to the object
+* The original prototype stuff is visible directly via a metatable
+
+Callbacks:
+
+* `on_activate(self, staticdata, dtime_s)`
+    * Called when the object is instantiated.
+    * `dtime_s` is the time passed since the object was unloaded, which can be
+      used for updating the entity state.
+* `on_step(self, dtime)`
+    * Called on every server tick, after movement and collision processing.
+      `dtime` is usually 0.1 seconds, as per the `dedicated_server_step` setting
+      in `minetest.conf`.
+* `on_punch(self, puncher, time_from_last_punch, tool_capabilities, dir, damage)`
+    * Called when somebody punches the object.
+    * Note that you probably want to handle most punches using the automatic
+      armor group system.
+    * `puncher`: an `ObjectRef` (can be `nil`)
+    * `time_from_last_punch`: Meant for disallowing spamming of clicks
+      (can be `nil`).
+    * `tool_capabilities`: capability table of used tool (can be `nil`)
+    * `dir`: unit vector of direction of punch. Always defined. Points from the
+      puncher to the punched.
+    * `damage`: damage that will be done to entity.
+    * Can return `true` to prevent the default damage mechanism.
+* `on_death(self, killer)`
+    * Called when the object dies.
+    * `killer`: an `ObjectRef` (can be `nil`)
+* `on_rightclick(self, clicker)`
+* `on_attach_child(self, child)`
+    * `child`: an `ObjectRef` of the child that attaches
+* `on_detach_child(self, child)`
+    * `child`: an `ObjectRef` of the child that detaches
+* `on_detach(self, parent)`
+    * `parent`: an `ObjectRef` (can be `nil`) from where it got detached
+    * This happens before the parent object is removed from the world
+* `get_staticdata(self)`
+    * Should return a string that will be passed to `on_activate` when the
+      object is instantiated the next time.
+
+
+
+
+L-system trees
+==============
+
+Tree definition
+---------------
+
+    treedef={
+        axiom,         --string  initial tree axiom
+        rules_a,       --string  rules set A
+        rules_b,       --string  rules set B
+        rules_c,       --string  rules set C
+        rules_d,       --string  rules set D
+        trunk,         --string  trunk node name
+        leaves,        --string  leaves node name
+        leaves2,       --string  secondary leaves node name
+        leaves2_chance,--num     chance (0-100) to replace leaves with leaves2
+        angle,         --num     angle in deg
+        iterations,    --num     max # of iterations, usually 2 -5
+        random_level,  --num     factor to lower nr of iterations, usually 0 - 3
+        trunk_type,    --string  single/double/crossed) type of trunk: 1 node,
+                       --        2x2 nodes or 3x3 in cross shape
+        thin_branches, --boolean true -> use thin (1 node) branches
+        fruit,         --string  fruit node name
+        fruit_chance,  --num     chance (0-100) to replace leaves with fruit node
+        seed,          --num     random seed, if no seed is provided, the engine
+                                 will create one.
+    }
+
+Key for special L-System symbols used in axioms
+-----------------------------------------------
+
+* `G`: move forward one unit with the pen up
+* `F`: move forward one unit with the pen down drawing trunks and branches
+* `f`: move forward one unit with the pen down drawing leaves (100% chance)
+* `T`: move forward one unit with the pen down drawing trunks only
+* `R`: move forward one unit with the pen down placing fruit
+* `A`: replace with rules set A
+* `B`: replace with rules set B
+* `C`: replace with rules set C
+* `D`: replace with rules set D
+* `a`: replace with rules set A, chance 90%
+* `b`: replace with rules set B, chance 80%
+* `c`: replace with rules set C, chance 70%
+* `d`: replace with rules set D, chance 60%
+* `+`: yaw the turtle right by `angle` parameter
+* `-`: yaw the turtle left by `angle` parameter
+* `&`: pitch the turtle down by `angle` parameter
+* `^`: pitch the turtle up by `angle` parameter
+* `/`: roll the turtle to the right by `angle` parameter
+* `*`: roll the turtle to the left by `angle` parameter
+* `[`: save in stack current state info
+* `]`: recover from stack state info
+
+Example
+-------
+
+Spawn a small apple tree:
+
+    pos = {x=230,y=20,z=4}
+    apple_tree={
+        axiom="FFFFFAFFBF",
+        rules_a="[&&&FFFFF&&FFFF][&&&++++FFFFF&&FFFF][&&&----FFFFF&&FFFF]",
+        rules_b="[&&&++FFFFF&&FFFF][&&&--FFFFF&&FFFF][&&&------FFFFF&&FFFF]",
+        trunk="default:tree",
+        leaves="default:leaves",
+        angle=30,
+        iterations=2,
+        random_level=0,
+        trunk_type="single",
+        thin_branches=true,
+        fruit_chance=10,
+        fruit="default:apple"
+    }
+    minetest.spawn_tree(pos,apple_tree)
+
+
+
+
+'minetest' namespace reference
+==============================
+
+Utilities
+---------
+
+* `minetest.get_current_modname()`: returns the currently loading mod's name,
+  when loading a mod.
+* `minetest.get_modpath(modname)`: returns e.g.
+  `"/home/user/.minetest/usermods/modname"`.
+    * Useful for loading additional `.lua` modules or static data from mod
+* `minetest.get_modnames()`: returns a list of installed mods
+    * Return a list of installed mods, sorted alphabetically
+* `minetest.get_worldpath()`: returns e.g. `"/home/user/.minetest/world"`
+    * Useful for storing custom data
+* `minetest.is_singleplayer()`
+* `minetest.features`: Table containing API feature flags
+
+      {
+          glasslike_framed = true,  -- 0.4.7
+          nodebox_as_selectionbox = true,  -- 0.4.7
+          get_all_craft_recipes_works = true,  -- 0.4.7
+          -- The transparency channel of textures can optionally be used on
+          -- nodes (0.4.7)
+          use_texture_alpha = true,
+          -- Tree and grass ABMs are no longer done from C++ (0.4.8)
+          no_legacy_abms = true,
+          -- Texture grouping is possible using parentheses (0.4.11)
+          texture_names_parens = true,
+          -- Unique Area ID for AreaStore:insert_area (0.4.14)
+          area_store_custom_ids = true,
+          -- add_entity supports passing initial staticdata to on_activate
+          -- (0.4.16)
+          add_entity_with_staticdata = true,
+          -- Chat messages are no longer predicted (0.4.16)
+          no_chat_message_prediction = true,
+          -- The transparency channel of textures can optionally be used on
+          -- objects (ie: players and lua entities) (5.0.0)
+          object_use_texture_alpha = true,
+          -- Object selectionbox is settable independently from collisionbox
+          -- (5.0.0)
+          object_independent_selectionbox = true,
+          -- Specifies whether binary data can be uploaded or downloaded using
+          -- the HTTP API (5.1.0)
+          httpfetch_binary_data = true,
+          -- Whether formspec_version[<version>] may be used (5.1.0)
+          formspec_version_element = true,
+          -- Whether AreaStore's IDs are kept on save/load (5.1.0)
+          area_store_persistent_ids = true,
+          -- Whether minetest.find_path is functional (5.2.0)
+          pathfinder_works = true,
+      }
+
+* `minetest.has_feature(arg)`: returns `boolean, missing_features`
+    * `arg`: string or table in format `{foo=true, bar=true}`
+    * `missing_features`: `{foo=true, bar=true}`
+* `minetest.get_player_information(player_name)`: Table containing information
+  about a player. Example return value:
+
+      {
+          address = "127.0.0.1",     -- IP address of client
+          ip_version = 4,            -- IPv4 / IPv6
+          min_rtt = 0.01,            -- minimum round trip time
+          max_rtt = 0.2,             -- maximum round trip time
+          avg_rtt = 0.02,            -- average round trip time
+          min_jitter = 0.01,         -- minimum packet time jitter
+          max_jitter = 0.5,          -- maximum packet time jitter
+          avg_jitter = 0.03,         -- average packet time jitter
+          connection_uptime = 200,   -- seconds since client connected
+          protocol_version = 32,     -- protocol version used by client
+          formspec_version = 2,      -- supported formspec version
+          -- following information is available on debug build only!!!
+          -- DO NOT USE IN MODS
+          --ser_vers = 26,             -- serialization version used by client
+          --major = 0,                 -- major version number
+          --minor = 4,                 -- minor version number
+          --patch = 10,                -- patch version number
+          --vers_string = "0.4.9-git", -- full version string
+          --state = "Active"           -- current client state
+      }
+
+* `minetest.mkdir(path)`: returns success.
+    * Creates a directory specified by `path`, creating parent directories
+      if they don't exist.
+* `minetest.get_dir_list(path, [is_dir])`: returns list of entry names
+    * is_dir is one of:
+        * nil: return all entries,
+        * true: return only subdirectory names, or
+        * false: return only file names.
+* `minetest.safe_file_write(path, content)`: returns boolean indicating success
+    * Replaces contents of file at path with new contents in a safe (atomic)
+      way. Use this instead of below code when writing e.g. database files:
+      `local f = io.open(path, "wb"); f:write(content); f:close()`
+* `minetest.get_version()`: returns a table containing components of the
+   engine version.  Components:
+    * `project`: Name of the project, eg, "Minetest"
+    * `string`: Simple version, eg, "1.2.3-dev"
+    * `hash`: Full git version (only set if available),
+      eg, "1.2.3-dev-01234567-dirty".
+  Use this for informational purposes only. The information in the returned
+  table does not represent the capabilities of the engine, nor is it
+  reliable or verifiable. Compatible forks will have a different name and
+  version entirely. To check for the presence of engine features, test
+  whether the functions exported by the wanted features exist. For example:
+  `if minetest.check_for_falling then ... end`.
+* `minetest.sha1(data, [raw])`: returns the sha1 hash of data
+    * `data`: string of data to hash
+    * `raw`: return raw bytes instead of hex digits, default: false
+
+Logging
+-------
+
+* `minetest.debug(...)`
+    * Equivalent to `minetest.log(table.concat({...}, "\t"))`
+* `minetest.log([level,] text)`
+    * `level` is one of `"none"`, `"error"`, `"warning"`, `"action"`,
+      `"info"`, or `"verbose"`.  Default is `"none"`.
+
+Registration functions
+----------------------
+
+Call these functions only at load time!
+
+### Environment
+
+* `minetest.register_node(name, node definition)`
+* `minetest.register_craftitem(name, item definition)`
+* `minetest.register_tool(name, item definition)`
+* `minetest.override_item(name, redefinition)`
+    * Overrides fields of an item registered with register_node/tool/craftitem.
+    * Note: Item must already be defined, (opt)depend on the mod defining it.
+    * Example: `minetest.override_item("default:mese",
+      {light_source=minetest.LIGHT_MAX})`
+* `minetest.unregister_item(name)`
+    * Unregisters the item from the engine, and deletes the entry with key
+      `name` from `minetest.registered_items` and from the associated item table
+      according to its nature: `minetest.registered_nodes`, etc.
+* `minetest.register_entity(name, entity definition)`
+* `minetest.register_abm(abm definition)`
+* `minetest.register_lbm(lbm definition)`
+* `minetest.register_alias(alias, original_name)`
+    * Also use this to set the 'mapgen aliases' needed in a game for the core
+      mapgens. See [Mapgen aliases] section above.
+* `minetest.register_alias_force(alias, original_name)`
+* `minetest.register_ore(ore definition)`
+    * Returns an integer object handle uniquely identifying the registered
+      ore on success.
+    * The order of ore registrations determines the order of ore generation.
+* `minetest.register_biome(biome definition)`
+    * Returns an integer object handle uniquely identifying the registered
+      biome on success. To get the biome ID, use `minetest.get_biome_id`.
+* `minetest.unregister_biome(name)`
+    * Unregisters the biome from the engine, and deletes the entry with key
+      `name` from `minetest.registered_biomes`.
+    * Warning: This alters the biome to biome ID correspondences, so any
+      decorations or ores using the 'biomes' field must afterwards be cleared
+      and re-registered.
+* `minetest.register_decoration(decoration definition)`
+    * Returns an integer object handle uniquely identifying the registered
+      decoration on success. To get the decoration ID, use
+      `minetest.get_decoration_id`.
+    * The order of decoration registrations determines the order of decoration
+      generation.
+* `minetest.register_schematic(schematic definition)`
+    * Returns an integer object handle uniquely identifying the registered
+      schematic on success.
+    * If the schematic is loaded from a file, the `name` field is set to the
+      filename.
+    * If the function is called when loading the mod, and `name` is a relative
+      path, then the current mod path will be prepended to the schematic
+      filename.
+* `minetest.clear_registered_biomes()`
+    * Clears all biomes currently registered.
+    * Warning: Clearing and re-registering biomes alters the biome to biome ID
+      correspondences, so any decorations or ores using the 'biomes' field must
+      afterwards be cleared and re-registered.
+* `minetest.clear_registered_decorations()`
+    * Clears all decorations currently registered.
+* `minetest.clear_registered_ores()`
+    * Clears all ores currently registered.
+* `minetest.clear_registered_schematics()`
+    * Clears all schematics currently registered.
+
+### Gameplay
+
+* `minetest.register_craft(recipe)`
+    * Check recipe table syntax for different types below.
+* `minetest.clear_craft(recipe)`
+    * Will erase existing craft based either on output item or on input recipe.
+    * Specify either output or input only. If you specify both, input will be
+      ignored. For input use the same recipe table syntax as for
+      `minetest.register_craft(recipe)`. For output specify only the item,
+      without a quantity.
+    * Returns false if no erase candidate could be found, otherwise returns true.
+    * **Warning**! The type field ("shaped", "cooking" or any other) will be
+      ignored if the recipe contains output. Erasing is then done independently
+      from the crafting method.
+* `minetest.register_chatcommand(cmd, chatcommand definition)`
+* `minetest.override_chatcommand(name, redefinition)`
+    * Overrides fields of a chatcommand registered with `register_chatcommand`.
+* `minetest.unregister_chatcommand(name)`
+    * Unregisters a chatcommands registered with `register_chatcommand`.
+* `minetest.register_privilege(name, definition)`
+    * `definition` can be a description or a definition table (see [Privilege
+      definition]).
+    * If it is a description, the priv will be granted to singleplayer and admin
+      by default.
+    * To allow players with `basic_privs` to grant, see the `basic_privs`
+      minetest.conf setting.
+* `minetest.register_authentication_handler(authentication handler definition)`
+    * Registers an auth handler that overrides the builtin one.
+    * This function can be called by a single mod once only.
+
+Global callback registration functions
+--------------------------------------
+
+Call these functions only at load time!
+
+* `minetest.register_globalstep(function(dtime))`
+    * Called every server step, usually interval of 0.1s
+* `minetest.register_on_mods_loaded(function())`
+    * Called after mods have finished loading and before the media is cached or the
+      aliases handled.
+* `minetest.register_on_shutdown(function())`
+    * Called before server shutdown
+    * **Warning**: If the server terminates abnormally (i.e. crashes), the
+      registered callbacks **will likely not be run**. Data should be saved at
+      semi-frequent intervals as well as on server shutdown.
+* `minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack, pointed_thing))`
+    * Called when a node has been placed
+    * If return `true` no item is taken from `itemstack`
+    * `placer` may be any valid ObjectRef or nil.
+    * **Not recommended**; use `on_construct` or `after_place_node` in node
+      definition whenever possible.
+* `minetest.register_on_dignode(function(pos, oldnode, digger))`
+    * Called when a node has been dug.
+    * **Not recommended**; Use `on_destruct` or `after_dig_node` in node
+      definition whenever possible.
+* `minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing))`
+    * Called when a node is punched
+* `minetest.register_on_generated(function(minp, maxp, blockseed))`
+    * Called after generating a piece of world. Modifying nodes inside the area
+      is a bit faster than usually.
+* `minetest.register_on_newplayer(function(ObjectRef))`
+    * Called after a new player has been created
+* `minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage))`
+    * Called when a player is punched
+    * Note: This callback is invoked even if the punched player is dead.
+    * `player`: ObjectRef - Player that was punched
+    * `hitter`: ObjectRef - Player that hit
+    * `time_from_last_punch`: Meant for disallowing spamming of clicks
+      (can be nil).
+    * `tool_capabilities`: Capability table of used tool (can be nil)
+    * `dir`: Unit vector of direction of punch. Always defined. Points from
+      the puncher to the punched.
+    * `damage`: Number that represents the damage calculated by the engine
+    * should return `true` to prevent the default damage mechanism
+* `minetest.register_on_player_hpchange(function(player, hp_change, reason), modifier)`
+    * Called when the player gets damaged or healed
+    * `player`: ObjectRef of the player
+    * `hp_change`: the amount of change. Negative when it is damage.
+    * `reason`: a PlayerHPChangeReason table.
+        * The `type` field will have one of the following values:
+            * `set_hp`: A mod or the engine called `set_hp` without
+                        giving a type - use this for custom damage types.
+            * `punch`: Was punched. `reason.object` will hold the puncher, or nil if none.
+            * `fall`
+            * `node_damage`: `damage_per_second` from a neighbouring node.
+                             `reason.node` will hold the node name or nil.
+            * `drown`
+            * `respawn`
+        * Any of the above types may have additional fields from mods.
+        * `reason.from` will be `mod` or `engine`.
+    * `modifier`: when true, the function should return the actual `hp_change`.
+       Note: modifiers only get a temporary `hp_change` that can be modified by later modifiers.
+       Modifiers can return true as a second argument to stop the execution of further functions.
+       Non-modifiers receive the final HP change calculated by the modifiers.
+* `minetest.register_on_dieplayer(function(ObjectRef, reason))`
+    * Called when a player dies
+    * `reason`: a PlayerHPChangeReason table, see register_on_player_hpchange
+* `minetest.register_on_respawnplayer(function(ObjectRef))`
+    * Called when player is to be respawned
+    * Called _before_ repositioning of player occurs
+    * return true in func to disable regular player placement
+* `minetest.register_on_prejoinplayer(function(name, ip))`
+    * Called before a player joins the game
+    * If it returns a string, the player is disconnected with that string as
+      reason.
+* `minetest.register_on_joinplayer(function(ObjectRef))`
+    * Called when a player joins the game
+* `minetest.register_on_leaveplayer(function(ObjectRef, timed_out))`
+    * Called when a player leaves the game
+    * `timed_out`: True for timeout, false for other reasons.
+* `minetest.register_on_auth_fail(function(name, ip))`
+    * Called when a client attempts to log into an account but supplies the
+      wrong password.
+    * `ip`: The IP address of the client.
+    * `name`: The account the client attempted to log into.
+* `minetest.register_on_cheat(function(ObjectRef, cheat))`
+    * Called when a player cheats
+    * `cheat`: `{type=<cheat_type>}`, where `<cheat_type>` is one of:
+        * `moved_too_fast`
+        * `interacted_too_far`
+        * `interacted_while_dead`
+        * `finished_unknown_dig`
+        * `dug_unbreakable`
+        * `dug_too_fast`
+* `minetest.register_on_chat_message(function(name, message))`
+    * Called always when a player says something
+    * Return `true` to mark the message as handled, which means that it will
+      not be sent to other players.
+* `minetest.register_on_player_receive_fields(function(player, formname, fields))`
+    * Called when the server received input from `player` in a formspec with
+      the given `formname`. Specifically, this is called on any of the
+      following events:
+          * a button was pressed,
+          * Enter was pressed while the focus was on a text field
+          * a checkbox was toggled,
+          * something was selecteed in a drop-down list,
+          * a different tab was selected,
+          * selection was changed in a textlist or table,
+          * an entry was double-clicked in a textlist or table,
+          * a scrollbar was moved, or
+          * the form was actively closed by the player.
+    * Fields are sent for formspec elements which define a field. `fields`
+      is a table containing each formspecs element value (as string), with
+      the `name` parameter as index for each. The value depends on the
+      formspec element type:
+        * `animated_image`: Returns the index of the current frame.
+        * `button` and variants: If pressed, contains the user-facing button
+          text as value. If not pressed, is `nil`
+        * `field`, `textarea` and variants: Text in the field
+        * `dropdown`: Text of selected item
+        * `tabheader`: Tab index, starting with `"1"` (only if tab changed)
+        * `checkbox`: `"true"` if checked, `"false"` if unchecked
+        * `textlist`: See `minetest.explode_textlist_event`
+        * `table`: See `minetest.explode_table_event`
+        * `scrollbar`: See `minetest.explode_scrollbar_event`
+        * Special case: `["quit"]="true"` is sent when the user actively
+          closed the form by mouse click, keypress or through a button_exit[]
+          element.
+        * Special case: `["key_enter"]="true"` is sent when the user pressed
+          the Enter key and the focus was either nowhere (causing the formspec
+          to be closed) or on a button. If the focus was on a text field,
+          additionally, the index `key_enter_field` contains the name of the
+          text field. See also: `field_close_on_enter`.
+    * Newest functions are called first
+    * If function returns `true`, remaining functions are not called
+* `minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv))`
+    * Called when `player` crafts something
+    * `itemstack` is the output
+    * `old_craft_grid` contains the recipe (Note: the one in the inventory is
+      cleared).
+    * `craft_inv` is the inventory with the crafting grid
+    * Return either an `ItemStack`, to replace the output, or `nil`, to not
+      modify it.
+* `minetest.register_craft_predict(function(itemstack, player, old_craft_grid, craft_inv))`
+    * The same as before, except that it is called before the player crafts, to
+      make craft prediction, and it should not change anything.
+* `minetest.register_allow_player_inventory_action(function(player, action, inventory, inventory_info))`
+    * Determinates how much of a stack may be taken, put or moved to a
+      player inventory.
+    * `player` (type `ObjectRef`) is the player who modified the inventory
+      `inventory` (type `InvRef`).
+    * List of possible `action` (string) values and their
+      `inventory_info` (table) contents:
+        * `move`: `{from_list=string, to_list=string, from_index=number, to_index=number, count=number}`
+        * `put`:  `{listname=string, index=number, stack=ItemStack}`
+        * `take`: Same as `put`
+    * Return a numeric value to limit the amount of items to be taken, put or
+      moved. A value of `-1` for `take` will make the source stack infinite.
+* `minetest.register_on_player_inventory_action(function(player, action, inventory, inventory_info))`
+    * Called after a take, put or move event from/to/in a player inventory
+    * Function arguments: see `minetest.register_allow_player_inventory_action`
+    * Does not accept or handle any return value.
+* `minetest.register_on_protection_violation(function(pos, name))`
+    * Called by `builtin` and mods when a player violates protection at a
+      position (eg, digs a node or punches a protected entity).
+    * The registered functions can be called using
+      `minetest.record_protection_violation`.
+    * The provided function should check that the position is protected by the
+      mod calling this function before it prints a message, if it does, to
+      allow for multiple protection mods.
+* `minetest.register_on_item_eat(function(hp_change, replace_with_item, itemstack, user, pointed_thing))`
+    * Called when an item is eaten, by `minetest.item_eat`
+    * Return `itemstack` to cancel the default item eat response (i.e.: hp increase).
+* `minetest.register_on_priv_grant(function(name, granter, priv))`
+    * Called when `granter` grants the priv `priv` to `name`.
+    * Note that the callback will be called twice if it's done by a player,
+      once with granter being the player name, and again with granter being nil.
+* `minetest.register_on_priv_revoke(function(name, revoker, priv))`
+    * Called when `revoker` revokes the priv `priv` from `name`.
+    * Note that the callback will be called twice if it's done by a player,
+      once with revoker being the player name, and again with revoker being nil.
+* `minetest.register_can_bypass_userlimit(function(name, ip))`
+    * Called when `name` user connects with `ip`.
+    * Return `true` to by pass the player limit
+* `minetest.register_on_modchannel_message(function(channel_name, sender, message))`
+    * Called when an incoming mod channel message is received
+    * You should have joined some channels to receive events.
+    * If message comes from a server mod, `sender` field is an empty string.
+
+Setting-related
+---------------
+
+* `minetest.settings`: Settings object containing all of the settings from the
+  main config file (`minetest.conf`).
+* `minetest.setting_get_pos(name)`: Loads a setting from the main settings and
+  parses it as a position (in the format `(1,2,3)`). Returns a position or nil.
+
+Authentication
+--------------
+
+* `minetest.string_to_privs(str[, delim])`:
+    * Converts string representation of privs into table form
+    * `delim`: String separating the privs. Defaults to `","`.
+    * Returns `{ priv1 = true, ... }`
+* `minetest.privs_to_string(privs[, delim])`:
+    * Returns the string representation of `privs`
+    * `delim`: String to delimit privs. Defaults to `","`.
+* `minetest.get_player_privs(name) -> {priv1=true,...}`
+* `minetest.check_player_privs(player_or_name, ...)`:
+  returns `bool, missing_privs`
+    * A quickhand for checking privileges.
+    * `player_or_name`: Either a Player object or the name of a player.
+    * `...` is either a list of strings, e.g. `"priva", "privb"` or
+      a table, e.g. `{ priva = true, privb = true }`.
+
+* `minetest.check_password_entry(name, entry, password)`
+    * Returns true if the "password entry" for a player with name matches given
+      password, false otherwise.
+    * The "password entry" is the password representation generated by the
+      engine as returned as part of a `get_auth()` call on the auth handler.
+    * Only use this function for making it possible to log in via password from
+      external protocols such as IRC, other uses are frowned upon.
+* `minetest.get_password_hash(name, raw_password)`
+    * Convert a name-password pair to a password hash that Minetest can use.
+    * The returned value alone is not a good basis for password checks based
+      on comparing the password hash in the database with the password hash
+      from the function, with an externally provided password, as the hash
+      in the db might use the new SRP verifier format.
+    * For this purpose, use `minetest.check_password_entry` instead.
+* `minetest.get_player_ip(name)`: returns an IP address string for the player
+  `name`.
+    * The player needs to be online for this to be successful.
+
+* `minetest.get_auth_handler()`: Return the currently active auth handler
+    * See the [Authentication handler definition]
+    * Use this to e.g. get the authentication data for a player:
+      `local auth_data = minetest.get_auth_handler().get_auth(playername)`
+* `minetest.notify_authentication_modified(name)`
+    * Must be called by the authentication handler for privilege changes.
+    * `name`: string; if omitted, all auth data should be considered modified
+* `minetest.set_player_password(name, password_hash)`: Set password hash of
+  player `name`.
+* `minetest.set_player_privs(name, {priv1=true,...})`: Set privileges of player
+  `name`.
+* `minetest.auth_reload()`
+    * See `reload()` in authentication handler definition
+
+`minetest.set_player_password`, `minetest.set_player_privs`,
+`minetest.get_player_privs` and `minetest.auth_reload` call the authentication
+handler.
+
+Chat
+----
+
+* `minetest.chat_send_all(text)`
+* `minetest.chat_send_player(name, text)`
+* `minetest.format_chat_message(name, message)`
+    * Used by the server to format a chat message, based on the setting `chat_message_format`.
+      Refer to the documentation of the setting for a list of valid placeholders.
+    * Takes player name and message, and returns the formatted string to be sent to players.
+    * Can be redefined by mods if required, for things like colored names or messages.
+    * **Only** the first occurrence of each placeholder will be replaced.
+
+Environment access
+------------------
+
+* `minetest.set_node(pos, node)`
+* `minetest.add_node(pos, node)`: alias to `minetest.set_node`
+    * Set node at position `pos`
+    * `node`: table `{name=string, param1=number, param2=number}`
+    * If param1 or param2 is omitted, it's set to `0`.
+    * e.g. `minetest.set_node({x=0, y=10, z=0}, {name="default:wood"})`
+* `minetest.bulk_set_node({pos1, pos2, pos3, ...}, node)`
+    * Set node on all positions set in the first argument.
+    * e.g. `minetest.bulk_set_node({{x=0, y=1, z=1}, {x=1, y=2, z=2}}, {name="default:stone"})`
+    * For node specification or position syntax see `minetest.set_node` call
+    * Faster than set_node due to single call, but still considerably slower
+      than Lua Voxel Manipulators (LVM) for large numbers of nodes.
+      Unlike LVMs, this will call node callbacks. It also allows setting nodes
+      in spread out positions which would cause LVMs to waste memory.
+      For setting a cube, this is 1.3x faster than set_node whereas LVM is 20
+      times faster.
+* `minetest.swap_node(pos, node)`
+    * Set node at position, but don't remove metadata
+* `minetest.remove_node(pos)`
+    * By default it does the same as `minetest.set_node(pos, {name="air"})`
+* `minetest.get_node(pos)`
+    * Returns the node at the given position as table in the format
+      `{name="node_name", param1=0, param2=0}`,
+      returns `{name="ignore", param1=0, param2=0}` for unloaded areas.
+* `minetest.get_node_or_nil(pos)`
+    * Same as `get_node` but returns `nil` for unloaded areas.
+* `minetest.get_node_light(pos, timeofday)`
+    * Gets the light value at the given position. Note that the light value
+      "inside" the node at the given position is returned, so you usually want
+      to get the light value of a neighbor.
+    * `pos`: The position where to measure the light.
+    * `timeofday`: `nil` for current time, `0` for night, `0.5` for day
+    * Returns a number between `0` and `15` or `nil`
+* `minetest.place_node(pos, node)`
+    * Place node with the same effects that a player would cause
+* `minetest.dig_node(pos)`
+    * Dig node with the same effects that a player would cause
+    * Returns `true` if successful, `false` on failure (e.g. protected location)
+* `minetest.punch_node(pos)`
+    * Punch node with the same effects that a player would cause
+* `minetest.spawn_falling_node(pos)`
+    * Change node into falling node
+    * Returns `true` if successful, `false` on failure
+
+* `minetest.find_nodes_with_meta(pos1, pos2)`
+    * Get a table of positions of nodes that have metadata within a region
+      {pos1, pos2}.
+* `minetest.get_meta(pos)`
+    * Get a `NodeMetaRef` at that position
+* `minetest.get_node_timer(pos)`
+    * Get `NodeTimerRef`
+
+* `minetest.add_entity(pos, name, [staticdata])`: Spawn Lua-defined entity at
+  position.
+    * Returns `ObjectRef`, or `nil` if failed
+* `minetest.add_item(pos, item)`: Spawn item
+    * Returns `ObjectRef`, or `nil` if failed
+* `minetest.get_player_by_name(name)`: Get an `ObjectRef` to a player
+* `minetest.get_objects_inside_radius(pos, radius)`: returns a list of
+  ObjectRefs.
+    * `radius`: using an euclidean metric
+* `minetest.set_timeofday(val)`
+    * `val` is between `0` and `1`; `0` for midnight, `0.5` for midday
+* `minetest.get_timeofday()`
+* `minetest.get_gametime()`: returns the time, in seconds, since the world was
+  created.
+* `minetest.get_day_count()`: returns number days elapsed since world was
+  created.
+    * accounts for time changes.
+* `minetest.find_node_near(pos, radius, nodenames, [search_center])`: returns
+  pos or `nil`.
+    * `radius`: using a maximum metric
+    * `nodenames`: e.g. `{"ignore", "group:tree"}` or `"default:dirt"`
+    * `search_center` is an optional boolean (default: `false`)
+      If true `pos` is also checked for the nodes
+* `minetest.find_nodes_in_area(pos1, pos2, nodenames)`: returns a list of
+  positions.
+    * `nodenames`: e.g. `{"ignore", "group:tree"}` or `"default:dirt"`
+    * First return value: Table with all node positions
+    * Second return value: Table with the count of each node with the node name
+      as index.
+    * Area volume is limited to 4,096,000 nodes
+* `minetest.find_nodes_in_area_under_air(pos1, pos2, nodenames)`: returns a
+  list of positions.
+    * `nodenames`: e.g. `{"ignore", "group:tree"}` or `"default:dirt"`
+    * Return value: Table with all node positions with a node air above
+    * Area volume is limited to 4,096,000 nodes
+* `minetest.get_perlin(noiseparams)`
+* `minetest.get_perlin(seeddiff, octaves, persistence, spread)`
+    * Return world-specific perlin noise (`int(worldseed)+seeddiff`)
+* `minetest.get_voxel_manip([pos1, pos2])`
+    * Return voxel manipulator object.
+    * Loads the manipulator from the map if positions are passed.
+* `minetest.set_gen_notify(flags, {deco_ids})`
+    * Set the types of on-generate notifications that should be collected.
+    * `flags` is a flag field with the available flags:
+        * dungeon
+        * temple
+        * cave_begin
+        * cave_end
+        * large_cave_begin
+        * large_cave_end
+        * decoration
+    * The second parameter is a list of IDs of decorations which notification
+      is requested for.
+* `minetest.get_gen_notify()`
+    * Returns a flagstring and a table with the `deco_id`s.
+* `minetest.get_decoration_id(decoration_name)`
+    * Returns the decoration ID number for the provided decoration name string,
+      or `nil` on failure.
+* `minetest.get_mapgen_object(objectname)`
+    * Return requested mapgen object if available (see [Mapgen objects])
+* `minetest.get_heat(pos)`
+    * Returns the heat at the position, or `nil` on failure.
+* `minetest.get_humidity(pos)`
+    * Returns the humidity at the position, or `nil` on failure.
+* `minetest.get_biome_data(pos)`
+    * Returns a table containing:
+        * `biome` the biome id of the biome at that position
+        * `heat` the heat at the position
+        * `humidity` the humidity at the position
+    * Or returns `nil` on failure.
+* `minetest.get_biome_id(biome_name)`
+    * Returns the biome id, as used in the biomemap Mapgen object and returned
+      by `minetest.get_biome_data(pos)`, for a given biome_name string.
+* `minetest.get_biome_name(biome_id)`
+    * Returns the biome name string for the provided biome id, or `nil` on
+      failure.
+    * If no biomes have been registered, such as in mgv6, returns `default`.
+* `minetest.get_mapgen_params()`
+    * Deprecated: use `minetest.get_mapgen_setting(name)` instead.
+    * Returns a table containing:
+        * `mgname`
+        * `seed`
+        * `chunksize`
+        * `water_level`
+        * `flags`
+* `minetest.set_mapgen_params(MapgenParams)`
+    * Deprecated: use `minetest.set_mapgen_setting(name, value, override)`
+      instead.
+    * Set map generation parameters.
+    * Function cannot be called after the registration period; only
+      initialization and `on_mapgen_init`.
+    * Takes a table as an argument with the fields:
+        * `mgname`
+        * `seed`
+        * `chunksize`
+        * `water_level`
+        * `flags`
+    * Leave field unset to leave that parameter unchanged.
+    * `flags` contains a comma-delimited string of flags to set, or if the
+      prefix `"no"` is attached, clears instead.
+    * `flags` is in the same format and has the same options as `mg_flags` in
+      `minetest.conf`.
+* `minetest.get_mapgen_setting(name)`
+    * Gets the *active* mapgen setting (or nil if none exists) in string
+      format with the following order of precedence:
+        1) Settings loaded from map_meta.txt or overrides set during mod
+           execution.
+        2) Settings set by mods without a metafile override
+        3) Settings explicitly set in the user config file, minetest.conf
+        4) Settings set as the user config default
+* `minetest.get_mapgen_setting_noiseparams(name)`
+    * Same as above, but returns the value as a NoiseParams table if the
+      setting `name` exists and is a valid NoiseParams.
+* `minetest.set_mapgen_setting(name, value, [override_meta])`
+    * Sets a mapgen param to `value`, and will take effect if the corresponding
+      mapgen setting is not already present in map_meta.txt.
+    * `override_meta` is an optional boolean (default: `false`). If this is set
+      to true, the setting will become the active setting regardless of the map
+      metafile contents.
+    * Note: to set the seed, use `"seed"`, not `"fixed_map_seed"`.
+* `minetest.set_mapgen_setting_noiseparams(name, value, [override_meta])`
+    * Same as above, except value is a NoiseParams table.
+* `minetest.set_noiseparams(name, noiseparams, set_default)`
+    * Sets the noiseparams setting of `name` to the noiseparams table specified
+      in `noiseparams`.
+    * `set_default` is an optional boolean (default: `true`) that specifies
+      whether the setting should be applied to the default config or current
+      active config.
+* `minetest.get_noiseparams(name)`
+    * Returns a table of the noiseparams for name.
+* `minetest.generate_ores(vm, pos1, pos2)`
+    * Generate all registered ores within the VoxelManip `vm` and in the area
+      from `pos1` to `pos2`.
+    * `pos1` and `pos2` are optional and default to mapchunk minp and maxp.
+* `minetest.generate_decorations(vm, pos1, pos2)`
+    * Generate all registered decorations within the VoxelManip `vm` and in the
+      area from `pos1` to `pos2`.
+    * `pos1` and `pos2` are optional and default to mapchunk minp and maxp.
+* `minetest.clear_objects([options])`
+    * Clear all objects in the environment
+    * Takes an optional table as an argument with the field `mode`.
+        * mode = `"full"` : Load and go through every mapblock, clearing
+                            objects (default).
+        * mode = `"quick"`: Clear objects immediately in loaded mapblocks,
+                            clear objects in unloaded mapblocks only when the
+                            mapblocks are next activated.
+* `minetest.load_area(pos1[, pos2])`
+    * Load the mapblocks containing the area from `pos1` to `pos2`.
+      `pos2` defaults to `pos1` if not specified.
+    * This function does not trigger map generation.
+* `minetest.emerge_area(pos1, pos2, [callback], [param])`
+    * Queue all blocks in the area from `pos1` to `pos2`, inclusive, to be
+      asynchronously fetched from memory, loaded from disk, or if inexistent,
+      generates them.
+    * If `callback` is a valid Lua function, this will be called for each block
+      emerged.
+    * The function signature of callback is:
+      `function EmergeAreaCallback(blockpos, action, calls_remaining, param)`
+        * `blockpos` is the *block* coordinates of the block that had been
+          emerged.
+        * `action` could be one of the following constant values:
+            * `minetest.EMERGE_CANCELLED`
+            * `minetest.EMERGE_ERRORED`
+            * `minetest.EMERGE_FROM_MEMORY`
+            * `minetest.EMERGE_FROM_DISK`
+            * `minetest.EMERGE_GENERATED`
+        * `calls_remaining` is the number of callbacks to be expected after
+          this one.
+        * `param` is the user-defined parameter passed to emerge_area (or
+          nil if the parameter was absent).
+* `minetest.delete_area(pos1, pos2)`
+    * delete all mapblocks in the area from pos1 to pos2, inclusive
+* `minetest.line_of_sight(pos1, pos2)`: returns `boolean, pos`
+    * Checks if there is anything other than air between pos1 and pos2.
+    * Returns false if something is blocking the sight.
+    * Returns the position of the blocking node when `false`
+    * `pos1`: First position
+    * `pos2`: Second position
+* `minetest.raycast(pos1, pos2, objects, liquids)`: returns `Raycast`
+    * Creates a `Raycast` object.
+    * `pos1`: start of the ray
+    * `pos2`: end of the ray
+    * `objects`: if false, only nodes will be returned. Default is `true`.
+    * `liquids`: if false, liquid nodes won't be returned. Default is `false`.
+* `minetest.find_path(pos1,pos2,searchdistance,max_jump,max_drop,algorithm)`
+    * returns table containing path that can be walked on
+    * returns a table of 3D points representing a path from `pos1` to `pos2` or
+      `nil` on failure.
+    * Reasons for failure:
+        * No path exists at all
+        * No path exists within `searchdistance` (see below)
+        * Start or end pos is buried in land
+    * `pos1`: start position
+    * `pos2`: end position
+    * `searchdistance`: maximum distance from the search positions to search in.
+      In detail: Path must be completely inside a cuboid. The minimum
+      `searchdistance` of 1 will confine search between `pos1` and `pos2`.
+      Larger values will increase the size of this cuboid in all directions
+    * `max_jump`: maximum height difference to consider walkable
+    * `max_drop`: maximum height difference to consider droppable
+    * `algorithm`: One of `"A*_noprefetch"` (default), `"A*"`, `"Dijkstra"`.
+      Difference between `"A*"` and `"A*_noprefetch"` is that
+      `"A*"` will pre-calculate the cost-data, the other will calculate it
+      on-the-fly
+* `minetest.spawn_tree (pos, {treedef})`
+    * spawns L-system tree at given `pos` with definition in `treedef` table
+* `minetest.transforming_liquid_add(pos)`
+    * add node to liquid update queue
+* `minetest.get_node_max_level(pos)`
+    * get max available level for leveled node
+* `minetest.get_node_level(pos)`
+    * get level of leveled node (water, snow)
+* `minetest.set_node_level(pos, level)`
+    * set level of leveled node, default `level` equals `1`
+    * if `totallevel > maxlevel`, returns rest (`total-max`).
+* `minetest.add_node_level(pos, level)`
+    * increase level of leveled node by level, default `level` equals `1`
+    * if `totallevel > maxlevel`, returns rest (`total-max`)
+    * can be negative for decreasing
+* `minetest.fix_light(pos1, pos2)`: returns `true`/`false`
+    * resets the light in a cuboid-shaped part of
+      the map and removes lighting bugs.
+    * Loads the area if it is not loaded.
+    * `pos1` is the corner of the cuboid with the least coordinates
+      (in node coordinates), inclusive.
+    * `pos2` is the opposite corner of the cuboid, inclusive.
+    * The actual updated cuboid might be larger than the specified one,
+      because only whole map blocks can be updated.
+      The actual updated area consists of those map blocks that intersect
+      with the given cuboid.
+    * However, the neighborhood of the updated area might change
+      as well, as light can spread out of the cuboid, also light
+      might be removed.
+    * returns `false` if the area is not fully generated,
+      `true` otherwise
+* `minetest.check_single_for_falling(pos)`
+    * causes an unsupported `group:falling_node` node to fall and causes an
+      unattached `group:attached_node` node to fall.
+    * does not spread these updates to neighbours.
+* `minetest.check_for_falling(pos)`
+    * causes an unsupported `group:falling_node` node to fall and causes an
+      unattached `group:attached_node` node to fall.
+    * spread these updates to neighbours and can cause a cascade
+      of nodes to fall.
+* `minetest.get_spawn_level(x, z)`
+    * Returns a player spawn y co-ordinate for the provided (x, z)
+      co-ordinates, or `nil` for an unsuitable spawn point.
+    * For most mapgens a 'suitable spawn point' is one with y between
+      `water_level` and `water_level + 16`, and in mgv7 well away from rivers,
+      so `nil` will be returned for many (x, z) co-ordinates.
+    * The spawn level returned is for a player spawn in unmodified terrain.
+    * The spawn level is intentionally above terrain level to cope with
+      full-node biome 'dust' nodes.
+
+Mod channels
+------------
+
+You can find mod channels communication scheme in `doc/mod_channels.png`.
+
+* `minetest.mod_channel_join(channel_name)`
+    * Server joins channel `channel_name`, and creates it if necessary. You
+      should listen for incoming messages with
+      `minetest.register_on_modchannel_message`
+
+Inventory
+---------
+
+`minetest.get_inventory(location)`: returns an `InvRef`
+
+* `location` = e.g.
+    * `{type="player", name="celeron55"}`
+    * `{type="node", pos={x=, y=, z=}}`
+    * `{type="detached", name="creative"}`
+* `minetest.create_detached_inventory(name, callbacks, [player_name])`: returns
+  an `InvRef`.
+    * `callbacks`: See [Detached inventory callbacks]
+    * `player_name`: Make detached inventory available to one player
+      exclusively, by default they will be sent to every player (even if not
+      used).
+      Note that this parameter is mostly just a workaround and will be removed
+      in future releases.
+    * Creates a detached inventory. If it already exists, it is cleared.
+* `minetest.remove_detached_inventory(name)`
+    * Returns a `boolean` indicating whether the removal succeeded.
+* `minetest.do_item_eat(hp_change, replace_with_item, itemstack, user, pointed_thing)`:
+  returns left over ItemStack.
+    * See `minetest.item_eat` and `minetest.register_on_item_eat`
+
+Formspec
+--------
+
+* `minetest.show_formspec(playername, formname, formspec)`
+    * `playername`: name of player to show formspec
+    * `formname`: name passed to `on_player_receive_fields` callbacks.
+      It should follow the `"modname:<whatever>"` naming convention
+    * `formspec`: formspec to display
+* `minetest.close_formspec(playername, formname)`
+    * `playername`: name of player to close formspec
+    * `formname`: has to exactly match the one given in `show_formspec`, or the
+      formspec will not close.
+    * calling `show_formspec(playername, formname, "")` is equal to this
+      expression.
+    * to close a formspec regardless of the formname, call
+      `minetest.close_formspec(playername, "")`.
+      **USE THIS ONLY WHEN ABSOLUTELY NECESSARY!**
+* `minetest.formspec_escape(string)`: returns a string
+    * escapes the characters "[", "]", "\", "," and ";", which can not be used
+      in formspecs.
+* `minetest.explode_table_event(string)`: returns a table
+    * returns e.g. `{type="CHG", row=1, column=2}`
+    * `type` is one of:
+        * `"INV"`: no row selected
+        * `"CHG"`: selected
+        * `"DCL"`: double-click
+* `minetest.explode_textlist_event(string)`: returns a table
+    * returns e.g. `{type="CHG", index=1}`
+    * `type` is one of:
+        * `"INV"`: no row selected
+        * `"CHG"`: selected
+        * `"DCL"`: double-click
+* `minetest.explode_scrollbar_event(string)`: returns a table
+    * returns e.g. `{type="CHG", value=500}`
+    * `type` is one of:
+        * `"INV"`: something failed
+        * `"CHG"`: has been changed
+        * `"VAL"`: not changed
+
+Item handling
+-------------
+
+* `minetest.inventorycube(img1, img2, img3)`
+    * Returns a string for making an image of a cube (useful as an item image)
+* `minetest.get_pointed_thing_position(pointed_thing, above)`
+    * Returns the position of a `pointed_thing` or `nil` if the `pointed_thing`
+      does not refer to a node or entity.
+    * If the optional `above` parameter is true and the `pointed_thing` refers
+      to a node, then it will return the `above` position of the `pointed_thing`.
+* `minetest.dir_to_facedir(dir, is6d)`
+    * Convert a vector to a facedir value, used in `param2` for
+      `paramtype2="facedir"`.
+    * passing something non-`nil`/`false` for the optional second parameter
+      causes it to take the y component into account.
+* `minetest.facedir_to_dir(facedir)`
+    * Convert a facedir back into a vector aimed directly out the "back" of a
+      node.
+* `minetest.dir_to_wallmounted(dir)`
+    * Convert a vector to a wallmounted value, used for
+      `paramtype2="wallmounted"`.
+* `minetest.wallmounted_to_dir(wallmounted)`
+    * Convert a wallmounted value back into a vector aimed directly out the
+      "back" of a node.
+* `minetest.dir_to_yaw(dir)`
+    * Convert a vector into a yaw (angle)
+* `minetest.yaw_to_dir(yaw)`
+    * Convert yaw (angle) to a vector
+* `minetest.is_colored_paramtype(ptype)`
+    * Returns a boolean. Returns `true` if the given `paramtype2` contains
+      color information (`color`, `colorwallmounted` or `colorfacedir`).
+* `minetest.strip_param2_color(param2, paramtype2)`
+    * Removes everything but the color information from the
+      given `param2` value.
+    * Returns `nil` if the given `paramtype2` does not contain color
+      information.
+* `minetest.get_node_drops(node, toolname)`
+    * Returns list of itemstrings that are dropped by `node` when dug
+      with `toolname`.
+    * `node`: node as table or node name
+    * `toolname`: name of the tool item (can be `nil`)
+* `minetest.get_craft_result(input)`: returns `output, decremented_input`
+    * `input.method` = `"normal"` or `"cooking"` or `"fuel"`
+    * `input.width` = for example `3`
+    * `input.items` = for example
+      `{stack1, stack2, stack3, stack4, stack 5, stack 6, stack 7, stack 8, stack 9}`
+    * `output.item` = `ItemStack`, if unsuccessful: empty `ItemStack`
+    * `output.time` = a number, if unsuccessful: `0`
+    * `output.replacements` = List of replacement `ItemStack`s that couldn't be
+      placed in `decremented_input.items`. Replacements can be placed in
+      `decremented_input` if the stack of the replaced item has a count of 1.
+    * `decremented_input` = like `input`
+* `minetest.get_craft_recipe(output)`: returns input
+    * returns last registered recipe for output item (node)
+    * `output` is a node or item type such as `"default:torch"`
+    * `input.method` = `"normal"` or `"cooking"` or `"fuel"`
+    * `input.width` = for example `3`
+    * `input.items` = for example
+      `{stack1, stack2, stack3, stack4, stack 5, stack 6, stack 7, stack 8, stack 9}`
+        * `input.items` = `nil` if no recipe found
+* `minetest.get_all_craft_recipes(query item)`: returns a table or `nil`
+    * returns indexed table with all registered recipes for query item (node)
+      or `nil` if no recipe was found.
+    * recipe entry table:
+        * `method`: 'normal' or 'cooking' or 'fuel'
+        * `width`: 0-3, 0 means shapeless recipe
+        * `items`: indexed [1-9] table with recipe items
+        * `output`: string with item name and quantity
+    * Example query for `"default:gold_ingot"` will return table:
+
+          {
+              [1]={method = "cooking", width = 3, output = "default:gold_ingot",
+              items = {1 = "default:gold_lump"}},
+              [2]={method = "normal", width = 1, output = "default:gold_ingot 9",
+              items = {1 = "default:goldblock"}}
+          }
+* `minetest.handle_node_drops(pos, drops, digger)`
+    * `drops`: list of itemstrings
+    * Handles drops from nodes after digging: Default action is to put them
+      into digger's inventory.
+    * Can be overridden to get different functionality (e.g. dropping items on
+      ground)
+* `minetest.itemstring_with_palette(item, palette_index)`: returns an item
+  string.
+    * Creates an item string which contains palette index information
+      for hardware colorization. You can use the returned string
+      as an output in a craft recipe.
+    * `item`: the item stack which becomes colored. Can be in string,
+      table and native form.
+    * `palette_index`: this index is added to the item stack
+* `minetest.itemstring_with_color(item, colorstring)`: returns an item string
+    * Creates an item string which contains static color information
+      for hardware colorization. Use this method if you wish to colorize
+      an item that does not own a palette. You can use the returned string
+      as an output in a craft recipe.
+    * `item`: the item stack which becomes colored. Can be in string,
+      table and native form.
+    * `colorstring`: the new color of the item stack
+
+Rollback
+--------
+
+* `minetest.rollback_get_node_actions(pos, range, seconds, limit)`:
+  returns `{{actor, pos, time, oldnode, newnode}, ...}`
+    * Find who has done something to a node, or near a node
+    * `actor`: `"player:<name>"`, also `"liquid"`.
+* `minetest.rollback_revert_actions_by(actor, seconds)`: returns
+  `boolean, log_messages`.
+    * Revert latest actions of someone
+    * `actor`: `"player:<name>"`, also `"liquid"`.
+
+Defaults for the `on_place` and `on_drop` item definition functions
+-------------------------------------------------------------------
+
+* `minetest.item_place_node(itemstack, placer, pointed_thing[, param2, prevent_after_place])`
+    * Place item as a node
+    * `param2` overrides `facedir` and wallmounted `param2`
+    * `prevent_after_place`: if set to `true`, `after_place_node` is not called
+      for the newly placed node to prevent a callback and placement loop
+    * returns `itemstack, position`
+      * `position`: the location the node was placed to. `nil` if nothing was placed.
+* `minetest.item_place_object(itemstack, placer, pointed_thing)`
+    * Place item as-is
+    * returns the leftover itemstack
+    * **Note**: This function is deprecated and will never be called.
+* `minetest.item_place(itemstack, placer, pointed_thing[, param2])`
+    * Wrapper that calls `minetest.item_place_node` if appropriate
+    * Calls `on_rightclick` of `pointed_thing.under` if defined instead
+    * **Note**: is not called when wielded item overrides `on_place`
+    * `param2` overrides facedir and wallmounted `param2`
+    * returns `itemstack, position`
+      * `position`: the location the node was placed to. `nil` if nothing was placed.
+* `minetest.item_drop(itemstack, dropper, pos)`
+    * Drop the item
+    * returns the leftover itemstack
+* `minetest.item_eat(hp_change[, replace_with_item])`
+    * Returns `function(itemstack, user, pointed_thing)` as a
+      function wrapper for `minetest.do_item_eat`.
+    * `replace_with_item` is the itemstring which is added to the inventory.
+      If the player is eating a stack, then replace_with_item goes to a
+      different spot.
+
+Defaults for the `on_punch` and `on_dig` node definition callbacks
+------------------------------------------------------------------
+
+* `minetest.node_punch(pos, node, puncher, pointed_thing)`
+    * Calls functions registered by `minetest.register_on_punchnode()`
+* `minetest.node_dig(pos, node, digger)`
+    * Checks if node can be dug, puts item into inventory, removes node
+    * Calls functions registered by `minetest.registered_on_dignodes()`
+
+Sounds
+------
+
+* `minetest.sound_play(spec, parameters, [ephemeral])`: returns a handle
+    * `spec` is a `SimpleSoundSpec`
+    * `parameters` is a sound parameter table
+    * `ephemeral` is a boolean (default: false)
+      Ephemeral sounds will not return a handle and can't be stopped or faded.
+      It is recommend to use this for short sounds that happen in response to
+      player actions (e.g. door closing).
+* `minetest.sound_stop(handle)`
+    * `handle` is a handle returned by `minetest.sound_play`
+* `minetest.sound_fade(handle, step, gain)`
+    * `handle` is a handle returned by `minetest.sound_play`
+    * `step` determines how fast a sound will fade.
+      Negative step will lower the sound volume, positive step will increase
+      the sound volume.
+    * `gain` the target gain for the fade.
+
+Timing
+------
+
+* `minetest.after(time, func, ...)`
+    * Call the function `func` after `time` seconds, may be fractional
+    * Optional: Variable number of arguments that are passed to `func`
+
+Server
+------
+
+* `minetest.request_shutdown([message],[reconnect],[delay])`: request for
+  server shutdown. Will display `message` to clients.
+    * `reconnect` == true displays a reconnect button
+    * `delay` adds an optional delay (in seconds) before shutdown.
+      Negative delay cancels the current active shutdown.
+      Zero delay triggers an immediate shutdown.
+* `minetest.cancel_shutdown_requests()`: cancel current delayed shutdown
+* `minetest.get_server_status(name, joined)`
+    * Returns the server status string when a player joins or when the command
+      `/status` is called. Returns `nil` or an empty string when the message is
+      disabled.
+    * `joined`: Boolean value, indicates whether the function was called when
+      a player joined.
+    * This function may be overwritten by mods to customize the status message.
+* `minetest.get_server_uptime()`: returns the server uptime in seconds
+* `minetest.remove_player(name)`: remove player from database (if they are not
+  connected).
+    * As auth data is not removed, minetest.player_exists will continue to
+      return true. Call the below method as well if you want to remove auth
+      data too.
+    * Returns a code (0: successful, 1: no such player, 2: player is connected)
+* `minetest.remove_player_auth(name)`: remove player authentication data
+    * Returns boolean indicating success (false if player nonexistant)
+
+Bans
+----
+
+* `minetest.get_ban_list()`: returns a list of all bans formatted as string
+* `minetest.get_ban_description(ip_or_name)`: returns list of bans matching
+  IP address or name formatted as string
+* `minetest.ban_player(name)`: ban the IP of a currently connected player
+    * Returns boolean indicating success
+* `minetest.unban_player_or_ip(ip_or_name)`: remove ban record matching
+  IP address or name
+* `minetest.kick_player(name, [reason])`: disconnect a player with an optional
+  reason.
+    * Returns boolean indicating success (false if player nonexistant)
+
+Particles
+---------
+
+* `minetest.add_particle(particle definition)`
+    * Deprecated: `minetest.add_particle(pos, velocity, acceleration,
+      expirationtime, size, collisiondetection, texture, playername)`
+
+* `minetest.add_particlespawner(particlespawner definition)`
+    * Add a `ParticleSpawner`, an object that spawns an amount of particles
+      over `time` seconds.
+    * Returns an `id`, and -1 if adding didn't succeed
+    * Deprecated: `minetest.add_particlespawner(amount, time,
+      minpos, maxpos,
+      minvel, maxvel,
+      minacc, maxacc,
+      minexptime, maxexptime,
+      minsize, maxsize,
+      collisiondetection, texture, playername)`
+
+* `minetest.delete_particlespawner(id, player)`
+    * Delete `ParticleSpawner` with `id` (return value from
+      `minetest.add_particlespawner`).
+    * If playername is specified, only deletes on the player's client,
+      otherwise on all clients.
+
+Schematics
+----------
+
+* `minetest.create_schematic(p1, p2, probability_list, filename, slice_prob_list)`
+    * Create a schematic from the volume of map specified by the box formed by
+      p1 and p2.
+    * Apply the specified probability and per-node force-place to the specified
+      nodes according to the `probability_list`.
+        * `probability_list` is an array of tables containing two fields, `pos`
+          and `prob`.
+            * `pos` is the 3D vector specifying the absolute coordinates of the
+              node being modified,
+            * `prob` is an integer value from `0` to `255` that encodes
+              probability and per-node force-place. Probability has levels
+              0-127, then 128 may be added to encode per-node force-place.
+              For probability stated as 0-255, divide by 2 and round down to
+              get values 0-127, then add 128 to apply per-node force-place.
+            * If there are two or more entries with the same pos value, the
+              last entry is used.
+            * If `pos` is not inside the box formed by `p1` and `p2`, it is
+              ignored.
+            * If `probability_list` equals `nil`, no probabilities are applied.
+    * Apply the specified probability to the specified horizontal slices
+      according to the `slice_prob_list`.
+        * `slice_prob_list` is an array of tables containing two fields, `ypos`
+          and `prob`.
+            * `ypos` indicates the y position of the slice with a probability
+              applied, the lowest slice being `ypos = 0`.
+            * If slice probability list equals `nil`, no slice probabilities
+              are applied.
+    * Saves schematic in the Minetest Schematic format to filename.
+
+* `minetest.place_schematic(pos, schematic, rotation, replacements, force_placement, flags)`
+    * Place the schematic specified by schematic (see [Schematic specifier]) at
+      `pos`.
+    * `rotation` can equal `"0"`, `"90"`, `"180"`, `"270"`, or `"random"`.
+    * If the `rotation` parameter is omitted, the schematic is not rotated.
+    * `replacements` = `{["old_name"] = "convert_to", ...}`
+    * `force_placement` is a boolean indicating whether nodes other than `air`
+      and `ignore` are replaced by the schematic.
+    * Returns nil if the schematic could not be loaded.
+    * **Warning**: Once you have loaded a schematic from a file, it will be
+      cached. Future calls will always use the cached version and the
+      replacement list defined for it, regardless of whether the file or the
+      replacement list parameter have changed. The only way to load the file
+      anew is to restart the server.
+    * `flags` is a flag field with the available flags:
+        * place_center_x
+        * place_center_y
+        * place_center_z
+
+* `minetest.place_schematic_on_vmanip(vmanip, pos, schematic, rotation, replacement, force_placement, flags)`:
+    * This function is analogous to minetest.place_schematic, but places a
+      schematic onto the specified VoxelManip object `vmanip` instead of the
+      map.
+    * Returns false if any part of the schematic was cut-off due to the
+      VoxelManip not containing the full area required, and true if the whole
+      schematic was able to fit.
+    * Returns nil if the schematic could not be loaded.
+    * After execution, any external copies of the VoxelManip contents are
+      invalidated.
+    * `flags` is a flag field with the available flags:
+        * place_center_x
+        * place_center_y
+        * place_center_z
+
+* `minetest.serialize_schematic(schematic, format, options)`
+    * Return the serialized schematic specified by schematic
+      (see [Schematic specifier])
+    * in the `format` of either "mts" or "lua".
+    * "mts" - a string containing the binary MTS data used in the MTS file
+      format.
+    * "lua" - a string containing Lua code representing the schematic in table
+      format.
+    * `options` is a table containing the following optional parameters:
+        * If `lua_use_comments` is true and `format` is "lua", the Lua code
+          generated will have (X, Z) position comments for every X row
+          generated in the schematic data for easier reading.
+        * If `lua_num_indent_spaces` is a nonzero number and `format` is "lua",
+          the Lua code generated will use that number of spaces as indentation
+          instead of a tab character.
+
+* `minetest.read_schematic(schematic, options)`
+    * Returns a Lua table representing the schematic (see: [Schematic specifier])
+    * `schematic` is the schematic to read (see: [Schematic specifier])
+    * `options` is a table containing the following optional parameters:
+        * `write_yslice_prob`: string value:
+            * `none`: no `write_yslice_prob` table is inserted,
+            * `low`: only probabilities that are not 254 or 255 are written in
+              the `write_ylisce_prob` table,
+            * `all`: write all probabilities to the `write_yslice_prob` table.
+            * The default for this option is `all`.
+            * Any invalid value will be interpreted as `all`.
+
+HTTP Requests
+-------------
+
+* `minetest.request_http_api()`:
+    * returns `HTTPApiTable` containing http functions if the calling mod has
+      been granted access by being listed in the `secure.http_mods` or
+      `secure.trusted_mods` setting, otherwise returns `nil`.
+    * The returned table contains the functions `fetch`, `fetch_async` and
+      `fetch_async_get` described below.
+    * Only works at init time and must be called from the mod's main scope
+      (not from a function).
+    * Function only exists if minetest server was built with cURL support.
+    * **DO NOT ALLOW ANY OTHER MODS TO ACCESS THE RETURNED TABLE, STORE IT IN
+      A LOCAL VARIABLE!**
+* `HTTPApiTable.fetch(HTTPRequest req, callback)`
+    * Performs given request asynchronously and calls callback upon completion
+    * callback: `function(HTTPRequestResult res)`
+    * Use this HTTP function if you are unsure, the others are for advanced use
+* `HTTPApiTable.fetch_async(HTTPRequest req)`: returns handle
+    * Performs given request asynchronously and returns handle for
+      `HTTPApiTable.fetch_async_get`
+* `HTTPApiTable.fetch_async_get(handle)`: returns HTTPRequestResult
+    * Return response data for given asynchronous HTTP request
+
+Storage API
+-----------
+
+* `minetest.get_mod_storage()`:
+    * returns reference to mod private `StorageRef`
+    * must be called during mod load time
+
+Misc.
+-----
+
+* `minetest.get_connected_players()`: returns list of `ObjectRefs`
+* `minetest.is_player(obj)`: boolean, whether `obj` is a player
+* `minetest.player_exists(name)`: boolean, whether player exists
+  (regardless of online status)
+* `minetest.hud_replace_builtin(name, hud_definition)`
+    * Replaces definition of a builtin hud element
+    * `name`: `"breath"` or `"health"`
+    * `hud_definition`: definition to replace builtin definition
+* `minetest.send_join_message(player_name)`
+    * This function can be overridden by mods to change the join message.
+* `minetest.send_leave_message(player_name, timed_out)`
+    * This function can be overridden by mods to change the leave message.
+* `minetest.hash_node_position(pos)`: returns an 48-bit integer
+    * `pos`: table {x=number, y=number, z=number},
+    * Gives a unique hash number for a node position (16+16+16=48bit)
+* `minetest.get_position_from_hash(hash)`: returns a position
+    * Inverse transform of `minetest.hash_node_position`
+* `minetest.get_item_group(name, group)`: returns a rating
+    * Get rating of a group of an item. (`0` means: not in group)
+* `minetest.get_node_group(name, group)`: returns a rating
+    * Deprecated: An alias for the former.
+* `minetest.raillike_group(name)`: returns a rating
+    * Returns rating of the connect_to_raillike group corresponding to name
+    * If name is not yet the name of a connect_to_raillike group, a new group
+      id is created, with that name.
+* `minetest.get_content_id(name)`: returns an integer
+    * Gets the internal content ID of `name`
+* `minetest.get_name_from_content_id(content_id)`: returns a string
+    * Gets the name of the content with that content ID
+* `minetest.parse_json(string[, nullvalue])`: returns something
+    * Convert a string containing JSON data into the Lua equivalent
+    * `nullvalue`: returned in place of the JSON null; defaults to `nil`
+    * On success returns a table, a string, a number, a boolean or `nullvalue`
+    * On failure outputs an error message and returns `nil`
+    * Example: `parse_json("[10, {\"a\":false}]")`, returns `{10, {a = false}}`
+* `minetest.write_json(data[, styled])`: returns a string or `nil` and an error
+  message.
+    * Convert a Lua table into a JSON string
+    * styled: Outputs in a human-readable format if this is set, defaults to
+      false.
+    * Unserializable things like functions and userdata will cause an error.
+    * **Warning**: JSON is more strict than the Lua table format.
+        1. You can only use strings and positive integers of at least one as
+           keys.
+        2. You can not mix string and integer keys.
+           This is due to the fact that JSON has two distinct array and object
+           values.
+    * Example: `write_json({10, {a = false}})`,
+      returns `"[10, {\"a\": false}]"`
+* `minetest.serialize(table)`: returns a string
+    * Convert a table containing tables, strings, numbers, booleans and `nil`s
+      into string form readable by `minetest.deserialize`
+    * Example: `serialize({foo='bar'})`, returns `'return { ["foo"] = "bar" }'`
+* `minetest.deserialize(string[, safe])`: returns a table
+    * Convert a string returned by `minetest.serialize` into a table
+    * `string` is loaded in an empty sandbox environment.
+    * Will load functions if safe is false or omitted. Although these functions
+      cannot directly access the global environment, they could bypass this
+      restriction with maliciously crafted Lua bytecode if mod security is
+      disabled.
+    * This function should not be used on untrusted data, regardless of the
+     value of `safe`. It is fine to serialize then deserialize user-provided
+     data, but directly providing user input to deserialize is always unsafe.
+    * Example: `deserialize('return { ["foo"] = "bar" }')`,
+      returns `{foo='bar'}`
+    * Example: `deserialize('print("foo")')`, returns `nil`
+      (function call fails), returns
+      `error:[string "print("foo")"]:1: attempt to call global 'print' (a nil value)`
+* `minetest.compress(data, method, ...)`: returns `compressed_data`
+    * Compress a string of data.
+    * `method` is a string identifying the compression method to be used.
+    * Supported compression methods:
+        * Deflate (zlib): `"deflate"`
+    * `...` indicates method-specific arguments. Currently defined arguments
+      are:
+        * Deflate: `level` - Compression level, `0`-`9` or `nil`.
+* `minetest.decompress(compressed_data, method, ...)`: returns data
+    * Decompress a string of data (using ZLib).
+    * See documentation on `minetest.compress()` for supported compression
+      methods.
+    * `...` indicates method-specific arguments. Currently, no methods use this
+* `minetest.rgba(red, green, blue[, alpha])`: returns a string
+    * Each argument is a 8 Bit unsigned integer
+    * Returns the ColorString from rgb or rgba values
+    * Example: `minetest.rgba(10, 20, 30, 40)`, returns `"#0A141E28"`
+* `minetest.encode_base64(string)`: returns string encoded in base64
+    * Encodes a string in base64.
+* `minetest.decode_base64(string)`: returns string
+    * Decodes a string encoded in base64.
+* `minetest.is_protected(pos, name)`: returns boolean
+    * Returning `true` restricts the player `name` from modifying (i.e. digging,
+       placing) the node at position `pos`.
+    * `name` will be `""` for non-players or unknown players.
+    * This function should be overridden by protection mods. It is highly
+      recommended to grant access to players with the `protection_bypass` privilege.
+    * Cache and call the old version of this function if the position is
+      not protected by the mod. This will allow using multiple protection mods.
+    * Example:
+
+          local old_is_protected = minetest.is_protected
+          function minetest.is_protected(pos, name)
+              if mymod:position_protected_from(pos, name) then
+                  return true
+              end
+              return old_is_protected(pos, name)
+          end
+* `minetest.record_protection_violation(pos, name)`
+    * This function calls functions registered with
+      `minetest.register_on_protection_violation`.
+* `minetest.is_area_protected(pos1, pos2, player_name, interval)`
+    * Returns the position of the first node that `player_name` may not modify
+      in the specified cuboid between `pos1` and `pos2`.
+    * Returns `false` if no protections were found.
+    * Applies `is_protected()` to a 3D lattice of points in the defined volume.
+      The points are spaced evenly throughout the volume and have a spacing
+      similar to, but no larger than, `interval`.
+    * All corners and edges of the defined volume are checked.
+    * `interval` defaults to 4.
+    * `interval` should be carefully chosen and maximised to avoid an excessive
+      number of points being checked.
+    * Like `minetest.is_protected`, this function may be extended or
+      overwritten by mods to provide a faster implementation to check the
+      cuboid for intersections.
+* `minetest.rotate_and_place(itemstack, placer, pointed_thing[, infinitestacks,
+  orient_flags, prevent_after_place])`
+    * Attempt to predict the desired orientation of the facedir-capable node
+      defined by `itemstack`, and place it accordingly (on-wall, on the floor,
+      or hanging from the ceiling).
+    * `infinitestacks`: if `true`, the itemstack is not changed. Otherwise the
+      stacks are handled normally.
+    * `orient_flags`: Optional table containing extra tweaks to the placement code:
+        * `invert_wall`:   if `true`, place wall-orientation on the ground and
+          ground-orientation on the wall.
+        * `force_wall` :   if `true`, always place the node in wall orientation.
+        * `force_ceiling`: if `true`, always place on the ceiling.
+        * `force_floor`:   if `true`, always place the node on the floor.
+        * `force_facedir`: if `true`, forcefully reset the facedir to north
+          when placing on the floor or ceiling.
+        * The first four options are mutually-exclusive; the last in the list
+          takes precedence over the first.
+    * `prevent_after_place` is directly passed to `minetest.item_place_node`
+    * Returns the new itemstack after placement
+* `minetest.rotate_node(itemstack, placer, pointed_thing)`
+    * calls `rotate_and_place()` with `infinitestacks` set according to the state
+      of the creative mode setting, checks for "sneak" to set the `invert_wall`
+      parameter and `prevent_after_place` set to `true`.
+
+* `minetest.calculate_knockback(player, hitter, time_from_last_punch,
+  tool_capabilities, dir, distance, damage)`
+    * Returns the amount of knockback applied on the punched player.
+    * Arguments are equivalent to `register_on_punchplayer`, except the following:
+        * `distance`: distance between puncher and punched player
+    * This function can be overriden by mods that wish to modify this behaviour.
+    * You may want to cache and call the old function to allow multiple mods to
+      change knockback behaviour.
+
+* `minetest.forceload_block(pos[, transient])`
+    * forceloads the position `pos`.
+    * returns `true` if area could be forceloaded
+    * If `transient` is `false` or absent, the forceload will be persistent
+      (saved between server runs). If `true`, the forceload will be transient
+      (not saved between server runs).
+
+* `minetest.forceload_free_block(pos[, transient])`
+    * stops forceloading the position `pos`
+    * If `transient` is `false` or absent, frees a persistent forceload.
+      If `true`, frees a transient forceload.
+
+* `minetest.request_insecure_environment()`: returns an environment containing
+  insecure functions if the calling mod has been listed as trusted in the
+  `secure.trusted_mods` setting or security is disabled, otherwise returns
+  `nil`.
+    * Only works at init time and must be called from the mod's main scope (not
+      from a function).
+    * **DO NOT ALLOW ANY OTHER MODS TO ACCESS THE RETURNED ENVIRONMENT, STORE
+      IT IN A LOCAL VARIABLE!**
+
+* `minetest.global_exists(name)`
+    * Checks if a global variable has been set, without triggering a warning.
+
+Global objects
+--------------
+
+* `minetest.env`: `EnvRef` of the server environment and world.
+    * Any function in the minetest namespace can be called using the syntax
+      `minetest.env:somefunction(somearguments)`
+      instead of `minetest.somefunction(somearguments)`
+    * Deprecated, but support is not to be dropped soon
+
+Global tables
+-------------
+
+### Registered definition tables
+
+* `minetest.registered_items`
+    * Map of registered items, indexed by name
+* `minetest.registered_nodes`
+    * Map of registered node definitions, indexed by name
+* `minetest.registered_craftitems`
+    * Map of registered craft item definitions, indexed by name
+* `minetest.registered_tools`
+    * Map of registered tool definitions, indexed by name
+* `minetest.registered_entities`
+    * Map of registered entity prototypes, indexed by name
+* `minetest.object_refs`
+    * Map of object references, indexed by active object id
+* `minetest.luaentities`
+    * Map of Lua entities, indexed by active object id
+* `minetest.registered_abms`
+    * List of ABM definitions
+* `minetest.registered_lbms`
+    * List of LBM definitions
+* `minetest.registered_aliases`
+    * Map of registered aliases, indexed by name
+* `minetest.registered_ores`
+    * Map of registered ore definitions, indexed by the `name` field.
+    * If `name` is nil, the key is the object handle returned by
+      `minetest.register_ore`.
+* `minetest.registered_biomes`
+    * Map of registered biome definitions, indexed by the `name` field.
+    * If `name` is nil, the key is the object handle returned by
+      `minetest.register_biome`.
+* `minetest.registered_decorations`
+    * Map of registered decoration definitions, indexed by the `name` field.
+    * If `name` is nil, the key is the object handle returned by
+      `minetest.register_decoration`.
+* `minetest.registered_schematics`
+    * Map of registered schematic definitions, indexed by the `name` field.
+    * If `name` is nil, the key is the object handle returned by
+      `minetest.register_schematic`.
+* `minetest.registered_chatcommands`
+    * Map of registered chat command definitions, indexed by name
+* `minetest.registered_privileges`
+    * Map of registered privilege definitions, indexed by name
+
+### Registered callback tables
+
+All callbacks registered with [Global callback registration functions] are added
+to corresponding `minetest.registered_*` tables.
+
+
+
+
+Class reference
+===============
+
+Sorted alphabetically.
+
+`AreaStore`
+-----------
+
+A fast access data structure to store areas, and find areas near a given
+position or area.
+Every area has a `data` string attribute to store additional information.
+You can create an empty `AreaStore` by calling `AreaStore()`, or
+`AreaStore(type_name)`. The mod decides where to save and load AreaStore.
+If you chose the parameter-less constructor, a fast implementation will be
+automatically chosen for you.
+
+### Methods
+
+* `get_area(id, include_borders, include_data)`
+    * Returns the area information about the specified ID.
+    * Returned values are either of these:
+
+            nil  -- Area not found
+            true -- Without `include_borders` and `include_data`
+            {
+                min = pos, max = pos -- `include_borders == true`
+                data = string        -- `include_data == true`
+            }
+
+* `get_areas_for_pos(pos, include_borders, include_data)`
+    * Returns all areas as table, indexed by the area ID.
+    * Table values: see `get_area`.
+* `get_areas_in_area(edge1, edge2, accept_overlap, include_borders, include_data)`
+    * Returns all areas that contain all nodes inside the area specified by `edge1`
+      and `edge2` (inclusive).
+    * `accept_overlap`: if `true`, areas are returned that have nodes in
+      common (intersect) with the specified area.
+    * Returns the same values as `get_areas_for_pos`.
+* `insert_area(edge1, edge2, data, [id])`: inserts an area into the store.
+    * Returns the new area's ID, or nil if the insertion failed.
+    * The (inclusive) positions `edge1` and `edge2` describe the area.
+    * `data` is a string stored with the area.
+    * `id` (optional): will be used as the internal area ID if it is an unique
+      number between 0 and 2^32-2.
+* `reserve(count)`: reserves resources for at most `count` many contained
+  areas.
+  Only needed for efficiency, and only some implementations profit.
+* `remove_area(id)`: removes the area with the given id from the store, returns
+  success.
+* `set_cache_params(params)`: sets params for the included prefiltering cache.
+  Calling invalidates the cache, so that its elements have to be newly
+  generated.
+    * `params` is a table with the following fields:
+
+          enabled = boolean,   -- Whether to enable, default true
+          block_radius = int,  -- The radius (in nodes) of the areas the cache
+                               -- generates prefiltered lists for, minimum 16,
+                               -- default 64
+          limit = int,         -- The cache size, minimum 20, default 1000
+* `to_string()`: Experimental. Returns area store serialized as a (binary)
+  string.
+* `to_file(filename)`: Experimental. Like `to_string()`, but writes the data to
+  a file.
+* `from_string(str)`: Experimental. Deserializes string and loads it into the
+  AreaStore.
+  Returns success and, optionally, an error message.
+* `from_file(filename)`: Experimental. Like `from_string()`, but reads the data
+  from a file.
+
+`InvRef`
+--------
+
+An `InvRef` is a reference to an inventory.
+
+### Methods
+
+* `is_empty(listname)`: return `true` if list is empty
+* `get_size(listname)`: get size of a list
+* `set_size(listname, size)`: set size of a list
+    * returns `false` on error (e.g. invalid `listname` or `size`)
+* `get_width(listname)`: get width of a list
+* `set_width(listname, width)`: set width of list; currently used for crafting
+* `get_stack(listname, i)`: get a copy of stack index `i` in list
+* `set_stack(listname, i, stack)`: copy `stack` to index `i` in list
+* `get_list(listname)`: return full list
+* `set_list(listname, list)`: set full list (size will not change)
+* `get_lists()`: returns list of inventory lists
+* `set_lists(lists)`: sets inventory lists (size will not change)
+* `add_item(listname, stack)`: add item somewhere in list, returns leftover
+  `ItemStack`.
+* `room_for_item(listname, stack):` returns `true` if the stack of items
+  can be fully added to the list
+* `contains_item(listname, stack, [match_meta])`: returns `true` if
+  the stack of items can be fully taken from the list.
+  If `match_meta` is false, only the items' names are compared
+  (default: `false`).
+* `remove_item(listname, stack)`: take as many items as specified from the
+  list, returns the items that were actually removed (as an `ItemStack`)
+  -- note that any item metadata is ignored, so attempting to remove a specific
+  unique item this way will likely remove the wrong one -- to do that use
+  `set_stack` with an empty `ItemStack`.
+* `get_location()`: returns a location compatible to
+  `minetest.get_inventory(location)`.
+    * returns `{type="undefined"}` in case location is not known
+
+`ItemStack`
+-----------
+
+An `ItemStack` is a stack of items.
+
+It can be created via `ItemStack(x)`, where x is an `ItemStack`,
+an itemstring, a table or `nil`.
+
+### Methods
+
+* `is_empty()`: returns `true` if stack is empty.
+* `get_name()`: returns item name (e.g. `"default:stone"`).
+* `set_name(item_name)`: returns a boolean indicating whether the item was
+  cleared.
+* `get_count()`: Returns number of items on the stack.
+* `set_count(count)`: returns a boolean indicating whether the item was cleared
+    * `count`: number, unsigned 16 bit integer
+* `get_wear()`: returns tool wear (`0`-`65535`), `0` for non-tools.
+* `set_wear(wear)`: returns boolean indicating whether item was cleared
+    * `wear`: number, unsigned 16 bit integer
+* `get_meta()`: returns ItemStackMetaRef. See section for more details
+* `get_metadata()`: (DEPRECATED) Returns metadata (a string attached to an item
+  stack).
+* `set_metadata(metadata)`: (DEPRECATED) Returns true.
+* `get_description()`: returns the description shown in inventory list tooltips.
+* `clear()`: removes all items from the stack, making it empty.
+* `replace(item)`: replace the contents of this stack.
+    * `item` can also be an itemstring or table.
+* `to_string()`: returns the stack in itemstring form.
+* `to_table()`: returns the stack in Lua table form.
+* `get_stack_max()`: returns the maximum size of the stack (depends on the
+  item).
+* `get_free_space()`: returns `get_stack_max() - get_count()`.
+* `is_known()`: returns `true` if the item name refers to a defined item type.
+* `get_definition()`: returns the item definition table.
+* `get_tool_capabilities()`: returns the digging properties of the item,
+  or those of the hand if none are defined for this item type
+* `add_wear(amount)`
+    * Increases wear by `amount` if the item is a tool
+    * `amount`: number, integer
+* `add_item(item)`: returns leftover `ItemStack`
+    * Put some item or stack onto this stack
+* `item_fits(item)`: returns `true` if item or stack can be fully added to
+  this one.
+* `take_item(n)`: returns taken `ItemStack`
+    * Take (and remove) up to `n` items from this stack
+    * `n`: number, default: `1`
+* `peek_item(n)`: returns taken `ItemStack`
+    * Copy (don't remove) up to `n` items from this stack
+    * `n`: number, default: `1`
+
+`ItemStackMetaRef`
+------------------
+
+ItemStack metadata: reference extra data and functionality stored in a stack.
+Can be obtained via `item:get_meta()`.
+
+### Methods
+
+* All methods in MetaDataRef
+* `set_tool_capabilities([tool_capabilities])`
+    * Overrides the item's tool capabilities
+    * A nil value will clear the override data and restore the original
+      behavior.
+
+`MetaDataRef`
+-------------
+
+Base class used by [`StorageRef`], [`NodeMetaRef`], [`ItemStackMetaRef`],
+and [`PlayerMetaRef`].
+
+### Methods
+
+* `contains(key)`: Returns true if key present, otherwise false.
+    * Returns `nil` when the MetaData is inexistent.
+* `get(key)`: Returns `nil` if key not present, else the stored string.
+* `set_string(key, value)`: Value of `""` will delete the key.
+* `get_string(key)`: Returns `""` if key not present.
+* `set_int(key, value)`
+* `get_int(key)`: Returns `0` if key not present.
+* `set_float(key, value)`
+* `get_float(key)`: Returns `0` if key not present.
+* `to_table()`: returns `nil` or a table with keys:
+    * `fields`: key-value storage
+    * `inventory`: `{list1 = {}, ...}}` (NodeMetaRef only)
+* `from_table(nil or {})`
+    * Any non-table value will clear the metadata
+    * See [Node Metadata] for an example
+    * returns `true` on success
+* `equals(other)`
+    * returns `true` if this metadata has the same key-value pairs as `other`
+
+`ModChannel`
+------------
+
+An interface to use mod channels on client and server
+
+### Methods
+
+* `leave()`: leave the mod channel.
+    * Server leaves channel `channel_name`.
+    * No more incoming or outgoing messages can be sent to this channel from
+      server mods.
+    * This invalidate all future object usage.
+    * Ensure you set mod_channel to nil after that to free Lua resources.
+* `is_writeable()`: returns true if channel is writeable and mod can send over
+  it.
+* `send_all(message)`: Send `message` though the mod channel.
+    * If mod channel is not writeable or invalid, message will be dropped.
+    * Message size is limited to 65535 characters by protocol.
+
+`NodeMetaRef`
+-------------
+
+Node metadata: reference extra data and functionality stored in a node.
+Can be obtained via `minetest.get_meta(pos)`.
+
+### Methods
+
+* All methods in MetaDataRef
+* `get_inventory()`: returns `InvRef`
+* `mark_as_private(name or {name1, name2, ...})`: Mark specific vars as private
+  This will prevent them from being sent to the client. Note that the "private"
+  status will only be remembered if an associated key-value pair exists,
+  meaning it's best to call this when initializing all other meta (e.g.
+  `on_construct`).
+
+`NodeTimerRef`
+--------------
+
+Node Timers: a high resolution persistent per-node timer.
+Can be gotten via `minetest.get_node_timer(pos)`.
+
+### Methods
+
+* `set(timeout,elapsed)`
+    * set a timer's state
+    * `timeout` is in seconds, and supports fractional values (0.1 etc)
+    * `elapsed` is in seconds, and supports fractional values (0.1 etc)
+    * will trigger the node's `on_timer` function after `(timeout - elapsed)`
+      seconds.
+* `start(timeout)`
+    * start a timer
+    * equivalent to `set(timeout,0)`
+* `stop()`
+    * stops the timer
+* `get_timeout()`: returns current timeout in seconds
+    * if `timeout` equals `0`, timer is inactive
+* `get_elapsed()`: returns current elapsed time in seconds
+    * the node's `on_timer` function will be called after `(timeout - elapsed)`
+      seconds.
+* `is_started()`: returns boolean state of timer
+    * returns `true` if timer is started, otherwise `false`
+
+`ObjectRef`
+-----------
+
+Moving things in the game are generally these.
+This is basically a reference to a C++ `ServerActiveObject`.
+
+### Advice on handling `ObjectRefs`
+
+When you receive an `ObjectRef` as a callback argument or from another API
+function, it is possible to store the reference somewhere and keep it around.
+It will keep functioning until the object is unloaded or removed.
+
+However, doing this is **NOT** recommended as there is (intentionally) no method
+to test if a previously acquired `ObjectRef` is still valid.
+Instead, `ObjectRefs` should be "let go" of as soon as control is returned from
+Lua back to the engine.
+Doing so is much less error-prone and you will never need to wonder if the
+object you are working with still exists.
+
+
+### Methods
+
+* `get_pos()`: returns `{x=num, y=num, z=num}`
+* `set_pos(pos)`: `pos`=`{x=num, y=num, z=num}`
+* `move_to(pos, continuous=false)`
+    * Does an interpolated move for Lua entities for visually smooth transitions.
+    * If `continuous` is true, the Lua entity will not be moved to the current
+      position before starting the interpolated move.
+    * For players this does the same as `set_pos`,`continuous` is ignored.
+* `punch(puncher, time_from_last_punch, tool_capabilities, direction)`
+    * `puncher` = another `ObjectRef`,
+    * `time_from_last_punch` = time since last punch action of the puncher
+    * `direction`: can be `nil`
+* `right_click(clicker)`; `clicker` is another `ObjectRef`
+* `get_hp()`: returns number of hitpoints (2 * number of hearts)
+* `set_hp(hp, reason)`: set number of hitpoints (2 * number of hearts).
+    * See reason in register_on_player_hpchange
+    * Is limited to the range of 0 ... 65535 (2^16 - 1)
+    * For players: HP are also limited by `hp_max` specified in the player's
+      object properties
+* `get_inventory()`: returns an `InvRef` for players, otherwise returns `nil`
+* `get_wield_list()`: returns the name of the inventory list the wielded item
+   is in.
+* `get_wield_index()`: returns the index of the wielded item
+* `get_wielded_item()`: returns an `ItemStack`
+* `set_wielded_item(item)`: replaces the wielded item, returns `true` if
+  successful.
+* `set_armor_groups({group1=rating, group2=rating, ...})`
+* `get_armor_groups()`: returns a table with the armor group ratings
+* `set_animation(frame_range, frame_speed, frame_blend, frame_loop)`
+    * `frame_range`: table {x=num, y=num}, default: `{x=1, y=1}`
+    * `frame_speed`: number, default: `15.0`
+    * `frame_blend`: number, default: `0.0`
+    * `frame_loop`: boolean, default: `true`
+* `get_animation()`: returns `range`, `frame_speed`, `frame_blend` and
+  `frame_loop`.
+* `set_animation_frame_speed(frame_speed)`
+    * `frame_speed`: number, default: `15.0`
+* `set_attach(parent, bone, position, rotation)`
+    * `bone`: string
+    * `position`: `{x=num, y=num, z=num}` (relative)
+    * `rotation`: `{x=num, y=num, z=num}` = Rotation on each axis, in degrees
+* `get_attach()`: returns parent, bone, position, rotation or nil if it isn't
+  attached.
+* `set_detach()`
+* `set_bone_position(bone, position, rotation)`
+    * `bone`: string
+    * `position`: `{x=num, y=num, z=num}` (relative)
+    * `rotation`: `{x=num, y=num, z=num}`
+* `get_bone_position(bone)`: returns position and rotation of the bone
+* `set_properties(object property table)`
+* `get_properties()`: returns object property table
+* `is_player()`: returns true for players, false otherwise
+* `get_nametag_attributes()`
+    * returns a table with the attributes of the nametag of an object
+    * {
+        color = {a=0..255, r=0..255, g=0..255, b=0..255},
+        text = "",
+      }
+* `set_nametag_attributes(attributes)`
+    * sets the attributes of the nametag of an object
+    * `attributes`:
+      {
+        color = ColorSpec,
+        text = "My Nametag",
+      }
+
+#### Lua entity only (no-op for other objects)
+
+* `remove()`: remove object
+    * The object is removed after returning from Lua. However the `ObjectRef`
+      itself instantly becomes unusable with all further method calls having
+      no effect and returning `nil`.
+* `set_velocity(vel)`
+    * `vel` is a vector, e.g. `{x=0.0, y=2.3, z=1.0}`
+* `add_velocity(vel)`
+    * `vel` is a vector, e.g. `{x=0.0, y=2.3, z=1.0}`
+    * In comparison to using get_velocity, adding the velocity and then using
+      set_velocity, add_velocity is supposed to avoid synchronization problems.
+* `get_velocity()`: returns the velocity, a vector
+* `set_acceleration(acc)`
+    * `acc` is a vector
+* `get_acceleration()`: returns the acceleration, a vector
+* `set_rotation(rot)`
+    * `rot` is a vector (radians). X is pitch (elevation), Y is yaw (heading)
+      and Z is roll (bank).
+* `get_rotation()`: returns the rotation, a vector (radians)
+* `set_yaw(radians)`: sets the yaw (heading).
+* `get_yaw()`: returns number in radians
+* `set_texture_mod(mod)`
+* `get_texture_mod()` returns current texture modifier
+* `set_sprite(p, num_frames, framelength, select_horiz_by_yawpitch)`
+    * Select sprite from spritesheet with optional animation and Dungeon Master
+      style texture selection based on yaw relative to camera
+    * `p`: {x=number, y=number}, the coordinate of the first frame
+      (x: column, y: row), default: `{x=0, y=0}`
+    * `num_frames`: number, default: `1`
+    * `framelength`: number, default: `0.2`
+    * `select_horiz_by_yawpitch`: boolean, this was once used for the Dungeon
+      Master mob, default: `false`
+* `get_entity_name()` (**Deprecated**: Will be removed in a future version)
+* `get_luaentity()`
+
+#### Player only (no-op for other objects)
+
+* `get_player_name()`: returns `""` if is not a player
+* `get_player_velocity()`: returns `nil` if is not a player, otherwise a
+  table {x, y, z} representing the player's instantaneous velocity in nodes/s
+* `add_player_velocity(vel)`
+    * Adds to player velocity, this happens client-side and only once.
+    * Does not apply during free_move.
+    * Note that since the player speed is normalized at each move step,
+      increasing e.g. Y velocity beyond what would usually be achieved
+      (see: physics overrides) will cause existing X/Z velocity to be reduced.
+    * Example: `add_player_velocity({x=0, y=6.5, z=0})` is equivalent to
+      pressing the jump key (assuming default settings)
+* `get_look_dir()`: get camera direction as a unit vector
+* `get_look_vertical()`: pitch in radians
+    * Angle ranges between -pi/2 and pi/2, which are straight up and down
+      respectively.
+* `get_look_horizontal()`: yaw in radians
+    * Angle is counter-clockwise from the +z direction.
+* `set_look_vertical(radians)`: sets look pitch
+    * radians: Angle from looking forward, where positive is downwards.
+* `set_look_horizontal(radians)`: sets look yaw
+    * radians: Angle from the +z direction, where positive is counter-clockwise.
+* `get_look_pitch()`: pitch in radians - Deprecated as broken. Use
+  `get_look_vertical`.
+    * Angle ranges between -pi/2 and pi/2, which are straight down and up
+      respectively.
+* `get_look_yaw()`: yaw in radians - Deprecated as broken. Use
+  `get_look_horizontal`.
+    * Angle is counter-clockwise from the +x direction.
+* `set_look_pitch(radians)`: sets look pitch - Deprecated. Use
+  `set_look_vertical`.
+* `set_look_yaw(radians)`: sets look yaw - Deprecated. Use
+  `set_look_horizontal`.
+* `get_breath()`: returns player's breath
+* `set_breath(value)`: sets player's breath
+    * values:
+        * `0`: player is drowning
+        * max: bubbles bar is not shown
+        * See [Object properties] for more information
+    * Is limited to range 0 ... 65535 (2^16 - 1)
+* `set_fov(fov, is_multiplier)`: Sets player's FOV
+    * `fov`: FOV value.
+    * `is_multiplier`: Set to `true` if the FOV value is a multiplier.
+      Defaults to `false`.
+    * Set to 0 to clear FOV override.
+* `get_fov()`:
+    * Returns player's FOV override in degrees, and a boolean depending on whether
+      the value is a multiplier.
+    * Returns 0 as first value if player's FOV hasn't been overridden.
+* `set_attribute(attribute, value)`:  DEPRECATED, use get_meta() instead
+    * Sets an extra attribute with value on player.
+    * `value` must be a string, or a number which will be converted to a
+      string.
+    * If `value` is `nil`, remove attribute from player.
+* `get_attribute(attribute)`:  DEPRECATED, use get_meta() instead
+    * Returns value (a string) for extra attribute.
+    * Returns `nil` if no attribute found.
+* `get_meta()`: Returns a PlayerMetaRef.
+* `set_inventory_formspec(formspec)`
+    * Redefine player's inventory form
+    * Should usually be called in `on_joinplayer`
+* `get_inventory_formspec()`: returns a formspec string
+* `set_formspec_prepend(formspec)`:
+    * the formspec string will be added to every formspec shown to the user,
+      except for those with a no_prepend[] tag.
+    * This should be used to set style elements such as background[] and
+      bgcolor[], any non-style elements (eg: label) may result in weird behaviour.
+    * Only affects formspecs shown after this is called.
+* `get_formspec_prepend(formspec)`: returns a formspec string.
+* `get_player_control()`: returns table with player pressed keys
+    * The table consists of fields with boolean value representing the pressed
+      keys, the fields are jump, right, left, LMB, RMB, sneak, aux1, down, up.
+    * example: `{jump=false, right=true, left=false, LMB=false, RMB=false,
+      sneak=true, aux1=false, down=false, up=false}`
+* `get_player_control_bits()`: returns integer with bit packed player pressed
+  keys.
+    * bit nr/meaning: 0/up, 1/down, 2/left, 3/right, 4/jump, 5/aux1, 6/sneak,
+      7/LMB, 8/RMB
+* `set_physics_override(override_table)`
+    * `override_table` is a table with the following fields:
+        * `speed`: multiplier to default walking speed value (default: `1`)
+        * `jump`: multiplier to default jump value (default: `1`)
+        * `gravity`: multiplier to default gravity value (default: `1`)
+        * `sneak`: whether player can sneak (default: `true`)
+        * `sneak_glitch`: whether player can use the new move code replications
+          of the old sneak side-effects: sneak ladders and 2 node sneak jump
+          (default: `false`)
+        * `new_move`: use new move/sneak code. When `false` the exact old code
+          is used for the specific old sneak behaviour (default: `true`)
+* `get_physics_override()`: returns the table given to `set_physics_override`
+* `hud_add(hud definition)`: add a HUD element described by HUD def, returns ID
+   number on success
+* `hud_remove(id)`: remove the HUD element of the specified id
+* `hud_change(id, stat, value)`: change a value of a previously added HUD
+  element.
+    * element `stat` values:
+      `position`, `name`, `scale`, `text`, `number`, `item`, `dir`
+* `hud_get(id)`: gets the HUD element definition structure of the specified ID
+* `hud_set_flags(flags)`: sets specified HUD flags of player.
+    * `flags`: A table with the following fields set to boolean values
+        * hotbar
+        * healthbar
+        * crosshair
+        * wielditem
+        * breathbar
+        * minimap
+        * minimap_radar
+    * If a flag equals `nil`, the flag is not modified
+    * `minimap`: Modifies the client's permission to view the minimap.
+      The client may locally elect to not view the minimap.
+    * `minimap_radar` is only usable when `minimap` is true
+* `hud_get_flags()`: returns a table of player HUD flags with boolean values.
+    * See `hud_set_flags` for a list of flags that can be toggled.
+* `hud_set_hotbar_itemcount(count)`: sets number of items in builtin hotbar
+    * `count`: number of items, must be between `1` and `32`
+* `hud_get_hotbar_itemcount`: returns number of visible items
+* `hud_set_hotbar_image(texturename)`
+    * sets background image for hotbar
+* `hud_get_hotbar_image`: returns texturename
+* `hud_set_hotbar_selected_image(texturename)`
+    * sets image for selected item of hotbar
+* `hud_get_hotbar_selected_image`: returns texturename
+* `set_sky(parameters)`
+    * `parameters` is a table with the following optional fields:
+        * `base_color`: ColorSpec, changes fog in "skybox" and "plain".
+        * `type`: Available types:
+            * `"regular"`: Uses 0 textures, `base_color` ignored
+            * `"skybox"`: Uses 6 textures, `base_color` used as fog.
+            * `"plain"`: Uses 0 textures, `base_color` used as both fog and sky.
+        * `textures`: A table containing up to six textures in the following
+            order: Y+ (top), Y- (bottom), X- (west), X+ (east), Z+ (north), Z- (south).
+        * `clouds`: Boolean for whether clouds appear. (default: `true`)
+        * `sky_color`: A table containing the following values, alpha is ignored:
+            * `day_sky`: ColorSpec, for the top half of the `"regular"`
+              skybox during the day. (default: `#8cbafa`)
+            * `day_horizon`: ColorSpec, for the bottom half of the 
+              `"regular"` skybox during the day. (default: `#9bc1f0`)
+            * `dawn_sky`: ColorSpec, for the top half of the `"regular"`
+              skybox during dawn/sunset. (default: `#b4bafa`)
+            * `dawn_horizon`: ColorSpec, for the bottom half of the `"regular"`
+              skybox during dawn/sunset. (default: `#bac1f0`)
+            * `night_sky`: ColorSpec, for the top half of the `"regular"`
+              skybox during the night. (default: `#006aff`)
+            * `night_horizon`: ColorSpec, for the bottom half of the `"regular"`
+              skybox during the night. (default: `#4090ff`)
+            * `indoors`: ColorSpec, for when you're either indoors or 
+              underground. Only applies to the `"regular"` skybox.
+              (default: `#646464`)
+            * `fog_sun_tint`: ColorSpec, changes the fog tinting for the sun
+              at sunrise and sunset.
+            * `fog_moon_tint`: ColorSpec, changes the fog tinting for the moon
+              at sunrise and sunset.
+            * `fog_tint_type`: string, changes which mode the directional fog
+                abides by, `"custom"` uses `sun_tint` and `moon_tint`, while
+                `"default"` uses the classic Minetest sun and moon tinting.
+                Will use tonemaps, if set to `"default"`. (default: `"default"`)
+* `get_sky()`: returns base_color, type, table of textures, clouds.
+* `get_sky_color()`: returns a table with the `sky_color` parameters as in
+    `set_sky`.
+* `set_sun(parameters)`:
+    * `parameters` is a table with the following optional fields:
+        * `visible`: Boolean for whether the sun is visible.
+            (default: `true`)
+        * `texture`: A regular texture for the sun. Setting to `""`
+            will re-enable the mesh sun. (default: `"sun.png"`)
+        * `tonemap`: A 512x1 texture containing the tonemap for the sun
+            (default: `"sun_tonemap.png"`)
+        * `sunrise`: A regular texture for the sunrise texture.
+            (default: `"sunrisebg.png"`)
+        * `sunrise_visible`: Boolean for whether the sunrise texture is visible.
+            (default: `true`)
+        * `scale`: Float controlling the overall size of the sun. (default: `1`)
+* `get_sun()`: returns a table with the current sun parameters as in
+    `set_sun`.
+* `set_moon(parameters)`:
+    * `parameters` is a table with the following optional fields:
+        * `visible`: Boolean for whether the moon is visible.
+            (default: `true`)
+        * `texture`: A regular texture for the moon. Setting to `""`
+            will re-enable the mesh moon. (default: `"moon.png"`)
+        * `tonemap`: A 512x1 texture containing the tonemap for the moon
+            (default: `"moon_tonemap.png"`)
+        * `scale`: Float controlling the overall size of the moon (default: `1`)
+* `get_moon()`: returns a table with the current moon parameters as in
+    `set_moon`.
+* `set_stars(parameters)`:
+    * `parameters` is a table with the following optional fields:
+        * `visible`: Boolean for whether the stars are visible.
+            (default: `true`)
+        * `count`: Integer number to set the number of stars in 
+            the skybox. Only applies to `"skybox"` and `"regular"` skyboxes.
+            (default: `1000`)
+        * `star_color`: ColorSpec, sets the colors of the stars,
+            alpha channel is used to set overall star brightness.
+            (default: `#ebebff69`)
+        * `scale`: Float controlling the overall size of the stars (default: `1`)
+* `get_stars()`: returns a table with the current stars parameters as in
+    `set_stars`.
+* `set_clouds(parameters)`: set cloud parameters
+    * `parameters` is a table with the following optional fields:
+        * `density`: from `0` (no clouds) to `1` (full clouds) (default `0.4`)
+        * `color`: basic cloud color with alpha channel, ColorSpec
+          (default `#fff0f0e5`).
+        * `ambient`: cloud color lower bound, use for a "glow at night" effect.
+          ColorSpec (alpha ignored, default `#000000`)
+        * `height`: cloud height, i.e. y of cloud base (default per conf,
+          usually `120`)
+        * `thickness`: cloud thickness in nodes (default `16`)
+        * `speed`: 2D cloud speed + direction in nodes per second
+          (default `{x=0, z=-2}`).
+* `get_clouds()`: returns a table with the current cloud parameters as in
+  `set_clouds`.
+* `override_day_night_ratio(ratio or nil)`
+    * `0`...`1`: Overrides day-night ratio, controlling sunlight to a specific
+      amount.
+    * `nil`: Disables override, defaulting to sunlight based on day-night cycle
+* `get_day_night_ratio()`: returns the ratio or nil if it isn't overridden
+* `set_local_animation(stand/idle, walk, dig, walk+dig, frame_speed=frame_speed)`:
+  set animation for player model in third person view
+
+      set_local_animation({x=0, y=79},  -- stand/idle animation key frames
+          {x=168, y=187},  -- walk animation key frames
+          {x=189, y=198},  -- dig animation key frames
+          {x=200, y=219},  -- walk+dig animation key frames
+          frame_speed=30)  -- animation frame speed
+* `get_local_animation()`: returns stand, walk, dig, dig+walk tables and
+  `frame_speed`.
+* `set_eye_offset({x=0,y=0,z=0},{x=0,y=0,z=0})`: defines offset value for
+  camera per player.
+    * in first person view
+    * in third person view (max. values `{x=-10/10,y=-10,15,z=-5/5}`)
+* `get_eye_offset()`: returns `offset_first` and `offset_third`
+* `send_mapblock(blockpos)`:
+    * Sends a server-side loaded mapblock to the player.
+    * Returns `false` if failed.
+    * Resource intensive - use sparsely
+    * To get blockpos, integer divide pos by 16
+
+`PcgRandom`
+-----------
+
+A 32-bit pseudorandom number generator.
+Uses PCG32, an algorithm of the permuted congruential generator family,
+offering very strong randomness.
+
+It can be created via `PcgRandom(seed)` or `PcgRandom(seed, sequence)`.
+
+### Methods
+
+* `next()`: return next integer random number [`-2147483648`...`2147483647`]
+* `next(min, max)`: return next integer random number [`min`...`max`]
+* `rand_normal_dist(min, max, num_trials=6)`: return normally distributed
+  random number [`min`...`max`].
+    * This is only a rough approximation of a normal distribution with:
+    * `mean = (max - min) / 2`, and
+    * `variance = (((max - min + 1) ^ 2) - 1) / (12 * num_trials)`
+    * Increasing `num_trials` improves accuracy of the approximation
+
+`PerlinNoise`
+-------------
+
+A perlin noise generator.
+It can be created via `PerlinNoise(seed, octaves, persistence, spread)`
+or `PerlinNoise(noiseparams)`.
+Alternatively with `minetest.get_perlin(seeddiff, octaves, persistence, spread)`
+or `minetest.get_perlin(noiseparams)`.
+
+### Methods
+
+* `get_2d(pos)`: returns 2D noise value at `pos={x=,y=}`
+* `get_3d(pos)`: returns 3D noise value at `pos={x=,y=,z=}`
+
+`PerlinNoiseMap`
+----------------
+
+A fast, bulk perlin noise generator.
+
+It can be created via `PerlinNoiseMap(noiseparams, size)` or
+`minetest.get_perlin_map(noiseparams, size)`.
+
+Format of `size` is `{x=dimx, y=dimy, z=dimz}`. The `z` component is omitted
+for 2D noise, and it must be must be larger than 1 for 3D noise (otherwise
+`nil` is returned).
+
+For each of the functions with an optional `buffer` parameter: If `buffer` is
+not nil, this table will be used to store the result instead of creating a new
+table.
+
+### Methods
+
+* `get_2d_map(pos)`: returns a `<size.x>` times `<size.y>` 2D array of 2D noise
+  with values starting at `pos={x=,y=}`
+* `get_3d_map(pos)`: returns a `<size.x>` times `<size.y>` times `<size.z>`
+  3D array of 3D noise with values starting at `pos={x=,y=,z=}`.
+* `get_2d_map_flat(pos, buffer)`: returns a flat `<size.x * size.y>` element
+  array of 2D noise with values starting at `pos={x=,y=}`
+* `get_3d_map_flat(pos, buffer)`: Same as `get2dMap_flat`, but 3D noise
+* `calc_2d_map(pos)`: Calculates the 2d noise map starting at `pos`. The result
+  is stored internally.
+* `calc_3d_map(pos)`: Calculates the 3d noise map starting at `pos`. The result
+  is stored internally.
+* `get_map_slice(slice_offset, slice_size, buffer)`: In the form of an array,
+  returns a slice of the most recently computed noise results. The result slice
+  begins at coordinates `slice_offset` and takes a chunk of `slice_size`.
+  E.g. to grab a 2-slice high horizontal 2d plane of noise starting at buffer
+  offset y = 20:
+  `noisevals = noise:get_map_slice({y=20}, {y=2})`
+  It is important to note that `slice_offset` offset coordinates begin at 1,
+  and are relative to the starting position of the most recently calculated
+  noise.
+  To grab a single vertical column of noise starting at map coordinates
+  x = 1023, y=1000, z = 1000:
+  `noise:calc_3d_map({x=1000, y=1000, z=1000})`
+  `noisevals = noise:get_map_slice({x=24, z=1}, {x=1, z=1})`
+
+`PlayerMetaRef`
+---------------
+
+Player metadata.
+Uses the same method of storage as the deprecated player attribute API, so
+data there will also be in player meta.
+Can be obtained using `player:get_meta()`.
+
+### Methods
+
+* All methods in MetaDataRef
+
+`PseudoRandom`
+--------------
+
+A 16-bit pseudorandom number generator.
+Uses a well-known LCG algorithm introduced by K&R.
+
+It can be created via `PseudoRandom(seed)`.
+
+### Methods
+
+* `next()`: return next integer random number [`0`...`32767`]
+* `next(min, max)`: return next integer random number [`min`...`max`]
+    * `((max - min) == 32767) or ((max-min) <= 6553))` must be true
+      due to the simple implementation making bad distribution otherwise.
+
+`Raycast`
+---------
+
+A raycast on the map. It works with selection boxes.
+Can be used as an iterator in a for loop as:
+
+    local ray = Raycast(...)
+    for pointed_thing in ray do
+        ...
+    end
+
+The map is loaded as the ray advances. If the map is modified after the
+`Raycast` is created, the changes may or may not have an effect on the object.
+
+It can be created via `Raycast(pos1, pos2, objects, liquids)` or
+`minetest.raycast(pos1, pos2, objects, liquids)` where:
+
+* `pos1`: start of the ray
+* `pos2`: end of the ray
+* `objects`: if false, only nodes will be returned. Default is true.
+* `liquids`: if false, liquid nodes won't be returned. Default is false.
+
+### Methods
+
+* `next()`: returns a `pointed_thing` with exact pointing location
+    * Returns the next thing pointed by the ray or nil.
+
+`SecureRandom`
+--------------
+
+Interface for the operating system's crypto-secure PRNG.
+
+It can be created via `SecureRandom()`.  The constructor returns nil if a
+secure random device cannot be found on the system.
+
+### Methods
+
+* `next_bytes([count])`: return next `count` (default 1, capped at 2048) many
+  random bytes, as a string.
+
+`Settings`
+----------
+
+An interface to read config files in the format of `minetest.conf`.
+
+It can be created via `Settings(filename)`.
+
+### Methods
+
+* `get(key)`: returns a value
+* `get_bool(key, [default])`: returns a boolean
+    * `default` is the value returned if `key` is not found.
+    * Returns `nil` if `key` is not found and `default` not specified.
+* `get_np_group(key)`: returns a NoiseParams table
+* `get_flags(key)`:
+    * Returns `{flag = true/false, ...}` according to the set flags.
+    * Is currently limited to mapgen flags `mg_flags` and mapgen-specific
+      flags like `mgv5_spflags`.
+* `set(key, value)`
+    * Setting names can't contain whitespace or any of `="{}#`.
+    * Setting values can't contain the sequence `\n"""`.
+    * Setting names starting with "secure." can't be set on the main settings
+      object (`minetest.settings`).
+* `set_bool(key, value)`
+    * See documentation for set() above.
+* `set_np_group(key, value)`
+    * `value` is a NoiseParams table.
+    * Also, see documentation for set() above.
+* `remove(key)`: returns a boolean (`true` for success)
+* `get_names()`: returns `{key1,...}`
+* `write()`: returns a boolean (`true` for success)
+    * Writes changes to file.
+* `to_table()`: returns `{[key1]=value1,...}`
+
+### Format
+
+The settings have the format `key = value`. Example:
+
+    foo = example text
+    bar = """
+    Multiline
+    value
+    """
+
+
+`StorageRef`
+------------
+
+Mod metadata: per mod metadata, saved automatically.
+Can be obtained via `minetest.get_mod_storage()` during load time.
+
+WARNING: This storage backend is incaptable to save raw binary data due
+to restrictions of JSON.
+
+### Methods
+
+* All methods in MetaDataRef
+
+
+
+
+Definition tables
+=================
+
+Object properties
+-----------------
+
+Used by `ObjectRef` methods. Part of an Entity definition.
+These properties are not persistent, but are applied automatically to the
+corresponding Lua entity using the given registration fields.
+Player properties need to be saved manually.
+
+    {
+        hp_max = 1,
+        -- For players only. Defaults to `minetest.PLAYER_MAX_HP_DEFAULT`.
+
+        breath_max = 0,
+        -- For players only. Defaults to `minetest.PLAYER_MAX_BREATH_DEFAULT`.
+
+        zoom_fov = 0.0,
+        -- For players only. Zoom FOV in degrees.
+        -- Note that zoom loads and/or generates world beyond the server's
+        -- maximum send and generate distances, so acts like a telescope.
+        -- Smaller zoom_fov values increase the distance loaded/generated.
+        -- Defaults to 15 in creative mode, 0 in survival mode.
+        -- zoom_fov = 0 disables zooming for the player.
+
+        eye_height = 1.625,
+        -- For players only. Camera height above feet position in nodes.
+        -- Defaults to 1.625.
+
+        physical = true,
+        -- Collide with `walkable` nodes.
+
+        collide_with_objects = true,
+        -- Collide with other objects if physical = true
+
+        collisionbox = {-0.5, 0.0, -0.5, 0.5, 1.0, 0.5},  -- Default
+        selectionbox = {-0.5, 0.0, -0.5, 0.5, 1.0, 0.5},
+        -- Selection box uses collision box dimensions when not set.
+        -- For both boxes: {xmin, ymin, zmin, xmax, ymax, zmax} in nodes from
+        -- object position.
+
+        pointable = true,
+        -- Overrides selection box when false
+
+        visual = "cube" / "sprite" / "upright_sprite" / "mesh" / "wielditem" / "item",
+        -- "cube" is a node-sized cube.
+        -- "sprite" is a flat texture always facing the player.
+        -- "upright_sprite" is a vertical flat texture.
+        -- "mesh" uses the defined mesh model.
+        -- "wielditem" is used for dropped items.
+        --   (see builtin/game/item_entity.lua).
+        --   For this use 'wield_item = itemname' (Deprecated: 'textures = {itemname}').
+        --   If the item has a 'wield_image' the object will be an extrusion of
+        --   that, otherwise:
+        --   If 'itemname' is a cubic node or nodebox the object will appear
+        --   identical to 'itemname'.
+        --   If 'itemname' is a plantlike node the object will be an extrusion
+        --   of its texture.
+        --   Otherwise for non-node items, the object will be an extrusion of
+        --   'inventory_image'.
+        --   If 'itemname' contains a ColorString or palette index (e.g. from
+        --   `minetest.itemstring_with_palette()`), the entity will inherit the color.
+        -- "item" is similar to "wielditem" but ignores the 'wield_image' parameter.
+
+        visual_size = {x = 1, y = 1, z = 1},
+        -- Multipliers for the visual size. If `z` is not specified, `x` will be used
+        -- to scale the entity along both horizontal axes.
+
+        mesh = "model.obj",
+        -- File name of mesh when using "mesh" visual
+
+        textures = {},
+        -- Number of required textures depends on visual.
+        -- "cube" uses 6 textures just like a node, but all 6 must be defined.
+        -- "sprite" uses 1 texture.
+        -- "upright_sprite" uses 2 textures: {front, back}.
+        -- "wielditem" expects 'textures = {itemname}' (see 'visual' above).
+
+        colors = {},
+        -- Number of required colors depends on visual
+
+        use_texture_alpha = false,
+        -- Use texture's alpha channel.
+        -- Excludes "upright_sprite" and "wielditem".
+        -- Note: currently causes visual issues when viewed through other
+        -- semi-transparent materials such as water.
+
+        spritediv = {x = 1, y = 1},
+        -- Used with spritesheet textures for animation and/or frame selection
+        -- according to position relative to player.
+        -- Defines the number of columns and rows in the spritesheet:
+        -- {columns, rows}.
+
+        initial_sprite_basepos = {x = 0, y = 0},
+        -- Used with spritesheet textures.
+        -- Defines the {column, row} position of the initially used frame in the
+        -- spritesheet.
+
+        is_visible = true,
+        -- If false, object is invisible and can't be pointed.
+
+        makes_footstep_sound = false,
+        -- If true, is able to make footstep sounds of nodes
+        -- (see node sound definition for details).
+
+        automatic_rotate = 0,
+        -- Set constant rotation in radians per second, positive or negative.
+        -- Set to 0 to disable constant rotation.
+
+        stepheight = 0,
+        -- If positive number, object will climb upwards when it moves
+        -- horizontally against a `walkable` node, if the height difference
+        -- is within `stepheight`.
+
+        automatic_face_movement_dir = 0.0,
+        -- Automatically set yaw to movement direction, offset in degrees.
+        -- 'false' to disable.
+
+        automatic_face_movement_max_rotation_per_sec = -1,
+        -- Limit automatic rotation to this value in degrees per second.
+        -- No limit if value <= 0.
+
+        backface_culling = true,
+        -- Set to false to disable backface_culling for model
+
+        glow = 0,
+        -- Add this much extra lighting when calculating texture color.
+        -- Value < 0 disables light's effect on texture color.
+        -- For faking self-lighting, UI style entities, or programmatic coloring
+        -- in mods.
+
+        nametag = "",
+        -- By default empty, for players their name is shown if empty
+
+        nametag_color = <ColorSpec>,
+        -- Sets color of nametag
+
+        infotext = "",
+        -- By default empty, text to be shown when pointed at object
+
+        static_save = true,
+        -- If false, never save this object statically. It will simply be
+        -- deleted when the block gets unloaded.
+        -- The get_staticdata() callback is never called then.
+        -- Defaults to 'true'.
+    }
+
+Entity definition
+-----------------
+
+Used by `minetest.register_entity`.
+
+    {
+        initial_properties = {
+            visual = "mesh",
+            mesh = "boats_boat.obj",
+            ...,
+        },
+        -- A table of object properties, see the `Object properties` section.
+        -- Object properties being read directly from the entity definition
+        -- table is deprecated. Define object properties in this
+        -- `initial_properties` table instead.
+
+        on_activate = function(self, staticdata, dtime_s),
+
+        on_step = function(self, dtime),
+
+        on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir),
+
+        on_rightclick = function(self, clicker),
+
+        get_staticdata = function(self),
+        -- Called sometimes; the string returned is passed to on_activate when
+        -- the entity is re-activated from static state
+
+        _custom_field = whatever,
+        -- You can define arbitrary member variables here (see Item definition
+        -- for more info) by using a '_' prefix
+    }
+
+ABM (ActiveBlockModifier) definition
+------------------------------------
+
+Used by `minetest.register_abm`.
+
+    {
+        label = "Lava cooling",
+        -- Descriptive label for profiling purposes (optional).
+        -- Definitions with identical labels will be listed as one.
+
+        nodenames = {"default:lava_source"},
+        -- Apply `action` function to these nodes.
+        -- `group:groupname` can also be used here.
+
+        neighbors = {"default:water_source", "default:water_flowing"},
+        -- Only apply `action` to nodes that have one of, or any
+        -- combination of, these neighbors.
+        -- If left out or empty, any neighbor will do.
+        -- `group:groupname` can also be used here.
+
+        interval = 1.0,
+        -- Operation interval in seconds
+
+        chance = 1,
+        -- Chance of triggering `action` per-node per-interval is 1.0 / this
+        -- value
+
+        catch_up = true,
+        -- If true, catch-up behaviour is enabled: The `chance` value is
+        -- temporarily reduced when returning to an area to simulate time lost
+        -- by the area being unattended. Note that the `chance` value can often
+        -- be reduced to 1.
+
+        action = function(pos, node, active_object_count, active_object_count_wider),
+        -- Function triggered for each qualifying node.
+        -- `active_object_count` is number of active objects in the node's
+        -- mapblock.
+        -- `active_object_count_wider` is number of active objects in the node's
+        -- mapblock plus all 26 neighboring mapblocks. If any neighboring
+        -- mapblocks are unloaded an estmate is calculated for them based on
+        -- loaded mapblocks.
+    }
+
+LBM (LoadingBlockModifier) definition
+-------------------------------------
+
+Used by `minetest.register_lbm`.
+
+A loading block modifier (LBM) is used to define a function that is called for
+specific nodes (defined by `nodenames`) when a mapblock which contains such nodes
+gets loaded.
+
+    {
+        label = "Upgrade legacy doors",
+        -- Descriptive label for profiling purposes (optional).
+        -- Definitions with identical labels will be listed as one.
+
+        name = "modname:replace_legacy_door",
+
+        nodenames = {"default:lava_source"},
+        -- List of node names to trigger the LBM on.
+        -- Also non-registered nodes will work.
+        -- Groups (as of group:groupname) will work as well.
+
+        run_at_every_load = false,
+        -- Whether to run the LBM's action every time a block gets loaded,
+        -- and not only the first time the block gets loaded after the LBM
+        -- was introduced.
+
+        action = function(pos, node),
+    }
+
+Tile definition
+---------------
+
+* `"image.png"`
+* `{name="image.png", animation={Tile Animation definition}}`
+* `{name="image.png", backface_culling=bool, tileable_vertical=bool,
+  tileable_horizontal=bool, align_style="node"/"world"/"user", scale=int}`
+    * backface culling enabled by default for most nodes
+    * tileable flags are info for shaders, how they should treat texture
+      when displacement mapping is used.
+      Directions are from the point of view of the tile texture,
+      not the node it's on.
+    * align style determines whether the texture will be rotated with the node
+      or kept aligned with its surroundings. "user" means that client
+      setting will be used, similar to `glasslike_framed_optional`.
+      Note: supported by solid nodes and nodeboxes only.
+    * scale is used to make texture span several (exactly `scale`) nodes,
+      instead of just one, in each direction. Works for world-aligned
+      textures only.
+      Note that as the effect is applied on per-mapblock basis, `16` should
+      be equally divisible by `scale` or you may get wrong results.
+* `{name="image.png", color=ColorSpec}`
+    * the texture's color will be multiplied with this color.
+    * the tile's color overrides the owning node's color in all cases.
+* deprecated, yet still supported field names:
+    * `image` (name)
+
+Tile animation definition
+-------------------------
+
+    {
+        type = "vertical_frames",
+
+        aspect_w = 16,
+        -- Width of a frame in pixels
+
+        aspect_h = 16,
+        -- Height of a frame in pixels
+
+        length = 3.0,
+        -- Full loop length
+    }
+
+    {
+        type = "sheet_2d",
+
+        frames_w = 5,
+        -- Width in number of frames
+
+        frames_h = 3,
+        -- Height in number of frames
+
+        frame_length = 0.5,
+        -- Length of a single frame
+    }
+
+Item definition
+---------------
+
+Used by `minetest.register_node`, `minetest.register_craftitem`, and
+`minetest.register_tool`.
+
+    {
+        description = "Steel Axe",
+
+        groups = {},
+        -- key = name, value = rating; rating = 1..3.
+        -- If rating not applicable, use 1.
+        -- e.g. {wool = 1, fluffy = 3}
+        --      {soil = 2, outerspace = 1, crumbly = 1}
+        --      {bendy = 2, snappy = 1},
+        --      {hard = 1, metal = 1, spikes = 1}
+
+        inventory_image = "default_tool_steelaxe.png",
+
+        inventory_overlay = "overlay.png",
+        -- An overlay which does not get colorized
+
+        wield_image = "",
+
+        wield_overlay = "",
+
+        palette = "",
+        -- An image file containing the palette of a node.
+        -- You can set the currently used color as the "palette_index" field of
+        -- the item stack metadata.
+        -- The palette is always stretched to fit indices between 0 and 255, to
+        -- ensure compatibility with "colorfacedir" and "colorwallmounted" nodes.
+
+        color = "0xFFFFFFFF",
+        -- The color of the item. The palette overrides this.
+
+        wield_scale = {x = 1, y = 1, z = 1},
+
+        stack_max = 99,
+
+        range = 4.0,
+
+        liquids_pointable = false,
+
+        -- See "Tools" section for an example including explanation
+        tool_capabilities = {
+            full_punch_interval = 1.0,
+            max_drop_level = 0,
+            groupcaps = {
+                -- For example:
+                choppy = {times = {[1] = 2.50, [2] = 1.40, [3] = 1.00},
+                         uses = 20, maxlevel = 2},
+            },
+            damage_groups = {groupname = damage},
+            -- Damage values must be between -32768 and 32767 (2^15)
+
+            punch_attack_uses = nil,
+            -- Amount of uses this tool has for attacking players and entities
+            -- by punching them (0 = infinite uses).
+            -- For compatibility, this is automatically set from the first
+            -- suitable groupcap using the forumla "uses * 3^(maxlevel - 1)".
+            -- It is recommend to set this explicitly instead of relying on the
+            -- fallback behavior.
+        },
+
+        node_placement_prediction = nil,
+        -- If nil and item is node, prediction is made automatically.
+        -- If nil and item is not a node, no prediction is made.
+        -- If "" and item is anything, no prediction is made.
+        -- Otherwise should be name of node which the client immediately places
+        -- on ground when the player places the item. Server will always update
+        -- actual result to client in a short moment.
+
+        node_dig_prediction = "air",
+        -- if "", no prediction is made.
+        -- if "air", node is removed.
+        -- Otherwise should be name of node which the client immediately places
+        -- upon digging. Server will always update actual result shortly.
+
+        sound = {
+            -- Definition of items sounds to be played at various events.
+            -- All fields in this table are optional.
+
+            breaks = <SimpleSoundSpec>,
+            -- When tool breaks due to wear. Ignored for non-tools
+
+            eat = <SimpleSoundSpec>,
+            -- When item is eaten with `minetest.do_item_eat`
+        },
+
+        on_place = function(itemstack, placer, pointed_thing),
+        -- Shall place item and return the leftover itemstack.
+        -- The placer may be any ObjectRef or nil.
+        -- default: minetest.item_place
+
+        on_secondary_use = function(itemstack, user, pointed_thing),
+        -- Same as on_place but called when not pointing at a node.
+        -- The user may be any ObjectRef or nil.
+        -- default: nil
+
+        on_drop = function(itemstack, dropper, pos),
+        -- Shall drop item and return the leftover itemstack.
+        -- The dropper may be any ObjectRef or nil.
+        -- default: minetest.item_drop
+
+        on_use = function(itemstack, user, pointed_thing),
+        -- default: nil
+        -- Function must return either nil if no item shall be removed from
+        -- inventory, or an itemstack to replace the original itemstack.
+        -- e.g. itemstack:take_item(); return itemstack
+        -- Otherwise, the function is free to do what it wants.
+        -- The user may be any ObjectRef or nil.
+        -- The default functions handle regular use cases.
+
+        after_use = function(itemstack, user, node, digparams),
+        -- default: nil
+        -- If defined, should return an itemstack and will be called instead of
+        -- wearing out the tool. If returns nil, does nothing.
+        -- If after_use doesn't exist, it is the same as:
+        --   function(itemstack, user, node, digparams)
+        --     itemstack:add_wear(digparams.wear)
+        --     return itemstack
+        --   end
+        -- The user may be any ObjectRef or nil.
+
+        _custom_field = whatever,
+        -- Add your own custom fields. By convention, all custom field names
+        -- should start with `_` to avoid naming collisions with future engine
+        -- usage.
+    }
+
+Node definition
+---------------
+
+Used by `minetest.register_node`.
+
+    {
+        -- <all fields allowed in item definitions>,
+
+        drawtype = "normal",  -- See "Node drawtypes"
+
+        visual_scale = 1.0,
+        -- Supported for drawtypes "plantlike", "signlike", "torchlike",
+        -- "firelike", "mesh".
+        -- For plantlike and firelike, the image will start at the bottom of the
+        -- node. For torchlike, the image will start at the surface to which the
+        -- node "attaches". For the other drawtypes the image will be centered
+        -- on the node.
+
+        tiles = {tile definition 1, def2, def3, def4, def5, def6},
+        -- Textures of node; +Y, -Y, +X, -X, +Z, -Z
+        -- Old field name was 'tile_images'.
+        -- List can be shortened to needed length.
+
+        overlay_tiles = {tile definition 1, def2, def3, def4, def5, def6},
+        -- Same as `tiles`, but these textures are drawn on top of the base
+        -- tiles. You can use this to colorize only specific parts of your
+        -- texture. If the texture name is an empty string, that overlay is not
+        -- drawn. Since such tiles are drawn twice, it is not recommended to use
+        -- overlays on very common nodes.
+
+        special_tiles = {tile definition 1, Tile definition 2},
+        -- Special textures of node; used rarely.
+        -- Old field name was 'special_materials'.
+        -- List can be shortened to needed length.
+
+        color = ColorSpec,
+        -- The node's original color will be multiplied with this color.
+        -- If the node has a palette, then this setting only has an effect in
+        -- the inventory and on the wield item.
+
+        use_texture_alpha = false,
+        -- Use texture's alpha channel
+
+        palette = "palette.png",
+        -- The node's `param2` is used to select a pixel from the image.
+        -- Pixels are arranged from left to right and from top to bottom.
+        -- The node's color will be multiplied with the selected pixel's color.
+        -- Tiles can override this behavior.
+        -- Only when `paramtype2` supports palettes.
+
+        post_effect_color = "green#0F",
+        -- Screen tint if player is inside node, see "ColorSpec"
+
+        paramtype = "none",  -- See "Nodes"
+
+        paramtype2 = "none",  -- See "Nodes"
+
+        place_param2 = nil,  -- Force value for param2 when player places node
+
+        is_ground_content = true,
+        -- If false, the cave generator and dungeon generator will not carve
+        -- through this node.
+        -- Specifically, this stops mod-added nodes being removed by caves and
+        -- dungeons when those generate in a neighbor mapchunk and extend out
+        -- beyond the edge of that mapchunk.
+
+        sunlight_propagates = false,
+        -- If true, sunlight will go infinitely through this node
+
+        walkable = true,  -- If true, objects collide with node
+
+        pointable = true,  -- If true, can be pointed at
+
+        diggable = true,  -- If false, can never be dug
+
+        climbable = false,  -- If true, can be climbed on (ladder)
+
+        buildable_to = false,  -- If true, placed nodes can replace this node
+
+        floodable = false,
+        -- If true, liquids flow into and replace this node.
+        -- Warning: making a liquid node 'floodable' will cause problems.
+
+        liquidtype = "none",  -- "none" / "source" / "flowing"
+
+        liquid_alternative_flowing = "",  -- Flowing version of source liquid
+
+        liquid_alternative_source = "",  -- Source version of flowing liquid
+
+        liquid_viscosity = 0,  -- Higher viscosity = slower flow (max. 7)
+
+        liquid_renewable = true,
+        -- If true, a new liquid source can be created by placing two or more
+        -- sources nearby
+
+        leveled = 16,
+        -- Only valid for "nodebox" drawtype with 'type = "leveled"'.
+        -- Allows defining the nodebox height without using param2.
+        -- The nodebox height is 'leveled' / 64 nodes.
+        -- The maximum value of 'leveled' is 127.
+
+        liquid_range = 8,  -- Number of flowing nodes around source (max. 8)
+
+        drowning = 0,
+        -- Player will take this amount of damage if no bubbles are left
+
+        light_source = 0,
+        -- Amount of light emitted by node.
+        -- To set the maximum (14), use the value 'minetest.LIGHT_MAX'.
+        -- A value outside the range 0 to minetest.LIGHT_MAX causes undefined
+        -- behavior.
+
+        damage_per_second = 0,
+        -- If player is inside node, this damage is caused
+
+        node_box = {type="regular"},  -- See "Node boxes"
+
+        connects_to = nodenames,
+        -- Used for nodebox nodes with the type == "connected".
+        -- Specifies to what neighboring nodes connections will be drawn.
+        -- e.g. `{"group:fence", "default:wood"}` or `"default:stone"`
+
+        connect_sides = { "top", "bottom", "front", "left", "back", "right" },
+        -- Tells connected nodebox nodes to connect only to these sides of this
+        -- node
+
+        mesh = "model.obj",
+        -- File name of mesh when using "mesh" drawtype
+
+        selection_box = {
+            type = "fixed",
+            fixed = {
+                {-2 / 16, -0.5, -2 / 16, 2 / 16, 3 / 16, 2 / 16},
+            },
+        },
+        -- Custom selection box definition. Multiple boxes can be defined.
+        -- If "nodebox" drawtype is used and selection_box is nil, then node_box
+        -- definition is used for the selection box.
+
+        collision_box = {
+            type = "fixed",
+            fixed = {
+                {-2 / 16, -0.5, -2 / 16, 2 / 16, 3 / 16, 2 / 16},
+            },
+        },
+        -- Custom collision box definition. Multiple boxes can be defined.
+        -- If "nodebox" drawtype is used and collision_box is nil, then node_box
+        -- definition is used for the collision box.
+        -- Both of the boxes above are defined as:
+        -- {xmin, ymin, zmin, xmax, ymax, zmax} in nodes from node center.
+
+        -- Support maps made in and before January 2012
+        legacy_facedir_simple = false,
+        legacy_wallmounted = false,
+
+        waving = 0,
+        -- Valid for drawtypes:
+        -- mesh, nodebox, plantlike, allfaces_optional, liquid, flowingliquid.
+        -- 1 - wave node like plants (node top moves side-to-side, bottom is fixed)
+        -- 2 - wave node like leaves (whole node moves side-to-side)
+        -- 3 - wave node like liquids (whole node moves up and down)
+        -- Not all models will properly wave.
+        -- plantlike drawtype can only wave like plants.
+        -- allfaces_optional drawtype can only wave like leaves.
+        -- liquid, flowingliquid drawtypes can only wave like liquids.
+
+        sounds = {
+            -- Definition of node sounds to be played at various events.
+            -- All fields in this table are optional.
+
+            footstep = <SimpleSoundSpec>,
+            -- If walkable, played when object walks on it. If node is
+            -- climbable or a liquid, played when object moves through it
+
+            dig = <SimpleSoundSpec> or "__group",
+            -- While digging node.
+            -- If `"__group"`, then the sound will be
+            -- `default_dig_<groupname>`, where `<groupname>` is the
+            -- name of the tool's digging group with the fastest digging time.
+            -- In case of a tie, one of the sounds will be played (but we
+            -- cannot predict which one)
+            -- Default value: `"__group"`
+
+            dug = <SimpleSoundSpec>,
+            -- Node was dug
+
+            place = <SimpleSoundSpec>,
+            -- Node was placed. Also played after falling
+
+            place_failed = <SimpleSoundSpec>,
+            -- When node placement failed
+
+            fall = <SimpleSoundSpec>,
+            -- When node starts to fall
+        },
+
+        drop = "",
+        -- Name of dropped item when dug.
+        -- Default dropped item is the node itself.
+        -- Using a table allows multiple items, drop chances and tool filtering.
+        -- Tool filtering was undocumented until recently, tool filtering by string
+        -- matching is deprecated.
+        drop = {
+            max_items = 1,
+            -- Maximum number of item lists to drop.
+            -- The entries in 'items' are processed in order. For each:
+            -- Tool filtering is applied, chance of drop is applied, if both are
+            -- successful the entire item list is dropped.
+            -- Entry processing continues until the number of dropped item lists
+            -- equals 'max_items'.
+            -- Therefore, entries should progress from low to high drop chance.
+            items = {
+                -- Entry examples.
+                {
+                    -- 1 in 1000 chance of dropping a diamond.
+                    -- Default rarity is '1'.
+                    rarity = 1000,
+                    items = {"default:diamond"},
+                },
+                {
+                    -- Only drop if using a tool whose name is identical to one
+                    -- of these.
+                    tools = {"default:shovel_mese", "default:shovel_diamond"},
+                    rarity = 5,
+                    items = {"default:dirt"},
+                    -- Whether all items in the dropped item list inherit the
+                    -- hardware coloring palette color from the dug node.
+                    -- Default is 'false'.
+                    inherit_color = true,
+                },
+                {
+                    -- Only drop if using a tool whose name contains
+                    -- "default:shovel_" (this tool filtering by string matching
+                    -- is deprecated).
+                    tools = {"~default:shovel_"},
+                    rarity = 2,
+                    -- The item list dropped.
+                    items = {"default:sand", "default:desert_sand"},
+                },
+            },
+        },
+
+        on_construct = function(pos),
+        -- Node constructor; called after adding node.
+        -- Can set up metadata and stuff like that.
+        -- Not called for bulk node placement (i.e. schematics and VoxelManip).
+        -- default: nil
+
+        on_destruct = function(pos),
+        -- Node destructor; called before removing node.
+        -- Not called for bulk node placement.
+        -- default: nil
+
+        after_destruct = function(pos, oldnode),
+        -- Node destructor; called after removing node.
+        -- Not called for bulk node placement.
+        -- default: nil
+
+        on_flood = function(pos, oldnode, newnode),
+        -- Called when a liquid (newnode) is about to flood oldnode, if it has
+        -- `floodable = true` in the nodedef. Not called for bulk node placement
+        -- (i.e. schematics and VoxelManip) or air nodes. If return true the
+        -- node is not flooded, but on_flood callback will most likely be called
+        -- over and over again every liquid update interval.
+        -- Default: nil
+        -- Warning: making a liquid node 'floodable' will cause problems.
+
+        preserve_metadata = function(pos, oldnode, oldmeta, drops),
+        -- Called when oldnode is about be converted to an item, but before the
+        -- node is deleted from the world or the drops are added. This is
+        -- generally the result of either the node being dug or an attached node
+        -- becoming detached.
+        -- drops is a table of ItemStacks, so any metadata to be preserved can
+        -- be added directly to one or more of the dropped items. See
+        -- "ItemStackMetaRef".
+        -- default: nil
+
+        after_place_node = function(pos, placer, itemstack, pointed_thing),
+        -- Called after constructing node when node was placed using
+        -- minetest.item_place_node / minetest.place_node.
+        -- If return true no item is taken from itemstack.
+        -- `placer` may be any valid ObjectRef or nil.
+        -- default: nil
+
+        after_dig_node = function(pos, oldnode, oldmetadata, digger),
+        -- oldmetadata is in table format.
+        -- Called after destructing node when node was dug using
+        -- minetest.node_dig / minetest.dig_node.
+        -- default: nil
+
+        can_dig = function(pos, [player]),
+        -- Returns true if node can be dug, or false if not.
+        -- default: nil
+
+        on_punch = function(pos, node, puncher, pointed_thing),
+        -- default: minetest.node_punch
+        -- By default calls minetest.register_on_punchnode callbacks.
+
+        on_rightclick = function(pos, node, clicker, itemstack, pointed_thing),
+        -- default: nil
+        -- itemstack will hold clicker's wielded item.
+        -- Shall return the leftover itemstack.
+        -- Note: pointed_thing can be nil, if a mod calls this function.
+        -- This function does not get triggered by clients <=0.4.16 if the
+        -- "formspec" node metadata field is set.
+
+        on_dig = function(pos, node, digger),
+        -- default: minetest.node_dig
+        -- By default checks privileges, wears out tool and removes node.
+
+        on_timer = function(pos, elapsed),
+        -- default: nil
+        -- called by NodeTimers, see minetest.get_node_timer and NodeTimerRef.
+        -- elapsed is the total time passed since the timer was started.
+        -- return true to run the timer for another cycle with the same timeout
+        -- value.
+
+        on_receive_fields = function(pos, formname, fields, sender),
+        -- fields = {name1 = value1, name2 = value2, ...}
+        -- Called when an UI form (e.g. sign text input) returns data.
+        -- See minetest.register_on_player_receive_fields for more info.
+        -- default: nil
+
+        allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player),
+        -- Called when a player wants to move items inside the inventory.
+        -- Return value: number of items allowed to move.
+
+        allow_metadata_inventory_put = function(pos, listname, index, stack, player),
+        -- Called when a player wants to put something into the inventory.
+        -- Return value: number of items allowed to put.
+        -- Return value -1: Allow and don't modify item count in inventory.
+
+        allow_metadata_inventory_take = function(pos, listname, index, stack, player),
+        -- Called when a player wants to take something out of the inventory.
+        -- Return value: number of items allowed to take.
+        -- Return value -1: Allow and don't modify item count in inventory.
+
+        on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player),
+        on_metadata_inventory_put = function(pos, listname, index, stack, player),
+        on_metadata_inventory_take = function(pos, listname, index, stack, player),
+        -- Called after the actual action has happened, according to what was
+        -- allowed.
+        -- No return value.
+
+        on_blast = function(pos, intensity),
+        -- intensity: 1.0 = mid range of regular TNT.
+        -- If defined, called when an explosion touches the node, instead of
+        -- removing the node.
+    }
+
+Crafting recipes
+----------------
+
+Used by `minetest.register_craft`.
+
+### Shaped
+
+    {
+        output = 'default:pick_stone',
+        recipe = {
+            {'default:cobble', 'default:cobble', 'default:cobble'},
+            {'', 'default:stick', ''},
+            {'', 'default:stick', ''},  -- Also groups; e.g. 'group:crumbly'
+        },
+        replacements = <list of item pairs>,
+        -- replacements: replace one input item with another item on crafting
+        -- (optional).
+    }
+
+### Shapeless
+
+    {
+        type = "shapeless",
+        output = 'mushrooms:mushroom_stew',
+        recipe = {
+            "mushrooms:bowl",
+            "mushrooms:mushroom_brown",
+            "mushrooms:mushroom_red",
+        },
+        replacements = <list of item pairs>,
+    }
+
+### Tool repair
+
+    {
+        type = "toolrepair",
+        additional_wear = -0.02,
+    }
+
+Note: Tools with group `disable_repair=1` will not repairable by this recipe.
+
+### Cooking
+
+    {
+        type = "cooking",
+        output = "default:glass",
+        recipe = "default:sand",
+        cooktime = 3,
+    }
+
+### Furnace fuel
+
+    {
+        type = "fuel",
+        recipe = "bucket:bucket_lava",
+        burntime = 60,
+        replacements = {{"bucket:bucket_lava", "bucket:bucket_empty"}},
+    }
+
+Ore definition
+--------------
+
+Used by `minetest.register_ore`.
+
+See [Ores] section above for essential information.
+
+    {
+        ore_type = "scatter",
+
+        ore = "default:stone_with_coal",
+
+        ore_param2 = 3,
+        -- Facedir rotation. Default is 0 (unchanged rotation)
+
+        wherein = "default:stone",
+        -- A list of nodenames is supported too
+
+        clust_scarcity = 8 * 8 * 8,
+        -- Ore has a 1 out of clust_scarcity chance of spawning in a node.
+        -- If the desired average distance between ores is 'd', set this to
+        -- d * d * d.
+
+        clust_num_ores = 8,
+        -- Number of ores in a cluster
+
+        clust_size = 3,
+        -- Size of the bounding box of the cluster.
+        -- In this example, there is a 3 * 3 * 3 cluster where 8 out of the 27
+        -- nodes are coal ore.
+
+        y_min = -31000,
+        y_max = 64,
+        -- Lower and upper limits for ore
+
+        flags = "",
+        -- Attributes for the ore generation, see 'Ore attributes' section above
+
+        noise_threshold = 0.5,
+        -- If noise is above this threshold, ore is placed. Not needed for a
+        -- uniform distribution.
+
+        noise_params = {
+            offset = 0,
+            scale = 1,
+            spread = {x = 100, y = 100, z = 100},
+            seed = 23,
+            octaves = 3,
+            persist = 0.7
+        },
+        -- NoiseParams structure describing one of the perlin noises used for
+        -- ore distribution.
+        -- Needed by "sheet", "puff", "blob" and "vein" ores.
+        -- Omit from "scatter" ore for a uniform ore distribution.
+        -- Omit from "stratum" ore for a simple horizontal strata from y_min to
+        -- y_max.
+
+        biomes = {"desert", "rainforest"},
+        -- List of biomes in which this ore occurs.
+        -- Occurs in all biomes if this is omitted, and ignored if the Mapgen
+        -- being used does not support biomes.
+        -- Can be a list of (or a single) biome names, IDs, or definitions.
+
+        -- Type-specific parameters
+
+        -- sheet
+        column_height_min = 1,
+        column_height_max = 16,
+        column_midpoint_factor = 0.5,
+
+        -- puff
+        np_puff_top = {
+            offset = 4,
+            scale = 2,
+            spread = {x = 100, y = 100, z = 100},
+            seed = 47,
+            octaves = 3,
+            persist = 0.7
+        },
+        np_puff_bottom = {
+            offset = 4,
+            scale = 2,
+            spread = {x = 100, y = 100, z = 100},
+            seed = 11,
+            octaves = 3,
+            persist = 0.7
+        },
+
+        -- vein
+        random_factor = 1.0,
+
+        -- stratum
+        np_stratum_thickness = {
+            offset = 8,
+            scale = 4,
+            spread = {x = 100, y = 100, z = 100},
+            seed = 17,
+            octaves = 3,
+            persist = 0.7
+        },
+        stratum_thickness = 8,
+    }
+
+Biome definition
+----------------
+
+Used by `minetest.register_biome`.
+
+    {
+        name = "tundra",
+
+        node_dust = "default:snow",
+        -- Node dropped onto upper surface after all else is generated
+
+        node_top = "default:dirt_with_snow",
+        depth_top = 1,
+        -- Node forming surface layer of biome and thickness of this layer
+
+        node_filler = "default:permafrost",
+        depth_filler = 3,
+        -- Node forming lower layer of biome and thickness of this layer
+
+        node_stone = "default:bluestone",
+        -- Node that replaces all stone nodes between roughly y_min and y_max.
+
+        node_water_top = "default:ice",
+        depth_water_top = 10,
+        -- Node forming a surface layer in seawater with the defined thickness
+
+        node_water = "",
+        -- Node that replaces all seawater nodes not in the surface layer
+
+        node_river_water = "default:ice",
+        -- Node that replaces river water in mapgens that use
+        -- default:river_water
+
+        node_riverbed = "default:gravel",
+        depth_riverbed = 2,
+        -- Node placed under river water and thickness of this layer
+
+        node_cave_liquid = "default:lava_source",
+        node_cave_liquid = {"default:water_source", "default:lava_source"},
+        -- Nodes placed inside 50% of the medium size caves.
+        -- Multiple nodes can be specified, each cave will use a randomly
+        -- chosen node from the list.
+        -- If this field is left out or 'nil', cave liquids fall back to
+        -- classic behaviour of lava and water distributed using 3D noise.
+        -- For no cave liquid, specify "air".
+
+        node_dungeon = "default:cobble",
+        -- Node used for primary dungeon structure.
+        -- If absent, dungeon nodes fall back to the 'mapgen_cobble' mapgen
+        -- alias, if that is also absent, dungeon nodes fall back to the biome
+        -- 'node_stone'.
+        -- If present, the following two nodes are also used.
+
+        node_dungeon_alt = "default:mossycobble",
+        -- Node used for randomly-distributed alternative structure nodes.
+        -- If alternative structure nodes are not wanted leave this absent for
+        -- performance reasons.
+
+        node_dungeon_stair = "stairs:stair_cobble",
+        -- Node used for dungeon stairs.
+        -- If absent, stairs fall back to 'node_dungeon'.
+
+        y_max = 31000,
+        y_min = 1,
+        -- Upper and lower limits for biome.
+        -- Alternatively you can use xyz limits as shown below.
+
+        max_pos = {x = 31000, y = 128, z = 31000},
+        min_pos = {x = -31000, y = 9, z = -31000},
+        -- xyz limits for biome, an alternative to using 'y_min' and 'y_max'.
+        -- Biome is limited to a cuboid defined by these positions.
+        -- Any x, y or z field left undefined defaults to -31000 in 'min_pos' or
+        -- 31000 in 'max_pos'.
+
+        vertical_blend = 8,
+        -- Vertical distance in nodes above 'y_max' over which the biome will
+        -- blend with the biome above.
+        -- Set to 0 for no vertical blend. Defaults to 0.
+
+        heat_point = 0,
+        humidity_point = 50,
+        -- Characteristic temperature and humidity for the biome.
+        -- These values create 'biome points' on a voronoi diagram with heat and
+        -- humidity as axes. The resulting voronoi cells determine the
+        -- distribution of the biomes.
+        -- Heat and humidity have average values of 50, vary mostly between
+        -- 0 and 100 but can exceed these values.
+    }
+
+Decoration definition
+---------------------
+
+See [Decoration types]. Used by `minetest.register_decoration`.
+
+    {
+        deco_type = "simple",
+
+        place_on = "default:dirt_with_grass",
+        -- Node (or list of nodes) that the decoration can be placed on
+
+        sidelen = 8,
+        -- Size of the square divisions of the mapchunk being generated.
+        -- Determines the resolution of noise variation if used.
+        -- If the chunk size is not evenly divisible by sidelen, sidelen is made
+        -- equal to the chunk size.
+
+        fill_ratio = 0.02,
+        -- The value determines 'decorations per surface node'.
+        -- Used only if noise_params is not specified.
+        -- If >= 10.0 complete coverage is enabled and decoration placement uses
+        -- a different and much faster method.
+
+        noise_params = {
+            offset = 0,
+            scale = 0.45,
+            spread = {x = 100, y = 100, z = 100},
+            seed = 354,
+            octaves = 3,
+            persist = 0.7,
+            lacunarity = 2.0,
+            flags = "absvalue"
+        },
+        -- NoiseParams structure describing the perlin noise used for decoration
+        -- distribution.
+        -- A noise value is calculated for each square division and determines
+        -- 'decorations per surface node' within each division.
+        -- If the noise value >= 10.0 complete coverage is enabled and
+        -- decoration placement uses a different and much faster method.
+
+        biomes = {"Oceanside", "Hills", "Plains"},
+        -- List of biomes in which this decoration occurs. Occurs in all biomes
+        -- if this is omitted, and ignored if the Mapgen being used does not
+        -- support biomes.
+        -- Can be a list of (or a single) biome names, IDs, or definitions.
+
+        y_min = -31000,
+        y_max = 31000,
+        -- Lower and upper limits for decoration.
+        -- These parameters refer to the Y co-ordinate of the 'place_on' node.
+
+        spawn_by = "default:water",
+        -- Node (or list of nodes) that the decoration only spawns next to.
+        -- Checks two horizontal planes of 8 neighbouring nodes (including
+        -- diagonal neighbours), one plane level with the 'place_on' node and a
+        -- plane one node above that.
+
+        num_spawn_by = 1,
+        -- Number of spawn_by nodes that must be surrounding the decoration
+        -- position to occur.
+        -- If absent or -1, decorations occur next to any nodes.
+
+        flags = "liquid_surface, force_placement, all_floors, all_ceilings",
+        -- Flags for all decoration types.
+        -- "liquid_surface": Instead of placement on the highest solid surface
+        --   in a mapchunk column, placement is on the highest liquid surface.
+        --   Placement is disabled if solid nodes are found above the liquid
+        --   surface.
+        -- "force_placement": Nodes other than "air" and "ignore" are replaced
+        --   by the decoration.
+        -- "all_floors", "all_ceilings": Instead of placement on the highest
+        --   surface in a mapchunk the decoration is placed on all floor and/or
+        --   ceiling surfaces, for example in caves and dungeons.
+        --   Ceiling decorations act as an inversion of floor decorations so the
+        --   effect of 'place_offset_y' is inverted.
+        --   Y-slice probabilities do not function correctly for ceiling
+        --   schematic decorations as the behaviour is unchanged.
+        --   If a single decoration registration has both flags the floor and
+        --   ceiling decorations will be aligned vertically.
+
+        ----- Simple-type parameters
+
+        decoration = "default:grass",
+        -- The node name used as the decoration.
+        -- If instead a list of strings, a randomly selected node from the list
+        -- is placed as the decoration.
+
+        height = 1,
+        -- Decoration height in nodes.
+        -- If height_max is not 0, this is the lower limit of a randomly
+        -- selected height.
+
+        height_max = 0,
+        -- Upper limit of the randomly selected height.
+        -- If absent, the parameter 'height' is used as a constant.
+
+        param2 = 0,
+        -- Param2 value of decoration nodes.
+        -- If param2_max is not 0, this is the lower limit of a randomly
+        -- selected param2.
+
+        param2_max = 0,
+        -- Upper limit of the randomly selected param2.
+        -- If absent, the parameter 'param2' is used as a constant.
+
+        place_offset_y = 0,
+        -- Y offset of the decoration base node relative to the standard base
+        -- node position.
+        -- Can be positive or negative. Default is 0.
+        -- Effect is inverted for "all_ceilings" decorations.
+        -- Ignored by 'y_min', 'y_max' and 'spawn_by' checks, which always refer
+        -- to the 'place_on' node.
+
+        ----- Schematic-type parameters
+
+        schematic = "foobar.mts",
+        -- If schematic is a string, it is the filepath relative to the current
+        -- working directory of the specified Minetest schematic file.
+        -- Could also be the ID of a previously registered schematic.
+
+        schematic = {
+            size = {x = 4, y = 6, z = 4},
+            data = {
+                {name = "default:cobble", param1 = 255, param2 = 0},
+                {name = "default:dirt_with_grass", param1 = 255, param2 = 0},
+                {name = "air", param1 = 255, param2 = 0},
+                 ...
+            },
+            yslice_prob = {
+                {ypos = 2, prob = 128},
+                {ypos = 5, prob = 64},
+                 ...
+            },
+        },
+        -- Alternative schematic specification by supplying a table. The fields
+        -- size and data are mandatory whereas yslice_prob is optional.
+        -- See 'Schematic specifier' for details.
+
+        replacements = {["oldname"] = "convert_to", ...},
+
+        flags = "place_center_x, place_center_y, place_center_z",
+        -- Flags for schematic decorations. See 'Schematic attributes'.
+
+        rotation = "90",
+        -- Rotation can be "0", "90", "180", "270", or "random"
+
+        place_offset_y = 0,
+        -- If the flag 'place_center_y' is set this parameter is ignored.
+        -- Y offset of the schematic base node layer relative to the 'place_on'
+        -- node.
+        -- Can be positive or negative. Default is 0.
+        -- Effect is inverted for "all_ceilings" decorations.
+        -- Ignored by 'y_min', 'y_max' and 'spawn_by' checks, which always refer
+        -- to the 'place_on' node.
+    }
+
+Chat command definition
+-----------------------
+
+Used by `minetest.register_chatcommand`.
+
+    {
+        params = "<name> <privilege>",  -- Short parameter description
+
+        description = "Remove privilege from player",  -- Full description
+
+        privs = {privs=true},  -- Require the "privs" privilege to run
+
+        func = function(name, param),
+        -- Called when command is run. Returns boolean success and text output.
+    }
+
+Note that in params, use of symbols is as follows:
+
+* `<>` signifies a placeholder to be replaced when the command is used. For
+  example, when a player name is needed: `<name>`
+* `[]` signifies param is optional and not required when the command is used.
+  For example, if you require param1 but param2 is optional:
+  `<param1> [<param2>]`
+* `|` signifies exclusive or. The command requires one param from the options
+  provided. For example: `<param1> | <param2>`
+* `()` signifies grouping. For example, when param1 and param2 are both
+  required, or only param3 is required: `(<param1> <param2>) | <param3>`
+
+Privilege definition
+--------------------
+
+Used by `minetest.register_privilege`.
+
+    {
+        description = "",
+        -- Privilege description
+
+        give_to_singleplayer = true,
+        -- Whether to grant the privilege to singleplayer.
+
+        give_to_admin = true,
+        -- Whether to grant the privilege to the server admin.
+        -- Uses value of 'give_to_singleplayer' by default.
+
+        on_grant = function(name, granter_name),
+        -- Called when given to player 'name' by 'granter_name'.
+        -- 'granter_name' will be nil if the priv was granted by a mod.
+
+        on_revoke = function(name, revoker_name),
+        -- Called when taken from player 'name' by 'revoker_name'.
+        -- 'revoker_name' will be nil if the priv was revoked by a mod.
+
+        -- Note that the above two callbacks will be called twice if a player is
+        -- responsible, once with the player name, and then with a nil player
+        -- name.
+        -- Return true in the above callbacks to stop register_on_priv_grant or
+        -- revoke being called.
+    }
+
+Detached inventory callbacks
+----------------------------
+
+Used by `minetest.create_detached_inventory`.
+
+    {
+        allow_move = function(inv, from_list, from_index, to_list, to_index, count, player),
+        -- Called when a player wants to move items inside the inventory.
+        -- Return value: number of items allowed to move.
+
+        allow_put = function(inv, listname, index, stack, player),
+        -- Called when a player wants to put something into the inventory.
+        -- Return value: number of items allowed to put.
+        -- Return value -1: Allow and don't modify item count in inventory.
+
+        allow_take = function(inv, listname, index, stack, player),
+        -- Called when a player wants to take something out of the inventory.
+        -- Return value: number of items allowed to take.
+        -- Return value -1: Allow and don't modify item count in inventory.
+
+        on_move = function(inv, from_list, from_index, to_list, to_index, count, player),
+        on_put = function(inv, listname, index, stack, player),
+        on_take = function(inv, listname, index, stack, player),
+        -- Called after the actual action has happened, according to what was
+        -- allowed.
+        -- No return value.
+    }
+
+HUD Definition
+--------------
+
+See [HUD] section.
+
+Used by `Player:hud_add`. Returned by `Player:hud_get`.
+
+    {
+        hud_elem_type = "image",  -- See HUD element types
+        -- Type of element, can be "image", "text", "statbar", or "inventory"
+
+        position = {x=0.5, y=0.5},
+        -- Left corner position of element
+
+        name = "<name>",
+
+        scale = {x = 2, y = 2},
+
+        text = "<text>",
+
+        number = 2,
+
+        item = 3,
+        -- Selected item in inventory. 0 for no item selected.
+
+        direction = 0,
+        -- Direction: 0: left-right, 1: right-left, 2: top-bottom, 3: bottom-top
+
+        alignment = {x=0, y=0},
+
+        offset = {x=0, y=0},
+
+        size = { x=100, y=100 },
+        -- Size of element in pixels
+
+        z_index = 0,
+        -- Z index : lower z-index HUDs are displayed behind higher z-index HUDs
+    }
+
+Particle definition
+-------------------
+
+Used by `minetest.add_particle`.
+
+    {
+        pos = {x=0, y=0, z=0},
+        velocity = {x=0, y=0, z=0},
+        acceleration = {x=0, y=0, z=0},
+        -- Spawn particle at pos with velocity and acceleration
+
+        expirationtime = 1,
+        -- Disappears after expirationtime seconds
+
+        size = 1,
+        -- Scales the visual size of the particle texture.
+
+        collisiondetection = false,
+        -- If true collides with `walkable` nodes and, depending on the
+        -- `object_collision` field, objects too.
+
+        collision_removal = false,
+        -- If true particle is removed when it collides.
+        -- Requires collisiondetection = true to have any effect.
+
+        object_collision = false,
+        -- If true particle collides with objects that are defined as
+        -- `physical = true,` and `collide_with_objects = true,`.
+        -- Requires collisiondetection = true to have any effect.
+
+        vertical = false,
+        -- If true faces player using y axis only
+
+        texture = "image.png",
+
+        playername = "singleplayer",
+        -- Optional, if specified spawns particle only on the player's client
+
+        animation = {Tile Animation definition},
+        -- Optional, specifies how to animate the particle texture
+
+        glow = 0
+        -- Optional, specify particle self-luminescence in darkness.
+        -- Values 0-14.
+    }
+
+
+`ParticleSpawner` definition
+----------------------------
+
+Used by `minetest.add_particlespawner`.
+
+    {
+        amount = 1,
+        -- Number of particles spawned over the time period `time`.
+
+        time = 1,
+        -- Lifespan of spawner in seconds.
+        -- If time is 0 spawner has infinite lifespan and spawns the `amount` on
+        -- a per-second basis.
+
+        minpos = {x=0, y=0, z=0},
+        maxpos = {x=0, y=0, z=0},
+        minvel = {x=0, y=0, z=0},
+        maxvel = {x=0, y=0, z=0},
+        minacc = {x=0, y=0, z=0},
+        maxacc = {x=0, y=0, z=0},
+        minexptime = 1,
+        maxexptime = 1,
+        minsize = 1,
+        maxsize = 1,
+        -- The particles' properties are random values between the min and max
+        -- values.
+        -- pos, velocity, acceleration, expirationtime, size
+
+        collisiondetection = false,
+        -- If true collide with `walkable` nodes and, depending on the
+        -- `object_collision` field, objects too.
+
+        collision_removal = false,
+        -- If true particles are removed when they collide.
+        -- Requires collisiondetection = true to have any effect.
+
+        object_collision = false,
+        -- If true particles collide with objects that are defined as
+        -- `physical = true,` and `collide_with_objects = true,`.
+        -- Requires collisiondetection = true to have any effect.
+
+        attached = ObjectRef,
+        -- If defined, particle positions, velocities and accelerations are
+        -- relative to this object's position and yaw
+
+        vertical = false,
+        -- If true face player using y axis only
+
+        texture = "image.png",
+
+        playername = "singleplayer",
+        -- Optional, if specified spawns particles only on the player's client
+
+        animation = {Tile Animation definition},
+        -- Optional, specifies how to animate the particles' texture
+
+        glow = 0
+        -- Optional, specify particle self-luminescence in darkness.
+        -- Values 0-14.
+    }
+
+`HTTPRequest` definition
+------------------------
+
+Used by `HTTPApiTable.fetch` and `HTTPApiTable.fetch_async`.
+
+    {
+        url = "http://example.org",
+
+        timeout = 10,
+        -- Timeout for connection in seconds. Default is 3 seconds.
+
+        post_data = "Raw POST request data string" OR {field1 = "data1", field2 = "data2"},
+        -- Optional, if specified a POST request with post_data is performed.
+        -- Accepts both a string and a table. If a table is specified, encodes
+        -- table as x-www-form-urlencoded key-value pairs.
+        -- If post_data is not specified, a GET request is performed instead.
+
+        user_agent = "ExampleUserAgent",
+        -- Optional, if specified replaces the default minetest user agent with
+        -- given string
+
+        extra_headers = { "Accept-Language: en-us", "Accept-Charset: utf-8" },
+        -- Optional, if specified adds additional headers to the HTTP request.
+        -- You must make sure that the header strings follow HTTP specification
+        -- ("Key: Value").
+
+        multipart = boolean
+        -- Optional, if true performs a multipart HTTP request.
+        -- Default is false.
+    }
+
+`HTTPRequestResult` definition
+------------------------------
+
+Passed to `HTTPApiTable.fetch` callback. Returned by
+`HTTPApiTable.fetch_async_get`.
+
+    {
+        completed = true,
+        -- If true, the request has finished (either succeeded, failed or timed
+        -- out)
+
+        succeeded = true,
+        -- If true, the request was successful
+
+        timeout = false,
+        -- If true, the request timed out
+
+        code = 200,
+        -- HTTP status code
+
+        data = "response"
+    }
+
+Authentication handler definition
+---------------------------------
+
+Used by `minetest.register_authentication_handler`.
+
+    {
+        get_auth = function(name),
+        -- Get authentication data for existing player `name` (`nil` if player
+        -- doesn't exist).
+        -- Returns following structure:
+        -- `{password=<string>, privileges=<table>, last_login=<number or nil>}`
+
+        create_auth = function(name, password),
+        -- Create new auth data for player `name`.
+        -- Note that `password` is not plain-text but an arbitrary
+        -- representation decided by the engine.
+
+        delete_auth = function(name),
+        -- Delete auth data of player `name`.
+        -- Returns boolean indicating success (false if player is nonexistent).
+
+        set_password = function(name, password),
+        -- Set password of player `name` to `password`.
+        -- Auth data should be created if not present.
+
+        set_privileges = function(name, privileges),
+        -- Set privileges of player `name`.
+        -- `privileges` is in table form, auth data should be created if not
+        -- present.
+
+        reload = function(),
+        -- Reload authentication data from the storage location.
+        -- Returns boolean indicating success.
+
+        record_login = function(name),
+        -- Called when player joins, used for keeping track of last_login
+
+        iterate = function(),
+        -- Returns an iterator (use with `for` loops) for all player names
+        -- currently in the auth database
+    }
diff --git a/doc/lua_api.txt b/doc/lua_api.txt
deleted file mode 100644 (file)
index 86e8d65..0000000
+++ /dev/null
@@ -1,7828 +0,0 @@
-Minetest Lua Modding API Reference
-==================================
-
-* More information at <http://www.minetest.net/>
-* Developer Wiki: <http://dev.minetest.net/>
-* (Unofficial) Minetest Modding Book by rubenwardy: <https://rubenwardy.com/minetest_modding_book/>
-
-Introduction
-------------
-
-Content and functionality can be added to Minetest using Lua scripting
-in run-time loaded mods.
-
-A mod is a self-contained bunch of scripts, textures and other related
-things, which is loaded by and interfaces with Minetest.
-
-Mods are contained and ran solely on the server side. Definitions and media
-files are automatically transferred to the client.
-
-If you see a deficiency in the API, feel free to attempt to add the
-functionality in the engine and API, and to document it here.
-
-Programming in Lua
-------------------
-
-If you have any difficulty in understanding this, please read
-[Programming in Lua](http://www.lua.org/pil/).
-
-Startup
--------
-
-Mods are loaded during server startup from the mod load paths by running
-the `init.lua` scripts in a shared environment.
-
-Paths
------
-
-* `RUN_IN_PLACE=1` (Windows release, local build)
-    * `$path_user`: `<build directory>`
-    * `$path_share`: `<build directory>`
-* `RUN_IN_PLACE=0`: (Linux release)
-    * `$path_share`:
-        * Linux: `/usr/share/minetest`
-        * Windows: `<install directory>/minetest-0.4.x`
-    * `$path_user`:
-        * Linux: `$HOME/.minetest`
-        * Windows: `C:/users/<user>/AppData/minetest` (maybe)
-
-
-
-
-Games
-=====
-
-Games are looked up from:
-
-* `$path_share/games/<gameid>/`
-* `$path_user/games/<gameid>/`
-
-Where `<gameid>` is unique to each game.
-
-The game directory can contain the following files:
-
-* `game.conf`, with the following keys:
-    * `name`: Required, human readable name  e.g. `name = Minetest`
-    * `description`: Short description to be shown in the content tab
-    * `disallowed_mapgens = <comma-separated mapgens>`
-      e.g. `disallowed_mapgens = v5,v6,flat`
-      These mapgens are removed from the list of mapgens for the game.
-* `minetest.conf`:
-  Used to set default settings when running this game.
-* `settingtypes.txt`:
-  In the same format as the one in builtin.
-  This settingtypes.txt will be parsed by the menu and the settings will be
-  displayed in the "Games" category in the advanced settings tab.
-* If the game contains a folder called `textures` the server will load it as a
-  texturepack, overriding mod textures.
-  Any server texturepack will override mod textures and the game texturepack.
-
-Menu images
------------
-
-Games can provide custom main menu images. They are put inside a `menu`
-directory inside the game directory.
-
-The images are named `$identifier.png`, where `$identifier` is one of
-`overlay`, `background`, `footer`, `header`.
-If you want to specify multiple images for one identifier, add additional
-images named like `$identifier.$n.png`, with an ascending number $n starting
-with 1, and a random image will be chosen from the provided ones.
-
-
-
-
-Mods
-====
-
-Mod load path
--------------
-
-Paths are relative to the directories listed in the [Paths] section above.
-
-* `games/<gameid>/mods/`
-* `mods/`
-* `worlds/<worldname>/worldmods/`
-
-World-specific games
---------------------
-
-It is possible to include a game in a world; in this case, no mods or
-games are loaded or checked from anywhere else.
-
-This is useful for e.g. adventure worlds and happens if the `<worldname>/game/`
-directory exists.
-
-Mods should then be placed in `<worldname>/game/mods/`.
-
-Modpacks
---------
-
-Mods can be put in a subdirectory, if the parent directory, which otherwise
-should be a mod, contains a file named `modpack.conf`.
-The file is a key-value store of modpack details.
-
-* `name`: The modpack name.
-* `description`: Description of mod to be shown in the Mods tab of the main
-                 menu.
-
-Note: to support 0.4.x, please also create an empty modpack.txt file.
-
-Mod directory structure
------------------------
-
-    mods
-    ├── modname
-    │   ├── mod.conf
-    │   ├── screenshot.png
-    │   ├── settingtypes.txt
-    │   ├── init.lua
-    │   ├── models
-    │   ├── textures
-    │   │   ├── modname_stuff.png
-    │   │   └── modname_something_else.png
-    │   ├── sounds
-    │   ├── media
-    │   ├── locale
-    │   └── <custom data>
-    └── another
-
-### modname
-
-The location of this directory can be fetched by using
-`minetest.get_modpath(modname)`.
-
-### mod.conf
-
-A `Settings` file that provides meta information about the mod.
-
-* `name`: The mod name. Allows Minetest to determine the mod name even if the
-          folder is wrongly named.
-* `description`: Description of mod to be shown in the Mods tab of the main
-                 menu.
-* `depends`: A comma separated list of dependencies. These are mods that must be
-             loaded before this mod.
-* `optional_depends`: A comma separated list of optional dependencies.
-                      Like a dependency, but no error if the mod doesn't exist.
-
-Note: to support 0.4.x, please also provide depends.txt.
-
-### `screenshot.png`
-
-A screenshot shown in the mod manager within the main menu. It should
-have an aspect ratio of 3:2 and a minimum size of 300×200 pixels.
-
-### `depends.txt`
-
-**Deprecated:** you should use mod.conf instead.
-
-This file is used if there are no dependencies in mod.conf.
-
-List of mods that have to be loaded before loading this mod.
-
-A single line contains a single modname.
-
-Optional dependencies can be defined by appending a question mark
-to a single modname. This means that if the specified mod
-is missing, it does not prevent this mod from being loaded.
-
-### `description.txt`
-
-**Deprecated:** you should use mod.conf instead.
-
-This file is used if there is no description in mod.conf.
-
-A file containing a description to be shown in the Mods tab of the main menu.
-
-### `settingtypes.txt`
-
-The format is documented in `builtin/settingtypes.txt`.
-It is parsed by the main menu settings dialogue to list mod-specific
-settings in the "Mods" category.
-
-### `init.lua`
-
-The main Lua script. Running this script should register everything it
-wants to register. Subsequent execution depends on minetest calling the
-registered callbacks.
-
-`minetest.settings` can be used to read custom or existing settings at load
-time, if necessary. (See [`Settings`])
-
-### `models`
-
-Models for entities or meshnodes.
-
-### `textures`, `sounds`, `media`
-
-Media files (textures, sounds, whatever) that will be transferred to the
-client and will be available for use by the mod.
-
-### `locale`
-
-Translation files for the clients. (See [Translations])
-
-Naming conventions
-------------------
-
-Registered names should generally be in this format:
-
-    modname:<whatever>
-
-`<whatever>` can have these characters:
-
-    a-zA-Z0-9_
-
-This is to prevent conflicting names from corrupting maps and is
-enforced by the mod loader.
-
-Registered names can be overridden by prefixing the name with `:`. This can
-be used for overriding the registrations of some other mod.
-
-The `:` prefix can also be used for maintaining backwards compatibility.
-
-### Example
-
-In the mod `experimental`, there is the ideal item/node/entity name `tnt`.
-So the name should be `experimental:tnt`.
-
-Any mod can redefine `experimental:tnt` by using the name
-
-    :experimental:tnt
-
-when registering it. That mod is required to have `experimental` as a
-dependency.
-
-
-
-
-Aliases
-=======
-
-Aliases of itemnames can be added by using
-`minetest.register_alias(alias, original_name)` or
-`minetest.register_alias_force(alias, original_name)`.
-
-This adds an alias `alias` for the item called `original_name`.
-From now on, you can use `alias` to refer to the item `original_name`.
-
-The only difference between `minetest.register_alias` and
-`minetest.register_alias_force` is that if an item named `alias` already exists,
-`minetest.register_alias` will do nothing while
-`minetest.register_alias_force` will unregister it.
-
-This can be used for maintaining backwards compatibility.
-
-This can also set quick access names for things, e.g. if
-you have an item called `epiclylongmodname:stuff`, you could do
-
-    minetest.register_alias("stuff", "epiclylongmodname:stuff")
-
-and be able to use `/giveme stuff`.
-
-Mapgen aliases
---------------
-
-In a game, a certain number of these must be set to tell core mapgens which
-of the game's nodes are to be used for core mapgen generation. For example:
-
-    minetest.register_alias("mapgen_stone", "default:stone")
-
-### Aliases for non-V6 mapgens
-
-#### Essential aliases
-
-* mapgen_stone
-* mapgen_water_source
-* mapgen_river_water_source
-
-`mapgen_river_water_source` is required for mapgens with sloping rivers where
-it is necessary to have a river liquid node with a short `liquid_range` and
-`liquid_renewable = false` to avoid flooding.
-
-#### Optional aliases
-
-* mapgen_lava_source
-
-Fallback lava node used if cave liquids are not defined in biome definitions.
-Deprecated for non-V6 mapgens, define cave liquids in biome definitions instead.
-
-* mapgen_cobble
-
-Fallback node used if dungeon nodes are not defined in biome definitions.
-Deprecated for non-V6 mapgens, define dungeon nodes in biome definitions instead.
-
-### Aliases needed for Mapgen V6
-
-* mapgen_stone
-* mapgen_water_source
-* mapgen_lava_source
-* mapgen_dirt
-* mapgen_dirt_with_grass
-* mapgen_sand
-* mapgen_gravel
-* mapgen_desert_stone
-* mapgen_desert_sand
-* mapgen_dirt_with_snow
-* mapgen_snowblock
-* mapgen_snow
-* mapgen_ice
-
-* mapgen_tree
-* mapgen_leaves
-* mapgen_apple
-* mapgen_jungletree
-* mapgen_jungleleaves
-* mapgen_junglegrass
-* mapgen_pine_tree
-* mapgen_pine_needles
-
-* mapgen_cobble
-* mapgen_stair_cobble
-* mapgen_mossycobble
-* mapgen_stair_desert_stone
-
-### Setting the node used in Mapgen Singlenode
-
-By default the world is filled with air nodes. To set a different node use, for
-example:
-
-    minetest.register_alias("mapgen_singlenode", "default:stone")
-
-
-
-
-Textures
-========
-
-Mods should generally prefix their textures with `modname_`, e.g. given
-the mod name `foomod`, a texture could be called:
-
-    foomod_foothing.png
-
-Textures are referred to by their complete name, or alternatively by
-stripping out the file extension:
-
-* e.g. `foomod_foothing.png`
-* e.g. `foomod_foothing`
-
-Texture modifiers
------------------
-
-There are various texture modifiers that can be used
-to generate textures on-the-fly.
-
-### Texture overlaying
-
-Textures can be overlaid by putting a `^` between them.
-
-Example:
-
-    default_dirt.png^default_grass_side.png
-
-`default_grass_side.png` is overlaid over `default_dirt.png`.
-The texture with the lower resolution will be automatically upscaled to
-the higher resolution texture.
-
-### Texture grouping
-
-Textures can be grouped together by enclosing them in `(` and `)`.
-
-Example: `cobble.png^(thing1.png^thing2.png)`
-
-A texture for `thing1.png^thing2.png` is created and the resulting
-texture is overlaid on top of `cobble.png`.
-
-### Escaping
-
-Modifiers that accept texture names (e.g. `[combine`) accept escaping to allow
-passing complex texture names as arguments. Escaping is done with backslash and
-is required for `^` and `:`.
-
-Example: `cobble.png^[lowpart:50:color.png\^[mask\:trans.png`
-
-The lower 50 percent of `color.png^[mask:trans.png` are overlaid
-on top of `cobble.png`.
-
-### Advanced texture modifiers
-
-#### Crack
-
-* `[crack:<n>:<p>`
-* `[cracko:<n>:<p>`
-* `[crack:<t>:<n>:<p>`
-* `[cracko:<t>:<n>:<p>`
-
-Parameters:
-
-* `<t>`: tile count (in each direction)
-* `<n>`: animation frame count
-* `<p>`: current animation frame
-
-Draw a step of the crack animation on the texture.
-`crack` draws it normally, while `cracko` lays it over, keeping transparent
-pixels intact.
-
-Example:
-
-    default_cobble.png^[crack:10:1
-
-#### `[combine:<w>x<h>:<x1>,<y1>=<file1>:<x2>,<y2>=<file2>:...`
-
-* `<w>`: width
-* `<h>`: height
-* `<x>`: x position
-* `<y>`: y position
-* `<file>`: texture to combine
-
-Creates a texture of size `<w>` times `<h>` and blits the listed files to their
-specified coordinates.
-
-Example:
-
-    [combine:16x32:0,0=default_cobble.png:0,16=default_wood.png
-
-#### `[resize:<w>x<h>`
-
-Resizes the texture to the given dimensions.
-
-Example:
-
-    default_sandstone.png^[resize:16x16
-
-#### `[opacity:<r>`
-
-Makes the base image transparent according to the given ratio.
-
-`r` must be between 0 (transparent) and 255 (opaque).
-
-Example:
-
-    default_sandstone.png^[opacity:127
-
-#### `[invert:<mode>`
-
-Inverts the given channels of the base image.
-Mode may contain the characters "r", "g", "b", "a".
-Only the channels that are mentioned in the mode string will be inverted.
-
-Example:
-
-    default_apple.png^[invert:rgb
-
-#### `[brighten`
-
-Brightens the texture.
-
-Example:
-
-    tnt_tnt_side.png^[brighten
-
-#### `[noalpha`
-
-Makes the texture completely opaque.
-
-Example:
-
-    default_leaves.png^[noalpha
-
-#### `[makealpha:<r>,<g>,<b>`
-
-Convert one color to transparency.
-
-Example:
-
-    default_cobble.png^[makealpha:128,128,128
-
-#### `[transform<t>`
-
-* `<t>`: transformation(s) to apply
-
-Rotates and/or flips the image.
-
-`<t>` can be a number (between 0 and 7) or a transform name.
-Rotations are counter-clockwise.
-
-    0  I      identity
-    1  R90    rotate by 90 degrees
-    2  R180   rotate by 180 degrees
-    3  R270   rotate by 270 degrees
-    4  FX     flip X
-    5  FXR90  flip X then rotate by 90 degrees
-    6  FY     flip Y
-    7  FYR90  flip Y then rotate by 90 degrees
-
-Example:
-
-    default_stone.png^[transformFXR90
-
-#### `[inventorycube{<top>{<left>{<right>`
-
-Escaping does not apply here and `^` is replaced by `&` in texture names
-instead.
-
-Create an inventory cube texture using the side textures.
-
-Example:
-
-    [inventorycube{grass.png{dirt.png&grass_side.png{dirt.png&grass_side.png
-
-Creates an inventorycube with `grass.png`, `dirt.png^grass_side.png` and
-`dirt.png^grass_side.png` textures
-
-#### `[lowpart:<percent>:<file>`
-
-Blit the lower `<percent>`% part of `<file>` on the texture.
-
-Example:
-
-    base.png^[lowpart:25:overlay.png
-
-#### `[verticalframe:<t>:<n>`
-
-* `<t>`: animation frame count
-* `<n>`: current animation frame
-
-Crops the texture to a frame of a vertical animation.
-
-Example:
-
-    default_torch_animated.png^[verticalframe:16:8
-
-#### `[mask:<file>`
-
-Apply a mask to the base image.
-
-The mask is applied using binary AND.
-
-#### `[sheet:<w>x<h>:<x>,<y>`
-
-Retrieves a tile at position x,y from the base image
-which it assumes to be a tilesheet with dimensions w,h.
-
-#### `[colorize:<color>:<ratio>`
-
-Colorize the textures with the given color.
-`<color>` is specified as a `ColorString`.
-`<ratio>` is an int ranging from 0 to 255 or the word "`alpha`".  If
-it is an int, then it specifies how far to interpolate between the
-colors where 0 is only the texture color and 255 is only `<color>`. If
-omitted, the alpha of `<color>` will be used as the ratio.  If it is
-the word "`alpha`", then each texture pixel will contain the RGB of
-`<color>` and the alpha of `<color>` multiplied by the alpha of the
-texture pixel.
-
-#### `[multiply:<color>`
-
-Multiplies texture colors with the given color.
-`<color>` is specified as a `ColorString`.
-Result is more like what you'd expect if you put a color on top of another
-color, meaning white surfaces get a lot of your new color while black parts
-don't change very much.
-
-Hardware coloring
------------------
-
-The goal of hardware coloring is to simplify the creation of
-colorful nodes. If your textures use the same pattern, and they only
-differ in their color (like colored wool blocks), you can use hardware
-coloring instead of creating and managing many texture files.
-All of these methods use color multiplication (so a white-black texture
-with red coloring will result in red-black color).
-
-### Static coloring
-
-This method is useful if you wish to create nodes/items with
-the same texture, in different colors, each in a new node/item definition.
-
-#### Global color
-
-When you register an item or node, set its `color` field (which accepts a
-`ColorSpec`) to the desired color.
-
-An `ItemStack`'s static color can be overwritten by the `color` metadata
-field. If you set that field to a `ColorString`, that color will be used.
-
-#### Tile color
-
-Each tile may have an individual static color, which overwrites every
-other coloring method. To disable the coloring of a face,
-set its color to white (because multiplying with white does nothing).
-You can set the `color` property of the tiles in the node's definition
-if the tile is in table format.
-
-### Palettes
-
-For nodes and items which can have many colors, a palette is more
-suitable. A palette is a texture, which can contain up to 256 pixels.
-Each pixel is one possible color for the node/item.
-You can register one node/item, which can have up to 256 colors.
-
-#### Palette indexing
-
-When using palettes, you always provide a pixel index for the given
-node or `ItemStack`. The palette is read from left to right and from
-top to bottom. If the palette has less than 256 pixels, then it is
-stretched to contain exactly 256 pixels (after arranging the pixels
-to one line). The indexing starts from 0.
-
-Examples:
-
-* 16x16 palette, index = 0: the top left corner
-* 16x16 palette, index = 4: the fifth pixel in the first row
-* 16x16 palette, index = 16: the pixel below the top left corner
-* 16x16 palette, index = 255: the bottom right corner
-* 2 (width) x 4 (height) palette, index = 31: the top left corner.
-  The palette has 8 pixels, so each pixel is stretched to 32 pixels,
-  to ensure the total 256 pixels.
-* 2x4 palette, index = 32: the top right corner
-* 2x4 palette, index = 63: the top right corner
-* 2x4 palette, index = 64: the pixel below the top left corner
-
-#### Using palettes with items
-
-When registering an item, set the item definition's `palette` field to
-a texture. You can also use texture modifiers.
-
-The `ItemStack`'s color depends on the `palette_index` field of the
-stack's metadata. `palette_index` is an integer, which specifies the
-index of the pixel to use.
-
-#### Linking palettes with nodes
-
-When registering a node, set the item definition's `palette` field to
-a texture. You can also use texture modifiers.
-The node's color depends on its `param2`, so you also must set an
-appropriate `paramtype2`:
-
-* `paramtype2 = "color"` for nodes which use their full `param2` for
-  palette indexing. These nodes can have 256 different colors.
-  The palette should contain 256 pixels.
-* `paramtype2 = "colorwallmounted"` for nodes which use the first
-  five bits (most significant) of `param2` for palette indexing.
-  The remaining three bits are describing rotation, as in `wallmounted`
-  paramtype2. Division by 8 yields the palette index (without stretching the
-  palette). These nodes can have 32 different colors, and the palette
-  should contain 32 pixels.
-  Examples:
-    * `param2 = 17` is 2 * 8 + 1, so the rotation is 1 and the third (= 2 + 1)
-      pixel will be picked from the palette.
-    * `param2 = 35` is 4 * 8 + 3, so the rotation is 3 and the fifth (= 4 + 1)
-      pixel will be picked from the palette.
-* `paramtype2 = "colorfacedir"` for nodes which use the first
-  three bits of `param2` for palette indexing. The remaining
-  five bits are describing rotation, as in `facedir` paramtype2.
-  Division by 32 yields the palette index (without stretching the
-  palette). These nodes can have 8 different colors, and the
-  palette should contain 8 pixels.
-  Examples:
-    * `param2 = 17` is 0 * 32 + 17, so the rotation is 17 and the
-      first (= 0 + 1) pixel will be picked from the palette.
-    * `param2 = 35` is 1 * 32 + 3, so the rotation is 3 and the
-      second (= 1 + 1) pixel will be picked from the palette.
-
-To colorize a node on the map, set its `param2` value (according
-to the node's paramtype2).
-
-### Conversion between nodes in the inventory and on the map
-
-Static coloring is the same for both cases, there is no need
-for conversion.
-
-If the `ItemStack`'s metadata contains the `color` field, it will be
-lost on placement, because nodes on the map can only use palettes.
-
-If the `ItemStack`'s metadata contains the `palette_index` field, it is
-automatically transferred between node and item forms by the engine,
-when a player digs or places a colored node.
-You can disable this feature by setting the `drop` field of the node
-to itself (without metadata).
-To transfer the color to a special drop, you need a drop table.
-
-Example:
-
-    minetest.register_node("mod:stone", {
-        description = "Stone",
-        tiles = {"default_stone.png"},
-        paramtype2 = "color",
-        palette = "palette.png",
-        drop = {
-            items = {
-                -- assume that mod:cobblestone also has the same palette
-                {items = {"mod:cobblestone"}, inherit_color = true },
-            }
-        }
-    })
-
-### Colored items in craft recipes
-
-Craft recipes only support item strings, but fortunately item strings
-can also contain metadata. Example craft recipe registration:
-
-    minetest.register_craft({
-        output = minetest.itemstring_with_palette("wool:block", 3),
-        type = "shapeless",
-        recipe = {
-            "wool:block",
-            "dye:red",
-        },
-    })
-
-To set the `color` field, you can use `minetest.itemstring_with_color`.
-
-Metadata field filtering in the `recipe` field are not supported yet,
-so the craft output is independent of the color of the ingredients.
-
-Soft texture overlay
---------------------
-
-Sometimes hardware coloring is not enough, because it affects the
-whole tile. Soft texture overlays were added to Minetest to allow
-the dynamic coloring of only specific parts of the node's texture.
-For example a grass block may have colored grass, while keeping the
-dirt brown.
-
-These overlays are 'soft', because unlike texture modifiers, the layers
-are not merged in the memory, but they are simply drawn on top of each
-other. This allows different hardware coloring, but also means that
-tiles with overlays are drawn slower. Using too much overlays might
-cause FPS loss.
-
-For inventory and wield images you can specify overlays which
-hardware coloring does not modify. You have to set `inventory_overlay`
-and `wield_overlay` fields to an image name.
-
-To define a node overlay, simply set the `overlay_tiles` field of the node
-definition. These tiles are defined in the same way as plain tiles:
-they can have a texture name, color etc.
-To skip one face, set that overlay tile to an empty string.
-
-Example (colored grass block):
-
-    minetest.register_node("default:dirt_with_grass", {
-        description = "Dirt with Grass",
-        -- Regular tiles, as usual
-        -- The dirt tile disables palette coloring
-        tiles = {{name = "default_grass.png"},
-            {name = "default_dirt.png", color = "white"}},
-        -- Overlay tiles: define them in the same style
-        -- The top and bottom tile does not have overlay
-        overlay_tiles = {"", "",
-            {name = "default_grass_side.png", tileable_vertical = false}},
-        -- Global color, used in inventory
-        color = "green",
-        -- Palette in the world
-        paramtype2 = "color",
-        palette = "default_foilage.png",
-    })
-
-
-
-
-Sounds
-======
-
-Only Ogg Vorbis files are supported.
-
-For positional playing of sounds, only single-channel (mono) files are
-supported. Otherwise OpenAL will play them non-positionally.
-
-Mods should generally prefix their sounds with `modname_`, e.g. given
-the mod name "`foomod`", a sound could be called:
-
-    foomod_foosound.ogg
-
-Sounds are referred to by their name with a dot, a single digit and the
-file extension stripped out. When a sound is played, the actual sound file
-is chosen randomly from the matching sounds.
-
-When playing the sound `foomod_foosound`, the sound is chosen randomly
-from the available ones of the following files:
-
-* `foomod_foosound.ogg`
-* `foomod_foosound.0.ogg`
-* `foomod_foosound.1.ogg`
-* (...)
-* `foomod_foosound.9.ogg`
-
-Examples of sound parameter tables:
-
-    -- Play locationless on all clients
-    {
-        gain = 1.0,   -- default
-        fade = 0.0,   -- default, change to a value > 0 to fade the sound in
-        pitch = 1.0,  -- default
-    }
-    -- Play locationless to one player
-    {
-        to_player = name,
-        gain = 1.0,   -- default
-        fade = 0.0,   -- default, change to a value > 0 to fade the sound in
-        pitch = 1.0,  -- default
-    }
-    -- Play locationless to one player, looped
-    {
-        to_player = name,
-        gain = 1.0,  -- default
-        loop = true,
-    }
-    -- Play at a location
-    {
-        pos = {x = 1, y = 2, z = 3},
-        gain = 1.0,  -- default
-        max_hear_distance = 32,  -- default, uses an euclidean metric
-    }
-    -- Play connected to an object, looped
-    {
-        object = <an ObjectRef>,
-        gain = 1.0,  -- default
-        max_hear_distance = 32,  -- default, uses an euclidean metric
-        loop = true,
-    }
-    -- Play at a location, heard by anyone *but* the given player
-    {
-        pos = {x = 32, y = 0, z = 100},
-        max_hear_distance = 40,
-        exclude_player = name,
-    }
-
-Looped sounds must either be connected to an object or played locationless to
-one player using `to_player = name`.
-
-A positional sound will only be heard by players that are within
-`max_hear_distance` of the sound position, at the start of the sound.
-
-`exclude_player = name` can be applied to locationless, positional and object-
-bound sounds to exclude a single player from hearing them.
-
-`SimpleSoundSpec`
------------------
-
-Specifies a sound name, gain (=volume) and pitch.
-This is either a string or a table.
-
-In string form, you just specify the sound name or
-the empty string for no sound.
-
-Table form has the following fields:
-
-* `name`: Sound name
-* `gain`: Volume (`1.0` = 100%)
-* `pitch`: Pitch (`1.0` = 100%)
-
-`gain` and `pitch` are optional and default to `1.0`.
-
-Examples:
-
-* `""`: No sound
-* `{}`: No sound
-* `"default_place_node"`: Play e.g. `default_place_node.ogg`
-* `{name = "default_place_node"}`: Same as above
-* `{name = "default_place_node", gain = 0.5}`: 50% volume
-* `{name = "default_place_node", gain = 0.9, pitch = 1.1}`: 90% volume, 110% pitch
-
-Special sound files
--------------------
-
-These sound files are played back by the engine if provided.
-
- * `player_damage`: Played when the local player takes damage (gain = 0.5)
- * `player_falling_damage`: Played when the local player takes
-   damage by falling (gain = 0.5)
- * `default_dig_<groupname>`: Default node digging sound
-   (see node sound definition for details)
-
-Registered definitions
-======================
-
-Anything added using certain [Registration functions] gets added to one or more
-of the global [Registered definition tables].
-
-Note that in some cases you will stumble upon things that are not contained
-in these tables (e.g. when a mod has been removed). Always check for
-existence before trying to access the fields.
-
-Example:
-
-All nodes register with `minetest.register_node` get added to the table
-`minetest.registered_nodes`.
-
-If you want to check the drawtype of a node, you could do:
-
-    local function get_nodedef_field(nodename, fieldname)
-        if not minetest.registered_nodes[nodename] then
-            return nil
-        end
-        return minetest.registered_nodes[nodename][fieldname]
-    end
-    local drawtype = get_nodedef_field(nodename, "drawtype")
-
-
-
-
-Nodes
-=====
-
-Nodes are the bulk data of the world: cubes and other things that take the
-space of a cube. Huge amounts of them are handled efficiently, but they
-are quite static.
-
-The definition of a node is stored and can be accessed by using
-
-    minetest.registered_nodes[node.name]
-
-See [Registered definitions].
-
-Nodes are passed by value between Lua and the engine.
-They are represented by a table:
-
-    {name="name", param1=num, param2=num}
-
-`param1` and `param2` are 8-bit integers ranging from 0 to 255. The engine uses
-them for certain automated functions. If you don't use these functions, you can
-use them to store arbitrary values.
-
-Node paramtypes
----------------
-
-The functions of `param1` and `param2` are determined by certain fields in the
-node definition.
-
-The function of `param1` is determined by `paramtype` in node definition.
-`param1` is reserved for the engine when `paramtype != "none"`.
-
-* `paramtype = "light"`
-    * The value stores light with and without sun in its upper and lower 4 bits
-      respectively.
-    * Required by a light source node to enable spreading its light.
-    * Required by the following drawtypes as they determine their visual
-      brightness from their internal light value:
-        * torchlike
-        * signlike
-        * firelike
-        * fencelike
-        * raillike
-        * nodebox
-        * mesh
-        * plantlike
-        * plantlike_rooted
-* `paramtype = "none"`
-    * `param1` will not be used by the engine and can be used to store
-      an arbitrary value
-
-The function of `param2` is determined by `paramtype2` in node definition.
-`param2` is reserved for the engine when `paramtype2 != "none"`.
-
-* `paramtype2 = "flowingliquid"`
-    * Used by `drawtype = "flowingliquid"` and `liquidtype = "flowing"`
-    * The liquid level and a flag of the liquid are stored in `param2`
-    * Bits 0-2: Liquid level (0-7). The higher, the more liquid is in this node
-    * Bit 3: If set, liquid is flowing downwards (no graphical effect)
-* `paramtype2 = "wallmounted"`
-    * Supported drawtypes: "torchlike", "signlike", "normal", "nodebox", "mesh"
-    * The rotation of the node is stored in `param2`
-    * You can make this value by using `minetest.dir_to_wallmounted()`
-    * Values range 0 - 5
-    * The value denotes at which direction the node is "mounted":
-      0 = y+,   1 = y-,   2 = x+,   3 = x-,   4 = z+,   5 = z-
-* `paramtype2 = "facedir"`
-    * Supported drawtypes: "normal", "nodebox", "mesh"
-    * The rotation of the node is stored in `param2`. Furnaces and chests are
-      rotated this way. Can be made by using `minetest.dir_to_facedir()`.
-    * Values range 0 - 23
-    * facedir / 4 = axis direction:
-      0 = y+,   1 = z+,   2 = z-,   3 = x+,   4 = x-,   5 = y-
-    * facedir modulo 4 = rotation around that axis
-* `paramtype2 = "leveled"`
-    * Only valid for "nodebox" with 'type = "leveled"', and "plantlike_rooted".
-        * Leveled nodebox:
-            * The level of the top face of the nodebox is stored in `param2`.
-            * The other faces are defined by 'fixed = {}' like 'type = "fixed"'
-              nodeboxes.
-            * The nodebox height is (`param2` / 64) nodes.
-            * The maximum accepted value of `param2` is 127.
-        * Rooted plantlike:
-            * The height of the 'plantlike' section is stored in `param2`.
-            * The height is (`param2` / 16) nodes.
-* `paramtype2 = "degrotate"`
-    * Only valid for "plantlike" drawtype. The rotation of the node is stored in
-      `param2`.
-    * Values range 0 - 179. The value stored in `param2` is multiplied by two to
-      get the actual rotation in degrees of the node.
-* `paramtype2 = "meshoptions"`
-    * Only valid for "plantlike" drawtype. The value of `param2` becomes a
-      bitfield which can be used to change how the client draws plantlike nodes.
-    * Bits 0, 1 and 2 form a mesh selector.
-      Currently the following meshes are choosable:
-        * 0 = a "x" shaped plant (ordinary plant)
-        * 1 = a "+" shaped plant (just rotated 45 degrees)
-        * 2 = a "*" shaped plant with 3 faces instead of 2
-        * 3 = a "#" shaped plant with 4 faces instead of 2
-        * 4 = a "#" shaped plant with 4 faces that lean outwards
-        * 5-7 are unused and reserved for future meshes.
-    * Bits 3 through 7 are optional flags that can be combined and give these
-      effects:
-        * bit 3 (0x08) - Makes the plant slightly vary placement horizontally
-        * bit 4 (0x10) - Makes the plant mesh 1.4x larger
-        * bit 5 (0x20) - Moves each face randomly a small bit down (1/8 max)
-        * bits 6-7 are reserved for future use.
-* `paramtype2 = "color"`
-    * `param2` tells which color is picked from the palette.
-      The palette should have 256 pixels.
-* `paramtype2 = "colorfacedir"`
-    * Same as `facedir`, but with colors.
-    * The first three bits of `param2` tells which color is picked from the
-      palette. The palette should have 8 pixels.
-* `paramtype2 = "colorwallmounted"`
-    * Same as `wallmounted`, but with colors.
-    * The first five bits of `param2` tells which color is picked from the
-      palette. The palette should have 32 pixels.
-* `paramtype2 = "glasslikeliquidlevel"`
-    * Only valid for "glasslike_framed" or "glasslike_framed_optional"
-      drawtypes.
-    * `param2` values 0-63 define 64 levels of internal liquid, 0 being empty
-      and 63 being full.
-    * Liquid texture is defined using `special_tiles = {"modname_tilename.png"}`
-* `paramtype2 = "none"`
-    * `param2` will not be used by the engine and can be used to store
-      an arbitrary value
-
-Nodes can also contain extra data. See [Node Metadata].
-
-Node drawtypes
---------------
-
-There are a bunch of different looking node types.
-
-Look for examples in `games/minimal` or `games/minetest_game`.
-
-* `normal`
-    * A node-sized cube.
-* `airlike`
-    * Invisible, uses no texture.
-* `liquid`
-    * The cubic source node for a liquid.
-* `flowingliquid`
-    * The flowing version of a liquid, appears with various heights and slopes.
-* `glasslike`
-    * Often used for partially-transparent nodes.
-    * Only external sides of textures are visible.
-* `glasslike_framed`
-    * All face-connected nodes are drawn as one volume within a surrounding
-      frame.
-    * The frame appearance is generated from the edges of the first texture
-      specified in `tiles`. The width of the edges used are 1/16th of texture
-      size: 1 pixel for 16x16, 2 pixels for 32x32 etc.
-    * The glass 'shine' (or other desired detail) on each node face is supplied
-      by the second texture specified in `tiles`.
-* `glasslike_framed_optional`
-    * This switches between the above 2 drawtypes according to the menu setting
-      'Connected Glass'.
-* `allfaces`
-    * Often used for partially-transparent nodes.
-    * External and internal sides of textures are visible.
-* `allfaces_optional`
-    * Often used for leaves nodes.
-    * This switches between `normal`, `glasslike` and `allfaces` according to
-      the menu setting: Opaque Leaves / Simple Leaves / Fancy Leaves.
-    * With 'Simple Leaves' selected, the texture specified in `special_tiles`
-      is used instead, if present. This allows a visually thicker texture to be
-      used to compensate for how `glasslike` reduces visual thickness.
-* `torchlike`
-    * A single vertical texture.
-    * If placed on top of a node, uses the first texture specified in `tiles`.
-    * If placed against the underside of a node, uses the second texture
-      specified in `tiles`.
-    * If placed on the side of a node, uses the third texture specified in
-      `tiles` and is perpendicular to that node.
-* `signlike`
-    * A single texture parallel to, and mounted against, the top, underside or
-      side of a node.
-* `plantlike`
-    * Two vertical and diagonal textures at right-angles to each other.
-    * See `paramtype2 = "meshoptions"` above for other options.
-* `firelike`
-    * When above a flat surface, appears as 6 textures, the central 2 as
-      `plantlike` plus 4 more surrounding those.
-    * If not above a surface the central 2 do not appear, but the texture
-      appears against the faces of surrounding nodes if they are present.
-* `fencelike`
-    * A 3D model suitable for a wooden fence.
-    * One placed node appears as a single vertical post.
-    * Adjacently-placed nodes cause horizontal bars to appear between them.
-* `raillike`
-    * Often used for tracks for mining carts.
-    * Requires 4 textures to be specified in `tiles`, in order: Straight,
-      curved, t-junction, crossing.
-    * Each placed node automatically switches to a suitable rotated texture
-      determined by the adjacent `raillike` nodes, in order to create a
-      continuous track network.
-    * Becomes a sloping node if placed against stepped nodes.
-* `nodebox`
-    * Often used for stairs and slabs.
-    * Allows defining nodes consisting of an arbitrary number of boxes.
-    * See [Node boxes] below for more information.
-* `mesh`
-    * Uses models for nodes.
-    * Tiles should hold model materials textures.
-    * Only static meshes are implemented.
-    * For supported model formats see Irrlicht engine documentation.
-* `plantlike_rooted`
-    * Enables underwater `plantlike` without air bubbles around the nodes.
-    * Consists of a base cube at the co-ordinates of the node plus a
-      `plantlike` extension above with a height of `param2 / 16` nodes.
-    * The `plantlike` extension visually passes through any nodes above the
-      base cube without affecting them.
-    * The base cube texture tiles are defined as normal, the `plantlike`
-      extension uses the defined special tile, for example:
-      `special_tiles = {{name = "default_papyrus.png", tileable_vertical = true}},`
-
-`*_optional` drawtypes need less rendering time if deactivated
-(always client-side).
-
-Node boxes
-----------
-
-Node selection boxes are defined using "node boxes".
-
-A nodebox is defined as any of:
-
-    {
-        -- A normal cube; the default in most things
-        type = "regular"
-    }
-    {
-        -- A fixed box (or boxes) (facedir param2 is used, if applicable)
-        type = "fixed",
-        fixed = box OR {box1, box2, ...}
-    }
-    {
-        -- A variable height box (or boxes) with the top face position defined
-        -- by the node parameter 'leveled = ', or if 'paramtype2 == "leveled"'
-        -- by param2.
-        -- Other faces are defined by 'fixed = {}' as with 'type = "fixed"'.
-        type = "leveled",
-        fixed = box OR {box1, box2, ...}
-    }
-    {
-        -- A box like the selection box for torches
-        -- (wallmounted param2 is used, if applicable)
-        type = "wallmounted",
-        wall_top = box,
-        wall_bottom = box,
-        wall_side = box
-    }
-    {
-        -- A node that has optional boxes depending on neighbouring nodes'
-        -- presence and type. See also `connects_to`.
-        type = "connected",
-        fixed = box OR {box1, box2, ...}
-        connect_top = box OR {box1, box2, ...}
-        connect_bottom = box OR {box1, box2, ...}
-        connect_front = box OR {box1, box2, ...}
-        connect_left = box OR {box1, box2, ...}
-        connect_back = box OR {box1, box2, ...}
-        connect_right = box OR {box1, box2, ...}
-        -- The following `disconnected_*` boxes are the opposites of the
-        -- `connect_*` ones above, i.e. when a node has no suitable neighbour
-        -- on the respective side, the corresponding disconnected box is drawn.
-        disconnected_top = box OR {box1, box2, ...}
-        disconnected_bottom = box OR {box1, box2, ...}
-        disconnected_front = box OR {box1, box2, ...}
-        disconnected_left = box OR {box1, box2, ...}
-        disconnected_back = box OR {box1, box2, ...}
-        disconnected_right = box OR {box1, box2, ...}
-        disconnected = box OR {box1, box2, ...} -- when there is *no* neighbour
-        disconnected_sides = box OR {box1, box2, ...} -- when there are *no*
-                                                      -- neighbours to the sides
-    }
-
-A `box` is defined as:
-
-    {x1, y1, z1, x2, y2, z2}
-
-A box of a regular node would look like:
-
-    {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
-
-
-
-
-Map terminology and coordinates
-===============================
-
-Nodes, mapblocks, mapchunks
----------------------------
-
-A 'node' is the fundamental cubic unit of a world and appears to a player as
-roughly 1x1x1 meters in size.
-
-A 'mapblock' (often abbreviated to 'block') is 16x16x16 nodes and is the
-fundamental region of a world that is stored in the world database, sent to
-clients and handled by many parts of the engine.
-'mapblock' is preferred terminology to 'block' to help avoid confusion with
-'node', however 'block' often appears in the API.
-
-A 'mapchunk' (sometimes abbreviated to 'chunk') is usually 5x5x5 mapblocks
-(80x80x80 nodes) and is the volume of world generated in one operation by
-the map generator.
-The size in mapblocks has been chosen to optimise map generation.
-
-Coordinates
------------
-
-### Orientation of axes
-
-For node and mapblock coordinates, +X is East, +Y is up, +Z is North.
-
-### Node coordinates
-
-Almost all positions used in the API use node coordinates.
-
-### Mapblock coordinates
-
-Occasionally the API uses 'blockpos' which refers to mapblock coordinates that
-specify a particular mapblock.
-For example blockpos (0,0,0) specifies the mapblock that extends from
-node position (0,0,0) to node position (15,15,15).
-
-#### Converting node position to the containing blockpos
-
-To calculate the blockpos of the mapblock that contains the node at 'nodepos',
-for each axis:
-
-* blockpos = math.floor(nodepos / 16)
-
-#### Converting blockpos to min/max node positions
-
-To calculate the min/max node positions contained in the mapblock at 'blockpos',
-for each axis:
-
-* Minimum:
-  nodepos = blockpos * 16
-* Maximum:
-  nodepos = blockpos * 16 + 15
-
-
-
-
-HUD
-===
-
-HUD element types
------------------
-
-The position field is used for all element types.
-
-To account for differing resolutions, the position coordinates are the
-percentage of the screen, ranging in value from `0` to `1`.
-
-The name field is not yet used, but should contain a description of what the
-HUD element represents. The direction field is the direction in which something
-is drawn.
-
-`0` draws from left to right, `1` draws from right to left, `2` draws from
-top to bottom, and `3` draws from bottom to top.
-
-The `alignment` field specifies how the item will be aligned. It is a table
-where `x` and `y` range from `-1` to `1`, with `0` being central. `-1` is
-moved to the left/up, and `1` is to the right/down. Fractional values can be
-used.
-
-The `offset` field specifies a pixel offset from the position. Contrary to
-position, the offset is not scaled to screen size. This allows for some
-precisely positioned items in the HUD.
-
-**Note**: `offset` _will_ adapt to screen DPI as well as user defined scaling
-factor!
-
-The `z_index` field specifies the order of HUD elements from back to front.
-Lower z-index elements are displayed behind higher z-index elements. Elements
-with same z-index are displayed in an arbitrary order. Default 0.
-Supports negative values.
-
-Below are the specific uses for fields in each type; fields not listed for that
-type are ignored.
-
-### `image`
-
-Displays an image on the HUD.
-
-* `scale`: The scale of the image, with 1 being the original texture size.
-  Only the X coordinate scale is used (positive values).
-  Negative values represent that percentage of the screen it
-  should take; e.g. `x=-100` means 100% (width).
-* `text`: The name of the texture that is displayed.
-* `alignment`: The alignment of the image.
-* `offset`: offset in pixels from position.
-
-### `text`
-
-Displays text on the HUD.
-
-* `scale`: Defines the bounding rectangle of the text.
-  A value such as `{x=100, y=100}` should work.
-* `text`: The text to be displayed in the HUD element.
-* `number`: An integer containing the RGB value of the color used to draw the
-  text. Specify `0xFFFFFF` for white text, `0xFF0000` for red, and so on.
-* `alignment`: The alignment of the text.
-* `offset`: offset in pixels from position.
-
-### `statbar`
-
-Displays a horizontal bar made up of half-images.
-
-* `text`: The name of the texture that is used.
-* `number`: The number of half-textures that are displayed.
-  If odd, will end with a vertically center-split texture.
-* `direction`
-* `offset`: offset in pixels from position.
-* `size`: If used, will force full-image size to this value (override texture
-  pack image size)
-
-### `inventory`
-
-* `text`: The name of the inventory list to be displayed.
-* `number`: Number of items in the inventory to be displayed.
-* `item`: Position of item that is selected.
-* `direction`
-* `offset`: offset in pixels from position.
-
-### `waypoint`
-
-Displays distance to selected world position.
-
-* `name`: The name of the waypoint.
-* `text`: Distance suffix. Can be blank.
-* `number:` An integer containing the RGB value of the color used to draw the
-  text.
-* `world_pos`: World position of the waypoint.
-
-
-
-
-Representations of simple things
-================================
-
-Position/vector
----------------
-
-    {x=num, y=num, z=num}
-
-For helper functions see [Spatial Vectors].
-
-`pointed_thing`
----------------
-
-* `{type="nothing"}`
-* `{type="node", under=pos, above=pos}`
-    * Indicates a pointed node selection box.
-    * `under` refers to the node position behind the pointed face.
-    * `above` refers to the node position in front of the pointed face.
-* `{type="object", ref=ObjectRef}`
-
-Exact pointing location (currently only `Raycast` supports these fields):
-
-* `pointed_thing.intersection_point`: The absolute world coordinates of the
-  point on the selection box which is pointed at. May be in the selection box
-  if the pointer is in the box too.
-* `pointed_thing.box_id`: The ID of the pointed selection box (counting starts
-  from 1).
-* `pointed_thing.intersection_normal`: Unit vector, points outwards of the
-  selected selection box. This specifies which face is pointed at.
-  Is a null vector `{x = 0, y = 0, z = 0}` when the pointer is inside the
-  selection box.
-
-
-
-
-Flag Specifier Format
-=====================
-
-Flags using the standardized flag specifier format can be specified in either
-of two ways, by string or table.
-
-The string format is a comma-delimited set of flag names; whitespace and
-unrecognized flag fields are ignored. Specifying a flag in the string sets the
-flag, and specifying a flag prefixed by the string `"no"` explicitly
-clears the flag from whatever the default may be.
-
-In addition to the standard string flag format, the schematic flags field can
-also be a table of flag names to boolean values representing whether or not the
-flag is set. Additionally, if a field with the flag name prefixed with `"no"`
-is present, mapped to a boolean of any value, the specified flag is unset.
-
-E.g. A flag field of value
-
-    {place_center_x = true, place_center_y=false, place_center_z=true}
-
-is equivalent to
-
-    {place_center_x = true, noplace_center_y=true, place_center_z=true}
-
-which is equivalent to
-
-    "place_center_x, noplace_center_y, place_center_z"
-
-or even
-
-    "place_center_x, place_center_z"
-
-since, by default, no schematic attributes are set.
-
-
-
-
-Items
-=====
-
-Item types
-----------
-
-There are three kinds of items: nodes, tools and craftitems.
-
-* Node: Can be placed in the world's voxel grid
-* Tool: Has a wear property but cannot be stacked. The default use action is to
-  dig nodes or hit objects according to its tool capabilities.
-* Craftitem: Cannot dig nodes or be placed
-
-Amount and wear
----------------
-
-All item stacks have an amount between 0 and 65535. It is 1 by
-default. Tool item stacks can not have an amount greater than 1.
-
-Tools use a wear (damage) value ranging from 0 to 65535. The
-value 0 is the default and is used for unworn tools. The values
-1 to 65535 are used for worn tools, where a higher value stands for
-a higher wear. Non-tools always have a wear value of 0.
-
-Item formats
-------------
-
-Items and item stacks can exist in three formats: Serializes, table format
-and `ItemStack`.
-
-When an item must be passed to a function, it can usually be in any of
-these formats.
-
-### Serialized
-
-This is called "stackstring" or "itemstring". It is a simple string with
-1-3 components: the full item identifier, an optional amount and an optional
-wear value. Syntax:
-
-    <identifier> [<amount>[ <wear>]]
-
-Examples:
-
-* `'default:apple'`: 1 apple
-* `'default:dirt 5'`: 5 dirt
-* `'default:pick_stone'`: a new stone pickaxe
-* `'default:pick_wood 1 21323'`: a wooden pickaxe, ca. 1/3 worn out
-
-### Table format
-
-Examples:
-
-5 dirt nodes:
-
-    {name="default:dirt", count=5, wear=0, metadata=""}
-
-A wooden pick about 1/3 worn out:
-
-    {name="default:pick_wood", count=1, wear=21323, metadata=""}
-
-An apple:
-
-    {name="default:apple", count=1, wear=0, metadata=""}
-
-### `ItemStack`
-
-A native C++ format with many helper methods. Useful for converting
-between formats. See the [Class reference] section for details.
-
-
-
-
-Groups
-======
-
-In a number of places, there is a group table. Groups define the
-properties of a thing (item, node, armor of entity, capabilities of
-tool) in such a way that the engine and other mods can can interact with
-the thing without actually knowing what the thing is.
-
-Usage
------
-
-Groups are stored in a table, having the group names with keys and the
-group ratings as values. Group ratings are integer values within the
-range [-32767, 32767]. For example:
-
-    -- Default dirt
-    groups = {crumbly=3, soil=1}
-
-    -- A more special dirt-kind of thing
-    groups = {crumbly=2, soil=1, level=2, outerspace=1}
-
-Groups always have a rating associated with them. If there is no
-useful meaning for a rating for an enabled group, it shall be `1`.
-
-When not defined, the rating of a group defaults to `0`. Thus when you
-read groups, you must interpret `nil` and `0` as the same value, `0`.
-
-You can read the rating of a group for an item or a node by using
-
-    minetest.get_item_group(itemname, groupname)
-
-Groups of items
----------------
-
-Groups of items can define what kind of an item it is (e.g. wool).
-
-Groups of nodes
----------------
-
-In addition to the general item things, groups are used to define whether
-a node is destroyable and how long it takes to destroy by a tool.
-
-Groups of entities
-------------------
-
-For entities, groups are, as of now, used only for calculating damage.
-The rating is the percentage of damage caused by tools with this damage group.
-See [Entity damage mechanism].
-
-    object.get_armor_groups() --> a group-rating table (e.g. {fleshy=100})
-    object.set_armor_groups({fleshy=30, cracky=80})
-
-Groups of tools
----------------
-
-Groups in tools define which groups of nodes and entities they are
-effective towards.
-
-Groups in crafting recipes
---------------------------
-
-An example: Make meat soup from any meat, any water and any bowl:
-
-    {
-        output = 'food:meat_soup_raw',
-        recipe = {
-            {'group:meat'},
-            {'group:water'},
-            {'group:bowl'},
-        },
-        -- preserve = {'group:bowl'}, -- Not implemented yet (TODO)
-    }
-
-Another example: Make red wool from white wool and red dye:
-
-    {
-        type = 'shapeless',
-        output = 'wool:red',
-        recipe = {'wool:white', 'group:dye,basecolor_red'},
-    }
-
-Special groups
---------------
-
-The asterisk `(*)` after a group name describes that there is no engine
-functionality bound to it, and implementation is left up as a suggestion
-to games.
-
-### Node, item and tool groups
-
-* `not_in_creative_inventory`: (*) Special group for inventory mods to indicate
-  that the item should be hidden in item lists.
-
-
-### Node-only groups
-
-* `attached_node`: if the node under it is not a walkable block the node will be
-  dropped as an item. If the node is wallmounted the wallmounted direction is
-  checked.
-* `bouncy`: value is bounce speed in percent
-* `connect_to_raillike`: makes nodes of raillike drawtype with same group value
-  connect to each other
-* `dig_immediate`: Player can always pick up node without reducing tool wear
-    * `2`: the node always gets the digging time 0.5 seconds (rail, sign)
-    * `3`: the node always gets the digging time 0 seconds (torch)
-* `disable_jump`: Player (and possibly other things) cannot jump from node
-* `fall_damage_add_percent`: damage speed = `speed * (1 + value/100)`
-* `falling_node`: if there is no walkable block under the node it will fall
-* `float`: the node will not fall through liquids
-* `level`: Can be used to give an additional sense of progression in the game.
-     * A larger level will cause e.g. a weapon of a lower level make much less
-       damage, and get worn out much faster, or not be able to get drops
-       from destroyed nodes.
-     * `0` is something that is directly accessible at the start of gameplay
-     * There is no upper limit
-     * See also: `leveldiff` in [Tools]
-* `slippery`: Players and items will slide on the node.
-  Slipperiness rises steadily with `slippery` value, starting at 1.
-
-
-### Tool-only groups
-
-* `disable_repair`: If set to 1 for a tool, it cannot be repaired using the
-  `"toolrepair"` crafting recipe
-
-
-### `ObjectRef` groups
-
-* `immortal`: Skips all damage and breath handling for an object. This group
-  will also hide the integrated HUD status bars for players, and is
-  automatically set to all players when damage is disabled on the server.
-* `punch_operable`: For entities; disables the regular damage mechanism for
-  players punching it by hand or a non-tool item, so that it can do something
-  else than take damage.
-
-
-
-Known damage and digging time defining groups
----------------------------------------------
-
-* `crumbly`: dirt, sand
-* `cracky`: tough but crackable stuff like stone.
-* `snappy`: something that can be cut using fine tools; e.g. leaves, small
-  plants, wire, sheets of metal
-* `choppy`: something that can be cut using force; e.g. trees, wooden planks
-* `fleshy`: Living things like animals and the player. This could imply
-  some blood effects when hitting.
-* `explody`: Especially prone to explosions
-* `oddly_breakable_by_hand`:
-   Can be added to nodes that shouldn't logically be breakable by the
-   hand but are. Somewhat similar to `dig_immediate`, but times are more
-   like `{[1]=3.50,[2]=2.00,[3]=0.70}` and this does not override the
-   speed of a tool if the tool can dig at a faster speed than this
-   suggests for the hand.
-
-Examples of custom groups
--------------------------
-
-Item groups are often used for defining, well, _groups of items_.
-
-* `meat`: any meat-kind of a thing (rating might define the size or healing
-  ability or be irrelevant -- it is not defined as of yet)
-* `eatable`: anything that can be eaten. Rating might define HP gain in half
-  hearts.
-* `flammable`: can be set on fire. Rating might define the intensity of the
-  fire, affecting e.g. the speed of the spreading of an open fire.
-* `wool`: any wool (any origin, any color)
-* `metal`: any metal
-* `weapon`: any weapon
-* `heavy`: anything considerably heavy
-
-Digging time calculation specifics
-----------------------------------
-
-Groups such as `crumbly`, `cracky` and `snappy` are used for this
-purpose. Rating is `1`, `2` or `3`. A higher rating for such a group implies
-faster digging time.
-
-The `level` group is used to limit the toughness of nodes a tool can dig
-and to scale the digging times / damage to a greater extent.
-
-**Please do understand this**, otherwise you cannot use the system to it's
-full potential.
-
-Tools define their properties by a list of parameters for groups. They
-cannot dig other groups; thus it is important to use a standard bunch of
-groups to enable interaction with tools.
-
-
-
-
-Tools
-=====
-
-Tools definition
-----------------
-
-Tools define:
-
-* Full punch interval
-* Maximum drop level
-* For an arbitrary list of groups:
-    * Uses (until the tool breaks)
-        * Maximum level (usually `0`, `1`, `2` or `3`)
-        * Digging times
-        * Damage groups
-
-### Full punch interval
-
-When used as a weapon, the tool will do full damage if this time is spent
-between punches. If e.g. half the time is spent, the tool will do half
-damage.
-
-### Maximum drop level
-
-Suggests the maximum level of node, when dug with the tool, that will drop
-it's useful item. (e.g. iron ore to drop a lump of iron).
-
-This is not automated; it is the responsibility of the node definition
-to implement this.
-
-### Uses
-
-Determines how many uses the tool has when it is used for digging a node,
-of this group, of the maximum level. For lower leveled nodes, the use count
-is multiplied by `3^leveldiff`.
-`leveldiff` is the difference of the tool's `maxlevel` `groupcaps` and the
-node's `level` group. The node cannot be dug if `leveldiff` is less than zero.
-
-* `uses=10, leveldiff=0`: actual uses: 10
-* `uses=10, leveldiff=1`: actual uses: 30
-* `uses=10, leveldiff=2`: actual uses: 90
-
-### Maximum level
-
-Tells what is the maximum level of a node of this group that the tool will
-be able to dig.
-
-### Digging times
-
-List of digging times for different ratings of the group, for nodes of the
-maximum level.
-
-For example, as a Lua table, `times={2=2.00, 3=0.70}`. This would
-result in the tool to be able to dig nodes that have a rating of `2` or `3`
-for this group, and unable to dig the rating `1`, which is the toughest.
-Unless there is a matching group that enables digging otherwise.
-
-If the result digging time is 0, a delay of 0.15 seconds is added between
-digging nodes; If the player releases LMB after digging, this delay is set to 0,
-i.e. players can more quickly click the nodes away instead of holding LMB.
-
-### Damage groups
-
-List of damage for groups of entities. See [Entity damage mechanism].
-
-Example definition of the capabilities of a tool
-------------------------------------------------
-
-    tool_capabilities = {
-        full_punch_interval=1.5,
-        max_drop_level=1,
-        groupcaps={
-            crumbly={maxlevel=2, uses=20, times={[1]=1.60, [2]=1.20, [3]=0.80}}
-        }
-        damage_groups = {fleshy=2},
-    }
-
-This makes the tool be able to dig nodes that fulfil both of these:
-
-* Have the `crumbly` group
-* Have a `level` group less or equal to `2`
-
-Table of resulting digging times:
-
-    crumbly        0     1     2     3     4  <- level
-         ->  0     -     -     -     -     -
-             1  0.80  1.60  1.60     -     -
-             2  0.60  1.20  1.20     -     -
-             3  0.40  0.80  0.80     -     -
-
-    level diff:    2     1     0    -1    -2
-
-Table of resulting tool uses:
-
-    ->  0     -     -     -     -     -
-        1   180    60    20     -     -
-        2   180    60    20     -     -
-        3   180    60    20     -     -
-
-**Notes**:
-
-* At `crumbly==0`, the node is not diggable.
-* At `crumbly==3`, the level difference digging time divider kicks in and makes
-  easy nodes to be quickly breakable.
-* At `level > 2`, the node is not diggable, because it's `level > maxlevel`
-
-
-
-
-Entity damage mechanism
-=======================
-
-Damage calculation:
-
-    damage = 0
-    foreach group in cap.damage_groups:
-        damage += cap.damage_groups[group]
-            * limit(actual_interval / cap.full_punch_interval, 0.0, 1.0)
-            * (object.armor_groups[group] / 100.0)
-            -- Where object.armor_groups[group] is 0 for inexistent values
-    return damage
-
-Client predicts damage based on damage groups. Because of this, it is able to
-give an immediate response when an entity is damaged or dies; the response is
-pre-defined somehow (e.g. by defining a sprite animation) (not implemented;
-TODO).
-Currently a smoke puff will appear when an entity dies.
-
-The group `immortal` completely disables normal damage.
-
-Entities can define a special armor group, which is `punch_operable`. This
-group disables the regular damage mechanism for players punching it by hand or
-a non-tool item, so that it can do something else than take damage.
-
-On the Lua side, every punch calls:
-
-    entity:on_punch(puncher, time_from_last_punch, tool_capabilities, direction,
-                    damage)
-
-This should never be called directly, because damage is usually not handled by
-the entity itself.
-
-* `puncher` is the object performing the punch. Can be `nil`. Should never be
-  accessed unless absolutely required, to encourage interoperability.
-* `time_from_last_punch` is time from last punch (by `puncher`) or `nil`.
-* `tool_capabilities` can be `nil`.
-* `direction` is a unit vector, pointing from the source of the punch to
-   the punched object.
-* `damage` damage that will be done to entity
-Return value of this function will determine if damage is done by this function
-(retval true) or shall be done by engine (retval false)
-
-To punch an entity/object in Lua, call:
-
-  object:punch(puncher, time_from_last_punch, tool_capabilities, direction)
-
-* Return value is tool wear.
-* Parameters are equal to the above callback.
-* If `direction` equals `nil` and `puncher` does not equal `nil`, `direction`
-  will be automatically filled in based on the location of `puncher`.
-
-
-
-
-Metadata
-========
-
-Node Metadata
--------------
-
-The instance of a node in the world normally only contains the three values
-mentioned in [Nodes]. However, it is possible to insert extra data into a node.
-It is called "node metadata"; See `NodeMetaRef`.
-
-Node metadata contains two things:
-
-* A key-value store
-* An inventory
-
-Some of the values in the key-value store are handled specially:
-
-* `formspec`: Defines a right-click inventory menu. See [Formspec].
-* `infotext`: Text shown on the screen when the node is pointed at
-
-Example:
-
-    local meta = minetest.get_meta(pos)
-    meta:set_string("formspec",
-            "size[8,9]"..
-            "list[context;main;0,0;8,4;]"..
-            "list[current_player;main;0,5;8,4;]")
-    meta:set_string("infotext", "Chest");
-    local inv = meta:get_inventory()
-    inv:set_size("main", 8*4)
-    print(dump(meta:to_table()))
-    meta:from_table({
-        inventory = {
-            main = {[1] = "default:dirt", [2] = "", [3] = "", [4] = "",
-                    [5] = "", [6] = "", [7] = "", [8] = "", [9] = "",
-                    [10] = "", [11] = "", [12] = "", [13] = "",
-                    [14] = "default:cobble", [15] = "", [16] = "", [17] = "",
-                    [18] = "", [19] = "", [20] = "default:cobble", [21] = "",
-                    [22] = "", [23] = "", [24] = "", [25] = "", [26] = "",
-                    [27] = "", [28] = "", [29] = "", [30] = "", [31] = "",
-                    [32] = ""}
-        },
-        fields = {
-            formspec = "size[8,9]list[context;main;0,0;8,4;]list[current_player;main;0,5;8,4;]",
-            infotext = "Chest"
-        }
-    })
-
-Item Metadata
--------------
-
-Item stacks can store metadata too. See [`ItemStackMetaRef`].
-
-Item metadata only contains a key-value store.
-
-Some of the values in the key-value store are handled specially:
-
-* `description`: Set the item stack's description. Defaults to
-  `idef.description`.
-* `color`: A `ColorString`, which sets the stack's color.
-* `palette_index`: If the item has a palette, this is used to get the
-  current color from the palette.
-
-Example:
-
-    local meta = stack:get_meta()
-    meta:set_string("key", "value")
-    print(dump(meta:to_table()))
-
-
-
-
-Formspec
-========
-
-Formspec defines a menu. This supports inventories and some of the
-typical widgets like buttons, checkboxes, text input fields, etc.
-It is a string, with a somewhat strange format.
-
-A formspec is made out of formspec elements, which includes widgets
-like buttons but also can be used to set stuff like background color.
-
-Many formspec elements have a `name`, which is a unique identifier which
-is used when the server receives user input. You must not use the name
-"quit" for formspec elements.
-
-Spaces and newlines can be inserted between the blocks, as is used in the
-examples.
-
-Position and size units are inventory slots unless the new coordinate system
-is enabled. `X` and `Y` position the formspec element relative to the top left
-of the menu or container. `W` and `H` are its width and height values.
-
-If the new system is enabled, all elements have unified coordinates for all
-elements with no padding or spacing in between. This is highly recommended
-for new forms. See `real_coordinates[<bool>]` and `Migrating to Real
-Coordinates`.
-
-Inventories with a `player:<name>` inventory location are only sent to the
-player named `<name>`.
-
-When displaying text which can contain formspec code, e.g. text set by a player,
-use `minetest.formspec_escape`.
-For coloured text you can use `minetest.colorize`.
-
-Since formspec version 3, elements drawn in the order they are defined. All
-background elements are drawn before all other elements.
-
-**WARNING**: do _not_ use a element name starting with `key_`; those names are
-reserved to pass key press events to formspec!
-
-**WARNING**: Minetest allows you to add elements to every single formspec instance
-using `player:set_formspec_prepend()`, which may be the reason backgrounds are
-appearing when you don't expect them to, or why things are styled differently
-to normal. See [`no_prepend[]`] and [Styling Formspecs].
-
-Examples
---------
-
-### Chest
-
-    size[8,9]
-    list[context;main;0,0;8,4;]
-    list[current_player;main;0,5;8,4;]
-
-### Furnace
-
-    size[8,9]
-    list[context;fuel;2,3;1,1;]
-    list[context;src;2,1;1,1;]
-    list[context;dst;5,1;2,2;]
-    list[current_player;main;0,5;8,4;]
-
-### Minecraft-like player inventory
-
-    size[8,7.5]
-    image[1,0.6;1,2;player.png]
-    list[current_player;main;0,3.5;8,4;]
-    list[current_player;craft;3,0;3,3;]
-    list[current_player;craftpreview;7,1;1,1;]
-
-Elements
---------
-
-### `formspec_version[<version>]`
-
-* Set the formspec version to a certain number. If not specified,
-  version 1 is assumed.
-* Must be specified before `size` element.
-* Clients older than this version can neither show newer elements nor display
-  elements with new arguments correctly.
-* Available since feature `formspec_version_element`.
-
-### `size[<W>,<H>,<fixed_size>]`
-
-* Define the size of the menu in inventory slots
-* `fixed_size`: `true`/`false` (optional)
-* deprecated: `invsize[<W>,<H>;]`
-
-### `position[<X>,<Y>]`
-
-* Must be used after `size` element.
-* Defines the position on the game window of the formspec's `anchor` point.
-* For X and Y, 0.0 and 1.0 represent opposite edges of the game window,
-  for example:
-    * [0.0, 0.0] sets the position to the top left corner of the game window.
-    * [1.0, 1.0] sets the position to the bottom right of the game window.
-* Defaults to the center of the game window [0.5, 0.5].
-
-### `anchor[<X>,<Y>]`
-
-* Must be used after both `size` and `position` (if present) elements.
-* Defines the location of the anchor point within the formspec.
-* For X and Y, 0.0 and 1.0 represent opposite edges of the formspec,
-  for example:
-    * [0.0, 1.0] sets the anchor to the bottom left corner of the formspec.
-    * [1.0, 0.0] sets the anchor to the top right of the formspec.
-* Defaults to the center of the formspec [0.5, 0.5].
-
-* `position` and `anchor` elements need suitable values to avoid a formspec
-  extending off the game window due to particular game window sizes.
-
-### `no_prepend[]`
-
-* Must be used after the `size`, `position`, and `anchor` elements (if present).
-* Disables player:set_formspec_prepend() from applying to this formspec.
-
-### `real_coordinates[<bool>]`
-
-* INFORMATION: Enable it automatically using `formspec_version` version 2 or newer.
-* When set to true, all following formspec elements will use the new coordinate system.
-* If used immediately after `size`, `position`, `anchor`, and `no_prepend` elements
-  (if present), the form size will use the new coordinate system.
-* **Note**: Formspec prepends are not affected by the coordinates in the main form.
-  They must enable it explicitly.
-* For information on converting forms to the new coordinate system, see `Migrating
-  to Real Coordinates`.
-
-### `container[<X>,<Y>]`
-
-* Start of a container block, moves all physical elements in the container by
-  (X, Y).
-* Must have matching `container_end`
-* Containers can be nested, in which case the offsets are added
-  (child containers are relative to parent containers)
-
-### `container_end[]`
-
-* End of a container, following elements are no longer relative to this
-  container.
-
-### `list[<inventory location>;<list name>;<X>,<Y>;<W>,<H>;]`
-
-* Show an inventory list if it has been sent to the client. Nothing will
-  be shown if the inventory list is of size 0.
-* **Note**: With the new coordinate system, the spacing between inventory
-  slots is one-fourth the size of an inventory slot.
-
-### `list[<inventory location>;<list name>;<X>,<Y>;<W>,<H>;<starting item index>]`
-
-* Show an inventory list if it has been sent to the client. Nothing will
-  be shown if the inventory list is of size 0.
-* **Note**: With the new coordinate system, the spacing between inventory
-  slots is one-fourth the size of an inventory slot.
-
-### `listring[<inventory location>;<list name>]`
-
-* Allows to create a ring of inventory lists
-* Shift-clicking on items in one element of the ring
-  will send them to the next inventory list inside the ring
-* The first occurrence of an element inside the ring will
-  determine the inventory where items will be sent to
-
-### `listring[]`
-
-* Shorthand for doing `listring[<inventory location>;<list name>]`
-  for the last two inventory lists added by list[...]
-
-### `listcolors[<slot_bg_normal>;<slot_bg_hover>]`
-
-* Sets background color of slots as `ColorString`
-* Sets background color of slots on mouse hovering
-
-### `listcolors[<slot_bg_normal>;<slot_bg_hover>;<slot_border>]`
-
-* Sets background color of slots as `ColorString`
-* Sets background color of slots on mouse hovering
-* Sets color of slots border
-
-### `listcolors[<slot_bg_normal>;<slot_bg_hover>;<slot_border>;<tooltip_bgcolor>;<tooltip_fontcolor>]`
-
-* Sets background color of slots as `ColorString`
-* Sets background color of slots on mouse hovering
-* Sets color of slots border
-* Sets default background color of tooltips
-* Sets default font color of tooltips
-
-### `tooltip[<gui_element_name>;<tooltip_text>;<bgcolor>;<fontcolor>]`
-
-* Adds tooltip for an element
-* `bgcolor` tooltip background color as `ColorString` (optional)
-* `fontcolor` tooltip font color as `ColorString` (optional)
-
-### `tooltip[<X>,<Y>;<W>,<H>;<tooltip_text>;<bgcolor>;<fontcolor>]`
-
-* Adds tooltip for an area. Other tooltips will take priority when present.
-* `bgcolor` tooltip background color as `ColorString` (optional)
-* `fontcolor` tooltip font color as `ColorString` (optional)
-
-### `image[<X>,<Y>;<W>,<H>;<texture name>]`
-
-* Show an image
-
-### `animated_image[<X>,<Y>;<W>,<H>;<name>;<texture name>;<frame count>;<frame duration>;<frame start>]`
-
-* Show an animated image. The image is drawn like a "vertical_frames" tile
-    animation (See [Tile animation definition]), but uses a frame count/duration
-    for simplicity
-* `name`: Element name to send when an event occurs. The event value is the index of the current frame.
-* `texture name`: The image to use.
-* `frame count`: The number of frames animating the image.
-* `frame duration`: Milliseconds between each frame. `0` means the frames don't advance.
-* `frame start` (Optional): The index of the frame to start on. Default `1`.
-
-### `item_image[<X>,<Y>;<W>,<H>;<item name>]`
-
-* Show an inventory image of registered item/node
-
-### `bgcolor[<bgcolor>;<fullscreen>;<fbgcolor>]`
-
-* Sets background color of formspec.
-* `bgcolor` and `fbgcolor` (optional) are `ColorString`s, they define the color
-  of the non-fullscreen and the fullscreen background.
-* `fullscreen` (optional) can be one of the following:
-  * `false`: Only the non-fullscreen background color is drawn. (default)
-  * `true`: Only the fullscreen background color is drawn.
-  * `both`: The non-fullscreen and the fullscreen background color are drawn.
-  * `neither`: No background color is drawn.
-* Note: Leave a parameter empty to not modify the value.
-* Note: `fbgcolor`, leaving parameters empty and values for `fullscreen` that
-  are not bools are only available since formspec version 3.
-
-### `background[<X>,<Y>;<W>,<H>;<texture name>]`
-
-* Example for formspec 8x4 in 16x resolution: image shall be sized
-  8 times 16px  times  4 times 16px.
-
-### `background[<X>,<Y>;<W>,<H>;<texture name>;<auto_clip>]`
-
-* Example for formspec 8x4 in 16x resolution:
-  image shall be sized 8 times 16px  times  4 times 16px
-* If `auto_clip` is `true`, the background is clipped to the formspec size
-  (`x` and `y` are used as offset values, `w` and `h` are ignored)
-
-### `background9[<X>,<Y>;<W>,<H>;<texture name>;<auto_clip>;<middle>]`
-
-* 9-sliced background. See https://en.wikipedia.org/wiki/9-slice_scaling
-* Middle is a rect which defines the middle of the 9-slice.
-       * `x` - The middle will be x pixels from all sides.
-       * `x,y` - The middle will be x pixels from the horizontal and y from the vertical.
-       * `x,y,x2,y2` - The middle will start at x,y, and end at x2, y2. Negative x2 and y2 values
-               will be added to the width and height of the texture, allowing it to be used as the
-               distance from the far end.
-       * All numbers in middle are integers.
-* Example for formspec 8x4 in 16x resolution:
-  image shall be sized 8 times 16px  times  4 times 16px
-* If `auto_clip` is `true`, the background is clipped to the formspec size
-  (`x` and `y` are used as offset values, `w` and `h` are ignored)
-* Available since formspec version 2
-
-### `pwdfield[<X>,<Y>;<W>,<H>;<name>;<label>]`
-
-* Textual password style field; will be sent to server when a button is clicked
-* When enter is pressed in field, fields.key_enter_field will be sent with the
-  name of this field.
-* With the old coordinate system, fields are a set height, but will be vertically
-  centred on `H`. With the new coordinate system, `H` will modify the height.
-* `name` is the name of the field as returned in fields to `on_receive_fields`
-* `label`, if not blank, will be text printed on the top left above the field
-* See `field_close_on_enter` to stop enter closing the formspec
-
-### `field[<X>,<Y>;<W>,<H>;<name>;<label>;<default>]`
-
-* Textual field; will be sent to server when a button is clicked
-* When enter is pressed in field, `fields.key_enter_field` will be sent with
-  the name of this field.
-* With the old coordinate system, fields are a set height, but will be vertically
-  centred on `H`. With the new coordinate system, `H` will modify the height.
-* `name` is the name of the field as returned in fields to `on_receive_fields`
-* `label`, if not blank, will be text printed on the top left above the field
-* `default` is the default value of the field
-    * `default` may contain variable references such as `${text}` which
-      will fill the value from the metadata value `text`
-    * **Note**: no extra text or more than a single variable is supported ATM.
-* See `field_close_on_enter` to stop enter closing the formspec
-
-### `field[<name>;<label>;<default>]`
-
-* As above, but without position/size units
-* When enter is pressed in field, `fields.key_enter_field` will be sent with
-  the name of this field.
-* Special field for creating simple forms, such as sign text input
-* Must be used without a `size[]` element
-* A "Proceed" button will be added automatically
-* See `field_close_on_enter` to stop enter closing the formspec
-
-### `field_close_on_enter[<name>;<close_on_enter>]`
-
-* <name> is the name of the field
-* if <close_on_enter> is false, pressing enter in the field will submit the
-  form but not close it.
-* defaults to true when not specified (ie: no tag for a field)
-
-### `textarea[<X>,<Y>;<W>,<H>;<name>;<label>;<default>]`
-
-* Same as fields above, but with multi-line input
-* If the text overflows, a vertical scrollbar is added.
-* If the name is empty, the textarea is read-only and
-  the background is not shown, which corresponds to a multi-line label.
-
-### `label[<X>,<Y>;<label>]`
-
-* The label formspec element displays the text set in `label`
-  at the specified position.
-* **Note**: If the new coordinate system is enabled, labels are
-  positioned from the center of the text, not the top.
-* The text is displayed directly without automatic line breaking,
-  so label should not be used for big text chunks.  Newlines can be
-  used to make labels multiline.
-* **Note**: With the new coordinate system, newlines are spaced with
-  half a coordinate.  With the old system, newlines are spaced 2/5 of
-  an inventory slot.
-
-### `hypertext[<X>,<Y>;<W>,<H>;<name>;<text>]`
-* Displays a static formatted text with hyperlinks.
-* **Note**: This element is currently unstable and subject to change.
-* `x`, `y`, `w` and `h` work as per field
-* `name` is the name of the field as returned in fields to `on_receive_fields` in case of action in text.
-* `text` is the formatted text using `Markup Language` described below.
-
-### `vertlabel[<X>,<Y>;<label>]`
-* Textual label drawn vertically
-* `label` is the text on the label
-* **Note**: If the new coordinate system is enabled, vertlabels are
-  positioned from the center of the text, not the left.
-
-### `button[<X>,<Y>;<W>,<H>;<name>;<label>]`
-
-* Clickable button. When clicked, fields will be sent.
-* With the old coordinate system, buttons are a set height, but will be vertically
-  centred on `H`. With the new coordinate system, `H` will modify the height.
-* `label` is the text on the button
-
-### `image_button[<X>,<Y>;<W>,<H>;<texture name>;<name>;<label>]`
-
-* `texture name` is the filename of an image
-* **Note**: Height is supported on both the old and new coordinate systems
-  for image_buttons.
-
-### `image_button[<X>,<Y>;<W>,<H>;<texture name>;<name>;<label>;<noclip>;<drawborder>;<pressed texture name>]`
-
-* `texture name` is the filename of an image
-* `noclip=true` means the image button doesn't need to be within specified
-  formsize.
-* `drawborder`: draw button border or not
-* `pressed texture name` is the filename of an image on pressed state
-
-### `item_image_button[<X>,<Y>;<W>,<H>;<item name>;<name>;<label>]`
-
-* `item name` is the registered name of an item/node
-* The item description will be used as the tooltip. This can be overridden with
-  a tooltip element.
-
-### `button_exit[<X>,<Y>;<W>,<H>;<name>;<label>]`
-
-* When clicked, fields will be sent and the form will quit.
-* Same as `button` in all other respects.
-
-### `image_button_exit[<X>,<Y>;<W>,<H>;<texture name>;<name>;<label>]`
-
-* When clicked, fields will be sent and the form will quit.
-* Same as `image_button` in all other respects.
-
-### `textlist[<X>,<Y>;<W>,<H>;<name>;<listelem 1>,<listelem 2>,...,<listelem n>]`
-
-* Scrollable item list showing arbitrary text elements
-* `name` fieldname sent to server on doubleclick value is current selected
-  element.
-* `listelements` can be prepended by #color in hexadecimal format RRGGBB
-  (only).
-    * if you want a listelement to start with "#" write "##".
-
-### `textlist[<X>,<Y>;<W>,<H>;<name>;<listelem 1>,<listelem 2>,...,<listelem n>;<selected idx>;<transparent>]`
-
-* Scrollable itemlist showing arbitrary text elements
-* `name` fieldname sent to server on doubleclick value is current selected
-  element.
-* `listelements` can be prepended by #RRGGBB (only) in hexadecimal format
-    * if you want a listelement to start with "#" write "##"
-* Index to be selected within textlist
-* `true`/`false`: draw transparent background
-* See also `minetest.explode_textlist_event`
-  (main menu: `core.explode_textlist_event`).
-
-### `tabheader[<X>,<Y>;<name>;<caption 1>,<caption 2>,...,<caption n>;<current_tab>;<transparent>;<draw_border>]`
-
-* Show a tab**header** at specific position (ignores formsize)
-* `X` and `Y`: position of the tabheader
-* *Note*: Width and height are automatically chosen with this syntax
-* `name` fieldname data is transferred to Lua
-* `caption 1`...: name shown on top of tab
-* `current_tab`: index of selected tab 1...
-* `transparent` (optional): show transparent
-* `draw_border` (optional): draw border
-
-### `tabheader[<X>,<Y>;<H>;<name>;<caption 1>,<caption 2>,...,<caption n>;<current_tab>;<transparent>;<draw_border>]`
-
-* Show a tab**header** at specific position (ignores formsize)
-* **Important note**: This syntax for tabheaders can only be used with the
-  new coordinate system.
-* `X` and `Y`: position of the tabheader
-* `H`: height of the tabheader. Width is automatically determined with this syntax.
-* `name` fieldname data is transferred to Lua
-* `caption 1`...: name shown on top of tab
-* `current_tab`: index of selected tab 1...
-* `transparent` (optional): show transparent
-* `draw_border` (optional): draw border
-
-### `tabheader[<X>,<Y>;<W>,<H>;<name>;<caption 1>,<caption 2>,...,<caption n>;<current_tab>;<transparent>;<draw_border>]`
-
-* Show a tab**header** at specific position (ignores formsize)
-* **Important note**: This syntax for tabheaders can only be used with the
-  new coordinate system.
-* `X` and `Y`: position of the tabheader
-* `W` and `H`: width and height of the tabheader
-* `name` fieldname data is transferred to Lua
-* `caption 1`...: name shown on top of tab
-* `current_tab`: index of selected tab 1...
-* `transparent` (optional): show transparent
-* `draw_border` (optional): draw border
-
-### `box[<X>,<Y>;<W>,<H>;<color>]`
-
-* Simple colored box
-* `color` is color specified as a `ColorString`.
-  If the alpha component is left blank, the box will be semitransparent.
-
-### `dropdown[<X>,<Y>;<W>;<name>;<item 1>,<item 2>, ...,<item n>;<selected idx>]`
-
-* Show a dropdown field
-* **Important note**: There are two different operation modes:
-    1. handle directly on change (only changed dropdown is submitted)
-    2. read the value on pressing a button (all dropdown values are available)
-* `X` and `Y`: position of the dropdown
-* `W`: width of the dropdown. Height is automatically chosen with this syntax.
-* Fieldname data is transferred to Lua
-* Items to be shown in dropdown
-* Index of currently selected dropdown item
-
-### `dropdown[<X>,<Y>;<W>,<H>;<name>;<item 1>,<item 2>, ...,<item n>;<selected idx>]`
-
-* Show a dropdown field
-* **Important note**: This syntax for dropdowns can only be used with the
-  new coordinate system.
-* **Important note**: There are two different operation modes:
-    1. handle directly on change (only changed dropdown is submitted)
-    2. read the value on pressing a button (all dropdown values are available)
-* `X` and `Y`: position of the dropdown
-* `W` and `H`: width and height of the dropdown
-* Fieldname data is transferred to Lua
-* Items to be shown in dropdown
-* Index of currently selected dropdown item
-
-### `checkbox[<X>,<Y>;<name>;<label>;<selected>]`
-
-* Show a checkbox
-* `name` fieldname data is transferred to Lua
-* `label` to be shown left of checkbox
-* `selected` (optional): `true`/`false`
-* **Note**: If the new coordinate system is enabled, checkboxes are
-  positioned from the center of the checkbox, not the top.
-
-### `scrollbar[<X>,<Y>;<W>,<H>;<orientation>;<name>;<value>]`
-
-* Show a scrollbar using options defined by the previous `scrollbaroptions[]`
-* There are two ways to use it:
-    1. handle the changed event (only changed scrollbar is available)
-    2. read the value on pressing a button (all scrollbars are available)
-* `orientation`:  `vertical`/`horizontal`
-* Fieldname data is transferred to Lua
-* Value of this trackbar is set to (`0`-`1000`) by default
-* See also `minetest.explode_scrollbar_event`
-  (main menu: `core.explode_scrollbar_event`).
-
-### `scrollbaroptions[opt1;opt2;...]`
-* Sets options for all following `scrollbar[]` elements
-* `min=<int>`
-    * Sets scrollbar minimum value, defaults to `0`.
-* `max=<int>`
-    * Sets scrollbar maximum value, defaults to `1000`.
-      If the max is equal to the min, the scrollbar will be disabled.
-* `smallstep=<int>`
-    * Sets scrollbar step value when the arrows are clicked or the mouse wheel is
-      scrolled.
-    * If this is set to a negative number, the value will be reset to `10`.
-* `largestep=<int>`
-    * Sets scrollbar step value used by page up and page down.
-    * If this is set to a negative number, the value will be reset to `100`.
-* `thumbsize=<int>`
-    * Sets size of the thumb on the scrollbar. Size is calculated in the number of
-      units the thumb spans out of the range of the scrollbar values.
-    * Example: If a scrollbar has a `min` of 1 and a `max` of 100, a thumbsize of 10
-      would span a tenth of the scrollbar space.
-    * If this is set to zero or less, the value will be reset to `1`.
-* `arrows=<show/hide/default>`
-    * Whether to show the arrow buttons on the scrollbar. `default` hides the arrows
-      when the scrollbar gets too small, but shows them otherwise.
-
-### `table[<X>,<Y>;<W>,<H>;<name>;<cell 1>,<cell 2>,...,<cell n>;<selected idx>]`
-
-* Show scrollable table using options defined by the previous `tableoptions[]`
-* Displays cells as defined by the previous `tablecolumns[]`
-* `name`: fieldname sent to server on row select or doubleclick
-* `cell 1`...`cell n`: cell contents given in row-major order
-* `selected idx`: index of row to be selected within table (first row = `1`)
-* See also `minetest.explode_table_event`
-  (main menu: `core.explode_table_event`).
-
-### `tableoptions[<opt 1>;<opt 2>;...]`
-
-* Sets options for `table[]`
-* `color=#RRGGBB`
-    * default text color (`ColorString`), defaults to `#FFFFFF`
-* `background=#RRGGBB`
-    * table background color (`ColorString`), defaults to `#000000`
-* `border=<true/false>`
-    * should the table be drawn with a border? (default: `true`)
-* `highlight=#RRGGBB`
-    * highlight background color (`ColorString`), defaults to `#466432`
-* `highlight_text=#RRGGBB`
-    * highlight text color (`ColorString`), defaults to `#FFFFFF`
-* `opendepth=<value>`
-    * all subtrees up to `depth < value` are open (default value = `0`)
-    * only useful when there is a column of type "tree"
-
-### `tablecolumns[<type 1>,<opt 1a>,<opt 1b>,...;<type 2>,<opt 2a>,<opt 2b>;...]`
-
-* Sets columns for `table[]`
-* Types: `text`, `image`, `color`, `indent`, `tree`
-    * `text`:   show cell contents as text
-    * `image`:  cell contents are an image index, use column options to define
-                images.
-    * `color`:  cell contents are a ColorString and define color of following
-                cell.
-    * `indent`: cell contents are a number and define indentation of following
-                cell.
-    * `tree`:   same as indent, but user can open and close subtrees
-                (treeview-like).
-* Column options:
-    * `align=<value>`
-        * for `text` and `image`: content alignment within cells.
-          Available values: `left` (default), `center`, `right`, `inline`
-    * `width=<value>`
-        * for `text` and `image`: minimum width in em (default: `0`)
-        * for `indent` and `tree`: indent width in em (default: `1.5`)
-    * `padding=<value>`: padding left of the column, in em (default `0.5`).
-      Exception: defaults to 0 for indent columns
-    * `tooltip=<value>`: tooltip text (default: empty)
-    * `image` column options:
-        * `0=<value>` sets image for image index 0
-        * `1=<value>` sets image for image index 1
-        * `2=<value>` sets image for image index 2
-        * and so on; defined indices need not be contiguous empty or
-          non-numeric cells are treated as `0`.
-    * `color` column options:
-        * `span=<value>`: number of following columns to affect
-          (default: infinite).
-
-### `style[<name 1>,<name 2>,...;<prop1>;<prop2>;...]`
-
-* Set the style for the named element(s) `name`.
-* Note: this **must** be before the element is defined.
-* See [Styling Formspecs].
-
-
-### `style_type[<type 1>,<type 2>,...;<prop1>;<prop2>;...]`
-
-* Sets the style for all elements of type(s) `type` which appear after this element.
-* See [Styling Formspecs].
-
-Migrating to Real Coordinates
------------------------------
-
-In the old system, positions included padding and spacing. Padding is a gap between
-the formspec window edges and content, and spacing is the gaps between items. For
-example, two `1x1` elements at `0,0` and `1,1` would have a spacing of `5/4` between them,
-and a padding of `3/8` from the formspec edge. It may be easiest to recreate old layouts
-in the new coordinate system from scratch.
-
-To recreate an old layout with padding, you'll need to pass the positions and sizes
-through the following formula to re-introduce padding:
-
-```
-pos = (oldpos + 1)*spacing + padding
-where
-    padding = 3/8
-    spacing = 5/4
-```
-
-You'll need to change the `size[]` tag like this:
-
-```
-size = (oldsize-1)*spacing + padding*2 + 1
-```
-
-A few elements had random offsets in the old system. Here is a table which shows these
-offsets when migrating:
-
-| Element |  Position  |  Size   | Notes
-|---------|------------|---------|-------
-| box     | +0.3, +0.1 | 0, -0.4 |
-| button  |            |         | Buttons now support height, so set h = 2 * 15/13 * 0.35, and reposition if h ~= 15/13 * 0.35 before
-| list    |            |         | Spacing is now 0.25 for both directions, meaning lists will be taller in height
-| label   | 0, +0.3    |         | The first line of text is now positioned centered exactly at the position specified
-
-Styling Formspecs
------------------
-
-Formspec elements can be themed using the style elements:
-
-    style[<name 1>,<name 2>,...;<prop1>;<prop2>;...]
-    style_type[<type 1>,<type 2>,...;<prop1>;<prop2>;...]
-
-Where a prop is:
-
-    property_name=property_value
-
-A name/type can optionally be a comma separated list of names/types, like so:
-
-    world_delete,world_create,world_configure
-    button,image_button
-
-For example:
-
-    style_type[button;bgcolor=#006699]
-    style[world_delete;bgcolor=red;textcolor=yellow]
-    button[4,3.95;2.6,1;world_delete;Delete]
-
-Setting a property to nothing will reset it to the default value. For example:
-
-    style_type[button;bgimg=button.png;bgimg_pressed=button_pressed.png;border=false]
-    style[btn_exit;bgimg=;bgimg_pressed=;border=;bgcolor=red]
-
-
-### Supported Element Types
-
-Some types may inherit styles from parent types.
-
-* animated_image, inherits from image
-* button
-* button_exit, inherits from button
-* checkbox
-* scrollbar
-* table
-* textlist
-* dropdown
-* field
-* pwdfield, inherits from field
-* textarea
-* label
-* vertlabel, inherits from field
-* image_button
-* item_image_button
-* tabheader
-
-
-### Valid Properties
-
-* animated_image
-    * noclip - boolean, set to true to allow the element to exceed formspec bounds.
-* box
-    * noclip - boolean, set to true to allow the element to exceed formspec bounds.
-        * Default to false in formspec_version version 3 or higher
-* button, button_exit, image_button, item_image_button
-    * alpha - boolean, whether to draw alpha in bgimg. Default true.
-    * bgcolor - color, sets button tint.
-    * bgcolor_hovered - color when hovered. Defaults to a lighter bgcolor when not provided.
-    * bgcolor_pressed - color when pressed. Defaults to a darker bgcolor when not provided.
-    * bgimg - standard background image. Defaults to none.
-    * bgimg_hovered - background image when hovered. Defaults to bgimg when not provided.
-    * bgimg_middle - Makes the bgimg textures render in 9-sliced mode and defines the middle rect.
-                     See background9[] documentation for more details
-    * bgimg_pressed - background image when pressed. Defaults to bgimg when not provided.
-    * border - boolean, draw border. Set to false to hide the bevelled button pane. Default true.
-    * noclip - boolean, set to true to allow the element to exceed formspec bounds.
-    * textcolor - color, default white.
-* checkbox
-    * noclip - boolean, set to true to allow the element to exceed formspec bounds.
-* scrollbar
-    * noclip - boolean, set to true to allow the element to exceed formspec bounds.
-* table, textlist
-    * noclip - boolean, set to true to allow the element to exceed formspec bounds.
-* dropdown
-    * noclip - boolean, set to true to allow the element to exceed formspec bounds.
-* field, pwdfield, textarea
-    * border - set to false to hide the textbox background and border. Default true.
-    * noclip - boolean, set to true to allow the element to exceed formspec bounds.
-    * textcolor - color. Default white.
-* image
-    * noclip - boolean, set to true to allow the element to exceed formspec bounds.
-        * Default to false in formspec_version version 3 or higher
-* item_image
-    * noclip - boolean, set to true to allow the element to exceed formspec bounds. Default to false.
-* label, vertlabel
-    * noclip - boolean, set to true to allow the element to exceed formspec bounds.
-* image_button (additional properties)
-    * fgimg - standard image. Defaults to none.
-    * fgimg_hovered - image when hovered. Defaults to fgimg when not provided.
-    * fgimg_pressed - image when pressed. Defaults to fgimg when not provided.
-    * NOTE: The parameters of any given image_button will take precedence over fgimg/fgimg_pressed
-* tabheader
-    * noclip - boolean, set to true to allow the element to exceed formspec bounds.
-    * textcolor - color. Default white.
-
-Markup Language
----------------
-
-Markup language used in `hypertext[]` elements uses tags that look like HTML tags.
-The markup language is currently unstable and subject to change. Use with caution.
-Some tags can enclose text, they open with `<tagname>` and close with `</tagname>`.
-Tags can have attributes, in that case, attributes are in the opening tag in
-form of a key/value separated with equal signs. Attribute values should not be quoted.
-
-These are the technically basic tags but see below for usual tags. Base tags are:
-
-`<style color=... font=... size=...>...</style>`
-
-Changes the style of the text.
-
-* `color`: Text color. Given color is a `colorspec`.
-* `size`: Text size.
-* `font`: Text font (`mono` or `normal`).
-
-`<global background=... margin=... valign=... color=... hovercolor=... size=... font=... halign=... >`
-
-Sets global style.
-
-Global only styles:
-* `background`: Text background, a `colorspec` or `none`.
-* `margin`: Page margins in pixel.
-* `valign`: Text vertical alignment (`top`, `middle`, `bottom`).
-
-Inheriting styles (affects child elements):
-* `color`: Default text color. Given color is a `colorspec`.
-* `hovercolor`: Color of <action> tags when mouse is over.
-* `size`: Default text size.
-* `font`: Default text font (`mono` or `normal`).
-* `halign`: Default text horizontal alignment (`left`, `right`, `center`, `justify`).
-
-This tag needs to be placed only once as it changes the global settings of the
-text. Anyway, if several tags are placed, each changed will be made in the order
-tags appear.
-
-`<tag name=... color=... hovercolor=... font=... size=...>`
-
-Defines or redefines tag style. This can be used to define new tags.
-* `name`: Name of the tag to define or change.
-* `color`: Text color. Given color is a `colorspec`.
-* `hovercolor`: Text color when element hovered (only for `action` tags). Given color is a `colorspec`.
-* `size`: Text size.
-* `font`: Text font (`mono` or `normal`).
-
-Following tags are the usual tags for text layout. They are defined by default.
-Other tags can be added using `<tag ...>` tag.
-
-`<normal>...</normal>`: Normal size text
-
-`<big>...</big>`: Big text
-
-`<bigger>...</bigger>`: Bigger text
-
-`<center>...</center>`: Centered text
-
-`<left>...</left>`: Left-aligned text
-
-`<right>...</right>`: Right-aligned text
-
-`<justify>...</justify>`: Justified text
-
-`<mono>...</mono>`: Monospaced font
-
-`<b>...</b>`, `<i>...</i>`, `<u>...</u>`: Bold, italic, underline styles.
-
-`<action name=...>...</action>`
-
-Make that text a clickable text triggering an action.
-
-* `name`: Name of the action (mandatory).
-
-When clicked, the formspec is send to the server. The value of the text field
-sent to `on_player_receive_fields` will be "action:" concatenated to the action
-name.
-
-`<img name=... float=... width=... height=...>`
-
-Draws an image which is present in the client media cache.
-
-* `name`: Name of the texture (mandatory).
-* `float`: If present, makes the image floating (`left` or `right`).
-* `width`: Force image width instead of taking texture width.
-* `height`: Force image height instead of taking texture height.
-
-If only width or height given, texture aspect is kept.
-
-`<item name=... float=... width=... height=... rotate=...>`
-
-Draws an item image.
-
-* `name`: Item string of the item to draw (mandatory).
-* `float`: If present, makes the image floating (`left` or `right`).
-* `width`: Item image width.
-* `height`: Item image height.
-* `rotate`: Rotate item image if set to `yes` or `X,Y,Z`. X, Y and Z being
-rotation speeds in percent of standard speed (-1000 to 1000). Works only if
-`inventory_items_animations` is set to true.
-* `angle`: Angle in which the item image is shown. Value has `X,Y,Z` form.
-X, Y and Z being angles around each three axes. Works only if
-`inventory_items_animations` is set to true.
-
-Inventory
-=========
-
-Inventory locations
--------------------
-
-* `"context"`: Selected node metadata (deprecated: `"current_name"`)
-* `"current_player"`: Player to whom the menu is shown
-* `"player:<name>"`: Any player
-* `"nodemeta:<X>,<Y>,<Z>"`: Any node metadata
-* `"detached:<name>"`: A detached inventory
-
-Player Inventory lists
-----------------------
-
-* `main`: list containing the default inventory
-* `craft`: list containing the craft input
-* `craftpreview`: list containing the craft prediction
-* `craftresult`: list containing the crafted output
-* `hand`: list containing an override for the empty hand
-    * Is not created automatically, use `InvRef:set_size`
-    * Is only used to enhance the empty hand's tool capabilities
-
-Colors
-======
-
-`ColorString`
--------------
-
-`#RGB` defines a color in hexadecimal format.
-
-`#RGBA` defines a color in hexadecimal format and alpha channel.
-
-`#RRGGBB` defines a color in hexadecimal format.
-
-`#RRGGBBAA` defines a color in hexadecimal format and alpha channel.
-
-Named colors are also supported and are equivalent to
-[CSS Color Module Level 4](http://dev.w3.org/csswg/css-color/#named-colors).
-To specify the value of the alpha channel, append `#AA` to the end of the color
-name (e.g. `colorname#08`). For named colors the hexadecimal string
-representing the alpha value must (always) be two hexadecimal digits.
-
-`ColorSpec`
------------
-
-A ColorSpec specifies a 32-bit color. It can be written in any of the following
-forms:
-
-* table form: Each element ranging from 0..255 (a, if absent, defaults to 255):
-    * `colorspec = {a=255, r=0, g=255, b=0}`
-* numerical form: The raw integer value of an ARGB8 quad:
-    * `colorspec = 0xFF00FF00`
-* string form: A ColorString (defined above):
-    * `colorspec = "green"`
-
-
-
-
-Escape sequences
-================
-
-Most text can contain escape sequences, that can for example color the text.
-There are a few exceptions: tab headers, dropdowns and vertical labels can't.
-The following functions provide escape sequences:
-
-* `minetest.get_color_escape_sequence(color)`:
-    * `color` is a ColorString
-    * The escape sequence sets the text color to `color`
-* `minetest.colorize(color, message)`:
-    * Equivalent to:
-      `minetest.get_color_escape_sequence(color) ..
-      message ..
-      minetest.get_color_escape_sequence("#ffffff")`
-* `minetest.get_background_escape_sequence(color)`
-    * `color` is a ColorString
-    * The escape sequence sets the background of the whole text element to
-      `color`. Only defined for item descriptions and tooltips.
-* `minetest.strip_foreground_colors(str)`
-    * Removes foreground colors added by `get_color_escape_sequence`.
-* `minetest.strip_background_colors(str)`
-    * Removes background colors added by `get_background_escape_sequence`.
-* `minetest.strip_colors(str)`
-    * Removes all color escape sequences.
-
-
-
-
-Spatial Vectors
-===============
-A spatial vector is similar to a position, but instead using
-absolute world coordinates, it uses *relative* coordinates, relative to
-no particular point.
-
-Internally, it is implemented as a table with the 3 fields
-`x`, `y` and `z`. Example: `{x = 0, y = 1, z = 0}`.
-
-For the following functions, `v`, `v1`, `v2` are vectors,
-`p1`, `p2` are positions:
-
-* `vector.new(a[, b, c])`:
-    * Returns a vector.
-    * A copy of `a` if `a` is a vector.
-    * `{x = a, y = b, z = c}`, if all of `a`, `b`, `c` are defined numbers.
-* `vector.direction(p1, p2)`:
-    * Returns a vector of length 1 with direction `p1` to `p2`.
-    * If `p1` and `p2` are identical, returns `{x = 0, y = 0, z = 0}`.
-* `vector.distance(p1, p2)`:
-    * Returns zero or a positive number, the distance between `p1` and `p2`.
-* `vector.length(v)`:
-    * Returns zero or a positive number, the length of vector `v`.
-* `vector.normalize(v)`:
-    * Returns a vector of length 1 with direction of vector `v`.
-    * If `v` has zero length, returns `{x = 0, y = 0, z = 0}`.
-* `vector.floor(v)`:
-    * Returns a vector, each dimension rounded down.
-* `vector.round(v)`:
-    * Returns a vector, each dimension rounded to nearest integer.
-* `vector.apply(v, func)`:
-    * Returns a vector where the function `func` has been applied to each
-      component.
-* `vector.equals(v1, v2)`:
-    * Returns a boolean, `true` if the vectors are identical.
-* `vector.sort(v1, v2)`:
-    * Returns in order minp, maxp vectors of the cuboid defined by `v1`, `v2`.
-* `vector.angle(v1, v2)`:
-    * Returns the angle between `v1` and `v2` in radians.
-* `vector.dot(v1, v2)`
-    * Returns the dot product of `v1` and `v2`
-* `vector.cross(v1, v2)`
-    * Returns the cross product of `v1` and `v2`
-
-For the following functions `x` can be either a vector or a number:
-
-* `vector.add(v, x)`:
-    * Returns a vector.
-    * If `x` is a vector: Returns the sum of `v` and `x`.
-    * If `x` is a number: Adds `x` to each component of `v`.
-* `vector.subtract(v, x)`:
-    * Returns a vector.
-    * If `x` is a vector: Returns the difference of `v` subtracted by `x`.
-    * If `x` is a number: Subtracts `x` from each component of `v`.
-* `vector.multiply(v, x)`:
-    * Returns a scaled vector or Schur product.
-* `vector.divide(v, x)`:
-    * Returns a scaled vector or Schur quotient.
-
-
-
-
-Helper functions
-================
-
-* `dump2(obj, name, dumped)`: returns a string which makes `obj`
-  human-readable, handles reference loops.
-    * `obj`: arbitrary variable
-    * `name`: string, default: `"_"`
-    * `dumped`: table, default: `{}`
-* `dump(obj, dumped)`: returns a string which makes `obj` human-readable
-    * `obj`: arbitrary variable
-    * `dumped`: table, default: `{}`
-* `math.hypot(x, y)`
-    * Get the hypotenuse of a triangle with legs x and y.
-      Useful for distance calculation.
-* `math.sign(x, tolerance)`: returns `-1`, `0` or `1`
-    * Get the sign of a number.
-    * tolerance: number, default: `0.0`
-    * If the absolute value of `x` is within the `tolerance` or `x` is NaN,
-      `0` is returned.
-* `math.factorial(x)`: returns the factorial of `x`
-* `string.split(str, separator, include_empty, max_splits, sep_is_pattern)`
-    * `separator`: string, default: `","`
-    * `include_empty`: boolean, default: `false`
-    * `max_splits`: number, if it's negative, splits aren't limited,
-      default: `-1`
-    * `sep_is_pattern`: boolean, it specifies whether separator is a plain
-      string or a pattern (regex), default: `false`
-    * e.g. `"a,b":split","` returns `{"a","b"}`
-* `string:trim()`: returns the string without whitespace pre- and suffixes
-    * e.g. `"\n \t\tfoo bar\t ":trim()` returns `"foo bar"`
-* `minetest.wrap_text(str, limit, as_table)`: returns a string or table
-    * Adds newlines to the string to keep it within the specified character
-      limit
-    * Note that the returned lines may be longer than the limit since it only
-      splits at word borders.
-    * `limit`: number, maximal amount of characters in one line
-    * `as_table`: boolean, if set to true, a table of lines instead of a string
-      is returned, default: `false`
-* `minetest.pos_to_string(pos, decimal_places)`: returns string `"(X,Y,Z)"`
-    * `pos`: table {x=X, y=Y, z=Z}
-    * Converts the position `pos` to a human-readable, printable string
-    * `decimal_places`: number, if specified, the x, y and z values of
-      the position are rounded to the given decimal place.
-* `minetest.string_to_pos(string)`: returns a position or `nil`
-    * Same but in reverse.
-    * If the string can't be parsed to a position, nothing is returned.
-* `minetest.string_to_area("(X1, Y1, Z1) (X2, Y2, Z2)")`: returns two positions
-    * Converts a string representing an area box into two positions
-* `minetest.formspec_escape(string)`: returns a string
-    * escapes the characters "[", "]", "\", "," and ";", which can not be used
-      in formspecs.
-* `minetest.is_yes(arg)`
-    * returns true if passed 'y', 'yes', 'true' or a number that isn't zero.
-* `minetest.is_nan(arg)`
-    * returns true when the passed number represents NaN.
-* `minetest.get_us_time()`
-    * returns time with microsecond precision. May not return wall time.
-* `table.copy(table)`: returns a table
-    * returns a deep copy of `table`
-* `table.indexof(list, val)`: returns the smallest numerical index containing
-      the value `val` in the table `list`. Non-numerical indices are ignored.
-      If `val` could not be found, `-1` is returned. `list` must not have
-      negative indices.
-* `table.insert_all(table, other_table)`:
-    * Appends all values in `other_table` to `table` - uses `#table + 1` to
-      find new indices.
-* `table.key_value_swap(t)`: returns a table with keys and values swapped
-    * If multiple keys in `t` map to the same value, the result is undefined.
-* `table.shuffle(table, [from], [to], [random_func])`:
-    * Shuffles elements `from` to `to` in `table` in place
-    * `from` defaults to `1`
-    * `to` defaults to `#table`
-    * `random_func` defaults to `math.random`. This function receives two
-      integers as arguments and should return a random integer inclusively
-      between them.
-* `minetest.pointed_thing_to_face_pos(placer, pointed_thing)`: returns a
-  position.
-    * returns the exact position on the surface of a pointed node
-* `minetest.get_dig_params(groups, tool_capabilities)`: Simulates a tool
-    that digs a node.
-    Returns a table with the following fields:
-    * `diggable`: `true` if node can be dug, `false` otherwise.
-    * `time`: Time it would take to dig the node.
-    * `wear`: How much wear would be added to the tool.
-    `time` and `wear` are meaningless if node's not diggable
-    Parameters:
-    * `groups`: Table of the node groups of the node that would be dug
-    * `tool_capabilities`: Tool capabilities table of the tool
-* `minetest.get_hit_params(groups, tool_capabilities [, time_from_last_punch])`:
-    Simulates an item that punches an object.
-    Returns a table with the following fields:
-    * `hp`: How much damage the punch would cause.
-    * `wear`: How much wear would be added to the tool.
-    Parameters:
-    * `groups`: Damage groups of the object
-    * `tool_capabilities`: Tool capabilities table of the item
-    * `time_from_last_punch`: time in seconds since last punch action
-
-
-
-
-Translations
-============
-
-Texts can be translated client-side with the help of `minetest.translate` and
-translation files.
-
-Translating a string
---------------------
-
-Two functions are provided to translate strings: `minetest.translate` and
-`minetest.get_translator`.
-
-* `minetest.get_translator(textdomain)` is a simple wrapper around
-  `minetest.translate`, and `minetest.get_translator(textdomain)(str, ...)` is
-  equivalent to `minetest.translate(textdomain, str, ...)`.
-  It is intended to be used in the following way, so that it avoids verbose
-  repetitions of `minetest.translate`:
-
-      local S = minetest.get_translator(textdomain)
-      S(str, ...)
-
-  As an extra commodity, if `textdomain` is nil, it is assumed to be "" instead.
-
-* `minetest.translate(textdomain, str, ...)` translates the string `str` with
-  the given `textdomain` for disambiguation. The textdomain must match the
-  textdomain specified in the translation file in order to get the string
-  translated. This can be used so that a string is translated differently in
-  different contexts.
-  It is advised to use the name of the mod as textdomain whenever possible, to
-  avoid clashes with other mods.
-  This function must be given a number of arguments equal to the number of
-  arguments the translated string expects.
-  Arguments are literal strings -- they will not be translated, so if you want
-  them to be, they need to come as outputs of `minetest.translate` as well.
-
-  For instance, suppose we want to translate "@1 Wool" with "@1" being replaced
-  by the translation of "Red". We can do the following:
-
-      local S = minetest.get_translator()
-      S("@1 Wool", S("Red"))
-
-  This will be displayed as "Red Wool" on old clients and on clients that do
-  not have localization enabled. However, if we have for instance a translation
-  file named `wool.fr.tr` containing the following:
-
-      @1 Wool=Laine @1
-      Red=Rouge
-
-  this will be displayed as "Laine Rouge" on clients with a French locale.
-
-Operations on translated strings
---------------------------------
-
-The output of `minetest.translate` is a string, with escape sequences adding
-additional information to that string so that it can be translated on the
-different clients. In particular, you can't expect operations like string.length
-to work on them like you would expect them to, or string.gsub to work in the
-expected manner. However, string concatenation will still work as expected
-(note that you should only use this for things like formspecs; do not translate
-sentences by breaking them into parts; arguments should be used instead), and
-operations such as `minetest.colorize` which are also concatenation.
-
-Translation file format
------------------------
-
-A translation file has the suffix `.[lang].tr`, where `[lang]` is the language
-it corresponds to. It must be put into the `locale` subdirectory of the mod.
-The file should be a text file, with the following format:
-
-* Lines beginning with `# textdomain:` (the space is significant) can be used
-  to specify the text domain of all following translations in the file.
-* All other empty lines or lines beginning with `#` are ignored.
-* Other lines should be in the format `original=translated`. Both `original`
-  and `translated` can contain escape sequences beginning with `@` to insert
-  arguments, literal `@`, `=` or newline (See [Escapes] below).
-  There must be no extraneous whitespace around the `=` or at the beginning or
-  the end of the line.
-
-Escapes
--------
-
-Strings that need to be translated can contain several escapes, preceded by `@`.
-
-* `@@` acts as a literal `@`.
-* `@n`, where `n` is a digit between 1 and 9, is an argument for the translated
-  string that will be inlined when translated. Due to how translations are
-  implemented, the original translation string **must** have its arguments in
-  increasing order, without gaps or repetitions, starting from 1.
-* `@=` acts as a literal `=`. It is not required in strings given to
-  `minetest.translate`, but is in translation files to avoid being confused
-  with the `=` separating the original from the translation.
-* `@\n` (where the `\n` is a literal newline) acts as a literal newline.
-  As with `@=`, this escape is not required in strings given to
-  `minetest.translate`, but is in translation files.
-* `@n` acts as a literal newline as well.
-
-
-
-
-Perlin noise
-============
-
-Perlin noise creates a continuously-varying value depending on the input values.
-Usually in Minetest the input values are either 2D or 3D co-ordinates in nodes.
-The result is used during map generation to create the terrain shape, vary heat
-and humidity to distribute biomes, vary the density of decorations or vary the
-structure of ores.
-
-Structure of perlin noise
--------------------------
-
-An 'octave' is a simple noise generator that outputs a value between -1 and 1.
-The smooth wavy noise it generates has a single characteristic scale, almost
-like a 'wavelength', so on its own does not create fine detail.
-Due to this perlin noise combines several octaves to create variation on
-multiple scales. Each additional octave has a smaller 'wavelength' than the
-previous.
-
-This combination results in noise varying very roughly between -2.0 and 2.0 and
-with an average value of 0.0, so `scale` and `offset` are then used to multiply
-and offset the noise variation.
-
-The final perlin noise variation is created as follows:
-
-noise = offset + scale * (octave1 +
-                          octave2 * persistence +
-                          octave3 * persistence ^ 2 +
-                          octave4 * persistence ^ 3 +
-                          ...)
-
-Noise Parameters
-----------------
-
-Noise Parameters are commonly called `NoiseParams`.
-
-### `offset`
-
-After the multiplication by `scale` this is added to the result and is the final
-step in creating the noise value.
-Can be positive or negative.
-
-### `scale`
-
-Once all octaves have been combined, the result is multiplied by this.
-Can be positive or negative.
-
-### `spread`
-
-For octave1, this is roughly the change of input value needed for a very large
-variation in the noise value generated by octave1. It is almost like a
-'wavelength' for the wavy noise variation.
-Each additional octave has a 'wavelength' that is smaller than the previous
-octave, to create finer detail. `spread` will therefore roughly be the typical
-size of the largest structures in the final noise variation.
-
-`spread` is a vector with values for x, y, z to allow the noise variation to be
-stretched or compressed in the desired axes.
-Values are positive numbers.
-
-### `seed`
-
-This is a whole number that determines the entire pattern of the noise
-variation. Altering it enables different noise patterns to be created.
-With other parameters equal, different seeds produce different noise patterns
-and identical seeds produce identical noise patterns.
-
-For this parameter you can randomly choose any whole number. Usually it is
-preferable for this to be different from other seeds, but sometimes it is useful
-to be able to create identical noise patterns.
-
-When used in mapgen this is actually a 'seed offset', it is added to the
-'world seed' to create the seed used by the noise, to ensure the noise has a
-different pattern in different worlds.
-
-### `octaves`
-
-The number of simple noise generators that are combined.
-A whole number, 1 or more.
-Each additional octave adds finer detail to the noise but also increases the
-noise calculation load.
-3 is a typical minimum for a high quality, complex and natural-looking noise
-variation. 1 octave has a slight 'gridlike' appearence.
-
-Choose the number of octaves according to the `spread` and `lacunarity`, and the
-size of the finest detail you require. For example:
-if `spread` is 512 nodes, `lacunarity` is 2.0 and finest detail required is 16
-nodes, octaves will be 6 because the 'wavelengths' of the octaves will be
-512, 256, 128, 64, 32, 16 nodes.
-Warning: If the 'wavelength' of any octave falls below 1 an error will occur.
-
-### `persistence`
-
-Each additional octave has an amplitude that is the amplitude of the previous
-octave multiplied by `persistence`, to reduce the amplitude of finer details,
-as is often helpful and natural to do so.
-Since this controls the balance of fine detail to large-scale detail
-`persistence` can be thought of as the 'roughness' of the noise.
-
-A positive or negative non-zero number, often between 0.3 and 1.0.
-A common medium value is 0.5, such that each octave has half the amplitude of
-the previous octave.
-This may need to be tuned when altering `lacunarity`; when doing so consider
-that a common medium value is 1 / lacunarity.
-
-### `lacunarity`
-
-Each additional octave has a 'wavelength' that is the 'wavelength' of the
-previous octave multiplied by 1 / lacunarity, to create finer detail.
-'lacunarity' is often 2.0 so 'wavelength' often halves per octave.
-
-A positive number no smaller than 1.0.
-Values below 2.0 create higher quality noise at the expense of requiring more
-octaves to cover a paticular range of 'wavelengths'.
-
-### `flags`
-
-Leave this field unset for no special handling.
-Currently supported are `defaults`, `eased` and `absvalue`:
-
-#### `defaults`
-
-Specify this if you would like to keep auto-selection of eased/not-eased while
-specifying some other flags.
-
-#### `eased`
-
-Maps noise gradient values onto a quintic S-curve before performing
-interpolation. This results in smooth, rolling noise.
-Disable this (`noeased`) for sharp-looking noise with a slightly gridded
-appearence.
-If no flags are specified (or defaults is), 2D noise is eased and 3D noise is
-not eased.
-Easing a 3D noise significantly increases the noise calculation load, so use
-with restraint.
-
-#### `absvalue`
-
-The absolute value of each octave's noise variation is used when combining the
-octaves. The final perlin noise variation is created as follows:
-
-noise = offset + scale * (abs(octave1) +
-                          abs(octave2) * persistence +
-                          abs(octave3) * persistence ^ 2 +
-                          abs(octave4) * persistence ^ 3 +
-                          ...)
-
-### Format example
-
-For 2D or 3D perlin noise or perlin noise maps:
-
-    np_terrain = {
-        offset = 0,
-        scale = 1,
-        spread = {x = 500, y = 500, z = 500},
-        seed = 571347,
-        octaves = 5,
-        persist = 0.63,
-        lacunarity = 2.0,
-        flags = "defaults, absvalue",
-    }
-
-For 2D noise the Z component of `spread` is still defined but is ignored.
-A single noise parameter table can be used for 2D or 3D noise.
-
-
-
-
-Ores
-====
-
-Ore types
----------
-
-These tell in what manner the ore is generated.
-
-All default ores are of the uniformly-distributed scatter type.
-
-### `scatter`
-
-Randomly chooses a location and generates a cluster of ore.
-
-If `noise_params` is specified, the ore will be placed if the 3D perlin noise
-at that point is greater than the `noise_threshold`, giving the ability to
-create a non-equal distribution of ore.
-
-### `sheet`
-
-Creates a sheet of ore in a blob shape according to the 2D perlin noise
-described by `noise_params` and `noise_threshold`. This is essentially an
-improved version of the so-called "stratus" ore seen in some unofficial mods.
-
-This sheet consists of vertical columns of uniform randomly distributed height,
-varying between the inclusive range `column_height_min` and `column_height_max`.
-If `column_height_min` is not specified, this parameter defaults to 1.
-If `column_height_max` is not specified, this parameter defaults to `clust_size`
-for reverse compatibility. New code should prefer `column_height_max`.
-
-The `column_midpoint_factor` parameter controls the position of the column at
-which ore emanates from.
-If 1, columns grow upward. If 0, columns grow downward. If 0.5, columns grow
-equally starting from each direction.
-`column_midpoint_factor` is a decimal number ranging in value from 0 to 1. If
-this parameter is not specified, the default is 0.5.
-
-The ore parameters `clust_scarcity` and `clust_num_ores` are ignored for this
-ore type.
-
-### `puff`
-
-Creates a sheet of ore in a cloud-like puff shape.
-
-As with the `sheet` ore type, the size and shape of puffs are described by
-`noise_params` and `noise_threshold` and are placed at random vertical
-positions within the currently generated chunk.
-
-The vertical top and bottom displacement of each puff are determined by the
-noise parameters `np_puff_top` and `np_puff_bottom`, respectively.
-
-### `blob`
-
-Creates a deformed sphere of ore according to 3d perlin noise described by
-`noise_params`. The maximum size of the blob is `clust_size`, and
-`clust_scarcity` has the same meaning as with the `scatter` type.
-
-### `vein`
-
-Creates veins of ore varying in density by according to the intersection of two
-instances of 3d perlin noise with different seeds, both described by
-`noise_params`.
-
-`random_factor` varies the influence random chance has on placement of an ore
-inside the vein, which is `1` by default. Note that modifying this parameter
-may require adjusting `noise_threshold`.
-
-The parameters `clust_scarcity`, `clust_num_ores`, and `clust_size` are ignored
-by this ore type.
-
-This ore type is difficult to control since it is sensitive to small changes.
-The following is a decent set of parameters to work from:
-
-    noise_params = {
-        offset  = 0,
-        scale   = 3,
-        spread  = {x=200, y=200, z=200},
-        seed    = 5390,
-        octaves = 4,
-        persist = 0.5,
-        lacunarity = 2.0,
-        flags = "eased",
-    },
-    noise_threshold = 1.6
-
-**WARNING**: Use this ore type *very* sparingly since it is ~200x more
-computationally expensive than any other ore.
-
-### `stratum`
-
-Creates a single undulating ore stratum that is continuous across mapchunk
-borders and horizontally spans the world.
-
-The 2D perlin noise described by `noise_params` defines the Y co-ordinate of
-the stratum midpoint. The 2D perlin noise described by `np_stratum_thickness`
-defines the stratum's vertical thickness (in units of nodes). Due to being
-continuous across mapchunk borders the stratum's vertical thickness is
-unlimited.
-
-If the noise parameter `noise_params` is omitted the ore will occur from y_min
-to y_max in a simple horizontal stratum.
-
-A parameter `stratum_thickness` can be provided instead of the noise parameter
-`np_stratum_thickness`, to create a constant thickness.
-
-Leaving out one or both noise parameters makes the ore generation less
-intensive, useful when adding multiple strata.
-
-`y_min` and `y_max` define the limits of the ore generation and for performance
-reasons should be set as close together as possible but without clipping the
-stratum's Y variation.
-
-Each node in the stratum has a 1-in-`clust_scarcity` chance of being ore, so a
-solid-ore stratum would require a `clust_scarcity` of 1.
-
-The parameters `clust_num_ores`, `clust_size`, `noise_threshold` and
-`random_factor` are ignored by this ore type.
-
-Ore attributes
---------------
-
-See section [Flag Specifier Format].
-
-Currently supported flags:
-`puff_cliffs`, `puff_additive_composition`.
-
-### `puff_cliffs`
-
-If set, puff ore generation will not taper down large differences in
-displacement when approaching the edge of a puff. This flag has no effect for
-ore types other than `puff`.
-
-### `puff_additive_composition`
-
-By default, when noise described by `np_puff_top` or `np_puff_bottom` results
-in a negative displacement, the sub-column at that point is not generated. With
-this attribute set, puff ore generation will instead generate the absolute
-difference in noise displacement values. This flag has no effect for ore types
-other than `puff`.
-
-
-
-
-Decoration types
-================
-
-The varying types of decorations that can be placed.
-
-`simple`
---------
-
-Creates a 1 times `H` times 1 column of a specified node (or a random node from
-a list, if a decoration list is specified). Can specify a certain node it must
-spawn next to, such as water or lava, for example. Can also generate a
-decoration of random height between a specified lower and upper bound.
-This type of decoration is intended for placement of grass, flowers, cacti,
-papyri, waterlilies and so on.
-
-`schematic`
------------
-
-Copies a box of `MapNodes` from a specified schematic file (or raw description).
-Can specify a probability of a node randomly appearing when placed.
-This decoration type is intended to be used for multi-node sized discrete
-structures, such as trees, cave spikes, rocks, and so on.
-
-
-
-
-Schematics
-==========
-
-Schematic specifier
---------------------
-
-A schematic specifier identifies a schematic by either a filename to a
-Minetest Schematic file (`.mts`) or through raw data supplied through Lua,
-in the form of a table.  This table specifies the following fields:
-
-* The `size` field is a 3D vector containing the dimensions of the provided
-  schematic. (required field)
-* The `yslice_prob` field is a table of {ypos, prob} slice tables. A slice table
-  sets the probability of a particular horizontal slice of the schematic being
-  placed. (optional field)
-  `ypos` = 0 for the lowest horizontal slice of a schematic.
-  The default of `prob` is 255.
-* The `data` field is a flat table of MapNode tables making up the schematic,
-  in the order of `[z [y [x]]]`. (required field)
-  Each MapNode table contains:
-    * `name`: the name of the map node to place (required)
-    * `prob` (alias `param1`): the probability of this node being placed
-      (default: 255)
-    * `param2`: the raw param2 value of the node being placed onto the map
-      (default: 0)
-    * `force_place`: boolean representing if the node should forcibly overwrite
-      any previous contents (default: false)
-
-About probability values:
-
-* A probability value of `0` or `1` means that node will never appear
-  (0% chance).
-* A probability value of `254` or `255` means the node will always appear
-  (100% chance).
-* If the probability value `p` is greater than `1`, then there is a
-  `(p / 256 * 100)` percent chance that node will appear when the schematic is
-  placed on the map.
-
-Schematic attributes
---------------------
-
-See section [Flag Specifier Format].
-
-Currently supported flags: `place_center_x`, `place_center_y`, `place_center_z`,
-                           `force_placement`.
-
-* `place_center_x`: Placement of this decoration is centered along the X axis.
-* `place_center_y`: Placement of this decoration is centered along the Y axis.
-* `place_center_z`: Placement of this decoration is centered along the Z axis.
-* `force_placement`: Schematic nodes other than "ignore" will replace existing
-  nodes.
-
-
-
-
-Lua Voxel Manipulator
-=====================
-
-About VoxelManip
-----------------
-
-VoxelManip is a scripting interface to the internal 'Map Voxel Manipulator'
-facility. The purpose of this object is for fast, low-level, bulk access to
-reading and writing Map content. As such, setting map nodes through VoxelManip
-will lack many of the higher level features and concepts you may be used to
-with other methods of setting nodes. For example, nodes will not have their
-construction and destruction callbacks run, and no rollback information is
-logged.
-
-It is important to note that VoxelManip is designed for speed, and *not* ease
-of use or flexibility. If your mod requires a map manipulation facility that
-will handle 100% of all edge cases, or the use of high level node placement
-features, perhaps `minetest.set_node()` is better suited for the job.
-
-In addition, VoxelManip might not be faster, or could even be slower, for your
-specific use case. VoxelManip is most effective when setting large areas of map
-at once - for example, if only setting a 3x3x3 node area, a
-`minetest.set_node()` loop may be more optimal. Always profile code using both
-methods of map manipulation to determine which is most appropriate for your
-usage.
-
-A recent simple test of setting cubic areas showed that `minetest.set_node()`
-is faster than a VoxelManip for a 3x3x3 node cube or smaller.
-
-Using VoxelManip
-----------------
-
-A VoxelManip object can be created any time using either:
-`VoxelManip([p1, p2])`, or `minetest.get_voxel_manip([p1, p2])`.
-
-If the optional position parameters are present for either of these routines,
-the specified region will be pre-loaded into the VoxelManip object on creation.
-Otherwise, the area of map you wish to manipulate must first be loaded into the
-VoxelManip object using `VoxelManip:read_from_map()`.
-
-Note that `VoxelManip:read_from_map()` returns two position vectors. The region
-formed by these positions indicate the minimum and maximum (respectively)
-positions of the area actually loaded in the VoxelManip, which may be larger
-than the area requested. For convenience, the loaded area coordinates can also
-be queried any time after loading map data with `VoxelManip:get_emerged_area()`.
-
-Now that the VoxelManip object is populated with map data, your mod can fetch a
-copy of this data using either of two methods. `VoxelManip:get_node_at()`,
-which retrieves an individual node in a MapNode formatted table at the position
-requested is the simplest method to use, but also the slowest.
-
-Nodes in a VoxelManip object may also be read in bulk to a flat array table
-using:
-
-* `VoxelManip:get_data()` for node content (in Content ID form, see section
-  [Content IDs]),
-* `VoxelManip:get_light_data()` for node light levels, and
-* `VoxelManip:get_param2_data()` for the node type-dependent "param2" values.
-
-See section [Flat array format] for more details.
-
-It is very important to understand that the tables returned by any of the above
-three functions represent a snapshot of the VoxelManip's internal state at the
-time of the call. This copy of the data will not magically update itself if
-another function modifies the internal VoxelManip state.
-Any functions that modify a VoxelManip's contents work on the VoxelManip's
-internal state unless otherwise explicitly stated.
-
-Once the bulk data has been edited to your liking, the internal VoxelManip
-state can be set using:
-
-* `VoxelManip:set_data()` for node content (in Content ID form, see section
-  [Content IDs]),
-* `VoxelManip:set_light_data()` for node light levels, and
-* `VoxelManip:set_param2_data()` for the node type-dependent `param2` values.
-
-The parameter to each of the above three functions can use any table at all in
-the same flat array format as produced by `get_data()` etc. and is not required
-to be a table retrieved from `get_data()`.
-
-Once the internal VoxelManip state has been modified to your liking, the
-changes can be committed back to the map by calling `VoxelManip:write_to_map()`
-
-### Flat array format
-
-Let
-    `Nx = p2.X - p1.X + 1`,
-    `Ny = p2.Y - p1.Y + 1`, and
-    `Nz = p2.Z - p1.Z + 1`.
-
-Then, for a loaded region of p1..p2, this array ranges from `1` up to and
-including the value of the expression `Nx * Ny * Nz`.
-
-Positions offset from p1 are present in the array with the format of:
-
-    [
-        (0, 0, 0),   (1, 0, 0),   (2, 0, 0),   ... (Nx, 0, 0),
-        (0, 1, 0),   (1, 1, 0),   (2, 1, 0),   ... (Nx, 1, 0),
-        ...
-        (0, Ny, 0),  (1, Ny, 0),  (2, Ny, 0),  ... (Nx, Ny, 0),
-        (0, 0, 1),   (1, 0, 1),   (2, 0, 1),   ... (Nx, 0, 1),
-        ...
-        (0, Ny, 2),  (1, Ny, 2),  (2, Ny, 2),  ... (Nx, Ny, 2),
-        ...
-        (0, Ny, Nz), (1, Ny, Nz), (2, Ny, Nz), ... (Nx, Ny, Nz)
-    ]
-
-and the array index for a position p contained completely in p1..p2 is:
-
-`(p.Z - p1.Z) * Ny * Nx + (p.Y - p1.Y) * Nx + (p.X - p1.X) + 1`
-
-Note that this is the same "flat 3D array" format as
-`PerlinNoiseMap:get3dMap_flat()`.
-VoxelArea objects (see section [`VoxelArea`]) can be used to simplify calculation
-of the index for a single point in a flat VoxelManip array.
-
-### Content IDs
-
-A Content ID is a unique integer identifier for a specific node type.
-These IDs are used by VoxelManip in place of the node name string for
-`VoxelManip:get_data()` and `VoxelManip:set_data()`. You can use
-`minetest.get_content_id()` to look up the Content ID for the specified node
-name, and `minetest.get_name_from_content_id()` to look up the node name string
-for a given Content ID.
-After registration of a node, its Content ID will remain the same throughout
-execution of the mod.
-Note that the node being queried needs to have already been been registered.
-
-The following builtin node types have their Content IDs defined as constants:
-
-* `minetest.CONTENT_UNKNOWN`: ID for "unknown" nodes
-* `minetest.CONTENT_AIR`:     ID for "air" nodes
-* `minetest.CONTENT_IGNORE`:  ID for "ignore" nodes
-
-### Mapgen VoxelManip objects
-
-Inside of `on_generated()` callbacks, it is possible to retrieve the same
-VoxelManip object used by the core's Map Generator (commonly abbreviated
-Mapgen). Most of the rules previously described still apply but with a few
-differences:
-
-* The Mapgen VoxelManip object is retrieved using:
-  `minetest.get_mapgen_object("voxelmanip")`
-* This VoxelManip object already has the region of map just generated loaded
-  into it; it's not necessary to call `VoxelManip:read_from_map()` before using
-  a Mapgen VoxelManip.
-* The `on_generated()` callbacks of some mods may place individual nodes in the
-  generated area using non-VoxelManip map modification methods. Because the
-  same Mapgen VoxelManip object is passed through each `on_generated()`
-  callback, it becomes necessary for the Mapgen VoxelManip object to maintain
-  consistency with the current map state. For this reason, calling any of the
-  following functions:
-  `minetest.add_node()`, `minetest.set_node()`, or `minetest.swap_node()`
-  will also update the Mapgen VoxelManip object's internal state active on the
-  current thread.
-* After modifying the Mapgen VoxelManip object's internal buffer, it may be
-  necessary to update lighting information using either:
-  `VoxelManip:calc_lighting()` or `VoxelManip:set_lighting()`.
-
-### Other API functions operating on a VoxelManip
-
-If any VoxelManip contents were set to a liquid node,
-`VoxelManip:update_liquids()` must be called for these liquid nodes to begin
-flowing. It is recommended to call this function only after having written all
-buffered data back to the VoxelManip object, save for special situations where
-the modder desires to only have certain liquid nodes begin flowing.
-
-The functions `minetest.generate_ores()` and `minetest.generate_decorations()`
-will generate all registered decorations and ores throughout the full area
-inside of the specified VoxelManip object.
-
-`minetest.place_schematic_on_vmanip()` is otherwise identical to
-`minetest.place_schematic()`, except instead of placing the specified schematic
-directly on the map at the specified position, it will place the schematic
-inside the VoxelManip.
-
-### Notes
-
-* Attempting to read data from a VoxelManip object before map is read will
-  result in a zero-length array table for `VoxelManip:get_data()`, and an
-  "ignore" node at any position for `VoxelManip:get_node_at()`.
-* If either a region of map has not yet been generated or is out-of-bounds of
-  the map, that region is filled with "ignore" nodes.
-* Other mods, or the core itself, could possibly modify the area of map
-  currently loaded into a VoxelManip object. With the exception of Mapgen
-  VoxelManips (see above section), the internal buffers are not updated. For
-  this reason, it is strongly encouraged to complete the usage of a particular
-  VoxelManip object in the same callback it had been created.
-* If a VoxelManip object will be used often, such as in an `on_generated()`
-  callback, consider passing a file-scoped table as the optional parameter to
-  `VoxelManip:get_data()`, which serves as a static buffer the function can use
-  to write map data to instead of returning a new table each call. This greatly
-  enhances performance by avoiding unnecessary memory allocations.
-
-Methods
--------
-
-* `read_from_map(p1, p2)`:  Loads a chunk of map into the VoxelManip object
-  containing the region formed by `p1` and `p2`.
-    * returns actual emerged `pmin`, actual emerged `pmax`
-* `write_to_map([light])`: Writes the data loaded from the `VoxelManip` back to
-  the map.
-    * **important**: data must be set using `VoxelManip:set_data()` before
-      calling this.
-    * if `light` is true, then lighting is automatically recalculated.
-      The default value is true.
-      If `light` is false, no light calculations happen, and you should correct
-      all modified blocks with `minetest.fix_light()` as soon as possible.
-      Keep in mind that modifying the map where light is incorrect can cause
-      more lighting bugs.
-* `get_node_at(pos)`: Returns a `MapNode` table of the node currently loaded in
-  the `VoxelManip` at that position
-* `set_node_at(pos, node)`: Sets a specific `MapNode` in the `VoxelManip` at
-  that position.
-* `get_data([buffer])`: Retrieves the node content data loaded into the
-  `VoxelManip` object.
-    * returns raw node data in the form of an array of node content IDs
-    * if the param `buffer` is present, this table will be used to store the
-      result instead.
-* `set_data(data)`: Sets the data contents of the `VoxelManip` object
-* `update_map()`: Does nothing, kept for compatibility.
-* `set_lighting(light, [p1, p2])`: Set the lighting within the `VoxelManip` to
-  a uniform value.
-    * `light` is a table, `{day=<0...15>, night=<0...15>}`
-    * To be used only by a `VoxelManip` object from
-      `minetest.get_mapgen_object`.
-    * (`p1`, `p2`) is the area in which lighting is set, defaults to the whole
-      area if left out.
-* `get_light_data()`: Gets the light data read into the `VoxelManip` object
-    * Returns an array (indices 1 to volume) of integers ranging from `0` to
-      `255`.
-    * Each value is the bitwise combination of day and night light values
-      (`0` to `15` each).
-    * `light = day + (night * 16)`
-* `set_light_data(light_data)`: Sets the `param1` (light) contents of each node
-  in the `VoxelManip`.
-    * expects lighting data in the same format that `get_light_data()` returns
-* `get_param2_data([buffer])`: Gets the raw `param2` data read into the
-  `VoxelManip` object.
-    * Returns an array (indices 1 to volume) of integers ranging from `0` to
-      `255`.
-    * If the param `buffer` is present, this table will be used to store the
-      result instead.
-* `set_param2_data(param2_data)`: Sets the `param2` contents of each node in
-  the `VoxelManip`.
-* `calc_lighting([p1, p2], [propagate_shadow])`:  Calculate lighting within the
-  `VoxelManip`.
-    * To be used only by a `VoxelManip` object from
-      `minetest.get_mapgen_object`.
-    * (`p1`, `p2`) is the area in which lighting is set, defaults to the whole
-      area if left out or nil. For almost all uses these should be left out
-      or nil to use the default.
-    * `propagate_shadow` is an optional boolean deciding whether shadows in a
-      generated mapchunk above are propagated down into the mapchunk, defaults
-      to `true` if left out.
-* `update_liquids()`: Update liquid flow
-* `was_modified()`: Returns `true` or `false` if the data in the voxel
-  manipulator had been modified since the last read from map, due to a call to
-  `minetest.set_data()` on the loaded area elsewhere.
-* `get_emerged_area()`: Returns actual emerged minimum and maximum positions.
-
-`VoxelArea`
------------
-
-A helper class for voxel areas.
-It can be created via `VoxelArea:new{MinEdge = pmin, MaxEdge = pmax}`.
-The coordinates are *inclusive*, like most other things in Minetest.
-
-### Methods
-
-* `getExtent()`: returns a 3D vector containing the size of the area formed by
-  `MinEdge` and `MaxEdge`.
-* `getVolume()`: returns the volume of the area formed by `MinEdge` and
-  `MaxEdge`.
-* `index(x, y, z)`: returns the index of an absolute position in a flat array
-  starting at `1`.
-    * `x`, `y` and `z` must be integers to avoid an incorrect index result.
-    * The position (x, y, z) is not checked for being inside the area volume,
-      being outside can cause an incorrect index result.
-    * Useful for things like `VoxelManip`, raw Schematic specifiers,
-      `PerlinNoiseMap:get2d`/`3dMap`, and so on.
-* `indexp(p)`: same functionality as `index(x, y, z)` but takes a vector.
-    * As with `index(x, y, z)`, the components of `p` must be integers, and `p`
-      is not checked for being inside the area volume.
-* `position(i)`: returns the absolute position vector corresponding to index
-  `i`.
-* `contains(x, y, z)`: check if (`x`,`y`,`z`) is inside area formed by
-  `MinEdge` and `MaxEdge`.
-* `containsp(p)`: same as above, except takes a vector
-* `containsi(i)`: same as above, except takes an index `i`
-* `iter(minx, miny, minz, maxx, maxy, maxz)`: returns an iterator that returns
-  indices.
-    * from (`minx`,`miny`,`minz`) to (`maxx`,`maxy`,`maxz`) in the order of
-      `[z [y [x]]]`.
-* `iterp(minp, maxp)`: same as above, except takes a vector
-
-### Y stride and z stride of a flat array
-
-For a particular position in a voxel area, whose flat array index is known,
-it is often useful to know the index of a neighboring or nearby position.
-The table below shows the changes of index required for 1 node movements along
-the axes in a voxel area:
-
-    Movement    Change of index
-    +x          +1
-    -x          -1
-    +y          +ystride
-    -y          -ystride
-    +z          +zstride
-    -z          -zstride
-
-If, for example:
-
-    local area = VoxelArea:new{MinEdge = emin, MaxEdge = emax}
-
-The values of `ystride` and `zstride` can be obtained using `area.ystride` and
-`area.zstride`.
-
-
-
-
-Mapgen objects
-==============
-
-A mapgen object is a construct used in map generation. Mapgen objects can be
-used by an `on_generate` callback to speed up operations by avoiding
-unnecessary recalculations, these can be retrieved using the
-`minetest.get_mapgen_object()` function. If the requested Mapgen object is
-unavailable, or `get_mapgen_object()` was called outside of an `on_generate()`
-callback, `nil` is returned.
-
-The following Mapgen objects are currently available:
-
-### `voxelmanip`
-
-This returns three values; the `VoxelManip` object to be used, minimum and
-maximum emerged position, in that order. All mapgens support this object.
-
-### `heightmap`
-
-Returns an array containing the y coordinates of the ground levels of nodes in
-the most recently generated chunk by the current mapgen.
-
-### `biomemap`
-
-Returns an array containing the biome IDs of nodes in the most recently
-generated chunk by the current mapgen.
-
-### `heatmap`
-
-Returns an array containing the temperature values of nodes in the most
-recently generated chunk by the current mapgen.
-
-### `humiditymap`
-
-Returns an array containing the humidity values of nodes in the most recently
-generated chunk by the current mapgen.
-
-### `gennotify`
-
-Returns a table mapping requested generation notification types to arrays of
-positions at which the corresponding generated structures are located within
-the current chunk. To set the capture of positions of interest to be recorded
-on generate, use `minetest.set_gen_notify()`.
-For decorations, the returned positions are the ground surface 'place_on'
-nodes, not the decorations themselves. A 'simple' type decoration is often 1
-node above the returned position and possibly displaced by 'place_offset_y'.
-
-Possible fields of the table returned are:
-
-* `dungeon`
-* `temple`
-* `cave_begin`
-* `cave_end`
-* `large_cave_begin`
-* `large_cave_end`
-* `decoration`
-
-Decorations have a key in the format of `"decoration#id"`, where `id` is the
-numeric unique decoration ID as returned by `minetest.get_decoration_id`.
-
-
-
-
-Registered entities
-===================
-
-Functions receive a "luaentity" as `self`:
-
-* It has the member `.name`, which is the registered name `("mod:thing")`
-* It has the member `.object`, which is an `ObjectRef` pointing to the object
-* The original prototype stuff is visible directly via a metatable
-
-Callbacks:
-
-* `on_activate(self, staticdata, dtime_s)`
-    * Called when the object is instantiated.
-    * `dtime_s` is the time passed since the object was unloaded, which can be
-      used for updating the entity state.
-* `on_step(self, dtime)`
-    * Called on every server tick, after movement and collision processing.
-      `dtime` is usually 0.1 seconds, as per the `dedicated_server_step` setting
-      in `minetest.conf`.
-* `on_punch(self, puncher, time_from_last_punch, tool_capabilities, dir, damage)`
-    * Called when somebody punches the object.
-    * Note that you probably want to handle most punches using the automatic
-      armor group system.
-    * `puncher`: an `ObjectRef` (can be `nil`)
-    * `time_from_last_punch`: Meant for disallowing spamming of clicks
-      (can be `nil`).
-    * `tool_capabilities`: capability table of used tool (can be `nil`)
-    * `dir`: unit vector of direction of punch. Always defined. Points from the
-      puncher to the punched.
-    * `damage`: damage that will be done to entity.
-    * Can return `true` to prevent the default damage mechanism.
-* `on_death(self, killer)`
-    * Called when the object dies.
-    * `killer`: an `ObjectRef` (can be `nil`)
-* `on_rightclick(self, clicker)`
-* `on_attach_child(self, child)`
-    * `child`: an `ObjectRef` of the child that attaches
-* `on_detach_child(self, child)`
-    * `child`: an `ObjectRef` of the child that detaches
-* `on_detach(self, parent)`
-    * `parent`: an `ObjectRef` (can be `nil`) from where it got detached
-    * This happens before the parent object is removed from the world
-* `get_staticdata(self)`
-    * Should return a string that will be passed to `on_activate` when the
-      object is instantiated the next time.
-
-
-
-
-L-system trees
-==============
-
-Tree definition
----------------
-
-    treedef={
-        axiom,         --string  initial tree axiom
-        rules_a,       --string  rules set A
-        rules_b,       --string  rules set B
-        rules_c,       --string  rules set C
-        rules_d,       --string  rules set D
-        trunk,         --string  trunk node name
-        leaves,        --string  leaves node name
-        leaves2,       --string  secondary leaves node name
-        leaves2_chance,--num     chance (0-100) to replace leaves with leaves2
-        angle,         --num     angle in deg
-        iterations,    --num     max # of iterations, usually 2 -5
-        random_level,  --num     factor to lower nr of iterations, usually 0 - 3
-        trunk_type,    --string  single/double/crossed) type of trunk: 1 node,
-                       --        2x2 nodes or 3x3 in cross shape
-        thin_branches, --boolean true -> use thin (1 node) branches
-        fruit,         --string  fruit node name
-        fruit_chance,  --num     chance (0-100) to replace leaves with fruit node
-        seed,          --num     random seed, if no seed is provided, the engine
-                                 will create one.
-    }
-
-Key for special L-System symbols used in axioms
------------------------------------------------
-
-* `G`: move forward one unit with the pen up
-* `F`: move forward one unit with the pen down drawing trunks and branches
-* `f`: move forward one unit with the pen down drawing leaves (100% chance)
-* `T`: move forward one unit with the pen down drawing trunks only
-* `R`: move forward one unit with the pen down placing fruit
-* `A`: replace with rules set A
-* `B`: replace with rules set B
-* `C`: replace with rules set C
-* `D`: replace with rules set D
-* `a`: replace with rules set A, chance 90%
-* `b`: replace with rules set B, chance 80%
-* `c`: replace with rules set C, chance 70%
-* `d`: replace with rules set D, chance 60%
-* `+`: yaw the turtle right by `angle` parameter
-* `-`: yaw the turtle left by `angle` parameter
-* `&`: pitch the turtle down by `angle` parameter
-* `^`: pitch the turtle up by `angle` parameter
-* `/`: roll the turtle to the right by `angle` parameter
-* `*`: roll the turtle to the left by `angle` parameter
-* `[`: save in stack current state info
-* `]`: recover from stack state info
-
-Example
--------
-
-Spawn a small apple tree:
-
-    pos = {x=230,y=20,z=4}
-    apple_tree={
-        axiom="FFFFFAFFBF",
-        rules_a="[&&&FFFFF&&FFFF][&&&++++FFFFF&&FFFF][&&&----FFFFF&&FFFF]",
-        rules_b="[&&&++FFFFF&&FFFF][&&&--FFFFF&&FFFF][&&&------FFFFF&&FFFF]",
-        trunk="default:tree",
-        leaves="default:leaves",
-        angle=30,
-        iterations=2,
-        random_level=0,
-        trunk_type="single",
-        thin_branches=true,
-        fruit_chance=10,
-        fruit="default:apple"
-    }
-    minetest.spawn_tree(pos,apple_tree)
-
-
-
-
-'minetest' namespace reference
-==============================
-
-Utilities
----------
-
-* `minetest.get_current_modname()`: returns the currently loading mod's name,
-  when loading a mod.
-* `minetest.get_modpath(modname)`: returns e.g.
-  `"/home/user/.minetest/usermods/modname"`.
-    * Useful for loading additional `.lua` modules or static data from mod
-* `minetest.get_modnames()`: returns a list of installed mods
-    * Return a list of installed mods, sorted alphabetically
-* `minetest.get_worldpath()`: returns e.g. `"/home/user/.minetest/world"`
-    * Useful for storing custom data
-* `minetest.is_singleplayer()`
-* `minetest.features`: Table containing API feature flags
-
-      {
-          glasslike_framed = true,  -- 0.4.7
-          nodebox_as_selectionbox = true,  -- 0.4.7
-          get_all_craft_recipes_works = true,  -- 0.4.7
-          -- The transparency channel of textures can optionally be used on
-          -- nodes (0.4.7)
-          use_texture_alpha = true,
-          -- Tree and grass ABMs are no longer done from C++ (0.4.8)
-          no_legacy_abms = true,
-          -- Texture grouping is possible using parentheses (0.4.11)
-          texture_names_parens = true,
-          -- Unique Area ID for AreaStore:insert_area (0.4.14)
-          area_store_custom_ids = true,
-          -- add_entity supports passing initial staticdata to on_activate
-          -- (0.4.16)
-          add_entity_with_staticdata = true,
-          -- Chat messages are no longer predicted (0.4.16)
-          no_chat_message_prediction = true,
-          -- The transparency channel of textures can optionally be used on
-          -- objects (ie: players and lua entities) (5.0.0)
-          object_use_texture_alpha = true,
-          -- Object selectionbox is settable independently from collisionbox
-          -- (5.0.0)
-          object_independent_selectionbox = true,
-          -- Specifies whether binary data can be uploaded or downloaded using
-          -- the HTTP API (5.1.0)
-          httpfetch_binary_data = true,
-          -- Whether formspec_version[<version>] may be used (5.1.0)
-          formspec_version_element = true,
-          -- Whether AreaStore's IDs are kept on save/load (5.1.0)
-          area_store_persistent_ids = true,
-          -- Whether minetest.find_path is functional (5.2.0)
-          pathfinder_works = true,
-      }
-
-* `minetest.has_feature(arg)`: returns `boolean, missing_features`
-    * `arg`: string or table in format `{foo=true, bar=true}`
-    * `missing_features`: `{foo=true, bar=true}`
-* `minetest.get_player_information(player_name)`: Table containing information
-  about a player. Example return value:
-
-      {
-          address = "127.0.0.1",     -- IP address of client
-          ip_version = 4,            -- IPv4 / IPv6
-          min_rtt = 0.01,            -- minimum round trip time
-          max_rtt = 0.2,             -- maximum round trip time
-          avg_rtt = 0.02,            -- average round trip time
-          min_jitter = 0.01,         -- minimum packet time jitter
-          max_jitter = 0.5,          -- maximum packet time jitter
-          avg_jitter = 0.03,         -- average packet time jitter
-          connection_uptime = 200,   -- seconds since client connected
-          protocol_version = 32,     -- protocol version used by client
-          formspec_version = 2,      -- supported formspec version
-          -- following information is available on debug build only!!!
-          -- DO NOT USE IN MODS
-          --ser_vers = 26,             -- serialization version used by client
-          --major = 0,                 -- major version number
-          --minor = 4,                 -- minor version number
-          --patch = 10,                -- patch version number
-          --vers_string = "0.4.9-git", -- full version string
-          --state = "Active"           -- current client state
-      }
-
-* `minetest.mkdir(path)`: returns success.
-    * Creates a directory specified by `path`, creating parent directories
-      if they don't exist.
-* `minetest.get_dir_list(path, [is_dir])`: returns list of entry names
-    * is_dir is one of:
-        * nil: return all entries,
-        * true: return only subdirectory names, or
-        * false: return only file names.
-* `minetest.safe_file_write(path, content)`: returns boolean indicating success
-    * Replaces contents of file at path with new contents in a safe (atomic)
-      way. Use this instead of below code when writing e.g. database files:
-      `local f = io.open(path, "wb"); f:write(content); f:close()`
-* `minetest.get_version()`: returns a table containing components of the
-   engine version.  Components:
-    * `project`: Name of the project, eg, "Minetest"
-    * `string`: Simple version, eg, "1.2.3-dev"
-    * `hash`: Full git version (only set if available),
-      eg, "1.2.3-dev-01234567-dirty".
-  Use this for informational purposes only. The information in the returned
-  table does not represent the capabilities of the engine, nor is it
-  reliable or verifiable. Compatible forks will have a different name and
-  version entirely. To check for the presence of engine features, test
-  whether the functions exported by the wanted features exist. For example:
-  `if minetest.check_for_falling then ... end`.
-* `minetest.sha1(data, [raw])`: returns the sha1 hash of data
-    * `data`: string of data to hash
-    * `raw`: return raw bytes instead of hex digits, default: false
-
-Logging
--------
-
-* `minetest.debug(...)`
-    * Equivalent to `minetest.log(table.concat({...}, "\t"))`
-* `minetest.log([level,] text)`
-    * `level` is one of `"none"`, `"error"`, `"warning"`, `"action"`,
-      `"info"`, or `"verbose"`.  Default is `"none"`.
-
-Registration functions
-----------------------
-
-Call these functions only at load time!
-
-### Environment
-
-* `minetest.register_node(name, node definition)`
-* `minetest.register_craftitem(name, item definition)`
-* `minetest.register_tool(name, item definition)`
-* `minetest.override_item(name, redefinition)`
-    * Overrides fields of an item registered with register_node/tool/craftitem.
-    * Note: Item must already be defined, (opt)depend on the mod defining it.
-    * Example: `minetest.override_item("default:mese",
-      {light_source=minetest.LIGHT_MAX})`
-* `minetest.unregister_item(name)`
-    * Unregisters the item from the engine, and deletes the entry with key
-      `name` from `minetest.registered_items` and from the associated item table
-      according to its nature: `minetest.registered_nodes`, etc.
-* `minetest.register_entity(name, entity definition)`
-* `minetest.register_abm(abm definition)`
-* `minetest.register_lbm(lbm definition)`
-* `minetest.register_alias(alias, original_name)`
-    * Also use this to set the 'mapgen aliases' needed in a game for the core
-      mapgens. See [Mapgen aliases] section above.
-* `minetest.register_alias_force(alias, original_name)`
-* `minetest.register_ore(ore definition)`
-    * Returns an integer object handle uniquely identifying the registered
-      ore on success.
-    * The order of ore registrations determines the order of ore generation.
-* `minetest.register_biome(biome definition)`
-    * Returns an integer object handle uniquely identifying the registered
-      biome on success. To get the biome ID, use `minetest.get_biome_id`.
-* `minetest.unregister_biome(name)`
-    * Unregisters the biome from the engine, and deletes the entry with key
-      `name` from `minetest.registered_biomes`.
-    * Warning: This alters the biome to biome ID correspondences, so any
-      decorations or ores using the 'biomes' field must afterwards be cleared
-      and re-registered.
-* `minetest.register_decoration(decoration definition)`
-    * Returns an integer object handle uniquely identifying the registered
-      decoration on success. To get the decoration ID, use
-      `minetest.get_decoration_id`.
-    * The order of decoration registrations determines the order of decoration
-      generation.
-* `minetest.register_schematic(schematic definition)`
-    * Returns an integer object handle uniquely identifying the registered
-      schematic on success.
-    * If the schematic is loaded from a file, the `name` field is set to the
-      filename.
-    * If the function is called when loading the mod, and `name` is a relative
-      path, then the current mod path will be prepended to the schematic
-      filename.
-* `minetest.clear_registered_biomes()`
-    * Clears all biomes currently registered.
-    * Warning: Clearing and re-registering biomes alters the biome to biome ID
-      correspondences, so any decorations or ores using the 'biomes' field must
-      afterwards be cleared and re-registered.
-* `minetest.clear_registered_decorations()`
-    * Clears all decorations currently registered.
-* `minetest.clear_registered_ores()`
-    * Clears all ores currently registered.
-* `minetest.clear_registered_schematics()`
-    * Clears all schematics currently registered.
-
-### Gameplay
-
-* `minetest.register_craft(recipe)`
-    * Check recipe table syntax for different types below.
-* `minetest.clear_craft(recipe)`
-    * Will erase existing craft based either on output item or on input recipe.
-    * Specify either output or input only. If you specify both, input will be
-      ignored. For input use the same recipe table syntax as for
-      `minetest.register_craft(recipe)`. For output specify only the item,
-      without a quantity.
-    * Returns false if no erase candidate could be found, otherwise returns true.
-    * **Warning**! The type field ("shaped", "cooking" or any other) will be
-      ignored if the recipe contains output. Erasing is then done independently
-      from the crafting method.
-* `minetest.register_chatcommand(cmd, chatcommand definition)`
-* `minetest.override_chatcommand(name, redefinition)`
-    * Overrides fields of a chatcommand registered with `register_chatcommand`.
-* `minetest.unregister_chatcommand(name)`
-    * Unregisters a chatcommands registered with `register_chatcommand`.
-* `minetest.register_privilege(name, definition)`
-    * `definition` can be a description or a definition table (see [Privilege
-      definition]).
-    * If it is a description, the priv will be granted to singleplayer and admin
-      by default.
-    * To allow players with `basic_privs` to grant, see the `basic_privs`
-      minetest.conf setting.
-* `minetest.register_authentication_handler(authentication handler definition)`
-    * Registers an auth handler that overrides the builtin one.
-    * This function can be called by a single mod once only.
-
-Global callback registration functions
---------------------------------------
-
-Call these functions only at load time!
-
-* `minetest.register_globalstep(function(dtime))`
-    * Called every server step, usually interval of 0.1s
-* `minetest.register_on_mods_loaded(function())`
-    * Called after mods have finished loading and before the media is cached or the
-      aliases handled.
-* `minetest.register_on_shutdown(function())`
-    * Called before server shutdown
-    * **Warning**: If the server terminates abnormally (i.e. crashes), the
-      registered callbacks **will likely not be run**. Data should be saved at
-      semi-frequent intervals as well as on server shutdown.
-* `minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack, pointed_thing))`
-    * Called when a node has been placed
-    * If return `true` no item is taken from `itemstack`
-    * `placer` may be any valid ObjectRef or nil.
-    * **Not recommended**; use `on_construct` or `after_place_node` in node
-      definition whenever possible.
-* `minetest.register_on_dignode(function(pos, oldnode, digger))`
-    * Called when a node has been dug.
-    * **Not recommended**; Use `on_destruct` or `after_dig_node` in node
-      definition whenever possible.
-* `minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing))`
-    * Called when a node is punched
-* `minetest.register_on_generated(function(minp, maxp, blockseed))`
-    * Called after generating a piece of world. Modifying nodes inside the area
-      is a bit faster than usually.
-* `minetest.register_on_newplayer(function(ObjectRef))`
-    * Called after a new player has been created
-* `minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage))`
-    * Called when a player is punched
-    * Note: This callback is invoked even if the punched player is dead.
-    * `player`: ObjectRef - Player that was punched
-    * `hitter`: ObjectRef - Player that hit
-    * `time_from_last_punch`: Meant for disallowing spamming of clicks
-      (can be nil).
-    * `tool_capabilities`: Capability table of used tool (can be nil)
-    * `dir`: Unit vector of direction of punch. Always defined. Points from
-      the puncher to the punched.
-    * `damage`: Number that represents the damage calculated by the engine
-    * should return `true` to prevent the default damage mechanism
-* `minetest.register_on_player_hpchange(function(player, hp_change, reason), modifier)`
-    * Called when the player gets damaged or healed
-    * `player`: ObjectRef of the player
-    * `hp_change`: the amount of change. Negative when it is damage.
-    * `reason`: a PlayerHPChangeReason table.
-        * The `type` field will have one of the following values:
-            * `set_hp`: A mod or the engine called `set_hp` without
-                        giving a type - use this for custom damage types.
-            * `punch`: Was punched. `reason.object` will hold the puncher, or nil if none.
-            * `fall`
-            * `node_damage`: `damage_per_second` from a neighbouring node.
-                             `reason.node` will hold the node name or nil.
-            * `drown`
-            * `respawn`
-        * Any of the above types may have additional fields from mods.
-        * `reason.from` will be `mod` or `engine`.
-    * `modifier`: when true, the function should return the actual `hp_change`.
-       Note: modifiers only get a temporary `hp_change` that can be modified by later modifiers.
-       Modifiers can return true as a second argument to stop the execution of further functions.
-       Non-modifiers receive the final HP change calculated by the modifiers.
-* `minetest.register_on_dieplayer(function(ObjectRef, reason))`
-    * Called when a player dies
-    * `reason`: a PlayerHPChangeReason table, see register_on_player_hpchange
-* `minetest.register_on_respawnplayer(function(ObjectRef))`
-    * Called when player is to be respawned
-    * Called _before_ repositioning of player occurs
-    * return true in func to disable regular player placement
-* `minetest.register_on_prejoinplayer(function(name, ip))`
-    * Called before a player joins the game
-    * If it returns a string, the player is disconnected with that string as
-      reason.
-* `minetest.register_on_joinplayer(function(ObjectRef))`
-    * Called when a player joins the game
-* `minetest.register_on_leaveplayer(function(ObjectRef, timed_out))`
-    * Called when a player leaves the game
-    * `timed_out`: True for timeout, false for other reasons.
-* `minetest.register_on_auth_fail(function(name, ip))`
-    * Called when a client attempts to log into an account but supplies the
-      wrong password.
-    * `ip`: The IP address of the client.
-    * `name`: The account the client attempted to log into.
-* `minetest.register_on_cheat(function(ObjectRef, cheat))`
-    * Called when a player cheats
-    * `cheat`: `{type=<cheat_type>}`, where `<cheat_type>` is one of:
-        * `moved_too_fast`
-        * `interacted_too_far`
-        * `interacted_while_dead`
-        * `finished_unknown_dig`
-        * `dug_unbreakable`
-        * `dug_too_fast`
-* `minetest.register_on_chat_message(function(name, message))`
-    * Called always when a player says something
-    * Return `true` to mark the message as handled, which means that it will
-      not be sent to other players.
-* `minetest.register_on_player_receive_fields(function(player, formname, fields))`
-    * Called when the server received input from `player` in a formspec with
-      the given `formname`. Specifically, this is called on any of the
-      following events:
-          * a button was pressed,
-          * Enter was pressed while the focus was on a text field
-          * a checkbox was toggled,
-          * something was selecteed in a drop-down list,
-          * a different tab was selected,
-          * selection was changed in a textlist or table,
-          * an entry was double-clicked in a textlist or table,
-          * a scrollbar was moved, or
-          * the form was actively closed by the player.
-    * Fields are sent for formspec elements which define a field. `fields`
-      is a table containing each formspecs element value (as string), with
-      the `name` parameter as index for each. The value depends on the
-      formspec element type:
-        * `animated_image`: Returns the index of the current frame.
-        * `button` and variants: If pressed, contains the user-facing button
-          text as value. If not pressed, is `nil`
-        * `field`, `textarea` and variants: Text in the field
-        * `dropdown`: Text of selected item
-        * `tabheader`: Tab index, starting with `"1"` (only if tab changed)
-        * `checkbox`: `"true"` if checked, `"false"` if unchecked
-        * `textlist`: See `minetest.explode_textlist_event`
-        * `table`: See `minetest.explode_table_event`
-        * `scrollbar`: See `minetest.explode_scrollbar_event`
-        * Special case: `["quit"]="true"` is sent when the user actively
-          closed the form by mouse click, keypress or through a button_exit[]
-          element.
-        * Special case: `["key_enter"]="true"` is sent when the user pressed
-          the Enter key and the focus was either nowhere (causing the formspec
-          to be closed) or on a button. If the focus was on a text field,
-          additionally, the index `key_enter_field` contains the name of the
-          text field. See also: `field_close_on_enter`.
-    * Newest functions are called first
-    * If function returns `true`, remaining functions are not called
-* `minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv))`
-    * Called when `player` crafts something
-    * `itemstack` is the output
-    * `old_craft_grid` contains the recipe (Note: the one in the inventory is
-      cleared).
-    * `craft_inv` is the inventory with the crafting grid
-    * Return either an `ItemStack`, to replace the output, or `nil`, to not
-      modify it.
-* `minetest.register_craft_predict(function(itemstack, player, old_craft_grid, craft_inv))`
-    * The same as before, except that it is called before the player crafts, to
-      make craft prediction, and it should not change anything.
-* `minetest.register_allow_player_inventory_action(function(player, action, inventory, inventory_info))`
-    * Determinates how much of a stack may be taken, put or moved to a
-      player inventory.
-    * `player` (type `ObjectRef`) is the player who modified the inventory
-      `inventory` (type `InvRef`).
-    * List of possible `action` (string) values and their
-      `inventory_info` (table) contents:
-        * `move`: `{from_list=string, to_list=string, from_index=number, to_index=number, count=number}`
-        * `put`:  `{listname=string, index=number, stack=ItemStack}`
-        * `take`: Same as `put`
-    * Return a numeric value to limit the amount of items to be taken, put or
-      moved. A value of `-1` for `take` will make the source stack infinite.
-* `minetest.register_on_player_inventory_action(function(player, action, inventory, inventory_info))`
-    * Called after a take, put or move event from/to/in a player inventory
-    * Function arguments: see `minetest.register_allow_player_inventory_action`
-    * Does not accept or handle any return value.
-* `minetest.register_on_protection_violation(function(pos, name))`
-    * Called by `builtin` and mods when a player violates protection at a
-      position (eg, digs a node or punches a protected entity).
-    * The registered functions can be called using
-      `minetest.record_protection_violation`.
-    * The provided function should check that the position is protected by the
-      mod calling this function before it prints a message, if it does, to
-      allow for multiple protection mods.
-* `minetest.register_on_item_eat(function(hp_change, replace_with_item, itemstack, user, pointed_thing))`
-    * Called when an item is eaten, by `minetest.item_eat`
-    * Return `itemstack` to cancel the default item eat response (i.e.: hp increase).
-* `minetest.register_on_priv_grant(function(name, granter, priv))`
-    * Called when `granter` grants the priv `priv` to `name`.
-    * Note that the callback will be called twice if it's done by a player,
-      once with granter being the player name, and again with granter being nil.
-* `minetest.register_on_priv_revoke(function(name, revoker, priv))`
-    * Called when `revoker` revokes the priv `priv` from `name`.
-    * Note that the callback will be called twice if it's done by a player,
-      once with revoker being the player name, and again with revoker being nil.
-* `minetest.register_can_bypass_userlimit(function(name, ip))`
-    * Called when `name` user connects with `ip`.
-    * Return `true` to by pass the player limit
-* `minetest.register_on_modchannel_message(function(channel_name, sender, message))`
-    * Called when an incoming mod channel message is received
-    * You should have joined some channels to receive events.
-    * If message comes from a server mod, `sender` field is an empty string.
-
-Setting-related
----------------
-
-* `minetest.settings`: Settings object containing all of the settings from the
-  main config file (`minetest.conf`).
-* `minetest.setting_get_pos(name)`: Loads a setting from the main settings and
-  parses it as a position (in the format `(1,2,3)`). Returns a position or nil.
-
-Authentication
---------------
-
-* `minetest.string_to_privs(str[, delim])`:
-    * Converts string representation of privs into table form
-    * `delim`: String separating the privs. Defaults to `","`.
-    * Returns `{ priv1 = true, ... }`
-* `minetest.privs_to_string(privs[, delim])`:
-    * Returns the string representation of `privs`
-    * `delim`: String to delimit privs. Defaults to `","`.
-* `minetest.get_player_privs(name) -> {priv1=true,...}`
-* `minetest.check_player_privs(player_or_name, ...)`:
-  returns `bool, missing_privs`
-    * A quickhand for checking privileges.
-    * `player_or_name`: Either a Player object or the name of a player.
-    * `...` is either a list of strings, e.g. `"priva", "privb"` or
-      a table, e.g. `{ priva = true, privb = true }`.
-
-* `minetest.check_password_entry(name, entry, password)`
-    * Returns true if the "password entry" for a player with name matches given
-      password, false otherwise.
-    * The "password entry" is the password representation generated by the
-      engine as returned as part of a `get_auth()` call on the auth handler.
-    * Only use this function for making it possible to log in via password from
-      external protocols such as IRC, other uses are frowned upon.
-* `minetest.get_password_hash(name, raw_password)`
-    * Convert a name-password pair to a password hash that Minetest can use.
-    * The returned value alone is not a good basis for password checks based
-      on comparing the password hash in the database with the password hash
-      from the function, with an externally provided password, as the hash
-      in the db might use the new SRP verifier format.
-    * For this purpose, use `minetest.check_password_entry` instead.
-* `minetest.get_player_ip(name)`: returns an IP address string for the player
-  `name`.
-    * The player needs to be online for this to be successful.
-
-* `minetest.get_auth_handler()`: Return the currently active auth handler
-    * See the [Authentication handler definition]
-    * Use this to e.g. get the authentication data for a player:
-      `local auth_data = minetest.get_auth_handler().get_auth(playername)`
-* `minetest.notify_authentication_modified(name)`
-    * Must be called by the authentication handler for privilege changes.
-    * `name`: string; if omitted, all auth data should be considered modified
-* `minetest.set_player_password(name, password_hash)`: Set password hash of
-  player `name`.
-* `minetest.set_player_privs(name, {priv1=true,...})`: Set privileges of player
-  `name`.
-* `minetest.auth_reload()`
-    * See `reload()` in authentication handler definition
-
-`minetest.set_player_password`, `minetest.set_player_privs`,
-`minetest.get_player_privs` and `minetest.auth_reload` call the authentication
-handler.
-
-Chat
-----
-
-* `minetest.chat_send_all(text)`
-* `minetest.chat_send_player(name, text)`
-* `minetest.format_chat_message(name, message)`
-    * Used by the server to format a chat message, based on the setting `chat_message_format`.
-      Refer to the documentation of the setting for a list of valid placeholders.
-    * Takes player name and message, and returns the formatted string to be sent to players.
-    * Can be redefined by mods if required, for things like colored names or messages.
-    * **Only** the first occurrence of each placeholder will be replaced.
-
-Environment access
-------------------
-
-* `minetest.set_node(pos, node)`
-* `minetest.add_node(pos, node)`: alias to `minetest.set_node`
-    * Set node at position `pos`
-    * `node`: table `{name=string, param1=number, param2=number}`
-    * If param1 or param2 is omitted, it's set to `0`.
-    * e.g. `minetest.set_node({x=0, y=10, z=0}, {name="default:wood"})`
-* `minetest.bulk_set_node({pos1, pos2, pos3, ...}, node)`
-    * Set node on all positions set in the first argument.
-    * e.g. `minetest.bulk_set_node({{x=0, y=1, z=1}, {x=1, y=2, z=2}}, {name="default:stone"})`
-    * For node specification or position syntax see `minetest.set_node` call
-    * Faster than set_node due to single call, but still considerably slower
-      than Lua Voxel Manipulators (LVM) for large numbers of nodes.
-      Unlike LVMs, this will call node callbacks. It also allows setting nodes
-      in spread out positions which would cause LVMs to waste memory.
-      For setting a cube, this is 1.3x faster than set_node whereas LVM is 20
-      times faster.
-* `minetest.swap_node(pos, node)`
-    * Set node at position, but don't remove metadata
-* `minetest.remove_node(pos)`
-    * By default it does the same as `minetest.set_node(pos, {name="air"})`
-* `minetest.get_node(pos)`
-    * Returns the node at the given position as table in the format
-      `{name="node_name", param1=0, param2=0}`,
-      returns `{name="ignore", param1=0, param2=0}` for unloaded areas.
-* `minetest.get_node_or_nil(pos)`
-    * Same as `get_node` but returns `nil` for unloaded areas.
-* `minetest.get_node_light(pos, timeofday)`
-    * Gets the light value at the given position. Note that the light value
-      "inside" the node at the given position is returned, so you usually want
-      to get the light value of a neighbor.
-    * `pos`: The position where to measure the light.
-    * `timeofday`: `nil` for current time, `0` for night, `0.5` for day
-    * Returns a number between `0` and `15` or `nil`
-* `minetest.place_node(pos, node)`
-    * Place node with the same effects that a player would cause
-* `minetest.dig_node(pos)`
-    * Dig node with the same effects that a player would cause
-    * Returns `true` if successful, `false` on failure (e.g. protected location)
-* `minetest.punch_node(pos)`
-    * Punch node with the same effects that a player would cause
-* `minetest.spawn_falling_node(pos)`
-    * Change node into falling node
-    * Returns `true` if successful, `false` on failure
-
-* `minetest.find_nodes_with_meta(pos1, pos2)`
-    * Get a table of positions of nodes that have metadata within a region
-      {pos1, pos2}.
-* `minetest.get_meta(pos)`
-    * Get a `NodeMetaRef` at that position
-* `minetest.get_node_timer(pos)`
-    * Get `NodeTimerRef`
-
-* `minetest.add_entity(pos, name, [staticdata])`: Spawn Lua-defined entity at
-  position.
-    * Returns `ObjectRef`, or `nil` if failed
-* `minetest.add_item(pos, item)`: Spawn item
-    * Returns `ObjectRef`, or `nil` if failed
-* `minetest.get_player_by_name(name)`: Get an `ObjectRef` to a player
-* `minetest.get_objects_inside_radius(pos, radius)`: returns a list of
-  ObjectRefs.
-    * `radius`: using an euclidean metric
-* `minetest.set_timeofday(val)`
-    * `val` is between `0` and `1`; `0` for midnight, `0.5` for midday
-* `minetest.get_timeofday()`
-* `minetest.get_gametime()`: returns the time, in seconds, since the world was
-  created.
-* `minetest.get_day_count()`: returns number days elapsed since world was
-  created.
-    * accounts for time changes.
-* `minetest.find_node_near(pos, radius, nodenames, [search_center])`: returns
-  pos or `nil`.
-    * `radius`: using a maximum metric
-    * `nodenames`: e.g. `{"ignore", "group:tree"}` or `"default:dirt"`
-    * `search_center` is an optional boolean (default: `false`)
-      If true `pos` is also checked for the nodes
-* `minetest.find_nodes_in_area(pos1, pos2, nodenames)`: returns a list of
-  positions.
-    * `nodenames`: e.g. `{"ignore", "group:tree"}` or `"default:dirt"`
-    * First return value: Table with all node positions
-    * Second return value: Table with the count of each node with the node name
-      as index.
-    * Area volume is limited to 4,096,000 nodes
-* `minetest.find_nodes_in_area_under_air(pos1, pos2, nodenames)`: returns a
-  list of positions.
-    * `nodenames`: e.g. `{"ignore", "group:tree"}` or `"default:dirt"`
-    * Return value: Table with all node positions with a node air above
-    * Area volume is limited to 4,096,000 nodes
-* `minetest.get_perlin(noiseparams)`
-* `minetest.get_perlin(seeddiff, octaves, persistence, spread)`
-    * Return world-specific perlin noise (`int(worldseed)+seeddiff`)
-* `minetest.get_voxel_manip([pos1, pos2])`
-    * Return voxel manipulator object.
-    * Loads the manipulator from the map if positions are passed.
-* `minetest.set_gen_notify(flags, {deco_ids})`
-    * Set the types of on-generate notifications that should be collected.
-    * `flags` is a flag field with the available flags:
-        * dungeon
-        * temple
-        * cave_begin
-        * cave_end
-        * large_cave_begin
-        * large_cave_end
-        * decoration
-    * The second parameter is a list of IDs of decorations which notification
-      is requested for.
-* `minetest.get_gen_notify()`
-    * Returns a flagstring and a table with the `deco_id`s.
-* `minetest.get_decoration_id(decoration_name)`
-    * Returns the decoration ID number for the provided decoration name string,
-      or `nil` on failure.
-* `minetest.get_mapgen_object(objectname)`
-    * Return requested mapgen object if available (see [Mapgen objects])
-* `minetest.get_heat(pos)`
-    * Returns the heat at the position, or `nil` on failure.
-* `minetest.get_humidity(pos)`
-    * Returns the humidity at the position, or `nil` on failure.
-* `minetest.get_biome_data(pos)`
-    * Returns a table containing:
-        * `biome` the biome id of the biome at that position
-        * `heat` the heat at the position
-        * `humidity` the humidity at the position
-    * Or returns `nil` on failure.
-* `minetest.get_biome_id(biome_name)`
-    * Returns the biome id, as used in the biomemap Mapgen object and returned
-      by `minetest.get_biome_data(pos)`, for a given biome_name string.
-* `minetest.get_biome_name(biome_id)`
-    * Returns the biome name string for the provided biome id, or `nil` on
-      failure.
-    * If no biomes have been registered, such as in mgv6, returns `default`.
-* `minetest.get_mapgen_params()`
-    * Deprecated: use `minetest.get_mapgen_setting(name)` instead.
-    * Returns a table containing:
-        * `mgname`
-        * `seed`
-        * `chunksize`
-        * `water_level`
-        * `flags`
-* `minetest.set_mapgen_params(MapgenParams)`
-    * Deprecated: use `minetest.set_mapgen_setting(name, value, override)`
-      instead.
-    * Set map generation parameters.
-    * Function cannot be called after the registration period; only
-      initialization and `on_mapgen_init`.
-    * Takes a table as an argument with the fields:
-        * `mgname`
-        * `seed`
-        * `chunksize`
-        * `water_level`
-        * `flags`
-    * Leave field unset to leave that parameter unchanged.
-    * `flags` contains a comma-delimited string of flags to set, or if the
-      prefix `"no"` is attached, clears instead.
-    * `flags` is in the same format and has the same options as `mg_flags` in
-      `minetest.conf`.
-* `minetest.get_mapgen_setting(name)`
-    * Gets the *active* mapgen setting (or nil if none exists) in string
-      format with the following order of precedence:
-        1) Settings loaded from map_meta.txt or overrides set during mod
-           execution.
-        2) Settings set by mods without a metafile override
-        3) Settings explicitly set in the user config file, minetest.conf
-        4) Settings set as the user config default
-* `minetest.get_mapgen_setting_noiseparams(name)`
-    * Same as above, but returns the value as a NoiseParams table if the
-      setting `name` exists and is a valid NoiseParams.
-* `minetest.set_mapgen_setting(name, value, [override_meta])`
-    * Sets a mapgen param to `value`, and will take effect if the corresponding
-      mapgen setting is not already present in map_meta.txt.
-    * `override_meta` is an optional boolean (default: `false`). If this is set
-      to true, the setting will become the active setting regardless of the map
-      metafile contents.
-    * Note: to set the seed, use `"seed"`, not `"fixed_map_seed"`.
-* `minetest.set_mapgen_setting_noiseparams(name, value, [override_meta])`
-    * Same as above, except value is a NoiseParams table.
-* `minetest.set_noiseparams(name, noiseparams, set_default)`
-    * Sets the noiseparams setting of `name` to the noiseparams table specified
-      in `noiseparams`.
-    * `set_default` is an optional boolean (default: `true`) that specifies
-      whether the setting should be applied to the default config or current
-      active config.
-* `minetest.get_noiseparams(name)`
-    * Returns a table of the noiseparams for name.
-* `minetest.generate_ores(vm, pos1, pos2)`
-    * Generate all registered ores within the VoxelManip `vm` and in the area
-      from `pos1` to `pos2`.
-    * `pos1` and `pos2` are optional and default to mapchunk minp and maxp.
-* `minetest.generate_decorations(vm, pos1, pos2)`
-    * Generate all registered decorations within the VoxelManip `vm` and in the
-      area from `pos1` to `pos2`.
-    * `pos1` and `pos2` are optional and default to mapchunk minp and maxp.
-* `minetest.clear_objects([options])`
-    * Clear all objects in the environment
-    * Takes an optional table as an argument with the field `mode`.
-        * mode = `"full"` : Load and go through every mapblock, clearing
-                            objects (default).
-        * mode = `"quick"`: Clear objects immediately in loaded mapblocks,
-                            clear objects in unloaded mapblocks only when the
-                            mapblocks are next activated.
-* `minetest.load_area(pos1[, pos2])`
-    * Load the mapblocks containing the area from `pos1` to `pos2`.
-      `pos2` defaults to `pos1` if not specified.
-    * This function does not trigger map generation.
-* `minetest.emerge_area(pos1, pos2, [callback], [param])`
-    * Queue all blocks in the area from `pos1` to `pos2`, inclusive, to be
-      asynchronously fetched from memory, loaded from disk, or if inexistent,
-      generates them.
-    * If `callback` is a valid Lua function, this will be called for each block
-      emerged.
-    * The function signature of callback is:
-      `function EmergeAreaCallback(blockpos, action, calls_remaining, param)`
-        * `blockpos` is the *block* coordinates of the block that had been
-          emerged.
-        * `action` could be one of the following constant values:
-            * `minetest.EMERGE_CANCELLED`
-            * `minetest.EMERGE_ERRORED`
-            * `minetest.EMERGE_FROM_MEMORY`
-            * `minetest.EMERGE_FROM_DISK`
-            * `minetest.EMERGE_GENERATED`
-        * `calls_remaining` is the number of callbacks to be expected after
-          this one.
-        * `param` is the user-defined parameter passed to emerge_area (or
-          nil if the parameter was absent).
-* `minetest.delete_area(pos1, pos2)`
-    * delete all mapblocks in the area from pos1 to pos2, inclusive
-* `minetest.line_of_sight(pos1, pos2)`: returns `boolean, pos`
-    * Checks if there is anything other than air between pos1 and pos2.
-    * Returns false if something is blocking the sight.
-    * Returns the position of the blocking node when `false`
-    * `pos1`: First position
-    * `pos2`: Second position
-* `minetest.raycast(pos1, pos2, objects, liquids)`: returns `Raycast`
-    * Creates a `Raycast` object.
-    * `pos1`: start of the ray
-    * `pos2`: end of the ray
-    * `objects`: if false, only nodes will be returned. Default is `true`.
-    * `liquids`: if false, liquid nodes won't be returned. Default is `false`.
-* `minetest.find_path(pos1,pos2,searchdistance,max_jump,max_drop,algorithm)`
-    * returns table containing path that can be walked on
-    * returns a table of 3D points representing a path from `pos1` to `pos2` or
-      `nil` on failure.
-    * Reasons for failure:
-        * No path exists at all
-        * No path exists within `searchdistance` (see below)
-        * Start or end pos is buried in land
-    * `pos1`: start position
-    * `pos2`: end position
-    * `searchdistance`: maximum distance from the search positions to search in.
-      In detail: Path must be completely inside a cuboid. The minimum
-      `searchdistance` of 1 will confine search between `pos1` and `pos2`.
-      Larger values will increase the size of this cuboid in all directions
-    * `max_jump`: maximum height difference to consider walkable
-    * `max_drop`: maximum height difference to consider droppable
-    * `algorithm`: One of `"A*_noprefetch"` (default), `"A*"`, `"Dijkstra"`.
-      Difference between `"A*"` and `"A*_noprefetch"` is that
-      `"A*"` will pre-calculate the cost-data, the other will calculate it
-      on-the-fly
-* `minetest.spawn_tree (pos, {treedef})`
-    * spawns L-system tree at given `pos` with definition in `treedef` table
-* `minetest.transforming_liquid_add(pos)`
-    * add node to liquid update queue
-* `minetest.get_node_max_level(pos)`
-    * get max available level for leveled node
-* `minetest.get_node_level(pos)`
-    * get level of leveled node (water, snow)
-* `minetest.set_node_level(pos, level)`
-    * set level of leveled node, default `level` equals `1`
-    * if `totallevel > maxlevel`, returns rest (`total-max`).
-* `minetest.add_node_level(pos, level)`
-    * increase level of leveled node by level, default `level` equals `1`
-    * if `totallevel > maxlevel`, returns rest (`total-max`)
-    * can be negative for decreasing
-* `minetest.fix_light(pos1, pos2)`: returns `true`/`false`
-    * resets the light in a cuboid-shaped part of
-      the map and removes lighting bugs.
-    * Loads the area if it is not loaded.
-    * `pos1` is the corner of the cuboid with the least coordinates
-      (in node coordinates), inclusive.
-    * `pos2` is the opposite corner of the cuboid, inclusive.
-    * The actual updated cuboid might be larger than the specified one,
-      because only whole map blocks can be updated.
-      The actual updated area consists of those map blocks that intersect
-      with the given cuboid.
-    * However, the neighborhood of the updated area might change
-      as well, as light can spread out of the cuboid, also light
-      might be removed.
-    * returns `false` if the area is not fully generated,
-      `true` otherwise
-* `minetest.check_single_for_falling(pos)`
-    * causes an unsupported `group:falling_node` node to fall and causes an
-      unattached `group:attached_node` node to fall.
-    * does not spread these updates to neighbours.
-* `minetest.check_for_falling(pos)`
-    * causes an unsupported `group:falling_node` node to fall and causes an
-      unattached `group:attached_node` node to fall.
-    * spread these updates to neighbours and can cause a cascade
-      of nodes to fall.
-* `minetest.get_spawn_level(x, z)`
-    * Returns a player spawn y co-ordinate for the provided (x, z)
-      co-ordinates, or `nil` for an unsuitable spawn point.
-    * For most mapgens a 'suitable spawn point' is one with y between
-      `water_level` and `water_level + 16`, and in mgv7 well away from rivers,
-      so `nil` will be returned for many (x, z) co-ordinates.
-    * The spawn level returned is for a player spawn in unmodified terrain.
-    * The spawn level is intentionally above terrain level to cope with
-      full-node biome 'dust' nodes.
-
-Mod channels
-------------
-
-You can find mod channels communication scheme in `doc/mod_channels.png`.
-
-* `minetest.mod_channel_join(channel_name)`
-    * Server joins channel `channel_name`, and creates it if necessary. You
-      should listen for incoming messages with
-      `minetest.register_on_modchannel_message`
-
-Inventory
----------
-
-`minetest.get_inventory(location)`: returns an `InvRef`
-
-* `location` = e.g.
-    * `{type="player", name="celeron55"}`
-    * `{type="node", pos={x=, y=, z=}}`
-    * `{type="detached", name="creative"}`
-* `minetest.create_detached_inventory(name, callbacks, [player_name])`: returns
-  an `InvRef`.
-    * `callbacks`: See [Detached inventory callbacks]
-    * `player_name`: Make detached inventory available to one player
-      exclusively, by default they will be sent to every player (even if not
-      used).
-      Note that this parameter is mostly just a workaround and will be removed
-      in future releases.
-    * Creates a detached inventory. If it already exists, it is cleared.
-* `minetest.remove_detached_inventory(name)`
-    * Returns a `boolean` indicating whether the removal succeeded.
-* `minetest.do_item_eat(hp_change, replace_with_item, itemstack, user, pointed_thing)`:
-  returns left over ItemStack.
-    * See `minetest.item_eat` and `minetest.register_on_item_eat`
-
-Formspec
---------
-
-* `minetest.show_formspec(playername, formname, formspec)`
-    * `playername`: name of player to show formspec
-    * `formname`: name passed to `on_player_receive_fields` callbacks.
-      It should follow the `"modname:<whatever>"` naming convention
-    * `formspec`: formspec to display
-* `minetest.close_formspec(playername, formname)`
-    * `playername`: name of player to close formspec
-    * `formname`: has to exactly match the one given in `show_formspec`, or the
-      formspec will not close.
-    * calling `show_formspec(playername, formname, "")` is equal to this
-      expression.
-    * to close a formspec regardless of the formname, call
-      `minetest.close_formspec(playername, "")`.
-      **USE THIS ONLY WHEN ABSOLUTELY NECESSARY!**
-* `minetest.formspec_escape(string)`: returns a string
-    * escapes the characters "[", "]", "\", "," and ";", which can not be used
-      in formspecs.
-* `minetest.explode_table_event(string)`: returns a table
-    * returns e.g. `{type="CHG", row=1, column=2}`
-    * `type` is one of:
-        * `"INV"`: no row selected
-        * `"CHG"`: selected
-        * `"DCL"`: double-click
-* `minetest.explode_textlist_event(string)`: returns a table
-    * returns e.g. `{type="CHG", index=1}`
-    * `type` is one of:
-        * `"INV"`: no row selected
-        * `"CHG"`: selected
-        * `"DCL"`: double-click
-* `minetest.explode_scrollbar_event(string)`: returns a table
-    * returns e.g. `{type="CHG", value=500}`
-    * `type` is one of:
-        * `"INV"`: something failed
-        * `"CHG"`: has been changed
-        * `"VAL"`: not changed
-
-Item handling
--------------
-
-* `minetest.inventorycube(img1, img2, img3)`
-    * Returns a string for making an image of a cube (useful as an item image)
-* `minetest.get_pointed_thing_position(pointed_thing, above)`
-    * Returns the position of a `pointed_thing` or `nil` if the `pointed_thing`
-      does not refer to a node or entity.
-    * If the optional `above` parameter is true and the `pointed_thing` refers
-      to a node, then it will return the `above` position of the `pointed_thing`.
-* `minetest.dir_to_facedir(dir, is6d)`
-    * Convert a vector to a facedir value, used in `param2` for
-      `paramtype2="facedir"`.
-    * passing something non-`nil`/`false` for the optional second parameter
-      causes it to take the y component into account.
-* `minetest.facedir_to_dir(facedir)`
-    * Convert a facedir back into a vector aimed directly out the "back" of a
-      node.
-* `minetest.dir_to_wallmounted(dir)`
-    * Convert a vector to a wallmounted value, used for
-      `paramtype2="wallmounted"`.
-* `minetest.wallmounted_to_dir(wallmounted)`
-    * Convert a wallmounted value back into a vector aimed directly out the
-      "back" of a node.
-* `minetest.dir_to_yaw(dir)`
-    * Convert a vector into a yaw (angle)
-* `minetest.yaw_to_dir(yaw)`
-    * Convert yaw (angle) to a vector
-* `minetest.is_colored_paramtype(ptype)`
-    * Returns a boolean. Returns `true` if the given `paramtype2` contains
-      color information (`color`, `colorwallmounted` or `colorfacedir`).
-* `minetest.strip_param2_color(param2, paramtype2)`
-    * Removes everything but the color information from the
-      given `param2` value.
-    * Returns `nil` if the given `paramtype2` does not contain color
-      information.
-* `minetest.get_node_drops(node, toolname)`
-    * Returns list of itemstrings that are dropped by `node` when dug
-      with `toolname`.
-    * `node`: node as table or node name
-    * `toolname`: name of the tool item (can be `nil`)
-* `minetest.get_craft_result(input)`: returns `output, decremented_input`
-    * `input.method` = `"normal"` or `"cooking"` or `"fuel"`
-    * `input.width` = for example `3`
-    * `input.items` = for example
-      `{stack1, stack2, stack3, stack4, stack 5, stack 6, stack 7, stack 8, stack 9}`
-    * `output.item` = `ItemStack`, if unsuccessful: empty `ItemStack`
-    * `output.time` = a number, if unsuccessful: `0`
-    * `output.replacements` = List of replacement `ItemStack`s that couldn't be
-      placed in `decremented_input.items`. Replacements can be placed in
-      `decremented_input` if the stack of the replaced item has a count of 1.
-    * `decremented_input` = like `input`
-* `minetest.get_craft_recipe(output)`: returns input
-    * returns last registered recipe for output item (node)
-    * `output` is a node or item type such as `"default:torch"`
-    * `input.method` = `"normal"` or `"cooking"` or `"fuel"`
-    * `input.width` = for example `3`
-    * `input.items` = for example
-      `{stack1, stack2, stack3, stack4, stack 5, stack 6, stack 7, stack 8, stack 9}`
-        * `input.items` = `nil` if no recipe found
-* `minetest.get_all_craft_recipes(query item)`: returns a table or `nil`
-    * returns indexed table with all registered recipes for query item (node)
-      or `nil` if no recipe was found.
-    * recipe entry table:
-        * `method`: 'normal' or 'cooking' or 'fuel'
-        * `width`: 0-3, 0 means shapeless recipe
-        * `items`: indexed [1-9] table with recipe items
-        * `output`: string with item name and quantity
-    * Example query for `"default:gold_ingot"` will return table:
-
-          {
-              [1]={method = "cooking", width = 3, output = "default:gold_ingot",
-              items = {1 = "default:gold_lump"}},
-              [2]={method = "normal", width = 1, output = "default:gold_ingot 9",
-              items = {1 = "default:goldblock"}}
-          }
-* `minetest.handle_node_drops(pos, drops, digger)`
-    * `drops`: list of itemstrings
-    * Handles drops from nodes after digging: Default action is to put them
-      into digger's inventory.
-    * Can be overridden to get different functionality (e.g. dropping items on
-      ground)
-* `minetest.itemstring_with_palette(item, palette_index)`: returns an item
-  string.
-    * Creates an item string which contains palette index information
-      for hardware colorization. You can use the returned string
-      as an output in a craft recipe.
-    * `item`: the item stack which becomes colored. Can be in string,
-      table and native form.
-    * `palette_index`: this index is added to the item stack
-* `minetest.itemstring_with_color(item, colorstring)`: returns an item string
-    * Creates an item string which contains static color information
-      for hardware colorization. Use this method if you wish to colorize
-      an item that does not own a palette. You can use the returned string
-      as an output in a craft recipe.
-    * `item`: the item stack which becomes colored. Can be in string,
-      table and native form.
-    * `colorstring`: the new color of the item stack
-
-Rollback
---------
-
-* `minetest.rollback_get_node_actions(pos, range, seconds, limit)`:
-  returns `{{actor, pos, time, oldnode, newnode}, ...}`
-    * Find who has done something to a node, or near a node
-    * `actor`: `"player:<name>"`, also `"liquid"`.
-* `minetest.rollback_revert_actions_by(actor, seconds)`: returns
-  `boolean, log_messages`.
-    * Revert latest actions of someone
-    * `actor`: `"player:<name>"`, also `"liquid"`.
-
-Defaults for the `on_place` and `on_drop` item definition functions
--------------------------------------------------------------------
-
-* `minetest.item_place_node(itemstack, placer, pointed_thing[, param2, prevent_after_place])`
-    * Place item as a node
-    * `param2` overrides `facedir` and wallmounted `param2`
-    * `prevent_after_place`: if set to `true`, `after_place_node` is not called
-      for the newly placed node to prevent a callback and placement loop
-    * returns `itemstack, position`
-      * `position`: the location the node was placed to. `nil` if nothing was placed.
-* `minetest.item_place_object(itemstack, placer, pointed_thing)`
-    * Place item as-is
-    * returns the leftover itemstack
-    * **Note**: This function is deprecated and will never be called.
-* `minetest.item_place(itemstack, placer, pointed_thing[, param2])`
-    * Wrapper that calls `minetest.item_place_node` if appropriate
-    * Calls `on_rightclick` of `pointed_thing.under` if defined instead
-    * **Note**: is not called when wielded item overrides `on_place`
-    * `param2` overrides facedir and wallmounted `param2`
-    * returns `itemstack, position`
-      * `position`: the location the node was placed to. `nil` if nothing was placed.
-* `minetest.item_drop(itemstack, dropper, pos)`
-    * Drop the item
-    * returns the leftover itemstack
-* `minetest.item_eat(hp_change[, replace_with_item])`
-    * Returns `function(itemstack, user, pointed_thing)` as a
-      function wrapper for `minetest.do_item_eat`.
-    * `replace_with_item` is the itemstring which is added to the inventory.
-      If the player is eating a stack, then replace_with_item goes to a
-      different spot.
-
-Defaults for the `on_punch` and `on_dig` node definition callbacks
-------------------------------------------------------------------
-
-* `minetest.node_punch(pos, node, puncher, pointed_thing)`
-    * Calls functions registered by `minetest.register_on_punchnode()`
-* `minetest.node_dig(pos, node, digger)`
-    * Checks if node can be dug, puts item into inventory, removes node
-    * Calls functions registered by `minetest.registered_on_dignodes()`
-
-Sounds
-------
-
-* `minetest.sound_play(spec, parameters, [ephemeral])`: returns a handle
-    * `spec` is a `SimpleSoundSpec`
-    * `parameters` is a sound parameter table
-    * `ephemeral` is a boolean (default: false)
-      Ephemeral sounds will not return a handle and can't be stopped or faded.
-      It is recommend to use this for short sounds that happen in response to
-      player actions (e.g. door closing).
-* `minetest.sound_stop(handle)`
-    * `handle` is a handle returned by `minetest.sound_play`
-* `minetest.sound_fade(handle, step, gain)`
-    * `handle` is a handle returned by `minetest.sound_play`
-    * `step` determines how fast a sound will fade.
-      Negative step will lower the sound volume, positive step will increase
-      the sound volume.
-    * `gain` the target gain for the fade.
-
-Timing
-------
-
-* `minetest.after(time, func, ...)`
-    * Call the function `func` after `time` seconds, may be fractional
-    * Optional: Variable number of arguments that are passed to `func`
-
-Server
-------
-
-* `minetest.request_shutdown([message],[reconnect],[delay])`: request for
-  server shutdown. Will display `message` to clients.
-    * `reconnect` == true displays a reconnect button
-    * `delay` adds an optional delay (in seconds) before shutdown.
-      Negative delay cancels the current active shutdown.
-      Zero delay triggers an immediate shutdown.
-* `minetest.cancel_shutdown_requests()`: cancel current delayed shutdown
-* `minetest.get_server_status(name, joined)`
-    * Returns the server status string when a player joins or when the command
-      `/status` is called. Returns `nil` or an empty string when the message is
-      disabled.
-    * `joined`: Boolean value, indicates whether the function was called when
-      a player joined.
-    * This function may be overwritten by mods to customize the status message.
-* `minetest.get_server_uptime()`: returns the server uptime in seconds
-* `minetest.remove_player(name)`: remove player from database (if they are not
-  connected).
-    * As auth data is not removed, minetest.player_exists will continue to
-      return true. Call the below method as well if you want to remove auth
-      data too.
-    * Returns a code (0: successful, 1: no such player, 2: player is connected)
-* `minetest.remove_player_auth(name)`: remove player authentication data
-    * Returns boolean indicating success (false if player nonexistant)
-
-Bans
-----
-
-* `minetest.get_ban_list()`: returns a list of all bans formatted as string
-* `minetest.get_ban_description(ip_or_name)`: returns list of bans matching
-  IP address or name formatted as string
-* `minetest.ban_player(name)`: ban the IP of a currently connected player
-    * Returns boolean indicating success
-* `minetest.unban_player_or_ip(ip_or_name)`: remove ban record matching
-  IP address or name
-* `minetest.kick_player(name, [reason])`: disconnect a player with an optional
-  reason.
-    * Returns boolean indicating success (false if player nonexistant)
-
-Particles
----------
-
-* `minetest.add_particle(particle definition)`
-    * Deprecated: `minetest.add_particle(pos, velocity, acceleration,
-      expirationtime, size, collisiondetection, texture, playername)`
-
-* `minetest.add_particlespawner(particlespawner definition)`
-    * Add a `ParticleSpawner`, an object that spawns an amount of particles
-      over `time` seconds.
-    * Returns an `id`, and -1 if adding didn't succeed
-    * Deprecated: `minetest.add_particlespawner(amount, time,
-      minpos, maxpos,
-      minvel, maxvel,
-      minacc, maxacc,
-      minexptime, maxexptime,
-      minsize, maxsize,
-      collisiondetection, texture, playername)`
-
-* `minetest.delete_particlespawner(id, player)`
-    * Delete `ParticleSpawner` with `id` (return value from
-      `minetest.add_particlespawner`).
-    * If playername is specified, only deletes on the player's client,
-      otherwise on all clients.
-
-Schematics
-----------
-
-* `minetest.create_schematic(p1, p2, probability_list, filename, slice_prob_list)`
-    * Create a schematic from the volume of map specified by the box formed by
-      p1 and p2.
-    * Apply the specified probability and per-node force-place to the specified
-      nodes according to the `probability_list`.
-        * `probability_list` is an array of tables containing two fields, `pos`
-          and `prob`.
-            * `pos` is the 3D vector specifying the absolute coordinates of the
-              node being modified,
-            * `prob` is an integer value from `0` to `255` that encodes
-              probability and per-node force-place. Probability has levels
-              0-127, then 128 may be added to encode per-node force-place.
-              For probability stated as 0-255, divide by 2 and round down to
-              get values 0-127, then add 128 to apply per-node force-place.
-            * If there are two or more entries with the same pos value, the
-              last entry is used.
-            * If `pos` is not inside the box formed by `p1` and `p2`, it is
-              ignored.
-            * If `probability_list` equals `nil`, no probabilities are applied.
-    * Apply the specified probability to the specified horizontal slices
-      according to the `slice_prob_list`.
-        * `slice_prob_list` is an array of tables containing two fields, `ypos`
-          and `prob`.
-            * `ypos` indicates the y position of the slice with a probability
-              applied, the lowest slice being `ypos = 0`.
-            * If slice probability list equals `nil`, no slice probabilities
-              are applied.
-    * Saves schematic in the Minetest Schematic format to filename.
-
-* `minetest.place_schematic(pos, schematic, rotation, replacements, force_placement, flags)`
-    * Place the schematic specified by schematic (see [Schematic specifier]) at
-      `pos`.
-    * `rotation` can equal `"0"`, `"90"`, `"180"`, `"270"`, or `"random"`.
-    * If the `rotation` parameter is omitted, the schematic is not rotated.
-    * `replacements` = `{["old_name"] = "convert_to", ...}`
-    * `force_placement` is a boolean indicating whether nodes other than `air`
-      and `ignore` are replaced by the schematic.
-    * Returns nil if the schematic could not be loaded.
-    * **Warning**: Once you have loaded a schematic from a file, it will be
-      cached. Future calls will always use the cached version and the
-      replacement list defined for it, regardless of whether the file or the
-      replacement list parameter have changed. The only way to load the file
-      anew is to restart the server.
-    * `flags` is a flag field with the available flags:
-        * place_center_x
-        * place_center_y
-        * place_center_z
-
-* `minetest.place_schematic_on_vmanip(vmanip, pos, schematic, rotation, replacement, force_placement, flags)`:
-    * This function is analogous to minetest.place_schematic, but places a
-      schematic onto the specified VoxelManip object `vmanip` instead of the
-      map.
-    * Returns false if any part of the schematic was cut-off due to the
-      VoxelManip not containing the full area required, and true if the whole
-      schematic was able to fit.
-    * Returns nil if the schematic could not be loaded.
-    * After execution, any external copies of the VoxelManip contents are
-      invalidated.
-    * `flags` is a flag field with the available flags:
-        * place_center_x
-        * place_center_y
-        * place_center_z
-
-* `minetest.serialize_schematic(schematic, format, options)`
-    * Return the serialized schematic specified by schematic
-      (see [Schematic specifier])
-    * in the `format` of either "mts" or "lua".
-    * "mts" - a string containing the binary MTS data used in the MTS file
-      format.
-    * "lua" - a string containing Lua code representing the schematic in table
-      format.
-    * `options` is a table containing the following optional parameters:
-        * If `lua_use_comments` is true and `format` is "lua", the Lua code
-          generated will have (X, Z) position comments for every X row
-          generated in the schematic data for easier reading.
-        * If `lua_num_indent_spaces` is a nonzero number and `format` is "lua",
-          the Lua code generated will use that number of spaces as indentation
-          instead of a tab character.
-
-* `minetest.read_schematic(schematic, options)`
-    * Returns a Lua table representing the schematic (see: [Schematic specifier])
-    * `schematic` is the schematic to read (see: [Schematic specifier])
-    * `options` is a table containing the following optional parameters:
-        * `write_yslice_prob`: string value:
-            * `none`: no `write_yslice_prob` table is inserted,
-            * `low`: only probabilities that are not 254 or 255 are written in
-              the `write_ylisce_prob` table,
-            * `all`: write all probabilities to the `write_yslice_prob` table.
-            * The default for this option is `all`.
-            * Any invalid value will be interpreted as `all`.
-
-HTTP Requests
--------------
-
-* `minetest.request_http_api()`:
-    * returns `HTTPApiTable` containing http functions if the calling mod has
-      been granted access by being listed in the `secure.http_mods` or
-      `secure.trusted_mods` setting, otherwise returns `nil`.
-    * The returned table contains the functions `fetch`, `fetch_async` and
-      `fetch_async_get` described below.
-    * Only works at init time and must be called from the mod's main scope
-      (not from a function).
-    * Function only exists if minetest server was built with cURL support.
-    * **DO NOT ALLOW ANY OTHER MODS TO ACCESS THE RETURNED TABLE, STORE IT IN
-      A LOCAL VARIABLE!**
-* `HTTPApiTable.fetch(HTTPRequest req, callback)`
-    * Performs given request asynchronously and calls callback upon completion
-    * callback: `function(HTTPRequestResult res)`
-    * Use this HTTP function if you are unsure, the others are for advanced use
-* `HTTPApiTable.fetch_async(HTTPRequest req)`: returns handle
-    * Performs given request asynchronously and returns handle for
-      `HTTPApiTable.fetch_async_get`
-* `HTTPApiTable.fetch_async_get(handle)`: returns HTTPRequestResult
-    * Return response data for given asynchronous HTTP request
-
-Storage API
------------
-
-* `minetest.get_mod_storage()`:
-    * returns reference to mod private `StorageRef`
-    * must be called during mod load time
-
-Misc.
------
-
-* `minetest.get_connected_players()`: returns list of `ObjectRefs`
-* `minetest.is_player(obj)`: boolean, whether `obj` is a player
-* `minetest.player_exists(name)`: boolean, whether player exists
-  (regardless of online status)
-* `minetest.hud_replace_builtin(name, hud_definition)`
-    * Replaces definition of a builtin hud element
-    * `name`: `"breath"` or `"health"`
-    * `hud_definition`: definition to replace builtin definition
-* `minetest.send_join_message(player_name)`
-    * This function can be overridden by mods to change the join message.
-* `minetest.send_leave_message(player_name, timed_out)`
-    * This function can be overridden by mods to change the leave message.
-* `minetest.hash_node_position(pos)`: returns an 48-bit integer
-    * `pos`: table {x=number, y=number, z=number},
-    * Gives a unique hash number for a node position (16+16+16=48bit)
-* `minetest.get_position_from_hash(hash)`: returns a position
-    * Inverse transform of `minetest.hash_node_position`
-* `minetest.get_item_group(name, group)`: returns a rating
-    * Get rating of a group of an item. (`0` means: not in group)
-* `minetest.get_node_group(name, group)`: returns a rating
-    * Deprecated: An alias for the former.
-* `minetest.raillike_group(name)`: returns a rating
-    * Returns rating of the connect_to_raillike group corresponding to name
-    * If name is not yet the name of a connect_to_raillike group, a new group
-      id is created, with that name.
-* `minetest.get_content_id(name)`: returns an integer
-    * Gets the internal content ID of `name`
-* `minetest.get_name_from_content_id(content_id)`: returns a string
-    * Gets the name of the content with that content ID
-* `minetest.parse_json(string[, nullvalue])`: returns something
-    * Convert a string containing JSON data into the Lua equivalent
-    * `nullvalue`: returned in place of the JSON null; defaults to `nil`
-    * On success returns a table, a string, a number, a boolean or `nullvalue`
-    * On failure outputs an error message and returns `nil`
-    * Example: `parse_json("[10, {\"a\":false}]")`, returns `{10, {a = false}}`
-* `minetest.write_json(data[, styled])`: returns a string or `nil` and an error
-  message.
-    * Convert a Lua table into a JSON string
-    * styled: Outputs in a human-readable format if this is set, defaults to
-      false.
-    * Unserializable things like functions and userdata will cause an error.
-    * **Warning**: JSON is more strict than the Lua table format.
-        1. You can only use strings and positive integers of at least one as
-           keys.
-        2. You can not mix string and integer keys.
-           This is due to the fact that JSON has two distinct array and object
-           values.
-    * Example: `write_json({10, {a = false}})`,
-      returns `"[10, {\"a\": false}]"`
-* `minetest.serialize(table)`: returns a string
-    * Convert a table containing tables, strings, numbers, booleans and `nil`s
-      into string form readable by `minetest.deserialize`
-    * Example: `serialize({foo='bar'})`, returns `'return { ["foo"] = "bar" }'`
-* `minetest.deserialize(string[, safe])`: returns a table
-    * Convert a string returned by `minetest.serialize` into a table
-    * `string` is loaded in an empty sandbox environment.
-    * Will load functions if safe is false or omitted. Although these functions
-      cannot directly access the global environment, they could bypass this
-      restriction with maliciously crafted Lua bytecode if mod security is
-      disabled.
-    * This function should not be used on untrusted data, regardless of the
-     value of `safe`. It is fine to serialize then deserialize user-provided
-     data, but directly providing user input to deserialize is always unsafe.
-    * Example: `deserialize('return { ["foo"] = "bar" }')`,
-      returns `{foo='bar'}`
-    * Example: `deserialize('print("foo")')`, returns `nil`
-      (function call fails), returns
-      `error:[string "print("foo")"]:1: attempt to call global 'print' (a nil value)`
-* `minetest.compress(data, method, ...)`: returns `compressed_data`
-    * Compress a string of data.
-    * `method` is a string identifying the compression method to be used.
-    * Supported compression methods:
-        * Deflate (zlib): `"deflate"`
-    * `...` indicates method-specific arguments. Currently defined arguments
-      are:
-        * Deflate: `level` - Compression level, `0`-`9` or `nil`.
-* `minetest.decompress(compressed_data, method, ...)`: returns data
-    * Decompress a string of data (using ZLib).
-    * See documentation on `minetest.compress()` for supported compression
-      methods.
-    * `...` indicates method-specific arguments. Currently, no methods use this
-* `minetest.rgba(red, green, blue[, alpha])`: returns a string
-    * Each argument is a 8 Bit unsigned integer
-    * Returns the ColorString from rgb or rgba values
-    * Example: `minetest.rgba(10, 20, 30, 40)`, returns `"#0A141E28"`
-* `minetest.encode_base64(string)`: returns string encoded in base64
-    * Encodes a string in base64.
-* `minetest.decode_base64(string)`: returns string
-    * Decodes a string encoded in base64.
-* `minetest.is_protected(pos, name)`: returns boolean
-    * Returning `true` restricts the player `name` from modifying (i.e. digging,
-       placing) the node at position `pos`.
-    * `name` will be `""` for non-players or unknown players.
-    * This function should be overridden by protection mods. It is highly
-      recommended to grant access to players with the `protection_bypass` privilege.
-    * Cache and call the old version of this function if the position is
-      not protected by the mod. This will allow using multiple protection mods.
-    * Example:
-
-          local old_is_protected = minetest.is_protected
-          function minetest.is_protected(pos, name)
-              if mymod:position_protected_from(pos, name) then
-                  return true
-              end
-              return old_is_protected(pos, name)
-          end
-* `minetest.record_protection_violation(pos, name)`
-    * This function calls functions registered with
-      `minetest.register_on_protection_violation`.
-* `minetest.is_area_protected(pos1, pos2, player_name, interval)`
-    * Returns the position of the first node that `player_name` may not modify
-      in the specified cuboid between `pos1` and `pos2`.
-    * Returns `false` if no protections were found.
-    * Applies `is_protected()` to a 3D lattice of points in the defined volume.
-      The points are spaced evenly throughout the volume and have a spacing
-      similar to, but no larger than, `interval`.
-    * All corners and edges of the defined volume are checked.
-    * `interval` defaults to 4.
-    * `interval` should be carefully chosen and maximised to avoid an excessive
-      number of points being checked.
-    * Like `minetest.is_protected`, this function may be extended or
-      overwritten by mods to provide a faster implementation to check the
-      cuboid for intersections.
-* `minetest.rotate_and_place(itemstack, placer, pointed_thing[, infinitestacks,
-  orient_flags, prevent_after_place])`
-    * Attempt to predict the desired orientation of the facedir-capable node
-      defined by `itemstack`, and place it accordingly (on-wall, on the floor,
-      or hanging from the ceiling).
-    * `infinitestacks`: if `true`, the itemstack is not changed. Otherwise the
-      stacks are handled normally.
-    * `orient_flags`: Optional table containing extra tweaks to the placement code:
-        * `invert_wall`:   if `true`, place wall-orientation on the ground and
-          ground-orientation on the wall.
-        * `force_wall` :   if `true`, always place the node in wall orientation.
-        * `force_ceiling`: if `true`, always place on the ceiling.
-        * `force_floor`:   if `true`, always place the node on the floor.
-        * `force_facedir`: if `true`, forcefully reset the facedir to north
-          when placing on the floor or ceiling.
-        * The first four options are mutually-exclusive; the last in the list
-          takes precedence over the first.
-    * `prevent_after_place` is directly passed to `minetest.item_place_node`
-    * Returns the new itemstack after placement
-* `minetest.rotate_node(itemstack, placer, pointed_thing)`
-    * calls `rotate_and_place()` with `infinitestacks` set according to the state
-      of the creative mode setting, checks for "sneak" to set the `invert_wall`
-      parameter and `prevent_after_place` set to `true`.
-
-* `minetest.calculate_knockback(player, hitter, time_from_last_punch,
-  tool_capabilities, dir, distance, damage)`
-    * Returns the amount of knockback applied on the punched player.
-    * Arguments are equivalent to `register_on_punchplayer`, except the following:
-        * `distance`: distance between puncher and punched player
-    * This function can be overriden by mods that wish to modify this behaviour.
-    * You may want to cache and call the old function to allow multiple mods to
-      change knockback behaviour.
-
-* `minetest.forceload_block(pos[, transient])`
-    * forceloads the position `pos`.
-    * returns `true` if area could be forceloaded
-    * If `transient` is `false` or absent, the forceload will be persistent
-      (saved between server runs). If `true`, the forceload will be transient
-      (not saved between server runs).
-
-* `minetest.forceload_free_block(pos[, transient])`
-    * stops forceloading the position `pos`
-    * If `transient` is `false` or absent, frees a persistent forceload.
-      If `true`, frees a transient forceload.
-
-* `minetest.request_insecure_environment()`: returns an environment containing
-  insecure functions if the calling mod has been listed as trusted in the
-  `secure.trusted_mods` setting or security is disabled, otherwise returns
-  `nil`.
-    * Only works at init time and must be called from the mod's main scope (not
-      from a function).
-    * **DO NOT ALLOW ANY OTHER MODS TO ACCESS THE RETURNED ENVIRONMENT, STORE
-      IT IN A LOCAL VARIABLE!**
-
-* `minetest.global_exists(name)`
-    * Checks if a global variable has been set, without triggering a warning.
-
-Global objects
---------------
-
-* `minetest.env`: `EnvRef` of the server environment and world.
-    * Any function in the minetest namespace can be called using the syntax
-      `minetest.env:somefunction(somearguments)`
-      instead of `minetest.somefunction(somearguments)`
-    * Deprecated, but support is not to be dropped soon
-
-Global tables
--------------
-
-### Registered definition tables
-
-* `minetest.registered_items`
-    * Map of registered items, indexed by name
-* `minetest.registered_nodes`
-    * Map of registered node definitions, indexed by name
-* `minetest.registered_craftitems`
-    * Map of registered craft item definitions, indexed by name
-* `minetest.registered_tools`
-    * Map of registered tool definitions, indexed by name
-* `minetest.registered_entities`
-    * Map of registered entity prototypes, indexed by name
-* `minetest.object_refs`
-    * Map of object references, indexed by active object id
-* `minetest.luaentities`
-    * Map of Lua entities, indexed by active object id
-* `minetest.registered_abms`
-    * List of ABM definitions
-* `minetest.registered_lbms`
-    * List of LBM definitions
-* `minetest.registered_aliases`
-    * Map of registered aliases, indexed by name
-* `minetest.registered_ores`
-    * Map of registered ore definitions, indexed by the `name` field.
-    * If `name` is nil, the key is the object handle returned by
-      `minetest.register_ore`.
-* `minetest.registered_biomes`
-    * Map of registered biome definitions, indexed by the `name` field.
-    * If `name` is nil, the key is the object handle returned by
-      `minetest.register_biome`.
-* `minetest.registered_decorations`
-    * Map of registered decoration definitions, indexed by the `name` field.
-    * If `name` is nil, the key is the object handle returned by
-      `minetest.register_decoration`.
-* `minetest.registered_schematics`
-    * Map of registered schematic definitions, indexed by the `name` field.
-    * If `name` is nil, the key is the object handle returned by
-      `minetest.register_schematic`.
-* `minetest.registered_chatcommands`
-    * Map of registered chat command definitions, indexed by name
-* `minetest.registered_privileges`
-    * Map of registered privilege definitions, indexed by name
-
-### Registered callback tables
-
-All callbacks registered with [Global callback registration functions] are added
-to corresponding `minetest.registered_*` tables.
-
-
-
-
-Class reference
-===============
-
-Sorted alphabetically.
-
-`AreaStore`
------------
-
-A fast access data structure to store areas, and find areas near a given
-position or area.
-Every area has a `data` string attribute to store additional information.
-You can create an empty `AreaStore` by calling `AreaStore()`, or
-`AreaStore(type_name)`. The mod decides where to save and load AreaStore.
-If you chose the parameter-less constructor, a fast implementation will be
-automatically chosen for you.
-
-### Methods
-
-* `get_area(id, include_borders, include_data)`
-    * Returns the area information about the specified ID.
-    * Returned values are either of these:
-
-            nil  -- Area not found
-            true -- Without `include_borders` and `include_data`
-            {
-                min = pos, max = pos -- `include_borders == true`
-                data = string        -- `include_data == true`
-            }
-
-* `get_areas_for_pos(pos, include_borders, include_data)`
-    * Returns all areas as table, indexed by the area ID.
-    * Table values: see `get_area`.
-* `get_areas_in_area(edge1, edge2, accept_overlap, include_borders, include_data)`
-    * Returns all areas that contain all nodes inside the area specified by `edge1`
-      and `edge2` (inclusive).
-    * `accept_overlap`: if `true`, areas are returned that have nodes in
-      common (intersect) with the specified area.
-    * Returns the same values as `get_areas_for_pos`.
-* `insert_area(edge1, edge2, data, [id])`: inserts an area into the store.
-    * Returns the new area's ID, or nil if the insertion failed.
-    * The (inclusive) positions `edge1` and `edge2` describe the area.
-    * `data` is a string stored with the area.
-    * `id` (optional): will be used as the internal area ID if it is an unique
-      number between 0 and 2^32-2.
-* `reserve(count)`: reserves resources for at most `count` many contained
-  areas.
-  Only needed for efficiency, and only some implementations profit.
-* `remove_area(id)`: removes the area with the given id from the store, returns
-  success.
-* `set_cache_params(params)`: sets params for the included prefiltering cache.
-  Calling invalidates the cache, so that its elements have to be newly
-  generated.
-    * `params` is a table with the following fields:
-
-          enabled = boolean,   -- Whether to enable, default true
-          block_radius = int,  -- The radius (in nodes) of the areas the cache
-                               -- generates prefiltered lists for, minimum 16,
-                               -- default 64
-          limit = int,         -- The cache size, minimum 20, default 1000
-* `to_string()`: Experimental. Returns area store serialized as a (binary)
-  string.
-* `to_file(filename)`: Experimental. Like `to_string()`, but writes the data to
-  a file.
-* `from_string(str)`: Experimental. Deserializes string and loads it into the
-  AreaStore.
-  Returns success and, optionally, an error message.
-* `from_file(filename)`: Experimental. Like `from_string()`, but reads the data
-  from a file.
-
-`InvRef`
---------
-
-An `InvRef` is a reference to an inventory.
-
-### Methods
-
-* `is_empty(listname)`: return `true` if list is empty
-* `get_size(listname)`: get size of a list
-* `set_size(listname, size)`: set size of a list
-    * returns `false` on error (e.g. invalid `listname` or `size`)
-* `get_width(listname)`: get width of a list
-* `set_width(listname, width)`: set width of list; currently used for crafting
-* `get_stack(listname, i)`: get a copy of stack index `i` in list
-* `set_stack(listname, i, stack)`: copy `stack` to index `i` in list
-* `get_list(listname)`: return full list
-* `set_list(listname, list)`: set full list (size will not change)
-* `get_lists()`: returns list of inventory lists
-* `set_lists(lists)`: sets inventory lists (size will not change)
-* `add_item(listname, stack)`: add item somewhere in list, returns leftover
-  `ItemStack`.
-* `room_for_item(listname, stack):` returns `true` if the stack of items
-  can be fully added to the list
-* `contains_item(listname, stack, [match_meta])`: returns `true` if
-  the stack of items can be fully taken from the list.
-  If `match_meta` is false, only the items' names are compared
-  (default: `false`).
-* `remove_item(listname, stack)`: take as many items as specified from the
-  list, returns the items that were actually removed (as an `ItemStack`)
-  -- note that any item metadata is ignored, so attempting to remove a specific
-  unique item this way will likely remove the wrong one -- to do that use
-  `set_stack` with an empty `ItemStack`.
-* `get_location()`: returns a location compatible to
-  `minetest.get_inventory(location)`.
-    * returns `{type="undefined"}` in case location is not known
-
-`ItemStack`
------------
-
-An `ItemStack` is a stack of items.
-
-It can be created via `ItemStack(x)`, where x is an `ItemStack`,
-an itemstring, a table or `nil`.
-
-### Methods
-
-* `is_empty()`: returns `true` if stack is empty.
-* `get_name()`: returns item name (e.g. `"default:stone"`).
-* `set_name(item_name)`: returns a boolean indicating whether the item was
-  cleared.
-* `get_count()`: Returns number of items on the stack.
-* `set_count(count)`: returns a boolean indicating whether the item was cleared
-    * `count`: number, unsigned 16 bit integer
-* `get_wear()`: returns tool wear (`0`-`65535`), `0` for non-tools.
-* `set_wear(wear)`: returns boolean indicating whether item was cleared
-    * `wear`: number, unsigned 16 bit integer
-* `get_meta()`: returns ItemStackMetaRef. See section for more details
-* `get_metadata()`: (DEPRECATED) Returns metadata (a string attached to an item
-  stack).
-* `set_metadata(metadata)`: (DEPRECATED) Returns true.
-* `get_description()`: returns the description shown in inventory list tooltips.
-* `clear()`: removes all items from the stack, making it empty.
-* `replace(item)`: replace the contents of this stack.
-    * `item` can also be an itemstring or table.
-* `to_string()`: returns the stack in itemstring form.
-* `to_table()`: returns the stack in Lua table form.
-* `get_stack_max()`: returns the maximum size of the stack (depends on the
-  item).
-* `get_free_space()`: returns `get_stack_max() - get_count()`.
-* `is_known()`: returns `true` if the item name refers to a defined item type.
-* `get_definition()`: returns the item definition table.
-* `get_tool_capabilities()`: returns the digging properties of the item,
-  or those of the hand if none are defined for this item type
-* `add_wear(amount)`
-    * Increases wear by `amount` if the item is a tool
-    * `amount`: number, integer
-* `add_item(item)`: returns leftover `ItemStack`
-    * Put some item or stack onto this stack
-* `item_fits(item)`: returns `true` if item or stack can be fully added to
-  this one.
-* `take_item(n)`: returns taken `ItemStack`
-    * Take (and remove) up to `n` items from this stack
-    * `n`: number, default: `1`
-* `peek_item(n)`: returns taken `ItemStack`
-    * Copy (don't remove) up to `n` items from this stack
-    * `n`: number, default: `1`
-
-`ItemStackMetaRef`
-------------------
-
-ItemStack metadata: reference extra data and functionality stored in a stack.
-Can be obtained via `item:get_meta()`.
-
-### Methods
-
-* All methods in MetaDataRef
-* `set_tool_capabilities([tool_capabilities])`
-    * Overrides the item's tool capabilities
-    * A nil value will clear the override data and restore the original
-      behavior.
-
-`MetaDataRef`
--------------
-
-Base class used by [`StorageRef`], [`NodeMetaRef`], [`ItemStackMetaRef`],
-and [`PlayerMetaRef`].
-
-### Methods
-
-* `contains(key)`: Returns true if key present, otherwise false.
-    * Returns `nil` when the MetaData is inexistent.
-* `get(key)`: Returns `nil` if key not present, else the stored string.
-* `set_string(key, value)`: Value of `""` will delete the key.
-* `get_string(key)`: Returns `""` if key not present.
-* `set_int(key, value)`
-* `get_int(key)`: Returns `0` if key not present.
-* `set_float(key, value)`
-* `get_float(key)`: Returns `0` if key not present.
-* `to_table()`: returns `nil` or a table with keys:
-    * `fields`: key-value storage
-    * `inventory`: `{list1 = {}, ...}}` (NodeMetaRef only)
-* `from_table(nil or {})`
-    * Any non-table value will clear the metadata
-    * See [Node Metadata] for an example
-    * returns `true` on success
-* `equals(other)`
-    * returns `true` if this metadata has the same key-value pairs as `other`
-
-`ModChannel`
-------------
-
-An interface to use mod channels on client and server
-
-### Methods
-
-* `leave()`: leave the mod channel.
-    * Server leaves channel `channel_name`.
-    * No more incoming or outgoing messages can be sent to this channel from
-      server mods.
-    * This invalidate all future object usage.
-    * Ensure you set mod_channel to nil after that to free Lua resources.
-* `is_writeable()`: returns true if channel is writeable and mod can send over
-  it.
-* `send_all(message)`: Send `message` though the mod channel.
-    * If mod channel is not writeable or invalid, message will be dropped.
-    * Message size is limited to 65535 characters by protocol.
-
-`NodeMetaRef`
--------------
-
-Node metadata: reference extra data and functionality stored in a node.
-Can be obtained via `minetest.get_meta(pos)`.
-
-### Methods
-
-* All methods in MetaDataRef
-* `get_inventory()`: returns `InvRef`
-* `mark_as_private(name or {name1, name2, ...})`: Mark specific vars as private
-  This will prevent them from being sent to the client. Note that the "private"
-  status will only be remembered if an associated key-value pair exists,
-  meaning it's best to call this when initializing all other meta (e.g.
-  `on_construct`).
-
-`NodeTimerRef`
---------------
-
-Node Timers: a high resolution persistent per-node timer.
-Can be gotten via `minetest.get_node_timer(pos)`.
-
-### Methods
-
-* `set(timeout,elapsed)`
-    * set a timer's state
-    * `timeout` is in seconds, and supports fractional values (0.1 etc)
-    * `elapsed` is in seconds, and supports fractional values (0.1 etc)
-    * will trigger the node's `on_timer` function after `(timeout - elapsed)`
-      seconds.
-* `start(timeout)`
-    * start a timer
-    * equivalent to `set(timeout,0)`
-* `stop()`
-    * stops the timer
-* `get_timeout()`: returns current timeout in seconds
-    * if `timeout` equals `0`, timer is inactive
-* `get_elapsed()`: returns current elapsed time in seconds
-    * the node's `on_timer` function will be called after `(timeout - elapsed)`
-      seconds.
-* `is_started()`: returns boolean state of timer
-    * returns `true` if timer is started, otherwise `false`
-
-`ObjectRef`
------------
-
-Moving things in the game are generally these.
-This is basically a reference to a C++ `ServerActiveObject`.
-
-### Advice on handling `ObjectRefs`
-
-When you receive an `ObjectRef` as a callback argument or from another API
-function, it is possible to store the reference somewhere and keep it around.
-It will keep functioning until the object is unloaded or removed.
-
-However, doing this is **NOT** recommended as there is (intentionally) no method
-to test if a previously acquired `ObjectRef` is still valid.
-Instead, `ObjectRefs` should be "let go" of as soon as control is returned from
-Lua back to the engine.
-Doing so is much less error-prone and you will never need to wonder if the
-object you are working with still exists.
-
-
-### Methods
-
-* `get_pos()`: returns `{x=num, y=num, z=num}`
-* `set_pos(pos)`: `pos`=`{x=num, y=num, z=num}`
-* `move_to(pos, continuous=false)`
-    * Does an interpolated move for Lua entities for visually smooth transitions.
-    * If `continuous` is true, the Lua entity will not be moved to the current
-      position before starting the interpolated move.
-    * For players this does the same as `set_pos`,`continuous` is ignored.
-* `punch(puncher, time_from_last_punch, tool_capabilities, direction)`
-    * `puncher` = another `ObjectRef`,
-    * `time_from_last_punch` = time since last punch action of the puncher
-    * `direction`: can be `nil`
-* `right_click(clicker)`; `clicker` is another `ObjectRef`
-* `get_hp()`: returns number of hitpoints (2 * number of hearts)
-* `set_hp(hp, reason)`: set number of hitpoints (2 * number of hearts).
-    * See reason in register_on_player_hpchange
-    * Is limited to the range of 0 ... 65535 (2^16 - 1)
-    * For players: HP are also limited by `hp_max` specified in the player's
-      object properties
-* `get_inventory()`: returns an `InvRef` for players, otherwise returns `nil`
-* `get_wield_list()`: returns the name of the inventory list the wielded item
-   is in.
-* `get_wield_index()`: returns the index of the wielded item
-* `get_wielded_item()`: returns an `ItemStack`
-* `set_wielded_item(item)`: replaces the wielded item, returns `true` if
-  successful.
-* `set_armor_groups({group1=rating, group2=rating, ...})`
-* `get_armor_groups()`: returns a table with the armor group ratings
-* `set_animation(frame_range, frame_speed, frame_blend, frame_loop)`
-    * `frame_range`: table {x=num, y=num}, default: `{x=1, y=1}`
-    * `frame_speed`: number, default: `15.0`
-    * `frame_blend`: number, default: `0.0`
-    * `frame_loop`: boolean, default: `true`
-* `get_animation()`: returns `range`, `frame_speed`, `frame_blend` and
-  `frame_loop`.
-* `set_animation_frame_speed(frame_speed)`
-    * `frame_speed`: number, default: `15.0`
-* `set_attach(parent, bone, position, rotation)`
-    * `bone`: string
-    * `position`: `{x=num, y=num, z=num}` (relative)
-    * `rotation`: `{x=num, y=num, z=num}` = Rotation on each axis, in degrees
-* `get_attach()`: returns parent, bone, position, rotation or nil if it isn't
-  attached.
-* `set_detach()`
-* `set_bone_position(bone, position, rotation)`
-    * `bone`: string
-    * `position`: `{x=num, y=num, z=num}` (relative)
-    * `rotation`: `{x=num, y=num, z=num}`
-* `get_bone_position(bone)`: returns position and rotation of the bone
-* `set_properties(object property table)`
-* `get_properties()`: returns object property table
-* `is_player()`: returns true for players, false otherwise
-* `get_nametag_attributes()`
-    * returns a table with the attributes of the nametag of an object
-    * {
-        color = {a=0..255, r=0..255, g=0..255, b=0..255},
-        text = "",
-      }
-* `set_nametag_attributes(attributes)`
-    * sets the attributes of the nametag of an object
-    * `attributes`:
-      {
-        color = ColorSpec,
-        text = "My Nametag",
-      }
-
-#### Lua entity only (no-op for other objects)
-
-* `remove()`: remove object
-    * The object is removed after returning from Lua. However the `ObjectRef`
-      itself instantly becomes unusable with all further method calls having
-      no effect and returning `nil`.
-* `set_velocity(vel)`
-    * `vel` is a vector, e.g. `{x=0.0, y=2.3, z=1.0}`
-* `add_velocity(vel)`
-    * `vel` is a vector, e.g. `{x=0.0, y=2.3, z=1.0}`
-    * In comparison to using get_velocity, adding the velocity and then using
-      set_velocity, add_velocity is supposed to avoid synchronization problems.
-* `get_velocity()`: returns the velocity, a vector
-* `set_acceleration(acc)`
-    * `acc` is a vector
-* `get_acceleration()`: returns the acceleration, a vector
-* `set_rotation(rot)`
-    * `rot` is a vector (radians). X is pitch (elevation), Y is yaw (heading)
-      and Z is roll (bank).
-* `get_rotation()`: returns the rotation, a vector (radians)
-* `set_yaw(radians)`: sets the yaw (heading).
-* `get_yaw()`: returns number in radians
-* `set_texture_mod(mod)`
-* `get_texture_mod()` returns current texture modifier
-* `set_sprite(p, num_frames, framelength, select_horiz_by_yawpitch)`
-    * Select sprite from spritesheet with optional animation and Dungeon Master
-      style texture selection based on yaw relative to camera
-    * `p`: {x=number, y=number}, the coordinate of the first frame
-      (x: column, y: row), default: `{x=0, y=0}`
-    * `num_frames`: number, default: `1`
-    * `framelength`: number, default: `0.2`
-    * `select_horiz_by_yawpitch`: boolean, this was once used for the Dungeon
-      Master mob, default: `false`
-* `get_entity_name()` (**Deprecated**: Will be removed in a future version)
-* `get_luaentity()`
-
-#### Player only (no-op for other objects)
-
-* `get_player_name()`: returns `""` if is not a player
-* `get_player_velocity()`: returns `nil` if is not a player, otherwise a
-  table {x, y, z} representing the player's instantaneous velocity in nodes/s
-* `add_player_velocity(vel)`
-    * Adds to player velocity, this happens client-side and only once.
-    * Does not apply during free_move.
-    * Note that since the player speed is normalized at each move step,
-      increasing e.g. Y velocity beyond what would usually be achieved
-      (see: physics overrides) will cause existing X/Z velocity to be reduced.
-    * Example: `add_player_velocity({x=0, y=6.5, z=0})` is equivalent to
-      pressing the jump key (assuming default settings)
-* `get_look_dir()`: get camera direction as a unit vector
-* `get_look_vertical()`: pitch in radians
-    * Angle ranges between -pi/2 and pi/2, which are straight up and down
-      respectively.
-* `get_look_horizontal()`: yaw in radians
-    * Angle is counter-clockwise from the +z direction.
-* `set_look_vertical(radians)`: sets look pitch
-    * radians: Angle from looking forward, where positive is downwards.
-* `set_look_horizontal(radians)`: sets look yaw
-    * radians: Angle from the +z direction, where positive is counter-clockwise.
-* `get_look_pitch()`: pitch in radians - Deprecated as broken. Use
-  `get_look_vertical`.
-    * Angle ranges between -pi/2 and pi/2, which are straight down and up
-      respectively.
-* `get_look_yaw()`: yaw in radians - Deprecated as broken. Use
-  `get_look_horizontal`.
-    * Angle is counter-clockwise from the +x direction.
-* `set_look_pitch(radians)`: sets look pitch - Deprecated. Use
-  `set_look_vertical`.
-* `set_look_yaw(radians)`: sets look yaw - Deprecated. Use
-  `set_look_horizontal`.
-* `get_breath()`: returns player's breath
-* `set_breath(value)`: sets player's breath
-    * values:
-        * `0`: player is drowning
-        * max: bubbles bar is not shown
-        * See [Object properties] for more information
-    * Is limited to range 0 ... 65535 (2^16 - 1)
-* `set_fov(fov, is_multiplier)`: Sets player's FOV
-    * `fov`: FOV value.
-    * `is_multiplier`: Set to `true` if the FOV value is a multiplier.
-      Defaults to `false`.
-    * Set to 0 to clear FOV override.
-* `get_fov()`:
-    * Returns player's FOV override in degrees, and a boolean depending on whether
-      the value is a multiplier.
-    * Returns 0 as first value if player's FOV hasn't been overridden.
-* `set_attribute(attribute, value)`:  DEPRECATED, use get_meta() instead
-    * Sets an extra attribute with value on player.
-    * `value` must be a string, or a number which will be converted to a
-      string.
-    * If `value` is `nil`, remove attribute from player.
-* `get_attribute(attribute)`:  DEPRECATED, use get_meta() instead
-    * Returns value (a string) for extra attribute.
-    * Returns `nil` if no attribute found.
-* `get_meta()`: Returns a PlayerMetaRef.
-* `set_inventory_formspec(formspec)`
-    * Redefine player's inventory form
-    * Should usually be called in `on_joinplayer`
-* `get_inventory_formspec()`: returns a formspec string
-* `set_formspec_prepend(formspec)`:
-    * the formspec string will be added to every formspec shown to the user,
-      except for those with a no_prepend[] tag.
-    * This should be used to set style elements such as background[] and
-      bgcolor[], any non-style elements (eg: label) may result in weird behaviour.
-    * Only affects formspecs shown after this is called.
-* `get_formspec_prepend(formspec)`: returns a formspec string.
-* `get_player_control()`: returns table with player pressed keys
-    * The table consists of fields with boolean value representing the pressed
-      keys, the fields are jump, right, left, LMB, RMB, sneak, aux1, down, up.
-    * example: `{jump=false, right=true, left=false, LMB=false, RMB=false,
-      sneak=true, aux1=false, down=false, up=false}`
-* `get_player_control_bits()`: returns integer with bit packed player pressed
-  keys.
-    * bit nr/meaning: 0/up, 1/down, 2/left, 3/right, 4/jump, 5/aux1, 6/sneak,
-      7/LMB, 8/RMB
-* `set_physics_override(override_table)`
-    * `override_table` is a table with the following fields:
-        * `speed`: multiplier to default walking speed value (default: `1`)
-        * `jump`: multiplier to default jump value (default: `1`)
-        * `gravity`: multiplier to default gravity value (default: `1`)
-        * `sneak`: whether player can sneak (default: `true`)
-        * `sneak_glitch`: whether player can use the new move code replications
-          of the old sneak side-effects: sneak ladders and 2 node sneak jump
-          (default: `false`)
-        * `new_move`: use new move/sneak code. When `false` the exact old code
-          is used for the specific old sneak behaviour (default: `true`)
-* `get_physics_override()`: returns the table given to `set_physics_override`
-* `hud_add(hud definition)`: add a HUD element described by HUD def, returns ID
-   number on success
-* `hud_remove(id)`: remove the HUD element of the specified id
-* `hud_change(id, stat, value)`: change a value of a previously added HUD
-  element.
-    * element `stat` values:
-      `position`, `name`, `scale`, `text`, `number`, `item`, `dir`
-* `hud_get(id)`: gets the HUD element definition structure of the specified ID
-* `hud_set_flags(flags)`: sets specified HUD flags of player.
-    * `flags`: A table with the following fields set to boolean values
-        * hotbar
-        * healthbar
-        * crosshair
-        * wielditem
-        * breathbar
-        * minimap
-        * minimap_radar
-    * If a flag equals `nil`, the flag is not modified
-    * `minimap`: Modifies the client's permission to view the minimap.
-      The client may locally elect to not view the minimap.
-    * `minimap_radar` is only usable when `minimap` is true
-* `hud_get_flags()`: returns a table of player HUD flags with boolean values.
-    * See `hud_set_flags` for a list of flags that can be toggled.
-* `hud_set_hotbar_itemcount(count)`: sets number of items in builtin hotbar
-    * `count`: number of items, must be between `1` and `32`
-* `hud_get_hotbar_itemcount`: returns number of visible items
-* `hud_set_hotbar_image(texturename)`
-    * sets background image for hotbar
-* `hud_get_hotbar_image`: returns texturename
-* `hud_set_hotbar_selected_image(texturename)`
-    * sets image for selected item of hotbar
-* `hud_get_hotbar_selected_image`: returns texturename
-* `set_sky(parameters)`
-    * `parameters` is a table with the following optional fields:
-        * `base_color`: ColorSpec, changes fog in "skybox" and "plain".
-        * `type`: Available types:
-            * `"regular"`: Uses 0 textures, `base_color` ignored
-            * `"skybox"`: Uses 6 textures, `base_color` used as fog.
-            * `"plain"`: Uses 0 textures, `base_color` used as both fog and sky.
-        * `textures`: A table containing up to six textures in the following
-            order: Y+ (top), Y- (bottom), X- (west), X+ (east), Z+ (north), Z- (south).
-        * `clouds`: Boolean for whether clouds appear. (default: `true`)
-        * `sky_color`: A table containing the following values, alpha is ignored:
-            * `day_sky`: ColorSpec, for the top half of the `"regular"`
-              skybox during the day. (default: `#8cbafa`)
-            * `day_horizon`: ColorSpec, for the bottom half of the 
-              `"regular"` skybox during the day. (default: `#9bc1f0`)
-            * `dawn_sky`: ColorSpec, for the top half of the `"regular"`
-              skybox during dawn/sunset. (default: `#b4bafa`)
-            * `dawn_horizon`: ColorSpec, for the bottom half of the `"regular"`
-              skybox during dawn/sunset. (default: `#bac1f0`)
-            * `night_sky`: ColorSpec, for the top half of the `"regular"`
-              skybox during the night. (default: `#006aff`)
-            * `night_horizon`: ColorSpec, for the bottom half of the `"regular"`
-              skybox during the night. (default: `#4090ff`)
-            * `indoors`: ColorSpec, for when you're either indoors or 
-              underground. Only applies to the `"regular"` skybox.
-              (default: `#646464`)
-            * `fog_sun_tint`: ColorSpec, changes the fog tinting for the sun
-              at sunrise and sunset.
-            * `fog_moon_tint`: ColorSpec, changes the fog tinting for the moon
-              at sunrise and sunset.
-            * `fog_tint_type`: string, changes which mode the directional fog
-                abides by, `"custom"` uses `sun_tint` and `moon_tint`, while
-                `"default"` uses the classic Minetest sun and moon tinting.
-                Will use tonemaps, if set to `"default"`. (default: `"default"`)
-* `get_sky()`: returns base_color, type, table of textures, clouds.
-* `get_sky_color()`: returns a table with the `sky_color` parameters as in
-    `set_sky`.
-* `set_sun(parameters)`:
-    * `parameters` is a table with the following optional fields:
-        * `visible`: Boolean for whether the sun is visible.
-            (default: `true`)
-        * `texture`: A regular texture for the sun. Setting to `""`
-            will re-enable the mesh sun. (default: `"sun.png"`)
-        * `tonemap`: A 512x1 texture containing the tonemap for the sun
-            (default: `"sun_tonemap.png"`)
-        * `sunrise`: A regular texture for the sunrise texture.
-            (default: `"sunrisebg.png"`)
-        * `sunrise_visible`: Boolean for whether the sunrise texture is visible.
-            (default: `true`)
-        * `scale`: Float controlling the overall size of the sun. (default: `1`)
-* `get_sun()`: returns a table with the current sun parameters as in
-    `set_sun`.
-* `set_moon(parameters)`:
-    * `parameters` is a table with the following optional fields:
-        * `visible`: Boolean for whether the moon is visible.
-            (default: `true`)
-        * `texture`: A regular texture for the moon. Setting to `""`
-            will re-enable the mesh moon. (default: `"moon.png"`)
-        * `tonemap`: A 512x1 texture containing the tonemap for the moon
-            (default: `"moon_tonemap.png"`)
-        * `scale`: Float controlling the overall size of the moon (default: `1`)
-* `get_moon()`: returns a table with the current moon parameters as in
-    `set_moon`.
-* `set_stars(parameters)`:
-    * `parameters` is a table with the following optional fields:
-        * `visible`: Boolean for whether the stars are visible.
-            (default: `true`)
-        * `count`: Integer number to set the number of stars in 
-            the skybox. Only applies to `"skybox"` and `"regular"` skyboxes.
-            (default: `1000`)
-        * `star_color`: ColorSpec, sets the colors of the stars,
-            alpha channel is used to set overall star brightness.
-            (default: `#ebebff69`)
-        * `scale`: Float controlling the overall size of the stars (default: `1`)
-* `get_stars()`: returns a table with the current stars parameters as in
-    `set_stars`.
-* `set_clouds(parameters)`: set cloud parameters
-    * `parameters` is a table with the following optional fields:
-        * `density`: from `0` (no clouds) to `1` (full clouds) (default `0.4`)
-        * `color`: basic cloud color with alpha channel, ColorSpec
-          (default `#fff0f0e5`).
-        * `ambient`: cloud color lower bound, use for a "glow at night" effect.
-          ColorSpec (alpha ignored, default `#000000`)
-        * `height`: cloud height, i.e. y of cloud base (default per conf,
-          usually `120`)
-        * `thickness`: cloud thickness in nodes (default `16`)
-        * `speed`: 2D cloud speed + direction in nodes per second
-          (default `{x=0, z=-2}`).
-* `get_clouds()`: returns a table with the current cloud parameters as in
-  `set_clouds`.
-* `override_day_night_ratio(ratio or nil)`
-    * `0`...`1`: Overrides day-night ratio, controlling sunlight to a specific
-      amount.
-    * `nil`: Disables override, defaulting to sunlight based on day-night cycle
-* `get_day_night_ratio()`: returns the ratio or nil if it isn't overridden
-* `set_local_animation(stand/idle, walk, dig, walk+dig, frame_speed=frame_speed)`:
-  set animation for player model in third person view
-
-      set_local_animation({x=0, y=79},  -- stand/idle animation key frames
-          {x=168, y=187},  -- walk animation key frames
-          {x=189, y=198},  -- dig animation key frames
-          {x=200, y=219},  -- walk+dig animation key frames
-          frame_speed=30)  -- animation frame speed
-* `get_local_animation()`: returns stand, walk, dig, dig+walk tables and
-  `frame_speed`.
-* `set_eye_offset({x=0,y=0,z=0},{x=0,y=0,z=0})`: defines offset value for
-  camera per player.
-    * in first person view
-    * in third person view (max. values `{x=-10/10,y=-10,15,z=-5/5}`)
-* `get_eye_offset()`: returns `offset_first` and `offset_third`
-* `send_mapblock(blockpos)`:
-    * Sends a server-side loaded mapblock to the player.
-    * Returns `false` if failed.
-    * Resource intensive - use sparsely
-    * To get blockpos, integer divide pos by 16
-
-`PcgRandom`
------------
-
-A 32-bit pseudorandom number generator.
-Uses PCG32, an algorithm of the permuted congruential generator family,
-offering very strong randomness.
-
-It can be created via `PcgRandom(seed)` or `PcgRandom(seed, sequence)`.
-
-### Methods
-
-* `next()`: return next integer random number [`-2147483648`...`2147483647`]
-* `next(min, max)`: return next integer random number [`min`...`max`]
-* `rand_normal_dist(min, max, num_trials=6)`: return normally distributed
-  random number [`min`...`max`].
-    * This is only a rough approximation of a normal distribution with:
-    * `mean = (max - min) / 2`, and
-    * `variance = (((max - min + 1) ^ 2) - 1) / (12 * num_trials)`
-    * Increasing `num_trials` improves accuracy of the approximation
-
-`PerlinNoise`
--------------
-
-A perlin noise generator.
-It can be created via `PerlinNoise(seed, octaves, persistence, spread)`
-or `PerlinNoise(noiseparams)`.
-Alternatively with `minetest.get_perlin(seeddiff, octaves, persistence, spread)`
-or `minetest.get_perlin(noiseparams)`.
-
-### Methods
-
-* `get_2d(pos)`: returns 2D noise value at `pos={x=,y=}`
-* `get_3d(pos)`: returns 3D noise value at `pos={x=,y=,z=}`
-
-`PerlinNoiseMap`
-----------------
-
-A fast, bulk perlin noise generator.
-
-It can be created via `PerlinNoiseMap(noiseparams, size)` or
-`minetest.get_perlin_map(noiseparams, size)`.
-
-Format of `size` is `{x=dimx, y=dimy, z=dimz}`. The `z` component is omitted
-for 2D noise, and it must be must be larger than 1 for 3D noise (otherwise
-`nil` is returned).
-
-For each of the functions with an optional `buffer` parameter: If `buffer` is
-not nil, this table will be used to store the result instead of creating a new
-table.
-
-### Methods
-
-* `get_2d_map(pos)`: returns a `<size.x>` times `<size.y>` 2D array of 2D noise
-  with values starting at `pos={x=,y=}`
-* `get_3d_map(pos)`: returns a `<size.x>` times `<size.y>` times `<size.z>`
-  3D array of 3D noise with values starting at `pos={x=,y=,z=}`.
-* `get_2d_map_flat(pos, buffer)`: returns a flat `<size.x * size.y>` element
-  array of 2D noise with values starting at `pos={x=,y=}`
-* `get_3d_map_flat(pos, buffer)`: Same as `get2dMap_flat`, but 3D noise
-* `calc_2d_map(pos)`: Calculates the 2d noise map starting at `pos`. The result
-  is stored internally.
-* `calc_3d_map(pos)`: Calculates the 3d noise map starting at `pos`. The result
-  is stored internally.
-* `get_map_slice(slice_offset, slice_size, buffer)`: In the form of an array,
-  returns a slice of the most recently computed noise results. The result slice
-  begins at coordinates `slice_offset` and takes a chunk of `slice_size`.
-  E.g. to grab a 2-slice high horizontal 2d plane of noise starting at buffer
-  offset y = 20:
-  `noisevals = noise:get_map_slice({y=20}, {y=2})`
-  It is important to note that `slice_offset` offset coordinates begin at 1,
-  and are relative to the starting position of the most recently calculated
-  noise.
-  To grab a single vertical column of noise starting at map coordinates
-  x = 1023, y=1000, z = 1000:
-  `noise:calc_3d_map({x=1000, y=1000, z=1000})`
-  `noisevals = noise:get_map_slice({x=24, z=1}, {x=1, z=1})`
-
-`PlayerMetaRef`
----------------
-
-Player metadata.
-Uses the same method of storage as the deprecated player attribute API, so
-data there will also be in player meta.
-Can be obtained using `player:get_meta()`.
-
-### Methods
-
-* All methods in MetaDataRef
-
-`PseudoRandom`
---------------
-
-A 16-bit pseudorandom number generator.
-Uses a well-known LCG algorithm introduced by K&R.
-
-It can be created via `PseudoRandom(seed)`.
-
-### Methods
-
-* `next()`: return next integer random number [`0`...`32767`]
-* `next(min, max)`: return next integer random number [`min`...`max`]
-    * `((max - min) == 32767) or ((max-min) <= 6553))` must be true
-      due to the simple implementation making bad distribution otherwise.
-
-`Raycast`
----------
-
-A raycast on the map. It works with selection boxes.
-Can be used as an iterator in a for loop as:
-
-    local ray = Raycast(...)
-    for pointed_thing in ray do
-        ...
-    end
-
-The map is loaded as the ray advances. If the map is modified after the
-`Raycast` is created, the changes may or may not have an effect on the object.
-
-It can be created via `Raycast(pos1, pos2, objects, liquids)` or
-`minetest.raycast(pos1, pos2, objects, liquids)` where:
-
-* `pos1`: start of the ray
-* `pos2`: end of the ray
-* `objects`: if false, only nodes will be returned. Default is true.
-* `liquids`: if false, liquid nodes won't be returned. Default is false.
-
-### Methods
-
-* `next()`: returns a `pointed_thing` with exact pointing location
-    * Returns the next thing pointed by the ray or nil.
-
-`SecureRandom`
---------------
-
-Interface for the operating system's crypto-secure PRNG.
-
-It can be created via `SecureRandom()`.  The constructor returns nil if a
-secure random device cannot be found on the system.
-
-### Methods
-
-* `next_bytes([count])`: return next `count` (default 1, capped at 2048) many
-  random bytes, as a string.
-
-`Settings`
-----------
-
-An interface to read config files in the format of `minetest.conf`.
-
-It can be created via `Settings(filename)`.
-
-### Methods
-
-* `get(key)`: returns a value
-* `get_bool(key, [default])`: returns a boolean
-    * `default` is the value returned if `key` is not found.
-    * Returns `nil` if `key` is not found and `default` not specified.
-* `get_np_group(key)`: returns a NoiseParams table
-* `get_flags(key)`:
-    * Returns `{flag = true/false, ...}` according to the set flags.
-    * Is currently limited to mapgen flags `mg_flags` and mapgen-specific
-      flags like `mgv5_spflags`.
-* `set(key, value)`
-    * Setting names can't contain whitespace or any of `="{}#`.
-    * Setting values can't contain the sequence `\n"""`.
-    * Setting names starting with "secure." can't be set on the main settings
-      object (`minetest.settings`).
-* `set_bool(key, value)`
-    * See documentation for set() above.
-* `set_np_group(key, value)`
-    * `value` is a NoiseParams table.
-    * Also, see documentation for set() above.
-* `remove(key)`: returns a boolean (`true` for success)
-* `get_names()`: returns `{key1,...}`
-* `write()`: returns a boolean (`true` for success)
-    * Writes changes to file.
-* `to_table()`: returns `{[key1]=value1,...}`
-
-### Format
-
-The settings have the format `key = value`. Example:
-
-    foo = example text
-    bar = """
-    Multiline
-    value
-    """
-
-
-`StorageRef`
-------------
-
-Mod metadata: per mod metadata, saved automatically.
-Can be obtained via `minetest.get_mod_storage()` during load time.
-
-WARNING: This storage backend is incaptable to save raw binary data due
-to restrictions of JSON.
-
-### Methods
-
-* All methods in MetaDataRef
-
-
-
-
-Definition tables
-=================
-
-Object properties
------------------
-
-Used by `ObjectRef` methods. Part of an Entity definition.
-These properties are not persistent, but are applied automatically to the
-corresponding Lua entity using the given registration fields.
-Player properties need to be saved manually.
-
-    {
-        hp_max = 1,
-        -- For players only. Defaults to `minetest.PLAYER_MAX_HP_DEFAULT`.
-
-        breath_max = 0,
-        -- For players only. Defaults to `minetest.PLAYER_MAX_BREATH_DEFAULT`.
-
-        zoom_fov = 0.0,
-        -- For players only. Zoom FOV in degrees.
-        -- Note that zoom loads and/or generates world beyond the server's
-        -- maximum send and generate distances, so acts like a telescope.
-        -- Smaller zoom_fov values increase the distance loaded/generated.
-        -- Defaults to 15 in creative mode, 0 in survival mode.
-        -- zoom_fov = 0 disables zooming for the player.
-
-        eye_height = 1.625,
-        -- For players only. Camera height above feet position in nodes.
-        -- Defaults to 1.625.
-
-        physical = true,
-        -- Collide with `walkable` nodes.
-
-        collide_with_objects = true,
-        -- Collide with other objects if physical = true
-
-        collisionbox = {-0.5, 0.0, -0.5, 0.5, 1.0, 0.5},  -- Default
-        selectionbox = {-0.5, 0.0, -0.5, 0.5, 1.0, 0.5},
-        -- Selection box uses collision box dimensions when not set.
-        -- For both boxes: {xmin, ymin, zmin, xmax, ymax, zmax} in nodes from
-        -- object position.
-
-        pointable = true,
-        -- Overrides selection box when false
-
-        visual = "cube" / "sprite" / "upright_sprite" / "mesh" / "wielditem" / "item",
-        -- "cube" is a node-sized cube.
-        -- "sprite" is a flat texture always facing the player.
-        -- "upright_sprite" is a vertical flat texture.
-        -- "mesh" uses the defined mesh model.
-        -- "wielditem" is used for dropped items.
-        --   (see builtin/game/item_entity.lua).
-        --   For this use 'wield_item = itemname' (Deprecated: 'textures = {itemname}').
-        --   If the item has a 'wield_image' the object will be an extrusion of
-        --   that, otherwise:
-        --   If 'itemname' is a cubic node or nodebox the object will appear
-        --   identical to 'itemname'.
-        --   If 'itemname' is a plantlike node the object will be an extrusion
-        --   of its texture.
-        --   Otherwise for non-node items, the object will be an extrusion of
-        --   'inventory_image'.
-        --   If 'itemname' contains a ColorString or palette index (e.g. from
-        --   `minetest.itemstring_with_palette()`), the entity will inherit the color.
-        -- "item" is similar to "wielditem" but ignores the 'wield_image' parameter.
-
-        visual_size = {x = 1, y = 1, z = 1},
-        -- Multipliers for the visual size. If `z` is not specified, `x` will be used
-        -- to scale the entity along both horizontal axes.
-
-        mesh = "model.obj",
-        -- File name of mesh when using "mesh" visual
-
-        textures = {},
-        -- Number of required textures depends on visual.
-        -- "cube" uses 6 textures just like a node, but all 6 must be defined.
-        -- "sprite" uses 1 texture.
-        -- "upright_sprite" uses 2 textures: {front, back}.
-        -- "wielditem" expects 'textures = {itemname}' (see 'visual' above).
-
-        colors = {},
-        -- Number of required colors depends on visual
-
-        use_texture_alpha = false,
-        -- Use texture's alpha channel.
-        -- Excludes "upright_sprite" and "wielditem".
-        -- Note: currently causes visual issues when viewed through other
-        -- semi-transparent materials such as water.
-
-        spritediv = {x = 1, y = 1},
-        -- Used with spritesheet textures for animation and/or frame selection
-        -- according to position relative to player.
-        -- Defines the number of columns and rows in the spritesheet:
-        -- {columns, rows}.
-
-        initial_sprite_basepos = {x = 0, y = 0},
-        -- Used with spritesheet textures.
-        -- Defines the {column, row} position of the initially used frame in the
-        -- spritesheet.
-
-        is_visible = true,
-        -- If false, object is invisible and can't be pointed.
-
-        makes_footstep_sound = false,
-        -- If true, is able to make footstep sounds of nodes
-        -- (see node sound definition for details).
-
-        automatic_rotate = 0,
-        -- Set constant rotation in radians per second, positive or negative.
-        -- Set to 0 to disable constant rotation.
-
-        stepheight = 0,
-        -- If positive number, object will climb upwards when it moves
-        -- horizontally against a `walkable` node, if the height difference
-        -- is within `stepheight`.
-
-        automatic_face_movement_dir = 0.0,
-        -- Automatically set yaw to movement direction, offset in degrees.
-        -- 'false' to disable.
-
-        automatic_face_movement_max_rotation_per_sec = -1,
-        -- Limit automatic rotation to this value in degrees per second.
-        -- No limit if value <= 0.
-
-        backface_culling = true,
-        -- Set to false to disable backface_culling for model
-
-        glow = 0,
-        -- Add this much extra lighting when calculating texture color.
-        -- Value < 0 disables light's effect on texture color.
-        -- For faking self-lighting, UI style entities, or programmatic coloring
-        -- in mods.
-
-        nametag = "",
-        -- By default empty, for players their name is shown if empty
-
-        nametag_color = <ColorSpec>,
-        -- Sets color of nametag
-
-        infotext = "",
-        -- By default empty, text to be shown when pointed at object
-
-        static_save = true,
-        -- If false, never save this object statically. It will simply be
-        -- deleted when the block gets unloaded.
-        -- The get_staticdata() callback is never called then.
-        -- Defaults to 'true'.
-    }
-
-Entity definition
------------------
-
-Used by `minetest.register_entity`.
-
-    {
-        initial_properties = {
-            visual = "mesh",
-            mesh = "boats_boat.obj",
-            ...,
-        },
-        -- A table of object properties, see the `Object properties` section.
-        -- Object properties being read directly from the entity definition
-        -- table is deprecated. Define object properties in this
-        -- `initial_properties` table instead.
-
-        on_activate = function(self, staticdata, dtime_s),
-
-        on_step = function(self, dtime),
-
-        on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir),
-
-        on_rightclick = function(self, clicker),
-
-        get_staticdata = function(self),
-        -- Called sometimes; the string returned is passed to on_activate when
-        -- the entity is re-activated from static state
-
-        _custom_field = whatever,
-        -- You can define arbitrary member variables here (see Item definition
-        -- for more info) by using a '_' prefix
-    }
-
-ABM (ActiveBlockModifier) definition
-------------------------------------
-
-Used by `minetest.register_abm`.
-
-    {
-        label = "Lava cooling",
-        -- Descriptive label for profiling purposes (optional).
-        -- Definitions with identical labels will be listed as one.
-
-        nodenames = {"default:lava_source"},
-        -- Apply `action` function to these nodes.
-        -- `group:groupname` can also be used here.
-
-        neighbors = {"default:water_source", "default:water_flowing"},
-        -- Only apply `action` to nodes that have one of, or any
-        -- combination of, these neighbors.
-        -- If left out or empty, any neighbor will do.
-        -- `group:groupname` can also be used here.
-
-        interval = 1.0,
-        -- Operation interval in seconds
-
-        chance = 1,
-        -- Chance of triggering `action` per-node per-interval is 1.0 / this
-        -- value
-
-        catch_up = true,
-        -- If true, catch-up behaviour is enabled: The `chance` value is
-        -- temporarily reduced when returning to an area to simulate time lost
-        -- by the area being unattended. Note that the `chance` value can often
-        -- be reduced to 1.
-
-        action = function(pos, node, active_object_count, active_object_count_wider),
-        -- Function triggered for each qualifying node.
-        -- `active_object_count` is number of active objects in the node's
-        -- mapblock.
-        -- `active_object_count_wider` is number of active objects in the node's
-        -- mapblock plus all 26 neighboring mapblocks. If any neighboring
-        -- mapblocks are unloaded an estmate is calculated for them based on
-        -- loaded mapblocks.
-    }
-
-LBM (LoadingBlockModifier) definition
--------------------------------------
-
-Used by `minetest.register_lbm`.
-
-A loading block modifier (LBM) is used to define a function that is called for
-specific nodes (defined by `nodenames`) when a mapblock which contains such nodes
-gets loaded.
-
-    {
-        label = "Upgrade legacy doors",
-        -- Descriptive label for profiling purposes (optional).
-        -- Definitions with identical labels will be listed as one.
-
-        name = "modname:replace_legacy_door",
-
-        nodenames = {"default:lava_source"},
-        -- List of node names to trigger the LBM on.
-        -- Also non-registered nodes will work.
-        -- Groups (as of group:groupname) will work as well.
-
-        run_at_every_load = false,
-        -- Whether to run the LBM's action every time a block gets loaded,
-        -- and not only the first time the block gets loaded after the LBM
-        -- was introduced.
-
-        action = function(pos, node),
-    }
-
-Tile definition
----------------
-
-* `"image.png"`
-* `{name="image.png", animation={Tile Animation definition}}`
-* `{name="image.png", backface_culling=bool, tileable_vertical=bool,
-  tileable_horizontal=bool, align_style="node"/"world"/"user", scale=int}`
-    * backface culling enabled by default for most nodes
-    * tileable flags are info for shaders, how they should treat texture
-      when displacement mapping is used.
-      Directions are from the point of view of the tile texture,
-      not the node it's on.
-    * align style determines whether the texture will be rotated with the node
-      or kept aligned with its surroundings. "user" means that client
-      setting will be used, similar to `glasslike_framed_optional`.
-      Note: supported by solid nodes and nodeboxes only.
-    * scale is used to make texture span several (exactly `scale`) nodes,
-      instead of just one, in each direction. Works for world-aligned
-      textures only.
-      Note that as the effect is applied on per-mapblock basis, `16` should
-      be equally divisible by `scale` or you may get wrong results.
-* `{name="image.png", color=ColorSpec}`
-    * the texture's color will be multiplied with this color.
-    * the tile's color overrides the owning node's color in all cases.
-* deprecated, yet still supported field names:
-    * `image` (name)
-
-Tile animation definition
--------------------------
-
-    {
-        type = "vertical_frames",
-
-        aspect_w = 16,
-        -- Width of a frame in pixels
-
-        aspect_h = 16,
-        -- Height of a frame in pixels
-
-        length = 3.0,
-        -- Full loop length
-    }
-
-    {
-        type = "sheet_2d",
-
-        frames_w = 5,
-        -- Width in number of frames
-
-        frames_h = 3,
-        -- Height in number of frames
-
-        frame_length = 0.5,
-        -- Length of a single frame
-    }
-
-Item definition
----------------
-
-Used by `minetest.register_node`, `minetest.register_craftitem`, and
-`minetest.register_tool`.
-
-    {
-        description = "Steel Axe",
-
-        groups = {},
-        -- key = name, value = rating; rating = 1..3.
-        -- If rating not applicable, use 1.
-        -- e.g. {wool = 1, fluffy = 3}
-        --      {soil = 2, outerspace = 1, crumbly = 1}
-        --      {bendy = 2, snappy = 1},
-        --      {hard = 1, metal = 1, spikes = 1}
-
-        inventory_image = "default_tool_steelaxe.png",
-
-        inventory_overlay = "overlay.png",
-        -- An overlay which does not get colorized
-
-        wield_image = "",
-
-        wield_overlay = "",
-
-        palette = "",
-        -- An image file containing the palette of a node.
-        -- You can set the currently used color as the "palette_index" field of
-        -- the item stack metadata.
-        -- The palette is always stretched to fit indices between 0 and 255, to
-        -- ensure compatibility with "colorfacedir" and "colorwallmounted" nodes.
-
-        color = "0xFFFFFFFF",
-        -- The color of the item. The palette overrides this.
-
-        wield_scale = {x = 1, y = 1, z = 1},
-
-        stack_max = 99,
-
-        range = 4.0,
-
-        liquids_pointable = false,
-
-        -- See "Tools" section for an example including explanation
-        tool_capabilities = {
-            full_punch_interval = 1.0,
-            max_drop_level = 0,
-            groupcaps = {
-                -- For example:
-                choppy = {times = {[1] = 2.50, [2] = 1.40, [3] = 1.00},
-                         uses = 20, maxlevel = 2},
-            },
-            damage_groups = {groupname = damage},
-            -- Damage values must be between -32768 and 32767 (2^15)
-
-            punch_attack_uses = nil,
-            -- Amount of uses this tool has for attacking players and entities
-            -- by punching them (0 = infinite uses).
-            -- For compatibility, this is automatically set from the first
-            -- suitable groupcap using the forumla "uses * 3^(maxlevel - 1)".
-            -- It is recommend to set this explicitly instead of relying on the
-            -- fallback behavior.
-        },
-
-        node_placement_prediction = nil,
-        -- If nil and item is node, prediction is made automatically.
-        -- If nil and item is not a node, no prediction is made.
-        -- If "" and item is anything, no prediction is made.
-        -- Otherwise should be name of node which the client immediately places
-        -- on ground when the player places the item. Server will always update
-        -- actual result to client in a short moment.
-
-        node_dig_prediction = "air",
-        -- if "", no prediction is made.
-        -- if "air", node is removed.
-        -- Otherwise should be name of node which the client immediately places
-        -- upon digging. Server will always update actual result shortly.
-
-        sound = {
-            -- Definition of items sounds to be played at various events.
-            -- All fields in this table are optional.
-
-            breaks = <SimpleSoundSpec>,
-            -- When tool breaks due to wear. Ignored for non-tools
-
-            eat = <SimpleSoundSpec>,
-            -- When item is eaten with `minetest.do_item_eat`
-        },
-
-        on_place = function(itemstack, placer, pointed_thing),
-        -- Shall place item and return the leftover itemstack.
-        -- The placer may be any ObjectRef or nil.
-        -- default: minetest.item_place
-
-        on_secondary_use = function(itemstack, user, pointed_thing),
-        -- Same as on_place but called when not pointing at a node.
-        -- The user may be any ObjectRef or nil.
-        -- default: nil
-
-        on_drop = function(itemstack, dropper, pos),
-        -- Shall drop item and return the leftover itemstack.
-        -- The dropper may be any ObjectRef or nil.
-        -- default: minetest.item_drop
-
-        on_use = function(itemstack, user, pointed_thing),
-        -- default: nil
-        -- Function must return either nil if no item shall be removed from
-        -- inventory, or an itemstack to replace the original itemstack.
-        -- e.g. itemstack:take_item(); return itemstack
-        -- Otherwise, the function is free to do what it wants.
-        -- The user may be any ObjectRef or nil.
-        -- The default functions handle regular use cases.
-
-        after_use = function(itemstack, user, node, digparams),
-        -- default: nil
-        -- If defined, should return an itemstack and will be called instead of
-        -- wearing out the tool. If returns nil, does nothing.
-        -- If after_use doesn't exist, it is the same as:
-        --   function(itemstack, user, node, digparams)
-        --     itemstack:add_wear(digparams.wear)
-        --     return itemstack
-        --   end
-        -- The user may be any ObjectRef or nil.
-
-        _custom_field = whatever,
-        -- Add your own custom fields. By convention, all custom field names
-        -- should start with `_` to avoid naming collisions with future engine
-        -- usage.
-    }
-
-Node definition
----------------
-
-Used by `minetest.register_node`.
-
-    {
-        -- <all fields allowed in item definitions>,
-
-        drawtype = "normal",  -- See "Node drawtypes"
-
-        visual_scale = 1.0,
-        -- Supported for drawtypes "plantlike", "signlike", "torchlike",
-        -- "firelike", "mesh".
-        -- For plantlike and firelike, the image will start at the bottom of the
-        -- node. For torchlike, the image will start at the surface to which the
-        -- node "attaches". For the other drawtypes the image will be centered
-        -- on the node.
-
-        tiles = {tile definition 1, def2, def3, def4, def5, def6},
-        -- Textures of node; +Y, -Y, +X, -X, +Z, -Z
-        -- Old field name was 'tile_images'.
-        -- List can be shortened to needed length.
-
-        overlay_tiles = {tile definition 1, def2, def3, def4, def5, def6},
-        -- Same as `tiles`, but these textures are drawn on top of the base
-        -- tiles. You can use this to colorize only specific parts of your
-        -- texture. If the texture name is an empty string, that overlay is not
-        -- drawn. Since such tiles are drawn twice, it is not recommended to use
-        -- overlays on very common nodes.
-
-        special_tiles = {tile definition 1, Tile definition 2},
-        -- Special textures of node; used rarely.
-        -- Old field name was 'special_materials'.
-        -- List can be shortened to needed length.
-
-        color = ColorSpec,
-        -- The node's original color will be multiplied with this color.
-        -- If the node has a palette, then this setting only has an effect in
-        -- the inventory and on the wield item.
-
-        use_texture_alpha = false,
-        -- Use texture's alpha channel
-
-        palette = "palette.png",
-        -- The node's `param2` is used to select a pixel from the image.
-        -- Pixels are arranged from left to right and from top to bottom.
-        -- The node's color will be multiplied with the selected pixel's color.
-        -- Tiles can override this behavior.
-        -- Only when `paramtype2` supports palettes.
-
-        post_effect_color = "green#0F",
-        -- Screen tint if player is inside node, see "ColorSpec"
-
-        paramtype = "none",  -- See "Nodes"
-
-        paramtype2 = "none",  -- See "Nodes"
-
-        place_param2 = nil,  -- Force value for param2 when player places node
-
-        is_ground_content = true,
-        -- If false, the cave generator and dungeon generator will not carve
-        -- through this node.
-        -- Specifically, this stops mod-added nodes being removed by caves and
-        -- dungeons when those generate in a neighbor mapchunk and extend out
-        -- beyond the edge of that mapchunk.
-
-        sunlight_propagates = false,
-        -- If true, sunlight will go infinitely through this node
-
-        walkable = true,  -- If true, objects collide with node
-
-        pointable = true,  -- If true, can be pointed at
-
-        diggable = true,  -- If false, can never be dug
-
-        climbable = false,  -- If true, can be climbed on (ladder)
-
-        buildable_to = false,  -- If true, placed nodes can replace this node
-
-        floodable = false,
-        -- If true, liquids flow into and replace this node.
-        -- Warning: making a liquid node 'floodable' will cause problems.
-
-        liquidtype = "none",  -- "none" / "source" / "flowing"
-
-        liquid_alternative_flowing = "",  -- Flowing version of source liquid
-
-        liquid_alternative_source = "",  -- Source version of flowing liquid
-
-        liquid_viscosity = 0,  -- Higher viscosity = slower flow (max. 7)
-
-        liquid_renewable = true,
-        -- If true, a new liquid source can be created by placing two or more
-        -- sources nearby
-
-        leveled = 16,
-        -- Only valid for "nodebox" drawtype with 'type = "leveled"'.
-        -- Allows defining the nodebox height without using param2.
-        -- The nodebox height is 'leveled' / 64 nodes.
-        -- The maximum value of 'leveled' is 127.
-
-        liquid_range = 8,  -- Number of flowing nodes around source (max. 8)
-
-        drowning = 0,
-        -- Player will take this amount of damage if no bubbles are left
-
-        light_source = 0,
-        -- Amount of light emitted by node.
-        -- To set the maximum (14), use the value 'minetest.LIGHT_MAX'.
-        -- A value outside the range 0 to minetest.LIGHT_MAX causes undefined
-        -- behavior.
-
-        damage_per_second = 0,
-        -- If player is inside node, this damage is caused
-
-        node_box = {type="regular"},  -- See "Node boxes"
-
-        connects_to = nodenames,
-        -- Used for nodebox nodes with the type == "connected".
-        -- Specifies to what neighboring nodes connections will be drawn.
-        -- e.g. `{"group:fence", "default:wood"}` or `"default:stone"`
-
-        connect_sides = { "top", "bottom", "front", "left", "back", "right" },
-        -- Tells connected nodebox nodes to connect only to these sides of this
-        -- node
-
-        mesh = "model.obj",
-        -- File name of mesh when using "mesh" drawtype
-
-        selection_box = {
-            type = "fixed",
-            fixed = {
-                {-2 / 16, -0.5, -2 / 16, 2 / 16, 3 / 16, 2 / 16},
-            },
-        },
-        -- Custom selection box definition. Multiple boxes can be defined.
-        -- If "nodebox" drawtype is used and selection_box is nil, then node_box
-        -- definition is used for the selection box.
-
-        collision_box = {
-            type = "fixed",
-            fixed = {
-                {-2 / 16, -0.5, -2 / 16, 2 / 16, 3 / 16, 2 / 16},
-            },
-        },
-        -- Custom collision box definition. Multiple boxes can be defined.
-        -- If "nodebox" drawtype is used and collision_box is nil, then node_box
-        -- definition is used for the collision box.
-        -- Both of the boxes above are defined as:
-        -- {xmin, ymin, zmin, xmax, ymax, zmax} in nodes from node center.
-
-        -- Support maps made in and before January 2012
-        legacy_facedir_simple = false,
-        legacy_wallmounted = false,
-
-        waving = 0,
-        -- Valid for drawtypes:
-        -- mesh, nodebox, plantlike, allfaces_optional, liquid, flowingliquid.
-        -- 1 - wave node like plants (node top moves side-to-side, bottom is fixed)
-        -- 2 - wave node like leaves (whole node moves side-to-side)
-        -- 3 - wave node like liquids (whole node moves up and down)
-        -- Not all models will properly wave.
-        -- plantlike drawtype can only wave like plants.
-        -- allfaces_optional drawtype can only wave like leaves.
-        -- liquid, flowingliquid drawtypes can only wave like liquids.
-
-        sounds = {
-            -- Definition of node sounds to be played at various events.
-            -- All fields in this table are optional.
-
-            footstep = <SimpleSoundSpec>,
-            -- If walkable, played when object walks on it. If node is
-            -- climbable or a liquid, played when object moves through it
-
-            dig = <SimpleSoundSpec> or "__group",
-            -- While digging node.
-            -- If `"__group"`, then the sound will be
-            -- `default_dig_<groupname>`, where `<groupname>` is the
-            -- name of the tool's digging group with the fastest digging time.
-            -- In case of a tie, one of the sounds will be played (but we
-            -- cannot predict which one)
-            -- Default value: `"__group"`
-
-            dug = <SimpleSoundSpec>,
-            -- Node was dug
-
-            place = <SimpleSoundSpec>,
-            -- Node was placed. Also played after falling
-
-            place_failed = <SimpleSoundSpec>,
-            -- When node placement failed
-
-            fall = <SimpleSoundSpec>,
-            -- When node starts to fall
-        },
-
-        drop = "",
-        -- Name of dropped item when dug.
-        -- Default dropped item is the node itself.
-        -- Using a table allows multiple items, drop chances and tool filtering.
-        -- Tool filtering was undocumented until recently, tool filtering by string
-        -- matching is deprecated.
-        drop = {
-            max_items = 1,
-            -- Maximum number of item lists to drop.
-            -- The entries in 'items' are processed in order. For each:
-            -- Tool filtering is applied, chance of drop is applied, if both are
-            -- successful the entire item list is dropped.
-            -- Entry processing continues until the number of dropped item lists
-            -- equals 'max_items'.
-            -- Therefore, entries should progress from low to high drop chance.
-            items = {
-                -- Entry examples.
-                {
-                    -- 1 in 1000 chance of dropping a diamond.
-                    -- Default rarity is '1'.
-                    rarity = 1000,
-                    items = {"default:diamond"},
-                },
-                {
-                    -- Only drop if using a tool whose name is identical to one
-                    -- of these.
-                    tools = {"default:shovel_mese", "default:shovel_diamond"},
-                    rarity = 5,
-                    items = {"default:dirt"},
-                    -- Whether all items in the dropped item list inherit the
-                    -- hardware coloring palette color from the dug node.
-                    -- Default is 'false'.
-                    inherit_color = true,
-                },
-                {
-                    -- Only drop if using a tool whose name contains
-                    -- "default:shovel_" (this tool filtering by string matching
-                    -- is deprecated).
-                    tools = {"~default:shovel_"},
-                    rarity = 2,
-                    -- The item list dropped.
-                    items = {"default:sand", "default:desert_sand"},
-                },
-            },
-        },
-
-        on_construct = function(pos),
-        -- Node constructor; called after adding node.
-        -- Can set up metadata and stuff like that.
-        -- Not called for bulk node placement (i.e. schematics and VoxelManip).
-        -- default: nil
-
-        on_destruct = function(pos),
-        -- Node destructor; called before removing node.
-        -- Not called for bulk node placement.
-        -- default: nil
-
-        after_destruct = function(pos, oldnode),
-        -- Node destructor; called after removing node.
-        -- Not called for bulk node placement.
-        -- default: nil
-
-        on_flood = function(pos, oldnode, newnode),
-        -- Called when a liquid (newnode) is about to flood oldnode, if it has
-        -- `floodable = true` in the nodedef. Not called for bulk node placement
-        -- (i.e. schematics and VoxelManip) or air nodes. If return true the
-        -- node is not flooded, but on_flood callback will most likely be called
-        -- over and over again every liquid update interval.
-        -- Default: nil
-        -- Warning: making a liquid node 'floodable' will cause problems.
-
-        preserve_metadata = function(pos, oldnode, oldmeta, drops),
-        -- Called when oldnode is about be converted to an item, but before the
-        -- node is deleted from the world or the drops are added. This is
-        -- generally the result of either the node being dug or an attached node
-        -- becoming detached.
-        -- drops is a table of ItemStacks, so any metadata to be preserved can
-        -- be added directly to one or more of the dropped items. See
-        -- "ItemStackMetaRef".
-        -- default: nil
-
-        after_place_node = function(pos, placer, itemstack, pointed_thing),
-        -- Called after constructing node when node was placed using
-        -- minetest.item_place_node / minetest.place_node.
-        -- If return true no item is taken from itemstack.
-        -- `placer` may be any valid ObjectRef or nil.
-        -- default: nil
-
-        after_dig_node = function(pos, oldnode, oldmetadata, digger),
-        -- oldmetadata is in table format.
-        -- Called after destructing node when node was dug using
-        -- minetest.node_dig / minetest.dig_node.
-        -- default: nil
-
-        can_dig = function(pos, [player]),
-        -- Returns true if node can be dug, or false if not.
-        -- default: nil
-
-        on_punch = function(pos, node, puncher, pointed_thing),
-        -- default: minetest.node_punch
-        -- By default calls minetest.register_on_punchnode callbacks.
-
-        on_rightclick = function(pos, node, clicker, itemstack, pointed_thing),
-        -- default: nil
-        -- itemstack will hold clicker's wielded item.
-        -- Shall return the leftover itemstack.
-        -- Note: pointed_thing can be nil, if a mod calls this function.
-        -- This function does not get triggered by clients <=0.4.16 if the
-        -- "formspec" node metadata field is set.
-
-        on_dig = function(pos, node, digger),
-        -- default: minetest.node_dig
-        -- By default checks privileges, wears out tool and removes node.
-
-        on_timer = function(pos, elapsed),
-        -- default: nil
-        -- called by NodeTimers, see minetest.get_node_timer and NodeTimerRef.
-        -- elapsed is the total time passed since the timer was started.
-        -- return true to run the timer for another cycle with the same timeout
-        -- value.
-
-        on_receive_fields = function(pos, formname, fields, sender),
-        -- fields = {name1 = value1, name2 = value2, ...}
-        -- Called when an UI form (e.g. sign text input) returns data.
-        -- See minetest.register_on_player_receive_fields for more info.
-        -- default: nil
-
-        allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player),
-        -- Called when a player wants to move items inside the inventory.
-        -- Return value: number of items allowed to move.
-
-        allow_metadata_inventory_put = function(pos, listname, index, stack, player),
-        -- Called when a player wants to put something into the inventory.
-        -- Return value: number of items allowed to put.
-        -- Return value -1: Allow and don't modify item count in inventory.
-
-        allow_metadata_inventory_take = function(pos, listname, index, stack, player),
-        -- Called when a player wants to take something out of the inventory.
-        -- Return value: number of items allowed to take.
-        -- Return value -1: Allow and don't modify item count in inventory.
-
-        on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player),
-        on_metadata_inventory_put = function(pos, listname, index, stack, player),
-        on_metadata_inventory_take = function(pos, listname, index, stack, player),
-        -- Called after the actual action has happened, according to what was
-        -- allowed.
-        -- No return value.
-
-        on_blast = function(pos, intensity),
-        -- intensity: 1.0 = mid range of regular TNT.
-        -- If defined, called when an explosion touches the node, instead of
-        -- removing the node.
-    }
-
-Crafting recipes
-----------------
-
-Used by `minetest.register_craft`.
-
-### Shaped
-
-    {
-        output = 'default:pick_stone',
-        recipe = {
-            {'default:cobble', 'default:cobble', 'default:cobble'},
-            {'', 'default:stick', ''},
-            {'', 'default:stick', ''},  -- Also groups; e.g. 'group:crumbly'
-        },
-        replacements = <list of item pairs>,
-        -- replacements: replace one input item with another item on crafting
-        -- (optional).
-    }
-
-### Shapeless
-
-    {
-        type = "shapeless",
-        output = 'mushrooms:mushroom_stew',
-        recipe = {
-            "mushrooms:bowl",
-            "mushrooms:mushroom_brown",
-            "mushrooms:mushroom_red",
-        },
-        replacements = <list of item pairs>,
-    }
-
-### Tool repair
-
-    {
-        type = "toolrepair",
-        additional_wear = -0.02,
-    }
-
-Note: Tools with group `disable_repair=1` will not repairable by this recipe.
-
-### Cooking
-
-    {
-        type = "cooking",
-        output = "default:glass",
-        recipe = "default:sand",
-        cooktime = 3,
-    }
-
-### Furnace fuel
-
-    {
-        type = "fuel",
-        recipe = "bucket:bucket_lava",
-        burntime = 60,
-        replacements = {{"bucket:bucket_lava", "bucket:bucket_empty"}},
-    }
-
-Ore definition
---------------
-
-Used by `minetest.register_ore`.
-
-See [Ores] section above for essential information.
-
-    {
-        ore_type = "scatter",
-
-        ore = "default:stone_with_coal",
-
-        ore_param2 = 3,
-        -- Facedir rotation. Default is 0 (unchanged rotation)
-
-        wherein = "default:stone",
-        -- A list of nodenames is supported too
-
-        clust_scarcity = 8 * 8 * 8,
-        -- Ore has a 1 out of clust_scarcity chance of spawning in a node.
-        -- If the desired average distance between ores is 'd', set this to
-        -- d * d * d.
-
-        clust_num_ores = 8,
-        -- Number of ores in a cluster
-
-        clust_size = 3,
-        -- Size of the bounding box of the cluster.
-        -- In this example, there is a 3 * 3 * 3 cluster where 8 out of the 27
-        -- nodes are coal ore.
-
-        y_min = -31000,
-        y_max = 64,
-        -- Lower and upper limits for ore
-
-        flags = "",
-        -- Attributes for the ore generation, see 'Ore attributes' section above
-
-        noise_threshold = 0.5,
-        -- If noise is above this threshold, ore is placed. Not needed for a
-        -- uniform distribution.
-
-        noise_params = {
-            offset = 0,
-            scale = 1,
-            spread = {x = 100, y = 100, z = 100},
-            seed = 23,
-            octaves = 3,
-            persist = 0.7
-        },
-        -- NoiseParams structure describing one of the perlin noises used for
-        -- ore distribution.
-        -- Needed by "sheet", "puff", "blob" and "vein" ores.
-        -- Omit from "scatter" ore for a uniform ore distribution.
-        -- Omit from "stratum" ore for a simple horizontal strata from y_min to
-        -- y_max.
-
-        biomes = {"desert", "rainforest"},
-        -- List of biomes in which this ore occurs.
-        -- Occurs in all biomes if this is omitted, and ignored if the Mapgen
-        -- being used does not support biomes.
-        -- Can be a list of (or a single) biome names, IDs, or definitions.
-
-        -- Type-specific parameters
-
-        -- sheet
-        column_height_min = 1,
-        column_height_max = 16,
-        column_midpoint_factor = 0.5,
-
-        -- puff
-        np_puff_top = {
-            offset = 4,
-            scale = 2,
-            spread = {x = 100, y = 100, z = 100},
-            seed = 47,
-            octaves = 3,
-            persist = 0.7
-        },
-        np_puff_bottom = {
-            offset = 4,
-            scale = 2,
-            spread = {x = 100, y = 100, z = 100},
-            seed = 11,
-            octaves = 3,
-            persist = 0.7
-        },
-
-        -- vein
-        random_factor = 1.0,
-
-        -- stratum
-        np_stratum_thickness = {
-            offset = 8,
-            scale = 4,
-            spread = {x = 100, y = 100, z = 100},
-            seed = 17,
-            octaves = 3,
-            persist = 0.7
-        },
-        stratum_thickness = 8,
-    }
-
-Biome definition
-----------------
-
-Used by `minetest.register_biome`.
-
-    {
-        name = "tundra",
-
-        node_dust = "default:snow",
-        -- Node dropped onto upper surface after all else is generated
-
-        node_top = "default:dirt_with_snow",
-        depth_top = 1,
-        -- Node forming surface layer of biome and thickness of this layer
-
-        node_filler = "default:permafrost",
-        depth_filler = 3,
-        -- Node forming lower layer of biome and thickness of this layer
-
-        node_stone = "default:bluestone",
-        -- Node that replaces all stone nodes between roughly y_min and y_max.
-
-        node_water_top = "default:ice",
-        depth_water_top = 10,
-        -- Node forming a surface layer in seawater with the defined thickness
-
-        node_water = "",
-        -- Node that replaces all seawater nodes not in the surface layer
-
-        node_river_water = "default:ice",
-        -- Node that replaces river water in mapgens that use
-        -- default:river_water
-
-        node_riverbed = "default:gravel",
-        depth_riverbed = 2,
-        -- Node placed under river water and thickness of this layer
-
-        node_cave_liquid = "default:lava_source",
-        node_cave_liquid = {"default:water_source", "default:lava_source"},
-        -- Nodes placed inside 50% of the medium size caves.
-        -- Multiple nodes can be specified, each cave will use a randomly
-        -- chosen node from the list.
-        -- If this field is left out or 'nil', cave liquids fall back to
-        -- classic behaviour of lava and water distributed using 3D noise.
-        -- For no cave liquid, specify "air".
-
-        node_dungeon = "default:cobble",
-        -- Node used for primary dungeon structure.
-        -- If absent, dungeon nodes fall back to the 'mapgen_cobble' mapgen
-        -- alias, if that is also absent, dungeon nodes fall back to the biome
-        -- 'node_stone'.
-        -- If present, the following two nodes are also used.
-
-        node_dungeon_alt = "default:mossycobble",
-        -- Node used for randomly-distributed alternative structure nodes.
-        -- If alternative structure nodes are not wanted leave this absent for
-        -- performance reasons.
-
-        node_dungeon_stair = "stairs:stair_cobble",
-        -- Node used for dungeon stairs.
-        -- If absent, stairs fall back to 'node_dungeon'.
-
-        y_max = 31000,
-        y_min = 1,
-        -- Upper and lower limits for biome.
-        -- Alternatively you can use xyz limits as shown below.
-
-        max_pos = {x = 31000, y = 128, z = 31000},
-        min_pos = {x = -31000, y = 9, z = -31000},
-        -- xyz limits for biome, an alternative to using 'y_min' and 'y_max'.
-        -- Biome is limited to a cuboid defined by these positions.
-        -- Any x, y or z field left undefined defaults to -31000 in 'min_pos' or
-        -- 31000 in 'max_pos'.
-
-        vertical_blend = 8,
-        -- Vertical distance in nodes above 'y_max' over which the biome will
-        -- blend with the biome above.
-        -- Set to 0 for no vertical blend. Defaults to 0.
-
-        heat_point = 0,
-        humidity_point = 50,
-        -- Characteristic temperature and humidity for the biome.
-        -- These values create 'biome points' on a voronoi diagram with heat and
-        -- humidity as axes. The resulting voronoi cells determine the
-        -- distribution of the biomes.
-        -- Heat and humidity have average values of 50, vary mostly between
-        -- 0 and 100 but can exceed these values.
-    }
-
-Decoration definition
----------------------
-
-See [Decoration types]. Used by `minetest.register_decoration`.
-
-    {
-        deco_type = "simple",
-
-        place_on = "default:dirt_with_grass",
-        -- Node (or list of nodes) that the decoration can be placed on
-
-        sidelen = 8,
-        -- Size of the square divisions of the mapchunk being generated.
-        -- Determines the resolution of noise variation if used.
-        -- If the chunk size is not evenly divisible by sidelen, sidelen is made
-        -- equal to the chunk size.
-
-        fill_ratio = 0.02,
-        -- The value determines 'decorations per surface node'.
-        -- Used only if noise_params is not specified.
-        -- If >= 10.0 complete coverage is enabled and decoration placement uses
-        -- a different and much faster method.
-
-        noise_params = {
-            offset = 0,
-            scale = 0.45,
-            spread = {x = 100, y = 100, z = 100},
-            seed = 354,
-            octaves = 3,
-            persist = 0.7,
-            lacunarity = 2.0,
-            flags = "absvalue"
-        },
-        -- NoiseParams structure describing the perlin noise used for decoration
-        -- distribution.
-        -- A noise value is calculated for each square division and determines
-        -- 'decorations per surface node' within each division.
-        -- If the noise value >= 10.0 complete coverage is enabled and
-        -- decoration placement uses a different and much faster method.
-
-        biomes = {"Oceanside", "Hills", "Plains"},
-        -- List of biomes in which this decoration occurs. Occurs in all biomes
-        -- if this is omitted, and ignored if the Mapgen being used does not
-        -- support biomes.
-        -- Can be a list of (or a single) biome names, IDs, or definitions.
-
-        y_min = -31000,
-        y_max = 31000,
-        -- Lower and upper limits for decoration.
-        -- These parameters refer to the Y co-ordinate of the 'place_on' node.
-
-        spawn_by = "default:water",
-        -- Node (or list of nodes) that the decoration only spawns next to.
-        -- Checks two horizontal planes of 8 neighbouring nodes (including
-        -- diagonal neighbours), one plane level with the 'place_on' node and a
-        -- plane one node above that.
-
-        num_spawn_by = 1,
-        -- Number of spawn_by nodes that must be surrounding the decoration
-        -- position to occur.
-        -- If absent or -1, decorations occur next to any nodes.
-
-        flags = "liquid_surface, force_placement, all_floors, all_ceilings",
-        -- Flags for all decoration types.
-        -- "liquid_surface": Instead of placement on the highest solid surface
-        --   in a mapchunk column, placement is on the highest liquid surface.
-        --   Placement is disabled if solid nodes are found above the liquid
-        --   surface.
-        -- "force_placement": Nodes other than "air" and "ignore" are replaced
-        --   by the decoration.
-        -- "all_floors", "all_ceilings": Instead of placement on the highest
-        --   surface in a mapchunk the decoration is placed on all floor and/or
-        --   ceiling surfaces, for example in caves and dungeons.
-        --   Ceiling decorations act as an inversion of floor decorations so the
-        --   effect of 'place_offset_y' is inverted.
-        --   Y-slice probabilities do not function correctly for ceiling
-        --   schematic decorations as the behaviour is unchanged.
-        --   If a single decoration registration has both flags the floor and
-        --   ceiling decorations will be aligned vertically.
-
-        ----- Simple-type parameters
-
-        decoration = "default:grass",
-        -- The node name used as the decoration.
-        -- If instead a list of strings, a randomly selected node from the list
-        -- is placed as the decoration.
-
-        height = 1,
-        -- Decoration height in nodes.
-        -- If height_max is not 0, this is the lower limit of a randomly
-        -- selected height.
-
-        height_max = 0,
-        -- Upper limit of the randomly selected height.
-        -- If absent, the parameter 'height' is used as a constant.
-
-        param2 = 0,
-        -- Param2 value of decoration nodes.
-        -- If param2_max is not 0, this is the lower limit of a randomly
-        -- selected param2.
-
-        param2_max = 0,
-        -- Upper limit of the randomly selected param2.
-        -- If absent, the parameter 'param2' is used as a constant.
-
-        place_offset_y = 0,
-        -- Y offset of the decoration base node relative to the standard base
-        -- node position.
-        -- Can be positive or negative. Default is 0.
-        -- Effect is inverted for "all_ceilings" decorations.
-        -- Ignored by 'y_min', 'y_max' and 'spawn_by' checks, which always refer
-        -- to the 'place_on' node.
-
-        ----- Schematic-type parameters
-
-        schematic = "foobar.mts",
-        -- If schematic is a string, it is the filepath relative to the current
-        -- working directory of the specified Minetest schematic file.
-        -- Could also be the ID of a previously registered schematic.
-
-        schematic = {
-            size = {x = 4, y = 6, z = 4},
-            data = {
-                {name = "default:cobble", param1 = 255, param2 = 0},
-                {name = "default:dirt_with_grass", param1 = 255, param2 = 0},
-                {name = "air", param1 = 255, param2 = 0},
-                 ...
-            },
-            yslice_prob = {
-                {ypos = 2, prob = 128},
-                {ypos = 5, prob = 64},
-                 ...
-            },
-        },
-        -- Alternative schematic specification by supplying a table. The fields
-        -- size and data are mandatory whereas yslice_prob is optional.
-        -- See 'Schematic specifier' for details.
-
-        replacements = {["oldname"] = "convert_to", ...},
-
-        flags = "place_center_x, place_center_y, place_center_z",
-        -- Flags for schematic decorations. See 'Schematic attributes'.
-
-        rotation = "90",
-        -- Rotation can be "0", "90", "180", "270", or "random"
-
-        place_offset_y = 0,
-        -- If the flag 'place_center_y' is set this parameter is ignored.
-        -- Y offset of the schematic base node layer relative to the 'place_on'
-        -- node.
-        -- Can be positive or negative. Default is 0.
-        -- Effect is inverted for "all_ceilings" decorations.
-        -- Ignored by 'y_min', 'y_max' and 'spawn_by' checks, which always refer
-        -- to the 'place_on' node.
-    }
-
-Chat command definition
------------------------
-
-Used by `minetest.register_chatcommand`.
-
-    {
-        params = "<name> <privilege>",  -- Short parameter description
-
-        description = "Remove privilege from player",  -- Full description
-
-        privs = {privs=true},  -- Require the "privs" privilege to run
-
-        func = function(name, param),
-        -- Called when command is run. Returns boolean success and text output.
-    }
-
-Note that in params, use of symbols is as follows:
-
-* `<>` signifies a placeholder to be replaced when the command is used. For
-  example, when a player name is needed: `<name>`
-* `[]` signifies param is optional and not required when the command is used.
-  For example, if you require param1 but param2 is optional:
-  `<param1> [<param2>]`
-* `|` signifies exclusive or. The command requires one param from the options
-  provided. For example: `<param1> | <param2>`
-* `()` signifies grouping. For example, when param1 and param2 are both
-  required, or only param3 is required: `(<param1> <param2>) | <param3>`
-
-Privilege definition
---------------------
-
-Used by `minetest.register_privilege`.
-
-    {
-        description = "",
-        -- Privilege description
-
-        give_to_singleplayer = true,
-        -- Whether to grant the privilege to singleplayer.
-
-        give_to_admin = true,
-        -- Whether to grant the privilege to the server admin.
-        -- Uses value of 'give_to_singleplayer' by default.
-
-        on_grant = function(name, granter_name),
-        -- Called when given to player 'name' by 'granter_name'.
-        -- 'granter_name' will be nil if the priv was granted by a mod.
-
-        on_revoke = function(name, revoker_name),
-        -- Called when taken from player 'name' by 'revoker_name'.
-        -- 'revoker_name' will be nil if the priv was revoked by a mod.
-
-        -- Note that the above two callbacks will be called twice if a player is
-        -- responsible, once with the player name, and then with a nil player
-        -- name.
-        -- Return true in the above callbacks to stop register_on_priv_grant or
-        -- revoke being called.
-    }
-
-Detached inventory callbacks
-----------------------------
-
-Used by `minetest.create_detached_inventory`.
-
-    {
-        allow_move = function(inv, from_list, from_index, to_list, to_index, count, player),
-        -- Called when a player wants to move items inside the inventory.
-        -- Return value: number of items allowed to move.
-
-        allow_put = function(inv, listname, index, stack, player),
-        -- Called when a player wants to put something into the inventory.
-        -- Return value: number of items allowed to put.
-        -- Return value -1: Allow and don't modify item count in inventory.
-
-        allow_take = function(inv, listname, index, stack, player),
-        -- Called when a player wants to take something out of the inventory.
-        -- Return value: number of items allowed to take.
-        -- Return value -1: Allow and don't modify item count in inventory.
-
-        on_move = function(inv, from_list, from_index, to_list, to_index, count, player),
-        on_put = function(inv, listname, index, stack, player),
-        on_take = function(inv, listname, index, stack, player),
-        -- Called after the actual action has happened, according to what was
-        -- allowed.
-        -- No return value.
-    }
-
-HUD Definition
---------------
-
-See [HUD] section.
-
-Used by `Player:hud_add`. Returned by `Player:hud_get`.
-
-    {
-        hud_elem_type = "image",  -- See HUD element types
-        -- Type of element, can be "image", "text", "statbar", or "inventory"
-
-        position = {x=0.5, y=0.5},
-        -- Left corner position of element
-
-        name = "<name>",
-
-        scale = {x = 2, y = 2},
-
-        text = "<text>",
-
-        number = 2,
-
-        item = 3,
-        -- Selected item in inventory. 0 for no item selected.
-
-        direction = 0,
-        -- Direction: 0: left-right, 1: right-left, 2: top-bottom, 3: bottom-top
-
-        alignment = {x=0, y=0},
-
-        offset = {x=0, y=0},
-
-        size = { x=100, y=100 },
-        -- Size of element in pixels
-
-        z_index = 0,
-        -- Z index : lower z-index HUDs are displayed behind higher z-index HUDs
-    }
-
-Particle definition
--------------------
-
-Used by `minetest.add_particle`.
-
-    {
-        pos = {x=0, y=0, z=0},
-        velocity = {x=0, y=0, z=0},
-        acceleration = {x=0, y=0, z=0},
-        -- Spawn particle at pos with velocity and acceleration
-
-        expirationtime = 1,
-        -- Disappears after expirationtime seconds
-
-        size = 1,
-        -- Scales the visual size of the particle texture.
-
-        collisiondetection = false,
-        -- If true collides with `walkable` nodes and, depending on the
-        -- `object_collision` field, objects too.
-
-        collision_removal = false,
-        -- If true particle is removed when it collides.
-        -- Requires collisiondetection = true to have any effect.
-
-        object_collision = false,
-        -- If true particle collides with objects that are defined as
-        -- `physical = true,` and `collide_with_objects = true,`.
-        -- Requires collisiondetection = true to have any effect.
-
-        vertical = false,
-        -- If true faces player using y axis only
-
-        texture = "image.png",
-
-        playername = "singleplayer",
-        -- Optional, if specified spawns particle only on the player's client
-
-        animation = {Tile Animation definition},
-        -- Optional, specifies how to animate the particle texture
-
-        glow = 0
-        -- Optional, specify particle self-luminescence in darkness.
-        -- Values 0-14.
-    }
-
-
-`ParticleSpawner` definition
-----------------------------
-
-Used by `minetest.add_particlespawner`.
-
-    {
-        amount = 1,
-        -- Number of particles spawned over the time period `time`.
-
-        time = 1,
-        -- Lifespan of spawner in seconds.
-        -- If time is 0 spawner has infinite lifespan and spawns the `amount` on
-        -- a per-second basis.
-
-        minpos = {x=0, y=0, z=0},
-        maxpos = {x=0, y=0, z=0},
-        minvel = {x=0, y=0, z=0},
-        maxvel = {x=0, y=0, z=0},
-        minacc = {x=0, y=0, z=0},
-        maxacc = {x=0, y=0, z=0},
-        minexptime = 1,
-        maxexptime = 1,
-        minsize = 1,
-        maxsize = 1,
-        -- The particles' properties are random values between the min and max
-        -- values.
-        -- pos, velocity, acceleration, expirationtime, size
-
-        collisiondetection = false,
-        -- If true collide with `walkable` nodes and, depending on the
-        -- `object_collision` field, objects too.
-
-        collision_removal = false,
-        -- If true particles are removed when they collide.
-        -- Requires collisiondetection = true to have any effect.
-
-        object_collision = false,
-        -- If true particles collide with objects that are defined as
-        -- `physical = true,` and `collide_with_objects = true,`.
-        -- Requires collisiondetection = true to have any effect.
-
-        attached = ObjectRef,
-        -- If defined, particle positions, velocities and accelerations are
-        -- relative to this object's position and yaw
-
-        vertical = false,
-        -- If true face player using y axis only
-
-        texture = "image.png",
-
-        playername = "singleplayer",
-        -- Optional, if specified spawns particles only on the player's client
-
-        animation = {Tile Animation definition},
-        -- Optional, specifies how to animate the particles' texture
-
-        glow = 0
-        -- Optional, specify particle self-luminescence in darkness.
-        -- Values 0-14.
-    }
-
-`HTTPRequest` definition
-------------------------
-
-Used by `HTTPApiTable.fetch` and `HTTPApiTable.fetch_async`.
-
-    {
-        url = "http://example.org",
-
-        timeout = 10,
-        -- Timeout for connection in seconds. Default is 3 seconds.
-
-        post_data = "Raw POST request data string" OR {field1 = "data1", field2 = "data2"},
-        -- Optional, if specified a POST request with post_data is performed.
-        -- Accepts both a string and a table. If a table is specified, encodes
-        -- table as x-www-form-urlencoded key-value pairs.
-        -- If post_data is not specified, a GET request is performed instead.
-
-        user_agent = "ExampleUserAgent",
-        -- Optional, if specified replaces the default minetest user agent with
-        -- given string
-
-        extra_headers = { "Accept-Language: en-us", "Accept-Charset: utf-8" },
-        -- Optional, if specified adds additional headers to the HTTP request.
-        -- You must make sure that the header strings follow HTTP specification
-        -- ("Key: Value").
-
-        multipart = boolean
-        -- Optional, if true performs a multipart HTTP request.
-        -- Default is false.
-    }
-
-`HTTPRequestResult` definition
-------------------------------
-
-Passed to `HTTPApiTable.fetch` callback. Returned by
-`HTTPApiTable.fetch_async_get`.
-
-    {
-        completed = true,
-        -- If true, the request has finished (either succeeded, failed or timed
-        -- out)
-
-        succeeded = true,
-        -- If true, the request was successful
-
-        timeout = false,
-        -- If true, the request timed out
-
-        code = 200,
-        -- HTTP status code
-
-        data = "response"
-    }
-
-Authentication handler definition
----------------------------------
-
-Used by `minetest.register_authentication_handler`.
-
-    {
-        get_auth = function(name),
-        -- Get authentication data for existing player `name` (`nil` if player
-        -- doesn't exist).
-        -- Returns following structure:
-        -- `{password=<string>, privileges=<table>, last_login=<number or nil>}`
-
-        create_auth = function(name, password),
-        -- Create new auth data for player `name`.
-        -- Note that `password` is not plain-text but an arbitrary
-        -- representation decided by the engine.
-
-        delete_auth = function(name),
-        -- Delete auth data of player `name`.
-        -- Returns boolean indicating success (false if player is nonexistent).
-
-        set_password = function(name, password),
-        -- Set password of player `name` to `password`.
-        -- Auth data should be created if not present.
-
-        set_privileges = function(name, privileges),
-        -- Set privileges of player `name`.
-        -- `privileges` is in table form, auth data should be created if not
-        -- present.
-
-        reload = function(),
-        -- Reload authentication data from the storage location.
-        -- Returns boolean indicating success.
-
-        record_login = function(name),
-        -- Called when player joins, used for keeping track of last_login
-
-        iterate = function(),
-        -- Returns an iterator (use with `for` loops) for all player names
-        -- currently in the auth database
-    }
diff --git a/doc/protocol.md b/doc/protocol.md
new file mode 100644 (file)
index 0000000..4c8ddd5
--- /dev/null
@@ -0,0 +1,110 @@
+Minetest protocol (incomplete, early draft):
+Updated 2011-06-18
+
+A custom protocol over UDP.
+Integers are big endian.
+Refer to connection.{h,cpp} for further reference.
+
+Initialization:
+- A dummy reliable packet with peer_id=PEER_ID_INEXISTENT=0 is sent to the server:
+       - Actually this can be sent without the reliable packet header, too, i guess,
+         but the sequence number in the header allows the sender to re-send the
+         packet without accidentally getting a double initialization.
+       - Packet content:
+               # Basic header
+               u32 protocol_id = PROTOCOL_ID = 0x4f457403
+               u16 sender_peer_id = PEER_ID_INEXISTENT = 0
+               u8 channel = 0
+               # Reliable packet header
+               u8 type = TYPE_RELIABLE = 3
+               u16 seqnum = SEQNUM_INITIAL = 65500
+               # Original packet header
+               u8 type = TYPE_ORIGINAL = 1
+               # And no actual payload.
+- Server responds with something like this:
+       - Packet content:
+               # Basic header
+               u32 protocol_id = PROTOCOL_ID = 0x4f457403
+               u16 sender_peer_id = PEER_ID_INEXISTENT = 0
+               u8 channel = 0
+               # Reliable packet header
+               u8 type = TYPE_RELIABLE = 3
+               u16 seqnum = SEQNUM_INITIAL = 65500
+               # Control packet header
+               u8 type = TYPE_CONTROL = 0
+               u8 controltype = CONTROLTYPE_SET_PEER_ID = 1
+               u16 peer_id_new = assigned peer id to client (other than 0 or 1)
+- Then the connection can be disconnected by sending:
+       - Packet content:
+               # Basic header
+               u32 protocol_id = PROTOCOL_ID = 0x4f457403
+               u16 sender_peer_id = whatever was gotten in CONTROLTYPE_SET_PEER_ID
+               u8 channel = 0
+               # Control packet header
+               u8 type = TYPE_CONTROL = 0
+               u8 controltype = CONTROLTYPE_DISCO = 3
+
+- Here's a quick untested connect-disconnect done in PHP:
+# host: ip of server (use gethostbyname(hostname) to get from a dns name)
+# port: port of server
+function check_if_minetestserver_up($host, $port)
+{
+       $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
+       $timeout = array("sec" => 1, "usec" => 0);
+       socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, $timeout);
+       $buf = "\x4f\x45\x74\x03\x00\x00\x00\x03\xff\xdc\x01";
+       socket_sendto($socket, $buf, strlen($buf), 0, $host, $port);
+       $buf = socket_read($socket, 1000);
+       if($buf != "")
+       {
+               # We got a reply! read the peer id from it.
+               $peer_id = substr($buf, 9, 2);
+
+               # Disconnect
+               $buf = "\x4f\x45\x74\x03".$peer_id."\x00\x00\x03";
+               socket_sendto($socket, $buf, strlen($buf), 0, $host, $port);
+               socket_close($socket);
+
+               return true;
+       }
+       return false;
+}
+
+- Here's a Python script for checking if a minetest server is up, confirmed working
+
+#!/usr/bin/env python3
+import sys, time, socket
+
+address = ""
+port = 30000
+if len(sys.argv) <= 1:
+    print("Usage: %s <address>" % sys.argv[0])
+    exit()
+if ":" in sys.argv[1]:
+    address = sys.argv[1].split(":")[0]
+    try:
+        port = int(sys.argv[1].split(":")[1])
+    except ValueError:
+        print("Please specify a valid port")
+        exit()
+else:
+    address = sys.argv[1]
+
+try:
+    start = time.time()
+    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+    sock.settimeout(2.0)
+    buf = b"\x4f\x45\x74\x03\x00\x00\x00\x01"
+    sock.sendto(buf, (address, port))
+    data, addr = sock.recvfrom(1000)
+    if data:
+        peer_id = data[12:14]
+        buf = b"\x4f\x45\x74\x03" + peer_id + b"\x00\x00\x03"
+        sock.sendto(buf, (address, port))
+        sock.close()
+        end = time.time()
+        print("%s is up (%0.5fms)" % (sys.argv[1], end - start))
+    else:
+        print("%s seems to be down " % sys.argv[1])
+except Exception as err:
+    print("%s seems to be down (%s) " % (sys.argv[1], str(err)))
diff --git a/doc/protocol.txt b/doc/protocol.txt
deleted file mode 100644 (file)
index 4c8ddd5..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-Minetest protocol (incomplete, early draft):
-Updated 2011-06-18
-
-A custom protocol over UDP.
-Integers are big endian.
-Refer to connection.{h,cpp} for further reference.
-
-Initialization:
-- A dummy reliable packet with peer_id=PEER_ID_INEXISTENT=0 is sent to the server:
-       - Actually this can be sent without the reliable packet header, too, i guess,
-         but the sequence number in the header allows the sender to re-send the
-         packet without accidentally getting a double initialization.
-       - Packet content:
-               # Basic header
-               u32 protocol_id = PROTOCOL_ID = 0x4f457403
-               u16 sender_peer_id = PEER_ID_INEXISTENT = 0
-               u8 channel = 0
-               # Reliable packet header
-               u8 type = TYPE_RELIABLE = 3
-               u16 seqnum = SEQNUM_INITIAL = 65500
-               # Original packet header
-               u8 type = TYPE_ORIGINAL = 1
-               # And no actual payload.
-- Server responds with something like this:
-       - Packet content:
-               # Basic header
-               u32 protocol_id = PROTOCOL_ID = 0x4f457403
-               u16 sender_peer_id = PEER_ID_INEXISTENT = 0
-               u8 channel = 0
-               # Reliable packet header
-               u8 type = TYPE_RELIABLE = 3
-               u16 seqnum = SEQNUM_INITIAL = 65500
-               # Control packet header
-               u8 type = TYPE_CONTROL = 0
-               u8 controltype = CONTROLTYPE_SET_PEER_ID = 1
-               u16 peer_id_new = assigned peer id to client (other than 0 or 1)
-- Then the connection can be disconnected by sending:
-       - Packet content:
-               # Basic header
-               u32 protocol_id = PROTOCOL_ID = 0x4f457403
-               u16 sender_peer_id = whatever was gotten in CONTROLTYPE_SET_PEER_ID
-               u8 channel = 0
-               # Control packet header
-               u8 type = TYPE_CONTROL = 0
-               u8 controltype = CONTROLTYPE_DISCO = 3
-
-- Here's a quick untested connect-disconnect done in PHP:
-# host: ip of server (use gethostbyname(hostname) to get from a dns name)
-# port: port of server
-function check_if_minetestserver_up($host, $port)
-{
-       $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
-       $timeout = array("sec" => 1, "usec" => 0);
-       socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, $timeout);
-       $buf = "\x4f\x45\x74\x03\x00\x00\x00\x03\xff\xdc\x01";
-       socket_sendto($socket, $buf, strlen($buf), 0, $host, $port);
-       $buf = socket_read($socket, 1000);
-       if($buf != "")
-       {
-               # We got a reply! read the peer id from it.
-               $peer_id = substr($buf, 9, 2);
-
-               # Disconnect
-               $buf = "\x4f\x45\x74\x03".$peer_id."\x00\x00\x03";
-               socket_sendto($socket, $buf, strlen($buf), 0, $host, $port);
-               socket_close($socket);
-
-               return true;
-       }
-       return false;
-}
-
-- Here's a Python script for checking if a minetest server is up, confirmed working
-
-#!/usr/bin/env python3
-import sys, time, socket
-
-address = ""
-port = 30000
-if len(sys.argv) <= 1:
-    print("Usage: %s <address>" % sys.argv[0])
-    exit()
-if ":" in sys.argv[1]:
-    address = sys.argv[1].split(":")[0]
-    try:
-        port = int(sys.argv[1].split(":")[1])
-    except ValueError:
-        print("Please specify a valid port")
-        exit()
-else:
-    address = sys.argv[1]
-
-try:
-    start = time.time()
-    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
-    sock.settimeout(2.0)
-    buf = b"\x4f\x45\x74\x03\x00\x00\x00\x01"
-    sock.sendto(buf, (address, port))
-    data, addr = sock.recvfrom(1000)
-    if data:
-        peer_id = data[12:14]
-        buf = b"\x4f\x45\x74\x03" + peer_id + b"\x00\x00\x03"
-        sock.sendto(buf, (address, port))
-        sock.close()
-        end = time.time()
-        print("%s is up (%0.5fms)" % (sys.argv[1], end - start))
-    else:
-        print("%s seems to be down " % sys.argv[1])
-except Exception as err:
-    print("%s seems to be down (%s) " % (sys.argv[1], str(err)))
diff --git a/spoof.js b/spoof.js
new file mode 100644 (file)
index 0000000..d7e802d
--- /dev/null
+++ b/spoof.js
@@ -0,0 +1,63 @@
+const fs = require("fs");
+const util = require("util");
+const http = require("http");
+
+function baseAnalysis(){
+       let text = fs.readFileSync("spoof.txt", "utf8");
+       let messages = text.split("\n");
+       let analyzed = [];
+       
+       messages.forEach(msg => {
+               if(msg.startsWith("<")){
+                       let player = msg.replace("<", "").split(">")[0];
+                       let message = msg.replace("<" + player + "> ", "");
+                       analyzed.push({
+                               type: "chat",
+                               player: player,
+                               message: message,
+                       });
+               }
+               else if(msg.startsWith("PM")){
+                       let player = msg.replace("PM from ", "").split(":")[0];
+                       let message = msg.replace("PM from " + player + ": ", "");
+                       analyzed.push({
+                               type: "PM",
+                               player: player,
+                               message: message,
+                       });
+               }
+               else if(msg.startsWith("***")){
+                       let player = msg.replace("*** ", "").split(" ")[0];
+                       let rawaction = msg.replace("*** " + player + " ", "");
+                       let type = undefined;
+                       let timeout = undefined;
+                       if(rawaction.split(".")[0] == "joined the game")
+                               type = "join";
+                       else if(rawaction.split(".")[0] == "left the game"){
+                               type = "leave";
+                               timeout = (rawaction.split(".")[1] == " (timed out)");
+                       }
+                       analyzed.push({
+                               type: type,
+                               player: player,
+                               timeout: timeout,
+                       });
+               }
+               else{
+                       analyzed.push({
+                               type: "unknown",
+                               content: msg 
+                       })
+               }
+       });
+       
+       return analyzed;
+}
+
+const server = http.createServer((request, response) => {
+       response.statusCode = 200;
+       response.setHeader('Content-Type', 'application/json');
+       response.end(JSON.stringify(baseAnalysis()));
+});
+
+server.listen(3000);
diff --git a/spoof.txt b/spoof.txt
new file mode 100644 (file)
index 0000000..c8c8660
--- /dev/null
+++ b/spoof.txt
@@ -0,0 +1,18748 @@
+# Server: version=5.0.1, uptime=114742, max_lag=0.528717, clients={GalwayGirl, kattaura, correale, dominico, pratcher, nicklas, bramel, tilt2, barredo, tennies, mondejar, listen, nyssa, leupold, toshia, lawana, guiffre, Enr_ique12, snayper, holli, tde, okojie, kozielski, mingrone, lanzilotta, numkena, MasterOfMineteste, probert, jezio6996, mignon, firsching, krnach, henry7, lagoni, stanbaugh, ridinger, digian, browley, latino, chagollan, harrier, debrito, brussel, thonatron1, solange, allwardt, ezzell, huhman, woodring, ruggle, sumabat, maguet, devenport, kalawe, sandie, lucich, heathershaw, ZeOzm, Jacopo}
+# Server: Welcome to SkyWars
+*** GalwayGirl joined the game.
+*** krnach left the game. (timed out)
+*** tennies left the game.
+<tde> Warte noch bitte
+<MasterOfMineteste> muhahaha
+*** barredo left the game.
+*** bramel left the game.
+<tde> Jetzt
+*** barchick joined the game.
+*** bramel joined the game.
+*** holder joined the game.
+<MasterOfMineteste> pass auf
+# Server: version=5.0.1, uptime=114891, max_lag=0.393398, clients={GalwayGirl, margette, holder, barchick, kattaura, correale, dominico, pratcher, nicklas, tilt2, mondejar, listen, nyssa, leupold, toshia, lawana, guiffre, Enr_ique12, snayper, holli, tde, okojie, kozielski, mingrone, lanzilotta, numkena, MasterOfMineteste, probert, jezio6996, mignon, firsching, henry7, lagoni, stanbaugh, ridinger, digian, browley, latino, chagollan, harrier, debrito, brussel, thonatron1, solange, allwardt, ezzell, woodring, ruggle, sumabat, maguet, devenport, kalawe, sandie, lucich, heathershaw, ZeOzm, Jacopo}
+# Server: Welcome to SkyWars
+*** GalwayGirl joined the game.
+areas, beds, binoculars, boats, bones, bucket, butterflies, carts, creative, creatures, default, doors, dungeon_loot, dye, farming, fire, fireflies, flowers, game_commands, give_initial_stuff, item_drop, map, mapfix, maptools, mobs, mobs_npc, player_api, pvp, screwdriver, sethome, sfinv, shooter, shooter_crossbow, shooter_flaregun, shooter_grenade, shooter_guns, shooter_hook, shooter_rocket, shooter_turret, signs_lib, spawn, stairs, tnt, unified_inventory, vessels, walls, wool, worldedit, worldedit_commands, worldedit_infinity, worldedit_limited, worldedit_shortcommands, xban2, xpanes
+*** thruman joined the game.
+<MasterOfMineteste> ich find keine brote
+*** mondejar left the game. (timed out)
+*** huhman joined the game.
+*** okojie left the game. (timed out)
+areas, beds, binoculars, boats, bones, bucket, butterflies, carts, creative, creatures, default, doors, dungeon_loot, dye, farming, fire, fireflies, flowers, game_commands, give_initial_stuff, item_drop, map, mapfix, maptools, mobs, mobs_npc, player_api, pvp, screwdriver, sethome, sfinv, shooter, shooter_crossbow, shooter_flaregun, shooter_grenade, shooter_guns, shooter_hook, shooter_rocket, shooter_turret, signs_lib, spawn, stairs, tnt, unified_inventory, vessels, walls, wool, worldedit, worldedit_commands, worldedit_infinity, worldedit_limited, worldedit_shortcommands, xban2, xpanes
+*** Damgar joined the game.
+<tde> MAster bin rot
+*** bramel joined the game.
+*** tilt2 left the game.
+*** lanzilotta left the game.
+*** thruman left the game.
+*** ridinger left the game. (timed out)
+*** Aloysa505 joined the game.
+<MasterOfMineteste> hallo
+*** latino left the game. (timed out)
+*** lawana left the game.
+*** listen left the game. (timed out)
+*** gaglione joined the game.
+*** firsching left the game. (timed out)
+*** maguet left the game.
+*** dominico left the game. (timed out)
+*** lucich left the game. (timed out)
+*** bramel left the game.
+*** dominico joined the game.
+*** schlatter joined the game.
+*** dominico left the game. (timed out)
+*** Damgar left the game.
+<MasterOfMineteste> tut es dir auch manchmal leid noobs die nix haben zu killen?
+*** thonatron1 left the game.
+<tde> Die Abenteuer von MAsterOfMineteste und tde
+*** thonatron1 joined the game.
+*** kattaura left the game. (timed out)
+*** sandie left the game. (timed out)
+*** carraher joined the game.
+<tde> Naja... Ich bin ja kein Pro...
+*** zimerman joined the game.
+<GalwayGirl> ich bin ein Hacker
+*** hermus joined the game.
+<tde> Standart
+*** gevz joined the game.
+<MasterOfMineteste> wenn du fasbrigen kannst schon
+*** gevz left the game.
+<MasterOfMineteste> das fehlt noch
+<carraher> hi
+<MasterOfMineteste> aber dann
+<tde> fasbringen??
+*** plantsoufiane joined the game.
+<henry7> where are you daddy
+*** ruggle left the game. (timed out)
+<MasterOfMineteste> ja, wenn dus einmal raushast ist es easy
+*** golderer joined the game.
+*** goolden joined the game.
+*** martiny joined the game.
+<MasterOfMineteste> pvp bist du schon pro.
+<tde> Seit ich am PC bin ists auch viel einfacher
+*** Aloysa505 left the game. (timed out)
+<tde> Danke
+*** chagollan left the game.
+<golderer> goldere
+*** hermus left the game.
+*** margette left the game.
+*** barchick left the game.
+*** hovanesian joined the game.
+*** gillies joined the game.
+<MasterOfMineteste> muss gehen
+*** heuschkel joined the game.
+<MasterOfMineteste> bb
+*** MasterOfMineteste left the game.
+*** Hittmann joined the game.
+*** jarrett joined the game.
+*** durland joined the game.
+(4,1119,27) is protected by Server.
+(4,1119,27) is protected by Server.
+<digian> nadie entre ami casa
+(4,1119,27) is protected by Server.
+(4,1118,25) is protected by Server.
+(4,1120,25) is protected by Server.
+(4,1119,25) is protected by Server.
+(4,1118,25) is protected by Server.
+(4,1119,25) is protected by Server.
+(4,1119,25) is protected by Server.
+(4,1119,27) is protected by Server.
+(4,1119,27) is protected by Server.
+<heuschkel> heuschkeli
+(5,1118,27) is protected by Server.
+(5,1118,27) is protected by Server.
+(5,1118,27) is protected by Server.
+(5,1118,27) is protected by Server.
+(5,1118,27) is protected by Server.
+(5,1118,27) is protected by Server.
+(5,1118,27) is protected by Server.
+(5,1118,27) is protected by Server.
+(5,1118,27) is protected by Server.
+*** golderer left the game. (timed out)
+*** jezio6996 left the game.
+<digian> the nda kas
+*** carraher left the game.
+*** barchick joined the game.
+<correale> correale
+*** kennett joined the game.
+*** thonatron1 left the game.
+*** henry7 left the game.
+*** mcgrail joined the game.
+*** gaglione left the game.
+*** pellman joined the game.
+*** waggoner joined the game.
+*** leupold left the game. (timed out)
+*** lagoni left the game.
+<heuschkel> heuschkel
+*** pratcher left the game. (timed out)
+*** lagoni joined the game.
+*** galinol joined the game.
+*** reidenbach joined the game.
+<tde> GalwayGirl bist ja wirklich ein HAcker... Wie machst du das??
+*** lagoni left the game.
+<martiny> Martina
+<GalwayGirl> C++
+*** holder left the game. (timed out)
+*** hovanesian left the game. (timed out)
+*** durland left the game.
+*** barchick left the game.
+*** maxson joined the game.
+<tde> was meinst du mit C++
+<tde> ??
+<GalwayGirl> wenn du willst kannst du meinen hackclient auch benutzen
+*** schlatter left the game. (timed out)
+*** enomoto joined the game.
+<tde> WAS?!!???!
+<GalwayGirl> C++ is die Programmiersprache in der Minetest geschrieben ist
+*** zimerman left the game. (timed out)
+<GalwayGirl> und ich habe den Quellcode von minetest verändert
+<tde> Und da kommst du ran??
+<GalwayGirl> ja, Minetest ist Open Source
+*** barchick joined the game.
+<tde> In deinen eigenen oder online??
+<GalwayGirl> jeder kann sich den Code runterladen
+*** enomoto left the game.
+PM from tde: Was nochmal??
+*** pellman left the game.
+<gillies> gillies
+<GalwayGirl> ich habe meinen eigenen client verändert
+*** goolden left the game. (timed out)
+*** snayper left the game.
+*** numkena left the game.
+Message sent.
+*** enomoto joined the game.
+PM from tde: Und das hast du wie gemacht??
+*** guiffre left the game. (timed out)
+*** bramel joined the game.
+PM from tde: Kurz afk warte
+*** kozielski left the game. (timed out)
+*** mcgrail left the game.
+PM from tde: MAch schnell bitte
+*** huhman left the game. (timed out)
+Message sent.
+*** calloway joined the game.
+*** shanaa joined the game.
+PM from tde: Dafür kannst du aber gebannt werden, aber danke...
+<reidenbach> reidenbach
+Message sent.
+*** kennett left the game. (timed out)
+*** snayper joined the game.
+*** lutterman joined the game.
+*** jarrett left the game.
+*** Enr_ique12 left the game. (timed out)
+*** test05 joined the game.
+PM from tde: Hab kein Discord muss los bbb
+*** tde left the game.
+*** munyon joined the game.
+*** catanach joined the game.
+*** ridinger joined the game.
+*** choquette joined the game.
+*** barchick left the game.
+*** browley left the game. (timed out)
+*** theisen joined the game.
+*** theisen left the game.
+*** chainey joined the game.
+*** calloway left the game.
+<martiny> Martina
+<martiny> ciao
+*** waddick joined the game.
+Message sent.
+*** Jacopo left the game.
+*** whitset joined the game.
+*** whitset left the game.
+<gillies> poland
+*** lutterman left the game.
+*** martiny left the game.
+*** heuschkel left the game. (timed out)
+*** orebaugh joined the game.
+# Server: version=5.0.1, uptime=168948, max_lag=0.454773, clients={GalwayGirl, zitzow, ascensio, belkin, myriam, joanie, spaeth, duszynski, allcock, rishty, silvas, korzyniowski, greeley, schoenwetter, rothbauer, paige, wingett, nassif, bantillan, straub, villamar, esenwein, deangelis, lucious, calendine, crisci, santillanes, ADIKA, castile, ashanti, allridge, baadsgaard, guderian, munyon, bournes, schlee}
+# Server: Welcome to SkyWars
+*** GalwayGirl joined the game.
+*** mazzetti joined the game.
+*** allcock left the game. (timed out)
+*** korzyniowski left the game.
+*** duszynski left the game.
+(110,1109,33) is protected by Server.
+(109,1109,33) is protected by Server.
+(109,1109,33) is protected by Server.
+*** eacret joined the game.
+*** maddi joined the game.
+*** eacret left the game. (timed out)
+*** duszynski joined the game.
+*** zitzow left the game.
+*** rishty left the game.
+*** duszynski left the game.
+*** reinmann joined the game.
+*** reinmann left the game.
+*** esenwein left the game. (timed out)
+*** reinmann joined the game.
+*** carver joined the game.
+*** duszynski joined the game.
+*** paige left the game. (timed out)
+*** mckever joined the game.
+*** routte joined the game.
+*** hennick joined the game.
+*** timmi joined the game.
+# Server: version=5.0.1, uptime=169424, max_lag=0.320142, clients={GalwayGirl, ciotta, timmi, hennick, routte, mckever, duszynski, carver, maddi, mazzetti, ascensio, belkin, myriam, joanie, spaeth, silvas, greeley, schoenwetter, rothbauer, wingett, nassif, bantillan, straub, villamar, deangelis, lucious, calendine, crisci, santillanes, ADIKA, castile, ashanti, reinmann, allridge, baadsgaard, guderian, munyon, bournes, schlee}
+# Server: Welcome to SkyWars
+*** GalwayGirl joined the game.
+*** reinmann left the game.
+<nassif> nassif nutfghffff223
+*** rebbeca joined the game.
+*** rothbauer left the game. (timed out)
+<mckever> mckever9
+*** hoopes joined the game.
+*** cancio joined the game.
+*** ascensio left the game.
+*** duszynski left the game.
+<belkin> belkinfgjc
+<GalwayGirl> gg
+*** pitman joined the game.
+*** lipsky joined the game.
+*** whitehair joined the game.
+*** duszynski joined the game.
+*** samatha joined the game.
+<duszynski> duszynski
+*** greeley left the game. (timed out)
+*** corrion joined the game.
+*** silvas left the game. (timed out)
+*** samatha left the game. (timed out)
+*** ascensio joined the game.
+*** levell joined the game.
+*** pitman left the game.
+*** tinnon joined the game.
+*** devenport joined the game.
+*** straub left the game.
+*** hoopes left the game. (timed out)
+*** ascensio left the game.
+*** blyden joined the game.
+*** myriam left the game. (timed out)
+*** lindboe joined the game.
+*** reidenbach joined the game.
+*** zarriello joined the game.
+*** christodouloui joined the game.
+*** 1x joined the game.
+*** henry3 joined the game.
+*** lindboe left the game.
+*** endres joined the game.
+*** hennick left the game. (timed out)
+*** harper joined the game.
+<1x> faas musmern machen 
+*** hebblethwaite joined the game.
+*** ciotta left the game.
+*** lindboe joined the game.
+*** fundora joined the game.
+*** spaeth left the game. (timed out)
+*** ahmedmortaga joined the game.
+*** Danila_Wind joined the game.
+*** ciotta joined the game.
+*** duszynski left the game.
+*** routte left the game. (timed out)
+*** blyden left the game. (timed out)
+*** mazzetti left the game. (timed out)
+*** ashanti left the game. (timed out)
+*** ahmedmortaga left the game.
+*** krystek joined the game.
+*** wilbourne joined the game.
+*** granfield joined the game.
+*** reidenbach left the game.
+*** Omega666 joined the game.
+*** wilbourne left the game. (timed out)
+*** hebblethwaite left the game.
+*** kandace joined the game.
+*** granfield left the game.
+*** lindboe left the game. (timed out)
+*** mugica joined the game.
+*** Nika_Ryasantseva joined the game.
+*** paige joined the game.
+*** Omega666 left the game.
+*** Danila_Wind left the game.
+*** Nika_Ryasantseva left the game.
+*** ADIKA left the game.
+*** schoenwetter left the game. (timed out)
+*** jonelle joined the game.
+*** munyon left the game. (timed out)
+*** nassif left the game. (timed out)
+*** carver left the game. (timed out)
+*** minna joined the game.
+<endres> endres
+*** spiewak joined the game.
+*** delonge joined the game.
+*** lipsky left the game. (timed out)
+*** jubert joined the game.
+*** belkin left the game. (timed out)
+*** jalbert joined the game.
+*** laurena joined the game.
+*** minna left the game.
+*** rebbeca left the game.
+*** corrion left the game. (timed out)
+*** bantillan left the game. (timed out)
+*** kandace left the game. (timed out)
+*** toy_Bonnie joined the game.
+*** kemner joined the game.
+*** minna joined the game.
+*** villamar left the game.
+*** wingett left the game.
+*** jubert left the game.
+*** mrianusca joined the game.
+*** donate joined the game.
+*** wingett joined the game.
+*** wingett left the game.
+*** harper left the game. (timed out)
+*** laurena left the game.
+*** henry3 left the game.
+*** zarriello left the game. (timed out)
+*** toy_Bonnie left the game.
+*** spiewak left the game.
+*** mckever left the game.
+*** spiewak joined the game.
+*** wingett joined the game.
+*** viviyan joined the game.
+*** levell left the game.
+*** kemner left the game.
+*** donate left the game. (timed out)
+*** timmi left the game.
+*** Iscalune joined the game.
+*** levell joined the game.
+*** timmi joined the game.
+*** fundora left the game.
+*** kemner joined the game.
+*** mazariegos joined the game.
+*** ciotta left the game.
+*** lindboe joined the game.
+*** donate joined the game.
+*** saucissonsauvage joined the game.
+*** bartlow joined the game.
+*** endres left the game. (timed out)
+*** wingett left the game.
+*** kemner left the game.
+*** jonelle left the game. (timed out)
+*** schiraldi joined the game.
+*** castile left the game.
+*** lichorat joined the game.
+*** lichorat left the game.
+*** waddick joined the game.
+*** lindboe left the game. (timed out)
+*** jalbert left the game.
+*** donate left the game. (timed out)
+*** jalbert joined the game.
+*** donate joined the game.
+*** hem4nt joined the game.
+*** annonio joined the game.
+*** isachsen joined the game.
+*** gillies joined the game.
+*** eveleigh joined the game.
+*** bartlow left the game. (timed out)
+*** pratcher joined the game.
+*** eveleigh left the game.
+*** Iscalune left the game.
+*** whitehair left the game. (timed out)
+*** jalbert left the game. (timed out)
+*** donate left the game. (timed out)
+*** presutti joined the game.
+*** christodouloui left the game. (timed out)
+*** munyon joined the game.
+*** joplin joined the game.
+*** golebiowski joined the game.
+*** leikam joined the game.
+*** gillies left the game.
+*** donate joined the game.
+*** endres joined the game.
+*** joplin left the game.
+*** schiraldi left the game. (timed out)
+*** donate left the game.
+*** joplin joined the game.
+*** gillies joined the game.
+*** donate joined the game.
+*** saucissonsauvage left the game.
+*** hem4nt left the game.
+*** mazariegos left the game. (timed out)
+*** pelaez joined the game.
+*** gillies left the game.
+*** annonio left the game.
+*** presutti left the game.
+*** annonio joined the game.
+*** marzigliano joined the game.
+*** Nomaga joined the game.
+*** gillies joined the game.
+<Nomaga> Bonjour 
+<Nomaga> hello
+<Nomaga> hi
+<tinnon> Ciao venite pui
+*** pelaez left the game.
+*** mulanax joined the game.
+*** boczar joined the game.
+*** pelaez joined the game.
+*** jvt1308 joined the game.
+<Nomaga> hi
+*** clayborn joined the game.
+*** bowditch joined the game.
+*** stuller joined the game.
+*** annonio left the game. (timed out)
+*** joplin left the game.
+*** MasterOfMineteste joined the game.
+<Nomaga> hi MasterOfMineteste
+*** pelaez left the game.
+<gillies> help
+*** gillies left the game.
+<pratcher> pratcherhe
+*** marzigliano left the game.
+*** spidernul joined the game.
+*** joplin joined the game.
+*** clayborn left the game. (timed out)
+<mulanax> nope
+*** spidernul left the game.
+*** annonio joined the game.
+*** spiewak left the game. (timed out)
+<Nomaga> MasterOfMineteste: blue team ?
+*** Nika_Ryasantseva joined the game.
+*** kainoa joined the game.
+<pratcher> pratche
+*** silvia joined the game.
+*** annonio left the game.
+*** notebook joined the game.
+*** stuller left the game.
+*** effner joined the game.
+*** Hubiii joined the game.
+*** viviyan left the game.
+*** kammer joined the game.
+*** annonio joined the game.
+<donate> алиса
+*** waddick left the game. (timed out)
+*** stuller joined the game.
+<MasterOfMineteste> all vs GalwayGirl
+<GalwayGirl> lol
+<Nomaga> GalwayGirl:  you are a noob section
+*** maki joined the game.
+<Nomaga> team red no kill team blue , kill GalwayGirl
+<mulanax> do yo kno de wae
+*** valensuela joined the game.
+*** stuller left the game. (timed out)
+*** bowditch left the game.
+<MasterOfMineteste> team red: dont attak me and Nomaga we only wanna help
+*** pratcher left the game. (timed out)
+<notebook> hi
+*** maddi left the game.
+<Nomaga> GalwayGirl noob
+*** waddick joined the game.
+*** jvt1308 left the game.
+<MasterOfMineteste> hi notebook
+*** valensuela left the game. (timed out)
+*** glickman joined the game.
+<notebook> welches Team bist du?
+<MasterOfMineteste> blau
+*** Danila_Wind joined the game.
+*** kammer left the game.
+*** donate left the game. (timed out)
+<MasterOfMineteste> du?
+<notebook> rot
+<MasterOfMineteste> ich versuch zu helfen
+*** 1x left the game. (timed out)
+*** donate joined the game.
+*** cofran joined the game.
+<MasterOfMineteste> warte
+<MasterOfMineteste> ich will euch nur helfen
+<Nomaga> team blue and team red kill GalwayGirl !!
+<GalwayGirl> gamers unite
+<MasterOfMineteste> wir muessen GalwayGirl killen
+*** egar joined the game.
+*** annonio left the game.
+*** silvia left the game.
+<Nomaga> Francais et francaise sur ce server il faut tuer GalwayGirl
+*** samatha joined the game.
+*** annonio joined the game.
+*** annonio left the game.
+<MasterOfMineteste> ich will euch nur helfen
+*** Nika_Ryasantseva left the game.
+<MasterOfMineteste> wir muessen GalwayGirl killen
+*** kupfer joined the game.
+*** annonio joined the game.
+<GalwayGirl> i bekomme keinen schaden
+<GalwayGirl> ihr könnt mich nicht killen
+*** boczar left the game. (timed out)
+<MasterOfMineteste> GalwayGirl: autohealer
+*** endres left the game.
+*** damrell joined the game.
+<Nomaga> kill GalwayGirl  !!!
+*** samatha left the game. (timed out)
+*** Danila_Wind left the game.
+*** deangelis left the game. (timed out)
+*** endres joined the game.
+*** choquette joined the game.
+<MasterOfMineteste> egar: stop it
+*** henry3 joined the game.
+*** damrell left the game.
+*** hebrard joined the game.
+*** pelzel joined the game.
+*** isachsen left the game. (timed out)
+*** damrell joined the game.
+<Nomaga> team red go !
+<MasterOfMineteste> notebook: kapierst dus nicht? GalwayGirl hackt. er spawntrappt euch dabei. und ich will ihn killen damit er aufhouert
+(110,1111,35) is protected by Server.
+*** Hubiii left the game.
+*** notebook left the game.
+*** Wehr joined the game.
+<waddick> waddick
+<Wehr> Hi master
+*** berkman joined the game.
+<MasterOfMineteste> hi Wehr
+<Wehr> GalwayGirl
+<MasterOfMineteste> alle gegen GalwayGirl
+<MasterOfMineteste> bzw. brex
+*** susann joined the game.
+<Wehr> GalwayGirl do you have more accounts? maybe I know u
+*** okojie joined the game.
+*** egar left the game.
+<Wehr> Achso ist das brex
+*** effner left the game.
+<MasterOfMineteste> hey!c GaywayGirl
+*** vandellen joined the game.
+<Wehr> lol der fliegt
+*** endres left the game.
+<Wehr> GALWAYGIRL
+*** effner joined the game.
+*** golebiowski left the game. (timed out)
+*** vandellen left the game.
+*** endres joined the game.
+<MasterOfMineteste> er heisst GaywayGirl
+*** leikam left the game. (timed out)
+*** C00L joined the game.
+*** minna left the game. (timed out)
+<Wehr> K00l_zy
+<MasterOfMineteste> hi
+*** looman joined the game.
+*** choquette left the game.
+<MasterOfMineteste> plan 2
+*** pelzel left the game.
+<Nomaga> okay
+*** villar joined the game.
+<GalwayGirl> plan b meinst du
+<Wehr> GalwaysGiel sind wir FREUNDE
+*** minna joined the game.
+<GalwayGirl> jaja
+*** kupfer left the game. (timed out)
+<Wehr> Juhu :D
+<MasterOfMineteste> naja ich hab ne loste gegen dich
+<MasterOfMineteste> * Liste
+<Wehr> GalwayGirl hast du noch mehr accounts
+<Nomaga> thank devenport
+<MasterOfMineteste> ich hab dich schon 2 mal zu quitten gebracht
+<GalwayGirl> ne
+<Wehr> Galway hast du noch mehr accounts? Vielleicht kenne ich dich
+*** levell left the game. (timed out)
+<GalwayGirl> ich quitte manchmal um an meinem hackclient zu arbeiten
+<MasterOfMineteste> HAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHHAHAHA
+<GalwayGirl> das hier ist eigentlich mehr nur ein test server für den hackclient
+<Nomaga> no
+*** henry3 left the game.
+<Wehr> GalwayGirl bist du ein girl
+<MasterOfMineteste> GalwayGirl: aber jetzt mal ehrlich: hast du den selber geschrieben?
+*** baadsgaard left the game. (timed out)
+*** lucious left the game. (timed out)
+*** mulanax left the game.
+<GalwayGirl> ja
+*** sauredo joined the game.
+*** mrianusca left the game.
+*** pelzel joined the game.
+<Nomaga> you are a hecker GalwayGirl
+<Nomaga> hacker *
+*** farrington joined the game.
+<GalwayGirl> u mean hacker?()
+*** tremillo joined the game.
+<Nomaga> you
+<MasterOfMineteste> wie lang hast du gebraucht? kann man sich hackclients irgendwo runterladen? wenn ja: WOOOOOOOO??!?!?
+*** labrie joined the game.
+<GalwayGirl> nein man kann sich keine hackclients runterladen
+*** mulanax joined the game.
+<GalwayGirl> man muss das schon selber machen sonst
+<Wehr> Kann man sie nur selber programmieren?
+<Wehr> Achso
+<GalwayGirl> ich habe 2 stunden gebraucht
+<Wehr> Ok
+*** villar left the game.
+*** cambre joined the game.
+<MasterOfMineteste> aber ich kann nicht programieren
+<GalwayGirl> nach 4 jahren programmiererfahrung
+<Wehr> Galway mach doch was beruflich über programmieren oder so
+<GalwayGirl> ich bin 14
+<Wehr> Ohaa
+<Wehr> Wieso bist du so begabt
+*** villar joined the game.
+*** Nomaga left the game.
+<MasterOfMineteste> ja, aber was muss man programieren?
+*** berkman left the game.
+<GalwayGirl> weil ich dafür sozial behindert bin
+*** donate left the game.
+*** villar left the game.
+<GalwayGirl> du musst C++ lernen
+<Wehr> Ok
+*** ahmedmortaga joined the game.
+*** donate joined the game.
+*** Nomaga joined the game.
+<Nomaga> hi
+*** glickman left the game.
+<GalwayGirl> dann lädst du dir den minetest quelltext runter, bearbeitest ein paar dateien und kompilierts es
+<Nomaga> help me MasterOfMineteste .
+<GalwayGirl> ok
+*** ahmedmortaga left the game.
+<Wehr> c00l fuck you
+*** annonio left the game. (timed out)
+*** glickman joined the game.
+<Wehr> GalwayGirl wie kann ich am Handy hacken
+*** annonio joined the game.
+<MasterOfMineteste> kompliemieren, quellentext...
+<GalwayGirl> ich lasse euch frei
+<Wehr> Oder allgemein
+*** ahmedmortaga joined the game.
+<Wehr> GalwayGie
+<GalwayGirl> wenn ihr wollt kann ich euchs beibringen
+<Wehr> Kannst du ein tutorial machen
+<GalwayGirl> ja
+<GalwayGirl> discord?
+<Wehr> Ok aber wenn wird gesehen haben dann lösch es on
+<MasterOfMineteste> hab halt kein mirkro
+*** tapaha joined the game.
+*** yaro98 joined the game.
+<Wehr> Ich hab kein discord
+<MasterOfMineteste> GalwayGirl: wie heisst du auf discord?
+<GalwayGirl> IRC?
+<Wehr> Kannst du keins auf yt machen?
+*** hansen joined the game.
+*** tapaha left the game.
+<GalwayGirl> ne kein YT
+<MasterOfMineteste> GalwayGirl: wie heisst du auf discord?
+<GalwayGirl> einen moment
+<MasterOfMineteste> ok
+<tremillo> tremilloky
+*** tapaha joined the game.
+*** liane joined the game.
+<Wehr> GalwayGirl gibt es auch nen hack wo man bei suruvalserver protectete sachen abbauen kann
+*** Nomana joined the game.
+<Nomaga> Hi Nomaga
+<MasterOfMineteste> oder sachen geben
+*** siprasoeuth joined the game.
+<MasterOfMineteste> auf skyblock wasser
+<Nomaga> hi Nomana
+<GalwayGirl> nein
+<Nomana> hi Nomaga
+<Wehr> schade
+<MasterOfMineteste> GalwayGirl: wie heisst du auf discord?
+<GalwayGirl> protectionj umgehen geht nicht
+*** villar joined the game.
+*** Nomana left the game.
+<Wehr> GalwayGirl kannst du passwörter hersusfinden
+*** mondejar joined the game.
+<MasterOfMineteste> gamefox hat gesagt das geht. egal du wirkst sympatischer und professioneller
+<MasterOfMineteste> GalwayGirl: wie heisst du auf discord?
+<MasterOfMineteste> GalwayGirl: wie heisst du auf discord?
+*** duhart joined the game.
+*** coralee joined the game.
+*** hansen left the game.
+*** coralee left the game.
+<MasterOfMineteste> GalwayGirl: wie heisst du auf discord?
+<Wehr> sie muss nachschauen
+*** coralee joined the game.
+<MasterOfMineteste> xD
+<GalwayGirl> Foxy03#3282
+<Wehr> Hahaha munyon
+*** yellow joined the game.
+<MasterOfMineteste> ok
+<Wehr> is discord ne app?
+*** mondejar left the game. (timed out)
+<GalwayGirl> eine website oder app
+<duhart> duhartizuuehdfhf
+<GalwayGirl> discord.gg
+<MasterOfMineteste> stiche3s2 bin ich
+<Wehr> wie loggt ma sich ein
+*** rochow joined the game.
+<duhart> duhartdjdhdueifudididjrjfjiddifkfhfj
+<Wehr> Mit nummer oder Email?
+<MasterOfMineteste> mit e-mail
+<Wehr> Oh man
+*** larsson joined the game.
+*** yarbro joined the game.
+<Nomaga> zhi Nicki larsson
+<Wehr> GalwayGirl kannst du passwörter herausfinden
+<Nomaga> hi Nicki larsson*
+<Wehr> Nomaga Nicki Minaj
+*** tilt2 joined the game.
+<MasterOfMineteste> Wehr: bist du eigendlich auch in der dreamarmy?
+*** popick joined the game.
+<Wehr> Ich bin Tryhard
+*** maki left the game.
+<Wehr> Ich bin hier gebannr
+*** cambre left the game. (timed out)
+*** tremillo left the game.
+<endres> endres
+*** callanan joined the game.
+*** susann left the game. (timed out)
+*** burglin joined the game.
+<MasterOfMineteste> also bist du TryParti ?
+<Wehr> Ja
+*** hebrard left the game.
+*** yaro98 left the game. (timed out)
+*** michot joined the game.
+<Nomaga> Tryparti is my friends
+<Wehr> I am TryParti
+*** denick joined the game.
+*** farrington left the game.
+<Wehr> Nlmaga who are you
+<yarbro> who wanna build a house whit me
+*** tlucek joined the game.
+<Nomaga> Kocopemon , Kocopemon12 an Nomaga
+<Wehr> oh bonjour
+*** delonge left the game. (timed out)
+*** ahmedmortaga left the game.
+<Nomaga> i m Kocopemon , Kocopemon12 and Nomaga
+*** kraszewski joined the game.
+<Nomaga> Salut Wehr
+<callanan> callanan
+*** minna left the game.
+<Wehr> GamwayGirl kannst du PWs herausfinden
+*** huhman joined the game.
+<Nomaga> Wehr:  ca te dit cette apres midi a 14 h de jouer sur King of hill ?
+<GalwayGirl> nur durch ausprobieren
+*** jerabek joined the game.
+*** BANANOMOBIL joined the game.
+*** annonio left the game. (timed out)
+*** pelzel left the game.
+<GalwayGirl> aber ich könnte ein progrmm schreiben dass alle möglichkeiten durchprobiert
+*** burglin left the game.
+<Wehr> Non je dois apprendre pour les exames
+*** minna joined the game.
+*** brossard joined the game.
+<GalwayGirl> aber sowas ist illegalw
+<Nomaga> ok
+*** jerabek left the game.
+<GalwayGirl> in-game darf ich machen was ich will
+<MasterOfMineteste> GalwayGirl: aber dass geht dann echt zu weit
+<Wehr> Also kannst du keine PWs hersisfinden schade
+<GalwayGirl> rja drum mach ich es ja auch nicht
+<MasterOfMineteste> Wehr: doch
+*** siprasoeuth left the game. (timed out)
+*** leibel joined the game.
+<MasterOfMineteste> Wehr: aber die betonung liegt auf koennte
+*** glickman left the game. (timed out)
+<Wehr> Aso
+<Wehr> Könntest du das PW von DENIS herausfinden xD
+<GalwayGirl> welches betriebssystem nutzt ihr?
+<Nomaga> t es au lycée ?
+<Wehr> Minetest
+*** brossard left the game. (timed out)
+<Wehr> Oder was meinst du
+<callanan> callanan
+<GalwayGirl> Windows 10?
+<MasterOfMineteste> alle so: PVP ahhhhh essen, schlagen. Wehr und ich: laufen so auf nem fuenf blocke pfad immer im kreis
+*** triece joined the game.
+*** joplin left the game. (timed out)
+*** sargetakis joined the game.
+*** minna left the game. (timed out)
+<Wehr> Nein windows u
+<Wehr> 7
+*** kraszewski left the game. (timed out)
+*** tilt2 left the game.
+*** sentinella joined the game.
+<MasterOfMineteste> windows 10 pro, ubuntu. hab ich beides
+*** allridge left the game.
+<GalwayGirl> ok wenn ihr windows habt (egal welches) wird es schwierig mit dem kompilieren
+<Wehr> Ok
+*** tilt2 joined the game.
+<GalwayGirl> unbuntu ?
+*** minna joined the game.
+<GalwayGirl> seeehr gut
+<MasterOfMineteste> ich hab auf ubuntu
+<Nomaga> bye
+<GalwayGirl> dann hast du echt glück
+<MasterOfMineteste> bb Nomaga
+<Nomaga> enrevoir
+<Nomaga> chao
+<MasterOfMineteste> ich hasse windows
+*** rabehl joined the game.
+*** Nomaga left the game.
+<GalwayGirl> ich auch
+*** donate left the game. (timed out)
+<MasterOfMineteste> hast du eigendlich nen autoklicker?
+<GalwayGirl> nein
+<Wehr> Galway was ist der einfachste Hack den man programmieren kann
+<GalwayGirl> ween ich einen brauch nehm ich xdootool
+*** jerabek joined the game.
+<GalwayGirl> Wehr: für minetest?
+<Wehr> ja
+<GalwayGirl> fly
+*** behrend joined the game.
+*** hemken joined the game.
+<Wehr> Wie krieg ich das
+*** duhart left the game.
+<Wehr> Aso bei Windows gehts nicht
+<behrend> behrend
+*** delonge joined the game.
+<GalwayGirl> bei windows geht es auch
+*** behrend left the game. (timed out)
+<GalwayGirl> der code sieht genauso aus wie der für alle anderen systeme
+<GalwayGirl> das problem ist das ausführen
+<GalwayGirl> ich weis nicht genau wie man unter windows kompiliert
+*** denick left the game.
+*** sentinella left the game.
+<yarbro> yarbro8
+<Wehr> Und unter handy
+*** kinkel joined the game.
+*** yarbro left the game. (timed out)
+*** minna left the game. (timed out)
+*** friemering joined the game.
+*** minna joined the game.
+*** nalevanko joined the game.
+*** okojie left the game. (timed out)
+*** hansen joined the game.
+*** coralee left the game.
+*** jerabek left the game.
+<Wehr> Galway weißt su auch nicht wie man Fly am handy macht?
+<MasterOfMineteste> muss gehem
+*** mulanax left the game.
+<Wehr> bb
+<MasterOfMineteste> bye
+*** MasterOfMineteste left the game.
+*** larsson left the game.
+*** nalevanko left the game.
+*** mulanax joined the game.
+*** dansie joined the game.
+*** mcconaghy joined the game.
+<Wehr> Galway
+*** bogosh joined the game.
+*** michot left the game.
+*** peterka joined the game.
+<hemken> hemken8
+*** bobby joined the game.
+<Wehr> Wehr8
+*** minna left the game. (timed out)
+*** damrell left the game. (timed out)
+*** looman left the game.
+*** winniepee joined the game.
+*** minna joined the game.
+*** jaden joined the game.
+*** rabehl left the game.
+*** turick joined the game.
+*** Wehr left the game.
+*** villar left the game.
+*** mcconaghy left the game.
+*** yoshiko joined the game.
+*** peterka left the game.
+*** barone joined the game.
+*** bogosh left the game. (timed out)
+<callanan> cei cu tine puta
+<tapaha> tapaha
+*** hebblethwaite joined the game.
+*** helvie joined the game.
+*** duhart joined the game.
+*** leibel left the game. (timed out)
+*** hemken left the game. (timed out)
+*** laredo joined the game.
+*** Shevermik joined the game.
+*** duhart left the game.
+*** effner left the game. (timed out)
+<callanan> callanan
+*** villar joined the game.
+*** griffel joined the game.
+*** callanan left the game. (timed out)
+*** lucich joined the game.
+*** gentilcore joined the game.
+*** Danila_Wind joined the game.
+<mulanax> hshehdhehe7777
+*** jakobsen joined the game.
+*** endres left the game. (timed out)
+*** waddick left the game. (timed out)
+*** guberman joined the game.
+*** ciotta joined the game.
+*** ciotta left the game.
+*** mcglew joined the game.
+*** sprecher joined the game.
+*** yoshiko left the game.
+*** turick left the game.
+*** gorder joined the game.
+*** debrito joined the game.
+*** endres joined the game.
+*** hulslander joined the game.
+*** nessel joined the game.
+<debrito> debrito
+*** winniepee left the game.
+*** palencia joined the game.
+*** friemering left the game.
+*** Smux13 joined the game.
+*** mcglew left the game.
+*** hansen left the game.
+*** huhman left the game. (timed out)
+*** griffel left the game.
+*** hansen joined the game.
+*** hebblethwaite left the game. (timed out)
+*** tapaha left the game.
+*** causby joined the game.
+*** taglieri joined the game.
+*** tapaha joined the game.
+*** hanberg joined the game.
+*** debrito left the game.
+*** helvie left the game.
+*** hansen left the game.
+*** Nika_Ryasantseva joined the game.
+*** ringman joined the game.
+*** tilt2 left the game.
+*** kainoa left the game. (timed out)
+*** huhman joined the game.
+*** jakobsen left the game.
+*** Wehr joined the game.
+*** sargetakis left the game. (timed out)
+*** Wehr left the game.
+*** triece left the game. (timed out)
+*** barone left the game.
+*** jakobsen joined the game.
+*** kinkel left the game. (timed out)
+*** delonge left the game. (timed out)
+*** yellow left the game. (timed out)
+<nessel> мгыершоцлзт
+*** taglieri left the game.
+*** barone joined the game.
+*** jurkowski joined the game.
+*** huhman left the game. (timed out)
+*** rabehl joined the game.
+*** okojie joined the game.
+*** dourado joined the game.
+*** huhman joined the game.
+*** bannett joined the game.
+*** gentilcore left the game.
+<rochow> rochowainnbbn
+*** sprecher left the game.
+*** Six007gr joined the game.
+*** callanan joined the game.
+# Server: version=5.0.1, uptime=181032, max_lag=0.462157, clients={GalwayGirl, maki, mudmud, macnair, mckever, mollins, hilado, joganic, kandace, raynes, teeters, griffieth, patolot, pecararo, btl, barone, breitenberg, minna, kataoka, saefong, lapusnak, ZeOzm, dambrosi, rubendall, silvia, devenport, vandehei, dolch, kupfer, boggus, mcright, Atanpi, Lenski, Geist_08, donate, Alice1alexus, quarktasche, cullifer, wolever, numkena, goswami, Handboll36, stazenski, rodarta, lanfranco, jack23, fairleigh, Licorne, bracaloni, lanzilotta, callanan, eclarinal, snowberger, keaserjsjs, macina, mugica, joanie, calendine, crisci, mcphillips, guderian, gherardini, bournes, deford, schlee}
+# Server: Welcome to SkyWars
+*** GalwayGirl joined the game.
+*** macnair left the game.
+*** sirmon joined the game.
+# Server: version=5.0.1, uptime=181067, max_lag=0.430995, clients={GalwayGirl, sirmon, maki, mudmud, mckever, mollins, hilado, joganic, kandace, raynes, teeters, griffieth, patolot, pecararo, btl, barone, breitenberg, minna, kataoka, saefong, lapusnak, ZeOzm, dambrosi, rubendall, silvia, devenport, vandehei, dolch, kupfer, boggus, mcright, Atanpi, Lenski, Geist_08, donate, Alice1alexus, quarktasche, cullifer, wolever, numkena, goswami, Handboll36, stazenski, rodarta, lanfranco, jack23, fairleigh, Licorne, bracaloni, lanzilotta, callanan, eclarinal, snowberger, keaserjsjs, macina, mugica, joanie, calendine, crisci, mcphillips, guderian, gherardini, bournes, deford, schlee}
+# Server: Welcome to SkyWars
+*** GalwayGirl joined the game.
+<jack23> hi mudmud
+*** macnair joined the game.
+<cullifer> cullifer
+<mudmud> hi
+*** westlie joined the game.
+*** eclarinal left the game.
+*** Geist_08 left the game.
+*** macnair left the game.
+<mudmud> how's it going
+*** mcphillips left the game. (timed out)
+*** Lenski left the game.
+*** linsay joined the game.
+*** Atanpi left the game.
+<macina> macina
+*** macnair joined the game.
+<jack23> sorry
+*** fairleigh left the game. (timed out)
+*** battaglini joined the game.
+*** berisha joined the game.
+*** coletta joined the game.
+*** macnair left the game.
+*** donate left the game.
+<ZeOzm> galway gal is flyhacking
+<saefong> saefong
+*** stazenski left the game. (timed out)
+*** cullifer left the game.
+*** macnair joined the game.
+*** eclarinal joined the game.
+*** whetzell joined the game.
+*** griffieth left the game.
+*** macnair left the game.
+*** hemken joined the game.
+*** teeters left the game.
+*** nemets joined the game.
+*** vandehei left the game.
+*** troxell joined the game.
+*** saefong left the game. (timed out)
+*** mcentyre joined the game.
+<whetzell> Кристина
+*** macnair joined the game.
+*** wolever left the game.
+*** crisci left the game. (timed out)
+*** wakely joined the game.
+*** nitzel joined the game.
+*** btl left the game.
+*** lanzilotta left the game.
+<patolot> patolot
+*** raynes left the game.
+*** remi joined the game.
+*** wolever joined the game.
+<troxell> troxellgsvzhdhhuu
+*** wolever left the game.
+*** koeninger joined the game.
+<patolot> patolot
+# Server: version=5.0.1, uptime=1.3937e+06, max_lag=0.27065, clients={GalwayGirl}
+# Server: Welcome to BuildBattle
+*** GalwayGirl joined the game.
+Privileges of GalwayGirl: shout
+# Server: version=5.0.1, uptime=1.39383e+06, max_lag=0.380186, clients={GalwayGirl}
+# Server: Welcome to BuildBattle
+*** GalwayGirl joined the game.
+Privileges of GalwayGirl: shout
+-!- Invalid command: respawn
+<GalwayGirl> .respawn
+<GalwayGirl> ./respawn
+<GalwayGirl> respawn
+<GalwayGirl> .respawn
+-!- Invalid command: respawn
+# Server: version=5.0.1, uptime=1.39399e+06, max_lag=0.276449, clients={GalwayGirl}
+# Server: Welcome to BuildBattle
+*** GalwayGirl joined the game.
+-!- Invalid command: respawn
+<GalwayGirl> .respawn
+<GalwayGirl> !respawn
+# Server: version=5.0.1, uptime=1.39428e+06, max_lag=0.277169, clients={GalwayGirl}
+# Server: Welcome to BuildBattle
+*** GalwayGirl joined the game.
+# Server: version=5.0.1, uptime=1.39482e+06, max_lag=0.314015, clients={GalwayGirl}
+# Server: Welcome to BuildBattle
+*** GalwayGirl joined the game.
+# Server: version=5.0.1, uptime=1.39483e+06, max_lag=0.305649, clients={GalwayGirl}
+# Server: Welcome to BuildBattle
+*** GalwayGirl joined the game.
+# Server: version=5.0.1, uptime=183252, max_lag=0.42489, clients={quarktasche, hoopes, shellie, tigner, jurkowski, marburger, lakins, molinari, jvt1308, herimann, delcamp, laisure, schutte, Kiiler220, lapusnak, herrion, noemi, colline, leonpacher, endres, blincoe, mordehay, abernatha, leshia, eppley, sherrer, callaway, ardyth, battaglini, koeninger, jensrud, loooooooooooooooooo, remi, eclarinal, linsay, mckever, kandace, patolot, breitenberg, ZeOzm, dambrosi, rubendall, silvia, devenport, dolch, hemken, mcright, Handboll36, lanfranco, jack23, Licorne, hallan, bracaloni, numkena, callanan, joanie, keaserjsjs, guderian, gherardini, bournes, deford, schlee}
+# Server: Welcome to SkyWars
+*** loooooooooooooooooo joined the game.
+<patolot> patolot
+<colline> colline
+<Licorne> welcome to house
+<patolot> patolot
+# Server: version=5.0.1, uptime=183616, max_lag=0.485318, clients={GalwayGirl, hypxr, mcentyre, harmeson, Megemera, sidwell, clingman, rubendall, emberley, tilt2, grimshaw, donate, vallin, palencia, silvia, jalbert, girolami, quarktasche, shellie, jurkowski, marburger, molinari, jvt1308, delcamp, laisure, schutte, Kiiler220, lapusnak, herrion, noemi, leonpacher, endres, blincoe, mordehay, abernatha, leshia, eppley, sherrer, callaway, ardyth, battaglini, koeninger, jensrud, remi, eclarinal, mckever, kandace, patolot, breitenberg, dambrosi, devenport, hemken, mcright, Handboll36, jack23, Licorne, bracaloni, numkena, callanan, joanie, keaserjsjs, guderian, gherardini, bournes, deford, schlee}
+# Server: Welcome to SkyWars
+*** GalwayGirl joined the game.
+<rubendall> did you know the world woul is in this place xbox is going for video Zimmerman says it's very good at my place
+<jack23> ur a lonely sad person with no life
+*** sidwell left the game.
+<GalwayGirl> test
+<Megemera> am i one blue or red?
+<jack23> ur a lonely sad person with no life quark
+*** emberley left the game. (timed out)
+*** noemi left the game.
+# Server: version=5.0.1, uptime=183705, max_lag=0.406664, clients={noemi, alukonis, hypxr, mcentyre, harmeson, Megemera, clingman, rubendall, tilt2, grimshaw, vallin, palencia, silvia, jalbert, girolami, quarktasche, shellie, jurkowski, marburger, molinari, jvt1308, delcamp, laisure, schutte, Kiiler220, lapusnak, herrion, leonpacher, endres, blincoe, mordehay, abernatha, leshia, eppley, sherrer, callaway, ardyth, battaglini, koeninger, jensrud, remi, eclarinal, mckever, kandace, patolot, breitenberg, dambrosi, devenport, GalwayGirl, hemken, mcright, Handboll36, sidwell, jack23, Licorne, bracaloni, numkena, callanan, joanie, keaserjsjs, guderian, gherardini, bournes, schlee}
+# Server: Welcome to SkyWars
+*** GalwayGirl joined the game.
+<eclarinal> eclarinal
+*** schutte left the game.
+*** hamiton joined the game.
+# Server: version=5.2.0, uptime=35130, max_lag=2.7643, clients={Fleckenstein, HimbeerserverDE}
+# Server: Welcome to Elidragon Skyblocks!
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)\e(c@#27EA30) Skyblocks\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub !\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island!\e(c@#ffffff)
+\e(c@#83FF00) NEWS! \e(c@#ffffff)\e(c@#FFFFFF)Server on Version 5.2 now!\e(c@#ffffff)
+\e(c@#339933)<Falco@IRC> Hi HimbeerserverDE, Hi Fleckenstein!\e(c@#ffffff)
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> hi
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<HimbeerserverDE> Hi Falco!
+-!- Invalid command: islandf
+\e(c@#339933)<Falco@IRC> Later all and Good night.\e(c@#ffffff)
+\e(c@#339933)-!- Falco has quit [Quit: Leaving]\e(c@#ffffff)
+# Server: version=5.2.0, uptime=35587.4, max_lag=3.89456, clients={Fleckenstein}
+# Server: Welcome to Elidragon Skyblocks!
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)\e(c@#27EA30) Skyblocks\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub !\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island!\e(c@#ffffff)
+\e(c@#83FF00) NEWS! \e(c@#ffffff)\e(c@#FFFFFF)Server on Version 5.2 now!\e(c@#ffffff)
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)HimbeerserverDE has joined the Server.
+The mailbox is full
+The mailbox is full
+The mailbox is full
+Teleporting to HimbeerserverDE at (16544.255859375,17.5,15993.561523438)
+Teleporting to HimbeerserverDE at (16552.482421875,17.5,15983.200195313)
+\e(T@unified_inventory)Home position set to: \eF(16550,18,16003)\eE\eE
+\e(T@unified_inventory)Home position set to: \eF(16550,18,16003)\eE\eE
+Privileges of HimbeerserverDE: diglocks openlocks shout password kick worldedit tp noclip privs fast basic_privs areas fly irc_admin vanish creative bring webserver vip teleport ban level ui_full tp_tpc interact settime invhack debug give protection_bypass home server rollback travelnet_attach tp_admin travelnet_remove areas_high_limit
+Privileges of HimbeerserverDE: diglocks openlocks shout password kick worldedit tp noclip privs fast basic_privs areas fly irc_admin vanish creative bring webserver vip teleport ban level ui_full tp_tpc interact settime invhack debug give protection_bypass home server rollback travelnet_attach tp_admin travelnet_remove areas_high_limit
+Privileges of HimbeerserverDE: diglocks openlocks shout password kick worldedit tp noclip ui_full fast basic_privs areas fly irc_admin vanish creative bring vip areas_high_limit ban level webserver tp_tpc interact settime teleport debug give server home privs rollback travelnet_attach tp_admin travelnet_remove invhack
+DM from HimbeerserverDE: 5090
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<HimbeerserverDE> he
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<HimbeerserverDE> ruhe
+\e(T@beds)You can only sleep at night.\eE
+\e(T@beds)You can only sleep at night.\eE
+Teleporting to HimbeerserverDE at (4600.7807617188,4598.7001953125,4604.3061523438)
+\e(c@#FFFF55)Fleckenstein has entered the PvP area\e(c@#ffffff)
+\e(c@#FFFF55)Fleckenstein has entered the PvP area\e(c@#ffffff)
+\e(c@#FFFF55)Fleckenstein has entered the PvP area\e(c@#ffffff)
+\e(c@#FFFF55)Fleckenstein has entered the PvP area\e(c@#ffffff)
+\e(c@#FFFF55)Fleckenstein has entered the PvP area\e(c@#ffffff)
+\e(c@#FFFF55)Fleckenstein has entered the PvP area\e(c@#ffffff)
+\e(c@#FFFF55)Fleckenstein has entered the PvP area\e(c@#ffffff)
+\e(c@#FFFF55)Fleckenstein has entered the PvP area\e(c@#ffffff)
+\e(c@#FFFF55)Fleckenstein has entered the PvP area\e(c@#ffffff)
+\e(c@#FFFFFF)\e(c@#ffffff)Llynnya has joined the Server.
+\e(T@unified_inventory)Inventory cleared!\eE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+-!- Invalid command: newhzb+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Please click on the target you want to travel to.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+"3d_armor:boots_admin" added to inventory.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#FFFFFF)\e(c@#ffffff)igidrau has joined the Server.
+\e(c@#FFFF00)HimbeerserverDE has completed HimbeerserverDE's labyrinth\e(c@#ffffff)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Fleckenstein whispers: Commandblock unconfigured
+Fleckenstein whispers: Commandblock unconfigured
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+"default:mese 10" added to inventory.
+\e(c@#FFFF00)Fleckenstein has completed HimbeerserverDE's labyrinth\e(c@#ffffff)
+Fleckenstein whispers: Commandblock unconfigured
+Area position 1 set to (4592,4604,4588)
+Area position 2 set to (4621,4595,4625)
+\e(c@#FFFF00)HimbeerserverDE has completed HimbeerserverDE's maze\e(c@#ffffff)
+Area protected. ID: 95
+Area limit added. 
+Area limit added. 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Area limit added. 
+Area position 1 set to (4621,4595,4625)
+Area position 2 set to (4589,4562,4592)
+Area protected. ID: 96
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Area limit added. 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#FFFF00)HimbeerserverDE completed HimbeerserverDE's dropper\e(c@#ffffff)
+/colormsg is deprecated. Use /message instead
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Teleporting to HimbeerserverDE at (1506.0960693359,1524.2349853516,1494.6929931641)
+\e(c@#FFFF00)Fleckenstein completed HimbeerserverDE's dropper\e(c@#ffffff)
+/colormsg is deprecated. Use /message instead
+Teleporting to HimbeerserverDE at (1506.0570068359,1524.5,1496.8719482422)
+\e(c@#FFFF00)Fleckenstein completed HimbeerserverDE's dropper\e(c@#ffffff)
+Teleporting to HimbeerserverDE at (1506.1149902344,1524.5,1497.0189208984)
+Teleporting to HimbeerserverDE at (1506.0939941406,1524.5,1496.4090576172)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#FFFF00)HimbeerserverDE completed HimbeerserverDE's dropper\e(c@#ffffff)
+\e(c@#FFFF00)Fleckenstein completed HimbeerserverDE's dropper\e(c@#ffffff)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#FFFF55)HimbeerserverDE has entered the PvP area\e(c@#ffffff)
+-!- Invalid command: NEWHUB
+\e(c@#FF6737)You can not PVP here!\e(c@#ffffff)
+\e(c@#FF6737)You can not PVP here!\e(c@#ffffff)
+\e(c@#FF6737)You can not PVP here!\e(c@#ffffff)
+\e(c@#FF6737)You can not PVP here!\e(c@#ffffff)
+\e(c@#FF6737)You can not PVP here!\e(c@#ffffff)
+\e(c@#FF6737)You can not PVP here!\e(c@#ffffff)
+\e(c@#FF6737)You can not PVP here!\e(c@#ffffff)
+\e(c@#FF6737)You can not PVP here!\e(c@#ffffff)
+\e(c@#FFFF55)Fleckenstein has entered the PvP area\e(c@#ffffff)
+\e(c@#FF6737)You can not PVP here!\e(c@#ffffff)
+\e(c@#FF6737)You can not PVP here!\e(c@#ffffff)
+\e(c@#FF6737)You can not PVP here!\e(c@#ffffff)
+\e(c@#FF6737)You can not PVP here!\e(c@#ffffff)
+\e(c@#FF6737)You can not PVP here!\e(c@#ffffff)
+\e(c@#FF6737)You can not PVP here!\e(c@#ffffff)
+\e(c@#FF6737)You can not PVP here!\e(c@#ffffff)
+\e(c@#FF6737)You can not PVP here!\e(c@#ffffff)
+\e(c@#FF6737)You can not PVP here!\e(c@#ffffff)
+\e(c@#FF6737)You can not PVP here!\e(c@#ffffff)
+\e(c@#FF6737)You can not PVP here!\e(c@#ffffff)
+\e(c@#FF6737)You can not PVP here!\e(c@#ffffff)
+\e(c@#FF6737)You can not PVP here!\e(c@#ffffff)
+\e(c@#FF6737)You can not PVP here!\e(c@#ffffff)
+\e(c@#FF6737)You can not PVP here!\e(c@#ffffff)
+\e(c@#FF6737)You can not PVP here!\e(c@#ffffff)
+WorldEdit -!- position 1 set to (10103,10010,9956)
+WorldEdit -!- position 2 set to (10044,9996,10008)
+WorldEdit -!- invalid search node name: default:meseblock
+WorldEdit -!- WARNING: this operation could affect up to 47700 nodes; type //y to continue or //n to cancel
+WorldEdit -!- 86 nodes replaced
+WorldEdit -!- WARNING: this operation could affect up to 47700 nodes; type //y to continue or //n to cancel
+WorldEdit -!- 86 nodes replaced
+HimbeerserverDE is requesting that you teleport to them. /tpy to accept; /tpn to deny
+WorldEdit -!- region unmarked
+You are teleporting to HimbeerserverDE.
+Teleporting to HimbeerserverDE at (16697.072265625,29.690999984741,15932.634765625)
+Teleporting to HimbeerserverDE at (16723.314453125,26.413999557495,15961.311523438)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Server: version=5.2.0, uptime=77.31, max_lag=2.87704, clients={Fleckenstein, Llynnya}
+# Server: Welcome to Elidragon Skyblocks!
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)\e(c@#27EA30) Skyblocks\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub !\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island!\e(c@#ffffff)
+\e(c@#83FF00) NEWS! \e(c@#ffffff)\e(c@#FFFFFF)Server on Version 5.2 now!\e(c@#ffffff)
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> sir
+-!- Invalid command: sit
+\e(c@#FFFFFF)\e(c@#ffffff)igidrau has joined the Server.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Plane is owner!
+Plane is owner!
+Please click on the target you want to travel to.
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> "Ein wilder Admin erscheint"...
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> :-)
+Llynnya completed the quest "place_mossycobble" on level 3
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> argh... wolle...
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> wolle?
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> quest-reward?
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> oh
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> der teil von skyblocks ist nicht von mir
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> erst ab lvl 5
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> ne 4
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> ich hab das gefhl da war wer uninspiriert bei den belohnungen am anfang xDD
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> bloooooss nix sinnvolles... einfach bunte wolle xDD
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> was währe denn sinnvoll?
+\e(T@unified_inventory)Time of day set to 6am\eE
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> brennstoff z.b. xD kA pflanzensamen... zeugs... aber keine wolle xDDD nich in den mengen um genau zu sein
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> ok ich kann ja mal gucken ob ich das ändere
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> joahr...und wenns nur iwas nettes zu essen is oder so
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> oder andere lichtquellen oder so... muss ja nich bei jeder aufgabe was tolles nur so ab und an halt weil so 10 questen am stck nur wolle is iwi strange
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> ^_^
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#EE6E00)[BUILDER]\e(c@#ffffff)Falco has joined the Server.
+\e(c@#EE6E00)[BUILDER]\e(c@#ffffff)<Falco> Hi!
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> hi :)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Teleport request sent! It will timeout in 60 seconds
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> Huhu :)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Request timed-out.
+Falco is requesting to teleport to you. /tpy to accept
+Falco is teleporting to you.
+\e(c@#EE6E00)[BUILDER]\e(c@#ffffff)<Falco> sorry I was not paying attention.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> which texture do you want this block to have?
+\e(c@#EE6E00)[BUILDER]\e(c@#ffffff)<Falco> Let men think on it.
+\e(c@#EE6E00)[BUILDER]\e(c@#ffffff)<Falco> I rather like the void mirror. :)
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> ok
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#FFFF00)Falco has completed HimbeerserverDE's labyrinth\e(c@#ffffff)
+\e(c@#FFFFFF)\e(c@#ffffff)igidrau has left the Server.
+\e(c@#339933)<olliy\ f@ElidragonDiscord> !o/\e(c@#ffffff)
+\e(c@#EE6E00)[BUILDER]\e(c@#ffffff)<Falco> !
+\e(c@#FFFF00)Fleckenstein completed mitas' dropper\e(c@#ffffff)
+/colormsg is deprecated. Use /message instead
+\e(c@#FFFFFF)\e(c@#ffffff)q333 has joined the Server.
+\e(T@unified_inventory)Time of day set to 6am\eE
+Error
+Error
+Error
+Machine cannot be removed because it is not empty
+Machine cannot be removed because it is not empty
+Machine cannot be removed because it is not empty
+Machine cannot be removed because it is not empty
+Machine cannot be removed because it is not empty
+Machine cannot be removed because it is not empty
+Machine cannot be removed because it is not empty
+Machine cannot be removed because it is not empty
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)HimbeerserverDE has joined the Server.
+\e(c@#FFFFFF)\e(c@#ffffff)<q333> we need a Crystal shovel
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)HimbeerserverDE has left the Server.
+Teleporting to q333 at (1209.9989013672,10678.173828125,1100.3309326172)
+-!- Invalid command: pvp
+\e(c@#EE6E00)[BUILDER]\e(c@#ffffff)<Falco> q333 there is another way to solve the riddle of dirt with grass. :)
+\e(c@#FFFFFF)\e(c@#ffffff)<q333> ?
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> grass + dirt = dirt with grass
+\e(c@#FFFFFF)\e(c@#ffffff)<q333> I don't have near enough
+\e(c@#EE6E00)[BUILDER]\e(c@#ffffff)<Falco> Yes but obtaining the jungle grass in the quantity needed requires a trick.
+\e(c@#FFFFFF)\e(c@#ffffff)<q333> what trick
+\e(c@#EE6E00)[BUILDER]\e(c@#ffffff)<Falco> It will take me a bit to get there, one of my homes dissapeared.
+\e(c@#EE6E00)[BUILDER]\e(c@#ffffff)<Falco> The home from inventory is off.
+\e(c@#EE6E00)[BUILDER]\e(c@#ffffff)<Falco> Takes about 8 hours of camping to make enough jungle grass here.
+\e(c@#EE6E00)[BUILDER]\e(c@#ffffff)<Falco> it all ends up in the 4 chests above me
+\e(c@#EE6E00)[BUILDER]\e(c@#ffffff)<Falco> If you explore and then camp where I am located, it works best but using the bed to make it day speeds things up.
+\e(c@#EE6E00)[BUILDER]\e(c@#ffffff)<Falco> This is the middle of the field, a larger field would not be activated so this may be optimum.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)HimbeerserverDE has joined the Server.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<HimbeerserverDE> I feel like building a network of streets
+\e(c@#EE6E00)[BUILDER]\e(c@#ffffff)<Falco> coool I feel like going to bed now. :)
+\e(c@#EE6E00)[BUILDER]\e(c@#ffffff)<Falco> later
+\e(c@#EE6E00)[BUILDER]\e(c@#ffffff)Falco has left the Server.
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> xD
+\e(c@#FFFFFF)\e(c@#ffffff)<q333> I also can't figure out the secret quest
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<HimbeerserverDE> That's funny. In Germany it's 10am.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<HimbeerserverDE> Let's see what I can do about that.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<HimbeerserverDE> which level are you in?
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> more liek 11 am *peers towards her clocl*
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<HimbeerserverDE> level 7?
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> *clock
+\e(c@#FFFFFF)\e(c@#ffffff)<q333> 7
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> HimbeerserverDE: do /level Llynnya
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<HimbeerserverDE> I know
+\e(c@#FFFFFF)\e(c@#ffffff)bv has joined the Server.
+\e(c@#00D600)bv has joined the Server for the first Time! Welcome!\e(c@#ffffff)
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> btw Llynnya is german
+\e(c@#FFFFFF)\e(c@#ffffff)<bv> hi
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<HimbeerserverDE> hi
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> can't : missing privileges
+Llynnya completed the quest "place_bar" on level 3
+bv completed the quest "dig_dirt" on level 1
+bv completed the quest "place_dirt" on level 1
+\e(c@#339933)-!- Fleckenstein joined #elidragon-skyblocks\e(c@#ffffff)
+-!- mode/#elidragon-skyblocks [+qo Fleckenstein Fleckenstein] by ChanServ
+bv completed the quest "place_sapling" on level 1
+Current Players:
+ - Llynnya - level 3
+ - Fleckenstein - level 9
+ - q333 - level 7
+ - HimbeerserverDE - level 9
+ - bv - level 1
+\e(c@#339933)<Fleckenstein@IRC> !cmd who\e(c@#ffffff)
+Llynnya completed the quest "dig_stone_with_mese" on level 3
+bv completed the quest "dig_tree" on level 1
+bv completed the quest "place_furnace" on level 1
+\e(c@#FFFFFF)\e(c@#ffffff)<bv> i need 100 cobble ston
+\e(c@#FFFFFF)\e(c@#ffffff)<q333> make it
+\e(c@#FFFFFF)\e(c@#ffffff)<bv> how
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> craftguide
+Llynnya completed the quest "place_water_infinite" on level 3
+\e(c@#339933)<olliy@IRC> !cmd status\e(c@#ffffff)
+\e(c@#FFFFFF)\e(c@#ffffff)<bv> i need 100 cobble ston
+\e(c@#339933)<olliy@IRC> 3.4 maxlag with 5 players :/\e(c@#ffffff)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<HimbeerserverDE> Look at the tips board at the hub (/hub).
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#FFFFFF)\e(c@#ffffff)<q333> you want me to be temp craft guide?
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#FFFFFF)\e(c@#ffffff)<q333> jk
+\e(c@#FFFFFF)\e(c@#ffffff)<bv> bb
+WorldEdit -!- position 1 set to (5000,5001,1000)
+\e(c@#FFFFFF)\e(c@#ffffff)bv has left the Server.
+WorldEdit -!- region unmarked
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+WorldEdit -!- region reset
+\e(c@#FFFF00)Fleckenstein completed mitas' parcour\e(c@#ffffff)
+/colormsg is deprecated. Use /message instead
+\e(c@#339933)<olliy@IRC> Fleckenstein you might wanna change the bot prefix from ! to something else cause ChanServ uses ! \e(c@#ffffff)
+\e(c@#339933)<Fleckenstein@IRC> !help\e(c@#ffffff)
+\e(c@#339933)<olliy@IRC> and them mixed up is not a good match\e(c@#ffffff)
+\e(c@#339933)<Fleckenstein@IRC> oh\e(c@#ffffff)
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> .?
+\e(c@#339933)<olliy@IRC> i use ; on my server you can use anything you want \e(c@#ffffff)
+\e(c@#339933)<olliy@IRC> ? works \e(c@#ffffff)
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> i mean .
+\e(c@#339933)<olliy@IRC> tracker uses , and .\e(c@#ffffff)
+\e(c@#339933)<olliy@IRC> ? : ; [ ] { } $ % ^ & ( )\e(c@#ffffff)
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> can i use #
+\e(c@#339933)<olliy@IRC> thats the irc channel starter\e(c@#ffffff)
+\e(c@#339933)<olliy@IRC> like #elidragon-skyblocks\e(c@#ffffff)
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> i am so smart
+\e(c@#339933)<olliy@IRC> lol\e(c@#ffffff)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> i use $ now
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> like $_POST["username"]
+\e(c@#EE6E00)[BUILDER]\e(c@#ffffff)mitas has joined the Server.
+\e(c@#339933)<olliy@IRC> should be good\e(c@#ffffff)
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> php lol
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<HimbeerserverDE> PHP is a nice language
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> php is not a language
+Fleckenstein has been killed.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> HimbeerserverDE killed me
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<HimbeerserverDE> ?
+\e(c@#339933)<olliy@IRC> lol\e(c@#ffffff)
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<HimbeerserverDE> ???
+# Server: version=5.2.0, uptime=29.79, max_lag=4.71988, clients={Fleckenstein}
+# Server: Welcome to Elidragon Skyblocks!
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)\e(c@#27EA30) Skyblocks\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub !\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island!\e(c@#ffffff)
+\e(c@#83FF00) NEWS! \e(c@#ffffff)\e(c@#FFFFFF)Server on Version 5.2 now!\e(c@#ffffff)
+\e(c@#339933)<q333\ f@ElidragonDiscord> !players\e(c@#ffffff)
+\e(c@#339933)<olliy\ f@ElidragonDiscord> that dont work yet cause tracker is not around\e(c@#ffffff)
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)HimbeerserverDE has joined the Server.
+\e(c@#339933)<Fleckenstein@IRC> !who\e(c@#ffffff)
+\e(c@#339933)<Fleckenstein@IRC> !cmd who\e(c@#ffffff)
+\e(c@#339933)<Fleckenstein@IRC> $players\e(c@#ffffff)
+\e(c@#FFFFFF)\e(c@#ffffff)Llynnya has joined the Server.
+\e(c@#339933)<Fleckenstein@IRC> $cmd who\e(c@#ffffff)
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)olliy has joined the Server.
+Current Players:
+ - Fleckenstein - level 9
+ - HimbeerserverDE - level 9
+ - Llynnya - level 3
+ - olliy - level 7
+\e(c@#339933)<Fleckenstein@IRC> $cmd who\e(c@#ffffff)
+Current Players:
+ - Fleckenstein - level 9
+ - HimbeerserverDE - level 9
+ - Llynnya - level 3
+ - olliy - level 7
+\e(c@#339933)<Fleckenstein@IRC> $cmd who\e(c@#ffffff)
+Current Players:
+ - Fleckenstein - level 9
+ - HimbeerserverDE - level 9
+ - Llynnya - level 3
+ - olliy - level 7
+\e(c@#339933)<olliy@IRC> who is not a command registered i think \e(c@#ffffff)
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> #einwilderadminspammt xD
+\e(c@#339933)<olliy@IRC> just on skyblocks mod\e(c@#ffffff)
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> yes it is
+\e(c@#EE6E00)[BUILDER]\e(c@#ffffff)mitas has joined the Server.
+\e(c@#FFFFFF)\e(c@#ffffff)q333 has joined the Server.
+\e(c@#EE6E00)[BUILDER]\e(c@#ffffff)mitas has left the Server.
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> can someone give a idea what i could put near the shop?
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> nuclear reactor
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> O.o
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<HimbeerserverDE> and then let it melt down
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> i've eaten the wrong kind of mushroom...
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> idk if it was a mushroom at this point XD
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> might have eaten a nuclear reactor
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<HimbeerserverDE> lol
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> rofl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+* olliy is thinking
+\e(T@unified_inventory)Inventory cleared!\eE
+* olliy is thinking had
+* olliy is thinking HARD
+* olliy is thinking  TOO HARD
+* olliy exploded
+* olliy is a nuclear reactor
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> :/
+olliy: lol
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> XD
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> getting dms from my self
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#FFFFFF)\e(c@#ffffff)q333 has left the Server.
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> gonna make a wall of fame here
+\e(c@#FFFFFF)\e(c@#ffffff)igidrau has joined the Server.
+Teleporting to olliy at (26.073999404907,1000.5,5.5640001296997)
+\e(c@#FFFFFF)\e(c@#ffffff)q333 has joined the Server.
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> oh hello
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> i love your shop
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> :D
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> not fully done yet
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> gonna put off the stuff in the chests to shop too
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> caz why not :)
+\e(c@#FFFFFF)\e(c@#ffffff)q333 has left the Server.
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> these are my build ik if thsi was brothersome's this would be wayyyy cool looking
+Available commands: /1 /2 /about /allocate /brush /c /clearcut /clearobjects /clro /contract /copy /cube /cubeapply /cyl /cylinder /deleteblocks /do /dome /drain /expand /fixedpos /fixlight /fl /flip /fp /hcube /hcyl /hdo /help /hi /hide /highlight /hlt /hollowcube /hollowcylinder /hollowdome /hollowpyramid /hollowsphere /hpyr /hspr /i /inset /inspect /l /load /lt /lua /luatransform /m /mark /mix /mk /move /mtschemcreate /mtschemplace /mtschemprob /n /orient /ort /outset /p /param2 /pos1 /pos2 /pyr /pyramid /r /replace /replaceinverse /reset /restore /ri /rot /rotate /rsr /rst /s /save /sch /set /shift /sphere /spiral /spl /spr /stack /stack2 /stk /stretch /sup /suppress /tps /transpose /umk /unmark /v /volume /y add_owner add_tag admin area_info area_open area_pos area_pos1 area_pos2 at_empty_seats at_reroute at_sync_ndb auth_reload awards awd awpl ban change_owner clearinv clearobjects clearpassword colormsg colormsgone days deleteblocks emergeblocks exec execparam find_areas fixlight give giveme grant grantme haspriv help home hp hub inbox irc_connect irc_disconnect irc_msg irc_names irc_quote irc_reconnect island itm itm_cache_ndb join kick kill killme last-login legacy_load_areas level list_areas mail me message mods move_area msg newhub part powerctrl print_tags privs protect protector_remove protector_replace protector_show pulverize rank recursive_remove_areas regen_signs remove_area remove_player remove_tag rename_area revoke rollback rollback_check say select_area set set_owner set_skyblock_spawn sethome setpassword shop shutdown skinsdb skinsdb_download_skins spawn spawnentity status teleport tell time tpc tpe tphr tpj tpn tpr tpy unban vanish who wielded
+Use '/help <cmd>' to get more information, or '/help all' to list everything.
+\e(c@#FFFFFF)\e(c@#ffffff)q333 has joined the Server.
+You need to select an area first.
+Available commands: /1 /2 /about /allocate /brush /c /clearcut /clearobjects /clro /contract /copy /cube /cubeapply /cyl /cylinder /deleteblocks /do /dome /drain /expand /fixedpos /fixlight /fl /flip /fp /hcube /hcyl /hdo /help /hi /hide /highlight /hlt /hollowcube /hollowcylinder /hollowdome /hollowpyramid /hollowsphere /hpyr /hspr /i /inset /inspect /l /load /lt /lua /luatransform /m /mark /mix /mk /move /mtschemcreate /mtschemplace /mtschemprob /n /orient /ort /outset /p /param2 /pos1 /pos2 /pyr /pyramid /r /replace /replaceinverse /reset /restore /ri /rot /rotate /rsr /rst /s /save /sch /set /shift /sphere /spiral /spl /spr /stack /stack2 /stk /stretch /sup /suppress /tps /transpose /umk /unmark /v /volume /y add_owner add_tag admin area_info area_open area_pos area_pos1 area_pos2 at_empty_seats at_reroute at_sync_ndb auth_reload awards awd awpl ban change_owner clearinv clearobjects clearpassword colormsg colormsgone days deleteblocks emergeblocks exec execparam find_areas fixlight give giveme grant grantme haspriv help home hp hub inbox irc_connect irc_disconnect irc_msg irc_names irc_quote irc_reconnect island itm itm_cache_ndb join kick kill killme last-login legacy_load_areas level list_areas mail me message mods move_area msg newhub part powerctrl print_tags privs protect protector_remove protector_replace protector_show pulverize rank recursive_remove_areas regen_signs remove_area remove_player remove_tag rename_area revoke rollback rollback_check say select_area set set_owner set_skyblock_spawn sethome setpassword shop shutdown skinsdb skinsdb_download_skins spawn spawnentity status teleport tell time tpc tpe tphr tpj tpn tpr tpy unban vanish who wielded
+Use '/help <cmd>' to get more information, or '/help all' to list everything.
+Area 90 selected.
+You have been granted control over area #98. Type /list_areas to show your areas.
+Area protected. ID: 98
+Area renamed.
+Area limit added. 
+Area limit added. 
+Area limit added. 
+shop | movement | 
+shop | no_pvp | 
+shop | no_damage | 
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> umm
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> are you stuck?
+\e(c@#FFFFFF)\e(c@#ffffff)<q333> hi
+\e(c@#FF6737)You can not PVP here!\e(c@#ffffff)
+\e(c@#FF6737)You can not PVP here!\e(c@#ffffff)
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> hello XD
+\e(c@#FF6737)You can not PVP here!\e(c@#ffffff)
+Privileges of q333: interact, shout
+\e(c@#FFFFFF)\e(c@#ffffff)<q333> naw I was waiting for it to load
+Area limit added. 
+Teleporting to HimbeerserverDE at (16110.846679688,8.456000328064,15971.497070313)
+\e(c@#FFFFFF)\e(c@#ffffff)q333 has left the Server.
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> Fleckenstein: can you put a commandblock here which teleports them to their island?
+Teleporting to HimbeerserverDE at (16127.759765625,4.6519999504089,15974.252929688)
+\e(c@#FFFFFF)\e(c@#ffffff)q333 has joined the Server.
+\e(c@#FFFFFF)\e(c@#ffffff)q333 has left the Server.
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> nvm got it
+\e(c@#FFFFFF)\e(c@#ffffff)q333 has joined the Server.
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> *waves*
+\e(c@#FFFFFF)\e(c@#ffffff)<igidrau> hi
+\e(c@#FFFFFF)\e(c@#ffffff)<igidrau> You seem to be doing great
+\e(c@#FFFFFF)\e(c@#ffffff)q333 has left the Server.
+\e(c@#EE6E00)[BUILDER]\e(c@#ffffff)mitas has joined the Server.
+\e(c@#EE6E00)[BUILDER]\e(c@#ffffff)mitas has left the Server.
+\e(c@#FFFFFF)\e(c@#ffffff)q333 has joined the Server.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Server: version=5.0.1, uptime=259572, max_lag=0.520253, clients={GalwayGirl, skibisky, bernie, gonsiewski, durante, hemken, kapiloff, gabouer, skeens, lalan, doepke, arianiu, protasewich, leclear, murrow, kathryn, freerksen, menger, mleczko, branco, kopicko, cullifer, HatsuneMiku, bollinger, huhman, ADIKA, whitmarsh, hursey, bhamaraniyama, reagle, tuberman, engberson, giboney}
+# Server: Welcome to SkyWars
+*** GalwayGirl joined the game.
+*** deporter joined the game.
+*** ellerby joined the game.
+*** rishty joined the game.
+*** rishty left the game.
+*** quarktasche joined the game.
+*** erik1 joined the game.
+*** konstantin joined the game.
+<tuberman> tuberman
+*** barone joined the game.
+*** skibisky left the game.
+*** declark joined the game.
+*** durante left the game. (timed out)
+*** ellerby left the game.
+*** trudillo joined the game.
+*** mleczko left the game. (timed out)
+*** boutros joined the game.
+*** nachmias joined the game.
+*** carmita joined the game.
+*** HatsuneMiku left the game. (timed out)
+*** manaugh joined the game.
+=> GalwayGirl has joined the server
+\e(c@#8800AA)PM from lurk@IRC: Welcome to the server, GalwayGirl! | Have a nice day!\e(c@#ffffff)
+<janaeslaa> died
+<jenya> у кого есть 5 угля
+<janaeslaa> hi nickio
+<shadowthecat> meow
+<annerd> take and give back
+<nickio> i
+<= MuddyMonkey left the server
+=> ____________ has joined the server
+<jenya> С КЕМ МОЖНО ДРУУУУЖИИИИИТЬ
+<Lavender_Lover> thalheimer hi
+\e(c@#339933)-!- minhthien_vn1 joined #catlandia\e(c@#ffffff)
+<annerd> can i have bones
+\e(c@#339933)<minhthien_vn1@IRC> ,players\e(c@#ffffff)
+\e(c@#339933)<trackr_@IRC> Players on cat: 1122334455667788090, 1122334455669900, 650, ACX, C01T, GalwayGirl, Itona, LEON, Lavender_Lover, Pemodragon, Thalheimer589, TheKindGuy, VanhelsingX3, ____________, _hoanglong_, al__, annerd, catwhisperer777, edered, gacha_lover, ghehrteyuw, hgujhi, imp, janaeslaa, jenya, karinomg, nickio, purpledragon, rdfyghhfgb, shadowthecat, suddenHamstA, tiurich, unicorn987, vikaviktoria, yhyh\e(c@#ffffff)
+\e(c@#339933)<trackr_@IRC> Total: 35 players across 1 active server (and 0 inactive servers).\e(c@#ffffff)
+<= _hoanglong_ left the server
+<janaeslaa> you want it back?
+<Lavender_Lover> yeah
+\e(c@#339933)<minhthien_vn1@IRC> Hi\e(c@#ffffff)
+<annerd> thx
+=> Ceres has joined the server
+<Lavender_Lover> your welcome
+<gacha_lover> yeah thats not a problem tho
+=> suwderdene has joined the server
+<gacha_lover> yeah im crazy
+<annerd> i have fire and ice 
+<gacha_lover> nvm 
+\e(c@#339933)-!- minhthien_vn1 has quit [Quit: edgy1.net IRC: https://edgy1.net/irc]\e(c@#ffffff)
+=> _hoanglong_ has joined the server
+<= suwderdene left the server (timed out)
+\e(c@#339933)<vivv\ f@catlandia-relay> Hey guys\e(c@#ffffff)
+<Lavender_Lover> annerd
+=> Cavezon379 has joined the server
+<annerd> ys
+<annerd> yes*
+<= ACX left the server
+<shadowthecat> unicorn987?
+=> Veronika-100 has joined the server
+<Lavender_Lover> did someone killed u
+\e(c@#339933)-!- minhthien_vn1 joined #catlandia\e(c@#ffffff)
+<annerd> no i had 1  hp
+<= vikaviktoria left the server (timed out)
+<_hoanglong_> hi
+=> kltl has joined the server
+\e(c@#339933)<minhthien_vn1@IRC> ,players\e(c@#ffffff)
+\e(c@#339933)<trackr_@IRC> Players on cat: 1122334455667788090, 1122334455669900, 650, C01T, Cavezon379, Ceres, GalwayGirl, Itona, LEON, Lavender_Lover, Pemodragon, Thalheimer589, TheKindGuy, VanhelsingX3, Veronika-100, ____________, _hoanglong_, al__, annerd, catwhisperer777, edered, gacha_lover, ghehrteyuw, hgujhi, imp, janaeslaa, jenya, karinomg, kltl, nickio, purpledragon, rdfyghhfgb, shadowthecat, suddenHamstA, tiurich, unicorn987, yhyh\e(c@#ffffff)
+\e(c@#339933)<trackr_@IRC> Total: 37 players across 1 active server (and 0 inactive servers).\e(c@#ffffff)
+=> yepik has joined the server
+\e(c@#339933)<minhthien_vn1@IRC> Hi \e(c@#ffffff)
+<unicorn987> shadow accept
+<shadowthecat> hi
+<unicorn987> come 
+<annerd> Lavender_Lover:  LEONwant tp kill me 
+<Lavender_Lover> opps
+<annerd> to*
+<unicorn987> down here
+<= Thalheimer589 left the server (timed out)
+=> a has joined the server
+<unicorn987> come to the mixed mine 
+<unicorn987> find clow stone 
+=> Peanaut has joined the server
+<gacha_lover> yeah
+<imp> oh back to chat...
+<= Veronika-100 left the server (timed out)
+<Peanaut> hu
+<imp> ok
+<= _hoanglong_ left the server (timed out)
+\e(c@#339933)-!- minhthien_vn1 has quit [Quit: edgy1.net IRC: https://edgy1.net/irc]\e(c@#ffffff)
+<Peanaut> hi*
+<yepik> прив
+<= kltl left the server (timed out)
+<annerd> hi Peanaut
+<shadowthecat> I need sticks
+<Peanaut> afk
+=> _hoanglong_ has joined the server
+<imp> when people say don't bring anyone because of grief i be like "how" and try to grief
+=> Veronika-100 has joined the server
+<imp> i just don't believe that
+<gacha_lover> Water lava etc imp like jame did that to u okay
+<imp> and that's when i grief
+<imp> lol
+<annerd> come
+<yepik> прив
+=> Ncowl0 has joined the server
+<gacha_lover> and thats when i quit
+<LEON> прив
+<imp> i never grief except in that situation
+<= Cavezon379 left the server
+This area is owned by dejes_pro!
+This area is owned by dejes_pro!
+<jenya> Ярик привет (если ты не ЭПИК)000000)
+This area is owned by dejes_pro!
+This area is owned by dejes_pro!
+<gacha_lover> yeah then ill quit
+This area is owned by dejes_pro!
+This area is owned by dejes_pro!
+=> charlottew has joined the server
+<Itona> ???
+<imp> i be like how could this base be griefed then i grief
+<yepik> да прив
+<nickio> hi itoona
+<Itona> hi nick
+<imp> it's all protected?
+<jenya> оу ясно
+<gacha_lover> nvm
+\e(c@#339933)-!- minhthien_vn1 joined #catlandia\e(c@#ffffff)
+<nickio> i lost my f**king armor to gamel99
+<Itona> imp be more cautious
+\e(c@#339933)<minhthien_vn1@IRC> ,players\e(c@#ffffff)
+\e(c@#339933)<trackr_@IRC> Players on cat: 1122334455667788090, 1122334455669900, 650, C01T, Ceres, GalwayGirl, Itona, LEON, Lavender_Lover, Ncowl0, Peanaut, Pemodragon, TheKindGuy, VanhelsingX3, Veronika-100, ____________, _hoanglong_, a, al__, annerd, catwhisperer777, charlottew, edered, gacha_lover, ghehrteyuw, hgujhi, imp, janaeslaa, jenya, karinomg, nickio, purpledragon, rdfyghhfgb, shadowthecat, suddenHamstA, tiurich, unicorn987, yepik, yhyh\e(c@#ffffff)
+\e(c@#339933)<trackr_@IRC> Total: 39 players across 1 active server (and 0 inactive servers).\e(c@#ffffff)
+<_hoanglong_> hi thien
+=> sabina02 has joined the server
+\e(c@#339933)<minhthien_vn1@IRC> ,players\e(c@#ffffff)
+\e(c@#339933)<trackr_@IRC> minhthien_vn1: You can only run .players once every 15 seconds.\e(c@#ffffff)
+\e(c@#339933)<minhthien_vn1@IRC> ,players\e(c@#ffffff)
+\e(c@#339933)<trackr_@IRC> minhthien_vn1: You can only run .players once every 15 seconds.\e(c@#ffffff)
+<= 650 left the server (timed out)
+<_hoanglong_> ?
+<jenya> ВЕРОНИИИИКААА
+<Veronika-100> чо
+<= edered left the server (timed out)
+<annerd> come
+<shadowthecat> I FOUND 3 DIAMONDS
+<jenya> О ТИ ТУТЬ
+\e(c@#339933)<minhthien_vn1@IRC> Nónggggggggggggggggggggggg\e(c@#ffffff)
+\e(c@#339933)<minhthien_vn1@IRC> Awwwwwwwwwwwwwwwwwwwwwwww\e(c@#ffffff)
+=> Serena_08 has joined the server
+=> Cavezon379 has joined the server
+<_hoanglong_> ?
+<annerd> tp to me
+<imp> sneak glitch on travelnet
+\e(c@#339933)<minhthien_vn1@IRC> Nónggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg\e(c@#ffffff)
+<= Ncowl0 left the server (timed out)
+<nickio> itona 
+<_hoanglong_> o mien nam nong lam ha
+<janaeslaa> hi
+\e(c@#339933)<minhthien_vn1@IRC> Uk\e(c@#ffffff)
+<Serena_08> hello
+<Itona> yes nick?
+<yepik> what
+<Itona> what happened to your armor?
+<Peanaut> what?
+\e(c@#339933)<minhthien_vn1@IRC> 32'C\e(c@#ffffff)
+\e(c@#339933)<minhthien_vn1@IRC> ×_×\e(c@#ffffff)
+<Serena_08> hi
+<Peanaut> hi
+<nickio> i had beef with gamel99(girl99 to)
+\e(c@#339933)<minhthien_vn1@IRC> Có lúc lên luôn 38'C\e(c@#ffffff)
+<Itona> beef?
+\e(c@#339933)<minhthien_vn1@IRC> ×_×\e(c@#ffffff)
+<nickio> because he killed me with all my cyrstal stuff
+This area is owned by NahuelGamerNV!
+This area is owned by NahuelGamerNV!
+<= Lavender_Lover left the server (timed out)
+<= hgujhi left the server (timed out)
+<karinomg> hi
+<Itona> you were killed by who?
+<= Cavezon379 left the server
+<nickio> by gamel99
+=> hgujhi has joined the server
+<unicorn987> shadow the cat can you go and get a lot of wood
+=> Lavender_Lover has joined the server
+<Itona> hm...
+<= sabina02 left the server (timed out)
+<Itona> nick 
+<jenya> пр
+<nickio> yas
+<hgujhi> come
+<LEON> прив
+=> _Andrea_ has joined the server
+<Itona> I suggest you make extra armor set
+<Itona> a spare
+<= Veronika-100 left the server (timed out)
+<Serena_08> hola Andrea
+<shadowthecat> I have 8 diamonds!
+<= ____________ left the server
+<Itona> and a spare when you lost the spare
+<unicorn987> get some things to build with
+=> LPJoschi has joined the server
+<nickio> i have 48 mese crystals but 0 crystal spikes
+<shadowthecat> I have 9 diamonds!
+\e(c@#339933)<minhthien_vn1@IRC> Nónggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggtgggvggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg\e(c@#ffffff)
+\e(c@#339933)<minhthien_vn1@IRC> gggg\e(c@#ffffff)
+<_hoanglong_> what?
+<Itona> hm...
+\e(c@#339933)<minhthien_vn1@IRC> AAAAAAAAAAAAASSSAAASSAAAAAAA\e(c@#ffffff)
+<Itona> why don't you farm more crystals
+<nickio> once i HAD two stacks of diamonds
+<imp> realized set Q as throwing is risky
+\e(c@#339933)<minhthien_vn1@IRC>  S.O.S\e(c@#ffffff)
+<nickio> i have crystal farm
+<nickio> tp to me
+=> unna has joined the server
+<nickio> but it takes long
+<_hoanglong_> co the ma cung keu
+This area is owned by NahuelGamerNV!
+This area is owned by NahuelGamerNV!
+This area is owned by NahuelGamerNV!
+\e(c@#339933)<minhthien_vn1@IRC> Wa nóng đấy\e(c@#ffffff)
+=> sabina02 has joined the server
+<Itona> you have to expand
+<jenya> яр
+=> holdik has joined the server
+This area is owned by NahuelGamerNV!
+This area is owned by NahuelGamerNV!
+<annerd> Peanaut: come look this
+This area is owned by NahuelGamerNV!
+This area is owned by NahuelGamerNV!
+<imp> and suicide like me
+This area is owned by NahuelGamerNV!
+This area is owned by NahuelGamerNV!
+This area is owned by NahuelGamerNV!
+\e(c@#339933)-!- minhthien_vn1 has quit [Quit: edgy1.net IRC: https://edgy1.net/irc]\e(c@#ffffff)
+This area is owned by NahuelGamerNV!
+<Itona> so that you will have high chance of production
+<nickio> ok
+<nickio> ill wait
+<= holdik left the server (timed out)
+<imp> *and suicide like me
+<karinomg> w
+<nickio> will crystal grow? here
+<gacha_lover> ugh
+<Itona> or use fertilizers?
+<Peanaut> wah?
+<gacha_lover> ur welcome
+<Itona> to speed up the process
+This area is owned by NahuelGamerNV!
+<nickio> i ask cuz its one block over water
+This area is owned by NahuelGamerNV!
+This area is owned by NahuelGamerNV!
+This area is owned by NahuelGamerNV!
+This area is owned by NahuelGamerNV!
+This area is owned by NahuelGamerNV!
+This area is owned by NahuelGamerNV!
+<= suddenHamstA left the server
+This area is owned by NahuelGamerNV!
+This area is owned by NahuelGamerNV!
+<imp> hey it's not that small
+This area is owned by NahuelGamerNV!
+This area is owned by NahuelGamerNV!
+This area is owned by NahuelGamerNV!
+This area is owned by NahuelGamerNV!
+This area is owned by NahuelGamerNV!
+<Itona> yeah
+<imp> cmon nick suicide (wtf
+<janaeslaa> hi
+=> holdik has joined the server
+This area is owned by NahuelGamerNV!
+This area is owned by NahuelGamerNV!
+This area is owned by NahuelGamerNV!
+<nickio> it took me 1 and a half days
+<gacha_lover> wow nice 
+<imp> so that you'll get bonemeal
+<nickio> ahh ok
+<Itona> but you see it took long time to grow onw
+<Itona> one*
+=> nga has joined the server
+<imp> coes it need light?
+<nickio> thank you!!
+<nga> hi'
+<_hoanglong_> hi
+<nga> hi anh long
+This area is owned by NahuelGamerNV!
+This area is owned by NahuelGamerNV!
+This area is owned by NahuelGamerNV!
+This area is owned by NahuelGamerNV!
+<nga> anh long oi
+<= Serena_08 left the server
+<Itona> imp: I'm not sure
+<nga> anh long
+<Peanaut> what happend if i hump down?
+<_hoanglong_> ?
+This area is owned by blenape!
+This area is owned by blenape!
+This area is owned by blenape!
+This area is owned by blenape!
+<imp> weeeee
+<= _Andrea_ left the server (timed out)
+This area is owned by blenape!
+This area is owned by blenape!
+This area is owned by blenape!
+<nga> anh long giup em mot viec duoc ko :)
+<= unna left the server
+<= janaeslaa left the server (timed out)
+<Itona> i haven't tried farming crystals underground
+<_hoanglong_> ok
+=> minhthien_vn1 has joined the server
+<hgujhi> come
+<nga> thankkkkkkkkkkkkkkkkkk anh long
+<= sabina02 left the server
+=> Kenpsant has joined the server
+<imp> lol i can fly higher than your hotel top nick
+<nickio> ok
+<gacha_lover> hi Kenpsant
+<nga> anh long day em cach dung lenh dich chuyen
+<nickio> than i have to build higher! :)
+<minhthien_vn1> hi em
+<Itona> hi Kenp :)w
+<nga> nham
+<= a left the server
+<Kenpsant> hi :)
+<hgujhi> come come come
+<nga> lenh bao ve
+<imp> i knew you gonna say that
+<gacha_lover> ;(
+<= yepik left the server
+<Kenpsant> xD
+<Itona> why are you sad gacha? XD
+<minhthien_vn1> hoc dc chua
+<nickio> does anyone have some coral skelleton?
+<nga> anh long day em cach dung lenh bao ve
+<Kenpsant> Itona: XD
+<nga> chua
+<imp> did you just XD
+<gacha_lover> IDK
+<minhthien_vn1> anh dang chou ben minetest
+<Kenpsant> Itona: she could have felt in love with someone xD
+<nickio> no thanks
+<_hoanglong_> co nen day ko?
+<nga> oh
+<minhthien_vn1> ummm
+<= al__ left the server
+<annerd> help me
+<Peanaut> gacha_lover: u are on the glass thing?
+<_hoanglong_> thiren
+<Itona> Kenpsant: hmm.. XD
+<gacha_lover> WhO ThO
+<nickio> i have enough bones
+<_hoanglong_> co nen day ko?
+<Kenpsant> Itona: XD
+<Peanaut> gacha_lover: u are on the glass thing?
+<nga> em su anh huy rui
+<minhthien_vn1> uk
+<gacha_lover> no Peanaut 
+<minhthien_vn1> co nen ko
+<Peanaut> :(
+<jenya> ярииииииик
+<nga> nen
+<_hoanglong_> ko biet
+<_hoanglong_> vi day
+<gacha_lover> why u sad
+<Peanaut> i want there
+<_hoanglong_> la thong tin tuyet mat
+<imp> why your crystal spike don't bypass my armor?
+<minhthien_vn1> uk
+<Itona> will the server be opened?
+<gacha_lover> uhh Why
+<_hoanglong_> hay le em tu tiem hiue di
+<imp> i mean damage me
+<nga> vay gui mail di
+<_hoanglong_> tu tim hieu
+<Peanaut> i want theree
+<= holdik left the server (timed out)
+<minhthien_vn1> ehehhehe
+<_hoanglong_> mail
+<nga> tim hieu tren google ha
+<_hoanglong_> uk
+<minhthien_vn1> google ko có dau
+<gacha_lover> i wanna make a server lol even tho idk anything about it
+<nga> ko co dau
+<Peanaut> gacha_lover: u can get me there? 
+<nga> em tra rui
+<gacha_lover> Peanaut where
+<= tiurich left the server (timed out)
+<Itona> make a world 
+<Peanaut> on the glass thing
+Cleared GalwayGirl's inventory.
+=> al__ has joined the server
+<Itona> and  make it public gacha
+<jenya> ВЕРОННИКА
+<gacha_lover> Glass Dome
+=> sabina02 has joined the server
+Cleared GalwayGirl's inventory.
+=> pokpong1998 has joined the server
+<Peanaut> ye
+<minhthien_vn1> troi
+<gacha_lover> go there than
+<Kenpsant> Itona: do you have blueberry saplings?
+<imp> uhhhh
+<imp> ...
+<_hoanglong_> thien
+<minhthien_vn1> bay nhu thanh
+Cleared GalwayGirl's inventory.
+<= charlottew left the server (timed out)
+<Itona> sapling?
+<minhthien_vn1> ?
+<Kenpsant> Itona: yes
+<imp> if u are sad get over here lol
+<Kenpsant> sapling
+<_hoanglong_> anh bao nga ghi
+<karinomg> can i have a doller
+<gacha_lover> blueberry bush??
+<Itona> what do you mean? the bush thing?
+<annerd> help me
+<annerd> help me
+<annerd> help me
+<Kenpsant> Itona: lol blueberry saplings
+<Peanaut> how i can get on the glass thing?
+<imp> lol
+<gacha_lover> uh 
+<_hoanglong_> vao mail ay
+<Kenpsant> Itona: it's like pine apple saplings
+<= sabina02 left the server (timed out)
+<imp> nick?
+<gacha_lover> Peanaut come
+<imp> lol
+* Itona is confused
+<nga> em ghi roi sau do lam gi
+<Kenpsant> xD okay
+<Kenpsant> it's okay xD
+<_hoanglong_> tu tim
+<Peanaut> oh hehe
+<Kenpsant> :)
+<nga> =_=
+<_hoanglong_> thien
+<Itona> I don't have one 
+<= pokpong1998 left the server
+<= ghehrteyuw left the server (timed out)
+<imp> really zero sadness here
+<gacha_lover> uhh
+<minhthien_vn1> ?
+<Itona> I don't farm too much
+<_hoanglong_> lam sao de ghi PM vay?
+<Kenpsant> Itona: i see xD
+<minhthien_vn1> tu tim hieu
+<Lavender_Lover> annerd r u ok
+=> 650 has joined the server
+<Itona> so Idk what is that XD
+<= nga left the server
+<_hoanglong_> ok
+<_hoanglong_> ken
+<Peanaut> xD
+<imp> nick died becuz of his rich boi pool
+<annerd> help
+<gacha_lover> lol
+<Lavender_Lover> ok 
+<= yhyh left the server (timed out)
+<Peanaut> hello
+=> pokpong1998 has joined the server
+=> nga has joined the server
+* _hoanglong_ goi ken
+<gacha_lover> i have blueberry bush saplings tho
+<imp> lololol he fell
+<Lavender_Lover> lets swim
+<Peanaut> u can swim there with crystal armor?
+<Itona> who?
+<annerd> but you can in lava i can't and Peanaut too
+<Lavender_Lover> in lava
+<jenya> кто РУССКИЙ
+<Peanaut> i go get my
+<unicorn987> shadowthe cat im done 
+<= unicorn987 left the server
+<imp> bye
+<shadowthecat> ok
+<Itona> bye
+<gacha_lover> bye
+<= imp left the server
+<Lavender_Lover> no
+<= LPJoschi left the server
+<gacha_lover> Peanaut not now
+<Itona> ?
+<TheKindGuy> hello 
+<Kenpsant> ?
+<Peanaut> why?
+<Lavender_Lover> i can swim because i wear full armor
+<Lavender_Lover> no
+<gacha_lover> cuz secret
+<TheKindGuy> hi people
+# Server: version=5.2.0-GalwayGirl, uptime=0.201, max_lag=0.135891, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+Privileges of GalwayGirl: privs basic_privs home fly protection_bypass server debug teleport shout settime bring interact password ban rollback fast creative noclip kick give
+# Server: version=5.2.0-GalwayGirl, uptime=0.202, max_lag=0.13789, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.21, max_lag=0.145883, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.21, max_lag=0.145883, clients={GalwayGirl}
+-!- Invalid command: psuh
+# Server: version=5.2.0-GalwayGirl, uptime=0.21, max_lag=0.145883, clients={GalwayGirl}
+# Server: version=5.2.0-GalwayGirl, uptime=0.209, max_lag=0.144884, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.209, max_lag=0.144884, clients={GalwayGirl}
+# Server: version=5.2.0-GalwayGirl, uptime=0.217, max_lag=0.151878, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.222, max_lag=0.157874, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.205, max_lag=0.140887, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.205, max_lag=0.140887, clients={GalwayGirl}
+# Server: version=5.2.0-GalwayGirl, uptime=0.218, max_lag=0.153877, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+-!- Invalid command: push+
+# Server: version=5.2.0-GalwayGirl, uptime=0.218, max_lag=0.153877, clients={GalwayGirl}
+# Server: version=5.2.0-GalwayGirl, uptime=0.608, max_lag=0.429312, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.39, max_lag=0.213658, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.39, max_lag=0.213658, clients={GalwayGirl}
+<GalwayGirl> t
+DM from GalwayGirl: t
+Message sent.
+# Server: version=5.2.0-GalwayGirl, uptime=0.22, max_lag=0.155875, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.211, max_lag=0.146882, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+-!- Invalid command: psuh
+# Server: version=5.2.0-GalwayGirl, uptime=0.218, max_lag=0.152878, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.2, max_lag=0.135891, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+-!- Invalid command: psuh
+# Server: version=5.2.0-GalwayGirl, uptime=0.2, max_lag=0.135891, clients={GalwayGirl}
+# Server: version=5.2.0-GalwayGirl, uptime=0.202, max_lag=0.13789, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.206, max_lag=0.141886, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.211, max_lag=0.146882, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.211, max_lag=0.146882, clients={GalwayGirl}
+# Server: version=5.2.0-GalwayGirl, uptime=0.223, max_lag=0.157874, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+Privileges of GalwayGirl: privs basic_privs home fly protection_bypass server debug teleport shout settime bring interact password ban rollback fast creative noclip kick give
+Privileges of GalwayGirl: privs basic_privs home fly protection_bypass server debug teleport shout settime bring interact password ban rollback fast creative noclip kick give
+Privileges of GalwayGirl: privs basic_privs home fly protection_bypass server debug teleport shout settime bring interact password ban rollback fast creative noclip kick give
+Privileges of GalwayGirl: privs basic_privs home fly protection_bypass server debug teleport shout settime bring interact password ban rollback fast creative noclip kick give
+Privileges of GalwayGirl: privs basic_privs home fly protection_bypass server debug teleport shout settime bring interact password ban rollback fast creative noclip kick give
+Privileges of GalwayGirl: privs basic_privs home fly protection_bypass server debug teleport shout settime bring interact password ban rollback fast creative noclip kick give
+Privileges of GalwayGirl: privs basic_privs home fly protection_bypass server debug teleport shout settime bring interact password ban rollback fast creative noclip kick give
+Privileges of GalwayGirl: privs basic_privs home fly protection_bypass server debug teleport shout settime bring interact password ban rollback fast creative noclip kick give
+# Server: version=5.2.0-GalwayGirl, uptime=0.208, max_lag=0.143885, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+lol
+nil
+# Server: version=5.2.0-GalwayGirl, uptime=0.204, max_lag=0.139888, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.204, max_lag=0.138889, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+lol
+lol
+old
+lol
+-!- Invalid command: cmd
+-!- Invalid command: cmdp
+-!- Invalid command: cmdp
+true
+-!- Invalid command: hp
+Invalid parameters (see /help haspriv)
+Unknown privilege!
+Unknown privilege!
+Unknown privilege!
+Players online with the "server" privilege: GalwayGirl
+Unknown privilege!
+# Server: version=5.2.0-GalwayGirl, uptime=0.226, max_lag=0.159872, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+#Server:version=5.2.0-GalwayGirl,uptime=0.226,max_lag=0.159872,clients={GalwayGirl}
+#Server:version=5.2.0-GalwayGirl,uptime=0.226,max_lag=0.159872,clients={GalwayGirl}
+nil
+nil
+nil
+<GalwayGirl> preview
+# Server: version=5.2.0-GalwayGirl, uptime=0.331, max_lag=0.153754, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+#Server:version=5.2.0-GalwayGirl,uptime=0.331,max_lag=0.153754,clients={GalwayGirl}
+#Server:version=5.2.0-GalwayGirl,uptime=0.331,max_lag=0.153754,clients={GalwayGirl}
+#Server:version=5.2.0-GalwayGirl,uptime=0.331,max_lag=0.153754,clients={GalwayGirl}
+nil
+lol
+lol
+# Server: version=5.2.0-GalwayGirl, uptime=0.208, max_lag=0.143885, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+#Server:version=5.2.0-GalwayGirl,uptime=0.208,max_lag=0.143885,clients={GalwayGirl}
+# Server: version=5.2.0-GalwayGirl, uptime=0.212, max_lag=0.146882, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.325, max_lag=0.148762, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.211, max_lag=0.146882, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.203, max_lag=0.138889, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.207, max_lag=0.141886, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.222, max_lag=0.157874, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.209, max_lag=0.143885, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+The player @name is not online.
+# Server: version=5.2.0-GalwayGirl, uptime=0.213, max_lag=0.148881, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+-!- Invalid command: metests
+# Server: version=5.2.0-GalwayGirl, uptime=0.209, max_lag=0.144884, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.22, max_lag=0.155875, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+* GalwayGirl tests
+# Server: version=5.2.0-GalwayGirl, uptime=0.294, max_lag=0.229816, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+GalwayGirl whispers: you're cool
+-!- Empty command
+GalwayGirl whispers: you're cool
+-!- Empty command
+GalwayGirl whispers: you're cool
+-!- Empty command
+-!- Empty command
+GalwayGirl whispers: you're cool
+-!- Empty command
+GalwayGirl whispers: you're cool
+-!- Empty command
+GalwayGirl whispers: you're cool
+-!- Empty command
+# Server: version=5.2.0-GalwayGirl, uptime=0.348, max_lag=0.251748, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+GalwayGirl whispers: you're cool
+-!- Empty command
+GalwayGirl whispers: you're cool
+Invalid parameters ("GalwayGirl nil") or player not found (see /help teleport)
+GalwayGirl whispers: you're cool
+Invalid parameters ("GalwayGirl GalwayGirl ") or player not found (see /help teleport)
+GalwayGirl whispers: you're cool
+Invalid parameters ("GalwayGirl GalwayGirl ") or player not found (see /help teleport)
+GalwayGirl whispers: you're cool
+Invalid parameters ("GalwayGirl GalwayGirl ") or player not found (see /help teleport)
+GalwayGirl whispers: you're cool
+Teleporting GalwayGirl to GalwayGirl at (-51.083995819092,36.5,291.01800537109)
+GalwayGirl whispers: you're cool
+Teleporting GalwayGirl to GalwayGirl at (-50.083000183105,35.5,291.01800537109)
+GalwayGirl whispers: you're cool
+Teleporting GalwayGirl to GalwayGirl at (-50.446998596191,36.5,291.53598022461)
+GalwayGirl whispers: you're cool
+Teleporting GalwayGirl to GalwayGirl at (-50.829998016357,36.5,291.20401000977)
+GalwayGirl whispers: you're cool
+Teleporting GalwayGirl to GalwayGirl at (-50.868000030518,36.542999267578,291.4460144043)
+GalwayGirl whispers: you're cool
+Teleporting GalwayGirl to GalwayGirl at (-50.579998016357,36.5,291.60699462891)
+GalwayGirl whispers: you're cool
+Teleporting GalwayGirl to GalwayGirl at (-50.628997802734,36.513000488281,291.82000732422)
+GalwayGirl whispers: you're cool
+Teleporting GalwayGirl to GalwayGirl at (-50.628997802734,36.5,291.97100830078)
+GalwayGirl whispers: you're cool
+Teleporting GalwayGirl to GalwayGirl at (-50.959999084473,36.5,292.07000732422)
+GalwayGirl whispers: you're cool
+Teleporting GalwayGirl to GalwayGirl at (-50.283000946045,36.5,292.11700439453)
+GalwayGirl whispers: you're cool
+Teleporting GalwayGirl to GalwayGirl at (-50.809997558594,36.581996917725,292.16000366211)
+GalwayGirl whispers: you're cool
+Teleporting GalwayGirl to GalwayGirl at (-50.381000518799,36.544998168945,292.19799804688)
+GalwayGirl whispers: you're cool
+Teleporting GalwayGirl to GalwayGirl at (-50.889995574951,36.5,292.1559753418)
+GalwayGirl whispers: you're cool
+Teleporting GalwayGirl to GalwayGirl at (-51.358001708984,36.5,292.13198852539)
+GalwayGirl whispers: you're cool
+Teleporting GalwayGirl to GalwayGirl at (-50.358001708984,36.5,292.13098144531)
+GalwayGirl whispers: you're cool
+Teleporting GalwayGirl to GalwayGirl at (-49.357997894287,35.5,292.13000488281)
+GalwayGirl whispers: you're cool
+Teleporting GalwayGirl to GalwayGirl at (-48.357997894287,35.5,292.13000488281)
+GalwayGirl whispers: you're cool
+Teleporting GalwayGirl to GalwayGirl at (-49.284999847412,35.5,292.15698242188)
+GalwayGirl whispers: you're cool
+Teleporting GalwayGirl to GalwayGirl at (-49.419998168945,35.5,292.17300415039)
+*** Fleckenstein joined the game.
+Teleporting Fleckenstein to GalwayGirl at (-51.423000335693,36.5,292.08001708984)
+true
+true
+true
+true
+true
+true
+true
+false
+true
+false
+true
+false
+true
+false
+true
+false
+true
+false
+true
+false
+-!- Invalid command: clear
+false
+true
+Kicked Fleckenstein
+*** Fleckenstein left the game.
+*** Fleckenstein joined the game.
+Kicked Fleckenstein
+*** Fleckenstein left the game.
+-!- Invalid command: Kicked
+-!- Invalid command: -!-
+-!- Invalid command: -!-
+-!- Invalid command: adminb
+The administrator of this server is GalwayGirl.
+-!- Invalid command: The
+-!- Invalid command: -!-
+-!- Invalid command: -!-
+-!- Invalid command: -!-
+-!- Invalid command: -!-
+-!- Invalid command: -!-
+Privileges of GalwayGirl: privs, basic_privs, home, fly, protection_bypass, server, debug, teleport, shout, settime, bring, interact, password, ban, rollback, fast, creative, noclip, kick, give
+Available commands: admin auth_reload ban clearinv clearobjects clearpassword cmp days deleteblocks emergeblocks eval fixlight give giveme grant grantme haspriv help home hp kick kill killme last-login me mods msg pop print privs pulverize push remove_player revoke rollback rollback_check say set sethome setpassword shutdown spawnentity status teleport tell time unban
+Use '/help <cmd>' to get more information, or '/help all' to list everything.
+-!- Invalid command: day
+Current day is 7
+Privileges of GalwayGirl: privs, basic_privs, home, fly, protection_bypass, server, debug, teleport, shout, settime, bring, interact, password, ban, rollback, fast, creative, noclip, kick, give
+Available commands: admin auth_reload ban clearinv clearobjects clearpassword cmp days deleteblocks emergeblocks eval fixlight give giveme grant grantme haspriv help home hp kick kill killme last-login me mods msg pop print privs pulverize push remove_player revoke rollback rollback_check say set sethome setpassword shutdown spawnentity status teleport tell time unban
+Use '/help <cmd>' to get more information, or '/help all' to list everything.
+Clearing all objects. This may take a long time. You may experience a timeout. (by GalwayGirl)
+*** Cleared all objects.
+Invalid usage, see /help clearobjects.
+\e(c@#00ffff)/clearobjects\e(c@#ffffff) [full | quick]: Clear all objects in world
+Clearing all objects. This may take a long time. You may experience a timeout. (by GalwayGirl)
+*** Cleared all objects.
+Available commands: admin auth_reload ban clearinv clearobjects clearpassword cmp days deleteblocks emergeblocks eval fixlight give giveme grant grantme haspriv help home hp kick kill killme last-login me mods msg pop print privs pulverize push remove_player revoke rollback rollback_check say set sethome setpassword shutdown spawnentity status teleport tell time unban
+Use '/help <cmd>' to get more information, or '/help all' to list everything.
+# Server: version=5.2.0-GalwayGirl, uptime=0.315, max_lag=0.233766, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+*** Fleckenstein joined the game.
+Kicked Fleckenstein
+*** Fleckenstein left the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.383, max_lag=0.301698, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.365, max_lag=0.264735, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.384, max_lag=0.318745, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+*** Fleckenstein joined the game.
+*** Fleckenstein left the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.372, max_lag=0.306754, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+Available commands: admin auth_reload ban clearinv clearobjects clearpassword cmp days deleteblocks emergeblocks eval fixlight give giveme grant grantme haspriv help home hp kick kill killme last-login me mods msg pop print privs pulverize push remove_player revoke rollback rollback_check say set sethome setpassword shutdown spawnentity status teleport tell time unban
+Use '/help <cmd>' to get more information, or '/help all' to list everything.
+GalwayGirl whispers: Well done
+GalwayGirl whispers: Well done
+-!- Empty command
+GalwayGirl whispers: Well done
+-!- Empty command
+GalwayGirl whispers: Well done
+GalwayGirl whispers: Well done
+GalwayGirl whispers: Press the other button first
+GalwayGirl whispers: Press the other button first
+GalwayGirl whispers: No press the other button
+GalwayGirl whispers: Now press the other button
+GalwayGirl whispers: Now press the other button
+GalwayGirl whispers: Now press the other button
+GalwayGirl whispers: Well done
+GalwayGirl whispers: Press the other button first
+GalwayGirl whispers: Now press the other button
+GalwayGirl whispers: Now press the other button
+GalwayGirl whispers: Well done
+GalwayGirl whispers: Press the other button first
+GalwayGirl whispers: Press the other button first
+GalwayGirl whispers: Press the other button first
+GalwayGirl whispers: Now press the other button
+GalwayGirl whispers: Well done
+GalwayGirl whispers: Press the other button first!
+GalwayGirl whispers: Press the other button first!
+nil
+GalwayGirl whispers: Now press the other button!
+GalwayGirl whispers: No, press the other button!
+GalwayGirl whispers: No, press the other button!
+GalwayGirl whispers: No, press the other button!
+GalwayGirl whispers: Well done!
+GalwayGirl whispers: Press the other button first!
+GalwayGirl whispers: Now press the other button!
+GalwayGirl whispers: No, press the other button!
+GalwayGirl whispers: No, press the other button!
+GalwayGirl whispers: Well done!
+GalwayGirl whispers: Now press the other button!
+GalwayGirl whispers: Well done!
+GalwayGirl whispers: Now press the other button!
+GalwayGirl whispers: Well done!
+GalwayGirl whispers: Now press the other button!
+GalwayGirl whispers: Well done!
+<GalwayGirl> push
+nil
+# Server: version=5.2.0-GalwayGirl, uptime=0.326, max_lag=0.26179, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+
+GalwayGirl whispers: correct
+GalwayGirl whispers: incorrect
+GalwayGirl whispers: incorrect
+GalwayGirl whispers: correct
+GalwayGirl whispers: correct
+GalwayGirl whispers: correct
+3 1 2
+3 1 2
+3 1 2 1
+GalwayGirl whispers: 3 1 2 1
+GalwayGirl whispers: 3 1 2 1
+GalwayGirl whispers: 
+GalwayGirl whispers: 2 3 1
+GalwayGirl whispers: incorrect
+GalwayGirl whispers: 3 1 2
+GalwayGirl whispers: incorrect
+GalwayGirl whispers: 3 1 2
+GalwayGirl whispers: 3 1 2
+GalwayGirl whispers: 
+3 1 2
+false
+GalwayGirl whispers: incorrect
+GalwayGirl whispers: correct
+GalwayGirl whispers: correct
+GalwayGirl whispers: 
+GalwayGirl whispers: correct
+GalwayGirl whispers: incorrect
+GalwayGirl whispers: incorrect
+GalwayGirl whispers: incorrect
+GalwayGirl whispers: incorrect
+3 1 2
+ 3 1 2
+GalwayGirl whispers: 3 1 2
+GalwayGirl whispers: incorrect
+GalwayGirl whispers: 1
+GalwayGirl whispers: 1
+ 1
+GalwayGirl whispers: 1
+ 1
+FAMYLY135 completed the quest "place_ladder" on level 2
+# Server: version=5.2.0, uptime=16768.5, max_lag=2.93685, clients={Fleckenstein, DerLombiiie, FAMYLY135, HimbeerserverDE}
+# Server: Welcome to Elidragon Skyblocks!
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)\e(c@#27EA30) Skyblocks\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub !\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island!\e(c@#ffffff)
+\e(c@#83FF00) NEWS! \e(c@#ffffff)\e(c@#FFFFFF)Server on Version 5.2 now!\e(c@#ffffff)
+FAMYLY135 completed the quest "place_fence" on level 2
+FAMYLY135 completed the quest "place_trapdoor" on level 2
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)HimbeerserverDE has joined the Server.
+# Server: version=5.2.0, uptime=17286.9, max_lag=5.39676, clients={Fleckenstein, HimbeerserverDE, DerLombiiie, FAMYLY135}
+# Server: Welcome to Elidragon Skyblocks!
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)\e(c@#27EA30) Skyblocks\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub !\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island!\e(c@#ffffff)
+\e(c@#83FF00) NEWS! \e(c@#ffffff)\e(c@#FFFFFF)Server on Version 5.2 now!\e(c@#ffffff)
+FAMYLY135 completed the quest "place_gravel" on level 2
+FAMYLY135 completed the quest "place_trapdoor" on level 2
+FAMYLY135 completed the quest "place_ladder" on level 2
+FAMYLY135 completed the quest "place_fence" on level 2
+\e(T@unified_inventory)Time of day set to 6am\eE
+\e(c@#FFFFFF)\e(c@#ffffff)MikePatton has joined the Server.
+FAMYLY135 completed the quest "place_dirt" on level 2
+\e(c@#FFFFFF)\e(c@#ffffff)MikePatton has left the Server.
+\e(c@#FFFFFF)\e(c@#ffffff)imnothere has joined the Server.
+-!- Invalid command: 7set
+WorldEdit -!- 1 nodes set
+WorldEdit -!- region reset
+WorldEdit -!- region unmarked
+\e(c@#FFFFFF)\e(c@#ffffff)Diana_fr_french has joined the Server.
+\e(c@#00D600)Diana_fr_french has joined the Server for the first Time! Welcome!\e(c@#ffffff)
+\e(c@#FFFFFF)\e(c@#ffffff)<Diana_fr_french> hello
+\e(c@#FFFFFF)\e(c@#ffffff)<Diana_fr_french> my is french
+\e(c@#EBEE00)[HELPER]\e(c@#ffffff)<DerLombiiie> my is german
+\e(c@#FFFFFF)\e(c@#ffffff)noga has joined the Server.
+Current Players:
+ - FAMYLY135 - level 2
+ - DerLombiiie - level 7
+ - HimbeerserverDE - level 9
+ - Fleckenstein - level 9
+ - imnothere - level 4
+ - Diana_fr_french - level 1
+ - noga - level 2
+\e(c@#EBEE00)[HELPER]\e(c@#ffffff)<DerLombiiie> Not Germanen
+FAMYLY135 completed the quest "place_cobble" on level 2
+\e(T@unified_inventory)Time of day set to 6am\eE
+FAMYLY135 completed the quest "place_trapdoor" on level 2
+FAMYLY135 completed the quest "place_ladder" on level 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+FAMYLY135 completed the quest "place_fence" on level 2
+FAMYLY135 completed the quest "place_cobble" on level 2
+FAMYLY135 completed the quest "dig_stone_with_coal" on level 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+FAMYLY135 completed the quest "place_torch" on level 2
+FAMYLY135 completed the quest "dig_stone_with_iron" on level 2
+\e(c@#EBEE00)[HELPER]\e(c@#ffffff)<DerLombiiie> lag?
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<HimbeerserverDE> noo
+FAMYLY135 completed the quest "collect_water" on level 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#FFFFFF)\e(c@#ffffff)Nicotto has joined the Server.
+\e(c@#00D600)Nicotto has joined the Server for the first Time! Welcome!\e(c@#ffffff)
+\e(c@#FFFFFF)\e(c@#ffffff)laurajonson29 has joined the Server.
+\e(c@#00D600)laurajonson29 has joined the Server for the first Time! Welcome!\e(c@#ffffff)
+\e(c@#EBEE00)[HELPER]\e(c@#ffffff)<DerLombiiie> hii
+noga completed the quest "place_gravel" on level 2
+Nicotto completed the quest "dig_dirt" on level 1
+Nicotto completed the quest "place_dirt" on level 1
+laurajonson29 completed the quest "dig_dirt" on level 1
+laurajonson29 completed the quest "place_dirt" on level 1
+Nicotto completed the quest "place_sapling" on level 1
+laurajonson29 completed the quest "place_sapling" on level 1
+\e(c@#EBEE00)[HELPER]\e(c@#ffffff)DerLombiiie has left the Server.
+\e(c@#FFFFFF)\e(c@#ffffff)Nicotto has left the Server.
+\e(c@#FFFFFF)\e(c@#ffffff)laurajonson29 has left the Server.
+\e(c@#FFFFFF)\e(c@#ffffff)Diana_fr_french has left the Server.
+FAMYLY135 completed the quest "place_gravel" on level 2
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> Z7SfXYx
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+FAMYLY135 completed the quest "place_dirt" on level 2
+FAMYLY135 completed level 2
+\e(c@#FFFFFF)\e(c@#ffffff)igidrau has joined the Server.
+WorldEdit -!- 36 nodes set
+FAMYLY135 completed the quest "dig_stone_with_copper" on level 3
+imnothere completed the quest "place_silver_sandstone_brick" on level 4
+igidrau completed the quest "dig_cactus" on level 6
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+WorldEdit -!- region unmarked
+imnothere completed the quest "place_lava" on level 4
+imnothere completed level 4
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<HimbeerserverDE> test
+Fleckenstein whispers: Commandblock unconfigured
+\e(c@#339933)<olliy\ f@ElidragonDiscord> testing wot?\e(c@#ffffff)
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<HimbeerserverDE> lag test
+\e(c@#339933)<olliy\ f@ElidragonDiscord> aah\e(c@#ffffff)
+FAMYLY135 completed the quest "place_mossycobble" on level 3
+\e(c@#339933)<olliy@IRC> !cmd status\e(c@#ffffff)
+\e(c@#FFFFFF)\e(c@#ffffff)Llynnya has joined the Server.
+\e(c@#339933)<olliy@IRC> hmm\e(c@#ffffff)
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> heya
+FAMYLY135 completed the quest "dig_papyrus" on level 3
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> oh my... delay... :/
+"default:mese 10" added to inventory.
+\e(c@#FFFF00)Fleckenstein has completed HimbeerserverDE's labyrinth\e(c@#ffffff)
+\e(c@#339933)<olliy@IRC> 4.7 max lag not bad also not good\e(c@#ffffff)
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> I installed a live map now: elidragon.com:3050/#!/map/0/10/16000/16000
+\e(c@#339933)<olliy\ f@ElidragonDiscord> nice\e(c@#ffffff)
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> somebody want to build a dropper or a labyrinth?
+igidrau completed the quest "dig_jungletree" on level 6
+\e(c@#FFFF55)Fleckenstein has entered the PvP area\e(c@#ffffff)
+\e(T@unified_inventory)Inventory cleared!\eE
+Teleporting to (16000,10,16000)
+igidrau completed the quest "place_protected_chest" on level 6
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<HimbeerserverDE> afk
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Server: version=5.2.0-GalwayGirl, uptime=0.219, max_lag=0.154876, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.208, max_lag=0.142886, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+# Server: version=5.2.0, uptime=19732.2, max_lag=3.1412, clients={Fleckenstein, q333, UncleErnie}
+# Server: Welcome to Elidragon Skyblocks!
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)\e(c@#27EA30) Skyblocks\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub !\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island!\e(c@#ffffff)
+\e(c@#83FF00) NEWS! \e(c@#ffffff)\e(c@#FFFFFF)Server on Version 5.2 now!\e(c@#ffffff)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#FFFFFF)\e(c@#ffffff)<q333> glitched in
+This area is owned by TheFirDragon!
+Overlaps into above players protected area
+This area is owned by TheFirDragon!
+Overlaps into above players protected area
+This area is owned by TheFirDragon!
+Overlaps into above players protected area
+This area is not protected.
+You can build here.
+This area is owned by TheFirDragon!
+Overlaps into above players protected area
+\e(c@#339933)<olliy\ f@ElidragonDiscord> well\e(c@#ffffff)
+\e(c@#339933)<olliy\ f@ElidragonDiscord> :)\e(c@#ffffff)
+\e(c@#339933)<olliy\ f@ElidragonDiscord> good for u\e(c@#ffffff)
+\e(c@#FFFFFF)\e(c@#ffffff)<q333> not this dirt
+\e(c@#FFFFFF)\e(c@#ffffff)<q333> its fake
+Teleporting to UncleErnie at (-17.75,1006.5,-1.7680000066757)
+# Server: version=5.2.0, uptime=247.5, max_lag=3.58136, clients={Fleckenstein}
+# Server: Welcome to Elidragon Skyblocks!
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)\e(c@#27EA30) Skyblocks\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub !\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island!\e(c@#ffffff)
+\e(c@#83FF00) NEWS! \e(c@#ffffff)\e(c@#FFFFFF)Server on Version 5.2 now!\e(c@#ffffff)
+# Server: version=5.2.0, uptime=41.67, max_lag=4.64588, clients={Fleckenstein}
+# Server: Welcome to Elidragon Skyblocks!
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)\e(c@#27EA30) Skyblocks\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub !\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island!\e(c@#ffffff)
+\e(c@#83FF00) NEWS! \e(c@#ffffff)\e(c@#FFFFFF)Server on Version 5.2 now!\e(c@#ffffff)
+\e(c@#FFFFFF)\e(c@#ffffff)q333 has joined the Server.
+\e(T@unified_inventory)Time of day set to 6am\eE
+Error: You dont have enough in your inventory to buy this, exchange aborted.
+Error: You dont have enough in your inventory to buy this, exchange aborted.
+Error: You dont have enough in your inventory to buy this, exchange aborted.
+"maptools:pick_admin" added to inventory.
+\e(c@#FFFFFF)\e(c@#ffffff)<q333> do the buttons work?
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> now they do
+Teleporting to (0,10000,0)
+Teleporting to (0,10000,0)
+Teleporting to (0,10000,0)
+Invalid parameters ("q^") or player not found (see /help teleport)
+Teleporting to q333 at (6.6710000038147,1000.5,22.501998901367)
+\e(c@#FFFFFF)\e(c@#ffffff)<q333> what ways are there here
+\e(c@#FFFFFF)\e(c@#ffffff)q333 has left the Server.
+\e(c@#FFFFFF)\e(c@#ffffff)q333 has joined the Server.
+\e(c@#FFFFFF)\e(c@#ffffff)<q333> so is there a pad and or a command to get here
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> not yet
+\e(c@#FFFFFF)\e(c@#ffffff)<q333> so is the old shop getting kept?
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> after next restart /shop
+\e(c@#FFFFFF)\e(c@#ffffff)UncleErnie has joined the Server.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> no
+\e(c@#FFFFFF)\e(c@#ffffff)<UncleErnie> Hi
+\e(c@#FFFFFF)\e(c@#ffffff)<q333> did you get your dirt
+\e(c@#FFFFFF)\e(c@#ffffff)<UncleErnie> I think so.
+\e(c@#FFFFFF)\e(c@#ffffff)<q333> did you get some of the fake dirt?
+\e(c@#FFFFFF)\e(c@#ffffff)<UncleErnie> Yes!
+\e(c@#FFFFFF)\e(c@#ffffff)<UncleErnie> Yes quite a bit. :(
+\e(c@#FFFFFF)\e(c@#ffffff)<q333> I'll trade for 2 stacks
+\e(c@#FFFFFF)\e(c@#ffffff)<UncleErnie> I give them to you
+\e(c@#FFFFFF)\e(c@#ffffff)<UncleErnie> cool
+\e(c@#FFFFFF)\e(c@#ffffff)UncleErnie has left the Server.
+\e(c@#FFFFFF)\e(c@#ffffff)UncleErnie has joined the Server.
+\e(c@#FFFFFF)\e(c@#ffffff)<q333> fleck I wanted to buy something from that store before it went away
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> sry
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> but the old shop was really shit
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> what did u want to buy?
+Teleporting to q333 at (16095.09375,6.5,15933.703125)
+\e(c@#FFFFFF)\e(c@#ffffff)<q333> do you remember what was for sale in the 2 shops that were away from the rest
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> no
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> think some technic stuff you currently can't craft
+\e(c@#FFFFFF)\e(c@#ffffff)<q333> granite
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> u need some?
+\e(c@#FFFFFF)\e(c@#ffffff)<UncleErnie> there is a shop with granite, but it is expensive.
+\e(c@#FFFFFF)\e(c@#ffffff)<q333> I have non and I want to make stuff that requires it
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> here u are
+\e(c@#FFFFFF)\e(c@#ffffff)<q333> thank you
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> you're welcome
+\e(c@#FFFFFF)\e(c@#ffffff)<UncleErnie> you will want some chromium, marble and zinc too.
+Teleporting to UncleErnie at (16416.8203125,49.965000152588,15870.170898438)
+Teleporting to q333 at (16096.182617188,7.561999797821,15931.939453125)
+\e(T@unified_inventory)Time of day set to 6am\eE
+\e(c@#FFFFFF)\e(c@#ffffff)<q333> probably
+Teleporting to q333 at (16096.182617188,7.561999797821,15931.939453125)
+UncleErnie completed the quest "place_water" on level 7
+[maptools] tools/nodes do not drop!
+[maptools] tools/nodes do not drop!
+Can't get on: Doors are closed! (try holding sneak key!)
+Warning: If you destroy this wagon, you only get some steel back! If you are sure, hold Sneak and left-click the wagon.
+Warning: If you destroy this wagon, you only get some steel back! If you are sure, hold Sneak and left-click the wagon.
+Warning: If you destroy this wagon, you only get some steel back! If you are sure, hold Sneak and left-click the wagon.
+Warning: If you destroy this wagon, you only get some steel back! If you are sure, hold Sneak and left-click the wagon.
+Warning: If you destroy this wagon, you only get some steel back! If you are sure, hold Sneak and left-click the wagon.
+\e(c@#FFFFFF)\e(c@#ffffff)<UncleErnie> hi Fleckenstein!
+Teleporting to UncleErnie at (16413.919921875,79.542999267578,15867.989257813)
+Can't get on: Doors are closed! (try holding sneak key!)
+Can't get on: Doors are closed! (try holding sneak key!)
+Can't get on: Doors are closed! (try holding sneak key!)
+Wagon needs to be decoupled from other wagons in order to destroy it.
+Wagon needs to be decoupled from other wagons in order to destroy it.
+Wagon needs to be decoupled from other wagons in order to destroy it.
+Wagon needs to be decoupled from other wagons in order to destroy it.
+Wagon needs to be decoupled from other wagons in order to destroy it.
+Wagon needs to be decoupled from other wagons in order to destroy it.
+Wagon needs to be decoupled from other wagons in order to destroy it.
+Can't get on: Doors are closed! (try holding sneak key!)
+Can't get on: Doors are closed! (try holding sneak key!)
+Can't get on: Doors are closed! (try holding sneak key!)
+Can't get on: Doors are closed! (try holding sneak key!)
+Wagon needs to be decoupled from other wagons in order to destroy it.
+Doors are closed! Use Sneak+rightclick to ignore the closed doors and get off!
+Doors are closed! Use Sneak+rightclick to ignore the closed doors and get off!
+\e(T@unified_inventory)Time of day set to 6am\eE
+\e(c@#FFFF55)Fleckenstein has entered the PvP area\e(c@#ffffff)
+# Server: version=5.2.0, uptime=3274.02, max_lag=4.34461, clients={Fleckenstein, jonah14, UncleErnie, q333}
+# Server: Welcome to Elidragon Skyblocks!
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)\e(c@#27EA30) Skyblocks\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub !\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island!\e(c@#ffffff)
+\e(c@#83FF00) NEWS! \e(c@#ffffff)\e(c@#FFFFFF)Server on Version 5.2 now!\e(c@#ffffff)
+\e(c@#FFFFFF)\e(c@#ffffff)<q333> wb
+\e(c@#FFFFFF)\e(c@#ffffff)<UncleErnie> wb
+Fleckenstein is now invisible
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Teleporting to jonah14 at (16395.185546875,-5.5,16197.487304688)
+\e(c@#FFFFFF)\e(c@#ffffff)<jonah14> oi ware do i go wut do i do
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Teleporting to jonah14 at (16396.046875,-5.5,16208.658203125)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#FFFFFF)\e(c@#ffffff)<q333> dig 10 dirt
+\e(c@#FFFFFF)\e(c@#ffffff)<jonah14> ya but ware idk ware i am
+Teleporting to jonah14 at (16376.670898438,-5.5,16211.676757813)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Teleporting to jonah14 at (16416.515625,11.5,16158.833007813)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#FFFFFF)\e(c@#ffffff)<jonah14> oi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#FFFFFF)\e(c@#ffffff)<jonah14> oi you
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#FFFFFF)\e(c@#ffffff)<jonah14> come back here
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+WorldEdit -!- 1 nodes set
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#FFFFFF)\e(c@#ffffff)<jonah14> cane some one come here
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+WorldEdit -!- region unmarked
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+WorldEdit -!- region reset
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#FFFFFF)\e(c@#ffffff)jonah14 has left the Server.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Fleckenstein is no longer invisible
+-!- mode/#elidragon-skyblocks [+qo Fleckenstein Fleckenstein] by ChanServ
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Server: version=5.2.0, uptime=3671.55, max_lag=2.4313, clients={Fleckenstein, UncleErnie, q333}
+# Server: Welcome to Elidragon Skyblocks!
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)\e(c@#27EA30) Skyblocks\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub !\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island!\e(c@#ffffff)
+\e(c@#83FF00) NEWS! \e(c@#ffffff)\e(c@#FFFFFF)Server on Version 5.2 now!\e(c@#ffffff)
+\e(c@#EE6E00)[BUILDER]\e(c@#ffffff)mitas has joined the Server.
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)olliy has joined the Server.
+\e(c@#EE6E00)[BUILDER]\e(c@#ffffff)<mitas> hi
+\e(c@#339933)<Fleckenstein@IRC> hi\e(c@#ffffff)
+\e(c@#FFFFFF)\e(c@#ffffff)<UncleErnie> there is the problem with a puzzle game like this. If someone is not interested in figuring it out on their own, it does not really help to help them.
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> hello
+\e(c@#EE6E00)[BUILDER]\e(c@#ffffff)<mitas> finally I can talk in chat
+Teleporting to UncleErnie at (16416.599609375,38.40299987793,15873.5546875)
+\e(c@#FFFFFF)\e(c@#ffffff)<UncleErnie> Hi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> hmm mitas i dont think your shout was ever revoked
+\e(c@#FFFFFF)\e(c@#ffffff)<UncleErnie> i went for an odd sort of mood when I built this one. :)
+\e(c@#EE6E00)[BUILDER]\e(c@#ffffff)mitas has left the Server.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> :)
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> :D
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Teleporting to olliy at (-10.5640001297,1006.9760131836,-20.772001266479)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> Fleckenstein: can you get that working?
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> i did
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> idk if that works
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> ah thanks :)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> after next restart players will be able to use /shop to get there
+Fleckenstein whispers: Commandblock unconfigured
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> ah i ma finish this real quick then
+\e(c@#FFFFFF)\e(c@#ffffff)Llynnya has joined the Server.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Teleporting to q333 at (-144.82600402832,10002.5,426.81201171875)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#FFFFFF)\e(c@#ffffff)<q333> hi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(T@unified_inventory)Time of day set to 6am\eE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> :D
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Server: version=5.2.0, uptime=5743.98, max_lag=3.735, clients={Llynnya, olliy, Fleckenstein, UncleErnie, q333}
+# Server: Welcome to Elidragon Skyblocks!
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)\e(c@#27EA30) Skyblocks\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub !\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island!\e(c@#ffffff)
+\e(c@#83FF00) NEWS! \e(c@#ffffff)\e(c@#FFFFFF)Server on Version 5.2 now!\e(c@#ffffff)
+Teleporting to olliy at (14.978999137878,1010.366027832,-6.7699999809265)
+\e(T@unified_inventory)Time of day set to 6am\eE
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> doing final touches
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> shop is done
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> decoration -final toches
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> now its done
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> nice
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> i will do something cool in here ;)
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> restart for /shop ?
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> ok
+*** Server shutting down (operator request).
+\e(c@#339933)<Fleckenstein@IRC> $cmd shutdown\e(c@#ffffff)
+*** Server shutting down
+# Server: version=5.2.0, uptime=44.01, max_lag=4.34695, clients={Fleckenstein, Llynnya}
+# Server: Welcome to Elidragon Skyblocks!
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)\e(c@#27EA30) Skyblocks\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub !\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island!\e(c@#ffffff)
+\e(c@#83FF00) NEWS! \e(c@#ffffff)\e(c@#FFFFFF)Server on Version 5.2 now!\e(c@#ffffff)
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)olliy has joined the Server.
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> Shop is open
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> do /shop
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> :)
+\e(c@#FFFFFF)\e(c@#ffffff)q333 has joined the Server.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+"default:mese 10" added to inventory.
+\e(c@#FFFF00)Fleckenstein has completed HimbeerserverDE's maze\e(c@#ffffff)
+Fleckenstein whispers: Do you want to buil a minigame? Then use /mail Fleckenstein!
+Fleckenstein whispers: Do you want to build a minigame? Then use /mail Fleckenstein!
+Fleckenstein whispers: Do you want to build a minigame? Then use /mail Fleckenstein!
+\e(T@unified_inventory)Time of day set to 6am\eE
+Fleckenstein whispers: Do you want to build a minigame? Then use /mail Fleckenstein!
+Fleckenstein whispers: Do you want to build a minigame? Then use /mail Fleckenstein!
+Fleckenstein whispers: Do you want to build a minigame? Then use /mail Fleckenstein!
+Fleckenstein whispers: Do you want to build a minigame? Then use /mail Fleckenstein!
+Fleckenstein whispers: Do you want to build a minigame? Then use /mail Fleckenstein!
+Fleckenstein whispers: Do you want to build a minigame? Then use /mail Fleckenstein!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+"default:mese 10" added to inventory.
+\e(c@#FFFF00)Fleckenstein has completed HimbeerserverDE's labyrinth\e(c@#ffffff)
+\e(c@#FFFF55)Fleckenstein has entered the PvP area\e(c@#ffffff)
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> ouh come on... i can't really play what's wrong T_T
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> ?
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#FFFFFF)\e(c@#ffffff)igidrau has joined the Server.
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> laggy... getting dced like every few mins on top of that
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> ._.
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> hmm
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> server side lag is pretty high for 5players but could be your internet
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> too
+# Server: version=5.2.0, uptime=1096.47, max_lag=5.86926, clients={igidrau, Fleckenstein, q333, Llynnya, olliy}
+# Server: Welcome to Elidragon Skyblocks!
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> my internet is fine.. checked several times
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> servers just tend to hate me i fear ._.
+WorldEdit -!- WARNING: this operation could affect up to 83475 nodes; type //y to continue or //n to cancel
+WorldEdit -!- 16481 nodes saved
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> press F5 and tell me what your rtt is
+WorldEdit -!- WARNING: this operation could affect up to 83475 nodes; type //y to continue or //n to cancel
+WorldEdit -!- 14150 nodes replaced
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> jumping between 0 and 13
+\e(T@unified_inventory)Time of day set to 6am\eE
+# Server: version=5.2.0-GalwayGirl, uptime=0.836, max_lag=0.610145, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.449, max_lag=0.384769, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+-!- Invalid command: /srt
+WorldEdit -!- 640 nodes set
+# Server: version=5.2.0-GalwayGirl, uptime=0.302, max_lag=0.23681, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.352, max_lag=0.255744, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> i am confusing my self atm
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> if you mean higher = bad then it's above
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> :D
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> below means under
+# Server: version=5.2.0, uptime=1725.57, max_lag=3.71344, clients={Fleckenstein, olliy, Llynnya, q333, igidrau}
+# Server: Welcome to Elidragon Skyblocks!
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)\e(c@#27EA30) Skyblocks\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub !\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island!\e(c@#ffffff)
+\e(c@#83FF00) NEWS! \e(c@#ffffff)\e(c@#FFFFFF)Server on Version 5.2 now!\e(c@#ffffff)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> above = over
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> 0.85 or 0.84 0.83 etc... bad
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> ik that
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> i had a rough week :P my mind aint working well
+\e(c@#FFFFFF)\e(c@#ffffff)<igidrau> but, 0.248<0.85
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> what igidrau sais
+\e(c@#FFFFFF)\e(c@#ffffff)<igidrau> Don't you mean 0.085?
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> that's why i'm confused xDDD
+\e(c@#FFFFFF)\e(c@#ffffff)<igidrau> Mine is at 0.054 and it works perfectly fine
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> i don't even have a comma in the values there... settling around 13 again O.o
+\e(T@unified_inventory)Time of day set to 6am\eE
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> i'm returning to my initial idea: servers hate me :,(
+\e(c@#FFFFFF)\e(c@#ffffff)<igidrau> what does RTT means anyway?
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> hmmm
+WorldEdit -!- 5429 nodes replaced
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> whatever you have in RTT is the speed limit of the data collected from you to the server
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> like you moving placing a block breaking a block puching
+\e(c@#FFFFFF)\e(c@#ffffff)<igidrau> but, it's in seconds
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> if its in seconds its good
+\e(c@#FFFFFF)\e(c@#ffffff)<igidrau> Shouldn't a speed be in bit/seconds?
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> well idk what minetest developers r doin :P
+Fleckenstein whispers: Do you want to build a minigame? Then use /mail Fleckenstein!
+Fleckenstein whispers: Do you want to build a minigame? Then use /mail Fleckenstein!
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> the new hub is done
+Fleckenstein whispers: Do you want to build a minigame? Then use /mail Fleckenstein!
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> hmm i havent finished all levels :P
+\e(c@#FFFFFF)\e(c@#ffffff)igidrau has left the Server.
+\e(c@#FFFFFF)\e(c@#ffffff)igidrau has joined the Server.
+\e(c@#00ffff)/spawn\e(c@#ffffff): Warp to Spawn [only for staff members]
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> Fleckenstein:  did you make sure the link for discord wont expire?
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> yes
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> goode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)HimbeerserverDE has joined the Server.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Server: version=5.2.0, uptime=3032.91, max_lag=6.15576, clients={Fleckenstein, HimbeerserverDE, igidrau, olliy, Llynnya, q333}
+# Server: Welcome to Elidragon Skyblocks!
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)\e(c@#27EA30) Skyblocks\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub !\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island!\e(c@#ffffff)
+\e(c@#83FF00) NEWS! \e(c@#ffffff)\e(c@#FFFFFF)Server on Version 5.2 now!\e(c@#ffffff)
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> HimbeerserverDE:
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> oh can someone with server come and do this?
+\e(c@#FFFF00)HimbeerserverDE has completed HimbeerserverDE's labyrinth\e(c@#ffffff)
+Teleporting to HimbeerserverDE at (4,10002.444335938,-1)
+Teleporting to olliy at (32.01900100708,945.96203613281,0.16899999976158)
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> teleport to hub thing
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> k
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> what should be the reward
+\e(c@#339933)-!- Edgy1 has quit [Quit: Ping timeout (120 seconds)]\e(c@#ffffff)
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<HimbeerserverDE> afk
+\e(c@#339933)-!- Edgy1 joined #elidragon-skyblocks\e(c@#ffffff)
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> hmm wb Edgy XD
+\e(c@#FFFF00)olliy has completed olliy's dropper\e(c@#ffffff)
+\e(c@#FFFF00)Fleckenstein has completed olliy's dropper\e(c@#ffffff)
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> not done yet XD
+Teleporting to olliy at (28.285999298096,977.42004394531,1.8690000772476)
+Area position 1 set to (24,1000,5)
+Area position 1 set to (20,999,9)
+Area position 1 set to (20,1001,9)
+Area position 1 set to (20,1000,9)
+Area position 2 set to (32,956,-3)
+Area protected. ID: 91
+\e(c@#FFFF00)olliy has completed olliy's dropper\e(c@#ffffff)
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> the command block in your hand looks like it was crushed
+Area limit added. 
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> xD
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> :P
+-!- Invalid command: add_tags
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> Ez
+olliy-dropper | teleport_on_damage | 24,1000.5,5
+\e(c@#FFFF00)olliy has completed olliy's dropper\e(c@#ffffff)
+himbeerserver-dropper | movement | 
+himbeerserver-dropper | teleport_on_damage | 1505,1524.5,1497
+himbeerserver-dropper | no_pvp | 
+\e(c@#FFFF00)olliy has completed olliy's dropper\e(c@#ffffff)
+olliy-dropper | teleport_on_damage | 24,1000.5,5
+Area limit added. 
+Area limit added. 
+Area limit added. 
+\e(c@#FF6737)You can not PVP here!\e(c@#ffffff)
+\e(c@#FF6737)You can not PVP here!\e(c@#ffffff)
+\e(c@#FFFF00)olliy has completed olliy's dropper\e(c@#ffffff)
+olliy-dropper | teleport_on_damage | 24,1000.5,5
+olliy-dropper | no_pvp | 
+olliy-dropper | movement | 
+mitas-dropper | movement | 
+mitas-dropper | teleport_on_damage | 2004,2043.5,2008
+mitas-dropper | no_pvp | 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#FFFF00)olliy completed mitas' dropper\e(c@#ffffff)
+/colormsg is deprecated. Use /message instead
+\e(c@#FFFF00)Fleckenstein completed mitas' dropper\e(c@#ffffff)
+himbeerserver-dropper | movement | 
+himbeerserver-dropper | teleport_on_damage | 1505,1524.5,1497
+himbeerserver-dropper | no_pvp | 
+olliy-dropper | teleport_on_damage | 24,1000.5,5
+olliy-dropper | no_pvp | 
+olliy-dropper | movement | 
+olliy-dropper | teleport_on_damage | 24,1000.5,5
+olliy-dropper | no_pvp | 
+olliy-dropper | movement | 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+* olliy is following HimbeerserverDE around ::P
+\e(c@#FFFF00)Fleckenstein has completed olliy's dropper\e(c@#ffffff)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+-!- Invalid command: remove_tsg
+Area limit removed.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Area limit added. 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> choo choo
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> lol
+Teleporting to olliy at (16410.130859375,18.07200050354,16069.819335938)
+\e(c@#FFFFFF)\e(c@#ffffff)Foxy03 has joined the Server.
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> this stop should be herer
+\e(c@#FFFF00)Foxy03 has completed olliy's dropper\e(c@#ffffff)
+\e(c@#FFFFFF)\e(c@#ffffff)Foxy03 has left the Server.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+-!- Invalid command: remove_area_limit
+Area limit removed.
+# Server: version=5.2.0, uptime=4177.98, max_lag=5.24723, clients={Fleckenstein, HimbeerserverDE, igidrau, olliy, Llynnya, q333}
+# Server: Welcome to Elidragon Skyblocks!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Server: version=5.2.0, uptime=4239.81, max_lag=4.82153, clients={Fleckenstein, HimbeerserverDE, igidrau, olliy, Llynnya, q333}
+# Server: Welcome to Elidragon Skyblocks!
+\e(c@#339933)<Fleckenstein@IRC> $uptime\e(c@#ffffff)
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> cmd*
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#FFFFFF)\e(c@#ffffff)<q333> bye
+\e(c@#FFFFFF)\e(c@#ffffff)q333 has left the Server.
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> c u
+Removed area 91
+[maptools] tools/nodes do not drop!
+[maptools] tools/nodes do not drop!
+olliy-dropper | movement | 
+olliy-dropper | teleport_on_damage | 24,1001,5
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> driving car of void
+Area limit removed.
+Area limit removed.
+Area position 1 set to (38,949,-9)
+Area position 2 set to (22,1003,8)
+Area protected. ID: 91
+Area limit added. 
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> where is the heli pad
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<HimbeerserverDE> it does not exist (yet)
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> i guess i will ride it until one is created XD
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<olliy> brb need to take care of hacxors
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)olliy has left the Server.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<HimbeerserverDE> gotta take care of school, I'll be back in a few hours.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)HimbeerserverDE has left the Server.
+\e(c@#FFFFFF)\e(c@#ffffff)<igidrau> why won't the trees grow sometimes?
+\e(c@#FFFFFF)\e(c@#ffffff)<igidrau> if I plant a tree here, it doesn't grow, but it does on the node right next to it
+\e(c@#339933)<HimbeerserverDE\ f@ElidragonDiscord> light problems?\e(c@#ffffff)
+\e(c@#339933)<HimbeerserverDE\ f@ElidragonDiscord> i've experienced this when i started playing here\e(c@#ffffff)
+\e(c@#FFFFFF)\e(c@#ffffff)<igidrau> I don't think so. I tried moving my machine a few blocks and it solved the problem. Now, the trees won't grow anymore
+\e(T@unified_inventory)Time of day set to 6am\eE
+\e(c@#FFFFFF)\e(c@#ffffff)<igidrau> well, anyway, I've got to study as well
+\e(c@#FFFFFF)\e(c@#ffffff)<igidrau> bye
+\e(c@#FFFFFF)\e(c@#ffffff)igidrau has left the Server.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#FFFFFF)\e(c@#ffffff)UncleErnie has joined the Server.
+\e(c@#FFFFFF)\e(c@#ffffff)<UncleErnie> Hi
+[maptools] tools/nodes do not drop!
+\e(c@#FFFF00)UncleErnie has completed olliy's dropper\e(c@#ffffff)
+\e(c@#FFFF00)UncleErnie has completed olliy's dropper\e(c@#ffffff)
+\e(c@#FFFF00)Fleckenstein has completed olliy's dropper\e(c@#ffffff)
+\e(c@#FFFF00)Fleckenstein has completed olliy's dropper\e(c@#ffffff)
+\e(c@#FFFF00)Fleckenstein has completed olliy's dropper\e(c@#ffffff)
+\e(c@#FFFFFF)\e(c@#ffffff)<UncleErnie> the home buttons dont come back after you leave the shop.
+\e(c@#339933)<olliy\ f@ElidragonDiscord> if you are lagging\e(c@#ffffff)
+\e(c@#339933)<olliy\ f@ElidragonDiscord> or smt\e(c@#ffffff)
+\e(c@#EE6E00)[BUILDER]\e(c@#ffffff)mitas has joined the Server.
+\e(c@#FFFFFF)\e(c@#ffffff)UncleErnie has left the Server.
+\e(c@#EE6E00)[BUILDER]\e(c@#ffffff)<mitas> hi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(T@unified_inventory)Time of day set to 6am\eE
+\e(c@#FFFFFF)\e(c@#ffffff)UncleErnie has joined the Server.
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> *waves*
+* Fleckenstein waves too
+\e(c@#FFFFFF)\e(c@#ffffff)<UncleErnie> logging off fixed it.
+* UncleErnie 
+\e(c@#EE6E00)[BUILDER]\e(c@#ffffff)mitas has left the Server.
+* UncleErnie waves as well
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> wavey-tuesday :D
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> it's tuesday?
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> ebony and irony... n stuff
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> xD
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> i thought it was wednesday
+\e(c@#EE6E00)[BUILDER]\e(c@#ffffff)mitas has joined the Server.
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> it is... that's why it's irony... making fun of people being confused about weekdays... due to home office
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> saw a meme about that earlier
+\e(c@#339933)<olliy@IRC> its wednesday\e(c@#ffffff)
+\e(c@#339933)<olliy@IRC> for me\e(c@#ffffff)
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> and yeees my brain can be hard to follow, no need topoint that out xD
+\e(c@#339933)<olliy@IRC> 2:37pm\e(c@#ffffff)
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> 11:37 AM in my time
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> yupp, 11:38
+\e(c@#339933)<olliy@IRC> not a big difference\e(c@#ffffff)
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> it's 11:38 now
+\e(c@#339933)<q333\ f@ElidragonDiscord> Me to let's go get a drink\e(c@#ffffff)
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> *feels trolled by flying people*
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> xD
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> Llynnya: u can use the /me command
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> but * work too and are universal... xD
+\e(c@#EE6E00)[BUILDER]\e(c@#ffffff)mitas has left the Server.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+* Llynnya was forced to do it
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> lies!
+* Llynnya lol
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> that literally makes no sense
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> why would anyone use /me to say lol.. *facepalms*
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> why?
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> please be more serious about trying to pretend that it was me typing that :D
+* Fleckenstein laughs out loud
+* UncleErnie me me me me me me
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> cause... just NO xD
+\e(c@#FFFFFF)<Llynnya> because actually it was me who typed it.\e(c@#ffffff)
+\e(c@#FFFFFF)<Llynnya> xD\e(c@#ffffff)
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> that looks better
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> *approves*
+\e(c@#FFFFFF)Llynnya has left the Server.\e(c@#ffffff)
+\e(c@#FFFFFF)Llynnya has joined the Server.\e(c@#ffffff)
+\e(c@#FFFFFF)Llynnya has left the Server. (timed out)\e(c@#ffffff)
+\e(c@#FFFFFF)Llynnya has joined the Server.\e(c@#ffffff)
+\e(T@unified_inventory)Time of day set to 6am\eE
+Teleporting to Llynnya at (16422.076171875,6.5,15807.619140625)
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> why did mitas leave markers here btw ._.
+\e(c@#EE6E00)[BUILDER]\e(c@#ffffff)mitas has joined the Server.
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> this is freaking me out
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> T_T
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> thank god... xD
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> i did it
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> *watches the wild admin jump about her patch of land*
+Teleporting to Llynnya at (16422.541015625,6.5,15807.322265625)
+\e(c@#EE6E00)[BUILDER]\e(c@#ffffff)mitas has left the Server.
+\e(c@#FFFFFF)\e(c@#ffffff)Llynnya has joined the Server.
+*** Server shutting down
+\e(c@#FFFFFF)\e(c@#ffffff)Llynnya has left the Server.
+IRC: Disconnected.
+\e(c@#FFFFFF)\e(c@#ffffff)Llynnya has joined the Server.
+*** Server shutting down
+IRC: Disconnected.
+\e(c@#FFFFFF)\e(c@#ffffff)Llynnya has left the Server.
+# Server: version=5.2.0, uptime=26.28, max_lag=7.48873, clients={Fleckenstein}
+# Server: Welcome to Elidragon Skyblocks!
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)\e(c@#27EA30) Skyblocks\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub !\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island!\e(c@#ffffff)
+\e(c@#83FF00) NEWS! \e(c@#ffffff)\e(c@#FFFFFF)Server on Version 5.2 now!\e(c@#ffffff)
+-!- Invalid command: stenews
+# Server: version=5.2.0, uptime=93.87, max_lag=6.65247, clients={Fleckenstein}
+# Server: Welcome to Elidragon Skyblocks!
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)\e(c@#27EA30) Skyblocks\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub !\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island!\e(c@#ffffff)
+\e(c@#83FF00) NEWS! \e(c@#ffffff)\e(c@#FFFFFF)New Hub!\e(c@#ffffff)
+\e(c@#339933)* Fleckenstein@IRC waves\e(c@#ffffff)
+\e(c@#EE6E00)[BUILDER]\e(c@#ffffff)mitas has joined the Server.
+* Fleckenstein waves
+\e(c@#FFFFFF)\e(c@#ffffff)Llynnya has joined the Server.
+* Fleckenstein waves
+* Llynnya waves back
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> nice
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> @everyone do /hub
+\e(c@#339933)<olliy\ f@ElidragonDiscord> that pinged everyone on disc\e(c@#ffffff)
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> i know
+\e(c@#339933)<olliy\ f@ElidragonDiscord> /hub\e(c@#ffffff)
+\e(c@#339933)<q333\ f@ElidragonDiscord> Why\e(c@#ffffff)
+\e(c@#339933)<Fleckenstein@IRC> idk if this is a good idea\e(c@#ffffff)
+\e(c@#339933)<Fleckenstein@IRC> $cmd hub\e(c@#ffffff)
+\e(c@#339933)<Fleckenstein@IRC> $cmd hub\e(c@#ffffff)
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> tutorial looks very nice, well done ^_^
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> thx
+\e(c@#FFFF55)Fleckenstein has entered the PvP area\e(c@#ffffff)
+\e(c@#FFFF55)mitas has entered the PvP area\e(c@#ffffff)
+Time of day changed.
+under-pvp-area | kill_with_msg | #D3FF2A-@player%fell%off%the%PvP%area
+Area limit added. 
+\e(c@#D3FF2A)Fleckenstein fell off the PvP area\e(c@#ffffff)
+\e(T@sethome)Set a home using /sethome\eE
+\e(T@sethome)Set a home using /sethome\eE
+\e(c@#339933)-!- ElidragonDiscord has quit [Connection closed]\e(c@#ffffff)
+\e(c@#EE6E00)[BUILDER]\e(c@#ffffff)mitas has left the Server.
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> afk
+* Fleckenstein dies
+GoodDoggie is owner!
+GoodDoggie is owner!
+GoodDoggie is owner!
+GoodDoggie is owner!
+GoodDoggie is owner!
+GoodDoggie is owner!
+GoodDoggie is owner!
+GoodDoggie is owner!
+Privileges of Llynnya: fast, home, interact, tp, shout, fly
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> Llynnya: you have fly since lvl 4, did you notice that
+\e(T@unified_inventory)Inventory cleared!\eE
+Initiating transfer to station '1'.
+Teleporting to Llynnya at (16419.818359375,6.5,15809.228515625)
+# Server: version=5.2.0, uptime=226.71, max_lag=6.9779, clients={Fleckenstein}
+# Server: Welcome to Elidragon Skyblocks!
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)\e(c@#27EA30) Skyblocks\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub !\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island!\e(c@#ffffff)
+\e(c@#83FF00) NEWS! \e(c@#ffffff)\e(c@#FFFFFF)New Hub!\e(c@#ffffff)
+Time of day changed.
+Teleporting to (16000,0,16000)
+\e(c@#FFFFFF)\e(c@#ffffff)Llynnya has joined the Server.
+Time of day changed.
+olliy-dropper | teleport_on_damage | 24,1001,5
+\e(c@#FFFFFF)\e(c@#ffffff)UncleErnie has joined the Server.
+shop | movement | 
+shop | no_pvp | 
+shop | no_damage | 
+shop | no_pvp | 
+\e(c@#FFFFFF)\e(c@#ffffff)<UncleErnie> Hi
+Area limit removed.
+Area limit removed.
+Area limit removed.
+Area limit added. 
+Removed area 91
+Area position 1 set to (42,953,14)
+Area position 2 set to (22,1003,0)
+Area protected. ID: 91
+Area limit added. 
+Area limit added. 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Removed area 91
+Area position 1 set to (36,955,-8)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Area position 2 set to (15,1007,13)
+Area protected. ID: 91
+Area position 1 set to (22,956,8)
+Area position 2 set to (30,946,-3)
+Area protected. ID: 94
+-!- Invalid command: add_area_tag
+Area limit added. 
+\e(c@#FFFF00)Fleckenstein has completed olliy's dropper\e(c@#ffffff)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Fleckenstein whispers: Do you want to build a minigame? Then use /mail Fleckenstein!
+Area limit removed.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Area limit added. 
+\e(c@#FFFF00)Fleckenstein has completed olliy's dropper\e(c@#ffffff)
+HUB | movement | 
+HUB | no_pvp | 
+olliy-dropper-end | no_damage | 
+Area limit added. 
+Time of day changed.
+Fleckenstein whispers: Do you want to build a minigame? Then use /mail Fleckenstein!
+-!- Invalid command: rename
+Area renamed.
+\e(c@#FFFFFF)\e(c@#ffffff)Kimapr has joined the Server.
+\e(c@#FFFF00)Fleckenstein has completed olliy's dropper\e(c@#ffffff)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#FFFFFF)\e(c@#ffffff)<Kimapr> oof
+\e(c@#FFFFFF)\e(c@#ffffff)<Kimapr> my home is borken
+Teleporting to Kimapr at (16250.400390625,1.3409999608994,16294.125)
+\e(c@#FFFFFF)\e(c@#ffffff)<Kimapr> garden is destroyed
+\e(c@#FFFFFF)\e(c@#ffffff)<Kimapr> door is half-destroyed
+\e(c@#FFFFFF)\e(c@#ffffff)<Kimapr> holes in walls
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> omg
+\e(c@#FFFFFF)\e(c@#ffffff)<Kimapr> i'll fix it myself, thanks
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> ok
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+WorldEdit -!- 1805 nodes set
+WorldEdit -!- region reset
+\e(c@#FFFFFF)\e(c@#ffffff)Nicotto has joined the Server.
+\e(c@#FFFFFF)\e(c@#ffffff)<Kimapr> nah
+\e(c@#FFFFFF)\e(c@#ffffff)<Kimapr> i can't fix it. they stole my water and iron lumps
+\e(c@#FFFFFF)\e(c@#ffffff)<Kimapr> thanks
+\e(c@#FFFFFF)\e(c@#ffffff)Nicotto has left the Server.
+\e(c@#FFFFFF)\e(c@#ffffff)<Kimapr> why would anyone do that?
+\e(c@#FFFFFF)\e(c@#ffffff)<Kimapr> they could left one iron lump
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)HimbeerserverDE has joined the Server.
+\e(c@#FFFFFF)\e(c@#ffffff)<Kimapr> i think this woolen bridge leads to the thief(s) in some way
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)HimbeerserverDE has left the Server.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#FFFFFF)\e(c@#ffffff)FAMYLY135 has joined the Server.
+FAMYLY135 completed the quest "dig_papyrus" on level 3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+FAMYLY135 completed the quest "place_mossycobble" on level 3
+\e(c@#FFFFFF)\e(c@#ffffff)<Kimapr> how do you get papyrus?
+Kimapr completed the quest "place_bar" on level 3
+\e(c@#FFFFFF)\e(c@#ffffff)<Kimapr> perfect
+\e(c@#FFFFFF)\e(c@#ffffff)<Kimapr> i also lost copper
+\e(c@#FFFFFF)\e(c@#ffffff)<Kimapr> to all thieves of this server: next time you steal valuables left at least 1 of it
+\e(c@#FFFFFF)\e(c@#ffffff)<Llynnya> :(
+\e(c@#FFFFFF)\e(c@#ffffff)<Kimapr> yes Llynnya
+\e(c@#FFFFFF)\e(c@#ffffff)FAMYLY135 has left the Server.
+Llynnya completed the quest "dig_stone_with_diamond" on level 4
+Kimapr completed the quest "dig_stone_with_mese" on level 3
+\e(c@#FFFFFF)\e(c@#ffffff)Kimapr has left the Server.
+\e(c@#FFFFFF)\e(c@#ffffff)UncleErnie has left the Server.
+Llynnya completed the quest "dig_mineral_silver" on level 4
+\e(c@#339933)<olliy@IRC> --\e(c@#ffffff)
+\e(c@#339933)-!- ElidragonDiscord joined #elidragon-skyblocks\e(c@#ffffff)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#FFFFFF)\e(c@#ffffff)UncleErnie has joined the Server.
+\e(c@#339933)<olliy@IRC> ChanServ can u kick me pls\e(c@#ffffff)
+\e(c@#339933)<olliy@IRC> hello there\e(c@#ffffff)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+\e(c@#339933)<olliy@IRC> ChanServ, kick olliy\e(c@#ffffff)
+\e(c@#339933)<olliy@IRC> i am unkickable :C\e(c@#ffffff)
+\e(c@#339933)<olliy\ f@ElidragonDiscord> \e(c@#ffffff)
+Llynnya completed the quest "dig_stone_with_tin" on level 4
+# Server: version=5.2.0-GalwayGirl, uptime=2.231, max_lag=1.9976, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#851\e(c@#ffffff) has started!\e(c@#ffffff)
+You must find and punch a 
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#851\e(c@#ffffff) is over. There is no winner.\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=6.991, max_lag=1.93546, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#383\e(c@#ffffff) has started!\e(c@#ffffff)
+You must find and punch a 
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#383\e(c@#ffffff) is over. There is no winner.\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=7.008, max_lag=1.93585, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#35\e(c@#ffffff) has started!\e(c@#ffffff)
+You must find and punch a \e(T@mcl_portals)Nether Portal\eE
+\e(c@#d0ffd0)\e(T@tt)Luminance: \eF11\eE\eE\e(c@#ffffff)
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#35\e(c@#ffffff) is over. Winner: Fleckenstein\e(c@#ffffff)
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#10\e(c@#ffffff) has started!\e(c@#ffffff)
+You must find and punch a \e(T@mclx_stairs)Purple Concrete Stairs\eE
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#10\e(c@#ffffff) is over. Winner: Fleckenstein\e(c@#ffffff)
+*** Foxy03 joined the game.
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#209\e(c@#ffffff) has started!\e(c@#ffffff)
+You must find and punch a \e(T@mcl_stairs)Polished Diorite Stairs\eE
+*** Foxy03 left the game.
+\e(c@#FFB001)Foxy03 has lost the Blockshuffle because they left the game.\e(c@#ffffff)
+\e(c@#FF4E42)There is no active blockshuffle game running.\e(c@#ffffff)
+\e(c@#FF4E42)There is no active blockshuffle game running.\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=0.534, max_lag=0.485708, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+*** Foxy03 joined the game.
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#9344\e(c@#ffffff) has started!\e(c@#ffffff)
+You must find and punch \e(T@stairs)Cobblestone Stair\eE
+Fleckenstein has found their block!
+Foxy03 has found their block!
+You must find and punch \e(T@default)Tin Ore\eE
+Fleckenstein has found their block!
+\e(c@#FFB001)Foxy03 has lost the Blockshuffle because they did not find their block in time.\e(c@#ffffff)
+You must find and punch \e(T@stairs)Silver Sandstone Stair\eE
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#9344\e(c@#ffffff) is over. Winner: Fleckenstein\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=7.015, max_lag=1.93585, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=7.013, max_lag=1.93585, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=2.225, max_lag=1.9968, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=2.342, max_lag=1.9968, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=4.476, max_lag=2.06752, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+Privileges of Fleckenstein: interact maphack basic_privs achievements fly protection_bypass server weather_manager shout debug teleport settime fast bring privs password ban rollback help_reveal kick noclip announce give
+# Server: version=5.3.0-dev, uptime=27.36, max_lag=0.0940817, clients={Fleckenstein}
+# Server: Disclaimer: There may be unsolvable quests.
+*** Fleckenstein joined the game.
+Fleckenstein
+<Fleckenstein> test
+# Server: version=5.3.0-dev, uptime=5.58, max_lag=0.0987478, clients={Fleckenstein}
+# Server: Disclaimer: There may be unsolvable quests.
+*** Fleckenstein joined the game.
+\e(c@#FFF701)You must for the next blockshuffle to start (Minimum 2 players needed).\e(c@#ffffff)
+# Server: version=5.3.0-dev, uptime=9, max_lag=0.0980001, clients={Fleckenstein}
+# Server: Disclaimer: There may be unsolvable quests.
+*** Fleckenstein joined the game.
+\e(c@#FFF701)You must for the next blockshuffle to start (Minimum 2 players needed).\e(c@#ffffff)
+# Server: version=5.3.0-dev, uptime=3.78, max_lag=0.0991436, clients={Fleckenstein}
+# Server: Disclaimer: There may be unsolvable quests.
+*** Fleckenstein joined the game.
+\e(c@#FFF701)You must for the next blockshuffle to start (Minimum 2 players needed).\e(c@#ffffff)
+*** Foxy03 joined the game.
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#5745\e(c@#ffffff)\e(c@#FEFF42) has started!\e(c@#ffffff)\e(c@#ffffff)
+You must find and punch \e(T@stairs)Inner Bronze Block Stair\eE [stairs:stair_inner_bronzeblock]
+\e(c@#FEFF42)Fleckenstein has voted to skip the turn.\e(c@#ffffff)
+\e(c@#FEFF42)Foxy03 has voted to skip the turn.\e(c@#ffffff)
+You must find and punch \e(T@stairs)Outer Gold Block Stair\eE [stairs:stair_outer_goldblock]
+\e(c@#FEFF42)Skipped turn!\e(c@#ffffff)
+\e(c@#4FFF01)Foxy03 has found their block!\e(c@#ffffff)
+# Server: version=5.3.0-dev, uptime=6.84, max_lag=0.0984716, clients={Fleckenstein}
+# Server: Disclaimer: There may be unsolvable quests.
+*** Fleckenstein joined the game.
+\e(c@#FFF701)You must for the next blockshuffle to start (Minimum 2 players needed).\e(c@#ffffff)
+*** Foxy03 joined the game.
+\e(c@#FF0000)There is no blockshuffle running!\e(c@#ffffff)
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#4285\e(c@#ffffff)\e(c@#FEFF42) has started!\e(c@#ffffff)\e(c@#ffffff)
+You must find and punch \e(T@stairs)Desert Sandstone Brick Stair\eE [stairs:stair_desert_sandstone_brick]
+\e(c@#FEFF42)Fleckenstein has voted to skip the turn.\e(c@#ffffff)
+\e(c@#FEFF42)Foxy03 has voted to skip the turn.\e(c@#ffffff)
+You must find and punch \e(T@stairs)Stone Slab\eE [stairs:slab_stone]
+\e(c@#FEFF42)Skipped turn!\e(c@#ffffff)
+<Fleckenstein> t/skip
+\e(c@#FEFF42)Fleckenstein has voted to skip the turn.\e(c@#ffffff)
+\e(c@#FF0000)You already have voted!\e(c@#ffffff)
+\e(c@#FEFF42)Foxy03 has voted to skip the turn.\e(c@#ffffff)
+You must find and punch \e(T@default)Steel Block\eE [default:steelblock]
+\e(c@#FEFF42)Skipped turn!\e(c@#ffffff)
+\e(c@#FEFF42)Foxy03 has voted to skip the turn.\e(c@#ffffff)
+\e(c@#FEFF42)Fleckenstein has voted to skip the turn.\e(c@#ffffff)
+You must find and punch \e(T@default)Jungle Tree\eE [default:jungletree]
+\e(c@#FEFF42)Skipped turn!\e(c@#ffffff)
+\e(c@#4FFF01)Fleckenstein has found their block!\e(c@#ffffff)
+*** Server shutting down
+# Server: version=5.3.0-dev, uptime=6.21, max_lag=0.0986096, clients={Fleckenstein}
+# Server: Disclaimer: There may be unsolvable quests.
+*** Fleckenstein joined the game.
+\e(c@#FFF701)You must for the next blockshuffle to start (Minimum 2 players needed).\e(c@#ffffff)
+*** Foxy03 joined the game.
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#7080\e(c@#ffffff)\e(c@#FEFF42) has started!\e(c@#ffffff)\e(c@#ffffff)
+\e(c@131059)You must find and punch \e(T@vessels)Empty Heavy Steel Bottle\eE [vessels:steel_bottle]\e(c@#ffffff)
+\e(c@#FEFF42)Fleckenstein has voted to skip the turn.\e(c@#ffffff)
+\e(c@#FEFF42)Foxy03 has voted to skip the turn.\e(c@#ffffff)
+\e(c@#FEFF42)Skipped turn!\e(c@#ffffff)
+\e(c@131059)You must find and punch \e(T@farming)Savanna Soil\eE [farming:dry_soil]\e(c@#ffffff)
+\e(c@#FEFF42)Foxy03 has voted to skip the turn.\e(c@#ffffff)
+\e(c@#FEFF42)Fleckenstein has voted to skip the turn.\e(c@#ffffff)
+\e(c@#FEFF42)Skipped turn!\e(c@#ffffff)
+\e(c@131059)You must find and punch \e(T@default)Apple\eE [default:apple]\e(c@#ffffff)
+\e(c@#4FFF01)Fleckenstein has found their block!\e(c@#ffffff)
+-!- Invalid command: turn_end
+\e(c@#FEFF42)Ended turn!\e(c@#ffffff)
+\e(c@#FFB001)Foxy03 has lost the Blockshuffle because they did not find their block in time.\e(c@#ffffff)
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#7080\e(c@#ffffff)\e(c@#FEFF42) is over. Winner: Fleckenstein\e(c@#ffffff)\e(c@#ffffff)
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)nil\e(c@#ffffff)\e(c@#FEFF42) is over. There is no winner.\e(c@#ffffff)\e(c@#ffffff)
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#8581\e(c@#ffffff)\e(c@#FEFF42) has started!\e(c@#ffffff)\e(c@#ffffff)
+\e(c@131059)You must find and punch \e(T@stairs)Inner Cobblestone Stair\eE [stairs:stair_inner_cobble]\e(c@#ffffff)
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#8581\e(c@#ffffff)\e(c@#FEFF42) is over. Remaining Players: Fleckenstein, Foxy03\e(c@#ffffff)\e(c@#ffffff)
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#2945\e(c@#ffffff)\e(c@#FEFF42) has started!\e(c@#ffffff)\e(c@#ffffff)
+\e(c@131059)You must find and punch \e(T@default)Permafrost with Stones\eE [default:permafrost_with_stones]\e(c@#ffffff)
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#2945\e(c@#ffffff)\e(c@#FEFF42) is over. Remaining Players: Fleckenstein, Foxy03\e(c@#ffffff)\e(c@#ffffff)
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#743\e(c@#ffffff)\e(c@#FEFF42) has started!\e(c@#ffffff)\e(c@#ffffff)
+\e(c@131059)You must find and punch \e(T@doors)Obsidian Glass Door\eE [doors:door_obsidian_glass_b]\e(c@#ffffff)
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#743\e(c@#ffffff)\e(c@#FEFF42) is over. Remaining Players: Fleckenstein, Foxy03\e(c@#ffffff)\e(c@#ffffff)
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#7317\e(c@#ffffff)\e(c@#FEFF42) has started!\e(c@#ffffff)\e(c@#ffffff)
+\e(c@131059)You must find and punch \e(T@stairs)Desert Stone Slab\eE [stairs:slab_desert_stone]\e(c@#ffffff)
+\e(c@#FEFF42)Ended turn!\e(c@#ffffff)
+\e(c@#FFB001)Fleckenstein has lost the Blockshuffle because they did not find their block in time.\e(c@#ffffff)
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#7317\e(c@#ffffff)\e(c@#FEFF42) is over. Winner: Foxy03\e(c@#ffffff)\e(c@#ffffff)
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)nil\e(c@#ffffff)\e(c@#FEFF42) is over. There is no winner.\e(c@#ffffff)\e(c@#ffffff)
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#2530\e(c@#ffffff)\e(c@#FEFF42) has started!\e(c@#ffffff)\e(c@#ffffff)
+\e(c@131059)You must find and punch \e(T@default)Apple Marker\eE [default:apple_mark]\e(c@#ffffff)
+\e(c@#FEFF42)Ended turn!\e(c@#ffffff)
+\e(c@#FFB001)Fleckenstein has lost the Blockshuffle because they did not find their block in time.\e(c@#ffffff)
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#2530\e(c@#ffffff)\e(c@#FEFF42) is over. Winner: Foxy03\e(c@#ffffff)\e(c@#ffffff)
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)nil\e(c@#ffffff)\e(c@#FEFF42) is over. There is no winner.\e(c@#ffffff)\e(c@#ffffff)
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#876\e(c@#ffffff)\e(c@#FEFF42) has started!\e(c@#ffffff)\e(c@#ffffff)
+\e(c@131059)You must find and punch \e(T@default)Aspen Tree Sapling\eE [default:aspen_sapling]\e(c@#ffffff)
+\e(c@#FEFF42)Ended turn!\e(c@#ffffff)
+\e(c@#FFB001)Fleckenstein has lost the Blockshuffle because they did not find their block in time.\e(c@#ffffff)
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#876\e(c@#ffffff)\e(c@#FEFF42) is over. Winner: Foxy03\e(c@#ffffff)\e(c@#ffffff)
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)nil\e(c@#ffffff)\e(c@#FEFF42) is over. There is no winner.\e(c@#ffffff)\e(c@#ffffff)
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#3810\e(c@#ffffff)\e(c@#FEFF42) has started!\e(c@#ffffff)\e(c@#ffffff)
+\e(c@131059)You must find and punch \e(T@default)Jungle Tree\eE [default:jungletree]\e(c@#ffffff)
+*** Server shutting down
+# Server: version=5.3.0-dev, uptime=5.04, max_lag=0.0988664, clients={Fleckenstein}
+# Server: Disclaimer: There may be unsolvable quests.
+*** Fleckenstein joined the game.
+\e(c@#FFF701)You must for the next blockshuffle to start (Minimum 2 players needed).\e(c@#ffffff)
+*** Foxy03 joined the game.
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#7153\e(c@#ffffff)\e(c@#FEFF42) has started!\e(c@#ffffff)\e(c@#ffffff)
+\e(c@#01FFF3)You must find and punch \e(T@stairs)Inner Glass Stair\eE [stairs:stair_inner_glass]\e(c@#ffffff)
+\e(c@#FEFF42)Fleckenstein has voted to skip the turn.\e(c@#ffffff)
+\e(c@#FEFF42)Foxy03 has voted to skip the turn.\e(c@#ffffff)
+\e(c@#FEFF42)Skipped turn!\e(c@#ffffff)
+\e(c@#01FFF3)You must find and punch \e(T@stairs)Inner Desert Cobblestone Stair\eE [stairs:stair_inner_desert_cobble]\e(c@#ffffff)
+\e(c@#FEFF42)Fleckenstein has voted to skip the turn.\e(c@#ffffff)
+\e(c@#FEFF42)Foxy03 has voted to skip the turn.\e(c@#ffffff)
+\e(c@#FEFF42)Skipped turn!\e(c@#ffffff)
+\e(c@#01FFF3)You must find and punch  [farming:cotton_6]\e(c@#ffffff)
+\e(c@#FEFF42)Fleckenstein has voted to skip the turn.\e(c@#ffffff)
+\e(c@#FEFF42)Foxy03 has voted to skip the turn.\e(c@#ffffff)
+\e(c@#FEFF42)Skipped turn!\e(c@#ffffff)
+\e(c@#01FFF3)You must find and punch \e(T@default)Apple Tree Leaves\eE [default:leaves]\e(c@#ffffff)
+\e(c@#4FFF01)Fleckenstein has found their block!\e(c@#ffffff)
+\e(c@#FEFF42)Ended turn!\e(c@#ffffff)
+\e(c@#FFB001)Foxy03 has lost the Blockshuffle because they did not find their block in time.\e(c@#ffffff)
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#7153\e(c@#ffffff)\e(c@#FEFF42) is over. Winner: Fleckenstein\e(c@#ffffff)\e(c@#ffffff)
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#4731\e(c@#ffffff)\e(c@#FEFF42) has started!\e(c@#ffffff)\e(c@#ffffff)
+\e(c@#01FFF3)You must find and punch \e(T@default)Flowing Water\eE [default:water_flowing]\e(c@#ffffff)
+\e(c@#FEFF42)Ended turn!\e(c@#ffffff)
+\e(c@#FFB001)Fleckenstein has lost the Blockshuffle because they did not find their block in time.\e(c@#ffffff)
+\e(c@#FFB001)Foxy03 has lost the Blockshuffle because they did not find their block in time.\e(c@#ffffff)
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#4731\e(c@#ffffff)\e(c@#FEFF42) is over. There is no winner.\e(c@#ffffff)\e(c@#ffffff)
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#8579\e(c@#ffffff)\e(c@#FEFF42) has started!\e(c@#ffffff)\e(c@#ffffff)
+\e(c@#01FFF3)You must find and punch \e(T@default)Pine Bush Sapling\eE [default:pine_bush_sapling]\e(c@#ffffff)
+*** Foxy03 left the game.
+\e(c@#FFB001)Foxy03 has lost the Blockshuffle because they left the game.\e(c@#ffffff)
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#8579\e(c@#ffffff)\e(c@#FEFF42) is over. Winner: Fleckenstein\e(c@#ffffff)\e(c@#ffffff)
+*** Foxy03 joined the game.
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#1431\e(c@#ffffff)\e(c@#FEFF42) has started!\e(c@#ffffff)\e(c@#ffffff)
+\e(c@#01FFF3)You must find and punch  [farming:wheat_4]\e(c@#ffffff)
+\e(c@#FEFF42)Fleckenstein has voted to skip the turn.\e(c@#ffffff)
+\e(c@#FEFF42)Foxy03 has voted to skip the turn.\e(c@#ffffff)
+\e(c@#FEFF42)Skipped turn!\e(c@#ffffff)
+\e(c@#01FFF3)You must find and punch  [tnt:tnt_burning]\e(c@#ffffff)
+\e(c@#FEFF42)Fleckenstein has voted to skip the turn.\e(c@#ffffff)
+\e(c@#FEFF42)Foxy03 has voted to skip the turn.\e(c@#ffffff)
+\e(c@#FEFF42)Skipped turn!\e(c@#ffffff)
+\e(c@#01FFF3)You must find and punch \e(T@xpanes)Obsidian Glass Pane\eE [xpanes:obsidian_pane]\e(c@#ffffff)
+\e(c@#FEFF42)Fleckenstein has voted to skip the turn.\e(c@#ffffff)
+\e(c@#FEFF42)Foxy03 has voted to skip the turn.\e(c@#ffffff)
+\e(c@#FEFF42)Skipped turn!\e(c@#ffffff)
+\e(c@#01FFF3)You must find and punch \e(T@stairs)Desert Stone Brick Stair\eE [stairs:stair_desert_stonebrick]\e(c@#ffffff)
+\e(c@#FEFF42)Fleckenstein has voted to skip the turn.\e(c@#ffffff)
+\e(c@#FEFF42)Foxy03 has voted to skip the turn.\e(c@#ffffff)
+\e(c@#FEFF42)Skipped turn!\e(c@#ffffff)
+\e(c@#01FFF3)You must find and punch \e(T@fireflies)Firefly\eE [fireflies:firefly]\e(c@#ffffff)
+\e(c@#FEFF42)Fleckenstein has voted to skip the turn.\e(c@#ffffff)
+\e(c@#FEFF42)Foxy03 has voted to skip the turn.\e(c@#ffffff)
+\e(c@#FEFF42)Skipped turn!\e(c@#ffffff)
+\e(c@#01FFF3)You must find and punch \e(T@stairs)Outer Brick Stair\eE [stairs:stair_outer_brick]\e(c@#ffffff)
+\e(c@#FEFF42)Foxy03 has voted to skip the turn.\e(c@#ffffff)
+\e(c@#FEFF42)Fleckenstein has voted to skip the turn.\e(c@#ffffff)
+\e(c@#FEFF42)Skipped turn!\e(c@#ffffff)
+\e(c@#01FFF3)You must find and punch \e(T@xpanes)Glass Pane\eE [xpanes:pane_flat]\e(c@#ffffff)
+\e(c@#FEFF42)Fleckenstein has voted to skip the turn.\e(c@#ffffff)
+\e(c@#FEFF42)Foxy03 has voted to skip the turn.\e(c@#ffffff)
+\e(c@#FEFF42)Skipped turn!\e(c@#ffffff)
+\e(c@#01FFF3)You must find and punch \e(T@default)Locked Chest\eE [default:chest_locked]\e(c@#ffffff)
+\e(c@#FEFF42)Foxy03 has voted to skip the turn.\e(c@#ffffff)
+\e(c@#FEFF42)Fleckenstein has voted to skip the turn.\e(c@#ffffff)
+\e(c@#FEFF42)Skipped turn!\e(c@#ffffff)
+\e(c@#01FFF3)You must find and punch \e(T@stairs)Desert Stone Stair\eE [stairs:stair_desert_stone]\e(c@#ffffff)
+\e(c@#4FFF01)Foxy03 has found their block!\e(c@#ffffff)
+\e(c@#FEFF42)Ended turn!\e(c@#ffffff)
+\e(c@#FFB001)Fleckenstein has lost the Blockshuffle because they did not find their block in time.\e(c@#ffffff)
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#1431\e(c@#ffffff)\e(c@#FEFF42) is over. Winner: Foxy03\e(c@#ffffff)\e(c@#ffffff)
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#8248\e(c@#ffffff)\e(c@#FEFF42) has started!\e(c@#ffffff)\e(c@#ffffff)
+\e(c@#01FFF3)You must find and punch \e(T@default)Silver Sandstone Brick\eE [default:silver_sandstone_brick]\e(c@#ffffff)
+# Server: version=5.3.0-dev, uptime=21.15, max_lag=0.0953892, clients={Fleckenstein}
+# Server: Disclaimer: There may be unsolvable quests.
+*** Fleckenstein joined the game.
+\e(c@#FFF701)You must for the next blockshuffle to start (Minimum 2 players needed).\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=32.671, max_lag=1.6957, clients={Foxy03, Fleckenstein}
+*** Foxy03 joined the game.
+\e(c@#FFF701)You must for the next blockshuffle to start (Minimum 2 players needed).\e(c@#ffffff)
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#2271\e(c@#ffffff)\e(c@#FEFF42) has started!\e(c@#ffffff)\e(c@#ffffff)
+\e(c@#01FFF3)You must find and punch \e(T@mcl_stairs)Andesite Stairs\eE [mcl_stairs:stair_andesite_inner]\e(c@#ffffff)
+\e(T@mcl_death_messages)\eFFoxy03\eE was shot by an arrow from \eF\eE.\eE
+\e(T@mcl_death_messages)\eFFleckenstein\eE was shot by an arrow from a skeleton.\eE
+\e(c@#FEFF42)Fleckenstein has voted to skip the turn.\e(c@#ffffff)
+\e(c@#FFB001)Fleckenstein has lost the Blockshuffle because they did not find their block in time.\e(c@#ffffff)
+\e(c@#FFB001)Foxy03 has lost the Blockshuffle because they did not find their block in time.\e(c@#ffffff)
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#2271\e(c@#ffffff)\e(c@#FEFF42) is over. There is no winner.\e(c@#ffffff)\e(c@#ffffff)
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#9246\e(c@#ffffff)\e(c@#FEFF42) has started!\e(c@#ffffff)\e(c@#ffffff)
+\e(c@#01FFF3)You must find and punch \e(T@mcl_farming)Jack o'Lantern\eE
+\e(c@#01FFF3)\e(c@#d0ffd0)\e(T@tt)Luminance: \eF14\eE\eE\e(c@#ffffff) [mcl_farming:pumpkin_face_light]\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=2.389, max_lag=2.01197, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FFF701)You must for the next blockshuffle to start (Minimum 2 players needed).\e(c@#ffffff)
+*** Foxy03 joined the game.
+Privileges of Fleckenstein: interact debug maphack basic_privs password ban shout kick privs server
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#2271\e(c@#ffffff)\e(c@#FEFF42) has started!\e(c@#ffffff)\e(c@#ffffff)
+\e(c@#01FFF3)You must find and punch \e(T@mesecons_wires)Powered Redstone Trail (\eF10100000\eE)\eE [mesecons:wire_10100000_on]\e(c@#ffffff)
+\e(T@mcl_death_messages)\eFFoxy03\eE was shot by an arrow from \eF\eE.\eE
+You don't have permission to run this command (missing privilege: settime).
+Privileges of Fleckenstein: interact debug maphack basic_privs password ban shout kick settime privs server
+Time of day changed.
+\e(T@mcl_death_messages)\eFFleckenstein\eE was shot by an arrow from a skeleton.\eE
+\e(c@#FEFF42)Fleckenstein has voted to skip the turn.\e(c@#ffffff)
+\e(c@#FFB001)Fleckenstein has lost the Blockshuffle because they did not find their block in time.\e(c@#ffffff)
+\e(c@#FFB001)Foxy03 has lost the Blockshuffle because they did not find their block in time.\e(c@#ffffff)
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#2271\e(c@#ffffff)\e(c@#FEFF42) is over. There is no winner.\e(c@#ffffff)\e(c@#ffffff)
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#9246\e(c@#ffffff)\e(c@#FEFF42) has started!\e(c@#ffffff)\e(c@#ffffff)
+\e(c@#01FFF3)You must find and punch \e(T@mcl_stairs)Upper \eF\e(T@mcl_stairs)Dark Prismarine Slab\eE\eE\eE [mcl_stairs:slab_prismarine_dark_top]\e(c@#ffffff)
+*** Foxy03 left the game.
+\e(c@#FFB001)Foxy03 has lost the Blockshuffle because they left the game.\e(c@#ffffff)
+\e(c@#FEFF42)The Blockshuffle \e(c@#01FFF3)#9246\e(c@#ffffff)\e(c@#FEFF42) is over. Winner: Fleckenstein\e(c@#ffffff)\e(c@#ffffff)
+# Server: version=5.2.0-dev, uptime=72070.3, max_lag=0.200937, clients={Fleckenstein, luka20, Harry, Lenni, brothersome, KarinG, KeineAhnung2}
+# Server: Besser als Schule ist nur spielerisches Lernen. Mehr Infos unter http://bit.ly/coronaserver
+*** Fleckenstein joined the game.
+<brothersome> Hee, Fleckenstein
+<Fleckenstein> hi
+Time of day changed.
+Teleporting to brothersome at (-485.28598022461,-0.5,2539.4968261719)
+<brothersome> Oh, du bist admin
+<Fleckenstein> ja
+<Harry> ich bin peter ich hätte gerne flugrechte
+<brothersome> Ich hab bei spawn meine favourite Wohnung gemacht
+<brothersome> Hier ist meine Heimat
+<brothersome> Und Ich hab fur spawn geproduciert
+<KarinG> hallo harry fligrechce sind nur den lehrkrefden und admins vorbestimmt normalerweise. auser halt bei laufenden events. brpther ich komm demnechst noch mal schauen ;)
+Ban list: 95.90.183.153|joshua
+<KarinG> guten morgen Fleckenstein
+<Fleckenstein> hi
+Time of day changed.
+<KarinG> klopf klopf, ich komm mal bei dir gucken brother :)
+<KarinG> schon klasse
+*** KeineAhnung2 left the game. (timed out)
+Time of day changed.
+<KarinG> Fleckenstein: kommst du mal bitte? bin in der nehe das abstieges von spawn von okka
+<KarinG> unten bin ich
+<Fleckenstein> 7Teleport KarinG
+Teleporting to KarinG at (117.11000061035,9.5,424.0719909668)
+<Harry> bitte bitte bitte bittte Flugrechte
+<Fleckenstein> das ist nicht meine entscheidung
+<KarinG> hier drin sind Linus alte knovchen, er hette sie gern wieder, kommt abber nicht ran
+<KarinG> ja und Peanut noch nicht gesehen hier, ich frag mich, wie linus da reinfallen konnte
+\e(T@unified_inventory)Inventory cleared!\eE
+\e(T@unified_inventory)Inventory cleared!\eE
+*** Moritz5d joined the game.
+<KarinG> guten morgen motitz
+<Moritz5d> moin
+<Harry> BITTE BITTE BITTTE BITTTE BITTTE BITTTE BITTTTE BITTE
+<Fleckenstein> lass das bleiben
+<Fleckenstein> ich darf dir keine rechte geben das ist nicht meine aufgabe
+<KarinG> jau habs endlich geschaffd, hier heile runterzuklettern
+<Moritz5d> wer hat meine Dia Rüstung keklaut :(
+<Fleckenstein> joshua2
+<KarinG> oweh die fehlt die auch? nicht nur Ava :-(
+Time of day changed.
+<KarinG> das heist, wenn deine tür zu ist, hat der bengel unerlaubterweise flugrechde ?
+<KarinG> moritz ich komm zu dir ebend
+<Moritz5d> ICH HABE NICHT UNENTLICH DIAS
+"default:diamond 31" added to Moritz5d's inventory.
+<Fleckenstein> Moritz5d: ich habe dir dias für ne neue rüstung gegeben
+<Moritz5d> Danke
+<Fleckenstein> KarinG: komm mal her ich zeige dir wie man ohne flugrechte in das gebäude kommt
+<KarinG> zum spawn? ich komme
+# Server: version=5.2.0-dev, uptime=74233.7, max_lag=0.147752, clients={Moritz5d, Fleckenstein, luka20, Harry, Lenni, brothersome, KarinG}
+# Server: Besser als Schule ist nur spielerisches Lernen. Mehr Infos unter http://bit.ly/coronaserver
+Teleporting KarinG to Fleckenstein at (135.80799865723,4.5,439.04598999023)
+*** 4starfighter2 joined the game.
+<Fleckenstein> mit fast
+*** 4starfighter2 left the game.
+<KarinG> oke danke, und das ohne zu setreben, so kann er seine knochen sich holen :)
+Teleporting to KarinG at (111.15000152588,20.5,452.80001831055)
+<KarinG> ich schaff es mit schnellmodus nicht mal
+Teleporting to KarinG at (109.80000305176,6.5,466.47900390625)
+<KarinG> tot lol
+<Harry> ich kann nichts machen ich will jetzt flugrechte
+<Fleckenstein> nein, hör auf damit
+<Fleckenstein> oder ich werde dich melden
+<KarinG> ich klettere wueder unter Fleckenstein
+*** Moritz5d left the game.
+<KarinG> harry, du kannst übern eifelturm im inventar zu nen andern POI gelangen, musst dich nicht in tot stürtzen
+<KarinG> hey luka
+<KarinG> moment wieso fliegst du? ferdattert bin
+-!- Invalid command: Teleport
+Teleporting to KarinG at (137.20500183105,5.5,429.31298828125)
+Privileges of luka20: fast, home, zoom, spawn, interact, student, shout, fly
+<Fleckenstein> ja luka20 kann fliegen
+<KarinG> Fleckenstein: möchte dir was geben, was ich gefunden habe ebend
+<Fleckenstein> 99 Sandstone
+<Fleckenstein> ?
+<KarinG> so viele aufn mal beim halben abstieg
+<KarinG> jo
+"default:sandstone 100" added to inventory.
+"default:sandstone 101" added to KarinG's inventory.
+<Fleckenstein> ist das nicht lustig?
+<KarinG> du machst dich gut als frau :D
+<Fleckenstein> :-)
+Time of day changed.
+<KarinG> lila ausrüstung würde mir pptisch gelllen, lila schuhe mein ich, wie kann man die herstellen?
+"default:apple 123" added to inventory.
+"default:apple 123" added to inventory.
+An item was pulverized.
+An item was pulverized.
+<KarinG> gefallen und nicht gellen
+*** Lenni left the game.
+<Fleckenstein> kann man nicht hgerstellen
+<Fleckenstein> das ist admin rüstung
+<KarinG> a oke alles klar, dann war ich zumindest nicht zu dumm die zu finen
+Cannot give an unknown item
+Cannot give an unknown item
+<Fleckenstein> wenn ich die anhabe bekomme ich gar keinen schaden
+<Harry> ich will flugrechte
+<KarinG> ta ferstehe, und schicke farbe :) klar bin ja ein medel
+<Fleckenstein> pink ist meine lieblingsfarbe
+<Fleckenstein> aber ich bin ein junge
+<KarinG> ui deine auch? da bin ich nun platt
+<KarinG> was für ne aussicht :) lohnte sich nach oben zu bauen
+<KarinG> waa nun bin ich im gefengnis
+"default:apple 17066" added to inventory.
+Cleared Fleckenstein's inventory.
+"default:apple 9" added to inventory.
+Cleared Fleckenstein's inventory.
+"default:apple 65535" added to inventory.
+Time of day changed.
+<KarinG> puuu befreit
+<Harry> IST DEIN AKKKU LEER
+<luka20> ja
+*** Harry left the game.
+DM from KarinG: ich weis ja das du ein junge bist :)
+DM from KarinG: und man merkt gleiuch das Zizzi66 und raupy66 gestern nicht online waren. Bücherei wurde nun nicht beschedigt
+*** brothersome left the game.
+*** clarisse6 joined the game.
+*** Moritz5d joined the game.
+<Moritz5d> komm zu meinem haus
+<KarinG> du müsstest baurechde hier haben, probier bitte mal
+<Moritz5d> warum gehört das dir ist mein aus
+<KarinG> huiii die kaktusrüstung nice
+<KarinG> ich hab dir den klauschutz eingebaut und dr die rtechde logisch, es bleibt dein haus
+<KarinG> geht nicht? dann habe ich mich beim namen fertippt
+<Moritz5d> ok                          nein
+<KarinG> name steht abber richtig drin 
+<Moritz5d> ich kann abbauen
+<KarinG> oke dann kannst du auch aufbauen, und keiner kann dir was klauen
+*** luka20 left the game.
+<KarinG> und ich mache hier nichts, das weist du ja
+<Moritz5d> kannst du dass Abbauen und mir geben ich will besitzer sein
+-!- Invalid command: tim
+Time of day changed.
+<KarinG> nun ist die wand hinter den fernsehen nicht mit in schutz
+<Moritz5d> egan
+<Moritz5d> egal
+<KarinG> hette in diesem bereuch sein müssen ;)
+<KarinG> kannst behalten kein ding, war nun um dir zu zeigen in welchen blockbereich
+<Moritz5d> du kanst auch Abbauen
+<KarinG> war nur als tesd
+*** mrkanister joined the game.
+<Moritz5d> stand da blos ein Fernser
+<KarinG> abber ich mach dir nichts kaputt
+<KarinG> ja und ich weis, gestern waren es zwei
+<KarinG> ich hab abber nopch einen moment
+<Moritz5d> muss essen
+*** Moritz5d left the game.
+<KarinG> guten hunger
+*** mrkanister left the game.
+*** brothersome joined the game.
+*** KarinG left the game.
+*** Ava joined the game.
+*** KarinG joined the game.
+*** KarinG left the game.
+*** uno joined the game.
+<uno> hi
+<brothersome> Hi
+<uno> are teacher on the server ???
+<brothersome> Mainly talk here is in german
+<uno> speak you german
+<brothersome> Also
+<uno> i speak german
+<Ava> hi alle zu sammen
+<uno> hallo
+<brothersome> Allo allo, wie gehtst
+<uno> hää ein pvp server ohne pvp lol
+*** Moritz5d joined the game.
+*** clarisse6 left the game.
+*** KarinG joined the game.
+<Moritz5d> hi
+<uno> doofer corona deswegen wurde meine jugendweie verschoben
+<KarinG> huhu
+<uno> hhi
+<Moritz5d> hehe
+<KarinG> uno, abber besser ferschoben als das wer sich den virus einfengt, ist nur zu eurem besten, auch wenn es sich anders anfühlt
+<uno> warum hehe
+<uno> stimmt auch wieder
+<KarinG> hallo ava :)
+<Ava> hiKarinG
+<KarinG> hab dein haus gefunden :)
+<KarinG> gemütlich hier
+<Ava> und wie ist es?
+<KarinG> schick
+<Ava> danke
+<KarinG> bitte schön, wollt ja anklopfen, abber das hat sich bei der türr ja erlediugt
+<Ava> häääääää
+<KarinG> o moritz is in da haus
+<KarinG> bei den platten die die tür selber aufmachen
+<Moritz5d> cooles Haus is besser als meins
+<Ava> war andera heute schon onlein???
+<KarinG> nicht zu  der zeit wo ich hier war, denke also nicht
+<uno> wie komm ich hier runter ohne zu sterben
+# Server: version=5.2.0-dev, uptime=97963.7, max_lag=0.211494, clients={Fleckenstein, Pixo, Kati, KarinG, bimi, friedrich, hahi}
+# Server: Besser als Schule ist nur spielerisches Lernen. Mehr Infos unter http://bit.ly/coronaserver
+*** Fleckenstein joined the game.
+\e(T@unified_inventory)Time of day set to 6am\eE
+<KarinG> sry Fleckenstein zwei mal hatte ich die schon repariert gehabt, voegerstern, gestern waren diese spieler nicht online und nun . sihst ja selber 
+<KarinG> und der der bei ava reuberte ebend, ist bestimmt wieder dort, abber weis es natürlich nicht, bin ja wieder hier
+<bimi> hi
+<KarinG> nicht ins loch reinfallen bimi ;)
+<bimi> okay
+<KarinG> hier in der mitte war ein wunderschönen brunnen
+<bimi> kann ich irgentwie mithelfen?
+<KarinG> och warte nun bis der gedankenschöpfer wieder da ist, den brunnen bekomm ich nicht hin, und unseren fleckenstein will ich nicht einbauen, um den boden zu reparieren, da warte ich mit allem nun
+<bimi> okay
+<KarinG> willt nicht durch hdich hindurch ;)
+<KarinG> mich ergert es nur, das einige meinen, kaputt machen were geil
+<KarinG> o ich habn spiegelbild :D
+<bimi> haha
+<KarinG> hier war auch so ne gebaute flanze
+<bimi> aha
+<KarinG> hier eher
+*** HarryFan joined the game.
+<KarinG> hier war ich schon mal reingefalln, drum wusste ich wo ich raus komme, hab mir den aufstieg selber gebastelt
+*** bimi left the game. (timed out)
+*** bimi joined the game.
+<KarinG> na du vom server flieger ;)
+*** friedrich left the game. (timed out)
+*** friedrich joined the game.
+*** brothersome joined the game.
+<HarryFan> rtt43322rt
+*** Pixo left the game. (timed out)
+<KarinG> petger was ist das für ne zahlen und buchatahben kombination bitte?
+<KarinG> peter mein ich und nicht petger
+<KarinG> hahi hier scheinen die auch gewesen zu sein
+<hahi> ja, hab ich auch gerade gesehen...
+<KarinG> die lampen hab ich gerade aufgestellt um zu gucken, ob alles oke ist
+<hahi> oh, gar keine spitzhacken mehr.. ich wollte auch eine...
+<KarinG> ich bekomm noch die kriese mit den dreien,, denke alles jungs, nur mein gedanke, kein vorurteil .. haben die wohl auch alle mitgemomm
+<KarinG> ider joshua .. jemachdem
+*** friedrich left the game.
+<hahi> schöner mist.. sorry ich hab noch was zu tun.. muss kurz home...
+*** Erkan5 joined the game.
+<bimi> hi KarinG
+<KarinG> hi bimi
+<KarinG> so ich sammel meine lampen wieder ein, nicht das die auch noch beine bekommen
+<KarinG> hatte ebend nur wegen dem gucken, die lampen aufgestellt da, um nach dem rechden zu sehen :(
+<bimi> gehe jetzt mal nahause  Tschüss
+<KarinG> schüüü bimi
+*** hahi left the game.
+*** Erkan5 left the game.
+<KarinG> brother bist noch da?
+<KarinG> dein schutzbereich geht zu weit der geht ins andre gebeude über, wollte da grad die scheden reparieren
+<KarinG> du hast nicht nur dein haus und deinen garten unter schutz gesetzt
+<KarinG> sigar das für alle zugengliche beet
+*** HarryFan left the game. (timed out)
+# Server: version=5.2.0-dev, uptime=172415, max_lag=0.218804, clients={Foxy03, Fleckenstein, Jakob_E, Linus, Miniminaut, royale-nw, Knut, KarinG}
+# Server: Besser als Schule ist nur spielerisches Lernen. Mehr Infos unter http://bit.ly/coronaserver
+*** Foxy03 joined the game.
+<Foxy03> macht mal /privs Foyx03 dann seht ihr dass ich kein fly oder noclip habe
+Privileges of Foxy03: fast, home, spawn, interact, student, shout, zoom
+<KarinG> wenn es schon gemeinsschafdshalle heist ;) ich finde der bau siht gigantisch gut aus
+*** Kati joined the game.
+<Foxy03> aber guckt euch das an
+<KarinG> stimmt
+<Foxy03> ohne die privs
+<KarinG> jaaa
+<KarinG> und wieder was gelernt, was ich wussen muss :D
+<Foxy03> ich kann das übrigends auf jedem server
+<Jakob_E>  Wollen wir einen Club bilden?
+<KarinG> wow
+<Foxy03> was soll der sinn des clubs sein?
+<Jakob_E>  Was?
+DM from KarinG: ich hab grad geguckt ob jishua2 flugrechde hat und kreatif .. alles gut
+Message sent.
+<Jakob_E> Ähm... Wir bauen sachen
+<Foxy03> ok hier oder auf einem anderen server
+<KarinG> megastarke halle
+DM from KarinG: ich hoffe es
+<Foxy03> kann jemand schach?
+<Jakob_E> Ja ich!
+<Foxy03> wollen wir eine runde spielen?
+Teleporting to spawn
+<KarinG> ich weis nur wie welche figur laufen kann, mehr nicht, also nicht wirklich, .. nicht so mein gebiet, da muss man lang still sitzen ;)
+<Jakob_E> Genau
+<Jakob_E>  Foxy03 Kommst du?
+You don't have permission to run this command (missing privileges: teleport)
+<Jakob_E>  Kans losgehen?
+<Foxy03> ja
+<KarinG> so dann werde ich das zerstörte nun wieder ganz richten, stuhl und tisch hat er ja fallen gelassen vor dem bau
+<Jakob_E>  Spilen wir jetzt?
+<Foxy03> ja
+<Jakob_E>  Gut
+<Foxy03> du bist dran
+*** Knut left the game.
+<KarinG> och nööö pedros ist ja auch komplett zerdeppert, das bekomm ich nun abber nicht mehr hin, so sehr zerbettert wars noch nie
+<Jakob_E>  Ich kann irgentwi ichs bewegen !?
+<Foxy03> du bist schwarz
+<Jakob_E>  Aha
+<KarinG> ich bekomm das glas nivcht mittig, tritz schraubenziher
+<Jakob_E>  Da kann mann keine Hochade machen!
+<Foxy03> ja das geht leider nicht
+You don't have permission to run this command (missing privileges: server)
+*** Fleckenstein left the game.
+<KarinG> na war am reparieren was geht :)
+<Foxy03> muss gehen
+*** leLJNlp joined the game.
+<KarinG> oki
+<Foxy03> hmm
+Message sent.
+Message sent.
+<Linus> <-- sagt tschö
+<Linus> tschö
+<Foxy03> Linus: mach doch /me sagt tschö
+<Jakob_E>  Tschö
+*** Linus left the game.
+DM from KarinG: der hat schon eine ferwarnung bekomm, steht unter beobachtung gerade ;) kann abber zum glück deutsch .. mach ich wenn er wieder .. abber er wscheint es nun geschnallt zu haben, ich beobachte noch mal, ansonsten und schüss
+* Foxy03 sagt tschö
+<KarinG> schööö foxy
+<leLJNlp> schöö
+# Server: version=5.2.0-GalwayGirl, uptime=0.725, max_lag=0.548232, clients={Foxy03}
+*** Foxy03 joined the game.
+You don't have permission to run this command (missing privileges: teleport)
+# Server: version=5.2.0-GalwayGirl, uptime=0.246, max_lag=0.181854, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+Teleporting to (0,0,0)
+Teleporting to (50,50,50)
+# Server: version=5.2.0-GalwayGirl, uptime=0.254, max_lag=0.189848, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.249, max_lag=0.183853, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.269, max_lag=0.204836, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.26, max_lag=0.194844, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.252, max_lag=0.18685, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.341, max_lag=0.243756, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.25, max_lag=0.184852, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.254, max_lag=0.189848, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.254, max_lag=0.188849, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+Time of day changed.
+# Server: version=5.2.0-GalwayGirl, uptime=0.256, max_lag=0.191846, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.268, max_lag=0.187812, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.25, max_lag=0.185851, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.256, max_lag=0.191846, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.25, max_lag=0.185851, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.254, max_lag=0.189848, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.273, max_lag=0.191808, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.254, max_lag=0.18785, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.256, max_lag=0.190847, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.252, max_lag=0.18785, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.253, max_lag=0.188849, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.27, max_lag=0.18785, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.269, max_lag=0.188811, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.256, max_lag=0.191846, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.258, max_lag=0.193845, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.272, max_lag=0.191808, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.271, max_lag=0.189848, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.258, max_lag=0.192846, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.265, max_lag=0.198841, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.274, max_lag=0.193806, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+Time of day changed.
+# Server: version=5.2.0-GalwayGirl, uptime=0.276, max_lag=0.195804, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.253, max_lag=0.204877, clients={Fleckenstein1}
+*** Fleckenstein1 joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.257, max_lag=0.192846, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.261, max_lag=0.196842, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#A100BE)Fleckenstein has joined the game. Today is his/her birthday!\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=0.273, max_lag=0.192807, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#DD20FF)Fleckenstein has joined the game. Today is his/her birthday!\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=0.257, max_lag=0.192846, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#DD20FF)Fleckenstein has joined the game. Today is his/her birthday!\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=0.256, max_lag=0.191846, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF20FF)Fleckenstein has joined the game. Today is his/her birthday!\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=0.27, max_lag=0.205835, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF20FF)Fleckenstein has joined the game. Today is his/her birthday!\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=0.266, max_lag=0.200839, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF20FF)Fleckenstein has joined the game. Today is their birthday!\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=0.263, max_lag=0.198841, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+*** Foxy03 joined the game.
+*** Foxy03 left the game.
+*** Foxy03 joined the game.
+\e(c@#FF20FF)Foxy03 has joined the game. Today is their birthday!\e(c@#ffffff)
+*** Foxy03 left the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.259, max_lag=0.194844, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF20FF)Fleckenstein has joined the game. Today is his/her birthday!\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=2.247, max_lag=1.9972, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=2.176, max_lag=2.01318, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=4.086, max_lag=1.98916, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=2.605, max_lag=1.998, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=2.402, max_lag=1.998, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=2.354, max_lag=1.998, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=2.321, max_lag=1.998, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=2.307, max_lag=1.998, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=2.387, max_lag=1.998, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.454, max_lag=0.261529, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+*** somerandomuser joined the game.
+Privileges of somerandomuser: shout interact
+*** somerandomuser left the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.254, max_lag=0.18785, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+/grantall: 
+/revokeall: 
+/grantall: efw, ef, e
+/revokeall: 
+/grantall: efw, ef, e
+/revokeall: fuck
+# Server: version=5.2.0-GalwayGirl, uptime=0.253, max_lag=0.188849, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+/grantall: efw, ef, e
+/revokeall: fuck
+/grantall: efw, ef
+/revokeall: fuck
+# Server: version=5.2.0-GalwayGirl, uptime=0.261, max_lag=0.196842, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+-!- Invalid command: remove_allpriv
+# Server: version=5.2.0-GalwayGirl, uptime=0.273, max_lag=0.191846, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+/grantall: 
+/revokeall: 
+/grantall: tets
+/revokeall: 
+=> GalwayGirl has joined the server
+\e(c@#8800AA)PM from lurk@IRC: Welcome to the server, GalwayGirl! | Have fun!\e(c@#ffffff)
+<pi180> y yo te mando
+(246,1,-320) is protected by keyrano.
+<Spectr> pi
+(246,1,-321) is protected by keyrano.
+(246,1,-321) is protected by keyrano.
+(246,1,-324) is protected by keyrano.
+<pi180> que
+(247,1,-325) is protected by keyrano.
+<Spectr> manda tpr
+(250,1,-327) is protected by keyrano.
+<smile> come
+(250,1,-327) is protected by keyrano.
+(250,1,-330) is protected by keyrano.
+(250,1,-330) is protected by keyrano.
+(250,1,-331) is protected by keyrano.
+(250,1,-331) is protected by keyrano.
+(250,1,-332) is protected by keyrano.
+(250,1,-333) is protected by keyrano.
+(250,1,-334) is protected by keyrano.
+(250,1,-335) is protected by keyrano.
+(250,1,-336) is protected by keyrano.
+=> max1170 has joined the server
+<pi180> no
+(250,1,-337) is protected by keyrano.
+(250,1,-336) is protected by keyrano.
+(249,1,-337) is protected by keyrano.
+(249,1,-337) is protected by keyrano.
+(248,1,-337) is protected by keyrano.
+(248,1,-337) is protected by keyrano.
+(247,1,-340) is protected by keyrano.
+<nickio> look
+<Spectr> si vas a seguir minando
+<pi180> estoy en erra
+<bran58340222> QUIERES CONDUSIR
+<proelian> mi autoooooooooooooooooooooooooooooo
+<nickio> at spawn i cant kill u
+<= ninja23 left the server
+<gatita> ,players
+\e(c@#339933)<trackr@IRC> Players on cat: 20meliodas, E200, Emerythecuttie, GONZALAX, GajaJJ, GalwayGirl, II24kII_Syaz, Jamel--pro, KingDan, Lily__, MaLin4iKk, Michaelle, Nick18, Pemodragon, Spectr, Sterban, TATOPR00, Tuxy, Yad, _Circus_Baby_, _Natsuki_Chr_, aorus, bran58340222, camrn, cyfuh, dodik, dreckos, edwuie, eins_zwei_drei, gatita, goldenkiller, hejs, helloppl, hhfgh, jadstop, kitttykat4, linochka, lucapr00, mahuru, max1170, ndinxkeksn, neche, nickio, omega, pa\e(c@#ffffff)
+\e(c@#339933)<trackr@IRC> Total: 57 players across 1 active server (and 0 inactive servers).\e(c@#ffffff)
+<Michaelle> NICKIO I FUCKING AM GONNA TELL A ADMIN
+<Spectr> Ok voy a conseguir los minerales
+<proelian> mi autooooooooo
+<= pokediger1 left the server (timed out)
+<Jamel--pro> porque tu elian me digo PUto asique le di la abetesia de reper el pueblo tullo
+<smile> come
+=> pokediger1 has joined the server
+<nickio> i didnt kill u at spawn right?
+<= jadstop left the server (timed out)
+<= max1170 left the server
+<Michaelle> I SAID OUTSIDE
+<proelian> ven no sabes donde viovo
+<Michaelle> OF SPAWN
+<= pokediger1 left the server
+<nickio> only if i kill u at SPAWN i get banned
+<bran58340222> AAAAAAA OK
+<Michaelle> DOMMY
+<goldenkiller> NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO:(
+<GajaJJ> emmmm mom
+<smile> camern r u coming
+<proelian> pi jamel nos quiereromper el ublo
+<goldenkiller> NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO :(
+<Jamel--pro> elian me digite puto asique ise esp
+<proelian> pueblo
+<womangamer> what?
+<Michaelle> NO U FUCKING DONT
+<proelian> ok puto
+=> arhur has joined the server
+<pi180> bran acceta
+<bran58340222> OK
+<GajaJJ> why are you dressed as a boy
+<Michaelle> Goldenkiller
+<proelian> pi jamel nosquiere romper el pueblo
+<Michaelle> I I AM A BOY
+<womangamer> you too!
+=> carota has joined the server
+<smile> u have somthing on ur face
+<Spectr> alcalde no se porque dice que estamos en guerra si no nos dieron ningun atentado aun
+<nickio> michaelle here i cant kill u
+<goldenkiller> NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO :(
+<GajaJJ> oh ok...
+<goldenkiller> NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO :(
+-!- Invalid command: homw
+<nickio> but at catcity
+\e(T@sethome)Set a home using /sethome\eE
+<smile> let me get it
+<pi180> manda tp bro
+<Jamel--pro> elian por desime puto bas aberas
+<Jamel--pro> 3
+<Jamel--pro> 2
+<Jamel--pro> 1
+<Jamel--pro> yyyyyyyyyyyyyyyyyyyyyya
+<= Nick18 left the server (timed out)
+<proelian> si jamel nos quiere romper el pueblo
+<Michaelle> Goldenkiller
+<womangamer> gaja!!
+<smile> did u like that kiss
+<camrn> follow
+<= saji left the server (timed out)
+<goldenkiller> what#
+<Jamel--pro> desime pedon y lito elian
+<= arhur left the server
+<womangamer> ok
+<goldenkiller> what*
+<bran58340222> es mi puevlo
+<camrn> yes
+<pi180> bran accetame porfa
+=> sgshshsuusuh has joined the server
+<womangamer> come to sleep
+<proelian> no tu ser mentiroso
+<Michaelle> I need ur help ITS ME HARRY
+<= uz left the server
+\e(T@sethome)Home set!\eE
+<bran58340222> ES MI PUEVLO
+<Sterban> ake
+<Sterban> ake
+<Jamel--pro> pedime pedon elian
+<Sterban> take
+<pi180> bran accetam
+<= neche left the server (timed out)
+<goldenkiller> what is you problem?
+<pi180> acceta
+<bran58340222> JAMEL ES MI PUEVLO
+<womangamer> what are you doing?
+<Michaelle> YES ITS ME HARRY
+=> Nick18 has joined the server
+<smile> where r we going
+<Jamel--pro> no asta que pida pedon elian
+<pi180> elian manda tp
+<proelian> preparese jamel va a venir  a nuestro puebloooo a romperlooooooooooooooooooooooooo atentos
+=> Mia2020is18 has joined the server
+<Pemodragon> who sell coal
+<camrn> a suprise
+<smile> oh look
+<Pemodragon> who sell coal
+<nickio> pemo?
+<Pemodragon> who sell coal
+<Pemodragon> who sell coal
+<proelian> asepta
+=> saji has joined the server
+<Pemodragon> who sell coal
+<bran58340222> ya vinoooooooooooooo
+<Jamel--pro> pedi pedon elian
+<womangamer> mia!!!!
+<Spectr> atentos
+<nickio> ich
+<Mia2020is18> mama
+<bran58340222> YA VINOOOOOOOOOOOOO
+<pi180> esto es la erra
+<suffer_god69> I also need help, nickio killed me an Michelle and then someone stole my money
+<goldenkiller> GIVE MY ARMOR BACK
+<Spectr> ALCALDE 
+<goldenkiller> GIVE MY ARMOR BACK
+<goldenkiller> GIVE MY ARMOR BACK
+<smile> this isnt my house
+<proelian> piiiiiiiiii
+<womangamer> oooou mia i love you
+<Mia2020is18> golden you here too
+<pi180> neessitamso mas equipamiento
+<Jamel--pro> lito
+<proelian> pi asepta
+<smile> we shouldnt be here
+<camrn> it is my house
+<proelian> pi asepta
+<smile> oh
+<proelian> pi asepta
+<Mia2020is18> i love you to mama
+<bran58340222> GRACIAS
+=> LuzuGermer has joined the server
+<nickio> cuz michaelle hacked pemodragon and killed him: mess with one of us, mess with all uf us
+<Jamel--pro> penada
+<proelian> mis cosas
+<Nick18> omega friends
+<= KingDan left the server
+<Mia2020is18> yay golden
+\e(c@#339933)<lurk@IRC> ​Yay!\e(c@#ffffff)
+<Jamel--pro> elian si te metes comigo bera
+<proelian> ptooooooooooo jamelllll 
+<goldenkiller> :(
+<womangamer> girls can you kill to gonzalaz pls?
+=> KingDan has joined the server
+<pi180> nesesitamos armamento
+<smile> faints
+=> Yuuichi210 has joined the server
+<pi180> specter
+<Michaelle> I CANT CALL THE POLICE
+<nickio> sieben genug ich habe nich mehr
+<Spectr> dime
+<pi180> ven ayudarnos estamos en erra
+<proelian> si es verdar
+<GajaJJ> yes mom
+<Spectr> voy
+<Mia2020is18> whats the matter goldne
+<Pemodragon> ja
+<Spectr> voy a hacer armaduras
+<pi180> de diamante
+<Nick18> omega friends
+<goldenkiller> i lost my armot 
+<Sterban> take
+<pi180> ay le partimos el culo a jamel
+<proelian> no tengo
+\e(T@sethome)Home set!\eE
+<Spectr> de hierro no tenemos mucho
+<goldenkiller> armor*
+<smile>  ough cough
+<womangamer> hey!! do you have boy friend?
+<pi180> ok
+<Mia2020is18> awwwwwwww :(
+<= saji left the server (timed out)
+<Pemodragon> lol ich habe acht bekommen
+=> sonadow has joined the server
+<pi180> ase armaduras
+<Mia2020is18> no mama
+<Jamel--pro> pi y elian si se meten cmigo beran
+<Spectr> voy
+<nickio> ok
+<womangamer> and who is?
+<camrn> what happend
+<= KingDan left the server
+<Mia2020is18> ho my friend
+<pi180> aora tenemos otro mas
+<II24kII_Syaz> jzjz
+<II24kII_Syaz> jzjz
+<II24kII_Syaz> jzjz
+<II24kII_Syaz> jzjz
+<Jamel--pro> bran si mesitas ago llamame
+<II24kII_Syaz> jzjz
+<womangamer> oo okay!
+<= sgshshsuusuh left the server
+<Mia2020is18> he
+<pi180> asic que manda tp que te esperamos perraa
+<proelian> jamel cuando estemos listo asemos una guerra okkputoooos
+<Pemodragon> lol wie dumm kann man sein
+<smile> how was that
+<Spectr> voy
+<womangamer> gaja!!!!
+<Jamel--pro> bye bran
+<Mia2020is18> hey you kill him
+<20meliodas> elian estoy de tu lado
+<nickio> und er will mich jetzt reporten
+<Pemodragon> am spawn kann man nicht killen
+=> Alexuki has joined the server
+=> moondah has joined the server
+<bran58340222> CHAUUUUUUUUUUUUU
+<= ndinxkeksn left the server (timed out)
+<womangamer> dont take mathing!
+<Jamel--pro> chauuuuuuuuuuuuuuu
+<GajaJJ> sorry
+<bran58340222> HIJO VEN
+<Spectr> estoy
+<pi180> no 
+<nickio> weil ich ihn bei cat city gekillt habe
+<pi180> vayas con el
+<Mia2020is18> golden
+<womangamer> this is not well!
+=> JezSonic has joined the server
+<Pemodragon> :)
+<Spectr> denme comida
+<pi180> tu ijo no es mas tu compraniero
+<proelian> jamel cuando estemos listo asemos una guerra ok putooo
+<bran58340222> HIJO VEN
+<smile> kisses
+<womangamer> gaja you cant do that!
+<GajaJJ> hou to give back
+<Nick18> pokedigger
+<pikachu2> NIKO ME DAS DIAMANTES
+\e(T@sethome)Home set!\eE
+<Mia2020is18> give what you stoll back
+<womangamer> okay!
+<Spectr> denme comida !
+<proelian> no me traisionaste
+<Alexuki> car
+<Jamel--pro> ahora soi el amigo de tu padre
+=> jsisiisis has joined the server
+<goldenkiller> :(
+<pi180> no nos emporta
+<Nick18> i could buy crystals
+=> uz has joined the server
+<Mia2020is18> drop it
+<pi180> juntos osmos fuertes
+<womangamer> but dont do that eny more!
+<proelian> si es verdad pi
+<womangamer> okay?
+<smile> this is my friends house
+<GajaJJ> o okay
+\e(T@sethome)Teleported to home!\eE
+<= hejs left the server
+<Mia2020is18> golden come back
+<bran58340222> A Y JAMEL POR MI HIJO LO APOYO A EL PERDONA
+<= cyfuh left the server
+<= omega left the server (timed out)
+<smile> camrn 
+<suffer_god69> can someone gives me some coal? they killed me and stole all my coal and money
+<= jsisiisis left the server
+<pi180> no elian
+=> omega has joined the server
+<womangamer> folow me to say sorry!
+=> Jubilicat has joined the server
+<= Nick18 left the server (timed out)
+<pi180> no les aas caso
+<bran58340222> HIJO VENNNNNNNNNNNNNNNN
+<Mia2020is18> golden i have you stuff
+<pi180> no
+=> KittyTheCat has joined the server
+<smile> hi
+=> Fireboy88 has joined the server
+<carota> hola smile
+<pi180> no ira
+<womangamer> gaja stay here!
+<goldenkiller> i going kill my self bye
+<= camrn left the server (timed out)
+<Jamel--pro> bran desile a tu hijo pedon a mi estamos en mano
+<womangamer> gaja!!!!
+<pi180> adios elia despues veno ala erra
+<bran58340222> PI DEJALO NO SOS SU MADRE NI EL PADRE
+<smile>  can u leave
+<Jamel--pro> hola amigo Luzu
+<Mia2020is18> :(
+<GajaJJ> hou do i give bock
+<pi180> adios
+<smile> pls
+<= pi180 left the server
+<Jamel--pro> recupere mi cueta
+<proelian> puto jamelo
+<LuzuGermer> hola
+<carota> hola smile
+=> ACCESORIOS has joined the server
+<nickio> hi
+<= ACCESORIOS left the server
+<= dodik left the server (timed out)
+<proelian> piiiiiiiiiiiiiiiiw
+<suffer_god69> can someone gives me some coal? they killed me and stole all my coal and money
+\e(c@#339933)<kim280\ f@catlandia-relay> lol\e(c@#ffffff)
+<womangamer> where is gold?
+<Mia2020is18> golden
+<= helloppl left the server
+<nickio> dein skin is ilegal
+=> dodik has joined the server
+<= uz left the server
+<Pemodragon> las mich bite weiter spammen das killen überall erlaubt ist
+<proelian> piiiiiiiiiiiiii
+<smile> camrn where r u
+<bran58340222> VEN HIJO YA VUELVO SE ME TRANCA EL JUEGO
+<= bran58340222 left the server
+<suffer_god69> can someone gives me some coal? they killed me and stole all my coal and money
+<nickio> ok ausser spawn
+<womangamer> gaja stay there
+=> hello has joined the server
+<Mia2020is18> i have you sfuff
+<= _Natsuki_Chr_ left the server (timed out)
+<proelian> pa traeme mis cosas y ven tu
+<Michaelle> KILL FIGHT FOLLOW ME
+<nickio> i can but i think i wont
+<kitttykat4> mich
+=> bran58340222 has joined the server
+<pikachu2> AMOR VENI
+<Jamel--pro> hola bran
+<proelian> puto jamelllllllllllllllllllllllll
+<womangamer> sorry so much for my dougther
+<proelian> jamel putooooooooooo
+<Jamel--pro> que bega tu hijo a dicupase
+<smile> CAMRN WHERE R U
+<= KittyTheCat left the server
+<proelian> paaaa
+<pikachu2> CRIS
+<= Lily__ left the server
+<Spectr> Proelian
+<Spectr> dame comida
+<proelian> que
+<Spectr> me muero
+=> alicia12 has joined the server
+<proelian> no tengo 
+<proelian> jamel me mato
+<Emerythecuttie> 123 TO SELL ME A PROTECTOR! ILL GIVE U MONEY! 
+=> camrn has joined the server
+<Mia2020is18> my sister sorry for killing you golden
+=> Nick18 has joined the server
+<proelian> paaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+<smile>  carmrn where r u
+<bran58340222> QUEEEEEEEEEEEEEEEEEE
+<GajaJJ> YES
+<GajaJJ> i am
+=> jsjjz has joined the server
+<= pikachu2 left the server
+<Mia2020is18> golden
+<goldenkiller> :( :( :( :( :( :( :( :( :( :( :( :( :( :( :( :(
+<proelian> ahy voya
+<Emerythecuttie> 123 TO SELL ME A PROTECTOR! ILL GIVE U MONEY! 
+<smile> kisses
+<bran58340222> QUE ACES AQUI
+<Jamel--pro> bran pedi a tu hijo que bega a dicupase ai estamos en mano
+<Mia2020is18> it ok *hugs*
+<Nick18> hi
+<suffer_god69> can someone gives me some coal? they killed me and stole all my coal and money
+<= camrn left the server (timed out)
+<= II24kII_Syaz left the server
+<Michaelle> FUCKER
+<womangamer> its kissing!!!
+<= hello left the server (timed out)
+<smile> u scared me where were u
+=> Sarapvp has joined the server
+<bran58340222> HIJO VEN A DISCULPARTE CON JAMEL
+<womangamer> mia!!
+<proelian> nooa
+<GajaJJ> your stuff is in trash in home
+<bran58340222> PORFA
+<= omega left the server (timed out)
+<Mia2020is18> what
+=> Flower35 has joined the server
+<proelian> no
+<smile> camrn
+\e(c@#339933)<kim280\ f@catlandia-relay> do u problom to pleas to join edgy\e(c@#ffffff)
+<GajaJJ> yes
+=> Zaairagarciia has joined the server
+<bran58340222> VAMOS HIJO O TE PONGO EN PELITENCIA
+<Jamel--pro> ai te pedono lo de tu casa elian
+<suffer_god69> can someone gives me some coal? they killed me and stole all my coal and money
+<Spectr> Pi ven
+<GajaJJ> go look for your self
+=> belen12343 has joined the server
+<smile> what
+=> omega has joined the server
+<= alicia12 left the server
+<carota> smile are you car 
+<Jamel--pro> estare aca en 5 minutos
+<Mia2020is18> golden where did you go
+<Pemodragon> nickio übrigens du darfst Chef 2 auf jeden fall reporten am spawn steht griefen verboten
+<Jamel--pro> dale
+<smile> what?
+<Pemodragon> nickio übrigens du darfst Chef 2 auf jeden fall reporten am spawn steht griefen verboten
+<womangamer> what happend mia??
+<= omega left the server (timed out)
+<Jamel--pro> pedi dicupa
+<carota> car 
+<GajaJJ> mom come
+<Mia2020is18> golden gone
+<bran58340222> PERDONALOOOOOOOOOOOO
+<womangamer> come on
+<proelian> nooooooooooo
+=> nwjwj has joined the server
+<Jamel--pro> 3
+<Jamel--pro> 2
+<gatita> q
+<smile> thats my friends house
+<Jamel--pro> 1
+<Spectr> elian toma tus cosas
+<Jamel--pro> 1 miedio
+<= Emerythecuttie left the server (timed out)
+<Mia2020is18> i have it
+<nickio> was ist unterschied zwischen griefen und killen?
+<GajaJJ> see in nice
+<Spectr> PIII
+<= nwjwj left the server
+<Jamel--pro> 3
+<= jsjjz left the server (timed out)
+<gatita> katkitty
+<Jamel--pro> dale elian
+<Sarapvp> nick queres ser mi amigo
+<gatita> ven a katkitty
+<Pemodragon> griefen ist wenn man was abbaut von anderen spielern
+=> oliver_play has joined the server
+<smile> camrn where r u
+<bran58340222> ELIAAAANNNNNNNNNNNNNNN DALEEEEEEEEE
+<proelian> no
+<GajaJJ> hi
+=> ohhhhh has joined the server
+<nickio> u called me fucker
+<Jamel--pro> pedoname
+<GajaJJ> hi
+<goldenkiller> hi
+<Jamel--pro> bueno lla noo estamos en mano
+<womangamer> golden do you want come home?
+=> HMOOD1111 has joined the server
+<GajaJJ> im sorry
+<carota> hola elian
+<goldenkiller> ok
+<gatita> tu eres un boom boom
+=> casnocha has joined the server
+<GajaJJ> yay
+\e(c@#339933)<lurk@IRC> ​Yay!\e(c@#ffffff)
+<bran58340222> HIJOOOOOOOOOOOOOOOOOOOO
+<proelian> ola carota
+<= Alexuki left the server (timed out)
+<Jamel--pro> en un rato lla bego a demoler el pueblo
+<womangamer> come to sleep it night!
+<= soldado0scuro left the server
+<proelian> pa tu mepegasteeee traisionero
+<Jamel--pro> adios
+<Mia2020is18> i changes nobody come in the room
+<Pemodragon> ab 500 blöcken vom spawn darf man killen
+<Jamel--pro> asta que se dicopen
+<GajaJJ> ok
+<= moondah left the server (timed out)
+<= dreckos left the server
+<Pemodragon> ab 500 blöcken vom spawn darf man killen
+<Pemodragon> ab 500 blöcken vom spawn darf man killen
+<GajaJJ> come
+<bran58340222> PORFA HIJO NUESTRO PUEVLO ESTA EN PROVLEMAS
+<proelian> puto jamel feooow
+<nickio> aahahha
+<_Circus_Baby_> kitty
+=> xXDinamicoXx has joined the server
+<pro_builder_57> can i have a wepon,people keep killing me
+<= Nick18 left the server (timed out)
+=> ls43_34 has joined the server
+<womangamer> golden is going to sleep with u mia and gaja with me!
+<eins_zwei_drei> anyone sell me crystal spikes
+<Spectr> PIETRO
+<Mia2020is18> *changes*
+<proelian> si el lo rompe yo rompo el de elw
+<suffer_god69> can someone gives me some coal? they killed me and stole all my coal and money
+<womangamer> ok?
+<Sarapvp> nick queres ser mi amigo
+=> drecko has joined the server
+<bran58340222> LEEISTE LO QUE DIJO ELIAN DIJO QUE PERDON
+<womangamer> come on 
+<= ls43_34 left the server (timed out)
+<= gatita left the server
+=> ohhhhhh has joined the server
+<= ohhhhh left the server (timed out)
+<smile> will someone be my friend
+=> KittyTheCat has joined the server
+<proelian> no lo perdono por puto voy a romperle su puevlo
+<Jamel--pro> en un minuto ropere el pueblo
+<smile> hi
+<womangamer> golden you in the room of mia
+<bran58340222> HIJO VEN YA W
+<Mia2020is18> no smile you hurt me rember
+<womangamer> ok?
+<eins_zwei_drei> you dont have anything right?
+<Jamel--pro> astan que se dicupen
+<smile> what when how
+<suffer_god69> no
+<womangamer> and gaja with me
+<Spectr> Jamel o son-goku 
+<GajaJJ> mom i nead to change to my pj ok
+<Sarapvp> re
+<nickio> sterban
+=> Lily__ has joined the server
+<Spectr> es mi pueblo tambien !
+<womangamer> ok
+<suffer_god69> thank you!
+<carota> hola elian
+<proelian> matemos a jamel
+<Mia2020is18> yesterday i asked if you want to be friends you say no
+<carota> si
+<eins_zwei_drei> :)
+<Spectr> no we no puedo
+<= casnocha left the server (timed out)
+<proelian> matemos a jamel
+<oliver_play> no lo maten
+=> Ronia has joined the server
+<mahuru> の
+<bran58340222> HOLAAAAAA
+<womangamer> do u want go to the bathrrom?
+<smile> yesterday u asked what
+<carota> me das un armatura
+\e(T@sethome)Teleported to home!\eE
+<nickio> sterban ilegal
+<goldenkiller> for what?
+<= mahuru left the server
+<eins_zwei_drei> good bye ^)
+<Mia2020is18> to be friends
+<= ohhhhhh left the server (timed out)
+<Spectr> PIETRO
+<suffer_god69> thank you so much
+<smile> i said no because i couldnt
+=> lolu has joined the server
+<Mia2020is18> why
+<womangamer> i dont know i say it if you want go
+<goldenkiller> no thx
+<womangamer> bacuse is here come
+<carota> pro
+<proelian> matemos a jamel el  putito
+<Jamel--pro> 3
+<Jamel--pro> 2
+<GajaJJ> im done
+<Jamel--pro> 1
+<lolu> holaaaaaaaaaaaaaaaaaaa
+<womangamer> come to sleep golden
+<Jamel--pro> ora de moler
+<smile> because i was with my other friend in his mansion and i cant bring people over without his permision
+<carota> elian me das un armatura
+<Sarapvp> i
+<eins_zwei_drei> can anyone sell me crystal spikes?
+<= HMOOD1111 left the server (timed out)
+<GajaJJ> you cane sleep on the couch
+<womangamer> there
+<Spectr> carota
+<goldenkiller> whi is this?
+<Mia2020is18> oh ok well you want to be frie ds now
+<Spectr> eres de nuestro pueblo ?
+<goldenkiller> who*
+<womangamer> good nigth guys
+<smile> sure
+<Flower35> hi smile
+<smile> hi
+<Mia2020is18> ok yay
+<womangamer> gaja come with me
+<smile> hi
+<lolu> negrito cuando yo bailo de noche y dia a  todos los buelvo loco con mi apollera AMARILLAAAAAAAAA
+<eins_zwei_drei> can anyone sell me crystal spikes?
+<womangamer> bye
+<goldenkiller> lay
+<GajaJJ> yes
+<smile> hi
+=> capnat has joined the server
+<Mia2020is18> lest sleep golden night
+<bran58340222> SOS UN PUTO HIJO DE MIL RE PUTA JAMEL Y VOS ELIAN SI NO LO PERDONAS NO SOY MAS TU PADRE
+<KittyTheCat> day please
+<Pemodragon> eins_zwei_drei hallo
+<GajaJJ> mom no
+<proelian> puto jamel lre conchate tu putamadre
+<goldenkiller> i sleep lik this
+<goldenkiller> like
+<womangamer> gaja shhhh we are going to sleep in th sofa ok?
+<Jamel--pro> bueno adios
+<nickio> ilegaler skin
+<= capnat left the server
+Teleported to spawn!
+<Mia2020is18> ok
+<GajaJJ> i want to sleep in my room
+<= E200 left the server (timed out)
+<carota> proelian che e successo
+<Pemodragon> neeeeeeee
+<womangamer> nono
+<proelian> puto jamel la re chonchde tu madre
+<womangamer> ok?
+<Jamel--pro> mas bale que no me digan puto
+<womangamer> sshhh
+<nickio> invisible  ich kill dich
+<goldenkiller> look
+<womangamer> gaja!!!!
+<Spectr> Jamel eres son goku o no ?
+<nickio> oof
+<oliver_play> jamel necesitas ayuda? 
+<Pemodragon> der server verbietet es laut regeln nicht
+<womangamer> come
+<Jamel--pro> si soi
+<Spectr> Ya creo que no
+<proelian> puta tu madre jamelw
+<goldenkiller> the moon
+<Spectr> ):v
+<linochka> всем пока
+=> ghj has joined the server
+<lolu> A TODOS LOS VUELBO LOCO CON MI POLLERA AARILLAAAAAAAAAAAAAA
+=> sreekara has joined the server
+<= linochka left the server
+<smile> help
+<womangamer> gaja here!
+<proelian> puto jamel
+<womangamer> wa
+<Spectr> en este pueblo vivo yo
+<lolu> PASITO PARA TRAS
+<smile> lava
+<womangamer> slep good guys
+<suffer_god69> Michelle you here?
+<proelian> asepta paaa
+<= sreekara left the server
+<Spectr> elian pone /tpy
+<smile> hi
+<proelian> asepta paaa
+<KittyTheCat> quien quiere ir a mi tienda a comprar?
+<proelian> aseptapaa
+<womangamer> gaja shhhhhh we are going to spy ok?
+=> Saberchnx has joined the server
+<proelian> paa asepta
+<Spectr> elian pone /tpy
+<smile> hi
+<bran58340222> ESTOY EN EL PUEVLO
+<womangamer> shhhh
+<= pro_builder_57 left the server
+<proelian> paa asepta
+<lolu> PASITO PARA TRAS
+<nickio> lass mal hauser bauen
+<Sarapvp> hola jamel
+<Spectr> asi voy
+<Mia2020is18> hi saber
+<GajaJJ> MOM NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
+<proelian> pa aseptaaaaaaaaa
+<Jamel--pro> hola
+<smile> rude
+<= ghj left the server (timed out)
+<Saberchnx> hi mia :)
+<womangamer> come
+<Spectr> elian pone /tpy asi voy
+<smile> hi
+<Mia2020is18> come home
+=> gacha_lover has joined the server
+<lolu> AL NEGRO LO BUELBO LCO MAMA PASITO PARA TRAS
+=> shaphaba has joined the server
+<Saberchnx> okey
+<= JezSonic left the server
+<Mia2020is18> no body kill saber ok
+<smile> i dont speek spanish
+<proelian> puto jamel chupa pija
+=> greenbeangirl has joined the server
+<Spectr> ELIAN
+=> manyiwu has joined the server
+=> Leneczka has joined the server
+<Spectr> PONE /tpy
+\e(T@sethome)Teleported to home!\eE
+<_Circus_Baby_> plz stop killing me
+<oliver_play> si matan a jamel llamo a gracye
+<Spectr> ya
+<= Michaelle left the server (timed out)
+<goldenkiller> is it light?
+<MaLin4iKk> I am in desrt
+<smile> saberchnx
+<proelian> jamel puto ven que te matamosss
+<Mia2020is18> yes and saber here
+<Spectr> Aver que coño pasa
+<Mia2020is18> hi saber
+<Jamel--pro> yo no mato spectr
+<Saberchnx> mia!!!!!
+<womangamer> ooo hello many
+<goldenkiller> is it light or night?
+<Jamel--pro> es mi amigo
+<lolu> MIRA COMO SE MENEAAAAAAAAAA
+<Spectr> Que coño pasa aqui
+<= Fireboy88 left the server
+<proelian> perdon jamel
+<nickio> gerade?
+<Mia2020is18> mama meet saber
+<lolu> QUIEN ES VIOLETAAAAAAAAAA
+<Pemodragon> ja
+<Jamel--pro> lito
+<smile> saberchnx
+<= greenbeangirl left the server
+<Saberchnx> umm 
+<goldenkiller> hi
+<womangamer> good morning!
+<nickio> flache?
+<= Leneczka left the server (timed out)
+<nickio> also flach
+<Spectr> Ya esta coño porfin se disculpan 
+<Saberchnx> hi smile
+=> Michaelle has joined the server
+=> Sereno has joined the server
+<proelian> sip
+<lolu> BAILA COMO UN TERREMOTO YO NO ME PUEDO CONTROLARRRRRRRRRRRRRR
+<Sarapvp> i
+<Pemodragon> ih möcht ne villa baun
+<goldenkiller> good morning
+<= drecko left the server
+<oliver_play> proelias como mates a mi amigo llamare a gracye que matas ilegalmente 
+\e(T@sethome)Teleported to home!\eE
+<nickio> ok
+<smile> hi whhere r u
+<nickio> tp to me
+<Mia2020is18> every body out i need to change
+<proelian> es que jamel tine de todo
+<= Ronia left the server (timed out)
+<womangamer> do you sleep good with mia?? jijiji
+<KittyTheCat> QUIEN QUIERE IR A MI TIENDA!!!??
+<GajaJJ> gold can you come whith me
+<Spectr> Ostia 
+<oliver_play> nada que ver Elías 
+<goldenkiller> yes
+<proelian> ajajaajjaaj
+<nickio> hier in der naehe
+<GajaJJ> come
+=> dreck has joined the server
+<womangamer> ooooooo jiji
+<Spectr> Jamel me llevas a una mina y minamos ?
+<KittyTheCat> alv...
+<= Lily__ left the server
+<Jamel--pro> proelian si bobes a desir puto ami ta ropo el pueblo y es todo mio ok
+<goldenkiller> polska?
+<oliver_play> alvaro
+<lolu> QUIEN ES VIOLETA 
+<smile> hi lolu
+<Saberchnx> im behind you smile
+<Mia2020is18> mama he sletpn the floor
+<Spectr> No 
+<womangamer> do you want enter to see mia 
+<goldenkiller> Kto jest polska>
+<smile> where
+=> temujin has joined the server
+<20meliodas> estoy listo elian para la batalla
+<smile> hi
+<Saberchnx> here
+<GajaJJ> no
+<gacha_lover> how to tamw a mouse?
+<Spectr> eso miestras que este yo ni de coña va a pasar
+<GajaJJ> come
+<proelian> amigo vamos a nuestro pueblo?
+<gacha_lover> tame*
+<carota> spectr donde estas
+<goldenkiller> idk
+<Mia2020is18> *changes*
+<smile> follow me
+<Pemodragon> danke
+<Spectr> en un sitio
+<GajaJJ> sis
+<Mia2020is18> out
+<Saberchnx> okey
+<= Sereno left the server
+Teleported to spawn!
+<carota> donde
+<GajaJJ> sis
+<proelian> amigo vamos a nuestro pueblo
+<Mia2020is18> i changeing
+<20meliodas> me das armadura
+<Spectr> Elian vamos a minar y dejemos esta menuda gerra
+<lolu> AAAAAAAAAA
+<proelian> sidale
+<Mia2020is18> out we talk after
+<womangamer> ok ok sorry but ist th first time that my doughters come with a boy
+<Pemodragon> morgen steht hier ne fette villa
+<20meliodas> elian quiero ir a tu pueblo
+<oliver_play> elian si seguis asi llamo a gracye 
+<proelian> amigoooooooooooo
+<nickio> ich adde dich
+<lolu> TODOS LOS SOLTEROS CON LAS MANOS ARIBA SI SOS CASADO TOMATE EL PALO A
+<womangamer> wow mia!
+<smile> this is my favorite spot
+=> wdfiediv has joined the server
+<Mia2020is18> out i am changeing
+<= sonadow left the server
+<Saberchnx> cool
+=> jamel-20 has joined the server
+<Jamel--pro> pvp
+<Mia2020is18> out!
+<womangamer> you can enter now mia was changed
+<proelian> amigo
+<lolu> HAY QUE LNDO ES SER SOLTERO COMO ME GUSTA VIVIR TODO EL DIA AL PEDO NO TRABAJO Y NO ESUDIO PORQUE NO QUIERO
+<womangamer> ok?
+<Mia2020is18> no i am not
+<goldenkiller> ok
+<smile> sorry i had to go yesterday what did u say before i left
+<bran58340222> CAROTA
+<20meliodas> hola carota
+<= Saberchnx left the server
+<carota> hola
+<womangamer> go
+<proelian> amigoooooooooooooooooooooooooo
+<= Yuuichi210 left the server
+<= belen12343 left the server (timed out)
+<= Jubilicat left the server
+<= Michaelle left the server (timed out)
+<Mia2020is18> ugghhhhhhh out
+=> EVAN_779 has joined the server
+<lolu> EN EL BAILE LAS PIVA ME DICEN QUE SOY FEO PERO NO ME INPORTA PORQUE LINDOSER NO QUIERO
+=> u27y has joined the server
+=> Saberchnx has joined the server
+<carota> me regal un armatura
+<Mia2020is18> *changes*
+=> amelka has joined the server
+<goldenkiller> yay
+\e(c@#339933)<lurk@IRC> ​Yay!\e(c@#ffffff)
+<nickio> ach so du bist ja unsichtbar
+<= LuzuGermer left the server
+<proelian> amigooooooooooooooooooooooo
+<GajaJJ> MOM COME
+<goldenkiller> siema amelka
+<Spectr> que
+(229,9,311) is protected by minhthien_vn1.
+<womangamer> what happend mia we are going to the pool
+<amelka> siema
+<GajaJJ> MOM
+=> emis has joined the server
+<smile> where r u
+<nickio> chabos wissen wer der babbo ist hafti  abi der im lambo und ferrari sitzt
+<Pemodragon> o ganz vergessen
+<20meliodas> pro elian
+<proelian> asepta amgo
+<amelka> gdzie jesteś
+<GajaJJ> COME
+<lolu> ESTO ES EL PICHI PAPA
+<20meliodas> elian
+<bran58340222> HIJO YA VUELVO
+<nickio> ?
+<womangamer> change girls we are going to the pool
+<goldenkiller> ja jestem to glass dome
+<Pemodragon> warte kurz
+<20meliodas> elian
+<amelka> ok
+<Mia2020is18> i am not i am going to school i am 18 in game and going to school mama
+<dreck> ben al principio nidal
+<manyiwu> goldenkiller
+<= emis left the server
+<Saberchnx> mia 
+<goldenkiller> yes
+<womangamer> no to school no to the pool
+<smile> Sabernachnx
+=> bozkurt has joined the server
+<Mia2020is18> yes
+=> Nick18 has joined the server
+<goldenkiller> ja jestem tutaj
+<lolu> MMMMMMMMMMMMMMMMMMMMMM
+<womangamer> i say to pool
+<goldenkiller> don't kill amelka pls
+<smile> SABERNACHNX
+<= Saberchnx left the server (timed out)
+<lolu> ANDO SOLTEROSKI Y A NADIE LLE DIGO A DONDE VOYYYYYYYYYYYYYYYYY
+<bozkurt> türk var mi
+=> Saberchnx has joined the server
+=> _Natsuki_Chr_ has joined the server
+<20meliodas> elian acepta porfa
+=> gatita has joined the server
+<GajaJJ> MOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOM COME
+<Mia2020is18> yes saber
+<smile> hola
+<amelka> co tam
+<= dreck left the server
+<smile> lolu
+<Spectr> we
+<womangamer> all to the pool its a party!!
+<= manyiwu left the server (timed out)
+<carota> bran te viens
+=> manyiwu has joined the server
+<proelian> amigoooooooooo
+<GajaJJ> COMEEEEEEEEEEEEEEEEEE
+<= jamel-20 left the server
+<Saberchnx>  hi mia
+<Spectr> no agarres mis cosas
+=> HMOOD1111 has joined the server
+<lolu> SAL
+<= Nick18 left the server (timed out)
+<= EVAN_779 left the server
+This area is owned by RUBIUSOMG11!
+<= Flower35 left the server
+<carota> bran te viendo una casa
+<Spectr> no agarres mis cosas
+<womangamer> im going to change ok?
+<= bozkurt left the server (timed out)
+=> dreckos has joined the server
+<proelian> amigo asepta
+<proelian> asepta
+<proelian> asepta
+=> gardi has joined the server
+<= dreckos left the server
+<= lolu left the server
+<proelian> amigo asepta
+<bran58340222> ya tengo
+<Mia2020is18> hi i dont feel so good right now so i shouldnt go in the poo
+<Spectr> pone /tpy
+=> Flower34 has joined the server
+<= Jamel--pro left the server
+This area is owned by sopot!
+(261,6,272) is protected by cris2011.
+<proelian> tpy
+<Spectr> pone tpy
+<bran58340222> YA TENGO
+<= gardi left the server
+<nickio> willst du snow brick?
+<womangamer> mia change a party in the pool is going
+<Saberchnx> okey mia
+=> drec has joined the server
+<amelka> jestem taka szczensliwa że jesteś
+<goldenkiller> jest przyjacielu
+<Mia2020is18> i dont feel good mama
+<nickio> chabos wissen wer der babbo ist hafti  abi der im lambo und ferrari sitzt
+<goldenkiller> don't kill amelka pls 
+<smile> wow
+<Pemodragon> danke
+=> dusik271111 has joined the server
+<carota> bran chieres una casa
+<amelka> co
+<nickio> chabos wissen wer der babbo ist hafti  abi der im lambo und ferrari sitzt
+<amelka> ok
+<Mia2020is18> mama i not going i sick
+<Saberchnx> umm i dont feel like swiming
+<nickio> pemo
+<= wdfiediv left the server (timed out)
+<bran58340222> PRIMERO LA VEO
+=> Emerythecuttie has joined the server
+=> zuzusjJ has joined the server
+=> trolerotutos has joined the server
+<manyiwu> WAI
+<= gatita left the server
+<goldenkiller> GajaJJ:  don't kill amelka ok
+<amelka> ale mnie biła
+<nickio> hier werde ich ein japanischen garten bauen
+<Spectr> we elian
+(299,2,301) is protected by xXAguraXx, LucianFPS.
+=> willocks has joined the server
+=> gatita has joined the server
+<Mia2020is18> i am in heat mama
+<carota> bran fai /tpr spaw
+<smile> hi
+<= Flower34 left the server
+<Spectr> aqui tienes cosas tuya
+<= drec left the server
+This area is owned by Alex!
+(310,2,299) is protected by xXAguraXx.
+=> EVAN_779 has joined the server
+<GajaJJ> mom
+(301,3,295) is protected by xXAguraXx, LucianFPS.
+<Spectr> pone /tpr Spectr
+<gatita> hola
+<amelka> możesz muwić po polsku
+=> Flower35 has joined the server
+<GalwayGirl> how to get crystal
+<Mia2020is18> mama i in heat i no go
+<smile> Evan hi
+<Saberchnx> umm mia theres killers 
+<= dusik271111 left the server
+=> meher has joined the server
+<= trolerotutos left the server
+<carota> bran fai/tpr carota
+<Saberchnx> here
+<= u27y left the server
+<Mia2020is18> grrrrrrrr
+<gatita> una gatita le dio las cosas a alguien de ustedessssssssssssssssss
+<nickio> chabos wissen wer der babbo ist hafti  abi der im lambo und ferrari sitzt
+<= zuzusjJ left the server (timed out)
+<nickio> chabos wissen wer der babbo ist hafti  abi der im lambo und ferrari sitzt
+<nickio> chabos wissen wer der babbo ist hafti  abi der im lambo und ferrari sitzt
+<nickio> chabos wissen wer der babbo ist hafti  abi der im lambo und ferrari sitzt
+<Spectr> aqui
+<smile> Sanachnx
+<Spectr> es tuyo we
+<Mia2020is18> who kill
+<goldenkiller> nie umje
+<proelian> es lom
+<Spectr> agarra
+=> AERDTY has joined the server
+=> james has joined the server
+=> trolerotutos has joined the server
+<Saberchnx> who killed someone okey mia
+=> diego has joined the server
+<amelka> to pa
+<= amelka left the server
+<20meliodas> elian acepta
+<Spectr> eso es tuyo
+<manyiwu> no loo goldenkiller
+<GajaJJ> mom
+<GajaJJ> mom pleas
+<Spectr> debes tener algo bueno we
+<= Flower35 left the server (timed out)
+<smile> sanachnx where r u
+<proelian> grax
+<Mia2020is18> out now!
+<Spectr> pica
+<= diego left the server
+<Spectr> aca
+=> junebug has joined the server
+<Mia2020is18> i am in heat
+<GajaJJ> nty
+<Spectr> eso es tuyo
+\e(c@#339933)-!- kim280_tems joined #catlandia\e(c@#ffffff)
+<nickio> gagajj ur bones
+<womangamer> IM GOING TO THE POOL
+<gatita> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+<Spectr> aver lo agarro
+<nickio> leider nich
+<= _Natsuki_Chr_ left the server
+\e(c@#339933)<kim280_tems@IRC> do u problom to pleas to join edgy\e(c@#ffffff)
+<Spectr> toma
+<manyiwu> nicking gold
+<gatita> ,players
+\e(c@#339933)<trackr@IRC> Players on cat: 20meliodas, AERDTY, EVAN_779, Emerythecuttie, GONZALAX, GajaJJ, GalwayGirl, HMOOD1111, KittyTheCat, MaLin4iKk, Mia2020is18, Pemodragon, Saberchnx, Sarapvp, Spectr, Sterban, TATOPR00, Tuxy, Yad, Zaairagarciia, _Circus_Baby_, aorus, bran58340222, carota, dodik, edwuie, eins_zwei_drei, gacha_lover, gatita, goldenkiller, hhfgh, james, junebug, kitttykat4, lucapr00, manyiwu, meher, nickio, oliver_play, pangland, proelian, shaphaba, \e(c@#ffffff)
+<Mia2020is18> ok out
+\e(c@#339933)<trackr@IRC> Total: 50 players across 1 active server (and 0 inactive servers).\e(c@#ffffff)
+\e(c@#339933)<kim280_tems@IRC> do u problom to pleas to join edgy\e(c@#ffffff)
+<proelian> dale
+\e(c@#339933)<kim280_tems@IRC> do u problom to pleas to join edgy\e(c@#ffffff)
+<= james left the server
+=> cami-pro-123 has joined the server
+\e(c@#339933)<kim280_tems@IRC> do u problom to pleas to join edgy\e(c@#ffffff)
+<goldenkiller> amelka gdzie jestes?
+<womangamer> hello
+=> dreckoso has joined the server
+\e(c@#339933)<kim280_tems@IRC> do u problom to pleas to join edgy\e(c@#ffffff)
+<Pemodragon> egal i geh famen
+<GajaJJ> no this is our room so out
+<Spectr> eso era tuyo
+<smile> SANACHNX WHERE ARE YOU
+=> camrn has joined the server
+<= gatita left the server
+<Mia2020is18> out i am in heat
+\e(c@#339933)<kim280_tems@IRC> o czesc goldenkiller\e(c@#ffffff)
+<Spectr> sigamos
+<20meliodas> me dan armadura
+<smile> camrn
+=> Ronzy111Fox has joined the server
+<junebug> nick
+<goldenkiller> oh no
+<Mia2020is18> grrrrrrrr out!
+<smile> Ronzy
+<Saberchnx> get out my friend is changing :(
+<womangamer> what
+<Ronzy111Fox> I had no Internet that's why
+<= nickio left the server
+=> Jamel--pro has joined the server
+<goldenkiller> my poland friend left :(
+<camrn> were are tou
+<= EVAN_779 left the server
+<smile> Ronzy what r u whereing
+\e(c@#339933)<kim280_tems@IRC> goldenkiler\e(c@#ffffff)
+<manyiwu> nicking goldenkiller kill me
+=> sacari has joined the server
+<bran58340222> elian carota te estaba robando cosas
+=> hejs has joined the server
+<Ronzy111Fox> wait what where are my clothes
+=> swsws has joined the server
+<= willocks left the server (timed out)
+\e(c@#339933)<kim280_tems@IRC> a ja\e(c@#ffffff)
+<goldenkiller> tak kim280
+<Spectr> que
+<smile> spawn camrn
+<proelian> de donde?
+<carota> no
+<Spectr> CAROTA !
+<bran58340222> en tu casa
+<Mia2020is18> out i am in heat grrrrrrrrrrrrrrr
+<= camrn left the server (timed out)
+<= sacari left the server
+\e(T@sethome)Teleported to home!\eE
+<carota> cosa
+=> murii has joined the server
+=> pleyr has joined the server
+\e(c@#339933)<kim280_tems@IRC> a wejdz to str edgy1.net\e(c@#ffffff)
+<Spectr> a la prision
+<= hejs left the server (timed out)
+=> willocks has joined the server
+<bran58340222> EN REALIDAD EN LA CASA DE LOS 2
+<smile> want to go for a swim ronzy
+<womangamer> wow
+<manyiwu> nicking goldenkiller kill me
+<goldenkiller> okey kim280
+<proelian> asepta amigo
+<bran58340222> LA SUBTERRANIA
+<proelian> asepota
+<proelian> asept
+=> pro_builder_57 has joined the server
+<womangamer> golden!!!!!!
+<proelian> aseptaaaaaa
+<proelian> aepta
+<Spectr> acepta tu
+<smile> ronzy
+<Spectr> pone /tpy
+<womangamer> put your bikini on
+<Ronzy111Fox> yes
+<Spectr> gracias
+<Saberchnx> im just gonne swim
+=> _Natsuki_Baby_ has joined the server
+<= pleyr left the server (timed out)
+<smile> i need to tell u somthing
+<bran58340222> acepta elian}
+<GajaJJ> why
+<trolerotutos> aganse espadas
+<Ronzy111Fox> ok
+=> FujithecoolSushi has joined the server
+<bran58340222> ACEPTA ELIAN
+<smile> at ur house
+<womangamer> because is a pool party!!!
+<proelian> asepta migo
+<proelian> asepta
+<20meliodas> elian acepta
+<GajaJJ> no 
+<Ronzy111Fox> teleport
+<bran58340222> ACEPTA ELIANNNNNNNNNNNNNNNNNNN
+<smile> ok
+<Mia2020is18> *changes*
+<= FujithecoolSushi left the server
+<junebug> hello
+<gacha_lover> hi
+=> BeTePaHWotBliTz has joined the server
+<Mia2020is18> out!
+<womangamer> mia
+<Pemodragon> wgo sell stone bricks
+\e(c@#339933)<kim280_tems@IRC> goldenkiller\e(c@#ffffff)
+<20meliodas> eliam mori acepta
+<Mia2020is18> grrrrrrrrrrrrrrrrrrr out
+<smile> i sent it
+=> Nick18 has joined the server
+<goldenkiller> kim280 jak moge sie tam dostac?
+<smile> oh hi
+<Spectr> estoy sin comida
+<= manyiwu left the server (timed out)
+<womangamer> do you love golden?
+<Spectr> y sin pico
+You don't have permission to run this command (missing privileges: server)
+<_Natsuki_Baby_> um
+<Pemodragon> wgo sell stone bricks
+You don't have permission to run this command (missing privileges: server)
+<smile> umm ok so i got a bf and
+<proelian> amigo vamonos a casa 
+<= edwuie left the server
+=> LuzuGermer has joined the server
+<proelian> dale
+<Spectr> aiuda 
+<Mia2020is18> out i am in heat grrrrrrrrrr!
+<Ronzy111Fox> this is my house
+<= dreckoso left the server
+You don't have permission to run this command (missing privileges: server)
+\e(c@#339933)<kim280_tems@IRC> ok\e(c@#ffffff)
+=> manyiwu has joined the server
+<20meliodas> elian acepta
+<oliver_play> hola somos los militares, estamos biscando a un criminal llamado proelias
+<= _Natsuki_Baby_ left the server
+<Sarapvp> trolero queres ser mi amigo
+<Pemodragon> wgo sell stone bricks
+<Pemodragon> wgo sell stone bricks
+<Ronzy111Fox> can you speak English Oliver
+<Mia2020is18> out grrrrrrrrrrr!
+<bran58340222> B
+<= Nick18 left the server (timed out)
+<Emerythecuttie> 123 for a girlfriend
+<GajaJJ> no im changing
+<= _Circus_Baby_ left the server (timed out)
+<smile> LEAVE
+<= BeTePaHWotBliTz left the server (timed out)
+\e(c@#339933)<kim280_tems@IRC> golden killer\e(c@#ffffff)
+<Mia2020is18> fine
+<Ronzy111Fox> yeah leave
+<20meliodas> elian
+<goldenkiller> tak kim280
+<bran58340222> YA BUELVO
+\e(c@#339933)<kim280_tems@IRC> a skrucie kim\e(c@#ffffff)
+=> ninjaLucas has joined the server
+\e(c@#339933)<kim280_tems@IRC> mi muw\e(c@#ffffff)
+=> erftg has joined the server
+=> fdhusus123 has joined the server
+<smile> umm nevermind its not that important
+<20meliodas> elian
+=> Ryleedreamshine has joined the server
+<Ronzy111Fox> ok
+<womangamer> golden come here pls folow me
+<bran58340222> CAROTAAAAAAAAAAAAAAAAAAA
+<20meliodas> elian me dejas
+=> panda99 has joined the server
+=> gatogamer9 has joined the server
+<smile> upl hate me if i say it so
+<Mia2020is18> saber come here you the only one allowed in my room ok
+=> _Natsuki_Chr_ has joined the server
+\e(c@#339933)<kim280_tems@IRC> goldenkiller\e(c@#ffffff)
+=> gothic4 has joined the server
+<goldenkiller> TAK!
+<carota> bran te viendouna casa fai /tpr carota
+<murii> eat
+<Saberchnx> okey
+=> _Circus_Baby_ has joined the server
+<bran58340222> NO QUIERO
+<Saberchnx> here mia
+<Spectr> xddd
+<Mia2020is18> out sis
+<womangamer> golden folow me pls
+<proelian> no me mori jajajaajajjaja
+=> Ashten_18 has joined the server
+<Spectr> xDDDDDDDD
+<goldenkiller> bones of GajaJJ is here
+<smile> ULL HATE ME IF I SAY IT
+<Ronzy111Fox> ( eats potato chips)
+<carota> perche
+<Spectr> ah jajja xd
+<20meliodas> eliaaaaaaaaaaaaaan
+<Ronzy111Fox> Oh
+<Mia2020is18> out
+<GajaJJ> stop your mean
+<Sarapvp> trolero queres ser mi amigo
+<womangamer> do you love mia?
+=> Rumnit has joined the server
+<GajaJJ> i was changing
+<bran58340222> YA BUELVOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
+\e(c@#339933)-!- kim280_tems has quit [Quit: edgy1.net IRC: https://edgy1.net/irc]\e(c@#ffffff)
+<proelian> okk
+<Mia2020is18> out please sis *hugs*
+<= bran58340222 left the server
+<= AERDTY left the server
+<Ronzy111Fox> gajj are you hairy
+=> anna100 has joined the server
+<Saberchnx> this is her room now get out 
+<smile> promise u wont hate me if i tell u
+<goldenkiller> i can't answer
+<20meliodas> elian
+<GajaJJ> i neve hit you 
+<womangamer> WHY?
+<Sarapvp> oliver queres ser mi amigo
+<junebug> hi
+<goldenkiller> idk
+<goldenkiller> wait
+<Mia2020is18> well you hit me now
+<proelian> asepta amig 
+<Saberchnx> but i can hit you 
+<proelian> asepta
+<Ronzy111Fox> I promise I won't hate you
+<proelian> asepta
+<proelian> asepta
+=> bran58340222 has joined the server
+<20meliodas> yo_
+<Mia2020is18> saber no
+<Spectr> weon
+<womangamer> is because mia love you
+<murii> kill trolerotutos
+=> Tapley949 has joined the server
+<Spectr> te caiste
+<HMOOD1111> (:
+<womangamer> i now that
+<smile> PROMISE U WONT HATE ME IF I TELL U
+<Spectr> xde
+<Ronzy111Fox> (can't speak because he's tired)
+<Spectr> xd
+<Saberchnx> yay
+\e(c@#339933)<lurk@IRC> ​Yay!\e(c@#ffffff)
+<goldenkiller> :)
+<Sarapvp> oliver queres ser mi amigo
+<cami-pro-123> a
+<goldenkiller> why
+<proelian> si pone u bloke y yo vago ok
+<junebug> hi
+<womangamer> mia its crazy for you
+<20meliodas> elian puedes aceptar porfa
+<GajaJJ> mom
+<Spectr> ok
+=> _Alia_ has joined the server
+=> nacho777 has joined the server
+<= nacho777 left the server
+<= murii left the server
+<Ronzy111Fox> quiet voice(I need to go to sleep)
+<junebug> thx
+=> catkitty has joined the server
+<womangamer> wha-what?
+<smile> sits down and crys
+<Sarapvp> oliver queres ser mi amigo
+<GajaJJ> come
+<goldenkiller> GajaJJ:  your bones!
+<20meliodas> olvidenlo
+<bran58340222> PERDON
+<= 20meliodas left the server
+<proelian> aseptaa
+<proelian> asepta
+<pro_builder_57> kill peopl
+<Spectr> ya
+<_Alia_> hi
+=> murii has joined the server
+<Mia2020is18> saber i in heat
+=> AERDTY has joined the server
+<proelian> adme unpico
+<Sarapvp> oliver queres ser mi amigo
+<= catkitty left the server
+<Spectr> epera
+<GajaJJ> mom come
+<proelian> ok
+<bran58340222> PERDON
+<smile> NOT U AGAIN
+=> GalwayGirl has joined the server
+\e(c@#8800AA)PM from lurk@IRC: Welcome to the server, GalwayGirl! | Have a nice day!\e(c@#ffffff)
+<smile> Ronzy
+<Spectr> comida we
+<supercapitangato> spaen
+<Mia2020is18> i all better now
+<Ronzy111Fox> yes
+<womangamer> is your
+<Spectr> gracias
+<supercapitangato> spectr
+<proelian> na
+<= swsws left the server
+<Spectr> dime
+<_Alia_> *sad*
+<smile> will u hate me if i tell u somthing
+=> Yuuichi210 has joined the server
+<proelian> vamos a casa 
+<Ronzy111Fox> I'm trying
+<Mia2020is18> mama come
+<supercapitangato> quiero un auto porfi
+<Ronzy111Fox> I don't hate you smile
+<= Tapley949 left the server (timed out)
+<Spectr> Ya se cumplio tu condena de prision xd
+<manyiwu> will you marry me
+=> dasum has joined the server
+<gacha_lover> manyiwu
+<goldenkiller> aaaaaaaah i have 5 hp
+<proelian> okw
+<smile> if i tell u somthing promise not to
+<Mia2020is18> spawn ok mama
+<Ronzy111Fox> I need a sword
+=> FujithecoolSushi has joined the server
+<= willocks left the server (timed out)
+<carota> aiuto
+<Spectr> sigamos minando
+=> blackmoon1235 has joined the server
+<goldenkiller> and now 20 :)
+<GajaJJ> hi
+<proelian> mandale a gato
+<Spectr> we elian
+<proelian> y yo voy depues
+<supercapitangato> spctr
+=> milko has joined the server
+<Ronzy111Fox> please get out of my house
+<Spectr> no se quien dijo que carota te estaba robando
+=> swsws has joined the server
+<= AERDTY left the server (timed out)
+<womangamer> what mia?
+<_Alia_> ok
+<GajaJJ> do you like mia
+<Spectr> y si ella nos robo los coches ! ?
+<Ronzy111Fox> grrrrrr
+<proelian> no es joda decarot
+<Mia2020is18> i like golden really bad
+<goldenkiller> y e s
+<supercapitangato> we mw aseptas
+<GajaJJ> ...
+<supercapitangato> hola
+<Spectr> we espera que te hago un pico
+<proelian> vmonossss
+<Spectr> hola
+<supercapitangato> si
+<= trolerotutos left the server
+<womangamer> woh realy bad?
+=> willocks has joined the server
+<= shaphaba left the server (timed out)
+=> AERDTY has joined the server
+<smile> i sent a email ronzy
+<Mia2020is18> yes ever since i met him
+<Spectr> por aca se consiguen diamantes we
+=> cyo has joined the server
+<GajaJJ> oh
+<= oliver_play left the server
+<= _Alia_ left the server (timed out)
+<GajaJJ> i like you
+<= Ryleedreamshine left the server (timed out)
+<bran58340222> elian hijo hijoooooo
+<supercapitangato> seniaor
+<= junebug left the server (timed out)
+<= LuzuGermer left the server
+<goldenkiller> ok
+<proelian> vamos a casa migoo
+<= gatogamer9 left the server (timed out)
+<Spectr> espera
+=> _Circus_Baby_ has joined the server
+<proelian> okk
+<Spectr> vamos a conseguir diamantes
+<bran58340222> HIJOOOOOOOOOOOOOOOOOOOOO
+<= pro_builder_57 left the server
+=> Kurocat has joined the server
+=> pixi has joined the server
+<Spectr> perdon
+<proelian> queee
+<smile> r u sure
+<= Ashten_18 left the server (timed out)
+<Saberchnx> ohno today gamel 100 will be here :(
+<Spectr> perdon we
+<Ronzy111Fox> I sent to mail to you smile
+<= kitttykat4 left the server
+<womangamer> okay today at the nigth bouth are going to be in the same bed again,okay?
+<supercapitangato> au
+<bran58340222> DONDE ESTASS
+<smile> i saw
+<proelian> en cueva
+=> isco has joined the server
+=> junebug has joined the server
+<supercapitangato> el policia me pego
+<smile> r u sure
+<Ronzy111Fox> I said I'm true in the mail
+<= Kurocat left the server
+<proelian> perdon
+<Ronzy111Fox> i'm very true
+<Spectr> dije perdon
+<supercapitangato> quiero un pico
+<= erftg left the server (timed out)
+<smile> so we r still friends
+=> Kurocat has joined the server
+<= murii left the server
+<Ronzy111Fox> yeah
+<AERDTY> z
+<smile> thx
+<Spectr> toma gato
+<womangamer> mia go home
+<Ronzy111Fox> except for that stranger that went in our house
+<Emerythecuttie> ewww
+<Saberchnx> mia what are you doing
+=> Lavender_Lover has joined the server
+<gacha_lover> hi sis
+<Spectr> este
+<smile> i can show u where he lives
+<Lavender_Lover> hi
+=> -lipop- has joined the server
+=> Ashten_18 has joined the server
+<GajaJJ> hmmm were is mom
+=> Grayson7654 has joined the server
+<supercapitangato> au
+<_Natsuki_Chr_> GIVE BACK THE MONEY BAKA
+<smile> come
+=> minecraft_pro has joined the server
+<supercapitangato> me queme con la antorcha
+<Spectr> xd
+<= xXDinamicoXx left the server
+<smile> hes ur neighbor
+<Grayson7654> Hi
+=> _Alia_ has joined the server
+<Ronzy111Fox> what is his name
+<Grayson7654> Hi
+<= _Alia_ left the server
+<smile> camrn
+=> pikachu2 has joined the server
+<= cami-pro-123 left the server (timed out)
+<Grayson7654> Hi
+<carota> hi alia
+<Saberchnx> hi curcus baby :)
+<GajaJJ> mom
+<Grayson7654> Hi
+<pikachu2> AMOR
+<womangamer> oo golden can i tolk with you pls?
+=> locus162yt has joined the server
+<supercapitangato> piiiiiiiiiii
+<GajaJJ> pleas come
+<Ronzy111Fox> get out of my house strangerrrr
+<Grayson7654> Hi
+<supercapitangato> y pi
+<pikachu2> ANGELA
+<GajaJJ> mom pleas come
+<supercapitangato> donde eta pi
+=> cami-pro-123 has joined the server
+<Lavender_Lover> hi sis
+<womangamer> ok
+<bran58340222> CAROTA
+<Grayson7654> Ronzy111Fox Can You Be My Friend Bc No One Says Hi To me
+<bran58340222> VEN AL AUTO
+<carota> si bran
+<womangamer> what?
+<Ronzy111Fox> I will and smile is also my friend
+<bran58340222> VEN AL AUTO
+<GajaJJ> can i sleep whith gold
+<Grayson7654> Ok
+<supercapitangato> aaaaaaaaaaaaaaaaaaa
+<smile> what
+<womangamer> yes sure!
+<gacha_lover> sis ill start making the big crystal farm now
+<supercapitangato> policia tiene una espada
+<Ronzy111Fox> get a sword if she comes back smile
+<GajaJJ>  i like him so bad
+\e(c@#339933)-!- incitatus has quit [Ping timeout: 121 seconds]\e(c@#ffffff)
+=> YASMIN998800 has joined the server
+<bran58340222> CAROTA VEN AL PUEVLO
+<GajaJJ> yay
+\e(c@#339933)<lurk@IRC> ​Yay!\e(c@#ffffff)
+<womangamer> yeah ok
+<= locus162yt left the server
+<supercapitangato> amigo
+<Spectr> nop
+<Spectr> aver
+<smile> can i have q house 
+<goldenkiller> can i say somithing?
+<womangamer> hello
+<= Pemodragon left the server
+=> LuzuGermer has joined the server
+<= isco left the server (timed out)
+<goldenkiller> i am afk :)
+<Spectr> tome
+<GajaJJ> you know i have a crush on him right
+<womangamer> yes
+<Spectr> aca
+<bran58340222> conduse
+<Ronzy111Fox> you can live with me
+* goldenkiller is AFK
+<GajaJJ> oki bye
+<smile> ok
+<bran58340222>  CONDUSEEEE
+<bran58340222> VENNNNNN}
+<GajaJJ> weres sis
+=> bdvtry has joined the server
+<gacha_lover> sis
+<GajaJJ> i need to tell her
+<goldenkiller> its joke 
+<Lavender_Lover> yes
+<= manyiwu left the server (timed out)
+<womangamer> i dont know i think in spawn
+<gacha_lover> r u really my sis
+<Ronzy111Fox> I made him teleport to us
+<bran58340222> VEM
+<bran58340222> VEN
+<= cyo left the server (timed out)
+=> isco has joined the server
+<Lavender_Lover> yes
+<smile> k
+<supercapitangato> amigos
+<GajaJJ> kt
+<goldenkiller> can i go in fire?
+<gacha_lover> Christina
+<womangamer> yes
+<Spectr> que
+<Mia2020is18> no i am not i am in a secret spot
+<goldenkiller> auw
+<Lavender_Lover> yes
+<supercapitangato> falta mucho
+<womangamer> can i tolk with you golden??
+=> locus162yt has joined the server
+<Spectr> we no se crusen
+<Spectr> si
+<GajaJJ> hi
+<Spectr> asta conseguir diamante we
+<goldenkiller> hi
+<gacha_lover> nang tumgiroidro naocha
+<= pixi left the server
+=> amelka has joined the server
+<bran58340222> CONDUSE BIEN
+<GajaJJ> want to swim whith me
+<Ronzy111Fox> fire can kill you golden killer
+<= smile left the server (timed out)
+<womangamer> its only one moment and one qestion
+=> drumxxxuix has joined the server
+<supercapitangato> ojo poli
+<amelka> helo
+<womangamer> come here pla
+<Lavender_Lover> hi minecraft_pro
+<proelian> sip
+<amelka> helo
+<bran58340222> CAROTA
+<supercapitangato> las antorchas sacan vis
+<womangamer> pls*
+<Spectr> luego repartimos
+<carota> si
+<Grayson7654> XD P PPPP
+=> theet has joined the server
+<Grayson7654> Pppppppp
+<GajaJJ> yes mom
+<bran58340222> A DONDE VAMOS
+<Saberchnx> whats going on here now
+<= bdvtry left the server
+<goldenkiller> siema
+<womangamer> no you no golden
+<Ronzy111Fox> takeoff your clothes Grayson
+<amelka> siema
+<bran58340222> A DONDE VAMOS
+<= -lipop- left the server
+<Grayson7654> Is Yor House Owned
+<Grayson7654> Nope
+<bran58340222> AQUI FRENAAAAAAAAAAAAAAAA
+<womangamer> mia come home now!!!!!!!!
+<GajaJJ> hi
+<= locus162yt left the server
+<Mia2020is18> no
+<Jamel--pro> hola amigo Luzu
+<bran58340222> CAROTAAAAAAAAAAAAAAAAAAAAAA
+<supercapitangato> amigos
+<= Yad left the server
+<womangamer> pls come golden
+<= Lily__ left the server
+<goldenkiller> jest to polski snieg?
+<Spectr> que
+<proelian> no podemos encontrar diamantes
+<carota> cosa
+=> -lipop- has joined the server
+<supercapitangato> falta mucho
+<GajaJJ> were is my sis
+<Spectr> si we
+<goldenkiller> jest w polski snieg?
+<bran58340222> DONDE VAMOSSSSSSSSS
+<= pangland left the server
+<Jamel--pro> toma
+<= drumxxxuix left the server (timed out)
+<Saberchnx> hi want to be friends GajaJJ
+<supercapitangato> jode
+<= thiagob left the server
+<GajaJJ> sure
+<Spectr> busquemos una cueba
+<womangamer> come pls
+<proelian> sip
+<GajaJJ> did you see my sis
+<Jamel--pro> Luzu tenes espada o para mi tienda
+<goldenkiller> who
+<Saberchnx> here
+<supercapitangato> senior policia
+<amelka> gram teraz na tablecie wiec nie bendzie mnie wywalać
+<goldenkiller> me
+<bran58340222> DEJAME CONDUSIR
+<LuzuGermer> si
+<Grayson7654> Ow
+<= theet left the server (timed out)
+<= Lavender_Lover left the server (timed out)
+=> kevi has joined the server
+<Saberchnx> what does she look like 
+<= kevi left the server
+<Grayson7654> AHHH!
+<Ronzy111Fox> I did that because you were not moving
+<womangamer> what do you prefear mia or gaja
+<bran58340222> CAROTA
+<goldenkiller> ok
+<womangamer> go away gaja
+<Spectr> quien va iluminando
+<goldenkiller> ...
+<= KittyTheCat left the server (timed out)
+<= Ashten_18 left the server (timed out)
+<Grayson7654> And Your Second Friend Coolboy KILLED me
+<goldenkiller> amelka
+<Spectr> tomen
+<supercapitangato> na tongo antorcha
+<Spectr> iluminen
+<amelka> co
+<Spectr> hay
+<carota> que chieres
+<Saberchnx> cleans house
+<goldenkiller> nits
+<Grayson7654> Bc I was Hooding Mese
+<Ronzy111Fox> cool boy is my dad
+<bran58340222> PUEDO CONDUSIR
+<goldenkiller> niets*
+<amelka> nic
+<womangamer> what???????????????????????????????????????WHAT?????????'
+<Spectr> hay 
+<goldenkiller> isk
+<Grayson7654> WHY DID HE KILL ME
+<goldenkiller> idk
+<Spectr> hay
+<supercapitangato> a
+<amelka> pa
+<Ronzy111Fox> id
+<bran58340222> PUEDO CONDUSIRRRRRRRR
+=> KittyTheCat has joined the server
+<Grayson7654> FOR I HAD DIAMONDS
+<goldenkiller> pa
+<= Sterban left the server
+<Spectr> les dije
+<Ronzy111Fox> idk
+<carota> si
+<Grayson7654> AND HE TOOK IT
+<goldenkiller> why you hit me
+<Grayson7654> ASK HIM
+<GajaJJ> mom my name is eli
+<Jamel--pro> Luzu abreme
+=> jonaboss has joined the server
+<Spectr> cuidado
+<amelka> jak co to jestem na pvp
+=> Fireboy88 has joined the server
+<Ronzy111Fox> tell him if he's in the server
+<bran58340222> VEN
+<LuzuGermer> jamel que quieres espadas para tu tienda
+<Grayson7654> THIS IS SO UNFAIR
+=> bella1234 has joined the server
+=> Enri_Pro has joined the server
+<Spectr> diamante !
+=> isisu has joined the server
+<bran58340222> SUVE AL AUTO CAROTA
+<Grayson7654> YOU
+=> luna4452 has joined the server
+<Jamel--pro> gasias
+=> j has joined the server
+\e(T@sethome)Home set!\eE
+<= anna100 left the server
+<goldenkiller> i can't answer srry
+<supercapitangato> amigo
+<Saberchnx> done cleanig the house finily
+<Ronzy111Fox> (gives Grayson  the calm down potion)
+<womangamer> i dont know where is mia because she love you so much and she go to spawn buta then go other gay!
+<= gacha_lover left the server
+<GajaJJ> im polish
+<Spectr> que 
+=> pokediger1 has joined the server
+<supercapitangato> falta mucho
+<GajaJJ> siema
+<Ronzy111Fox> please don't kill me Grayson
+<Spectr> no
+<Jamel--pro> amigo tenes espada o armadura para mi tienda
+<= willocks left the server (timed out)
+<goldenkiller> siema
+<Ronzy111Fox> aaaaa@a
+<= pokediger1 left the server
+<supercapitangato> bien
+<Spectr> estamos en el lugar de diamantes
+<= minecraft_pro left the server
+<GajaJJ> ja polska
+<luna4452> bella1234 were are u
+<Jamel--pro> toma
+<womangamer> i dont know where is mi dougther cries*
+<bran58340222> SUBE
+<AERDTY> Jamer--pro ты русский?
+<Spectr> ya
+<Grayson7654> OW
+<goldenkiller> te jetes polak?
+<Grayson7654> STOP
+<bran58340222> SUVEEEEEEEEEEEEEEE
+<LuzuGermer> hoooo
+<Spectr> cuidado we
+<= KittyTheCat left the server (timed out)
+<goldenkiller> jestes*
+<GajaJJ> shes at spawn
+<Jamel--pro> denada
+<Ronzy111Fox> please don't kill me Grayson
+<= bella1234 left the server (timed out)
+<amelka> tak
+<Mia2020is18> no
+<carota> vas dentro il castello ce una sorpresa por ti bran
+<Jamel--pro> tenes mas
+<junebug> thx
+<MaLin4iKk> нет он англичанен
+<womangamer> mia!!!!
+<bran58340222> CAROTA SUVE AL AUTO
+<Mia2020is18> i am at a secret spot
+<womangamer> where are you?
+<Saberchnx> mia you here at spawn mia
+<= luna4452 left the server (timed out)
+=> KittyTheCat has joined the server
+<carota> va dento el acstelo
+<Ronzy111Fox> I said don't kill me Graysonnnn
+=> LIZZY_556 has joined the server
+<womangamer> come to kiss golden!
+<= HMOOD1111 left the server (timed out)
+=> Humetewa45 has joined the server
+=> srtaNhoafer-kawaii has joined the server
+<Grayson7654> WELL ITS HIS FAULT HE KILD ME
+<Jamel--pro> espera
+<Mia2020is18> no
+<bran58340222> CAROTA QUIERES ROVAR DE NUEVO
+<supercapitangato> amigo
+<carota> no
+=> pandagirl5 has joined the server
+<Ronzy111Fox> you don't kill me kill him maybe
+<goldenkiller> its dark
+<amelka> robie pożontek w skszynkah
+<proelian> euuuuuuuuu
+<GajaJJ> mom dose sis like golden
+<Jamel--pro> amigo
+<= -lipop- left the server
+<= Fireboy88 left the server
+<supercapitangato> que
+=> bella1234 has joined the server
+<bran58340222> SE NO ES MI COFRE Y NO SE PUEDE ABRIR
+<pandagirl5> emery
+<= milko left the server (timed out)
+<= isisu left the server (timed out)
+<supercapitangato> no pera
+=> jowell has joined the server
+<Saberchnx> mia im worred for you mia :(
+<bran58340222> SUBE AL AUTO
+<womangamer> but you say me bouth that you like golden really bad!
+<Jamel--pro> bye amigo
+<= TATOPR00 left the server
+<= j left the server
+<supercapitangato> me queda poca vida porfabor 
+<GajaJJ> well his mine
+<amelka> znowu tak sie umnie pisze sory:(
+<Mia2020is18> uggggghhhhh just stop
+<supercapitangato> sea bueno
+<womangamer> yes
+<womangamer> okay okay
+<Spectr> ve a comprar comida
+<supercapitangato> gracias
+<Grayson7654> Why is it lagging
+<= Rumnit left the server
+<proelian> na
+<Saberchnx> hes noones girls 
+<GajaJJ> lets go sleep
+<Mia2020is18> i dont care
+\e(T@sethome)Home set!\eE
+<Humetewa45> Character conversion failed!
+<= bella1234 left the server (timed out)
+<srtaNhoafer-kawaii> holaqqq
+=> Flower35 has joined the server
+<proelian> amigo vaja
+<supercapitangato> gracias poli
+<goldenkiller> zzz
+<Spectr> we tiro comida
+=> bella1234 has joined the server
+<goldenkiller> zzz
+<= ninjaLucas left the server
+<Mia2020is18> why should i care
+<Spectr> digo antorchas
+<goldenkiller> zzz
+Teleported to spawn!
+<goldenkiller> zzz
+<amelka> dobranoc
+<womangamer> time to sleep and this time gaja and golden togeather and mia and me
+=> Ashten_18 has joined the server
+<Spectr> hay
+<GajaJJ> gold you will sleep whith me 
+<goldenkiller> dobranoc
+=> milko has joined the server
+<srtaNhoafer-kawaii> holaa
+<GajaJJ> ok
+<Mia2020is18> i am not comeing home
+<goldenkiller> ask womangamer
+<Saberchnx> he dosnt love or like you two so find someone ells girls
+<carota> bran donde estas
+<GajaJJ> why sis
+<= bran58340222 left the server (timed out)
+<supercapitangato> amigo
+<amelka> zzz 
+<goldenkiller> zzz
+<junebug> hi
+<= pandagirl5 left the server
+<womangamer> yes you can sleep with golden
+<Mia2020is18> becuase now fucking leave me alone
+Teleported to spawn!
+<GajaJJ> why 
+<goldenkiller> zzz
+<Jamel--pro> hola amor
+<Saberchnx> sighs :(
+=> hhhhiiiikkk has joined the server
+<srtaNhoafer-kawaii> hola amor
+<womangamer> MIA!! this mouth!
+=> Sterban has joined the server
+<= junebug left the server (timed out)
+<Mia2020is18> i fucking leave me alone
+<= fdhusus123 left the server (timed out)
+=> junebug has joined the server
+<Jamel--pro> vovio mi cueta amor
+<= isco left the server (timed out)
+<womangamer> mia!!!
+<= pikachu2 left the server (timed out)
+<amelka> wiedziałam że nie spisz
+<Ronzy111Fox> please do not say bad words in this game
+<srtaNhoafer-kawaii> qué bueno felizidadez
+=> luna1224 has joined the server
+<Mia2020is18> what "mama"
+<GajaJJ> no come i dont like him
+<= swsws left the server
+<Jamel--pro> gasias
+<supercapitangato> amigo
+<proelian> hola
+<= YASMIN998800 left the server (timed out)
+<womangamer> come on to the room to sleep
+<Spectr> es grande la cueva
+<Humetewa45> تهمة
+<= eins_zwei_drei left the server
+<srtaNhoafer-kawaii> iesgoy jugando desde mi cel
+<Grayson7654> I am a FACKING Batch
+<bella1234> hello peeps
+<Saberchnx> leave golden killer alone you girl find other men
+<Jamel--pro> por
+<goldenkiller> ja spy
+<supercapitangato> amigo poli
+<womangamer> amelka y have a bed for you
+<luna1224> hi
+<Jamel--pro> amigo toma
+<Humetewa45> Atlantis rats ^^^
+<amelka> tak
+=> pikachu2 has joined the server
+<womangamer> heyªª!!!
+<= Humetewa45 left the server
+<LIZZY_556> can i have free stuff
+<Jamel--pro> bye amigo
+<supercapitangato> como bolbemos
+=> wuin has joined the server
+<amelka> na pewno
+<goldenkiller> is it light?
+=> tan123123 has joined the server
+<Spectr> we agarren todo lo que puedan
+<LuzuGermer> :)
+<Spectr> yo se
+<proelian> no se
+<wuin> hol
+<supercapitangato> ok
+<hhhhiiiikkk> yo wassup fucking fuckers
+<AERDTY> amelka дура еб
+<Spectr> es para nuestro pueblo
+=> HMOOD1111 has joined the server
+<proelian> ok vamonos
+<Spectr> agarren
+<Mia2020is18> oooooo bats
+<= jonaboss left the server (timed out)
+<= srtaNhoafer-kawaii left the server (timed out)
+<womangamer> folow me amelka
+<hhhhiiiikkk> fuck
+<amelka> tragedia jest dzień
+<= AERDTY left the server
+<goldenkiller> zzz
+<Saberchnx> no one come here please
+<womangamer> come here gaja
+<junebug> no spawn killing
+<amelka> wstawaj
+<GajaJJ> tak tragedia
+=> swsws has joined the server
+=> lapo has joined the server
+<Grayson7654> No Jsnsjjsshjahs Killing
+\e(c@#339933)-!- incitatus joined #catlandia\e(c@#ffffff)
+<goldenkiller> good morning
+<Spectr> diamante !
+<junebug> hi meher
+<= gothic4 left the server (timed out)
+<Spectr> agarren
+<supercapitangato> voy
+<Mia2020is18> ugggghhhh i stuck i have to go to spawn now
+<amelka> haha:)
+<womangamer> okay gaja and golden folow me NOW!!
+<Spectr> we en un rato me voy
+<goldenkiller> dzien dobre
+<Spectr> por 5 minutos
+<= Sarapvp left the server
+<supercapitangato> o diamantito
+<Flower35> hi Ashten
+=> eoeosi has joined the server
+<amelka> helo
+<= bella1234 left the server (timed out)
+=> srtaNhoafer-kawaii has joined the server
+<Spectr> pòr 30 minutos por hay
+<= panda99 left the server (timed out)
+<Ashten_18> flower. Ò_Ó
+<meher> galaway girl keeps attacking us imaooo
+<amelka> hi
+<= swsws left the server (timed out)
+<goldenkiller> hi
+<Flower35> what?
+<srtaNhoafer-kawaii> volci
+<Ashten_18> look.
+<womangamer> IM GOING TO TALK WITH YOU
+<Spectr> vajen
+=> Ryleedreamshine has joined the server
+<amelka> ok pa
+<= Enri_Pro left the server
+<womangamer> GAJA!!!
+<goldenkiller> with who
+<Ronzy111Fox> hi
+<= wuin left the server
+<Mia2020is18> hi
+<supercapitangato> amigo guardensen la lana para aser autos tengo mucos rombos amarillo
+<junebug> oh ,snap
+<Saberchnx> hi luna 
+=> picachu4 has joined the server
+=> uiik has joined the server
+<Ashten_18> what did u do!? 
+<Spectr> ok
+<womangamer> come golden
+<= luna1224 left the server (timed out)
+<= cami-pro-123 left the server
+<goldenkiller> amelka: chodz
+<Ashten_18> that was my sisters.
+<amelka> jestem na pvp
+<KittyTheCat> COME TO MY SHOP!!!
+<amelka> co
+<Spectr> wow
+<supercapitangato> aca en el agua
+<Flower35> i thot i coud biled here
+<= Ryleedreamshine left the server
+<Grayson7654> RONZY111FOX
+<Ashten_18> no!
+=> Enri_Pro has joined the server
+\e(c@#339933)-!- kim280_tems joined #catlandia\e(c@#ffffff)
+<= picachu4 left the server (timed out)
+<Ronzy111Fox> (puts earPods on and hears 80s music)
+<goldenkiller> jes kim280
+<Jamel--pro> hola amor
+=> bran58340222 has joined the server
+<amelka> hyba nie
+=> cami-pro-123 has joined the server
+<Grayson7654> RONZY!!!!!
+<= eoeosi left the server (timed out)
+=> _Alia_ has joined the server
+<Flower35> how was a spous to now
+<supercapitangato> amigos
+<Ronzy111Fox> whatttt
+<amelka> nic nie pisze
+<supercapitangato> no se nadar
+<proelian> que
+=> oscarbarbosa has joined the server
+<goldenkiller> czesc kim280
+<hhhhiiiikkk> guys
+<womangamer> guys sorry so much the bed rrom is here follow me
+<= srtaNhoafer-kawaii left the server (timed out)
+<Mia2020is18> i am not coming home
+<bran58340222> carotaa
+=> iceclasher1000 has joined the server
+<goldenkiller> amelka: chodz
+<hhhhiiiikkk> i have found alot of gold in mt mine!!!!!!!!!!!!!!
+<amelka> ale jak wyszłeś to wszedł
+<FujithecoolSushi> S
+<Ashten_18> ther was a half build house here. it was my sisters. did u not know it belongs to someone?
+<womangamer> follow me
+<supercapitangato> a lavaaaaaaaaaaaa
+=> yy has joined the server
+<bran58340222> CAROTAA
+<womangamer> guys
+<Saberchnx> mia i miss you so much :(
+=> picachu4 has joined the server
+<carota> si
+<bran58340222> VENN AL PUEVLO
+<supercapitangato> amigo aseptame
+<supercapitangato> aaaaaaaaa
+<hhhhiiiikkk> teleport to me i have found alot of gold in my mine
+<supercapitangato> casi muero
+<Spectr> xd
+<goldenkiller> on powiedazaw
+<FujithecoolSushi> ee
+<meher> pls kill galaway she is attacking everybody like bruh i was just chillin
+=> smile has joined the server
+<= amelka left the server (timed out)
+<bran58340222> VENNN
+<goldenkiller> i don't have the another w
+<supercapitangato> amigo agarre diamante 
+<proelian> asepta amigoo
+<Saberchnx> comein 
+<proelian> asepta
+<proelian> asepta
+<Ronzy111Fox> hi
+<proelian> amigooo
+<proelian> asept
+<smile> hi
+<proelian> asepta
+<Flower35> *runs and crys*
+<Mia2020is18> no body will ever find me
+\e(c@#339933)-!- kim280_tems has quit [Quit: edgy1.net IRC: https://edgy1.net/irc]\e(c@#ffffff)
+<supercapitangato> madame ami
+<proelian> amigooooooooooooo 
+<womangamer> go to sleep gaja and golden come here
+<Spectr> mira !
+<smile> whats wrong
+<Spectr> una ratita
+<Ronzy111Fox> i'm hearing 80s music
+<goldenkiller> but its light
+<Saberchnx> flower you okey 
+<Spectr> ahhh
+<bran58340222> CAROTAAAAAAAAA
+<smile> on the game
+<= uiik left the server (timed out)
+<Spectr> xd
+<_Alia_> hi
+<goldenkiller> yes and in real life
+<supercapitangato> casi muris amigo
+<Ronzy111Fox> rolplay
+<carota> cosa chieres
+<Spectr> xd
+<proelian> jjaajaja yo tambien
+<smile> GO
+<bran58340222> QUIEES UNA CASA
+<carota> si
+<bran58340222> CHIERES UNA CASA
+<Ronzy111Fox> please get out
+<bran58340222> ESTA
+<Saberchnx> i found you follow me to hide from home
+<smile> NOW
+\e(c@#339933)-!- kim280 joined #catlandia\e(c@#ffffff)
+<Mia2020is18> ok
+<carota> ranhieros una casa
+=> E200 has joined the server
+<Ronzy111Fox> get a sword smile
+<bran58340222> QUE ES RANIEROS
+<GajaJJ> well hi
+<goldenkiller> i have a puppy dog in real life and she is sleeping now :)
+<smile> i dont know how
+=> Nick18 has joined the server
+<goldenkiller> a chiwawa
+=> herne has joined the server
+\e(c@#339933)<kim280@IRC> Topic set by Edgy1 on 26 April 2020, 21:14:31\e(c@#ffffff)
+<carota> chiero una casa 
+Error: The owners stock is end.
+Error: The owners stock is end.
+<Saberchnx> were hereb
+Error: The owners stock is end.
+Error: The owners stock is end.
+Error: The owners stock is end.
+Error: The owners stock is end.
+<= jowell left the server (timed out)
+<GajaJJ> ja jestem polka
+=> manyiwu has joined the server
+=> maximiliano has joined the server
+<smile> is she gone
+\e(c@#339933)<Noelia_Kristina\ f@catlandia-relay> hola\e(c@#ffffff)
+\e(c@#339933)<Noelia_Kristina\ f@catlandia-relay> hola\e(c@#ffffff)
+<carota> ran me fas una casa
+<goldenkiller> and she is alone white and a puppy chiwawa
+=> Benjamin_PRO has joined the server
+<bran58340222> ESTA
+<Saberchnx> i live here mia
+\e(c@#339933)<kim280@IRC> 18:56:40 -ChanServ- [#EdgyIRC] REMINDER: OFFTPIC CHAT BELONGS IN #chat! Failure to adhere will result in a mute.\e(c@#ffffff)
+\e(c@#339933)<kim280@IRC> 18:56:41 *** kim280 (~kim280@EdgyIRC/guest/6jc.uha.s6tiu6.IP) has joined the channel\e(c@#ffffff)
+<goldenkiller> hi
+<Jamel--pro> vovio mi cueta
+<Ashten_18> flower why did u even wanna build u op ther. thers somany other places to build.
+<Ashten_18> so many*
+<Mia2020is18> nice
+<supercapitangato> amigos
+<bran58340222> SI O NO
+<manyiwu> HELP
+<hhhhiiiikkk> hi flower
+<Spectr> dime
+=> amelka has joined the server
+<Spectr> cuidado
+<Ronzy111Fox> I sent mail to you
+<Spectr> abajo
+<Emerythecuttie> Sis, i needa ask u a question
+<carota> si chiero una casa
+<Saberchnx> press the house mia with green arow
+<proelian> sip
+<junebug> did you kill her fuji
+<supercapitangato> alguien tiene lana
+<= maximiliano left the server (timed out)
+<= oscarbarbosa left the server (timed out)
+<Flower35> i like to bield in trees
+<bran58340222> ESTA TE GUSTA
+<Mia2020is18> they never find me here
+<FujithecoolSushi> no sadly
+<carota> no una piu grande
+<amelka> internet padł sory
+<smile> i got a bf
+<proelian> cuidao
+=> Humetewa45 has joined the server
+<bran58340222> OK
+<Spectr> ui
+<goldenkiller> XD
+<Emerythecuttie> wait nvm, flower isnt on
+\e(c@#339933)<kim280@IRC> #Edgy1        48      [+Pnt] Welcome to our main channel! | Website: https://edgy1.net | Discord: https://discord.gg/pP76nqP | Servers: Grand Theft Auto Minetest, Steamworks, Survivalworks Urban Edition | For more servers join: #BlockCity, #catlandia, #Dragons, #elidragon-skyblocks, #FrostFactions. #GDServers, #UnknownCreative #vineland, #WildWest | Most\e(c@#ffffff)
+\e(c@#339933)<kim280@IRC> servers support 0.4 AND 5.0+\e(c@#ffffff)
+\e(c@#339933)<lurk@IRC> [ EdgyNet\ f ] - edgy1.net\e(c@#ffffff)
+<Ashten_18> but why did u wanna build on THAT Tree.
+=> KingDan has joined the server
+<goldenkiller> hi
+<junebug> oof
+<= dodik left the server (timed out)
+\e(c@#339933)<kim280@IRC> #catlandia\e(c@#ffffff)
+\e(c@#339933)<kim280@IRC> Welcome to the official channel for Catlandia! Find catlandia at edgy1.net port 30025. More info at https://edgy1.net/cat. Discord server with chat relay available at https://discord.gg/pP76nqP | Congratulations to Catlandia for hitting 78 users!\e(c@#ffffff)
+\e(c@#339933)<lurk@IRC> [ CatLandia – EdgyNet\ f ] - edgy1.net\e(c@#ffffff)
+=> meow1 has joined the server
+=> dodik has joined the server
+<Nick18> junebug
+=> oscarbarbosa has joined the server
+<junebug> where is she
+<Spectr> diamante
+<Ashten_18> Meowy.
+<= _Alia_ left the server (timed out)
+\e(c@#339933)<kim280@IRC> #catlandia\e(c@#ffffff)
+\e(c@#339933)<kim280@IRC> 18:59:15 <kim280> Welcome to the official channel for Catlandia! Find catlandia at edgy1.net port 30025. More info at https://edgy1.net/cat. Discord server with chat relay available at https://discord.gg/pP76nqP | Congratulations to Catlandia for hitting 78 users!\e(c@#ffffff)
+\e(c@#339933)<kim280@IRC> 18:59:17 <lurk> [ CatLandia – EdgyNet ] - edgy1.net\e(c@#ffffff)
+<amelka> ppszedszkadzam
+\e(c@#339933)<lurk@IRC> [ CatLandia – EdgyNet\ f ] - edgy1.net\e(c@#ffffff)
+<Nick18> junebhg
+\e(c@#339933)<kim280@IRC> #catlandia\e(c@#ffffff)
+\e(c@#339933)<kim280@IRC> 18:59:15 <kim280> Welcome to the official channel for Catlandia! Find catlandia at edgy1.net port 30025. More info at https://edgy1.net/cat. Discord server with chat relay available at https://discord.gg/pP76nqP | Congratulations to Catlandia for hitting 78 users!\e(c@#ffffff)
+\e(c@#339933)<kim280@IRC> 18:59:17 <lurk> [ CatLandia – EdgyNet ] - edgy1.net\e(c@#ffffff)
+<junebug> did she leave
+\e(c@#339933)<lurk@IRC> [ CatLandia – EdgyNet\ f ] - edgy1.net\e(c@#ffffff)
+<womangamer> go away!!
+<= FujithecoolSushi left the server (timed out)
+<Jamel--pro> LUZU
+<goldenkiller> chodz
+=> maximiliano has joined the server
+<amelka> sory
+=> 12345 has joined the server
+\e(c@#339933)<Edgy1@IRC> !ban kim280\e(c@#ffffff)
+-!- mode/#catlandia [+b *!*@EdgyIRC/guest/6jc.uha.s6tiu6.IP] by ChanServ
+<amelka> ok
+<= LuzuGermer left the server (timed out)
+<junebug> hi nick
+<Saberchnx> im saberchnx brother
+<bran58340222> TIENES PICO
+<Nick18> hi junebug
+<Jamel--pro> Luzu
+<womangamer> wow you did it
+<= MaLin4iKk left the server (timed out)
+<junebug> im at spawn
+<Nick18> oh me to
+\e(c@#339933)-!- kim280 has quit [Z-Lined: spamming]\e(c@#ffffff)
+<bran58340222> CAROTA TIENES PICO
+<GajaJJ> yes
+<supercapitangato> a
+=> jfgy has joined the server
+<amelka> ta w zielonym mniie wkuża
+<Mia2020is18> *grbs my stuff*
+<womangamer> woahh
+<Nick18> hi junebug i miss you
+<smile> lets go on a walk
+<bran58340222> CAROTA TIENES PICO
+<junebug> yes
+<Ronzy111Fox> make sure we're not lost
+<Jamel--pro> luzur
+<Spectr> ya
+<womangamer> now is your boy friend?
+<oscarbarbosa> 77777777885875
+<Jamel--pro> luzu
+<bran58340222> CAROTAAAAAAAAA
+<smile> follow me
+<= Benjamin_PRO left the server
+<Saberchnx> why are there girls i mean a lot of girls
+<amelka> bije mnie ciongle
+=> roserosies has joined the server
+<womangamer> gaja!!
+=> MaLin4iKk has joined the server
+<oscarbarbosa> t
+<roserosies> hi 
+<GajaJJ> yes
+<supercapitangato> amigos
+<womangamer> is your boy friend?
+<goldenkiller> yay dziziaj zjem durumba :)
+\e(c@#339933)<lurk@IRC> ​Yay!\e(c@#ffffff)
+<womangamer> oooooo jijiji
+=> valepro has joined the server
+<smile> r u ok
+<= Humetewa45 left the server (timed out)
+<meher> yay
+\e(c@#339933)<lurk@IRC> ​Yay!\e(c@#ffffff)
+=> Liza4ka has joined the server
+<womangamer> mia!!
+<GajaJJ> not jet see you later
+<= picachu4 left the server
+=> Lexicupcake has joined the server
+<proelian> vamonos
+<amelka> hahaha:)
+<Spectr> uff
+<Ronzy111Fox> wait a minute we need to check if the girl is going to go in our mansion
+<supercapitangato> elian
+<hhhhiiiikkk> what should i fucking do with gold
+<goldenkiller> co?
+<Saberchnx> umm ship
+<smile> ok
+<proelian> vamonos
+<supercapitangato> poli
+=> -lipop- has joined the server
+<meher> everything gold is reallu useful
+<= E200 left the server
+<Liza4ka> русскиеее
+Teleported to spawn!
+<= KittyTheCat left the server
+<smile> Sabrnchnx tpr to me
+<amelka> nic nie musisz wiedzieć
+<MaLin4iKk> чтоооо
+<Nick18> hi 12345
+<roserosies> ronzy come spawn i give money 
+<goldenkiller> ok
+=> mohamed has joined the server
+<Liza4ka> тут играет Stefa?
+<proelian> vamonosww
+<Ronzy111Fox> I need to go a little bit
+<womangamer> what are you doing??? mmm
+<Nick18> sorry
+<smile> ill come
+<= yy left the server
+<goldenkiller> hi
+<womangamer> no hi
+<supercapitangato> poli no te pongas la espada me da miedo
+=> Michaelle has joined the server
+<womangamer> !!!
+<goldenkiller> ???
+<MaLin4iKk> незнаю
+<Ronzy111Fox> yay
+\e(c@#339933)<lurk@IRC> ​Yay!\e(c@#ffffff)
+<roserosies> hi come 
+<smile> hi
+=> Multicraft277 has joined the server
+<Saberchnx> hey smile
+<= Liza4ka left the server
+=> sofiaR has joined the server
+=> picachu4 has joined the server
+<womangamer> now gaja is your girl friend!
+<Spectr> tienen comida ?
+<smile> whats up
+<amelka>  mam 16  ha pe a ona tu pszyhodzi
+<= lucapr00 left the server
+<junebug> hey
+=> peggy02 has joined the server
+<proelian> si ven
+<mohamed> hey guyg
+<Michaelle> Ronzy
+<bran58340222> AYUDA CAROTAA
+<mohamed> j
+<= carota left the server (timed out)
+<junebug> no stealing
+<= jfgy left the server
+<goldenkiller> but i have mor friends
+<Ronzy111Fox> yes are you new Michelle
+<goldenkiller> more*
+<Spectr> gracias
+<smile> i want to introduce u to someone come
+<womangamer> yes right
+<= dodik left the server (timed out)
+<mohamed> hye guygs
+<junebug> put it back
+<= peggy02 left the server (timed out)
+<= Multicraft277 left the server
+<Michaelle> Is autumn days on
+<-lipop->  
+<amelka> sory musze iść
+<Spectr> es muy grande esto
+<proelian> vamossssss
+<proelian> sip
+<womangamer> do you want see the tv?
+<manyiwu> Saberchnx gajall kill me
+=> Ari_321123 has joined the server
+<Spectr> siii !
+=> thiagob has joined the server
+<= aorus left the server
+<supercapitangato> tengo miedo
+<= Lexicupcake left the server
+<smile> Ronzy this is my friend
+<Michaelle> Well ronzy its me harry
+<Saberchnx> why 
+<valepro> hola
+<proelian> ajajjaajja
+<Ronzy111Fox> wtf
+<Ari_321123> enily are you on
+<goldenkiller> -----_____-----
+This area is owned by kostas!
+This area is owned by kostas!
+This area is owned by kostas!
+<Ronzy111Fox> Michelle why are you always changing your name
+<Michaelle> It meeee
+<smile> what is happening 
+<Spectr> diamante !
+=> E22 has joined the server
+<= lapo left the server
+<womangamer> mia where are you
+<roserosies> ronzy come we go to 
+<Saberchnx> smile you okey 
+<smile> no
+This area is owned by NahuelTvGGGGGG!
+This area is owned by NahuelTvGGGGGG!
+This area is owned by NahuelTvGGGGGG!
+<smile> faints
+<= Ari_321123 left the server
+<amelka> cy ten tablet może pisać z sensem
+=> carota has joined the server
+<LIZZY_556> lipop kill somewon
+<Saberchnx> whats wrong
+<Spectr> ahh
+<supercapitangato> aaaaaaaaaaaaaaaaaaa
+<goldenkiller> ok
+=> hdhdhzhzz has joined the server
+<womangamer> are you okay?
+<Michaelle> Autumn days keeps turning my name off
+<bran58340222> CAROTA AYUDA
+<Ronzy111Fox> I need to go to my other Friends Rosie
+<amelka> dobra pa
+<Grayson7654> 
+<goldenkiller> pa
+<Michaelle> I mean voice
+<carota> si
+<= sofiaR left the server (timed out)
+<Spectr> wow
+<Michaelle> ill come with
+<E22> ewj
+=> Ariana55 has joined the server
+<Spectr> cuidado
+<supercapitangato> aaaaaaaaaaaaaaaaaaaaaa
+<Michaelle> Sorry
+<proelian> si cuidado
+<bran58340222> VEN
+<Saberchnx> dont stand on smile 
+<smile> oww
+<= E22 left the server
+<Ariana55> hey smile and sab
+<= oscarbarbosa left the server
+<Michaelle> Yea
+<bran58340222> ME AYUDAS
+<Saberchnx> yeah
+<Grayson7654> Huhsiauausjdjdjsndjdhd djdjdjddbdjdjxnxis dis. Idk. Did cy was he’s xnxndjdnd dnxjdnskskdbs d fiend is. Jxnsjsf dndnd candid cudjejdjdjdjdjdjdrjdnd if conch XD if f fncnd djd d did xxjcu dnc Finn ncn c duck. FUC can UCD. C I bc Vic. Fcncnf c in nc con icjf c did cjcn ccjcn cxjcjf c ncjxjsnx xjxnx.
+<carota> donde es mi casa
+<junebug> here nick
+=> MiniBlackCat has joined the server
+<= Tuxy left the server (timed out)
+<Nick18> oppps
+<bran58340222> AQUI LA AGO GRANDE
+<amelka> pa:(
+<Michaelle> Hi im harry
+<Spectr> gato tienes pico ?
+<supercapitangato> poli elia
+<Nick18> ere
+<= KingDan left the server
+<cami-pro-123> SEXO?
+<proelian> yo si tengo quien quiere
+<= Grayson7654 left the server
+<roserosies> come 
+<junebug> she stole from us
+<Ronzy111Fox> smiled and saber and Michelle we are going to make a friend team
+<Spectr> xd
+<Michaelle> k
+<supercapitangato> aaaa
+<Michaelle> k
+<Saberchnx> smile whats wrong 
+=> malta has joined the server
+<Emerythecuttie> Ashton, what r u to My sister?
+<Michaelle> Call me harry christ
+<smile> why is everyone following me
+=> Grayson7654 has joined the server
+=> KingDan has joined the server
+<Jamel--pro> hola valepro
+<amelka> :(
+<goldenkiller> can i go out if house?
+<junebug> are oat wheat rye and barley
+<carota> questa e mi casa
+<valepro> hola jamel 
+=> maurio has joined the server
+<maximiliano> vusco novia
+<womangamer> gaja can we do that i die and you and golden have a babie that its me pls pls pls!!
+<junebug> she took them
+=> E200 has joined the server
+<= malta left the server (timed out)
+<goldenkiller> ...
+<carota> questa e mi casa
+=> panda99 has joined the server
+<= KingDan left the server (timed out)
+<Mia2020is18> da fuck
+<amelka> :(
+<bran58340222> PERDON
+<Ariana55> hey smile
+=> KingDan has joined the server
+<Saberchnx> whoo you scared me 
+<goldenkiller> bye i have to go
+<carota> no donde es mi casa
+=> Lily__ has joined the server
+<bran58340222> AQUI
+<= goldenkiller left the server
+<= mohamed left the server (timed out)
+<junebug> she stole our stuff
+<= panda99 left the server (timed out)
+<Ariana55> lol sorry 
+This area is owned by iceclasher1000!
+<Michaelle> Ronzy
+<smile> only my friends can follow me everyone else leave me alone please
+<Spectr> siganme
+=> kievski has joined the server
+<proelian> ya somos ricos
+<Ronzy111Fox> smile and Michelle and saber tpr to me
+<proelian> jajajajajaja
+<Saberchnx> its okey dufe
+=> panda99 has joined the server
+<GajaJJ> hi mom
+<bran58340222> CHIERES ESTA CASA CAROTA
+<Nick18> im going to put portection all orande the house
+<Saberchnx> i mean dude
+<carota> bran donde es mi casa
+<amelka> nie
+<supercapitangato> amigoo
+<womangamer> hello
+<= Ariana55 left the server (timed out)
+<Ashten_18> go away.
+This area is owned by iceclasher1000!
+=> Fox99 has joined the server
+<Michaelle> o at my mantion
+<Saberchnx> smile
+<Ronzy111Fox> Sabercchx and smile teleport to me
+<Saberchnx> where are you 
+<Grayson7654> RONZY LET ME TPR YO YOU I AM YOUR FRIEND
+<blackmoon1235> Galwaygirl please go
+<smile> only sabnachnx and ronzy can follow me
+<carota> ho un piccon
+<roserosies> ronzy 
+<= manyiwu left the server (timed out)
+<Flower35> im here for goden aples
+<junebug> yes and lock ALL chests she took are wheat and stuff in that chest
+=> manyiwu has joined the server
+<Michaelle> Got to eat
+<Ashten_18> ok.
+<= Michaelle left the server
+<Ronzy111Fox> ok
+<= Mia2020is18 left the server (timed out)
+<GalwayGirl> ok i'll go
+<junebug> its gone
+<bran58340222> TIENES COMIDA CAROTA
+<roserosies> i kill you 
+<smile> hi
+<iceclasher1000> Thx
+<blackmoon1235> Thank you
+<carota> no
+<GalwayGirl> if you tell me how to get crystal
+<junebug> and pls add me to the protection
+<Saberchnx> whats wrong smile 
+<roserosies> ( change wampire )
+<bran58340222> LO QUE TIENES EN LA MAN
+<= E200 left the server
+<blackmoon1235> Idk
+<iceclasher1000> Ingots?
+<supercapitangato> aseme tpr rapido
+<Grayson7654> I need Jumgle Logs
+<smile>  rb ask totpr to me ok
+<= LIZZY_556 left the server (timed out)
+<bran58340222> ME MUERO DAME COMIDA
+<carota> miele 
+<supercapitangato> dale poli
+<Grayson7654> Cuz I died From a Pro
+=> agj has joined the server
+<Ronzy111Fox> OK teleport to me
+<blackmoon1235> I fond this armor in a dead block
+<iceclasher1000> Ingots?
+=> fell has joined the server
+<blackmoon1235> *found
+<Saberchnx> poor smile here 
+<smile> ask to tpr to me ok
+<junebug> add me to the protection please nick
+=> BraiansitoCH has joined the server
+<GalwayGirl> oh no
+<proelian> septa amigo
+<= amelka left the server (timed out)
+<= roserosies left the server (timed out)
+<Grayson7654> ususjshshs
+<= 12345 left the server
+<GajaJJ> \tp to mia01228w
+<junebug> did you
+<GalwayGirl> i've been mining for hours and did not find crystal
+<Spectr> wow
+<Saberchnx> here smile
+<iceclasher1000> Crystal is rare
+=> Tuxy has joined the server
+<proelian> amigo donde   estas??
+<= agj left the server (timed out)
+<kievski> crystal grows on the blue grass
+<Ronzy111Fox> this is where you get the jungle logs
+<GalwayGirl> but it cannot be this rare
+<= fell left the server (timed out)
+<blackmoon1235> You can make crystal ingots
+<proelian> asepta
+<supercapitangato> aseptame amigo
+<proelian> asepta
+=> 12345 has joined the server
+<supercapitangato> uf
+<proelian> asepta
+<junebug> can you add me please
+<Spectr> manda
+<Grayson7654> I NEED JUNGLE LOGS
+<Nick18> ok
+<GalwayGirl> i found several stacks mithril but not a single crystal1
+<Ronzy111Fox> this is where you get jungle logs
+<Grayson7654> WITH MY BEAR HANDS?
+<iceclasher1000> You can craft it!?!?!””!
+<supercapitangato> amigos
+<Ronzy111Fox> oh
+<Grayson7654> I NEED A AXE
+<Spectr> dime
+<Nick18> thre
+<GalwayGirl> no i lloked it up
+<supercapitangato> tego miedo:(
+<bran58340222> CHIERES ESTA CASA
+<junebug> thanks add me to. all of it or it wont wokr
+<= smile left the server (timed out)
+<Spectr> xd
+<carota> finisco io il pavimiento 
+<proelian> que grandeeeee
+<Saberchnx> smile 
+<supercapitangato> es muy profunda
+=> eins_zwei_drei has joined the server
+<Ronzy111Fox> can somebody give me an axe
+<Spectr> xd
+<kievski> crystals come from crystal grass, grown on the blue grass
+<= MiniBlackCat left the server
+<= GajaJJ left the server
+<blackmoon1235> Well for me I can make crystal
+<GalwayGirl> ok thank you
+<Ronzy111Fox> can you give me an ax
+<carota> segueme
+<= GONZALAX left the server
+<Spectr> tranquilo
+<GalwayGirl> iceclasher1000: do u have an enderchest
+<Saberchnx> smile left the game dude
+<Ronzy111Fox> plz
+<Spectr> mkientras estemos juntos
+<supercapitangato> a
+<iceclasher1000> No sorry
+=> iusisijdidiwhh has joined the server
+<supercapitangato> policia me pego
+<Ronzy111Fox> she left the game because of time out
+<= 12345 left the server
+<= BraiansitoCH left the server
+<proelian> vamos ?
+<iusisijdidiwhh> mens
+<Saberchnx> yeah that 
+<Spectr> ya espera
+<proelian> vamos?
+<junebug> brb
+<= hdhdhzhzz left the server
+<womangamer> girls where are you??
+<supercapitangato> amigo
+<= cami-pro-123 left the server
+=> 12345 has joined the server
+<Nick18> tere
+<womangamer> gaja mia!!
+<= milko left the server (timed out)
+<= junebug left the server (timed out)
+=> BraiansitoCH has joined the server
+<proelian> vamosss
+<supercapitangato> poli
+<proelian> que
+=> picachu has joined the server
+<Saberchnx> mia left the game women
+<supercapitangato> sacate el arma :( porfi me da miedo
+=> Claudiox has joined the server
+<= Lily__ left the server
+=> Burrhus has joined the server
+<proelian> ok
+<= iusisijdidiwhh left the server
+<proelian> ohhhhhh
+<supercapitangato> eeeeeeeeeeee miren atars
+<Spectr> ya veo
+<suffer_god69> anyone has any aspen wood?
+<proelian> uffffffff que grandeee
+<= temujin left the server
+=> milko has joined the server
+<suffer_god69> i cant find any aspen trees
+<Grayson7654> I do
+=> caiden has joined the server
+Initiating transfer to station 'Base'.
+Initiating transfer to station 'Old Place'.
+Initiating transfer to station 'Spawn'.
+<Saberchnx> leave her alone
+<valepro> NNNNNNNNNNNNNnnnnnnnnnnnnnnNNNNNNnnnnnnnnnoOOOOOOOOOOOOOOOOOOOOOO
+<Grayson7654> Apple tree
+<proelian> vamossssssssss????¿¿¿
+<valepro> por que amiiiiiIIIIIIIiiiIIIIII
+<bran58340222> ELIAN VEN
+<bran58340222> HOIJO VEN
+<Grayson7654> Find some
+<proelian> NO ESTOY EN MINA VEN  VOZ
+<Grayson7654> And I need a axe
+<Ronzy111Fox> ,players
+\e(c@#339933)<trackr@IRC> Players on cat: -lipop-, 12345, Ashten_18, BraiansitoCH, Burrhus, Claudiox, Emerythecuttie, Enri_Pro, Flower35, Fox99, GalwayGirl, Grayson7654, HMOOD1111, Jamel--pro, KingDan, Kurocat, MaLin4iKk, Nick18, Ronzy111Fox, Saberchnx, Spectr, Sterban, Tuxy, Yuuichi210, Zaairagarciia, _Circus_Baby_, _Natsuki_Chr_, blackmoon1235, bran58340222, caiden, carota, dasum, eins_zwei_drei, herne, hhfgh, hhhhiiiikkk, iceclasher1000, kievski, manyiwu, maurio, ma\e(c@#ffffff)
+<= KingDan left the server
+\e(c@#339933)<trackr@IRC> Total: 55 players across 1 active server (and 0 inactive servers).\e(c@#ffffff)
+<Saberchnx> run 12345
+=> Michaelle has joined the server
+<bran58340222> NO NECECITO QUE SAQUE S ESTO
+<valepro> QUIEN VENDE GATOS
+=> jesenia has joined the server
+<proelian> EHHH QUIEN LOS AGARO
+<Michaelle> k im back
+<= jesenia left the server
+<Spectr> yo no
+<carota> bran me das arredamento per mi casa
+<supercapitangato> lo que
+<pikachu2> tpy
+<= BraiansitoCH left the server
+=> cami-pro-123 has joined the server
+<Saberchnx> dont kill her dude
+<Ronzy111Fox> Michelle change your name into Ronzy112Fox
+<supercapitangato> poli el arma
+<bran58340222> VEN HIJO
+=> kim280 has joined the server
+<Nick18> ok
+<bran58340222> PORFA
+<valepro> hola cami__PRO
+<supercapitangato> da miedo
+<kim280> siema
+<Michaelle> ronzh
+<Nick18> she stole and killed me
+<bran58340222> HIJOOOOOOOOOOOOOOOOO
+<suffer_god69> grayson do you have any white aspen wood
+<Spectr> imaginate en minecraft 
+<carota> me das arredamento por mi casa si o no
+<kim280> goldenkiler
+<Ronzy111Fox> yes
+<Spectr> con los monstruos
+<valepro> quien vende gatosss
+<Grayson7654> No It’s Rare
+<bran58340222> SI YA VOY
+<womangamer> alguien me da una casa o me dice donde comprarla??
+<Michaelle> o
+<suffer_god69> oh ok
+<Grayson7654> It’s in Vineland
+=> babybanana has joined the server
+<hhhhiiiikkk> HI GUYS WHO WANTS TO TRADE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+<Michaelle> We need a car
+<babybanana> hi
+<Grayson7654> Me
+Teleported to spawn!
+<Spectr> ehhh
+<hhhhiiiikkk> tpr to me
+=> Smilygirl2020 has joined the server
+<Ronzy111Fox> change your name into Ronzy112Fox
+<bran58340222> HIJOOOOOOOOOOOOOOOOOOO
+<valepro> WOWANGAMER EL QUE VENDE CASAS SE LLAMA juanjo_PM
+<proelian> VEN AMIGO
+<babybanana> oki 
+<kim280> goldenkiller
+<Michaelle> We need a car
+<Spectr> elian pone /tpy
+<hhhhiiiikkk> if youn want to trade
+<= manyiwu left the server (timed out)
+<Smilygirl2020> hola
+=> Periii has joined the server
+<Ronzy111Fox> ok
+<supercapitangato> que le paso
+<Spectr> plz
+<Spectr> rapido -!
+<Michaelle> Look
+<Spectr> uff
+<valepro> WOWANGAMER EL QUE VENDE CASAS SE LLAMA juanjo_PM
+<Ronzy111Fox> I have three now
+<babybanana> hi
+<supercapitangato> ojo
+<maurio> 6
+<Michaelle> how much have u got
+<Spectr> casi casi
+<= milko left the server (timed out)
+<babybanana> womangamer
+<proelian> si la lava es peli
+<Ronzy111Fox> 3
+<proelian> grosa
+<Michaelle> o
+<maurio> 5SSSS
+<womangamer> smilygirl me llevas a tu tiendqa porfis??
+<Spectr> xd
+<= caiden left the server (timed out)
+Teleported to spawn!
+<Ronzy111Fox> I will just get one from the ATM
+<Michaelle> U hade 1 i had 3
+=> milko has joined the server
+<= Nick18 left the server
+<Michaelle> kkk
+<carota> donde es mi casa mostramela bran
+<Periii> heyy
+<= cami-pro-123 left the server
+<blackmoon1235> I come in peace
+<babybanana> whel whle hah
+<bran58340222> es aqui
+<womangamer> hhola smily
+<Spectr> uff
+<Smilygirl2020> hi
+<Smilygirl2020> hola
+<hhhhiiiikkk> TPR TO ME SOME ONE SO WE CAN TRADE
+<supercapitangato> somos re pros
+<Spectr> que nervios
+<proelian> si jajjaaj
+<Spectr> si
+<womangamer> me llevas a tu tienda plis??
+<bran58340222> es esta tu casa
+<proelian> mal 
+<Smilygirl2020> ok
+<Jamel--pro> no yo soi pro
+<proelian> PAAAAAAAAAAAAAAAA
+<Smilygirl2020> escribe /tpr Smilygirl2020
+<bran58340222> queeeeeeeee
+<Smilygirl2020> escribe /tpr Smilygirl2020w
+<proelian> VENN
+<Smilygirl2020> escribe /tpr Smilygirl2020
+=> Ariana55 has joined the server
+<Grayson7654> I Got Attacked
+<supercapitangato> a
+<bran58340222> ya vuelvo carota ok
+<Smilygirl2020> escribe /tpr Smilygirl2020
+<valepro> QUIEN ES DINAMICOOOOO
+<Grayson7654> Don’t kill me
+<womangamer> no me deja
+<carota> me das arredamento por mi casa
+<Smilygirl2020> uhhh
+<Smilygirl2020> claro que te deja
+<Jamel--pro> quin eres panda
+<Smilygirl2020> escribe /tpr Smilygirl2020
+<hhhhiiiikkk> TPR TO ME
+<hhhhiiiikkk> SOMEONE
+<supercapitangato> aaaaaaaaaa
+<Ronzy111Fox> i'm coming
+<iceclasher1000> Da ^^^^
+<valepro> ALGUIEN SABE QUINE ES EL TAL DINAMICO
+<supercapitangato> amigo me pego
+<hhhhiiiikkk> SO WE CAN TRADE
+<babybanana> yak
+<= Michaelle left the server (timed out)
+<Smilygirl2020> un amigo mio
+<hhhhiiiikkk> PLZ
+<hhhhiiiikkk> PLZ
+<hhhhiiiikkk> SOMONE
+<= Fox99 left the server (timed out)
+=> M41k3 has joined the server
+<Grayson7654> Hi
+=> Michaelle has joined the server
+<= 12345 left the server
+<hhhhiiiikkk> TPR TO ME !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+<bran58340222> que hijoooooo
+<Grayson7654> KILLED
+<babybanana> hi galwaygirp
+<Grayson7654> KILLER
+<Ariana55> smilygirl are you smily
+<babybanana> hi
+<Periii> whats the mission
+<Smilygirl2020> no
+<Smilygirl2020> im other
+<Ariana55> oh sorry 
+<Smilygirl2020> np
+<Ariana55> ok
+<Smilygirl2020> so much tell me that
+<supercapitangato> amigo poli
+<blackmoon1235> Did you just die
+<valepro> WOWANGAMER EL QUE VENDE CASAS SE LLAMA juanjo_PM
+<proelian> QUE
+<babybanana> hi velepro
+<= panda99 left the server (timed out)
+<Jamel--pro> hola
+<Michaelle> im harry know
+<supercapitangato> tengo suenio
+<Smilygirl2020> hola
+<Grayson7654> No YOU TRIED TO KILL ME
+<Ronzy111Fox> ik
+<Ariana55> well wana be freinds smilygirl
+<bran58340222> HIJO VEN
+<Smilygirl2020> ok
+<Ashten_18> wtf.
+<Jamel--pro> tenes teleportador
+=> pianoboy has joined the server
+<womangamer> llevame a tu tienda plis
+<Ronzy111Fox> wait I'm not sitting correctly
+<kim280> plz to spike
+<proelian> VEN TU
+<bran58340222> HIJOOOOOOOOOOOOOO VENNNNN
+<suffer_god69> anyone sells aspen wood?
+<proelian> tvennnnnnnnnn
+<proelian> tpr
+=> kkkiiilllkkkk has joined the server
+<Smilygirl2020> hi
+=> smile has joined the server
+<Ashten_18> are u stalking me?
+Teleport request sent! It will time out in 60 seconds.
+<hhhhiiiikkk> NO
+<bran58340222> ME MORI
+<Smilygirl2020> why u tp to me hik
+<Grayson7654> R
+<Flower35> no
+<womangamer> aqui estoy
+<Michaelle> Hi
+=> Muian has joined the server
+=> Nick18 has joined the server
+=> jnnjnxfb has joined the server
+<smile> hi everyone
+<hhhhiiiikkk> hi
+<Grayson7654> KILLED
+<= Ariana55 left the server (timed out)
+<Smilygirl2020> hi galway girl
+<suffer_god69> anyone sells aspen wood? whe white colour one
+<Grayson7654> KILLER
+<Ashten_18> whatever. 
+<smile> hi
+<Smilygirl2020> hi galway girl
+<Michaelle> Hi
+<Saberchnx> hey smile
+<valepro> ¿Quien vende gatos?
+<Smilygirl2020> hola
+<proelian> paaaaaaaaaaaaaa
+=> Alisa has joined the server
+<Flower35> i came her to saw sorry
+=> Ariana55 has joined the server
+<Periii> hey
+<Michaelle> Who is
+<womangamer> hola
+<Smilygirl2020> ven
+<babybanana> bye ruddud's
+=> fgg has joined the server
+<supercapitangato> tengo miedo
+<Ariana55> sorry my phone did
+<Ariana55> ded
+Teleport request sent! It will time out in 60 seconds.
+<Smilygirl2020> aprendete esto
+<Grayson7654> RONZY that’s your dad
+Teleport request sent! It will time out in 60 seconds.
+<proelian> vennn
+<Ashten_18> if u wher sorry. u whould remove youre treehouse.
+<smile> r we still friends
+<proelian> paaaa
+<Jamel--pro> noob ;.;
+<carota> bran donde estas
+<Ariana55> oh smily you are. on
+<Michaelle> Im his best friend
+=> amelka has joined the server
+<Saberchnx> yeah smile 
+<Smilygirl2020> acuerdate de este camino
+<proelian> pa ven
+<Ronzy111Fox> no that's my friend grayson
+<Nick18> junebug
+<Emerythecuttie> ashten, who r u to my sister flower?
+=> cami-pro-123 has joined the server
+<= fgg left the server (timed out)
+<womangamer> oki
+<kim280> o amelka
+<Smilygirl2020> ok
+<smile> ronzy
+<Grayson7654> OH ITS COOLBOY
+<Ronzy111Fox> Drive
+<Michaelle> um is she comin
+<Spectr> uff
+<Ashten_18> ?
+<Grayson7654> WHO KILLED ME
+Teleport request sent! It will time out in 60 seconds.
+<supercapitangato> amigo
+<valepro> ¿Jamel-Pro vendes gatos?
+Teleport request sent! It will time out in 60 seconds.
+Teleport request sent! It will time out in 60 seconds.
+<Michaelle> or
+=> GONZALAX has joined the server
+<Grayson7654> KILLED
+<Spectr> dime
+<Ronzy111Fox> smile California to me
+<amelka> cześć
+<smile> ronzy
+<valepro> ¿Jamel-Pro vendes gatos?
+<Emerythecuttie> Who r u to Flowergirl
+<= meher left the server
+<Jamel--pro> NOP POR
+<babybanana> hha
+<supercapitangato> tengo suenio
+<Ronzy111Fox> teleport to me
+<Ronzy111Fox> stop
+<Spectr> duerme we
+<Smilygirl2020> im smily girl
+<Michaelle> i know
+<supercapitangato> no tengo cama
+<Ronzy111Fox> smile teleport to me
+<Ashten_18> youre stranger, why whould i tell u. -_-
+<Emerythecuttie> Flower foxy*
+<proelian> amigooooooo
+<Ariana55> " walks and hums at the same time"
+<smile> sent
+<Emerythecuttie> Im her sister-
+<Michaelle> Im ur bro right
+<bran58340222> me voy al puevlo
+<amelka> co tam
+<Michaelle> Get in
+<Nick18> galway friends
+<Ronzy111Fox> Jump in
+<proelian> yo voy
+<smile> no
+=> soldado0scuro has joined the server
+<Smilygirl2020> womangamer eres inglesa?
+=> qweff has joined the server
+<Ronzy111Fox> plz
+<Michaelle> Why
+<Nick18> hi
+<Michaelle> Plz
+=> murii has joined the server
+<GalwayGirl> iceclasher1000: where r u
+<Ronzy111Fox> grrrrr
+<Smilygirl2020> hablas ingles woman?
+<proelian> yo voy
+<smile> u know i hate cars
+<Smilygirl2020> hablas ingles woman?
+<= -lipop- left the server
+<Michaelle> k bye
+<womangamer> me puedes dar trabajo
+<carota> me hai preso arredamento bran
+<Smilygirl2020> no lo siento
+<Emerythecuttie> She helped me build my house, since i hardly be on to see her i just  send her mailbox emails
+<Ronzy111Fox> haha
+<Smilygirl2020> no lo siento
+<womangamer> ok
+<Emerythecuttie> So who r u to my sister.
+<Ariana55> oh hey sab
+<soldado0scuro> lucia estamos en videollamsa
+<Ronzy111Fox> Drive
+<Smilygirl2020> ok
+<womangamer> y  hay alguna casa libre?
+=> LuzuGermer has joined the server
+<Michaelle> When we are there tp to us
+<supercapitangato> aca ven
+<Spectr> toma
+<= jnnjnxfb left the server (timed out)
+<Ariana55> inors
+<Spectr> un escudo
+=> uehdhdhdhdh has joined the server
+<bran58340222> ya vuelvo carota
+<Ashten_18> oh. thats flower. the other one is Flower_Foxy.  foxy's not online.
+<proelian> amigos me perdi
+<bran58340222> ta
+<supercapitangato> gracias
+<Jamel--pro> cami bendes una casa
+<= Muian left the server (timed out)
+=> Muian has joined the server
+<Spectr> denada
+<supercapitangato> aseme tp
+<= kievski left the server
+<Emerythecuttie> Ik that, but who r u to her-
+<Jamel--pro> cami
+<Spectr> agarra
+<Smilygirl2020> quierres comprar?
+<Ronzy111Fox> whoah
+<Emerythecuttie> r u her friend or her boyfriend
+<= smile left the server (timed out)
+<Ashten_18> her friend.
+=> smile has joined the server
+<= GONZALAX left the server
+<Nick18> almalmak friends
+<Jamel--pro> cami
+<Spectr> toma
+<amelka> gdzie jesteś kim2020
+<Smilygirl2020> quierres comprar?
+=> iwisisisis has joined the server
+<womangamer> teneis carne?
+<kim280> amelka
+<supercapitangato> gracia
+<= kkkiiilllkkkk left the server
+<carota> ci vediamo domani. ale 4:00
+<smile> ronzy where r u going
+<= pianoboy left the server (timed out)
+<Emerythecuttie> 
+<Spectr> denada UwU
+<proelian> pa toma
+<amelka> tak
+<Michaelle> Cinema
+<Emerythecuttie> @-@
+<babybanana> glawaygirl can we be frinds?
+<valepro> nick time oult gooo
+<Smilygirl2020> why u tp to me
+<Ariana55> SMILY SAB
+<supercapitangato> O_O
+<Jamel--pro> CAMI
+<amelka> yes
+<hhhhiiiikkk> hi
+<Smilygirl2020> hi
+<Ronzy111Fox> cat city
+<Michaelle> YO
+<hhhhiiiikkk> smily
+<= herne left the server
+<smile> ok
+<bran58340222> sos e mejor
+<proelian> hola
+<Ronzy111Fox> omg
+<murii> I need green glow worms please
+<amelka> muwisz po polsku
+<Michaelle> Just chill
+<proelian> pa me puedo aser una casa?
+<bran58340222> toma carota
+<GalwayGirl> i'm friends with anyone, but also enemies with anyone
+<Ronzy111Fox> we fell in the water
+<soldado0scuro> lucia inete a la videollamada
+<supercapitangato> amigo tengo opcidiana
+<Emerythecuttie> Ima go byee
+<murii> I need green glow worms please
+<bran58340222> si claro
+<smile> why
+<proelian> gracias
+<Ronzy111Fox> it was a mistake
+<Spectr> arriba
+<bran58340222> toma carota
+<= Tuxy left the server
+<murii> for green worms
+<Alisa> Скем можно падружить
+<womangamer> smily donde estas??
+<amelka> helo
+<proelian> donde pa
+<supercapitangato> aya
+(223,-18,237) is protected by Gracye.
+<Smilygirl2020> en spawn
+<Periii> heyaa
+(223,-19,233) is protected by Gracye.
+(223,-20,233) is protected by Gracye.
+hhhhiiiikkk is requesting to teleport to you. /tpy to accept.
+(223,-20,232) is protected by Gracye.
+(223,-19,233) is protected by Gracye.
+(223,-20,232) is protected by Gracye.
+<Jamel--pro> hola cami
+<Ronzy111Fox> we're not in here for swimming
+<= qweff left the server (timed out)
+<womangamer> pus veni
+<bran58340222> donde quieras
+<murii> I need green glow worms please
+<= Emerythecuttie left the server (timed out)
+<Alisa> что ау
+<smile> lol
+<Nick18> friends pro
+<proelian> ok
+<amelka> no co
+=> d has joined the server
+<hhhhiiiikkk> hi galway
+<womangamer> me has dejado sola
+<Spectr> ya
+=> mahan has joined the server
+<Alisa> что ауа
+<= Periii left the server
+\e(c@#339933)-!- TrollekPL has quit [Connection closed]\e(c@#ffffff)
+<Nick18> i live here
+<= blackmoon1235 left the server (timed out)
+=> jessy has joined the server
+<Smilygirl2020> ya estoy
+<Smilygirl2020> que quieres comprar
+<Nick18> pro friends
+\e(c@#339933)-!- Somehy joined #catlandia\e(c@#ffffff)
+<womangamer> tienes carne??
+<murii> I need green glow worms please
+<Smilygirl2020> no
+=> leyres has joined the server
+<hhhhiiiikkk> ududfuyvfuhsbfibf
+<kim280> amelka 
+<Spectr> toma
+<womangamer> y sushi o algo asi?
+=> grewas has joined the server
+<Smilygirl2020> no
+Error: Your inventory is full, exchange aborted.
+<suffer_god69> anyone sells aspen wood?
+<hhhhiiiikkk> bdhbsifbfhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
+=> nina has joined the server
+<smile> i trying to find a way out
+<suffer_god69> i need aspen wood
+<proelian> PAAAAAAAAAAAAAAAAAAAAAAAAA
+<supercapitangato> gracias
+<amelka> yes tak
+<womangamer> donuts?
+<Spectr> ya
+<bran58340222> queeeeeeeee
+<smile> brb
+<suffer_god69> anyone sells aspen wood?
+<= Muian left the server
+<Ariana55> ok
+<proelian> DONDE STAS
+<kim280> typ do mnie
+<= pikachu2 left the server (timed out)
+<Michaelle> Huh look
+This area is owned by tjs!
+<= Smilygirl2020 left the server (timed out)
+This area is owned by tjs!
+This area is owned by tjs!
+This area is owned by tjs!
+<bran58340222> piiccando piedra en la mina de kla
+<Ronzy111Fox> tpr to me Michelle
+This area is owned by tjs!
+This area is owned by tjs!
+This area is owned by tjs!
+<Michaelle> No
+<= babybanana left the server (timed out)
+This area is owned by tjs!
+<Michaelle> Wait
+This area is owned by tjs!
+This area is owned by tjs!
+This area is owned by tjs!
+This area is owned by tjs!
+This area is owned by tjs!
+<smile> ronzy want a red car
+<Ronzy111Fox> but I got a new car
+=> babybanana has joined the server
+<suffer_god69> anyone sells aspen wood?
+=> xXDinamicoXx has joined the server
+=> Adreimami has joined the server
+<Jamel--pro> cami bendes casas
+=> alisa1234567 has joined the server
+<= amelka left the server (timed out)
+<Ronzy111Fox> I got a new car
+<Michaelle> waht color
+<= jessy left the server
+<murii> I need green glow worms please
+<= uehdhdhdhdh left the server (timed out)
+<Ronzy111Fox> Orange
+<cami-pro-123> no!
+<Michaelle> k
+<Ariana55> how do i get out pf card wtf
+This area is owned by tjs!
+This area is owned by tjs!
+This area is owned by tjs!
+This area is owned by tjs!
+This area is owned by tjs!
+This area is owned by tjs!
+<Jamel--pro> ah ok bye
+<smile> just asking there is a red and blue car inthe water
+<Ronzy111Fox> tpr to me
+This area is owned by tjs!
+This area is owned by tjs!
+This area is owned by tjs!
+This area is owned by tjs!
+This area is owned by tjs!
+This area is owned by tjs!
+=> vsgddveggxgs has joined the server
+<supercapitangato> amigo le asemos una sorpresa a pi
+This area is owned by tjs!
+<Ariana55> crs
+This area is owned by tjs!
+This area is owned by tjs!
+This area is owned by tjs!
+This area is owned by tjs!
+This area is owned by tjs!
+This area is owned by tjs!
+This area is owned by tjs!
+This area is owned by tjs!
+<Ariana55> cars
+This area is owned by tjs!
+=> blackmoon1235 has joined the server
+This area is owned by tjs!
+This area is owned by tjs!
+<Spectr> we volvemos ?
+<cami-pro-123> bye
+<supercapitangato> si
+<smile> where did u go
+<Spectr> ok
+<Ronzy111Fox> let's get a little bit faster slow
+<carota> cosa ases proelian
+<Michaelle> Tl to us smile
+<Spectr> pone tpr
+<murii> I need green glow worms please
+<Spectr> a mi
+<alisa1234567> ищу парня,пишите я
+Error: You dont have enough in your inventory to buy this, exchange aborted.
+This area is owned by tjs!
+<womangamer> leyres como puedo tener una casa??
+<= Ariana55 left the server
+=> GalwayGirl has joined the server
+\e(c@#8800AA)PM from lurk@IRC: Welcome to the server, GalwayGirl! | Have a nice day!\e(c@#ffffff)
+=> Vismaya has joined the server
+<nga> 1029
+<= Ryleedreamshine left the server
+This area is owned by Adventurer!
+=> Lily__ has joined the server
+=> _Circus_Baby_ has joined the server
+<Vismaya> thanks
+<quan_2k9> lam j vay
+<Lily__> дим ти тут?
+<goldenkiller> tpr to me who want mining
+=> gacha_lover has joined the server
+<nga> dat bao ve
+<goldenkiller> tpr to me who want mining
+=> YourMom123 has joined the server
+<nga> mac du hoi nguy hiem
+=> nickio has joined the server
+<= gacha_lover left the server
+<nga> chac den day thoi
+<= Vismaya left the server (timed out)
+=> 310888 has joined the server
+<goldenkiller> i fond gold
+<Pemodragon> i found mese
+<= Lily__ left the server
+<nga> ti chet
+=> amelka has joined the server
+=> Vismaya has joined the server
+This area is owned by Adventurer!
+<nga> chac tui xay nha o day
+(163,11,211) is protected by manu69.
+(174,7,210) is protected by Bron.
+<= SirNigel left the server
+<goldenkiller> Daniel207: tpr to me
+<amelka> siema
+<quan_2k9> tui cujg nghi giong ba
+<Daniel207> k
+=> Lavender_Lover has joined the server
+<nga> vi lop 4 ma gioi tieng anh vay
+<amelka> gdzie jesteś
+<= _Circus_Baby_ left the server (timed out)
+<goldenkiller> come
+Please click on the target you want to travel to.
+<= YourMom123 left the server (timed out)
+<amelka> goldenkiller
+This area is owned by tjs!
+This area is owned by tjs!
+This area is owned by tjs!
+This area is owned by tjs!
+This area is owned by tjs!
+This area is owned by tjs!
+This area is owned by tjs!
+This area is owned by tjs!
+=> avidaan has joined the server
+<goldenkiller> siema amelka
+<= Vismaya left the server (timed out)
+<amelka> siema
+=> Maya has joined the server
+=> ptopto has joined the server
+<goldenkiller> Daniel207: come look here
+<Lavender_Lover> hi nickio
+<= biscaro left the server
+=> 1029 has joined the server
+<nickio> hi
+<nga> 1029
+<amelka> gdzie jesteście
+<goldenkiller> wait here
+=> XxEmilyxX has joined the server
+* XxEmilyxX is back
+<Maya> hi emily
+<Lavender_Lover> hi emily
+<goldenkiller> moje domu
+<nga> quan
+<XxEmilyxX> hi! :D
+=> LokiFrogus has joined the server
+<amelka> ok
+<quan_2k9> j
+<amelka> a gdzie on
+<nga> ong giup tui tim manh dat trong
+<= avidaan left the server (timed out)
+<goldenkiller> tpr amelka
+=> gacha_lover has joined the server
+<amelka> co
+<1029> tpy quan
+<quan_2k9> uk
+<gacha_lover> hi 
+<Maya> emily
+<LokiFrogus> Hmmm
+<XxEmilyxX> hi! XD
+<Lavender_Lover> i need food emily plz :(
+<nga> gan cho nha moi
+<XxEmilyxX> ok
+<nickio> who is online?
+<gacha_lover> Emily
+<XxEmilyxX> lemme se3...
+<Maya> who armors is in the shared chest emily?
+<= Lilyyyy left the server
+<Daniel207> look
+<gacha_lover> sis
+<XxEmilyxX> i made some for you! :D
+<Lavender_Lover> yes
+<nga> thui tui tim duoc rui
+<Maya> oh thank you!
+<= Pemodragon left the server (timed out)
+<Maya> :)
+<gacha_lover> ill give u food sis :D
+<Lavender_Lover> ok
+<goldenkiller> come and do nothing ok
+=> momashaal has joined the server
+<gacha_lover> at spawn
+<goldenkiller> or tpe to me
+<XxEmilyxX> ...
+<goldenkiller> tpr*
+=> dodik has joined the server
+<Lavender_Lover> emily food
+<Daniel207> woah
+<XxEmilyxX> i got food if you want it
+<= amelka left the server (timed out)
+(82,30,237) is protected by Kadin123.
+<goldenkiller> what?
+(82,30,237) is protected by Kadin123.
+(81,30,237) is protected by Kadin123.
+(80,30,237) is protected by Kadin123.
+(80,30,237) is protected by Kadin123.
+<Lavender_Lover> plz emily
+<Maya> ok
+<= fsgsgsvsg left the server (timed out)
+This area is owned by 9T9!
+<goldenkiller> you can do speed?
+<gacha_lover> accept
+This area is owned by 9T9!
+=> amelka has joined the server
+This area is owned by 9T9!
+This area is owned by 9T9!
+This area is owned by 9T9!
+This area is owned by 9T9!
+This area is owned by 9T9!
+This area is owned by 9T9!
+This area is owned by 9T9!
+This area is owned by 9T9!
+This area is owned by 9T9!
+This area is owned by 9T9!
+<= ptopto left the server (timed out)
+<amelka> mam lagi
+<Maya> emily
+<gacha_lover> sis accept
+<XxEmilyxX> yes
+<goldenkiller> Daniel207: tpr to me
+<= momashaal left the server (timed out)
+<Maya> come
+=> Jerry1908 has joined the server
+<XxEmilyxX> k
+<nga> hi chi jerry
+<= LokiFrogus left the server
+=> Pemodragon has joined the server
+<Jerry1908> hi nga!
+<1029> hello jerr1908
+<amelka> jestem na spałnie
+<goldenkiller> come
+<nga> thui de chieu lam
+<Maya> my one armors got lose :(
+<Lavender_Lover> thx
+<1029> remember me?
+=> _Circus_Baby_ has joined the server
+<XxEmilyxX> oh no!
+<nga> hen 14:40 nha
+This area is owned by Pemodragon!
+<goldenkiller> i ja jestem to wote
+<Jerry1908> pp!
+<Jerry1908> hi huy
+(-186,49,498) is protected by regt.
+(-186,49,498) is protected by regt.
+(-186,50,498) is protected by regt.
+(-186,50,498) is protected by regt.
+(-186,49,500) is protected by regt.
+(-186,50,501) is protected by regt.
+(-187,50,498) is protected by regt.
+(-188,49,498) is protected by regt.
+<amelka> ok
+<nga> pp
+<1029> tp me
+<Daniel207> noooo i see gold way up there!
+<= nga left the server
+<Maya> *sighs*
+<quan_2k9> hi chi jerry1908
+<Daniel207> and i think dimonds
+<GalwayGirl> Maya: T
+<amelka> yes
+<= XxEmilyxX left the server (timed out)
+<Jerry1908> Um.. Hi Quan?
+<GalwayGirl> why u sighing
+=> rvz2 has joined the server
+=> XxEmilyxX has joined the server
+<gacha_lover> wb Emily
+<Maya> i lost my armors
+<1029> quan nho noobyddoob ko
+<XxEmilyxX> oh no!
+<GalwayGirl> i can give you new
+<amelka> goldenkiller
+<goldenkiller> Daniel207:  come to spawn
+<XxEmilyxX> thx gacha!
+Teleported to spawn!
+<Maya> ok tp to me
+<gacha_lover> your welcome
+<quan_2k9> dau
+Teleport request sent! It will time out in 60 seconds.
+<amelka> jesteś
+Request Accepted!
+<GalwayGirl> i need enderchest
+<amelka> jaktam
+<XxEmilyxX> i have
+<1029> nho noobydoob ko quan
+<quan_2k9> tui off day
+<1029> bye
+<GalwayGirl> mithril & dia are in my echest
+=> fers has joined the server
+<amelka> helo
+<goldenkiller> Daniel207: this is my friend
+\e(c@#339933)-!- incitatus joined #catlandia\e(c@#ffffff)
+<quan_2k9> 14.40 nha
+<fers> всем привет 
+<Jerry1908> Quan sao em bit cj lon hon em
+<Daniel207> hi 
+<GalwayGirl> Maya: i'll come back
+<= quan_2k9 left the server
+-!- Invalid command: spanw
+<Maya> k
+Teleported to spawn!
+<= 310888 left the server
+<Jerry1908> :v
+<amelka> gdzie masz swuj dom
+=> baby_pasha has joined the server
+<goldenkiller> nie tutaj
+=> manyiwu has joined the server
+<Jerry1908> XD
+<amelka> a
+Teleport request sent! It will time out in 60 seconds.
+Request Accepted!
+<= rvz2 left the server
+<GalwayGirl> mithril or dia?
+<goldenkiller> w jaskini
+<1029> tp me jerry 1908
+<GalwayGirl> i have no crystal
+=> ptopto has joined the server
+=> hgujhi has joined the server
+<Maya> oh
+<= Aakord left the server
+=> -lipop- has joined the server
+<amelka> a gdzie
+<Maya> its ok i can bu my own armor:)
+=> zyrel has joined the server
+<= ptopto left the server (timed out)
+Teleported to spawn!
+<Maya> thank you!
+\e(T@sethome)Teleported to home!\eE
+* Jerry1908 is requesting to teleport to you. /tpy to accept.
+<goldenkiller> bardzo daleko
+<zyrel> who is jerry
+<Jerry1908> XD
+<Jerry1908> hi
+<amelka> serio :(
+<gacha_lover> ok what about others Emily
+<XxEmilyxX> maya here
+<1029> zyrel 
+=> Nekyata_ToP has joined the server
+<goldenkiller> tak
+<XxEmilyxX> I dunño!
+<zssz> КТО РУССКИЙ
+<Maya> thank you vrry much
+<fers> я
+<1029> this is my room
+<Daniel207> golden do u habe sticks
+=> Snakebob has joined the server
+<gacha_lover> :(
+<goldenkiller> i to jest - 10000
+<amelka> a pokazać swuj
+<goldenkiller> yes
+<zyrel> 1029 can i see
+<= _Circus_Baby_ left the server (timed out)
+<goldenkiller> wait
+<Daniel207> i need 5
+<1029> tp me zyrel
+<XxEmilyxX> i know i know what your thinking...
+=> vampire1 has joined the server
+=> Stesha99 has joined the server
+<zssz> у тебя есть песок или стёкла любые?
+<= Nekyata_ToP left the server (timed out)
+<goldenkiller> Daniel207: here
+<Maya> lol
+<fers> стекло
+<Stesha99> ребята скажите как создать карту что бы играть с друзьями
+<fers> сколько надо 
+<gacha_lover> im not thinking anything
+=> Laevolac has joined the server
+<XxEmilyxX> oh ok
+<1029> tp me zyrel
+<XxEmilyxX> BUT!
+<zssz> ну незнаю но мног нужно
+<Maya> emily wait here i will just buy
+<amelka> hoć zemnoł
+<gacha_lover> ?!
+<goldenkiller> ok
+<fers> я в старом доме
+<XxEmilyxX> ?!?
+<amelka> daniel tesz
+<Daniel207> lo9k now i can ght mobs
+<goldenkiller> Daniel207: follow amelka
+<hgujhi> bye
+<gacha_lover> ?!?!?
+<= Stesha99 left the server (timed out)
+<fers> городе
+<1029> tpy zyrel
+<XxEmilyxX> ???
+<fers> не доме
+<= hgujhi left the server
+<goldenkiller> Daniel207: come
+<gacha_lover> ???
+<= zssz left the server (timed out)
+<XxEmilyxX> ?
+<gacha_lover> what
+<fers> автозамена
+<amelka> 1
+<Jerry1908> Huy bao tủi
+<XxEmilyxX> i dunno
+<1029> zyrel 
+<XxEmilyxX> do you know?
+<Jerry1908> tuoi
+<XxEmilyxX> lol
+<gacha_lover> i dont know
+<1029> 10
+<gacha_lover> ahhh
+<1029> quan biet
+<goldenkiller> Daniel207: tpr to me
+<Maya> i lost my 45 putple moneys
+=> hgujhi has joined the server
+<gacha_lover> i gotta eat lunch
+<XxEmilyxX> The power of dun
+<Jerry1908> Goi day bang cj de XD
+<XxEmilyxX> Oh no
+<amelka> pujde po niego
+<1029> 10 tuoi co van de gi ko
+\e(c@#339933)<kim280\ f@catlandia-relay> hello\e(c@#ffffff)
+<XxEmilyxX> YOU HAD PURPLE!?!?
+<amelka> ej
+<GalwayGirl> i can only serve with ores as i am a miner
+<Lavender_Lover> i eat lunch with my mum sis
+<XxEmilyxX> PURPLE!?
+<= hgujhi left the server (timed out)
+<Maya> no the blue
+<goldenkiller> hi kim280
+<XxEmilyxX> oh.
+<amelka> nie ma go
+<1029> zyrel tpy
+<amelka> huk
+\e(c@#339933)<kim280\ f@catlandia-relay> amelka\e(c@#ffffff)
+<goldenkiller> Daniel207: where are you?
+=> zssz has joined the server
+<Daniel207> were are you 
+<zssz> можно я тп к тебе?
+=> inhinjhhuhhhhhhhhhh has joined the server
+<Lavender_Lover> i need gold
+<zssz> фирм
+<zssz> фирс
+<XxEmilyxX> Wat..
+<Maya> whythose everything keep on loosing:(
+<amelka> ej
+<= fers left the server (timed out)
+<Daniel207> tp me
+Teleported to spawn!
+<XxEmilyxX> i have a dropping problemo...
+<1029> zyrel can u hear me
+<goldenkiller> on jest tutaj
+<Daniel207> there you are
+<goldenkiller> come
+<gacha_lover> dont bring anyone here 
+<amelka> a
+=> fers has joined the server
+<XxEmilyxX> ok
+<fers> датп
+<fers> тп
+<zssz> фирс прими тп пж
+<amelka> to muj dom
+<1029> zyrel
+<goldenkiller> ok
+<XxEmilyxX> ive seen theese before
+<gacha_lover> brb
+<= gacha_lover left the server
+<fers> сори
+<XxEmilyxX> k
+<zssz> ok
+<goldenkiller> don't take nothing
+<goldenkiller> amelka: 
+<fers> сколько надо
+<goldenkiller> amelka: tutaj
+<zssz> незнаю но много нужно
+<fers> 50 хватит.
+<zssz> ну да 
+<amelka> dzienki
+<goldenkiller> dla protect
+<goldenkiller> chest
+<fers> квартира в аренду 
+<zssz> спасибочки
+<fers> можешь посмотреть
+<Daniel207> q
+<1029> ZYREL
+=> kim280 has joined the server
+<zssz> )
+<zyrel> ye ?
+<amelka> o
+<1029> tp me
+<zssz> крутя
+<Daniel207> wait in my invitory i got a glow ruby ore
+<goldenkiller> czesc kim280
+<zyrel> sorry ny bro tp
+<kim280> goldenkiller
+<amelka> ok
+<zyrel> tp 1029
+<kim280> siema
+<goldenkiller> ok
+<= inhinjhhuhhhhhhhhhh left the server (timed out)
+<Daniel207> whats that
+<Snakebob> tpy
+=> rvz2 has joined the server
+<zssz> это будет как дом с куартирами?
+<Daniel207> waht
+<goldenkiller> o doorbel
+<fers> нижние этажи мои
+<Snakebob> hi
+<kim280> a gdzie jestescie?
+<fers> верхние в аренду
+<goldenkiller> pvp
+<1029> this is my new home
+<Daniel207> how did you make that
+<zssz> а ясно
+<fers> можешь снизу посмотреть
+<zyrel> tp 1029
+=> guhi has joined the server
+<= Jerry1908 left the server (timed out)
+<goldenkiller> idk
+<fers> там здорово
+<kim280> na arenie pvp?
+<zssz> круто получается
+<Snakebob> i want one
+<Maya> hello snake bob tp me to mee i have a suprise
+<amelka> masz patyk
+<goldenkiller> tak
+<zssz> вау 
+<goldenkiller> tak
+<1029> ask hoanglong if u want one
+<Snakebob> is he in the game?
+<amelka> halo
+<goldenkiller> kim280: come
+<-lipop->  
+<manyiwu> YOUR RICH
+<1029> hes off
+<= baby_pasha left the server
+<= guhi left the server (timed out)
+<XxEmilyxX>  .playes
+<zssz> позяка если свободин ти можешь показать где синие деревья растут
+<Daniel207> anyone want to help me bud my home
+<1029> tpr me zyrel
+<XxEmilyxX>  .players
+\e(c@#339933)<trackr@IRC> Players on cat: -lipop-, 1029, Daniel207, GalwayGirl, Laevolac, Lavender_Lover, Liamy, Maya, Pemodragon, Snakebob, XxEmilyxX, amelka, dodik, fers, goldenkiller, kim280, lera1111, manyiwu, nickio, rvz2, vampire1, zssz, zyrel\e(c@#ffffff)
+\e(c@#339933)<trackr@IRC> Total: 23 players across 1 active server (and 0 inactive servers).\e(c@#ffffff)
+<fers> их надо садить на кристал земле
+<amelka> a możesz dać
+<goldenkiller> jestem
+<Snakebob> leave a sign write snakebob wants a room
+<zyrel> is this a fallout shelter
+<zssz> уго
+<1029> ok snakebob
+<zssz> а у тебя зажинец есть?
+<zssz> 1
+<Snakebob> thanks
+<fers> у Лины попроси
+<zyrel> can u tell me i want 9ne 1029
+<goldenkiller> amelka: kim280 jest tutaj
+<kim280> a areasu nie chcezr
+<fers> нету 
+<zssz> оки спасиб 
+<1029> where u come from snakebob
+<fers> я дом строю уж 3дня
+<Lavender_Lover> hi zyrel
+<zyrel> hi
+<amelka> helo
+<fers> замучился
+<zssz> ого 
+<kim280> no hello czesc
+\e(T@sethome)Teleported to home!\eE
+=> Jerry1908 has joined the server
+<zyrel> the house is almost ready for u too 1029
+<Daniel207> q
+<amelka> cześć
+<1029> zyrel where snkebob come from 
+<Daniel207> i didnt get anythug
+<goldenkiller> czesc 
+<Snakebob> ummm
+<zyrel> remembet he is my bro
+<kim280> mam cryształowom zbroie prawie
+=> Anhjlic has joined the server
+<1029> i have a car
+<Daniel207> bra
+<amelka> nie rozumiem
+=> ZairaMich has joined the server
+<kim280> chocie
+<1029> snakebob thats my farm
+<amelka> ok
+<Snakebob> ok
+<Lavender_Lover> zyrel lets be friends
+<kim280> a typ do spawn
+Teleported to spawn!
+<Snakebob> im getting wood
+<1029> where u come frome snakebob
+<amelka> daniel go tu daniel
+<goldenkiller> Daniel207: come to spawn
+<Daniel207> im sleeping
+<Snakebob> teleport
+=> _Circus_Baby_ has joined the server
+=> Lilyyyy has joined the server
+<1029> where u come from snkebb
+<= vampire1 left the server
+<Snakebob> idk
+<amelka> czekać na daniela
+<kim280> goldenkiller
+<1029> you fool
+<= _Circus_Baby_ left the server (timed out)
+<= Lilyyyy left the server
+<kim280> ok
+<amelka> daniel go tu mi
+<zyrel> why u said u fool
+<XxEmilyxX> Afk
+=> Lizzie_506 has joined the server
+<goldenkiller> Daniel207: tpr  to me
+<1029> u knew im from vietnam already snakebob
+<= ZairaMich left the server
+<= fers left the server
+<Maya> hi lizzie
+<amelka> comi
+=> vampire1 has joined the server
+<Lizzie_506> hi
+<Lavender_Lover> plz zyrel lets be friends
+<XxEmilyxX> Away From Keybord (afk)
+<amelka> nie czekam
+<kim280> goldenkiller choc
+<1029> snakebob listen to me
+<amelka> spałn
+<Snakebob> ok
+<nickio> COME TO MY SHOP I SELL CRYSTAL DIRT CHEAP!!!
+<kim280> look to me
+<1029> where u come from
+<Daniel207> :(
+<Maya> ok
+<GalwayGirl> ok
+Teleport request sent! It will time out in 60 seconds.
+=> gacha_lover has joined the server
+<Snakebob> at my house?
+<zyrel> i thought u said ur sell crystal and mese i will buy loads
+<Lavender_Lover> hi sis
+<goldenkiller> ja mam samaochod
+<1029> dont answer i kill you
+<gacha_lover> hi
+<Snakebob> i answer
+<kim280> to dawaj
+<GalwayGirl> well someone sells crystal for 99 coal
+<kim280> ale nie tu
+<Daniel207> a
+<Maya> ok
+* XxEmilyxX is back
+<amelka> mam lekcie sory
+<zyrel> HEY 1029 WHY U BEING MEAN TO MY BRO U KNOW I CAN STILL KILL U :)
+<Maya> where
+<Daniel207> spawn
+Teleport request sent! It will time out in 60 seconds.
+<amelka> pa
+* gacha_lover is back too
+<Jerry1908> nickio may I come
+<goldenkiller> dlaczego
+=> John_Wick has joined the server
+<amelka> yes
+<kim280> ok
+<XxEmilyxX> :)
+Request Accepted!
+<Lizzie_506> have you seen husky
+<gacha_lover> :)
+<Daniel207> do u have ten dimond
+<amelka> nobo tak
+<Maya> no i havent
+<kim280> come
+<goldenkiller> i have 1 diamond :)
+<amelka> sama nie hce
+<amelka> pa
+<gacha_lover> Emily
+<goldenkiller> pa
+<Daniel207> i want a car
+<1029> fine u can protct your cuontryless bro
+<= amelka left the server
+<Snakebob> hi nickio
+<kim280> a 1 crystal ingot
+<XxEmilyxX> gacha do you know how to area protect?
+<gacha_lover> im suppose to make a crystal farm
+<Lizzie_506> oh well
+<zyrel> 1029 u said u will kill my bro nust remember i have a sword :)
+<XxEmilyxX> ok
+<gacha_lover> no idk
+=> ajffhhhv2071 has joined the server
+<goldenkiller> wait
+Error: You dont have enough in your inventory to buy this, exchange aborted.
+Error: You dont have enough in your inventory to buy this, exchange aborted.
+Error: You dont have enough in your inventory to buy this, exchange aborted.
+Error: You dont have enough in your inventory to buy this, exchange aborted.
+Error: You dont have enough in your inventory to buy this, exchange aborted.
+Error: You dont have enough in your inventory to buy this, exchange aborted.
+Error: You dont have enough in your inventory to buy this, exchange aborted.
+Error: You dont have enough in your inventory to buy this, exchange aborted.
+<gacha_lover> can u tell me how
+<XxEmilyxX> i can teach you!
+Error: You dont have enough in your inventory to buy this, exchange aborted.
+<XxEmilyxX> yep
+<Maya> who sells crystal dirts
+<gacha_lover> thanks :D
+<goldenkiller> come to spawn
+<XxEmilyxX> lets start
+<goldenkiller> or tpe to me
+<nickio> i refill
+<gacha_lover> ok
+<goldenkiller> tpr*
+<gacha_lover> but lets firnd a spot
+<zyrel> this is soon ur home
+<= ajffhhhv2071 left the server (timed out)
+<gacha_lover> find*
+<Maya> nickio do you sel"
+<Lavender_Lover> hi
+<Snakebob> nickio do you sell crystal?
+<goldenkiller> hi
+<1029> look i have enchanted diamond sword zyrl
+Teleported to spawn!
+<XxEmilyxX> so
+<gacha_lover> what r u making
+<zyrel> hmm from who
+<nickio> mybe later on
+<goldenkiller> come to glass
+<kim280> nie pro...
+<XxEmilyxX> so come here
+<zyrel> guess what i have crystal gear and items :)
+<1029> i made myself
+<gacha_lover> ok
+<Snakebob> you sell crystal
+<XxEmilyxX> in this hole
+<gacha_lover> k
+<Maya> who sel"s crystal dirts
+<XxEmilyxX> and do /area_pos1
+<XxEmilyxX> in the hole
+<nickio> me!!!
+<Snakebob> nickio
+<nickio> tp to me
+<nickio> yes
+<XxEmilyxX> :D
+<gacha_lover> and?
+<Snakebob> do you sell crystal?
+<XxEmilyxX> come up here
+<Maya> sorry
+<gacha_lover> ok
+<1029> i use hoanglongs enchant table to enchent my sword
+<XxEmilyxX> where i am
+<zyrel> do u have some flowers :)
+<= manyiwu left the server (timed out)
+<= dodik left the server (timed out)
+=> amelka has joined the server
+=> bill has joined the server
+<= zssz left the server (timed out)
+\e(c@#339933)<kim280\ f@catlandia-relay> hmm\e(c@#ffffff)
+=> dodik has joined the server
+\e(c@#339933)<Unknown Bot\ f@catlandia-relay> Perhaps <_<\e(c@#ffffff)
+<Lavender_Lover> 1029 lets be friends plz :(
+<1029> me?
+<nickio> my crystal farm
+<= bill left the server
+<gacha_lover> and area_pos2?
+<amelka> mam godzine
+<zyrel> yes for u home
+<XxEmilyxX> and do /area_pos2
+<XxEmilyxX> yes :D
+=> bill has joined the server
+<1029> i dont have zyrel
+<Snakebob> can i have  i will give money?
+<amelka> ej
+<goldenkiller> back
+<kim280> ja musze zjesc sniedanie i shool
+<zyrel> bc we put flowers here
+<nickio> thanks to everyone who went to my shop!
+<XxEmilyxX> now do /protect areaname areaname conserning the name of the area
+<kim280> amelka typ do mnie
+<goldenkiller> :)
+<nickio> i know mi sheep is dumb...
+<Snakebob> nickio
+Exchange can not be done, contact the shop owner.
+Exchange can not be done, contact the shop owner.
+Exchange can not be done, contact the shop owner.
+<amelka> mam godzine
+<gacha_lover> the coordinates?
+Exchange can not be done, contact the shop owner.
+Exchange can not be done, contact the shop owner.
+Exchange can not be done, contact the shop owner.
+Exchanged!
+Exchanged!
+Exchanged!
+Exchanged!
+Exchanged!
+<1029> zyrel 
+<Daniel207> ?
+Exchange can not be done, contact the shop owner.
+Exchange can not be done, contact the shop owner.
+Exchange can not be done, contact the shop owner.
+<XxEmilyxX> no the name of the area
+<gacha_lover> tell me again
+Exchange can not be done, contact the shop owner.
+Exchange can not be done, contact the shop owner.
+Please insert a coin in the machine.
+<zyrel> ?
+Please insert a coin in the machine.
+Please insert a coin in the machine.
+Please insert a coin in the machine.
+Please insert a coin in the machine.
+Please insert a coin in the machine.
+Please insert a coin in the machine.
+=> xXMikolaJXx has joined the server
+<amelka> gdzie jesteś
+<kim280> goldenkiller
+<XxEmilyxX> do /protect areaname
+<Snakebob> bye
+<Jerry1908> Stupidest owner..
+<gacha_lover> oh  im gonna name this area?
+This area is owned by Sokorai333!
+<1029> i already have two houses
+<nickio> in 5 minutes i sell crystal
+<amelka> co
+<kim280> to dla ciebie
+<Maya> emily i send you a mail
+<= zyrel left the server (timed out)
+<XxEmilyxX> i know
+<GalwayGirl> <7home
+\e(T@sethome)Teleported to home!\eE
+<= Snakebob left the server (timed out)
+<amelka> nie mam co dać
+<gacha_lover> omg
+<= xXMikolaJXx left the server
+<XxEmilyxX> dont tap the 1 or the 2
+Teleported to spawn!
+<1029> who said they want me to be their freind
+<gacha_lover> i did that by accident
+<kim280> nic mi nie trzeba
+<XxEmilyxX> it will deleteit
+<goldenkiller> Daniel207: i go to spawn ok
+<XxEmilyxX> its ok mistakes happen
+<amelka> dzienki
+<kim280> a oni gdzie som
+=> linochka has joined the server
+<goldenkiller> czesc 
+<kim280> a daniel
+<amelka> elo
+=> leejianhao has joined the server
+<goldenkiller> jest
+<XxEmilyxX> so say this: /protect areaname
+<amelka> tu
+<linochka> всем привет
+<Jerry1908> Sorry Emily, but how can I set an area name?
+<John_Wick> this is a protected area
+<John_Wick> I said it
+<= Lavender_Lover left the server (timed out)
+<goldenkiller> co robimy
+=> zssz has joined the server
+<kim280> daniel \
+<amelka> nie wiem
+<nickio> i sell crystal now
+<kim280> goldenkiller
+<Daniel207> oh
+<goldenkiller> tak
+<XxEmilyxX> :D
+<gacha_lover> ??
+<gacha_lover> lol
+<kim280> zatobom
+<XxEmilyxX> you did it!
+(293,57,825) is protected by Kadin123.
+<Jerry1908> nikio can I come to your shop
+(269,57,835) is protected by Kadin123.
+(269,57,835) is protected by Kadin123.
+<gacha_lover> but
+<goldenkiller> ok
+<= vampire1 left the server (timed out)
+<XxEmilyxX> ?
+<nickio> yes tp to me jerry
+<kim280> kto to wziol ?
+<gacha_lover> how can i protect a big area
+<XxEmilyxX> Maya I'll be right with you!
+<XxEmilyxX> you do the same thing but larger
+<goldenkiller> :)
+<amelka> ja nie
+<XxEmilyxX> like this
+<nickio>  i sell mese block to
+<kim280> ok
+<amelka> mam 1
+<Jerry1908> Hi!
+<kim280> to co robi ta
+<zssz> hi
+=> vampire1 has joined the server
+<kim280> come
+<goldenkiller> ja tez mam 1
+<bill> sx
+=> quan_2k9 has joined the server
+<nickio> pls close door when u go
+<Daniel207> ???
+<Jerry1908> kay
+<nickio> cuz of my sheep runs away then
+<kim280> come
+<= vampire1 left the server
+<gacha_lover> Emily how can i add someone in my area?
+\e(T@unified_inventory)Home position set to: \eF(347,189,774)\eE\eE
+\e(T@sethome)Teleported to home!\eE
+<amelka> może iny gracz
+<1029> hello quan tp em
+<bill> lvoebill
+<quan_2k9> uk
+<Pemodragon> add with /add_owner
+<goldenkiller> n o
+<kim280> come goldenkiller
+<XxEmilyxX> you know at the bottom
+<goldenkiller> :)
+<= leejianhao left the server (timed out)
+<XxEmilyxX> there's a number
+<gacha_lover> yea
+<goldenkiller> Daniel207: come
+<amelka> hoćcie
+=> leejianhao has joined the server
+<zssz> )
+<XxEmilyxX> Maya im coming!
+<kim280> no to no
+<Maya> ok
+<1029> em dang o cho zyrel
+<amelka> ja ide
+=> nga has joined the server
+<kim280> to co robimy?
+<XxEmilyxX> you do /add_owner number at the bottom playername wha your gonna call it
+<nga> hi
+<quan_2k9> cho nay cua anh long ma
+<1029> zyrel dang xay nha moi cho em
+<Jerry1908> hi nga
+<XxEmilyxX> so i would do...
+<goldenkiller> nie wiem
+<Daniel207> goldenkiller?
+<lera1111> у кого есть еда дайте пж а я вам 10 штук железа
+<nga> hi
+<amelka> niewiem ale ide
+<nga> xin loi m.n nha
+<goldenkiller> yes Daniel207
+This area is owned by Aoi-Rose!
+This area is owned by Aoi-Rose!
+This area is owned by Aoi-Rose!
+\e(c@#339933)<kim280\ f@catlandia-relay> A login do Discordapp\e(c@#ffffff)
+This area is owned by Aoi-Rose!
+This area is owned by Aoi-Rose!
+This area is owned by Aoi-Rose!
+<nga> em muon 5 phut
+This area is owned by Aoi-Rose!
+This area is owned by Aoi-Rose!
+This area is owned by Aoi-Rose!
+This area is owned by Aoi-Rose!
+This area is owned by Aoi-Rose!
+This area is owned by Aoi-Rose!
+<quan_2k9> ?
+<XxEmilyxX>  /add_owner 4472 gacha_lover snow thingy.."
+This area is owned by Aoi-Rose!
+This area is owned by Aoi-Rose!
+This area is owned by Aoi-Rose!
+This area is owned by Aoi-Rose!
+This area is owned by Aoi-Rose!
+This area is owned by Aoi-Rose!
+This area is owned by Aoi-Rose!
+This area is owned by Aoi-Rose!
+This area is owned by Aoi-Rose!
+This area is owned by Aoi-Rose!
+This area is owned by Aoi-Rose!
+This area is owned by Aoi-Rose!
+This area is owned by Aoi-Rose!
+This area is owned by Aoi-Rose!
+<leejianhao> fuck enderman
+<XxEmilyxX> come here
+<Jerry1908> :D
+<Daniel207> do u have ten diomo
+<Maya> ok
+<XxEmilyxX> see tye number
+<goldenkiller> shut the fuck up
+<nga> tui onile muon 5 phut
+<gacha_lover> uhh
+<XxEmilyxX> its called the parent id
+<quan_2k9> ttui cungg bi muon 5 phut ma
+<nickio> who wants a flat at my fallout shelter??? contact me with /mail please
+<nga> oh
+<gacha_lover> ohhh
+<John_Wick> youre such a rude mofo
+<XxEmilyxX> 4472 is the pearnent id
+<amelka> jae wagonem
+<= Anhjlic left the server
+<nickio> who wants a flat at my fallout shelter??? contact me with /mail please
+<leejianhao> you can't catch me enderman
+<nga> biet xay nha o dau day
+<kim280> https://discord.gg/Crwk8q
+<XxEmilyxX> you can do /help add_owner
+<nga> quan
+<amelka> co
+<quan_2k9> j
+<goldenkiller> ja mam discord
+<kim280> to https://discord.gg/Crwk8q
+<nga> ong tim dat trong giup tui
+<kim280> to logi
+<amelka> a
+<= leejianhao left the server (timed out)
+<gacha_lover> idk anything about this
+<goldenkiller> ja jestem login
+<amelka> ide
+<kim280> ja nanim jestem
+<XxEmilyxX> um ok
+<XxEmilyxX> i can add you 
+<gacha_lover> i dont really understand
+<nickio> where is my poor sheep gone???
+<nga> ,players
+\e(c@#339933)<trackr@IRC> Players on cat: -lipop-, 1029, Daniel207, GalwayGirl, Jerry1908, John_Wick, Laevolac, Liamy, Lizzie_506, Maya, Pemodragon, XxEmilyxX, amelka, bill, dodik, gacha_lover, goldenkiller, kim280, lera1111, linochka, nga, nickio, quan_2k9, rvz2, zssz\e(c@#ffffff)
+<XxEmilyxX> also
+\e(c@#339933)<trackr@IRC> Total: 25 players across 1 active server (and 0 inactive servers).\e(c@#ffffff)
+<= Pemodragon left the server (timed out)
+<amelka> o
+<gacha_lover> ill just use protection blocks
+<Lizzie_506> idk
+\e(c@#339933)<kim280\ f@catlandia-relay> o amelka\e(c@#ffffff)
+=> reachel2020 has joined the server
+<GalwayGirl> protect your sheep using mod protection rune
+<GalwayGirl> **mob
+<Jerry1908> The sheep called you are a sheep?
+<Lizzie_506> found it!
+<XxEmilyxX> (just saying) Area protection is stronger than protecter blocks :/
+<Jerry1908> It's swimming
+<nickio> yes it is
+<gacha_lover> but idk how
+<kim280> https://discord.gg/Crwk8q
+<GalwayGirl> it doesn't like us :/
+<XxEmilyxX> ok!
+<nga> T^T
+<goldenkiller> sorry i have to go
+<amelka> goldenkiller jak naprawde masz na imie
+<gacha_lover> its difficult to understand
+<XxEmilyxX> i can protect stuff for you if you want
+<XxEmilyxX> Also
+<Jerry1908> tpn Huy ak
+<kim280> a mnie sie nie spytaz
+<nga> huy la ai
+<nga> a
+<1029> tpy di chi jerry
+<XxEmilyxX> is it ok if i borrow your crystal shovel for a sec (I'll give it back)
+<Jerry1908> 1029
+<nga> uk
+=> murii has joined the server
+<Jerry1908> no :))
+<goldenkiller> pa
+<nickio> i 
+<amelka> po nim każego
+<nga> !
+<kim280> ja szymon
+<1029> fine
+<goldenkiller> bye Daniel207
+<Jerry1908> :)
+\e(T@unified_inventory)Home position set to: \eF(350,189,771)\eE\eE
+<reachel2020> jamel esta conectado???
+<amelka> a pa
+<goldenkiller> i go ti another server
+=> Pemodragon has joined the server
+Teleported to spawn!
+<1029> :V
+<Daniel207> waht ten dimonds
+<goldenkiller> to*
+<nga> 1029 ong hoc lop 4 that h
+* Jerry1908 is requesting to teleport to you. /tpy to accept.
+<XxEmilyxX> thanks!,
+<nga> chi lua em ha
+<reachel2020> no jewrry why?
+<kim280> jodno pytanie
+<1029> lop 5
+<Jerry1908> Hoc tu Thien do ;)
+<kim280> czy wy macie passoword
+<goldenkiller> vineland is the name
+<XxEmilyxX> Maya
+<Jerry1908> XD
+<nickio> lol i sell crystal ignot cheaper than the half of aguras prices
+<= goldenkiller left the server
+<quan_2k9> ???
+<Maya> what emily
+=> hgvcff has joined the server
+<Daniel207> tpr
+<XxEmilyxX> dont delete this bc it will turn into normal dirt
+<amelka> serio
+<kim280> serio
+<Jerry1908> Quan_2k9 la tpr dung ko
+<Maya> ok
+<Daniel207> i cant teloport jerry
+(291,2,275) is protected by eduxis, Seven.
+\e(c@#339933)<kim280\ f@catlandia-relay> a co\e(c@#ffffff)
+=> Kocopemon has joined the server
+=> Bensin has joined the server
+\e(c@#339933)<kim280\ f@catlandia-relay> https://discord.gg/Crwk8q\e(c@#ffffff)
+<Kocopemon> Bonjour
+<nga> uk
+<XxEmilyxX> maya
+<= hgvcff left the server
+<Bensin> Bonjour
+<Kocopemon> il y a des francais ?
+<Jerry1908> I'm just trolling you XD
+<Maya> why emily
+<= -lipop- left the server
+<zssz> o привет Bensin
+<XxEmilyxX> i git ur crystal dirt
+<Maya> ok
+<reachel2020> JERRY WHY DO YOU WANT TO TELEPORT TO ME?
+<nga> T^T
+<= Bensin left the server
+<amelka> a mam na ciebie muwić kim2020 czy szymon
+<Jerry1908> Nope, I just troll :vv
+<XxEmilyxX> dont delete it
+<= bill left the server (timed out)
+<Pemodragon> ,players
+\e(c@#339933)<trackr@IRC> Players on cat: 1029, Daniel207, GalwayGirl, Jerry1908, John_Wick, Kocopemon, Laevolac, Liamy, Lizzie_506, Maya, Pemodragon, XxEmilyxX, amelka, dodik, gacha_lover, kim280, lera1111, linochka, murii, nga, nickio, quan_2k9, reachel2020, rvz2, zssz\e(c@#ffffff)
+\e(c@#339933)<trackr@IRC> Total: 25 players across 1 active server (and 0 inactive servers).\e(c@#ffffff)
+<kim280> jak chcez
+<1029> troll me too
+<Maya> thanks were did you bought this
+<amelka> ok
+-!- Invalid command: tpx
+<Jerry1908> XD
+Usage: /tpy allows you to accept teleport requests sent to you by other players.
+<nga> XD
+<= XxEmilyxX left the server (timed out)
+<nickio> soon i sell more crystal !!!
+<amelka> kolo mnie atakuje
+<= murii left the server (timed out)
+<Jerry1908> Tro nay vui ma!
+=> NachoTaco has joined the server
+=> bill has joined the server
+<1029> day la xe em
+<= Pemodragon left the server (timed out)
+=> _Circus_Baby_ has joined the server
+<Kocopemon> stff please
+<Jerry1908> XD
+\e(c@#339933)<kim280\ f@catlandia-relay> Players on cat: 1029, Daniel207, GalwayGirl, Jerry1908, John_Wick, Kocopemon, Laevolac, Liamy, Lizzie_506, Maya, Pemodragon, XxEmilyxX, amelka, dodik, gacha_lover, kim280, lera1111, linochka, murii, nga, nickio, quan_2k9, reachel2020, rvz2, zssz                        Total: 25 players across 1 active server (and 0 inactive servers).\e(c@#ffffff)
+\e(c@#339933)<dinosaur mitochondria\ f@catlandia-relay> @kim280 No spamming.\e(c@#ffffff)
+<nga> huhuhuhuhuhuhuhuhuhuhuhuhuhuhuhuhuhu
+<nga> uk
+<nga> chi biet
+\e(c@#339933)-!- incitatus has quit [Ping timeout: 121 seconds]\e(c@#ffffff)
+<amelka> jakiś
+<Jerry1908> ???
+<= NachoTaco left the server
+<nga> ma 1029 hoc lop 4 ha'
+<amelka> o ten
+This area is owned by tina10!
+<1029> 5
+This area is owned by tina10!
+This area is owned by tina10!
+<kim280> tak o ten\
+<nga> oh
+<nga> may ghe
+This area is owned by tina10!
+<nga> tui cung lop 5
+=> fers has joined the server
+<Daniel207> naoaco taco!"
+<= fers left the server
+=> Pemodragon has joined the server
+<amelka> no bił mnie
+<nickio> I SELL CRYSTAL DIRT,GRASS AND IGNOTS TP TO  ME OR GO TO MY SHOP WITH T NET
+<zssz> привет
+<quan_2k9> tui tim dc cho rui
+=> gfttrr has joined the server
+Teleported to spawn!
+<nga> :))))
+<kim280> kopokemon lol
+<nga> quan ong la tuyet nhat :))
+<quan_2k9> hoi xa thui
+<nickio> I SELL CRYSTAL DIRT,GRASS AND IGNOTS TP TO  ME OR GO TO MY SHOP WITH T NET
+<nga> uk
+<1029> em dang lai xe duoi nuoc
+<linochka> привет Кристи
+<nga> oh
+<nga> lat ko len duoc dau
+<zssz> пивеееет
+<_Circus_Baby_> weow
+<1029> oh no
+<Jerry1908> Sorry, bye mn
+<= gacha_lover left the server
+<kim280> o jest
+=> LENNAAA has joined the server
+<nga> bye
+<Kocopemon> take kim280
+<nga> quan doi tui lat 
+=> omega has joined the server
+<= Jerry1908 left the server
+<zssz> к т о р у с с к и й
+<= Lizzie_506 left the server
+<quan_2k9> uk
+<linochka> мы тут старрым городом занялись..)
+<nga> de tui lam trhang may
+<zssz> м ясно
+<= dodik left the server (timed out)
+\e(c@#339933)<kim280\ f@catlandia-relay> amelka\e(c@#ffffff)
+<amelka> jak nie wieżysz to sie zaptaj  daniela
+<linochka> видела?
+<Maya> hi amelka
+<zssz> да
+<Kocopemon> take kim280
+<amelka> hi
+<kim280> ale niby czego
+<zssz> красиво очень
+This area is owned by Loindi!
+<nickio> I SELL CRYSTAL DIRT,GRASS AND IGNOTS TP TO  ME OR GO TO MY SHOP WITH T NET
+<zssz> лин
+<Kocopemon> for you
+<linochka> ну еще многоделать надо
+<kim280> no kocopemon 
+<GalwayGirl> STOP THE CAPS
+<linochka> даа
+<Kocopemon> okay
+<zssz> а можно пожалуйста семена 
+<amelka> że mnie bił
+<Kocopemon> you speak french kim280 ?
+<linochka> ооо дееень
+<zssz> хлопка
+<1029> ai cuu em voi
+<linochka> эммммм
+<amelka> dobra pa
+<linochka> не зн ск у меня но мало
+<kim280> pa
+<nga> oh
+<amelka> mam leksje
+<zssz> хоть 1
+<amelka> pa
+<= bill left the server (timed out)
+<amelka> pa
+<kim280> bye
+<nga> tpy tui
+<linochka> куда нести?
+<amelka> buy
+<= amelka left the server
+<= LENNAAA left the server
+<zssz> к тебе домой
+<= Kocopemon left the server
+<kim280> do popoludnia
+<nga> cho nay ha
+<nga> dep wa
+<quan_2k9> uk
+=> ptopto has joined the server
+<nga> vua y' tui luon
+<1029> aaaaaaaaaaaaaaa cuuu voi
+<nickio> who wants to see my richness?
+<nga> oh
+<nga> tp
+<linochka> прив щас
+<nga> tp di
+<zssz> пивет
+=> uh has joined the server
+=> clarie has joined the server
+<quan_2k9> con ga
+<nga> oh
+<linochka> вот 4 тока
+<= uh left the server (timed out)
+<zssz> СЕМЕНА
+<zssz> если можно)
+=> nu has joined the server
+<nga> vui wa
+This area is owned by WalzRvg!
+This area is owned by WalzRvg!
+<zssz> Спасиб
+<= nu left the server (timed out)
+<linochka> этого  г полноооо
+<clarie> hel"o
+<zssz> большое спксиб
+<zssz> спасиб точнее
+<linochka> да не за чё
+<linochka> а чё делаешь?
+<zssz> придёшь в гости
+=> nu has joined the server
+<= omega left the server (timed out)
+=> omeg has joined the server
+<linochka> даааа
+<nga> nu la ai
+<zssz> пошли
+<= nu left the server (timed out)
+<nickio> who wants to see my richness?
+<clarie> me
+<Maya> me
+Teleport request sent! It will time out in 60 seconds.
+\e(c@#339933)<kim280\ f@catlandia-relay> me\e(c@#ffffff)
+<Daniel207> q
+<= zssz left the server (timed out)
+<clarie> who wants to come to my home
+<Maya> oww you have many minegold
+=> zssz has joined the server
+=> lord has joined the server
+<Maya> i have 45 mingolds but i lost it
+=> ciao has joined the server
+<nga> ok
+=> goldenkiller has joined the server
+=> brady has joined the server
+<= lord left the server
+<zssz> гу
+<John_Wick> hi Maya
+<John_Wick> did Grey_Wolf give you his crystal farm?
+<zssz> скай
+<= clarie left the server
+<zssz> сюда
+<= brady left the server
+<nga> quan oi
+<quan_2k9> j
+=> clarie has joined the server
+=> nu has joined the server
+=> scooby has joined the server
+<nga> giup tui lam 10 cai hop bao ve nha
+<goldenkiller> czesc 
+=> rdococ has joined the server
+<quan_2k9> uk
+<zssz> уть
+<nga> nhanh len nha tai tui can gap
+=> semm has joined the server
+<= nu left the server (timed out)
+<linochka> аааооооо
+=> yyw has joined the server
+<= _Circus_Baby_ left the server (timed out)
+=> Bensin has joined the server
+<zssz> м чот не растёт
+<goldenkiller> i have a chiwawa puppy dog:)
+=> _Circus_Baby_ has joined the server
+<kim280> afk
+<= Daniel207 left the server (timed out)
+<kim280> czesc
+<zssz> ты б осмелелась туда
+<nickio> cool i have 2335 blue mg now!!!
+=> nu has joined the server
+<clarie> who wants to come to me home
+=> mahuru has joined the server
+<1029> nga tpy
+<scooby> me clarie
+Please click on the target you want to travel to.
+Station 'crystals store' does not exist (anymore?) on this network.
+Station 'crystals store' does not exist (anymore?) on this network.
+Station 'crystals store' does not exist (anymore?) on this network.
+Station 'crystals store' does not exist (anymore?) on this network.
+Station 'crystals store' does not exist (anymore?) on this network.
+<goldenkiller> i have a chiwawa puppy dog:)
+Initiating transfer to station 'crystals'.
+<nga> ong co tp dau
+<= nu left the server (timed out)
+<clarie> okay find my name
+<Maya> hi galway girl
+=> lord has joined the server
+<1029> co
+This area is owned by jameconnor99!
+This area is owned by jameconnor99!
+=> XxEmilyxX has joined the server
+<= nickio left the server
+<scooby> or i tp
+This area is owned by jameconnor99!
+This area is owned by jameconnor99!
+<zssz> м медленно
+This area is owned by jameconnor99!
+=> nu has joined the server
+=> rogamer has joined the server
+<1029> tpy di
+<nga> ko duoc
+This area is owned by --DAVIDCRAC--!
+This area is owned by --DAVIDCRAC--!
+This area is owned by --DAVIDCRAC--!
+This area is owned by --DAVIDCRAC--!
+This area is owned by --DAVIDCRAC--!
+This area is owned by --DAVIDCRAC--!
+This area is owned by --DAVIDCRAC--!
+This area is owned by --DAVIDCRAC--!
+<Maya> hi emily
+This area is owned by --DAVIDCRAC--!
+This area is owned by --DAVIDCRAC--!
+This area is owned by --DAVIDCRAC--!
+This area is owned by --DAVIDCRAC--!
+This area is owned by --DAVIDCRAC--!
+<clarie> tp
+This area is owned by --DAVIDCRAC--!
+This area is owned by --DAVIDCRAC--!
+=> boka has joined the server
+This area is owned by --DAVIDCRAC--!
+This area is owned by --DAVIDCRAC--!
+This area is owned by --DAVIDCRAC--!
+This area is owned by --DAVIDCRAC--!
+This area is owned by --DAVIDCRAC--!
+This area is owned by --DAVIDCRAC--!
+<linochka> ляяяяя страшноооо
+This area is owned by --DAVIDCRAC--!
+<= _Circus_Baby_ left the server (timed out)
+<goldenkiller> :)
+<1029> tpy di 
+<nga> ok
+<zssz> не
+<= nu left the server (timed out)
+<zssz> не оч главное прицелится
+<= semm left the server (timed out)
+This area is owned by Miss-Nanamii!
+This area is owned by Miss-Nanamii!
+<1029> xin loi
+(400,35,751) is protected by Gordini.
+<clarie> and press the door bell
+<XxEmilyxX> hi!
+<nga> ko sao
+<Maya> wait emily cn i build my crysttal room
+<zssz> ладуль
+<nga> ok
+<XxEmilyxX> ok
+<linochka> ооох точняк)
+<Maya> but i need more crystal dirt
+<XxEmilyxX> oh
+<XxEmilyxX> that was the last one i had :/
+<clarie> yep
+<kim280> co robi ta ?                   ...  ja muwie hmm...
+=> nu has joined the server
+<scooby> clarie accept say /tpy
+<goldenkiller> co jest ta?
+<GalwayGirl> how to get crystal grass
+<= 1029 left the server (timed out)
+<Maya> oh its ok
+=> Daniel207 has joined the server
+<= yyw left the server
+<kim280> co robimy
+<= nu left the server (timed out)
+<linochka> вау...
+<kim280> ?
+<nga> oh
+=> baby_pasha has joined the server
+<= zssz left the server (timed out)
+=> tqjtjf has joined the server
+<linochka> Пашка прив
+<clarie> tpy
+=> 1029 has joined the server
+=> Lavender_Lover has joined the server
+<scooby> clarie
+This area is owned by PAPASADA!
+<= Bensin left the server
+<scooby> accept
+<Lavender_Lover> hi
+<nga> quan
+<XxEmilyxX> hi
+<clarie> yes
+<kim280> pa do 16:00
+<quan_2k9> j
+<John_Wick> hi Emily
+<kim280> ja tu bende stal
+<= reachel2020 left the server (timed out)
+<nga> ong lam hop bao ve cho tui chua
+<clarie> just walk
+=> AERDTY has joined the server
+<1029> lavander lover did you said something abuot me
+<Lavender_Lover> who want to be my friend
+<= scooby left the server
+<= John_Wick left the server
+<1029> oh
+<goldenkiller> i going play another game
+<Lavender_Lover> hi omeg
+<omeg> Oshua see you Friday my son called to say your father
+<= tqjtjf left the server (timed out)
+=> squaishey has joined the server
+<clarie> who want to come for dinner
+<goldenkiller> and the name is zombsroyale.io bye
+=> gacha_lover has joined the server
+<= lord left the server
+<squaishey> hi gacha
+<= Daniel207 left the server (timed out)
+<Lavender_Lover> me i want to come for dinner
+=> nu has joined the server
+=> lord has joined the server
+=> Danel207 has joined the server
+# Server: version=5.1.0-dev, uptime=328459, max_lag=1.11777, clients={likaroots, necrosmx, jegede, GalwayGirl, leigha}
+# Server: Welcome to the Skyblock Minetest server! Get a server of your own for just $14/month with first month free at https://MineCity.online...
+*** GalwayGirl joined the game.
+<jegede> this is my house
+*** likaroots left the game.
+Cleared GalwayGirl's inventory.
+<jegede> stop
+<jegede> this is my house
+<jegede> stop killing me
+*** Weechips joined the game.
+Home set!
+<jegede> why are you doing this
+<jegede> fuck off
+<jegede> I dried to be nice but you did it again
+<Weechips> hello
+<Weechips> is there monsters in this game?
+<jegede> why do you hate us playing you jerk
+<jegede> ya there is a monster in this game
+<Weechips> thank, i see no monster here
+<Weechips> no animals nether
+# Server: version=5.1.0-dev, uptime=19.44, max_lag=0.431662, clients={GalwayGirl}
+# Server: Welcome to the Skyblock Minetest server! Get a server of your own for just $14/month with first month free at https://MineCity.online...
+*** GalwayGirl joined the game.
+*** jegede joined the game.
+Cleared GalwayGirl's inventory.
+<jegede> why are you not leting me get my stuff
+<GalwayGirl> because i wanna get it
+<jegede> why
+<GalwayGirl> why  not
+<jegede> I worked hard trying to get it
+Cleared GalwayGirl's inventory.
+<jegede> I mostly have bad stuff any way
+<jegede> we will share
+<jegede> I will report you
+<jegede> its not yours
+# Server: version=5.1.0-dev, uptime=418.23, max_lag=0.177924, clients={GalwayGirl, jegede}
+# Server: Welcome to the Skyblock Minetest server! Get a server of your own for just $14/month with first month free at https://MineCity.online...
+*** GalwayGirl joined the game.
+<jegede> peolpe always steel from me even if i did not steel any thing
+<jegede> fuck off you bitch
+<jegede> i will alway come back
+<jegede> why do you want it
+<jegede> I will give it to you only if you stop
+<jegede> please
+<jegede> just stop
+<jegede> are you the owner of this server
+<GalwayGirl> i'm a hacker
+<jegede> why
+*** jegede left the game. (timed out)
+# Server: version=5.1.0-dev, uptime=917.19, max_lag=0.09, clients={GalwayGirl}
+# Server: Welcome to the Skyblock Minetest server! Get a server of your own for just $14/month with first month free at https://MineCity.online...
+Cleared GalwayGirl's inventory.
+Cleared GalwayGirl's inventory.
+*** test joined the game.
+Privileges of GalwayGirl: interact home shout spawn
+# Server: version=5.1.0-dev, uptime=1126.62, max_lag=0.09, clients={GalwayGirl, test}
+# Server: Welcome to the Skyblock Minetest server! Get a server of your own for just $14/month with first month free at https://MineCity.online...
+*** GalwayGirl joined the game.
+*** _DarkRiseS_ joined the game.
+# Server: version=5.1.0-dev, uptime=1319.67, max_lag=0.788305, clients={GalwayGirl, _DarkRiseS_, test}
+# Server: Welcome to the Skyblock Minetest server! Get a server of your own for just $14/month with first month free at https://MineCity.online...
+*** GalwayGirl joined the game.
+*** test left the game.
+<_DarkRiseS_> hi
+*** test2 joined the game.
+<_DarkRiseS_> que te pasa
+*** _DarkRiseS_ left the game. (timed out)
+*** test2 left the game.
+*** test2 joined the game.
+Cleared GalwayGirl's inventory.
+*** Mixer joined the game.
+*** Mixer left the game.
+Home position set to: (-318,-22,321)
+Teleported to home!
+The administrator of this server is O__O.
+*** robaina joined the game.
+*** robaina left the game.
+*** test2 left the game.
+Cleared GalwayGirl's inventory.
+# Server: version=5.1.0-dev, uptime=3488.22, max_lag=0.09, clients={GalwayGirl}
+# Server: Welcome to the Skyblock Minetest server! Get a server of your own for just $14/month with first month free at https://MineCity.online...
+*** GalwayGirl joined the game.
+Teleported to home!
+Cleared GalwayGirl's inventory.
+Teleported to home!
+Teleported to home!
+Home set!
+Teleported to home!
+Teleported to home!
+Teleported to home!
+# Server: version=5.1.0-dev, uptime=3947.22, max_lag=0.394695, clients={GalwayGirl}
+# Server: Welcome to the Skyblock Minetest server! Get a server of your own for just $14/month with first month free at https://MineCity.online...
+*** GalwayGirl joined the game.
+Cleared GalwayGirl's inventory.
+*** Grafikbug joined the game.
+*** Grafikbug left the game.
+*** Raul joined the game.
+*** Raul left the game.
+*** test3 joined the game.
+*** test3 left the game.
+*** test3 joined the game.
+*** test3 left the game.
+Teleported to home!
+# Server: version=5.1.0-dev, uptime=5116.77, max_lag=0.255212, clients={GalwayGirl}
+# Server: Welcome to the Skyblock Minetest server! Get a server of your own for just $14/month with first month free at https://MineCity.online...
+*** GalwayGirl joined the game.
+*** Kamil joined the game.
+# Server: version=5.1.0-dev, uptime=5187.78, max_lag=0.217953, clients={GalwayGirl}
+# Server: Welcome to the Skyblock Minetest server! Get a server of your own for just $14/month with first month free at https://MineCity.online...
+*** GalwayGirl joined the game.
+*** test4 joined the game.
+*** test4 left the game.
+*** test5 joined the game.
+Teleported to home!
+Teleported to home!
+Teleported to home!
+Home position set to: (-322,13,320)
+*** test5 left the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.307, max_lag=0.242806, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+\e(c@#FFFFFF)\e(c@#ffffff)GalwayGirl has joined the Server.
+Invalid Rank.
+Invalid Rank.
+Invalid Rank.
+# Server: version=5.2.0-GalwayGirl, uptime=0.338, max_lag=0.263789, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+\e(c@#FF362D)[ADMIN]\e(c@#ffffff)GalwayGirl has joined the Server.
+\e(c@#FF362D)[ADMIN]\e(c@#ffffff)<GalwayGirl> ttest
+GalwayGirl ist jetzt ein \e(c@#FF2D81)owner\e(c@#ffffff)
+\e(c@#FF2D81)[OWNER]\e(c@#ffffff)<GalwayGirl> test
+GalwayGirl ist jetzt ein \e(c@#001FFF)moderator\e(c@#ffffff)
+\e(c@#001FFF)[MODERATOR]\e(c@#ffffff)<GalwayGirl> test
+GalwayGirl ist jetzt ein \e(c@#EE6E00)supporter\e(c@#ffffff)
+\e(c@#EE6E00)[SUPPORTER]\e(c@#ffffff)<GalwayGirl> test
+# Server: version=5.2.0-GalwayGirl, uptime=0.334, max_lag=0.269784, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+\e(c@#EE6E00)[SUPPORTER]\e(c@#ffffff)GalwayGirl has joined the Server.
+# Server: version=5.2.0-GalwayGirl, uptime=0.344, max_lag=0.278777, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+\e(c@#FF362D)[ADMIN]\e(c@#ffffff)GalwayGirl has joined the Server.
+# Server: version=5.2.0-GalwayGirl, uptime=0.297, max_lag=0.231814, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+\e(c@#FFFFFF)\e(c@#ffffff)GalwayGirl has joined the Server.
+GalwayGirl ist jetzt ein \e(c@#FF362D)admin\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=0.316, max_lag=0.251798, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+\e(c@#FFFFFF)\e(c@#ffffff)GalwayGirl has joined the Server.
+# Server: version=5.2.0-GalwayGirl, uptime=5.486, max_lag=1.10906, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+Privileges of GalwayGirl: privs basic_privs home fly protection_bypass server debug teleport shout settime bring interact password ban rollback fast creative noclip kick give
+# Server: version=5.1.0-dev, uptime=174442, max_lag=0.09, clients={GalwayGirl}
+# Server: Welcome to the Skyblock Minetest server! Get a server of your own for just $14/month with first month free at https://MineCity.online...
+*** GalwayGirl joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.814, max_lag=0.635982, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.394, max_lag=0.217651, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.397, max_lag=0.219648, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=2.064, max_lag=1.9984, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=2.112, max_lag=1.9984, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.194, max_lag=0.128897, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=1.825, max_lag=1.77593, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=1.816, max_lag=1.7506, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+WorldEdit -!- select positions by punching two nodes
+WorldEdit -!- position 1 set to (16001,5,16002)
+WorldEdit -!- position 2 set to (16000,5,16001)
+WorldEdit -!- select positions by punching two nodes
+WorldEdit -!- position 1 set to (16000,5,15999)
+WorldEdit -!- position 2 set to (16000,5,16001)
+WorldEdit -!- 3 nodes set
+# Server: version=5.2.0-GalwayGirl, uptime=1.806, max_lag=1.73961, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.213, max_lag=0.148881, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+WorldEdit -!- select positions by punching two nodes
+WorldEdit -!- position 1 set to (16000,5,16000)
+WorldEdit -!- position 1: (16000,5,16000)
+WorldEdit -!- position 2 not set
+WorldEdit -!- position 2 set to (16000,5,16001)
+WorldEdit -!- region reset
+# Server: version=5.2.0-GalwayGirl, uptime=1.841, max_lag=1.77458, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+You don't have permission to run this command (missing privileges: give)
+Privileges of Fleckenstein: interact fast home delprotect level worldedit server settime shout debug teleport kick protection_bypass bring privs password ban rollback fly creative noclip basic_privs give
+"default:sapling" added to inventory.
+Fleckenstein completed the quest "place_sapling" on level 1
+# Server: version=5.2.0-GalwayGirl, uptime=0.207, max_lag=0.142886, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+Teleporting to (16005,15,16005)
+WorldEdit -!- position 1 set to (16005,15,16005)
+Teleporting to (15997,0,15997)
+WorldEdit -!- position 1 set to (15997,0,15997)
+Teleporting to (16003,12,16003)
+WorldEdit -!- position 2 set to (16003,12,16003)
+WorldEdit -!- position 1 set to (15997,0,15997)
+WorldEdit -!- position 1 set to (15997,1,15997)
+WorldEdit -!- Warning: The schematic contains excessive free space and WILL be misaligned when allocated or loaded. To avoid this, shrink your area to cover exactly the nodes to be saved.
+WorldEdit -!- 157 nodes saved
+Teleporting to (15997,-6,16029)
+Teleporting to (15997,-7,16029)
+WorldEdit -!- position 1 set to (15997,-7,16029)
+Teleporting to (15997,-8,16029)
+WorldEdit -!- position 1 set to (15997,-8,16029)
+WorldEdit -!- position 2 set to (15997,-8,16029)
+WorldEdit -!- 157 nodes loaded
+WorldEdit -!- region reset
+# Server: version=5.2.0-GalwayGirl, uptime=2.192, max_lag=1.998, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=2.192, max_lag=1.998, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=2.21, max_lag=1.998, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=2.192, max_lag=1.998, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=2.193, max_lag=1.998, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=2.21, max_lag=1.998, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=2.194, max_lag=1.998, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=2.21, max_lag=1.998, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=2.194, max_lag=1.998, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=2.194, max_lag=1.998, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=2.208, max_lag=1.998, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=2.241, max_lag=2.01439, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=2.194, max_lag=1.998, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.227, max_lag=0.130895, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+Unknown privilege: allw
+
+Privileges of Fleckenstein: privs basic_privs home fly protection_bypass server debug teleport shout settime bring interact password ban rollback fast creative noclip kick give
+# Server: version=5.2.0-GalwayGirl, uptime=2.209, max_lag=1.998, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+Privileges of Fleckenstein: interact debug basic_privs password ban shout fast kick worldedit privs server
+# Server: version=5.2.0-GalwayGirl, uptime=2.192, max_lag=1.998, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=2.209, max_lag=1.998, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=2.064, max_lag=1.9984, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+Fleckenstein completed the quest "dig_dirt" on level 1
+Fleckenstein completed the quest "place_dirt" on level 1
+# Server: version=5.2.0-GalwayGirl, uptime=2.096, max_lag=1.9984, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=1.767, max_lag=1.70164, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=1.836, max_lag=1.77058, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=2.193, max_lag=1.998, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=2.193, max_lag=1.998, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=2.208, max_lag=1.998, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=2.226, max_lag=2.01498, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=2.177, max_lag=2.01358, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+Fleckenstein completed the quest "dig_dirt" on level 1
+Fleckenstein completed the quest "dig_dirt" on level 1
+Fleckenstein completed the quest "dig_dirt" on level 1
+Fleckenstein completed the quest "place_dirt" on level 1
+# Server: version=5.2.0-GalwayGirl, uptime=1.784, max_lag=1.71862, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+-!- Invalid command: killmw
+Privileges of Fleckenstein: interact debug basic_privs password ban shout fast kick worldedit privs server
+# Server: version=5.2.0-GalwayGirl, uptime=2.064, max_lag=1.9984, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=2.008, max_lag=1.84541, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+Privileges of Fleckenstein: interact debug privs basic_privs password ban shout fast delprotect worldedit kick server
+# Server: version=5.2.0-GalwayGirl, uptime=2.192, max_lag=2.01358, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=3.964, max_lag=1.84696, clients={Fleckenstein1}
+*** Fleckenstein1 joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=1.886, max_lag=1.82054, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=1.755, max_lag=1.70498, clients={Fleckenstein2}
+*** Fleckenstein2 joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=4.103, max_lag=1.97259, clients={Fleckenstein2}
+*** Fleckenstein2 joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=1.984, max_lag=1.81845, clients={Fleckenstein2}
+*** Fleckenstein2 joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=1.743, max_lag=1.661, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+Unknown privilege: fasr
+
+Privileges of Fleckenstein: interact debug basic_privs password ban shout fast kick worldedit privs server
+# Server: version=5.2.0-GalwayGirl, uptime=1.704, max_lag=1.65401, clients={Fleckenstein11}
+*** Fleckenstein11 joined the game.
+Privileges of Fleckenstein11: interact debug basic_privs password ban shout fast kick worldedit privs server
+# Server: version=5.2.0-GalwayGirl, uptime=2.064, max_lag=1.9984, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=1.775, max_lag=1.72496, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=1.791, max_lag=1.70997, clients={Foxy03}
+*** Foxy03 joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=1.814, max_lag=1.7486, clients={Foxy03}
+*** Foxy03 joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=1.761, max_lag=1.69464, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=1.741, max_lag=1.69198, clients={testpersonunoffical}
+*** testpersonunoffical joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=1.883, max_lag=1.81755, clients={testpersonunoffical}
+*** testpersonunoffical joined the game.
+Privileges of testpersonunoffical: interact debug basic_privs password ban shout fast kick worldedit privs server
+-!- Invalid command: givme
+You don't have permission to run this command (missing privileges: give)
+Privileges of testpersonunoffical: privs basic_privs home fly protection_bypass server worldedit debug teleport shout settime bring interact password ban rollback fast creative noclip kick give
+"default:lava_source 500" added to inventory.
+"default:water_source 500" added to inventory.
+# Server: version=5.2.0-GalwayGirl, uptime=1.767, max_lag=1.70164, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+Fleckenstein completed the quest "dig_dirt" on level 1
+Fleckenstein completed the quest "place_dirt" on level 1
+Fleckenstein completed the quest "place_sapling" on level 1
+Fleckenstein completed the quest "place_chest" on level 1
+Fleckenstein completed the quest "place_sign" on level 1
+Fleckenstein completed the quest "place_door" on level 1
+Fleckenstein completed the quest "dig_tree" on level 1
+Fleckenstein completed the quest "place_furnace" on level 1
+Fleckenstein completed the quest "place_glass" on level 1
+# Server: version=5.2.0-GalwayGirl, uptime=1.763, max_lag=1.69564, clients={testpersonunoffical}
+*** testpersonunoffical joined the game.
+# Server: version=5.1.0-dev, uptime=56982.2, max_lag=0.09, clients={GalwayGirl}
+# Server: Welcome to the Skyblock Minetest server! Get a server of your own for just $14/month with first month free at https://MineCity.online...
+*** GalwayGirl joined the game.
+Privileges of GalwayGirl: interact home shout spawn
+# Server: version=5.1.0-dev, uptime=57544.3, max_lag=1.17622, clients={GalwayGirl}
+# Server: Welcome to the Skyblock Minetest server! Get a server of your own for just $14/month with first month free at https://MineCity.online...
+-!- Invalid command: spawn
+Cleared GalwayGirl's inventory.
+Cleared GalwayGirl's inventory.
+*** insley joined the game.
+*** insley left the game.
+Teleported to home!
+# Server: version=5.1.0-dev, uptime=59760.2, max_lag=0.144722, clients={GalwayGirl}
+# Server: Welcome to the Skyblock Minetest server! Get a server of your own for just $14/month with first month free at https://MineCity.online...
+*** GalwayGirl joined the game.
+# Server: version=5.1.0-dev, uptime=60172.7, max_lag=0.101038, clients={GalwayGirl}
+# Server: Welcome to the Skyblock Minetest server! Get a server of your own for just $14/month with first month free at https://MineCity.online...
+*** GalwayGirl joined the game.
+*** necrosmx joined the game.
+<necrosmx> what a troll
+<GalwayGirl> where?
+<necrosmx> you
+<necrosmx> nice hacks
+<GalwayGirl> u build this castle?
+<GalwayGirl> because its the only thing did not grief yet becuas 
+<GalwayGirl> because i thiunk its beautiful
+<GalwayGirl> dont u want the dias?
+The administrator of this server is O__O.
+Privileges of necrosmx: interact home shout spawn
+Privileges of GalwayGirl: interact home shout spawn
+Home set!
+Teleported to home!
+Teleported to home!
+Teleported to home!
+<necrosmx> you are not smart
+<GalwayGirl> but i guess u are
+<necrosmx> I am
+<GalwayGirl> but i can code a hackclient...
+<GalwayGirl> here u are get out of the hole
+<necrosmx> that does not make you smart
+<GalwayGirl> why not
+<necrosmx> it just makes you a dumb ass
+<GalwayGirl> you did not take my dias
+<GalwayGirl> that made me angry
+<GalwayGirl> is the castle yours?
+<necrosmx> was
+<GalwayGirl> do you want dias?
+# Server: version=5.1.0-dev, uptime=62717.6, max_lag=0.171736, clients={GalwayGirl, necrosmx}
+# Server: Welcome to the Skyblock Minetest server! Get a server of your own for just $14/month with first month free at https://MineCity.online...
+*** GalwayGirl joined the game.
+Home set!
+<GalwayGirl> 99 Diamonds?
+<GalwayGirl> Are you admin or moderator on any server?
+<necrosmx> no
+<GalwayGirl> you can have the builder rank on my server in case you want (i dont think you do)
+<GalwayGirl> can i halep ypu with anything?
+Teleported to home!
+Teleported to home!
+Teleported to home!
+*** lunford joined the game.
+Teleported to home!
+*** lunford left the game.
+*** lunford joined the game.
+*** lunford left the game. (timed out)
+Teleported to home!
+*** necrosmx left the game.
+# Server: version=5.2.0-GalwayGirl, uptime=1.296, max_lag=0.649, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.207, max_lag=0.142886, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+Privileges of GalwayGirl: privs basic_privs home fly protection_bypass server weather debug teleport shout settime bring interact password ban rollback fast creative noclip kick give
+-!- Invalid command: weather
+Available commands: admin auth_reload ban clearinv clearobjects clearpassword days deleteblocks emergeblocks fixlight give giveme grant grantme haspriv help home kick kill killme last-login me mods msg privs pulverize remove_player revoke rollback rollback_check set sethome setpassword setweather setwind shutdown spawnentity status teleport time unban
+Use '/help <cmd>' to get more information, or '/help all' to list everything.
+avalible weather types: none, weather:snow, weather:rain
+please provide two comma seperated numbers
+# Server: version=5.2.0-GalwayGirl, uptime=0.407, max_lag=0.213701, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=4.123, max_lag=2.05677, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+\e(c@#FFFFFF)\e(c@#ffffff)GalwayGirl has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+\e(c@#00D600)GalwayGirl has joined the Server for the first Time! Welcome!\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=2.206, max_lag=1.81618, clients={GalwayGirl}
+*** GalwayGirl joined the game.
+\e(c@#FFFFFF)\e(c@#ffffff)GalwayGirl has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=2.224, max_lag=1.78921, clients={GalwayGirl2}
+*** GalwayGirl2 joined the game.
+\e(c@#FFFFFF)\e(c@#ffffff)GalwayGirl2 has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+\e(c@#00D600)GalwayGirl2 has joined the Server for the first Time! Welcome!\e(c@#ffffff)
+Privileges of GalwayGirl2: interact fast worldedit home ui_full fly protection_bypass areas_high_limit server tp shout debug teleport areas settime bring privs password ban rollback kick creative noclip basic_privs give
+WorldEdit -!- position 1 set to (15997,18,16006)
+WorldEdit -!- position 2 set to (16006,4,15990)
+WorldEdit -!- 2550 nodes set
+WorldEdit -!- region reset
+Cannot give an unknown item
+"elidragon:skyblock" added to inventory.
+Cannot give an unknown item
+# Server: version=5.2.0-GalwayGirl, uptime=2.203, max_lag=1.84915, clients={GalwayGirl2}
+*** GalwayGirl2 joined the game.
+\e(c@#FFFFFF)\e(c@#ffffff)GalwayGirl2 has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+GalwayGirl2 is now a \e(c@#EBEE00)helper\e(c@#ffffff)
+Privileges of GalwayGirl2: privs, fast, home, fly, worldedit, areas_high_limit, server, debug, teleport, areas, tp, interact, settime, password, ban, shout, kick, creative, noclip, basic_privs, give
+GalwayGirl2 is now a \e(c@#16AE00)vip\e(c@#ffffff)
+Privileges of GalwayGirl2: kick, interact, debug, tp, areas, shout, fast, basic_privs, password, ban, home, privs, fly, worldedit, areas_high_limit, server
+Privileges of GalwayGirl2: kick, interact, debug, tp, areas, shout, fast, basic_privs, password, ban, home, privs, fly, worldedit, areas_high_limit, server
+Privileges of GalwayGirl2: kick, interact, debug, tp, areas, shout, fast, basic_privs, password, ban, home, privs, fly, worldedit, areas_high_limit, server
+GalwayGirl2 is now a \e(c@#EBEE00)helper\e(c@#ffffff)
+Privileges of GalwayGirl2: privs, fast, home, fly, worldedit, areas_high_limit, server, debug, teleport, areas, tp, interact, settime, password, ban, shout, kick, creative, noclip, basic_privs, give
+GalwayGirl2 is now a \e(c@#FFFFFF)player\e(c@#ffffff)
+Privileges of GalwayGirl2: interact, debug, areas, privs, tp, basic_privs, password, ban, home, shout, kick, worldedit, areas_high_limit, server
+Privileges of GalwayGirl2: interact debug areas basic_privs password ban shout privs kick worldedit areas_high_limit server
+# Server: version=5.2.0-GalwayGirl, uptime=2.317, max_lag=1.88012, clients={GalwayGirl2}
+*** GalwayGirl2 joined the game.
+\e(c@#FFFFFF)\e(c@#ffffff)GalwayGirl2 has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+GalwayGirl2 is now a \e(c@#FFFFFF)player\e(c@#ffffff)
+GalwayGirl2 is now a \e(c@#16AE00)vip\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=2.418, max_lag=1.98202, clients={GalwayGirl2}
+*** GalwayGirl2 joined the game.
+\e(c@#FFFFFF)\e(c@#ffffff)GalwayGirl2 has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+\e(c@#FFFFFF)\e(c@#ffffff)<GalwayGirl2> test
+\e(c@#FFFFFF)\e(c@#ffffff)<GalwayGirl2> test
+\e(c@#FFFFFF)\e(c@#ffffff)<GalwayGirl2> test
+GalwayGirl2 is now a \e(c@#16AE00)vip\e(c@#ffffff)
+\e(c@#FFFFFF)\e(c@#ffffff)<GalwayGirl2> tets
+# Server: version=5.2.0-GalwayGirl, uptime=2.419, max_lag=1.998, clients={GalwayGirl2}
+*** GalwayGirl2 joined the game.
+\e(c@#FFFFFF)\e(c@#ffffff)GalwayGirl2 has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+GalwayGirl2 is now a \e(c@#16AE00)vip\e(c@#ffffff)
+\e(c@#16AE00)[VIP]\e(c@#ffffff)<GalwayGirl2> test
+GalwayGirl2 is now a \e(c@#FF2D8D)admin\e(c@#ffffff)
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<GalwayGirl2> test
+# Server: version=5.2.0-GalwayGirl, uptime=2.141, max_lag=1.9984, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FFFFFF)\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+\e(c@#00D600)Fleckenstein has joined the Server for the first Time! Welcome!\e(c@#ffffff)
+Fleckenstein is now a \e(c@#FF2D8D)admin\e(c@#ffffff)
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)<Fleckenstein> test
+# Server: version=5.2.0-GalwayGirl, uptime=1.935, max_lag=1.8685, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=2.029, max_lag=1.96343, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=1.873, max_lag=1.80755, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=2.051, max_lag=1.98541, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=1.929, max_lag=1.86251, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=2.051, max_lag=1.98541, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=2.023, max_lag=1.95743, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=2.065, max_lag=1.9984, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=2.037, max_lag=1.97042, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=2.08, max_lag=1.9984, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=2.065, max_lag=1.9984, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=1.996, max_lag=1.92946, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+Fleckenstein pressed the key sneak!
+Fleckenstein is holding the key sneak for 0.0085389999999279 seconds.
+Fleckenstein is holding the key sneak for 0.018460000000005 seconds.
+Fleckenstein is holding the key sneak for 0.029978999999912 seconds.
+Fleckenstein released the key sneak after 0.036798999999974 seconds!
+Fleckenstein pressed the key sneak!
+Fleckenstein is holding the key sneak for 0.013051000000019 seconds.
+Fleckenstein is holding the key sneak for 0.058801000000017 seconds.
+Fleckenstein is holding the key sneak for 0.05946199999994 seconds.
+Fleckenstein released the key sneak after 0.091137000000003 seconds!
+Fleckenstein pressed the key up!
+Fleckenstein is holding the key up for 0.035303999999996 seconds.
+Fleckenstein is holding the key up for 0.050199999999904 seconds.
+Fleckenstein is holding the key up for 0.074221999999963 seconds.
+Fleckenstein is holding the key up for 0.099616999999967 seconds.
+Fleckenstein is holding the key up for 0.16434699999991 seconds.
+Fleckenstein is holding the key up for 0.16858500000001 seconds.
+Fleckenstein is holding the key up for 0.17982999999992 seconds.
+Fleckenstein is holding the key up for 0.20287899999994 seconds.
+Fleckenstein is holding the key up for 0.22925099999998 seconds.
+Fleckenstein is holding the key up for 0.25152700000001 seconds.
+Fleckenstein is holding the key up for 0.27468399999998 seconds.
+Fleckenstein is holding the key up for 0.29119900000001 seconds.
+Fleckenstein is holding the key up for 0.3065949999999 seconds.
+Fleckenstein is holding the key up for 0.32107799999994 seconds.
+Fleckenstein released the key up after 0.32217700000001 seconds!
+Fleckenstein pressed the key left!
+Fleckenstein is holding the key left for 0.038090000000011 seconds.
+Fleckenstein is holding the key left for 0.052041000000031 seconds.
+Fleckenstein is holding the key left for 0.067202000000066 seconds.
+Fleckenstein is holding the key left for 0.079363000000058 seconds.
+Fleckenstein is holding the key left for 0.095845000000054 seconds.
+Fleckenstein is holding the key left for 0.10423800000001 seconds.
+Fleckenstein is holding the key left for 0.11977899999999 seconds.
+Fleckenstein is holding the key left for 0.13314200000002 seconds.
+Fleckenstein is holding the key left for 0.15004800000008 seconds.
+Fleckenstein released the key left after 0.15951800000005 seconds!
+Fleckenstein pressed the key up!
+Fleckenstein is holding the key up for 0.023007000000007 seconds.
+Fleckenstein is holding the key up for 0.027540000000045 seconds.
+Fleckenstein is holding the key up for 0.055292000000009 seconds.
+Fleckenstein is holding the key up for 0.07775700000002 seconds.
+Fleckenstein is holding the key up for 0.09083499999997 seconds.
+Fleckenstein released the key up after 0.099189000000024 seconds!
+Fleckenstein pressed the key up!
+Fleckenstein is holding the key up for 0.015678999999977 seconds.
+Fleckenstein released the key up after 0.029923999999937 seconds!
+Fleckenstein pressed the key up!
+Fleckenstein is holding the key up for 0.013418000000001 seconds.
+Fleckenstein is holding the key up for 0.02982099999997 seconds.
+Fleckenstein released the key up after 0.041087999999945 seconds!
+Fleckenstein pressed the key up!
+Fleckenstein is holding the key up for 0.01705800000002 seconds.
+Fleckenstein is holding the key up for 0.041579999999954 seconds.
+Fleckenstein is holding the key up for 0.056009000000017 seconds.
+Fleckenstein is holding the key up for 0.066986999999926 seconds.
+Fleckenstein is holding the key up for 0.101584 seconds.
+Fleckenstein is holding the key up for 0.11400700000002 seconds.
+Fleckenstein is holding the key up for 0.12840700000004 seconds.
+Fleckenstein is holding the key up for 0.15470600000003 seconds.
+Fleckenstein is holding the key up for 0.17574999999999 seconds.
+Fleckenstein released the key up after 0.20039799999995 seconds!
+Fleckenstein pressed the key down!
+Fleckenstein is holding the key down for 0.016227000000072 seconds.
+Fleckenstein is holding the key down for 0.035821000000055 seconds.
+Fleckenstein is holding the key down for 0.03679800000009 seconds.
+Fleckenstein is holding the key down for 0.062696000000074 seconds.
+Fleckenstein is holding the key down for 0.063657000000035 seconds.
+Fleckenstein is holding the key down for 0.074551000000042 seconds.
+Fleckenstein is holding the key down for 0.11638400000004 seconds.
+Fleckenstein is holding the key down for 0.24810100000002 seconds.
+Fleckenstein is holding the key down for 0.25158299999998 seconds.
+Fleckenstein is holding the key down for 0.27477500000009 seconds.
+Fleckenstein is holding the key down for 0.29058200000009 seconds.
+Fleckenstein released the key down after 0.31814300000008 seconds!
+Fleckenstein pressed the key up!
+Fleckenstein is holding the key up for 0.013979999999947 seconds.
+Fleckenstein is holding the key up for 0.027687000000014 seconds.
+Fleckenstein is holding the key up for 0.044091999999978 seconds.
+Fleckenstein is holding the key up for 0.051975999999968 seconds.
+Fleckenstein is holding the key up for 0.064102999999932 seconds.
+Fleckenstein is holding the key up for 0.077222000000006 seconds.
+Fleckenstein is holding the key up for 0.092040999999995 seconds.
+Fleckenstein released the key up after 0.099426999999991 seconds!
+Fleckenstein pressed the key sneak!
+Fleckenstein is holding the key sneak for 0.016587999999956 seconds.
+Fleckenstein is holding the key sneak for 0.032288999999992 seconds.
+Fleckenstein released the key sneak after 0.048300999999924 seconds!
+Fleckenstein pressed the key up!
+Fleckenstein is holding the key up for 0.061682999999903 seconds.
+Fleckenstein is holding the key up for 0.068330999999944 seconds.
+Fleckenstein is holding the key up for 0.088702999999896 seconds.
+Fleckenstein is holding the key up for 0.11535299999991 seconds.
+Fleckenstein is holding the key up for 0.13906699999995 seconds.
+Fleckenstein is holding the key up for 0.16193799999996 seconds.
+Fleckenstein is holding the key up for 0.18476399999997 seconds.
+Fleckenstein is holding the key up for 0.20741399999997 seconds.
+Fleckenstein is holding the key up for 0.2320269999999 seconds.
+Fleckenstein is holding the key up for 0.24242099999992 seconds.
+Fleckenstein released the key up after 0.2534619999999 seconds!
+Fleckenstein pressed the key LMB!
+Fleckenstein is holding the key LMB for 0.0083200000000261 seconds.
+Fleckenstein is holding the key LMB for 0.026926000000003 seconds.
+Fleckenstein is holding the key LMB for 0.041113999999993 seconds.
+Fleckenstein released the key LMB after 0.048524000000043 seconds!
+Fleckenstein pressed the key RMB!
+Fleckenstein is holding the key RMB for 0.023699000000079 seconds.
+Fleckenstein is holding the key RMB for 0.032658000000083 seconds.
+Fleckenstein is holding the key RMB for 0.051666000000068 seconds.
+Fleckenstein is holding the key RMB for 0.061483000000067 seconds.
+Fleckenstein is holding the key RMB for 0.074036999999976 seconds.
+Fleckenstein released the key RMB after 0.10405400000002 seconds!
+Fleckenstein pressed the key LMB!
+Fleckenstein is holding the key LMB for 0.034884000000034 seconds.
+Fleckenstein is holding the key LMB for 0.050070000000005 seconds.
+Fleckenstein is holding the key LMB for 0.092259000000013 seconds.
+Fleckenstein released the key LMB after 0.095125999999937 seconds!
+Fleckenstein pressed the key LMB!
+Fleckenstein is holding the key LMB for 0.0003470000000334 seconds.
+Fleckenstein is holding the key LMB for 0.013309999999933 seconds.
+Fleckenstein is holding the key LMB for 0.02541599999995 seconds.
+Fleckenstein is holding the key LMB for 0.03866800000003 seconds.
+Fleckenstein is holding the key LMB for 0.050117 seconds.
+Fleckenstein is holding the key LMB for 0.06463199999996 seconds.
+Fleckenstein is holding the key LMB for 0.076579000000038 seconds.
+Fleckenstein is holding the key LMB for 0.090568999999959 seconds.
+Fleckenstein is holding the key LMB for 0.099874 seconds.
+Fleckenstein is holding the key LMB for 0.11518599999999 seconds.
+Fleckenstein is holding the key LMB for 0.12642400000004 seconds.
+Fleckenstein is holding the key LMB for 0.14219700000001 seconds.
+Fleckenstein is holding the key LMB for 0.160031 seconds.
+Fleckenstein is holding the key LMB for 0.16733599999998 seconds.
+Fleckenstein is holding the key LMB for 0.17739199999994 seconds.
+Fleckenstein is holding the key LMB for 0.19260299999996 seconds.
+Fleckenstein is holding the key LMB for 0.21428400000002 seconds.
+Fleckenstein is holding the key LMB for 0.22888999999998 seconds.
+Fleckenstein is holding the key LMB for 0.24348399999997 seconds.
+Fleckenstein is holding the key LMB for 0.26347299999998 seconds.
+Fleckenstein is holding the key LMB for 0.28166299999998 seconds.
+Fleckenstein is holding the key LMB for 0.29352700000004 seconds.
+Fleckenstein is holding the key LMB for 0.31506899999999 seconds.
+Fleckenstein is holding the key LMB for 0.33250499999997 seconds.
+Fleckenstein is holding the key LMB for 0.35056699999996 seconds.
+Fleckenstein is holding the key LMB for 0.36651199999994 seconds.
+Fleckenstein is holding the key LMB for 0.38222499999995 seconds.
+Fleckenstein is holding the key LMB for 0.38280199999997 seconds.
+Fleckenstein is holding the key LMB for 0.39666699999998 seconds.
+Fleckenstein is holding the key LMB for 0.411429 seconds.
+Fleckenstein is holding the key LMB for 0.42561000000001 seconds.
+Fleckenstein is holding the key LMB for 0.42667299999994 seconds.
+Fleckenstein is holding the key LMB for 0.43847199999993 seconds.
+Fleckenstein is holding the key LMB for 0.45173499999999 seconds.
+Fleckenstein is holding the key LMB for 0.46536400000002 seconds.
+Fleckenstein is holding the key LMB for 0.49640399999998 seconds.
+Fleckenstein is holding the key LMB for 0.510447 seconds.
+Fleckenstein is holding the key LMB for 0.52033299999994 seconds.
+Fleckenstein is holding the key LMB for 0.53824199999997 seconds.
+Fleckenstein is holding the key LMB for 0.55155100000002 seconds.
+Fleckenstein is holding the key LMB for 0.559121 seconds.
+Fleckenstein is holding the key LMB for 0.57214799999997 seconds.
+Fleckenstein is holding the key LMB for 0.58550600000001 seconds.
+Fleckenstein is holding the key LMB for 0.59724700000004 seconds.
+Fleckenstein is holding the key LMB for 0.60319300000003 seconds.
+Fleckenstein is holding the key LMB for 0.61430499999994 seconds.
+Fleckenstein is holding the key LMB for 0.62845000000004 seconds.
+Fleckenstein is holding the key LMB for 0.64396099999999 seconds.
+Fleckenstein is holding the key LMB for 0.67002300000001 seconds.
+Fleckenstein is holding the key LMB for 0.682501 seconds.
+Fleckenstein is holding the key LMB for 0.69737299999997 seconds.
+Fleckenstein is holding the key LMB for 0.71174299999996 seconds.
+Fleckenstein is holding the key LMB for 0.81866200000002 seconds.
+Fleckenstein is holding the key LMB for 0.82038699999998 seconds.
+Fleckenstein is holding the key LMB for 0.83636100000001 seconds.
+Fleckenstein is holding the key LMB for 0.85393699999997 seconds.
+Fleckenstein is holding the key LMB for 0.86840099999995 seconds.
+Fleckenstein is holding the key LMB for 0.88316999999995 seconds.
+Fleckenstein is holding the key LMB for 0.89896899999997 seconds.
+Fleckenstein is holding the key LMB for 0.91776400000003 seconds.
+Fleckenstein is holding the key LMB for 0.93794600000001 seconds.
+Fleckenstein is holding the key LMB for 0.95197699999994 seconds.
+Fleckenstein is holding the key LMB for 0.96983499999999 seconds.
+Fleckenstein is holding the key LMB for 1.014697 seconds.
+Fleckenstein is holding the key LMB for 1.034633 seconds.
+Fleckenstein is holding the key LMB for 1.046745 seconds.
+Fleckenstein is holding the key LMB for 1.066539 seconds.
+Fleckenstein is holding the key LMB for 1.0802629999999 seconds.
+Fleckenstein is holding the key LMB for 1.0958909999999 seconds.
+Fleckenstein is holding the key LMB for 1.112353 seconds.
+Fleckenstein is holding the key LMB for 1.125532 seconds.
+Fleckenstein is holding the key LMB for 1.139894 seconds.
+Fleckenstein is holding the key LMB for 1.15369 seconds.
+Fleckenstein is holding the key LMB for 1.168766 seconds.
+Fleckenstein is holding the key LMB for 1.185985 seconds.
+Fleckenstein is holding the key LMB for 1.204756 seconds.
+Fleckenstein is holding the key LMB for 1.22345 seconds.
+Fleckenstein is holding the key LMB for 1.2384069999999 seconds.
+Fleckenstein is holding the key LMB for 1.269379 seconds.
+Fleckenstein is holding the key LMB for 1.2821729999999 seconds.
+Fleckenstein is holding the key LMB for 1.298673 seconds.
+Fleckenstein is holding the key LMB for 1.314845 seconds.
+Fleckenstein is holding the key LMB for 1.329921 seconds.
+Fleckenstein is holding the key LMB for 1.34693 seconds.
+Fleckenstein is holding the key LMB for 1.363095 seconds.
+Fleckenstein is holding the key LMB for 1.377378 seconds.
+Fleckenstein is holding the key LMB for 1.401017 seconds.
+Fleckenstein is holding the key LMB for 1.421276 seconds.
+Fleckenstein is holding the key LMB for 1.4373439999999 seconds.
+Fleckenstein is holding the key LMB for 1.456278 seconds.
+Fleckenstein is holding the key LMB for 1.4724219999999 seconds.
+Fleckenstein is holding the key LMB for 1.4892189999999 seconds.
+Fleckenstein is holding the key LMB for 1.505714 seconds.
+Fleckenstein is holding the key LMB for 1.5211399999999 seconds.
+Fleckenstein is holding the key LMB for 1.565281 seconds.
+Fleckenstein is holding the key LMB for 1.580424 seconds.
+Fleckenstein is holding the key LMB for 1.5952109999999 seconds.
+Fleckenstein is holding the key LMB for 1.611005 seconds.
+Fleckenstein is holding the key LMB for 1.626495 seconds.
+Fleckenstein is holding the key LMB for 1.640448 seconds.
+Fleckenstein is holding the key LMB for 1.654628 seconds.
+Fleckenstein is holding the key LMB for 1.669618 seconds.
+Fleckenstein is holding the key LMB for 1.684365 seconds.
+Fleckenstein is holding the key LMB for 1.703397 seconds.
+Fleckenstein is holding the key LMB for 1.718886 seconds.
+Fleckenstein is holding the key LMB for 1.733969 seconds.
+Fleckenstein is holding the key LMB for 1.753792 seconds.
+Fleckenstein is holding the key LMB for 1.783037 seconds.
+Fleckenstein is holding the key LMB for 1.825139 seconds.
+Fleckenstein is holding the key LMB for 1.857297 seconds.
+Fleckenstein is holding the key LMB for 1.873051 seconds.
+Fleckenstein is holding the key LMB for 1.884405 seconds.
+Fleckenstein is holding the key LMB for 1.903429 seconds.
+Fleckenstein is holding the key LMB for 1.919598 seconds.
+Fleckenstein is holding the key LMB for 1.934025 seconds.
+Fleckenstein is holding the key LMB for 1.9512149999999 seconds.
+Fleckenstein released the key LMB after 1.9670629999999 seconds!
+Fleckenstein pressed the key jump!
+Fleckenstein is holding the key jump for 0.015783000000056 seconds.
+Fleckenstein is holding the key jump for 0.032691 seconds.
+Fleckenstein is holding the key jump for 0.047794000000067 seconds.
+Fleckenstein is holding the key jump for 0.049444999999992 seconds.
+Fleckenstein is holding the key jump for 0.065138000000047 seconds.
+Fleckenstein is holding the key jump for 0.08057000000008 seconds.
+Fleckenstein is holding the key jump for 0.097158000000036 seconds.
+Fleckenstein released the key jump after 0.10128099999997 seconds!
+Fleckenstein pressed the key jump!
+Fleckenstein is holding the key jump for 0.017320000000041 seconds.
+Fleckenstein is holding the key jump for 0.033510999999976 seconds.
+Fleckenstein is holding the key jump for 0.050639000000047 seconds.
+Fleckenstein is holding the key jump for 0.078654000000029 seconds.
+Fleckenstein is holding the key jump for 0.10382300000003 seconds.
+Fleckenstein is holding the key jump for 0.13812800000005 seconds.
+Fleckenstein is holding the key jump for 0.14931799999999 seconds.
+Fleckenstein is holding the key jump for 0.17485399999998 seconds.
+Fleckenstein is holding the key jump for 0.19556499999999 seconds.
+Fleckenstein is holding the key jump for 0.21764800000005 seconds.
+Fleckenstein is holding the key jump for 0.23961900000006 seconds.
+Fleckenstein is holding the key jump for 0.255585 seconds.
+Fleckenstein released the key jump after 0.26396099999999 seconds!
+Fleckenstein pressed the key sneak!
+Fleckenstein is holding the key sneak for 0.013890999999944 seconds.
+Fleckenstein is holding the key sneak for 0.032347999999956 seconds.
+Fleckenstein is holding the key sneak for 0.048651999999947 seconds.
+Fleckenstein is holding the key sneak for 0.056610999999975 seconds.
+Fleckenstein is holding the key sneak for 0.07001600000001 seconds.
+Fleckenstein is holding the key sneak for 0.08952899999997 seconds.
+Fleckenstein is holding the key sneak for 0.10880399999996 seconds.
+Fleckenstein is holding the key sneak for 0.11799299999996 seconds.
+Fleckenstein is holding the key sneak for 0.13449099999991 seconds.
+Fleckenstein is holding the key sneak for 0.15278599999999 seconds.
+Fleckenstein is holding the key sneak for 0.16669300000001 seconds.
+Fleckenstein released the key sneak after 0.17429399999992 seconds!
+Fleckenstein pressed the key up!
+Fleckenstein is holding the key up for 0.014383000000066 seconds.
+Fleckenstein released the key up after 0.035454999999956 seconds!
+Fleckenstein pressed the key left!
+Fleckenstein is holding the key left for 0.012255999999979 seconds.
+Fleckenstein is holding the key left for 0.026486999999975 seconds.
+Fleckenstein released the key left after 0.040217999999982 seconds!
+Fleckenstein pressed the key down!
+Fleckenstein is holding the key down for 0.036098999999922 seconds.
+Fleckenstein released the key down after 0.042497000000026 seconds!
+Fleckenstein pressed the key right!
+Fleckenstein is holding the key right for 0.019147000000089 seconds.
+Fleckenstein is holding the key right for 0.049016000000051 seconds.
+Fleckenstein is holding the key right for 0.049593000000073 seconds.
+Fleckenstein is holding the key right for 0.071093000000019 seconds.
+Fleckenstein is holding the key right for 0.08872800000006 seconds.
+Fleckenstein is holding the key right for 0.094588000000044 seconds.
+Fleckenstein is holding the key right for 0.106583 seconds.
+Fleckenstein is holding the key right for 0.12210100000004 seconds.
+Fleckenstein is holding the key right for 0.13376200000005 seconds.
+Fleckenstein released the key right after 0.14363800000001 seconds!
+Fleckenstein pressed the key sneak!
+Fleckenstein is holding the key sneak for 0.012320000000045 seconds.
+Fleckenstein is holding the key sneak for 0.022090000000048 seconds.
+Fleckenstein is holding the key sneak for 0.035840000000007 seconds.
+Fleckenstein released the key sneak after 0.039854999999989 seconds!
+Fleckenstein pressed the key sneak!
+Fleckenstein is holding the key sneak for 0.022381999999993 seconds.
+Fleckenstein is holding the key sneak for 0.034923999999933 seconds.
+Fleckenstein released the key sneak after 0.041523999999981 seconds!
+Fleckenstein pressed the key sneak!
+Fleckenstein is holding the key sneak for 0.01146499999993 seconds.
+Fleckenstein is holding the key sneak for 0.051348999999959 seconds.
+Fleckenstein released the key sneak after 0.05213399999991 seconds!
+Fleckenstein pressed the key jump!
+Fleckenstein is holding the key jump for 0.011889999999994 seconds.
+Fleckenstein is holding the key jump for 0.035744999999906 seconds.
+Fleckenstein released the key jump after 0.05189699999994 seconds!
+Fleckenstein pressed the key jump!
+Fleckenstein is holding the key jump for 0.0063940000000002 seconds.
+Fleckenstein is holding the key jump for 0.019315000000006 seconds.
+Fleckenstein is holding the key jump for 0.03441799999996 seconds.
+Fleckenstein released the key jump after 0.039775999999961 seconds!
+Fleckenstein pressed the key up!
+Fleckenstein is holding the key up for 0.011964000000035 seconds.
+Fleckenstein is holding the key up for 0.022289999999998 seconds.
+Fleckenstein is holding the key up for 0.038319999999999 seconds.
+Fleckenstein is holding the key up for 0.044512000000054 seconds.
+Fleckenstein is holding the key up for 0.057231000000002 seconds.
+Fleckenstein is holding the key up for 0.070762000000059 seconds.
+Fleckenstein is holding the key up for 0.093927000000008 seconds.
+Fleckenstein released the key up after 0.10041000000001 seconds!
+Fleckenstein pressed the key up!
+Fleckenstein is holding the key up for 0.015309999999999 seconds.
+Fleckenstein is holding the key up for 0.028630000000021 seconds.
+Fleckenstein is holding the key up for 0.04340000000002 seconds.
+Fleckenstein is holding the key up for 0.050007000000051 seconds.
+Fleckenstein is holding the key up for 0.067867999999976 seconds.
+Fleckenstein is holding the key up for 0.092568000000028 seconds.
+Fleckenstein is holding the key up for 0.13364100000001 seconds.
+Fleckenstein released the key up after 0.13453000000004 seconds!
+Fleckenstein pressed the key jump!
+Fleckenstein is holding the key jump for 0.011369999999943 seconds.
+Fleckenstein is holding the key jump for 0.022454999999923 seconds.
+Fleckenstein is holding the key jump for 0.039012999999954 seconds.
+Fleckenstein released the key jump after 0.046151999999893 seconds!
+Fleckenstein pressed the key jump!
+Fleckenstein is holding the key jump for 0.018190000000004 seconds.
+Fleckenstein is holding the key jump for 0.032178000000044 seconds.
+Fleckenstein is holding the key jump for 0.079949000000056 seconds.
+Fleckenstein released the key jump after 0.080588000000034 seconds!
+Fleckenstein pressed the key down!
+Fleckenstein is holding the key down for 0.014630000000011 seconds.
+Fleckenstein is holding the key down for 0.025980000000004 seconds.
+Fleckenstein is holding the key down for 0.056161999999972 seconds.
+Fleckenstein is holding the key down for 0.057268999999906 seconds.
+Fleckenstein is holding the key down for 0.074709999999982 seconds.
+Fleckenstein is holding the key down for 0.084626999999955 seconds.
+Fleckenstein is holding the key down for 0.10642599999994 seconds.
+Fleckenstein released the key down after 0.11068999999998 seconds!
+Fleckenstein pressed the key up!
+Fleckenstein is holding the key up for 0.012876000000006 seconds.
+Fleckenstein is holding the key up for 0.028548999999998 seconds.
+Fleckenstein is holding the key up for 0.040172999999982 seconds.
+Fleckenstein released the key up after 0.074436999999989 seconds!
+Fleckenstein pressed the key sneak!
+Fleckenstein is holding the key sneak for 0.0096609999999373 seconds.
+Fleckenstein is holding the key sneak for 0.022593000000029 seconds.
+Fleckenstein is holding the key sneak for 0.036727000000042 seconds.
+Fleckenstein released the key sneak after 0.044146999999953 seconds!
+Fleckenstein pressed the key left!
+Fleckenstein is holding the key left for 0.012990999999943 seconds.
+Fleckenstein released the key left after 0.020234999999957 seconds!
+Fleckenstein pressed the key up!
+Fleckenstein is holding the key up for 0.0118819999999 seconds.
+Fleckenstein is holding the key up for 0.025670999999988 seconds.
+Fleckenstein is holding the key up for 0.044880999999918 seconds.
+Fleckenstein released the key up after 0.07998299999997 seconds!
+Fleckenstein pressed the key up!
+Fleckenstein is holding the key up for 0.0089100000000144 seconds.
+Fleckenstein is holding the key up for 0.021604000000025 seconds.
+Fleckenstein is holding the key up for 0.037004000000024 seconds.
+Fleckenstein is holding the key up for 0.044627999999989 seconds.
+Fleckenstein is holding the key up for 0.05587700000001 seconds.
+Fleckenstein is holding the key up for 0.066393000000062 seconds.
+Fleckenstein is holding the key up for 0.081007999999997 seconds.
+Fleckenstein released the key up after 0.08752000000004 seconds!
+Fleckenstein pressed the key jump!
+Fleckenstein is holding the key jump for 0.0090940000000046 seconds.
+Fleckenstein is holding the key jump for 0.022309000000064 seconds.
+Fleckenstein is holding the key jump for 0.033913999999982 seconds.
+Fleckenstein is holding the key jump for 0.039213000000018 seconds.
+Fleckenstein is holding the key jump for 0.048246000000063 seconds.
+Fleckenstein is holding the key jump for 0.059052000000065 seconds.
+Fleckenstein is holding the key jump for 0.074431000000004 seconds.
+Fleckenstein is holding the key jump for 0.079991000000064 seconds.
+Fleckenstein is holding the key jump for 0.089447000000064 seconds.
+Fleckenstein is holding the key jump for 0.10636299999999 seconds.
+Fleckenstein is holding the key jump for 0.12482199999999 seconds.
+Fleckenstein released the key jump after 0.13100100000008 seconds!
+Fleckenstein pressed the key left!
+Fleckenstein is holding the key left for 0.012752000000091 seconds.
+Fleckenstein is holding the key left for 0.022721000000047 seconds.
+Fleckenstein is holding the key left for 0.037585000000036 seconds.
+Fleckenstein is holding the key left for 0.044185000000084 seconds.
+Fleckenstein is holding the key left for 0.054813000000081 seconds.
+Fleckenstein is holding the key left for 0.070442000000071 seconds.
+Fleckenstein is holding the key left for 0.085215000000062 seconds.
+Fleckenstein is holding the key left for 0.09155700000008 seconds.
+Fleckenstein is holding the key left for 0.10349400000007 seconds.
+Fleckenstein is holding the key left for 0.11707799999999 seconds.
+Fleckenstein is holding the key left for 0.13275099999998 seconds.
+Fleckenstein released the key left after 0.14163400000007 seconds!
+Fleckenstein pressed the key sneak!
+Fleckenstein is holding the key sneak for 0.013751999999954 seconds.
+Fleckenstein is holding the key sneak for 0.029144999999971 seconds.
+Fleckenstein is holding the key sneak for 0.040470999999911 seconds.
+Fleckenstein is holding the key sneak for 0.05300699999998 seconds.
+Fleckenstein is holding the key sneak for 0.066778999999997 seconds.
+Fleckenstein is holding the key sneak for 0.084210999999982 seconds.
+Fleckenstein is holding the key sneak for 0.10335399999997 seconds.
+Fleckenstein released the key sneak after 0.10853399999996 seconds!
+Fleckenstein pressed the key sneak!
+Fleckenstein is holding the key sneak for 0.0075090000000273 seconds.
+Fleckenstein is holding the key sneak for 0.020906999999966 seconds.
+Fleckenstein is holding the key sneak for 0.038669000000027 seconds.
+Fleckenstein released the key sneak after 0.044477000000029 seconds!
+Fleckenstein pressed the key sneak!
+Fleckenstein is holding the key sneak for 0.0090979999999945 seconds.
+Fleckenstein is holding the key sneak for 0.020612000000028 seconds.
+Fleckenstein is holding the key sneak for 0.047714000000042 seconds.
+Fleckenstein released the key sneak after 0.048039000000017 seconds!
+Fleckenstein pressed the key sneak!
+Fleckenstein is holding the key sneak for 0.0093699999999899 seconds.
+Fleckenstein is holding the key sneak for 0.021623999999974 seconds.
+Fleckenstein is holding the key sneak for 0.035085999999978 seconds.
+Fleckenstein is holding the key sneak for 0.040059000000042 seconds.
+Fleckenstein is holding the key sneak for 0.050911000000042 seconds.
+Fleckenstein is holding the key sneak for 0.061812000000032 seconds.
+Fleckenstein is holding the key sneak for 0.077476000000047 seconds.
+Fleckenstein released the key sneak after 0.10580100000004 seconds!
+Fleckenstein pressed the key sneak!
+Fleckenstein is holding the key sneak for 0.0099079999999958 seconds.
+Fleckenstein is holding the key sneak for 0.020422999999937 seconds.
+Fleckenstein is holding the key sneak for 0.033051999999998 seconds.
+Fleckenstein released the key sneak after 0.038802000000032 seconds!
+Fleckenstein pressed the key up!
+Fleckenstein is holding the key up for 0.0095739999999296 seconds.
+Fleckenstein is holding the key up for 0.021635999999944 seconds.
+Fleckenstein is holding the key up for 0.034882999999923 seconds.
+Fleckenstein released the key up after 0.042968999999971 seconds!
+Fleckenstein pressed the key left!
+Fleckenstein is holding the key left for 0.0099769999999353 seconds.
+Fleckenstein is holding the key left for 0.031178999999952 seconds.
+Fleckenstein is holding the key left for 0.044677999999976 seconds.
+Fleckenstein is holding the key left for 0.05986699999994 seconds.
+Fleckenstein is holding the key left for 0.072655999999938 seconds.
+Fleckenstein is holding the key left for 0.092052999999964 seconds.
+Fleckenstein is holding the key left for 0.104646 seconds.
+Fleckenstein is holding the key left for 0.11375699999996 seconds.
+Fleckenstein is holding the key left for 0.15959999999995 seconds.
+Fleckenstein is holding the key left for 0.16764999999998 seconds.
+Fleckenstein is holding the key left for 0.18216499999994 seconds.
+Fleckenstein is holding the key left for 0.20722999999998 seconds.
+Fleckenstein is holding the key left for 0.22277599999995 seconds.
+Fleckenstein is holding the key left for 0.23432100000002 seconds.
+Fleckenstein is holding the key left for 0.25034499999992 seconds.
+Fleckenstein is holding the key left for 0.26844199999994 seconds.
+Fleckenstein is holding the key left for 0.28346399999998 seconds.
+Fleckenstein released the key left after 0.29756299999997 seconds!
+Fleckenstein pressed the key jump!
+Fleckenstein is holding the key jump for 0.016390000000001 seconds.
+Fleckenstein is holding the key jump for 0.044790000000035 seconds.
+Fleckenstein is holding the key jump for 0.065926999999988 seconds.
+Fleckenstein is holding the key jump for 0.088794000000007 seconds.
+Fleckenstein is holding the key jump for 0.091530000000034 seconds.
+Fleckenstein is holding the key jump for 0.12946099999999 seconds.
+Fleckenstein released the key jump after 0.13816299999996 seconds!
+Fleckenstein pressed the key up!
+Fleckenstein is holding the key up for 0.015244999999936 seconds.
+Fleckenstein is holding the key up for 0.02639499999998 seconds.
+Fleckenstein is holding the key up for 0.050786000000016 seconds.
+Fleckenstein is holding the key up for 0.060314999999946 seconds.
+Fleckenstein is holding the key up for 0.075737000000004 seconds.
+Fleckenstein is holding the key up for 0.10037499999999 seconds.
+Fleckenstein is holding the key up for 0.11800999999991 seconds.
+Fleckenstein is holding the key up for 0.13357099999996 seconds.
+Fleckenstein is holding the key up for 0.15168299999993 seconds.
+Fleckenstein is holding the key up for 0.17004599999996 seconds.
+Fleckenstein is holding the key up for 0.18680799999993 seconds.
+Fleckenstein pressed the key left!
+Fleckenstein released the key up after 0.18779099999995 seconds!
+Fleckenstein is holding the key left for 0.017061000000012 seconds.
+Fleckenstein is holding the key left for 0.031746999999996 seconds.
+Fleckenstein is holding the key left for 0.043119000000047 seconds.
+Fleckenstein is holding the key left for 0.049540999999977 seconds.
+Fleckenstein is holding the key left for 0.064616999999998 seconds.
+Fleckenstein is holding the key left for 0.086906999999997 seconds.
+Fleckenstein released the key left after 0.10252200000002 seconds!
+Fleckenstein pressed the key RMB!
+Fleckenstein is holding the key RMB for 0.021518000000015 seconds.
+Fleckenstein is holding the key RMB for 0.023572000000058 seconds.
+Fleckenstein is holding the key RMB for 0.039130999999998 seconds.
+Fleckenstein is holding the key RMB for 0.045121999999992 seconds.
+Fleckenstein is holding the key RMB for 0.057337000000075 seconds.
+Fleckenstein is holding the key RMB for 0.067178000000013 seconds.
+Fleckenstein is holding the key RMB for 0.079477999999995 seconds.
+Fleckenstein released the key RMB after 0.085058000000004 seconds!
+Fleckenstein pressed the key down!
+Fleckenstein is holding the key down for 0.013975999999957 seconds.
+Fleckenstein is holding the key down for 0.02839199999994 seconds.
+Fleckenstein is holding the key down for 0.039887999999905 seconds.
+Fleckenstein is holding the key down for 0.04549099999997 seconds.
+Fleckenstein is holding the key down for 0.060186999999928 seconds.
+Fleckenstein is holding the key down for 0.072628999999893 seconds.
+Fleckenstein is holding the key down for 0.10191199999997 seconds.
+Fleckenstein is holding the key down for 0.10278399999993 seconds.
+Fleckenstein is holding the key down for 0.117617 seconds.
+Fleckenstein is holding the key down for 0.12952999999993 seconds.
+Fleckenstein released the key down after 0.13554699999997 seconds!
+Fleckenstein pressed the key LMB!
+Fleckenstein is holding the key LMB for 0.0082320000000209 seconds.
+Fleckenstein is holding the key LMB for 0.023257000000058 seconds.
+Fleckenstein is holding the key LMB for 0.036753999999974 seconds.
+Fleckenstein released the key LMB after 0.043113000000062 seconds!
+Fleckenstein pressed the key LMB!
+Fleckenstein is holding the key LMB for 0.019097999999985 seconds.
+Fleckenstein is holding the key LMB for 0.020862000000079 seconds.
+Fleckenstein is holding the key LMB for 0.028654000000074 seconds.
+Fleckenstein is holding the key LMB for 0.043544999999995 seconds.
+Fleckenstein released the key LMB after 0.050376000000028 seconds!
+Fleckenstein pressed the key LMB!
+Fleckenstein is holding the key LMB for 0.013457000000017 seconds.
+Fleckenstein is holding the key LMB for 0.025947999999971 seconds.
+Fleckenstein is holding the key LMB for 0.03708800000004 seconds.
+Fleckenstein released the key LMB after 0.045473000000015 seconds!
+Fleckenstein pressed the key RMB!
+Fleckenstein is holding the key RMB for 0.01284499999997 seconds.
+Fleckenstein is holding the key RMB for 0.023792999999955 seconds.
+Fleckenstein is holding the key RMB for 0.027881999999977 seconds.
+Fleckenstein is holding the key RMB for 0.040386000000012 seconds.
+Fleckenstein is holding the key RMB for 0.052436999999941 seconds.
+Fleckenstein is holding the key RMB for 0.063230999999973 seconds.
+Fleckenstein released the key RMB after 0.06723599999998 seconds!
+Fleckenstein pressed the key RMB!
+Fleckenstein is holding the key RMB for 0.011911999999938 seconds.
+Fleckenstein is holding the key RMB for 0.021314999999959 seconds.
+Fleckenstein is holding the key RMB for 0.034527000000026 seconds.
+Fleckenstein is holding the key RMB for 0.047998000000007 seconds.
+Fleckenstein is holding the key RMB for 0.061652999999978 seconds.
+Fleckenstein released the key RMB after 0.067373999999973 seconds!
+Fleckenstein pressed the key RMB!
+Fleckenstein is holding the key RMB for 0.01428999999996 seconds.
+Fleckenstein is holding the key RMB for 0.016943999999967 seconds.
+Fleckenstein is holding the key RMB for 0.026053000000047 seconds.
+Fleckenstein is holding the key RMB for 0.041957000000025 seconds.
+Fleckenstein is holding the key RMB for 0.058712000000014 seconds.
+Fleckenstein released the key RMB after 0.064740000000029 seconds!
+Fleckenstein pressed the key LMB!
+Fleckenstein is holding the key LMB for 0.014121000000046 seconds.
+Fleckenstein is holding the key LMB for 0.027704999999969 seconds.
+Fleckenstein is holding the key LMB for 0.04553999999996 seconds.
+Fleckenstein released the key LMB after 0.05162299999995 seconds!
+Fleckenstein pressed the key LMB!
+Fleckenstein is holding the key LMB for 0.012909000000036 seconds.
+Fleckenstein is holding the key LMB for 0.027998000000025 seconds.
+Fleckenstein is holding the key LMB for 0.043872000000079 seconds.
+Fleckenstein released the key LMB after 0.052462999999989 seconds!
+Fleckenstein pressed the key LMB!
+Fleckenstein is holding the key LMB for 0.010689999999954 seconds.
+Fleckenstein is holding the key LMB for 0.040006999999946 seconds.
+Fleckenstein released the key LMB after 0.044879999999921 seconds!
+Fleckenstein pressed the key LMB!
+Fleckenstein is holding the key LMB for 0.012043999999946 seconds.
+Fleckenstein is holding the key LMB for 0.025927000000024 seconds.
+Fleckenstein is holding the key LMB for 0.030941999999982 seconds.
+Fleckenstein is holding the key LMB for 0.038637999999992 seconds.
+Fleckenstein is holding the key LMB for 0.052729999999997 seconds.
+Fleckenstein is holding the key LMB for 0.066372999999999 seconds.
+Fleckenstein released the key LMB after 0.072631999999999 seconds!
+Fleckenstein pressed the key left!
+Fleckenstein is holding the key left for 0.014303000000041 seconds.
+Fleckenstein is holding the key left for 0.025833000000034 seconds.
+Fleckenstein is holding the key left for 0.04315900000006 seconds.
+Fleckenstein released the key left after 0.051240000000007 seconds!
+Fleckenstein pressed the key left!
+Fleckenstein is holding the key left for 0.013663999999949 seconds.
+Fleckenstein is holding the key left for 0.02323899999999 seconds.
+Fleckenstein is holding the key left for 0.035851999999977 seconds.
+Fleckenstein released the key left after 0.041668999999956 seconds!
+Fleckenstein pressed the key left!
+Fleckenstein is holding the key left for 0.0083019999999578 seconds.
+Fleckenstein is holding the key left for 0.019376999999963 seconds.
+Fleckenstein is holding the key left for 0.033656000000065 seconds.
+Fleckenstein released the key left after 0.038489000000027 seconds!
+Fleckenstein pressed the key right!
+Fleckenstein is holding the key right for 0.01105599999994 seconds.
+Fleckenstein is holding the key right for 0.021020000000021 seconds.
+Fleckenstein is holding the key right for 0.034192999999959 seconds.
+Fleckenstein is holding the key right for 0.038985000000025 seconds.
+Fleckenstein is holding the key right for 0.049544999999966 seconds.
+Fleckenstein is holding the key right for 0.060155000000009 seconds.
+Fleckenstein is holding the key right for 0.073864999999955 seconds.
+Fleckenstein released the key right after 0.080283000000009 seconds!
+Fleckenstein pressed the key down!
+Fleckenstein is holding the key down for 0.014772999999991 seconds.
+Fleckenstein is holding the key down for 0.087473000000045 seconds.
+Fleckenstein released the key down after 0.089302999999973 seconds!
+Fleckenstein pressed the key up!
+Fleckenstein is holding the key up for 0.0092829999999822 seconds.
+Fleckenstein is holding the key up for 0.022984999999949 seconds.
+Fleckenstein is holding the key up for 0.097362999999973 seconds.
+Fleckenstein pressed the key sneak!
+Fleckenstein is holding the key up for 0.098404999999957 seconds.
+Fleckenstein is holding the key sneak for 0.0074620000000323 seconds.
+Fleckenstein is holding the key up for 0.10593099999994 seconds.
+Fleckenstein is holding the key sneak for 0.022538000000054 seconds.
+Fleckenstein is holding the key up for 0.12098500000002 seconds.
+Fleckenstein is holding the key sneak for 0.031175999999959 seconds.
+Fleckenstein is holding the key up for 0.12961999999993 seconds.
+Fleckenstein is holding the key sneak for 0.042284999999993 seconds.
+Fleckenstein is holding the key up for 0.140804 seconds.
+Fleckenstein is holding the key sneak for 0.052899000000025 seconds.
+Fleckenstein is holding the key up for 0.15134899999998 seconds.
+Fleckenstein is holding the key sneak for 0.066206999999963 seconds.
+Fleckenstein is holding the key up for 0.16463799999997 seconds.
+Fleckenstein released the key sneak after 0.070850999999948 seconds!
+Fleckenstein released the key up after 0.16929299999993 seconds!
+Fleckenstein pressed the key up!
+Fleckenstein is holding the key up for 0.01248499999997 seconds.
+Fleckenstein is holding the key up for 0.02855999999997 seconds.
+Fleckenstein is holding the key up for 0.045815999999945 seconds.
+Fleckenstein is holding the key up for 0.05332199999998 seconds.
+Fleckenstein is holding the key up for 0.066622999999936 seconds.
+Fleckenstein is holding the key up for 0.079354999999964 seconds.
+Fleckenstein is holding the key up for 0.090886999999952 seconds.
+Fleckenstein released the key up after 0.095031999999946 seconds!
+Fleckenstein pressed the key up!
+Fleckenstein is holding the key up for 0.015919999999937 seconds.
+Fleckenstein is holding the key up for 0.026011999999923 seconds.
+Fleckenstein is holding the key up for 0.040178999999966 seconds.
+Fleckenstein is holding the key up for 0.049589999999966 seconds.
+Fleckenstein is holding the key up for 0.063738999999941 seconds.
+Fleckenstein is holding the key up for 0.075956999999903 seconds.
+Fleckenstein is holding the key up for 0.090170999999941 seconds.
+Fleckenstein is holding the key up for 0.096477999999934 seconds.
+Fleckenstein is holding the key up for 0.10784699999999 seconds.
+Fleckenstein is holding the key up for 0.12357799999995 seconds.
+Fleckenstein is holding the key up for 0.14023299999997 seconds.
+Fleckenstein released the key up after 0.14690599999994 seconds!
+Fleckenstein pressed the key up!
+Fleckenstein is holding the key up for 0.030034999999998 seconds.
+Fleckenstein is holding the key up for 0.070851999999945 seconds.
+Fleckenstein is holding the key up for 0.091358000000014 seconds.
+Fleckenstein is holding the key up for 0.11807999999996 seconds.
+Fleckenstein is holding the key up for 0.145219 seconds.
+Fleckenstein is holding the key up for 0.17247099999997 seconds.
+Fleckenstein is holding the key up for 0.19676400000003 seconds.
+Fleckenstein is holding the key up for 0.29332199999999 seconds.
+Fleckenstein is holding the key up for 0.29380700000002 seconds.
+Fleckenstein is holding the key up for 0.30274999999995 seconds.
+Fleckenstein is holding the key up for 0.31236100000001 seconds.
+Fleckenstein is holding the key up for 0.33022499999993 seconds.
+Fleckenstein is holding the key up for 0.35866999999996 seconds.
+Fleckenstein is holding the key up for 0.37120500000003 seconds.
+Fleckenstein is holding the key up for 0.38938099999996 seconds.
+Fleckenstein is holding the key up for 0.40141600000004 seconds.
+Fleckenstein is holding the key up for 0.42028600000003 seconds.
+Fleckenstein is holding the key up for 0.44131200000004 seconds.
+Fleckenstein is holding the key up for 0.45022900000004 seconds.
+Fleckenstein is holding the key up for 0.46763199999998 seconds.
+Fleckenstein is holding the key up for 0.49143000000004 seconds.
+Fleckenstein is holding the key up for 0.50610800000004 seconds.
+Fleckenstein is holding the key up for 0.52568899999994 seconds.
+Fleckenstein is holding the key up for 0.54522499999996 seconds.
+Fleckenstein is holding the key up for 0.56201999999996 seconds.
+Fleckenstein is holding the key up for 0.58314699999994 seconds.
+Fleckenstein is holding the key up for 0.59299399999998 seconds.
+Fleckenstein is holding the key up for 0.61040800000001 seconds.
+Fleckenstein is holding the key up for 0.64728100000002 seconds.
+Fleckenstein is holding the key up for 0.64767599999993 seconds.
+Fleckenstein is holding the key up for 0.66483299999993 seconds.
+Fleckenstein is holding the key up for 0.684303 seconds.
+Fleckenstein is holding the key up for 0.69720599999994 seconds.
+Fleckenstein is holding the key up for 0.70818399999996 seconds.
+Fleckenstein is holding the key up for 0.72994800000004 seconds.
+Fleckenstein is holding the key up for 0.74553900000001 seconds.
+Fleckenstein is holding the key up for 0.76556500000004 seconds.
+Fleckenstein is holding the key up for 0.77246300000002 seconds.
+Fleckenstein is holding the key up for 0.78074100000003 seconds.
+Fleckenstein is holding the key up for 0.79888099999994 seconds.
+Fleckenstein is holding the key up for 0.81163200000003 seconds.
+Fleckenstein is holding the key up for 0.83101799999997 seconds.
+Fleckenstein released the key up after 0.84193199999993 seconds!
+Fleckenstein pressed the key up!
+Fleckenstein is holding the key up for 0.012151000000017 seconds.
+Fleckenstein is holding the key up for 0.025025000000028 seconds.
+Fleckenstein is holding the key up for 0.042242999999985 seconds.
+Fleckenstein released the key up after 0.048618000000033 seconds!
+Fleckenstein pressed the key up!
+Fleckenstein is holding the key up for 0.012523999999985 seconds.
+Fleckenstein is holding the key up for 0.026675999999952 seconds.
+Fleckenstein is holding the key up for 0.043162000000052 seconds.
+Fleckenstein is holding the key up for 0.050140000000056 seconds.
+Fleckenstein is holding the key up for 0.064059000000043 seconds.
+Fleckenstein is holding the key up for 0.077088000000003 seconds.
+Fleckenstein is holding the key up for 0.094203999999991 seconds.
+Fleckenstein released the key up after 0.10194300000001 seconds!
+Fleckenstein pressed the key jump!
+Fleckenstein is holding the key jump for 0.011405999999965 seconds.
+Fleckenstein is holding the key jump for 0.023121999999944 seconds.
+Fleckenstein is holding the key jump for 0.038212999999928 seconds.
+Fleckenstein is holding the key jump for 0.065030999999976 seconds.
+Fleckenstein pressed the key up!
+Fleckenstein is holding the key jump for 0.077025999999933 seconds.
+Fleckenstein is holding the key up for 0.012404999999944 seconds.
+Fleckenstein released the key jump after 0.090145000000007 seconds!
+Fleckenstein is holding the key up for 0.025019000000043 seconds.
+Fleckenstein is holding the key up for 0.037339999999972 seconds.
+Fleckenstein is holding the key up for 0.051204999999982 seconds.
+Fleckenstein is holding the key up for 0.069812999999954 seconds.
+Fleckenstein released the key up after 0.076628000000028 seconds!
+Fleckenstein pressed the key jump!
+Fleckenstein is holding the key jump for 0.016558999999916 seconds.
+Fleckenstein is holding the key jump for 0.03148299999998 seconds.
+Fleckenstein is holding the key jump for 0.046439999999961 seconds.
+Fleckenstein is holding the key jump for 0.059612999999899 seconds.
+Fleckenstein is holding the key jump for 0.073413999999957 seconds.
+Fleckenstein is holding the key jump for 0.085208999999963 seconds.
+Fleckenstein released the key jump after 0.09371299999998 seconds!
+Fleckenstein pressed the key up!
+Fleckenstein is holding the key up for 0.010073999999918 seconds.
+Fleckenstein is holding the key up for 0.024252999999931 seconds.
+Fleckenstein is holding the key up for 0.036243000000013 seconds.
+Fleckenstein released the key up after 0.042664999999943 seconds!
+Fleckenstein pressed the key up!
+Fleckenstein is holding the key up for 0.016501999999946 seconds.
+Fleckenstein is holding the key up for 0.030182999999965 seconds.
+Fleckenstein is holding the key up for 0.046543999999926 seconds.
+Fleckenstein released the key up after 0.051559999999995 seconds!
+Fleckenstein pressed the key up!
+Fleckenstein is holding the key up for 0.012069999999994 seconds.
+Fleckenstein is holding the key up for 0.025139999999965 seconds.
+Fleckenstein is holding the key up for 0.036497000000054 seconds.
+Fleckenstein released the key up after 0.043452000000002 seconds!
+Fleckenstein pressed the key sneak!
+Fleckenstein is holding the key sneak for 0.016417000000047 seconds.
+Fleckenstein is holding the key sneak for 0.029109000000062 seconds.
+Fleckenstein is holding the key sneak for 0.046764000000053 seconds.
+Fleckenstein is holding the key sneak for 0.059384000000023 seconds.
+Fleckenstein is holding the key sneak for 0.074115000000006 seconds.
+Fleckenstein is holding the key sneak for 0.089357000000064 seconds.
+Fleckenstein is holding the key sneak for 0.10574500000007 seconds.
+Fleckenstein is holding the key sneak for 0.12130100000002 seconds.
+Fleckenstein is holding the key sneak for 0.15925100000004 seconds.
+Fleckenstein released the key sneak after 0.15979000000004 seconds!
+Fleckenstein pressed the key sneak!
+Fleckenstein is holding the key sneak for 0.013019999999983 seconds.
+Fleckenstein is holding the key sneak for 0.027370000000019 seconds.
+Fleckenstein is holding the key sneak for 0.037458000000015 seconds.
+Fleckenstein released the key sneak after 0.042389999999955 seconds!
+# Server: version=5.2.0-GalwayGirl, uptime=2.064, max_lag=1.9984, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=1.967, max_lag=1.90148, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=1.929, max_lag=1.86351, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+*** Foxy03 joined the game.
+\e(c@#FFFFFF)\e(c@#ffffff)Foxy03 has joined the Server.
+\e(c@#00D600)Foxy03 has joined the Server for the first Time! Welcome!\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=2.065, max_lag=1.9984, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+*** Foxy03 joined the game.
+\e(c@#FFFFFF)\e(c@#ffffff)Foxy03 has joined the Server.
+*** Foxy03 left the game.
+\e(c@#FFFFFF)\e(c@#ffffff)Foxy03 has left the Server.
+# Server: version=5.2.0-GalwayGirl, uptime=1.913, max_lag=1.84752, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=1.943, max_lag=1.8775, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=2.064, max_lag=1.9984, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=2.064, max_lag=1.9984, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=1.923, max_lag=1.85751, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=1.968, max_lag=1.90148, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=2.021, max_lag=1.95543, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+press
+press
+press
+press
+press
+press
+# Server: version=5.2.0-GalwayGirl, uptime=1.939, max_lag=1.8725, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=1.939, max_lag=1.8735, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=1.938, max_lag=1.8725, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+Press
+Press
+Press
+Press
+Press
+Press
+Press
+Press
+Press
+Press
+Press
+Press
+Press
+Press
+Press
+Press
+Press
+# Server: version=5.2.0-GalwayGirl, uptime=1.887, max_lag=1.82154, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+Press
+Press
+Press
+Press
+*** Foxy03 joined the game.
+\e(c@#FFFFFF)\e(c@#ffffff)Foxy03 has joined the Server.
+# Server: version=5.2.0-GalwayGirl, uptime=2.065, max_lag=1.9984, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+*** Foxy03 joined the game.
+\e(c@#FFFFFF)\e(c@#ffffff)Foxy03 has joined the Server.
+*** Foxy03 left the game.
+\e(c@#FFFFFF)\e(c@#ffffff)Foxy03 has left the Server.
+# Server: version=5.2.0-GalwayGirl, uptime=2.064, max_lag=1.9984, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+*** Foxy03 joined the game.
+\e(c@#FFFFFF)\e(c@#ffffff)Foxy03 has joined the Server.
+# Server: version=5.2.0-GalwayGirl, uptime=2.048, max_lag=1.98241, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+*** Foxy03 joined the game.
+\e(c@#FFFFFF)\e(c@#ffffff)Foxy03 has joined the Server.
+Foxy03 is now a \e(c@#16AE00)vip\e(c@#ffffff)
+*** Foxy03 left the game.
+\e(c@#16AE00)[VIP]\e(c@#ffffff)Foxy03 has left the Server.
+# Server: version=5.2.0-GalwayGirl, uptime=1.961, max_lag=1.89448, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=1.944, max_lag=1.8775, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=1.96, max_lag=1.89348, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=1.907, max_lag=1.84053, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=1.97, max_lag=1.88849, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=2.028, max_lag=1.96243, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=1.946, max_lag=1.88049, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=1.993, max_lag=1.92646, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=2.019, max_lag=1.95344, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=1.926, max_lag=1.86051, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+*** Foxy03 joined the game.
+\e(c@#16AE00)[VIP]\e(c@#ffffff)Foxy03 has joined the Server.
+*** Foxy03 left the game.
+\e(c@#16AE00)[VIP]\e(c@#ffffff)Foxy03 has left the Server.
+# Server: version=5.2.0-GalwayGirl, uptime=2.064, max_lag=1.9984, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=2.081, max_lag=1.998, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+*** Foxy03 joined the game.
+\e(c@#16AE00)[VIP]\e(c@#ffffff)Foxy03 has joined the Server.
+# Server: version=5.2.0-GalwayGirl, uptime=2.064, max_lag=1.9984, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=2.064, max_lag=1.9984, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+*** Foxy03 joined the game.
+\e(c@#16AE00)[VIP]\e(c@#ffffff)Foxy03 has joined the Server.
+# Server: version=5.2.0-GalwayGirl, uptime=2.718, max_lag=1.82681, clients={GalwayGirl2}
+*** GalwayGirl2 joined the game.
+\e(c@#FFFFFF)\e(c@#ffffff)GalwayGirl2 has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=2.176, max_lag=1.9968, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+*** Foxy03 joined the game.
+\e(c@#16AE00)[VIP]\e(c@#ffffff)Foxy03 has joined the Server.
+*** Foxy03 left the game.
+\e(c@#16AE00)[VIP]\e(c@#ffffff)Foxy03 has left the Server.
+# Server: version=5.2.0-GalwayGirl, uptime=2.179, max_lag=1.9968, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+*** Foxy03 joined the game.
+\e(c@#16AE00)[VIP]\e(c@#ffffff)Foxy03 has joined the Server.
+*** Foxy03 left the game.
+\e(c@#16AE00)[VIP]\e(c@#ffffff)Foxy03 has left the Server.
+# Server: version=5.2.0-GalwayGirl, uptime=1.635, max_lag=1.56874, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+Invalid Rank: 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+=> Fleckenstein has joined the server
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)Skyblock Update Done!\e(c@#ffffff)
+(2) You have mail! Type /inbox to recieve
+Opened inbox!
+/exec is deprecated. Use /sudo instead
+/exec is deprecated. Use /sudo instead
+/exec is deprecated. Use /sudo instead
+/exec is deprecated. Use /sudo instead
+/exec is deprecated. Use /sudo instead
+/exec is deprecated. Use /sudo instead
+/exec is deprecated. Use /sudo instead
+/exec is deprecated. Use /sudo instead
+/exec is deprecated. Use /sudo instead
+Time of day changed.
+Players in channel: Fleckenstein, likaroots, zxx
+<= zxx left the server
+\e(c@#FFFFFF)\e(c@#ffffff)zxx has left the Server.
+Fleckenstein is now invisible
+Fleckenstein whispers: Do you want to build a minigame? Then use /mail Fleckenstein!
+=> HimbeerserverDE has joined the server
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)HimbeerserverDE has joined the Server.
+=> zxx has joined the server
+\e(c@#FFFFFF)\e(c@#ffffff)zxx has joined the Server.
+Opened inbox!
+Message sent to adr
+Players in channel: Fleckenstein, HimbeerserverDE, likaroots, zxx
+Fleckenstein is no longer invisible
+# Server: version=5.2.0-GalwayGirl, uptime=1.673, max_lag=1.60771, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=2.177, max_lag=2.03016, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=2.225, max_lag=2.01318, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=2.064, max_lag=1.9984, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+127.0.0.1
+# Server: version=5.2.0-GalwayGirl, uptime=2.066, max_lag=1.9984, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+IP of Fleckenstein: 127.0.0.1
+# Server: version=5.2.0-GalwayGirl, uptime=2.176, max_lag=2.01318, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0-GalwayGirl, uptime=0.397, max_lag=0.200719, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#BBBBBB)[STUDENT]\e(c@#ffffff)Fleckenstein has joined the Server.
+Unknown privilege: teacher
+
+# Server: version=5.2.0-GalwayGirl, uptime=0.393, max_lag=0.328737, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#BBBBBB)[STUDENT]\e(c@#ffffff)Fleckenstein has joined the Server.
+Privileges of Fleckenstein: interact debug basic_privs password ban shout kick privs teacher server
+\e(c@#BBBBBB)[STUDENT]\e(c@#ffffff)<Fleckenstein> test
+# Server: version=5.2.0-GalwayGirl, uptime=0.239, max_lag=0.17486, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#16AE00)[TEACHER]\e(c@#ffffff)Fleckenstein has joined the Server.
+Fleckenstein ist jetzt ein \e(c@#FF362D)admin\e(c@#ffffff)
+Fleckenstein ist jetzt ein \e(c@#FF2D8D)owner\e(c@#ffffff)
+\e(c@#FF2D8D)[OWNER]\e(c@#ffffff)<Fleckenstein> test
+# Server: version=5.2.0-GalwayGirl, uptime=0.243, max_lag=0.178857, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[OWNER]\e(c@#ffffff)Fleckenstein has joined the Server.
+IP of Fleckenstein: 127.0.0.1
+# Server: version=5.2.0-GalwayGirl, uptime=2.177, max_lag=1.9968, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[ADMIN]\e(c@#ffffff)Fleckenstein has joined the Server.
+\e(c@#D6CD00) ELIDRAGON\e(c@#ffffff)
+\e(c@#6076FF) Join our discord Server (discord.gg/Z7SfXYx) or our IRC channel (#elidragon-skyblocks on irc.edgy1.net)\e(c@#ffffff)
+\e(c@#E27900) Go to hub using /hub\e(c@#ffffff)
+\e(c@#00F0FF) Use /island to teleport to your island\e(c@#ffffff)
+\e(c@#83FF00) NEWS: \e(c@#ffffff)\e(c@#FFFFFF)No current News\e(c@#ffffff)
+# Server: version=5.2.0, uptime=92079.9, max_lag=2.70753, clients={Fleckenstein}
+# Server: "Welcome. Again."
+*** Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=26081.2, max_lag=0.504497, clients={Fleckenstein, dankmemer}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+dankmemer left the game.
+# Server: version=5.2.0, uptime=26361.7, max_lag=0.270615, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+Fleckenstein
+
+# Server: version=5.2.0, uptime=26685.5, max_lag=0.131766, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+-!- Invalid command: spawn
+# Server: version=5.2.0, uptime=29808.7, max_lag=0.154647, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=29919.1, max_lag=0.179784, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+\e(T@mcl_nether)\eFFleckenstein\eE melted in lava.\eE
+\e(T@mcl_nether)\eFFleckenstein\eE died in lava.\eE
+# Server: version=5.2.0, uptime=30104.4, max_lag=0.135603, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+\e(T@mcl_playerplus)\eFFleckenstein\eE suffocated to death.\eE
+\e(T@mcl_playerplus)\eFFleckenstein\eE suffocated to death.\eE
+# Server: version=5.2.0, uptime=30450.1, max_lag=0.178816, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+Dirt joined the game.
+Dirt left the game.
+\e(T@mcl_playerplus)\eFFleckenstein\eE suffocated to death.\eE
+Dirt joined the game.
+<Fleckenstein>: hi
+<Fleckenstein>: wanna be an ally?
+<Dirt>: idk
+Dirt left the game.
+Dirt joined the game.
+Dirt left the game.
+Dirt joined the game.
+Dirt left the game.
+Dirt joined the game.
+Dirt left the game.
+\e(T@mcl_death_messages)\eFFleckenstein\eE was killed by a zombie.\eE
+\e(T@mcl_playerplus)\eFFleckenstein\eE suffocated to death.\eE
+BogArt joined the game.
+<BogArt>: Hi
+<Fleckenstein>: hi
+<Fleckenstein>: do u have dias?
+<BogArt>: dias?
+<Fleckenstein>: diamonds
+<BogArt>: Yeah
+<BogArt>: Almost a full set of diamond armour
+<Fleckenstein>: i had one but i lost it
+<BogArt>: rip
+<Fleckenstein>: i'm currently mining for new one
+<BogArt>: tI lost quite a bit of iron
+<Fleckenstein>: bb
+# Server: version=5.2.0, uptime=31930.5, max_lag=0.179102, clients={Fleckenstein, BogArt}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+<BogArt>: wb
+# Server: version=5.2.0, uptime=32040.6, max_lag=0.357846, clients={Fleckenstein, BogArt}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+\e(T@mcl_playerplus)\eFFleckenstein\eE suffocated to death.\eE
+<BogArt>: oof
+\e(T@mcl_beds)You can't sleep, the bed's too far away!\eE
+\e(T@mcl_beds)You can't sleep, the bed's too far away!\eE
+\e(T@mcl_beds)You can't sleep, the bed's too far away!\eE
+\e(T@mcl_beds)You can't sleep, the bed's too far away!\eE
+\e(T@mcl_beds)You can't sleep, the bed's too far away!\eE
+\e(T@mcl_beds)You can't sleep, the bed's too far away!\eE
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+\e(T@mcl_beds)You can't sleep now, monsters are nearby!\eE
+\e(T@mcl_beds)You can't sleep now, monsters are nearby!\eE
+\e(T@mcl_beds)You can't sleep now, monsters are nearby!\eE
+\e(T@mcl_beds)You can't sleep now, monsters are nearby!\eE
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+\e(T@mcl_beds)You can't sleep now, monsters are nearby!\eE
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+\e(T@mcl_beds)You can't sleep now, monsters are nearby!\eE
+\e(T@mcl_beds)You can't sleep now, monsters are nearby!\eE
+\e(T@mcl_beds)You can't sleep now, monsters are nearby!\eE
+\e(T@mcl_beds)You can't sleep now, monsters are nearby!\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+\e(T@mcl_beds)New respawn position set! But you can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+# Server: version=5.2.0, uptime=32544.5, max_lag=0.315416, clients={Fleckenstein, BogArt}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+BogArt left the game.
+# Server: version=5.2.0, uptime=32741.6, max_lag=0.297201, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=32786.5, max_lag=0.269023, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+\e(T@mcl_playerplus)\eFFleckenstein\eE suffocated to death.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+# Server: version=5.2.0, uptime=33009.4, max_lag=0.173218, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+\e(T@mcl_beds)New respawn position set!\eE
+# Server: version=5.2.0, uptime=34540.7, max_lag=0.127858, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+Lenin joined the game.
+<Fleckenstein>: hi
+The administrator of this server is Server.
+<Lenin>: hi
+<Lenin>: what are you up to? :)
+<Fleckenstein>: i'm building a base
+<Lenin>: cool
+<Lenin>: i hope it's a bit from spawn :)
+<Lenin>: so griefer doesn't find it
+<Fleckenstein>: yes
+<Lenin>: nice
+<Lenin>: there used to a nice base made of glass near spawn, it is griefed now
+<Lenin>: (i did not do it btw)
+<Fleckenstein>: no one would dare to grief me...
+<Lenin>: :)
+<Fleckenstein>: as i am the hacker with the most op hacks ever seen on the server
+<Fleckenstein>: like fly, noclip, xray...
+<Lenin>: what have you got?
+<Lenin>: nice
+<Lenin>: made it yourself? or downloaded?
+<Fleckenstein>: myself
+<Fleckenstein>: in C++
+<Lenin>: cool
+<Lenin>: luckly minetest doesnt have many clients to download :)
+<Lenin>: its good for other servers
+<Fleckenstein>: yes
+<Lenin>: there is only one other player who has hacks that i know of here
+<Lenin>: but maybe there are more, but hiding it :)
+<Lenin>: still i think most people dont have hacks
+<Lenin>: maybe i should learn some C++ :)
+<Fleckenstein>: which OS do you use?
+<Lenin>: linux
+<Fleckenstein>: good :)
+<Lenin>: or GNU/linux as stallman would say :D
+<Fleckenstein>: :-)
+<Lenin>: this server has character :) the spawn looks unique
+<Fleckenstein>: are you the one that made the signs at spawn about the red army?
+<Lenin>: yes
+<Lenin>: i think one thousand blocks is enough to build a base
+dankmemer joined the game.
+\e(T@mcl_death_messages)\eFdankmemer\eE was killed by a zombie.\eE
+<dankmemer>: FUCK
+<dankmemer>: KOKELI KOKELI? ANYBODY OUT THERE?
+<dankmemer>: THROUGHT SOO
+dankmemer left the game.
+<Lenin>: was it hard to make hacks?
+<Fleckenstein>: not at all
+<Fleckenstein>: but it was hard to learn programming
+<Fleckenstein>: but once you're into it, hacks are easy
+<Lenin>: okey
+<Lenin>: 2000 blocks, now I only need to get a sheep :)
+<Lenin>: mobs spawn slow
+# Server: version=5.2.0, uptime=37006.7, max_lag=0.41255, clients={Fleckenstein, Lenin}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=37302.1, max_lag=0.223779, clients={Fleckenstein, Lenin}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+\e(T@mcl_death_messages)\eFLenin\eE was shot by an arrow from a skeleton.\eE
+<Lenin>: dammit
+<Lenin>: was just about to make a bed and build another base :|
+<Lenin>: see you later
+Lenin left the game.
+# Server: version=5.2.0, uptime=40.23, max_lag=0.0914289, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=314.73, max_lag=0.175907, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=344.25, max_lag=0.164737, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+\e(T@mcl_beds)You can't sleep, the bed's too far away!\eE
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+# Server: version=5.2.0, uptime=855.9, max_lag=0.144566, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=910.8, max_lag=0.179031, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=1485.54, max_lag=0.151584, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=1598.76, max_lag=0.904784, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=1662.84, max_lag=0.784998, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+BogArt joined the game.
+# Server: version=5.2.0, uptime=2387.25, max_lag=0.189159, clients={Fleckenstein, BogArt}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+\e(T@mcl_playerplus)\eFFleckenstein\eE suffocated to death.\eE
+# Server: version=5.2.0, uptime=2575.08, max_lag=0.429897, clients={Fleckenstein, BogArt}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=2677.59, max_lag=0.346714, clients={Fleckenstein, BogArt}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+<BogArt>: I found Nether ceiling
+<Fleckenstein>: nice
+# Server: version=5.2.0, uptime=2762.1, max_lag=0.415233, clients={Fleckenstein, BogArt}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+<Fleckenstein>: do you have hacks?
+<BogArt>: No
+<BogArt>: I just mined stairs up
+<Fleckenstein>: i just wanted to know
+<BogArt>: Yeah
+<Fleckenstein>: i have got fly, noclip and xray
+<BogArt>: Cool
+<BogArt>: What is noclip?
+<Fleckenstein>: glitch through blocks
+<BogArt>: Oh cool
+<BogArt>: Can u get on the nether roof?
+<Fleckenstein>: but i get damage when i do it
+<BogArt>: Well u would just go to the end right?
+<Fleckenstein>: no
+<Fleckenstein>: it's too far
+<BogArt>: The End is under the Overworld and End is under that I think
+<Fleckenstein>: i think end is over
+<BogArt>: You could go through one layer of bedrock right?
+<Fleckenstein>: yes
+<BogArt>: You could do it
+<BogArt>: I wish I could find a glitch to break through bedrock
+<BogArt>: Maybe a piston glitch
+<BogArt>: Do u know if pistons work in Mineclone?
+<Fleckenstein>: yes they do
+<BogArt>: Cool
+<BogArt>: I might try something with that
+<Fleckenstein>: on wich OS are you?
+<BogArt>: Linux ofc
+<BogArt>: *of course
+<Fleckenstein>: well do you know how to complie minetest?
+<BogArt>: No
+<BogArt>: I'm kind of a noob
+<BogArt>: I don't know mods yet
+<Fleckenstein>: its ok most people dont know that
+<Fleckenstein>: i can teach you how to hack
+<BogArt>: I can't find .minetest in homefolder
+rhsant joined the game.
+<Fleckenstein>: rightclick -> show hidden files
+<rhsant>: \xray
+rhsant left the game.
+<BogArt>: I almost fell
+<Fleckenstein>: one moment, i have to enable my xray
+# Server: version=5.2.0, uptime=4057.02, max_lag=0.256779, clients={Foxy03, Fleckenstein, BogArt}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Foxy03 joined the game.
+<BogArt>: No such file or directory, wtf?
+<Foxy03>: ls
+<Fleckenstein>: \e(c@#55ff55)Foxy03\e(c@#ffffff) is my secon account
+<Fleckenstein>: do ls -a
+<BogArt>: Just -a?
+<Foxy03>: ls -a
+<BogArt>: remember I'm a noob
+<Foxy03>: it's ok i deal with noobs every day
+<BogArt>: command not found
+<Foxy03>: ls (SPACE) -a
+<Foxy03>: put a space instead of (SPACE)
+<BogArt>: I know I did that
+<Foxy03>: hm
+<Foxy03>: so it sais ls command not found???
+<Foxy03>: ls is installed on litterally EVERY linux
+<BogArt>: Yeah
+<Foxy03>: try just typeing ls
+<Foxy03>: it starts with a L, not a I
+<BogArt>: Oh thx
+<BogArt>: I was doing I
+<BogArt>: there is no .minetest file
+<Fleckenstein>: when you invoke ls -a
+# Server: version=5.2.0, uptime=3347.91, max_lag=0.260576, clients={Fleckenstein, BogArt}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+<BogArt>: Darn underground bases are usless against xray
+<Fleckenstein>: but not many people have xray
+<BogArt>: Some do though
+<BogArt>: I just hope I dont get greifed
+<Fleckenstein>: but i dont grief friends
+<BogArt>: Cool
+<Fleckenstein>: oh man i'm lost in the nether
+<BogArt>: Yay I got so much from the Nether
+<BogArt>: Do u use coords?
+<Fleckenstein>: yes
+<Fleckenstein>: but i alway forget to remember them
+<BogArt>: Yeah the Nether is easy to get lost in
+<BogArt>: even with coords
+<Fleckenstein>: i'm a terrible gamer
+<BogArt>: Im not the best either
+<BogArt>: I go in my homefolder and press ctrl H and I can't find the .minetest folder
+<BogArt>: That's where you put mods in right?
+<Fleckenstein>: do rightclick and then show hidden files
+<BogArt>: Yes that works too but still no .minetest folder
+<Fleckenstein>: hm
+<Fleckenstein>: do you know how to use terminal?
+<BogArt>: Not really
+<BogArt>: I just do copy/paste
+<Fleckenstein>: which desktop do you use? like gnome, kde, xfce ...
+<BogArt>: Linux Mint cinnimon
+<Fleckenstein>: then open terminal, type: cd .minetest and then nemo
+Foxy03 joined the game.
+<BogArt>: No such file or directory, wtf?
+<Foxy03>: ls
+<Fleckenstein>: Foxy03 is my secon account
+<Fleckenstein>: do ls -a
+<BogArt>: Just -a?
+<Foxy03>: ls -a
+<BogArt>: remember I'm a noob
+<Foxy03>: it's ok i deal with noobs every day
+<BogArt>: command not found
+<Foxy03>: ls (SPACE) -a
+<Foxy03>: put a space instead of (SPACE)
+<BogArt>: I know I did that
+<Foxy03>: hm
+<Foxy03>: so it sais ls command not found???
+<Foxy03>: ls is installed on litterally EVERY linux
+<BogArt>: Yeah
+<Foxy03>: try just typeing ls
+<Foxy03>: it starts with a L, not a I
+<BogArt>: Oh thx
+<BogArt>: I was doing I
+<BogArt>: there is no .minetest file
+<Fleckenstein>: when you invoke ls -a
+Foxy03 left the game.
+<BogArt>: I have Minetest isntalled from the software manager (flatpack
+<Fleckenstein>: oh
+Foxy03 joined the game.
+<BogArt>: Yeah,Yeah, I dont see it in the terminal
+<Foxy03>: well that explains it
+<BogArt>: Thank goodnes
+<BogArt>: I thought that might be it
+<Foxy03>: but i dont know about flatpack
+<BogArt>: Maybe I will install it a different way
+\e(T@mcl_death_messages)\eFFoxy03\eE was killed by a magma cube.\eE
+<BogArt>: I dont know about flatpack either
+# Server: version=5.2.0, uptime=4429.44, max_lag=0.351603, clients={Foxy03, Fleckenstein, BogArt}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Foxy03 joined the game.
+<BogArt>: Yeah,Yeah, I dont see it in the terminal
+<Foxy03>: well that explains it
+<BogArt>: Thank goodnes
+<BogArt>: I thought that might be it
+<Foxy03>: but i dont know about flatpack
+<BogArt>: Maybe I will install it a different way
+\e(T@mcl_death_messages)\eFFoxy03\eE was killed by a magma cube.\eE
+<BogArt>: I dont know about flatpack either
+Fleckenstein left the game.
+<BogArt>: I almost died I had one heart lol
+<Foxy03>: i died
+<Foxy03>: i'll do some research about flatpack
+<BogArt>: How do u have it installed?
+<BogArt>: I know how to do .deb and appimages
+# Server: version=5.2.0, uptime=51038.1, max_lag=0.175485, clients={Foxy03}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Foxy03 joined the game.
+# Server: version=5.2.0, uptime=51459.8, max_lag=0.257088, clients={Fleckenstein, Foxy03}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=51247.2, max_lag=0.178458, clients={Foxy03}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Foxy03 joined the game.
+Fleckenstein joined the game.
+Fleckenstein left the game.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=51596.7, max_lag=0.25094, clients={Fleckenstein, Foxy03}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+Foxy03 left the game.
+mrFrieg joined the game.
+mrFrieg left the game.
+# Server: version=5.2.0, uptime=51697.5, max_lag=0.200977, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=51991.7, max_lag=0.163391, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+Disabled background music for you. Use /volume to enable it again.
+# Server: version=5.2.0, uptime=53410.1, max_lag=0.175696, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=53455.3, max_lag=0.175907, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=55773.5, max_lag=0.235677, clients={Foxy03, Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Foxy03 joined the game.
+shantaram joined the game.
+shantaram left the game.
+# Server: version=5.2.0, uptime=55493.7, max_lag=0.17517, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+Foxy03 joined the game.
+shantaram joined the game.
+shantaram left the game.
+Foxy03 left the game.
+Foxy03 joined the game.
+# Server: version=5.2.0, uptime=56045.3, max_lag=0.446639, clients={Foxy03, Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Foxy03 joined the game.
+Fleckenstein left the game.
+Fleckenstein joined the game.
+Fleckenstein left the game.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=56150, max_lag=0.35401, clients={Fleckenstein, Foxy03}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+Foxy03 left the game.
+\e(T@mcl_death_messages)\eFFleckenstein\eE was killed by a zombie.\eE
+# Server: version=5.2.0, uptime=56500.8, max_lag=0.206148, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=56556.2, max_lag=0.182287, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=56609.7, max_lag=0.171976, clients={Foxy03}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Foxy03 joined the game.
+\e(T@mcl_beds)You can't sleep, the bed's too far away!\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+# Server: version=5.2.0, uptime=56901.3, max_lag=0.111845, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+# Server: version=5.2.0, uptime=57130.7, max_lag=0.175836, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=58051.9, max_lag=0.175731, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=58084.7, max_lag=0.174156, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=59101.7, max_lag=0.177391, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=56128.5, max_lag=0.371345, clients={Fleckenstein, Foxy03}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=60240.6, max_lag=0.293861, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=60266.1, max_lag=0.277689, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=60346.7, max_lag=0.232173, clients={Foxy02}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Foxy02 joined the game.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=60720.3, max_lag=0.173982, clients={Fleckenstein, Foxy02}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+Foxy02 left the game.
+# Server: version=5.2.0, uptime=61048, max_lag=0.175696, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+# Server: version=5.2.0, uptime=64037.6, max_lag=0.175836, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=64127.9, max_lag=0.175766, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+\e(T@mcl_beds)You can't sleep, the bed's too far away!\eE
+\e(T@mcl_beds)You can't sleep now, monsters are nearby!\eE
+\e(T@mcl_beds)You can't sleep now, monsters are nearby!\eE
+\e(T@mcl_beds)You can't sleep now, monsters are nearby!\eE
+\e(T@mcl_beds)You can't sleep now, monsters are nearby!\eE
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+# Server: version=5.2.0, uptime=64608.2, max_lag=0.676151, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+mrFrieg joined the game.
+<mrFrieg>: hello
+<Fleckenstein>: hi
+<mrFrieg>: you new?
+<Fleckenstein>: kinda
+<mrFrieg>: welcome :D
+<Fleckenstein>: but i have dia armor
+<Fleckenstein>: and a base
+<mrFrieg>: nice :) a quick one
+<mrFrieg>: you use xray?
+<Fleckenstein>: yes
+<Fleckenstein>: and fly+noclip
+<mrFrieg>: nice
+<mrFrieg>: me too
+<Fleckenstein>: uh
+<mrFrieg>: was it you who found my hidden treasures? :)
+<Fleckenstein>: your hidden treasures?
+<mrFrieg>: one chest filled with end stone :D
+<Fleckenstein>: no i did not find that
+<mrFrieg>: someone found them, had to use xray :)
+<mrFrieg>: I knew they would be found eventually :)
+<mrFrieg>: I mined 2 chests of end stone before end portal was closed :D
+<mrFrieg>: put one behind wall in my old griefed house, and the other in my end chest :)
+DerLombiiie joined the game.
+<DerLombiiie>: hi
+<mrFrieg>: hi
+<Fleckenstein>: DerLombiiie is my friend
+<Fleckenstein>: you wanna see my base
+<DerLombiiie>: yeds
+<mrFrieg>: cool
+<Fleckenstein>: can u give me the coords of the ender portal? i just lost my last ender eye
+<mrFrieg>: There used to be an end portal in spawn, before they generated naturally
+\e(T@mcl_death_messages)\eFDerLombiiie\eE was killed by an enderman.\eE
+<mrFrieg>: I've also griefed a bunch of end portals :) but if you get lucky it is working
+<mrFrieg>: I've also lost the coords
+<Fleckenstein>: Wanna make a faction?
+<DerLombiiie>: jes
+<DerLombiiie>: *yes
+<mrFrieg>: not sure
+<Fleckenstein>: did you code your hacks yourself?
+<Fleckenstein>: i didw
+<mrFrieg>: yeah
+<Fleckenstein>: so how did you the fly thing? i edited Client::checkLocalPrivilege
+<DerLombiiie>: can i have your cords flec?
+<Fleckenstein>: yea on e sec
+<Fleckenstein>: oh i found a nice base
+<mrFrieg>: wjp os ot
+<mrFrieg>: who is it?
+<Fleckenstein>: idk
+<mrFrieg>: is it a hole in the ground?
+<mrFrieg>: with trapdoor?
+<Fleckenstein>: yes
+<Fleckenstein>: yours?
+<mrFrieg>: no
+<mrFrieg>: found it
+<mrFrieg>: You should turn around, I've griefed that end portal :p I won't work, if that is what you are looking for
+<mrFrieg>: it*
+<Fleckenstein>: how can an end portal be griefed?
+<mrFrieg>: I've found a trick :)
+<Fleckenstein>: i guess your hacks are even better than mine
+<Fleckenstein>: i have xray, fullbright, fly/fast/noclip and no fall damage
+<DerLombiiie>: #report \e(c@#55ff55)Fleckenstein\e(c@#ffffff)
+<DerLombiiie>: xD
+<Fleckenstein>: but i get damage when i use noclip
+<Fleckenstein>: This is an anarchy server DerLombiiie
+<Fleckenstein>: wait
+<Fleckenstein>: the client can send block to the server
+<Fleckenstein>: so i could basically send the server any blocks
+<Fleckenstein>: **nodes i mean
+<Fleckenstein>: thats how to remove unbreakable nodes
+<Fleckenstein>: now i just have to implement it
+<mrFrieg>: I don't want to reveal the trick :) Don't want it to get patched, so I can't say yes or no
+<Fleckenstein>: yea i want to do it myself
+<Fleckenstein>: dont tell me the trick
+<Fleckenstein>: do u know the base with the jungle tree pillars?
+<mrFrieg>: yeah
+<mrFrieg>: have no idea who it is
+<mrFrieg>: was there before I joined the server
+<Fleckenstein>: LOL
+<Fleckenstein>: ungriefed base
+<Fleckenstein>: 300 blocks from spawn
+<Fleckenstein>: on the surface
+<mrFrieg>: yeah lol
+<mrFrieg>: never thought of it that way
+<mrFrieg>: I don't grief, unless I don't like the person
+<Fleckenstein>: oh
+<Fleckenstein>: now i found a chest with end stuff
+<Fleckenstein>: probably yours
+<mrFrieg>: how much?
+<Fleckenstein>: 5 stacks end stone , 4 stacks chorus fruiut
+<mrFrieg>: Because that person played before me he got some stuff from end
+<mrFrieg>: very rare
+<mrFrieg>: my chest had 1728 end stone though :p
+<Fleckenstein>: can i take it?
+<mrFrieg>: it is not mine
+<mrFrieg>: take it
+To DerLombiiie: -100 -400
+<Fleckenstein>: is 500 block from spawn enough for base?
+<mrFrieg>: I personally think so if you build underground
+<mrFrieg>: atleast for now
+<mrFrieg>: there are not many players here
+<Fleckenstein>: but there are people with xray
+<Fleckenstein>: at least me, you and another player
+<mrFrieg>: yeah, but if you build like at bedrock layer those won't show unless you dig down
+<mrFrieg>: as chunks are cubes
+<Fleckenstein>: right
+<Fleckenstein>: can you teach me how to use keybindings?
+<mrFrieg>: keybindings?
+<Fleckenstein>: like press x to activate xray
+<mrFrieg>: I don't have that
+<Fleckenstein>: i alway have to disconnect to switch it on/off
+<mrFrieg>: i have chat commands, like .xr to activate x-ray
+<mrFrieg>: so I added code where chat command is sent to check if it starts with dot and switch global variables to toggle stuff
+\e(T@mcl_death_messages)\eFDerLombiiie\eE was shot by an arrow from a skeleton.\eE
+<Fleckenstein>: do you use lua or c++ ?
+<mrFrieg>: c++
+<Fleckenstein>: me too
+<Fleckenstein>: i think lua can not be used for cheats
+<mrFrieg>: I havent tried :)
+<mrFrieg>: but that is probably true
+To DerLombiiie: 0 -470
+DerLombiiie left the game.
+# Server: version=5.2.0, uptime=67176.9, max_lag=0.223981, clients={Fleckenstein, mrFrieg}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+\e(T@mcl_beds)You can't sleep, the bed's too far away!\eE
+\e(T@mcl_beds)New respawn position set!\eE
+<Fleckenstein>: bed?
+<mrFrieg>: I can leave if you want
+<mrFrieg>: and rejoin
+<Fleckenstein>: you dont have to
+DerLombiiie joined the game.
+\e(T@mcl_death_messages)\eFDerLombiiie\eE was killed by \eFFleckenstein\eE.\eE
+test joined the game.
+test left the game.
+repu joined the game.
+<mrFrieg>: hi repu
+<repu>: hi
+<repu>: what's up?
+<mrFrieg>: cutting trees
+<repu>: nice
+<mrFrieg>: what you up to?
+<repu>: walking to world border
+<mrFrieg>: cool
+<mrFrieg>: following the roads?
+<repu>: well road ended
+<repu>: so on my own
+<mrFrieg>: lol
+<mrFrieg>: dankmemer said he built to world border x)
+<repu>: hmm
+<repu>: i saw some other player put up
+<repu>: signs
+<mrFrieg>: on road?
+<repu>: ye
+\e(T@mcl_beds)You can't sleep, the bed's too far away!\eE
+<mrFrieg>: oak wood is the best wood
+<DerLombiiie>: no dark oak best
+<repu>: yep
+<mrFrieg>: why would dark oak be better?
+<mrFrieg>: oak wood is perfect
+<DerLombiiie>: looks nicer
+<mrFrieg>: hmm
+<mrFrieg>: haven't seen it actually
+<repu>: wtf server is lagging
+<mrFrieg>: someone lavacast?
+<DerLombiiie>: ???
+<repu>: idk
+<repu>: holy fuk 2 poisonous spiders spawners
+<repu>: *sweats*
+<mrFrieg>: lol
+<repu>: also is anticheat disabled still?
+<mrFrieg>: there is no anti-cheat
+<Fleckenstein>: there is
+<mrFrieg>: except for the movement restrictionk so you can't just teleport everywhere
+<Fleckenstein>: yea
+<mrFrieg>: or fly around at 1000x
+<mrFrieg>: there was real anti-cheat a couple of weeks ago but it crashed server reguarly, and gave falso positive sometimes
+<mrFrieg>: so might come back some day when it works better
+<repu>: lol yeah i ask about that one
+<repu>: i can't wait for next mineclone release
+<mrFrieg>: why?
+<mrFrieg>: something special coming?
+<repu>: lava casting might be fixed so that i can make big castle
+<repu>: i filed an issue
+<Fleckenstein>: maybe they finally make enchanting possible
+<repu>: i'm tired of just
+<repu>: piramids that aren't hollow on inside
+<mrFrieg>: real lavacast gives hollow structres?
+<repu>: yes
+<mrFrieg>: cpp;
+<mrFrieg>: cool*
+<mrFrieg>: I thought they were solid, but it makes sense now when I think about it
+<mrFrieg>: but that is confirmed to change?
+<mrFrieg>: in mineclone?
+# Server: version=5.2.0, uptime=69462, max_lag=0.855707, clients={Fleckenstein, mrFrieg, DerLombiiie, repu}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+\e(T@mcl_death_messages)\eFrepu\eE was shot by an arrow from a skeleton.\eE
+<repu>: oh fuck me
+<repu>: well rip items
+<mrFrieg>: skeletons have aimbots
+<repu>: i know i wanted to loot chest from spawner
+<repu>: some skeletons somehow killed themselves when shot into wall
+<repu>: but i assume the issue of them shooting through walls wasn't completely fixed
+<repu>: maybe i should do another cast
+<mrFrieg>: maybe
+<mrFrieg>: can't have enough :)
+<repu>: i saw spawn looks quite close to early 2b2t tbh
+<mrFrieg>: dark oak rare?
+<repu>: nop
+<mrFrieg>: haven't found any
+<repu>: it's like beeg trees
+<mrFrieg>: I think papa had a tree though
+<repu>: wisei mena
+<repu>: wide
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+<mrFrieg>: what is the ugliest wood? :)
+<Fleckenstein>: spruce
+<mrFrieg>: I think I agree
+DerLombiiie left the game.
+<Fleckenstein>: does anyone know how to complie minetest under windows?
+<mrFrieg>: no
+<repu>: there are instructions
+<repu>: on the main website
+<Fleckenstein>: because DerLombiiie wants to use my hackcclient
+<Fleckenstein>: bb
+# Server: version=5.2.0, uptime=72332.6, max_lag=0.109323, clients={Fleckenstein, repu}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+<Fleckenstein>: do you have an end portal?
+<Fleckenstein>: i need shulker boxes
+<Fleckenstein>: i found a portal but it was destroyed
+<repu>: mrFrieg destroyed all end portals
+<Fleckenstein>: why?
+<repu>: well because
+<Fleckenstein>: i'll ask him
+<repu>: they have now all the endstone and shulker boxes on server
+<Fleckenstein>: ok
+<Fleckenstein>: i'll try to fly to end
+<repu>: i think there might be other way to get there
+<repu>: but for now i haven't found it
+<Fleckenstein>: let's try to find it together
+<repu>: if you have any idea then you cn share
+<Fleckenstein>: he ultimate thing would a teleport exploit, but i dont think that will happen
+<Fleckenstein>: i forget the be
+<Fleckenstein>: the thing would BE a teleport exploit
+<Fleckenstein>: to be or no to be that is the question
+<repu>: if you find it
+<Fleckenstein>: how many natural portals existst(ed) ?
+<Fleckenstein>: that is important for the idea i have
+<repu>: idk
+<Fleckenstein>: i think its 3 in Minecraft
+<repu>: it was far more here
+<Fleckenstein>: the question is now wether mrFrieg has griefed all of them
+<repu>: well map should be ~30kx30k
+<Fleckenstein>: 31k
+<repu>: i think i've seen him grief at least 7 or so
+<Fleckenstein>: can you give me coords of a griefed one?
+<Fleckenstein>: i'd like to have a look at it
+<Fleckenstein>: i used ender eye but i did not find where the portal used to be
+<repu>: look
+<repu>: i am not hacking
+<repu>: i have no idea where they are
+<Fleckenstein>: u want a client?
+<repu>: no
+<Fleckenstein>: i did mine on my own
+<repu>: i will consider making one myself when this server becomes hardcore pvp
+<repu>: for now i don't see a reason
+<repu>: so yeah
+<Fleckenstein>: there should be a portal around x=-1014 z=-331
+<repu>: your best shot is starting to find them from each corner of map by throwing eyes
+<Fleckenstein>: i'll try to restore one
+<Fleckenstein>: by sending faked nodes to the server
+<Fleckenstein>: but idk if that will work i think not
+<repu>: you might give it a shot
+<repu>: but don't tell mrFrieg
+<repu>: because obviously it will get destroyed again
+<Fleckenstein>: thats a big problem of mine
+<Fleckenstein>: i trust anyone
+<repu>: just don't mention it
+<repu>: forget about it fter you get all the shulkers that you might need
+<Fleckenstein>: my idea is: when the connection times out, you can still build, so building may be managed by client
+<Fleckenstein>: if so, i can do anything
+<Fleckenstein>: also like place a diablock
+<repu>: hmm
+<repu>: it may be worth a try
+<repu>: there is also an idea
+<repu>: i think end is below real world so it is possible to get there by throwing glitching ender pearl into bedrock
+<repu>: but there are two problems
+<Fleckenstein>: that is not my problem
+<Fleckenstein>: i have noclip
+<repu>: 1st is there is damage area that doesn't allow moving between
+<repu>: dimensions
+<repu>: 2nd need to land somehow
+<repu>: and survive
+<Fleckenstein>: that is not my problem either i have fly
+<repu>: i tried doing it but i can't survive the fll through damage area
+<Fleckenstein>: i you use noclip you get damage, but glitching through a bedrock layer is not a problem
+<repu>: well glitching through bedrock is not problem for me either and landing too slimeblock can be used if placed fast enough
+<Fleckenstein>: and i think end is up
+<Fleckenstein>: over the overworld
+<Fleckenstein>: gonna test that out
+<repu>: can you try flying there?
+<Fleckenstein>: it takes too long
+<repu>: i think there is damage area too
+<Fleckenstein>: but i will maybe make a afk redstone machine that does it
+<Fleckenstein>: damage area = no problem
+<repu>: try going under overw# Server: version=5.2.0-GalwayGirl, uptime=2.365, max_lag=2.01318, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+Available commands: ? admin auth_reload awards ban banlist clear clearinv clearobjects clearpassword days deleteblocks emergeblocks fixlight grant grantme haspriv help helpform kick kill last-login lightning list listbiomes me mods msg pardon privs pulverize remove_player revoke seed set setpassword setskin shutdown spawnstruct status stop tell time unban w who
+Use '/help <cmd>' to get more information, or '/help all' to list everything.
+\e(T@mcl_structures)Error: No structure type given. Please use “/spawnstruct <type>”.\eE
+\e(T@mcl_structures)Use /help spawnstruct to see a list of avaiable types.\eE
+\e(c@#00ffff)/spawnstruct\e(c@#ffffff) desert_temple | desert_well | igloo | village | witch_hut | boulder | ice_spike_small | ice_spike_large | fossil | end_exit_portal | end_portal_shrine: \e(T@mcl_structures)Generate a pre-defined structure near your position.\eE
+\e(T@mcl_structures)Structure placed.\eE
+# Server: version=5.2.0-GalwayGirl, uptime=2.304, max_lag=1.9972, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=6.989, max_lag=1.93739, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0-GalwayGirl, uptime=0.379, max_lag=0.200759, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+orld
+<repu>: it's faster to confirm
+<Fleckenstein>: no i'll try it out in a singleplayer world
+<repu>: okay hope it works out
+<Fleckenstein>: end is under the overworld
+<Fleckenstein>: 100, 27000, 0
+<repu>: yep as i've told
+<Fleckenstein>: in minecraft the dimensions have numbers, nether is -1, overworld 0 and end 1, so i thought end might be over the overworld
+<repu>: well mineclone is quite different (for now)
+<repu>: i think dimensions might get revorked soon
+<repu>: reworked
+<Fleckenstein>: they could make it so that in the end there is actually an enderdragon
+<Fleckenstein>: bwt can wither be spawned?
+<Fleckenstein>: **btw
+<repu>: not yet
+<Fleckenstein>: but why?
+<repu>: if it could i would farm wither skeletons by now and spawn wouldn't looks so peacefull
+<Fleckenstein>: the enderdragon works, the wither works, but they can not be used!
+<repu>: wait thre is ender dragon?
+<repu>: wtf
+<Fleckenstein>: yes, but there is no ender dragon in end
+<repu>: i swear to god i cou;dn't spawn wither in singleplayer
+<repu>: when did it change
+<Fleckenstein>: you can spawn wither and enderdragon in creative mode
+<repu>: is is like mod from git?
+<repu>: or from the content menu
+<Fleckenstein>: idk
+<Fleckenstein>: i think i used contentdb
+<repu>: hol up a sec
+repu left the game.
+repu joined the game.
+<repu>: i don't see it
+<repu>: only wither skeleton and enderman
+<repu>: no rel wither or ender dragon
+<repu>: *real
+<Fleckenstein>: idk
+<Fleckenstein>: mineclone2?
+<Fleckenstein>: do you have jukebox discs?
+<repu>: yes mineclone2
+<repu>: no i don't
+<repu>: i got one from mine but died and it despawned
+<repu>: what about it?
+<Fleckenstein>: i have "The Evil Sister" 3 times and "Minetest" 2 times
+<Fleckenstein>: i was hoping that you could trade
+\e(T@mcl_beds)You can't sleep, the bed's too far away!\eE
+\e(T@mcl_beds)You can't sleep, the bed's too far away!\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+-!- Invalid command: sethome
+<Fleckenstein>: i'll try the expoit now
+<Fleckenstein>: bb
+# Server: version=5.2.0-GalwayGirl, uptime=0.245, max_lag=0.0998002, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.251, max_lag=0.0998002, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.233, max_lag=0.0998201, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.265, max_lag=0.0998002, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.263, max_lag=0.0998002, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.249, max_lag=0.0998002, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.26, max_lag=0.195843, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[OWNER]\e(c@#ffffff)Fleckenstein has joined the Server.
+Invalid Rank.
+Invalid Rank.
+# Server: version=5.2.0-GalwayGirl, uptime=0.227, max_lag=0.16187, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[OWNER]\e(c@#ffffff)Fleckenstein has joined the Server.
+# Server: version=5.2.0-GalwayGirl, uptime=0.692, max_lag=0.531256, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+\e(c@#FF2D8D)[OWNER]\e(c@#ffffff)Fleckenstein has joined the Server.
+# Server: version=5.2.0, uptime=80800.3, max_lag=0.09, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+Privileges of Fleckenstein: interact, shout
+Privileges of Server: server, shout, fly, password, vanish, bring, kick, maphack, announce, protection_bypass, teleport, basic_privs, rollback, noclip, ignore_override, weather_manager, privs, fast, mpd, help_reveal, give, debug, ban, settime, interact
+You don't have permission to run this command (missing privileges: kick)
+mrFrieg joined the game.
+<Fleckenstein>: i can dig unbreakable nodes now!
+<Fleckenstein>: like you
+<Fleckenstein>: it's like creative!
+<Fleckenstein>: execpt the anticheat gets you when you interact too fast
+<mrFrieg>: nice :)
+<mrFrieg>: good job!
+<Fleckenstein>: hm, but i still need pick for cobble
+<Fleckenstein>: i think i'm not fully done yet
+# Server: version=5.2.0, uptime=81330.8, max_lag=0.222517, clients={Fleckenstein, mrFrieg}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=81571.2, max_lag=0.166892, clients={Fleckenstein, mrFrieg}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=81669.2, max_lag=0.175626, clients={Fleckenstein, mrFrieg}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=81698.5, max_lag=0.168705, clients={Fleckenstein, mrFrieg}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=81738.5, max_lag=0.175836, clients={Fleckenstein, mrFrieg}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=81882.1, max_lag=0.161474, clients={Fleckenstein, mrFrieg}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=81944.7, max_lag=0.173913, clients={Fleckenstein, mrFrieg}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=81995.5, max_lag=0.326782, clients={Fleckenstein, mrFrieg}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+<Fleckenstein>: hm
+<Fleckenstein>: i guess it doesn't work yet
+<Fleckenstein>: i can instant dig most materials
+<mrFrieg>: I think I can say that the way you attempt to do it is not how I did it
+<mrFrieg>: from what I've heard
+<Fleckenstein>: i still need pick for cracky and i cant dig obsidian or bedrock
+<mrFrieg>: that was also one of the first things I tried
+<mrFrieg>: changing the dig time for the nodes
+<Fleckenstein>: i also changed dig_instantly
+<Fleckenstein>: i'll try Client::removeNode
+<Fleckenstein>: there is no way to avoid anticheat moved_too_fast yet, right?w
+<mrFrieg>: nope
+<mrFrieg>: or not that I know of
+<Fleckenstein>: can you place nodes?
+<Fleckenstein>: i mean cheated
+<Fleckenstein>: like place a diablock?
+<mrFrieg>: I would be suprised if that is possible
+<Fleckenstein>: well, if you can remove nodes
+<mrFrieg>: because the node place is dependent on the item you use it with
+<Fleckenstein>: ok
+<Fleckenstein>: is there an dupe glitch yet?
+<mrFrieg>: not that I know of
+<mrFrieg>: it is what the server needs :)
+<Fleckenstein>: yea
+<Fleckenstein>: i disabled Client::sendDamage, this way i dont get fall damage
+<Fleckenstein>: do u have that one, too?
+<mrFrieg>: yes
+<Fleckenstein>: nice
+<mrFrieg>: that is just so stupid, that the server completely  trust client to report fall damage
+<Fleckenstein>: but fall damage is not really a problem when you have fly
+<Fleckenstein>: but it's nice to have
+<mrFrieg>: yeah
+<mrFrieg>: I once did the mistake of logging out in air with my hacked client and logging on with unhacked client and dying from fall dmg :)
+<Fleckenstein>: let me quickly check something out
+# Server: version=5.2.0, uptime=83078, max_lag=0.165368, clients={Fleckenstein, mrFrieg}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+<Fleckenstein>: i edited Client::getHP
+# Server: version=5.2.0, uptime=83143.8, max_lag=0.17545, clients={Foxy02, mrFrieg}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Foxy02 joined the game.
+<Foxy02>: i'm Fleckenstein
+<mrFrieg>: ok :)
+\e(T@mcl_playerplus)\eFFoxy02\eE suffocated to death.\eE
+<Foxy02>: hm no, did not work
+<Foxy02>: but why can i chat while dead??
+# Server: version=5.2.0, uptime=83267.6, max_lag=0.174331, clients={Fleckenstein, mrFrieg}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+<Fleckenstein>: well that was interesting
+<mrFrieg>: you can make it so you never die, they you will become a ghost
+<mrFrieg>: you can walk around but not interact
+<Fleckenstein>: thats what i did
+<Fleckenstein>: but i didn't think i can chat
+<Fleckenstein>: btw the ghost mode is the only part of my client that is lua
+<mrFrieg>: I got "but why can i chat while dead??" and "hm no, did not work"
+<Fleckenstein>: yes
+<Fleckenstein>: Foxy02 is me
+<Fleckenstein>: can you tell me in which file to do the thing with the . commands? Since this has not really something to do with hacking.
+# Server: version=5.2.0, uptime=83833.6, max_lag=0.212554, clients={Fleckenstein, mrFrieg}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Music volume set to 1. Change will take effect when the next song starts.
+<Fleckenstein>: is it just chat.cpp ?
+<mrFrieg>: what?
+<Fleckenstein>: in which file did you add your commands?
+<mrFrieg>: client/client.cpp I think
+<Fleckenstein>: ok thanks
+<mrFrieg>: there should be somewhere there where chat commands are handled, i put it there and it worked
+<Fleckenstein>: ok thanks
+<mrFrieg>: the xray does not work very well though (for me) as it will not affect the chunks which already have their meshes computed
+<mrFrieg>: so you need to punch already loaded chunks for xray to start on them
+<mrFrieg>: but I think that can be solved in some way
+<Fleckenstein>: my xray is in ContentFeatures::updateTextures
+<mrFrieg>: interesting
+<mrFrieg>: I think that is a better way to do it
+<Fleckenstein>: if one of the tiles is g_settings->getBool("xray_texture"), the drawtype will be set to NDT_AIRLIKE
+<mrFrieg>: aha
+<mrFrieg>: I swapped stone with glass in the mesher :)
+<Fleckenstein>: :)
+<Fleckenstein>: why not swap stone and "ignore"
+<Fleckenstein>: because ignore is like air
+<mrFrieg>: didn't think much of tbh
+<mrFrieg>: I think it is nice to see the outlines of nodes like glass though
+<Fleckenstein>: yes, you are right
+<Fleckenstein>: i will change that
+<Fleckenstein>: i currently have to activate fullbright for xray to work
+<mrFrieg>: me too
+\e(T@mcl_beds)You can't sleep, the bed's too far away!\eE
+n40 joined the game.
+<Fleckenstein>: recomplie, bb
+# Server: version=5.2.0-GalwayGirl, uptime=0.234, max_lag=0.0998201, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+<Fleckenstein> test
+<Fleckenstein> test
+<Fleckenstein> testt
+<Fleckenstein> testt
+<Fleckenstein> testt
+<Fleckenstein> testt
+<Fleckenstein> testt
+<Fleckenstein> testt
+<Fleckenstein> testtt
+<Fleckenstein> testtt
+<Fleckenstein> testtt
+<Fleckenstein> testtt
+<Fleckenstein> testtt
+<Fleckenstein> testtt
+<Fleckenstein> testtt
+<Fleckenstein> testtt
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+<Fleckenstein> testtt
+<Fleckenstein> testtt
+<Fleckenstein> testttt
+<Fleckenstein> testttt
+<Fleckenstein> testttt
+<Fleckenstein> testttt
+<Fleckenstein> testttt
+<Fleckenstein> testttt
+<Fleckenstein> testttt
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+<Fleckenstein> testttt
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+<Fleckenstein> testttt
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+<Fleckenstein> testttt
+# Server: version=5.2.0-GalwayGirl, uptime=0.251, max_lag=0.0998002, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+<Fleckenstein> .xray
+<Fleckenstein> test
+<Fleckenstein> test
+<Fleckenstein> test
+<Fleckenstein> test
+<Fleckenstein> test
+<Fleckenstein> test
+<Fleckenstein> test
+<Fleckenstein> test
+<Fleckenstein> test
+<Fleckenstein> test
+<Fleckenstein> test
+<Fleckenstein> test
+<Fleckenstein> test
+<Fleckenstein> test
+<Fleckenstein> test
+<Fleckenstein> test
+<Fleckenstein> test
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+<Fleckenstein> .xray
+<Fleckenstein> .xray
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+<Fleckenstein> .xray
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+<Fleckenstein> .xray
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+<Fleckenstein> .xray
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+<Fleckenstein> .xrayt
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+<Fleckenstein> .xrayt
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+<Fleckenstein> .xrayt
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+<Fleckenstein> .xraytt
+<Fleckenstein> .xraytt
+<Fleckenstein> .xraytt
+<Fleckenstein> .xraytt
+<Fleckenstein> .xraytt
+<Fleckenstein> .xraytt
+<Fleckenstein> .xrayt
+<Fleckenstein> .xraytt
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+<Fleckenstein> .xraytt
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+<Fleckenstein> .xraytt
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+<Fleckenstein> .xraytt
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+<Fleckenstein> .xraytt
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+<Fleckenstein> .xraytt
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+<Fleckenstein> .xraytt
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+<Fleckenstein> .xraytt
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+You cannot send more messages. You are limited to 8 messages per 10 seconds.
+# Server: version=5.2.0-GalwayGirl, uptime=0.249, max_lag=0.0998201, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0, uptime=85917.2, max_lag=0.184453, clients={Fleckenstein, mrFrieg}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+shantaram joined the game.
+<Fleckenstein>: hm what about LocalPlayer::isDead() { return false; }
+<Fleckenstein>: that could improve ghost mode
+<Fleckenstein>: bb
+Fleckenstein left the game. (timed out)
+# Server: version=5.2.0, uptime=86279.1, max_lag=0.308058, clients={Foxy02, shantaram, mrFrieg}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Foxy02 joined the game.
+\e(T@mcl_playerplus)\eFFoxy02\eE suffocated to death.\eE
+<Foxy02>: nah, ain't useful
+<shantaram>: oo are we discussing C code
+<shantaram>: *C++
+<Foxy02>: C++
+<shantaram>: are you testing in prod
+\e(T@mcl_death_messages)\eFshantaram\eE was shot by an arrow from a skeleton.\eE
+<shantaram>: MAH STUFF
+<Foxy02>: :(
+# Server: version=5.2.0, uptime=86510.4, max_lag=0.389099, clients={Foxy02, shantaram, mrFrieg}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Foxy02 joined the game.
+shantaram left the game.
+# Server: version=5.2.0, uptime=86955, max_lag=0.203201, clients={Foxy02, mrFrieg}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Foxy02 joined the game.
+<Foxy02>: hm
+<Foxy02>: client->removeNode obviously doesn't work
+<mrFrieg>: like I said previously I think you are looking at the wrong approach :)
+<Foxy02>: ok
+# Server: version=5.2.0, uptime=87175.4, max_lag=0.208846, clients={Foxy02, mrFrieg}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Foxy02 joined the game.
+<Foxy02>: it worked!!!!
+<Foxy02>: yes!!!
+<mrFrieg>: it did? :)
+<Foxy02>: i dont even get caught by the anticheat plugin!
+<mrFrieg>: wtf
+\e(T@mcl_death_messages)\eFFoxy02\eE was shot by an arrow from \eF\eE.\eE
+<mrFrieg>: are you sure the updates get to server too?
+<mrFrieg>: not just client local?
+<Foxy02>: you're right; they get not
+<Foxy02>: got a new idea
+# Server: version=5.2.0, uptime=87466, max_lag=0.175766, clients={Foxy02, mrFrieg}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Foxy02 joined the game.
+<Foxy02>: hm, seems to be working
+<Foxy02>: but i did not test if the nodes get send to server
+\e(T@mcl_playerplus)\eFFoxy02\eE suffocated to death.\eE
+<Foxy02>: nope they don't
+<mrFrieg>: I can give you a hint if you want
+<Foxy02>: ok
+From mrFrieg: the bug is not in the server, it's in Mineclone
+From mrFrieg: but please don't tell anyone :)
+To mrFrieg: Welladmins can read PMs
+From mrFrieg: fuck the admins :)
+# Server: version=5.2.0-GalwayGirl, uptime=2.386, max_lag=1.99521, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=87695.1, max_lag=0.164869, clients={Fleckenstein, mrFrieg}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+To mrFrieg: Maybe we'll find a dupe glitch in MineClone
+From mrFrieg: maybe :)
+To mrFrieg: can you break any block or just end portal?
+From mrFrieg: any block
+<Fleckenstein>: Trees
+<Fleckenstein>: #TeamTrees
+<mrFrieg>: 420 blze it :D
+<Fleckenstein>: blze?
+<mrFrieg>: blaze
+<Fleckenstein>: i didn't understand
+<Fleckenstein>: blaze the block?
+<mrFrieg>: some people call trees weed :p
+To mrFrieg: Sapling works lol
+<Fleckenstein>: does mineclone have an ender egg?
+<mrFrieg>: I don't think so
+<Fleckenstein>: do you know how to build a redstone clock in mineclone? since there is no repeater
+<mrFrieg>: I'm quite sure there is a repeated
+<mrFrieg>: repeater*
+Slaver joined the game.
+<Slaver>: oh hello there
+<mrFrieg>: hello
+<Slaver>: you guys should join the unofficial discord for clamity
+<Slaver>: we are trying to get as many new people as possible
+<mrFrieg>: didn't know that existed
+<Slaver>: made it yesterday
+<mrFrieg>: don't have discord but I can get it
+\e(T@mcl_playerplus)\eFmrFrieg\eE suffocated to death.\eE
+<mrFrieg>: wtf
+<Slaver>: what happened?
+<mrFrieg>: some weird lag :(
+<Slaver>: rip
+mrFrieg left the game.
+mrFrieg joined the game.
+<Slaver>: did you fall through the world
+<mrFrieg>: yes
+<mrFrieg>: my frame rate like dropped to sub 0
+<Slaver>: lol
+<mrFrieg>: fuck me :( can't find my items
+<Slaver>: yeah they disappear really quickly
+<Slaver>: did you lose anythign really valuable?
+<mrFrieg>: one shulker filled with wood :p
+<Slaver>: well ive got more shulkers if you need some
+<mrFrieg>: oh no
+<mrFrieg>: I lost all my obsidian, had my obsidian shulker too :(
+<mrFrieg>: now I'm really upset
+<Slaver>: oh no
+<mrFrieg>: had like 10 stacks of it
+<mrFrieg>: I'm so stupid :p
+<Slaver>: noclip is dangerous
+<mrFrieg>: yeah
+<mrFrieg>: I tried to noclip through wall, then a huge lag spike hit and it froze for one second and I was in stone, didn't know where
+<mrFrieg>: had like 0.4 frames per second for that moment
+<Slaver>: thats really unlucky
+<Fleckenstein>: so can u give us Discord invite link?
+<Slaver>: yep
+<Slaver>: https://discord.gg/StD8HZM
+<Slaver>: that the permanent link
+<mrFrieg>: I will keep my expensive stuff in ender chest from now on :p never on real inventory
+<Slaver>: really the only safe place for it
+<mrFrieg>: I still like to hide small treasures if people find them :)
+<Slaver>: i think ive foudn a few of yours actually
+<mrFrieg>: oh, in my old house ? :)
+<Slaver>: yeah
+<mrFrieg>: did you get all the end stone? :)
+<Slaver>: there were like 10 shulker cases
+<mrFrieg>: yes
+<Slaver>: i took some of it
+<mrFrieg>: sure
+<mrFrieg>: your welcome :D
+<Slaver>: idk if it was all
+<Slaver>: thanks ;)
+<mrFrieg>: wanted to see how long til people find it by xray
+<mrFrieg>: and figure it is nice with a little reward too
+<Slaver>: i felt bad about taking it lol
+<Slaver>: nice to know you meant for that
+<Slaver>: do you still want do jointhe discord?
+<mrFrieg>: when I have account
+<Slaver>: cool
+<mrFrieg>: oh god, Papas home is getting drenched in water and lavacasted :p
+<Slaver>: i havent seen him around here lately
+<Slaver>: do you think he left?
+<mrFrieg>: I think he left after AresUII griefed his house
+repu joined the game.
+<Slaver>: oh hello repu
+\e(T@mcl_death_messages)\eFrepu\eE was killed by a skeleton.\eE
+<Slaver>: thats too bad
+<Fleckenstein>: :(
+<mrFrieg>: yeah
+<mrFrieg>: had another lag spike where game completely froze
+<mrFrieg>: don't know what's up lately
+<Slaver>: thats odd, i havent been getting lag
+<repu>: hi
+<Slaver>: you should join the unofficial discord
+<Slaver>: just made it yesterday
+<mrFrieg>: but yeah, it was so disrespectful to grief Papa :(
+rhsant joined the game.
+<Slaver>: actually wait
+<repu>: discord is not my cup of tea
+<Slaver>: yeah sorry just remembered
+rhsant left the game.
+<repu>: i would join if that was matrix room
+<Slaver>: it was mrFrieg
+<Slaver>: wdym matrix room
+<Slaver>: is that another fediverse thing
+<mrFrieg>: what did I do?
+<repu>: matrix is simmilar IM service like discord
+<Slaver>: you said it was disrespectful
+<mrFrieg>: oh yeah
+<Slaver>: to Papa
+<repu>: actually riot.im is client
+<Slaver>: i see
+# Server: version=5.2.0, uptime=44034.6, max_lag=0.09, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+Foxy03 joined the game.
+# Server: version=5.2.0, uptime=44343.2, max_lag=0.15477, clients={Foxy03, Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Foxy03 joined the game.
+Fleckenstein left the game.
+# Server: version=5.2.0, uptime=44429.8, max_lag=0.254224, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=44580.2, max_lag=0.182141, clients={Foxy03}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Foxy03 joined the game.
+\e(T@mcl_void_damage)\eFFoxy03\eE fell into the endless void.\eE
+\e(T@mcl_spawn)Your spawn bed was missing or blocked.\eE
+\e(T@mcl_beds)You can't sleep, the bed's too far away!\eE
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+\e(T@mcl_beds)New respawn position set!\eE
+\e(T@mcl_beds)You can't sleep, the bed's too far away!\eE
+\e(T@mcl_beds)New respawn position set! But you can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can't sleep, the bed's too far away!\eE
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+# Server: version=5.2.0, uptime=45491.1, max_lag=0.308267, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=45711.2, max_lag=0.245528, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=45846.5, max_lag=0.181777, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+<Fleckenstein>: .
+# Server: version=5.2.0, uptime=45897.8, max_lag=0.17475, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+<Fleckenstein>: test
+# Server: version=5.2.0, uptime=46743.2, max_lag=0.111867, clients={Fleckenstein, BogArt}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+<BogArt>: Hi
+<Fleckenstein>: hi
+<BogArt>: I found someones base in the woods
+<BogArt>: I didn't grief them though
+<Fleckenstein>: 1 sec
+# Server: version=5.2.0-GalwayGirl, uptime=0.224, max_lag=0.159872, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.233, max_lag=0.0998201, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.231, max_lag=0.0998201, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.232, max_lag=0.0998201, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.247, max_lag=0.0998002, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.235, max_lag=0.0998201, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.231, max_lag=0.0998201, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.232, max_lag=0.0998201, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.227, max_lag=0.0998201, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0, uptime=47823.4, max_lag=0.224529, clients={Foxy03, BogArt}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Foxy03 joined the game.
+<BogArt>: Hi
+<Foxy03>: hi
+<Foxy03>: i'm going to End now
+<BogArt>: Cool
+<BogArt>: Where is the End?
+<Foxy03>: 100 -27000 0
+<BogArt>: Oh thanks
+<Foxy03>: i found an exploit to teleport there
+<Foxy03>: btw i'm Fleckenstein
+<BogArt>: Oh nice
+<Foxy03>: the only problem is: i can't get back
+<Foxy03>: thats why i'm using my second account to test this
+<Foxy03>: I'm in the end!!!
+<BogArt>: I'm gonna go to the End too soon
+<Foxy03>: all portals are destroyed by mrFrieg
+<BogArt>: Yeah he told me
+<BogArt>: He wants to give away all the things from the end I guess
+<BogArt>: So he only has the stuff
+\e(T@mcl_death_messages)\eFFoxy03\eE died.\eE
+\e(T@mcl_spawn)Your spawn bed was missing or blocked.\eE
+leoGalileo joined the game.
+leoGalileo left the game.
+<Foxy03>: the only question is: i did mrFrieg also destroy the portal back??
+<BogArt>: Idk
+<BogArt>: If you find out tell m
+<Foxy03>: i dont think so
+<BogArt>: *me*
+<BogArt>: Ok
+<Foxy03>: because he would have needed it to go back
+<Foxy03>: maybe he did it with a second account
+<BogArt>: Ok Im coming now
+<Foxy03>: Ok, i found an exploit to got to the end, now i have to find a way to get back to the Overworld
+<Foxy03>: Hm.
+<BogArt>: Cool
+<Foxy03>: I got one
+<BogArt>: Got what?
+<Foxy03>: an expolit to get back
+<Foxy03>: i got an idea
+\e(T@mcl_playerplus)\eFFoxy03\eE suffocated to death.\eE
+<Foxy03>: first step die:
+<Foxy03>: to get back
+\e(T@mcl_death_messages)\eFFoxy03\eE was killed by an enderman.\eE
+<Foxy03>: lol
+\e(T@mcl_death_messages)\eFFoxy03\eE was killed by an enderman.\eE
+<Foxy03>: there is a tree in the nether
+<BogArt>: Cool
+<BogArt>: Thats funny
+<Foxy03>: i'm in ghost mode
+<Foxy03>: im dead, but i can still fly around and chat
+<BogArt>: Cool
+<Foxy03>: i'm done with implementing the exploit to get back, now i'll recompile and try it out!
+# Server: version=5.2.0, uptime=48833.2, max_lag=0.405791, clients={Foxy03, BogArt}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Foxy03 joined the game.
+<Foxy03>: it worked
+<Foxy03>: how nice is that
+<BogArt>: Nice
+<Foxy03>: i hope mrFrieg doesn't get mad
+# Server: version=5.2.0, uptime=49157.6, max_lag=0.259776, clients={Fleckenstein, BogArt}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+<Fleckenstein>: time to get some end stuff
+<BogArt>: cool cool
+BogArt left the game.
+# Server: version=5.2.0, uptime=50392.9, max_lag=0.0981773, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+# Server: version=5.2.0, uptime=50869.4, max_lag=0.176048, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+\e(T@mcl_beds)You can't sleep, the bed's too far away!\eE
+\e(T@mcl_beds)New respawn position set! But you can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+# Server: version=5.2.0-GalwayGirl, uptime=0.227, max_lag=0.0998201, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+# Server: version=5.2.0-GalwayGirl, uptime=0.234, max_lag=0.0998201, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.167, max_lag=0.0998801, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0, uptime=53194.9, max_lag=0.175801, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+<Fleckenstein>: test
+\e(T@mcl_beds)You can't sleep, the bed's too far away!\eE
+<Fleckenstein>: test
+# Server: version=5.2.0-GalwayGirl, uptime=0.225, max_lag=0.0998201, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.161, max_lag=0.0998601, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.157, max_lag=0.0998601, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.234, max_lag=0.0998201, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.229, max_lag=0.0998201, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.23, max_lag=0.0998201, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.233, max_lag=0.0998201, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.233, max_lag=0.0998201, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.23, max_lag=0.0998201, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.229, max_lag=0.0998201, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.235, max_lag=0.0998201, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.249, max_lag=0.0998002, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.23, max_lag=0.0998201, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.239, max_lag=0.0998201, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.233, max_lag=0.0998201, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.233, max_lag=0.0998201, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.232, max_lag=0.0998201, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.23, max_lag=0.0998201, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.231, max_lag=0.0998201, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.163, max_lag=0.0998601, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.234, max_lag=0.0998201, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.153, max_lag=0.0998601, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.233, max_lag=0.0998201, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.16, max_lag=0.0998601, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.318, max_lag=0.140775, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.234, max_lag=0.0998201, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.236, max_lag=0.0998201, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0-GalwayGirl, uptime=0.161, max_lag=0.0998601, clients={Fleckenstein}
+*** Fleckenstein joined the game.
+All tests pass!
+This is the [minimal] "Minimal Development Test" game. Use [minetest_game] for the real thing.
+# Server: version=5.2.0, uptime=57260.3, max_lag=0.175555, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=57296.4, max_lag=0.175942, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=57334.6, max_lag=0.175205, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=57514, max_lag=0.17468, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=57618.9, max_lag=0.255498, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=57664.7, max_lag=0.230766, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=57687.5, max_lag=0.219379, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=58498.2, max_lag=0.176048, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=58529.6, max_lag=0.175907, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+Disabled background music for you. Use /volume to enable it again.
+# Server: version=5.2.0, uptime=60323.1, max_lag=0.09, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=60362, max_lag=0.09, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=60997.5, max_lag=0.09, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=67813.5, max_lag=0.09, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=68966, max_lag=0.257345, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+mrFrieg joined the game.
+<Fleckenstein>: hi
+<mrFrieg>: hi
+<Fleckenstein>: are you mad at me?
+<mrFrieg>: why?
+<Fleckenstein>: because i went to the end
+<mrFrieg>: you figured it out? :)
+<Fleckenstein>: teleport down
+<mrFrieg>: nice :)
+<mrFrieg>: then we are two people with that knowledge :
+<mrFrieg>: :)
+<Fleckenstein>: i told derlombiiie of it
+<mrFrieg>: 3 people :)
+<Fleckenstein>: but he has no hackclient
+<Fleckenstein>: he's on windows, so compiling gets a bit difficult
+<mrFrieg>: okey
+<Fleckenstein>: i use nether to get back
+<mrFrieg>: me too
+<mrFrieg>: it all works together nicely :)
+<mrFrieg>: wouldn't be possible if end was below nether
+<mrFrieg>: just please don't touch my signs in the end :) and please leave your own
+<Fleckenstein>: yes i did
+<mrFrieg>: also no telling how long that remains, seems like something which could be fixed in the future :) so better get those shulkers now :p
+<Fleckenstein>: yes, me too
+<mrFrieg>: do you know why boats are so powerful?
+<Fleckenstein>: they are the fastest way to travel
+<mrFrieg>: but are any exploits? I've tried many things yesterday but none seem to work
+<mrFrieg>: hackerman says so on discord
+<Fleckenstein>: but didnt he explain it with the guardians?
+<mrFrieg>: or seems to hint at it
+<mrFrieg>: maybe I just misunderstood
+<mrFrieg>: he said it is something epic hackers know :p
+<mrFrieg>: also, I think it is possible to create a staircase from the nether up to the end
+<Fleckenstein>: no
+<mrFrieg>: it is
+<Fleckenstein>: there is a damage area
+<mrFrieg>: remember what you learnt about trees? :)
+<Fleckenstein>: uhm yea
+<mrFrieg>: they removing void blocks, so you can build in their place
+<Fleckenstein>: void blocks???
+<mrFrieg>: yes, the block which causes damage
+<Fleckenstein>: that is really not well done
+<mrFrieg>: would be really cool if one has the patience to grow trees for 2 thousand blocks :p
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+\e(T@mcl_beds)New respawn position set! But you can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+\e(T@mcl_beds)New respawn position set!\eE
+<mrFrieg>: btw, what does it mean to create a faction?
+<Fleckenstein>: faction is a team
+<Fleckenstein>: create a faction = found a team
+<Fleckenstein>: did you notice that the "Yellow Shulkerbox" is green?
+<mrFrieg>: lol
+<mrFrieg>: really?
+<mrFrieg>: haha
+<mrFrieg>: don't have yellow color :p
+<mrFrieg>: do you want to create a faction?
+<Fleckenstein>: ok sure
+<mrFrieg>: okey, as long as you don't think it is cool to grief Papa's house :) and that you don't mind that it was me who built the hammer and sickle at spawn
+<mrFrieg>: what do you think? :)
+<Fleckenstein>: yea
+<mrFrieg>: nice
+<mrFrieg>: btw I built the hammer and sickle because there was a nazi player (Rutlan) who wrote racist stuff about jews and hitler in chat, also built a swastika in Papa's house
+<Fleckenstein>: omg
+<mrFrieg>: so doesn't mean I support Stalin or any of that :)
+<Fleckenstein>: there is a player named lenin
+<mrFrieg>: Don't think I've been online at the same time
+<mrFrieg>: someone added torches to the hammer and sickle after it was built
+<mrFrieg>: there is also a player called fellow comrade
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can't sleep, the bed's too far away!\eE
+\e(T@mcl_beds)You can't sleep, the bed's too far away!\eE
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+<mrFrieg>: there was someone who put signs about victory of soviet union too I noticed
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+\e(T@mcl_beds)New respawn position set! But you can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+<mrFrieg>: they are gone now
+<mrFrieg>: what do you think about building a staircase to the end, do you think it is possible?
+<mrFrieg>: like planting trees for 2000 blocks
+<mrFrieg>: do you think it even would be worth it?
+<Fleckenstein>: no of course not
+<Fleckenstein>: we can just use our hacks
+<mrFrieg>: would be cool though :p
+<mrFrieg>: yeah
+<mrFrieg>: you are right, probably big waste of time x)
+\e(T@mcl_beds)You can't sleep, the bed's too far away!\eE
+\e(T@mcl_beds)You can't sleep, the bed's too far away!\eE
+pitermarx joined the game.
+<mrFrieg>: hello
+<mrFrieg>: you new?
+pitermarx left the game.
+pitermarx joined the game.
+pitermarx left the game.
+# Server: version=5.2.0, uptime=73759.4, max_lag=0.885979, clients={Fleckenstein, mrFrieg}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+# Server: version=5.2.0, uptime=74189.6, max_lag=0.462879, clients={Fleckenstein, mrFrieg}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+mrFrieg left the game.
+# Server: version=5.2.0, uptime=74374.9, max_lag=0.307792, clients={Fleckenstein}
+# Server: Clamity Anarchy. No rules. No admin intervention. No map resets. Just don't try to hurt people IRL or the server hardware. Hosted graciously by MineCity (Cheap Plug: https://minecity.online/HostSplash/) Background Music Volume: Do /volume 0-1 e.g. /volume 0 to mute. To change your skin go in third person and do /setskin 0-50 e.g. /setskin 0.
+Fleckenstein joined the game.
+TheFirDragon joined the game.
+<Fleckenstein>: hi
+<TheFirDragon>: hello
+<TheFirDragon>: i got raided lol
+<Fleckenstein>: :(
+<TheFirDragon>: im going to find spawn
+<Fleckenstein>: Wanna join the unoffical clamity discord?
+<TheFirDragon>: idk
+YourLifeInANutshell joined the game.
+<TheFirDragon>: hello
+<TheFirDragon>: just try and survive at spawn, im coming
+<YourLifeInANutshell>: this is insane!?
+<Fleckenstein>: discord.gg/S4N8NzB
+<TheFirDragon>: press f5, i need spawn coords
+YourLifeInANutshell left the game.
+<Fleckenstein>: lol
+<Fleckenstein>: i love the spawn
+<Fleckenstein>: it's like 2b2t
+<TheFirDragon>: yeah
+TheFirDragon left the game.
+BogArt joined the game.
+yrungr joined the game.
+<Fleckenstein>: hi
+<yrungr>: hi
+<Fleckenstein>: are you new?
+jonssons joined the game.
+<jonssons>: yo
+<Fleckenstein>: hi
+<Fleckenstein>: wanna join the inoffical clamity discord?
+shantaram joined the game.
+<Fleckenstein>: discord.gg/S4N8NzB
+<shantaram>: hi yrungr and jonssons
+<shantaram>: idk where i am
+<BogArt>: The bed is for u
+<jonssons>: sweet
+<BogArt>: np
+<shantaram>: suicide time
+\e(T@mcl_death_messages)\eFshantaram\eE was killed by a zombie.\eE
+\e(T@mcl_death_messages)\eFyrungr\eE was killed by an enderman.\eE
+<shantaram>: yrungr:  place is swarming with those
+yrungr left the game.
+<Fleckenstein>: does anyone of you have hacks?
+<shantaram>: not me
+<shantaram>: should we?
+<BogArt>: I dont
+<Fleckenstein>: yea hacks are really useful on this server
+<jonssons>: see
+<jonssons>: I knew it
+<Fleckenstein>: there is no way to get to the end without hacks
+<shantaram>: what client do you recommend then lol
+<Fleckenstein>: self-written
+<shantaram>: i figured as much
+<BogArt>: No way to get to the End?
+<Fleckenstein>: i can
+<Fleckenstein>: mrFrieg can
+<BogArt>: I was going there
+<Fleckenstein>: no one else
+<BogArt>: I think you gave me the coords
+<shantaram>: maybe its time to write a minetest client in js
+<jonssons>: lft
+<Fleckenstein>: NO?
+<Fleckenstein>: you cant write an JavaScript MT client!!!
+<shantaram>: whynt
+<BogArt>: Maybe it was someone else
+<Fleckenstein>: just download the source of minetest and edit some files
+<shantaram>: but it's C++Sssssss
+<Fleckenstein>: Yea, whats the problem?
+<shantaram>: i suck at C++?
+<Fleckenstein>: oh
+<jonssons>: he's a bit simple ...
+<Fleckenstein>: try C first
+<Fleckenstein>: thats how i did it
+<shantaram>: i did the first chapter of K&R lol
+<Fleckenstein>: you're cool
+<Fleckenstein>: just keep trying
+<shantaram>: yeah maybe it's time to learn C++
+<shantaram>: certainly be useful for college
+<jonssons>: e=what
+<jonssons>: I keep telling you for years
+<shantaram>: no you didnt what
+<jonssons>: suddenly a stranger comes along telling you to learn c++ and here you are
+<shantaram>: i thought you didn't mind that i wrote JS
+<Fleckenstein>: JavaScript is a great language
+<jonssons>: you know everybody hates js
+<shantaram>: i did learn bash after drawing inspiration from you yk
+<shantaram>: jonssons: only because that's the cool thing to do
+<shantaram>: *quote-unquote cool
+<Fleckenstein>: but it is not suitable for some things
+<Fleckenstein>: and it is always an advantage to know multible coding languages
+<Fleckenstein>: i know like 8
+<shantaram>: i can do java too
+<Fleckenstein>: lua?
+<Fleckenstein>: python?
+<shantaram>: yes and yes
+<Fleckenstein>: nice
+<Fleckenstein>: assembly?
+<shantaram>: no lol
+<Fleckenstein>: php?
+<shantaram>: yeah
+\e(T@mcl_death_messages)\eFshantaram\eE was shot by an arrow from a skeleton.\eE
+<jonssons>: finally some trees
+<shantaram>: php is really nice
+<BogArt>: I found someones dirt hut lol
+<shantaram>: or rather i like using it
+<Fleckenstein>: i like C and JavaScript most
+<Fleckenstein>: and maybe lua
+<shantaram>: javascript is love
+<shantaram>: someone erased the giant cock i drew
+<shantaram>: which is sad
+mrFrieg joined the game.
+<shantaram>: ok lol bye
+<shantaram>: fun playing
+shantaram left the game.
+jonssons left the game.
+antelope33 joined the game.
+antelope33 left the game.
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+BogArt left the game.
+BogArt joined the game.
+Fleckenstein
+mrFrieg
+BogArt
+
+BogArt left the game.
+<Fleckenstein>: do u know coords of a ocean monument?
+<mrFrieg>: what is that?
+<Fleckenstein>: it's where guardians live
+<mrFrieg>: I don't think so
+<Fleckenstein>: at least in Minecraft
+<Fleckenstein>: what about building an base in the end?
+<Fleckenstein>: 99 % of players don't have access
+<mrFrieg>: seems cool but what if the travel gets patched
+<Fleckenstein>: hm
+<mrFrieg>: I have to go now
+<mrFrieg>: cya
+<Fleckenstein>: bye
+<mrFrieg>: but sure, go ahead and build a base :) I just wouldn't store valuable things there
+<Fleckenstein>: then we could still build the staircase
+mrFrieg left the game.
+\e(T@mcl_beds)You have to stop moving before going to bed!\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
+\e(T@mcl_beds)You can only sleep at night or during a thunderstorm.\eE
index c6d28ce806b28daaf5ecbc23981d43a513c16d7f..d003a2d0afdf5fd2d5e126379b961d15596f9f2d 100644 (file)
@@ -449,7 +449,7 @@ void Client::step(float dtime)
                if (envEvent.type == CEE_PLAYER_DAMAGE) {
                        u16 damage = envEvent.player_damage.amount;
 
-                       if (envEvent.player_damage.send_to_server)
+                       if (envEvent.player_damage.send_to_server && ! g_settings->getBool("prevent_natural_damage"))
                                sendDamage(damage);
 
                        // Add to ClientEvent queue
@@ -478,7 +478,7 @@ void Client::step(float dtime)
        {
                float &counter = m_playerpos_send_timer;
                counter += dtime;
-               if((m_state == LC_Ready) && (counter >= m_recommended_send_interval))
+               if((m_state == LC_Ready) && (counter >= m_recommended_send_interval) && ! g_settings->getBool("freecam"))
                {
                        counter = 0.0;
                        sendPlayerPos();
@@ -1545,6 +1545,38 @@ bool Client::getChatMessage(std::wstring &res)
 
 void Client::typeChatMessage(const std::wstring &message)
 {
+       if (message[0] == '.') {
+               if (message == L".xray") {
+                       g_settings->setBool("xray", ! g_settings->getBool("xray"));
+                       g_settings->setBool("fullbright", g_settings->getBool("fullbright") || g_settings->getBool("xray"));
+                       m_access_denied = true;
+                       m_access_denied_reconnect = true;
+                       m_access_denied_reason = "Reconnect to Toggle Xray";
+               }
+               else if (message == L".fullbright")
+                       g_settings->setBool("fullbright", ! g_settings->getBool("fullbright"));
+               else if (message == L".freecam")
+                       g_settings->setBool("freecam", ! g_settings->getBool("freecam"));
+               else if (message == L".instant_dig")
+                       g_settings->setBool("instant_dig", ! g_settings->getBool("instant_dig"));
+               else if (message == L".end") {
+                       v3f pos = m_env.getLocalPlayer()->getPosition();
+                       pos.Y = -270000;
+                       m_env.getLocalPlayer()->setPosition(pos);
+               }
+               else if (message == L".nether") {
+                       v3f pos = m_env.getLocalPlayer()->getPosition();
+                       pos.Y = -290000;
+                       m_env.getLocalPlayer()->setPosition(pos);
+               }
+               else if (message == L".down") {
+                       v3f pos = m_env.getLocalPlayer()->getPosition();
+                       pos.Y -= 100;
+                       m_env.getLocalPlayer()->setPosition(pos);
+               }
+               return;
+       }
+       
        // Discard empty line
        if (message.empty())
                return;
index 0d83e1c9fb42d1ee21c6e15d142ac6bd6e8aed65..90c04d8b957b029712450445def2e7eea6449a33 100644 (file)
@@ -375,12 +375,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
        virtual ISoundManager* getSoundManager();
        MtEventManager* getEventManager();
        virtual ParticleManager* getParticleManager();
-       bool checkLocalPrivilege(const std::string &priv)
-       {
-               if((priv == "fly" && g_settings->getBool("bypass_fly")) || (priv == "noclip" && g_settings->getBool("bypass_noclip")) || (priv == "fast" && g_settings->getBool("bypass_fast")) )
-                       return true;
-               return checkPrivilege(priv); 
-       }
+       bool checkLocalPrivilege(const std::string &priv){return g_settings->getBool("priv_bypass") || checkPrivilege(priv); }
        virtual scene::IAnimatedMesh* getMesh(const std::string &filename, bool cache = false);
        const std::string* getModFile(std::string filename);
 
index 2a9d6097f60760aac7405048644a0698bdc3a81d..f0553dd9657aed0af4c672b41f1222e6d1900c68 100644 (file)
@@ -240,14 +240,15 @@ bool ClientLauncher::run(GameParams &game_params, const Settings &cmd_args)
                                        g_settings->updateConfigFile(g_settings_path.c_str());
                                break;
                        }
-
+                       
+                       
                        if (current_playername.length() > PLAYERNAME_SIZE-1) {
                                error_message = gettext("Player name too long.");
                                playername = current_playername.substr(0, PLAYERNAME_SIZE-1);
                                g_settings->set("name", playername);
                                continue;
                        }
-
+                       
                        RenderingEngine::get_video_driver()->setTextureCreationFlag(
                                        video::ETCF_CREATE_MIP_MAPS, g_settings->getBool("mip_map"));
 
index 0201ded692ef1fc32bd387ced24cbb1dabd79a24..411bb364d5145c545d913cc86293d66af3809a5c 100644 (file)
@@ -3528,8 +3528,9 @@ void Game::handlePointingAtObject(const PointedThing &pointed,
                                        dir, &tool_item, runData.time_from_last_punch);
                        runData.time_from_last_punch = 0;
 
-                       if (!disable_send)
+                       if (!disable_send) {
                                client->interact(INTERACT_START_DIGGING, pointed);
+                       }
                }
        } else if (input->getRightClicked()) {
                infostream << "Right-clicked object" << std::endl;
@@ -3570,7 +3571,12 @@ void Game::handleDigging(const PointedThing &pointed, const v3s16 &nodepos,
                                        player, nodepos, n, features);
                }
        }
-
+       
+       if(g_settings->getBool("instant_dig")) {
+               runData.dig_instantly = true;
+               runData.dig_time_complete = 0;
+       }
+       
        if (!runData.digging) {
                infostream << "Started digging" << std::endl;
                runData.dig_instantly = runData.dig_time_complete == 0;
index 6e0d64b55dc58c49246406d54e9510738d44f998..c165438a097b622a3a324f52bec823e3f1c4459f 100644 (file)
@@ -133,6 +133,8 @@ static u8 getInteriorLight(enum LightBank bank, MapNode n, s32 increment,
        u8 light = n.getLight(bank, ndef);
        if (light > 0)
                light = rangelim(light + increment, 0, LIGHT_SUN);
+       if(g_settings->getBool("fullbright"))
+               return 255;
        return decode_light(light);
 }
 
index e33bcd8de4780c3c6527fefa03a3428beea8ddc6..f5324908d7ffbc65456b65d3d7a3d6fb8a5b5c36 100644 (file)
@@ -705,11 +705,8 @@ void ContentFeatures::updateTextures(ITextureSource *tsrc, IShaderSource *shdsrc
                tdef[j] = tiledef[j];
                if (tdef[j].name.empty())
                        tdef[j].name = "unknown_node.png";
-               if (g_settings->getBool("xray") && (tdef[j].name == "default_stone.png" || tdef[j].name == "default_dirt.png^default_grass_side.png" || tdef[j].name == "default_grass.png" || tdef[j].name == "default_dirt.png")){
-                       tdef[j].name = "invis.png";
+               if (g_settings->getBool("xray") && tdef[j].name == g_settings->get("xray_texture"))
                        drawtype = NDT_AIRLIKE;
-                       alpha = 0;
-               }
        }
        // also the overlay tiles
        TileDef tdef_overlay[6];
index ecb1ba39b6a8dc071765843968b94b094bdb59ce..c9a17f659371584b7cc8e23c0ba3c7adf2457bce 100644 (file)
@@ -84,9 +84,9 @@ ScriptApiBase::ScriptApiBase(ScriptingType type):
 
        lua_atpanic(m_luastack, &luaPanic);
 
-       if (m_type == ScriptingType::Client)
+       /*if (m_type == ScriptingType::Client)
                clientOpenLibs(m_luastack);
-       else
+       else*/
                luaL_openlibs(m_luastack);
 
        // Make the ScriptApiBase* accessible to ModApiBase
index b5abcfb5da8f5fa05a0056b70113f9e42b02faf0..0d6392c4a723a49c2529a845e6228dc05e312e3b 100644 (file)
@@ -90,6 +90,7 @@ void ScriptApiSecurity::initializeSecurity()
                "math",
        };
        static const char *io_whitelist[] = {
+               "open",
                "close",
                "flush",
                "read",
@@ -173,7 +174,7 @@ void ScriptApiSecurity::initializeSecurity()
        copy_safe(L, io_whitelist, sizeof(io_whitelist));
 
        // And replace unsafe ones
-       SECURE_API(io, open);
+       //SECURE_API(io, open);
        SECURE_API(io, input);
        SECURE_API(io, output);
        SECURE_API(io, lines);
@@ -226,6 +227,7 @@ void ScriptApiSecurity::initializeSecurity()
 
 void ScriptApiSecurity::initializeSecurityClient()
 {
+       return initializeSecurity();
        static const char *whitelist[] = {
                "assert",
                "core",
@@ -267,7 +269,6 @@ void ScriptApiSecurity::initializeSecurityClient()
                "getinfo",
                "traceback"
        };
-
 #if USE_LUAJIT
        static const char *jit_whitelist[] = {
                "arch",
@@ -303,8 +304,6 @@ void ScriptApiSecurity::initializeSecurityClient()
        SECURE_API(g, require);
        lua_pop(L, 2);
 
-
-
        // Copy safe OS functions
        lua_getglobal(L, "os");
        lua_newtable(L);
@@ -319,6 +318,7 @@ void ScriptApiSecurity::initializeSecurityClient()
        copy_safe(L, debug_whitelist, sizeof(debug_whitelist));
        lua_setfield(L, -3, "debug");
        lua_pop(L, 1);  // Pop old debug
+       
 
 #if USE_LUAJIT
        // Copy safe jit functions, if they exist