/// <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; }
//public void CloseDetector() //{ // m_targetsDetector.Close(); //} public override void Close() { MyDecals.RemoveModelDecals(m_gun); base.Close(); }