Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        /// <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);
        }
Ejemplo n.º 4
0
        /// <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);
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 7
0
 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);
        }
Ejemplo n.º 10
0
        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);
        }
Ejemplo n.º 11
0
        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);
        }
Ejemplo n.º 12
0
        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));
        }