// © 2025 Naked People Team. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "Subsystems/WorldSubsystem.h" #include "DroppedClothingSubsystem.generated.h" class AItemPickup; /** * Single source of truth for which clothing is currently lying in the world (GDD §6.3.4 / §13.4). * Every AItemPickup self-registers on BeginPlay and unregisters on EndPlay (pickup destroys the actor), * so the tracked set always matches what is on the ground without per-query actor iteration. * * Backs the "move away from your clothing" objective family — distance is measured to the nearest tracked * pickup. World-scoped and transient; the pickups themselves are persisted via the save's world items. */ UCLASS() class NAKEDDESIRE_API UDroppedClothingSubsystem : public UWorldSubsystem { GENERATED_BODY() public: // Called by AItemPickup as it spawns / is destroyed. void RegisterPickup(AItemPickup* Pickup); void UnregisterPickup(AItemPickup* Pickup); // True while at least one clothing pickup exists in the world. UFUNCTION(BlueprintPure, Category = "Clothing") bool HasDroppedClothing() const; // Distance in cm from From to the nearest tracked pickup. Returns false (and leaves OutDistance // untouched) when nothing is on the ground — callers decide what "no clothing to move from" means. bool GetDistanceToNearestDroppedClothing(const FVector& From, float& OutDistance) const; private: UPROPERTY() TArray> Pickups; };