Totoro
-
Публикации
1 950 -
Зарегистрирован
-
Посещение
-
Победитель дней
289
Сообщения, опубликованные пользователем Totoro
-
-
...
Тогда пост должен будет называться "[Статья] Как построить бункер на случай зомбиапокалипсиса".
-
2
-
-
Немного не понятна логика программы.
При получении эвента 'motion' она пробивает имя нарушителя по базе "гостей".
А если нарушитель (отсутствующий в вайтлисте), придет повторно? Сирена будет молчать, ведь он уже был занесен в список "гостей".
-
-
OpenComputers 1.5.13
Итак, после пары недель наведения блеска, окончательный релиз 1.5.13 =)
Добавлено:- Архитектура Lua 5.3
- Карта данных. Предоставляет встроенные алгоритмы хеширования а также сжатия (inflate / deflate - алгоритмы gzip, применяющиеся среди прочего для сжатия NBT тегов, и растра PNG файлов) (спасибо пользователю Kubuxu).
- Принты могут быть настроены на отсутствие коллизий (для стейтов отдельно, плюс стоит доп. расхода хамелиума). Таким образом вы сможете ходить сквозь принт, всегда, или в одном из его стейтов.
- Использование пустой строки, в качестве текстуры для шейпов принта, сделает их невидимыми.
- Добавлен новый метод в драйвер AE2 Интерфейса, для того, чтобы сохранять информацию о предметах в апгрейд-базу данных.
- Интеграция с модом ExtraCells (спасибо пользователю DrummerMC).
- Интеграция с Электронной Библиотекой из BC7, для сохранения / загрузки чипов EEPROM (требует BC 7.0.9).
Фиксы:
- Взаимодействие роботов и дронов с двойным сундуком-ловушкой.
- Соседние с испускающим сигнал редстоуна принтом блоки не обновлялись в некоторых ситуациях.
- Некорректные координаты в событии "mouse scroll", при измененном размере интерфейса.
- "Ошибка неучтенной единицы" в функции os.date().
- Драйвер Командного блока теперь возвращает данные выполнения команд executeCommand (а не вечное true, как раньше).
- Потенциальный Null Pointer Exception при инициализации микроконтроллера.
- Улучшена имплементация отвертки из Project Red в Ключ (Scrench) из OC.
- Отображение положения "дроноботов" при движении "в присяде".
- Дроны издающие звуки шагов, при движении низко над землей.
- Поведение /dev/null в роботах.
- Туча опечаток в документации.
Включить процессору новую архитектуру Lua 5.3 можно на Shift+ПКМ, держа процессор в руке (как уже писал в своем блоге Fingercomp).
Кликайте ПКМ, пока в чате (или подсказке к процессору) не будет написано "Lua 5.3".
Если вы играли в 1.5.13 dev-билд (например с Jenkins-сервера автора), не забудьте вручную переключить опцию enableLua53 в конфиге мода на true. (Потому что автор отключил ее, пока новая архитектура не стала достаточно стабильна.)-
1
-
Тема напомнила басню Крылова


-
3
-
-
Как-то раз я писал программку на Луа, и вдруг подумал: "А что, если взглянуть на процесс с другой стороны? Вместо скрипта для программы - написать программу для скрипта. "
В качестве платформы, я решил взять Java Swing, потому что в тот момент под рукой была только шестая Java, и никаких библиотек.
А в качестве программы - игру. Как многие знают, Луа - традиционный язык скриптования во многих играх.

Игра располалагется в репозитории:
https://github.com/MoonlightOwl/LittleTanks
Последняя версия может быть скачана здесь:
https://github.com/MoonlightOwl/LittleTanks/releasesПроект представляет собой аркаду, с редактируемыми уровнями, и скриптованием этих уровней на Lua 5.2.
Игрок управляет одним танком, и должен уничтожить все другие танки на уровне. (Правила конкретного уровня могут быть изменены его скриптом.)
Редактирование уровней
Создавать и редактировать карты можно в любом блокноте. (Памятка: http://pastebin.com/eW1PTzUB )
Уровни образуют пакеты, или "миссии".
Название файла имеет такой формат: "<название_миссии><номер_уровня_начиная_с_1>.dat" (например base1.dat, и т.д.)
Скрипт к уровню должен лежать в папке /levels/script/. Он должен называться так же как и сам уровень, только с расширением lua вместо dat.
Скриптование
Игра обращается к скрипту через следующие методы:
* init(world)
Вызывается один раз, при загрузке уровня. Объект world - это "игровой мир". Он содержит методы для обращения к игре, карте уровня.
* updateTank(tank)
Этот метод вызывается для каждого вражеского танчика в игре, каждый раз, как он завершает очередное действие. Через объект tank скрипт может обратиться к танку, и задать ему новое действие (двигаться, стрелять).
* updateWorld(world)
Этот метод вызывается каждый тик и передает объект игрового мира.
Описание всего доступного интерфейса на текущий момент, можно найти здесь: http://pastebin.com/SYRSnar2
Пример скрипта, который загружается по умолчанию:
function init(world) math.randomseed(os.time()) end local function randomBool() return math.random(0,1) == 1 end function updateTank(tank) local action = math.random(1, 20) if action == 1 then local dx, dy = 0, 0 if randomBool() then if randomBool() then dx = 1 else dx = -1 end else if randomBool() then dy = 1 else dy = -1 end end tank:move(dx, dy) elseif action == 2 then tank:fire() end end function updateWorld(world) end(https://github.com/MoonlightOwl/LittleTanks/blob/master/levels/script/default.lua)
Здесь танк движется совершенно рандомно, время от времени стреляя. Таков его ИИ на большинстве уровней =)
Итак
Игра чертовски сырая, геймплей не сбалансирован, скриптовые интерфейсы требуют серьезной доработки, и английский язык хромает.

Но тем не менее оно уже работает.
Буду рад любым советам (может даже pull-реквестам ))), багрепортам, и предложениям.
-
8
-
-
Это баг или фича?
В для первого load() ты указываешь переменную окружения, насколько я понял.
Для второго - нет (используется "глобальное окружение").
Поэтому, у них разные переменные а.
Строка из документации:
When loading a chunk, the top-level function gets a new _ENV upvalue, and any nested functions inside it can see it. You can pretend that when loading works something like this:
local _ENV = _Greturn function (...) -- this function is what's returned from load
-- code you passed to load goes here, with all global variable names replaced with _ENV lookups
-- so, for example "a = b" becomes "_ENV.a = _ENV.b" if neither a nor b were declared local
end
Т.е. загруженный чанк получает новую переменную окружения, и при этом LVM выдает ей "внешний" _G.
-
1
-
-
По моему,25 килобайт за скриншот 80x25 не очень много весит, но я подумаю об изменении формата.
Монстер, у меня голограмма 48х32х48 весит всего 18,5 Кб. И это без сжатия, которе предлагал Зеро.
Так что - апргейдить! Однозначно апгрейдить!

-
2
-
-
@Totoro,а если использовать прокси сервер? его прога к серверу,а уже твой сервер на скрипт
Думаю, это самая разумная схема.
-
1
-
-
Почему?Можно отправлять запрос банковскому серваку,а он отправляет вам пароль,который надо ввести, вы его вводите - АПИ его отправляет банку, пароли совпадают - деньги снимаются
Без должной системы шифрования, нельзя упускать из виду вероятность того, что сообщения будут перехвачены по пути или подменены хакером. Тут нужно подумать над реализацией протокола.
-
В общем просматривая свое апПи и подумал об создании своей операционной системмы. Но пока все что я придумал это то что она должна быть одна для всех устройств не включая "биосных" и название...
В каком смысле, одна для всех устройств? Насколько я знаю в OpenComputers все компьютеры/устройства работают примерно одинаково, и все имеют "БИОС".

-
Так нужно такое аппи что бы отправляло, например, логин и пароль шифрованый конечно, а получало токкен или иначе: для выполнения любой операции нужно посылать логин и пароль, а операции 2: проверка счета и покупка, даже без проверки можно - просто покупка
Если только писать к банку дополнительный модуль... С шифрованием сообщений, с проверкой токенов, защитой от "DDoS"... Затем модерировать выданные токены (ведь кто-то может его "реквизировать" в своих целях). Надо будет подумать.
Так или иначе, я бы хотел сначала увидеть твой PlayMarket

-
Такое API, библиотека которая имеет доступ к счетам пользователей, или возможность ими управлять, образует слишком большую уязвимость, к сожалению.
-
Чтобы не было проблем с разной длинной символов, возьми unicode.len(string) из Unicode API. (http://ocdoc.cil.li/api:unicode)
-
1
-
-
Можно можно. Даже цифры, и даже нил.
Узнаю Луа.
-
Метатаблицы Карл...
Как ты это сделаешь для "примитивных" типов?
-
В один прекрасный день, когда ничто не предвещало ничего необычного, на форуме появился MrEnderfall.
Он был встречен неприступной стеной вайт листа, и мрачным скепсисом старожилов. Но MrEnderfall это не смутило.
Он пылал энтузиазмом, и программерская муза блуждала в его голове, в поисках выхода.
Для начала он затребовал себе туториал по OpenComputers, обозначив тем самым всю серьезность своих намерений.(22 Июнь 2015 - 11:23) MrEnderfall : Люди, скиньте нормальный туториал по OpenComputers. (22 Июнь 2015 - 11:26) LeshaInc : @MrEnderfall http://ocdoc.cil.li (22 Июнь 2015 - 11:27) MrEnderfall : @LeshaInc , большое спасибо! (22 Июнь 2015 - 11:28) LeshaInc : Странно, я вроде как мануал на английском языке дал. (22 Июнь 2015 - 11:31) MrEnderfall : @LeshaInc , я очень хорошо английский знаю, как-нибудь пойму.
После чего MrEnderfall углубился в чтение документации. На втором часу пришло озарение.
(22 Июнь 2015 - 13:12) MrEnderfall : Люди, наконец-то у меня заработал мозг. Я придумал ферму дерева (Банально), вот в чём смысл программы: робот сканирует участок чанка , и если он находит блок дерева по ID , то он подходит к этому блоку и начинает рубить, и так пока в чанке не останется дерева, потом(Если дерева в чанке не осталось) он идёт в другой чанк по спиралеобразному курсу и ищет там дерево, если инвентарь робота заполнен, он ставит эндер-сундук и отправляет дерево хозяину. Комплектация робота: сам робот, топор, Hover Upgrade, Inventory Upgrade, Battery Upgrade(По желанию), Generator Upgrade (По желанию).
Слово программиста не расходится с делом. Мануалы были отброшены в сторону, и идея моментально начала воплощаться в жизнь.
(22 Июнь 2015 - 13:19) MrEnderfall : Единчтвенная проблема, я не знаю как это всё устроить в Lua так как я плохо его знаю. (22 Июнь 2015 - 13:25) MrEnderfall : Так, уже понимаю, * robot.detect(): boolean, string * -- тут надо вставить ID Дерева * robot.swing([side: number]): boolean[, string] * -- ЗЫ. мне непонятно куда вставлять ID дерева (22 Июнь 2015 - 13:28) cyber01 : @MrEnderfall вроде бы detect просто так не определит по ID.. (22 Июнь 2015 - 13:29) MrEnderfall : Незнаю, я только начал изучать Robot API.
На этом моменте, жертвой музы MrEnderfall'а пал и Артем. Восхищенный широтой замысла, он присоединился к команде.
(22 Июнь 2015 - 16:43) MrEnderfall : Так, скажите мне как сделать движение робота "змейкой"? (22 Июнь 2015 - 16:44) LeshaInc : @MrEnderfall для начала прочитать мануалы. (22 Июнь 2015 - 16:45) artem211 : @MrEnderfall Такс (22 Июнь 2015 - 16:45) artem211 : вот я и пришел (22 Июнь 2015 - 16:45) artem211 : Кто чего хотел от меня
После того, как было установлено точно, шахтера они пишут или дровосека, MrEnderfall озвучил новое ТЗ.
(22 Июнь 2015 - 16:56) artem211 : @MrEnderfall Не торопись (22 Июнь 2015 - 16:57) artem211 : @MrEnderfall а то снова придется переделывать, пиши сюда свою концепцию, будем на лету править (22 Июнь 2015 - 16:59) MrEnderfall : Робот ищет перед собой блок дерева (ферма должна быть плоская) если, не находит, то движется дальше, и так пока не найдёт блока дерева, дальше он рубит блок сверху(даже если его нет, как решить, не знаю.), потом рубит блок спереди и летит вверх, и так пока не перестанет находить блоки впереди, тогда он опускается и ищет дерево дальше.
Через полтора часа хардкорного программирования, увидела свет...
(22 Июнь 2015 - 18:19) MrEnderfall : самая самая первая, сырая, и не полная версия http://pastebin.com/e8ubU987
(Исходный код прилагается.)

Версия 1.0
==========--сделал MrEnderfall и artem211 print(OpenTimberman by MrEnderfall and artem211) if robot.detect().true robot.swing(30) else robot.forward()
Релиз был тепло принят критикой.(22 Июнь 2015 - 18:20) LeshaInc : 6 строк... 6 строк Карл... 6 строк...
Затем между соавторами произошла небольшая джентельменская беседа, о том, кому достанется почетное место в титрах.
(22 Июнь 2015 - 18:23) MrEnderfall : @artem211 извините, вы мой друг и помощник, доктор Ватсон, и я просто должен вас вписать в титры. (22 Июнь 2015 - 18:28) artem211 : @MrEnderfall На будущее, без спроса у правообладателя, ты не имеешь права нигде и никак о нем писать (22 Июнь 2015 - 18:29) artem211 : @MrEnderfall Так что удали оттуда мой ник/имя/кличку
А спустя некоторое время была выпущена вторая версия программы, где были учтены пожелания пользователей и пропатчены баги.
(Исходный код прилагается.)

Версия 2.0 (с багфиксами)
=========================--сделал MrEnderfall print "OpenTimberMan by MrEnderfall" if robot.detect() then robot.swing(30) robot.forward() robot.up() end
Мы искренне надеемся, что она не станет последней. И скоро на сервере будут бодро махать топорами Тимберманчики третьего поколения.-
8
-
-
-
ID можно было получить в старых версиях OC.
А теперь только "кодовое имя". Типа "minecraft:sand".
Для этого надо установить апгрейд-контроллер инвентаря. (По ссылке - подробная справка.)
И воспользоваться функцией getStackInInternalSlot(slot:number):table.
Пример:
local com = require('component') local controller = com.inventory_controller local slot_number = 1 local stack = controller.getStackInInternalSlot(slot_number) print("Название предмета в слоте: "..stack.label) print("Код: "..stack.name) print("Метаданные: "..stack.damage)-
2
-
-
Totoro, Ты хочешь сказать что swg2you должен написать компилятор Lua?
-
2
-
-
Ребята, давайте жить дружно!
Пусть у swg2you Луа компилируется, а у NEO - интерпретируется.

-
2
-
-
А если использовать карту + детектор энтити? Если игрок реально в радиусе и карта на его имя - пустить, иначе послать...
Да, как-то так можно и сделать. Причем детектор не нужен. Ведь сканер карт возвращает ник игрока, в чьем кармане лежит карта. Остается только сверить этот ник с данными самой карты. И пропустить. Или не пропустить.
Можно какие-то данные еще на карту внести. Тогда можно будет ее использовать на разных объектах, без единой базы данных пользователей.
Вероятно придется также шифровать данные карты. Ведь никто не мешает хакеру напечатать себе именных карточек на все случаи жизни

-
Пфф... Недавно в чате спрашивал, как защитить ключи доступа к дому. Автор мода видать играет без PvP или вообще не играет. Если меня убьет какой-нибудь чувак в кванте, то он станет хозяином моего дома.
Бессмысленный мод, хотя детектор сущностей очень нужен.
Хех, ты ведь дочитал до того места где написано, что карточный ридер возвращает ник игрока?
Написать гибкую, надежную и удобную защитную систему - тут-то и кроется вызов программисту.
А карточки - это только еще одно средство, и еще один вариант.
-
Новый мод-аддон для OpenComputers, от создателя OpenPrinters.
(http://oc.cil.li/index.php?/topic/606-opensecurity-1710-oc-14/&do=findComment&comment=2342)
Переносит на чистый OC некоторые фишки, которые ранее были доступны только в аддонах под ComputerCraft. Полезные компоненты для постройки охранной системы ( какой-нибудь Quantum Eye 2 Next Generation =).
The Alarm Block (Сигнализация)
Напоминает таковую из Nuclear Control, но обладает полноценным программным интерфейсом. Может активироваться как редстоуном, так и компьютером.
Название компонента: OSAlarm- alarm.setAlarm("klaxon2") - Выбрать тип звука. Их пока два - klaxon1 и klaxon2. Первый стоит по умолчанию
- alarm.setRange(15-150) - Установить радиус слышимости. Число от 15 до 150
- alarm.activate() - Активировать сирену
- alarm.listSounds() - Возвращает список доступных звуков
- alarm.deactivate() - Деактивировать сирену
RFID Reader Card (Плата чтения RFID)
Установите ее в компьютер или планшет, чтобы читать RFID-карты в инвентаре у других игроков.
Название компонента: OSRFIDReader- rfid.scan([range: number]) - Сканирует всех игроков в радиусе 16 блоков. Опциональный параметр range позволяет изменить радиус сканирования (от 1 до 64). Большое значение может вызвать лаги.
Команда не возвращает данные. Вместо этого она генерирует эвент для каждой найденной карты. Эвент имеет название "rfidData" и три параметра: ник игрока, расстояние до игрока, и данные RFID-карты.
RFID Reader Block (Блок чтения RFID)
Аналогично плате, позволяет читать данные RFID карт у игроков в инвентаре.
Название компонента: OSRFIDReader- rfid.scan([range: number]) - Сканирует существ в радиусе 16 блоков на наличие RFID. Опциональный параметр range может задать другой радиус (1-64). Внимание: большое значение может вызвать лаги.
Команда генерирует эвенты с названием "rfidData" и четырьмя параметрами: ником игрока, растоянием до игрока, данными RFID, и UUID карты.
Кроме того, команда возвращает данные в виде таблицы.
Максимальный радиус может быть настроен в конфиге мода, однако выше 64 выставить не получится даже там.
RFID Card (RFID-карта)
Собственно карта. Может хранить до 64 символов информации. Редактируется в Card Writer (Редактор Карт), и может быть залочена, чтобы запретить изменение информации.
MagStrip Card (Магнитная карта)
Альтернативная карта. Может хранить до 128 символов информации, однако не может быть прочтена дистанционно. Для чтения ее надо поместить в считывающее устройство для магнитных карт.
Редактируется в том же Card Writer, и так же может быть залочена.
Card Writer (Редактор Карт)
Устройство, позволяющее изменять информацию на картах RFID и MagStrip, а также заблокировать эти карты от дальнейшего редактирования.
Название компонента: OSCardWriter- writer.write(data: string, displayName: string [, locked: boolean])
- Изменение данных на карте. Установите последний параметр как true, чтобы заблокировать карту.
Например: writer.write("Test Data", "Display", true) запишет строку "Test Data" на карту, назовет ее "Display" и запретит редактирование.
Одна и та же команда работает для RFID и MagStrip карт. Однако учитывайте что лимит на длину строки с данными у этеих карт разный (64 и 128 соответственно).
Первая запись назначит карте UUID, чтобы облегчить индентификацию карты в дальшейшем.
Mag Card Reader (Сканер магнитных карт)
Устройство для чтения магнитных карт. Игрок должен кликнуть картой по блоку.
Не имеет методов. Он генерирует эвент каждый раз, как игрок кликает по нему магнитной картой (MagStrip Card).
Название эвента: magData
Содержит три параметра: ник игрока, данные карты и ее UUID.Entity Detector (Детектор существ)
Работает как радар - детектируя живых существ в определенном радиусе вокруг блока. Реагирует на монстров/животных, игроков и дроп.
Название компонента: OSEntityDetector
-
entity.scanPlayers([range: number]) - Возвращает таблицу игроков в радиусе 16 блоков (или range от 1 до 64).
- entity.scanEntities([range: number]) - Возвращает таблицу живых существ и дропа.
- Обе команды также генерирую эвенты для каждой найденной сущности:
- Название эвента: "entityDetect", параметры: name, range, x, y, z
-
4

ExOS
в Операционные системы
Опубликовано:
Никакого шевеления
[soundcloud=00aabb]69975822[/soundcloud]