Game.Net.Road
Assembly: (unspecified — part of the game's codebase)
Namespace: Game.Net
Type: struct
Base: IComponentData, IQueryTypeParameter, ISerializable
Summary:
Road is an ECS component (Unity DOTS) that stores aggregated traffic flow metrics and flags for a road entity. The struct packs flow durations and distances into four-component vectors (Unity.Mathematics.float4) and implements custom serialization/deserialization with backward-compatibility logic for older saved data versions. It is intended to be used as a component in the game's entity world (for example, to query or update traffic flow info per-road).
Fields
-
public float4 m_TrafficFlowDuration0
Stores first set of traffic flow durations as a float4 (Unity.Mathematics.float4). The component uses two duration vectors (0 and 1) to hold flow duration values for multiple lanes/segments or to support interpolated values across frames. -
public float4 m_TrafficFlowDuration1
Second set / duplicate of traffic flow durations (float4). Used together with m_TrafficFlowDuration0 for representing separate samples or an updated copy. -
public float4 m_TrafficFlowDistance0
Stores first set of traffic flow distances as a float4. Represents aggregated distances related to traffic flow measurements. -
public float4 m_TrafficFlowDistance1
Second set / duplicate of traffic flow distances (float4). -
public RoadFlags m_Flags
A RoadFlags enum value containing flag bits for the road. In serialized form this flag is written/read as a single byte.
Properties
- (This struct defines no C# properties; it exposes public fields directly.)
Constructors
public Road()
(implicit default struct constructor)
No explicit constructor is defined in the source. The struct relies on the implicit default constructor (all fields default-initialized). When used as an ECS component, instances are typically created/managed by the entities system.
Methods
public void Serialize<TWriter>(TWriter writer) where TWriter : IWriter
Writes the component state to the provided writer. Serialization order:- m_TrafficFlowDuration0 (float4)
- m_TrafficFlowDuration1 (float4)
- m_TrafficFlowDistance0 (float4)
- m_TrafficFlowDistance1 (float4)
- m_Flags written as a single byte
This method assumes the writer is compatible with Colossal.Serialization.Entities.IWriter.
-
public void Deserialize<TReader>(TReader reader) where TReader : IReader
Reads component state from the provided reader with explicit backward-compatibility handling depending on saved data version (reader.context.version): -
If version >= Version.netInfoviewImprovements:
- Reads four float4 values (duration0, duration1, distance0, distance1) into the corresponding fields.
- Else (older versions):
- Reads two float4 values: m_TrafficFlowDuration0 and m_TrafficFlowDistance0.
- If version < Version.trafficFlowFixes:
- Applies legacy fix/conversion:
- Computes temp = m_TrafficFlowDuration0 + 1f
- Scales m_TrafficFlowDistance0 by 0.01f (presumably to convert units)
- Recomputes m_TrafficFlowDuration0 componentwise as: math.select(m_TrafficFlowDistance0 / temp, 0f, temp <= 0f) (i.e., if temp <= 0 choose 0, otherwise use distance / temp)
- After legacy fixes (or for versions between trafficFlowFixes and netInfoviewImprovements):
- Halves m_TrafficFlowDuration0 and m_TrafficFlowDistance0 (multiply by 0.5f).
- Copies these halved values into m_TrafficFlowDuration1 and m_TrafficFlowDistance1 (duplicates).
- Finally, if version >= Version.roadFlags:
- Reads one byte and casts to RoadFlags to populate m_Flags.
Notes about math.select: math.select(a, b, condition) returns componentwise (condition ? b : a). In this code the call ensures that when temp <= 0 the duration becomes 0, otherwise it becomes distance / temp.
Usage Example
// Example usage in a mod or system — pseudo-code showing intent.
// Actual writer/reader types come from Colossal.Serialization.Entities and the game's save system.
using Unity.Mathematics;
using Game.Net;
// Creating and populating a Road component
var road = new Road();
road.m_TrafficFlowDuration0 = new float4(2.0f, 1.5f, 0.8f, 0.0f);
road.m_TrafficFlowDuration1 = road.m_TrafficFlowDuration0; // duplicate or updated separately
road.m_TrafficFlowDistance0 = new float4(100f, 80f, 40f, 0f);
road.m_TrafficFlowDistance1 = road.m_TrafficFlowDistance0;
road.m_Flags = RoadFlags.None; // or appropriate enum value
// Serializing (pseudo-code; concrete writer comes from game's serialization API)
IWriter writer = /* obtain writer from game's serialization context */;
road.Serialize(writer);
// Deserializing (pseudo-code; concrete reader comes from game's serialization API)
IReader reader = /* obtain reader from game's deserialization context */;
var readRoad = new Road();
readRoad.Deserialize(reader);
// readRoad now contains the deserialized and version-adjusted values
Notes and implementation tips: - The component is designed for use with Unity's DOTS/ECS (IComponentData). Access and modification are normally done via systems (IJobForEach, Entities.ForEach, or EntityManager APIs). - The float4 fields are likely a packed representation for up to 4 lanes/segments; treat component fields as batch data rather than per-lane individual objects. - The Deserialize method contains explicit version checks (Version.netInfoviewImprovements, Version.trafficFlowFixes, Version.roadFlags). When writing migration or compatibility code in mods, be mindful of these version gates to keep save/load compatibility. - RoadFlags is persisted as a single byte — ensure your custom flags (if extending via mod) are compatible with storage expectations.