recipients.Add(player, new ICChatRecipientData(-1, true));
}
- RaiseLocalEvent(new ExpandICChatRecipientstEvent(source, voiceGetRange, recipients));
+ RaiseLocalEvent(new ExpandICChatRecipientsEvent(source, voiceGetRange, recipients));
return recipients;
}
/// This event is raised before chat messages are sent out to clients. This enables some systems to send the chat
/// messages to otherwise out-of view entities (e.g. for multiple viewports from cameras).
/// </summary>
-public record ExpandICChatRecipientstEvent(EntityUid Source, float VoiceRange, Dictionary<ICommonSession, ChatSystem.ICChatRecipientData> Recipients)
+public record ExpandICChatRecipientsEvent(EntityUid Source, float VoiceRange, Dictionary<ICommonSession, ChatSystem.ICChatRecipientData> Recipients)
{
}
[DataField]
public string? EndAnnouncement;
+ [DataField]
+ public Color StartAnnouncementColor = Color.Gold;
+
+ [DataField]
+ public Color EndAnnouncementColor = Color.Gold;
+
[DataField]
public SoundSpecifier? StartAudio;
[DataField]
public int ReoccurrenceDelay = 30;
- /// <summary>
- /// How long after being added does the event start
- /// </summary>
- [DataField]
- public TimeSpan StartDelay = TimeSpan.Zero;
-
/// <summary>
/// How long the event lasts.
/// </summary>
[DataField]
public int? MaxOccurrences;
- /// <summary>
- /// When the station event starts.
- /// </summary>
- [DataField("startTime", customTypeSerializer: typeof(TimeOffsetSerializer))]
- [AutoPausedField]
- public TimeSpan StartTime;
-
/// <summary>
/// When the station event ends.
/// </summary>
using Content.Server.Anomaly;
using Content.Server.GameTicking.Components;
-using Content.Server.GameTicking.Rules.Components;
using Content.Server.Station.Components;
using Content.Server.StationEvents.Components;
protected override void Added(EntityUid uid, AnomalySpawnRuleComponent component, GameRuleComponent gameRule, GameRuleAddedEvent args)
{
- base.Added(uid, component, gameRule, args);
+ if (!TryComp<StationEventComponent>(uid, out var stationEvent))
+ return;
var str = Loc.GetString("anomaly-spawn-event-announcement",
("sighting", Loc.GetString($"anomaly-spawn-sighting-{RobustRandom.Next(1, 6)}")));
- ChatSystem.DispatchGlobalAnnouncement(str, colorOverride: Color.FromHex("#18abf5"));
+ stationEvent.StartAnnouncement = str;
+
+ base.Added(uid, component, gameRule, args);
}
protected override void Started(EntityUid uid, AnomalySpawnRuleComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args)
using Content.Server.GameTicking.Components;
-using Content.Server.GameTicking.Rules.Components;
using Content.Server.StationEvents.Components;
using Robust.Shared.Random;
{
protected override void Added(EntityUid uid, BluespaceArtifactRuleComponent component, GameRuleComponent gameRule, GameRuleAddedEvent args)
{
- base.Added(uid, component, gameRule, args);
+ if (!TryComp<StationEventComponent>(uid, out var stationEvent))
+ return;
var str = Loc.GetString("bluespace-artifact-event-announcement",
("sighting", Loc.GetString(RobustRandom.Pick(component.PossibleSighting))));
- ChatSystem.DispatchGlobalAnnouncement(str, colorOverride: Color.FromHex("#18abf5"));
+ stationEvent.StartAnnouncement = str;
+
+ base.Added(uid, component, gameRule, args);
}
protected override void Started(EntityUid uid, BluespaceArtifactRuleComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args)
using Content.Server.GameTicking.Components;
-using Content.Server.GameTicking.Rules.Components;
using Content.Server.Power.Components;
using Content.Server.Power.EntitySystems;
using Content.Server.Station.Components;
protected override void Added(EntityUid uid, BreakerFlipRuleComponent component, GameRuleComponent gameRule, GameRuleAddedEvent args)
{
- base.Added(uid, component, gameRule, args);
+ if (!TryComp<StationEventComponent>(uid, out var stationEvent))
+ return;
var str = Loc.GetString("station-event-breaker-flip-announcement", ("data", Loc.GetString(Loc.GetString($"random-sentience-event-data-{RobustRandom.Next(1, 6)}"))));
- ChatSystem.DispatchGlobalAnnouncement(str, playSound: false, colorOverride: Color.Gold);
+ stationEvent.StartAnnouncement = str;
+
+ base.Added(uid, component, gameRule, args);
+
}
protected override void Started(EntityUid uid, BreakerFlipRuleComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args)
using Content.Server.Cargo.Systems;
using Content.Server.GameTicking;
using Content.Server.GameTicking.Components;
-using Content.Server.GameTicking.Rules.Components;
using Content.Server.Station.Components;
using Content.Server.StationEvents.Components;
using Robust.Shared.Prototypes;
protected override void Added(EntityUid uid, CargoGiftsRuleComponent component, GameRuleComponent gameRule, GameRuleAddedEvent args)
{
- base.Added(uid, component, gameRule, args);
+ if (!TryComp<StationEventComponent>(uid, out var stationEvent))
+ return;
var str = Loc.GetString(component.Announce,
("sender", Loc.GetString(component.Sender)), ("description", Loc.GetString(component.Description)), ("dest", Loc.GetString(component.Dest)));
- ChatSystem.DispatchGlobalAnnouncement(str, colorOverride: Color.FromHex("#18abf5"));
+ stationEvent.StartAnnouncement = str;
+
+ base.Added(uid, component, gameRule, args);
}
/// <summary>
using System.Linq;
using Content.Server.GameTicking.Components;
-using Content.Server.GameTicking.Rules.Components;
using Content.Server.StationEvents.Components;
using JetBrains.Annotations;
-using Robust.Shared.Player;
using Robust.Shared.Random;
namespace Content.Server.StationEvents.Events;
protected override void Started(EntityUid uid, FalseAlarmRuleComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args)
{
- base.Started(uid, component, gameRule, args);
+ if (!TryComp<StationEventComponent>(uid, out var stationEvent))
+ return;
var allEv = _event.AllEvents().Select(p => p.Value).ToList();
var picked = RobustRandom.Pick(allEv);
- if (picked.StartAnnouncement != null)
- {
- ChatSystem.DispatchGlobalAnnouncement(Loc.GetString(picked.StartAnnouncement), playSound: false, colorOverride: Color.Gold);
- }
- Audio.PlayGlobal(picked.StartAudio, Filter.Broadcast(), true);
+ stationEvent.StartAnnouncement = picked.StartAnnouncement;
+ stationEvent.StartAudio = picked.StartAudio;
+ stationEvent.StartAnnouncementColor = picked.StartAnnouncementColor;
+
+ base.Started(uid, component, gameRule, args);
}
}
component.LeakGas = RobustRandom.Pick(component.LeakableGases);
// Was 50-50 on using normal distribution.
var totalGas = RobustRandom.Next(component.MinimumGas, component.MaximumGas);
- var startAfter = stationEvent.StartDelay;
component.MolesPerSecond = RobustRandom.Next(component.MinimumMolesPerSecond, component.MaximumMolesPerSecond);
- stationEvent.EndTime = _timing.CurTime + TimeSpan.FromSeconds(totalGas / component.MolesPerSecond + startAfter.TotalSeconds);
+ if (gameRule.Delay is {} startAfter)
+ stationEvent.EndTime = _timing.CurTime + TimeSpan.FromSeconds(totalGas / component.MolesPerSecond + startAfter.Next(RobustRandom));
}
// Look technically if you wanted to guarantee a leak you'd do this in announcement but having the announcement
-using System.Linq;
using Content.Server.Administration.Logs;
using Content.Server.Chat.Systems;
using Content.Server.GameTicking.Components;
using Content.Server.GameTicking.Rules;
-using Content.Server.GameTicking.Rules.Components;
using Content.Server.Station.Systems;
using Content.Server.StationEvents.Components;
using Content.Shared.Database;
using Robust.Shared.Audio.Systems;
-using Robust.Shared.Map;
using Robust.Shared.Player;
using Robust.Shared.Prototypes;
public abstract class StationEventSystem<T> : GameRuleSystem<T> where T : IComponent
{
[Dependency] protected readonly IAdminLogManager AdminLogManager = default!;
- [Dependency] protected readonly IMapManager MapManager = default!;
[Dependency] protected readonly IPrototypeManager PrototypeManager = default!;
[Dependency] protected readonly ChatSystem ChatSystem = default!;
[Dependency] protected readonly SharedAudioSystem Audio = default!;
if (!TryComp<StationEventComponent>(uid, out var stationEvent))
return;
-
AdminLogManager.Add(LogType.EventAnnounced, $"Event added / announced: {ToPrettyString(uid)}");
if (stationEvent.StartAnnouncement != null)
- {
- ChatSystem.DispatchGlobalAnnouncement(Loc.GetString(stationEvent.StartAnnouncement), playSound: false, colorOverride: Color.Gold);
- }
+ ChatSystem.DispatchGlobalAnnouncement(Loc.GetString(stationEvent.StartAnnouncement), playSound: false, colorOverride: stationEvent.StartAnnouncementColor);
Audio.PlayGlobal(stationEvent.StartAudio, Filter.Broadcast(), true);
- stationEvent.StartTime = Timing.CurTime + stationEvent.StartDelay;
}
/// <inheritdoc/>
AdminLogManager.Add(LogType.EventStopped, $"Event ended: {ToPrettyString(uid)}");
if (stationEvent.EndAnnouncement != null)
- {
- ChatSystem.DispatchGlobalAnnouncement(Loc.GetString(stationEvent.EndAnnouncement), playSound: false, colorOverride: Color.Gold);
- }
+ ChatSystem.DispatchGlobalAnnouncement(Loc.GetString(stationEvent.EndAnnouncement), playSound: false, colorOverride: stationEvent.EndAnnouncementColor);
Audio.PlayGlobal(stationEvent.EndAudio, Filter.Broadcast(), true);
}
if (!GameTicker.IsGameRuleAdded(uid, ruleData))
continue;
- if (!GameTicker.IsGameRuleActive(uid, ruleData) && Timing.CurTime >= stationEvent.StartTime)
- {
- GameTicker.StartGameRule(uid, ruleData);
- }
- else if (stationEvent.EndTime != null && Timing.CurTime >= stationEvent.EndTime && GameTicker.IsGameRuleActive(uid, ruleData))
+ if (stationEvent.EndTime != null && Timing.CurTime >= stationEvent.EndTime && GameTicker.IsGameRuleActive(uid, ruleData))
{
GameTicker.EndGameRule(uid, ruleData);
}
SubscribeLocalEvent<SurveillanceCameraMicrophoneComponent, ComponentInit>(OnInit);
SubscribeLocalEvent<SurveillanceCameraMicrophoneComponent, ListenEvent>(RelayEntityMessage);
SubscribeLocalEvent<SurveillanceCameraMicrophoneComponent, ListenAttemptEvent>(CanListen);
- SubscribeLocalEvent<ExpandICChatRecipientstEvent>(OnExpandRecipients);
+ SubscribeLocalEvent<ExpandICChatRecipientsEvent>(OnExpandRecipients);
}
- private void OnExpandRecipients(ExpandICChatRecipientstEvent ev)
+ private void OnExpandRecipients(ExpandICChatRecipientsEvent ev)
{
var xformQuery = GetEntityQuery<TransformComponent>();
var sourceXform = Transform(ev.Source);
-anomaly-spawn-event-announcement = Our readings have detected a dangerous interspacial anomaly. Please inform the research team of { $sighting }.
+anomaly-spawn-event-announcement = Our readings have detected a dangerous interspacial anomaly. Please inform the research team about { $sighting }.
anomaly-spawn-sighting-1 = low pulsating sounds heard throughout the station
anomaly-spawn-sighting-2 = strange sources of light
- type: entity
- id: GiftsPizzaPartySmall
+ id: CargoGiftsBase
parent: BaseGameRule
+ abstract: true
+ components:
+ - type: GameRule
+ delay:
+ min: 10
+ max: 10
+ - type: StationEvent
+ startColor: "#18abf5"
+ startAudio:
+ path: /Audio/Announcements/announce.ogg
+ - type: CargoGiftsRule
+ sender: cargo-gift-default-sender
+
+- type: entity
+ id: GiftsPizzaPartySmall
+ parent: CargoGiftsBase
noSpawn: true
components:
- type: StationEvent
weight: 5
- startDelay: 10
duration: 120
earliestStart: 20
- type: CargoGiftsRule
description: cargo-gift-pizza-small
- sender: cargo-gift-default-sender
dest: cargo-gift-dest-bar
gifts:
FoodPizza: 1 # 4 pizzas
- type: entity
id: GiftsPizzaPartyLarge
- parent: BaseGameRule
+ parent: CargoGiftsBase
noSpawn: true
components:
- - type: StationEvent
- weight: 2
- startDelay: 10
- duration: 240
- earliestStart: 20
- minimumPlayers: 40
- - type: CargoGiftsRule
- description: cargo-gift-pizza-large
- sender: cargo-gift-default-sender
- dest: cargo-gift-dest-bar
- gifts:
- FoodPizzaLarge: 1 # 16 pizzas
- FoodBarSupply: 1
- FoodSoftdrinksLarge: 1
+ - type: StationEvent
+ weight: 2
+ duration: 240
+ earliestStart: 20
+ minimumPlayers: 40
+ - type: CargoGiftsRule
+ description: cargo-gift-pizza-large
+ dest: cargo-gift-dest-bar
+ gifts:
+ FoodPizzaLarge: 1 # 16 pizzas
+ FoodBarSupply: 1
+ FoodSoftdrinksLarge: 1
- type: entity
id: GiftsEngineering
- parent: BaseGameRule
+ parent: CargoGiftsBase
noSpawn: true
components:
- - type: StationEvent
- weight: 5
- startDelay: 10
- duration: 240
- earliestStart: 30
- minimumPlayers: 10
- - type: CargoGiftsRule
- description: cargo-gift-eng
- sender: cargo-gift-default-sender
- dest: cargo-gift-dest-eng
- gifts:
- EngineeringCableBulk: 1
- AirlockKit: 1
- MaterialSteel: 1
- MaterialPlasteel: 1
- MaterialGlass: 1
- CrateVendingMachineRestockEngineering: 1
+ - type: StationEvent
+ weight: 5
+ duration: 240
+ earliestStart: 30
+ minimumPlayers: 10
+ - type: CargoGiftsRule
+ description: cargo-gift-eng
+ dest: cargo-gift-dest-eng
+ gifts:
+ EngineeringCableBulk: 1
+ AirlockKit: 1
+ MaterialSteel: 1
+ MaterialPlasteel: 1
+ MaterialGlass: 1
+ CrateVendingMachineRestockEngineering: 1
- type: entity
id: GiftsVendingRestock
- parent: BaseGameRule
+ parent: CargoGiftsBase
noSpawn: true
components:
- - type: StationEvent
- weight: 4
- startDelay: 10
- duration: 120
- minimumPlayers: 40
- earliestStart: 30
- - type: CargoGiftsRule
- description: cargo-gift-vending
- sender: cargo-gift-default-sender
- dest: cargo-gift-dest-supp
- gifts:
- CrateVendingMachineRestockHotDrinks: 3
- CrateVendingMachineRestockBooze: 1
- CrateVendingMachineRestockNutriMax: 1
- CrateVendingMachineRestockRobustSoftdrinks: 2
- CrateVendingMachineRestockVendomat: 1
- CrateVendingMachineRestockGetmoreChocolateCorp: 1
+ - type: StationEvent
+ weight: 4
+ duration: 120
+ minimumPlayers: 40
+ earliestStart: 30
+ - type: CargoGiftsRule
+ description: cargo-gift-vending
+ dest: cargo-gift-dest-supp
+ gifts:
+ CrateVendingMachineRestockHotDrinks: 3
+ CrateVendingMachineRestockBooze: 1
+ CrateVendingMachineRestockNutriMax: 1
+ CrateVendingMachineRestockRobustSoftdrinks: 2
+ CrateVendingMachineRestockVendomat: 1
+ CrateVendingMachineRestockGetmoreChocolateCorp: 1
- type: entity
id: GiftsJanitor
- parent: BaseGameRule
+ parent: CargoGiftsBase
noSpawn: true
components:
- - type: StationEvent
- weight: 6
- startDelay: 10
- duration: 120
- minimumPlayers: 30
- earliestStart: 20
- - type: CargoGiftsRule
- description: cargo-gift-cleaning
- sender: cargo-gift-default-sender
- dest: cargo-gift-dest-janitor
- gifts:
- ServiceJanitorial: 2
- ServiceLightsReplacement: 2
- ServiceJanitorBiosuit: 1
+ - type: StationEvent
+ weight: 6
+ duration: 120
+ minimumPlayers: 30
+ earliestStart: 20
+ - type: CargoGiftsRule
+ description: cargo-gift-cleaning
+ dest: cargo-gift-dest-janitor
+ gifts:
+ ServiceJanitorial: 2
+ ServiceLightsReplacement: 2
+ ServiceJanitorBiosuit: 1
- type: entity
id: GiftsMedical
- parent: BaseGameRule
+ parent: CargoGiftsBase
noSpawn: true
components:
- - type: StationEvent
- weight: 8
- startDelay: 10
- duration: 120
- earliestStart: 20
- minimumPlayers: 30
- - type: CargoGiftsRule
- description: cargo-gift-medical-supply
- sender: cargo-gift-default-sender
- dest: cargo-gift-dest-med
- gifts:
- MedicalSupplies: 1
- MedicalChemistrySupplies: 1
- EmergencyBruteKit: 1
- EmergencyAdvancedKit: 1
- MedicalBiosuit: 1
+ - type: StationEvent
+ weight: 8
+ duration: 120
+ earliestStart: 20
+ minimumPlayers: 30
+ - type: CargoGiftsRule
+ description: cargo-gift-medical-supply
+ dest: cargo-gift-dest-med
+ gifts:
+ MedicalSupplies: 1
+ MedicalChemistrySupplies: 1
+ EmergencyBruteKit: 1
+ EmergencyAdvancedKit: 1
+ MedicalBiosuit: 1
- type: entity
id: GiftsSpacingSupplies
- parent: BaseGameRule
+ parent: CargoGiftsBase
noSpawn: true
components:
- - type: StationEvent
- weight: 4
- startDelay: 10
- duration: 120
- earliestStart: 10
- minimumPlayers: 40
- - type: CargoGiftsRule
- description: cargo-gift-space-protection
- sender: cargo-gift-default-sender
- dest: cargo-gift-dest-supp
- gifts:
- EmergencyInternalsLarge: 2
- EmergencyInflatablewall: 1
- EmergencyAdvancedKit: 1
- MedicalBiosuit: 1
- EmergencyO2Kit: 1
+ - type: StationEvent
+ weight: 4
+ duration: 120
+ earliestStart: 10
+ minimumPlayers: 40
+ - type: CargoGiftsRule
+ description: cargo-gift-space-protection
+ dest: cargo-gift-dest-supp
+ gifts:
+ EmergencyInternalsLarge: 2
+ EmergencyInflatablewall: 1
+ EmergencyAdvancedKit: 1
+ MedicalBiosuit: 1
+ EmergencyO2Kit: 1
- type: entity
id: GiftsFireProtection
- parent: BaseGameRule
+ parent: CargoGiftsBase
noSpawn: true
components:
- - type: StationEvent
- weight: 4
- startDelay: 10
- duration: 120
- earliestStart: 20
- minimumPlayers: 40
- - type: CargoGiftsRule
- description: cargo-gift-fire-protection
- sender: cargo-gift-default-sender
- dest: cargo-gift-dest-supp
- gifts:
- EmergencyFire: 2
- EmergencyBurnKit: 1
- EmergencyBruteKit: 1
+ - type: StationEvent
+ weight: 4
+ duration: 120
+ earliestStart: 20
+ minimumPlayers: 40
+ - type: CargoGiftsRule
+ description: cargo-gift-fire-protection
+ dest: cargo-gift-dest-supp
+ gifts:
+ EmergencyFire: 2
+ EmergencyBurnKit: 1
+ EmergencyBruteKit: 1
- type: entity
id: GiftsSecurityGuns
- parent: BaseGameRule
+ parent: CargoGiftsBase
noSpawn: true
components:
- - type: StationEvent
- weight: 3
- startDelay: 10
- duration: 120
- earliestStart: 20
- minimumPlayers: 50
- - type: CargoGiftsRule
- description: cargo-gift-security-guns
- sender: cargo-gift-default-sender
- dest: cargo-gift-dest-sec
- gifts:
- SecurityArmor: 3
- ArmorySmg: 1
- ArmoryShotgun: 1
- ArmoryLaser: 1
+ - type: StationEvent
+ weight: 3
+ duration: 120
+ earliestStart: 20
+ minimumPlayers: 50
+ - type: CargoGiftsRule
+ description: cargo-gift-security-guns
+ dest: cargo-gift-dest-sec
+ gifts:
+ SecurityArmor: 3
+ ArmorySmg: 1
+ ArmoryShotgun: 1
+ ArmoryLaser: 1
- type: entity
id: GiftsSecurityRiot
- parent: BaseGameRule
+ parent: CargoGiftsBase
noSpawn: true
components:
- - type: StationEvent
- weight: 4
- startDelay: 10
- duration: 120
- earliestStart: 20
- minimumPlayers: 50
- - type: CargoGiftsRule
- description: cargo-gift-security-riot
- sender: cargo-gift-default-sender
- dest: cargo-gift-dest-sec
- gifts:
- SecurityRiot: 2
- SecurityRestraints: 2
- SecurityNonLethal: 2
+ - type: StationEvent
+ weight: 4
+ duration: 120
+ earliestStart: 20
+ minimumPlayers: 50
+ - type: CargoGiftsRule
+ description: cargo-gift-security-riot
+ dest: cargo-gift-dest-sec
+ gifts:
+ SecurityRiot: 2
+ SecurityRestraints: 2
+ SecurityNonLethal: 2
- type: entity
- id: AnomalySpawn
+ id: BaseStationEvent
+ parent: BaseGameRule
+ abstract: true
+ noSpawn: true
+ components:
+ - type: GameRule
+ delay:
+ min: 10
+ max: 20
+
+- type: entity
+ id: BaseStationEventShortDelay
parent: BaseGameRule
+ abstract: true
+ noSpawn: true
+ components:
+ - type: GameRule
+ delay:
+ min: 10
+ max: 20
+
+- type: entity
+ id: BaseStationEventLongDelay
+ parent: BaseGameRule
+ abstract: true
+ noSpawn: true
+ components:
+ - type: GameRule
+ delay:
+ min: 40
+ max: 60
+
+- type: entity
+ id: AnomalySpawn
+ parent: BaseStationEventShortDelay
noSpawn: true
components:
- type: StationEvent
+ startAnnouncementColor: "#18abf5"
+ startAudio:
+ path: /Audio/Announcements/announce.ogg
weight: 8
- startDelay: 30
duration: 35
- type: AnomalySpawnRule
- type: entity
id: BluespaceArtifact
- parent: BaseGameRule
+ parent: BaseStationEventShortDelay
noSpawn: true
components:
+ - type: GameRule
+ delay:
+ min: 30
+ max: 30
- type: StationEvent
+ startAnnouncementColor: "#18abf5"
+ startAudio:
+ path: /Audio/Announcements/announce.ogg
weight: 8
- startDelay: 30
duration: 35
- type: BluespaceArtifactRule
- type: entity
id: GasLeak
- parent: BaseGameRule
+ parent: BaseStationEventShortDelay
noSpawn: true
components:
- type: StationEvent
path: /Audio/Announcements/attention.ogg
endAnnouncement: station-event-gas-leak-end-announcement
weight: 8
- startDelay: 20
- type: GasLeakRule
- type: entity
id: KudzuGrowth
- parent: BaseGameRule
+ parent: BaseStationEventLongDelay
noSpawn: true
components:
- type: StationEvent
earliestStart: 15
minimumPlayers: 15
weight: 7
- startDelay: 50
duration: 240
- type: KudzuGrowthRule
- type: entity
id: MeteorSwarm
- parent: BaseGameRule
+ parent: BaseStationEventLongDelay
noSpawn: true
components:
- type: StationEvent
params:
volume: -4
duration: null #ending is handled by MeteorSwarmRule
- startDelay: 30
- type: MeteorSwarmRule
- type: entity
id: MouseMigration
- parent: BaseGameRule
+ parent: BaseStationEventShortDelay
noSpawn: true
components:
- type: StationEvent
startAnnouncement: station-event-vent-creatures-start-announcement
startAudio:
path: /Audio/Announcements/attention.ogg
- startDelay: 10
earliestStart: 15
weight: 6
duration: 50
- type: entity
id: CockroachMigration
- parent: BaseGameRule
+ parent: BaseStationEventShortDelay
noSpawn: true
components:
- type: StationEvent
startAnnouncement: station-event-vent-creatures-start-announcement
startAudio:
path: /Audio/Announcements/attention.ogg
- startDelay: 10
weight: 6
duration: 50
- type: VentCrittersRule
- type: entity
id: PowerGridCheck
- parent: BaseGameRule
+ parent: BaseStationEventShortDelay
noSpawn: true
components:
- type: StationEvent
path: /Audio/Announcements/power_off.ogg
params:
volume: -4
- startDelay: 24
duration: 60
maxDuration: 120
- type: PowerGridCheckRule
- type: entity
id: VentClog
- parent: BaseGameRule
+ parent: BaseStationEventLongDelay
noSpawn: true
components:
- type: StationEvent
earliestStart: 15
minimumPlayers: 15
weight: 5
- startDelay: 50
duration: 60
- type: VentClogRule
- type: entity
id: SlimesSpawn
- parent: BaseGameRule
+ parent: BaseStationEventShortDelay
noSpawn: true
components:
- type: StationEvent
startAnnouncement: station-event-vent-creatures-start-announcement
startAudio:
path: /Audio/Announcements/attention.ogg
- startDelay: 10
earliestStart: 20
minimumPlayers: 15
weight: 5
- type: entity
id: SpiderSpawn
- parent: BaseGameRule
+ parent: BaseStationEventShortDelay
noSpawn: true
components:
- type: StationEvent
startAnnouncement: station-event-vent-creatures-start-announcement
startAudio:
path: /Audio/Announcements/attention.ogg
- startDelay: 10
earliestStart: 20
minimumPlayers: 15
weight: 5
- type: entity
id: SpiderClownSpawn
- parent: BaseGameRule
+ parent: BaseStationEventShortDelay
noSpawn: true
components:
- type: StationEvent
startAnnouncement: station-event-vent-creatures-start-announcement
startAudio:
path: /Audio/Announcements/attention.ogg
- startDelay: 10
earliestStart: 20
minimumPlayers: 20
weight: 1.5