Example #1
0
    private IEnumerator ProcessJobs()
    {
        while (true)
        {
            yield return(new WaitForSeconds(jobUpdateCooldown));

            if (_availableJobs.Count == 0 || _availableWorkers.Count == 0)
            {
                continue;
            }
            for (int j = _availableWorkers.Count - 1; j >= 0; j--)
            {
                JobHandlerComponent worker = _availableWorkers[j];
                for (int i = _availableJobs.Count - 1; i >= 0; i--)
                {
                    if (_availableJobs[i].CanDoJob(worker))
                    {
                        worker.AssignJob(_availableJobs[i]);
                        _availableJobs.RemoveAt(i);
                        break;
                    }
                }
            }
        }
    }
    public override bool CanDoJob(JobHandlerComponent worker)
    {
        if (_wasJobCanceled)
        {
            JobSystem.GetInstance().DeleteJob(this);
            return(false);
        }

        //check that worker can actually get to the dropPosition
        if (!base.CanDoJob(worker))
        {
            return(false);
        }

        //item search
        Func <Tile, bool> requirementsFunction = delegate(Tile tile) {
            if (tile == null)
            {
                return(false);
            }
            else
            {
                if (tile.Contents.HasItem)
                {
                    return(tile.Contents.Item.GetType().Equals(ItemType) && tile.Contents.Item.HasHaulJob == false);
                }
                else
                {
                    return(false);
                }
            }
        };

        Tile t = SearchEngine.FindClosestBySubregionTileWhere(worker.MotionComponent.GridPosition, requirementsFunction, true);

        if (t == null)
        {
            JobSystem.GetInstance().StartCoroutine(JobSystem.GetInstance().HideJobForSeconds(this, 5f));
            return(false);
        }
        else
        {
            _item = t.Contents.Item;
            return(true);
        }
        /////////////////
    }
Example #3
0
    public virtual bool CanDoJob(JobHandlerComponent worker)
    {
        if (worker.IsAvailable == false)
        {
            return(false);
        }

        Node jobNode    = Utils.NodeAt(Position);
        Node workerNode = Utils.NodeAt(worker.MotionComponent.GridPosition);

        if (SearchEngine.FindNodeNear(jobNode, workerNode) is null)
        {
            return(false);
        }

        return(true);
    }
Example #4
0
 public bool HasWorker(JobHandlerComponent worker)
 {
     return(_availableWorkers.Contains(worker));
 }
Example #5
0
 public void RemoveWorker(JobHandlerComponent worker) => _availableWorkers.Remove(worker);
Example #6
0
 public void AddWorker(JobHandlerComponent worker)
 {
     _availableWorkers.Add(worker);
     ProcessJobs();
 }
Example #7
0
 private void InitializeJobHandler()
 {
     JobHandlerComponent = new JobHandlerComponent(this);
     Components.Add(JobHandlerComponent);
 }
Example #8
0
 public void AssignWorker(JobHandlerComponent worker)
 {
     _worker = worker;
     PlanJob();
 }