From dc5a29e9f15e45612137c0c05056f0f3b3e4debd Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Mon, 5 Oct 2015 16:57:39 +1100 Subject: [PATCH] Move CloudsLevel to map class, simplify various map set methods, reset texture pack to default if we can't download the .png or .zip., fixes #90. --- .../2D/Screens/Menu/EnvSettingsScreen.cs | 7 +- ClassicalSharp/Game/Events.cs | 13 ++-- ClassicalSharp/Map/Map.cs | 67 ++++++++----------- .../Network/NetworkProcessor.CPE.cs | 14 ++-- ClassicalSharp/Network/NetworkProcessor.cs | 24 ++++--- ClassicalSharp/Rendering/EnvRenderer.cs | 16 +---- ClassicalSharp/Rendering/MapEnvRenderer.cs | 10 +-- ClassicalSharp/Rendering/MapRenderer.cs | 6 +- .../Rendering/MinimalEnvRenderer.cs | 11 ++- .../Rendering/StandardEnvRenderer.cs | 34 ++++------ ClassicalSharp/Utils/FastColour.cs | 2 +- 11 files changed, 90 insertions(+), 114 deletions(-) diff --git a/ClassicalSharp/2D/Screens/Menu/EnvSettingsScreen.cs b/ClassicalSharp/2D/Screens/Menu/EnvSettingsScreen.cs index 3caad2b43..ff2f7cb3b 100644 --- a/ClassicalSharp/2D/Screens/Menu/EnvSettingsScreen.cs +++ b/ClassicalSharp/2D/Screens/Menu/EnvSettingsScreen.cs @@ -33,11 +33,8 @@ namespace ClassicalSharp { env.CloudsSpeed = Single.Parse( v ); } ), Make( -140, 50, "Clouds offset", Docking.Centre, OnWidgetClick, - g => { StandardEnvRenderer env = game.EnvRenderer as StandardEnvRenderer; - return env == null ? "(not active)" : env.CloudsOffset.ToString(); }, - (g, v) => { StandardEnvRenderer env = game.EnvRenderer as StandardEnvRenderer; - if( env != null ) - env.SetCloudsOffset( Int32.Parse( v ) ); } ), + g => (g.Map.CloudHeight - g.Map.Height).ToString(), + (g, v) => g.Map.SetCloudsLevel( g.Map.Height + Int32.Parse( v ) ) ), Make( 140, -150, "Sunlight colour", Docking.Centre, OnWidgetClick, g => g.Map.Sunlight.ToRGBHexString(), diff --git a/ClassicalSharp/Game/Events.cs b/ClassicalSharp/Game/Events.cs index be74d7756..500dab5d4 100644 --- a/ClassicalSharp/Game/Events.cs +++ b/ClassicalSharp/Game/Events.cs @@ -43,8 +43,8 @@ namespace ClassicalSharp { internal void RaiseTerrainAtlasChanged() { Raise( TerrainAtlasChanged ); } /// Raised when an environment variable is changed by the user, CPE, or WoM config. - public event EventHandler EnvVariableChanged; - internal void RaiseEnvVariableChanged( EnvVariable envVar ) { envArgs.Var = envVar; Raise( EnvVariableChanged, envArgs ); } + public event EventHandler EnvVariableChanged; + internal void RaiseEnvVariableChanged( EnvVar envVar ) { envArgs.Var = envVar; Raise( EnvVariableChanged, envArgs ); } /// Raised when the user changed their view/fog distance. public event EventHandler ViewDistanceChanged; @@ -71,7 +71,7 @@ namespace ClassicalSharp { // Cache event instances so we don't create needless new objects. IdEventArgs idArgs = new IdEventArgs(); MapLoadingEventArgs loadingArgs = new MapLoadingEventArgs(); - EnvVariableEventArgs envArgs = new EnvVariableEventArgs(); + EnvVarEventArgs envArgs = new EnvVarEventArgs(); ChatEventArgs chatArgs = new ChatEventArgs(); void Raise( EventHandler handler ) { @@ -104,15 +104,16 @@ namespace ClassicalSharp { public int Progress; } - public sealed class EnvVariableEventArgs : EventArgs { + public sealed class EnvVarEventArgs : EventArgs { - public EnvVariable Var; + public EnvVar Var; } - public enum EnvVariable { + public enum EnvVar { SidesBlock, EdgeBlock, WaterLevel, + CloudsLevel, Weather, SkyColour, diff --git a/ClassicalSharp/Map/Map.cs b/ClassicalSharp/Map/Map.cs index 94958184c..37966e548 100644 --- a/ClassicalSharp/Map/Map.cs +++ b/ClassicalSharp/Map/Map.cs @@ -25,6 +25,7 @@ namespace ClassicalSharp { public FastColour Shadowlight, ShadowlightXSide, ShadowlightZSide, ShadowlightYBottom; public Weather Weather = Weather.Sunny; public Guid Uuid; + public int CloudHeight; public int GroundHeight { get { return WaterHeight - 2; } @@ -43,17 +44,18 @@ namespace ClassicalSharp { public void Reset() { WaterHeight = -1; - SetShadowlight( DefaultShadowlight ); - SetSunlight( DefaultSunlight ); + CloudHeight = -1; Width = Height = Length = 0; + Uuid = Guid.NewGuid(); EdgeBlock = Block.StillWater; SidesBlock = Block.Bedrock; + + SetShadowlight( DefaultShadowlight ); + SetSunlight( DefaultSunlight ); SkyCol = DefaultSkyColour; FogCol = DefaultFogColour; CloudsCol = DefaultCloudsColour; Weather = Weather.Sunny; - Uuid = Guid.NewGuid(); - game.Events.RaiseOnNewMap(); } @@ -64,7 +66,7 @@ namespace ClassicalSharp { block = Block.Bedrock; } SidesBlock = block; - game.Events.RaiseEnvVariableChanged( EnvVariable.SidesBlock ); + game.Events.RaiseEnvVariableChanged( EnvVar.SidesBlock ); } public void SetEdgeBlock( Block block ) { @@ -74,51 +76,39 @@ namespace ClassicalSharp { block = Block.StillWater; } EdgeBlock = block; - game.Events.RaiseEnvVariableChanged( EnvVariable.EdgeBlock ); + game.Events.RaiseEnvVariableChanged( EnvVar.EdgeBlock ); } - public void SetWaterLevel( int level ) { - if( level == WaterHeight ) return; - WaterHeight = level; - game.Events.RaiseEnvVariableChanged( EnvVariable.WaterLevel ); - } + public void SetCloudsLevel( int level ) { Set( level, ref CloudHeight, EnvVar.CloudsLevel ); } - public void SetWeather( Weather weather ) { - if( weather == Weather ) return; - Weather = weather; - game.Events.RaiseEnvVariableChanged( EnvVariable.Weather ); - } + public void SetWaterLevel( int level ) { Set( level, ref WaterHeight, EnvVar.WaterLevel ); } - public void SetSkyColour( FastColour col ) { - if( col == SkyCol ) return; - SkyCol = col; - game.Events.RaiseEnvVariableChanged( EnvVariable.SkyColour ); - } + public void SetSkyColour( FastColour col ) { Set( col, ref SkyCol, EnvVar.SkyColour ); } - public void SetFogColour( FastColour col ) { - if( col == FogCol ) return; - FogCol = col; - game.Events.RaiseEnvVariableChanged( EnvVariable.FogColour ); - } + public void SetFogColour( FastColour col ) { Set( col, ref FogCol, EnvVar.FogColour ); } - public void SetCloudsColour( FastColour col ) { - if( col == CloudsCol ) return; - CloudsCol = col; - game.Events.RaiseEnvVariableChanged( EnvVariable.CloudsColour ); - } + public void SetCloudsColour( FastColour col ) { Set( col, ref CloudsCol, EnvVar.CloudsColour ); } - public void SetSunlight( FastColour col ) { - if( col == Sunlight ) return; - Sunlight = col; + public void SetSunlight( FastColour col ) { + Set( col, ref Sunlight, EnvVar.SunlightColour ); AdjustLight( Sunlight, ref SunlightXSide, ref SunlightZSide, ref SunlightYBottom ); - game.Events.RaiseEnvVariableChanged( EnvVariable.SunlightColour ); } public void SetShadowlight( FastColour col ) { - if( col == Shadowlight ) return; - Shadowlight = col; + Set( col, ref Shadowlight, EnvVar.ShadowlightColour ); AdjustLight( Shadowlight, ref ShadowlightXSide, ref ShadowlightZSide, ref ShadowlightYBottom ); - game.Events.RaiseEnvVariableChanged( EnvVariable.ShadowlightColour ); + } + + public void SetWeather( Weather weather ) { + if( weather == Weather ) return; + Weather = weather; + game.Events.RaiseEnvVariableChanged( EnvVar.Weather ); + } + + void Set( T value, ref T target, EnvVar var ) where T : IEquatable { + if( value.Equals( target ) ) return; + target = value; + game.Events.RaiseEnvVariableChanged( var ); } public int GetLightHeight( int x, int z ) { @@ -178,6 +168,7 @@ namespace ClassicalSharp { if( WaterHeight == -1 ) WaterHeight = height / 2; maxY = height - 1; oneY = length * width; + if( CloudHeight == -1 ) CloudHeight = height + 2; heightmap = new short[width * length]; for( int i = 0; i < heightmap.Length; i++ ) { diff --git a/ClassicalSharp/Network/NetworkProcessor.CPE.cs b/ClassicalSharp/Network/NetworkProcessor.CPE.cs index e4331095a..ea12318c5 100644 --- a/ClassicalSharp/Network/NetworkProcessor.CPE.cs +++ b/ClassicalSharp/Network/NetworkProcessor.CPE.cs @@ -80,6 +80,7 @@ namespace ClassicalSharp { UsingPlayerClick = true; } else if( extName == "EnvMapAppearance" && extVersion == 2 ) { usingTexturePack = true; + packetSizes[(int)PacketId.CpeEnvSetMapApperance] += 4; } cpeServerExtensionsCount--; @@ -235,12 +236,13 @@ namespace ClassicalSharp { void HandleCpeEnvSetMapApperance() { string url = reader.ReadAsciiString(); - byte sideBlock = reader.ReadUInt8(); - byte edgeBlock = reader.ReadUInt8(); - short waterLevel = reader.ReadInt16(); - game.Map.SetWaterLevel( waterLevel ); - game.Map.SetEdgeBlock( (Block)edgeBlock ); - game.Map.SetSidesBlock( (Block)sideBlock ); + game.Map.SetSidesBlock( (Block)reader.ReadUInt8() ); + game.Map.SetEdgeBlock( (Block)reader.ReadUInt8() ); + game.Map.SetWaterLevel( reader.ReadInt16() ); + if( usingTexturePack ) { + game.Map.SetCloudsLevel( reader.ReadInt16() ); + short maxViewDist = reader.ReadInt16(); // TODO: what to do with this? + } if( url == String.Empty ) { TexturePackExtractor extractor = new TexturePackExtractor(); diff --git a/ClassicalSharp/Network/NetworkProcessor.cs b/ClassicalSharp/Network/NetworkProcessor.cs index f1e36f861..929b505a7 100644 --- a/ClassicalSharp/Network/NetworkProcessor.cs +++ b/ClassicalSharp/Network/NetworkProcessor.cs @@ -73,14 +73,22 @@ namespace ClassicalSharp { void CheckForNewTerrainAtlas() { DownloadedItem item; - game.AsyncDownloader.TryGetItem( "terrain", out item ); - if( item != null && item.Data != null ) { - game.ChangeTerrainAtlas( (Bitmap)item.Data ); + if( game.AsyncDownloader.TryGetItem( "terrain", out item ) ) { + if( item.Data != null ) { + game.ChangeTerrainAtlas( (Bitmap)item.Data ); + } else { + TexturePackExtractor extractor = new TexturePackExtractor(); + extractor.Extract( game.defaultTexPack, game ); + } } - game.AsyncDownloader.TryGetItem( "texturePack", out item ); - if( item != null && item.Data != null ) { + + if( game.AsyncDownloader.TryGetItem( "texturePack", out item ) ) { TexturePackExtractor extractor = new TexturePackExtractor(); - extractor.Extract( (byte[])item.Data, game ); + if( item.Data != null ) { + extractor.Extract( (byte[])item.Data, game ); + } else { + extractor.Extract( game.defaultTexPack, game ); + } } } @@ -444,14 +452,14 @@ namespace ClassicalSharp { HandleLevelDataChunk, HandleLevelFinalise, null, HandleSetBlock, HandleAddEntity, HandleEntityTeleport, HandleRelPosAndOrientationUpdate, HandleRelPositionUpdate, HandleOrientationUpdate, HandleRemoveEntity, - HandleMessage, HandleKick, HandleSetPermission, + HandleMessage, HandleKick, HandleSetPermission, HandleCpeExtInfo, HandleCpeExtEntry, HandleCpeSetClickDistance, HandleCpeCustomBlockSupportLevel, HandleCpeHoldThis, null, HandleCpeExtAddPlayerName, HandleCpeExtAddEntity, HandleCpeExtRemovePlayerName, HandleCpeEnvColours, HandleCpeMakeSelection, HandleCpeRemoveSelection, HandleCpeSetBlockPermission, HandleCpeChangeModel, HandleCpeEnvSetMapApperance, - HandleCpeEnvWeatherType, HandleCpeHackControl, HandleCpeExtAddEntity2, + HandleCpeEnvWeatherType, HandleCpeHackControl, HandleCpeExtAddEntity2, null, HandleCpeDefineBlock, HandleCpeRemoveBlockDefinition, }; maxHandledPacket = handlers.Length; diff --git a/ClassicalSharp/Rendering/EnvRenderer.cs b/ClassicalSharp/Rendering/EnvRenderer.cs index d6d722619..fa2e4cf77 100644 --- a/ClassicalSharp/Rendering/EnvRenderer.cs +++ b/ClassicalSharp/Rendering/EnvRenderer.cs @@ -30,20 +30,6 @@ namespace ClassicalSharp.Renderers { public abstract void Render( double deltaTime ); - void EnvVariableChanged( object sender, EnvVariableEventArgs e ) { - if( e.Var == EnvVariable.SkyColour ) { - SkyColourChanged(); - } else if( e.Var == EnvVariable.FogColour ) { - FogColourChanged(); - } else if( e.Var == EnvVariable.CloudsColour ) { - CloudsColourChanged(); - } - } - - protected abstract void SkyColourChanged(); - - protected abstract void FogColourChanged(); - - protected abstract void CloudsColourChanged(); + protected abstract void EnvVariableChanged( object sender, EnvVarEventArgs e ); } } diff --git a/ClassicalSharp/Rendering/MapEnvRenderer.cs b/ClassicalSharp/Rendering/MapEnvRenderer.cs index b012d865c..b6acf4f42 100644 --- a/ClassicalSharp/Rendering/MapEnvRenderer.cs +++ b/ClassicalSharp/Rendering/MapEnvRenderer.cs @@ -87,14 +87,14 @@ namespace ClassicalSharp { RebuildEdges( map.WaterHeight, legacy ? 128 : 65536 ); } - void EnvVariableChanged( object sender, EnvVariableEventArgs e ) { - if( e.Var == EnvVariable.EdgeBlock ) { + void EnvVariableChanged( object sender, EnvVarEventArgs e ) { + if( e.Var == EnvVar.EdgeBlock ) { MakeTexture( ref edgeTexId, ref lastEdgeTexLoc, map.EdgeBlock ); - } else if( e.Var == EnvVariable.SidesBlock ) { + } else if( e.Var == EnvVar.SidesBlock ) { MakeTexture( ref sideTexId, ref lastSideTexLoc, map.SidesBlock ); - } else if( e.Var == EnvVariable.WaterLevel ) { + } else if( e.Var == EnvVar.WaterLevel ) { ResetSidesAndEdges( null, null ); - } else if( e.Var == EnvVariable.SunlightColour ) { + } else if( e.Var == EnvVar.SunlightColour ) { ResetSidesAndEdges( null, null ); } } diff --git a/ClassicalSharp/Rendering/MapRenderer.cs b/ClassicalSharp/Rendering/MapRenderer.cs index 87fc88de7..4dcadb3b2 100644 --- a/ClassicalSharp/Rendering/MapRenderer.cs +++ b/ClassicalSharp/Rendering/MapRenderer.cs @@ -74,10 +74,10 @@ namespace ClassicalSharp { chunkPos = new Vector3I( int.MaxValue, int.MaxValue, int.MaxValue ); } - void EnvVariableChanged( object sender, EnvVariableEventArgs e ) { - if( e.Var == EnvVariable.SunlightColour || e.Var == EnvVariable.ShadowlightColour ) { + void EnvVariableChanged( object sender, EnvVarEventArgs e ) { + if( e.Var == EnvVar.SunlightColour || e.Var == EnvVar.ShadowlightColour ) { Refresh(); - } else if( e.Var == EnvVariable.WaterLevel ) { + } else if( e.Var == EnvVar.WaterLevel ) { builder.clipLevel = Math.Max( 0, game.Map.GroundHeight ); Refresh(); } diff --git a/ClassicalSharp/Rendering/MinimalEnvRenderer.cs b/ClassicalSharp/Rendering/MinimalEnvRenderer.cs index 90e41e9e3..c65b0ed7f 100644 --- a/ClassicalSharp/Rendering/MinimalEnvRenderer.cs +++ b/ClassicalSharp/Rendering/MinimalEnvRenderer.cs @@ -28,13 +28,10 @@ namespace ClassicalSharp.Renderers { graphics.ClearColour( map.SkyCol ); } - protected override void CloudsColourChanged() { - } - - protected override void FogColourChanged() { - } - - protected override void SkyColourChanged() { + protected override void EnvVariableChanged( object sender, EnvVarEventArgs e ) { + if( e.Var == EnvVar.SkyColour ) { + graphics.ClearColour( map.SkyCol ); + } } } } diff --git a/ClassicalSharp/Rendering/StandardEnvRenderer.cs b/ClassicalSharp/Rendering/StandardEnvRenderer.cs index c5ff7d595..a390f7ea4 100644 --- a/ClassicalSharp/Rendering/StandardEnvRenderer.cs +++ b/ClassicalSharp/Rendering/StandardEnvRenderer.cs @@ -14,15 +14,8 @@ namespace ClassicalSharp.Renderers { int cloudsVb = -1, cloudsIndices, skyVb = -1, skyIndices; public float CloudsSpeed = 1; - public int CloudsOffset = 2; bool legacy; - public void SetCloudsOffset( int offset ) { - CloudsOffset = offset; - ResetClouds(); - ResetSky(); - } - public void SetUseLegacyMode( bool legacy ) { this.legacy = legacy; ResetSky(); @@ -33,7 +26,7 @@ namespace ClassicalSharp.Renderers { if( skyVb == -1 || cloudsVb == -1 ) return; Vector3 pos = game.LocalPlayer.EyePosition; - if( pos.Y < map.Height + CloudsOffset + 8 ) { + if( pos.Y < map.CloudHeight + 8 ) { graphics.BeginVbBatch( VertexFormat.Pos3fCol4b ); graphics.BindVb( skyVb ); graphics.DrawIndexedVb( DrawMode.Triangles, skyIndices, 0 ); @@ -42,16 +35,17 @@ namespace ClassicalSharp.Renderers { ResetFog(); } - protected override void CloudsColourChanged() { - ResetClouds(); - } - - protected override void FogColourChanged() { - ResetFog(); - } - - protected override void SkyColourChanged() { - ResetSky(); + protected override void EnvVariableChanged( object sender, EnvVarEventArgs e ) { + if( e.Var == EnvVar.SkyColour ) { + ResetSky(); + } else if( e.Var == EnvVar.FogColour ) { + ResetFog(); + } else if( e.Var == EnvVar.CloudsColour ) { + ResetClouds(); + } else if( e.Var == EnvVar.CloudsLevel ) { + ResetSky(); + ResetClouds(); + } } public override void OnNewMap( object sender, EventArgs e ) { @@ -160,7 +154,7 @@ namespace ClassicalSharp.Renderers { cloudsIndices = Utils.CountIndices( x2 - x1, z2 - z1, axisSize ); VertexPos3fTex2fCol4b* vertices = stackalloc VertexPos3fTex2fCol4b[cloudsIndices / 6 * 4]; - DrawCloudsY( x1, z1, x2, z2, map.Height + CloudsOffset, axisSize, map.CloudsCol, vertices ); + DrawCloudsY( x1, z1, x2, z2, map.CloudHeight, axisSize, map.CloudsCol, vertices ); cloudsVb = graphics.CreateVb( (IntPtr)vertices, VertexFormat.Pos3fTex2fCol4b, cloudsIndices / 6 * 4 ); } @@ -170,7 +164,7 @@ namespace ClassicalSharp.Renderers { skyIndices = Utils.CountIndices( x2 - x1, z2 - z1, axisSize ); VertexPos3fCol4b* vertices = stackalloc VertexPos3fCol4b[skyIndices / 6 * 4]; - DrawSkyY( x1, z1, x2, z2, map.Height + CloudsOffset + 8, axisSize, map.SkyCol, vertices ); + DrawSkyY( x1, z1, x2, z2, map.CloudHeight + 8, axisSize, map.SkyCol, vertices ); skyVb = graphics.CreateVb( (IntPtr)vertices, VertexFormat.Pos3fCol4b, skyIndices / 6 * 4 ); } diff --git a/ClassicalSharp/Utils/FastColour.cs b/ClassicalSharp/Utils/FastColour.cs index 6ce240f82..1d1ae1e1c 100644 --- a/ClassicalSharp/Utils/FastColour.cs +++ b/ClassicalSharp/Utils/FastColour.cs @@ -5,7 +5,7 @@ namespace ClassicalSharp { /// Structure that can be used for quick manipulations of A/R/G/B colours. /// This structure is **not** suitable for interop with OpenGL or Direct3D. - public struct FastColour { + public struct FastColour : IEquatable { public byte A, R, G, B;