using System.Collections.Generic; using UnityEngine; public class ConstructionUI : WPFMonoBehaviour { public class PartDesc { public BasePart part; public Texture tex; public Rect texCoords; public int coordX; public int coordY; public int useCount; public int maxCount; public int sortKey; public int CurrentCount { get { return maxCount - useCount; } } } public List m_purchasableParts = new List(); public Transform m_gridPrefab; public Transform m_cellPrefab; public int m_itemsPerRow = 14; public float m_offsetX = 0.2f; public float m_offsetY = 0.2f; public float m_spacingX = 0.06f; public float m_scale = 0.1f; public Font m_font; public Texture2D m_cellTextureValid; public Texture2D m_cellTextureInvalid; public Texture2D m_textureSelected; protected Transform m_grid; protected Dictionary m_cellMap = new Dictionary(); protected List m_partInstances = new List(); protected List m_partDescs = new List(); protected List m_purchasablePartDescs = new List(); protected Contraption m_contraption; protected int m_draggedElement = -1; protected int m_flipCount; protected int m_selectedElement = -1; protected BasePart.GridRotation draggedPartRotation; protected bool draggedPartFlipped; protected GUIStyle m_textStyle; private GameObject clearButton; private GameObject playButton; private GameObject moveButtons; private GameObject moveLeftButton; private GameObject moveRightButton; private GameObject moveUpButton; private GameObject moveDownButton; private List m_parts = new List(); private PartSelector partSelector; private GameObject m_dragIcon; private bool m_useDragOffset = true; private Vector3 m_dragOffset; private Transform m_mouseOverCell; private bool m_dragStarted; private Vector3 m_dragStartPosition; private Vector3 m_rightDragStartPosition; private int m_moveCounter; private int m_rotationCounter; public List PartDescriptors { get { return m_partDescs; } } public int RotationCount { get { return m_rotationCounter; } } public int MoveCount { get { return m_moveCounter; } } private void AddMove() { m_moveCounter++; } private void OnDestroy() { EventManager.Disconnect(ReceiveUIEvent); } public PartDesc FindPartDesc(BasePart.PartType partType) { foreach (PartDesc partDesc in m_partDescs) { if (partDesc.part.m_partType == partType) { return partDesc; } } return null; } private void UpdatePartCount(int newCount) { foreach (PartDesc purchasablePartDesc in m_purchasablePartDescs) { if (purchasablePartDesc.part.m_partType == BasePart.PartType.Rocket) { Debug.Log("part count updated"); purchasablePartDesc.maxCount = newCount; } } } private void Awake() { EventManager.Connect(ReceiveUIEvent); int num = 0; int num2 = 0; int num3 = 0; m_useDragOffset = DeviceInfo.Instance.UsesTouchInput && !BuildCustomizationLoader.Instance.IsHDVersion; foreach (GameObject part in WPFMonoBehaviour.gameData.m_parts) { m_parts.Add(part.transform); } foreach (Transform part2 in m_parts) { Transform transform = Object.Instantiate(part2) as Transform; BasePart component = transform.GetComponent(); int partTypeCount = WPFMonoBehaviour.levelManager.GetPartTypeCount(component.m_partType); if (partTypeCount == 0 && !m_purchasableParts.Contains(part2)) { Object.Destroy(transform.gameObject); continue; } transform.gameObject.SetActiveRecursively(false); transform.parent = base.transform; Rect texCoords = new Rect(0f, 0f, 1f, 1f); MeshRenderer component2 = transform.GetComponent(); if ((bool)transform.GetComponent().m_constructionIconSprite) { component2 = transform.GetComponent().m_constructionIconSprite.GetComponent(); texCoords = transform.GetComponent().m_constructionIconSprite.m_uvRect; } if (!component2 || !component2.sharedMaterial) { continue; } Texture mainTexture = component2.sharedMaterial.mainTexture; if ((bool)mainTexture) { PartDesc partDesc = new PartDesc(); partDesc.part = component; partDesc.tex = mainTexture; partDesc.texCoords = texCoords; partDesc.coordX = num; partDesc.coordY = num2; partDesc.useCount = 0; partDesc.maxCount = partTypeCount; m_partDescs.Add(partDesc); WPFMonoBehaviour.levelManager.m_totalAvailableParts += partTypeCount; num++; if (num >= m_itemsPerRow) { num = 0; num2++; } num3++; } } if ((bool)WPFMonoBehaviour.levelManager) { m_contraption = WPFMonoBehaviour.levelManager.contraptionProto; } if (!m_contraption) { GameObject gameObject = new GameObject("Contraption"); gameObject.transform.parent = base.transform; gameObject.transform.localPosition = Vector3.zero; m_contraption = gameObject.AddComponent(); } if ((bool)m_cellPrefab) { GameObject gameObject2 = new GameObject(); gameObject2.transform.parent = base.transform; gameObject2.transform.localPosition = Vector3.zero; for (int i = 0; i < WPFMonoBehaviour.levelManager.gridHeight; i++) { for (int j = WPFMonoBehaviour.levelManager.gridXmin; j <= WPFMonoBehaviour.levelManager.gridXmax; j++) { if (WPFMonoBehaviour.levelManager.CanPlacePartAtGridCell(j, i)) { Transform transform2 = Object.Instantiate(m_cellPrefab) as Transform; transform2.transform.parent = gameObject2.transform; transform2.localPosition = new Vector3(j, i, 1f); int key = i * 1000 + j; m_cellMap[key] = transform2; } } } m_grid = gameObject2.transform; } GameObject gameObject3 = GameObject.Find("InGameGUI"); if ((bool)gameObject3) { clearButton = gameObject3.transform.FindChild("InGameBuildMenu").FindChild("ClearButton").gameObject; playButton = gameObject3.transform.FindChild("InGameBuildMenu").FindChild("PlayButton").gameObject; moveButtons = gameObject3.transform.FindChild("InGameBuildMenu").FindChild("MoveButtons").gameObject; moveLeftButton = moveButtons.transform.FindChild("MoveLeftButton").gameObject; moveRightButton = moveButtons.transform.FindChild("MoveRightButton").gameObject; moveUpButton = moveButtons.transform.FindChild("MoveUpButton").gameObject; moveDownButton = moveButtons.transform.FindChild("MoveDownButton").gameObject; partSelector = gameObject3.transform.Find("InGameBuildMenu").FindChild("PartSelector").GetComponent(); partSelector.SetParts(m_partDescs); partSelector.gameObject.SetActiveRecursively(false); } } private void Update() { if (m_draggedElement != -1 && (bool)m_dragIcon) { Vector3 position = WPFMonoBehaviour.hudCamera.camera.ScreenToWorldPoint(Input.mousePosition); position.z = WPFMonoBehaviour.hudCamera.transform.position.z + 1f; position += m_dragOffset; m_dragIcon.transform.position = position; } SetHudPositionFromRelativeLevelPosition(clearButton, new Vector3((float)WPFMonoBehaviour.levelManager.gridXmin - 1f, 0.5f * (float)(WPFMonoBehaviour.levelManager.gridHeight - 1), 0f), new Vector3(-0.7f, 0f, 0f)); SetHudPositionFromRelativeLevelPosition(playButton, new Vector3((float)WPFMonoBehaviour.levelManager.gridXmax + 1f, 0.5f * (float)(WPFMonoBehaviour.levelManager.gridHeight - 1), 0f), new Vector3(0.7f, 0f, 0f)); SetHudPositionFromRelativeLevelPosition(moveButtons, new Vector3(0.5f * ((float)WPFMonoBehaviour.levelManager.gridXmin + (float)WPFMonoBehaviour.levelManager.gridXmax), WPFMonoBehaviour.levelManager.gridHeight, 0f), new Vector3(0f, 0.37f, 0f)); if (moveButtons.transform.localPosition.y < 8.5f) { Vector3 localPosition = moveButtons.transform.localPosition; localPosition.y = 8.5f; moveButtons.transform.localPosition = localPosition; } HandleDragging(); } private void SetHudPositionFromRelativeLevelPosition(GameObject obj, Vector3 levelOffset, Vector3 hudOffset) { float z = obj.transform.position.z; Vector3 position = base.transform.position + levelOffset; Vector3 position2 = Camera.main.WorldToScreenPoint(position); Vector3 position3 = WPFMonoBehaviour.hudCamera.GetComponent().ScreenToWorldPoint(position2); position3 += hudOffset; position3.z = z; obj.transform.position = position3; } private void ReceiveUIEvent(UIEvent data) { switch (data.type) { case UIEvent.Type.MoveContraptionLeft: MoveContraption(-1, 0); break; case UIEvent.Type.MoveContraptionRight: MoveContraption(1, 0); break; case UIEvent.Type.MoveContraptionUp: MoveContraption(0, 1); break; case UIEvent.Type.MoveContraptionDown: MoveContraption(0, -1); break; } } private void ContraptionPartChanged(int x, int y) { if (m_contraption.Parts.Count < 2) { SetMoveButtonStates(); return; } if (x == WPFMonoBehaviour.levelManager.gridXmin) { SetMoveButtonState(-1, 0); } if (x == WPFMonoBehaviour.levelManager.gridXmax) { SetMoveButtonState(1, 0); } if (y == 0) { SetMoveButtonState(0, -1); } if (y == WPFMonoBehaviour.levelManager.gridHeight - 1) { SetMoveButtonState(0, 1); } } public void SetMoveButtonStates() { SetMoveButtonState(1, 0); SetMoveButtonState(-1, 0); SetMoveButtonState(0, 1); SetMoveButtonState(0, -1); } private void SetMoveButtonState(int dx, int dy) { bool flag = m_contraption.CanMoveOnGrid(dx, dy); switch (dx) { case -1: moveLeftButton.renderer.enabled = flag; moveLeftButton.collider.enabled = flag; return; case 1: moveRightButton.renderer.enabled = flag; moveRightButton.collider.enabled = flag; return; } switch (dy) { case 1: moveUpButton.renderer.enabled = flag; moveUpButton.collider.enabled = flag; break; case -1: moveDownButton.renderer.enabled = flag; moveDownButton.collider.enabled = flag; break; } } private void MoveContraption(int dx, int dy) { AddMove(); m_contraption.MoveOnGrid(dx, dy); if (dx != 0) { SetMoveButtonState(1, 0); SetMoveButtonState(-1, 0); } if (dy != 0) { SetMoveButtonState(0, 1); SetMoveButtonState(0, -1); } } public void SelectPart(PartDesc partDesc) { m_selectedElement = -1; for (int i = 0; i < m_partDescs.Count; i++) { if (m_partDescs[i] == partDesc) { m_selectedElement = i; break; } } } public void StartDrag(PartDesc partDesc) { int draggedElement = -1; m_draggedElement = -1; for (int i = 0; i < m_partDescs.Count; i++) { if (m_partDescs[i] == partDesc) { if (m_partDescs[i].useCount < m_partDescs[i].maxCount) { m_partDescs[i].useCount++; EventManager.Send(new PartCountChanged(partDesc.part.m_partType, m_partDescs[i].CurrentCount)); draggedElement = i; } break; } } SetDraggedElement(draggedElement); } public bool IsDragging() { return m_draggedElement != -1; } public void CancelDrag(PartDesc partDesc) { SetDraggedElement(-1); } private void SetDraggedElement(int element) { SetDraggedElement(element, false); } private void SetDraggedElement(int element, bool fromContraption) { if (m_useDragOffset) { if (fromContraption) { m_dragOffset = new Vector3(0f, 0.75f, 0f); } else { m_dragOffset = new Vector3(0f, 3f, 0f); } } m_draggedElement = element; if (element == -1) { if ((bool)m_dragIcon) { Object.Destroy(m_dragIcon); m_dragIcon = null; } } else { m_dragIcon = (GameObject)Object.Instantiate(m_partDescs[element].part.m_constructionIconSprite.gameObject); if (m_useDragOffset) { m_dragIcon.transform.localScale = new Vector3(1.75f, 1.75f, 1f); } else { m_dragIcon.transform.localScale = new Vector3(1.75f, 1.75f, 1f); } } } private int FindPartIndex(BasePart part) { for (int i = 0; i < m_partDescs.Count; i++) { if (m_partDescs[i].part.m_partType == part.m_partType) { return i; } } return -1; } private void HandleDragging() { if (WPFMonoBehaviour.levelManager.gameState == LevelManager.GameState.PausedWhileBuilding || WPFMonoBehaviour.levelManager.gameState == LevelManager.GameState.IngamePurchase) { return; } int constructionUiRows = m_partDescs.Count / m_itemsPerRow + ((m_partDescs.Count % m_itemsPerRow != 0) ? 1 : 0); WPFMonoBehaviour.levelManager.m_constructionUiRows = constructionUiRows; if (Input.GetMouseButtonDown(0) && m_draggedElement == -1 && !m_dragStarted) { Vector3 vector = WPFMonoBehaviour.ScreenToZ0(Input.mousePosition); Vector3 vector2 = vector - base.transform.position; int coordX = Mathf.RoundToInt(vector2.x); int coordY = Mathf.RoundToInt(vector2.y); ChangeCoordinatesToSelectBigPart(ref coordX, ref coordY); BasePart basePart = m_contraption.FindPartAt(coordX, coordY); if ((bool)basePart) { if ((bool)basePart.enclosedPart) { basePart = basePart.enclosedPart; } if (!basePart.m_static) { m_dragStartPosition = Input.mousePosition; m_dragStarted = true; } } } if (Input.GetMouseButtonUp(0)) { if (m_dragStarted && m_draggedElement == -1) { Vector3 vector3 = WPFMonoBehaviour.ScreenToZ0(m_dragStartPosition); Vector3 vector4 = vector3 - base.transform.position; int x = Mathf.RoundToInt(vector4.x); int y = Mathf.RoundToInt(vector4.y); BasePart basePart2 = m_contraption.FindPartAt(x, y); if ((bool)basePart2 && m_contraption.Flip(basePart2)) { AddMove(); m_rotationCounter++; AudioManager.Instance.Play2dEffect(AudioManager.Instance.CommonAudioCollection.rotatePart); } } m_dragStarted = false; } float num = ((!m_useDragOffset) ? 1f : 20f); if (m_dragStarted && m_draggedElement == -1 && Vector3.Distance(Input.mousePosition, m_dragStartPosition) >= num) { Vector3 vector5 = WPFMonoBehaviour.ScreenToZ0(m_dragStartPosition); Vector3 vector6 = vector5 - base.transform.position; int coordX2 = Mathf.RoundToInt(vector6.x); int coordY2 = Mathf.RoundToInt(vector6.y); ChangeCoordinatesToSelectBigPart(ref coordX2, ref coordY2); BasePart basePart3 = m_contraption.RemovePartAt(coordX2, coordY2); if ((bool)basePart3) { Debug.Log("old part was " + basePart3.name); draggedPartRotation = basePart3.m_gridRotation; draggedPartFlipped = basePart3.m_flipped; for (int i = 0; i < m_partDescs.Count; i++) { if (m_partDescs[i].part.m_partType == basePart3.m_partType) { SetDraggedElement(i, true); m_selectedElement = i; partSelector.SetSelection(m_partDescs[m_selectedElement]); break; } } Object.Destroy(basePart3.gameObject); ContraptionPartChanged(coordX2, coordY2); WPFMonoBehaviour.levelManager.PlayDragSound(); } } if (m_draggedElement != -1) { PartDesc partDesc = m_partDescs[m_draggedElement]; Vector3 position = WPFMonoBehaviour.hudCamera.camera.ScreenToWorldPoint(Input.mousePosition) + m_dragOffset; Vector3 position2 = WPFMonoBehaviour.hudCamera.camera.WorldToScreenPoint(position); Vector3 vector7 = Camera.main.ScreenToWorldPoint(position2); Vector3 vector8 = vector7 - base.transform.position; int num2 = Mathf.RoundToInt(vector8.x); int num3 = Mathf.RoundToInt(vector8.y); if (m_useDragOffset) { int key = num3 * 1000 + num2; Transform value; if (m_cellMap.TryGetValue(key, out value)) { if ((bool)m_mouseOverCell) { m_mouseOverCell.transform.localScale = new Vector3(0.3f, 0.3f, 0.3f); } m_mouseOverCell = value; value.transform.localScale = new Vector3(0.33f, 0.33f, 0.33f); } else if ((bool)m_mouseOverCell) { m_mouseOverCell.transform.localScale = new Vector3(0.3f, 0.3f, 0.3f); } } if (Input.GetMouseButtonUp(0)) { AddMove(); if (WPFMonoBehaviour.levelManager.CanPlacePartAtGridCell(num2, num3) && m_contraption.CanPlaceSpecificPartAt(num2, num3, partDesc.part)) { SetPartAt(num2, num3, partDesc.part); ContraptionPartChanged(num2, num3); WPFMonoBehaviour.levelManager.PlayPartPlacedSound(); } else { partDesc.useCount--; WPFMonoBehaviour.levelManager.PlayRemoveSound(); EventManager.Send(new PartCountChanged(partDesc.part.m_partType, partDesc.CurrentCount)); } SetDraggedElement(-1); } } else if (m_selectedElement != -1 && m_draggedElement == -1) { PartDesc partDesc2 = m_partDescs[m_selectedElement]; Vector3 vector9 = WPFMonoBehaviour.ScreenToZ0(Input.mousePosition); Vector3 vector10 = vector9 - base.transform.position; int num4 = Mathf.RoundToInt(vector10.x); int num5 = Mathf.RoundToInt(vector10.y); BasePart basePart4 = m_contraption.FindPartAt(num4, num5); if (!basePart4 && Input.GetMouseButtonDown(0) && partDesc2.useCount < partDesc2.maxCount) { if (TryPlacePartAtGridCell(num4, num5, partDesc2)) { AddMove(); } } else if ((bool)basePart4 && basePart4.CanEncloseParts() && partDesc2.part.CanBeEnclosed() && Input.GetMouseButtonUp(0) && partDesc2.useCount < partDesc2.maxCount && TryPlacePartAtGridCell(num4, num5, partDesc2)) { AddMove(); } } if (Input.GetMouseButtonDown(1)) { m_rightDragStartPosition = Input.mousePosition; } if (m_draggedElement == -1 && (Input.GetMouseButtonDown(1) || (Input.GetMouseButton(1) && Input.mousePosition != m_rightDragStartPosition))) { Vector3 vector11 = WPFMonoBehaviour.ScreenToZ0(Input.mousePosition); Vector3 vector12 = vector11 - base.transform.position; int x2 = Mathf.RoundToInt(vector12.x); int y2 = Mathf.RoundToInt(vector12.y); BasePart basePart5 = m_contraption.FindPartAt(x2, y2); if ((bool)basePart5 && (bool)basePart5.enclosedPart) { basePart5 = basePart5.enclosedPart; } if ((bool)basePart5 && !basePart5.m_static) { BasePart basePart6 = m_contraption.RemovePartAt(x2, y2); if ((bool)basePart6) { for (int j = 0; j < m_partDescs.Count; j++) { if (m_partDescs[j].part.m_partType == basePart6.m_partType) { PartDesc partDesc3 = m_partDescs[j]; partDesc3.useCount--; EventManager.Send(new PartCountChanged(partDesc3.part.m_partType, partDesc3.CurrentCount)); AddMove(); break; } } Object.Destroy(basePart6.gameObject); ContraptionPartChanged(x2, y2); } } } if (m_draggedElement == -1 && (bool)m_mouseOverCell) { m_mouseOverCell.transform.localScale = new Vector3(0.3f, 0.3f, 0.3f); m_mouseOverCell = null; } } private void ChangeCoordinatesToSelectBigPart(ref int coordX, ref int coordY) { for (int i = -1; i <= 0; i++) { for (int j = -1; j <= 1; j++) { if (j == 0 && i == 0) { continue; } int num = coordX + j; int num2 = coordY + i; BasePart basePart = m_contraption.FindPartAt(num, num2); if ((bool)basePart) { if ((bool)basePart.enclosedPart) { basePart = basePart.enclosedPart; } if (num + basePart.m_gridXmin <= coordX && num + basePart.m_gridXmax >= coordX && num2 + basePart.m_gridYmin <= coordY && num2 + basePart.m_gridYmax >= coordY) { coordX = num; coordY = num2; return; } } } } } private bool TryPlacePartAtGridCell(int coordX, int coordY, PartDesc partDesc) { if (WPFMonoBehaviour.levelManager.CanPlacePartAtGridCell(coordX, coordY) && m_contraption.CanPlaceSpecificPartAt(coordX, coordY, partDesc.part)) { partDesc.useCount++; EventManager.Send(new PartCountChanged(partDesc.part.m_partType, partDesc.CurrentCount)); SetPartAt(coordX, coordY, partDesc.part); ContraptionPartChanged(coordX, coordY); WPFMonoBehaviour.levelManager.PlayPartPlacedSound(); return true; } return false; } private void ClearNonChassisPart(int coordX, int coordY) { BasePart basePart = m_contraption.FindPartAt(coordX, coordY); if (!basePart || (basePart.IsPartOfChassis() && !basePart.enclosedPart)) { return; } basePart = m_contraption.RemovePartAt(coordX, coordY); for (int i = 0; i < m_partDescs.Count; i++) { if (m_partDescs[i].part.m_partType == basePart.m_partType) { PartDesc partDesc = m_partDescs[i]; partDesc.useCount--; EventManager.Send(new PartCountChanged(partDesc.part.m_partType, partDesc.CurrentCount)); break; } } Object.Destroy(basePart.gameObject); ContraptionPartChanged(coordX, coordY); } public Vector3 GridPositionToGuiPosition(int x, int y) { Vector3 position = m_contraption.transform.position; Vector3 position2 = position + Vector3.right * x + Vector3.up * y; Vector3 position3 = Camera.main.WorldToScreenPoint(position2); return WPFMonoBehaviour.hudCamera.GetComponent().ScreenToWorldPoint(position3); } public Vector3 GridPositionToWorldPosition(int x, int y) { Vector3 position = m_contraption.transform.position; return position + Vector3.right * x + Vector3.up * y; } private void ClearCollidingParts(int coordX, int coordY, BasePart part) { for (int i = part.m_gridYmin; i <= part.m_gridYmax; i++) { for (int j = part.m_gridXmin; j <= part.m_gridXmax; j++) { if (j != 0 || i != 0) { ClearNonChassisPart(coordX + j, coordY + i); } } } if (part.IsPartOfChassis()) { return; } for (int k = -1; k <= 0; k++) { for (int l = -1; l <= 1; l++) { BasePart basePart = m_contraption.FindPartAt(coordX + l, coordY + k); if ((bool)basePart) { if ((bool)basePart.enclosedPart) { basePart = basePart.enclosedPart; } if (basePart.m_partType == BasePart.PartType.KingPig) { ClearNonChassisPart(coordX + l, coordY + k); } } } } } public BasePart SetPartAt(int coordX, int coordY, BasePart part, bool autoalign = true) { GameObject gameObject = Object.Instantiate(part.gameObject) as GameObject; gameObject.SetActiveRecursively (true); BasePart component = gameObject.GetComponent(); BasePart basePart = m_contraption.FindPartAt(coordX, coordY); if (component.m_partType == BasePart.PartType.Pig && (bool)basePart && basePart.m_partType == BasePart.PartType.WoodenFrame && DeviceInfo.Instance.ActiveDeviceFamily == DeviceInfo.DeviceFamily.Ios) { SocialGameManager.Instance.ReportAchievementProgress("grp.THINK_INSIDE_THE_BOX", 100.0); } ClearCollidingParts(coordX, coordY, component); component.PrePlaced(); BasePart part2 = m_contraption.SetPartAt(coordX, coordY, component, autoalign); if (autoalign) { m_contraption.AutoAlign(component); } CollectPart(part2); return component; } protected void CollectPart(BasePart part) { if (!part) { return; } Debug.Log("collecting " + part.name + ", enc " + part.enclosedPart); foreach (PartDesc partDesc in m_partDescs) { if (partDesc.part.m_partType == part.m_partType) { partDesc.useCount--; EventManager.Send(new PartCountChanged(partDesc.part.m_partType, partDesc.CurrentCount)); } } if ((bool)part.enclosedPart) { CollectPart(part.enclosedPart); } Object.Destroy(part.gameObject); } public void SetEnabled(bool enableUI, bool enableGrid) { if ((bool)m_grid) { m_grid.gameObject.SetActiveRecursively(enableGrid); } m_contraption.RefreshConnections(); base.gameObject.active = enableUI; } public void ClearContraption() { m_contraption.RemoveAllDynamicParts(); foreach (PartDesc partDesc in m_partDescs) { partDesc.useCount = 0; EventManager.Send(new PartCountChanged(partDesc.part.m_partType, partDesc.CurrentCount)); } SetMoveButtonStates(); AddMove(); } public void LateUpdate() { for (int i = 0; i < WPFMonoBehaviour.levelManager.gridHeight; i++) { for (int j = WPFMonoBehaviour.levelManager.gridXmin; j <= WPFMonoBehaviour.levelManager.gridXmax; j++) { if (!WPFMonoBehaviour.levelManager.CanPlacePartAtGridCell(j, i)) { continue; } int key = i * 1000 + j; Transform value; if (m_cellMap.TryGetValue(key, out value)) { Renderer renderer = value.renderer; if ((bool)renderer) { } } } } } }