-- Generate regular ores
default.generate_ore("default:stone_with_iron", "default:stone", minp, maxp, seed+2, 1/15/15/15, 3, 5, -63, 2)
default.generate_ore("default:stone_with_iron", "default:stone", minp, maxp, seed+3, 1/12/12/12, 3, 5, -31000, -64)
default.generate_ore("default:stone_with_mese", "default:stone", minp, maxp, seed+4, 1/32/32/32, 2, 3, -127, -64)
default.generate_ore("default:stone_with_mese", "default:stone", minp, maxp, seed+5, 1/18/18/18, 3, 5, -31000, -128)
default.generate_ore("default:mese", "default:stone", minp, maxp, seed+8, 1/16/16/16, 2, 3, -31000,-1024)
function in_cuboid(pos, minp, maxp)
return (pos.x>=minp.x and pos.y>= minp.y and pos.z>=minp.z and pos.x<=maxp.x and pos.y<=maxp.y and pos.z<=maxp.z)
end
function round_pos(p)
return {x=math.floor(p.x+0.5),y=math.floor(p.y+0.5),z=math.floor(p.z+0.5)}
end
function place_segment(name, wherein, pos1, pos2, minp, maxp)
local d={x=pos2.x-pos1.x, y=pos2.y-pos1.y, z=pos2.z-pos1.z}
local N=math.max(math.abs(d.x),math.abs(d.y),math.abs(d.z))
local s={x=d.x/N,y=d.y/N,z=d.z/N}
local p=pos1
if minetest.env:get_node(pos1).name == wherein then
minetest.env:set_node(pos1,{name=name})
end
for i=1,N do
p={x=p.x+s.x,y=p.y+s.y,z=p.z+s.z}
p0=round_pos(p)
if not in_cuboid(p0, minp, maxp) then return end
if minetest.env:get_node(p0).name == wherein then
minetest.env:set_node(p0,{name=name})
end
end
end
function generate_vein_segment(name, wherein, minp, maxp, pr, pos, angle, rem_size, options)
if rem_size<=0 then return end
local Ln=options.seglenghtn
local Ldev=options.seglenghtdev
local L=pr:next(Ln-Ldev,Ln+Ldev)
local incln=options.segincln*100
local incldev=options.segincldev*100
local incl=pr:next(incln-incldev,incln+incldev)/100
local turnangle=options.turnangle
local forkturnangle=options.forkturnangle
local fork_chance=options.fork_chance*100
local forkmultn=options.forkmultn*100
local forkmultdev=options.forkmultdev*100
local end_pos={x=pos.x+L*math.cos(angle), y=pos.y-L*incl, z=pos.z+L*math.sin(angle)}
place_segment(name, wherein, round_pos(pos), round_pos(end_pos), minp, maxp)
if not in_cuboid(end_pos, minp, maxp) then return end
local new_angle=(math.pi*pr:next(-turnangle,turnangle)/180)+angle
generate_vein_segment(name, wherein, minp, maxp, pr, end_pos, new_angle, rem_size-L, options)
local numforks=math.floor(fork_chance/100)+1
fork_chance=fork_chance/numforks
if pr:next(1,100)<=fork_chance then
for f=1,numforks do
local new_angle=(math.pi*pr:next(-forkturnangle,forkturnangle)/180)+angle
local forkmult=pr:next(forkmultn-forkmultdev, forkmultn+forkmultdev)/100
if forkmult>1 then forkmult=1 end
generate_vein_segment(name, wherein, minp, maxp, pr, end_pos, new_angle, forkmult*(rem_size-L), options)
end
end
end
function generate_vein(name, wherein, minp, maxp, seed, options, second_call)
options=get_or_default(options)
pr = PseudoRandom(seed)
local numperblock=options.numperblock*1000
local maxhdistance=options.maxhdistance
local maxvdistance=options.maxvdistance
local numbranchesn=options.numbranchesn
local numbranchesdev=options.numbranchesdev
local numbranches=pr:next(numbranchesn-numbranchesdev,numbranchesn+numbranchesdev)
local sizen=options.sizen
local sizedev=options.sizedev
if second_call==nil then
local hblocks=math.floor(maxhdistance/80)+1
local vblocks=math.floor(maxvdistance/80)+1
for xblocksdiff=-hblocks,hblocks do
for yblocksdiff=-vblocks,vblocks do
for zblocksdiff=-hblocks,hblocks do
if xblocksdiff~=0 or yblocksdiff~=0 or zblocksdiff~=0 then
new_seed=seed+80*23*xblocksdiff+80*42123*yblocksdiff+80*38134234*zblocksdiff
new_minp={x=minp.x+xblocksdiff*80,y=minp.y+yblocksdiff*80,z=minp.z+zblocksdiff*80}
new_maxp={x=maxp.x+xblocksdiff*80,y=maxp.y+yblocksdiff*80,z=maxp.z+zblocksdiff*80}
generate_vein(name, wherein, new_minp, new_maxp, new_seed, options, true)
end
end
end
end
end
local numveins=math.floor(numperblock/1000)+1
numperblock=numperblock/numveins
if pr:next(1,1000)<=numperblock then
for v=1,numveins do
local vein_pos={x=pr:next(minp.x,maxp.x),y=pr:next(minp.y,maxp.y),z=pr:next(minp.z,maxp.z)}
local minpos = {x=vein_pos.x-maxhdistance,y=vein_pos.y-maxvdistance,x=vein_pos.z-maxhdistance}
local maxpos = {x=vein_pos.x+maxhdistance,y=vein_pos.y+maxvdistance,x=vein_pos.z+maxhdistance}
for i=1,numbranches do
local start_angle=math.pi*pr:next(0,359)/180
local size=pr:next(sizen-sizedev,sizen+sizedev)
generate_vein_segment(name, wherein, minp, maxp, pr, vein_pos, start_angle, size, options)
end
end
end
end
function get_or_default(options)
if options.numperblock==nil then options.numperblock=0.3 end
if options.maxhdistance==nil then options.maxhdistance=32 end
if options.maxvdistance==nil then options.maxvdistance=32 end
if options.numbranchesn==nil then options.numbranchesn=3 end
if options.numbranchesdev==nil then options.numbranchesdev=2 end
if options.sizen==nil then options.sizen=120 end
if options.sizedev==nil then options.sizedev=60 end
if options.seglenghtn==nil then options.seglenghtn=6 end
if options.seglenghtdev==nil then options.seglenghtdev=2 end
if options.segincln==nil then options.segincln=0.2 end
if options.segincldev==nil then options.segincldev=0.1 end
if options.turnangle==nil then options.turnangle=20 end
if options.forkturnangle==nil then options.forkturnangle=90 end
if options.fork_chance==nil then options.fork_chance=0.2 end
if options.forkmultn==nil then options.forkmultn=0.75 end
if options.forkmultdev==nil then options.forkmultdev=0.25 end
return options
end
minetest.register_on_generated(function(minp, maxp, seed)
generate_vein("default:mese","air",minp,maxp,seed, {})
end)
function in_cuboid(pos, minp, maxp)
return (pos.x>=minp.x and pos.y>= minp.y and pos.z>=minp.z and pos.x<=maxp.x and pos.y<=maxp.y and pos.z<=maxp.z)
end
function round_pos(p)
return {x=math.floor(p.x+0.5),y=math.floor(p.y+0.5),z=math.floor(p.z+0.5)}
end
function draw_sphere(name, wherein, center, radius)
local rad2=radius*radius
pos0={}
for x=-radius, radius do
pos0.x=center.x+x
for y=-radius, radius do
pos0.y=center.y+y
for z=-radius, radius do
pos0.z=center.z+z
if x*x+y*y+z*z<=rad2 and minetest.env:get_node(pos0).name==wherein then
minetest.env:set_node(pos0,{name=name})
end
end
end
end
end
function place_segment(name, wherein, pos1, pos2, minp, maxp, radius)
local d={x=pos2.x-pos1.x, y=pos2.y-pos1.y, z=pos2.z-pos1.z}
local N=math.max(math.abs(d.x),math.abs(d.y),math.abs(d.z))
local s={x=d.x/N,y=d.y/N,z=d.z/N}
local p=pos1
if minetest.env:get_node(pos1).name == wherein then
minetest.env:set_node(pos1,{name=name})
end
for i=1,N do
p={x=p.x+s.x,y=p.y+s.y,z=p.z+s.z}
p0=round_pos(p)
if not in_cuboid(p0, minp, maxp) then return end
draw_sphere(name,wherein,p0,radius)
end
end
function generate_vein_segment(name, wherein, minp, maxp, pr, pos, angle, rem_size, options)
if rem_size<=0 then return end
local Ln=options.seglenghtn
local Ldev=options.seglenghtdev
local L=pr:next(Ln-Ldev,Ln+Ldev)
local incln=options.segincln*100
local incldev=options.segincldev*100
local incl=pr:next(incln-incldev,incln+incldev)/100
local turnangle=options.turnangle
local forkturnangle=options.forkturnangle
local fork_chance=options.fork_chance*100
local forkmultn=options.forkmultn*100
local forkmultdev=options.forkmultdev*100
local radius=options.radius
local end_pos={x=pos.x+L*math.cos(angle), y=pos.y-L*incl, z=pos.z+L*math.sin(angle)}
place_segment(name, wherein, round_pos(pos), round_pos(end_pos), minp, maxp, radius)
if not in_cuboid(end_pos, minp, maxp) then return end
local new_angle=(math.pi*pr:next(-turnangle,turnangle)/180)+angle
generate_vein_segment(name, wherein, minp, maxp, pr, end_pos, new_angle, rem_size-L, options)
local numforks=math.floor(fork_chance/100)+1
fork_chance=fork_chance/numforks
if pr:next(1,100)<=fork_chance then
for f=1,numforks do
local new_angle=(math.pi*pr:next(-forkturnangle,forkturnangle)/180)+angle
local forkmult=pr:next(forkmultn-forkmultdev, forkmultn+forkmultdev)/100
if forkmult>1 then forkmult=1 end
generate_vein_segment(name, wherein, minp, maxp, pr, end_pos, new_angle, forkmult*(rem_size-L), options)
end
end
end
function generate_vein(name, wherein, minp, maxp, seed, options, second_call)
while seed<0 do
seed=seed+4294967296 --2^32
end
while seed>=4294967296 do
seed=seed-4294967296
end
options=get_or_default(options)
local numperblock=options.numperblock*1000
local maxhdistance=options.maxhdistance
local maxvdistance=options.maxvdistance
local numbranchesn=options.numbranchesn
local numbranchesdev=options.numbranchesdev
local mothersizen=options.mothersizen*10
local mothersizedev=options.mothersizedev*10
local sizen=options.sizen
local sizedev=options.sizedev
if second_call==nil then
local hblocks=math.floor(maxhdistance/80)+1
local vblocks=math.floor(maxvdistance/80)+1
for xblocksdiff=-hblocks,hblocks do
for yblocksdiff=-vblocks,vblocks do
for zblocksdiff=-hblocks,hblocks do
if xblocksdiff~=0 or yblocksdiff~=0 or zblocksdiff~=0 then
new_seed=seed+80*23*xblocksdiff+80*42123*yblocksdiff+80*38134234*zblocksdiff
while new_seed<0 do
new_seed=new_seed+4294967296 --2^32
end
while new_seed>=4294967296 do
new_seed=new_seed-4294967296
end
new_minp={x=minp.x+xblocksdiff*80,y=minp.y+yblocksdiff*80,z=minp.z+zblocksdiff*80}
new_maxp={x=maxp.x+xblocksdiff*80,y=maxp.y+yblocksdiff*80,z=maxp.z+zblocksdiff*80}
generate_vein(name, wherein, new_minp, new_maxp, new_seed, options, true)
end
end
end
end
end
--local pr = PseudoRandom(seed)
local pr={}
function pr:next(min,max)
return math.random(min,max)
end
math.randomseed(seed)
for i=1,1000 do pr:next(1,1) end
local numveins=math.floor(numperblock/1000)
numperblock=numperblock-1000*numveins
if pr:next(1,1000)<=numperblock then
numveins=numveins+1
end
if numveins>0 then
local min_y=math.max(options.minheight,minp.y)
local max_y=math.min(options.maxheight,maxp.y)
if min_y>max_y then return end
for v=1,numveins do
local vein_pos={x=pr:next(minp.x,maxp.x),y=pr:next(min_y,max_y),z=pr:next(minp.z,maxp.z)}
local numbranches=pr:next(numbranchesn-numbranchesdev,numbranchesn+numbranchesdev)
local mothersize=pr:next(mothersizen-mothersizedev,mothersizen+mothersizedev)/10
draw_sphere(name, wherein,vein_pos, mothersize)
local minpos = {x=vein_pos.x-maxhdistance,y=vein_pos.y-maxvdistance,z=vein_pos.z-maxhdistance}
local maxpos = {x=vein_pos.x+maxhdistance,y=vein_pos.y+maxvdistance,z=vein_pos.z+maxhdistance}
for i=1,numbranches do
local start_angle=math.pi*pr:next(0,359)/180
local size=pr:next(sizen-sizedev,sizen+sizedev)
generate_vein_segment(name, wherein, minpos, maxpos, pr, vein_pos, start_angle, size, options)
end
end
end
end
function get_or_default(options)
if options.numperblock==nil then options.numperblock=0.3 end
if options.maxhdistance==nil then options.maxhdistance=32 end
if options.maxvdistance==nil then options.maxvdistance=32 end
if options.numbranchesn==nil then options.numbranchesn=3 end
if options.numbranchesdev==nil then options.numbranchesdev=2 end
if options.mothersizen==nil then options.mothersizen=1 end
if options.mothersizedev==nil then options.mothersizedev=0.5 end
if options.sizen==nil then options.sizen=120 end
if options.sizedev==nil then options.sizedev=60 end
if options.seglenghtn==nil then options.seglenghtn=6 end
if options.seglenghtdev==nil then options.seglenghtdev=2 end
if options.segincln==nil then options.segincln=0.2 end
if options.segincldev==nil then options.segincldev=0.1 end
if options.turnangle==nil then options.turnangle=20 end
if options.forkturnangle==nil then options.forkturnangle=90 end
if options.fork_chance==nil then options.fork_chance=0.2 end
if options.forkmultn==nil then options.forkmultn=0.75 end
if options.forkmultdev==nil then options.forkmultdev=0.25 end
if options.minheight==nil then options.minheight=-31000 end
if options.maxheight==nil then options.maxheight=31000 end
if options.radius==nil then options.radius=0 end
return options
end
minetest.register_on_generated(function(minp, maxp, seed)
generate_vein("default:stone_with_iron","default:stone",minp,maxp,seed, {maxvdistance=10.5, maxheight=-16,
seglenghtn=15, seglenghtdev=6, segincln=0, segincldev=0.6, turnangle=57, forkturnangle=57, numperblock=2.5})
generate_vein("default:stone_with_coal","default:stone",minp,maxp,seed+1, {maxvdistance=10, sizen=54, sizedev=27, maxheight=64,
seglenghtn=15, seglenghtdev=6, segincln=0, segincldev=0.36, turnangle=57, forkturnangle=57, radius=1,numperblock=6})
generate_vein("default:stone_with_mese","default:stone",minp,maxp,seed+2, {maxvdistance=50, sizen=7, sizedev=3, maxheight=-128,
seglenghtn=2, seglenghtdev=1, segincln=4, segincldev=1, turnangle=57, forkturnangle=57,numperblock=0.8,
numbranchesn=2, numbranchesdev=1, fork_chance=0.1, mothersizen=0, mothersizedev=0})
generate_vein("default:mese","default:stone",minp,maxp,seed+3, {maxvdistance=50, sizen=7, sizedev=3, maxheight=-1024,
seglenghtn=2, seglenghtdev=1, segincln=4, segincldev=1, turnangle=57, forkturnangle=57,
numbranchesn=2, numbranchesdev=1, fork_chance=0.1, radius=1})
generate_vein("default:lava_source","default:mese",minp,maxp,seed+3, {maxvdistance=50, sizen=7, sizedev=3, maxheight=-1024,
seglenghtn=2, seglenghtdev=1, segincln=4, segincldev=1, turnangle=57, forkturnangle=57,
numbranchesn=2, numbranchesdev=1, fork_chance=0.1, mothersizen=0, mothersizedev=0})
end)
function perlinore.generate_ore(name, wherein, minp, maxp, seed, chunks_per_volume, chunk_size, ore_per_chunk, height_min, height_max, noise_min, noise_max)
minetest.register_on_generated(function(minp, maxp, seed)
...the code
end)
end
kotolegokot wrote:The link is not working.
Users browsing this forum: No registered users and 18 guests