47 lines
2.1 KiB
C#
47 lines
2.1 KiB
C#
#nullable enable
|
|
|
|
namespace Barotrauma.Abilities
|
|
{
|
|
internal sealed class CharacterAbilityReplaceAffliction : CharacterAbility
|
|
{
|
|
private readonly Identifier afflictionId;
|
|
private readonly Identifier newAfflictionId;
|
|
private readonly float strengthMultiplier;
|
|
|
|
public CharacterAbilityReplaceAffliction(CharacterAbilityGroup characterAbilityGroup, ContentXElement abilityElement) : base(characterAbilityGroup, abilityElement)
|
|
{
|
|
afflictionId = abilityElement.GetAttributeIdentifier("afflictionid", abilityElement.GetAttributeIdentifier("affliction", Identifier.Empty));
|
|
newAfflictionId = abilityElement.GetAttributeIdentifier("newafflictionid", abilityElement.GetAttributeIdentifier("newaffliction", Identifier.Empty));
|
|
|
|
strengthMultiplier = abilityElement.GetAttributeFloat("strengthmultiplier", 1.0f);
|
|
|
|
if (afflictionId.IsEmpty)
|
|
{
|
|
DebugConsole.ThrowError($"Error in {nameof(CharacterAbilityReplaceAffliction)} - affliction identifier not set.");
|
|
}
|
|
}
|
|
|
|
protected override void ApplyEffect()
|
|
{
|
|
var affliction = Character.CharacterHealth.GetAffliction(afflictionId);
|
|
if (affliction != null)
|
|
{
|
|
float afflictionStrength = affliction.Strength;
|
|
Limb limb = Character.CharacterHealth.GetAfflictionLimb(affliction);
|
|
Character.CharacterHealth.ReduceAfflictionOnAllLimbs(affliction.Identifier, afflictionStrength);
|
|
if (!newAfflictionId.IsEmpty && AfflictionPrefab.Prefabs.TryGet(newAfflictionId, out var newAfflictionPrefab))
|
|
{
|
|
Character.CharacterHealth.ApplyAffliction(targetLimb: limb, newAfflictionPrefab.Instantiate(afflictionStrength * strengthMultiplier));
|
|
}
|
|
}
|
|
}
|
|
|
|
protected override void VerifyState(bool conditionsMatched, float timeSinceLastUpdate)
|
|
{
|
|
if (conditionsMatched)
|
|
{
|
|
ApplyEffect();
|
|
}
|
|
}
|
|
}
|
|
} |