BlackFlex

warpTimer.lua

Jun 19th, 2018
453
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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 = 'SHOP' -- укажите имя своего варпа
  32. local owners = {['Alex'] = 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 = 100,
  53.         Dodik12 = 59,
  54.         Bob = 4,
  55.         BlackShark = 8,
  56.         vovan4ik88 = 43,
  57.         Rulezik = 109,
  58.         vasyandra = 12,
  59.         ZloyTapok = 65908,
  60.         Nagibashka = 15,
  61.         AngelKiller = 5,
  62.         UbivashkaAdminoff = 17,
  63.         Babka90 = 36,
  64.         Tecktonik_Girl = 45,
  65.         pikachu = 10,
  66.         Bambi = 18,
  67.         Killer89 = 7,
  68.         JSon4ik = 5,
  69.         OtpadnayaTelka13 = 3,
  70.         VsehPorvu = 33
  71.         --]]
  72.         } -- демонстрационная таблица накопления баллов игроками на варпе
  73.     end
  74.     return data
  75. end
  76.  
  77. local function sort(t, order)
  78.     local keys = {}
  79.     for k in pairs(t) do keys[#keys + 1] = k end
  80.     table.sort(keys, function(a,b) return order(t, a, b) end)
  81.     local i = 0
  82.     return function()
  83.         i = i + 1
  84.         if keys[i] then
  85.             return keys[i], t[keys[i]]
  86.         end
  87.     end
  88. end
  89.  
  90. local function signal(p1,p2,p3)
  91.   redstone.setOutput(sides.top, 15)
  92.   os.sleep(0.1)
  93.   redstone.setOutput(sides.top, 0)
  94. end
  95.  
  96. local function redStoneAction(total_score_in_warp) -- реализован самый примитивный раздатчик для демонстрации
  97.     --[[Подать сигнал редстончика на раздатчики (приз за загрузку чанков на варпе)
  98.     как вариант, подавать несколько сигналов на несколько редстончикБлоков
  99.     и выдавать призы разной ценности или рандомно, или учитывать "полезный вес" и суммарные очки игроков на варпе в данный момент.
  100.     То есть чем "толще" и полезнее игроки, тем дороже дроп и больше дропа и больше раздатчиков задействуется.
  101.     Раздатчиками кидать призы в толпу на специальную аренку.
  102.     Что-то тут нужно отчебучить, то есть начать генерировать короткие сигналы(паттерны) на систему редБлоков ОС
  103.     в зависимости от соотношения суммарных балов на варпе к барьерному значению.]]
  104.    
  105.     ---[[
  106.     if total_score_in_warp > min_score then
  107.         computer.beep(1500, 0.8)
  108.         signal(p1,p2,p3)  -- здесь будут какие-то ваши параметры p1, p2, p3 ...
  109.     else
  110.         -- отдохни и копи пока баллы или зови своих друзей на варп, чтобы создать большее суммарное кол-во баллов на варпе для преодоления барьера
  111.         computer.beep(500, 0.2)
  112.     end
  113.     --]]
  114. end
  115.  
  116. local function topDraw(players)
  117.    
  118.     gpu.setForeground(0x000000)
  119.     gpu.setBackground(0xFFFFFF)
  120.     gpu.fill(1, 1, w, h, " ")
  121.     local pos = 1
  122.     local i_str = 0
  123.     local offset_score = w/2 - right_padding_score - x
  124.      
  125.     -- header
  126.     gpu.setBackground(0x4B4B4B)
  127.     gpu.fill(1, 1, w, 3, " ")
  128.     gpu.setForeground(0xFFB600)
  129.     gpu.set(left_padding_caption, 2, 'ТОП-'..top..' игроков варпа ['..warpname..']:')
  130.     gpu.set(w/2 + left_padding_caption, 2, 'Игроки на варпе сейчас('..#players..'):')
  131.    
  132.     --footer
  133.     gpu.setBackground(0x4B4B4B)
  134.     gpu.fill(1, h, w, h, " ")
  135.     gpu.setForeground(0x787878)
  136.     count = 0
  137.     for k, v in pairs(scorePlayers) do
  138.         count = count + 1
  139.     end
  140.     gpu.set(2, h, '© http://computercraft.ru, freeRAM: '..math.floor(computer.freeMemory()/1024)..' Kbyte, Всего игроков в базе: '..count..' чел.')
  141.    
  142.     -- === рисуем глобальный ТОП-x, таблицу ===
  143.     for nick, score in sort(scorePlayers, function(t,a,b) return t[b] < t[a] end) do
  144.         if i_str%2 == 0 then
  145.             gpu.setBackground(0xd2d2d2)
  146.             gpu.fill(x,y + i_str, w/2 - x, 1, " ")
  147.         else
  148.             gpu.setBackground(0xFFFFFF)
  149.         end
  150.         gpu.setForeground(0x3C3C3C)
  151.         gpu.set(x + left_padding_nick, y + i_str, (i_str+1)..'.')
  152.         gpu.set(x + left_padding_nick + 5, y + i_str, nick)
  153.         gpu.setForeground(0x0000FF)
  154.         gpu.set(x + offset_score, y + i_str, tostring(score))
  155.         pos = pos + 1
  156.         if pos > top then break end
  157.         i_str = i_str + 1
  158.     end
  159.  
  160.     --рисуем справа игроков, которые в данный момент на варпе и их текущие очки (вывод до 10 случайных игроков)
  161.     --и посчитаем ВСЕ очки игроков на варпе, которые в данный момент там бегают
  162.     gpu.setBackground(0xFFFFFF)
  163.    
  164.     i_str = 0
  165.     local total_score_in_warp = 0
  166.    
  167.     for i = 1, #players do
  168.         local nick = players[i].name
  169.         total_score_in_warp = total_score_in_warp + scorePlayers[nick]
  170.         if i <= 10 then
  171.             gpu.setForeground(0x3C3C3C)
  172.             if owners[nick] then
  173.                 gpu.set(x + w/2, y + i_str, nick..'®')
  174.             else
  175.                 gpu.set(x + w/2, y + i_str, nick)
  176.             end
  177.             gpu.setForeground(0x0000FF)
  178.             gpu.set(x + w/2 + offset_score, y + i_str, tostring(scorePlayers[nick]))
  179.             i_str = i_str + 1
  180.         end
  181.     end
  182.    
  183.     if total_score_in_warp > min_score then
  184.         gpu.setForeground(0x006D00)
  185.         gpu.set(x + w/2, y + i_str + 1, 'Сейчас на варпе, баллов: '..total_score_in_warp..' ☺')
  186.     else
  187.         gpu.setForeground(0xCC0000)
  188.         gpu.set(x + w/2, y + i_str + 1, 'Сейчас на варпе, баллов: '..total_score_in_warp..' ☹')
  189.     end
  190.     gpu.setForeground(0x787878)
  191.     gpu.set(x + w/2, y + i_str + 2, 'Призы выдаются при: '..min_score..' баллов')
  192.     gpu.set(x + w/2, y + i_str + 3, 'Начисление: 1 балл за '..pause..' сек.')
  193.     gpu.set(x + w/2, y + i_str + 4, 'Радиус сканирования варпа: '..radius..' м.')
  194.     gpu.set(x + w/2, y + i_str + 5, 'Примечание: ® - владельцы варпа')
  195.    
  196.     -- гивалка призов
  197.     redStoneAction(total_score_in_warp)
  198. end
  199.  
  200. -- радар
  201. scorePlayers = loadData(dataPath)
  202. while  true do
  203.     players = radar.getPlayers(radius) -- {distans, name}
  204.     for i = 1, #players do
  205.         if scorePlayers[players[i].name] and not owners[players[i].name] then
  206.             scorePlayers[players[i].name] = scorePlayers[players[i].name] + 1
  207.         else
  208.             scorePlayers[players[i].name] = 0
  209.         end
  210.     end
  211.    
  212.     --[[ debug, super test. (+ два фейковых игрока на варпе)
  213.         players[#players + 1] = {distans = 5, name = 'Rulezik'}
  214.         scorePlayers.Rulezik = scorePlayers.Rulezik + 1
  215.         players[#players + 1] = {distans = 9, name = 'OtpadnayaTelka13'}
  216.         scorePlayers.OtpadnayaTelka13 = scorePlayers.OtpadnayaTelka13 + 1
  217.     --]]
  218.    
  219.     topDraw(players)
  220.     saveData(dataPath, scorePlayers)
  221.     os.sleep(pause)
  222. end
RAW Paste Data