Exemple #1
0
    /// <summary>
    ///
    /// </summary>
    /// <param name="lastActiveBlock"></param>
    /// <param name="placePos"> //!!! GLOBÁLNÍ POZICE CHECKERU !!!</param>
    /// <returns></returns>
    public static BlockChecker GetLastActiveChecker(SymBlock lastActiveBlock, Vector3 placePos)
    {
        BlockChecker lastActiveChecker = null;

        // Tady se dohledá checker na který se kliklo (v db)
        foreach (BlockChecker c in lastActiveBlock.Checkers)
        {
            Vector3 checker_pos = c.CheckerTransform.position; // GLOBÁLNÍ POZICE CHECKERU

            // Pokud se pozice daného checkeru rovná pozici kterou nám vrátili hit data
            if (checker_pos == placePos)
            {
                // Tak se jedná o last active
                lastActiveChecker = c;

                // Ujistíme se, že jsou dány správně codinates, jinak přepíšeme na správné
                if (lastActiveChecker.checkers_container.position != lastActiveBlock.BlockPosition)
                {
                    lastActiveChecker.checkers_container.position = lastActiveBlock.BlockPosition;
                }
                break;
            }
        }

        return(lastActiveChecker);
    }
Exemple #2
0
 public void RemoveBlockFromWorld(SymBlock blockToRemove)
 {
     if (Settings.isBuildMode)
     {
         this.modifyWorldActionHandler.ModifyWorld(new RemoveBlockFromTheWorldAction(blockToRemove));
     }
 }
Exemple #3
0
 public void ModifyTheWorld()
 {
     //   AddBlockEvent?.Invoke(this, EventArgs.Empty);
     // Necháme si světem vytvořit nový blok
     this.LastPlacedBlock = WorldBuilderManager.World.CreateNewSymBlock(new Vector3(0, 0, 0),
                                                                        new Vector3(0, 0, 0), Settings.blocksTypeLibrary[_blockTypeToAdd], _checkerBuildingOn); //
 }
Exemple #4
0
        /* public event EventHandler<Settings.Blocks_types> PlaceEvent;
         * public event EventHandler<bool> PlaceValidEvent;*/

        public void PlaceBlock(Settings.Blocks_types blockTypeToPlace)
        {
            if (!Settings.isBuildMode)
            {
                return;
            }

            // Vytvoření bloku
            var addBlockModAction = new AddBlockToWorldAction(WorldBuilderManager.World, _checkerToBuildOn, blockTypeToPlace);

            addBlockModAction.ModifyTheWorld();
            this.LastPlacedBlock = addBlockModAction.LastPlacedBlock;

            // Kontrola, jestli je placement ok
            bool isPlaceValid = LastPlacedBlock.CheckBlockPlacement();

            if (isPlaceValid)
            {
                this.OnBlockPlacementValid();
            }
            else
            {
                this.OnPlacementInValid();
            }
        }
Exemple #5
0
    // -- 1. FOCUS tzn. statistiky bloku na který se kliklo
    internal static void BlockDetailWindowState(bool state, SymBlock b_data = null)
    {
        if (state)
        {
            if (b_data == null)
            {
                Debug.LogError("BLOCK WINDOW STATE (UI)- data bloku jsou = null");
            }

            // -- Zapneme okno bloku --
            ScreenUIManager.Instance?.blockDetailWindow.container?.gameObject.SetActive(true);
            // Removelisteners + zvuk
            PrepareButton(ScreenUIManager.Instance?.blockDetailWindow.editBtn);
            PrepareButton(ScreenUIManager.Instance?.blockDetailWindow.closeBtn);
            ScreenUIManager.Instance.blockDetailWindow.editBtnText.text  = TextHolder.EDIT_BTN;
            ScreenUIManager.Instance.blockDetailWindow.closeBtnText.text = TextHolder.CLOSE_BTN;

            // Nastavíme vypnutí okna
            ScreenUIManager.Instance?.blockDetailWindow.closeBtn.onClick.AddListener(() => BlockDetailWindowState(false));

            //  -- Načteme data --
            // Titulek
            ScreenUIManager.Instance.blockDetailWindow.title.text = b_data.BlockName.ToUpper();

            // -- Spustíme dodatečné UI funkce --
        }
        else
        {
            // Vypnutí okna, b_data = null

            ScreenUIManager.Instance.blockDetailWindow.container.gameObject.SetActive(false);
        }
    }
Exemple #6
0
 public void RotateBlock(SymBlock blockToRotate, Vector3 rotateAngleToAdd)
 {
     if (Settings.isBuildMode)
     {
         this.modifyWorldActionHandler.ModifyWorld(new RotateBlockAction(blockToRotate, rotateAngleToAdd));
     }
 }
Exemple #7
0
    public SymBlock IsNeighbourNode(BlockChecker current_c)
    {
        if (current_c.checkerNextTo != null)
        {
            SymBlock b_in_row         = Helpers.GetBlock(current_c.checkerNextTo.checkers_container.position);
            Vector3  dir_to_current_c = current_c.position.RotateOnY(-b_in_row.BlockRotation.y);

            if (b_in_row != null)
            {
                if (b_in_row.IsNode || b_in_row.HasManualNodes)
                {
                    return(b_in_row);
                }
                else
                {
                    if (b_in_row.HasManualNodes)
                    {
                        // TODO: pokud blok má vnitřní nody
                    }

                    foreach (BlockChecker b_in_row_c in b_in_row.Checkers)
                    {
                        Vector3 dir_to_in_row_c = b_in_row_c.position.RotateOnY(-b_in_row.BlockRotation.y);

                        if (dir_to_in_row_c == dir_to_current_c)
                        {
                            return(IsNeighbourNode(b_in_row_c));
                        }
                    }
                }
            }
        }
        return(null);
    }
Exemple #8
0
        private void RestorePlace()
        {
            if (LastPlacedBlock.BlockContainer == null || LastPlacedBlock.BlockType == Settings.Blocks_types.CITY_HALL)
            {
                return;
            }

            MonoBehaviour.Destroy(LastPlacedBlock.BlockContainer);
            LastPlacedBlock = null;
        }
Exemple #9
0
    // Vrací blok z db(dictionary) podle pozice
    public static SymBlock GetBlock(Vector3 b_position = new Vector3())
    {
        SymBlock f_block = null;

        foreach (SymBlock b in BlockLibrary.blocksLib) // Bloky světa
        {
            if (b.BlockPosition == b_position)
            {
                f_block = b;
            }
        }

        return(f_block);
    }
        // TODO: asi poslat celý objekt bloku
        public SymBlockGrid(SymBlock parentBlock, Transform gridParentGameObject, Vector3 parentBlockTransform, Vector3 gridPosition, Vector3 parentBlockRotation, Settings.Checkers_types parentBlockType)
        {
            this._gridPosition        = gridPosition;
            this._parentBlockPosition = parentBlockTransform;
            this._parentBlockRotation = parentBlockRotation;
            this._gridParentTransform = gridParentGameObject;
            this._parentBlockType     = parentBlockType;

            this._gridGameObject = TryToGetObjectFromPool();

            this.parentBlock = parentBlock;

            // Barva Gridy
            this._gridColor = Helpers.GetCheckerColorByType(this._parentBlockType);
            this.SetGridColor(new Color(this._gridColor.r, this._gridColor.g, this._gridColor.b, 0.2f));
        }
Exemple #11
0
    /// <summary> Gizmos při stavbě - šipky rotace apod. </summary> <param name="b_pos"></param> <param name="state"></param>
    internal static void BlockBuildGizmosState(bool state, SymBlock b_data = null)
    {
        if (state)
        {
            if (b_data.BlockPosition == null)
            {
                Debug.LogError("BLOCK BUILD GIZMO STATE (UI.cs)- b_pos je = null");
            }
            // -- Hlavní okno --

            // Získáme referenci okna
            ScreenUIManager.Instance.gizmos.container.gameObject.SetActive(true); // Zapneme

            // Nastavíme pozici
            ScreenUIManager.Instance.gizmos.controller.positionToCalculateOn = new Vector3(b_data.BlockPosition.x, b_data.BlockPosition.y + Settings.uiRotateGizmosHeight, b_data.BlockPosition.z);

            // -- Tlačítka --

            // Raději odstraníme veškeré exitující listnery (TODO: Kdyžka ověření, pokud se bude okno zobrazovat i jinde nějaký bool)
            PrepareButton(ScreenUIManager.Instance.gizmos.rotateLBtn); // V LEVO
            PrepareButton(ScreenUIManager.Instance.gizmos.rotateRBtn); // V PRAVO

            BuildSubModePlace buildSubMode = null;
            if (GameModesManager.Instance.subModesHandler.CurrentSubMode is BuildSubModePlace)
            {
                buildSubMode = GameModesManager.Instance.subModesHandler.CurrentSubMode as BuildSubModePlace;
            }

            if (buildSubMode != null)
            {
                ScreenUIManager.Instance.gizmos.rotateLBtn.onClick.AddListener(
                    () => buildSubMode.RotateBlockBeforePlace(b_data, new Vector3(0, 90, 0)));  // V LEVO
                ScreenUIManager.Instance.gizmos.rotateRBtn.onClick.AddListener(
                    () => buildSubMode.RotateBlockBeforePlace(b_data, new Vector3(0, -90, 0))); // V PRAVO
            }
        }
        else
        {
            // Zavření okna
            ScreenUIManager.Instance.gizmos.container.gameObject.SetActive(false);
        }
    }
Exemple #12
0
    /// <summary> Vrací všechny bloky od daného počátku v daném okruhu.</summary>
    /// <param name="originPos"> Globální pozice bloku. </param>
    /// <param name="radius"></param>
    /// <returns></returns>
    public static List <SymBlock> GetAllBlocksInRadius(SymBlock b_base, float radius)
    {
        var blocksInRadius = new List <SymBlock>();

        if (radius > 0)
        {
            if (BlockLibrary.blocksLib != null)
            {
                foreach (SymBlock block in BlockLibrary.blocksLib)
                {
                    Vector3 vecBetween      = block.BlockContainer.gameObject.transform.position - b_base.BlockContainer.transform.position;
                    float   distanceBetween = vecBetween.magnitude;

                    /*Debug.Log(distanceBetween);
                     * Debug.Log(radius);*/

                    if (distanceBetween >= 0 && block != b_base)
                    {
                        if (distanceBetween <= radius)
                        {
                            blocksInRadius.Add(block);
                        }
                    }
                }
            }
            else
            {
                Debug.LogError("Databáze bloků new World je epmpty. (GetAllBlocksInRadius).");
            }
        }

        if (blocksInRadius.Count < 0)
        {
            Debug.LogError("Nebyly nalezeny žádné bloky.");
        }

        return(blocksInRadius);
    }
Exemple #13
0
    public Dictionary <Vector3, float> FindBlockNeighbourNodes(SymBlock b_base)
    {
        Dictionary <Vector3, float> b_neighbour_nodes = new Dictionary <Vector3, float>();

        foreach (BlockChecker b_c in b_base.Checkers)
        {
            if (b_c.checkerNextTo == null)
            {
                continue;
            }

            Dictionary <SymBlock, float> b_potencionals = new Dictionary <SymBlock, float>();

            SymBlock neighbour_b = IsNeighbourNode(b_c);
            if (neighbour_b != null)
            {
                float dist = Vector3.Distance(b_base.BlockContainer.transform.position, neighbour_b.BlockContainer.transform.position);
                b_neighbour_nodes.Add(neighbour_b.BlockContainer.transform.position, dist);
            }
        }

        return(b_neighbour_nodes);
    }
Exemple #14
0
 public void Bind(SymBlock newBlock)
 {
     _newBlock = newBlock;
 }
Exemple #15
0
 public NextCheckerForBuildGetter(SymBlock blockToFindOn)
 {
     _blockToFindOn = blockToFindOn;
 }
Exemple #16
0
 public static SymBlockConstructor BlockConstructor(SymBlock newBlock)
 {
     return(new SymBlockConstructor(newBlock));
 }
Exemple #17
0
 public void CreateRobot(IRobot robotToCreate, SymBlock baseToCreateIn)
 {
     // Logika jak vytvořit robota a kde apod. TODO:
 }
Exemple #18
0
 public RotateBlockAction(SymBlock blockToRotate, Vector3 angleToAdd)
 {
     _blockToRotate = blockToRotate;
     _angleToAdd    = angleToAdd;
 }
Exemple #19
0
 public BlockPlacementValidator(SymBlock block, Vector3 currentBlockRotation)
 {
     _block = block;
     _currentBlockRotation = currentBlockRotation;
 }
Exemple #20
0
 public void RunBuildTimer(WaitForSeconds buildTime, GameObject timerUIObj, SymBlock block)
 {
     Instance.StartCoroutine(BuildCoroutinesLib.BuildCoroutine(buildTime, timerUIObj, block));
 }
 public BlockRotationValidator(SymBlock block)
 {
     _block = block;
 }
Exemple #22
0
 public RemoveBlockFromTheWorldAction(SymBlock blockToRemove)
 {
     this._blockToRemove = blockToRemove;
 }
Exemple #23
0
        public static IEnumerator BuildCoroutine(WaitForSeconds buildTime, GameObject timerObj, SymBlock block)
        {
            // Objekt UI časovače.
            GameObject currentTimer = timerObj;

            currentTimer.SetActive(true);
            yield return(buildTime);

            block.BuildBlock();
            currentTimer.SetActive(false);
            ScreenUIManager.Instance.UIPoolList.ReturnToPool(Settings.PoolTypes.UI_TIMER, currentTimer);
        }
Exemple #24
0
 public SymBlockRotator(Quaternion rotateForAngle, SymBlock blockToRotate)
 {
     _rotateForAngle = rotateForAngle;
     _blockToRotate  = blockToRotate;
 }
Exemple #25
0
        public static void AddBlockToPathFinding(SymBlock blockToAdd)
        {
            // Pokud se jedná o uzel
            if (blockToAdd.isNode)
            {
                //Pokud ještě daný uzel není v seznamu
                if (PathFinder.Instance.nodes_data.Find(o => o.position == blockToAdd.BlockContainer.transform.position) != null)
                {
                    // Nový diář sousedů
                    Dictionary <Vector3, float> b_neighbour_nodes = new Dictionary <Vector3, float>();

                    // Nalezneme SOUSEDNÍ NODY ve směrech kontrolérů(na stejných pozicích např. checker: Vec3(0,15,0); soused blok Vec3(0,50,0); => (true) - pokud je první! (break)
                    foreach (BlockChecker b_c in blockToAdd.Checkers)
                    {
                        Settings.Axis on_which_axis = Settings.Axis.ZERO;
                        // Podél jaké osy hledáme
                        // Získáme, na jaké OSY jsou kontroléry uzlu orientovány
                        Vector3 b_c_pop_pos = Settings.GetVector3Population_(b_c.position); // TODO: ještě nefunguje - musí se počítat i posun po ostatních osách
                        if (b_c_pop_pos.x != 0)
                        {
                            on_which_axis = Settings.Axis.x;
                        }
                        else if (b_c_pop_pos.y != 0)
                        {
                            on_which_axis = Settings.Axis.y;
                        }
                        else if (b_c_pop_pos.z != 0)
                        {
                            on_which_axis = Settings.Axis.z;
                        }
                        else
                        {
                            Debug.LogAssertion("Kontrolér bloku má nejspíše 0 souřadnice, nebylo možné definovat osu pro kontrolu.");
                        }


                        // Podíváme se opět na všechny bloky ve scéně
                        foreach (SymBlock b_neighbour in BlockLibrary.blocksLib)
                        {
                            Vector3 b_neighbour_pop_pos = Settings.GetVector3Population_(b_neighbour.BlockContainer.transform.position);
                            // Pokud se nejedná o hlavní blok (blok ke kterému hledáme souseda)
                            if (b_neighbour.BlockContainer.transform.position != blockToAdd.BlockContainer.transform.position)
                            {
                                if (b_neighbour.isNode)
                                {
                                    // Pokud je blok ve stejném směru jako je orientovaný kontrolér && jedná se o uzel => jedná se o souseda
                                    if (((b_neighbour_pop_pos.x == b_c_pop_pos.x) && on_which_axis == Settings.Axis.x) ||
                                        ((b_neighbour_pop_pos.y == b_c_pop_pos.y) && on_which_axis == Settings.Axis.y) ||
                                        ((b_neighbour_pop_pos.z == b_c_pop_pos.z) && on_which_axis == Settings.Axis.z)
                                        )
                                    {
                                        float dist = Vector3.Distance(b_neighbour.BlockContainer.transform.position, b_c.CheckerTransform.transform.position); // Vypočítáme vzdálenost mezi uzly
                                        b_neighbour_nodes.Add(b_neighbour.BlockContainer.transform.position, dist);
                                        break;
                                    }
                                }
                            }
                        }
                    }
                    // Přidáme blok do hlavního datového pole
                    PathFinder.Instance.nodes_data.Add(new Node()
                    {
                        position = blockToAdd.BlockContainer.transform.position, neighbours = b_neighbour_nodes
                    });
                }
            }
            else
            {
                // TODO: Pokud není, musí se domyslet => nějaký vnitřní ručně přidaný path-pointy(asi model/grafika) apod.
            }
        }