summaryrefslogtreecommitdiff
path: root/dirt.lua
diff options
context:
space:
mode:
authorTenPlus1 <kinsellaja@yahoo.com>2016-08-19 17:22:09 +0100
committerTenPlus1 <kinsellaja@yahoo.com>2016-08-19 17:22:09 +0100
commit4643128bea08a977c32e10bfc8260d1a91e2451e (patch)
tree61cd54d3d1828cc7f18f47ff1338ae5314b2583d /dirt.lua
parentd98b48e2e102f59be92967ba4a6533923a29cb0e (diff)
Added default abm overrides
Diffstat (limited to 'dirt.lua')
-rw-r--r--dirt.lua280
1 files changed, 227 insertions, 53 deletions
diff --git a/dirt.lua b/dirt.lua
index c14f6a4..483feb6 100644
--- a/dirt.lua
+++ b/dirt.lua
@@ -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