Esempio n. 1
0
        public void LoadWorld(WorldProvider worldProvider, INetworkProvider networkProvider)
        {
            PlayingState playState = new PlayingState(this, GraphicsDevice, worldProvider, networkProvider);

            LoadingWorldState loadingScreen = new LoadingWorldState();

            GameStateManager.AddState("loading", loadingScreen);
            GameStateManager.SetActiveState("loading");

            worldProvider.Load(loadingScreen.UpdateProgress).ContinueWith(task =>
            {
                GameStateManager.RemoveState("play");
                GameStateManager.AddState("play", playState);

                if (networkProvider.IsConnected)
                {
                    GameStateManager.SetActiveState("play");
                }
                else
                {
                    GameStateManager.RemoveState("play");
                    worldProvider.Dispose();
                }

                GameStateManager.RemoveState("loading");
            });
        }
Esempio n. 2
0
        public override void HandleMcpeChangeDimension(McpeChangeDimension message)
        {
            base.HandleMcpeChangeDimension(message);
            if (BaseClient.WorldProvider is BedrockWorldProvider provider)
            {
                LoadingWorldState loadingWorldState = new LoadingWorldState();
                AlexInstance.GameStateManager.SetActiveState(loadingWorldState, true);
                loadingWorldState.UpdateProgress(LoadingState.LoadingChunks, 0);


                foreach (var loadedChunk in provider.LoadedChunks)
                {
                    provider.UnloadChunk(loadedChunk);
                }

                ThreadPool.QueueUserWorkItem(async o =>
                {
                    double radiusSquared = Math.Pow(Client.ChunkRadius, 2);
                    var target           = radiusSquared * 3;

                    int percentage = 0;
                    bool ready     = false;

                    do
                    {
                        percentage = (int)(provider.LoadedChunks.Count() / target) * 100;

                        loadingWorldState.UpdateProgress(LoadingState.LoadingChunks,
                                                         percentage);

                        if (!ready)
                        {
                            if (_changeDimensionResetEvent.WaitOne(0))
                            {
                                ready = true;
                            }
                        }
                        else
                        {
                            await Task.Delay(50);
                        }
                    } while (!ready || percentage < 99);

                    AlexInstance.GameStateManager.Back();
                });
            }
        }