More fixes for removal mode and cleanup of some stuff

This commit is contained in:
2026-09-13 16:42:22 +02:00
parent 861657d7ce
commit 4f029309d5
88 changed files with 273 additions and 312 deletions

View File

@@ -193,6 +193,8 @@ CameraZoomLevels=(((TagName="Camera.BoomOffset.Default"), (X=-1200.000000,Y=0.00
+ProfessionExpArray=240000.000000
ExpIncreaseEffectClass=/Script/Engine.BlueprintGeneratedClass'/Game/Blueprints/GameEffects/GSE_AddExp_Template.GSE_AddExp_Template_C'
GlobalSettingsDataSheet=/Game/GameData/CSV/GlobalKeyValueSettings.GlobalKeyValueSettings
ItemSeedCarouselClass=None
RemovableStaticMeshClass=/Script/Engine.BlueprintGeneratedClass'/Game/Prefabs/BP_RemovableStaticMeshActor.BP_RemovableStaticMeshActor_C'
[/Script/InteractionSystem.InteractionSettings]
DefaultInteractionWidgetClass=/Script/UMG.WidgetBlueprintGeneratedClass'/Game/UI/InteractionUI/WBP_Eleri_Interaction.WBP_Eleri_Interaction_C'

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -426,18 +426,6 @@ bool UMoveActorsComponent::PlaceableActionUsed(ERemovalAction ActionUsed)
case ERemovalAction::PLACE:
if (PlayerController && MovingActor->IsPlaceable())
{
FPrimaryAssetId ItemId = MovingActor->ItemStack.ItemId;
if (!ItemId.IsValid())
{
ItemId = MovingActor->DataAssetId;
}
if (ItemId.IsValid())
{
if (UInventoryComponent* Inventory = UMainBlueprintFunctionLibrary::GetPlayerInventory(GetWorld()))
{
Inventory->RemoveItemFromInventory(ItemId, 1, false, false);
}
}
PlaceObjectForPlacing();
return true;
}
@@ -445,26 +433,16 @@ bool UMoveActorsComponent::PlaceableActionUsed(ERemovalAction ActionUsed)
case ERemovalAction::REMOVE:
{
// A world object is returned to the player's inventory before it is removed.
if (MovingActor->DataAssetId.IsValid() && !MovingActor->bFromInventory)
if (UObjectPersistenceSubsystem* ObjectPersistenceSubsystem = UGameplayStatics::GetGameInstance(GetWorld())->GetSubsystem<UObjectPersistenceSubsystem>())
{
if (UInventoryComponent* Inventory = UMainBlueprintFunctionLibrary::GetPlayerInventory(GetWorld()))
{
Inventory->AddItemToInventory(MovingActor->DataAssetId, 1, false, false);
}
ObjectPersistenceSubsystem->RemoveActorFromLevel(MovingActor);
}
if (UGameInstance* GameInstance = UGameplayStatics::GetGameInstance(GetWorld()))
if (UItemDatabase* ItemDatabase = UGameplayStatics::GetGameInstance(GetWorld())->GetSubsystem<UItemDatabase>())
{
if (UObjectPersistenceSubsystem* ObjectPersistenceSubsystem = GameInstance->GetSubsystem<UObjectPersistenceSubsystem>())
{
ObjectPersistenceSubsystem->RemoveActorFromLevel(MovingActor);
return true;
}
ItemDatabase->RemoveDecorationItem(MovingActor);
}
// Fallback if the persistence subsystem is unavailable.
MovingActor->Destroy();
return true;
}
@@ -473,9 +451,10 @@ bool UMoveActorsComponent::PlaceableActionUsed(ERemovalAction ActionUsed)
// Cancel the current placement/move without committing it.
if (MovingActor->bFromInventory)
{
// A preview spawned from the inventory: return the item and destroy the preview.
MovingActor->ReturnToInventory();
MovingActor->Destroy();
if (UItemDatabase* ItemDatabase = UGameplayStatics::GetGameInstance(GetWorld())->GetSubsystem<UItemDatabase>())
{
ItemDatabase->RemoveDecorationItem(MovingActor);
}
}
else
{
@@ -519,7 +498,6 @@ bool UMoveActorsComponent::PlaceObjectForPlacing()
}
MovingActor->Place();
RemovalModePlacingStack--;
return RemoveObjectForPlacing();
}
@@ -527,22 +505,15 @@ bool UMoveActorsComponent::RemoveObjectForPlacing()
{
if (!PlayerController) return false;
// Get the Enhanced Input Local Player Subsystem from the Local Player related to our Player Controller.
if (UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(PlayerController->GetLocalPlayer()))
{
if (RemovalModePlacingStack <= 0)
{
Subsystem->RemoveMappingContext(PlayerController->RemoveModeContext);
}
}
MovingActor = nullptr;
return true;
}
void UMoveActorsComponent::StartObjectRemoval(bool bStart, int32 Stack)
void UMoveActorsComponent::StartObjectRemoval(bool bStart)
{
if (bStart && bRemovalMode) return;
if (!PlayerCharacter) return;
if (!bStart)
@@ -551,7 +522,6 @@ void UMoveActorsComponent::StartObjectRemoval(bool bStart, int32 Stack)
}
PlayerCharacter->CurrentlyDoing = bStart ? ECurrentlyDoing::OBJECT_PLACING : ECurrentlyDoing::NOTHING;
RemovalModePlacingStack = Stack;
if (bStart && !bRemovalModePossible) return;
if (!bStart)
@@ -566,9 +536,6 @@ void UMoveActorsComponent::StartObjectRemoval(bool bStart, int32 Stack)
bRemovalMode = bStart;
OnRemovalModeToggled.Broadcast(bRemovalMode);
PlayerCharacter->SetNewCameraPitches(
bStart ? PlayerCharacter->CameraPitchMin - 50 : PlayerCharacter->CameraPitchMin,
bStart ? PlayerCharacter->CameraPitchMax + 5 : PlayerCharacter->CameraPitchMax);
if (PlayerController && PlayerController->GetMainGameWidget())
{

View File

@@ -4,6 +4,7 @@
#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "ProjectEleri/GameObjects/RemovableStaticMeshActor.h"
#include "MoveActorsComponent.generated.h"
@@ -53,9 +54,6 @@ public:
UPROPERTY(BlueprintReadWrite)
ARemovableStaticMeshActor* MovingActor;
UPROPERTY()
int32 RemovalModePlacingStack;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
TArray<TSubclassOf<AActor>> ActorsToIgnore;
@@ -135,9 +133,9 @@ protected:
ARemovableStaticMeshActor* HighligtedMovingActor;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
UPROPERTY(EditAnywhere, BlueprintReadOnly)
bool bRemovalModePossible;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
UPROPERTY(EditAnywhere, BlueprintReadOnly)
bool bRemovalMode;
UPROPERTY()
bool bGridMovementActive;
@@ -188,6 +186,8 @@ public:
bool IsRemovingModePossible() const { return bRemovalModePossible; }
UFUNCTION(BlueprintCallable, BlueprintPure)
bool IsRemovingMode() const { return bRemovalMode; }
UFUNCTION(BlueprintCallable, BlueprintPure)
bool IsPlacingObject() const { return IsValid(MovingActor); }
UFUNCTION(BlueprintCallable)
@@ -199,7 +199,7 @@ public:
UFUNCTION(BlueprintCallable)
bool RemoveObjectForPlacing();
UFUNCTION(BlueprintCallable)
void StartObjectRemoval(bool bStart = true, int32 Stack = 9999);
void StartObjectRemoval(bool bStart = true);
UFUNCTION(BlueprintCallable)
bool HighlightRemovableObject(ARemovableStaticMeshActor* Placable);
UFUNCTION(BlueprintCallable)

View File

@@ -98,10 +98,17 @@ bool ARemovableStaticMeshActor::IsInteractable_Implementation() const
return true;
}
void ARemovableStaticMeshActor::BindToItem(UInventoryComponent* InInventory, FItemStack InItemStack)
void ARemovableStaticMeshActor::Initialize(UStaticMesh* StaticMesh, UItemDataAsset* InItemDataAsset)
{
GetStaticMeshComponent()->SetStaticMesh(StaticMesh);
GetStaticMeshComponent()->SetCollisionEnabled(ECollisionEnabled::NoCollision);
MeshMaterials = GetStaticMeshComponent()->GetMaterials();
ItemDataAsset = InItemDataAsset;
DataAssetId = ItemDataAsset->GetPrimaryAssetId();
}
void ARemovableStaticMeshActor::BindToItem(UInventoryComponent* InInventory)
{
InventoryRef = InInventory;
ItemStack = InItemStack;
bFromInventory = true;
}
@@ -126,8 +133,6 @@ void ARemovableStaticMeshActor::Place(bool ReturnToOldLocation, bool bForce)
if (bPlaced)
{
//Reset this because we've placed the item in the world
InventoryRef = nullptr;
ItemStack = FItemStack();
bFromInventory = false;
if (ReturnToOldLocation)
@@ -147,6 +152,7 @@ void ARemovableStaticMeshActor::Place(bool ReturnToOldLocation, bool bForce)
}
}
CurrentMemorizedTransform = GetActorTransform();
GetStaticMeshComponent()->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);
OnPlaced.Broadcast();
}
}
@@ -192,10 +198,3 @@ void ARemovableStaticMeshActor::ReportGridFootprint()
CellsX * Pitch - Size.X, CellsY * Pitch - Size.Y, FillScale);
}
void ARemovableStaticMeshActor::ReturnToInventory()
{
if (InventoryRef)
{
InventoryRef->AddItemToInventory(ItemStack.ItemId, 1, false, ItemStack.HQ);
}
}

View File

@@ -52,14 +52,12 @@ public:
UPROPERTY()
FTransform CurrentMemorizedTransform;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
UInventoryComponent* InventoryRef;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FItemStack ItemStack;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
AActor* PlayerRef;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
UItemDataAsset* ItemDataAsset;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
bool bPlaced;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
@@ -115,8 +113,6 @@ public:
UFUNCTION(BlueprintCallable, BlueprintPure)
FORCEINLINE bool IsPlaceable() const { return bPlaceable; }
UFUNCTION(BlueprintCallable, BLueprintPure)
FORCEINLINE bool FromInventory() const { return InventoryRef != nullptr; }
UPROPERTY(BlueprintAssignable, EditAnywhere, BLueprintReadWrite)
FOnPlaced OnPlaced;
@@ -125,11 +121,13 @@ public:
UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
UInteractionWidgetComponent* WidgetComponent;
void Initialize(UStaticMesh* StaticMesh, UItemDataAsset* InItemDataAsset);
//Used when placing stuff from inventory so we can return it to inventory
//if we cancel placing item
UFUNCTION(BlueprintCallable)
void BindToItem(UInventoryComponent* InInventory, FItemStack InItemStack);
void BindToItem(UInventoryComponent* InInventory);
UFUNCTION(BlueprintCallable)
void PickUp();
@@ -140,9 +138,6 @@ public:
UFUNCTION(BlueprintCallable)
void Rotate(bool bPositive);
UFUNCTION(BlueprintCallable)
void ReturnToInventory();
virtual bool CanPlace() { return true; }
UFUNCTION(BlueprintImplementableEvent, BlueprintCallable)

View File

@@ -65,7 +65,7 @@ class ARemovableStaticMeshActor;
/**
*
*/
UCLASS(BlueprintType)
UCLASS(BlueprintType, PrioritizeCategories = ("Default", "Info", "Placeable", "Craftable", "Property Map", "Seed"))
class PROJECTELERI_API UItemDataAsset : public UPrimaryDataAsset
{
GENERATED_BODY()
@@ -120,10 +120,16 @@ public:
bool Stackable = true;
/** Mesh that the item / potion have, ignored for seeds */
UPROPERTY()
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Placeable", meta=(EditCondition="ItemCategory==Category::Decoration", EditConditionHides))
TSoftObjectPtr<UStaticMesh> ItemMesh;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Info", meta=(EditCondition="ItemCategory==Category::Decoration", EditConditionHides, MetaClass="/Script/ProjectEleri.RemovableStaticMeshActor"))
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Placeable", meta=(EditCondition="ItemCategory==Category::Decoration", EditConditionHides))
int32 GridScale = 1;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Placeable", meta=(EditCondition="ItemCategory==Category::Decoration", EditConditionHides))
FVector BoxExtentOverride;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Placeable", meta=(EditCondition="ItemCategory==Category::Decoration", EditConditionHides, MetaClass="/Script/ProjectEleri.RemovableStaticMeshActor"))
FSoftClassPath DecorationActorClassPath;
@@ -132,9 +138,6 @@ public:
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Info", AssetRegistrySearchable, meta = (AssetBundles = "Inventory, Book"))
int32 BaseCost;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Info", AssetRegistrySearchable, meta = (AssetBundles = "Inventory, Book"))
TSoftObjectPtr<UTexture2D> PropertyMapTexture;
/*--------------------------------------------------------------------------------------------------------------------------*/
/** What part of the world grants faster growth and higher chance to harvest an HQ ingredient */

View File

@@ -8,6 +8,9 @@
#include "Engine/AssetManager.h"
#include "BookOfAlchemyManager.h"
#include "Kismet/GameplayStatics.h"
#include "ProjectEleri/Components/MoveActorsComponent.h"
#include "ProjectEleri/Settings/EleriGameSettings.h"
#include "ProjectEleri/System/MainBlueprintFunctionLibrary.h"
UWorld* UItemDatabase::GetWorld() const {
if (const UGameInstance* GameInstance = GetGameInstance()) {
@@ -52,6 +55,9 @@ void UItemDatabase::Initialize(FSubsystemCollectionBase& Collection) {
else {
UAssetManager::CallOrRegister_OnCompletedInitialScan(FStopRenderingThreadDelegate::CreateLambda(LoadDataLambda));
}
RemovableStaticMeshClass = GetDefault<UEleriGameSettings>()->RemovableStaticMeshClass;
ItemSeedCarouselClass = GetDefault<UEleriGameSettings>()->ItemSeedCarouselClass;
}
@@ -427,6 +433,53 @@ Element UItemDatabase::GetStrongestElement(const TArray<UItemDataAsset*>& Potion
return (Element)StrongestIndex;
}
void UItemDatabase::SpawnDecorationItem(UItemDataAsset* ItemAsset)
{
if (!ItemAsset || ItemAsset->ItemMesh.IsNull())
{
return;
}
ItemAsset->ItemMesh.LoadAsync(FLoadSoftObjectPathAsyncDelegate::CreateUObject(this, &UItemDatabase::OnDecorationItemLoaded, ItemAsset));
}
void UItemDatabase::RemoveDecorationItem(ARemovableStaticMeshActor* DecorationItem)
{
if (DecorationItem->ItemDataAsset && DecorationItem->bFromInventory)
{
UInventoryComponent* InventoryComponent = UMainBlueprintFunctionLibrary::GetPlayerInventory(GetWorld());
InventoryComponent->AddItemToInventory(DecorationItem->ItemDataAsset->GetPrimaryAssetId(), 1);
}
DecorationItem->Destroy();
}
void UItemDatabase::OnDecorationItemLoaded(const FSoftObjectPath& Path, UObject* Object, UItemDataAsset* ItemAsset)
{
UStaticMesh* StaticMesh = Cast<UStaticMesh>(Object);
if (!StaticMesh || !ItemAsset) return;
ACharacter* PlayerCharacter = UGameplayStatics::GetPlayerCharacter(GetWorld(), 0);
const FVector Location = PlayerCharacter->GetActorLocation() + (PlayerCharacter->GetActorForwardVector() * 1000.f);
FActorSpawnParameters SpawnParams;
SpawnParams.Instigator = PlayerCharacter;
SpawnParams.Owner = PlayerCharacter;
ARemovableStaticMeshActor* SpawnedActor = GetWorld()->SpawnActor<ARemovableStaticMeshActor>(RemovableStaticMeshClass, Location, FRotator::ZeroRotator, SpawnParams);
if (!SpawnedActor) return;
SpawnedActor->SetMobility(EComponentMobility::Movable);
SpawnedActor->Initialize(StaticMesh, ItemAsset);
UInventoryComponent* InventoryComponent = UMainBlueprintFunctionLibrary::GetPlayerInventory(GetWorld());
SpawnedActor->BindToItem(InventoryComponent);
InventoryComponent->RemoveItemFromInventory(ItemAsset->GetPrimaryAssetId(), 1);
UMoveActorsComponent* MoveActorsComponent = PlayerCharacter->GetComponentByClass<UMoveActorsComponent>();
if (!MoveActorsComponent) return;
MoveActorsComponent->StartObjectRemoval(true);
MoveActorsComponent->PickUpObjectForPlacing(SpawnedActor);
}
void FArrayOfItemRefs::SortByName()
{
ItemArray.Sort();

View File

@@ -58,67 +58,76 @@ protected:
public:
UPROPERTY(EditDefaultsOnly)
UPROPERTY(EditDefaultsOnly, Category = "Item Database")
TSubclassOf<AActor> ItemSeedCarouselClass;
UPROPERTY(EditDefaultsOnly, Category = "Item Database")
TSubclassOf<ARemovableStaticMeshActor> RemovableStaticMeshClass;
UPROPERTY(EditAnywhere, BlueprintReadOnly)
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item Database")
TArray<FPrimaryAssetId> AllAssetIds;
UPROPERTY(EditAnywhere, BlueprintReadOnly)
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item Database")
TArray<UItemDataAsset*> LoadedItems;
UPROPERTY(EditAnywhere, BlueprintReadOnly)
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item Database")
TMap<Category, FArrayOfItemRefs> LoadedItemsByCategory;
UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Item Database")
TArray<ASeedCarousel*> SeedsPlanted;
public:
UFUNCTION(BlueprintCallable)
UFUNCTION(BlueprintCallable, Category = "Item Database")
void WaterAllSeeds();
UFUNCTION(BlueprintCallable)
UFUNCTION(BlueprintCallable, Category = "Item Database")
bool DoChemicalAlignmentsMatch(TArray<int32> Alignments, TArray<int32> PotionAlignments);
UFUNCTION(BlueprintCallable)
UFUNCTION(BlueprintCallable, Category = "Item Database")
UItemDataAsset* GetPotionFromItems(TArray<UItemDataAsset*> Items, bool& Found);
UFUNCTION(BlueprintCallable)
UFUNCTION(BlueprintCallable, Category = "Item Database")
UItemDataAsset* GetPotionDataFromItems(TArray<UItemDataAsset*> Items);
UFUNCTION(BlueprintCallable)
UFUNCTION(BlueprintCallable, Category = "Item Database")
TArray<UItemDataAsset*> GetPotionsMatchingChemicalAlignment(UItemDataAsset* Ingredient);
UFUNCTION(BlueprintCallable)
UFUNCTION(BlueprintCallable, Category = "Item Database")
TArray<UItemDataAsset*> GetPotionsMatchingProperties(const TArray<UItemDataAsset*> &PotionList, TMap<ItemProperty, int32> PropertyList);
UFUNCTION(BlueprintCallable)
UFUNCTION(BlueprintCallable, Category = "Item Database")
UItemDataAsset* GetDataAssetFromId(FPrimaryAssetId AssetId);
UFUNCTION(BlueprintCallable)
UFUNCTION(BlueprintCallable, Category = "Item Database")
TArray<UItemDataAsset*> GetDataAssetsFromIds(TArray<FPrimaryAssetId> AssetIds);
UFUNCTION(BlueprintCallable)
UFUNCTION(BlueprintCallable, Category = "Item Database")
float CalculatePotionPurity(TMap<ItemProperty, int32> PropertyList, TArray<FPropertyStrength> MainProperties);
UFUNCTION(BlueprintCallable)
UFUNCTION(BlueprintCallable, Category = "Item Database")
int32 GetCrystalCostForPotion(UItemDataAsset* Potion);
UFUNCTION(BlueprintCallable)
UFUNCTION(BlueprintCallable, Category = "Item Database")
int32 GetCrystalCostForItems(TArray<UItemDataAsset*> Items);
UFUNCTION(BlueprintCallable)
UFUNCTION(BlueprintCallable, Category = "Item Database")
Element GetStrongestElement(const TArray<UItemDataAsset*>& PotionList);
UFUNCTION(BlueprintCallable, Category = "Item Database")
void SpawnDecorationItem(UItemDataAsset* ItemAsset);
void RemoveDecorationItem(ARemovableStaticMeshActor* DecorationItem);
protected:
UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Item Database")
TArray<FItemPriceData> ItemPriceDataList;
protected:
void PrepareItemPriceData();
UFUNCTION()
void OnDecorationItemLoaded(const FSoftObjectPath& Path, UObject* Object, UItemDataAsset* ItemAsset);
UFUNCTION(BlueprintCallable, BlueprintPure)
UFUNCTION(BlueprintCallable, BlueprintPure, Category = "Item Database")
int32 GetCurrentPriceForItem(FPrimaryAssetId ItemId);
UFUNCTION(BlueprintCallable, BlueprintPure)
UFUNCTION(BlueprintCallable, BlueprintPure, Category = "Item Database")
TArray<int32> GetPriceHistoryForItem(FPrimaryAssetId ItemId);
};

View File

@@ -0,0 +1,26 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "SeedBedActor.h"
// Sets default values
ASeedBedActor::ASeedBedActor()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
}
// Called when the game starts or when spawned
void ASeedBedActor::BeginPlay()
{
Super::BeginPlay();
}
// Called every frame
void ASeedBedActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}

View File

@@ -0,0 +1,25 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "SeedBedActor.generated.h"
UCLASS()
class PROJECTELERI_API ASeedBedActor : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
ASeedBedActor();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
};

View File

@@ -570,7 +570,6 @@ void AEleriPlayerController::OnRemoveAction(const FInputActionValue &Value)
{
MoveActorsComp->PlaceableActionUsed(ERemovalAction::REMOVE);
MoveActorsComp->MovingActor = nullptr;
MoveActorsComp->RemovalModePlacingStack = 0;
}
}
@@ -617,43 +616,18 @@ void AEleriPlayerController::OnPlaceObjectAction(const FInputActionValue &Value)
if (MoveActorsComp->MovingActor)
{
UClass *ClassToLoad = MoveActorsComp->MovingActor->GetClass();
FVector Location = MoveActorsComp->MovingActor->GetActorLocation();
UInventoryComponent *Inventory = MoveActorsComp->MovingActor->InventoryRef;
FItemStack Stack = MoveActorsComp->MovingActor->ItemStack;
UItemDatabase* ItemDatabase = UGameplayStatics::GetGameInstance(GetWorld())->GetSubsystem<UItemDatabase>();
UInventoryComponent *Inventory = UMainBlueprintFunctionLibrary::GetPlayerInventory(this);
UItemDataAsset* DataAsset = MoveActorsComp->MovingActor->ItemDataAsset;
if (!MoveActorsComp->PlaceableActionUsed(ERemovalAction::PLACE))
return;
if (Inventory)
int32 StackCount = Inventory->GetStackForItem(DataAsset->GetPrimaryAssetId(), false, false);
if (StackCount > 0)
{
Stack.Stack = Inventory->GetStackForItem(Stack.ItemId, Stack.Seed, Stack.HQ);
}
else
{
Stack.Stack = 0;
}
if (ClassToLoad && Stack.Stack > 0)
{
FTransform PlaceableTransform;
PlaceableTransform.SetLocation(Location);
if (ARemovableStaticMeshActor *SpawnedActor = UMainBlueprintFunctionLibrary::SpawnPlaceable(GetWorld(), ClassToLoad, PlaceableTransform, FVector::OneVector))
{
if (!MoveActorsComp || !MoveActorsComp->IsRemovingMode())
{
SpawnedActor->Destroy();
MoveActorsComp->MovingActor = nullptr;
return;
}
SpawnedActor->BindToItem(Inventory, Stack);
SpawnedActor->PickUp();
MoveActorsComp->MovingActor = SpawnedActor;
}
}
if (MoveActorsComp->RemovalModePlacingStack <= 0)
{
MoveActorsComp->StartObjectRemoval(false);
ensure(ItemDatabase);
ItemDatabase->SpawnDecorationItem(DataAsset);
}
}
else

View File

@@ -11,6 +11,7 @@
#include "EleriGameSettings.generated.h"
class ARemovableStaticMeshActor;
class UDataTable;
class UNpcDataAsset;
class UNpcScheduleAsset;
@@ -28,6 +29,10 @@ public:
UPROPERTY(Config, EditAnywhere, BlueprintReadOnly, Category = "Items", meta = (ForceInlineRow, Categories = "Items"))
TMap<FGameplayTag, FPrimaryAssetId> SpecialItemsMap;
UPROPERTY(Config, EditAnywhere, BlueprintReadOnly, Category = "Items")
TSubclassOf<ARemovableStaticMeshActor> RemovableStaticMeshClass;
UPROPERTY(Config, EditAnywhere, BlueprintReadOnly, Category = "Items")
TSubclassOf<AActor> ItemSeedCarouselClass;
UPROPERTY(Config, EditAnywhere, BlueprintReadOnly, Category = "Camera")
TMap<FGameplayTag, FVector> CameraZoomLevels;
@@ -59,7 +64,6 @@ public:
UFUNCTION(BlueprintCallable, BlueprintPure, Category = "Items")
static UItemDataAsset* GetSpecialItem(UObject* WorldContext, FGameplayTag Tag);
UFUNCTION(BlueprintCallable, BlueprintPure, Category = "Ability System|Professions")
static int32 GetProfessionLevelForExp(float Exp);

View File

@@ -29,10 +29,7 @@ void UObjectPersistenceSubsystem::RemoveActorFromLevel(AActor* ActorToRemove)
if (ActorIndex != INDEX_NONE)
{
PlacedActors.RemoveAt(ActorIndex);
}
ActorToRemove->Destroy();
}
void UObjectPersistenceSubsystem::PlacebleActorMoved(AActor* ActorMoved, bool bNewVisiblity)