Updates
This commit is contained in:
@@ -6,10 +6,47 @@
|
||||
#include "BodyPart.h"
|
||||
#include "ClothingSlotType.h"
|
||||
#include "Engine/DataAsset.h"
|
||||
#include "NakedDesire/Player/PrivateBodyPartType.h"
|
||||
#include "NakedDesire/Progression/ProgressionPath.h"
|
||||
#include "ClothingItem.generated.h"
|
||||
|
||||
USTRUCT(BlueprintType)
|
||||
struct NAKEDDESIRE_API FBodyPartCoverage
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
UPROPERTY()
|
||||
float Coverage = 1.0f;
|
||||
|
||||
UPROPERTY()
|
||||
EBodyPart BodyPart = EBodyPart::Ass;
|
||||
};
|
||||
|
||||
UENUM(BlueprintType)
|
||||
enum class ERestrictionType : uint8
|
||||
{
|
||||
BlockRun = 0,
|
||||
BlockCrouch = 1,
|
||||
BlockPhoneUsage = 2,
|
||||
BlockItemPickup = 3,
|
||||
BlockMasturbate = 4,
|
||||
BlockBoobsExpose = 5,
|
||||
BlockVaginaExpose = 6,
|
||||
BlockAnalExpose = 7,
|
||||
BlockSlotChange = 8,
|
||||
};
|
||||
|
||||
USTRUCT(BlueprintType)
|
||||
struct NAKEDDESIRE_API FClothingRestriction
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
UPROPERTY()
|
||||
ERestrictionType RestrictionType = ERestrictionType::BlockRun;
|
||||
|
||||
UPROPERTY()
|
||||
EClothingSlotType AffectedSlot = EClothingSlotType::Anal;
|
||||
};
|
||||
|
||||
UENUM(BlueprintType)
|
||||
enum class EGarmentContainerSlotType : uint8
|
||||
{
|
||||
@@ -58,9 +95,9 @@ public:
|
||||
int BasePrice;
|
||||
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
|
||||
TArray<EPrivateBodyPartType> CoveredBodyParts; // TODO: Add coverage per body part
|
||||
TArray<FBodyPartCoverage> CoveredBodyParts;
|
||||
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, meta = (EditCondition = "SlotType == EClothingSlotType::Shoes", Category = "Shoes"))
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, meta = (EditCondition = "SlotType == EClothingSlotType::Footwear", Category = "Shoes"))
|
||||
float ShoesOffset = 0.0f;
|
||||
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
|
||||
@@ -72,15 +109,12 @@ public:
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
|
||||
TArray<EBodyPart> CanExpose;
|
||||
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
|
||||
bool IsRestrictive;
|
||||
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
|
||||
float Coverage = 1.0f;
|
||||
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
|
||||
bool IsUnderwear;
|
||||
TArray<FGarmentContainerSlot> ContainerSlots;
|
||||
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
|
||||
TArray<FGarmentContainerSlot> ContainerSlots;
|
||||
TArray<FClothingRestriction> Restrictions;
|
||||
};
|
||||
|
||||
@@ -11,11 +11,11 @@ UClothingManager::UClothingManager()
|
||||
PrimaryComponentTick.bCanEverTick = false;
|
||||
}
|
||||
|
||||
bool UClothingManager::IsBodyTypeExposed(const EPrivateBodyPartType PrivateBodyPartType)
|
||||
bool UClothingManager::IsBodyTypeExposed(const EBodyPart BodyPart)
|
||||
{
|
||||
for (const auto& ClothingSlot : ClothingSlots)
|
||||
{
|
||||
if (ClothingSlot.ClothingItemInstance && ClothingSlot.ClothingItemInstance->GetClothingItem()->CoveredBodyParts.Contains(PrivateBodyPartType))
|
||||
if (ClothingSlot.ClothingItemInstance) // TODO: Add covered body part resolution
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@@ -74,7 +74,7 @@ void UClothingManager::HydrateClothing(UGlobalSaveGameData* SaveGameData)
|
||||
|
||||
float UClothingManager::GetHeelHeight()
|
||||
{
|
||||
if (FClothingSlotData ClothingSlotData; GetClothingSlotData(EClothingSlotType::Shoes, ClothingSlotData))
|
||||
if (FClothingSlotData ClothingSlotData; GetClothingSlotData(EClothingSlotType::Footwear, ClothingSlotData))
|
||||
{
|
||||
if (ClothingSlotData.ClothingItemInstance)
|
||||
{
|
||||
@@ -173,5 +173,5 @@ bool UClothingManager::IsClothingTypeOn(const EClothingSlotType ClothingType)
|
||||
|
||||
bool UClothingManager::IsPartiallyNaked()
|
||||
{
|
||||
return IsBodyTypeExposed(EPrivateBodyPartType::BackBottom) || IsBodyTypeExposed(EPrivateBodyPartType::FrontBottom) || IsBodyTypeExposed(EPrivateBodyPartType::FrontTop);
|
||||
return IsBodyTypeExposed(EBodyPart::Ass) || IsBodyTypeExposed(EBodyPart::Genitals) || IsBodyTypeExposed(EBodyPart::Boobs);
|
||||
}
|
||||
|
||||
@@ -3,13 +3,11 @@
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "BodyPart.h"
|
||||
#include "ClothingSlotData.h"
|
||||
#include "Components/ActorComponent.h"
|
||||
#include "NakedDesire/Player/PrivateBodyPartType.h"
|
||||
#include "ClothingManager.generated.h"
|
||||
|
||||
// TODO: Check clothing colors
|
||||
|
||||
class UGlobalSaveGameData;
|
||||
class AClothingPickup;
|
||||
class UClothingItemInstance;
|
||||
@@ -53,7 +51,7 @@ public:
|
||||
bool IsPartiallyNaked();
|
||||
|
||||
UFUNCTION(BlueprintCallable)
|
||||
bool IsBodyTypeExposed(EPrivateBodyPartType PrivateBodyPartType);
|
||||
bool IsBodyTypeExposed(EBodyPart BodyPart);
|
||||
|
||||
UFUNCTION(BlueprintCallable)
|
||||
void TakeClothing(UClothingItemInstance* ClothingItemInstance);
|
||||
|
||||
@@ -7,18 +7,22 @@
|
||||
UENUM(BlueprintType)
|
||||
enum class EClothingSlotType : uint8
|
||||
{
|
||||
Nipples,
|
||||
Anal,
|
||||
Vagina,
|
||||
Nipples UMETA(ToolTip = "Sex Toy slot only"),
|
||||
Anal UMETA(ToolTip = "Sex Toy slot only"),
|
||||
Vagina UMETA(ToolTip = "Sex Toy slot only"),
|
||||
Head,
|
||||
Neck,
|
||||
Face,
|
||||
Eyes,
|
||||
Body,
|
||||
BodySuit,
|
||||
Top,
|
||||
Bottom,
|
||||
Bra,
|
||||
Panties,
|
||||
UnderwearTop,
|
||||
UnderwearBottom,
|
||||
Socks,
|
||||
Shoes,
|
||||
Footwear,
|
||||
Outerwear,
|
||||
WristRestraint,
|
||||
AnkleRestraint,
|
||||
NeckRestraint,
|
||||
};
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#include "NakedDesire/MissionBuilder/MissionsConfig.h"
|
||||
#include "NakedDesire/MissionBuilder/MissionsManager.h"
|
||||
#include "NakedDesire/Player/NakedDesireCharacter.h"
|
||||
#include "NakedDesire/SaveGame/GlobalSaveGameData.h"
|
||||
|
||||
void ANakedDesireGameMode::RestartGame()
|
||||
{
|
||||
@@ -22,18 +23,19 @@ AWardrobe* ANakedDesireGameMode::GetWardrobe() const
|
||||
|
||||
void ANakedDesireGameMode::BuyItem(UClothingItemInstance* ClothingItemInstance)
|
||||
{
|
||||
ANakedDesireCharacter* Player = Cast<ANakedDesireCharacter>(UGameplayStatics::GetPlayerCharacter(GetWorld(), 0));
|
||||
if (!Player)
|
||||
UGlobalSaveGameData* SaveGame = UGlobalSaveGameData::LoadGame();
|
||||
if (!SaveGame)
|
||||
{
|
||||
UE_LOG(LogTemp, Error, TEXT("ANakedDesireGameMode::BuyItem Couldn't load save game"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (SaveGame->Money < ClothingItemInstance->GetClothingItem()->BasePrice)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (Player->Money < ClothingItemInstance->GetClothingItem()->BasePrice)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Player->Money -= ClothingItemInstance->GetClothingItem()->BasePrice;
|
||||
SaveGame->Money -= ClothingItemInstance->GetClothingItem()->BasePrice;
|
||||
Wardrobe->ClothingItems.Add(ClothingItemInstance);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
// © 2025 Naked People Team. All Rights Reserved.
|
||||
|
||||
|
||||
#include "Utils.h"
|
||||
|
||||
#include "Constants.h"
|
||||
|
||||
FString UUtils::GetSlotName()
|
||||
{
|
||||
return SLOT_NAME;
|
||||
}
|
||||
|
||||
int UUtils::GetSlotPlayer()
|
||||
{
|
||||
return SLOT_PLAYER;
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
// © 2025 Naked People Team. All Rights Reserved.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "Kismet/BlueprintFunctionLibrary.h"
|
||||
#include "Utils.generated.h"
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
UCLASS()
|
||||
class NAKEDDESIRE_API UUtils : public UBlueprintFunctionLibrary
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
public:
|
||||
UFUNCTION(BlueprintCallable, BlueprintPure)
|
||||
static FString GetSlotName();
|
||||
|
||||
UFUNCTION(BlueprintCallable, BlueprintPure)
|
||||
static int GetSlotPlayer();
|
||||
};
|
||||
@@ -0,0 +1 @@
|
||||
#include "SexToyInstance.h"
|
||||
@@ -0,0 +1,20 @@
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "ItemInstance.h"
|
||||
#include "SexToyInstance.generated.h"
|
||||
|
||||
class USexToyItem;
|
||||
|
||||
UCLASS()
|
||||
class NAKEDDESIRE_API USexToyInstance : public UItemInstance
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
public:
|
||||
USexToyItem* GetSexToyItem() const { return SexToyItem; }
|
||||
|
||||
private:
|
||||
UPROPERTY()
|
||||
TObjectPtr<USexToyItem> SexToyItem;
|
||||
};
|
||||
@@ -0,0 +1 @@
|
||||
#include "SexToyItem.h"
|
||||
@@ -0,0 +1,28 @@
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "Engine/DataAsset.h"
|
||||
#include "NakedDesire/Clothing/ClothingSlotType.h"
|
||||
#include "SexToyItem.generated.h"
|
||||
|
||||
UCLASS()
|
||||
class NAKEDDESIRE_API USexToyItem : public UPrimaryDataAsset
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
public:
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Sed Toy")
|
||||
float LustModifier = 0.0f;
|
||||
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Sed Toy")
|
||||
float EmbarrassmentModifier = 0.0f;
|
||||
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Sed Toy")
|
||||
float PulseModifier = 0.0f;
|
||||
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Sed Toy")
|
||||
bool HasVibration = false;
|
||||
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Sed Toy")
|
||||
EClothingSlotType SlotType = EClothingSlotType::Anal;
|
||||
};
|
||||
@@ -27,7 +27,23 @@ void UFlashGoal::Complete()
|
||||
|
||||
FText UFlashGoal::GetDescription() const
|
||||
{
|
||||
const FText BodyTypeString = UPrivateBodyPartType::GetString(BodyType);
|
||||
FText BodyTypeString;
|
||||
|
||||
switch (BodyType)
|
||||
{
|
||||
case EBodyPart::Ass:
|
||||
BodyTypeString = FText::FromString("Ass");
|
||||
break;
|
||||
case EBodyPart::Boobs:
|
||||
BodyTypeString = FText::FromString("Boobs");
|
||||
break;
|
||||
case EBodyPart::Genitals:
|
||||
BodyTypeString = FText::FromString("Genitals");
|
||||
break;
|
||||
default:
|
||||
BodyTypeString = FText::FromString("None");
|
||||
break;
|
||||
}
|
||||
|
||||
if (RequiredFlashCount == 1)
|
||||
{
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "NakedDesire/Clothing/BodyPart.h"
|
||||
#include "NakedDesire/MissionBuilder/MissionGoal.h"
|
||||
#include "NakedDesire/Player/PrivateBodyPartType.h"
|
||||
#include "FlashGoal.generated.h"
|
||||
|
||||
class ANPCAIController;
|
||||
@@ -20,7 +20,7 @@ class NAKEDDESIRE_API UFlashGoal : public UMissionGoal
|
||||
int RequiredFlashCount = 1;
|
||||
|
||||
UPROPERTY(EditDefaultsOnly)
|
||||
EPrivateBodyPartType BodyType;
|
||||
EBodyPart BodyType;
|
||||
|
||||
FDelegateHandle PlayerNoticedHandle;
|
||||
|
||||
|
||||
@@ -32,24 +32,6 @@ void UMissionsManager::CompleteMission(UMission* Mission)
|
||||
OnMissionCompleted.Broadcast(Mission);
|
||||
}
|
||||
|
||||
void UMissionsManager::CollectRewards()
|
||||
{
|
||||
if (CompletedMissions.IsEmpty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
int TotalReward = 0;
|
||||
for (const UMission* Mission : CompletedMissions)
|
||||
{
|
||||
TotalReward += Mission->GetMoneyReward();
|
||||
}
|
||||
|
||||
Player->Money += TotalReward;
|
||||
CompletedMissions.Empty();
|
||||
OnRewardsCollected.Broadcast(TotalReward);
|
||||
}
|
||||
|
||||
void UMissionsManager::RefreshDailyMissions(const TArray<UMission*>& NewMissions)
|
||||
{
|
||||
for (UMission* Mission : AvailableMissions)
|
||||
|
||||
@@ -37,13 +37,9 @@ public:
|
||||
FOnRewardsCollected OnRewardsCollected;
|
||||
|
||||
void CompleteMission(UMission* Mission);
|
||||
|
||||
UFUNCTION(BlueprintCallable)
|
||||
void CollectRewards();
|
||||
|
||||
UFUNCTION()
|
||||
void RefreshDailyMissions(const TArray<UMission*>& NewMissions);
|
||||
|
||||
protected:
|
||||
virtual void BeginPlay() override;
|
||||
};
|
||||
|
||||
@@ -32,18 +32,33 @@ void UExposeBodyPartRestriction::Stop()
|
||||
|
||||
FText UExposeBodyPartRestriction::GetDescription() const
|
||||
{
|
||||
FText Part = UPrivateBodyPartType::GetString(BodyPart);
|
||||
FText BodyPartString;
|
||||
switch (BodyPart)
|
||||
{
|
||||
case EBodyPart::Ass:
|
||||
BodyPartString = FText::FromString("Ass");
|
||||
break;
|
||||
case EBodyPart::Boobs:
|
||||
BodyPartString = FText::FromString("Boobs");
|
||||
break;
|
||||
case EBodyPart::Genitals:
|
||||
BodyPartString = FText::FromString("Genitals");
|
||||
break;
|
||||
default:
|
||||
BodyPartString = FText::FromString("None");
|
||||
break;
|
||||
}
|
||||
|
||||
return FText::Format(RestrictionsExposeBodyPartDescription,
|
||||
FFormatNamedArguments
|
||||
{
|
||||
{TEXT("BodyPart"), Part}
|
||||
{TEXT("BodyPart"), BodyPartString}
|
||||
});
|
||||
}
|
||||
|
||||
void UExposeBodyPartRestriction::EquipClothing(const UClothingItemInstance* ClothingItemInstance)
|
||||
{
|
||||
if (IsSuccess && ClothingItemInstance->GetClothingItem()->CoveredBodyParts.Contains(BodyPart))
|
||||
if (IsSuccess) // TODO: Add covered body part resolution
|
||||
{
|
||||
Init(Player);
|
||||
}
|
||||
@@ -68,7 +83,7 @@ void UExposeBodyPartRestriction::CheckClothing()
|
||||
{
|
||||
if (ClothingSlot.ClothingItemInstance)
|
||||
{
|
||||
return ClothingSlot.ClothingItemInstance->GetClothingItem()->CoveredBodyParts.Contains(BodyPart);
|
||||
return true; // TODO: Add exposed body part resolution
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "NakedDesire/Player/PrivateBodyPartType.h"
|
||||
#include "NakedDesire/Clothing/BodyPart.h"
|
||||
#include "NakedDesire/MissionBuilder/GoalRestriction.h"
|
||||
#include "ExposeBodyPartRestriction.generated.h"
|
||||
|
||||
@@ -18,7 +18,7 @@ class NAKEDDESIRE_API UExposeBodyPartRestriction : public UGoalRestriction
|
||||
FDelegateHandle UnequipClothingHandle;
|
||||
|
||||
UPROPERTY(EditDefaultsOnly)
|
||||
EPrivateBodyPartType BodyPart;
|
||||
EBodyPart BodyPart;
|
||||
|
||||
protected:
|
||||
virtual void Init(ANakedDesireCharacter* PlayerCharacter) override;
|
||||
|
||||
@@ -51,29 +51,37 @@ ANakedDesireCharacter::ANakedDesireCharacter()
|
||||
FaceMeshComponent->SetupAttachment(GetMesh());
|
||||
EyesMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Eyes");
|
||||
EyesMeshComponent->SetupAttachment(GetMesh());
|
||||
BodyMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Body");
|
||||
BodyMeshComponent->SetupAttachment(GetMesh());
|
||||
BodySuitMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Body Suit");
|
||||
BodySuitMeshComponent->SetupAttachment(GetMesh());
|
||||
TopMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Top");
|
||||
TopMeshComponent->SetupAttachment(GetMesh());
|
||||
BottomMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Bottom");
|
||||
BottomMeshComponent->SetupAttachment(GetMesh());
|
||||
BraMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Bra");
|
||||
BraMeshComponent->SetupAttachment(GetMesh());
|
||||
PantiesMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Panties");
|
||||
PantiesMeshComponent->SetupAttachment(GetMesh());
|
||||
UnderwearTopMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Underwear Top");
|
||||
UnderwearTopMeshComponent->SetupAttachment(GetMesh());
|
||||
UnderwearBottomMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Underwear Bottom");
|
||||
UnderwearBottomMeshComponent->SetupAttachment(GetMesh());
|
||||
SocksMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Socks");
|
||||
SocksMeshComponent->SetupAttachment(GetMesh());
|
||||
ShoesMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Shoes");
|
||||
ShoesMeshComponent->SetupAttachment(GetMesh());
|
||||
FootwearMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Footwear");
|
||||
FootwearMeshComponent->SetupAttachment(GetMesh());
|
||||
OuterwearMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Outerwear");
|
||||
OuterwearMeshComponent->SetupAttachment(GetMesh());
|
||||
WristRestraintMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Wrist Restraint");
|
||||
WristRestraintMeshComponent->SetupAttachment(GetMesh());
|
||||
AnkleRestraintMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Ankle Restraint");
|
||||
AnkleRestraintMeshComponent->SetupAttachment(GetMesh());
|
||||
NeckRestraintMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>("Neck Restraint");
|
||||
NeckRestraintMeshComponent->SetupAttachment(GetMesh());
|
||||
|
||||
BoobLCensorship = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Boob L Censorship"));
|
||||
BoobLCensorship->SetupAttachment(GetMesh(), FName(TEXT("boob_l")));
|
||||
BoobRCensorship = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Boob R Censorship"));
|
||||
BoobRCensorship->SetupAttachment(GetMesh(), FName(TEXT("boob_r")));
|
||||
FrontBottomCensorship = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Front Bottom Censorship"));
|
||||
FrontBottomCensorship->SetupAttachment(GetMesh(), FName(TEXT("pelvis")));
|
||||
BackBottomCensorship = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Back Bottom Censorship"));
|
||||
BackBottomCensorship->SetupAttachment(GetMesh(), FName(TEXT("pelvis")));
|
||||
VaginaCensorship = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Vagina Censorship"));
|
||||
VaginaCensorship->SetupAttachment(GetMesh(), FName(TEXT("pelvis")));
|
||||
AnalCensorship = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Anal Censorship"));
|
||||
AnalCensorship->SetupAttachment(GetMesh(), FName(TEXT("pelvis")));
|
||||
|
||||
StimuliSourceComponent = CreateDefaultSubobject<UAIPerceptionStimuliSourceComponent>(TEXT("Stimuli Source Component"));
|
||||
}
|
||||
@@ -176,7 +184,7 @@ UAISense_Sight::EVisibilityResult ANakedDesireCharacter::CanBeSeenFrom(const FCa
|
||||
FHitResult PelvisHitResult;
|
||||
const bool PelvisHit = CheckSight(StartLocation, PelvisBoneLocation, PelvisHitResult, Context.IgnoreActor);
|
||||
|
||||
if ((!BoobsHit || BoobsHitResult.GetActor() == this) && ClothingManager->IsBodyTypeExposed(EPrivateBodyPartType::FrontTop))
|
||||
if ((!BoobsHit || BoobsHitResult.GetActor() == this) && ClothingManager->IsBodyTypeExposed(EBodyPart::Boobs))
|
||||
{
|
||||
UE_LOG(LogTemp, Warning, TEXT("Boobs hit"));
|
||||
OutSeenLocation = BoobsBoneLocation;
|
||||
@@ -185,7 +193,7 @@ UAISense_Sight::EVisibilityResult ANakedDesireCharacter::CanBeSeenFrom(const FCa
|
||||
}
|
||||
|
||||
if ((!PelvisHit || PelvisHitResult.GetActor() == this) &&
|
||||
(ClothingManager->IsBodyTypeExposed(EPrivateBodyPartType::BackBottom) || ClothingManager->IsBodyTypeExposed(EPrivateBodyPartType::FrontBottom)))
|
||||
(ClothingManager->IsBodyTypeExposed(EBodyPart::Ass) || ClothingManager->IsBodyTypeExposed(EBodyPart::Genitals)))
|
||||
{
|
||||
UE_LOG(LogTemp, Warning, TEXT("Pelvis hit"));
|
||||
OutSeenLocation = PelvisBoneLocation;
|
||||
@@ -250,19 +258,20 @@ void ANakedDesireCharacter::OnEndOverlap(UPrimitiveComponent* OverlappedComponen
|
||||
|
||||
void ANakedDesireCharacter::OnClothingEquip(const UClothingItemInstance* ClothingItemInstance)
|
||||
{
|
||||
if (ClothingItemInstance->GetClothingItem()->CoveredBodyParts.Contains(EPrivateBodyPartType::BackBottom))
|
||||
{
|
||||
BackBottomCensorship->SetVisibility(false);
|
||||
}
|
||||
if (ClothingItemInstance->GetClothingItem()->CoveredBodyParts.Contains(EPrivateBodyPartType::FrontBottom))
|
||||
{
|
||||
FrontBottomCensorship->SetVisibility(false);
|
||||
}
|
||||
if (ClothingItemInstance->GetClothingItem()->CoveredBodyParts.Contains(EPrivateBodyPartType::FrontTop))
|
||||
{
|
||||
BoobLCensorship->SetVisibility(false);
|
||||
BoobRCensorship->SetVisibility(false);
|
||||
}
|
||||
// TODO: Add covered body part resolution
|
||||
// if (ClothingItemInstance->GetClothingItem()->CoveredBodyParts.Contains(EBodyPart::Ass))
|
||||
// {
|
||||
// AnalCensorship->SetVisibility(false);
|
||||
// }
|
||||
// if (ClothingItemInstance->GetClothingItem()->CoveredBodyParts.Contains(EBodyPart::Genitals))
|
||||
// {
|
||||
// VaginaCensorship->SetVisibility(false);
|
||||
// }
|
||||
// if (ClothingItemInstance->GetClothingItem()->CoveredBodyParts.Contains(EBodyPart::Boobs))
|
||||
// {
|
||||
// BoobLCensorship->SetVisibility(false);
|
||||
// BoobRCensorship->SetVisibility(false);
|
||||
// }
|
||||
}
|
||||
|
||||
void ANakedDesireCharacter::OnClothingUnequip(const UClothingItemInstance* ClothingItemInstance)
|
||||
@@ -270,15 +279,15 @@ void ANakedDesireCharacter::OnClothingUnequip(const UClothingItemInstance* Cloth
|
||||
if (!UNakedDesireUserSettings::GetNakedDesireUserSettings()->GetIsCensorshipEnabled() && !IS_DEMO)
|
||||
return;
|
||||
|
||||
if (ClothingManager->IsBodyTypeExposed(EPrivateBodyPartType::BackBottom))
|
||||
if (ClothingManager->IsBodyTypeExposed(EBodyPart::Ass))
|
||||
{
|
||||
BackBottomCensorship->SetVisibility(true);
|
||||
AnalCensorship->SetVisibility(true);
|
||||
}
|
||||
if (ClothingManager->IsBodyTypeExposed(EPrivateBodyPartType::FrontBottom))
|
||||
if (ClothingManager->IsBodyTypeExposed(EBodyPart::Genitals))
|
||||
{
|
||||
FrontBottomCensorship->SetVisibility(true);
|
||||
VaginaCensorship->SetVisibility(true);
|
||||
}
|
||||
if (ClothingManager->IsBodyTypeExposed(EPrivateBodyPartType::FrontTop))
|
||||
if (ClothingManager->IsBodyTypeExposed(EBodyPart::Boobs))
|
||||
{
|
||||
BoobLCensorship->SetVisibility(true);
|
||||
BoobRCensorship->SetVisibility(true);
|
||||
@@ -289,15 +298,15 @@ void ANakedDesireCharacter::OnSettingsChanged(UNakedDesireUserSettings* Settings
|
||||
{
|
||||
if (Settings->GetIsCensorshipEnabled())
|
||||
{
|
||||
if (ClothingManager->IsBodyTypeExposed(EPrivateBodyPartType::BackBottom))
|
||||
if (ClothingManager->IsBodyTypeExposed(EBodyPart::Ass))
|
||||
{
|
||||
BackBottomCensorship->SetVisibility(true);
|
||||
AnalCensorship->SetVisibility(true);
|
||||
}
|
||||
if (ClothingManager->IsBodyTypeExposed(EPrivateBodyPartType::FrontBottom))
|
||||
if (ClothingManager->IsBodyTypeExposed(EBodyPart::Genitals))
|
||||
{
|
||||
FrontBottomCensorship->SetVisibility(true);
|
||||
VaginaCensorship->SetVisibility(true);
|
||||
}
|
||||
if (ClothingManager->IsBodyTypeExposed(EPrivateBodyPartType::FrontTop))
|
||||
if (ClothingManager->IsBodyTypeExposed(EBodyPart::Boobs))
|
||||
{
|
||||
BoobLCensorship->SetVisibility(true);
|
||||
BoobRCensorship->SetVisibility(true);
|
||||
@@ -305,8 +314,8 @@ void ANakedDesireCharacter::OnSettingsChanged(UNakedDesireUserSettings* Settings
|
||||
}
|
||||
else if (!IS_DEMO)
|
||||
{
|
||||
BackBottomCensorship->SetVisibility(false);
|
||||
FrontBottomCensorship->SetVisibility(false);
|
||||
AnalCensorship->SetVisibility(false);
|
||||
VaginaCensorship->SetVisibility(false);
|
||||
BoobLCensorship->SetVisibility(false);
|
||||
BoobRCensorship->SetVisibility(false);
|
||||
}
|
||||
@@ -395,9 +404,9 @@ void ANakedDesireCharacter::SetupClothingSlots()
|
||||
LOCTEXT("Eyes", "Eyes")));
|
||||
ClothingManager->ClothingSlots.Add(
|
||||
FClothingSlotData(
|
||||
BodyMeshComponent, EClothingSlotType::Body,
|
||||
BodySuitMeshComponent, EClothingSlotType::BodySuit,
|
||||
nullptr,
|
||||
LOCTEXT("Body", "Body")));
|
||||
LOCTEXT("BodySuit", "BodySuit")));
|
||||
ClothingManager->ClothingSlots.Add(
|
||||
FClothingSlotData(
|
||||
TopMeshComponent, EClothingSlotType::Top,
|
||||
@@ -410,14 +419,14 @@ void ANakedDesireCharacter::SetupClothingSlots()
|
||||
LOCTEXT("Bottom", "Bottom")));
|
||||
ClothingManager->ClothingSlots.Add(
|
||||
FClothingSlotData(
|
||||
BraMeshComponent, EClothingSlotType::Bra,
|
||||
UnderwearTopMeshComponent, EClothingSlotType::UnderwearTop,
|
||||
nullptr,
|
||||
LOCTEXT("Bra", "Bra")));
|
||||
LOCTEXT("UnderwearTop", "UnderwearTop")));
|
||||
ClothingManager->ClothingSlots.Add(
|
||||
FClothingSlotData(
|
||||
PantiesMeshComponent, EClothingSlotType::Panties,
|
||||
UnderwearBottomMeshComponent, EClothingSlotType::UnderwearBottom,
|
||||
nullptr,
|
||||
LOCTEXT("Panties", "Panties")));
|
||||
LOCTEXT("UnderwearBottom", "UnderwearBottom")));
|
||||
ClothingManager->ClothingSlots.Add(
|
||||
FClothingSlotData(
|
||||
SocksMeshComponent, EClothingSlotType::Socks,
|
||||
@@ -425,9 +434,29 @@ void ANakedDesireCharacter::SetupClothingSlots()
|
||||
LOCTEXT("Socks", "Socks")));
|
||||
ClothingManager->ClothingSlots.Add(
|
||||
FClothingSlotData(
|
||||
ShoesMeshComponent, EClothingSlotType::Shoes,
|
||||
FootwearMeshComponent, EClothingSlotType::Footwear,
|
||||
nullptr,
|
||||
LOCTEXT("Shoes", "Shoes")));
|
||||
LOCTEXT("Footwear", "Footwear")));
|
||||
ClothingManager->ClothingSlots.Add(
|
||||
FClothingSlotData(
|
||||
FootwearMeshComponent, EClothingSlotType::Outerwear,
|
||||
nullptr,
|
||||
LOCTEXT("Outerwear", "Outerwear")));
|
||||
ClothingManager->ClothingSlots.Add(
|
||||
FClothingSlotData(
|
||||
FootwearMeshComponent, EClothingSlotType::WristRestraint,
|
||||
nullptr,
|
||||
LOCTEXT("WristRestraint", "WristRestraint")));
|
||||
ClothingManager->ClothingSlots.Add(
|
||||
FClothingSlotData(
|
||||
FootwearMeshComponent, EClothingSlotType::AnkleRestraint,
|
||||
nullptr,
|
||||
LOCTEXT("AnkleRestraint", "AnkleRestraint")));
|
||||
ClothingManager->ClothingSlots.Add(
|
||||
FClothingSlotData(
|
||||
FootwearMeshComponent, EClothingSlotType::NeckRestraint,
|
||||
nullptr,
|
||||
LOCTEXT("NeckRestraint", "NeckRestraint")));
|
||||
|
||||
#undef LOCTEXT_NAMESPACE
|
||||
}
|
||||
|
||||
@@ -73,7 +73,7 @@ public:
|
||||
USkeletalMeshComponent* EyesMeshComponent;
|
||||
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Clothing")
|
||||
USkeletalMeshComponent* BodyMeshComponent;
|
||||
USkeletalMeshComponent* BodySuitMeshComponent;
|
||||
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Clothing")
|
||||
USkeletalMeshComponent* TopMeshComponent;
|
||||
@@ -82,16 +82,28 @@ public:
|
||||
USkeletalMeshComponent* BottomMeshComponent;
|
||||
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Clothing")
|
||||
USkeletalMeshComponent* BraMeshComponent;
|
||||
USkeletalMeshComponent* UnderwearTopMeshComponent;
|
||||
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Clothing")
|
||||
USkeletalMeshComponent* PantiesMeshComponent;
|
||||
USkeletalMeshComponent* UnderwearBottomMeshComponent;
|
||||
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Clothing")
|
||||
USkeletalMeshComponent* SocksMeshComponent;
|
||||
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Clothing")
|
||||
USkeletalMeshComponent* ShoesMeshComponent;
|
||||
USkeletalMeshComponent* FootwearMeshComponent;
|
||||
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Clothing")
|
||||
USkeletalMeshComponent* OuterwearMeshComponent;
|
||||
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Clothing")
|
||||
USkeletalMeshComponent* WristRestraintMeshComponent;
|
||||
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Clothing")
|
||||
USkeletalMeshComponent* AnkleRestraintMeshComponent;
|
||||
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Clothing")
|
||||
USkeletalMeshComponent* NeckRestraintMeshComponent;
|
||||
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Censorship")
|
||||
UStaticMeshComponent* BoobLCensorship;
|
||||
@@ -100,10 +112,10 @@ public:
|
||||
UStaticMeshComponent* BoobRCensorship;
|
||||
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Censorship")
|
||||
UStaticMeshComponent* FrontBottomCensorship;
|
||||
UStaticMeshComponent* VaginaCensorship;
|
||||
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Censorship")
|
||||
UStaticMeshComponent* BackBottomCensorship;
|
||||
UStaticMeshComponent* AnalCensorship;
|
||||
|
||||
// Components
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Clothing")
|
||||
@@ -127,11 +139,8 @@ public:
|
||||
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
|
||||
float RunSpeed = 500.0f;
|
||||
|
||||
UPROPERTY(BlueprintReadWrite)
|
||||
int Money = 0;
|
||||
|
||||
int XP = 0;
|
||||
float XP = 0.0f;
|
||||
|
||||
UPROPERTY()
|
||||
ULocationData* CurrentArea = nullptr;
|
||||
|
||||
@@ -88,19 +88,19 @@ USkeletalMeshComponent* APlayerCinematic::GetMeshByType(const EClothingSlotType
|
||||
return FaceMeshComponent;
|
||||
case EClothingSlotType::Eyes:
|
||||
return EyesMeshComponent;
|
||||
case EClothingSlotType::Body:
|
||||
case EClothingSlotType::BodySuit:
|
||||
return BodyMeshComponent;
|
||||
case EClothingSlotType::Top:
|
||||
return TopMeshComponent;
|
||||
case EClothingSlotType::Bottom:
|
||||
return BottomMeshComponent;
|
||||
case EClothingSlotType::Bra:
|
||||
case EClothingSlotType::UnderwearTop:
|
||||
return BraMeshComponent;
|
||||
case EClothingSlotType::Panties:
|
||||
case EClothingSlotType::UnderwearBottom:
|
||||
return PantiesMeshComponent;
|
||||
case EClothingSlotType::Socks:
|
||||
return SocksMeshComponent;
|
||||
case EClothingSlotType::Shoes:
|
||||
case EClothingSlotType::Footwear:
|
||||
return ShoesMeshComponent;
|
||||
default:
|
||||
return NipplesMeshComponent;
|
||||
|
||||
@@ -93,19 +93,19 @@ USkeletalMeshComponent* APlayerImpostor::GetMeshByType(const EClothingSlotType S
|
||||
return FaceMeshComponent;
|
||||
case EClothingSlotType::Eyes:
|
||||
return EyesMeshComponent;
|
||||
case EClothingSlotType::Body:
|
||||
case EClothingSlotType::BodySuit:
|
||||
return BodyMeshComponent;
|
||||
case EClothingSlotType::Top:
|
||||
return TopMeshComponent;
|
||||
case EClothingSlotType::Bottom:
|
||||
return BottomMeshComponent;
|
||||
case EClothingSlotType::Bra:
|
||||
case EClothingSlotType::UnderwearTop:
|
||||
return BraMeshComponent;
|
||||
case EClothingSlotType::Panties:
|
||||
case EClothingSlotType::UnderwearBottom:
|
||||
return PantiesMeshComponent;
|
||||
case EClothingSlotType::Socks:
|
||||
return SocksMeshComponent;
|
||||
case EClothingSlotType::Shoes:
|
||||
case EClothingSlotType::Footwear:
|
||||
return ShoesMeshComponent;
|
||||
default:
|
||||
return NipplesMeshComponent;
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
// © 2025 Naked People Team. All Rights Reserved.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "PrivateBodyPartType.generated.h"
|
||||
|
||||
#define LOCTEXT_NAMESPACE "Missions.BodyType"
|
||||
const FText BackBottom = LOCTEXT("BackBottom", "back bottom");
|
||||
const FText FrontBottom = LOCTEXT("FrontBottom", "front bottom");
|
||||
const FText FrontTop = LOCTEXT("FrontTop", "front top");
|
||||
#undef LOCTEXT_NAMESPACE
|
||||
|
||||
UENUM(BlueprintType)
|
||||
enum class EPrivateBodyPartType : uint8
|
||||
{
|
||||
FrontBottom = 0,
|
||||
BackBottom = 1,
|
||||
FrontTop = 2
|
||||
};
|
||||
|
||||
UCLASS()
|
||||
class UPrivateBodyPartType : public UObject
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
public:
|
||||
static FText GetString(const EPrivateBodyPartType BodyType)
|
||||
{
|
||||
switch (BodyType)
|
||||
{
|
||||
case EPrivateBodyPartType::BackBottom:
|
||||
return BackBottom;
|
||||
case EPrivateBodyPartType::FrontBottom:
|
||||
return FrontBottom;
|
||||
case EPrivateBodyPartType::FrontTop:
|
||||
return FrontTop;
|
||||
default:
|
||||
return FText::GetEmpty();
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -8,11 +8,10 @@
|
||||
UGlobalSaveGameData* UGlobalSaveGameData::CreateNewSaveGame()
|
||||
{
|
||||
UGlobalSaveGameData* NewSave = Cast<UGlobalSaveGameData>(UGameplayStatics::CreateSaveGameObject(StaticClass()));
|
||||
NewSave->Money = STARTING_MONEY;
|
||||
|
||||
if (!NewSave)
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return NewSave;
|
||||
}
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
#include "GlobalSaveGameData.generated.h"
|
||||
|
||||
struct FItemSaveRecord;
|
||||
class UClothingList;
|
||||
|
||||
UCLASS()
|
||||
class NAKEDDESIRE_API UGlobalSaveGameData : public USaveGame
|
||||
@@ -32,7 +31,7 @@ public:
|
||||
UPROPERTY(SaveGame)
|
||||
TArray<FItemSaveRecord> EquippedItems;
|
||||
|
||||
UPROPERTY(SaceGame)
|
||||
UPROPERTY(SaveGame)
|
||||
int32 DaysPassed = 0;
|
||||
|
||||
UPROPERTY(SaveGame)
|
||||
|
||||
@@ -19,14 +19,10 @@ void USaveSubsystem::AddItem(const FItemSaveRecord& Record)
|
||||
|
||||
void USaveSubsystem::RemoveItem(const FGuid& InstanceId)
|
||||
{
|
||||
FItemSaveRecord* ItemSaveRecord = Items.FindByPredicate([InstanceId](FItemSaveRecord ItemSaveRecord)
|
||||
Items.RemoveAll([InstanceId](const FItemSaveRecord& Item)
|
||||
{
|
||||
return ItemSaveRecord.InstanceId == InstanceId;
|
||||
return Item.InstanceId == InstanceId;
|
||||
});
|
||||
if (ItemSaveRecord)
|
||||
{
|
||||
Items.Remove(*ItemSaveRecord);
|
||||
}
|
||||
}
|
||||
|
||||
void USaveSubsystem::Initialize(FSubsystemCollectionBase& Collection)
|
||||
|
||||
Reference in New Issue
Block a user