diff --git a/ClassicalSharp/Game/InputHandler.cs b/ClassicalSharp/Game/InputHandler.cs index d181cb0c1..b48cf9c7a 100644 --- a/ClassicalSharp/Game/InputHandler.cs +++ b/ClassicalSharp/Game/InputHandler.cs @@ -186,7 +186,9 @@ namespace ClassicalSharp { for( int id = 0; id < 255; id++ ) { Player player = game.Players[id]; if( player == null ) continue; - if( player.CollisionBounds.Intersects( blockBB ) ) return true; + BoundingBox bounds = player.CollisionBounds; + bounds.Min.Y += 1/32f; // when player is exactly standing on top of ground + if( bounds.Intersects( blockBB ) ) return true; } return false; } diff --git a/Launcher2/Gui/Screens/ClassiCubeServersScreen.cs b/Launcher2/Gui/Screens/ClassiCubeServersScreen.cs index 0792e1f2e..616a74b4a 100644 --- a/Launcher2/Gui/Screens/ClassiCubeServersScreen.cs +++ b/Launcher2/Gui/Screens/ClassiCubeServersScreen.cs @@ -20,7 +20,7 @@ namespace Launcher2 { public override void Tick() { LauncherTableWidget table = (LauncherTableWidget)widgets[tableIndex]; if( table.DraggingWidth && !game.Window.Mouse[MouseButton.Left] ) - table.DraggingWidth = false; + table.DraggingWidth = false; } protected override void MouseMove( object sender, MouseMoveEventArgs e ) { @@ -41,11 +41,17 @@ namespace Launcher2 { protected override void OnRemovedChar() { FilterList(); } protected override void KeyDown( object sender, KeyboardKeyEventArgs e ) { + LauncherTableWidget table = (LauncherTableWidget)widgets[tableIndex]; if( e.Key == Key.Enter ) { - LauncherTableWidget table = (LauncherTableWidget)widgets[tableIndex]; if( table.Count == 1 && String.IsNullOrEmpty( Get( 3 ) ) ) widgets[3].Text = table.usedEntries[0].Hash; ConnectToServer( 0, 0 ); + } else if( e.Key == Key.Up ) { + table.SetSelected( table.SelectedIndex - 1 ); + table.NeedRedraw(); + } else if( e.Key == Key.Down ) { + table.SetSelected( table.SelectedIndex + 1 ); + table.NeedRedraw(); } else { base.KeyDown( sender, e ); } @@ -64,7 +70,7 @@ namespace Launcher2 { base.RedrawLastInput(); if( lastInput == widgets[3] ) { LauncherTableWidget table = (LauncherTableWidget)widgets[tableIndex]; - table.SelectedHash = widgets[3].Text; + table.SetSelected( widgets[3].Text ); Resize(); } } @@ -76,7 +82,7 @@ namespace Launcher2 { Resize(); selectedWidget = widgets[1]; - InputClick( 0, 0 ); + InputClick( 0, 0 ); } public override void Resize() { @@ -107,7 +113,7 @@ namespace Launcher2 { MakeButtonAt( "Back", 70, 30, titleFont, Anchor.BottomOrRight, Anchor.LeftOrTop, -10, 5, (x, y) => game.SetScreen( new ClassiCubeScreen( game ) ) ); MakeButtonAt( "Connect", 100, 30, titleFont, Anchor.BottomOrRight, Anchor.LeftOrTop, - -10, 50, ConnectToServer ); + -10, 50, ConnectToServer ); MakeTableWidget(); } diff --git a/Launcher2/Gui/TableWidget/LauncherTableWidget.Input.cs b/Launcher2/Gui/TableWidget/LauncherTableWidget.Input.cs index 3e0a7f28a..9a99b6d3b 100644 --- a/Launcher2/Gui/TableWidget/LauncherTableWidget.Input.cs +++ b/Launcher2/Gui/TableWidget/LauncherTableWidget.Input.cs @@ -59,9 +59,8 @@ namespace Launcher2 { Window.ConnectToServer( servers, entry.Hash ); lastPress = DateTime.UtcNow; } - SelectedChanged( entry.Hash ); - SelectedHash = entry.Hash; + SetSelected( i ); NeedRedraw(); lastIndex = i; break; diff --git a/Launcher2/Gui/TableWidget/LauncherTableWidget.cs b/Launcher2/Gui/TableWidget/LauncherTableWidget.cs index a2b5c76e6..64e0a7fc6 100644 --- a/Launcher2/Gui/TableWidget/LauncherTableWidget.cs +++ b/Launcher2/Gui/TableWidget/LauncherTableWidget.cs @@ -13,7 +13,7 @@ namespace Launcher2 { public Action NeedRedraw; public Action SelectedChanged; - public string SelectedHash; + public int SelectedIndex = -1; internal TableEntry[] entries, usedEntries; internal List servers; @@ -96,9 +96,9 @@ namespace Launcher2 { for( int i = CurrentIndex; i < Count; i++ ) { args = new DrawTextArgs( filter( usedEntries[i] ), font, true ); - if( usedEntries[i].Hash == SelectedHash ) { + if( i == SelectedIndex ) args.Font = boldFont; - } + if( !DrawColumnEntry( drawer, ref args, maxWidth, x, ref y, ref usedEntries[i] ) ) { maxIndex = i; break; @@ -115,14 +115,14 @@ namespace Launcher2 { int maxWidth, int x, ref int y, ref TableEntry entry ) { Size size = drawer.MeasureSize( ref args ); if( y + size.Height > Window.Height ) { - y = Window.Height + 5; return false; + y = Window.Height + 3; return false; } size.Width = Math.Min( maxWidth, size.Width ); entry.Y = y; entry.Height = size.Height; args.SkipPartsCheck = false; drawer.DrawClippedText( ref args, x, y, maxWidth, 30 ); - y += size.Height + 5; + y += size.Height + 3; return true; } @@ -135,6 +135,10 @@ namespace Launcher2 { drawer.DrawRect( foreCol, 0, Y + size.Height + 10, Window.Width, 3 ); headerStartY = Y; headerEndY = Y + size.Height + 10; + + args = new DrawTextArgs( "I", font, true ); + size = drawer.MeasureSize( ref args ); + numEntries = (Window.Height - headerEndY) / (size.Height + 3); } int maxIndex; @@ -147,8 +151,30 @@ namespace Launcher2 { drawer.DrawRect( scrollCol, Window.Width - 10, y1, 10, height ); } + public void SetSelected( int index ) { + if( index >= maxIndex ) CurrentIndex = index - numEntries; + if( index < CurrentIndex ) CurrentIndex = index; + if( index >= Count ) index = Count - 1; + if( index < 0 ) index = 0; + + SelectedIndex = index; + ClampIndex(); + if( Count > 0 ) + SelectedChanged( entries[index].Hash ); + } + + public void SetSelected( string hash ) { + SelectedIndex = -1; + for( int i = 0; i < Count; i++ ) { + if( entries[i].Hash == hash ) { + SetSelected( i ); + return; + } + } + } + public void ClampIndex() { - if( CurrentIndex >= Count - numEntries ) + if( CurrentIndex > Count - numEntries ) CurrentIndex = Count - numEntries; if( CurrentIndex < 0 ) CurrentIndex = 0;