From 9bdd7307fdd3e422e95a4987208498f36ec4c6c6 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sat, 19 Apr 2025 18:05:20 +1000 Subject: [PATCH] Predicted multihanded component (#36712) * Predicted multihanded component * Refview * reh --- .../Items/Systems/MultiHandedItemSystem.cs | 15 ----- Content.Server/Item/MultiHandedItemSystem.cs | 24 -------- .../Item/MultiHandedItemComponent.cs | 2 +- Content.Shared/Item/MultiHandedItemSystem.cs | 56 +++++++++++++++++++ .../Item/SharedMultiHandedItemSystem.cs | 47 ---------------- 5 files changed, 57 insertions(+), 87 deletions(-) delete mode 100644 Content.Client/Items/Systems/MultiHandedItemSystem.cs delete mode 100644 Content.Server/Item/MultiHandedItemSystem.cs create mode 100644 Content.Shared/Item/MultiHandedItemSystem.cs delete mode 100644 Content.Shared/Item/SharedMultiHandedItemSystem.cs diff --git a/Content.Client/Items/Systems/MultiHandedItemSystem.cs b/Content.Client/Items/Systems/MultiHandedItemSystem.cs deleted file mode 100644 index 716a4ad1a4..0000000000 --- a/Content.Client/Items/Systems/MultiHandedItemSystem.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Content.Shared.Hands; -using Content.Shared.Item; - -namespace Content.Client.Items.Systems; - -public sealed class MultiHandedItemSystem : SharedMultiHandedItemSystem -{ - protected override void OnEquipped(EntityUid uid, MultiHandedItemComponent component, GotEquippedHandEvent args) - { - } - - protected override void OnUnequipped(EntityUid uid, MultiHandedItemComponent component, GotUnequippedHandEvent args) - { - } -} diff --git a/Content.Server/Item/MultiHandedItemSystem.cs b/Content.Server/Item/MultiHandedItemSystem.cs deleted file mode 100644 index 9146c7c982..0000000000 --- a/Content.Server/Item/MultiHandedItemSystem.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Content.Server.Hands.Systems; -using Content.Server.Inventory; -using Content.Shared.Hands; -using Content.Shared.Item; - -namespace Content.Server.Item; - -public sealed class MultiHandedItemSystem : SharedMultiHandedItemSystem -{ - [Dependency] private readonly VirtualItemSystem _virtualItem = default!; - - protected override void OnEquipped(EntityUid uid, MultiHandedItemComponent component, GotEquippedHandEvent args) - { - for (var i = 0; i < component.HandsNeeded - 1; i++) - { - _virtualItem.TrySpawnVirtualItemInHand(uid, args.User); - } - } - - protected override void OnUnequipped(EntityUid uid, MultiHandedItemComponent component, GotUnequippedHandEvent args) - { - _virtualItem.DeleteInHandsMatching(args.User, uid); - } -} diff --git a/Content.Shared/Item/MultiHandedItemComponent.cs b/Content.Shared/Item/MultiHandedItemComponent.cs index 9a90d063ba..3a0ac23bcd 100644 --- a/Content.Shared/Item/MultiHandedItemComponent.cs +++ b/Content.Shared/Item/MultiHandedItemComponent.cs @@ -9,6 +9,6 @@ namespace Content.Shared.Item; [RegisterComponent, NetworkedComponent] public sealed partial class MultiHandedItemComponent : Component { - [DataField("handsNeeded"), ViewVariables(VVAccess.ReadWrite)] + [DataField] public int HandsNeeded = 2; } diff --git a/Content.Shared/Item/MultiHandedItemSystem.cs b/Content.Shared/Item/MultiHandedItemSystem.cs new file mode 100644 index 0000000000..da9d895dd2 --- /dev/null +++ b/Content.Shared/Item/MultiHandedItemSystem.cs @@ -0,0 +1,56 @@ +using Content.Shared.Hands; +using Content.Shared.Hands.Components; +using Content.Shared.Hands.EntitySystems; +using Content.Shared.Inventory.VirtualItem; +using Content.Shared.Popups; +using Robust.Shared.Timing; + +namespace Content.Shared.Item; + +public sealed class MultiHandedItemSystem : EntitySystem +{ + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly SharedHandsSystem _hands = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly SharedVirtualItemSystem _virtualItem = default!; + + /// + public override void Initialize() + { + SubscribeLocalEvent(OnAttemptPickup); + SubscribeLocalEvent(OnVirtualItemDeleted); + SubscribeLocalEvent(OnEquipped); + SubscribeLocalEvent(OnUnequipped); + } + + private void OnEquipped(Entity ent, ref GotEquippedHandEvent args) + { + for (var i = 0; i < ent.Comp.HandsNeeded - 1; i++) + { + _virtualItem.TrySpawnVirtualItemInHand(ent.Owner, args.User); + } + } + + private void OnUnequipped(Entity ent, ref GotUnequippedHandEvent args) + { + _virtualItem.DeleteInHandsMatching(args.User, ent.Owner); + } + + private void OnAttemptPickup(Entity ent, ref GettingPickedUpAttemptEvent args) + { + if (TryComp(args.User, out var hands) && hands.CountFreeHands() >= ent.Comp.HandsNeeded) + return; + + args.Cancel(); + _popup.PopupPredictedCursor(Loc.GetString("multi-handed-item-pick-up-fail", + ("number", ent.Comp.HandsNeeded - 1), ("item", ent.Owner)), args.User); + } + + private void OnVirtualItemDeleted(Entity ent, ref VirtualItemDeletedEvent args) + { + if (args.BlockingEntity != ent.Owner || _timing.ApplyingState) + return; + + _hands.TryDrop(args.User, ent.Owner); + } +} diff --git a/Content.Shared/Item/SharedMultiHandedItemSystem.cs b/Content.Shared/Item/SharedMultiHandedItemSystem.cs deleted file mode 100644 index 0259b361b5..0000000000 --- a/Content.Shared/Item/SharedMultiHandedItemSystem.cs +++ /dev/null @@ -1,47 +0,0 @@ -using Content.Shared.Hands; -using Content.Shared.Hands.Components; -using Content.Shared.Hands.EntitySystems; -using Content.Shared.Popups; -using Robust.Shared.Timing; - -namespace Content.Shared.Item; - -public abstract class SharedMultiHandedItemSystem : EntitySystem -{ - [Dependency] private readonly IGameTiming _timing = default!; - [Dependency] private readonly SharedHandsSystem _hands = default!; - [Dependency] private readonly SharedPopupSystem _popup = default!; - - /// - public override void Initialize() - { - SubscribeLocalEvent(OnAttemptPickup); - SubscribeLocalEvent(OnVirtualItemDeleted); - SubscribeLocalEvent(OnEquipped); - SubscribeLocalEvent(OnUnequipped); - } - - protected abstract void OnEquipped(EntityUid uid, MultiHandedItemComponent component, GotEquippedHandEvent args); - protected abstract void OnUnequipped(EntityUid uid, MultiHandedItemComponent component, GotUnequippedHandEvent args); - - private void OnAttemptPickup(EntityUid uid, MultiHandedItemComponent component, GettingPickedUpAttemptEvent args) - { - if (TryComp(args.User, out var hands) && hands.CountFreeHands() >= component.HandsNeeded) - return; - - args.Cancel(); - if (_timing.IsFirstTimePredicted) - { - _popup.PopupCursor(Loc.GetString("multi-handed-item-pick-up-fail", - ("number", component.HandsNeeded - 1), ("item", uid)), args.User); - } - } - - private void OnVirtualItemDeleted(EntityUid uid, MultiHandedItemComponent component, VirtualItemDeletedEvent args) - { - if (args.BlockingEntity != uid) - return; - - _hands.TryDrop(args.User, uid); - } -}