Add resource node persistence

This commit is contained in:
2026-05-17 17:08:05 -07:00
parent 843340ebdc
commit 5da545e000
13 changed files with 276 additions and 4 deletions
@@ -4,6 +4,7 @@
#include "AgrarianGameCharacter.h"
#include "AgrarianInventoryComponent.h"
#include "AgrarianItemDefinitionAsset.h"
#include "AgrarianSaveGame.h"
#include "Components/StaticMeshComponent.h"
#include "TimerManager.h"
#include "Net/UnrealNetwork.h"
@@ -94,6 +95,40 @@ void AAgrarianResourceNode::OnRep_RemainingHarvests()
UpdateDepletedState();
}
FName AAgrarianResourceNode::GetResourcePersistenceId() const
{
return PersistenceNodeId != NAME_None ? PersistenceNodeId : GetFName();
}
FAgrarianSavedResourceNode AAgrarianResourceNode::CaptureResourceSaveState() const
{
FAgrarianSavedResourceNode SavedNode;
SavedNode.ResourceNodeId = GetResourcePersistenceId();
SavedNode.RemainingHarvests = RemainingHarvests;
SavedNode.bRespawnsForMvp = bRespawnsForMvp;
return SavedNode;
}
void AAgrarianResourceNode::ApplyResourceSaveState(const FAgrarianSavedResourceNode& SavedNode)
{
if (!HasAuthority() || SavedNode.ResourceNodeId == NAME_None || SavedNode.ResourceNodeId != GetResourcePersistenceId())
{
return;
}
RemainingHarvests = FMath::Clamp(SavedNode.RemainingHarvests, 0, FMath::Max(1, MaxHarvests));
if (RemainingHarvests > 0)
{
if (UWorld* World = GetWorld())
{
World->GetTimerManager().ClearTimer(RespawnTimerHandle);
}
}
UpdateDepletedState();
ScheduleRespawnIfNeeded();
}
bool AAgrarianResourceNode::HasRequiredTool(const AAgrarianGameCharacter* Interactor) const
{
if (RequiredToolItemId == NAME_None)