-- Water mechanics from the ethereal mod -- -- If Crystal Spike, Crystal Dirt, Snow near Water, change Water to Ice minetest.register_abm({ label = "Illuna freeze water", nodenames = { "default:snow", "default:snowblock" }, neighbors = {"default:water_source", "default:river_water_source"}, interval = 15, chance = 4, catch_up = false, action = function(pos, node) local near = minetest.find_node_near(pos, 1, {"default:water_source", "default:river_water_source"}) if near then minetest.swap_node(near, {name = "default:ice"}) end end, }) -- If Heat Source near Ice or Snow then melt minetest.register_abm({ label = "Ethereal melt snow/ice", nodenames = { "default:ice", "default:snowblock", "default:snow", "default:dirt_with_snow" }, neighbors = { "fire:basic_fire", "default:lava_source", "default:lava_flowing", "default:furnace_active", "default:torch" }, interval = 5, chance = 4, catch_up = false, action = function(pos, node) local water_node = "default:water" if pos.y > 2 then water_node = "default:river_water" end if node.name == "default:ice" or node.name == "default:snowblock" or node.name == "ethereal:icebrick" or node.name == "ethereal:snowbrick" then minetest.swap_node(pos, {name = water_node.."_source"}) elseif node.name == "default:snow" then minetest.swap_node(pos, {name = water_node.."_flowing"}) elseif node.name == "default:dirt_with_snow" then minetest.swap_node(pos, {name = "default:dirt_with_grass"}) end minetest.check_for_falling(pos) end, }) -- If Water Source near Dry Dirt, change to normal Dirt minetest.register_abm({ label = "Ethereal wet dry dirt", nodenames = {"ethereal:dry_dirt", "default:dirt_with_dry_grass"}, neighbors = {"group:water"}, interval = 15, chance = 2, catch_up = false, action = function(pos, node) if node == "ethereal:dry_dirt" then minetest.swap_node(pos, {name = "default:dirt"}) else minetest.swap_node(pos, {name = "ethereal:green_dirt"}) end end, }) -- If torch touching water then drop as item minetest.register_abm({ label = "Ethereal drop torch", nodenames = {"default:torch"}, neighbors = {"group:water"}, interval = 5, chance = 1, catch_up = false, action = function(pos, node) local num = #minetest.find_nodes_in_area( {x = pos.x - 1, y = pos.y, z = pos.z}, {x = pos.x + 1, y = pos.y, z = pos.z}, {"group:water"}) num = num + #minetest.find_nodes_in_area( {x = pos.x, y = pos.y, z = pos.z - 1}, {x = pos.x, y = pos.y, z = pos.z + 1}, {"group:water"}) num = num + #minetest.find_nodes_in_area( {x = pos.x, y = pos.y + 1, z = pos.z}, {x = pos.x, y = pos.y + 1, z = pos.z}, {"group:water"}) if num > 0 then minetest.swap_node(pos, {name = "air"}) minetest.add_item(pos, {name = node.name}) end end, })