functions.lua 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. function asrs.create_id(player_name, pos)
  2. local i = 1
  3. local system_id = player_name..'_'..i
  4. while asrs.data[system_id] do
  5. i = i + 1
  6. system_id = player_name..'_'..i
  7. end
  8. local new_data = {}
  9. new_data.inv_pos = pos
  10. new_data.max_inv = 0
  11. new_data.name = player_name
  12. new_data.nodes = 0
  13. asrs.data[system_id] = new_data
  14. return system_id
  15. end
  16. function asrs.update_inventory(pos)
  17. local meta = core.get_meta(pos)
  18. local sys_id = meta:get_string('system_id')
  19. local sys_data = asrs.data[sys_id]
  20. if sys_data then
  21. local sys_inv_max = sys_data.max_inv
  22. local inv = meta:get_inventory()
  23. inv:set_size('storage', sys_inv_max)
  24. end
  25. end
  26. function asrs.count_inventory(pos)
  27. local meta = core.get_meta(pos)
  28. local inv = meta:get_inventory()
  29. local inv_list = inv:get_list('storage')
  30. local count = 0
  31. local size = inv:get_size('storage')
  32. for i = 1, size do
  33. local stack = inv_list[i]
  34. local empty = stack:is_empty()
  35. if not empty then
  36. count = count + 1
  37. end
  38. end
  39. return count
  40. end
  41. function asrs.sort_inventory(pos) -- Mostly copied from the Technic_chests mod.
  42. local meta = core.get_meta(pos)
  43. local inv = meta:get_inventory()
  44. local inv_list = inv:get_list('storage')
  45. local unique_items = {}
  46. if inv_list then
  47. local items = {}
  48. for _,stack in pairs(inv_list) do
  49. if not stack:is_empty() then
  50. local name = stack:get_name()
  51. local wear = stack:get_wear()
  52. local meta = stack:get_meta():get_string('')
  53. local count = stack:get_count()
  54. local def = core.registered_items[name]
  55. local key = string.format("%s %05d %s", name, wear, meta)
  56. if not items[key] then
  57. items[key] = {
  58. stacks = {stack},
  59. wear = wear,
  60. count = count,
  61. key = key,
  62. }
  63. else
  64. items[key].count = items[key].count + count
  65. table.insert(items[key].stacks, stack)
  66. end
  67. end
  68. end
  69. for k,v in pairs(items) do
  70. table.insert(unique_items, v)
  71. end
  72. local function padnum(value)
  73. local dec, n = string.match(value, "(%.?)0*(.+)")
  74. return #dec > 0 and ("%.12f"):format(value) or ("%s%03d%s"):format(dec, #n, n)
  75. end
  76. table.sort(unique_items, function(a, b)
  77. local sort_a = ("%s%3d"):format(tostring(a.key):gsub("%.?%d+", padnum), #b.key)
  78. local sort_b = ("%s%3d"):format(tostring(b.key):gsub("%.?%d+", padnum), #a.key)
  79. return sort_a < sort_b
  80. end)
  81. else
  82. -- Item
  83. table.sort(unique_items, function(a, b)
  84. return a.key < b.key
  85. end)
  86. end
  87. inv:set_list('storage', {})
  88. for _,item in ipairs(unique_items) do
  89. for _,stack in ipairs(item.stacks) do
  90. inv:add_item('storage', stack)
  91. end
  92. end
  93. end
  94. function asrs.connected_nodes(pos, node_name)
  95. local positions = {
  96. {x=pos.x+1, y=pos.y, z=pos.z},
  97. {x=pos.x-1, y=pos.y, z=pos.z},
  98. {x=pos.x, y=pos.y+1, z=pos.z},
  99. {x=pos.x, y=pos.y-1, z=pos.z},
  100. {x=pos.x, y=pos.y, z=pos.z+1},
  101. {x=pos.x, y=pos.y, z=pos.z-1},
  102. }
  103. local found_node = false
  104. local other_pos
  105. for _, loc in ipairs(positions) do
  106. local name = core.get_node(loc).name
  107. if string.find(node_name, name) then
  108. other_pos = loc
  109. found_node = true
  110. break
  111. end
  112. end
  113. return found_node, other_pos
  114. end
  115. fdir_table = {
  116. { 1, 0 },
  117. { 0, -1 },
  118. { -1, 0 },
  119. { 0, 1 },
  120. { 1, 0 },
  121. { 0, -1 },
  122. { -1, 0 },
  123. { 0, 1 },
  124. }
  125. function asrs.space_to_place(pos)
  126. local node = core.get_node(pos)
  127. local fdir = node.param2 % 32
  128. local pos2 = {x = pos.x + fdir_table[fdir+1][1], y=pos.y, z = pos.z + fdir_table[fdir+1][2]}
  129. local pos3 = {x = pos2.x, y = pos2.y+1, z = pos2.z}
  130. local pos4 = {x = pos.x, y = pos.y+1, z = pos.z}
  131. local node2 = core.get_node(pos2) -- Node to the right
  132. local node3 = core.get_node(pos3) -- Node above to the right
  133. local node4 = core.get_node(pos4) -- Node above
  134. local node2def = core.registered_nodes[node2.name] or nil
  135. local node3def = core.registered_nodes[node3.name] or nil
  136. local node4def = core.registered_nodes[node4.name] or nil
  137. if not node2def.buildable_to or not node3def.buildable_to or not node4def.buildable_to then
  138. return false
  139. else
  140. core.after(1, function()
  141. core.set_node(pos2,{name = 'asrs:blank'})
  142. core.set_node(pos3,{name = 'asrs:blank'})
  143. core.set_node(pos4,{name = 'asrs:connection_point'})
  144. end)
  145. return true
  146. end
  147. end
  148. function asrs.remove_side_node(pos, oldnode)
  149. local fdir = oldnode.param2 % 32
  150. local pos2 = {x = pos.x + fdir_table[fdir+1][1], y=pos.y, z = pos.z + fdir_table[fdir+1][2]}
  151. local pos3 = {x = pos2.x, y = pos2.y+1, z = pos2.z}
  152. local pos4 = {x = pos.x, y = pos.y+1, z = pos.z}
  153. core.remove_node(pos2)
  154. core.remove_node(pos3)
  155. core.remove_node(pos4)
  156. end
  157. function asrs.load()
  158. local file = io.open(core.get_worldpath() .. '/asrs_systems', 'r')
  159. if file then
  160. asrs.data = core.deserialize(file:read('*a'))
  161. file:close()
  162. else
  163. asrs.data = {}
  164. end
  165. end
  166. function asrs.save()
  167. local file = io.open(core.get_worldpath() .. '/asrs_systems', 'w')
  168. file:write(core.serialize(asrs.data))
  169. file:close()
  170. end