From a4c548cd14a3cc3ecb1afcfcbdff1da3d2ffa470 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Mon, 11 Jan 2016 19:44:50 +1100 Subject: [PATCH] Initial implementation of nostalgia options - can turn off custom blocks, and can turn off using server textures. --- .../2D/Screens/Menu/GuiOptionsScreen.cs | 19 ++-- .../2D/Screens/Menu/NostalgiaScreen.cs | 89 +++++++++++++++++++ .../2D/Screens/Menu/OptionsScreen.cs | 16 ++-- ClassicalSharp/2D/Screens/Menu/PauseScreen.cs | 3 + ClassicalSharp/ClassicalSharp.csproj | 1 + ClassicalSharp/Game/Game.Properties.cs | 2 + ClassicalSharp/Game/Game.cs | 3 + .../Network/NetworkProcessor.CPE.cs | 23 ++++- ClassicalSharp/Network/NetworkProcessor.cs | 4 + ClassicalSharp/Utils/Options.cs | 9 +- 10 files changed, 139 insertions(+), 30 deletions(-) create mode 100644 ClassicalSharp/2D/Screens/Menu/NostalgiaScreen.cs diff --git a/ClassicalSharp/2D/Screens/Menu/GuiOptionsScreen.cs b/ClassicalSharp/2D/Screens/Menu/GuiOptionsScreen.cs index eb1fa8e01..203dbb7a7 100644 --- a/ClassicalSharp/2D/Screens/Menu/GuiOptionsScreen.cs +++ b/ClassicalSharp/2D/Screens/Menu/GuiOptionsScreen.cs @@ -30,10 +30,10 @@ namespace ClassicalSharp { g.RefreshHud(); } ), - Make( -140, 0, "Use classic gui", OnWidgetClick, - g => g.UseClassicGui ? "yes" : "no", - (g, v) => { g.UseClassicGui = v == "yes"; - Options.Set( OptionsKey.UseClassicGui, v == "yes" ); + Make( -140, 0, "Tab auto-complete", OnWidgetClick, + g => g.TabAutocomplete ? "yes" : "no", + (g, v) => { g.TabAutocomplete = v == "yes"; + Options.Set( OptionsKey.TabAutocomplete, v == "yes" ); } ), // Column 2 @@ -73,13 +73,7 @@ namespace ClassicalSharp { g.RefreshHud(); Recreate(); - } ), - - Make( 140, 50, "Tab auto-complete", OnWidgetClick, - g => g.TabAutocomplete ? "yes" : "no", - (g, v) => { g.TabAutocomplete = v == "yes"; - Options.Set( OptionsKey.TabAutocomplete, v == "yes" ); - } ), + } ), MakeBack( false, titleFont, (g, w) => g.SetNewScreen( new PauseScreen( g ) ) ), @@ -93,8 +87,7 @@ namespace ClassicalSharp { new BooleanValidator(), new RealValidator( 0.25f, 5f ), - new IntegerValidator( 1, 30 ), - new BooleanValidator(), + new IntegerValidator( 1, 30 ), new BooleanValidator(), }; okayIndex = buttons.Length - 1; diff --git a/ClassicalSharp/2D/Screens/Menu/NostalgiaScreen.cs b/ClassicalSharp/2D/Screens/Menu/NostalgiaScreen.cs new file mode 100644 index 000000000..c74b34044 --- /dev/null +++ b/ClassicalSharp/2D/Screens/Menu/NostalgiaScreen.cs @@ -0,0 +1,89 @@ +using System; +using System.Drawing; +using ClassicalSharp.Singleplayer; + +namespace ClassicalSharp { + + public sealed class NostalgiaScreen : MenuInputScreen { + + TextWidget infoWidget; + public NostalgiaScreen( Game game ) : base( game ) { + } + + public override void Init() { + base.Init(); + INetworkProcessor network = game.Network; + + buttons = new ButtonWidget[] { + // Column 1 + Make( -140, -100, "Simple arms anim", OnWidgetClick, + g => g.SimpleArmsAnim? "yes" : "no", + (g, v) => { g.SimpleArmsAnim = v == "yes"; + Options.Set( OptionsKey.SimpleArmsAnim, v == "yes" ); }), + + Make( -140, -50, "Use classic gui", OnWidgetClick, + g => g.UseClassicGui ? "yes" : "no", + (g, v) => { g.UseClassicGui = v == "yes"; + Options.Set( OptionsKey.UseClassicGui, v == "yes" ); + } ), + + // Column 2 + Make( 140, -100, "Allow custom blocks", OnWidgetClick, + g => g.AllowCustomBlocks ? "yes" : "no", + (g, v) => { g.AllowCustomBlocks = v == "yes"; + Options.Set( OptionsKey.AllowCustomBlocks, v == "yes" ); + } ), + + Make( 140, -50, "Allow CPE blocks", OnWidgetClick, + g => g.AllowCPEBlocks ? "yes" : "no", + (g, v) => { g.AllowCPEBlocks = v == "yes"; + Options.Set( OptionsKey.AllowCPEBlocks, v == "yes" ); + } ), + + Make( 140, 0, "Allow server textures", OnWidgetClick, + g => g.AllowServerTextures ? "yes" : "no", + (g, v) => { g.AllowServerTextures = v == "yes"; + Options.Set( OptionsKey.AllowServerTextures, v == "yes" ); + } ), + + MakeBack( false, titleFont, + (g, w) => g.SetNewScreen( new PauseScreen( g ) ) ), + null, + }; + buttons[3].Disabled = true; + + validators = new MenuInputValidator[] { + new BooleanValidator(), + new BooleanValidator(), + + new BooleanValidator(), + new BooleanValidator(), + new BooleanValidator(), + }; + okayIndex = buttons.Length - 1; + infoWidget = TextWidget.Create( game, 0, 150, "&eButtons on the right require a client restart.", + Anchor.Centre, Anchor.Centre, regularFont ); + } + + public override void Render( double delta ) { + base.Render( delta ); + graphicsApi.Texturing = true; + infoWidget.Render( delta ); + graphicsApi.Texturing = false; + } + + public override void Dispose() { + base.Dispose(); + infoWidget.Dispose(); + } + + ButtonWidget Make( int x, int y, string text, Action onClick, + Func getter, Action setter ) { + ButtonWidget widget = ButtonWidget.Create( game, x, y, 240, 35, text, Anchor.Centre, + Anchor.Centre, titleFont, onClick ); + widget.GetValue = getter; + widget.SetValue = setter; + return widget; + } + } +} \ No newline at end of file diff --git a/ClassicalSharp/2D/Screens/Menu/OptionsScreen.cs b/ClassicalSharp/2D/Screens/Menu/OptionsScreen.cs index 19600c50e..dbf4dbb5f 100644 --- a/ClassicalSharp/2D/Screens/Menu/OptionsScreen.cs +++ b/ClassicalSharp/2D/Screens/Menu/OptionsScreen.cs @@ -26,24 +26,19 @@ namespace ClassicalSharp { g.AudioPlayer.SetSound( g.UseSound ); Options.Set( OptionsKey.UseSound, v == "yes" ); }), - Make( -140, -100, "Simple arms anim", OnWidgetClick, - g => g.SimpleArmsAnim? "yes" : "no", - (g, v) => { g.SimpleArmsAnim = v == "yes"; - Options.Set( OptionsKey.SimpleArmsAnim, v == "yes" ); }), - - Make( -140, -50, "Names mode", OnWidgetClick, + Make( -140, -100, "Names mode", OnWidgetClick, g => g.Players.NamesMode.ToString(), (g, v) => { object raw = Enum.Parse( typeof(NameMode), v ); g.Players.NamesMode = (NameMode)raw; Options.Set( OptionsKey.NamesMode, v ); } ), - Make( -140, 0, "FPS limit", OnWidgetClick, + Make( -140, -50, "FPS limit", OnWidgetClick, g => g.FpsLimit.ToString(), (g, v) => { object raw = Enum.Parse( typeof(FpsLimitMethod), v ); g.SetFpsLimitMethod( (FpsLimitMethod)raw ); Options.Set( OptionsKey.FpsLimit, v ); } ), - Make( -140, 50, "View distance", OnWidgetClick, + Make( -140, 0, "View distance", OnWidgetClick, g => g.ViewDistance.ToString(), (g, v) => g.SetViewDistance( Int32.Parse( v ), true ) ), @@ -85,13 +80,12 @@ namespace ClassicalSharp { (g, w) => g.SetNewScreen( new PauseScreen( g ) ) ), null, }; - buttons[3].Metadata = typeof(NameMode); - buttons[4].Metadata = typeof(FpsLimitMethod); + buttons[2].Metadata = typeof(NameMode); + buttons[3].Metadata = typeof(FpsLimitMethod); validators = new MenuInputValidator[] { network.IsSinglePlayer ? new RealValidator(1, 1024) : null, new BooleanValidator(), - new BooleanValidator(), new EnumValidator(), new EnumValidator(), new IntegerValidator( 16, 4096 ), diff --git a/ClassicalSharp/2D/Screens/Menu/PauseScreen.cs b/ClassicalSharp/2D/Screens/Menu/PauseScreen.cs index 127f6055c..60c529ded 100644 --- a/ClassicalSharp/2D/Screens/Menu/PauseScreen.cs +++ b/ClassicalSharp/2D/Screens/Menu/PauseScreen.cs @@ -46,6 +46,9 @@ namespace ClassicalSharp { Make( 140, 50, "Hotkeys", Anchor.Centre, (g, w) => g.SetNewScreen( new HotkeyScreen( g ) ) ), + Make( 0, 100, "Nostalgia options", Anchor.Centre, + (g, w) => g.SetNewScreen( new NostalgiaScreen( g ) ) ), + // Other MakeOther( 10, 5, 120, "Quit game", Anchor.BottomOrRight, (g, w) => g.Exit() ), diff --git a/ClassicalSharp/ClassicalSharp.csproj b/ClassicalSharp/ClassicalSharp.csproj index 5100e6df1..15053d1ea 100644 --- a/ClassicalSharp/ClassicalSharp.csproj +++ b/ClassicalSharp/ClassicalSharp.csproj @@ -103,6 +103,7 @@ + diff --git a/ClassicalSharp/Game/Game.Properties.cs b/ClassicalSharp/Game/Game.Properties.cs index fc1460e20..b5a386171 100644 --- a/ClassicalSharp/Game/Game.Properties.cs +++ b/ClassicalSharp/Game/Game.Properties.cs @@ -129,6 +129,8 @@ namespace ClassicalSharp { public bool TabAutocomplete = false; + public bool AllowCustomBlocks, AllowCPEBlocks, AllowServerTextures; + public int ChatLines = 12; public bool ClickableChat = false, HideGui = false, ShowFPS = true; internal float HudScale = 1.0f, ChatScale = 1.0f; diff --git a/ClassicalSharp/Game/Game.cs b/ClassicalSharp/Game/Game.cs index e4f401f2d..ed22abdf1 100644 --- a/ClassicalSharp/Game/Game.cs +++ b/ClassicalSharp/Game/Game.cs @@ -59,6 +59,9 @@ namespace ClassicalSharp { MouseSensitivity = Options.GetInt( OptionsKey.Sensitivity, 1, 100, 30 ); UseClassicGui = Options.GetBool( OptionsKey.UseClassicGui, true ); TabAutocomplete = Options.GetBool( OptionsKey.TabAutocomplete, false ); + AllowCustomBlocks = Options.GetBool( OptionsKey.AllowCustomBlocks, true ); + AllowCPEBlocks = Options.GetBool( OptionsKey.AllowCPEBlocks, true ); + AllowServerTextures = Options.GetBool( OptionsKey.AllowServerTextures, true ); BlockInfo = new BlockInfo(); BlockInfo.Init(); diff --git a/ClassicalSharp/Network/NetworkProcessor.CPE.cs b/ClassicalSharp/Network/NetworkProcessor.CPE.cs index 4d0aaf93c..e713753ae 100644 --- a/ClassicalSharp/Network/NetworkProcessor.CPE.cs +++ b/ClassicalSharp/Network/NetworkProcessor.CPE.cs @@ -105,15 +105,19 @@ namespace ClassicalSharp { } void SendCpeExtInfoReply() { - if( cpeServerExtensionsCount != 0) - return; - MakeExtInfo( Program.AppName, clientExtensions.Length ); + if( cpeServerExtensionsCount != 0 ) return; + int count = clientExtensions.Length; + if( !game.AllowCustomBlocks ) count -= 2; + MakeExtInfo( Program.AppName, count ); SendPacket(); + for( int i = 0; i < clientExtensions.Length; i++ ) { string name = clientExtensions[i]; int ver = name == "ExtPlayerList" ? 2 : 1; if( name == "EnvMapAppearance" ) ver = envMapApperanceVer; + if( !game.AllowCustomBlocks && name.StartsWith( "BlockDefinitions" ) ) + continue; MakeExtEntry( name, ver ); SendPacket(); } @@ -300,7 +304,9 @@ namespace ClassicalSharp { string url = reader.ReadAsciiString(); game.Map.SetSidesBlock( (Block)reader.ReadUInt8() ); game.Map.SetEdgeBlock( (Block)reader.ReadUInt8() ); - game.Map.SetEdgeLevel( reader.ReadInt16() ); + game.Map.SetEdgeLevel( reader.ReadInt16() ); + if( !game.AllowServerTextures ) + return; if( url == String.Empty ) { TexturePackExtractor extractor = new TexturePackExtractor(); @@ -386,6 +392,9 @@ namespace ClassicalSharp { } void HandleCpeDefineBlock() { + if( !game.AllowCustomBlocks ) { + SkipPacketData( PacketId.CpeDefineBlock ); return; + } byte block = HandleCpeDefineBlockCommonStart(); BlockInfo info = game.BlockInfo; byte shape = reader.ReadUInt8(); @@ -408,11 +417,17 @@ namespace ClassicalSharp { } void HandleCpeRemoveBlockDefinition() { + if( !game.AllowCustomBlocks ) { + SkipPacketData( PacketId.CpeRemoveBlockDefinition ); return; + } game.BlockInfo.ResetBlockInfo( reader.ReadUInt8(), true ); game.BlockInfo.InitLightOffsets(); } void HandleCpeDefineBlockExt() { + if( !game.AllowCustomBlocks ) { + SkipPacketData( PacketId.CpeDefineBlockExt ); return; + } byte block = HandleCpeDefineBlockCommonStart(); BlockInfo info = game.BlockInfo; Vector3 min, max; diff --git a/ClassicalSharp/Network/NetworkProcessor.cs b/ClassicalSharp/Network/NetworkProcessor.cs index 39c6e69ea..33ec4a9ca 100644 --- a/ClassicalSharp/Network/NetworkProcessor.cs +++ b/ClassicalSharp/Network/NetworkProcessor.cs @@ -192,6 +192,10 @@ namespace ClassicalSharp { handler(); } + void SkipPacketData( PacketId opcode ) { + reader.Remove( packetSizes[(byte)opcode] - 1 ); + } + Action[] handlers; int maxHandledPacket; diff --git a/ClassicalSharp/Utils/Options.cs b/ClassicalSharp/Utils/Options.cs index 05201f930..b477ab4b7 100644 --- a/ClassicalSharp/Utils/Options.cs +++ b/ClassicalSharp/Utils/Options.cs @@ -8,6 +8,7 @@ using OpenTK.Input; namespace ClassicalSharp { public static class OptionsKey { + public const string ViewDist = "viewdist"; public const string HudScale = "hudscale"; public const string ChatScale = "chatscale"; @@ -23,7 +24,6 @@ namespace ClassicalSharp { public const string UseSound = "usesound"; public const string HacksEnabled = "hacksenabled"; public const string NamesMode = "namesmode"; - public const string SimpleArmsAnim = "simplearmsanim"; public const string MouseLeft = "mouseleft"; public const string MouseMiddle = "mousemiddle"; @@ -37,9 +37,14 @@ namespace ClassicalSharp { public const string InvertMouse = "invertmouse"; public const string NoclipSlide = "noclipslide"; public const string CameraClipping = "cameraclipping"; - public const string UseClassicGui = "useclassictex"; public const string DoubleJump = "doublejump"; public const string TabAutocomplete = "tab-autocomplete"; + + public const string AllowCustomBlocks = "nostalgia-customblocks"; + public const string AllowCPEBlocks = "nostalgia-cpeblocks"; + public const string AllowServerTextures = "nostalgia-servertextures"; + public const string UseClassicGui = "nostalgia-classicgui"; + public const string SimpleArmsAnim = "nostalgia-simplearms"; } // TODO: implement this