Fewer hitches: regular save-game pull only when something changed since the last save (saving freezes the game briefly), default interval 10 min
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
+2
-1
@@ -268,7 +268,8 @@ public sealed class GameServer
|
|||||||
if (config.SaveSyncMinutes > 0 && now >= nextSaveSync)
|
if (config.SaveSyncMinutes > 0 && now >= nextSaveSync)
|
||||||
{
|
{
|
||||||
nextSaveSync = now + config.SaveSyncMinutes * 60.0;
|
nextSaveSync = now + config.SaveSyncMinutes * 60.0;
|
||||||
RequestSave("regular save");
|
// Nur wenn sich seit dem letzten Spielstand etwas geändert hat - Speichern lässt das Spiel kurz hängen
|
||||||
|
if (world.ChangesSinceSave > 0) RequestSave("regular save");
|
||||||
}
|
}
|
||||||
// Hochladen dauert zu lange (Spieler weg, alte Mod ...): Wartende bekommen den bisherigen Spielstand
|
// Hochladen dauert zu lange (Spieler weg, alte Mod ...): Wartende bekommen den bisherigen Spielstand
|
||||||
if (saveUpload != null && DateTime.UtcNow > saveUpload.Deadline)
|
if (saveUpload != null && DateTime.UtcNow > saveUpload.Deadline)
|
||||||
|
|||||||
+1
-1
@@ -25,7 +25,7 @@ public sealed class ServerConfig
|
|||||||
/// So oft (Minuten) lässt sich der Server von einem Spieler im Spiel den aktuellen Spielstand hochladen
|
/// So oft (Minuten) lässt sich der Server von einem Spieler im Spiel den aktuellen Spielstand hochladen
|
||||||
/// (Schrauben, Teile, alles wie im Spiel gespeichert). Zusätzlich immer, wenn jemand beitritt. 0 = nur beim Beitreten.
|
/// (Schrauben, Teile, alles wie im Spiel gespeichert). Zusätzlich immer, wenn jemand beitritt. 0 = nur beim Beitreten.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public int SaveSyncMinutes { get; set; } = 5;
|
public int SaveSyncMinutes { get; set; } = 10;
|
||||||
/// <summary>Optional: Steam Web API Key, um Steam-Tickets der Spieler bei Steam zu prüfen.</summary>
|
/// <summary>Optional: Steam Web API Key, um Steam-Tickets der Spieler bei Steam zu prüfen.</summary>
|
||||||
public string SteamWebApiKey { get; set; } = "";
|
public string SteamWebApiKey { get; set; } = "";
|
||||||
/// <summary>Gesperrte SteamID64s.</summary>
|
/// <summary>Gesperrte SteamID64s.</summary>
|
||||||
|
|||||||
@@ -40,6 +40,12 @@ public sealed class WorldState
|
|||||||
public const int MaxDestroyed = 5000;
|
public const int MaxDestroyed = 5000;
|
||||||
|
|
||||||
public bool Dirty { get; private set; }
|
public bool Dirty { get; private set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Änderungen, die im Spielstand landen (Aktionen, Fahrzeugwerte, Geld, Türen, Käufe ...) seit dem letzten hochgeladenen
|
||||||
|
/// Spielstand. 0 = der regelmäßige Spielstand-Abruf kann ausfallen (Speichern lässt das Spiel kurz hängen).
|
||||||
|
/// </summary>
|
||||||
|
[System.Text.Json.Serialization.JsonIgnore]
|
||||||
|
public int ChangesSinceSave { get; set; } = 1;
|
||||||
|
|
||||||
static readonly JsonSerializerOptions Options = new() { WriteIndented = false };
|
static readonly JsonSerializerOptions Options = new() { WriteIndented = false };
|
||||||
|
|
||||||
@@ -64,6 +70,7 @@ public sealed class WorldState
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public void ResetForNewSave()
|
public void ResetForNewSave()
|
||||||
{
|
{
|
||||||
|
ChangesSinceSave = 0;
|
||||||
Objects.Clear();
|
Objects.Clear();
|
||||||
Events.Clear();
|
Events.Clear();
|
||||||
MoneyDelta = 0f;
|
MoneyDelta = 0f;
|
||||||
@@ -141,6 +148,7 @@ public sealed class WorldState
|
|||||||
|
|
||||||
public void ApplyMoney(byte[] payload)
|
public void ApplyMoney(byte[] payload)
|
||||||
{
|
{
|
||||||
|
ChangesSinceSave++;
|
||||||
if (payload.Length < 4) return;
|
if (payload.Length < 4) return;
|
||||||
MoneyDelta += BitConverter.ToSingle(payload, 0);
|
MoneyDelta += BitConverter.ToSingle(payload, 0);
|
||||||
Dirty = true;
|
Dirty = true;
|
||||||
@@ -148,6 +156,7 @@ public sealed class WorldState
|
|||||||
|
|
||||||
public void ApplyDoor(byte[] payload)
|
public void ApplyDoor(byte[] payload)
|
||||||
{
|
{
|
||||||
|
ChangesSinceSave++;
|
||||||
using var r = new BinaryReader(new MemoryStream(payload));
|
using var r = new BinaryReader(new MemoryStream(payload));
|
||||||
string key = r.ReadString();
|
string key = r.ReadString();
|
||||||
Doors[key] = r.ReadString();
|
Doors[key] = r.ReadString();
|
||||||
@@ -156,6 +165,7 @@ public sealed class WorldState
|
|||||||
|
|
||||||
public void ApplyVars(byte[] payload)
|
public void ApplyVars(byte[] payload)
|
||||||
{
|
{
|
||||||
|
ChangesSinceSave++;
|
||||||
using var r = new BinaryReader(new MemoryStream(payload));
|
using var r = new BinaryReader(new MemoryStream(payload));
|
||||||
int count = r.ReadInt32();
|
int count = r.ReadInt32();
|
||||||
if (count < 0 || count > 10000) return;
|
if (count < 0 || count > 10000) return;
|
||||||
@@ -187,6 +197,7 @@ public sealed class WorldState
|
|||||||
|
|
||||||
public void AddAppeared(byte[] payload)
|
public void AddAppeared(byte[] payload)
|
||||||
{
|
{
|
||||||
|
ChangesSinceSave++;
|
||||||
if (Appeared.Count >= MaxAppeared) return;
|
if (Appeared.Count >= MaxAppeared) return;
|
||||||
Appeared.Add(Convert.ToBase64String(payload));
|
Appeared.Add(Convert.ToBase64String(payload));
|
||||||
Dirty = true;
|
Dirty = true;
|
||||||
@@ -194,6 +205,7 @@ public sealed class WorldState
|
|||||||
|
|
||||||
public void AddDestroyed(int id)
|
public void AddDestroyed(int id)
|
||||||
{
|
{
|
||||||
|
ChangesSinceSave++;
|
||||||
if (Destroyed.Count >= MaxDestroyed || Destroyed.Contains(id)) return;
|
if (Destroyed.Count >= MaxDestroyed || Destroyed.Contains(id)) return;
|
||||||
Destroyed.Add(id);
|
Destroyed.Add(id);
|
||||||
Objects.Remove(id);
|
Objects.Remove(id);
|
||||||
@@ -203,6 +215,7 @@ public sealed class WorldState
|
|||||||
public void AddFsmEvent(byte[] payload)
|
public void AddFsmEvent(byte[] payload)
|
||||||
{
|
{
|
||||||
if (Events.Count >= MaxEvents) return;
|
if (Events.Count >= MaxEvents) return;
|
||||||
|
ChangesSinceSave++;
|
||||||
Events.Add(Convert.ToBase64String(payload));
|
Events.Add(Convert.ToBase64String(payload));
|
||||||
Dirty = true;
|
Dirty = true;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user