add igniter (#20962)

Co-authored-by: deltanedas <@deltanedas:kde.org>
This commit is contained in:
deltanedas
2023-10-14 08:11:50 +01:00
committed by GitHub
parent 4fb8fa3f22
commit 33e5dfb9a8
12 changed files with 150 additions and 4 deletions

View File

@@ -0,0 +1,30 @@
using Robust.Shared.Audio;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
namespace Content.Server.IgnitionSource;
/// <summary>
/// Ignites for a certain length of time when triggered.
/// Requires <see cref="IgnitionSourceComponent"/> along with triggering components.
/// </summary>
[RegisterComponent, Access(typeof(IgniteOnTriggerSystem))]
public sealed partial class IgniteOnTriggerComponent : Component
{
/// <summary>
/// Once ignited, the time it will unignite at.
/// </summary>
[DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), ViewVariables(VVAccess.ReadWrite)]
public TimeSpan IgnitedUntil = TimeSpan.Zero;
/// <summary>
/// How long the ignition source is active for after triggering.
/// </summary>
[DataField, ViewVariables(VVAccess.ReadWrite)]
public TimeSpan IgnitedTime = TimeSpan.FromSeconds(0.5);
/// <summary>
/// Sound to play when igniting.
/// </summary>
[DataField]
public SoundSpecifier IgniteSound = new SoundCollectionSpecifier("WelderOn");
}

View File

@@ -0,0 +1,55 @@
using Content.Server.Explosion.EntitySystems;
using Content.Shared.Timing;
using Robust.Shared.Audio;
using Robust.Shared.Timing;
namespace Content.Server.IgnitionSource;
/// <summary>
/// Handles igniting when triggered and stopping ignition after the delay.
/// </summary>
public sealed class IgniteOnTriggerSystem : EntitySystem
{
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly IgnitionSourceSystem _source = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly UseDelaySystem _useDelay = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<IgniteOnTriggerComponent, TriggerEvent>(OnTrigger);
}
public override void Update(float deltaTime)
{
base.Update(deltaTime);
var query = EntityQueryEnumerator<IgniteOnTriggerComponent, IgnitionSourceComponent>();
while (query.MoveNext(out var uid, out var comp, out var source))
{
if (!source.Ignited)
continue;
if (_timing.CurTime < comp.IgnitedUntil)
continue;
_source.SetIgnited(uid, false, source);
}
}
private void OnTrigger(EntityUid uid, IgniteOnTriggerComponent comp, TriggerEvent args)
{
// prevent spamming sound and ignition
TryComp<UseDelayComponent>(uid, out var delay);
if (_useDelay.ActiveDelay(uid, delay))
return;
_source.SetIgnited(uid);
_audio.PlayPvs(comp.IgniteSound, uid);
_useDelay.BeginDelay(uid, delay);
comp.IgnitedUntil = _timing.CurTime + comp.IgnitedTime;
}
}

View File

@@ -23,12 +23,18 @@ public sealed class IgnitionSourceSystem : EntitySystem
private void OnIsHot(EntityUid uid, IgnitionSourceComponent component, IsHotEvent args) private void OnIsHot(EntityUid uid, IgnitionSourceComponent component, IsHotEvent args)
{ {
SetIgnited(uid,component,args.IsHot); SetIgnited(uid, args.IsHot, component);
} }
private void SetIgnited(EntityUid uid, IgnitionSourceComponent component, bool newState) /// <summary>
/// Simply sets the ignited field to the ignited param.
/// </summary>
public void SetIgnited(EntityUid uid, bool ignited = true, IgnitionSourceComponent? comp = null)
{ {
component.Ignited = newState; if (!Resolve(uid, ref comp))
return;
comp.Ignited = ignited;
} }
public override void Update(float frameTime) public override void Update(float frameTime)

View File

@@ -5,6 +5,7 @@
Flash: 4 Flash: 4
ProximitySensor: 3 ProximitySensor: 3
RemoteSignaller: 3 RemoteSignaller: 3
Igniter: 3 # its more ordnance but yeah
HandheldHealthAnalyzer: 3 HandheldHealthAnalyzer: 3
Scalpel: 2 Scalpel: 2
SawElectric: 2 SawElectric: 2

View File

@@ -2,10 +2,11 @@
id: VendomatInventory id: VendomatInventory
startingInventory: startingInventory:
RemoteSignaller: 1 RemoteSignaller: 1
Igniter: 2
Wirecutter: 1 Wirecutter: 1
CableApcStack: 2 CableApcStack: 2
FlashlightLantern: 2 FlashlightLantern: 2
PowerCellSmallPrinted: 3 PowerCellSmallPrinted: 3
MatterBinStockPart: 4 MatterBinStockPart: 4
CapacitorStockPart: 4 CapacitorStockPart: 4
MicroManipulatorStockPart: 4 MicroManipulatorStockPart: 4

View File

@@ -0,0 +1,25 @@
- type: entity
parent: BaseItem
id: Igniter
name: igniter
description: Creates a spark when activated by a signal.
components:
- type: Sprite
sprite: Objects/Devices/igniter.rsi
state: icon
- type: IgnitionSource
temperature: 800
- type: IgniteOnTrigger
- type: TriggerOnSignal
- type: DeviceNetwork
deviceNetId: Wireless
receiveFrequencyId: BasicDevice
- type: WirelessNetworkConnection
range: 200
- type: DeviceLinkSink
ports:
- Trigger
- type: UseDelay # prevent sound spam
- type: Tag
tags:
- Igniter

View File

@@ -243,6 +243,7 @@
- Signaller - Signaller
- SignalTrigger - SignalTrigger
- VoiceTrigger - VoiceTrigger
- Igniter
- PowerCellMedium - PowerCellMedium
- PowerCellHigh - PowerCellHigh
- WeaponPistolCHIMP - WeaponPistolCHIMP

View File

@@ -22,6 +22,15 @@
Steel: 300 Steel: 300
Plastic: 200 Plastic: 200
- type: latheRecipe
id: Igniter
result: Igniter
completetime: 2
materials:
Steel: 300
Plastic: 100
Glass: 100
- type: latheRecipe - type: latheRecipe
id: ChemicalPayload id: ChemicalPayload
result: ChemicalPayload result: ChemicalPayload

View File

@@ -51,6 +51,7 @@
- TimerTrigger - TimerTrigger
- FlashPayload - FlashPayload
- ExplosivePayload - ExplosivePayload
- Igniter
- type: technology - type: technology
id: WeaponizedLaserManipulation id: WeaponizedLaserManipulation

View File

@@ -599,6 +599,9 @@
- type: Tag - type: Tag
id: Hotsauce id: Hotsauce
- type: Tag
id: Igniter
- type: Tag #Drop this innate tool instead of deleting it. - type: Tag #Drop this innate tool instead of deleting it.
id: InnateDontDelete id: InnateDontDelete

Binary file not shown.

After

Width:  |  Height:  |  Size: 389 B

View File

@@ -0,0 +1,14 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/blob/9a401d19045574f3ea7f2cf3feebf65989903ccc/icons/obj/assemblies/new_assemblies.dmi",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "icon"
}
]
}