// Forcibly selects the miner closest to a location, even if its busy Miner NextMinerForTask(Vector3 location, MinerTask task) { Miner retMiner = null; retMiner = NextAvailableMinerForTask(location, task); if (retMiner) { return(retMiner); } foreach (Miner miner in minerList) { if (task.CanMinerDo(miner)) { if (retMiner != null) { // TODO: experiment with using AStar distance calcs instead if (Vector3.Distance(miner.transform.position, location) < Vector3.Distance(retMiner.transform.position, location)) { retMiner = miner; } } else { retMiner = miner; } } } return(retMiner); }
public void CompleteTask() { MinerManager.instance.CompleteTask(currentTask); currentTask.DestroySelf(); currentTask = null; StopAllCoroutines(); DropHaulables(); }
public void StartTask(MinerTask newTask) { if (newTask != null && newTask.target) { newTask.StartTaskCoroutine(this); currentTask = newTask; currentTask.owner = this; EventManager.TriggerEvent("TaskStarted", currentTask.target); } }
public void PrioritizeAction() { MinerTask minerTask = taskable.currentTask.GetComponent <MinerTask>(); if (minerTask) { MinerManager.instance.DoTaskNow(minerTask); } // Factory tasks can't be prioritized }
// Forcible removes the task early public void CancelTask(MinerTask task) { if (queuedTaskList.Contains(task)) { queuedTaskList.Remove(task); task.Cancel(); } else if (selectedTaskList.Contains(task)) { task.owner.CompleteTask(); task.Cancel(); } }
public void DeselectTask(MinerTask task) { if (selectedTaskList.Contains(task)) { selectedTaskList.Remove(task); queuedTaskList.Add(task); } if (!queuedTaskList.Contains(task)) { queuedTaskList.Insert(0, task); } task.Unqueue(); }
// Returns the next task and moves it from the queue to selected public MinerTask GrabNextTask(Miner miner) { foreach (MinerTask task in queuedTaskList) { if (task.CanMinerDo(miner)) { MinerTask nextTask = queuedTaskList[0]; queuedTaskList.Remove(nextTask); selectedTaskList.Add(nextTask); return(nextTask); } } return(null); }
public void CancelAction() { MinerTask minerTask = taskable.currentTask.GetComponent <MinerTask>(); FactoryTask factoryTask = taskable.currentTask.GetComponent <FactoryTask>(); if (minerTask) { MinerManager.instance.CancelTask(minerTask); } else if (factoryTask) { factoryTask.owner.GetComponent <FactoryBase>().CancelTask(); } }
public void RefreshUI() { if (taskable.currentTask) { taskImage.sprite = taskable.currentTask.spriteRenderer.sprite; taskName.text = taskable.currentTask.taskName; prioritizeButton.interactable = false; MinerTask minerTask = taskable.currentTask.GetComponent <MinerTask>(); if (minerTask && !minerTask.owner) { prioritizeButton.interactable = true; } } else { Destroy(this.gameObject); } }
public void ForceTask(MinerTask task, Miner miner) { if (miner) { if (miner.currentTask) { DeselectTask(miner.currentTask); } task.Queue(); miner.SwapTask(task); if (queuedTaskList.Contains(task)) { queuedTaskList.Remove(task); } if (!selectedTaskList.Contains(task)) { selectedTaskList.Add(task); } } else { //TODO: notify user that no workers can do this task } }
// Removes the completed task from the selected list public void CompleteTask(MinerTask completedTask) { selectedTaskList.Remove(completedTask); completedTask.DestroySelf(); }
// Forcibly schedules a new task and throws the old current task to the front of the queue // TODO select a unit to perform the task right now better public void DoTaskNow(MinerTask task) { ForceTask(task, NextMinerForTask(task.TargetLocation(), task)); }
public void AddTaskToStartOfQueue(MinerTask task) { queuedTaskList.Insert(0, task); task.Queue(); }
public void AddTaskToQueue(MinerTask task) { queuedTaskList.Add(task); task.Queue(); }
// Prematurely stop work on a task public void UnqueueTask() { currentTask = null; StopAllCoroutines(); DropHaulables(); }
public void SwapTask(MinerTask task) { UnqueueTask(); StartTask(task); }