CharlyZM

Untitled

Nov 18th, 2022 (edited)
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.25 KB | None | 0 0
  1. require("helpers")
  2. local component = require("component")
  3. local event = require("event")
  4. local SurfaceExtension = require("SurfaceExtension")
  5. local Geometry = require("Geometry")
  6. local Datetime = require("Datetime")
  7. local gl = component.openperipheral_bridge
  8. local me = component.me_controller
  9. local ac = component.average_counter
  10.  
  11. local saveSettings, loadSettings = saves.use("/home/glasses.conf.json")
  12.  
  13. local UI = {}
  14. local columns = 3
  15.  
  16. -- TODO: DEEP COPY
  17. local initialSettings = {
  18. clockCenter = {x = 44, y = 44},
  19. euMeterPosition = {x = 8, y = 86},
  20. meItemsTablePosition = {x = 8, y = 112},
  21. lookedItems = {},
  22. needRedraw = false
  23. }
  24. local settings = loadSettings() or {}
  25. local itemToRemove = nil
  26. c=require("component")
  27. cr=require("computer")
  28. fs=require("filesystem")
  29. term=require("term")
  30. event=require("event")
  31. gpu=c.gpu
  32. screen=c.screen
  33. req_list={["openperipheral_bridge"]=1,["average_counter"]=1,["me_controller"]=1}
  34. err_c=0
  35. for v in pairs(req_list) do if not c.isAvailable(v) then req_list[v]=0 err_c=err_c+1 end end
  36. 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
  37. ac_list={"63f731b2-61c3-4cd8-bfc9-5704e44f5f09","e24ccff0-d1ac-43d5-a748-d05aaf91e5b1"}
  38. player={'Tumko','Zazashka','sifheads','_killer__995','holi_love_awp'}
  39. brd=c.openperipheral_bridge
  40. me=c.me_controller
  41. term.clear()
  42. gpu.setForeground(0xffffff)
  43. fs.makeDirectory("tmp/bag")
  44.  
  45. function getHostTime(timezone)
  46. timezone = timezone or 2
  47. local file = io.open("/HostTime.tmp", "w")
  48. file:write("")
  49. file:close()
  50. local timeCorrection = timezone * 3600
  51. local lastModified = tonumber(string.sub(fs.lastModified("/HostTime.tmp"), 1, -4)) + timeCorrection
  52. fs.remove("/HostTime.tmp")
  53. 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)
  54. return tonumber(day), tonumber(month), tonumber(year), tonumber(hour), tonumber(minute), tonumber(second)
  55. end
  56.  
  57. function real_time()
  58. local time = {getHostTime(3)}
  59. local text = string.format("%02d:%02d", time[4], time[5])
  60. brd.addBox(1,13,65,11,0x000000,0.2)
  61. brd.addText(4,15,"Время: "..text,0xFFFFFF)
  62. end
  63.  
  64. function tf()
  65. local f=io.open("/tmp/bag/tps","w")
  66. f:write("tps")
  67. f:close()
  68. return(fs.lastModified("tmp/bag/tps"))
  69. end
  70.  
  71. function tps()
  72. local c1,c2,c3,tps
  73. c1=tf()
  74. os.sleep(2)
  75. c2=tf()
  76. c3=c2-c1
  77. tps=20000*2/c3
  78. tps=string.sub(tps,1,5)
  79. brd.addBox(1,1,65,11,0x000000,0.2)
  80. brd.addText(10,3,"TPS:",0xFFFFFF)
  81. brd.addText(32,3,tps,0x04CCFF)
  82. end
  83.  
  84. function cn_form(n)
  85. if n>=10^6 then return string.format("%.2f M",n/10^6)
  86. elseif n>=10^3 then return string.format("%.2f k",n/10^3)
  87. else return tostring(n) end
  88. end
  89.  
  90. function sis()
  91. local mat,irn,irn_b,drac=0,0,0,0
  92. 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]
  93. if type(r1)=="table" then mat=r1["size"] end
  94. if type(r2)=="table" then irn=r2["size"] end
  95. if type(r3)=="table" then irn_b=r3["size"] end
  96. if type(r4)=="table" then drac=r4["size"] end
  97. irn=irn+irn_b*9
  98. brd.addBox(2,41,90,110,0x000000,0.2)
  99. brd.addIcon(3,44,"IC2:blockReactorChamber")
  100. brd.addText(23,49,cn_form(c.proxy(ac_list[2]).getAverage()).." EU/t",0xbbbbbb)
  101. brd.addIcon(3,64,"AdvancedSolarPanel:BlockMolecularTransformer")
  102. brd.addText(23,67,cn_form(c.proxy(ac_list[1]).getAverage()).." EU/t",0xbbbbbb)
  103. brd.addIcon(3,80,"dwcity:Materia")
  104. brd.addText(23,85,string.format("%d",mat),0xbbbbbb)
  105. brd.addIcon(3,98,"minecraft:iron_block")
  106. brd.addText(23,103,string.format("%.2f",irn/9),0xbbbbbb)
  107. brd.addIcon(3,116,"minecraft:iron_ingot")
  108. brd.addText(23,121,string.format("%d",irn),0xbbbbbb)
  109. brd.addIcon(3,134,"DraconicEvolution:draconicIngot")
  110. brd.addText(23,139,string.format("%d",drac),0xbbbbbb)
  111. end
  112.  
  113. function skrin()
  114. local hs_p=30
  115. brd.addBox(1,hs_p-4,95,11,0x000000,0.2)
  116. brd.addText(4,28,string.format("Скриншотер - кыш"),0xbbbbbb)
  117. end
  118.  
  119. function spr()
  120. local hs_p=1
  121. local cpu_t=me.getCpus()
  122. brd.addBox(100,1,35,18*cpu_t["n"],0x000000,0.2)
  123. for i in pairs(cpu_t) do
  124. if type(cpu_t[i])=="table" then
  125. brd.addText(120,hs_p+5,"#"..i,0xbbbbbb)
  126. 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
  127. hs_p=hs_p+18
  128. end
  129. end
  130. end
  131.  
  132. function plrs()
  133. local hs_p=164
  134. brd.addBox(2,hs_p-4,90,14*#player,0x000000,0.2)
  135. for i=1,#player do
  136. if cr.addUser(player[i])~=nil then brd.addIcon(3,hs_p-5,"minecraft:skull",3) brd.addText(23,hs_p,player[i],0xbbbbbb)
  137. else brd.addIcon(3,hs_p-5,"minecraft:skull") brd.addText(23,hs_p,player[i],0x404040) end
  138. cr.removeUser(player[i])
  139. hs_p=hs_p+14
  140. end
  141. end
  142.  
  143.  
  144.  
  145. local function mod(a, b)
  146. return a - (math.floor(a/b)*b)
  147. end
  148.  
  149. local function getMEItemByName(items, name, damage)
  150. for _, item in pairs(items) do
  151. if type(item) == "table" and (item.name and item.name == name) and (item.damage and item.damage == damage) then
  152. return item
  153. end
  154. end
  155. return nil
  156. end
  157.  
  158. local function updateClockLine(surface, UI, clockCenter, name, angle, length, width, color)
  159. local endCoords = Geometry.getCoordFromAngleAndRadius(angle - 90, length)
  160.  
  161. if not UI[name] then
  162. UI[name] = surface.addLine({
  163. x = clockCenter.x,
  164. y = clockCenter.y
  165. }, {
  166. x = clockCenter.x + endCoords.x,
  167. y = clockCenter.y + endCoords.y,
  168. }, color, 1)
  169. UI[name].setWidth(width)
  170. else
  171. UI[name].setP2({
  172. x = clockCenter.x + endCoords.x,
  173. y = clockCenter.y + endCoords.y,
  174. })
  175. end
  176.  
  177. return UI[name]
  178. end
  179.  
  180. local previuosDayState = nil
  181.  
  182. local function render()
  183. for _, user in pairs(gl.getUsers()) do
  184. local userGl = gl.getSurfaceByUUID(user.uuid)
  185. local ext = SurfaceExtension.connect(userGl)
  186.  
  187. if not settings[user.uuid] then
  188. settings[user.uuid] = table.copyDeep(initialSettings)
  189. saveSettings(settings)
  190. end
  191.  
  192. local userSettings = settings[user.uuid]
  193.  
  194. if not UI[user.uuid] or userSettings.needRedraw then
  195. UI[user.uuid] = {}
  196. if userSettings.needRedraw then
  197. userSettings.needRedraw = false
  198. userGl.clear()
  199. end
  200. end
  201.  
  202. local userUI = UI[user.uuid]
  203.  
  204. local clockCenter = userSettings.clockCenter
  205. local euMeterPos = userSettings.euMeterPosition
  206. local meItemsTablePos = userSettings.meItemsTablePosition
  207. local lookedItems = userSettings.lookedItems
  208. local prefetchItems = me.getItemsInNetwork()
  209. local averageEU = ac.getAverage()
  210.  
  211. local counterText = (averageEU > 9999 and (string.format("%.2fk", averageEU / 1000)) or tostring(averageEU)).." EU/t"
  212.  
  213. if not userUI.counter then
  214. userUI.counter = ext.roundedRect(euMeterPos.x, euMeterPos.y, 72, 20, 4, 8)
  215. userUI.counter.polygon.setOpacity(0.6)
  216. userUI.counterIcon = userGl.addIcon(euMeterPos.x + 2, euMeterPos.y + 2, "AdvancedSolarPanel:BlockMolecularTransformer")
  217. userUI.counterText = userGl.addText(euMeterPos.x + 44, euMeterPos.y + 10, counterText, 0xFFFFFF)
  218. userUI.counterText.setScale(0.8)
  219. userUI.counterText.setObjectAnchor("MIDDLE", "MIDDLE")
  220. else
  221. userUI.counterText.setText(counterText)
  222. end
  223.  
  224. for index, item in ipairs(lookedItems) do
  225. local uiKey = item.name..":"..item.damage
  226. local uiIconKey = "icon:"..uiKey
  227. local uiTextKey = "text:"..uiKey
  228. local modIndex = mod(index, columns)
  229. local column = (modIndex == 0 and columns or modIndex)
  230. local row = math.ceil(index / columns)
  231. local x = (meItemsTablePos.x + ((column - 1) * 26)) -- 90
  232. local y = (meItemsTablePos.y + ((row - 1) * 26)) -- 38
  233. local itemObj = getMEItemByName(prefetchItems, item.name, item.damage)
  234. local itemText = "0"
  235. if itemObj then
  236. itemText = itemObj.size > 9999 and (string.format("%.1fk", itemObj.size / 1000)) or tostring(itemObj.size)
  237. end
  238.  
  239. if not userUI[uiKey] then
  240. userUI[uiKey] = ext.roundedRect(x, y, 20, 20, 4, 8)
  241. userUI[uiKey].polygon.setOpacity(0.6)
  242. userUI[uiIconKey] = userGl.addIcon(x + 2, y + 2, item.name, item.damage)
  243. userUI[uiTextKey] = userGl.addText(x + 10, y + 20, itemText, 0xFFFFFF)
  244. userUI[uiTextKey].setScale(0.6)
  245. userUI[uiTextKey].setObjectAnchor("MIDDLE", "MIDDLE")
  246. else
  247. if itemToRemove and itemToRemove.name == item.name and itemToRemove.damage == item.damage and itemToRemove.uuid == user.uuid then
  248. userUI[uiKey].polygon.delete()
  249. userUI[uiIconKey].delete()
  250. userUI[uiTextKey].delete()
  251.  
  252. settings[user.uuid].lookedItems = table.filter(lookedItems, function(element)
  253. return not (element.name == itemToRemove.name and element.damage == itemToRemove.damage)
  254. end)
  255.  
  256. saveSettings(settings)
  257.  
  258. itemToRemove = nil
  259. userUI[uiKey] = nil
  260. userUI[uiIconKey] = nil
  261. userUI[uiTextKey] = nil
  262. else
  263. userUI[uiTextKey].setText(itemText)
  264. end
  265. end
  266. end
  267.  
  268. local now = Datetime:new()
  269. local isDay = now.hour >= 5 and now.hour < 19
  270. if previuosDayState == nil then
  271. previuosDayState = isDay
  272. end
  273.  
  274. if not userUI.background then
  275. userUI.background = ext.roundedRect(clockCenter.x - 36, clockCenter.y - 36, 72, 72, {36, 36, 36, 8}, {24, 24, 24, 8})
  276. userUI.background.polygon.setOpacity(0.6)
  277. end
  278.  
  279. if userUI.clockIcon then
  280. userUI.clockIcon.delete()
  281. end
  282. userUI.clockIcon = userGl.addIcon(clockCenter.x - 36, clockCenter.y - 36, "minecraft:clock")
  283.  
  284. if not userUI.c1 then
  285. userUI.c1 = ext.circle(clockCenter.x, clockCenter.y, 28, 72)
  286. userUI.c1.polygon.setColor(isDay and 0xEE9A00 or 0xDBE6E0)
  287. userUI.c1.polygon.setOpacity(0.8)
  288. end
  289.  
  290. if not userUI.c2 then
  291. userUI.c2 = ext.circle(clockCenter.x + (isDay and 0 or 8), clockCenter.y, 20, 72)
  292. userUI.c2.polygon.setColor(isDay and 0xFEF0DB or 0x4E78A0)
  293. userUI.c2.polygon.setOpacity(0.5)
  294. end
  295.  
  296. if not userUI.warn then
  297. userUI.warn = ext.circle(clockCenter.x + 8, clockCenter.y, 5, 36)
  298. userUI.warn.polygon.setColor(0xFF0000)
  299. userUI.warn.polygon.setOpacity(0)
  300. end
  301.  
  302. if now.hour >= 4 and now.hour < 5 then
  303. userUI.warn.polygon.setOpacity(0.8)
  304. else
  305. userUI.warn.polygon.setOpacity(0)
  306. end
  307.  
  308. if isDay ~= previuosDayState then
  309. previuosDayState = isDay
  310. userUI.c1.polygon.setColor(isDay and 0xEE9A00 or 0xDBE6E0)
  311. userUI.c2.polygon.setColor(isDay and 0xFEF0DB or 0x4E78A0)
  312. userUI.c2.setX(clockCenter.x + (isDay and 0 or 8))
  313. end
  314.  
  315. local modHour = mod(now.hour, 12)
  316.  
  317. updateClockLine(userGl, userUI, clockCenter, "hourLine", modHour * 30 + (now.min * 0.5), 16, 3, 0xFF0000)
  318. updateClockLine(userGl, userUI, clockCenter, "minuteLine", now.min * 6, 20, 2, 0x000000)
  319.  
  320. if not userUI.centerDot then
  321. userUI.centerDot = userGl.addPoint(clockCenter, 0x000000, 1)
  322. userUI.centerDot.setSize(4)
  323. end
  324.  
  325. if not userUI.numbers then
  326. userUI.numbers = {}
  327. for i = 1, 12 do
  328. local textCoords = Geometry.getCoordFromAngleAndRadius(i * 30 - 90, 24)
  329. userUI.numbers[i] = userGl.addText(clockCenter.x + textCoords.x, clockCenter.y + textCoords.y, tostring(i), 0x000000)
  330. userUI.numbers[i].setScale(0.5)
  331. userUI.numbers[i].setObjectAnchor("MIDDLE", "MIDDLE")
  332. end
  333. end
  334. end
  335. gl.sync()
  336. end
  337.  
  338. local function onPlayerNoGlasses(eventName, addr, userName, userUUID)
  339. UI[userUUID] = nil
  340. end
  341.  
  342. local function onPlayerTerminalCommand(eventName, addr, userName, userUUID, command)
  343. local cmd, args = commands.parse(command)
  344.  
  345. if cmd == "look" then
  346. table.insert(settings[userUUID].lookedItems, {
  347. name = args[1],
  348. damage = args[2] or 0
  349. })
  350. saveSettings(settings)
  351. end
  352. if cmd == "unlook" then
  353. itemToRemove = {
  354. name = args[1],
  355. damage = args[2] or 0,
  356. uuid = userUUID
  357. }
  358. end
  359. end
  360.  
  361. local started = true
  362. local timerId
  363.  
  364. local function main()
  365. if started then
  366. render()
  367.  
  368. end
  369. end
  370.  
  371. function start()
  372. if not started then
  373. started = true
  374.  
  375. timerId = event.timer(1, main, math.huge)
  376.  
  377. events.addEventListener("glasses_detach", onPlayerNoGlasses)
  378. events.addEventListener("glasses_chat_command", onPlayerTerminalCommand)
  379. end
  380. end
  381.  
  382. function status()
  383. print("Currently working: "..(started and "True" or "False"))
  384. print("Active users:")
  385. for _, user in pairs(gl.getUsers()) do
  386. print(" "..user.name)
  387. end
  388. end
  389. function stop()
  390. if started then
  391. started = false
  392. event.cancel(timerId)
  393. events.removeAllListeners()
  394. end
  395. end
  396. while true do
  397. if not(c.isAvailable("openperipheral_bridge") and c.isAvailable("average_counter") and c.isAvailable("me_controller")) then cr.shutdown(1) end
  398.  
  399. spr()
  400. tps()
  401. real_time()
  402. plrs()
  403.  
  404. skrin()
  405. sis()
  406. render()
  407.  
  408. end
Advertisement
Add Comment
Please, Sign In to add comment