From a69074bb8805f772d35e3e5a6181064ae4b84f81 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Fri, 25 Dec 2015 12:01:49 +1100 Subject: [PATCH] Don't dispose of old screen when changing maps (Thanks WolfgangNS) --- ClassicalSharp/Game/Game.cs | 7 +++++-- .../Network/NetworkProcessor.Original.cs | 16 +++++++++++++--- ClassicalSharp/Network/NetworkProcessor.cs | 2 ++ ClassicalSharp/Singleplayer/Server.cs | 1 - 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/ClassicalSharp/Game/Game.cs b/ClassicalSharp/Game/Game.cs index 7a2c29601..0983753e6 100644 --- a/ClassicalSharp/Game/Game.cs +++ b/ClassicalSharp/Game/Game.cs @@ -300,7 +300,10 @@ namespace ClassicalSharp { } internal Screen activeScreen; - public void SetNewScreen( Screen screen ) { + + public void SetNewScreen( Screen screen ) { SetNewScreen( screen, true ); } + + public void SetNewScreen( Screen screen, bool disposeOld ) { // don't switch to the new screen immediately if the user // is currently looking at a warning dialog. if( activeScreen is WarningScreen ) { @@ -314,7 +317,7 @@ namespace ClassicalSharp { return; } InputHandler.ScreenChanged( activeScreen, screen ); - if( activeScreen != null ) + if( activeScreen != null && disposeOld ) activeScreen.Dispose(); if( screen == null ) { diff --git a/ClassicalSharp/Network/NetworkProcessor.Original.cs b/ClassicalSharp/Network/NetworkProcessor.Original.cs index 2d79ce60a..8ec0d5403 100644 --- a/ClassicalSharp/Network/NetworkProcessor.Original.cs +++ b/ClassicalSharp/Network/NetworkProcessor.Original.cs @@ -85,7 +85,12 @@ namespace ClassicalSharp { if( gzipStream != null ) return; game.Map.Reset(); - game.SetNewScreen( new LoadingMapScreen( game, ServerName, ServerMotd ) ); + prevScreen = game.activeScreen; + if( prevScreen is LoadingMapScreen ) + prevScreen = null; + prevCursorVisible = game.CursorVisible; + + game.SetNewScreen( new LoadingMapScreen( game, ServerName, ServerMotd ), false ); if( ServerMotd.Contains( "cfg=" ) ) { ReadWomConfigurationAsync(); } @@ -139,6 +144,11 @@ namespace ClassicalSharp { void HandleLevelFinalise() { game.SetNewScreen( null ); + game.activeScreen = prevScreen; + if( prevScreen != null ) + game.CursorVisible = prevCursorVisible; + prevScreen = null; + int mapWidth = reader.ReadInt16(); int mapHeight = reader.ReadInt16(); int mapLength = reader.ReadInt16(); @@ -248,7 +258,7 @@ namespace ClassicalSharp { void HandleSetPermission() { game.LocalPlayer.SetUserType( reader.ReadUInt8() ); - } + } void AddEntity( byte entityId, string displayName, string skinName, bool readPosition ) { skinName = Utils.StripColours( skinName ); @@ -282,7 +292,7 @@ namespace ClassicalSharp { game.Events.RaiseEntityRemoved( entityId ); player.Despawn(); game.Players[entityId] = null; - } + } // See comment about LegendCraft in HandleAddEntity if( needRemoveNames != null && needRemoveNames[entityId] ) { game.Events.RaiseCpeListInfoRemoved( entityId ); diff --git a/ClassicalSharp/Network/NetworkProcessor.cs b/ClassicalSharp/Network/NetworkProcessor.cs index 86068ab05..23e969c11 100644 --- a/ClassicalSharp/Network/NetworkProcessor.cs +++ b/ClassicalSharp/Network/NetworkProcessor.cs @@ -23,6 +23,8 @@ namespace ClassicalSharp { Game game; bool receivedFirstPosition; DateTime lastPacket; + Screen prevScreen; + bool prevCursorVisible; public override void Connect( IPAddress address, int port ) { socket = new Socket( address.AddressFamily, SocketType.Stream, ProtocolType.Tcp ); diff --git a/ClassicalSharp/Singleplayer/Server.cs b/ClassicalSharp/Singleplayer/Server.cs index 8ff135397..03cd582f4 100644 --- a/ClassicalSharp/Singleplayer/Server.cs +++ b/ClassicalSharp/Singleplayer/Server.cs @@ -102,7 +102,6 @@ namespace ClassicalSharp.Singleplayer { game.Map.Reset(); GC.Collect(); this.generator = generator; - game.SetNewScreen( new LoadingMapScreen( game, "Single player", "Generating.." ) ); generator.GenerateAsync( game, width, height, length, seed ); }