diff --git a/ClassicalSharp/2D/Widgets/Chat/AltTextInputWidget.Types.cs b/ClassicalSharp/2D/Widgets/Chat/AltTextInputWidget.Types.cs index f0d136487..7a358582f 100644 --- a/ClassicalSharp/2D/Widgets/Chat/AltTextInputWidget.Types.cs +++ b/ClassicalSharp/2D/Widgets/Chat/AltTextInputWidget.Types.cs @@ -9,7 +9,7 @@ namespace ClassicalSharp { void InitData() { elements = new Element[] { - new Element( "Colours", 8 * 3, 3, "&0█&1█&2█&3█&4█&5█&6█&7█&8█&9█&a█&b█&c█&d█&e█&f█" ), + new Element( "Colours", 10, 4, GetColourString() ), new Element( "Math", 16, 1, "ƒ½¼αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°√ⁿ²" ), new Element( "Line/Box", 17, 1, "░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀■" ), new Element( "Letters", 17, 1, "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜáíóúñÑ" ), @@ -17,6 +17,25 @@ namespace ClassicalSharp { }; } + string GetColourString() { + int count = 0; + for( int i = 0; i < game.Drawer2D.Colours.Length; i++ ) { + if( i >= 'A' && i <= 'F' ) continue; + if( game.Drawer2D.Colours[i].A > 0 ) count++; + } + + StringBuffer buffer = new StringBuffer( count * 4 ); + int index = 0; + for( int i = 0; i < game.Drawer2D.Colours.Length; i++ ) { + if( i >= 'A' && i <= 'F' ) continue; + if( game.Drawer2D.Colours[i].A == 0 ) continue; + + buffer.Append( ref index, '&' ).Append( ref index, (char)i ) + .Append( ref index, '%' ).Append( ref index, (char)i ); + } + return buffer.ToString(); + } + struct Element { public string Title; public Size TitleSize; @@ -47,15 +66,14 @@ namespace ClassicalSharp { } unsafe Size CalculateContentSize( Element e, Size* sizes, out Size elemSize ) { - int wrap = e.ItemsPerRow / e.CharsPerItem; elemSize = Size.Empty; for( int i = 0; i < e.Contents.Length; i += e.CharsPerItem ) elemSize.Width = Math.Max( elemSize.Width, sizes[i / e.CharsPerItem].Width ); elemSize.Width += contentSpacing; elemSize.Height = sizes[0].Height + contentSpacing; - int rows = Utils.CeilDiv( e.Contents.Length / e.CharsPerItem, wrap ); - return new Size( elemSize.Width * wrap, elemSize.Height * rows ); + int rows = Utils.CeilDiv( e.Contents.Length / e.CharsPerItem, e.ItemsPerRow ); + return new Size( elemSize.Width * e.ItemsPerRow, elemSize.Height * rows ); } const int titleSpacing = 10, contentSpacing = 5; diff --git a/ClassicalSharp/2D/Widgets/Chat/AltTextInputWidget.cs b/ClassicalSharp/2D/Widgets/Chat/AltTextInputWidget.cs index 7bdb84b53..8b00e1f58 100644 --- a/ClassicalSharp/2D/Widgets/Chat/AltTextInputWidget.cs +++ b/ClassicalSharp/2D/Widgets/Chat/AltTextInputWidget.cs @@ -12,7 +12,10 @@ namespace ClassicalSharp { this.font = font; this.parent = parent; Active = false; + game.Events.ColourCodesChanged += ColourCodesChanged; } + + void ColourCodesChanged( object sender, EventArgs e ) { Redraw(); } public Texture texture; readonly Font font; @@ -66,6 +69,7 @@ namespace ClassicalSharp { mouseX -= X; mouseY -= Y; if( IntersectsHeader( mouseX, mouseY ) ) { Dispose(); + game.Events.ColourCodesChanged += ColourCodesChanged; Redraw(); } else { IntersectsBody( mouseX, mouseY ); @@ -105,6 +109,7 @@ namespace ClassicalSharp { public override void Dispose() { graphicsApi.DeleteTexture( ref texture ); + game.Events.ColourCodesChanged -= ColourCodesChanged; } } } \ No newline at end of file diff --git a/ClassicalSharp/Events/Events.cs b/ClassicalSharp/Events/Events.cs index 1330145ca..aab5949cb 100644 --- a/ClassicalSharp/Events/Events.cs +++ b/ClassicalSharp/Events/Events.cs @@ -38,6 +38,10 @@ namespace ClassicalSharp { /// Raised when the hack permissions of the player changes. public event EventHandler HackPermissionsChanged; internal void RaiseHackPermissionsChanged() { Raise( HackPermissionsChanged ); } + + /// Raised when the colour codes usable by the player changes. + public event EventHandler ColourCodesChanged; + internal void RaiseColourCodesChanged() { Raise( ColourCodesChanged ); } ChatEventArgs chatArgs = new ChatEventArgs(); protected void Raise( EventHandler handler ) { diff --git a/ClassicalSharp/Network/NetworkProcessor.CPE.cs b/ClassicalSharp/Network/NetworkProcessor.CPE.cs index 3509b7f15..75a9fe230 100644 --- a/ClassicalSharp/Network/NetworkProcessor.CPE.cs +++ b/ClassicalSharp/Network/NetworkProcessor.CPE.cs @@ -536,6 +536,7 @@ namespace ClassicalSharp { if( (code >= '0' && code <= '9') || (code >= 'a' && code <= 'f') || (code >= 'A' && code <= 'F') ) return; // Standard chars cannot be used. game.Drawer2D.Colours[code] = col; + game.Events.RaiseColourCodesChanged(); } static SoundType[] stepSnds, breakSnds; diff --git a/ClassicalSharp/Singleplayer/Server.cs b/ClassicalSharp/Singleplayer/Server.cs index 790ab2af9..e19749dfc 100644 --- a/ClassicalSharp/Singleplayer/Server.cs +++ b/ClassicalSharp/Singleplayer/Server.cs @@ -39,17 +39,16 @@ namespace ClassicalSharp.Singleplayer { } public override void SendChat( string text, bool partial ) { - if( !String.IsNullOrEmpty( text ) ) { - text = text.TrimEnd(); - game.Chat.Add( text, MessageType.Normal ); - } + if( String.IsNullOrEmpty( text ) ) return; + text = text.TrimEnd().Replace( '%', '&' ); + game.Chat.Add( text, MessageType.Normal ); } public override void SendPosition( Vector3 pos, float yaw, float pitch ) { } public override void SendSetBlock( int x, int y, int z, bool place, byte block ) { - if( place ) + if( place ) physics.OnBlockPlaced( x, y, z, block ); } @@ -75,9 +74,9 @@ namespace ClassicalSharp.Singleplayer { screen.SetProgress( progress ); if( state != lastState ) { - lastState = state; - screen.SetMessage( state ); - } + lastState = state; + screen.SetMessage( state ); + } } } @@ -99,12 +98,12 @@ namespace ClassicalSharp.Singleplayer { game.Chat.Add( "&ePlaying single player", MessageType.Status1 ); GC.Collect(); } - + internal void GenMap( int width, int height, int length, int seed, IMapGenerator generator ) { game.Map.Reset(); GC.Collect(); 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 ); }