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;