void ResetAllParts()
    {
        foreach (GameObject go in GlobalReferences.FrozenParts.Values)
        {
            Part part = go.GetComponent <Part>();

            int        templateId = part.TemplateID;
            int        id         = (int)part.ID;
            Vector3    scale      = go.transform.localScale;
            Vector3    pos        = go.transform.position;
            Quaternion rot        = go.transform.rotation;

            var token = new PartTokenComplex();
            token.TemplateID = templateId;
            token.ID         = id;
            //token.Position = pos;
            //token.Rotation = rot;
            //token.Scale = scale;

            if (part.Parent != -1)
            {
                token.Parent = part.Parent;
            }
            else
            {
                token.Parent = -1;
            }

            if (part.ParentCon != -1)
            {
                token.ParentCon = part.ParentCon;
            }
            else
            {
                token.ParentCon = -1;
            }

            token.ActiveCons = part.ActiveConnections;
            //token.Children = part.Children;
            //token.ChildCons = part.ChildCons;

            var compare = BlockCompare.Create();
            compare.CompareToken  = token;
            compare.BlockEntity   = go.GetComponent <NetworkBlockBehaviour>().entity;
            compare.BlockPosition = go.transform.position;
            compare.BlockRotation = go.transform.rotation;
            compare.Send();
        }

        var changeNumParts = ChangeNumOfParts.Create();

        changeNumParts.Number = GlobalReferences.NumOfParts;
        changeNumParts.Send();
    }
    public override void OnEvent(BlockCompare evnt)
    {
        if (BoltNetwork.IsClient)
        {
            PartTokenComplex      token     = (PartTokenComplex)evnt.CompareToken;
            GameObject            go        = evnt.BlockEntity.gameObject;
            NetworkBlockBehaviour behaviour = go.GetComponent <NetworkBlockBehaviour>();
            go.transform.position = evnt.BlockPosition;
            go.transform.rotation = evnt.BlockRotation;

            int tempID = token.TemplateID;

            int id = token.ID;

            int parent = token.Parent;

            int parentCon = token.ParentCon;

            List <int> activeCons = token.ActiveCons;

            behaviour.state.SetTransforms(behaviour.state.BlockTransform, transform);

            Part part = go.GetComponent <Part>();

            if (part == null)
            {
                part = behaviour.InitializeNetworkedPart(tempID, id);
            }

            if (part.Parent == -1 && parent != -1)
            {
                part.Parent    = parent;
                part.ParentCon = parentCon;
            }

            if (activeCons.Count > 0)
            {
                part.ActiveConnections = activeCons;
            }


            if (id != -1 && id != part.ID && GlobalReferences.FrozenParts.ContainsKey(id))
            {
                part.ChangeID(id);
            }
        }
    }