public void PlaceNewModularPiece(ModularPieceData Piece, Vector3 Scale, System.Func <ModularPlacableObject, bool> CanPlace, Vector3 RotationOffset = default(Vector3), Vector3 InitRotation = default(Vector3), Vector3 InitPosition = default(Vector3), object[] ExtraData = default(object[]), bool Interrupt = false)
        {
            ModularPlacableObject NewPlacableObject = (ModularPlacableObject)InitStoreItem(Piece, Scale, RotationOffset, InitRotation, InitPosition);

            PlaceModularPlacable(NewPlacableObject, (object[] data) => {
                // on object is placed
                ModularPiece PlacedPiece  = (ModularPiece)data.Find <ModularPiece>();                                                                  // get modular piece
                LocalGridSystem LocalGrid = (LocalGridSystem)data.Find <LocalGridSystem>();                                                            // get last local grid
                PlacePlacableObject.PlaceObjectCache Cache = (PlacePlacableObject.PlaceObjectCache)data.Find <PlacePlacableObject.PlaceObjectCache>(); // get last state cache
                PlacedPiece.InitializeEditable();                                                                                                      // initialize editable modular piece
                PlacedPiece.OnPlaced();                                                                                                                // call on placed callback

                // Economy
                int Price = GameManager.I.Economy.EvaluateModularPiece(Piece);
                GameManager.I.Economy.RemoveMoney(Price);
                GameManager.I.Economy.SpawnMoneyIndicator(PlacedPiece.transform.position, Price);

                // add piece to set
                GameManager.I.Modular.ScopedSet.AddModularPiece(PlacedPiece);

                // place new modular piece with last rotation
                PlaceNewModularPiece(Piece, Scale, CanPlace, PlacedPiece.RotationOffset.eulerAngles, PlacedPiece.NoneOffsettedRotation.eulerAngles, PlacedPiece.transform.position, new object[] { LocalGrid, Cache });
            }, CanPlace, (Data) => {
                // on canceled
                GameManager.I.Modular.ScopedSet.DeregisterPlacingObject(); // de register object
                ModularPlacableObject PlacableObject = (ModularPlacableObject)Data.Find <ModularPlacableObject>();
                PlacableObject.Destroy();                                  // destroy on cancle

                Statemachine.changeState(new ModularSpectate(), this);
            }, SnapTypes.Default, ExtraData, Interrupt);                              // place new created store modular piece
            GameManager.I.Modular.ScopedSet.RegisterPlacingObject(NewPlacableObject); // register new placable object to be placed inside building
        }
        public void AddModularPiece(ModularPiece piece, ModularPlacableData Trans)
        {
            piece.Initialize(this);               // initialize piece cause isnt placed by system
            piece.transform.SetParent(transform); // reparent piece
            _Pieces.Add(piece);                   // add piece to set

            piece.LocalPosition = Trans.LocalPosition;
            piece.transform.localEulerAngles = Trans.LocalEulerAngles;
            piece.transform.localScale       = Trans.LocalScale;

            AddModularPieceRenderer(piece);             // add to render set

            UpdatePieceRestrictions(piece);             // add modular piece restriction

            if (Editing)
            {
                piece.InitializeEditable();
            }
            else
            {
                piece.InitializePlaced(Management.GameManager.I.Modular.ModularPieceLayer);
                piece.OnPlaced();
            }             // if is in editing mode, initialize as editable piece
        }