//$ Copyright 2015-22, Code Respawn Technologies Pvt Ltd - All Rights Reserved $// using System.Collections.Generic; using System.Linq; using UnityEngine; namespace DungeonArchitect.Builders.Grid { public class GridDungeonQuery : DungeonEventListener { [HideInInspector] public Dictionary DoorObjectsByCellId = new Dictionary(); public override void OnPostDungeonBuild(Dungeon dungeon, DungeonModel model) { GenerateQuery(); } public override void OnPreDungeonDestroy(Dungeon dungeon) { DoorObjectsByCellId.Clear(); } public void GenerateQuery() { DoorObjectsByCellId.Clear(); var dungeon = GetComponent(); if (dungeon == null) { return; } var doorsByCells = new Dictionary>(); var doorMetaArray = GameObject.FindObjectsOfType(); foreach (var doorMeta in doorMetaArray) { // Make sure this belongs to the same dungeon var itemData = doorMeta.gameObject.GetComponent(); if (itemData && itemData.dungeon == dungeon) { if (!doorsByCells.ContainsKey(doorMeta.cellA)) { doorsByCells.Add(doorMeta.cellA, new HashSet()); } if (!doorsByCells.ContainsKey(doorMeta.cellB)) { doorsByCells.Add(doorMeta.cellB, new HashSet()); } doorsByCells[doorMeta.cellA].Add(doorMeta.gameObject); doorsByCells[doorMeta.cellB].Add(doorMeta.gameObject); } } foreach (var entry in doorsByCells) { DoorObjectsByCellId.Add(entry.Key, entry.Value.ToArray()); } } public void GetDoorsForCell(int cellId, out GameObject[] doorGameObjects) { if (DoorObjectsByCellId.ContainsKey(cellId)) { doorGameObjects = DoorObjectsByCellId[cellId]; } else { doorGameObjects = new GameObject[0]; } } public bool GetCellAtPosition(Vector3 position, out Cell outCell) { var config = GetComponent(); var model = GetComponent(); if (config != null && model != null) { var bounds = new Bounds(); foreach (var cell in model.Cells) { bounds = cell.GetWorldBounds(config.GridCellSize); if (bounds.Contains(position)) { outCell = cell; return true; } } } outCell = null; return false; } public Bounds GetCellBounds(Cell cell) { var bounds = new Bounds(); var config = GetComponent(); if (config != null) { bounds = cell.GetWorldBounds(config.GridCellSize); } return bounds; } public Cell GetRandomCell() { var model = GetComponent(); if (model == null || model.Cells.Count == 0) { return null; } return model.Cells[Random.Range(0, model.Cells.Count)]; } public Cell[] FindFurthestRooms() { var model = GetComponent(); return GridDungeonModelUtils.FindFurthestRooms(model); } } }