Fix oil leaking after joining: don't sync game-computed leak states/rates (LeakOilpan, LeakOilfilter, ...); vars <filter> diagnostic command

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-01 20:29:34 +02:00
co-authored by Claude Opus 5.5
parent 7d341126e8
commit 4801539b9d
4 changed files with 42 additions and 2 deletions
+28 -2
View File
@@ -28,7 +28,14 @@ namespace MSCO
// Montiert-Flags nicht direkt setzen: das echte Anbauen läuft über FsmSync (Events)
// Schrauben/Festigkeit laufen über FsmSync (Events) - ein falscher Wert hier würde Teile lockern und abfallen lassen
static readonly string[] Excluded = { "install", "bolt", "tight", "detach", "attach", "rpm", "speed", "steer", "throttle", "gear", "raycast", "distance" };
// Vom Spiel selbst berechnete Werte ebenfalls nicht: z.B. LeakOilpan/LeakOilfilter (leckt Öl?) ergibt sich aus
// angebauten/festgezogenen Teilen - ein übertragener alter Wert ließ beim Beitreten Öl auslaufen. Raten (…Rate)
// rechnet das Spiel laufend neu aus.
static readonly string[] Excluded =
{
"install", "bolt", "tight", "detach", "attach", "rpm", "speed", "steer", "throttle", "gear", "raycast", "distance",
"leak", "rate"
};
const float ScanInterval = 10f;
const float CheckInterval = 0.5f;
@@ -37,6 +44,7 @@ namespace MSCO
class Var
{
public int Key;
public string Name; // Pfad|FSM|Variable (für die Diagnose "vars")
public string Root;
public NamedVariable Variable;
public byte Type; // 1 float, 2 int, 3 bool
@@ -53,6 +61,24 @@ namespace MSCO
public int Count { get { return vars.Count; } }
/// <summary>Diagnose (Konsole "vars <filter>"): synchronisierte Fahrzeugwerte mit aktuellem Wert.</summary>
public List<string> Describe(string filter, int max)
{
var lines = new List<string>();
string f = (filter ?? "").ToLower();
foreach (Var v in vars.Values)
{
if (f.Length > 0 && (v.Name == null || !v.Name.ToLower().Contains(f))) continue;
string value = v.Type == 1 ? ((FsmFloat)v.Variable).Value.ToString("0.###")
: v.Type == 2 ? ((FsmInt)v.Variable).Value.ToString()
: ((FsmBool)v.Variable).Value.ToString();
lines.Add(" " + v.Name + " = " + value);
if (lines.Count >= max) { lines.Add(" ... (more - use a narrower filter)"); break; }
}
if (lines.Count == 0) lines.Add(" no synced vehicle value matches '" + filter + "'");
return lines;
}
public void Reset()
{
vars.Clear();
@@ -180,7 +206,7 @@ namespace MSCO
int key = Hash(prefix + variable.Name);
Var existing;
if (vars.TryGetValue(key, out existing) && existing.Variable == variable) return;
var v = new Var { Key = key, Root = root, Variable = variable, Type = type };
var v = new Var { Key = key, Name = prefix + variable.Name, Root = root, Variable = variable, Type = type };
Remember(v);
vars[key] = v;