Thieves can innately pickpocket - thieving gloves rework (#38123)

* Thieves can innately pickpocket (#107)

Pickpocketing a skyrim guard's armor off

(cherry picked from commit 21b9f1ddb251ea3c7c6803e78871abefcaecbfb4)

* this isnt moff

* Make predicted, cleanup

* !skating-basketball

* orks are NOT the best trollface

* Implement much more sensible component replication prevention

---------

Co-authored-by: DuckManZach <144298822+duckmanzach@users.noreply.github.com>
This commit is contained in:
ArtisticRoomba
2025-06-16 15:47:31 -07:00
committed by GitHub
parent 861d0fac71
commit 3eba895fc7
10 changed files with 99 additions and 24 deletions

View File

@@ -1,22 +1,44 @@
using Content.Shared.Alert;
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
namespace Content.Shared.Strip.Components; namespace Content.Shared.Strip.Components;
/// <summary> /// <summary>
/// Give this to an entity when you want to decrease stripping times /// Give this to an entity when you want to decrease stripping times
/// </summary> /// </summary>
[RegisterComponent] [RegisterComponent, NetworkedComponent]
[AutoGenerateComponentState(fieldDeltas: true)]
public sealed partial class ThievingComponent : Component public sealed partial class ThievingComponent : Component
{ {
/// <summary> /// <summary>
/// How much the strip time should be shortened by /// How much the strip time should be shortened by
/// </summary> /// </summary>
[ViewVariables(VVAccess.ReadWrite)] [DataField, AutoNetworkedField]
[DataField("stripTimeReduction")]
public TimeSpan StripTimeReduction = TimeSpan.FromSeconds(0.5f); public TimeSpan StripTimeReduction = TimeSpan.FromSeconds(0.5f);
/// <summary> /// <summary>
/// Should it notify the user if they're stripping a pocket? /// Should it notify the user if they're stripping a pocket?
/// </summary> /// </summary>
[ViewVariables(VVAccess.ReadWrite)] [DataField, AutoNetworkedField]
[DataField("stealthy")]
public bool Stealthy; public bool Stealthy;
/// <summary>
/// Variable pointing at the Alert modal
/// </summary>
[DataField]
public ProtoId<AlertPrototype> StealthyAlertProtoId = "Stealthy";
/// <summary>
/// Prevent component replication to clients other than the owner,
/// doesn't affect prediction.
/// Get mogged.
/// </summary>
public override bool SendOnlyToOwner => true;
} }
/// <summary>
/// Event raised to toggle the thieving component.
/// </summary>
public sealed partial class ToggleThievingEvent : BaseAlertEvent;

View File

@@ -1,23 +1,54 @@
using Content.Shared.Alert;
using Content.Shared.Inventory; using Content.Shared.Inventory;
using Content.Shared.Strip;
using Content.Shared.Strip.Components; using Content.Shared.Strip.Components;
using Robust.Shared.GameStates;
namespace Content.Shared.Strip; namespace Content.Shared.Strip;
public sealed class ThievingSystem : EntitySystem public sealed partial class ThievingSystem : EntitySystem
{ {
[Dependency] private readonly AlertsSystem _alertsSystem = default!;
public override void Initialize() public override void Initialize()
{ {
base.Initialize(); base.Initialize();
SubscribeLocalEvent<ThievingComponent, BeforeStripEvent>(OnBeforeStrip); SubscribeLocalEvent<ThievingComponent, BeforeStripEvent>(OnBeforeStrip);
SubscribeLocalEvent<ThievingComponent, InventoryRelayedEvent<BeforeStripEvent>>((e, c, ev) => OnBeforeStrip(e, c, ev.Args)); SubscribeLocalEvent<ThievingComponent, InventoryRelayedEvent<BeforeStripEvent>>((e, c, ev) =>
OnBeforeStrip(e, c, ev.Args));
SubscribeLocalEvent<ThievingComponent, ToggleThievingEvent>(OnToggleStealthy);
SubscribeLocalEvent<ThievingComponent, ComponentInit>(OnCompInit);
SubscribeLocalEvent<ThievingComponent, ComponentRemove>(OnCompRemoved);
} }
private void OnBeforeStrip(EntityUid uid, ThievingComponent component, BeforeStripEvent args) private void OnBeforeStrip(EntityUid uid, ThievingComponent component, BeforeStripEvent args)
{ {
args.Stealth |= component.Stealthy; args.Stealth |= component.Stealthy;
args.Additive -= component.StripTimeReduction; if (args.Stealth)
{
args.Additive -= component.StripTimeReduction;
}
}
private void OnCompInit(Entity<ThievingComponent> entity, ref ComponentInit args)
{
_alertsSystem.ShowAlert(entity, entity.Comp.StealthyAlertProtoId, 1);
}
private void OnCompRemoved(Entity<ThievingComponent> entity, ref ComponentRemove args)
{
_alertsSystem.ClearAlert(entity, entity.Comp.StealthyAlertProtoId);
}
private void OnToggleStealthy(Entity<ThievingComponent> ent, ref ToggleThievingEvent args)
{
if (args.Handled)
return;
ent.Comp.Stealthy = !ent.Comp.Stealthy;
_alertsSystem.ShowAlert(ent.Owner, ent.Comp.StealthyAlertProtoId, (short)(ent.Comp.Stealthy ? 1 : 0));
DirtyField(ent.AsNullable(), nameof(ent.Comp.Stealthy), null);
args.Handled = true;
} }
} }

View File

@@ -116,3 +116,6 @@ alerts-revenant-corporeal-desc = You have manifested physically. People around y
alerts-rooted-name = Rooted alerts-rooted-name = Rooted
alerts-rooted-desc = You are attached to the ground. You can't slip, but you absorb fluids under you. alerts-rooted-desc = You are attached to the ground. You can't slip, but you absorb fluids under you.
alerts-stealthy-name = Pickpocketing
alerts-stealthy-desc = Whether you are currently pickpocketing. Click to toggle.

View File

@@ -26,6 +26,7 @@
- alertType: Magboots - alertType: Magboots
- alertType: Rooted - alertType: Rooted
- alertType: Pacified - alertType: Pacified
- alertType: Stealthy
- type: entity - type: entity
id: AlertSpriteView id: AlertSpriteView
@@ -438,6 +439,19 @@
name: alerts-pacified-name name: alerts-pacified-name
description: alerts-pacified-desc description: alerts-pacified-desc
- type: alert
id: Stealthy
clickEvent: !type:ToggleThievingEvent
icons:
- sprite: /Textures/Interface/Alerts/stealthy.rsi
state: stealthy-off
- sprite: /Textures/Interface/Alerts/stealthy.rsi
state: stealthy-on
name: alerts-stealthy-name
description: alerts-stealthy-desc
minSeverity: 0
maxSeverity: 1
- type: alert - type: alert
id: Adrenaline id: Adrenaline
icons: icons:

View File

@@ -1593,20 +1593,6 @@
categories: categories:
- UplinkWearables - UplinkWearables
# TODO: Revert back to normal thieving gloves when clothes dyeing is added
- type: listing
id: UplinkgClothingThievingGloves
name: uplink-clothing-chameleon-thieving-gloves-name
description: uplink-clothing-chameleon-thieving-gloves-desc
productEntity: ClothingHandsChameleonThief
discountCategory: veryRareDiscounts
discountDownTo:
Telecrystal: 3
cost:
Telecrystal: 5
categories:
- UplinkWearables
- type: listing - type: listing
id: UplinkClothingOuterVestWeb id: UplinkClothingOuterVestWeb
name: uplink-clothing-outer-vest-web-name name: uplink-clothing-outer-vest-web-name

View File

@@ -27,6 +27,9 @@
startingGear: ThiefGear startingGear: ThiefGear
components: components:
- type: Pacified - type: Pacified
- type: Thieving
stripTimeReduction: 2
stealthy: true
mindRoles: mindRoles:
- MindRoleThief - MindRoleThief
briefing: briefing:

View File

@@ -15,4 +15,3 @@
back: back:
- ThiefBeacon - ThiefBeacon
- SatchelThief - SatchelThief
- ClothingHandsChameleonThief

View File

@@ -0,0 +1,17 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e. Edited by DuckManZach (github)",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "stealthy-off"
},
{
"name": "stealthy-on"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 636 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 685 B