diff --git a/MultiplayerManager.cs b/MultiplayerManager.cs index 0f1e611..8f5f490 100644 --- a/MultiplayerManager.cs +++ b/MultiplayerManager.cs @@ -1373,8 +1373,17 @@ namespace MSCO if (r.ReadBoolean()) { + // Letzte eigene Position auf dem Server - nur wenn sie plausibel ist, und über den Boden gehoben var spawn = new Vector3(r.ReadSingle(), r.ReadSingle(), r.ReadSingle()); - if (localPlayer != null) localPlayer.position = spawn + Vector3.up * 0.2f; + bool valid = !float.IsNaN(spawn.x) && !float.IsInfinity(spawn.x) && !float.IsNaN(spawn.y) && !float.IsNaN(spawn.z) + && Mathf.Abs(spawn.x) < 6000f && Mathf.Abs(spawn.z) < 6000f && spawn.y > -200f && spawn.y < 3000f; + if (localPlayer != null && valid) + { + RaycastHit hit; + if (Physics.Raycast(spawn + Vector3.up * 2f, Vector3.down, out hit, 6f)) spawn.y = Mathf.Max(spawn.y, hit.point.y); + localPlayer.position = spawn + Vector3.up * 0.2f; + ModConsole.Print("[MSCO] Back at your last position " + spawn.ToString("F0")); + } } // Positionen erst merken: sie werden NACH den Montage-Aktionen gesetzt. Sonst steckt ein Teil, das eine diff --git a/Passenger.cs b/Passenger.cs index 7c9d27d..13ee09e 100644 --- a/Passenger.cs +++ b/Passenger.cs @@ -24,6 +24,9 @@ namespace MSCO float lastYaw; readonly List disabled = new List(); CharacterController controller; + // Feste Collider des Spielers, die während der Fahrt aus sind (sonst stecken sie in Sitzen und Teilen des Autos) + readonly List disabledColliders = new List(); + readonly List frozenBodies = new List(); public bool IsRiding { get { return vehicle != null; } } @@ -142,6 +145,23 @@ namespace MSCO controller = player.GetComponent(); if (controller != null && controller.enabled) controller.enabled = false; else controller = null; + + // Der Spieler sitzt mitten im Auto: seine festen Collider würden Sitze und Teile wegdrücken + // (Teile reißen ab, Sitze fliegen, bei Tempo stürzt die Physik ab). Wie beim echten Einsteigen: aus. + disabledColliders.Clear(); + foreach (Collider c in player.GetComponentsInChildren()) + { + if (c == null || !c.enabled || c.isTrigger || c is CharacterController) continue; + c.enabled = false; + disabledColliders.Add(c); + } + frozenBodies.Clear(); + foreach (Rigidbody rb in player.GetComponentsInChildren()) + { + if (rb == null || rb.isKinematic) continue; + rb.isKinematic = true; + frozenBodies.Add(rb); + } } else { @@ -149,6 +169,10 @@ namespace MSCO disabled.Clear(); if (controller != null) controller.enabled = true; controller = null; + foreach (Collider c in disabledColliders) if (c != null) c.enabled = true; + disabledColliders.Clear(); + foreach (Rigidbody rb in frozenBodies) if (rb != null) rb.isKinematic = false; + frozenBodies.Clear(); } } }