Доступ к готовым решениям

Переход в группу "Пользователь"

300.00
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Packets - Pawn.RakNet

Richie56

Изучающий
Пользователь
Регистрация
1 Май 2014
Сообщения
611
Лучшие ответы
1
Репутация
205
Введение:​

Системы которые запускают 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
 
Последнее редактирование модератором:
Сверху Снизу