Fingercomp
Гуру-
Публикации
1 629 -
Зарегистрирован
-
Посещение
-
Победитель дней
283
Тип публикации
Блоги
Профили
Форум
Багтрекер
Магазин
Все публикации пользователя Fingercomp
-
В какой группе я? Так редко играю или меня интересуют только лагодромы?
-
Он и так установлен на бумераночке.
-
Кхм-кхм, кому мне надо писать? Под 1.7.10, извините, но насколько я знаю, поддержки от автора чизеля больше нет.
-
Ну должна быть, вообще. Вот только лень возиться с гуишками опять.
-
Ну конечно же, конечно же бомбезный для НЕО, мод-то он и написал! А мы-то совсем не догадались. А вообще, поживём — увидим.
-
Пара трюков OpenComputers
Fingercomp прокомментировал Fingercomp запись в блоге в Fingercomp's Playground
Пришлось вернуться к os.clock: аптайм давал неточное время. Мы можем здесь положиться на клок, так как этот код не будет делать yield во время слипа, только при вынужденном торможении (и тогда разность будет незначительна). -
Ох ё. Срочно обновил список — пропишите oppm uninstall smap и oppm install smap. >_> Ну и раз я пишу пост, о работе. Базовые команды: smap.load(path: string, format: string) — загрузить файл по данному пути данного формата ("midi" / "nbs"). Возвращает объект Music, которые далее будет переменной music. smap.device(name: string) — получить экземпляр устройства ("inoteblock" — железный нотный блок, "pcspkr" — computer.beep(), "beep" — Beep Card). music:connect(device: Device) — подключить экземпляр устройства. music:play(ticks: number): [nil, reason] — проиграть мелодию заданное количество тиков. Можно поставить math.huge. music:seek(pos: number) — переключить буфер в треке и сбросить позицию буфера до 1. Например, music:seek(1). music:getPos(): number — возвратить текущий буфер. music:getLength(): number — получить длину трека (данную функцию следует вызывать после загрузки всех буферов). music:close() — освободить память.
-
Только что буквально починили midi — звук НЕМНОООООГО, но похож на тот, что нужен. Правда, из-за переносов октав вверх/вниз, непоятных инструментов и сложных нот, звук может (и будет) отличаться от оригинального. Сейчас надо починить игру в фоне для всяких игрушек, например, ну и ещё прикрутить какой-нибудь формат файлов музыкальных, кроме миди и nbs.
-
"Спасибо", а то я сооооовсеем не знал о ней. Ага. Есть трек, он хранит буферы, буферы хранят акккорды, которые хранят ноты. А почему "вымышленный"? Не на одних MP3 и MIDI мир сошёлся. Не вижу ничего плохого в своём формате — а иначе как абсолютные разные файлы проигрывать? Я так понял, что ты вообще моё сообщение не читал нормально.
-
Да ноты-то я знаю, сам на пьянине играл. Бемоледиезы в ту же топку. Есть внутренний формат, который хранит ноты, а не волну. Точней сказать, аккорды — массив массивов с заданной продолжительностью, тиком, частотой и инструментом (пока только пять, сменить легко). Теперь нужны внешние — какой-нибудь простой для декодинга и понимания не помешал бы. Ну и более-менее популярный.
-
В активной разработке (а как же иначе, если на кону стоит эта штука) сейчас находится такая библиотека, как smap — акроним от simple minecraft audio player. Взялся я за такую тему, в которой я почти полностью нуб. Какие-то чертовски непонятные спецификации на миллионы строк для одного только формата, волны морские звуковые, которые как-то надо играть нотами. Что есть? Поддержка computer.beep(). Поддержка железных нотноблоков из Computronics (одного хватит). Поддержка Beep Card из Computronics (однако, не тестил). MIDI — ужасно кривая реализация, так как был скопирован большой объём кода из программы Sangar, а затем кое-как переделан, не имея понятися о работе кодека. NBS — использовал программу TxN для того, чтобы не копаться в очень скудной спецификации формата... на C#... Ну там всё довольно просто, к тому же даже умудрился прикрутить загрузку файла во время игры, Что надо? Хороший вопрос, ибо единственный ответ — это цель проекта. "Возможность играть многие форматы аудио в Minecraft на разных устройствах". Так что тех, кто разбирается в кодеках, музыке и тому прочем, прошу помочь мне с этим плеером несчастным. Парсинг файлов музыкальных, куски кода на Луа, ссылки на реализации чтения форматов на языках программирования иди даже Pull Request'ы (O.o). Сама библиотека лежит здесь: https://github.com/OpenPrograms/Fingercomp-Programs/tree/master/smap/smap, которую можно скачать на компьютер OC с помощью OPPM: oppm install smap. Пример использования библиотеки: -- Подключаем библиотеку local smap = require("smap") -- Загружаем аудио-файл local music = smap.load("/home/music/NyanCat.nbs", "nbs") -- Создаём объект выходного устройства (inoteblock — железный нотный блок) local outputDevice = smap.modules.output.inoteblock.new() -- Подключаем устройство music:connect(outputDevice) -- Играем музыку до конца print(music:play(math.huge)) И хотя обычно темы о помощи вообще никакого резонанса не делали — неинтересно другим, — я всё-таки надеюсь на помощь.
-
Пара трюков OpenComputers
Fingercomp прокомментировал Fingercomp запись в блоге в Fingercomp's Playground
Верно, правда, почему-то решил, что в machine.lua используется время компьюетра. Но нет. В конфигурации OpenComputers есть настройка timeout, равная 5 реальным (не игровым) секундам по умолчанию. Обновил код. -
Здесь опишу такие штучки, которые могут потребоваться продвинутым OC-программистам (да и просто Луа-программистам). Busy Idle С помощью этого трюка можно делать довольно точные задержки, причём с длительностью менее тика. local lastSleep = os.clock() local function sleep(t) local begin = os.clock() while os.clock() - begin < t do if lastSleep - os.clock() >= 3.5 then -- В конфигурации дефолтное значение = 5 секунд, ставим на 1.5 меньше для безопасности. os.sleep(0.05) -- Вынужденная задержка. lastSleep = os.clock() t = t - 0.05 end end end Проверка по значению Очень часто в моих программах нужно найти ключ, значение которого соответствует данному. Для этого я написал простую функцию: local function isin(tbl, value) for k, v in pairs(tbl) do if v == value then return true, k end end return false end На огромных массивах может и затормозить — скорость работы прямо зависит от длины массива. Табличная магия Рассмотрим этот на первый взгляд обычный пример кода: local tbl1 = {"My", "super", "table", 42} local tbl2 = tbl1 tbl2[2] = "cool" for _, tbl in pairs({tbl1, tbl2}) do -- Напечатать значения таблиц for k, v in pairs(tbl) do print(k, v) end end Разумно ожидать такое: 1 My 2 super 3 table 4 42 1 My 2 cool 3 table 4 42 Но вместо этого получаем: 1 My 2 cool 3 table 4 42 1 My 2 cool 3 table 4 42 Как видно, изменив значение в одной таблице, изменилась и другая. Дело в том, что переменная хранит указатель на таблицу, а не саму таблицу. Соответственно, и tbl1, и tbl2 ссылаются на один и тот же массив. На первый взгляд это кажется ненормальным. Как скопировать-то таблицу? local function copy(tbl) if type(tbl) ~= "table" then return tbl end local result = {} for k, v in pairs(tbl) do result[k] = copy(v) end return result end Но из этого можно извлечь очень полезное применение. Когда мы передаём таблицу в аргументы функции, массив не копируется, а даётся указатель на тот же самый. Поэтому можно сообразить такой код: local function removeOddNums(tbl) for k, v in pairs(tbl) do if tonumber(v) and v % 2 == 1 then tbl[k] = nil end end end local table = {5, 26, 249586, 457139, 876, 42, 153} removeOddNums(tbl) И он будет работать. Этим и объясняется, почему table.sort не возвращает таблицу. У меня не самое полезное применение, однако с помощью таблицы можно создавать "поинтеры", например, так: local numPtr = {42}, а в функциях использовать так: local value = numPtr[1]; numPtr[1] = 666. И уже использовать их в своих вычислениях. Думаю, вы найдёте применение этим фокусам. Не самые очевидные моменты, однако иногда требуется. The end.
-
Для 1.7.10 формулы абсолютно другие для посчёта. См. банку опыта: http://computercraft.ru/topic/955-%E2%9C%93-zakaz%E2%84%96005-zavershen-bank-opyta-admin-zakaz-pe/page-2?do=findComment&comment=13082
-
Да забудь ты про ОпенБлоки, как про страшный сон, и не вспоминай о нём больше на форуме. Интерфейсы, работающие на магии — раньше мне это тоже интересно было, но сейчас хочется самому знать, как работает. Компьютерные интерфейсы нужны.
-
Выяснили с @cogor в #oc, что есть команда "saveConfiguration", которая, будучи посланной, копирует конфигурацию в наномашины в инвентаре. Копирую и сюда, чтобы знали Бомбофича.
- 3 ответа
-
- 5
-
-
[OC] [Tutorial] Туториал по наноботам!
Fingercomp прокомментировал Fingercomp запись в блоге в Fingercomp's Playground
Коммит от 02/10/2015: Allow saving nanomachine configuration to other nanomachines in player's inventory. Closes #1462. Итак, не описанная нигде команда "saveConfiguration" копирует конфигурацию наномашинок в другой предмет в инвентаре. По-моему, это круто. -
Ну допиливай и выкладывай, если хочешь. Посмотрим. Квест только меня на ИТ поймать Кликните в ирке, если что, если я на ИТ нужен.
-
Прошу простить и извинить. Недочитал пост первый, подумал, что это вопрос был задан, а не прога, и потому пошёл писать я на коленке Ну тогда норм, читаемость поправь только.
-
Ааааааа! Нет слова "autors"! Есть "authors"!! Так, ладно. https://gist.github.com/Fingercomp/3975221042e4e16c83d7a5f6fceed0d1 — подключаешь библиотеку и работаешь: local addMethod = require("addmethod") local a = {} addMethod(a, "hello", function() return "Hello, world!" end, "function():string -- Returns \"Hello, world!\"") print(a.hello) print(a.hello())
-
Без редактирования NBT-данных игроков — никак. Наномашины в предметах не хранят конфигурацию, она получается при съедении.
- 3 ответа
-
- 3
-
-
В YouTube по CX поищите просто "Computronics гайд", там единственный видеогайд имеется, к счастью, на русском. Может помочь.
-
Мне ещё раз повторить?.. Другой формат — другая прога.
-
Использование телепортаторов я бы приравнял к читу в данной ситуации — какой-то левый мод ещё. Я бы в качестве перетаскивателя предложил офигительнейший вариант — дроны, которые прямо созданы для быстро перемещения предметов в том числе. Но минус конструкции этой вы все знаете По роботу на реактор — извольте, это слишком дорого, к тому же, чем больше компов загружено, тем больше вероятность, что сообщения могут не доходить, роботы падать с TLWY и прочие нежелательнейшие фиговины. Транспозер выглядит круто, но надо транспортировать как-то. Как верно заметил @eu_tomat, скорость в данной конструкции не слишком важна. Вот вариант схемы: компьютер считывает переодически показания с транспозеров, посылая робота туда, куда надо. Экономим время робота и ускоряем мониторинг.
