using CrewChiefV4.rFactor2_V2.rFactor2Data; using GameReaderCommon; using RfactorReader.RF2; using SimHub.Plugins; using System; namespace rFactor2MiscData { [PluginDescription("Read Access to miscellaneous rFactor 2 Data")] [PluginAuthor("Kilian Kurt Hofmann")] [PluginName("rFactor 2 Misc Data")] public class rFactor2MiscData : IPlugin, IDataPlugin { private const string LAST_MESSAGE = "rF2MiscData.LastMessage"; private const string VEHICLE_BASE = "rF2MiscData.Position"; private const string VEHICLE_FUEL = ".Fuel"; private const string VEHICLE_THROTTLE= ".Throttle"; private const string VEHICLE_BRAKE = ".Brake"; private const string VEHICLE_PLACE = ".Place"; private const string VEHICLE_DRIVERNAME = ".DriverName"; /// /// Instance of the current plugin manager /// public PluginManager PluginManager { get; set; } /// /// Gets a short plugin title to show in left menu. Return null if you want to use the title as defined in PluginName attribute. /// public string LeftMenuTitle => null; /// /// Called one time per game data update, contains all normalized game data, /// raw data are intentionnally "hidden" under a generic object type (A plugin SHOULD NOT USE IT) /// /// This method is on the critical path, it must execute as fast as possible and avoid throwing any error /// /// /// /// Current game data, including current and previous data frame. public void DataUpdate(PluginManager pluginManager, ref GameData data) { // Define the value of our property (declared in init) if (data.GameRunning && data is GameData _data) { WrapV2 newData = _data.GameNewData.Raw; // Last Message string message = System.Text.Encoding.Default.GetString(newData.extended.mLastHistoryMessage); int index = message.IndexOf('\0'); if( index >= 0) { message = message.Remove(index); } pluginManager.SetPropertyValue(LAST_MESSAGE, GetType(), message); int maxVehicles = Math.Min(newData.Scoring.mVehicles.Length, newData.telemetry.mVehicles.Length); for(int i = 0; i < maxVehicles; i++) { rF2VehicleTelemetry telemetry = newData.telemetry.mVehicles[i]; rF2VehicleScoring scoring = newData.Scoring.mVehicles[i]; // Vehicle Fuel pluginManager.SetPropertyValue($"{VEHICLE_BASE}{scoring.mPlace:000}{VEHICLE_FUEL}", GetType(), telemetry.mFuel); // Vehicle Throttle pluginManager.SetPropertyValue($"{VEHICLE_BASE}{scoring.mPlace:000}{VEHICLE_THROTTLE}", GetType(), telemetry.mFilteredThrottle); // Vehicle Brake pluginManager.SetPropertyValue($"{VEHICLE_BASE}{scoring.mPlace:000}{VEHICLE_BRAKE}", GetType(), telemetry.mFilteredBrake); // Vehicle Position pluginManager.SetPropertyValue($"{VEHICLE_BASE}{scoring.mPlace:000}{VEHICLE_PLACE}", GetType(), scoring.mPlace); // Vehicle Driver Name string driverName = System.Text.Encoding.Default.GetString(scoring.mDriverName); index = message.IndexOf('\0'); if (index >= 0) { message = message.Remove(index); } pluginManager.SetPropertyValue($"{VEHICLE_BASE}{scoring.mPlace:000}{VEHICLE_DRIVERNAME}", GetType(), driverName); } } } /// /// Called at plugin manager stop, close/dispose anything needed here ! /// Plugins are rebuilt at game change /// /// public void End(PluginManager pluginManager) { SimHub.Logging.Current.Info("Stopping plugin"); pluginManager.ClearProperties(GetType()); } /// /// Called once after plugins startup /// Plugins are rebuilt at game change /// /// public void Init(PluginManager pluginManager) { SimHub.Logging.Current.Info("Starting plugin"); pluginManager.AddProperty(LAST_MESSAGE, GetType(), "No Data", "Last Message Center Entry"); for (int i = 1; i <= 104; i++) { pluginManager.AddProperty($"{VEHICLE_BASE}{i:000}{VEHICLE_FUEL}", GetType(), "No Data", $"Vehicle at position {i}: Fuel"); pluginManager.AddProperty($"{VEHICLE_BASE}{i:000}{VEHICLE_THROTTLE}", GetType(), "No Data", $"Vehicle at position {i}: Throttle"); pluginManager.AddProperty($"{VEHICLE_BASE}{i:000}{VEHICLE_BRAKE}", GetType(), "No Data", $"Vehicle at position {i}: Brake"); pluginManager.AddProperty($"{VEHICLE_BASE}{i:000}{VEHICLE_PLACE}", GetType(), "No Data", $"Vehicle at position {i}: Place"); pluginManager.AddProperty($"{VEHICLE_BASE}{i:000}{VEHICLE_DRIVERNAME}", GetType(), "No Data", $"Vehicle at position {i}: Driver Name"); } } } }