Files
Naked-Desire/Source/NakedDesire/Commissions/Objectives/MoveDistanceFromClothingObjective.cpp
T
2026-06-01 15:03:37 +03:00

84 lines
2.5 KiB
C++

// © 2025 Naked People Team. All Rights Reserved.
#include "MoveDistanceFromClothingObjective.h"
#include "TimerManager.h"
#include "NakedDesire/Clothing/DroppedClothingSubsystem.h"
#include "NakedDesire/Player/NakedDesireCharacter.h"
#define LOCTEXT_NAMESPACE "Commissions.Objectives.MoveDistanceFromClothing"
namespace
{
constexpr float PollIntervalSeconds = 0.2f;
}
void UMoveDistanceFromClothingObjective::OnActivate()
{
if (Player)
Player->GetWorldTimerManager().SetTimer(PollTimer, this, &UMoveDistanceFromClothingObjective::Poll, PollIntervalSeconds, true);
}
void UMoveDistanceFromClothingObjective::OnDeactivate()
{
if (Player)
Player->GetWorldTimerManager().ClearTimer(PollTimer);
PollTimer.Invalidate();
}
void UMoveDistanceFromClothingObjective::Poll()
{
NotifyConditionChanged();
}
bool UMoveDistanceFromClothingObjective::IsConditionMet() const
{
const UDroppedClothingSubsystem* Dropped = GetDroppedClothing();
if (!Dropped || !Player)
return false;
float Distance = 0.0f;
if (!Dropped->GetDistanceToNearestDroppedClothing(Player->GetActorLocation(), Distance))
return false; // nothing on the ground to move away from
return Distance >= RequiredMeters * 100.0f;
}
float UMoveDistanceFromClothingObjective::GetProgress() const
{
// While a hold timer is running (stay-away variant) defer to the base's elapsed-hold progress.
if (bSatisfied || RequiredHoldSeconds > 0.0f)
return Super::GetProgress();
const UDroppedClothingSubsystem* Dropped = GetDroppedClothing();
if (!Dropped || !Player)
return 0.0f;
float Distance = 0.0f;
if (!Dropped->GetDistanceToNearestDroppedClothing(Player->GetActorLocation(), Distance))
return 0.0f;
const float TargetCm = RequiredMeters * 100.0f;
return TargetCm > 0.0f ? FMath::Clamp(Distance / TargetCm, 0.0f, 1.0f) : 0.0f;
}
UDroppedClothingSubsystem* UMoveDistanceFromClothingObjective::GetDroppedClothing() const
{
UWorld* World = Player ? Player->GetWorld() : nullptr;
return World ? World->GetSubsystem<UDroppedClothingSubsystem>() : nullptr;
}
FText UMoveDistanceFromClothingObjective::GetDescription() const
{
if (RequiredHoldSeconds > 0.0f)
{
return FText::Format(LOCTEXT("Timed", "Stay {0} m from your dropped clothes for {1} seconds"),
FText::AsNumber(FMath::RoundToInt(RequiredMeters)), FText::AsNumber(FMath::RoundToInt(RequiredHoldSeconds)));
}
return FText::Format(LOCTEXT("Instant", "Get {0} m away from your dropped clothes"),
FText::AsNumber(FMath::RoundToInt(RequiredMeters)));
}
#undef LOCTEXT_NAMESPACE