Перейти к содержимому

ProgramCrafter

Пользователи
  • Публикации

    245
  • Зарегистрирован

  • Посещение

  • Победитель дней

    41

Сообщения, опубликованные пользователем ProgramCrafter


  1. В 16.02.2022 в 16:25, ProgramCrafter сказал:

    Инфа пока такая:

    /kit start - сет кожаной брони, каменные инструменты, 16 угля, 24 стейка

    /kit bonus - ? (стоит 10 денег)

    /kit vip - 32 угля, 32 стейка, 24 редстоуна, 12 золота, 24 резины, 16 олова, 12 свинца, 16 меди, 16 железа, 12 изменчивых кристаллов (AE2), 12 чистых изменчивых, 24 кристалла истинного кварца, 24 чистых кристалла истинного кварца, 24 заряженных кристалла истинного кварца, 24 чистых кристалла кварца нижнего мира

     

    Новая информация о наборах:

    • /kit start - 0 ЭУР - то же, что было раньше;
    • /kit vip - 0 ЭУР - те же ресурсы, что были (набор доступен, конечно, не всем :D);
    • /kit comp - 1000 ЭУР - тир3 корпус компьютера, тир3 процессор, тир3 видеокарта, 6 тир3 мониторов, тир3 жёсткий диск, 1 тир3,5 планка памяти, 3 пустых EEPROM, 3 пустых дискеты;
    • /kit bonus - 500 ЭУР - 128 угля, 48 стейков, 64 красной пыли, 32 слитка золота, 32 свинца, 48 железа, 48 меди, 48 олова, 64 резины;
    • /kit fict - 100 ЭУР - 10 кусачек и 10 молотов IC2;
    • /kit build - 500 ЭУР - 128 камня, 128 стекла, 64 базовых корпуса корабля WD, 64 стекла оттуда же, 128 деревянных и 128 железных строительных лесов, пустой строительный ранец (для пены) IC2 (конечно же, не кварц, из которого я хотел неадмин-магазин построить...);
    • /kit programm - 0 ЭУР - 2 тир2 корпуса компьютера, 3 тир1,5 планки памяти, 3 тир1 жёстких диска.

     

    Всё равно запрашиваю набор из одной укреплённой иридиевой пластины по цене ~150-250 ЭУР :)

    • Нравится 1

  2. 10 часов назад, Bumer_32 сказал:

    мод которым можно переводить одну энергию в другую

    PowerConverters (вроде бы так называется) стоит.

     

    10 часов назад, Bumer_32 сказал:

    ender storage

    О, это вроде прикольная штука, согласен :)

     

    10 часов назад, Bumer_32 сказал:

    передачу энергии на любые расстояния

    То же можно запилить на лазуротроновых кристаллах и эндер-сундуках, в принципе.


  3. На данный момент пчёлы сортируются по таким критериям:

    1. Все принцессы выше трутней;

    2. Менее топовый вид;

    3. Продолжительность жизни;

    4. Скорость работы.

     

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


  4. Под давлением общественности :) сделал версию, где отображаются только топовые пчёлы каждого вида.

    Скачать можно здесь: https://github.com/ProgramCrafter/lua-utils/blob/main/beealyzer_v2oc.lua

    Читаемость кода не максимальная, зато вся программа влазит в 256 строк - её можно скопировать и вставить в компьютер OC.

    Особых изменений по интерфейсу нет, поэтому думаю, что в скриншотах смысла нет.


  5. 4 минуты назад, rootmaster сказал:

    _ENV очишяеться при закрытии shell

    По-хорошему, tprotect должен запускаться вообще до начала загрузки системы. Тогда ему будет без разницы на закрытие shell/чего-то ещё.

     

    5 минут назад, rootmaster сказал:

    удалив pairs из _ENV будет работать оригинальный из _G

    Значит, _ENV тоже надо блокировать. Заодно не будут работать глобальные переменные - потому что не надо их использовать, лучше уж писать данные в tmpfs. (Или сделать в системе какую-то таблицу для хранения данных программ.)


  6. 24 минуты назад, hohserg сказал:

    Жду версию для очков OpenPeripherals, там можно предметы рендерить

    Тогда стоит завести issue на гитхабе: https://github.com/ProgramCrafter/lua-utils/issues

    Или на гитлабе - скоро и туда сделаю зеркало репозитория.


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

    Эта программа предназначена, чтобы быстро выбирать, каких пчёл скрещивать. Для этого важно видеть сразу все характеристики на одном экране. Именно поэтому меня не устроил просто сундук пчеловода - там надо наводить на каждую пчелу, зажав шифт, и запоминать - какая же пчела там лучше?..

    • Нравится 1

  8. 2 минуты назад, hohserg сказал:

    А сколько всего видов пчел в сборке?

    Пчелиный сундук говорит, что 37. Но может случиться, что Вольфрам поставит Extra Bees, и будет 150 видов, или где-то около того.

    Кстати, список пчёл есть здесь: https://minecraft.fandom.com/ru/wiki/Forestry/Пчеловодство


  9. 2 минуты назад, hohserg сказал:

    Как на счет красивых иконок пчелок?

    Очень мало места. Но если добавить их в шрифт OpenComputers, то можно, в принципе.

    Кто-то сможет нарисовать красиво пчелу шириной в два знакоместа? А точнее, двух пчёл - трутня (без короны) и принцессу (с короной).


  10. Изменения в новой версии (fe3a3c8) относительно начальной (5e97a3e):

    1. Добавлена поддержка тир3 экранов;

    2. Пчёлы сортируются по "уровню" - сложности получения их вида в селекции;

    3. Поддерживается несколько сундуков с пчёлами;

    4. Настройки сторон для сундуков и выдачи пчёл перенесены в начало программы.


  11. 15 минут назад, eu_tomat сказал:

    А сколько пчёл ты выдаёшь за один раз?

    По одной - но в отзывчивости программы разница в 2 тика (100 мс) может быть заметна.

     

    15 минут назад, eu_tomat сказал:

    увеличивает нагрузку на сервер

    Это хорошо было бы измерить. В то, что таймеры из RedLogic могут нагружать сервер, я верю - но срабатывание выбрасывателя не должно особенно сильно добавлять нагрузку. Вообще мне кажется, что основная нагрузка сервера - это изменение блоков и создание сущностей, и если в выбрасывателе пусто, то ничего из этого не происходит.


  12. 13 часа назад, eu_tomat сказал:

    А в чём преимущество такого решения?

    Основное преимущество - не требуется использовать контроллер красного камня или красную плату в компьютере.

    1) В тир2 компьютере и так мало места: один из слотов занимает видеокарта, во второй слот влазит максимум тир1 плата. Туда можно поставить редстоун-плату, но не нужно;

    2) Упрощается монтаж схемы - не надо думать, как подвести провод ещё и к контроллеру красного камня, или как разместить выбрасыватель достаточно близко к компьютеру, чтобы он получал сигнал;

    3) Такое решение на 2 тика быстрее - не надо включать и выключать сигнал. Следовательно, если надо обработать много пчёл, это может быть существенно. (Правда, сейчас большая часть времени тратится на обновление экрана. Сюда надо бы прикрутить буферизацию и использование по возможности gpu.copy.)


  13. Хотел заказать эту программу у других, но пришлось писать самому. Ничего, награду тоже выдам себе.

    Цитата

    Главная/Программирование/Разработчикам/Новые заказы

     

    Программа "Сундук пчеловода v1.OC"

     

    Описание: требуется программа - интерфейс для сундука с пчёлами.

     

    Требования к ПО:
    1. Выводить список пчёл в сундуке на экран. При этом должны выводиться вид пчелы (для гибридов - оба вида), срок жизни, скорость работы, допустимые температура и влажность, возможность пчелы работать ночью, под дождём и в пещере;
    2. Без перезапуска принимать новых пчёл через воронку/PIM (опционально - сразу забирать из пасек);
    3. Выдавать пчёл через раздатчик/PIM одним кликом по данным этой пчелы.

     

    Награда: два стака бутербродов с мёдом.

     

    Оборудование: тир2 компьютер, адаптер/транспозер, алмазный сундук IronChest либо сундук пчеловода из Forestry, опционально PIM.

     

    Связь: ответ на этот пост в дискорде. Ник на сервере - ProgramCrafter.

     

    Моя программа (https://github.com/ProgramCrafter/lua-utils/blob/a22e5e50ad46f130f6a7ec5959cd7282bb8a06df/beealyzer_v1oc.lua) служит компактным интерфейсом для сундука с пчёлами.

    Её возможности:

    1. Сканирование сундука и вывод списка проанализированных пчёл с их характеристиками на экран (при запуске происходит автоматический скан);

    2. Выдача любой пчелы кликом левой кнопкой по её описанию;

    3. Принудительное обновление списка (если в сундуке что-либо появилось) правой кнопкой мыши;

    4. Выход кликом по заголовку.

     

    Схема собирается таким образом: к компьютеру надо подключить транспозер, сверху на него поставить сундук с пчёлами, а с восточной стороны (правится в коде) выбрасыватель. Выбрасыватель требуется запитать от генератора импульсов (я использовал таймер из RedLogic из-за его компактности) - программа не подаёт самостоятельно импульс для выкидывания пчелы.

     

    Чтобы программа работала, не забудьте поменять в начале программы ник доверенного пользователя на свой. Программа воспринимает нажатия только от доверенного пользователя - то есть, по умолчанию, только от меня.

     

    Как выглядит интерфейс:

    beealyzer.png

    beealyzer-tier3-sm.png?raw=true

     

    • Нравится 7

  14. Is it time to analyze code?

    Скрытый текст
    
    biosname="microBios"
    statusAllow=1;
    local b=function()error("no bootable medium found",0)end;
    do
      local type,c,d=type,true,computer.getDeviceInfo()
      local function e(f)
        local g,h,i,j,k=126,1671,7124,"",{}
        for l=1,#f do table.insert(k,f:byte(l))end;
        for l=1,#f do
          local m,n,o=f:byte(l-1),f:byte(l+1),f:byte(l)
          if not m then m=f:byte(#f)end;
          if not n then n=f:byte(1)end;
          local p=m*g+n*h+o*i;p=p+l*h;p=p*(i-(#f-l))
          for q,r in ipairs(k)do p=p+r-l*q*(g-h)end;
          p=math.abs(p)p=p%256;j=j..string.char(p)
          if#j==16 then
            local s=j:byte(1)g=g+s;h=h*s;i=i*s;j=j:sub(2,#j)
          end
        end;
        while#j<16 do j=string.char(math.abs(i+h*#j)%256)..j end;
        return j
      end;
      local function t(u)return component.proxy(component.list(u)()or"*")end;
      local v=t("eeprom")
      local function w(f,x)
        local y,z,l={},1,1;
        while 1 do
          if l>#f then break end;
          local s=f:sub(l,#x+l-1)
          if not y[z]then y[z]=""end;
          if s==x then z=z+1;l=l+#x else y[z]=y[z]..f:sub(l,l)l=l+1 end
        end;
        if f:sub(#f-(#x-1),#f)==x then table.insert(y,"")end;
        return y
      end;
      local function A(B)
        return w(v.getData(),"\n")[B]or""
      end;
      local function C(B,D)
        if A(B)==D then return end;
        if D:find("\n")then error("\\n char")end;
        local y=w(v.getData(),"\n")
        for l=B,1,-1 do
          if not y[l]then y[l]=""end
        end;
        y[B]=D;
        v.setData(table.concat(y,"\n"))
      end;
      local function E(F)
        local G,H,I;
        for J in component.list(F)do
          I=tonumber(d[J].width)
          if component.type(F)=="screen"then
            if#component.invoke(J,"getKeyboards")>0 then I=I+10 end
          end;
          if not H or I>H then G,H=J,I end
        end;
        return G
      end;
      local function K(L,M)
        local N=computer.uptime()
        while computer.uptime()-N<L do M()end
      end;
      local O,P,Q,R=t("internet"),component.proxy(E("gpu")or""),a,{}
      if P then
        Q=A(2)
        if component.type(Q)~="screen"then Q=E("screen")
          if Q then C(2,Q)end
        end;
        if Q then R=component.invoke(Q,"getKeyboards")P.bind(Q)end
      end;
      local function S(T)
        return function()return T end
      end;
      computer.getBootGpu=S(P and P.address)
      computer.getBootFile=function()return A(3)end;
      computer.getBootScreen=S(Q)
      computer.getBootAddress=function()return A(1)end;
      function computer.setBootFile(U)C(3,U)end;
      function computer.setBootScreen(Q)C(2,Q)end;
      function computer.setBootAddress(J)C(1,J)end;
      local V=computer.shutdown;
      function computer.shutdown(W)
        if type(W)=="string"then C(6,W)end;V(W)
      end;
      local function X(J)
        for l,p in ipairs(R)do
          if p==J then return 1 end
        end
      end;
      local function Y(J)
        local Z=component.proxy(J)
        return Z.getLabel()and Z.address:sub(1,4)..":"..Z.getLabel()or Z.address:sub(1,4)
      end;
      local function _(a0)
        local a1,a2,a3,a4=O.request(a0),""
        if a1 then
          while 1 do
            a3,a4=a1.read(math.huge)
            if a3 then a2=a2 ..a3 else
              a1.close()
              if a4 then return a,a4 else return a2 end
            end
          end
        else return a,"Unvalid Address"
        end
      end;
      local a5,a6,a7,a8;
      local function a9()
        if not Q then return end;
        local aa={[8]={0xf0f0f0,0x1e1e1e,0x2d2d2d,0x3c3c3c,0x4b4b4b,0x5a5a5a,0x696969,0x787878,0x878787,0x969696,0xa5a5a5,0xb4b4b4,0xc3c3c3,0xd2d2d2,0xe1e1e1,0},[4]={0xffffff,0xffcc33,0xcc66cc,0x6699ff,0xffff33,0x33cc33,0xff6699,0x333333,0xcccccc,0x336699,0x9933cc,0x333399,0x663300,3368448,0xff3333,0}}aa=aa[a5]
        if aa then a8=c;
          for l,p in ipairs(aa)do P.setPaletteColor(l-1,p)end
        end
      end;
      if Q then
        a5=math.floor(P.getDepth())
        a6,a7=P.getResolution()
        a9()
        if a8 then P.setPaletteColor(1,0x7B68EE)P.setPaletteColor(2,0x1E90FF)P.setPaletteColor(3,0x6B8E23)P.setPaletteColor(4,0x8B0000)P.setPaletteColor(5,0xDAA520)P.setPaletteColor(6,0)P.setPaletteColor(7,0xFFFFFF)
        end
      end;
      local function ab(f,ac,ad)
        P.set((ac or 0)+math.floor(a6/2-(#f-1)/2+0.5),ad or math.floor(a7/2+0.5),f)
      end;
      local function ae()
        P.setBackground(0)P.setForeground(0xFFFFFF)P.fill(1,1,a6,a7," ")
      end;
      local function af(f,ag,L,ah,ai)
        if not Q then if ah then error(ah,0)end;return end;
        ae()
        P.setForeground(ag or 1,not ai and a8)
        ab(f)
        if L==c then
          ab("Press Enter To Continue",a,math.floor(a7/2+0.5)+1)
          while 1 do
            local aj={computer.pullSignal()}
            if aj[1]=="key_down"and X(aj[2])and aj[4]==28 then break end
          end
        elseif L then
          K(L,function()computer.pullSignal(0)end)
        end;
        return 1
      end;
      _G.status=function(f)af(f,0xFFFFFF,a,a,1)end;
      local function ak(f,al)
        local am=""
        local function an()
          af(f..": "..(al and string.rep("*",#am)or am).."_",5)
        end;
        an()
        while 1 do
          local aj={computer.pullSignal()}
          if X(aj[2])then
            if aj[1]=="key_down"then
              if aj[4]==28 then
                return am
              elseif aj[3]>=32 and aj[3]<=126 then
                am=am..string.char(aj[3])an()
              elseif aj[4]==14 then
                if#am>0 then am=am:sub(1,#am-1)an()end
              elseif aj[4]==46 then
                break
              end
            elseif aj[1]=="clipboard"then
              am=am..aj[3]an()
              if am:byte(#am)==13 then return am end
            end
          end
        end
      end;
      local function ao(ap,aq,ar)
        local as,at,au={},{},ar or 1;
        function as.a(...)
          table.insert(at,{...})
        end;
        local function av()
          ae()
          P.setForeground(aq,a8)
          ab(ap,a,a7//3)
          local m,o,n=at[au-1],at[au],at[au+1]
          P.setBackground(0)
          if m then
            P.setForeground(m[2],a8)ab(m[1],-a6//3,a7//3*2)
          end;
          if n then
            P.setForeground(n[2],a8)ab(n[1],a6//3,a7//3*2)
          end;
          P.setBackground(o[2],a8)P.setForeground(0)ab(o[1],a,a7//3*2)
        end;
        function as.l()
          av()
          while 1 do
            local aj={computer.pullSignal()}
            if aj[1]=="key_down"and X(aj[2])then
              if aj[4]==28 then
                if not at[au][3]then break end;
                local aw=at[au][3]()
                if aw then return aw end;
                av()
              elseif aj[4]==205 then
                if au<#at then au=au+1;av()end
              elseif aj[4]==203 then
                if au>1 then au=au-1;av()end
              end
            end
          end
        end;
        return as
      end;
      local ax=A(6)C(6,"")
      local function ay(J)
        local Z=component.proxy(J)
        if Z.exists("/boot/kernel/pipes")then return"/boot/kernel/pipes"
        elseif Q then
          if Z.exists("/OS.lua")then return"/OS.lua"
          elseif Z.exists("/init.lua")then return"/init.lua"
          end
        else
          if Z.exists("/init.lua")then return"/init.lua"
          elseif Z.exists("/OS.lua")then return"/OS.lua"
          end
        end
      end;
      local function az()
        af("Please Wait",5)
      end;
      local function aA()
        if A(4)==""then return 1 end;
        while 1 do
          local aB=ak("Enter Password",1)
          if not aB then break end;
          if e(aB)==A(4)then return 1 end
        end
      end;
      local function aC()
        if A(5)==""and not aA()then V()end;
        local aD=ao("micro bios",2)
        aD.a("Back",4)
        aD.a("Reboot",4,function()V(1)end)
        aD.a("Shutdown",4,V)
        if O then
          aD.a("Url Boot",3,function()
              local a0=ak("Url")
              if a0 then
                local a2,ah=_(a0)
                if a2 then
                  local M,ah=load(a2,"=urlboot")
                  if M then
                    a9()
                    local aE,ah=pcall(M)
                    if not aE then af(ah or"unknown error",0xFFFFFF,c,a,1)end
                  else af(ah,4,c)
                  end
                else af(ah,4,c)end
              end
            end)
        end;
        aD.a("Password",5,function()
            if aA()then
              local aD=ao("Password",3)
              aD.a("Set Password",5,function()
                  local aF=ak("Enter New Password",1)
                  if aF and aF~=""and aF==ak("Confirm New Password",1)then az()C(4,e(aF))end
                end)
              aD.a("Set Password Mode",5,function()
                  local aD=ao("Select Mode",2)
                  aD.a("Menu",5,function()az()C(5,"")end)
                  aD.a("Boot",5,function()az()C(5,"1")end)
                  aD.a("Disable",5,function()az()C(5,"2")end)
                  aD.a("Back",4)aD.l()
                end)
              aD.a("Clear Password",5,function()
                  az()C(4,"")C(5,"")
                end)
              aD.a("Back",4)
              aD.l()
            end
          end)
        for J in component.list("filesystem")do
          local ap=Y(J)
          aD.a(ap,1,function()
              local aD=ao("Drive "..ap,2)
              local Z=component.proxy(J)
              local aG={"/init.lua","/OS.lua"}
              for l=2,1,-1 do
                if not Z.exists(aG[l])then table.remove(aG,l)end
              end;
              local aH="/boot/kernel/"
              for aI,U in ipairs(Z.list(aH)or{})do
                table.insert(aG,aH..U)
              end;
              if#aG>0 then
                aD.a("boot",1,function()
                    local U=ay(J)
                    if U then az()C(1,J)C(3,U)return 1 end;
                    af("Boot File Is Not Found",a,c)
                  end)
              end;
              local function aJ(U)
                if component.invoke(J,"exists",U)then
                  aD.a(U,1,function()az()C(1,J)C(3,U)return 1 end)
                end
              end;
              for l,p in ipairs(aG)do aJ(p)end;
              aD.a("Back",4)
              return aD.l()
            end)
        end;
        aD.l()
      end;
      if ax~="fast"and A(5)=="1"and(not Q or not aA())then V()end;
      if Q then
        if ax=="bios"then
          aC()
        elseif ax~="fast"and#R>0 and af("Press Alt To Open The Bios Menu")then
          K(1,function()
              local aj={computer.pullSignal(0.1)}
              if aj[1]=="key_down"and X(aj[2])and aj[4]==56 then aC()end
            end)
        end
      end;
      local aK,U=A(1),A(3)
      local aL=component.proxy(aK)
      if not aL or not aL.exists(U)then
        af("Search For A Bootable Filesystem")
        U=a;
        if aL then U=ay(aK)end;
        if not U then
          for aM in component.list("filesystem")do
            local aN=ay(aM)
            if aN then aK=aM;U=aN;break end
          end
        end;
        if U then
          az()C(1,aK)C(3,U)
          aL=component.proxy(aK)
        else
          af("Bootable Filesystem Is Not Found",a,c,1)V()
        end
      end;
      if Q then a9()end;
      af("Boot To Drive "..Y(aK).." To File "..U,0xFFFFFF,a,a,1)
      local U,am=assert(aL.open(U,"rb")),""
      while 1 do
        local aB=aL.read(U,math.huge)
        if not aB then break end;
        am=am..aB
      end;
      aL.close(U)
      if U=="/OS.lua"then
        v.getData=function()return aK end
      end;
      b=load(am,"=init")
    end;
    b()

     

     

    • Ха-ха 2

  15. 1 час назад, ECS сказал:

    модифицировать библиотеку по работе с экранным буфером

    А разве doubleBuffering не предназначен для минимизации закрашиваний? Можно же пропатчить component.invoke для видеокарты так, чтобы она добавляла запрос в буфер, и чтобы раз в какое-то время этот буфер отправлялся на другой комп.

    + не 3 ведь байта на цвет, у OC палитра маленькая, 256 цветов максимум.


  16. 2 часа назад, eu_tomat сказал:

    Где пользователи вообще берут эти кривые ссылки?

    Может быть, из гифки, где показывается установка:

    Но вообще у меня есть подозрение, что на ютубе много обзоров MineOS, и наверняка показана установка с Pastebin. Инсталлер оттуда удалили не так давно, вот все сейчас и спрашивают - а почему не устанавливается?

    • Грусть 1

  17. Да это же MineOS!

    Новая ссылка и вправду есть: https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Installer/BIOS.lua

    Ну и одна команда, чтобы скачать и установить:

    В 14.03.2022 в 01:51, Totoro сказал:
    
    wget -f https://raw.githubusercontent.com/IgorTimofeev/MineOS/master/Installer/BIOS.lua /tmp/bios.lua && flash -q /tmp/bios.lua && reboot

     


  18. Самый простой способ - использовать event.pull(0, "modem_message"). Тогда, если сообщение ещё не пришло, будет возвращаться nil.

    Есть возможность использовать event.listen, но с ним работать немного сложнее.

    event.listen('modem_message', print)
    
    while true do
      robot.forward()
      os.sleep(0)
    end

     


  19. @lag2016 Если я верно понял, проще всего сделать так:

    - консольная программа на OC-планшете (turn-on.lua, например) принимает в качестве аргумента номер лампы, которую надо включить/выключить, и пересылает на OC-сервер с помощью беспроводной сетевой карты сообщение;

    - программа в авторане OC-сервера добавляет слушателя на сообщения беспроводной сетевой карты; этот слушатель и переключает редстоун-блоки.

    Вот простейший вариант программы:

    -- программа-клиент
    -- использовать как  <путь к программе> +<номер лампы, чтобы включить>
    --             либо  <путь к программе> -<номер лампы, чтобы выключить>
    local com = require 'component'
    local lamp = (...) -- достаём первый аргумент из переданных
    com.modem.broadcast(8833, lamp)
    
    -------------------
    
    -- программа-сервер
    local com = require 'component'
    local evt = require 'event'
    local sid = require 'sides'
    
    local redstones = {}
    for rs_addr in com.list('redstone') do
      redstones[#redstones + 1] = com.proxy(rs_addr)
    end
    
    com.modem.open(8833)
    evt.listen('modem_message', function(_, _, _, port, _, data)
      if port ~= 8833 then return end
      if data:sub(1, 1) == '+' then
        redstones[tonumber(data:sub(2, 2))].setOutput(sid.top, 15)
      elseif data:sub(1, 1) == '-' then
        redstones[tonumber(data:sub(2, 2))].setOutput(sid.top, 0)
      end
    end)

     

    • Одобряю 1
×
×
  • Создать...