что такое 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
Как писать луа скрипты самп
Перед продолжением необходимо установить сам MoonLoader, желательно через программу установки и с дополнительными инструментами:
1. Скачайте установщик MoonLoader последней версии и запустите, следуйте шагам программы установки
2. На странице выбора компонентов отметьте нужные скрипты (рекомендуется выбрать все)
Для лёгкой и удобной работы с кодом Lua скриптов вам понадобится настроить для себя среду разработки. Для работы с Lua достаточно любого текстового редактора, но какой-нибудь блокнот Windows для этого подходит совсем плохо, поэтому лучше использовать специализированные программы. На текущий момент полная поддержка MoonLoader есть в Atom и Notepad++, помимо этого есть пользовательские дополнения для Visual Studio Code и Sublime Text.
После установки этого пакета вам будет предложено установить дополнительные пакеты, соглашаемся и забываем про это.
Проект по-умолчанию.
В меню File выбираем пункт Open Folder. и указываем путь до папки moonloader, после этого она откроется как проект.
Проект по-умолчанию.
Как и в Atom, здесь есть возможность показа меню проекта, а точнее «Папка как Проект». В меню «Файл» выбираем пункт «Открыть Папку как Проект» и указываем путь к папке «moonloader».
Кодировка по-умолчанию.
Над лентой выбираем пункт Опции и переходим в Настройки. В меню слева выбираем пункт Новый документ и в разделе кодировки ставим флажок на список, в котором выбираем кодировку Windows-1251
После установки среды разработки, изучения основ Lua и ознакомления с документацией MoonLoader, можно приступать от теории к практике. Давайте сначала рассмотрим самое основное, на всякий случай.
В этом примере показаны не все директивы, за полным списком обращайтесь к соответствующей странице на вики.
Использование библиотек
Библиотеки, либо модули всячески дополняют стандартный набор возможностей новыми и позволяют использовать в скриптах готовые инструменты для разработчиков. Модули делятся на стандартные и сторонние. Стандартные включены в дистрибутив MoonLoader и не требуют отдельной установки.
Все модули располагаются в директории moonloader/lib/ и устанавливаются туда же. Подключение библиотек осуществляется при помощи функции require, которая в качестве аргумента принимает название файла. Чаще всего подключение модулей производится в начале скрипта, но может быть выполнено в любом месте. Каждый модуль загружается отдельно для каждого скрипта.
Пример: Подключим модуль «vkeys», позволяющий работать с виртуальными клавишами.
С основными принципами разработки вы теперь знакомы и при этих знаниях сможете выполнить большинство задач, однако некоторые задачи требуют применения специальных техник. Давайте рассмотрим некоторые из них.
Создание модулей
Модули делятся на два типа: Lua и DLL. Lua-модули пишутся, как вы уже могли догадаться, на языке Lua и в результате представляют из себя привычные Lua-скрипты, только с некоторыми особенностями.
Давайте рассмотрим пример простого модуля, назовём его example:
Гайд #3 | Работа с библиотекой SAMP.lua
UFDHBI
Гениальный
Все, библиотеку мы установили, переходим к написанию скриптов.
Я создал файл Hooks.lua, кодировка windows 1251.
Поместил туда шаблон:
Подключим нашу библиотеку:
Попробуем отловить входящий пакет о присоеденении игрока к серверу на котором вы находитесь, пишем следующий код:
Мы написали код который будет отлавливать пакеты с информацией о том что игрок присоеденился к серверу, но никак мы не обработали, давайте выведем в чат кто присоеденился и с каким ID.
Теперь каждый раз когда кто-то присоединяется к серверу мы видим сообщение в чате:
nickname[id] присоединился к серверу.
Теперь перехватим входящее сообщение от сервера
Давайте сделаем, чтобы все сообщения которые нам приходят от сервера были зелеными.
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
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. (ядро сервера лучше не трогать, если не знаете что в нем делать)
Причиной слива этого мини мультиплеера послужило решение разрабатывать собственный мультиплеер на С++