Fingercomp
Гуру-
Публикации
1 629 -
Зарегистрирован
-
Посещение
-
Победитель дней
283
Тип публикации
Блоги
Профили
Форум
Багтрекер
Магазин
Все публикации пользователя Fingercomp
-
Я по oc.cil.li как-то не особо могу сказать, что безумно шикарно выглядит IPB 4. Фич там что-то сильно поменьше. Но апгрейд поддерживаю. Можно нагуглить. Но тест, тем не менее, нужен: многие даже этого делать не могут.
-
Ну уж нет. Просто так, бесплатно, я даже свои идеи выкладывать не буду.
-
Допустим ли вызов функции без круглых скобок?
Fingercomp ответил в вопрос Asior в Разные (отсортировать)
Это есть наиполезнейшая штука, чтобы творить жутчайшей степени норкоманию. Особенно вместе с метаметодами. Например: rule(public) { every "10 seconds" } (function(state) state.counter = state.counter + 1 end) Раскрывается оно в это: Не знаю, где такое в принципе может пригодиться, но такая крайняя эволюция идеи о Fluent interface меня в последнее время сильно забавляет. Так можно на базе Lua запилить и какой-нибудь миниязык даже. class [[public static]] "What" { member [[public static]] "main" (throws "IOException") (function() throw(new "IOException"("what.")); end); } И раскрытие: Неясен тут только смысл. -
# Improved chunkloader upgrade This PR adds a lot of features, most of which give server admins more control over the behavior of the chunkloader upgrade. Namely: - An option to disable a chunkloader if its owner goes offline. - A whitelist and a blacklist of dimensions in which the update is allowed to load chunks. Closes #2768. - An option to use the `forgeChunkLoading.cfg`'s settings to limit number of tickets per player. - A command that lists all chunkloaders in the world (`/oc_cl`). - More verbose logging (the logging level is configurable). - If a chunkloader is duplicated in a way so that multiple items share the same address, only one of them is allowed to work at a time. - In case a drone with the chunkloader upgrade is teleported to another dimension, it requests a new ticket. - Allows adapters and microcontrollers to have the chunkloader upgrade. Closes #2499. A new configuration group, `chunkloader`, is added with the following settings: - `requireOnline`. If `true`, the chunkloader only loads chunks if its owner is online. If the owner goes offline, the chunks the upgrade kept loaded are unloaded; the upgrade keeps consuming energy, though, and `isActive()` returns `true`. If the option is enabled, tickets are registered for the player, not for the mod. - `dimBlacklist`. The chunkloader does not load chunks in dimensions whose IDs are listed there. - `dimWhitelist`. This setting is the opposite of `dimBlacklist`, and lists dimensions in which the chunkloader is allowed to work. Ignored if left empty (so the upgrade works in all dimensions not listed in the blacklist). If the same entry appears in both lists, the blacklist takes precedence. `setActive()` returns `false` if the chunkloader is blocked in that dimension. - `playerTicket`. If `true`, tickets are assigned to the player who owns the chunkloader rather than the mod, so the `forgeChunkLoading.cfg`'s limits get applied for that player. Makes it impossible to activate a chunkloader not owned by a player. - `logLevel`. Controls the level of logging: (`0` for quiet; `1` for more verbose; `2` for debug). A new command, `/oc_chunkloaders` (`/oc_cl`), is added, which lists chunkloaders in the loaded chunks, and inactive registered tickets, displaying the following information: - the component address - the chunkloader status - `inactive` (the chunkloader is inactive) - `active` (the chunkloader is enabled, and loads chunks) - `active/suspend` (the chunkloader is enabled, but doesn't load chunks) - the block coordinates - the chunk coordinates - the dimension ID - the owner Делай PR :3
-
Да, форматирование — это вещь, которая в этой теме далека от златой середины. Я насчитал минимум 4 разных шрифта — зачем? Кучу пустого пространства надо оптимизировать, картинки убрать под спойлеры. А моё мнение заключается в том, что смысла программировать в других играх ещё меньше, чем в Minecraft.
-
Нужен пример кода для записи и чтения файлов
Fingercomp ответил в вопрос kaka888 в Разные (отсортировать)
Тот код, что есть уже, тоже желательно выкладывать. local f, err = io.open("/home/bytes.txt", "w") if not f then error("could not open file for writing: " .. err) end f:write("Bytes don't bite.\n") f:close() local f, err = io.open("/home/password.txt", "r") if not f then error("could not open file for writing: " .. err) end local contents = f:read("*a") f:close() print("Your password is: " .. contents) -
local internet = require("internet") local response = internet.request("http://192.168.1.100/led/1") for chunk in response do io.write(chunk) end print() Это без обработки ошибок совсем. Потому что потенциальных ошибок там много, лезут они, куда только могут, и отловить всех внятно не есть особо простая задачка.
-
Правильный ответ: никак. payonel отрубил это давным-давно из-за костылизма решения. Обратно что-то заменяющее, однако, введено не было. Можно пока эксперементировать с pcall, ибо hard interrupt (^[c) — это обычная ошибка, пущенная через error.
-
Из-за каких-то зондов гугловских, которые на форуме на кой-то чёрт подключены, слетел пост, который я писал (детально расписывать не буду, в общем), поэтому начинаем по-новому и делаем более ужатым его. В чём краша причина? Что же, Алекс кинул стэктрейс ошибки, мы что-то ещё помним со времён, когда юзали таум, а также знаем хоть как-то жавву и имеем под рукой декомпилятор и модпак. Поехали. В стэктрейсе самым верхним фреймом показывается некий метод thaumcraft.common.tiles.TileAlchemyFurnaceAdvancedNozzle.getEssentiaAmount. Открываем его и переходим на указанную строку. Там вот такое: return (this.furnace != null ? Integer.valueOf(this.furnace.aspects.getAmount(this.furnace.aspects.getAspects()[0])) : null).intValue(); Ну, то есть, что это хреновый код, понятно, но нам его прочесть нужно, так что разбавим его горсткой переводов строки. return ( this.furnace != null ? Integer.valueOf(this.furnace.aspects.getAmount(this.furnace.aspects.getAspects()[0])) : null ).intValue(); Нетрудно заметить, когда у нас здесь может возникнуть NPE. Допустим, что this.furnace == null. Тогда выражение выше преобразуется вот в такое: return null.intValue(); Не нужно быть профи в жавве, чтобы понимать, что так вещи не работают. Значит, проблема в том, что this.furnace == null. Как туда null-то угораздило? Тоже нетрудно узнать. Во-первых, это поле класса, как мы замечаем по префиксу this., и, перейдя на объявление, находим тип поля: TileAlchemyFurnaceAdvanced. Это класс, потому вместо инстанса можно использовать null. Идиотское решение, но вот такая жавва у нас. Во-вторых, мы видим, что null там устанавливается при создании объекта класса TileAlchemyFurnaceAdvancedNozzle. То есть это дефолтное значение, проще говоря. И оно должно где-то и когда-то устанавливаться в нормальное. Ищем присвоения в это поле. Находим его в func_145845_h. Хе-хееее. Этот метод — обфусцированный update. Он вызывается игрою у всех тайлов каждый тик. Запомним, потому что знание это ещё понадобится. Этот метод всегда устанавливает не-нуллёвое значение полю, поэтому сама имплементация метода интересовать нас не будет. Отлично. Выяснили, что вместо null присваивается значение конкретное там при первом апдейте тайла. Ещё надо понять, что такое Nozzle — это штука, в которую пихается эссенция. Я не помню, где она там на печке, но где-то быть должна точно, судя по всему. Возвращаемся к стэктрейсу. Ниже фрейм принадлежит трансвекторному интерфейсу из таумик тинкерера. На всякий случай бросим и этот мод в декомпилятор, но чего-либо интересного там не находим. Вспоминаем, что трансвекторный интерфейс — это прокси, который принимает эссенцию, а затем телепортирует её в парный блок, откуда эссенцию можно вытащить. И нет, бага не в нём. Осматриваем остальную релевантную часть стэктрейса, в котором есть ещё 2 фрейма. Тааак. Некий метод TileTubeBuffer.func_145845_h, вызывающий TileTubeBuffer.fillBuffer, вызывающий TileTransvectorInterface.getEssentiaAmount, вызывающий TileAlchemyFurnaceAdvancedNozzle.getEssentiaAmount... Начинает складываться картинка проблемы. ...Нет? Не начинает? Тогда вспоминаем, что значит func_145845_h. Это, как уже замечал, есть обфусцированный update. Вот теперь-то точно начинает складываться она. После того, как игра загрузила чанк, она запускает для каждого тайла его метод func_145845_h (апдейт). Не параллельно, а последовательно. Я не знаю, какой там порядок, но мы можем точно сказать, при каком условии у нас уже вызывается апдейт какой-то трубы, но ещё не вызвался апдейт печки. Если конкретно, то тогда, когда труба обновляется до обновления печки. И, как мы понимаем, этот баг проявляется только при загрузке чанка. Труба пытается передать эссенцию из себя в другую трубу. Та труба проверяет, сколько эссенции в подцепленном к ней блоке — трансвекторе. Трансвектор сам эссению не хранит — он перенаправляет запрос на количество эссенции печке. А печка ещё не обновлялась, поэтому this.furnace == null, и поэтому мы получаем ]NullPointerException, который успешно прикладывает сервер. У нас должен остаться один вопрос на этом моменте. Где баг? ... А вот это очень хороший вопрос. Давайте подумаем немного, когда должна была происходить инициализация печки. Верно — при загрузке чанка, для чего есть специальный метод. Вместо этого инициализация делается во время обновления тайлов. Процесса, у которого нет заданного порядка обработки. И иногда так получается, что труба грузится раньше, чем печка. Значит, баг точно в печке, а Азанор, или кто там таум пилил, виноват в том, что совершил такую, извините, тупую ошибку. Ну, вообще, всякое бывает. Баги в основном как результат тупых ошибок и появляются. Или в коде, который слишком тупой, чтобы можно было о багах думать, или в коде, который слишком сложный, чтобы в него кто-то в своём уме начал вчитываться. Как фиксить будем? А фиг мы пофиксим. Репортить некуда. Таум 4 не поддерживается уже сколько лет. Покуда мы на 1.7.10, жить нам с этой проблемой. Хотя я полагаю, что можно и как-то пропатчить жарник, пересобрать мод и провести ещё с дюжину шаманских ритуалов, но я в такое не вдавался. Возможно, можно заказать фикс. Возможно, можно что-то запретить. Но тут уж пусть решает Алекс. Зе енд. А, нет, погодите с зе ендом. Где виспы-то? Виспов тут нет. Виспы тут никоей роли не играют. Кроме, возможно, того, что @KelLiN, гоняясь с сачком и банкой за виспами, как-то так подгрузил печку, мы получили краш. Но и слава коду. Ведь виспы должны в банке жить, а не сервер крашить, верно? (Почему вёрстка едет, меня не спрашивайте. У меня все теги прикрыты корректно.)
-
[OC] [Add-ons] Computronics! Полный обзор версии 1.5.5 [#2] (стандартные блоки)
Fingercomp прокомментировал Fingercomp запись в блоге в Fingercomp's Playground
5 бит на канал R, G, B. То есть каждый канал может иметь значение от 0 до 31. Простейшими битовыми операциями их затем можно будет совместить: (((r << 5) | b) << 5) | g. -
Насколько я помню, в меню по ПКМ она где-то. Надо прокрутить ещё будет, вроде.
- 68 ответов
-
- 1
-
-
- интерфейс
- программирование
-
(и ещё 1 )
Теги:
-
А что за текст программы? Код, что ли? Но зачем видеть код во время исполнения программы? И, вообще, если какая-то проблема в коде, конечно, можно по симптомам иногда догадаться, в чём проблема, но если на форум писаться, то вставляйте код, пожалуйста. Здесь кристальных шаров нету, насколько мне известно.
-
Знаете, а я вот что-то тут наблюдаю абсолютный нуль вопросительных знаков. Что же, добавлю сам их несколько. Вопрос сам где — что делать-то от нас просится? Рассказать, как строки склеивать? Да пожалуйста. local event = require("event") local unicode = require("unicode") local input = "" while true do local chr = select(3, event.pull("key_down")) if chr == 3 or chr == 4 then -- got ^C or ^D; interrupt break elseif chr >= 32 then input = input .. unicode.char(chr) end end print(input)
- 2 ответа
-
- 2
-
-
Единственный фолдинг, который я юзаю, происходит от ФП и с этой темой не связан. Посему я не знаю, зачем оно нужно. Может кто-то пояснить? В чём смысл того, чтобы скрыть тело блока? Увидеть листинг функций удобнее через сайдбар, против длинного тела цикла помогает извлечение в функции и полоска, обозначающая scope. Других юзкейсов не вижу.
-
Нет. У @Asior правильно (если забыть про то, что вы оба глобальные переменные юзаете). У тебя же в message будет не первая часть сообщения, а название ивента ("modem_message") всегда. Очень сомневаюсь, что именно это нужно.
-
Блокирование сообщения в чате по условию.
Fingercomp ответил в вопрос Serega61 в Разные (отсортировать)
Нет, почему. Можно. Никто не запрещает. С помощью мода. С помощью мода — аддона для OpenComputers, который позволял бы осуществлять такое (пока такого нет, к слову). Но не средствами одного OpenComputers. -
К слову, моционный сенсор должен вставляться в микроконтроллеры, если вы не застряли где-то в начале прошлого года.
-
Насколько я помню, Алекс ведь уже тестировал этот мод и хотел даже поставить когда-то. Но он оказался слишком кривым, чтобы на паблик сервер ставить можно было в здравом уме.
- 28 ответов
-
- 1
-
-
- AdvancedMachines
- IC2
- (и ещё 1 )
-
Мы его похоронили. ··· Неожиданно, да? ··· 2018-06-16 третий этап UT:R отправился на кладбище, которое охраняет Хель. Без слёз, потому что провожать было некому. Некролог я пишу в первый раз. И даже это получилось с задержкой в 4 дня. Собственно, именно такого рода проблемы и послужили причиной смерти. Подробнее. 2017-12-16 у нас начался новый проект, над которым мы... ну, теперь я только — над которым я работаю. Название ему есть wonderful — это убер-GUI-либа на стероидах, и она есть на гитхабе. Идея этого проекта сама появилась, когда я обдумывал инфо-панели и систему разработки под дрона. Эти компоненты есть графические программы. Со второй проблем никаких не было, а вот фича первой в том, что там на один комп приходилось 4 монитора. Ни одна либа не позволяла делать обработку гуи нескольких мониторов, а то "решение", которое я описал в 2 постах выше, есть невероятный костыль, что я прекрасно понимал. Поэтому появилась потребность создавать свою либу. По пути мы придумали мегатонну всяких фич: система ивентов, стили, ООП, лейауты, гибкость и расширяемость... Если дальше я буду продолжать, то получим рекламу либы вместо некролога UT#3, поэтому лучше рассказать, почему мы пробили все дедлайны на скорости света. Вандерфул был жутко интересен. Надо сказать, что я его полгода уже пилю и до сих пор не забросил. Соответственно, мне стало совсем не до UT#3, поэтому UT#3 загнулся фактически уже тогда. Добили его перевыборы меня в ирке в конце февраля, в результате которых хостер, @Fiender, потерял опку, а мы — доступ к его серверу. В итоге у нас 3.5 месяца хоста не было. Мы про UT#3 тогда уже забыли, однако. ¯\_(ツ)_/¯ В общем, третьей части Unreal Tournament: Resurrection не получилось. Второй раз возрождать мы уже не будем. Четвёртую часть делать тоже не будем: на этом мы серию ивентов завершаем. Разработки, которые уже есть, доступны на гитхабе. Разработки, которых ещё нет, мы скоро почистим. Первые два этапа были довольно весёлыми и забавными. Если ещё не смотрели, пробежитесь по топикам: #1, #2. И да. Заходите в ирку. UT#3 там уже не будет, но есть тонна всякого интересного вместо этого. Там же можно и за нашими следующими проектами следить.
-
В 1.12 нет метаданных толком. См. issue. Пока не починено.
-
Достаём с полки словарь и находим это слово. Этот даже можно.
-
Шифт-ПКМ с диском в руке и на кнопку тыкс.
- 2 ответа
-
- 4
-
-
В ней можно поведение при сравнении переопределять. if setmetatable({value = 4}, {__lt = function(self, other) return self.value < other end}) < 5 then print("It works, unexpectedly.") end
-
Там группируются в команды для GPU конвертером. Как бы. Стримы через ice2 как-то делаются. Твитч на сервере BTM смотрели же. И звук был.
