Гайд Как отправлять пакеты без использования SAMP.lua

_raz0r

t.me/sssecretway | ТГК: t.me/razor_code
Автор темы
Модератор
1,888
3,048
Привет, решил написать данный гайд, потому, что половина людей которые пишут скрипты на Lua не знают, как отправлять пакеты на сервер без использования библиотеки SAMP.lua. Это конечно дело каждого, использовать самп луа или нет, кому надо - тому будет полезен гайд. Подобных гайдов я не видел, поэтому расскажу все, что знаю.

Для начала расскажу для чего это нужно, к примеру можно избавиться от зависимости от SAMP.lua в скрипте.

Думаю уже стоит приступить к самому главному в данном гайде, а именно, как же отправить эти пакеты. Буду я показывать на примере OnFootSync.
Для начала нам нужны структуры этих пакетов, взять их можно с этого сайта: Не реклама. Заходим и видим вот такую вот картину:
CLEO:
PACKET_PLAYER_SYNC = 212 | +55
// struct stOnFootData ( size = 68 )
// uint16_t sLeftRightKeys;
// uint16_t sUpDownKeys; + 2
// uint16_t sKeys; + 4
// float fPosition[3]; + 6
// float fQuaternion[4]; + 18
// uint8_t byteHealth; + 34
// uint8_t byteArmor; + 35
// uint8_t byteCurrentWeapon; + 36
// uint8_t byteSpecialAction; + 37
// float fMoveSpeed[3]; + 38
// float fSurfingOffsets[3]; + 50
// uint16_t sSurfingVehicleID; + 62
// uint16_t iCurrentAnimationID; + 64
// uint16_t AnimFlags; + 66
Это структура пакета OnFootSync. Номер пакета равен 212, где size это размер структуры, размер ее 68. +2, +4, +6 и т.д это оффсеты в структуре, каждый из которых указывает на разные параметры.

Давай приступим к отправке данного пакета.
Для начала нам нужно выделить память под него, делается это вот так:
Lua:
local data = allocateMemory(68) -- 68 это размер нашей структуры

Подготовим OnFoot структуру игрока:

Lua:
local _, myId = sampGetPlayerIdByCharHandle(playerPed) -- получаем свой ID
sampStorePlayerOnfootData(myId, data) -- подготавливаем структуру

Теперь давайте к примеру изменим позицию игрока по X,Y и изменим moveSpeed игрока. Оффсет позиции в структуре начинается с 6, у moveSpeed с 38:

Lua:
setStructFloatElement(data, 6, 0.0, true) -- data это наш буфер, 6 это оффсет координаты X, 0.0 координата по X, true снятие протекцию.
setStructFloatElement(data, 10, 0.0, true) -- data это наш буфер, 10 это оффсет координаты Y (прибавили 4 байта), 0.0 координата по X, true снятие протекции.
setStructFloatElement(data, 38, 5.0, true) -- data это наш буфер, 38 это оффсет скорости по X, 5.0 скорость по X, true снятие протекции.
setStructFloatElement(data, 42, 10.0, true) -- data это наш буфер, 42 это оффсет скорости по Y (прибавили 4 байта), 10.0 скорость по Y, true снятие протекции.
После записи в структуру значений, нам надо отправить этот пакет:
Lua:
sampSendOnfootData(data) -- отправляем OnFoot пакет
freeMemory(data) -- очищаем выделенную память.


Так же и с остальными пакетами, в этом ничего трудного нету. Если у вас остались какие-то вопросы, задавайте их в тему, по возможности постараюсь всем ответить.
На счет Unoccupied, Spectate и тому подобных. Данную строку у них можно пропустить:
Lua:
sampStorePlayerOnfootData(myId, data) -- подготавливаем структуру
 
Последнее редактирование:

ROBERT PUSHER

Известный
305
212
Привет, а как отправлять RPC onSetPlayerSkillLevel(пример) с возможностью перезаписи?{return}

Привет, напиши гайд по битстриму.