Информация Гайд [Гайд/Lua] - Обработка RPC без использования SAMP.Lua

1397ms

Новичок
Автор темы
24
8
Привет, случайный читатель.
Тебе пишет один из мазохистов на 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

В результате после отправки сообщения в чат получаем:
sOa0wXt.png


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

В результате после отправки любого сообщения в чат оно подменится на то, которое мы заменяли его.
BZfShQ7.png


3. Заключение.
Разобравшись можно не тянуть модуль и читать RPC и пакеты таким образом. Использование этого метода убирает необходимость наличия модуля SAMP.Lua - такой метод будет работать на чистом MoonLoader (SAMPFUNCS тоже нужен) без установки сторонних библиотек. В следующем гайде могу показать этот же метод, но с пакетами синхронизации или входящими RPC. Для чтения других типов данных используйте - raknetBitStreamReadInt16 (Bitstream bs), raknetBitStreamReadInt32 (Bitstream bs), raknetBitStreamReadFloat (Bitstream bs), raknetBitStreamReadBool (Bitstream bs).
 

chapo

чопа сребдс // @moujeek
Модератор
8,868
11,576
  • Нравится
Реакции: krim

hinazuki

Потрачен
344
94
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Полный мазохизм, одобряю такое)
 
  • Bug
Реакции: xUcQ1 и 1397ms

holyoneverr

Потрачен
22
2
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
не подскажите как сделать чтобы если от сервера например написало в чат "Используйте /n" у меня запустился скрипт. Без onservermessage
 

Похожие темы

  1. Ответы
    497
    Просмотры
    258K
  2. Ответы
    83K
    Просмотры
    7M
  3. Ответы
    3
    Просмотры
    9K
  4. Ответы
    46
    Просмотры
    170K