Привет. Сегодня покажу как обрабатывать исходящие 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 Code 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 Code 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 Code 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 Code 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).