Remove server-sprite references from handcuffs (#13515)
This commit is contained in:
@@ -18,6 +18,7 @@ using Robust.Shared.Audio;
|
||||
using Robust.Shared.Containers;
|
||||
using Robust.Shared.Player;
|
||||
using Content.Server.Recycling.Components;
|
||||
using Robust.Shared.Map;
|
||||
|
||||
namespace Content.Server.Cuffs.Components
|
||||
{
|
||||
@@ -271,22 +272,16 @@ namespace Content.Server.Cuffs.Components
|
||||
SoundSystem.Play(cuff.EndUncuffSound.GetSound(), Filter.Pvs(Owner), Owner);
|
||||
|
||||
_entMan.EntitySysManager.GetEntitySystem<HandVirtualItemSystem>().DeleteInHandsMatching(user, cuffsToRemove);
|
||||
_entMan.EntitySysManager.GetEntitySystem<SharedHandsSystem>().PickupOrDrop(user, cuffsToRemove);
|
||||
|
||||
if (cuff.BreakOnRemove)
|
||||
{
|
||||
cuff.Broken = true;
|
||||
|
||||
var meta = _entMan.GetComponent<MetaDataComponent>(cuffsToRemove);
|
||||
meta.EntityName = Loc.GetString(cuff.BrokenName);
|
||||
meta.EntityDescription = Loc.GetString(cuff.BrokenDesc);
|
||||
|
||||
if (_entMan.TryGetComponent<SpriteComponent>(cuffsToRemove, out var sprite) && cuff.BrokenState != null)
|
||||
{
|
||||
sprite.LayerSetState(0, cuff.BrokenState); // TODO: safety check to see if RSI contains the state?
|
||||
_entMan.QueueDeleteEntity(cuffsToRemove);
|
||||
var trash = _entMan.SpawnEntity(cuff.BrokenPrototype, MapCoordinates.Nullspace);
|
||||
_entMan.EntitySysManager.GetEntitySystem<SharedHandsSystem>().PickupOrDrop(user, trash);
|
||||
}
|
||||
|
||||
_entMan.EnsureComponent<RecyclableComponent>(cuffsToRemove);
|
||||
else
|
||||
{
|
||||
_entMan.EntitySysManager.GetEntitySystem<SharedHandsSystem>().PickupOrDrop(user, cuffsToRemove);
|
||||
}
|
||||
|
||||
CanStillInteract = _entMan.TryGetComponent(Owner, out HandsComponent? handsComponent) && handsComponent.SortedHands.Count() > CuffedHandCount;
|
||||
|
||||
@@ -7,6 +7,8 @@ using Content.Shared.Popups;
|
||||
using Content.Shared.Stunnable;
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.Player;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
|
||||
|
||||
namespace Content.Server.Cuffs.Components
|
||||
{
|
||||
@@ -47,6 +49,12 @@ namespace Content.Server.Cuffs.Components
|
||||
[DataField("breakOnRemove")]
|
||||
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>
|
||||
/// The path of the RSI file used for the player cuffed overlay.
|
||||
/// </summary>
|
||||
@@ -59,42 +67,6 @@ namespace Content.Server.Cuffs.Components
|
||||
[DataField("bodyIconState")]
|
||||
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")]
|
||||
public SoundSpecifier StartCuffSound { get; set; } = new SoundPathSpecifier("/Audio/Items/Handcuffs/cuff_start.ogg");
|
||||
|
||||
@@ -112,19 +84,11 @@ namespace Content.Server.Cuffs.Components
|
||||
[DataField("color")]
|
||||
public Color Color { get; set; } = Color.White;
|
||||
|
||||
// Non-exposed data fields
|
||||
private bool _isBroken = false;
|
||||
|
||||
/// <summary>
|
||||
/// Used to prevent DoAfter getting spammed.
|
||||
/// </summary>
|
||||
public bool Cuffing;
|
||||
|
||||
public override ComponentState GetComponentState()
|
||||
{
|
||||
return new HandcuffedComponentState(Broken ? BrokenState : string.Empty);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Update the cuffed state of an entity
|
||||
/// </summary>
|
||||
|
||||
@@ -86,12 +86,6 @@ namespace Content.Server.Cuffs
|
||||
if (component.Cuffing || !EntityManager.TryGetComponent<CuffableComponent>(target, out var cuffed))
|
||||
return;
|
||||
|
||||
if (component.Broken)
|
||||
{
|
||||
_popup.PopupEntity(Loc.GetString("handcuff-component-cuffs-broken-error"), user, user);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!EntityManager.TryGetComponent<HandsComponent?>(target, out var hands))
|
||||
{
|
||||
_popup.PopupEntity(Loc.GetString("handcuff-component-target-has-no-hands-error",("targetName", target)), user, user);
|
||||
|
||||
@@ -60,9 +60,14 @@ public abstract partial class SharedHandsSystem : EntitySystem
|
||||
// animation
|
||||
var xform = Transform(uid);
|
||||
var coordinateEntity = xform.ParentUid.IsValid() ? xform.ParentUid : uid;
|
||||
var initialPosition = EntityCoordinates.FromMap(EntityManager, coordinateEntity, Transform(entity).MapPosition);
|
||||
|
||||
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);
|
||||
|
||||
return true;
|
||||
|
||||
@@ -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.
|
||||
@@ -35,9 +35,7 @@
|
||||
bodyIconState: body-overlay
|
||||
color: red
|
||||
breakOnRemove: true
|
||||
brokenIconState: cuff-broken
|
||||
brokenName: handcuff-broken-cables-name
|
||||
brokenDesc: handcuff-broken-cables-desc
|
||||
brokenPrototype: CablecuffsBroken
|
||||
startCuffSound:
|
||||
path: /Audio/Items/Handcuffs/rope_start.ogg
|
||||
endCuffSound:
|
||||
@@ -69,9 +67,7 @@
|
||||
cuffedRSI: Objects/Misc/cablecuffs.rsi # cablecuffs will look fine
|
||||
bodyIconState: body-overlay
|
||||
breakOnRemove: true
|
||||
brokenIconState: cuff-broken
|
||||
brokenName: handcuff-broken-zipties-name
|
||||
brokenDesc: handcuff-broken-zipties-desc
|
||||
brokenPrototype: ZiptiesBroken
|
||||
startCuffSound:
|
||||
path: /Audio/Items/Handcuffs/ziptie_start.ogg
|
||||
endCuffSound:
|
||||
@@ -85,3 +81,30 @@
|
||||
- type: Sprite
|
||||
sprite: Objects/Misc/zipties.rsi
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user