Пример #1
0
        public override void Init(MyComponentDefinitionBase definition)
        {
            base.Init(definition);

            m_definition = definition as MyUseObjectsComponentDefinition;
            Debug.Assert(m_definition != null);
        }
Пример #2
0
        private static double GetInventoryVolumeInternal(MyDefinitionId id)
        {
            MyContainerDefinition container;

            if (MyComponentContainerExtension.TryGetContainerDefinition(id.TypeId, id.SubtypeId, out container) && container.DefaultComponents != null)
            {
                foreach (var component in container.DefaultComponents)
                {
                    MyComponentDefinitionBase componentDefinition = null;
                    if (!MyComponentContainerExtension.TryGetComponentDefinition(component.BuilderType,
                                                                                 component.SubtypeId ?? id.SubtypeId, out componentDefinition))
                    {
                        continue;
                    }
                    var invDef = componentDefinition as MyInventoryComponentDefinition;
                    if (invDef != null)
                    {
                        return(invDef.Volume * 1000);
                    }
                }
            }

            var def = MyDefinitionManager.Static.GetCubeBlockDefinition(id);

            if (def is MyCargoContainerDefinition)
            {
                return((def as MyCargoContainerDefinition).InventorySize.Volume * 1000);
            }
            return(0.0);
        }
        public override void Init(MyComponentDefinitionBase definition)
        {
            base.Init(definition);

            Definition = definition as MyModelComponentDefinition;
            Debug.Assert(Definition != null, "Passed null definition or wrong type!");
        }
        public override void Init(MyComponentDefinitionBase definition)
        {
            base.Init(definition);

            var craftDefinition = definition as MyCraftingComponentBasicDefinition;

            System.Diagnostics.Debug.Assert(craftDefinition != null, "Trying to initialize crafting component from wrong definition type?");


            if (craftDefinition != null)
            {
                ActionSound = new MySoundPair(craftDefinition.ActionSound);
                m_craftingSpeedMultiplier = craftDefinition.CraftingSpeedMultiplier;

                foreach (var blueprintClass in craftDefinition.AvailableBlueprintClasses)
                {
                    var classDefinition = MyDefinitionManager.Static.GetBlueprintClass(blueprintClass);
                    System.Diagnostics.Debug.Assert(classDefinition != null, blueprintClass + " blueprint class definition was not found.");
                    if (classDefinition != null)
                    {
                        m_blueprintClasses.Add(classDefinition);
                    }
                }
            }
        }
Пример #5
0
        public override void Init(MyComponentDefinitionBase definition)
        {
            base.Init(definition);

            var inventorySpawnDef = definition as MyEntityInventorySpawnComponent_Definition;

            m_containerDefinition = inventorySpawnDef.ContainerDefinition;
        }
Пример #6
0
        public override void Init(MyComponentDefinitionBase definition)
        {
            base.Init(definition);

            logger = new Logger("Player", "Player");

            Entity.NeedsUpdate |= VRage.ModAPI.MyEntityUpdateEnum.EACH_100TH_FRAME;
        }
Пример #7
0
        public override void Init(MyComponentDefinitionBase definition)
        {
            base.Init(definition);

            MyEntityStatComponentDefinition entityStatDefinition = definition as MyEntityStatComponentDefinition;

            Debug.Assert(entityStatDefinition != null);

            if (entityStatDefinition == null || !entityStatDefinition.Enabled || MySession.Static == null ||
                (!entityStatDefinition.AvailableInSurvival && MySession.Static.SurvivalMode))
            {
                if (Sync.IsServer) // Only init scripts on server
                {
                    m_statActionsRequested = true;
                }
                return;
            }

            foreach (var statId in entityStatDefinition.Stats)
            {
                MyEntityStatDefinition statDefinition = null;
                if (!MyDefinitionManager.Static.TryGetDefinition(statId, out statDefinition))
                {
                    continue;
                }

                if (!statDefinition.Enabled ||
                    (!statDefinition.EnabledInCreative && MySession.Static.CreativeMode) ||
                    (!statDefinition.AvailableInSurvival && MySession.Static.SurvivalMode))
                {
                    continue;
                }

                var          nameHash     = MyStringHash.GetOrCompute(statDefinition.Name);
                MyEntityStat existingStat = null;
                if (m_stats.TryGetValue(nameHash, out existingStat) && existingStat.StatDefinition.Id.SubtypeId == statDefinition.Id.SubtypeId)
                {
                    continue;
                }

                var builder = new MyObjectBuilder_EntityStat();
                builder.SubtypeName = statId.SubtypeName;
                builder.MaxValue    = 1.0f;
                builder.Value       = statDefinition.DefaultValue / statDefinition.MaxValue;
                AddStat(nameHash, builder);
            }

            if (Sync.IsServer)  // Only init scripts on server
            {
                Debug.Assert(m_scripts.Count == 0);
                foreach (var scriptName in entityStatDefinition.Scripts)
                {
                    InitScript(scriptName);
                }
                m_statActionsRequested = true;
            }
        }
Пример #8
0
        public override void Init(MyComponentDefinitionBase definition)
        {
            base.Init(definition);
            MyCraftingComponentInteractiveDefinition definition2 = definition as MyCraftingComponentInteractiveDefinition;

            if (definition2 != null)
            {
                this.ActionSound = new MySoundPair(definition2.ActionSound, true);
                base.m_craftingSpeedMultiplier = definition2.CraftingSpeedMultiplier;
                foreach (string str in definition2.AvailableBlueprintClasses)
                {
                    MyBlueprintClassDefinition blueprintClass = MyDefinitionManager.Static.GetBlueprintClass(str);
                    base.m_blueprintClasses.Add(blueprintClass);
                }
            }
        }
Пример #9
0
        public override void Init(MyComponentDefinitionBase definition)
        {
            base.Init(definition);
            MyTimerComponentDefinition definition2 = definition as MyTimerComponentDefinition;

            if (definition2 != null)
            {
                this.TimerEnabled        = definition2.TimeToRemoveMin > 0f;
                this.m_setTimeMin        = definition2.TimeToRemoveMin;
                this.TimeToEvent         = this.m_setTimeMin;
                this.RemoveEntityOnTimer = definition2.TimeToRemoveMin > 0f;
                if (this.RemoveEntityOnTimer && Sync.IsServer)
                {
                    this.EventToTrigger = GetRemoveEntityOnTimerEvent();
                }
            }
        }
Пример #10
0
        public override void Init(MyComponentDefinitionBase definition)
        {
            base.Init(definition);
            MyEntityStatComponentDefinition definition2 = definition as MyEntityStatComponentDefinition;

            if (((definition2 == null) || (!definition2.Enabled || (MySession.Static == null))) || (!definition2.AvailableInSurvival && MySession.Static.SurvivalMode))
            {
                if (Sync.IsServer)
                {
                    this.m_statActionsRequested = true;
                }
            }
            else
            {
                foreach (MyDefinitionId id in definition2.Stats)
                {
                    MyEntityStatDefinition definition3 = null;
                    if (MyDefinitionManager.Static.TryGetDefinition <MyEntityStatDefinition>(id, out definition3) && (definition3.Enabled && ((definition3.EnabledInCreative || !MySession.Static.CreativeMode) && (definition3.AvailableInSurvival || !MySession.Static.SurvivalMode))))
                    {
                        MyStringHash orCompute = MyStringHash.GetOrCompute(definition3.Name);
                        MyEntityStat stat      = null;
                        if (!this.m_stats.TryGetValue(orCompute, out stat) || (stat.StatDefinition.Id.SubtypeId != definition3.Id.SubtypeId))
                        {
                            MyObjectBuilder_EntityStat objectBuilder = new MyObjectBuilder_EntityStat {
                                SubtypeName = id.SubtypeName,
                                MaxValue    = 1f,
                                Value       = definition3.DefaultValue / definition3.MaxValue
                            };
                            this.AddStat(orCompute, objectBuilder, false);
                        }
                    }
                }
                if (Sync.IsServer)
                {
                    foreach (string str in definition2.Scripts)
                    {
                        this.InitScript(str);
                    }
                    this.m_statActionsRequested = true;
                }
            }
        }
Пример #11
0
        public override void Init(MyComponentDefinitionBase definition)
        {
            base.Init(definition);

            var timerComponentDefinition = definition as MyTimerComponentDefinition;

            Debug.Assert(timerComponentDefinition != null);
            if (timerComponentDefinition != null)
            {
                TimerEnabled        = timerComponentDefinition.TimeToRemoveMin > 0;
                m_setTimeMin        = timerComponentDefinition.TimeToRemoveMin;
                TimeToEvent         = m_setTimeMin;
                RemoveEntityOnTimer = timerComponentDefinition.TimeToRemoveMin > 0;

                if (RemoveEntityOnTimer)
                {
                    EventToTrigger = GetRemoveEntityOnTimerEvent();
                }
            }
        }
Пример #12
0
        public override void Init(MyComponentDefinitionBase definition)
        {
            base.Init(definition);

            Definition = definition as MyPhysicsComponentDefinitionBase;
            Debug.Assert(Definition != null);
            if (Definition != null)
            {
                Flags = Definition.RigidBodyFlags;

                if (Definition.LinearDamping != null)
                {
                    LinearDamping = Definition.LinearDamping.Value;
                }

                if (Definition.AngularDamping != null)
                {
                    AngularDamping = Definition.AngularDamping.Value;
                }
            }
        }
Пример #13
0
        public override void Init(MyComponentDefinitionBase definition)
        {
            base.Init(definition);
            MyCraftingComponentBlockDefinition definition2 = definition as MyCraftingComponentBlockDefinition;

            if (definition2 != null)
            {
                base.m_craftingSpeedMultiplier = definition2.CraftingSpeedMultiplier;
                foreach (string str in definition2.AvailableBlueprintClasses)
                {
                    MyBlueprintClassDefinition blueprintClass = MyDefinitionManager.Static.GetBlueprintClass(str);
                    if (blueprintClass != null)
                    {
                        base.m_blueprintClasses.Add(blueprintClass);
                    }
                }
                foreach (MyDefinitionId id in definition2.AcceptedOperatingItems)
                {
                    this.m_acceptedOperatingItems.Add(id);
                }
            }
        }
        public override void Init(MyComponentDefinitionBase definition)
        {
            base.Init(definition);

            Definition = definition as MyPhysicsComponentDefinitionBase;
            Debug.Assert(Definition != null);
            if (Definition != null)
            {
                Flags = Definition.RigidBodyFlags;

                if (Definition.LinearDamping != null)
                    LinearDamping = Definition.LinearDamping.Value;

                if (Definition.AngularDamping != null)
                    AngularDamping = Definition.AngularDamping.Value;
            }
        }
Пример #15
0
 public override void Init(MyComponentDefinitionBase definition)
 {
     base.Init(definition);
     this.m_definition = definition as MyUseObjectsComponentDefinition;
 }
Пример #16
0
        private static MyEntity SpawnBagAround(MyEntity itemOwner, MyContainerDefinition bagDefinition, int sideCheckCount = 3, int frontCheckCount = 2, int upCheckCount = 5, float stepSize = 1f)
        {
            MatrixD  xd;
            Vector3D?nullable      = null;
            MyModel  modelOnlyData = null;

            foreach (MyContainerDefinition.DefaultComponent component in bagDefinition.DefaultComponents)
            {
                if (typeof(MyObjectBuilder_ModelComponent).IsAssignableFrom((System.Type)component.BuilderType))
                {
                    MyComponentDefinitionBase componentDefinition = null;
                    MyStringHash subtypeId = bagDefinition.Id.SubtypeId;
                    if (component.SubtypeId != null)
                    {
                        subtypeId = component.SubtypeId.Value;
                    }
                    if (MyComponentContainerExtension.TryGetComponentDefinition(component.BuilderType, subtypeId, out componentDefinition))
                    {
                        MyModelComponentDefinition definition = componentDefinition as MyModelComponentDefinition;
                        if (definition != null)
                        {
                            modelOnlyData = MyModels.GetModelOnlyData(definition.Model);
                        }
                    }
                    break;
                }
            }
            if (modelOnlyData == null)
            {
                return(null);
            }
            float   radius = modelOnlyData.BoundingBox.HalfExtents.Max();
            HkShape shape  = (HkShape) new HkSphereShape(radius);

            try
            {
                Vector3  vector3;
                Vector3  vector5;
                Vector3  vector6;
                int      num4;
                Vector3D vectord3;
                int      num5;
                Vector3D translation = itemOwner.PositionComp.WorldMatrix.Translation;
                float    num2        = radius * stepSize;
                Vector3  up          = -MyGravityProviderSystem.CalculateNaturalGravityInPoint(itemOwner.PositionComp.WorldMatrix.Translation);
                if (up == Vector3.Zero)
                {
                    up = Vector3.Up;
                }
                else
                {
                    up.Normalize();
                }
                up.CalculatePerpendicularVector(out vector3);
                Vector3 vector4 = Vector3.Cross(vector3, up);
                vector4.Normalize();
                Quaternion identity     = Quaternion.Identity;
                Vector3[]  vectorArray  = new Vector3[] { vector3, vector4, -vector3, -vector4 };
                Vector3[]  vectorArray2 = new Vector3[] { vector4, -vector3, -vector4, vector3 };
                int        index        = 0;
                goto TR_0026;
TR_000D:
                if (nullable == null)
                {
                    MyOrientedBoundingBoxD xd3     = new MyOrientedBoundingBoxD(itemOwner.PositionComp.LocalAABB, itemOwner.PositionComp.WorldMatrix);
                    Vector3D[]             corners = new Vector3D[8];
                    xd3.GetCorners(corners, 0);
                    float      minValue      = float.MinValue;
                    Vector3D[] vectordArray2 = corners;
                    int        num8          = 0;
                    while (true)
                    {
                        if (num8 >= vectordArray2.Length)
                        {
                            nullable = new Vector3D?(itemOwner.PositionComp.WorldMatrix.Translation);
                            if (minValue > 0f)
                            {
                                nullable = new Vector3D?(xd3.Center + (minValue * up));
                            }
                            break;
                        }
                        float num9 = Vector3.Dot((Vector3)(vectordArray2[num8] - xd3.Center), up);
                        minValue = Math.Max(minValue, num9);
                        num8++;
                    }
                }
                goto TR_0003;
TR_000E:
                index++;
                goto TR_0026;
TR_000F:
                num4++;
                goto TR_0022;
TR_0010:
                num5++;
TR_001E:
                while (true)
                {
                    if (num5 >= sideCheckCount)
                    {
                        goto TR_000F;
                    }
                    else if (nullable == null)
                    {
                        for (int i = 0; (i < upCheckCount) && (nullable == null); i++)
                        {
                            Vector3D pos = (vectord3 + ((num5 * num2) * vector6)) + ((i * num2) * up);
                            if (MyEntities.IsInsideWorld(pos) && !MyEntities.IsShapePenetrating(shape, ref pos, ref identity, 15))
                            {
                                BoundingSphereD sphere = new BoundingSphereD(pos, (double)radius);
                                if (MySession.Static.VoxelMaps.GetOverlappingWithSphere(ref sphere) == null)
                                {
                                    nullable = new Vector3D?(pos);
                                    break;
                                }
                            }
                        }
                    }
                    else
                    {
                        goto TR_000F;
                    }
                    break;
                }
                goto TR_0010;
TR_0022:
                while (true)
                {
                    if (num4 >= frontCheckCount)
                    {
                        goto TR_000E;
                    }
                    else if (nullable == null)
                    {
                        vectord3 = (((translation + (0.25f * vector5)) + (radius * vector5)) + ((num4 * num2) * vector5)) - (((0.5f * (sideCheckCount - 1)) * num2) * vector6);
                        num5     = 0;
                    }
                    else
                    {
                        goto TR_000E;
                    }
                    break;
                }
                goto TR_001E;
TR_0026:
                while (true)
                {
                    if (index >= vectorArray.Length)
                    {
                        goto TR_000D;
                    }
                    else if (nullable == null)
                    {
                        vector5 = vectorArray[index];
                        vector6 = vectorArray2[index];
                        num4    = 0;
                    }
                    else
                    {
                        goto TR_000D;
                    }
                    break;
                }
                goto TR_0022;
            }
            finally
            {
                shape.RemoveReference();
            }
TR_0003:
            xd             = itemOwner.PositionComp.WorldMatrix;
            xd.Translation = nullable.Value;
            MyEntity entity = MyEntities.CreateFromComponentContainerDefinitionAndAdd(bagDefinition.Id, false, true);

            if (entity == null)
            {
                return(null);
            }
            entity.PositionComp.SetWorldMatrix(xd, null, false, true, true, false, false, false);
            entity.Physics.LinearVelocity  = Vector3.Zero;
            entity.Physics.AngularVelocity = Vector3.Zero;
            return(entity);
        }
        /// <summary>
        /// Tries to retrieve entity definition of the entity owning this container, check if the definition has some DefaultComponents,
        /// tries to retrieve these components definitions, create these components instances and add them
        ///
        /// TODO: This should be ideally a behavior of the MyEntityComponentContainer when it is initialized (deserialized).. or by the factory, for now, this is an extension method
        /// </summary>
        public static void InitComponents(this MyComponentContainer container, MyObjectBuilderType type, MyStringHash subtypeName, MyObjectBuilder_ComponentContainer builder)
        {
            if (MyDefinitionManager.Static != null)
            {
                MyContainerDefinition definition = null;

                bool IsFirstInit = builder == null;

                if (TryGetContainerDefinition(type, subtypeName, out definition))
                {
                    container.Init(definition);

                    if (definition.DefaultComponents != null)
                    {
                        foreach (var component in definition.DefaultComponents)
                        {
                            MyComponentDefinitionBase     componentDefinition = null;
                            MyObjectBuilder_ComponentBase componentBuilder    = FindComponentBuilder(component, builder);
                            bool            IsComponentSerialized             = componentBuilder != null;
                            Type            componentType     = null;
                            MyComponentBase componentInstance = null;

                            var componentSubtype = subtypeName;
                            if (component.SubtypeId.HasValue)
                            {
                                componentSubtype = component.SubtypeId.Value;
                            }

                            // Create component instance
                            if (TryGetComponentDefinition(component.BuilderType, componentSubtype, out componentDefinition))
                            {
                                componentInstance = MyComponentFactory.CreateInstanceByTypeId(componentDefinition.Id.TypeId);
                                componentInstance.Init(componentDefinition);
                            }
                            else if (component.IsValid())
                            {
                                if (!component.BuilderType.IsNull)
                                {
                                    componentInstance = MyComponentFactory.CreateInstanceByTypeId(component.BuilderType);
                                }
                                else
                                {
                                    componentInstance = MyComponentFactory.CreateInstanceByType(component.InstanceType);
                                }
                            }

                            // Check component type from attributes.
                            if (componentInstance != null)
                            {
                                var componentTypeFromAttr = MyComponentTypeFactory.GetComponentType(componentInstance.GetType());
                                if (componentTypeFromAttr != null)
                                {
                                    componentType = componentTypeFromAttr;
                                }
                                else
                                {
                                    if (componentDefinition != null)
                                    {
                                        System.Diagnostics.Debug.Fail("Unknown component type - component type attribute not specified for component class: " + componentInstance.GetType());
                                    }
                                }
                            }

                            //TODO: this should be avoided! Component type MUST be set via MyComponentType attribute.
                            if (componentType == null && componentInstance != null)
                            {
                                componentType = componentInstance.GetType();
                            }

                            // If everything passed, go on..
                            if (componentInstance != null && componentType != null)
                            {
                                bool componentShouldBeAdded = IsFirstInit || IsComponentSerialized || component.ForceCreate;

                                if (componentShouldBeAdded)
                                {
                                    if (componentBuilder != null)
                                    {
                                        componentInstance.Deserialize(componentBuilder);
                                    }

                                    // Add only fully initialized component..
                                    container.Add(componentType, componentInstance);
                                }
                            }
                            else
                            {
                                System.Diagnostics.Debug.Fail("Component instance wasn't created or it's base type couldn't been determined!");
                            }
                        }
                    }
                    else
                    {
                        System.Diagnostics.Debug.Fail("Got definition for container, but DefaultComponents is null!");
                    }
                }

                // This may rewrite already once deserialized data, but will also add missing components in definition
                container.Deserialize(builder);
            }
            else
            {
                System.Diagnostics.Debug.Fail("Trying to init enabled components on entity, but definition manager is null");
            }
        }
        public static bool TryGetComponentDefinition(MyObjectBuilderType type, MyStringHash subtypeName, out MyComponentDefinitionBase componentDefinition)
        {
            componentDefinition = null;

            if (MyDefinitionManager.Static != null)
            {
                MyDefinitionId subtypeDefinition = new MyDefinitionId(type, subtypeName);
                if (MyDefinitionManager.Static.TryGetEntityComponentDefinition(subtypeDefinition, out componentDefinition))
                {
                    return(true);
                }

                // Fallback to EntityBase type
                if (subtypeName != MyStringHash.NullOrEmpty)
                {
                    MyDefinitionId subtypeDefinition_Fallback = new MyDefinitionId(typeof(MyObjectBuilder_EntityBase), subtypeName);
                    if (MyDefinitionManager.Static.TryGetEntityComponentDefinition(subtypeDefinition_Fallback, out componentDefinition))
                    {
                        return(true);
                    }
                }

                MyDefinitionId defaultDefinition = new MyDefinitionId(type);
                if (MyDefinitionManager.Static.TryGetEntityComponentDefinition(defaultDefinition, out componentDefinition))
                {
                    return(true);
                }
            }

            return(false);
        }
Пример #19
0
        public static bool TryGetComponentDefinition(MyObjectBuilderType type, MyStringHash subtypeName, out MyComponentDefinitionBase componentDefinition)
        {
            componentDefinition = null;
            if (MyDefinitionManager.Static == null)
            {
                return(false);
            }
            MyDefinitionId componentId = new MyDefinitionId(type, subtypeName);

            if (MyDefinitionManager.Static.TryGetEntityComponentDefinition(componentId, out componentDefinition))
            {
                return(true);
            }
            if (subtypeName != MyStringHash.NullOrEmpty)
            {
                MyDefinitionId id3 = new MyDefinitionId(typeof(MyObjectBuilder_EntityBase), subtypeName);
                if (MyDefinitionManager.Static.TryGetEntityComponentDefinition(id3, out componentDefinition))
                {
                    return(true);
                }
            }
            MyDefinitionId id2 = new MyDefinitionId(type);

            return(MyDefinitionManager.Static.TryGetEntityComponentDefinition(id2, out componentDefinition));
        }
Пример #20
0
 public static void InitComponents(this MyComponentContainer container, MyObjectBuilderType type, MyStringHash subtypeName, MyObjectBuilder_ComponentContainer builder)
 {
     if (MyDefinitionManager.Static != null)
     {
         MyContainerDefinition definition = null;
         bool flag = ReferenceEquals(builder, null);
         if (TryGetContainerDefinition(type, subtypeName, out definition))
         {
             container.Init(definition);
             if (definition.DefaultComponents != null)
             {
                 foreach (MyContainerDefinition.DefaultComponent component in definition.DefaultComponents)
                 {
                     MyComponentDefinitionBase     componentDefinition = null;
                     MyObjectBuilder_ComponentBase base3 = FindComponentBuilder(component, builder);
                     bool            flag2 = base3 != null;
                     Type            type2 = null;
                     MyComponentBase base4 = null;
                     MyStringHash    hash  = subtypeName;
                     if (component.SubtypeId != null)
                     {
                         hash = component.SubtypeId.Value;
                     }
                     if (TryGetComponentDefinition(component.BuilderType, hash, out componentDefinition))
                     {
                         base4 = MyComponentFactory.CreateInstanceByTypeId(componentDefinition.Id.TypeId);
                         base4.Init(componentDefinition);
                     }
                     else if (component.IsValid())
                     {
                         base4 = component.BuilderType.IsNull ? MyComponentFactory.CreateInstanceByType(component.InstanceType) : MyComponentFactory.CreateInstanceByTypeId(component.BuilderType);
                     }
                     if (base4 != null)
                     {
                         Type componentType = MyComponentTypeFactory.GetComponentType(base4.GetType());
                         if (componentType != null)
                         {
                             type2 = componentType;
                         }
                         else
                         {
                             MyComponentDefinitionBase base1 = componentDefinition;
                         }
                     }
                     if ((type2 == null) && (base4 != null))
                     {
                         type2 = base4.GetType();
                     }
                     if (((base4 != null) && (type2 != null)) && ((flag | flag2) || component.ForceCreate))
                     {
                         if (base3 != null)
                         {
                             base4.Deserialize(base3);
                         }
                         container.Add(type2, base4);
                     }
                 }
             }
         }
         container.Deserialize(builder);
     }
 }
Пример #21
0
 public virtual void Init(MyComponentDefinitionBase definition)
 {
 }
Пример #22
0
 public override void Init(MyComponentDefinitionBase definition)
 {
     MyLog.Default.WriteLine($"SkunkWorks: {definition?.Id}");
     base.Init(definition);
 }
Пример #23
0
 public sealed override void Init(MyComponentDefinitionBase definition)
 {
     base.Init(definition);
 }
Пример #24
0
        /// <summary>
        /// Spawns bag around position given by "baseTransform", checks all 4 directions around - forwards (forward, right, backward, left) and on each such direction moves test sphere
        /// in 3 directions forward (frontChecks), sides (perpendicular to forward direction - rights) and up. If spawn position is not found then position above "worldAabbTopPosition"
        /// is selected.
        /// </summary>
        private static MyEntity SpawnBagAround(MyEntity itemOwner, MyContainerDefinition bagDefinition,
                                               int sideCheckCount = 3, int frontCheckCount = 2, int upCheckCount = 5, float stepSize = 1f)
        {
            Debug.Assert(Sandbox.Game.Multiplayer.Sync.IsServer);

            Vector3D?finalPos = null;

            // Model sphere
            MyModel bagModel = null;

            foreach (var componentDef in bagDefinition.DefaultComponents)
            {
                if (typeof(MyObjectBuilder_ModelComponent).IsAssignableFrom(componentDef.BuilderType))
                {
                    MyComponentDefinitionBase componentDefinition = null;
                    var componentSubtype = bagDefinition.Id.SubtypeId;
                    if (componentDef.SubtypeId.HasValue)
                    {
                        componentSubtype = componentDef.SubtypeId.Value;
                    }

                    if (MyComponentContainerExtension.TryGetComponentDefinition(componentDef.BuilderType, componentSubtype, out componentDefinition))
                    {
                        var modelComponentDef = componentDefinition as MyModelComponentDefinition;
                        Debug.Assert(modelComponentDef != null);
                        if (modelComponentDef != null)
                        {
                            bagModel = MyModels.GetModelOnlyData(modelComponentDef.Model);
                        }
                    }

                    break;
                }
            }

            Debug.Assert(bagModel != null);
            if (bagModel == null)
            {
                return(null);
            }

            float   bagBoxRadius = bagModel.BoundingBox.HalfExtents.Max();
            HkShape sphere       = new HkSphereShape(bagBoxRadius);

            try
            {
                Vector3D basePos = itemOwner.PositionComp.WorldMatrix.Translation;
                float    step    = bagBoxRadius * stepSize;

                // Calculate right, up and forward vectors from gravity
                Vector3 upDir = -MyGravityProviderSystem.CalculateNaturalGravityInPoint(itemOwner.PositionComp.WorldMatrix.Translation);
                if (upDir == Vector3.Zero)
                {
                    upDir = Vector3.Up;
                }
                else
                {
                    upDir.Normalize();
                }

                Vector3 forwardDir;
                upDir.CalculatePerpendicularVector(out forwardDir);

                Vector3 rightDir = Vector3.Cross(forwardDir, upDir);
                rightDir.Normalize();

                Vector3D   currentPos;
                Quaternion rot = Quaternion.Identity;

                Vector3[] forwards = new Vector3[]
                {
                    forwardDir,
                    rightDir,
                    -forwardDir,
                    -rightDir
                };

                Vector3[] rights = new Vector3[]
                {
                    rightDir,
                    -forwardDir,
                    -rightDir,
                    forwardDir
                };

                // All sides
                for (int i = 0; i < forwards.Length && finalPos == null; ++i)
                {
                    var forward = forwards[i];
                    var right   = rights[i];

                    // Move forward
                    for (int frontMove = 0; frontMove < frontCheckCount && finalPos == null; ++frontMove)
                    {
                        Vector3D sidePosBase = basePos + 0.25f * forward + bagBoxRadius * forward + frontMove * step * forward - 0.5f * (sideCheckCount - 1) * step * right;

                        // Move perp to forward
                        for (int sideMove = 0; sideMove < sideCheckCount && finalPos == null; ++sideMove)
                        {
                            // Move up
                            for (int upMove = 0; upMove < upCheckCount && finalPos == null; ++upMove)
                            {
                                currentPos = sidePosBase + sideMove * step * right + upMove * step * upDir;

                                if (MyEntities.IsInsideWorld(currentPos) && !MyEntities.IsShapePenetrating(sphere, ref currentPos, ref rot))
                                {
                                    BoundingSphereD boundingSphere     = new BoundingSphereD(currentPos, bagBoxRadius);
                                    MyVoxelBase     overlappedVoxelmap = MySession.Static.VoxelMaps.GetOverlappingWithSphere(ref boundingSphere);

                                    if (overlappedVoxelmap == null)
                                    {
                                        finalPos = currentPos;
                                        break;
                                    }
                                }
                            }
                        }
                    }
                }

                // If not found position then select position above aabb's top.
                if (finalPos == null)
                {
                    MyOrientedBoundingBoxD obb     = new MyOrientedBoundingBoxD((BoundingBoxD)itemOwner.PositionComp.LocalAABB, itemOwner.PositionComp.WorldMatrix);
                    Vector3D[]             corners = new Vector3D[8];
                    obb.GetCorners(corners, 0);
                    float dotUp = float.MinValue;
                    foreach (var corner in corners)
                    {
                        var localDot = Vector3.Dot(corner - obb.Center, upDir);
                        dotUp = Math.Max(dotUp, localDot);
                    }

                    finalPos = itemOwner.PositionComp.WorldMatrix.Translation;
                    Debug.Assert(dotUp > 0);
                    if (dotUp > 0)
                    {
                        finalPos = obb.Center + dotUp * upDir;
                    }
                }
            }
            finally
            {
                sphere.RemoveReference();
            }

            Debug.Assert(finalPos != null);

            MatrixD transform = itemOwner.PositionComp.WorldMatrix;

            transform.Translation = finalPos.Value;

            MyEntity bagEntity = MyEntities.CreateFromComponentContainerDefinitionAndAdd(bagDefinition.Id);

            if (bagEntity == null)
            {
                return(null);
            }

            bagEntity.PositionComp.SetWorldMatrix(transform);

            bagEntity.Physics.LinearVelocity  = Vector3.Zero;
            bagEntity.Physics.AngularVelocity = Vector3.Zero;

            return(bagEntity);
        }