diff options
author | TenPlus1 <kinsellaja@yahoo.com> | 2016-08-19 17:22:09 +0100 |
---|---|---|
committer | TenPlus1 <kinsellaja@yahoo.com> | 2016-08-19 17:22:09 +0100 |
commit | 4643128bea08a977c32e10bfc8260d1a91e2451e (patch) | |
tree | 61cd54d3d1828cc7f18f47ff1338ae5314b2583d /dirt.lua | |
parent | d98b48e2e102f59be92967ba4a6533923a29cb0e (diff) |
Added default abm overrides
Diffstat (limited to 'dirt.lua')
-rw-r--r-- | dirt.lua | 280 |
1 files changed, 227 insertions, 53 deletions
@@ -74,85 +74,259 @@ dirts = { "ethereal:bamboo_dirt", "ethereal:jungle_dirt", "ethereal:grove_dirt", "ethereal:prairie_dirt", "ethereal:cold_dirt", "ethereal:crystal_dirt", "ethereal:mushroom_dirt", "ethereal:fiery_dirt", "ethereal:gray_dirt", - "default:dirt_with_dry_grass" + "default:dirt_with_grass", "default:dirt_with_dry_grass", "ethereal:green_dirt", + "default:dirt_with_snow", "default:dirt_with_dry_grass" } -- check surrounding grass and change dirt to same colour -minetest.register_abm({ - nodenames = {"default:dirt_with_grass", "default:dirt"}, - neighbors = {"air"}, - interval = 6, - chance = 65, - catch_up = false, +local grass_spread = function(pos, node) - action = function(pos, node) + -- not enough light + local above = {x = pos.x, y = pos.y + 1, z = pos.z} - -- not enough light - local above = {x = pos.x, y = pos.y + 1, z = pos.z} + if (minetest.get_node_light(above) or 0) < 13 then + return + end - if (minetest.get_node_light(above) or 0) < 13 then - return + -- water above grass + local name = minetest.get_node(above).name + local def = minetest.registered_nodes[name] + + if name == "ignore" or not def or def.liquidtype ~= "none" then + return + end + + local curr_max, curr_type, num = 0, "" + + -- find all default and ethereal grasses in area around dirt + local positions, grasses = minetest.find_nodes_in_area( + {x = pos.x - 1, y = pos.y - 2, z = pos.z - 1}, + {x = pos.x + 1, y = pos.y + 2, z = pos.z + 1}, + {"group:ethereal_grass", "default:dirt_with_grass", + "default:dirt_with_dry_grass", "default:dirt_with_snow"}) + + -- count new grass nodes + for n = 1, #dirts do + + num = grasses[ dirts[n] ] or 0 + + if num > curr_max then + curr_max = num + curr_type = dirts[n] end + end - -- water above grass - local name = minetest.get_node(above).name - local nodef = minetest.registered_nodes[name] + -- no grass nearby, keep as dirt + if curr_type == "" then + return + end - if name == "ignore" or not nodef or nodef.liquidtype ~= "none" then - return + -- change default green grass to ethereal green grass + if curr_type == "default:dirt_with_grass" then + curr_type = "ethereal:green_dirt" + end + + minetest.swap_node(pos, {name = curr_type}) +end + +-- any grass with a block above will turn into dirt +local grass_devoid = 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.swap_node(pos, {name = "default:dirt"}) + end +end + +-- flower spread, also crystal and fire flower regeneration +local flower_spread = function(pos, node) + + local light = minetest.get_node_light(pos) + + if not light + or light < 13 then + return + end + + local pos0 = {x = pos.x - 4, y = pos.y - 2, z = pos.z - 4} + local pos1 = {x = pos.x + 4, y = pos.y + 2, z = pos.z + 4} + local num = #minetest.find_nodes_in_area_under_air(pos0, pos1, "group:flora") + + if num > 3 + and node.name == "ethereal:crystalgrass" then + + local grass = minetest.find_nodes_in_area_under_air( + pos0, pos1, {"ethereal:crystalgrass"}) + + if #grass > 4 + and not minetest.find_node_near(pos, 4, {"ethereal:crystal_spike"}) then + + grass = grass[math.random(#grass)] + + grass.y = grass.y - 1 + + if minetest.get_node(grass).name == "ethereal:crystal_dirt" then + + grass.y = grass.y + 1 + + minetest.swap_node(grass, {name = "ethereal:crystal_spike"}) + end end - local curr_max, num = 0 - local curr_type = "ethereal:green_dirt" -- fallback - local positions, grasses = minetest.find_nodes_in_area( - {x = (pos.x - 2), y = (pos.y - 2), z = (pos.z - 2)}, - {x = (pos.x + 2), y = (pos.y + 2), z = (pos.z + 2)}, - "group:ethereal_grass") + return - -- count new grass nodes - for n = 1, #dirts do + elseif num > 3 + and node.name == "ethereal:dry_shrub" then - num = grasses[dirts[n]] or 0 + local grass = minetest.find_nodes_in_area_under_air( + pos0, pos1, {"ethereal:dry_shrub"}) - if num > curr_max then - curr_max = num - curr_type = dirts[n] + if #grass > 8 + and not minetest.find_node_near(pos, 4, {"ethereal:fire_flower"}) then + + grass = grass[math.random(#grass)] + + grass.y = grass.y - 1 + + if minetest.get_node(grass).name == "ethereal:fiery_dirt" then + + grass.y = grass.y + 1 + + minetest.swap_node(grass, {name = "ethereal:fire_flower"}) end end - minetest.swap_node(pos, {name = curr_type}) + return + + elseif num > 3 then + return end -}) --- have dirt with dry grass spreads like ethereal grasses -minetest.override_item("default:dirt_with_dry_grass", { - groups = {crumbly = 3, soil = 1, ethereal_grass = 1}, -}) + local seedling = minetest.find_nodes_in_area_under_air( + pos0, pos1, {"group:soil"}) + + if #seedling > 0 then + + seedling = seedling[math.random(#seedling)] + seedling.y = seedling.y + 1 + + light = minetest.get_node_light(seedling) + + if not light + or light < 13 then + return + end + + minetest.swap_node(seedling, {name = node.name}) + end +end --- if grass devoid of light, change to dirt -minetest.register_abm({ - nodenames = {"group:ethereal_grass"}, - interval = 8, - chance = 40, -- 50 - catch_up = false, - action = function(pos, node) +-- grow papyrus up to 4 high and bamboo up to 8 high +local grow_papyrus = function(pos, node) - local name = minetest.get_node({ - x = pos.x, - y = pos.y + 1, - z = pos.z - }).name + local oripos = pos.y + local high = 4 - local nodedef = minetest.registered_nodes[name] + pos.y = pos.y - 1 - if name ~= "ignore" and nodedef - and not ((nodedef.sunlight_propagates or nodedef.paramtype == "light") - and nodedef.liquidtype == "none") then + local nod = minetest.get_node_or_nil(pos) - minetest.swap_node(pos, {name = "default:dirt"}) + if not nod + or minetest.get_item_group(nod.name, "soil") < 1 + or minetest.find_node_near(pos, 3, {"group:water"}) == nil then + return + end + + if node.name == "ethereal:bamboo" then + high = 8 + end + + pos.y = pos.y + 1 + + local height = 0 + + while height < high + and minetest.get_node(pos).name == node.name do + height = height + 1 + pos.y = pos.y + 1 + end + + nod = minetest.get_node_or_nil(pos) + + if nod + and nod.name == "air" + and height < high then + + if node.name == "ethereal:bamboo" + and height == (high - 1) then + + ethereal.grow_bamboo_tree({x = pos.x, y = oripos, z = pos.z}) + else + minetest.swap_node(pos, {name = node.name}) end end -}) + +end + +-- loop through active abm's +for _, ab in pairs(minetest.registered_abms) do + + local label = ab.label or "" + local node1 = ab.nodenames and ab.nodenames[1] or "" + local node2 = ab.nodenames and ab.nodenames[2] or "" + local neigh = ab.neighbors and ab.neighbors[1] or "" + + -- find dirt to grass abm and replace with spread function + if label == "Grass spread" + or (node1 == "default:dirt" + and neigh == "default:dirt_with_grass") then + + --ab.interval = 2 + --ab.chance = 1 + ab.nodenames = {"default:dirt_with_grass", "default:dirt"} + ab.neighbors = {"air"} + ab.action = grass_spread + + -- find grass devoid of light to dirt abm and change to devoid function + elseif label == "Grass covered" + or (node1 == "default:dirt_with_grass" + and node2 == "default:dirt_with_dry_grass") then + + --ab.interval = 2 + --ab.chance = 1 + ab.nodenames = { + "default:dirt_with_grass", "default:dirt_with_dry_grass", + "default:dirt_with_snow", "group:ethereal_grass" + } + ab.action = grass_devoid + + -- find flower spread abm and change to spread function + elseif label == "Flower spread" + or node1 == "group:flora" then + + --ab.interval = 2 + --ab.chance = 1 + ab.nodenames = {"group:flora"} + ab.neighbors = {"group:soil"} + ab.action = flower_spread + + -- find grow papyrus abm and change to grow_papyrus function + elseif label == "Grow papyrus" + or node1 == "default:papyrus" then + + --ab.interval = 2 + --ab.chance = 1 + ab.nodenames = {"default:papyrus", "ethereal:bamboo"} + ab.neighbors = {"group:soil"} + ab.action = grow_papyrus + end +end -- If Baked Clay mod not active, make Red, Orange and Grey nodes if not minetest.get_modpath("bakedclay") then |