serafim7

популяризация варпов [OpenComputers]

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