void Update() { if (isBusy() && agent.velocity.magnitude == 0) { if (++staticTime > 200) { agent.SetDestination(agent.destination); staticTime = 0; } } if (state == BOTSTATE.toCrate) { if (agent.remainingDistance < 0.2f && !agent.pathPending) { //GRAB BOX //Debug.Log("Accessing crate for order" + order.id); //Debug.Log(transform.name + " Accessing " + order.crate.GetInstanceID() + " of " + order.crate.r + " for order" + order.id); order.crate.transform.SetParent(transform); order.crate.transform.localPosition = new Vector3(0, 1f, -0.2f); order.crate.transform.localRotation = Quaternion.identity; state = BOTSTATE.toModule; agent.SetDestination(order.deliveryModule.transform.position); } } else if (state == BOTSTATE.toModule) { if (agent.remainingDistance < 0.2f && !agent.pathPending) { //DROP BOX state = BOTSTATE.idle; order.deliveryModule.notifyDelivery(order.crate); //GO TO BASE agent.SetDestination(Vector3.zero); //Destro BOX Model //Debug.Log(transform.name + " Destroying " + order.crate.GetInstanceID() + " of " + order.crate.r + " for order" + order.id); Destroy(order.crate.gameObject); } } else if (state == BOTSTATE.toPickUp) { if (agent.remainingDistance < 0.2f && !agent.pathPending) { order.pickUpModule.notifyPickUp(order.r); //GET BOX GameObject crate = Instantiate(rManager.cratePrefab, transform); crate.transform.localPosition = new Vector3(0, 1f, -0.2f); CrateBehavior c = crate.transform.GetComponent <CrateBehavior>(); order.crate = c; c.setType(order.r); //Debug.Log(transform.name + " Spawning " + order.crate.GetInstanceID() + " of " + order.crate.r + " for order" + order.id); state = BOTSTATE.toModule; agent.SetDestination(order.deliveryModule.transform.position); } } }
public void postPushCrate(CrateBehavior c) { Order o = new Order(null, c.r); o.crate = c; orders.Add(o); ++amounts[o.r]; }
private CrateBehavior spawnCrate(Vector3 offset) { GameObject g = Instantiate(cratePrefab, holderAndRef.position + offset, Quaternion.identity, holderAndRef); CrateBehavior c = g.GetComponent <CrateBehavior>(); c.setType(generatedResource); return(c); }
public override void notifyDelivery(CrateBehavior crate) { --incomingDeliveries; if (amounts.ContainsKey(crate.r)) { ++amounts[crate.r]; } else { amounts[crate.r] = 1; } }
private void tryAnOrder() { if (orders.Count > 0) { int rand = (int)Random.Range(0, orders.Count); Order o = orders[rand]; if (o.deliveryModule == null) { bool foundAnOrder = false; //IT IS A PUSH, we must find an order for that resource, or a container. for (int i = 0; i < orders.Count && !foundAnOrder; ++i) { if (orders[i].r == o.r && orders[i].deliveryModule != null && orders[i].crate == null) // if order is about the same resource AND not a push of crate { //Debug.Log("Merging orders " + o.id + " and " + orders[i].id); o.deliveryModule = orders[i].deliveryModule; //Merging the orders and deleting one. orders.Remove(orders[i]); foundAnOrder = true; } } if (!foundAnOrder) { //We must find a container ContainerController cc = getRandomAvailableContainer(); if (cc != null) { //Debug.Log("order" + o.id + " incontainer"); o.deliveryModule = cc; cc.notifyIncomingDelivry(); } else { return; //Can't find any order or containers, can't do anything. } } } if (amounts[o.r] > 0) { List <RobotController> readyBots = getAvailableBots(); if (readyBots.Count > 0) { if (o.pickUpModule != null || o.crate != null) { //ITS A PUSH getRandomAvailableBot().setOrder(o); orders.Remove(o); } else { //GET A CRATE CrateBehavior c = getCrateOf(o.r); if (c != null) { //Debug.Log("Assigning crate " + c.GetInstanceID() + " to order" + o.id + " "); o.crate = c; crates.Remove(c); --amounts[c.r]; //ASSIGN ORDER getRandomAvailableBot().setOrder(o); orders.Remove(o); } else { ContainerController cc = getContainerWith(o.r); if (cc != null) { o.pickUpModule = cc; cc.bookCrate(o.r); --amounts[o.r]; //ASSIGN ORDER getRandomAvailableBot().setOrder(o); orders.Remove(o); } } } } else if (debug) { Debug.Log("Not enough bots for " + o.r + " order."); } } else if (debug) { Debug.Log("Not enough resrouces for " + o.r + " order."); } } else if (debug) { Debug.Log("No order."); } }
public abstract void notifyDelivery(CrateBehavior crate);
public override void notifyDelivery(CrateBehavior crate) { loadedInputR++; }