From a64279ed7e867a8f64b9291e338213c59d5029c8 Mon Sep 17 00:00:00 2001 From: Docker Build Date: Mon, 11 May 2026 21:20:47 -0500 Subject: [PATCH] fix(player): restore missing additional save timer and reduce autosave interval The m_additionalSaveTimer was never processed in the update loop, so quick partial saves after important events (rare+ item pickups, quest completions) never fired. This caused players to lose progress on disconnect/crash since only the 15-minute full autosave protected them. - Add m_additionalSaveTimer tick logic to Player::Update - Reduce default PlayerSaveInterval from 900000 (15 min) to 300000 (5 min) Co-authored-by: Cursor --- .../apps/worldserver/worldserver.conf.dist | 4 ++-- .../game/Entities/Player/PlayerUpdates.cpp | 22 +++++++++++++++++++ src/server/game/World/WorldConfig.cpp | 2 +- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/server/apps/worldserver/worldserver.conf.dist b/src/server/apps/worldserver/worldserver.conf.dist index 45f6378..1f34797 100644 --- a/src/server/apps/worldserver/worldserver.conf.dist +++ b/src/server/apps/worldserver/worldserver.conf.dist @@ -1753,9 +1753,9 @@ InstantLogout = 1 # # PlayerSaveInterval # Description: Time (in milliseconds) for player save interval. -# Default: 900000 - (15 min) +# Default: 300000 - (5 min) -PlayerSaveInterval = 900000 +PlayerSaveInterval = 300000 # # PlayerSave.Stats.MinLevel diff --git a/src/server/game/Entities/Player/PlayerUpdates.cpp b/src/server/game/Entities/Player/PlayerUpdates.cpp index fec393e..e7a8291 100644 --- a/src/server/game/Entities/Player/PlayerUpdates.cpp +++ b/src/server/game/Entities/Player/PlayerUpdates.cpp @@ -332,6 +332,28 @@ void Player::Update(uint32 p_time) } } + if (m_additionalSaveTimer) + { + if (p_time >= m_additionalSaveTimer) + { + m_additionalSaveTimer = 0; + CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction(); + + if (m_additionalSaveMask & ADDITIONAL_SAVING_INVENTORY_AND_GOLD) + SaveInventoryAndGoldToDB(trans); + + if (m_additionalSaveMask & ADDITIONAL_SAVING_QUEST_STATUS) + _SaveQuestStatus(trans); + + CharacterDatabase.CommitTransaction(trans); + m_additionalSaveMask = 0; + } + else + { + m_additionalSaveTimer -= p_time; + } + } + // Handle Water/drowning HandleDrowning(p_time); diff --git a/src/server/game/World/WorldConfig.cpp b/src/server/game/World/WorldConfig.cpp index 8e710b7..6cab706 100644 --- a/src/server/game/World/WorldConfig.cpp +++ b/src/server/game/World/WorldConfig.cpp @@ -163,7 +163,7 @@ void WorldConfig::BuildConfigCache() SetConfigValue(CONFIG_ALLOW_PLAYER_COMMANDS, "AllowPlayerCommands", 1); SetConfigValue(CONFIG_PRESERVE_CUSTOM_CHANNELS, "PreserveCustomChannels", false); SetConfigValue(CONFIG_PRESERVE_CUSTOM_CHANNEL_DURATION, "PreserveCustomChannelDuration", 14); - SetConfigValue(CONFIG_INTERVAL_SAVE, "PlayerSaveInterval", 900000); + SetConfigValue(CONFIG_INTERVAL_SAVE, "PlayerSaveInterval", 300000); SetConfigValue(CONFIG_INTERVAL_DISCONNECT_TOLERANCE, "DisconnectToleranceInterval", 0); SetConfigValue(CONFIG_STATS_SAVE_ONLY_ON_LOGOUT, "PlayerSave.Stats.SaveOnlyOnLogout", true); SetConfigValue(CONFIG_VALIDATE_SKILL_LEARNED_BY_SPELLS, "ValidateSkillLearnedBySpells", true);