From 8346cd9b09d6a7d84ce92bc28cc9d6c3de83f3dc Mon Sep 17 00:00:00 2001 From: MrMaho Date: Sun, 27 Sep 2026 08:42:50 +0200 Subject: [PATCH] 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 --- ObjectSync.cs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/ObjectSync.cs b/ObjectSync.cs index d2f5acb..5652fca 100644 --- a/ObjectSync.cs +++ b/ObjectSync.cs @@ -278,7 +278,10 @@ namespace MSCO } 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); } } @@ -688,8 +691,20 @@ namespace MSCO } } + GameObject lastPicked; // letzter Wert von PickedObject - ändert er sich, hat der Spieler wirklich neu gegriffen + float pickTime = -100f; + + /// Hat der Spieler gerade eben (nicht vor Minuten) etwas gegriffen? + bool JustPicked { get { return Time.time - pickTime < 0.6f; } } + 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; for (Transform t = pickedObject.Value.transform; t != null; t = t.parent) {