public override void LoadDetectorsFromModel() { m_detectors.Clear(); m_detectorInteractiveObjects.Clear(); if (m_detectorPhysics != null) { m_detectorPhysics.Close(); } var renderComponent = Container.Get <MyRenderComponentBase>(); if (renderComponent.GetModel() != null) { foreach (var dummy in renderComponent.GetModel().Dummies) { var dummyLowerCaseKey = dummy.Key.ToLower(); const string DETECTOR_PREFIX = "detector_"; if (dummyLowerCaseKey.StartsWith(DETECTOR_PREFIX) && dummyLowerCaseKey.Length > DETECTOR_PREFIX.Length) { String[] parts = dummyLowerCaseKey.Split('_'); if (parts.Length < 2) { continue; } var dummyData = dummy.Value; AddDetector(parts[1], dummyLowerCaseKey, dummyData); } } } if (m_detectorInteractiveObjects.Count > 0) { RecreatePhysics(); } /* * var inventoryBlock = this as IMyInventoryOwner; * if (refreshNetworks && inventoryBlock != null) * { * CubeGrid.ConveyorSystem.Remove(inventoryBlock); * CubeGrid.ConveyorSystem.Add(inventoryBlock); * }*/ }
private void DisposeSubpartsPhysics() { if (m_subpartsConstraint != null) { DisposeSubpartsConstraint(); } if (m_subpart1 != null && m_subpartPhysics != null) { m_subpartPhysics.Enabled = false; m_subpartPhysics.Close(); m_subpartPhysics = null; } }
private void DisposeSubpartsPhysics() { if (m_subpartsConstraint != null) { DisposeSubpartsConstraint(); } if (m_subpart1 != null && m_subpartPhysics != null) { CubeGrid.OnHavokSystemIDChanged -= CubeGrid_OnHavokSystemIDChanged; m_subpartPhysics.Enabled = false; m_subpartPhysics.Close(); m_subpartPhysics = null; } }
private void InitInternal() { // TODO: This will be fixed and made much more simple once ore models are done // https://app.asana.com/0/6594565324126/10473934569658 var itemDefinition = MyDefinitionManager.Static.GetPhysicalItemDefinition(Item.Content); m_health = itemDefinition.Health; // Setting voxel material (if applicable) VoxelMaterial = null; if (itemDefinition.VoxelMaterial != MyStringHash.NullOrEmpty) { VoxelMaterial = MyDefinitionManager.Static.GetVoxelMaterialDefinition(itemDefinition.VoxelMaterial.String); } else if (Item.Content is MyObjectBuilder_Ore) { string oreSubTypeId = itemDefinition.Id.SubtypeName; string materialName = (Item.Content as MyObjectBuilder_Ore).GetMaterialName(); bool hasMaterialName = (Item.Content as MyObjectBuilder_Ore).HasMaterialName(); foreach (var mat in MyDefinitionManager.Static.GetVoxelMaterialDefinitions()) { if ((hasMaterialName && materialName == mat.Id.SubtypeName) || (hasMaterialName == false && oreSubTypeId == mat.MinedOre)) { VoxelMaterial = mat; break; } } } // Setting the item's model string model = itemDefinition.Model; if (itemDefinition.HasModelVariants) { int modelNum = itemDefinition.Models.Length; Debug.Assert(m_modelVariant >= 0 && m_modelVariant < modelNum, "Model variant overflow. This can happen if model variants changed"); m_modelVariant = m_modelVariant % modelNum; model = itemDefinition.Models[m_modelVariant]; } else if (Item.Content is MyObjectBuilder_Ore && VoxelMaterial != null) { // Only ores without found voxel material use the defined model (otherwise, the scrap metal does not work) model = MyDebris.GetRandomDebrisVoxel(); } // Setting the scale float scale = this.Item.Scale; if (Item.Content is MyObjectBuilder_Ore) { scale *= (float)Math.Pow((float)Item.Amount * itemDefinition.Volume / MyDebris.VoxelDebrisModelVolume, 0.333f); } else { scale *= (float)Math.Pow(itemDefinition.Volume / itemDefinition.ModelVolume, 0.333f); } if (scale < 0.05f) { Close(); } else if (scale < 0.15f) { scale = 0.15f; } FormatDisplayName(m_displayedText, Item); Debug.Assert(model != null, "Floating object model is null"); Init(m_displayedText, model, null, null, null); PositionComp.Scale = scale; // Must be set after init var massProperties = new HkMassProperties(); var mass = MyPerGameSettings.Destruction ? MyDestructionHelper.MassToHavok(itemDefinition.Mass) : itemDefinition.Mass; mass = mass * (float)Item.Amount; HkShape shape = GetPhysicsShape(mass, scale, out massProperties); var scaleMatrix = Matrix.CreateScale(scale); if (Physics != null) { Physics.Close(); } Physics = new MyPhysicsBody(this, RigidBodyFlag.RBF_DEBRIS); int layer = mass > MyPerGameSettings.MinimumLargeShipCollidableMass ? MyPhysics.CollisionLayers.FloatingObjectCollisionLayer : MyPhysics.CollisionLayers.LightFloatingObjectCollisionLayer; if (VoxelMaterial != null || (shape.IsConvex && scale != 1f)) { HkConvexTransformShape transform = new HkConvexTransformShape((HkConvexShape)shape, ref scaleMatrix, HkReferencePolicy.None); Physics.CreateFromCollisionObject(transform, Vector3.Zero, MatrixD.Identity, massProperties, layer); Physics.Enabled = true; transform.Base.RemoveReference(); } else { Physics.CreateFromCollisionObject(shape, Vector3.Zero, MatrixD.Identity, massProperties, layer); Physics.Enabled = true; } Physics.MaterialType = this.EvaluatePhysicsMaterial(itemDefinition.PhysicalMaterial); Physics.PlayCollisionCueEnabled = true; Physics.RigidBody.ContactSoundCallbackEnabled = true; m_easeCollisionForce = new HkEasePenetrationAction(Physics.RigidBody, 2f); m_massChangeForCollisions = 0.010f; NeedsUpdate = MyEntityUpdateEnum.EACH_FRAME; }
/// <summary> /// Every object must have this method, but not every phys object must necessarily have something to cleanup /// <remarks> /// </remarks> /// </summary> public void Delete() { Close(); BeforeDelete(); GameLogic.Close(); //doesnt work in parallel update //Debug.Assert(MySandboxGame.IsMainThread(), "Entity.Close() called not from Main Thread!"); Debug.Assert(MyEntities.UpdateInProgress == false, "Do not close entities directly in Update*, use MarkForClose() instead"); Debug.Assert(MyEntities.CloseAllowed == true, "Use MarkForClose()"); Debug.Assert(!Closed, "Close() called twice!"); //Children has to be cleared after close notification is send while (Hierarchy.Children.Count > 0) { MyHierarchyComponentBase compToRemove = Hierarchy.Children[Hierarchy.Children.Count - 1]; Debug.Assert(compToRemove.Parent != null, "Entity has no parent but is part of children collection"); compToRemove.Entity.Delete(); Hierarchy.Children.Remove(compToRemove); } //OnPositionChanged = null; CallAndClearOnClosing(); MyDecals.RemoveModelDecals(this); MyEntities.RemoveName(this); MyEntities.RemoveFromClosedEntities(this); if (m_physics != null) { m_physics.Close(); Physics = null; RaisePhysicsChanged(); } MyEntities.UnregisterForUpdate(this, true); if (Parent == null) //only root objects are in entities list { MyEntities.Remove(this); } else { Parent.Hierarchy.Children.Remove(this.Hierarchy); //remove children first if (Parent.InScene) { OnRemovedFromScene(this); } MyEntities.RaiseEntityRemove(this); } if (this.EntityId != 0) { MyEntityIdentifier.RemoveEntity(this.EntityId); } //this.EntityId = 0; Debug.Assert(this.Hierarchy.Children.Count == 0); CallAndClearOnClose(); Components.Clear(); Closed = true; }