···11-{"events":[],"handlers":[{"code":"unit.hide()\n\n--[[\n\tsplit a string on a delimiter\n\tBy jericho\n]]\nfunction strSplit(s, delimiter)\n result = {};\n for match in (s..delimiter):gmatch(\"(.-)\"..delimiter) do\n table.insert(result, match);\n end\n return result;\nend\n\n--[[\n\tcheck if a table contains an element\n\tBy Jericho\n]]\nfunction hasValue(tab, val)\n for _,v in ipairs(tab) do\n if v == val then\n return true\n end\n end\n return false\nend\n\n\n\nfunction removeQualityInName(name)\n if not name then return '' end\n return name:lower():gsub('basic ', ''):gsub('uncommon ', ''):gsub('advanced ', ''):gsub('rare ', ''):gsub('exotic ', '')\nend\n\ndatabank = nil\nindustries = {}\nfor slot_name, slot in pairs(unit) do\n if\n type(slot) == \"table\"\n and type(slot.export) == \"table\"\n and slot.getElementClass\n then\n slot_type = slot.getElementClass():lower()\n if slot_type == 'databankunit' then\n databank = slot\n end\n if (slot_type:find(\"industry\")) then\n table.insert(industries, slot)\n end\n end\nend\nif databank ~= nil then\n for _,slot in pairs(industries) do\n local slot_id = slot.getId()\n if databank.hasKey(tostring(slot_id)) == 1 then\n local command = databank.getStringValue(slot_id)\n if command ~= nil and command ~= \"\" then\n if command:lower() == \"start\" then\n slot.start()\n elseif command:lower():find(\"maintain\") then\n local splitted = strSplit(command, \"_\")\n local quantity = tonumber(splitted[2])\n slot.startAndMaintain(quantity)\n elseif command:lower():find(\"batch\") then\n local splitted = strSplit(command, \"_\")\n local quantity = tonumber(splitted[2])\n slot.batchStart(quantity)\n elseif command:lower() == \"stop\" then\n slot.hardStop(0)\n elseif command:lower() == \"soft_stop\" then\n slot.softStop()\n end\n databank.setStringValue(id, \"\")\n end\n end\n end\nend\nunit.exit()","filter":{"args":[],"signature":"start()","slotKey":"-1"},"key":"0"}],"methods":[],"slots":{"0":{"name":"slot1","type":{"events":[],"methods":[]}},"1":{"name":"slot2","type":{"events":[],"methods":[]}},"2":{"name":"slot3","type":{"events":[],"methods":[]}},"3":{"name":"slot4","type":{"events":[],"methods":[]}},"4":{"name":"slot5","type":{"events":[],"methods":[]}},"5":{"name":"slot6","type":{"events":[],"methods":[]}},"6":{"name":"slot7","type":{"events":[],"methods":[]}},"7":{"name":"slot8","type":{"events":[],"methods":[]}},"8":{"name":"slot9","type":{"events":[],"methods":[]}},"9":{"name":"slot10","type":{"events":[],"methods":[]}},"-3":{"name":"library","type":{"events":[],"methods":[]}},"-2":{"name":"system","type":{"events":[],"methods":[]}},"-1":{"name":"unit","type":{"events":[],"methods":[]}}}}
11+{"slots":{"0":{"name":"slot1","type":{"events":[],"methods":[]}},"1":{"name":"slot2","type":{"events":[],"methods":[]}},"2":{"name":"slot3","type":{"events":[],"methods":[]}},"3":{"name":"slot4","type":{"events":[],"methods":[]}},"4":{"name":"slot5","type":{"events":[],"methods":[]}},"5":{"name":"slot6","type":{"events":[],"methods":[]}},"6":{"name":"slot7","type":{"events":[],"methods":[]}},"7":{"name":"slot8","type":{"events":[],"methods":[]}},"8":{"name":"slot9","type":{"events":[],"methods":[]}},"9":{"name":"slot10","type":{"events":[],"methods":[]}},"-1":{"name":"unit","type":{"events":[],"methods":[]}},"-3":{"name":"player","type":{"events":[],"methods":[]}},"-2":{"name":"construct","type":{"events":[],"methods":[]}},"-4":{"name":"system","type":{"events":[],"methods":[]}},"-5":{"name":"library","type":{"events":[],"methods":[]}}},"handlers":[{"code":"unit.hideWidget()\ndatabank = nil\nindustries = {}\nfor slot_name, slot in pairs(unit) do\n if\n type(slot) == \"table\"\n and type(slot.export) == \"table\"\n and slot.getClass\n then\n slot_type = slot.getClass():lower()\n if slot_type == 'databankunit' then\n databank = slot\n end\n\n if (slot_type:find(\"assembly line\")) or\n (slot_type:find(\"glass furnace\")) or\n (slot_type:find(\"3d printer\")) or\n (slot_type:find(\"smelter\")) or\n (slot_type:find(\"recycler\")) or\n (slot_type:find(\"refinery\")) or\n (slot_type:find(\"refiner\")) or\n (slot_type:find(\"industry\")) or\n (slot_type == \"transfer unit\")\n then\n table.insert(industries, slot)\n end\n end\nend\nif databank ~= nil then\n for _,slot in pairs(industries) do\n local slot_id = slot.getLocalId()\n if databank.hasKey(tostring(slot_id)) == 1 then\n local command = databank.getStringValue(slot_id)\n system.print(slot_id .. \" - \" .. command)\n if command ~= nil and command ~= \"\" then\n if command:lower() == \"start\" then\n slot.start()\n elseif command:lower():find(\"maintain\") then\n local splitted = strSplit(command, \"_\")\n local quantity = tonumber(splitted[2])\n slot.startAndMaintain(quantity)\n elseif command:lower():find(\"batch\") then\n local splitted = strSplit(command, \"_\")\n local quantity = tonumber(splitted[2])\n slot.batchStart(quantity)\n elseif command:lower() == \"stop\" then\n slot.hardStop(0)\n elseif command:lower() == \"soft_stop\" then\n slot.softStop()\n end\n databank.setStringValue(id, \"\")\n end\n end\n end\nend\nunit.exit()","filter":{"args":[],"signature":"start()","slotKey":"-1"},"key":"0"},{"code":"--[[\n\tsplit a string on a delimiter\n\tBy jericho\n]]\nfunction strSplit(s, delimiter)\n result = {};\n for match in (s..delimiter):gmatch(\"(.-)\"..delimiter) do\n table.insert(result, match);\n end\n return result;\nend\n\n--[[\n\tcheck if a table contains an element\n\tBy Jericho\n]]\nfunction hasValue(tab, val)\n for _,v in ipairs(tab) do\n if v == val then\n return true\n end\n end\n return false\nend\n\n\n\nfunction removeQualityInName(name)\n if not name then return '' end\n return name:lower():gsub('basic ', ''):gsub('uncommon ', ''):gsub('advanced ', ''):gsub('rare ', ''):gsub('exotic ', '')\nend","filter":{"args":[],"signature":"start()","slotKey":"-5"},"key":"1"},{"code":"--[[\n\tCustom JSON Parser and Encoder to use less CPU\n\tOriginal script from : https://gist.github.com/tylerneylon/59f4bcf316be525b30ab\n\tModified for DualUniverse by jericho\n]]\n\nMyJson = {}\n\n\n-- Internal functions.\n\nlocal function kind_of(obj)\n if type(obj) ~= 'table' then return type(obj) end\n local i = 1\n for _ in pairs(obj) do\n if obj[i] ~= nil then i = i + 1 else return 'table' end\n end\n if i == 1 then return 'table' else return 'array' end\nend\n\nlocal function escape_str(s)\n local in_char = {'\\\\', '\"', '/', '\\b', '\\f', '\\n', '\\r', '\\t'}\n local out_char = {'\\\\', '\"', '/', 'b', 'f', 'n', 'r', 't'}\n for i, c in ipairs(in_char) do\n s = s:gsub(c, '\\\\' .. out_char[i])\n end\n return s\nend\n\n-- Returns pos, did_find; there are two cases:\n-- 1. Delimiter found: pos = pos after leading space + delim; did_find = true.\n-- 2. Delimiter not found: pos = pos after leading space; did_find = false.\n-- This throws an error if err_if_missing is true and the delim is not found.\nlocal function skip_delim(str, pos, delim, err_if_missing)\n pos = pos + #str:match('^%s*', pos)\n if str:sub(pos, pos) ~= delim then\n if err_if_missing then\n error('Expected ' .. delim .. ' near position ' .. pos)\n end\n return pos, false\n end\n return pos + 1, true\nend\n\n-- Expects the given pos to be the first character after the opening quote.\n-- Returns val, pos; the returned pos is after the closing quote character.\nlocal function parse_str_val(str, pos, val)\n val = val or ''\n local early_end_error = 'End of input found while parsing string.'\n if pos > #str then error(early_end_error) end\n local c = str:sub(pos, pos)\n if c == '\"' then return val, pos + 1 end\n if c ~= '\\\\' then return parse_str_val(str, pos + 1, val .. c) end\n -- We must have a \\ character.\n local esc_map = {b = '\\b', f = '\\f', n = '\\n', r = '\\r', t = '\\t'}\n local nextc = str:sub(pos + 1, pos + 1)\n if not nextc then error(early_end_error) end\n return parse_str_val(str, pos + 2, val .. (esc_map[nextc] or nextc))\nend\n\n-- Returns val, pos; the returned pos is after the number's final character.\nlocal function parse_num_val(str, pos)\n local num_str = str:match('^-?%d+%.?%d*[eE]?[+-]?%d*', pos)\n local val = tonumber(num_str)\n if not val then error('Error parsing number at position ' .. pos .. '.') end\n return val, pos + #num_str\nend\n\n\n-- Public values and functions.\n\nfunction MyJson.stringify(obj, as_key)\n local s = {} -- We'll build the string as an array of strings to be concatenated.\n local kind = kind_of(obj) -- This is 'array' if it's an array or type(obj) otherwise.\n if kind == 'array' then\n if as_key then error('Can\\'t encode array as key.') end\n s[#s + 1] = '['\n for i, val in ipairs(obj) do\n if i > 1 then s[#s + 1] = ', ' end\n s[#s + 1] = MyJson.stringify(val)\n end\n s[#s + 1] = ']'\n elseif kind == 'table' then\n if as_key then error('Can\\'t encode table as key.') end\n s[#s + 1] = '{'\n for k, v in pairs(obj) do\n if #s > 1 then s[#s + 1] = ', ' end\n s[#s + 1] = MyJson.stringify(k, true)\n s[#s + 1] = ':'\n s[#s + 1] = MyJson.stringify(v)\n end\n s[#s + 1] = '}'\n elseif kind == 'string' then\n return '\"' .. escape_str(obj) .. '\"'\n elseif kind == 'number' then\n if as_key then return '\"' .. tostring(obj) .. '\"' end\n return tostring(obj)\n elseif kind == 'boolean' then\n return tostring(obj)\n elseif kind == 'nil' then\n return 'null'\n else\n error('Unjsonifiable type: ' .. kind .. '.')\n end\n return table.concat(s)\nend\n\nMyJson.null = {} -- This is a one-off table to represent the null value.\n\nfunction MyJson.parse(str, pos, end_delim)\n pos = pos or 1\n if pos > #str then error('Reached unexpected end of input.') end\n local pos = pos + #str:match('^%s*', pos) -- Skip whitespace.\n local first = str:sub(pos, pos)\n if first == '{' then -- Parse an object.\n local obj, key, delim_found = {}, true, true\n pos = pos + 1\n while true do\n key, pos = MyJson.parse(str, pos, '}')\n if key == nil then return obj, pos end\n if not delim_found then error('Comma missing between object items.') end\n pos = skip_delim(str, pos, ':', true) -- true -> error if missing.\n obj[key], pos = MyJson.parse(str, pos)\n pos, delim_found = skip_delim(str, pos, ',')\n end\n elseif first == '[' then -- Parse an array.\n local arr, val, delim_found = {}, true, true\n pos = pos + 1\n while true do\n val, pos = MyJson.parse(str, pos, ']')\n if val == nil then return arr, pos end\n if not delim_found then error('Comma missing between array items.') end\n arr[#arr + 1] = val\n pos, delim_found = skip_delim(str, pos, ',')\n end\n elseif first == '\"' then -- Parse a string.\n return parse_str_val(str, pos + 1)\n elseif first == '-' or first:match('%d') then -- Parse a number.\n return parse_num_val(str, pos)\n elseif first == end_delim then -- End of an object or array.\n return nil, pos + 1\n else -- Parse true, false, or null.\n local literals = {['true'] = true, ['false'] = false, ['null'] = MyJson.null}\n for lit_str, lit_val in pairs(literals) do\n local lit_end = pos + #lit_str - 1\n if str:sub(pos, lit_end) == lit_str then return lit_val, lit_end + 1 end\n end\n local pos_info_str = 'position ' .. pos .. ': ' .. str:sub(pos, pos + 10)\n error('Invalid json syntax starting at ' .. pos_info_str)\n end\nend","filter":{"args":[],"signature":"start()","slotKey":"-5"},"key":"2"}],"methods":[],"events":[]}
+4-4
Machine Control Program/source/unit/start.lua
···11-unit.hide()
11+unit.hideWidget()
2233--[[
44 split a string on a delimiter
···1818 if
1919 type(slot) == "table"
2020 and type(slot.export) == "table"
2121- and slot.getElementClass
2121+ and slot.getClass
2222 then
2323- slot_type = slot.getElementClass():lower()
2323+ slot_type = slot.getClass():lower()
2424 if slot_type == 'databankunit' then
2525 databank = slot
2626 end
···3131end
3232if databank ~= nil then
3333 for _,slot in pairs(industries) do
3434- local slot_id = slot.getId()
3434+ local slot_id = slot.getLocalId()
3535 if databank.hasKey(tostring(slot_id)) == 1 then
3636 local command = databank.getStringValue(slot_id)
3737 if command ~= nil and command ~= "" then