public static bool PreGetColor(ref Color __result, ushort vehicleID, ref Vehicle data, InfoManager.InfoMode infoMode) { if (data.m_transportLine == 0) { if (infoMode != InfoManager.InfoMode.None) { return(true); } ServiceSystemDefinition def = ServiceSystemDefinition.from(data.Info); if (def == default(ServiceSystemDefinition)) { return(true); } ushort buildingId = data.m_sourceBuilding; if (buildingId == 0) { return(true); } Color c = def.GetTransportExtension().GetEffectiveColorBuilding(buildingId); if (c == Color.clear) { return(true); } __result = c; return(false); } return(true); }
public static List <ushort> getAllBuildingsFromCity(ServiceSystemDefinition ssd, int?districtId = null, bool strict = false, bool mustAllowSpawn = false) { List <ushort> saida = new List <ushort>(); var bm = Singleton <BuildingManager> .instance; FastList <ushort> buildings; var ext = ssd.GetTransportExtension(); if (ssd.outsideConnection) { buildings = bm.GetOutsideConnections(); } else { buildings = bm.GetServiceBuildings(ssd.service); } SVMUtils.doLog("getAllBuildingsFromCity ({0}) buildings = {1} (s={2})", ssd, buildings.ToArray(), buildings.m_size); foreach (ushort i in buildings) { if (ssd.isFromSystem(bm.m_buildings.m_buffer[i].Info)) { if (districtId != null && ext.GetAllowDistrictServiceRestrictions()) { var buildingDistrict = DistrictManager.instance.GetDistrict(bm.m_buildings.m_buffer[i].m_position); if (districtId != buildingDistrict && (strict || !ext.GetAllowGoOutsideEffective(buildingDistrict))) { continue; } } if (mustAllowSpawn) { int max = GetMaxVehiclesBuilding(i, ssd.vehicleType, ssd.level); int count = 0; int cargo = 0; int capacity = 0; int inbound = 0; int outbound = 0; SVMBuildingUtils.CalculateOwnVehicles(i, ref bm.m_buildings.m_buffer[i], SVMBuildingAIOverrideUtils.getBuildingOverrideExtensionStrict(bm.m_buildings.m_buffer[i].Info).GetManagedReasons(bm.m_buildings.m_buffer[i].Info).Where(x => x.Value.vehicleLevel == null).Select(x => x.Key), ref count, ref cargo, ref capacity, ref inbound, ref outbound); if (count >= max) { continue; } } saida.Add(i); } } SVMUtils.doLog("getAllBuildingsFromCity ({0}) buildings = {1} (s={2}); saida.sz = {3}", ssd, buildings.ToArray(), buildings.m_size, saida.Count); return(saida); }
protected virtual bool ProcessOffer(ushort buildingID, ref Building data, TransferManager.TransferReason material, TransferManager.TransferOffer offer, TransferManager.TransferReason trTarget, StartTransferCallStructure tup, U instance) { if (material == trTarget) { ServiceSystemDefinition def = ServiceSystemDefinition.from(instance.m_info, tup.vehicleType); if (def == null) { SVMUtils.doLog("SSD Não definido para: {0} {1} {2} {3}", instance.m_info.m_class.m_service, instance.m_info.m_class.m_subService, tup.vehicleLevel ?? instance.m_info.m_class.m_level, tup.vehicleType); return(false); } #region District Check var ext = def.GetTransportExtension(); if (ext.GetAllowDistrictServiceRestrictions()) { var buildingDistrict = DistrictManager.instance.GetDistrict(data.m_position); var offerDistrict = DistrictManager.instance.GetDistrict(offer.Position); if (buildingDistrict != offerDistrict) { if (ServiceVehiclesManagerMod.debugMode) { SVMUtils.doLog($"Building serving different district: building {data.Info} ({buildingID} - districtId {buildingDistrict} {DistrictManager.instance.GetDistrictName(buildingDistrict)}) => offerDistrict: {offerDistrict} {DistrictManager.instance.GetDistrictName(offerDistrict)}"); } if (!ext.GetAllowOutsidersEffective(offerDistrict)) { var districtBuildings = SVMBuildingUtils.getAllBuildingsFromCity(def, offerDistrict, true, true); if (ServiceVehiclesManagerMod.debugMode) { SVMUtils.doLog($"Offer doesn't allow outsiders. Available buildings found: {districtBuildings}"); } if (districtBuildings.Count > 0) { var newBuildingId = districtBuildings[Singleton <SimulationManager> .instance.m_randomizer.Int32((uint)districtBuildings.Count)]; return(ProcessOffer(newBuildingId, ref BuildingManager.instance.m_buildings.m_buffer[newBuildingId], material, offer, trTarget, tup, instance)); } if (ServiceVehiclesManagerMod.debugMode) { SVMUtils.doLog($"Ignoring because no buildings can handle it"); } } if (!ext.GetAllowGoOutsideEffective(buildingDistrict)) { var districtBuildings = SVMBuildingUtils.getAllBuildingsFromCity(def, offerDistrict, false, true); if (ServiceVehiclesManagerMod.debugMode) { SVMUtils.doLog($"Building district doesn't allow go out. Available buildings found: {districtBuildings}"); } if (districtBuildings.Count > 0) { var newBuildingId = districtBuildings[Singleton <SimulationManager> .instance.m_randomizer.Int32((uint)districtBuildings.Count)]; return(ProcessOffer(newBuildingId, ref BuildingManager.instance.m_buildings.m_buffer[newBuildingId], material, offer, trTarget, tup, instance)); } if (ServiceVehiclesManagerMod.debugMode) { SVMUtils.doLog($"Ignoring because no buildings can handle it (2)"); } } } } #endregion SVMUtils.doLog("[{1}] SSD = {0}", def, material); VehicleInfo randomVehicleInfo = ServiceSystemDefinition.availableDefinitions[def].GetAModel(buildingID); SVMUtils.doLog("[{1}] Veh = {0}", randomVehicleInfo?.ToString() ?? "<NULL>", material); if (randomVehicleInfo != null) { Array16 <Vehicle> vehicles = Singleton <VehicleManager> .instance.m_vehicles; instance.CalculateSpawnPosition(buildingID, ref data, ref Singleton <SimulationManager> .instance.m_randomizer, randomVehicleInfo, out Vector3 position, out Vector3 vector2); if (Singleton <VehicleManager> .instance.CreateVehicle(out ushort num, ref Singleton <SimulationManager> .instance.m_randomizer, randomVehicleInfo, position, material, tup.tramsferToSource, tup.transferToTarget)) { randomVehicleInfo.m_vehicleAI.SetSource(num, ref vehicles.m_buffer[(int)num], buildingID); randomVehicleInfo.m_vehicleAI.StartTransfer(num, ref vehicles.m_buffer[(int)num], material, offer); return(true); } } } return(false); }