/// <inheritdoc/>
public override void Initialize()
{
+ base.Initialize();
+
SubscribeLocalEvent<EmitterComponent, AppearanceChangeEvent>(OnAppearanceChange);
}
using Content.Server.Weapons.Ranged.Systems;
using Content.Shared.Database;
using Content.Shared.DeviceLinking.Events;
-using Content.Shared.Examine;
using Content.Shared.Interaction;
using Content.Shared.Lock;
using Content.Shared.Popups;
using Content.Shared.Projectiles;
using Content.Shared.Singularity.Components;
using Content.Shared.Singularity.EntitySystems;
-using Content.Shared.Verbs;
using Content.Shared.Weapons.Ranged.Components;
-using JetBrains.Annotations;
using Robust.Shared.Map;
using Robust.Shared.Physics;
using Robust.Shared.Physics.Components;
namespace Content.Server.Singularity.EntitySystems
{
- [UsedImplicitly]
public sealed class EmitterSystem : SharedEmitterSystem
{
[Dependency] private readonly IRobustRandom _random = default!;
SubscribeLocalEvent<EmitterComponent, PowerConsumerReceivedChanged>(ReceivedChanged);
SubscribeLocalEvent<EmitterComponent, PowerChangedEvent>(OnApcChanged);
SubscribeLocalEvent<EmitterComponent, ActivateInWorldEvent>(OnActivate);
- SubscribeLocalEvent<EmitterComponent, GetVerbsEvent<Verb>>(OnGetVerb);
- SubscribeLocalEvent<EmitterComponent, ExaminedEvent>(OnExamined);
SubscribeLocalEvent<EmitterComponent, AnchorStateChangedEvent>(OnAnchorStateChanged);
SubscribeLocalEvent<EmitterComponent, SignalReceivedEvent>(OnSignalReceived);
}
}
}
- private void OnGetVerb(EntityUid uid, EmitterComponent component, GetVerbsEvent<Verb> args)
- {
- if (!args.CanAccess || !args.CanInteract || !args.CanComplexInteract || args.Hands == null)
- return;
-
- if (TryComp<LockComponent>(uid, out var lockComp) && lockComp.Locked)
- return;
-
- if (component.SelectableTypes.Count < 2)
- return;
-
- foreach (var type in component.SelectableTypes)
- {
- var proto = _prototype.Index<EntityPrototype>(type);
-
- var v = new Verb
- {
- Priority = 1,
- Category = VerbCategory.SelectType,
- Text = proto.Name,
- Disabled = type == component.BoltType,
- Impact = LogImpact.Medium,
- DoContactInteraction = true,
- Act = () =>
- {
- component.BoltType = type;
- _popup.PopupEntity(Loc.GetString("emitter-component-type-set", ("type", proto.Name)), uid);
- }
- };
- args.Verbs.Add(v);
- }
- }
-
- private void OnExamined(EntityUid uid, EmitterComponent component, ExaminedEvent args)
- {
- if (component.SelectableTypes.Count < 2)
- return;
- var proto = _prototype.Index<EntityPrototype>(component.BoltType);
- args.PushMarkup(Loc.GetString("emitter-component-current-type", ("type", proto.Name)));
- }
-
private void ReceivedChanged(
EntityUid uid,
EmitterComponent component,
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization;
-using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
-using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Dictionary;
namespace Content.Shared.Singularity.Components;
-[RegisterComponent, NetworkedComponent]
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
public sealed partial class EmitterComponent : Component
{
public CancellationTokenSource? TimerCancel;
/// <summary>
/// The entity that is spawned when the emitter fires.
/// </summary>
- [DataField("boltType", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
- public string BoltType = "EmitterBolt";
+ [DataField, AutoNetworkedField]
+ public EntProtoId BoltType = "EmitterBolt";
[DataField]
public List<EntProtoId> SelectableTypes = new();
/// <summary>
/// The current amount of power being used.
/// </summary>
- [DataField("powerUseActive")]
+ [DataField]
public int PowerUseActive = 600;
/// <summary>
/// The amount of shots that are fired in a single "burst"
/// </summary>
- [DataField("fireBurstSize")]
+ [DataField]
public int FireBurstSize = 3;
/// <summary>
/// The time between each shot during a burst.
/// </summary>
- [DataField("fireInterval")]
+ [DataField]
public TimeSpan FireInterval = TimeSpan.FromSeconds(2);
/// <summary>
/// The current minimum delay between bursts.
/// </summary>
- [DataField("fireBurstDelayMin")]
+ [DataField]
public TimeSpan FireBurstDelayMin = TimeSpan.FromSeconds(4);
/// <summary>
/// The current maximum delay between bursts.
/// </summary>
- [DataField("fireBurstDelayMax")]
+ [DataField]
public TimeSpan FireBurstDelayMax = TimeSpan.FromSeconds(10);
/// <summary>
/// The visual state that is set when the emitter is turned on
/// </summary>
- [DataField("onState")]
+ [DataField]
public string? OnState = "beam";
/// <summary>
/// The visual state that is set when the emitter doesn't have enough power.
/// </summary>
- [DataField("underpoweredState")]
+ [DataField]
public string? UnderpoweredState = "underpowered";
/// <summary>
/// Signal port that turns on the emitter.
/// </summary>
- [DataField("onPort", customTypeSerializer: typeof(PrototypeIdSerializer<SinkPortPrototype>))]
- public string OnPort = "On";
+ [DataField]
+ public ProtoId<SinkPortPrototype> OnPort = "On";
/// <summary>
/// Signal port that turns off the emitter.
/// </summary>
- [DataField("offPort", customTypeSerializer: typeof(PrototypeIdSerializer<SinkPortPrototype>))]
- public string OffPort = "Off";
+ [DataField]
+ public ProtoId<SinkPortPrototype> OffPort = "Off";
/// <summary>
/// Signal port that toggles the emitter on or off.
/// </summary>
- [DataField("togglePort", customTypeSerializer: typeof(PrototypeIdSerializer<SinkPortPrototype>))]
- public string TogglePort = "Toggle";
+ [DataField]
+ public ProtoId<SinkPortPrototype> TogglePort = "Toggle";
/// <summary>
/// Map of signal ports to entity prototype IDs of the entity that will be fired.
/// </summary>
- [DataField("setTypePorts", customTypeSerializer: typeof(PrototypeIdDictionarySerializer<string, SinkPortPrototype>))]
- public Dictionary<string, string> SetTypePorts = new();
+ [DataField]
+ public Dictionary<ProtoId<SinkPortPrototype>, EntProtoId> SetTypePorts = new();
}
[NetSerializable, Serializable]
-namespace Content.Shared.Singularity.EntitySystems;
+using Content.Shared.Database;
+using Content.Shared.Examine;
+using Content.Shared.Lock;
+using Content.Shared.Popups;
+using Content.Shared.Singularity.Components;
+using Content.Shared.Verbs;
+using Robust.Shared.Prototypes;
+
+namespace Content.Shared.Singularity.EntitySystems;
public abstract class SharedEmitterSystem : EntitySystem
{
+ [Dependency] private readonly IPrototypeManager _prototype = default!;
+ [Dependency] private readonly SharedPopupSystem _popup = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent<EmitterComponent, ExaminedEvent>(OnExamined);
+ SubscribeLocalEvent<EmitterComponent, GetVerbsEvent<Verb>>(OnGetVerb);
+ }
+
+ private void OnGetVerb(Entity<EmitterComponent> ent, ref GetVerbsEvent<Verb> args)
+ {
+ if (!args.CanAccess || !args.CanInteract || !args.CanComplexInteract || args.Hands == null)
+ return;
+
+ if (TryComp<LockComponent>(ent.Owner, out var lockComp) && lockComp.Locked)
+ return;
+
+ if (ent.Comp.SelectableTypes.Count < 2)
+ return;
+
+ foreach (var type in ent.Comp.SelectableTypes)
+ {
+ var proto = _prototype.Index(type);
+
+ var v = new Verb
+ {
+ Priority = 1,
+ Category = VerbCategory.SelectType,
+ Text = proto.Name,
+ Disabled = type == ent.Comp.BoltType,
+ Impact = LogImpact.Medium,
+ DoContactInteraction = true,
+ Act = () =>
+ {
+ ent.Comp.BoltType = type;
+ Dirty(ent);
+ _popup.PopupClient(Loc.GetString("emitter-component-type-set", ("type", proto.Name)), ent.Owner);
+ },
+ };
+ args.Verbs.Add(v);
+ }
+ }
+
+ private void OnExamined(Entity<EmitterComponent> ent, ref ExaminedEvent args)
+ {
+ if (ent.Comp.SelectableTypes.Count < 2)
+ return;
+ var proto = _prototype.Index(ent.Comp.BoltType);
+ args.PushMarkup(Loc.GetString("emitter-component-current-type", ("type", proto.Name)));
+ }
}