public void PerformGoal(ref NPCBase.NPCState state)
        {
            state.JobIsDone = true;

            if (WalkingTo == StorageType.Crate)
            {
                state.SetCooldown(5);

                if (StorageFactory.CrateLocations.TryGetValue(Job.Owner, out var locs))
                {
                    if (locs.TryGetValue(CurrentCratePosition, out var crate))
                    {
                        state.SetIndicator(new Shared.IndicatorState(5, ColonyBuiltIn.ItemTypes.CRATE.Id));
                        ToStockpike = crate.StorageTypeLookup[StorageType.Stockpile].ToArray();
                        crate.TryTake(ToStockpike);
                        WalkingTo = StorageType.Stockpile;
                    }
                    else
                    {
                        state.SetCooldown(10);
                        JobSettings.SetGoal(Job, new StockpikeToCrateGoal(Job, JobSettings), ref state);
                    }
                }
                else
                {
                    CivLogger.Log(ChatColor.red, "Crate locations does not contain colony id {0}", Job.Owner.ColonyID);
                }
            }
            else
            {
                state.SetCooldown(5);
                state.SetIndicator(new Shared.IndicatorState(5, ColonyBuiltIn.ItemTypes.CRATE.Id));
                StorageFactory.StoreItems(Job.Owner, ToStockpike);
                ToStockpike = null;
                WalkingTo   = StorageType.Crate;
                InProgress.Remove(CurrentCratePosition);
                CurrentCratePosition = Vector3Int.invalidPos;
                GetPosition();
            }
        }
        public void PerformGoal(ref NPCBase.NPCState state)
        {
            state.JobIsDone = true;
            state.SetCooldown(1);

            if (WalkingTo == StorageType.Crate)
            {
                if (StorageFactory.CrateLocations.TryGetValue(Job.Owner, out var locs))
                {
                    if (locs.TryGetValue(CurrentCratePosition, out var crate))
                    {
                        ToStockpike = crate.GetAllItems(StorageType.Stockpile).Values.ToArray();
                        ShowIndicator(ref state);
                        crate.TryTake(ToStockpike);
                        WalkingTo = StorageType.Stockpile;
                    }
                    else
                    {
                        LastCratePosition.Clear();
                    }
                }
                else
                {
                    CivLogger.Log(ChatColor.red, "Crate locations does not contain colony id {0}", Job.Owner.ColonyID);
                }
            }
            else
            {
                ShowIndicator(ref state);
                StorageFactory.StoreItems(Job.Owner, ToStockpike);
                ToStockpike = null;
                WalkingTo   = StorageType.Crate;
                InProgress.Remove(CurrentCratePosition);
                CurrentCratePosition = Vector3Int.invalidPos;
                GetPosition();
            }
        }