Skip to content

Commit

Permalink
游戏兼容自动识别
Browse files Browse the repository at this point in the history
  • Loading branch information
Ning committed Oct 12, 2021
1 parent fe6e9b3 commit 9b85b8e
Show file tree
Hide file tree
Showing 8 changed files with 182 additions and 161 deletions.
16 changes: 5 additions & 11 deletions WpfApp1/DataHandle/DataReciver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public static class DataReciver
private static IPEndPoint IP;
public static MicroTimer MicroTimer;
private static int _port = 666;
private static GameVersion _version = GameVersion.F1_2020;
private static GameVersion _version = GameVersion.Unkonwn;

static DataReciver()
{
Expand All @@ -28,7 +28,9 @@ private static void MicroTimer_OnRunningCallback(int id, int msg, int user, int
var bytes = UDP.Receive(ref IP);
if (bytes.Length > 0)
{
var packet = TypeFactory.GetPacket(bytes, _version);
var packet = GetPacket(bytes, _version, out _version);
if (_version == GameVersion.Unkonwn)
return;
ReciveEvent?.Invoke(packet);
}
}
Expand All @@ -45,15 +47,7 @@ public static int Port
}
}

public static GameVersion Version
{
get => _version;
set
{
_version = value;
MicroTimer.Start();
}
}
public static GameVersion Version => _version;

public static void Dispose()
{
Expand Down
2 changes: 0 additions & 2 deletions WpfApp1/DataHandle/ShowDataHandle.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ private static void Handle19(F1Instrument f1, Codemasters.F1_2019.Packet packet)
var data = curPack.FieldCarStatusData[0];

f1.DRSEnable(data.DrsAllowed);
//f1.DRSNegative(data.DrsFailure);
}
}

Expand Down Expand Up @@ -93,7 +92,6 @@ private static void Handle21(F1Instrument f1, Codemasters.F1_2021.Packet packet)
var data = curPack.FieldCarStatusData[0];

f1.DRSEnable(data.DrsAllowed);
//f1.DRSNegative(data.DrsFailure);
}
}
}
Expand Down
279 changes: 164 additions & 115 deletions WpfApp1/DataHandle/TypeFactory.cs
Original file line number Diff line number Diff line change
@@ -1,148 +1,197 @@
using Codemasters.F1_2019;
using Codemasters.F1_2020;
using Codemasters.F1_2021;
using System;

namespace F1Tools
{
public class TypeFactory
{
public static object GetPacket(byte[] bytes, GameVersion version)
public static object GetPacket(byte[] bytes, GameVersion version, out GameVersion outVersion)
{
switch (version)
if (version != GameVersion.Unkonwn)
{
case GameVersion.F1_2019:
return GetPacket2019(bytes);
case GameVersion.F1_2020:
return GetPacket2020(bytes);
case GameVersion.F1_2021:
return GetPacket2021(bytes);
default: return null;
switch (version)
{
case GameVersion.F1_2019:
outVersion = GetPacket2019(bytes, out Codemasters.F1_2019.Packet packet19) ? GameVersion.F1_2019 : GameVersion.Unkonwn;
return packet19;
case GameVersion.F1_2020:
outVersion = GetPacket2020(bytes, out Codemasters.F1_2020.Packet packet20) ? GameVersion.F1_2020 : GameVersion.Unkonwn;
return packet20;
case GameVersion.F1_2021:
outVersion = GetPacket2021(bytes, out Codemasters.F1_2021.Packet packet21) ? GameVersion.F1_2021 : GameVersion.Unkonwn;
return packet21;
default:
outVersion = GameVersion.Unkonwn;
return null;
}
}
else
{
if (GetPacket2019(bytes, out Codemasters.F1_2019.Packet packet19))
{
outVersion = GameVersion.F1_2019;
return packet19;
}
else if (GetPacket2020(bytes, out Codemasters.F1_2020.Packet packet20))
{
outVersion = GameVersion.F1_2020;
return packet20;
}
else if (GetPacket2021(bytes, out Codemasters.F1_2021.Packet packet21))
{
outVersion = GameVersion.F1_2021;
return packet21;
}
else
{
outVersion = GameVersion.Unkonwn;
return null;
}
}
}

public static Codemasters.F1_2019.Packet GetPacket2019(byte[] bytes)
public static bool GetPacket2019(byte[] bytes, out Codemasters.F1_2019.Packet packet)
{
var type = Codemasters.F1_2019.CodemastersToolkit.GetPacketType(bytes);

Codemasters.F1_2019.Packet pack = null;
switch (type)
packet = null;
try
{
case Codemasters.F1_2019.PacketType.CarStatus:
pack = new Codemasters.F1_2019.CarStatusPacket();
break;
case Codemasters.F1_2019.PacketType.CarTelemetry:
pack = new Codemasters.F1_2019.TelemetryPacket();
break;
//case PacketType.FinalClassification:
// pack = new FinalClassificationPacket();
// break;
//case PacketType.Lap:
// pack = new LapPacket();
// break;
//case PacketType.LobbyInfo:
// pack = new LobbyInfoPacket();
// break;
//case PacketType.Motion:
// pack = new MotionPacket();
// break;
case Codemasters.F1_2019.PacketType.Participants:
pack = new Codemasters.F1_2019.ParticipantPacket();
break;
//case PacketType.Session:
// pack = new SessionPacket();
// break;
default: break;
}
var type = Codemasters.F1_2019.CodemastersToolkit.GetPacketType(bytes);

switch (type)
{
case Codemasters.F1_2019.PacketType.CarStatus:
packet = new Codemasters.F1_2019.CarStatusPacket();
break;
case Codemasters.F1_2019.PacketType.CarTelemetry:
packet = new Codemasters.F1_2019.TelemetryPacket();
break;
//case PacketType.FinalClassification:
// pack = new FinalClassificationPacket();
// break;
//case PacketType.Lap:
// pack = new LapPacket();
// break;
//case PacketType.LobbyInfo:
// pack = new LobbyInfoPacket();
// break;
//case PacketType.Motion:
// pack = new MotionPacket();
// break;
case Codemasters.F1_2019.PacketType.Participants:
packet = new Codemasters.F1_2019.ParticipantPacket();
break;
//case Codemasters.F1_2019.PacketType.Session:
// pack = new SessionPacket();
// break;
default: break;
}

if (pack != null)
pack.LoadBytes(bytes);
if (packet != null)
packet.LoadBytes(bytes);

return pack;
return true;
}
catch (Exception ex)
{
return false;
}
}

public static Codemasters.F1_2020.Packet GetPacket2020(byte[] bytes)
public static bool GetPacket2020(byte[] bytes, out Codemasters.F1_2020.Packet packet)
{
var type = Codemasters.F1_2020.CodemastersToolkit.GetPacketType(bytes);

Codemasters.F1_2020.Packet pack = null;
switch (type)
packet = null;
try
{
case Codemasters.F1_2020.PacketType.CarStatus:
pack = new Codemasters.F1_2020.CarStatusPacket();
break;
case Codemasters.F1_2020.PacketType.CarTelemetry:
pack = new Codemasters.F1_2020.TelemetryPacket();
break;
//case PacketType.FinalClassification:
// pack = new FinalClassificationPacket();
// break;
//case PacketType.Lap:
// pack = new LapPacket();
// break;
//case PacketType.LobbyInfo:
// pack = new LobbyInfoPacket();
// break;
//case PacketType.Motion:
// pack = new MotionPacket();
// break;
case Codemasters.F1_2020.PacketType.Participants:
pack = new Codemasters.F1_2020.ParticipantPacket();
break;
//case PacketType.Session:
// pack = new SessionPacket();
// break;
default: break;
}
var type = Codemasters.F1_2020.CodemastersToolkit.GetPacketType(bytes);

if (pack != null)
pack.LoadBytes(bytes);
switch (type)
{
case Codemasters.F1_2020.PacketType.CarStatus:
packet = new Codemasters.F1_2020.CarStatusPacket();
break;
case Codemasters.F1_2020.PacketType.CarTelemetry:
packet = new Codemasters.F1_2020.TelemetryPacket();
break;
//case PacketType.FinalClassification:
// pack = new FinalClassificationPacket();
// break;
//case PacketType.Lap:
// pack = new LapPacket();
// break;
//case PacketType.LobbyInfo:
// pack = new LobbyInfoPacket();
// break;
//case PacketType.Motion:
// pack = new MotionPacket();
// break;
case Codemasters.F1_2020.PacketType.Participants:
packet = new Codemasters.F1_2020.ParticipantPacket();
break;
//case PacketType.Session:
// pack = new SessionPacket();
// break;
default: break;
}

return pack;
if (packet != null)
packet.LoadBytes(bytes);
return true;
}
catch (Exception ex)
{
return false;
}
}

public static Codemasters.F1_2021.Packet GetPacket2021(byte[] bytes)
public static bool GetPacket2021(byte[] bytes, out Codemasters.F1_2021.Packet packet)
{
var type = Codemasters.F1_2021.CodemastersToolkit.GetPacketType(bytes);

Codemasters.F1_2021.Packet pack = null;
switch (type)
packet = null;
try
{
case Codemasters.F1_2021.PacketType.CarStatus:
pack = new Codemasters.F1_2021.CarStatusPacket();
break;
case Codemasters.F1_2021.PacketType.CarTelemetry:
pack = new Codemasters.F1_2021.TelemetryPacket();
break;
//case PacketType.FinalClassification:
// pack = new FinalClassificationPacket();
// break;
//case PacketType.Lap:
// pack = new LapPacket();
// break;
//case PacketType.LobbyInfo:
// pack = new LobbyInfoPacket();
// break;
//case PacketType.Motion:
// pack = new MotionPacket();
// break;
case Codemasters.F1_2021.PacketType.Participants:
pack = new Codemasters.F1_2021.ParticipantPacket();
break;
//case PacketType.Session:
// pack = new SessionPacket();
// break;
default: break;
}
var type = Codemasters.F1_2021.CodemastersToolkit.GetPacketType(bytes);

if (pack != null)
pack.LoadBytes(bytes);
switch (type)
{
case Codemasters.F1_2021.PacketType.CarStatus:
packet = new Codemasters.F1_2021.CarStatusPacket();
break;
case Codemasters.F1_2021.PacketType.CarTelemetry:
packet = new Codemasters.F1_2021.TelemetryPacket();
break;
//case PacketType.FinalClassification:
// pack = new FinalClassificationPacket();
// break;
//case PacketType.Lap:
// pack = new LapPacket();
// break;
//case PacketType.LobbyInfo:
// pack = new LobbyInfoPacket();
// break;
//case PacketType.Motion:
// pack = new MotionPacket();
// break;
case Codemasters.F1_2021.PacketType.Participants:
packet = new Codemasters.F1_2021.ParticipantPacket();
break;
//case PacketType.Session:
// pack = new SessionPacket();
// break;
default: break;
}

return pack;
if (packet != null)
packet.LoadBytes(bytes);

return true;
}
catch (Exception ex)
{
return false;
}
}

public enum GameVersion
{
F1_2019, F1_2020, F1_2021
F1_2019, F1_2020, F1_2021, Unkonwn
}
}
}
Loading

0 comments on commit 9b85b8e

Please sign in to comment.