/// <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); }
public void RemoveBlockFromWorld(SymBlock blockToRemove) { if (Settings.isBuildMode) { this.modifyWorldActionHandler.ModifyWorld(new RemoveBlockFromTheWorldAction(blockToRemove)); } }
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); // }
/* 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(); } }
// -- 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); } }
public void RotateBlock(SymBlock blockToRotate, Vector3 rotateAngleToAdd) { if (Settings.isBuildMode) { this.modifyWorldActionHandler.ModifyWorld(new RotateBlockAction(blockToRotate, rotateAngleToAdd)); } }
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); }
private void RestorePlace() { if (LastPlacedBlock.BlockContainer == null || LastPlacedBlock.BlockType == Settings.Blocks_types.CITY_HALL) { return; } MonoBehaviour.Destroy(LastPlacedBlock.BlockContainer); LastPlacedBlock = null; }
// 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)); }
/// <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); } }
/// <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); }
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); }
public void Bind(SymBlock newBlock) { _newBlock = newBlock; }
public NextCheckerForBuildGetter(SymBlock blockToFindOn) { _blockToFindOn = blockToFindOn; }
public static SymBlockConstructor BlockConstructor(SymBlock newBlock) { return(new SymBlockConstructor(newBlock)); }
public void CreateRobot(IRobot robotToCreate, SymBlock baseToCreateIn) { // Logika jak vytvořit robota a kde apod. TODO: }
public RotateBlockAction(SymBlock blockToRotate, Vector3 angleToAdd) { _blockToRotate = blockToRotate; _angleToAdd = angleToAdd; }
public BlockPlacementValidator(SymBlock block, Vector3 currentBlockRotation) { _block = block; _currentBlockRotation = currentBlockRotation; }
public void RunBuildTimer(WaitForSeconds buildTime, GameObject timerUIObj, SymBlock block) { Instance.StartCoroutine(BuildCoroutinesLib.BuildCoroutine(buildTime, timerUIObj, block)); }
public BlockRotationValidator(SymBlock block) { _block = block; }
public RemoveBlockFromTheWorldAction(SymBlock blockToRemove) { this._blockToRemove = blockToRemove; }
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); }
public SymBlockRotator(Quaternion rotateForAngle, SymBlock blockToRotate) { _rotateForAngle = rotateForAngle; _blockToRotate = blockToRotate; }
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. } }