mercur1al

Radiation frame

Dec 31st, 2018
159
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- http://computercraft.ru/topic/2498-ramka-radiatsionnogo-kontrolya/
  2. -- https://pastebin.com/edit/c2Gd1s8Z
  3. -- https://www.youtube.com/user/Hikooshi
  4. local component = require("component")
  5. local gpu = component.gpu
  6. local event = require("event")
  7. local unicode = require("unicode")
  8. local term = require("term")
  9. local shift = 1
  10. local warnings = {{0xFF0000, "Вы заражены"}, {0x00FF00, "Вы не заражены"}}
  11. local sides = require("sides")
  12. local rs = component.redstone
  13. local plr = {}
  14. local players = {}
  15. local chkd = nil
  16. local side_rs = 2 -- Это сторона вывода редстоуна, её можно поменять
  17. local awaiting = false
  18.  
  19.  
  20. fPix = unicode.char(9608)
  21. uPix = unicode.char(9600)
  22. dPix = unicode.char(9604)
  23.  
  24. progressBars = {
  25. progressBar2 = {x=3, y=7, length=32, title="Новый прогрессбар", width=5, active = true, showPercents = true, fill = true, percents = 0, cFore = 0x00FF00, cForePrepare = 0x009900, cForeProgress = 0x0000FF, cForeTitle = 0xFFFFFF, cBackTitle = 0x000000, cForePercents = 0xFFFFFF}}
  26.  
  27. function drawProgressBar()
  28.  
  29. term.clear()
  30. gpu.setResolution(36, 18)
  31. tbl1 = progressBars.progressBar2
  32. if tbl1.active then
  33. gpu.setBackground(tbl1.cFore)
  34. gpu.fill(tbl1.x-2, tbl1.y-1, tbl1.length+6, tbl1.width+2, " ")
  35. gpu.setForeground(tbl1.cForePrepare)
  36. if tbl1.width%2 == 1 then
  37. gpu.fill(tbl1.x, tbl1.y, tbl1.length, tbl1.width, fPix)
  38. elseif tbl1.width%2 == 0 then
  39. gpu.setBackground(tbl1.cFore)
  40. gpu.fill(tbl1.x, tbl1.y, tbl1.length, 1, dPix)
  41. gpu.fill(tbl1.x, tbl1.y + 1, tbl1.length, tbl1.width - 1, fPix)
  42. gpu.fill(tbl1.x, tbl1.y + tbl1.width, tbl1.length, 1, uPix)
  43. end
  44. if tbl1.showPercents then
  45. gpu.setForeground(tbl1.cForePercents)
  46. if tbl1.percents <= 9 then
  47. percents = tostring(tbl1.percents) .. "%"
  48. for i = tbl1.x + tbl1.length/2 - 1, tbl1.x + tbl1.length/2 do
  49. local _, color = gpu.get(i, tbl1.y)
  50. gpu.setBackground(color)
  51. gpu.set(i, tbl1.y + math.floor(tbl1.width/2), string.sub(percents, i - tbl1.x - (tbl1.length/2 - 2)))
  52. end
  53. elseif tbl1.percents > 9 and tbl1.percents < 100 then
  54. percents = tostring(tbl1.percents) .. "%"
  55. for i = tbl1.x + tbl1.length/2 - 1, tbl1.x + tbl1.length/2 + 1 do
  56. local _, color = gpu.get(i, tbl1.y)
  57. gpu.setBackground(color)
  58. gpu.set(i, tbl1.y + math.floor(tbl1.width/2), string.sub(percents, i - tbl1.x - (tbl1.length/2 - 2)))
  59. end
  60. else
  61. percents = tostring(tbl1.percents) .. "%"
  62. for i = tbl1.x + tbl1.length/2 - 2, tbl1.x + tbl1.length/2 + 1 do
  63. local _, color = gpu.get(i, tbl1.y)
  64. gpu.setBackground(color)
  65. gpu.set(i, tbl1.y + math.floor(tbl1.width/2), string.sub(percents, i - tbl1.x - (tbl1.width/2 - 3)))
  66. end
  67. end
  68. end
  69. end
  70.  
  71. end
  72.  
  73. function processingProgressBar(varEff)
  74.  
  75. tbl = progressBars.progressBar2
  76. activator = true
  77. while activator do
  78. if tbl.percents < 100 then
  79. tbl.percents = tbl.percents + 1
  80. percents = tostring(tbl.percents) .. "%"
  81. os.sleep(0.05)
  82. else
  83. activator = false
  84. end
  85. if tbl.width%2 == 1 then
  86. gpu.setForeground(tbl.cForeProgress)
  87. gpu.fill(tbl.x, tbl.y, math.floor(tbl.percents/(100/tbl.length)), tbl.width, fPix)
  88. elseif tbl.width%2 == 0 then
  89. gpu.setForeground(tbl.cForeProgress)
  90. gpu.setBackground(tbl.cFore)
  91. gpu.fill(tbl.x, tbl.y, math.floor(tbl.percents/(100/tbl.length)), 1, dPix)
  92. gpu.fill(tbl.x, tbl.y + 1, math.floor(tbl.percents/(100/tbl.length)), tbl.width - 1, fPix)
  93. gpu.fill(tbl.x, tbl.y + tbl.width, math.floor(tbl.percents/(100/tbl.length)), 1, uPix)
  94. end
  95. if tbl.showPercents == true then
  96. gpu.setForeground(tbl.cForePercents)
  97. if tbl.percents >= 0 and tbl.percents <= 9 then
  98. for i = tbl.x + tbl.length/2 - 1, tbl.x + tbl.length/2 do
  99. local _, color = gpu.get(i, tbl.y)
  100. gpu.setBackground(color)
  101. gpu.set(i, tbl.y + math.floor(tbl.width/2), string.sub(percents, i - tbl.x - (tbl.length/2 - 2)))
  102. end
  103. elseif tbl.percents > 9 and tbl.percents < 100 then
  104. for i = tbl.x + tbl.length/2 - 1, tbl.x + tbl.length/2 + 1 do
  105. local _, color = gpu.get(i, tbl.y)
  106. gpu.setBackground(color)
  107. gpu.set(i, tbl.y + math.floor(tbl.width/2), string.sub(percents, i - tbl.x - (tbl.length/2 - 2)))
  108. end
  109. elseif tbl.percents == 100 then
  110. for i = tbl.x + tbl.length/2 - 2, tbl.x + tbl.length/2 + 1 do
  111. local _, color = gpu.get(i, tbl.y)
  112. gpu.setBackground(color)
  113. gpu.set(i, tbl.y + math.floor(tbl.width/2), string.sub(percents, i - tbl.x - (tbl.length/2 - 3)))
  114. end
  115. end
  116. end
  117. end
  118. drawMessage(varEff)
  119. gpu.setForeground(0xFFFFFF)
  120. gpu.setBackground(0x000000)
  121.  
  122. end
  123.  
  124. function drawMessage(eff)
  125.  
  126. gpu.setBackground(0x444444) --цвет фона сообщения о заражении или незаражении +
  127. term.clear()
  128. gpu.setResolution(28, 14)
  129. if eff == true then
  130. gpu.setForeground(warnings[1][1])
  131. --gpu.set(2, 3, warnings[1][2])
  132. --gpu.fill(1, 3, 16, 4, unicode.char(9608))
  133. gpu.set(1, 7, "Радиоактивный фон выше нормы")
  134. gpu.set(1, 9, " Оставайтесь на месте ")
  135. chkd = true
  136. else
  137. gpu.setForeground(warnings[2][1])
  138. --gpu.set(3, 3, warnings[2][2])
  139. --gpu.fill(1, 3, 16, 4, unicode.char(9608))
  140. gpu.set(1, 7, " Радиоактивный фон в норме ")
  141. gpu.set(1, 9, " Проходите ")
  142. rs.setOutput(side_rs, 15)
  143. chkd = false
  144. end
  145. progressBars.progressBar2.percents = 0
  146. awaiting = false
  147.  
  148. end
  149.  
  150.  
  151.  
  152.  
  153. -- рабочее пространство ограничено кубом
  154. -- ! задать координаты относительно сенсора
  155. local x1,x2,y1,y2,z1,z2 = -2,2, 0,0, -2,2
  156. -- ! задать паузу между опросами сенсора (в секундах)
  157. local pause = 1
  158.  
  159. local time = require"computer".uptime
  160. local sens = component.openperipheral_sensor
  161. --local rs = component.redstone
  162.  
  163. local fRadiation -- флаг наличия зараженного игрока в опасной зоне
  164. local player_name -- имя неудачника (Родина должна знать своих героев!)
  165.  
  166. rs.setOutput(side_rs, 0)
  167.  
  168. while true do
  169. local eff = false
  170. local playerFound = false
  171. os.sleep(pause)
  172. players = sens.getPlayers()
  173. for _,player in pairs(players) do
  174. local fOk, player = pcall(sens.getPlayerByUUID,player.uuid)
  175. if fOk then
  176. info = player.all()
  177. local p = info.position
  178. if x1<=p.x and p.x<=x2 and y1<=p.y and p.y<=y2 and z1<=p.z and p.z<=z2 then
  179. playerFound = true
  180. break
  181. end
  182. --else
  183. --chkd = false
  184. end
  185. end
  186. if playerFound then
  187. for _,effect in pairs(info.living.potionEffects) do
  188. if effect == "ic2.potion.radiation" then
  189. eff = true
  190. break
  191. end
  192. end
  193. else
  194. chkd = false
  195. end
  196. --print(playerFound, eff, chkd)
  197. if playerFound == true and rs.getOutput(side_rs) == 0 then
  198. if not chkd then
  199. gpu.setBackground(0x444444) --цвет фона предупреждения +
  200. gpu.setForeground(0xFFFFFF) --цвет текста предупреждения +
  201. term.clear()
  202. gpu.setResolution(20, 10)
  203. --gpu.set(1, 3, "Сейчас будет произведена проверка") --X, Y, Само предупрежедние +
  204. gpu.set(1, 5, " Сейчас будет ")
  205. gpu.set(1, 6, "произведена проверка")
  206. os.sleep(2)
  207. drawProgressBar()
  208. processingProgressBar(eff)
  209. end
  210. elseif playerFound == false and not awaiting then
  211. gpu.setBackground(0x444444) --цвет фона сообщения об ожидании +
  212. gpu.setForeground(0x0000FF) --цвет текста сообщения об ожидании +
  213. term.clear()
  214. gpu.setResolution(8, 4)
  215. --gpu.set(74, 25, "Ожидание игрока") --X, Y, сообщение об ожидании +
  216. gpu.set(1, 2, "Ожидание")
  217. gpu.set(1, 3, " игрока ")
  218. rs.setOutput(side_rs, 0)
  219. awaiting = true
  220. end
  221. end
RAW Paste Data