Fingercomp
Гуру-
Публикации
1 629 -
Зарегистрирован
-
Посещение
-
Победитель дней
283
Тип публикации
Блоги
Профили
Форум
Багтрекер
Магазин
Все публикации пользователя Fingercomp
-
ивент Unreal Tournament: Resurrection -- Этап #1
Fingercomp ответил в тему Totoro в Ивенты и конкурсы
Обновление от 2 января 2017 года (??? дней до старта) Описываю в этом обновлении все технические моменты, которые возникли у участников в процессе написания программ. Конфигурация роботов Процессор T3. Видеокарта T1. Монитор T1. Клавиатура. Беспроводная карта. 2 планки памяти T2. Цветастая карточка из Computronics. Lua BIOS. Дисковод. Жёсткий диск T2. Сундуковый апгрейд. Расположение роботов Настройка Роботов ставят, как на скрине выше, зовут участника, чтобы он настроил своих роботов. Разрешается проставить координаты позиции роботов. Координаты арены (как и сама арена, в общем) на турнире изменены не будут, поэтому смело можете их хардкодить. Обязательно нужно покрасить робота в цвет команды: 0x20afff — синяя команда; 0xafff20 — зелёная команда; 0xffff20 — жёлтая команда; 0xff2020 — красная команда. Красим вот так: local colors = require("component").colors local robot = require("component").robot colors.setColor(TEAM_COLOR) robot.setLightColor(TEAM_COLOR) TEAM_COLOR — собственно, одно из значений выше. Будет дан адрес сетевой карты сервера ещё. Это чтобы особо предприимчивые всякую хрень не творили. И, соответственно, порт. Правила игры За смену цвета робота во время игры следует дисквалификация игрока с турнира. Это нужно, чтобы зрители могли хоть как-то различать, чьи на арене роботы. Цвет полоски тоже не трогайте, хотя он и не так заметен будет. За разрушение блока робот (не игрок) дисквалифицируется. Ну тут всё очевидно. Собственно, это всё. Особенного чего-то нет, как видно. Сообщения сервера "time", remaining, total — посылается каждые эн секунд, так что в код вбивать не стоит. Говорит, сколько времени осталось до конца битвы и сколько вообще длится весь раунд. "gamestart" — посылается после старта игры, тут всё логично. "gamestop" — посылается после завершения игры (может завершиться досрочно админом или по таймеру) "setcoin", x, y, z — установлен сундук по данным абсолютным координатам. y будет равен уровню пола, так что не нужно что есть мочи долбиться вниз. "unsetcoin", x, y, z — сундук по данным координатам исчез, так что нечего там искать. На сервер можно ещё послать сообщение "getInfo", тогда вернётся вот такое: remaining, total, teams. Первые два значения — те же, что и у синхронизационного сообщения, а teams — это сериализованная таблица типа этой: {blue = {score = 10, name = "Fingercomp"}, green = {score = 1, name = "koresh"}, red = {score = 14, name = "Totoro"}, yellow = {score = 9, name = "Byte"}} Оргвопросы Дата и время начала пока точно неизвестны. Но это явно будет с вечера пятницы по воскресенье. Пока рассчитываем на 13-15 января. Место игры сообщим перед началом — сейчас эта информация бессмысленна. Софт Решено было забить на софт оставшийся, так как никто так и не вызвался помочь. Я лично в декабре был постоянно занят, а щас у меня будут другие проекты — тоже не до софта. Мотивации писать нет тоже. Буду рад, если кто-то до 5 января допишет оставшееся. Но полагаться на это уже некогда. Вся основная инфа будет на очках, в любом случае, так что паниковать не стоит.- 243 ответа
-
- 4
-
-
- Unreal Tournament
- oc
- (и ещё 2 )
-
ивент Unreal Tournament: Resurrection -- Этап #1
Fingercomp ответил в тему Totoro в Ивенты и конкурсы
Будет отдельный сервер/мир, где будет эта арена. У игроков будет инвентарь только с очечами на голове. Режим adventure. Участникам даются 4 робота, которые они настраивают. И начинается игра. Участвовать можно хоть с нуля.- 243 ответа
-
- Unreal Tournament
- oc
- (и ещё 2 )
-
ивент Unreal Tournament: Resurrection -- Этап #1
Fingercomp ответил в тему Totoro в Ивенты и конкурсы
В связи с тем, что @Totoro на каникулах новогодних будет занят немного отдыхом, а также тем, что софт оставшийся пилить никто не хочет, UT переносится на 2-3 недели вперёд. К участникам просьба как можно скорее сказать о готовности их программ.- 243 ответа
-
- Unreal Tournament
- oc
- (и ещё 2 )
-
АЕ мне можно/нужно, но без автокрафта, потому что не очень спортивно. ComputerCraft ты не отстабилизируешь, потому что это не персиснутая имплементация луа на жаве. И вообще нафиг это. Там мелкой прогой серверы кладутся. Соляры — пусть будут. Всё равно их не хватит :3 Форестри точно надо, только мультифермы в топку прежде, потому что тоже ни разу не спортивно.
-
Нужны аддоны к неи, т.к. не видны некоторые рецепты (например, с машинами из рейла).
-
Да, конечно, нужен CX везде С таким разнообразием модов даже обязателен. Кто-то хочет с рейлом заморачиваться - а без CX там вообще никак. Всячески рекомендую. А оптифайн - люди просят раз столь слёзно, можно бы бросить.
-
Оптифайн можно влепить, на самом деле. Не включать всякие оптимизаторки, только фиксить частично что-то. Тогда ничего не сломается.
-
А вот пчелей попрошу не трогать. Это очень нужные и важные существа, которые могут быть завербованы в телохранителей благодаря Computronics, как ни странно. Поэтому ставить надо.
-
Робот "пропускает" ходы во время движения
Fingercomp ответил в вопрос bob558 в Разные (отсортировать)
Эта функция сделает один или два шага вперёд, потому что не самое хорошее тело цикла. Зачем же там вызов-то? local function fwd() while not robot.forward() do os.sleep(.1) end end -
У автора OC, вообще-то, и в IRC канала раз в неделю увидеть можно на пару часов — потому что занят (очень) и нет мотивации. Мод выпускается без каких-либо гарантий. Так что не надо на него пенять. Но я апну какие-нибудь проблемы на гитхабе, чтобы не забыть. К слову, вроде же были пожертвования когда-то? Даже посты писались. Там не осталось денег? Upd. Спустя примерно час подыскивания самых что ни на есть вежливых выражений опубликовал мою слезливую просьбу сделать несчастный блэклист. Let's see what happens.
-
Network тебе не нужен только. От слова "совсем". Он вообще к чертям не работает толково. Пастбин в OpenOS встроен.
-
Это значит, что можно открыть любой другой диск; более того, — любую папку сервера.
-
Новая версия! Новое: Можно теперь отключать некоторые стороны адаптера с помощью ключа. Очень нужная фича, если требуется контроль в огромном лагодроме. От Vexatos. robot.compare умеет теперь сравнивать предметы, игнорируя метаданные. Например, сравнивать инструменты можно. Достаточно указать опцию. От Vexatos. Очень хорошая фича заключается в том, что теперь апгрейды табличек не игнорят приват просто, а посылают ивенты! От хорошего человека makkarpov. Можно указать белый список владельцев дебаг-карт. От makkarpov. В кубаче 1.8.9 и выше теперь взаимодействовать можно с инвентарями, имплементирующие интерфейс IItemHandler. Кастомные инвентари, то есть. От Vexatos. В кубаче 1.10 ещё можно менять теперь значения в scoreboard с помощью дебаг-карты. От RusselLong. В кубаче 1.10 вернулась интеграция с EnderIO и добавлена продвинутая поддержка проводочков редстоуновых из того же мода. [*]Изменения: Очень большое обновление OpenOS! От payonel, как ни странно. Перевод на русский усовершенствован был. От @Totoro. [*]Починено: Можно теперь всасывать полные текущие блоки жидкости. Функции обратной совместимости bit32.lrotate и bit32.rrotate тоже починены были (они очень некорректно работали при некоторых значениях). Это моё. Опции %c и %e для os.date() теперь возвращают более адекватные значения. От gamax92. Перед удалением дрона проверять, происходит ли это на сервере или на клиенте. От joserobjr. Теперь нельзя удалить файлы из devfs. От payonel. Апгрейд опыта не потребляет зачарованные предметы, если он уже наполнен опытом. Несовместимости со Sponge. От Vexatos. Именование ядер (какой-то фикс для LuaJ). От gamax92. Machine.signal теперь не настолько вредный по поводу типов списков. От Vexatos. NPE, наконец-то, который возникает, если какой-либо другой мод требует тултипы до загрузки рендерера шрифтов. os.time и os.date, как ни странно, зависели от часового пояса сервера. От gamax92. Теперь серверные стойки могут быть запитаны, если к ним подведён кабель, вне зависимости от подключения сервера. Очень прикольный баг был, когда кабель запитывал только компоненты, подключённые к этой стороне. Баг с чтением данных с проводов RedLogic. Патч от Vexatos. Теперь адреса файловых систем, хранящихся в NBT, проверяются. Раньше можно было выйти за пределы папки opencomputers выше по дереву. Очень весёлый баг, да. Фикс от gamax92. В кубаче 1.8.9 и выше только что поставленные сисблоки имели буфер энергии размером в 0 единиц. То есть, не имели совсем. В 1.6.1-hotfix.1: после апгрейда все стороны адаптеров в прежнем мире становились отключенными. Ссылки на скачивание.
-
Вот так нужно использовать, кстати, либу из OpenOS. local inet = require("internet") local function request(url) local result = "" for chunk in inet.request(url) do result = result .. chunk end return result end @Arseniy10, ты в случае с либой код не указал. Поэтому нет смысла умничать стараться. И вообще не хами тут. Окей? Мне не платят за то, что я тебе отвечаю, поэтому уважение проявляй хоть немного.
-
Давайте перепишем это безумие. local function request(url) return net.request(url).read() end local function write(path, value) local file = io.open(path, "w") file:write(value) file:flush() file:close() end if t.name == args[2] then write(t.path, request(rep_URL .. t.path)) end Отбрасывая в сторону вопрос о том, почему бы просто не использовать библиотеку OpenOS, теперь отвечаю. read() за раз возвращает не весь ответ. Только его часть. Поэтому-то у тебя и не качает полностью. Поэтому тебе нужно получать кусочки всего буфера сокета, пока не вернётся nil. То есть, так: local function request(url) local result = "" while true do local chunk = net.request(url).read() if not chunk then break end result = result .. chunk end return result end local function write(path, value) local file = io.open(path, "w") file:write(value) file:flush() file:close() end if t.name == args[2] then write(t.path, request(rep_URL .. t.path)) end Но, на самом деле, ты теперь рискуешь уйти в бесконечный цикл при обрыве соединения. Поэтому ты должен использовать библиотеку OpenOS.
-
То есть хочешь сделать так: if not condition then <уйти к чёрту отсюда> else <что-то сделать> end <код> Верно? Во-первых, никто не мешает сделать блок условия пустым. if not condition then else -- код -- end -- код -- Во-вторых, можно просто поставить not в условие. if condition then -- код -- end -- код --
-
ивент Unreal Tournament: Resurrection -- Этап #1
Fingercomp ответил в тему Totoro в Ивенты и конкурсы
Обновления от 14 декабря 2016 года. 23 дня до старта. Сервер Самая главная новость, которая давно протухла, правда, потому что я умею вовремя доставлять новости. Мы написали сервер. Протестили его. Работает абсолютно круто — есть телепорты, старт/стоп, таймеры, сундуки, сообщения и прочее. Код можно понять, прочитать, стандарты все на высшем уровне и т. д. Установка сервера Заходим в мир. Подходим к компу под ареной по центру. Ломаем его беспощадно. Наведя на блок, где стоял комп, прописываем /oc_sc. Включаем комп. Пишем install, устанавливаем. Пихаем в комп интернет-карту, беспроводной модем и дебаг-карту. Подключаем терминально-очковый мост через адаптер. Тыкаем очками по мосту и цепляем очечи на себя. Ребутаем. Пишем эти команды: $ pastebin run vf6upeAN $ wget https://raw.githubusercontent.com/ChenThread/oczip/master/unzip.lua /usr/bin/unzip.lua $ cd /home $ wget https://github.com/cc-ru/ut-server/archive/master.zip $ unzip master.zip $ hpm install -ly ./results/ut-server-master $ cp ./results/ut-server-master/ut-serv.conf /etc $ edit /etc/ut-serv.conf Находим в самом конце строку game.admins. Вместо стандартных значений вписываем свой ник, чтобы можно было стартануть игру потом. Сохраняем. Всё, установка завершена. Запускать так: $ ut-serv Чтобы начать игру, надо взять Wireless Keyboard из OpenPeripheral, кликнуть ими в воздух и потом нажать курсором прямо по кнопке внизу справа. Значения некоторые мы потом поменяем, конечно же, так что просто вбивать в проги нет смысла. Порт — 12345, он таким останется точно. Софт @ALeXeR, ты там случайно не умер с момента отправки последнего сообщения? Инвайт даже не принял, молчу уже про выгрузку прогресса. Мы-то ждали, надеялись, а время-то идёт. Я так понял, писать нам самим нужно будет (или вообще без панелей остаться). Если говорите, что поможете, — то, гм, помогайте. Вот @astral17, например, половину сервера (даже более) написал — точнее, самые скучные (для меня) вещи типа установки сундуков и прочего. Вот это реальный молодец, за слова ответил, и прочее. Причём он сам вытягивал из нас информацию о том, как пилить сервер, постоянно, то есть проектом интересовался действительно. Ну да ладно. Содержимое инфо-панелей и голограмм будет обсуждаться завтра во всем известном месте. Накидаем пару идей и начнём писать. Закончить с софтом нужно до следующей пятницы. Обязательно. Вроде кодеры на этой неделе будут: Тотора говорил, что будет свободен на выходных, вроде, я почти каждый день доступен. Так что попробуем чего-нибудь сделать. А потом нужно начать пилить роботов.- 243 ответа
-
- 2
-
-
- Unreal Tournament
- oc
- (и ещё 2 )
-
Тут полгода назад я описывал изменения в OpenOS 1.6 и среди прочего я упомянул какие-то окна в либе term. Пришло время описать всю либу term. Прежде всего, рассмотрим понятие окна. Окно — это таблица типа такой: {x = 1, y = 1, fullscreen = true, dx = 0, dy = 0, w = 0, h = 0, blink = true} По порядку. x, y — это позиция курсора. Ну тут всё предельно ясно. fullscreen — тоже достаточно очевидно. Находится ли окно в фулл-скрине или нет. dx, dy — это смещение окна отновительно левого верхнего края видеокарты. w, h — это всё ширина и высота окна. blink — опция, с помощью которой можно отрубить (и потом вернуть) мерцание курсора. Ещё одно понятие, которое нужно обязательно ввести, — это viewport (далее обзывать буду это как вьюпорт). Переводится как "окно просмотра", применительно к нашему контексту это слово означает пространство, в котором можно рисовать всякие символы. Вот есть монитор из OC. Какой у него вьюпорт? Вроде как очевидно, прямоугольник от левого верхнего символа с шириной и высотой, равный разрешению. Говоря проще, это то, что вы видите в интерфейсе монитора, когда по нему кликнете. Это было так до версии 1.6. В новой версии появилась функция setViewport, которая позволяет уменьшить видимую часть экрана, оставляя разрешение прежним. То есть, если вы на мониторе 3 уровня пропишете gpu.setViewport(80, 25), то всё, что было в пределах прямоугольника шириной в 80 и высотой в 25 символов, останется видимым. Остальное пропадёт. А для вас это будет выглядеть, будто просто сменили разрешение. Но при этом вы можете продолжать использовать оставшуюся, невидимую часть экрана. Сетить символы, рисовать квадраты. Как прежде. Только вот юзеры это не увидят. А потом можно будет скопировать область из невидимой части в видимую, чтобы показать готовую картинку. Вернёмся к либе term. Вот то самое "окно", о котором я говорил чуть ранее, — это же и есть самый что ни на есть вьюпорт. Поэтому, когда в либе будут функции с умонинанием window или viewport, нужно понимать, что речь там идёт именно про окно, описанное нами ранее. Итак, это всё была теория. Теперь будем, наконец, изучать функции либы term. Первая функция, которую изучим, — это term.internal.open([dx: number[, dy: number[, w: number[, h: number]]]]). Принимает 4, как видно, аргумента, которыми можно задать параметры окна. По умолчанию равны 0. Возвращает простую таблицу с установленными параметрами. Её я указывал выше. Ничего особенного. Этому окну следует присвоить gpu с прокси видеокарты для данного окна и keyboard с адресом клавиатуры для данного окна, опять же. Можно просто вызвать term.keyboard(window) — тогда автоматически выберется главный компонент. А ещё нужно к выбранной видеокарте прицепить нужный монитор. Как-то так: local com = require("component")local term = require("term")local screenAddr = "7d0180fd-541c-dacc-579f-683a3a3e2b67"local gpu = com.proxy("58fa8c35-60f9-d49a-5e14-4a57f3769463")local window = term.internal.open()window.gpu = gpugpu.bind(screenAddr)term.keyboard(window) Есть функция term.setViewport([w: number[, h: number[, dx: number[, dy: number[, x: number[, y: number[, window: table]]]]]]]). Если последним аргументом передать наше окно инициализированное, то значения для остальных аргументов подберутся автоматически, используя параметры видеокарты окна. Этой командой мы завершаем подготовку окна для работы. Но есть вариант попроще. term.bind([gpu: table[, window: table]]) — привязывает видеокарту к окну и вызывает функцию выше для установки стандартных значений. Очень удобно. Вот итоговый код: local com = require("component")local term = require("term")local screenAddr = "7d0180fd-541c-dacc-579f-683a3a3e2b67"local gpu = com.proxy("58fa8c35-60f9-d49a-5e14-4a57f3769463")local window = term.internal.open()gpu.bind(screenAddr)term.bind(gpu, window)term.keyboard(window) Давайте теперь использовать это окно во всю мощь. Чтобы потом не отвлекаться, сначала перечислю список скучных функций. term.gpu([window: table]) — возвращает прокси видеокарты для данного окна. term.isAvailable([window: table]) — говорит, готово ли окно к работе. term.keyboard([window: table]) — возвращает адрес клавиатуры для данного окна. term.screen([window: table]) — возвращает адрес монитора для данного окна. term.getGlobalArea([window: table]) — возвращает значения dx + 1, dy + 1, w и h для данного окна. term.getViewport([window: table]) — возвращает значения w, h, dx, dy, x, y для данного окна. А теперь настало время кое-чего поинтереснее. Например, term.drawText(text: string[, wrap: boolean[, window: table]]). Рисует текст, как io.write, но, во-первых, позволяет задать вторым аргументом true, а тогда текст будет переноситься на новую строку, если он длиннее ширины окна; во-вторых, можно задать окно для рисования — и писать текст, например, на другом мониторе, имея в распоряжении при этом обработку \t, \n. А ещё есть term.scroll(n: number[, window: table]). Он копирует область внутри окна и вставляет её — ниже на n строк, если n > 0, или выше на -n строк, если n < 0. Остальное очищается. Можно очистить строку, на которой находится в данный момент курсор, с помощью term.clearLine([window: table]). К слову, в прошлой версии первым аргументом был номер строки, которую нужно очистить. Теперь этого нет. Как видно, во всех функциях аргумент window опционален. Если его не указывать, возьмётся стандартное окно, которое используется системой. Ничего особенного. Собственно, это всё по окнам. В функциях, которые я перечислю ниже, нет возможности, к сожалению, указать окно аргументом — будет использоваться стандартное. Вот эти функции: term.read([options: table]) — функция, с помощью которой можно получить значение от пользователя. Создаёт строку ввода, её обрабатывает и возвращает результат. Можно передать таблицу с опциями: dobreak — если равен false, то после нажатия Enter курсор не переместится на новую строку. hintHandler — функция (принимает текущее значение поля ввода и номер подсказки, переключаемый Tab/Shift-Tab, и возвращает строку с подсказкой) или таблица с подсказками, которые будут предлагаться юзеру по нажатию Tab (или Shift-Tab для возврата назад). pwchar — символ, который будет показываться вместо введённых пользователем. Этим можно воспользоваться, чтобы, например, писать пароль. filter — функция, которая принимает значение поля ввода и возвращает true при валидном вводе и false при невалидном, или строка с паттерном Lua, с помощью которых будет проверяться валидность введённых данных. Например, можно разрешить вводить только цифры. Если попытаться ввести невалидные данные, то комьютер радостно пропищит. nowrap — если не задан или равен false, то при достижении конца строки, последующие символы переходят на следующую строку. Иначе будет вести себя, как в версиях до 1.6 — скроллить горизонтально. И, наконец, под числовыми индексами ([1], [2], [3], ...) история ввода — строки, между которыми можно переключаться с помощью стрелочек вверх и вниз. [*]term.clear() — вообще 0 идей, с чего вдруг здесь нельзя задавать окно, но тем не менее. Очищает экран. [*]term.pull() — ожидает ивентов, рисуя мерцающий курсор. [*]term.write(value: string[, wrap: boolean]) — то же, что и io.write. [*]term.getCursor() — возвращает позицию курсора. [*]term.setCursor(x: number, y: number) — устанавливает позицию курсора. [*]term.setCursorBlink(enabled: boolean) — включает/выключает мерцание курсора. [*]term.getCursorBlink() — проверяет, включено ли мерцание курсора. И вот здесь я предлагаю закончить, наконец, этот туториал. Я описал все функции публичного API этой интересной либы, которая пополнилась очень забавными и прикольными фичами. Теперь думайте сами, что будете делать со всем этим добром :P
-
Одну букву пропустил. Неверный адрес.
-
ивент Unreal Tournament: Resurrection -- Этап #1
Fingercomp ответил в тему Totoro в Ивенты и конкурсы
Обсудим мы этот в ирке вопрос в понедельник, как застанем Тотору. Пока не знаю.- 243 ответа
-
- Unreal Tournament
- oc
- (и ещё 2 )
-
ивент Unreal Tournament: Resurrection -- Этап #1
Fingercomp ответил в тему Totoro в Ивенты и конкурсы
Ну а чего ждать? Выкладывай на гитхаб, хоть глянем. А то выложишь 200 мегастрок. Как мне это всё чинить будет? Мне же нужен единый стиль везде. И код понятный. И прочее. Поэтому не жди, выкладывай и делай коммиты. Пусть оно даже не работает. Главное, что виден прогресс.- 243 ответа
-
- Unreal Tournament
- oc
- (и ещё 2 )
-
ивент Unreal Tournament: Resurrection -- Этап #1
Fingercomp ответил в тему Totoro в Ивенты и конкурсы
Естественно, будет свой комп у инфо-панели. С двумя мониторами. Не тянуть же провода позади, верно? Ну и, конечно же, будет OpenOS. 1.6 даже. Нужно на одном мониторе рисовать основную инфу (монеты, время), а на другом — динамически меняющуюся. Я пока не знаю, что туда пихнуть, правда, но это и не столь важно. Сделать хотя бы просто заготовку, абстракцию над UI, или, что я бы сделал, перепилить либу @Zer0Galaxy для работы с несколькими мониторами.- 243 ответа
-
- Unreal Tournament
- oc
- (и ещё 2 )
-
ивент Unreal Tournament: Resurrection -- Этап #1
Fingercomp ответил в тему Totoro в Ивенты и конкурсы
Пригласил обоих, зайдите сюда и примите приглашение. Окажетесь сразу в команде. Нам нужно сделать сам сервер. Пилим мы с @astral17, скоро доделаем. Нужен ещё контрллер голограмм. Я пихнул туда заготовку, но не делал сам код. И, наконец, инфо-панель. Есть манифест, заготовка, но нет самого когда панели. Выбирайте любой и делайте коммиты в ветку dev. Желательно через локальный клиент git, а не через веб-интерфейс (он убогий). Как сделаете фичу, можете открыть пулл-реквест дева в мейн, я проверю код и смёржу.- 243 ответа
-
- Unreal Tournament
- oc
- (и ещё 2 )
-
Что ещё очень хочется отметить, у автора очень хороший талант на креативные оригинальные запоминающиеся названия. xP Я так понял, он для OpenGlasses и поддерживает анимашки. P. S. Автору настоятельно рекомендую залить свои программы в репозиторий :P
