diff --git a/GameMods.hpp b/GameMods.hpp
index 6f60124..f3488dd 100644
--- a/GameMods.hpp
+++ b/GameMods.hpp
@@ -29,6 +29,7 @@
#define ENH_ALLOW_SCROLL_WHEEL // Allow use of the scroll wheel to change selected inventory slots
#define ENH_DISABLE_TURN_ACCEL // Disable the turn acceleration mechanism. It should only be used on Xperia Play
#define ENH_3D_INVENTORY_TILES // Uses 3D rendered inventory tiles, use with ENH_SHADE_HELD_TILES to render correctly.
+#define ENH_IMPROVED_SAVING // Improve world saving. The original Minecraft doesn't always really save for some reason
// Mods
//#define MOD_USE_FLAT_WORLD // Use a flat world instead of the regular world generation
diff --git a/source/App/Minecraft.cpp b/source/App/Minecraft.cpp
index 406e598..cf44b12 100644
--- a/source/App/Minecraft.cpp
+++ b/source/App/Minecraft.cpp
@@ -10,6 +10,7 @@
#include "PauseScreen.hpp"
#include "StartMenuScreen.hpp"
#include "RenameMPLevelScreen.hpp"
+#include "SavingWorldScreen.hpp"
#include "ServerSideNetworkHandler.hpp"
#include "ClientSideNetworkHandler.hpp"
@@ -299,7 +300,7 @@ void Minecraft::tickInput()
{
if (!field_D14->field_10)
{
- field_DB0 = 1;
+ field_DB0 = true;
field_D14->updateEvents();
field_DB0 = false;
if (field_DB1)
@@ -839,16 +840,12 @@ void Minecraft::leaveGame(bool bCopyMap)
// @BUG: Deleting ServerSideNetworkHandler too late! This causes
// access to invalid memory in the destructor seeing as we already deleted the level.
delete m_pNetEventCallback;
-
- // @NOTE: Saving only happens once every 50 ticks. Force it to happen when quitting.
- if (m_pLevel)
- {
- m_pLevel->saveAllChunks();
- m_pLevel->saveLevelData();
- m_pLevel->savePlayerData();
- }
#endif
+#ifdef ENH_IMPROVED_SAVING
+ field_288 = true;
+ setScreen(new SavingWorldScreen(bCopyMap));
+#else
if (m_pLevel)
{
LevelStorage* pStorage = m_pLevel->getLevelStorage();
@@ -857,6 +854,7 @@ void Minecraft::leaveGame(bool bCopyMap)
m_pLevel = nullptr;
}
+#endif
#ifdef ORIGINAL_CODE
delete m_pNetEventCallback;
@@ -865,10 +863,12 @@ void Minecraft::leaveGame(bool bCopyMap)
m_pNetEventCallback = nullptr;
field_D9C = 0;
+#ifndef ENH_IMPROVED_SAVING
if (bCopyMap)
setScreen(new RenameMPLevelScreen("_LastJoinedServer"));
else
setScreen(new StartMenuScreen);
+#endif
}
void Minecraft::hostMultiplayer()
diff --git a/source/GUI/Screen/SavingWorldScreen.cpp b/source/GUI/Screen/SavingWorldScreen.cpp
new file mode 100644
index 0000000..3044488
--- /dev/null
+++ b/source/GUI/Screen/SavingWorldScreen.cpp
@@ -0,0 +1,63 @@
+#include "SavingWorldScreen.hpp"
+#include "RenameMPLevelScreen.hpp"
+#include "StartMenuScreen.hpp"
+
+#ifdef ENH_IMPROVED_SAVING
+
+SavingWorldScreen::SavingWorldScreen(bool bCopyMap)
+{
+ m_bCopyMapAtEnd = bCopyMap;
+ m_timer = 0;
+}
+
+void SavingWorldScreen::render(int mouseX, int mouseY, float f)
+{
+ renderDirtBackground(0);
+
+ int x_width = int(Minecraft::width * Gui::InvGuiScale);
+ int x_height = int(Minecraft::height * Gui::InvGuiScale);
+ int yPos = x_height / 2;
+
+ int width = m_pFont->width("Saving chunks");
+ m_pFont->drawShadow("Saving chunks", (x_width - width) / 2, yPos + 4, 0xFFFFFF);
+}
+
+void SavingWorldScreen::tick()
+{
+ if (m_timer < 0)
+ return;
+
+ m_timer++;
+
+ if (m_timer >= 5)
+ {
+ m_timer = -1;
+
+ Level* pLevel = m_pMinecraft->m_pLevel;
+ if (pLevel)
+ {
+ pLevel->saveAllChunks();
+ pLevel->saveLevelData();
+ pLevel->savePlayerData();
+
+ LevelStorage* pStorage = pLevel->getLevelStorage();
+ SAFE_DELETE(pStorage);
+ SAFE_DELETE(pLevel);
+
+ m_pMinecraft->m_pLevel = nullptr;
+ }
+
+ m_pMinecraft->field_DB0 = true;
+
+ if (m_bCopyMapAtEnd)
+ m_pMinecraft->setScreen(new RenameMPLevelScreen("_LastJoinedServer"));
+ else
+ m_pMinecraft->setScreen(new StartMenuScreen);
+
+ m_pMinecraft->field_DB0 = false;
+
+ m_pMinecraft->field_288 = false;
+ }
+}
+
+#endif
diff --git a/source/GUI/Screen/SavingWorldScreen.hpp b/source/GUI/Screen/SavingWorldScreen.hpp
new file mode 100644
index 0000000..9a3cd23
--- /dev/null
+++ b/source/GUI/Screen/SavingWorldScreen.hpp
@@ -0,0 +1,20 @@
+#pragma once
+
+#include "Screen.hpp"
+
+#ifdef ENH_IMPROVED_SAVING
+
+class SavingWorldScreen : public Screen
+{
+public:
+ SavingWorldScreen(bool bCopyMap);
+
+ void render(int mouseX, int mouseY, float f) override;
+ void tick() override;
+
+public:
+ bool m_bCopyMapAtEnd;
+ int m_timer = 0;
+};
+
+#endif
diff --git a/windows_vs/minecraftcpp.vcxproj b/windows_vs/minecraftcpp.vcxproj
index e6d0a37..39e0061 100644
--- a/windows_vs/minecraftcpp.vcxproj
+++ b/windows_vs/minecraftcpp.vcxproj
@@ -65,6 +65,7 @@
+
@@ -358,6 +359,7 @@
+
diff --git a/windows_vs/minecraftcpp.vcxproj.filters b/windows_vs/minecraftcpp.vcxproj.filters
index e8d3fcf..90766ac 100644
--- a/windows_vs/minecraftcpp.vcxproj.filters
+++ b/windows_vs/minecraftcpp.vcxproj.filters
@@ -1068,6 +1068,9 @@
Source Files\World\Storage
+
+ Source Files\GUI\Screen
+
@@ -1937,12 +1940,15 @@
Header Files\World
-
- Header Files
-
Header Files\World\Storage
+
+ Header Files\World\Storage
+
+
+ Header Files\GUI\Screen
+