Passenger/driver sit still in moving cars: seat pose sent relative to the vehicle (backward-compatible), no backward pull; remote cars/traffic extrapolate in physics time and interpolate; UI polish (shadows, borders, gradient buttons, server list hover, fill bars, colored ping)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Nico Meister
2026-09-28 20:52:56 +02:00
co-authored by Claude Opus 5.5
parent 33a415139b
commit ce2fbdfc10
11 changed files with 274 additions and 24 deletions
+27 -4
View File
@@ -77,6 +77,12 @@ namespace MSCO
public Quaternion HeldLocalRot; // relativ zur Kamera
public bool Seated; // fährt oder sitzt als Beifahrer
public float FeetY; // Bodenhöhe unter dem Spieler (für Ducken/Lehnen der Figur)
// Im Fahrzeug: Kopf und Blick relativ zum Fahrzeug (ID des SyncedBody, 0 = nicht im Fahrzeug). Damit sitzt die
// Figur beim anderen fest auf dem Sitz, statt in Weltkoordinaten hinter dem fahrenden Auto herzuhinken.
// Steht am Ende der Nachricht: ältere Versionen und der Server lesen es einfach nicht mit.
public int SeatId;
public Vector3 SeatHead;
public Quaternion SeatView;
public byte[] Serialize()
{
@@ -90,9 +96,15 @@ namespace MSCO
w.Write(s.Seated);
w.Write(s.FeetY);
w.Write(s.HeldId);
if (s.HeldId == 0) return;
Write(w, s.HeldLocalPos);
Write(w, s.HeldLocalRot);
if (s.HeldId != 0)
{
Write(w, s.HeldLocalPos);
Write(w, s.HeldLocalRot);
}
w.Write(s.SeatId);
if (s.SeatId == 0) return;
Write(w, s.SeatHead);
Write(w, s.SeatView);
});
}
@@ -107,13 +119,24 @@ namespace MSCO
Seated = r.ReadBoolean(),
FeetY = r.ReadSingle(),
HeldId = r.ReadInt32(),
HeldLocalRot = Quaternion.identity
HeldLocalRot = Quaternion.identity,
SeatView = Quaternion.identity
};
if (s.HeldId != 0)
{
s.HeldLocalPos = ReadVector(r);
s.HeldLocalRot = ReadQuaternion(r);
}
// Ältere Versionen senden keinen Sitz
if (r.BaseStream.Length - r.BaseStream.Position >= 4)
{
s.SeatId = r.ReadInt32();
if (s.SeatId != 0)
{
s.SeatHead = ReadVector(r);
s.SeatView = ReadQuaternion(r);
}
}
return s;
}