multi-handed item component (#12523)

* multi-handed item component

* pretty fucking obvious missed portion of this

* holy shit was i on crack wtf was that code

* DEWIT RIGHT
This commit is contained in:
Nemanja
2022-12-19 23:07:23 -05:00
committed by GitHub
parent 0b72e1d404
commit 168bad2ef2
5 changed files with 104 additions and 0 deletions

View File

@@ -0,0 +1,15 @@
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)
{
}
}

View File

@@ -0,0 +1,23 @@
using Content.Server.Hands.Systems;
using Content.Shared.Hands;
using Content.Shared.Item;
namespace Content.Server.Item;
public sealed class MultiHandedItemSystem : SharedMultiHandedItemSystem
{
[Dependency] private readonly HandVirtualItemSystem _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);
}
}

View File

@@ -0,0 +1,14 @@
using Robust.Shared.GameStates;
namespace Content.Shared.Item;
/// <summary>
/// This is used for items that need
/// multiple hands to be able to be picked up
/// </summary>
[RegisterComponent, NetworkedComponent]
public sealed class MultiHandedItemComponent : Component
{
[DataField("handsNeeded"), ViewVariables(VVAccess.ReadWrite)]
public int HandsNeeded = 2;
}

View File

@@ -0,0 +1,48 @@
using Content.Shared.Hands;
using Content.Shared.Hands.Components;
using Content.Shared.Hands.EntitySystems;
using Content.Shared.Popups;
using Robust.Shared.Player;
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!;
/// <inheritdoc/>
public override void Initialize()
{
SubscribeLocalEvent<MultiHandedItemComponent, GettingPickedUpAttemptEvent>(OnAttemptPickup);
SubscribeLocalEvent<MultiHandedItemComponent, VirtualItemDeletedEvent>(OnVirtualItemDeleted);
SubscribeLocalEvent<MultiHandedItemComponent, GotEquippedHandEvent>(OnEquipped);
SubscribeLocalEvent<MultiHandedItemComponent, GotUnequippedHandEvent>(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<SharedHandsComponent>(args.User, out var hands) && hands.CountFreeHands() >= component.HandsNeeded)
return;
args.Cancel();
if (_timing.IsFirstTimePredicted)
{
_popup.PopupEntity(Loc.GetString("multi-handed-item-pick-up-fail",
("number", component.HandsNeeded - 1), ("item", uid)), args.User, Filter.Local());
}
}
private void OnVirtualItemDeleted(EntityUid uid, MultiHandedItemComponent component, VirtualItemDeletedEvent args)
{
if (args.BlockingEntity != uid)
return;
_hands.TryDrop(args.User, uid);
}
}

View File

@@ -0,0 +1,4 @@
multi-handed-item-pick-up-fail = {$number ->
[one] You need one more free hand to pick up { THE($item) }.
*[other] You need { $number } more free hands to pick up { THE($item) }.
}