Sync vehicle controls (ignition, engine, lights ...), stop forced starter sound, auto-reconnect after server restart or lost connection

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-09-27 16:51:39 +02:00
co-authored by Claude Opus 5.5
parent bddc1efe76
commit 097d1e87de
6 changed files with 229 additions and 8 deletions
+24 -4
View File
@@ -64,6 +64,7 @@ namespace MSCO
readonly WorldVarSync worldVars = new WorldVarSync();
readonly TrafficSync traffic = new TrafficSync();
readonly HingeSync hinges = new HingeSync();
readonly ControlSync controls = new ControlSync();
readonly Overlays overlays = new Overlays();
bool isAdmin; // Server hat uns als Admin gemeldet
readonly HashSet<string> bannedNames = new HashSet<string>(); // P2P-Host: für diese Sitzung gebannt
@@ -209,6 +210,7 @@ namespace MSCO
lines.Add("synced vehicle values (fuel, oil, bolts, wear ...): " + vehicleState.Count);
lines.Add("synced body meshes (crash damage): " + damageSync.Count);
lines.Add("synced car doors/hoods/trunks: " + hinges.Count);
lines.Add("synced vehicle controls (ignition, engine, lights ...): " + controls.Count + " (" + controls.MutedCount + " muted)");
lines.Add("synced job/shop values: " + worldVars.Count);
lines.Add("synced traffic cars: " + traffic.Count + (IsWorldAuthority ? " (simulated here)" : " (following)"));
return lines;
@@ -607,7 +609,7 @@ namespace MSCO
float centerMessageUntil;
float reconnectAt;
int reconnectAttempts;
const int MaxReconnectAttempts = 5;
const int MaxReconnectAttempts = 10; // ~1 Minute: reicht für einen Server-Neustart
const float ReconnectRetrySeconds = 6f;
void ConnectToServer(string host, int port, string displayName, int maxPlayers)
@@ -848,6 +850,8 @@ namespace MSCO
{
reconnectAttempts++;
reconnectAt = Time.realtimeSinceStartup + ReconnectRetrySeconds;
MscoLog.Info("[MSCO] Reconnecting to " + lastServerHost + ":" + lastServerPort +
" (attempt " + reconnectAttempts + "/" + MaxReconnectAttempts + ")");
JoinServer(lastServerHost, lastServerPort, lastServerName, lastServerMax);
}
}
@@ -990,6 +994,15 @@ namespace MSCO
void OnSessionEnded(string reason)
{
// Verbindung zum Server unerwartet weg (Absturz, Timeout, Netz) - nicht gekickt/gebannt, nicht selbst
// getrennt: automatisch neu verbinden, als hätte der Server einen Neustart angekündigt
if (reconnectMessage == null && serverReason == null && reason != "Disconnected" && dedicated && handshakeDone
&& lastServerHost != null)
{
reconnectMessage = "Lost the connection to the server - reconnecting...";
reconnectAttempts = 0;
MscoLog.Warning("[MSCO] Connection lost (" + reason + ") - will reconnect");
}
// Hinweis fürs Hauptmenü - außer man hat selbst auf DISCONNECT gedrückt oder verbindet gleich neu
if (reconnectMessage != null)
{
@@ -1022,7 +1035,7 @@ namespace MSCO
worldSync.Reset();
moneySync.Reset();
doorSync.Reset();
vehicleState.Reset(); damageSync.Reset(); worldVars.Reset(); traffic.Reset(); hinges.Reset();
vehicleState.Reset(); damageSync.Reset(); worldVars.Reset(); traffic.Reset(); hinges.Reset(); controls.Reset();
isAdmin = false;
if (overlays.AdminOpen || overlays.ChatOpen) overlays.CloseAll();
FsmSync.Enabled = false;
@@ -1051,7 +1064,8 @@ namespace MSCO
|| t == MsgType.ObjRelease || t == MsgType.FsmEvent || t == MsgType.VehicleFx || t == MsgType.WorldTime || t == MsgType.MoneyDelta || t == MsgType.DoorState
|| t == MsgType.Chat || t == MsgType.VarSync || t == MsgType.SpawnItem
|| t == MsgType.ItemAppeared || t == MsgType.ObjDestroy || t == MsgType.VehicleDamage
|| t == MsgType.TrafficStates || t == MsgType.WorldVars || t == MsgType.HingeStates;
|| t == MsgType.TrafficStates || t == MsgType.WorldVars || t == MsgType.HingeStates
|| t == MsgType.VehicleControls;
}
void OnMessage(int peerId, Message m)
@@ -1366,6 +1380,9 @@ namespace MSCO
case MsgType.HingeStates:
hinges.Handle(r);
break;
case MsgType.VehicleControls:
controls.Handle(r, objects, localId);
break;
case MsgType.TrafficStates:
traffic.Handle(r, IsWorldAuthority);
break;
@@ -1486,7 +1503,7 @@ namespace MSCO
passenger.Reset();
localPlayer = null;
objects.OnGameLoaded();
vehicleState.Reset(); damageSync.Reset(); worldVars.Reset(); traffic.Reset(); hinges.Reset();
vehicleState.Reset(); damageSync.Reset(); worldVars.Reset(); traffic.Reset(); hinges.Reset(); controls.Reset();
vehicleFx.Reset(); wheelSpin.Reset();
worldSync.Reset();
moneySync.Reset();
@@ -1610,6 +1627,9 @@ namespace MSCO
// Unfallschäden (verbeulte Karosserie)
try { if (objects.ScanComplete) damageSync.Update(objects, localId, SendGame); }
catch (System.Exception e) { ReportError("crash damage sync", e); }
// Zündung, Motor, Licht, Choke ... der Fahrzeuge
try { if (objects.ScanComplete && localPlayer != null) controls.Update(objects, localId, localPlayer.position, SendGame); }
catch (System.Exception e) { ReportError("vehicle controls sync", e); }
// Türen, Motorhaube, Kofferraum der Fahrzeuge
try { if (objects.ScanComplete && localPlayer != null) hinges.Update(objects, localId, localPlayer.position, Time.deltaTime, SendGame); }
catch (System.Exception e) { ReportError("car door sync", e); }