Remove server-sprite references from handcuffs (#13515)

This commit is contained in:
Leon Friedrich
2023-01-17 16:23:53 +13:00
committed by GitHub
parent e8b18d17c2
commit 44631c7723
6 changed files with 52 additions and 75 deletions

View File

@@ -18,6 +18,7 @@ using Robust.Shared.Audio;
using Robust.Shared.Containers; using Robust.Shared.Containers;
using Robust.Shared.Player; using Robust.Shared.Player;
using Content.Server.Recycling.Components; using Content.Server.Recycling.Components;
using Robust.Shared.Map;
namespace Content.Server.Cuffs.Components namespace Content.Server.Cuffs.Components
{ {
@@ -271,22 +272,16 @@ namespace Content.Server.Cuffs.Components
SoundSystem.Play(cuff.EndUncuffSound.GetSound(), Filter.Pvs(Owner), Owner); SoundSystem.Play(cuff.EndUncuffSound.GetSound(), Filter.Pvs(Owner), Owner);
_entMan.EntitySysManager.GetEntitySystem<HandVirtualItemSystem>().DeleteInHandsMatching(user, cuffsToRemove); _entMan.EntitySysManager.GetEntitySystem<HandVirtualItemSystem>().DeleteInHandsMatching(user, cuffsToRemove);
_entMan.EntitySysManager.GetEntitySystem<SharedHandsSystem>().PickupOrDrop(user, cuffsToRemove);
if (cuff.BreakOnRemove) if (cuff.BreakOnRemove)
{ {
cuff.Broken = true; _entMan.QueueDeleteEntity(cuffsToRemove);
var trash = _entMan.SpawnEntity(cuff.BrokenPrototype, MapCoordinates.Nullspace);
var meta = _entMan.GetComponent<MetaDataComponent>(cuffsToRemove); _entMan.EntitySysManager.GetEntitySystem<SharedHandsSystem>().PickupOrDrop(user, trash);
meta.EntityName = Loc.GetString(cuff.BrokenName); }
meta.EntityDescription = Loc.GetString(cuff.BrokenDesc); else
{
if (_entMan.TryGetComponent<SpriteComponent>(cuffsToRemove, out var sprite) && cuff.BrokenState != null) _entMan.EntitySysManager.GetEntitySystem<SharedHandsSystem>().PickupOrDrop(user, cuffsToRemove);
{
sprite.LayerSetState(0, cuff.BrokenState); // TODO: safety check to see if RSI contains the state?
}
_entMan.EnsureComponent<RecyclableComponent>(cuffsToRemove);
} }
CanStillInteract = _entMan.TryGetComponent(Owner, out HandsComponent? handsComponent) && handsComponent.SortedHands.Count() > CuffedHandCount; CanStillInteract = _entMan.TryGetComponent(Owner, out HandsComponent? handsComponent) && handsComponent.SortedHands.Count() > CuffedHandCount;

View File

@@ -7,6 +7,8 @@ using Content.Shared.Popups;
using Content.Shared.Stunnable; using Content.Shared.Stunnable;
using Robust.Shared.Audio; using Robust.Shared.Audio;
using Robust.Shared.Player; using Robust.Shared.Player;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
namespace Content.Server.Cuffs.Components namespace Content.Server.Cuffs.Components
{ {
@@ -47,6 +49,12 @@ namespace Content.Server.Cuffs.Components
[DataField("breakOnRemove")] [DataField("breakOnRemove")]
public bool BreakOnRemove { get; set; } public bool BreakOnRemove { get; set; }
/// <summary>
/// Will the cuffs break when removed?
/// </summary>
[DataField("brokenPrototype", customTypeSerializer:typeof(PrototypeIdSerializer<EntityPrototype>))]
public string? BrokenPrototype { get; set; }
/// <summary> /// <summary>
/// The path of the RSI file used for the player cuffed overlay. /// The path of the RSI file used for the player cuffed overlay.
/// </summary> /// </summary>
@@ -59,42 +67,6 @@ namespace Content.Server.Cuffs.Components
[DataField("bodyIconState")] [DataField("bodyIconState")]
public string? OverlayIconState { get; set; } = "body-overlay"; public string? OverlayIconState { get; set; } = "body-overlay";
/// <summary>
/// The iconstate used for broken handcuffs
/// </summary>
[DataField("brokenIconState")]
public string? BrokenState { get; set; }
/// <summary>
/// The iconstate used for broken handcuffs
/// </summary>
[DataField("brokenName", readOnly: true)]
public string BrokenName { get; private set; } = "";
/// <summary>
/// The iconstate used for broken handcuffs
/// </summary>
[DataField("brokenDesc", readOnly: true)]
public string BrokenDesc { get; private set; } = "";
[ViewVariables]
public bool Broken
{
get
{
return _isBroken;
}
set
{
if (_isBroken != value)
{
_isBroken = value;
Dirty();
}
}
}
[DataField("startCuffSound")] [DataField("startCuffSound")]
public SoundSpecifier StartCuffSound { get; set; } = new SoundPathSpecifier("/Audio/Items/Handcuffs/cuff_start.ogg"); public SoundSpecifier StartCuffSound { get; set; } = new SoundPathSpecifier("/Audio/Items/Handcuffs/cuff_start.ogg");
@@ -112,19 +84,11 @@ namespace Content.Server.Cuffs.Components
[DataField("color")] [DataField("color")]
public Color Color { get; set; } = Color.White; public Color Color { get; set; } = Color.White;
// Non-exposed data fields
private bool _isBroken = false;
/// <summary> /// <summary>
/// Used to prevent DoAfter getting spammed. /// Used to prevent DoAfter getting spammed.
/// </summary> /// </summary>
public bool Cuffing; public bool Cuffing;
public override ComponentState GetComponentState()
{
return new HandcuffedComponentState(Broken ? BrokenState : string.Empty);
}
/// <summary> /// <summary>
/// Update the cuffed state of an entity /// Update the cuffed state of an entity
/// </summary> /// </summary>

View File

@@ -86,12 +86,6 @@ namespace Content.Server.Cuffs
if (component.Cuffing || !EntityManager.TryGetComponent<CuffableComponent>(target, out var cuffed)) if (component.Cuffing || !EntityManager.TryGetComponent<CuffableComponent>(target, out var cuffed))
return; return;
if (component.Broken)
{
_popup.PopupEntity(Loc.GetString("handcuff-component-cuffs-broken-error"), user, user);
return;
}
if (!EntityManager.TryGetComponent<HandsComponent?>(target, out var hands)) if (!EntityManager.TryGetComponent<HandsComponent?>(target, out var hands))
{ {
_popup.PopupEntity(Loc.GetString("handcuff-component-target-has-no-hands-error",("targetName", target)), user, user); _popup.PopupEntity(Loc.GetString("handcuff-component-target-has-no-hands-error",("targetName", target)), user, user);

View File

@@ -60,9 +60,14 @@ public abstract partial class SharedHandsSystem : EntitySystem
// animation // animation
var xform = Transform(uid); var xform = Transform(uid);
var coordinateEntity = xform.ParentUid.IsValid() ? xform.ParentUid : uid; var coordinateEntity = xform.ParentUid.IsValid() ? xform.ParentUid : uid;
var initialPosition = EntityCoordinates.FromMap(EntityManager, coordinateEntity, Transform(entity).MapPosition);
PickupAnimation(entity, initialPosition, xform.LocalPosition, animateUser ? null : uid); var itemPos = Transform(entity).MapPosition;
if (itemPos.MapId == xform.MapID)
{
// TODO max range for animation?
var initialPosition = EntityCoordinates.FromMap(coordinateEntity, itemPos, EntityManager);
PickupAnimation(entity, initialPosition, xform.LocalPosition, animateUser ? null : uid);
}
DoPickup(uid, hand, entity, handsComp); DoPickup(uid, hand, entity, handsComp);
return true; return true;

View File

@@ -1,4 +0,0 @@
handcuff-broken-cables-name = broken cables
handcuff-broken-cables-desc = These cables are broken in several places and don't seem very useful.
handcuff-broken-zipties-name = broken zipties
handcuff-broken-zipties-desc = These zipties look like they tried to manage the wrong cables.

View File

@@ -35,9 +35,7 @@
bodyIconState: body-overlay bodyIconState: body-overlay
color: red color: red
breakOnRemove: true breakOnRemove: true
brokenIconState: cuff-broken brokenPrototype: CablecuffsBroken
brokenName: handcuff-broken-cables-name
brokenDesc: handcuff-broken-cables-desc
startCuffSound: startCuffSound:
path: /Audio/Items/Handcuffs/rope_start.ogg path: /Audio/Items/Handcuffs/rope_start.ogg
endCuffSound: endCuffSound:
@@ -69,9 +67,7 @@
cuffedRSI: Objects/Misc/cablecuffs.rsi # cablecuffs will look fine cuffedRSI: Objects/Misc/cablecuffs.rsi # cablecuffs will look fine
bodyIconState: body-overlay bodyIconState: body-overlay
breakOnRemove: true breakOnRemove: true
brokenIconState: cuff-broken brokenPrototype: ZiptiesBroken
brokenName: handcuff-broken-zipties-name
brokenDesc: handcuff-broken-zipties-desc
startCuffSound: startCuffSound:
path: /Audio/Items/Handcuffs/ziptie_start.ogg path: /Audio/Items/Handcuffs/ziptie_start.ogg
endCuffSound: endCuffSound:
@@ -85,3 +81,30 @@
- type: Sprite - type: Sprite
sprite: Objects/Misc/zipties.rsi sprite: Objects/Misc/zipties.rsi
state: cuff state: cuff
- type: entity
name: broken zipties
description: These zipties look like they tried to manage the wrong cables.
id: ZiptiesBroken
parent: BaseItem
components:
- type: Sprite
sprite: Objects/Misc/zipties.rsi
state: cuff-broken
- type: Item
size: 2
- type: Recyclable
- type: entity
name: broken cables
description: These cables are broken in several places and don't seem very useful.
id: CablecuffsBroken
parent: BaseItem
components:
- type: Sprite
sprite: Objects/Misc/cablecuffs.rsi
state: cuff-broken
color: red
- type: Item
size: 2
- type: Recyclable