nodecore-cd2025/mods/nc_api/mapgen_shared.lua
Aaron Suen 4006f17aa8 Proof-of-concept dungeon loot.
- Identify candidate spots to place loot.
- Store loot placement spots for later handling.
  This will involve manipulating metadata and other
  things that are not necessarily safe to do while
  other mapgen_shared may run after us.
- Process the loot queue on tick.

Things left to do:
- Define loot tables and rarity values.
- Identify storeboxes and other storage mechanisms.
- Generate random stacks.
2020-06-28 21:06:00 -04:00

60 lines
1.6 KiB
Lua

-- LUALOCALS < ---------------------------------------------------------
local VoxelArea, ipairs, math, minetest, nodecore, table
= VoxelArea, ipairs, math, minetest, nodecore, table
local math_floor, table_insert
= math.floor, table.insert
-- LUALOCALS > ---------------------------------------------------------
local mapgens = {}
nodecore.registered_mapgen_shared = mapgens
local singlenode = minetest.get_mapgen_setting("mg_name") == "singlenode"
local counters = {}
function nodecore.register_mapgen_shared(def)
local label = def.label
if not label then
label = minetest.get_current_modname()
local i = (counters[label] or 0) + 1
counters[label] = i
label = label .. ":" .. i
end
local prio = def.priority or 0
def.priority = prio
local min = 1
local max = #mapgens + 1
while max > min do
local try = math_floor((min + max) / 2)
local oldp = mapgens[try].priority
if (prio < oldp) or (prio == oldp and label > mapgens[try].label) then
min = try + 1
else
max = try
end
end
table_insert(mapgens, min, def)
end
local mapperlin
minetest.after(0, function() mapperlin = minetest.get_perlin(0, 1, 0, 1) end)
nodecore.register_on_generated("mapgen shared", function(minp, maxp)
local vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
local data = vm:get_data()
local area = VoxelArea:new({MinEdge = emin, MaxEdge = emax})
local rng = nodecore.seeded_rng(mapperlin:get_3d(minp))
for _, def in ipairs(mapgens) do
local en = def.enabled
if en == nil then en = not singlenode end
if en then
def.func(minp, maxp, area, data, vm, emin, emax, rng)
end
end
vm:set_data(data)
vm:write_to_map()
end)