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;
                                }
                            }
                        }
                    }
                }
            }
        }
Пример #2
0
        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);
            }
        }