Add MVP respawn command

This commit is contained in:
2026-05-18 13:27:25 -07:00
parent d318e97977
commit 11f051c830
4 changed files with 86 additions and 1 deletions
+5 -1
View File
@@ -660,7 +660,11 @@ Target deliverable: A small group can join a server, spawn into one biome, gathe
`LastDeathReason` state, health depletion latches death, ordinary healing `LastDeathReason` state, health depletion latches death, ordinary healing
cannot revive a dead character, `Revive` provides an explicit respawn/admin cannot revive a dead character, `Revive` provides an explicit respawn/admin
hook, and debug HUD/console survival output show alive/dead state. hook, and debug HUD/console survival output show alive/dead state.
- [ ] Add respawn rules for MVP. - [x] Add respawn rules for MVP. Added server-authoritative
`AgrarianRespawn`, available only after death, that returns the character to
the Ground Zero MVP spawn/home location, revives with partial health,
stabilizes hunger/thirst/body temperature, clears acute injury conditions,
and leaves family/inheritance respawn for later generational milestones.
- [ ] Add corpse/backpack placeholder if needed. - [ ] Add corpse/backpack placeholder if needed.
- [ ] Add replicated death feedback. - [ ] Add replicated death feedback.
+36
View File
@@ -0,0 +1,36 @@
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
def require(path: Path, snippet: str) -> None:
text = path.read_text(encoding="utf-8")
if snippet not in text:
raise SystemExit(f"{path.relative_to(ROOT)} missing {snippet!r}")
def main() -> None:
header = ROOT / "Source" / "AgrarianGame" / "AgrarianGamePlayerController.h"
source = ROOT / "Source" / "AgrarianGame" / "AgrarianGamePlayerController.cpp"
roadmap = ROOT / "AGRARIAN_DEVELOPMENT_ROADMAP.md"
require(header, "void AgrarianRespawn();")
require(header, "void ServerAgrarianRespawn();")
require(source, "void AAgrarianGamePlayerController::AgrarianRespawn()")
require(source, "void AAgrarianGamePlayerController::ServerAgrarianRespawn_Implementation()")
require(source, "if (!SurvivalComponent->IsDead())")
require(source, "AgrarianRespawn is only available after death")
require(source, "StopMovementImmediately();")
require(source, "SetActorLocation(GroundZeroDeveloperTravelHomeLocation")
require(source, "SurvivalComponent->Revive(60.0f);")
require(source, "SurvivalComponent->ReduceBleeding(100.0f);")
require(source, "SurvivalComponent->ReduceSprain(100.0f);")
require(source, "Agrarian MVP respawn complete")
require(roadmap, "[x] Add respawn rules for MVP.")
print("PASS: MVP respawn rules are present.")
if __name__ == "__main__":
main()
@@ -169,6 +169,11 @@ void AAgrarianGamePlayerController::AgrarianHeal()
ServerAgrarianHeal(); ServerAgrarianHeal();
} }
void AAgrarianGamePlayerController::AgrarianRespawn()
{
ServerAgrarianRespawn();
}
void AAgrarianGamePlayerController::AgrarianDropItem(FName ItemId, int32 Quantity) void AAgrarianGamePlayerController::AgrarianDropItem(FName ItemId, int32 Quantity)
{ {
if (ItemId == NAME_None || Quantity <= 0) if (ItemId == NAME_None || Quantity <= 0)
@@ -333,6 +338,40 @@ void AAgrarianGamePlayerController::ServerAgrarianHeal_Implementation()
ClientMessage(TEXT("Agrarian survival restored.")); ClientMessage(TEXT("Agrarian survival restored."));
} }
void AAgrarianGamePlayerController::ServerAgrarianRespawn_Implementation()
{
AAgrarianGameCharacter* AgrarianCharacter = GetPawn<AAgrarianGameCharacter>();
UAgrarianSurvivalComponent* SurvivalComponent = AgrarianCharacter ? AgrarianCharacter->GetSurvivalComponent() : nullptr;
if (!AgrarianCharacter || !SurvivalComponent)
{
ClientMessage(TEXT("No Agrarian character/survival component found."));
return;
}
if (!SurvivalComponent->IsDead())
{
ClientMessage(TEXT("AgrarianRespawn is only available after death. Use AgrarianHeal for admin recovery."));
return;
}
if (UCharacterMovementComponent* MovementComponent = AgrarianCharacter->GetCharacterMovement())
{
MovementComponent->StopMovementImmediately();
}
AgrarianCharacter->SetActorLocation(GroundZeroDeveloperTravelHomeLocation, false, nullptr, ETeleportType::TeleportPhysics);
SurvivalComponent->Revive(60.0f);
SurvivalComponent->AddFood(35.0f);
SurvivalComponent->AddWater(35.0f);
SurvivalComponent->ReduceExhaustion(100.0f);
SurvivalComponent->ReduceInjury(100.0f);
SurvivalComponent->ReduceBleeding(100.0f);
SurvivalComponent->ReduceSprain(100.0f);
SurvivalComponent->ReduceSickness(100.0f);
SurvivalComponent->AddWarmth(37.0f - SurvivalComponent->Survival.BodyTemperature);
ClientMessage(TEXT("Agrarian MVP respawn complete: returned to Ground Zero with acute conditions stabilized."));
}
void AAgrarianGamePlayerController::ServerAgrarianDropItem_Implementation(FName ItemId, int32 Quantity) void AAgrarianGamePlayerController::ServerAgrarianDropItem_Implementation(FName ItemId, int32 Quantity)
{ {
AAgrarianGameCharacter* AgrarianCharacter = GetPawn<AAgrarianGameCharacter>(); AAgrarianGameCharacter* AgrarianCharacter = GetPawn<AAgrarianGameCharacter>();
@@ -66,6 +66,9 @@ public:
UFUNCTION(Exec) UFUNCTION(Exec)
void AgrarianHeal(); void AgrarianHeal();
UFUNCTION(Exec)
void AgrarianRespawn();
UFUNCTION(Exec) UFUNCTION(Exec)
void AgrarianDropItem(FName ItemId, int32 Quantity); void AgrarianDropItem(FName ItemId, int32 Quantity);
@@ -100,6 +103,9 @@ protected:
UFUNCTION(Server, Reliable) UFUNCTION(Server, Reliable)
void ServerAgrarianHeal(); void ServerAgrarianHeal();
UFUNCTION(Server, Reliable)
void ServerAgrarianRespawn();
UFUNCTION(Server, Reliable) UFUNCTION(Server, Reliable)
void ServerAgrarianDropItem(FName ItemId, int32 Quantity); void ServerAgrarianDropItem(FName ItemId, int32 Quantity);