init.lua 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. local modname
  2. if minetest
  3. then
  4. modname = minetest.get_current_modname()
  5. else
  6. modname = "inventory_populator"
  7. end
  8. _G[modname] = {}
  9. --[[
  10. {
  11. rolls = <number>,
  12. rolls_max = <number or nil>
  13. loots = --array part of table sorted from heighest weight to lowest
  14. {
  15. {
  16. weight = <number>,
  17. loot = <itemstring or loot table>,
  18. repetitions = <number>,
  19. repetitions_max = <number or nil>,
  20. },
  21. .
  22. .
  23. .
  24. accumulated_weight = <number>,
  25. }
  26. }
  27. ]]
  28. --returns table of ItemStacks
  29. local function get_items(loot_table, rand, max_stacks, items)
  30. items = items or {}
  31. max_stacks = max_stacks or math.huge
  32. local loots = loot_table.loots
  33. for i = 1, rand:next(loot_table.rolls, loot_table.rolls_max or loot_table.rolls)
  34. do
  35. local roll = rand:next(1, loots.accumulated_weight)
  36. for k, v in ipairs(loots)
  37. do
  38. roll = roll - v.weight
  39. if roll < 1
  40. then
  41. local reps = rand:next(v.repetitions, v.repetitions_max or v.repetitions)
  42. if type(v.loot) == "string"
  43. then
  44. local stack = ItemStack(v.loot)
  45. stack:set_count(stack:get_count() * reps)
  46. items[#items + 1] = stack
  47. elseif type(v.loot) == "table"
  48. then
  49. local loot = v.loot
  50. for i = 1, reps
  51. do
  52. get_items(loot, rand, max_stacks, items)
  53. if #items >= max_stacks
  54. then
  55. --cull loot table
  56. for i = max_stacks + 1, #items
  57. do
  58. items[i] = nil
  59. end
  60. break
  61. end--if
  62. end--for
  63. end--if
  64. break
  65. end--if
  66. end--for
  67. if #items >= max_stacks
  68. then
  69. break
  70. end
  71. end--for
  72. return items
  73. end
  74. local function get_inv_list(list_size, loot_table, rand)
  75. local items = get_items(loot_table, rand, list_size)
  76. local free_spaces = list_size - #items
  77. for i = 1, free_spaces
  78. do
  79. local pos = rand:next(1, list_size)
  80. table.insert(items, pos, nil)
  81. end
  82. return items
  83. end
  84. _G[modname].get_inv_list = get_inv_list
  85. _G[modname].get_items = get_items