public override MyObjectBuilder_CubeBlock GetObjectBuilderCubeBlock(bool copy = false) { MyObjectBuilder_CompoundCubeBlock objectBuilder = (MyObjectBuilder_CompoundCubeBlock)base.GetObjectBuilderCubeBlock(copy); if (m_mapIdToBlock.Count > 0) { objectBuilder.Blocks = new MyObjectBuilder_CubeBlock[m_mapIdToBlock.Count]; objectBuilder.BlockIds = new ushort[m_mapIdToBlock.Count]; int counter = 0; foreach (var pair in m_mapIdToBlock) { objectBuilder.BlockIds[counter] = pair.Key; if (!copy) { objectBuilder.Blocks[counter] = pair.Value.GetObjectBuilder(); } else { objectBuilder.Blocks[counter] = pair.Value.GetCopyObjectBuilder(); } ++counter; } } Debug.Assert(objectBuilder.Blocks == null && objectBuilder.BlockIds == null || objectBuilder.Blocks.Length == objectBuilder.BlockIds.Length); return(objectBuilder); }
public static MyObjectBuilder_CompoundCubeBlock CreateBuilder(MyObjectBuilder_CubeBlock cubeBlockBuilder) { MyObjectBuilder_CompoundCubeBlock local1 = MyObjectBuilderSerializer.CreateNewObject <MyObjectBuilder_CompoundCubeBlock>(COMPOUND_BLOCK_SUBTYPE_NAME); local1.EntityId = MyEntityIdentifier.AllocateId(MyEntityIdentifier.ID_OBJECT_TYPE.ENTITY, MyEntityIdentifier.ID_ALLOCATION_METHOD.RANDOM); local1.Min = cubeBlockBuilder.Min; local1.BlockOrientation = new MyBlockOrientation(ref Quaternion.Identity); local1.ColorMaskHSV = cubeBlockBuilder.ColorMaskHSV; local1.Blocks = new MyObjectBuilder_CubeBlock[] { cubeBlockBuilder }; return(local1); }
/// <summary> /// Returns compound cube block builder which includes given blocks. /// </summary> public static MyObjectBuilder_CompoundCubeBlock CreateBuilder(List <MyObjectBuilder_CubeBlock> cubeBlockBuilders) { MyObjectBuilder_CompoundCubeBlock compoundCBBuilder = (MyObjectBuilder_CompoundCubeBlock)MyObjectBuilderSerializer.CreateNewObject <MyObjectBuilder_CompoundCubeBlock>(COMPOUND_BLOCK_SUBTYPE_NAME); compoundCBBuilder.EntityId = MyEntityIdentifier.AllocateId(); compoundCBBuilder.Min = cubeBlockBuilders[0].Min; compoundCBBuilder.BlockOrientation = new MyBlockOrientation(ref Quaternion.Identity); compoundCBBuilder.ColorMaskHSV = cubeBlockBuilders[0].ColorMaskHSV; compoundCBBuilder.Blocks = cubeBlockBuilders.ToArray(); return(compoundCBBuilder); }
/// <summary> /// Returns compound cube block builder which includes the given block. /// </summary> public static MyObjectBuilder_CompoundCubeBlock CreateBuilder(MyObjectBuilder_CubeBlock cubeBlockBuilder) { MyObjectBuilder_CompoundCubeBlock compoundCBBuilder = (MyObjectBuilder_CompoundCubeBlock)MyObjectBuilderSerializer.CreateNewObject <MyObjectBuilder_CompoundCubeBlock>(COMPOUND_BLOCK_SUBTYPE_NAME); compoundCBBuilder.EntityId = MyEntityIdentifier.AllocateId(); compoundCBBuilder.Min = cubeBlockBuilder.Min; compoundCBBuilder.BlockOrientation = new MyBlockOrientation(ref Quaternion.Identity); compoundCBBuilder.ColorMaskHSV = cubeBlockBuilder.ColorMaskHSV; // Add block builder to compound compoundCBBuilder.Blocks = new MyObjectBuilder_CubeBlock[1]; compoundCBBuilder.Blocks[0] = cubeBlockBuilder; return(compoundCBBuilder); }
public override MyObjectBuilder_CubeBlock GetObjectBuilderCubeBlock(bool copy = false) { MyObjectBuilder_CompoundCubeBlock objectBuilderCubeBlock = (MyObjectBuilder_CompoundCubeBlock)base.GetObjectBuilderCubeBlock(copy); if (this.m_mapIdToBlock.Count > 0) { objectBuilderCubeBlock.Blocks = new MyObjectBuilder_CubeBlock[this.m_mapIdToBlock.Count]; objectBuilderCubeBlock.BlockIds = new ushort[this.m_mapIdToBlock.Count]; int index = 0; foreach (KeyValuePair <ushort, MySlimBlock> pair in this.m_mapIdToBlock) { objectBuilderCubeBlock.BlockIds[index] = pair.Key; objectBuilderCubeBlock.Blocks[index] = copy ? pair.Value.GetCopyObjectBuilder() : pair.Value.GetObjectBuilder(false); index++; } } return(objectBuilderCubeBlock); }
public static ulong GetBattlePoints(MyObjectBuilder_CubeGrid grid) { ulong pts = 0; foreach (var block in grid.CubeBlocks) { MyObjectBuilder_CompoundCubeBlock compoundBlock = block as MyObjectBuilder_CompoundCubeBlock; if (compoundBlock != null) { foreach (var blockInCompound in compoundBlock.Blocks) { pts += GetBattlePoints(blockInCompound); } } else { pts += GetBattlePoints(block); } } return(pts); }
public static void TakeMaterialsFromBuilder(List <MyObjectBuilder_CubeGrid> blocksToBuild, VRage.Game.Entity.MyEntity builder) { if (blocksToBuild.Count != 0) { MyObjectBuilder_CubeBlock block = blocksToBuild[0].CubeBlocks.FirstOrDefault <MyObjectBuilder_CubeBlock>(); if (block != null) { MyDefinitionId id; MyObjectBuilder_CompoundCubeBlock block2 = block as MyObjectBuilder_CompoundCubeBlock; if (block2 == null) { if (block.MultiBlockDefinition == null) { return; } id = block.MultiBlockDefinition.Value; } else if (block2.Blocks == null) { return; } else if ((block2.Blocks.Length != 0) && (block2.Blocks[0].MultiBlockDefinition != null)) { id = block2.Blocks[0].MultiBlockDefinition.Value; } else { return; } MyMultiBlockDefinition multiBlockDefinition = MyDefinitionManager.Static.TryGetMultiBlockDefinition(id); if (multiBlockDefinition != null) { MyCubeBuilder.BuildComponent.GetMultiBlockPlacementMaterials(multiBlockDefinition); MyCubeBuilder.BuildComponent.AfterSuccessfulBuild(builder, false); } } } }
/// <summary> /// Transforms given compound block with matrix for static grid. Rotation of block is not changed. /// </summary> private static void ConvertRotatedGridCompoundBlockToStatic(ref MatrixI transform, MyObjectBuilder_CompoundCubeBlock origBlock) { MyDefinitionId defId = new MyDefinitionId(origBlock.TypeId, origBlock.SubtypeName); MyCubeBlockDefinition blockDefinition; MyDefinitionManager.Static.TryGetCubeBlockDefinition(defId, out blockDefinition); if (blockDefinition == null) { return; } // Orientation quaternion is not setup in origblock MyBlockOrientation origOrientation = origBlock.BlockOrientation; Vector3I origMin = origBlock.Min; Vector3I origMax; MySlimBlock.ComputeMax(blockDefinition, origOrientation, ref origMin, out origMax); Vector3I tMin; Vector3I tMax; Vector3I.Transform(ref origMin, ref transform, out tMin); Vector3I.Transform(ref origMax, ref transform, out tMax); // Write data origBlock.Min = Vector3I.Min(tMin, tMax); }
/// <summary> /// Transforms given compound block with matrix for static grid. Rotation of block is not changed. /// </summary> private static void ConvertRotatedGridCompoundBlockToStatic(ref MatrixI transform, MyObjectBuilder_CompoundCubeBlock origBlock) { MyDefinitionId defId = new MyDefinitionId(origBlock.TypeId, origBlock.SubtypeName); MyCubeBlockDefinition blockDefinition; MyDefinitionManager.Static.TryGetCubeBlockDefinition(defId, out blockDefinition); if (blockDefinition == null) return; // Orientation quaternion is not setup in origblock MyBlockOrientation origOrientation = origBlock.BlockOrientation; Vector3I origMin = origBlock.Min; Vector3I origMax; MySlimBlock.ComputeMax(blockDefinition, origOrientation, ref origMin, out origMax); Vector3I tMin; Vector3I tMax; Vector3I.Transform(ref origMin, ref transform, out tMin); Vector3I.Transform(ref origMax, ref transform, out tMax); // Write data origBlock.Min = Vector3I.Min(tMin, tMax); }
public MyObjectBuilder_CubeBlock ConvertToOriginalBlocksWithFractureComponent() { List <MyObjectBuilder_CubeBlock> blockBuilders = new List <MyObjectBuilder_CubeBlock>(); Quaternion q; for (int i = 0; i < OriginalBlocks.Count; ++i) { var defId = OriginalBlocks[i]; MyCubeBlockDefinition def; MyDefinitionManager.Static.TryGetCubeBlockDefinition(defId, out def); if (def == null) { Debug.Fail("Cube block definition not found"); continue; } var orientation = Orientations[i]; MultiBlockPartInfo multiBlockInfo = MultiBlocks != null && MultiBlocks.Count > i ? MultiBlocks[i] : null; MyObjectBuilder_CubeBlock blockBuilder = MyObjectBuilderSerializer.CreateNewObject(defId) as MyObjectBuilder_CubeBlock; orientation.GetQuaternion(out q); blockBuilder.Orientation = q; blockBuilder.Min = Position; blockBuilder.MultiBlockId = multiBlockInfo != null ? multiBlockInfo.MultiBlockId : 0; blockBuilder.MultiBlockDefinition = null; if (multiBlockInfo != null) { blockBuilder.MultiBlockDefinition = multiBlockInfo.MultiBlockDefinition; } blockBuilder.ComponentContainer = new MyObjectBuilder_ComponentContainer(); var fractureBuilder = new MyObjectBuilder_FractureComponentCubeBlock(); HashSet <string> shapeNames = new HashSet <string>(); GetAllBlockBreakableShapeNames(def, shapeNames); ConvertAllShapesToFractureComponentShapeBuilder(Shape, ref Matrix.Identity, orientation, shapeNames, fractureBuilder); // Count of shapes can be 0! if (fractureBuilder.Shapes.Count == 0) { continue; } var componentData = new MyObjectBuilder_ComponentContainer.ComponentData(); componentData.TypeId = typeof(MyFractureComponentBase).Name; componentData.Component = fractureBuilder; blockBuilder.ComponentContainer.Components.Add(componentData); if (i == 0 && CubeGrid.GridSizeEnum == MyCubeSize.Small) { return(blockBuilder); } blockBuilders.Add(blockBuilder); } if (blockBuilders.Count > 0) { MyObjectBuilder_CompoundCubeBlock compoundBuilder = MyCompoundCubeBlock.CreateBuilder(blockBuilders); return(compoundBuilder); } return(null); }
public MyObjectBuilder_CubeBlock ConvertToOriginalBlocksWithFractureComponent() { List <MyObjectBuilder_CubeBlock> blockBuilders = new List <MyObjectBuilder_CubeBlock>(); Quaternion q; for (int i = 0; i < OriginalBlocks.Count; ++i) { var defId = OriginalBlocks[i]; MyCubeBlockDefinition def; MyDefinitionManager.Static.TryGetCubeBlockDefinition(defId, out def); if (def == null) { Debug.Fail("Cube block definition not found"); continue; } var orientation = Orientations[i]; MultiBlockPartInfo multiBlockInfo = MultiBlocks != null && MultiBlocks.Count > i ? MultiBlocks[i] : null; MyObjectBuilder_CubeBlock blockBuilder = MyObjectBuilderSerializer.CreateNewObject(defId) as MyObjectBuilder_CubeBlock; orientation.GetQuaternion(out q); blockBuilder.Orientation = q; blockBuilder.Min = Position; blockBuilder.MultiBlockId = multiBlockInfo != null ? multiBlockInfo.MultiBlockId : 0; blockBuilder.MultiBlockDefinition = null; if (multiBlockInfo != null) { blockBuilder.MultiBlockDefinition = multiBlockInfo.MultiBlockDefinition; } blockBuilder.ComponentContainer = new MyObjectBuilder_ComponentContainer(); var fractureBuilder = new MyObjectBuilder_FractureComponentCubeBlock(); m_tmpNamesAndBuildProgress.Clear(); GetAllBlockBreakableShapeNames(def, m_tmpNamesAndBuildProgress); float buildProgress; ConvertAllShapesToFractureComponentShapeBuilder(Shape, ref Matrix.Identity, orientation, m_tmpNamesAndBuildProgress, fractureBuilder, out buildProgress); m_tmpNamesAndBuildProgress.Clear(); // Count of shapes can be 0! if (fractureBuilder.Shapes.Count == 0) { continue; } float previousBuildRatioUpperBound = 0f; if (def.BuildProgressModels != null) { foreach (var progress in def.BuildProgressModels) { if (progress.BuildRatioUpperBound >= buildProgress) { break; } previousBuildRatioUpperBound = progress.BuildRatioUpperBound; } } var componentData = new MyObjectBuilder_ComponentContainer.ComponentData(); componentData.TypeId = typeof(MyFractureComponentBase).Name; componentData.Component = fractureBuilder; blockBuilder.ComponentContainer.Components.Add(componentData); blockBuilder.BuildPercent = buildProgress; Debug.Assert(buildProgress > previousBuildRatioUpperBound); blockBuilder.IntegrityPercent = MyDefinitionManager.Static.DestructionDefinition.ConvertedFractureIntegrityRatio * buildProgress; if (i == 0 && CubeGrid.GridSizeEnum == MyCubeSize.Small) { return(blockBuilder); } blockBuilders.Add(blockBuilder); } if (blockBuilders.Count > 0) { MyObjectBuilder_CompoundCubeBlock compoundBuilder = MyCompoundCubeBlock.CreateBuilder(blockBuilders); return(compoundBuilder); } return(null); }
public override void Init(MyObjectBuilder_CubeBlock objectBuilder, MyCubeGrid cubeGrid) { base.Init(objectBuilder, cubeGrid); MyObjectBuilder_CompoundCubeBlock block = objectBuilder as MyObjectBuilder_CompoundCubeBlock; if (block.Blocks != null) { if (block.BlockIds == null) { for (int i = 0; i < block.Blocks.Length; i++) { MyObjectBuilder_CubeBlock builder = block.Blocks[i]; object obj3 = MyCubeBlockFactory.CreateCubeBlock(builder); MySlimBlock block5 = obj3 as MySlimBlock; if (block5 == null) { block5 = new MySlimBlock(); } block5.Init(builder, cubeGrid, obj3 as MyCubeBlock); block5.FatBlock.HookMultiplayer(); block5.FatBlock.Hierarchy.Parent = base.Hierarchy; ushort key = this.CreateId(block5); this.m_mapIdToBlock.Add(key, block5); this.m_blocks.Add(block5); } } else { int index = 0; while (true) { if (index >= block.Blocks.Length) { this.RefreshNextId(); break; } ushort key = block.BlockIds[index]; if (!this.m_mapIdToBlock.ContainsKey(key)) { MyObjectBuilder_CubeBlock builder = block.Blocks[index]; object obj2 = MyCubeBlockFactory.CreateCubeBlock(builder); MySlimBlock block3 = obj2 as MySlimBlock; if (block3 == null) { block3 = new MySlimBlock(); } block3.Init(builder, cubeGrid, obj2 as MyCubeBlock); if (block3.FatBlock != null) { block3.FatBlock.HookMultiplayer(); block3.FatBlock.Hierarchy.Parent = base.Hierarchy; this.m_mapIdToBlock.Add(key, block3); this.m_blocks.Add(block3); } } index++; } } } this.RefreshTemplates(); base.AddDebugRenderComponent(new MyDebugRenderComponentCompoundBlock(this)); }