Исходник Полноценный исходник фракционного(МО) скрипта ARP

Нужна ли вам web часть данного проекта со всеми обработчиками и панелью разработчика?


  • Всего проголосовало
    21
  • Опрос закрыт .

Frapsy

Известный
Автор темы
Проверенный
393
226
CS6Dk.png


Утро/день/вечер/ночи доброй, собутыльники по 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 - меню взаимодействия
Скриншоты пользовательского интерфейса

Теперь затрону самое необычное этого исходника, это работа с сетью(магию которой надо до вас донести, чтобы не сталкивались потом), без которой скрипту не продохнуть:
Прежде всего затронем тот факт, что скрипте используется два вида работы с сетью:
  • 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)
Так что, держите на заметку, если у вас крашит скрипт и крашит по рандом причинам, указывая функции, которые вы не трогали вообще и при этом в скрипте используется работа с сетью, а именно - как минимум несколько асинхронных запросов, то рекомендую вам проверить их на предмет конфликтов самих с собой. В исходнике есть примеры как downloadUrlToFile(), так и request с асинхронными(GET/POST запросы).


Измененные скрипты, которые были интегрированы в исходник:
  • 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 реализовать у себя.

VK-Int, или проще говоря - интеграция ВК:
К сожалению, 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 часть писалась мною без запар за качество кода, главное - работоспособность и стабильность. Отсутствуют интерфейсы статистики/админки, а так же передача токена группы ВК скрипту(ввиду отсутствия безопасной реализации) и обработчика сообщений группы ВК(небольшая и простенькая системка безопасности на случай коней).
 

Вложения

  • mo(opensource).lua
    259.8 KB · Просмотры: 1,324
  • web.zip
    7.8 KB · Просмотры: 368
Последнее редактирование модератором:

AnWu

Guardian of Order
Всефорумный модератор
4,659
5,057
Когда я начал читать мне было 13. Теперь 21.
Проверка на дубль клавиши через rkeys.isHotKeyDefiend если я его доделал :)
 

Frapsy

Известный
Автор темы
Проверенный
393
226
Проверка на дубль клавиши через rkeys.isHotKeyDefiend если я его доделал :)
Заметил, что эта штучка в коде есть, ибо вытаскивал ее с PerfectBinder'a, ибо я банально не вдуплял как работать с новым imcustom :D Но, все же одинаковые клавиши назначать дает + если несколько одинаковых клавиш на разные моменты - все сработают ;D
"Когда то меня вела дорога приключений, но однажды мне пристрелили колено.", так описывается процесс написания всего этого скрипта :D
 

Aniki

🐰
Администратор
1,224
1,488
Ахаха, для меня откровение что тут есть что-то от меня. И все же, что тебя побудило залить сюда исходник? Отпиши хотя бы в ЛС
 
  • Нравится
Реакции: Frapsy

Frapsy

Известный
Автор темы
Проверенный
393
226
Ахаха, для меня откровение что тут есть что-то от меня. И все же, что тебя побудило залить сюда исходник? Отпиши хотя бы в ЛС
Да скрывать по сути нечего ;D На АРП падает онлайн, еще в начале года может и были какие то шансы, но "АРП 20!8 Перезагрузка".. Это скорее "Критическая ошибка". Игроков, которым был бы интересен РП процесс все меньше и меньше, людей волнует только полный автоматизм ради отчетов.. Я не сторонник полной автоматизации и у меня есть интерес к РП процессу, будучи ГСом МО я хотел добавить возможностей, которые АРП никогда не введет(Пентагон, досье военных, выговоры/наряды и в этом духе, что можно было бы использовать в РП процессе), но за время разработки я понял, что это никому не нужно. Личный интерес к продолжению разработки скрипта падает(буду лишь изредка обновлять по мелочам), ни копейки за функционал я не получал(привет МВД Хелперу, который берет деньги за простые функции), по этому и решил, что пусть исходник останется у людей, которые хотят понять, как и что работает на примере не маленького скрипта, ибо по маленьким луашным исходникам новичкам толком ничего не понять(или же интереса нет), а когда у них перед носом что-то более крупное, то наверно на подсознательном уровне интерес понять, как это работает, больше(говорю по себе, быть может у каждого это по разному). Еще мне жалко людей, которые платят разрабам подобных скриптов, когда в них нет ничего особенного. Ну и напоследок, когда то и я был в танке, не понимал вообще ничего, был бы у меня этот исходник тогда, когда я начинал - было бы чуточку проще. Как то так ;D
Как минимум запилить мини-обновление для MVD-Helper'а
Оййй, есть еще один чел, который из моего скрипта вытаскивал то идейки, то названия, это норма :D
 

Frapsy

Известный
Автор темы
Проверенный
393
226
Шо, исходник ммедитора на очереди? :D
От MMEditora тут только принцип считывания статистики игрока ;D Ибо на порах своего обучения так сказать, я выносил мозг Игорю :D
Для изучения того, как это работает - безусловно полезно
Это одна из основных целей, ибо не каждый поймет таблицы, JSON, как с сетью работать и какие проблемки могут быть.
Для того чтобы брать скрипт за основу другого - не очень идея, лучше начинать с чего то попроще в начале изучения скриптинга.
Конкретно этот за основу в данном виде - не взять, тут не пердануть свободно без обработчиков, к которым скрипт обращается для корректной работы.

UPD: Функция random_messages() переписана Vincent Vercetti(я бы переписал, но не задумывался об этом :D), теперь она на таблицах. Так же исправил баг, который не давал скрипту работать, если тот не смог подключиться к базе.
 
Последнее редактирование:

RoffDaniel

Известный
77
20
Это, прикрепи пожалуйста папку lib из moonleader`a, а то у меня не все библиотеки есть
 

Bogach

Активный
558
27
Охренеть. Это самый крупный скрипт который я только видел. MVD Helper по сравнению с ним просто мизерный скриптец. Респект тебе. Эх, а я все imGui освоить не могу. :sorry:
 

Frapsy

Известный
Автор темы
Проверенный
393
226
Охренеть. Это самый крупный скрипт который я только видел. MVD Helper по сравнению с ним просто мизерный скриптец. Респект тебе. Эх, а я все imGui освоить не могу
Спасибо, МВД хелпер отличается от данного скрипта не многим, но самое огромное отличие - бесплатность и доступность, хоть и функционал считай почти на равне ;D В исходнике достаточно примеров по работе с ImGui, так что дерзай, убирай/добавляй по примерам и по-тихоньку начнешь понимать что да как.
 

Bogach

Активный
558
27
1. Что означает вопрос. знак после знака "_" ?
Lua:
name, reason = line:match("(%a+_?%a+)(.+)")
2. assert - Это типа проверка на существование этой библиотеки ?
Lua:
local res, sampev = pcall(require, 'lib.samp.events')
assert(res, 'Library SAMP Events not found')