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 );
}