private void UpdateGroupComponentProxies(ref Context updateContext)
 {
     for (int i = 0; i < _groupComponentProxiesToDestroy.Count; i++)
     {
         GroupComponentProxy groupComponentProxy = _groupComponentProxiesToDestroy[i];
         if (!groupComponentProxy._groupComponent.IsComponentActive())
         {
             if (groupComponentProxy._groupComponent.ParentComponent != null)
             {
                 groupComponentProxy._groupComponent.ParentComponent.RemoveComponent(groupComponentProxy._groupComponent);
             }
             else
             {
                 _components.Remove(groupComponentProxy._groupComponent);
             }
             _groupComponentProxiesToDestroy.Remove(groupComponentProxy);
             UnityEngine.Object.DestroyObject(groupComponentProxy.gameObject);
         }
     }
 }
    public bool RegisterGroupComponent(GroupComponent groupComponent, string targetGroupComponentPath, bool createProxy = true)
    {
        if (!_allowExternalGroupComponents)
        {
            DebugLog.Print("External GroupComponent registration is disabled");
            return(false);
        }
        bool result = false;

        Fabric.Component componentByName = GetComponentByName(targetGroupComponentPath);
        if (groupComponent != null)
        {
            groupComponent.Initialise(componentByName, isComponentInstance: false);
            if (componentByName != null)
            {
                componentByName.AddComponent(groupComponent);
            }
            else
            {
                _components.Add(groupComponent);
            }
            if (createProxy)
            {
                GameObject gameObject = new GameObject();
                gameObject.hideFlags = HideFlags.DontSave;
                GroupComponentProxy groupComponentProxy = gameObject.AddComponent <GroupComponentProxy>();
                groupComponentProxy._groupComponent = groupComponent;
                groupComponentProxy.name            = groupComponent.name + "_Proxy";
                if (componentByName != null)
                {
                    groupComponentProxy.transform.parent = componentByName.transform;
                }
                else
                {
                    groupComponentProxy.transform.parent = base.gameObject.transform;
                }
                _groupComponentProxies.Add(groupComponentProxy);
            }
            else if (componentByName != null)
            {
                groupComponent.transform.parent = componentByName.transform;
            }
            else
            {
                groupComponent.transform.parent = base.gameObject.transform;
            }
            if (componentByName != null)
            {
                VolumeMeter component = componentByName.GetComponent <VolumeMeter>();
                if (component != null)
                {
                    component.CollectAudioComponents();
                }
            }
            DebugLog.Print("GroupComponent [" + groupComponent.name + "] registred succesfuly");
            result = true;
        }
        else
        {
            DebugLog.Print("GroupComponent [" + groupComponent.name + "] failed to register", DebugLevel.Error);
        }
        return(result);
    }
    public bool UnregisterGroupComponent(GroupComponent groupComponent, bool ignoreFadeOut = true)
    {
        if (!_allowExternalGroupComponents)
        {
            DebugLog.Print("External GroupComponent registration is disabled");
            return(false);
        }
        bool result = true;

        if (groupComponent != null)
        {
            if (!ignoreFadeOut)
            {
                for (int i = 0; i < _groupComponentProxies.Count; i++)
                {
                    GroupComponentProxy groupComponentProxy = _groupComponentProxies[i];
                    if (groupComponentProxy._groupComponent == groupComponent)
                    {
                        groupComponent.Stop();
                        GameObject gameObject = new GameObject();
                        groupComponentProxy._groupComponent = gameObject.AddComponent <GroupComponent>();
                        groupComponentProxy._groupComponent.transform.parent = groupComponentProxy.transform;
                        groupComponentProxy._groupComponent.name             = groupComponent.name;
                        groupComponentProxy._groupComponent.CopyPropertiesFrom(groupComponent);
                        if (groupComponent.ParentComponent != null)
                        {
                            groupComponent.ParentComponent.RemoveComponent(groupComponent);
                            groupComponent.ParentComponent.AddComponent(groupComponentProxy._groupComponent);
                        }
                        else
                        {
                            _components.Remove(groupComponent);
                            _components.Remove(groupComponentProxy._groupComponent);
                        }
                        Fabric.Component[] childComponents = groupComponent.GetChildComponents();
                        for (int j = 0; j < childComponents.Length; j++)
                        {
                            groupComponentProxy._groupComponent.AddComponent(childComponents[j]);
                            childComponents[j].transform.parent = groupComponentProxy._groupComponent.transform;
                            childComponents[j].ParentComponent  = groupComponentProxy._groupComponent;
                        }
                        _groupComponentProxies.Remove(groupComponentProxy);
                        _groupComponentProxiesToDestroy.Add(groupComponentProxy);
                        groupComponentProxy._groupComponent.SetComponentActive(groupComponent.IsComponentActive());
                        DebugLog.Print("GroupComponent [" + groupComponent.name + "] scheduled to be unregistered");
                    }
                }
            }
            else
            {
                if (groupComponent.ParentComponent != null)
                {
                    groupComponent.ParentComponent.RemoveComponent(groupComponent);
                }
                else
                {
                    _components.Remove(groupComponent);
                }
                for (int k = 0; k < _groupComponentProxies.Count; k++)
                {
                    GroupComponentProxy groupComponentProxy2 = _groupComponentProxies[k];
                    if (groupComponentProxy2 != null && groupComponentProxy2._groupComponent == groupComponent)
                    {
                        _groupComponentProxies.Remove(groupComponentProxy2);
                        UnityEngine.Object.DestroyImmediate(groupComponentProxy2.gameObject);
                        break;
                    }
                }
                DebugLog.Print("GroupComponent [" + groupComponent.name + "] unregistered succesfuly");
            }
            result = false;
        }
        else
        {
            DebugLog.Print("GroupComponent [" + groupComponent.name + "] failed to unregistred", DebugLevel.Error);
        }
        return(result);
    }
    public static void UpdateHierarchy(Fabric.Component component = null)
    {
        GameObject gameObject        = null;
        List <Fabric.Component> list = null;

        if (component == null && Instance != null)
        {
            gameObject = Instance.gameObject;
            list       = Instance._components;
        }
        else if (component != null)
        {
            gameObject = component.gameObject;
            list       = component.Components;
        }
        if (gameObject == null || list == null)
        {
            return;
        }
        for (int i = 0; i < gameObject.transform.childCount; i++)
        {
            Fabric.Component component2 = gameObject.transform.GetChild(i).GetComponent <Fabric.Component>();
            if (!(component2 != null) || component2.IsInstance)
            {
                continue;
            }
            GroupComponent groupComponent = component2 as GroupComponent;
            if (groupComponent != null && groupComponent._isRegisteredWithMainHierarchy)
            {
                groupComponent.UnregisterWithMainHierarchy();
            }
            bool flag = false;
            for (int j = 0; j < list.Count; j++)
            {
                if (list[j] == component2)
                {
                    flag = true;
                    break;
                }
            }
            if (!flag)
            {
                list.Add(component2);
                if (component != null)
                {
                    component.UpdateComponentsArray();
                }
                if (component2.ParentComponent != null)
                {
                    component2.ParentComponent.Initialise(component, isComponentInstance: false);
                }
                else
                {
                    component2.Initialise(component, isComponentInstance: false);
                }
                Instance.RefreshComponents();
            }
            else
            {
                UpdateHierarchy(component2);
            }
        }
        for (int k = 0; k < list.Count; k++)
        {
            bool flag2 = false;
            for (int l = 0; l < gameObject.transform.childCount; l++)
            {
                Fabric.Component    component3 = gameObject.transform.GetChild(l).GetComponent <Fabric.Component>();
                GroupComponentProxy component4 = gameObject.transform.GetChild(l).GetComponent <GroupComponentProxy>();
                if (component3 == list[k] || (component4 != null && component4._groupComponent == list[k]))
                {
                    flag2 = true;
                    break;
                }
            }
            if (!flag2)
            {
                Fabric.Component component5      = list[k];
                GroupComponent   groupComponent2 = component5 as GroupComponent;
                list.Remove(component5);
                if (component != null)
                {
                    component.UpdateComponentsArray();
                }
                if (component5.ParentComponent != null)
                {
                    component5.ParentComponent.Initialise(component, isComponentInstance: false);
                }
                if (groupComponent2 != null)
                {
                    groupComponent2.RegisterWithMainHierarchy();
                }
                Instance.RefreshComponents();
            }
        }
    }