что такое lua в самп
SAMP.Lua
Изначально эта библиотека задумывалась как простой апи исключительно для обработки сетевых пакетов, но в процессе было решешо, что лучше бы сделать её полноценной библиотекой для работы с сампом, в будущем это позволит избавить от необходимости использования SAMPFUNCS. Пока реализован только модуль, значительно упрощающий работу с пакетами, так что говорить сейчас будем о нём.
SAMP.Events
Этот модуль добавляет событийную обработку входящих и исходящих RakNet пакетов. Имеет удобный API, полностью кастомизируем, предоставляет те же возможности, что и обычные хуки: чтение, перезапись, игнорирование.
Использование
Простой пример обработки исходящего сообщения в чат:
Структуры всех пакетов находятся в файле events.lua.
Это применимо только в событиях onSendPlayerSync, onSendVehicleSync, onSendPassengerSync, onSendAimSync, onSendUnoccupiedSync, onSendTrailerSync, onSendBulletSync, onSendSpectatorSync.
Структуры всех пакетов синхронизации находятся в файле synchronization.lua.
Новый тип тоже можно добавить без изменения исходников библиотеки:
Скачать последнюю версию и следить за изменениями всегда можно на GitHub.
Установка: скачать samp.zip из последнего релиза и целиком скопировать папку ‘samp’ (не содержимое папки!) из архива в каталог ‘moonloader/lib/’.
Любая помощь в разработке приветствуется, особенно с добавлением новых структур. Предложите Pull request на гитхабе или напишите в этой теме.
Ну и конечно же крохотное нано-спасибо hnnssy за помощь.
Garrus
Участник
[15:20:25] SAMPFUNCS v5.3.3 release #19 (SA-MP 0.3.7) loaded. Base address: 0x042B0000.
[15:20:25] Compiled: Aug 8 2016 13:19:58
[15:20:25] Initializing opcodes.
[15:20:25] Opcodes initialized successfully. Total opcodes count: 382.
[15:20:27] samp.dll base addres: 0x02FA0000
[15:20:27] Installing hooks:
[15:20:27] Hook command process input installed.
[15:20:27] Hook on dialog response installed.
[15:20:27] Hook init netgame installed.
[15:20:27] Hook QuitGameHook installed.
[15:20:27] All hooks installed.
[15:20:42]
[15:20:42]
MoonLoader v.021-alpha loaded.
[15:20:42]
[15:20:42]
[15:20:42]
[15:20:42]
[15:20:42]
[15:20:42]
[15:20:42]
[15:20:42]
[15:20:42]
[15:20:42]
[15:20:42]
[15:20:42]
[15:20:42]
[15:20:42]
[15:20:43] Direct3DDevice9 hook installed.
[15:20:44] Hook RakPeer::HandleRPCPacket installed.
[15:20:44] Initializing SAMP data.
[15:20:44] Info initialized.
[15:20:44] Pools initialized.
[15:20:44] Player pool initialized.
[15:20:44] Vehicle pool initialized.
[15:20:44] Chat initialized.
[15:20:44] Input initialized.
[15:20:44] Death list initialized.
[15:20:44] Dialog initialized.
[15:20:44] Misc data initialized.
[15:20:44] Scoreboard initialized.
[15:20:44] RakNet initialized.
[15:20:44] ==========================================
[15:20:44] SAMPFUNCS v5.3.3 release #19 (SA-MP 0.3.7)
Compiled: Aug 8 2016 13:18:13
Author: FYP
Active developers: FYP, SR_Team, EXPORT
Past developers and special thanks:
MogAika, urShadow, legend2360, NarutoUA, Dark_Knight
[16:00:25] > SCM Thread:
hj 00A903D0 00000000 00A561AD true
noname 00A904B0 00000000 00A56B07 true
intman 00A90590 00000000 00A56FDA true
main 00A90750 00000000 00A56091 true
benzo xy 042A87F8 0B7C0048 0B7C0194 true
Гайд #3 | Работа с библиотекой SAMP.lua
UFDHBI
Гениальный
Все, библиотеку мы установили, переходим к написанию скриптов.
Я создал файл Hooks.lua, кодировка windows 1251.
Поместил туда шаблон:
Подключим нашу библиотеку:
Попробуем отловить входящий пакет о присоеденении игрока к серверу на котором вы находитесь, пишем следующий код:
Мы написали код который будет отлавливать пакеты с информацией о том что игрок присоеденился к серверу, но никак мы не обработали, давайте выведем в чат кто присоеденился и с каким ID.
Теперь каждый раз когда кто-то присоединяется к серверу мы видим сообщение в чате:
nickname[id] присоединился к серверу.
Теперь перехватим входящее сообщение от сервера
Давайте сделаем, чтобы все сообщения которые нам приходят от сервера были зелеными.
Информация Гайд Всё о Lua скриптинге для MoonLoader
Для лёгкой и удобной работы с кодом Lua скриптов вам понадобится настроить для себя среду разработки. Для работы с Lua достаточно любого текстового редактора, но какой-нибудь блокнот Windows для этого подходит совсем плохо, поэтому лучше использовать специализированные программы. На текущий момент полная поддержка MoonLoader есть в Atom и Notepad++, помимо этого есть пользовательские дополнения для Visual Studio Code и Sublime Text.
Проект по-умолчанию.
В меню File выбираем пункт Open Folder. и указываем путь до папки moonloader, после этого она откроется как проект.
Проект по-умолчанию.
Как и в Atom, здесь есть возможность показа меню проекта, а точнее «Папка как Проект». В меню «Файл» выбираем пункт «Открыть Папку как Проект» и указываем путь к папке «moonloader».
Кодировка по-умолчанию.
Над лентой выбираем пункт Опции и переходим в Настройки. В меню слева выбираем пункт Новый документ и в разделе кодировки ставим флажок на список, в котором выбираем кодировку Windows-1251
После установки среды разработки, изучения основ Lua и ознакомления с документацией MoonLoader, можно приступать от теории к практике. Давайте сначала рассмотрим самое основное, на всякий случай.
В этом примере показаны не все директивы, за полным списком обращайтесь к соответствующей странице на вики.
События и колбэки
Событиями, а точнее их обработчиками, в MoonLoader называются функции, вызывающиеся в скриптах автоматически при каком-либо действии в игре, требующим обработки. Обработчики событий могут иметь входящие и возвращаемые параметры: входящие передают какую-то информацию скрипту, а возвращаемые позволяют повлиять на дальнейшую обработку после совершения события.
Зарегистрировать обработчик события можно двумя способами: просто добавить в скрипт функцию с соответствующим именем, либо воспользоваться функцией addEventHandler. Учтите, что первым способом обработчик может быть зарегистрирован только один раз.
Скрипты с зарегистрированными событиями не завершаются самостоятельно.
Пример: onScriptTerminate вызывается при завершении какого-либо скрипта
С основными принципами разработки вы теперь знакомы и при этих знаниях сможете выполнить большинство задач, однако некоторые задачи требуют применения специальных техник. Давайте рассмотрим некоторые из них.
Создание модулей
Модули делятся на два типа: Lua и DLL. Lua-модули пишутся, как вы уже могли догадаться, на языке Lua и в результате представляют из себя привычные Lua-скрипты, только с некоторыми особенностями.
Давайте рассмотрим пример простого модуля, назовём его example:
seven.
vk.com/nanseven
Функционал мультиплеера
На данный момент мультиплеер обладает большим количеством возможностей, а его исходный код наполнен множеством примеров того, как можно патчить определенные функции GTA: San Andreas при помощи встроенной библиотеки memory и Lua FFI. Некоторые тестеры мультиплеера уже успели написать свои гейммоды, которые могли бы претендовать на стандарт того, как рекомендуется писать моды.
Чат тестеров модификации и её разработчиков ВКонтакте: присоединиться
Чат с разработчиками SL-Team для сторонник разработчиков: присоединиться
Последние версии модификации на GitHub Releases: посмотреть релизы
Канал SL:MP в Telegram с возможностью обсуждать релизы: присоединиться
Топик на английском языке на GTAForums: посмотреть
Группа ВКонтакте с новостями и прочим материалом: посмотреть
Поддержать проект материально: поддержать
Сервер проекта в Discord (преимущественно английский): присоединиться
Ку, вообщем нам с @Pakulichev пришла весьма самоубийственная идея, сделать мультиплеер на Lua, для GTA:SA. Частично у нас реализовать некоторые моменты, а именно:
1) Синхронизация игроков (OnFoot, но она довольно паршивая, но она есть, тестировалась в одиночной игре), попытка синхронизации игроков в машине (куски кода остались в сервере и клиенте).
2) Клиент с которого можно подключиться к SLMP серверу, по IP адресу и нику.
3) Сервер который обрабатывает некоторые пакеты и отсылает их игрокам
4) Мини гейм мод который способен отлавливать подключения игроков к серверу и отключения игроков.
5) Есть мини зона стрима
Если у вас открыты порты и запущен сервер на компе, то другие игроки смогут подключиться к вам в игру. Клиент и сервер полностью сделаны на библиотеке socket, пакеты отсылаются по протоколу UDP.
Сервер имеет конфликты с SA:MP, если вы подключены к серверу самп у которого порт 7777, то вы не сможете с клиента подключиться к серверу SLMP (да слмп сервер на 7777 порте), в одиночной игре все будет норм.
Скриншот консоли сервера:
(тоже написан на луа)
Видео с разработки:
1) Первая версия синхронизации игроков:
Инструкция по установке клиента:
1) Файл client.lua закидываете в папку MoonLoader (активация меню клиента ALT + 1)
2) Модуль MULTIPLAYER нужно перекинуть в папку moonloader/lib
3) Установить модули «socket», «imgui» если их нету.
Инструкция по запуску своего сервера SL:MP:
1) Главный файл для запуска start.bat
2) core.lua само ядро сервера.
3) Папка gamemodes папка для игровых режимов, в ней лежит стандартный игровой режим.
Сервер автоматически запускается на локальном ип с портом 7777. (ядро сервера лучше не трогать, если не знаете что в нем делать)
Причиной слива этого мини мультиплеера послужило решение разрабатывать собственный мультиплеер на С++
SAMP.Lua
Изначально эта библиотека задумывалась как простой апи исключительно для обработки сетевых пакетов, но в процессе было решешо, что лучше бы сделать её полноценной библиотекой для работы с сампом, в будущем это позволит избавить от необходимости использования SAMPFUNCS. Пока реализован только модуль, значительно упрощающий работу с пакетами, так что говорить сейчас будем о нём.
SAMP.Events
Этот модуль добавляет событийную обработку входящих и исходящих RakNet пакетов. Имеет удобный API, полностью кастомизируем, предоставляет те же возможности, что и обычные хуки: чтение, перезапись, игнорирование.
Использование
Простой пример обработки исходящего сообщения в чат:
Структуры всех пакетов находятся в файле events.lua.
Это применимо только в событиях onSendPlayerSync, onSendVehicleSync, onSendPassengerSync, onSendAimSync, onSendUnoccupiedSync, onSendTrailerSync, onSendBulletSync, onSendSpectatorSync.
Структуры всех пакетов синхронизации находятся в файле synchronization.lua.
Новый тип тоже можно добавить без изменения исходников библиотеки:
Скачать последнюю версию и следить за изменениями всегда можно на GitHub.
Установка: скачать samp.zip из последнего релиза и целиком скопировать папку ‘samp’ (не содержимое папки!) из архива в каталог ‘moonloader/lib/’.
Любая помощь в разработке приветствуется, особенно с добавлением новых структур. Предложите Pull request на гитхабе или напишите в этой теме.
Ну и конечно же крохотное нано-спасибо hnnssy за помощь.
Teen_Spirit
Участник
Известный
Баг в onMarkersSync. Удаляясь от центра мира (0, 0, 0), по координатам начинают приходить значения от 60000 и больше. Первые координаты которые приходят нормальные но все последующие невалидные. В самой игре маркеры нормально отображаются. Проверялось на разных серверах и даже на локалке, в отмеченных координатах для примера по X и Y значения больше 60000. Moonloader v.026.5-beta, версия SAMP.Lua v2.2.0
Известный
Horsi
Новичок
SA-MP 0.3.7
Exception At Address: 0x6DFE77D8
Base: 0x03DC0000
the Registers:
the EAX: 0x0F8D26A0 the EBX: 0x0000010A the ECX: 0x00000000 the EDX: 0x00000000
ESI: 0x154B8EF8 EDI: 0x154B8EF8 the EBP: 0x0F8101C0 the ESP: 0x0177F098
the EFLAGS: 0x00210202
the Stack:
+0000: 0xFFFFD8F0 0x6E029325 0x154B8EF8 0xFFFFD8F0
+0010: 0x00000000 0xFFFFFFFF 0x21A24850 0x0F810D58
0020 : 0x6E39A935 0x154B8EF8 0xFFFFD8F0 0x0000010A
0.03 thousand: 0x21A24850 0x6E2B0957 0x6E289D70 0x0F8102CC
0 040: 0x6E289D99 0x154B94F0 0x0F8101C0 0x00000001
0.05 thousand: 0x6DFE280D 0x0F8101C0 0x00008002 0x0F83A150
0060: 0x0177F234 0x0177F1B4 0x00000001 0x0F8101C0
0 070: 0x00000005 0x1319A830 0x0177F258 0x6E004360
+0080: 0x0F810100 0x000F5F21 0x0F8101F0 0x0F8101C0
+0090: 0x6E007AFB 0x0F8101C0 0x0177F234 0x00000001
+ 00A0: 0xFFFFFFFF 0x0F8101F0 0x154B94D0 0x0177F174
+ 00B0: 0x0F8101F0 0x6E007D07 0x0F8101F0 0x0F8101C0
+ 00C0: 0x0F869FE8 0x154B94D0 0x0F8101F0 0x0F8101C0
+ 00D0: 0x0F89E8F4 0x0177F180 0x6E0477FF 0x0000076C
+ 00E0: 0x6E0076C0 0x0F8101C0 0x0F810370 0x0F8101C0
+ 00F0: 0x0177F234 0x0F89E8F0 0xFFFFFFFC 0x0F8101C0
+0100: 0x6E026EAC 0x0F810D58 0x0F841440 0x0F8B0668
0110: 0x0F8101C0 0x00000002 0x00000000 0x0F810370
0.12 thousand: 0x0177F1D4 0x0F89E8F0 0x6DFE437F 0x00000000
0130: 0x00000000 0x00000000 0x00000000 0x80000000
+0140: 0x41777F6A 0x00000000 0x40580000 0x0000002E
+0150: 0x00000000 0x3EBCDE3C 0x3F6D88A0 0xBF6DE835
+0160: 0x3EBD0DD0 0x3C896F6A 0x3D55B409 0x00000000
+0170: 0x40580000 0x00000000 0x40580000 0x00000001
+0180: 0x00000001 0x0000004F 0x0F841440 0x0177F234
+0190: 0x0F873DE8 0x0F8B0668 0x0F841440 0x0F810D58
+ 01A0: 0x6E4AFB23 0x0F8B0668 0x0F841440 0x0177F250
+ 01B0: 0x6E4B2587 0x0F89E8F0 0x0177F274 0x6DE0F543
+ 01C0: 0x0177F310 0x6E004360 0x00000000 0x0F83A130
+ 01D0: 0x0F8101F0 0x04FBED80 0x6DFE73EB 0x0F8101C0
+ 01E0: 0x00000000 0x00000000 0x00000008 0x0F8101C0
+ 01F0: 0x00000001 0x0177F340 0x6E289472 0x0F8101C0
+0200: 0x00000002 0x00000001 0xFFFFFFFF 0x0F8101C0
+0210: 0x0177F340 0x0177F31C 0x04FBED80 0x6E3A7C01
+0220: 0x0177F340 0x0177F388 0x0177F388 0x00000002
+0230: 0x0177F304 0x0177F3DC 0x01C79A54 0x04FBED80
+0240: 0x00000000 0x00000000 0x00000000 0x00000000
+0250: 0x00000000 0x00000000 0x00000000 0x00000000
+0260: 0x00000000 0x0177F2A0 0x0177F398 0x04FBED88
+ 0270: 0x00000001 0x00000000 0x0177F398 0x6E402A69
SCM Op: 0x685, lDbg: 0 LastRendObj: 19045
Game Version: US 1.0
Dark_Knight
Начинаем начинать
SA-MP 0.3.7
Exception At Address: 0x6DFE77D8
Base: 0x03DC0000
the Registers:
the EAX: 0x0F8D26A0 the EBX: 0x0000010A the ECX: 0x00000000 the EDX: 0x00000000
ESI: 0x154B8EF8 EDI: 0x154B8EF8 the EBP: 0x0F8101C0 the ESP: 0x0177F098
the EFLAGS: 0x00210202
the Stack:
+0000: 0xFFFFD8F0 0x6E029325 0x154B8EF8 0xFFFFD8F0
+0010: 0x00000000 0xFFFFFFFF 0x21A24850 0x0F810D58
0020 : 0x6E39A935 0x154B8EF8 0xFFFFD8F0 0x0000010A
0.03 thousand: 0x21A24850 0x6E2B0957 0x6E289D70 0x0F8102CC
0 040: 0x6E289D99 0x154B94F0 0x0F8101C0 0x00000001
0.05 thousand: 0x6DFE280D 0x0F8101C0 0x00008002 0x0F83A150
0060: 0x0177F234 0x0177F1B4 0x00000001 0x0F8101C0
0 070: 0x00000005 0x1319A830 0x0177F258 0x6E004360
+0080: 0x0F810100 0x000F5F21 0x0F8101F0 0x0F8101C0
+0090: 0x6E007AFB 0x0F8101C0 0x0177F234 0x00000001
+ 00A0: 0xFFFFFFFF 0x0F8101F0 0x154B94D0 0x0177F174
+ 00B0: 0x0F8101F0 0x6E007D07 0x0F8101F0 0x0F8101C0
+ 00C0: 0x0F869FE8 0x154B94D0 0x0F8101F0 0x0F8101C0
+ 00D0: 0x0F89E8F4 0x0177F180 0x6E0477FF 0x0000076C
+ 00E0: 0x6E0076C0 0x0F8101C0 0x0F810370 0x0F8101C0
+ 00F0: 0x0177F234 0x0F89E8F0 0xFFFFFFFC 0x0F8101C0
+0100: 0x6E026EAC 0x0F810D58 0x0F841440 0x0F8B0668
0110: 0x0F8101C0 0x00000002 0x00000000 0x0F810370
0.12 thousand: 0x0177F1D4 0x0F89E8F0 0x6DFE437F 0x00000000
0130: 0x00000000 0x00000000 0x00000000 0x80000000
+0140: 0x41777F6A 0x00000000 0x40580000 0x0000002E
+0150: 0x00000000 0x3EBCDE3C 0x3F6D88A0 0xBF6DE835
+0160: 0x3EBD0DD0 0x3C896F6A 0x3D55B409 0x00000000
+0170: 0x40580000 0x00000000 0x40580000 0x00000001
+0180: 0x00000001 0x0000004F 0x0F841440 0x0177F234
+0190: 0x0F873DE8 0x0F8B0668 0x0F841440 0x0F810D58
+ 01A0: 0x6E4AFB23 0x0F8B0668 0x0F841440 0x0177F250
+ 01B0: 0x6E4B2587 0x0F89E8F0 0x0177F274 0x6DE0F543
+ 01C0: 0x0177F310 0x6E004360 0x00000000 0x0F83A130
+ 01D0: 0x0F8101F0 0x04FBED80 0x6DFE73EB 0x0F8101C0
+ 01E0: 0x00000000 0x00000000 0x00000008 0x0F8101C0
+ 01F0: 0x00000001 0x0177F340 0x6E289472 0x0F8101C0
+0200: 0x00000002 0x00000001 0xFFFFFFFF 0x0F8101C0
+0210: 0x0177F340 0x0177F31C 0x04FBED80 0x6E3A7C01
+0220: 0x0177F340 0x0177F388 0x0177F388 0x00000002
+0230: 0x0177F304 0x0177F3DC 0x01C79A54 0x04FBED80
+0240: 0x00000000 0x00000000 0x00000000 0x00000000
+0250: 0x00000000 0x00000000 0x00000000 0x00000000
+0260: 0x00000000 0x0177F2A0 0x0177F398 0x04FBED88
+ 0270: 0x00000001 0x00000000 0x0177F398 0x6E402A69
SCM Op: 0x685, lDbg: 0 LastRendObj: 19045
Game Version: US 1.0