Гайд [OC] ModMK . или как стать властелином сервера?

vah

Игрок
Доброго времени суток , юзер . сегодня поведаю о интересностях в моде ModMK (Собственная разработка hilarious). буду вещать по факту и не о дынях и кирпичах , а о тех предметах которые непосредственно предполагают использования мода OpenComputers и Lua в качестве способа в взаимодействия с ним , а так же приложу код для компонентов мода.

И так начнем , первым на очереди будет "Счетчик энергии" , как нам говорит вики , он служит для изменения напряжения EU которое через него проходит (выход через лицевую сторону) , а так же для автоматической обработке показаний , что очень полезно например для владельцев магазинов или градостроителей , благодаря данному блоку появляется возможность тарификации электричества , соответственно оправдывая затраты на производство этой самой энергии , в дальнейшем мы поговорим от том как это можно реализовать , но в данный момент разберем API данного блока и способ его подключения , а так же использования , приступим.

Подключение: Так же как и все остальные блоки из этого мода ,подключается блок непосредственно проводом к ПК или же устанавливается рядом с ним , далее мы не будет заострять на это внимание.

Код:
Название компонента: eu_counter

value(): number - Возвращает количество энергии, прошедшей через счетчик

current(): number - Возвращает ток, текущий через счетчик (в единицах энергии в секунду)

voltage(): number - Возвращает установленное напряжение

voltage(x: number) - Устанавливает новое напряжение


предлагаю набросать небольшой скрипт используя выше описанное API , итак разберем такую ситуацию :вы градостроитель и предоставляете вашим горожанам электроэнергию , но чтобы расходы на энергию не взлетали , вы решили тарифицировать энергию с последующей её оплатой горожанами , благодаря такому решению вы покроете расходы на добычу энергии и заработаете копеечку(или не копеечку) для расширения города , напомню что приобретение статуса предполагает определённую плату за него , что вам понадобится? ну во-первых это компьютер который соответствует вашим параметрам , по факту подойдет любой компьютер который способен включится и исполнять скрипты, а также питание для него . Во-вторых это сам счетчик энергии . В-третьих это красная плата , для того чтобы ограничивать доступ к электро энергии неплательщика.

Код:
----[[ Привязываем API ]]----
local component = require('component')
local sides = require('sides')
local event = require('event')
local gpu = component.gpu
local redstone = component.redstone
----[[ Настройки ]]----
local blocked_amount = 1024 -- число на счетчике при котором будет блокироваться подача энергии
local default_volt = 32 -- напряжение подаваемое на выход допустимые значения: 32,128,512,2048,8096
gpu.setResolution(24,12)
----[[ Подготовка к работе ]]----
component.proxy(component.list('eu_counter')()).voltage(default_volt)
redstone.setOutput(sides.bottom,0)
----[[ Дополнительные функции ]]----
local function screen(str)
  gpu.set(1,6,tostring(str))
end
----[[ Главный цикл ]]----
while true do
  local e = event.pull(0)
  if e ~= nil and e[1] == 'key_up' then -- при нажатии любой клавиши скрипт закрывается , после настройки уберите клавиатуру
    break
  end
  local volt = component.proxy(component.list('eu_counter')()).value()
  if volt >= blocked_amount - (default_volt * 4) then
    redstone.setOutput(sides.bottom,15)
    component.proxy(component.list('eu_counter')()).voltage(0)
    screen('Оплатите электроэнергию!')
  else
    screen(volt)
  end
end

Следующим будет считыватель карт по истине интересная вещь , она помогает манипулировать валютой , а так же проходить идентификацию и записывать данные на карту , карт существую 2 вида это магнитные карты и смарт-карты . именно с помощью смарт-карт мы будем производить нехитрые манипуляции с деньгами . для чего это может пригодится? да для чего угодно! не хотите платить деньги за установку табличек ChestShop? не беда используйте карты и ваш самописный магазин.
Хотите получать платежи или пожертвования в валюте? считыватель карт то что вам нужно! ничего сверхъестественного мы делать не будем лишь набросаем небольшой платежный скрипт , для полноценного использования его нужно будет подогнать под себя.

Код:
cancel() - Отменяет все запланированные операции
read() - Запрашивает считывание карты (индикатор становится зеленым). Функция возвращается немедленно, по завершению операции будет вызвано событие.
write(x: binary) - Запрашивает запись карты (индикатор становится оранжевым). Функция возвращается немедленно, максимальный размер данных - 128 байт.
pay(target: string, amount: number)  - Запрашивает платеж (индикатор становится розовым). Только для смарт-карт. Деньги списываются с основного баланса пользователя (/money) и начисляются на баланс того, чей ник указан первым аргументом. По результату операции вызывается событие.
auth() - Запрашивает аутентификацию пользователя (индикатор становится голубым). Только для смарт-карт. По клику вызывается событие с ником кликнувшего

Код:
local component = require('component')
local event = require('event')
local card = component.card_reader

local function pay(user,amount,timeout)
  local result = {}
  card.pay(user,amount) -- запрашиваем подтверждение оплаты
  for i=1,3 do -- 3 попытки получить подтверждение
    local evnt = {event.pull(math.ceil(tonumber(timeout)/3),'card_event')} -- получаем событие card_event
    if evnt ~= nil and evnt[3] == 'payment_result' then -- узнаем результат , прошли ли оплата
      result = {status=evnt[4],code=evnt[5],amount=evnt[6],user=evnt[7],target=evnt[9]} -- передаем данные в массив
      break -- принудительно прерываем цикл
    end
  end
  if result.code == nil then -- если переменная ничему не равна значит событие не было получено
    card.cancel() -- закрываем транзакцию
    result.code = 'timeout' -- даем понять что транзакция не прошла из-за таймаута
  end
  return result -- возвращаем массив с данными
end

local payment = pay('vah',10,120) -- запрашиваем оплату
if payment.code == 'timeout' then  -- проверяем статус оплаты и выводим на экран
  print('Время транзакции вышло!')
elseif payment.code == 'ok' then
  print('Транзакция прошла успешно!')
elseif payment.code == 'rejected' then
  print('Транзакция отменена пользователем!')
elseif payment.code == 'not_enough_money' then
  print('Недостаточно средств!')
end

На этом всё , спасибо за внимание!

Использованные источники: w.hil.su .

Скриншот счетчика:
U7YnbC0YuxM.jpg
 
Последнее редактирование модератором: