- 24
- 8
Привет, случайный читатель.
Тебе пишет один из мазохистов на BLASTHACK.
Сегодня покажу как обрабатывать исходящие RPC без использования модуля "SAMP.Lua".
В MoonLoader существует событие onSendRpc - его мы и будем использовать. Это событие требует только наличие плагина SAMPFUNCS.
1. Получение данных из RPC.
Список всех исходящих и входящих RPC: *нажимай*
Для примера буду использовать RPC под ID 101 - SendChatMessage ( отправка сообщения в чат игроком). Оно имеет два параметра - length ( длина сообщения ) и ChatMessage ( текст самого сообщения ) . Для начала создаем саму функцию-событие, которая будет получать данные об отправляемых нами RPC.
Эта функция будет вызываться при каждой отправке исходящего RPC нами на сервер. Функция имеет параметры - ID RPC, bitStream (сами данные RPC), приоритет, надежность и канал. Нам понадобятся только первые два параметра - ID RPC и bitStream. Теперь сделаем проверку на ID RPC чтоб функция пропускала остальные исходящие RPC и читала данные только из нужного нам RPC.
Теперь прочитаем параметры самого RPC и выведем один из параметров в чат. Каждый параметр нужно читать по очереди, не пропуская. Использую raknetBitStreamReadInt8 так как тип данных у первого параметра RPC - UINT8. Первым параметром у функции идет bitStream (данные RPC) - поэтому первым параметром вписываем то, что передается в нашу функцию-событие вторым параметром. raknetBitStreamReadString первым параметром принимает так же bitStream, а вторым параметром длину строки (мы получили его выше) - передаем его.
В результате после отправки сообщения в чат получаем:
2. Перезапись данных и отправка измененного RPC.
Для начала делаем все тоже самое что и делали до этого - читаем данные RPC. После чтения данных сбрасываем указатель записи данных и начинаем заполнять bitStream. Нельзя пропускать параметры, нужно писать все по очереди и не пропуская. Сбрасываем указатель записи данных функцией raknetBitStreamResetWritePointer. Функция принимает bitStream. После сброса указателя заполняем bitStream данными. Для удобства создам переменную text. В ней будет сам текст, который отправится серверу. Использую raknetBitStreamWriteInt8 т.к первый параметр RPC имеет тип данных UINT8. Первым параметром - bitStream, вторым - длина строки. #text вернет длину строки. Использую raknetBitStreamWriteString для заполнения второго параметра RPC. Первый аргумент - bitStream, второй - сама строка с текстом (в данном случае переменная text). После перезаписи данных возвращаем RPC со всеми параметрами функции-события.
В результате после отправки любого сообщения в чат оно подменится на то, которое мы заменяли его.
3. Заключение.
Разобравшись можно не тянуть модуль и читать RPC и пакеты таким образом. Использование этого метода убирает необходимость наличия модуля SAMP.Lua - такой метод будет работать на чистом MoonLoader (SAMPFUNCS тоже нужен) без установки сторонних библиотек. В следующем гайде могу показать этот же метод, но с пакетами синхронизации или входящими RPC. Для чтения других типов данных используйте - raknetBitStreamReadInt16 (Bitstream bs), raknetBitStreamReadInt32 (Bitstream bs), raknetBitStreamReadFloat (Bitstream bs), raknetBitStreamReadBool (Bitstream bs).
Тебе пишет один из мазохистов на BLASTHACK.
Сегодня покажу как обрабатывать исходящие RPC без использования модуля "SAMP.Lua".
В MoonLoader существует событие onSendRpc - его мы и будем использовать. Это событие требует только наличие плагина SAMPFUNCS.
1. Получение данных из RPC.
Список всех исходящих и входящих RPC: *нажимай*
Для примера буду использовать RPC под ID 101 - SendChatMessage ( отправка сообщения в чат игроком). Оно имеет два параметра - length ( длина сообщения ) и ChatMessage ( текст самого сообщения ) . Для начала создаем саму функцию-событие, которая будет получать данные об отправляемых нами RPC.
Код::
function onSendRpc(id, bitStream, priority, reliability, orderingChannel, shiftTs)
-- code
end
Эта функция будет вызываться при каждой отправке исходящего RPC нами на сервер. Функция имеет параметры - ID RPC, bitStream (сами данные RPC), приоритет, надежность и канал. Нам понадобятся только первые два параметра - ID RPC и bitStream. Теперь сделаем проверку на ID RPC чтоб функция пропускала остальные исходящие RPC и читала данные только из нужного нам RPC.
Код::
function onSendRpc(id, bitStream, priority, reliability, orderingChannel, shiftTs)
if id == 101 then
-- code
end
end
Теперь прочитаем параметры самого RPC и выведем один из параметров в чат. Каждый параметр нужно читать по очереди, не пропуская. Использую raknetBitStreamReadInt8 так как тип данных у первого параметра RPC - UINT8. Первым параметром у функции идет bitStream (данные RPC) - поэтому первым параметром вписываем то, что передается в нашу функцию-событие вторым параметром. raknetBitStreamReadString первым параметром принимает так же bitStream, а вторым параметром длину строки (мы получили его выше) - передаем его.
Код::
function onSendRpc(id, bitStream, priority, reliability, orderingChannel, shiftTs)
if id == 101 then
local length = raknetBitStreamReadInt8(bitStream)
local ChatMessage = raknetBitStreamReadString(bitStream, length)
sampAddChatMessage("ChatMessage: "..ChatMessage, -1)
end
end
В результате после отправки сообщения в чат получаем:
2. Перезапись данных и отправка измененного RPC.
Для начала делаем все тоже самое что и делали до этого - читаем данные RPC. После чтения данных сбрасываем указатель записи данных и начинаем заполнять bitStream. Нельзя пропускать параметры, нужно писать все по очереди и не пропуская. Сбрасываем указатель записи данных функцией raknetBitStreamResetWritePointer. Функция принимает bitStream. После сброса указателя заполняем bitStream данными. Для удобства создам переменную text. В ней будет сам текст, который отправится серверу. Использую raknetBitStreamWriteInt8 т.к первый параметр RPC имеет тип данных UINT8. Первым параметром - bitStream, вторым - длина строки. #text вернет длину строки. Использую raknetBitStreamWriteString для заполнения второго параметра RPC. Первый аргумент - bitStream, второй - сама строка с текстом (в данном случае переменная text). После перезаписи данных возвращаем RPC со всеми параметрами функции-события.
Код::
function onSendRpc(id, bitStream, priority, reliability, orderingChannel, shiftTs)
if id == 101 then
local length = raknetBitStreamReadInt8(bitStream)
local ChatMessage = raknetBitStreamReadString(bitStream, length)
raknetBitStreamResetWritePointer(bitStream)
local text = "123"
raknetBitStreamWriteInt8(bitStream, #text)
raknetBitStreamWriteString(bitStream, text)
return {id, bitStream, priority, reliability, orderingChannel, shiftTs}
end
end
В результате после отправки любого сообщения в чат оно подменится на то, которое мы заменяли его.
3. Заключение.
Разобравшись можно не тянуть модуль и читать RPC и пакеты таким образом. Использование этого метода убирает необходимость наличия модуля SAMP.Lua - такой метод будет работать на чистом MoonLoader (SAMPFUNCS тоже нужен) без установки сторонних библиотек. В следующем гайде могу показать этот же метод, но с пакетами синхронизации или входящими RPC. Для чтения других типов данных используйте - raknetBitStreamReadInt16 (Bitstream bs), raknetBitStreamReadInt32 (Bitstream bs), raknetBitStreamReadFloat (Bitstream bs), raknetBitStreamReadBool (Bitstream bs).