Don't snatch an item another player is carrying just because it passes in front of your face

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-09-27 08:42:50 +02:00
co-authored by Claude Opus 5.5
parent 477949e559
commit 8346cd9b09
+16 -1
View File
@@ -278,7 +278,10 @@ namespace MSCO
} }
else // gehört einem anderen Spieler else // gehört einem anderen Spieler
{ {
if (active && Wins(LocalId, true, b.OwnerId, b.OwnerActive)) Claim(b, true); // Spieler greift sich das Objekt // Trägt es gerade ein anderer, nur übernehmen, wenn wir es wirklich eben gegriffen haben - PickedObject
// zeigt oft noch auf ein altes Item; trägt es jemand an unserem Kopf vorbei, würden wir es ihm sonst entreißen
bool grab = b == driven || !b.OwnerActive || JustPicked;
if (active && grab && Wins(LocalId, true, b.OwnerId, b.OwnerActive)) Claim(b, true); // Spieler greift sich das Objekt
else if (Time.time - b.LastRecvTime > RemoteTimeout) SetFree(b); else if (Time.time - b.LastRecvTime > RemoteTimeout) SetFree(b);
} }
} }
@@ -688,8 +691,20 @@ namespace MSCO
} }
} }
GameObject lastPicked; // letzter Wert von PickedObject - ändert er sich, hat der Spieler wirklich neu gegriffen
float pickTime = -100f;
/// <summary>Hat der Spieler gerade eben (nicht vor Minuten) etwas gegriffen?</summary>
bool JustPicked { get { return Time.time - pickTime < 0.6f; } }
SyncedBody HeldBody() SyncedBody HeldBody()
{ {
GameObject picked = pickedObject != null ? pickedObject.Value : null;
if (picked != lastPicked)
{
lastPicked = picked;
if (picked != null) pickTime = Time.time;
}
if (pickedObject == null || pickedObject.Value == null) return null; if (pickedObject == null || pickedObject.Value == null) return null;
for (Transform t = pickedObject.Value.transform; t != null; t = t.parent) for (Transform t = pickedObject.Value.transform; t != null; t = t.parent)
{ {