Место для рекламы.

Реклама на сайте: vk.com/magicowru
Реклама в группе: vk.com/nikita55222
Стать модератором портала: (КЛИК)

[Урок] Packets - Pawn.RakNet

PawnDev

Пользователь
Пользователь
Регистрация
29.03.2018
Сообщения
21
Репутация
0
#1
Другие уроки по Pawn.RakNet


Введение:​

Системы которые запускают RakNet, обмениваются информацией через так называемые пакеты. Или в случае UDP datagrams. Каждая datagram создается RakNet и содержит одно или несколько сообщений. Эти сообщения/данные могут быть позицией, броней, транспортным средством и т.д.
Первый байт пакета (8 бит) - это числовой идентификатор.

Существуют разные идентификаторы пакетов, наиболее распространенные из которых:

  • ID_VEHICLE_SYNC (200) = ответственный за данные синхронизации автомобиля. Пример: когда игрок находится внутри автомобиля. Их положение, здоровье автомобиля, скорость и т.д. - это пакетные данные.
  • ID_AIM_SYNC (203) = ответственный за данные синхронизации камеры. Пример: векторы камеры, масштабирование камеры, статус оружия, объект/автомобиль/игрок/актер, на который нацелен игрок, и т.д. - это пакетные данные.
  • ID_BULLET_SYNC (206) = ответственный за данные синхронизации пули. Пример: тип попадания, цель попадания, центр попадания, оружие, к которому принадлежит пуля, и т.д. - это пакетные данные.
  • ID_PLAYER_SYNC (207) = ответственный за данные синхронизации игрока. Пример: нажатые клавиши, текущая позиция, здоровье, броня, текущее оружие, скорость, анимация, серфинг, если игрок едет на крыше на каком-либо транспортном средстве/объекте, специальные действия и т.д. - это пакетные данные.


Что такое BitStream:​

Класс BitStream является вспомогательным классом в библиотеке RakNet, который используется для переноса динамического массива с целью упаковки и распаковки битов.


Изменение пакетных данных:​

PHP:
public OnIncomingPacket(playerid, packetid, BitStream:bs) 
{ 
    if(packetid == 207) // ID_PLAYER_SYNC  
    { 
        new onFootData[PR_OnFootSync]; 
        BS_IgnoreBits(bs, 8); 
        BS_ReadOnFootSync(bs, onFootData); 
        onFootData[PR_weaponId] = 38; 
        BS_SetWriteOffset(bs, 8); 
        BS_WriteOnFootSync(bs, onFootData); 
    } 
    return 1; 
}
В приведенном выше примере мы модифицируем текущее оружие игрока в пакете, таким образом, чтобы все видели, что у него есть миниган.

  • BS_IgnoreBits(bs, 8 ); - Перед чтением пакетных данных мы игнорируем первые 8 бит (1 байт), потому что они содержат идентификатор пакета.
  • BS_ReadOnFootSync(bs, onFootData); - После игнорирования первых 8 бит мы можем прочитать пакет, который будет передавать свои данные в onFootData.
  • onFootData[PR_weaponId] = 38; - Мы меняем идентификатор оружия в пакете на все что хотим. Идентификатор, который мы установили, будет отправлен в пакете, и это будет оружие, которое увидят другие игроки.
  • BS_SetWriteOffset(bs, 8 );- Мы устанавливаем смещение записи после 8 бит, потому что мы не хотим писать над идентификатором пакета.
  • BS_WriteOnFootSync(bs, onFootData); - Затем мы записываем новые данные синхронизации петель в BitStream.
  • return 1; - Мы возвращаем 1 позволяя отправить пакет с новыми данными, которые мы написали в BitStream.


Отправка пакета:​

Чтобы отправить пакет, мы должны записать его данные в BitStream, первым параметром которого является его идентификатор.

PHP:
SendBullet(from, to, data[PR_BulletSync]) 
{ 
    new BitStream:bs = BS_New(); 
    BS_WriteValue( 
        bs, 
        PR_UINT8, 206, // ID_BULLET_SYNC 
        PR_UINT16, from 
    ); 
    BS_WriteBulletSync(bs, data); 
    BS_Send(bs, to); 
    BS_Delete(bs); 
} 
new bulletData[PR_BulletSync]; 
bulletData[PR_hitType] = /*Your hit type*/; 
bulletData[PR_hitId] = /*hit id*/; 
bulletData[PR_origin][0] = /*origin X*/; 
bulletData[PR_origin][1] = /*origin Y*/; 
bulletData[PR_origin][2] = /*origin Z*/; 
bulletData[PR_hitPos][0] = /*hit position X*/; 
bulletData[PR_hitPos][1] = /*hit position Y*/; 
bulletData[PR_hitPos][2] = /*hit position Z*/; 
bulletData[PR_offsets][0] = /*offset X*/; 
bulletData[PR_offsets][1] = /*offset Y*/; 
bulletData[PR_offsets][2] = /*offset Z*/; 
bulletData[PR_weaponId] = /*weapon id*/; 
SendBulletData(0, 1, bulletData);
В приведенном выше примере функция отправляет пакет с данными пули конкретному игроку.

  • new BitStream:bs = BS_New(); - Мы создаем новый BitStream, где мы собираемся писать наши пакетные данные.
  • PR_UINT8, ID_BULLET_SYNC, - Первый параметр BitStream. Это идентификатор пакета.
  • PR_UINT16, from - Второй параметр BitStream. Это ответственный игрок, от которого будут поступать данные пули.
  • BS_WriteBulletSync(bs, data); - "data" - содержит данные пули, которые мы отправляем в третьем параметре функции, это данные будут записаны в BitStream.
  • BS_Send(bs, to);- "to" - это игрок, собирающийся получить пакет. Если "to" равно -1, все игроки получат пакет.
  • BS_Delete (шс); - После того, как мы закончили, мы удалим BitStream.


Автор: Jelly23