- Carryable: generic pickup/carry component, cosmetic per-peer follow of
the carrier's HandSocket instead of NGO reparenting (camera pitch isn't
networked, so root-level reparenting wouldn't tilt with the view)
- PlayerCarry: mutual exclusion with PlayerHands, server-timed hold-to-pour
tick (client only signals start/stop, never per-unit requests)
- IPourSource/IPourTarget: decouple PlayerInteractor from concrete Shop
types, same pattern as IInteractable
- Lieferkarton: gains product data (productId/quantity), two-stage
Interact() (open, then pick up), IPourSource
- ShelfSlot: implements IPourTarget, fills the previous RefreshVisuals TODO
- PackageDisplay: renders quantity as a proper column x row grid that
stacks into further layers as space runs out, reused by both containers
- FlyingPackage: small non-networked cosmetic visual that arcs a package
from the carried box to its exact landing slot in the shelf grid on
every successful pour tick, broadcast via Rpc(SendTo.Everyone)
- StorageCrate: rejects pickup while the player is carrying a box
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Lieferkarton: server-authoritative Deckel-Toggle per NetworkVariable,
Scharnier-Rotation um lokale X-Achse, modernes [Rpc(SendTo.Server)]
- BoneVibration: neues IInteractable, das einen geskinnten Bone per
NetworkVariable-gesteuertem Toggle vibrieren lässt
- Beide Objekte in Shop.unity verdrahtet
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>