Replace IBodyPartAdded and IBodyPartRemoved with ref events (#12572)

This commit is contained in:
DrSmugleaf
2022-11-13 22:34:26 +01:00
committed by GitHub
parent d17cee61e0
commit 889ed089c0
6 changed files with 50 additions and 137 deletions

View File

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

View File

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

View 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);

View File

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

View File

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

View File

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