diff --git a/mods/goodies/init.lua b/mods/goodies/init.lua index d5a3f86..519bfe0 100644 --- a/mods/goodies/init.lua +++ b/mods/goodies/init.lua @@ -9,6 +9,7 @@ goodies.max_stack_default = 6 goodies.max_items = 20 goodies.types = {} +goodies.types_valuable = {} -- custom types goodies.types["FURNACE_SRC"] = { ["default:lump_iron"] = 3, @@ -27,20 +28,24 @@ goodies.types["FURNACE_DST"] = { -- chunk types for villages if minetest.get_modpath("village") ~= nil then goodies.types["forge"] = { - ["default:ingot_steel"] = 10, - ["default:ingot_carbon_steel"] = 12, ["default:lump_coal"] = 4, ["default:lump_iron"] = 6, ["default:pick_stone"] = 9, ["default:tree_oak"] = 2, } + goodies.types_valuable["forge"] = { + ["default:ingot_steel"] = 10, + ["default:ingot_carbon_steel"] = 12, + } goodies.types["tavern"] = { ["bed:bed"] = { chance = 8, max_stack = 1}, ["default:bucket"] = 20, ["mobs:meat"] = 5, - ["mobs:pork"] = 9, ["default:ladder"] = 9, } + goodies.types_valuable["tavern"] = { + ["mobs:pork"] = 9, + } goodies.types["house"] = { ["default:stick"] = 2, ["farming:bread"] = 6, @@ -54,22 +59,39 @@ if minetest.get_modpath("village") ~= nil then -- jewels and gold if minetest.get_modpath("jewels") ~= nil then - goodies.types["house"]["jewels:bench"] = { chance = 24, max_stack = 1} -- jeweling benches - goodies.types["house"]["jewels:jewel"] = 34 - goodies.types["tavern"]["jewels:jewel"] = 32 - goodies.types["forge"]["jewels:jewel"] = 30 + goodies.types_valuable["house"] = { + ["jewels:bench"] = { chance = 24, max_stack = 1}, + ["jewels:jewel"] = 34, + } + goodies.types_valuable["tavern"] = { ["jewels:jewel"] = 32 } + goodies.types_valuable["forge"] = { ["jewels:jewel"] = 30 } end if minetest.get_modpath("gold") ~= nil then - goodies.types["house"]["gold:ingot_gold"] = 12 - goodies.types["tavern"]["gold:ingot_gold"] = 10 - goodies.types["forge"]["gold:ingot_gold"] = 8 + goodies.types_valuable["house"] = { ["gold:ingot_gold"] = 12 } + goodies.types_valuable["tavern"] = { ["gold:ingot_gold"] = 10 } + goodies.types_valuable["forge"] = { ["gold:ingot_gold"] = 8 } end end +goodies.types_all = {} + +for k,v in pairs(goodies.types) do + goodies.types_all[k] = table.copy(v) +end +for k,v in pairs(goodies.types_valuable) do + if not goodies.types_all[k] then + goodies.types_all[k] = table.copy(v) + else + for q,r in pairs(v) do + goodies.types_all[k][q] = r + end + end +end + function goodies.fill(pos, ctype, pr, listname, keepchance) -- fill an inventory with a specified type's goodies - if goodies.types[ctype] == nil then return end + if goodies.types_all[ctype] == nil then return end if pr:next(1, keepchance) ~= 1 then minetest.remove_node(pos) @@ -83,11 +105,24 @@ function goodies.fill(pos, ctype, pr, listname, keepchance) if size < 1 then return end + local is_locked = false + local node = minetest.get_node(pos) + if minetest.get_item_group(node.name, "locked") > 0 then + is_locked = true + end + local item_amt = pr:next(1, size) + local types + if is_locked then + types = goodies.types_all + else + types = goodies.types + end + for i = 1, item_amt do - local item = util.choice(goodies.types[ctype], pr) - local goodie = goodies.types[ctype][item] + local item = util.choice(types[ctype], pr) + local goodie = types[ctype][item] local chance, max_stack if type(goodie) == "table" then chance = goodie.chance diff --git a/mods/util/init.lua b/mods/util/init.lua index ab8f6ab..25d6f01 100644 --- a/mods/util/init.lua +++ b/mods/util/init.lua @@ -119,25 +119,14 @@ function util.reconstruct(pos1, pos2, nomanip) manip:read_from_map(pos1, pos2) end - -- fix chests - local nodes = minetest.find_nodes_in_area(pos1, pos2, "default:chest") - local node = minetest.registered_nodes["default:chest"] - for _, pos in ipairs(nodes) do - node.on_construct(pos) - end - - -- fix music players - nodes = minetest.find_nodes_in_area(pos1, pos2, "music:player") - node = minetest.registered_nodes["music:player"] - for _, pos in ipairs(nodes) do - node.on_construct(pos) - end - - -- fix furnaces - nodes = minetest.find_nodes_in_area(pos1, pos2, "default:furnace") - node = minetest.registered_nodes["default:furnace"] - for _, pos in ipairs(nodes) do - node.on_construct(pos) + -- Fix chests, locked chests, music players, furnaces + local nodetypes = { "default:chest", "locks:chest", "music:player", "default:furnace" } + for n=1, #nodetypes do + local nodes = minetest.find_nodes_in_area(pos1, pos2, nodetypes[n]) + local node = minetest.registered_nodes[nodetypes[n]] + for _, pos in ipairs(nodes) do + node.on_construct(pos) + end end end diff --git a/mods/village/depends.txt b/mods/village/depends.txt index 695054a..0a99303 100644 --- a/mods/village/depends.txt +++ b/mods/village/depends.txt @@ -3,3 +3,4 @@ util mobs goodies nav +locks? diff --git a/mods/village/generate.lua b/mods/village/generate.lua index 791c9f3..6bea2bb 100644 --- a/mods/village/generate.lua +++ b/mods/village/generate.lua @@ -10,6 +10,7 @@ village.villages = {} local village_file = minetest.get_worldpath() .. "/villages.dat" local modpath = minetest.get_modpath("village") +local mod_locks = minetest.get_modpath("locks") ~= nil local mapseed = minetest.get_mapgen_setting("seed") local water_level = tonumber(minetest.get_mapgen_setting("water_level")) @@ -365,15 +366,31 @@ function village.spawn_chunk(pos, orient, replace, pr, chunktype, nofill, dont_c true ) - util.reconstruct(pos, {x = pos.x+12, y = pos.y+12, z = pos.z+12}) util.fixlight(pos, {x = pos.x+12, y = pos.y+12, z = pos.z+12}) + -- Replace some chests with locked chests + if mod_locks then + util.nodefunc( + pos, + {x = pos.x+12, y = pos.y+12, z = pos.z+12}, + "default:chest", + function(pos) + if math.random(1,4) == 1 then + local node = minetest.get_node(pos) + node.name = "locks:chest" + minetest.swap_node(pos, node) + end + end, true) + end + + util.reconstruct(pos, {x = pos.x+12, y = pos.y+12, z = pos.z+12}) + util.nodefunc( pos, {x = pos.x+12, y = pos.y+12, z = pos.z+12}, - "default:chest", + {"default:chest", "locks:chest"}, function(pos) - goodies.fill(pos, chunktype, pr, "main", 3) + goodies.fill(pos, chunktype, pr, "main", 3) end, true) -- Restrict number of music players