From 5d401d66cee8c64566ad3f0bebc2465babce3e87 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Sun, 1 Apr 2018 13:10:38 +1000 Subject: [PATCH] Implement FastMap CPE extension --- .../2D/Screens/{ => Menu}/ClickableScreen.cs | 0 .../2D/Screens/Menu/HotkeyListScreen.cs | 2 +- .../Menu/{FilesScreen.cs => ListScreen.cs} | 4 ++-- .../2D/Screens/Menu/LoadLevelScreen.cs | 2 +- .../2D/Screens/Menu/TexturePackScreen.cs | 2 +- ClassicalSharp/ClassicalSharp.csproj | 6 +++--- ClassicalSharp/Network/CPESupport.cs | 13 ++++++++----- ClassicalSharp/Network/Protocols/Classic.cs | 19 +++++++++++++++++-- 8 files changed, 33 insertions(+), 15 deletions(-) rename ClassicalSharp/2D/Screens/{ => Menu}/ClickableScreen.cs (100%) rename ClassicalSharp/2D/Screens/Menu/{FilesScreen.cs => ListScreen.cs} (97%) diff --git a/ClassicalSharp/2D/Screens/ClickableScreen.cs b/ClassicalSharp/2D/Screens/Menu/ClickableScreen.cs similarity index 100% rename from ClassicalSharp/2D/Screens/ClickableScreen.cs rename to ClassicalSharp/2D/Screens/Menu/ClickableScreen.cs diff --git a/ClassicalSharp/2D/Screens/Menu/HotkeyListScreen.cs b/ClassicalSharp/2D/Screens/Menu/HotkeyListScreen.cs index b774eaed6..7e15e401e 100644 --- a/ClassicalSharp/2D/Screens/Menu/HotkeyListScreen.cs +++ b/ClassicalSharp/2D/Screens/Menu/HotkeyListScreen.cs @@ -8,7 +8,7 @@ using OpenTK.Input; namespace ClassicalSharp.Gui.Screens { // TODO: Hotkey added event for CPE - public sealed class HotkeyListScreen : FilesScreen { + public sealed class HotkeyListScreen : ListScreen { public HotkeyListScreen(Game game) : base(game) { titleText = "Modify hotkeys"; diff --git a/ClassicalSharp/2D/Screens/Menu/FilesScreen.cs b/ClassicalSharp/2D/Screens/Menu/ListScreen.cs similarity index 97% rename from ClassicalSharp/2D/Screens/Menu/FilesScreen.cs rename to ClassicalSharp/2D/Screens/Menu/ListScreen.cs index 01507587b..58ba8fa03 100644 --- a/ClassicalSharp/2D/Screens/Menu/FilesScreen.cs +++ b/ClassicalSharp/2D/Screens/Menu/ListScreen.cs @@ -5,9 +5,9 @@ using ClassicalSharp.Gui.Widgets; using OpenTK.Input; namespace ClassicalSharp.Gui.Screens { - public abstract class FilesScreen : ClickableScreen { + public abstract class ListScreen : ClickableScreen { - public FilesScreen(Game game) : base(game) { + public ListScreen(Game game) : base(game) { HandlesAllInput = true; } diff --git a/ClassicalSharp/2D/Screens/Menu/LoadLevelScreen.cs b/ClassicalSharp/2D/Screens/Menu/LoadLevelScreen.cs index 3458feea3..973a72347 100644 --- a/ClassicalSharp/2D/Screens/Menu/LoadLevelScreen.cs +++ b/ClassicalSharp/2D/Screens/Menu/LoadLevelScreen.cs @@ -9,7 +9,7 @@ using OpenTK.Input; using BlockID = System.UInt16; namespace ClassicalSharp.Gui.Screens { - public sealed class LoadLevelScreen : FilesScreen { + public sealed class LoadLevelScreen : ListScreen { public LoadLevelScreen(Game game) : base(game) { titleText = "Select a level"; diff --git a/ClassicalSharp/2D/Screens/Menu/TexturePackScreen.cs b/ClassicalSharp/2D/Screens/Menu/TexturePackScreen.cs index 1bdba4dfd..124537242 100644 --- a/ClassicalSharp/2D/Screens/Menu/TexturePackScreen.cs +++ b/ClassicalSharp/2D/Screens/Menu/TexturePackScreen.cs @@ -6,7 +6,7 @@ using ClassicalSharp.Textures; using OpenTK.Input; namespace ClassicalSharp.Gui.Screens { - public sealed class TexturePackScreen : FilesScreen { + public sealed class TexturePackScreen : ListScreen { public TexturePackScreen(Game game) : base(game) { titleText = "Select a texture pack zip"; diff --git a/ClassicalSharp/ClassicalSharp.csproj b/ClassicalSharp/ClassicalSharp.csproj index c2f5dae93..ffb5aae35 100644 --- a/ClassicalSharp/ClassicalSharp.csproj +++ b/ClassicalSharp/ClassicalSharp.csproj @@ -4,7 +4,7 @@ {BEB1C785-5CAD-48FF-A886-876BF0A318D4} Debug AnyCPU - WinExe + Exe ClassicalSharp ClassicalSharp v2.0 @@ -84,10 +84,10 @@ - + @@ -97,7 +97,7 @@ - + diff --git a/ClassicalSharp/Network/CPESupport.cs b/ClassicalSharp/Network/CPESupport.cs index 7589bf4e3..02ed9dbe1 100644 --- a/ClassicalSharp/Network/CPESupport.cs +++ b/ClassicalSharp/Network/CPESupport.cs @@ -15,14 +15,14 @@ namespace ClassicalSharp.Network { internal int ServerExtensionsCount; internal bool sendHeldBlock, useMessageTypes; internal int envMapVer = 2, blockDefsExtVer = 2; - internal bool needD3Fix, extEntityPos, twoWayPing, blockPerms; + internal bool needD3Fix, extEntityPos, twoWayPing, blockPerms, fastMap; Game game; public void Reset(Game game) { ServerExtensionsCount = 0; sendHeldBlock = false; useMessageTypes = false; envMapVer = 2; blockDefsExtVer = 2; - needD3Fix = false; extEntityPos = false; twoWayPing = false; + needD3Fix = false; extEntityPos = false; twoWayPing = false; fastMap = false; game.SupportsCPEBlocks = false; NetworkProcessor net = (NetworkProcessor)game.Server; net.Reset(); @@ -65,6 +65,9 @@ namespace ClassicalSharp.Network { net.writer.ExtendedPositions = true; } else if (ext == "TwoWayPing") { twoWayPing = true; + } else if (ext == "FastMap") { + net.packetSizes[Opcode.LevelInit] += 4; + fastMap = true; } #if USE16_BIT else if (ext == "ExtBlocks") { @@ -93,9 +96,9 @@ namespace ClassicalSharp.Network { public static string[] ClientExtensions = new string[] { "ClickDistance", "CustomBlocks", "HeldBlock", "EmoteFix", "TextHotKey", "ExtPlayerList", "EnvColors", "SelectionCuboid", "BlockPermissions", "ChangeModel", "EnvMapAppearance", - "EnvWeatherType", "MessageTypes", "HackControl", "PlayerClick", "FullCP437", - "LongerMessages", "BlockDefinitions", "BlockDefinitionsExt", "BulkBlockUpdate", "TextColors", - "EnvMapAspect", "EntityProperty", "ExtEntityPositions", "TwoWayPing", "InventoryOrder", "InstantMOTD", + "EnvWeatherType", "MessageTypes", "HackControl", "PlayerClick", "FullCP437", "LongerMessages", + "BlockDefinitions", "BlockDefinitionsExt", "BulkBlockUpdate", "TextColors", "EnvMapAspect", + "EntityProperty", "ExtEntityPositions", "TwoWayPing", "InventoryOrder", "InstantMOTD", "FastMap", #if USE16_BIT "ExtBlocks", #endif diff --git a/ClassicalSharp/Network/Protocols/Classic.cs b/ClassicalSharp/Network/Protocols/Classic.cs index bbbc67097..72a608b2f 100644 --- a/ClassicalSharp/Network/Protocols/Classic.cs +++ b/ClassicalSharp/Network/Protocols/Classic.cs @@ -67,7 +67,21 @@ namespace ClassicalSharp.Network.Protocols { void HandlePing() { } void HandleLevelInit() { - if (gzipStream != null) return; + if (gzipStream == null) StartLoadingState(); + + // Fast map puts volume in header, doesn't bother with gzip + if (net.cpeData.fastMap) { + int size = reader.ReadInt32(); + gzipHeader.done = true; + mapSizeIndex = 4; + #if USE16_BIT + if (reader.ExtendedBlocks) size *= 2; + #endif + map = new byte[size]; + } + } + + void StartLoadingState() { game.World.Reset(); game.WorldEvents.RaiseOnNewMap(); @@ -101,7 +115,8 @@ namespace ClassicalSharp.Network.Protocols { void HandleLevelDataChunk() { // Workaround for some servers that send LevelDataChunk before LevelInit // due to their async packet sending behaviour. - if (gzipStream == null) HandleLevelInit(); + if (gzipStream == null) StartLoadingState(); + int usedLength = reader.ReadUInt16(); gzippedMap.pos = 0; gzippedMap.bufferPos = reader.index;