Add survival death state
This commit is contained in:
@@ -128,7 +128,12 @@ void UAgrarianSurvivalComponent::GetLifetimeReplicatedProps(TArray<FLifetimeProp
|
||||
|
||||
bool UAgrarianSurvivalComponent::IsAlive() const
|
||||
{
|
||||
return Survival.Health > 0.0f;
|
||||
return !Survival.bIsDead && Survival.Health > 0.0f;
|
||||
}
|
||||
|
||||
bool UAgrarianSurvivalComponent::IsDead() const
|
||||
{
|
||||
return Survival.bIsDead || Survival.Health <= 0.0f;
|
||||
}
|
||||
|
||||
void UAgrarianSurvivalComponent::ApplyDamage(float Amount)
|
||||
@@ -145,12 +150,42 @@ void UAgrarianSurvivalComponent::RestoreHealth(float Amount)
|
||||
{
|
||||
if (GetOwner() && GetOwner()->HasAuthority())
|
||||
{
|
||||
if (Survival.bIsDead)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Survival.Health += FMath::Max(0.0f, Amount);
|
||||
ClampSurvival();
|
||||
BroadcastSurvivalChanged();
|
||||
}
|
||||
}
|
||||
|
||||
void UAgrarianSurvivalComponent::MarkDead(FName Reason)
|
||||
{
|
||||
if (GetOwner() && GetOwner()->HasAuthority())
|
||||
{
|
||||
Survival.Health = 0.0f;
|
||||
Survival.Stamina = 0.0f;
|
||||
Survival.bIsDead = true;
|
||||
Survival.LastDeathReason = Reason.IsNone() ? FName(TEXT("unknown")) : Reason;
|
||||
BroadcastSurvivalChanged();
|
||||
}
|
||||
}
|
||||
|
||||
void UAgrarianSurvivalComponent::Revive(float HealthAmount)
|
||||
{
|
||||
if (GetOwner() && GetOwner()->HasAuthority())
|
||||
{
|
||||
Survival.bIsDead = false;
|
||||
Survival.LastDeathReason = NAME_None;
|
||||
Survival.Health = FMath::Clamp(HealthAmount, 1.0f, 100.0f);
|
||||
Survival.Stamina = FMath::Max(Survival.Stamina, 25.0f);
|
||||
ClampSurvival();
|
||||
BroadcastSurvivalChanged();
|
||||
}
|
||||
}
|
||||
|
||||
void UAgrarianSurvivalComponent::AddFood(float Amount)
|
||||
{
|
||||
if (GetOwner() && GetOwner()->HasAuthority())
|
||||
@@ -429,6 +464,7 @@ void UAgrarianSurvivalComponent::ClampSurvival()
|
||||
Survival.BleedingSeverity = FMath::Clamp(Survival.BleedingSeverity, 0.0f, 100.0f);
|
||||
Survival.SprainSeverity = FMath::Clamp(Survival.SprainSeverity, 0.0f, 100.0f);
|
||||
Survival.SicknessSeverity = FMath::Clamp(Survival.SicknessSeverity, 0.0f, 100.0f);
|
||||
UpdateDeathState();
|
||||
}
|
||||
|
||||
void UAgrarianSurvivalComponent::ClampCareHistory()
|
||||
@@ -447,3 +483,21 @@ void UAgrarianSurvivalComponent::BroadcastSurvivalChanged()
|
||||
{
|
||||
OnSurvivalChanged.Broadcast(Survival);
|
||||
}
|
||||
|
||||
void UAgrarianSurvivalComponent::UpdateDeathState()
|
||||
{
|
||||
if (Survival.Health <= 0.0f)
|
||||
{
|
||||
Survival.Health = 0.0f;
|
||||
Survival.Stamina = 0.0f;
|
||||
Survival.bIsDead = true;
|
||||
if (Survival.LastDeathReason.IsNone())
|
||||
{
|
||||
Survival.LastDeathReason = FName(TEXT("health_depleted"));
|
||||
}
|
||||
}
|
||||
else if (!Survival.bIsDead)
|
||||
{
|
||||
Survival.LastDeathReason = NAME_None;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user