-- Load translation library if intllib is installed local S if (minetest.get_modpath("intllib")) then dofile(minetest.get_modpath("intllib").."/intllib.lua") S = intllib.Getter(minetest.get_current_modname()) else S = function ( s ) return s end end rocks = {} rocks.layers = {} rocks.veins = {} rocks.ores = {} rocks.layer_gain=40 rocks.layer_scale=500 rocks.layer_presist=0.7 rocks.layer_octaves=3 rocks.rock_scale=3 rocks.rock_presist=0.5 rocks.rock_octaves=1 -- faster than 2 ? rocks.register_layer=function(name,params) assert(name) assert(params) assert(params.gain) assert(params.height) rocks.layers[name]= { gain=params.gain, height=params.height, sum=0, rocks={} } print("[rocks] register layer "..name) end rocks.register_rock=function(layer,block,amount) assert(layer) assert(block) assert(amount) assert(rocks.layers[layer]) table.insert(rocks.layers[layer].rocks, { block=block, amount=amount, placed=0}) rocks.layers[layer].sum=rocks.layers[layer].sum+amount print("[rocks] register rock "..block.." in "..layer.." amount="..amount.." cur sum="..rocks.layers[layer].sum) end -- -- test layer -- rocks.register_layer("test",{ gain=10, height=100 }) rocks.register_rock("test","rocks:black_granite",1) rocks.register_rock("test","rocks:brown_granite",1) rocks.register_rock("test","rocks:pink_granite",1) rocks.register_rock("test","rocks:white_granite",1) -- -- layer generator -- local noise_layer=nil local noise_rock=nil local noise_vein=nil local noise_ore=nil local stonectx=nil local function get_layer(y,noise) return bln end minetest.register_on_generated(function(minp, maxp, seed) if noise_layer==nil then noise_layer=minetest.get_perlin(353, rocks.layer_octaves, rocks.layer_presist, rocks.layer_scale) end if noise_rock==nil then noise_rock=minetest.get_perlin(354, rocks.rock_octaves, rocks.rock_presist, rocks.rock_scale) end if not stonectx then stonectx= minetest.get_content_id("default:stone") end -- noise values range (-1;+1) (1 octave) -- 3 octaves it is like 1.7 max -- 4 octaves with 0.8 presist = 2.125 max !! -- if ... print("[rocks] generate y="..minp.y) local timebefore=os.clock(); local manipulator, emin, emax = minetest.get_mapgen_object("voxelmanip") local nodes = manipulator:get_data() local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax} local maxrnoise=-500 local minrnoise=500 local perlin=nil for x=minp.x,maxp.x,1 do for z=minp.z,maxp.z,1 do perlin=noise_layer:get2d( {x=x, y=z} ) noise=perlin*rocks.layer_gain local curlh=-31000 -- top height of current layer local curln=nil -- name of current layer local layer=nil for y=minp.y,maxp.y,1 do -- select current layer if (not layer)or((y+noise)>curlh) then curlh=-31000 curln=nil for ln,ld in pairs(rocks.layers) do if (ld.height>curlh)and(y+noise>ld.height) then curln=ln curlh=ld.height end end layer=rocks.layers[curln] end if layer then -- noise for rocks rnoise=noise_rock:get3d( {x=x, y=y, z=z} ) if rnoise>maxrnoise then maxrnoise=rnoise end if rnoiselayer.sum then rnoise=layer.sum end -- select current rock local rofs=0 for rn,rd in pairs(layer.rocks) do if (rnoise>=rofs) and (rnoise