45 lines
2.0 KiB
C#
45 lines
2.0 KiB
C#
using System.Xml.Linq;
|
|
|
|
namespace Barotrauma.Abilities
|
|
{
|
|
class CharacterAbilityGiveAffliction : CharacterAbility
|
|
{
|
|
private readonly string afflictionId;
|
|
private readonly float strength;
|
|
private readonly string multiplyStrengthBySkill;
|
|
private readonly bool setValue;
|
|
|
|
public CharacterAbilityGiveAffliction(CharacterAbilityGroup characterAbilityGroup, XElement abilityElement) : base(characterAbilityGroup, abilityElement)
|
|
{
|
|
afflictionId = abilityElement.GetAttributeString("afflictionid", abilityElement.GetAttributeString("affliction", string.Empty));
|
|
strength = abilityElement.GetAttributeFloat("strength", 0f);
|
|
multiplyStrengthBySkill = abilityElement.GetAttributeString("multiplystrengthbyskill", string.Empty);
|
|
setValue = abilityElement.GetAttributeBool("setvalue", false);
|
|
|
|
if (string.IsNullOrEmpty(afflictionId))
|
|
{
|
|
DebugConsole.ThrowError("Error in CharacterAbilityGiveAffliction - affliction identifier not set.");
|
|
}
|
|
}
|
|
|
|
protected override void ApplyEffect(AbilityObject abilityObject)
|
|
{
|
|
if (abilityObject is IAbilityCharacter character)
|
|
{
|
|
var afflictionPrefab = AfflictionPrefab.Prefabs.Find(a => a.Identifier.Equals(afflictionId, System.StringComparison.OrdinalIgnoreCase));
|
|
if (afflictionPrefab == null)
|
|
{
|
|
DebugConsole.ThrowError($"Error in CharacterAbilityGiveAffliction - could not find an affliction with the identifier \"{afflictionId}\".");
|
|
return;
|
|
}
|
|
float strength = this.strength;
|
|
if (!string.IsNullOrEmpty(multiplyStrengthBySkill))
|
|
{
|
|
strength *= Character.GetSkillLevel(multiplyStrengthBySkill);
|
|
}
|
|
character.Character.CharacterHealth.ApplyAffliction(null, afflictionPrefab.Instantiate(strength), allowStacking: !setValue);
|
|
}
|
|
}
|
|
}
|
|
}
|