@@ -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;
|
||||
/// </summary>
|
||||
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<CP14MagicEffectComponent, CP14BeforeCastMagicEffectEvent>(OnBeforeCastMagicEffect);
|
||||
|
||||
SubscribeLocalEvent<CP14DelayedInstantActionEvent>(OnInstantAction);
|
||||
SubscribeLocalEvent<CP14DelayedEntityTargetActionEvent>(OnEntityTargetAction);
|
||||
SubscribeLocalEvent<CP14DelayedWorldTargetActionEvent>(OnWorldTargetAction);
|
||||
SubscribeLocalEvent<CP14DelayedEntityWorldTargetActionEvent>(OnEntityWorldTargetAction);
|
||||
|
||||
SubscribeLocalEvent<CP14MagicEffectComponent, CP14DelayedInstantActionDoAfterEvent>(OnDelayedInstantActionDoAfter);
|
||||
SubscribeLocalEvent<CP14MagicEffectComponent, CP14DelayedEntityTargetActionDoAfterEvent>(OnDelayedEntityTargetDoAfter);
|
||||
SubscribeLocalEvent<CP14MagicEffectComponent, CP14DelayedWorldTargetActionDoAfterEvent>(OnDelayedWorldTargetDoAfter);
|
||||
SubscribeLocalEvent<CP14MagicEffectComponent, CP14DelayedEntityWorldTargetActionDoAfterEvent>(OnDelayedEntityWorldTargetDoAfter);
|
||||
|
||||
SubscribeLocalEvent<CP14MagicEffectSomaticAspectComponent, CP14BeforeCastMagicEffectEvent>(OnSomaticAspectBeforeCast);
|
||||
|
||||
@@ -50,7 +41,6 @@ public partial class CP14SharedMagicSystem : EntitySystem
|
||||
SubscribeLocalEvent<CP14MagicEffectVerbalAspectComponent, CP14AfterCastMagicEffectEvent>(OnVerbalAspectAfterCast);
|
||||
|
||||
SubscribeLocalEvent<CP14MagicEffectComponent, CP14AfterCastMagicEffectEvent>(OnAfterCastMagicEffect);
|
||||
|
||||
}
|
||||
|
||||
private void OnBeforeCastMagicEffect(Entity<CP14MagicEffectComponent> 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<CP14MagicEffectComponent>(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<CP14MagicEffectComponent> ent, ref CP14DelayedWorldTargetActionDoAfterEvent args)
|
||||
private void OnDelayedEntityWorldTargetDoAfter(Entity<CP14MagicEffectComponent> 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<CP14MagicEffectComponent> 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};
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -12,4 +12,6 @@ public interface ICP14DelayedMagicEffect // The speak n spell interface
|
||||
public bool BreakOnDamage { get; }
|
||||
|
||||
public bool Hidden{ get; }
|
||||
|
||||
public float EntityDistance { get; }
|
||||
}
|
||||
|
||||
@@ -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<TransformComponent>(args.Target.Value, out var transformComponent))
|
||||
|
||||
if (args.Target is not null &&
|
||||
entManager.TryGetComponent<TransformComponent>(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<SharedTransformSystem>();
|
||||
var physics = entManager.System<SharedPhysicsSystem>();
|
||||
var gunSystem = entManager.System<SharedGunSystem>();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user