Skip to content

Game.Serialization.RequiredComponentSystem

Assembly: Assembly-CSharp
Namespace: Game.Serialization

Type: class

Base: GameSystemBase

Summary:
RequiredComponentSystem is an ECS system that runs during game load/serialization to ensure entities have the correct set of components (and component data/buffers/shared components) for the current game version. It contains a large set of EntityQuery fields targeted at detecting entities missing specific components (or having components that need migration) and, on update, it adds/removes components, initializes buffers, sets default component data, and performs migration/cleanup tasks depending on the save/context version. This system is responsible for many compatibility and initialization steps when loading maps or migrating old saves to newer data layouts.


Fields

  • private LoadGameSystem m_LoadGameSystem
    Used to access the current load context (version/purpose). Frequently consulted to make version-dependent migration decisions and to get the load Context.

  • private EntityQuery m_BlockedLaneQuery

  • private EntityQuery m_CarLaneQuery
  • private EntityQuery m_BuildingEfficiencyQuery
  • private EntityQuery m_PolicyQuery
  • private EntityQuery m_CityModifierQuery
  • private EntityQuery m_ServiceDispatchQuery
  • private EntityQuery m_PathInformationQuery
  • private EntityQuery m_NodeGeometryQuery
  • private EntityQuery m_MeshColorQuery
  • private EntityQuery m_MeshBatchQuery
  • private EntityQuery m_RoutePolicyQuery
  • private EntityQuery m_RouteModifierQuery
  • private EntityQuery m_EdgeQuery
  • private EntityQuery m_StorageTaxQuery
  • private EntityQuery m_CityFeeQuery
  • private EntityQuery m_CityFeeQuery2
  • private EntityQuery m_ServiceFeeParameterQuery
  • private EntityQuery m_OutsideGarbageQuery
  • private EntityQuery m_OutsideFireStationQuery
  • private EntityQuery m_OutsidePoliceStationQuery
  • private EntityQuery m_OutsideEfficiencyQuery
  • private EntityQuery m_RouteInfoQuery
  • private EntityQuery m_CompanyProfitabilityQuery
  • private EntityQuery m_StorageQuery
  • private EntityQuery m_RouteBufferIndexQuery
  • private EntityQuery m_CurveElementQuery
  • private EntityQuery m_CitizenPrefabQuery
  • private EntityQuery m_CitizenNameQuery
  • private EntityQuery m_HouseholdNameQuery
  • private EntityQuery m_LabelVertexQuery
  • private EntityQuery m_DistrictNameQuery
  • private EntityQuery m_AnimalNameQuery
  • private EntityQuery m_HouseholdPetQuery
  • private EntityQuery m_RoadNameQuery
  • private EntityQuery m_RouteNumberQuery
  • private EntityQuery m_ChirpRandomLocQuery
  • private EntityQuery m_BlockerQuery
  • private EntityQuery m_CitizenPresenceQuery
  • private EntityQuery m_SubLaneQuery
  • private EntityQuery m_SubObjectQuery
  • private EntityQuery m_NativeQuery
  • private EntityQuery m_GuestVehicleQuery
  • private EntityQuery m_TravelPurposeQuery
  • private EntityQuery m_TreeEffectQuery
  • private EntityQuery m_TakeoffLocationQuery
  • private EntityQuery m_LeisureQuery
  • private EntityQuery m_PlayerMoneyQuery
  • private EntityQuery m_PseudoRandomSeedQuery
  • private EntityQuery m_TransportDepotQuery
  • private EntityQuery m_ServiceUsageQuery
  • private EntityQuery m_OutsideSellerQuery
  • private EntityQuery m_LoadingResourcesQuery
  • private EntityQuery m_CompanyVehicleQuery
  • private EntityQuery m_LaneRestrictionQuery
  • private EntityQuery m_LaneOverlapQuery
  • private EntityQuery m_DispatchedRequestQuery
  • private EntityQuery m_HomelessShelterQuery
  • private EntityQuery m_QueueQuery
  • private EntityQuery m_BoneHistoryQuery
  • private EntityQuery m_UnspawnedQuery
  • private EntityQuery m_ConnectionLaneQuery
  • private EntityQuery m_AreaLaneQuery
  • private EntityQuery m_OfficeQuery
  • private EntityQuery m_VehicleModelQuery
  • private EntityQuery m_PassengerTransportQuery
  • private EntityQuery m_ObjectColorQuery
  • private EntityQuery m_OutsideConnectionQuery
  • private EntityQuery m_NetConditionQuery
  • private EntityQuery m_NetPollutionQuery
  • private EntityQuery m_TrafficSpawnerQuery
  • private EntityQuery m_AreaExpandQuery
  • private EntityQuery m_EmissiveQuery
  • private EntityQuery m_TrainBogieFrameQuery
  • private EntityQuery m_EditorContainerQuery
  • private EntityQuery m_ProcessingTradeCostQuery
  • private EntityQuery m_StorageConditionQuery
  • private EntityQuery m_LaneColorQuery
  • private EntityQuery m_CompanyNotificationQuery
  • private EntityQuery m_PlantQuery
  • private EntityQuery m_CityPopulationQuery
  • private EntityQuery m_CityTourismQuery
  • private EntityQuery m_LaneElevationQuery
  • private EntityQuery m_BuildingNotificationQuery
  • private EntityQuery m_AreaElevationQuery
  • private EntityQuery m_BuildingLotQuery
  • private EntityQuery m_AreaTerrainQuery
  • private EntityQuery m_OwnedVehicleQuery
  • private EntityQuery m_EdgeMappingQuery
  • private EntityQuery m_SubFlowQuery
  • private EntityQuery m_PointOfInterestQuery
  • private EntityQuery m_BuildableAreaQuery
  • private EntityQuery m_SubAreaQuery
  • private EntityQuery m_CrimeVictimQuery
  • private EntityQuery m_ArrivedQuery
  • private EntityQuery m_MailSenderQuery
  • private EntityQuery m_CarKeeperQuery
  • private EntityQuery m_NeedAddHasJobSeekerQuery
  • private EntityQuery m_NeedAddPropertySeekerQuery
  • private EntityQuery m_AgeGroupQuery
  • private EntityQuery m_PrefabRefQuery
  • private EntityQuery m_LabelMaterialQuery
  • private EntityQuery m_ArrowMaterialQuery
  • private EntityQuery m_LockedQuery
  • private EntityQuery m_OutsideUpdateQuery
  • private EntityQuery m_WaitingPassengersQuery
  • private EntityQuery m_ObjectSurfaceQuery
  • private EntityQuery m_WaitingPassengersQuery2
  • private EntityQuery m_PillarQuery
  • private EntityQuery m_LegacyEfficiencyQuery
  • private EntityQuery m_SignatureQuery
  • private EntityQuery m_SubObjectOwnerQuery
  • private EntityQuery m_DangerLevelMissingQuery
  • private EntityQuery m_MeshGroupQuery
  • private EntityQuery m_UpdateFrameQuery
  • private EntityQuery m_FenceQuery
  • private EntityQuery m_NetGeometrySectionQuery
  • private EntityQuery m_NetLaneArchetypeDataQuery
  • private EntityQuery m_PathfindUpdatedQuery
  • private EntityQuery m_RouteColorQuery
  • private EntityQuery m_CitizenQuery
  • private EntityQuery m_ServiceUpkeepQuery
  • private EntityQuery m_MoveableBridgeQuery

(Notes: the class contains a very large collection of EntityQuery fields — each targets entities that need specific components added/removed or initialised. Above is a representative listing of the queries present in the source.)

  • private TypeHandle __TypeHandle
    Compiler-generated handle struct used by the generated system code to assign type handles; used during OnCreateForCompiler.

  • private EntityQuery __query_1938549531_0
    Internal/compiled query used to obtain TimeData including system inclusion options. Used by parts of the update logic (e.g., aging/death-wave mitigation).

Properties

  • None (this system does not expose public properties)

Constructors

  • public RequiredComponentSystem()
    Default constructor. In ECS systems this typically just calls base constructor; initialization of EntityQuery fields happens in OnCreate.

Methods

  • protected override void OnCreate() : System.Void
    Initializes the system: obtains the LoadGameSystem (m_LoadGameSystem), constructs a large number of EntityQuery objects (one per migration/initialization case) that identify entities missing expected components or requiring migration, and prepares any internal handles/queries used later.

  • protected override void OnUpdate() : System.Void
    Core migration/initialization logic run every update during load. For each EntityQuery the method checks whether the query is non-empty (via IsEmptyIgnoreFilter) and performs appropriate actions:

  • Adds missing components (AddComponent / AddComponentData).
  • Removes obsolete components.
  • Adds/initializes dynamic buffers and shared components.
  • Sets default component data (e.g., Profitability, ServiceUsage, CitizenPresence).
  • Performs version-dependent migrations/cleanup using the load context (m_LoadGameSystem.context.version) and context.purpose (LoadMap vs LoadGame).
  • Destroys entities with missing owners or invalid prefab references in some cases.
  • Handles special cases such as reseeding pseudo-random seeds, initializing update frames, moving data between components, enabling/disabling components introduced as "enableable" features, and other compatibility steps. This method is the main place where save-version upgrades and required component enforcement occur.

  • private void __AssignQueries(ref SystemState state) : System.Void
    Internal helper that builds compiled EntityQuery objects (e.g., __query_1938549531_0). It is used from OnCreateForCompiler to construct queries that include system options (IncludeSystems) and is part of generated/compiled system wiring.

  • protected override void OnCreateForCompiler() : System.Void
    Compiler-generated entry called during system creation in compiled form. Calls base.OnCreateForCompiler(), assigns compiled queries via __AssignQueries, and initializes type handles via __TypeHandle.__AssignHandles. This method supports the DOTS codegen/compilation path.

  • [Preserve] protected override void OnUpdate() and other methods are marked Preserve to avoid stripping; many internal calls (EntityManager.AddComponent, TryGetComponent, GetComponentData, ToEntityArray, etc.) are used throughout.

Usage Example

[Preserve]
protected override void OnCreate()
{
    base.OnCreate();
    // Example: obtain the load system to read context/version for migrations
    m_LoadGameSystem = base.World.GetOrCreateSystemManaged<LoadGameSystem>();

    // Example: create an EntityQuery for entities that have Car but are missing BlockedLane
    m_BlockedLaneQuery = GetEntityQuery(ComponentType.ReadOnly<Car>(), ComponentType.Exclude<BlockedLane>());
}

Notes and tips for modders: - This system runs many version-dependent migrations. If your mod introduces new components or changes serialization, consider integrating with the load pipeline (e.g., check context.version or provide your own upgrade logic) so older saves can be migrated safely. - Avoid duplicating expensive EntityQuery creation each update — define queries in OnCreate as shown in this class. - Be careful when adding/removing components during load: ensure any buffers/components you add are compatible with how your systems expect entities to be structured at runtime.