Don't dispose of old screen when changing maps (Thanks WolfgangNS)

This commit is contained in:
UnknownShadow200 2015-12-25 12:01:49 +11:00
parent 1116c22a66
commit a69074bb88
4 changed files with 20 additions and 6 deletions

View File

@ -300,7 +300,10 @@ namespace ClassicalSharp {
} }
internal Screen activeScreen; 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 // don't switch to the new screen immediately if the user
// is currently looking at a warning dialog. // is currently looking at a warning dialog.
if( activeScreen is WarningScreen ) { if( activeScreen is WarningScreen ) {
@ -314,7 +317,7 @@ namespace ClassicalSharp {
return; return;
} }
InputHandler.ScreenChanged( activeScreen, screen ); InputHandler.ScreenChanged( activeScreen, screen );
if( activeScreen != null ) if( activeScreen != null && disposeOld )
activeScreen.Dispose(); activeScreen.Dispose();
if( screen == null ) { if( screen == null ) {

View File

@ -85,7 +85,12 @@ namespace ClassicalSharp {
if( gzipStream != null ) if( gzipStream != null )
return; return;
game.Map.Reset(); 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=" ) ) { if( ServerMotd.Contains( "cfg=" ) ) {
ReadWomConfigurationAsync(); ReadWomConfigurationAsync();
} }
@ -139,6 +144,11 @@ namespace ClassicalSharp {
void HandleLevelFinalise() { void HandleLevelFinalise() {
game.SetNewScreen( null ); game.SetNewScreen( null );
game.activeScreen = prevScreen;
if( prevScreen != null )
game.CursorVisible = prevCursorVisible;
prevScreen = null;
int mapWidth = reader.ReadInt16(); int mapWidth = reader.ReadInt16();
int mapHeight = reader.ReadInt16(); int mapHeight = reader.ReadInt16();
int mapLength = reader.ReadInt16(); int mapLength = reader.ReadInt16();
@ -248,7 +258,7 @@ namespace ClassicalSharp {
void HandleSetPermission() { void HandleSetPermission() {
game.LocalPlayer.SetUserType( reader.ReadUInt8() ); game.LocalPlayer.SetUserType( reader.ReadUInt8() );
} }
void AddEntity( byte entityId, string displayName, string skinName, bool readPosition ) { void AddEntity( byte entityId, string displayName, string skinName, bool readPosition ) {
skinName = Utils.StripColours( skinName ); skinName = Utils.StripColours( skinName );
@ -282,7 +292,7 @@ namespace ClassicalSharp {
game.Events.RaiseEntityRemoved( entityId ); game.Events.RaiseEntityRemoved( entityId );
player.Despawn(); player.Despawn();
game.Players[entityId] = null; game.Players[entityId] = null;
} }
// See comment about LegendCraft in HandleAddEntity // See comment about LegendCraft in HandleAddEntity
if( needRemoveNames != null && needRemoveNames[entityId] ) { if( needRemoveNames != null && needRemoveNames[entityId] ) {
game.Events.RaiseCpeListInfoRemoved( entityId ); game.Events.RaiseCpeListInfoRemoved( entityId );

View File

@ -23,6 +23,8 @@ namespace ClassicalSharp {
Game game; Game game;
bool receivedFirstPosition; bool receivedFirstPosition;
DateTime lastPacket; DateTime lastPacket;
Screen prevScreen;
bool prevCursorVisible;
public override void Connect( IPAddress address, int port ) { public override void Connect( IPAddress address, int port ) {
socket = new Socket( address.AddressFamily, SocketType.Stream, ProtocolType.Tcp ); socket = new Socket( address.AddressFamily, SocketType.Stream, ProtocolType.Tcp );

View File

@ -102,7 +102,6 @@ namespace ClassicalSharp.Singleplayer {
game.Map.Reset(); game.Map.Reset();
GC.Collect(); GC.Collect();
this.generator = generator; this.generator = generator;
game.SetNewScreen( new LoadingMapScreen( game, "Single player", "Generating.." ) ); game.SetNewScreen( new LoadingMapScreen( game, "Single player", "Generating.." ) );
generator.GenerateAsync( game, width, height, length, seed ); generator.GenerateAsync( game, width, height, length, seed );
} }