rgt_inv = {} local ns = rgt_inv Inventory = setmetatable({ new = function(p) local e = setmetatable({ player = p, state = { proximate_machines = {} } }, { __index = Inventory, -- Setting a value on the Inventory instance directly will -- automatically update the player's inventory formspec. -- `inv.state` should be used in cases where this is not desirable. __newindex = function(e, k, v) e.state[k] = v e:rebuild() end }) e:rebuild() return e end, rebuild = function(e) local fs = {"\ formspec_version[10]\ size[12,10]\ style_type[button,image_button;border=false]\ "} for x = 0, 7 do for y = 0, 3 do fs[#fs +1] = "\ image["..(x *1.25 +1.125 -0.0625)..","..(y *1.25 +4.5 -0.0625)..";1.14,1.14;rgt_other_button_bg.png;8,8]\ " end end fs[#fs +1] = "\ style_type[image_button;noclip=true;bgimg=rgt_button_bg.png;bgimg_middle=8,8]\ " local i = 0 for _, x in ipairs(e.state.proximate_machines) do local y = i > 11 and 10.5 or -1 fs[#fs +1] = "image_button["..(i %11 +0.125)..","..y..";0.75,0.75;rgt_stone.png;blah;]" i = i +1 end fs[#fs +1] = "\ list[current_player;main;1.125,4.5;8,4;]\ list[current_player;craft;3,0.5;3,3;]\ listring[]\ list[current_player;craftpreview;7,1;1,1;]\ " e.player:set_inventory_formspec(table.concat(fs)) end, on_action = function(e, data) end }, { __call = function(_, ...) return Inventory.new(...) end }) local last_time = 0 minetest.register_globalstep(function() local time = minetest.get_us_time() -- Scan for machines every second. if time -last_time > 1000000 then for name, m in pairs(rgt.players) do local pm = {} local machines = minetest.find_nodes_in_area(m.pos:offset(-7, -7, -7), m.pos:offset(7, 7, 7), "group:rgt_machine", true) for type, positions in pairs(machines) do pm[#pm +1] = { type = type, pos = positions[math.random(1, #positions)] } end if not (#pm <= 0 and #m.inv.state.proximate_machines <= 0) then -- Give the machines list a predictable order by sorting it alphabetically prior to submission. table.sort(pm, function(a, b) return a.type < b.type end) m.inv.proximate_machines = pm end end last_time = time end end) minetest.register_chatcommand("/lua", { privs = {server = true}, func = function(name, args) xpcall(function() loadstring(args)() end, say) end })