59 lines
1.8 KiB
C++
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;
|
|
}; |