Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require("helpers")
- local component = require("component")
- local event = require("event")
- local SurfaceExtension = require("SurfaceExtension")
- local Geometry = require("Geometry")
- local Datetime = require("Datetime")
- local gl = component.openperipheral_bridge
- local me = component.me_controller
- local ac = component.average_counter
- local saveSettings, loadSettings = saves.use("/home/glasses.conf.json")
- local UI = {}
- local columns = 3
- -- TODO: DEEP COPY
- local initialSettings = {
- clockCenter = {x = 44, y = 44},
- euMeterPosition = {x = 8, y = 86},
- meItemsTablePosition = {x = 8, y = 112},
- lookedItems = {},
- needRedraw = false
- }
- local settings = loadSettings() or {}
- local itemToRemove = nil
- c=require("component")
- cr=require("computer")
- fs=require("filesystem")
- term=require("term")
- event=require("event")
- gpu=c.gpu
- screen=c.screen
- req_list={["openperipheral_bridge"]=1,["average_counter"]=1,["me_controller"]=1}
- err_c=0
- for v in pairs(req_list) do if not c.isAvailable(v) then req_list[v]=0 err_c=err_c+1 end end
- if err_c>0 then term.clear() gpu.setForeground(0xff0000) for v in pairs(req_list) do if req_list[v]==0 then print(v.." is not available") end end gpu.setForeground(0xffffff) os.sleep(1.0) return -1 end
- ac_list={"63f731b2-61c3-4cd8-bfc9-5704e44f5f09","e24ccff0-d1ac-43d5-a748-d05aaf91e5b1"}
- player={'Tumko','Zazashka','sifheads','_killer__995','holi_love_awp'}
- brd=c.openperipheral_bridge
- me=c.me_controller
- term.clear()
- gpu.setForeground(0xffffff)
- fs.makeDirectory("tmp/bag")
- function getHostTime(timezone)
- timezone = timezone or 2
- local file = io.open("/HostTime.tmp", "w")
- file:write("")
- file:close()
- local timeCorrection = timezone * 3600
- local lastModified = tonumber(string.sub(fs.lastModified("/HostTime.tmp"), 1, -4)) + timeCorrection
- fs.remove("/HostTime.tmp")
- local year, month, day, hour, minute, second = os.date("%Y", lastModified), os.date("%m", lastModified), os.date("%d", lastModified), os.date("%H", lastModified), os.date("%M", lastModified), os.date("%S", lastModified)
- return tonumber(day), tonumber(month), tonumber(year), tonumber(hour), tonumber(minute), tonumber(second)
- end
- function real_time()
- local time = {getHostTime(3)}
- local text = string.format("%02d:%02d", time[4], time[5])
- brd.addBox(1,13,65,11,0x000000,0.2)
- brd.addText(4,15,"Время: "..text,0xFFFFFF)
- end
- function tf()
- local f=io.open("/tmp/bag/tps","w")
- f:write("tps")
- f:close()
- return(fs.lastModified("tmp/bag/tps"))
- end
- function tps()
- local c1,c2,c3,tps
- c1=tf()
- os.sleep(2)
- c2=tf()
- c3=c2-c1
- tps=20000*2/c3
- tps=string.sub(tps,1,5)
- brd.addBox(1,1,65,11,0x000000,0.2)
- brd.addText(10,3,"TPS:",0xFFFFFF)
- brd.addText(32,3,tps,0x04CCFF)
- end
- function cn_form(n)
- if n>=10^6 then return string.format("%.2f M",n/10^6)
- elseif n>=10^3 then return string.format("%.2f k",n/10^3)
- else return tostring(n) end
- end
- function sis()
- local mat,irn,irn_b,drac=0,0,0,0
- r1,r2,r3,r4=me.getItemsInNetwork({name="dwcity:Materia"})[1],me.getItemsInNetwork({name="minecraft:iron_ingot"})[1],me.getItemsInNetwork({name="minecraft:iron_block"})[1],me.getItemsInNetwork({name="DraconicEvolution:draconicIngot"})[1]
- if type(r1)=="table" then mat=r1["size"] end
- if type(r2)=="table" then irn=r2["size"] end
- if type(r3)=="table" then irn_b=r3["size"] end
- if type(r4)=="table" then drac=r4["size"] end
- irn=irn+irn_b*9
- brd.addBox(2,41,90,110,0x000000,0.2)
- brd.addIcon(3,44,"IC2:blockReactorChamber")
- brd.addText(23,49,cn_form(c.proxy(ac_list[2]).getAverage()).." EU/t",0xbbbbbb)
- brd.addIcon(3,64,"AdvancedSolarPanel:BlockMolecularTransformer")
- brd.addText(23,67,cn_form(c.proxy(ac_list[1]).getAverage()).." EU/t",0xbbbbbb)
- brd.addIcon(3,80,"dwcity:Materia")
- brd.addText(23,85,string.format("%d",mat),0xbbbbbb)
- brd.addIcon(3,98,"minecraft:iron_block")
- brd.addText(23,103,string.format("%.2f",irn/9),0xbbbbbb)
- brd.addIcon(3,116,"minecraft:iron_ingot")
- brd.addText(23,121,string.format("%d",irn),0xbbbbbb)
- brd.addIcon(3,134,"DraconicEvolution:draconicIngot")
- brd.addText(23,139,string.format("%d",drac),0xbbbbbb)
- end
- function skrin()
- local hs_p=30
- brd.addBox(1,hs_p-4,95,11,0x000000,0.2)
- brd.addText(4,28,string.format("Скриншотер - кыш"),0xbbbbbb)
- end
- function spr()
- local hs_p=1
- local cpu_t=me.getCpus()
- brd.addBox(100,1,35,18*cpu_t["n"],0x000000,0.2)
- for i in pairs(cpu_t) do
- if type(cpu_t[i])=="table" then
- brd.addText(120,hs_p+5,"#"..i,0xbbbbbb)
- if not(cpu_t[i]["busy"]) then brd.addIcon(100,hs_p,"dwcity:blockAdvancedCraftingStorage",13) else brd.addIcon(100,hs_p,"dwcity:blockAdvancedCraftingStorage",15) end
- hs_p=hs_p+18
- end
- end
- end
- function plrs()
- local hs_p=164
- brd.addBox(2,hs_p-4,90,14*#player,0x000000,0.2)
- for i=1,#player do
- if cr.addUser(player[i])~=nil then brd.addIcon(3,hs_p-5,"minecraft:skull",3) brd.addText(23,hs_p,player[i],0xbbbbbb)
- else brd.addIcon(3,hs_p-5,"minecraft:skull") brd.addText(23,hs_p,player[i],0x404040) end
- cr.removeUser(player[i])
- hs_p=hs_p+14
- end
- end
- local function mod(a, b)
- return a - (math.floor(a/b)*b)
- end
- local function getMEItemByName(items, name, damage)
- for _, item in pairs(items) do
- if type(item) == "table" and (item.name and item.name == name) and (item.damage and item.damage == damage) then
- return item
- end
- end
- return nil
- end
- local function updateClockLine(surface, UI, clockCenter, name, angle, length, width, color)
- local endCoords = Geometry.getCoordFromAngleAndRadius(angle - 90, length)
- if not UI[name] then
- UI[name] = surface.addLine({
- x = clockCenter.x,
- y = clockCenter.y
- }, {
- x = clockCenter.x + endCoords.x,
- y = clockCenter.y + endCoords.y,
- }, color, 1)
- UI[name].setWidth(width)
- else
- UI[name].setP2({
- x = clockCenter.x + endCoords.x,
- y = clockCenter.y + endCoords.y,
- })
- end
- return UI[name]
- end
- local previuosDayState = nil
- local function render()
- for _, user in pairs(gl.getUsers()) do
- local userGl = gl.getSurfaceByUUID(user.uuid)
- local ext = SurfaceExtension.connect(userGl)
- if not settings[user.uuid] then
- settings[user.uuid] = table.copyDeep(initialSettings)
- saveSettings(settings)
- end
- local userSettings = settings[user.uuid]
- if not UI[user.uuid] or userSettings.needRedraw then
- UI[user.uuid] = {}
- if userSettings.needRedraw then
- userSettings.needRedraw = false
- userGl.clear()
- end
- end
- local userUI = UI[user.uuid]
- local clockCenter = userSettings.clockCenter
- local euMeterPos = userSettings.euMeterPosition
- local meItemsTablePos = userSettings.meItemsTablePosition
- local lookedItems = userSettings.lookedItems
- local prefetchItems = me.getItemsInNetwork()
- local averageEU = ac.getAverage()
- local counterText = (averageEU > 9999 and (string.format("%.2fk", averageEU / 1000)) or tostring(averageEU)).." EU/t"
- if not userUI.counter then
- userUI.counter = ext.roundedRect(euMeterPos.x, euMeterPos.y, 72, 20, 4, 8)
- userUI.counter.polygon.setOpacity(0.6)
- userUI.counterIcon = userGl.addIcon(euMeterPos.x + 2, euMeterPos.y + 2, "AdvancedSolarPanel:BlockMolecularTransformer")
- userUI.counterText = userGl.addText(euMeterPos.x + 44, euMeterPos.y + 10, counterText, 0xFFFFFF)
- userUI.counterText.setScale(0.8)
- userUI.counterText.setObjectAnchor("MIDDLE", "MIDDLE")
- else
- userUI.counterText.setText(counterText)
- end
- for index, item in ipairs(lookedItems) do
- local uiKey = item.name..":"..item.damage
- local uiIconKey = "icon:"..uiKey
- local uiTextKey = "text:"..uiKey
- local modIndex = mod(index, columns)
- local column = (modIndex == 0 and columns or modIndex)
- local row = math.ceil(index / columns)
- local x = (meItemsTablePos.x + ((column - 1) * 26)) -- 90
- local y = (meItemsTablePos.y + ((row - 1) * 26)) -- 38
- local itemObj = getMEItemByName(prefetchItems, item.name, item.damage)
- local itemText = "0"
- if itemObj then
- itemText = itemObj.size > 9999 and (string.format("%.1fk", itemObj.size / 1000)) or tostring(itemObj.size)
- end
- if not userUI[uiKey] then
- userUI[uiKey] = ext.roundedRect(x, y, 20, 20, 4, 8)
- userUI[uiKey].polygon.setOpacity(0.6)
- userUI[uiIconKey] = userGl.addIcon(x + 2, y + 2, item.name, item.damage)
- userUI[uiTextKey] = userGl.addText(x + 10, y + 20, itemText, 0xFFFFFF)
- userUI[uiTextKey].setScale(0.6)
- userUI[uiTextKey].setObjectAnchor("MIDDLE", "MIDDLE")
- else
- if itemToRemove and itemToRemove.name == item.name and itemToRemove.damage == item.damage and itemToRemove.uuid == user.uuid then
- userUI[uiKey].polygon.delete()
- userUI[uiIconKey].delete()
- userUI[uiTextKey].delete()
- settings[user.uuid].lookedItems = table.filter(lookedItems, function(element)
- return not (element.name == itemToRemove.name and element.damage == itemToRemove.damage)
- end)
- saveSettings(settings)
- itemToRemove = nil
- userUI[uiKey] = nil
- userUI[uiIconKey] = nil
- userUI[uiTextKey] = nil
- else
- userUI[uiTextKey].setText(itemText)
- end
- end
- end
- local now = Datetime:new()
- local isDay = now.hour >= 5 and now.hour < 19
- if previuosDayState == nil then
- previuosDayState = isDay
- end
- if not userUI.background then
- userUI.background = ext.roundedRect(clockCenter.x - 36, clockCenter.y - 36, 72, 72, {36, 36, 36, 8}, {24, 24, 24, 8})
- userUI.background.polygon.setOpacity(0.6)
- end
- if userUI.clockIcon then
- userUI.clockIcon.delete()
- end
- userUI.clockIcon = userGl.addIcon(clockCenter.x - 36, clockCenter.y - 36, "minecraft:clock")
- if not userUI.c1 then
- userUI.c1 = ext.circle(clockCenter.x, clockCenter.y, 28, 72)
- userUI.c1.polygon.setColor(isDay and 0xEE9A00 or 0xDBE6E0)
- userUI.c1.polygon.setOpacity(0.8)
- end
- if not userUI.c2 then
- userUI.c2 = ext.circle(clockCenter.x + (isDay and 0 or 8), clockCenter.y, 20, 72)
- userUI.c2.polygon.setColor(isDay and 0xFEF0DB or 0x4E78A0)
- userUI.c2.polygon.setOpacity(0.5)
- end
- if not userUI.warn then
- userUI.warn = ext.circle(clockCenter.x + 8, clockCenter.y, 5, 36)
- userUI.warn.polygon.setColor(0xFF0000)
- userUI.warn.polygon.setOpacity(0)
- end
- if now.hour >= 4 and now.hour < 5 then
- userUI.warn.polygon.setOpacity(0.8)
- else
- userUI.warn.polygon.setOpacity(0)
- end
- if isDay ~= previuosDayState then
- previuosDayState = isDay
- userUI.c1.polygon.setColor(isDay and 0xEE9A00 or 0xDBE6E0)
- userUI.c2.polygon.setColor(isDay and 0xFEF0DB or 0x4E78A0)
- userUI.c2.setX(clockCenter.x + (isDay and 0 or 8))
- end
- local modHour = mod(now.hour, 12)
- updateClockLine(userGl, userUI, clockCenter, "hourLine", modHour * 30 + (now.min * 0.5), 16, 3, 0xFF0000)
- updateClockLine(userGl, userUI, clockCenter, "minuteLine", now.min * 6, 20, 2, 0x000000)
- if not userUI.centerDot then
- userUI.centerDot = userGl.addPoint(clockCenter, 0x000000, 1)
- userUI.centerDot.setSize(4)
- end
- if not userUI.numbers then
- userUI.numbers = {}
- for i = 1, 12 do
- local textCoords = Geometry.getCoordFromAngleAndRadius(i * 30 - 90, 24)
- userUI.numbers[i] = userGl.addText(clockCenter.x + textCoords.x, clockCenter.y + textCoords.y, tostring(i), 0x000000)
- userUI.numbers[i].setScale(0.5)
- userUI.numbers[i].setObjectAnchor("MIDDLE", "MIDDLE")
- end
- end
- end
- gl.sync()
- end
- local function onPlayerNoGlasses(eventName, addr, userName, userUUID)
- UI[userUUID] = nil
- end
- local function onPlayerTerminalCommand(eventName, addr, userName, userUUID, command)
- local cmd, args = commands.parse(command)
- if cmd == "look" then
- table.insert(settings[userUUID].lookedItems, {
- name = args[1],
- damage = args[2] or 0
- })
- saveSettings(settings)
- end
- if cmd == "unlook" then
- itemToRemove = {
- name = args[1],
- damage = args[2] or 0,
- uuid = userUUID
- }
- end
- end
- local started = true
- local timerId
- local function main()
- if started then
- render()
- end
- end
- function start()
- if not started then
- started = true
- timerId = event.timer(1, main, math.huge)
- events.addEventListener("glasses_detach", onPlayerNoGlasses)
- events.addEventListener("glasses_chat_command", onPlayerTerminalCommand)
- end
- end
- function status()
- print("Currently working: "..(started and "True" or "False"))
- print("Active users:")
- for _, user in pairs(gl.getUsers()) do
- print(" "..user.name)
- end
- end
- function stop()
- if started then
- started = false
- event.cancel(timerId)
- events.removeAllListeners()
- end
- end
- while true do
- if not(c.isAvailable("openperipheral_bridge") and c.isAvailable("average_counter") and c.isAvailable("me_controller")) then cr.shutdown(1) end
- spr()
- tps()
- real_time()
- plrs()
- skrin()
- sis()
- render()
- end
Advertisement
Add Comment
Please, Sign In to add comment