diff --git a/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.cs b/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.cs index 07f0d0c63f..b13a248079 100644 --- a/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.cs +++ b/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.cs @@ -7,10 +7,7 @@ using Content.Shared.DoAfter; using Content.Shared.Hands.Components; using Content.Shared.Popups; using Content.Shared.Speech.Muting; -using Content.Shared.Weapons.Ranged.Systems; -using Robust.Shared.Map; using Robust.Shared.Network; -using Robust.Shared.Physics.Systems; using Robust.Shared.Random; namespace Content.Shared._CP14.MagicSpell; @@ -20,12 +17,8 @@ namespace Content.Shared._CP14.MagicSpell; /// public partial class CP14SharedMagicSystem : EntitySystem { - [Dependency] private readonly SharedPhysicsSystem _physics = default!; [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; [Dependency] private readonly INetManager _net = default!; - [Dependency] private readonly SharedTransformSystem _transform = default!; - [Dependency] private readonly IMapManager _mapManager = default!; - [Dependency] private readonly SharedGunSystem _gunSystem = default!; [Dependency] private readonly SharedCP14MagicEnergySystem _magicEnergy = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly IRobustRandom _random = default!; @@ -37,12 +30,10 @@ public partial class CP14SharedMagicSystem : EntitySystem SubscribeLocalEvent(OnBeforeCastMagicEffect); SubscribeLocalEvent(OnInstantAction); - SubscribeLocalEvent(OnEntityTargetAction); - SubscribeLocalEvent(OnWorldTargetAction); + SubscribeLocalEvent(OnEntityWorldTargetAction); SubscribeLocalEvent(OnDelayedInstantActionDoAfter); - SubscribeLocalEvent(OnDelayedEntityTargetDoAfter); - SubscribeLocalEvent(OnDelayedWorldTargetDoAfter); + SubscribeLocalEvent(OnDelayedEntityWorldTargetDoAfter); SubscribeLocalEvent(OnSomaticAspectBeforeCast); @@ -50,7 +41,6 @@ public partial class CP14SharedMagicSystem : EntitySystem SubscribeLocalEvent(OnVerbalAspectAfterCast); SubscribeLocalEvent(OnAfterCastMagicEffect); - } private void OnBeforeCastMagicEffect(Entity ent, ref CP14BeforeCastMagicEffectEvent args) @@ -106,7 +96,7 @@ public partial class CP14SharedMagicSystem : EntitySystem } } - private void OnWorldTargetAction(CP14DelayedWorldTargetActionEvent args) + private void OnEntityWorldTargetAction(CP14DelayedEntityWorldTargetActionEvent args) { if (args.Handled) return; @@ -119,10 +109,9 @@ public partial class CP14SharedMagicSystem : EntitySystem if (!TryCastSpell(args.Action, args.Performer)) return; - var doAfter = new CP14DelayedWorldTargetActionDoAfterEvent() - { - Target = EntityManager.GetNetCoordinates(args.Target) - }; + var doAfter = new CP14DelayedEntityWorldTargetActionDoAfterEvent( + EntityManager.GetNetCoordinates(args.Coords), + EntityManager.GetNetEntity(args.Entity)); var doAfterEventArgs = new DoAfterArgs(EntityManager, args.Performer, delayedEffect.Delay, doAfter, args.Action) { @@ -140,46 +129,13 @@ public partial class CP14SharedMagicSystem : EntitySystem { foreach (var effect in magicEffect.TelegraphyEffects) { - effect.Effect(EntityManager, new CP14SpellEffectBaseArgs(args.Performer, null, args.Target)); + effect.Effect(EntityManager, new CP14SpellEffectBaseArgs(args.Performer, args.Entity, args.Coords)); } } } - private void OnEntityTargetAction(CP14DelayedEntityTargetActionEvent args) - { - if (args.Handled) - return; - - args.Handled = true; - - if (args is not ICP14DelayedMagicEffect delayedEffect) - return; - - if (!TryCastSpell(args.Action, args.Performer)) - return; - - var doAfterEventArgs = new DoAfterArgs(EntityManager, args.Performer, delayedEffect.Delay, new CP14DelayedEntityTargetActionDoAfterEvent(), args.Action, args.Target) - { - BreakOnMove = delayedEffect.BreakOnMove, - BreakOnDamage = delayedEffect.BreakOnDamage, - Hidden = delayedEffect.Hidden, - BlockDuplicate = true, - DistanceThreshold = 100f, - }; - - _doAfter.TryStartDoAfter(doAfterEventArgs); - - //Telegraphy effects - if (_net.IsServer && TryComp(args.Action, out var magicEffect)) - { - foreach (var effect in magicEffect.TelegraphyEffects) - { - effect.Effect(EntityManager, new CP14SpellEffectBaseArgs(args.Performer, args.Target, null)); - } - } - } - - private void OnDelayedWorldTargetDoAfter(Entity ent, ref CP14DelayedWorldTargetActionDoAfterEvent args) + private void OnDelayedEntityWorldTargetDoAfter(Entity ent, + ref CP14DelayedEntityWorldTargetActionDoAfterEvent args) { var endEv = new CP14EndCastMagicEffectEvent(); RaiseLocalEvent(ent, ref endEv); @@ -187,26 +143,15 @@ public partial class CP14SharedMagicSystem : EntitySystem if (args.Cancelled || !_net.IsServer) return; - foreach (var effect in ent.Comp.Effects) - { - effect.Effect(EntityManager, new CP14SpellEffectBaseArgs(args.User, null, GetCoordinates(args.Target))); - } + var targetPos = EntityManager.GetCoordinates(args.TargetPosition); + EntityUid? targetEnt; + EntityManager.TryGetEntity(args.TargetEntity, out targetEnt); - var ev = new CP14AfterCastMagicEffectEvent {Performer = args.User}; - RaiseLocalEvent(ent, ref ev); - } - - private void OnDelayedEntityTargetDoAfter(Entity ent, ref CP14DelayedEntityTargetActionDoAfterEvent args) - { - var endEv = new CP14EndCastMagicEffectEvent(); - RaiseLocalEvent(ent, ref endEv); - - if (args.Cancelled || !_net.IsServer) - return; + var effectArgs = new CP14SpellEffectBaseArgs(args.User, targetEnt, targetPos); foreach (var effect in ent.Comp.Effects) { - effect.Effect(EntityManager, new CP14SpellEffectBaseArgs(args.User, args.Target, null)); + effect.Effect(EntityManager, effectArgs); } var ev = new CP14AfterCastMagicEffectEvent {Performer = args.User}; diff --git a/Content.Shared/_CP14/MagicSpell/Events/CP14DelayedActionEvents.cs b/Content.Shared/_CP14/MagicSpell/Events/CP14DelayedActionEvents.cs index 4f16752afe..d96d7d7d1e 100644 --- a/Content.Shared/_CP14/MagicSpell/Events/CP14DelayedActionEvents.cs +++ b/Content.Shared/_CP14/MagicSpell/Events/CP14DelayedActionEvents.cs @@ -5,8 +5,8 @@ using Robust.Shared.Serialization; namespace Content.Shared._CP14.MagicSpell.Events; -//World target -public sealed partial class CP14DelayedWorldTargetActionEvent : WorldTargetActionEvent, ICP14DelayedMagicEffect +public sealed partial class CP14DelayedEntityWorldTargetActionEvent : EntityWorldTargetActionEvent, + ICP14DelayedMagicEffect { [DataField] public float Delay { get; private set; } = 1f; @@ -19,38 +19,28 @@ public sealed partial class CP14DelayedWorldTargetActionEvent : WorldTargetActio [DataField] public bool Hidden { get; private set; } = false; + + [DataField] + public float EntityDistance { get; private set; } = 100f; } [Serializable, NetSerializable] -public sealed partial class CP14DelayedWorldTargetActionDoAfterEvent : DoAfterEvent +public sealed partial class CP14DelayedEntityWorldTargetActionDoAfterEvent : DoAfterEvent { [DataField] - public NetCoordinates Target; + public NetCoordinates? TargetPosition; + [DataField] + public NetEntity? TargetEntity; + + public CP14DelayedEntityWorldTargetActionDoAfterEvent(NetCoordinates? targetPos, NetEntity? targetEntity) + { + TargetPosition = targetPos; + TargetEntity = targetEntity; + } + public override DoAfterEvent Clone() => this; } - -//Entity Target -public sealed partial class CP14DelayedEntityTargetActionEvent : EntityTargetActionEvent, ICP14DelayedMagicEffect -{ - [DataField] - public float Delay { get; private set; } = 1f; - - [DataField] - public bool BreakOnMove { get; private set; } = true; - - [DataField] - public bool BreakOnDamage { get; private set; } = true; - - [DataField] - public bool Hidden { get; private set; } = false; -} - -[Serializable, NetSerializable] -public sealed partial class CP14DelayedEntityTargetActionDoAfterEvent : SimpleDoAfterEvent -{ -} - //Instant public sealed partial class CP14DelayedInstantActionEvent : InstantActionEvent, ICP14DelayedMagicEffect { @@ -65,6 +55,9 @@ public sealed partial class CP14DelayedInstantActionEvent : InstantActionEvent, [DataField] public bool Hidden { get; private set; } = false; + + [DataField] + public float EntityDistance { get; private set; } = 100f; } [Serializable, NetSerializable] diff --git a/Content.Shared/_CP14/MagicSpell/Events/CP14IDelayedMagicEffect.cs b/Content.Shared/_CP14/MagicSpell/Events/CP14IDelayedMagicEffect.cs index 1cf716df7b..bd829c84b2 100644 --- a/Content.Shared/_CP14/MagicSpell/Events/CP14IDelayedMagicEffect.cs +++ b/Content.Shared/_CP14/MagicSpell/Events/CP14IDelayedMagicEffect.cs @@ -12,4 +12,6 @@ public interface ICP14DelayedMagicEffect // The speak n spell interface public bool BreakOnDamage { get; } public bool Hidden{ get; } + + public float EntityDistance { get; } } diff --git a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellProjectile.cs b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellProjectile.cs index 87f4f0531e..50deac91d5 100644 --- a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellProjectile.cs +++ b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellProjectile.cs @@ -13,15 +13,16 @@ public sealed partial class CP14SpellProjectile : CP14SpellEffect public override void Effect(EntityManager entManager, CP14SpellEffectBaseArgs args) { EntityCoordinates? targetPoint = null; - if (args.Position is not null) - targetPoint = args.Position.Value; - else if (args.Target is not null && entManager.TryGetComponent(args.Target.Value, out var transformComponent)) + + if (args.Target is not null && + entManager.TryGetComponent(args.Target.Value, out var transformComponent)) targetPoint = transformComponent.Coordinates; + else if (args.Position is not null) + targetPoint = args.Position; if (targetPoint is null) return; - var transform = entManager.System(); var physics = entManager.System(); var gunSystem = entManager.System(); diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/cure_wounds.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/cure_wounds.yml index f48ebeb081..34503016d9 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/cure_wounds.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/cure_wounds.yml @@ -29,7 +29,7 @@ - type: CP14MagicEffectSomaticAspect - type: CP14MagicEffectCastingVisual proto: CP14RuneCureWounds - - type: EntityTargetAction + - type: EntityWorldTargetAction whitelist: components: - MobState @@ -41,7 +41,7 @@ icon: sprite: _CP14/Effects/Magic/spells_icons.rsi state: cure_wounds - event: !type:CP14DelayedEntityTargetActionEvent + event: !type:CP14DelayedEntityWorldTargetActionEvent delay: 2 - type: entity diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/earth_wall.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/earth_wall.yml index b8675a8251..179ac17fca 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/earth_wall.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/earth_wall.yml @@ -18,7 +18,7 @@ endSpeech: "de profundis terrae" - type: CP14MagicEffectCastingVisual proto: CP14RuneEarthWall - - type: WorldTargetAction + - type: EntityWorldTargetAction useDelay: 10 range: 10 itemIconStyle: BigAction @@ -27,7 +27,7 @@ icon: sprite: _CP14/Effects/Magic/spells_icons.rsi state: earth_wall - event: !type:CP14DelayedWorldTargetActionEvent + event: !type:CP14DelayedEntityWorldTargetActionEvent delay: 1 - type: entity diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/fireball.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/fireball.yml index b2606a5e10..d8545cfb6d 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/fireball.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/fireball.yml @@ -17,7 +17,7 @@ - type: CP14MagicEffectSomaticAspect - type: CP14MagicEffectCastingVisual proto: CP14RuneFireball - - type: WorldTargetAction + - type: EntityWorldTargetAction useDelay: 20 checkCanAccess: false raiseOnUser: true @@ -28,9 +28,10 @@ icon: sprite: _CP14/Effects/Magic/spells_icons.rsi state: fireball - event: !type:CP14DelayedWorldTargetActionEvent + event: !type:CP14DelayedEntityWorldTargetActionEvent delay: 3 breakOnMove: false + entityDistance: 1000 - type: entity id: CP14RuneFireball diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/flash_light.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/flash_light.yml index a0d726c876..43a2193df4 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/flash_light.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/flash_light.yml @@ -18,7 +18,7 @@ endSpeech: "excaecant inimicos meos" - type: CP14MagicEffectCastingVisual proto: CP14RuneFlashLight - - type: WorldTargetAction + - type: EntityWorldTargetAction useDelay: 5 range: 10 itemIconStyle: BigAction @@ -27,7 +27,7 @@ icon: sprite: _CP14/Effects/Magic/spells_icons.rsi state: flash_light - event: !type:CP14DelayedWorldTargetActionEvent + event: !type:CP14DelayedEntityWorldTargetActionEvent delay: 0.5 - type: entity diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/ice_floor.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/ice_floor.yml index 2bc9e89dfe..c7d5741b29 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/ice_floor.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/ice_floor.yml @@ -18,7 +18,7 @@ endSpeech: "operietur glacie" - type: CP14MagicEffectCastingVisual proto: CP14RuneIceFloor - - type: WorldTargetAction + - type: EntityWorldTargetAction useDelay: 5 range: 5 itemIconStyle: BigAction @@ -27,7 +27,7 @@ icon: sprite: _CP14/Effects/Magic/spells_icons.rsi state: ice_floor - event: !type:CP14DelayedWorldTargetActionEvent + event: !type:CP14DelayedEntityWorldTargetActionEvent delay: 1 breakOnMove: false diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/ice_shards.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/ice_shards.yml index 95b2cab50b..b14c2386a0 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/ice_shards.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/ice_shards.yml @@ -13,7 +13,7 @@ - type: CP14MagicEffectSomaticAspect - type: CP14MagicEffectCastingVisual proto: CP14RuneIceShards - - type: WorldTargetAction + - type: EntityWorldTargetAction useDelay: 0.5 repeat: true checkCanAccess: false @@ -25,9 +25,10 @@ icon: sprite: _CP14/Effects/Magic/spells_icons.rsi state: ice_shards - event: !type:CP14DelayedWorldTargetActionEvent + event: !type:CP14DelayedEntityWorldTargetActionEvent delay: 0.5 breakOnMove: false + entityDistance: 1000 - type: entity id: CP14RuneIceShards diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/shadow_grab.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/shadow_grab.yml index 8eec7fa9e9..bc22a28b30 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/shadow_grab.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/shadow_grab.yml @@ -19,7 +19,7 @@ spawns: - CP14ImpactEffectShadowStep - type: CP14MagicEffectSomaticAspect - - type: EntityTargetAction + - type: EntityWorldTargetAction canTargetSelf: false checkCanAccess: false range: 10 @@ -30,9 +30,10 @@ icon: sprite: _CP14/Effects/Magic/spells_icons.rsi state: shadow_grab - event: !type:CP14DelayedEntityTargetActionEvent + event: !type:CP14DelayedEntityWorldTargetActionEvent delay: 2 hidden: true + entityDistance: 1000 - type: entity id: CP14ImpactEffectShadowGrab diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/shadow_step.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/shadow_step.yml index 36256346e5..740f82aa81 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/shadow_step.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/shadow_step.yml @@ -14,7 +14,7 @@ - type: CP14MagicEffectCastingVisual proto: CP14ImpactEffectShadowStep - type: CP14MagicEffectSomaticAspect - - type: WorldTargetAction + - type: EntityWorldTargetAction useDelay: 10 range: 7 checkCanAccess: false @@ -24,7 +24,7 @@ icon: sprite: _CP14/Effects/Magic/spells_icons.rsi state: shadow_step - event: !type:CP14DelayedWorldTargetActionEvent + event: !type:CP14DelayedEntityWorldTargetActionEvent delay: 1 hidden: true breakOnMove: false