public bool GetTransform(out MatrixI transform) { transform = new MatrixI(); if (this.Blocks.Count != 0) { MySlimBlock block = this.Blocks.First <MySlimBlock>(); if (block.MultiBlockIndex < this.MultiBlockDefinition.BlockDefinitions.Length) { MyMultiBlockDefinition.MyMultiBlockPartDefinition definition = this.MultiBlockDefinition.BlockDefinitions[block.MultiBlockIndex]; transform = MatrixI.CreateRotation(definition.Forward, definition.Up, block.Orientation.Forward, block.Orientation.Up); transform.Translation = block.Position - Vector3I.TransformNormal(definition.Min, ref transform); return(true); } } return(false); }
public bool CanAddBlock(ref Vector3I otherGridPositionMin, ref Vector3I otherGridPositionMax, MyBlockOrientation otherOrientation, MyCubeBlockDefinition otherDefinition) { MatrixI xi; bool flag2; if (!this.GetTransform(out xi)) { return(true); } try { MatrixI xi2; MatrixI.Invert(ref xi, out xi2); Vector3I vectori1 = Vector3I.Transform(otherGridPositionMin, ref xi2); Vector3I vectori = Vector3I.Transform(otherGridPositionMax, ref xi2); Vector3I minB = Vector3I.Min(vectori1, vectori); Vector3I maxB = Vector3I.Max(vectori1, vectori); if (Vector3I.BoxIntersects(ref this.MultiBlockDefinition.Min, ref this.MultiBlockDefinition.Max, ref minB, ref maxB)) { MatrixI xi4; MatrixI leftMatrix = new MatrixI(otherOrientation); MatrixI.Multiply(ref leftMatrix, ref xi2, out xi4); MyBlockOrientation orientation = new MyBlockOrientation(xi4.Forward, xi4.Up); m_tmpPartDefinitions.Clear(); MyMultiBlockDefinition.MyMultiBlockPartDefinition[] blockDefinitions = this.MultiBlockDefinition.BlockDefinitions; int index = 0; while (true) { if (index < blockDefinitions.Length) { MyMultiBlockDefinition.MyMultiBlockPartDefinition item = blockDefinitions[index]; if (Vector3I.BoxIntersects(ref item.Min, ref item.Max, ref minB, ref maxB)) { if (!(minB == maxB)) { break; } if (!(item.Min == item.Max)) { break; } m_tmpPartDefinitions.Add(item); } index++; continue; } if (m_tmpPartDefinitions.Count == 0) { flag2 = true; } else { bool flag = true; foreach (MyMultiBlockDefinition.MyMultiBlockPartDefinition definition2 in m_tmpPartDefinitions) { MyCubeBlockDefinition definition3; if (!MyDefinitionManager.Static.TryGetCubeBlockDefinition(definition2.Id, out definition3)) { continue; } if (definition3 != null) { flag &= MyCompoundCubeBlock.CanAddBlocks(definition3, new MyBlockOrientation(definition2.Forward, definition2.Up), otherDefinition, orientation); if (!flag) { break; } } } flag2 = flag; } return(flag2); } flag2 = false; } else { flag2 = true; } } finally { m_tmpPartDefinitions.Clear(); } return(flag2); }