[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.

customizable storage monitoring prefix

Thomas (Nov 11, 2020, 12:37 PM +0100) d6778f7b 91540aa6

+42 -34
+2 -2
Master program/config.json
··· 94 94 }, 95 95 "handlers": [ 96 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\ncontainer_proficiency_lvl = 0 --export: Talent level for Container Proficiency\ncontainer_fill_red_level = 10 --export: The percent fill below gauge will be red\ncontainer_fill_yellow_level = 50 --export: The percent fill below gauge will be yellow\nenableRefinerMonitoring = true --export: enable or disable the Refiners monitoring\nenableAssemblyMonitoring = true --export: enable or disable the Assembly lines monitoring\nenableSmelterMonitoring = true --export: enable or disable the Smelters monitoring\nenableChemicalMonitoring = true --export: enable or disable the Chemical industries monitoring\nenableElectronicsMonitoring = true --export: enable or disable the Electronics Industries monitoring\nenableGlassMonitoring = true --export: enable or disable the Glass Furnace monitoring\nenableHoneycombMonitoring = true --export: enable or disable the Honeycomb Refineries monitoring\nenableRecyclerMonitoring = true --export: enable or disable the Recyclers monitoring\nenableMetalworkMonitoring = true --export: enable or disable the Metalworks monitoring\nenable3DPrinterMonitoring = true --export: enable or disable the 3D Printers monitoring\nenableTransferMonitoring = true --export: enable or disable the transfer units monitoring\nenableContainerMonitoring = true --export: enable or disable the containers and hubs monitoring\nrefreshSpeed = 1 --export: the refresh speed of data in seconds\nelementsByPage = 20 --export: maximum amount of elements displayed on a single page\ndateFormat = \"en\" --export: the country code to format the date\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():find(\"coreunit\") 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\nelementsId = {}\nelements = {}\nelementsTypes = {}\nmachines_count = {}\nmachines_count.total = 0\ncoreOffset = 16\ninitIndex = 1\nif core ~= nil and Storage then\n\telementsIdList = core.getElementIdList()\n --system.print(#elementsIdList)\n unit.setTimer(\"init\",1)\nend\n\nelementsTypes = removeDuplicatesInTable(elementsTypes)\n\nsystem.showScreen(1)\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\"}\nrefresh_id_list = {}\ncraft_selected_digit = 1\ncommand_1 = \"\"\ncommand_2 = \"\"\ncommand_3 = \"\"\nmarkers = {}\nrefreshActivated = true", 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\ncontainer_proficiency_lvl = 0 --export: Talent level for Container Proficiency\ncontainer_fill_red_level = 10 --export: The percent fill below gauge will be red\ncontainer_fill_yellow_level = 50 --export: The percent fill below gauge will be yellow\nenableRefinerMonitoring = true --export: enable or disable the Refiners monitoring\nenableAssemblyMonitoring = true --export: enable or disable the Assembly lines monitoring\nenableSmelterMonitoring = true --export: enable or disable the Smelters monitoring\nenableChemicalMonitoring = true --export: enable or disable the Chemical industries monitoring\nenableElectronicsMonitoring = true --export: enable or disable the Electronics Industries monitoring\nenableGlassMonitoring = true --export: enable or disable the Glass Furnace monitoring\nenableHoneycombMonitoring = true --export: enable or disable the Honeycomb Refineries monitoring\nenableRecyclerMonitoring = true --export: enable or disable the Recyclers monitoring\nenableMetalworkMonitoring = true --export: enable or disable the Metalworks monitoring\nenable3DPrinterMonitoring = true --export: enable or disable the 3D Printers monitoring\nenableTransferMonitoring = true --export: enable or disable the transfer units monitoring\nenableContainerMonitoring = true --export: enable or disable the containers and hubs monitoring\ncontainerMonitoringPrefix = \"MONIT_\" --export: the prefix used to enable container monitoring\nrefreshSpeed = 1 --export: the refresh speed of data in seconds\nelementsByPage = 20 --export: maximum amount of elements displayed on a single page\ndateFormat = \"en\" --export: the country code to format the date\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():find(\"coreunit\") 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\nelementsId = {}\nelements = {}\nelementsTypes = {}\nmachines_count = {}\nmachines_count.total = 0\ncoreOffset = 16\ninitIndex = 1\nif core ~= nil and Storage then\n\telementsIdList = core.getElementIdList()\n --system.print(#elementsIdList)\n unit.setTimer(\"init\",1)\nend\n\nelementsTypes = removeDuplicatesInTable(elementsTypes)\n\nsystem.showScreen(1)\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\"}\nrefresh_id_list = {}\ncraft_selected_digit = 1\ncommand_1 = \"\"\ncommand_2 = \"\"\ncommand_3 = \"\"\nmarkers = {}\nrefreshActivated = true", 98 98 "filter": { 99 99 "args": [], 100 100 "signature": "start()", ··· 138 138 "key": "3" 139 139 }, 140 140 { 141 - "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 .hud_container {\n border: 2px solid orange;\n border-radius:10px;\n background-color: rgba(0,0,0,.75);\n padding:10px;\n }\n .hud_help_commands {\n position: absolute;\n top: ]] .. tostring((10/1080)*100) .. [[vh;\n left: ]] .. tostring((50/1920)*100) .. [[vw;\n text-transform: uppercase;\n font-weight: bold;\n }\n .hud_list_container {\n position: absolute;\n top: ]] .. tostring((125/1080)*100) .. [[vh;\n left: ]] .. tostring((50/1920)*100) .. [[vw;\n text-transform: uppercase;\n font-weight: bold;\n }\n .hud_machine_detail {\n position: absolute;\n top: ]] .. tostring((125/1080)*100) .. [[vh;\n right: ]] .. tostring((450/1920)*100) .. [[vw;\n text-transform: uppercase;\n font-weight: bold;\n }\n .hud_machines_container {\n position: absolute;\n top: ]] .. tostring((125/1080)*100) .. [[vh;\n left: ]] .. tostring((300/1920)*100) .. [[vw;\n }\n .elementType {\n margin-top:10px;\n border-radius:5px;\n }\n .elementType.selected {\n border: 2px solid green;\n background-color: rgba(0,200,0,.45);\n }\n tr.selected td, tr.selected th{\n border: 2px solid green;\n background-color: rgba(0,200,0,.1);\n }\n td, th {\n border-bottom:1px solid white;\n padding:5px;\n text-align: center;\n }\n th {\n font-weight: bold;\n }\n .text-success{color: #28a745;}\n .text-danger{color:#dc3545;}\n .text-warning{color:#ffc107;}\n .text-info{color:#17a2b8;}\n .text-primary{color:#007bff;}\n .text-orangered{color:orangered;}\n .bg-success{background-color: #28a745;}\n .bg-danger{background-color:#dc3545;}\n .bg-warning{background-color:#ffc107;}\n .bg-info{background-color:#17a2b8;}\n .bg-primary{background-color:#007bff;}\n </style>\n]]\n\nlocal refreshStatusText = [[<span class=\"text-success\">Disable Data Collection</span>]]\nif refreshActivated == false then\n refreshStatusText = [[<span class=\"text-danger\">Enable Data Collection</span>]]\nend\n\nhud_help_command = [[<div class=\"hud_help_commands hud_container\">\n <table>\n <tr>\n <th colspan=\"2\">\n ]] .. dateStr .. [[\n </th>\n </tr>\n <tr>\n <td>Show/Hide HUD</td>\n <th style=\"text-align:right;\">Alt+7</th>\n </tr>\n <tr>\n \t<td>]] .. refreshStatusText .. [[</td>\n \t<th style=\"text-align:right;\">Alt+8</th>\n </tr>\n </table>\n</div>]]\nif initIndex >= #elementsIdList then\n unit.stopTimer(\"init\")\n hud_elements_type_list = \"\"\n hud_machines = \"\"\n hud_machine_detail = \"\"\n\n if hud_displayed == true then\n selected_type = elementsTypes[selected_index]\n elementsTypes = {}\n elements = {}\n refresh_id_list = {}\n selectedElementsId = {}\n for _,id in pairs(elementsId) do\n elementType = core.getElementTypeById(id)\n local elementName = core.getElementNameById(id):lower()\n if\n (elementType:lower():find(\"container\") and elementName:find(\"monit_\"))\n or (not elementType:lower():find(\"container\"))\n then\n table.insert(elementsTypes, elementType)\n end\n if selected_type == elementType then\n if\n (elementType:lower():find(\"container\") and elementName:find(\"monit_\"))\n or (not elementType:lower():find(\"container\"))\n then\n table.insert(selectedElementsId, id)\n end\n end\n end\n elementsTypes = removeDuplicatesInTable(elementsTypes)\n table.sort(elementsTypes, function(a,b) return a:lower() < b:lower() end)\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 table.sort(temp_elements_for_sorting, function(a,b) return a.name:lower() < b.name:lower() end)\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 = MyJson.parse(Storage.getStringValue(elementData.id))\n end\n elementData.type = elementType\n elementData.name = core.getElementNameById(elementData.id)\n elementData.position = core.getElementPositionById(elementData.id)\n table.insert(refresh_id_list, 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 <table style=\"width:100%;\">\n <tr>\n <th style=\"text-align:left;border-bottom:none;\">]].. elementType .. [[</th>\n <td style=\"text-align:right;border-bottom:none;\">]] .. count .. [[</td>\n </tr>\n </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 if maxOnPage > #selectedElementsId then maxOnPage = #selectedElementsId end\n hud_machines = [[<div class=\"hud_machines_container hud_container\">\n <div style=\"text-align:center;font-weight:bold;border-bottom:1px solid white;\">&#x2191; &nbsp;&nbsp; Arrow Up</div>\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 <table class=\"elements_table\" style=\"width:100%;\">]]\n if elementsTypes[selected_index]:lower():find(\"container\") then\n hud_machines = hud_machines .. [[\n <tr>\n <th>id</th>\n <th>Item Name</th>\n <th>Container Size</th>\n <th>Item Type</th>\n <th>Unit Mass</th>\n <th>Total Mass</th>\n <th>Amount of Items</th>\n ]]\n if not elementsTypes[selected_index]:lower():find(\"hub\") then\n hud_machines = hud_machines .. [[\n <th>Container Fill</th>\n ]]\n end\n hud_machines = hud_machines .. [[</tr>\n ]]\n for i, element in pairs(elements) do\n local splittedName = strSplit(element.name, \"_\")\n local itemName = splittedName[2]\n local machine_id = \"-\"\n if element.id then machine_id = element.id end\n local container_size = \"hub\"\n local container_empty_mass = getIngredient(\"Container Hub\").mass\n local container_volume = 0\n local contentQuantity = 0\n local ingredient = getIngredient(cleanName(itemName))\n if not element.type:lower():find(\"hub\") then\n local containerMaxHP = core.getElementMaxHitPointsById(element.id)\n if containerMaxHP > 17000 then\n container_size = \"L\"\n container_empty_mass = getIngredient(\"Container L\").mass\n container_volume = 128000 * (container_proficiency_lvl * 0.1) + 128000\n elseif containerMaxHP > 7900 then\n container_size = \"M\"\n container_empty_mass = getIngredient(\"Container M\").mass\n container_volume = 64000 * (container_proficiency_lvl * 0.1) + 64000\n elseif containerMaxHP > 900 then\n container_size = \"S\"\n container_empty_mass = getIngredient(\"Container S\").mass\n container_volume = 8000 * (container_proficiency_lvl * 0.1) + 8000\n else\n container_size = \"XS\"\n container_empty_mass = getIngredient(\"Container XS\").mass\n container_volume = 1000 * (container_proficiency_lvl * 0.1) + 1000\n end\n end\n local totalMass = core.getElementMassById(element.id)\n local contentMassKg = totalMass - container_empty_mass\n local contentMass = contentMassKg\n local contentMassUnit = \"Kg\"\n if contentMass > 1000 then\n contentMass = contentMass/1000\n contentMassUnit = \"T\"\n end\n contentMass = utils.round(contentMass*100)/100\n contentQuantity = contentMassKg / ingredient.mass\n local contentPercent = 0\n if (not element.type:lower():find(\"hub\")) --not a hub\n and (not ingredient.type:lower():find(\"error\")) --not item not found\n then\n contentPercent = math.floor((ingredient.volume * contentQuantity)*100/container_volume)\n end\n hud_machines = hud_machines .. [[<tr]]\n if selected_machine_index == i then\n hud_machines = hud_machines .. [[ class=\"selected\"]]\n end\n hud_machines = hud_machines .. [[>\n <th>]] .. machine_id .. [[</th>\n <th>]] .. itemName .. [[</th>\n <td>]] .. container_size .. [[</td>\n <td>]] .. ingredient.type .. [[</td>\n <td>]] .. ingredient.mass .. [[</td>\n <td>]] .. contentMass .. \" \" .. contentMassUnit .. [[</td>\n <td>]] .. utils.round(contentQuantity*100)/100 .. [[</td>\n ]]\n if not element.type:lower():find(\"hub\") then\n local gauge_color_class = \"bg-success\"\n local text_color_class = \"\"\n if contentPercent < container_fill_red_level then\n gauge_color_class = \"bg-danger\"\n elseif contentPercent < container_fill_yellow_level then\n gauge_color_class = \"bg-warning\"\n text_color_class = \"text-orangered\"\n end\n if ingredient.type:lower():find(\"error\") then\n hud_machines = hud_machines .. [[\n <th style=\"position:relative;width: ]] .. tostring((150/1920)*100) .. [[vw;\">\n -\n </th>\n </tr>\n ]]\n else\n hud_machines = hud_machines .. [[\n <th style=\"position:relative;width: ]] .. tostring((150/1920)*100) .. [[vw;\">\n <div class=\"]] .. gauge_color_class .. [[\" style=\"width:]] .. contentPercent .. [[%;\">&nbsp;</div>\n <div class=\"]] .. text_color_class .. [[\" style=\"position:absolute;width:100%;top:0;padding-top:5px;font-weight:bold;\">\n ]] .. contentPercent .. [[%\n </div>\n </th>\n </tr>\n ]]\n end\n end\n end\n else\n hud_machines = hud_machines .. [[\n <tr>\n <th>id</th>\n <th>Machine Name</th>\n <th>Cycles From Start</th>\n <th>Efficiency</th>\n <th>Status</th>\n <th>Uptime</th>\n </tr>\n ]]\n for i, element in pairs(elements) do\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 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 --Special Thx to Rutik for his help on how to get the exact the position of the element\n local position = vec3(selected_machine.position)\n local x = position.x - coreOffset\n local y = position.y - coreOffset\n local z = position.z - coreOffset\n local offset1 = 1\n local offset15 = 1.5\n local offset2 = 2\n local offset25 = 2.5\n local offsetFromCenter = 0\n if selected_machine.type:lower():find(\"container\") then\n offset1 = 0\n offset15 = 0\n offset2 = 0\n offset25 = 0\n end\n if selected_machine.type:lower() == \"container\" then\n local containerMaxHP = core.getElementMaxHitPointsById(selected_machine.id)\n if containerMaxHP > 17000 then\n offsetFromCenter = 4\n elseif containerMaxHP > 7900 then\n offsetFromCenter = 2\n elseif containerMaxHP > 900 then\n offsetFromCenter = 1\n else\n offsetFromCenter = 0.5\n end\n end\n if #markers == 0 then\n table.insert(markers, core.spawnArrowSticker(x, y, z, \"down\"))\n table.insert(markers, core.spawnArrowSticker(x, y, z, \"down\"))\n core.rotateSticker(markers[2],0,0,90)\n table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, \"north\"))\n table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, \"north\"))\n core.rotateSticker(markers[4],90,90,0)\n table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, \"south\"))\n table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, \"south\"))\n core.rotateSticker(markers[6],90,-90,0)\n table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, \"east\"))\n table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, \"east\"))\n core.rotateSticker(markers[8],90,0,90)\n table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, \"west\"))\n table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, \"west\"))\n core.rotateSticker(markers[10],-90,0,90)\n else\n core.moveSticker(markers[1], x, y, z + offset25 + offsetFromCenter)\n core.moveSticker(markers[2], x, y, z + offset25 + offsetFromCenter)\n core.moveSticker(markers[3], x + offset1 + offsetFromCenter, y, z + offset15)\n core.moveSticker(markers[4], x + offset1 + offsetFromCenter, y, z + offset15)\n core.moveSticker(markers[5], x - offset1 - offsetFromCenter, y, z + offset15)\n core.moveSticker(markers[6], x - offset1 - offsetFromCenter, y, z + offset15)\n core.moveSticker(markers[7], x, y - offset2 - offsetFromCenter, z + offset15)\n core.moveSticker(markers[8], x, y - offset2 - offsetFromCenter, z + offset15)\n core.moveSticker(markers[9], x, y + offset2 + offsetFromCenter, z + offset15)\n core.moveSticker(markers[10], x, y + offset2 + offsetFromCenter, z + offset15)\n end\n if not selected_machine.type:lower():find(\"container\") then\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 <table>\n <tr>\n <th colspan=\"3\">]] .. selected_machine.name .. [[</th>\n </tr>\n <tr>\n <th class=\"]] .. status_class .. [[\" colspan=\"3\">]] .. status .. [[</th>\n </tr>\n ]]\n if status == \"-\" then\n command_1 = \"\"\n command_2 = \"\"\n command_3 = \"\"\n hud_machine_detail = hud_machine_detail .. [[\n <tr>\n <td>Machine Not Connected</td>\n </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 <tr>\n <th>START</th>\n <th></th>\n <th>ALT+1</th>\n </tr>\n <tr>\n <th style=\"height:65px;\">BATCH</th>\n <th rowspan=\"2\">\n <table>\n <tr>\n <th colspan=\"3\">&#x2191; &nbsp;&nbsp; Alt+Arrow Up</th>\n </tr>\n <tr>\n <th colspan=\"3\">Quantity:</th>\n </tr>\n <tr>\n <th>&#x2190; &nbsp;&nbsp; Alt+<br>Arrow Left</th>\n <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 hud_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 hud_machine_detail = hud_machine_detail .. [[</span>]]\n end\n end\n hud_machine_detail = hud_machine_detail .. [[\n </th>\n <th>Alt+ &nbsp;&nbsp; &#x2192;<br>Arrow Right</th>\n </tr>\n <tr>\n <th colspan=\"3\" style=\"border-bottom:none;\">&#x2193; &nbsp;&nbsp; Alt+Arrow Down</th>\n </tr>\n </table>\n </th>\n <th>ALT+2</th>\n </tr>\n <tr>\n <th>MAINTAIN</th>\n <th>ALT+3</th>\n </tr>\n ]]\n else\n command_1 = \"STOP\"\n command_2 = \"SOFT_STOP\"\n command_3 = \"\"\n hud_machine_detail = hud_machine_detail .. [[\n <tr>\n <th>STOP</th>\n <th>ALT+1</th>\n </tr>\n <tr>\n <th>FINISH AND STOP</th>\n <th>ALT+2</th>\n </tr>\n ]]\n\n end\n hud_machine_detail = hud_machine_detail .. [[</table></div>]]\n end\n end\n end\n system.setScreen(hud_main_css .. hud_help_command .. hud_elements_type_list .. hud_machines .. hud_machine_detail)\nelse\n system.setScreen(hud_main_css .. hud_help_command .. [[\n <div class=\"hud_list_container hud_container\">\n \t<table style=\"width:100%\">\n \t\t<tr>\n \t\t\t<th>LOADING ]] .. math.floor(initIndex*100/#elementsIdList) .. [[% ...</th>\n \t\t</tr>\n \t</table>\n </div>\n ]])\nend", 141 + "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 .hud_container {\n border: 2px solid orange;\n border-radius:10px;\n background-color: rgba(0,0,0,.75);\n padding:10px;\n }\n .hud_help_commands {\n position: absolute;\n top: ]] .. tostring((10/1080)*100) .. [[vh;\n left: ]] .. tostring((50/1920)*100) .. [[vw;\n text-transform: uppercase;\n font-weight: bold;\n }\n .hud_list_container {\n position: absolute;\n top: ]] .. tostring((125/1080)*100) .. [[vh;\n left: ]] .. tostring((50/1920)*100) .. [[vw;\n text-transform: uppercase;\n font-weight: bold;\n }\n .hud_machine_detail {\n position: absolute;\n top: ]] .. tostring((125/1080)*100) .. [[vh;\n right: ]] .. tostring((450/1920)*100) .. [[vw;\n text-transform: uppercase;\n font-weight: bold;\n }\n .hud_machines_container {\n position: absolute;\n top: ]] .. tostring((125/1080)*100) .. [[vh;\n left: ]] .. tostring((300/1920)*100) .. [[vw;\n }\n .elementType {\n margin-top:10px;\n border-radius:5px;\n }\n .elementType.selected {\n border: 2px solid green;\n background-color: rgba(0,200,0,.45);\n }\n tr.selected td, tr.selected th{\n border: 2px solid green;\n background-color: rgba(0,200,0,.1);\n }\n td, th {\n border-bottom:1px solid white;\n padding:5px;\n text-align: center;\n }\n th {\n font-weight: bold;\n }\n .text-success{color: #28a745;}\n .text-danger{color:#dc3545;}\n .text-warning{color:#ffc107;}\n .text-info{color:#17a2b8;}\n .text-primary{color:#007bff;}\n .text-orangered{color:orangered;}\n .bg-success{background-color: #28a745;}\n .bg-danger{background-color:#dc3545;}\n .bg-warning{background-color:#ffc107;}\n .bg-info{background-color:#17a2b8;}\n .bg-primary{background-color:#007bff;}\n </style>\n]]\n\nlocal refreshStatusText = [[<span class=\"text-success\">Disable Data Collection</span>]]\nif refreshActivated == false then\n refreshStatusText = [[<span class=\"text-danger\">Enable Data Collection</span>]]\nend\n\nhud_help_command = [[<div class=\"hud_help_commands hud_container\">\n <table>\n <tr>\n <th colspan=\"2\">\n ]] .. dateStr .. [[\n </th>\n </tr>\n <tr>\n <td>Show/Hide HUD</td>\n <th style=\"text-align:right;\">Alt+7</th>\n </tr>\n <tr>\n \t<td>]] .. refreshStatusText .. [[</td>\n \t<th style=\"text-align:right;\">Alt+8</th>\n </tr>\n </table>\n</div>]]\nif initIndex >= #elementsIdList then\n unit.stopTimer(\"init\")\n hud_elements_type_list = \"\"\n hud_machines = \"\"\n hud_machine_detail = \"\"\n\n if hud_displayed == true then\n selected_type = elementsTypes[selected_index]\n elementsTypes = {}\n elements = {}\n refresh_id_list = {}\n selectedElementsId = {}\n for _,id in pairs(elementsId) do\n elementType = core.getElementTypeById(id)\n local elementName = core.getElementNameById(id):lower()\n if\n (elementType:lower():find(\"container\") and elementName:find(containerMonitoringPrefix:lower()))\n or (not elementType:lower():find(\"container\"))\n then\n table.insert(elementsTypes, elementType)\n end\n if selected_type == elementType then\n if\n (elementType:lower():find(\"container\") and elementName:find(containerMonitoringPrefix:lower()))\n or (not elementType:lower():find(\"container\"))\n then\n table.insert(selectedElementsId, id)\n end\n end\n end\n elementsTypes = removeDuplicatesInTable(elementsTypes)\n table.sort(elementsTypes, function(a,b) return a:lower() < b:lower() end)\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 table.sort(temp_elements_for_sorting, function(a,b) return a.name:lower() < b.name:lower() end)\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 = MyJson.parse(Storage.getStringValue(elementData.id))\n end\n elementData.type = elementType\n elementData.name = core.getElementNameById(elementData.id)\n elementData.position = core.getElementPositionById(elementData.id)\n table.insert(refresh_id_list, 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 <table style=\"width:100%;\">\n <tr>\n <th style=\"text-align:left;border-bottom:none;\">]].. elementType .. [[</th>\n <td style=\"text-align:right;border-bottom:none;\">]] .. count .. [[</td>\n </tr>\n </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 if maxOnPage > #selectedElementsId then maxOnPage = #selectedElementsId end\n hud_machines = [[<div class=\"hud_machines_container hud_container\">\n <div style=\"text-align:center;font-weight:bold;border-bottom:1px solid white;\">&#x2191; &nbsp;&nbsp; Arrow Up</div>\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 <table class=\"elements_table\" style=\"width:100%;\">]]\n if elementsTypes[selected_index]:lower():find(\"container\") then\n hud_machines = hud_machines .. [[\n <tr>\n <th>id</th>\n <th>Container Name</th>\n <th>Item Name</th>\n <th>Container Size</th>\n <th>Item Type</th>\n <th>Unit Mass</th>\n <th>Total Mass</th>\n <th>Amount of Items</th>\n ]]\n if not elementsTypes[selected_index]:lower():find(\"hub\") then\n hud_machines = hud_machines .. [[\n <th>Container Fill</th>\n ]]\n end\n hud_machines = hud_machines .. [[</tr>\n ]]\n for i, element in pairs(elements) do\n local splittedName = strSplit(element.name, \"_\")\n local itemName = splittedName[2]\n local machine_id = \"-\"\n if element.id then machine_id = element.id end\n local container_size = \"hub\"\n local container_empty_mass = getIngredient(\"Container Hub\").mass\n local container_volume = 0\n local contentQuantity = 0\n local ingredient = getIngredient(cleanName(itemName))\n if not element.type:lower():find(\"hub\") then\n local containerMaxHP = core.getElementMaxHitPointsById(element.id)\n if containerMaxHP > 17000 then\n container_size = \"L\"\n container_empty_mass = getIngredient(\"Container L\").mass\n container_volume = 128000 * (container_proficiency_lvl * 0.1) + 128000\n elseif containerMaxHP > 7900 then\n container_size = \"M\"\n container_empty_mass = getIngredient(\"Container M\").mass\n container_volume = 64000 * (container_proficiency_lvl * 0.1) + 64000\n elseif containerMaxHP > 900 then\n container_size = \"S\"\n container_empty_mass = getIngredient(\"Container S\").mass\n container_volume = 8000 * (container_proficiency_lvl * 0.1) + 8000\n else\n container_size = \"XS\"\n container_empty_mass = getIngredient(\"Container XS\").mass\n container_volume = 1000 * (container_proficiency_lvl * 0.1) + 1000\n end\n end\n local totalMass = core.getElementMassById(element.id)\n local contentMassKg = totalMass - container_empty_mass\n local contentMass = contentMassKg\n local contentMassUnit = \"Kg\"\n if contentMass > 1000 then\n contentMass = contentMass/1000\n contentMassUnit = \"T\"\n end\n contentMass = utils.round(contentMass*100)/100\n contentQuantity = contentMassKg / ingredient.mass\n local contentPercent = 0\n if (not element.type:lower():find(\"hub\")) --not a hub\n and (not ingredient.type:lower():find(\"error\")) --not item not found\n then\n contentPercent = math.floor((ingredient.volume * contentQuantity)*100/container_volume)\n end\n hud_machines = hud_machines .. [[<tr]]\n if selected_machine_index == i then\n hud_machines = hud_machines .. [[ class=\"selected\"]]\n end\n hud_machines = hud_machines .. [[>\n <th>]] .. machine_id .. [[</th>\n <th>]] .. itemName .. [[</th>\n <th>]] .. ingredient.name .. [[</th>\n <td>]] .. container_size .. [[</td>\n <td>]] .. ingredient.type .. [[</td>\n <td>]] .. ingredient.mass .. [[</td>\n <td>]] .. contentMass .. \" \" .. contentMassUnit .. [[</td>\n <td>]] .. utils.round(contentQuantity*100)/100 .. [[</td>\n ]]\n if not element.type:lower():find(\"hub\") then\n local gauge_color_class = \"bg-success\"\n local text_color_class = \"\"\n if contentPercent < container_fill_red_level then\n gauge_color_class = \"bg-danger\"\n elseif contentPercent < container_fill_yellow_level then\n gauge_color_class = \"bg-warning\"\n text_color_class = \"text-orangered\"\n end\n if ingredient.type:lower():find(\"error\") then\n hud_machines = hud_machines .. [[\n <th style=\"position:relative;width: ]] .. tostring((150/1920)*100) .. [[vw;\">\n -\n </th>\n </tr>\n ]]\n else\n hud_machines = hud_machines .. [[\n <th style=\"position:relative;width: ]] .. tostring((150/1920)*100) .. [[vw;\">\n <div class=\"]] .. gauge_color_class .. [[\" style=\"width:]] .. contentPercent .. [[%;\">&nbsp;</div>\n <div class=\"]] .. text_color_class .. [[\" style=\"position:absolute;width:100%;top:0;padding-top:5px;font-weight:bold;\">\n ]] .. contentPercent .. [[%\n </div>\n </th>\n </tr>\n ]]\n end\n end\n end\n else\n hud_machines = hud_machines .. [[\n <tr>\n <th>id</th>\n <th>Machine Name</th>\n <th>Cycles From Start</th>\n <th>Efficiency</th>\n <th>Status</th>\n <th>Uptime</th>\n </tr>\n ]]\n for i, element in pairs(elements) do\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 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 --Special Thx to Rutik for his help on how to get the exact the position of the element\n local position = vec3(selected_machine.position)\n local x = position.x - coreOffset\n local y = position.y - coreOffset\n local z = position.z - coreOffset\n local offset1 = 1\n local offset15 = 1.5\n local offset2 = 2\n local offset25 = 2.5\n local offsetFromCenter = 0\n if selected_machine.type:lower():find(\"container\") then\n offset1 = 0\n offset15 = 0\n offset2 = 0\n offset25 = 0\n end\n if selected_machine.type:lower() == \"container\" then\n local containerMaxHP = core.getElementMaxHitPointsById(selected_machine.id)\n if containerMaxHP > 17000 then\n offsetFromCenter = 4\n elseif containerMaxHP > 7900 then\n offsetFromCenter = 2\n elseif containerMaxHP > 900 then\n offsetFromCenter = 1\n else\n offsetFromCenter = 0.5\n end\n end\n if #markers == 0 then\n table.insert(markers, core.spawnArrowSticker(x, y, z, \"down\"))\n table.insert(markers, core.spawnArrowSticker(x, y, z, \"down\"))\n core.rotateSticker(markers[2],0,0,90)\n table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, \"north\"))\n table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, \"north\"))\n core.rotateSticker(markers[4],90,90,0)\n table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, \"south\"))\n table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, \"south\"))\n core.rotateSticker(markers[6],90,-90,0)\n table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, \"east\"))\n table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, \"east\"))\n core.rotateSticker(markers[8],90,0,90)\n table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, \"west\"))\n table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, \"west\"))\n core.rotateSticker(markers[10],-90,0,90)\n else\n core.moveSticker(markers[1], x, y, z + offset25 + offsetFromCenter)\n core.moveSticker(markers[2], x, y, z + offset25 + offsetFromCenter)\n core.moveSticker(markers[3], x + offset1 + offsetFromCenter, y, z + offset15)\n core.moveSticker(markers[4], x + offset1 + offsetFromCenter, y, z + offset15)\n core.moveSticker(markers[5], x - offset1 - offsetFromCenter, y, z + offset15)\n core.moveSticker(markers[6], x - offset1 - offsetFromCenter, y, z + offset15)\n core.moveSticker(markers[7], x, y - offset2 - offsetFromCenter, z + offset15)\n core.moveSticker(markers[8], x, y - offset2 - offsetFromCenter, z + offset15)\n core.moveSticker(markers[9], x, y + offset2 + offsetFromCenter, z + offset15)\n core.moveSticker(markers[10], x, y + offset2 + offsetFromCenter, z + offset15)\n end\n if not selected_machine.type:lower():find(\"container\") then\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 <table>\n <tr>\n <th colspan=\"3\">]] .. selected_machine.name .. [[</th>\n </tr>\n <tr>\n <th class=\"]] .. status_class .. [[\" colspan=\"3\">]] .. status .. [[</th>\n </tr>\n ]]\n if status == \"-\" then\n command_1 = \"\"\n command_2 = \"\"\n command_3 = \"\"\n hud_machine_detail = hud_machine_detail .. [[\n <tr>\n <td>Machine Not Connected</td>\n </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 <tr>\n <th>START</th>\n <th></th>\n <th>ALT+1</th>\n </tr>\n <tr>\n <th style=\"height:65px;\">BATCH</th>\n <th rowspan=\"2\">\n <table>\n <tr>\n <th colspan=\"3\">&#x2191; &nbsp;&nbsp; Alt+Arrow Up</th>\n </tr>\n <tr>\n <th colspan=\"3\">Quantity:</th>\n </tr>\n <tr>\n <th>&#x2190; &nbsp;&nbsp; Alt+<br>Arrow Left</th>\n <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 hud_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 hud_machine_detail = hud_machine_detail .. [[</span>]]\n end\n end\n hud_machine_detail = hud_machine_detail .. [[\n </th>\n <th>Alt+ &nbsp;&nbsp; &#x2192;<br>Arrow Right</th>\n </tr>\n <tr>\n <th colspan=\"3\" style=\"border-bottom:none;\">&#x2193; &nbsp;&nbsp; Alt+Arrow Down</th>\n </tr>\n </table>\n </th>\n <th>ALT+2</th>\n </tr>\n <tr>\n <th>MAINTAIN</th>\n <th>ALT+3</th>\n </tr>\n ]]\n else\n command_1 = \"STOP\"\n command_2 = \"SOFT_STOP\"\n command_3 = \"\"\n hud_machine_detail = hud_machine_detail .. [[\n <tr>\n <th>STOP</th>\n <th>ALT+1</th>\n </tr>\n <tr>\n <th>FINISH AND STOP</th>\n <th>ALT+2</th>\n </tr>\n ]]\n\n end\n hud_machine_detail = hud_machine_detail .. [[</table></div>]]\n end\n end\n end\n system.setScreen(hud_main_css .. hud_help_command .. hud_elements_type_list .. hud_machines .. hud_machine_detail)\nelse\n system.setScreen(hud_main_css .. hud_help_command .. [[\n <div class=\"hud_list_container hud_container\">\n \t<table style=\"width:100%\">\n \t\t<tr>\n \t\t\t<th>LOADING ]] .. math.floor(initIndex*100/#elementsIdList) .. [[% ...</th>\n \t\t</tr>\n \t</table>\n </div>\n ]])\nend", 142 142 "filter": { 143 143 "args": [], 144 144 "signature": "update()",
+38 -31
Master program/source/system/update.lua
··· 14 14 } 15 15 .hud_help_commands { 16 16 position: absolute; 17 - top: ]] .. tostring((10 / 1080) * 100) .. [[vh; 18 - left: ]] .. tostring((50 / 1920) * 100) .. [[vw; 17 + top: ]] .. tostring((10/1080)*100) .. [[vh; 18 + left: ]] .. tostring((50/1920)*100) .. [[vw; 19 19 text-transform: uppercase; 20 20 font-weight: bold; 21 21 } 22 22 .hud_list_container { 23 23 position: absolute; 24 - top: ]] .. tostring((125 / 1080) * 100) .. [[vh; 25 - left: ]] .. tostring((50 / 1920) * 100) .. [[vw; 24 + top: ]] .. tostring((125/1080)*100) .. [[vh; 25 + left: ]] .. tostring((50/1920)*100) .. [[vw; 26 26 text-transform: uppercase; 27 27 font-weight: bold; 28 28 } 29 29 .hud_machine_detail { 30 30 position: absolute; 31 - top: ]] .. tostring((125 / 1080) * 100) .. [[vh; 32 - right: ]] .. tostring((450 / 1920) * 100) .. [[vw; 31 + top: ]] .. tostring((125/1080)*100) .. [[vh; 32 + right: ]] .. tostring((450/1920)*100) .. [[vw; 33 33 text-transform: uppercase; 34 34 font-weight: bold; 35 35 } 36 36 .hud_machines_container { 37 37 position: absolute; 38 - top: ]] .. tostring((125 / 1080) * 100) .. [[vh; 39 - left: ]] .. tostring((300 / 1920) * 100) .. [[vw; 38 + top: ]] .. tostring((125/1080)*100) .. [[vh; 39 + left: ]] .. tostring((300/1920)*100) .. [[vw; 40 40 } 41 41 .elementType { 42 42 margin-top:10px; ··· 106 106 elements = {} 107 107 refresh_id_list = {} 108 108 selectedElementsId = {} 109 - for _, id in pairs(elementsId) do 109 + for _,id in pairs(elementsId) do 110 110 elementType = core.getElementTypeById(id) 111 111 local elementName = core.getElementNameById(id):lower() 112 - if (elementType:lower():find("container") and elementName:find("monit_")) 113 - or (not elementType:lower():find("container")) then 112 + if 113 + (elementType:lower():find("container") and elementName:find(containerMonitoringPrefix:lower())) 114 + or (not elementType:lower():find("container")) 115 + then 114 116 table.insert(elementsTypes, elementType) 115 117 end 116 118 if selected_type == elementType then 117 - if (elementType:lower():find("container") and elementName:find("monit_")) 118 - or (not elementType:lower():find("container")) then 119 + if 120 + (elementType:lower():find("container") and elementName:find(containerMonitoringPrefix:lower())) 121 + or (not elementType:lower():find("container")) 122 + then 119 123 table.insert(selectedElementsId, id) 120 124 end 121 125 end 122 126 end 123 127 elementsTypes = removeDuplicatesInTable(elementsTypes) 124 - table.sort(elementsTypes, function(a, b) return a:lower() < b:lower() end) 128 + table.sort(elementsTypes, function(a,b) return a:lower() < b:lower() end) 125 129 maxPage = math.ceil(#selectedElementsId / elementsByPage) 126 130 127 131 local minOnPage = ((page - 1) * elementsByPage) + 1 128 132 local maxOnPage = page * elementsByPage 129 133 local temp_elements_for_sorting = {} 130 - for i, id in pairs(selectedElementsId) do 134 + for i,id in pairs(selectedElementsId) do 131 135 elementData = {} 132 136 elementData.id = id 133 137 elementData.name = core.getElementNameById(id) 134 138 table.insert(temp_elements_for_sorting, elementData) 135 139 end 136 - table.sort(temp_elements_for_sorting, function(a, b) return a.name:lower() < b.name:lower() end) 137 - for i, elementData in pairs(temp_elements_for_sorting) do 140 + table.sort(temp_elements_for_sorting, function(a,b) return a.name:lower() < b.name:lower() end) 141 + for i,elementData in pairs(temp_elements_for_sorting) do 138 142 if i >= minOnPage and i <= maxOnPage then 139 143 elementType = core.getElementTypeById(elementData.id) 140 144 if Storage.hasKey(elementData.id) == 1 then ··· 160 164 hud_elements_type_list = hud_elements_type_list .. [["> 161 165 <table style="width:100%;"> 162 166 <tr> 163 - <th style="text-align:left;border-bottom:none;">]] .. elementType .. [[</th> 167 + <th style="text-align:left;border-bottom:none;">]].. elementType .. [[</th> 164 168 <td style="text-align:right;border-bottom:none;">]] .. count .. [[</td> 165 169 </tr> 166 170 </table> ··· 181 185 </table> 182 186 <table class="elements_table" style="width:100%;">]] 183 187 if elementsTypes[selected_index]:lower():find("container") then 184 - hud_machines = hud_machines .. [[ 188 + hud_machines = hud_machines .. [[ 185 189 <tr> 186 190 <th>id</th> 191 + <th>Container Name</th> 187 192 <th>Item Name</th> 188 193 <th>Container Size</th> 189 194 <th>Item Type</th> ··· 251 256 hud_machines = hud_machines .. [[> 252 257 <th>]] .. machine_id .. [[</th> 253 258 <th>]] .. itemName .. [[</th> 259 + <th>]] .. ingredient.name .. [[</th> 254 260 <td>]] .. container_size .. [[</td> 255 261 <td>]] .. ingredient.type .. [[</td> 256 262 <td>]] .. ingredient.mass .. [[</td> ··· 262 268 local text_color_class = "" 263 269 if contentPercent < container_fill_red_level then 264 270 gauge_color_class = "bg-danger" 265 - elseif contentPercent < container_fill_yellow_level then 271 + elseif contentPercent < container_fill_yellow_level then 266 272 gauge_color_class = "bg-warning" 267 273 text_color_class = "text-orangered" 268 274 end 269 275 if ingredient.type:lower():find("error") then 270 276 hud_machines = hud_machines .. [[ 271 - <th style="position:relative;width: ]] .. tostring((150 / 1920) * 100) .. [[vw;"> 277 + <th style="position:relative;width: ]] .. tostring((150/1920)*100) .. [[vw;"> 272 278 - 273 279 </th> 274 280 </tr> 275 281 ]] 276 282 else 277 283 hud_machines = hud_machines .. [[ 278 - <th style="position:relative;width: ]] .. tostring((150 / 1920) * 100) .. [[vw;"> 284 + <th style="position:relative;width: ]] .. tostring((150/1920)*100) .. [[vw;"> 279 285 <div class="]] .. gauge_color_class .. [[" style="width:]] .. contentPercent .. [[%;">&nbsp;</div> 280 286 <div class="]] .. text_color_class .. [[" style="position:absolute;width:100%;top:0;padding-top:5px;font-weight:bold;"> 281 287 ]] .. contentPercent .. [[% ··· 287 293 end 288 294 end 289 295 else 290 - hud_machines = hud_machines .. [[ 296 + hud_machines = hud_machines .. [[ 291 297 <tr> 292 298 <th>id</th> 293 299 <th>Machine Name</th> ··· 309 315 local cyclesFromStart = "-" 310 316 if element.cyclesFromStart then cyclesFromStart = element.cyclesFromStart end 311 317 local efficiency = "-" 312 - if element.efficiency then efficiency = math.floor(element.efficiency * 100) end 318 + if element.efficiency then efficiency = math.floor(element.efficiency*100) end 313 319 local uptime = 0 314 320 if element.uptime then uptime = math.floor(element.uptime) end 315 321 hud_machines = hud_machines .. [[<tr]] ··· 372 378 if #markers == 0 then 373 379 table.insert(markers, core.spawnArrowSticker(x, y, z, "down")) 374 380 table.insert(markers, core.spawnArrowSticker(x, y, z, "down")) 375 - core.rotateSticker(markers[2], 0, 0, 90) 381 + core.rotateSticker(markers[2],0,0,90) 376 382 table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, "north")) 377 383 table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, "north")) 378 - core.rotateSticker(markers[4], 90, 90, 0) 384 + core.rotateSticker(markers[4],90,90,0) 379 385 table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, "south")) 380 386 table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, "south")) 381 - core.rotateSticker(markers[6], 90, -90, 0) 387 + core.rotateSticker(markers[6],90,-90,0) 382 388 table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, "east")) 383 389 table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, "east")) 384 - core.rotateSticker(markers[8], 90, 0, 90) 390 + core.rotateSticker(markers[8],90,0,90) 385 391 table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, "west")) 386 392 table.insert(markers, core.spawnArrowSticker(x, y, z + offset15, "west")) 387 - core.rotateSticker(markers[10], -90, 0, 90) 393 + core.rotateSticker(markers[10],-90,0,90) 388 394 else 389 395 core.moveSticker(markers[1], x, y, z + offset25 + offsetFromCenter) 390 396 core.moveSticker(markers[2], x, y, z + offset25 + offsetFromCenter) ··· 449 455 <th>&#x2190; &nbsp;&nbsp; Alt+<br>Arrow Left</th> 450 456 <th style="font-size:20px;"> 451 457 ]] 452 - for digit_index, digit in pairs(craft_quantity_digits) do 458 + for digit_index,digit in pairs(craft_quantity_digits) do 453 459 if digit_index == (#craft_quantity_digits - craft_selected_digit + 1) then 454 460 hud_machine_detail = hud_machine_detail .. [[<span class="text-success">]] 455 461 end ··· 488 494 <th>ALT+2</th> 489 495 </tr> 490 496 ]] 497 + 491 498 end 492 499 hud_machine_detail = hud_machine_detail .. [[</table></div>]] 493 500 end ··· 499 506 <div class="hud_list_container hud_container"> 500 507 <table style="width:100%"> 501 508 <tr> 502 - <th>LOADING ]] .. math.floor(initIndex * 100 / #elementsIdList) .. [[% ...</th> 509 + <th>LOADING ]] .. math.floor(initIndex*100/#elementsIdList) .. [[% ...</th> 503 510 </tr> 504 511 </table> 505 512 </div>
+2 -1
Master program/source/unit/start.lua
··· 28 28 enable3DPrinterMonitoring = true --export: enable or disable the 3D Printers monitoring 29 29 enableTransferMonitoring = true --export: enable or disable the transfer units monitoring 30 30 enableContainerMonitoring = true --export: enable or disable the containers and hubs monitoring 31 + containerMonitoringPrefix = "MONIT_" --export: the prefix used to enable container monitoring 31 32 refreshSpeed = 1 --export: the refresh speed of data in seconds 32 33 elementsByPage = 20 --export: maximum amount of elements displayed on a single page 33 34 dateFormat = "en" --export: the country code to format the date ··· 79 80 coreOffset = 16 80 81 initIndex = 1 81 82 if core ~= nil and Storage then 82 - elementsIdList = core.getElementIdList() 83 + elementsIdList = core.getElementIdList() 83 84 unit.setTimer("init",1) 84 85 end 85 86