// Update is called once per frame
    void Update()
    {
        // Attemp to combine
        if (Input.GetButtonDown("Combine"))
        {
            // Check that two items are held
            GameObject itemleft  = PlayerPickup.GetHeldItems()[0];
            GameObject itemright = PlayerPickup.GetHeldItems()[1];
            if (itemleft && itemright)
            {
                PickupDescriptionScript descriptionleft  = itemleft.GetComponent <PickupDescriptionScript>();
                PickupDescriptionScript descriptionright = itemright.GetComponent <PickupDescriptionScript>();

                // Check both items to find crafts they appear in together
                ArrayList matchingcraft = GetMatchingCraftDescriptions(descriptionleft.Name, descriptionright.Name);
                foreach (object CraftObject in matchingcraft)
                {
                    CraftDescriptionStruct description = (CraftDescriptionStruct)CraftObject;
                    if (
                        (Vector3.Distance(itemleft.transform.up, description.InputItemDirection[0]) < 0.3f) &&
                        (Vector3.Distance(itemright.transform.up, description.InputItemDirection[1]) < 0.3f)
                        )
                    {
                        Destroy(itemleft);
                        Destroy(itemright);
                        PlayerPickup.SetHeldItem(0, (GameObject)Instantiate(Resources.Load(description.OutputPrefabName)));
                    }
                }
            }
        }
    }
 private void AddCraftingDescrition(string outputname, string inputnameleft, string inputnameright, Vector3 inputdirectionleft, Vector3 inputdirectionright)
 {
     CraftDescription.Add(new CraftDescriptionStruct());
     {
         int element = CraftDescription.Count - 1;
         CraftDescriptionStruct newcraftingdescription = (CraftDescriptionStruct)CraftDescription[element];
         {
             newcraftingdescription.OutputPrefabName = outputname;
             newcraftingdescription.InputItemName    = new string[2] {
                 inputnameleft, inputnameright
             };
             newcraftingdescription.InputItemDirection = new Vector3[2] {
                 inputdirectionleft, inputdirectionright
             };
         }
         CraftDescription[element] = newcraftingdescription;
     }
 }
    private ArrayList GetMatchingCraftDescriptions(string left, string right)
    {
        ArrayList result = new ArrayList();

        {
            // Every crafting description
            foreach (object CraftObject in CraftDescription)
            {
                CraftDescriptionStruct description = (CraftDescriptionStruct)CraftObject;
                // Find those containing both held items
                if ((description.InputItemName[0] == left) && (description.InputItemName[1] == right))
                {
                    description.Reversed = false;
                    result.Add(description);
                }
                else if ((description.InputItemName[0] == right) && (description.InputItemName[1] == left))
                {
                    description.Reversed = true;
                    result.Add(description);
                }
            }
        }
        return(result);
    }