local MINE_DEEP_MIN = tonumber(minetest.setting_get("mines_deep_min")) local MINE_DEEP_MAX = tonumber(minetest.setting_get("mines_deep_max")) local MINE_FACTOR = tonumber(minetest.setting_get("mines_spawnfactor")) if not MINE_DEEP_MIN then MINE_DEEP_MIN = -64 end if not MINE_DEEP_MAX then MINE_DEEP_MAX = -13800 end if not MINE_FACTOR then MINE_FACTOR = 1.5 end minetest.register_node("tsm_mines:dummy", { description = "tsm_mines dummy node", _doc_items_create_entry = false, inventory_image = "unknown_node.png", wield_image = "unknown_node.png", drawtype = "airlike", paramtype = "light", sunlight_propagates = true, walkable = false, pointable = false, diggable = false, buildable_to = true, air_equivalent = true, drop = "", groups = {not_in_creative_inventory=1}, }) local ids = { air = minetest.get_content_id("air"), fence = minetest.get_content_id("default:fence_wood"), wood = minetest.get_content_id("default:wood"), dummy = minetest.get_content_id("tsm_mines:dummy") } local chest_stuff if(minetest.get_modpath("farming")~=nil) then chest_stuff = { {name="default:apple", max = 3}, {name="farming:bread", max = 3}, {name="default:steel_ingot", max = 2}, {name="default:gold_ingot", max = 2}, {name="default:diamond", max = 1}, {name="default:pick_steel", max = 1}, {name="default:pick_diamond", max = 1} } else chest_stuff = { {name="default:apple", max = 3}, {name="default:steel_ingot", max = 2}, {name="default:gold_ingot", max = 2}, {name="default:diamond", max = 1}, {name="default:pick_steel", max = 1}, {name="default:pick_diamond", max = 1} } end local function rotate_torch(pos) minetest.after(8, function() local n = minetest.get_node(pos) if n ~= nil then if n.name == "tsm_mines:dummy" then minetest.set_node(pos, {name="default:torch",param2=1}) end end end) end local function fill_chest(pos) minetest.after(5, function() local n = minetest.get_node(pos) if n ~= nil then if n.name == "tsm_mines:dummy" then minetest.set_node(pos, {name="default:chest"}) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() inv:set_size("main", 8*4) local stacks = {} if(minetest.get_modpath("treasurer") ~= nil) then stacks = treasurer.select_random_treasures(3,4,6,{"minetool", "nourriture", "building_block", "precieux"}) else for i=0,2,1 do local stuff = chest_stuff[math.random(1,#chest_stuff)] table.insert(stacks,{name=stuff.name, count = math.random(1,stuff.max)}) end end for s=1, #stacks do if not inv:contains_item("main", stacks[s]) then inv:set_stack("main", math.random(1,32), stacks[s]) end end end end end) end local function check_dir(dir,old_dir) if old_dir == 1 and dir == 3 then return true elseif old_dir == 3 and dir == 1 then return true elseif old_dir == 2 and dir == 4 then return true elseif old_dir == 4 and dir == 2 then return true end return false end local function make_mine(mpos,p2,p3, vm_data, vx_area,cnt) local pos = {x=mpos.x,y=mpos.y,z=mpos.z} for j=0,12,1 do local switch = cnt+1 local n_switch = math.random(1,4) while check_dir(n_switch,switch) == true do n_switch = math.random(1,4) end switch = n_switch for i=0,20,1 do local pillar = ids.air local pillar_top = ids.air if i==0 or i == 5 or i == 10 or i == 15 or i == 20 then pillar = ids.fence pillar_top = ids.wood end local x1, x2, x3, x4, x5 local z1, z2, z3, z4, z5 if switch == 1 then x1 = pos.x+1 x2 = pos.x x3 = pos.x-1 x4 = pos.x x5 = pos.x+1 z1 = pos.z+i z2 = pos.z+i z3 = pos.z+i z4 = pos.z+i-1 z5 = pos.z+i elseif switch == 2 then x1 = pos.x+i x2 = pos.x+i x3 = pos.x+i x4 = pos.x+i-1 x5 = pos.x+i z1 = pos.z+1 z2 = pos.z z3 = pos.z-1 z4 = pos.z z5 = pos.z+1 elseif switch == 3 then x1 = pos.x+1 x2 = pos.x x3 = pos.x-1 x4 = pos.x x5 = pos.x+1 z1 = pos.z-i z2 = pos.z-i z3 = pos.z-i z4 = pos.z-i-1 z5 = pos.z-i else x1 = pos.x-i x2 = pos.x-i x3 = pos.x-i x4 = pos.x-i-1 x5 = pos.x-i z1 = pos.z+1 z2 = pos.z z3 = pos.z-1 z4 = pos.z z5 = pos.z+1 end vm_data[vx_area:indexp({x=x1, y=pos.y-1, z=z1})] = pillar vm_data[vx_area:indexp({x=x2, y=pos.y-1, z=z2})] = ids.air vm_data[vx_area:indexp({x=x3, y=pos.y-1, z=z3})] = pillar vm_data[vx_area:indexp({x=x1, y=pos.y, z=z1})] = pillar vm_data[vx_area:indexp({x=x2, y=pos.y, z=z2})] = ids.air vm_data[vx_area:indexp({x=x3, y=pos.y, z=z3})] = pillar vm_data[vx_area:indexp({x=x1, y=pos.y+1, z=z1})] = pillar_top vm_data[vx_area:indexp({x=x2, y=pos.y+1, z=z2})] = pillar_top vm_data[vx_area:indexp({x=x3, y=pos.y+1, z=z3})] = pillar_top if math.random(0,6) == 3 then vm_data[vx_area:indexp({x=x4, y=pos.y-1, z=z4})] = ids.dummy rotate_torch({x=x4, y=pos.y-1, z=z4}) end if math.random(0,60) == 13 then local p = {x=x5, y=pos.y-1, z=z5} if vm_data[vx_area:indexp(p)] ~= ids.fence then vm_data[vx_area:indexp(p)] = ids.dummy fill_chest(p) end end end if switch == 1 then pos.z = pos.z+20 elseif switch == 2 then pos.x = pos.x+20 elseif switch == 3 then pos.z = pos.z-20 elseif switch == 4 then pos.x = pos.x-20 end end if cnt == 0 then minetest.log("action", "Created mine at ("..mpos.x..","..mpos.y..","..mpos.z..")") local out2 = make_mine(p2,p3,mpos,vm_data,vx_area,1) local out3 = make_mine(p3,p2,mpos,out2,vx_area,2) return out3 else return vm_data end end local function find_cave(min,max,vm_data, vx_area) local out = nil for i in vx_area:iterp(min, max) do if vm_data[i] == ids.air then local p = vx_area:position(i) if p.y <= MINE_DEEP_MIN then out = p end end end return out end local cnt = 0 minetest.register_on_generated(function(minp, maxp, seed) if minp.y > MINE_DEEP_MIN or minp.y < MINE_DEEP_MAX then return end cnt = cnt+1 if cnt < 8/MINE_FACTOR then return end cnt = 0 local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") local data = vm:get_data() local va = VoxelArea:new{ MinEdge = emin, MaxEdge = emax } local mpos = find_cave(emin,emax,data,va) if mpos == nil then return end local mpos2 = {x=mpos.x+math.random(0,3),y=mpos.y-1,z=mpos.z} local mpos3 = {x=mpos.x,y=mpos.y-2,z=mpos.z+math.random(0,3)} data = make_mine(mpos,mpos2,mpos3, data, va, 0) vm:set_data(data) vm:calc_lighting(emin,emax) vm:update_liquids() vm:write_to_map() end) minetest.log("action", "[tsm_mines] loaded.")