Files
Naked-Desire/Source/NakedDesire/Locations/LocationTrigger.h
T

59 lines
1.8 KiB
C++

// © 2025 Naked People Team. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "LocationTrigger.generated.h"
class ULocationData;
class UBoxComponent;
// A tagged volume. On player overlap it reports enter / leave to ULocationSubsystem, which is the
// single authority on where the player is. Everything (session boundary, commission location
// constraints, etc.) consumes the subsystem — the trigger itself has no consumer-specific logic.
UCLASS()
class NAKEDDESIRE_API ALocationTrigger : public AActor
{
GENERATED_BODY()
UPROPERTY(BlueprintReadOnly, meta = (AllowPrivateAccess))
UBoxComponent* BoxTrigger;
UPROPERTY(EditAnywhere)
ULocationData* LocationData;
UPROPERTY(EditAnywhere)
FVector TriggerSize;
public:
ALocationTrigger();
virtual void OnConstruction(const FTransform& Transform) override;
ULocationData* GetLocationData() const;
protected:
virtual void BeginPlay() override;
private:
UFUNCTION()
void OnTriggerBeginOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor,
UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult);
UFUNCTION()
void OnTriggerEndOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor,
UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);
// A pawn that spawns already inside this volume (e.g. the apartment at game start) gets no
// begin-overlap event, so seed the state one tick after BeginPlay once the world settles.
void SeedInitialPlayerOverlap();
// Forwards a single enter/exit to ULocationSubsystem on a real transition. Idempotent so the
// seed above can't double-count against a begin-overlap the engine does deliver.
void SetPlayerInside(bool bInside);
bool IsPlayerOverlapping() const;
bool bPlayerInside = false;
};