make jaws of life not awful (#10770)

This commit is contained in:
Rane
2022-08-31 23:22:25 -04:00
committed by GitHub
parent f6ef097eb2
commit 822c8f3c70
6 changed files with 36 additions and 2 deletions

View File

@@ -36,6 +36,14 @@ namespace Content.Server.Doors.Components
[DataField("powerWiresTimeout")] [DataField("powerWiresTimeout")]
public float PowerWiresTimeout = 5.0f; public float PowerWiresTimeout = 5.0f;
/// <summary>
/// Pry modifier for a powered airlock.
/// Most anything that can pry powered has a pry speed bonus,
/// so this default is closer to 6 effectively on e.g. jaws (9 seconds when applied to other default.)
/// </summary>
[DataField("poweredPryModifier")]
public readonly float PoweredPryModifier = 9f;
/// <summary> /// <summary>
/// Whether the maintenance panel should be visible even if the airlock is opened. /// Whether the maintenance panel should be visible even if the airlock is opened.
/// </summary> /// </summary>

View File

@@ -1,5 +1,7 @@
using Content.Server.Doors.Components; using Content.Server.Doors.Components;
using Content.Server.Power.Components; using Content.Server.Power.Components;
using Content.Server.Power.EntitySystems;
using Content.Shared.Tools.Components;
using Content.Server.Wires; using Content.Server.Wires;
using Content.Shared.Doors; using Content.Shared.Doors;
using Content.Shared.Doors.Components; using Content.Shared.Doors.Components;
@@ -13,6 +15,7 @@ namespace Content.Server.Doors.Systems
public sealed class AirlockSystem : SharedAirlockSystem public sealed class AirlockSystem : SharedAirlockSystem
{ {
[Dependency] private readonly WiresSystem _wiresSystem = default!; [Dependency] private readonly WiresSystem _wiresSystem = default!;
[Dependency] private readonly PowerReceiverSystem _power = default!;
public override void Initialize() public override void Initialize()
{ {
@@ -23,6 +26,7 @@ namespace Content.Server.Doors.Systems
SubscribeLocalEvent<AirlockComponent, BeforeDoorOpenedEvent>(OnBeforeDoorOpened); SubscribeLocalEvent<AirlockComponent, BeforeDoorOpenedEvent>(OnBeforeDoorOpened);
SubscribeLocalEvent<AirlockComponent, BeforeDoorDeniedEvent>(OnBeforeDoorDenied); SubscribeLocalEvent<AirlockComponent, BeforeDoorDeniedEvent>(OnBeforeDoorDenied);
SubscribeLocalEvent<AirlockComponent, ActivateInWorldEvent>(OnActivate, before: new [] {typeof(DoorSystem)}); SubscribeLocalEvent<AirlockComponent, ActivateInWorldEvent>(OnActivate, before: new [] {typeof(DoorSystem)});
SubscribeLocalEvent<AirlockComponent, DoorGetPryTimeModifierEvent>(OnGetPryMod);
SubscribeLocalEvent<AirlockComponent, BeforeDoorPryEvent>(OnDoorPry); SubscribeLocalEvent<AirlockComponent, BeforeDoorPryEvent>(OnDoorPry);
} }
@@ -132,6 +136,12 @@ namespace Content.Server.Doors.Systems
} }
} }
private void OnGetPryMod(EntityUid uid, AirlockComponent component, DoorGetPryTimeModifierEvent args)
{
if (_power.IsPowered(uid))
args.PryTimeModifier *= component.PoweredPryModifier;
}
private void OnDoorPry(EntityUid uid, AirlockComponent component, BeforeDoorPryEvent args) private void OnDoorPry(EntityUid uid, AirlockComponent component, BeforeDoorPryEvent args)
{ {
if (component.IsBolted()) if (component.IsBolted())
@@ -141,6 +151,8 @@ namespace Content.Server.Doors.Systems
} }
if (component.IsPowered()) if (component.IsPowered())
{ {
if (HasComp<ToolForcePoweredComponent>(args.Tool))
return;
component.Owner.PopupMessage(args.User, Loc.GetString("airlock-component-cannot-pry-is-powered-message")); component.Owner.PopupMessage(args.User, Loc.GetString("airlock-component-cannot-pry-is-powered-message"));
args.Cancel(); args.Cancel();
} }

View File

@@ -174,6 +174,7 @@ public sealed class DoorSystem : SharedDoorSystem
}); });
} }
/// <summary> /// <summary>
/// Pry open a door. This does not check if the user is holding the required tool. /// Pry open a door. This does not check if the user is holding the required tool.
/// </summary> /// </summary>
@@ -187,7 +188,7 @@ public sealed class DoorSystem : SharedDoorSystem
if (!force) if (!force)
{ {
var canEv = new BeforeDoorPryEvent(user); var canEv = new BeforeDoorPryEvent(user, tool);
RaiseLocalEvent(target, canEv, false); RaiseLocalEvent(target, canEv, false);
if (canEv.Cancelled) if (canEv.Cancelled)

View File

@@ -78,10 +78,12 @@ namespace Content.Shared.Doors
public sealed class BeforeDoorPryEvent : CancellableEntityEventArgs public sealed class BeforeDoorPryEvent : CancellableEntityEventArgs
{ {
public readonly EntityUid User; public readonly EntityUid User;
public readonly EntityUid Tool;
public BeforeDoorPryEvent(EntityUid user) public BeforeDoorPryEvent(EntityUid user, EntityUid tool)
{ {
User = user; User = user;
Tool = tool;
} }
} }
} }

View File

@@ -0,0 +1,10 @@
namespace Content.Shared.Tools.Components
{
/// <summary>
/// Tag component to let a tool ignore restrictions on whether devices are powered
/// or not to work.
/// </summary>
[RegisterComponent]
public sealed class ToolForcePoweredComponent : Component
{}
}

View File

@@ -24,6 +24,7 @@
qualities: qualities:
- Prying - Prying
speed: 1.5 speed: 1.5
- type: ToolForcePowered
- type: MultipleTool - type: MultipleTool
statusShowBehavior: true statusShowBehavior: true
entries: entries: