void RemoveBuildOrder(BuildOrder buildOrder) { if (this.CurrentBuildOrder != buildOrder) { buildOrder.PropertyChanged -= OnBuildOrderPropertyChanged; var ok = m_buildOrderQueue.Remove(buildOrder); Debug.Assert(ok); } else { StopCurrentJob(); buildOrder.IsUnderWork = false; var next = FindNextBuildOrder(buildOrder); if (next == buildOrder) next = null; buildOrder.PropertyChanged -= OnBuildOrderPropertyChanged; m_buildOrderQueue.Remove(buildOrder); this.CurrentBuildOrder = next; if (next != null) next.IsUnderWork = true; } }
BuildOrder FindNextBuildOrder(BuildOrder previousBuildOrder) { if (m_buildOrderQueue.Count == 0) return null; int idx; if (previousBuildOrder != null) idx = m_buildOrderQueue.IndexOf(previousBuildOrder); else idx = -1; for (int i = 0; i < m_buildOrderQueue.Count; ++i) { idx = (idx + 1) % m_buildOrderQueue.Count; var buildOrder = m_buildOrderQueue[idx]; if (buildOrder.IsSuspended) continue; return buildOrder; } return null; }
public void AddBuildOrder(BuildOrder buildOrder) { buildOrder.PropertyChanged += OnBuildOrderPropertyChanged; m_buildOrderQueue.Add(buildOrder); trace.TraceInformation("new order {0}", buildOrder); if (this.CurrentBuildOrder == null) MoveToNextBuildOrder(); }
IJobGroup CreateJob(BuildOrder order) { var ok = FindMaterials(order); if (!ok) { Events.AddGameEvent(this.Workbench, "Failed to find materials for {0}.", this.CurrentBuildOrder.BuildableItemID); return null; } var job = new Jobs.JobGroups.BuildItemJob(this, this.Workbench, order.BuildableItem.Key, order.SourceItems); this.Environment.World.Jobs.Add(job); return job; }
void MoveToNextBuildOrder() { StopCurrentJob(); var current = this.CurrentBuildOrder; if (current != null) current.IsUnderWork = false; var next = FindNextBuildOrder(current); this.CurrentBuildOrder = next; if (next != null) next.IsUnderWork = true; }
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; } }