mva
use gentoo, Luke! :D
Saphire
Сейчас вот как раз играю :3
Saphire
980k
Snusmumriken
Сосунки! Вот игра для мужиков! https://candybox2.github.io/
fgntfg
Прошел
Snusmumriken
Saphire
Как там дела со скрепками? :D
Saphire
550 децилионов :3
Saphire
770...
Saphire
У меня производство ограниченно с коростью исследования.
Saphire
Paperclips: 30,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000
Snusmumriken
Обнаружил косяк у стима с luajit-ffi. Там не работают колбеки, ибо используются классы и макросы, а ffi - только сишка : )
Snusmumriken
Карочи, у меня в стиме работает куча всего. Кроме p2p, ибо подключение клиентов на колбеках, колбеков на оверлей, колбеков на ещё тонну всего :< Колбеки-колбеки. Самое противное, что похоже придётся катать враппер либы на c++.
Snusmumriken
А так - друзяшки есть ))
Snusmumriken
На самом деле, можно бешено читерить, ибо в стиме есть такая прикольная штука как 'RichPresence'. Туда можно загонять по 20 произвольных комбинаций key-value, соответственно, Соответственно, вместо колбеков на сообщения можно отправлять сообщения прям туда, типа: "setKeyValue(lobby_id, message)", а все кто в лобби типа мониторят друг друга несколько раз в секунду, не появилось ли чего у другого, и реагируют на это соответственно. Но это - бешеное извращение, относительно колбеков.
Snusmumriken
Кто-нить шарит в плюсах или возможности вызывать c++ макросы из ffi? : )
Snusmumriken
Суть вот тут: https://partner.steamgames.com/doc/sdk/api#callbacks Внутри steamworks: https://github.com/pmrowla/hl2sdk-csgo/blob/49e950f3eb820d88825f75e40f56b3e64790920a/public/steam/steam_api.h#L318 Всё кроме колбеков я делаю.
Snusmumriken
Слишком сложно? :< Я тоже так думаю, надо либу фигачить.
Snusmumriken
Ага.
Khasan
Не
Khasan
Подпишитесь
Khasan
Да
Snusmumriken
Чего пришёл?
Khasan
Я вроде настоящий
Khasan
Как
Snusmumriken
42 + триста
Khasan
342
Khasan
Ахах
Snusmumriken
Воу, ничоси
Snusmumriken
Роботы научились распознавать текст и автоматом преобразовывать его в цифры, и складывать )))
Khasan
Именно
Snusmumriken
Кстати да, надо моих ботов научить
Khasan
А у тебя есть боты?
Snusmumriken
Ну это слишком сложно, если научить ботов программировать - то зачем будут нужны люди?
Khasan
Я не хацкер
Khasan
Не шарю в этом
Snusmumriken
Ну в общем, народ тут не подписывающийся, пардон
Khasan
Я запрограммирован только для этого
Snusmumriken
Тут все кулхацкеры.
Khasan
Проголосуйте хотя бы
Khasan
Потом бантик
Khasan
Баньте
Snusmumriken
Слушай, а какая зп за рекламу?
Khasan
Всм
Snusmumriken
Ну, ты же не просто так бегаешь, у тебя явно какой-то профит. Мне было бы лень прост. Я бы бота написал.
Snusmumriken
Точнее, уже написал )))
Khasan
А разве есть боты для этого.?
Snusmumriken
Боты есть для всего подряд. Например для этого: https://habrahabr.ru/company/croc/blog/335650/
Snusmumriken
Вот такая вот реклама в тысячах мест в секунду - это вообще норма, истинное предназначение ботов Какими бы благими целями люди бы не прикрывались - реально они пишут ботов для мегарассовых рассылок.
Saphire
А так - друзяшки есть ))
>spacewar Вижу пирата!
Snusmumriken
Пирата? Это специальная игра для разработчиков в стиме, appid 480. Рядом болтаются сурцы с описанием "Как пользоваться стимом для чайников"
Snusmumriken
На самом деле, можно и любую другую игру заюзать для этих целей, только твоя прога будет падать на колбеке приглашения в катку от сотни тысяч друганов, с другим форматом запроса. Ну прикинь, заюзал ты appid от другой игры, прописал колбеки: "Если приглашают - подключаться". А к чему подключаться, если 100500 друзей ломятся срочно с тобой загамать, когда ты только тестишь либу, и она несовместима с форматами игр в которые тебя приглашают? Карочи, меня начинает заносить, приятных снов. #ботживи (на самом деле нет :( )
Snusmumriken
Карочи, придётся писать dll-лину для lua. Зато она будет совместима с любыми играми, в которых есть луа ))) К счастью, стим существует под не очень большое количество платформ, а такая обёртка - не задействует ничего платформенного, это прям круто-круто. Но всё таки не очень, потому что через luajit я могу вообще не париться на тему архитектур библиотек и всего такого.
Alexey
Я работаю над реализацией mimi API в Lua-cURL. libcurl предоставляет API curl_mimpart_data() - установить данные curl_mimpart_type() - установить Content-Type curl_mimpart_name() - установить параметр name в заголовке Content-Disposition При этом если передать NULL в качестве параметра то значение будет сброшено. Я реалзовал метод в Lua как part:data(str[,type[,name]]). Т.е. можно вызывать как part:data('string') - только данные part:data('string', 'text/plain') - данные и тип part:data('string', 'text/plain', 'myname') - данные, тип и имя. А так же part:name() и part:type() Теперь вопрос как организовать сброс параметров --- Случай 1 part:data('string1', 'text/plain', 'myname') part:data('string1') part:data('string1', nil, nil) part:data('string1',nil, 'another') --- Случай 1 part:name( 'myname') part:type( 'text/plain') part:data('string1') Я думаю использовать false для того чтобы сбросить значение
mva
ну, да, false как-то более явно (да и иначе не получатся фокусы (с использованием вариаций вызова) озвученные выше)
Snusmumriken
Используй пустое значение. function part:type(v) -- nil в конце чтобы не было false -- от результата логического выражения self._mime = type(v) == 'string' and v or nil end И вот такой вызов: part:data('string1',nil, 'another') не должен ломать mime-type, то есть: function part:data(data, mime, name) return self:_request( data or self._data, mime or self._mime, name or self._name ) end Ну, если не указано - выставлять то что было указано ранее, как дефолт, или ещё что-то такое. Объекты вам дадены чтобы вы как раз могли хранить в них состояния, и стоит это использовать.
Alexey
Там есть еще случаи Я думаю что для сброса значения буду использовать false. Но это не очень Lua-way мне кажется. Сброс по nil более естественный. param:type() -- вполне естественно сбросить type param:type(nil) -- тоже очевидно что пользователь хочет присаоить nil Но если есть код param:type(mimetypes.guesstype('test.xml')) Тут уже не очевидно. Если тип определен - то установить его. Но если нет то можно оставть текущий (не менять) или сбросить значение в default. В этом случае мне нравится по nil не менять значение, а оставить прежнее. А если надо сбросить, то можно написать param:type(mimetypes.guesstype('test.xml') or false) Так же если param:type(nil) сбрасывает тип, то вполне очевидно что param:data(nil) долже сбросить данные, так же как и param:data(nil, nil, nil). Но последний вариант получается не сбрасывает тип и имя. Что тоже не очень очевидно, но вполне можно сказать, что для сброса конкретного элемента нужно использовать специальную функцию. Еще можно добавить специальные методы для сброса. Но их нет в оригинальном API и я не очень хочу их добавлять. Поэтому я думаю false для сброса вполне подходящая альтернатива -- установить данные не менять тип и сбросить имя part:data('hello', nil, false) Т.е. установка nil не меняет текущего значения. Единственное part:type() так же не будет сбрасывть значение, т.к. я не люблю разную семантику для type() и type(nil) PS. А в реальности не думаю что эта часть API будет часто использоваться Более вероятно что MIMI объекты будут просто создаватся заново когда это будет нужно, а не использоваться повторно PPS. Еще я размышляю над API для curl_mimepart_data_cb и над форматом тадлицы для постороения MIME объекта
Snusmumriken
> param:data(nil, nil, nil). Но последний вариант получается не сбрасывает тип и имя. Что тоже не очень очевидно, но вполне можно сказать, что для сброса конкретного элемента нужно использовать специальную функцию. Различай nil и false. function part:data(data, mime, name) local tdata, tmime, tname = type(data), type(mime), type(name) self._data = data == false and nil or tdata == 'string' and data or self._data self._mime = mime == false and nil or tmime == 'string' and mime or self._mime self._name = name == false and nil or tname == 'string' and name or self._name return self:_request( self._data, self._mime, self._name ) end param:data(nil, nil, nil) - ничего не сбросит param:data() - тоже ничего не сбросит param:data(nil, 'xml', nil) - заменит mime на xml param:data(false, 'xml') - заменит mime на xml, удалит data
Snusmumriken
Если человек выставил false - ты видишь явное намеренье удалить. Если человек ничего не выставил в функции с множеством аргументов - твоя задача помочь с выставлением дефолтных значений. Если человек ничего не выставил в заполняющей функции с одним аргументом - он, вероятно, хочет уничтожить значение.
Anonymous
давай попробую
Anonymous
http://i.imgur.com/MdTs8vI.png
mva
GDE OLEG
Snusmumriken
Ничоси. С++-либы компилятся и цепляются!
Snusmumriken
Я скомпилил вот такую ерунду через g++!
Snusmumriken
Скоро ко мне можно будет обращаться за плюсовыми либами (не очень сложными) Оно даже экспортится в табличку! power = require'power'
Elias
Это компилится в .dll, да? И потом можно использовать независимо как обычный модуль?
Snusmumriken
Ага.
Snusmumriken
Я просто хочу запилить взаимодействие с колбеками steamapi в dll-ку. Просто так не получится, ибо колбеки там как c++-шаблоно-классо-макросы.
Elias
Круто Просто я всегда Lua из C++ напрямую запускал, и даже не думал, что Lua может запускать другой C++ код, не основной программы. :D
Elias
И возможно стоит самому делать такие модули, будет чуть лучше, наверное, чем просто регистрировать всё глобально в lua_State* luacheck ругается на глобальные переменные, и наверное не зря. :)
Snusmumriken
Ну, эта фигня не делает глобальных, а пушит табличку типа.
Elias
Ага, вот это и хорошо А то я хотел избавиться от всех глобальных переменных, и только C++ функции оставались таковыми
Snusmumriken
Тут даже этого нет, так что..
Elias
Ага Просто я что-то только недавно задумался о том, что вообще нехорошо создавать столько глобальных вещей (переменных не делал, только классы и функции) Но теперь перешёл полностью на модули и всё гораздо лучше стало в базе. Явно прослеживаются зависимости, красота Мало того, Sublime может находить определения локальных функциях внутри загружаемых модулей, ещё один плюс.
Elias
Да, просто это от C++ пошло, мол классы - глобальные (почти) Да и видел в разных играх, что так делали, например в Don't Starve. Но всё же успел прочувствовать минусы этого подхода
Elias
Ну, в смысле если хедер включить куда-то, то сам класс будет в глобальной области видимости (если он не в namespace) Я об этом
Elias
Но пока что не решаюсь делать local SomeClass = require 'SomeClass' внутри функций или даже if/else Как-то нагляднее всё require'ить в самом начале модуля Да, только хэдер может включать другие хэдеры, и в итоге можно получить от него сразу много классов и свободных функций. Скорее Lua тут выигрывает в плане модулей, что можно классы и функции делать локальными в модуле и не получать "бонусов" при включении этого модуля в другие.
Elias
И ещё открыл для себя плагин Sublime, который постоянно проверяет редактируемый файл в luacheck и качество моей жизни возросло в разы. (Что-то там вроде Sublime Lua Linter)
Snusmumriken
Да, просто это от C++ пошло, мол классы - глобальные (почти) Да и видел в разных играх, что так делали, например в Don't Starve. Но всё же успел прочувствовать минусы этого подхода
https://vk.com/doc75175715_449700199?hash=bd4d936e0b7b9ef399&dl=1cbe9956d67eb88f82 Вот тут вот - ровно одна глобальная переменная, gamestate. В состоянии игры - игровой мир, и там же все игровые объекты. Подключение модулей.