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.