Files
Naked-Desire/Source/NakedDesire/Locations/LocationSubsystem.cpp
T
2026-06-01 00:27:56 +03:00

76 lines
1.5 KiB
C++

// © 2025 Naked People Team. All Rights Reserved.
#include "LocationSubsystem.h"
#include "LocationData.h"
void ULocationSubsystem::EnterLocation(ULocationData* Location)
{
if (!Location)
return;
int32& Count = ActiveCounts.FindOrAdd(Location);
++Count;
if (Count == 1)
{
RebuildActiveTags();
OnLocationEntered.Broadcast(Location);
}
}
void ULocationSubsystem::ExitLocation(ULocationData* Location)
{
if (!Location)
return;
int32* Count = ActiveCounts.Find(Location);
if (!Count)
return;
if (--(*Count) <= 0)
{
ActiveCounts.Remove(Location);
RebuildActiveTags();
OnLocationExited.Broadcast(Location);
}
}
bool ULocationSubsystem::IsPlayerInLocation(FGameplayTag Query) const
{
return Query.IsValid() && ActiveTags.HasTag(Query);
}
ULocationData* ULocationSubsystem::GetCurrentLocation() const
{
ULocationData* Best = nullptr;
int32 BestDepth = -1;
for (const TPair<TObjectPtr<ULocationData>, int32>& Pair : ActiveCounts)
{
ULocationData* Location = Pair.Key;
if (!Location || !Location->Tag.IsValid())
continue;
// More tag segments = more specific (Location.City.Beach beats Location.City).
const int32 Depth = Location->Tag.GetGameplayTagParents().Num();
if (Depth > BestDepth)
{
BestDepth = Depth;
Best = Location;
}
}
return Best;
}
void ULocationSubsystem::RebuildActiveTags()
{
ActiveTags.Reset();
for (const TPair<TObjectPtr<ULocationData>, int32>& Pair : ActiveCounts)
{
if (Pair.Key && Pair.Key->Tag.IsValid())
ActiveTags.AddTag(Pair.Key->Tag);
}
}