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

ECS

Гуру
  • Публикации

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

  • Посещение

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

    203

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


  1. 21 час назад, Alex сказал:

    Я первый раз слышу, чтобы нужно было заслипить прогу после реквеста, чтобы хоть что-то получить в запросе. Такого же не должно быть.

    Не-не-не, все так и должно быть: read тупо пытается прочесть по кускам контент веб-страницы с сокета. Если сервак пока еще не кинул ошибку соединения, и контент отсутствует - в сокете ничего свеженького не будет, и read выдаст пустую строку. Если соединение говеное, то сокет закрывается, и read выдает nil с причиной. А если URL валидная, то и содержимое будет выдано практически мгновенно, поэтому никаких пустых строк замечено не бывает - либо бывает, но крайне редко.

     

    20 часов назад, Hikooshi сказал:

    да, но если слипнуть без while'а, то тоже будет работать

    Потому что sleep в опеноси работает через цикл:

    function os.sleep(timeout)
      checkArg(1, timeout, "number", "nil")
      local deadline = computer.uptime() + (timeout or 0)
      repeat
        event.pull(deadline - computer.uptime())
      until computer.uptime() >= deadline
    end

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

    • Нравится 1
    • Спасибо 1

  2. Деление ноля на ноль не сгенерирует ошибку, это NaN. Но вообще - вот так

    local specialError()
      -- b не существует
      local a = b + 10
    end
    
    local success, reason = xpcall(specialError, debug.traceback, аргументы...)
    if not success then
      print("Ошибка", reason)
    end

     

    • Нравится 1

  3. @MisterFunny01, так бы и сказал сразу. Ну чо, берешь либо готовую либу для отрисовки пикч, либо пишешь собственную. Далее создаешь пикчи либо в готовом пикчредакторе, либо в самописном, либо вообще по пиксельному массиву, создаваемому напрямую в коде. Далее получаешь список файлов из директории, фильтруешь расширения, и рисуешь пикчи. В чем проблема-то?

     

    Данный пример для готовой либы. Как обстоят дела конкретно в твоем случае - я хз.

    local filesystem = require("filesystem")
    local image = require("image")
    local gpu = require("component").gpu
    
    local directoryImage = image.load("/Papka.pic")
    local screenWidth, screenHeight = gpu.getResolution()
    
    -- Чистишь вилочкой экран
    gpu.setBackground(0x0)
    gpu.fill(1, 1, 160, 50, " ")
    
    local path, x, y = "/", 1, 1
    -- Пробегаешься по списку дочерених файлов в указанной директории
    for file in filesystem.list(path) do
      -- Рисуешь иконку, если это директория
      if filesystem.isDirectory(path .. file) then
        image.draw(x, y, directoryImage)
      end
      
      -- Рисуешь текст с именем файла под иконкой
      gpu.setForeground(0xFFFFFF)
      gpu.set(x, y + 5, file)
      
      -- Определяешь координаты следующей иконки на экране
      x = x + 10
      -- Смещаешься ниже, если иконка зашла слишком "вправо"
      if x + 10 >= screenWidth then
        x, y = 1, y + 5
      end
    end

     

    • Нравится 1

  4. Ну как где? "pe4[stack.id]" - тут и сравнивает. Если таблица pe4 содержит элемент с ключом, эквивалентным значению поля id таблицы stack, то результатом будет значение элемента таблицы pe4 по требуемому ключу.

     

    Да, для того, чтобы ветвь if выполнилась, все условные элементы должны отличаться от nil. И нет, первая часть условия далеко не всегда будет истинна: если требуемый слот не содержит предметов, то переменная stack будет иметь значение nil. 

     

    Для работы программы нужно банально пробежаться по всем слотам сундука, проверить, есть ли что-либо в слоте - и если есть, то проверить, является ли id предмета в слоте валидным (т.е. содержится ли он в таблице pe4). По крайней мере, я именно так понял условие задачи.

    • Нравится 1

  5. 1 час назад, Teen_Romance сказал:

    Я не понимаю в чем фишка этого варианта.

    Это просто более удобный и быстрый вариант проверки наличия id предмета из сундука в твоей таблице pe4. Можно, конечно, делать сие через цикл - но зачем? Ключом элемента таблицы может быть что угодно: хоть число, хоть строка, хоть функция, хоть таблица - это уж как тебе удобно. Просто если поле id у предмета - это "minecraft:cobblestone", то и таблица pe4 для корректного поиска должна выглядеть соответствующе:

    pe4 = {
      ["minecraft:cobblestone"] = true,
      ["minecraft:wood"] = true,
    }

    А конструкция "if stack and pe4[stack.id]" работает именно так, как ты и предположил - сначала проверяет наличие предмета в слоте,  а затем уже сверяет id с твоей таблицей


  6. 31 минуту назад, Teen_Romance сказал:

    Ни у кого большое не осталось идей как пофиксить это? Проблема где то в логике, но я не могу понять где (

    Мяу, ну написали же русским языком, что getStackInSlot(номер слота) возвращает таблицу с информацией о предмете, если таковой имеется в слоте - либо nil в том случае, если слот пустой, для чего и нужна проверка на "пустотность".

     

    Шаг 1. Получил инфу о предмете в слоте

    stack = getStackInSlot(i) 

    Шаг 2. Убедился, что в слоте есть предмет

    if stack then

    Шаг 3. Обработал информацию о предмете в слоте так, как требуется. НЕ НУЖНО вызывать getStackInSlot() еще раз. Переменная stack уже хранит результат вызова getStackInSlot()

    if stack.id == 8 then

    Конкретно в твоем случае ошибка происходит по той причине, что getStackInSlot возвращает nil, а ты пытаешься получить поле от возвращаемых данных по ключу id - вот и получаешь ошибку attempt to index a nil value. Слот пустой, id не существует. Делай проверку разово - и работай с переменной stack.

     

    Также я не совсем понимаю, почему ты используешь два цикла for i = 1, 10 / for j = 1, 10, когда число предметов в ME-сети явно может превышать 100. Наверняка там должен иметься метод getInventorySize, или getItemCount, или еще какой-то схожий - используй его.

     

    И еще: для сравнения id предметов с таблицей pe4 также придется делать отдельную логику. Что-то наподобие:

    local pe4 = {
      [1] = "камушек",
      [8] = "доски"
    }
    
    ...
    
    stack = cry.getStackInSlot(i)
    if stack and pe4[stack.id] then
      print("рассматривается валидный предмет")
    end

    Кроме того, как заметил @Asior, мы понятия не имеем, что это за компонент такой под названием "crystal". Так что если выяснится, что информация о его stack'ах вообще не содержит никаких id, либо его id является строковым наподобие "minecraft:stone" - то тут уж ты сам виноват. ПоДуМоЙ

    • Нравится 2

  7. @MisterFunny01, что значит "выделить только папки"? Ты же выше писал, что нужно отображение иконок вместе с именем файла, а теперь про выделение какое-то. Нипанятна! Но если что, папку от файла можно отличить через

    print(filesystem.isDirectory("/MyFile.lua"))
    
    > false

    А расширение файла можно получить через регулярку

    local name = "MyFile.lua"
    print(name:match("[^%/]+(%.[^%/]+)%/?$"))
    
    > .lua

     


  8. Приятное обновление для проводника: добавлен табличный режим отображения списка файлов со всеми вытекающими фичами. Как мне кажется, для небольших размеров окна этот вариант более практичен в плане удобства навигации

     

    Спойлер

    tlmOo0H.png?1

     


  9. @Sneeex Разве что отключить обои, это основная статья расходов оперативы: примерно под 200 Кбайт жрут в зависимости от графонистости. К примеру, у меня после их отключения оператива загружается лишь на 44%:

     

    Спойлер

    htVTsHL.png?1

     

     Еще можно в настройках активировать выгрузку неиспользуемых библиотек и отключить отрисовку иконок приложений - тогда расход останется на ~30%. Ну, и еще можно поставить серверную стойку на 4 планки оперативы 3.5 уровня - тогда все уж точно будет в шоколаде


  10. @MisterFunny01, если речь о майноси, то индивидуально для каждого файла - никак. Иконки можно кастомизировать у приложений, а потом уже назначать ассоциации расширений файлов для открытия выбранным приложением. Конкретнее - смотри содержимое приложухи MineCode IDE.app, там как раз добавлены кастомные иконки и контекстное меню для .cfg/.txt/.lua, да и вообще довольно очевидно все


  11. Тут на днях обновленная софтина Multiscreen в маркет затесалась - добавлена группировка по цветам для гораздо более быстрой отрисовки жирных пикч. Правда, чем жирнее пикча, тем дольше будет обрабатываться каждый моник, но и это уже заметный прогресс:

     

    Спойлер

    LFxloa6.gif

     

    • Нравится 6

  12. 43 минуты назад, Alex_kagekao сказал:

    упрощает кодинг

     

    43 минуты назад, Alex_kagekao сказал:

    на мой личный взгляд Lua не очень удобен, и C++ кажутся более родными и удобными

     

    8TQOjQT.jpg?1

     

    Вообще, если вкратце - то нет, почти что нельзя. Это плюсы комбинятся с луа-машиной посредством C-API/LuaBridge, а не наоборот. Опенкомпы, конечно, позволяют создавать собственные архитектуры в виде аддонов, и тому даже имеется несколько примеров, но вряд ли кто-то озаботится плюсами, мяу

    • Нравится 1

  13. @Totoro зараза! Ну что ж... вряд ли автор объявится, так что пусть она будет Тоторина, ибо так велит мой бог, нашептывая на ушко.

     

    Касаемо оси: кардинально переработана система полноэкранных приложений. При активации режима полного экрана для каждого окна полностью отключается весь интерфейс, за исключением верхней менюхи. Таким образом в полноэкранном режиме приложения пашут с той же скоростью, как если бы они были не зависимы от ОСи. А еще добавлена клевая анимация изменения размеров окон:

     

    Спойлер

    OD9Tipr.gif

     

    • Нравится 5

  14. 3 минуты назад, kaka888 сказал:

    Тут в result приходит функция?

     

    Угу, угу. Если на вход load подать строку, в которой нет синтаксических ошибок, эта строка скомпилится и вернется в виде функции, которую можно вызвать когда пожелаешь. Если были ошибки, возвращается nil и инфа об этих ошибках. С load еще связано множество приколюх, но для данной задачи достаточно простой загрузки кода

    • Спасибо 1

  15. 9 часов назад, kcalBxoF сказал:

    Такого рода ключ можно сбрутфорсить, причем сделается это довольно быстро.

     

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

     

    А поскольку debug в опенкомпах крайне лимитирован, и доступа к локальным переменным нет, то и выпотрошить весь стек оперативы в поисках ключа для брутфорса не получится.

    • Нравится 1
×
×
  • Создать...