int UpdateVisuals()
    {
        int retVal = 0;

        if (GrabTarget != null)
        {
            retVal = 1;

            Tracer.SetPosition(0, transform.position);
            Tracer.SetPosition(1, GrabTarget.transform.position);
        }
        else
        {
            Tracer.SetPosition(0, Vector3.zero);
            Tracer.SetPosition(1, Vector3.zero);
        }

        if (isServer)
        {
            //Dynamic
            for (int i = 0; i < 1; ++i)
            {
                //Add to list to fit connection count
                if (RepairParticles.Count < MissingPartsID.Count)
                {
                    GameObject spawnedRepairParticle = Instantiate(RepairParticlePrefab, Vector3.zero, Quaternion.identity);
                    ParticleSystem.MainModule main   = spawnedRepairParticle.GetComponent <ParticleSystem>().main;
                    main.startColor = Tracker.ThePlayerControlPanel.TheResourceManager.PlayerColor[transform.root.GetComponent <UnitID>().ID].TrimEmissionColor;
                    spawnedRepairParticle.transform.parent = transform.root;
                    NetworkServer.Spawn(spawnedRepairParticle);
                    RepairParticles.Add(spawnedRepairParticle);
                    RpcRepairParticleColor(spawnedRepairParticle, Tracker.ThePlayerControlPanel.TheResourceManager.PlayerColor[transform.root.GetComponent <UnitID>().ID].TrimEmissionColor);
                    //Recheck
                    i -= 1;
                }
                //remove from list to fit connection count
                if (RepairParticles.Count > MissingPartsID.Count)
                {
                    Destroy(RepairParticles[RepairParticles.Count - 1]);
                    RepairParticles.RemoveAt(RepairParticles.Count - 1);
                    //Recheck
                    i -= 1;
                }
            }

            for (int i = 0; i < RepairParticles.Count; ++i)
            {
                retVal = 1;
                ShipSchematic theShipSchematic = transform.root.GetComponent <ShipSchematic>();
                //RpcRepairParticle(RepairParticles[i], transform.root.gameObject, new Vector3(theShipSchematic.GetSchematic().Parts[MissingPartsID[i]].Position[0], theShipSchematic.GetSchematic().Parts[MissingPartsID[i]].Position[1], theShipSchematic.GetSchematic().Parts[MissingPartsID[i]].Position[2]));
                if (RepairParticles[i] != null)
                {
                    RepairParticles[i].transform.localPosition = new Vector3(theShipSchematic.GetSchematic().Parts[MissingPartsID[i]].Position[0], theShipSchematic.GetSchematic().Parts[MissingPartsID[i]].Position[1], theShipSchematic.GetSchematic().Parts[MissingPartsID[i]].Position[2]);
                }
                //RepairParticles[i].transform.localPosition = Vector3.zero;
            }
        }

        return(retVal);
    }
    void OnTriggerEnter(Collider other)
    {
        if (!isServer)
        {
            return;
        }
        if (GrabTargetPartID == -1)
        {
            return;
        }
        if (GrabTarget == null)
        {
            return;
        }

        if (other.tag == "Block")
        {
            if (other.gameObject == GrabTarget)
            {
                ShipSchematic theShipSchematic = transform.root.GetComponent <ShipSchematic>();
                GrabTarget.transform.parent           = transform.root;
                GrabTarget.transform.localPosition    = new Vector3(theShipSchematic.GetSchematic().Parts[MissingPartsID[GrabTargetPartID]].Position[0], theShipSchematic.GetSchematic().Parts[MissingPartsID[GrabTargetPartID]].Position[1], theShipSchematic.GetSchematic().Parts[MissingPartsID[GrabTargetPartID]].Position[2]);
                GrabTarget.transform.localEulerAngles = new Vector3(theShipSchematic.GetSchematic().Parts[MissingPartsID[GrabTargetPartID]].Rotation[0], theShipSchematic.GetSchematic().Parts[MissingPartsID[GrabTargetPartID]].Rotation[1], theShipSchematic.GetSchematic().Parts[MissingPartsID[GrabTargetPartID]].Rotation[2]);
                theShipSchematic.TrackedBlocks[MissingPartsID[GrabTargetPartID]] = GrabTarget;

                //Physics
                GrabTarget.layer = LayerMask.NameToLayer("Attached");
                ApplyLayerToChilds(GrabTarget.transform, "Attached");
                GrabTarget.GetComponent <Rigidbody>().isKinematic    = true;
                GrabTarget.GetComponent <BoxCollider>().isTrigger    = false;
                GrabTarget.GetComponent <NetworkTransform>().enabled = false;

                //Rpc info
                GameObject rpcGrabbedObject = GrabTarget;
                GameObject rpcRoot          = transform.root.gameObject;
                Vector3    rpcPosition      = new Vector3(theShipSchematic.GetSchematic().Parts[MissingPartsID[GrabTargetPartID]].Position[0], theShipSchematic.GetSchematic().Parts[MissingPartsID[GrabTargetPartID]].Position[1], theShipSchematic.GetSchematic().Parts[MissingPartsID[GrabTargetPartID]].Position[2]);
                Vector3    rpcRotation      = new Vector3(theShipSchematic.GetSchematic().Parts[MissingPartsID[GrabTargetPartID]].Rotation[0], theShipSchematic.GetSchematic().Parts[MissingPartsID[GrabTargetPartID]].Rotation[1], theShipSchematic.GetSchematic().Parts[MissingPartsID[GrabTargetPartID]].Rotation[2]);

                //Cancel
                GrabTarget.GetComponent <ShipAdjacentCheck>().BeingGrabbed = false;
                MissingPartsID.RemoveAt(GrabTargetPartID);
                GrabTargetPartID = -1;
                GrabTarget       = null;

                //Loop
                theShipSchematic.RequestAdjacentCheck();
                transform.root.GetComponent <ShipMeshCombine>().RequestCombine();

                RpcGrabCollide(rpcGrabbedObject, rpcRoot, rpcPosition, rpcRotation);
            }
        }
    }
    int UpdateRegenTimers()
    {
        int retVal = 0;

        if (transform.root.GetComponent <ShipSchematic>().StartRegeneratingTimer < 5)
        {
            return(retVal);
        }
        //Regenerates missing parts if its not grabbing a nearby block
        for (int i = 0; i < MissingPartsID.Count; i++)
        {
            retVal = 1;

            ShipSchematic theShipSchematic = transform.root.GetComponent <ShipSchematic>();
            //if (GrabTargetPartID != i || GrabTarget == null)
            //{
            //}
            //else theShipSchematic.TrackedBlockRegenTimers[MissingPartsID[i]] = 0;
            theShipSchematic.TrackedBlockRegenTimers[MissingPartsID[i]] += Time.deltaTime;
            if (theShipSchematic.TrackedBlockRegenTimers[MissingPartsID[i]] >= 4)
            {
                bool   checkAdjacent = false;
                string partName      = theShipSchematic.GetSchematic().Parts[MissingPartsID[i]].Name;
                for (int j = 0; j < Tracker.NetworkBlocks.Count; j++)
                {
                    partName = partName.Replace(Tracker.NetworkBlocks[j].name, "");
                    if (partName == "Builder")
                    {
                        GameObject spawnedBlock = Instantiate(Tracker.NetworkBlocks[j], Vector3.zero, Quaternion.identity);
                        spawnedBlock.name = Tracker.NetworkBlocks[j].name;
                        NetworkServer.Spawn(spawnedBlock);
                        spawnedBlock.transform.parent                                = transform.root;
                        spawnedBlock.transform.localPosition                         = new Vector3(theShipSchematic.GetSchematic().Parts[MissingPartsID[i]].Position[0], theShipSchematic.GetSchematic().Parts[MissingPartsID[i]].Position[1], theShipSchematic.GetSchematic().Parts[MissingPartsID[i]].Position[2]);
                        spawnedBlock.transform.localEulerAngles                      = new Vector3(theShipSchematic.GetSchematic().Parts[MissingPartsID[i]].Rotation[0], theShipSchematic.GetSchematic().Parts[MissingPartsID[i]].Rotation[1], theShipSchematic.GetSchematic().Parts[MissingPartsID[i]].Rotation[2]);
                        theShipSchematic.TrackedBlocks[MissingPartsID[i]]            = spawnedBlock;
                        spawnedBlock.GetComponent <ShipAdjacentCheck>().BeingGrabbed = false;

                        //Physics
                        spawnedBlock.layer = LayerMask.NameToLayer("Attached");
                        ApplyLayerToChilds(spawnedBlock.transform, "Attached");
                        spawnedBlock.GetComponent <Rigidbody>().isKinematic    = true;
                        spawnedBlock.GetComponent <BoxCollider>().isTrigger    = false;
                        spawnedBlock.GetComponent <NetworkTransform>().enabled = false;

                        //Rpc info
                        GameObject rpcGrabbedObject = spawnedBlock;
                        GameObject rpcRoot          = transform.root.gameObject;
                        Vector3    rpcPosition      = new Vector3(theShipSchematic.GetSchematic().Parts[MissingPartsID[i]].Position[0], theShipSchematic.GetSchematic().Parts[MissingPartsID[i]].Position[1], theShipSchematic.GetSchematic().Parts[MissingPartsID[i]].Position[2]);
                        Vector3    rpcRotation      = new Vector3(theShipSchematic.GetSchematic().Parts[MissingPartsID[i]].Rotation[0], theShipSchematic.GetSchematic().Parts[MissingPartsID[i]].Rotation[1], theShipSchematic.GetSchematic().Parts[MissingPartsID[i]].Rotation[2]);

                        if (GrabTarget != null)
                        {
                            GrabTarget.GetComponent <ShipAdjacentCheck>().BeingGrabbed = false;
                        }

                        //Loop
                        checkAdjacent = true;

                        //Cancel
                        theShipSchematic.TrackedBlockRegenTimers[MissingPartsID[i]] = 0;
                        MissingPartsID.RemoveAt(i);
                        GrabTargetPartID = -1;
                        GrabTarget       = null;
                        checkAdjacent    = true;
                        i -= 1;
                        RpcRegen(rpcGrabbedObject, rpcRoot, rpcPosition, rpcRotation);
                        break;
                    }
                }
                if (checkAdjacent)
                {
                    transform.root.GetComponent <ShipMeshCombine>().RequestCombine();
                    theShipSchematic.RequestAdjacentCheck();
                }
            }
        }
        return(retVal);
    }