Compare commits

...

65 Commits

Author SHA1 Message Date
Perttu Ahola
684b004751 Update version number to 0.4.dev-20120326 because much has changed from the previous one 2012-03-27 00:07:25 +03:00
Perttu Ahola
cbe11fc7aa Do a dumb-ass static string copy for const-incorrect old versions of ov_fopen 2012-03-27 00:06:26 +03:00
Perttu Ahola
d01387a82f Add games/minimal/game.conf 2012-03-26 23:50:24 +03:00
Perttu Ahola
862d76b617 Move games/minetest to games/minimal and update README.txt 2012-03-26 23:28:19 +03:00
Perttu Ahola
bd9912213f Prefer _game postfix in game names (to be squashed to the previous commit) 2012-03-26 23:17:29 +03:00
Perttu Ahola
814ada538a Support _game postfix in game names, taking it out to make the gameid 2012-03-26 23:16:02 +03:00
Perttu Ahola
53f7eef052 Add game.conf check in subgame.cpp 2012-03-26 23:02:12 +03:00
Perttu Ahola
405347769a New world removal GUI code 2012-03-26 08:37:15 +03:00
Perttu Ahola
5b31d32da8 Better file/directory removal platform code and utilities 2012-03-26 08:36:59 +03:00
Perttu Ahola
dcef5183f7 Small fix to fs::GetDirListing when trying to list an inexistent directory 2012-03-25 23:16:53 +03:00
Perttu Ahola
728d01ef4b MSVC build directory autodetection at startup 2012-03-25 23:10:09 +03:00
Perttu Ahola
0557df8d06 Add OPENAL_DLL LIBOGG_DLL LIBVORBIS_DLL and LIBVORBISFILE_DLL to be used optionally when installing 2012-03-25 22:50:09 +03:00
Perttu Ahola
3a9753b85f Add OGG_INCLUDE_DIR to SOUND_INCLUDE_DIRS 2012-03-25 22:07:34 +03:00
Perttu Ahola
8e6ac5c263 Fix cmake install script (mesetint -> minetest) 2012-03-25 21:41:37 +03:00
Perttu Ahola
188b303991 Don't try to use sound if building only server 2012-03-25 21:10:25 +03:00
Perttu Ahola
836595313c Raise PROTOCOL_VERSION to 9, as this is not compatible with earlier versions 2012-03-25 20:36:02 +03:00
Perttu Ahola
6779036d25 Make server world selection not brain dead and use gameid 'minetest' instead of 'mesetint' 2012-03-25 20:30:58 +03:00
Perttu Ahola
4fb6c07535 Change postfixes from N.ogg to .N.ogg in user/testsounds/ loader 2012-03-25 18:51:05 +03:00
Perttu Ahola
f01c988094 Some serialization version stuff 2012-03-25 18:45:27 +03:00
Perttu Ahola
677456d319 Initialize utility.h return values to 0 to make lazily error-checked deserialization code work less chaotically 2012-03-25 17:09:24 +03:00
Perttu Ahola
f022af66da Update doc/lua_api.txt 2012-03-25 16:22:02 +03:00
Perttu Ahola
98c40f5ee6 Switch sound randomizer postfixes from N.ogg to .N.ogg 2012-03-25 16:21:34 +03:00
Perttu Ahola
db0928add3 Sound loading from memory (by using a quick hack) 2012-03-25 15:52:43 +03:00
Perttu Ahola
a9a923e4da Update/fix .gitignore 2012-03-25 15:52:08 +03:00
Perttu Ahola
1cac1de3b2 Almost support loading sounds from server 2012-03-25 14:48:22 +03:00
Perttu Ahola
524c78a8d6 Add a variant of hex_encode 2012-03-25 14:48:19 +03:00
Perttu Ahola
e71262463f Add removeStringEnd() 2012-03-25 14:48:14 +03:00
Perttu Ahola
26666bb36f Add more media directories; mod/{textures,sounds,media} 2012-03-25 12:10:58 +03:00
Perttu Ahola
f801e16b78 Texture cache -> Media cache WIP 2012-03-25 11:51:33 +03:00
Jonathan Neuschäfer
4bf5065a9c Cache textures by checksum 2012-03-25 11:51:00 +03:00
Perttu Ahola
04085cad3c Make event_manager.h build on MSVC 2012-03-25 04:06:45 +03:00
Perttu Ahola
c8997e48c0 Build configuration fixes/improvements on Windows 2012-03-25 04:03:51 +03:00
Perttu Ahola
77621568fd Fix build on MinGW (as compared to Linux) 2012-03-24 23:16:09 +02:00
Perttu Ahola
601d1936c9 Lua API for playing sounds 2012-03-24 19:01:26 +02:00
Perttu Ahola
06e93f8d95 Add sound.dig 2012-03-24 11:10:28 +02:00
Perttu Ahola
74780134f2 Update doc/lua_api.txt 2012-03-24 04:32:31 +02:00
Perttu Ahola
93219e3b9d Add sounds, tune things 2012-03-24 04:24:26 +02:00
Perttu Ahola
77120a021d Digging and placing sounds 2012-03-24 04:24:26 +02:00
Perttu Ahola
6c14025b2d Add event manager and use it to trigger sounds 2012-03-24 04:24:26 +02:00
Perttu Ahola
e53794868e LocalPlayer::getStandingNodePos() 2012-03-24 04:24:26 +02:00
Perttu Ahola
8c2f3bb378 c55sound continued 2012-03-24 04:24:25 +02:00
Perttu Ahola
0ac2ce7dea Update/fix/improve config.h and cmake_config.h.in 2012-03-24 04:24:25 +02:00
Perttu Ahola
c301e3c82a celeron55's sound system initial framework 2012-03-24 04:24:23 +02:00
Perttu Ahola
9dd78a8a45 Seriously WTF, LLVM/clang? 2012-03-23 00:45:18 +02:00
Perttu Ahola
ede1674d6a Fix filesys.cpp debug output to go into debug.txt 2012-03-23 00:05:32 +02:00
Perttu Ahola
c3f2b24a9a Remove useless clearing of the Z buffer 2012-03-22 22:15:38 +02:00
Perttu Ahola
b91bba1ab2 Install lua_api.txt and mapformat.txt in because awesome. 2012-03-22 17:08:32 +02:00
Perttu Ahola
fbc22f91d5 Update doc/lua_api.txt and doc/mapformat.txt even more 2012-03-22 17:02:40 +02:00
Perttu Ahola
424b36d469 Describe format of nodes in doc/mapformat.txt 2012-03-22 16:12:33 +02:00
Perttu Ahola
8070f9485b Update doc/mapformat.txt 2012-03-22 15:54:12 +02:00
Perttu Ahola
c353709f7e mapformat WIP 2012-03-22 14:11:20 +02:00
Perttu Ahola
c13691a8e6 Add output levels --info and --trace (--verbose is now more verbose) 2012-03-22 14:10:37 +02:00
Perttu Ahola
2671b9af1b Move headers from socket.h to socket.cpp 2012-03-22 13:41:50 +02:00
Perttu Ahola
7d0ad0f521 Fix UDPSocket's debug output 2012-03-22 13:36:37 +02:00
Perttu Ahola
9bd75d5668 Log at info level when a banned client connects 2012-03-22 13:35:32 +02:00
Perttu Ahola
fde676a43a Add more information to lua_api.txt 2012-03-22 12:14:45 +02:00
Perttu Ahola
2469ce6067 Update Lua API documentation and move it into doc/lua_api.txt 2012-03-22 11:41:40 +02:00
Perttu Ahola
ef0ec31554 Goddamn MSVC pow overload ambiguities 2012-03-21 22:11:15 +02:00
Perttu Ahola
da4f51332f Add ScopeProfilerType SPT_GRAPH_ADD 2012-03-21 15:38:24 +02:00
Perttu Ahola
194258b479 Add different automatic profiler graph drawing style for relative-ish plots 2012-03-21 15:06:45 +02:00
Perttu Ahola
fa416e7116 Add more graph colors, add mainloop_dtime graph, make statustext fade away faster 2012-03-21 15:06:44 +02:00
Perttu Ahola
71b2e0e002 Modify and clean main loop to allow measuring the proper times 2012-03-21 15:06:44 +02:00
Perttu Ahola
7d1ac4d1f6 Profiler graph 2012-03-21 15:06:41 +02:00
Perttu Ahola
2f2ef80ec2 Use atof() in mystof(), because istringstream>>float randomly causes a segfault on mingw 2012-03-21 02:16:22 +02:00
Perttu Ahola
c0530921ff Attempt to fix some minor memory leaks 2012-03-20 17:55:34 +02:00
164 changed files with 4773 additions and 1214 deletions

22
.gitignore vendored
View File

@@ -6,16 +6,18 @@ tags
*.vim
## Non-static Minetest directories
bin/
games/
!games/mesetint
cache/
textures/
sounds/
mods/
!mods/mesetint/mods_here.txt
worlds/
world/
/bin/
/games/*
!/games/minimal/
/cache/
/textures/
/sounds/
/mods/*
!/mods/minetest/
/mods/minetest/*
!/mods/minetest/mods_here.txt
/worlds/
/world/
## Configuration/log files
minetest.conf

View File

@@ -10,7 +10,7 @@ project(minetest)
# Also remember to set PROTOCOL_VERSION in clientserver.h when releasing
set(VERSION_MAJOR 0)
set(VERSION_MINOR 4)
set(VERSION_PATCH dev-20120320)
set(VERSION_PATCH dev-20120326)
set(VERSION_STRING "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")
MESSAGE(STATUS "*** Will build version ${VERSION_STRING} ***")
@@ -85,16 +85,18 @@ elseif(UNIX) # Linux, BSD etc
endif()
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/builtin" DESTINATION "${SHAREDIR}")
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/games/mesetint" DESTINATION "${SHAREDIR}/games")
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/games/minetest" DESTINATION "${SHAREDIR}/games")
if(BUILD_CLIENT)
#install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/sounds/base/pack" DESTINATION "${SHAREDIR}/sounds/base")
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/textures/base/pack" DESTINATION "${SHAREDIR}/textures/base")
endif()
if(RUN_IN_PLACE)
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/mods/mesetint/mods_here.txt" DESTINATION "${SHAREDIR}/mods/mesetint")
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/mods/minetest/mods_here.txt" DESTINATION "${SHAREDIR}/mods/minetest")
endif()
install(FILES "README.txt" DESTINATION "${DOCDIR}")
install(FILES "doc/lua_api.txt" DESTINATION "${DOCDIR}")
install(FILES "doc/mapformat.txt" DESTINATION "${DOCDIR}")
install(FILES "minetest.conf.example" DESTINATION "${EXAMPLE_CONF_DIR}")
if(UNIX)

View File

@@ -1,50 +1,75 @@
Minetest-c55
---------------
An InfiniMiner/Minecraft inspired game.
Copyright (c) 2010-2012 Perttu Ahola <celeron55@gmail.com>
(see source files for other contributors)
============
Further documentation:
An InfiniMiner/Minecraft inspired game.
Copyright (c) 2010-2012 Perttu Ahola <celeron55@gmail.com>
and ther contributors (see source file comments and the version control log)
In case you downloaded the source code:
---------------------------------------
If you downloaded the Minetest Engine source code in which this file is
contained, you probably want to download the minetest_game project too:
https://github.com/celeron55/minetest_game/
See the README.txt in it.
Further documentation
----------------------
- Website: http://celeron.55.lt/~celeron55/minetest/
- Wiki: http://celeron.55.lt/~celeron55/minetest/wiki/
- Forum: http://celeron.55.lt/~celeron55/minetest/forum/
- Website: http://c55.me/minetest/
- Wiki: http://c55.me/minetest/wiki/
- Forum: http://c55.me/minetest/forum/
- Github: https://github.com/celeron55/minetest/
- doc/ directory of source distribution
This game is not finished:
This game is not finished
--------------------------
- Don't expect it to work as well as a finished game will.
- Please report any bugs to me. debug.txt is useful.
- Please report any bugs. When doing that, debug.txt is useful.
Controls:
---------
- See the in-game pause menu
Default Controls
-----------------
- WASD: Move
- Space: Jump
- E: Go down
- Shift: Sneak
- Q: Drop item
- I: Open inventory
- Mouse: Turn/look
- Settable in the configuration file, see the section below.
Map directory:
--------------
- Map is stored in a directory, which can be removed to generate a new map.
- There is a command-line option for it: --map-dir
- For a RUN_IN_PLACE build, it is located in:
../world
- Otherwise something like this:
Windows: C:\Documents and Settings\user\Application Data\minetest\world
Linux: ~/.minetest/world
OS X: ~/Library/Application Support/minetest/world
Paths
------
$bin - Compiled binaries
$share - Cistributed read-only data
$user - User-created modifiable data
Windows .zip / RUN_IN_PLACE source:
$bin = bin
$share = .
$user = .
Linux installed:
$bin = /usr/bin
$share = /usr/share/minetest
$user = ~/.minetest
OS X:
$bin = ?
$share = ?
$user = ~/Library/Application Support/minetest
World directory
----------------
- Worlds can be found as separate folders in:
$user/worlds/
Configuration file:
-------------------
- An optional configuration file can be used. See minetest.conf.example.
- Path to file can be passed as a parameter to the executable:
- Default location:
$user/minetest.conf
- It is created by Minetest when it is ran the first time.
- A specific file can be specified on the command line:
--config <path-to-file>
- Defaults:
- If built with -DRUN_IN_PLACE=1:
../minetest.conf
../../minetest.conf
- Otherwise something like this:
Windows: C:\Documents and Settings\user\Application Data\minetest\minetest.conf
Linux: ~/.minetest/minetest.conf
OS X: ~/Library/Application Support/minetest.conf
Command-line options:
---------------------
@@ -94,7 +119,7 @@ Compiling on Windows:
http://gnuwin32.sourceforge.net/downlinks/gettext.php
- This is used for other UI languages. Feel free to leave it out.
* And, of course, Minetest-c55:
http://celeron.55.lt/~celeron55/minetest/download
http://c55.me/minetest/download
- Steps:
- Select a directory called DIR hereafter in which you will operate.
- Make sure you have CMake and a compiler installed.

View File

@@ -0,0 +1,46 @@
# - Find vorbis
# Find the native vorbis includes and libraries
#
# VORBIS_INCLUDE_DIR - where to find vorbis.h, etc.
# OGG_INCLUDE_DIR - where to find ogg/ogg.h, etc.
# VORBIS_LIBRARIES - List of libraries when using vorbis(file).
# VORBIS_FOUND - True if vorbis found.
if(NOT GP2XWIZ)
if(VORBIS_INCLUDE_DIR)
# Already in cache, be silent
set(VORBIS_FIND_QUIETLY TRUE)
endif(VORBIS_INCLUDE_DIR)
find_path(OGG_INCLUDE_DIR ogg/ogg.h)
find_path(VORBIS_INCLUDE_DIR vorbis/vorbisfile.h)
# MSVC built ogg/vorbis may be named ogg_static and vorbis_static
find_library(OGG_LIBRARY NAMES ogg ogg_static)
find_library(VORBIS_LIBRARY NAMES vorbis vorbis_static)
find_library(VORBISFILE_LIBRARY NAMES vorbisfile vorbisfile_static)
# Handle the QUIETLY and REQUIRED arguments and set VORBIS_FOUND
# to TRUE if all listed variables are TRUE.
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(VORBIS DEFAULT_MSG
OGG_INCLUDE_DIR VORBIS_INCLUDE_DIR
OGG_LIBRARY VORBIS_LIBRARY VORBISFILE_LIBRARY)
else(NOT GP2XWIZ)
find_path(VORBIS_INCLUDE_DIR tremor/ivorbisfile.h)
find_library(VORBIS_LIBRARY NAMES vorbis_dec)
find_package_handle_standard_args(VORBIS DEFAULT_MSG
VORBIS_INCLUDE_DIR VORBIS_LIBRARY)
endif(NOT GP2XWIZ)
if(VORBIS_FOUND)
if(NOT GP2XWIZ)
set(VORBIS_LIBRARIES ${VORBISFILE_LIBRARY} ${VORBIS_LIBRARY}
${OGG_LIBRARY})
else(NOT GP2XWIZ)
set(VORBIS_LIBRARIES ${VORBIS_LIBRARY})
endif(NOT GP2XWIZ)
else(VORBIS_FOUND)
set(VORBIS_LIBRARIES)
endif(VORBIS_FOUND)
mark_as_advanced(OGG_INCLUDE_DIR VORBIS_INCLUDE_DIR)
mark_as_advanced(OGG_LIBRARY VORBIS_LIBRARY VORBISFILE_LIBRARY)

798
doc/lua_api.txt Normal file
View File

@@ -0,0 +1,798 @@
Minetest Lua Modding API Reference 0.4.dev
==========================================
More information at http://c55.me/minetest/
Introduction
-------------
Content and functionality can be added to Minetest 0.4 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.
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. You can send such improvements as
source code patches to <celeron55@gmail.com>.
Programming in Lua
-------------------
If you have any difficulty in understanding this, please read:
http://www.lua.org/pil/
Startup
--------
Mods are loaded during server startup from the mod load paths by running
the init.lua scripts.
Mod load path
-------------
Generic:
$path_share/games/gameid/mods/
$path_share/mods/gameid/
$path_user/games/gameid/mods/
$path_user/mods/gameid/ <-- User-installed mods
$worldpath/worldmods/
In a run-in-place version (eg. the distributed windows version):
minetest-0.4.x/games/gameid/mods/
minetest-0.4.x/mods/gameid/ <-- User-installed mods
minetest-0.4.x/worlds/worldname/worldmods/
On an installed version on linux:
/usr/share/minetest/games/gameid/mods/
~/.minetest/mods/gameid/ <-- User-installed mods
~/.minetest/worlds/worldname/worldmods
Mod directory structure
------------------------
mods
|-- modname
| |-- depends.txt
| |-- init.lua
| |-- textures
| | |-- modname_stuff.png
| | `-- modname_something_else.png
| |-- sounds
| |-- media
| `-- <custom data>
`-- another
modname:
The location of this directory can be fetched by using
minetest.get_modpath(modname)
depends.txt:
List of mods that have to be loaded before loading this mod.
A single line contains a single modname.
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.setting_get(name) and minetest.setting_getbool(name) can be used
to read custom or existing settings at load time, if necessary.
textures, sounds, media:
Media files (textures, sounds, whatever) that will be transferred to the
client and will be available for use by the mod.
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: mod "experimental", ideal item/node/entity name "tnt":
-> 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.
Aliases
-------
Aliases can be added by using minetest.register_alias(name, convert_to)
This will make Minetest to convert things called name to things called
convert_to.
This can be used for maintaining backwards compatibility.
This can be also used for setting quick access names for things, eg. if
you have an item called epiclylongmodname:stuff, you could do
minetest.register_alias("stuff", "epiclylongmodname:stuff")
and be able to use "/giveme stuff".
Textures
--------
Mods should generally prefix their textures with modname_, eg. 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:
eg. foomod_foothing.png
eg. foomod_foothing
Sounds
-------
Only OGG 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_, eg. 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
}
-- Play locationless to a player
{
to_player = name,
gain = 1.0, -- default
}
-- Play in a location
{
pos = {x=1,y=2,z=3},
gain = 1.0, -- default
max_hear_distance = 32, -- default
}
-- Play connected to an object, looped
{
object = <an ObjectRef>,
gain = 1.0, -- default
max_hear_distance = 32, -- default
loop = true, -- only sounds connected to objects can be looped
}
Representations of simple things
--------------------------------
MapNode representation:
{name="name", param1=num, param2=num}
MapNodes do not directly have any other data associated with them.
If you want to access the definition of the node, you access
minetest.registered_nodes[node.name]
param1 and param2 are 8 bit and 4 bit integers, respectively. They
are reserved for certain automated functions. If you don't use these
functions, you can use them to store arbitrary values.
param1 is reserved for the engine when:
paramtype != "none"
param2 is reserved for the engine when any of these are used:
liquidtype == "flowing"
drawtype == "flowingliquid"
drawtype == "torchlike"
drawtype == "signlike"
Position/vector:
{x=num, y=num, z=num}
Currently the API does not provide any helper functions for addition,
subtraction and whatever; you can define those that you need yourself.
stackstring/itemstring: A stack of items in serialized format.
eg. 'default:dirt 5'
eg. 'default:pick_wood 21323'
eg. 'default:apple'
item: A stack of items in Lua table format.
eg. {name="default:dirt", count=5, wear=0, metadata=""}
^ 5 dirt nodes
eg. {name="default:pick_wood", count=1, wear=21323, metadata=""}
^ a wooden pick about 1/3 weared out
eg. {name="default:apple", count=1, wear=0, metadata=""}
^ an apple.
Any time an item must be passed to a function, it can be an
ItemStack (see below), an itemstring or a table in the above format.
SimpleSoundSpec:
eg. ""
eg. "default_place_node"
eg. {}
eg. {name="default_place_node"}
eg. {name="default_place_node", gain=1.0}
Items
------
Node (register_node):
A node from the world
Tool (register_tool):
A tool/weapon that can dig and damage things according to tool_capabilities
Craftitem (register_craftitem):
A miscellaneous item
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. For example:
groups = {crumbly=3, soil=1}
^ Default dirt (soil group actually currently not defined; TODO)
groups = {crumbly=2, soil=1, level=2, outerspace=1}
^ A more special dirt-kind of thing
- 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.
Groups of items
----------------
Groups of items can define what kind of an item it is (eg. wool).
Groups of nodes
----------------
In addition to the general item things, whether a node is diggable and how
long it takes is defined by using groups.
Groups of entities
-------------------
For entities, groups are, as of now, used only for calculating damage.
object.get_armor_groups() -> a group-rating table (eg. {fleshy=3})
object.set_armor_groups({level=2, fleshy=2, cracky=2})
Groups of tools
----------------
Groups in tools define which groups of nodes and entities they are
effective towards.
Groups in crafting recipes
---------------------------
- Not implemented yet. (TODO)
- Will probably look like this:
{
output = 'food:meat_soup_raw',
recipe = {
{'group:meat'},
{'group:water'},
{'group:bowl'},
},
preserve = {'group:bowl'},
}
Special groups
---------------
- immortal: Disables the group damage system for an entity
- level: Can be used to give an additional sense of progression in the game.
- A larger level will cause eg. a weapon of a lower level make much less
damage, and get weared 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
- dig_immediate: (player can always pick up node without tool wear)
- 2: node is removed without tool wear after 0.5 seconds or so
(rail, sign)
- 3: node is removed without tool wear immediately (torch)
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; eg. leaves, small
plants, wire, sheets of metal
- choppy: something that can be cut using force; eg. 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 larger 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 eg. 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.
Also, the **level** group is used.
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.
**Example definition of the digging capabilities of a tool:**
tool_capabilities = {
full_punch_interval=1.5,
max_drop_level=1,
groupcaps={
crumbly={maxwear=0.01, maxlevel=2, times={[1]=0.80, [2]=0.60, [3]=0.40}}
}
}
**Tools define:**
* Full punch interval Maximum drop level For an arbitrary list of groups:
* Maximum level (usually 0, 1, 2 or 3) Maximum wear (0...1) Digging times
**Full punch interval**: When used as a weapon, the tool will do full
damage if this time is spent between punches. If eg. 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. (eg. iron ore to drop a lump of
iron).
**Maximum level** tells what is the maximum level of a node of this group
that the tool will be able to dig.
**Maximum wear** determines how much the tool wears out when it is used for
digging a node, of this group, of the maximum level. For lower leveled
tools, the wear is divided by //4// to the exponent //level difference//.
This means for a maximum wear of 0.1, a level difference 1 will result in
wear=0.1/4=0.025, and a level difference of 2 will result in
wear=0.1/(4*4)=0.00625.
**Digging times** is basically a list of digging times for different
ratings of the group. It also determines the damage done to entities, based
on their "armor groups".
* For example, as a lua table, ''times={2=2.00, 3=0.70}''. This would
* result 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. For
* entities, damage equals the amount of nodes dug in the time spent
* between hits, with a maximum of ''full_punch_interval''.
Entity damage mechanism
------------------------
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 (eg. by defining a sprite animation) (not implemented;
TODO).
The group **immortal** will completely disable normal damage.
Entities can define a special armor group, which is **punch_operable**. This
group will disable the regular damage mechanism for players punching it by hand
or a non-tool item.
On the Lua side, every punch calls ''entity:on_punch(puncher,
time_from_last_punch, tool_capabilities, direction)''. 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.
* ''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.
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'' is nil and ''puncher'' is not nil, ''direction'' will be
automatically filled in based on the location of ''puncher''.
Helper functions
-----------------
dump2(obj, name="_", dumped={})
^ Return object serialized as a string, handles reference loops
dump(obj, dumped={})
^ Return object serialized as a string
minetest namespace reference
-----------------------------
minetest.get_current_modname() -> string
minetest.get_modpath(modname) -> eg. "/home/user/.minetest/usermods/modname"
^ Useful for loading additional .lua modules or static data from mod
minetest.get_worldpath(modname) -> eg. "/home/user/.minetest/world"
^ Useful for storing custom data
minetest.register_entity(name, prototype table)
minetest.register_abm(abm definition)
minetest.register_node(name, node definition)
minetest.register_tool(name, item definition)
minetest.register_craftitem(name, item definition)
minetest.register_alias(name, convert_to)
minetest.register_craft(recipe)
minetest.register_globalstep(func(dtime))
minetest.register_on_placenode(func(pos, newnode, placer))
minetest.register_on_dignode(func(pos, oldnode, digger))
minetest.register_on_punchnode(func(pos, node, puncher))
minetest.register_on_generated(func(minp, maxp))
minetest.register_on_newplayer(func(ObjectRef))
minetest.register_on_dieplayer(func(ObjectRef))
minetest.register_on_respawnplayer(func(ObjectRef))
^ return true in func to disable regular player placement
^ currently called _before_ repositioning of player occurs
minetest.register_on_chat_message(func(name, message))
minetest.add_to_creative_inventory(itemstring)
minetest.setting_get(name) -> string or nil
minetest.setting_getbool(name) -> boolean value or nil
minetest.chat_send_all(text)
minetest.chat_send_player(name, text)
minetest.get_player_privs(name) -> set of privs
minetest.get_inventory(location) -> InvRef
^ location = eg. {type="player", name="celeron55"}
{type="node", pos={x=, y=, z=}}
minetest.sound_play(spec, parameters) -> handle
^ spec = SimpleSoundSpec
^ parameters = sound parameter table
minetest.sound_stop(handle)
minetest.debug(line)
^ Goes to dstream
minetest.log(line)
minetest.log(loglevel, line)
^ loglevel one of "error", "action", "info", "verbose"
Global objects:
minetest.env - environment reference
Global tables:
minetest.registered_items
^ List of registered items, indexed by name
minetest.registered_nodes
^ List of registered node definitions, indexed by name
minetest.registered_craftitems
^ List of registered craft item definitions, indexed by name
minetest.registered_tools
^ List of registered tool definitions, indexed by name
minetest.registered_entities
^ List of registered entity prototypes, indexed by name
minetest.object_refs
^ List of object references, indexed by active object id
minetest.luaentities
^ List of lua entities, indexed by active object id
Deprecated but defined for backwards compatibility:
minetest.digprop_constanttime(time)
minetest.digprop_stonelike(toughness)
minetest.digprop_dirtlike(toughness)
minetest.digprop_gravellike(toughness)
minetest.digprop_woodlike(toughness)
minetest.digprop_leaveslike(toughness)
minetest.digprop_glasslike(toughness)
Class reference
----------------
EnvRef: basically ServerEnvironment and ServerMap combined.
methods:
- add_node(pos, node)
- remove_node(pos)
- get_node(pos)
^ Returns {name="ignore", ...} for unloaded area
- get_node_or_nil(pos)
^ Returns nil for unloaded area
- get_node_light(pos, timeofday) -> 0...15 or nil
^ timeofday: nil = current time, 0 = night, 0.5 = day
- add_entity(pos, name): Returns ObjectRef or nil if failed
- add_item(pos, itemstring)
- add_rat(pos)
- add_firefly(pos)
- get_meta(pos) -- Get a NodeMetaRef at that position
- get_player_by_name(name) -- Get an ObjectRef to a player
- get_objects_inside_radius(pos, radius)
- set_timeofday(val): val: 0...1; 0 = midnight, 0.5 = midday
- get_timeofday()
NodeMetaRef (this stuff is subject to change in a future version)
methods:
- get_type()
- allows_text_input()
- set_text(text) -- eg. set the text of a sign
- get_text()
- get_owner()
- set_owner(string)
Generic node metadata specific:
- set_infotext(infotext)
- get_inventory() -> InvRef
- set_inventory_draw_spec(string)
- set_allow_text_input(bool)
- set_allow_removal(bool)
- set_enforce_owner(bool)
- is_inventory_modified()
- reset_inventory_modified()
- is_text_modified()
- reset_text_modified()
- set_string(name, value)
- get_string(name)
ObjectRef: Moving things in the game are generally these
(basically reference to a C++ ServerActiveObject)
methods:
- remove(): remove object (after returning from Lua)
- getpos() -> {x=num, y=num, z=num}
- setpos(pos); pos={x=num, y=num, z=num}
- moveto(pos, continuous=false): interpolated move
- punch(puncher, time_from_last_punch, tool_capabilities, direction)
^ puncher = an another ObjectRef,
^ time_from_last_punch = time since last punch action of the puncher
- right_click(clicker); clicker = an another ObjectRef
- get_hp(): returns number of hitpoints (2 * number of hearts)
- set_hp(hp): set number of hitpoints (2 * number of hearts)
- get_inventory() -> InvRef
- 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() -> ItemStack
- set_wielded_item(item): replaces the wielded item, returns true if successful
LuaEntitySAO-only: (no-op for other objects)
- setvelocity({x=num, y=num, z=num})
- getvelocity() -> {x=num, y=num, z=num}
- setacceleration({x=num, y=num, z=num})
- getacceleration() -> {x=num, y=num, z=num}
- setyaw(radians)
- getyaw() -> radians
- settexturemod(mod)
- setsprite(p={x=0,y=0}, num_frames=1, framelength=0.2,
- select_horiz_by_yawpitch=false)
- ^ Select sprite from spritesheet with optional animation and DM-style
- texture selection based on yaw relative to camera
- set_armor_groups({group1=rating, group2=rating, ...})
- get_entity_name() (DEPRECATED: Will be removed in a future version)
- get_luaentity()
Player-only: (no-op for other objects)
- get_player_name(): will return nil if is not a player
- get_look_dir(): get camera direction as a unit vector
- get_look_pitch(): pitch in radians
- get_look_yaw(): yaw in radians (wraps around pretty randomly as of now)
InvRef: Reference to an inventory
methods:
- get_size(listname): get size of a list
- set_size(listname, size): set size of a list
- 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)
- 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): returns true if the stack of items
can be fully taken from the list
remove_item(listname, stack): take as many items as specified from the list,
returns the items that were actually removed (as an ItemStack)
ItemStack: A stack of items.
methods:
- is_empty(): return true if stack is empty
- get_name(): returns item name (e.g. "default:stone")
- get_count(): returns number of items on the stack
- get_wear(): returns tool wear (0-65535), 0 for non-tools
- get_metadata(): returns metadata (a string attached to an item stack)
- 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
- add_item(item): put some item or stack onto this stack,
^ returns leftover ItemStack
- item_fits(item): returns true if item or stack can be fully added to this one
- take_item(n): take (and remove) up to n items from this stack
^ returns taken ItemStack
^ if n is omitted, n=1 is used
- peek_item(n): copy (don't remove) up to n items from this stack
^ returns copied ItemStack
^ if n is omitted, n=1 is used
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)
^ Called when the object is instantiated.
- on_step(self, dtime)
^ Called on every server tick (dtime is usually 0.05 seconds)
- on_punch(self, puncher, time_from_last_punch, tool_capabilities, dir)
^ Called when somebody punches the object.
^ Note that you probably want to handle most punches using the
automatic armor group system.
^ puncher: 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.
- on_rightclick(self, clicker)
- get_staticdata(self)
^ Should return a string that will be passed to on_activate when
the object is instantiated the next time.
Definition tables
------------------
Entity definition (register_entity)
{
physical = true,
collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
visual = "cube"/"sprite",
visual_size = {x=1, y=1},
textures = {texture,texture,texture,texture,texture,texture},
spritediv = {x=1, y=1},
initial_sprite_basepos = {x=0, y=0},
on_activate = function(self, staticdata),
on_step = function(self, dtime),
on_punch = function(self, hitter),
on_rightclick = function(self, clicker),
get_staticdata = function(self),
# Also you can define arbitrary member variables here
myvariable = whatever,
}
ABM (ActiveBlockModifier) definition (register_abm)
{
nodenames = {"default:lava_source"},
neighbors = {"default:water_source", "default:water_flowing"}, -- (any of these)
^ If left out or empty, any neighbor will do
interval = 1.0, -- (operation interval)
chance = 1, -- (chance of trigger is 1.0/this)
action = func(pos, node, active_object_count, active_object_count_wider),
}
Item definition (register_node, register_craftitem, register_tool)
{
description = "Steel Axe",
groups = {}, -- key=name, value=rating; rating=1..3.
if rating not applicable, use 1.
eg. {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",
wield_image = "",
wield_scale = {x=1,y=1,z=1},
stack_max = 99,
liquids_pointable = false,
tool_capabilities = {
full_punch_interval = 1.0,
max_drop_level=0,
groupcaps={
-- For example:
fleshy={times={[2]=0.80, [3]=0.40}, maxwear=0.05, maxlevel=1},
snappy={times={[2]=0.80, [3]=0.40}, maxwear=0.05, maxlevel=1},
choppy={times={[3]=0.90}, maxwear=0.05, maxlevel=0}
}
}
on_drop = func(item, dropper, pos),
on_place = func(item, placer, pointed_thing),
on_use = func(item, user, pointed_thing),
}
Node definition (register_node)
{
<all fields allowed in item definitions>,
drawtype = "normal",
visual_scale = 1.0,
tile_images = {"default_unknown_block.png"},
special_materials = {
{image="", backface_culling=true},
{image="", backface_culling=true},
},
alpha = 255,
post_effect_color = {a=0, r=0, g=0, b=0},
paramtype = "none",
paramtype2 = "none",
is_ground_content = false,
sunlight_propagates = false,
walkable = true,
pointable = true,
diggable = true,
climbable = false,
buildable_to = false,
drop = "",
-- alternatively drop = { max_items = ..., items = { ... } }
metadata_name = "",
liquidtype = "none",
liquid_alternative_flowing = "",
liquid_alternative_source = "",
liquid_viscosity = 0,
light_source = 0,
damage_per_second = 0,
selection_box = {type="regular"},
legacy_facedir_simple = false, -- Support maps made in and before January 2012
legacy_wallmounted = false, -- Support maps made in and before January 2012
sounds = {
footstep = <SimpleSoundSpec>,
dig = <SimpleSoundSpec>, -- "__group" = group-based sound (default)
dug = <SimpleSoundSpec>,
},
}
Recipe: (register_craft)
{
output = 'default:pick_stone',
recipe = {
{'default:cobble', 'default:cobble', 'default:cobble'},
{'', 'default:stick', ''},
{'', 'default:stick', ''},
},
replacements = <optional list of item pairs,
replace one input item with another item on crafting>
}
Recipe (shapeless):
{
type = "shapeless",
output = 'mushrooms:mushroom_stew',
recipe = {
"mushrooms:bowl",
"mushrooms:mushroom_brown",
"mushrooms:mushroom_red",
},
replacements = <optional list of item pairs,
replace one input item with another item on crafting>
}
Recipe (tool repair):
{
type = "toolrepair",
additional_wear = -0.02,
}
Recipe (cooking):
{
type = "cooking",
output = "default:glass",
recipe = "default:sand",
cooktime = 3,
}
Recipe (furnace fuel):
{
type = "fuel",
recipe = "default:leaves",
burntime = 1,
}

View File

@@ -1,7 +1,462 @@
I'll try to quickly document the newest block format in here (might contain
errors). Refer to the mapgen or minetestmapper script for the directory
structure and file naming. There are two sector namings possible,
sector/XXXXZZZZ and sector/XXX/ZZZ.
=================================================
Minetest World Format used as of 0.4.dev-20120322
=================================================
This applies to a world format carrying the block serialization version 22
which is used at least in version 0.4.dev-20120322.
The block serialization version used is 22. It does not fully specify every
aspect of this format; if compliance with this format is to be checked, it
needs to be done by detecting if the files and data indeed follows it.
Legacy stuff
=============
Data can, in theory, be contained in the flat file directory structure
described below in Version 17, but it is not officially supported. Also you
may stumble upon all kinds of oddities in not-so-recent formats.
Files
======
Everything is contained in a directory, the name of which is freeform, but
often serves as the name of the world.
Currently the authentication and ban data is stored on a per-world basis. It
can be copied over from an old world to a newly created world.
World
|-- auth.txt ----- Authentication data
|-- env_meta.txt - Environment metadata
|-- ipban.txt ---- Banned ips/users
|-- map_meta.txt - Map metadata
|-- map.sqlite --- Map data
|-- players ------ Player directory
| |-- player1 -- Player file
| '-- Foo ------ Player file
`-- world.mt ----- World metadata
auth.txt
---------
Contains authentication data, player per line.
<name>:<password hash>:<privilege1,...>
Format of password hash is <name><password> SHA1'd, in the base64 encoding.
Example lines:
- Player "celeron55", no password, privileges "interact" and "shout":
celeron55::interact,shout
- Player "Foo", password "bar", privilege "shout":
foo:iEPX+SQWIR3p67lj/0zigSWTKHg:shout
- Player "bar", no password, no privileges:
bar::
env_meta.txt
-------------
Simple global environment variables.
Example content (added indentation):
game_time = 73471
time_of_day = 19118
EnvArgsEnd
ipban.txt
----------
Banned IP addresses and usernames.
Example content (added indentation):
123.456.78.9|foo
123.456.78.10|bar
map_meta.txt
-------------
Simple global map variables.
Example content (added indentation):
seed = 7980462765762429666
[end_of_params]
map.sqlite
-----------
Map data.
See Map File Format below.
player1, Foo
-------------
Player data.
Filename can be anything.
See Player File Format below.
world.mt
---------
World metadata.
Example content (added indentation):
gameid = mesetint
Player File Format
===================
- Should be pretty self-explanatory.
- Note: position is in nodes * 10
Example content (added indentation):
hp = 11
name = celeron55
pitch = 39.77
position = (-5231.97,15,1961.41)
version = 1
yaw = 101.37
PlayerArgsEnd
List main 32
Item default:torch 13
Item default:pick_steel 1 50112
Item experimental:tnt
Item default:cobble 99
Item default:pick_stone 1 13104
Item default:shovel_steel 1 51838
Item default:dirt 61
Item default:rail 78
Item default:coal_lump 3
Item default:cobble 99
Item default:leaves 22
Item default:gravel 52
Item default:axe_steel 1 2045
Item default:cobble 98
Item default:sand 61
Item default:water_source 94
Item default:glass 2
Item default:mossycobble
Item default:pick_steel 1 64428
Item animalmaterials:bone
Item default:sword_steel
Item default:sapling
Item default:sword_stone 1 10647
Item default:dirt 99
Empty
Empty
Empty
Empty
Empty
Empty
Empty
Empty
EndInventoryList
List craft 9
Empty
Empty
Empty
Empty
Empty
Empty
Empty
Empty
Empty
EndInventoryList
List craftpreview 1
Empty
EndInventoryList
List craftresult 1
Empty
EndInventoryList
EndInventory
Map File Format
================
Minetest maps consist of MapBlocks, chunks of 16x16x16 nodes.
In addition to the bulk node data, MapBlocks stored on disk also contain
other things.
History
--------
We need a bit of history in here. Initially Minetest stored maps in a
format called the "sectors" format. It was a directory/file structure like
this:
sectors2/XXX/ZZZ/YYYY
For example, the MapBlock at (0,1,-2) was this file:
sectors2/000/ffd/0001
Eventually Minetest outgrow this directory structure, as filesystems were
struggling under the amount of files and directories.
Large servers seriously needed a new format, and thus the base of the
current format was invented, suggested by celeron55 and implemented by
JacobF.
SQLite3 was slammed in, and blocks files were directly inserted as blobs
in a single table, indexed by integer primary keys, oddly mangled from
coordinates.
Today we know that SQLite3 allows multiple primary keys (which would allow
storing coordinates separately), but the format has been kept unchanged for
that part. So, this is where it has come.
</history>
So here goes
-------------
map.sqlite is an sqlite3 database, containg a single table, called
"blocks". It looks like this:
CREATE TABLE `blocks` (`pos` INT NOT NULL PRIMARY KEY,`data` BLOB);
The key
--------
"pos" is created from the three coordinates of a MapBlock using this
algorithm, defined here in Python:
def getBlockAsInteger(p):
return int64(p[2]*16777216 + p[1]*4096 + p[0])
def int64(u):
while u >= 2**63:
u -= 2**64
while u <= -2**63:
u += 2**64
return u
It can be converted the other way by using this code:
def getIntegerAsBlock(i):
x = unsignedToSigned(i % 4096, 2048)
i = int((i - x) / 4096)
y = unsignedToSigned(i % 4096, 2048)
i = int((i - y) / 4096)
z = unsignedToSigned(i % 4096, 2048)
return x,y,z
def unsignedToSigned(i, max_positive):
if i < max_positive:
return i
else:
return i - 2*max_positive
The blob
---------
The blob is the data that would have otherwise gone into the file.
See below for description.
MapBlock serialization format
==============================
NOTE: Byte order is MSB first (big-endian).
NOTE: Zlib data is in such a format that Python's zlib at least can
directly decompress.
u8 version
- map format version number, this one is version 22
u8 flags
- Flag bitmasks:
- 0x01: is_underground: Should be set to 0 if there will be no light
obstructions above the block. If/when sunlight of a block is updated
and there is no block above it, this value is checked for determining
whether sunlight comes from the top.
- 0x02: day_night_differs: Whether the lighting of the block is different
on day and night. Only blocks that have this bit set are updated when
day transforms to night.
- 0x04: lighting_expired: If true, lighting is invalid and should be
updated. If you can't calculate lighting in your generator properly,
you could try setting this 1 to everything and setting the uppermost
block in every sector as is_underground=0. I am quite sure it doesn't
work properly, though.
- 0x08: generated: True if the block has been generated. If false, block
is mostly filled with CONTENT_IGNORE and is likely to contain eg. parts
of trees of neighboring blocks.
u8 content_width
- Number of bytes in the content (param0) fields of nodes
- Always 1
u8 params_width
- Number of bytes used for parameters per node
- Always 2
zlib-compressed node data:
- content:
u8[4096]: param0 fields
u8[4096]: param1 fields
u8[4096]: param2 fields
- The location of a node in each of those arrays is (z*16*16 + y*16 + x).
zlib-compressed node metadata list
- content:
u16 version (=1)
u16 count of metadata
foreach count:
u16 position (p.Z*MAP_BLOCKSIZE*MAP_BLOCKSIZE + p.Y*MAP_BLOCKSIZE + p.X)
u16 type_id
u16 content_size
u8[content_size] (content of metadata)
u16 mapblockobject_count
- Always 0
- Should be removed in version 23 (TODO)
u8 static object version:
- Always 0
u16 static_object_count
foreach static_object_count:
u8 type (object type-id)
s32 pos_x_nodes * 10000
s32 pos_y_nodes * 10000
s32 pos_z_nodes * 10000
u16 data_size
u8[data_size] data
u32 timestamp
- Timestamp when last saved, as seconds from starting the game.
- 0xffffffff = invalid/unknown timestamp, nothing should be done with the time
difference when loaded
u8 name-id-mapping version
- Always 0
u16 num_name_id_mappings
foreach num_name_id_mappings
u16 id
u16 name_len
u8[name_len] name
EOF.
Format of nodes
----------------
A node is composed of the u8 fields param0, param1 and param2.
The content id of a node is determined as so:
- If param0 < 0x80,
content_id = param0
- Otherwise
content_id = (param0<<4) + (param2>>4)
The purpose of param1 and param2 depend on the definition of the node.
The name-id-mapping
--------------------
The mapping maps node content ids to node names.
Node metadata format
---------------------
1: Generic metadata
serialized inventory
u32 len
u8[len] text
u16 len
u8[len] owner
u16 len
u8[len] infotext
u16 len
u8[len] inventory drawspec
u8 allow_text_input (bool)
u8 removal_disabled (bool)
u8 enforce_owner (bool)
u32 num_vars
foreach num_vars
u16 len
u8[len] name
u32 len
u8[len] value
14: Sign metadata
u16 text_len
u8[text_len] text
15: Chest metadata
serialized inventory
16: Furnace metadata
TBD
17: Locked Chest metadata
u16 len
u8[len] owner
serialized inventory
Static objects
---------------
Static objects are persistent freely moving objects in the world.
Object types:
1: Test object
2: Item
3: Rat (deprecated)
4: Oerkki (deprecated)
5: Firefly (deprecated)
6: MobV2 (deprecated)
7: LuaEntity
1: Item:
u8 version
version 0:
u16 len
u8[len] itemstring
7: LuaEntity:
u8 version
version 1:
u16 len
u8[len] entity name
u32 len
u8[len] static data
s16 hp
s32 velocity.x * 10000
s32 velocity.y * 10000
s32 velocity.z * 10000
s32 yaw * 1000
Itemstring format
------------------
eg. 'default:dirt 5'
eg. 'default:pick_wood 21323'
eg. '"default:apple" 2'
eg. 'default:apple'
- The wear value in tools is 0...65535
- There are also a number of older formats that you might stumble upon:
eg. 'node "default:dirt" 5'
eg. 'NodeItem default:dirt 5'
eg. 'ToolItem WPick 21323'
Inventory serialization format
-------------------------------
- The inventory serialization format is line-based
- The newline character used is "\n"
- The end condition of a serialized inventory is always "EndInventory\n"
- All the slots in a list must always be serialized.
Example (format does not include "---"):
---
List foo 4
Item default:sapling
Item default:sword_stone 1 10647
Item default:dirt 99
Empty
EndInventoryList
List bar 9
Empty
Empty
Empty
Empty
Empty
Empty
Empty
Empty
Empty
EndInventoryList
EndInventory
---
==============================================
Minetest World Format used as of 2011-05 or so
==============================================
Map data serialization format version 17.
0.3.1 does not use this format, but a more recent one. This exists here for
historical reasons.
Directory structure:
sectors/XXXXZZZZ or sectors2/XXX/ZZZ
XXXX, ZZZZ, XXX and ZZZ being the hexadecimal X and Z coordinates.
Under these, the block files are stored, called YYYY.
There also exists files map_meta.txt and chunk_meta, that are used by the
generator. If they are not found or invalid, the generator will currently

View File

@@ -61,9 +61,15 @@ Run dedicated server
\-\-speedtests
Run speed tests
.TP
\-\-verbose
\-\-info
Print more information to console
.TP
\-\-verbose
Print even more information to console
.TP
\-\-trace
Print enormous amounts of information to console
.TP
\-\-world <value>
Set world path

View File

@@ -40,9 +40,15 @@ Same as --world (deprecated)
\-\-port <value>
Set network port (UDP) to use
.TP
\-\-verbose
\-\-info
Print more information to console
.TP
\-\-verbose
Print even more information to console
.TP
\-\-trace
Print enormous amounts of information to console
.TP
\-\-world <value>
Set world path

2
games/minimal/game.conf Normal file
View File

@@ -0,0 +1,2 @@
name = Minimal development test

View File

Before

Width:  |  Height:  |  Size: 329 B

After

Width:  |  Height:  |  Size: 329 B

View File

Before

Width:  |  Height:  |  Size: 363 B

After

Width:  |  Height:  |  Size: 363 B

View File

Before

Width:  |  Height:  |  Size: 369 B

After

Width:  |  Height:  |  Size: 369 B

View File

@@ -1,446 +1,7 @@
-- default (Minetest 0.4 mod)
-- Most default stuff
-- Quick documentation about the API
-- =================================
--
-- Helper functions defined by builtin.lua:
-- dump2(obj, name="_", dumped={})
-- dump(obj, dumped={})
--
-- Mod load path
-- -------------
-- Generic:
-- $path_data/mods/
-- $path_userdata/usermods/
-- $mapdir/worldmods/
--
-- On a run-in-place version (eg. the distributed windows version):
-- minetest-0.4.x/data/mods/
-- minetest-0.4.x/usermods/
-- minetest-0.4.x/world/worldmods/
--
-- On an installed version on linux:
-- /usr/share/minetest/mods/
-- ~/.minetest/usermods
-- ~/.minetest/world/worldmods
--
-- Naming convention for registered textual names
-- ----------------------------------------------
-- "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: mod "experimental", ideal item/node/entity name "tnt":
-- -> 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 mods is required to have "experimental" as a dependency)
--
-- The legacy mod uses ":" for maintaining backwards compatibility.
--
-- Textures
-- --------
-- Mods should generally prefix their textures with modname_, eg. given
-- the mod name "foomod", a texture could be called "default_foomod_superfurnace.png"
--
-- This is not crucial and a conflicting name will not corrupt maps.
--
-- Representations of simple things
-- --------------------------------
--
-- MapNode representation:
-- {name="name", param1=num, param2=num}
--
-- param1 and param2 are 8 bit and 4 bit integers, respectively. They
-- are reserved for certain automated functions. If you don't use these
-- functions, you can use them to store arbitrary values.
--
-- param1 is reserved for the engine when:
-- paramtype != "none"
-- param2 is reserved for the engine when any of these are used:
-- liquidtype == "flowing"
-- drawtype == "flowingliquid"
-- drawtype == "torchlike"
-- drawtype == "signlike"
--
-- Position representation:
-- {x=num, y=num, z=num}
--
-- stackstring/itemstring: A stack of items in serialized format.
-- eg. 'node "default:dirt" 5'
-- eg. 'tool "default:pick_wood" 21323'
-- eg. 'craft "default:apple" 2'
--
-- item: A stack of items in Lua table format.
-- eg. {name="default:dirt", count=1, wear=0, metadata=""}
-- ^ a single dirt node
-- eg. {name="default:pick_wood", count=1, wear=21323, metadata=""}
-- ^ a wooden pick about 1/3 weared out
-- eg. {name="default:apple", count=1, wear=0, metadata=""}
-- ^ an apple.
--
-- Any time an item must be passed to a function, it can be an
-- ItemStack (see below), an itemstring or a table in the above format.
--
-- Global functions:
-- minetest.register_entity(name, prototype table)
-- minetest.register_abm(abm definition)
-- minetest.register_node(name, node definition)
-- minetest.register_tool(name, item definition)
-- minetest.register_craftitem(name, item definition)
-- minetest.register_alias(name, convert_to)
-- minetest.register_craft(recipe)
-- minetest.register_globalstep(func(dtime))
-- minetest.register_on_placenode(func(pos, newnode, placer))
-- minetest.register_on_dignode(func(pos, oldnode, digger))
-- minetest.register_on_punchnode(func(pos, node, puncher))
-- minetest.register_on_generated(func(minp, maxp))
-- minetest.register_on_newplayer(func(ObjectRef))
-- minetest.register_on_dieplayer(func(ObjectRef))
-- minetest.register_on_respawnplayer(func(ObjectRef))
-- ^ return true in func to disable regular player placement
-- ^ currently called _before_ repositioning of player occurs
-- minetest.register_on_chat_message(func(name, message))
-- minetest.add_to_creative_inventory(itemstring)
-- minetest.setting_get(name) -> string or nil
-- minetest.setting_getbool(name) -> boolean value or nil
-- minetest.chat_send_all(text)
-- minetest.chat_send_player(name, text)
-- minetest.get_player_privs(name) -> set of privs
-- minetest.get_inventory(location) -> InvRef
-- ^ location = eg. {type="player", name="celeron55"}
-- {type="node", pos={x=, y=, z=}}
-- minetest.get_current_modname() -> string
-- minetest.get_modpath(modname) -> eg. "/home/user/.minetest/usermods/modname"
-- ^ Useful for loading additional .lua modules or static data from mod
-- minetest.get_worldpath(modname) -> eg. "/home/user/.minetest/world"
-- ^ Useful for storing custom data
--
-- minetest.debug(line)
-- ^ Goes to dstream
-- minetest.log(line)
-- minetest.log(loglevel, line)
-- ^ loglevel one of "error", "action", "info", "verbose"
--
-- minetest.digprop_constanttime(time)
-- minetest.digprop_stonelike(toughness)
-- minetest.digprop_dirtlike(toughness)
-- minetest.digprop_gravellike(toughness)
-- minetest.digprop_woodlike(toughness)
-- minetest.digprop_leaveslike(toughness)
-- minetest.digprop_glasslike(toughness)
--
-- Global objects:
-- minetest.env - environment reference
--
-- Global tables:
-- minetest.registered_items
-- ^ List of registered items, indexed by name
-- minetest.registered_nodes
-- ^ List of registered node definitions, indexed by name
-- minetest.registered_craftitems
-- ^ List of registered craft item definitions, indexed by name
-- minetest.registered_tools
-- ^ List of registered tool definitions, indexed by name
-- minetest.registered_entities
-- ^ List of registered entity prototypes, indexed by name
-- minetest.object_refs
-- ^ List of object references, indexed by active object id
-- minetest.luaentities
-- ^ List of lua entities, indexed by active object id
--
-- EnvRef is basically ServerEnvironment and ServerMap combined.
-- EnvRef methods:
-- - add_node(pos, node)
-- - remove_node(pos)
-- - get_node(pos)
-- ^ Returns {name="ignore", ...} for unloaded area
-- - get_node_or_nil(pos)
-- ^ Returns nil for unloaded area
-- - get_node_light(pos, timeofday) -> 0...15 or nil
-- ^ timeofday: nil = current time, 0 = night, 0.5 = day
-- - add_entity(pos, name): Returns ObjectRef or nil if failed
-- - add_item(pos, itemstring)
-- - add_rat(pos)
-- - add_firefly(pos)
-- - get_meta(pos) -- Get a NodeMetaRef at that position
-- - get_player_by_name(name) -- Get an ObjectRef to a player
-- - get_objects_inside_radius(pos, radius)
-- - set_timeofday(val): val: 0...1; 0 = midnight, 0.5 = midday
-- - get_timeofday()
--
-- NodeMetaRef (this stuff is subject to change in a future version)
-- - get_type()
-- - allows_text_input()
-- - set_text(text) -- eg. set the text of a sign
-- - get_text()
-- - get_owner()
-- - set_owner(string)
-- Generic node metadata specific:
-- - set_infotext(infotext)
-- - get_inventory() -> InvRef
-- - set_inventory_draw_spec(string)
-- - set_allow_text_input(bool)
-- - set_allow_removal(bool)
-- - set_enforce_owner(bool)
-- - is_inventory_modified()
-- - reset_inventory_modified()
-- - is_text_modified()
-- - reset_text_modified()
-- - set_string(name, value)
-- - get_string(name)
--
-- ObjectRef is basically ServerActiveObject.
-- ObjectRef methods:
-- - remove(): remove object (after returning from Lua)
-- - getpos() -> {x=num, y=num, z=num}
-- - setpos(pos); pos={x=num, y=num, z=num}
-- - moveto(pos, continuous=false): interpolated move
-- - punch(puncher, time_from_last_punch, tool_capabilities, direction)
-- ^ puncher = an another ObjectRef,
-- ^ time_from_last_punch = time since last punch action of the puncher
-- - right_click(clicker); clicker = an another ObjectRef
-- - get_hp(): returns number of hitpoints (2 * number of hearts)
-- - set_hp(hp): set number of hitpoints (2 * number of hearts)
-- - get_inventory() -> InvRef
-- - 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() -> ItemStack
-- - set_wielded_item(item): replaces the wielded item, returns true if successful
-- LuaEntitySAO-only: (no-op for other objects)
-- - setvelocity({x=num, y=num, z=num})
-- - getvelocity() -> {x=num, y=num, z=num}
-- - setacceleration({x=num, y=num, z=num})
-- - getacceleration() -> {x=num, y=num, z=num}
-- - setyaw(radians)
-- - getyaw() -> radians
-- - settexturemod(mod)
-- - setsprite(p={x=0,y=0}, num_frames=1, framelength=0.2,
-- - select_horiz_by_yawpitch=false)
-- - ^ Select sprite from spritesheet with optional animation and DM-style
-- - texture selection based on yaw relative to camera
-- - set_armor_groups({group1=rating, group2=rating, ...})
-- - get_entity_name() (DEPRECATED: Will be removed in a future version)
-- - get_luaentity()
-- Player-only: (no-op for other objects)
-- - get_player_name(): will return nil if is not a player
-- - get_look_dir(): get camera direction as a unit vector
-- - get_look_pitch(): pitch in radians
-- - get_look_yaw(): yaw in radians (wraps around pretty randomly as of now)
--
-- InvRef methods:
-- - get_size(listname): get size of a list
-- - set_size(listname, size): set size of a list
-- - 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)
-- - 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): returns true if the stack of items
-- can be fully taken from the list
-- remove_item(listname, stack): take as many items as specified from the list,
-- returns the items that were actually removed (as an ItemStack)
--
-- ItemStack methods:
-- - is_empty(): return true if stack is empty
-- - get_name(): returns item name (e.g. "default:stone")
-- - get_count(): returns number of items on the stack
-- - get_wear(): returns tool wear (0-65535), 0 for non-tools
-- - get_metadata(): returns metadata (a string attached to an item stack)
-- - 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
-- - add_item(item): put some item or stack onto this stack,
-- ^ returns leftover ItemStack
-- - item_fits(item): returns true if item or stack can be fully added to this one
-- - take_item(n): take (and remove) up to n items from this stack
-- ^ returns taken ItemStack
-- ^ if n is omitted, n=1 is used
-- - peek_item(n): copy (don't remove) up to n items from this stack
-- ^ returns copied ItemStack
-- ^ if n is omitted, n=1 is used
--
-- 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)
-- - on_step(self, dtime)
-- - on_punch(self, hitter)
-- - on_rightclick(self, clicker)
-- - get_staticdata(self)
-- ^ return string that will be passed to on_activate when the object
-- is created next time
--
-- Entity prototype table:
-- {
-- physical = true,
-- collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
-- visual = "cube"/"sprite",
-- visual_size = {x=1, y=1},
-- textures = {texture,texture,texture,texture,texture,texture},
-- spritediv = {x=1, y=1},
-- initial_sprite_basepos = {x=0, y=0},
-- on_activate = function(self, staticdata),
-- on_step = function(self, dtime),
-- on_punch = function(self, hitter),
-- on_rightclick = function(self, clicker),
-- get_staticdata = function(self),
-- # Also you can define arbitrary member variables here
-- myvariable = whatever,
-- }
--
-- Item definition options (register_node, register_craftitem, register_tool)
-- {
-- description = "Steel Axe",
-- groups = {}, -- key=name, value=rating; rating=1..3.
-- if rating not applicable, use 1.
-- eg. {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",
-- wield_image = "",
-- wield_scale = {x=1,y=1,z=1},
-- stack_max = 99,
-- liquids_pointable = false,
-- tool_capabilities = {
-- full_punch_interval = 1.0,
-- max_drop_level=0,
-- groupcaps={
-- -- For example:
-- fleshy={times={[2]=0.80, [3]=0.40}, maxwear=0.05, maxlevel=1},
-- snappy={times={[2]=0.80, [3]=0.40}, maxwear=0.05, maxlevel=1},
-- choppy={times={[3]=0.90}, maxwear=0.05, maxlevel=0}
-- }
-- }
-- on_drop = func(item, dropper, pos),
-- on_place = func(item, placer, pointed_thing),
-- on_use = func(item, user, pointed_thing),
-- }
--
-- Node definition options (register_node):
-- {
-- <all fields allowed in item definitions>,
-- drawtype = "normal",
-- visual_scale = 1.0,
-- tile_images = {"default_unknown_block.png"},
-- special_materials = {
-- {image="", backface_culling=true},
-- {image="", backface_culling=true},
-- },
-- alpha = 255,
-- post_effect_color = {a=0, r=0, g=0, b=0},
-- paramtype = "none",
-- paramtype2 = "none",
-- is_ground_content = false,
-- sunlight_propagates = false,
-- walkable = true,
-- pointable = true,
-- diggable = true,
-- climbable = false,
-- buildable_to = false,
-- drop = "",
-- -- alternatively drop = { max_items = ..., items = { ... } }
-- metadata_name = "",
-- liquidtype = "none",
-- liquid_alternative_flowing = "",
-- liquid_alternative_source = "",
-- liquid_viscosity = 0,
-- light_source = 0,
-- damage_per_second = 0,
-- selection_box = {type="regular"},
-- legacy_facedir_simple = false, -- Support maps made in and before January 2012
-- legacy_wallmounted = false, -- Support maps made in and before January 2012
-- }
--
-- Recipe:
-- {
-- output = 'default:pick_stone',
-- recipe = {
-- {'default:cobble', 'default:cobble', 'default:cobble'},
-- {'', 'default:stick', ''},
-- {'', 'default:stick', ''},
-- },
-- replacements = <optional list of item pairs,
-- replace one input item with another item on crafting>
-- }
--
-- Recipe (shapeless):
-- {
-- type = "shapeless",
-- output = 'mushrooms:mushroom_stew',
-- recipe = {
-- "mushrooms:bowl",
-- "mushrooms:mushroom_brown",
-- "mushrooms:mushroom_red",
-- },
-- replacements = <optional list of item pairs,
-- replace one input item with another item on crafting>
-- }
--
-- Recipe (tool repair):
-- {
-- type = "toolrepair",
-- additional_wear = -0.02,
-- }
--
-- Recipe (cooking):
-- {
-- type = "cooking",
-- output = "default:glass",
-- recipe = "default:sand",
-- cooktime = 3,
-- }
--
-- Recipe (furnace fuel):
-- {
-- type = "fuel",
-- recipe = "default:leaves",
-- burntime = 1,
-- }
--
-- ABM (ActiveBlockModifier) definition:
-- {
-- nodenames = {"default:lava_source"},
-- neighbors = {"default:water_source", "default:water_flowing"}, -- (any of these)
-- ^ If left out or empty, any neighbor will do
-- ^ This might get removed in the future
-- interval = 1.0, -- (operation interval)
-- chance = 1, -- (chance of trigger is 1.0/this)
-- action = func(pos, node, active_object_count, active_object_count_wider),
-- }
--
-- Item groups:
-- - Groups always have a rating associated with them. If there is no
-- useful meaning for a rating for a given group, it shall be 1.
-- - When not defined, the rating of a group defaults to 0.
--
-- Special groups:
-- - dig_immediate:
-- - 2: node is removed without tool wear after 1 second or so
-- - 3: node is removed without tool wear immediately (like a torch)
-- - level: Can be used to give an additional sense of progression in the game.
-- - 0 is something that is directly accessible at the start of gameplay
-- The API documentation in here was moved into doc/lua_api.txt
WATER_ALPHA = 160
WATER_VISC = 1
@@ -1062,6 +623,79 @@ minetest.register_craft({
-- Node definitions
--
-- Default node sounds
function default.node_sound_defaults(table)
table = table or {}
table.footstep = table.footstep or
{name="", gain=1.0}
table.dug = table.dug or
{name="default_dug_node", gain=1.0}
return table
end
function default.node_sound_stone_defaults(table)
table = table or {}
table.footstep = table.footstep or
{name="default_hard_footstep", gain=0.2}
default.node_sound_defaults(table)
return table
end
function default.node_sound_dirt_defaults(table)
table = table or {}
table.footstep = table.footstep or
{name="", gain=0.5}
--table.dug = table.dug or
-- {name="default_dirt_break", gain=0.5}
default.node_sound_defaults(table)
return table
end
function default.node_sound_sand_defaults(table)
table = table or {}
table.footstep = table.footstep or
{name="default_grass_footstep", gain=0.25}
--table.dug = table.dug or
-- {name="default_dirt_break", gain=0.25}
table.dug = table.dug or
{name="", gain=0.25}
default.node_sound_defaults(table)
return table
end
function default.node_sound_wood_defaults(table)
table = table or {}
table.footstep = table.footstep or
{name="default_hard_footstep", gain=0.3}
default.node_sound_defaults(table)
return table
end
function default.node_sound_leaves_defaults(table)
table = table or {}
table.footstep = table.footstep or
{name="default_grass_footstep", gain=0.25}
table.dig = table.dig or
{name="default_dig_crumbly", gain=0.4}
table.dug = table.dug or
{name="", gain=1.0}
default.node_sound_defaults(table)
return table
end
function default.node_sound_glass_defaults(table)
table = table or {}
table.footstep = table.footstep or
{name="default_stone_footstep", gain=0.25}
table.dug = table.dug or
{name="default_break_glass", gain=1.0}
default.node_sound_defaults(table)
return table
end
--
minetest.register_node("default:stone", {
description = "Stone",
tile_images = {"default_stone.png"},
@@ -1069,6 +703,7 @@ minetest.register_node("default:stone", {
groups = {cracky=3},
drop = 'default:cobble',
legacy_mineral = true,
sounds = default.node_sound_stone_defaults(),
})
minetest.register_node("default:stone_with_coal", {
@@ -1077,6 +712,7 @@ minetest.register_node("default:stone_with_coal", {
is_ground_content = true,
groups = {cracky=3},
drop = 'default:coal_lump',
sounds = default.node_sound_stone_defaults(),
})
minetest.register_node("default:stone_with_iron", {
@@ -1085,6 +721,7 @@ minetest.register_node("default:stone_with_iron", {
is_ground_content = true,
groups = {cracky=3},
drop = 'default:iron_lump',
sounds = default.node_sound_stone_defaults(),
})
minetest.register_node("default:dirt_with_grass", {
@@ -1093,6 +730,9 @@ minetest.register_node("default:dirt_with_grass", {
is_ground_content = true,
groups = {crumbly=3},
drop = 'default:dirt',
sounds = default.node_sound_dirt_defaults({
footstep = {name="default_grass_footstep", gain=0.4},
}),
})
minetest.register_node("default:dirt_with_grass_footsteps", {
@@ -1101,6 +741,9 @@ minetest.register_node("default:dirt_with_grass_footsteps", {
is_ground_content = true,
groups = {crumbly=3},
drop = 'default:dirt',
sounds = default.node_sound_dirt_defaults({
footstep = {name="default_grass_footstep", gain=0.4},
}),
})
minetest.register_node("default:dirt", {
@@ -1108,6 +751,7 @@ minetest.register_node("default:dirt", {
tile_images = {"default_dirt.png"},
is_ground_content = true,
groups = {crumbly=3},
sounds = default.node_sound_dirt_defaults(),
})
minetest.register_node("default:sand", {
@@ -1115,6 +759,7 @@ minetest.register_node("default:sand", {
tile_images = {"default_sand.png"},
is_ground_content = true,
groups = {crumbly=3},
sounds = default.node_sound_sand_defaults(),
})
minetest.register_node("default:gravel", {
@@ -1122,6 +767,9 @@ minetest.register_node("default:gravel", {
tile_images = {"default_gravel.png"},
is_ground_content = true,
groups = {crumbly=2},
sounds = default.node_sound_dirt_defaults({
footstep = {name="default_gravel_footstep", gain=0.45},
}),
})
minetest.register_node("default:sandstone", {
@@ -1130,6 +778,7 @@ minetest.register_node("default:sandstone", {
is_ground_content = true,
groups = {crumbly=2,cracky=2},
drop = 'default:sand',
sounds = default.node_sound_stone_defaults(),
})
minetest.register_node("default:clay", {
@@ -1138,6 +787,9 @@ minetest.register_node("default:clay", {
is_ground_content = true,
groups = {crumbly=3},
drop = 'default:clay_lump 4',
sounds = default.node_sound_dirt_defaults({
footstep = "",
}),
})
minetest.register_node("default:brick", {
@@ -1146,6 +798,7 @@ minetest.register_node("default:brick", {
is_ground_content = true,
groups = {cracky=3},
drop = 'default:clay_brick 4',
sounds = default.node_sound_stone_defaults(),
})
minetest.register_node("default:tree", {
@@ -1153,6 +806,7 @@ minetest.register_node("default:tree", {
tile_images = {"default_tree_top.png", "default_tree_top.png", "default_tree.png"},
is_ground_content = true,
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=1},
sounds = default.node_sound_wood_defaults(),
})
minetest.register_node("default:jungletree", {
@@ -1160,6 +814,7 @@ minetest.register_node("default:jungletree", {
tile_images = {"default_jungletree_top.png", "default_jungletree_top.png", "default_jungletree.png"},
is_ground_content = true,
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=1},
sounds = default.node_sound_wood_defaults(),
})
minetest.register_node("default:junglegrass", {
@@ -1172,6 +827,7 @@ minetest.register_node("default:junglegrass", {
paramtype = "light",
walkable = false,
groups = {snappy=3},
sounds = default.node_sound_leaves_defaults(),
})
minetest.register_node("default:leaves", {
@@ -1196,6 +852,7 @@ minetest.register_node("default:leaves", {
}
}
},
sounds = default.node_sound_leaves_defaults(),
})
minetest.register_node("default:cactus", {
@@ -1203,6 +860,7 @@ minetest.register_node("default:cactus", {
tile_images = {"default_cactus_top.png", "default_cactus_top.png", "default_cactus_side.png"},
is_ground_content = true,
groups = {snappy=2,choppy=3},
sounds = default.node_sound_wood_defaults(),
})
minetest.register_node("default:papyrus", {
@@ -1215,6 +873,7 @@ minetest.register_node("default:papyrus", {
is_ground_content = true,
walkable = false,
groups = {snappy=3},
sounds = default.node_sound_leaves_defaults(),
})
minetest.register_node("default:bookshelf", {
@@ -1222,6 +881,7 @@ minetest.register_node("default:bookshelf", {
tile_images = {"default_wood.png", "default_wood.png", "default_bookshelf.png"},
is_ground_content = true,
groups = {snappy=2,choppy=3,oddly_breakable_by_hand=2},
sounds = default.node_sound_wood_defaults(),
})
minetest.register_node("default:glass", {
@@ -1233,6 +893,7 @@ minetest.register_node("default:glass", {
sunlight_propagates = true,
is_ground_content = true,
groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3},
sounds = default.node_sound_glass_defaults(),
})
minetest.register_node("default:fence_wood", {
@@ -1248,6 +909,7 @@ minetest.register_node("default:fence_wood", {
fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7},
},
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
sounds = default.node_sound_wood_defaults(),
})
minetest.register_node("default:rail", {
@@ -1285,6 +947,7 @@ minetest.register_node("default:ladder", {
},
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=3},
legacy_wallmounted = true,
sounds = default.node_sound_wood_defaults(),
})
minetest.register_node("default:wood", {
@@ -1292,6 +955,7 @@ minetest.register_node("default:wood", {
tile_images = {"default_wood.png"},
is_ground_content = true,
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
sounds = default.node_sound_wood_defaults(),
})
minetest.register_node("default:mese", {
@@ -1299,12 +963,14 @@ minetest.register_node("default:mese", {
tile_images = {"default_mese.png"},
is_ground_content = true,
groups = {cracky=1},
sounds = default.node_sound_defaults(),
})
minetest.register_node("default:cloud", {
description = "Cloud",
tile_images = {"default_cloud.png"},
is_ground_content = true,
sounds = default.node_sound_defaults(),
})
minetest.register_node("default:water_flowing", {
@@ -1420,6 +1086,7 @@ minetest.register_node("default:torch", {
},
groups = {choppy=2,dig_immediate=3},
legacy_wallmounted = true,
sounds = default.node_sound_defaults(),
})
minetest.register_node("default:sign_wall", {
@@ -1441,6 +1108,7 @@ minetest.register_node("default:sign_wall", {
},
groups = {choppy=2,dig_immediate=2},
legacy_wallmounted = true,
sounds = default.node_sound_defaults(),
})
minetest.register_node("default:chest", {
@@ -1451,6 +1119,7 @@ minetest.register_node("default:chest", {
metadata_name = "chest",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
})
minetest.register_node("default:chest_locked", {
@@ -1461,6 +1130,7 @@ minetest.register_node("default:chest_locked", {
metadata_name = "locked_chest",
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(),
})
minetest.register_node("default:furnace", {
@@ -1471,6 +1141,7 @@ minetest.register_node("default:furnace", {
metadata_name = "furnace",
groups = {cracky=2},
legacy_facedir_simple = true,
sounds = default.node_sound_stone_defaults(),
})
minetest.register_node("default:cobble", {
@@ -1478,6 +1149,7 @@ minetest.register_node("default:cobble", {
tile_images = {"default_cobble.png"},
is_ground_content = true,
groups = {cracky=3},
sounds = default.node_sound_stone_defaults(),
})
minetest.register_node("default:mossycobble", {
@@ -1485,6 +1157,7 @@ minetest.register_node("default:mossycobble", {
tile_images = {"default_mossycobble.png"},
is_ground_content = true,
groups = {cracky=3},
sounds = default.node_sound_stone_defaults(),
})
minetest.register_node("default:steelblock", {
@@ -1492,6 +1165,7 @@ minetest.register_node("default:steelblock", {
tile_images = {"default_steel_block.png"},
is_ground_content = true,
groups = {snappy=1,bendy=2},
sounds = default.node_sound_stone_defaults(),
})
minetest.register_node("default:nyancat", {
@@ -1502,6 +1176,7 @@ minetest.register_node("default:nyancat", {
paramtype2 = "facedir",
groups = {cracky=2},
legacy_facedir_simple = true,
sounds = default.node_sound_defaults(),
})
minetest.register_node("default:nyancat_rainbow", {
@@ -1509,6 +1184,7 @@ minetest.register_node("default:nyancat_rainbow", {
tile_images = {"default_nc_rb.png"},
inventory_image = "default_nc_rb.png",
groups = {cracky=2},
sounds = default.node_sound_defaults(),
})
minetest.register_node("default:sapling", {
@@ -1521,6 +1197,7 @@ minetest.register_node("default:sapling", {
paramtype = "light",
walkable = false,
groups = {snappy=2,dig_immediate=3},
sounds = default.node_sound_defaults(),
})
minetest.register_node("default:apple", {
@@ -1534,6 +1211,7 @@ minetest.register_node("default:apple", {
walkable = false,
groups = {fleshy=3,dig_immediate=3},
on_use = minetest.item_eat(4),
sounds = default.node_sound_defaults(),
})
--

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 203 B

After

Width:  |  Height:  |  Size: 203 B

View File

Before

Width:  |  Height:  |  Size: 292 B

After

Width:  |  Height:  |  Size: 292 B

View File

Before

Width:  |  Height:  |  Size: 597 B

After

Width:  |  Height:  |  Size: 597 B

View File

Before

Width:  |  Height:  |  Size: 604 B

After

Width:  |  Height:  |  Size: 604 B

View File

Before

Width:  |  Height:  |  Size: 279 B

After

Width:  |  Height:  |  Size: 279 B

View File

Before

Width:  |  Height:  |  Size: 236 B

After

Width:  |  Height:  |  Size: 236 B

View File

Before

Width:  |  Height:  |  Size: 167 B

After

Width:  |  Height:  |  Size: 167 B

View File

Before

Width:  |  Height:  |  Size: 224 B

After

Width:  |  Height:  |  Size: 224 B

View File

Before

Width:  |  Height:  |  Size: 151 B

After

Width:  |  Height:  |  Size: 151 B

View File

Before

Width:  |  Height:  |  Size: 142 B

After

Width:  |  Height:  |  Size: 142 B

View File

Before

Width:  |  Height:  |  Size: 613 B

After

Width:  |  Height:  |  Size: 613 B

View File

Before

Width:  |  Height:  |  Size: 249 B

After

Width:  |  Height:  |  Size: 249 B

View File

Before

Width:  |  Height:  |  Size: 210 B

After

Width:  |  Height:  |  Size: 210 B

View File

Before

Width:  |  Height:  |  Size: 118 B

After

Width:  |  Height:  |  Size: 118 B

View File

Before

Width:  |  Height:  |  Size: 933 B

After

Width:  |  Height:  |  Size: 933 B

View File

Before

Width:  |  Height:  |  Size: 830 B

After

Width:  |  Height:  |  Size: 830 B

View File

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

Before

Width:  |  Height:  |  Size: 539 B

After

Width:  |  Height:  |  Size: 539 B

View File

Before

Width:  |  Height:  |  Size: 246 B

After

Width:  |  Height:  |  Size: 246 B

View File

Before

Width:  |  Height:  |  Size: 236 B

After

Width:  |  Height:  |  Size: 236 B

View File

Before

Width:  |  Height:  |  Size: 978 B

After

Width:  |  Height:  |  Size: 978 B

View File

Before

Width:  |  Height:  |  Size: 874 B

After

Width:  |  Height:  |  Size: 874 B

View File

Before

Width:  |  Height:  |  Size: 856 B

After

Width:  |  Height:  |  Size: 856 B

View File

Before

Width:  |  Height:  |  Size: 878 B

After

Width:  |  Height:  |  Size: 878 B

View File

Before

Width:  |  Height:  |  Size: 591 B

After

Width:  |  Height:  |  Size: 591 B

View File

Before

Width:  |  Height:  |  Size: 936 B

After

Width:  |  Height:  |  Size: 936 B

View File

Before

Width:  |  Height:  |  Size: 672 B

After

Width:  |  Height:  |  Size: 672 B

View File

Before

Width:  |  Height:  |  Size: 502 B

After

Width:  |  Height:  |  Size: 502 B

View File

Before

Width:  |  Height:  |  Size: 507 B

After

Width:  |  Height:  |  Size: 507 B

View File

Before

Width:  |  Height:  |  Size: 395 B

After

Width:  |  Height:  |  Size: 395 B

View File

Before

Width:  |  Height:  |  Size: 357 B

After

Width:  |  Height:  |  Size: 357 B

View File

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

Before

Width:  |  Height:  |  Size: 203 B

After

Width:  |  Height:  |  Size: 203 B

View File

Before

Width:  |  Height:  |  Size: 952 B

After

Width:  |  Height:  |  Size: 952 B

View File

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

Before

Width:  |  Height:  |  Size: 965 B

After

Width:  |  Height:  |  Size: 965 B

View File

Before

Width:  |  Height:  |  Size: 303 B

After

Width:  |  Height:  |  Size: 303 B

View File

Before

Width:  |  Height:  |  Size: 410 B

After

Width:  |  Height:  |  Size: 410 B

View File

Before

Width:  |  Height:  |  Size: 203 B

After

Width:  |  Height:  |  Size: 203 B

View File

Before

Width:  |  Height:  |  Size: 260 B

After

Width:  |  Height:  |  Size: 260 B

View File

Before

Width:  |  Height:  |  Size: 242 B

After

Width:  |  Height:  |  Size: 242 B

View File

Before

Width:  |  Height:  |  Size: 366 B

After

Width:  |  Height:  |  Size: 366 B

View File

Before

Width:  |  Height:  |  Size: 507 B

After

Width:  |  Height:  |  Size: 507 B

View File

Before

Width:  |  Height:  |  Size: 555 B

After

Width:  |  Height:  |  Size: 555 B

View File

Before

Width:  |  Height:  |  Size: 545 B

After

Width:  |  Height:  |  Size: 545 B

View File

Before

Width:  |  Height:  |  Size: 542 B

After

Width:  |  Height:  |  Size: 542 B

View File

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

Before

Width:  |  Height:  |  Size: 772 B

After

Width:  |  Height:  |  Size: 772 B

View File

Before

Width:  |  Height:  |  Size: 502 B

After

Width:  |  Height:  |  Size: 502 B

View File

Before

Width:  |  Height:  |  Size: 233 B

After

Width:  |  Height:  |  Size: 233 B

View File

Before

Width:  |  Height:  |  Size: 489 B

After

Width:  |  Height:  |  Size: 489 B

View File

Before

Width:  |  Height:  |  Size: 219 B

After

Width:  |  Height:  |  Size: 219 B

View File

Before

Width:  |  Height:  |  Size: 207 B

After

Width:  |  Height:  |  Size: 207 B

View File

Before

Width:  |  Height:  |  Size: 182 B

After

Width:  |  Height:  |  Size: 182 B

View File

Before

Width:  |  Height:  |  Size: 806 B

After

Width:  |  Height:  |  Size: 806 B

View File

Before

Width:  |  Height:  |  Size: 161 B

After

Width:  |  Height:  |  Size: 161 B

View File

Before

Width:  |  Height:  |  Size: 186 B

After

Width:  |  Height:  |  Size: 186 B

View File

Before

Width:  |  Height:  |  Size: 264 B

After

Width:  |  Height:  |  Size: 264 B

View File

Before

Width:  |  Height:  |  Size: 252 B

After

Width:  |  Height:  |  Size: 252 B

View File

Before

Width:  |  Height:  |  Size: 927 B

After

Width:  |  Height:  |  Size: 927 B

View File

Before

Width:  |  Height:  |  Size: 271 B

After

Width:  |  Height:  |  Size: 271 B

View File

Before

Width:  |  Height:  |  Size: 216 B

After

Width:  |  Height:  |  Size: 216 B

View File

Before

Width:  |  Height:  |  Size: 291 B

After

Width:  |  Height:  |  Size: 291 B

View File

Before

Width:  |  Height:  |  Size: 931 B

After

Width:  |  Height:  |  Size: 931 B

View File

Before

Width:  |  Height:  |  Size: 262 B

After

Width:  |  Height:  |  Size: 262 B

View File

Before

Width:  |  Height:  |  Size: 203 B

After

Width:  |  Height:  |  Size: 203 B

View File

Before

Width:  |  Height:  |  Size: 301 B

After

Width:  |  Height:  |  Size: 301 B

View File

Before

Width:  |  Height:  |  Size: 927 B

After

Width:  |  Height:  |  Size: 927 B

View File

Before

Width:  |  Height:  |  Size: 245 B

After

Width:  |  Height:  |  Size: 245 B

View File

Before

Width:  |  Height:  |  Size: 203 B

After

Width:  |  Height:  |  Size: 203 B

View File

Before

Width:  |  Height:  |  Size: 255 B

After

Width:  |  Height:  |  Size: 255 B

View File

Before

Width:  |  Height:  |  Size: 925 B

After

Width:  |  Height:  |  Size: 925 B

View File

Before

Width:  |  Height:  |  Size: 913 B

After

Width:  |  Height:  |  Size: 913 B

View File

Before

Width:  |  Height:  |  Size: 917 B

After

Width:  |  Height:  |  Size: 917 B

View File

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

Before

Width:  |  Height:  |  Size: 518 B

After

Width:  |  Height:  |  Size: 518 B

View File

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

Before

Width:  |  Height:  |  Size: 308 B

After

Width:  |  Height:  |  Size: 308 B

View File

Before

Width:  |  Height:  |  Size: 212 B

After

Width:  |  Height:  |  Size: 212 B

View File

Before

Width:  |  Height:  |  Size: 201 B

After

Width:  |  Height:  |  Size: 201 B

View File

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

Before

Width:  |  Height:  |  Size: 384 B

After

Width:  |  Height:  |  Size: 384 B

Some files were not shown because too many files have changed in this diff Show More