lib_materials/lib_materials_abms.lua

187 lines
5.4 KiB
Lua

local S = lib_materials.intllib
--
-- Lavacooling
--
lib_materials.cool_lava = function(pos, node)
if node.name == "lib_materials:lava_source" or node.name == "lib_materials:lava_flowing" then
local rnum = math.random(1,4)
if rnum == 1 then
if node.name == "lib_materials:lava_source" then
minetest.set_node(pos, {name = "lib_materials:lava_cooling_source"})
else
minetest.set_node(pos, {name = "lib_materials:lava_cooling_flowing"})
end
else
end
minetest.sound_play("default_cool_lava", {pos = pos, max_hear_distance = 16, gain = 0.25})
end
end
lib_materials.cool_lava2 = function(pos, node)
if node.name == "lib_materials:lava_cooling_source" or node.name == "lib_materials:lava_cooling_flowing" then
local rnum = math.random(1,2)
if rnum == 1 then
minetest.set_node(pos, {name = "lib_materials:stone_cobble_hot"})
else
end
minetest.sound_play("default_cool_lava", {pos = pos, max_hear_distance = 16, gain = 0.25})
end
end
lib_materials.cool_lava3 = function(pos, node)
if node.name == "lib_materials:stone_cobble_hot" then
local rnum = math.random(1,6)
if rnum == 1 then
minetest.set_node(pos, {name = "lib_materials:stone_obsidian"})
elseif rnum == 2 then
minetest.set_node(pos, {name = "lib_materials:stone_basalt_01"})
elseif rnum == 3 then
minetest.set_node(pos, {name = "lib_materials:stone_basalt_02"})
elseif rnum == 4 then
minetest.set_node(pos, {name = "lib_materials:stone_basalt_03"})
elseif rnum == 5 then
minetest.set_node(pos, {name = "lib_materials:stone"})
else
end
minetest.sound_play("default_cool_lava", {pos = pos, max_hear_distance = 16, gain = 0.25})
end
end
if minetest.settings:get_bool("enable_lavacooling") ~= false then
minetest.register_abm({
label = "Lava cooling",
nodenames = {"lib_materials:lava_source", "lib_materials:lava_flowing"},
neighbors = {"group:cools_lava", "group:water"},
interval = 2,
chance = 2,
catch_up = false,
action = function(...)
lib_materials.cool_lava(...)
end,
})
minetest.register_abm({
label = "Lava2 cooling",
nodenames = {"lava_cooling_source", "lib_materials:lava_cooling_flowing"},
neighbors = {"group:cools_lava", "group:water"},
interval = 2,
chance = 2,
catch_up = false,
action = function(...)
lib_materials.cool_lava2(...)
end,
})
minetest.register_abm({
label = "Lava3 cooling",
nodenames = {"lib_materials:stone_cobble_hot"},
neighbors = {"group:cools_lava", "group:water"},
interval = 2,
chance = 2,
catch_up = false,
action = function(...)
lib_materials.cool_lava3(...)
end,
})
end
--
-- Convert dirt to something that fits the environment
--
minetest.register_abm({
label = "Grass spread",
nodenames = {"lib_materials:dirt"},
neighbors = {
"air",
"group:grass",
"group:dry_grass",
"lib_materials:snow",
},
interval = 6,
chance = 50,
catch_up = false,
action = function(pos, node)
-- Check for darkness: night, shadow or under a light-blocking node
-- Returns if ignore above
local above = {x = pos.x, y = pos.y + 1, z = pos.z}
if (minetest.get_node_light(above) or 0) < 13 then
return
end
-- Look for spreading dirt-type neighbours
local p2 = minetest.find_node_near(pos, 1, "group:spreading_dirt_type")
if p2 then
local n3 = minetest.get_node(p2)
minetest.set_node(pos, {name = n3.name})
return
end
-- Else, any seeding nodes on top?
local name = minetest.get_node(above).name
-- Snow check is cheapest, so comes first
if name == "lib_materials:snow" then
minetest.set_node(pos, {name = "lib_materials:dirt_with_snow"})
-- Most likely case first
elseif minetest.get_item_group(name, "grass") ~= 0 then
minetest.set_node(pos, {name = "lib_materials:dirt_with_grass"})
elseif minetest.get_item_group(name, "dry_grass") ~= 0 then
minetest.set_node(pos, {name = "lib_materials:dirt_with_grass_dry"})
end
end
})
--
-- Grass and dry grass removed in darkness
--
minetest.register_abm({
label = "Grass covered",
nodenames = {"group:spreading_dirt_type"},
interval = 8,
chance = 50,
catch_up = false,
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 = "lib_materials:dirt"})
end
end
})
--
-- Moss growth on cobble near water
--
minetest.register_abm({
label = "Moss growth",
nodenames = {"lib_materials:stone_cobble", "lib_materials:stone_cobble_slab", "lib_materials:stone_cobble_stairs", "lib_materials:stone_cobble_wall_centered"},
neighbors = {"group:water"},
interval = 16,
chance = 200,
catch_up = false,
action = function(pos, node)
if node.name == "lib_materials:stone_cobble" then
minetest.set_node(pos, {name = "lib_materials:stone_cobble_mossy"})
elseif node.name == "lib_materials:stone_cobble_slab" then
minetest.set_node(pos, {name = "lib_materials:stone_cobble_mossy_slab", param2 = node.param2})
elseif node.name == "lib_materials:stone_cobble_stairs" then
minetest.set_node(pos, {name = "lib_materials:stone_cobble_mossy_stairs", param2 = node.param2})
elseif node.name == "lib_materials:stone_cobble_wall_centered" then
minetest.set_node(pos, {name = "lib_materials:stone_cobble_mossy_wall_centered", param2 = node.param2})
end
end
})