Replace IBodyPartAdded and IBodyPartRemoved with ref events (#12572)
This commit is contained in:
@@ -1,42 +1,9 @@
|
|||||||
using Content.Shared.Body.Part;
|
|
||||||
using Content.Shared.Hands.Components;
|
using Content.Shared.Hands.Components;
|
||||||
using Content.Shared.Hands.EntitySystems;
|
|
||||||
|
|
||||||
namespace Content.Server.Hands.Components
|
namespace Content.Server.Hands.Components;
|
||||||
|
|
||||||
|
[RegisterComponent]
|
||||||
|
[ComponentReference(typeof(SharedHandsComponent))]
|
||||||
|
public sealed class HandsComponent : SharedHandsComponent
|
||||||
{
|
{
|
||||||
[RegisterComponent]
|
|
||||||
[ComponentReference(typeof(SharedHandsComponent))]
|
|
||||||
#pragma warning disable 618
|
|
||||||
public sealed class HandsComponent : SharedHandsComponent, IBodyPartAdded, IBodyPartRemoved
|
|
||||||
#pragma warning restore 618
|
|
||||||
{
|
|
||||||
[Dependency] private readonly IEntitySystemManager _entitySystemManager = default!;
|
|
||||||
|
|
||||||
void IBodyPartAdded.BodyPartAdded(BodyPartAddedEventArgs args)
|
|
||||||
{
|
|
||||||
if (args.Part.PartType != BodyPartType.Hand)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// If this annoys you, which it should.
|
|
||||||
// Ping Smugleaf.
|
|
||||||
var location = args.Part.Symmetry switch
|
|
||||||
{
|
|
||||||
BodyPartSymmetry.None => HandLocation.Middle,
|
|
||||||
BodyPartSymmetry.Left => HandLocation.Left,
|
|
||||||
BodyPartSymmetry.Right => HandLocation.Right,
|
|
||||||
_ => throw new ArgumentOutOfRangeException()
|
|
||||||
};
|
|
||||||
|
|
||||||
_entitySystemManager.GetEntitySystem<SharedHandsSystem>().AddHand(Owner, args.Slot, location);
|
|
||||||
}
|
|
||||||
|
|
||||||
void IBodyPartRemoved.BodyPartRemoved(BodyPartRemovedEventArgs args)
|
|
||||||
{
|
|
||||||
if (args.Part.PartType != BodyPartType.Hand)
|
|
||||||
return;
|
|
||||||
|
|
||||||
_entitySystemManager.GetEntitySystem<SharedHandsSystem>().RemoveHand(Owner, args.Slot);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,29 +1,22 @@
|
|||||||
|
|
||||||
using System.Linq;
|
|
||||||
using Content.Server.CombatMode;
|
|
||||||
using Content.Server.Hands.Components;
|
using Content.Server.Hands.Components;
|
||||||
using Content.Server.Popups;
|
using Content.Server.Popups;
|
||||||
using Content.Server.Pulling;
|
using Content.Server.Pulling;
|
||||||
using Content.Server.Stack;
|
using Content.Server.Stack;
|
||||||
using Content.Server.Storage.Components;
|
using Content.Server.Storage.Components;
|
||||||
using Content.Server.Storage.EntitySystems;
|
using Content.Server.Storage.EntitySystems;
|
||||||
using Content.Server.Strip;
|
|
||||||
using Content.Server.Stunnable;
|
using Content.Server.Stunnable;
|
||||||
using Content.Shared.ActionBlocker;
|
using Content.Shared.ActionBlocker;
|
||||||
|
using Content.Shared.Body.Part;
|
||||||
using Content.Shared.CombatMode;
|
using Content.Shared.CombatMode;
|
||||||
using Content.Shared.Hands;
|
using Content.Shared.Hands;
|
||||||
using Content.Shared.Hands.Components;
|
using Content.Shared.Hands.Components;
|
||||||
using Content.Shared.Hands.EntitySystems;
|
using Content.Shared.Hands.EntitySystems;
|
||||||
using Content.Shared.IdentityManagement;
|
|
||||||
using Content.Shared.Input;
|
using Content.Shared.Input;
|
||||||
using Content.Shared.Inventory;
|
using Content.Shared.Inventory;
|
||||||
using Content.Shared.Physics.Pull;
|
using Content.Shared.Physics.Pull;
|
||||||
using Content.Shared.Popups;
|
|
||||||
using Content.Shared.Pulling.Components;
|
using Content.Shared.Pulling.Components;
|
||||||
using Content.Shared.Stunnable;
|
|
||||||
using Content.Shared.Throwing;
|
using Content.Shared.Throwing;
|
||||||
using JetBrains.Annotations;
|
using JetBrains.Annotations;
|
||||||
using Robust.Server.GameObjects;
|
|
||||||
using Robust.Server.Player;
|
using Robust.Server.Player;
|
||||||
using Robust.Shared.Containers;
|
using Robust.Shared.Containers;
|
||||||
using Robust.Shared.GameStates;
|
using Robust.Shared.GameStates;
|
||||||
@@ -42,7 +35,6 @@ namespace Content.Server.Hands.Systems
|
|||||||
[Dependency] private readonly StackSystem _stackSystem = default!;
|
[Dependency] private readonly StackSystem _stackSystem = default!;
|
||||||
[Dependency] private readonly HandVirtualItemSystem _virtualItemSystem = default!;
|
[Dependency] private readonly HandVirtualItemSystem _virtualItemSystem = default!;
|
||||||
[Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!;
|
[Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!;
|
||||||
[Dependency] private readonly StrippableSystem _strippableSystem = default!;
|
|
||||||
[Dependency] private readonly SharedHandVirtualItemSystem _virtualSystem = default!;
|
[Dependency] private readonly SharedHandVirtualItemSystem _virtualSystem = default!;
|
||||||
[Dependency] private readonly PopupSystem _popupSystem = default!;
|
[Dependency] private readonly PopupSystem _popupSystem = default!;
|
||||||
[Dependency] private readonly SharedHandsSystem _handsSystem = default!;
|
[Dependency] private readonly SharedHandsSystem _handsSystem = default!;
|
||||||
@@ -61,6 +53,9 @@ namespace Content.Server.Hands.Systems
|
|||||||
|
|
||||||
SubscribeLocalEvent<HandsComponent, EntRemovedFromContainerMessage>(HandleEntityRemoved);
|
SubscribeLocalEvent<HandsComponent, EntRemovedFromContainerMessage>(HandleEntityRemoved);
|
||||||
|
|
||||||
|
SubscribeLocalEvent<HandsComponent, BodyPartAddedEvent>(HandleBodyPartAdded);
|
||||||
|
SubscribeLocalEvent<HandsComponent, BodyPartRemovedEvent>(HandleBodyPartRemoved);
|
||||||
|
|
||||||
SubscribeLocalEvent<HandsComponent, ComponentGetState>(GetComponentState);
|
SubscribeLocalEvent<HandsComponent, ComponentGetState>(GetComponentState);
|
||||||
|
|
||||||
CommandBinds.Builder
|
CommandBinds.Builder
|
||||||
@@ -97,7 +92,6 @@ namespace Content.Server.Hands.Systems
|
|||||||
args.Handled = true; // no shove/stun.
|
args.Handled = true; // no shove/stun.
|
||||||
}
|
}
|
||||||
|
|
||||||
#region EntityInsertRemove
|
|
||||||
public override void PickupAnimation(EntityUid item, EntityCoordinates initialPosition, Vector2 finalPosition,
|
public override void PickupAnimation(EntityUid item, EntityCoordinates initialPosition, Vector2 finalPosition,
|
||||||
EntityUid? exclude)
|
EntityUid? exclude)
|
||||||
{
|
{
|
||||||
@@ -117,7 +111,32 @@ namespace Content.Server.Hands.Systems
|
|||||||
if (!Deleted(args.Entity) && TryComp(args.Entity, out HandVirtualItemComponent? @virtual))
|
if (!Deleted(args.Entity) && TryComp(args.Entity, out HandVirtualItemComponent? @virtual))
|
||||||
_virtualSystem.Delete(@virtual, uid);
|
_virtualSystem.Delete(@virtual, uid);
|
||||||
}
|
}
|
||||||
#endregion
|
|
||||||
|
private void HandleBodyPartAdded(EntityUid uid, HandsComponent component, ref BodyPartAddedEvent args)
|
||||||
|
{
|
||||||
|
if (args.Part.PartType != BodyPartType.Hand)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// If this annoys you, which it should.
|
||||||
|
// Ping Smugleaf.
|
||||||
|
var location = args.Part.Symmetry switch
|
||||||
|
{
|
||||||
|
BodyPartSymmetry.None => HandLocation.Middle,
|
||||||
|
BodyPartSymmetry.Left => HandLocation.Left,
|
||||||
|
BodyPartSymmetry.Right => HandLocation.Right,
|
||||||
|
_ => throw new ArgumentOutOfRangeException(nameof(args.Part.Symmetry))
|
||||||
|
};
|
||||||
|
|
||||||
|
AddHand(uid, args.Slot, location);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HandleBodyPartRemoved(EntityUid uid, HandsComponent component, ref BodyPartRemovedEvent args)
|
||||||
|
{
|
||||||
|
if (args.Part.PartType != BodyPartType.Hand)
|
||||||
|
return;
|
||||||
|
|
||||||
|
RemoveHand(uid, args.Slot);
|
||||||
|
}
|
||||||
|
|
||||||
#region pulling
|
#region pulling
|
||||||
private void HandlePullStarted(EntityUid uid, HandsComponent component, PullStartedMessage args)
|
private void HandlePullStarted(EntityUid uid, HandsComponent component, PullStartedMessage args)
|
||||||
|
|||||||
7
Content.Shared/Body/Part/BodyPartEvents.cs
Normal file
7
Content.Shared/Body/Part/BodyPartEvents.cs
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
namespace Content.Shared.Body.Part;
|
||||||
|
|
||||||
|
[ByRefEvent]
|
||||||
|
public readonly record struct BodyPartAddedEvent(string Slot, BodyPartComponent Part);
|
||||||
|
|
||||||
|
[ByRefEvent]
|
||||||
|
public readonly record struct BodyPartRemovedEvent(string Slot, BodyPartComponent Part);
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
using Content.Shared.Body.Components;
|
|
||||||
|
|
||||||
namespace Content.Shared.Body.Part
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// This interface gives components behavior when a body part
|
|
||||||
/// is added to their owning entity.
|
|
||||||
/// </summary>
|
|
||||||
public interface IBodyPartAdded : IComponent
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Called when a <see cref="BodyComponent"/> is added to the
|
|
||||||
/// entity owning this component.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="args">Information about the part that was added.</param>
|
|
||||||
void BodyPartAdded(BodyPartAddedEventArgs args);
|
|
||||||
}
|
|
||||||
|
|
||||||
public sealed class BodyPartAddedEventArgs : EventArgs
|
|
||||||
{
|
|
||||||
public BodyPartAddedEventArgs(string slot, BodyPartComponent part)
|
|
||||||
{
|
|
||||||
Slot = slot;
|
|
||||||
Part = part;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The slot that <see cref="Part"/> was added to.
|
|
||||||
/// </summary>
|
|
||||||
public string Slot { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The part that was added.
|
|
||||||
/// </summary>
|
|
||||||
public BodyPartComponent Part { get; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
using Content.Shared.Body.Components;
|
|
||||||
|
|
||||||
namespace Content.Shared.Body.Part
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// This interface gives components behavior when a body part
|
|
||||||
/// is removed from their owning entity.
|
|
||||||
/// </summary>
|
|
||||||
public interface IBodyPartRemoved
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Called when a <see cref="BodyComponent"/> is removed from the
|
|
||||||
/// entity owning this component.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="args">Information about the part that was removed.</param>
|
|
||||||
void BodyPartRemoved(BodyPartRemovedEventArgs args);
|
|
||||||
}
|
|
||||||
|
|
||||||
public sealed class BodyPartRemovedEventArgs : EventArgs
|
|
||||||
{
|
|
||||||
public BodyPartRemovedEventArgs(string slot, BodyPartComponent part)
|
|
||||||
{
|
|
||||||
Slot = slot;
|
|
||||||
Part = part;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The slot that <see cref="Part"/> was removed from.
|
|
||||||
/// </summary>
|
|
||||||
public string Slot { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The part that was removed.
|
|
||||||
/// </summary>
|
|
||||||
public BodyPartComponent Part { get; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -211,14 +211,11 @@ public partial class SharedBodySystem
|
|||||||
|
|
||||||
if (part.Body is { } newBody)
|
if (part.Body is { } newBody)
|
||||||
{
|
{
|
||||||
var argsAdded = new BodyPartAddedEventArgs(slot.Id, part);
|
var partAddedEvent = new BodyPartAddedEvent(slot.Id, part);
|
||||||
|
RaiseLocalEvent(newBody, ref partAddedEvent);
|
||||||
|
|
||||||
// TODO: Body refactor. Somebody is doing it
|
// TODO: Body refactor. Somebody is doing it
|
||||||
// EntitySystem.Get<SharedHumanoidAppearanceSystem>().BodyPartAdded(Owner, argsAdded);
|
// EntitySystem.Get<SharedHumanoidAppearanceSystem>().BodyPartAdded(Owner, argsAdded);
|
||||||
foreach (var component in AllComps<IBodyPartAdded>(newBody).ToArray())
|
|
||||||
{
|
|
||||||
component.BodyPartAdded(argsAdded);
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var organ in GetPartOrgans(partId, part))
|
foreach (var organ in GetPartOrgans(partId, part))
|
||||||
{
|
{
|
||||||
@@ -238,7 +235,7 @@ public partial class SharedBodySystem
|
|||||||
part.ParentSlot is not { } slot)
|
part.ParentSlot is not { } slot)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
var oldBody = part.Body;
|
var oldBodyNullable = part.Body;
|
||||||
|
|
||||||
slot.Child = null;
|
slot.Child = null;
|
||||||
part.ParentSlot = null;
|
part.ParentSlot = null;
|
||||||
@@ -252,18 +249,15 @@ public partial class SharedBodySystem
|
|||||||
|
|
||||||
part.Owner.RandomOffset(0.25f);
|
part.Owner.RandomOffset(0.25f);
|
||||||
|
|
||||||
if (oldBody != null)
|
if (oldBodyNullable is { } oldBody)
|
||||||
{
|
{
|
||||||
var args = new BodyPartRemovedEventArgs(slot.Id, part);
|
var args = new BodyPartRemovedEvent(slot.Id, part);
|
||||||
foreach (var component in AllComps<IBodyPartRemoved>(oldBody.Value))
|
RaiseLocalEvent(oldBody, ref args);
|
||||||
{
|
|
||||||
component.BodyPartRemoved(args);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (part.PartType == BodyPartType.Leg &&
|
if (part.PartType == BodyPartType.Leg &&
|
||||||
!GetBodyChildrenOfType(oldBody, BodyPartType.Leg).Any())
|
!GetBodyChildrenOfType(oldBody, BodyPartType.Leg).Any())
|
||||||
{
|
{
|
||||||
Standing.Down(oldBody.Value);
|
Standing.Down(oldBody);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (part.IsVital && !GetBodyChildrenOfType(oldBody, part.PartType).Any())
|
if (part.IsVital && !GetBodyChildrenOfType(oldBody, part.PartType).Any())
|
||||||
@@ -278,7 +272,7 @@ public partial class SharedBodySystem
|
|||||||
if (organSlot.Child is not { } child)
|
if (organSlot.Child is not { } child)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
RaiseLocalEvent(child, new RemovedFromBodyEvent(oldBody.Value), true);
|
RaiseLocalEvent(child, new RemovedFromBodyEvent(oldBody), true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user