Перейти к содержанию

Лидеры


Популярный контент

Показан контент с высокой репутацией за 20.03.2019 во всех областях

  1. 5 баллов
    Уважаемые форумчане и игроки проекта! Посовещавшись, администрация сайта пришла к выводу, что было бы неплохо и не лишним внести какие-то свежие весенние правки на сайте и в игровой процесс. Администрацией сайта был выработан план-капкан. Кодовое название операции "Весенний ветер" Сервер хоть и работает суперстабильно, но он устарел немного концептуально, и все построено и скрафчено, а сайт после осеннего обновления движка хоть и получился в целом достаточно функциональным, но немного визуально мрачноватый и даже слегка унылый. Ванильную светлую схему не рассматриваю. Не хватает какой-то привлекательности, не хватает игровой морды лица и живости, некоторые элементы сайта вообще выпадают из целостной картины и не вписываются в общую концепцию новой цветовой схемы и дизайна. Что видит пользователь, попав на главную страницу? Правильно. Он видит на так называемом "первом экране" название сайта в лого, огромную серо-черную портянку текста с непонятными зелеными и синими тайтлами и чат на полэкрана, в котором накопилось аж 10 сообщений за 1,5 месяца. Какие-то кнопки голосования и иконку глобуса, которая вообще не понятно что означает. То ли это кнопка интернета, а может быть это новости политики. Хотя это раздел писем и уведомлений. Почему там разработчик шаблона запихал не значок письма, или не колокольчик, а глобус, лично для меня до сих пор загадка. Но это еще мелочи. Бог с ним, с глобусом. Понять, что наш сайт в игровой форме обучает программированию, что на нашем проекте есть игровые сервера майнкрафт и опытные форумчане программисты, которые помогут легко влиться в игровой процесс и в изучение компьютерных модов и Lua и т.д., новому посетителю сайта очень сложно. Нет никаких четких заголовков о том, о чем вообще сайт. Нужно очень долго скроллить серую портянку текста вверх и вниз, чтобы понять(не знаю как кому, по крайней мере за себя говорю), что это вообще за херабра и что наш сайт делает и что на нем вообще находится и для чего он. В связи с этим в ближайшее время будут проведены следующие мероприятия: обновление движка до актуальной версии дизайн сайта будет изменен косметическая реструктуризация разделов форума и др. мелкие правки После выполнения вышеуказанных мероприятий администрация сайта приступит к развертыванию нового игрового сервера (о нем в отдельной теме) Оставляйте свои конструктивные предложения, референсы, ссылки на какие-то другие ресурсы, просьбы и т.п.. Проголосуйте в опросе, а также укажите в топике, что именно не нравится и что бесит, или если все хорошо и все нравится, тоже напишите. Что в данный момент сделано неудобно на сайте, что трудно найти, чего не хватает, может ссылок каких, картинок, разделов и т.д. и т.п. Например: "сделайте отдельную статическую Страницу-Шпаргалку Для Новичка, с подсказками, инфографикой, ссылками на полезные ресурсы и краткой информацией о том, что где и как скачать и изучать, как начать изучать моды и Луа, какая литература поможет, видеобзоры полезные может какие-то и т.п.. Кнопку ИГРАТЬ запихайте в значок какой-то на видное место в шапке, а ссылки на голосовалки никому не нужные поместите в футер" и в таком духе и т.п., главное, чтобы идеи были максимально конкретными и хоть как-то обоснованными и реально выполнимыми. Если темная схема окажется востребованной, тогда сделаем светлую и абсолютную копию в темном стиле. То есть сайт будет отличаться только цветом. Не будет как сейчас две разных верстки. Цель операции "Весенний ветер" - как-то немного освежить проект и сайт в частности, сделать его каким-то более удобным и приветливым и более игровым, что-то добавить новенькое, а также запустить новый сервер с какими-то новыми разнообразными фишками.
  2. 4 балла
    В этой печали сложно быть одиноким. В Интернете ничего не понявших большинство. Подавляющее. На этом форуме достаточно и тех, кто что-то понимает. И если верно задать вопрос, то кто-то из них даже согласится дать пояснения. Поэтому я сразу предлагаю перейти к основному вопросу: Что именно ты желаешь понять?
  3. 4 балла
    Пошли в личку вопросы о Recurrent Complex, что-то не работает, краш, так как не найдена либа и пр. Чтобы этот вопрос закрыть раз и навсегда по оформлению декором и данжами наших серверов, напишу микрогайд. В общем для работы нужно: ванильный майн сам мод последней версии для майна 1.7.10, https://minecraft.curseforge.com/projects/recurrent-complex , там же документация и вика библа IvToolkit-1.2.1.jar MineTweaker3-1.7.10-3.0.10B.jar для удобства получения форж имен блоков и айтемов желание, мышка и клава (всё это запихать в папку модс) /#export сохранить в файл структуру /#gen NewStructure ~ ~ генерировать структуру NewStructure /#confirm подтвердить генерацию/импорт /#edit NewStructure ~ ~ редактирование настроек структуры NewStructure /#import NewStructure импорт структуры для редактирования NewStructure /#fill minecraft:dirt заполнить выделенное землёй /#replace minecraft:air reccomplex:negativeSpace заменить блоки воздуха на кубики Для того чтобы мод не генерировал свои кастомные постройки измените в: ...\minecraft\config\reccomplex.cfg S:structureGenerationMatcher=!$reccomplex Команды МайнТвикер: /mt hand что у меня в руке? Копирует в буфер обмена. Папки, где находяться активные постройки и инвентари: ...minecraft\structures\active Предлагаю массово включится в работу и понастроить миллион домиков, разрушенных дотов, башенок, катакомб, вышек, может даже микро кусочки городских кварталов, подземных командных центров и прочих построек в качестве данжей и антуража. Если каждый заинтересованный форумчанин или игрок построит хотя бы по одной небольшой структурке и импортнет это в файлик и всё это мы запихнем потом в папку генератора, у нас вместо унылого ванильного ландшафта майнерского будет мир, наполненный некогда бурной человеческой деятельностью, но после ядерных ударов по всему миру будут по легенде валятся упавшие небоскребы и какие-то катакомбы и разрушенные города и поселки, а под землей масса тоннелей и комнаток повстанцев и очагов сопротивления с пышным лутом, компами и монстриками. Вот референсы, в каком стиле это рекомендуется выполнить. Только гигантизма не нужно. Пускай это будет отдельно стоящая башенка заросшая лианами, домик с оторванной крышей, кусочек автострады и тд. и тп. Предпочтение будет отдано реалистичным постройкам, а не машинкам с колесами из шерсти. Машинок НЕ нужно ни в коем случае бутафорских детских, как на дейзи серверах. Только каменно-бетонные объекты из ванила блоков. Важно!!!! Постройки, хоть сурфейсные хоть подземные, должны аккуратно вписываться в ландшафт, а для этого нужно использовать вспомогательные блоки реплейсеры (аир блоки из мода, негатив блоки, натурал флоры для подошвы сооружения и пр.) Постройка, которая сетит возле себя квадратный куб воздуха, хоть подземная хоть наземная, будет скорее всего проигнорирована и не включена в натурал-генератор мира сервера. Лучшие постройки попадут на страничку сервера в карусельку скринов и даже может самые четкие и интересные постройки попадут в слайдер. И будет автор потом любоваться своим творением. Ну и призы конечно всем активным участникам на новом сервере в виде реса, эпической брони и легендарного оружия, которое расщепляет все живое на атомы, и куча боеприпасов и робот будет выдан из мода ОС!
  4. 4 балла
    Добавил две новые реакции: Одобряю и Против. Зачем, возможно, спросите вы? А для того, что эти две реакции в большей мере отражают ваше отношение к суждениям других форумчан. Всякие радостные и грустные мордочки, сердечко - это чисто эмоции. Понравилась ли вам картинка, программка, анекдот и т.п. - можно поставить смайлик или сердечко. Ну и самое главное - больший спектр и больший выбор реакций и эмоций. А для более серьезных обсуждений требуются иные реакции. В профиле форумчанина накопилось много смешных реакций - ага, форумчанин юморист, например, а большое кол-во сердечек показывает качество контента. А вот если игрок на форуме активно участвует в холиварах, предлагает дельные или спорные идеи, получает реакции поддержки или наоборот, его предложениям и суждениям ставят реакцию против - это совсем другое. И это тоже должно отражаться в репутации. Например, хочет админ понерфить солярки в каком-то посте мимолетном, а тут бац, и миллион реакций против прилетело. И даже и голосовать не надо. Или какой-то игрок предлагает установить на сервер покемонов, например. Тоже можно эту реакцию заюзать. В данный момент это чисто визуальная реакция. Ее кол-во накапливается в профиле полученных реакций, но на уровень репутации пока не влияет. И у меня возник вопрос, нужно ли этой реакции сделать (-1) репутации? Проголосуйте, пожалуйста, в опросе.
  5. 4 балла
    Давным-давно делал модный файловый менеджер с графическим интерфейсом для опенкомпов. Переходы по папкам, запуск файлов, распаковака tarball'ов и просмотр картинок в одной программе, к тому же фичи в виде листания свайпами, экранной клавиатуры и горстки настроек. И все это добро занимало меньше килобайта. Но развивать идею не стал, код удалил и осталась только одна картинка тестовой версии. Недавно решил это дело возродить, без зависимостей и лишних свистоплясок. Для начала напишем функции, которые добавят дополнительные возможности для пользователя. Когда игрок тыкает в экран, создаются два события - touch и drop. Когда зажимает и тащит - touch, потом куча drag и в конце drop. Из имеющихся событий, можно развить дополнительные события - клик, двойной клик и свайп. Можно даже добавить сложные жесты, но пока не понятно, как они могут пригодиться. На все нужные события повесим слушателей и будем сохранять результат в переменную. Слушатель для события touch будет проверять, было ли предыдущее событие drop. Затем сравнит с временем от последнего клика, вычислит расстояние между точками, в которых произошло событие. При совпадении координат и заданным временем между кликами пошлет событие double_click. Для события drop надо проверить, было ли предыдущим touch и по тому же параметру скорости проверять время между событиями, чтобы не захватывать долгие нажатия. Если предыдущим событием было drag, то надо определить расстояние между началом и концом действия, вычислить угол и послать это все в виде события swipe. В итоге получится примерно такой код: local computer = require('computer') -- подгрузить обертку для uptime & pushSignal local event = require('event') -- подгрузить библиотеку событий local lastEvent = nil -- последнее действие local lastTouch = nil -- последнее касание local eventTime = nil -- время от последнего события local clickSpeed = 0.5 -- время, за которое совершается клик и дабл-клик event.listen('drag', function(...) lastEvent = {...} -- просто сохранить событие end) event.listen('touch', function(...) local e = {...} -- сохранить событие в таблицу if e[5] == 0 and lastEvent and lastEvent[1] == 'drop' then -- если нажата ЛКМ и предыдущее было drop if eventTime and computer.uptime()-eventTime < clickSpeed then -- если прошло меньше времени, чем задано if lastTouch and lastTouch[3]-e[3]+lastTouch[4]-e[4] == 0 then -- если координаты событий не отличаются computer.pushSignal('double_click', e[2], e[3], e[4], e[6]) -- послать дабл-клик с координатами end end lastTouch = e -- сохранить последнее касание end eventTime = computer.uptime() -- обновить таймштамп события lastEvent = e -- сохранить событие end) event.listen('drop', function(...) local e = {...} -- сохранить событие в таблицу if e[5] == 0 and lastEvent then -- если нажата ЛКМ if lastEvent[1] == 'touch' then -- если предыдущее событие было касанием if eventTime and computer.uptime()-eventTime < clickSpeed then -- если прошло меньше времени, чем задано computer.pushSignal('click', e[2], e[3], e[4], e[6]) -- послать клик с координатами end elseif lastEvent[1] == 'drag' then -- если предыдущее было тасканием local dx, dy = lastTouch[3]-e[3], lastTouch[4]-e[4] -- найти дельту до координат касания computer.pushSignal('swipe', e[2], dx, dy, math.floor(math.deg(math.atan(dx/dy))), e[6]) -- послать свайп с дельтой и углом end end eventTime = computer.uptime() -- обновить таймштамп события lastEvent = e -- сохранить событие end) Пока он ничего не делает, только создает события, когда будет готов функционал отрисовки и взаимодействия с файловой системой, добавим к этим слушателям управляющие функции.
  6. 3 балла
    На старой версии светлая тема была норм. Кнопки в шапке норм, но немного сливаются с фоном, можно было бы их оживить цветом. Или вообще стиль переделать. Блок чата вообще расползается, я долго не мог понять, как в него писать. Обе темы вырвиглазные, но светлая еще и кислотная. Все блоки слишком массивно смотрятся, на oc.cil.li визуально тоже самое, но выглядит аккуратней. Надо глядеть на другие игровые проекты, сделать такой дизайн, какой ожидают увидеть потенциальные игроки. А то сейчас человек попадает сюда, а тут какой-то потусторонний даркнет. Могу нарисовать картинку на шапку, вектор или пихель-стайл, но надо определится с палитрой, чтобы потом не переделывать. Или текстуры для контента, чтобы не платить $30 за новую тему, а проапгрейдить текущую.
  7. 3 балла
    Чтобы было куда кликать, надо на экране разметить места для иконок, еще и иконки нарисовать. Для иконок возьмем формат PPM, а конкретно, цветную бинарную версию P6. Формат ультра-примитивный, иконки можно будет без лишних заморочек рисовать в любом нормальном растровом редакторе, в опенкомпах, а при наличии нужного скрипта - прямо в консоли. Но в этом формате будем хранить иконки на диске. Внутри программы они будут преобразовываться в таблицу, хранящую цвет каждого пикселя. Например, создадим иконку, которая будет рисоваться для всех типов файлов по умолчанию. (Будет отображаться, если подходящая иконка не загружена) local icons = {} -- создать массив с иконками local icons.unknown = {x = 10} -- создать таблицу для иконки, указать ширину в пикселях for i = 1, 100 do -- цикл заполнения таблицы 10x10 if i%3 == 0 then -- если номер пикселя делится на 3 icons.unknown[i] = 3394611 -- сделать пиксель зеленым else -- иначе icons.unknown[i] = 3355443 -- сделать серым end end С внутренним представлением определились, теперь напишем функцию отрисовки. Создадим счетчики для индексов, горизонтальной и вертикальной координаты. Запустим цикл, с условием: пока индекс меньше или равен (количество пикселей - ширина изображения). Установим для символа цвет текущего пикселя, а для фона получим пиксель через текущий индекс + ширина изображения. И выведем полученные пиксели одним символом u+2580. Если счетчик по горизонтали досчитал до ширины изображения - сбросить в начало, к счетчику по вертикали добавить 1, а к индексу прибавить ширину. Получим пропуск строки, т. к. она уже была отрисована в текущей итерации. local function draw_icon(name, X, Y) -- получить название и координаты if not icons[name] then return false end -- прервать, если нет такой иконки local x, y, index = 1, 1, 1 -- создать счетчики while index <= #icons[name]-icons[name].x do -- пройти по индексам gpu.setForeground(icons[name][index]) -- установить цвет верхнего пикселя gpu.setBackground(icons[name][index+icons[name].x]) -- цвет нижнего gpu.set(x+X-1, y+Y-1, quad) -- вывести на экран if x == icons[name].x then -- если достигнута ширина изображения x, y, index = 1, y + 1, index + icons[name].x+1 -- обновить все счетчики else -- простая итерация x, index = x + 1, index + 1 -- обновить счетчик горизонтали и индекса end end end Одна иконка уже сгенерирована, чтобы вывести ее в углу экрана, вызовем ее по имени - draw_icon('unknown', 1, 1) В итоге, на экране получим такое изображение: Чтобы загрузить иконки и конвертировать в удобный вид, создадим такую функцию: Перебрать все файлы в папке, получив их список через filesystem API. Прочитать файл построчно в таблицу, попутно удалив строки с комментариями. Если заголовок файла равен , получить ширину картинки, информацию о пикселях объединить в одну строку. В цикле пройти по пикселям, конвертируя бинарное значение пикселя в число. Тут надо помнить, что значение одного пикселя хранится в трех символах (по одному на канал), поэтому цикл будет скакать через 3. Первый символ конвертируем в число, умножаем на 65536, второй на 256 и складываем. Полученное число добавляем в массив пикселей текущей иконки. Получаем примерно такую реализацию: local function load_icons(path) -- получить путь к папке с иконками local multiplier, path = {65536, 256, 1}, path or '' -- создать таблицу множителей for name in fs.list(path) do -- получить имя файла в папке local file = io.open(path..name, 'r') -- открыть файл if not file then break end -- если файла нет, прервать цикл name = name:gsub('%..+', '') -- обрезать название файла до первой точки local raw_img = {} -- создать массив для сырых данных for line in file:lines() do -- в цикле пройти по строкам if line and line:sub(1,1) ~= '#' then -- если строка не закоментированна table.insert(raw_img, line) -- добавить в таблицу end end file:close() -- закрыть файл if raw_img[1] == 'P6' then -- если заголовок совпадает local _ = raw_img[2]:find(' ') -- проверить наличие пробела на второй строке if _ then -- если размеры на одной строке _, raw_img[2] = raw_img[2]:sub(_+1), raw_img[2]:sub(1,_-1) -- разделить table.insert(raw_img, 3, _) -- перенести высоту на другую строку end raw_img[2] = tonumber(raw_img[2]) -- преобразовать ширину изображения в число icons[name] = {x = raw_img[2]} -- создать пустую таблицу для пикселей local current = '' -- создать переменную с сырой информацией о пикселях for i = 5, #raw_img do -- пройти до конца файла current = current..raw_img[i]..'\n' -- объединить данные в одну строку end local color, n for i = 1, #current-1, 3 do -- пройти по каждому третьему символу, исключая последний перевод строки n, color = 1, 0 -- сбросить счетчик для таблицы множителей и цвет for j = i, i+2 do -- перебрать три символа color = color+current:sub(j,j):byte()*multiplier[n] -- преобразовать символ в число и добавить к значению цвета n = n + 1 -- обновить счетчик end table.insert(icons[name], color) -- добавить цвет пикселя к остальным end end end end Реализация очень примитивная, но главное, что иконки будут загружаться. Можно было бы сотворить свой формат, который быстрей распаковывается и занимает меньше места, но плодить сущностей очень вредно. Для проверки, осталось нарисовать иконки, сложить их в папку /home/icons/, например. И запустить весь код: local fs = require('filesystem') local gpu = require('component').gpu local quad = require('unicode').char(0x2580) local icons = {unknown = {x = 10}} for i = 1, 100 do if i%3 == 0 then icons.unknown[i] = 3394611 else icons.unknown[i] = 3355443 end end local function load_icons(path) local multiplier, path = {65536, 256, 1}, path or '' for name in fs.list(path) do local file = io.open(path..name, 'r') if not file then break end name = name:gsub('%..+', '') local raw_img = {} for line in file:lines() do if line and line:sub(1,1) ~= '#' then table.insert(raw_img, line) end end file:close() if raw_img[1] == 'P6' then local _ = raw_img[2]:find(' ') if _ then _, raw_img[2] = raw_img[2]:sub(_+1), raw_img[2]:sub(1,_-1) table.insert(raw_img, 3, _) end raw_img[2] = tonumber(raw_img[2]) icons[name] = {x = raw_img[2]} local current = '' for i = 5, #raw_img do current = current..raw_img[i]..'\n' end local n, color for i = 1, #current-1, 3 do n, color = 1, 0 for j = i, i+2 do color = color+current:sub(j,j):byte()*multiplier[n] n = n+1 end table.insert(icons[name], color) end end end end local function draw_icon(name, X, Y) if not icons[name] then return false end local x, y, index = 1, 1, 1 while index <= #icons[name]-icons[name].x do gpu.setForeground(icons[name][index]) gpu.setBackground(icons[name][index+icons[name].x]) gpu.set(x+X-1, y+Y-1, quad) if x == icons[name].x then x, y, index = 1, y + 1, index + icons[name].x+1 else x, index = x + 1, index + 1 end end end load_icons('/home/icons/') local n = 1 for name in pairs(icons) do draw_icon(name, (n*11)-10, 1) n = n + 1 end Получаем:
  8. 2 балла
    Я очень обожаю дронов из OC, довольно быстрые и манёвренные(и дешёвые!). Меня смущает насколько автофермы из разных модов дорогие, так что вот решение этой проблемы: https://pastebin.com/9TBqRHPw (Для ленивых и счастливых обладателей интернет-карты: pastebin get 9TBqRHPw dronefarm.lua) (Проверьте, работает ли у вас сбор культуры на ПКМ, иначе же работать не будет(Версия на ЛКМ была, но она неудобная)) В программе всего 4 настройки: Размер фермы по X и Z Ожидание в секундах(Это нужно для того, чтобы культура успела вырасти) Ожидание при зарядке(Если дрон разрядился во время полёта) Процент заряда, при котором дрон вернётся домой Конфигурация дрона совсем простая, нужен лишь инвентарь(Можно и два инвентаря, так будет лучше). Установка довольно простая: Скачиваем ферму Делаем чистый EEPROM Вставляем в комплюхтер Пишем flash -q dronefarm.lua dronefarm(Не обязательно dronefarm, можно что угодно написать) Вставляем в дрона ??? Профит! Расстановка фермы: Где жёлтый - граница фермы Красный - место стоянки Длина и ширина может быть любой, главное чтобы зарядки хватило(Если у дрона переполниться инвентарь или разрядиться до 20% от общей зарядки единиц - он вернётся на базу)
  9. 2 балла
    Добавил в наш лончер специальный строительный клиент. Никакого геморроя по поиску модов, созданий сборок уже не нужно. Всё настроено(конфиги модов, звук, респак, мир, язык и пр.). Запускаем клиентик, выбираем пресет мира, и мы попадаем в мир для строительства. Модсы: миникарта NEI-шка Recurrent Complex worldedit + вижуал cell MineTweaker3 waila Положил в папочку /save level.dat файлик с настроенным миром и рулесами (спавн 0,5,0, плоский, время полдень, ничего не горит, время стопнуто, нет мобсов, чит-режим, креатив, в руках топорик и жезл для строительства и т.п.) Теперь спокойно можно взять чашечку кофе, печеньки, открыть мир, и построить в воздухе данжик какой-то, заменить воздух в выделенном объекте, там где пространство должно быть заполнено породой земли, специальными негативСпейсами, и сохранить объект в папочку и отправить администраторам. И ваш данжик уже после административной проверки, настройки генерации и наполнения лутом будет генерироваться на сервере. Администрация в целях безопасности и совместимости уже сама по усмотрению и при необходимости присланные ванильные постройки будет дополнять и украшать блоками из модов, такими как чизель, карпентер и др., а также при необходимости будет добавлять блоки, машины, ПК и конструкции из модов в качестве лута и антуража.
  10. 2 балла
    Не сразу я увидел это красочное добавление в пост: Ещё похуже? Напомнило древний мем:
  11. 2 балла
    Нашёл: $ grep -lir TopCraft ./updates/EvilWorld/config ./updates/EvilWorld/config/CustomMainMenu/mainmenu.json Да, там этим ссылкам лучшее место. Думаю, будет полезно добавить к ним ссылки на магазин и личный кабинет.
  12. 2 балла
    Ну незнаю насчет голосовалок. Если будут дальше использоваться UU или какая там валюта идет, то сразу возникнут вопросы, а где собственно голосовать. Так как лаунчер сразу закрывается после запуска игры, тогда да, в нем не надо голосовалок, а вот в менюшке майна можно добавить. Просто как показывает статистика (моя личная игры на разных серверах), зачастую после регистрации и загрузки лаунчера на сам сайт больше никто не заглядывает, и чтобы не объяснять "где взять UU" (зайди на сайт бла бла бла, тыкни туды, потом туды, потом туды...) проще сказать выйди в меню и проголосуй. А в лаунчере да, тогда не нужны кнопочки. пусть будет чистым.
  13. 2 балла
    а вот с лампами не всё так однозначно на Атомике Дело в том, что там свет можно получить только тогда, когда у тебя есть спички и факелы, которые горят только некоторое время, или если у тебя есть электрический источник энергии и соответствующие лампы, которые его потребляют. Больше на Атомике ничего, подчеркиваю, НИЧЕГО не является источником света. Нет там имба читерных ламп декоративных, нет там никаких глоустонЛамп и редстончикЛамп, лава светит в радиусе на один блок еле-еле, и все в таком духе. Атомик очень тщательно закастомизирован настолько, начиная от дня, ночи, погоды, света, неба, мобов, амуниции, еды, оружия и атмосферы в целом, что боюсь ты даже не сразу поймешь, что играешь в майн Может это, конечно, немного и преувеличении, но халявного освещения там нет, если конечно не считать безобидного мягкого небольшого света от мониторов ПК или панелей айтемИнтереакта АЕ и типа того. Идешь ты по тоннелю, радостно вешаешь факелы, копаешь, потом оборачиваешься назад, а там тьма приближается и факелы гаснут постепенно, и из тьмы на тебя выскакивают зомбачи-шахтеры в касках с битами или еще кое-что похуже.
  14. 2 балла
    военные объекты нужны:) Вот видео, если тебе это поможет. Первое про генерацию объектов, второе про лут. если что-то не понятно там будет, смотри офиц. документацию по моду. Только тут парень какой-то домик с лошадкой построил детский, а нам нужны катакомбы, склады подземные и командные центры. Что-то типа как в ванильном майне крепости в верхнем мире с эндер-порталами. Только нам не крепости нужны, а какие-то пункты управления. Понял?
  15. 2 балла
    Считаю, что возможность минусовать репутацию будет в целом вредной. Во-первых, боязнь потерять репутацию на отвергнутом предложении снизит количество любых возможных предложений, среди которых гипотетически могут оказаться и достойные внимания. А яростных же холиварщиков снижение репутации обычно не останавливает. Во-вторых, сильно дорожащие репутацией, обычно болезненно воспринимают её снижение, что подталкивает их к продавливанию своей позиции уже не ради исходной цели, а в надежде на восстановление репутации. Которая, в результате этого с большой вероятностью снизится ещё сильнее, но бессмысленный холивар может уже разгореться. Можно, наверное, на случай каких-то очень неприятных ситуаций дать форумчанам возможность смайликом выражать своё глубочайшее φ. Но даже в этом случае я считаю, что репутацию минусовать не стоит, чтобы не строить культ вокруг этих циферок.
  16. 2 балла
    удален оптифайн (графические багульки) п.с. когда будет настроена опциональность в лончере по выбору клиентских модов, возможно его и вернем. Кто хочет играть с багами, сможет этот оптифайн включить лично себе.
  17. 2 балла
    Об этом ещё Витя пел:
  18. 2 балла
    Чтобы отобразить иконки файлов и папок, а затем использовать их как кнопки, нужно разработать удобную в управлении структуру данных. При помощи filesystem API можно получить контент текущей директории, что с этим делать? Для начала разметим экран. В верхней части, на всю ширину экрана будет что-то вроде статус-бара высотой в 4 строки, там будет состояние памяти, батареи, может быть адресная и поисковая строка. Иконки 10x5 символов, с именем снизу, будут располагаться по сетке, через 1 символ. Загруженные иконки уже хранятся в таблице, осталось назначить их файлам и нарисовать. При загрузке программы надобно рассчитать, сколько иконок войдет по горизонтали и вертикали, создать таблицу для хранения сетки. Иконка начинает рисоваться от левого верхнего угла, поэтому в таблицу будем заносить именно эти начальные координаты. Обзовем таблицу, например, grid. В этой же таблице сделаем буфер для хранения имен иконок, чтобы при переходе из папки в папку не рисовать иконки, которые уже есть. Кстати, все содержимое может не влезть на экран, поэтому будем его разбивать на страницы. Для этого создадим таблицу pages и при сканировании директории будем добавлять в нее таблицы с содержимым страницы, если количество файлов больше размерности #grid. Сами страницы будут с такими же индексами, что и grid, по индексам будут хранится: имя файла или папки, назначенная иконка и флаг, директория это или нет. Приступим к описанию функции обновления информации о содержимом. Для начала обнулим страницы. Получим текущую директорию при помощи filesystem.realPath(os.getenv('PWD')) или shell.getWorkingDirectory(). Для того, чтобы в результате получить привычный вид, надо будет отсортировать файлы отдельно от папок по алфавиту. Для этого создадим две временные таблицы, просканируем директорию через filesystem.list(), если имя оканчивается символом '/', то кидаем его к папкам, иначе к файлам, затем сортируем обе таблицы обычным table.sort(). Добавляем имена папок к именам файлов в том же порядке, но в начало таблицы и начинаем обработку результата. Обходим таблицу с именами файлов, если это папка, то назначаем иконку 'folder', если это ссылка, то 'link', во всех остальных случаях получаем расширение файла паттерном ([^%.]+)$ и пробуем назначить иконку с таким же названием. Как-то лень было изучить работу lua-patterns, по идее он должен захватывать одно и больше вхождений, но захватывает от нуля, поэтому файлы с именем расширения, получают иконки. Если расширения нет, назначается иконка 'unknown'. Далее, в таблицу pages записываем имя файлв, имя иконки и флаг. Потом обновляем индекс, по условию индекс == размерность сетки сбрасываем индекс и обновляем счетчик страниц. local W, H = gpu.getResolution() -- получить разрешение экрана local grid, pages = {buffer = {}}, {{}} -- создать таблицу для сетки и страниц local wm = math.floor(W/11) -- вычислить, сколько иконок войдет по горизонтали local index = 1 -- создать счетчик for Y = 1, math.floor((H*2-5)/14) do -- пройти цикл по вертикали for X = 1, wm do -- пройти цикл по горизонтали grid[index] = {x = X*11-9+(W-wm*11-1)/2, y = Y*7-2, z = Y*7+3} -- рассчитать и задать координаты для текущего индекса index = index + 1 end end local function update() pages = {{}} -- обнулить страницы local index, page, pwd = 1, 1, os.getenv('PWD') -- создать счетчики и получить текущую директорию local names, folders = {}, {} -- создать таблицы для имен if fs.realPath(pwd) ~= '' then -- если текущая директория не корневая folders[1] = '..' -- добавить папку для перехода на верхний уровень end for name in fs.list(fs.realPath(pwd)) do -- получить имена в текущей папке if name:sub(-1) == '/' then -- если в конце слэш table.insert(folders, name) -- добавить к папкам else -- иначе table.insert(names, name) -- к файлам end end table.sort(folders) -- отсортировать имена папок table.sort(names) -- отсортировать имена файлов for i = #folders, 1, -1 do -- в цикле объеденить имена в одну таблицу table.insert(names, 1, folders[i]) end folders = nil -- удалить таблицу для папок for n, name in pairs(names) do -- пройти по всем именам local icon, isDir -- создать переменные для имени иконки и флага if fs.isDirectory(pwd..'/'..name) then -- назначить иконку для папки icon, isDir = 'folder', true elseif fs.isLink(pwd..'/'..name) then -- назначить для ссылки icon = 'link' elseif icons[name:match('([^%.]+)$')] then -- если есть иконка для этого расширения icon = name:match('([^%.]+)$') -- назначить по имени else icon = 'unknown' -- для всех остальных назначить стандартную иконку end pages[page][index] = {name = name:gsub('/', ''), icon = icon, dir = isDir} -- записать имя, имя иконки и флаг в текущую страницу if index == #grid then -- если текущая страница заполнена index, page = 1, page + 1 -- обновить индекс и номер страницы pages[page] = {} -- создать страницу else index = index + 1 -- обновить индекс end end end Теперь надо отрисовать иконки по сетке. В цикле пройдем по индексам сетки, из координат получим индекс для буфера, для быстрого обращения. Если на текущей странице и с текущим индексом что-то есть, а в буфере по этим координатам другая иконка. Берем имя иконки и координаты сетки, вызываем функцию draw_icon(), записываем в буфер имя новой иконки. Сбрасываем цвета, стираем зону, где будет имя файла. Пишем имя файла, со смещением, чтобы оно было примерно по центру иконки. Не забывая обрезать имя до 10 символов. Если по текущему индексу на странице ничего нет, но в буфере осталось имя иконки. Стираем его из буфера. Устанавливаем фоновый цвет и заливаем иконку вместе с именем по текущему индексу пустотой. local function draw(page) page = page or 1 -- если страница не указана, назначить первую for index = 1, #grid do -- пройти по индексам сетки local hash = grid[index].x*W+grid[index].y -- получить хеш if pages[page][index] then -- если на странице по этому индексу есть запись if pages[page][index].icon ~= grid.buffer[hash] then -- если новая иконка отличается draw_icon(pages[page][index].icon, grid[index].x, grid[index].y) -- нарисовать иконку grid.buffer[hash] = pages[page][index].icon -- обновить буфер end local name = pages[page][index].name gpu.setBackground(0) -- задать фоновый цвет local color = 0xffffff -- задать цвет текста if pages[page][index].dir then -- если это папка color = 0xffff00 -- задать другой end gpu.setForeground(color) -- установить цвет gpu.fill(grid[index].x, grid[index].z, 10, 1, ' ') -- очистить место gpu.set(grid[index].x+5-#name:sub(1, 10)/2, grid[index].z, name:sub(1, 10)) -- написать имя else -- если страница кончилась if grid.buffer[hash] then -- если в буфере что-то есть grid.buffer[hash] = nil -- обновить буфер gpu.setBackground(0) -- задать фоновый цвет gpu.fill(grid[index].x, grid[index].y, 10, 6, ' ') -- очистить место end end end end Теперь можно добавить слушателей из части #0, очистить экран, вызвать update() и draw() По событию 'click' запускать следующую конструкцию: for index = 1, #grid do if grid[index].x <= e[3] and grid[index].x+10 >= e[3] and grid[index].y <= e[4] and grid[index].y+5 >= e[4] then if pages[1][index] then if pages[1][index].dir then shell.setWorkingDirectory(shell.getWorkingDirectory()..'/'..pages[1][index].name) update() draw() break end end end end Теперь можно ползать по диску.
  19. 2 балла
    нашел чей-то рес в аду, там где полегло много народу на оккупированном спавне. Бронзовый экскаватор и еще какой-то странный предмет под названием "еболтушка". Это чей рес?
  20. 2 балла
    сегодня там сделаем домик(шлюз). А тех двоих свинозомби жестоко накажем и подвергнем их страшным мучениям со всей админской ненавистью и креативной мощью.
  21. 2 балла
    @eu_tomat все будет там хорошо, не заморачивайся так) Все вопросы попадут туда куда надо, и ничего страшного, если вопрос попадет в смежную категорию. Он все равно никуда не денется. И там не будет миллион категорий, как ты думаешь. Там будет 5-7 категорий, типа железо, апи, луа, пАмагите, и типа того. Не переживай, все будет хорошо. А по поводу тегов, сам знаешь, какая у нас жопка. Могут написать тег "Синий кит и мои мысли" как это делал Квертик, могут написать ООП на восьми языках и в разном регистре, могут вообще ради шутки создать тег Памагите найти ашиппку. Поэтому теги, это тоже такое себе. Можно, конечно, на форуме включить "Жесткую" систему тегов, то есть можно только из админ списка, который админ придумает на сайте, выбрать тег. Пользователь сможет только выбрать теги из предложенных. И еще можно в некоторых разделах требовать от пользователя выбрать, например, один тег минимум, иначе тему(вопрос) создать не получится. Так бы было правильно. Так облако тегов у нас на сайте крутилось бы осмысленное и модерируемое, новые теги по необходимости бы добавлялись в список доступных, а админы и модеры при необходимости бы эти теги корректировали у тем и вопросов. Тогда подписки и поиск по тегам был бы четкий и правильный, и гарантированный, ты бы четко знал, какой тег искать, и что у него нет братьев и сестер похожих по смыслу и написанию, но у нас сделано это через жопку пока. Но это не страшно. Не переживай, ничего страшного во вселенной не случится, если кто-то не туда запихает и не так назовет свой вопрос или тег. На худой конец у нас на сайте есть для этого админы и модеры, чтобы это поправить.
  22. 2 балла
    Администрация благодарит всех форумчан, кто проголосовал и принял участие в обсуждении. Темный вариант морды сайта закину в воскресенье. Темная тема и верстка тютелька в тютелька будет, только темной, светлая типа аппл, темная типа самсунг. На этом тема себя исчерпала. Рисунки и идеи для сайта и дальнейшего оформления контента, а именно доп. страниц сайта присылайте в ЛС(добавлю в конфу: Alex, Doob) Статические страницы нужно полностью переделать и оформить более современно как-то.
  23. 2 балла
    Для шапки был набросок. Там за компом стив сидел, сзади эндермен и зомби на слизне заглядывали через плечо, а рядом скелет сидел перед потухшим экраном. Как обычно где-то потерялся. Вот с другого ракурса сляпал.
  24. 2 балла
    Опечатка тут: gpu.setForeground(cf) аргумент приходит cF Вообще, при ошибке выводится название проблемной функции, а на скрине только аргумент. Но это тоже может помочь - рассмотреть или переписать строку, указанную в ошибке.
  25. 2 балла
    За полный сбор:
  26. 1 балл
    А чем не устраивает существующее решение?
  27. 1 балл
    У меня появилась идея сделать для этой ос маленькую копию стима, как вам такая идея?
  28. 1 балл
    Вот моя постройка подземной заброшенной базы РВСН: Тумбочка дневального Спальня И общий вид сверху. Вдохновлялся реальными заброшенными ракетными базами. На фото не попали пустые ракетные шахты.
  29. 1 балл
    любой лут можно напихивать. И любые блоки из модов. Версия ОC будет у нас скорее всего самая новая. Но мне не упакованные постройки нужны) Мне бы не этого хотелось ждать. Нужны макеты, или как это правильно выразиться, скелеты готовых объектов, из ванильных блоков, камня потресканного местами, кирпича, всё это заросло лианами и кустами и т.п. Начинку, сундуки, компы, люки и лестнички из модов пиханем уже в них позже, когда будет запущен клиент и сервер с смодами. Нужны просто типа скетчовые объекты. Так как например пирамида из джунглей майна. Эпическое сооружение, только ванила блоки, четко смотрится, не так как эти чизельные примитивные коробки из модпака, которые Боб показывал. А уже потом на сервере открываем эту пирамидку, например, в эдит режим, кидаем туда 5 сундуков с пресетами лута, пару компов, люки и двери из модов красивые ставим, настраиваем генератор и сохраняем, и запускаем вайп и генерацию мира. Вот что именно нужно на данном этапе.
  30. 1 балл
    Было бы здорово в некоторых бункерах запилить квесты/ловушки с опенкомпами, но для этого надо будет игрокам возле бункера включать режим приключения или делать спецприваты, иначе они тупо все перелопатят в поисках квестовых наград. И кстати, лут только ванильный или можно еще опенкомповский? Если да, то какой версии? Вообще не знал про этот мод, с ним можно наделать таких вундервафель в генерации, что MC 1.14 со своими структурами выглядит совсем невзрачно.
  31. 1 балл
    нет, не приносят. По крайней мере те крохи, которые мы там голосуем. Если проект на 1-2 странице, тогда может это что-то и дает. Когда-то администрацией мы анализировали переходы на наш сайт с топов, там какие-то тысячные процента. Но тем не менее, голосовалки дают игрокам возможность как-то забуститься в игре. Донат у нас пока толком не отлажен, чтобы хотя бы Сереге хост оплатить, а психология большинства игроков в онлайн играх не меняется со времен пунических войн - хочется всё и сразу в игре и хочется получить какое-то преимущество, топовый шмот или рес, танк, или меч и пр. и быть в игре нагибатором, или как-то облегчить нудный гринд и т.п. Поэтому пускай пока будут эти голосовалки. Может кому-то они и нужны. По крайней мере хуже они не делают. Хотя и ребенку понятно, что эти топы - это насквозь "коррумпированные" организации, где накрутками, легально и нелегально или за бабки можно выставить свой сайт в топ или на худой конец купить баннер на месяц на главную, вот тогда может и есть смысл от них.
  32. 1 балл
    По всяким голосовалкам вряд-ли кто-то кликает. Знаю пару лончеров, где в основном окне висят новости сервера, информация об ивентах, ссылки на последние активные темы форума. Очень удобно - запускаешь игру и сразу в курсе событий. Но этим контентом опять-таки кто-то должен заниматься, да и сервер у нас не на тыщу ролеплееров, можно и на форум сходить-посмотреть.
  33. 1 балл
    пользуясь случаем флудилки, хотел бы уточнить, хватит ли черноты поклонникам черных сайтов, мне просто нужно знать, от чего дальше отталкиваться и строить цветовую градацию блоков, тайлов, бордеров и пр.. На белом сайте у нас морда хедера и главный контейнер #fdfdfd, и от него уже с минимальными шагами оттенены смысловые блоки сайта. Вот и на черном нужно определиться, нужно ли немного засерить или наоборот, зачернить несущий контейнер. Насколько сайт должен быть черным? п.с. на задник не обращайте пока внимания, это просто пристрелочные эксперименты с 3D бэкграундом, т.к. с ним я пока не определился, какой будет бг на белом и на черном варианте.
  34. 1 балл
    Система предоставляет графическую оболочку для планшетов, имеющую минималистичный интерфейс и понятное только мне использование, а так же минимальное (надеюсь) потребление ОЗУ. Из фич оболочка дает: Возможность использования OpenOS частично без использования команд. Для особых случаев - используем контекстное меню -> "Выполнить команду" Возможность посылки уведомлений пользователю. Многозадачность не реализована, так что пассивную часть программы нужно активировать библиотекой thread из OpenOS Запуск программ-папок (*.pkg). Чисто для разграничения кода и возможности создания модулей Адаптивная отрисовка интерфейса. На экранах с разрешением по ширине, не кратной 20, могут возникать проблемы, однако без искусственного изменения разрешения такого не произойдет. Помощь в настройке при первом запуске. На случай проблем - на первом экране используется колёсико мыши. Блокировка экрана Горячие клавиши на главном экране (клик+delete - удалить, ctrl+e+клик - редактировать и подобное) QR-коды для быстрого доступа юзера к ссылкам В планах: Специальный фреймворк аля Zygote из андроида. Естественно абсолютно весь функционал переписывать не буду, однако основной останется. Этот фреймворк повлечет за собой полный рефакторинг кода (перевод системы на него), но полностью устранит все недостатки TabletOSNetwork - что бы было. Протокол сам в себе будет держать защиту от MITM (Сначала на DSA, потом переведу на ECDSA (реально сложно для меня пока)) и некоторую маршрутизацию с помощью специальных реле (что бы у юзеров планшеты не лагали). Установка - pastebin run 1xudmTa7 Выберите в установщике TabletOS и канал обновлений "Stable". В дальнейшем система будет уведомлять о обновлениях, при получении оного нужно будет зайти в настройки (контекстное меню в левом нижнем углу экрана) и там обновиться. В случае, когда при обновлении бросает ошибку - посмотрите изменения, там будут инструкции по ручному обновлению или переустановке системы. Если и это невозможно. переустановите систему. Данные должны сохраниться, а вот система - обновиться.
  35. 1 балл
    Выпустил 1.0.7 QR Codes: Фиксы: - Окно с прокруткой не закрывалось по клику Добавлено: - QR коды в всплывающих окнах. Если нажать по кликабельному слову (обычно так и пишется - "кликабельно"), появится QR код, который можно легко считать. (что-то список не могу сделать с готового текста) Пока я занят оптимизацией поиска простых чисел на RSA (а потом и на DSA (возможно ECDSA, там ключ меньше), он мне нужен для TabletOSNetwork - что-то наподобие внутриигрового интернета), обновления будут маленькими.
  36. 1 балл
    Как может быть понятно из названия, данный пакет программ предназначен для обмена файлами между двумя или более ОС-компьютерами с использованием сетевых плат. Вопрос передачи файлов по проводной или беспроводной сети уже несколько раз поднимался на страницах нашего форума, но предлагаемое решение обладает одной существенной особенностью. Оно не просто передает тот или иной файл, оно позволяет одному компьютеру (клиенту) обращаться к дисковому пространству другого компьютера (сервера) как к своему собственному. Покажу на примере. Для демонстрации нам понадобится два компьютера, связанных при помощи проводных или беспроводных модемов. На одном из них, который мы в дальнейшем будем именовать - сервер, установим программу ftp_serv pastebin get F7d8Ef0S ftp_serv.lua Программа требует два параметра: имя, под которым наш сервер будет виден в сети, и путь к папке, которую сервер предоставляет для удаленного доступа. Имя не должно содержать пробелов, а папка должна принадлежать файловой системе, с которой была произведена загрузка OpenOS. Второй параметр может отсутствовать, в этом случае доступ будет предоставлен ко всей файловой системе. Для нашего примера создадим папку shared, а в ней папки и файлы с произвольными данными. Запустим ftp-сервер с именем, например, alpha. ftp_serv alpha shared Теперь обратимся ко второму компьютеру. Его мы будем именовать - клиент. На клиенте установим клиентскую часть. pastebin get 0u58kX0K ftp.lua Если клиентскую часть запустить с ключом /scan, будет произведен поиск доступных ftp-серверов. ftp /scan При сканировании выводятся имена серверов, расстояния до них и id сетевой платы сервера. Для того, чтобы подключиться к серверу необходимо запустить программу ftp с указанием имени сервера ftp alpha После подключения мы должны обнаружить в корне файловой системы папку ftp, а в ней папку с именем сервера - alpha. Вот тут внимание! Эта папка и всё, что в ней находится не скопированы с сервера, а предоставлены сервером удаленно. Вы можете копировать сюда или отсюда файлы, удалять их или открывать на редактирование так, как если бы они находились на локальном жестком диске клиента. Однако существует ограничение: один клиент может открыть на сервере не более одного файла одновременно. При попытке открыть второй файл, первый будет закрыт автоматически. Это связано с тем, что если клиент отключится не закрыв открытый файл, то файл фактически останется открытым на сервере, а ОС-компьютер имеет ограничение на количество открытых файлов. Для того, что бы отключиться от ftp-сервера, можно воспользоваться стандартной утилитой umount. Выйдите в корень файловой системы и выполните команду umount ftp/alpha
  37. 1 балл
    Этот параметр нигде не используется. И, по-моему, никогда не использовался. Поиск по истории даёт только два коммита с maxClipboard. В коммите, в котором было введено ограничение на длину строки, использовалось значение 1024. А сейчас реализация вставки другая.
  38. 1 балл
    Прикольную тему делаешь, так держать! Собственно, о чем бишь я... Я не знаю какую ты прогу юзаешь, чтобы конвертить картинки в .ppm но решил запилить свою с блэкджеком и шлюхами, от нечего делать =) Собственно ссылки на сам конвертор (написан на Kotlin) и на мой гитлаб с исходниками: Сам конвертор. Исходники P.S Если возникнут какие-то проблемы с прогой, то поймай меня в ирц или тут на форуме напиши в личку. =)
  39. 1 балл
    Залил крупное обновление. Одно из изменений, которое может сломать ваши программы: В функции textEncrypt требуется не сама соль, а длина ее. По умолчанию 4, как и у функции textDecrypt, т.е. от второго аргумента смело избавляйтесь Но вроде-бы если сунуть туда вместо длины саму соль, оно длину соли посчитает и сунет за длину, так что программы должны работать нормально. Сменил тяжелый тест простоты Ферма на +- быстрый алгоритм Тест Миллера — Рабина. Даже если оптимизации не добавило (субьективно добавило), этот алгоритм используется в настоящей криптографии, а значит переход сделан точно не зря). Для дешифровки и подписи используется китайская теорема об остатках. Это повышает скорость в 4 раза. (В 8 раз, на самом деле, но возведение в степень по модулю дорого обходится:C) Так же 128-битный (например) ключ будет реально 128-битным. Ранее генерировалось 2 числа по 128 бит, итого ключ 256 бит, сейчас делю на 2 длину и получаются ключи в 128 бит. По этой причине минимальный размер ключа теперь 32 бита. Если у вас ключ 16-ти битный, не беспокойтесь: из-за бага он был 32-битным , лучше беспокойтесь о безопасности)) Сейчас обновлю документацию, но особых изменений в методах нет.
  40. 1 балл
    пускай там будут они) Это неотъемлемая часть этого программного продукта, которая придает ему неповторимые черты, а так же повышает стабильность работы всей системы и приложений в целом.
  41. 1 балл
    Значит, я не понял, что означала компактизация. Тогда мой голос склоняется к "за".
  42. 1 балл
    И как ссылки и как спойлеры! Желательно с выбором. Например мне не надо видеть портянку в 3к строк кода какого нибудь дубокопа (@Doob это был только пример). Мне проще увидеть команду на установку и все. Если вдруг потребуется посмотреть код я пожалуй его скачаю и посмотрю в нормальном редакторе а не на пастебине. Но это лично моё мнение
  43. 1 балл
  44. 1 балл
    @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
  45. 1 балл
    Сомнение в том, что __index вызывается только при отсутствии элемента в таблице.
  46. 1 балл
    io.lines хочет путь к файлу, а в коде даётся сразу хендл на него. Вот и ругается. for line in io.lines("f.txt") do print(line) end
  47. 1 балл
    Текстурпаки, музыка .... вы о чем народ! Очнитесь! Текстурпак каждый ставит на свой вкус ляд и производительность своего калькулятора. Я лично вообще ни одного текстурпака не ставил, так как и так не тянет. Нужно просто решить какие моды новые поставить, что оставить, что убрать, высказать идеи, историю мира, как то захватить игроков, чтобы им было интересно поиграть. Насчет приватов, я тут щас завис на одном проекте, где вообще вайпов нету, там реализована система регенирации мира с обходом приватов. Я хз как это реализовано, но это работает уже много лет. Если кто то забрасывает игру, то через n-ное время во время регена его приват удаляется и регенится в соответствии со всеми правилами. Конечно в этом случае есть опасность, что придет добрый Вася с командой роботов и за ночь выкопает котлован вокруг привата не понравившегося ему соседа, но это уже другой вопрос. Итак мое предложение по модам: ОС и все аддоны которые к нему есть (кое какие надо уже обновить) ИС2 заменить на Механизм (идея та же но функционал различный, + есть частичная интеграция с ОС) Магию убрать (интеграция с ОС никакущая и если честно то если ставится магия, то с технологией она как то не очень вяжется) Развитие обязательно через тинкерс (классный мод частичная интеграция с ОС) Раилкрафт (можно использовать из него чанклодеры личные, да и железку протянуть иногда возникает желание у всех) Еще можно было бы какие нибудь моды на оружие, турельки, пушечки Мод на агрессивных мобов. Новых мобов, не ванильных. По миру: Постапокалипсис. Мир серый и унылый, изредка встречаться будут леса, полянки, можно добавить какие нибудь структуры, острова которые можно разбирать и "сдавать на металлолом" в магазин. Время от времени на игроков обрушиваются какие то не очень приятные эффекты (радиоактивный ветер, комары гигантские, атака диких кобанов и т.д). Соответственно на спавне некий магазинчик, где можно затариться всем необходимым. Ах да, команда /afk или что то похожее, чтобы пока игрок под её действием его не донимали отрицательные эффекты, атаки и прочее (например когда ты сидишь с роботами которые копают ресы ~2 часов чтобы на тебя никто не агрился, ведь мало кто эти 2 часа сидит у компа и постоянно мониторит текущее состояние дел) это можно будет докупать в магазине. Но это лично мое предположение по новому серверу. Можно как то его еще обыграть, но я лично такой вариант вижу. Просто поймите, админы тоже люди, и генерировать идеи они не могут вечно. Так что давайте им поможем, выскажем свои варианты чего вы хотите видеть, сделаем хоть какие то наброски, а потом админы выберут самое интересное и реализуют. А лучше всего предложат на голосование несколько типов сборок и выберем то что понравится.
  48. 1 балл
    Ну что ж. Буквально на днях майнось наконец релизнулась в виде полностью самостоятельной и независимой от OpenOS операционки с собственным набором библиотек и вики. Все родное, отечественное (звучит как диагноз). Большинство методов библиотек по типу filesystem или keyboard крайне схожи с таковыми в опеноси по поведению, так что особых проблем с переходом возникать не должно. Также существенно снизился расход оперативной памяти - примерно на 7% от 4 планок 3 уровня. Осталось, конечно, регулярно выискивать мелкие недочеты и допиливать их, а также более подробно наполнять инфу на вики, но в целом результатом я доволен. Среди ключевых нововведений стоит отметить следующие: Полностью переписанный инсталлер, запускающийся даже с EEPROM, имеющий возможность выбора тома для установки и его форматирования, а также систему конфигурации пользовательского профиля. Добавлено несколько системных языков, а заодно возможность установки лишь выбранного языкового пакета вместо всех сразу для экономии места на диске: Полная двойная буферизация графики, все приложения переписаны под библиотеку GUI. Кстати, местный картинко-редактор заимел оконный режим, а также Ёлочка @Totoro стала отлично работать в фоне и украшать хату (в моем случае - жалкий клочок земли в воздухе): Крайне полезный режим Internet Recovery, позволяющий мгновенно переустановить систему напрямую из EEPROM в случае возникновения каких-либо проблем: Возможность заливки файлов напрямую на Pastebin буквально парой кликов: Фича создания ассоциаций расширений файлов с возможностью назначения приложения для открытия того или иного расширения:
  49. 1 балл
    По этой теме уже существует отлаженный софт, успешно используемый многими игроками. Однако на днях я заметил забавную особенность местных видеокарт, позволяющую выставлять разрешение большее, нежели получаемое через 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)) Надеюсь, это микро-знание кому-то было полезно. Лично я очень доволен, что могу наконец запилить графонистый интерфейс для контроля реакторов на вертикальных мониках без осваивания профессии "глиномес", да и соответствующая либа для автопобора разрешения в оське пригодится.
  50. 1 балл
    Команда для установки: pastebin run z7S75BBP Чтобы запустить программу после того, как инсталлер загрузит все необходимые компоненты, используйте ​/MineCode/MineCode.lua или /MineCode/MineCode.lua open <путь к файлу> О программе: Честно говоря, первый раз увидев дефолтный редактор опенкомпов, у меня задергался левый глаз. Поэтому, недолго думая, мы с товарищами решили написать полноценную среду разработки, заточенную под удобство использования и максимальное быстродействие. Итак, первое и самое главное на мой взгляд - это подсветка Lua-синтаксиса. Теперь кодер может хотя бы визуально отличать одну часть кода от другой без напряжения зрения. Все цвета являются настраиваемыми, их можно изменять под локальный "вкус и цвет" пользователя. Имеется возможность отключения подсветки при помощи кнопки "◌" если вы играете на низкопроизводительном сервере. Второе в моем субъективном списке "полезности" - это запуск приложений в реальном времени, не отрываясь от процесса их написания. Просто нажимаете на кнопку "▷" и получаете результат: Третья полезность среды разработки - это автоматическое дополнение вводимой информации по аналогии с технологией IntelliSense. Кроме того, все вводимые скобки и кавычки будут также автоматически дополняться их "закрывающими" эквивалентами, с удалением это также работает. Для экономии памяти и увеличения производительности обе фичи можно отключить: При возникновении любой ошибки в вашем приложении MineCode IDE автоматически вернет вас к разработке, выдав подробный стек ошибки и подсветив ошибочную строку: Четвертая наиболее полезная функция - это отладчик. Он позволяет вам выставлять так называемые "брейкпоинты" путем нажатия на кнопку "*" и узнавать, какое значение принимает та или иная переменная в исполняемом скрипте. После каждого "брейкпоинта" выполнение программы может быть продолжено или приостановлено: Пятая фича программы - это возможность полноценного выделения и копипастинга, которого так не хватает в стандартном редакторе OpenOS: Выделенные участки кода можно комментировать, табулировать и детабулировать - все как во "взрослых" редакторах кода. Чтобы выделить слово, достаточно кликнуть по нему дважды. Также имеется удобный инструмент для работы с вводимым цветом в шестнадцатеричном формате. Выделяете его - выбираете соответствующую опцию контекстного меню и получаете результат: Разумеется, мы также реализовали виджет поиска по коду с возможностью переключения чувствительности к регистру: Среди прочих функций стоит отметить удобное древо навигации по файловой системе, возможность загрузки файла из интернета, возможность смены цвета и стиля курсора, возможность отключения всех панелей инструментов, возможность быстрой навигации по различным критериям, возможности изменения разрешения экрана, наличие всевозможных клавиатурных шорткатов и ссылок на них в соответствующих пунктах меню. Также отдельно хотелось бы отметить всех людей, так или иначе принимавших участие в разработке и отладке программы: Вся программа целиком и полностью работает на интерфейсной библиотеке GUI и библиотеке тройной буферизации. Исходный код доступен на GitHub: Библиотека DoubleBuffering Библиотека GUI Библиотека Windows MineCode IDE Напоследок скажу, что, разумеется, куда удобнее и практичнее редактировать большие файлы напрямую в предпочтительном для вас редакторе кода, однако при отсутствии возможности прямой заливки файлов на сервер и для экономии времени MineCode IDE становится незаменимым инструментом для разработки простого ПО.
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...