Make a block randomly spawn

User avatar
fantity
New member
 
Posts: 6
Joined: Sun Jun 03, 2012 15:08

Make a block randomly spawn

by fantity » Sun Jun 03, 2012 15:10

I have made a custom ore and texture, but I am wondering how I make that block randomly spawn when a map is made.
 

User avatar
Calinou
Member
 
Posts: 3124
Joined: Mon Aug 01, 2011 14:26
GitHub: Calinou
IRC: Calinou
In-game: Calinou

by Calinou » Sun Jun 03, 2012 15:32

See my More Ores mod... you could copy some code from it. :)
 

User avatar
fantity
New member
 
Posts: 6
Joined: Sun Jun 03, 2012 15:08

by fantity » Sun Jun 03, 2012 15:50

Link?
 

User avatar
LolManKuba
Member
 
Posts: 939
Joined: Fri Feb 10, 2012 22:36

by LolManKuba » Sun Jun 03, 2012 17:10

I know your asking Calinou, but I have the link: http://minetest.net/forum/viewtopic.php?id=549&p=4
 

User avatar
fantity
New member
 
Posts: 6
Joined: Sun Jun 03, 2012 15:08

by fantity » Sun Jun 03, 2012 17:41

LolManKuba wrote:I know your asking Calinou, but I have the link: http://minetest.net/forum/viewtopic.php?id=549&p=4


So I use this code?

Your phone or window isn't wide enough to display the code box. If it's a phone, try rotating it to landscape mode.
Code: Select all
minetest.register_on_generated(function(minp, maxp, seed)
    local copper_perlin = minetest.env:get_perlin(471, 3, 0.6, 200)
    generate_ore_perlin("moreores:mineral_copper", "default:stone", minp, maxp, seed+16,   1/8/8/8,    6, -31000,  64, copper_perlin, 0.2)
   
    local tin_perlin = minetest.env:get_perlin(472, 3, 0.6, 200)
    generate_ore_perlin("moreores:mineral_tin", "default:stone", minp, maxp, seed+17,   1/10/10/10,    5, -31000,  64, tin_perlin, 0.3)

end)
 

User avatar
LolManKuba
Member
 
Posts: 939
Joined: Fri Feb 10, 2012 22:36

by LolManKuba » Sun Jun 03, 2012 18:23

I dont know, I cannot lua. Ask Calinou
 

User avatar
fantity
New member
 
Posts: 6
Joined: Sun Jun 03, 2012 15:08

by fantity » Sun Jun 03, 2012 18:37

Bump. Can someone tell me what to do?
 

User avatar
Calinou
Member
 
Posts: 3124
Joined: Mon Aug 01, 2011 14:26
GitHub: Calinou
IRC: Calinou
In-game: Calinou

by Calinou » Sun Jun 03, 2012 20:16

No, you also have to copy the local ore generation function. Example:

Your phone or window isn't wide enough to display the code box. If it's a phone, try rotating it to landscape mode.
Code: Select all
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
        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("MOD_NAME:NODE_NAME", "default:stone", minp, maxp, seed+16,   1/X_SIZE/Y_SIZE/Z_SIZE,    ORE_PER_X_Y_Z_CHUNK, MAX_DEPTH,  MIN_DEPTH)
end)

MOD_NAME: your mod's name.
NODE_NAME: the node (block)'s name to generate, inside stone.
X_SIZE/Y_SIZE/Z_SIZE: defines the size of the ore veins.
ORE_PER_X_Y_Z_CHUNK: defines the chance per chunk (see X_SIZE/Y_SIZE/Z_SIZE).
MAX_DEPTH: maximal depth (no limit: -31000, 0 is sea level)
MIN_DEPTH: minimal depth (no limit: 31000, 0 is sea level)
Last edited by Calinou on Sun Jun 03, 2012 20:17, edited 1 time in total.
 

User avatar
fantity
New member
 
Posts: 6
Joined: Sun Jun 03, 2012 15:08

by fantity » Sun Jun 03, 2012 20:38

Calinou wrote:No, you also have to copy the local ore generation function. Example:

Your phone or window isn't wide enough to display the code box. If it's a phone, try rotating it to landscape mode.
Code: Select all
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
        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("MOD_NAME:NODE_NAME", "default:stone", minp, maxp, seed+16,   1/X_SIZE/Y_SIZE/Z_SIZE,    ORE_PER_X_Y_Z_CHUNK, MAX_DEPTH,  MIN_DEPTH)
end)

MOD_NAME: your mod's name.
NODE_NAME: the node (block)'s name to generate, inside stone.
X_SIZE/Y_SIZE/Z_SIZE: defines the size of the ore veins.
ORE_PER_X_Y_Z_CHUNK: defines the chance per chunk (see X_SIZE/Y_SIZE/Z_SIZE).
MAX_DEPTH: maximal depth (no limit: -31000, 0 is sea level)
MIN_DEPTH: minimal depth (no limit: 31000, 0 is sea level)


I still don't get what I do with this code
 

User avatar
fantity
New member
 
Posts: 6
Joined: Sun Jun 03, 2012 15:08

by fantity » Mon Jun 04, 2012 18:28

Bump.
 


Return to Minetest General

Who is online

Users browsing this forum: No registered users and 90 guests

cron