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