Перейти к публикации

В ближайшее время постараюсь разобраться с картой сервера/ЛК/бб кодами

Внимание, с 14 февраля до 20 февраля могут проходить работы на сервере, где также находится лаунчсервер. В связи с этим авторизация в лаунчере может не работать

ECS

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

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

  • Посещение

  • Дней в лидерах

    98

Последний раз ECS выиграл 10 февраля

Публикации ECS были самыми популярными!

Репутация

1 526 Очень хороший

Информация

  • Пол
    Мужчина
  • Город
    Санкт-Петербург
  • Интересы
    Плавание, охота, туризм, кодинг

Контакты

  • Skype
    eliteclubsessions

Посетители профиля

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

    Meh, опять эмулятор OC

    @Kimapr, ограничений по скорости работы на данный момент нет, но если нужен реализм по сравнению с опенкомпами - то добавлю, говно вопрос. А повтор клавиш прямо сейчас запилил, пасебо за наводочку @Asior, угу, сокетовый код сыроват. Но вообще гоу инфу по используемой ирке - опеносовская или какая? Специально даже затестил и (вроде бы) без проблем зашел:
  3. ECS

    MineOS

    @Totoro зараза! Ну что ж... вряд ли автор объявится, так что пусть она будет Тоторина, ибо так велит мой бог, нашептывая на ушко. Касаемо оси: кардинально переработана система полноэкранных приложений. При активации режима полного экрана для каждого окна полностью отключается весь интерфейс, за исключением верхней менюхи. Таким образом в полноэкранном режиме приложения пашут с той же скоростью, как если бы они были не зависимы от ОСи. А еще добавлена клевая анимация изменения размеров окон:
  4. Угу, угу. Если на вход load подать строку, в которой нет синтаксических ошибок, эта строка скомпилится и вернется в виде функции, которую можно вызвать когда пожелаешь. Если были ошибки, возвращается nil и инфа об этих ошибках. С load еще связано множество приколюх, но для данной задачи достаточно простой загрузки кода
  5. ECS

    MineOS

    Ну что ж. Буквально на днях майнось наконец релизнулась в виде полностью самостоятельной и независимой от OpenOS операционки с собственным набором библиотек и вики. Все родное, отечественное (звучит как диагноз). Большинство методов библиотек по типу filesystem или keyboard крайне схожи с таковыми в опеноси по поведению, так что особых проблем с переходом возникать не должно. Также существенно снизился расход оперативной памяти - примерно на 7% от 4 планок 3 уровня. Осталось, конечно, регулярно выискивать мелкие недочеты и допиливать их, а также более подробно наполнять инфу на вики, но в целом результатом я доволен. Среди ключевых нововведений стоит отметить следующие: Полностью переписанный инсталлер, запускающийся даже с EEPROM, имеющий возможность выбора тома для установки и его форматирования, а также систему конфигурации пользовательского профиля. Добавлено несколько системных языков, а заодно возможность установки лишь выбранного языкового пакета вместо всех сразу для экономии места на диске: Система профилей пользователей с сегрегацией рабочих директорий. По сути каждый пользователь имеет собственный рабочий стол, собственные приложения, документы, настройки и так далее, а также возможность защиты паролем. Конечно, любая защита на опенкомпах не имеет смысла по определению, но она есть!111 Полная двойная буферизация графики, все приложения переписаны под библиотеку GUI. Кстати, местный картинко-редактор заимел оконный режим, а также Ёлочка @Totoro стала отлично работать в фоне и украшать хату (в моем случае - жалкий клочок земли в воздухе): Крайне полезный режим Internet Recovery, позволяющий мгновенно переустановить систему напрямую из EEPROM в случае возникновения каких-либо проблем: Возможность заливки файлов напрямую на Pastebin буквально парой кликов: Фича создания ассоциаций расширений файлов с возможностью назначения приложения для открытия того или иного расширения:
  6. ECS

    Защитник таблиц: tprotect

    Здесь ключ - это не число, а таблица с уникальным адресом. По факту для подобного даже рандом не нужен, можно было вообще возвращать пустую таблицу или функцию, служащую идентификатором для разблокировки. А поскольку debug в опенкомпах крайне лимитирован, и доступа к локальным переменным нет, то и выпотрошить весь стек оперативы в поисках ключа для брутфорса не получится.
  7. Если используется OpenOS. Все четыре варианта более-менее схожи: require("shell").execute("/Test.lua") os.execute("/Test.lua") dofile("/Test.lua") -- Более детальное решение с безопасным запуском файла и отлавливанием всех ошибок с подробной информацией local result, reason = loadfile("/Test.lua") if result then result, reason = xpcall(result, debug.traceback) if result then -- Все замищательно else print("Не удалось выполнить файл: ", reason) end else print("Не удалось загрузить файл: ", reason) end Если используются "чистые" опенкомпы на микроконтроллере или попросту с EEPROM: local filesystem = component.proxy(component.list("filesystem")()) -- Читаем файл напрямую с диска local handle = filesystem.open("/Test.lua", "rb") local data, chunk = "" repeat chunk = filesystem.read(handle, 4096) data = data .. (chunk or "") until not chunk filesystem.close(handle) -- Выполняем прочитанный исходный код local result, reason = load(data) if result then result, reason = xpcall(result, debug.traceback) if result then -- Усе в порядке, файл выполнен else -- Ошибка при выполнении загруженного скрипта end else -- Ошибка при загрузке текстовых данных в качестве кода end
  8. @SkinnerDE, пардон, я на ходу писал, myImage можно в расчет не брать. Главное принцип, дыа. MyImage в данном случае - это ссылка на объект изображения, передаваемая в обработчик событий для удобства, называть переменные можно как угодно. Для ясности код приведу: local function myEventHandler(application, objectPointer, e1, e2, e3, ...) -- Ох уж эти события end -- Переменная object и objectPointer из обработчика событий - это один тот же объект object.eventHandler = myEventHandler Аналогичный функционал, кстати, можно запилить и средствами event.timer, однако так куда проще, да и отменять таймеры впоследствии не придется.
  9. @SkinnerDE, юзай eventHandler для пикчи: -- Загружаем все пикчи из папки в единую таблицу local path = "/Pictures/" local currentPicture = 1 local pictures = {} for file in filesystem.list(path) do table.insert(pictures, image.load(path .. file)) end -- Добавляем объект изображения в контейнер или куда-то еще local GUIImage = application:addChild(GUI.image(1, 1, pictures[currentPicture])) -- Как часто пикча будет меняться local interval = 5 -- Время, когда условие ниже сработает в следующий раз local deadline = computer.uptime() + interval -- Обработчик событий вызывается каждый пуллящийся ивент (даже если его не было при нулевом интервале) kartinka.eventHandler = function(application, myImage) if computer.uptime() > deadline then -- Отображаем следующую пикчу currentPicture = currentPicture + 1 if currentPicture > #pictures then currentPicture = 1 end GUIImage.image = pictures[currentPicture] application:draw() -- Обновляем время следующего срабатывания условия deadline = computer.uptime() + interval end end -- Обязательно с ноликом, чтоб ивенты пуллились с минимальным интервалом application:start(0)
  10. ECS

    Рыбалка #1 Оптимизация постройки

    @BrightYC, на некоторых серверах (и кк.ру в частности) в совокупности с модами Spice of Life и Pam's Harvestcraft рыбка дает нехилое пищевое разнообразие, без которого жизнь усложняется. Также некоторые магические и ролевые моды требуют рыбеху в качестве алхимических ингредиентов, а еще вокруг роботизированных ферм дропается экспа в малых количествах, что приятно. Но по факту да, картоха - мать всея жратвы.
  11. По этой теме уже существует отлаженный софт, успешно используемый многими игроками. Однако на днях я заметил забавную особенность местных видеокарт, позволяющую выставлять разрешение большее, нежели получаемое через gpu.maxResolution(). К примеру, если maxResolution для видеокарты третьего уровня вернет числа 160 и 50, то никто не мешает установить разрешение, скажем, в 20x158 пикселей. При этом при проверке валидности устанавливаемого разрешения соблюдается два правила: Результирующее разрешение по числу пикселей не должно превышать результат умножения чисел, возвращаемых maxResolution. То есть для T3 GPU не более 160 * 50 = 8000. Каждый параметр разрешения, будь то ширина или высота, не должен численно превышать значение возвращаемой ширины. То есть для T3 GPU не более 160. Не знаю, баг это или фича, однако подобное грех не использовать в своих целях. К примеру, старая версия программы при вертикально-удлиненном расположении мониторов позволяла выставить разрешение лишь в 30х50 (1500 пикселей в итоге), заполняя тем самым "черные полосы". В то же время обновленная софтина, учитывающая описанные выше особенности, выдает 69x114 (7866 пикселей), максимально приближаясь к предельной отметке в 8000: Согласитесь, лишние пиксели на дороге не валяются, и, думаю, кому-то будет интересно узнать про реализацию подобного софта. Прежде всего нам требуется определить точную пропорцию мультиблочного монитора: то, как относится его ширина к высоте. Взглянем на текстуру блока: она явно состоит из мелких "квадратиков" в количестве 16 штук, причем лицевая часть монитора имеет рамку толщиной в 2 "квадратика" с каждой стороны: Эти "квадратики" мы и будем использовать для расчета пропорции, так как они позволяют идеально точно получить размеры отображающей части монитора в игровом мире. А размеры "в квадратиках" можно посчитать по формуле: число_блоков_монитора * 16 - 4 Следовательно, пропорция монитора будет считается следующим образом: local gpu = component.gpu local screen = component.proxy(gpu.getScreen()) local blockCountByWidth, blockCountByHeight = component.screen.getAspectRatio() local proportion = (blockCountByWidth * 16 - 4) / (blockCountByHeight * 16 - 4) Также не забываем, что высота каждого псевдографического пикселя при отображении в 2 раза больше его ширины, поэтому формула пропорции слегка меняется. Заодно произведем некоторые сокращения, чтобы избавиться от лишних математических операций. Все три варианта эквивалентны: local proportion = 2 * (blockCountByWidth * 16 - 4) / (blockCountByHeight * 16 - 4) local proportion = (blockCountByWidth * 16 - 4) / (blockCountByHeight * 8 - 2) local proportion = (blockCountByWidth * 2 - 0.5) / (blockCountByHeight - 0.25) После вычисления пропорции монитора можно приступить к написанию программной логики. Для начала получим максимальное разрешение видеокарты: local maxWidth, maxHeight = gpu.maxResolution() Обладая этими данными, а также взглянув на условия, описанные в начале поста, мы можем составить систему неравенств для получения итогового идеального разрешения: Помним также, что ширину мы вполне можем выразить через высоту и пропорцию монитора: width = proportion * height Подставим этот вариант в систему: Оставим высоту в левой части неравенств: Подставляем имеющиеся переменные в каждое неравенство, рисуем числовую прямую и выбираем высоту, удовлетворяющую условиям неравенства для конкретного случая. Разумеется, в программировании никаких числовых прямых нет, зато есть любимые math.min() и math.max(): local height = math.min( maxWidth / proportion, maxWidth, math.sqrt(maxWidth * maxHeight / proportion) ) -- Выражаем ширину через пропорцию local width = height * proportion Все. Разумеется, полученные значения ширины и высоты нужно округлить в меньшую сторону, дабы не кормить видеокарту дробями. Заодно добавим поддержку масштабирования, чтобы выставлять половинное или, скажем, четвертичное от идеального разрешение. Сократив код, избавившись от лишних переменных, мы получаем следующее: local component = require("component") -- Получаем масштаб в качестве первого аргумента скрипта и корректируем его значение local scale = tonumber(select(1, ...) or 1) if not scale or scale > 1 then scale = 1 elseif scale < 0.1 then scale = 0.1 end local gpu = component.gpu local blockCountByWidth, blockCountByHeight = component.proxy(gpu.getScreen()).getAspectRatio() local maxWidth, maxHeight = gpu.maxResolution() local proportion = (blockCountByWidth * 2 - 0.5) / (blockCountByHeight - 0.25) local height = scale * math.min( maxWidth / proportion, maxWidth, math.sqrt(maxWidth * maxHeight / proportion) ) -- Выставляем полученное разрешение gpu.setResolution(math.floor(height * proportion), math.floor(height)) Надеюсь, это микро-знание кому-то было полезно. Лично я очень доволен, что могу наконец запилить графонистый интерфейс для контроля реакторов на вертикальных мониках без осваивания профессии "глиномес", да и соответствующая либа для автопобора разрешения в оське пригодится.
  12. Мяу, не надо каждый файл, надо одну единственную документацию. Если возникают вопросы или желания по реализации каких-то фич, то пиши в тему либы или мне в личку ВК. Если лень изучать конкретно эту либу или же она по каким-то причинам не устраивает, то есть аналоги, например, forms.
  13. ECS

    MineOS

    @MisterFunny01, 8х4 псевдо-пикселя
  14. @HeroBrine1st, /tmp/ - это монтированный путь виртуальной файловой системы tmpfs, жестко ограниченной по размеру в конфиге мода: # The size of the /tmp filesystem that each computer gets for free. If # set to a non-positive value the tmp file system will not be created. tmpSize=64 Записывай напрямую на загрузочный хард - и все будет шоколадно. А еще для предотвращения TLWY проще использовать computer.pullSignal(0), что гарантирует разовое прерывание, т.к. OS.sleep() иногда умудряется вызвать pullSignal дважды. А прога клевая, мяу
  15. Чтобы не изобретать велосипедов, проще всего будет хранить конфиг в виде луа-таблицы: { player = "MisterSosister", age = 1488 } Затем загружай его в проге и используй эти данные как угодно. Вчера же писал тебе в чат аналогичный вариант: local serialization = require("serialization") local event = require("event") local file = io.open("/config.txt", "r") local config = serialization.unserialize(file:read("*a")) file:close() while true do local eventData = {event.pull("touch")} if eventData[6] == config.name then --Ник валиден end end
×