Files
LuaCsForBarotraumaEP/Barotrauma/BarotraumaShared/SharedSource/Characters/Talents/Abilities/CharacterAbilityApplyStatusEffectsToRandomAlly.cs
T
2022-02-26 02:43:01 +09:00

55 lines
1.9 KiB
C#

using Barotrauma.Extensions;
using Microsoft.Xna.Framework;
using System;
using System.Linq;
namespace Barotrauma.Abilities
{
class CharacterAbilityApplyStatusEffectsToRandomAlly : CharacterAbilityApplyStatusEffects
{
private readonly float squaredMaxDistance;
private readonly bool allowDifferentSub;
private readonly bool allowSelf;
public override bool AllowClientSimulation => false;
public CharacterAbilityApplyStatusEffectsToRandomAlly(CharacterAbilityGroup characterAbilityGroup, ContentXElement abilityElement) : base(characterAbilityGroup, abilityElement)
{
squaredMaxDistance = MathF.Pow(abilityElement.GetAttributeFloat("maxdistance", float.MaxValue), 2);
allowDifferentSub = abilityElement.GetAttributeBool("mustbeonsamesub", true);
allowSelf = abilityElement.GetAttributeBool("allowself", true);
}
protected override void ApplyEffect()
{
ApplyEffect(Character);
}
protected override void ApplyEffect(AbilityObject abilityObject)
{
if ((abilityObject as IAbilityCharacter)?.Character is Character targetCharacter)
{
ApplyEffect(targetCharacter);
}
else
{
ApplyEffect(Character);
}
}
private void ApplyEffect(Character thisCharacter)
{
Character chosenCharacter =
Character.GetFriendlyCrew(thisCharacter).Where(c =>
(allowSelf || c != thisCharacter) &&
(allowDifferentSub || c.Submarine == Character.Submarine) &&
Vector2.DistanceSquared(thisCharacter.WorldPosition, c.WorldPosition) is float tempDistance &&
tempDistance < squaredMaxDistance).GetRandomUnsynced();
if (chosenCharacter == null) { return; }
ApplyEffectSpecific(chosenCharacter);
}
}
}