Magic update (#473)

* magic system update

* fix
This commit is contained in:
Ed
2024-09-29 16:44:17 +03:00
committed by GitHub
parent 4cd9e41469
commit 3f94c73bdb
12 changed files with 59 additions and 115 deletions

View File

@@ -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};

View File

@@ -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]

View File

@@ -12,4 +12,6 @@ public interface ICP14DelayedMagicEffect // The speak n spell interface
public bool BreakOnDamage { get; }
public bool Hidden{ get; }
public float EntityDistance { get; }
}

View File

@@ -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>();

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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