Видеоигра F1 2020 предоставит вам пакет данных UDP в виде массива байтов ( byte[]
). Игра будет транслировать несколько различных типов пакетов данных. Импортируйте следующее пространство имен, чтобы использовать основные ресурсы для чтения данных:
using Codemasters.F1_2020;
Каждый тип пакета является производным от одного и того же базового класса Packet
. Класс Packet
содержит следующие свойства:
PacketFormat
— описывает игру, из которой взят пакет (F1 2020).
GameMajorVersion
— основная версия игры на момент трансляции.
GameMinorVersion
— минорная версия игры на момент трансляции.
PacketVersion
PacketType
— тип пакета этих данных (т. е. телеметрия, статус, данные круга и т. д.).
UniqueSessionId
— уникальный идентификатор вашего сеанса.
SessioTime
— временная метка текущего сеанса, когда этот пакет был записан и передан.
FrameIdentifier
— к какой группе пакетов принадлежат эти данные.
PlayerCarIndex
— индекс автомобиля игрока в массивах полей во всех соответствующих пакетах.
SecondaryPlayerCarIndex
— если вы играете вдвоём (разделённый экран), это будет индекс игрока 2 в массиве полей.
Чтобы узнать, какой тип пакета представляет собой предоставленный вам массив байтов, используйте CodemastersToolkit. Переменная bytes
, указанная ниже, может быть получена из вашей трансляции телеметрии или из десериализованного файла, если вы сохранили телеметрию на диске.
byte[] bytes; //Your telemetry data package
PacketType pt = CodemastersToolkit.GetPacketType(bytes);
Console.WriteLine(pt.ToString());
Консольный вывод вышеизложенного: «CarTelemetry»
Поскольку мы знаем, что этот конкретный пакет данных является пакетом телеметрии, мы можем создать пакет телеметрии:
TelemetryPacket tp = new TelemetryPacket();
tp.LoadBytes(bytes);
Класс TelemetryPacket
содержит массив CarTelemetryData
, по одному для каждого автомобиля в поле.
Например, приведенный ниже код выведет давление дроссельной заслонки, которое применяет каждый водитель в момент передачи этих данных.
foreach (TelemetryPacket.CarTelemetryData ctd in tp.FieldTelemetryData)
{
Console.WriteLine(ctd.Throttle.ToString());
}
Многие пакеты имеют тот же формат, что и TelemetryPacket
.
Вы можете преобразовать все полученные пакеты байтовых массивов. Пример:
List<byte[]> telemetry;
Packet[] packets = CodemastersToolkit.BulkConvertByteArraysToPackets(telemetry);
Затем вы можете преобразовать каждый пакет из возвращенного массива пакетов. Например, преобразование Packet
в TelemetryPacket
:
foreach (Packet p in packets)
{
if (p.PacketType == PacketType.CarTelemetry)
{
TelemetryPacket telpack = (TelemetryPacket)p;
}
}
Например, вам может потребоваться найти сопровождающий CarStatusPacket
для определенного TelemetryPacket
. Для этого:
TelemetryPacket telpack;
CarStatusPacket csp = (CarStatusPacket)telpack.GetRelatedPacket(packets, PacketType.CarStatus);
**Если вы ранее использовали пространство имен Codemasters.F1_2020.Analysis, а теперь обнаружили, что оно отсутствует: пространство имен анализа было перемещено в пакет NuGet ApexVisual.F1_2020 (https://www.nuget.org/packages/ApexVisual.F1_2020/).