SAMP.Lua

Изначально эта библиотека задумывалась как простой апи исключительно для обработки сетевых пакетов, но в процессе было решешо, что лучше бы сделать её полноценной библиотекой для работы с сампом, в будущем это позволит избавить от необходимости использования SAMPFUNCS. Пока реализован только модуль, значительно упрощающий работу с пакетами, так что говорить сейчас будем о нём.

SAMP.Events
Этот модуль добавляет событийную обработку входящих и исходящих RakNet пакетов. Имеет удобный API, полностью кастомизируем, предоставляет те же возможности, что и обычные хуки: чтение, перезапись, игнорирование.


Использование
Простой пример обработки исходящего сообщения в чат:
Lua:
local sampev = require 'lib.samp.events'

function sampev.onSendChat(msg)
  print('You said: ' .. msg)
end
Да, настолько просто. Нужно лишь загрузить библиотеку и добавить функцию с соответствующими аргументами, вот и всё.
Перезапись данных в пакете настолько же проста, нужно лишь вернуть из функции все значения в том же порядке, занеся их в таблицу.
Lua:
function sampev.onSendChat(msg)
  return {'I said: ' .. msg}
end
Будет дописывать текст "I said:" в начало каждого отправляемого сообщения.
Если вернуть из функции false, то пакет будет проигнорирован клиентом. Этот код запретит серверу изменять позицию игрока:
Lua:
function sampev.onSetPlayerPos(position)
  print(string.format('Server tried to change your position to %0.2f %0.2f %0.2f', position.x, position.y, position.z))
  return false
end
Структуры всех пакетов находятся в файле events.lua.

Перезапись исходящих пакетов синхронизации слегка отличается от всех остальных - они не требуют возврата аргументов, а вместо этого данные перезаписываются как в обычной таблице lua. Это сделано для повышения производительности.
Пример перезаписи позиции в исходящих данных синхронизации игрока:
Lua:
function sampev.onSendPlayerSync(data)
  print('Original position:', data.position.x, data.position.y, data.position.z)
  data.position.x = 1337
  data.position.y = 1488
  data.position.z = 228
end
Это применимо только в событиях onSendPlayerSync, onSendVehicleSync, onSendPassengerSync, onSendAimSync, onSendUnoccupiedSync, onSendTrailerSync, onSendBulletSync, onSendSpectatorSync.
Структуры всех пакетов синхронизации находятся в файле synchronization.lua.


Примеры скриптов
AntiCarJack - перехват и игнорирование входящего RPC и пакета синхронизации
Bubble Sniffer - перехват и обработка входящего RPC
DerpCam - перезапись данных исходящего пакета синхронизации
Chat Bliss - перезапись, игнорирование и обработка исходящего RPC


Кастомизация
API структурирован так, что позволяет вносить в него любые изменения, не прибегая к изменению исходных файлов модулей.
Добавление своего обработчика для серверного пакета проигрывания звука:
Lua:
local sampev = 'lib.samp.events'
local raknet = 'lib.samp.raknet'
sampev.INTERFACE.INCOMING_RPCS[raknet.RPC.PLAYSOUND] = {'onPlaySound', {soundId = 'int32'}, {x = 'float'}, {y = 'float'}, {z = 'float'}}
И теперь в тот же файл можно добавить функцию для обработки события:
Lua:
function sampev.onPlaySound(sound, x, y, z)
-- добавляем сообщение в лог
print(string.format('Sound %d at coords %0.2f, %0.2f, %0.2f', sound, x, y, z))
-- и отключаем звук, запрещая дальнейшую обработку пакета
return false
end
Следует сразу разобрать код регистрации события, чтобы стало понятнее.
Lua:
sampev.INTERFACE. -- поле INTERFACE - это все экспортируемые элементы модуля
INCOMING_RPCS -- обращение к списку входящих RPC
[raknet.RPC.PLAYSOUND] -- обращение к элементу таблицы INCOMING_RPCS по индексу, в данном случае INCOMING_RPCS - это таблица, содержащая список структур всех входящих RPC, а raknet.RPC.PLAYSOUND - идентификатор требуемого RPC
= -- присваиваем ему новое значение - таблицу с информацией о событии и структурой пакета
{'onPlaySound', -- название события, функция события будет использовать это имя
-- структура пакета. каждый параметр должен быть заключен в отдельную таблицу, иметь название и тип в формате {названиеПараметра = 'тип'}
{soundId = 'int32'}, {coords = 'vector3d'}}
Очевидно, что INCOMING_RPCS - это не единственная таблица, их четыре:
INCOMING_RPCS - входящие RPC
OUTCOMING_RPCS - исходящие RPC
INCOMING_PACKETS - входящие пакеты
OUTCOMING_PACKETS - исходящие пакеты

Новый тип тоже можно добавить без изменения исходников библиотеки:
Lua:
events.INTERFACE.BitStreamIO.fvector3 = { -- название типа после последней точки
   read = function(bs) -- функция чтения. первый аргумент - битстрим
     local vec = {}
     vec.x = raknetBitStreamReadFloat(bs)
     vec.y = raknetBitStreamReadFloat(bs)
     vec.z = raknetBitStreamReadFloat(bs)
     return vec
   end,
   write = function(bs, value) -- функция записи
     raknetBitStreamWriteFloat(bs, value.x)
     raknetBitStreamWriteFloat(bs, value.y)
     raknetBitStreamWriteFloat(bs, value.z)
   end
}
В случае, если пакет имеет какую-то сложную структуру, не описываемую даже с помощью пользовательских типов, то вместо структуры можно передать функцию, которая будет обрабатывать данные. Например как это сделано для RPC InitGame:
Lua:
INCOMING_RPCS[RPC.INITGAME] = {'onInitGame', onInitGameReader, onInitGameWriter} -- второй и третий аргумент - это функции чтения и записи
Для большего количества примеров смотрите исходный код.

Что касается всей библиотеки в целом, то она ещё находится на зачаточной стадии и обсуждать кроме планов нечего. По сути она должна заменить собой основную часть SAMPFUNCS - моддинг сампа.

Скачать последнюю версию и следить за изменениями всегда можно на GitHub.
Установка: скачать samp.zip из последнего релиза и целиком скопировать папку 'samp' (не содержимое папки!) из архива в каталог 'moonloader/lib/'.

Любая помощь в разработке приветствуется, особенно с добавлением новых структур. Предложите Pull request на гитхабе или напишите в этой теме.

Ну и конечно же крохотное нано-спасибо hnnssy за помощь.
 
Последнее редактирование:

FYP

Известный
Автор темы
Администратор
1,758
5,722
в структуре имеется data.color (подумал что это значение для TextDrawColor)
это цвет модели. ну вообще да, следовало бы переименовать его в modelColor.
можно как-то объяснить как брать значения т.e alignment, prop, и тд я просто незнаю, он идет как read.int8(bs)
это битовое поле
C:
union
    {
        BYTE byteFlags;
        struct
        {
            BYTE byteBox : 1;
            BYTE byteLeft : 1;
            BYTE byteRight : 1;
            BYTE byteCenter : 1;
            BYTE byteProportional : 1;
            BYTE bytePadding : 3;
        };
    };
например, byteLeft и byteProportional можно прочитать с помощью bitex таким способом:
Lua:
local bitex = require 'bitex'

local left_align = bextract.bitex(data.flags, 1, 1)
local proportional = bextract.bitex(data.flags, 4, 1)
 

Salik_Davince

Известный
37
3
Подскажите где я делаю неправильно - RPC - SetPlayerAttachObject = не получается узнать оффсеты(позиции и тд) - object[offset.x] и делал object.offset.x, иногда просто крэшится GTA.

ФИП) Помоги я уже даже в Event'ах все поменял, незнаю что я делаю не так.

PHP:
string.format("AttachedObject - %d | %d | %d  ", playerId, index, object.modelId)
 
Последнее редактирование модератором:

CharleyJones

Известный
167
11
Кто поможет с установкой, не понял ничего что и как. Буду благодарен.
 

hnnssy

Известный
Друг
2,684
2,748
Кто поможет с установкой, не понял ничего что и как. Буду благодарен.
тебе это не нужно, это для разработчиков.
но всё же
Установка: скачать samp.zip из последнего релиза и целиком скопировать папку 'samp' (не содержимое папки!) из архива в каталог 'moonloader/lib/'.
 

AnWu

Guardian of Order
Всефорумный модератор
4,686
5,166
Я скачал всё,установил как написано и не робит :с
Мб подробнее? Не работает в смысле события или ошибка при запуске?

Ку. Есть такая особенность с raknetBitStreamResetReadPointer. Иногда убивает игру из-за ошибки
Код:
opcode '0BE9' call caused an unhandled exception
Вызывал onBulletSync().
 
Последнее редактирование модератором:

ufdhbi

Известный
Проверенный
1,455
861
Ку. Есть такая особенность с raknetBitStreamResetReadPointer. Иногда убивает игру из-за ошибки
Код:
opcode '0BE9' call caused an unhandled exception
Вызывал onBulletSync().
Такая же хуйня с onServerMessage есть, крашит из-за мунлоадера, без него все норм, в логах этот опкод пишет
 

kastyan

Известный
257
30
Короче, установил мунлоадер, закинул в него скрипты, а в игре ничего не работает. Почему так?
Вот что пишет, я в этом не шарю, хелп плиз
Код:
[17:07:13.878448] (system)    Session started.
[17:07:13.891448] (debug)    Module handle: 6BF80000.

MoonLoader v.021-alpha loaded.
Developers: FYP, hnnssy, EvgeN 1137

© BlastHack Team, 2016
https://www.blast.hk/moonloader/

[17:07:13.891448] (info)    Working directory: C:\Games\GTA\moonloader
[17:07:13.892452] (debug)    FP Control: 9001f
[17:07:13.892452] (system)    Installing pre-game hooks...     OK.
[17:07:16.922560] (debug)    Initializing opcode handler table
[17:07:16.922560] (debug)    package.path = .\?.lua;C:\Games\GTA\moonloader\lib\?.lua;C:\Games\GTA\moonloader\lib\?\init.lua;C:\Games\GTA\moonloader\?.lua;C:\Games\GTA\moonloader\?\init.lua
[17:07:16.922560] (debug)    package.cpath = .\?.dll;C:\Games\GTA\moonloader\lib\?.dll;C:\Games\GTA\moonloader\?.dll
[17:07:16.924556] (system)    Loading script 'C:\Games\GTA\moonloader\!adblock.lua'...
[17:07:16.924556] (debug)    New script: 0E4C4564
[17:07:16.940555] (debug)    Add thread 0E4D3BC5 to SCM-thread queue
[17:07:16.947551] (system)    ADBLOCK: Script terminated. (0E4C4564)
[17:07:16.948552] (error)    C:\Games\GTA\moonloader\!adblock.lua:11: attempt to index a boolean value
[17:07:16.949552] (system)    Loading script 'C:\Games\GTA\moonloader\!glonass.luac'...
[17:07:16.949552] (debug)    New script: 0E4C4564
[17:07:16.969558] (system)    GLONASS: Script terminated. (0E4C4564)
[17:07:16.970556] (error)    C:\Games\GTA\moonloader\!glonass.luac:0: attempt to index a boolean value
[17:07:16.970556] (system)    Loading script 'C:\Games\GTA\moonloader\!offmembers.lua'...
[17:07:16.970556] (debug)    New script: 0E48CEE4
[17:07:16.975557] (system)    /om: Script terminated. (0E48CEE4)
[17:07:16.976557] (error)    C:\Games\GTA\moonloader\!offmembers.lua:18: attempt to index a boolean value
[17:07:27.158476] (system)    Installing post-load hooks...     OK.
[17:08:39.630108] (system)    Unloading...
[17:08:39.630108] (system)    Session terminated.
[17:08:39.654146] (debug)    Remove thread 0E4D3BC5 from SCM-thread queue
 

zwhoz

Известный
106
11
Короче, установил мунлоадер, закинул в него скрипты, а в игре ничего не работает. Почему так?
Вот что пишет, я в этом не шарю, хелп плиз
Код:
[17:07:13.878448] (system)    Session started.
[17:07:13.891448] (debug)    Module handle: 6BF80000.

MoonLoader v.021-alpha loaded.
Developers: FYP, hnnssy, EvgeN 1137

© BlastHack Team, 2016
https://www.blast.hk/moonloader/

[17:07:13.891448] (info)    Working directory: C:\Games\GTA\moonloader
[17:07:13.892452] (debug)    FP Control: 9001f
[17:07:13.892452] (system)    Installing pre-game hooks...     OK.
[17:07:16.922560] (debug)    Initializing opcode handler table
[17:07:16.922560] (debug)    package.path = .\?.lua;C:\Games\GTA\moonloader\lib\?.lua;C:\Games\GTA\moonloader\lib\?\init.lua;C:\Games\GTA\moonloader\?.lua;C:\Games\GTA\moonloader\?\init.lua
[17:07:16.922560] (debug)    package.cpath = .\?.dll;C:\Games\GTA\moonloader\lib\?.dll;C:\Games\GTA\moonloader\?.dll
[17:07:16.924556] (system)    Loading script 'C:\Games\GTA\moonloader\!adblock.lua'...
[17:07:16.924556] (debug)    New script: 0E4C4564
[17:07:16.940555] (debug)    Add thread 0E4D3BC5 to SCM-thread queue
[17:07:16.947551] (system)    ADBLOCK: Script terminated. (0E4C4564)
[17:07:16.948552] (error)    C:\Games\GTA\moonloader\!adblock.lua:11: attempt to index a boolean value
[17:07:16.949552] (system)    Loading script 'C:\Games\GTA\moonloader\!glonass.luac'...
[17:07:16.949552] (debug)    New script: 0E4C4564
[17:07:16.969558] (system)    GLONASS: Script terminated. (0E4C4564)
[17:07:16.970556] (error)    C:\Games\GTA\moonloader\!glonass.luac:0: attempt to index a boolean value
[17:07:16.970556] (system)    Loading script 'C:\Games\GTA\moonloader\!offmembers.lua'...
[17:07:16.970556] (debug)    New script: 0E48CEE4
[17:07:16.975557] (system)    /om: Script terminated. (0E48CEE4)
[17:07:16.976557] (error)    C:\Games\GTA\moonloader\!offmembers.lua:18: attempt to index a boolean value
[17:07:27.158476] (system)    Installing post-load hooks...     OK.
[17:08:39.630108] (system)    Unloading...
[17:08:39.630108] (system)    Session terminated.
[17:08:39.654146] (debug)    Remove thread 0E4D3BC5 from SCM-thread queue

Установи мунлоадер последней версии.
Избранное - Lua - ASI - MoonLoader(https://blast.hk/threads/13305/)
 

AnWu

Guardian of Order
Всефорумный модератор
4,686
5,166
как отловить показ курсора для выбора тд?

Загемороился и обнаружил что нету входящего RPC, @FYP добавь
Lua:
INCOMING_RPCS[RPC.CLICKTEXTDRAW]        = {'onSelectTextDraw', {color = 'int32'}}
С цветом правда не разобрался. Вроде RGBA формат, но всё равно получается хуета.
 
Последнее редактирование модератором:

AnWu

Guardian of Order
Всефорумный модератор
4,686
5,166
Как сменить клавишу вызова меню?
какого меню

Add TD event:
Lua:
onSelectTextDraw(color)
Вызывается когда сервер показывает курсор игроку для выбора ТД.
@FYP добавь чтоли)

@FYP , возможен ли такой вариант что из-за большего кол-ва проверок в пакете или вообще большего кол-ва перехвата пакетов игру к херам офает? Причем не крашит, а именно вырубет без суда и следствия. Всё молчит. Скрипты не выгружаются. Логи молчат все. Не понимаю что за хрень.

UPD: Дело было даже не в луа и не в сампе. Оказывается бандикам способен убивать процессы которые снимает, суконец. Решено
 

Вложения

  • events.lua
    21.2 KB · Просмотры: 28
Последнее редактирование модератором:

plakapenka

Известный
18
8
Можно ли каким нибудь образом получить данные об каждом пикапе на сервере, даже если он не в зоне стрима?