protected override async void Update(GameTime gameTime) { if (IsActive) { switch (State) { case GameState.Started: { if (!Paused) { player.Update(gameTime); if (player.UpdateOccured) { world.UpdateBlocks(); } await world.UpdateAsync(); } gameMenu.Update(); break; } case GameState.Loading: { State = GameState.Started; currentSave = mainMenu.CurrentSave; time = new Time(currentSave.Parameters.Day, currentSave.Parameters.Hour, currentSave.Parameters.Minute); ScreenshotHandler screenshotHandler = new ScreenshotHandler(GraphicsDevice, Window.ClientBounds.Width, Window.ClientBounds.Height); BlockSelector blockSelector = new BlockSelector(GraphicsDevice); databaseHandler = new DatabaseHandler(this, currentSave.Parameters.SaveName); gameMenu = new GameMenu(this, GraphicsDevice, time, screenshotHandler, currentSave.Parameters); world = new WorldManager(gameMenu, databaseHandler, blockSelector, currentSave.Parameters); player = new Player(this, GraphicsDevice, currentSave.Parameters); renderer = new Renderer(this, GraphicsDevice, time, world.Region, screenshotHandler, blockSelector); world.SetPlayer(this, player, currentSave.Parameters); if (!File.Exists($@"Saves\{currentSave.Parameters.SaveName}\save_icon.png")) { player.Update(gameTime); world.Update(); renderer.Draw(world.ActiveChunks, player); screenshotHandler.SaveIcon(currentSave.Parameters.SaveName, out currentSave.Icon); } break; } case GameState.Exiting: { databaseHandler.Close(); player.SaveParameters(currentSave.Parameters); time.SaveParameters(currentSave.Parameters); currentSave.Parameters.Save(); player = null; world = null; databaseHandler = null; gameMenu = null; renderer = null; GC.Collect(); State = GameState.MainMenu; IsMouseVisible = true; break; } case GameState.MainMenu: { mainMenu.Update(); break; } } } base.Update(gameTime); }