Wizard Staff of Animation (#34649)
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
using System.Linq;
|
||||
using System.Numerics;
|
||||
using Content.Shared.Actions;
|
||||
using Content.Shared.Body.Components;
|
||||
@@ -26,7 +27,10 @@ using Robust.Shared.Audio.Systems;
|
||||
using Robust.Shared.Map;
|
||||
using Robust.Shared.Map.Components;
|
||||
using Robust.Shared.Network;
|
||||
using Robust.Shared.Physics;
|
||||
using Robust.Shared.Physics.Components;
|
||||
using Robust.Shared.Physics.Systems;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Random;
|
||||
using Robust.Shared.Serialization.Manager;
|
||||
using Robust.Shared.Spawners;
|
||||
@@ -80,6 +84,7 @@ public abstract class SharedMagicSystem : EntitySystem
|
||||
SubscribeLocalEvent<RandomGlobalSpawnSpellEvent>(OnRandomGlobalSpawnSpell);
|
||||
SubscribeLocalEvent<MindSwapSpellEvent>(OnMindSwapSpell);
|
||||
SubscribeLocalEvent<VoidApplauseSpellEvent>(OnVoidApplause);
|
||||
SubscribeLocalEvent<AnimateSpellEvent>(OnAnimateSpell);
|
||||
}
|
||||
|
||||
private void OnBeforeCastSpell(Entity<MagicComponent> ent, ref BeforeCastSpellEvent args)
|
||||
@@ -298,22 +303,8 @@ public abstract class SharedMagicSystem : EntitySystem
|
||||
ev.Handled = true;
|
||||
Speak(ev);
|
||||
|
||||
foreach (var toRemove in ev.ToRemove)
|
||||
{
|
||||
if (_compFact.TryGetRegistration(toRemove, out var registration))
|
||||
RemComp(ev.Target, registration.Type);
|
||||
}
|
||||
|
||||
foreach (var (name, data) in ev.ToAdd)
|
||||
{
|
||||
if (HasComp(ev.Target, data.Component.GetType()))
|
||||
continue;
|
||||
|
||||
var component = (Component)_compFact.GetComponent(name);
|
||||
var temp = (object)component;
|
||||
_seriMan.CopyTo(data.Component, ref temp);
|
||||
EntityManager.AddComponent(ev.Target, (Component)temp!);
|
||||
}
|
||||
RemoveComponents(ev.Target, ev.ToRemove);
|
||||
AddComponents(ev.Target, ev.ToAdd);
|
||||
}
|
||||
// End Change Component Spells
|
||||
#endregion
|
||||
@@ -370,6 +361,29 @@ public abstract class SharedMagicSystem : EntitySystem
|
||||
comp.Uid = performer;
|
||||
}
|
||||
}
|
||||
|
||||
private void AddComponents(EntityUid target, ComponentRegistry comps)
|
||||
{
|
||||
foreach (var (name, data) in comps)
|
||||
{
|
||||
if (HasComp(target, data.Component.GetType()))
|
||||
continue;
|
||||
|
||||
var component = (Component)_compFact.GetComponent(name);
|
||||
var temp = (object)component;
|
||||
_seriMan.CopyTo(data.Component, ref temp);
|
||||
EntityManager.AddComponent(target, (Component)temp!);
|
||||
}
|
||||
}
|
||||
|
||||
private void RemoveComponents(EntityUid target, HashSet<string> comps)
|
||||
{
|
||||
foreach (var toRemove in comps)
|
||||
{
|
||||
if (_compFact.TryGetRegistration(toRemove, out var registration))
|
||||
RemComp(target, registration.Type);
|
||||
}
|
||||
}
|
||||
// End Spell Helpers
|
||||
#endregion
|
||||
#region Touch Spells
|
||||
@@ -514,6 +528,33 @@ public abstract class SharedMagicSystem : EntitySystem
|
||||
_stun.TryParalyze(ev.Performer, ev.PerformerStunDuration, true);
|
||||
}
|
||||
|
||||
#endregion
|
||||
#region Animation Spells
|
||||
|
||||
private void OnAnimateSpell(AnimateSpellEvent ev)
|
||||
{
|
||||
if (ev.Handled || !PassesSpellPrerequisites(ev.Action, ev.Performer) || !TryComp<FixturesComponent>(ev.Target, out var fixtures) ||
|
||||
!TryComp<PhysicsComponent>(ev.Target, out var physics))
|
||||
return;
|
||||
|
||||
ev.Handled = true;
|
||||
//Speak(ev);
|
||||
|
||||
RemoveComponents(ev.Target, ev.RemoveComponents);
|
||||
AddComponents(ev.Target, ev.AddComponents);
|
||||
|
||||
var xform = Transform(ev.Target);
|
||||
var fixture = fixtures.Fixtures.First();
|
||||
|
||||
_transform.Unanchor(ev.Target);
|
||||
_physics.SetCanCollide(ev.Target, true, true, false, fixtures, physics);
|
||||
_physics.SetCollisionMask(ev.Target, fixture.Key, fixture.Value, (int)CollisionGroup.FlyingMobMask, fixtures, physics);
|
||||
_physics.SetCollisionLayer(ev.Target, fixture.Key, fixture.Value, (int)CollisionGroup.FlyingMobLayer, fixtures, physics);
|
||||
_physics.SetBodyType(ev.Target, BodyType.KinematicController, fixtures, physics, xform);
|
||||
_physics.SetBodyStatus(ev.Target, physics, BodyStatus.InAir, true);
|
||||
_physics.SetFixedRotation(ev.Target, false, true, fixtures, physics);
|
||||
}
|
||||
|
||||
#endregion
|
||||
// End Spells
|
||||
#endregion
|
||||
|
||||
Reference in New Issue
Block a user