public void ReplacePart(int designId, bool reverse) { if (selectedPart != null) { bool currentReversed = !MathUtils.NearEqual(selectedPart.transform.localRotation.eulerAngles.y, LXFMLHelper.GetDefaultRotation(selectedPart.designId)); //(_construction.GetBrick(selectedPart.id)); int brickId = selectedPart.id; //Destroy old one Vector3 oldPosition = selectedPart.transform.position; _builder.DestroyBrick(selectedPart); _bricks.Remove(brickId); //Create new one BrickData brickData = new BrickData(); brickData.design = new BrickDesignData(); brickData.id = _builder.construction.GetNextBrickId(); brickData.materialId = LXFMLHelper.GetColors(designId)[0]; brickData.design.id = designId; brickData.design.width = LXFMLHelper.GetBrickWidth(designId); brickData.design.height = LXFMLHelper.GetBrickHeight(designId); brickData.design.type = LXFMLHelper.GetBrickType(designId); brickData.scale = Vector3.one; GameObject newBrick = Instantiate(ConstructionController.Instance.resourcesProvider.GetPrefabForDesign(designId)); newBrick.transform.SetParent(constructionTarget); LegoBrickId newOne = newBrick.GetComponent <LegoBrickId>(); newOne.id = brickData.id; newOne.transform.position = oldPosition; Vector3 position = oldPosition; //WEIRD HACK...I HAVE TO OFFSET BY HALF A BRICK TO GET THE CORRECT POSITION position.z -= LXFMLHelper.kBrickSize.x / 2f; brickData.position = position; float add = reverse?180:0; if (LXFMLHelper.GetBrickOrientation(newOne.designId) == LXFMLHelper.BrickOrientation.NegativeX) { newOne.transform.localEulerAngles = new Vector3(0, 0f + add, 0); } else if (LXFMLHelper.GetBrickOrientation(newOne.designId) == LXFMLHelper.BrickOrientation.PositiveX) { newOne.transform.localEulerAngles = new Vector3(0, 180f + add, 0); } else if (LXFMLHelper.GetBrickOrientation(newOne.designId) == LXFMLHelper.BrickOrientation.NegativeZ) { newOne.transform.localEulerAngles = new Vector3(0, 90f + add, 0); } else if (LXFMLHelper.GetBrickOrientation(newOne.designId) == LXFMLHelper.BrickOrientation.PositiveZ) { newOne.transform.localEulerAngles = new Vector3(0, 270f + add, 0); } //TODO : Fix Orientation stuff, it's getting messy... if (reverse) { if (!currentReversed) { float xOffset = (brickData.design.width - 1) * LXFMLHelper.kBrickSize.x; if (LXFMLHelper.GetBrickOrientation(newOne.designId) == LXFMLHelper.BrickOrientation.PositiveZ) { newOne.transform.Translate(0f, 0f, xOffset); } else { newOne.transform.Translate(-xOffset, 0f, 0f); } brickData.position = newOne.transform.position; } } else { if (currentReversed) { float xOffset = (brickData.design.width - 1) * LXFMLHelper.kBrickSize.x; if (LXFMLHelper.GetBrickOrientation(newOne.designId) == LXFMLHelper.BrickOrientation.PositiveZ) { newOne.transform.Translate(0f, 0f, xOffset); } else { newOne.transform.Translate(-xOffset, 0f, 0f); } brickData.position = newOne.transform.position; } } brickData.isFlipped = reverse; brickData.rotation = Quaternion.Euler(0f, -newOne.transform.localEulerAngles.y, 0f); var renderer = newBrick.GetComponentInChildren <MeshRenderer>(); renderer.sharedMaterial = ConstructionController.Instance.resourcesProvider.GetMaterial(brickData.materialId); selectedPart = newOne; _bricks.Add(newOne.id, newOne); _builder.AddBrick(_bricks[newOne.id].transform, brickData); UpdateAvailableParts(selectedPart); UpdateAvailableColors(selectedPart); } }