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.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;
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
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
|
||||||
|
|||||||
Reference in New Issue
Block a user