forked from minetest-mods/technic
		
	New ores code
This commit is contained in:
		
							
								
								
									
										115
									
								
								technic/ores.lua
									
									
									
									
									
								
							
							
						
						
									
										115
									
								
								technic/ores.lua
									
									
									
									
									
								
							@@ -248,54 +248,67 @@ minetest.register_craft({
 | 
			
		||||
				recipe = "technic:zinc_lump"
 | 
			
		||||
			})
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
local function generate_ore(name, wherein, minp, maxp, seed, chunks_per_volume, ore_per_chunk, height_min, height_max)
 | 
			
		||||
	if maxp.y < height_min or minp.y > height_max then
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
	local y_min = math.max(minp.y, height_min)
 | 
			
		||||
	local y_max = math.min(maxp.y, height_max)
 | 
			
		||||
	local volume = (maxp.x-minp.x+1)*(y_max-y_min+1)*(maxp.z-minp.z+1)
 | 
			
		||||
	local pr = PseudoRandom(seed)
 | 
			
		||||
	local num_chunks = math.floor(chunks_per_volume * volume)
 | 
			
		||||
	local chunk_size = 3
 | 
			
		||||
	if ore_per_chunk <= 4 then
 | 
			
		||||
		chunk_size = 2
 | 
			
		||||
	end
 | 
			
		||||
	local inverse_chance = math.floor(chunk_size*chunk_size*chunk_size / ore_per_chunk)
 | 
			
		||||
	--print("generate_ore num_chunks: "..dump(num_chunks))
 | 
			
		||||
	for i=1,num_chunks do
 | 
			
		||||
	if (y_max-chunk_size+1 <= y_min) then return end
 | 
			
		||||
		local y0 = pr:next(y_min, y_max-chunk_size+1)
 | 
			
		||||
		if y0 >= height_min and y0 <= height_max then
 | 
			
		||||
			local x0 = pr:next(minp.x, maxp.x-chunk_size+1)
 | 
			
		||||
			local z0 = pr:next(minp.z, maxp.z-chunk_size+1)
 | 
			
		||||
			local p0 = {x=x0, y=y0, z=z0}
 | 
			
		||||
			for x1=0,chunk_size-1 do
 | 
			
		||||
			for y1=0,chunk_size-1 do
 | 
			
		||||
			for z1=0,chunk_size-1 do
 | 
			
		||||
				if pr:next(1,inverse_chance) == 1 then
 | 
			
		||||
					local x2 = x0+x1
 | 
			
		||||
					local y2 = y0+y1
 | 
			
		||||
					local z2 = z0+z1
 | 
			
		||||
					local p2 = {x=x2, y=y2, z=z2}
 | 
			
		||||
					if minetest.env:get_node(p2).name == wherein then
 | 
			
		||||
						minetest.env:set_node(p2, {name=name})
 | 
			
		||||
					end
 | 
			
		||||
				end
 | 
			
		||||
			end
 | 
			
		||||
			end
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
	--print("generate_ore done")
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
minetest.register_on_generated(function(minp, maxp, seed)
 | 
			
		||||
generate_ore("technic:mineral_diamond",		"default:stone", minp, maxp, seed+21, 1/11/11/11,	4,  -31000, -450)
 | 
			
		||||
generate_ore("technic:mineral_uranium",		"default:stone", minp, maxp, seed+22, 1/10/10/10,	3,  -300,   -80)
 | 
			
		||||
generate_ore("technic:mineral_chromium",	"default:stone", minp, maxp, seed+23, 1/10/10/10,	2,  -31000, -100)
 | 
			
		||||
generate_ore("technic:mineral_zinc",		"default:stone", minp, maxp, seed+24, 1/9/9/9,		4,  -31000,  2)
 | 
			
		||||
generate_ore("technic:marble",				"default:stone", minp, maxp, seed+25, 1/128,		20, -100,   -32)
 | 
			
		||||
generate_ore("technic:granite",				"default:stone", minp, maxp, seed+25, 1/128,		15, -190,   -90)
 | 
			
		||||
end)
 | 
			
		||||
minetest.register_ore({
 | 
			
		||||
	ore_type       = "scatter",
 | 
			
		||||
	ore            = "technic:mineral_diamond",
 | 
			
		||||
	wherein        = "default:stone",
 | 
			
		||||
	clust_scarcity = 11*11*11,
 | 
			
		||||
	clust_num_ores = 4,
 | 
			
		||||
	clust_size     = 3,
 | 
			
		||||
	height_min     = -31000,
 | 
			
		||||
	height_max     = -450,
 | 
			
		||||
})
 | 
			
		||||
minetest.register_ore({
 | 
			
		||||
	ore_type       = "scatter",
 | 
			
		||||
	ore            = "technic:mineral_uranium",
 | 
			
		||||
	wherein        = "default:stone",
 | 
			
		||||
	clust_scarcity = 10*10*10,
 | 
			
		||||
	clust_num_ores = 4,
 | 
			
		||||
	clust_size     = 3,
 | 
			
		||||
	height_min     = -300,
 | 
			
		||||
	height_max     = -80,
 | 
			
		||||
})
 | 
			
		||||
minetest.register_ore({
 | 
			
		||||
	ore_type       = "scatter",
 | 
			
		||||
	ore            = "technic:mineral_chromium",
 | 
			
		||||
	wherein        = "default:stone",
 | 
			
		||||
	clust_scarcity = 10*10*10,
 | 
			
		||||
	clust_num_ores = 2,
 | 
			
		||||
	clust_size     = 3,
 | 
			
		||||
	height_min     = -31000,
 | 
			
		||||
	height_max     = -100,
 | 
			
		||||
})
 | 
			
		||||
minetest.register_ore({
 | 
			
		||||
	ore_type       = "scatter",
 | 
			
		||||
	ore            = "technic:mineral_zinc",
 | 
			
		||||
	wherein        = "default:stone",
 | 
			
		||||
	clust_scarcity = 9*9*9,
 | 
			
		||||
	clust_num_ores = 4,
 | 
			
		||||
	clust_size     = 3,
 | 
			
		||||
	height_min     = -31000,
 | 
			
		||||
	height_max     = 2,
 | 
			
		||||
})
 | 
			
		||||
minetest.register_ore({
 | 
			
		||||
	ore_type       = "sheet",
 | 
			
		||||
	ore            = "technic:marble",
 | 
			
		||||
	wherein        = "default:stone",
 | 
			
		||||
	clust_scarcity = 1,
 | 
			
		||||
	clust_num_ores = 1,
 | 
			
		||||
	clust_size     = 3,
 | 
			
		||||
	height_min     = -150,
 | 
			
		||||
	height_max     = -50,
 | 
			
		||||
	noise_threshhold = 0.5,
 | 
			
		||||
	noise_params = {offset=0, scale=15, spread={x=150, y=150, z=150}, seed=23, octaves=3, persist=0.70}
 | 
			
		||||
})
 | 
			
		||||
minetest.register_ore({
 | 
			
		||||
	ore_type       = "sheet",
 | 
			
		||||
	ore            = "technic:granite",
 | 
			
		||||
	wherein        = "default:stone",
 | 
			
		||||
	clust_scarcity = 1,
 | 
			
		||||
	clust_num_ores = 1,
 | 
			
		||||
	clust_size     = 4,
 | 
			
		||||
	height_min     = -100,
 | 
			
		||||
	height_max     = -250,
 | 
			
		||||
	noise_threshhold = 0.5,
 | 
			
		||||
	noise_params = {offset=0, scale=15, spread={x=130, y=130, z=130}, seed=24, octaves=3, persist=0.70}
 | 
			
		||||
})
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user