Очередные фиксы (#3569)

This commit is contained in:
iertis 2026-01-03 21:39:41 +05:00 committed by GitHub
parent c266528620
commit 401f7970eb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
28 changed files with 89 additions and 160 deletions

View file

@ -40,6 +40,7 @@ using Robust.Shared.Prototypes;
using Robust.Shared.Random;
using Robust.Shared.Replays;
using Robust.Shared.Utility;
using Content.Shared._Sunrise.TTS;
namespace Content.Server.Chat.Systems;
@ -346,7 +347,7 @@ public sealed partial class ChatSystem : SharedChatSystem
bool playDefault = true,
SoundSpecifier? announcementSound = null,
bool playTts = true, // Sunrise-edit,
string? announceVoice = null, // Sunrise-edit
ProtoId<TTSVoicePrototype>? announceVoice = null, // Sunrise-edit
Color? colorOverride = null
)
{
@ -386,7 +387,7 @@ public sealed partial class ChatSystem : SharedChatSystem
string? sender = null,
bool playDefault = true, // Sunrise-edit
bool playTts = true, // Sunrise-edit
string? announceVoice = null, // Sunrise-edit
ProtoId<TTSVoicePrototype>? announceVoice = null, // Sunrise-edit
SoundSpecifier? announcementSound = null,
Color? colorOverride = null)
{
@ -432,7 +433,7 @@ public sealed partial class ChatSystem : SharedChatSystem
string? sender = null,
bool playDefault = true, // Sunrise
bool playTts = true, // Sunrise
string? announceVoice = null, // Sunrise
ProtoId<TTSVoicePrototype>? announceVoice = null, // Sunrise
bool playDefaultSound = true,
SoundSpecifier? announcementSound = null,
Color? colorOverride = null)

View file

@ -1,7 +1,10 @@
using Content.Server.Database.Migrations.Postgres;
using Content.Server.UserInterface;
using Content.Shared._Sunrise.TTS;
using Content.Shared.Communications;
using JetBrains.Annotations;
using Robust.Shared.Audio;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
namespace Content.Server.Communications
@ -78,8 +81,8 @@ namespace Content.Server.Communications
public bool AnnounceSentBy = false;
// Sunrise-Start
[DataField("announceVoice", customTypeSerializer:typeof(PrototypeIdSerializer<TTSVoicePrototype>))]
public string AnnounceVoice = "Hanson";
[DataField]
public ProtoId<TTSVoicePrototype>? AnnounceVoice = "Hanson";
[ViewVariables]
public bool IsRelaying;

View file

@ -217,7 +217,7 @@ public sealed partial class EnergyDomeSystem : EntitySystem
{
_battery.UseCharge(cell.Value.Owner, energyLeak);
if (cell.Value.Comp.ChargeRate == 0)
if (cell.Value.Comp.LastCharge == 0)
TurnOff((generatorUid, generatorComp), true);
}
}
@ -226,7 +226,7 @@ public sealed partial class EnergyDomeSystem : EntitySystem
if (TryComp<BatteryComponent>(generatorUid, out var battery)) {
_battery.UseCharge(generatorUid, energyLeak);
if (battery.ChargeRate == 0)
if (battery.LastCharge == 0)
TurnOff((generatorUid, generatorComp), true);
}
}
@ -251,58 +251,53 @@ public sealed partial class EnergyDomeSystem : EntitySystem
public bool AttemptToggle(Entity<EnergyDomeGeneratorComponent> generator, bool status)
{
var parent = Transform(generator.Owner).ParentUid;
if (HasComp<ContainerManagerComponent>(Transform(parent).ParentUid))
return false;
if (TryComp<UseDelayComponent>(generator, out var useDelay) &&
_useDelay.IsDelayed((generator, useDelay)))
{
Fail(generator, "energy-dome-recharging");
return false;
}
if (TryComp<UseDelayComponent>(generator, out var useDelay) && _useDelay.IsDelayed(new (generator, useDelay)))
if (TryComp<PowerCellSlotComponent>(generator, out _))
{
_audio.PlayPvs(generator.Comp.TurnOffSound, generator);
_popup.PopupEntity(
Loc.GetString("energy-dome-recharging"),
generator);
return false;
}
if (TryComp<PowerCellComponent>(generator, out var powerCellSlot))
{
if (!_powerCell.TryGetBatteryFromSlot(generator.Owner, out var cell) &&
!HasComp<BatteryComponent>(generator.Owner))
if (!_powerCell.TryGetBatteryFromSlot(generator.Owner, out _))
{
_audio.PlayPvs(generator.Comp.TurnOffSound, generator);
_popup.PopupEntity(
Loc.GetString("energy-dome-no-cell"),
generator);
Fail(generator, "energy-dome-no-cell");
return false;
}
if (!_powerCell.HasDrawCharge(generator.Owner))
{
_audio.PlayPvs(generator.Comp.TurnOffSound, generator);
_popup.PopupEntity(
Loc.GetString("energy-dome-no-power"),
generator);
Fail(generator, "energy-dome-no-power");
return false;
}
}
if (TryComp<BatteryComponent>(generator, out var battery))
else if (TryComp<BatteryComponent>(generator, out var battery))
{
if (battery.ChargeRate == 0)
if (battery.LastCharge <= 0)
{
_audio.PlayPvs(generator.Comp.TurnOffSound, generator);
_popup.PopupEntity(
Loc.GetString("energy-dome-no-power"),
generator);
Fail(generator, "energy-dome-no-power");
return false;
}
}
else
{
Fail(generator, "energy-dome-no-power");
return false;
}
Toggle(generator, status);
return true;
}
private void Fail(Entity<EnergyDomeGeneratorComponent> generator, string locKey)
{
_audio.PlayPvs(generator.Comp.TurnOffSound, generator);
_popup.PopupEntity(Loc.GetString(locKey), generator);
}
private void Toggle(Entity<EnergyDomeGeneratorComponent> generator, bool status)
{
if (status)

View file

@ -35,7 +35,7 @@ public sealed class MechGunSystem : EntitySystem
|| !TryComp<MechComponent>(mechEquipment.EquipmentOwner.Value, out var mech))
return;
var chargeDelta = component.MaxCharge - component.ChargeRate;
var chargeDelta = component.MaxCharge - component.LastCharge;
// TODO: The battery charge of the mech would be spent directly when fired.
if (chargeDelta <= 0
|| mech.Energy - chargeDelta < 0

View file

@ -31,6 +31,7 @@ public sealed class HealthAnalyzerSystem : AbstractAnalyzerSystem<HealthAnalyzer
{
[Dependency] private readonly SharedSolutionContainerSystem _solutionContainerSystem = default!;
[Dependency] private readonly UserInterfaceSystem _uiSystem = default!;
[Dependency] private readonly BloodstreamSystem _bloodstreamSystem = default!;
/// <inheritdoc/>
public override void UpdateScannedUser(EntityUid healthAnalyzer, EntityUid target, bool scanMode)
@ -64,10 +65,9 @@ public sealed class HealthAnalyzerSystem : AbstractAnalyzerSystem<HealthAnalyzer
_solutionContainerSystem.ResolveSolution(target, bloodstream.BloodSolutionName,
ref bloodstream.BloodSolution, out var bloodSolution))
{
bloodAmount = bloodSolution.FillFraction;
bloodAmount = _bloodstreamSystem.GetBloodLevel(target);
bleeding = bloodstream.BleedAmount > 0;
}
// Collect hunger and thirst data as percentages
float hungerLevel = -1;
float thirstLevel = -1;

View file

@ -104,8 +104,8 @@ public sealed class NinjaSuitDrawSystem : SharedNinjaSuitDrawSystem
if (_ninja.GetNinjaBattery(user, out _, out var battery))
{
var canUse = ent.Comp.UseRate <= 0f || battery.ChargeRate >= ent.Comp.UseRate;
var canDraw = ent.Comp.DrawRate <= 0f || battery.ChargeRate > 0f;
var canUse = ent.Comp.UseRate <= 0f || battery.LastCharge >= ent.Comp.UseRate;
var canDraw = ent.Comp.DrawRate <= 0f || battery.LastCharge > 0f;
SetPowerStatus(ent, canDraw, canUse);
if (!canUse)
{
@ -138,7 +138,7 @@ public sealed class NinjaSuitDrawSystem : SharedNinjaSuitDrawSystem
if (!_ninja.IsNinja(user))
return false;
return _ninja.GetNinjaBattery(user, out _, out var battery) && battery.ChargeRate > 0f;
return _ninja.GetNinjaBattery(user, out _, out var battery) && battery.LastCharge > 0f;
}
public override bool CanUse(Entity<NinjaSuitDrawComponent> ent)
@ -148,7 +148,7 @@ public sealed class NinjaSuitDrawSystem : SharedNinjaSuitDrawSystem
return false;
return _ninja.GetNinjaBattery(user, out _, out var battery) &&
(ent.Comp.UseRate <= 0f || battery.ChargeRate >= ent.Comp.UseRate);
(ent.Comp.UseRate <= 0f || battery.LastCharge >= ent.Comp.UseRate);
}
}

View file

@ -125,7 +125,7 @@ public sealed class BorgVoiceSystem : EntitySystem
// Use the borg's selected voice instead of the default
if (component.SelectedVoiceId != null)
{
args.VoiceId = component.SelectedVoiceId;
args.VoiceId = component.SelectedVoiceId.Value;
}
args.Effect = component.VoiceEffect;
}

View file

@ -1,6 +1,7 @@
using Content.Shared.Chat;
using Content.Server.Chat.Systems;
using Robust.Shared.Prototypes;
using Content.Shared._Sunrise.Animations;
namespace Content.Server.Speech;
@ -22,8 +23,11 @@ public sealed partial class EmotesMenuSystem : EntitySystem
if (!player.HasValue)
return;
if (!_prototypeManager.Resolve(msg.ProtoId, out var proto) || proto.ChatTriggers.Count == 0)
return;
if (!_prototypeManager.TryIndex(msg.ProtoId, out var proto) || proto.ChatTriggers.Count == 0)
{
if (!HasComp<EmoteAnimationComponent>(player))
return;
}
_chat.TryEmoteWithChat(player.Value, msg.ProtoId);
}

View file

@ -129,7 +129,7 @@ public sealed class UplinkSystem : EntitySystem
// Sunrtise-Start
if (pdaUid == null)
return null;
continue;
if (_tagSystem.HasTag(pdaUid.Value, "SunriseUplink"))
continue;

View file

@ -1,4 +1,6 @@
using Content.Shared._Sunrise.TTS;
using Content.Shared.Humanoid;
using Robust.Shared.Prototypes;
namespace Content.Server.VoiceMask;
@ -7,5 +9,5 @@ public sealed partial class VoiceMaskerComponent : Component
{
[DataField]
[ViewVariables(VVAccess.ReadWrite)]
public string VoiceId = SharedHumanoidAppearanceSystem.DefaultVoice;
public ProtoId<TTSVoicePrototype> VoiceId = SharedHumanoidAppearanceSystem.DefaultVoice;
}

View file

@ -216,7 +216,7 @@ public sealed class AnnouncementSpeakerSystem : EntitySystem
/// <summary>
/// Gets a voice prototype by ID, with fallback to default voice.
/// </summary>
private bool GetVoicePrototype(string voiceId, [NotNullWhen(true)] out TTSVoicePrototype? voicePrototype)
private bool GetVoicePrototype(ProtoId<TTSVoicePrototype> voiceId, [NotNullWhen(true)] out TTSVoicePrototype? voicePrototype)
{
if (!_prototypeManager.TryIndex(voiceId, out voicePrototype))
{

View file

@ -44,7 +44,7 @@ public sealed class EnergyShieldSystem : EntitySystem
_battery.UseCharge(ent.Owner, cost);
_audio.PlayPvs(ent.Comp.AbsorbSound, ent);
if (battery.ChargeRate <= 0)
if (battery.LastCharge <= 0)
{
_itemToggle.Toggle(ent.Owner);
_audio.PlayPvs(ent.Comp.ShutdownSound, ent);
@ -54,7 +54,7 @@ public sealed class EnergyShieldSystem : EntitySystem
private void OnToggleAttempt(Entity<EnergyShieldComponent> ent, ref ItemToggleActivateAttemptEvent args)
{
if (TryComp<BatteryComponent>(ent, out var battery) &&
battery.ChargeRate >= battery.MaxCharge * ent.Comp.MinChargeFractionForActivation)
battery.LastCharge >= battery.MaxCharge * ent.Comp.MinChargeFractionForActivation)
{
return;
}

View file

@ -110,10 +110,10 @@ public sealed partial class TTSSystem : EntitySystem
return;
var voiceId = senderComponent.VoicePrototypeId;
if (voiceId == null)
if (voiceId == null || string.IsNullOrWhiteSpace(voiceId.Value))
return;
var voiceEv = new TransformSpeakerVoiceEvent(args.Source, voiceId);
var voiceEv = new TransformSpeakerVoiceEvent(args.Source, voiceId.Value);
RaiseLocalEvent(args.Source, voiceEv);
voiceId = voiceEv.VoiceId;
@ -139,7 +139,7 @@ public sealed partial class TTSSystem : EntitySystem
return;
var voiceId = collectiveMindProto.VoiceId;
if (voiceId == null)
if (voiceId == null || string.IsNullOrWhiteSpace(voiceId.Value))
return;
if (!GetVoicePrototype(voiceId, out var protoVoice))
@ -159,7 +159,7 @@ public sealed partial class TTSSystem : EntitySystem
RaiseNetworkEvent(new PlayTTSEvent(soundData, null, false), recipients);
}
private bool GetVoicePrototype(string voiceId, [NotNullWhen(true)] out TTSVoicePrototype? voicePrototype)
private bool GetVoicePrototype(ProtoId<TTSVoicePrototype>? voiceId, [NotNullWhen(true)] out TTSVoicePrototype? voicePrototype)
{
if (!_prototypeManager.TryIndex(voiceId, out voicePrototype))
{
@ -256,10 +256,10 @@ public sealed partial class TTSSystem : EntitySystem
var voiceId = component.VoicePrototypeId;
if (!_isEnabled ||
args.Message.Length > MaxMessageChars ||
voiceId == null)
voiceId == null || string.IsNullOrWhiteSpace(voiceId.Value))
return;
var voiceEv = new TransformSpeakerVoiceEvent(uid, voiceId);
var voiceEv = new TransformSpeakerVoiceEvent(uid, voiceId.Value);
RaiseLocalEvent(uid, voiceEv);
voiceId = voiceEv.VoiceId;
@ -368,10 +368,10 @@ public sealed partial class TTSSystem : EntitySystem
public sealed class TransformSpeakerVoiceEvent : EntityEventArgs
{
public EntityUid Sender;
public string VoiceId;
public ProtoId<TTSVoicePrototype> VoiceId;
public string? Effect;
public TransformSpeakerVoiceEvent(EntityUid sender, string voiceId, string? effect = null)
public TransformSpeakerVoiceEvent(EntityUid sender, ProtoId<TTSVoicePrototype> voiceId, string? effect = null)
{
Sender = sender;
VoiceId = voiceId;

View file

@ -55,7 +55,7 @@ public sealed class PowerDrainOnMeleeHitSystem : EntitySystem
// Fall back to direct BatteryComponent on the same entity
if (TryComp<BatteryComponent>(uid, out var directBattery))
{
if (directBattery.ChargeRate < comp.ChargePerHit)
if (directBattery.LastCharge < comp.ChargePerHit)
{
args.Handled = true;
return;

View file

@ -15,6 +15,7 @@ using Robust.Shared.Player;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
using Robust.Shared.Utility;
using Content.Shared._Sunrise.TTS;
namespace Content.Shared.Chat;
@ -470,7 +471,7 @@ public abstract partial class SharedChatSystem : EntitySystem
bool playSound = true,
SoundSpecifier? announcementSound = null,
bool playTts = true, // Sunrise-edit
string? announceVoice = null, // Sunrise-edit
ProtoId<TTSVoicePrototype>? announceVoice = null, // Sunrise-edit
Color? colorOverride = null
)
{ }
@ -492,7 +493,7 @@ public abstract partial class SharedChatSystem : EntitySystem
string? sender = null,
bool playSound = true,
bool playTts = true, // Sunrise-edit
string? announceVoice = null, // Sunrise-edit
ProtoId<TTSVoicePrototype>? announceVoice = null, // Sunrise-edit
SoundSpecifier? announcementSound = null,
Color? colorOverride = null)
{ }
@ -512,7 +513,7 @@ public abstract partial class SharedChatSystem : EntitySystem
string? sender = null,
bool playDefault = true, // Sunrise
bool playTts = true, // Sunrise
string? announceVoice = null, // Sunrise
ProtoId<TTSVoicePrototype>? announceVoice = null, // Sunrise
bool playDefaultSound = true,
SoundSpecifier? announcementSound = null,
Color? colorOverride = null)

View file

@ -586,7 +586,7 @@ public abstract class SharedHumanoidAppearanceSystem : EntitySystem
// Sunrise-TTS-Start
// ReSharper disable once InconsistentNaming
public void SetTTSVoice(EntityUid uid, string voiceId, HumanoidAppearanceComponent humanoid)
public void SetTTSVoice(EntityUid uid, ProtoId<TTSVoicePrototype> voiceId, HumanoidAppearanceComponent humanoid)
{
if (!TryComp<TTSComponent>(uid, out var comp))
return;

View file

@ -78,7 +78,7 @@ namespace Content.Shared.Preferences
public ProtoId<SpeciesPrototype> Species { get; set; } = SharedHumanoidAppearanceSystem.DefaultSpecies;
[DataField]
public string Voice { get; set; } = SharedHumanoidAppearanceSystem.DefaultVoice;
public ProtoId<TTSVoicePrototype> Voice { get; set; } = SharedHumanoidAppearanceSystem.DefaultVoice;
[DataField]
public int Age { get; set; } = 18;

View file

@ -1,3 +1,4 @@
using Content.Shared._Sunrise.TTS;
using Robust.Shared.Prototypes;
namespace Content.Shared._Sunrise.CollectiveMind;
@ -18,7 +19,7 @@ public sealed partial class CollectiveMindPrototype : IPrototype
public Color Color { get; private set; } = Color.Lime;
[DataField("voiceId")]
public string? VoiceId { get; private set; } = null;
public ProtoId<TTSVoicePrototype>? VoiceId;
[DataField("showAuthor")]
public bool ShowAuthor { get; private set; } = false;

View file

@ -1,6 +1,6 @@
using Content.Server._Sunrise.Emp;
using Content.Shared._Sunrise.Emp;
namespace Content.Server.Emp;
namespace Content.Shared._Sunrise.Emp;
/// <summary>
/// Upon being triggered will EMP area around it.
@ -9,5 +9,4 @@ namespace Content.Server.Emp;
[Access(typeof(EmpImmuneSystem))]
public sealed partial class EmpImmuneComponent : Component
{
}

View file

@ -1,7 +1,6 @@
using Content.Server.Emp;
using Content.Shared.Emp;
namespace Content.Server._Sunrise.Emp;
namespace Content.Shared._Sunrise.Emp;
public sealed class EmpImmuneSystem : EntitySystem
{
@ -13,7 +12,7 @@ public sealed class EmpImmuneSystem : EntitySystem
SubscribeLocalEvent<EmpImmuneComponent, EmpAttemptEvent>(OnEmpAttempt);
}
private void OnEmpAttempt(EntityUid uid, EmpImmuneComponent comp, EmpAttemptEvent args)
private void OnEmpAttempt(Entity<EmpImmuneComponent> ent, ref EmpAttemptEvent args)
{
args.Cancelled = true;
}

View file

@ -1,4 +1,5 @@
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
namespace Content.Shared._Sunrise.TTS;
@ -13,7 +14,6 @@ public sealed partial class TTSComponent : Component
/// <summary>
/// Prototype of used voice for TTS.
/// </summary>
[ViewVariables(VVAccess.ReadWrite)]
[DataField("voice", customTypeSerializer: typeof(PrototypeIdSerializer<TTSVoicePrototype>))]
public string? VoicePrototypeId { get; set; } = "Voljin"; // Fish-edit: Default voice when component is freshly added
[DataField("voice")]
public ProtoId<TTSVoicePrototype>? VoicePrototypeId;
}

View file

@ -6,6 +6,7 @@ namespace Content.Shared._Sunrise.TTS;
[Prototype("ttsVoice")]
public sealed partial class TTSVoicePrototype : IPrototype
{
[ViewVariables]
[IdDataField]
public string ID { get; private set; } = default!;
@ -15,11 +16,9 @@ public sealed partial class TTSVoicePrototype : IPrototype
[DataField(required: true)]
public Sex Sex;
[ViewVariables(VVAccess.ReadWrite)]
[DataField(required: true)]
public string Speaker = string.Empty;
[ViewVariables(VVAccess.ReadWrite)]
[DataField(required: true)]
public string Provider = string.Empty;

View file

@ -1,8 +1,8 @@
ent-AirAlarm = сирена воздушной тревоги
ent-AirAlarm = воздушная тревога
.desc = Сирена воздушной тревоги. Тревога... воздух?
ent-AirAlarmAssembly = сборочный модуль сирены воздушной тревоги
.desc = Сборочный модуль сирены воздушной тревоги. Не похоже, что она будет тревожить воздух в ближайшее время.
ent-AirAlarmXeno = сирена воздушной тревоги
ent-AirAlarmXeno = воздушная тревога
.desc = Инопланетная сирена воздушной тревоги. Надеюсь, они не дышали ядом.
ent-AirAlarmAssemblyXeno = сборочный модуль сирены воздушной тревоги
.desc = Инопланетная сирена воздушной тревоги. Почему провода пульсируют?...
.desc = Инопланетная сирена воздушной тревоги. Почему провода пульсируют?...

View file

@ -3,8 +3,8 @@ atmos-alerts-window-station-name = [color=white][font size=14]{ $stationName }[/
atmos-alerts-window-unknown-location = Неизвестное местоположение
atmos-alerts-window-tab-no-alerts = Предупреждения
atmos-alerts-window-tab-alerts = Предупреждения ({ $value })
atmos-alerts-window-tab-air-alarms = Воздушные тревоги
atmos-alerts-window-tab-fire-alarms = Пожарные тревоги
atmos-alerts-window-tab-air-alarms = Воздушные
atmos-alerts-window-tab-fire-alarms = Пожарные
atmos-alerts-window-alarm-label = { CAPITALIZE($name) } ({ $address })
atmos-alerts-window-temperature-label = Температура
atmos-alerts-window-temperature-value = { $valueInC } °C ({ $valueInK } K)

View file

@ -248,6 +248,7 @@
- type: CognizinFix
- type: InjectNeed
- type: CanJump
isOnlyEmotion: false
- type: CanFall
# Sunrise-End

View file

@ -65,6 +65,7 @@
- type: EmitSoundOnUse
sound:
path: /Audio/_Sunrise/Items/Handling/paper_use.ogg
handle: false
- type: EmitSoundOnCollide
sound:
path: /Audio/_Sunrise/Items/Handling/paper_drop.ogg

View file

@ -99,82 +99,3 @@
- Toggle
- On
- Off
- type: entity
id: EnergyDomeWiredTest
name: Static Dome
description: Test energy barrier powered by station wiring. I don't know how the hell to balance it.....
parent: BaseMachine
suffix: DO NOT MERGE
placement:
mode: SnapgridCenter
components:
- type: Transform
anchored: true
- type: Physics
bodyType: Static
- type: Fixtures
fixtures:
fix1:
shape:
!type:PhysShapeAabb
bounds: "-0.45,-0.45,0.45,0.45"
density: 190
mask:
- MachineMask
layer:
- MachineLayer
- type: Sprite
sprite: Structures/Power/Generation/Tesla/coil.rsi
snapCardinals: true
noRot: true
layers:
- state: coil
- type: ExaminableBattery
- type: Battery
maxCharge: 30000 #<- max supply
startingCharge: 10000
- type: PowerNetworkBattery
maxSupply: 30000
maxChargeRate: 1000 #<- passive charging frow power net
supplyRampTolerance: 500
supplyRampRate: 50
netsync: false # Sunrise edit
- type: BatteryCharger
voltage: Medium
- type: NodeContainer
examinable: true
nodes:
input:
!type:CableDeviceNode
nodeGroupID: MVPower
- type: BatterySelfRecharger
autoRechargeRate: -800 #<- discharge per second while active
- type: Damageable
damageContainer: Inorganic
damageModifierSet: Metallic
- type: Destructible
thresholds:
- trigger:
!type:DamageTrigger
damage: 200
behaviors:
- !type:DoActsBehavior
acts: [ "Destruction" ]
- type: UseDelay
delay: 30.0
- type: DeviceNetwork
deviceNetId: Wireless
receiveFrequencyId: BasicDevice
- type: WirelessNetworkConnection
range: 200
- type: DeviceLinkSink
ports:
- Toggle
- On
- Off
- type: EnergyDomeGenerator
enabled: true
damageEnergyDraw: 100
domePrototype: EnergyDomeSlowing
canDeviceNetworkUse: true

View file

@ -946,4 +946,6 @@ GrenadeFlashTimer: null
ImplantExtractorMachineCircuitboard: InterrogatorMachineCircuitboard
# 2026-01-02
EnergyDomeWiredTest: null
# Sunrise-End