diff --git a/Content.Server/_White/Cult/Items/Components/BloodBoilProjectileComponent.cs b/Content.Server/_White/Cult/Items/Components/BloodBoilProjectileComponent.cs new file mode 100644 index 0000000000..8e5e5cd38e --- /dev/null +++ b/Content.Server/_White/Cult/Items/Components/BloodBoilProjectileComponent.cs @@ -0,0 +1,6 @@ +namespace Content.Server.White.Cult.Items.Components; + +[RegisterComponent] +public sealed partial class BloodBoilProjectileComponent : Component +{ +} diff --git a/Content.Server/_White/Cult/Items/Systems/BloodBoilProjectileSystem.cs b/Content.Server/_White/Cult/Items/Systems/BloodBoilProjectileSystem.cs new file mode 100644 index 0000000000..64475f02cf --- /dev/null +++ b/Content.Server/_White/Cult/Items/Systems/BloodBoilProjectileSystem.cs @@ -0,0 +1,26 @@ +using Content.Server.White.Cult.Items.Components; +using Content.Server.White.Cult.TimedProduction; +using Content.Shared.White.Cult; +using Content.Shared.White.Cult.Pylon; +using Robust.Shared.Physics.Events; + +namespace Content.Server.White.Cult.Items.Systems; + +public sealed class BloodBoilProjectileSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(PreventCollision); + } + + private void PreventCollision(EntityUid uid, BloodBoilProjectileComponent component, ref PreventCollideEvent args) + { + if (HasComp(args.OtherEntity) || HasComp(args.OtherEntity) || + HasComp(args.OtherEntity) || HasComp(args.OtherEntity)) + { + args.Cancelled = true; + } + } +} diff --git a/Content.Server/_White/Cult/Runes/Systems/CultSystem.Rune.cs b/Content.Server/_White/Cult/Runes/Systems/CultSystem.Rune.cs index db229f7d14..9e399e51aa 100644 --- a/Content.Server/_White/Cult/Runes/Systems/CultSystem.Rune.cs +++ b/Content.Server/_White/Cult/Runes/Systems/CultSystem.Rune.cs @@ -997,6 +997,8 @@ public sealed partial class CultSystem : EntitySystem float severity, CultRuneBloodBoilComponent component) { + cultists = cultists.Where(HasComp).ToHashSet(); // Prevent constructs from using the rune + if (cultists.Count < component.SummonMinCount) { _popupSystem.PopupEntity(Loc.GetString("cult-blood-boil-rune-need-minimum"), user, user); @@ -1006,17 +1008,6 @@ public sealed partial class CultSystem : EntitySystem var xformQuery = GetEntityQuery(); var xform = xformQuery.GetComponent(rune); - foreach (var cultist in cultists) - { - if (!TryComp(cultist, out var bloodstreamComponent)) - return false; - - _bloodstreamSystem.TryModifyBloodLevel(cultist, -40, bloodstreamComponent, createPuddle: false); - } - - var projectileCount = - (int) MathF.Round(MathHelper.Lerp(component.MinProjectiles, component.MaxProjectiles, severity)); - var inRange = _lookup.GetEntitiesInRange(rune, component.ProjectileRange * severity, LookupFlags.Dynamic); inRange.RemoveWhere(x => !_entityManager.HasComponent(x) || @@ -1032,6 +1023,20 @@ public sealed partial class CultSystem : EntitySystem _random.Shuffle(list); + var bloodCost = -120 / cultists.Count; + + foreach (var cultist in cultists) + { + if (!TryComp(cultist, out var bloodstreamComponent)) + return false; + + _bloodstreamSystem.TryModifyBloodLevel(cultist, bloodCost, bloodstreamComponent); + } + + var projectileCount = + (int) MathF.Round(MathHelper.Lerp(component.MinProjectiles, component.MaxProjectiles, severity)); + + while (projectileCount > 0) { var target = _random.Pick(list); @@ -1206,6 +1211,7 @@ public sealed partial class CultSystem : EntitySystem if (teleportRune) { var teleportRuneEntity = _entityManager.SpawnEntity(rune, transform.Value); + _xform.AttachToGridOrMap(teleportRuneEntity); _entityManager.TryGetComponent(teleportRuneEntity, out var sex); { @@ -1243,7 +1249,7 @@ public sealed partial class CultSystem : EntitySystem var damageSpecifier = new DamageSpecifier(_prototypeManager.Index("Slash"), 10); _damageableSystem.TryChangeDamage(uid, damageSpecifier, true, false); - _entityManager.SpawnEntity(rune, transform.Value); + _xform.AttachToGridOrMap(_entityManager.SpawnEntity(rune, transform.Value)); } private bool SpawnShard(EntityUid target) diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/magic.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/magic.yml index bd789402d2..c7e2c968d6 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/magic.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/magic.yml @@ -153,3 +153,24 @@ whitelist: components: - Body + +- type: entity + id: ProjectileCult + parent: BaseBulletHighVelocity + name: Blood + description: FUCK. + noSpawn: true + components: + - type: Sprite + sprite: White/Cult/suka.rsi + - type: Projectile + damage: + groups: + Burn: 10 + Brute: 10 + - type: PointLight + enabled: true + color: "#ff4300" + radius: 2.0 + energy: 7.0 + - type: BloodBoilProjectile