Add explosive cord. (#25875)
14
Content.Server/ExCable/ExCableNodeGroup.cs
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
using Content.Server.NodeContainer.NodeGroups;
|
||||||
|
using Content.Shared.NodeContainer.NodeGroups;
|
||||||
|
using Content.Server.Power.Components;
|
||||||
|
using Content.Server.Power.EntitySystems;
|
||||||
|
|
||||||
|
namespace Content.Server.ExCable;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Dummy Node group class for handling the explosive cables.
|
||||||
|
/// </summary>
|
||||||
|
[NodeGroup(NodeGroupID.ExCable)]
|
||||||
|
public sealed class ExCableNodeGroup : BaseNodeGroup
|
||||||
|
{
|
||||||
|
}
|
||||||
@@ -1,12 +1,6 @@
|
|||||||
using Content.Shared.Interaction;
|
using Content.Shared.Interaction;
|
||||||
using Content.Shared.Storage;
|
|
||||||
using JetBrains.Annotations;
|
|
||||||
using Robust.Server.GameObjects;
|
|
||||||
using Robust.Shared.Containers;
|
|
||||||
using Robust.Shared.Player;
|
|
||||||
|
|
||||||
namespace Content.Server.Interaction
|
namespace Content.Server.Interaction
|
||||||
{
|
{
|
||||||
// TODO Remove Shared prefix
|
|
||||||
public sealed class InteractionSystem : SharedInteractionSystem;
|
public sealed class InteractionSystem : SharedInteractionSystem;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -447,6 +447,7 @@ namespace Content.Server.NodeContainer.EntitySystems
|
|||||||
NodeGroupID.Pipe => Color.Blue,
|
NodeGroupID.Pipe => Color.Blue,
|
||||||
NodeGroupID.WireNet => Color.DarkMagenta,
|
NodeGroupID.WireNet => Color.DarkMagenta,
|
||||||
NodeGroupID.Teg => Color.Red,
|
NodeGroupID.Teg => Color.Red,
|
||||||
|
NodeGroupID.ExCable => Color.Pink,
|
||||||
_ => Color.White
|
_ => Color.White
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,35 @@
|
|||||||
using Robust.Shared.Prototypes;
|
using Robust.Shared.Prototypes;
|
||||||
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
|
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
|
||||||
using Content.Shared.Power;
|
using Content.Shared.Power;
|
||||||
|
using Content.Shared.Whitelist;
|
||||||
|
|
||||||
namespace Content.Server.Power.Components
|
namespace Content.Server.Power.Components
|
||||||
{
|
{
|
||||||
[RegisterComponent]
|
[RegisterComponent]
|
||||||
public sealed partial class CablePlacerComponent : Component
|
public sealed partial class CablePlacerComponent : Component
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The structure prototype for the cable coil to place.
|
||||||
|
/// </summary>
|
||||||
[DataField("cablePrototypeID", customTypeSerializer:typeof(PrototypeIdSerializer<EntityPrototype>))]
|
[DataField("cablePrototypeID", customTypeSerializer:typeof(PrototypeIdSerializer<EntityPrototype>))]
|
||||||
public string? CablePrototypeId = "CableHV";
|
public string? CablePrototypeId = "CableHV";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// What kind of wire prevents placing this wire over it as CableType.
|
||||||
|
/// </summary>
|
||||||
[DataField("blockingWireType")]
|
[DataField("blockingWireType")]
|
||||||
public CableType BlockingCableType = CableType.HighVoltage;
|
public CableType BlockingCableType = CableType.HighVoltage;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Blacklist for things the cable cannot be placed over. For things that arent cables with CableTypes.
|
||||||
|
/// </summary>
|
||||||
|
[DataField]
|
||||||
|
public EntityWhitelist Blacklist = new();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Whether the placed cable should go over tiles or not.
|
||||||
|
/// </summary>
|
||||||
|
[DataField]
|
||||||
|
public bool OverTile;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ using Content.Shared.Database;
|
|||||||
using Content.Shared.Interaction;
|
using Content.Shared.Interaction;
|
||||||
using Content.Shared.Maps;
|
using Content.Shared.Maps;
|
||||||
using Content.Shared.Stacks;
|
using Content.Shared.Stacks;
|
||||||
|
using Content.Shared.Whitelist;
|
||||||
using Robust.Shared.Map.Components;
|
using Robust.Shared.Map.Components;
|
||||||
|
|
||||||
namespace Content.Server.Power.EntitySystems;
|
namespace Content.Server.Power.EntitySystems;
|
||||||
@@ -13,6 +14,7 @@ public sealed partial class CableSystem
|
|||||||
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
|
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
|
||||||
[Dependency] private readonly SharedTransformSystem _transform = default!;
|
[Dependency] private readonly SharedTransformSystem _transform = default!;
|
||||||
[Dependency] private readonly SharedMapSystem _map = default!;
|
[Dependency] private readonly SharedMapSystem _map = default!;
|
||||||
|
[Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!;
|
||||||
|
|
||||||
private void InitializeCablePlacer()
|
private void InitializeCablePlacer()
|
||||||
{
|
{
|
||||||
@@ -35,12 +37,14 @@ public sealed partial class CableSystem
|
|||||||
var snapPos = _map.TileIndicesFor((gridUid, grid), args.ClickLocation);
|
var snapPos = _map.TileIndicesFor((gridUid, grid), args.ClickLocation);
|
||||||
var tileDef = (ContentTileDefinition)_tileManager[_map.GetTileRef(gridUid, grid, snapPos).Tile.TypeId];
|
var tileDef = (ContentTileDefinition)_tileManager[_map.GetTileRef(gridUid, grid, snapPos).Tile.TypeId];
|
||||||
|
|
||||||
if (!tileDef.IsSubFloor || !tileDef.Sturdy)
|
if ((!component.OverTile && !tileDef.IsSubFloor) || !tileDef.Sturdy)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
foreach (var anchored in _map.GetAnchoredEntities((gridUid, grid), snapPos))
|
foreach (var anchored in _map.GetAnchoredEntities((gridUid, grid), snapPos))
|
||||||
{
|
{
|
||||||
|
if (_whitelistSystem.IsBlacklistPass(component.Blacklist, anchored))
|
||||||
|
return;
|
||||||
|
|
||||||
if (TryComp<CableComponent>(anchored, out var wire) && wire.CableType == component.BlockingCableType)
|
if (TryComp<CableComponent>(anchored, out var wire) && wire.CableType == component.BlockingCableType)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,19 +1,11 @@
|
|||||||
using Content.Server.Administration.Managers;
|
|
||||||
using Content.Shared.Administration;
|
|
||||||
using Content.Shared.Explosion;
|
using Content.Shared.Explosion;
|
||||||
using Content.Shared.Ghost;
|
|
||||||
using Content.Shared.Hands;
|
using Content.Shared.Hands;
|
||||||
using Content.Shared.Lock;
|
|
||||||
using Content.Shared.Storage;
|
using Content.Shared.Storage;
|
||||||
using Content.Shared.Storage.Components;
|
using Content.Shared.Storage.Components;
|
||||||
using Content.Shared.Storage.EntitySystems;
|
using Content.Shared.Storage.EntitySystems;
|
||||||
using Content.Shared.Verbs;
|
|
||||||
using Robust.Server.GameObjects;
|
|
||||||
using Robust.Shared.Map;
|
using Robust.Shared.Map;
|
||||||
using Robust.Shared.Player;
|
using Robust.Shared.Player;
|
||||||
using Robust.Shared.Prototypes;
|
using Robust.Shared.Prototypes;
|
||||||
using Robust.Shared.Utility;
|
|
||||||
|
|
||||||
namespace Content.Server.Storage.EntitySystems;
|
namespace Content.Server.Storage.EntitySystems;
|
||||||
|
|
||||||
public sealed partial class StorageSystem : SharedStorageSystem
|
public sealed partial class StorageSystem : SharedStorageSystem
|
||||||
@@ -24,7 +16,6 @@ public sealed partial class StorageSystem : SharedStorageSystem
|
|||||||
{
|
{
|
||||||
base.Initialize();
|
base.Initialize();
|
||||||
SubscribeLocalEvent<StorageComponent, BeforeExplodeEvent>(OnExploded);
|
SubscribeLocalEvent<StorageComponent, BeforeExplodeEvent>(OnExploded);
|
||||||
|
|
||||||
SubscribeLocalEvent<StorageFillComponent, MapInitEvent>(OnStorageFillMapInit);
|
SubscribeLocalEvent<StorageFillComponent, MapInitEvent>(OnStorageFillMapInit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,4 +16,5 @@ public enum NodeGroupID : byte
|
|||||||
/// <seealso cref="Content.Server.Power.Generation.Teg.TegSystem"/>
|
/// <seealso cref="Content.Server.Power.Generation.Teg.TegSystem"/>
|
||||||
/// <seealso cref="Content.Server.Power.Generation.Teg.TegNodeGroup"/>
|
/// <seealso cref="Content.Server.Power.Generation.Teg.TegNodeGroup"/>
|
||||||
Teg,
|
Teg,
|
||||||
|
ExCable,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,6 +34,6 @@ public struct PowerCableChunk
|
|||||||
public PowerCableChunk(Vector2i origin)
|
public PowerCableChunk(Vector2i origin)
|
||||||
{
|
{
|
||||||
Origin = origin;
|
Origin = origin;
|
||||||
PowerCableData = new int[3];
|
PowerCableData = new int[Enum.GetNames(typeof(CableType)).Length];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ namespace Content.Shared.Power
|
|||||||
HighVoltage,
|
HighVoltage,
|
||||||
MediumVoltage,
|
MediumVoltage,
|
||||||
Apc,
|
Apc,
|
||||||
|
ExCable
|
||||||
}
|
}
|
||||||
|
|
||||||
[Serializable, NetSerializable]
|
[Serializable, NetSerializable]
|
||||||
|
|||||||
@@ -36,6 +36,10 @@ stack-hv-cable = {$amount ->
|
|||||||
[1] hv cable
|
[1] hv cable
|
||||||
*[other] hv cables
|
*[other] hv cables
|
||||||
}
|
}
|
||||||
|
stack-explosive-cord = {$amount ->
|
||||||
|
[1] explosive cord
|
||||||
|
*[other] explosive cords
|
||||||
|
}
|
||||||
stack-wood-plank = {$amount ->
|
stack-wood-plank = {$amount ->
|
||||||
[1] wood plank
|
[1] wood plank
|
||||||
*[other] wood planks
|
*[other] wood planks
|
||||||
|
|||||||
@@ -135,3 +135,24 @@
|
|||||||
layers:
|
layers:
|
||||||
- state: box_security
|
- state: box_security
|
||||||
- state: forensic
|
- state: forensic
|
||||||
|
|
||||||
|
- type: entity
|
||||||
|
parent: BoxCardboard
|
||||||
|
id: BoxDetonator
|
||||||
|
name: detonator box
|
||||||
|
description: A box of explosive detonators and triggers.
|
||||||
|
components:
|
||||||
|
- type: Item
|
||||||
|
shape:
|
||||||
|
- 0,0,1,1
|
||||||
|
- type: StorageFill
|
||||||
|
contents:
|
||||||
|
- id: EmptyDetonator
|
||||||
|
amount: 3
|
||||||
|
- id: TimerTrigger
|
||||||
|
amount: 2
|
||||||
|
- id: VoiceTrigger
|
||||||
|
- type: Sprite
|
||||||
|
layers:
|
||||||
|
- state: box_security
|
||||||
|
- state: trigger
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
sprite: Objects/Devices/timer.rsi
|
sprite: Objects/Devices/timer.rsi
|
||||||
state: timer
|
state: timer
|
||||||
- type: Item
|
- type: Item
|
||||||
size: Small
|
size: Tiny
|
||||||
- type: StaticPrice
|
- type: StaticPrice
|
||||||
price: 40
|
price: 40
|
||||||
- type: PayloadTrigger
|
- type: PayloadTrigger
|
||||||
@@ -79,6 +79,8 @@
|
|||||||
name: voice trigger
|
name: voice trigger
|
||||||
description: Adds a machine link that is triggered by vocal keywords.
|
description: Adds a machine link that is triggered by vocal keywords.
|
||||||
components:
|
components:
|
||||||
|
- type: Item
|
||||||
|
size: Tiny
|
||||||
- type: Sprite
|
- type: Sprite
|
||||||
sprite: Objects/Devices/voice.rsi
|
sprite: Objects/Devices/voice.rsi
|
||||||
state: voice
|
state: voice
|
||||||
|
|||||||
115
Resources/Prototypes/Entities/Objects/Weapons/Bombs/cord.yml
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
# Explosive cable below
|
||||||
|
- type: entity
|
||||||
|
parent: [ CableStack, BaseSecurityContraband ]
|
||||||
|
id: CableDetStack
|
||||||
|
name: explosive cord
|
||||||
|
suffix: Full
|
||||||
|
description: Explosive cord for removing whatever is in your way.
|
||||||
|
components:
|
||||||
|
- type: Stack
|
||||||
|
stackType: CableDet
|
||||||
|
baseLayer: base
|
||||||
|
layerStates:
|
||||||
|
- coilex-10
|
||||||
|
- coilex-20
|
||||||
|
- coilex-30
|
||||||
|
- type: Sprite
|
||||||
|
state: coilex-30
|
||||||
|
layers:
|
||||||
|
- state: coilex-30
|
||||||
|
map: ["base"]
|
||||||
|
- type: Item
|
||||||
|
heldPrefix: coilex
|
||||||
|
- type: CablePlacer
|
||||||
|
cablePrototypeID: CableDet
|
||||||
|
blockingWireType: ExCable
|
||||||
|
blacklist:
|
||||||
|
tags:
|
||||||
|
- ExCable
|
||||||
|
overTile: true
|
||||||
|
- type: Appearance
|
||||||
|
- type: Extractable
|
||||||
|
grindableSolutionName: excable
|
||||||
|
- type: SolutionContainerManager
|
||||||
|
solutions:
|
||||||
|
mvcable:
|
||||||
|
reagents:
|
||||||
|
- ReagentId: Thermite
|
||||||
|
Quantity: 3
|
||||||
|
- ReagentId: Charcoal
|
||||||
|
Quantity: 2
|
||||||
|
- type: Damageable
|
||||||
|
damageContainer: StructuralInorganic
|
||||||
|
- type: Destructible # should have the same general explosive behavior as in cables.yml & detonator.yml
|
||||||
|
thresholds:
|
||||||
|
- trigger:
|
||||||
|
!type:DamageTypeTrigger
|
||||||
|
damageType: Structural # as close as we can get to only letting explosives trigger it.
|
||||||
|
damage: 120
|
||||||
|
behaviors:
|
||||||
|
- !type:DoActsBehavior
|
||||||
|
acts: ["Destruction"]
|
||||||
|
- !type:ExplodeBehavior
|
||||||
|
- trigger:
|
||||||
|
!type:DamageTrigger # the idea here is to prevent you from just beating it until it explodes.
|
||||||
|
damage: 50
|
||||||
|
behaviors:
|
||||||
|
- !type:DoActsBehavior
|
||||||
|
acts: ["Destruction"]
|
||||||
|
- type: Explosive
|
||||||
|
explosionType: DemolitionCharge
|
||||||
|
totalIntensity: 60
|
||||||
|
intensitySlope: 5
|
||||||
|
maxIntensity: 30
|
||||||
|
canCreateVacuum: false
|
||||||
|
- type: Tag
|
||||||
|
tags:
|
||||||
|
- Payload
|
||||||
|
# - type: Sticky #While cool, this doesn't actually work because the structure prevents the explosion from the cable reaching the stickied wire.
|
||||||
|
# stickDelay: 5
|
||||||
|
# unstickDelay: 5
|
||||||
|
# whitelist:
|
||||||
|
# components:
|
||||||
|
# - Airlock
|
||||||
|
# tags:
|
||||||
|
# - Window
|
||||||
|
# - Wall
|
||||||
|
# - type: StickyVisualizer
|
||||||
|
|
||||||
|
- type: entity
|
||||||
|
parent: CableDetStack
|
||||||
|
id: CableDetStack10
|
||||||
|
suffix: 10
|
||||||
|
components:
|
||||||
|
- type: Sprite
|
||||||
|
state: coilex-10
|
||||||
|
- type: Stack
|
||||||
|
count: 10
|
||||||
|
- type: Explosive # TODO: some how make stacking logic handle the explosion scaling. Maybe also something for lingering stacks.
|
||||||
|
explosionType: DemolitionCharge
|
||||||
|
totalIntensity: 30
|
||||||
|
intensitySlope: 5
|
||||||
|
maxIntensity: 15
|
||||||
|
canCreateVacuum: false
|
||||||
|
- type: Tag
|
||||||
|
tags:
|
||||||
|
- Payload
|
||||||
|
|
||||||
|
- type: entity
|
||||||
|
parent: CableDetStack
|
||||||
|
id: CableDetStack1
|
||||||
|
suffix: 1
|
||||||
|
components:
|
||||||
|
- type: Sprite
|
||||||
|
state: coilex-10
|
||||||
|
- type: Stack
|
||||||
|
count: 1
|
||||||
|
- type: Explosive
|
||||||
|
explosionType: DemolitionCharge
|
||||||
|
totalIntensity: 10
|
||||||
|
intensitySlope: 5
|
||||||
|
maxIntensity: 5
|
||||||
|
canCreateVacuum: false
|
||||||
|
- type: Tag
|
||||||
|
tags:
|
||||||
|
- Payload
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
- type: entity
|
||||||
|
parent: [ BaseItem, BaseSecurityContraband ]
|
||||||
|
id: EmptyDetonator
|
||||||
|
name: detonator cap
|
||||||
|
description: A detonator cap. Requires a trigger and wire.
|
||||||
|
components:
|
||||||
|
- type: Sprite
|
||||||
|
sprite: Objects/Weapons/Bombs/detonator.rsi
|
||||||
|
layers:
|
||||||
|
- state: empty
|
||||||
|
map: [ "enum.ConstructionVisuals.Layer" ]
|
||||||
|
- type: Item
|
||||||
|
size: Small
|
||||||
|
- type: PayloadCase
|
||||||
|
- type: Construction
|
||||||
|
graph: DetonatorGraph
|
||||||
|
node: emptyDetonator
|
||||||
|
- type: Damageable
|
||||||
|
damageContainer: StructuralInorganic
|
||||||
|
- type: Destructible
|
||||||
|
thresholds:
|
||||||
|
- trigger:
|
||||||
|
!type:DamageTypeTrigger
|
||||||
|
damageType: Structural # as close as we can get to only letting explosives trigger it.
|
||||||
|
damage: 120
|
||||||
|
behaviors:
|
||||||
|
- !type:TriggerBehavior
|
||||||
|
- !type:DoActsBehavior
|
||||||
|
acts: [ "Destruction" ]
|
||||||
|
- trigger:
|
||||||
|
!type:DamageTrigger # the idea here is to prevent you from just beating it until it explodes.
|
||||||
|
damage: 50
|
||||||
|
behaviors:
|
||||||
|
- !type:DoActsBehavior
|
||||||
|
acts: ["Destruction"]
|
||||||
|
- type: Appearance
|
||||||
|
- type: GenericVisualizer
|
||||||
|
visuals:
|
||||||
|
enum.ConstructionVisuals.Key:
|
||||||
|
enum.ConstructionVisuals.Layer:
|
||||||
|
emptyDetonator: { state: empty }
|
||||||
|
detonatorWithTrigger: { state: addtrigger }
|
||||||
|
wiredDetonator: { state: complete }
|
||||||
|
enum.Trigger.TriggerVisuals.VisualState:
|
||||||
|
enum.ConstructionVisuals.Layer:
|
||||||
|
Primed: { state: primed }
|
||||||
|
Unprimed: { state: complete }
|
||||||
|
- type: StaticPrice
|
||||||
|
price: 25
|
||||||
|
|
||||||
|
- type: entity
|
||||||
|
parent: EmptyDetonator
|
||||||
|
id: WiredDetonator
|
||||||
|
name: detonator cap
|
||||||
|
description: A detonator cap.
|
||||||
|
categories: [ HideSpawnMenu ]
|
||||||
|
components:
|
||||||
|
- type: Explosive # this is the cord, but its a little smaller because I dont want these to be grenades. They need to not really break walls themselves, but do enough to set off the cable. ~125 structural.
|
||||||
|
explosionType: DemolitionCharge
|
||||||
|
totalIntensity: 2.5
|
||||||
|
intensitySlope: 100
|
||||||
|
maxIntensity: 2.5
|
||||||
|
canCreateVacuum: false
|
||||||
|
- type: ExplodeOnTrigger
|
||||||
|
- type: Sticky
|
||||||
|
stickDelay: 2
|
||||||
|
unstickDelay: 2
|
||||||
|
stickPopupStart: comp-sticky-start-stick-bomb
|
||||||
|
stickPopupSuccess: comp-sticky-success-stick-bomb
|
||||||
|
unstickPopupStart: comp-sticky-start-unstick-bomb
|
||||||
|
unstickPopupSuccess: comp-sticky-success-unstick-bomb
|
||||||
|
whitelist:
|
||||||
|
tags:
|
||||||
|
- ExCable
|
||||||
|
blacklist: # can't stick it to other items
|
||||||
|
components:
|
||||||
|
- Item
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
- type: entity
|
- type: entity
|
||||||
abstract: true
|
abstract: true
|
||||||
id: CableBase
|
id: CablePhysBase
|
||||||
placement:
|
placement:
|
||||||
mode: SnapgridCenter
|
mode: SnapgridCenter
|
||||||
components:
|
components:
|
||||||
@@ -13,11 +13,21 @@
|
|||||||
- type: Transform
|
- type: Transform
|
||||||
anchored: true
|
anchored: true
|
||||||
noRot: true
|
noRot: true
|
||||||
# TODO: Remove both of these, same with CollideOnAnchor
|
# TODO: Remove both of these, same with CollideOnAnchor
|
||||||
- type: Physics
|
- type: Physics
|
||||||
bodyType: Static
|
bodyType: Static
|
||||||
canCollide: false
|
canCollide: false
|
||||||
- type: Fixtures
|
- type: Fixtures
|
||||||
|
- type: CollideOnAnchor
|
||||||
|
- type: Appearance
|
||||||
|
|
||||||
|
- type: entity
|
||||||
|
abstract: true
|
||||||
|
parent: CablePhysBase
|
||||||
|
id: CableBase
|
||||||
|
components:
|
||||||
|
- type: Visibility
|
||||||
|
layer: 1
|
||||||
- type: Sprite
|
- type: Sprite
|
||||||
drawdepth: ThinWire
|
drawdepth: ThinWire
|
||||||
visible: false
|
visible: false
|
||||||
@@ -33,8 +43,6 @@
|
|||||||
- !type:DoActsBehavior
|
- !type:DoActsBehavior
|
||||||
acts: ["Destruction"]
|
acts: ["Destruction"]
|
||||||
- type: SubFloorHide
|
- type: SubFloorHide
|
||||||
- type: CollideOnAnchor
|
|
||||||
- type: Appearance
|
|
||||||
- type: Electrified
|
- type: Electrified
|
||||||
onHandInteract: false
|
onHandInteract: false
|
||||||
onInteractUsing: false # wire-cutting handled separately.
|
onInteractUsing: false # wire-cutting handled separately.
|
||||||
@@ -215,3 +223,72 @@
|
|||||||
components:
|
components:
|
||||||
- type: Cable
|
- type: Cable
|
||||||
cuttingQuality: null
|
cuttingQuality: null
|
||||||
|
|
||||||
|
# Explosive cable below
|
||||||
|
- type: entity
|
||||||
|
id: CableDet
|
||||||
|
parent: [ CablePhysBase, BaseSecurityContraband ]
|
||||||
|
name: explosive cord
|
||||||
|
description: Spaghetti for people who hate walls.
|
||||||
|
components:
|
||||||
|
- type: Cable
|
||||||
|
cableDroppedOnCutPrototype: CableDetStack1
|
||||||
|
cableType: ExCable
|
||||||
|
- type: Sprite
|
||||||
|
# color: white # maybe change this later and move the stripes to the CableVisualizerComp layer instead
|
||||||
|
sprite: Structures/Power/Cables/ex_cable.rsi
|
||||||
|
state: excable_0
|
||||||
|
- type: Icon
|
||||||
|
sprite: Structures/Power/Cables/ex_cable.rsi
|
||||||
|
state: excable_4
|
||||||
|
- type: Damageable
|
||||||
|
damageContainer: StructuralInorganic
|
||||||
|
- type: Destructible
|
||||||
|
thresholds:
|
||||||
|
- trigger:
|
||||||
|
!type:DamageTypeTrigger
|
||||||
|
damageType: Structural #this is as close as we can get to only letting explosives set it off.
|
||||||
|
damage: 120
|
||||||
|
behaviors:
|
||||||
|
- !type:DoActsBehavior
|
||||||
|
acts: ["Destruction"]
|
||||||
|
- !type:ExplodeBehavior
|
||||||
|
- trigger:
|
||||||
|
!type:DamageTrigger #A fallback that deletes it but doesnt explode in case something somehow gets here without exploding violently enough.
|
||||||
|
damage: 50
|
||||||
|
behaviors:
|
||||||
|
- !type:DoActsBehavior
|
||||||
|
acts: ["Destruction"]
|
||||||
|
- trigger:
|
||||||
|
!type:DamageTrigger
|
||||||
|
damage: 35
|
||||||
|
behaviors:
|
||||||
|
- !type:SpawnEntitiesBehavior
|
||||||
|
spawn:
|
||||||
|
CableDetStack1:
|
||||||
|
min: 1
|
||||||
|
max: 1
|
||||||
|
- !type:DoActsBehavior
|
||||||
|
acts: [ "Destruction" ]
|
||||||
|
- type: CableVis
|
||||||
|
node: cordage
|
||||||
|
- type: NodeContainer
|
||||||
|
nodes:
|
||||||
|
cordage:
|
||||||
|
!type:CableNode
|
||||||
|
nodeGroupID: ExCable
|
||||||
|
- type: CableVisualizer
|
||||||
|
statePrefix: excable_
|
||||||
|
- type: Explosive
|
||||||
|
explosionType: DemolitionCharge
|
||||||
|
totalIntensity: 10
|
||||||
|
intensitySlope: 5
|
||||||
|
maxIntensity: 5
|
||||||
|
canCreateVacuum: false
|
||||||
|
- type: ExplodeOnTrigger
|
||||||
|
- type: Construction
|
||||||
|
graph: DetCable
|
||||||
|
node: detonationCable
|
||||||
|
- type: Tag
|
||||||
|
tags:
|
||||||
|
- ExCable
|
||||||
|
|||||||
@@ -0,0 +1,27 @@
|
|||||||
|
- type: constructionGraph
|
||||||
|
id: DetCable
|
||||||
|
start: start
|
||||||
|
graph:
|
||||||
|
- node: start
|
||||||
|
edges:
|
||||||
|
- to: detonationCable
|
||||||
|
completed:
|
||||||
|
- !type:SnapToGrid
|
||||||
|
southRotation: true
|
||||||
|
steps:
|
||||||
|
- material: Bananium
|
||||||
|
amount: 1
|
||||||
|
doAfter: 0
|
||||||
|
|
||||||
|
- node: detonationCable
|
||||||
|
entity: CableDet
|
||||||
|
edges:
|
||||||
|
- to: start
|
||||||
|
completed:
|
||||||
|
- !type:SpawnPrototype
|
||||||
|
prototype: CableDetStack1
|
||||||
|
amount: 1
|
||||||
|
- !type:DeleteEntity {}
|
||||||
|
steps:
|
||||||
|
- tool: Cutting
|
||||||
|
doAfter: 0.5
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
- type: constructionGraph
|
||||||
|
id: DetonatorGraph
|
||||||
|
start: start
|
||||||
|
graph:
|
||||||
|
- node: start
|
||||||
|
edges:
|
||||||
|
- to: emptyDetonator
|
||||||
|
steps:
|
||||||
|
- material: Bananium
|
||||||
|
amount: 1
|
||||||
|
doAfter: 1
|
||||||
|
|
||||||
|
- node: emptyDetonator
|
||||||
|
entity: EmptyDetonator
|
||||||
|
actions:
|
||||||
|
- !type:AppearanceChange
|
||||||
|
edges:
|
||||||
|
- to: detonatorWithTrigger
|
||||||
|
steps:
|
||||||
|
- component: PayloadTrigger
|
||||||
|
store: payloadTrigger
|
||||||
|
name: construction-graph-component-payload-trigger
|
||||||
|
doAfter: 0.5
|
||||||
|
|
||||||
|
- node: detonatorWithTrigger
|
||||||
|
entity: EmptyDetonator
|
||||||
|
actions:
|
||||||
|
- !type:AppearanceChange
|
||||||
|
- !type:PlaySound
|
||||||
|
sound: /Audio/Machines/button.ogg
|
||||||
|
edges:
|
||||||
|
- to: emptyDetonator
|
||||||
|
steps:
|
||||||
|
- tool: Prying
|
||||||
|
doAfter: 0.5
|
||||||
|
completed:
|
||||||
|
- !type:EmptyContainer
|
||||||
|
container: payloadTrigger
|
||||||
|
- to: wiredDetonator
|
||||||
|
steps:
|
||||||
|
- material: CableDet
|
||||||
|
doAfter: 0.5
|
||||||
|
|
||||||
|
- node: wiredDetonator
|
||||||
|
entity: WiredDetonator
|
||||||
|
actions:
|
||||||
|
- !type:AppearanceChange
|
||||||
|
- !type:PlaySound
|
||||||
|
sound: /Audio/Machines/button.ogg
|
||||||
|
- !type:AdminLog
|
||||||
|
message: "A detonator cap was crafted"
|
||||||
|
edges:
|
||||||
|
- to: detonatorWithTrigger
|
||||||
|
steps:
|
||||||
|
- tool: Cutting
|
||||||
|
doAfter: 0.5
|
||||||
|
completed:
|
||||||
|
- !type:SpawnPrototype
|
||||||
|
prototype: CableDetStack1
|
||||||
@@ -90,6 +90,8 @@
|
|||||||
- ScienceExplosives # sec gets everything for modular grenade making that sci does
|
- ScienceExplosives # sec gets everything for modular grenade making that sci does
|
||||||
id: SecurityExplosives
|
id: SecurityExplosives
|
||||||
recipes:
|
recipes:
|
||||||
|
- CableDetStack1
|
||||||
|
- EmptyDetonator
|
||||||
- ExplosivePayload
|
- ExplosivePayload
|
||||||
- GrenadeBlast
|
- GrenadeBlast
|
||||||
- GrenadeEMP
|
- GrenadeEMP
|
||||||
|
|||||||
@@ -216,3 +216,23 @@
|
|||||||
Steel: 500
|
Steel: 500
|
||||||
Glass: 400
|
Glass: 400
|
||||||
Gold: 100
|
Gold: 100
|
||||||
|
|
||||||
|
- type: latheRecipe
|
||||||
|
id: CableDetStack1
|
||||||
|
result: CableDetStack1
|
||||||
|
categories:
|
||||||
|
- Weapons
|
||||||
|
completetime: 2
|
||||||
|
materials:
|
||||||
|
Plastic: 50
|
||||||
|
Plasma: 25
|
||||||
|
Gold: 20
|
||||||
|
|
||||||
|
- type: latheRecipe
|
||||||
|
id: EmptyDetonator
|
||||||
|
result: EmptyDetonator
|
||||||
|
categories:
|
||||||
|
- Weapons
|
||||||
|
completetime: 3
|
||||||
|
materials:
|
||||||
|
Steel: 100
|
||||||
|
|||||||
@@ -116,6 +116,8 @@
|
|||||||
- FlashPayload
|
- FlashPayload
|
||||||
- ExplosivePayload
|
- ExplosivePayload
|
||||||
- ChemicalPayload
|
- ChemicalPayload
|
||||||
|
- CableDetStack1
|
||||||
|
- EmptyDetonator
|
||||||
|
|
||||||
- type: technology
|
- type: technology
|
||||||
id: SpecialMeans
|
id: SpecialMeans
|
||||||
|
|||||||
@@ -18,3 +18,13 @@
|
|||||||
icon: { sprite: "/Textures/Objects/Tools/cable-coils.rsi", state: coilhv-30 }
|
icon: { sprite: "/Textures/Objects/Tools/cable-coils.rsi", state: coilhv-30 }
|
||||||
spawn: CableHVStack1
|
spawn: CableHVStack1
|
||||||
maxCount: 30
|
maxCount: 30
|
||||||
|
|
||||||
|
# Explosive cable below
|
||||||
|
|
||||||
|
- type: stack
|
||||||
|
id: CableDet
|
||||||
|
name: stack-explosive-cord
|
||||||
|
icon: { sprite: "/Textures/Objects/Tools/cable-coils.rsi", state: coilex-30 }
|
||||||
|
spawn: CableDetStack1
|
||||||
|
maxCount: 30
|
||||||
|
|
||||||
|
|||||||
@@ -551,6 +551,9 @@
|
|||||||
- type: Tag
|
- type: Tag
|
||||||
id: Enzyme
|
id: Enzyme
|
||||||
|
|
||||||
|
- type: Tag
|
||||||
|
id: ExCable
|
||||||
|
|
||||||
- type: Tag
|
- type: Tag
|
||||||
id: ExplosivePassable
|
id: ExplosivePassable
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"version": 1,
|
"version": 1,
|
||||||
"license": "CC-BY-SA-3.0",
|
"license": "CC-BY-SA-3.0",
|
||||||
"copyright": "Taken from vgstation at commit https://github.com/vgstation-coders/vgstation13/commit/ca674eff9d23e04357b7609ef7e07eadfc1a993f and modified by Flareguy (github), encryptokey was taken from Baystation12 at https://github.com/infinitystation/Baystation12/blob/073f678cdce92edb8fcd55f9ffc9f0523bf31506/icons/obj/radio.dmi and modified by lapatison. boxwidetoy, shelltoy, swab, flare, inflatable, trashbag, magazine, holo and forensic created by potato1234x (github) for ss14 based on toys.rsi, mouth_swab.rsi, flare.rsi, inflatable_wall.rsi, trashbag.rsi, caseless_pistol_mag.rsi, guardians.rsi and bureaucracy.rsi respectively, candle and darts created by TheShuEd for ss14, throwing_knives and vials was drawn by Ubaser, evidence_markers by moomoobeef, nitrogentank modified from extendedtank by Errant, agrichemkit by Cerol, modified by ps3moira (github). sechud renamed to secglasses, new sechud, sunglasses by K-Dynamic (github). utensils by gentleman-bird (github)",
|
"copyright": "Taken from vgstation at commit https://github.com/vgstation-coders/vgstation13/commit/ca674eff9d23e04357b7609ef7e07eadfc1a993f and modified by Flareguy (github), encryptokey was taken from Baystation12 at https://github.com/infinitystation/Baystation12/blob/073f678cdce92edb8fcd55f9ffc9f0523bf31506/icons/obj/radio.dmi and modified by lapatison. boxwidetoy, shelltoy, swab, flare, inflatable, trashbag, magazine, holo and forensic created by potato1234x (github) for ss14 based on toys.rsi, mouth_swab.rsi, flare.rsi, inflatable_wall.rsi, trashbag.rsi, caseless_pistol_mag.rsi, guardians.rsi and bureaucracy.rsi respectively, candle and darts created by TheShuEd for ss14, throwing_knives and vials was drawn by Ubaser, evidence_markers by moomoobeef, nitrogentank modified from extendedtank by Errant, agrichemkit by Cerol, modified by ps3moira (github). sechud renamed to secglasses, new sechud, sunglasses by K-Dynamic (github), trigger by IProduceWidgets, utensils by gentleman-bird (github).",
|
||||||
"size": {
|
"size": {
|
||||||
"x": 32,
|
"x": 32,
|
||||||
"y": 32
|
"y": 32
|
||||||
@@ -197,6 +197,9 @@
|
|||||||
{
|
{
|
||||||
"name": "vials"
|
"name": "vials"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "trigger"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "envelope"
|
"name": "envelope"
|
||||||
},
|
},
|
||||||
|
|||||||
BIN
Resources/Textures/Objects/Storage/boxes.rsi/trigger.png
Normal file
|
After Width: | Height: | Size: 212 B |
BIN
Resources/Textures/Objects/Tools/cable-coils.rsi/coilex-10.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
Resources/Textures/Objects/Tools/cable-coils.rsi/coilex-20.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
Resources/Textures/Objects/Tools/cable-coils.rsi/coilex-30.png
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
@@ -31,6 +31,14 @@
|
|||||||
"name": "coillv-inhand-right",
|
"name": "coillv-inhand-right",
|
||||||
"directions": 4
|
"directions": 4
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "coilex-inhand-left",
|
||||||
|
"directions": 4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "coilex-inhand-right",
|
||||||
|
"directions": 4
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "coil-30"
|
"name": "coil-30"
|
||||||
},
|
},
|
||||||
@@ -70,6 +78,15 @@
|
|||||||
{
|
{
|
||||||
"name": "coilall-30"
|
"name": "coilall-30"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "coilex-30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "coilex-20"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "coilex-10"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "coil-equipped-BELT",
|
"name": "coil-equipped-BELT",
|
||||||
"directions": 4
|
"directions": 4
|
||||||
@@ -85,6 +102,10 @@
|
|||||||
{
|
{
|
||||||
"name": "coilhv-equipped-BELT",
|
"name": "coilhv-equipped-BELT",
|
||||||
"directions": 4
|
"directions": 4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "coilex-equipped-BELT",
|
||||||
|
"directions": 4
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
|
After Width: | Height: | Size: 242 B |
|
After Width: | Height: | Size: 2.3 KiB |
BIN
Resources/Textures/Objects/Weapons/Bombs/detonator.rsi/empty.png
Normal file
|
After Width: | Height: | Size: 236 B |
@@ -0,0 +1,34 @@
|
|||||||
|
{
|
||||||
|
"version": 1,
|
||||||
|
"license": "CC-BY-SA-3.0",
|
||||||
|
"copyright": "Taken from austation at commit https://github.com/austation/austation/commit/71d8e7406d84f8ec8cb79bf153b050e7e09d2a17 and modified by IProduceWidgets",
|
||||||
|
"size": {
|
||||||
|
"x": 32,
|
||||||
|
"y": 32
|
||||||
|
},
|
||||||
|
"states": [
|
||||||
|
{
|
||||||
|
"name": "empty",
|
||||||
|
"directions": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "wired",
|
||||||
|
"directions": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "addtrigger",
|
||||||
|
"directions": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "complete",
|
||||||
|
"directions": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "primed",
|
||||||
|
"directions": 1,
|
||||||
|
"delays": [
|
||||||
|
[ 0.2, 0.2 ]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 3.4 KiB |
BIN
Resources/Textures/Objects/Weapons/Bombs/detonator.rsi/wired.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 158 B |
|
After Width: | Height: | Size: 201 B |
|
After Width: | Height: | Size: 294 B |
|
After Width: | Height: | Size: 401 B |
|
After Width: | Height: | Size: 144 B |
|
After Width: | Height: | Size: 348 B |
|
After Width: | Height: | Size: 361 B |
|
After Width: | Height: | Size: 486 B |
|
After Width: | Height: | Size: 201 B |
|
After Width: | Height: | Size: 164 B |
|
After Width: | Height: | Size: 183 B |
|
After Width: | Height: | Size: 280 B |
|
After Width: | Height: | Size: 262 B |
|
After Width: | Height: | Size: 375 B |
|
After Width: | Height: | Size: 179 B |
|
After Width: | Height: | Size: 281 B |
@@ -0,0 +1,75 @@
|
|||||||
|
{
|
||||||
|
"version": 1,
|
||||||
|
"size": {
|
||||||
|
"x": 32,
|
||||||
|
"y": 32
|
||||||
|
},
|
||||||
|
"license": "CC-BY-SA-3.0",
|
||||||
|
"copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/fcf375d7d9ce6ceed5c7face899725e5655ab640, striping added by IProduceWidgets",
|
||||||
|
"states": [
|
||||||
|
{
|
||||||
|
"name": "excable_0"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "excable_1"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "excable_2"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "excable_3"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "excable_4"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "excable_5"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "excable_6"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "excable_7"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "excable_8"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "excable_9"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "excable_10"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "excable_11"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "excable_12"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "excable_13"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "excable_14"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "excable_15"
|
||||||
|
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||