Add item use command

This commit is contained in:
2026-05-17 13:01:00 -07:00
parent 555ad6df25
commit 712a8548c0
7 changed files with 181 additions and 1 deletions
@@ -20,6 +20,39 @@
namespace
{
const FVector GroundZeroDeveloperTravelHomeLocation(-22000.0f, -3500.0f, 1148.0f);
bool ApplyAgrarianItemUseEffect(const FName ItemId, const int32 Quantity, UAgrarianSurvivalComponent* SurvivalComponent, FString& OutEffectSummary)
{
if (!SurvivalComponent || Quantity <= 0)
{
return false;
}
if (ItemId == TEXT("food"))
{
SurvivalComponent->AddFood(15.0f * Quantity);
OutEffectSummary = FString::Printf(TEXT("restored %.0f hunger"), 15.0f * Quantity);
return true;
}
if (ItemId == TEXT("meat"))
{
SurvivalComponent->AddFood(22.0f * Quantity);
SurvivalComponent->AddSickness(3.0f * Quantity);
OutEffectSummary = FString::Printf(TEXT("restored %.0f hunger but added raw-meat sickness risk"), 22.0f * Quantity);
return true;
}
if (ItemId == TEXT("bandage"))
{
SurvivalComponent->ReduceInjury(18.0f * Quantity);
SurvivalComponent->RestoreHealth(4.0f * Quantity);
OutEffectSummary = FString::Printf(TEXT("treated %.0f injury severity"), 18.0f * Quantity);
return true;
}
return false;
}
}
void AAgrarianGamePlayerController::BeginPlay()
@@ -150,6 +183,17 @@ void AAgrarianGamePlayerController::AgrarianSplitStack(int32 StackIndex, int32 S
ServerAgrarianSplitStack(StackIndex, SplitQuantity);
}
void AAgrarianGamePlayerController::AgrarianUseItem(FName ItemId, int32 Quantity)
{
if (ItemId == NAME_None || Quantity <= 0)
{
ClientMessage(TEXT("Usage: AgrarianUseItem <ItemId> <Quantity>"));
return;
}
ServerAgrarianUseItem(ItemId, Quantity);
}
void AAgrarianGamePlayerController::AgrarianTravel(float X, float Y, float Z)
{
ServerAgrarianTravel(FVector(X, Y, Z));
@@ -299,6 +343,35 @@ void AAgrarianGamePlayerController::ServerAgrarianSplitStack_Implementation(int3
}
}
void AAgrarianGamePlayerController::ServerAgrarianUseItem_Implementation(FName ItemId, int32 Quantity)
{
AAgrarianGameCharacter* AgrarianCharacter = GetPawn<AAgrarianGameCharacter>();
UAgrarianInventoryComponent* InventoryComponent = AgrarianCharacter ? AgrarianCharacter->GetInventoryComponent() : nullptr;
UAgrarianSurvivalComponent* SurvivalComponent = AgrarianCharacter ? AgrarianCharacter->GetSurvivalComponent() : nullptr;
if (!InventoryComponent || !SurvivalComponent)
{
ClientMessage(TEXT("No Agrarian inventory or survival component found."));
return;
}
FAgrarianItemStack UsedStack;
if (!InventoryComponent->ExtractItem(ItemId, Quantity, UsedStack))
{
ClientMessage(FString::Printf(TEXT("Could not use %d x %s."), Quantity, *ItemId.ToString()));
return;
}
FString EffectSummary;
if (!ApplyAgrarianItemUseEffect(ItemId, UsedStack.Quantity, SurvivalComponent, EffectSummary))
{
InventoryComponent->AddItem(UsedStack);
ClientMessage(FString::Printf(TEXT("%s cannot be used yet; item restored."), *ItemId.ToString()));
return;
}
ClientMessage(FString::Printf(TEXT("Used %d x %s: %s."), UsedStack.Quantity, *ItemId.ToString(), *EffectSummary));
}
void AAgrarianGamePlayerController::ServerAgrarianTravel_Implementation(FVector Destination)
{
APawn* ControlledPawn = GetPawn();