Add item use command
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -72,6 +72,9 @@ public:
|
||||
UFUNCTION(Exec)
|
||||
void AgrarianSplitStack(int32 StackIndex, int32 SplitQuantity);
|
||||
|
||||
UFUNCTION(Exec)
|
||||
void AgrarianUseItem(FName ItemId, int32 Quantity);
|
||||
|
||||
UFUNCTION(Exec)
|
||||
void AgrarianTravel(float X, float Y, float Z);
|
||||
|
||||
@@ -97,6 +100,9 @@ protected:
|
||||
UFUNCTION(Server, Reliable)
|
||||
void ServerAgrarianSplitStack(int32 StackIndex, int32 SplitQuantity);
|
||||
|
||||
UFUNCTION(Server, Reliable)
|
||||
void ServerAgrarianUseItem(FName ItemId, int32 Quantity);
|
||||
|
||||
UFUNCTION(Server, Reliable)
|
||||
void ServerAgrarianTravel(FVector Destination);
|
||||
};
|
||||
|
||||
@@ -179,6 +179,16 @@ void UAgrarianSurvivalComponent::AddInjury(float Severity)
|
||||
}
|
||||
}
|
||||
|
||||
void UAgrarianSurvivalComponent::ReduceInjury(float Amount)
|
||||
{
|
||||
if (GetOwner() && GetOwner()->HasAuthority())
|
||||
{
|
||||
Survival.InjurySeverity -= FMath::Max(0.0f, Amount);
|
||||
ClampSurvival();
|
||||
BroadcastSurvivalChanged();
|
||||
}
|
||||
}
|
||||
|
||||
void UAgrarianSurvivalComponent::AddSickness(float Severity)
|
||||
{
|
||||
if (GetOwner() && GetOwner()->HasAuthority())
|
||||
|
||||
@@ -93,6 +93,9 @@ public:
|
||||
UFUNCTION(BlueprintCallable, Category = "Agrarian|Survival")
|
||||
void AddInjury(float Severity);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "Agrarian|Survival")
|
||||
void ReduceInjury(float Amount);
|
||||
|
||||
UFUNCTION(BlueprintCallable, Category = "Agrarian|Survival")
|
||||
void AddSickness(float Severity);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user