feat(shop): add box pickup/carry, pour-into-shelf, and package flight visuals
- 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>
This commit is contained in:
@@ -0,0 +1,19 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user