Fix a couple minor bugs

This commit is contained in:
KaadmY 2017-05-19 14:04:11 -07:00
parent af33315061
commit 14c51b153f
9 changed files with 305 additions and 267 deletions

View File

@ -32,11 +32,42 @@ end
function default.grow_tree(pos, variety)
local function grow()
if variety == "apple" then
minetest.place_schematic({x = pos.x-2, y = pos.y-1, z = pos.z-2}, minetest.get_modpath("default").."/schematics/default_tree.mts", "0", {}, false)
minetest.place_schematic(
{
x = pos.x-2,
y = pos.y-1,
z = pos.z-2
},
minetest.get_modpath("default")
.. "/schematics/default_tree.mts", "0", {}, false)
elseif variety == "oak" then
minetest.place_schematic({x = pos.x-2, y = pos.y-1, z = pos.z-2}, minetest.get_modpath("default").."/schematics/default_tree.mts", "0", {["default:leaves"] = "default:leaves_oak", ["default:tree"] = "default:tree_oak", ["default:apple"] = "air"}, false)
minetest.place_schematic(
{
x = pos.x-2,
y = pos.y-1,
z = pos.z-2
},
minetest.get_modpath("default")
.. "/schematics/default_tree.mts", "0",
{
["default:leaves"] = "default:leaves_oak",
["default:tree"] = "default:tree_oak",
["default:apple"] = "air"
}, false)
elseif variety == "birch" then
minetest.place_schematic({x = pos.x-1, y = pos.y-1, z = pos.z-1}, minetest.get_modpath("default").."/schematics/default_squaretree.mts", "0", {["default:leaves"] = "default:leaves_birch", ["default:tree"] = "default:tree_birch", ["default:apple"] = "air"}, false)
minetest.place_schematic(
{
x = pos.x-1,
y = pos.y-1,
z = pos.z-1
},
minetest.get_modpath("default")
.. "/schematics/default_squaretree.mts", "0",
{
["default:leaves"] = "default:leaves_birch",
["default:tree"] = "default:tree_birch",
["default:apple"] = "air"
}, false)
end
end
@ -49,41 +80,54 @@ end
minetest.register_abm( -- apple trees or default trees
{
label = "Grow apple saplings",
nodenames = {"default:sapling"},
interval = 10,
chance = 40,
action = function(pos, node)
local is_soil = minetest.registered_nodes[minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name].groups.soil
local is_soil = minetest.registered_nodes[minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name].groups.soil
if is_soil == nil or is_soil == 0 then return end
if is_soil == nil or is_soil == 0 then
return
end
default.grow_tree(pos, "apple")
end
})
default.grow_tree(pos, "apple")
end
})
minetest.register_abm( -- oak trees
{
label = "Grow oak saplings",
nodenames = {"default:sapling_oak"},
interval = 10,
chance = 60,
action = function(pos, node)
local is_soil = minetest.registered_nodes[minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name].groups.soil
if is_soil == nil or is_soil == 0 then return end
default.grow_tree(pos, "oak")
end
})
local is_soil = minetest.registered_nodes[minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name].groups.soil
if is_soil == nil or is_soil == 0 then
return
end
default.grow_tree(pos, "oak")
end
})
minetest.register_abm( -- birch trees
{
label = "Grow birch saplings",
nodenames = {"default:sapling_birch"},
interval = 10,
chance = 50,
action = function(pos, node)
local is_soil = minetest.registered_nodes[minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name].groups.soil
if is_soil == nil or is_soil == 0 then return end
default.grow_tree(pos, "birch")
end
})
local is_soil = minetest.registered_nodes[minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name].groups.soil
if is_soil == nil or is_soil == 0 then
return
end
default.grow_tree(pos, "birch")
end
})
-- Vertical plants
@ -97,7 +141,6 @@ function default.dig_up(pos, node, digger)
end
function default.dig_down(pos, node, digger)
-- if digger == nil then return end
local np = {x = pos.x, y = pos.y - 1, z = pos.z}
local nn = minetest.get_node(np)
if nn.name == node.name then
@ -113,19 +156,21 @@ default.leafdecay_enable_cache = true
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)
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)
local node = minetest.get_node(pos)
node.param2 = 1
minetest.set_node(pos, node)
end
local node = minetest.get_node(pos)
node.param2 = 1
minetest.set_node(pos, node)
end
minetest.register_abm( -- leaf decay
{
label = "Leaf decay",
nodenames = {"group:leafdecay"},
neighbors = {"air", "group:liquid"},
-- A low interval and a high inverse chance spreads the load
@ -133,247 +178,207 @@ minetest.register_abm( -- leaf decay
chance = 3,
action = function(p0, node, _, _)
--print("leafdecay ABM at "..p0.x..", "..p0.y..", "..p0.z..")")
local do_preserve = false
local d = minetest.registered_nodes[node.name].groups.leafdecay
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
end
local p0_hash = nil
if default.leafdecay_enable_cache then
p0_hash = minetest.hash_node_position(p0)
local trunkp = default.leafdecay_trunk_cache[p0_hash]
if trunkp 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
end
default.leafdecay_trunk_find_allow_accumulator =
default.leafdecay_trunk_find_allow_accumulator - 1
-- Assume ignore is a trunk, to make the thing work at the border of the active area
local p1 = minetest.find_node_near(p0, d, {"ignore", "group:tree"})
if p1 then
do_preserve = true
if default.leafdecay_enable_cache then
--print("caching trunk")
-- Cache the trunk
default.leafdecay_trunk_cache[p0_hash] = p1
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
-- Remove node
minetest.remove_node(p0)
nodeupdate(p0)
end
end
})
--print("leafdecay ABM at "..p0.x..", "..p0.y..", "..p0.z..")")
local do_preserve = false
local d = minetest.registered_nodes[node.name].groups.leafdecay
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
end
local p0_hash = nil
if default.leafdecay_enable_cache then
p0_hash = minetest.hash_node_position(p0)
local trunkp = default.leafdecay_trunk_cache[p0_hash]
if trunkp 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
end
default.leafdecay_trunk_find_allow_accumulator =
default.leafdecay_trunk_find_allow_accumulator - 1
-- Assume ignore is a trunk, to make the thing work at the border of the active area
local p1 = minetest.find_node_near(p0, d, {"ignore", "group:tree"})
if p1 then
do_preserve = true
if default.leafdecay_enable_cache then
--print("caching trunk")
-- Cache the trunk
default.leafdecay_trunk_cache[p0_hash] = p1
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
-- Remove node
minetest.remove_node(p0)
nodeupdate(p0)
end
end
})
minetest.register_abm( -- dirt and grass footsteps becomes dirt with grass if uncovered
{
label = "Grow dirt",
nodenames = {"default:dirt", "default:dirt_with_grass_footsteps"},
interval = 2,
chance = 40,
action = function(pos, node)
local above = {x=pos.x, y=pos.y+1, z=pos.z}
local name = minetest.get_node(above).name
local nodedef = minetest.registered_nodes[name]
if nodedef and (nodedef.sunlight_propagates or nodedef.paramtype == "light") and nodedef.liquidtype == "none" and (minetest.get_node_light(above) or 0) >= 8 then
minetest.set_node(pos, {name = "default:dirt_with_grass"})
end
end
})
local above = {x=pos.x, y=pos.y+1, z=pos.z}
local name = minetest.get_node(above).name
local nodedef = minetest.registered_nodes[name]
if nodedef and (nodedef.sunlight_propagates or nodedef.paramtype == "light") and nodedef.liquidtype == "none" and (minetest.get_node_light(above) or 0) >= 8 then
minetest.set_node(pos, {name = "default:dirt_with_grass"})
end
end
})
minetest.register_abm( -- dirt with grass becomes dirt if covered
{
label = "Remove grass on covered dirt",
nodenames = {"default:dirt_with_grass"},
interval = 2,
chance = 10,
action = function(pos, node)
local above = {x=pos.x, y=pos.y+1, z=pos.z}
local name = minetest.get_node(above).name
local nodedef = minetest.registered_nodes[name]
if name ~= "ignore" and nodedef and not ((nodedef.sunlight_propagates or nodedef.paramtype == "light") and nodedef.liquidtype == "none") then
minetest.set_node(pos, {name = "default:dirt"})
end
end
})
local above = {x=pos.x, y=pos.y+1, z=pos.z}
local name = minetest.get_node(above).name
local nodedef = minetest.registered_nodes[name]
if name ~= "ignore" and nodedef and not ((nodedef.sunlight_propagates or nodedef.paramtype == "light") and nodedef.liquidtype == "none") then
minetest.set_node(pos, {name = "default:dirt"})
end
end
})
minetest.register_abm( -- grass expands
{
label = "Grass expansion",
nodenames = {"default:grass"},
interval = 20,
chance = 160,
action = function(pos, node)
local rx = math.random(0, 2) - 1
local rz = math.random(0, 2) - 1
local rx = math.random(0, 2) - 1
local rz = math.random(0, 2) - 1
local edgepos = {x = pos.x+rx, y = pos.y, z = pos.z+rz}
local downpos = {x = pos.x+rx, y = pos.y-1, z = pos.z+rz}
local edgenode = minetest.get_node(edgepos)
local downnode = minetest.get_node(downpos)
if edgenode.name == "air" and downnode.name ~= "air" and downnode.buildable_to == false and walkable == true then
minetest.set_node(edgepos, {name = "default:grass"})
end
end
})
local edgepos = {x = pos.x+rx, y = pos.y, z = pos.z+rz}
local downpos = {x = pos.x+rx, y = pos.y-1, z = pos.z+rz}
local edgenode = minetest.get_node(edgepos)
local downnode = minetest.get_node(downpos)
if edgenode.name == "air" and downnode.name ~= "air" and downnode.buildable_to == false and walkable == true then
minetest.set_node(edgepos, {name = "default:grass"})
end
end
})
minetest.register_abm( -- clams grow
{
label = "Growing clams",
nodenames = {"default:clam"},
interval = 20,
chance = 160,
action = function(pos, node)
local rx = math.random(0, 2) - 1
local rz = math.random(0, 2) - 1
local rx = math.random(0, 2) - 1
local rz = math.random(0, 2) - 1
local edgepos = {x = pos.x+rx, y = pos.y, z = pos.z+rz}
local downpos = {x = pos.x+rx, y = pos.y-1, z = pos.z+rz}
local edgenode = minetest.get_node(edgepos)
local downnode = minetest.get_node(downpos)
if edgenode.name == "air" and downnode.name ~= "air" and downnode.buildable_to == false and walkable == true then
minetest.set_node(edgepos, {name = "default:clam"})
end
end
})
local edgepos = {x = pos.x+rx, y = pos.y, z = pos.z+rz}
local downpos = {x = pos.x+rx, y = pos.y-1, z = pos.z+rz}
local edgenode = minetest.get_node(edgepos)
local downnode = minetest.get_node(downpos)
if edgenode.name == "air" and downnode.name ~= "air" and downnode.buildable_to == false and walkable == true then
minetest.set_node(edgepos, {name = "default:clam"})
end
end
})
minetest.register_abm( -- cactus grows
{
label = "Growing cacti",
nodenames = {"default:cactus"},
neighbors = {"group:sand"},
interval = 20,
chance = 10,
action = function(pos, node)
pos.y = pos.y-1
local name = minetest.get_node(pos).name
if minetest.get_item_group(name, "sand") ~= 0 then
pos.y = pos.y+1
local height = 0
while minetest.get_node(pos).name == "default:cactus" and height < 3 do
height = height+1
pos.y = pos.y+1
end
if height < 3 then
if minetest.get_node(pos).name == "air" then
minetest.set_node(pos, {name="default:cactus"})
end
end
end
end,
})
pos.y = pos.y-1
local name = minetest.get_node(pos).name
if minetest.get_item_group(name, "sand") ~= 0 then
pos.y = pos.y+1
local height = 0
while minetest.get_node(pos).name == "default:cactus" and height < 3 do
height = height+1
pos.y = pos.y+1
end
if height < 3 then
if minetest.get_node(pos).name == "air" then
minetest.set_node(pos, {name="default:cactus"})
end
end
end
end,
})
minetest.register_abm( -- papyrus grows
{
label = "Growing papyrus",
nodenames = {"default:papyrus"},
neighbors = {"group:plantable_sandy", "group:plantable_soil"},
interval = 20,
chance = 10,
action = function(pos, node)
pos.y = pos.y-1
local name = minetest.get_node(pos).name
pos.y = pos.y-1
local name = minetest.get_node(pos).name
if minetest.find_node_near(pos, 3, {"group:water"}) == nil then
return
end
pos.y = pos.y+1
local height = 0
while minetest.get_node(pos).name == "default:papyrus" and height < 3 do
height = height+1
pos.y = pos.y+1
end
if height < 3 then
if minetest.get_node(pos).name == "air" then
minetest.set_node(pos, {name="default:papyrus"})
end
end
end,
})
minetest.register_abm( -- papyrus grows
{
nodenames = {"default:thistle"},
neighbors = {"group:plantable_soil"},
interval = 20,
chance = 30,
action = function(pos, node)
local height = 0
while minetest.get_node(pos).name == "default:thistle" and height < 3 do
height = height+1
pos.y = pos.y+1
end
if height < 3 then
if minetest.get_node(pos).name == "air" then
minetest.set_node(pos, {name="default:thistle"})
end
end
end,
})
--[[ TORCH FLAME IS VERY, VERY SLOW, THERE ARE NOW ANIMATIONS INSTEAD
minetest.register_abm( -- torch flame
{
nodenames = {"default:torch", "default:torch_weak"},
interval = 5,
chance = 1,
action = function(pos, node)
minetest.add_particlespawner(
{
amount = 10,
time = 5,
minpos = {x = pos.x-0.1, y = pos.y-0.4, z = pos.z-0.1},
maxpos = {x = pos.x+0.1, y = pos.y, z = pos.z+0.1},
minvel = {x = -0.3, y = 0.3, z = -0.3},
maxvel = {x = 0.3, y = 1, z = 0.3},
minacc = {x = 0, y = 0.5, z = -0},
maxacc = {x = 0, y = 2, z = 0},
minexptime = 0.3,
maxexptime = 0.6,
minsize = 4,
maxsize = 6,
texture = "spark.png"
})
end
})
--]]
if minetest.find_node_near(pos, 3, {"group:water"}) == nil then
return
end
pos.y = pos.y+1
local height = 0
while minetest.get_node(pos).name == "default:papyrus" and height < 3 do
height = height+1
pos.y = pos.y+1
end
if height < 3 then
if minetest.get_node(pos).name == "air" then
minetest.set_node(pos, {name="default:papyrus"})
end
end
end,
})
minetest.register_abm( -- weak torchs burn out and die after ~3 minutes
{
label = "Burning out weak torches",
nodenames = {"default:torch_weak"},
interval = 3,
chance = 60,
action = function(pos, node)
minetest.set_node(pos, {name = "default:torch_dead", param = node.param, param2 = node.param2})
end
})
minetest.set_node(pos, {name = "default:torch_dead", param = node.param, param2 = node.param2})
end
})
default.log("functions", "loaded")
default.log("functions", "loaded")

View File

@ -131,6 +131,7 @@ end
minetest.register_abm(
{
label = "Furnace",
nodenames = {"default:furnace", "default:furnace_active"},
interval = 1.0,
chance = 1,

View File

@ -3,9 +3,9 @@
-- Tool definitions
--
local creative_digtime=0.5
local creative_digtime = 0.15
local tool_levels=nil
local tool_levels = nil
-- Creative mode/hand defs
if minetest.setting_getbool("creative_mode") == true then

View File

@ -41,6 +41,7 @@ function farming.register_plant(name, plant)
minetest.register_abm(
{
label = "Farming growing (" .. name .. ")",
nodenames = {
"farming:"..name.."_1",
"farming:"..name.."_2",

View File

@ -336,7 +336,7 @@ local function fake_on_item_eat(hpdata, replace_with_item, itemstack,
return itemstack
end
if minetest.setting_getbool("hunger_enable") then
if minetest.setting_getbool("enable_damage") and minetest.setting_getbool("hunger_enable") then
minetest.after(0, on_load)

View File

@ -1,3 +1,4 @@
--
-- Item drop mod
-- By PilzAdam
@ -14,53 +15,80 @@ minetest.register_globalstep(
if player:get_hp() > 0 or not minetest.setting_getbool("enable_damage") then
local pos = player:getpos()
local inv = player:get_inventory()
for _,object in ipairs(minetest.get_objects_inside_radius(pos, 1.35)) do
if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" and valid(object) then
if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then
local pos1 = pos
pos1.y = pos1.y+0.2
local pos2 = object:getpos()
local vec = {x=pos1.x-pos2.x, y=pos1.y-pos2.y, z=pos1.z-pos2.z}
local len = vector.length(vec)
if len > 0.5 then
vec = vector.divide(vec, len) -- it's a normalize but we have len yet (vector.normalize(vec))
vec.x = vec.x*3
vec.y = vec.y*3
vec.z = vec.z*3
object:setvelocity(vec)
object:get_luaentity().physical_state = false
object:get_luaentity().object:set_properties(
{
physical = false
})
else
local lua = object:get_luaentity()
if object == nil or lua == nil or lua.itemstring == nil then
return
end
if inv:room_for_item("main", ItemStack(lua.itemstring)) then
inv:add_item("main", ItemStack(lua.itemstring))
if lua.itemstring ~= "" then
minetest.sound_play("item_drop_pickup", {pos = pos, gain = 0.3, max_hear_distance = 16})
end
lua.itemstring = ""
object:remove()
else
object:setvelocity({x = 0, y = 0, z = 0})
lua.physical_state = true
lua.object:set_properties(
{
physical = true
})
end
end
end
end
end
end
local in_radius = minetest.get_objects_inside_radius(pos, 6.0)
for _,object in ipairs(in_radius) do
if not object:is_player() and object:get_luaentity()
and object:get_luaentity().name == "__builtin:item" and valid(object) then
local pos1 = pos
pos1.y = pos1.y + 0.2
local pos2 = object:getpos()
local vec = {
x = pos1.x - pos2.x,
y = pos1.y - pos2.y,
z = pos1.z - pos2.z
}
local len = vector.length(vec)
if len < 1.35 then
if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then
if len > 0.5 then
vec = vector.divide(vec, len) -- It's a normalize but we have len yet (vector.normalize(vec))
vec.x = vec.x*3
vec.y = vec.y*3
vec.z = vec.z*3
object:setvelocity(vec)
object:get_luaentity().physical_state = false
object:get_luaentity().object:set_properties({physical = false})
else
local lua = object:get_luaentity()
if object == nil or lua == nil or lua.itemstring == nil then
return
end
if inv:room_for_item("main", ItemStack(lua.itemstring)) then
inv:add_item("main", ItemStack(lua.itemstring))
if lua.itemstring ~= "" then
minetest.sound_play(
"item_drop_pickup",
{
pos = pos,
gain = 0.3,
max_hear_distance = 16
})
end
lua.itemstring = ""
object:remove()
end
end
end
else
object:setvelocity({x = 0, y = 0, z = 0})
object:get_luaentity().physical_state = true
object:get_luaentity().object:set_properties(
{
physical = true
})
end
end
end
end
end
end)
end)
function minetest.handle_node_drops(pos, drops, digger)
for _,item in ipairs(drops) do
@ -84,11 +112,11 @@ function minetest.handle_node_drops(pos, drops, digger)
z = -z
end
obj:setvelocity({x=1/x, y=obj:getvelocity().y, z=1/z})
-- FIXME this doesnt work for deactiveted objects
if minetest.setting_get("remove_items") and tonumber(minetest.setting_get("remove_items")) then
minetest.after(tonumber(minetest.setting_get("remove_items")), function(obj)
obj:remove()
obj:remove()
end, obj)
end
end

View File

@ -137,6 +137,7 @@ minetest.register_ore(
minetest.register_abm(
{
label = "Lumien crystals",
nodenames = {"lumien:crystal_on"},
interval = timer_interval,
chance = 1,

View File

@ -1293,6 +1293,7 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, inter
mobs.spawning_mobs[name] = true
minetest.register_abm(
{
label = "Mob spawn (" .. name .. ")",
nodenames = nodes,
neighbors = neighbors,
interval = interval,

View File

@ -131,6 +131,7 @@ if minetest.setting_getbool("music_enable") then
minetest.register_abm(
{
label = "Music player",
nodenames = {"music:player"},
chance = 1,
interval = 1,