HeroBrine1st
-
Публикации
134 -
Зарегистрирован
-
Посещение
-
Победитель дней
21
Сообщения, опубликованные пользователем HeroBrine1st
-
-
Оптимизировал алгоритм. Работает моментально, кодирует большие числа без намека на провисание.
Избавился от метачисел, теперь библиотека работает на чистом Lua.
Дополнил таблицу простых чисел.
-
1
-
-
В сотрудничестве с @Zer0Galaxy мы доработали целочисленную библиотеку metaint.
Итак, встречайте:
Криптосистема с открытым ключом
- Теперь на "отечественной" библиотеке metaint
- Для поиска простых чисел используется Тест Миллера — Рабина
- Поддерживаются ключи с кастомным количеством бит
- А так же полная оптимизация генерации ключей. Осталось лишь оптимизировать поиск простых чисел и ключи в 2048 бит в ваших руках.
Установка
- pastebin run 1xudmTa7 - выберите RSA и установите.
- С hpm проблемы(
Использование
Библиотека возвращает класс. Для получения инстанса - просто require("RSA")(<params>): RSA_instance
Аргументом (он один) конструктора класса может быть:
- строка - путь к файлу собственной структуры. В нем обязательно должен быть публичный ключ.
- число (битовая длина ключа, не менее 16 - иначе будет недоступно шифрование текста. Да и не выйдет меньше 16)
- таблица. В ней нужно 3 поля - private_key, public_key и metadata, структура как у файла ключа библиотеки. Так же должен быть публичный ключ. Приватный ключ и метадата необязательны - они хранятся у создателя ключа.
Методы инстанса RSA
- RSA:save(filepath: string) - сохранить ключ в файл
- RSA:encrypt(number:number) - зашифровать число
- RSA:decrypt(cryptedNum: number) - расшифровать число. Кинет ошибку, если нет приватного ключа.
- RSA:sign(number: number) - подписать число. Кинет ошибку, если нет приватного ключа.
- RSA:verify(number:number, signedNumber: number): boolean - проверить подпись. Вернет true, если подпись верна.
-
Работа с текстом. Очень медленно, битовая длина ключа - минимум 32 бит.
- RSA:textEncrypt(text: string[,saltLen=4: number]):table[metaint] - шифрует текст поблочно, перемешивая блоки - защита от DPI. Блок равен 32 бит.
- RSA:textDecrypt(cryptedText: table[, saltLen=4: number]): string - расшифровывает текст с учетом соли. Применяет обратное преобразование текста для расшифровки - защита от DPI, все дела.
- RSA:textSign(text:string): table[metaint] - поблочно подписывает текст, перемешивая блоки.
- RSA:textVerify(text:string, signedBlocks: table[metaint]): boolean, string - проверяет подпись текста. Второе значение - полученная строка.
Более полная документация с описанием алгоритмов.
Готовится оптимизация библиотеки, прогресс можно посмотреть в ветке beta репозитория. Спойлер: стоит на месте, ищу способ выполнения длинных битовых операций
-
7
-
1
-
1
-
(При редактировании не могу сбросить строку, поэтому пишу новым сообщением)
Так же без фикса выше этот слушатель работать не будет.
listeners[1] = {"key_down",function (_,_,k1,k2) if keyboard.isControlDown() and keyboard.isKeyDown(46) then info("info","interrupted server.") running = false end end} -
Дошло не сразу, долго искал причину nil в аргументах
function main() while running do local e = {event.pull()} for i=1,#listeners doЗачем паковать ивент в таблицу и подавать его таким?
local ok,err = pcall(listeners[i][2],e)Предлагаю исправленный вариант:
local ok,err = pcall(listeners[i][2],table.unpack(e)) -
Не получится. Я пытался, приватные ключи больше 4 - все, привет число inf.
Метачисла так же пытался использовать - too long without yielding.
Просто lua ограничивает возможности алгоритма Диффи-Хеллмана. И тут ничего не поделать.
Ооо круто теперь можно сделать Telegram в OpenComputers!

P.S. Залил библиотеку на Pastebin
https://pastebin.com/uK7vVzWB [uK7vVzWB ]
-
Давным-давно Zer0Galaxy выложил эту программу в теме, которая будет ниже (т.е. в конце страницы): Я же ее перенес и преобразовал в библиотеку:
--[[ Алгоритм шифрования-дешифрования на основе сети Фейстеля Created by Dimus No rights reserved ]] --[[ Нахождение хеш-функции по алгоритму md5 *Apokalypsys, Dimus *http://minecrafting.ru/forum/viewtopic.php?f=32&t=5331 ]] local bit = require("bit32") local hex_char = "0123456789abcdef" local crypt = {} local function getHex(seed) local str = "" for i = 0, 3 do local ind1, ind2 = bit.band(bit.rshift(seed, i * 8 + 4), 15) + 1, bit.band(bit.rshift(seed, i * 8), 15) + 1 str = str.. hex_char:sub(ind1, ind1).. hex_char:sub(ind2, ind2) end return str end local function string_to_blks(str) local nblk = bit.rshift((str:len() + 8), 6) + 1 local blks = {} local len = str:len() for i = 0, nblk * 16 - 1 do blks[i] = 0 end for i = 0, str:len() - 1 do blks[bit.rshift(i, 2)] = bit.bor( blks[bit.rshift(i, 2)], bit.lshift( str:byte(i+1), (((i) % 4) * 8) ) ) end blks[bit.rshift(len, 2)] = bit.bor( blks[bit.rshift(len, 2)], bit.lshift( 128, (((len) % 4) * 8) ) ) blks[nblk * 16 - 2] = len * 8 return blks end local function add(x, y) return x + y > 4294967296 and x + y or x + y - 4294967296 end local function rol(number, count) return bit.bor(bit.lshift(number, count), bit.rshift(number, (32 - count))) end local function X(a, b, c, x, s, t) return add(rol(add(add(b, a), add(x, t)), s), c) end local function F(a, b, c, d, x, s, t) return X(bit.bor(bit.band(b, c), bit.band(bit.bnot(b), d)), a, b, x, s, t) end local function G(a, b, c, d, x, s, t) return X(bit.bor(bit.band(b, d), bit.band(c, bit.bnot(d))), a, b, x, s, t) end local function H(a, b, c, d, x, s, t) return X(bit.bxor(bit.bxor(b, c), d), a, b, x, s, t) end local function I(a, b, c, d, x, s, t) return X(bit.bxor(c, bit.bor(b, bit.bnot(d))), a, b, x, s, t) end function crypt.md5(encoding_string) local blks = string_to_blks(encoding_string) local a = 1732584193 local b = -271733879 local c = -1732584194 local d = 271733878 for i = 0, #blks-1, 16 do local olda, oldb, oldc, oldd = a, b, c, d a = F(a, b, c, d, blks[i+ 0], 7, -680876936) d = F(d, a, b, c, blks[i+ 1], 12, -389564586) c = F(c, d, a, b, blks[i+ 2], 17, 606105819) b = F(b, c, d, a, blks[i+ 3], 22, -1044525330) a = F(a, b, c, d, blks[i+ 4], 7, -176418897) d = F(d, a, b, c, blks[i+ 5], 12, 1200080426) c = F(c, d, a, b, blks[i+ 6], 17, -1473231341) b = F(b, c, d, a, blks[i+ 7], 22, -45705983) a = F(a, b, c, d, blks[i+ 8], 7, 1770035416) d = F(d, a, b, c, blks[i+ 9], 12, -1958414417) c = F(c, d, a, b, blks[i+10], 17, -42063) b = F(b, c, d, a, blks[i+11], 22, -1990404162) a = F(a, b, c, d, blks[i+12], 7, 1804603682) d = F(d, a, b, c, blks[i+13], 12, -40341101) c = F(c, d, a, b, blks[i+14], 17, -1502002290) b = F(b, c, d, a, blks[i+15], 22, 1236535329) a = G(a, b, c, d, blks[i+ 1], 5, -165796510) d = G(d, a, b, c, blks[i+ 6], 9, -1069501632) c = G(c, d, a, b, blks[i+11], 14, 643717713) b = G(b, c, d, a, blks[i+ 0], 20, -373897302) a = G(a, b, c, d, blks[i+ 5], 5, -701558691) d = G(d, a, b, c, blks[i+10], 9, 38016083) c = G(c, d, a, b, blks[i+15], 14, -660478335) b = G(b, c, d, a, blks[i+ 4], 20, -405537848) a = G(a, b, c, d, blks[i+ 9], 5, 568446438) d = G(d, a, b, c, blks[i+14], 9, -1019803690) c = G(c, d, a, b, blks[i+ 3], 14, -187363961) b = G(b, c, d, a, blks[i+ 8], 20, 1163531501) a = G(a, b, c, d, blks[i+13], 5, -1444681467) d = G(d, a, b, c, blks[i+ 2], 9, -51403784) c = G(c, d, a, b, blks[i+ 7], 14, 1735328473) b = G(b, c, d, a, blks[i+12], 20, -1926607734) a = H(a, b, c, d, blks[i+ 5], 4, -378558) d = H(d, a, b, c, blks[i+ 8], 11, -2022574463) c = H(c, d, a, b, blks[i+11], 16, 1839030562) b = H(b, c, d, a, blks[i+14], 23, -35309556) a = H(a, b, c, d, blks[i+ 1], 4, -1530992060) d = H(d, a, b, c, blks[i+ 4], 11, 1272893353) c = H(c, d, a, b, blks[i+ 7], 16, -155497632) b = H(b, c, d, a, blks[i+10], 23, -1094730640) a = H(a, b, c, d, blks[i+13], 4, 681279174) d = H(d, a, b, c, blks[i+ 0], 11, -358537222) c = H(c, d, a, b, blks[i+ 3], 16, -722521979) b = H(b, c, d, a, blks[i+ 6], 23, 76029189) a = H(a, b, c, d, blks[i+ 9], 4, -640364487) d = H(d, a, b, c, blks[i+12], 11, -421815835) c = H(c, d, a, b, blks[i+15], 16, 530742520) b = H(b, c, d, a, blks[i+ 2], 23, -995338651) a = I(a, b, c, d, blks[i+ 0], 6, -198630844) d = I(d, a, b, c, blks[i+ 7], 10, 1126891415) c = I(c, d, a, b, blks[i+14], 15, -1416354905) b = I(b, c, d, a, blks[i+ 5], 21, -57434055) a = I(a, b, c, d, blks[i+12], 6, 1700485571) d = I(d, a, b, c, blks[i+ 3], 10, -1894986606) c = I(c, d, a, b, blks[i+10], 15, -1051523) b = I(b, c, d, a, blks[i+ 1], 21, -2054922799) a = I(a, b, c, d, blks[i+ 8], 6, 1873313359) d = I(d, a, b, c, blks[i+15], 10, -30611744) c = I(c, d, a, b, blks[i+ 6], 15, -1560198380) b = I(b, c, d, a, blks[i+13], 21, 1309151649) a = I(a, b, c, d, blks[i+ 4], 6, -145523070) d = I(d, a, b, c, blks[i+11], 10, -1120210379) c = I(c, d, a, b, blks[i+ 2], 15, 718787259) b = I(b, c, d, a, blks[i+ 9], 21, -343485551) a = add(a, olda) b = add(b, oldb) c = add(c, oldc) d = add(d, oldd) end return getHex(a)..getHex(b)..getHex(c)..getHex(d), a,b,c,d end ----------------- End md5 ------------------ local Base=2^32 --[[ функции преобразования подблока по ключу subblock - преобразуемый подблок key - ключ возвращаяемое значение - преобразованный блок]] local function f(subblock, key) local _,res=crypt.md5(subblock..key) return res -- return math.fmod(subblock + key, Base) end --[[Шифрование открытого текста left - левый входной подблок right - правый входной подблок key - массив ключей]] local function C(left, right, key) for i = 1,#key do left,right = bit.bxor(right, f(left, key[i])), left end return left,right end --[[Расшифрование текста left - левый зашифрованный подблок right - правый зашифрованный подблок]] local function D(left, right, key) for i = #key,1,-1 do left,right = right, bit.bxor(left, f(right, key[i])) end return left,right end --Функция формирования массива ключей function crypt.getkey(pwd) local key={} local hesh=pwd for i=0,3 do hesh,key[i*4+1],key[i*4+2],key[i*4+3],key[i*4+4]=crypt.md5(hesh) end return key end local function StrToInt(str) local int = 0 local byte for i = 0, 3 do byte=str:sub(1,1) str=str:sub(2) int=bit.lshift(int,8)+(string.byte(byte) or 0) end return int, str end local function IntToHex(int) local str = "" local char for i = 0, 7 do char=bit.band(bit.rshift(int, 28), 15) int=bit.lshift(int,4) str=str..string.format('%x',char) end return str end local function HexToInt(str) local int = 0 local byte for i = 0, 3 do byte=tonumber(str:sub(1,2),16) or 0 str=str:sub(3) int=bit.lshift(int,8)+byte end return int, str end local function IntToStr(int) local str = "" local char for i = 0, 3 do char=bit.band(bit.rshift(int, 24), 255) int=bit.lshift(int,8) str=str..string.char(char) end return str end --[[Шифрование открытого текста str - входной текст key - массив ключей]] function crypt.crypt(str,key) local str1="" local left,right while #str>0 do left,str=StrToInt(str) right,str=StrToInt(str) left,right=C(left, right, key) str1=str1..IntToHex(left) str1=str1..IntToHex(right) end return str1 end --[[Расшифрование текста str - зашифрованный текст key - массив ключей]] function crypt.decrypt(str,key) local str1="" local left,right while #str>0 do left,str=HexToInt(str) right,str=HexToInt(str) left,right=D(left, right, key) str1=str1..IntToStr(left) str1=str1..IntToStr(right) end return str1 end return cryptМетоды те же - getkey(key:string), crypt(str:string,key:table), decrypt(cryptedStr:string,key:table), а так же md5(str:string) - возвращает хеш определенной строки.
Если будут ошибки, отпишите. Я тестировал, все работает, однако могут быть ошибки или даже несоответствие алгоритму (что крайне маловероятно, но возможно - я заменил какую-то функцию, похожую на rshift из bit32 на этот самый rshift)
Сама тема - http://computercraft.ru/topic/96-razmyshleniia-o-shifrovanii-i-bezopasnoi-peredach/
Команда для установки - pastebin get uDnh4RLi /lib/crypt.lua
-
1
-
-
Можно сделать биржу с неавтоматической установкой цен, но и не с фиксированной.
Предлагаю сделать так: игрок-покупатель делает ордер на покупку. Если нету предметов с такой ценой в продаже, можно установить время, за которое какой-нибудь игрок-продавец даст ордер на сумму, равную или ниже стоимости в ордере, то предмет в n-количестве покупки блокируется и становится доступен только тому, кто его купил. Игрок-покупатель приходит в пункт торговли и забирает.
Да, сложно, однако такой рынок будет зависеть от мысли не нескольких игроков-богачей, а от обстоятельств на сервере. При этом если опять же игроки будут скупать все, цена так же будет взлетать, однако уже по воле игроков и без алгоритмов.
Ну и поставить бота, который будет просто вешать ордера на покупку, используя среднюю цену на рынке*произвольный коэффициент больше 0.5, дабы игроки могли получать внутриигровую валюту без других богачей.
Вот и решена проблема с ценами и алгоритмами.
-
Вещица реально крута, но есть одно "но": если мы перезагрузим ПК и заного запустим нашу библиотеку и попытаемся получить события, то на нас вывалятся все сообщения вплоть до мезозоя. Поэтому если планируешь дорабатывать - добавь фичу сохранения последнего lastUpdate в файл
Согласно документации, если я вызову метод getUpdates с параметром offset, все обновления, меньшие или равные этому ID будут засчитаны как обработанные.
То есть API сервер сам сохраняет то, что я обработал обновление. Со стороны бота ничего сохранять в файл не нужно.
Однако есть одно но: при команде типа /reboot и последующей перезагрузке бот может зациклить перезагрузку. Решение - перед выключением или перезагрузкой надо еще раз получить обновления.
И да, лимит обновлений - 100 единиц. При получении нового обновления самое первое удаляется (если выходит за лимит). Если обновлению уже исполнился 1 день, оно автоматически удаляется.
-
А если сервера Telegram окажутся недоступны?
API сервер никогда не отключается. В одиночной игре использование данной библиотеки бессмысленно, а сервера без интернета не остаются.
-
Дописал документацию.
-
-
А зачем нужны драйверы? В настоящих системах, использующих разношерстное оборудование, назначение драйверов понятно. А в OpenOS они зачем нужны? Какое такое разнообразие протоколов приводится к единому стандарту?
Из-за того, что мне приходится для каждого нового компонента писать код, драйвера позволяют вместе с программой устанавливать пакеты этих самых драйверов, позволяющих этой и остальным программам использовать новый компонент.
+ Я не собираюсь давать свободный доступ к библиотеке component.
-
Теперь более подробно о ключе суперпользователя, о котором я умалчивал.
(В init.lua переменная называется superuserkey, ес че)
Он требуется для некоторых операций, опасных для системы.
Тот же SCI.io.filesystem имеет 2 основных функции - getFileObject и list. Обе обращаются к разрешениям, в которых прописано, что может пользователь, а что суперпользователь. По умолчанию оба могут все, однако можно с помощью setPermission можно ограничить доступ даже суперпользователю (однако что бы изменить разрешения, нужен тот самый ключик).
Ключик этот размером в 128 символов, что бы его невозможно было пробрутить. Уязвимости возможно есть, я пока не искал.
Но самую большую уязвимость (getFileObject) я прикрыл с помощью псевдо-ООП (если я сделаю метатаблицу, то в итоге object.permissions можно будет подменить. очевидная уязвимость, о которой многие, не посмотрев кода, могут догадываться). Это основная причина отсутствия ООП в этой функции. Второстепенная - я банально не знал, что надо хранить метатаблицу в локальном окружении библиотеки, а подключать уже в функции.
В планах сделать файл hosts и его обработку.
-
Сделал систему драйверов. Теперь все, что находится в drivers, загружается и что они возвратят, добавляется в SCI.device[имяфайла].
Появилась новая функция - SCI.device.installDriver(path: string, name: string, SUkeyOrRequest:boolean or string): boolean or nil, string
Как нетрудно догадаться из названия, она устанавливает драйвер.
Path - путь до исходного файла, name - название драйвера (он установится в /drivers/[name]), SUkeyOrRequest - ключ суперпользователя или запросить разрешение пользователя.
В SCI.lua надо подменить функцию requestOfInstallDriver, поскольку она всегда возвращает false (сделано, что бы 1. не было большой уязвимости (поставлю true - будет уязвимость) 2. взяв за основу мое ядро, можно будет быстро вставить окошко запроса, не стирая мой код). в нее надо поставить окошко запроса. Либо так и оставить.
-
Это мода пошла у ECS тырить установщик?
Я его тоже тырилНет, он сам его выложил в общее использование на этом же форуме
-
Я думаю, что любой из вас пытался сделать права доступа к определенным файлам.
У некоторых это получалось - например разработчик opensecurity со своей secureos, но она тоже взламывается.
Не думаю, что кому-то это удалось, поэтому встречайте Module Kernel.
Это еще сырое ядро, и даже неспособное открывать какие-либо программы, поэтому я прошу подкинуть идей насчет некоторых компонентов и sandbox-окружения (ибо я удаляю все компоненты из окружения и добавляю их в System Calling Interface, а это ведь код).
Код можно посмотреть тут https://github.com/HeroBrine1st/Module-Kernel . За лишние do-end не ругайтесь: это для удобства чтения кода в моем редакторе, ведь можно сделать вот так:

И можно будет получить быстрый доступ к определенному куску кода.
Установить это ядро можно поверх openos. Вот установщик (по быстрому сляпал, поэтому использую установщик ECS): https://github.com/HeroBrine1st/Module-Kernel/blob/master/v1.0/installer.lua.
Вместе с моим кодом есть еще два файла, которые я выдрал из openos - buffer.lua и serialization.lua. Оба нужны для SCI. Первый для сокетов, а второй - для чтения и записи прав доступа.
Список того, что есть:
Демоны - слушают все события в системе и обрабатывают их. На форуме выкладывали методику построения резидентных программ, а это тоже самое, но в виде файла. Что бы создать демона, просто сделайте, что бы он вернул при запуске 3 параметра - свое имя, функцию старта (можно поставить хоть пустышку в виде function() end, но главное - не nil и ничего другого, кроме function) и функцию, которая будет запускаться при каждом событии в системе с первым параметром - таблица с событием (touch, key_down и подобное). Если файл демона есть в папке /daemons/ - он подключится сам, никаких действий с вашей стороны больше не потребуется.
Базовая система модулей - kernel.loadModule(name:string). работает почти как require, но загружает модули из /module/?.lua.
Недописанная библиотека безопасных обращений к модулям и прав доступа к файловой системе.
UPD: драйвера. Подробнее ниже.
Один скриншот запущенного ядра. Белая полоска внизу - поле для ввода текста.

Все основные идеи я воплотил, и они почти закончились, поэтому подкиньте, пожалуйста, идей.
P.s. думаю, что документация не нужна, поскольку в коде все и так понятно.
P.s.s. ниже - в комментариях
-
5
-
-
Переставь клавиатуру в другое место. Повторять до исчезновения проблемы. Помогает всегда.
-
Установка
pastebin get c1v8T9CK /lib/Telegram.lua; pastebin get 4Lh9ALEY /lib/Promise.lua;pastebin get ji28sbxU /lib/JSON.lua
Создание бота
Здесь все подробно обьясняют: https://tlgrm.ru/docs/bots#botfather.
Документация
Эта библиотека возвращает одну-единственную функцию - Telegram (в либе названа Bot, но будет телеграмом)
- Telegram(token: string) - создает обьект бота. Использует псевдо-ООП.
- Bot.API - таблица с единственным полем
- rawRequest(method: string, options: table): table - сырой запрос без оболочек.
- Имеет метатаблицу. Bot.API[method](options) - возвращает промис.
- Promise:next(onFulfilled:function) - установить функцию, принимающая значение result при успешном выполнении промиса.
- Promise:catch(onRejected:function) - установить функцию, принимающая значение error при ошибке промиса.
- Promise:await() - ждет завершения промиса и возвращает результат с учетом всех его обработчиков.
- Bot.longpoll
- on(event: string,callback: function) - установить обработчик ивента. Весь список - message, edited_message, channel_post, edited_channel_post, inline_query, chosen_inline_result, callback_query, shipping_query, pre_checkout_query
- start() - запустить лонгполл. Программа блокируется.
- stop() - остановить.
- Bot.API - таблица с единственным полем
Возможно, библиотека будет не очень хорошо работать, но я тупо не могу ее адекватно протестировать - вебпрокси (закомментированная 7я строка) перестал работать (только для меня xD)
P.s. если у вас тоже выбивает ошибку на 30й строке - напишите. component.internet.request тупо льет nil вместо ошибки, я пока полагаю, что это связано с блокировками.
-
6
- Telegram(token: string) - создает обьект бота. Использует псевдо-ООП.
-
А как работать с сетью? Всмысле прогонять через нее данные, что бы она на основе своей обученности выдавала новые значения. Или эта функция тоже недописана/не написана?
-
У тебя listener начинается как функция, но не закрыт.
P.S. Опоздал чуть чуть =)
И правда. Ночью вообще подумал про забывшие запятые) + в репу (вам обоим, ес че)
-
Сделал я значит себе блютуз в ОС (знаю, есть такой, но код я воровать не хочу). Отдебажил все, но тут ошибка

local bluetooth = { port = 61593, state = false, opened = false, name = "Безымянный", devices = {}, listener = function(...) local s = {...} print(pcall(function(signal) print(signal[6]) --if not signal[4] == bluetooth.port then return end local reason = signal[6] if reason == "PING" and opened then modem.send(signal[3],bluetooth.port,"PONG",bluetooth.name) end if reason == "PONG" then computer.pushSignal("BLUETOOTH","PONG",signal[3],signal[7]) end end,s)) } -- это та самая 31я строка, просто я перетащил скобку вверх, убрав пустые строкиЯ проверил все несколько раз, пытался добавить и убрать скобку, минификатор так же видит эту ошибку, но при этом никакая конфигурация скобок не помогает решить проблему. В общем, помогите мне решить эту проблему.
-
Есть. Моя либка folderMount вам поможет. дублируете корень в папку, затем монтируете папку в корень, параллельно запустив программу через load()(), а component.eeprom.set просто переопределяете, что бы при перепрошивке EEPROM пользователя спросило, прошивать или нет. component.invoke тоже переопределить, что бы юзал component[component][method].
В итоге если программа нашалит, то либо пользователь согласился, либо она нашалила не в ту папку.
А, еще component.filesystem замените на то, что отдаст метод mount моей библиотеки.
-
[ok=Обновлено][/ok]
Я убрал большинство костылей, но добавил 1 из-за особенностей библиотеки - импорт библиотеки находится в цикле и импортируется с помощью dofile
Также:
Программа узнает количество слотов в инвентаре сама
Спрашивает "частоту зигзагов"
Спрашивает положение робота на базе
Установка все та же - pastebin get -f PZGzqbdk /miner.lua
Так же, если вставить в робота и в комп связанные платы, можно установить pastebin get PZGzqbdk /controller.lua в компьютер
Это альфа-версия программы контроллирования робота, но она уже успешно показывает координаты
-
Не понял, почему нельзя использовать robot.inventorySize(), а в общем, программа простая, даже удивительно, как она может что-то копать.
Можно сделать еще проще, засунуть все в EEPROM, но все-таки эффективность сомнительная, обычный карьер намного лучше.
Насчет эффективности: я вдохновился астрошахтером, а он упускает руду частенько. Я сделал также, пользователь может ходить по шахтам и выкапывать руду, если тот упустил. А еще это плюс для новичков - если пользователь забывает подчищать за роботом, новички на сервере могут выкапывать руды в шахтах.
И в конце концов, робот копает шахты, а не карьер.

RSA
в Сетевые технологии
Опубликовано:
Попытался решетом Эратосфена. Получил ошибку заполнения ОЗУ для n = 10 000 000.