public void AddConstructJob(ConstructMode mode, IntGrid2Z area, IItemFilter userItemFilter) { var locations = area.Range().Where(p => m_environment.Contains(p)); ITerrainFilter filter; IItemFilter coreItemFilter; switch (mode) { case ConstructMode.Floor: filter = WorkHelpers.ConstructFloorTerrainFilter; coreItemFilter = WorkHelpers.ConstructFloorItemFilter; break; case ConstructMode.Pavement: filter = WorkHelpers.ConstructPavementTerrainFilter; coreItemFilter = WorkHelpers.ConstructPavementItemFilter; break; case ConstructMode.Wall: filter = WorkHelpers.ConstructWallTerrainFilter; coreItemFilter = WorkHelpers.ConstructWallItemFilter; break; default: throw new Exception(); } IItemFilter itemFilter; if (userItemFilter != null) { itemFilter = new AndItemFilter(coreItemFilter, userItemFilter); } else { itemFilter = coreItemFilter; } locations = locations.Where(p => filter.Match(m_environment.GetTileData(p))); foreach (var l in locations) { var data = new ConstructJobData() { Mode = mode, Location = l, ItemFilter = itemFilter, }; m_jobDataList.Add(data); } }
public void AddConstructJob(ConstructMode mode, IntGrid2Z area, IItemFilter userItemFilter) { var locations = area.Range().Where(p => m_environment.Contains(p)); ITerrainFilter filter; IItemFilter coreItemFilter; switch (mode) { case ConstructMode.Floor: filter = WorkHelpers.ConstructFloorTerrainFilter; coreItemFilter = WorkHelpers.ConstructFloorItemFilter; break; case ConstructMode.Pavement: filter = WorkHelpers.ConstructPavementTerrainFilter; coreItemFilter = WorkHelpers.ConstructPavementItemFilter; break; case ConstructMode.Wall: filter = WorkHelpers.ConstructWallTerrainFilter; coreItemFilter = WorkHelpers.ConstructWallItemFilter; break; default: throw new Exception(); } IItemFilter itemFilter; if (userItemFilter != null) itemFilter = new AndItemFilter(coreItemFilter, userItemFilter); else itemFilter = coreItemFilter; locations = locations.Where(p => filter.Match(m_environment.GetTileData(p))); foreach (var l in locations) { var data = new ConstructJobData() { Mode = mode, Location = l, ItemFilter = itemFilter, }; m_jobDataList.Add(data); } }
bool FindMaterials(BuildOrder order) { var buildableItem = order.BuildableItem; var numItems = buildableItem.FixedBuildMaterials.Count; int numFound = 0; for (int i = 0; i < buildableItem.FixedBuildMaterials.Count; ++i) { var bimi = buildableItem.FixedBuildMaterials[i]; var biis = order.UserItemFilters[i]; var filter = new AndItemFilter(bimi, biis); var ob = this.Environment.ItemTracker.GetReachableItemByDistance(this.Workbench.Location, filter, m_unreachables); if (ob == null) break; ob.ReservedBy = this; order.SourceItems[i] = ob; numFound++; } if (numFound < numItems) { trace.TraceInformation("Failed to find materials"); for (int i = 0; i < numFound; ++i) { order.SourceItems[i].ReservedBy = null; order.SourceItems[i] = null; } return false; } else { return true; } }