public static void CreateFractureComponent(long gridId, Vector3I position, ushort compoundBlockId, MyObjectBuilder_FractureComponentBase component)
        {
            Debug.Assert(Sync.IsServer);
            Debug.Assert(gridId != 0);
            Debug.Assert(component.Shapes != null && component.Shapes.Count > 0);

            MyMultiplayer.RaiseStaticEvent(s => MySyncDestructions.OnCreateFractureComponentMessage, gridId, position, compoundBlockId, component);
        }
        private static void AddFractureComponent(MyObjectBuilder_FractureComponentBase obFractureComponent, MyEntity entity)
        {
            var component = MyComponentFactory.CreateInstanceByTypeId(obFractureComponent.TypeId);
            var fractureComponent = component as MyFractureComponentBase;
            Debug.Assert(fractureComponent != null);
            if (fractureComponent != null)
            {
                try
                {
                    bool hasComponent = entity.Components.Has<MyFractureComponentBase>();
                    Debug.Assert(!hasComponent);
                    if (!hasComponent)
                    {
                        entity.Components.Add<MyFractureComponentBase>(fractureComponent);
                        fractureComponent.Deserialize(obFractureComponent);
                    }
                }
                catch (Exception e)
                {
                    MyLog.Default.WriteLine("Cannot add received fracture component: " + e.Message);
                    if (entity.Components.Has<MyFractureComponentBase>())
                    {
                        MyCubeBlock block = entity as MyCubeBlock;
                        if (block != null && block.SlimBlock != null)
                        {
                            block.SlimBlock.RemoveFractureComponent();
                        }
                        else
                        {
                            Debug.Fail("Fracture component not supported for other entities than MyCubeBlock for now!");
                            // Renderer has to be set to entity default because it is changed in fracture component.
                            entity.Components.Remove<MyFractureComponentBase>();
                        }
                    }

                    StringBuilder sb = new StringBuilder();
                    foreach (var shape in obFractureComponent.Shapes)
                        sb.Append(shape.Name).Append(" ");

                    Debug.Fail("Recieved fracture component not added");
                    MyLog.Default.WriteLine("Received fracture component not added, no shape found. Shapes: " + sb.ToString());
                }
            }
        }
예제 #3
0
 private static void AddFractureComponent(MyObjectBuilder_FractureComponentBase obFractureComponent, MyEntity entity)
 {
     var component = MyComponentFactory.CreateInstance(obFractureComponent.GetType());
     var fractureComponent = component as MyFractureComponentBase;
     Debug.Assert(fractureComponent != null);
     if (fractureComponent != null)
     {
         bool hasComponent = entity.Components.Has<MyFractureComponentBase>();
         Debug.Assert(!hasComponent);
         if (!hasComponent)
         {
             entity.Components.Add<MyFractureComponentBase>(fractureComponent);
             fractureComponent.Deserialize(obFractureComponent);
         }
     }
 }
        protected void SerializeInternal(MyObjectBuilder_FractureComponentBase ob)
        {
            Debug.Assert(m_tmpChildren.Count == 0);

            if (string.IsNullOrEmpty(Shape.Name) || Shape.IsCompound() || Shape.GetChildrenCount() > 0)
            {
                Shape.GetChildren(m_tmpChildren);
                foreach (var child in m_tmpChildren)
                {
                    var shape = new MyObjectBuilder_FractureComponentCubeBlock.FracturedShape()
                    {
                        Name = child.ShapeName,
                        Fixed = MyDestructionHelper.IsFixed(child.Shape)
                    };
                    ob.Shapes.Add(shape);
                }
                m_tmpChildren.Clear();
            }
            else
            {
                ob.Shapes.Add(new MyObjectBuilder_FractureComponentCubeBlock.FracturedShape() { Name = Shape.Name });
            }
        }
예제 #5
0
        public static void CreateFractureComponent(long gridId, Vector3I position, ushort compoundBlockId, MyObjectBuilder_FractureComponentBase component)
        {
            Debug.Assert(Sync.IsServer);
            Debug.Assert(gridId != 0);
            Debug.Assert(component.Shapes != null && component.Shapes.Count > 0);

            var msg = new CreateFractureComponentMsg();
            msg.Grid = gridId;
            msg.Position = position;
            msg.CompoundBlockId = compoundBlockId;
            msg.FractureComponent = component;
            MySession.Static.SyncLayer.SendMessageToAll(ref msg);
        }