- 393
- 227
Утро/день/вечер/ночи доброй, собутыльники по LUA скриптингу, в данной теме я распишу вам все о своем единственном, в какой то степени серьезным, детищем, которое разрабатывалось с начала мая 2018 года, когда я считал, что исходник LUA скрипта - это то, что я вижу по итогу после декомпиляции ;D Звучит упорото, тем не менее, так и есть.
Я знаю, что среди вас есть много новичков, таких, каким был однажды я, я прекрасно понимаю, что порой найти то, что вам необходимо - затруднительно для вас, ибо скажем прямо - вы в танке, я с этим сталкивался, поиск информации для меня был по началу не простым, но, со временем, я привык к теме "Вопросы по lua-скриптингу", научился пользоваться wiki и работать стало проще.
- Интерфейс 99% ImGui, 1% это скриптовые диалоговые окна.
- Цветовая схема дизайна подобрана самостоятельно, следовательно +1 оформление в сети.
- Используется шрифт font-awesome для применения иконок.
- Наглядный(хоть местами и не лучший) пример работы множества штучек, таких как:
- Таблицы;
- ImGui;
- Работа с сетью(requests, асинхронные запросы);
- Работа SAMP Events(правда раскрыта она тут слабо, ибо это простенький фракционный скрипт);
- Сохранение настроек inicfg;
- Переменные и с чем их едят;
- Работа с файлами(удаление/сохранение файлов, удаление папок, проверка наличия и т.п.);
- Немного работы с памятью;
- Работа с ImCustom + rkeys(его тут наверно мало, но либа все равно нужна :D);
- Тернарные условия(или выражение или оператор, заумные термины не по моей части), хоть и в виде реализации женского/мужского полов;
- Регулярные выражения
- И хрен поймешь что еще у меня там есть..
- Местами замудренный код, который обусловлен тем, что всяких мелочных штучек очень и очень много, которые между собой могут конфликтовать(привет асинхронным запросам ;D), да и исправления принимались по мере поступления жалоб на баги.
- Прокомментированный код, где в действительно непонятных местах описывается что да как.
- patch() - быстрая загрузка игры от KepchiK.
- files_add() - функция загрузки/проверки на наличие необходимых медиа файлов(звук, изображения).
- WriteLog() - запись данных в файл от Vincent Vercetti.
- getMessage() - получение ваших сообщений из диалога с сообществом в ВК.
- vkmessage() - отправка сообщений от имени сообщества людям в ВК.
- secure_vk() - получение токена с веб ресурса, ибо как показала практика, хранить токен в скрипте это приговор для сообщества ВК и его пользователей(shamanije, ку-ку).
- check_vk() - проверка пользователя по его ID на наличие в подписке к группе ВК.
- tags() - тэги для биндера.
- genCode() - генерация гугл-кода по резервному ключу, для автогугла.
- EmulShowNameTag() - эмуляция показа неймтега над бошкой игрока.
- saveSettings() - сохранение настроек пользователя скрипта.
- strobes() - стробоскопы, автор которых мне точно до сих пор не понятен, ибо эти стробоскопы мусолило несколько человек, малость доделал их в плане проверок.
- imgui.ToggleButton() - функция хомяка(Rio) из полезных кусков, которая заменяет мне чекбоксы.
- rcmd() - регистрация клавиш и команд для биндера.
- split() - чудо функция от FYP, без которой я бы не смог реализовать биндер :)
- registration() - проверка регистрации и непосредственная регистрация игрока в базе данных скрипта, проверка
- black_checker() - функция проверки игрока на наличие в ЧС по его id
- changeSkin() - функция визуальной смены скина себе и другим игрокам(автора не знаю, но пост с функцией видел от imring.
- addGangZone() и removeGangZone() - создание и удаление гангзон, эти функции я получил от Aniki.
/black [ID] - проверить игрока на наличие в ЧС МО + проверка /history на ЧС МО
/bb - обновление черного списка
/bhist [nickname] - проверка игрока на наличие в ЧС МО по истории ников
/rn [text] - отправка OOC сообщения в /r чат
/fn [text] - отправка ООС сообщения в /f чат
/rd [Пост] [Состояние] - Доклад в /r чат с ручным указанием поста и состояния
/fd [Пост] [Состояние] - Доклад в /f чат с ручным указанием поста и состояния
/where [ID] - запросить местоположение игрока в /r чат
/hist [ID] - проверить историю ников по ID
/ud [ID] - показать удостоверение
/cc - очистить весь чат
/ok [ID] - принять доклад от игрока в /r чат
/uninv [ID] [ID офицера] [Причина] - уволить игрока по просьбе офицера
/liv [ID] [Причина] - запросить отставку бойца
/drone - получить доступ к дрону
ПКМ + 1 - выполнить воинское приветствие
ПКМ + R - меню взаимодействия
/bb - обновление черного списка
/bhist [nickname] - проверка игрока на наличие в ЧС МО по истории ников
/rn [text] - отправка OOC сообщения в /r чат
/fn [text] - отправка ООС сообщения в /f чат
/rd [Пост] [Состояние] - Доклад в /r чат с ручным указанием поста и состояния
/fd [Пост] [Состояние] - Доклад в /f чат с ручным указанием поста и состояния
/where [ID] - запросить местоположение игрока в /r чат
/hist [ID] - проверить историю ников по ID
/ud [ID] - показать удостоверение
/cc - очистить весь чат
/ok [ID] - принять доклад от игрока в /r чат
/uninv [ID] [ID офицера] [Причина] - уволить игрока по просьбе офицера
/liv [ID] [Причина] - запросить отставку бойца
/drone - получить доступ к дрону
ПКМ + 1 - выполнить воинское приветствие
ПКМ + R - меню взаимодействия
Прежде всего затронем тот факт, что скрипте используется два вида работы с сетью:
- requests
- Асинхронные http(s) запросы by FYP
Я опущу перечисление всех мест(частичная подгрузка медиа файлов, проверка обновлений, получение токена ВК, регистрация/обновление аккаунта в БД скрипта, получение данных статистики из БД, отправка данных об авторизации в скрипте, получение списка пользователей для покраса и бла бла бла), где это используется и затрону только два самых основных, которые конфликтовали - функции vkmessage() и getMessage(). Изначально обе они были построены на асинхронных запросах, что в результате проверки показало, что все хорошо работает, но не тут то было. При длительной проверке всплыл баг(если его можно так назвать), который крашит скрипт указывая в логе функцию, которая к крашу вообще не относится и через раз эта функция рандомная(будь то клавиши или же определение района). Не долго думая, было предположено, что асинхронный запрос, который попадает в бесконечный цикл в случае, если активна интеграция ВК с отправкой и получением сообщений, со временем "столкнется" с другим асинхронным(в нашем случае это отправка сообщений vkmessage()) и скрипт уйдет в аут, только тогда до меня дошло, что слова FYP'a о том, что с ними надо быть осторожней, подтвердились. Функция vkmessage() была переписана на requests и проблема была решена :) Почему не переписал getMessage() под него? Да потому что это цикл с интервалом в 2 секунды, а ловить фризы 2 секунды - это не логично.
Помимо этого, не просто было найти решение, как делать асинхронные POST запросы, ибо пример FYP'a банально не работал, а сам не додумался.
Lua:
local postrequest = {}
postrequest.data = "srv="..tostring(srv)
postrequest.headers = { ['content-type']='application/x-www-form-urlencoded' }
async_http_request('POST', 'https://адрес-обработчика.ру/обработчик.php', postrequest,
function(response)
print("Запрос прошел: "..response.text)
end,
function(err)
print("Запрос не прошел: "..err)
end)
- Spur ImGUI от imring.
- Было исправлено проседание кадров при больших шпорах.
- Были убраны настройки и мультиязычность(ввиду ненадобности).
- Были исправлены моменты, когда создавались шпоры без названий, которые не поддавались редактированию.
- Был убран поиск по названию(ибо не имел смысла).
- Был исправлен поиск по тексту, теперь он выдает все как надо, единственный минус - просад кадров, исправить который я так и не додумался как.
- Прочие исправления по мелочам.
- CamHack от #sanek.
- Добавил 2 режима камеры(ночное видение/тепловизор)
- Убрал из исходника лишние строки, честно, от отсутствия которых я банально не ощутил разницы.
- Убраны функции, которые не нужны(по типу ГМа например) и по мелочам.
- GLONASS от qrlk.
- Было вырезано все, что не связано с передачей местоположения по координатам и квадрату с последующей установкой метки.
- Были исправлены мелкие косяки, которые были обнаружены в процессе пользования.
- cmd_reprimands() - выдача выговора игроку, если тот есть в базе скрипта.
- cmd_naryad() - аналогично, но с нарядами.
P.S. Функция с выговорами работает, но если память не изменяет(ибо использовал ее месяца 2 назад), то там скрипт будет вылетать с приветом от асинхронных :)
Для реализации клавиш(как скриптовых, так и биндера) используется imcustom хомяка(Rio) и rkeys. Чтобы ознакомиться с тем, как работают клавиши, то рекомендую вбить в поиск по исходнику: tBindList, mass_bind, onHotKey. Именно по этим ключевикам вы сможете найти все необходимое, чтобы разобраться что к чему.
Для реализации биндера пришлось писать функцию rcmd() самому, ибо тот горе биндер(хоть от части и рабочий), который лежит в сети - он очень и очень сырой, брать его под основу было невозможно. Благо, что FYP подарил народу функцию split(), которая сняла самый сложный для меня на тот момент вопрос - "как сделать биндер?". Весь биндер был написан(без тэгов) за ~6 часов с использованием таблиц, которые я вообще никогда не вдуплял. Касательно тэгов, то реализованы они простенько, ибо у меня ума не хватило, чтобы хотя бы какую то часть тэгов ScriptPatrol реализовать у себя.
К сожалению, LUA скрипты не умеют работать в момент, когда игра свернута(они работать могут только тогда, когда пауза), по этому пришлось сделать костыль, который нужно каждый раз включать, чтобы ВК работал. Суть костыля заключается в том, что как только мы включаем ВК, то мы включаем антиафк и одновременно нопаем онфутку, тем самым у нас активен антиафк, но персонаж на сервере стоит АФК и при этом цель достигнута - скрипт будет работать при свернутой игре.
Далее пришлось ознакомиться с VK API, поспрашивать знакомых "что, да как", понять, как работать с JSON'ом и в итоге наклепать функции. После функций нужно было налепить менюшку, настройки.. Это все мелочи, однако в итоге, скрипт теперь может отправлять сообщения вам в ВК и принимать ваши команды из того же ВК, которые будет исполнять в игре.
- Говорю сразу, в нем имеются неиспользуемые или же закомментированные функции/окна ImGUI.
- На данный момент это актуальная версия скрипта, а именно: 0.2.1 Stable.
- В целях безопасности, функция secure_vk() была переделана в OpenSource версии, так как проект еще живой, пользователи есть и поддержка продолжается в плане решения проблем/выпуска мелких обновлений, в связи с этим не рекомендую бежать делать копии МВД Хелперов с интеграцией ВК, которую не обезопасите от любителей пошалить с токеном сообщества.
- Скрипт полностью подогнан под ARP, однако, было время, когда я подгонял его под Аризону и ДРП, тем не менее понял, что я еще в здравом уме, по этому затею эту оставил в прошлом.
- Код далек от идеала, но и сверх-говняным его не считаю(кроме тех двух функций выше), я выкладываю исходник для новичков, чтобы им не приходилось ради простеньких вещей открывать исходник скрипта ImGUI на С++ в надежде понять что-то, помимо всего этого - это единственный исходник такого объема, так что, людям будет что выцепить, понять как работает..
- В коде 5879 строк(OpenSource версия).
Спасибо за помощь всем пользователям, которые отвечали на мои вопросы, спасибо тем, кто выкладывал свои исходники, что позволило мне узнать что-то новое, а после и вовсе - малость поправить косяки ваших скриптов, что дало мне практики :) Теперь шанс на практику даю я :P Надеюсь, что ничего не забыл.
Из минусов данного скрипта:
- Нет проверки на дубль клавиш(будь то скриптовые или от биндера), я так и не допер до этого.
- У некоторых пользователей ранее наблюдались фризы игры(сейчас не должно быть).
- Не самая быстрая прогрузка скрипта из-за загруженного main'a, хотя раньше было медленней(это я про доли секунд говорю, которые на глаз определял).
- Нет функции загрузки библиотек на случай, если они отсутствуют.
- Просад кадров при поиске в шпорах.
- Местами есть лишний код(например получение айдишника игрока и в этом духе), который появлялся по причине того, что он исправлял проблему пользователей(странно, но так и есть).
Автор MoD-Helper:
Xavier Adamson, он же Frapsy, он же Сергей Пархутик.
WEB часть писалась мною без запар за качество кода, главное - работоспособность и стабильность. Отсутствуют интерфейсы статистики/админки, а так же передача токена группы ВК скрипту(ввиду отсутствия безопасной реализации) и обработчика сообщений группы ВК(небольшая и простенькая системка безопасности на случай коней).
Xavier Adamson, он же Frapsy, он же Сергей Пархутик.
WEB часть писалась мною без запар за качество кода, главное - работоспособность и стабильность. Отсутствуют интерфейсы статистики/админки, а так же передача токена группы ВК скрипту(ввиду отсутствия безопасной реализации) и обработчика сообщений группы ВК(небольшая и простенькая системка безопасности на случай коней).
Вложения
Последнее редактирование модератором: