Solar_Plains/mods/core/abm_timer.lua
2017-12-05 21:33:12 +00:00

247 lines
4.7 KiB
Lua

-- solar fields core/abm_timer.lua
-- used for: saplings, grass spread, decay, etc
-- grass spread
minetest.register_abm({
nodenames = {"core:dirt"},
neighbors = {"core:grass"},
interval = 180,
chance = 3,
action = function(pos)
pos.y = pos.y + 1
if not minetest.get_node_light(pos) then
return
end
if minetest.get_node_light(pos) > 9 then
pos.y = pos.y - 1
minetest.add_node(pos,{name="core:grass"})
end
end,
})
-- grass decay
minetest.register_abm({
nodenames = {"core:grass"},
interval = 120,
chance = 2,
action = function(pos)
pos.y = pos.y + 1
if not minetest.get_node_light(pos) then
return
end
if minetest.get_node_light(pos) < 1 and minetest.get_item_group(minetest.get_node(pos).name, "nodec") ~= 1 then
pos.y = pos.y - 1
minetest.add_node(pos,{name="core:dirt"})
end
end,
})
minetest.register_abm({
nodenames = {"core:grass_snow"},
interval = 120,
chance = 2,
action = function(pos)
pos.y = pos.y + 1
if not minetest.get_node_or_nil(pos) then
return
end
if minetest.get_node_or_nil(pos).name ~= "core:snow" then
pos.y = pos.y - 1
minetest.add_node(pos,{name="core:dirt"})
end
end,
})
-- saplings
minetest.register_abm({
nodenames = {"core:oak_sapling"},
interval = 100, --100
chance = 3,
action = function(pos, node)
local nu = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name
local is_soil = minetest.get_item_group(nu, "soil")
if is_soil == 0 then
return
end
minetest.remove_node({x=pos.x, y=pos.y, z=pos.z})
mcore.grow_tree(pos, false, "core:oak_log", "core:oak_leaves", nil, nil)
end,
})
minetest.register_abm({
nodenames = {"core:birch_sapling"},
interval = 90, --90
chance = 3,
action = function(pos, node)
local nu = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name
local is_soil = minetest.get_item_group(nu, "soil")
if is_soil == 0 then
return
end
minetest.remove_node({x=pos.x, y=pos.y, z=pos.z})
mcore.grow_tree(pos, false, "core:birch_log", "core:birch_leaves", nil, nil)
end,
})
minetest.register_abm({
nodenames = {"core:cherry_sapling"},
interval = 85, --85
chance = 3,
action = function(pos, node)
local nu = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name
local is_soil = minetest.get_item_group(nu, "soil")
if is_soil == 0 then
return
end
minetest.remove_node({x=pos.x, y=pos.y, z=pos.z})
mcore.grow_tree(pos, false, "core:cherry_log", "core:cherry_leaves", "core:fallen_cherry_leaves", 1.25)
end,
})
minetest.register_abm({
nodenames = {"core:pine_sapling"},
interval = 70, --70
chance = 3,
action = function(pos, node)
local nu = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name
local is_soil = minetest.get_item_group(nu, "soil")
if is_soil == 0 then
return
end
minetest.remove_node({x=pos.x, y=pos.y, z=pos.z})
mcore.grow_pine(pos, false)
end,
})
-- lava cooling and obsidian;
function mcore.freeze_lava(pos, node)
if node.name == "core:lava_source" then
minetest.set_node(pos, {name="core:obsidian"})
return true
else -- we know it's not the source block.
if math.random(1, 64) == 18 then
minetest.set_node(pos, {name="core:diamond_ore"})
elseif math.random(1, 48) == 16 then
minetest.set_node(pos, {name="core:gold_ore"})
elseif math.random(1, 32) == 12 then
minetest.set_node(pos, {name="core:silver_ore"})
elseif math.random(1, 24) == 8 then
minetest.set_node(pos, {name="core:iron_ore"})
elseif math.random(1, 16) == 6 then
minetest.set_node(pos, {name="core:copper_ore"})
elseif math.random(1, 12) == 5 then
minetest.set_node(pos, {name="core:coal_ore"})
else
minetest.set_node(pos, {name="core:basalt"})
end
return true
end
end
minetest.register_abm({
nodenames = {"core:lava_source", "core:lava_flowing"},
neighbors = {"core:water_source", "core:ice", "core:water_flowing"},
interval = 2,
chance = 1,
catch_up = false,
action = function(pos, node)
mcore.freeze_lava(pos, node)
end,
})
-- make lava cool down once exposed to ambient air
minetest.register_abm({
nodenames = {"core:lava_source"},
neighnors = {"air"},
interval = 180,
chance = 6,
catch_up = false,
action = function(pos, node)
minetest.set_node(pos, {name="core:obsidian"})
end,
})
minetest.register_abm({
nodenames = {"core:lava_flowing"},
neighnors = {"air"},
interval = 60,
chance = 2,
catch_up = false,
action = function(pos, node)
minetest.set_node(pos, {name="core:basalt"})
end,
})
-- util func for resetting the math.random seed.
local function randseed()
math.randomseed( os.time())
minetest.after(math.random(15,45), randseed)
end
minetest.after(math.random(15,45), randseed)