ProgramCrafter
-
Публикации
245 -
Зарегистрирован
-
Посещение
-
Победитель дней
41
Сообщения, опубликованные пользователем ProgramCrafter
-
-
10 часов назад, Bumer_32 сказал:мод которым можно переводить одну энергию в другую
PowerConverters (вроде бы так называется) стоит.
10 часов назад, Bumer_32 сказал:ender storage
О, это вроде прикольная штука, согласен
10 часов назад, Bumer_32 сказал:передачу энергии на любые расстояния
То же можно запилить на лазуротроновых кристаллах и эндер-сундуках, в принципе.
-
/offtop
7 часов назад, ECS сказал:1 символ занимает ровно 1 пиксель
Ой, неправда-неправда...
-
@rootmaster Полагаю, тогда более уместно создать новую тему в беседке и позвать автора биоса туда, чтобы обсудить, что и как лучше было бы сделать.
-
53 минуты назад, KeyTwoZero сказал:Как вам обновление?
Мне кажется, на экран ошибки стоило бы выводить, с какого диска велась загрузка.
-
На данный момент пчёлы сортируются по таким критериям:
1. Все принцессы выше трутней;
2. Менее топовый вид;
3. Продолжительность жизни;
4. Скорость работы.
Может быть, скорость работы - более важный критерий, чем продолжительность жизни, и их можно поменять местами. Но я не согласен, что срок жизни пчелы надо минимизировать при селекции: для этого надо куда-то спешить, а топовые пчёлы появляются с долгим сроком жизни по умолчанию. Их придётся скрещивать с менее топовыми, чтобы понизить срок жизни - а потом ещё раз, чтобы повысить. К тому же, если пчела живёт дольше, медленнее заполняются сундуки пчеловода
-
Под давлением общественности
сделал версию, где отображаются только топовые пчёлы каждого вида.
Скачать можно здесь: https://github.com/ProgramCrafter/lua-utils/blob/main/beealyzer_v2oc.lua
Читаемость кода не максимальная, зато вся программа влазит в 256 строк - её можно скопировать и вставить в компьютер OC.
Особых изменений по интерфейсу нет, поэтому думаю, что в скриншотах смысла нет.
-
4 минуты назад, rootmaster сказал:_ENV очишяеться при закрытии shell
По-хорошему, tprotect должен запускаться вообще до начала загрузки системы. Тогда ему будет без разницы на закрытие shell/чего-то ещё.
5 минут назад, rootmaster сказал:удалив pairs из _ENV будет работать оригинальный из _G
Значит, _ENV тоже надо блокировать. Заодно не будут работать глобальные переменные - потому что не надо их использовать, лучше уж писать данные в tmpfs. (Или сделать в системе какую-то таблицу для хранения данных программ.)
-
20 часов назад, Bumer_32 сказал:простой time.sleep не поможет ведь в итоге нужные команды суммируются
А точно? Что за источник сигнала, кстати?
-
24 минуты назад, hohserg сказал:Жду версию для очков OpenPeripherals, там можно предметы рендерить
Тогда стоит завести issue на гитхабе: https://github.com/ProgramCrafter/lua-utils/issues
Или на гитлабе - скоро и туда сделаю зеркало репозитория.
-
Проблема вот в чём: это будет выглядеть красиво, но пользоваться такой программой будет совершенно невозможно.
Эта программа предназначена, чтобы быстро выбирать, каких пчёл скрещивать. Для этого важно видеть сразу все характеристики на одном экране. Именно поэтому меня не устроил просто сундук пчеловода - там надо наводить на каждую пчелу, зажав шифт, и запоминать - какая же пчела там лучше?..
-
1
-
-
2 минуты назад, hohserg сказал:А сколько всего видов пчел в сборке?
Пчелиный сундук говорит, что 37. Но может случиться, что Вольфрам поставит Extra Bees, и будет 150 видов, или где-то около того.
Кстати, список пчёл есть здесь: https://minecraft.fandom.com/ru/wiki/Forestry/Пчеловодство
-
2 минуты назад, hohserg сказал:Как на счет красивых иконок пчелок?
Очень мало места. Но если добавить их в шрифт OpenComputers, то можно, в принципе.
Кто-то сможет нарисовать красиво пчелу шириной в два знакоместа? А точнее, двух пчёл - трутня (без короны) и принцессу (с короной).
-
Изменения в новой версии (fe3a3c8) относительно начальной (5e97a3e):
1. Добавлена поддержка тир3 экранов;
2. Пчёлы сортируются по "уровню" - сложности получения их вида в селекции;
3. Поддерживается несколько сундуков с пчёлами;
4. Настройки сторон для сундуков и выдачи пчёл перенесены в начало программы.
-
15 минут назад, eu_tomat сказал:А сколько пчёл ты выдаёшь за один раз?
По одной - но в отзывчивости программы разница в 2 тика (100 мс) может быть заметна.
15 минут назад, eu_tomat сказал:увеличивает нагрузку на сервер
Это хорошо было бы измерить. В то, что таймеры из RedLogic могут нагружать сервер, я верю - но срабатывание выбрасывателя не должно особенно сильно добавлять нагрузку. Вообще мне кажется, что основная нагрузка сервера - это изменение блоков и создание сущностей, и если в выбрасывателе пусто, то ничего из этого не происходит.
-
13 часа назад, eu_tomat сказал:А в чём преимущество такого решения?
Основное преимущество - не требуется использовать контроллер красного камня или красную плату в компьютере.
1) В тир2 компьютере и так мало места: один из слотов занимает видеокарта, во второй слот влазит максимум тир1 плата. Туда можно поставить редстоун-плату, но не нужно;
2) Упрощается монтаж схемы - не надо думать, как подвести провод ещё и к контроллеру красного камня, или как разместить выбрасыватель достаточно близко к компьютеру, чтобы он получал сигнал;
3) Такое решение на 2 тика быстрее - не надо включать и выключать сигнал. Следовательно, если надо обработать много пчёл, это может быть существенно. (Правда, сейчас большая часть времени тратится на обновление экрана. Сюда надо бы прикрутить буферизацию и использование по возможности gpu.copy.)
-
Хотел заказать эту программу у других, но пришлось писать самому. Ничего, награду тоже выдам себе.
ЦитатаГлавная/Программирование/Разработчикам/Новые заказы
Программа "Сундук пчеловода 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 из-за его компактности) - программа не подаёт самостоятельно импульс для выкидывания пчелы.
Чтобы программа работала, не забудьте поменять в начале программы ник доверенного пользователя на свой. Программа воспринимает нажатия только от доверенного пользователя - то есть, по умолчанию, только от меня.
Как выглядит интерфейс:
-
7
-
-
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
-
-
1 час назад, ECS сказал:модифицировать библиотеку по работе с экранным буфером
А разве doubleBuffering не предназначен для минимизации закрашиваний? Можно же пропатчить component.invoke для видеокарты так, чтобы она добавляла запрос в буфер, и чтобы раз в какое-то время этот буфер отправлялся на другой комп.
+ не 3 ведь байта на цвет, у OC палитра маленькая, 256 цветов максимум.
-
2 часа назад, eu_tomat сказал:Где пользователи вообще берут эти кривые ссылки?
Может быть, из гифки, где показывается установка:
Но вообще у меня есть подозрение, что на ютубе много обзоров MineOS, и наверняка показана установка с Pastebin. Инсталлер оттуда удалили не так давно, вот все сейчас и спрашивают - а почему не устанавливается?
-
1
-
-
Да это же 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
-
Самый простой способ - использовать event.pull(0, "modem_message"). Тогда, если сообщение ещё не пришло, будет возвращаться nil.
Есть возможность использовать event.listen, но с ним работать немного сложнее.
event.listen('modem_message', print) while true do robot.forward() os.sleep(0) end
-
@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
-
-
Сбрасывать кеш надо перед require('numbers'):
package.loaded['numbers'] = nil
что-то там = require('numbers')
-
1
-
1
-
-
Кстати, раз уж речь про магазин приложений - а можно фичу, чтобы не отрисовывать иконки приложений, а просматривать всё в виде списка? А то лагает просто ужасно.

Майнкрафт-сервер: Играем, тестируем, дорабатываем
в Программирование
Опубликовано: · Изменено пользователем ProgramCrafter
Новая информация о наборах:
Всё равно запрашиваю набор из одной укреплённой иридиевой пластины по цене ~150-250 ЭУР