63 lines
2.6 KiB
C#
63 lines
2.6 KiB
C#
namespace Barotrauma.Abilities
|
|
{
|
|
class CharacterAbilityGiveAffliction : CharacterAbility
|
|
{
|
|
private readonly Identifier afflictionId;
|
|
private readonly float strength;
|
|
private readonly string multiplyStrengthBySkill;
|
|
private readonly bool setValue;
|
|
|
|
public CharacterAbilityGiveAffliction(CharacterAbilityGroup characterAbilityGroup, ContentXElement abilityElement) : base(characterAbilityGroup, abilityElement)
|
|
{
|
|
afflictionId = abilityElement.GetAttributeIdentifier("afflictionid", abilityElement.GetAttributeIdentifier("affliction", Identifier.Empty));
|
|
strength = abilityElement.GetAttributeFloat("strength", 0f);
|
|
multiplyStrengthBySkill = abilityElement.GetAttributeString("multiplystrengthbyskill", string.Empty);
|
|
setValue = abilityElement.GetAttributeBool("setvalue", false);
|
|
|
|
if (afflictionId.IsEmpty)
|
|
{
|
|
DebugConsole.ThrowError($"Error in talent {CharacterTalent.DebugIdentifier}, CharacterAbilityGiveAffliction - affliction identifier not set.",
|
|
contentPackage: abilityElement.ContentPackage);
|
|
}
|
|
}
|
|
|
|
protected override void VerifyState(bool conditionsMatched, float timeSinceLastUpdate)
|
|
{
|
|
if (conditionsMatched)
|
|
{
|
|
ApplyEffect();
|
|
}
|
|
}
|
|
|
|
protected override void ApplyEffect()
|
|
{
|
|
ApplyAfflictionToCharacter(Character);
|
|
}
|
|
|
|
protected override void ApplyEffect(AbilityObject abilityObject)
|
|
{
|
|
if (abilityObject is IAbilityCharacter character)
|
|
{
|
|
ApplyAfflictionToCharacter(character.Character);
|
|
}
|
|
}
|
|
|
|
private void ApplyAfflictionToCharacter(Character character)
|
|
{
|
|
var afflictionPrefab = AfflictionPrefab.Prefabs.Find(a => a.Identifier == afflictionId);
|
|
if (afflictionPrefab == null)
|
|
{
|
|
DebugConsole.ThrowError($"Error in CharacterAbilityGiveAffliction - could not find an affliction with the identifier \"{afflictionId}\".",
|
|
contentPackage: CharacterTalent.Prefab.ContentPackage);
|
|
return;
|
|
}
|
|
float strength = this.strength;
|
|
if (!string.IsNullOrEmpty(multiplyStrengthBySkill))
|
|
{
|
|
strength *= Character.GetSkillLevel(multiplyStrengthBySkill);
|
|
}
|
|
character.CharacterHealth.ApplyAffliction(null, afflictionPrefab.Instantiate(strength), allowStacking: !setValue);
|
|
}
|
|
}
|
|
}
|