- Регистрация
- 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
Последнее редактирование модератором: