diff --git a/ClassicalSharp/2D/Screens/BlockSelectScreen.cs b/ClassicalSharp/2D/Screens/BlockSelectScreen.cs index 22e685039..58c66cb6a 100644 --- a/ClassicalSharp/2D/Screens/BlockSelectScreen.cs +++ b/ClassicalSharp/2D/Screens/BlockSelectScreen.cs @@ -181,7 +181,7 @@ namespace ClassicalSharp { public override bool HandlesMouseClick( int mouseX, int mouseY, MouseButton button ) { if( button == MouseButton.Left && selectedIndex != -1 ) { game.Inventory.HeldBlock = blocksTable[selectedIndex]; - game.SetNewScreen( new NormalScreen( game ) ); + game.SetNewScreen( null ); } return true; } @@ -189,7 +189,7 @@ namespace ClassicalSharp { public override bool HandlesKeyDown( Key key ) { if( key == game.Mapping( KeyBinding.PauseOrExit ) || key == game.Mapping( KeyBinding.OpenInventory ) ) { - game.SetNewScreen( new NormalScreen( game ) ); + game.SetNewScreen( null ); } return true; } diff --git a/ClassicalSharp/2D/Screens/ErrorScreen.cs b/ClassicalSharp/2D/Screens/ErrorScreen.cs index ebe3e8dce..d32d0dc1a 100644 --- a/ClassicalSharp/2D/Screens/ErrorScreen.cs +++ b/ClassicalSharp/2D/Screens/ErrorScreen.cs @@ -48,5 +48,9 @@ namespace ClassicalSharp { public override bool HandlesAllInput { get { return true; } } + + public override bool HidesHud { + get { return true; } + } } } diff --git a/ClassicalSharp/2D/Screens/FilesScreen.cs b/ClassicalSharp/2D/Screens/FilesScreen.cs index 1e96bfcfd..9adc6a02f 100644 --- a/ClassicalSharp/2D/Screens/FilesScreen.cs +++ b/ClassicalSharp/2D/Screens/FilesScreen.cs @@ -76,7 +76,7 @@ namespace ClassicalSharp { public override bool HandlesKeyDown( Key key ) { if( key == Key.Escape ) { - game.SetNewScreen( new NormalScreen( game ) ); + game.SetNewScreen( null ); } else if( key == Key.Left ) { PageClick( false ); } else if( key == Key.Right ) { diff --git a/ClassicalSharp/2D/Screens/FpsScreen.cs b/ClassicalSharp/2D/Screens/FpsScreen.cs index 4a7f645b3..b179cd4a8 100644 --- a/ClassicalSharp/2D/Screens/FpsScreen.cs +++ b/ClassicalSharp/2D/Screens/FpsScreen.cs @@ -21,7 +21,7 @@ namespace ClassicalSharp { graphicsApi.Texturing = true; fpsTextWidget.Render( delta ); - if( game.activeScreen is NormalScreen ) { + if( game.activeScreen == null ) { UpdateHackState( false ); DrawPosition(); hackStatesWidget.Render( delta ); diff --git a/ClassicalSharp/2D/Screens/HotkeyScreen.cs b/ClassicalSharp/2D/Screens/HotkeyScreen.cs index d0674bc20..25f344b08 100644 --- a/ClassicalSharp/2D/Screens/HotkeyScreen.cs +++ b/ClassicalSharp/2D/Screens/HotkeyScreen.cs @@ -35,6 +35,7 @@ namespace ClassicalSharp { } bool supressNextPress; + const int numButtons = 5; public override bool HandlesKeyPress( char key ) { if( supressNextPress ) { supressNextPress = false; @@ -47,7 +48,7 @@ namespace ClassicalSharp { public override bool HandlesKeyDown( Key key ) { if( key == Key.Escape ) { - game.SetNewScreen( new NormalScreen( game ) ); + game.SetNewScreen( null ); return true; } else if( focusWidget != null ) { FocusKeyDown( key ); @@ -83,7 +84,7 @@ namespace ClassicalSharp { MakeHotkey( 0, -120, 1 ), MakeHotkey( 0, -80, 2 ), MakeHotkey( 0, -40, 3 ), - MakeAddNew( 0, 0 ), + MakeHotkey( 0, 0, 4 ), Make( -160, -80, "<", 40, 40, arrowFont, (g, w) => PageClick( false ) ), Make( 160, -80, ">", 40, 40, arrowFont, (g, w) => PageClick( true ) ), @@ -128,20 +129,12 @@ namespace ClassicalSharp { game, x, y, 240, 30, text, Anchor.Centre, Anchor.Centre, textFont, TextButtonClick ); + button.Metadata = default( Hotkey ); if( text != "-----" ) button.Metadata = hotkeys.Hotkeys[index]; return button; } - ButtonWidget MakeAddNew( int x, int y ) { - ButtonWidget button = ButtonWidget.Create( - game, x, y, 240, 30, "Add new", Anchor.Centre, Anchor.Centre, - textFont, TextButtonClick ); - - button.Metadata = default( Hotkey ); - return button; - } - string Get( int index ) { if( index >= hotkeys.Hotkeys.Count ) return "-----"; @@ -152,8 +145,8 @@ namespace ClassicalSharp { void Set( int index ) { string text = Get( index + currentIndex ); ButtonWidget button = buttons[index]; - button.SetText( text); - button.Metadata = null; + button.SetText( text ); + button.Metadata = default( Hotkey ); if( text != "-----" ) button.Metadata = hotkeys.Hotkeys[index]; } @@ -168,12 +161,13 @@ namespace ClassicalSharp { int currentIndex; void PageClick( bool forward ) { - currentIndex += forward ? 4 : -4; - if( currentIndex >= hotkeys.Hotkeys.Count ) currentIndex -= 4; + currentIndex += forward ? numButtons : -numButtons; + if( currentIndex >= hotkeys.Hotkeys.Count ) + currentIndex -= numButtons; if( currentIndex < 0 ) currentIndex = 0; LostFocus(); - for( int i = 0; i < 4; i++ ) + for( int i = 0; i < numButtons; i++ ) Set( i ); } @@ -181,12 +175,9 @@ namespace ClassicalSharp { LostFocus(); ButtonWidget button = (ButtonWidget)widget; - if( button.Metadata != null ) { - curHotkey = (Hotkey)button.Metadata; - origHotkey = curHotkey; - // do stuff here - CreateEditingWidgets(); - } + curHotkey = (Hotkey)button.Metadata; + origHotkey = curHotkey; + CreateEditingWidgets(); } #region Modifying hotkeys @@ -254,7 +245,7 @@ namespace ClassicalSharp { curHotkey.MoreInput, currentAction.GetText() ); } - for( int i = 0; i < 4; i++ ) + for( int i = 0; i < numButtons; i++ ) Set( i ); DisposeEditingWidgets(); } @@ -265,7 +256,7 @@ namespace ClassicalSharp { hotkeys.UserRemovedHotkey( origHotkey.BaseKey, origHotkey.Flags ); } - for( int i = 0; i < 4; i++ ) + for( int i = 0; i < numButtons; i++ ) Set( i ); DisposeEditingWidgets(); } diff --git a/ClassicalSharp/2D/Screens/NormalScreen.cs b/ClassicalSharp/2D/Screens/HudScreen.cs similarity index 90% rename from ClassicalSharp/2D/Screens/NormalScreen.cs rename to ClassicalSharp/2D/Screens/HudScreen.cs index e79d51785..5fd42aefa 100644 --- a/ClassicalSharp/2D/Screens/NormalScreen.cs +++ b/ClassicalSharp/2D/Screens/HudScreen.cs @@ -5,9 +5,9 @@ using OpenTK.Input; namespace ClassicalSharp { - public class NormalScreen : Screen { + public class HudScreen : Screen { - public NormalScreen( Game game ) : base( game ) { + public HudScreen( Game game ) : base( game ) { } ChatScreen chat; @@ -18,11 +18,13 @@ namespace ClassicalSharp { public override void Render( double delta ) { if( game.HideGui ) return; + bool showMinimal = game.GetActiveScreen != this; if( chat.HandlesAllInput ) chat.RenderBackground(); graphicsApi.Texturing = true; chat.Render( delta ); - hotbar.Render( delta ); + if( !showMinimal ) + hotbar.Render( delta ); //graphicsApi.BeginVbBatch( VertexFormat.Pos3fTex2fCol4b ); //graphicsApi.BindTexture( game.TerrainAtlas.TexId ); @@ -35,11 +37,11 @@ namespace ClassicalSharp { playerList.Dispose(); playerList = null; } - graphicsApi.Texturing = false; - } else { - graphicsApi.Texturing = false; - DrawCrosshairs(); } + + graphicsApi.Texturing = false; + if( playerList == null && !showMinimal ) + DrawCrosshairs(); } const int crosshairExtent = 15, crosshairWeight = 2; @@ -57,6 +59,17 @@ namespace ClassicalSharp { playerFont.Dispose(); chat.Dispose(); hotbar.Dispose(); + if( playerList != null ) + playerList.Dispose(); + } + + public void GainFocus() { + if( game.CursorVisible ) + game.CursorVisible = false; + game.Camera.RegrabMouse(); + } + + public void LoseFocus() { if( playerList != null ) { playerList.Dispose(); } @@ -79,9 +92,6 @@ namespace ClassicalSharp { chat.Init(); hotbar = new BlockHotbarWidget( game ); hotbar.Init(); - if( game.CursorVisible ) - game.CursorVisible = false; - game.Camera.RegrabMouse(); } public override bool HandlesAllInput { diff --git a/ClassicalSharp/2D/Screens/LoadingMapScreen.cs b/ClassicalSharp/2D/Screens/LoadingMapScreen.cs index 29e192ed6..0ad0451a1 100644 --- a/ClassicalSharp/2D/Screens/LoadingMapScreen.cs +++ b/ClassicalSharp/2D/Screens/LoadingMapScreen.cs @@ -73,5 +73,9 @@ namespace ClassicalSharp { public override bool HandlesAllInput { get { return true; } } + + public override bool HidesHud { + get { return true; } + } } } diff --git a/ClassicalSharp/2D/Screens/Menu/KeyBindingsScreen.cs b/ClassicalSharp/2D/Screens/Menu/KeyBindingsScreen.cs index d83a9de27..f45062e31 100644 --- a/ClassicalSharp/2D/Screens/Menu/KeyBindingsScreen.cs +++ b/ClassicalSharp/2D/Screens/Menu/KeyBindingsScreen.cs @@ -66,7 +66,7 @@ namespace ClassicalSharp { public override bool HandlesKeyDown( Key key ) { if( key == Key.Escape ) { - game.SetNewScreen( new NormalScreen( game ) ); + game.SetNewScreen( null ); } else if( curWidget != null ) { int index = Array.IndexOf( buttons, curWidget ); KeyBinding mapping = (KeyBinding)index; diff --git a/ClassicalSharp/2D/Screens/Menu/MenuInputScreen.cs b/ClassicalSharp/2D/Screens/Menu/MenuInputScreen.cs index 93aee2adf..696cd063b 100644 --- a/ClassicalSharp/2D/Screens/Menu/MenuInputScreen.cs +++ b/ClassicalSharp/2D/Screens/Menu/MenuInputScreen.cs @@ -40,7 +40,7 @@ namespace ClassicalSharp { public override bool HandlesKeyDown( Key key ) { if( key == Key.Escape ) { - game.SetNewScreen( new NormalScreen( game ) ); + game.SetNewScreen( null ); return true; } else if( (key == Key.Enter || key == Key.KeypadEnter) && inputWidget != null ) { diff --git a/ClassicalSharp/2D/Screens/Menu/OptionsScreen.cs b/ClassicalSharp/2D/Screens/Menu/OptionsScreen.cs index 11322acef..f89342cbe 100644 --- a/ClassicalSharp/2D/Screens/Menu/OptionsScreen.cs +++ b/ClassicalSharp/2D/Screens/Menu/OptionsScreen.cs @@ -41,19 +41,25 @@ namespace ClassicalSharp { Make( 140, -50, "Chat font size", Anchor.Centre, OnWidgetClick, g => g.Chat.FontSize.ToString(), (g, v) => { g.Chat.FontSize = Int32.Parse( v ); - Options.Set( OptionsKey.FontSize, v ); } ), + Options.Set( OptionsKey.FontSize, v ); + g.RefreshHud(); + } ), Make( 140, 0, "Chat lines", Anchor.Centre, OnWidgetClick, g => g.ChatLines.ToString(), (g, v) => { g.ChatLines = Int32.Parse( v ); - Options.Set( OptionsKey.ChatLines, v ); } ), + Options.Set( OptionsKey.ChatLines, v ); + g.RefreshHud(); + } ), Make( 140, 50, "Arial chat font", Anchor.Centre, OnWidgetClick, g => g.Drawer2D.UseBitmappedChat ? "no" : "yes", (g, v) => { g.Drawer2D.UseBitmappedChat = v == "no"; Options.Set( OptionsKey.ArialChatFont, v == "yes" ); - game.Events.RaiseChatFontChanged(); } ), + game.Events.RaiseChatFontChanged(); + g.RefreshHud(); + } ), // Extra stuff !network.IsSinglePlayer ? null : diff --git a/ClassicalSharp/2D/Screens/Menu/PauseScreen.cs b/ClassicalSharp/2D/Screens/Menu/PauseScreen.cs index e18f34b57..8a5530a8e 100644 --- a/ClassicalSharp/2D/Screens/Menu/PauseScreen.cs +++ b/ClassicalSharp/2D/Screens/Menu/PauseScreen.cs @@ -40,7 +40,7 @@ namespace ClassicalSharp { (g, w) => g.SetNewScreen( new TexturePackScreen( g ) ) ), // Other Make( 0, 55, "Back to game", Anchor.BottomOrRight, - (g, w) => g.SetNewScreen( new NormalScreen( g ) ) ), + (g, w) => g.SetNewScreen( null ) ), Make( 0, 5, "Quit game", Anchor.BottomOrRight, (g, w) => g.Exit() ), }; } @@ -51,7 +51,7 @@ namespace ClassicalSharp { public override bool HandlesKeyDown( Key key ) { if( key == Key.Escape ) - game.SetNewScreen( new NormalScreen( game ) ); + game.SetNewScreen( null ); return true; } } diff --git a/ClassicalSharp/2D/Screens/Menu/SaveLevelScreen.cs b/ClassicalSharp/2D/Screens/Menu/SaveLevelScreen.cs index 954f340d2..88feac315 100644 --- a/ClassicalSharp/2D/Screens/Menu/SaveLevelScreen.cs +++ b/ClassicalSharp/2D/Screens/Menu/SaveLevelScreen.cs @@ -35,7 +35,7 @@ namespace ClassicalSharp { public override bool HandlesKeyDown( Key key ) { if( key == Key.Escape ) { - game.SetNewScreen( new NormalScreen( game ) ); + game.SetNewScreen( null ); return true; } return inputWidget.HandlesKeyDown( key ); diff --git a/ClassicalSharp/2D/Screens/Screen.cs b/ClassicalSharp/2D/Screens/Screen.cs index 12039cfd8..702e0940d 100644 --- a/ClassicalSharp/2D/Screens/Screen.cs +++ b/ClassicalSharp/2D/Screens/Screen.cs @@ -17,5 +17,10 @@ namespace ClassicalSharp { public virtual bool BlocksWorld { get { return false; } } + + /// Whether this screen hides the normal in-game hud. + public virtual bool HidesHud { + get { return false; } + } } } diff --git a/ClassicalSharp/ClassicalSharp.csproj b/ClassicalSharp/ClassicalSharp.csproj index 460f6d8f5..352f4c3e7 100644 --- a/ClassicalSharp/ClassicalSharp.csproj +++ b/ClassicalSharp/ClassicalSharp.csproj @@ -99,7 +99,7 @@ - + diff --git a/ClassicalSharp/Game/Game.cs b/ClassicalSharp/Game/Game.cs index 5df78bfa6..e2d00db6f 100644 --- a/ClassicalSharp/Game/Game.cs +++ b/ClassicalSharp/Game/Game.cs @@ -51,6 +51,7 @@ namespace ClassicalSharp { internal int defaultIb; public bool CanUseThirdPersonCamera = true; FpsScreen fpsScreen; + internal HudScreen hudScreen; public Events Events = new Events(); public InputHandler InputHandler; public ChatLog Chat; @@ -166,6 +167,8 @@ namespace ClassicalSharp { Graphics.AlphaTestFunc( CompareFunc.Greater, 0.5f ); fpsScreen = new FpsScreen( this ); fpsScreen.Init(); + hudScreen = new HudScreen( this ); + hudScreen.Init(); Culling = new FrustumCulling(); EnvRenderer.Init(); MapEnvRenderer.Init(); @@ -185,9 +188,19 @@ namespace ClassicalSharp { UpdateProjection(); } + public void RefreshHud() { + hudScreen.Dispose(); + hudScreen.Init(); + } + /// Gets whether the active screen handles all input. public bool ScreenLockedInput { - get { return activeScreen != null && activeScreen.HandlesAllInput; } + get { return activeScreen == null ? hudScreen.HandlesAllInput : + activeScreen.HandlesAllInput; } // inlined here. + } + + public Screen GetActiveScreen { + get { return activeScreen == null ? hudScreen : activeScreen; } } const int ticksFrequency = 20; @@ -201,9 +214,8 @@ namespace ClassicalSharp { Graphics.BindIb( defaultIb ); accumulator += e.Time; Vertices = 0; - if( !Focused && (activeScreen == null || !activeScreen.HandlesAllInput) ) { + if( !Focused && !ScreenLockedInput ) SetNewScreen( new PauseScreen( this ) ); - } base.OnRenderFrame( e ); CheckScheduledTasks( e.Time ); @@ -238,14 +250,12 @@ namespace ClassicalSharp { } Graphics.Mode2D( Width, Height, EnvRenderer is StandardEnvRenderer ); - //OpenTK.Graphics.OpenGL.GL.PolygonMode( 0x0408, 0x1B02 ); fpsScreen.Render( e.Time ); - if( activeScreen != null ) { + if( activeScreen == null || !activeScreen.HidesHud ) + hudScreen.Render( e.Time ); + if( activeScreen != null ) activeScreen.Render( e.Time ); - } Graphics.Mode3D( EnvRenderer is StandardEnvRenderer ); - //if( Keyboard[Key.F2] ) - // OpenTK.Graphics.OpenGL.GL.PolygonMode( 0x0408, 0x1B01 ); if( screenshotRequested ) TakeScreenshot(); @@ -320,13 +330,19 @@ namespace ClassicalSharp { internal Screen activeScreen; public void SetNewScreen( Screen screen ) { - InputHandler.ScreenChanged( activeScreen, screen ); - + InputHandler.ScreenChanged( activeScreen, screen ); if( activeScreen != null ) activeScreen.Dispose(); - activeScreen = screen; + + if( screen == null ) { + hudScreen.GainFocus(); + } else if( activeScreen == null ) { + hudScreen.LoseFocus(); + } + if( screen != null ) screen.Init(); + activeScreen = screen; } public void SetCamera( bool thirdPerson ) { diff --git a/ClassicalSharp/Game/InputHandler.cs b/ClassicalSharp/Game/InputHandler.cs index 440bd22bb..4659c17a2 100644 --- a/ClassicalSharp/Game/InputHandler.cs +++ b/ClassicalSharp/Game/InputHandler.cs @@ -212,7 +212,7 @@ namespace ClassicalSharp { #region Event handlers void MouseButtonUp( object sender, MouseButtonEventArgs e ) { - if( game.activeScreen == null || !game.activeScreen.HandlesMouseUp( e.X, e.Y, e.Button ) ) { + if( !game.GetActiveScreen.HandlesMouseUp( e.X, e.Y, e.Button ) ) { if( game.Network.UsingPlayerClick && e.Button <= MouseButton.Middle ) { byte targetId = game.Players.GetClosetPlayer( game.LocalPlayer ); ButtonStateChanged( e.Button, false, targetId ); @@ -221,7 +221,7 @@ namespace ClassicalSharp { } void MouseButtonDown( object sender, MouseButtonEventArgs e ) { - if( game.activeScreen == null || !game.activeScreen.HandlesMouseClick( e.X, e.Y, e.Button ) ) { + if( !game.GetActiveScreen.HandlesMouseClick( e.X, e.Y, e.Button ) ) { bool left = e.Button == MouseButton.Left; bool middle = e.Button == MouseButton.Middle; bool right = e.Button == MouseButton.Right; @@ -232,12 +232,12 @@ namespace ClassicalSharp { } void MouseMove( object sender, MouseMoveEventArgs e ) { - if( game.activeScreen == null || !game.activeScreen.HandlesMouseMove( e.X, e.Y ) ) { + if( !game.GetActiveScreen.HandlesMouseMove( e.X, e.Y ) ) { } } void MouseWheelChanged( object sender, MouseWheelEventArgs e ) { - if( game.activeScreen == null || !game.activeScreen.HandlesMouseScroll( e.Delta ) ) { + if( !game.GetActiveScreen.HandlesMouseScroll( e.Delta ) ) { Inventory inv = game.Inventory; if( game.Camera.MouseZoom( e ) || !inv.CanChangeHeldBlock ) return; @@ -251,7 +251,7 @@ namespace ClassicalSharp { void KeyPressHandler( object sender, KeyPressEventArgs e ) { char key = e.KeyChar; - if( game.activeScreen == null || !game.activeScreen.HandlesKeyPress( key ) ) { + if( !game.GetActiveScreen.HandlesKeyPress( key ) ) { } } @@ -259,7 +259,7 @@ namespace ClassicalSharp { Key key = e.Key; if( SimulateMouse( key, false ) ) return; - if( game.activeScreen == null || !game.activeScreen.HandlesKeyUp( key ) ) { + if( !game.GetActiveScreen.HandlesKeyUp( key ) ) { } } @@ -272,7 +272,7 @@ namespace ClassicalSharp { game.Exit(); } else if( key == Keys[KeyBinding.Screenshot] ) { game.screenshotRequested = true; - } else if( game.activeScreen == null || !game.activeScreen.HandlesKeyDown( key ) ) { + } else if( !game.GetActiveScreen.HandlesKeyDown( key ) ) { if( !HandleBuiltinKey( key ) && !game.LocalPlayer.HandleKeyDown( key ) ) { HandleHotkey( key ); @@ -287,8 +287,8 @@ namespace ClassicalSharp { if( Hotkeys.IsHotkey( key, game.Keyboard, out text, out more ) ) { if( !more ) game.Network.SendChat( text, false ); - else if( game.activeScreen is NormalScreen ) - ((NormalScreen)game.activeScreen).OpenTextInputBar( text ); + else if( game.activeScreen == null ) + game.hudScreen.OpenTextInputBar( text ); } } diff --git a/ClassicalSharp/Network/NetworkProcessor.Original.cs b/ClassicalSharp/Network/NetworkProcessor.Original.cs index 5beabf657..6a6ca23e2 100644 --- a/ClassicalSharp/Network/NetworkProcessor.Original.cs +++ b/ClassicalSharp/Network/NetworkProcessor.Original.cs @@ -132,7 +132,7 @@ namespace ClassicalSharp { } void HandleLevelFinalise() { - game.SetNewScreen( new NormalScreen( game ) ); + game.SetNewScreen( null ); int mapWidth = reader.ReadInt16(); int mapHeight = reader.ReadInt16(); int mapLength = reader.ReadInt16(); diff --git a/ClassicalSharp/Singleplayer/Server.cs b/ClassicalSharp/Singleplayer/Server.cs index abc7a830b..b09384c70 100644 --- a/ClassicalSharp/Singleplayer/Server.cs +++ b/ClassicalSharp/Singleplayer/Server.cs @@ -76,7 +76,7 @@ namespace ClassicalSharp.Singleplayer { } game.Map.SetData( map, width, height, length ); game.Events.RaiseOnNewMapLoaded(); - game.SetNewScreen( new NormalScreen( game ) ); + game.SetNewScreen( null ); ResetPlayerPosition(); game.Chat.Add( "&ePlaying single player", CpeMessage.Status1 ); GC.Collect();