diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index 4e0fb9422c..4ff82381f9 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -612,3 +612,7 @@ This maintains a list of ip addresses that are able to bypass topic filtering. protection = CONFIG_ENTRY_HIDDEN|CONFIG_ENTRY_LOCKED /datum/config_entry/flag/guest_ban + +/datum/config_entry/string/playersave_path + config_entry_value = "data/player_saves" + protection = CONFIG_ENTRY_HIDDEN|CONFIG_ENTRY_LOCKED diff --git a/code/game/objects/effects/landmarks/freed_mob_spawner.dm b/code/game/objects/effects/landmarks/freed_mob_spawner.dm index c0e34eed54..7841e99df2 100644 --- a/code/game/objects/effects/landmarks/freed_mob_spawner.dm +++ b/code/game/objects/effects/landmarks/freed_mob_spawner.dm @@ -6,7 +6,7 @@ /obj/effect/landmark/freed_mob_spawner/Initialize() . = ..() - spawn_freed_mob() + INVOKE_ASYNC(src, PROC_REF(spawn_freed_mob)) return INITIALIZE_HINT_QDEL /obj/effect/landmark/freed_mob_spawner/Destroy() diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index aa02e580b5..bbd82dbcbb 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -94,7 +94,7 @@ /datum/preferences/proc/load_path(ckey,filename="preferences.sav") if(!ckey) return - path = "data/player_saves/[copytext(ckey,1,2)]/[ckey]/[filename]" + path = "[CONFIG_GET(string/playersave_path)]/[copytext(ckey,1,2)]/[ckey]/[filename]" savefile_version = SAVEFILE_VERSION_MAX /proc/sanitize_keybindings(value) @@ -108,10 +108,27 @@ return base_bindings /datum/preferences/proc/load_preferences() - if(!path) return 0 - if(!fexists(path)) return 0 + if(!path) + return FALSE + + if(!fexists(path)) + return FALSE + var/savefile/S = new /savefile(path) - if(!S) return 0 + if(!S) + return FALSE + + if(!S.Lock()) + to_chat(owner, SPAN_BOLDWARNING("Failed to load your preferences file. It may be in use by another process. Please try again.")) + + var/options = tgui_alert(owner, "Failed to load your preferences file. It may be in use by another process. Please try again.", "Failed to Load", list("Retry", "Disconnect"), timeout = FALSE) + if(options != "Retry") + qdel(owner, force = TRUE) + return FALSE + + load_preferences() + return FALSE + S.cd = "/" S["version"] >> savefile_version @@ -290,6 +307,8 @@ S["remembered_key_bindings"] << GLOB.keybindings_by_name + S.Unlock() + if(toggles_chat & SHOW_TYPING) owner.typing_indicators = FALSE else @@ -306,6 +325,9 @@ var/savefile/S = new /savefile(path) if(!S) return FALSE + if(!S.Lock()) + to_chat(owner, SPAN_BOLDWARNING("Failed to save your preferences file - it may be in use by another process. Please try again.")) + return FALSE S.cd = "/" S["version"] << savefile_version @@ -392,15 +414,29 @@ S["no_radial_labels_preference"] << no_radial_labels_preference S["custom_cursors"] << custom_cursors + S.Unlock() + return TRUE /datum/preferences/proc/load_character(slot) - if(!path) return 0 - if(!fexists(path)) return 0 + if(!path) + return FALSE + + if(!fexists(path)) + return FALSE + var/savefile/S = new /savefile(path) - if(!S) return 0 + if(!S) + return FALSE + + if(!S.Lock()) + to_chat(owner, SPAN_BOLDWARNING("Failed to load your character slot - it may be in use by another process. Please try again.")) + return FALSE + S.cd = "/" - if(!slot) slot = default_slot + + if(!slot) + slot = default_slot slot = sanitize_integer(slot, 1, MAX_SAVE_SLOTS, initial(default_slot)) if(slot != default_slot) default_slot = slot @@ -478,6 +514,8 @@ S["uplinklocation"] >> uplinklocation S["exploit_record"] >> exploit_record + S.Unlock() + //Sanitize metadata = sanitize_text(metadata, initial(metadata)) real_name = reject_bad_name(real_name) @@ -549,9 +587,16 @@ return 1 /datum/preferences/proc/save_character() - if(!path) return 0 + if(!path) + return FALSE var/savefile/S = new /savefile(path) - if(!S) return 0 + if(!S) + return FALSE + + if(!S.Lock()) + to_chat(owner, SPAN_BOLDWARNING("Failed to save your character slot - it may be in use by another process. Please try again.")) + return FALSE + S.cd = "/character[default_slot]" //Character @@ -623,7 +668,9 @@ S["uplinklocation"] << uplinklocation S["exploit_record"] << exploit_record - return 1 + S.Unlock() + + return TRUE /// checks through keybindings for outdated unbound keys and updates them /datum/preferences/proc/check_keybindings()