- 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>
20 lines
562 B
C#
20 lines
562 B
C#
using UnityEngine;
|
|
|
|
namespace AfterHours.Interaction
|
|
{
|
|
/// <summary>
|
|
/// Alles, was per Klick-halten Stück für Stück befüllt werden kann
|
|
/// (z. B. ShelfSlot, später Lagerregal). TryAddOne() läuft serverseitig
|
|
/// und muss selbst validieren, genau wie IInteractable.Interact().
|
|
/// </summary>
|
|
public interface IPourTarget
|
|
{
|
|
Transform Transform { get; }
|
|
int ProductId { get; }
|
|
int Quantity { get; }
|
|
bool IsEmpty { get; }
|
|
bool IsFull { get; }
|
|
bool TryAddOne(int productId);
|
|
}
|
|
}
|