public Vector3Int GetPosition() { if (WalkingTo == StorageType.Crate) { foreach (var location in ClosestLocations) { if (!LastCratePosition.Contains(location) && !InProgress.Contains(location) && StorageFactory.CrateLocations[Job.Owner].TryGetValue(location, out var inv) && inv.IsAlmostFull && inv.StorageTypeLookup[StorageType.Stockpile].Count > 0) { CurrentCratePosition = location; InProgress.Add(location); break; } } // No new goal. go back to job pos. if (CurrentCratePosition == Vector3Int.invalidPos) { return(PorterJob.OriginalPosition); } return(CurrentCratePosition); } else { return(StorageFactory.GetStockpilePosition(Job.Owner).Position); } }
public void StartQuest(Quest quest) { Unstarted.Remove(quest); InProgress.Add(quest); quest.StartQuest(); Debug.Log("Quest " + quest.QuestName + " has started"); Debug.Log("Next task " + quest.CurrentTask()); }
public void Track(ushort step, TasksManager manager) { if (manager == null) { throw new ArgumentNullException(nameof(manager)); } ToDo.Add(step, manager.ToDo.Count); InProgress.Add(step, manager.InProgress.Count); Done.Add(step, manager.Done.Count); Cancelled.Add(step, manager.Cancelled.Count); }
public Vector3Int GetPosition() { if (WalkingTo == StorageType.Crate) { // check for full crates. ensure they get serviced first foreach (var location in ClosestLocations) { if (!LastCratePosition.Contains(location) && !InProgress.Contains(location) && StorageFactory.CrateLocations[Job.Owner].TryGetValue(location, out var inv) && inv.IsAlmostFull && inv.StorageTypeLookup[StorageType.Stockpile].Count > 0) { CurrentCratePosition = location; InProgress.Add(location); break; } } // No new goal. just take anything if (CurrentCratePosition == Vector3Int.invalidPos) { foreach (var location in ClosestLocations) { if (!LastCratePosition.Contains(location) && !InProgress.Contains(location) && StorageFactory.CrateLocations[Job.Owner].TryGetValue(location, out var inv) && inv.StorageTypeLookup[StorageType.Stockpile].Count > 0) { CurrentCratePosition = location; InProgress.Add(location); break; } } } // everything is empty stand at job. if (CurrentCratePosition == Vector3Int.invalidPos) { return(PorterJob.OriginalPosition); } return(CurrentCratePosition); } else { return(StorageFactory.GetStockpilePosition(Job.Owner).Position); } }
/// <summary> /// Add a task directly in AverageInProgress /// </summary> /// <param name="task"></param> public void AddInProgress(SymuTask task) { if (task is null) { throw new ArgumentNullException(nameof(task)); } InProgress.Add(task); // We don't want to track message as Task if (task.Parent is Message) { return; } TaskResult.TotalTasksNumber++; TaskResult.InProgress++; task.SetTasksManager(this); }
/// <summary> /// Распределение задач по коллекциям /// </summary> private void Distribution() { foreach (PlannerTask task in Queue) { if (task.TaskStatus == State.Waiting) { Waiting.Add(task); } if (task.TaskStatus == State.InProgress) { InProgress.Add(task); } if (task.TaskStatus == State.Perfomed) { Perfomed.Add(task); } } }
/// <summary> /// Push the task in progress /// </summary> /// <param name="task"></param> public void SetInProgress(SymuTask task) { if (task is null) { throw new ArgumentNullException(nameof(task)); } ToDo.Remove(task); InProgress.Add(task); OnAfterSetTaskInProgress?.Invoke(this, new TaskEventArgs(task)); // We don't want to track message as Task if (task.Parent is Message) { return; } TaskResult.ToDo--; TaskResult.InProgress++; }
/// <inheritdoc/> protected override TAssociate CreateCustomAssociate <TKey1, TKey2, TAssociate>() { Pair <Type> keyTypePair = new Pair <Type>(typeof(TKey1), typeof(TKey2)); if (InProgress.ContainsKey(keyTypePair)) { throw new InvalidOperationException(Strings.ExRecursiveAssociateLookupDetected); } InProgress.Add(keyTypePair, true); try { TAssociate associate = base.CreateCustomAssociate <TKey1, TKey2, TAssociate>(); if (associate != null) { return(associate); } IAdvancedConverterFactory <TKey1> f1 = base.GetAssociate <TKey1, IAdvancedConverterFactory <TKey1>, IAdvancedConverterFactory <TKey1> >(); if (f1 != null) { associate = f1.CreateForwardConverter <TKey2>() as TAssociate; if (associate != null) { return(associate); } } IAdvancedConverterFactory <TKey2> f2 = base.GetAssociate <TKey2, IAdvancedConverterFactory <TKey2>, IAdvancedConverterFactory <TKey2> >(); if (f2 != null) { associate = f2.CreateBackwardConverter <TKey1>() as TAssociate; if (associate != null) { return(associate); } } return(null); } finally { InProgress.Remove(keyTypePair); } }
/// <summary> /// Creates associate instance for specified parameter and result types. /// </summary> /// <typeparam name="TKey">Type to create the associate for.</typeparam> /// <typeparam name="TAssociate">Type of result to create the associate for.</typeparam> /// <param name="foundFor">The type associate was found for.</param> /// <returns>Newly created instance of associate, if found; /// otherwise, <see langword="null"/>.</returns> /// <exception cref="InvalidOperationException">Recursive associate lookup.</exception> protected virtual TAssociate CreateAssociate <TKey, TAssociate>(out Type foundFor) where TAssociate : class { if (InProgress == null) { InProgress = new SetSlim <TypePair>(); } var progressionMark = new TypePair(typeof(TKey), typeof(TAssociate)); if (InProgress.Contains(progressionMark)) { throw new InvalidOperationException(Strings.ExRecursiveAssociateLookupDetected); } InProgress.Add(progressionMark); try { var associate = TypeHelper.CreateAssociate <TAssociate>( typeof(TKey), out foundFor, TypeSuffixes, constructorParams, highPriorityLocations); return(associate); } finally { InProgress.Remove(progressionMark); } }
public void PerformGoal(ref NPCBase.NPCState state) { state.JobIsDone = true; if (WalkingTo == StorageType.Stockpile) { if (CrateFull) { Job.NPC.Inventory.Dump(Job.Owner.Stockpile); CrateFull = false; } WalkingTo = StorageType.Crate; var nexPos = Vector3Int.invalidPos; foreach (var location in ClosestLocations) { if (!LastCratePosition.Contains(location) && !InProgress.Contains(location) && StorageFactory.CrateLocations[Job.Owner].TryGetValue(location, out var inv) && !inv.IsAlmostFull && ItemsNeeded.TryGetValue(location, out var itemsNeeded)) { nexPos = location; InProgress.Add(location); var addToInv = StorageFactory.TryTakeItems(Job.Owner, itemsNeeded.Values); var leftovers = new List <StoredItem>(); foreach (var item in addToInv) { if (Job.NPC.Inventory.Full) { leftovers.Add(item); } else { Job.NPC.Inventory.Add(item); } } StorageFactory.StoreItems(Job.Owner, leftovers); break; } } CurrentCratePosition = nexPos; if (nexPos == Vector3Int.invalidPos) { LastCratePosition.Clear(); state.SetCooldown(5); } else { state.SetCooldown(1); state.SetIndicator(new Shared.IndicatorState(5, ItemId.GetItemId(StockpileBlock.Name).Id)); } } else { if (StorageFactory.CrateLocations[Job.Owner].TryGetValue(CurrentCratePosition, out var crateInventory)) { WalkingTo = StorageType.Stockpile; var leftovers = crateInventory.TryAdd(Job.NPC.Inventory.Inventory.Select(ii => new StoredItem(ii, int.MaxValue, StorageType.Crate)).ToArray()); state.SetCooldown(1); state.SetIndicator(new Shared.IndicatorState(5, ColonyBuiltIn.ItemTypes.CRATE.Id)); if (leftovers.Count > 0) { Job.NPC.Inventory.Inventory.Clear(); foreach (var item in leftovers) { Job.NPC.Inventory.Add(item); } CrateFull = true; } } else { CrateFull = true; state.SetCooldown(1); state.SetIndicator(new Shared.IndicatorState(5, ColonyBuiltIn.ItemTypes.CRATE.Id, false, false)); } } }