Advertisement
Guest User

Untitled

a guest
Feb 28th, 2020
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.47 KB | None | 0 0
  1. -- ============================================================================
  2. -- Программка "Учета и поощрения варпЛодырей", v.0.0.1
  3. -- Внимание. Данные о игроках хранятся в /home/score.txt.
  4. -- Этот файл можно редактировать или удалить перед повторным запуском программки.
  5. -- Программка предназначена для популяризации варпов на сервере и бесплатной
  6. -- прогрузки своих чанков тельцами других игроков.
  7. -- http://computercraft.ru
  8. -- https://www.youtube.com/watch?v=9dvH2cy2vcE
  9. --=============================================================================
  10.  
  11. local com = require("component")
  12. local computer = require('computer')
  13. local serialization = require('serialization')
  14. local event = require('event')
  15. local fs = require('filesystem')
  16. local sides = require('sides')
  17. local gpu = com.gpu
  18. local chat = com.chat_box
  19. local radar = com.radar
  20. local redstone = com.redstone
  21. local w, h = 80, 25
  22. local dataPath = '/home/score.txt'
  23. local scorePlayers = {} -- топ таблица игроков на варпе
  24. gpu.setResolution(w, h)
  25.  
  26.  
  27. -- Конфигурация программы
  28. local top = 15 -- кол-во игроков, которые выводятся в топ на экран (оптимально для монитора 2х3 - 15 чел.)
  29. local pause = 30 -- пауза(такт) при сканировании игроков на варпе, оптимально - 30 сек. За один такт всем игрокам на варпе накидывается 1 балл
  30. local radius = 32 -- радиус варпа(эффекта не даст, если значение больше, чем аппаратные возможности радара). Нужно больше радаров или нужно просить админа увеличить значение в конфиге мода.
  31. local warpname = 'дискорд astek#5378' -- укажите имя своего варпа
  32. local owners = {['astek'] = true, ['selah'] = true, ['gari1820'] = true, ['sallokol'] = true, ['yamishka'] = true, ['zEhan'] = true, ['Bob'] = true} -- владельцы варпа, для которых не следует вести статистику. Отредактировать для своего варпа.
  33. local right_padding_score = 6 -- правый отступ значения очков игрока в таблицах
  34. local left_padding_nick = 0 -- левый отступ для ников в таблицах
  35. local left_padding_caption = 6 -- левый отступ заголовков
  36. local x, y = 2, 5 -- положение левого верхнего угла таблицы
  37. local min_score = 1000 -- необходимое и достаточное суммарное значение всех "бегающих" баллов на варпе, при котором начинают дропаться бананы и ананасы из раздатчиков
  38.  
  39.  
  40. local function saveData(path, data)
  41. io.open(path, 'w'):write(serialization.serialize(data)):close()
  42. end
  43.  
  44. local function loadData(path)
  45. local data
  46. if fs.exists(path) then
  47. data = serialization.unserialize(io.open(path, 'r'):read('*all'))
  48. else
  49. data = {
  50. ---[[ удалите один значок тире в этой строке для того, чтобы не учитывать тестовых игроков,
  51. -- или отредактируйте(очистите) таблицу. Например: data={}
  52. Vika = 0,
  53. VsehPorvu = 0
  54. --]]
  55. } -- демонстрационная таблица накопления баллов игроками на варпе
  56. end
  57. return data
  58. end
  59.  
  60. local function sort(t, order)
  61. local keys = {}
  62. for k in pairs(t) do keys[#keys + 1] = k end
  63. table.sort(keys, function(a,b) return order(t, a, b) end)
  64. local i = 0
  65. return function()
  66. i = i + 1
  67. if keys[i] then
  68. return keys[i], t[keys[i]]
  69. end
  70. end
  71. end
  72.  
  73. local function signal(p1,p2,p3)
  74. redstone.setOutput(sides.top, 15)
  75. os.sleep(0.1)
  76. redstone.setOutput(sides.top, 0)
  77. end
  78.  
  79. local function redStoneAction(total_score_in_warp) -- реализован самый примитивный раздатчик для демонстрации
  80. --[[Подать сигнал редстончика на раздатчики (приз за загрузку чанков на варпе)
  81. как вариант, подавать несколько сигналов на несколько редстончикБлоков
  82. и выдавать призы разной ценности или рандомно, или учитывать "полезный вес" и суммарные очки игроков на варпе в данный момент.
  83. То есть чем "толще" и полезнее игроки, тем дороже дроп и больше дропа и больше раздатчиков задействуется.
  84. Раздатчиками кидать призы в толпу на специальную аренку.
  85. Что-то тут нужно отчебучить, то есть начать генерировать короткие сигналы(паттерны) на систему редБлоков ОС
  86. в зависимости от соотношения суммарных балов на варпе к барьерному значению.]]
  87.  
  88. ---[[
  89. if total_score_in_warp > min_score then
  90. computer.beep(1500, 0.8)
  91. signal(p1,p2,p3) -- здесь будут какие-то ваши параметры p1, p2, p3 ...
  92. else
  93. -- отдохни и копи пока баллы или зови своих друзей на варп, чтобы создать большее суммарное кол-во баллов на варпе для преодоления барьера
  94. computer.beep(500, 0.2)
  95. end
  96. --]]
  97. end
  98.  
  99. local function topDraw(players)
  100.  
  101. gpu.setForeground(0x000000)
  102. gpu.setBackground(0xFFFFFF)
  103. gpu.fill(1, 1, w, h, " ")
  104. local pos = 1
  105. local i_str = 0
  106. local offset_score = w/2 - right_padding_score - x
  107.  
  108. -- header
  109. gpu.setBackground(0x4B4B4B)
  110. gpu.fill(1, 1, w, 3, " ")
  111. gpu.setForeground(0xFFB600)
  112. gpu.set(left_padding_caption, 2, 'ТОП-'..top..' игроков варпа ['..warpname..']:')
  113. gpu.set(w/2 + left_padding_caption, 2, 'Игроки на варпе сейчас('..#players..'):')
  114.  
  115. --footer
  116. gpu.setBackground(0x4B4B4B)
  117. gpu.fill(1, h, w, h, " ")
  118. gpu.setForeground(0x787878)
  119. count = 0
  120. for k, v in pairs(scorePlayers) do
  121. count = count + 1
  122. end
  123. gpu.set(2, h, '© http://computercraft.ru, freeRAM: '..math.floor(computer.freeMemory()/1024)..' Kbyte, Всего игроков в базе: '..count..' чел.')
  124.  
  125. -- === рисуем глобальный ТОП-x, таблицу ===
  126. for nick, score in sort(scorePlayers, function(t,a,b) return t[b] < t[a] end) do
  127. if i_str%2 == 0 then
  128. gpu.setBackground(0xd2d2d2)
  129. gpu.fill(x,y + i_str, w/2 - x, 1, " ")
  130. else
  131. gpu.setBackground(0xFFFFFF)
  132. end
  133. gpu.setForeground(0x3C3C3C)
  134. gpu.set(x + left_padding_nick, y + i_str, (i_str+1)..'.')
  135. gpu.set(x + left_padding_nick + 5, y + i_str, nick)
  136. gpu.setForeground(0x0000FF)
  137. gpu.set(x + offset_score, y + i_str, tostring(score))
  138. pos = pos + 1
  139. if pos > top then break end
  140. i_str = i_str + 1
  141. end
  142.  
  143. --рисуем справа игроков, которые в данный момент на варпе и их текущие очки (вывод до 10 случайных игроков)
  144. --и посчитаем ВСЕ очки игроков на варпе, которые в данный момент там бегают
  145. gpu.setBackground(0xFFFFFF)
  146.  
  147. i_str = 0
  148. local total_score_in_warp = 0
  149.  
  150. for i = 1, #players do
  151. local nick = players[i].name
  152. total_score_in_warp = total_score_in_warp + scorePlayers[nick]
  153. if i <= 10 then
  154. gpu.setForeground(0x3C3C3C)
  155. if owners[nick] then
  156. gpu.set(x + w/2, y + i_str, nick..'®')
  157. else
  158. gpu.set(x + w/2, y + i_str, nick)
  159. end
  160. gpu.setForeground(0x0000FF)
  161. gpu.set(x + w/2 + offset_score, y + i_str, tostring(scorePlayers[nick]))
  162. i_str = i_str + 1
  163. end
  164. end
  165.  
  166. if total_score_in_warp > min_score then
  167. gpu.setForeground(0x006D00)
  168. gpu.set(x + w/2, y + i_str + 1, 'Сейчас на варпе, баллов: '..total_score_in_warp..' ☺')
  169. else
  170. gpu.setForeground(0xCC0000)
  171. gpu.set(x + w/2, y + i_str + 1, 'Сейчас на варпе, баллов: '..total_score_in_warp..' ☹')
  172. end
  173. gpu.setForeground(0x787878)
  174. gpu.set(x + w/2, y + i_str + 2, 'Призы выдаются при: '..min_score..' баллов')
  175. gpu.set(x + w/2, y + i_str + 3, 'Начисление: 1 балл за '..pause..' сек.')
  176. gpu.set(x + w/2, y + i_str + 4, 'Радиус сканирования варпа: '..radius..' м.')
  177. gpu.set(x + w/2, y + i_str + 5, 'Примечание: ® - владельцы варпа')
  178.  
  179. -- гивалка призов
  180. redStoneAction(total_score_in_warp)
  181. end
  182.  
  183. -- радар
  184. scorePlayers = loadData(dataPath)
  185. while true do
  186. players = radar.getPlayers(radius) -- {distans, name}
  187. for i = 1, #players do
  188. if scorePlayers[players[i].name] and not owners[players[i].name] then
  189. scorePlayers[players[i].name] = scorePlayers[players[i].name] + 1
  190. else
  191. scorePlayers[players[i].name] = 0
  192. end
  193. end
  194.  
  195. --[[ debug, super test. (+ два фейковых игрока на варпе)
  196. players[#players + 1] = {distans = 5, name = 'Rulezik'}
  197. scorePlayers.Rulezik = scorePlayers.Rulezik + 1
  198. players[#players + 1] = {distans = 9, name = 'OtpadnayaTelka13'}
  199. scorePlayers.OtpadnayaTelka13 = scorePlayers.OtpadnayaTelka13 + 1
  200. --]]
  201.  
  202. topDraw(players)
  203. saveData(dataPath, scorePlayers)
  204. os.sleep(pause)
  205. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement