This commit is contained in:
2026-05-24 20:50:34 +03:00
parent 321683941e
commit 799fc8a4ae
25 changed files with 266 additions and 218 deletions
+42 -8
View File
@@ -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);
+11 -7
View File
@@ -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);
}
-16
View File
@@ -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;
}
-23
View File
@@ -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"
+20
View File
@@ -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;
};
+1
View File
@@ -0,0 +1 @@
#include "SexToyItem.h"
+28
View File
@@ -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;
+4 -4
View File
@@ -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)