/// <summary> /// Adds an item given an extractor/inserter. Calculates and places in the right slot. /// </summary> /// <param name="item"></param> /// <param name="inserter"></param> /// <returns></returns> public GenericItem AddItem(GenericItem item, Extractor inserter) { //Side the inserter is using InsertSide insert_side = inserter.OUTPUT_SIDE; InsertDir insert_dir = GetInsertDir(inserter.GetComponent <GridController>()); BeltSide side = GetBeltSide(insert_dir, insert_side); BeltPos pos = GetBeltPos(insert_dir, insert_side); //If it isn't valid, return immediately. if (!isValidInsert(insert_dir, insert_side)) { return(null); } else { //Get the relevant list. List <ItemController> LIST = GetSideList(side); //Get the relevant index. int index = GetIndex(side, pos); //Update the right index. LIST[(int)pos] = item.SpawnObject(ITEM_POSITIONS[index].position, ITEM_POSITIONS[index].rotation, ITEM_POSITIONS[index]); return(LIST[(int)pos].INFO); } }
/// <summary> /// Returns true if we acn add an item from this inserter. /// </summary> /// <param name="inserter"></param> /// <returns></returns> public bool AttemptAddItem(Extractor inserter) { //Side the inserter is using InsertSide insert_side = inserter.OUTPUT_SIDE; InsertDir insert_dir = GetInsertDir(inserter.GetComponent <GridController>()); return(isValidInsert(insert_dir, insert_side)); }
/// <summary> /// Attempts to insert an item given an extractor/inserter. /// Returns the item if successful, else null. /// </summary> /// <param name="item"></param> /// <param name="inserter"></param> /// <returns></returns> public bool AttemptExtractItem(GenericItem item, Extractor inserter) { //Side the inserter is using InsertSide insert_side = inserter.OUTPUT_SIDE; InsertDir insert_dir = GetInsertDir(inserter.GetComponent <GridController>()); BeltSide side = GetBeltSide(insert_dir, insert_side); BeltPos pos = GetBeltPos(insert_dir, insert_side); return(isItemAccessible(side, pos, item)); }
/// <summary> /// Returns the side of the belt given a direction and side. /// </summary> /// <param name="insertDir"></param> /// <param name="insertSide"></param> /// <returns></returns> public BeltSide GetBeltSide(InsertDir insertDir, InsertSide insertSide) { switch (insertDir) { case InsertDir.Back: if (insertSide == InsertSide.Left) { return(BeltSide.Left); } else { return(BeltSide.Right); } case InsertDir.Front: if (insertSide == InsertSide.Left) { return(BeltSide.Right); } else { return(BeltSide.Left); } case InsertDir.Left: return(BeltSide.Left); case InsertDir.Right: return(BeltSide.Right); case InsertDir.Top: if (insertSide == InsertSide.Left) { return(BeltSide.Left); } else { return(BeltSide.Right); } case InsertDir.Bottom: if (insertSide == InsertSide.Left) { return(BeltSide.Left); } else { return(BeltSide.Right); } default: throw new System.Exception("Error, invalid belt side."); } }
/// <summary> /// Returns true or false depending on if the slot that is meant to be used on insert based on direction is empty. /// Inserters output either to their left or right half of the square. As such: /// Left insert direction inserters outputting to the left output to the front of the belt. /// Left insert direction inserters outputting to the right output to the back of the belt. /// </summary> /// <param name="insertDir"></param> /// <returns></returns> public bool isValidInsert(InsertDir insertDir, InsertSide insertSide) { BeltSide side = GetBeltSide(insertDir, insertSide); BeltPos pos = GetBeltPos(insertDir, insertSide); ItemController EC = GetItem(side, pos); if (EC == null) { return(true); } else { return(false); } }
/// <summary> /// Returns the position of the item given a direction and side. /// </summary> /// <param name="insertDir"></param> /// <param name="insertSide"></param> /// <returns></returns> public BeltPos GetBeltPos(InsertDir insertDir, InsertSide insertSide) { switch (insertDir) { case InsertDir.Back: return(BeltPos.Back); case InsertDir.Front: return(BeltPos.Front); case InsertDir.Top: return(BeltPos.Middle); case InsertDir.Bottom: return(BeltPos.Middle); case InsertDir.Left: if (insertSide == InsertSide.Left) { return(BeltPos.Front); } else { return(BeltPos.Back); } case InsertDir.Right: if (insertSide == InsertSide.Left) { return(BeltPos.Back); } else { return(BeltPos.Front); } default: throw new System.Exception("Error, invalid belt position."); } }
/// <summary> /// Extracts item with given inserter. /// Only decrements this inventory, does not add to the inserter's inventory. /// Returns the item if successful, else null; /// </summary> /// <param name="item"></param> /// <param name="inserter"></param> /// <returns></returns> public GenericItem ExtractItem(GenericItem item, Extractor inserter) { //Side the inserter is using InsertSide insert_side = inserter.OUTPUT_SIDE; InsertDir insert_dir = GetInsertDir(inserter.GetComponent <GridController>()); BeltSide side = GetBeltSide(insert_dir, insert_side); BeltPos pos = GetBeltPos(insert_dir, insert_side); //Get the relevant list. List <ItemController> LIST = GetSideList(side); //Get the relevant index. int index = GetIndex(side, pos); //Save the item to be returned GenericItem item_ret = LIST[(int)pos].INFO; //Update side list. LIST[(int)pos].DespawnObject(); LIST[(int)pos] = null; return(item_ret); }