Files
crystall-punk-14/Content.Shared/_CP14/MagicSpell/Spells/Vampire/CP14SpellPointerToVampireClan.cs
Red ad46932d11 Balance tweaks (#1741)
* disable lurker pulling

* fix pack

* fix pack

* fak pix

* vampire objective tweak

* buff vampire search

* Update air_saturation.yml

* fix

* fix

* Update EntityTest.cs

* Update EntityTest.cs

* tick

* Update EntityTest.cs

* remove forkfiltered filter

* Update EntityTest.cs
2025-09-07 14:22:30 +03:00

92 lines
3.0 KiB
C#

using Content.Shared._CP14.Vampire.Components;
using Robust.Shared.Map;
using Robust.Shared.Network;
using Robust.Shared.Prototypes;
namespace Content.Shared._CP14.MagicSpell.Spells;
/// <summary>
/// Indicates all vampires within range belonging to the same faction as the caster. If inverted, it indicates enemy vampires.
/// </summary>
public sealed partial class CP14SpellPointerToVampireClan : CP14SpellEffect
{
[DataField(required: true)]
public EntProtoId PointerEntity;
[DataField(required: true)]
public float SearchRange = 60f;
[DataField]
public bool Inversed = false;
public override void Effect(EntityManager entManager, CP14SpellEffectBaseArgs args)
{
var net = IoCManager.Resolve<INetManager>();
if (net.IsClient)
return;
if (args.User is null)
return;
if (!entManager.TryGetComponent<CP14VampireComponent>(args.User.Value, out var vampireComponent))
return;
var lookup = entManager.System<EntityLookupSystem>();
var transform = entManager.System<SharedTransformSystem>();
var originPosition = transform.GetWorldPosition(args.User.Value);
var originEntPosition = transform.GetMoverCoordinates(args.User.Value);
var entitiesInRange = lookup.GetEntitiesInRange<CP14VampireComponent>(originEntPosition, SearchRange);
foreach (var ent in entitiesInRange)
{
if (ent.Owner == args.User.Value)
continue;
if (!Inversed)
{
if (ent.Comp.Faction != vampireComponent.Faction)
continue;
}
else
{
if (ent.Comp.Faction == vampireComponent.Faction)
continue;
}
var targetPosition = transform.GetWorldPosition(ent);
//Calculate the rotation
Angle angle = new(targetPosition - originPosition);
var pointer = entManager.Spawn(PointerEntity, new MapCoordinates(originPosition, transform.GetMapId(originEntPosition)));
transform.SetWorldRotation(pointer, angle + Angle.FromDegrees(90));
}
var heartsInRange = lookup.GetEntitiesInRange<CP14VampireClanHeartComponent>(originEntPosition, SearchRange);
foreach (var heart in heartsInRange)
{
if (!Inversed)
{
if (heart.Comp.Faction != vampireComponent.Faction)
continue;
}
else
{
if (heart.Comp.Faction == vampireComponent.Faction)
continue;
}
var targetPosition = transform.GetWorldPosition(heart);
//Calculate the rotation
Angle angle = new(targetPosition - originPosition);
var pointer = entManager.Spawn(PointerEntity, new MapCoordinates(originPosition, transform.GetMapId(originEntPosition)));
transform.SetWorldRotation(pointer, angle + Angle.FromDegrees(90));
}
}
}