Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- ============================================================================
- -- Программка "Учета и поощрения варпЛодырей", v.0.0.1
- -- Внимание. Данные о игроках хранятся в /home/score.txt.
- -- Этот файл можно редактировать или удалить перед повторным запуском программки.
- -- Программка предназначена для популяризации варпов на сервере и бесплатной
- -- прогрузки своих чанков тельцами других игроков.
- -- программка ведет учет посетителей варпа с помощью радара (addon Computronics)
- -- https://pastebin.com/Xnhw7dnq
- -- http://computercraft.ru/topic/2361-programma-dlya-podgruzki-i-populyarizatsii-varpov-magazinov/?tab=comments#comment-36500
- -- https://www.youtube.com/watch?v=9dvH2cy2vcE
- --=============================================================================
- local com = require("component")
- local computer = require('computer')
- local serialization = require('serialization')
- local event = require('event')
- local fs = require('filesystem')
- local sides = require('sides')
- local gpu = com.gpu
- local chat = com.chat_box
- local radar = com.radar
- local redstone = com.redstone
- local w, h = 80, 25
- local dataPath = '/home/score.txt'
- local scorePlayers = {} -- топ таблица игроков на варпе
- gpu.setResolution(w, h)
- -- Конфигурация программы
- local top = 15 -- кол-во игроков, которые выводятся в топ на экран (оптимально для монитора 2х3 - 15 чел.)
- local pause = 30 -- пауза(такт) при сканировании игроков на варпе, оптимально - 30 сек. За один такт всем игрокам на варпе накидывается 1 балл
- local radius = 32 -- радиус варпа(эффекта не даст, если значение больше, чем аппаратные возможности радара). Нужно больше радаров или нужно просить админа увеличить значение в конфиге мода.
- local warpname = 'SHOP' -- укажите имя своего варпа
- local owners = {['Alex'] = true, ['Bob'] = true} -- владельцы варпа, для которых не следует вести статистику. Отредактировать для своего варпа.
- local right_padding_score = 6 -- правый отступ значения очков игрока в таблицах
- local left_padding_nick = 0 -- левый отступ для ников в таблицах
- local left_padding_caption = 6 -- левый отступ заголовков
- local x, y = 2, 5 -- положение левого верхнего угла таблицы
- local min_score = 1000 -- необходимое и достаточное суммарное значение всех "бегающих" баллов на варпе, при котором начинают дропаться бананы и ананасы из раздатчиков
- local function saveData(path, data)
- io.open(path, 'w'):write(serialization.serialize(data)):close()
- end
- local function loadData(path)
- local data
- if fs.exists(path) then
- data = serialization.unserialize(io.open(path, 'r'):read('*all'))
- else
- data = {
- ---[[ удалите один значок тире в этой строке для того, чтобы не учитывать тестовых игроков,
- -- или отредактируйте(очистите) таблицу. Например: data={}
- Vika = 100,
- Dodik12 = 59,
- Bob = 4,
- BlackShark = 8,
- vovan4ik88 = 43,
- Rulezik = 109,
- vasyandra = 12,
- ZloyTapok = 65908,
- Nagibashka = 15,
- AngelKiller = 5,
- UbivashkaAdminoff = 17,
- Babka90 = 36,
- Tecktonik_Girl = 45,
- pikachu = 10,
- Bambi = 18,
- Killer89 = 7,
- JSon4ik = 5,
- OtpadnayaTelka13 = 3,
- VsehPorvu = 33
- --]]
- } -- демонстрационная таблица накопления баллов игроками на варпе
- end
- return data
- end
- local function sort(t, order)
- local keys = {}
- for k in pairs(t) do keys[#keys + 1] = k end
- table.sort(keys, function(a,b) return order(t, a, b) end)
- local i = 0
- return function()
- i = i + 1
- if keys[i] then
- return keys[i], t[keys[i]]
- end
- end
- end
- local function signal(p1,p2,p3)
- redstone.setOutput(sides.top, 15)
- os.sleep(0.1)
- redstone.setOutput(sides.top, 0)
- end
- local function redStoneAction(total_score_in_warp) -- реализован самый примитивный раздатчик для демонстрации
- --[[Подать сигнал редстончика на раздатчики (приз за загрузку чанков на варпе)
- как вариант, подавать несколько сигналов на несколько редстончикБлоков
- и выдавать призы разной ценности или рандомно, или учитывать "полезный вес" и суммарные очки игроков на варпе в данный момент.
- То есть чем "толще" и полезнее игроки, тем дороже дроп и больше дропа и больше раздатчиков задействуется.
- Раздатчиками кидать призы в толпу на специальную аренку.
- Что-то тут нужно отчебучить, то есть начать генерировать короткие сигналы(паттерны) на систему редБлоков ОС
- в зависимости от соотношения суммарных балов на варпе к барьерному значению.]]
- ---[[
- if total_score_in_warp > min_score then
- computer.beep(1500, 0.8)
- signal(p1,p2,p3) -- здесь будут какие-то ваши параметры p1, p2, p3 ...
- else
- -- отдохни и копи пока баллы или зови своих друзей на варп, чтобы создать большее суммарное кол-во баллов на варпе для преодоления барьера
- computer.beep(500, 0.2)
- end
- --]]
- end
- local function topDraw(players)
- gpu.setForeground(0x000000)
- gpu.setBackground(0xFFFFFF)
- gpu.fill(1, 1, w, h, " ")
- local pos = 1
- local i_str = 0
- local offset_score = w/2 - right_padding_score - x
- -- header
- gpu.setBackground(0x4B4B4B)
- gpu.fill(1, 1, w, 3, " ")
- gpu.setForeground(0xFFB600)
- gpu.set(left_padding_caption, 2, 'ТОП-'..top..' игроков варпа ['..warpname..']:')
- gpu.set(w/2 + left_padding_caption, 2, 'Игроки на варпе сейчас('..#players..'):')
- --footer
- gpu.setBackground(0x4B4B4B)
- gpu.fill(1, h, w, h, " ")
- gpu.setForeground(0x787878)
- count = 0
- for k, v in pairs(scorePlayers) do
- count = count + 1
- end
- gpu.set(2, h, '© http://computercraft.ru, freeRAM: '..math.floor(computer.freeMemory()/1024)..' Kbyte, Всего игроков в базе: '..count..' чел.')
- -- === рисуем глобальный ТОП-x, таблицу ===
- for nick, score in sort(scorePlayers, function(t,a,b) return t[b] < t[a] end) do
- if i_str%2 == 0 then
- gpu.setBackground(0xd2d2d2)
- gpu.fill(x,y + i_str, w/2 - x, 1, " ")
- else
- gpu.setBackground(0xFFFFFF)
- end
- gpu.setForeground(0x3C3C3C)
- gpu.set(x + left_padding_nick, y + i_str, (i_str+1)..'.')
- gpu.set(x + left_padding_nick + 5, y + i_str, nick)
- gpu.setForeground(0x0000FF)
- gpu.set(x + offset_score, y + i_str, tostring(score))
- pos = pos + 1
- if pos > top then break end
- i_str = i_str + 1
- end
- --рисуем справа игроков, которые в данный момент на варпе и их текущие очки (вывод до 10 случайных игроков)
- --и посчитаем ВСЕ очки игроков на варпе, которые в данный момент там бегают
- gpu.setBackground(0xFFFFFF)
- i_str = 0
- local total_score_in_warp = 0
- for i = 1, #players do
- local nick = players[i].name
- total_score_in_warp = total_score_in_warp + scorePlayers[nick]
- if i <= 10 then
- gpu.setForeground(0x3C3C3C)
- if owners[nick] then
- gpu.set(x + w/2, y + i_str, nick..'®')
- else
- gpu.set(x + w/2, y + i_str, nick)
- end
- gpu.setForeground(0x0000FF)
- gpu.set(x + w/2 + offset_score, y + i_str, tostring(scorePlayers[nick]))
- i_str = i_str + 1
- end
- end
- if total_score_in_warp > min_score then
- gpu.setForeground(0x006D00)
- gpu.set(x + w/2, y + i_str + 1, 'Сейчас на варпе, баллов: '..total_score_in_warp..' ☺')
- else
- gpu.setForeground(0xCC0000)
- gpu.set(x + w/2, y + i_str + 1, 'Сейчас на варпе, баллов: '..total_score_in_warp..' ☹')
- end
- gpu.setForeground(0x787878)
- gpu.set(x + w/2, y + i_str + 2, 'Призы выдаются при: '..min_score..' баллов')
- gpu.set(x + w/2, y + i_str + 3, 'Начисление: 1 балл за '..pause..' сек.')
- gpu.set(x + w/2, y + i_str + 4, 'Радиус сканирования варпа: '..radius..' м.')
- gpu.set(x + w/2, y + i_str + 5, 'Примечание: ® - владельцы варпа')
- -- гивалка призов
- redStoneAction(total_score_in_warp)
- end
- -- радар
- scorePlayers = loadData(dataPath)
- while true do
- players = radar.getPlayers(radius) -- {distans, name}
- for i = 1, #players do
- if scorePlayers[players[i].name] and not owners[players[i].name] then
- scorePlayers[players[i].name] = scorePlayers[players[i].name] + 1
- else
- scorePlayers[players[i].name] = 0
- end
- end
- --[[ debug, super test. (+ два фейковых игрока на варпе)
- players[#players + 1] = {distans = 5, name = 'Rulezik'}
- scorePlayers.Rulezik = scorePlayers.Rulezik + 1
- players[#players + 1] = {distans = 9, name = 'OtpadnayaTelka13'}
- scorePlayers.OtpadnayaTelka13 = scorePlayers.OtpadnayaTelka13 + 1
- --]]
- topDraw(players)
- saveData(dataPath, scorePlayers)
- os.sleep(pause)
- end
Add Comment
Please, Sign In to add comment