From e6a6cd9e581d4fd29e3c59b8a8a3ab9a3e1deb6f Mon Sep 17 00:00:00 2001 From: nathan Date: Mon, 11 May 2026 01:12:07 -0700 Subject: [PATCH] Add Agrarian dev console commands --- AGRARIAN_FOUNDATION_STATUS.md | 3 +- .../AgrarianGamePlayerController.cpp | 122 ++++++++++++++++++ .../AgrarianGamePlayerController.h | 29 +++++ 3 files changed, 153 insertions(+), 1 deletion(-) diff --git a/AGRARIAN_FOUNDATION_STATUS.md b/AGRARIAN_FOUNDATION_STATUS.md index ef39838..f5ff4af 100644 --- a/AGRARIAN_FOUNDATION_STATUS.md +++ b/AGRARIAN_FOUNDATION_STATUS.md @@ -27,6 +27,7 @@ - [x] Persistent actor component added. - [x] Persistence subsystem can capture and restore saveable world actors. - [x] Primitive shelter actor is marked as a persistent world actor. +- [x] Admin/dev console commands added to the Agrarian player controller. ## Next Unreal Editor Tasks @@ -49,5 +50,5 @@ - [x] Add simple crafting recipe defaults or data asset pipeline. - [x] Add item definition data asset class. - [x] Add save/load capture for placed actors. -- [ ] Add admin/dev console commands. +- [x] Add admin/dev console commands. - [ ] Add wildlife base actor. diff --git a/Source/AgrarianGame/AgrarianGamePlayerController.cpp b/Source/AgrarianGame/AgrarianGamePlayerController.cpp index 5364e77..b71610a 100644 --- a/Source/AgrarianGame/AgrarianGamePlayerController.cpp +++ b/Source/AgrarianGame/AgrarianGamePlayerController.cpp @@ -2,6 +2,11 @@ #include "AgrarianGamePlayerController.h" +#include "AgrarianGameCharacter.h" +#include "AgrarianInventoryComponent.h" +#include "AgrarianPersistenceSubsystem.h" +#include "AgrarianShelterActor.h" +#include "AgrarianSurvivalComponent.h" #include "EnhancedInputSubsystems.h" #include "Engine/LocalPlayer.h" #include "InputMappingContext.h" @@ -65,3 +70,120 @@ bool AAgrarianGamePlayerController::ShouldUseTouchControls() const // are we on a mobile platform? Should we force touch? return SVirtualJoystick::ShouldDisplayTouchInterface() || bForceTouchControls; } + +void AAgrarianGamePlayerController::AgrarianGrantItem(FName ItemId, int32 Quantity) +{ + if (ItemId == NAME_None || Quantity <= 0) + { + ClientMessage(TEXT("Usage: AgrarianGrantItem ")); + return; + } + + ServerAgrarianGrantItem(ItemId, Quantity); +} + +void AAgrarianGamePlayerController::AgrarianSaveWorld() +{ + ServerAgrarianSaveWorld(); +} + +void AAgrarianGamePlayerController::AgrarianLoadWorld() +{ + ServerAgrarianLoadWorld(); +} + +void AAgrarianGamePlayerController::AgrarianSurvival() +{ + const AAgrarianGameCharacter* AgrarianCharacter = GetPawn(); + const UAgrarianSurvivalComponent* SurvivalComponent = AgrarianCharacter ? AgrarianCharacter->GetSurvivalComponent() : nullptr; + if (!SurvivalComponent) + { + ClientMessage(TEXT("No Agrarian survival component found.")); + return; + } + + const FAgrarianSurvivalSnapshot& Survival = SurvivalComponent->Survival; + ClientMessage(FString::Printf( + TEXT("Health %.1f | Stamina %.1f | Hunger %.1f | Thirst %.1f | Temp %.1fC | Injury %.1f"), + Survival.Health, + Survival.Stamina, + Survival.Hunger, + Survival.Thirst, + Survival.BodyTemperature, + Survival.InjurySeverity)); +} + +void AAgrarianGamePlayerController::AgrarianHeal() +{ + ServerAgrarianHeal(); +} + +void AAgrarianGamePlayerController::ServerAgrarianGrantItem_Implementation(FName ItemId, int32 Quantity) +{ + AAgrarianGameCharacter* AgrarianCharacter = GetPawn(); + UAgrarianInventoryComponent* InventoryComponent = AgrarianCharacter ? AgrarianCharacter->GetInventoryComponent() : nullptr; + if (!InventoryComponent) + { + ClientMessage(TEXT("No Agrarian inventory component found.")); + return; + } + + FAgrarianItemStack Stack; + Stack.ItemId = ItemId; + Stack.DisplayName = FText::FromName(ItemId); + Stack.Quantity = Quantity; + + if (InventoryComponent->AddItem(Stack)) + { + ClientMessage(FString::Printf(TEXT("Granted %d x %s."), Quantity, *ItemId.ToString())); + } + else + { + ClientMessage(FString::Printf(TEXT("Failed to grant %d x %s."), Quantity, *ItemId.ToString())); + } +} + +void AAgrarianGamePlayerController::ServerAgrarianSaveWorld_Implementation() +{ + UAgrarianPersistenceSubsystem* Persistence = GetGameInstance() ? GetGameInstance()->GetSubsystem() : nullptr; + if (!Persistence) + { + ClientMessage(TEXT("No Agrarian persistence subsystem found.")); + return; + } + + const bool bSaved = Persistence->SaveCurrentWorld(); + ClientMessage(bSaved ? TEXT("Agrarian world saved.") : TEXT("Agrarian world save failed.")); +} + +void AAgrarianGamePlayerController::ServerAgrarianLoadWorld_Implementation() +{ + UAgrarianPersistenceSubsystem* Persistence = GetGameInstance() ? GetGameInstance()->GetSubsystem() : nullptr; + if (!Persistence) + { + ClientMessage(TEXT("No Agrarian persistence subsystem found.")); + return; + } + + Persistence->RegisterWorldActorClass(TEXT("primitive_shelter"), AAgrarianShelterActor::StaticClass()); + const UAgrarianSaveGame* SaveGame = Persistence->LoadOrCreateSave(); + const int32 RestoredCount = Persistence->RestoreWorldActors(SaveGame); + ClientMessage(FString::Printf(TEXT("Agrarian world loaded. Restored actors: %d."), RestoredCount)); +} + +void AAgrarianGamePlayerController::ServerAgrarianHeal_Implementation() +{ + AAgrarianGameCharacter* AgrarianCharacter = GetPawn(); + UAgrarianSurvivalComponent* SurvivalComponent = AgrarianCharacter ? AgrarianCharacter->GetSurvivalComponent() : nullptr; + if (!SurvivalComponent) + { + ClientMessage(TEXT("No Agrarian survival component found.")); + return; + } + + SurvivalComponent->RestoreHealth(100.0f); + SurvivalComponent->AddFood(100.0f); + SurvivalComponent->AddWater(100.0f); + SurvivalComponent->AddWarmth(37.0f - SurvivalComponent->Survival.BodyTemperature); + ClientMessage(TEXT("Agrarian survival restored.")); +} diff --git a/Source/AgrarianGame/AgrarianGamePlayerController.h b/Source/AgrarianGame/AgrarianGamePlayerController.h index 80c07bb..7cad121 100644 --- a/Source/AgrarianGame/AgrarianGamePlayerController.h +++ b/Source/AgrarianGame/AgrarianGamePlayerController.h @@ -8,6 +8,7 @@ class UInputMappingContext; class UUserWidget; +class AAgrarianShelterActor; /** * Basic PlayerController class for a third person game @@ -49,4 +50,32 @@ protected: /** Returns true if the player should use UMG touch controls */ bool ShouldUseTouchControls() const; +public: + UFUNCTION(Exec) + void AgrarianGrantItem(FName ItemId, int32 Quantity); + + UFUNCTION(Exec) + void AgrarianSaveWorld(); + + UFUNCTION(Exec) + void AgrarianLoadWorld(); + + UFUNCTION(Exec) + void AgrarianSurvival(); + + UFUNCTION(Exec) + void AgrarianHeal(); + +protected: + UFUNCTION(Server, Reliable) + void ServerAgrarianGrantItem(FName ItemId, int32 Quantity); + + UFUNCTION(Server, Reliable) + void ServerAgrarianSaveWorld(); + + UFUNCTION(Server, Reliable) + void ServerAgrarianLoadWorld(); + + UFUNCTION(Server, Reliable) + void ServerAgrarianHeal(); };