public static void RecalculateItemsNeeded() { ItemsNeeded.Clear(); foreach (var colony in ServerManager.ColonyTracker.ColoniesByID.Values) { if (colony != null && StorageFactory.CrateLocations.TryGetValue(colony, out var dict)) { foreach (var crate in dict.Keys) { foreach (var request in StorageFactory.CrateRequests) { var needed = request.GetItemsNeeded(crate); foreach (var need in needed) { if (!ItemsNeeded.TryGetValue(crate, out var items)) { items = new Dictionary <ushort, StoredItem>(); ItemsNeeded[crate] = items; } if (items.TryGetValue(need.Key, out var storedItem)) { storedItem.Add(needed.Count); } else { items[need.Key] = need.Value; } } } } } } }
public void OnTimedUpdate() { try { foreach (var job in PorterJobSettings.PorterJobs) { var settings = job.Settings as PorterJobSettings; if (settings.CurrentGoal.TryGetValue(job, out var goal) && job != null && job.Owner != null && StorageFactory.CrateLocations.TryGetValue(job.Owner, out var crateLocations)) { if (goal is CrateToStockpikeGoal cts) { cts.ClosestLocations = job.Position.SortClosestPositions(crateLocations.Keys); } else if (goal is StockpikeToCrateGoal stc) { stc.ClosestLocations = job.Position.SortClosestPositions(crateLocations.Keys); } } } int retry = 0; while (retry < 3) { ItemsNeeded.Clear(); foreach (var colony in ServerManager.ColonyTracker.ColoniesByID.Values) { if (colony != null && StorageFactory.CrateLocations.TryGetValue(colony, out var dict)) { foreach (var crate in dict.Keys) { foreach (var request in StorageFactory.CrateRequests) { var needed = request.GetItemsNeeded(crate); foreach (var need in needed) { if (!ItemsNeeded.TryGetValue(crate, out var items)) { items = new Dictionary <ushort, StoredItem>(); ItemsNeeded[crate] = items; } if (items.TryGetValue(need.Key, out var storedItem)) { storedItem.Add(needed.Count); } else { items[need.Key] = need.Value; } } } } } } retry = int.MaxValue; } } catch (Exception ex) { CivLogger.LogError(ex); } }