Compare commits
238 Commits
0.4.dev-20
...
0.4.dev-20
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fb3ac49335 | ||
|
|
c54a40df06 | ||
|
|
9c4f68e174 | ||
|
|
4ee4dfdc13 | ||
|
|
2e0c0e9d89 | ||
|
|
db5db587be | ||
|
|
569fca5308 | ||
|
|
b409803527 | ||
|
|
99d257ae8b | ||
|
|
2f2b7915ea | ||
|
|
c1cfcb1577 | ||
|
|
2e90ed07ac | ||
|
|
58bed83d03 | ||
|
|
54917e3062 | ||
|
|
81385682c8 | ||
|
|
807a0d313b | ||
|
|
f9a66c5d46 | ||
|
|
60add387e3 | ||
|
|
ca0fd4173c | ||
|
|
4aa0f040fb | ||
|
|
5957fed9a7 | ||
|
|
6298878bfa | ||
|
|
899004207d | ||
|
|
2b200d481f | ||
|
|
8551ddc839 | ||
|
|
eea3277b81 | ||
|
|
11b86f8d8a | ||
|
|
71a3c2fcd1 | ||
|
|
4ff36696ea | ||
|
|
800d3b4ee7 | ||
|
|
a0b2c7ba25 | ||
|
|
64232f0aec | ||
|
|
591527d878 | ||
|
|
82073025cc | ||
|
|
2c9bb06516 | ||
|
|
18c4a90101 | ||
|
|
5a8ee4889d | ||
|
|
ea1fdf3201 | ||
|
|
2e61008fd9 | ||
|
|
eafde7186f | ||
|
|
a72dc388c3 | ||
|
|
618314985d | ||
|
|
d1d83d7e7f | ||
|
|
bcaab74f1f | ||
|
|
1b670a293b | ||
|
|
45f78bdf40 | ||
|
|
54eca4e736 | ||
|
|
3da05a09b5 | ||
|
|
f79082a46d | ||
|
|
e71d75ed9a | ||
|
|
a4a35f659b | ||
|
|
9eba6a349f | ||
|
|
6a1b6d0344 | ||
|
|
7f7fb9750d | ||
|
|
df190b8f87 | ||
|
|
af33b3b338 | ||
|
|
a87d19cd7e | ||
|
|
611fe41588 | ||
|
|
8b6cce18cb | ||
|
|
d330430336 | ||
|
|
37b2bc3c0c | ||
|
|
f49914dd17 | ||
|
|
f1d9880006 | ||
|
|
6ec447a1aa | ||
|
|
b485fac33e | ||
|
|
98404ad8ea | ||
|
|
e1f5227304 | ||
|
|
2de8f915f8 | ||
|
|
967f25461b | ||
|
|
0053651814 | ||
|
|
7d36833bd4 | ||
|
|
1bbfd0b6d2 | ||
|
|
4547ace59a | ||
|
|
d74659254b | ||
|
|
55d310b05a | ||
|
|
15da308c2a | ||
|
|
e80bc6ef58 | ||
|
|
d81e783665 | ||
|
|
030b63c3d2 | ||
|
|
f3dba05143 | ||
|
|
1020707918 | ||
|
|
c89d1cf072 | ||
|
|
9c5e422d3a | ||
|
|
5e00141005 | ||
|
|
fa70413c82 | ||
|
|
06d2bc7fbd | ||
|
|
1ae9e0afa1 | ||
|
|
f9da2c9507 | ||
|
|
989aba1966 | ||
|
|
6b7d6c27ee | ||
|
|
8db89b8136 | ||
|
|
8c01ad8a9d | ||
|
|
f60a5ec08f | ||
|
|
501b8fe743 | ||
|
|
e9cdb938fe | ||
|
|
f1cb91cd93 | ||
|
|
910186905f | ||
|
|
07ed57476f | ||
|
|
0b21618a05 | ||
|
|
b49a7c140e | ||
|
|
562ac3bce9 | ||
|
|
f21291211c | ||
|
|
d834d6e074 | ||
|
|
11716825fc | ||
|
|
0309021359 | ||
|
|
14a71590c3 | ||
|
|
a5f6d65c37 | ||
|
|
79326e6287 | ||
|
|
c8ec711503 | ||
|
|
0f8b91bfba | ||
|
|
b7fd3c8669 | ||
|
|
b3f4cbe157 | ||
|
|
d0491ce8b6 | ||
|
|
806f10524f | ||
|
|
50110e00e8 | ||
|
|
3a89c40e26 | ||
|
|
ff678d1607 | ||
|
|
abab3db23d | ||
|
|
496451c164 | ||
|
|
993821a924 | ||
|
|
ad5ac22442 | ||
|
|
94b25685c5 | ||
|
|
88cdd3a363 | ||
|
|
e15de8b70d | ||
|
|
61016962ee | ||
|
|
a1eb2836c0 | ||
|
|
64af6d3afe | ||
|
|
365f7a5bfe | ||
|
|
796009ef21 | ||
|
|
b85b4ede82 | ||
|
|
2cb96d9d68 | ||
|
|
78bf92175a | ||
|
|
0c3d39357b | ||
|
|
0e8bd531c2 | ||
|
|
ac69a3561a | ||
|
|
24b1008d56 | ||
|
|
a4340c330a | ||
|
|
2e8e9ee7f5 | ||
|
|
cb05a28745 | ||
|
|
a387c9b95d | ||
|
|
0a426f3592 | ||
|
|
00bc9a8678 | ||
|
|
c241902b40 | ||
|
|
4799a8f761 | ||
|
|
02b334a679 | ||
|
|
b4dd5d3bd7 | ||
|
|
1efdc36b22 | ||
|
|
157a4cf18c | ||
|
|
f22c73f501 | ||
|
|
c920df748b | ||
|
|
a58d725569 | ||
|
|
6a76c226e1 | ||
|
|
569156b013 | ||
|
|
6d4bc012f0 | ||
|
|
2f5c28aaf1 | ||
|
|
4f2c1e36a1 | ||
|
|
bc743ca7ce | ||
|
|
f9d7e399b2 | ||
|
|
3e6f824e6c | ||
|
|
6286c555d4 | ||
|
|
4630281318 | ||
|
|
cd0019acd2 | ||
|
|
e82a76e438 | ||
|
|
ab57fbe4ca | ||
|
|
56f55ab1af | ||
|
|
2445cbbbdc | ||
|
|
48131bf988 | ||
|
|
2b9596fe9b | ||
|
|
0e1f448b61 | ||
|
|
ff82b95800 | ||
|
|
49b7055cb3 | ||
|
|
cb88f7b6d4 | ||
|
|
9425fb8192 | ||
|
|
e48ccd7943 | ||
|
|
6be5441176 | ||
|
|
d5ba7ebaf0 | ||
|
|
270a482740 | ||
|
|
e0b4890794 | ||
|
|
247e8b6e5d | ||
|
|
b760e2ba23 | ||
|
|
103173fc9b | ||
|
|
70ed371d0c | ||
|
|
81d3485109 | ||
|
|
7b7b68cdab | ||
|
|
135a65e200 | ||
|
|
123529e5eb | ||
|
|
e81989a0d8 | ||
|
|
1c15f53318 | ||
|
|
7937813c98 | ||
|
|
ad4040d982 | ||
|
|
69579306dd | ||
|
|
bd21f00f0a | ||
|
|
012bcbcb48 | ||
|
|
e06d4555bf | ||
|
|
abd106bacb | ||
|
|
008de2fb8f | ||
|
|
2e67fa3e48 | ||
|
|
ea36951bc4 | ||
|
|
09c48b60bd | ||
|
|
4cc117ddf6 | ||
|
|
ceaf8edade | ||
|
|
520200d597 | ||
|
|
ab67985d21 | ||
|
|
bc5cc638fc | ||
|
|
bff8be8b76 | ||
|
|
3e95b8a158 | ||
|
|
e8539d4dae | ||
|
|
1907b31da7 | ||
|
|
6145a135bd | ||
|
|
97c3bc408b | ||
|
|
a00e908f52 | ||
|
|
4ad8891e05 | ||
|
|
2b8b2a4f30 | ||
|
|
5c24450e54 | ||
|
|
3a689a5c4f | ||
|
|
44e36d9aad | ||
|
|
62f7f72d20 | ||
|
|
829c632511 | ||
|
|
8730dfb1f9 | ||
|
|
6764365994 | ||
|
|
8addbc9655 | ||
|
|
658d1a7235 | ||
|
|
4b00d4d9d2 | ||
|
|
6a5829788e | ||
|
|
03074cd23e | ||
|
|
2620e8eada | ||
|
|
9b5e676ffa | ||
|
|
fd1ef11617 | ||
|
|
9fa567a6ce | ||
|
|
fc6c00cbe1 | ||
|
|
66f90a6101 | ||
|
|
1fe5c58d56 | ||
|
|
f23616acaf | ||
|
|
7d37913ea4 | ||
|
|
ac56053c74 | ||
|
|
d566ffaa5f | ||
|
|
d06d7cb9a4 | ||
|
|
e494b5d422 |
1
.gitignore
vendored
@@ -1,3 +1,4 @@
|
|||||||
|
*~
|
||||||
map/*
|
map/*
|
||||||
world/*
|
world/*
|
||||||
CMakeFiles/*
|
CMakeFiles/*
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ project(minetest)
|
|||||||
# Also remember to set PROTOCOL_VERSION in clientserver.h when releasing
|
# Also remember to set PROTOCOL_VERSION in clientserver.h when releasing
|
||||||
set(VERSION_MAJOR 0)
|
set(VERSION_MAJOR 0)
|
||||||
set(VERSION_MINOR 4)
|
set(VERSION_MINOR 4)
|
||||||
set(VERSION_PATCH dev-20111203-3)
|
set(VERSION_PATCH dev-20120318)
|
||||||
set(VERSION_STRING "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")
|
set(VERSION_STRING "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")
|
||||||
|
|
||||||
MESSAGE(STATUS "*** Will build version ${VERSION_STRING} ***")
|
MESSAGE(STATUS "*** Will build version ${VERSION_STRING} ***")
|
||||||
@@ -49,26 +49,44 @@ find_package(Irrlicht)
|
|||||||
#
|
#
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
set(DATADIR "data")
|
set(SHAREDIR "share")
|
||||||
set(BINDIR "bin")
|
set(BINDIR "bin")
|
||||||
set(DOCDIR "doc")
|
set(DOCDIR "doc")
|
||||||
set(EXAMPLE_CONF_DIR ".")
|
set(EXAMPLE_CONF_DIR "user")
|
||||||
elseif(APPLE)
|
elseif(APPLE)
|
||||||
# random placeholders
|
# random placeholders
|
||||||
set(DATADIR "share/${PROJECT_NAME}")
|
set(SHAREDIR "share/${PROJECT_NAME}")
|
||||||
set(BINDIR "bin")
|
set(BINDIR "bin")
|
||||||
set(DOCDIR "share/doc/${PROJECT_NAME}")
|
set(DOCDIR "share/doc/${PROJECT_NAME}")
|
||||||
set(EXAMPLE_CONF_DIR ".")
|
set(EXAMPLE_CONF_DIR ${DOCDIR})
|
||||||
elseif(UNIX) # Linux, BSD etc
|
elseif(UNIX) # Linux, BSD etc
|
||||||
set(DATADIR "share/${PROJECT_NAME}")
|
if(RUN_IN_PLACE)
|
||||||
set(BINDIR "bin")
|
set(SHAREDIR "share")
|
||||||
set(DOCDIR "share/doc/${PROJECT_NAME}")
|
set(BINDIR "bin")
|
||||||
set(EXAMPLE_CONF_DIR "share/doc/${PROJECT_NAME}")
|
set(DOCDIR "doc")
|
||||||
|
set(MANDIR "share/unix/man")
|
||||||
|
set(EXAMPLE_CONF_DIR ${DOCDIR})
|
||||||
|
set(XDG_APPS_DIR "share/unix/applications")
|
||||||
|
set(ICONDIR "share/unix/icons")
|
||||||
|
else()
|
||||||
|
set(SHAREDIR "share/${PROJECT_NAME}")
|
||||||
|
set(BINDIR "bin")
|
||||||
|
set(DOCDIR "share/doc/${PROJECT_NAME}")
|
||||||
|
set(MANDIR "share/man")
|
||||||
|
set(EXAMPLE_CONF_DIR ${DOCDIR})
|
||||||
|
set(XDG_APPS_DIR "share/applications")
|
||||||
|
set(ICONDIR "share/icons")
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
install(FILES "README.txt" DESTINATION "${DOCDIR}")
|
install(FILES "README.txt" DESTINATION "${DOCDIR}")
|
||||||
install(FILES "doc/changelog.txt" DESTINATION "${DOCDIR}")
|
install(FILES "minetest.conf.example" DESTINATION "${EXAMPLE_CONF_DIR}")
|
||||||
install(FILES "minetest.conf.example" DESTINATION "${DOCDIR}")
|
|
||||||
|
if(UNIX)
|
||||||
|
install(FILES "doc/minetest.6" "doc/minetestserver.6" DESTINATION "${MANDIR}/man6")
|
||||||
|
install(FILES "misc/minetest.desktop" DESTINATION "${XDG_APPS_DIR}")
|
||||||
|
install(FILES "minetest-icon.svg" DESTINATION "${ICONDIR}/hicolor/scalable/apps")
|
||||||
|
endif()
|
||||||
|
|
||||||
#
|
#
|
||||||
# Subdirectories
|
# Subdirectories
|
||||||
|
|||||||
18
README.txt
@@ -277,3 +277,21 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|||||||
IN THE SOFTWARE.
|
IN THE SOFTWARE.
|
||||||
|
|
||||||
|
|
||||||
|
Fonts
|
||||||
|
---------------
|
||||||
|
|
||||||
|
DejaVu Sans Mono:
|
||||||
|
|
||||||
|
Fonts are (c) Bitstream (see below). DejaVu changes are in public domain.
|
||||||
|
Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below)
|
||||||
|
|
||||||
|
Bitstream Vera Fonts Copyright:
|
||||||
|
|
||||||
|
Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is
|
||||||
|
a trademark of Bitstream, Inc.
|
||||||
|
|
||||||
|
Arev Fonts Copyright:
|
||||||
|
|
||||||
|
Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved.
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
372
data/builtin.lua
@@ -1,372 +0,0 @@
|
|||||||
--
|
|
||||||
-- This file contains built-in stuff in Minetest implemented in Lua.
|
|
||||||
--
|
|
||||||
-- It is always loaded and executed after registration of the C API,
|
|
||||||
-- before loading and running any mods.
|
|
||||||
--
|
|
||||||
|
|
||||||
function basic_dump2(o)
|
|
||||||
if type(o) == "number" then
|
|
||||||
return tostring(o)
|
|
||||||
elseif type(o) == "string" then
|
|
||||||
return string.format("%q", o)
|
|
||||||
elseif type(o) == "boolean" then
|
|
||||||
return tostring(o)
|
|
||||||
elseif type(o) == "function" then
|
|
||||||
return "<function>"
|
|
||||||
elseif type(o) == "userdata" then
|
|
||||||
return "<userdata>"
|
|
||||||
elseif type(o) == "nil" then
|
|
||||||
return "nil"
|
|
||||||
else
|
|
||||||
error("cannot dump a " .. type(o))
|
|
||||||
return nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function dump2(o, name, dumped)
|
|
||||||
name = name or "_"
|
|
||||||
dumped = dumped or {}
|
|
||||||
io.write(name, " = ")
|
|
||||||
if type(o) == "number" or type(o) == "string" or type(o) == "boolean"
|
|
||||||
or type(o) == "function" or type(o) == "nil"
|
|
||||||
or type(o) == "userdata" then
|
|
||||||
io.write(basic_dump2(o), "\n")
|
|
||||||
elseif type(o) == "table" then
|
|
||||||
if dumped[o] then
|
|
||||||
io.write(dumped[o], "\n")
|
|
||||||
else
|
|
||||||
dumped[o] = name
|
|
||||||
io.write("{}\n") -- new table
|
|
||||||
for k,v in pairs(o) do
|
|
||||||
local fieldname = string.format("%s[%s]", name, basic_dump2(k))
|
|
||||||
dump2(v, fieldname, dumped)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
else
|
|
||||||
error("cannot dump a " .. type(o))
|
|
||||||
return nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function dump(o, dumped)
|
|
||||||
dumped = dumped or {}
|
|
||||||
if type(o) == "number" then
|
|
||||||
return tostring(o)
|
|
||||||
elseif type(o) == "string" then
|
|
||||||
return string.format("%q", o)
|
|
||||||
elseif type(o) == "table" then
|
|
||||||
if dumped[o] then
|
|
||||||
return "<circular reference>"
|
|
||||||
end
|
|
||||||
dumped[o] = true
|
|
||||||
local t = {}
|
|
||||||
for k,v in pairs(o) do
|
|
||||||
t[#t+1] = "" .. k .. " = " .. dump(v, dumped)
|
|
||||||
end
|
|
||||||
return "{" .. table.concat(t, ", ") .. "}"
|
|
||||||
elseif type(o) == "boolean" then
|
|
||||||
return tostring(o)
|
|
||||||
elseif type(o) == "function" then
|
|
||||||
return "<function>"
|
|
||||||
elseif type(o) == "userdata" then
|
|
||||||
return "<userdata>"
|
|
||||||
elseif type(o) == "nil" then
|
|
||||||
return "nil"
|
|
||||||
else
|
|
||||||
error("cannot dump a " .. type(o))
|
|
||||||
return nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Built-in node definitions. Also defined in C.
|
|
||||||
--
|
|
||||||
|
|
||||||
minetest.register_nodedef_defaults({
|
|
||||||
-- name intentionally not defined here
|
|
||||||
drawtype = "normal",
|
|
||||||
visual_scale = 1.0,
|
|
||||||
tile_images = {"unknown_block.png"},
|
|
||||||
inventory_image = "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",
|
|
||||||
is_ground_content = false,
|
|
||||||
light_propagates = false,
|
|
||||||
sunlight_propagates = false,
|
|
||||||
walkable = true,
|
|
||||||
pointable = true,
|
|
||||||
diggable = true,
|
|
||||||
climbable = false,
|
|
||||||
buildable_to = false,
|
|
||||||
wall_mounted = false,
|
|
||||||
often_contains_mineral = false,
|
|
||||||
dug_item = "",
|
|
||||||
extra_dug_item = "",
|
|
||||||
extra_dug_item_rarity = 2,
|
|
||||||
metadata_name = "",
|
|
||||||
liquidtype = "none",
|
|
||||||
liquid_alternative_flowing = "",
|
|
||||||
liquid_alternative_source = "",
|
|
||||||
liquid_viscosity = 0,
|
|
||||||
light_source = 0,
|
|
||||||
damage_per_second = 0,
|
|
||||||
selection_box = {type="regular"},
|
|
||||||
material = {
|
|
||||||
diggablity = "normal",
|
|
||||||
weight = 0,
|
|
||||||
crackiness = 0,
|
|
||||||
crumbliness = 0,
|
|
||||||
cuttability = 0,
|
|
||||||
flammability = 0,
|
|
||||||
},
|
|
||||||
cookresult_item = "", -- Cannot be cooked
|
|
||||||
furnace_cooktime = 3.0,
|
|
||||||
furnace_burntime = -1, -- Cannot be used as fuel
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_node("air", {
|
|
||||||
drawtype = "airlike",
|
|
||||||
paramtype = "light",
|
|
||||||
light_propagates = true,
|
|
||||||
sunlight_propagates = true,
|
|
||||||
walkable = false,
|
|
||||||
pointable = false,
|
|
||||||
diggable = false,
|
|
||||||
buildable_to = true,
|
|
||||||
air_equivalent = true,
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_node("ignore", {
|
|
||||||
drawtype = "airlike",
|
|
||||||
paramtype = "none",
|
|
||||||
light_propagates = false,
|
|
||||||
sunlight_propagates = false,
|
|
||||||
walkable = false,
|
|
||||||
pointable = false,
|
|
||||||
diggable = false,
|
|
||||||
buildable_to = true, -- A way to remove accidentally placed ignores
|
|
||||||
air_equivalent = true,
|
|
||||||
})
|
|
||||||
|
|
||||||
--
|
|
||||||
-- stackstring manipulation functions
|
|
||||||
-- example stackstring: 'craft "apple" 4'
|
|
||||||
-- example item: {type="craft", name="apple"}
|
|
||||||
-- example item: {type="tool", name="SteelPick", wear="23272"}
|
|
||||||
--
|
|
||||||
|
|
||||||
function stackstring_take_item(stackstring)
|
|
||||||
if stackstring == nil then
|
|
||||||
return '', nil
|
|
||||||
end
|
|
||||||
local stacktype = nil
|
|
||||||
stacktype = string.match(stackstring,
|
|
||||||
'([%a%d]+)')
|
|
||||||
if stacktype == "node" or stacktype == "craft" then
|
|
||||||
local itemtype = nil
|
|
||||||
local itemname = nil
|
|
||||||
local itemcount = nil
|
|
||||||
itemtype, itemname, itemcount = string.match(stackstring,
|
|
||||||
'([%a%d]+) "([^"]*)" (%d+)')
|
|
||||||
itemcount = tonumber(itemcount)
|
|
||||||
if itemcount == 0 then
|
|
||||||
return '', nil
|
|
||||||
elseif itemcount == 1 then
|
|
||||||
return '', {type=itemtype, name=itemname}
|
|
||||||
else
|
|
||||||
return itemtype.." \""..itemname.."\" "..(itemcount-1),
|
|
||||||
{type=itemtype, name=itemname}
|
|
||||||
end
|
|
||||||
elseif stacktype == "tool" then
|
|
||||||
local itemtype = nil
|
|
||||||
local itemname = nil
|
|
||||||
local itemwear = nil
|
|
||||||
itemtype, itemname, itemwear = string.match(stackstring,
|
|
||||||
'([%a%d]+) "([^"]*)" (%d+)')
|
|
||||||
itemwear = tonumber(itemwear)
|
|
||||||
return '', {type=itemtype, name=itemname, wear=itemwear}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function stackstring_put_item(stackstring, item)
|
|
||||||
if item == nil then
|
|
||||||
return stackstring, false
|
|
||||||
end
|
|
||||||
stackstring = stackstring or ''
|
|
||||||
local stacktype = nil
|
|
||||||
stacktype = string.match(stackstring,
|
|
||||||
'([%a%d]+)')
|
|
||||||
stacktype = stacktype or ''
|
|
||||||
if stacktype ~= '' and stacktype ~= item.type then
|
|
||||||
return stackstring, false
|
|
||||||
end
|
|
||||||
if item.type == "node" or item.type == "craft" then
|
|
||||||
local itemtype = nil
|
|
||||||
local itemname = nil
|
|
||||||
local itemcount = nil
|
|
||||||
itemtype, itemname, itemcount = string.match(stackstring,
|
|
||||||
'([%a%d]+) "([^"]*)" (%d+)')
|
|
||||||
itemtype = itemtype or item.type
|
|
||||||
itemname = itemname or item.name
|
|
||||||
if itemcount == nil then
|
|
||||||
itemcount = 0
|
|
||||||
end
|
|
||||||
itemcount = itemcount + 1
|
|
||||||
return itemtype.." \""..itemname.."\" "..itemcount, true
|
|
||||||
elseif item.type == "tool" then
|
|
||||||
if stacktype ~= nil then
|
|
||||||
return stackstring, false
|
|
||||||
end
|
|
||||||
local itemtype = nil
|
|
||||||
local itemname = nil
|
|
||||||
local itemwear = nil
|
|
||||||
itemtype, itemname, itemwear = string.match(stackstring,
|
|
||||||
'([%a%d]+) "([^"]*)" (%d+)')
|
|
||||||
itemwear = tonumber(itemwear)
|
|
||||||
return itemtype.." \""..itemname.."\" "..itemwear, true
|
|
||||||
end
|
|
||||||
return stackstring, false
|
|
||||||
end
|
|
||||||
|
|
||||||
function stackstring_put_stackstring(stackstring, src)
|
|
||||||
while src ~= '' do
|
|
||||||
--print("src="..dump(src))
|
|
||||||
src, item = stackstring_take_item(src)
|
|
||||||
--print("src="..dump(src).." item="..dump(item))
|
|
||||||
local success
|
|
||||||
stackstring, success = stackstring_put_item(stackstring, item)
|
|
||||||
if not success then
|
|
||||||
return stackstring, false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return stackstring, true
|
|
||||||
end
|
|
||||||
|
|
||||||
function test_stackstring()
|
|
||||||
local stack
|
|
||||||
local item
|
|
||||||
local success
|
|
||||||
|
|
||||||
stack, item = stackstring_take_item('node "TNT" 3')
|
|
||||||
assert(stack == 'node "TNT" 2')
|
|
||||||
assert(item.type == 'node')
|
|
||||||
assert(item.name == 'TNT')
|
|
||||||
|
|
||||||
stack, item = stackstring_take_item('craft "with spaces" 2')
|
|
||||||
assert(stack == 'craft "with spaces" 1')
|
|
||||||
assert(item.type == 'craft')
|
|
||||||
assert(item.name == 'with spaces')
|
|
||||||
|
|
||||||
stack, item = stackstring_take_item('craft "with spaces" 1')
|
|
||||||
assert(stack == '')
|
|
||||||
assert(item.type == 'craft')
|
|
||||||
assert(item.name == 'with spaces')
|
|
||||||
|
|
||||||
stack, item = stackstring_take_item('craft "s8df2kj3" 0')
|
|
||||||
assert(stack == '')
|
|
||||||
assert(item == nil)
|
|
||||||
|
|
||||||
stack, item = stackstring_take_item('tool "With Spaces" 32487')
|
|
||||||
assert(stack == '')
|
|
||||||
assert(item.type == 'tool')
|
|
||||||
assert(item.name == 'With Spaces')
|
|
||||||
assert(item.wear == 32487)
|
|
||||||
|
|
||||||
stack, success = stackstring_put_item('node "With Spaces" 40',
|
|
||||||
{type='node', name='With Spaces'})
|
|
||||||
assert(stack == 'node "With Spaces" 41')
|
|
||||||
assert(success == true)
|
|
||||||
|
|
||||||
stack, success = stackstring_put_item('craft "With Spaces" 40',
|
|
||||||
{type='craft', name='With Spaces'})
|
|
||||||
assert(stack == 'craft "With Spaces" 41')
|
|
||||||
assert(success == true)
|
|
||||||
|
|
||||||
stack, success = stackstring_put_item('tool "With Spaces" 32487',
|
|
||||||
{type='tool', name='With Spaces'})
|
|
||||||
assert(stack == 'tool "With Spaces" 32487')
|
|
||||||
assert(success == false)
|
|
||||||
|
|
||||||
stack, success = stackstring_put_item('node "With Spaces" 40',
|
|
||||||
{type='tool', name='With Spaces'})
|
|
||||||
assert(stack == 'node "With Spaces" 40')
|
|
||||||
assert(success == false)
|
|
||||||
|
|
||||||
assert(stackstring_put_stackstring('node "With Spaces" 2',
|
|
||||||
'node "With Spaces" 1') == 'node "With Spaces" 3')
|
|
||||||
end
|
|
||||||
test_stackstring()
|
|
||||||
|
|
||||||
--
|
|
||||||
-- nodeitem helpers
|
|
||||||
--
|
|
||||||
|
|
||||||
minetest.inventorycube = function(img1, img2, img3)
|
|
||||||
img2 = img2 or img1
|
|
||||||
img3 = img3 or img1
|
|
||||||
return "[inventorycube"
|
|
||||||
.. "{" .. img1:gsub("%^", "&")
|
|
||||||
.. "{" .. img2:gsub("%^", "&")
|
|
||||||
.. "{" .. img3:gsub("%^", "&")
|
|
||||||
end
|
|
||||||
|
|
||||||
--
|
|
||||||
-- craftitem helpers
|
|
||||||
--
|
|
||||||
|
|
||||||
minetest.craftitem_place_item = function(item, placer, pos)
|
|
||||||
--print("craftitem_place_item")
|
|
||||||
--print("item: " .. dump(item))
|
|
||||||
--print("placer: " .. dump(placer))
|
|
||||||
--print("pos: " .. dump(pos))
|
|
||||||
minetest.env:add_item(pos, 'craft "' .. item .. '" 1')
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
minetest.craftitem_eat = function(hp_change)
|
|
||||||
return function(item, user, pointed_thing) -- closure
|
|
||||||
--print("craftitem_eat(" .. hp_change .. ")")
|
|
||||||
--print("item: " .. dump(item))
|
|
||||||
--print("user: " .. dump(user))
|
|
||||||
--print("pointed_thing: " .. dump(pointed_thing))
|
|
||||||
user:set_hp(user:get_hp() + hp_change)
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Creative inventory
|
|
||||||
--
|
|
||||||
|
|
||||||
minetest.creative_inventory = {}
|
|
||||||
|
|
||||||
minetest.add_to_creative_inventory = function(itemstring)
|
|
||||||
table.insert(minetest.creative_inventory, itemstring)
|
|
||||||
end
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Callback registration
|
|
||||||
--
|
|
||||||
|
|
||||||
function make_registration()
|
|
||||||
local t = {}
|
|
||||||
local registerfunc = function(func) table.insert(t, func) end
|
|
||||||
return t, registerfunc
|
|
||||||
end
|
|
||||||
|
|
||||||
minetest.registered_on_chat_messages, minetest.register_on_chat_message = make_registration()
|
|
||||||
minetest.registered_globalsteps, minetest.register_globalstep = make_registration()
|
|
||||||
minetest.registered_on_placenodes, minetest.register_on_placenode = make_registration()
|
|
||||||
minetest.registered_on_dignodes, minetest.register_on_dignode = make_registration()
|
|
||||||
minetest.registered_on_punchnodes, minetest.register_on_punchnode = make_registration()
|
|
||||||
minetest.registered_on_generateds, minetest.register_on_generated = make_registration()
|
|
||||||
minetest.registered_on_newplayers, minetest.register_on_newplayer = make_registration()
|
|
||||||
minetest.registered_on_respawnplayers, minetest.register_on_respawnplayer = make_registration()
|
|
||||||
|
|
||||||
-- END
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
minetest.register_craft({
|
|
||||||
output = 'craft "bucket:bucket_empty" 1',
|
|
||||||
recipe = {
|
|
||||||
{'craft "steel_ingot"', '', 'craft "steel_ingot"'},
|
|
||||||
{'', 'craft "steel_ingot"', ''},
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craftitem("bucket:bucket_empty", {
|
|
||||||
image = "bucket.png",
|
|
||||||
stack_max = 1,
|
|
||||||
liquids_pointable = true,
|
|
||||||
on_place_on_ground = minetest.craftitem_place_item,
|
|
||||||
on_use = function(item, player, pointed_thing)
|
|
||||||
if pointed_thing.type == "node" then
|
|
||||||
n = minetest.env:get_node(pointed_thing.under)
|
|
||||||
if n.name == "water_source" then
|
|
||||||
minetest.env:add_node(pointed_thing.under, {name="air"})
|
|
||||||
player:add_to_inventory_later('craft "bucket:bucket_water" 1')
|
|
||||||
return true
|
|
||||||
elseif n.name == "lava_source" then
|
|
||||||
minetest.env:add_node(pointed_thing.under, {name="air"})
|
|
||||||
player:add_to_inventory_later('craft "bucket:bucket_lava" 1')
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return false
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craftitem("bucket:bucket_water", {
|
|
||||||
image = "bucket:bucket_water.png",
|
|
||||||
stack_max = 1,
|
|
||||||
liquids_pointable = true,
|
|
||||||
on_place_on_ground = minetest.craftitem_place_item,
|
|
||||||
on_use = function(item, player, pointed_thing)
|
|
||||||
if pointed_thing.type == "node" then
|
|
||||||
n = minetest.env:get_node(pointed_thing.under)
|
|
||||||
if n.name == "water_source" then
|
|
||||||
-- unchanged
|
|
||||||
elseif n.name == "water_flowing" or n.name == "lava_source" or n.name == "lava_flowing" then
|
|
||||||
minetest.env:add_node(pointed_thing.under, {name="water_source"})
|
|
||||||
else
|
|
||||||
minetest.env:add_node(pointed_thing.above, {name="water_source"})
|
|
||||||
end
|
|
||||||
player:add_to_inventory_later('craft "bucket:bucket_empty" 1')
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
return false
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craftitem("bucket:bucket_lava", {
|
|
||||||
image = "bucket:bucket_lava.png",
|
|
||||||
stack_max = 1,
|
|
||||||
liquids_pointable = true,
|
|
||||||
on_place_on_ground = minetest.craftitem_place_item,
|
|
||||||
on_use = function(item, player, pointed_thing)
|
|
||||||
if pointed_thing.type == "node" then
|
|
||||||
n = minetest.env:get_node(pointed_thing.under)
|
|
||||||
if n.name == "lava_source" then
|
|
||||||
-- unchanged
|
|
||||||
elseif n.name == "water_source" or n.name == "water_flowing" or n.name == "lava_flowing" then
|
|
||||||
minetest.env:add_node(pointed_thing.under, {name="lava_source"})
|
|
||||||
else
|
|
||||||
minetest.env:add_node(pointed_thing.above, {name="lava_source"})
|
|
||||||
end
|
|
||||||
player:add_to_inventory_later('craft "bucket:bucket_empty" 1')
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
return false
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 236 B |
|
Before Width: | Height: | Size: 598 B |
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 231 B |
|
Before Width: | Height: | Size: 199 B |
|
Before Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 190 B |
|
Before Width: | Height: | Size: 190 B |
|
Before Width: | Height: | Size: 190 B |
@@ -1,12 +0,0 @@
|
|||||||
minetest.register_on_newplayer(function(player)
|
|
||||||
print("on_newplayer")
|
|
||||||
if minetest.setting_getbool("give_initial_stuff") then
|
|
||||||
print("giving give_initial_stuff to player")
|
|
||||||
player:add_to_inventory('tool "SteelPick" 0')
|
|
||||||
player:add_to_inventory('node "torch" 99')
|
|
||||||
player:add_to_inventory('tool "SteelAxe" 0')
|
|
||||||
player:add_to_inventory('tool "SteelShovel" 0')
|
|
||||||
player:add_to_inventory('node "cobble" 99')
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
85
doc/minetest.6
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
.\" Minetest man page
|
||||||
|
.TH minetest 6 "11 March 2012" "" ""
|
||||||
|
|
||||||
|
.SH NAME
|
||||||
|
minetest \- Multiplayer infinite-world block sandbox
|
||||||
|
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B minetest
|
||||||
|
[ OPTION ... ]
|
||||||
|
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.B Minetest
|
||||||
|
is one of the first InfiniMiner/Minecraft(/whatever) inspired games (started October 2010), with a goal of taking the survival multiplayer gameplay to a slightly different direction.
|
||||||
|
.PP
|
||||||
|
The main design philosophy is to keep it technically simple, stable and portable. It will be kept lightweight enough to run on fairly old hardware.
|
||||||
|
|
||||||
|
.SH OPTIONS
|
||||||
|
.TP
|
||||||
|
\-\-address <value>
|
||||||
|
Address to connect to
|
||||||
|
.TP
|
||||||
|
\-\-config <value>
|
||||||
|
Load configuration from specified file
|
||||||
|
.TP
|
||||||
|
\-\-disable\-unittests
|
||||||
|
Disable unit tests
|
||||||
|
.TP
|
||||||
|
\-\-enable\-unittests
|
||||||
|
Enable unit tests
|
||||||
|
.TP
|
||||||
|
\-\-gameid <value>
|
||||||
|
Set gameid
|
||||||
|
.TP
|
||||||
|
\-\-go
|
||||||
|
Disable main menu
|
||||||
|
.TP
|
||||||
|
\-\-help
|
||||||
|
Show allowed options
|
||||||
|
.TP
|
||||||
|
\-\-logfile <value>
|
||||||
|
Set logfile path (debug.txt)
|
||||||
|
.TP
|
||||||
|
\-\-map\-dir <value>
|
||||||
|
Same as --world (deprecated)
|
||||||
|
.TP
|
||||||
|
\-\-name <value>
|
||||||
|
Set player name
|
||||||
|
.TP
|
||||||
|
\-\-password <value>
|
||||||
|
Set password
|
||||||
|
.TP
|
||||||
|
\-\-port <value>
|
||||||
|
Set network port (UDP) to use
|
||||||
|
.TP
|
||||||
|
\-\-random\-input
|
||||||
|
Enable random user input, for testing
|
||||||
|
.TP
|
||||||
|
\-\-server
|
||||||
|
Run dedicated server
|
||||||
|
.TP
|
||||||
|
\-\-speedtests
|
||||||
|
Run speed tests
|
||||||
|
.TP
|
||||||
|
\-\-verbose
|
||||||
|
Print more information to console
|
||||||
|
.TP
|
||||||
|
\-\-world <value>
|
||||||
|
Set world path
|
||||||
|
|
||||||
|
.SH BUGS
|
||||||
|
Please report all bugs to Perttu Ahola <celeron55@gmail.com>.
|
||||||
|
|
||||||
|
.SH AUTHOR
|
||||||
|
.PP
|
||||||
|
Perttu Ahola <celeron55@gmail.com>
|
||||||
|
and contributors.
|
||||||
|
.PP
|
||||||
|
This man page was originally written by
|
||||||
|
Juhani Numminen <juhaninumminen0@gmail.com>.
|
||||||
|
|
||||||
|
.SH WWW
|
||||||
|
http://c55.me/minetest/
|
||||||
|
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
.BR minetestserver(6)
|
||||||
64
doc/minetestserver.6
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
.\" Minetestserver man page
|
||||||
|
.TH minetestserver 6 "11 March 2012" "" ""
|
||||||
|
|
||||||
|
.SH NAME
|
||||||
|
minetestserver \- Minetest server
|
||||||
|
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B minetestserver
|
||||||
|
[ OPTION ... ]
|
||||||
|
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.B Minetest
|
||||||
|
is one of the first InfiniMiner/Minecraft(/whatever) inspired games (started October 2010), with a goal of taking the survival multiplayer gameplay to a slightly different direction.
|
||||||
|
.PP
|
||||||
|
The main design philosophy is to keep it technically simple, stable and portable. It will be kept lightweight enough to run on fairly old hardware.
|
||||||
|
|
||||||
|
.SH OPTIONS
|
||||||
|
.TP
|
||||||
|
\-\-config <value>
|
||||||
|
Load configuration from specified file
|
||||||
|
.TP
|
||||||
|
\-\-disable\-unittests
|
||||||
|
Disable unit tests
|
||||||
|
.TP
|
||||||
|
\-\-enable\-unittests
|
||||||
|
Enable unit tests
|
||||||
|
.TP
|
||||||
|
\-\-gameid <value>
|
||||||
|
Set gameid
|
||||||
|
.TP
|
||||||
|
\-\-help
|
||||||
|
Show allowed options
|
||||||
|
.TP
|
||||||
|
\-\-logfile <value>
|
||||||
|
Set logfile path (debug.txt)
|
||||||
|
.TP
|
||||||
|
\-\-map\-dir <value>
|
||||||
|
Same as --world (deprecated)
|
||||||
|
.TP
|
||||||
|
\-\-port <value>
|
||||||
|
Set network port (UDP) to use
|
||||||
|
.TP
|
||||||
|
\-\-verbose
|
||||||
|
Print more information to console
|
||||||
|
.TP
|
||||||
|
\-\-world <value>
|
||||||
|
Set world path
|
||||||
|
|
||||||
|
.SH BUGS
|
||||||
|
Please report all bugs to Perttu Ahola <celeron55@gmail.com>.
|
||||||
|
|
||||||
|
.SH AUTHOR
|
||||||
|
.PP
|
||||||
|
Perttu Ahola <celeron55@gmail.com>
|
||||||
|
and contributors.
|
||||||
|
.PP
|
||||||
|
This man page was originally written by
|
||||||
|
Juhani Numminen <juhaninumminen0@gmail.com>.
|
||||||
|
|
||||||
|
.SH WWW
|
||||||
|
http://c55.me/minetest/
|
||||||
|
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
.BR minetest(6)
|
||||||
@@ -42,6 +42,8 @@
|
|||||||
# Go down ladder / go down in fly mode / go fast in fast mode
|
# Go down ladder / go down in fly mode / go fast in fast mode
|
||||||
#keymap_special1 = KEY_KEY_E
|
#keymap_special1 = KEY_KEY_E
|
||||||
#keymap_chat = KEY_KEY_T
|
#keymap_chat = KEY_KEY_T
|
||||||
|
#keymap_cmd = /
|
||||||
|
#keyman_console = KEY_F10
|
||||||
#keymap_rangeselect = KEY_KEY_R
|
#keymap_rangeselect = KEY_KEY_R
|
||||||
#keymap_freemove = KEY_KEY_K
|
#keymap_freemove = KEY_KEY_K
|
||||||
#keymap_fastmove = KEY_KEY_J
|
#keymap_fastmove = KEY_KEY_J
|
||||||
@@ -104,11 +106,17 @@
|
|||||||
#screenshot_path = .
|
#screenshot_path = .
|
||||||
# Amount of view bobbing (0 = no view bobbing, 1.0 = normal, 2.0 = double)
|
# Amount of view bobbing (0 = no view bobbing, 1.0 = normal, 2.0 = double)
|
||||||
#view_bobbing_amount = 1.0
|
#view_bobbing_amount = 1.0
|
||||||
|
# In-game chat console background color (R,G,B)
|
||||||
|
#console_color = (0,0,0)
|
||||||
|
# In-game chat console background alpha (opaqueness, between 0 and 255)
|
||||||
|
#console_alpha = 200
|
||||||
|
|
||||||
#
|
#
|
||||||
# Server stuff
|
# Server stuff
|
||||||
#
|
#
|
||||||
|
|
||||||
|
# Default game (default when creating a new world)
|
||||||
|
#default_game = mesetint
|
||||||
# Map directory (everything in the world is stored here)
|
# Map directory (everything in the world is stored here)
|
||||||
#map-dir = /custom/map
|
#map-dir = /custom/map
|
||||||
# Message of the Day
|
# Message of the Day
|
||||||
@@ -139,17 +147,23 @@
|
|||||||
# Profiler data print interval. #0 = disable.
|
# Profiler data print interval. #0 = disable.
|
||||||
#profiler_print_interval = 0
|
#profiler_print_interval = 0
|
||||||
#enable_mapgen_debug_info = false
|
#enable_mapgen_debug_info = false
|
||||||
|
# from how far client knows about objects
|
||||||
#active_object_send_range_blocks = 3
|
#active_object_send_range_blocks = 3
|
||||||
|
# how large area of blocks are subject to the active block stuff (active = objects are loaded and ABMs run)
|
||||||
#active_block_range = 2
|
#active_block_range = 2
|
||||||
|
# how many blocks are flying in the wire simultaneously per client
|
||||||
#max_simultaneous_block_sends_per_client = 2
|
#max_simultaneous_block_sends_per_client = 2
|
||||||
|
# how many blocks are flying in the wire simultaneously per server
|
||||||
#max_simultaneous_block_sends_server_total = 8
|
#max_simultaneous_block_sends_server_total = 8
|
||||||
#max_block_send_distance = 7
|
#max_block_send_distance = 7
|
||||||
#max_block_generate_distance = 5
|
#max_block_generate_distance = 5
|
||||||
#time_send_interval = 20
|
#time_send_interval = 20
|
||||||
# Length of day/night cycle. 72=20min, 360=4min, 1=24hour
|
# Length of day/night cycle. 72=20min, 360=4min, 1=24hour, 0=day/night/whatever stays unchanged
|
||||||
#time_speed = 72
|
#time_speed = 72
|
||||||
#server_unload_unused_data_timeout = 29
|
#server_unload_unused_data_timeout = 29
|
||||||
#server_map_save_interval = 5.3
|
#server_map_save_interval = 5.3
|
||||||
|
# To reduce lag, block transfers are slowed down when a player is building something.
|
||||||
|
# This determines how long they are slowed down after placing or removing a node.
|
||||||
#full_block_send_enable_min_time_from_building = 2.0
|
#full_block_send_enable_min_time_from_building = 2.0
|
||||||
# Set to true to enable experimental features or stuff that is tested
|
# Set to true to enable experimental features or stuff that is tested
|
||||||
# (varies from version to version, usually not useful at all)
|
# (varies from version to version, usually not useful at all)
|
||||||
|
|||||||
345
old/ancient_main_comment.txt
Normal file
@@ -0,0 +1,345 @@
|
|||||||
|
------------------------------------------------------------------
|
||||||
|
The ancient comment from the beginning of main.cpp is stored here.
|
||||||
|
------------------------------------------------------------------
|
||||||
|
|
||||||
|
/*
|
||||||
|
=============================== NOTES ==============================
|
||||||
|
NOTE: Things starting with TODO are sometimes only suggestions.
|
||||||
|
|
||||||
|
NOTE: iostream.imbue(std::locale("C")) is very slow
|
||||||
|
NOTE: Global locale is now set at initialization
|
||||||
|
|
||||||
|
NOTE: If VBO (EHM_STATIC) is used, remember to explicitly free the
|
||||||
|
hardware buffer (it is not freed automatically)
|
||||||
|
|
||||||
|
NOTE: A random to-do list saved here as documentation:
|
||||||
|
A list of "active blocks" in which stuff happens. (+=done)
|
||||||
|
+ Add a never-resetted game timer to the server
|
||||||
|
+ Add a timestamp value to blocks
|
||||||
|
+ The simple rule: All blocks near some player are "active"
|
||||||
|
- Do stuff in real time in active blocks
|
||||||
|
+ Handle objects
|
||||||
|
- Grow grass, delete leaves without a tree
|
||||||
|
- Spawn some mobs based on some rules
|
||||||
|
- Transform cobble to mossy cobble near water
|
||||||
|
- Run a custom script
|
||||||
|
- ...And all kinds of other dynamic stuff
|
||||||
|
+ Keep track of when a block becomes active and becomes inactive
|
||||||
|
+ When a block goes inactive:
|
||||||
|
+ Store objects statically to block
|
||||||
|
+ Store timer value as the timestamp
|
||||||
|
+ When a block goes active:
|
||||||
|
+ Create active objects out of static objects
|
||||||
|
- Simulate the results of what would have happened if it would have
|
||||||
|
been active for all the time
|
||||||
|
- Grow a lot of grass and so on
|
||||||
|
+ Initially it is fine to send information about every active object
|
||||||
|
to every player. Eventually it should be modified to only send info
|
||||||
|
about the nearest ones.
|
||||||
|
+ This was left to be done by the old system and it sends only the
|
||||||
|
nearest ones.
|
||||||
|
|
||||||
|
NOTE: Seeds in 1260:6c77e7dbfd29:
|
||||||
|
5721858502589302589:
|
||||||
|
Spawns you on a small sand island with a surface dungeon
|
||||||
|
2983455799928051958:
|
||||||
|
Enormous jungle + a surface dungeon at ~(250,0,0)
|
||||||
|
|
||||||
|
Old, wild and random suggestions that probably won't be done:
|
||||||
|
-------------------------------------------------------------
|
||||||
|
|
||||||
|
SUGG: If player is on ground, mainly fetch ground-level blocks
|
||||||
|
|
||||||
|
SUGG: Expose Connection's seqnums and ACKs to server and client.
|
||||||
|
- This enables saving many packets and making a faster connection
|
||||||
|
- This also enables server to check if client has received the
|
||||||
|
most recent block sent, for example.
|
||||||
|
SUGG: Add a sane bandwidth throttling system to Connection
|
||||||
|
|
||||||
|
SUGG: More fine-grained control of client's dumping of blocks from
|
||||||
|
memory
|
||||||
|
- ...What does this mean in the first place?
|
||||||
|
|
||||||
|
SUGG: A map editing mode (similar to dedicated server mode)
|
||||||
|
|
||||||
|
SUGG: Transfer more blocks in a single packet
|
||||||
|
SUGG: A blockdata combiner class, to which blocks are added and at
|
||||||
|
destruction it sends all the stuff in as few packets as possible.
|
||||||
|
SUGG: Make a PACKET_COMBINED which contains many subpackets. Utilize
|
||||||
|
it by sending more stuff in a single packet.
|
||||||
|
- Add a packet queue to RemoteClient, from which packets will be
|
||||||
|
combined with object data packets
|
||||||
|
- This is not exactly trivial: the object data packets are
|
||||||
|
sometimes very big by themselves
|
||||||
|
- This might not give much network performance gain though.
|
||||||
|
|
||||||
|
SUGG: Precalculate lighting translation table at runtime (at startup)
|
||||||
|
- This is not doable because it is currently hand-made and not
|
||||||
|
based on some mathematical function.
|
||||||
|
- Note: This has been changing lately
|
||||||
|
|
||||||
|
SUGG: A version number to blocks, which increments when the block is
|
||||||
|
modified (node add/remove, water update, lighting update)
|
||||||
|
- This can then be used to make sure the most recent version of
|
||||||
|
a block has been sent to client, for example
|
||||||
|
|
||||||
|
SUGG: Make the amount of blocks sending to client and the total
|
||||||
|
amount of blocks dynamically limited. Transferring blocks is the
|
||||||
|
main network eater of this system, so it is the one that has
|
||||||
|
to be throttled so that RTTs stay low.
|
||||||
|
|
||||||
|
SUGG: Meshes of blocks could be split into 6 meshes facing into
|
||||||
|
different directions and then only those drawn that need to be
|
||||||
|
|
||||||
|
SUGG: Background music based on cellular automata?
|
||||||
|
http://www.earslap.com/projectslab/otomata
|
||||||
|
|
||||||
|
SUGG: Simple light color information to air
|
||||||
|
|
||||||
|
SUGG: Server-side objects could be moved based on nodes to enable very
|
||||||
|
lightweight operation and simple AI
|
||||||
|
- Not practical; client would still need to show smooth movement.
|
||||||
|
|
||||||
|
SUGG: Make a system for pregenerating quick information for mapblocks, so
|
||||||
|
that the client can show them as cubes before they are actually sent
|
||||||
|
or even generated.
|
||||||
|
|
||||||
|
SUGG: Erosion simulation at map generation time
|
||||||
|
- This might be plausible if larger areas of map were pregenerated
|
||||||
|
without lighting (which is slow)
|
||||||
|
- Simulate water flows, which would carve out dirt fast and
|
||||||
|
then turn stone into gravel and sand and relocate it.
|
||||||
|
- How about relocating minerals, too? Coal and gold in
|
||||||
|
downstream sand and gravel would be kind of cool
|
||||||
|
- This would need a better way of handling minerals, mainly
|
||||||
|
to have mineral content as a separate field. the first
|
||||||
|
parameter field is free for this.
|
||||||
|
- Simulate rock falling from cliffs when water has removed
|
||||||
|
enough solid rock from the bottom
|
||||||
|
|
||||||
|
SUGG: For non-mapgen FarMesh: Add a per-sector database to store surface
|
||||||
|
stuff as simple flags/values
|
||||||
|
- Light?
|
||||||
|
- A building?
|
||||||
|
And at some point make the server send this data to the client too,
|
||||||
|
instead of referring to the noise functions
|
||||||
|
- Ground height
|
||||||
|
- Surface ground type
|
||||||
|
- Trees?
|
||||||
|
|
||||||
|
Gaming ideas:
|
||||||
|
-------------
|
||||||
|
|
||||||
|
- Aim for something like controlling a single dwarf in Dwarf Fortress
|
||||||
|
- The player could go faster by a crafting a boat, or riding an animal
|
||||||
|
- Random NPC traders. what else?
|
||||||
|
|
||||||
|
Game content:
|
||||||
|
-------------
|
||||||
|
|
||||||
|
- When furnace is destroyed, move items to player's inventory
|
||||||
|
- Add lots of stuff
|
||||||
|
- Glass blocks
|
||||||
|
- Growing grass, decaying leaves
|
||||||
|
- This can be done in the active blocks I guess.
|
||||||
|
- Lots of stuff can be done in the active blocks.
|
||||||
|
- Uh, is there an active block list somewhere? I think not. Add it.
|
||||||
|
- Breaking weak structures
|
||||||
|
- This can probably be accomplished in the same way as grass
|
||||||
|
- Player health points
|
||||||
|
- When player dies, throw items on map (needs better item-on-map
|
||||||
|
implementation)
|
||||||
|
- Cobble to get mossy if near water
|
||||||
|
- More slots in furnace source list, so that multiple ingredients
|
||||||
|
are possible.
|
||||||
|
- Keys to chests?
|
||||||
|
|
||||||
|
- The Treasure Guard; a big monster with a hammer
|
||||||
|
- The hammer does great damage, shakes the ground and removes a block
|
||||||
|
- You can drop on top of it, and have some time to attack there
|
||||||
|
before he shakes you off
|
||||||
|
|
||||||
|
- Maybe the difficulty could come from monsters getting tougher in
|
||||||
|
far-away places, and the player starting to need something from
|
||||||
|
there when time goes by.
|
||||||
|
- The player would have some of that stuff at the beginning, and
|
||||||
|
would need new supplies of it when it runs out
|
||||||
|
|
||||||
|
- A bomb
|
||||||
|
- A spread-items-on-map routine for the bomb, and for dying players
|
||||||
|
|
||||||
|
- Fighting:
|
||||||
|
- Proper sword swing simulation
|
||||||
|
- Player should get damage from colliding to a wall at high speed
|
||||||
|
|
||||||
|
Documentation:
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Build system / running:
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
Networking and serialization:
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
|
SUGG: Fix address to be ipv6 compatible
|
||||||
|
|
||||||
|
User Interface:
|
||||||
|
---------------
|
||||||
|
|
||||||
|
Graphics:
|
||||||
|
---------
|
||||||
|
|
||||||
|
SUGG: Combine MapBlock's face caches to so big pieces that VBO
|
||||||
|
can be used
|
||||||
|
- That is >500 vertices
|
||||||
|
- This is not easy; all the MapBlocks close to the player would
|
||||||
|
still need to be drawn separately and combining the blocks
|
||||||
|
would have to happen in a background thread
|
||||||
|
|
||||||
|
SUGG: Make fetching sector's blocks more efficient when rendering
|
||||||
|
sectors that have very large amounts of blocks (on client)
|
||||||
|
- Is this necessary at all?
|
||||||
|
|
||||||
|
SUGG: Draw cubes in inventory directly with 3D drawing commands, so that
|
||||||
|
animating them is easier.
|
||||||
|
|
||||||
|
SUGG: Option for enabling proper alpha channel for textures
|
||||||
|
|
||||||
|
TODO: Flowing water animation
|
||||||
|
|
||||||
|
TODO: A setting for enabling bilinear filtering for textures
|
||||||
|
|
||||||
|
TODO: Better control of draw_control.wanted_max_blocks
|
||||||
|
|
||||||
|
TODO: Further investigate the use of GPU lighting in addition to the
|
||||||
|
current one
|
||||||
|
|
||||||
|
TODO: Artificial (night) light could be more yellow colored than sunlight.
|
||||||
|
- This is technically doable.
|
||||||
|
- Also the actual colors of the textures could be made less colorful
|
||||||
|
in the dark but it's a bit more difficult.
|
||||||
|
|
||||||
|
SUGG: Somehow make the night less colorful
|
||||||
|
|
||||||
|
TODO: Occlusion culling
|
||||||
|
- At the same time, move some of the renderMap() block choosing code
|
||||||
|
to the same place as where the new culling happens.
|
||||||
|
- Shoot some rays per frame and when ready, make a new list of
|
||||||
|
blocks for usage of renderMap and give it a new pointer to it.
|
||||||
|
|
||||||
|
Configuration:
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Client:
|
||||||
|
-------
|
||||||
|
|
||||||
|
TODO: Untie client network operations from framerate
|
||||||
|
- Needs some input queues or something
|
||||||
|
- This won't give much performance boost because calculating block
|
||||||
|
meshes takes so long
|
||||||
|
|
||||||
|
SUGG: Make morning and evening transition more smooth and maybe shorter
|
||||||
|
|
||||||
|
TODO: Don't update all meshes always on single node changes, but
|
||||||
|
check which ones should be updated
|
||||||
|
- implement Map::updateNodeMeshes() and the usage of it
|
||||||
|
- It will give almost always a 4x boost in mesh update performance.
|
||||||
|
|
||||||
|
- A weapon engine
|
||||||
|
|
||||||
|
- Tool/weapon visualization
|
||||||
|
|
||||||
|
FIXME: When disconnected to the menu, memory is not freed properly
|
||||||
|
|
||||||
|
TODO: Investigate how much the mesh generator thread gets used when
|
||||||
|
transferring map data
|
||||||
|
|
||||||
|
Server:
|
||||||
|
-------
|
||||||
|
|
||||||
|
SUGG: Make an option to the server to disable building and digging near
|
||||||
|
the starting position
|
||||||
|
|
||||||
|
FIXME: Server sometimes goes into some infinite PeerNotFoundException loop
|
||||||
|
|
||||||
|
* Fix the problem with the server constantly saving one or a few
|
||||||
|
blocks? List the first saved block, maybe it explains.
|
||||||
|
- It is probably caused by oscillating water
|
||||||
|
- TODO: Investigate if this still happens (this is a very old one)
|
||||||
|
* Make a small history check to transformLiquids to detect and log
|
||||||
|
continuous oscillations, in such detail that they can be fixed.
|
||||||
|
|
||||||
|
FIXME: The new optimized map sending doesn't sometimes send enough blocks
|
||||||
|
from big caves and such
|
||||||
|
FIXME: Block send distance configuration does not take effect for some reason
|
||||||
|
|
||||||
|
Environment:
|
||||||
|
------------
|
||||||
|
|
||||||
|
TODO: Add proper hooks to when adding and removing active blocks
|
||||||
|
|
||||||
|
TODO: Finish the ActiveBlockModifier stuff and use it for something
|
||||||
|
|
||||||
|
Objects:
|
||||||
|
--------
|
||||||
|
|
||||||
|
TODO: Get rid of MapBlockObjects and use only ActiveObjects
|
||||||
|
- Skipping the MapBlockObject data is nasty - there is no "total
|
||||||
|
length" stored; have to make a SkipMBOs function which contains
|
||||||
|
enough of the current code to skip them properly.
|
||||||
|
|
||||||
|
SUGG: MovingObject::move and Player::move are basically the same.
|
||||||
|
combine them.
|
||||||
|
- NOTE: This is a bit tricky because player has the sneaking ability
|
||||||
|
- NOTE: Player::move is more up-to-date.
|
||||||
|
- NOTE: There is a simple move implementation now in collision.{h,cpp}
|
||||||
|
- NOTE: MovingObject will be deleted (MapBlockObject)
|
||||||
|
|
||||||
|
TODO: Add a long step function to objects that is called with the time
|
||||||
|
difference when block activates
|
||||||
|
|
||||||
|
Map:
|
||||||
|
----
|
||||||
|
|
||||||
|
TODO: Flowing water to actually contain flow direction information
|
||||||
|
- There is a space for this - it just has to be implemented.
|
||||||
|
|
||||||
|
TODO: Consider smoothening cave floors after generating them
|
||||||
|
|
||||||
|
TODO: Fix make_tree, make_* to use seed-position-consistent pseudorandom
|
||||||
|
- delta also
|
||||||
|
|
||||||
|
Misc. stuff:
|
||||||
|
------------
|
||||||
|
TODO: Make sure server handles removing grass when a block is placed (etc)
|
||||||
|
- The client should not do it by itself
|
||||||
|
- NOTE: I think nobody does it currently...
|
||||||
|
TODO: Block cube placement around player's head
|
||||||
|
TODO: Protocol version field
|
||||||
|
TODO: Think about using same bits for material for fences and doors, for
|
||||||
|
example
|
||||||
|
|
||||||
|
SUGG: Restart irrlicht completely when coming back to main menu from game.
|
||||||
|
- This gets rid of everything that is stored in irrlicht's caches.
|
||||||
|
- This might be needed for texture pack selection in menu
|
||||||
|
|
||||||
|
TODO: Merge bahamada's audio stuff (clean patch available)
|
||||||
|
|
||||||
|
Making it more portable:
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
Stuff to do before release:
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
Fixes to the current release:
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
|
Stuff to do after release:
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
Doing currently:
|
||||||
|
----------------
|
||||||
|
|
||||||
|
======================================================================
|
||||||
|
|
||||||
|
*/
|
||||||
BIN
share/client/textures/fontdejavusansmono.png
Normal file
|
After Width: | Height: | Size: 9.2 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 498 B After Width: | Height: | Size: 498 B |
BIN
share/client/textures/smoke_puff.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
share/client/textures/sunrisebg.png
Normal file
|
After Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 582 B After Width: | Height: | Size: 582 B |
BIN
share/client/textures/unknown_item.png
Normal file
|
After Width: | Height: | Size: 710 B |
|
Before Width: | Height: | Size: 489 B After Width: | Height: | Size: 489 B |
859
share/server/builtin.lua
Normal file
@@ -0,0 +1,859 @@
|
|||||||
|
--
|
||||||
|
-- This file contains built-in stuff in Minetest implemented in Lua.
|
||||||
|
--
|
||||||
|
-- It is always loaded and executed after registration of the C API,
|
||||||
|
-- before loading and running any mods.
|
||||||
|
--
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Override some Lua library functions
|
||||||
|
--
|
||||||
|
|
||||||
|
print = minetest.debug
|
||||||
|
|
||||||
|
--
|
||||||
|
--
|
||||||
|
--
|
||||||
|
|
||||||
|
function basic_dump2(o)
|
||||||
|
if type(o) == "number" then
|
||||||
|
return tostring(o)
|
||||||
|
elseif type(o) == "string" then
|
||||||
|
return string.format("%q", o)
|
||||||
|
elseif type(o) == "boolean" then
|
||||||
|
return tostring(o)
|
||||||
|
elseif type(o) == "function" then
|
||||||
|
return "<function>"
|
||||||
|
elseif type(o) == "userdata" then
|
||||||
|
return "<userdata>"
|
||||||
|
elseif type(o) == "nil" then
|
||||||
|
return "nil"
|
||||||
|
else
|
||||||
|
error("cannot dump a " .. type(o))
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function dump2(o, name, dumped)
|
||||||
|
name = name or "_"
|
||||||
|
dumped = dumped or {}
|
||||||
|
io.write(name, " = ")
|
||||||
|
if type(o) == "number" or type(o) == "string" or type(o) == "boolean"
|
||||||
|
or type(o) == "function" or type(o) == "nil"
|
||||||
|
or type(o) == "userdata" then
|
||||||
|
io.write(basic_dump2(o), "\n")
|
||||||
|
elseif type(o) == "table" then
|
||||||
|
if dumped[o] then
|
||||||
|
io.write(dumped[o], "\n")
|
||||||
|
else
|
||||||
|
dumped[o] = name
|
||||||
|
io.write("{}\n") -- new table
|
||||||
|
for k,v in pairs(o) do
|
||||||
|
local fieldname = string.format("%s[%s]", name, basic_dump2(k))
|
||||||
|
dump2(v, fieldname, dumped)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
error("cannot dump a " .. type(o))
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function dump(o, dumped)
|
||||||
|
dumped = dumped or {}
|
||||||
|
if type(o) == "number" then
|
||||||
|
return tostring(o)
|
||||||
|
elseif type(o) == "string" then
|
||||||
|
return string.format("%q", o)
|
||||||
|
elseif type(o) == "table" then
|
||||||
|
if dumped[o] then
|
||||||
|
return "<circular reference>"
|
||||||
|
end
|
||||||
|
dumped[o] = true
|
||||||
|
local t = {}
|
||||||
|
for k,v in pairs(o) do
|
||||||
|
t[#t+1] = "" .. k .. " = " .. dump(v, dumped)
|
||||||
|
end
|
||||||
|
return "{" .. table.concat(t, ", ") .. "}"
|
||||||
|
elseif type(o) == "boolean" then
|
||||||
|
return tostring(o)
|
||||||
|
elseif type(o) == "function" then
|
||||||
|
return "<function>"
|
||||||
|
elseif type(o) == "userdata" then
|
||||||
|
return "<userdata>"
|
||||||
|
elseif type(o) == "nil" then
|
||||||
|
return "nil"
|
||||||
|
else
|
||||||
|
error("cannot dump a " .. type(o))
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Item definition helpers
|
||||||
|
--
|
||||||
|
|
||||||
|
function minetest.inventorycube(img1, img2, img3)
|
||||||
|
img2 = img2 or img1
|
||||||
|
img3 = img3 or img1
|
||||||
|
return "[inventorycube"
|
||||||
|
.. "{" .. img1:gsub("%^", "&")
|
||||||
|
.. "{" .. img2:gsub("%^", "&")
|
||||||
|
.. "{" .. img3:gsub("%^", "&")
|
||||||
|
end
|
||||||
|
|
||||||
|
function minetest.pos_to_string(pos)
|
||||||
|
return "(" .. pos.x .. "," .. pos.y .. "," .. pos.z .. ")"
|
||||||
|
end
|
||||||
|
|
||||||
|
function minetest.get_pointed_thing_position(pointed_thing, above)
|
||||||
|
if pointed_thing.type == "node" then
|
||||||
|
if above then
|
||||||
|
-- The position where a node would be placed
|
||||||
|
return pointed_thing.above
|
||||||
|
else
|
||||||
|
-- The position where a node would be dug
|
||||||
|
return pointed_thing.under
|
||||||
|
end
|
||||||
|
elseif pointed_thing.type == "object" then
|
||||||
|
obj = pointed_thing.ref
|
||||||
|
if obj ~= nil then
|
||||||
|
return obj:getpos()
|
||||||
|
else
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
else
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function minetest.dir_to_facedir(dir)
|
||||||
|
if math.abs(dir.x) > math.abs(dir.z) then
|
||||||
|
if dir.x < 0 then
|
||||||
|
return 3
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if dir.z < 0 then
|
||||||
|
return 2
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function minetest.dir_to_wallmounted(dir)
|
||||||
|
if math.abs(dir.y) > math.max(math.abs(dir.x), math.abs(dir.z)) then
|
||||||
|
if dir.y < 0 then
|
||||||
|
return 1
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
end
|
||||||
|
elseif math.abs(dir.x) > math.abs(dir.z) then
|
||||||
|
if dir.x < 0 then
|
||||||
|
return 3
|
||||||
|
else
|
||||||
|
return 2
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if dir.z < 0 then
|
||||||
|
return 5
|
||||||
|
else
|
||||||
|
return 4
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function minetest.get_node_drops(nodename, toolname)
|
||||||
|
local drop = ItemStack({name=nodename}):get_definition().drop
|
||||||
|
if drop == nil then
|
||||||
|
-- default drop
|
||||||
|
return {ItemStack({name=nodename})}
|
||||||
|
elseif type(drop) == "string" then
|
||||||
|
-- itemstring drop
|
||||||
|
return {ItemStack(drop)}
|
||||||
|
elseif drop.items == nil then
|
||||||
|
-- drop = {} to disable default drop
|
||||||
|
return {}
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Extended drop table
|
||||||
|
local got_items = {}
|
||||||
|
local got_count = 0
|
||||||
|
local _, item, tool
|
||||||
|
for _, item in ipairs(drop.items) do
|
||||||
|
local good_rarity = true
|
||||||
|
local good_tool = true
|
||||||
|
if item.rarity ~= nil then
|
||||||
|
good_rarity = item.rarity < 1 or math.random(item.rarity) == 1
|
||||||
|
end
|
||||||
|
if item.tools ~= nil then
|
||||||
|
good_tool = false
|
||||||
|
for _, tool in ipairs(item.tools) do
|
||||||
|
if tool:sub(1, 1) == '~' then
|
||||||
|
good_tool = toolname:find(tool:sub(2)) ~= nil
|
||||||
|
else
|
||||||
|
good_tool = toolname == tool
|
||||||
|
end
|
||||||
|
if good_tool then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if good_rarity and good_tool then
|
||||||
|
got_count = got_count + 1
|
||||||
|
for _, add_item in ipairs(item.items) do
|
||||||
|
got_items[#got_items+1] = add_item
|
||||||
|
end
|
||||||
|
if drop.max_items ~= nil and got_count == drop.max_items then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return got_items
|
||||||
|
end
|
||||||
|
|
||||||
|
function minetest.item_place_node(itemstack, placer, pointed_thing)
|
||||||
|
local item = itemstack:peek_item()
|
||||||
|
local def = itemstack:get_definition()
|
||||||
|
if def.type == "node" and pointed_thing.type == "node" then
|
||||||
|
local pos = pointed_thing.above
|
||||||
|
local oldnode = minetest.env:get_node(pos)
|
||||||
|
local olddef = ItemStack({name=oldnode.name}):get_definition()
|
||||||
|
|
||||||
|
if not olddef.buildable_to then
|
||||||
|
minetest.log("info", placer:get_player_name() .. " tried to place"
|
||||||
|
.. " node in invalid position " .. minetest.pos_to_string(pos)
|
||||||
|
.. ", replacing " .. oldnode.name)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
minetest.log("action", placer:get_player_name() .. " places node "
|
||||||
|
.. def.name .. " at " .. minetest.pos_to_string(pos))
|
||||||
|
|
||||||
|
local newnode = {name = def.name, param1 = 0, param2 = 0}
|
||||||
|
|
||||||
|
-- Calculate direction for wall mounted stuff like torches and signs
|
||||||
|
if def.paramtype2 == 'wallmounted' then
|
||||||
|
local under = pointed_thing.under
|
||||||
|
local above = pointed_thing.above
|
||||||
|
local dir = {x = under.x - above.x, y = under.y - above.y, z = under.z - above.z}
|
||||||
|
newnode.param2 = minetest.dir_to_wallmounted(dir)
|
||||||
|
-- Calculate the direction for furnaces and chests and stuff
|
||||||
|
elseif def.paramtype2 == 'facedir' then
|
||||||
|
local playerpos = placer:getpos()
|
||||||
|
local dir = {x = pos.x - playerpos.x, y = pos.y - playerpos.y, z = pos.z - playerpos.z}
|
||||||
|
newnode.param2 = minetest.dir_to_facedir(dir)
|
||||||
|
minetest.log("action", "facedir: " .. newnode.param2)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Add node and update
|
||||||
|
minetest.env:add_node(pos, newnode)
|
||||||
|
|
||||||
|
-- Set metadata owner
|
||||||
|
if def.metadata_name ~= "" then
|
||||||
|
minetest.env:get_meta(pos):set_owner(placer:get_player_name())
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Run script hook
|
||||||
|
local _, callback
|
||||||
|
for _, callback in ipairs(minetest.registered_on_placenodes) do
|
||||||
|
callback(pos, newnode, placer)
|
||||||
|
end
|
||||||
|
|
||||||
|
itemstack:take_item()
|
||||||
|
end
|
||||||
|
return itemstack
|
||||||
|
end
|
||||||
|
|
||||||
|
function minetest.item_place_object(itemstack, placer, pointed_thing)
|
||||||
|
local pos = minetest.get_pointed_thing_position(pointed_thing, true)
|
||||||
|
if pos ~= nil then
|
||||||
|
local item = itemstack:take_item()
|
||||||
|
minetest.env:add_item(pos, item)
|
||||||
|
end
|
||||||
|
return itemstack
|
||||||
|
end
|
||||||
|
|
||||||
|
function minetest.item_place(itemstack, placer, pointed_thing)
|
||||||
|
if itemstack:get_definition().type == "node" then
|
||||||
|
return minetest.item_place_node(itemstack, placer, pointed_thing)
|
||||||
|
else
|
||||||
|
return minetest.item_place_object(itemstack, placer, pointed_thing)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function minetest.item_drop(itemstack, dropper, pos)
|
||||||
|
minetest.env:add_item(pos, itemstack)
|
||||||
|
return ""
|
||||||
|
end
|
||||||
|
|
||||||
|
function minetest.item_eat(hp_change, replace_with_item)
|
||||||
|
return function(itemstack, user, pointed_thing) -- closure
|
||||||
|
if itemstack:take_item() ~= nil then
|
||||||
|
user:set_hp(user:get_hp() + hp_change)
|
||||||
|
itemstack:add_item(replace_with_item) -- note: replace_with_item is optional
|
||||||
|
end
|
||||||
|
return itemstack
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function minetest.node_punch(pos, node, puncher)
|
||||||
|
-- Run script hook
|
||||||
|
local _, callback
|
||||||
|
for _, callback in ipairs(minetest.registered_on_punchnodes) do
|
||||||
|
callback(pos, node, puncher)
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
function minetest.node_dig(pos, node, digger)
|
||||||
|
minetest.debug("node_dig")
|
||||||
|
|
||||||
|
local def = ItemStack({name=node.name}):get_definition()
|
||||||
|
if not def.diggable then
|
||||||
|
minetest.debug("not diggable")
|
||||||
|
minetest.log("info", digger:get_player_name() .. " tried to dig "
|
||||||
|
.. node.name .. " which is not diggable "
|
||||||
|
.. minetest.pos_to_string(pos))
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local meta = minetest.env:get_meta(pos)
|
||||||
|
if meta ~= nil and not meta:get_allow_removal() then
|
||||||
|
minetest.debug("dig prevented by metadata")
|
||||||
|
minetest.log("info", digger:get_player_name() .. " tried to dig "
|
||||||
|
.. node.name .. ", but removal is disabled by metadata "
|
||||||
|
.. minetest.pos_to_string(pos))
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
minetest.log('action', digger:get_player_name() .. " digs "
|
||||||
|
.. node.name .. " at " .. minetest.pos_to_string(pos))
|
||||||
|
|
||||||
|
if not minetest.setting_getbool("creative_mode") then
|
||||||
|
local wielded = digger:get_wielded_item()
|
||||||
|
local drops = minetest.get_node_drops(node.name, wielded:get_name())
|
||||||
|
|
||||||
|
-- Wear out tool
|
||||||
|
tp = wielded:get_tool_capabilities()
|
||||||
|
dp = minetest.get_dig_params(def.groups, tp)
|
||||||
|
wielded:add_wear(dp.wear)
|
||||||
|
digger:set_wielded_item(wielded)
|
||||||
|
|
||||||
|
-- Add dropped items
|
||||||
|
local _, dropped_item
|
||||||
|
for _, dropped_item in ipairs(drops) do
|
||||||
|
digger:get_inventory():add_item("main", dropped_item)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Remove node and update
|
||||||
|
minetest.env:remove_node(pos)
|
||||||
|
|
||||||
|
-- Run script hook
|
||||||
|
local _, callback
|
||||||
|
for _, callback in ipairs(minetest.registered_on_dignodes) do
|
||||||
|
callback(pos, node, digger)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Item definition defaults
|
||||||
|
--
|
||||||
|
|
||||||
|
minetest.nodedef_default = {
|
||||||
|
-- Item properties
|
||||||
|
type="node",
|
||||||
|
-- name intentionally not defined here
|
||||||
|
description = "",
|
||||||
|
groups = {},
|
||||||
|
inventory_image = "",
|
||||||
|
wield_image = "",
|
||||||
|
wield_scale = {x=1,y=1,z=1},
|
||||||
|
stack_max = 99,
|
||||||
|
usable = false,
|
||||||
|
liquids_pointable = false,
|
||||||
|
tool_capabilities = nil,
|
||||||
|
|
||||||
|
-- Interaction callbacks
|
||||||
|
on_place = minetest.item_place,
|
||||||
|
on_drop = minetest.item_drop,
|
||||||
|
on_use = nil,
|
||||||
|
|
||||||
|
on_punch = minetest.node_punch,
|
||||||
|
on_dig = minetest.node_dig,
|
||||||
|
|
||||||
|
-- Node properties
|
||||||
|
drawtype = "normal",
|
||||||
|
visual_scale = 1.0,
|
||||||
|
tile_images = {""},
|
||||||
|
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,
|
||||||
|
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,
|
||||||
|
legacy_wallmounted = false,
|
||||||
|
}
|
||||||
|
|
||||||
|
minetest.craftitemdef_default = {
|
||||||
|
type="craft",
|
||||||
|
-- name intentionally not defined here
|
||||||
|
description = "",
|
||||||
|
groups = {},
|
||||||
|
inventory_image = "",
|
||||||
|
wield_image = "",
|
||||||
|
wield_scale = {x=1,y=1,z=1},
|
||||||
|
stack_max = 99,
|
||||||
|
liquids_pointable = false,
|
||||||
|
tool_capabilities = nil,
|
||||||
|
|
||||||
|
-- Interaction callbacks
|
||||||
|
on_place = minetest.item_place,
|
||||||
|
on_drop = minetest.item_drop,
|
||||||
|
on_use = nil,
|
||||||
|
}
|
||||||
|
|
||||||
|
minetest.tooldef_default = {
|
||||||
|
type="tool",
|
||||||
|
-- name intentionally not defined here
|
||||||
|
description = "",
|
||||||
|
groups = {},
|
||||||
|
inventory_image = "",
|
||||||
|
wield_image = "",
|
||||||
|
wield_scale = {x=1,y=1,z=1},
|
||||||
|
stack_max = 1,
|
||||||
|
liquids_pointable = false,
|
||||||
|
tool_capabilities = nil,
|
||||||
|
|
||||||
|
-- Interaction callbacks
|
||||||
|
on_place = minetest.item_place,
|
||||||
|
on_drop = minetest.item_drop,
|
||||||
|
on_use = nil,
|
||||||
|
}
|
||||||
|
|
||||||
|
minetest.noneitemdef_default = { -- This is used for the hand and unknown items
|
||||||
|
type="none",
|
||||||
|
-- name intentionally not defined here
|
||||||
|
description = "",
|
||||||
|
groups = {},
|
||||||
|
inventory_image = "",
|
||||||
|
wield_image = "",
|
||||||
|
wield_scale = {x=1,y=1,z=1},
|
||||||
|
stack_max = 99,
|
||||||
|
liquids_pointable = false,
|
||||||
|
tool_capabilities = nil,
|
||||||
|
|
||||||
|
-- Interaction callbacks
|
||||||
|
on_place = nil,
|
||||||
|
on_drop = nil,
|
||||||
|
on_use = nil,
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Make raw registration functions inaccessible to anyone except builtin.lua
|
||||||
|
--
|
||||||
|
|
||||||
|
local register_item_raw = minetest.register_item_raw
|
||||||
|
minetest.register_item_raw = nil
|
||||||
|
|
||||||
|
local register_alias_raw = minetest.register_alias_raw
|
||||||
|
minetest.register_item_raw = nil
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Item / entity / ABM registration functions
|
||||||
|
--
|
||||||
|
|
||||||
|
minetest.registered_abms = {}
|
||||||
|
minetest.registered_entities = {}
|
||||||
|
minetest.registered_items = {}
|
||||||
|
minetest.registered_nodes = {}
|
||||||
|
minetest.registered_craftitems = {}
|
||||||
|
minetest.registered_tools = {}
|
||||||
|
minetest.registered_aliases = {}
|
||||||
|
|
||||||
|
-- For tables that are indexed by item name:
|
||||||
|
-- If table[X] does not exist, default to table[minetest.registered_aliases[X]]
|
||||||
|
local function set_alias_metatable(table)
|
||||||
|
setmetatable(table, {
|
||||||
|
__index = function(name)
|
||||||
|
return rawget(table, minetest.registered_aliases[name])
|
||||||
|
end
|
||||||
|
})
|
||||||
|
end
|
||||||
|
set_alias_metatable(minetest.registered_items)
|
||||||
|
set_alias_metatable(minetest.registered_nodes)
|
||||||
|
set_alias_metatable(minetest.registered_craftitems)
|
||||||
|
set_alias_metatable(minetest.registered_tools)
|
||||||
|
|
||||||
|
-- These item names may not be used because they would interfere
|
||||||
|
-- with legacy itemstrings
|
||||||
|
local forbidden_item_names = {
|
||||||
|
MaterialItem = true,
|
||||||
|
MaterialItem2 = true,
|
||||||
|
MaterialItem3 = true,
|
||||||
|
NodeItem = true,
|
||||||
|
node = true,
|
||||||
|
CraftItem = true,
|
||||||
|
craft = true,
|
||||||
|
MBOItem = true,
|
||||||
|
ToolItem = true,
|
||||||
|
tool = true,
|
||||||
|
}
|
||||||
|
|
||||||
|
local function check_modname_prefix(name)
|
||||||
|
if name:sub(1,1) == ":" then
|
||||||
|
-- Escape the modname prefix enforcement mechanism
|
||||||
|
return name:sub(2)
|
||||||
|
else
|
||||||
|
-- Modname prefix enforcement
|
||||||
|
local expected_prefix = minetest.get_current_modname() .. ":"
|
||||||
|
if name:sub(1, #expected_prefix) ~= expected_prefix then
|
||||||
|
error("Name " .. name .. " does not follow naming conventions: " ..
|
||||||
|
"\"modname:\" or \":\" prefix required")
|
||||||
|
end
|
||||||
|
local subname = name:sub(#expected_prefix+1)
|
||||||
|
if subname:find("[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]") then
|
||||||
|
error("Name " .. name .. " does not follow naming conventions: " ..
|
||||||
|
"contains unallowed characters")
|
||||||
|
end
|
||||||
|
return name
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function minetest.register_abm(spec)
|
||||||
|
-- Add to minetest.registered_abms
|
||||||
|
minetest.registered_abms[#minetest.registered_abms+1] = spec
|
||||||
|
end
|
||||||
|
|
||||||
|
function minetest.register_entity(name, prototype)
|
||||||
|
-- Check name
|
||||||
|
if name == nil then
|
||||||
|
error("Unable to register entity: Name is nil")
|
||||||
|
end
|
||||||
|
name = check_modname_prefix(tostring(name))
|
||||||
|
|
||||||
|
prototype.name = name
|
||||||
|
prototype.__index = prototype -- so that it can be used as a metatable
|
||||||
|
|
||||||
|
-- Add to minetest.registered_entities
|
||||||
|
minetest.registered_entities[name] = prototype
|
||||||
|
end
|
||||||
|
|
||||||
|
function minetest.register_item(name, itemdef)
|
||||||
|
-- Check name
|
||||||
|
if name == nil then
|
||||||
|
error("Unable to register item: Name is nil")
|
||||||
|
end
|
||||||
|
name = check_modname_prefix(tostring(name))
|
||||||
|
if forbidden_item_names[name] then
|
||||||
|
error("Unable to register item: Name is forbidden: " .. name)
|
||||||
|
end
|
||||||
|
itemdef.name = name
|
||||||
|
|
||||||
|
-- Apply defaults and add to registered_* table
|
||||||
|
if itemdef.type == "node" then
|
||||||
|
setmetatable(itemdef, {__index = minetest.nodedef_default})
|
||||||
|
minetest.registered_nodes[itemdef.name] = itemdef
|
||||||
|
elseif itemdef.type == "craft" then
|
||||||
|
setmetatable(itemdef, {__index = minetest.craftitemdef_default})
|
||||||
|
minetest.registered_craftitems[itemdef.name] = itemdef
|
||||||
|
elseif itemdef.type == "tool" then
|
||||||
|
setmetatable(itemdef, {__index = minetest.tooldef_default})
|
||||||
|
minetest.registered_tools[itemdef.name] = itemdef
|
||||||
|
elseif itemdef.type == "none" then
|
||||||
|
setmetatable(itemdef, {__index = minetest.noneitemdef_default})
|
||||||
|
else
|
||||||
|
error("Unable to register item: Type is invalid: " .. dump(itemdef))
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Flowing liquid uses param2
|
||||||
|
if itemdef.type == "node" and itemdef.liquidtype == "flowing" then
|
||||||
|
itemdef.paramtype2 = "flowingliquid"
|
||||||
|
end
|
||||||
|
|
||||||
|
-- BEGIN Legacy stuff
|
||||||
|
if itemdef.cookresult_itemstring ~= nil and itemdef.cookresult_itemstring ~= "" then
|
||||||
|
minetest.register_craft({
|
||||||
|
type="cooking",
|
||||||
|
output=itemdef.cookresult_itemstring,
|
||||||
|
recipe=itemdef.name,
|
||||||
|
cooktime=itemdef.furnace_cooktime
|
||||||
|
})
|
||||||
|
end
|
||||||
|
if itemdef.furnace_burntime ~= nil and itemdef.furnace_burntime >= 0 then
|
||||||
|
minetest.register_craft({
|
||||||
|
type="fuel",
|
||||||
|
recipe=itemdef.name,
|
||||||
|
burntime=itemdef.furnace_burntime
|
||||||
|
})
|
||||||
|
end
|
||||||
|
-- END Legacy stuff
|
||||||
|
|
||||||
|
-- Disable all further modifications
|
||||||
|
getmetatable(itemdef).__newindex = {}
|
||||||
|
|
||||||
|
--minetest.log("Registering item: " .. itemdef.name)
|
||||||
|
minetest.registered_items[itemdef.name] = itemdef
|
||||||
|
minetest.registered_aliases[itemdef.name] = nil
|
||||||
|
register_item_raw(itemdef)
|
||||||
|
end
|
||||||
|
|
||||||
|
function minetest.register_node(name, nodedef)
|
||||||
|
nodedef.type = "node"
|
||||||
|
minetest.register_item(name, nodedef)
|
||||||
|
end
|
||||||
|
|
||||||
|
function minetest.register_craftitem(name, craftitemdef)
|
||||||
|
craftitemdef.type = "craft"
|
||||||
|
|
||||||
|
-- BEGIN Legacy stuff
|
||||||
|
if craftitemdef.inventory_image == nil and craftitemdef.image ~= nil then
|
||||||
|
craftitemdef.inventory_image = craftitemdef.image
|
||||||
|
end
|
||||||
|
-- END Legacy stuff
|
||||||
|
|
||||||
|
minetest.register_item(name, craftitemdef)
|
||||||
|
end
|
||||||
|
|
||||||
|
function minetest.register_tool(name, tooldef)
|
||||||
|
tooldef.type = "tool"
|
||||||
|
tooldef.stack_max = 1
|
||||||
|
|
||||||
|
-- BEGIN Legacy stuff
|
||||||
|
if tooldef.inventory_image == nil and tooldef.image ~= nil then
|
||||||
|
tooldef.inventory_image = tooldef.image
|
||||||
|
end
|
||||||
|
if tooldef.tool_capabilities == nil and
|
||||||
|
(tooldef.full_punch_interval ~= nil or
|
||||||
|
tooldef.basetime ~= nil or
|
||||||
|
tooldef.dt_weight ~= nil or
|
||||||
|
tooldef.dt_crackiness ~= nil or
|
||||||
|
tooldef.dt_crumbliness ~= nil or
|
||||||
|
tooldef.dt_cuttability ~= nil or
|
||||||
|
tooldef.basedurability ~= nil or
|
||||||
|
tooldef.dd_weight ~= nil or
|
||||||
|
tooldef.dd_crackiness ~= nil or
|
||||||
|
tooldef.dd_crumbliness ~= nil or
|
||||||
|
tooldef.dd_cuttability ~= nil) then
|
||||||
|
tooldef.tool_capabilities = {
|
||||||
|
full_punch_interval = tooldef.full_punch_interval,
|
||||||
|
basetime = tooldef.basetime,
|
||||||
|
dt_weight = tooldef.dt_weight,
|
||||||
|
dt_crackiness = tooldef.dt_crackiness,
|
||||||
|
dt_crumbliness = tooldef.dt_crumbliness,
|
||||||
|
dt_cuttability = tooldef.dt_cuttability,
|
||||||
|
basedurability = tooldef.basedurability,
|
||||||
|
dd_weight = tooldef.dd_weight,
|
||||||
|
dd_crackiness = tooldef.dd_crackiness,
|
||||||
|
dd_crumbliness = tooldef.dd_crumbliness,
|
||||||
|
dd_cuttability = tooldef.dd_cuttability,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
-- END Legacy stuff
|
||||||
|
|
||||||
|
minetest.register_item(name, tooldef)
|
||||||
|
end
|
||||||
|
|
||||||
|
function minetest.register_alias(name, convert_to)
|
||||||
|
if forbidden_item_names[name] then
|
||||||
|
error("Unable to register alias: Name is forbidden: " .. name)
|
||||||
|
end
|
||||||
|
if minetest.registered_items[name] ~= nil then
|
||||||
|
minetest.log("WARNING: Not registering alias, item with same name" ..
|
||||||
|
" is already defined: " .. name .. " -> " .. convert_to)
|
||||||
|
else
|
||||||
|
--minetest.log("Registering alias: " .. name .. " -> " .. convert_to)
|
||||||
|
minetest.registered_aliases[name] = convert_to
|
||||||
|
register_alias_raw(name, convert_to)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Alias the forbidden item names to "" so they can't be
|
||||||
|
-- created via itemstrings (e.g. /give)
|
||||||
|
local name
|
||||||
|
for name in pairs(forbidden_item_names) do
|
||||||
|
minetest.registered_aliases[name] = ""
|
||||||
|
register_alias_raw(name, "")
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
-- Deprecated:
|
||||||
|
-- Aliases for minetest.register_alias (how ironic...)
|
||||||
|
--minetest.alias_node = minetest.register_alias
|
||||||
|
--minetest.alias_tool = minetest.register_alias
|
||||||
|
--minetest.alias_craftitem = minetest.register_alias
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Built-in node definitions. Also defined in C.
|
||||||
|
--
|
||||||
|
|
||||||
|
minetest.register_item(":unknown", {
|
||||||
|
type = "none",
|
||||||
|
description = "Unknown Item",
|
||||||
|
inventory_image = "unknown_item.png",
|
||||||
|
on_place = minetest.item_place,
|
||||||
|
on_drop = minetest.item_drop,
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_node(":air", {
|
||||||
|
description = "Air (you hacker you!)",
|
||||||
|
inventory_image = "unknown_block.png",
|
||||||
|
wield_image = "unknown_block.png",
|
||||||
|
drawtype = "airlike",
|
||||||
|
paramtype = "light",
|
||||||
|
sunlight_propagates = true,
|
||||||
|
walkable = false,
|
||||||
|
pointable = false,
|
||||||
|
diggable = false,
|
||||||
|
buildable_to = true,
|
||||||
|
air_equivalent = true,
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_node(":ignore", {
|
||||||
|
description = "Ignore (you hacker you!)",
|
||||||
|
inventory_image = "unknown_block.png",
|
||||||
|
wield_image = "unknown_block.png",
|
||||||
|
drawtype = "airlike",
|
||||||
|
paramtype = "none",
|
||||||
|
sunlight_propagates = false,
|
||||||
|
walkable = false,
|
||||||
|
pointable = false,
|
||||||
|
diggable = false,
|
||||||
|
buildable_to = true, -- A way to remove accidentally placed ignores
|
||||||
|
air_equivalent = true,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- The hand (bare definition)
|
||||||
|
minetest.register_item(":", {
|
||||||
|
type = "none",
|
||||||
|
})
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Default material types
|
||||||
|
--
|
||||||
|
|
||||||
|
function minetest.digprop_constanttime(time)
|
||||||
|
return {
|
||||||
|
diggability = "constant",
|
||||||
|
constant_time = time,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
function minetest.digprop_stonelike(toughness)
|
||||||
|
return {
|
||||||
|
diggablity = "normal",
|
||||||
|
weight = toughness * 5,
|
||||||
|
crackiness = 1,
|
||||||
|
crumbliness = -0.1,
|
||||||
|
cuttability = -0.2,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
function minetest.digprop_dirtlike(toughness)
|
||||||
|
return {
|
||||||
|
diggablity = "normal",
|
||||||
|
weight = toughness * 1.2,
|
||||||
|
crackiness = 0,
|
||||||
|
crumbliness = 1.2,
|
||||||
|
cuttability = -0.4,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
function minetest.digprop_gravellike(toughness)
|
||||||
|
return {
|
||||||
|
diggablity = "normal",
|
||||||
|
weight = toughness * 2,
|
||||||
|
crackiness = 0.2,
|
||||||
|
crumbliness = 1.5,
|
||||||
|
cuttability = -1.0,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
function minetest.digprop_woodlike(toughness)
|
||||||
|
return {
|
||||||
|
diggablity = "normal",
|
||||||
|
weight = toughness * 1.0,
|
||||||
|
crackiness = 0.75,
|
||||||
|
crumbliness = -1.0,
|
||||||
|
cuttability = 1.5,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
function minetest.digprop_leaveslike(toughness)
|
||||||
|
return {
|
||||||
|
diggablity = "normal",
|
||||||
|
weight = toughness * (-0.5),
|
||||||
|
crackiness = 0,
|
||||||
|
crumbliness = 0,
|
||||||
|
cuttability = 2.0,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
function minetest.digprop_glasslike(toughness)
|
||||||
|
return {
|
||||||
|
diggablity = "normal",
|
||||||
|
weight = toughness * 0.1,
|
||||||
|
crackiness = 2.0,
|
||||||
|
crumbliness = -1.0,
|
||||||
|
cuttability = -1.0,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Creative inventory
|
||||||
|
--
|
||||||
|
|
||||||
|
minetest.creative_inventory = {}
|
||||||
|
|
||||||
|
minetest.add_to_creative_inventory = function(itemstring)
|
||||||
|
table.insert(minetest.creative_inventory, itemstring)
|
||||||
|
end
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Callback registration
|
||||||
|
--
|
||||||
|
|
||||||
|
local function make_registration()
|
||||||
|
local t = {}
|
||||||
|
local registerfunc = function(func) table.insert(t, func) end
|
||||||
|
return t, registerfunc
|
||||||
|
end
|
||||||
|
|
||||||
|
minetest.registered_on_chat_messages, minetest.register_on_chat_message = make_registration()
|
||||||
|
minetest.registered_globalsteps, minetest.register_globalstep = make_registration()
|
||||||
|
minetest.registered_on_placenodes, minetest.register_on_placenode = make_registration()
|
||||||
|
minetest.registered_on_dignodes, minetest.register_on_dignode = make_registration()
|
||||||
|
minetest.registered_on_punchnodes, minetest.register_on_punchnode = make_registration()
|
||||||
|
minetest.registered_on_generateds, minetest.register_on_generated = make_registration()
|
||||||
|
minetest.registered_on_newplayers, minetest.register_on_newplayer = make_registration()
|
||||||
|
minetest.registered_on_dieplayers, minetest.register_on_dieplayer = make_registration()
|
||||||
|
minetest.registered_on_respawnplayers, minetest.register_on_respawnplayer = make_registration()
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Set random seed
|
||||||
|
--
|
||||||
|
|
||||||
|
math.randomseed(os.time())
|
||||||
|
|
||||||
|
-- END
|
||||||
95
share/server/games/mesetint/mods/bucket/init.lua
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
-- bucket (Minetest 0.4 mod)
|
||||||
|
-- A bucket, which can pick up water and lava
|
||||||
|
|
||||||
|
minetest.register_alias("bucket", "bucket:bucket_empty")
|
||||||
|
minetest.register_alias("bucket_water", "bucket:bucket_water")
|
||||||
|
minetest.register_alias("bucket_lava", "bucket:bucket_lava")
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = 'bucket:bucket_empty 1',
|
||||||
|
recipe = {
|
||||||
|
{'default:steel_ingot', '', 'default:steel_ingot'},
|
||||||
|
{'', 'default:steel_ingot', ''},
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
bucket = {}
|
||||||
|
bucket.liquids = {}
|
||||||
|
|
||||||
|
-- Register a new liquid
|
||||||
|
-- source = name of the source node
|
||||||
|
-- flowing = name of the flowing node
|
||||||
|
-- itemname = name of the new bucket item (or nil if liquid is not takeable)
|
||||||
|
-- inventory_image = texture of the new bucket item (ignored if itemname == nil)
|
||||||
|
-- This function can be called from any mod (that depends on bucket).
|
||||||
|
function bucket.register_liquid(source, flowing, itemname, inventory_image)
|
||||||
|
bucket.liquids[source] = {
|
||||||
|
source = source,
|
||||||
|
flowing = flowing,
|
||||||
|
itemname = itemname,
|
||||||
|
}
|
||||||
|
bucket.liquids[flowing] = bucket.liquids[source]
|
||||||
|
|
||||||
|
if itemname ~= nil then
|
||||||
|
minetest.register_craftitem(itemname, {
|
||||||
|
inventory_image = inventory_image,
|
||||||
|
stack_max = 1,
|
||||||
|
liquids_pointable = true,
|
||||||
|
on_use = function(itemstack, user, pointed_thing)
|
||||||
|
-- Must be pointing to node
|
||||||
|
if pointed_thing.type ~= "node" then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
-- Check if pointing to a liquid
|
||||||
|
n = minetest.env:get_node(pointed_thing.under)
|
||||||
|
if bucket.liquids[n.name] == nil then
|
||||||
|
-- Not a liquid
|
||||||
|
minetest.env:add_node(pointed_thing.above, {name=source})
|
||||||
|
elseif n.name ~= source then
|
||||||
|
-- It's a liquid
|
||||||
|
minetest.env:add_node(pointed_thing.under, {name=source})
|
||||||
|
end
|
||||||
|
return {name="bucket:bucket_empty"}
|
||||||
|
end
|
||||||
|
})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
minetest.register_craftitem("bucket:bucket_empty", {
|
||||||
|
inventory_image = "bucket.png",
|
||||||
|
stack_max = 1,
|
||||||
|
liquids_pointable = true,
|
||||||
|
on_use = function(itemstack, user, pointed_thing)
|
||||||
|
-- Must be pointing to node
|
||||||
|
if pointed_thing.type ~= "node" then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
-- Check if pointing to a liquid source
|
||||||
|
n = minetest.env:get_node(pointed_thing.under)
|
||||||
|
liquiddef = bucket.liquids[n.name]
|
||||||
|
if liquiddef ~= nil and liquiddef.source == n.name and liquiddef.itemname ~= nil then
|
||||||
|
minetest.env:add_node(pointed_thing.under, {name="air"})
|
||||||
|
return {name=liquiddef.itemname}
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
bucket.register_liquid(
|
||||||
|
"default:water_source",
|
||||||
|
"default:water_flowing",
|
||||||
|
"bucket:bucket_water",
|
||||||
|
"bucket_water.png"
|
||||||
|
)
|
||||||
|
|
||||||
|
bucket.register_liquid(
|
||||||
|
"default:lava_source",
|
||||||
|
"default:lava_flowing",
|
||||||
|
"bucket:bucket_lava",
|
||||||
|
"bucket_lava.png"
|
||||||
|
)
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
type = "fuel",
|
||||||
|
recipe = "default:bucket_lava",
|
||||||
|
burntime = 60,
|
||||||
|
})
|
||||||
|
Before Width: | Height: | Size: 329 B After Width: | Height: | Size: 329 B |
|
Before Width: | Height: | Size: 363 B After Width: | Height: | Size: 363 B |
|
Before Width: | Height: | Size: 369 B After Width: | Height: | Size: 369 B |
1832
share/server/games/mesetint/mods/default/init.lua
Normal file
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 203 B After Width: | Height: | Size: 203 B |
|
Before Width: | Height: | Size: 292 B After Width: | Height: | Size: 292 B |
|
Before Width: | Height: | Size: 597 B After Width: | Height: | Size: 597 B |
|
Before Width: | Height: | Size: 604 B After Width: | Height: | Size: 604 B |
|
Before Width: | Height: | Size: 279 B After Width: | Height: | Size: 279 B |
|
Before Width: | Height: | Size: 236 B After Width: | Height: | Size: 236 B |
|
Before Width: | Height: | Size: 167 B After Width: | Height: | Size: 167 B |
|
Before Width: | Height: | Size: 224 B After Width: | Height: | Size: 224 B |
|
Before Width: | Height: | Size: 151 B After Width: | Height: | Size: 151 B |
|
Before Width: | Height: | Size: 142 B After Width: | Height: | Size: 142 B |
|
Before Width: | Height: | Size: 613 B After Width: | Height: | Size: 613 B |
|
Before Width: | Height: | Size: 249 B After Width: | Height: | Size: 249 B |
|
Before Width: | Height: | Size: 210 B After Width: | Height: | Size: 210 B |
|
Before Width: | Height: | Size: 118 B After Width: | Height: | Size: 118 B |
|
Before Width: | Height: | Size: 933 B After Width: | Height: | Size: 933 B |
|
Before Width: | Height: | Size: 830 B After Width: | Height: | Size: 830 B |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 539 B After Width: | Height: | Size: 539 B |
|
Before Width: | Height: | Size: 246 B After Width: | Height: | Size: 246 B |
|
Before Width: | Height: | Size: 236 B After Width: | Height: | Size: 236 B |
|
Before Width: | Height: | Size: 978 B After Width: | Height: | Size: 978 B |
|
Before Width: | Height: | Size: 874 B After Width: | Height: | Size: 874 B |
|
Before Width: | Height: | Size: 856 B After Width: | Height: | Size: 856 B |
|
Before Width: | Height: | Size: 878 B After Width: | Height: | Size: 878 B |
|
Before Width: | Height: | Size: 591 B After Width: | Height: | Size: 591 B |
|
Before Width: | Height: | Size: 936 B After Width: | Height: | Size: 936 B |
|
Before Width: | Height: | Size: 672 B After Width: | Height: | Size: 672 B |
|
Before Width: | Height: | Size: 502 B After Width: | Height: | Size: 502 B |
|
Before Width: | Height: | Size: 507 B After Width: | Height: | Size: 507 B |
|
Before Width: | Height: | Size: 395 B After Width: | Height: | Size: 395 B |
|
Before Width: | Height: | Size: 357 B After Width: | Height: | Size: 357 B |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 203 B After Width: | Height: | Size: 203 B |
|
Before Width: | Height: | Size: 952 B After Width: | Height: | Size: 952 B |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 965 B After Width: | Height: | Size: 965 B |
|
Before Width: | Height: | Size: 303 B After Width: | Height: | Size: 303 B |
|
Before Width: | Height: | Size: 410 B After Width: | Height: | Size: 410 B |
|
Before Width: | Height: | Size: 203 B After Width: | Height: | Size: 203 B |
|
Before Width: | Height: | Size: 260 B After Width: | Height: | Size: 260 B |
|
Before Width: | Height: | Size: 242 B After Width: | Height: | Size: 242 B |
|
Before Width: | Height: | Size: 366 B After Width: | Height: | Size: 366 B |
|
Before Width: | Height: | Size: 507 B After Width: | Height: | Size: 507 B |
|
Before Width: | Height: | Size: 555 B After Width: | Height: | Size: 555 B |
|
Before Width: | Height: | Size: 545 B After Width: | Height: | Size: 545 B |
|
Before Width: | Height: | Size: 542 B After Width: | Height: | Size: 542 B |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 772 B After Width: | Height: | Size: 772 B |
|
Before Width: | Height: | Size: 502 B After Width: | Height: | Size: 502 B |
|
Before Width: | Height: | Size: 233 B After Width: | Height: | Size: 233 B |
|
Before Width: | Height: | Size: 489 B After Width: | Height: | Size: 489 B |
|
Before Width: | Height: | Size: 219 B After Width: | Height: | Size: 219 B |
|
Before Width: | Height: | Size: 207 B After Width: | Height: | Size: 207 B |
|
Before Width: | Height: | Size: 182 B After Width: | Height: | Size: 182 B |
|
Before Width: | Height: | Size: 806 B After Width: | Height: | Size: 806 B |
|
Before Width: | Height: | Size: 161 B After Width: | Height: | Size: 161 B |
|
Before Width: | Height: | Size: 186 B After Width: | Height: | Size: 186 B |
|
Before Width: | Height: | Size: 264 B After Width: | Height: | Size: 264 B |
|
Before Width: | Height: | Size: 252 B After Width: | Height: | Size: 252 B |
|
Before Width: | Height: | Size: 927 B After Width: | Height: | Size: 927 B |