public void SetSceneReady(string sceneId)
 {
     // Start processing SYSTEM queue
     if (messagingControllers.ContainsKey(sceneId))
     {
         // Start processing SYSTEM queue
         MessagingController sceneMessagingController = messagingControllers[sceneId];
         sceneMessagingController.StartBus(MessagingBusType.SYSTEM);
         sceneMessagingController.StartBus(MessagingBusType.UI);
         sceneMessagingController.StopBus(MessagingBusType.INIT);
     }
 }
        public void Initialize(IMessageProcessHandler messageHandler)
        {
            messagingControllers[GLOBAL_MESSAGING_CONTROLLER] = new MessagingController(messageHandler, GLOBAL_MESSAGING_CONTROLLER);

            if (!string.IsNullOrEmpty(GLOBAL_MESSAGING_CONTROLLER))
            {
                messagingControllers.TryGetValue(GLOBAL_MESSAGING_CONTROLLER, out globalController);
            }

            Environment.i.world.sceneController.OnSortScenes += MarkBusesDirty;

            if (mainCoroutine == null)
            {
                mainCoroutine = CoroutineStarter.Start(ProcessMessages());
            }
        }
        public void AddController(IMessageProcessHandler messageHandler, string sceneId, bool isGlobal = false)
        {
            if (!messagingControllers.ContainsKey(sceneId))
            {
                messagingControllers[sceneId] = new MessagingController(messageHandler, sceneId);
            }

            if (isGlobal)
            {
                globalSceneId = sceneId;
            }

            if (!string.IsNullOrEmpty(globalSceneId))
            {
                messagingControllers.TryGetValue(globalSceneId, out uiSceneController);
            }

            PopulateBusesToBeProcessed();
        }
        private void RefreshControllerEnabledState(MessagingController controller)
        {
            if (controller == null || !controller.enabled)
            {
                return;
            }

            if (controller.uiBus.pendingMessagesCount != 0)
            {
                return;
            }
            if (controller.initBus.pendingMessagesCount != 0)
            {
                return;
            }
            if (controller.systemBus.pendingMessagesCount != 0)
            {
                return;
            }

            controller.enabled = false;
        }
        public void PopulateBusesToBeProcessed()
        {
            IWorldState        worldState             = Environment.i.world.state;
            string             currentSceneId         = worldState.currentSceneId;
            List <ParcelScene> scenesSortedByDistance = worldState.scenesSortedByDistance;

            int count = scenesSortedByDistance.Count; // we need to retrieve list count everytime because it

            // may change after a yield return

            sortedControllers.Clear();

            if (!string.IsNullOrEmpty(currentSceneId) && messagingControllers.ContainsKey(currentSceneId))
            {
                currentSceneController = messagingControllers[currentSceneId];
            }

            for (int i = 0; i < count; i++)
            {
                string controllerId = scenesSortedByDistance[i].sceneData.id;

                if (controllerId != currentSceneId)
                {
                    if (!messagingControllers.ContainsKey(controllerId))
                    {
                        continue;
                    }

                    sortedControllers.Add(messagingControllers[controllerId]);
                }
            }

            sortedControllersCount = sortedControllers.Count;

            bool uiSceneControllerActive      = uiSceneController != null && uiSceneController.enabled;
            bool globalControllerActive       = globalController != null && globalController.enabled;
            bool currentSceneControllerActive = currentSceneController != null && currentSceneController.enabled;

            bool atLeastOneControllerShouldBeProcessed = uiSceneControllerActive || globalControllerActive || currentSceneControllerActive || sortedControllersCount > 0;

            if (!atLeastOneControllerShouldBeProcessed)
            {
                return;
            }

            busesToProcess.Clear();
            //-------------------------------------------------------------------------------------------
            // Global scene UI
            if (uiSceneControllerActive)
            {
                busesToProcess.Add(uiSceneController.uiBus);
                busesToProcess.Add(uiSceneController.initBus);
            }

            if (globalControllerActive)
            {
                busesToProcess.Add(globalController.initBus);
            }

            if (currentSceneControllerActive)
            {
                busesToProcess.Add(currentSceneController.initBus);
                busesToProcess.Add(currentSceneController.uiBus);
                busesToProcess.Add(currentSceneController.systemBus);
            }

            for (int i = 0; i < sortedControllersCount; ++i)
            {
                MessagingController msgController = sortedControllers[i];

                busesToProcess.Add(msgController.initBus);
                busesToProcess.Add(msgController.uiBus);
            }

            for (int i = 0; i < sortedControllersCount; ++i)
            {
                MessagingController msgController = sortedControllers[i];
                busesToProcess.Add(msgController.systemBus);
            }

            if (uiSceneControllerActive)
            {
                busesToProcess.Add(uiSceneController.systemBus);
            }

            busesToProcessCount = busesToProcess.Count;
        }
 void DisposeController(MessagingController controller)
 {
     controller.Stop();
     controller.Dispose();
 }