More elaborate clam spawning check
This commit is contained in:
parent
dd8a75409b
commit
51a9211cb1
@ -1024,22 +1024,47 @@ minetest.register_abm({
|
|||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
|
||||||
|
-- Clams "washing up" at shallow sand and gravel beaches
|
||||||
minetest.register_abm({
|
minetest.register_abm({
|
||||||
label = "Growing clams",
|
label = "Growing clams",
|
||||||
nodenames = {"rp_default:sand", "rp_default:gravel"},
|
nodenames = {"rp_default:sand", "rp_default:gravel"},
|
||||||
neighbors = {"rp_default:water_source"},
|
neighbors = {"rp_default:water_source"},
|
||||||
interval = 20,
|
interval = 20,
|
||||||
chance = 160,
|
chance = 160,
|
||||||
|
min_y = water_level,
|
||||||
|
max_y = water_level+2,
|
||||||
action = function(pos, node)
|
action = function(pos, node)
|
||||||
if pos.y ~= water_level then
|
if pos.y < water_level or pos.y > water_level+2 then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
-- Abort if there's a clam nearby
|
||||||
local pos0 = vector.add(pos, {x=-5, y=0, z=-5})
|
local pos0 = vector.add(pos, {x=-5, y=0, z=-5})
|
||||||
local pos1 = vector.add(pos, {x=5, y=2, z=5})
|
local pos1 = vector.add(pos, {x=5, y=2, z=5})
|
||||||
if #minetest.find_nodes_in_area(pos0, pos1, "group:clam") >= 1 then
|
if #minetest.find_nodes_in_area(pos0, pos1, "group:clam") >= 1 then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Check the terrain around pos if it roughly resembles a shallow beach.
|
||||||
|
-- Done to prevent clam spawning in trivial cases like
|
||||||
|
-- 1 water source + 1 sand
|
||||||
|
|
||||||
|
-- Count water around pos 1 level below where the clam would be
|
||||||
|
pos0 = vector.add(pos, {x=-5, y=0, z=-5})
|
||||||
|
pos1 = vector.add(pos, {x=5, y=0, z=5})
|
||||||
|
local waternodes = #minetest.find_nodes_in_area(pos0, pos1, "rp_default:water_source")
|
||||||
|
-- Count sand and gravel around pos 2 levels below where the clam would be.
|
||||||
|
-- This is 1 level below the water.
|
||||||
|
pos0 = vector.add(pos, {x=-5, y=-1, z=-5})
|
||||||
|
pos1 = vector.add(pos, {x=5, y=-1, z=5})
|
||||||
|
-- Seagrass also counts as the node position is the solid sand-/dirt-like node, not the plant itself
|
||||||
|
local beachnodes = #minetest.find_nodes_in_area(pos0, pos1, {"rp_default:sand", "rp_default:gravel", "group:seagrass"})
|
||||||
|
-- Check if enough nodes were found. 30 is roughly 1/4 of an 11×11 area
|
||||||
|
if waternodes < 30 or beachnodes < 30 then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- All checks passed! Clam spawning begins.
|
||||||
|
-- Check for places for 1 or multiple clams to spawn on.
|
||||||
pos0 = vector.add(pos, {x=-2, y=0, z=-2})
|
pos0 = vector.add(pos, {x=-2, y=0, z=-2})
|
||||||
pos1 = vector.add(pos, {x=2, y=0, z=2})
|
pos1 = vector.add(pos, {x=2, y=0, z=2})
|
||||||
local soils = minetest.find_nodes_in_area_under_air( pos0, pos1, {"rp_default:sand", "rp_default:gravel"})
|
local soils = minetest.find_nodes_in_area_under_air( pos0, pos1, {"rp_default:sand", "rp_default:gravel"})
|
||||||
|
Loading…
x
Reference in New Issue
Block a user