void Update()
    {
        if (Input.GetKeyDown(KeyCode.B) && HealthManager.playerAlive)
        {
            buildingMode = !buildingMode;
            buildingIcon.SetActive(buildingMode);
        }
        if (!HealthManager.playerAlive)
        {
            buildingMode = false;
            buildingIcon.SetActive(false);
        }

        if (buildingMode)
        {
            RaycastHit hit;
            Ray        ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            foreach (KeyCode kcode in Enum.GetValues(typeof(KeyCode))) //manage pressed keys
            {
                if (Input.GetKeyDown(kcode))
                {
                    ManageKeys(kcode);
                }
            }

            if (Physics.Raycast(ray, out hit) && !Inventory.inventoryOpened)
            {
                if (selectedHotbarSlot != -1 && Inventory.hotbarItems[selectedHotbarSlot] != null && Inventory.hotbarItems[selectedHotbarSlot].id != selectedHotbarSlotItemID) //check if items have been replaced while in building mode
                {
                    if (Inventory.hotbarItems[selectedHotbarSlot].buildable == true)
                    {
                        Destroy(spawner);
                        selectedHotbarSlotItemID = Inventory.hotbarItems[selectedHotbarSlot].id;
                        spawner = Instantiate(Resources.Load <GameObject>("Prefabs/Buildables/" + Inventory.hotbarItems[selectedHotbarSlot].buildablePrefabName));
                        spawner.transform.Find("collider").GetComponent <RotationChecker>().offset = rotationOffset;
                    }
                    else
                    {
                        spawner.SetActive(false);
                    }
                }
                if (!Inventory.inventoryOpened) //remove object
                {
                    if (Input.GetMouseButtonDown(1) && hit.transform.gameObject.tag == "Buildable")
                    {
                        AddRemovedBuildableBackToInventory(hit.transform.gameObject.name);
                        if (hit.collider.transform.parent != null)
                        {
                            Destroy(hit.collider.transform.parent.gameObject);
                        }
                        else
                        {
                            Destroy(hit.collider.gameObject);
                        }
                    }
                }
                if ((hit.transform.gameObject.tag == "Buildable" || hit.transform.gameObject.tag == "Terrain") && Vector3.Distance(hit.point, transform.position) < 3f && selectedHotbarSlot != -1 && Inventory.hotbarItems[selectedHotbarSlot] != null &&
                    Inventory.hotbarItems[selectedHotbarSlot].buildable)
                {
                    if (hit.collider.tag != "Buildable") //don't stick spawner
                    {
                        spawner.SetActive(true);
                        spawner.transform.position = hit.point;
                        spawner.transform.rotation = Quaternion.Euler(0, rotationOffset, 0);
                        buildingTarget             = hit.point;
                    }
                    else if (hit.collider.gameObject.GetComponent <RotationChecker>() != null) //stick spawner to existing object
                    {
                        spawner.transform.rotation = Quaternion.Euler(0, rotationOffset, 0);
                        spawner.SetActive(true);
                        if (!spawner.transform.Find("collider").GetComponent <RotationChecker>().rotated)                   //not rotated objects are for example pillars
                        {
                            if (!hit.collider.gameObject.GetComponent <RotationChecker>().rotated)                          //stick to not rotated objects
                            {
                                if (Vector3.Distance(hit.collider.ClosestPointOnBounds(hit.point), hit.collider.bounds.min) //stick to top
                                    > Vector3.Distance(hit.collider.ClosestPointOnBounds(hit.point), hit.collider.bounds.max))
                                {
                                    spawner.transform.position = hit.collider.bounds.center + new Vector3(0, hit.collider.bounds.extents.y, 0);
                                }
                                else //stick to bottom
                                {
                                    spawner.transform.position = hit.collider.bounds.center - new Vector3(0, hit.collider.bounds.extents.y * 3, 0);
                                }
                            }
                            else //stick to rotated objects
                            {
                                if (Vector3.Distance(hit.collider.ClosestPointOnBounds(hit.point), hit.collider.bounds.min)
                                    < Vector3.Distance(hit.collider.ClosestPointOnBounds(hit.point), hit.collider.bounds.max))     //stick to left side
                                {
                                    spawner.transform.position =
                                        new Vector3(hit.collider.gameObject.GetComponent <RotationChecker>().offset == 0 ? hit.collider.bounds.min.x
                                        : hit.collider.gameObject.GetComponent <RotationChecker>().offset == 180 ? hit.collider.bounds.min.x
                                        : hit.collider.bounds.center.x, hit.collider.gameObject.transform.position.y, hit.collider.gameObject.GetComponent <RotationChecker>().offset == 90 ? hit.collider.bounds.min.z
                                        : hit.collider.gameObject.GetComponent <RotationChecker>().offset == 270 ? hit.collider.bounds.min.z
                                        : hit.collider.bounds.center.z);
                                }
                                else //stick to right side
                                {
                                    spawner.transform.position =
                                        new Vector3(hit.collider.gameObject.GetComponent <RotationChecker>().offset == 0 ? hit.collider.bounds.max.x
                                        : hit.collider.gameObject.GetComponent <RotationChecker>().offset == 180 ? hit.collider.bounds.max.x
                                        : hit.collider.bounds.center.x, hit.collider.gameObject.transform.position.y, hit.collider.gameObject.GetComponent <RotationChecker>().offset == 90 ? hit.collider.bounds.max.z
                                        : hit.collider.gameObject.GetComponent <RotationChecker>().offset == 270 ? hit.collider.bounds.max.z
                                        : hit.collider.bounds.center.z);
                                }
                            }
                        }
                        else //rotated objects are objects like walls, fences, etc.
                        {
                            if (!hit.collider.gameObject.GetComponent <RotationChecker>().rotated) //touches not rotated
                            {
                                spawner.transform.position = hit.collider.bounds.center - new Vector3(0, hit.collider.bounds.extents.y, 0);
                            }
                            else //touches rotated
                            {
                                spawner.transform.position = hit.collider.bounds.center
                                                             + new Vector3(hit.collider.gameObject.GetComponent <RotationChecker>().offset == 0 ? hit.collider.bounds.extents.x
                                : hit.collider.gameObject.GetComponent <RotationChecker>().offset == 180 ? -hit.collider.bounds.extents.x
                                : 0, 0, hit.collider.gameObject.GetComponent <RotationChecker>().offset == 90 ? -hit.collider.bounds.extents.z
                                : hit.collider.gameObject.GetComponent <RotationChecker>().offset == 270 ? hit.collider.bounds.extents.z
                                : 0);
                            }
                        }
                        buildingTarget = spawner.transform.position;
                    }
                    else
                    {
                        spawner.SetActive(false);
                    }

                    if (!Inventory.inventoryOpened) //spawn object
                    {
                        if (Input.GetMouseButtonDown(0) && spawner.GetComponent <MeshRenderer>() != null)
                        {
                            BuildObject(buildingTarget, hit.collider.gameObject.transform.parent);
                            SlotManager.DestroyItem(selectedHotbarSlot, "hotbarSlot", 1);
                            GameObject.FindGameObjectWithTag("MainCamera").GetComponent <Inventory>().ReloadHotbar();
                        }
                    }
                }
                else
                {
                    spawner.SetActive(false);
                }
            }
            else
            {
                spawner.SetActive(false);
            }
        }
        else
        {
            spawner.SetActive(false);
        }
    }