[READ-ONLY] Mirror of https://github.com/thoda-dev/DU-Industry-HUD. A simple HUD for monitoring and managing industry in Dual Universe
dual-universe lua
0

Configure Feed

Select the types of activity you want to include in your feed.

update preparation

Thomas (Oct 13, 2020, 9:42 AM +0200) 53b4569a fe499dfc

+449 -2
+1
.gitignore
··· 1 + .idea
+117 -1
Data Collection Program/config.json
··· 1 - {"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":[]}},"-2":{"name":"system","type":{"events":[],"methods":[]}},"-3":{"name":"library","type":{"events":[],"methods":[]}}},"handlers":[{"code":"unit.hide()\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 \n if slot_type == \"assembly line\" or\n slot_type == \"glass furnace\" or\n slot_type == \"3d printer\" or\n slot_type == \"smelter\" or\n slot_type == \"recycler\" 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 i = 1, #industries, 1 do\n local id = industries[i].getId()\n \tlocal data = {}\n if databank.hasKey(id) == 1 then\n data = json.decode(databank.getStringValue(id))\n if data.command ~= nil and data.command ~= \"\" then\n if data.command:lower() == \"start\" then\n industries[i].start()\n elseif data.command:lower():find(\"maintain\") then\n local splitted = strSplit(data.command, \"_\")\n local quantity = tonumber(splitted[2])\n industries[i].startAndMaintain(quantity)\n elseif data.command:lower():find(\"batch\") then\n local splitted = strSplit(data.command, \"_\")\n local quantity = tonumber(splitted[2])\n industries[i].batchStart(quantity)\n elseif data.command:lower() == \"stop\" then\n industries[i].hardStop(0)\n elseif data.command:lower() == \"soft_stop\" then\n industries[i].softStop()\n end\n data.command = \"\"\n end\n else\n data.command = \"\"\n end\n data.id = id\n data.status = industries[i].getStatus()\n data.cyclesFromStart = industries[i].getCycleCountSinceStartup()\n data.efficiency = industries[i].getEfficiency()\n data.uptime = industries[i].getUptime()\n local jsonData = json.encode(data)\n databank.setStringValue(id, jsonData)\n \t--system.print(jsonData)\n end\nend\nunit.exit()","filter":{"args":[],"signature":"start()","slotKey":"-1"},"key":"0"},{"code":"function 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","filter":{"args":[],"signature":"start()","slotKey":"-3"},"key":"1"}],"methods":[],"events":[]} 1 + { 2 + "slots": { 3 + "0": { 4 + "name": "slot1", 5 + "type": { 6 + "events": [], 7 + "methods": [] 8 + } 9 + }, 10 + "1": { 11 + "name": "slot2", 12 + "type": { 13 + "events": [], 14 + "methods": [] 15 + } 16 + }, 17 + "2": { 18 + "name": "slot3", 19 + "type": { 20 + "events": [], 21 + "methods": [] 22 + } 23 + }, 24 + "3": { 25 + "name": "slot4", 26 + "type": { 27 + "events": [], 28 + "methods": [] 29 + } 30 + }, 31 + "4": { 32 + "name": "slot5", 33 + "type": { 34 + "events": [], 35 + "methods": [] 36 + } 37 + }, 38 + "5": { 39 + "name": "slot6", 40 + "type": { 41 + "events": [], 42 + "methods": [] 43 + } 44 + }, 45 + "6": { 46 + "name": "slot7", 47 + "type": { 48 + "events": [], 49 + "methods": [] 50 + } 51 + }, 52 + "7": { 53 + "name": "slot8", 54 + "type": { 55 + "events": [], 56 + "methods": [] 57 + } 58 + }, 59 + "8": { 60 + "name": "slot9", 61 + "type": { 62 + "events": [], 63 + "methods": [] 64 + } 65 + }, 66 + "9": { 67 + "name": "slot10", 68 + "type": { 69 + "events": [], 70 + "methods": [] 71 + } 72 + }, 73 + "-1": { 74 + "name": "unit", 75 + "type": { 76 + "events": [], 77 + "methods": [] 78 + } 79 + }, 80 + "-2": { 81 + "name": "system", 82 + "type": { 83 + "events": [], 84 + "methods": [] 85 + } 86 + }, 87 + "-3": { 88 + "name": "library", 89 + "type": { 90 + "events": [], 91 + "methods": [] 92 + } 93 + } 94 + }, 95 + "handlers": [ 96 + { 97 + "code": "unit.hide()\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 \n if slot_type == \"assembly line\" or\n slot_type == \"glass furnace\" or\n slot_type == \"3d printer\" or\n slot_type == \"smelter\" or\n slot_type == \"recycler\" 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 i = 1, #industries, 1 do\n local id = industries[i].getId()\n \tlocal data = {}\n if databank.hasKey(id) == 1 then\n data = json.decode(databank.getStringValue(id))\n if data.command ~= nil and data.command ~= \"\" then\n if data.command:lower() == \"start\" then\n industries[i].start()\n elseif data.command:lower():find(\"maintain\") then\n local splitted = strSplit(data.command, \"_\")\n local quantity = tonumber(splitted[2])\n industries[i].startAndMaintain(quantity)\n elseif data.command:lower():find(\"batch\") then\n local splitted = strSplit(data.command, \"_\")\n local quantity = tonumber(splitted[2])\n industries[i].batchStart(quantity)\n elseif data.command:lower() == \"stop\" then\n industries[i].hardStop(0)\n elseif data.command:lower() == \"soft_stop\" then\n industries[i].softStop()\n end\n data.command = \"\"\n end\n else\n data.command = \"\"\n end\n data.id = id\n data.status = industries[i].getStatus()\n data.cyclesFromStart = industries[i].getCycleCountSinceStartup()\n data.efficiency = industries[i].getEfficiency()\n data.uptime = industries[i].getUptime()\n local jsonData = json.encode(data)\n databank.setStringValue(id, jsonData)\n \t--system.print(jsonData)\n end\nend\nunit.exit()", 98 + "filter": { 99 + "args": [], 100 + "signature": "start()", 101 + "slotKey": "-1" 102 + }, 103 + "key": "0" 104 + }, 105 + { 106 + "code": "function 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", 107 + "filter": { 108 + "args": [], 109 + "signature": "start()", 110 + "slotKey": "-3" 111 + }, 112 + "key": "1" 113 + } 114 + ], 115 + "methods": [], 116 + "events": [] 117 + }
+331 -1
Master program/config.json
··· 1 - {"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":[]}},"-2":{"name":"system","type":{"events":[],"methods":[]}},"-3":{"name":"library","type":{"events":[],"methods":[]}}},"handlers":[{"code":"--[[\n\treceivers channels for each type of machine\n]]\n\nchannel_for_refiner = \"receiver_refiner\" --export: receiver channel for updating refiners\nchannel_for_assembly = \"receiver_assembly\" --export: receiver channel for updating assembly lines\nchannel_for_smelter = \"receiver_smelters\" --export: receiver channel for updating smelters\nchannel_for_chemical = \"receiver_chemical\" --export: receiver channel for updating chemical indutries\nchannel_for_electronics = \"receiver_electronics\" --export: receiver channel for updating electronic industries\nchannel_for_glass = \"receiver_glass\" --export: receiver channel for updating glass furnace\nchannel_for_honeycomb = \"receiver_honeycomb_recycler\" --export: receiver channel for updating honeycomb refiniries\nchannel_for_recycler = \"receiver_honeycomb_recycler\" --export: receiver channel for updating recylers\nchannel_for_metalwork = \"receiver_metalworks\" --export: receiver channel for updating metalworks\nchannel_for_3d_printer = \"receiver_3dprinters\" --export: receiver channel for updating 3d printers\nchannel_for_transfer = \"receiver_transfert\" --export: receiver channel for updating tranfer units\n\n--[[ \n\tDO NOT CHANGE THE FOLLOWING\n]]\n\nchannels = {}\nchannels['refiner'] = channel_for_refiner\nchannels['assembly line'] = channel_for_assembly\nchannels['smelter'] = channel_for_smelter\nchannels['chemical industry'] = channel_for_chemical\nchannels['electronics industry'] = channel_for_electronics\nchannels['glass furnace'] = channel_for_glass\nchannels['honeycomb refinery'] = channel_for_honeycomb\nchannels['recycler'] = channel_for_recycler\nchannels['metalwork industry'] = channel_for_metalwork\nchannels['3d printer'] = channel_for_3d_printer\nchannels['transfer unit'] = channel_for_transfer\n\ndatabanks = {}\ncore = nil\nemitter = nil\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 if slot.getElementClass():lower() == 'databankunit' then\n table.insert(databanks, slot)\n end\n if slot.getElementClass():lower() == 'coreunitstatic' then\n core = slot\n end\n if slot.getElementClass():lower() == 'emitterunit' then\n emitter = slot\n end\n end\nend\nStorage = bankhub:new(databanks)\n\n--system.print(json.encode(Storage.getKeys()))\n\nelementsId = {}\nelements = {}\nelementsTypes = {}\nmachines_count = {}\nmachines_count.total = 0\nif core ~= nil and Storage then\n\telementsIdList = core.getElementIdList()\n for _,id in pairs(elementsIdList) do\n elementType = core.getElementTypeById(id):lower()\n if elementType == \"assembly line\" or\n elementType == \"glass furnace\" or\n elementType == \"3d printer\" or\n elementType == \"smelter\" or\n elementType == \"recycler\" or\n elementType:find(\"refiner\") or\n elementType:find(\"industry\") or\n elementType == \"transfer unit\"\n then\n if machines_count[elementType:lower()] ~= nil then\n machines_count[elementType:lower()] = machines_count[elementType:lower()] + 1\n else\n machines_count[elementType:lower()] = 1\n end\n table.insert(elementsId, id)\n end\n end\nend\n\nelementsTypes = removeDuplicatesInTable(elementsTypes)\n\nsystem.showScreen(1)\nrefreshSpeed = 1 --export: the refresh speed of data in seconds\nunit.setTimer(\"refreshData\", refreshSpeed)\nchannel_index = 1\nselected_index = 1\nselected_machine_index = 1\nhud_displayed = true\npage = 1\nmaxPage = 1\nselectedElementsId = {}\nCtrl_pressed = false\nAlt_pressed = false\ncraft_quantity = \"\"\ncraft_quantity_digits = {\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\"}\ncraft_selected_digit = 1\ncommand_1 = \"\"\ncommand_2 = \"\"\ncommand_3 = \"\"\nelementsByPage = 20 --export: maximum amount of elements displayed on a single page\ndateFormat = \"en\" --export: the country code to format the date","filter":{"args":[],"signature":"start()","slotKey":"-1"},"key":"0"},{"code":"if emitter ~= nil and #elementsTypes > 0 then\n emitter.send(channels[elementsTypes[selected_index]:lower()], \"\")\nend\n","filter":{"args":[{"value":"refreshData"}],"signature":"tick(timerId)","slotKey":"-1"},"key":"1"},{"code":"Storage.clear()","filter":{"args":[],"signature":"stop()","slotKey":"-1"},"key":"2"},{"code":"local year, month, day, hour, minute, second = epochTime()\nlocal dateStr = year .. \"/\" .. month .. \"/\" .. day .. \" \" .. hour .. \":\" .. minute .. \":\" .. second\nif dateFormat:lower() == \"fr\" then \n dateStr = day .. \"/\" .. month .. \"/\" .. year .. \" \" .. hour .. \":\" .. minute .. \":\" .. second\nend\n\nhud_main_css = [[\n<style>\n\t.hud_container {\n\t\tborder: 2px solid orange;\n\t\tborder-radius:10px;\n\t\tbackground-color: rgba(0,0,0,.75);\n\t\tpadding:10px;\n\t}\n\t.hud_help_commands {\n\t\tposition: absolute;\n\t\ttop: 10px;\n\t\tleft:50px;\n\t\ttext-transform: uppercase;\n\t\tfont-weight: bold;\n\t}\n\t.hud_list_container {\n\t\tposition: absolute;\n\t\ttop: 100px;\n\t\tleft:50px;\n\t\ttext-transform: uppercase;\n\t\tfont-weight: bold;\n\t}\n\t.hud_machine_detail {\n\t\tposition: absolute;\n\t\ttop: 100px;\n\t\tright:450px;\n\t\ttext-transform: uppercase;\n\t\tfont-weight: bold;\n\t}\n\t.hud_machines_container {\n\t\tposition: absolute;\n\t\ttop: 100px;\n\t\tleft:300px;\n\t}\n\t.elementType {\n\t\tmargin-top:10px;\n\t\tborder-radius:5px;\n\t}\n\t.elementType.selected {\n\t\tborder: 2px solid green;\n\t\tbackground-color: rgba(0,200,0,.45);\n\t}\n\ttr.selected td, tr.selected th{\n\t\tborder: 2px solid green;\n\t\tbackground-color: rgba(0,200,0,.1);\n\t}\n\ttd, th {\n\t\tborder-bottom:1px solid white;\n\t\tpadding:5px;\n\t\ttext-align: center;\n\t}\n\tth {\n\t\tfont-weight: bold;\n\t}\n\t.text-success{color: #28a745;}\n\t.text-danger{color:#dc3545;}\n\t.text-warning{color:#ffc107;}\n\t.text-info{color:#17a2b8;}\n\t.text-primary{color:#007bff;}\n</style>\n]]\n\nhud_help_command = [[<div class=\"hud_help_commands hud_container\">\n\t<table>\n\t\t<tr>\n\t\t\t<th colspan=\"2\">\n\t\t\t\t]] .. dateStr .. [[\n\t\t\t</th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>Show/Hide HUD</td>\n\t\t\t<th style=\"text-align:right;\">Alt+7</th>\n\t\t</tr>\n\t</table>\n</div>]]\n\nhud_elements_type_list = \"\"\nhud_machines = \"\"\nhud_machine_detail = \"\"\n\nif hud_displayed == true then\n selected_type = elementsTypes[selected_index]\n elementsTypes = {}\n elements = {}\n selectedElementsId = {}\n for _,id in pairs(elementsId) do\n elementType = core.getElementTypeById(id)\n table.insert(elementsTypes, elementType)\n if selected_type == elementType then table.insert(selectedElementsId, id) end\n end\n elementsTypes = removeDuplicatesInTable(elementsTypes)\n table.sort(elementsTypes)\n maxPage = math.ceil(#selectedElementsId / elementsByPage)\n\n local minOnPage = ((page - 1) * elementsByPage) + 1\n local maxOnPage = page * elementsByPage\n local temp_elements_for_sorting = {}\n for i,id in pairs(selectedElementsId) do\n elementData = {}\n elementData.id = id\n elementData.name = core.getElementNameById(id)\n table.insert(temp_elements_for_sorting, elementData)\n end\n --sorting by name\n table.sort(temp_elements_for_sorting, function(a,b) return a.name:lower() < b.name:lower() end)\n --only get data from displayed elements\n for i,elementData in pairs(temp_elements_for_sorting) do\n if i >= minOnPage and i <= maxOnPage then\n elementType = core.getElementTypeById(elementData.id)\n if Storage.hasKey(elementData.id) == 1 then\n elementData = json.decode(Storage.getStringValue(elementData.id))\n end\n elementData.type = elementType\n elementData.name = core.getElementNameById(elementData.id)\n table.insert(elements, elementData)\n end\n end\n hud_elements_type_list = [[<div class=\"hud_list_container hud_container\">\n <div style=\"text-align:center;font-weight:bold;border-bottom:1px solid white;\">&#x2191; &nbsp;&nbsp; Ctrl+Arrow Up</div>\n ]]\n for i, elementType in pairs(elementsTypes) do\n hud_elements_type_list = hud_elements_type_list .. [[<div class=\"elementType]]\n if i == selected_index then \n hud_elements_type_list = hud_elements_type_list .. \" selected\"\n end\n local count = 0\n if machines_count[elementType:lower()] ~= nil then count = machines_count[elementType:lower()] end\n hud_elements_type_list = hud_elements_type_list .. [[\">\n \t<table style=\"width:100%;\">\n \t\t<tr>\n \t\t\t<th style=\"text-align:left;border-bottom:none;\">]].. elementType .. [[</th>\n \t\t\t<td style=\"text-align:right;border-bottom:none;\">]] .. count .. [[</td>\n \t\t</tr>\n \t</table>\n </div>\n ]]\n end\n hud_elements_type_list = hud_elements_type_list .. [[<div style=\"margin-top:10px;text-align:center;font-weight:bold;border-top:1px solid white;\">&#x2193; &nbsp;&nbsp; Ctrl+Arrow Down</div></div>]]\n local minOnPage = ((page - 1) * elementsByPage) + 1\n --local maxOnPage = page * elementsByPage\n --local maxOnPage = page * elementsByPage\n if maxOnPage > #selectedElementsId then maxOnPage = #selectedElementsId end\n hud_machines = [[<div class=\"hud_machines_container hud_container\">\n \t<div style=\"text-align:center;font-weight:bold;border-bottom:1px solid white;\">&#x2191; &nbsp;&nbsp; Arrow Up</div>\n \t<table class=\"elements_table\" style=\"width:100%\">\n \t\t<tr>\n \t\t\t<th>&#x2190; &nbsp;&nbsp; Arrow Left</th>\n \t\t\t<th> Page ]] .. page .. [[/]] .. maxPage .. [[ (from ]] .. minOnPage .. [[ to ]] .. maxOnPage .. [[)</th>\n \t\t\t<th>Arrow Right &nbsp;&nbsp; &#x2192;</th>\n \t\t</tr>\n \t</table>\n <table class=\"elements_table\">\n <tr>\n \t <th>id</th>\n <th>Machine Name</th>\n <th>Cycles From Start</th>\n <th>Efficacity</th>\n <th>Status</th>\n <th>Uptime</th>\n </tr>\n ]]\n for i, element in pairs(elements) do\n --system.print(json.encode(element))\n --system.print(elementType[selected_index])\n local status = \"-\"\n if element.status then status = element.status end\n local status_class = \"\"\n if status:lower():find(\"running\") then status_class = \"text-success\" end\n if status:lower():find(\"stopped\") then status_class = \"text-info\" end\n if status:lower():find(\"jammed\") then status_class = \"text-danger\" end\n if status:lower():find(\"pending\") then status_class = \"text-primary\" end\n status = status:gsub(\"JAMMED_\", \"\"):gsub(\"_\", \" \")\n local cyclesFromStart = \"-\"\n if element.cyclesFromStart then cyclesFromStart = element.cyclesFromStart end\n local efficiency = \"-\"\n if element.efficiency then efficiency = math.floor(element.efficiency*100) end\n local uptime = 0\n if element.uptime then uptime = math.floor(element.uptime) end\n hud_machines = hud_machines .. [[<tr]]\n if selected_machine_index == i then\n hud_machines = hud_machines .. [[ class=\"selected\"]]\n end\n local machine_id = \"-\"\n if element.id then machine_id = element.id end\n hud_machines = hud_machines .. [[>\n <th>]] .. machine_id .. [[</th>\n <th class=\"]] .. status_class .. [[\">]] .. element.name .. [[</th>\n <td>]] .. cyclesFromStart .. [[</td>\n <td>]] .. efficiency .. [[%</td>\n <th class=\"]] .. status_class .. [[\">]] .. status .. [[</th>\n <td class=\"]] .. status_class .. [[\">]] .. SecondsToClockString(uptime) .. [[</td>\n </tr>\n ]]\n end\n hud_machines = hud_machines .. [[</table>\n <table class=\"elements_table\" style=\"width:100%\">\n <tr>\n <th>&#x2190; &nbsp;&nbsp; Arrow Left</th>\n <th> Page ]] .. page .. [[/]] .. maxPage .. [[ (from ]] .. minOnPage .. [[ to ]] .. maxOnPage .. [[)</th>\n <th>Arrow Right &nbsp;&nbsp; &#x2192;</th>\n </tr>\n </table>\n <div style=\"text-align:center;font-weight:bold;border-top:1px solid white;\">&#x2193; &nbsp;&nbsp; Arrow Down</div>\n </div>]]\n if #elements > 0 then\n local selected_machine = elements[selected_machine_index]\n local status = \"-\"\n if selected_machine.status then status = selected_machine.status end\n local status_class = \"\"\n local machines_actions = {}\n if status:lower():find(\"running\") then status_class = \"text-success\" end\n if status:lower():find(\"stopped\") then status_class = \"text-info\" end\n if status:lower():find(\"jammed\") then status_class = \"text-danger\" end\n if status:lower():find(\"pending\") then status_class = \"text-primary\" end\n status = status:gsub(\"JAMMED_\", \"\"):gsub(\"_\", \" \")\n hud_machine_detail = [[<div class=\"hud_machine_detail hud_container\">\n \t\t<table>\n \t\t\t<tr>\n \t\t\t\t<th colspan=\"3\">]] .. selected_machine.name .. [[</th>\n \t\t\t</tr>\n \t\t\t<tr>\n \t\t\t\t<th class=\"]] .. status_class .. [[\" colspan=\"3\">]] .. status .. [[</th>\n \t\t\t</tr>\n ]]\n if status == \"-\" then\n command_1 = \"\"\n command_2 = \"\"\n command_3 = \"\"\n hud_machine_detail = hud_machine_detail .. [[\n \t<tr>\n \t\t<td>Machine Not Connected</td>\n \t</tr>\n ]]\n elseif status:lower():find(\"stopped\") then\n command_1 = \"START\"\n command_2 = \"BATCH\"\n command_3 = \"MAINTAIN\"\n hud_machine_detail = hud_machine_detail .. [[\n \t<tr>\n \t\t<th>START</th>\n \t\t<th></th>\n \t\t<th>ALT+1</th>\n \t</tr>\n \t<tr>\n \t\t<th style=\"height:65px;\">BATCH</th>\n \t\t<th rowspan=\"2\">\n \t\t\t<table>\n \t\t\t\t<tr>\n \t\t\t\t\t<th colspan=\"3\">&#x2191; &nbsp;&nbsp; Alt+Arrow Up</th>\n \t\t\t\t</tr>\n \t\t\t\t<tr>\n \t\t\t\t\t<th colspan=\"3\">Quantity:</th>\n \t\t\t\t</tr>\n \t\t\t\t<tr>\n \t\t\t\t\t<th>&#x2190; &nbsp;&nbsp; Alt+<br>Arrow Left</th>\n \t\t\t\t\t<th style=\"font-size:20px;\">\n ]]\n for digit_index,digit in pairs(craft_quantity_digits) do\n if digit_index == (#craft_quantity_digits - craft_selected_digit + 1) then\n \thud_machine_detail = hud_machine_detail .. [[<span class=\"text-success\">]]\n end\n hud_machine_detail = hud_machine_detail .. digit\n if digit_index == (#craft_quantity_digits - craft_selected_digit + 1) then\n \thud_machine_detail = hud_machine_detail .. [[</span>]]\n end\n end\n hud_machine_detail = hud_machine_detail .. [[\n \t\t\t\t</th>\n \t\t\t\t<th>Alt+ &nbsp;&nbsp; &#x2192;<br>Arrow Right</th>\n \t\t\t </tr>\n <tr>\n <th colspan=\"3\" style=\"border-bottom:none;\">&#x2193; &nbsp;&nbsp; Alt+Arrow Down</th>\n </tr>\n </table>\n \t\t</th>\n \t\t<th>ALT+2</th>\n \t</tr>\n \t<tr>\n \t\t<th>MAINTAIN</th>\n \t\t<th>ALT+3</th>\n \t</tr>\n ]]\n else\n command_1 = \"STOP\"\n command_2 = \"SOFT_STOP\"\n command_3 = \"\"\n hud_machine_detail = hud_machine_detail .. [[\n \t<tr>\n \t\t<th>STOP</th>\n \t\t<th>ALT+1</th>\n \t</tr>\n \t<tr>\n \t\t<th>FINISH AND STOP</th>\n \t\t<th>ALT+2</th>\n \t</tr>\n ]]\n \n end\n hud_machine_detail = hud_machine_detail .. [[</table></div>]]\n end\nend\nsystem.setScreen(hud_main_css .. hud_help_command .. hud_elements_type_list .. hud_machines .. hud_machine_detail)","filter":{"args":[],"signature":"update()","slotKey":"-2"},"key":"3"},{"code":"hud_displayed = not hud_displayed","filter":{"args":[{"value":"option7"}],"signature":"actionStart(action)","slotKey":"-2"},"key":"4"},{"code":"if Alt_pressed == true then\n if craft_selected_digit < #craft_quantity_digits then\n craft_selected_digit = craft_selected_digit + 1\n end\nelse\n if page > 1 then\n page = page - 1\n selected_machine_index = 1\n Storage.clear()\n end\nend","filter":{"args":[{"value":"strafeleft"}],"signature":"actionStart(action)","slotKey":"-2"},"key":"5"},{"code":"if Alt_pressed == true then\n if craft_selected_digit > 1 then\n craft_selected_digit = craft_selected_digit - 1\n end\nelse\n if page < maxPage then\n page = page + 1\n selected_machine_index = 1\n Storage.clear()\n end\nend","filter":{"args":[{"value":"straferight"}],"signature":"actionStart(action)","slotKey":"-2"},"key":"6"},{"code":"if Ctrl_pressed == true and Alt_pressed == false then\n if selected_index > 1 then\n selected_index = selected_index - 1\n selected_machine_index = 1\n page = 1\n Storage.clear()\n craft_quantity_digits = {\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\"}\n end\nelseif Alt_pressed == true and Ctrl_pressed == false then\n local digit_index = #craft_quantity_digits - craft_selected_digit + 1\n local value = tonumber(craft_quantity_digits[digit_index]) + 1\n if value >= 10 then value = 0 end\n craft_quantity_digits[digit_index] = tostring(value)\nelse\n if selected_machine_index > 1 then\n selected_machine_index = selected_machine_index - 1\n craft_quantity_digits = {\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\"}\n end\nend","filter":{"args":[{"value":"up"}],"signature":"actionStart(action)","slotKey":"-2"},"key":"7"},{"code":"if Ctrl_pressed == true and Alt_pressed == false then\n if selected_index < #elementsTypes then\n selected_index = selected_index + 1\n selected_machine_index = 1\n page = 1\n Storage.clear()\n craft_quantity_digits = {\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\"}\n end\nelseif Alt_pressed == true and Ctrl_pressed == false then\n local digit_index = #craft_quantity_digits - craft_selected_digit + 1\n local value = tonumber(craft_quantity_digits[digit_index]) - 1\n if value < 0 then value = 9 end\n craft_quantity_digits[digit_index] = tostring(value)\nelse\n if selected_machine_index < #elements then\n selected_machine_index = selected_machine_index + 1\n craft_quantity_digits = {\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\"}\n end\nend","filter":{"args":[{"value":"down"}],"signature":"actionStart(action)","slotKey":"-2"},"key":"8"},{"code":"Ctrl_pressed = true","filter":{"args":[{"value":"brake"}],"signature":"actionStart(action)","slotKey":"-2"},"key":"9"},{"code":"Ctrl_pressed = false","filter":{"args":[{"value":"brake"}],"signature":"actionStop(action)","slotKey":"-2"},"key":"10"},{"code":"Alt_pressed = true","filter":{"args":[{"value":"lalt"}],"signature":"actionStart(action)","slotKey":"-2"},"key":"11"},{"code":"Alt_pressed = false","filter":{"args":[{"value":"lalt"}],"signature":"actionStop(action)","slotKey":"-2"},"key":"12"},{"code":"--Send Command 1\nlocal selected_machine = elements[selected_machine_index]\nfor _,db in pairs(databanks) do\n if db.hasKey(selected_machine.id) == 1 then\n selected_machine.command = command_1\n db.setStringValue(selected_machine.id, json.encode(selected_machine))\n end\nend","filter":{"args":[{"value":"option1"}],"signature":"actionStart(action)","slotKey":"-2"},"key":"13"},{"code":"--Send Command 12\nlocal selected_machine = elements[selected_machine_index]\nfor _,db in pairs(databanks) do\n if db.hasKey(selected_machine.id) == 1 then\n if command_2:find(\"MAINTAIN\") or command_2:find(\"BATCH\") then\n craft_quantity = \"\"\n for _,digit in pairs(craft_quantity_digits) do\n craft_quantity = craft_quantity .. digit\n end\n command_2 = command_2 .. \"_\" .. craft_quantity\n end\n selected_machine.command = command_2\n db.setStringValue(selected_machine.id, json.encode(selected_machine))\n if command_2:find(\"MAINTAIN\") then command_2 = \"MAINTAIN\" end\n if command_2:find(\"BATCH\") then command_2 = \"BATCH\" end\n end\nend","filter":{"args":[{"value":"option2"}],"signature":"actionStart(action)","slotKey":"-2"},"key":"14"},{"code":"--Send Command 3\nlocal selected_machine = elements[selected_machine_index]\nfor _,db in pairs(databanks) do\n if db.hasKey(selected_machine.id) == 1 then\n if command_3:find(\"MAINTAIN\") or command_3:find(\"BATCH\") then\n craft_quantity = \"\"\n for _,digit in pairs(craft_quantity_digits) do\n craft_quantity = craft_quantity .. digit\n end\n command_3 = command_3 .. \"_\" .. craft_quantity\n end\n selected_machine.command = command_3\n db.setStringValue(selected_machine.id, json.encode(selected_machine))\n if command_3:find(\"MAINTAIN\") then command_3 = \"MAINTAIN\" end\n if command_3:find(\"BATCH\") then command_3 = \"BATCH\" end\n end\nend","filter":{"args":[{"value":"option3"}],"signature":"actionStart(action)","slotKey":"-2"},"key":"15"},{"code":"--[[\n\tDatabank HUB\n\tInspired by the original BankRaid Script written by ilodev\n\tModified to act like a databank hub by Jericho (read and clear only)\n]]\nbankhub = {}\n\nfunction bankhub:new(banks)\n o = {}\n setmetatable(o, self);\n self.__index = self;\n o.banks = banks or {}\n\n -- databank shortcuts to allow in-game syntax.\n function o.clear() return o:_clear() end\n function o.getNbKeys() return o:_getNbKeys() end\n function o.getKeys() return o:_getKeys() end\n function o.hasKey(key) return o:_hasKey(key) end\n function o.getStringValue(key) return o:_getStringValue(key) end\n function o.getIntValue(key) return o:_getIntValue(key) end\n function o.getFloatValue(key) return o:_getFloatValue(key) end\n\n return o\nend\n--- Adds another databank to the raid.\n--- @param object The databank unit to add.\nfunction bankhub:add(element)\n table.insert( self.banks, element)\n self.banks_size = #self.banks\nend\n--- Clears the databank array\nfunction bankhub:_clear()\n for _,bank in pairs(self.banks) do bank.clear() end\nend\n--- Returns the number of keys in the entire databank table\n--- @return integer number of total keys\nfunction bankhub:_getNbKeys()\n local res = 0\n for _,bank in pairs(self.banks) do res = res + bank.getNbKeys() end\n return res\nend\n\n--- Returns all the keys in the databank array\n--- @return string json encoded string of keys\nfunction bankhub:_getKeys()\n local res = {}\n for _,bank in pairs(self.banks) do\n local keys = json.decode(bank.getKeys())\n for _,k in pairs(keys) do table.insert(res, k) end\n end\n return json.encode(res)\nend\n\n--- Checks if a key exists in the databank array\n--- @param string key\n--- @return boolean returns 1 if the array holds this key.\nfunction bankhub:_hasKey(key)\n for _,bank in pairs(self.banks) do\n if (bank.hasKey(key) == 1) then return 1 end\n end\n return 0\nend\n\n--- Returns the value of the key if existing\n--- @param string key\n--- @return string returns value or nil\nfunction bankhub:_getStringValue(key)\n for _,bank in pairs(self.banks) do\n if (bank.hasKey(key) == 1) then\n return bank.getStringValue(key)\n end\n end\n return nil\nend\n\n--- Returns the integer value of the key if existing\n--- @param string key\n--- @return number returns value or nil\nfunction bankhub:_getIntValue(key)\n for _,bank in pairs(self.banks) do\n if (bank.hasKey(key) == 1) then\n return banks.getIntValue(key)\n end\n end\n return nil\nend\n\n--- Returns the float value of the key if existing\n--- @param string key\n--- @return number returns value or nil\nfunction bankhub:_getFloatValue(key)\n for _,bank in pairs(self.banks) do\n if (bank.hasKey(key) == 1) then\n return banks.getFloatValue(key)\n end\n end\n return nil\nend","filter":{"args":[],"signature":"start()","slotKey":"-3"},"key":"16"},{"code":"--[[\n\tRemove duplicate elements in a lua table\n\tBy Jericho\n]]\nfunction removeDuplicatesInTable(data) \n local hash = {}\n local res = {}\n for _,v in ipairs(data) do\n if (not hash[v]) then\n res[#res+1] = v\n hash[v] = true\n end\n end\n return res\nend","filter":{"args":[],"signature":"start()","slotKey":"-3"},"key":"17"},{"code":"--[[\n\tConvert timestamp in a string representing a dureation in days, hours, minutes and seconds\n\tBy Jericho\n]]\nfunction SecondsToClockString(seconds)\n local seconds = tonumber(seconds)\n\n if seconds == nil or seconds <= 0 then\n return \"-\";\n else\n days = string.format(\"%2.f\", math.floor(seconds/(3600*24)));\n hours = string.format(\"%2.f\", math.floor(seconds/3600 - (days*24)));\n mins = string.format(\"%2.f\", math.floor(seconds/60 - (hours*60) - (days*24*60)));\n secs = string.format(\"%2.f\", math.floor(seconds - hours*3600 - (days*24*60*60) - mins *60));\n str = \"\"\n if tonumber(days) > 0 then str = str .. days..\"d \" end\n if tonumber(hours) > 0 then str = str .. hours..\"h \" end\n if tonumber(mins) > 0 then str = str .. mins..\"m \" end\n if tonumber(secs) > 0 then str = str .. secs ..\"s\" end\n return str\n end\nend","filter":{"args":[],"signature":"start()","slotKey":"-3"},"key":"18"},{"code":"--[[\n\tClock script from Leodr, modified and updated by Jericho\n\toriginal script: https://github.com/leodr99/DU-quick_n_dirty-scripts/blob/main/clock/clock.lua\n]]\n--Globals\nlocal outputTime = false --for debug\nlocal summertime = false --export: summer time enabled\n--\n--//functions\nfunction epochTime()\n function rZ(data)\n if string.len(data) <= 1 then\n return \"0\" .. data\n else\n return data\n end\n end\n function dPoint(value)\n if not(value == math.floor(value)) then\n return true\n else\n return false\n end\n end\n function lYear(year)\n if(not dPoint(year / 4)) then\n if(dPoint(year / 100)) then\n return true\n else\n if(not dPoint(year / 400)) then\n return true\n else\n return false\n end\n end\n else\n return false\n end\n end\n \n local timeStampDayOfWeak = 5\n local secondsInHour = 3600\n local secondsInDay = 86400\n local secondsInYear = 31536000\n local secondsInLeapYear = 31622400\n local monthWith28 = 2419200\n local monthWith29 = 2505600\n local monthWith30 = 2592000\n local monthWith31 = 2678400\n local monthsWith30 = {4, 6, 9, 11}\n local monthsWith31 = {1, 3, 5, 7, 8, 10, 12}\n local daysSinceEpoch = 0\n local duEpochOffset = 1506816000 --(Oct. 1, 2017, at 00:00) //1506729600\n local DOWAssociates = {\"Tur,\", \"Fri,\", \"Sat,\", \"Sun,\", \"Mon,\", \"Tue,\", \"Wed,\"}\n \tlocal getTime = system.getTime()\n \tif summertime == true then getTime = getTime + 3600 end\n \n now = math.floor(getTime + duEpochOffset)\n year = 1970 --the original epoch time (1/1/1970), in order to match DU's epoch offset.\n secs = 0\n daysSinceEpoch = 0\n while((secs + secondsInLeapYear) < now or (secs + secondsInYear) < now) do\n if(lYear(year+1)) then\n if((secs + secondsInLeapYear) < now) then\n secs = secs + secondsInLeapYear\n year = year + 1\n daysSinceEpoch = daysSinceEpoch + 366\n end\n else\n if((secs + secondsInYear) < now) then\n secs = secs + secondsInYear\n year = year + 1\n daysSinceEpoch = daysSinceEpoch + 365\n end\n end\n end\n secondsRemaining = now - secs\n monthSecs = 0\n yearlYear = lYear(year)\n month = 1 -- January\n while((monthSecs + monthWith28) < secondsRemaining or (monthSecs + monthWith30) < secondsRemaining or (monthSecs + monthWith31) < secondsRemaining) do\n if(month == 1) then\n if((monthSecs + monthWith31) < secondsRemaining) then\n month = 2\n monthSecs = monthSecs + monthWith31\n daysSinceEpoch = daysSinceEpoch + 31\n else\n break\n end\n end\n if(month == 2) then\n if(not yearlYear) then\n if((monthSecs + monthWith28) < secondsRemaining) then\n month = 3\n monthSecs = monthSecs + monthWith28\n daysSinceEpoch = daysSinceEpoch + 28\n else\n break\n end\n else\n if((monthSecs + monthWith29) < secondsRemaining) then\n month = 3\n monthSecs = monthSecs + monthWith29\n daysSinceEpoch = daysSinceEpoch + 29\n else\n break\n end\n end\n end\n if(month == 3) then\n if((monthSecs + monthWith31) < secondsRemaining) then\n month = 4\n monthSecs = monthSecs + monthWith31\n daysSinceEpoch = daysSinceEpoch + 31\n else\n break\n end\n end\n if(month == 4) then\n if((monthSecs + monthWith30) < secondsRemaining) then\n month = 5\n monthSecs = monthSecs + monthWith30\n daysSinceEpoch = daysSinceEpoch + 30\n else\n break \n end\n end\n if(month == 5) then\n if((monthSecs + monthWith31) < secondsRemaining) then\n month = 6\n monthSecs = monthSecs + monthWith31\n daysSinceEpoch = daysSinceEpoch + 31\n else\n break\n end\n end\n if(month == 6) then\n if((monthSecs + monthWith30) < secondsRemaining) then\n month = 7\n monthSecs = monthSecs + monthWith30\n daysSinceEpoch = daysSinceEpoch + 30\n else\n break\n end\n end\n if(month == 7) then\n if((monthSecs + monthWith31) < secondsRemaining) then\n month = 8\n monthSecs = monthSecs + monthWith31\n daysSinceEpoch = daysSinceEpoch + 31\n else\n break\n end\n end\n if(month == 8) then\n if((monthSecs + monthWith31) < secondsRemaining) then\n month = 9\n monthSecs = monthSecs + monthWith31\n daysSinceEpoch = daysSinceEpoch + 31\n else\n break\n end\n end\n if(month == 9) then\n if((monthSecs + monthWith30) < secondsRemaining) then\n month = 10\n monthSecs = monthSecs + monthWith30\n daysSinceEpoch = daysSinceEpoch + 30\n else\n break\n end\n end\n if(month == 10) then\n if((monthSecs + monthWith31) < secondsRemaining) then\n month = 11\n monthSecs = monthSecs + monthWith31\n daysSinceEpoch = daysSinceEpoch + 31\n else\n break\n end\n end\n if(month == 11) then\n if((monthSecs + monthWith30) < secondsRemaining) then\n month = 12\n monthSecs = monthSecs + monthWith30\n daysSinceEpoch = daysSinceEpoch + 30\n else\n break\n end\n end\n end\n day = 1 -- 1st\n daySecs = 0\n daySecsRemaining = secondsRemaining - monthSecs\n while((daySecs + secondsInDay) < daySecsRemaining) do\n day = day + 1\n daySecs = daySecs + secondsInDay\n daysSinceEpoch = daysSinceEpoch + 1\n end\n hour = 0 -- Midnight\n hourSecs = 0\n hourSecsRemaining = daySecsRemaining - daySecs\n while((hourSecs + secondsInHour) < hourSecsRemaining) do\n hour = hour + 1\n hourSecs = hourSecs + secondsInHour\n end\n minute = 0 -- Midnight\n minuteSecs = 0\n minuteSecsRemaining = hourSecsRemaining - hourSecs\n while((minuteSecs + 60) < minuteSecsRemaining) do\n minute = minute + 1\n minuteSecs = minuteSecs + 60\n end\n second = math.floor(now % 60)\n year = rZ(year)\n month = rZ(month)\n day = rZ(day)\n hour = rZ(hour)\n minute = rZ(minute)\n second = rZ(second)\n remanderForDOW = daysSinceEpoch % 7\n DOW = DOWAssociates[remanderForDOW]\n \n if(outputTime) then\n str = \"Year: \" .. year .. \", Month: \" .. month .. \", Day: \" .. day .. \", Hour: \" .. hour .. \", Minute: \" .. minute .. \", Second: \".. second .. \", Day of Week: \" .. DOW\n system.print(str)\n end\n return year, month, day, hour, minute, second, DOW\nend","filter":{"args":[],"signature":"start()","slotKey":"-3"},"key":"19"}],"methods":[],"events":[]} 1 + { 2 + "slots": { 3 + "0": { 4 + "name": "slot1", 5 + "type": { 6 + "events": [], 7 + "methods": [] 8 + } 9 + }, 10 + "1": { 11 + "name": "slot2", 12 + "type": { 13 + "events": [], 14 + "methods": [] 15 + } 16 + }, 17 + "2": { 18 + "name": "slot3", 19 + "type": { 20 + "events": [], 21 + "methods": [] 22 + } 23 + }, 24 + "3": { 25 + "name": "slot4", 26 + "type": { 27 + "events": [], 28 + "methods": [] 29 + } 30 + }, 31 + "4": { 32 + "name": "slot5", 33 + "type": { 34 + "events": [], 35 + "methods": [] 36 + } 37 + }, 38 + "5": { 39 + "name": "slot6", 40 + "type": { 41 + "events": [], 42 + "methods": [] 43 + } 44 + }, 45 + "6": { 46 + "name": "slot7", 47 + "type": { 48 + "events": [], 49 + "methods": [] 50 + } 51 + }, 52 + "7": { 53 + "name": "slot8", 54 + "type": { 55 + "events": [], 56 + "methods": [] 57 + } 58 + }, 59 + "8": { 60 + "name": "slot9", 61 + "type": { 62 + "events": [], 63 + "methods": [] 64 + } 65 + }, 66 + "9": { 67 + "name": "slot10", 68 + "type": { 69 + "events": [], 70 + "methods": [] 71 + } 72 + }, 73 + "-1": { 74 + "name": "unit", 75 + "type": { 76 + "events": [], 77 + "methods": [] 78 + } 79 + }, 80 + "-2": { 81 + "name": "system", 82 + "type": { 83 + "events": [], 84 + "methods": [] 85 + } 86 + }, 87 + "-3": { 88 + "name": "library", 89 + "type": { 90 + "events": [], 91 + "methods": [] 92 + } 93 + } 94 + }, 95 + "handlers": [ 96 + { 97 + "code": "--[[\n\treceivers channels for each type of machine\n]]\n\nchannel_for_refiner = \"receiver_refiner\" --export: receiver channel for updating refiners\nchannel_for_assembly = \"receiver_assembly\" --export: receiver channel for updating assembly lines\nchannel_for_smelter = \"receiver_smelters\" --export: receiver channel for updating smelters\nchannel_for_chemical = \"receiver_chemical\" --export: receiver channel for updating chemical indutries\nchannel_for_electronics = \"receiver_electronics\" --export: receiver channel for updating electronic industries\nchannel_for_glass = \"receiver_glass\" --export: receiver channel for updating glass furnace\nchannel_for_honeycomb = \"receiver_honeycomb_recycler\" --export: receiver channel for updating honeycomb refiniries\nchannel_for_recycler = \"receiver_honeycomb_recycler\" --export: receiver channel for updating recylers\nchannel_for_metalwork = \"receiver_metalworks\" --export: receiver channel for updating metalworks\nchannel_for_3d_printer = \"receiver_3dprinters\" --export: receiver channel for updating 3d printers\nchannel_for_transfer = \"receiver_transfert\" --export: receiver channel for updating tranfer units\n\n--[[ \n\tDO NOT CHANGE THE FOLLOWING\n]]\n\nchannels = {}\nchannels['refiner'] = channel_for_refiner\nchannels['assembly line'] = channel_for_assembly\nchannels['smelter'] = channel_for_smelter\nchannels['chemical industry'] = channel_for_chemical\nchannels['electronics industry'] = channel_for_electronics\nchannels['glass furnace'] = channel_for_glass\nchannels['honeycomb refinery'] = channel_for_honeycomb\nchannels['recycler'] = channel_for_recycler\nchannels['metalwork industry'] = channel_for_metalwork\nchannels['3d printer'] = channel_for_3d_printer\nchannels['transfer unit'] = channel_for_transfer\n\ndatabanks = {}\ncore = nil\nemitter = nil\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 if slot.getElementClass():lower() == 'databankunit' then\n table.insert(databanks, slot)\n end\n if slot.getElementClass():lower() == 'coreunitstatic' then\n core = slot\n end\n if slot.getElementClass():lower() == 'emitterunit' then\n emitter = slot\n end\n end\nend\nStorage = bankhub:new(databanks)\n\n--system.print(json.encode(Storage.getKeys()))\n\nelementsId = {}\nelements = {}\nelementsTypes = {}\nmachines_count = {}\nmachines_count.total = 0\nif core ~= nil and Storage then\n\telementsIdList = core.getElementIdList()\n for _,id in pairs(elementsIdList) do\n elementType = core.getElementTypeById(id):lower()\n if elementType == \"assembly line\" or\n elementType == \"glass furnace\" or\n elementType == \"3d printer\" or\n elementType == \"smelter\" or\n elementType == \"recycler\" or\n elementType:find(\"refiner\") or\n elementType:find(\"industry\") or\n elementType == \"transfer unit\"\n then\n if machines_count[elementType:lower()] ~= nil then\n machines_count[elementType:lower()] = machines_count[elementType:lower()] + 1\n else\n machines_count[elementType:lower()] = 1\n end\n table.insert(elementsId, id)\n end\n end\nend\n\nelementsTypes = removeDuplicatesInTable(elementsTypes)\n\nsystem.showScreen(1)\nrefreshSpeed = 1 --export: the refresh speed of data in seconds\nunit.setTimer(\"refreshData\", refreshSpeed)\nchannel_index = 1\nselected_index = 1\nselected_machine_index = 1\nhud_displayed = true\npage = 1\nmaxPage = 1\nselectedElementsId = {}\nCtrl_pressed = false\nAlt_pressed = false\ncraft_quantity = \"\"\ncraft_quantity_digits = {\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\"}\ncraft_selected_digit = 1\ncommand_1 = \"\"\ncommand_2 = \"\"\ncommand_3 = \"\"\nelementsByPage = 20 --export: maximum amount of elements displayed on a single page\ndateFormat = \"en\" --export: the country code to format the date", 98 + "filter": { 99 + "args": [], 100 + "signature": "start()", 101 + "slotKey": "-1" 102 + }, 103 + "key": "0" 104 + }, 105 + { 106 + "code": "if emitter ~= nil and #elementsTypes > 0 then\n emitter.send(channels[elementsTypes[selected_index]:lower()], \"\")\nend\n", 107 + "filter": { 108 + "args": [ 109 + { 110 + "value": "refreshData" 111 + } 112 + ], 113 + "signature": "tick(timerId)", 114 + "slotKey": "-1" 115 + }, 116 + "key": "1" 117 + }, 118 + { 119 + "code": "Storage.clear()", 120 + "filter": { 121 + "args": [], 122 + "signature": "stop()", 123 + "slotKey": "-1" 124 + }, 125 + "key": "2" 126 + }, 127 + { 128 + "code": "local year, month, day, hour, minute, second = epochTime()\nlocal dateStr = year .. \"/\" .. month .. \"/\" .. day .. \" \" .. hour .. \":\" .. minute .. \":\" .. second\nif dateFormat:lower() == \"fr\" then \n dateStr = day .. \"/\" .. month .. \"/\" .. year .. \" \" .. hour .. \":\" .. minute .. \":\" .. second\nend\n\nhud_main_css = [[\n<style>\n\t.hud_container {\n\t\tborder: 2px solid orange;\n\t\tborder-radius:10px;\n\t\tbackground-color: rgba(0,0,0,.75);\n\t\tpadding:10px;\n\t}\n\t.hud_help_commands {\n\t\tposition: absolute;\n\t\ttop: 10px;\n\t\tleft:50px;\n\t\ttext-transform: uppercase;\n\t\tfont-weight: bold;\n\t}\n\t.hud_list_container {\n\t\tposition: absolute;\n\t\ttop: 100px;\n\t\tleft:50px;\n\t\ttext-transform: uppercase;\n\t\tfont-weight: bold;\n\t}\n\t.hud_machine_detail {\n\t\tposition: absolute;\n\t\ttop: 100px;\n\t\tright:450px;\n\t\ttext-transform: uppercase;\n\t\tfont-weight: bold;\n\t}\n\t.hud_machines_container {\n\t\tposition: absolute;\n\t\ttop: 100px;\n\t\tleft:300px;\n\t}\n\t.elementType {\n\t\tmargin-top:10px;\n\t\tborder-radius:5px;\n\t}\n\t.elementType.selected {\n\t\tborder: 2px solid green;\n\t\tbackground-color: rgba(0,200,0,.45);\n\t}\n\ttr.selected td, tr.selected th{\n\t\tborder: 2px solid green;\n\t\tbackground-color: rgba(0,200,0,.1);\n\t}\n\ttd, th {\n\t\tborder-bottom:1px solid white;\n\t\tpadding:5px;\n\t\ttext-align: center;\n\t}\n\tth {\n\t\tfont-weight: bold;\n\t}\n\t.text-success{color: #28a745;}\n\t.text-danger{color:#dc3545;}\n\t.text-warning{color:#ffc107;}\n\t.text-info{color:#17a2b8;}\n\t.text-primary{color:#007bff;}\n</style>\n]]\n\nhud_help_command = [[<div class=\"hud_help_commands hud_container\">\n\t<table>\n\t\t<tr>\n\t\t\t<th colspan=\"2\">\n\t\t\t\t]] .. dateStr .. [[\n\t\t\t</th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>Show/Hide HUD</td>\n\t\t\t<th style=\"text-align:right;\">Alt+7</th>\n\t\t</tr>\n\t</table>\n</div>]]\n\nhud_elements_type_list = \"\"\nhud_machines = \"\"\nhud_machine_detail = \"\"\n\nif hud_displayed == true then\n selected_type = elementsTypes[selected_index]\n elementsTypes = {}\n elements = {}\n selectedElementsId = {}\n for _,id in pairs(elementsId) do\n elementType = core.getElementTypeById(id)\n table.insert(elementsTypes, elementType)\n if selected_type == elementType then table.insert(selectedElementsId, id) end\n end\n elementsTypes = removeDuplicatesInTable(elementsTypes)\n table.sort(elementsTypes)\n maxPage = math.ceil(#selectedElementsId / elementsByPage)\n\n local minOnPage = ((page - 1) * elementsByPage) + 1\n local maxOnPage = page * elementsByPage\n local temp_elements_for_sorting = {}\n for i,id in pairs(selectedElementsId) do\n elementData = {}\n elementData.id = id\n elementData.name = core.getElementNameById(id)\n table.insert(temp_elements_for_sorting, elementData)\n end\n --sorting by name\n table.sort(temp_elements_for_sorting, function(a,b) return a.name:lower() < b.name:lower() end)\n --only get data from displayed elements\n for i,elementData in pairs(temp_elements_for_sorting) do\n if i >= minOnPage and i <= maxOnPage then\n elementType = core.getElementTypeById(elementData.id)\n if Storage.hasKey(elementData.id) == 1 then\n elementData = json.decode(Storage.getStringValue(elementData.id))\n end\n elementData.type = elementType\n elementData.name = core.getElementNameById(elementData.id)\n table.insert(elements, elementData)\n end\n end\n hud_elements_type_list = [[<div class=\"hud_list_container hud_container\">\n <div style=\"text-align:center;font-weight:bold;border-bottom:1px solid white;\">&#x2191; &nbsp;&nbsp; Ctrl+Arrow Up</div>\n ]]\n for i, elementType in pairs(elementsTypes) do\n hud_elements_type_list = hud_elements_type_list .. [[<div class=\"elementType]]\n if i == selected_index then \n hud_elements_type_list = hud_elements_type_list .. \" selected\"\n end\n local count = 0\n if machines_count[elementType:lower()] ~= nil then count = machines_count[elementType:lower()] end\n hud_elements_type_list = hud_elements_type_list .. [[\">\n \t<table style=\"width:100%;\">\n \t\t<tr>\n \t\t\t<th style=\"text-align:left;border-bottom:none;\">]].. elementType .. [[</th>\n \t\t\t<td style=\"text-align:right;border-bottom:none;\">]] .. count .. [[</td>\n \t\t</tr>\n \t</table>\n </div>\n ]]\n end\n hud_elements_type_list = hud_elements_type_list .. [[<div style=\"margin-top:10px;text-align:center;font-weight:bold;border-top:1px solid white;\">&#x2193; &nbsp;&nbsp; Ctrl+Arrow Down</div></div>]]\n local minOnPage = ((page - 1) * elementsByPage) + 1\n --local maxOnPage = page * elementsByPage\n --local maxOnPage = page * elementsByPage\n if maxOnPage > #selectedElementsId then maxOnPage = #selectedElementsId end\n hud_machines = [[<div class=\"hud_machines_container hud_container\">\n \t<div style=\"text-align:center;font-weight:bold;border-bottom:1px solid white;\">&#x2191; &nbsp;&nbsp; Arrow Up</div>\n \t<table class=\"elements_table\" style=\"width:100%\">\n \t\t<tr>\n \t\t\t<th>&#x2190; &nbsp;&nbsp; Arrow Left</th>\n \t\t\t<th> Page ]] .. page .. [[/]] .. maxPage .. [[ (from ]] .. minOnPage .. [[ to ]] .. maxOnPage .. [[)</th>\n \t\t\t<th>Arrow Right &nbsp;&nbsp; &#x2192;</th>\n \t\t</tr>\n \t</table>\n <table class=\"elements_table\">\n <tr>\n \t <th>id</th>\n <th>Machine Name</th>\n <th>Cycles From Start</th>\n <th>Efficacity</th>\n <th>Status</th>\n <th>Uptime</th>\n </tr>\n ]]\n for i, element in pairs(elements) do\n --system.print(json.encode(element))\n --system.print(elementType[selected_index])\n local status = \"-\"\n if element.status then status = element.status end\n local status_class = \"\"\n if status:lower():find(\"running\") then status_class = \"text-success\" end\n if status:lower():find(\"stopped\") then status_class = \"text-info\" end\n if status:lower():find(\"jammed\") then status_class = \"text-danger\" end\n if status:lower():find(\"pending\") then status_class = \"text-primary\" end\n status = status:gsub(\"JAMMED_\", \"\"):gsub(\"_\", \" \")\n local cyclesFromStart = \"-\"\n if element.cyclesFromStart then cyclesFromStart = element.cyclesFromStart end\n local efficiency = \"-\"\n if element.efficiency then efficiency = math.floor(element.efficiency*100) end\n local uptime = 0\n if element.uptime then uptime = math.floor(element.uptime) end\n hud_machines = hud_machines .. [[<tr]]\n if selected_machine_index == i then\n hud_machines = hud_machines .. [[ class=\"selected\"]]\n end\n local machine_id = \"-\"\n if element.id then machine_id = element.id end\n hud_machines = hud_machines .. [[>\n <th>]] .. machine_id .. [[</th>\n <th class=\"]] .. status_class .. [[\">]] .. element.name .. [[</th>\n <td>]] .. cyclesFromStart .. [[</td>\n <td>]] .. efficiency .. [[%</td>\n <th class=\"]] .. status_class .. [[\">]] .. status .. [[</th>\n <td class=\"]] .. status_class .. [[\">]] .. SecondsToClockString(uptime) .. [[</td>\n </tr>\n ]]\n end\n hud_machines = hud_machines .. [[</table>\n <table class=\"elements_table\" style=\"width:100%\">\n <tr>\n <th>&#x2190; &nbsp;&nbsp; Arrow Left</th>\n <th> Page ]] .. page .. [[/]] .. maxPage .. [[ (from ]] .. minOnPage .. [[ to ]] .. maxOnPage .. [[)</th>\n <th>Arrow Right &nbsp;&nbsp; &#x2192;</th>\n </tr>\n </table>\n <div style=\"text-align:center;font-weight:bold;border-top:1px solid white;\">&#x2193; &nbsp;&nbsp; Arrow Down</div>\n </div>]]\n if #elements > 0 then\n local selected_machine = elements[selected_machine_index]\n local status = \"-\"\n if selected_machine.status then status = selected_machine.status end\n local status_class = \"\"\n local machines_actions = {}\n if status:lower():find(\"running\") then status_class = \"text-success\" end\n if status:lower():find(\"stopped\") then status_class = \"text-info\" end\n if status:lower():find(\"jammed\") then status_class = \"text-danger\" end\n if status:lower():find(\"pending\") then status_class = \"text-primary\" end\n status = status:gsub(\"JAMMED_\", \"\"):gsub(\"_\", \" \")\n hud_machine_detail = [[<div class=\"hud_machine_detail hud_container\">\n \t\t<table>\n \t\t\t<tr>\n \t\t\t\t<th colspan=\"3\">]] .. selected_machine.name .. [[</th>\n \t\t\t</tr>\n \t\t\t<tr>\n \t\t\t\t<th class=\"]] .. status_class .. [[\" colspan=\"3\">]] .. status .. [[</th>\n \t\t\t</tr>\n ]]\n if status == \"-\" then\n command_1 = \"\"\n command_2 = \"\"\n command_3 = \"\"\n hud_machine_detail = hud_machine_detail .. [[\n \t<tr>\n \t\t<td>Machine Not Connected</td>\n \t</tr>\n ]]\n elseif status:lower():find(\"stopped\") then\n command_1 = \"START\"\n command_2 = \"BATCH\"\n command_3 = \"MAINTAIN\"\n hud_machine_detail = hud_machine_detail .. [[\n \t<tr>\n \t\t<th>START</th>\n \t\t<th></th>\n \t\t<th>ALT+1</th>\n \t</tr>\n \t<tr>\n \t\t<th style=\"height:65px;\">BATCH</th>\n \t\t<th rowspan=\"2\">\n \t\t\t<table>\n \t\t\t\t<tr>\n \t\t\t\t\t<th colspan=\"3\">&#x2191; &nbsp;&nbsp; Alt+Arrow Up</th>\n \t\t\t\t</tr>\n \t\t\t\t<tr>\n \t\t\t\t\t<th colspan=\"3\">Quantity:</th>\n \t\t\t\t</tr>\n \t\t\t\t<tr>\n \t\t\t\t\t<th>&#x2190; &nbsp;&nbsp; Alt+<br>Arrow Left</th>\n \t\t\t\t\t<th style=\"font-size:20px;\">\n ]]\n for digit_index,digit in pairs(craft_quantity_digits) do\n if digit_index == (#craft_quantity_digits - craft_selected_digit + 1) then\n \thud_machine_detail = hud_machine_detail .. [[<span class=\"text-success\">]]\n end\n hud_machine_detail = hud_machine_detail .. digit\n if digit_index == (#craft_quantity_digits - craft_selected_digit + 1) then\n \thud_machine_detail = hud_machine_detail .. [[</span>]]\n end\n end\n hud_machine_detail = hud_machine_detail .. [[\n \t\t\t\t</th>\n \t\t\t\t<th>Alt+ &nbsp;&nbsp; &#x2192;<br>Arrow Right</th>\n \t\t\t </tr>\n <tr>\n <th colspan=\"3\" style=\"border-bottom:none;\">&#x2193; &nbsp;&nbsp; Alt+Arrow Down</th>\n </tr>\n </table>\n \t\t</th>\n \t\t<th>ALT+2</th>\n \t</tr>\n \t<tr>\n \t\t<th>MAINTAIN</th>\n \t\t<th>ALT+3</th>\n \t</tr>\n ]]\n else\n command_1 = \"STOP\"\n command_2 = \"SOFT_STOP\"\n command_3 = \"\"\n hud_machine_detail = hud_machine_detail .. [[\n \t<tr>\n \t\t<th>STOP</th>\n \t\t<th>ALT+1</th>\n \t</tr>\n \t<tr>\n \t\t<th>FINISH AND STOP</th>\n \t\t<th>ALT+2</th>\n \t</tr>\n ]]\n \n end\n hud_machine_detail = hud_machine_detail .. [[</table></div>]]\n end\nend\nsystem.setScreen(hud_main_css .. hud_help_command .. hud_elements_type_list .. hud_machines .. hud_machine_detail)", 129 + "filter": { 130 + "args": [], 131 + "signature": "update()", 132 + "slotKey": "-2" 133 + }, 134 + "key": "3" 135 + }, 136 + { 137 + "code": "hud_displayed = not hud_displayed", 138 + "filter": { 139 + "args": [ 140 + { 141 + "value": "option7" 142 + } 143 + ], 144 + "signature": "actionStart(action)", 145 + "slotKey": "-2" 146 + }, 147 + "key": "4" 148 + }, 149 + { 150 + "code": "if Alt_pressed == true then\n if craft_selected_digit < #craft_quantity_digits then\n craft_selected_digit = craft_selected_digit + 1\n end\nelse\n if page > 1 then\n page = page - 1\n selected_machine_index = 1\n Storage.clear()\n end\nend", 151 + "filter": { 152 + "args": [ 153 + { 154 + "value": "strafeleft" 155 + } 156 + ], 157 + "signature": "actionStart(action)", 158 + "slotKey": "-2" 159 + }, 160 + "key": "5" 161 + }, 162 + { 163 + "code": "if Alt_pressed == true then\n if craft_selected_digit > 1 then\n craft_selected_digit = craft_selected_digit - 1\n end\nelse\n if page < maxPage then\n page = page + 1\n selected_machine_index = 1\n Storage.clear()\n end\nend", 164 + "filter": { 165 + "args": [ 166 + { 167 + "value": "straferight" 168 + } 169 + ], 170 + "signature": "actionStart(action)", 171 + "slotKey": "-2" 172 + }, 173 + "key": "6" 174 + }, 175 + { 176 + "code": "if Ctrl_pressed == true and Alt_pressed == false then\n if selected_index > 1 then\n selected_index = selected_index - 1\n selected_machine_index = 1\n page = 1\n Storage.clear()\n craft_quantity_digits = {\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\"}\n end\nelseif Alt_pressed == true and Ctrl_pressed == false then\n local digit_index = #craft_quantity_digits - craft_selected_digit + 1\n local value = tonumber(craft_quantity_digits[digit_index]) + 1\n if value >= 10 then value = 0 end\n craft_quantity_digits[digit_index] = tostring(value)\nelse\n if selected_machine_index > 1 then\n selected_machine_index = selected_machine_index - 1\n craft_quantity_digits = {\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\"}\n end\nend", 177 + "filter": { 178 + "args": [ 179 + { 180 + "value": "up" 181 + } 182 + ], 183 + "signature": "actionStart(action)", 184 + "slotKey": "-2" 185 + }, 186 + "key": "7" 187 + }, 188 + { 189 + "code": "if Ctrl_pressed == true and Alt_pressed == false then\n if selected_index < #elementsTypes then\n selected_index = selected_index + 1\n selected_machine_index = 1\n page = 1\n Storage.clear()\n craft_quantity_digits = {\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\"}\n end\nelseif Alt_pressed == true and Ctrl_pressed == false then\n local digit_index = #craft_quantity_digits - craft_selected_digit + 1\n local value = tonumber(craft_quantity_digits[digit_index]) - 1\n if value < 0 then value = 9 end\n craft_quantity_digits[digit_index] = tostring(value)\nelse\n if selected_machine_index < #elements then\n selected_machine_index = selected_machine_index + 1\n craft_quantity_digits = {\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\"}\n end\nend", 190 + "filter": { 191 + "args": [ 192 + { 193 + "value": "down" 194 + } 195 + ], 196 + "signature": "actionStart(action)", 197 + "slotKey": "-2" 198 + }, 199 + "key": "8" 200 + }, 201 + { 202 + "code": "Ctrl_pressed = true", 203 + "filter": { 204 + "args": [ 205 + { 206 + "value": "brake" 207 + } 208 + ], 209 + "signature": "actionStart(action)", 210 + "slotKey": "-2" 211 + }, 212 + "key": "9" 213 + }, 214 + { 215 + "code": "Ctrl_pressed = false", 216 + "filter": { 217 + "args": [ 218 + { 219 + "value": "brake" 220 + } 221 + ], 222 + "signature": "actionStop(action)", 223 + "slotKey": "-2" 224 + }, 225 + "key": "10" 226 + }, 227 + { 228 + "code": "Alt_pressed = true", 229 + "filter": { 230 + "args": [ 231 + { 232 + "value": "lalt" 233 + } 234 + ], 235 + "signature": "actionStart(action)", 236 + "slotKey": "-2" 237 + }, 238 + "key": "11" 239 + }, 240 + { 241 + "code": "Alt_pressed = false", 242 + "filter": { 243 + "args": [ 244 + { 245 + "value": "lalt" 246 + } 247 + ], 248 + "signature": "actionStop(action)", 249 + "slotKey": "-2" 250 + }, 251 + "key": "12" 252 + }, 253 + { 254 + "code": "--Send Command 1\nlocal selected_machine = elements[selected_machine_index]\nfor _,db in pairs(databanks) do\n if db.hasKey(selected_machine.id) == 1 then\n selected_machine.command = command_1\n db.setStringValue(selected_machine.id, json.encode(selected_machine))\n end\nend", 255 + "filter": { 256 + "args": [ 257 + { 258 + "value": "option1" 259 + } 260 + ], 261 + "signature": "actionStart(action)", 262 + "slotKey": "-2" 263 + }, 264 + "key": "13" 265 + }, 266 + { 267 + "code": "--Send Command 12\nlocal selected_machine = elements[selected_machine_index]\nfor _,db in pairs(databanks) do\n if db.hasKey(selected_machine.id) == 1 then\n if command_2:find(\"MAINTAIN\") or command_2:find(\"BATCH\") then\n craft_quantity = \"\"\n for _,digit in pairs(craft_quantity_digits) do\n craft_quantity = craft_quantity .. digit\n end\n command_2 = command_2 .. \"_\" .. craft_quantity\n end\n selected_machine.command = command_2\n db.setStringValue(selected_machine.id, json.encode(selected_machine))\n if command_2:find(\"MAINTAIN\") then command_2 = \"MAINTAIN\" end\n if command_2:find(\"BATCH\") then command_2 = \"BATCH\" end\n end\nend", 268 + "filter": { 269 + "args": [ 270 + { 271 + "value": "option2" 272 + } 273 + ], 274 + "signature": "actionStart(action)", 275 + "slotKey": "-2" 276 + }, 277 + "key": "14" 278 + }, 279 + { 280 + "code": "--Send Command 3\nlocal selected_machine = elements[selected_machine_index]\nfor _,db in pairs(databanks) do\n if db.hasKey(selected_machine.id) == 1 then\n if command_3:find(\"MAINTAIN\") or command_3:find(\"BATCH\") then\n craft_quantity = \"\"\n for _,digit in pairs(craft_quantity_digits) do\n craft_quantity = craft_quantity .. digit\n end\n command_3 = command_3 .. \"_\" .. craft_quantity\n end\n selected_machine.command = command_3\n db.setStringValue(selected_machine.id, json.encode(selected_machine))\n if command_3:find(\"MAINTAIN\") then command_3 = \"MAINTAIN\" end\n if command_3:find(\"BATCH\") then command_3 = \"BATCH\" end\n end\nend", 281 + "filter": { 282 + "args": [ 283 + { 284 + "value": "option3" 285 + } 286 + ], 287 + "signature": "actionStart(action)", 288 + "slotKey": "-2" 289 + }, 290 + "key": "15" 291 + }, 292 + { 293 + "code": "--[[\n\tDatabank HUB\n\tInspired by the original BankRaid Script written by ilodev\n\tModified to act like a databank hub by Jericho (read and clear only)\n]]\nbankhub = {}\n\nfunction bankhub:new(banks)\n o = {}\n setmetatable(o, self);\n self.__index = self;\n o.banks = banks or {}\n\n -- databank shortcuts to allow in-game syntax.\n function o.clear() return o:_clear() end\n function o.getNbKeys() return o:_getNbKeys() end\n function o.getKeys() return o:_getKeys() end\n function o.hasKey(key) return o:_hasKey(key) end\n function o.getStringValue(key) return o:_getStringValue(key) end\n function o.getIntValue(key) return o:_getIntValue(key) end\n function o.getFloatValue(key) return o:_getFloatValue(key) end\n\n return o\nend\n--- Adds another databank to the raid.\n--- @param object The databank unit to add.\nfunction bankhub:add(element)\n table.insert( self.banks, element)\n self.banks_size = #self.banks\nend\n--- Clears the databank array\nfunction bankhub:_clear()\n for _,bank in pairs(self.banks) do bank.clear() end\nend\n--- Returns the number of keys in the entire databank table\n--- @return integer number of total keys\nfunction bankhub:_getNbKeys()\n local res = 0\n for _,bank in pairs(self.banks) do res = res + bank.getNbKeys() end\n return res\nend\n\n--- Returns all the keys in the databank array\n--- @return string json encoded string of keys\nfunction bankhub:_getKeys()\n local res = {}\n for _,bank in pairs(self.banks) do\n local keys = json.decode(bank.getKeys())\n for _,k in pairs(keys) do table.insert(res, k) end\n end\n return json.encode(res)\nend\n\n--- Checks if a key exists in the databank array\n--- @param string key\n--- @return boolean returns 1 if the array holds this key.\nfunction bankhub:_hasKey(key)\n for _,bank in pairs(self.banks) do\n if (bank.hasKey(key) == 1) then return 1 end\n end\n return 0\nend\n\n--- Returns the value of the key if existing\n--- @param string key\n--- @return string returns value or nil\nfunction bankhub:_getStringValue(key)\n for _,bank in pairs(self.banks) do\n if (bank.hasKey(key) == 1) then\n return bank.getStringValue(key)\n end\n end\n return nil\nend\n\n--- Returns the integer value of the key if existing\n--- @param string key\n--- @return number returns value or nil\nfunction bankhub:_getIntValue(key)\n for _,bank in pairs(self.banks) do\n if (bank.hasKey(key) == 1) then\n return banks.getIntValue(key)\n end\n end\n return nil\nend\n\n--- Returns the float value of the key if existing\n--- @param string key\n--- @return number returns value or nil\nfunction bankhub:_getFloatValue(key)\n for _,bank in pairs(self.banks) do\n if (bank.hasKey(key) == 1) then\n return banks.getFloatValue(key)\n end\n end\n return nil\nend", 294 + "filter": { 295 + "args": [], 296 + "signature": "start()", 297 + "slotKey": "-3" 298 + }, 299 + "key": "16" 300 + }, 301 + { 302 + "code": "--[[\n\tRemove duplicate elements in a lua table\n\tBy Jericho\n]]\nfunction removeDuplicatesInTable(data) \n local hash = {}\n local res = {}\n for _,v in ipairs(data) do\n if (not hash[v]) then\n res[#res+1] = v\n hash[v] = true\n end\n end\n return res\nend", 303 + "filter": { 304 + "args": [], 305 + "signature": "start()", 306 + "slotKey": "-3" 307 + }, 308 + "key": "17" 309 + }, 310 + { 311 + "code": "--[[\n\tConvert timestamp in a string representing a dureation in days, hours, minutes and seconds\n\tBy Jericho\n]]\nfunction SecondsToClockString(seconds)\n local seconds = tonumber(seconds)\n\n if seconds == nil or seconds <= 0 then\n return \"-\";\n else\n days = string.format(\"%2.f\", math.floor(seconds/(3600*24)));\n hours = string.format(\"%2.f\", math.floor(seconds/3600 - (days*24)));\n mins = string.format(\"%2.f\", math.floor(seconds/60 - (hours*60) - (days*24*60)));\n secs = string.format(\"%2.f\", math.floor(seconds - hours*3600 - (days*24*60*60) - mins *60));\n str = \"\"\n if tonumber(days) > 0 then str = str .. days..\"d \" end\n if tonumber(hours) > 0 then str = str .. hours..\"h \" end\n if tonumber(mins) > 0 then str = str .. mins..\"m \" end\n if tonumber(secs) > 0 then str = str .. secs ..\"s\" end\n return str\n end\nend", 312 + "filter": { 313 + "args": [], 314 + "signature": "start()", 315 + "slotKey": "-3" 316 + }, 317 + "key": "18" 318 + }, 319 + { 320 + "code": "--[[\n\tClock script from Leodr, modified and updated by Jericho\n\toriginal script: https://github.com/leodr99/DU-quick_n_dirty-scripts/blob/main/clock/clock.lua\n]]\n--Globals\nlocal outputTime = false --for debug\nlocal summertime = false --export: summer time enabled\n--\n--//functions\nfunction epochTime()\n function rZ(data)\n if string.len(data) <= 1 then\n return \"0\" .. data\n else\n return data\n end\n end\n function dPoint(value)\n if not(value == math.floor(value)) then\n return true\n else\n return false\n end\n end\n function lYear(year)\n if(not dPoint(year / 4)) then\n if(dPoint(year / 100)) then\n return true\n else\n if(not dPoint(year / 400)) then\n return true\n else\n return false\n end\n end\n else\n return false\n end\n end\n \n local timeStampDayOfWeak = 5\n local secondsInHour = 3600\n local secondsInDay = 86400\n local secondsInYear = 31536000\n local secondsInLeapYear = 31622400\n local monthWith28 = 2419200\n local monthWith29 = 2505600\n local monthWith30 = 2592000\n local monthWith31 = 2678400\n local monthsWith30 = {4, 6, 9, 11}\n local monthsWith31 = {1, 3, 5, 7, 8, 10, 12}\n local daysSinceEpoch = 0\n local duEpochOffset = 1506816000 --(Oct. 1, 2017, at 00:00) //1506729600\n local DOWAssociates = {\"Tur,\", \"Fri,\", \"Sat,\", \"Sun,\", \"Mon,\", \"Tue,\", \"Wed,\"}\n \tlocal getTime = system.getTime()\n \tif summertime == true then getTime = getTime + 3600 end\n \n now = math.floor(getTime + duEpochOffset)\n year = 1970 --the original epoch time (1/1/1970), in order to match DU's epoch offset.\n secs = 0\n daysSinceEpoch = 0\n while((secs + secondsInLeapYear) < now or (secs + secondsInYear) < now) do\n if(lYear(year+1)) then\n if((secs + secondsInLeapYear) < now) then\n secs = secs + secondsInLeapYear\n year = year + 1\n daysSinceEpoch = daysSinceEpoch + 366\n end\n else\n if((secs + secondsInYear) < now) then\n secs = secs + secondsInYear\n year = year + 1\n daysSinceEpoch = daysSinceEpoch + 365\n end\n end\n end\n secondsRemaining = now - secs\n monthSecs = 0\n yearlYear = lYear(year)\n month = 1 -- January\n while((monthSecs + monthWith28) < secondsRemaining or (monthSecs + monthWith30) < secondsRemaining or (monthSecs + monthWith31) < secondsRemaining) do\n if(month == 1) then\n if((monthSecs + monthWith31) < secondsRemaining) then\n month = 2\n monthSecs = monthSecs + monthWith31\n daysSinceEpoch = daysSinceEpoch + 31\n else\n break\n end\n end\n if(month == 2) then\n if(not yearlYear) then\n if((monthSecs + monthWith28) < secondsRemaining) then\n month = 3\n monthSecs = monthSecs + monthWith28\n daysSinceEpoch = daysSinceEpoch + 28\n else\n break\n end\n else\n if((monthSecs + monthWith29) < secondsRemaining) then\n month = 3\n monthSecs = monthSecs + monthWith29\n daysSinceEpoch = daysSinceEpoch + 29\n else\n break\n end\n end\n end\n if(month == 3) then\n if((monthSecs + monthWith31) < secondsRemaining) then\n month = 4\n monthSecs = monthSecs + monthWith31\n daysSinceEpoch = daysSinceEpoch + 31\n else\n break\n end\n end\n if(month == 4) then\n if((monthSecs + monthWith30) < secondsRemaining) then\n month = 5\n monthSecs = monthSecs + monthWith30\n daysSinceEpoch = daysSinceEpoch + 30\n else\n break \n end\n end\n if(month == 5) then\n if((monthSecs + monthWith31) < secondsRemaining) then\n month = 6\n monthSecs = monthSecs + monthWith31\n daysSinceEpoch = daysSinceEpoch + 31\n else\n break\n end\n end\n if(month == 6) then\n if((monthSecs + monthWith30) < secondsRemaining) then\n month = 7\n monthSecs = monthSecs + monthWith30\n daysSinceEpoch = daysSinceEpoch + 30\n else\n break\n end\n end\n if(month == 7) then\n if((monthSecs + monthWith31) < secondsRemaining) then\n month = 8\n monthSecs = monthSecs + monthWith31\n daysSinceEpoch = daysSinceEpoch + 31\n else\n break\n end\n end\n if(month == 8) then\n if((monthSecs + monthWith31) < secondsRemaining) then\n month = 9\n monthSecs = monthSecs + monthWith31\n daysSinceEpoch = daysSinceEpoch + 31\n else\n break\n end\n end\n if(month == 9) then\n if((monthSecs + monthWith30) < secondsRemaining) then\n month = 10\n monthSecs = monthSecs + monthWith30\n daysSinceEpoch = daysSinceEpoch + 30\n else\n break\n end\n end\n if(month == 10) then\n if((monthSecs + monthWith31) < secondsRemaining) then\n month = 11\n monthSecs = monthSecs + monthWith31\n daysSinceEpoch = daysSinceEpoch + 31\n else\n break\n end\n end\n if(month == 11) then\n if((monthSecs + monthWith30) < secondsRemaining) then\n month = 12\n monthSecs = monthSecs + monthWith30\n daysSinceEpoch = daysSinceEpoch + 30\n else\n break\n end\n end\n end\n day = 1 -- 1st\n daySecs = 0\n daySecsRemaining = secondsRemaining - monthSecs\n while((daySecs + secondsInDay) < daySecsRemaining) do\n day = day + 1\n daySecs = daySecs + secondsInDay\n daysSinceEpoch = daysSinceEpoch + 1\n end\n hour = 0 -- Midnight\n hourSecs = 0\n hourSecsRemaining = daySecsRemaining - daySecs\n while((hourSecs + secondsInHour) < hourSecsRemaining) do\n hour = hour + 1\n hourSecs = hourSecs + secondsInHour\n end\n minute = 0 -- Midnight\n minuteSecs = 0\n minuteSecsRemaining = hourSecsRemaining - hourSecs\n while((minuteSecs + 60) < minuteSecsRemaining) do\n minute = minute + 1\n minuteSecs = minuteSecs + 60\n end\n second = math.floor(now % 60)\n year = rZ(year)\n month = rZ(month)\n day = rZ(day)\n hour = rZ(hour)\n minute = rZ(minute)\n second = rZ(second)\n remanderForDOW = daysSinceEpoch % 7\n DOW = DOWAssociates[remanderForDOW]\n \n if(outputTime) then\n str = \"Year: \" .. year .. \", Month: \" .. month .. \", Day: \" .. day .. \", Hour: \" .. hour .. \", Minute: \" .. minute .. \", Second: \".. second .. \", Day of Week: \" .. DOW\n system.print(str)\n end\n return year, month, day, hour, minute, second, DOW\nend", 321 + "filter": { 322 + "args": [], 323 + "signature": "start()", 324 + "slotKey": "-3" 325 + }, 326 + "key": "19" 327 + } 328 + ], 329 + "methods": [], 330 + "events": [] 331 + }