Advertisement
mrWhiskasss

полуляризация варпа 2.0

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