Skip to forum content

You are not logged in. Please login or register.


forums.pvpgn.pro → [RU] Research & Development → Вопрос по возможностям LuaEngine

Pages 1

You must login or register to post a reply

RSS topic feed

Posts: 23

1 (edited by Karaulov 24.11.2016 13:22)

Topic: Вопрос по возможностям LuaEngine

HarpyWar, какие возможности у Lua скриптов?

С помощью них можно создать систему HOST/Статистики?

Например что-то на подобии этого:

[Хост]
скрипт HostSystem:

1. Игрок ввел команду /host 5x5 aptb go (и если нет ошибки в команде то продолжить:)
2. Запустить функцию которая найдет подходящего свободного бота
3. Если бот найден ему отправится команда /host 5x5 aptb go 'имя игрока' если нет то выведет ошибку.
4. Запустится таймер для игрока , который на 10 секунд заблокирует команду /host и будет выводить ошибку "вы уже запустили создание игры",  и если игра не создалась в течении 10 секунд то выведет ошибку и потом разрешит команду /host
5. Если игра создалась то бот сообщит об этом серверу а сервер игроку, игра сохранится для игрока и пока она не будет запущена или завершена команда /host будет выдавать ошибку "разрешено создавать только одну игру"


[Статистика]
скрипт StatsSystem:

1. Создать скрипт для чтения нестандартных пакетов
2. Бот после игры отправит всю статистику в виде нестандартного пакета
3. Функция прочитает пакет, прочитает старую статистику игроков, вызовет функцию пересчета статистики.
4. Выведет новую статистику всем игрокам которые онлайн


Ну и там команды дополнительные для просмотра статистики и т.д

Такое возможно сделать с помощью Lua скриптов?

(Есть где-нибудь информация любая по использованию Lua в Pvpgn?)

2

Re: Вопрос по возможностям LuaEngine

Скрипт Lua для взаимодействия между ботом и pvpgn уже готов, все эти функции и события реализованы, в т.ч. таймер. То есть, все это возможно.
Чтение и отправка нестандартных пакетов возможно добавить самостоятельно через C++ код, чтобы затем его можно было использовать в Lua (событие для получения "сырых" пакетов, и функцию для их отправки). Функции для стандартных вычислений предоставляет сам движок Lua https://www.lua.org/manual/5.1/

Функции определены в luafunctions.cpp, и они же регистрируются в luainterface.cpp. Здесь же внизу файла определены события (events). В luaobjects.cpp функции для получения объектов (аккаунт, канал, игра, клан).

Те функции и события, которые созданы в С++ и транслированы через движок Lua, можно вызывать из скриптов Lua.

Касательно реализации текущего механизма встраивания Lua движка, у меня есть сомнения в плане производительности. Например, сейчас в память загружаются все скрипты из папки lua. Всё функции загружаются в глобальную область видимости, и перед вызовом любой из функций происходит итерация всех доступных функций. Возможно, с этим особых проблем и нет, но правильнее было бы загружать каждый используемый файл через require/include, как это везде делается.
Неправильно сделана реализация ряда функций, экспортируемых из C++ в Lua. В C++ коде обращение происхдит по указателю (быстро), но для тех же функций Lua все объекты загружается в память (медленно). Например, get_account_object загружает аккаунта юзера со всеми его свойствами в память.
Это упрощает доступ к объекту, например можно получить аккаунт и обращаться к его свойствам как к объекту:

account = account_get_by_id(123)
name = account.name

Вместо аналогичного кода в C++, где чтобы получить любое из свойств, нужно вызвать соответствующую функцию, которая, при необходимости, обратится к бд в нужный момент

account = account_get_by_id(123)
name = account_get_name(account.id)

Поэтому в Lua, в противоположность к удобству, это значит, что если потребуется посчитать сколько юзеров находятся в играх, придется обойти все аккаунты и фактически для каждого из них загрузятся все данные из базы данных.


Lua работает в том же потоке, в котором и выполняется вся остальная работа, и длительные операции будут тормозить весь сервер (таймеры в Lua я сделал без блокирования потока, так что их можно использовать без проблем). Но это уже проблема самого pvpgn, т.к. в нем не заложена многопоточноть.
Стоит обратить внимание, что сейчас встроен Lua 5.1, и он не совместим с последней версией 5.3, которую как-то по-другому нужно встраивать, и у меня не получилось. На тот момент везде советовали 5.1, и готовые решения были только для него.

Сейчас, если бы была возможность, я бы лучше добавил Javascript вместо Lua. У него больше стандартных возможностей, и как по мне, под него проще писать скрипты.

В целом, сейчас Lua годен для небольших серверов, и требует доработки для использования на крупных серверах. Так что будем считать что он в режиме experimental.

---
Вся информация по использованию сейчас только в самих файлах *.lua, на примерах. Как уже писал выше, нет файла с точкой входа - загружаются все файлы разом. Названия файлов и папок не имеют значения, и можно было бы  без изменений в один файл всё соединить.
Все новые команды добавляются в handle_command.lua в таблицу lua_command_table. Для удобного разделения я решил добавлять каждую новую команду в отдельный файл, в папке lua/command/.

Do not ask for support in PM.

3 (edited by Karaulov 24.11.2016 15:53)

Re: Вопрос по возможностям LuaEngine

HarpyWar wrote:

Скрипт Lua для взаимодействия между ботом и pvpgn уже готов, все эти функции и события реализованы, в т.ч. таймер. То есть, все это возможно.

А это как понять, т.е уже есть pvpgn связанный с ботом с помощью LUA ? или есть только функции и события для этого?

4

Re: Вопрос по возможностям LuaEngine

Есть скрипты на Lua в pvpgn, но нет ghost бота, который смог бы с ними взаимодействовать forums.harpywar.com/viewtopic.php?pid=6624#p6624

Do not ask for support in PM.

5

Re: Вопрос по возможностям LuaEngine

А что там слышно от OHSystem ? Забросили проект уже?

6

Re: Вопрос по возможностям LuaEngine

Cub_bone wrote:

А что там слышно от OHSystem ? Забросили проект уже?

думаю забросили

7

Re: Вопрос по возможностям LuaEngine

От OHSystem никаких вестей нет по этому вопросу.
Недавно JiLiZART начал портировать бота на JS, и его можно было бы расширить нужным функционалом. Сейчас не знаю на каком он этапе https://github.com/w3gh/ghost.js

Do not ask for support in PM.

8

Re: Вопрос по возможностям LuaEngine

Сколько лет наблюдаю одни и те же темы: команды боту через пвпгн, ПТС-Статистика, что-нить как у айкапа....
Что до сих пор не сделали?

9 (edited by Karaulov 24.11.2016 23:20)

Re: Вопрос по возможностям LuaEngine

Но ни одной сборки PvPGN + БОТ с открытым кодом нет, в которой работало бы всё, статистика , host/chost и т.п smile

Даже PvPGN 2.0, без хост/статс  и бота бесполезный вообще для Warcraft III smile

10

Re: Вопрос по возможностям LuaEngine

Cub_bone wrote:

Но ни одной сборки PvPGN + БОТ с открытым кодом нет, в которой работало бы всё, статистика , host/chost и т.п smile

Даже PvPGN 2.0, без хост/статс  и бота бесполезный вообще для Warcraft III smile

я же выложил )

Добавлено: 25.11.2016 21:12

Cub_bone wrote:

Но ни одной сборки PvPGN + БОТ с открытым кодом нет, в которой работало бы всё, статистика , host/chost и т.п smile

Даже PvPGN 2.0, без хост/статс  и бота бесполезный вообще для Warcraft III smile

я же выложил )

11 (edited by Karaulov 25.11.2016 22:33)

Re: Вопрос по возможностям LuaEngine

SkyFall wrote:

я же выложил )

Что именно? smile



HarpyWar wrote:

Есть скрипты на Lua в pvpgn, но нет ghost бота, который смог бы с ними взаимодействовать forums.harpywar.com/viewtopic.php?pid=6624#p6624

А где там пример использования таймеров в /host ?
Допустим игрок написал /host 5 раз подряд, ему каждый раз выберется какой-нибудь бот и создаться 5 игр? (Если бот создаст игру с задержкой а не мгновенно)

12

Re: Вопрос по возможностям LuaEngine

Пример использования таймеров есть в скрипте Quiz.

Фунции для таймера определены в include/timer.lua:

-- id - любой уникальный идентификатор
-- interval - интервал в секундах
-- callback - функция тикания
function timer_add(id, interval, callback)
function timer_del(id)

Простейший пример таймера, который пишет в консоль каждую секунду, и через 5 секунд останавливается:

...
timer_add("hello", 1, mytimer_tick)
...

local mytimer_counter = 0
function mytimer_tick(options)
    mytimer_counter = mytimer_counter + 1
    DEBUG(self.id .. ": " .. mytimer_counter)
    if mytimer_counter == 5 then
        timer_del(options.id)
        mytimer_counter  = 0
        DEBUG("finish")
    end
end

Во вложении полноценный пример, с локальным счетчиком для каждого таймера (пример выше с глобальным счетчиком).
Так же, в архиве слегка измененный include/timer.lua, с возможностью передавать дополнительные данные через 4-й параметр в функцию timer_add.
И в handle_command.lua добавлено сопоставление команды "mytimer" к функции в timer_example.lua. Если там были добавлены новые команды, то лучше добавить её вручную, чтобы их не затереть:

["/mytimer"] = command_mytimer,

В общем, можно распаковать этот архив в папку с pvpgn, и будет работать команда /mytimer.

http://forums.harpywar.com/extensions/hcs_image_uploader/uploads/0/8000/8259/thumb/p1b2iknci71dhonhghqucia11bi1.png

Добавлено: 27.11.2016 14:50

Cub_bone wrote:

Допустим игрок написал /host 5 раз подряд, ему каждый раз выберется какой-нибудь бот и создаться 5 игр? (Если бот создаст игру с задержкой а не мгновенно)

Там не нужна задержка. Если написана команда /host, то в массив добавляется имя юзера с пометкой что он создал игру. При следующей попытке захостить проверяется, если в массиве есть этот юзер, то создание новой игры через бота запрещается.

Do not ask for support in PM.

13 (edited by Karaulov 27.11.2016 16:43)

Re: Вопрос по возможностям LuaEngine

Да все это интересно)
Думал без модификаций чисто на Lua сделать, но update_dota_elo требуется прямо в сервер подключать что бы мог напрямую статистику записывать игрокам и отправлять сообщения игрокам без всяких костылей )
Наверно не получится update dota elo на Lua?)

Я думал написать на Lua все к серверу (запись статистики и т.п) а бота уже переписать с возможностью хостить по несколько игр, но все равно придется в сервере убирать для ботов лимит на вход с 1 аккаунта (я делал так что бот входит с 1 аккаунта несколько раз и может хостить несколько игр сразу, по 1 на каждый аккаунт)

В общем было бы проще если бы pvpgn 2.0 изначально писался вместе с ghost ботом для сервера, ждать чуда от OhSystem или других разработчиков думаю бессмысленно))

HarpyWar wrote:
Cub_bone wrote:

Допустим игрок написал /host 5 раз подряд, ему каждый раз выберется какой-нибудь бот и создаться 5 игр? (Если бот создаст игру с задержкой а не мгновенно)

Там не нужна задержка. Если написана команда /host, то в массив добавляется имя юзера с пометкой что он создал игру. При следующей попытке захостить проверяется, если в массиве есть этот юзер, то создание новой игры через бота запрещается.

То есть если бот не создаст игру(например с соединением что-то случится), игрока никто не оповестит, и он не сможет больше хостить?

14

Re: Вопрос по возможностям LuaEngine

update_dota_elo хорошо вписывается в задачу полностью на Lua. Я не разбирался как она работает, кажется, для неё своя база и таблицы в MySQL? Но через Lua сейчас нельзя выполнить "сырой" SQL запрос к базе. Для этого в коде PvPGN нужно написать и экспортировать соответствующие функции.
Либо попробовать подключить существующие модули, которые смогли бы добавить прямые функции MySQL в скрипты. На Windows проблемы с поиском нужных DLL библиотек и их компиляцией, но на Linux все ок (luarocks.org).

Cub_bone wrote:

То есть если бот не создаст игру(например с соединением что-то случится), игрока никто не оповестит, и он не сможет больше хостить?

Насколько помню, там это тоже было продумано, и реализовано через истекшее время пинга от бота. Где-то записывается время последнего ответа от бота. Если бот не ответил заданное в config.lua время config.ghost_ping_expire, то при следующей попытке хостить юзер удаляется из массива, и команда на хост отправляется к другому свободному боту.

Do not ask for support in PM.

15 (edited by Karaulov 27.11.2016 18:32)

Re: Вопрос по возможностям LuaEngine

Ну Update Dota Elo начисляет очки за игру, перебирает непроверенные игры , берет оттуда данные сохраненные ботом и начисляет PTS по какой-нибудь формуле ну и ливы дает, стрики и т.п, если правильно все сделать.

При изменении формулы вроде бы легко запустить пересчет заново просто удалив список игр. (Хотя точно не помню)

Раньше интересно было как-то переписывать сервер, ботов, сейчас что-то не очень)

Добавлено: 27.11.2016 17:19

Погуглил оказалось aura-bot еще какой-то есть https://github.com/Josko/aura-bot активный проект, только там от бота наверно ничего не осталось почитал что половину кода вырезали)

16

Re: Вопрос по возможностям LuaEngine

Может скажете что надо в Ghost пихать какие команды или обработки мы попробуем поработать над этим big_smile

17

Re: Вопрос по возможностям LuaEngine

Сторонние Lua модули можно подключать к скриптам без изменения кода PvPGN, и в этом тоже свой плюс.

Beats wrote:

Может скажете что надо в Ghost пихать какие команды или обработки мы попробуем поработать над этим big_smile

Попробуйте поработать над этим https://github.com/Grief-Code/OHSystem/issues/279

Do not ask for support in PM.

18

Re: Вопрос по возможностям LuaEngine

HarpyWar wrote:

Сторонние Lua модули можно подключать к скриптам без изменения кода PvPGN, и в этом тоже свой плюс.

Beats wrote:

Может скажете что надо в Ghost пихать какие команды или обработки мы попробуем поработать над этим big_smile

Попробуйте поработать над этим https://github.com/Grief-Code/OHSystem/issues/279

А всё разобрался просто конфиги сменил на /ghost <текст бота> а также бот чуток изменил.. Использую простой ghost ++. Короче сервер обращается к боту типо создай игру и бот создает а потом уже овнер через бота справляется а также бот пишет себе в личку !swap !open big_smile

19

Re: Вопрос по возможностям LuaEngine

Beats wrote:

А всё разобрался просто конфиги сменил на /ghost <текст бота> а также бот чуток изменил.. Использую простой ghost ++. Короче сервер обращается к боту типо создай игру и бот создает а потом уже овнер через бота справляется а также бот пишет себе в личку !swap !open big_smile

Эко у вас все быстро! За 5 минут ознакомился с диздоком по ссылке, просто конфиги сменил, бот чуток изменил и все работает? Вы говорите про соединение Ghost и PvPGN с Lua, или про своё решение без Lua?

Do not ask for support in PM.

20

Re: Вопрос по возможностям LuaEngine

HarpyWar wrote:
Beats wrote:

А всё разобрался просто конфиги сменил на /ghost <текст бота> а также бот чуток изменил.. Использую простой ghost ++. Короче сервер обращается к боту типо создай игру и бот создает а потом уже овнер через бота справляется а также бот пишет себе в личку !swap !open big_smile

Эко у вас все быстро! За 5 минут ознакомился с диздоком по ссылке, просто конфиги сменил, бот чуток изменил и все работает? Вы говорите про соединение Ghost и PvPGN с Lua, или про своё решение без Lua?

С lua  big_smile  big_smile . Да и хотел сказать что команда /swap /open /close и т.д ещё сырая. Мне бы сказать чтобы вы доделали её? smile

21

Re: Вопрос по возможностям LuaEngine

Beats, так выложите на гитхаб исходники своего бота, который работает с командами Lua от PvPGN. Многим он будет полезен, и общими силами можно довести его до нормального рабочего состояния.

Как раз /swap /open /close должны быть самые простые команды, которые, без какой либо логики, лишь перенаправляют команды боту. Какие у них недоработки?

Do not ask for support in PM.

22

Re: Вопрос по возможностям LuaEngine

HarpyWar wrote:

Beats, так выложите на гитхаб исходники своего бота, который работает с командами Lua от PvPGN. Многим он будет полезен, и общими силами можно довести его до нормального рабочего состояния.

Как раз /swap /open /close должны быть самые простые команды, которые, без какой либо логики, лишь перенаправляют команды боту. Какие у них недоработки?

К сожалению он не сможет выложить соурс бота.
Бот стандартный GhostOne last rev. с добавлением нескольких фич, типо "временная админка", "личный банлист" и прочее...

23

Re: Вопрос по возможностям LuaEngine

HarpyWar wrote:

Как раз /swap /open /close должны быть самые простые команды, которые, без какой либо логики, лишь перенаправляют команды боту. Какие у них недоработки?

а как включать эти команды? /swap /open /close ...

работает только /host /chost

и ещо хз как работает /ghost . вроде ничего не показывает он в чате

Posts: 23

Pages 1

You must login or register to post a reply

Who now at forum

Currently view post: 0 guests, 0 registered users

forums.pvpgn.pro → [RU] Research & Development → Вопрос по возможностям LuaEngine