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"); }); }
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(); }); } }