71 lines
2.3 KiB
Lua
71 lines
2.3 KiB
Lua
aliveai.registered_rndcheck_nodes={}
|
|
|
|
aliveai.register_rndcheck_on_generated=function(def)
|
|
if not def then return end
|
|
def.miny=def.miny or -500
|
|
def.maxy=def.maxy or 500
|
|
def.chance=def.chance or 1
|
|
def.mindistance=def.mindistance or 0
|
|
if def.node and type(def.node)~="string" then
|
|
print("failed to add to check random generated node: node aren't a string")
|
|
elseif def.chance and type(def.chance)~="number" then
|
|
print("failed to add to check random generated chance aren't a number")
|
|
elseif def.mindistance and type(def.mindistance)~="number" then
|
|
print("failed to add to check random generated mindistance aren't a number")
|
|
elseif def.group and type(def.group)~="string" then
|
|
print("failed to add to check random generated node:group aren't a string")
|
|
elseif type(def.run)~="function" then
|
|
print("failed to add to check random generated node: no run function")
|
|
return
|
|
elseif not (def.node or def.group) then
|
|
print("failed to add to check random generated node: choose node or group or both")
|
|
return
|
|
end
|
|
table.insert(aliveai.registered_rndcheck_nodes,{
|
|
func=def.run,
|
|
miny=def.miny,
|
|
maxy=def.maxy,
|
|
group=def.group,
|
|
node=def.node,
|
|
first_only=def.first_only,
|
|
chance=def.chance,
|
|
mindistance=def.mindistance
|
|
})
|
|
end
|
|
|
|
minetest.register_on_generated(function(minp, maxp, seed)
|
|
local nodes={}
|
|
for _, f in pairs(aliveai.registered_rndcheck_nodes) do
|
|
if f.miny<=minp.y and f.maxy>=maxp.y then
|
|
f.first=nil
|
|
table.insert(nodes,f)
|
|
end
|
|
end
|
|
if #nodes==0 then
|
|
return
|
|
end
|
|
local center={x=minp.x+math.floor((maxp.x-minp.x)/2),y=minp.y+math.floor((maxp.y-minp.y)/2),z=minp.z+math.floor((maxp.z-minp.z)/2)}
|
|
local a
|
|
for ii=-20,20,1 do
|
|
a=ii+math.pi
|
|
local cp={x=center.x+20*math.cos(a),y=center.y+ii,z=center.z+20*math.sin(a)}
|
|
--minetest.set_node(cp,{name="default:mese"})
|
|
local node=minetest.get_node(cp).name
|
|
for _, f in pairs(nodes) do
|
|
if not f.first and math.random(1,f.chance)==1 and (f.node and f.node==node) or (f.group and minetest.get_item_group(node,f.group)>0) then
|
|
if not f.lpos then
|
|
f.lpos=cp
|
|
end
|
|
if f.mindistance<=aliveai.distance(cp,f.lpos) then
|
|
if f.first_only then
|
|
f.first=true
|
|
end
|
|
f.lpos=cp
|
|
minetest.after(0, function(f,cp)
|
|
f.func(cp)
|
|
end,f,cp)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end) |