- 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>
16 lines
479 B
C#
16 lines
479 B
C#
namespace AfterHours.Interaction
|
|
{
|
|
/// <summary>
|
|
/// Alles, was per Klick-halten Stück für Stück ausgeschüttet werden kann
|
|
/// (z. B. Lieferkarton, später Lagerregal-Karton). TryTakeOne() läuft
|
|
/// serverseitig und muss selbst validieren, genau wie IPourTarget.TryAddOne().
|
|
/// </summary>
|
|
public interface IPourSource
|
|
{
|
|
bool IsOpen { get; }
|
|
int ProductId { get; }
|
|
bool IsEmpty { get; }
|
|
bool TryTakeOne();
|
|
}
|
|
}
|