Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • Illuna-Minetest/minetest_game
  • ClaudiusMinimus/minetest_game
  • xthediamondlegox/minetest_game
  • Elvas/minetest_game
4 results
Show changes
Showing
with 319 additions and 282 deletions
...@@ -41,8 +41,6 @@ minetest.register_alias("locked_chest", "default:chest_locked") ...@@ -41,8 +41,6 @@ minetest.register_alias("locked_chest", "default:chest_locked")
minetest.register_alias("cobble", "default:cobble") minetest.register_alias("cobble", "default:cobble")
minetest.register_alias("mossycobble", "default:mossycobble") minetest.register_alias("mossycobble", "default:mossycobble")
minetest.register_alias("steelblock", "default:steelblock") minetest.register_alias("steelblock", "default:steelblock")
minetest.register_alias("nyancat", "default:nyancat")
minetest.register_alias("nyancat_rainbow", "default:nyancat_rainbow")
minetest.register_alias("sapling", "default:sapling") minetest.register_alias("sapling", "default:sapling")
minetest.register_alias("apple", "default:apple") minetest.register_alias("apple", "default:apple")
...@@ -79,4 +77,3 @@ minetest.register_alias("default:pinewood", "default:pine_wood") ...@@ -79,4 +77,3 @@ minetest.register_alias("default:pinewood", "default:pine_wood")
minetest.register_alias("default:ladder", "default:ladder_wood") minetest.register_alias("default:ladder", "default:ladder_wood")
minetest.register_alias("default:sign_wall", "default:sign_wall_wood") minetest.register_alias("default:sign_wall", "default:sign_wall_wood")
...@@ -888,18 +888,6 @@ minetest.register_craft({ ...@@ -888,18 +888,6 @@ minetest.register_craft({
burntime = 30, burntime = 30,
}) })
minetest.register_craft({
type = "fuel",
recipe = "default:nyancat",
burntime = 1,
})
minetest.register_craft({
type = "fuel",
recipe = "default:nyancat_rainbow",
burntime = 1,
})
minetest.register_craft({ minetest.register_craft({
type = "fuel", type = "fuel",
recipe = "group:sapling", recipe = "group:sapling",
...@@ -935,4 +923,3 @@ minetest.register_craft({ ...@@ -935,4 +923,3 @@ minetest.register_craft({
recipe = "default:dry_grass_1", recipe = "default:dry_grass_1",
burntime = 2, burntime = 2,
}) })
...@@ -120,6 +120,7 @@ default.cool_lava = function(pos, node) ...@@ -120,6 +120,7 @@ default.cool_lava = function(pos, node)
end end
minetest.register_abm({ minetest.register_abm({
label = "Lava cooling",
nodenames = {"default:lava_source", "default:lava_flowing"}, nodenames = {"default:lava_source", "default:lava_flowing"},
neighbors = {"group:water"}, neighbors = {"group:water"},
interval = 1, interval = 1,
...@@ -134,6 +135,7 @@ minetest.register_abm({ ...@@ -134,6 +135,7 @@ minetest.register_abm({
-- --
-- optimized helper to put all items in an inventory into a drops list -- optimized helper to put all items in an inventory into a drops list
-- --
function default.get_inventory_drops(pos, inventory, drops) function default.get_inventory_drops(pos, inventory, drops)
local inv = minetest.get_meta(pos):get_inventory() local inv = minetest.get_meta(pos):get_inventory()
local n = #drops local n = #drops
...@@ -198,6 +200,7 @@ function default.grow_papyrus(pos, node) ...@@ -198,6 +200,7 @@ function default.grow_papyrus(pos, node)
end end
minetest.register_abm({ minetest.register_abm({
label = "Grow cactus",
nodenames = {"default:cactus"}, nodenames = {"default:cactus"},
neighbors = {"group:sand"}, neighbors = {"group:sand"},
interval = 12, interval = 12,
...@@ -208,6 +211,7 @@ minetest.register_abm({ ...@@ -208,6 +211,7 @@ minetest.register_abm({
}) })
minetest.register_abm({ minetest.register_abm({
label = "Grow papyrus",
nodenames = {"default:papyrus"}, nodenames = {"default:papyrus"},
neighbors = {"default:dirt", "default:dirt_with_grass"}, neighbors = {"default:dirt", "default:dirt_with_grass"},
interval = 14, interval = 14,
...@@ -235,6 +239,7 @@ end ...@@ -235,6 +239,7 @@ end
-- --
-- Fence registration helper -- Fence registration helper
-- --
function default.register_fence(name, def) function default.register_fence(name, def)
minetest.register_craft({ minetest.register_craft({
output = name .. " 4", output = name .. " 4",
...@@ -281,16 +286,7 @@ end ...@@ -281,16 +286,7 @@ end
-- Leafdecay -- Leafdecay
-- --
default.leafdecay_trunk_cache = {} -- Prevent decay of placed leaves
default.leafdecay_enable_cache = true
-- Spread the load of finding trunks
default.leafdecay_trunk_find_allow_accumulator = 0
minetest.register_globalstep(function(dtime)
local finds_per_second = 5000
default.leafdecay_trunk_find_allow_accumulator =
math.floor(dtime * finds_per_second)
end)
default.after_place_leaves = function(pos, placer, itemstack, pointed_thing) default.after_place_leaves = function(pos, placer, itemstack, pointed_thing)
if placer and not placer:get_player_control().sneak then if placer and not placer:get_player_control().sneak then
...@@ -300,79 +296,44 @@ default.after_place_leaves = function(pos, placer, itemstack, pointed_thing) ...@@ -300,79 +296,44 @@ default.after_place_leaves = function(pos, placer, itemstack, pointed_thing)
end end
end end
-- Leafdecay ABM
minetest.register_abm({ minetest.register_abm({
label = "Leaf decay",
nodenames = {"group:leafdecay"}, nodenames = {"group:leafdecay"},
neighbors = {"air", "group:liquid"}, neighbors = {"air"},
-- A low interval and a high inverse chance spreads the load
interval = 2, interval = 2,
chance = 5, chance = 10,
catch_up = false,
action = function(p0, node, _, _)
--print("leafdecay ABM at "..p0.x..", "..p0.y..", "..p0.z..")") action = function(pos, node, _, _)
local do_preserve = false -- Check if leaf is placed
local d = minetest.registered_nodes[node.name].groups.leafdecay if node.param2 ~= 0 then
if not d or d == 0 then
--print("not groups.leafdecay")
return
end
local n0 = minetest.get_node(p0)
if n0.param2 ~= 0 then
--print("param2 ~= 0")
return return
end end
local p0_hash = nil
if default.leafdecay_enable_cache then local rad = minetest.registered_nodes[node.name].groups.leafdecay
p0_hash = minetest.hash_node_position(p0) -- Assume ignore is a trunk, to make this
local trunkp = default.leafdecay_trunk_cache[p0_hash] -- work at the border of a loaded area
if trunkp then if minetest.find_node_near(pos, rad, {"ignore", "group:tree"}) then
local n = minetest.get_node(trunkp)
local reg = minetest.registered_nodes[n.name]
-- Assume ignore is a trunk, to make the thing
-- work at the border of the active area
if n.name == "ignore" or (reg and reg.groups.tree and
reg.groups.tree ~= 0) then
--print("cached trunk still exists")
return
end
--print("cached trunk is invalid")
-- Cache is invalid
table.remove(default.leafdecay_trunk_cache, p0_hash)
end
end
if default.leafdecay_trunk_find_allow_accumulator <= 0 then
return return
end end
default.leafdecay_trunk_find_allow_accumulator = -- Drop stuff
default.leafdecay_trunk_find_allow_accumulator - 1 local itemstacks = minetest.get_node_drops(node.name)
-- Assume ignore is a trunk, to make the thing for _, itemname in ipairs(itemstacks) do
-- work at the border of the active area if itemname ~= node.name or
local p1 = minetest.find_node_near(p0, d, {"ignore", "group:tree"}) minetest.get_item_group(node.name, "leafdecay_drop") ~= 0 then
if p1 then local p_drop = {
do_preserve = true x = pos.x - 0.5 + math.random(),
if default.leafdecay_enable_cache then y = pos.y - 0.5 + math.random(),
--print("caching trunk") z = pos.z - 0.5 + math.random(),
-- Cache the trunk }
default.leafdecay_trunk_cache[p0_hash] = p1 minetest.add_item(p_drop, itemname)
end
end
if not do_preserve then
-- Drop stuff other than the node itself
local itemstacks = minetest.get_node_drops(n0.name)
for _, itemname in ipairs(itemstacks) do
if minetest.get_item_group(n0.name, "leafdecay_drop") ~= 0 or
itemname ~= n0.name then
local p_drop = {
x = p0.x - 0.5 + math.random(),
y = p0.y - 0.5 + math.random(),
z = p0.z - 0.5 + math.random(),
}
minetest.add_item(p_drop, itemname)
end
end end
-- Remove node
minetest.remove_node(p0)
nodeupdate(p0)
end end
-- Remove node
minetest.remove_node(pos)
nodeupdate(pos)
end end
}) })
...@@ -382,6 +343,7 @@ minetest.register_abm({ ...@@ -382,6 +343,7 @@ minetest.register_abm({
-- --
minetest.register_abm({ minetest.register_abm({
label = "Grass spread",
nodenames = {"default:dirt"}, nodenames = {"default:dirt"},
neighbors = { neighbors = {
"default:dirt_with_grass", "default:dirt_with_grass",
...@@ -433,11 +395,13 @@ minetest.register_abm({ ...@@ -433,11 +395,13 @@ minetest.register_abm({
end end
}) })
-- --
-- Grass and dry grass removed in darkness -- Grass and dry grass removed in darkness
-- --
minetest.register_abm({ minetest.register_abm({
label = "Grass covered",
nodenames = { nodenames = {
"default:dirt_with_grass", "default:dirt_with_grass",
"default:dirt_with_dry_grass", "default:dirt_with_dry_grass",
...@@ -464,6 +428,7 @@ minetest.register_abm({ ...@@ -464,6 +428,7 @@ minetest.register_abm({
-- --
minetest.register_abm({ minetest.register_abm({
label = "Moss growth",
nodenames = {"default:cobble", "stairs:slab_cobble", "stairs:stair_cobble"}, nodenames = {"default:cobble", "stairs:slab_cobble", "stairs:stair_cobble"},
neighbors = {"group:water"}, neighbors = {"group:water"},
interval = 16, interval = 16,
...@@ -479,3 +444,43 @@ minetest.register_abm({ ...@@ -479,3 +444,43 @@ minetest.register_abm({
end end
end end
}) })
--
-- Checks if specified volume intersects a protected volume
--
function default.intersects_protection(minp, maxp, player_name, interval)
-- 'interval' is the largest allowed interval for the 3D lattice of checks
-- Compute the optimal float step 'd' for each axis so that all corners and
-- borders are checked. 'd' will be smaller or equal to 'interval'.
-- Subtracting 1e-4 ensures that the max co-ordinate will be reached by the
-- for loop (which might otherwise not be the case due to rounding errors).
local d = {}
for _, c in pairs({"x", "y", "z"}) do
if maxp[c] > minp[c] then
d[c] = (maxp[c] - minp[c]) / math.ceil((maxp[c] - minp[c]) / interval) - 1e-4
elseif maxp[c] == minp[c] then
d[c] = 1 -- Any value larger than 0 to avoid division by zero
else -- maxp[c] < minp[c], print error and treat as protection intersected
minetest.log("error", "maxp < minp in 'default.intersects_protection()'")
return true
end
end
for zf = minp.z, maxp.z, d.z do
local z = math.floor(zf + 0.5)
for yf = minp.y, maxp.y, d.y do
local y = math.floor(yf + 0.5)
for xf = minp.x, maxp.x, d.x do
local x = math.floor(xf + 0.5)
if minetest.is_protected({x = x, y = y, z = z}, player_name) then
return true
end
end
end
end
return false
end
...@@ -35,14 +35,16 @@ default.gui_survival_form = "size[8,8.5]".. ...@@ -35,14 +35,16 @@ default.gui_survival_form = "size[8,8.5]"..
default.get_hotbar_bg(0,4.25) default.get_hotbar_bg(0,4.25)
-- Load files -- Load files
dofile(minetest.get_modpath("default").."/functions.lua") local default_path = minetest.get_modpath("default")
dofile(minetest.get_modpath("default").."/trees.lua")
dofile(minetest.get_modpath("default").."/nodes.lua") dofile(default_path.."/functions.lua")
dofile(minetest.get_modpath("default").."/furnace.lua") dofile(default_path.."/trees.lua")
dofile(minetest.get_modpath("default").."/tools.lua") dofile(default_path.."/nodes.lua")
dofile(minetest.get_modpath("default").."/craftitems.lua") dofile(default_path.."/furnace.lua")
dofile(minetest.get_modpath("default").."/crafting.lua") dofile(default_path.."/tools.lua")
dofile(minetest.get_modpath("default").."/mapgen.lua") dofile(default_path.."/craftitems.lua")
dofile(minetest.get_modpath("default").."/player.lua") dofile(default_path.."/crafting.lua")
dofile(minetest.get_modpath("default").."/aliases.lua") dofile(default_path.."/mapgen.lua")
dofile(minetest.get_modpath("default").."/legacy.lua") dofile(default_path.."/player.lua")
dofile(default_path.."/aliases.lua")
dofile(default_path.."/legacy.lua")
...@@ -49,7 +49,7 @@ function default.register_ores() ...@@ -49,7 +49,7 @@ function default.register_ores()
-- Clay -- Clay
-- This first to avoid clay in sand blobs -- This first to avoid clay in sand blobs
minetest.register_ore({ minetest.register_ore({
ore_type = "blob", ore_type = "blob",
ore = "default:clay", ore = "default:clay",
wherein = {"default:sand"}, wherein = {"default:sand"},
...@@ -70,7 +70,7 @@ function default.register_ores() ...@@ -70,7 +70,7 @@ function default.register_ores()
-- Sand -- Sand
minetest.register_ore({ minetest.register_ore({
ore_type = "blob", ore_type = "blob",
ore = "default:sand", ore = "default:sand",
wherein = {"default:stone", "default:sandstone", wherein = {"default:stone", "default:sandstone",
...@@ -1464,73 +1464,16 @@ function default.register_decorations() ...@@ -1464,73 +1464,16 @@ function default.register_decorations()
end end
--
-- Generate nyan cats
--
-- All mapgens except singlenode
function default.make_nyancat(pos, facedir, length)
local tailvec = {x = 0, y = 0, z = 0}
if facedir == 0 then
tailvec.z = 1
elseif facedir == 1 then
tailvec.x = 1
elseif facedir == 2 then
tailvec.z = -1
elseif facedir == 3 then
tailvec.x = -1
else
facedir = 0
tailvec.z = 1
end
local p = {x = pos.x, y = pos.y, z = pos.z}
minetest.set_node(p, {name = "default:nyancat", param2 = facedir})
for i = 1, length do
p.x = p.x + tailvec.x
p.z = p.z + tailvec.z
minetest.set_node(p, {name = "default:nyancat_rainbow", param2 = facedir})
end
end
function default.generate_nyancats(minp, maxp, seed)
local height_min = -31000
local height_max = -32
if maxp.y < height_min or minp.y > height_max then
return
end
local y_min = math.max(minp.y, height_min)
local y_max = math.min(maxp.y, height_max)
local volume = (maxp.x - minp.x + 1) * (y_max - y_min + 1) * (maxp.z - minp.z + 1)
local pr = PseudoRandom(seed + 9324342)
local max_num_nyancats = math.floor(volume / (16 * 16 * 16))
for i = 1, max_num_nyancats do
if pr:next(0, 1000) == 0 then
local x0 = pr:next(minp.x, maxp.x)
local y0 = pr:next(minp.y, maxp.y)
local z0 = pr:next(minp.z, maxp.z)
local p0 = {x = x0, y = y0, z = z0}
default.make_nyancat(p0, pr:next(0, 3), pr:next(3, 15))
end
end
end
-- --
-- Detect mapgen to select functions -- Detect mapgen to select functions
-- --
-- Mods using singlenode mapgen can call these functions to enable
-- the use of minetest.generate_ores or minetest.generate_decorations
local mg_name = minetest.get_mapgen_setting("mg_name") local mg_name = minetest.get_mapgen_setting("mg_name")
if mg_name == "v6" then if mg_name == "v6" then
default.register_ores() default.register_ores()
default.register_mgv6_decorations() default.register_mgv6_decorations()
minetest.register_on_generated(default.generate_nyancats) else
elseif mg_name ~= "singlenode" then
default.register_biomes() default.register_biomes()
default.register_ores() default.register_ores()
default.register_decorations() default.register_decorations()
minetest.register_on_generated(default.generate_nyancats)
end end
...@@ -178,8 +178,6 @@ Misc ...@@ -178,8 +178,6 @@ Misc
---- ----
default:cloud default:cloud
default:nyancat
default:nyancat_rainbow
--]] --]]
...@@ -424,6 +422,7 @@ minetest.register_node("default:snow", { ...@@ -424,6 +422,7 @@ minetest.register_node("default:snow", {
paramtype = "light", paramtype = "light",
buildable_to = true, buildable_to = true,
floodable = true, floodable = true,
walkable = false,
drawtype = "nodebox", drawtype = "nodebox",
node_box = { node_box = {
type = "fixed", type = "fixed",
...@@ -487,7 +486,7 @@ minetest.register_node("default:wood", { ...@@ -487,7 +486,7 @@ minetest.register_node("default:wood", {
place_param2 = 0, place_param2 = 0,
tiles = {"default_wood.png"}, tiles = {"default_wood.png"},
is_ground_content = false, is_ground_content = false,
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
}) })
...@@ -502,9 +501,6 @@ minetest.register_node("default:sapling", { ...@@ -502,9 +501,6 @@ minetest.register_node("default:sapling", {
sunlight_propagates = true, sunlight_propagates = true,
walkable = false, walkable = false,
on_timer = default.grow_sapling, on_timer = default.grow_sapling,
on_construct = function(pos)
minetest.get_node_timer(pos):start(math.random(2400,4800))
end,
selection_box = { selection_box = {
type = "fixed", type = "fixed",
fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
...@@ -512,6 +508,23 @@ minetest.register_node("default:sapling", { ...@@ -512,6 +508,23 @@ minetest.register_node("default:sapling", {
groups = {snappy = 2, dig_immediate = 3, flammable = 2, groups = {snappy = 2, dig_immediate = 3, flammable = 2,
attached_node = 1, sapling = 1}, attached_node = 1, sapling = 1},
sounds = default.node_sound_leaves_defaults(), sounds = default.node_sound_leaves_defaults(),
on_construct = function(pos)
minetest.get_node_timer(pos):start(math.random(2400,4800))
end,
on_place = function(itemstack, placer, pointed_thing)
itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
"default:sapling",
-- minp, maxp to be checked, relative to sapling pos
-- minp_relative.y = 1 because sapling pos has been checked
{x = -2, y = 1, z = -2},
{x = 2, y = 6, z = 2},
-- maximum interval of interior volume check
4)
return itemstack
end,
}) })
minetest.register_node("default:leaves", { minetest.register_node("default:leaves", {
...@@ -589,7 +602,7 @@ minetest.register_node("default:junglewood", { ...@@ -589,7 +602,7 @@ minetest.register_node("default:junglewood", {
place_param2 = 0, place_param2 = 0,
tiles = {"default_junglewood.png"}, tiles = {"default_junglewood.png"},
is_ground_content = false, is_ground_content = false,
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
}) })
...@@ -626,9 +639,6 @@ minetest.register_node("default:junglesapling", { ...@@ -626,9 +639,6 @@ minetest.register_node("default:junglesapling", {
sunlight_propagates = true, sunlight_propagates = true,
walkable = false, walkable = false,
on_timer = default.grow_sapling, on_timer = default.grow_sapling,
on_construct = function(pos)
minetest.get_node_timer(pos):start(math.random(2400,4800))
end,
selection_box = { selection_box = {
type = "fixed", type = "fixed",
fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
...@@ -636,6 +646,23 @@ minetest.register_node("default:junglesapling", { ...@@ -636,6 +646,23 @@ minetest.register_node("default:junglesapling", {
groups = {snappy = 2, dig_immediate = 3, flammable = 2, groups = {snappy = 2, dig_immediate = 3, flammable = 2,
attached_node = 1, sapling = 1}, attached_node = 1, sapling = 1},
sounds = default.node_sound_leaves_defaults(), sounds = default.node_sound_leaves_defaults(),
on_construct = function(pos)
minetest.get_node_timer(pos):start(math.random(2400,4800))
end,
on_place = function(itemstack, placer, pointed_thing)
itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
"default:junglesapling",
-- minp, maxp to be checked, relative to sapling pos
-- minp_relative.y = 1 because sapling pos has been checked
{x = -2, y = 1, z = -2},
{x = 2, y = 15, z = 2},
-- maximum interval of interior volume check
4)
return itemstack
end,
}) })
...@@ -645,7 +672,7 @@ minetest.register_node("default:pine_tree", { ...@@ -645,7 +672,7 @@ minetest.register_node("default:pine_tree", {
"default_pine_tree.png"}, "default_pine_tree.png"},
paramtype2 = "facedir", paramtype2 = "facedir",
is_ground_content = false, is_ground_content = false,
groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
on_place = minetest.rotate_node on_place = minetest.rotate_node
...@@ -657,7 +684,7 @@ minetest.register_node("default:pine_wood", { ...@@ -657,7 +684,7 @@ minetest.register_node("default:pine_wood", {
place_param2 = 0, place_param2 = 0,
tiles = {"default_pine_wood.png"}, tiles = {"default_pine_wood.png"},
is_ground_content = false, is_ground_content = false,
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
}) })
...@@ -693,16 +720,30 @@ minetest.register_node("default:pine_sapling", { ...@@ -693,16 +720,30 @@ minetest.register_node("default:pine_sapling", {
sunlight_propagates = true, sunlight_propagates = true,
walkable = false, walkable = false,
on_timer = default.grow_sapling, on_timer = default.grow_sapling,
on_construct = function(pos)
minetest.get_node_timer(pos):start(math.random(2400,4800))
end,
selection_box = { selection_box = {
type = "fixed", type = "fixed",
fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
}, },
groups = {snappy = 2, dig_immediate = 3, flammable = 2, groups = {snappy = 2, dig_immediate = 3, flammable = 3,
attached_node = 1, sapling = 1}, attached_node = 1, sapling = 1},
sounds = default.node_sound_leaves_defaults(), sounds = default.node_sound_leaves_defaults(),
on_construct = function(pos)
minetest.get_node_timer(pos):start(math.random(2400,4800))
end,
on_place = function(itemstack, placer, pointed_thing)
itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
"default:pine_sapling",
-- minp, maxp to be checked, relative to sapling pos
-- minp_relative.y = 1 because sapling pos has been checked
{x = -2, y = 1, z = -2},
{x = 2, y = 12, z = 2},
-- maximum interval of interior volume check
4)
return itemstack
end,
}) })
...@@ -724,7 +765,7 @@ minetest.register_node("default:acacia_wood", { ...@@ -724,7 +765,7 @@ minetest.register_node("default:acacia_wood", {
place_param2 = 0, place_param2 = 0,
tiles = {"default_acacia_wood.png"}, tiles = {"default_acacia_wood.png"},
is_ground_content = false, is_ground_content = false,
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
}) })
...@@ -760,9 +801,6 @@ minetest.register_node("default:acacia_sapling", { ...@@ -760,9 +801,6 @@ minetest.register_node("default:acacia_sapling", {
sunlight_propagates = true, sunlight_propagates = true,
walkable = false, walkable = false,
on_timer = default.grow_sapling, on_timer = default.grow_sapling,
on_construct = function(pos)
minetest.get_node_timer(pos):start(math.random(2400,4800))
end,
selection_box = { selection_box = {
type = "fixed", type = "fixed",
fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
...@@ -770,6 +808,23 @@ minetest.register_node("default:acacia_sapling", { ...@@ -770,6 +808,23 @@ minetest.register_node("default:acacia_sapling", {
groups = {snappy = 2, dig_immediate = 3, flammable = 2, groups = {snappy = 2, dig_immediate = 3, flammable = 2,
attached_node = 1, sapling = 1}, attached_node = 1, sapling = 1},
sounds = default.node_sound_leaves_defaults(), sounds = default.node_sound_leaves_defaults(),
on_construct = function(pos)
minetest.get_node_timer(pos):start(math.random(2400,4800))
end,
on_place = function(itemstack, placer, pointed_thing)
itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
"default:acacia_sapling",
-- minp, maxp to be checked, relative to sapling pos
-- minp_relative.y = 1 because sapling pos has been checked
{x = -4, y = 1, z = -4},
{x = 4, y = 6, z = 4},
-- maximum interval of interior volume check
4)
return itemstack
end,
}) })
minetest.register_node("default:aspen_tree", { minetest.register_node("default:aspen_tree", {
...@@ -778,7 +833,7 @@ minetest.register_node("default:aspen_tree", { ...@@ -778,7 +833,7 @@ minetest.register_node("default:aspen_tree", {
"default_aspen_tree.png"}, "default_aspen_tree.png"},
paramtype2 = "facedir", paramtype2 = "facedir",
is_ground_content = false, is_ground_content = false,
groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
on_place = minetest.rotate_node on_place = minetest.rotate_node
...@@ -790,7 +845,7 @@ minetest.register_node("default:aspen_wood", { ...@@ -790,7 +845,7 @@ minetest.register_node("default:aspen_wood", {
place_param2 = 0, place_param2 = 0,
tiles = {"default_aspen_wood.png"}, tiles = {"default_aspen_wood.png"},
is_ground_content = false, is_ground_content = false,
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
}) })
...@@ -826,17 +881,32 @@ minetest.register_node("default:aspen_sapling", { ...@@ -826,17 +881,32 @@ minetest.register_node("default:aspen_sapling", {
sunlight_propagates = true, sunlight_propagates = true,
walkable = false, walkable = false,
on_timer = default.grow_sapling, on_timer = default.grow_sapling,
on_construct = function(pos)
minetest.get_node_timer(pos):start(math.random(2400,4800))
end,
selection_box = { selection_box = {
type = "fixed", type = "fixed",
fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3}
}, },
groups = {snappy = 2, dig_immediate = 3, flammable = 2, groups = {snappy = 2, dig_immediate = 3, flammable = 3,
attached_node = 1, sapling = 1}, attached_node = 1, sapling = 1},
sounds = default.node_sound_leaves_defaults(), sounds = default.node_sound_leaves_defaults(),
on_construct = function(pos)
minetest.get_node_timer(pos):start(math.random(2400,4800))
end,
on_place = function(itemstack, placer, pointed_thing)
itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
"default:aspen_sapling",
-- minp, maxp to be checked, relative to sapling pos
-- minp_relative.y = 1 because sapling pos has been checked
{x = -2, y = 1, z = -2},
{x = 2, y = 12, z = 2},
-- maximum interval of interior volume check
4)
return itemstack
end,
}) })
-- --
-- Ores -- Ores
-- --
...@@ -1521,7 +1591,6 @@ minetest.register_node("default:chest", { ...@@ -1521,7 +1591,6 @@ minetest.register_node("default:chest", {
on_construct = function(pos) on_construct = function(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
meta:set_string("formspec", chest_formspec) meta:set_string("formspec", chest_formspec)
meta:set_string("infotext", "Chest")
local inv = meta:get_inventory() local inv = meta:get_inventory()
inv:set_size("main", 8*4) inv:set_size("main", 8*4)
end, end,
...@@ -1572,7 +1641,6 @@ minetest.register_node("default:chest_locked", { ...@@ -1572,7 +1641,6 @@ minetest.register_node("default:chest_locked", {
end, end,
on_construct = function(pos) on_construct = function(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
meta:set_string("infotext", "Locked Chest")
meta:set_string("owner", "") meta:set_string("owner", "")
local inv = meta:get_inventory() local inv = meta:get_inventory()
inv:set_size("main", 8 * 4) inv:set_size("main", 8 * 4)
...@@ -1713,7 +1781,6 @@ local function register_sign(material, desc, def) ...@@ -1713,7 +1781,6 @@ local function register_sign(material, desc, def)
--local n = minetest.get_node(pos) --local n = minetest.get_node(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
meta:set_string("formspec", "field[text;;${text}]") meta:set_string("formspec", "field[text;;${text}]")
meta:set_string("infotext", "\"\"")
end, end,
on_receive_fields = function(pos, formname, fields, sender) on_receive_fields = function(pos, formname, fields, sender)
--print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields)) --print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields))
...@@ -1789,7 +1856,9 @@ minetest.register_node("default:ladder_steel", { ...@@ -1789,7 +1856,9 @@ minetest.register_node("default:ladder_steel", {
default.register_fence("default:fence_wood", { default.register_fence("default:fence_wood", {
description = "Wooden Fence", description = "Wooden Fence",
texture = "default_wood.png", texture = "default_fence_wood.png",
inventory_image = "default_fence_overlay.png^default_wood.png^default_fence_overlay.png^[makealpha:255,126,126",
wield_image = "default_fence_overlay.png^default_wood.png^default_fence_overlay.png^[makealpha:255,126,126",
material = "default:wood", material = "default:wood",
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
sounds = default.node_sound_wood_defaults() sounds = default.node_sound_wood_defaults()
...@@ -1797,7 +1866,9 @@ default.register_fence("default:fence_wood", { ...@@ -1797,7 +1866,9 @@ default.register_fence("default:fence_wood", {
default.register_fence("default:fence_acacia_wood", { default.register_fence("default:fence_acacia_wood", {
description = "Acacia Fence", description = "Acacia Fence",
texture = "default_acacia_wood.png", texture = "default_fence_acacia_wood.png",
inventory_image = "default_fence_overlay.png^default_acacia_wood.png^default_fence_overlay.png^[makealpha:255,126,126",
wield_image = "default_fence_overlay.png^default_acacia_wood.png^default_fence_overlay.png^[makealpha:255,126,126",
material = "default:acacia_wood", material = "default:acacia_wood",
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
sounds = default.node_sound_wood_defaults() sounds = default.node_sound_wood_defaults()
...@@ -1805,7 +1876,9 @@ default.register_fence("default:fence_acacia_wood", { ...@@ -1805,7 +1876,9 @@ default.register_fence("default:fence_acacia_wood", {
default.register_fence("default:fence_junglewood", { default.register_fence("default:fence_junglewood", {
description = "Junglewood Fence", description = "Junglewood Fence",
texture = "default_junglewood.png", texture = "default_fence_junglewood.png",
inventory_image = "default_fence_overlay.png^default_junglewood.png^default_fence_overlay.png^[makealpha:255,126,126",
wield_image = "default_fence_overlay.png^default_junglewood.png^default_fence_overlay.png^[makealpha:255,126,126",
material = "default:junglewood", material = "default:junglewood",
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
sounds = default.node_sound_wood_defaults() sounds = default.node_sound_wood_defaults()
...@@ -1813,17 +1886,21 @@ default.register_fence("default:fence_junglewood", { ...@@ -1813,17 +1886,21 @@ default.register_fence("default:fence_junglewood", {
default.register_fence("default:fence_pine_wood", { default.register_fence("default:fence_pine_wood", {
description = "Pine Fence", description = "Pine Fence",
texture = "default_pine_wood.png", texture = "default_fence_pine_wood.png",
inventory_image = "default_fence_overlay.png^default_pine_wood.png^default_fence_overlay.png^[makealpha:255,126,126",
wield_image = "default_fence_overlay.png^default_pine_wood.png^default_fence_overlay.png^[makealpha:255,126,126",
material = "default:pine_wood", material = "default:pine_wood",
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
sounds = default.node_sound_wood_defaults() sounds = default.node_sound_wood_defaults()
}) })
default.register_fence("default:fence_aspen_wood", { default.register_fence("default:fence_aspen_wood", {
description = "Aspen Fence", description = "Aspen Fence",
texture = "default_aspen_wood.png", texture = "default_fence_aspen_wood.png",
inventory_image = "default_fence_overlay.png^default_aspen_wood.png^default_fence_overlay.png^[makealpha:255,126,126",
wield_image = "default_fence_overlay.png^default_aspen_wood.png^default_fence_overlay.png^[makealpha:255,126,126",
material = "default:aspen_wood", material = "default:aspen_wood",
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
sounds = default.node_sound_wood_defaults() sounds = default.node_sound_wood_defaults()
}) })
...@@ -1905,26 +1982,3 @@ minetest.register_node("default:cloud", { ...@@ -1905,26 +1982,3 @@ minetest.register_node("default:cloud", {
sounds = default.node_sound_defaults(), sounds = default.node_sound_defaults(),
groups = {not_in_creative_inventory = 1}, groups = {not_in_creative_inventory = 1},
}) })
minetest.register_node("default:nyancat", {
description = "Nyan Cat",
tiles = {"default_nc_side.png", "default_nc_side.png", "default_nc_side.png",
"default_nc_side.png", "default_nc_back.png", "default_nc_front.png"},
paramtype2 = "facedir",
groups = {cracky = 2},
is_ground_content = false,
legacy_facedir_simple = true,
sounds = default.node_sound_defaults(),
})
minetest.register_node("default:nyancat_rainbow", {
description = "Nyan Cat Rainbow",
tiles = {
"default_nc_rb.png^[transformR90", "default_nc_rb.png^[transformR90",
"default_nc_rb.png", "default_nc_rb.png"
},
paramtype2 = "facedir",
groups = {cracky = 2},
is_ground_content = false,
sounds = default.node_sound_defaults(),
})
mods/default/textures/default_desert_stone_brick.png

611 B | W: 0px | H: 0px

mods/default/textures/default_desert_stone_brick.png

552 B | W: 0px | H: 0px

mods/default/textures/default_desert_stone_brick.png
mods/default/textures/default_desert_stone_brick.png
mods/default/textures/default_desert_stone_brick.png
mods/default/textures/default_desert_stone_brick.png
  • 2-up
  • Swipe
  • Onion skin
mods/default/textures/default_fence_acacia_wood.png

232 B

mods/default/textures/default_fence_aspen_wood.png

450 B

mods/default/textures/default_fence_junglewood.png

231 B

File added
mods/default/textures/default_fence_pine_wood.png

233 B

mods/default/textures/default_fence_wood.png

230 B

mods/default/textures/default_mese_block.png

224 B | W: 0px | H: 0px

mods/default/textures/default_mese_block.png

188 B | W: 0px | H: 0px

mods/default/textures/default_mese_block.png
mods/default/textures/default_mese_block.png
mods/default/textures/default_mese_block.png
mods/default/textures/default_mese_block.png
  • 2-up
  • Swipe
  • Onion skin
mods/default/textures/default_stone_brick.png

583 B | W: 0px | H: 0px

mods/default/textures/default_stone_brick.png

545 B | W: 0px | H: 0px

mods/default/textures/default_stone_brick.png
mods/default/textures/default_stone_brick.png
mods/default/textures/default_stone_brick.png
mods/default/textures/default_stone_brick.png
  • 2-up
  • Swipe
  • Onion skin
...@@ -27,10 +27,8 @@ end ...@@ -27,10 +27,8 @@ end
-- 'is snow nearby' function -- 'is snow nearby' function
local function is_snow_nearby(pos) local function is_snow_nearby(pos)
return #minetest.find_nodes_in_area( return minetest.find_node_near(pos, 1,
{x = pos.x - 1, y = pos.y - 1, z = pos.z - 1}, {"default:snow", "default:snowblock", "default:dirt_with_snow"})
{x = pos.x + 1, y = pos.y + 1, z = pos.z + 1},
{"default:snow", "default:snowblock", "default:dirt_with_snow"}) > 0
end end
...@@ -43,12 +41,12 @@ function default.grow_sapling(pos) ...@@ -43,12 +41,12 @@ function default.grow_sapling(pos)
return return
end end
local mapgen = minetest.get_mapgen_params().mgname local mg_name = minetest.get_mapgen_setting("mg_name")
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
if node.name == "default:sapling" then if node.name == "default:sapling" then
minetest.log("action", "A sapling grows into a tree at ".. minetest.log("action", "A sapling grows into a tree at "..
minetest.pos_to_string(pos)) minetest.pos_to_string(pos))
if mapgen == "v6" then if mg_name == "v6" then
default.grow_tree(pos, random(1, 4) == 1) default.grow_tree(pos, random(1, 4) == 1)
else else
default.grow_new_apple_tree(pos) default.grow_new_apple_tree(pos)
...@@ -56,7 +54,7 @@ function default.grow_sapling(pos) ...@@ -56,7 +54,7 @@ function default.grow_sapling(pos)
elseif node.name == "default:junglesapling" then elseif node.name == "default:junglesapling" then
minetest.log("action", "A jungle sapling grows into a tree at ".. minetest.log("action", "A jungle sapling grows into a tree at "..
minetest.pos_to_string(pos)) minetest.pos_to_string(pos))
if mapgen == "v6" then if mg_name == "v6" then
default.grow_jungle_tree(pos) default.grow_jungle_tree(pos)
else else
default.grow_new_jungle_tree(pos) default.grow_new_jungle_tree(pos)
...@@ -65,7 +63,7 @@ function default.grow_sapling(pos) ...@@ -65,7 +63,7 @@ function default.grow_sapling(pos)
minetest.log("action", "A pine sapling grows into a tree at ".. minetest.log("action", "A pine sapling grows into a tree at "..
minetest.pos_to_string(pos)) minetest.pos_to_string(pos))
local snow = is_snow_nearby(pos) local snow = is_snow_nearby(pos)
if mapgen == "v6" then if mg_name == "v6" then
default.grow_pine_tree(pos, snow) default.grow_pine_tree(pos, snow)
elseif snow then elseif snow then
default.grow_new_snowy_pine_tree(pos) default.grow_new_snowy_pine_tree(pos)
...@@ -418,6 +416,7 @@ function default.grow_new_acacia_tree(pos) ...@@ -418,6 +416,7 @@ function default.grow_new_acacia_tree(pos)
path, "random", nil, false) path, "random", nil, false)
end end
-- New aspen tree -- New aspen tree
function default.grow_new_aspen_tree(pos) function default.grow_new_aspen_tree(pos)
...@@ -426,3 +425,48 @@ function default.grow_new_aspen_tree(pos) ...@@ -426,3 +425,48 @@ function default.grow_new_aspen_tree(pos)
minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}, minetest.place_schematic({x = pos.x - 2, y = pos.y - 1, z = pos.z - 2},
path, "0", nil, false) path, "0", nil, false)
end end
--
-- Sapling 'on place' function to check protection of node and resulting tree volume
--
function default.sapling_on_place(itemstack, placer, pointed_thing,
sapling_name, minp_relative, maxp_relative, interval)
-- Position of sapling
local pos = pointed_thing.under
local node = minetest.get_node(pos)
local pdef = minetest.registered_nodes[node.name]
if not pdef or not pdef.buildable_to then
pos = pointed_thing.above
node = minetest.get_node(pos)
pdef = minetest.registered_nodes[node.name]
if not pdef or not pdef.buildable_to then
return itemstack
end
end
local player_name = placer:get_player_name()
-- Check sapling position for protection
if minetest.is_protected(pos, player_name) then
minetest.record_protection_violation(pos, player_name)
return itemstack
end
-- Check tree volume for protection
if not default.intersects_protection(
vector.add(pos, minp_relative),
vector.add(pos, maxp_relative),
player_name,
interval) then
minetest.set_node(pos, {name = sapling_name})
if not minetest.setting_getbool("creative_mode") then
itemstack:take_item()
end
else
minetest.record_protection_violation(pos, player_name)
-- Print extra information to explain
minetest.chat_send_player(player_name, "Tree will intersect protection")
end
return itemstack
end
...@@ -185,7 +185,7 @@ end ...@@ -185,7 +185,7 @@ end
local function on_place_node(place_to, newnode, local function on_place_node(place_to, newnode,
placer, oldnode, itemstack, pointed_thing) placer, oldnode, itemstack, pointed_thing)
-- Run script hook -- Run script hook
for _, callback in ipairs(core.registered_on_placenodes) do for _, callback in ipairs(minetest.registered_on_placenodes) do
-- Deepcopy pos, node and pointed_thing because callback can modify them -- Deepcopy pos, node and pointed_thing because callback can modify them
local place_to_copy = {x = place_to.x, y = place_to.y, z = place_to.z} local place_to_copy = {x = place_to.x, y = place_to.y, z = place_to.z}
local newnode_copy = local newnode_copy =
...@@ -203,6 +203,14 @@ local function on_place_node(place_to, newnode, ...@@ -203,6 +203,14 @@ local function on_place_node(place_to, newnode,
end end
end end
local function can_dig_door(pos, digger)
local digger_name = digger and digger:get_player_name()
if digger_name and minetest.get_player_privs(digger_name).protection_bypass then
return true
end
return minetest.get_meta(pos):get_string("doors_owner") == digger_name
end
function doors.register(name, def) function doors.register(name, def)
if not name:find(":") then if not name:find(":") then
name = "doors:" .. name name = "doors:" .. name
...@@ -273,8 +281,10 @@ function doors.register(name, def) ...@@ -273,8 +281,10 @@ function doors.register(name, def)
end end
local above = {x = pos.x, y = pos.y + 1, z = pos.z} local above = {x = pos.x, y = pos.y + 1, z = pos.z}
if not minetest.registered_nodes[ local top_node = minetest.get_node_or_nil(above)
minetest.get_node(above).name].buildable_to then local topdef = top_node and minetest.registered_nodes[top_node.name]
if not topdef or not topdef.buildable_to then
return itemstack return itemstack
end end
...@@ -336,21 +346,6 @@ function doors.register(name, def) ...@@ -336,21 +346,6 @@ function doors.register(name, def)
end end
def.recipe = nil def.recipe = nil
local can_dig = function(pos, digger)
if not def.protected then
return true
end
if minetest.check_player_privs(digger, "protection_bypass") then
return true
end
local meta = minetest.get_meta(pos)
local owner_name
if digger then
owner_name = digger:get_player_name()
end
return meta:get_string("doors_owner") == owner_name
end
if not def.sounds then if not def.sounds then
def.sounds = default.node_sound_wood_defaults() def.sounds = default.node_sound_wood_defaults()
end end
...@@ -379,14 +374,10 @@ function doors.register(name, def) ...@@ -379,14 +374,10 @@ function doors.register(name, def)
minetest.remove_node({x = pos.x, y = pos.y + 1, z = pos.z}) minetest.remove_node({x = pos.x, y = pos.y + 1, z = pos.z})
nodeupdate({x = pos.x, y = pos.y + 1, z = pos.z}) nodeupdate({x = pos.x, y = pos.y + 1, z = pos.z})
end end
def.can_dig = function(pos, player) def.on_rotate = screwdriver and screwdriver.rotate_simple or false
return can_dig(pos, player)
end
def.on_rotate = function(pos, node, user, mode, new_param2)
return false
end
if def.protected then if def.protected then
def.can_dig = can_dig_door
def.on_blast = function() end def.on_blast = function() end
else else
def.on_blast = function(pos, intensity) def.on_blast = function(pos, intensity)
...@@ -533,19 +524,13 @@ function _doors.trapdoor_toggle(pos, node, clicker) ...@@ -533,19 +524,13 @@ function _doors.trapdoor_toggle(pos, node, clicker)
end end
function doors.register_trapdoor(name, def) function doors.register_trapdoor(name, def)
if not name:find(":") then
name = "doors:" .. name
end
local name_closed = name local name_closed = name
local name_opened = name.."_open" local name_opened = name.."_open"
local function check_player_priv(pos, player)
if not def.protected or
minetest.check_player_privs(player, "protection_bypass") then
return true
end
local meta = minetest.get_meta(pos)
local player_name = player and player:get_player_name()
return meta:get_string("doors_owner") == player_name
end
def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
_doors.trapdoor_toggle(pos, node, clicker) _doors.trapdoor_toggle(pos, node, clicker)
return itemstack return itemstack
...@@ -556,9 +541,9 @@ function doors.register_trapdoor(name, def) ...@@ -556,9 +541,9 @@ function doors.register_trapdoor(name, def)
def.paramtype = "light" def.paramtype = "light"
def.paramtype2 = "facedir" def.paramtype2 = "facedir"
def.is_ground_content = false def.is_ground_content = false
def.can_dig = check_player_priv
if def.protected then if def.protected then
def.can_dig = can_dig_door
def.after_place_node = function(pos, placer, itemstack, pointed_thing) def.after_place_node = function(pos, placer, itemstack, pointed_thing)
local pn = placer:get_player_name() local pn = placer:get_player_name()
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
...@@ -572,7 +557,6 @@ function doors.register_trapdoor(name, def) ...@@ -572,7 +557,6 @@ function doors.register_trapdoor(name, def)
else else
def.on_blast = function(pos, intensity) def.on_blast = function(pos, intensity)
minetest.remove_node(pos) minetest.remove_node(pos)
minetest.remove_node({x = pos.x, y = pos.y + 1, z = pos.z})
return {name} return {name}
end end
end end
...@@ -600,8 +584,10 @@ function doors.register_trapdoor(name, def) ...@@ -600,8 +584,10 @@ function doors.register_trapdoor(name, def)
type = "fixed", type = "fixed",
fixed = {-0.5, -0.5, -0.5, 0.5, -6/16, 0.5} fixed = {-0.5, -0.5, -0.5, 0.5, -6/16, 0.5}
} }
def_closed.tiles = {def.tile_front, def.tile_front, def.tile_side, def.tile_side, def_closed.tiles = {def.tile_front,
def.tile_side, def.tile_side} def.tile_front .. '^[transformFY',
def.tile_side, def.tile_side,
def.tile_side, def.tile_side}
def_opened.node_box = { def_opened.node_box = {
type = "fixed", type = "fixed",
...@@ -614,7 +600,8 @@ function doors.register_trapdoor(name, def) ...@@ -614,7 +600,8 @@ function doors.register_trapdoor(name, def)
def_opened.tiles = {def.tile_side, def.tile_side, def_opened.tiles = {def.tile_side, def.tile_side,
def.tile_side .. '^[transform3', def.tile_side .. '^[transform3',
def.tile_side .. '^[transform1', def.tile_side .. '^[transform1',
def.tile_front, def.tile_front} def.tile_front .. '^[transform46',
def.tile_front .. '^[transform6'}
def_opened.drop = name_closed def_opened.drop = name_closed
def_opened.groups.not_in_creative_inventory = 1 def_opened.groups.not_in_creative_inventory = 1
...@@ -651,8 +638,8 @@ doors.register_trapdoor("doors:trapdoor_steel", { ...@@ -651,8 +638,8 @@ doors.register_trapdoor("doors:trapdoor_steel", {
minetest.register_craft({ minetest.register_craft({
output = 'doors:trapdoor 2', output = 'doors:trapdoor 2',
recipe = { recipe = {
{'group:wood', 'group:wood', ''}, {'group:wood', 'group:wood', 'group:wood'},
{'group:wood', 'group:wood', ''}, {'group:wood', 'group:wood', 'group:wood'},
{'', '', ''}, {'', '', ''},
} }
}) })
...@@ -717,7 +704,7 @@ function doors.register_fencegate(name, def) ...@@ -717,7 +704,7 @@ function doors.register_fencegate(name, def)
fence_open.collision_box = { fence_open.collision_box = {
type = "fixed", type = "fixed",
fixed = {{-1/2, -1/2, -1/4, -3/8, 1/2, 1/4}, fixed = {{-1/2, -1/2, -1/4, -3/8, 1/2, 1/4},
{-5/8, -3/8, -14/16, -3/8, 3/8, 0}}, {-5/8, -3/8, -1/2, -3/8, 3/8, 0}},
} }
minetest.register_node(":" .. name .. "_closed", fence_closed) minetest.register_node(":" .. name .. "_closed", fence_closed)
...@@ -757,12 +744,12 @@ doors.register_fencegate("doors:gate_pine_wood", { ...@@ -757,12 +744,12 @@ doors.register_fencegate("doors:gate_pine_wood", {
description = "Pine Fence Gate", description = "Pine Fence Gate",
texture = "default_pine_wood.png", texture = "default_pine_wood.png",
material = "default:pine_wood", material = "default:pine_wood",
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}
}) })
doors.register_fencegate("doors:gate_aspen_wood", { doors.register_fencegate("doors:gate_aspen_wood", {
description = "Aspen Fence Gate", description = "Aspen Fence Gate",
texture = "default_aspen_wood.png", texture = "default_aspen_wood.png",
material = "default:aspen_wood", material = "default:aspen_wood",
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}
}) })
...@@ -221,6 +221,7 @@ end ...@@ -221,6 +221,7 @@ end
-- Extinguish all flames quickly with water, snow, ice -- Extinguish all flames quickly with water, snow, ice
minetest.register_abm({ minetest.register_abm({
label = "Extinguish flame",
nodenames = {"fire:basic_flame", "fire:permanent_flame"}, nodenames = {"fire:basic_flame", "fire:permanent_flame"},
neighbors = {"group:puts_out_fire"}, neighbors = {"group:puts_out_fire"},
interval = 3, interval = 3,
...@@ -234,13 +235,21 @@ minetest.register_abm({ ...@@ -234,13 +235,21 @@ minetest.register_abm({
}) })
-- Enable the following ABMs according to 'disable fire' setting -- Enable the following ABMs according to 'enable fire' setting
if minetest.setting_getbool("disable_fire") then local fire_enabled = minetest.setting_getbool("enable_fire")
if fire_enabled == nil then
-- New setting not specified, check for old setting.
-- If old setting is also not specified, 'not nil' is true.
fire_enabled = not minetest.setting_getbool("disable_fire")
end
if not fire_enabled then
-- Remove basic flames only -- Remove basic flames only
minetest.register_abm({ minetest.register_abm({
label = "Remove disabled fire",
nodenames = {"fire:basic_flame"}, nodenames = {"fire:basic_flame"},
interval = 7, interval = 7,
chance = 1, chance = 1,
...@@ -248,11 +257,12 @@ if minetest.setting_getbool("disable_fire") then ...@@ -248,11 +257,12 @@ if minetest.setting_getbool("disable_fire") then
action = minetest.remove_node, action = minetest.remove_node,
}) })
else else -- Fire enabled
-- Ignite neighboring nodes, add basic flames -- Ignite neighboring nodes, add basic flames
minetest.register_abm({ minetest.register_abm({
label = "Ignite flame",
nodenames = {"group:flammable"}, nodenames = {"group:flammable"},
neighbors = {"group:igniter"}, neighbors = {"group:igniter"},
interval = 7, interval = 7,
...@@ -273,6 +283,7 @@ else ...@@ -273,6 +283,7 @@ else
-- Remove flammable nodes -- Remove flammable nodes
minetest.register_abm({ minetest.register_abm({
label = "Remove flammable nodes",
nodenames = {"fire:basic_flame"}, nodenames = {"fire:basic_flame"},
neighbors = "group:flammable", neighbors = "group:flammable",
interval = 5, interval = 5,
......
...@@ -110,6 +110,7 @@ function flowers.flower_spread(pos, node) ...@@ -110,6 +110,7 @@ function flowers.flower_spread(pos, node)
end end
minetest.register_abm({ minetest.register_abm({
label = "Flower spread",
nodenames = {"group:flora"}, nodenames = {"group:flora"},
neighbors = {"default:dirt_with_grass", "default:dirt_with_dry_grass", neighbors = {"default:dirt_with_grass", "default:dirt_with_dry_grass",
"default:desert_sand"}, "default:desert_sand"},
...@@ -167,6 +168,7 @@ minetest.register_node("flowers:mushroom_brown", { ...@@ -167,6 +168,7 @@ minetest.register_node("flowers:mushroom_brown", {
-- Mushroom spread and death -- Mushroom spread and death
minetest.register_abm({ minetest.register_abm({
label = "Mushroom spread",
nodenames = {"flowers:mushroom_brown", "flowers:mushroom_red"}, nodenames = {"flowers:mushroom_brown", "flowers:mushroom_red"},
interval = 11, interval = 11,
chance = 50, chance = 50,
...@@ -206,6 +208,8 @@ minetest.register_alias("flowers:mushroom_spores_brown", "flowers:mushroom_brown ...@@ -206,6 +208,8 @@ minetest.register_alias("flowers:mushroom_spores_brown", "flowers:mushroom_brown
minetest.register_alias("flowers:mushroom_spores_red", "flowers:mushroom_red") minetest.register_alias("flowers:mushroom_spores_red", "flowers:mushroom_red")
minetest.register_alias("flowers:mushroom_fertile_brown", "flowers:mushroom_brown") minetest.register_alias("flowers:mushroom_fertile_brown", "flowers:mushroom_brown")
minetest.register_alias("flowers:mushroom_fertile_red", "flowers:mushroom_red") minetest.register_alias("flowers:mushroom_fertile_red", "flowers:mushroom_red")
minetest.register_alias("mushroom:brown_natural", "flowers:mushroom_brown")
minetest.register_alias("mushroom:red_natural", "flowers:mushroom_red")
-- --
...@@ -243,14 +247,17 @@ minetest.register_node("flowers:waterlily", { ...@@ -243,14 +247,17 @@ minetest.register_node("flowers:waterlily", {
local def = minetest.registered_nodes[node] local def = minetest.registered_nodes[node]
local player_name = placer:get_player_name() local player_name = placer:get_player_name()
if def and def.liquidtype == "source" and minetest.get_item_group(node, "water") > 0 then if def and def.liquidtype == "source" and
minetest.get_item_group(node, "water") > 0 then
if not minetest.is_protected(pos, player_name) then if not minetest.is_protected(pos, player_name) then
minetest.set_node(pos, {name = "flowers:waterlily", param2 = math.random(0, 3)}) minetest.set_node(pos, {name = "flowers:waterlily",
param2 = math.random(0, 3)})
if not minetest.setting_getbool("creative_mode") then
itemstack:take_item()
end
else else
minetest.chat_send_player(player_name, "This area is protected") minetest.chat_send_player(player_name, "Node is protected")
end minetest.record_protection_violation(pos, player_name)
if not minetest.setting_getbool("creative_mode") then
itemstack:take_item()
end end
end end
return itemstack return itemstack
......
Subproject commit b544316aea4b6914d13ba53ad83091fadd09936d Subproject commit 60fe9391c2f7eb5970bc5640a62ddfd69e0283f3