/// <summary> /// Allow the specified district or park to be serviced by the specified building /// </summary> /// <param name="buildingId"></param> /// <param name="districtPark"></param> public static void AddOutputDistrictParkServiced(int buildingId, DistrictPark districtPark) { if (AddDistrictParkServiced(m_outputBuildingToDistrictParkServiced, buildingId, districtPark)) { var buildingName = TransferManagerInfo.GetBuildingName(buildingId); Logger.Log($"Constraints::AddOutputDistrictParkServiced: {buildingName} ({buildingId}) => {districtPark.Name} ..."); } }
/// <summary> /// Called when a district or park is removed. /// </summary> /// <param name="districtPark"></param> public static void ReleaseDistrictPark(DistrictPark districtPark) { Logger.Log($"Constraints::ReleaseDistrictPark: {districtPark.Name}"); for (int buildingId = 0; buildingId < BuildingManager.MAX_BUILDING_COUNT; buildingId++) { RemoveInputDistrictParkServiced(buildingId, districtPark); RemoveOutputDistrictParkServiced(buildingId, districtPark); } }
public static bool Prefix(byte park, ref DistrictPark data) { var districtPark = DistrictPark.FromPark(park); if (districtPark.Name != string.Empty) { Constraints.ReleaseDistrictPark(districtPark); } return(true); }
/// <summary> /// Returns the district and/or park of the building. /// Should return 0 if the building is not in a district and/or park. /// </summary> /// <returns></returns> public static DistrictPark GetDistrictPark(int building) { if (building != 0) { var position = BuildingManager.instance.m_buildings.m_buffer[building].m_position; return(DistrictPark.FromPosition(position)); } else { return(new DistrictPark()); } }
/// <summary> /// Returns the district of the offer's home building or segment. /// Should return 0 if the offer does not originate from a district. /// </summary> /// <returns></returns> public static DistrictPark GetDistrictPark(TransferManager.TransferReason material, ref TransferManager.TransferOffer offer) { if (offer.NetSegment != 0) { var position = NetManager.instance.m_segments.m_buffer[offer.NetSegment].m_middlePosition; return(DistrictPark.FromPosition(position)); } else if ((material == TransferManager.TransferReason.Sick || material == TransferManager.TransferReason.Taxi) && offer.Citizen != 0) { return(DistrictPark.FromPosition(offer.Position)); } else { return(GetDistrictPark(GetHomeBuilding(ref offer))); } }
/// <summary> /// Called when a building is first created. If situated in a district or park, then automatically restricts that /// building to serve its home district only. /// </summary> /// <param name="buildingId"></param> public static void CreateBuilding(ushort buildingId) { if (!TransferManagerInfo.IsDistrictServicesBuilding(buildingId)) { return; } var buildingInfo = BuildingManager.instance.m_buildings.m_buffer[buildingId].Info; var service = buildingInfo.GetService(); var subService = buildingInfo.GetSubService(); var ai = buildingInfo.GetAI(); // Do not pack the homeDistrict and homePark into a single DistrictPark struct. Otherwise, it will make // removing districts/parks a lot harder!! var position = BuildingManager.instance.m_buildings.m_buffer[buildingId].m_position; var homeDistrict = DistrictManager.instance.GetDistrict(position); var homePark = DistrictManager.instance.GetPark(position); Logger.Log($"Constraints::CreateBuilding: buildingId={buildingId}, homeDistrict={homeDistrict}, homePark={homePark}, service={service}, subService={subService}, ai={ai}"); // Set default input settings. SetAllInputLocalAreas(buildingId, true); SetAllInputOutsideConnections(buildingId, true); m_inputBuildingToDistrictParkServiced[buildingId] = null; // Do not set the home district for these types of buildings. if (ai is ChildcareAI || ai is EldercareAI) { homeDistrict = 0; homePark = 0; } // Serve all areas if the building doesn't belong to any district or park. SetAllOutputLocalAreas(buildingId, homeDistrict == 0 && homePark == 0); SetAllOutputOutsideConnections(buildingId, homeDistrict == 0 && homePark == 0); m_outputBuildingToDistrictParkServiced[buildingId] = null; if (homeDistrict != 0) { AddOutputDistrictParkServiced(buildingId, DistrictPark.FromDistrict(homeDistrict)); } if (homePark != 0) { AddOutputDistrictParkServiced(buildingId, DistrictPark.FromPark(homePark)); } }
public static bool CanUseTaxis(Vector3 startPosition, Vector3 endPosition) { var startDistrictPark = DistrictPark.FromPosition(startPosition); var endDistrictPark = DistrictPark.FromPosition(endPosition); // Now see whether any taxi buildings serve this position. for (int i = 0; i < m_taxiBuildings.Count; i++) { var buildingId = m_taxiBuildings[i]; if (BuildingManager.instance.m_buildings.m_buffer[buildingId].Info?.GetSubService() == ItemClass.SubService.PublicTransportTaxi) { var districtParkServed = Constraints.OutputDistrictParkServiced((ushort)buildingId); if (startDistrictPark.IsServedBy(districtParkServed) && endDistrictPark.IsServedBy(districtParkServed)) { return(true); } } } return(false); }
/// <summary> /// Load data from given object. /// </summary> /// <param name="data"></param> public static void LoadData(Serialization.Datav4 data) { Logger.Log($"Constraints::LoadData: version {data.Id}"); Clear(); var buildings = Utils.GetSupportedServiceBuildings(); foreach (var building in buildings) { var name = TransferManagerInfo.GetBuildingName(building); var buildingInfo = BuildingManager.instance.m_buildings.m_buffer[building].Info; var service = buildingInfo.GetService(); var subService = buildingInfo.GetSubService(); var ai = buildingInfo.GetAI(); Logger.Log($"Constraints::LoadData: buildingName={name}, buildingId={building}, service={service}, subService={subService}, ai={ai}"); var restrictions1 = data.InputBuildingToAllLocalAreas[building]; SetAllInputLocalAreas(building, restrictions1); var restrictions2 = data.InputBuildingToOutsideConnections[building]; SetAllInputOutsideConnections(building, restrictions2); var restrictions3 = data.InputBuildingToDistrictServiced[building]; if (restrictions3 != null) { foreach (var districtPark in restrictions3) { AddInputDistrictParkServiced(building, DistrictPark.FromSerializedInt(districtPark)); } } var restrictions4 = data.OutputBuildingToAllLocalAreas[building]; SetAllOutputLocalAreas(building, restrictions4); var restrictions5 = data.OutputBuildingToOutsideConnections[building]; SetAllOutputOutsideConnections(building, restrictions5); var restrictions6 = data.OutputBuildingToDistrictServiced[building]; if (restrictions6 != null) { foreach (var districtPark in restrictions6) { AddOutputDistrictParkServiced(building, DistrictPark.FromSerializedInt(districtPark)); } } if (data.BuildingToInternalSupplyBuffer != null) { var restrictions7 = data.BuildingToInternalSupplyBuffer[building]; SetInternalSupplyReserve(building, restrictions7); } if (data.BuildingToBuildingServiced != null) { var restrictions8 = data.BuildingToBuildingServiced[building]; if (restrictions8 != null) { foreach (var destination in restrictions8) { AddSupplyChainConnection(building, (ushort)destination); } } } m_globalOutsideConnectionIntensity = data.GlobalOutsideConnectionIntensity; m_globalOutsideToOutsideMaxPerc = data.GlobalOutsideToOutsideMaxPerc; Logger.Log(""); } }
private static void RemoveDistrictParkServiced(List <DistrictPark>[] array, int buildingId, DistrictPark districtPark) { if (array[buildingId] == null) { return; } for (int i = 0; i < array[buildingId].Count;) { if (array[buildingId][i].IsServedBy(districtPark)) { array[buildingId].RemoveAt(i); } else { i++; } } if (array[buildingId].Count == 0) { array[buildingId] = null; } }
/// <summary> /// Disallow the specified district or park from being serviced by the specified building /// </summary> /// <param name="buildingId"></param> /// <param name="districtPark"></param> public static void RemoveOutputDistrictParkServiced(int buildingId, DistrictPark districtPark) { RemoveDistrictParkServiced(m_outputBuildingToDistrictParkServiced, buildingId, districtPark); }
private static bool AddDistrictParkServiced(List <DistrictPark>[] array, int buildingId, DistrictPark districtPark) { if (!TransferManagerInfo.IsDistrictServicesBuilding(buildingId)) { var buildingName = TransferManagerInfo.GetBuildingName(buildingId); Logger.LogWarning($"Constraints::AddDistrictParkServiced: Ignoring {districtPark.Name} restriction because {buildingName} ({buildingId}) is not a district services building."); return(false); } if (!districtPark.Exists) { Logger.LogWarning($"Constraints::AddDistrictParkServiced: Ignoring {districtPark.Name} restriction because this district/park does not exist."); return(false); } if (array[buildingId] == null) { array[buildingId] = new List <DistrictPark>(); } if (!array[buildingId].Contains(districtPark)) { array[buildingId].Add(districtPark); } return(true); }