From 3efd2365e126cb1e7e268711800ca1a2810f79d3 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Tue, 26 Apr 2016 19:03:06 +1000 Subject: [PATCH] Make warning dialogs less hacky. --- ClassicalSharp/2D/Screens/Menu/MenuScreen.cs | 3 +- ClassicalSharp/2D/Screens/WarningScreen.cs | 15 ++----- ClassicalSharp/Entities/LocalPlayer.cs | 2 +- ClassicalSharp/Game/Game.Properties.cs | 8 +++- ClassicalSharp/Game/Game.cs | 41 +++++++------------- ClassicalSharp/Game/PickingHandler.cs | 5 ++- ClassicalSharp/Generator/NotchyGenerator.cs | 2 +- ClassicalSharp/Utils/Camera.cs | 2 +- 8 files changed, 32 insertions(+), 46 deletions(-) diff --git a/ClassicalSharp/2D/Screens/Menu/MenuScreen.cs b/ClassicalSharp/2D/Screens/Menu/MenuScreen.cs index f82318496..c93806aa8 100644 --- a/ClassicalSharp/2D/Screens/Menu/MenuScreen.cs +++ b/ClassicalSharp/2D/Screens/Menu/MenuScreen.cs @@ -11,9 +11,10 @@ namespace ClassicalSharp.Gui { } protected Widget[] widgets; protected Font titleFont, regularFont; + protected FastColour backCol = new FastColour( 60, 60, 60, 160 ); protected void RenderMenuBounds() { - api.Draw2DQuad( 0, 0, game.Width, game.Height, new FastColour( 60, 60, 60, 160 ) ); + api.Draw2DQuad( 0, 0, game.Width, game.Height, backCol ); } protected void RenderMenuWidgets( double delta ) { diff --git a/ClassicalSharp/2D/Screens/WarningScreen.cs b/ClassicalSharp/2D/Screens/WarningScreen.cs index c1bd350ad..6b6a72e73 100644 --- a/ClassicalSharp/2D/Screens/WarningScreen.cs +++ b/ClassicalSharp/2D/Screens/WarningScreen.cs @@ -20,8 +20,6 @@ namespace ClassicalSharp.Gui { this.showAlways = showAlways; } - internal Screen lastScreen; - internal bool wasCursorVisible; string title, lastTitle; string[] body, lastBody; bool confirmNo, confirmMode, showAlways; @@ -29,6 +27,7 @@ namespace ClassicalSharp.Gui { public override void Init() { titleFont = new Font( game.FontName, 16, FontStyle.Bold ); regularFont = new Font( game.FontName, 16, FontStyle.Regular ); + backCol.A = 210; InitStandardButtons(); SetText( title, body ); } @@ -66,15 +65,9 @@ namespace ClassicalSharp.Gui { TextWidget[] labels; void CloseScreen() { - game.WarningScreens.RemoveAt( 0 ); - if( game.WarningScreens.Count > 0 ) { - game.activeScreen = game.WarningScreens[0]; - } else { - game.activeScreen = lastScreen; - game.CursorVisible = wasCursorVisible; - if( game.activeScreen == null && game.CursorVisible ) - game.CursorVisible = false; - } + game.WarningOverlays.RemoveAt( 0 ); + if( game.WarningOverlays.Count == 0 ) + game.CursorVisible = game.realVisible; } public override void Render( double delta ) { diff --git a/ClassicalSharp/Entities/LocalPlayer.cs b/ClassicalSharp/Entities/LocalPlayer.cs index 227046494..9f61ddcba 100644 --- a/ClassicalSharp/Entities/LocalPlayer.cs +++ b/ClassicalSharp/Entities/LocalPlayer.cs @@ -94,7 +94,7 @@ namespace ClassicalSharp.Entities { } void HandleInput( ref float xMoving, ref float zMoving ) { - if( game.ScreenLockedInput ) { + if( game.ActiveScreen.HandlesAllInput ) { physics.jumping = Hacks.Speeding = Hacks.FlyingUp = Hacks.FlyingDown = false; } else { if( game.IsKeyDown( KeyBinding.Forward ) ) xMoving -= 0.98f; diff --git a/ClassicalSharp/Game/Game.Properties.cs b/ClassicalSharp/Game/Game.Properties.cs index a5a72fdc3..cd974e79c 100644 --- a/ClassicalSharp/Game/Game.Properties.cs +++ b/ClassicalSharp/Game/Game.Properties.cs @@ -104,6 +104,8 @@ namespace ClassicalSharp { public List Components = new List(); + public List WarningOverlays = new List(); + /// Account username of the player. public string Username; @@ -164,7 +166,6 @@ namespace ClassicalSharp { public Animations Animations; internal int CloudsTexId, RainTexId, SnowTexId, GuiTexId, GuiClassicTexId; internal bool screenshotRequested; - internal List WarningScreens = new List(); internal UrlsList AcceptedUrls = new UrlsList( "acceptedurls.txt" ), DeniedUrls = new UrlsList( "deniedurls.txt" ); /// Calculates the amount that the hotbar widget should be scaled by when rendered. @@ -226,9 +227,14 @@ namespace ClassicalSharp { } bool visible = true; + internal bool realVisible = true; public bool CursorVisible { get { return visible; } set { + // Defer mouse visibility changes. + realVisible = value; + if( WarningOverlays.Count > 0 ) return; + // Only set the value when it has changes. if( visible == value ) return; window.CursorVisible = value; diff --git a/ClassicalSharp/Game/Game.cs b/ClassicalSharp/Game/Game.cs index 24da0196d..4173608eb 100644 --- a/ClassicalSharp/Game/Game.cs +++ b/ClassicalSharp/Game/Game.cs @@ -211,13 +211,10 @@ namespace ClassicalSharp { UpdateProjection(); } - /// Gets whether the screen the user is currently interacting with - /// handles all input. - public bool ScreenLockedInput { get { return ActiveScreen.HandlesAllInput; } } - /// Gets the screen that the user is currently interacting with. public Screen ActiveScreen { - get { return activeScreen == null ? hudScreen : activeScreen; } + get { return WarningOverlays.Count > 0 ? WarningOverlays[0] + : activeScreen == null ? hudScreen : activeScreen; } } Stopwatch frameTimer = new Stopwatch(); @@ -229,7 +226,7 @@ namespace ClassicalSharp { Graphics.BindIb( defaultIb ); accumulator += delta; Vertices = 0; - if( !Focused && !ScreenLockedInput ) + if( !Focused && !ActiveScreen.HandlesAllInput ) SetNewScreen( new PauseScreen( this ) ); CheckZoomFov(); @@ -299,6 +296,9 @@ namespace ClassicalSharp { activeScreen.Render( delta ); if( activeScreen != null && !activeScreen.HidesHud && activeScreen.RenderHudAfter ) hudScreen.Render( delta ); + + if( WarningOverlays.Count > 0) + WarningOverlays[0].Render( delta ); Graphics.Mode3D( EnvRenderer is StandardEnvRenderer ); } @@ -392,18 +392,6 @@ namespace ClassicalSharp { 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 ) { - WarningScreen warning = (WarningScreen)activeScreen; - if( warning.lastScreen != null ) - warning.lastScreen.Dispose(); - - warning.lastScreen = screen; - if( warning.lastScreen != null ) - screen.Init(); - return; - } InputHandler.ScreenChanged( activeScreen, screen ); if( activeScreen != null && disposeOld ) activeScreen.Dispose(); @@ -422,16 +410,11 @@ namespace ClassicalSharp { public void RefreshHud() { hudScreen.Recreate(); } public void ShowWarning( WarningScreen screen ) { - if( !(activeScreen is WarningScreen) ) { - screen.lastScreen = activeScreen; - activeScreen = screen; - - screen.wasCursorVisible = CursorVisible; - CursorVisible = true; - } else { - screen.wasCursorVisible = WarningScreens[0].wasCursorVisible; - } - WarningScreens.Add( screen ); + bool cursorVis = CursorVisible; + if( WarningOverlays.Count == 0 ) CursorVisible = true; + WarningOverlays.Add( screen ); + if( WarningOverlays.Count == 1 ) CursorVisible = cursorVis; + // Save cursor visibility state screen.Init(); } @@ -516,6 +499,8 @@ namespace ClassicalSharp { Graphics.DeleteTexture( ref SnowTexId ); Graphics.DeleteTexture( ref GuiTexId ); Graphics.DeleteTexture( ref GuiClassicTexId ); + foreach( WarningScreen screen in WarningOverlays ) + screen.Dispose(); if( Options.HasChanged ) { Options.Load(); diff --git a/ClassicalSharp/Game/PickingHandler.cs b/ClassicalSharp/Game/PickingHandler.cs index ece4cd974..3edf8bee9 100644 --- a/ClassicalSharp/Game/PickingHandler.cs +++ b/ClassicalSharp/Game/PickingHandler.cs @@ -24,7 +24,7 @@ namespace ClassicalSharp { lastClick = now; Inventory inv = game.Inventory; - if( game.Network.UsingPlayerClick && !game.ScreenLockedInput ) { + if( game.Network.UsingPlayerClick && !game.ActiveScreen.HandlesAllInput ) { byte targetId = game.Players.GetClosetPlayer( game.LocalPlayer ); input.ButtonStateChanged( MouseButton.Left, left, targetId ); input.ButtonStateChanged( MouseButton.Right, right, targetId ); @@ -32,7 +32,8 @@ namespace ClassicalSharp { } int buttonsDown = (left ? 1 : 0) + (right ? 1 : 0) + (middle ? 1 : 0); - if( buttonsDown > 1 || game.ScreenLockedInput || inv.HeldBlock == Block.Air ) return; + if( buttonsDown > 1 || game.ActiveScreen.HandlesAllInput || + inv.HeldBlock == Block.Air ) return; // always play delete animations, even if we aren't picking a block. if( left ) game.BlockHandRenderer.SetAnimationClick( true ); diff --git a/ClassicalSharp/Generator/NotchyGenerator.cs b/ClassicalSharp/Generator/NotchyGenerator.cs index f35c4d99d..c55ed13ad 100644 --- a/ClassicalSharp/Generator/NotchyGenerator.cs +++ b/ClassicalSharp/Generator/NotchyGenerator.cs @@ -27,7 +27,7 @@ namespace ClassicalSharp.Generator { blocks = new byte[width * height * length]; rnd = new Random( seed ); - CreateHeightmap(); + CreateHeightmap(); CreateStrata(); CarveCaves(); CarveOreVeins( 0.9f, "coal ore", (byte)Block.CoalOre ); diff --git a/ClassicalSharp/Utils/Camera.cs b/ClassicalSharp/Utils/Camera.cs index 98785abf4..4a8d12c73 100644 --- a/ClassicalSharp/Utils/Camera.cs +++ b/ClassicalSharp/Utils/Camera.cs @@ -105,7 +105,7 @@ namespace ClassicalSharp { } public override void Tick( double elapsed ) { - if( game.ScreenLockedInput ) return; + if( game.ActiveScreen.HandlesAllInput ) return; CentreMousePosition(); UpdateMouseRotation(); }