private void Remove(ModSessionComponent component)
        {
            var myType = component.GetType();
            List <RuntimeSessionComponent> list;

            if (m_componentDictionary.TryGetValue(myType, out list))
            {
                for (var i = 0; i < list.Count; i++)
                {
                    if (list[i].Component != component)
                    {
                        continue;
                    }
                    if (list[i].Dependents.Count > 0)
                    {
                        FallbackLogger.Log(MyLogSeverity.Critical, "Unable to remove {0} because it still has {1} dependents", component.GetType(), list[i].Dependents.Count);
                        using (FallbackLogger.IndentUsing())
                            foreach (var dep in list[i].Dependents)
                            {
                                FallbackLogger.Log(MyLogSeverity.Critical, "Dependent: {0}", dep.Component.GetType());
                            }
                        throw new ArgumentException("Can't remove " + component.GetType() + " because it still has dependents");
                    }
                    foreach (var dep in list[i].Dependencies)
                    {
                        dep.Dependents.Remove(list[i]);
                    }
                    list.RemoveAtFast(i);
                    break;
                }
                if (list.Count == 0)
                {
                    m_componentDictionary.Remove(myType);
                }
            }
            foreach (var dep in component.SuppliedComponents)
            {
                m_dependencySatisfyingComponents.Remove(dep);
            }
            for (var i = 0; i < m_orderedComponentList.Count; i++)
            {
                if (m_orderedComponentList[i].Component == component)
                {
                    m_orderedComponentList.RemoveAt(i);
                    break;
                }
            }
            component.Detached();
            ComponentDetached?.Invoke(component);
        }
 public void Detach()
 {
     ApplyComponentChanges();
     if (m_attached)
     {
         for (var i = m_orderedComponentList.Count - 1; i >= 0; i--)
         {
             m_orderedComponentList[i].Component.Detached();
             ComponentDetached?.Invoke(m_orderedComponentList[i].Component);
         }
     }
     m_attached = false;
     m_orderedComponentList.Clear();
 }
 internal void DetachComponent(EntityComponent component)
 {
     _components.Remove(component);
     (component as IDisposable)?.Dispose();
     ComponentDetached?.Invoke(this, component);
 }