Webclient: In singleplayer, show confirmation dialog before closing page unless map was saved within last 5 seconds

This commit is contained in:
UnknownShadow200 2021-03-04 21:33:51 +11:00
parent e60e852eee
commit c8c7379289
6 changed files with 19 additions and 1 deletions

View File

@ -649,6 +649,11 @@ static void Game_RunLoop(void) {
/* Now thats there's a main loop, Game_SetFpsLimit will actually do something */
Game_SetFpsLimit(Options_GetEnum(OPT_FPS_LIMIT, 0, FpsLimit_Names, FPS_LIMIT_COUNT));
}
cc_bool Game_ShouldClose(void) {
/* Running in multiplayer or map was saved within last 5 seconds */
return !Server.IsSinglePlayer || (World.LastSave + 5 >= Game.Time);
}
#else
static void Game_RunLoop(void) {
cc_uint64 lastRender, render;

View File

@ -78,6 +78,8 @@ void Game_SetFpsLimit(int method);
/* Runs the main game loop until the window is closed. */
void Game_Run(int width, int height, const cc_string* title);
/* Whether the game should be allowed to automatically close */
cc_bool Game_ShouldClose(void);
/* Represents a game component. */
struct IGameComponent;

View File

@ -1398,6 +1398,7 @@ static void SaveLevelScreen_SaveMap(struct SaveLevelScreen* s, const cc_string*
#else
Chat_Add1("&eSaved map to: %s", path);
#endif
World.LastSave = Game.Time;
Gui_ShowPauseMenu();
}

View File

@ -2745,6 +2745,7 @@ void Window_FreeFramebuffer(struct Bitmap* bmp) {
#include <emscripten/emscripten.h>
#include <emscripten/html5.h>
#include <emscripten/key_codes.h>
#include "Game.h"
static cc_bool keyboardOpen, needResize;
static int RawDpiScale(int x) { return (int)(x * emscripten_get_device_pixel_ratio()); }
@ -2908,6 +2909,12 @@ static EM_BOOL OnFullscreenChange(int type, const EmscriptenFullscreenChangeEven
}
static const char* OnBeforeUnload(int type, const void* ev, void *data) {
if (!Game_ShouldClose()) {
/* Exit pointer lock, otherwise when you press Ctrl+W, the */
/* cursor remains invisible in the confirmation dialog */
emscripten_exit_pointerlock();
return "You have unsaved changes. Are you sure you want to quit?";
}
Window_Close();
return NULL;
}

View File

@ -46,7 +46,8 @@ void World_Reset(void) {
World.Blocks = NULL;
World_SetDimensions(0, 0, 0);
World.Loaded = false;
World.Loaded = false;
World.LastSave = -200;
Env_Reset();
}

View File

@ -44,6 +44,8 @@ CC_VAR extern struct _WorldData {
/* Whether the world has finished loading/generating. */
/* NOTE: Blocks may still be NULL. (e.g. error during loading) */
cc_bool Loaded;
/* Point in time the current world was last saved at */
double LastSave;
} World;
/* Frees the blocks array, sets dimensions to 0, resets environment to default. */