diff --git a/Content.Client/Alerts/ClientAlertsSystem.cs b/Content.Client/Alerts/ClientAlertsSystem.cs index 223bf7876ac..359c8957f9d 100644 --- a/Content.Client/Alerts/ClientAlertsSystem.cs +++ b/Content.Client/Alerts/ClientAlertsSystem.cs @@ -91,7 +91,7 @@ private void OnPlayerDetached(EntityUid uid, AlertsComponent component, LocalPla ClearAlerts?.Invoke(this, EventArgs.Empty); } - public void AlertClicked(AlertType alertType) + public void AlertClicked(ProtoId alertType) { RaiseNetworkEvent(new ClickAlertEvent(alertType)); } diff --git a/Content.Client/Atmos/EntitySystems/GasTileOverlaySystem.cs b/Content.Client/Atmos/EntitySystems/GasTileOverlaySystem.cs index 78185ce6b0e..86cf0a9eb82 100644 --- a/Content.Client/Atmos/EntitySystems/GasTileOverlaySystem.cs +++ b/Content.Client/Atmos/EntitySystems/GasTileOverlaySystem.cs @@ -1,4 +1,5 @@ using Content.Client.Atmos.Overlays; +using Content.Shared.Atmos; using Content.Shared.Atmos.Components; using Content.Shared.Atmos.EntitySystems; using JetBrains.Annotations; @@ -36,28 +37,38 @@ public override void Shutdown() private void OnHandleState(EntityUid gridUid, GasTileOverlayComponent comp, ref ComponentHandleState args) { - if (args.Current is not GasTileOverlayState state) - return; + Dictionary modifiedChunks; - // is this a delta or full state? - if (!state.FullState) + switch (args.Current) { - foreach (var index in comp.Chunks.Keys) + // is this a delta or full state? + case GasTileOverlayDeltaState delta: { - if (!state.AllChunks!.Contains(index)) - comp.Chunks.Remove(index); + modifiedChunks = delta.ModifiedChunks; + foreach (var index in comp.Chunks.Keys) + { + if (!delta.AllChunks.Contains(index)) + comp.Chunks.Remove(index); + } + + break; } - } - else - { - foreach (var index in comp.Chunks.Keys) + case GasTileOverlayState state: { - if (!state.Chunks.ContainsKey(index)) - comp.Chunks.Remove(index); + modifiedChunks = state.Chunks; + foreach (var index in comp.Chunks.Keys) + { + if (!state.Chunks.ContainsKey(index)) + comp.Chunks.Remove(index); + } + + break; } + default: + return; } - foreach (var (index, data) in state.Chunks) + foreach (var (index, data) in modifiedChunks) { comp.Chunks[index] = data; } diff --git a/Content.Client/Decals/DecalSystem.cs b/Content.Client/Decals/DecalSystem.cs index 901ab270fb5..41e5f39c286 100644 --- a/Content.Client/Decals/DecalSystem.cs +++ b/Content.Client/Decals/DecalSystem.cs @@ -56,34 +56,43 @@ protected override void OnDecalRemoved(EntityUid gridId, uint decalId, DecalGrid private void OnHandleState(EntityUid gridUid, DecalGridComponent gridComp, ref ComponentHandleState args) { - if (args.Current is not DecalGridState state) - return; - // is this a delta or full state? _removedChunks.Clear(); + Dictionary modifiedChunks; - if (!state.FullState) + switch (args.Current) { - foreach (var key in gridComp.ChunkCollection.ChunkCollection.Keys) + case DecalGridDeltaState delta: { - if (!state.AllChunks!.Contains(key)) - _removedChunks.Add(key); + modifiedChunks = delta.ModifiedChunks; + foreach (var key in gridComp.ChunkCollection.ChunkCollection.Keys) + { + if (!delta.AllChunks.Contains(key)) + _removedChunks.Add(key); + } + + break; } - } - else - { - foreach (var key in gridComp.ChunkCollection.ChunkCollection.Keys) + case DecalGridState state: { - if (!state.Chunks.ContainsKey(key)) - _removedChunks.Add(key); + modifiedChunks = state.Chunks; + foreach (var key in gridComp.ChunkCollection.ChunkCollection.Keys) + { + if (!state.Chunks.ContainsKey(key)) + _removedChunks.Add(key); + } + + break; } + default: + return; } if (_removedChunks.Count > 0) RemoveChunks(gridUid, gridComp, _removedChunks); - if (state.Chunks.Count > 0) - UpdateChunks(gridUid, gridComp, state.Chunks); + if (modifiedChunks.Count > 0) + UpdateChunks(gridUid, gridComp, modifiedChunks); } private void OnChunkUpdate(DecalChunkUpdateEvent ev) diff --git a/Content.Client/Doors/FirelockSystem.cs b/Content.Client/Doors/FirelockSystem.cs index cfd84a47133..f64b4c8e522 100644 --- a/Content.Client/Doors/FirelockSystem.cs +++ b/Content.Client/Doors/FirelockSystem.cs @@ -1,9 +1,10 @@ using Content.Shared.Doors.Components; +using Content.Shared.Doors.Systems; using Robust.Client.GameObjects; namespace Content.Client.Doors; -public sealed class FirelockSystem : EntitySystem +public sealed class FirelockSystem : SharedFirelockSystem { [Dependency] private readonly SharedAppearanceSystem _appearanceSystem = default!; diff --git a/Content.Client/Examine/ExamineSystem.cs b/Content.Client/Examine/ExamineSystem.cs index 45db4efa53c..125ec62e492 100644 --- a/Content.Client/Examine/ExamineSystem.cs +++ b/Content.Client/Examine/ExamineSystem.cs @@ -239,8 +239,10 @@ public void OpenTooltip(EntityUid player, EntityUid target, bool centeredOnCurso if (knowTarget) { - var itemName = FormattedMessage.RemoveMarkup(Identity.Name(target, EntityManager, player)); - var labelMessage = FormattedMessage.FromMarkup($"[bold]{itemName}[/bold]"); + // TODO: FormattedMessage.RemoveMarkupPermissive + // var itemName = FormattedMessage.RemoveMarkupPermissive(Identity.Name(target, EntityManager, player)); + var itemName = FormattedMessage.FromMarkupPermissive(Identity.Name(target, EntityManager, player)).ToString(); + var labelMessage = FormattedMessage.FromMarkupPermissive($"[bold]{itemName}[/bold]"); var label = new RichTextLabel(); label.SetMessage(labelMessage); hBox.AddChild(label); diff --git a/Content.Client/Instruments/UI/InstrumentBoundUserInterface.cs b/Content.Client/Instruments/UI/InstrumentBoundUserInterface.cs index 2a846ff708a..0f5729f55b1 100644 --- a/Content.Client/Instruments/UI/InstrumentBoundUserInterface.cs +++ b/Content.Client/Instruments/UI/InstrumentBoundUserInterface.cs @@ -37,14 +37,8 @@ public InstrumentBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, u protected override void ReceiveMessage(BoundUserInterfaceMessage message) { - switch (message) - { - case InstrumentBandResponseBuiMessage bandRx: - _bandMenu?.Populate(bandRx.Nearby, EntMan); - break; - default: - break; - } + if (message is InstrumentBandResponseBuiMessage bandRx) + _bandMenu?.Populate(bandRx.Nearby, EntMan); } protected override void Open() diff --git a/Content.Client/Interactable/InteractionSystem.cs b/Content.Client/Interactable/InteractionSystem.cs index 0af8830e9ac..ff0a607920f 100644 --- a/Content.Client/Interactable/InteractionSystem.cs +++ b/Content.Client/Interactable/InteractionSystem.cs @@ -4,24 +4,6 @@ namespace Content.Client.Interactable { - public sealed class InteractionSystem : SharedInteractionSystem - { - [Dependency] private readonly SharedContainerSystem _container = default!; - - public override bool CanAccessViaStorage(EntityUid user, EntityUid target) - { - if (!EntityManager.EntityExists(target)) - return false; - - if (!_container.TryGetContainingContainer(target, out var container)) - return false; - - if (!HasComp(container.Owner)) - return false; - - // we don't check if the user can access the storage entity itself. This should be handed by the UI system. - // Need to return if UI is open or not - return true; - } - } + // TODO Remove Shared prefix + public sealed class InteractionSystem : SharedInteractionSystem; } diff --git a/Content.Client/Interaction/DragDropHelper.cs b/Content.Client/Interaction/DragDropHelper.cs index abe35bf6d9a..e453dfd74bf 100644 --- a/Content.Client/Interaction/DragDropHelper.cs +++ b/Content.Client/Interaction/DragDropHelper.cs @@ -73,11 +73,6 @@ public DragDropHelper(OnBeginDrag onBeginDrag, OnContinueDrag onContinueDrag, On _cfg.OnValueChanged(CCVars.DragDropDeadZone, SetDeadZone, true); } - ~DragDropHelper() - { - _cfg.UnsubValueChanged(CCVars.DragDropDeadZone, SetDeadZone); - } - /// /// Tell the helper that the mouse button was pressed down on /// a target, thus a drag has the possibility to begin for this target. diff --git a/Content.Client/Lobby/UI/ObserveWarningWindow.xaml b/Content.Client/Lobby/UI/ObserveWarningWindow.xaml index 3fe8e83f57d..2feac5792a1 100644 --- a/Content.Client/Lobby/UI/ObserveWarningWindow.xaml +++ b/Content.Client/Lobby/UI/ObserveWarningWindow.xaml @@ -4,10 +4,11 @@ [DataField("vowCooldown")] public TimeSpan VowCooldown = TimeSpan.FromMinutes(5); + + [DataField] + public ProtoId VowAlert = "VowOfSilence"; + + [DataField] + public ProtoId VowBrokenAlert = "VowBroken"; + } } diff --git a/Content.Server/Abilities/Mime/MimePowersSystem.cs b/Content.Server/Abilities/Mime/MimePowersSystem.cs index 629fe993448..f3bf6e703f5 100644 --- a/Content.Server/Abilities/Mime/MimePowersSystem.cs +++ b/Content.Server/Abilities/Mime/MimePowersSystem.cs @@ -1,5 +1,4 @@ using Content.Server.Popups; -using Content.Server.Speech.Muting; using Content.Shared.Actions; using Content.Shared.Actions.Events; using Content.Shared.Alert; @@ -54,7 +53,7 @@ public override void Update(float frameTime) private void OnComponentInit(EntityUid uid, MimePowersComponent component, ComponentInit args) { EnsureComp(uid); - _alertsSystem.ShowAlert(uid, AlertType.VowOfSilence); + _alertsSystem.ShowAlert(uid, component.VowAlert); _actionsSystem.AddAction(uid, ref component.InvisibleWallActionEntity, component.InvisibleWallAction, uid); } @@ -115,8 +114,8 @@ public void BreakVow(EntityUid uid, MimePowersComponent? mimePowers = null) mimePowers.VowBroken = true; mimePowers.VowRepentTime = _timing.CurTime + mimePowers.VowCooldown; RemComp(uid); - _alertsSystem.ClearAlert(uid, AlertType.VowOfSilence); - _alertsSystem.ShowAlert(uid, AlertType.VowBroken); + _alertsSystem.ClearAlert(uid, mimePowers.VowAlert); + _alertsSystem.ShowAlert(uid, mimePowers.VowBrokenAlert); _actionsSystem.RemoveAction(uid, mimePowers.InvisibleWallActionEntity); } @@ -138,8 +137,8 @@ public void RetakeVow(EntityUid uid, MimePowersComponent? mimePowers = null) mimePowers.ReadyToRepent = false; mimePowers.VowBroken = false; AddComp(uid); - _alertsSystem.ClearAlert(uid, AlertType.VowBroken); - _alertsSystem.ShowAlert(uid, AlertType.VowOfSilence); + _alertsSystem.ClearAlert(uid, mimePowers.VowAlert); + _alertsSystem.ShowAlert(uid, mimePowers.VowBrokenAlert); _actionsSystem.AddAction(uid, ref mimePowers.InvisibleWallActionEntity, mimePowers.InvisibleWallAction, uid); } } diff --git a/Content.Server/Access/Systems/IdCardConsoleSystem.cs b/Content.Server/Access/Systems/IdCardConsoleSystem.cs index e66a3c898eb..759e5ee2f0c 100644 --- a/Content.Server/Access/Systems/IdCardConsoleSystem.cs +++ b/Content.Server/Access/Systems/IdCardConsoleSystem.cs @@ -142,6 +142,8 @@ private void TryWriteToTargetId(EntityUid uid, // Sunrise-End } + UpdateStationRecord(uid, targetId, newFullName, newJobTitle, job); + if (!newAccessList.TrueForAll(x => component.AccessLevels.Contains(x))) { _sawmill.Warning($"User {ToPrettyString(uid)} tried to write unknown access tag."); @@ -175,8 +177,6 @@ private void TryWriteToTargetId(EntityUid uid, This current implementation is pretty shit as it logs 27 entries (27 lines) if someone decides to give themselves AA*/ _adminLogger.Add(LogType.Action, LogImpact.Medium, $"{ToPrettyString(player):player} has modified {ToPrettyString(targetId):entity} with the following accesses: [{string.Join(", ", addedTags.Union(removedTags))}] [{string.Join(", ", newAccessList)}]"); - - UpdateStationRecord(uid, targetId, newFullName, newJobTitle, job); } /// diff --git a/Content.Server/Alert/Commands/ClearAlert.cs b/Content.Server/Alert/Commands/ClearAlert.cs index 73a6ca52c70..2e317de7547 100644 --- a/Content.Server/Alert/Commands/ClearAlert.cs +++ b/Content.Server/Alert/Commands/ClearAlert.cs @@ -40,13 +40,13 @@ public void Execute(IConsoleShell shell, string argStr, string[] args) var alertType = args[0]; var alertsSystem = _e.System(); - if (!alertsSystem.TryGet(Enum.Parse(alertType), out var alert)) + if (!alertsSystem.TryGet(alertType, out var alert)) { shell.WriteLine("unrecognized alertType " + alertType); return; } - alertsSystem.ClearAlert(attachedEntity, alert.AlertType); + alertsSystem.ClearAlert(attachedEntity, alert.ID); } } } diff --git a/Content.Server/Alert/Commands/ShowAlert.cs b/Content.Server/Alert/Commands/ShowAlert.cs index f37ab23f2fa..cae24ff3360 100644 --- a/Content.Server/Alert/Commands/ShowAlert.cs +++ b/Content.Server/Alert/Commands/ShowAlert.cs @@ -41,7 +41,7 @@ public void Execute(IConsoleShell shell, string argStr, string[] args) var alertType = args[0]; var severity = args[1]; var alertsSystem = _e.System(); - if (!alertsSystem.TryGet(Enum.Parse(alertType), out var alert)) + if (!alertsSystem.TryGet(alertType, out var alert)) { shell.WriteLine("unrecognized alertType " + alertType); return; @@ -53,7 +53,7 @@ public void Execute(IConsoleShell shell, string argStr, string[] args) } short? severity1 = sevint == -1 ? null : sevint; - alertsSystem.ShowAlert(attachedEntity, alert.AlertType, severity1, null); + alertsSystem.ShowAlert(attachedEntity, alert.ID, severity1, null); } } } diff --git a/Content.Server/Anomaly/AnomalySystem.cs b/Content.Server/Anomaly/AnomalySystem.cs index 73658a0320e..3e9760a056c 100644 --- a/Content.Server/Anomaly/AnomalySystem.cs +++ b/Content.Server/Anomaly/AnomalySystem.cs @@ -18,8 +18,6 @@ using Robust.Shared.Physics.Events; using Robust.Shared.Prototypes; using Robust.Shared.Random; -using Robust.Shared.Serialization.Manager; -using System.Linq; namespace Content.Server.Anomaly; @@ -69,20 +67,21 @@ private void OnMapInit(Entity anomaly, ref MapInitEvent args) ChangeAnomalyStability(anomaly, Random.NextFloat(anomaly.Comp.InitialStabilityRange.Item1 , anomaly.Comp.InitialStabilityRange.Item2), anomaly.Comp); ChangeAnomalySeverity(anomaly, Random.NextFloat(anomaly.Comp.InitialSeverityRange.Item1, anomaly.Comp.InitialSeverityRange.Item2), anomaly.Comp); - ShuffleParticlesEffect(anomaly.Comp); + ShuffleParticlesEffect(anomaly); anomaly.Comp.Continuity = _random.NextFloat(anomaly.Comp.MinContituty, anomaly.Comp.MaxContituty); SetBehavior(anomaly, GetRandomBehavior()); } - public void ShuffleParticlesEffect(AnomalyComponent anomaly) + public void ShuffleParticlesEffect(Entity anomaly) { var particles = new List { AnomalousParticleType.Delta, AnomalousParticleType.Epsilon, AnomalousParticleType.Zeta, AnomalousParticleType.Sigma }; - anomaly.SeverityParticleType = Random.PickAndTake(particles); - anomaly.DestabilizingParticleType = Random.PickAndTake(particles); - anomaly.WeakeningParticleType = Random.PickAndTake(particles); - anomaly.TransformationParticleType = Random.PickAndTake(particles); + anomaly.Comp.SeverityParticleType = Random.PickAndTake(particles); + anomaly.Comp.DestabilizingParticleType = Random.PickAndTake(particles); + anomaly.Comp.WeakeningParticleType = Random.PickAndTake(particles); + anomaly.Comp.TransformationParticleType = Random.PickAndTake(particles); + Dirty(anomaly); } private void OnShutdown(Entity anomaly, ref ComponentShutdown args) @@ -198,14 +197,12 @@ private void SetBehavior(Entity anomaly, ProtoId anomaly, ProtoId behaviorProto) @@ -213,7 +210,7 @@ private void RemoveBehavior(Entity anomaly, ProtoId(OnStartCollide); } - private void OnStartCollide(EntityUid uid, ShuffleParticlesAnomalyComponent shuffle, StartCollideEvent args) + private void OnStartCollide(Entity ent, ref StartCollideEvent args) { - if (!TryComp(uid, out var anomaly)) + if (!TryComp(ent, out var anomaly)) return; - if (shuffle.ShuffleOnParticleHit && _random.Prob(shuffle.Prob)) - _anomaly.ShuffleParticlesEffect(anomaly); - - if (!TryComp(args.OtherEntity, out var particle)) + if (!HasComp(args.OtherEntity)) return; + + if (ent.Comp.ShuffleOnParticleHit && _random.Prob(ent.Comp.Prob)) + _anomaly.ShuffleParticlesEffect((ent, anomaly)); } - private void OnPulse(EntityUid uid, ShuffleParticlesAnomalyComponent shuffle, AnomalyPulseEvent args) + private void OnPulse(Entity ent, ref AnomalyPulseEvent args) { - if (!TryComp(uid, out var anomaly)) + if (!TryComp(ent, out var anomaly)) return; - if (shuffle.ShuffleOnPulse && _random.Prob(shuffle.Prob)) + if (ent.Comp.ShuffleOnPulse && _random.Prob(ent.Comp.Prob)) { - _anomaly.ShuffleParticlesEffect(anomaly); + _anomaly.ShuffleParticlesEffect((ent, anomaly)); } } } diff --git a/Content.Server/Antag/AntagObjectivesSystem.cs b/Content.Server/Antag/AntagObjectivesSystem.cs new file mode 100644 index 00000000000..5aa31f66f67 --- /dev/null +++ b/Content.Server/Antag/AntagObjectivesSystem.cs @@ -0,0 +1,35 @@ +using Content.Server.Antag.Components; +using Content.Server.Objectives; +using Content.Shared.Mind; +using Content.Shared.Objectives.Systems; + +namespace Content.Server.Antag; + +/// +/// Adds fixed objectives to an antag made with AntagObjectivesComponent. +/// +public sealed class AntagObjectivesSystem : EntitySystem +{ + [Dependency] private readonly SharedMindSystem _mind = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnAntagSelected); + } + + private void OnAntagSelected(Entity ent, ref AfterAntagEntitySelectedEvent args) + { + if (!_mind.TryGetMind(args.Session, out var mindId, out var mind)) + { + Log.Error($"Antag {ToPrettyString(args.EntityUid):player} was selected by {ToPrettyString(ent):rule} but had no mind attached!"); + return; + } + + foreach (var id in ent.Comp.Objectives) + { + _mind.TryAddObjective(mindId, mind, id); + } + } +} diff --git a/Content.Server/Antag/AntagRandomObjectivesSystem.cs b/Content.Server/Antag/AntagRandomObjectivesSystem.cs new file mode 100644 index 00000000000..c935b8c0648 --- /dev/null +++ b/Content.Server/Antag/AntagRandomObjectivesSystem.cs @@ -0,0 +1,52 @@ +using Content.Server.Antag.Components; +using Content.Server.Objectives; +using Content.Shared.Mind; +using Content.Shared.Objectives.Components; +using Content.Shared.Objectives.Systems; +using Robust.Shared.Random; + +namespace Content.Server.Antag; + +/// +/// Adds fixed objectives to an antag made with AntagRandomObjectivesComponent. +/// +public sealed class AntagRandomObjectivesSystem : EntitySystem +{ + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly SharedMindSystem _mind = default!; + [Dependency] private readonly ObjectivesSystem _objectives = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnAntagSelected); + } + + private void OnAntagSelected(Entity ent, ref AfterAntagEntitySelectedEvent args) + { + if (!_mind.TryGetMind(args.Session, out var mindId, out var mind)) + { + Log.Error($"Antag {ToPrettyString(args.EntityUid):player} was selected by {ToPrettyString(ent):rule} but had no mind attached!"); + return; + } + + var difficulty = 0f; + foreach (var set in ent.Comp.Sets) + { + if (!_random.Prob(set.Prob)) + continue; + + for (var pick = 0; pick < set.MaxPicks && ent.Comp.MaxDifficulty > difficulty; pick++) + { + if (_objectives.GetRandomObjective(mindId, mind, set.Groups) is not {} objective) + continue; + + _mind.AddObjective(mindId, mind, objective); + var adding = Comp(objective).Difficulty; + difficulty += adding; + Log.Debug($"Added objective {ToPrettyString(objective):objective} to {ToPrettyString(args.EntityUid):player} with {adding} difficulty"); + } + } + } +} diff --git a/Content.Server/Antag/AntagSelectionSystem.API.cs b/Content.Server/Antag/AntagSelectionSystem.API.cs index 6acd17a35b2..16d83c4f3fc 100644 --- a/Content.Server/Antag/AntagSelectionSystem.API.cs +++ b/Content.Server/Antag/AntagSelectionSystem.API.cs @@ -27,6 +27,11 @@ public bool TryGetNextAvailableDefinition(Entity ent, if (mindCount >= totalTargetCount) return false; + // TODO ANTAG fix this + // If here are two definitions with 1/10 and 10/10 slots filled, this will always return the second definition + // even though it has already met its target + // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA I fucking hate game ticker code. + // It needs to track selected minds for each definition independently. foreach (var def in ent.Comp.Definitions) { var target = GetTargetAntagCount(ent, null, def); @@ -47,12 +52,26 @@ public bool TryGetNextAvailableDefinition(Entity ent, /// Gets the number of antagonists that should be present for a given rule based on the provided pool. /// A null pool will simply use the player count. /// - public int GetTargetAntagCount(Entity ent, AntagSelectionPlayerPool? pool = null) + public int GetTargetAntagCount(Entity ent, int? playerCount = null) { var count = 0; foreach (var def in ent.Comp.Definitions) { - count += GetTargetAntagCount(ent, pool, def); + count += GetTargetAntagCount(ent, playerCount, def); + } + + return count; + } + + public int GetTotalPlayerCount(IList pool) + { + var count = 0; + foreach (var session in pool) + { + if (session.Status is SessionStatus.Disconnected or SessionStatus.Zombie) + continue; + + count++; } return count; @@ -62,10 +81,13 @@ public int GetTargetAntagCount(Entity ent, AntagSelecti /// Gets the number of antagonists that should be present for a given antag definition based on the provided pool. /// A null pool will simply use the player count. /// - public int GetTargetAntagCount(Entity ent, AntagSelectionPlayerPool? pool, AntagSelectionDefinition def) + public int GetTargetAntagCount(Entity ent, int? playerCount, AntagSelectionDefinition def) { - var poolSize = pool?.Count ?? _playerManager.Sessions - .Count(s => s.State.Status is not SessionStatus.Disconnected and not SessionStatus.Zombie); + // TODO ANTAG + // make pool non-nullable + // Review uses and ensure that people are INTENTIONALLY including players in the lobby if this is a mid-round + // antag selection. + var poolSize = playerCount ?? GetTotalPlayerCount(_playerManager.Sessions); // factor in other definitions' affect on the count. var countOffset = 0; @@ -124,7 +146,7 @@ public List> GetAntagMinds(Entity - /// Helper specifically for + /// Helper to get just the mind entities and not names. /// public List GetAntagMindEntityUids(Entity ent) { diff --git a/Content.Server/Antag/AntagSelectionSystem.cs b/Content.Server/Antag/AntagSelectionSystem.cs index 57df82d6fd9..b42831cbde8 100644 --- a/Content.Server/Antag/AntagSelectionSystem.cs +++ b/Content.Server/Antag/AntagSelectionSystem.cs @@ -7,12 +7,14 @@ using Content.Server.Ghost.Roles; using Content.Server.Ghost.Roles.Components; using Content.Server.Mind; +using Content.Server.Objectives; using Content.Server.Preferences.Managers; using Content.Server.Roles; using Content.Server.Roles.Jobs; using Content.Server.Shuttles.Components; using Content.Server.Station.Systems; using Content.Shared.Antag; +using Content.Shared.GameTicking; using Content.Shared.Ghost; using Content.Shared.Humanoid; using Content.Shared.Players; @@ -24,6 +26,7 @@ using Robust.Shared.Map; using Robust.Shared.Player; using Robust.Shared.Random; +using Robust.Shared.Utility; namespace Content.Server.Antag; @@ -50,6 +53,8 @@ public override void Initialize() SubscribeLocalEvent(OnTakeGhostRole); + SubscribeLocalEvent(OnObjectivesTextGetInfo); + SubscribeLocalEvent(OnPlayerSpawning); SubscribeLocalEvent(OnJobsAssigned); SubscribeLocalEvent(OnSpawnComplete); @@ -82,10 +87,9 @@ private void OnPlayerSpawning(RulePlayerSpawningEvent args) continue; if (comp.SelectionsComplete) - return; + continue; ChooseAntags((uid, comp), pool); - comp.SelectionsComplete = true; foreach (var session in comp.SelectedSessions) { @@ -103,11 +107,7 @@ private void OnJobsAssigned(RulePlayerJobsAssignedEvent args) if (comp.SelectionTime != AntagSelectionTime.PostPlayerSpawn) continue; - if (comp.SelectionsComplete) - continue; - - ChooseAntags((uid, comp)); - comp.SelectionsComplete = true; + ChooseAntags((uid, comp), args.Players); } } @@ -123,12 +123,18 @@ private void OnSpawnComplete(PlayerSpawnCompleteEvent args) var query = QueryActiveRules(); while (query.MoveNext(out var uid, out _, out var antag, out _)) { + // TODO ANTAG + // what why aasdiuhasdopiuasdfhksad + // stop this insanity please + // probability of antag assignment shouldn't depend on the order in which rules are returned by the query. if (!RobustRandom.Prob(LateJoinRandomChance)) continue; if (!antag.Definitions.Any(p => p.LateJoinAdditional)) continue; + DebugTools.AssertEqual(antag.SelectionTime, AntagSelectionTime.PostPlayerSpawn); + if (!TryGetNextAvailableDefinition((uid, antag), out var def)) continue; @@ -161,57 +167,62 @@ protected override void Started(EntityUid uid, AntagSelectionComponent component { base.Started(uid, component, gameRule, args); - if (component.SelectionsComplete) - return; - + // If the round has not yet started, we defer antag selection until roundstart if (GameTicker.RunLevel != GameRunLevel.InRound) return; - if (GameTicker.RunLevel == GameRunLevel.InRound && component.SelectionTime == AntagSelectionTime.PrePlayerSpawn) + if (component.SelectionsComplete) return; - ChooseAntags((uid, component)); - component.SelectionsComplete = true; - } + var players = _playerManager.Sessions + .Where(x => GameTicker.PlayerGameStatuses[x.UserId] == PlayerGameStatus.JoinedGame) + .ToList(); - /// - /// Chooses antagonists from the current selection of players - /// - public void ChooseAntags(Entity ent) - { - var sessions = _playerManager.Sessions.ToList(); - ChooseAntags(ent, sessions); + ChooseAntags((uid, component), players); } /// /// Chooses antagonists from the given selection of players /// - public void ChooseAntags(Entity ent, List pool) + public void ChooseAntags(Entity ent, IList pool) { + if (ent.Comp.SelectionsComplete) + return; + foreach (var def in ent.Comp.Definitions) { ChooseAntags(ent, pool, def); } + + ent.Comp.SelectionsComplete = true; } /// /// Chooses antagonists from the given selection of players for the given antag definition. /// - public void ChooseAntags(Entity ent, List pool, AntagSelectionDefinition def) + public void ChooseAntags(Entity ent, IList pool, AntagSelectionDefinition def) { var playerPool = GetPlayerPool(ent, pool, def); - var count = GetTargetAntagCount(ent, playerPool, def); + var count = GetTargetAntagCount(ent, GetTotalPlayerCount(pool), def); + // if there is both a spawner and players getting picked, let it fall back to a spawner. + var noSpawner = def.SpawnerPrototype == null; for (var i = 0; i < count; i++) { var session = (ICommonSession?) null; if (def.PickPlayer) { - if (!playerPool.TryPickAndTake(RobustRandom, out session)) + if (!playerPool.TryPickAndTake(RobustRandom, out session) && noSpawner) + { + Log.Warning($"Couldn't pick a player for {ToPrettyString(ent):rule}, no longer choosing antags for this definition"); break; + } - if (ent.Comp.SelectedSessions.Contains(session)) + if (session != null && ent.Comp.SelectedSessions.Contains(session)) + { + Log.Warning($"Somehow picked {session} for an antag when this rule already selected them previously"); continue; + } } MakeAntag(ent, session, def); @@ -321,20 +332,15 @@ public void MakeAntag(Entity ent, ICommonSession? sessi /// /// Gets an ordered player pool based on player preferences and the antagonist definition. /// - public AntagSelectionPlayerPool GetPlayerPool(Entity ent, List sessions, AntagSelectionDefinition def) + public AntagSelectionPlayerPool GetPlayerPool(Entity ent, IList sessions, AntagSelectionDefinition def) { var preferredList = new List(); var fallbackList = new List(); - var unwantedList = new List(); - var invalidList = new List(); foreach (var session in sessions) { if (!IsSessionValid(ent, session, def) || !IsEntityValid(session.AttachedEntity, def)) - { - invalidList.Add(session); continue; - } var pref = (HumanoidCharacterProfile) _pref.GetPreferences(session.UserId).SelectedCharacter; if (def.PrefRoles.Count != 0 && pref.AntagPreferences.Any(p => def.PrefRoles.Contains(p))) @@ -345,13 +351,9 @@ public AntagSelectionPlayerPool GetPlayerPool(Entity en { fallbackList.Add(session); } - else - { - unwantedList.Add(session); - } } - return new AntagSelectionPlayerPool(new() { preferredList, fallbackList, unwantedList, invalidList }); + return new AntagSelectionPlayerPool(new() { preferredList, fallbackList }); } /// @@ -362,14 +364,18 @@ public bool IsSessionValid(Entity ent, ICommonSession? if (session == null) return true; - mind ??= session.GetMind(); - if (session.Status is SessionStatus.Disconnected or SessionStatus.Zombie) return false; if (ent.Comp.SelectedSessions.Contains(session)) return false; + mind ??= session.GetMind(); + + // If the player has not spawned in as any entity (e.g., in the lobby), they can be given an antag role/entity. + if (mind == null) + return true; + //todo: we need some way to check that we're not getting the same role twice. (double picking thieves or zombies through midrounds) switch (def.MultiAntagSetting) @@ -398,10 +404,11 @@ public bool IsSessionValid(Entity ent, ICommonSession? /// /// Checks if a given entity (mind/session not included) is valid for a given antagonist. /// - private bool IsEntityValid(EntityUid? entity, AntagSelectionDefinition def) + public bool IsEntityValid(EntityUid? entity, AntagSelectionDefinition def) { + // If the player has not spawned in as any entity (e.g., in the lobby), they can be given an antag role/entity. if (entity == null) - return false; + return true; if (HasComp(entity)) return false; @@ -423,6 +430,15 @@ private bool IsEntityValid(EntityUid? entity, AntagSelectionDefinition def) return true; } + + private void OnObjectivesTextGetInfo(Entity ent, ref ObjectivesTextGetInfoEvent args) + { + if (ent.Comp.AgentName is not {} name) + return; + + args.Minds = ent.Comp.SelectedMinds; + args.AgentName = Loc.GetString(name); + } } /// diff --git a/Content.Server/Antag/Components/AntagObjectivesComponent.cs b/Content.Server/Antag/Components/AntagObjectivesComponent.cs new file mode 100644 index 00000000000..357c138f46b --- /dev/null +++ b/Content.Server/Antag/Components/AntagObjectivesComponent.cs @@ -0,0 +1,18 @@ +using Content.Server.Antag; +using Content.Shared.Objectives.Components; +using Robust.Shared.Prototypes; + +namespace Content.Server.Antag.Components; + +/// +/// Gives antags selected by this rule a fixed list of objectives. +/// +[RegisterComponent, Access(typeof(AntagObjectivesSystem))] +public sealed partial class AntagObjectivesComponent : Component +{ + /// + /// List of static objectives to give. + /// + [DataField(required: true)] + public List> Objectives = new(); +} diff --git a/Content.Server/Antag/Components/AntagRandomObjectivesComponent.cs b/Content.Server/Antag/Components/AntagRandomObjectivesComponent.cs new file mode 100644 index 00000000000..9a551acc499 --- /dev/null +++ b/Content.Server/Antag/Components/AntagRandomObjectivesComponent.cs @@ -0,0 +1,52 @@ +using Content.Server.Antag; +using Content.Shared.Random; +using Robust.Shared.Prototypes; + +namespace Content.Server.Antag.Components; + +/// +/// Gives antags selected by this rule a random list of objectives. +/// +[RegisterComponent, Access(typeof(AntagRandomObjectivesSystem))] +public sealed partial class AntagRandomObjectivesComponent : Component +{ + /// + /// Each set of objectives to add. + /// + [DataField(required: true)] + public List Sets = new(); + + /// + /// If the total difficulty of the currently given objectives exceeds, no more will be given. + /// + [DataField(required: true)] + public float MaxDifficulty; +} + +/// +/// A set of objectives to try picking. +/// Difficulty is checked over all sets, but each set has its own probability and pick count. +/// +[DataRecord] +public record struct AntagObjectiveSet() +{ + /// + /// The grouping used by the objective system to pick random objectives. + /// First a group is picked from these, then an objective from that group. + /// + [DataField(required: true)] + public ProtoId Groups = string.Empty; + + /// + /// Probability of this set being used. + /// + [DataField] + public float Prob = 1f; + + /// + /// Number of times to try picking objectives from this set. + /// Even if there is enough difficulty remaining, no more will be given after this. + /// + [DataField] + public int MaxPicks = 20; +} diff --git a/Content.Server/Antag/Components/AntagSelectionComponent.cs b/Content.Server/Antag/Components/AntagSelectionComponent.cs index 096be14049a..f70c27d12f2 100644 --- a/Content.Server/Antag/Components/AntagSelectionComponent.cs +++ b/Content.Server/Antag/Components/AntagSelectionComponent.cs @@ -42,6 +42,13 @@ public sealed partial class AntagSelectionComponent : Component /// Is not serialized. /// public HashSet SelectedSessions = new(); + + /// + /// Locale id for the name of the antag. + /// If this is set then the antag is listed in the round-end summary. + /// + [DataField] + public LocId? AgentName; } [DataDefinition] @@ -97,6 +104,7 @@ public partial struct AntagSelectionDefinition() /// /// Whether or not players should be picked to inhabit this antag or not. + /// If no players are left and is set, it will make a ghost role. /// [DataField] public bool PickPlayer = true; diff --git a/Content.Server/Atmos/Components/BarotraumaComponent.cs b/Content.Server/Atmos/Components/BarotraumaComponent.cs index 4e29699872e..d261c5ab030 100644 --- a/Content.Server/Atmos/Components/BarotraumaComponent.cs +++ b/Content.Server/Atmos/Components/BarotraumaComponent.cs @@ -1,5 +1,7 @@ +using Content.Shared.Alert; using Content.Shared.Damage; using Content.Shared.FixedPoint; +using Robust.Shared.Prototypes; namespace Content.Server.Atmos.Components { @@ -46,5 +48,13 @@ public sealed partial class BarotraumaComponent : Component [ViewVariables(VVAccess.ReadWrite)] public bool HasImmunity = false; + [DataField] + public ProtoId HighPressureAlert = "HighPressure"; + + [DataField] + public ProtoId LowPressureAlert = "LowPressure"; + + [DataField] + public ProtoId PressureAlertCategory = "Pressure"; } } diff --git a/Content.Server/Atmos/Components/FlammableComponent.cs b/Content.Server/Atmos/Components/FlammableComponent.cs index e00f5efbdc5..9ae99a15136 100644 --- a/Content.Server/Atmos/Components/FlammableComponent.cs +++ b/Content.Server/Atmos/Components/FlammableComponent.cs @@ -1,5 +1,7 @@ +using Content.Shared.Alert; using Content.Shared.Damage; using Robust.Shared.Physics.Collision.Shapes; +using Robust.Shared.Prototypes; namespace Content.Server.Atmos.Components { @@ -77,5 +79,8 @@ public sealed partial class FlammableComponent : Component /// [DataField, ViewVariables(VVAccess.ReadWrite)] public float FirestackFade = -0.1f; + + [DataField] + public ProtoId FireAlert = "Fire"; } } diff --git a/Content.Server/Atmos/Components/PipeRestrictOverlapComponent.cs b/Content.Server/Atmos/Components/PipeRestrictOverlapComponent.cs new file mode 100644 index 00000000000..49e1a8c94d3 --- /dev/null +++ b/Content.Server/Atmos/Components/PipeRestrictOverlapComponent.cs @@ -0,0 +1,9 @@ +using Content.Server.Atmos.EntitySystems; + +namespace Content.Server.Atmos.Components; + +/// +/// This is used for restricting anchoring pipes so that they do not overlap. +/// +[RegisterComponent, Access(typeof(PipeRestrictOverlapSystem))] +public sealed partial class PipeRestrictOverlapComponent : Component; diff --git a/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs b/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs index 98a5ffa70a8..ec508790ba8 100644 --- a/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs +++ b/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs @@ -245,7 +245,7 @@ public override void Update(float frameTime) _adminLogger.Add(LogType.Barotrauma, $"{ToPrettyString(uid):entity} started taking low pressure damage"); } - _alertsSystem.ShowAlert(uid, AlertType.LowPressure, 2); + _alertsSystem.ShowAlert(uid, barotrauma.LowPressureAlert, 2); } else if (pressure >= Atmospherics.HazardHighPressure) { @@ -260,7 +260,7 @@ public override void Update(float frameTime) _adminLogger.Add(LogType.Barotrauma, $"{ToPrettyString(uid):entity} started taking high pressure damage"); } - _alertsSystem.ShowAlert(uid, AlertType.HighPressure, 2); + _alertsSystem.ShowAlert(uid, barotrauma.HighPressureAlert, 2); } else { @@ -275,13 +275,13 @@ public override void Update(float frameTime) switch (pressure) { case <= Atmospherics.WarningLowPressure: - _alertsSystem.ShowAlert(uid, AlertType.LowPressure, 1); + _alertsSystem.ShowAlert(uid, barotrauma.LowPressureAlert, 1); break; case >= Atmospherics.WarningHighPressure: - _alertsSystem.ShowAlert(uid, AlertType.HighPressure, 1); + _alertsSystem.ShowAlert(uid, barotrauma.HighPressureAlert, 1); break; default: - _alertsSystem.ClearAlertCategory(uid, AlertCategory.Pressure); + _alertsSystem.ClearAlertCategory(uid, barotrauma.PressureAlertCategory); break; } } diff --git a/Content.Server/Atmos/EntitySystems/FlammableSystem.cs b/Content.Server/Atmos/EntitySystems/FlammableSystem.cs index 4a8cbbdc884..b6e26435a75 100644 --- a/Content.Server/Atmos/EntitySystems/FlammableSystem.cs +++ b/Content.Server/Atmos/EntitySystems/FlammableSystem.cs @@ -415,11 +415,11 @@ public override void Update(float frameTime) if (!flammable.OnFire) { - _alertsSystem.ClearAlert(uid, AlertType.Fire); + _alertsSystem.ClearAlert(uid, flammable.FireAlert); continue; } - _alertsSystem.ShowAlert(uid, AlertType.Fire); + _alertsSystem.ShowAlert(uid, flammable.FireAlert); if (flammable.FireStacks > 0) { @@ -447,7 +447,7 @@ public override void Update(float frameTime) _damageableSystem.TryChangeDamage(uid, flammable.Damage * flammable.FireStacks * ev.Multiplier, interruptsDoAfters: false); - AdjustFireStacks(uid, flammable.FirestackFade * (flammable.Resisting ? 10f : 1f), flammable); + AdjustFireStacks(uid, flammable.FirestackFade * (flammable.Resisting ? 10f : 1f), flammable, flammable.OnFire); } else { diff --git a/Content.Server/Atmos/EntitySystems/PipeRestrictOverlapSystem.cs b/Content.Server/Atmos/EntitySystems/PipeRestrictOverlapSystem.cs new file mode 100644 index 00000000000..c2ff87ca79c --- /dev/null +++ b/Content.Server/Atmos/EntitySystems/PipeRestrictOverlapSystem.cs @@ -0,0 +1,123 @@ +using System.Linq; +using Content.Server.Atmos.Components; +using Content.Server.NodeContainer; +using Content.Server.NodeContainer.Nodes; +using Content.Server.Popups; +using Content.Shared.Atmos; +using Content.Shared.Construction.Components; +using JetBrains.Annotations; +using Robust.Server.GameObjects; +using Robust.Shared.Map.Components; + +namespace Content.Server.Atmos.EntitySystems; + +/// +/// This handles restricting pipe-based entities from overlapping outlets/inlets with other entities. +/// +public sealed class PipeRestrictOverlapSystem : EntitySystem +{ + [Dependency] private readonly MapSystem _map = default!; + [Dependency] private readonly PopupSystem _popup = default!; + [Dependency] private readonly TransformSystem _xform = default!; + + private readonly List _anchoredEntities = new(); + private EntityQuery _nodeContainerQuery; + + /// + public override void Initialize() + { + SubscribeLocalEvent(OnAnchorStateChanged); + SubscribeLocalEvent(OnAnchorAttempt); + + _nodeContainerQuery = GetEntityQuery(); + } + + private void OnAnchorStateChanged(Entity ent, ref AnchorStateChangedEvent args) + { + if (!args.Anchored) + return; + + if (HasComp(ent) && CheckOverlap(ent)) + { + _popup.PopupEntity(Loc.GetString("pipe-restrict-overlap-popup-blocked", ("pipe", ent.Owner)), ent); + _xform.Unanchor(ent, Transform(ent)); + } + } + + private void OnAnchorAttempt(Entity ent, ref AnchorAttemptEvent args) + { + if (args.Cancelled) + return; + + if (!_nodeContainerQuery.TryComp(ent, out var node)) + return; + + var xform = Transform(ent); + if (CheckOverlap((ent, node, xform))) + { + _popup.PopupEntity(Loc.GetString("pipe-restrict-overlap-popup-blocked", ("pipe", ent.Owner)), ent, args.User); + args.Cancel(); + } + } + + [PublicAPI] + public bool CheckOverlap(EntityUid uid) + { + if (!_nodeContainerQuery.TryComp(uid, out var node)) + return false; + + return CheckOverlap((uid, node, Transform(uid))); + } + + public bool CheckOverlap(Entity ent) + { + if (ent.Comp2.GridUid is not { } grid || !TryComp(grid, out var gridComp)) + return false; + + var indices = _map.TileIndicesFor(grid, gridComp, ent.Comp2.Coordinates); + _anchoredEntities.Clear(); + _map.GetAnchoredEntities((grid, gridComp), indices, _anchoredEntities); + + foreach (var otherEnt in _anchoredEntities) + { + // this should never actually happen but just for safety + if (otherEnt == ent.Owner) + continue; + + if (!_nodeContainerQuery.TryComp(otherEnt, out var otherComp)) + continue; + + if (PipeNodesOverlap(ent, (otherEnt, otherComp, Transform(otherEnt)))) + return true; + } + + return false; + } + + public bool PipeNodesOverlap(Entity ent, Entity other) + { + var entDirs = GetAllDirections(ent).ToList(); + var otherDirs = GetAllDirections(other).ToList(); + + foreach (var dir in entDirs) + { + foreach (var otherDir in otherDirs) + { + if ((dir & otherDir) != 0) + return true; + } + } + + return false; + + IEnumerable GetAllDirections(Entity pipe) + { + foreach (var node in pipe.Comp1.Nodes.Values) + { + // we need to rotate the pipe manually like this because the rotation doesn't update for pipes that are unanchored. + if (node is PipeNode pipeNode) + yield return pipeNode.OriginalPipeDirection.RotatePipeDirection(pipe.Comp2.LocalRotation); + } + } + } +} diff --git a/Content.Server/Atmos/Piping/Unary/Components/GasVentPumpComponent.cs b/Content.Server/Atmos/Piping/Unary/Components/GasVentPumpComponent.cs index 74d945a0b60..32cf1cac6f8 100644 --- a/Content.Server/Atmos/Piping/Unary/Components/GasVentPumpComponent.cs +++ b/Content.Server/Atmos/Piping/Unary/Components/GasVentPumpComponent.cs @@ -40,7 +40,7 @@ public sealed partial class GasVentPumpComponent : Component /// [ViewVariables(VVAccess.ReadWrite)] [DataField("underPressureLockoutThreshold")] - public float UnderPressureLockoutThreshold = 2; + public float UnderPressureLockoutThreshold = 60; // this must be tuned in conjunction with atmos.mmos_spacing_speed /// /// Pressure locked vents still leak a little (leading to eventual pressurization of sealed sections) diff --git a/Content.Server/Body/Components/BloodstreamComponent.cs b/Content.Server/Body/Components/BloodstreamComponent.cs index 1d8aa9ffd3d..a6d2afab219 100644 --- a/Content.Server/Body/Components/BloodstreamComponent.cs +++ b/Content.Server/Body/Components/BloodstreamComponent.cs @@ -1,5 +1,6 @@ using Content.Server.Body.Systems; using Content.Server.Chemistry.EntitySystems; +using Content.Shared.Alert; using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.Reagent; using Content.Shared.Damage; @@ -171,5 +172,8 @@ public sealed partial class BloodstreamComponent : Component /// [ViewVariables(VVAccess.ReadWrite)] public TimeSpan StatusTime; + + [DataField] + public ProtoId BleedingAlert = "Bleed"; } } diff --git a/Content.Server/Body/Components/InternalsComponent.cs b/Content.Server/Body/Components/InternalsComponent.cs index 18caab8dcf0..098f1789218 100644 --- a/Content.Server/Body/Components/InternalsComponent.cs +++ b/Content.Server/Body/Components/InternalsComponent.cs @@ -1,3 +1,6 @@ +using Content.Shared.Alert; +using Robust.Shared.Prototypes; + namespace Content.Server.Body.Components { /// @@ -18,5 +21,8 @@ public sealed partial class InternalsComponent : Component [ViewVariables(VVAccess.ReadWrite)] [DataField] public TimeSpan Delay = TimeSpan.FromSeconds(3); + + [DataField] + public ProtoId InternalsAlert = "Internals"; } } diff --git a/Content.Server/Body/Components/LungComponent.cs b/Content.Server/Body/Components/LungComponent.cs index 46600b30207..72af4d9e63a 100644 --- a/Content.Server/Body/Components/LungComponent.cs +++ b/Content.Server/Body/Components/LungComponent.cs @@ -1,8 +1,8 @@ -using Content.Server.Atmos; using Content.Server.Body.Systems; using Content.Shared.Alert; using Content.Shared.Atmos; using Content.Shared.Chemistry.Components; +using Robust.Shared.Prototypes; namespace Content.Server.Body.Components; @@ -33,5 +33,5 @@ public sealed partial class LungComponent : Component /// The type of gas this lung needs. Used only for the breathing alerts, not actual metabolism. /// [DataField] - public AlertType Alert = AlertType.LowOxygen; + public ProtoId Alert = "LowOxygen"; } diff --git a/Content.Server/Body/Components/RespiratorComponent.cs b/Content.Server/Body/Components/RespiratorComponent.cs index b21e54332c6..ba54a36c248 100644 --- a/Content.Server/Body/Components/RespiratorComponent.cs +++ b/Content.Server/Body/Components/RespiratorComponent.cs @@ -1,5 +1,7 @@ using Content.Server.Body.Systems; +using Content.Shared.Chat.Prototypes; using Content.Shared.Damage; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; namespace Content.Server.Body.Components @@ -50,10 +52,16 @@ public sealed partial class RespiratorComponent : Component public DamageSpecifier DamageRecovery = default!; [DataField] - public TimeSpan GaspPopupCooldown = TimeSpan.FromSeconds(8); + public TimeSpan GaspEmoteCooldown = TimeSpan.FromSeconds(8); [ViewVariables] - public TimeSpan LastGaspPopupTime; + public TimeSpan LastGaspEmoteTime; + + /// + /// The emote when gasps + /// + [DataField] + public ProtoId GaspEmote = "Gasp"; /// /// How many cycles in a row has the mob been under-saturated? diff --git a/Content.Server/Body/Systems/BloodstreamSystem.cs b/Content.Server/Body/Systems/BloodstreamSystem.cs index ddeb154e790..f961307fc6a 100644 --- a/Content.Server/Body/Systems/BloodstreamSystem.cs +++ b/Content.Server/Body/Systems/BloodstreamSystem.cs @@ -392,11 +392,11 @@ public bool TryModifyBleedAmount(EntityUid uid, float amount, BloodstreamCompone component.BleedAmount = Math.Clamp(component.BleedAmount, 0, component.MaxBleedAmount); if (component.BleedAmount == 0) - _alertsSystem.ClearAlert(uid, AlertType.Bleed); + _alertsSystem.ClearAlert(uid, component.BleedingAlert); else { var severity = (short) Math.Clamp(Math.Round(component.BleedAmount, MidpointRounding.ToZero), 0, 10); - _alertsSystem.ShowAlert(uid, AlertType.Bleed, severity); + _alertsSystem.ShowAlert(uid, component.BleedingAlert, severity); } return true; diff --git a/Content.Server/Body/Systems/InternalsSystem.cs b/Content.Server/Body/Systems/InternalsSystem.cs index 8afd1c767f6..c1e1de2baad 100644 --- a/Content.Server/Body/Systems/InternalsSystem.cs +++ b/Content.Server/Body/Systems/InternalsSystem.cs @@ -144,12 +144,12 @@ private void OnDoAfter(Entity ent, ref InternalsDoAfterEvent private void OnInternalsStartup(Entity ent, ref ComponentStartup args) { - _alerts.ShowAlert(ent, AlertType.Internals, GetSeverity(ent)); + _alerts.ShowAlert(ent, ent.Comp.InternalsAlert, GetSeverity(ent)); } private void OnInternalsShutdown(Entity ent, ref ComponentShutdown args) { - _alerts.ClearAlert(ent, AlertType.Internals); + _alerts.ClearAlert(ent, ent.Comp.InternalsAlert); } private void OnInhaleLocation(Entity ent, ref InhaleLocationEvent args) @@ -159,7 +159,7 @@ private void OnInhaleLocation(Entity ent, ref InhaleLocation var gasTank = Comp(ent.Comp.GasTankEntity!.Value); args.Gas = _gasTank.RemoveAirVolume((ent.Comp.GasTankEntity.Value, gasTank), Atmospherics.BreathVolume); // TODO: Should listen to gas tank updates instead I guess? - _alerts.ShowAlert(ent, AlertType.Internals, GetSeverity(ent)); + _alerts.ShowAlert(ent, ent.Comp.InternalsAlert, GetSeverity(ent)); } } public void DisconnectBreathTool(Entity ent) @@ -173,7 +173,7 @@ public void DisconnectBreathTool(Entity ent) DisconnectTank(ent); } - _alerts.ShowAlert(ent, AlertType.Internals, GetSeverity(ent)); + _alerts.ShowAlert(ent, ent.Comp.InternalsAlert, GetSeverity(ent)); } public void ConnectBreathTool(Entity ent, EntityUid toolEntity) @@ -184,7 +184,7 @@ public void ConnectBreathTool(Entity ent, EntityUid toolEnti } ent.Comp.BreathToolEntity = toolEntity; - _alerts.ShowAlert(ent, AlertType.Internals, GetSeverity(ent)); + _alerts.ShowAlert(ent, ent.Comp.InternalsAlert, GetSeverity(ent)); } public void DisconnectTank(InternalsComponent? component) @@ -196,7 +196,7 @@ public void DisconnectTank(InternalsComponent? component) _gasTank.DisconnectFromInternals((component.GasTankEntity.Value, tank)); component.GasTankEntity = null; - _alerts.ShowAlert(component.Owner, AlertType.Internals, GetSeverity(component)); + _alerts.ShowAlert(component.Owner, component.InternalsAlert, GetSeverity(component)); } public bool TryConnectTank(Entity ent, EntityUid tankEntity) @@ -208,7 +208,7 @@ public bool TryConnectTank(Entity ent, EntityUid tankEntity) _gasTank.DisconnectFromInternals((ent.Comp.GasTankEntity.Value, tank)); ent.Comp.GasTankEntity = tankEntity; - _alerts.ShowAlert(ent, AlertType.Internals, GetSeverity(ent)); + _alerts.ShowAlert(ent, ent.Comp.InternalsAlert, GetSeverity(ent)); return true; } diff --git a/Content.Server/Body/Systems/RespiratorSystem.cs b/Content.Server/Body/Systems/RespiratorSystem.cs index ef4d72d4251..bc0c247fff7 100644 --- a/Content.Server/Body/Systems/RespiratorSystem.cs +++ b/Content.Server/Body/Systems/RespiratorSystem.cs @@ -2,8 +2,8 @@ using Content.Server.Atmos; using Content.Server.Atmos.EntitySystems; using Content.Server.Body.Components; +using Content.Server.Chat.Systems; using Content.Server.Chemistry.Containers.EntitySystems; -using Content.Server.Popups; using Content.Shared.Alert; using Content.Shared.Atmos; using Content.Shared.Body.Components; @@ -25,9 +25,9 @@ public sealed class RespiratorSystem : EntitySystem [Dependency] private readonly BodySystem _bodySystem = default!; [Dependency] private readonly DamageableSystem _damageableSys = default!; [Dependency] private readonly LungSystem _lungSystem = default!; - [Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly MobStateSystem _mobState = default!; [Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!; + [Dependency] private readonly ChatSystem _chat = default!; public override void Initialize() { @@ -107,10 +107,10 @@ public override void Update(float frameTime) if (respirator.Saturation < respirator.SuffocationThreshold) { - if (_gameTiming.CurTime >= respirator.LastGaspPopupTime + respirator.GaspPopupCooldown) + if (_gameTiming.CurTime >= respirator.LastGaspEmoteTime + respirator.GaspEmoteCooldown) { - respirator.LastGaspPopupTime = _gameTiming.CurTime; - _popupSystem.PopupEntity(Loc.GetString("lung-behavior-gasp"), uid); + respirator.LastGaspEmoteTime = _gameTiming.CurTime; + _chat.TryEmoteWithChat(uid, respirator.GaspEmote, ignoreActionBlocker: true); } TakeSuffocationDamage((uid, respirator)); diff --git a/Content.Server/Cargo/Systems/CargoSystem.Bounty.cs b/Content.Server/Cargo/Systems/CargoSystem.Bounty.cs index e132e4f12a3..0fcfd160bb3 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Bounty.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Bounty.cs @@ -11,6 +11,7 @@ using Content.Shared.Database; using Content.Shared.NameIdentifier; using Content.Shared.Stacks; +using Content.Shared.Whitelist; using JetBrains.Annotations; using Robust.Server.Containers; using Robust.Shared.Containers; @@ -23,6 +24,7 @@ public sealed partial class CargoSystem { [Dependency] private readonly ContainerSystem _container = default!; [Dependency] private readonly NameIdentifierSystem _nameIdentifier = default!; + [Dependency] private readonly EntityWhitelistSystem _whitelistSys = default!; [ValidatePrototypeId] private const string BountyNameIdentifierGroup = "Bounty"; @@ -311,7 +313,7 @@ public bool IsBountyComplete(HashSet entities, IEnumerable(); foreach (var entity in entities) { - if (!entry.Whitelist.IsValid(entity, EntityManager)) + if (!_whitelistSys.IsValid(entry.Whitelist, entity) || (entry.Blacklist != null && _whitelistSys.IsValid(entry.Blacklist, entity))) continue; count += _stackQuery.CompOrNull(entity)?.Count ?? 1; diff --git a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs index 63556d2fbd7..c519362945e 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs @@ -20,6 +20,8 @@ namespace Content.Server.Cargo.Systems { public sealed partial class CargoSystem { + [Dependency] private readonly SharedTransformSystem _transformSystem = default!; + /// /// How much time to wait (in seconds) before increasing bank accounts balance. /// @@ -489,6 +491,9 @@ private bool FulfillOrder(CargoOrderData order, EntityCoordinates spawn, string? // Create the item itself var item = Spawn(order.ProductId, spawn); + // Ensure the item doesn't start anchored + _transformSystem.Unanchor(item, Transform(item)); + // Create a sheet of paper to write the order details on var printed = EntityManager.SpawnEntity(paperProto, spawn); if (TryComp(printed, out var paper)) diff --git a/Content.Server/Chat/Managers/ChatManager.cs b/Content.Server/Chat/Managers/ChatManager.cs index 4d50fcc4593..e607ad70e94 100644 --- a/Content.Server/Chat/Managers/ChatManager.cs +++ b/Content.Server/Chat/Managers/ChatManager.cs @@ -154,6 +154,14 @@ public void SendAdminAnnouncement(string message, AdminFlags? flagBlacklist, Adm _adminLogger.Add(LogType.Chat, LogImpact.Low, $"Admin announcement: {message}"); } + public void SendAdminAnnouncementMessage(ICommonSession player, string message, bool suppressLog = true) + { + var wrappedMessage = Loc.GetString("chat-manager-send-admin-announcement-wrap-message", + ("adminChannelName", Loc.GetString("chat-manager-admin-channel-name")), + ("message", FormattedMessage.EscapeText(message))); + ChatMessageToOne(ChatChannel.Admin, message, wrappedMessage, default, false, player.Channel); + } + public void SendAdminAlert(string message) { var clients = _adminManager.ActiveAdmins.Select(p => p.Channel); diff --git a/Content.Server/Chat/Managers/IChatManager.cs b/Content.Server/Chat/Managers/IChatManager.cs index 59945bf5ca6..c8c057a1ad7 100644 --- a/Content.Server/Chat/Managers/IChatManager.cs +++ b/Content.Server/Chat/Managers/IChatManager.cs @@ -23,6 +23,7 @@ public interface IChatManager void SendHookOOC(string sender, string message); void SendAdminAnnouncement(string message, AdminFlags? flagBlacklist = null, AdminFlags? flagWhitelist = null); + void SendAdminAnnouncementMessage(ICommonSession player, string message, bool suppressLog = true); void SendAdminAlert(string message); void SendAdminAlert(EntityUid player, string message); diff --git a/Content.Server/Chemistry/ReagentEffects/AdjustAlert.cs b/Content.Server/Chemistry/ReagentEffects/AdjustAlert.cs index 8d475570ad0..40858176bd1 100644 --- a/Content.Server/Chemistry/ReagentEffects/AdjustAlert.cs +++ b/Content.Server/Chemistry/ReagentEffects/AdjustAlert.cs @@ -10,8 +10,8 @@ public sealed partial class AdjustAlert : ReagentEffect /// /// The specific Alert that will be adjusted /// - [DataField("alertType", required: true)] - public AlertType Type; + [DataField(required: true)] + public ProtoId AlertType; /// /// If true, the alert is removed after Time seconds. If Time was not specified the alert is removed immediately. @@ -42,7 +42,7 @@ public override void Effect(ReagentEffectArgs args) if (Clear && Time <= 0) { - alertSys.ClearAlert(args.SolutionEntity, Type); + alertSys.ClearAlert(args.SolutionEntity, AlertType); } else { @@ -52,7 +52,7 @@ public override void Effect(ReagentEffectArgs args) if ((ShowCooldown || Clear) && Time > 0) cooldown = (timing.CurTime, timing.CurTime + TimeSpan.FromSeconds(Time)); - alertSys.ShowAlert(args.SolutionEntity, Type, cooldown: cooldown, autoRemove: Clear, showCooldown: ShowCooldown); + alertSys.ShowAlert(args.SolutionEntity, AlertType, cooldown: cooldown, autoRemove: Clear, showCooldown: ShowCooldown); } } diff --git a/Content.Server/Chemistry/ReagentEffects/CauseZombieInfection.cs b/Content.Server/Chemistry/ReagentEffects/CauseZombieInfection.cs index 029b1495002..96c57f74653 100644 --- a/Content.Server/Chemistry/ReagentEffects/CauseZombieInfection.cs +++ b/Content.Server/Chemistry/ReagentEffects/CauseZombieInfection.cs @@ -2,6 +2,7 @@ using Content.Shared.Chemistry.Reagent; using Robust.Shared.Configuration; using Robust.Shared.Prototypes; +using Content.Shared.Zombies; namespace Content.Server.Chemistry.ReagentEffects; diff --git a/Content.Server/Chemistry/ReagentEffects/CureZombieInfection.cs b/Content.Server/Chemistry/ReagentEffects/CureZombieInfection.cs index d56fc115310..20e2c015c46 100644 --- a/Content.Server/Chemistry/ReagentEffects/CureZombieInfection.cs +++ b/Content.Server/Chemistry/ReagentEffects/CureZombieInfection.cs @@ -2,6 +2,7 @@ using Content.Shared.Chemistry.Reagent; using Robust.Shared.Configuration; using Robust.Shared.Prototypes; +using Content.Shared.Zombies; namespace Content.Server.Chemistry.ReagentEffects; diff --git a/Content.Server/Clothing/MagbootsSystem.cs b/Content.Server/Clothing/MagbootsSystem.cs index f12558389e3..3838ad168d1 100644 --- a/Content.Server/Clothing/MagbootsSystem.cs +++ b/Content.Server/Clothing/MagbootsSystem.cs @@ -29,11 +29,11 @@ protected override void UpdateMagbootEffects(EntityUid parent, EntityUid uid, bo if (state) { - _alerts.ShowAlert(parent, AlertType.Magboots); + _alerts.ShowAlert(parent, component.MagbootsAlert); } else { - _alerts.ClearAlert(parent, AlertType.Magboots); + _alerts.ClearAlert(parent, component.MagbootsAlert); } } diff --git a/Content.Server/Configurable/ConfigurationSystem.cs b/Content.Server/Configurable/ConfigurationSystem.cs index 2683bf4e095..5f5f1ef7d16 100644 --- a/Content.Server/Configurable/ConfigurationSystem.cs +++ b/Content.Server/Configurable/ConfigurationSystem.cs @@ -24,6 +24,7 @@ public override void Initialize() private void OnInteractUsing(EntityUid uid, ConfigurationComponent component, InteractUsingEvent args) { + // TODO use activatable ui system if (args.Handled) return; diff --git a/Content.Server/Construction/ConstructionSystem.Initial.cs b/Content.Server/Construction/ConstructionSystem.Initial.cs index 17ed5c90f4d..04d3722c66c 100644 --- a/Content.Server/Construction/ConstructionSystem.Initial.cs +++ b/Content.Server/Construction/ConstructionSystem.Initial.cs @@ -15,6 +15,7 @@ using Content.Shared.Inventory; using Content.Shared.Storage; using Robust.Shared.Containers; +using Robust.Shared.Map; using Robust.Shared.Player; using Robust.Shared.Timing; @@ -91,7 +92,14 @@ private IEnumerable EnumerateNearby(EntityUid user) } // LEGACY CODE. See warning at the top of the file! - private async Task Construct(EntityUid user, string materialContainer, ConstructionGraphPrototype graph, ConstructionGraphEdge edge, ConstructionGraphNode targetNode) + private async Task Construct( + EntityUid user, + string materialContainer, + ConstructionGraphPrototype graph, + ConstructionGraphEdge edge, + ConstructionGraphNode targetNode, + EntityCoordinates coords, + Angle angle = default) { // We need a place to hold our construction items! var container = _container.EnsureContainer(user, materialContainer, out var existed); @@ -261,7 +269,7 @@ void ShutdownContainers() } var newEntityProto = graph.Nodes[edge.Target].Entity.GetId(null, user, new(EntityManager)); - var newEntity = EntityManager.SpawnEntity(newEntityProto, EntityManager.GetComponent(user).Coordinates); + var newEntity = Spawn(newEntityProto, _transformSystem.ToMapCoordinates(coords), rotation: angle); if (!TryComp(newEntity, out ConstructionComponent? construction)) { @@ -376,7 +384,13 @@ public async Task TryStartItemConstruction(string prototype, EntityUid use } } - if (await Construct(user, "item_construction", constructionGraph, edge, targetNode) is not { Valid: true } item) + if (await Construct( + user, + "item_construction", + constructionGraph, + edge, + targetNode, + Transform(user).Coordinates) is not { Valid: true } item) return false; // Just in case this is a stack, attempt to merge it. If it isn't a stack, this will just normally pick up @@ -511,23 +525,18 @@ void Cleanup() return; } - if (await Construct(user, (ev.Ack + constructionPrototype.GetHashCode()).ToString(), constructionGraph, - edge, targetNode) is not {Valid: true} structure) + if (await Construct(user, + (ev.Ack + constructionPrototype.GetHashCode()).ToString(), + constructionGraph, + edge, + targetNode, + GetCoordinates(ev.Location), + constructionPrototype.CanRotate ? ev.Angle : Angle.Zero) is not {Valid: true} structure) { Cleanup(); return; } - // We do this to be able to move the construction to its proper position in case it's anchored... - // Oh wow transform anchoring is amazing wow I love it!!!! - // ikr - var xform = Transform(structure); - var wasAnchored = xform.Anchored; - xform.Anchored = false; - xform.Coordinates = GetCoordinates(ev.Location); - xform.LocalRotation = constructionPrototype.CanRotate ? ev.Angle : Angle.Zero; - xform.Anchored = wasAnchored; - RaiseNetworkEvent(new AckStructureConstructionMessage(ev.Ack, GetNetEntity(structure))); _adminLogger.Add(LogType.Construction, LogImpact.Low, $"{ToPrettyString(user):player} has turned a {ev.PrototypeName} construction ghost into {ToPrettyString(structure)} at {Transform(structure).Coordinates}"); Cleanup(); diff --git a/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs b/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs index 34601241585..402d005dd47 100644 --- a/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs +++ b/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs @@ -63,9 +63,21 @@ public override void Initialize() SubscribeLocalEvent(OnToggleLinks); SubscribeLocalEvent(OnConfigButtonPressed); + SubscribeLocalEvent(OnUiRangeCheck); + SubscribeLocalEvent(OnComponentRemoved); } + private void OnUiRangeCheck(Entity ent, ref BoundUserInterfaceCheckRangeEvent args) + { + if (ent.Comp.ActiveDeviceList == null || args.Result == BoundUserInterfaceRangeResult.Fail) + return; + + DebugTools.Assert(Exists(ent.Comp.ActiveDeviceList)); + if (!_interactionSystem.InRangeUnobstructed(args.Actor!, ent.Comp.ActiveDeviceList.Value)) + args.Result = BoundUserInterfaceRangeResult.Fail; + } + private void OnShutdown(EntityUid uid, NetworkConfiguratorComponent component, ComponentShutdown args) { ClearDevices(uid, component); @@ -75,23 +87,6 @@ private void OnShutdown(EntityUid uid, NetworkConfiguratorComponent component, C component.ActiveDeviceList = null; } - public override void Update(float frameTime) - { - base.Update(frameTime); - - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out var component)) - { - if (component.ActiveDeviceList != null - && EntityManager.EntityExists(component.ActiveDeviceList.Value) - && _interactionSystem.InRangeUnobstructed(uid, component.ActiveDeviceList.Value)) - continue; - - //The network configurator is a handheld device. There can only ever be an ui session open for the player holding the device. - _uiSystem.CloseUi(uid, NetworkConfiguratorUiKey.Configure); - } - } - private void OnMapInit(EntityUid uid, NetworkConfiguratorComponent component, MapInitEvent args) { UpdateListUiState(uid, component); diff --git a/Content.Server/Doors/Systems/FirelockSystem.cs b/Content.Server/Doors/Systems/FirelockSystem.cs index 3d4c8a4ec59..c7da404fe88 100644 --- a/Content.Server/Doors/Systems/FirelockSystem.cs +++ b/Content.Server/Doors/Systems/FirelockSystem.cs @@ -1,67 +1,54 @@ using Content.Server.Atmos.Components; using Content.Server.Atmos.EntitySystems; using Content.Server.Atmos.Monitor.Systems; -using Content.Server.Popups; using Content.Server.Power.Components; using Content.Server.Power.EntitySystems; using Content.Server.Shuttles.Components; -using Content.Shared.Access.Systems; using Content.Shared.Atmos; using Content.Shared.Atmos.Monitor; using Content.Shared.Doors; using Content.Shared.Doors.Components; using Content.Shared.Doors.Systems; -using Content.Shared.Popups; -using Content.Shared.Prying.Components; using Robust.Shared.Map.Components; namespace Content.Server.Doors.Systems { - public sealed class FirelockSystem : EntitySystem + public sealed class FirelockSystem : SharedFirelockSystem { - [Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly SharedDoorSystem _doorSystem = default!; [Dependency] private readonly AtmosAlarmableSystem _atmosAlarmable = default!; [Dependency] private readonly AtmosphereSystem _atmosSystem = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; - [Dependency] private readonly AccessReaderSystem _accessReaderSystem = default!; + [Dependency] private readonly SharedMapSystem _mapping = default!; - private static float _visualUpdateInterval = 0.5f; - private float _accumulatedFrameTime; + private const int UpdateInterval = 30; + private int _accumulatedTicks; public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnBeforeDoorOpened); - SubscribeLocalEvent(OnDoorGetPryTimeModifier); - SubscribeLocalEvent(OnUpdateState); - - SubscribeLocalEvent(OnBeforeDoorAutoclose); SubscribeLocalEvent(OnAtmosAlarm); - // Visuals - SubscribeLocalEvent(UpdateVisuals); - SubscribeLocalEvent(UpdateVisuals); SubscribeLocalEvent(PowerChanged); + } private void PowerChanged(EntityUid uid, FirelockComponent component, ref PowerChangedEvent args) { // TODO this should REALLLLY not be door specific appearance thing. _appearance.SetData(uid, DoorVisuals.Powered, args.Powered); + component.Powered = args.Powered; + Dirty(uid, component); } - #region Visuals - private void UpdateVisuals(EntityUid uid, FirelockComponent component, EntityEventArgs args) => UpdateVisuals(uid, component); - public override void Update(float frameTime) { - _accumulatedFrameTime += frameTime; - if (_accumulatedFrameTime < _visualUpdateInterval) + _accumulatedTicks += 1; + if (_accumulatedTicks < UpdateInterval) return; - _accumulatedFrameTime -= _visualUpdateInterval; + _accumulatedTicks = 0; var airtightQuery = GetEntityQuery(); var appearanceQuery = GetEntityQuery(); @@ -82,109 +69,15 @@ public override void Update(float frameTime) && xformQuery.TryGetComponent(uid, out var xform) && appearanceQuery.TryGetComponent(uid, out var appearance)) { - var (fire, pressure) = CheckPressureAndFire(uid, firelock, xform, airtight, airtightQuery); + var (pressure, fire) = CheckPressureAndFire(uid, firelock, xform, airtight, airtightQuery); _appearance.SetData(uid, DoorVisuals.ClosedLights, fire || pressure, appearance); + firelock.Temperature = fire; + firelock.Pressure = pressure; + Dirty(uid, firelock); } } } - private void UpdateVisuals(EntityUid uid, - FirelockComponent? firelock = null, - DoorComponent? door = null, - AirtightComponent? airtight = null, - AppearanceComponent? appearance = null, - TransformComponent? xform = null) - { - if (!Resolve(uid, ref door, ref appearance, false)) - return; - - // only bother to check pressure on doors that are some variation of closed. - if (door.State != DoorState.Closed - && door.State != DoorState.Welded - && door.State != DoorState.Denying) - { - _appearance.SetData(uid, DoorVisuals.ClosedLights, false, appearance); - return; - } - - var query = GetEntityQuery(); - if (!Resolve(uid, ref firelock, ref airtight, ref appearance, ref xform, false) || !query.Resolve(uid, ref airtight, false)) - return; - - var (fire, pressure) = CheckPressureAndFire(uid, firelock, xform, airtight, query); - _appearance.SetData(uid, DoorVisuals.ClosedLights, fire || pressure, appearance); - } - #endregion - - public bool EmergencyPressureStop(EntityUid uid, FirelockComponent? firelock = null, DoorComponent? door = null) - { - if (!Resolve(uid, ref firelock, ref door)) - return false; - - if (door.State == DoorState.Open) - { - if (_doorSystem.TryClose(uid, door)) - { - return _doorSystem.OnPartialClose(uid, door); - } - } - return false; - } - - private void OnBeforeDoorOpened(EntityUid uid, FirelockComponent component, BeforeDoorOpenedEvent args) - { - // Give the Door remote the ability to force a firelock open even if it is holding back dangerous gas - var overrideAccess = (args.User != null) && _accessReaderSystem.IsAllowed(args.User.Value, uid); - - if (!this.IsPowered(uid, EntityManager) || (!overrideAccess && IsHoldingPressureOrFire(uid, component))) - args.Cancel(); - } - - private void OnDoorGetPryTimeModifier(EntityUid uid, FirelockComponent component, ref GetPryTimeModifierEvent args) - { - var state = CheckPressureAndFire(uid, component); - - if (state.Fire) - { - _popupSystem.PopupEntity(Loc.GetString("firelock-component-is-holding-fire-message"), - uid, args.User, PopupType.MediumCaution); - } - else if (state.Pressure) - { - _popupSystem.PopupEntity(Loc.GetString("firelock-component-is-holding-pressure-message"), - uid, args.User, PopupType.MediumCaution); - } - - if (state.Fire || state.Pressure) - args.PryTimeModifier *= component.LockedPryTimeModifier; - } - - private void OnUpdateState(EntityUid uid, FirelockComponent component, DoorStateChangedEvent args) - { - var ev = new BeforeDoorAutoCloseEvent(); - RaiseLocalEvent(uid, ev); - UpdateVisuals(uid, component, args); - if (ev.Cancelled) - { - return; - } - - _doorSystem.SetNextStateChange(uid, component.AutocloseDelay); - } - - private void OnBeforeDoorAutoclose(EntityUid uid, FirelockComponent component, BeforeDoorAutoCloseEvent args) - { - if (!this.IsPowered(uid, EntityManager)) - args.Cancel(); - - // Make firelocks autoclose, but only if the last alarm type it - // remembers was a danger. This is to prevent people from - // flooding hallways with endless bad air/fire. - if (component.AlarmAutoClose && - (_atmosAlarmable.TryGetHighestAlert(uid, out var alarm) && alarm != AtmosAlarmType.Danger || alarm == null)) - args.Cancel(); - } - private void OnAtmosAlarm(EntityUid uid, FirelockComponent component, AtmosAlarmEvent args) { if (!this.IsPowered(uid, EntityManager)) @@ -204,12 +97,6 @@ private void OnAtmosAlarm(EntityUid uid, FirelockComponent component, AtmosAlarm } } - public bool IsHoldingPressureOrFire(EntityUid uid, FirelockComponent firelock) - { - var result = CheckPressureAndFire(uid, firelock); - return result.Pressure || result.Fire; - } - public (bool Pressure, bool Fire) CheckPressureAndFire(EntityUid uid, FirelockComponent firelock) { var query = GetEntityQuery(); @@ -234,17 +121,17 @@ public bool IsHoldingPressureOrFire(EntityUid uid, FirelockComponent firelock) return (false, false); } - if (!TryComp(xform.ParentUid, out GridAtmosphereComponent? gridAtmosphere)) + if (!HasComp(xform.ParentUid)) return (false, false); var grid = Comp(xform.ParentUid); - var pos = grid.CoordinatesToTile(xform.Coordinates); + var pos = _mapping.CoordinatesToTile(xform.ParentUid, grid, xform.Coordinates); var minPressure = float.MaxValue; var maxPressure = float.MinValue; var minTemperature = float.MaxValue; var maxTemperature = float.MinValue; - bool holdingFire = false; - bool holdingPressure = false; + var holdingFire = false; + var holdingPressure = false; // We cannot simply use `_atmosSystem.GetAdjacentTileMixtures` because of how the `includeBlocked` option // works, we want to ignore the firelock's blocking, while including blockers on other tiles. @@ -284,7 +171,7 @@ public bool IsHoldingPressureOrFire(EntityUid uid, FirelockComponent firelock) { // Is there some airtight entity blocking this direction? If yes, don't include this direction in the // pressure differential - if (HasAirtightBlocker(grid.GetAnchoredEntities(adjacentPos), dir.GetOpposite(), airtightQuery)) + if (HasAirtightBlocker(_mapping.GetAnchoredEntities(xform.ParentUid, grid, adjacentPos), dir.GetOpposite(), airtightQuery)) continue; var p = gas.Pressure; diff --git a/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs b/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs index 105a8f9720d..51d3242ce4f 100644 --- a/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs +++ b/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs @@ -163,8 +163,8 @@ public void ForceFree(EntityUid ensnare, EnsnaringComponent component) public void UpdateAlert(EntityUid target, EnsnareableComponent component) { if (!component.IsEnsnared) - _alerts.ClearAlert(target, AlertType.Ensnared); + _alerts.ClearAlert(target, component.EnsnaredAlert); else - _alerts.ShowAlert(target, AlertType.Ensnared); + _alerts.ShowAlert(target, component.EnsnaredAlert); } } diff --git a/Content.Server/GameTicking/Commands/JoinGameCommand.cs b/Content.Server/GameTicking/Commands/JoinGameCommand.cs index 3276b912003..a32a2f94955 100644 --- a/Content.Server/GameTicking/Commands/JoinGameCommand.cs +++ b/Content.Server/GameTicking/Commands/JoinGameCommand.cs @@ -1,7 +1,10 @@ +using Content.Server.Administration.Managers; using Content.Server.Station.Systems; using Content.Shared.Administration; +using Content.Shared.CCVar; using Content.Shared.GameTicking; using Content.Shared.Roles; +using Robust.Shared.Configuration; using Robust.Shared.Console; using Robust.Shared.Prototypes; @@ -12,6 +15,8 @@ sealed class JoinGameCommand : IConsoleCommand { [Dependency] private readonly IEntityManager _entManager = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly IAdminManager _adminManager = default!; + [Dependency] private readonly IConfigurationManager _cfg = default!; public string Command => "joingame"; public string Description => ""; @@ -67,6 +72,12 @@ public void Execute(IConsoleShell shell, string argStr, string[] args) shell.WriteLine($"{jobPrototype.LocalizedName} has no available slots."); return; } + + if (_adminManager.IsAdmin(player) && _cfg.GetCVar(CCVars.AdminDeadminOnJoin)) + { + _adminManager.DeAdmin(player); + } + ticker.MakeJoinGame(player, station, id); return; } diff --git a/Content.Server/GameTicking/Commands/ObserveCommand.cs b/Content.Server/GameTicking/Commands/ObserveCommand.cs index 16c2c3261de..5a035033179 100644 --- a/Content.Server/GameTicking/Commands/ObserveCommand.cs +++ b/Content.Server/GameTicking/Commands/ObserveCommand.cs @@ -1,3 +1,4 @@ +using Content.Server.Administration.Managers; using Content.Shared.Administration; using Content.Shared.GameTicking; using Robust.Shared.Console; @@ -8,6 +9,7 @@ namespace Content.Server.GameTicking.Commands sealed class ObserveCommand : IConsoleCommand { [Dependency] private readonly IEntityManager _e = default!; + [Dependency] private readonly IAdminManager _adminManager = default!; public string Command => "observe"; public string Description => ""; @@ -28,6 +30,13 @@ public void Execute(IConsoleShell shell, string argStr, string[] args) return; } + var isAdminCommand = args.Length > 0 && args[0].ToLower() == "admin"; + + if (!isAdminCommand && _adminManager.IsAdmin(player)) + { + _adminManager.DeAdmin(player); + } + if (ticker.PlayerGameStatuses.TryGetValue(player.UserId, out var status) && status != PlayerGameStatus.JoinedGame) { diff --git a/Content.Server/GameTicking/GameTicker.GameRule.cs b/Content.Server/GameTicking/GameTicker.GameRule.cs index f52a3cb296d..a6d0a4baf0a 100644 --- a/Content.Server/GameTicking/GameTicker.GameRule.cs +++ b/Content.Server/GameTicking/GameTicker.GameRule.cs @@ -1,6 +1,7 @@ using System.Linq; using Content.Server.Administration; using Content.Server.GameTicking.Components; +using Content.Server.GameTicking.Rules.Components; using Content.Shared.Administration; using Content.Shared.Database; using Content.Shared.Prototypes; @@ -42,6 +43,14 @@ private void InitializeGameRules() string.Empty, "cleargamerules", ClearGameRulesCommand); + + // List game rules command. + var localizedHelp = Loc.GetString("listgamerules-command-help"); + + _consoleHost.RegisterCommand("listgamerules", + string.Empty, + $"listgamerules - {localizedHelp}", + ListGameRuleCommand); } private void ShutdownGameRules() @@ -49,6 +58,7 @@ private void ShutdownGameRules() _consoleHost.UnregisterCommand("addgamerule"); _consoleHost.UnregisterCommand("endgamerule"); _consoleHost.UnregisterCommand("cleargamerules"); + _consoleHost.UnregisterCommand("listgamerules"); } /// @@ -64,6 +74,13 @@ public EntityUid AddGameRule(string ruleId) var ev = new GameRuleAddedEvent(ruleEntity, ruleId); RaiseLocalEvent(ruleEntity, ref ev, true); + + var currentTime = RunLevel == GameRunLevel.PreRoundLobby ? TimeSpan.Zero : RoundDuration(); + if (!HasComp(ruleEntity) && !HasComp(ruleEntity)) + { + _allPreviousGameRules.Add((currentTime, ruleId + " (Pending)")); + } + return ruleEntity; } @@ -110,7 +127,8 @@ public bool StartGameRule(EntityUid ruleEntity, GameRuleComponent? ruleData = nu if (delayTime > TimeSpan.Zero) { _sawmill.Info($"Queued start for game rule {ToPrettyString(ruleEntity)} with delay {delayTime}"); - _adminLogger.Add(LogType.EventStarted, $"Queued start for game rule {ToPrettyString(ruleEntity)} with delay {delayTime}"); + _adminLogger.Add(LogType.EventStarted, + $"Queued start for game rule {ToPrettyString(ruleEntity)} with delay {delayTime}"); var delayed = EnsureComp(ruleEntity); delayed.RuleStartTime = _gameTiming.CurTime + (delayTime); @@ -118,7 +136,20 @@ public bool StartGameRule(EntityUid ruleEntity, GameRuleComponent? ruleData = nu } } - _allPreviousGameRules.Add((RoundDuration(), id)); + var currentTime = RunLevel == GameRunLevel.PreRoundLobby ? TimeSpan.Zero : RoundDuration(); + + // Remove the first occurrence of the pending entry before adding the started entry + var pendingRuleIndex = _allPreviousGameRules.FindIndex(rule => rule.Item2 == id + " (Pending)"); + if (pendingRuleIndex >= 0) + { + _allPreviousGameRules.RemoveAt(pendingRuleIndex); + } + + if (!HasComp(ruleEntity) && !HasComp(ruleEntity)) + { + _allPreviousGameRules.Add((currentTime, id)); + } + _sawmill.Info($"Started game rule {ToPrettyString(ruleEntity)}"); _adminLogger.Add(LogType.EventStarted, $"Started game rule {ToPrettyString(ruleEntity)}"); @@ -296,6 +327,7 @@ private void AddGameRuleCommand(IConsoleShell shell, string argstr, string[] arg if (shell.Player != null) { _adminLogger.Add(LogType.EventStarted, $"{shell.Player} tried to add game rule [{rule}] via command"); + _chatManager.SendAdminAnnouncement(Loc.GetString("add-gamerule-admin", ("rule", rule), ("admin", shell.Player))); } else { @@ -306,6 +338,7 @@ private void AddGameRuleCommand(IConsoleShell shell, string argstr, string[] arg // Start rule if we're already in the middle of a round if(RunLevel == GameRunLevel.InRound) StartGameRule(ent); + } } @@ -349,5 +382,42 @@ private void ClearGameRulesCommand(IConsoleShell shell, string argstr, string[] ClearGameRules(); } + [AdminCommand(AdminFlags.Admin)] + private void ListGameRuleCommand(IConsoleShell shell, string argstr, string[] args) + { + _sawmill.Info($"{shell.Player} tried to get list of game rules via command"); + _adminLogger.Add(LogType.Action, $"{shell.Player} tried to get list of game rules via command"); + var message = GetGameRulesListMessage(false); + shell.WriteLine(message); + } + private string GetGameRulesListMessage(bool forChatWindow) + { + if (_allPreviousGameRules.Count > 0) + { + var sortedRules = _allPreviousGameRules.OrderBy(rule => rule.Item1).ToList(); + var message = "\n"; + + if (!forChatWindow) + { + var header = Loc.GetString("list-gamerule-admin-header"); + message += $"\n{header}\n"; + message += "|------------|------------------\n"; + } + + foreach (var (time, rule) in sortedRules) + { + var formattedTime = time.ToString(@"hh\:mm\:ss"); + message += $"| {formattedTime,-10} | {rule,-16} \n"; + } + + return message; + } + else + { + return Loc.GetString("list-gamerule-admin-no-rules"); + + } + } + #endregion } diff --git a/Content.Server/GameTicking/GameTicker.Player.cs b/Content.Server/GameTicking/GameTicker.Player.cs index 1655613dae6..489c2ddb341 100644 --- a/Content.Server/GameTicking/GameTicker.Player.cs +++ b/Content.Server/GameTicking/GameTicker.Player.cs @@ -1,4 +1,6 @@ +using System.Linq; using Content.Server.Database; +using Content.Shared.Administration; using Content.Shared.CCVar; using Content.Shared.GameTicking; using Content.Shared.GameWindow; @@ -201,6 +203,15 @@ public void PlayerJoinGame(ICommonSession session, bool silent = false) _playerGameStatuses[session.UserId] = PlayerGameStatus.JoinedGame; _db.AddRoundPlayers(RoundId, session.UserId); + if (_adminManager.HasAdminFlag(session, AdminFlags.Admin)) + { + if (_allPreviousGameRules.Count > 0) + { + var rulesMessage = GetGameRulesListMessage(true); + _chatManager.SendAdminAnnouncementMessage(session, Loc.GetString("starting-rule-selected-preset", ("preset", rulesMessage))); + } + } + RaiseNetworkEvent(new TickerJoinGameEvent(), session.Channel); } diff --git a/Content.Server/GameTicking/GameTicker.RoundFlow.cs b/Content.Server/GameTicking/GameTicker.RoundFlow.cs index 7c64c1ca797..eb78a059d4e 100644 --- a/Content.Server/GameTicking/GameTicker.RoundFlow.cs +++ b/Content.Server/GameTicking/GameTicker.RoundFlow.cs @@ -800,7 +800,7 @@ public RulePlayerSpawningEvent(List playerPool, IReadOnlyDiction } /// - /// Event raised after players were assigned jobs by the GameTicker. + /// Event raised after players were assigned jobs by the GameTicker and have been spawned in. /// You can give on-station people special roles by listening to this event. /// public sealed class RulePlayerJobsAssignedEvent diff --git a/Content.Server/GameTicking/Rules/AntagLoadProfileRuleSystem.cs b/Content.Server/GameTicking/Rules/AntagLoadProfileRuleSystem.cs new file mode 100644 index 00000000000..fd3fb6cd655 --- /dev/null +++ b/Content.Server/GameTicking/Rules/AntagLoadProfileRuleSystem.cs @@ -0,0 +1,39 @@ +using Content.Server.Antag; +using Content.Server.GameTicking.Rules.Components; +using Content.Server.Humanoid; +using Content.Server.Preferences.Managers; +using Content.Shared.Humanoid; +using Content.Shared.Humanoid.Prototypes; +using Content.Shared.Preferences; +using Robust.Shared.Prototypes; + +namespace Content.Server.GameTicking.Rules; + +public sealed class AntagLoadProfileRuleSystem : GameRuleSystem +{ + [Dependency] private readonly HumanoidAppearanceSystem _humanoid = default!; + [Dependency] private readonly IPrototypeManager _proto = default!; + [Dependency] private readonly IServerPreferencesManager _prefs = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnSelectEntity); + } + + private void OnSelectEntity(Entity ent, ref AntagSelectEntityEvent args) + { + if (args.Handled) + return; + + var profile = args.Session != null + ? _prefs.GetPreferences(args.Session.UserId).SelectedCharacter as HumanoidCharacterProfile + : HumanoidCharacterProfile.RandomWithSpecies(); + if (profile?.Species is not {} speciesId || !_proto.TryIndex(speciesId, out var species)) + species = _proto.Index(SharedHumanoidAppearanceSystem.DefaultSpecies); + + args.Entity = Spawn(species.Prototype); + _humanoid.LoadProfile(args.Entity.Value, profile); + } +} diff --git a/Content.Server/GameTicking/Rules/Components/AntagLoadProfileRuleCOmponent.cs b/Content.Server/GameTicking/Rules/Components/AntagLoadProfileRuleCOmponent.cs new file mode 100644 index 00000000000..5e58fd14fc0 --- /dev/null +++ b/Content.Server/GameTicking/Rules/Components/AntagLoadProfileRuleCOmponent.cs @@ -0,0 +1,7 @@ +namespace Content.Server.GameTicking.Rules.Components; + +/// +/// Makes this rules antags spawn a humanoid, either from the player's profile or a random one. +/// +[RegisterComponent] +public sealed partial class AntagLoadProfileRuleComponent : Component; diff --git a/Content.Server/GameTicking/Rules/Components/ThiefRuleComponent.cs b/Content.Server/GameTicking/Rules/Components/ThiefRuleComponent.cs index 01a078625ae..6ad1e177755 100644 --- a/Content.Server/GameTicking/Rules/Components/ThiefRuleComponent.cs +++ b/Content.Server/GameTicking/Rules/Components/ThiefRuleComponent.cs @@ -8,23 +8,4 @@ namespace Content.Server.GameTicking.Rules.Components; /// Stores data for . /// [RegisterComponent, Access(typeof(ThiefRuleSystem))] -public sealed partial class ThiefRuleComponent : Component -{ - [DataField] - public ProtoId BigObjectiveGroup = "ThiefBigObjectiveGroups"; - - [DataField] - public ProtoId SmallObjectiveGroup = "ThiefObjectiveGroups"; - - [DataField] - public ProtoId EscapeObjectiveGroup = "ThiefEscapeObjectiveGroups"; - - [DataField] - public float BigObjectiveChance = 0.7f; - - [DataField] - public float MaxObjectiveDifficulty = 2.5f; - - [DataField] - public int MaxStealObjectives = 10; -} +public sealed partial class ThiefRuleComponent : Component; diff --git a/Content.Server/GameTicking/Rules/Components/TraitorRuleComponent.cs b/Content.Server/GameTicking/Rules/Components/TraitorRuleComponent.cs index b85019d8afa..62f92963aa7 100644 --- a/Content.Server/GameTicking/Rules/Components/TraitorRuleComponent.cs +++ b/Content.Server/GameTicking/Rules/Components/TraitorRuleComponent.cs @@ -22,9 +22,6 @@ public sealed partial class TraitorRuleComponent : Component [DataField] public ProtoId SyndicateFaction = "Syndicate"; - [DataField] - public ProtoId ObjectiveGroup = "TraitorObjectiveGroups"; - [DataField] public ProtoId CodewordAdjectives = "adjectives"; @@ -72,7 +69,4 @@ public enum SelectionState /// [DataField] public int StartingBalance = 20; - - [DataField] - public int MaxDifficulty = 5; } diff --git a/Content.Server/GameTicking/Rules/GenericAntagRuleSystem.cs b/Content.Server/GameTicking/Rules/GenericAntagRuleSystem.cs index 81bdda706bd..0367aa1460c 100644 --- a/Content.Server/GameTicking/Rules/GenericAntagRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/GenericAntagRuleSystem.cs @@ -1,6 +1,8 @@ using Content.Server.GameTicking.Rules.Components; using Content.Server.Objectives; +using Content.Shared.Mind; using System.Diagnostics.CodeAnalysis; +using System.Linq; namespace Content.Server.GameTicking.Rules; @@ -47,7 +49,8 @@ public bool StartRule(string rule, EntityUid mindId, [NotNullWhen(true)] out Ent private void OnObjectivesTextGetInfo(EntityUid uid, GenericAntagRuleComponent comp, ref ObjectivesTextGetInfoEvent args) { - args.Minds = comp.Minds; + // just temporary until this is deleted + args.Minds = comp.Minds.Select(mindId => (mindId, Comp(mindId).CharacterName ?? "?")).ToList(); args.AgentName = Loc.GetString(comp.AgentName); } } diff --git a/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs b/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs index 232d24004b9..d6f1c3c619a 100644 --- a/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs @@ -1,11 +1,9 @@ using Content.Server.Antag; using Content.Server.Communications; using Content.Server.GameTicking.Rules.Components; -using Content.Server.Humanoid; using Content.Server.Nuke; using Content.Server.NukeOps; using Content.Server.Popups; -using Content.Server.Preferences.Managers; using Content.Server.Roles; using Content.Server.RoundEnd; using Content.Server.Shuttles.Events; @@ -13,20 +11,16 @@ using Content.Server.Station.Components; using Content.Server.Store.Components; using Content.Server.Store.Systems; -using Content.Shared.Humanoid; -using Content.Shared.Humanoid.Prototypes; using Content.Shared.Mobs; using Content.Shared.Mobs.Components; using Content.Shared.NPC.Components; using Content.Shared.NPC.Systems; using Content.Shared.Nuke; using Content.Shared.NukeOps; -using Content.Shared.Preferences; using Content.Shared.Store; using Content.Shared.Tag; using Content.Shared.Zombies; using Robust.Shared.Map; -using Robust.Shared.Prototypes; using Robust.Shared.Random; using Robust.Shared.Utility; using System.Linq; @@ -36,10 +30,7 @@ namespace Content.Server.GameTicking.Rules; public sealed class NukeopsRuleSystem : GameRuleSystem { - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - [Dependency] private readonly IServerPreferencesManager _prefs = default!; [Dependency] private readonly EmergencyShuttleSystem _emergency = default!; - [Dependency] private readonly HumanoidAppearanceSystem _humanoid = default!; [Dependency] private readonly NpcFactionSystem _npcFaction = default!; [Dependency] private readonly AntagSelectionSystem _antag = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; @@ -71,7 +62,6 @@ public override void Initialize() SubscribeLocalEvent(OnWarDeclared); SubscribeLocalEvent(OnShuttleCallAttempt); - SubscribeLocalEvent(OnAntagSelectEntity); SubscribeLocalEvent(OnAfterAntagEntSelected); } @@ -471,24 +461,6 @@ private void CheckRoundShouldEnd(Entity ent) nukeops.RoundEndBehavior = RoundEndBehavior.Nothing; } - // this should really go anywhere else but im tired. - private void OnAntagSelectEntity(Entity ent, ref AntagSelectEntityEvent args) - { - if (args.Handled) - return; - - var profile = args.Session != null - ? _prefs.GetPreferences(args.Session.UserId).SelectedCharacter as HumanoidCharacterProfile - : HumanoidCharacterProfile.RandomWithSpecies(); - if (!_prototypeManager.TryIndex(profile?.Species ?? SharedHumanoidAppearanceSystem.DefaultSpecies, out SpeciesPrototype? species)) - { - species = _prototypeManager.Index(SharedHumanoidAppearanceSystem.DefaultSpecies); - } - - args.Entity = Spawn(species.Prototype); - _humanoid.LoadProfile(args.Entity.Value, profile); - } - private void OnAfterAntagEntSelected(Entity ent, ref AfterAntagEntitySelectedEvent args) { if (ent.Comp.TargetStation is not { } station) diff --git a/Content.Server/GameTicking/Rules/SecretRuleSystem.cs b/Content.Server/GameTicking/Rules/SecretRuleSystem.cs index 95bf5986a5a..d25262b797a 100644 --- a/Content.Server/GameTicking/Rules/SecretRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/SecretRuleSystem.cs @@ -46,7 +46,6 @@ protected override void Added(EntityUid uid, SecretRuleComponent component, Game Log.Info($"Selected {preset.ID} as the secret preset."); _adminLogger.Add(LogType.EventStarted, $"Selected {preset.ID} as the secret preset."); - _chatManager.SendAdminAnnouncement(Loc.GetString("rule-secret-selected-preset", ("preset", preset.ID))); foreach (var rule in preset.Rules) { diff --git a/Content.Server/GameTicking/Rules/ThiefRuleSystem.cs b/Content.Server/GameTicking/Rules/ThiefRuleSystem.cs index 083085fa0d8..faec4a9e9ca 100644 --- a/Content.Server/GameTicking/Rules/ThiefRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/ThiefRuleSystem.cs @@ -24,7 +24,6 @@ public override void Initialize() SubscribeLocalEvent(AfterAntagSelected); SubscribeLocalEvent(OnGetBriefing); - SubscribeLocalEvent(OnObjectivesTextGetInfo); } private void AfterAntagSelected(Entity ent, ref AfterAntagEntitySelectedEvent args) @@ -33,41 +32,9 @@ private void AfterAntagSelected(Entity ent, ref AfterAntagEn return; //Generate objectives - GenerateObjectives(mindId, mind, ent); _antag.SendBriefing(args.EntityUid, MakeBriefing(args.EntityUid), null, null); } - private void GenerateObjectives(EntityUid mindId, MindComponent mind, ThiefRuleComponent thiefRule) - { - // Give thieves their objectives - var difficulty = 0f; - - if (_random.Prob(thiefRule.BigObjectiveChance)) // 70% chance to 1 big objective (structure or animal) - { - var objective = _objectives.GetRandomObjective(mindId, mind, thiefRule.BigObjectiveGroup); - if (objective != null) - { - _mindSystem.AddObjective(mindId, mind, objective.Value); - difficulty += Comp(objective.Value).Difficulty; - } - } - - for (var i = 0; i < thiefRule.MaxStealObjectives && thiefRule.MaxObjectiveDifficulty > difficulty; i++) // Many small objectives - { - var objective = _objectives.GetRandomObjective(mindId, mind, thiefRule.SmallObjectiveGroup); - if (objective == null) - continue; - - _mindSystem.AddObjective(mindId, mind, objective.Value); - difficulty += Comp(objective.Value).Difficulty; - } - - //Escape target - var escapeObjective = _objectives.GetRandomObjective(mindId, mind, thiefRule.EscapeObjectiveGroup); - if (escapeObjective != null) - _mindSystem.AddObjective(mindId, mind, escapeObjective.Value); - } - //Add mind briefing private void OnGetBriefing(Entity thief, ref GetBriefingEvent args) { @@ -87,10 +54,4 @@ private string MakeBriefing(EntityUid thief) briefing += "\n \n" + Loc.GetString("thief-role-greeting-equipment") + "\n"; return briefing; } - - private void OnObjectivesTextGetInfo(Entity ent, ref ObjectivesTextGetInfoEvent args) - { - args.Minds = _antag.GetAntagMindEntityUids(ent.Owner); - args.AgentName = Loc.GetString("thief-round-end-agent-name"); - } } diff --git a/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs b/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs index 1c894a460cc..29de85a42e5 100644 --- a/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs @@ -31,15 +31,12 @@ public sealed class TraitorRuleSystem : GameRuleSystem [Dependency] private readonly SharedJobSystem _jobs = default!; [Dependency] private readonly ObjectivesSystem _objectives = default!; - public const int MaxPicks = 20; - public override void Initialize() { base.Initialize(); SubscribeLocalEvent(AfterEntitySelected); - SubscribeLocalEvent(OnObjectivesTextGetInfo); SubscribeLocalEvent(OnObjectivesTextPrepend); } @@ -67,7 +64,7 @@ private void MakeCodewords(TraitorRuleComponent component) } } - public bool MakeTraitor(EntityUid traitor, TraitorRuleComponent component, bool giveUplink = true, bool giveObjectives = true) + public bool MakeTraitor(EntityUid traitor, TraitorRuleComponent component, bool giveUplink = true) { //Grab the mind if it wasnt provided if (!_mindSystem.TryGetMind(traitor, out var mindId, out var mind)) @@ -112,37 +109,16 @@ public bool MakeTraitor(EntityUid traitor, TraitorRuleComponent component, bool _npcFaction.RemoveFaction(traitor, component.NanoTrasenFaction, false); _npcFaction.AddFaction(traitor, component.SyndicateFaction); - // Give traitors their objectives - if (giveObjectives) - { - var difficulty = 0f; - for (var pick = 0; pick < MaxPicks && component.MaxDifficulty > difficulty; pick++) - { - var objective = _objectives.GetRandomObjective(mindId, mind, component.ObjectiveGroup); - if (objective == null) - continue; - - _mindSystem.AddObjective(mindId, mind, objective.Value); - var adding = Comp(objective.Value).Difficulty; - difficulty += adding; - Log.Debug($"Added objective {ToPrettyString(objective):objective} with {adding} difficulty"); - } - } - return true; } - private void OnObjectivesTextGetInfo(EntityUid uid, TraitorRuleComponent comp, ref ObjectivesTextGetInfoEvent args) - { - args.Minds = _antag.GetAntagMindEntityUids(uid); - args.AgentName = Loc.GetString("traitor-round-end-agent-name"); - } - + // TODO: AntagCodewordsComponent private void OnObjectivesTextPrepend(EntityUid uid, TraitorRuleComponent comp, ref ObjectivesTextPrependEvent args) { args.Text += "\n" + Loc.GetString("traitor-round-end-codewords", ("codewords", string.Join(", ", comp.Codewords))); } + // TODO: figure out how to handle this? add priority to briefing event? private string GenerateBriefing(string[] codewords, Note[]? uplinkCode, string? objectiveIssuer = null) { var sb = new StringBuilder(); diff --git a/Content.Server/Interaction/InteractionSystem.cs b/Content.Server/Interaction/InteractionSystem.cs index 4eac7e9ef1d..9ac82b21858 100644 --- a/Content.Server/Interaction/InteractionSystem.cs +++ b/Content.Server/Interaction/InteractionSystem.cs @@ -7,31 +7,6 @@ namespace Content.Server.Interaction { - /// - /// Governs interactions during clicking on entities - /// - [UsedImplicitly] - public sealed partial class InteractionSystem : SharedInteractionSystem - { - [Dependency] private readonly SharedContainerSystem _container = default!; - [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; - - public override bool CanAccessViaStorage(EntityUid user, EntityUid target) - { - if (Deleted(target)) - return false; - - if (!_container.TryGetContainingContainer(target, out var container)) - return false; - - if (!TryComp(container.Owner, out StorageComponent? storage)) - return false; - - if (storage.Container?.ID != container.ID) - return false; - - // we don't check if the user can access the storage entity itself. This should be handed by the UI system. - return _uiSystem.IsUiOpen(container.Owner, StorageComponent.StorageUiKey.Key, user); - } - } + // TODO Remove Shared prefix + public sealed class InteractionSystem : SharedInteractionSystem; } diff --git a/Content.Server/Lock/EntitySystems/ActivatableUIRequiresLockSystem.cs b/Content.Server/Lock/EntitySystems/ActivatableUIRequiresLockSystem.cs deleted file mode 100644 index 04f8e2eb54c..00000000000 --- a/Content.Server/Lock/EntitySystems/ActivatableUIRequiresLockSystem.cs +++ /dev/null @@ -1,43 +0,0 @@ -using Content.Server.Lock.Components; -using Content.Server.Popups; -using Content.Shared.UserInterface; -using Content.Shared.Lock; -using Content.Server.UserInterface; -using ActivatableUISystem = Content.Shared.UserInterface.ActivatableUISystem; - -namespace Content.Server.Lock.EntitySystems; -public sealed class ActivatableUIRequiresLockSystem : EntitySystem -{ - [Dependency] private readonly ActivatableUISystem _activatableUI = default!; - [Dependency] private readonly PopupSystem _popupSystem = default!; - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnUIOpenAttempt); - SubscribeLocalEvent(LockToggled); - } - - private void OnUIOpenAttempt(EntityUid uid, ActivatableUIRequiresLockComponent component, ActivatableUIOpenAttemptEvent args) - { - if (args.Cancelled) - return; - - if (TryComp(uid, out var lockComp) && lockComp.Locked != component.requireLocked) - { - args.Cancel(); - if (lockComp.Locked) - _popupSystem.PopupEntity(Loc.GetString("entity-storage-component-locked-message"), uid, args.User); - } - } - - private void LockToggled(EntityUid uid, ActivatableUIRequiresLockComponent component, LockToggledEvent args) - { - if (!TryComp(uid, out var lockComp) || lockComp.Locked == component.requireLocked) - return; - - _activatableUI.CloseAll(uid); - } -} - diff --git a/Content.Server/MagicMirror/MagicMirrorSystem.cs b/Content.Server/MagicMirror/MagicMirrorSystem.cs index fc1bff97566..8d8a6bfa3b4 100644 --- a/Content.Server/MagicMirror/MagicMirrorSystem.cs +++ b/Content.Server/MagicMirror/MagicMirrorSystem.cs @@ -1,7 +1,6 @@ using System.Linq; using Content.Server.DoAfter; using Content.Server.Humanoid; -using Content.Shared.UserInterface; using Content.Shared.DoAfter; using Content.Shared.Humanoid; using Content.Shared.Humanoid.Markings; @@ -24,7 +23,6 @@ public sealed class MagicMirrorSystem : SharedMagicMirrorSystem public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnOpenUIAttempt); Subs.BuiEvents(MagicMirrorUiKey.Key, subs => @@ -36,7 +34,6 @@ public override void Initialize() subs.Event(OnTryMagicMirrorRemoveSlot); }); - SubscribeLocalEvent(OnMagicMirrorInteract); SubscribeLocalEvent(OnSelectSlotDoAfter); SubscribeLocalEvent(OnChangeColorDoAfter); @@ -44,23 +41,6 @@ public override void Initialize() SubscribeLocalEvent(OnAddSlotDoAfter); } - private void OnMagicMirrorInteract(Entity mirror, ref AfterInteractEvent args) - { - if (!args.CanReach || args.Target == null) - return; - - if (!_uiSystem.TryOpenUi(mirror.Owner, MagicMirrorUiKey.Key, args.User)) - return; - - UpdateInterface(mirror.Owner, args.Target.Value, mirror.Comp); - } - - private void OnOpenUIAttempt(EntityUid uid, MagicMirrorComponent mirror, ActivatableUIOpenAttemptEvent args) - { - if (!HasComp(args.User)) - args.Cancel(); - } - private void OnMagicMirrorSelect(EntityUid uid, MagicMirrorComponent component, MagicMirrorSelectMessage message) { if (component.Target is not { } target) @@ -83,7 +63,8 @@ private void OnMagicMirrorSelect(EntityUid uid, MagicMirrorComponent component, BreakOnMove = true, BreakOnHandChange = false, NeedHand = true - }, out var doAfterId); + }, + out var doAfterId); component.DoAfter = doAfterId; _audio.PlayPvs(component.ChangeHairSound, uid); @@ -137,7 +118,8 @@ private void OnTryMagicMirrorChangeColor(EntityUid uid, MagicMirrorComponent com BreakOnMove = true, BreakOnHandChange = false, NeedHand = true - }, out var doAfterId); + }, + out var doAfterId); component.DoAfter = doAfterId; } @@ -189,7 +171,8 @@ private void OnTryMagicMirrorRemoveSlot(EntityUid uid, MagicMirrorComponent comp BreakOnDamage = true, BreakOnHandChange = false, NeedHand = true - }, out var doAfterId); + }, + out var doAfterId); component.DoAfter = doAfterId; _audio.PlayPvs(component.ChangeHairSound, uid); @@ -241,7 +224,8 @@ private void OnTryMagicMirrorAddSlot(EntityUid uid, MagicMirrorComponent compone BreakOnMove = true, BreakOnHandChange = false, NeedHand = true - }, out var doAfterId); + }, + out var doAfterId); component.DoAfter = doAfterId; _audio.PlayPvs(component.ChangeHairSound, uid); diff --git a/Content.Server/Movement/Components/PullMoverComponent.cs b/Content.Server/Movement/Components/PullMoverComponent.cs new file mode 100644 index 00000000000..19a01c6b17d --- /dev/null +++ b/Content.Server/Movement/Components/PullMoverComponent.cs @@ -0,0 +1,13 @@ +namespace Content.Server.Movement.Components; + +/// +/// Added to an entity that is ctrl-click moving their pulled object. +/// +/// +/// This just exists so we don't have MoveEvent subs going off for every single mob constantly. +/// +[RegisterComponent] +public sealed partial class PullMoverComponent : Component +{ + +} diff --git a/Content.Server/Movement/Components/PullMovingComponent.cs b/Content.Server/Movement/Components/PullMovingComponent.cs new file mode 100644 index 00000000000..32c50d657ad --- /dev/null +++ b/Content.Server/Movement/Components/PullMovingComponent.cs @@ -0,0 +1,14 @@ +using Robust.Shared.Map; + +namespace Content.Server.Movement.Components; + +/// +/// Added when an entity is being ctrl-click moved when pulled. +/// +[RegisterComponent] +public sealed partial class PullMovingComponent : Component +{ + // Not serialized to indicate THIS CODE SUCKS, fix pullcontroller first + [ViewVariables] + public EntityCoordinates MovingTo; +} diff --git a/Content.Server/Movement/Systems/PullController.cs b/Content.Server/Movement/Systems/PullController.cs new file mode 100644 index 00000000000..72110ff67d2 --- /dev/null +++ b/Content.Server/Movement/Systems/PullController.cs @@ -0,0 +1,318 @@ +using System.Numerics; +using Content.Server.Movement.Components; +using Content.Server.Physics.Controllers; +using Content.Shared.ActionBlocker; +using Content.Shared.Gravity; +using Content.Shared.Input; +using Content.Shared.Movement.Pulling.Components; +using Content.Shared.Movement.Pulling.Events; +using Content.Shared.Movement.Pulling.Systems; +using Content.Shared.Rotatable; +using Robust.Server.Physics; +using Robust.Shared.Containers; +using Robust.Shared.Input.Binding; +using Robust.Shared.Map; +using Robust.Shared.Physics; +using Robust.Shared.Physics.Components; +using Robust.Shared.Physics.Controllers; +using Robust.Shared.Physics.Dynamics.Joints; +using Robust.Shared.Player; +using Robust.Shared.Timing; + +namespace Content.Server.Movement.Systems; + +public sealed class PullController : VirtualController +{ + /* + * This code is awful. If you try to tweak this without refactoring it I'm gonna revert it. + */ + + // Parameterization for pulling: + // Speeds. Note that the speed is mass-independent (multiplied by mass). + // Instead, tuning to mass is done via the mass values below. + // Note that setting the speed too high results in overshoots (stabilized by drag, but bad) + private const float AccelModifierHigh = 15f; + private const float AccelModifierLow = 60.0f; + // High/low-mass marks. Curve is constant-lerp-constant, i.e. if you can even pull an item, + // you'll always get at least AccelModifierLow and no more than AccelModifierHigh. + private const float AccelModifierHighMass = 70.0f; // roundstart saltern emergency closet + private const float AccelModifierLowMass = 5.0f; // roundstart saltern emergency crowbar + // Used to control settling (turns off pulling). + private const float MaximumSettleVelocity = 0.1f; + private const float MaximumSettleDistance = 0.1f; + // Settle shutdown control. + // Mustn't be too massive, as that causes severe mispredicts *and can prevent it ever resolving*. + // Exists to bleed off "I pulled my crowbar" overshoots. + // Minimum velocity for shutdown to be necessary. This prevents stuff getting stuck b/c too much shutdown. + private const float SettleMinimumShutdownVelocity = 0.25f; + // Distance in which settle shutdown multiplier is at 0. It then scales upwards linearly with closer distances. + private const float SettleShutdownDistance = 1.0f; + // Velocity change of -LinearVelocity * frameTime * this + private const float SettleShutdownMultiplier = 20.0f; + + // How much you must move for the puller movement check to actually hit. + private const float MinimumMovementDistance = 0.005f; + + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!; + [Dependency] private readonly SharedContainerSystem _container = default!; + [Dependency] private readonly SharedGravitySystem _gravity = default!; + + /// + /// If distance between puller and pulled entity lower that this threshold, + /// pulled entity will not change its rotation. + /// Helps with small distance jittering + /// + private const float ThresholdRotDistance = 1; + + /// + /// If difference between puller and pulled angle lower that this threshold, + /// pulled entity will not change its rotation. + /// Helps with diagonal movement jittering + /// As of further adjustments, should divide cleanly into 90 degrees + /// + private const float ThresholdRotAngle = 22.5f; + + private EntityQuery _physicsQuery; + private EntityQuery _pullableQuery; + private EntityQuery _pullerQuery; + private EntityQuery _xformQuery; + + public override void Initialize() + { + CommandBinds.Builder + .Bind(ContentKeyFunctions.MovePulledObject, new PointerInputCmdHandler(OnRequestMovePulledObject)) + .Register(); + + _physicsQuery = GetEntityQuery(); + _pullableQuery = GetEntityQuery(); + _pullerQuery = GetEntityQuery(); + _xformQuery = GetEntityQuery(); + + UpdatesAfter.Add(typeof(MoverController)); + SubscribeLocalEvent(OnPullStop); + SubscribeLocalEvent(OnPullerMove); + + base.Initialize(); + } + + public override void Shutdown() + { + base.Shutdown(); + CommandBinds.Unregister(); + } + + private void OnPullStop(Entity ent, ref PullStoppedMessage args) + { + RemCompDeferred(ent); + } + + private bool OnRequestMovePulledObject(ICommonSession? session, EntityCoordinates coords, EntityUid uid) + { + if (session?.AttachedEntity is not { } player || + !player.IsValid()) + { + return false; + } + + if (!_pullerQuery.TryComp(player, out var pullerComp)) + return false; + + var pulled = pullerComp.Pulling; + + if (!_pullableQuery.TryComp(pulled, out var pullable)) + return false; + + if (_container.IsEntityInContainer(player)) + return false; + + // Cooldown buddy + if (_timing.CurTime < pullerComp.NextThrow) + return false; + + pullerComp.NextThrow = _timing.CurTime + pullerComp.ThrowCooldown; + + // Cap the distance + var range = 2f; + var fromUserCoords = coords.WithEntityId(player, EntityManager); + var userCoords = new EntityCoordinates(player, Vector2.Zero); + + if (!coords.InRange(EntityManager, TransformSystem, userCoords, range)) + { + var direction = fromUserCoords.Position - userCoords.Position; + + // TODO: Joint API not ass + // with that being said I think throwing is the way to go but. + if (pullable.PullJointId != null && + TryComp(player, out JointComponent? joint) && + joint.GetJoints.TryGetValue(pullable.PullJointId, out var pullJoint) && + pullJoint is DistanceJoint distance) + { + range = MathF.Max(0.01f, distance.MaxLength - 0.01f); + } + + fromUserCoords = new EntityCoordinates(player, direction.Normalized() * (range - 0.01f)); + coords = fromUserCoords.WithEntityId(coords.EntityId); + } + + EnsureComp(player); + var moving = EnsureComp(pulled!.Value); + moving.MovingTo = coords; + return false; + } + + private void OnPullerMove(EntityUid uid, PullMoverComponent component, ref MoveEvent args) + { + if (!_pullerQuery.TryComp(uid, out var puller)) + return; + + if (puller.Pulling is not { } pullable) + return; + + UpdatePulledRotation(uid, pullable); + + // WHY + if (args.NewPosition.EntityId == args.OldPosition.EntityId && + (args.NewPosition.Position - args.OldPosition.Position).LengthSquared() < + MinimumMovementDistance * MinimumMovementDistance) + { + return; + } + + if (_physicsQuery.TryComp(uid, out var physics)) + PhysicsSystem.WakeBody(uid, body: physics); + + StopMove(uid, pullable); + } + + private void StopMove(Entity mover, Entity moving) + { + RemCompDeferred(mover.Owner); + RemCompDeferred(moving.Owner); + } + + private void UpdatePulledRotation(EntityUid puller, EntityUid pulled) + { + // TODO: update once ComponentReference works with directed event bus. + if (!TryComp(pulled, out RotatableComponent? rotatable)) + return; + + if (!rotatable.RotateWhilePulling) + return; + + var pulledXform = _xformQuery.GetComponent(pulled); + var pullerXform = _xformQuery.GetComponent(puller); + + var pullerData = TransformSystem.GetWorldPositionRotation(pullerXform); + var pulledData = TransformSystem.GetWorldPositionRotation(pulledXform); + + var dir = pullerData.WorldPosition - pulledData.WorldPosition; + if (dir.LengthSquared() > ThresholdRotDistance * ThresholdRotDistance) + { + var oldAngle = pulledData.WorldRotation; + var newAngle = Angle.FromWorldVec(dir); + + var diff = newAngle - oldAngle; + if (Math.Abs(diff.Degrees) > ThresholdRotAngle / 2f) + { + // Ok, so this bit is difficult because ideally it would look like it's snapping to sane angles. + // Otherwise PIANO DOOR STUCK! happens. + // But it also needs to work with station rotation / align to the local parent. + // So... + var baseRotation = pulledData.WorldRotation - pulledXform.LocalRotation; + var localRotation = newAngle - baseRotation; + var localRotationSnapped = Angle.FromDegrees(Math.Floor((localRotation.Degrees / ThresholdRotAngle) + 0.5f) * ThresholdRotAngle); + TransformSystem.SetLocalRotation(pulled, localRotationSnapped, pulledXform); + } + } + } + + public override void UpdateBeforeSolve(bool prediction, float frameTime) + { + base.UpdateBeforeSolve(prediction, frameTime); + var movingQuery = EntityQueryEnumerator(); + + while (movingQuery.MoveNext(out var pullableEnt, out var mover, out var pullable, out var pullableXform)) + { + if (!mover.MovingTo.IsValid(EntityManager)) + { + RemCompDeferred(pullableEnt); + continue; + } + + if (pullable.Puller is not {Valid: true} puller) + continue; + + var pullerXform = _xformQuery.Get(puller); + var pullerPosition = TransformSystem.GetMapCoordinates(pullerXform); + + var movingTo = mover.MovingTo.ToMap(EntityManager, TransformSystem); + + if (movingTo.MapId != pullerPosition.MapId) + { + RemCompDeferred(pullableEnt); + continue; + } + + if (!TryComp(pullableEnt, out var physics) || + physics.BodyType == BodyType.Static || + movingTo.MapId != pullableXform.MapID) + { + RemCompDeferred(pullableEnt); + continue; + } + + var movingPosition = movingTo.Position; + var ownerPosition = TransformSystem.GetWorldPosition(pullableXform); + + var diff = movingPosition - ownerPosition; + var diffLength = diff.Length(); + + if (diffLength < MaximumSettleDistance && physics.LinearVelocity.Length() < MaximumSettleVelocity) + { + PhysicsSystem.SetLinearVelocity(pullableEnt, Vector2.Zero, body: physics); + RemCompDeferred(pullableEnt); + continue; + } + + var impulseModifierLerp = Math.Min(1.0f, Math.Max(0.0f, (physics.Mass - AccelModifierLowMass) / (AccelModifierHighMass - AccelModifierLowMass))); + var impulseModifier = MathHelper.Lerp(AccelModifierLow, AccelModifierHigh, impulseModifierLerp); + var multiplier = diffLength < 1 ? impulseModifier * diffLength : impulseModifier; + // Note the implication that the real rules of physics don't apply to pulling control. + var accel = diff.Normalized() * multiplier; + // Now for the part where velocity gets shutdown... + if (diffLength < SettleShutdownDistance && physics.LinearVelocity.Length() >= SettleMinimumShutdownVelocity) + { + // Shutdown velocity increases as we get closer to centre + var scaling = (SettleShutdownDistance - diffLength) / SettleShutdownDistance; + accel -= physics.LinearVelocity * SettleShutdownMultiplier * scaling; + } + + PhysicsSystem.WakeBody(pullableEnt, body: physics); + + var impulse = accel * physics.Mass * frameTime; + PhysicsSystem.ApplyLinearImpulse(pullableEnt, impulse, body: physics); + + // if the puller is weightless or can't move, then we apply the inverse impulse (Newton's third law). + // doing it under gravity produces an unsatisfying wiggling when pulling. + // If player can't move, assume they are on a chair and we need to prevent pull-moving. + if (_gravity.IsWeightless(puller) && pullerXform.Comp.GridUid == null || !_actionBlockerSystem.CanMove(puller)) + { + PhysicsSystem.WakeBody(puller); + PhysicsSystem.ApplyLinearImpulse(puller, -impulse); + } + } + + // Cleanup PullMover + var moverQuery = EntityQueryEnumerator(); + + while (moverQuery.MoveNext(out var uid, out _, out var puller)) + { + if (!HasComp(puller.Pulling)) + { + RemCompDeferred(uid); + continue; + } + } + } +} diff --git a/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs b/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs index 1dfaf4f3393..0c1e88653fa 100644 --- a/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs +++ b/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs @@ -102,20 +102,23 @@ private int Download(EntityUid uid, List ids) /// public void SetSuitPowerAlert(EntityUid uid, SpaceNinjaComponent? comp = null) { - if (!Resolve(uid, ref comp, false) || comp.Deleted || comp.Suit == null) + if (!Resolve(uid, ref comp, false)) + return; + + if (comp.Deleted || comp.Suit == null) { - _alerts.ClearAlert(uid, AlertType.SuitPower); + _alerts.ClearAlert(uid, comp.SuitPowerAlert); return; } if (GetNinjaBattery(uid, out _, out var battery)) { var severity = ContentHelpers.RoundToLevels(MathF.Max(0f, battery.CurrentCharge), battery.MaxCharge, 8); - _alerts.ShowAlert(uid, AlertType.SuitPower, (short) severity); + _alerts.ShowAlert(uid, comp.SuitPowerAlert, (short) severity); } else { - _alerts.ClearAlert(uid, AlertType.SuitPower); + _alerts.ClearAlert(uid, comp.SuitPowerAlert); } } diff --git a/Content.Server/NodeContainer/Nodes/PipeNode.cs b/Content.Server/NodeContainer/Nodes/PipeNode.cs index 861f3eea98d..31ee5712493 100644 --- a/Content.Server/NodeContainer/Nodes/PipeNode.cs +++ b/Content.Server/NodeContainer/Nodes/PipeNode.cs @@ -20,7 +20,7 @@ public partial class PipeNode : Node, IGasMixtureHolder, IRotatableNode /// The directions in which this pipe can connect to other pipes around it. /// [DataField("pipeDirection")] - private PipeDirection _originalPipeDirection; + public PipeDirection OriginalPipeDirection; /// /// The *current* pipe directions (accounting for rotation) @@ -110,26 +110,26 @@ public override void Initialize(EntityUid owner, IEntityManager entMan) return; var xform = entMan.GetComponent(owner); - CurrentPipeDirection = _originalPipeDirection.RotatePipeDirection(xform.LocalRotation); + CurrentPipeDirection = OriginalPipeDirection.RotatePipeDirection(xform.LocalRotation); } bool IRotatableNode.RotateNode(in MoveEvent ev) { - if (_originalPipeDirection == PipeDirection.Fourway) + if (OriginalPipeDirection == PipeDirection.Fourway) return false; // update valid pipe direction if (!RotationsEnabled) { - if (CurrentPipeDirection == _originalPipeDirection) + if (CurrentPipeDirection == OriginalPipeDirection) return false; - CurrentPipeDirection = _originalPipeDirection; + CurrentPipeDirection = OriginalPipeDirection; return true; } var oldDirection = CurrentPipeDirection; - CurrentPipeDirection = _originalPipeDirection.RotatePipeDirection(ev.NewRotation); + CurrentPipeDirection = OriginalPipeDirection.RotatePipeDirection(ev.NewRotation); return oldDirection != CurrentPipeDirection; } @@ -142,12 +142,12 @@ public override void OnAnchorStateChanged(IEntityManager entityManager, bool anc if (!RotationsEnabled) { - CurrentPipeDirection = _originalPipeDirection; + CurrentPipeDirection = OriginalPipeDirection; return; } var xform = entityManager.GetComponent(Owner); - CurrentPipeDirection = _originalPipeDirection.RotatePipeDirection(xform.LocalRotation); + CurrentPipeDirection = OriginalPipeDirection.RotatePipeDirection(xform.LocalRotation); } public override IEnumerable GetReachableNodes(TransformComponent xform, diff --git a/Content.Server/Objectives/ObjectivesSystem.cs b/Content.Server/Objectives/ObjectivesSystem.cs index 47fe4eb5f88..f8ecc22828e 100644 --- a/Content.Server/Objectives/ObjectivesSystem.cs +++ b/Content.Server/Objectives/ObjectivesSystem.cs @@ -36,14 +36,14 @@ public override void Initialize() private void OnRoundEndText(RoundEndTextAppendEvent ev) { // go through each gamerule getting data for the roundend summary. - var summaries = new Dictionary>>(); + var summaries = new Dictionary>>(); var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out var gameRule)) { if (!_gameTicker.IsGameRuleAdded(uid, gameRule)) continue; - var info = new ObjectivesTextGetInfoEvent(new List(), string.Empty); + var info = new ObjectivesTextGetInfoEvent(new List<(EntityUid, string)>(), string.Empty); RaiseLocalEvent(uid, ref info); if (info.Minds.Count == 0) continue; @@ -51,7 +51,7 @@ private void OnRoundEndText(RoundEndTextAppendEvent ev) // first group the gamerules by their agents, for example 2 different dragons var agent = info.AgentName; if (!summaries.ContainsKey(agent)) - summaries[agent] = new Dictionary>(); + summaries[agent] = new Dictionary>(); var prepend = new ObjectivesTextPrependEvent(""); RaiseLocalEvent(uid, ref prepend); @@ -79,7 +79,7 @@ private void OnRoundEndText(RoundEndTextAppendEvent ev) foreach (var (_, minds) in summary) { total += minds.Count; - totalInCustody += minds.Where(m => IsInCustody(m)).Count(); + totalInCustody += minds.Where(pair => IsInCustody(pair.Item1)).Count(); } var result = new StringBuilder(); @@ -104,19 +104,16 @@ private void OnRoundEndText(RoundEndTextAppendEvent ev) } } - private void AddSummary(StringBuilder result, string agent, List minds) + private void AddSummary(StringBuilder result, string agent, List<(EntityUid, string)> minds) { var agentSummaries = new List<(string summary, float successRate, int completedObjectives)>(); - foreach (var mindId in minds) + foreach (var (mindId, name) in minds) { - if (!TryComp(mindId, out MindComponent? mind)) - continue; - - var title = GetTitle(mindId, mind); - if (title == null) + if (!TryComp(mindId, out var mind)) continue; + var title = GetTitle((mindId, mind), name); var custody = IsInCustody(mindId, mind) ? Loc.GetString("objectives-in-custody") : string.Empty; var objectives = mind.Objectives; @@ -238,34 +235,18 @@ private bool IsInCustody(EntityUid mindId, MindComponent? mind = null) /// /// Get the title for a player's mind used in round end. + /// Pass in the original entity name which is shown alongside username. /// - public string? GetTitle(EntityUid mindId, MindComponent? mind = null) + public string GetTitle(Entity mind, string name) { - if (!Resolve(mindId, ref mind)) - return null; - - var name = mind.CharacterName; - var username = (string?) null; - - if (mind.OriginalOwnerUserId != null && - _player.TryGetPlayerData(mind.OriginalOwnerUserId.Value, out var sessionData)) + if (Resolve(mind, ref mind.Comp) && + mind.Comp.OriginalOwnerUserId != null && + _player.TryGetPlayerData(mind.Comp.OriginalOwnerUserId.Value, out var sessionData)) { - username = sessionData.UserName; + var username = sessionData.UserName; + return Loc.GetString("objectives-player-user-named", ("user", username), ("name", name)); } - - if (username != null) - { - if (name != null) - return Loc.GetString("objectives-player-user-named", ("user", username), ("name", name)); - - return Loc.GetString("objectives-player-user", ("user", username)); - } - - // nothing to identify the player by, just give up - if (name == null) - return null; - return Loc.GetString("objectives-player-named", ("name", name)); } } @@ -279,7 +260,7 @@ private bool IsInCustody(EntityUid mindId, MindComponent? mind = null) /// The objectives system already checks if the game rule is added so you don't need to check that in this event's handler. /// [ByRefEvent] -public record struct ObjectivesTextGetInfoEvent(List Minds, string AgentName); +public record struct ObjectivesTextGetInfoEvent(List<(EntityUid, string)> Minds, string AgentName); /// /// Raised on the game rule before text for each agent's objectives is added, letting you prepend something. diff --git a/Content.Server/Power/EntitySystems/ApcSystem.cs b/Content.Server/Power/EntitySystems/ApcSystem.cs index 529d4d81d7c..d88edd85cb5 100644 --- a/Content.Server/Power/EntitySystems/ApcSystem.cs +++ b/Content.Server/Power/EntitySystems/ApcSystem.cs @@ -45,7 +45,7 @@ public override void Update(float deltaTime) var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out var apc, out var battery, out var ui)) { - if (apc.LastUiUpdate + ApcComponent.VisualsChangeDelay < _gameTiming.CurTime) + if (apc.LastUiUpdate + ApcComponent.VisualsChangeDelay < _gameTiming.CurTime && _ui.IsUiOpen((uid, ui), ApcUiKey.Key)) { apc.LastUiUpdate = _gameTiming.CurTime; UpdateUIState(uid, apc, battery); diff --git a/Content.Server/Preferences/Managers/IServerPreferencesManager.cs b/Content.Server/Preferences/Managers/IServerPreferencesManager.cs index 63c267f154a..cdb53bb4be7 100644 --- a/Content.Server/Preferences/Managers/IServerPreferencesManager.cs +++ b/Content.Server/Preferences/Managers/IServerPreferencesManager.cs @@ -20,5 +20,7 @@ public interface IServerPreferencesManager PlayerPreferences? GetPreferencesOrNull(NetUserId? userId); IEnumerable> GetSelectedProfilesForPlayers(List userIds); bool HavePreferencesLoaded(ICommonSession session); + + Task SetProfile(NetUserId userId, int slot, ICharacterProfile profile); } } diff --git a/Content.Server/Preferences/Managers/ServerPreferencesManager.cs b/Content.Server/Preferences/Managers/ServerPreferencesManager.cs index 5c89377f7a0..7863a58caea 100644 --- a/Content.Server/Preferences/Managers/ServerPreferencesManager.cs +++ b/Content.Server/Preferences/Managers/ServerPreferencesManager.cs @@ -27,13 +27,16 @@ public sealed class ServerPreferencesManager : IServerPreferencesManager [Dependency] private readonly IServerDbManager _db = default!; [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IDependencyCollection _dependencies = default!; + [Dependency] private readonly ILogManager _log = default!; private IServerSponsorsManager? _sponsors; // Cache player prefs on the server so we don't need as much async hell related to them. private readonly Dictionary _cachedPlayerPrefs = new(); - // private int MaxCharacterSlots => _cfg.GetCVar(CCVars.GameMaxCharacterSlots); // Sunrise-Sponsors + private ISawmill _sawmill = default!; + + // private int MaxCharacterSlots => _cfg.GetCVar(CCVars.GameMaxCharacterSlots); public void Init() { @@ -42,6 +45,7 @@ public void Init() _netManager.RegisterNetMessage(HandleSelectCharacterMessage); _netManager.RegisterNetMessage(HandleUpdateCharacterMessage); _netManager.RegisterNetMessage(HandleDeleteCharacterMessage); + _sawmill = _log.GetSawmill("prefs"); } private async void HandleSelectCharacterMessage(MsgSelectCharacter message) @@ -78,27 +82,25 @@ private async void HandleSelectCharacterMessage(MsgSelectCharacter message) private async void HandleUpdateCharacterMessage(MsgUpdateCharacter message) { - var slot = message.Slot; - var profile = message.Profile; var userId = message.MsgChannel.UserId; - if (profile == null) - { - Logger.WarningS("prefs", - $"User {userId} sent a {nameof(MsgUpdateCharacter)} with a null profile in slot {slot}."); - return; - } + // ReSharper disable once ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract + if (message.Profile == null) + _sawmill.Error($"User {userId} sent a {nameof(MsgUpdateCharacter)} with a null profile in slot {message.Slot}."); + else + await SetProfile(userId, message.Slot, message.Profile); + } + public async Task SetProfile(NetUserId userId, int slot, ICharacterProfile profile) + { if (!_cachedPlayerPrefs.TryGetValue(userId, out var prefsData) || !prefsData.PrefsLoaded) { - Logger.WarningS("prefs", $"User {userId} tried to modify preferences before they loaded."); + _sawmill.Error($"Tried to modify user {userId} preferences before they loaded."); return; } - if (slot < 0 || slot >= GetMaxUserCharacterSlots(userId)) // Sunrise-Sponsors - { + if (slot < 0 || slot >= GetMaxUserCharacterSlots(userId)) return; - } var curPrefs = prefsData.Prefs!; var session = _playerManager.GetSessionById(userId); @@ -117,10 +119,8 @@ private async void HandleUpdateCharacterMessage(MsgUpdateCharacter message) prefsData.Prefs = new PlayerPreferences(profiles, slot, curPrefs.AdminOOCColor); - if (ShouldStorePrefs(message.MsgChannel.AuthType)) - { - await _db.SaveCharacterSlotAsync(message.MsgChannel.UserId, message.Profile, message.Slot); - } + if (ShouldStorePrefs(session.Channel.AuthType)) + await _db.SaveCharacterSlotAsync(userId, profile, slot); } private async void HandleDeleteCharacterMessage(MsgDeleteCharacter message) diff --git a/Content.Server/Revenant/EntitySystems/RevenantSystem.cs b/Content.Server/Revenant/EntitySystems/RevenantSystem.cs index 86be70c41fe..c390432f3a1 100644 --- a/Content.Server/Revenant/EntitySystems/RevenantSystem.cs +++ b/Content.Server/Revenant/EntitySystems/RevenantSystem.cs @@ -141,7 +141,7 @@ public bool ChangeEssenceAmount(EntityUid uid, FixedPoint2 amount, RevenantCompo if (TryComp(uid, out var store)) _store.UpdateUserInterface(uid, uid, store); - _alerts.ShowAlert(uid, AlertType.Essence); + _alerts.ShowAlert(uid, component.EssenceAlert); if (component.Essence <= 0) { diff --git a/Content.Server/Shuttles/Components/FTLComponent.cs b/Content.Server/Shuttles/Components/FTLComponent.cs index edcf25981ba..0a01bb7636e 100644 --- a/Content.Server/Shuttles/Components/FTLComponent.cs +++ b/Content.Server/Shuttles/Components/FTLComponent.cs @@ -50,6 +50,9 @@ public sealed partial class FTLComponent : Component Params = AudioParams.Default.WithVolume(-3f).WithLoop(true) }; + [DataField] + public EntityUid? StartupStream; + [DataField] public EntityUid? TravelStream; } diff --git a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs index cf7058afb92..04063305f84 100644 --- a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs +++ b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs @@ -22,6 +22,7 @@ using Content.Shared.Database; using Content.Shared.DeviceNetwork; using Content.Shared.GameTicking; +using Content.Shared.Localizations; using Content.Shared.Shuttles.Components; using Content.Shared.Shuttles.Events; using Content.Shared.Tag; @@ -287,7 +288,9 @@ public void CallEmergencyShuttle(EntityUid stationUid, StationEmergencyShuttleCo if (TryComp(targetGrid.Value, out TransformComponent? targetXform)) { var angle = _dock.GetAngle(stationShuttle.EmergencyShuttle.Value, xform, targetGrid.Value, targetXform, xformQuery); - _chatSystem.DispatchStationAnnouncement(stationUid, Loc.GetString("emergency-shuttle-docked", ("time", $"{_consoleAccumulator:0}"), ("direction", angle.GetDir())), playSound: false); + var direction = ContentLocalizationManager.FormatDirection(angle.GetDir()); + var location = FormattedMessage.RemoveMarkup(_navMap.GetNearestBeaconString((stationShuttle.EmergencyShuttle.Value, xform))); + _chatSystem.DispatchStationAnnouncement(stationUid, Loc.GetString("emergency-shuttle-docked", ("time", $"{_consoleAccumulator:0}"), ("direction", direction), ("location", location)), playSound: false); } // shuttle timers @@ -311,8 +314,13 @@ public void CallEmergencyShuttle(EntityUid stationUid, StationEmergencyShuttleCo } else { - var location = FormattedMessage.RemoveMarkup(_navMap.GetNearestBeaconString((stationShuttle.EmergencyShuttle.Value, xform))); - _chatSystem.DispatchStationAnnouncement(stationUid, Loc.GetString("emergency-shuttle-nearby", ("direction", location)), playSound: false); + if (TryComp(targetGrid.Value, out var targetXform)) + { + var angle = _dock.GetAngle(stationShuttle.EmergencyShuttle.Value, xform, targetGrid.Value, targetXform, xformQuery); + var direction = ContentLocalizationManager.FormatDirection(angle.GetDir()); + var location = FormattedMessage.RemoveMarkup(_navMap.GetNearestBeaconString((stationShuttle.EmergencyShuttle.Value, xform))); + _chatSystem.DispatchStationAnnouncement(stationUid, Loc.GetString("emergency-shuttle-nearby", ("time", $"{_consoleAccumulator:0}"), ("direction", direction), ("location", location)), playSound: false); + } _logger.Add(LogType.EmergencyShuttle, LogImpact.High, $"Emergency shuttle {ToPrettyString(stationUid)} unable to find a valid docking port for {ToPrettyString(stationUid)}"); // TODO: Need filter extensions or something don't blame me. diff --git a/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs b/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs index 2b5769881d2..7a19fd13b2e 100644 --- a/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs +++ b/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs @@ -317,7 +317,7 @@ public void AddPilot(EntityUid uid, EntityUid entity, ShuttleConsoleComponent co component.SubscribedPilots.Add(entity); - _alertsSystem.ShowAlert(entity, AlertType.PilotingShuttle); + _alertsSystem.ShowAlert(entity, pilotComponent.PilotingAlert); pilotComponent.Console = uid; ActionBlockerSystem.UpdateCanMove(entity); @@ -339,7 +339,7 @@ public void RemovePilot(EntityUid pilotUid, PilotComponent pilotComponent) if (!helm.SubscribedPilots.Remove(pilotUid)) return; - _alertsSystem.ClearAlert(pilotUid, AlertType.PilotingShuttle); + _alertsSystem.ClearAlert(pilotUid, pilotComponent.PilotingAlert); _popup.PopupEntity(Loc.GetString("shuttle-pilot-end"), pilotUid, pilotUid); diff --git a/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs b/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs index 11cc16e0cd0..28f784f1dda 100644 --- a/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs +++ b/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs @@ -24,6 +24,7 @@ using Robust.Shared.Map.Components; using Robust.Shared.Physics; using Robust.Shared.Physics.Components; +using Robust.Shared.Player; using Robust.Shared.Utility; using FTLMapComponent = Content.Shared.Shuttles.Components.FTLMapComponent; @@ -343,12 +344,8 @@ private bool TrySetupFTL(EntityUid uid, ShuttleComponent shuttle, [NotNullWhen(t component = AddComp(uid); component.State = FTLState.Starting; var audio = _audio.PlayPvs(_startupSound, uid); - audio.Value.Component.Flags |= AudioFlags.GridAudio; - - if (_physicsQuery.TryGetComponent(uid, out var gridPhysics)) - { - _transform.SetLocalPosition(audio.Value.Entity, gridPhysics.LocalCenter); - } + _audio.SetGridAudio(audio); + component.StartupStream = audio?.Entity; // TODO: Play previs here for docking arrival. @@ -377,6 +374,17 @@ private void UpdateFTLStarting(Entity entity) var body = _physicsQuery.GetComponent(entity); var shuttleCenter = body.LocalCenter; + // Leave audio at the old spot + // Just so we don't clip + if (fromMapUid != null && TryComp(comp.StartupStream, out AudioComponent? startupAudio)) + { + var clippedAudio = _audio.PlayStatic(_startupSound, Filter.Broadcast(), + new EntityCoordinates(fromMapUid.Value, _maps.GetGridPosition(entity.Owner)), true, startupAudio.Params); + + _audio.SetPlaybackPosition(clippedAudio, entity.Comp1.StartupTime); + clippedAudio.Value.Component.Flags |= AudioFlags.NoOcclusion; + } + // Offset the start by buffer range just to avoid overlap. var ftlStart = new EntityCoordinates(ftlMap, new Vector2(_index + width / 2f, 0f) - shuttleCenter); @@ -402,15 +410,7 @@ private void UpdateFTLStarting(Entity entity) // Audio var wowdio = _audio.PlayPvs(comp.TravelSound, uid); comp.TravelStream = wowdio?.Entity; - if (wowdio?.Component != null) - { - wowdio.Value.Component.Flags |= AudioFlags.GridAudio; - - if (_physicsQuery.TryGetComponent(uid, out var gridPhysics)) - { - _transform.SetLocalPosition(wowdio.Value.Entity, gridPhysics.LocalCenter); - } - } + _audio.SetGridAudio(wowdio); } /// @@ -509,13 +509,7 @@ private void UpdateFTLArriving(Entity entity) comp.TravelStream = _audio.Stop(comp.TravelStream); var audio = _audio.PlayPvs(_arrivalSound, uid); - audio.Value.Component.Flags |= AudioFlags.GridAudio; - // TODO: Shitcode til engine fix - - if (_physicsQuery.TryGetComponent(uid, out var gridPhysics)) - { - _transform.SetLocalPosition(audio.Value.Entity, gridPhysics.LocalCenter); - } + _audio.SetGridAudio(audio); if (TryComp(uid, out var dest)) { diff --git a/Content.Server/Shuttles/Systems/ShuttleSystem.cs b/Content.Server/Shuttles/Systems/ShuttleSystem.cs index 6fe2324d51e..bbafef022c8 100644 --- a/Content.Server/Shuttles/Systems/ShuttleSystem.cs +++ b/Content.Server/Shuttles/Systems/ShuttleSystem.cs @@ -41,6 +41,7 @@ public sealed partial class ShuttleSystem : SharedShuttleSystem [Dependency] private readonly MapLoaderSystem _loader = default!; [Dependency] private readonly MetaDataSystem _metadata = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedMapSystem _maps = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly ShuttleConsoleSystem _console = default!; diff --git a/Content.Server/Silicons/Borgs/BorgSystem.cs b/Content.Server/Silicons/Borgs/BorgSystem.cs index ceab044d4c1..082e38921a2 100644 --- a/Content.Server/Silicons/Borgs/BorgSystem.cs +++ b/Content.Server/Silicons/Borgs/BorgSystem.cs @@ -5,7 +5,6 @@ using Content.Server.Explosion.EntitySystems; using Content.Server.Hands.Systems; using Content.Server.PowerCell; -using Content.Shared.UserInterface; using Content.Shared.Access.Systems; using Content.Shared.Alert; using Content.Shared.Database; @@ -70,7 +69,6 @@ public override void Initialize() SubscribeLocalEvent(OnMobStateChanged); SubscribeLocalEvent(OnPowerCellChanged); SubscribeLocalEvent(OnPowerCellSlotEmpty); - SubscribeLocalEvent(OnUIOpenAttempt); SubscribeLocalEvent(OnGetDeadIC); SubscribeLocalEvent(OnBrainMindAdded); @@ -84,7 +82,7 @@ public override void Initialize() private void OnMapInit(EntityUid uid, BorgChassisComponent component, MapInitEvent args) { - UpdateBatteryAlert(uid); + UpdateBatteryAlert((uid, component)); _movementSpeedModifier.RefreshMovementSpeedModifiers(uid); } @@ -183,7 +181,7 @@ private void OnMobStateChanged(EntityUid uid, BorgChassisComponent component, Mo private void OnPowerCellChanged(EntityUid uid, BorgChassisComponent component, PowerCellChangedEvent args) { - UpdateBatteryAlert(uid); + UpdateBatteryAlert((uid, component)); if (!TryComp(uid, out var draw)) return; @@ -214,13 +212,6 @@ private void OnPowerCellSlotEmpty(EntityUid uid, BorgChassisComponent component, UpdateUI(uid, component); } - private void OnUIOpenAttempt(EntityUid uid, BorgChassisComponent component, ActivatableUIOpenAttemptEvent args) - { - // borgs can't view their own ui - if (args.User == uid) - args.Cancel(); - } - private void OnGetDeadIC(EntityUid uid, BorgChassisComponent component, ref GetCharactedDeadIcEvent args) { args.Dead = true; @@ -256,12 +247,12 @@ private void OnBrainPointAttempt(EntityUid uid, BorgBrainComponent component, Po args.Cancel(); } - private void UpdateBatteryAlert(EntityUid uid, PowerCellSlotComponent? slotComponent = null) + private void UpdateBatteryAlert(Entity ent, PowerCellSlotComponent? slotComponent = null) { - if (!_powerCell.TryGetBatteryFromSlot(uid, out var battery, slotComponent)) + if (!_powerCell.TryGetBatteryFromSlot(ent, out var battery, slotComponent)) { - _alerts.ClearAlert(uid, AlertType.BorgBattery); - _alerts.ShowAlert(uid, AlertType.BorgBatteryNone); + _alerts.ClearAlert(ent, ent.Comp.BatteryAlert); + _alerts.ShowAlert(ent, ent.Comp.NoBatteryAlert); return; } @@ -269,13 +260,13 @@ private void UpdateBatteryAlert(EntityUid uid, PowerCellSlotComponent? slotCompo // we make sure 0 only shows if they have absolutely no battery. // also account for floating point imprecision - if (chargePercent == 0 && _powerCell.HasDrawCharge(uid, cell: slotComponent)) + if (chargePercent == 0 && _powerCell.HasDrawCharge(ent, cell: slotComponent)) { chargePercent = 1; } - _alerts.ClearAlert(uid, AlertType.BorgBatteryNone); - _alerts.ShowAlert(uid, AlertType.BorgBattery, chargePercent); + _alerts.ClearAlert(ent, ent.Comp.NoBatteryAlert); + _alerts.ShowAlert(ent, ent.Comp.BatteryAlert, chargePercent); } /// diff --git a/Content.Server/StationEvents/Events/ImmovableRodRule.cs b/Content.Server/StationEvents/Events/ImmovableRodRule.cs index cacb839cd39..aa193f2f4cb 100644 --- a/Content.Server/StationEvents/Events/ImmovableRodRule.cs +++ b/Content.Server/StationEvents/Events/ImmovableRodRule.cs @@ -28,7 +28,9 @@ protected override void Started(EntityUid uid, ImmovableRodRuleComponent compone if (proto.TryGetComponent(out var rod) && proto.TryGetComponent(out var despawn)) { - TryFindRandomTile(out _, out _, out _, out var targetCoords); + if (!TryFindRandomTile(out _, out _, out _, out var targetCoords)) + return; + var speed = RobustRandom.NextFloat(rod.MinSpeed, rod.MaxSpeed); var angle = RobustRandom.NextAngle(); var direction = angle.ToVec(); diff --git a/Content.Server/Strip/StrippableSystem.cs b/Content.Server/Strip/StrippableSystem.cs index 6f0a1ecb328..ded9eab3eb2 100644 --- a/Content.Server/Strip/StrippableSystem.cs +++ b/Content.Server/Strip/StrippableSystem.cs @@ -1,7 +1,6 @@ using System.Linq; using Content.Server.Administration.Logs; using Content.Server.Ensnaring; -using Content.Shared.CombatMode; using Content.Shared.Cuffs; using Content.Shared.Cuffs.Components; using Content.Shared.Database; @@ -10,7 +9,6 @@ using Content.Shared.Hands.Components; using Content.Shared.Hands.EntitySystems; using Content.Shared.IdentityManagement; -using Content.Shared.Interaction; using Content.Shared.Interaction.Events; using Content.Shared.Inventory; using Content.Shared.Inventory.VirtualItem; @@ -18,7 +16,6 @@ using Content.Shared.Strip; using Content.Shared.Strip.Components; using Content.Shared.Verbs; -using Robust.Server.GameObjects; using Robust.Shared.Player; using Robust.Shared.Utility; @@ -28,7 +25,6 @@ public sealed class StrippableSystem : SharedStrippableSystem { [Dependency] private readonly InventorySystem _inventorySystem = default!; [Dependency] private readonly EnsnareableSystem _ensnaringSystem = default!; - [Dependency] private readonly UserInterfaceSystem _userInterfaceSystem = default!; [Dependency] private readonly SharedCuffableSystem _cuffableSystem = default!; [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; @@ -45,7 +41,6 @@ public override void Initialize() SubscribeLocalEvent>(AddStripVerb); SubscribeLocalEvent>(AddStripExamineVerb); - SubscribeLocalEvent(OnActivateInWorld); // BUI SubscribeLocalEvent(OnStripButtonPressed); @@ -68,7 +63,7 @@ private void AddStripVerb(EntityUid uid, StrippableComponent component, GetVerbs { Text = Loc.GetString("strip-verb-get-data-text"), Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/outfit.svg.192dpi.png")), - Act = () => StartOpeningStripper(args.User, (uid, component), true), + Act = () => TryOpenStrippingUi(args.User, (uid, component), true), }; args.Verbs.Add(verb); @@ -86,37 +81,13 @@ private void AddStripExamineVerb(EntityUid uid, StrippableComponent component, G { Text = Loc.GetString("strip-verb-get-data-text"), Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/outfit.svg.192dpi.png")), - Act = () => StartOpeningStripper(args.User, (uid, component), true), + Act = () => TryOpenStrippingUi(args.User, (uid, component), true), Category = VerbCategory.Examine, }; args.Verbs.Add(verb); } - private void OnActivateInWorld(EntityUid uid, StrippableComponent component, ActivateInWorldEvent args) - { - if (args.Target == args.User) - return; - - if (!HasComp(args.User)) - return; - - StartOpeningStripper(args.User, (uid, component)); - } - - public override void StartOpeningStripper(EntityUid user, Entity strippable, bool openInCombat = false) - { - base.StartOpeningStripper(user, strippable, openInCombat); - - if (TryComp(user, out var mode) && mode.IsInCombatMode && !openInCombat) - return; - - if (HasComp(user)) - { - _userInterfaceSystem.OpenUi(strippable.Owner, StrippingUiKey.Key, user); - } - } - private void OnStripButtonPressed(Entity strippable, ref StrippingSlotButtonPressed args) { if (args.Actor is not { Valid: true } user || @@ -442,6 +413,9 @@ private void StartStripInsertHand( var (time, stealth) = GetStripTimeModifiers(user, target, targetStrippable.HandStripDelay); + if (!stealth) + _popupSystem.PopupEntity(Loc.GetString("strippable-component-alert-owner-insert-hand", ("user", Identity.Entity(user, EntityManager)), ("item", user.Comp.ActiveHandEntity!.Value)), target, target, PopupType.Large); + var prefix = stealth ? "stealthily " : ""; _adminLogger.Add(LogType.Stripping, LogImpact.Low, $"{ToPrettyString(user):actor} is trying to {prefix}place the item {ToPrettyString(held):item} in {ToPrettyString(target):target}'s hands"); diff --git a/Content.Server/Temperature/Components/TemperatureComponent.cs b/Content.Server/Temperature/Components/TemperatureComponent.cs index ec00a570f96..3bfa12f2693 100644 --- a/Content.Server/Temperature/Components/TemperatureComponent.cs +++ b/Content.Server/Temperature/Components/TemperatureComponent.cs @@ -1,7 +1,9 @@ using Content.Server.Temperature.Systems; +using Content.Shared.Alert; using Content.Shared.Atmos; using Content.Shared.Damage; using Content.Shared.FixedPoint; +using Robust.Shared.Prototypes; namespace Content.Server.Temperature.Components; @@ -78,4 +80,10 @@ public float HeatCapacity /// [DataField] public bool TakingDamage = false; + + [DataField] + public ProtoId HotAlert = "Hot"; + + [DataField] + public ProtoId ColdAlert = "Cold"; } diff --git a/Content.Server/Temperature/Systems/TemperatureSystem.cs b/Content.Server/Temperature/Systems/TemperatureSystem.cs index 6c9e99e5f3b..23c8cb6783f 100644 --- a/Content.Server/Temperature/Systems/TemperatureSystem.cs +++ b/Content.Server/Temperature/Systems/TemperatureSystem.cs @@ -12,6 +12,7 @@ using Content.Shared.Rejuvenate; using Content.Shared.Temperature; using Robust.Shared.Physics.Components; +using Robust.Shared.Prototypes; namespace Content.Server.Temperature.Systems; @@ -33,6 +34,9 @@ public sealed class TemperatureSystem : EntitySystem private float _accumulatedFrametime; + [ValidatePrototypeId] + public const string TemperatureAlertCategory = "Temperature"; + public override void Initialize() { SubscribeLocalEvent(EnqueueDamage); @@ -180,13 +184,13 @@ private void OnRejuvenate(EntityUid uid, TemperatureComponent comp, RejuvenateEv private void ServerAlert(EntityUid uid, AlertsComponent status, OnTemperatureChangeEvent args) { - AlertType type; + ProtoId type; float threshold; float idealTemp; if (!TryComp(uid, out var temperature)) { - _alerts.ClearAlertCategory(uid, AlertCategory.Temperature); + _alerts.ClearAlertCategory(uid, TemperatureAlertCategory); return; } @@ -203,12 +207,12 @@ private void ServerAlert(EntityUid uid, AlertsComponent status, OnTemperatureCha if (args.CurrentTemperature <= idealTemp) { - type = AlertType.Cold; + type = temperature.ColdAlert; threshold = temperature.ColdDamageThreshold; } else { - type = AlertType.Hot; + type = temperature.HotAlert; threshold = temperature.HeatDamageThreshold; } @@ -230,7 +234,7 @@ private void ServerAlert(EntityUid uid, AlertsComponent status, OnTemperatureCha break; case > 0.66f: - _alerts.ClearAlertCategory(uid, AlertCategory.Temperature); + _alerts.ClearAlertCategory(uid, TemperatureAlertCategory); break; } } diff --git a/Content.Server/VendingMachines/VendingMachineSystem.cs b/Content.Server/VendingMachines/VendingMachineSystem.cs index 723b9de6267..63ec8f2c24b 100644 --- a/Content.Server/VendingMachines/VendingMachineSystem.cs +++ b/Content.Server/VendingMachines/VendingMachineSystem.cs @@ -19,6 +19,7 @@ using Content.Shared.Throwing; using Content.Shared.UserInterface; using Content.Shared.VendingMachines; +using Content.Shared.Wall; using Robust.Server.GameObjects; using Robust.Shared.Audio; using Robust.Shared.Prototypes; @@ -39,6 +40,8 @@ public sealed class VendingMachineSystem : SharedVendingMachineSystem [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly SpeakOnUIClosedSystem _speakOnUIClosed = default!; + private const float WallVendEjectDistanceFromWall = 1f; + public override void Initialize() { base.Initialize(); @@ -384,7 +387,20 @@ private void EjectItem(EntityUid uid, VendingMachineComponent? vendComponent = n return; } - var ent = Spawn(vendComponent.NextItemToEject, Transform(uid).Coordinates); + // Default spawn coordinates + var spawnCoordinates = Transform(uid).Coordinates; + + //Make sure the wallvends spawn outside of the wall. + + if (TryComp(uid, out var wallMountComponent)) + { + + var offset = wallMountComponent.Direction.ToWorldVec() * WallVendEjectDistanceFromWall; + spawnCoordinates = spawnCoordinates.Offset(offset); + } + + var ent = Spawn(vendComponent.NextItemToEject, spawnCoordinates); + if (vendComponent.ThrowNextItem) { var range = vendComponent.NonLimitedEjectRange; diff --git a/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs b/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs index 2612e99ec9a..190a2d0263e 100644 --- a/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs +++ b/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs @@ -187,15 +187,10 @@ protected override bool InRange(EntityUid user, EntityUid target, float range, I if (session is { } pSession) { (targetCoordinates, targetLocalAngle) = _lag.GetCoordinatesAngle(target, pSession); - } - else - { - var xform = Transform(target); - targetCoordinates = xform.Coordinates; - targetLocalAngle = xform.LocalRotation; + return Interaction.InRangeUnobstructed(user, target, targetCoordinates, targetLocalAngle, range); } - return Interaction.InRangeUnobstructed(user, target, targetCoordinates, targetLocalAngle, range); + return Interaction.InRangeUnobstructed(user, target, range); } protected override void DoDamageEffect(List targets, EntityUid? user, TransformComponent targetXform) diff --git a/Content.Server/Wires/WiresSystem.cs b/Content.Server/Wires/WiresSystem.cs index c643759f504..944b0a0e250 100644 --- a/Content.Server/Wires/WiresSystem.cs +++ b/Content.Server/Wires/WiresSystem.cs @@ -4,27 +4,23 @@ using Content.Server.Construction; using Content.Server.Construction.Components; using Content.Server.Power.Components; -using Content.Server.UserInterface; using Content.Shared.DoAfter; using Content.Shared.GameTicking; using Content.Shared.Hands.Components; using Content.Shared.Interaction; using Content.Shared.Popups; using Content.Shared.Tools.Components; -using Content.Shared.UserInterface; using Content.Shared.Wires; using Robust.Server.GameObjects; using Robust.Shared.Player; using Robust.Shared.Prototypes; using Robust.Shared.Random; -using ActivatableUISystem = Content.Shared.UserInterface.ActivatableUISystem; namespace Content.Server.Wires; public sealed class WiresSystem : SharedWiresSystem { [Dependency] private readonly IPrototypeManager _protoMan = default!; - [Dependency] private readonly ActivatableUISystem _activatableUI = default!; [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; [Dependency] private readonly SharedPopupSystem _popupSystem = default!; [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!; @@ -52,8 +48,6 @@ public override void Initialize() SubscribeLocalEvent(OnTimedWire); SubscribeLocalEvent(OnWiresPowered); SubscribeLocalEvent(OnDoAfter); - SubscribeLocalEvent(OnAttemptOpenActivatableUI); - SubscribeLocalEvent(OnActivatableUIPanelChanged); SubscribeLocalEvent(SetWiresPanelSecurity); } @@ -473,23 +467,6 @@ private void OnPanelChanged(Entity ent, ref PanelChangedEvent ar _uiSystem.CloseUi(ent.Owner, WiresUiKey.Key); } - private void OnAttemptOpenActivatableUI(EntityUid uid, ActivatableUIRequiresPanelComponent component, ActivatableUIOpenAttemptEvent args) - { - if (args.Cancelled || !TryComp(uid, out var wires)) - return; - - if (component.RequireOpen != wires.Open) - args.Cancel(); - } - - private void OnActivatableUIPanelChanged(EntityUid uid, ActivatableUIRequiresPanelComponent component, ref PanelChangedEvent args) - { - if (args.Open == component.RequireOpen) - return; - - _activatableUI.CloseAll(uid); - } - private void OnMapInit(EntityUid uid, WiresComponent component, MapInitEvent args) { if (!string.IsNullOrEmpty(component.LayoutId)) diff --git a/Content.Shared/Actions/SharedActionsSystem.cs b/Content.Shared/Actions/SharedActionsSystem.cs index 30687c93225..c92d67ba812 100644 --- a/Content.Shared/Actions/SharedActionsSystem.cs +++ b/Content.Shared/Actions/SharedActionsSystem.cs @@ -502,13 +502,7 @@ private bool ValidateEntityTargetBase(EntityUid user, EntityUid target, EntityTa return distance <= action.Range; } - if (_interactionSystem.InRangeUnobstructed(user, target, range: action.Range) - && _containerSystem.IsInSameOrParentContainer(user, target)) - { - return true; - } - - return _interactionSystem.CanAccessViaStorage(user, target); + return _interactionSystem.InRangeAndAccessible(user, target, range: action.Range); } public bool ValidateWorldTarget(EntityUid user, EntityCoordinates coords, Entity action) diff --git a/Content.Shared/Alert/AlertCategory.cs b/Content.Shared/Alert/AlertCategory.cs deleted file mode 100644 index 7450f585a4e..00000000000 --- a/Content.Shared/Alert/AlertCategory.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace Content.Shared.Alert; - -/// -/// Every category of alert. Corresponds to category field in alert prototypes defined in YML -/// -public enum AlertCategory -{ - Pressure, - Temperature, - Breathing, - Buckled, - Health, - Internals, - Stamina, - Piloting, - Hunger, - Thirst, - Toxins, - Battery -} diff --git a/Content.Shared/Alert/AlertCategoryPrototype.cs b/Content.Shared/Alert/AlertCategoryPrototype.cs new file mode 100644 index 00000000000..7c7d0475214 --- /dev/null +++ b/Content.Shared/Alert/AlertCategoryPrototype.cs @@ -0,0 +1,14 @@ +using Robust.Shared.Prototypes; + +namespace Content.Shared.Alert; + +/// +/// This is a prototype for a category for marking alerts as mutually exclusive. +/// +[Prototype] +public sealed partial class AlertCategoryPrototype : IPrototype +{ + /// + [IdDataField] + public string ID { get; } = default!; +} diff --git a/Content.Shared/Alert/AlertKey.cs b/Content.Shared/Alert/AlertKey.cs index c784af4cd48..c5c3a7643ec 100644 --- a/Content.Shared/Alert/AlertKey.cs +++ b/Content.Shared/Alert/AlertKey.cs @@ -1,5 +1,5 @@ -using Robust.Shared.Serialization; -using Robust.Shared.Serialization.Manager; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; namespace Content.Shared.Alert; @@ -11,13 +11,13 @@ namespace Content.Shared.Alert; [Serializable, NetSerializable] public struct AlertKey { - public AlertType? AlertType { get; private set; } = Alert.AlertType.Error; - public readonly AlertCategory? AlertCategory; + public ProtoId? AlertType { get; private set; } = default!; + public readonly ProtoId? AlertCategory; /// NOTE: if the alert has a category you must pass the category for this to work /// properly as a key. I.e. if the alert has a category and you pass only the alert type, and you /// compare this to another AlertKey that has both the category and the same alert type, it will not consider them equal. - public AlertKey(AlertType? alertType, AlertCategory? alertCategory) + public AlertKey(ProtoId? alertType, ProtoId? alertCategory) { AlertCategory = alertCategory; AlertType = alertType; @@ -49,7 +49,7 @@ public override int GetHashCode() /// alert category, must not be null /// An alert key for the provided alert category. This must only be used for /// queries and never storage, as it is lacking an alert type. - public static AlertKey ForCategory(AlertCategory category) + public static AlertKey ForCategory(ProtoId category) { return new(null, category); } diff --git a/Content.Shared/Alert/AlertOrderPrototype.cs b/Content.Shared/Alert/AlertOrderPrototype.cs index 8279d592b4b..af4241a27e7 100644 --- a/Content.Shared/Alert/AlertOrderPrototype.cs +++ b/Content.Shared/Alert/AlertOrderPrototype.cs @@ -7,7 +7,7 @@ namespace Content.Shared.Alert /// /// Defines the order of alerts so they show up in a consistent order. /// - [Prototype("alertOrder")] + [Prototype] [DataDefinition] public sealed partial class AlertOrderPrototype : IPrototype, IComparer { @@ -15,7 +15,7 @@ public sealed partial class AlertOrderPrototype : IPrototype, IComparer(alert)] = i++; + _typeToIdx[alert] = i++; break; case "category": - _categoryToIdx[Enum.Parse(alert)] = i++; + _categoryToIdx[alert] = i++; break; default: throw new ArgumentException(); @@ -58,17 +58,17 @@ public sealed partial class AlertOrderPrototype : IPrototype, IComparer _typeToIdx = new(); - private readonly Dictionary _categoryToIdx = new(); + private readonly Dictionary, int> _typeToIdx = new(); + private readonly Dictionary, int> _categoryToIdx = new(); private int GetOrderIndex(AlertPrototype alert) { - if (_typeToIdx.TryGetValue(alert.AlertType, out var idx)) + if (_typeToIdx.TryGetValue(alert.ID, out var idx)) { return idx; } if (alert.Category != null && - _categoryToIdx.TryGetValue((AlertCategory) alert.Category, out idx)) + _categoryToIdx.TryGetValue(alert.Category.Value, out idx)) { return idx; } @@ -78,20 +78,25 @@ private int GetOrderIndex(AlertPrototype alert) public int Compare(AlertPrototype? x, AlertPrototype? y) { - if ((x == null) && (y == null)) return 0; - if (x == null) return 1; - if (y == null) return -1; + if (x == null && y == null) + return 0; + if (x == null) + return 1; + if (y == null) + return -1; var idx = GetOrderIndex(x); var idy = GetOrderIndex(y); if (idx == -1 && idy == -1) { // break ties by type value // Must cast to int to avoid integer overflow when subtracting (enum's unsigned) - return (int)x.AlertType - (int)y.AlertType; + return string.Compare(x.ID, y.ID, StringComparison.InvariantCulture); } - if (idx == -1) return 1; - if (idy == -1) return -1; + if (idx == -1) + return 1; + if (idy == -1) + return -1; var result = idx - idy; // not strictly necessary (we don't care about ones that go at the same index) // but it makes the sort stable @@ -99,7 +104,7 @@ public int Compare(AlertPrototype? x, AlertPrototype? y) { // break ties by type value // Must cast to int to avoid integer overflow when subtracting (enum's unsigned) - return (int)x.AlertType - (int)y.AlertType; + return string.Compare(x.ID, y.ID, StringComparison.InvariantCulture); } return result; diff --git a/Content.Shared/Alert/AlertPrototype.cs b/Content.Shared/Alert/AlertPrototype.cs index 248cc00ba40..f53da27c0de 100644 --- a/Content.Shared/Alert/AlertPrototype.cs +++ b/Content.Shared/Alert/AlertPrototype.cs @@ -1,120 +1,116 @@ using Robust.Shared.Prototypes; using Robust.Shared.Utility; -namespace Content.Shared.Alert +namespace Content.Shared.Alert; + +/// +/// An alert popup with associated icon, tooltip, and other data. +/// +[Prototype] +public sealed partial class AlertPrototype : IPrototype { /// - /// An alert popup with associated icon, tooltip, and other data. + /// Type of alert, no 2 alert prototypes should have the same one. /// - [Prototype("alert")] - public sealed partial class AlertPrototype : IPrototype - { - [ViewVariables] - string IPrototype.ID => AlertType.ToString(); - - /// - /// Type of alert, no 2 alert prototypes should have the same one. - /// - [IdDataField] - public AlertType AlertType { get; private set; } - - /// - /// List of icons to use for this alert. Each entry corresponds to a different severity level, starting from the - /// minimum and incrementing upwards. If severities are not supported, the first entry is used. - /// - [DataField("icons", required: true)] - public List Icons = new(); - - /// - /// An entity used for displaying the in the UI control. - /// - [DataField] - public EntProtoId AlertViewEntity = "AlertSpriteView"; - - /// - /// Name to show in tooltip window. Accepts formatting. - /// - [DataField("name")] - public string Name { get; private set; } = ""; - - /// - /// Description to show in tooltip window. Accepts formatting. - /// - [DataField("description")] - public string Description { get; private set; } = ""; - - /// - /// Category the alert belongs to. Only one alert of a given category - /// can be shown at a time. If one is shown while another is already being shown, - /// it will be replaced. This can be useful for categories of alerts which should naturally - /// replace each other and are mutually exclusive, for example lowpressure / highpressure, - /// hot / cold. If left unspecified, the alert will not replace or be replaced by any other alerts. - /// - [DataField("category")] - public AlertCategory? Category { get; private set; } - - /// - /// Key which is unique w.r.t category semantics (alerts with same category have equal keys, - /// alerts with no category have different keys). - /// - public AlertKey AlertKey => new(AlertType, Category); - - /// - /// -1 (no effect) unless MaxSeverity is specified. Defaults to 1. Minimum severity level supported by this state. - /// - public short MinSeverity => MaxSeverity == -1 ? (short) -1 : _minSeverity; - - [DataField("minSeverity")] private short _minSeverity = 1; - - /// - /// Maximum severity level supported by this state. -1 (default) indicates - /// no severity levels are supported by the state. - /// - [DataField("maxSeverity")] - public short MaxSeverity = -1; - - /// - /// Indicates whether this state support severity levels - /// - public bool SupportsSeverity => MaxSeverity != -1; - - /// - /// Defines what to do when the alert is clicked. - /// This will always be null on clientside. - /// - [DataField("onClick", serverOnly: true)] - public IAlertClick? OnClick { get; private set; } - - /// severity level, if supported by this alert - /// the icon path to the texture for the provided severity level - public SpriteSpecifier GetIcon(short? severity = null) - { - var minIcons = SupportsSeverity - ? MaxSeverity - MinSeverity - : 1; + [IdDataField] + public string ID { get; private set; } = default!; - if (Icons.Count < minIcons) - throw new InvalidOperationException($"Insufficient number of icons given for alert {AlertType}"); + /// + /// List of icons to use for this alert. Each entry corresponds to a different severity level, starting from the + /// minimum and incrementing upwards. If severities are not supported, the first entry is used. + /// + [DataField(required: true)] + public List Icons = new(); - if (!SupportsSeverity) - return Icons[0]; + /// + /// An entity used for displaying the in the UI control. + /// + [DataField] + public EntProtoId AlertViewEntity = "AlertSpriteView"; - if (severity == null) - { - throw new ArgumentException($"No severity specified but this alert ({AlertKey}) has severity.", nameof(severity)); - } + /// + /// Name to show in tooltip window. Accepts formatting. + /// + [DataField] + public string Name { get; private set; } = string.Empty; - if (severity < MinSeverity) - { - throw new ArgumentOutOfRangeException(nameof(severity), $"Severity below minimum severity in {AlertKey}."); - } + /// + /// Description to show in tooltip window. Accepts formatting. + /// + [DataField] + public string Description { get; private set; } = string.Empty; - if (severity > MaxSeverity) - { - throw new ArgumentOutOfRangeException(nameof(severity), $"Severity above maximum severity in {AlertKey}."); - } + /// + /// Category the alert belongs to. Only one alert of a given category + /// can be shown at a time. If one is shown while another is already being shown, + /// it will be replaced. This can be useful for categories of alerts which should naturally + /// replace each other and are mutually exclusive, for example lowpressure / highpressure, + /// hot / cold. If left unspecified, the alert will not replace or be replaced by any other alerts. + /// + [DataField] + public ProtoId? Category { get; private set; } + + /// + /// Key which is unique w.r.t category semantics (alerts with same category have equal keys, + /// alerts with no category have different keys). + /// + public AlertKey AlertKey => new(ID, Category); - return Icons[severity.Value - _minSeverity]; + /// + /// -1 (no effect) unless MaxSeverity is specified. Defaults to 1. Minimum severity level supported by this state. + /// + public short MinSeverity => MaxSeverity == -1 ? (short) -1 : _minSeverity; + + [DataField("minSeverity")] private short _minSeverity = 1; + + /// + /// Maximum severity level supported by this state. -1 (default) indicates + /// no severity levels are supported by the state. + /// + [DataField] + public short MaxSeverity = -1; + + /// + /// Indicates whether this state support severity levels + /// + public bool SupportsSeverity => MaxSeverity != -1; + + /// + /// Defines what to do when the alert is clicked. + /// This will always be null on clientside. + /// + [DataField(serverOnly: true)] + public IAlertClick? OnClick { get; private set; } + + /// severity level, if supported by this alert + /// the icon path to the texture for the provided severity level + public SpriteSpecifier GetIcon(short? severity = null) + { + var minIcons = SupportsSeverity + ? MaxSeverity - MinSeverity + : 1; + + if (Icons.Count < minIcons) + throw new InvalidOperationException($"Insufficient number of icons given for alert {ID}"); + + if (!SupportsSeverity) + return Icons[0]; + + if (severity == null) + { + throw new ArgumentException($"No severity specified but this alert ({AlertKey}) has severity.", nameof(severity)); + } + + if (severity < MinSeverity) + { + throw new ArgumentOutOfRangeException(nameof(severity), $"Severity below minimum severity in {AlertKey}."); } + + if (severity > MaxSeverity) + { + throw new ArgumentOutOfRangeException(nameof(severity), $"Severity above maximum severity in {AlertKey}."); + } + + return Icons[severity.Value - _minSeverity]; } } diff --git a/Content.Shared/Alert/AlertState.cs b/Content.Shared/Alert/AlertState.cs index effd9522036..d6309f6b426 100644 --- a/Content.Shared/Alert/AlertState.cs +++ b/Content.Shared/Alert/AlertState.cs @@ -1,3 +1,4 @@ +using Robust.Shared.Prototypes; using Robust.Shared.Serialization; namespace Content.Shared.Alert; @@ -9,5 +10,5 @@ public struct AlertState public (TimeSpan, TimeSpan)? Cooldown; public bool AutoRemove; public bool ShowCooldown; - public AlertType Type; + public ProtoId Type; } diff --git a/Content.Shared/Alert/AlertType.cs b/Content.Shared/Alert/AlertType.cs index fc6b3a2c83f..e69de29bb2d 100644 --- a/Content.Shared/Alert/AlertType.cs +++ b/Content.Shared/Alert/AlertType.cs @@ -1,60 +0,0 @@ -namespace Content.Shared.Alert -{ - /// - /// Every kind of alert. Corresponds to alertType field in alert prototypes defined in YML - /// NOTE: Using byte for a compact encoding when sending this in messages, can upgrade - /// to ushort - /// - public enum AlertType : byte - { - Error, - LowOxygen, - LowNitrogen, - LowPressure, - HighPressure, - Fire, - Cold, - Hot, - Weightless, - Stun, - Handcuffed, - Ensnared, - Buckled, - HumanCrit, - HumanDead, - HumanHealth, - BorgBattery, - BorgBatteryNone, - PilotingShuttle, - Peckish, - Starving, - Thirsty, - Parched, - Stamina, - Pulled, - Pulling, - Magboots, - Internals, - Toxins, - Muted, - VowOfSilence, - VowBroken, - Essence, - Corporeal, - Bleed, - Pacified, - Debug1, - Debug2, - Debug3, - Debug4, - Debug5, - Debug6, - SuitPower, - BorgHealth, - BorgCrit, - BorgDead, - Deflecting, - SynthCharge, // Sunrise-Edit - } - -} diff --git a/Content.Shared/Alert/AlertsSystem.cs b/Content.Shared/Alert/AlertsSystem.cs index 5b888e30c4c..83c6fcd0dd7 100644 --- a/Content.Shared/Alert/AlertsSystem.cs +++ b/Content.Shared/Alert/AlertsSystem.cs @@ -11,7 +11,7 @@ public abstract class AlertsSystem : EntitySystem [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IGameTiming _timing = default!; - private FrozenDictionary _typeToAlert = default!; + private FrozenDictionary, AlertPrototype> _typeToAlert = default!; public IReadOnlyDictionary? GetActiveAlerts(EntityUid euid) { @@ -20,23 +20,23 @@ public abstract class AlertsSystem : EntitySystem : null; } - public short GetSeverityRange(AlertType alertType) + public short GetSeverityRange(ProtoId alertType) { var minSeverity = _typeToAlert[alertType].MinSeverity; return (short)MathF.Max(minSeverity,_typeToAlert[alertType].MaxSeverity - minSeverity); } - public short GetMaxSeverity(AlertType alertType) + public short GetMaxSeverity(ProtoId alertType) { return _typeToAlert[alertType].MaxSeverity; } - public short GetMinSeverity(AlertType alertType) + public short GetMinSeverity(ProtoId alertType) { return _typeToAlert[alertType].MinSeverity; } - public bool IsShowingAlert(EntityUid euid, AlertType alertType) + public bool IsShowingAlert(EntityUid euid, ProtoId alertType) { if (!EntityManager.TryGetComponent(euid, out AlertsComponent? alertsComponent)) return false; @@ -51,7 +51,7 @@ public bool IsShowingAlert(EntityUid euid, AlertType alertType) } /// true iff an alert of the indicated alert category is currently showing - public bool IsShowingAlertCategory(EntityUid euid, AlertCategory alertCategory) + public bool IsShowingAlertCategory(EntityUid euid, ProtoId alertCategory) { return EntityManager.TryGetComponent(euid, out AlertsComponent? alertsComponent) && alertsComponent.Alerts.ContainsKey(AlertKey.ForCategory(alertCategory)); @@ -78,7 +78,7 @@ public bool TryGetAlertState(EntityUid euid, AlertKey key, out AlertState alertS /// be erased if there is currently a cooldown for the alert) /// if true, the alert will be removed at the end of the cooldown /// if true, the cooldown will be visibly shown over the alert icon - public void ShowAlert(EntityUid euid, AlertType alertType, short? severity = null, (TimeSpan, TimeSpan)? cooldown = null, bool autoRemove = false, bool showCooldown = true ) + public void ShowAlert(EntityUid euid, ProtoId alertType, short? severity = null, (TimeSpan, TimeSpan)? cooldown = null, bool autoRemove = false, bool showCooldown = true ) { // This should be handled as part of networking. if (_timing.ApplyingState) @@ -131,7 +131,7 @@ public void ShowAlert(EntityUid euid, AlertType alertType, short? severity = nul /// /// Clear the alert with the given category, if one is currently showing. /// - public void ClearAlertCategory(EntityUid euid, AlertCategory category) + public void ClearAlertCategory(EntityUid euid, ProtoId category) { if(!TryComp(euid, out AlertsComponent? alertsComponent)) return; @@ -150,7 +150,7 @@ public void ClearAlertCategory(EntityUid euid, AlertCategory category) /// /// Clear the alert of the given type if it is currently showing. /// - public void ClearAlert(EntityUid euid, AlertType alertType) + public void ClearAlert(EntityUid euid, ProtoId alertType) { if (_timing.ApplyingState) return; @@ -286,13 +286,13 @@ private void HandlePrototypesReloaded(PrototypesReloadedEventArgs obj) protected virtual void LoadPrototypes() { - var dict = new Dictionary(); + var dict = new Dictionary, AlertPrototype>(); foreach (var alert in _prototypeManager.EnumeratePrototypes()) { - if (!dict.TryAdd(alert.AlertType, alert)) + if (!dict.TryAdd(alert.ID, alert)) { Log.Error("Found alert with duplicate alertType {0} - all alerts must have" + - " a unique alertType, this one will be skipped", alert.AlertType); + " a unique alertType, this one will be skipped", alert.ID); } } @@ -303,7 +303,7 @@ protected virtual void LoadPrototypes() /// Tries to get the alert of the indicated type /// /// true if found - public bool TryGet(AlertType alertType, [NotNullWhen(true)] out AlertPrototype? alert) + public bool TryGet(ProtoId alertType, [NotNullWhen(true)] out AlertPrototype? alert) { return _typeToAlert.TryGetValue(alertType, out alert); } diff --git a/Content.Shared/Alert/ClickAlertEvent.cs b/Content.Shared/Alert/ClickAlertEvent.cs index fe7ca97e4c2..43dd086b562 100644 --- a/Content.Shared/Alert/ClickAlertEvent.cs +++ b/Content.Shared/Alert/ClickAlertEvent.cs @@ -1,4 +1,5 @@ -using Robust.Shared.Serialization; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; namespace Content.Shared.Alert; @@ -8,9 +9,9 @@ namespace Content.Shared.Alert; [Serializable, NetSerializable] public sealed class ClickAlertEvent : EntityEventArgs { - public readonly AlertType Type; + public readonly ProtoId Type; - public ClickAlertEvent(AlertType alertType) + public ClickAlertEvent(ProtoId alertType) { Type = alertType; } diff --git a/Content.Shared/Anomaly/Components/AnomalyComponent.cs b/Content.Shared/Anomaly/Components/AnomalyComponent.cs index 3878aeb81cb..88e942ec507 100644 --- a/Content.Shared/Anomaly/Components/AnomalyComponent.cs +++ b/Content.Shared/Anomaly/Components/AnomalyComponent.cs @@ -152,25 +152,25 @@ public sealed partial class AnomalyComponent : Component /// /// The particle type that increases the severity of the anomaly. /// - [DataField] + [DataField, AutoNetworkedField] public AnomalousParticleType SeverityParticleType; /// /// The particle type that destabilizes the anomaly. /// - [DataField] + [DataField, AutoNetworkedField] public AnomalousParticleType DestabilizingParticleType; /// /// The particle type that weakens the anomalys health. /// - [DataField] + [DataField, AutoNetworkedField] public AnomalousParticleType WeakeningParticleType; /// /// The particle type that change anomaly behaviour. /// - [DataField] + [DataField, AutoNetworkedField] public AnomalousParticleType TransformationParticleType; #region Points and Vessels @@ -317,6 +317,7 @@ public sealed partial class AnomalyComponent : Component /// /// Event broadcast when an anomaly's behavior is changed. +/// This is raised after the relevant components are applied /// [ByRefEvent] public readonly record struct AnomalyBehaviorChangedEvent(EntityUid Anomaly, ProtoId? Old, ProtoId? New); diff --git a/Content.Shared/Antag/AntagAcceptability.cs b/Content.Shared/Antag/AntagAcceptability.cs index 02d0b5f58fe..f56be975033 100644 --- a/Content.Shared/Antag/AntagAcceptability.cs +++ b/Content.Shared/Antag/AntagAcceptability.cs @@ -22,6 +22,14 @@ public enum AntagAcceptability public enum AntagSelectionTime : byte { + /// + /// Antag roles are assigned before players are assigned jobs and spawned in. + /// This prevents antag selection from happening if the round is on-going. + /// PrePlayerSpawn, + + /// + /// Antag roles get assigned after players have been assigned jobs and have spawned in. + /// PostPlayerSpawn } diff --git a/Content.Shared/Atmos/Components/GasTileOverlayComponent.cs b/Content.Shared/Atmos/Components/GasTileOverlayComponent.cs index e72a1d67584..2c3149b11a8 100644 --- a/Content.Shared/Atmos/Components/GasTileOverlayComponent.cs +++ b/Content.Shared/Atmos/Components/GasTileOverlayComponent.cs @@ -1,7 +1,6 @@ using Robust.Shared.GameStates; using Robust.Shared.Serialization; using Robust.Shared.Timing; -using Robust.Shared.Utility; namespace Content.Shared.Atmos.Components; @@ -24,55 +23,47 @@ public sealed partial class GasTileOverlayComponent : Component public GameTick ForceTick { get; set; } } - [Serializable, NetSerializable] -public sealed class GasTileOverlayState : ComponentState, IComponentDeltaState +public sealed class GasTileOverlayState(Dictionary chunks) : ComponentState { - public readonly Dictionary Chunks; - public bool FullState => AllChunks == null; - - // required to infer deleted/missing chunks for delta states - public HashSet? AllChunks; + public readonly Dictionary Chunks = chunks; +} - public GasTileOverlayState(Dictionary chunks) - { - Chunks = chunks; - } +[Serializable, NetSerializable] +public sealed class GasTileOverlayDeltaState( + Dictionary modifiedChunks, + HashSet allChunks) + : ComponentState, IComponentDeltaState +{ + public readonly Dictionary ModifiedChunks = modifiedChunks; + public readonly HashSet AllChunks = allChunks; - public void ApplyToFullState(IComponentState fullState) + public void ApplyToFullState(GasTileOverlayState state) { - DebugTools.Assert(!FullState); - var state = (GasTileOverlayState) fullState; - DebugTools.Assert(state.FullState); - foreach (var key in state.Chunks.Keys) { - if (!AllChunks!.Contains(key)) + if (!AllChunks.Contains(key)) state.Chunks.Remove(key); } - foreach (var (chunk, data) in Chunks) + foreach (var (chunk, data) in ModifiedChunks) { state.Chunks[chunk] = new(data); } } - public IComponentState CreateNewFullState(IComponentState fullState) + public GasTileOverlayState CreateNewFullState(GasTileOverlayState state) { - DebugTools.Assert(!FullState); - var state = (GasTileOverlayState) fullState; - DebugTools.Assert(state.FullState); - - var chunks = new Dictionary(state.Chunks.Count); + var chunks = new Dictionary(AllChunks.Count); - foreach (var (chunk, data) in Chunks) + foreach (var (chunk, data) in ModifiedChunks) { chunks[chunk] = new(data); } foreach (var (chunk, data) in state.Chunks) { - if (AllChunks!.Contains(chunk)) + if (AllChunks.Contains(chunk)) chunks.TryAdd(chunk, new(data)); } diff --git a/Content.Shared/Atmos/EntitySystems/SharedGasTileOverlaySystem.cs b/Content.Shared/Atmos/EntitySystems/SharedGasTileOverlaySystem.cs index f468724db33..8e7dfdedaf9 100644 --- a/Content.Shared/Atmos/EntitySystems/SharedGasTileOverlaySystem.cs +++ b/Content.Shared/Atmos/EntitySystems/SharedGasTileOverlaySystem.cs @@ -55,7 +55,7 @@ private void OnGetState(EntityUid uid, GasTileOverlayComponent component, ref Co data[index] = chunk; } - args.State = new GasTileOverlayState(data) { AllChunks = new(component.Chunks.Keys) }; + args.State = new GasTileOverlayDeltaState(data, new(component.Chunks.Keys)); } public static Vector2i GetGasChunkIndices(Vector2i indices) diff --git a/Content.Shared/Buckle/Components/StrapComponent.cs b/Content.Shared/Buckle/Components/StrapComponent.cs index 72c92ebf84b..9a19cea0c9a 100644 --- a/Content.Shared/Buckle/Components/StrapComponent.cs +++ b/Content.Shared/Buckle/Components/StrapComponent.cs @@ -3,6 +3,7 @@ using Content.Shared.Whitelist; using Robust.Shared.Audio; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization; namespace Content.Shared.Buckle.Components; @@ -115,7 +116,7 @@ public sealed partial class StrapComponent : Component /// [DataField] [ViewVariables(VVAccess.ReadWrite)] - public AlertType BuckledAlertType = AlertType.Buckled; + public ProtoId BuckledAlertType = "Buckled"; /// /// The sum of the sizes of all the buckled entities in this strap diff --git a/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs b/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs index 0d67473ffee..00040211e36 100644 --- a/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs +++ b/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs @@ -40,6 +40,9 @@ private void InitializeBuckle() SubscribeLocalEvent(OnBuckleUpdateCanMove); } + [ValidatePrototypeId] + public const string BuckledAlertCategory = "Buckled"; + private void OnBuckleComponentStartup(EntityUid uid, BuckleComponent component, ComponentStartup args) { UpdateBuckleStatus(uid, component); @@ -61,7 +64,7 @@ private void OnBuckleMove(EntityUid uid, BuckleComponent component, ref MoveEven return; var strapPosition = Transform(strapUid).Coordinates; - if (ev.NewPosition.InRange(EntityManager, _transform, strapPosition, strapComp.MaxBuckleDistance)) + if (ev.NewPosition.EntityId.IsValid() && ev.NewPosition.InRange(EntityManager, _transform, strapPosition, strapComp.MaxBuckleDistance)) return; TryUnbuckle(uid, uid, true, component); @@ -165,7 +168,7 @@ private void UpdateBuckleStatus(EntityUid uid, BuckleComponent buckleComp, Strap } else { - _alerts.ClearAlertCategory(uid, AlertCategory.Buckled); + _alerts.ClearAlertCategory(uid, BuckledAlertCategory); } } diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index 227487bbac8..d3c148adcf8 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -1047,7 +1047,7 @@ public static readonly CVarDef /// 1.0 for instant spacing, 0.2 means 20% of remaining air lost each time /// public static readonly CVarDef AtmosSpacingEscapeRatio = - CVarDef.Create("atmos.mmos_spacing_speed", 0.05f, CVar.SERVERONLY); + CVarDef.Create("atmos.mmos_spacing_speed", 0.15f, CVar.SERVERONLY); /// /// Minimum amount of air allowed on a spaced tile before it is reset to 0 immediately in kPa @@ -1251,7 +1251,7 @@ public static readonly CVarDef /// Config for when the restart vote should be allowed to be called based on percentage of ghosts. /// public static readonly CVarDef VoteRestartGhostPercentage = - CVarDef.Create("vote.restart_ghost_percentage", 75, CVar.SERVERONLY); + CVarDef.Create("vote.restart_ghost_percentage", 55, CVar.SERVERONLY); /// /// See vote.enabled, but specific to preset votes diff --git a/Content.Shared/Cargo/Prototypes/CargoBountyPrototype.cs b/Content.Shared/Cargo/Prototypes/CargoBountyPrototype.cs index bf4907b0dd4..b40b03672ef 100644 --- a/Content.Shared/Cargo/Prototypes/CargoBountyPrototype.cs +++ b/Content.Shared/Cargo/Prototypes/CargoBountyPrototype.cs @@ -31,7 +31,7 @@ public sealed partial class CargoBountyPrototype : IPrototype /// /// The entries that must be satisfied for the cargo bounty to be complete. /// - [DataField( required: true)] + [DataField(required: true)] public List Entries = new(); /// @@ -50,6 +50,12 @@ public readonly partial record struct CargoBountyItemEntry() [DataField(required: true)] public EntityWhitelist Whitelist { get; init; } = default!; + /// + /// A blacklist that can be used to exclude items in the whitelist. + /// + [DataField] + public EntityWhitelist? Blacklist { get; init; } = null; + // todo: implement some kind of simple generic condition system /// diff --git a/Content.Shared/Clothing/MagbootsComponent.cs b/Content.Shared/Clothing/MagbootsComponent.cs index 0d0d59f89f5..0d074ff38b6 100644 --- a/Content.Shared/Clothing/MagbootsComponent.cs +++ b/Content.Shared/Clothing/MagbootsComponent.cs @@ -1,3 +1,4 @@ +using Content.Shared.Alert; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; @@ -16,4 +17,7 @@ public sealed partial class MagbootsComponent : Component [DataField("on"), AutoNetworkedField] public bool On; + + [DataField] + public ProtoId MagbootsAlert = "Magboots"; } diff --git a/Content.Shared/CombatMode/Pacification/PacificationSystem.cs b/Content.Shared/CombatMode/Pacification/PacificationSystem.cs index 6d94c087af6..a927e1a6970 100644 --- a/Content.Shared/CombatMode/Pacification/PacificationSystem.cs +++ b/Content.Shared/CombatMode/Pacification/PacificationSystem.cs @@ -7,7 +7,6 @@ using Content.Shared.Popups; using Content.Shared.Throwing; using Content.Shared.Weapons.Ranged.Events; -using Content.Shared.Weapons.Ranged.Systems; using Robust.Shared.Timing; namespace Content.Shared.CombatMode.Pacification; @@ -109,7 +108,7 @@ private void OnStartup(EntityUid uid, PacifiedComponent component, ComponentStar _actionsSystem.SetEnabled(combatMode.CombatToggleActionEntity, false); } - _alertsSystem.ShowAlert(uid, AlertType.Pacified); + _alertsSystem.ShowAlert(uid, component.PacifiedAlert); } private void OnShutdown(EntityUid uid, PacifiedComponent component, ComponentShutdown args) @@ -121,7 +120,7 @@ private void OnShutdown(EntityUid uid, PacifiedComponent component, ComponentShu _combatSystem.SetCanDisarm(uid, true, combatMode); _actionsSystem.SetEnabled(combatMode.CombatToggleActionEntity, true); - _alertsSystem.ClearAlert(uid, AlertType.Pacified); + _alertsSystem.ClearAlert(uid, component.PacifiedAlert); } private void OnBeforeThrow(Entity ent, ref BeforeThrowEvent args) diff --git a/Content.Shared/CombatMode/Pacification/PacifiedComponent.cs b/Content.Shared/CombatMode/Pacification/PacifiedComponent.cs index 464ef778851..96081e5dc67 100644 --- a/Content.Shared/CombatMode/Pacification/PacifiedComponent.cs +++ b/Content.Shared/CombatMode/Pacification/PacifiedComponent.cs @@ -1,4 +1,6 @@ +using Content.Shared.Alert; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; namespace Content.Shared.CombatMode.Pacification; @@ -42,4 +44,6 @@ public sealed partial class PacifiedComponent : Component [DataField] public EntityUid? LastAttackedEntity = null; + [DataField] + public ProtoId PacifiedAlert = "Pacified"; } diff --git a/Content.Shared/Containers/ItemSlot/ItemSlotsSystem.cs b/Content.Shared/Containers/ItemSlot/ItemSlotsSystem.cs index 914b34d3c12..2e3f9ed461a 100644 --- a/Content.Shared/Containers/ItemSlot/ItemSlotsSystem.cs +++ b/Content.Shared/Containers/ItemSlot/ItemSlotsSystem.cs @@ -197,6 +197,7 @@ private void OnInteractUsing(EntityUid uid, ItemSlotsComponent itemSlots, Intera if (!EntityManager.TryGetComponent(args.User, out HandsComponent? hands)) return; + var slots = new List(); foreach (var slot in itemSlots.Slots.Values) { if (!slot.InsertOnInteract) @@ -205,10 +206,20 @@ private void OnInteractUsing(EntityUid uid, ItemSlotsComponent itemSlots, Intera if (!CanInsert(uid, args.Used, args.User, slot, swap: slot.Swap, popup: args.User)) continue; - // Drop the held item onto the floor. Return if the user cannot drop. - if (!_handsSystem.TryDrop(args.User, args.Used, handsComp: hands)) - return; + slots.Add(slot); + } + if (slots.Count == 0) + return; + + // Drop the held item onto the floor. Return if the user cannot drop. + if (!_handsSystem.TryDrop(args.User, args.Used, handsComp: hands)) + return; + + slots.Sort(SortEmpty); + + foreach (var slot in slots) + { if (slot.Item != null) _handsSystem.TryPickupAnyHand(args.User, slot.Item.Value, handsComp: hands); @@ -333,6 +344,65 @@ public bool TryInsertFromHand(EntityUid uid, ItemSlot slot, EntityUid user, Hand Insert(uid, slot, held, user, excludeUserAudio: excludeUserAudio); return true; } + + /// + /// Tries to insert an item into any empty slot. + /// + /// The entity that has the item slots. + /// The item to be inserted. + /// The entity performing the interaction. + /// + /// If true, will exclude the user when playing sound. Does nothing client-side. + /// Useful for predicted interactions + /// + /// False if failed to insert item + public bool TryInsertEmpty(Entity ent, EntityUid item, EntityUid? user, bool excludeUserAudio = false) + { + if (!Resolve(ent, ref ent.Comp, false)) + return false; + + var slots = new List(); + foreach (var slot in ent.Comp.Slots.Values) + { + if (slot.ContainerSlot?.ContainedEntity != null) + continue; + + if (CanInsert(ent, item, user, slot)) + slots.Add(slot); + } + + if (slots.Count == 0) + return false; + + if (user != null && _handsSystem.IsHolding(user.Value, item)) + { + if (!_handsSystem.TryDrop(user.Value, item)) + return false; + } + + slots.Sort(SortEmpty); + + foreach (var slot in slots) + { + if (TryInsert(ent, slot, item, user, excludeUserAudio: excludeUserAudio)) + return true; + } + + return false; + } + + private static int SortEmpty(ItemSlot a, ItemSlot b) + { + var aEnt = a.ContainerSlot?.ContainedEntity; + var bEnt = b.ContainerSlot?.ContainedEntity; + if (aEnt == null && bEnt == null) + return a.Priority.CompareTo(b.Priority); + + if (aEnt == null) + return -1; + + return 1; + } #endregion #region Eject diff --git a/Content.Shared/Cuffs/Components/CuffableComponent.cs b/Content.Shared/Cuffs/Components/CuffableComponent.cs index 5da6fa41a5f..4ddfe1b53ee 100644 --- a/Content.Shared/Cuffs/Components/CuffableComponent.cs +++ b/Content.Shared/Cuffs/Components/CuffableComponent.cs @@ -1,6 +1,8 @@ +using Content.Shared.Alert; using Content.Shared.Damage; using Robust.Shared.Containers; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization; using Robust.Shared.Utility; @@ -39,6 +41,9 @@ public sealed partial class CuffableComponent : Component /// [DataField("canStillInteract"), ViewVariables(VVAccess.ReadWrite)] public bool CanStillInteract = true; + + [DataField] + public ProtoId CuffedAlert = "Handcuffed"; } [Serializable, NetSerializable] diff --git a/Content.Shared/Cuffs/SharedCuffableSystem.cs b/Content.Shared/Cuffs/SharedCuffableSystem.cs index 0077f5a358e..f0f9a949839 100644 --- a/Content.Shared/Cuffs/SharedCuffableSystem.cs +++ b/Content.Shared/Cuffs/SharedCuffableSystem.cs @@ -172,9 +172,9 @@ public void UpdateCuffState(EntityUid uid, CuffableComponent component) _actionBlocker.UpdateCanMove(uid); if (component.CanStillInteract) - _alerts.ClearAlert(uid, AlertType.Handcuffed); + _alerts.ClearAlert(uid, component.CuffedAlert); else - _alerts.ShowAlert(uid, AlertType.Handcuffed); + _alerts.ShowAlert(uid, component.CuffedAlert); var ev = new CuffedStateChangeEvent(); RaiseLocalEvent(uid, ref ev); diff --git a/Content.Shared/Damage/Components/DamageableComponent.cs b/Content.Shared/Damage/Components/DamageableComponent.cs index be66d51e3bc..f8205568f10 100644 --- a/Content.Shared/Damage/Components/DamageableComponent.cs +++ b/Content.Shared/Damage/Components/DamageableComponent.cs @@ -5,8 +5,6 @@ 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.List; namespace Content.Shared.Damage { @@ -18,7 +16,7 @@ namespace Content.Shared.Damage /// may also have resistances to certain damage types, defined via a . /// [RegisterComponent] - [NetworkedComponent()] + [NetworkedComponent] [Access(typeof(DamageableSystem), Other = AccessPermissions.ReadExecute)] public sealed partial class DamageableComponent : Component { @@ -26,8 +24,8 @@ public sealed partial class DamageableComponent : Component /// This specifies what damage types are supported by this component. /// If null, all damage types will be supported. /// - [DataField("damageContainer", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string? DamageContainerID; + [DataField("damageContainer")] + public ProtoId? DamageContainerID; /// /// This will be applied to any damage that is dealt to this container, @@ -37,8 +35,8 @@ public sealed partial class DamageableComponent : Component /// Though DamageModifierSets can be deserialized directly, we only want to use the prototype version here /// to reduce duplication. /// - [DataField("damageModifierSet", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string? DamageModifierSetId; + [DataField("damageModifierSet")] + public ProtoId? DamageModifierSetId; /// /// All the damage information is stored in this . @@ -46,7 +44,7 @@ public sealed partial class DamageableComponent : Component /// /// If this data-field is specified, this allows damageable components to be initialized with non-zero damage. /// - [DataField("damage", readOnly: true)] //todo remove this readonly when implementing writing to damagespecifier + [DataField(readOnly: true)] //todo remove this readonly when implementing writing to damagespecifier public DamageSpecifier Damage = new(); /// @@ -64,8 +62,8 @@ public sealed partial class DamageableComponent : Component [ViewVariables] public FixedPoint2 TotalDamage; - [DataField("radiationDamageTypes", customTypeSerializer: typeof(PrototypeIdListSerializer))] - public List RadiationDamageTypeIDs = new() { "Radiation" }; + [DataField("radiationDamageTypes")] + public List> RadiationDamageTypeIDs = new() { "Radiation" }; [DataField] public Dictionary> HealthIcons = new() @@ -77,6 +75,9 @@ public sealed partial class DamageableComponent : Component [DataField] public ProtoId RottingIcon = "HealthIconRotting"; + + [DataField] + public FixedPoint2? HealthBarThreshold; } [Serializable, NetSerializable] @@ -84,13 +85,16 @@ public sealed class DamageableComponentState : ComponentState { public readonly Dictionary DamageDict; public readonly string? ModifierSetId; + public readonly FixedPoint2? HealthBarThreshold; public DamageableComponentState( Dictionary damageDict, - string? modifierSetId) + string? modifierSetId, + FixedPoint2? healthBarThreshold) { DamageDict = damageDict; ModifierSetId = modifierSetId; + HealthBarThreshold = healthBarThreshold; } } } diff --git a/Content.Shared/Damage/Components/StaminaComponent.cs b/Content.Shared/Damage/Components/StaminaComponent.cs index 5a2fba49701..14c3f6d9f53 100644 --- a/Content.Shared/Damage/Components/StaminaComponent.cs +++ b/Content.Shared/Damage/Components/StaminaComponent.cs @@ -1,4 +1,6 @@ +using Content.Shared.Alert; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; namespace Content.Shared.Damage.Components; @@ -51,4 +53,7 @@ public sealed partial class StaminaComponent : Component [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoNetworkedField] [AutoPausedField] public TimeSpan NextUpdate = TimeSpan.Zero; + + [DataField] + public ProtoId StaminaAlert = "Stamina"; } diff --git a/Content.Shared/Damage/Systems/DamageableSystem.cs b/Content.Shared/Damage/Systems/DamageableSystem.cs index 4aaf380c47d..3c3e1b736df 100644 --- a/Content.Shared/Damage/Systems/DamageableSystem.cs +++ b/Content.Shared/Damage/Systems/DamageableSystem.cs @@ -1,5 +1,4 @@ using System.Linq; -using Content.Shared.Administration.Logs; using Content.Shared.Damage.Prototypes; using Content.Shared.FixedPoint; using Content.Shared.Inventory; @@ -229,12 +228,12 @@ private void DamageableGetState(EntityUid uid, DamageableComponent component, re { if (_netMan.IsServer) { - args.State = new DamageableComponentState(component.Damage.DamageDict, component.DamageModifierSetId); + args.State = new DamageableComponentState(component.Damage.DamageDict, component.DamageModifierSetId, component.HealthBarThreshold); } else { // avoid mispredicting damage on newly spawned entities. - args.State = new DamageableComponentState(component.Damage.DamageDict.ShallowClone(), component.DamageModifierSetId); + args.State = new DamageableComponentState(component.Damage.DamageDict.ShallowClone(), component.DamageModifierSetId, component.HealthBarThreshold); } } @@ -268,6 +267,7 @@ private void DamageableHandleState(EntityUid uid, DamageableComponent component, } component.DamageModifierSetId = state.ModifierSetId; + component.HealthBarThreshold = state.HealthBarThreshold; // Has the damage actually changed? DamageSpecifier newDamage = new() { DamageDict = new(state.DamageDict) }; diff --git a/Content.Shared/Damage/Systems/StaminaSystem.cs b/Content.Shared/Damage/Systems/StaminaSystem.cs index 840b2e04311..1f9a7f1dd84 100644 --- a/Content.Shared/Damage/Systems/StaminaSystem.cs +++ b/Content.Shared/Damage/Systems/StaminaSystem.cs @@ -79,8 +79,7 @@ private void OnShutdown(EntityUid uid, StaminaComponent component, ComponentShut { RemCompDeferred(uid); } - - SetStaminaAlert(uid); + _alerts.ClearAlert(uid, component.StaminaAlert); } private void OnStartup(EntityUid uid, StaminaComponent component, ComponentStartup args) @@ -204,13 +203,10 @@ private void OnCollide(EntityUid uid, StaminaDamageOnCollideComponent component, private void SetStaminaAlert(EntityUid uid, StaminaComponent? component = null) { if (!Resolve(uid, ref component, false) || component.Deleted) - { - _alerts.ClearAlert(uid, AlertType.Stamina); return; - } var severity = ContentHelpers.RoundToLevels(MathF.Max(0f, component.CritThreshold - component.StaminaDamage), component.CritThreshold, 7); - _alerts.ShowAlert(uid, AlertType.Stamina, (short) severity); + _alerts.ShowAlert(uid, component.StaminaAlert, (short) severity); } /// diff --git a/Content.Shared/Dataset/LocalizedDatasetPrototype.cs b/Content.Shared/Dataset/LocalizedDatasetPrototype.cs new file mode 100644 index 00000000000..2e0aa60c684 --- /dev/null +++ b/Content.Shared/Dataset/LocalizedDatasetPrototype.cs @@ -0,0 +1,94 @@ +using System.Collections; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; + +namespace Content.Shared.Dataset; + +/// +/// A variant of intended to specify a sequence of LocId strings +/// without having to copy-paste a ton of LocId strings into the YAML. +/// +[Prototype] +public sealed partial class LocalizedDatasetPrototype : IPrototype +{ + /// + /// Identifier for this prototype. + /// + [ViewVariables] + [IdDataField] + public string ID { get; private set; } = default!; + + /// + /// Collection of LocId strings. + /// + [DataField] + public LocalizedDatasetValues Values { get; private set; } = []; +} + +[Serializable, NetSerializable] +[DataDefinition] +public sealed partial class LocalizedDatasetValues : IReadOnlyList +{ + /// + /// String prepended to the index number to generate each LocId string. + /// For example, a prefix of tips-dataset- will generate tips-dataset-1, + /// tips-dataset-2, etc. + /// + [DataField(required: true)] + public string Prefix { get; private set; } = default!; + + /// + /// How many values are in the dataset. + /// + [DataField(required: true)] + public int Count { get; private set; } + + public string this[int index] + { + get + { + if (index >= Count || index < 0) + throw new IndexOutOfRangeException(); + return Prefix + (index + 1); + } + } + + public IEnumerator GetEnumerator() + { + return new Enumerator(this); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public sealed class Enumerator : IEnumerator + { + private int _index = 0; // Whee, 1-indexing + + private readonly LocalizedDatasetValues _values; + + public Enumerator(LocalizedDatasetValues values) + { + _values = values; + } + + public string Current => _values.Prefix + _index; + + object IEnumerator.Current => Current; + + public void Dispose() { } + + public bool MoveNext() + { + _index++; + return _index <= _values.Count; + } + + public void Reset() + { + _index = 0; + } + } +} diff --git a/Content.Shared/Decals/DecalGridComponent.cs b/Content.Shared/Decals/DecalGridComponent.cs index 8ac05cb280f..67a9c037696 100644 --- a/Content.Shared/Decals/DecalGridComponent.cs +++ b/Content.Shared/Decals/DecalGridComponent.cs @@ -62,46 +62,37 @@ public record DecalGridChunkCollection(Dictionary ChunkCol } [Serializable, NetSerializable] - public sealed class DecalGridState : ComponentState, IComponentDeltaState + public sealed class DecalGridState(Dictionary chunks) : ComponentState { - public Dictionary Chunks; - public bool FullState => AllChunks == null; - - // required to infer deleted/missing chunks for delta states - public HashSet? AllChunks; + public Dictionary Chunks = chunks; + } - public DecalGridState(Dictionary chunks) - { - Chunks = chunks; - } + [Serializable, NetSerializable] + public sealed class DecalGridDeltaState(Dictionary modifiedChunks, HashSet allChunks) + : ComponentState, IComponentDeltaState + { + public Dictionary ModifiedChunks = modifiedChunks; + public HashSet AllChunks = allChunks; - public void ApplyToFullState(IComponentState fullState) + public void ApplyToFullState(DecalGridState state) { - DebugTools.Assert(!FullState); - var state = (DecalGridState) fullState; - DebugTools.Assert(state.FullState); - foreach (var key in state.Chunks.Keys) { if (!AllChunks!.Contains(key)) state.Chunks.Remove(key); } - foreach (var (chunk, data) in Chunks) + foreach (var (chunk, data) in ModifiedChunks) { state.Chunks[chunk] = new(data); } } - public IComponentState CreateNewFullState(IComponentState fullState) + public DecalGridState CreateNewFullState(DecalGridState state) { - DebugTools.Assert(!FullState); - var state = (DecalGridState) fullState; - DebugTools.Assert(state.FullState); - var chunks = new Dictionary(state.Chunks.Count); - foreach (var (chunk, data) in Chunks) + foreach (var (chunk, data) in ModifiedChunks) { chunks[chunk] = new(data); } diff --git a/Content.Shared/Decals/SharedDecalSystem.cs b/Content.Shared/Decals/SharedDecalSystem.cs index 0665ccbf84b..0a2349ea299 100644 --- a/Content.Shared/Decals/SharedDecalSystem.cs +++ b/Content.Shared/Decals/SharedDecalSystem.cs @@ -49,7 +49,7 @@ private void OnGetState(EntityUid uid, DecalGridComponent component, ref Compone data[index] = chunk; } - args.State = new DecalGridState(data) { AllChunks = new(component.ChunkCollection.ChunkCollection.Keys) }; + args.State = new DecalGridDeltaState(data, new(component.ChunkCollection.ChunkCollection.Keys)); } private void OnGridInitialize(GridInitializeEvent msg) diff --git a/Content.Shared/Doors/Components/FirelockComponent.cs b/Content.Shared/Doors/Components/FirelockComponent.cs index 97e57185cac..3f7d6c3f704 100644 --- a/Content.Shared/Doors/Components/FirelockComponent.cs +++ b/Content.Shared/Doors/Components/FirelockComponent.cs @@ -1,4 +1,4 @@ -using Content.Shared.Doors.Components; +using Robust.Shared.GameStates; namespace Content.Shared.Doors.Components { @@ -7,9 +7,11 @@ namespace Content.Shared.Doors.Components /// auto-closing on depressurization, air/fire alarm interactions, and preventing normal door functions when /// retaining pressure.. /// - [RegisterComponent] + [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] public sealed partial class FirelockComponent : Component { + #region Settings + /// /// Pry time modifier to be used when the firelock is currently closed due to fire or pressure. /// @@ -17,8 +19,6 @@ public sealed partial class FirelockComponent : Component [DataField("lockedPryTimeModifier"), ViewVariables(VVAccess.ReadWrite)] public float LockedPryTimeModifier = 1.5f; - [DataField("autocloseDelay")] public TimeSpan AutocloseDelay = TimeSpan.FromSeconds(3f); - /// /// Maximum pressure difference before the firelock will refuse to open, in kPa. /// @@ -39,5 +39,47 @@ public sealed partial class FirelockComponent : Component /// [DataField("alarmAutoClose"), ViewVariables(VVAccess.ReadWrite)] public bool AlarmAutoClose = true; + + /// + /// The cooldown duration before a firelock can automatically close due to a hazardous environment after it has + /// been pried open. Measured in seconds. + /// + [DataField] + public TimeSpan EmergencyCloseCooldownDuration = TimeSpan.FromSeconds(2); + + #endregion + + #region Set by system + + /// + /// When the firelock will be allowed to automatically close again due to a hazardous environment. + /// + [DataField] + public TimeSpan? EmergencyCloseCooldown; + + /// + /// Whether the firelock can open, or is locked due to its environment. + /// + public bool IsLocked => Pressure || Temperature; + + /// + /// Whether the firelock is holding back a hazardous pressure. + /// + [DataField, AutoNetworkedField] + public bool Pressure; + + /// + /// Whether the firelock is holding back extreme temperatures. + /// + [DataField, AutoNetworkedField] + public bool Temperature; + + /// + /// Whether the airlock is powered. + /// + [DataField, AutoNetworkedField] + public bool Powered; + + #endregion } } diff --git a/Content.Shared/Doors/Systems/SharedDoorSystem.cs b/Content.Shared/Doors/Systems/SharedDoorSystem.cs index b58b7b265e9..20456c14777 100644 --- a/Content.Shared/Doors/Systems/SharedDoorSystem.cs +++ b/Content.Shared/Doors/Systems/SharedDoorSystem.cs @@ -6,7 +6,6 @@ using Content.Shared.Database; using Content.Shared.Doors.Components; using Content.Shared.Emag.Systems; -using Content.Shared.Hands.Components; using Content.Shared.Interaction; using Content.Shared.Physics; using Content.Shared.Popups; @@ -466,7 +465,7 @@ public bool OnPartialClose(EntityUid uid, DoorComponent? door = null, PhysicsCom door.Partial = true; - // Make sure no entity waled into the airlock when it started closing. + // Make sure no entity walked into the airlock when it started closing. if (!CanClose(uid, door)) { door.NextStateChange = GameTiming.CurTime + door.OpenTimeTwo; diff --git a/Content.Shared/Doors/Systems/SharedFirelockSystem.cs b/Content.Shared/Doors/Systems/SharedFirelockSystem.cs new file mode 100644 index 00000000000..4afe26039ba --- /dev/null +++ b/Content.Shared/Doors/Systems/SharedFirelockSystem.cs @@ -0,0 +1,124 @@ +using Content.Shared.Access.Systems; +using Content.Shared.Doors.Components; +using Content.Shared.Examine; +using Content.Shared.Popups; +using Content.Shared.Prying.Components; +using Robust.Shared.Timing; + +namespace Content.Shared.Doors.Systems; + +public abstract class SharedFirelockSystem : EntitySystem +{ + [Dependency] private readonly AccessReaderSystem _accessReaderSystem = default!; + [Dependency] private readonly SharedPopupSystem _popupSystem = default!; + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly SharedDoorSystem _doorSystem = default!; + [Dependency] private readonly IGameTiming _gameTiming = default!; + + public override void Initialize() + { + base.Initialize(); + + // Access/Prying + SubscribeLocalEvent(OnBeforeDoorOpened); + SubscribeLocalEvent(OnDoorGetPryTimeModifier); + SubscribeLocalEvent(OnAfterPried); + + // Visuals + SubscribeLocalEvent(UpdateVisuals); + SubscribeLocalEvent(UpdateVisuals); + + SubscribeLocalEvent(OnExamined); + } + + public bool EmergencyPressureStop(EntityUid uid, FirelockComponent? firelock = null, DoorComponent? door = null) + { + if (!Resolve(uid, ref firelock, ref door)) + return false; + + if (door.State != DoorState.Open + || firelock.EmergencyCloseCooldown != null + && _gameTiming.CurTime < firelock.EmergencyCloseCooldown) + return false; + + if (!_doorSystem.TryClose(uid, door)) + return false; + + return _doorSystem.OnPartialClose(uid, door); + } + + #region Access/Prying + + private void OnBeforeDoorOpened(EntityUid uid, FirelockComponent component, BeforeDoorOpenedEvent args) + { + // Give the Door remote the ability to force a firelock open even if it is holding back dangerous gas + var overrideAccess = (args.User != null) && _accessReaderSystem.IsAllowed(args.User.Value, uid); + + if (!component.Powered || (!overrideAccess && component.IsLocked)) + args.Cancel(); + } + + private void OnDoorGetPryTimeModifier(EntityUid uid, FirelockComponent component, ref GetPryTimeModifierEvent args) + { + if (component.Temperature) + { + _popupSystem.PopupClient(Loc.GetString("firelock-component-is-holding-fire-message"), + uid, args.User, PopupType.MediumCaution); + } + else if (component.Pressure) + { + _popupSystem.PopupClient(Loc.GetString("firelock-component-is-holding-pressure-message"), + uid, args.User, PopupType.MediumCaution); + } + + if (component.IsLocked) + args.PryTimeModifier *= component.LockedPryTimeModifier; + } + + private void OnAfterPried(EntityUid uid, FirelockComponent component, ref PriedEvent args) + { + component.EmergencyCloseCooldown = _gameTiming.CurTime + component.EmergencyCloseCooldownDuration; + } + + #endregion + + #region Visuals + + private void UpdateVisuals(EntityUid uid, FirelockComponent component, EntityEventArgs args) => UpdateVisuals(uid, component); + + private void UpdateVisuals(EntityUid uid, + FirelockComponent? firelock = null, + DoorComponent? door = null, + AppearanceComponent? appearance = null) + { + if (!Resolve(uid, ref door, ref appearance, false)) + return; + + // only bother to check pressure on doors that are some variation of closed. + if (door.State != DoorState.Closed + && door.State != DoorState.Welded + && door.State != DoorState.Denying) + { + _appearance.SetData(uid, DoorVisuals.ClosedLights, false, appearance); + return; + } + + if (!Resolve(uid, ref firelock, ref appearance, false)) + return; + + _appearance.SetData(uid, DoorVisuals.ClosedLights, firelock.IsLocked, appearance); + } + + #endregion + + private void OnExamined(Entity ent, ref ExaminedEvent args) + { + using (args.PushGroup(nameof(FirelockComponent))) + { + if (ent.Comp.Pressure) + args.PushMarkup(Loc.GetString("firelock-component-examine-pressure-warning")); + if (ent.Comp.Temperature) + args.PushMarkup(Loc.GetString("firelock-component-examine-temperature-warning")); + } + } +} diff --git a/Content.Shared/Ensnaring/Components/EnsnareableComponent.cs b/Content.Shared/Ensnaring/Components/EnsnareableComponent.cs index 553f6df1c77..2536fac4edc 100644 --- a/Content.Shared/Ensnaring/Components/EnsnareableComponent.cs +++ b/Content.Shared/Ensnaring/Components/EnsnareableComponent.cs @@ -1,5 +1,7 @@ +using Content.Shared.Alert; using Robust.Shared.Containers; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization; namespace Content.Shared.Ensnaring.Components; @@ -40,6 +42,9 @@ public sealed partial class EnsnareableComponent : Component [DataField("state")] public string? State; + + [DataField] + public ProtoId EnsnaredAlert = "Ensnared"; } [Serializable, NetSerializable] diff --git a/Content.Shared/FixedPoint/FixedPoint2.cs b/Content.Shared/FixedPoint/FixedPoint2.cs index 33a9d25bc27..6439ee6c5e2 100644 --- a/Content.Shared/FixedPoint/FixedPoint2.cs +++ b/Content.Shared/FixedPoint/FixedPoint2.cs @@ -237,7 +237,7 @@ public static int Sign(FixedPoint2 value) public static FixedPoint2 Abs(FixedPoint2 a) { - return FixedPoint2.New(Math.Abs(a.Value)); + return FromCents(Math.Abs(a.Value)); } public static FixedPoint2 Dist(FixedPoint2 a, FixedPoint2 b) diff --git a/Content.Shared/Gravity/SharedGravitySystem.cs b/Content.Shared/Gravity/SharedGravitySystem.cs index 100d2ee74fb..df13be51fd4 100644 --- a/Content.Shared/Gravity/SharedGravitySystem.cs +++ b/Content.Shared/Gravity/SharedGravitySystem.cs @@ -17,6 +17,9 @@ public abstract partial class SharedGravitySystem : EntitySystem [Dependency] private readonly AlertsSystem _alerts = default!; [Dependency] private readonly InventorySystem _inventory = default!; + [ValidatePrototypeId] + public const string WeightlessAlert = "Weightless"; + public bool IsWeightless(EntityUid uid, PhysicsComponent? body = null, TransformComponent? xform = null) { Resolve(uid, ref body, false); @@ -93,11 +96,11 @@ private void OnGravityChange(ref GravityChangedEvent ev) if (!ev.HasGravity) { - _alerts.ShowAlert(uid, AlertType.Weightless); + _alerts.ShowAlert(uid, WeightlessAlert); } else { - _alerts.ClearAlert(uid, AlertType.Weightless); + _alerts.ClearAlert(uid, WeightlessAlert); } } } @@ -106,11 +109,11 @@ private void OnAlertsSync(AlertSyncEvent ev) { if (IsWeightless(ev.Euid)) { - _alerts.ShowAlert(ev.Euid, AlertType.Weightless); + _alerts.ShowAlert(ev.Euid, WeightlessAlert); } else { - _alerts.ClearAlert(ev.Euid, AlertType.Weightless); + _alerts.ClearAlert(ev.Euid, WeightlessAlert); } } @@ -118,11 +121,11 @@ private void OnAlertsParentChange(EntityUid uid, AlertsComponent component, ref { if (IsWeightless(uid)) { - _alerts.ShowAlert(uid, AlertType.Weightless); + _alerts.ShowAlert(uid, WeightlessAlert); } else { - _alerts.ClearAlert(uid, AlertType.Weightless); + _alerts.ClearAlert(uid, WeightlessAlert); } } diff --git a/Content.Shared/Interaction/Components/BypassInteractionChecksComponent.cs b/Content.Shared/Interaction/Components/BypassInteractionChecksComponent.cs new file mode 100644 index 00000000000..ca0ff963151 --- /dev/null +++ b/Content.Shared/Interaction/Components/BypassInteractionChecksComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Interaction.Components; + +[RegisterComponent, NetworkedComponent] +public sealed partial class BypassInteractionChecksComponent : Component; diff --git a/Content.Shared/Interaction/SharedInteractionSystem.cs b/Content.Shared/Interaction/SharedInteractionSystem.cs index c82a749755d..bcde27ceba3 100644 --- a/Content.Shared/Interaction/SharedInteractionSystem.cs +++ b/Content.Shared/Interaction/SharedInteractionSystem.cs @@ -1,11 +1,10 @@ using System.Diagnostics.CodeAnalysis; using System.Linq; using Content.Shared.ActionBlocker; -using Content.Shared.Administration; using Content.Shared.Administration.Logs; -using Content.Shared.Administration.Managers; using Content.Shared.CombatMode; using Content.Shared.Database; +using Content.Shared.Ghost; using Content.Shared.Hands; using Content.Shared.Hands.Components; using Content.Shared.Input; @@ -15,12 +14,13 @@ using Content.Shared.Inventory.Events; using Content.Shared.Item; using Content.Shared.Movement.Components; -using Content.Shared.Movement.Pulling.Components; using Content.Shared.Movement.Pulling.Systems; using Content.Shared.Physics; using Content.Shared.Popups; +using Content.Shared.Storage; using Content.Shared.Tag; using Content.Shared.Timing; +using Content.Shared.UserInterface; using Content.Shared.Verbs; using Content.Shared.Wall; using JetBrains.Annotations; @@ -36,6 +36,7 @@ using Robust.Shared.Random; using Robust.Shared.Serialization; using Robust.Shared.Timing; +using Robust.Shared.Utility; #pragma warning disable 618 @@ -50,12 +51,11 @@ public abstract partial class SharedInteractionSystem : EntitySystem [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly INetManager _net = default!; [Dependency] private readonly IMapManager _mapManager = default!; - [Dependency] private readonly ISharedAdminManager _adminManager = default!; [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; [Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!; [Dependency] private readonly RotateToFaceSystem _rotateToFaceSystem = default!; [Dependency] private readonly SharedContainerSystem _containerSystem = default!; - [Dependency] private readonly SharedPhysicsSystem _sharedBroadphaseSystem = default!; + [Dependency] private readonly SharedPhysicsSystem _broadphase = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly SharedVerbSystem _verbSystem = default!; [Dependency] private readonly SharedPopupSystem _popupSystem = default!; @@ -64,6 +64,18 @@ public abstract partial class SharedInteractionSystem : EntitySystem [Dependency] private readonly InventorySystem _inventory = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly TagSystem _tagSystem = default!; + [Dependency] private readonly SharedUserInterfaceSystem _ui = default!; + + private EntityQuery _ignoreUiRangeQuery; + private EntityQuery _fixtureQuery; + private EntityQuery _itemQuery; + private EntityQuery _physicsQuery; + private EntityQuery _handsQuery; + private EntityQuery _relayQuery; + private EntityQuery _combatQuery; + private EntityQuery _wallMountQuery; + private EntityQuery _delayQuery; + private EntityQuery _uiQuery; private const CollisionGroup InRangeUnobstructedMask = CollisionGroup.Impassable | CollisionGroup.InteractImpassable; @@ -76,6 +88,17 @@ public abstract partial class SharedInteractionSystem : EntitySystem public override void Initialize() { + _ignoreUiRangeQuery = GetEntityQuery(); + _fixtureQuery = GetEntityQuery(); + _itemQuery = GetEntityQuery(); + _physicsQuery = GetEntityQuery(); + _handsQuery = GetEntityQuery(); + _relayQuery = GetEntityQuery(); + _combatQuery = GetEntityQuery(); + _wallMountQuery = GetEntityQuery(); + _delayQuery = GetEntityQuery(); + _uiQuery = GetEntityQuery(); + SubscribeLocalEvent(HandleUserInterfaceRangeCheck); SubscribeLocalEvent(OnBoundInterfaceInteractAttempt); @@ -111,29 +134,57 @@ public override void Shutdown() /// private void OnBoundInterfaceInteractAttempt(BoundUserInterfaceMessageAttempt ev) { - var user = ev.Actor; + _uiQuery.TryComp(ev.Target, out var uiComp); + if (!_actionBlockerSystem.CanInteract(ev.Actor, ev.Target)) + { + // We permit ghosts to open uis unless explicitly blocked + if (ev.Message is not OpenBoundInterfaceMessage || !HasComp(ev.Actor) || uiComp?.BlockSpectators == true) + { + ev.Cancel(); + return; + } + } + + var range = _ui.GetUiRange(ev.Target, ev.UiKey); - if (!_actionBlockerSystem.CanInteract(user, ev.Target)) + // As long as range>0, the UI frame updates should have auto-closed the UI if it is out of range. + DebugTools.Assert(range <= 0 || UiRangeCheck(ev.Actor, ev.Target, range)); + + if (range <= 0 && !IsAccessible(ev.Actor, ev.Target)) { ev.Cancel(); return; } - // Check if the bound entity is accessible. Note that we allow admins to ignore this restriction, so that - // they can fiddle with UI's that people can't normally interact with (e.g., placing things directly into - // other people's backpacks). - if (!_containerSystem.IsInSameOrParentContainer(user, ev.Target) - && !CanAccessViaStorage(user, ev.Target) - && !_adminManager.HasAdminFlag(user, AdminFlags.Admin)) + if (uiComp == null) + return; + + if (uiComp.SingleUser && uiComp.CurrentSingleUser != null && uiComp.CurrentSingleUser != ev.Actor) { ev.Cancel(); return; } - if (!InRangeUnobstructed(user, ev.Target)) - { + if (!uiComp.RequireHands) + return; + + if (!_handsQuery.TryComp(ev.Actor, out var hands) || hands.Hands.Count == 0) ev.Cancel(); - } + } + + private bool UiRangeCheck(Entity user, Entity target, float range) + { + if (!Resolve(target, ref target.Comp)) + return false; + + if (user.Owner == target.Owner) + return true; + + // Fast check: if the user is the parent of the entity (e.g., holding it), we always assume that it is in range + if (target.Comp.ParentUid == user.Owner) + return true; + + return InRangeAndAccessible(user, target, range) || _ignoreUiRangeQuery.HasComp(user); } /// @@ -190,10 +241,7 @@ private bool HandleTryPullObject(ICommonSession? session, EntityCoordinates coor if (!InRangeUnobstructed(userEntity.Value, uid, popup: true)) return false; - if (!TryComp(uid, out PullableComponent? pull)) - return false; - - _pullSystem.TogglePull(uid, userEntity.Value, pull); + _pullSystem.TogglePull(uid, userEntity.Value); return false; } @@ -269,7 +317,7 @@ private bool ShouldCheckAccess(EntityUid user) public bool CombatModeCanHandInteract(EntityUid user, EntityUid? target) { // Always allow attack in these cases - if (target == null || !TryComp(user, out var hands) || hands.ActiveHand?.HeldEntity is not null) + if (target == null || !_handsQuery.TryComp(user, out var hands) || hands.ActiveHand?.HeldEntity is not null) return false; // Only eat input if: @@ -277,7 +325,7 @@ public bool CombatModeCanHandInteract(EntityUid user, EntityUid? target) // - Target doesn't cancel should-interact event // This is intended to allow items to be picked up in combat mode, // but to also allow items to force attacks anyway (like mobs which are items, e.g. mice) - if (!HasComp(target)) + if (!_itemQuery.HasComp(target)) return false; var combatEv = new CombatModeShouldHandInteractEvent(); @@ -307,7 +355,7 @@ public void UserInteraction( bool checkAccess = true, bool checkCanUse = true) { - if (TryComp(user, out var relay) && relay.RelayEntity is not null) + if (_relayQuery.TryComp(user, out var relay) && relay.RelayEntity is not null) { // TODO this needs to be handled better. This probably bypasses many complex can-interact checks in weird roundabout ways. if (_actionBlockerSystem.CanInteract(user, target)) @@ -321,7 +369,7 @@ public void UserInteraction( if (target != null && Deleted(target.Value)) return; - if (!altInteract && TryComp(user, out var combatMode) && combatMode.IsInCombatMode) + if (!altInteract && _combatQuery.TryComp(user, out var combatMode) && combatMode.IsInCombatMode) { if (!CombatModeCanHandInteract(user, target)) return; @@ -343,10 +391,7 @@ public void UserInteraction( // Check if interacted entity is in the same container, the direct child, or direct parent of the user. // Also checks if the item is accessible via some storage UI (e.g., open backpack) - if (checkAccess - && target != null - && !_containerSystem.IsInSameOrParentContainer(user, target.Value) - && !CanAccessViaStorage(user, target.Value)) + if (checkAccess && target != null && !IsAccessible(user, target.Value)) return; var inRangeUnobstructed = target == null @@ -354,7 +399,7 @@ public void UserInteraction( : !checkAccess || InRangeUnobstructed(user, target.Value); // permits interactions with wall mounted entities // Does the user have hands? - if (!TryComp(user, out var hands) || hands.ActiveHand == null) + if (!_handsQuery.TryComp(user, out var hands) || hands.ActiveHand == null) { var ev = new InteractNoHandEvent(user, target, coordinates); RaiseLocalEvent(user, ev); @@ -494,7 +539,7 @@ public float UnobstructedDistance( predicate ??= _ => false; var ray = new CollisionRay(origin.Position, dir.Normalized(), collisionMask); - var rayResults = _sharedBroadphaseSystem.IntersectRayWithPredicate(origin.MapId, ray, dir.Length(), predicate.Invoke, false).ToList(); + var rayResults = _broadphase.IntersectRayWithPredicate(origin.MapId, ray, dir.Length(), predicate.Invoke, false).ToList(); if (rayResults.Count == 0) return dir.Length(); @@ -557,23 +602,29 @@ public bool InRangeUnobstructed( } var ray = new CollisionRay(origin.Position, dir.Normalized(), (int) collisionMask); - var rayResults = _sharedBroadphaseSystem.IntersectRayWithPredicate(origin.MapId, ray, length, predicate.Invoke, false).ToList(); + var rayResults = _broadphase.IntersectRayWithPredicate(origin.MapId, ray, length, predicate.Invoke, false).ToList(); return rayResults.Count == 0; } public bool InRangeUnobstructed( - EntityUid origin, - EntityUid other, + Entity origin, + Entity other, float range = InteractionRange, CollisionGroup collisionMask = InRangeUnobstructedMask, Ignored? predicate = null, bool popup = false) { - if (!TryComp(other, out TransformComponent? otherXform)) + if (!Resolve(other, ref other.Comp)) return false; - return InRangeUnobstructed(origin, other, otherXform.Coordinates, otherXform.LocalRotation, range, collisionMask, predicate, + return InRangeUnobstructed(origin, + other, + other.Comp.Coordinates, + other.Comp.LocalRotation, + range, + collisionMask, + predicate, popup); } @@ -605,8 +656,8 @@ public bool InRangeUnobstructed( /// True if the two points are within a given range without being obstructed. /// public bool InRangeUnobstructed( - EntityUid origin, - EntityUid other, + Entity origin, + Entity other, EntityCoordinates otherCoordinates, Angle otherAngle, float range = InteractionRange, @@ -614,10 +665,10 @@ public bool InRangeUnobstructed( Ignored? predicate = null, bool popup = false) { - Ignored combinedPredicate = e => e == origin || (predicate?.Invoke(e) ?? false); + Ignored combinedPredicate = e => e == origin.Owner || (predicate?.Invoke(e) ?? false); var inRange = true; MapCoordinates originPos = default; - var targetPos = otherCoordinates.ToMap(EntityManager, _transform); + var targetPos = _transform.ToMapCoordinates(otherCoordinates); Angle targetRot = default; // So essentially: @@ -627,23 +678,30 @@ public bool InRangeUnobstructed( // Alternatively we could check centre distances first though // that means we wouldn't be able to easily check overlap interactions. if (range > 0f && - TryComp(origin, out var fixtureA) && + _fixtureQuery.TryComp(origin, out var fixtureA) && // These fixture counts are stuff that has the component but no fixtures for (e.g. buttons). // At least until they get removed. fixtureA.FixtureCount > 0 && - TryComp(other, out var fixtureB) && + _fixtureQuery.TryComp(other, out var fixtureB) && fixtureB.FixtureCount > 0 && - TryComp(origin, out TransformComponent? xformA)) + Resolve(origin, ref origin.Comp)) { - var (worldPosA, worldRotA) = xformA.GetWorldPositionRotation(); + var (worldPosA, worldRotA) = origin.Comp.GetWorldPositionRotation(); var xfA = new Transform(worldPosA, worldRotA); var parentRotB = _transform.GetWorldRotation(otherCoordinates.EntityId); var xfB = new Transform(targetPos.Position, parentRotB + otherAngle); // Different map or the likes. - if (!_sharedBroadphaseSystem.TryGetNearest(origin, other, - out _, out _, out var distance, - xfA, xfB, fixtureA, fixtureB)) + if (!_broadphase.TryGetNearest( + origin, + other, + out _, + out _, + out var distance, + xfA, + xfB, + fixtureA, + fixtureB)) { inRange = false; } @@ -665,15 +723,15 @@ public bool InRangeUnobstructed( else { // We'll still do the raycast from the centres but we'll bump the range as we know they're in range. - originPos = _transform.GetMapCoordinates(origin, xform: xformA); + originPos = _transform.GetMapCoordinates(origin, xform: origin.Comp); range = (originPos.Position - targetPos.Position).Length(); } } // No fixtures, e.g. wallmounts. else { - originPos = _transform.GetMapCoordinates(origin); - var otherParent = Transform(other).ParentUid; + originPos = _transform.GetMapCoordinates(origin, origin); + var otherParent = (other.Comp ?? Transform(other)).ParentUid; targetRot = otherParent.IsValid() ? Transform(otherParent).LocalRotation + otherAngle : otherAngle; } @@ -724,13 +782,13 @@ private Ignored GetPredicate( { HashSet ignored = new(); - if (HasComp(target) && TryComp(target, out PhysicsComponent? physics) && physics.CanCollide) + if (_itemQuery.HasComp(target) && _physicsQuery.TryComp(target, out var physics) && physics.CanCollide) { // If the target is an item, we ignore any colliding entities. Currently done so that if items get stuck // inside of walls, users can still pick them up. - ignored.UnionWith(_sharedBroadphaseSystem.GetEntitiesIntersectingBody(target, (int) collisionMask, false, physics)); + ignored.UnionWith(_broadphase.GetEntitiesIntersectingBody(target, (int) collisionMask, false, physics)); } - else if (TryComp(target, out WallMountComponent? wallMount)) + else if (_wallMountQuery.TryComp(target, out var wallMount)) { // wall-mount exemptions may be restricted to a specific angle range.da @@ -748,13 +806,7 @@ private Ignored GetPredicate( ignored.UnionWith(grid.GetAnchoredEntities(targetCoords)); } - Ignored combinedPredicate = e => - { - return e == target - || (predicate?.Invoke(e) ?? false) - || ignored.Contains(e); - }; - + Ignored combinedPredicate = e => e == target || (predicate?.Invoke(e) ?? false) || ignored.Contains(e); return combinedPredicate; } @@ -951,10 +1003,8 @@ public bool InteractionActivate( bool checkUseDelay = true, bool checkAccess = true) { - UseDelayComponent? delayComponent = null; - if (checkUseDelay - && TryComp(used, out delayComponent) - && _useDelay.IsDelayed((used, delayComponent))) + _delayQuery.TryComp(used, out var delayComponent); + if (checkUseDelay && delayComponent != null && _useDelay.IsDelayed((used, delayComponent))) return false; if (checkCanInteract && !_actionBlockerSystem.CanInteract(user, used)) @@ -965,11 +1015,11 @@ public bool InteractionActivate( // Check if interacted entity is in the same container, the direct child, or direct parent of the user. // This is bypassed IF the interaction happened through an item slot (e.g., backpack UI) - if (checkAccess && !_containerSystem.IsInSameOrParentContainer(user, used) && !CanAccessViaStorage(user, used)) + if (checkAccess && !IsAccessible(user, used)) return false; // Does the user have hands? - if (!HasComp(user)) + if (!_handsQuery.HasComp(user)) return false; var activateMsg = new ActivateInWorldEvent(user, used); @@ -979,7 +1029,9 @@ public bool InteractionActivate( DoContactInteraction(user, used, activateMsg); // Still need to call this even without checkUseDelay in case this gets relayed from Activate. - _useDelay.TryResetDelay(used, component: delayComponent); + if (delayComponent != null) + _useDelay.TryResetDelay(used, component: delayComponent); + if (!activateMsg.WasLogged) _adminLogger.Add(LogType.InteractActivate, LogImpact.Low, $"{ToPrettyString(user):user} activated {ToPrettyString(used):used}"); return true; @@ -1000,11 +1052,8 @@ public bool UseInHandInteraction( bool checkCanInteract = true, bool checkUseDelay = true) { - UseDelayComponent? delayComponent = null; - - if (checkUseDelay - && TryComp(used, out delayComponent) - && _useDelay.IsDelayed((used, delayComponent))) + _delayQuery.TryComp(used, out var delayComponent); + if (checkUseDelay && delayComponent != null && _useDelay.IsDelayed((used, delayComponent))) return true; // if the item is on cooldown, we consider this handled. if (checkCanInteract && !_actionBlockerSystem.CanInteract(user, used)) @@ -1066,11 +1115,60 @@ public void DroppedInteraction(EntityUid user, EntityUid item) } #endregion + /// + /// Check if a user can access a target (stored in the same containers) and is in range without obstructions. + /// + public bool InRangeAndAccessible( + Entity user, + Entity target, + float range = InteractionRange, + CollisionGroup collisionMask = InRangeUnobstructedMask, + Ignored? predicate = null) + { + if (user == target) + return true; + + if (!Resolve(user, ref user.Comp)) + return false; + + if (!Resolve(target, ref target.Comp)) + return false; + + return IsAccessible(user, target) && InRangeUnobstructed(user, target, range, collisionMask, predicate); + } + + /// + /// Check if a user can access a target or if they are stored in different containers. + /// + public bool IsAccessible(Entity user, Entity target) + { + if (_containerSystem.IsInSameOrParentContainer(user, target, out _, out var container)) + return true; + + return container != null && CanAccessViaStorage(user, target, container); + } + /// /// If a target is in range, but not in the same container as the user, it may be inside of a backpack. This /// checks if the user can access the item in these situations. /// - public abstract bool CanAccessViaStorage(EntityUid user, EntityUid target); + public bool CanAccessViaStorage(EntityUid user, EntityUid target) + { + if (!_containerSystem.TryGetContainingContainer(target, out var container)) + return false; + + return CanAccessViaStorage(user, target, container); + } + + /// + public bool CanAccessViaStorage(EntityUid user, EntityUid target, BaseContainer container) + { + if (StorageComponent.ContainerId != container.ID) + return false; + + // we don't check if the user can access the storage entity itself. This should be handed by the UI system. + return _ui.IsUiOpen(container.Owner, StorageComponent.StorageUiKey.Key, user); + } /// /// Checks whether an entity currently equipped by another player is accessible to some user. This shouldn't @@ -1151,19 +1249,15 @@ public void DoContactInteraction(EntityUid uidA, EntityUid? uidB, HandledEntityE RaiseLocalEvent(uidB.Value, new ContactInteractionEvent(uidA)); } + private void HandleUserInterfaceRangeCheck(ref BoundUserInterfaceCheckRangeEvent ev) { if (ev.Result == BoundUserInterfaceRangeResult.Fail) return; - if (InRangeUnobstructed(ev.Actor, ev.Target, ev.Data.InteractionRange)) - { - ev.Result = BoundUserInterfaceRangeResult.Pass; - } - else - { - ev.Result = BoundUserInterfaceRangeResult.Fail; - } + ev.Result = UiRangeCheck(ev.Actor!, ev.Target, ev.Data.InteractionRange) + ? BoundUserInterfaceRangeResult.Pass + : BoundUserInterfaceRangeResult.Fail; } } diff --git a/Content.Shared/Inventory/InventorySystem.Equip.cs b/Content.Shared/Inventory/InventorySystem.Equip.cs index 400dfb0beb3..7fd156213b4 100644 --- a/Content.Shared/Inventory/InventorySystem.Equip.cs +++ b/Content.Shared/Inventory/InventorySystem.Equip.cs @@ -210,11 +210,7 @@ public bool CanAccess(EntityUid actor, EntityUid target, EntityUid itemUid) return false; // Can the actor reach the item? - if (_interactionSystem.InRangeUnobstructed(actor, itemUid) && _containerSystem.IsInSameOrParentContainer(actor, itemUid)) - return true; - - // Is the item in an open storage UI, i.e., is the user quick-equipping from an open backpack? - if (_interactionSystem.CanAccessViaStorage(actor, itemUid)) + if (_interactionSystem.InRangeAndAccessible(actor, itemUid)) return true; // Is the actor currently stripping the target? Here we could check if the actor has the stripping UI open, but diff --git a/Content.Shared/Inventory/InventorySystem.Slots.cs b/Content.Shared/Inventory/InventorySystem.Slots.cs index 19831278b0a..228b788722e 100644 --- a/Content.Shared/Inventory/InventorySystem.Slots.cs +++ b/Content.Shared/Inventory/InventorySystem.Slots.cs @@ -75,7 +75,7 @@ private void OnOpenSlotStorage(OpenSlotStorageNetworkMessage ev, EntitySessionEv if (TryGetSlotEntity(uid, ev.Slot, out var entityUid) && TryComp(entityUid, out var storageComponent)) { - _storageSystem.OpenStorageUI(entityUid.Value, uid, storageComponent); + _storageSystem.OpenStorageUI(entityUid.Value, uid, storageComponent, false); } } diff --git a/Content.Server/Lock/Components/ActivatableUIRequiresLockComponent.cs b/Content.Shared/Lock/ActivatableUIRequiresLockComponent.cs similarity index 66% rename from Content.Server/Lock/Components/ActivatableUIRequiresLockComponent.cs rename to Content.Shared/Lock/ActivatableUIRequiresLockComponent.cs index dac677c1c27..7d701ffd874 100644 --- a/Content.Server/Lock/Components/ActivatableUIRequiresLockComponent.cs +++ b/Content.Shared/Lock/ActivatableUIRequiresLockComponent.cs @@ -1,15 +1,17 @@ -namespace Content.Server.Lock.Components; +using Robust.Shared.GameStates; + +namespace Content.Shared.Lock; /// /// This is used for activatable UIs that require the entity to have a lock in a certain state. /// -[RegisterComponent] +[RegisterComponent, NetworkedComponent, Access(typeof(LockSystem))] public sealed partial class ActivatableUIRequiresLockComponent : Component { /// /// TRUE: the lock must be locked to access the UI. /// FALSE: the lock must be unlocked to access the UI. /// - [DataField("requireLocked"), ViewVariables(VVAccess.ReadWrite)] - public bool requireLocked = false; + [DataField] + public bool RequireLocked; } diff --git a/Content.Shared/Lock/LockSystem.cs b/Content.Shared/Lock/LockSystem.cs index 54f5d801ea0..36ac5f025b1 100644 --- a/Content.Shared/Lock/LockSystem.cs +++ b/Content.Shared/Lock/LockSystem.cs @@ -8,7 +8,9 @@ using Content.Shared.IdentityManagement; using Content.Shared.Interaction; using Content.Shared.Popups; +using Content.Shared.Storage; using Content.Shared.Storage.Components; +using Content.Shared.UserInterface; using Content.Shared.Verbs; using Content.Shared.Wires; using JetBrains.Annotations; @@ -24,6 +26,7 @@ namespace Content.Shared.Lock; public sealed class LockSystem : EntitySystem { [Dependency] private readonly AccessReaderSystem _accessReader = default!; + [Dependency] private readonly ActivatableUISystem _activatableUI = default!; [Dependency] private readonly SharedAppearanceSystem _appearanceSystem = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedPopupSystem _sharedPopupSystem = default!; @@ -42,11 +45,16 @@ public override void Initialize() SubscribeLocalEvent(OnEmagged); SubscribeLocalEvent(OnDoAfterLock); SubscribeLocalEvent(OnDoAfterUnlock); + SubscribeLocalEvent(OnStorageInteractAttempt); SubscribeLocalEvent(OnLockToggleAttempt); SubscribeLocalEvent(OnAttemptChangePanel); SubscribeLocalEvent(OnUnanchorAttempt); + + SubscribeLocalEvent(OnUIOpenAttempt); + SubscribeLocalEvent(LockToggled); } + private void OnStartup(EntityUid uid, LockComponent lockComp, ComponentStartup args) { _appearanceSystem.SetData(uid, LockVisuals.Locked, lockComp.Locked); @@ -293,6 +301,12 @@ private void OnDoAfterUnlock(EntityUid uid, LockComponent component, UnlockDoAft TryUnlock(uid, args.User, skipDoAfter: true); } + private void OnStorageInteractAttempt(Entity ent, ref StorageInteractAttemptEvent args) + { + if (ent.Comp.Locked) + args.Cancelled = true; + } + private void OnLockToggleAttempt(Entity ent, ref LockToggleAttemptEvent args) { if (args.Cancelled) @@ -340,5 +354,26 @@ private void OnUnanchorAttempt(Entity ent, ref Unanch args.User); args.Cancel(); } + + private void OnUIOpenAttempt(EntityUid uid, ActivatableUIRequiresLockComponent component, ActivatableUIOpenAttemptEvent args) + { + if (args.Cancelled) + return; + + if (TryComp(uid, out var lockComp) && lockComp.Locked != component.RequireLocked) + { + args.Cancel(); + if (lockComp.Locked) + _sharedPopupSystem.PopupEntity(Loc.GetString("entity-storage-component-locked-message"), uid, args.User); + } + } + + private void LockToggled(EntityUid uid, ActivatableUIRequiresLockComponent component, LockToggledEvent args) + { + if (!TryComp(uid, out var lockComp) || lockComp.Locked == component.RequireLocked) + return; + + _activatableUI.CloseAll(uid); + } } diff --git a/Content.Shared/MagicMirror/SharedMagicMirrorSystem.cs b/Content.Shared/MagicMirror/SharedMagicMirrorSystem.cs index 91059d60bfd..789b484cfd3 100644 --- a/Content.Shared/MagicMirror/SharedMagicMirrorSystem.cs +++ b/Content.Shared/MagicMirror/SharedMagicMirrorSystem.cs @@ -10,26 +10,52 @@ namespace Content.Shared.MagicMirror; public abstract class SharedMagicMirrorSystem : EntitySystem { [Dependency] private readonly SharedInteractionSystem _interaction = default!; - [Dependency] protected readonly SharedUserInterfaceSystem _uiSystem = default!; + [Dependency] protected readonly SharedUserInterfaceSystem UISystem = default!; public override void Initialize() { base.Initialize(); + SubscribeLocalEvent(OnMagicMirrorInteract); SubscribeLocalEvent(OnBeforeUIOpen); + SubscribeLocalEvent(OnAttemptOpenUI); SubscribeLocalEvent(OnMirrorRangeCheck); } + private void OnMagicMirrorInteract(Entity mirror, ref AfterInteractEvent args) + { + if (!args.CanReach || args.Target == null) + return; + + UpdateInterface(mirror, args.Target.Value, mirror); + UISystem.TryOpenUi(mirror.Owner, MagicMirrorUiKey.Key, args.User); + } + private void OnMirrorRangeCheck(EntityUid uid, MagicMirrorComponent component, ref BoundUserInterfaceCheckRangeEvent args) { - if (!Exists(component.Target) || !_interaction.InRangeUnobstructed(uid, component.Target.Value)) + if (args.Result == BoundUserInterfaceRangeResult.Fail) + return; + + if (component.Target == null || !Exists(component.Target)) { + component.Target = null; args.Result = BoundUserInterfaceRangeResult.Fail; + return; } + + if (!_interaction.InRangeUnobstructed(uid, component.Target.Value)) + args.Result = BoundUserInterfaceRangeResult.Fail; + } + + private void OnAttemptOpenUI(EntityUid uid, MagicMirrorComponent component, ref ActivatableUIOpenAttemptEvent args) + { + var user = component.Target ?? args.User; + + if (!HasComp(user)) + args.Cancel(); } private void OnBeforeUIOpen(Entity ent, ref BeforeActivatableUIOpenEvent args) { - ent.Comp.Target ??= args.User; UpdateInterface(ent, args.User, ent); } @@ -38,6 +64,8 @@ protected void UpdateInterface(EntityUid mirrorUid, EntityUid targetUid, MagicMi if (!TryComp(targetUid, out var humanoid)) return; + component.Target ??= targetUid; + var hair = humanoid.MarkingSet.TryGetCategory(MarkingCategories.Hair, out var hairMarkings) ? new List(hairMarkings) : new(); @@ -55,7 +83,7 @@ protected void UpdateInterface(EntityUid mirrorUid, EntityUid targetUid, MagicMi // TODO: Component states component.Target = targetUid; - _uiSystem.SetUiState(mirrorUid, MagicMirrorUiKey.Key, state); + UISystem.SetUiState(mirrorUid, MagicMirrorUiKey.Key, state); Dirty(mirrorUid, component); } } diff --git a/Content.Shared/Mobs/Components/MobThresholdsComponent.cs b/Content.Shared/Mobs/Components/MobThresholdsComponent.cs index e97d3672a21..0e37cf9b10e 100644 --- a/Content.Shared/Mobs/Components/MobThresholdsComponent.cs +++ b/Content.Shared/Mobs/Components/MobThresholdsComponent.cs @@ -2,6 +2,7 @@ using Content.Shared.FixedPoint; using Content.Shared.Mobs.Systems; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization; namespace Content.Shared.Mobs.Components; @@ -24,13 +25,16 @@ public sealed partial class MobThresholdsComponent : Component /// Used for alternate health alerts (silicons, for example) /// [DataField("stateAlertDict")] - public Dictionary StateAlertDict = new() + public Dictionary> StateAlertDict = new() { - {MobState.Alive, AlertType.HumanHealth}, - {MobState.Critical, AlertType.HumanCrit}, - {MobState.Dead, AlertType.HumanDead}, + {MobState.Alive, "HumanHealth"}, + {MobState.Critical, "HumanCrit"}, + {MobState.Dead, "HumanDead"}, }; + [DataField] + public ProtoId HealthAlertCategory = "Health"; + /// /// Whether or not this entity should display damage overlays (robots don't feel pain, black out etc.) /// @@ -53,19 +57,19 @@ public sealed class MobThresholdsComponentState : ComponentState public MobState CurrentThresholdState; - public Dictionary StateAlertDict = new() - { - {MobState.Alive, AlertType.HumanHealth}, - {MobState.Critical, AlertType.HumanCrit}, - {MobState.Dead, AlertType.HumanDead}, - }; + public Dictionary> StateAlertDict; public bool ShowOverlays; public bool AllowRevives; - public MobThresholdsComponentState(Dictionary unsortedThresholds, bool triggersAlerts, MobState currentThresholdState, - Dictionary stateAlertDict, bool showOverlays, bool allowRevives) + public MobThresholdsComponentState(Dictionary unsortedThresholds, + bool triggersAlerts, + MobState currentThresholdState, + Dictionary> stateAlertDict, + bool showOverlays, + bool allowRevives) { UnsortedThresholds = unsortedThresholds; TriggersAlerts = triggersAlerts; diff --git a/Content.Shared/Mobs/Systems/MobThresholdSystem.cs b/Content.Shared/Mobs/Systems/MobThresholdSystem.cs index 59d9fb4c239..b11de9eac56 100644 --- a/Content.Shared/Mobs/Systems/MobThresholdSystem.cs +++ b/Content.Shared/Mobs/Systems/MobThresholdSystem.cs @@ -431,7 +431,7 @@ private void MobThresholdStartup(EntityUid target, MobThresholdsComponent thresh private void MobThresholdShutdown(EntityUid target, MobThresholdsComponent component, ComponentShutdown args) { if (component.TriggersAlerts) - _alerts.ClearAlertCategory(target, AlertCategory.Health); + _alerts.ClearAlertCategory(target, component.HealthAlertCategory); } private void OnUpdateMobState(EntityUid target, MobThresholdsComponent component, ref UpdateMobStateEvent args) diff --git a/Content.Shared/Movement/Components/FloorOcclusionComponent.cs b/Content.Shared/Movement/Components/FloorOcclusionComponent.cs index aa9a1ced552..5d412f694a0 100644 --- a/Content.Shared/Movement/Components/FloorOcclusionComponent.cs +++ b/Content.Shared/Movement/Components/FloorOcclusionComponent.cs @@ -8,12 +8,9 @@ namespace Content.Shared.Movement.Components; [RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)] public sealed partial class FloorOcclusionComponent : Component { - /// - /// Is the shader currently enabled. - /// - [ViewVariables(VVAccess.ReadWrite), DataField("enabled"), AutoNetworkedField] - public bool Enabled; + [ViewVariables] + public bool Enabled => Colliding.Count > 0; - [DataField("colliding")] + [DataField, AutoNetworkedField] public List Colliding = new(); } diff --git a/Content.Shared/Movement/Pulling/Components/PullableComponent.cs b/Content.Shared/Movement/Pulling/Components/PullableComponent.cs index db889e7e3bd..100cd9d6d3e 100644 --- a/Content.Shared/Movement/Pulling/Components/PullableComponent.cs +++ b/Content.Shared/Movement/Pulling/Components/PullableComponent.cs @@ -1,4 +1,6 @@ +using Content.Shared.Alert; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; namespace Content.Shared.Movement.Pulling.Components; @@ -36,4 +38,7 @@ public sealed partial class PullableComponent : Component [Access(typeof(Systems.PullingSystem), Other = AccessPermissions.ReadExecute)] [AutoNetworkedField, DataField] public bool PrevFixedRotation; + + [DataField] + public ProtoId PulledAlert = "Pulled"; } diff --git a/Content.Shared/Movement/Pulling/Components/PullerComponent.cs b/Content.Shared/Movement/Pulling/Components/PullerComponent.cs index 1fc9b731bd5..f47ae32f90b 100644 --- a/Content.Shared/Movement/Pulling/Components/PullerComponent.cs +++ b/Content.Shared/Movement/Pulling/Components/PullerComponent.cs @@ -1,5 +1,7 @@ -using Content.Shared.Movement.Pulling.Systems; +using Content.Shared.Alert; +using Content.Shared.Movement.Pulling.Systems; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; namespace Content.Shared.Movement.Pulling.Components; @@ -16,7 +18,7 @@ public sealed partial class PullerComponent : Component /// Next time the puller can throw what is being pulled. /// Used to avoid spamming it for infinite spin + velocity. /// - [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoNetworkedField] + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoNetworkedField, Access(Other = AccessPermissions.ReadWriteExecute)] public TimeSpan NextThrow; [DataField] @@ -38,4 +40,7 @@ public sealed partial class PullerComponent : Component /// [DataField] public bool NeedsHands = true; + + [DataField] + public ProtoId PullingAlert = "Pulling"; } diff --git a/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs b/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs index 81b2fee5695..225810daed2 100644 --- a/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs +++ b/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs @@ -43,8 +43,6 @@ public sealed class PullingSystem : EntitySystem [Dependency] private readonly SharedHandsSystem _handsSystem = default!; [Dependency] private readonly SharedInteractionSystem _interaction = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; - [Dependency] private readonly SharedTransformSystem _xformSys = default!; - [Dependency] private readonly ThrowingSystem _throwing = default!; public override void Initialize() { @@ -66,7 +64,6 @@ public override void Initialize() SubscribeLocalEvent(OnDropHandItems); CommandBinds.Builder - .Bind(ContentKeyFunctions.MovePulledObject, new PointerInputCmdHandler(OnRequestMovePulledObject)) .Bind(ContentKeyFunctions.ReleasePulledObject, InputCmdHandler.FromDelegate(OnReleasePulledObject, handle: false)) .Register(); } @@ -223,7 +220,7 @@ private void StopPulling(EntityUid pullableUid, PullableComponent pullableComp) if (TryComp(oldPuller, out var pullerComp)) { var pullerUid = oldPuller.Value; - _alertsSystem.ClearAlert(pullerUid, AlertType.Pulling); + _alertsSystem.ClearAlert(pullerUid, pullerComp.PullingAlert); pullerComp.Pulling = null; Dirty(oldPuller.Value, pullerComp); @@ -237,7 +234,7 @@ private void StopPulling(EntityUid pullableUid, PullableComponent pullableComp) } - _alertsSystem.ClearAlert(pullableUid, AlertType.Pulled); + _alertsSystem.ClearAlert(pullableUid, pullableComp.PulledAlert); } public bool IsPulled(EntityUid uid, PullableComponent? component = null) @@ -245,47 +242,6 @@ public bool IsPulled(EntityUid uid, PullableComponent? component = null) return Resolve(uid, ref component, false) && component.BeingPulled; } - private bool OnRequestMovePulledObject(ICommonSession? session, EntityCoordinates coords, EntityUid uid) - { - if (session?.AttachedEntity is not { } player || - !player.IsValid()) - { - return false; - } - - if (!TryComp(player, out var pullerComp)) - return false; - - var pulled = pullerComp.Pulling; - - if (!HasComp(pulled)) - return false; - - if (_containerSystem.IsEntityInContainer(player)) - return false; - - // Cooldown buddy - if (_timing.CurTime < pullerComp.NextThrow) - return false; - - pullerComp.NextThrow = _timing.CurTime + pullerComp.ThrowCooldown; - - // Cap the distance - const float range = 2f; - var fromUserCoords = coords.WithEntityId(player, EntityManager); - var userCoords = new EntityCoordinates(player, Vector2.Zero); - - if (!userCoords.InRange(EntityManager, _xformSys, fromUserCoords, range)) - { - var userDirection = fromUserCoords.Position - userCoords.Position; - fromUserCoords = userCoords.Offset(userDirection.Normalized() * range); - } - - Dirty(player, pullerComp); - _throwing.TryThrow(pulled.Value, fromUserCoords, user: player, strength: 4f, animated: false, recoil: false, playSound: false, doSpin: false); - return false; - } - public bool IsPulling(EntityUid puller, PullerComponent? component = null) { return Resolve(puller, ref component, false) && component.Pulling != null; @@ -362,14 +318,17 @@ public bool CanPull(EntityUid puller, EntityUid pullableUid, PullerComponent? pu return !startPull.Cancelled && !getPulled.Cancelled; } - public bool TogglePull(EntityUid pullableUid, EntityUid pullerUid, PullableComponent pullable) + public bool TogglePull(Entity pullable, EntityUid pullerUid) { - if (pullable.Puller == pullerUid) + if (!Resolve(pullable, ref pullable.Comp, false)) + return false; + + if (pullable.Comp.Puller == pullerUid) { - return TryStopPull(pullableUid, pullable); + return TryStopPull(pullable, pullable.Comp); } - return TryStartPull(pullerUid, pullableUid, pullableComp: pullable); + return TryStartPull(pullerUid, pullable, pullableComp: pullable); } public bool TogglePull(EntityUid pullerUid, PullerComponent puller) @@ -377,7 +336,7 @@ public bool TogglePull(EntityUid pullerUid, PullerComponent puller) if (!TryComp(puller.Pulling, out var pullable)) return false; - return TogglePull(puller.Pulling.Value, pullerUid, pullable); + return TogglePull((puller.Pulling.Value, pullable), pullerUid); } public bool TryStartPull(EntityUid pullerUid, EntityUid pullableUid, @@ -460,8 +419,8 @@ public bool TryStartPull(EntityUid pullerUid, EntityUid pullableUid, // Messaging var message = new PullStartedMessage(pullerUid, pullableUid); - _alertsSystem.ShowAlert(pullerUid, AlertType.Pulling); - _alertsSystem.ShowAlert(pullableUid, AlertType.Pulled); + _alertsSystem.ShowAlert(pullerUid, pullerComp.PullingAlert); + _alertsSystem.ShowAlert(pullableUid, pullableComp.PulledAlert); RaiseLocalEvent(pullerUid, message); RaiseLocalEvent(pullableUid, message); diff --git a/Content.Shared/Movement/Systems/SharedFloorOcclusionSystem.cs b/Content.Shared/Movement/Systems/SharedFloorOcclusionSystem.cs index 9d27ea42c63..6b7023a1c64 100644 --- a/Content.Shared/Movement/Systems/SharedFloorOcclusionSystem.cs +++ b/Content.Shared/Movement/Systems/SharedFloorOcclusionSystem.cs @@ -15,39 +15,37 @@ public override void Initialize() SubscribeLocalEvent(OnEndCollide); } - private void OnStartCollide(EntityUid uid, FloorOccluderComponent component, ref StartCollideEvent args) + private void OnStartCollide(Entity entity, ref StartCollideEvent args) { var other = args.OtherEntity; if (!TryComp(other, out var occlusion) || - occlusion.Colliding.Contains(uid)) + occlusion.Colliding.Contains(entity.Owner)) { return; } - SetEnabled(other, occlusion, true); - occlusion.Colliding.Add(uid); + occlusion.Colliding.Add(entity.Owner); + Dirty(other, occlusion); + SetEnabled((other, occlusion)); } - private void OnEndCollide(EntityUid uid, FloorOccluderComponent component, ref EndCollideEvent args) + private void OnEndCollide(Entity entity, ref EndCollideEvent args) { var other = args.OtherEntity; if (!TryComp(other, out var occlusion)) return; - occlusion.Colliding.Remove(uid); + if (!occlusion.Colliding.Remove(entity.Owner)) + return; - if (occlusion.Colliding.Count == 0) - SetEnabled(other, occlusion, false); + Dirty(other, occlusion); + SetEnabled((other, occlusion)); } - protected virtual void SetEnabled(EntityUid uid, FloorOcclusionComponent component, bool enabled) + protected virtual void SetEnabled(Entity entity) { - if (component.Enabled == enabled) - return; - component.Enabled = enabled; - Dirty(uid, component); } } diff --git a/Content.Shared/Ninja/Components/SpaceNinjaComponent.cs b/Content.Shared/Ninja/Components/SpaceNinjaComponent.cs index 0f3bff265cb..91c816df5c9 100644 --- a/Content.Shared/Ninja/Components/SpaceNinjaComponent.cs +++ b/Content.Shared/Ninja/Components/SpaceNinjaComponent.cs @@ -1,3 +1,4 @@ +using Content.Shared.Alert; using Content.Shared.Ninja.Systems; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; @@ -53,4 +54,7 @@ public sealed partial class SpaceNinjaComponent : Component /// [DataField] public EntProtoId SpiderChargeObjective = "SpiderChargeObjective"; + + [DataField] + public ProtoId SuitPowerAlert = "SuitPower"; } diff --git a/Content.Shared/Nutrition/Components/HungerComponent.cs b/Content.Shared/Nutrition/Components/HungerComponent.cs index 9ac82ba283c..79d895ddae6 100644 --- a/Content.Shared/Nutrition/Components/HungerComponent.cs +++ b/Content.Shared/Nutrition/Components/HungerComponent.cs @@ -2,6 +2,7 @@ using Content.Shared.Damage; using Content.Shared.Nutrition.EntitySystems; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; using Robust.Shared.Serialization.TypeSerializers.Implementations.Generic; @@ -65,15 +66,18 @@ public sealed partial class HungerComponent : Component /// /// A dictionary relating hunger thresholds to corresponding alerts. /// - [DataField("hungerThresholdAlerts", customTypeSerializer: typeof(DictionarySerializer))] + [DataField("hungerThresholdAlerts")] [AutoNetworkedField] - public Dictionary HungerThresholdAlerts = new() + public Dictionary> HungerThresholdAlerts = new() { - { HungerThreshold.Peckish, AlertType.Peckish }, - { HungerThreshold.Starving, AlertType.Starving }, - { HungerThreshold.Dead, AlertType.Starving } + { HungerThreshold.Peckish, "Peckish" }, + { HungerThreshold.Starving, "Starving" }, + { HungerThreshold.Dead, "Starving" } }; + [DataField] + public ProtoId HungerAlertCategory = "Hunger"; + /// /// A dictionary relating HungerThreshold to how much they modify . /// diff --git a/Content.Shared/Nutrition/Components/ThirstComponent.cs b/Content.Shared/Nutrition/Components/ThirstComponent.cs index 731346401fd..f3ac881361f 100644 --- a/Content.Shared/Nutrition/Components/ThirstComponent.cs +++ b/Content.Shared/Nutrition/Components/ThirstComponent.cs @@ -1,6 +1,7 @@ using Content.Shared.Alert; using Content.Shared.Nutrition.EntitySystems; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; namespace Content.Shared.Nutrition.Components; @@ -56,11 +57,14 @@ public sealed partial class ThirstComponent : Component {ThirstThreshold.Dead, 0.0f}, }; - public static readonly Dictionary ThirstThresholdAlertTypes = new() + [DataField] + public ProtoId ThirstyCategory = "Thirst"; + + public static readonly Dictionary> ThirstThresholdAlertTypes = new() { - {ThirstThreshold.Thirsty, AlertType.Thirsty}, - {ThirstThreshold.Parched, AlertType.Parched}, - {ThirstThreshold.Dead, AlertType.Parched}, + {ThirstThreshold.Thirsty, "Thirsty"}, + {ThirstThreshold.Parched, "Parched"}, + {ThirstThreshold.Dead, "Parched"}, }; } diff --git a/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs b/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs index 4de4e4d5feb..bff15f06ff9 100644 --- a/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs +++ b/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs @@ -61,7 +61,7 @@ private void OnMapInit(EntityUid uid, HungerComponent component, MapInitEvent ar private void OnShutdown(EntityUid uid, HungerComponent component, ComponentShutdown args) { - _alerts.ClearAlertCategory(uid, AlertCategory.Hunger); + _alerts.ClearAlertCategory(uid, component.HungerAlertCategory); } private void OnRefreshMovespeed(EntityUid uid, HungerComponent component, RefreshMovementSpeedModifiersEvent args) @@ -142,7 +142,7 @@ private void DoHungerThresholdEffects(EntityUid uid, HungerComponent? component } else { - _alerts.ClearAlertCategory(uid, AlertCategory.Hunger); + _alerts.ClearAlertCategory(uid, component.HungerAlertCategory); } if (component.HungerThresholdDecayModifiers.TryGetValue(component.CurrentThreshold, out var modifier)) diff --git a/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs b/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs index 8ea7d9140c3..205d8d6cde3 100644 --- a/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs +++ b/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs @@ -165,7 +165,7 @@ private void UpdateEffects(EntityUid uid, ThirstComponent component) } else { - _alerts.ClearAlertCategory(uid, AlertCategory.Thirst); + _alerts.ClearAlertCategory(uid, component.ThirstyCategory); } switch (component.CurrentThirstThreshold) diff --git a/Content.Shared/Pinpointer/SharedNavMapSystem.cs b/Content.Shared/Pinpointer/SharedNavMapSystem.cs index ffe81c2d0ea..7c12321b5db 100644 --- a/Content.Shared/Pinpointer/SharedNavMapSystem.cs +++ b/Content.Shared/Pinpointer/SharedNavMapSystem.cs @@ -96,7 +96,7 @@ private void OnGetState(EntityUid uid, NavMapComponent component, ref ComponentG chunks.Add(origin, chunk.TileData); } - args.State = new NavMapComponentState(chunks, component.Beacons); + args.State = new NavMapState(chunks, component.Beacons); return; } @@ -109,12 +109,7 @@ private void OnGetState(EntityUid uid, NavMapComponent component, ref ComponentG chunks.Add(origin, chunk.TileData); } - args.State = new NavMapComponentState(chunks, component.Beacons) - { - // TODO NAVMAP cache a single AllChunks hashset in the component. - // Or maybe just only send them if a chunk gets removed. - AllChunks = new(component.Chunks.Keys), - }; + args.State = new NavMapDeltaState(chunks, component.Beacons, new(component.Chunks.Keys)); } #endregion @@ -122,32 +117,35 @@ private void OnGetState(EntityUid uid, NavMapComponent component, ref ComponentG #region: System messages [Serializable, NetSerializable] - protected sealed class NavMapComponentState( + protected sealed class NavMapState( Dictionary chunks, Dictionary beacons) - : ComponentState, IComponentDeltaState + : ComponentState { public Dictionary Chunks = chunks; public Dictionary Beacons = beacons; + } - // Required to infer deleted/missing chunks for delta states - public HashSet? AllChunks; - - public bool FullState => AllChunks == null; + [Serializable, NetSerializable] + protected sealed class NavMapDeltaState( + Dictionary modifiedChunks, + Dictionary beacons, + HashSet allChunks) + : ComponentState, IComponentDeltaState + { + public Dictionary ModifiedChunks = modifiedChunks; + public Dictionary Beacons = beacons; + public HashSet AllChunks = allChunks; - public void ApplyToFullState(IComponentState fullState) + public void ApplyToFullState(NavMapState state) { - DebugTools.Assert(!FullState); - var state = (NavMapComponentState) fullState; - DebugTools.Assert(state.FullState); - foreach (var key in state.Chunks.Keys) { if (!AllChunks!.Contains(key)) state.Chunks.Remove(key); } - foreach (var (index, data) in Chunks) + foreach (var (index, data) in ModifiedChunks) { if (!state.Chunks.TryGetValue(index, out var stateValue)) state.Chunks[index] = stateValue = new int[data.Length]; @@ -162,12 +160,8 @@ public void ApplyToFullState(IComponentState fullState) } } - public IComponentState CreateNewFullState(IComponentState fullState) + public NavMapState CreateNewFullState(NavMapState state) { - DebugTools.Assert(!FullState); - var state = (NavMapComponentState) fullState; - DebugTools.Assert(state.FullState); - var chunks = new Dictionary(state.Chunks.Count); foreach (var (index, data) in state.Chunks) { @@ -176,13 +170,13 @@ public IComponentState CreateNewFullState(IComponentState fullState) var newData = chunks[index] = new int[ArraySize]; - if (Chunks.TryGetValue(index, out var updatedData)) + if (ModifiedChunks.TryGetValue(index, out var updatedData)) Array.Copy(newData, updatedData, ArraySize); else Array.Copy(newData, data, ArraySize); } - return new NavMapComponentState(chunks, new(Beacons)); + return new NavMapState(chunks, new(Beacons)); } } diff --git a/Content.Shared/Placeable/PlaceableSurfaceSystem.cs b/Content.Shared/Placeable/PlaceableSurfaceSystem.cs index b0031cfa33f..a9a9390a6e0 100644 --- a/Content.Shared/Placeable/PlaceableSurfaceSystem.cs +++ b/Content.Shared/Placeable/PlaceableSurfaceSystem.cs @@ -3,68 +3,67 @@ using Content.Shared.Interaction; using Content.Shared.Storage.Components; -namespace Content.Shared.Placeable +namespace Content.Shared.Placeable; + +public sealed class PlaceableSurfaceSystem : EntitySystem { - public sealed class PlaceableSurfaceSystem : EntitySystem - { - [Dependency] private readonly SharedHandsSystem _handsSystem = default!; + [Dependency] private readonly SharedHandsSystem _handsSystem = default!; - public override void Initialize() - { - base.Initialize(); + public override void Initialize() + { + base.Initialize(); - SubscribeLocalEvent(OnAfterInteractUsing); - } + SubscribeLocalEvent(OnAfterInteractUsing); + } - public void SetPlaceable(EntityUid uid, bool isPlaceable, PlaceableSurfaceComponent? surface = null) - { - if (!Resolve(uid, ref surface, false)) - return; + public void SetPlaceable(EntityUid uid, bool isPlaceable, PlaceableSurfaceComponent? surface = null) + { + if (!Resolve(uid, ref surface, false)) + return; - surface.IsPlaceable = isPlaceable; - Dirty(uid, surface); - } + surface.IsPlaceable = isPlaceable; + Dirty(uid, surface); + } - public void SetPlaceCentered(EntityUid uid, bool placeCentered, PlaceableSurfaceComponent? surface = null) - { - if (!Resolve(uid, ref surface)) - return; + public void SetPlaceCentered(EntityUid uid, bool placeCentered, PlaceableSurfaceComponent? surface = null) + { + if (!Resolve(uid, ref surface)) + return; - surface.PlaceCentered = placeCentered; - Dirty(uid, surface); - } + surface.PlaceCentered = placeCentered; + Dirty(uid, surface); + } - public void SetPositionOffset(EntityUid uid, Vector2 offset, PlaceableSurfaceComponent? surface = null) - { - if (!Resolve(uid, ref surface)) - return; + public void SetPositionOffset(EntityUid uid, Vector2 offset, PlaceableSurfaceComponent? surface = null) + { + if (!Resolve(uid, ref surface)) + return; - surface.PositionOffset = offset; - Dirty(uid, surface); - } + surface.PositionOffset = offset; + Dirty(uid, surface); + } - private void OnAfterInteractUsing(EntityUid uid, PlaceableSurfaceComponent surface, AfterInteractUsingEvent args) - { - if (args.Handled || !args.CanReach) - return; + private void OnAfterInteractUsing(EntityUid uid, PlaceableSurfaceComponent surface, AfterInteractUsingEvent args) + { + if (args.Handled || !args.CanReach) + return; - if (!surface.IsPlaceable) - return; + if (!surface.IsPlaceable) + return; - // 99% of the time they want to dump the stuff inside on the table, they can manually place with q if they really need to. - // Just causes prediction CBT otherwise. - if (HasComp(args.Used)) - return; + // 99% of the time they want to dump the stuff inside on the table, they can manually place with q if they really need to. + // Just causes prediction CBT otherwise. + if (HasComp(args.Used)) + return; - if (!_handsSystem.TryDrop(args.User, args.Used)) - return; + if (!_handsSystem.TryDrop(args.User, args.Used)) + return; - if (surface.PlaceCentered) - Transform(args.Used).LocalPosition = Transform(uid).LocalPosition + surface.PositionOffset; - else - Transform(args.Used).Coordinates = args.ClickLocation; + if (surface.PlaceCentered) + Transform(args.Used).LocalPosition = Transform(uid).LocalPosition + surface.PositionOffset; + else + Transform(args.Used).Coordinates = args.ClickLocation; - args.Handled = true; - } + args.Handled = true; } } diff --git a/Content.Shared/Preferences/Loadouts/RoleLoadout.cs b/Content.Shared/Preferences/Loadouts/RoleLoadout.cs index 010c7853805..ce0644f0c32 100644 --- a/Content.Shared/Preferences/Loadouts/RoleLoadout.cs +++ b/Content.Shared/Preferences/Loadouts/RoleLoadout.cs @@ -99,12 +99,20 @@ public void EnsureValid(HumanoidCharacterProfile profile, ICommonSession session { var loadout = loadouts[i]; + // Old prototype or otherwise invalid. if (!protoManager.TryIndex(loadout.Prototype, out var loadoutProto)) { loadouts.RemoveAt(i); continue; } + // Malicious client maybe, check the group even has it. + if (!groupProto.Loadouts.Contains(loadout.Prototype)) + { + loadouts.RemoveAt(i); + continue; + } + // Corvax-Loadouts-Start: Validate if loadout exist in group. It's can't be f real if (!groupProtoLoadouts.Contains(loadout.Prototype)) { diff --git a/Content.Shared/Prying/Components/PryUnpoweredComponent.cs b/Content.Shared/Prying/Components/PryUnpoweredComponent.cs index f0e61dc9685..b6b69a2577d 100644 --- a/Content.Shared/Prying/Components/PryUnpoweredComponent.cs +++ b/Content.Shared/Prying/Components/PryUnpoweredComponent.cs @@ -8,4 +8,6 @@ namespace Content.Shared.Prying.Components; [RegisterComponent, NetworkedComponent] public sealed partial class PryUnpoweredComponent : Component { + [DataField] + public float PryModifier = 0.1f; } diff --git a/Content.Shared/Prying/Systems/PryingSystem.cs b/Content.Shared/Prying/Systems/PryingSystem.cs index ab87585c706..372c89c9ae0 100644 --- a/Content.Shared/Prying/Systems/PryingSystem.cs +++ b/Content.Shared/Prying/Systems/PryingSystem.cs @@ -93,17 +93,17 @@ public bool TryPry(EntityUid target, EntityUid user, out DoAfterId? id) id = null; // We don't care about displaying a message if no tool was used. - if (!CanPry(target, user, out _)) + if (!TryComp(target, out var unpoweredComp) || !CanPry(target, user, out _, unpoweredComp: unpoweredComp)) // If we have reached this point we want the event that caused this // to be marked as handled. return true; // hand-prying is much slower - var modifier = CompOrNull(user)?.SpeedModifier ?? 0.1f; + var modifier = CompOrNull(user)?.SpeedModifier ?? unpoweredComp.PryModifier; return StartPry(target, user, null, modifier, out id); } - private bool CanPry(EntityUid target, EntityUid user, out string? message, PryingComponent? comp = null) + private bool CanPry(EntityUid target, EntityUid user, out string? message, PryingComponent? comp = null, PryUnpoweredComponent? unpoweredComp = null) { BeforePryEvent canev; @@ -113,7 +113,7 @@ private bool CanPry(EntityUid target, EntityUid user, out string? message, Pryin } else { - if (!TryComp(target, out _)) + if (!Resolve(target, ref unpoweredComp)) { message = null; return false; diff --git a/Content.Shared/Random/Helpers/SharedRandomExtensions.cs b/Content.Shared/Random/Helpers/SharedRandomExtensions.cs index 20e57e94212..f5fbc1bd24e 100644 --- a/Content.Shared/Random/Helpers/SharedRandomExtensions.cs +++ b/Content.Shared/Random/Helpers/SharedRandomExtensions.cs @@ -12,6 +12,11 @@ public static string Pick(this IRobustRandom random, DatasetPrototype prototype) return random.Pick(prototype.Values); } + public static string Pick(this IRobustRandom random, LocalizedDatasetPrototype prototype) + { + return random.Pick(prototype.Values); + } + public static string Pick(this IWeightedRandomPrototype prototype, System.Random random) { var picks = prototype.Weights; diff --git a/Content.Shared/Revenant/Components/RevenantComponent.cs b/Content.Shared/Revenant/Components/RevenantComponent.cs index 947c1a4b3fc..d7fb28ef136 100644 --- a/Content.Shared/Revenant/Components/RevenantComponent.cs +++ b/Content.Shared/Revenant/Components/RevenantComponent.cs @@ -1,4 +1,5 @@ using System.Numerics; +using Content.Shared.Alert; using Content.Shared.FixedPoint; using Content.Shared.Store; using Content.Shared.Whitelist; @@ -200,6 +201,9 @@ public sealed partial class RevenantComponent : Component public EntityWhitelist? MalfunctionBlacklist; #endregion + [DataField] + public ProtoId EssenceAlert = "Essence"; + #region Visualizer [DataField("state")] public string State = "idle"; diff --git a/Content.Shared/Roles/Jobs/SharedJobSystem.cs b/Content.Shared/Roles/Jobs/SharedJobSystem.cs index 04ac45c4c5f..fcf76052785 100644 --- a/Content.Shared/Roles/Jobs/SharedJobSystem.cs +++ b/Content.Shared/Roles/Jobs/SharedJobSystem.cs @@ -146,8 +146,10 @@ public string MindTryGetJobName([NotNullWhen(true)] EntityUid? mindId) public bool CanBeAntag(ICommonSession player) { + // If the player does not have any mind associated with them (e.g., has not spawned in or is in the lobby), then + // they are eligible to be given an antag role/entity. if (_playerSystem.ContentData(player) is not { Mind: { } mindId }) - return false; + return true; if (!MindTryGetJob(mindId, out _, out var prototype)) return true; diff --git a/Content.Shared/Shuttles/Components/PilotComponent.cs b/Content.Shared/Shuttles/Components/PilotComponent.cs index 1a6927cf813..cb42db4436f 100644 --- a/Content.Shared/Shuttles/Components/PilotComponent.cs +++ b/Content.Shared/Shuttles/Components/PilotComponent.cs @@ -1,7 +1,9 @@ using System.Numerics; +using Content.Shared.Alert; using Content.Shared.Movement.Systems; using Robust.Shared.GameStates; using Robust.Shared.Map; +using Robust.Shared.Prototypes; using Robust.Shared.Timing; namespace Content.Shared.Shuttles.Components @@ -32,6 +34,9 @@ public sealed partial class PilotComponent : Component [ViewVariables] public ShuttleButtons HeldButtons = ShuttleButtons.None; + [DataField] + public ProtoId PilotingAlert = "PilotingShuttle"; + public override bool SendOnlyToOwner => true; } } diff --git a/Content.Shared/Silicons/Borgs/Components/BorgChassisComponent.cs b/Content.Shared/Silicons/Borgs/Components/BorgChassisComponent.cs index 71d3a7bd166..e1776873da9 100644 --- a/Content.Shared/Silicons/Borgs/Components/BorgChassisComponent.cs +++ b/Content.Shared/Silicons/Borgs/Components/BorgChassisComponent.cs @@ -1,6 +1,8 @@ -using Content.Shared.Whitelist; +using Content.Shared.Alert; +using Content.Shared.Whitelist; using Robust.Shared.Containers; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization; namespace Content.Shared.Silicons.Borgs.Components; @@ -76,6 +78,12 @@ public sealed partial class BorgChassisComponent : Component [DataField("noMindState")] public string NoMindState = string.Empty; #endregion + + [DataField] + public ProtoId BatteryAlert = "BorgBattery"; + + [DataField] + public ProtoId NoBatteryAlert = "BorgBatteryNone"; } [Serializable, NetSerializable] diff --git a/Content.Shared/Silicons/Borgs/SharedBorgSystem.cs b/Content.Shared/Silicons/Borgs/SharedBorgSystem.cs index 0431d95a42f..2983c0d642f 100644 --- a/Content.Shared/Silicons/Borgs/SharedBorgSystem.cs +++ b/Content.Shared/Silicons/Borgs/SharedBorgSystem.cs @@ -5,6 +5,7 @@ using Content.Shared.Popups; using Content.Shared.PowerCell.Components; using Content.Shared.Silicons.Borgs.Components; +using Content.Shared.UserInterface; using Content.Shared.Wires; using Robust.Shared.Containers; @@ -30,7 +31,8 @@ public override void Initialize() SubscribeLocalEvent(OnInserted); SubscribeLocalEvent(OnRemoved); SubscribeLocalEvent(OnRefreshMovementSpeedModifiers); - + SubscribeLocalEvent(OnUIOpenAttempt); + InitializeRelay(); } @@ -75,6 +77,13 @@ private void OnStartup(EntityUid uid, BorgChassisComponent component, ComponentS component.ModuleContainer = Container.EnsureContainer(uid, component.ModuleContainerId, containerManager); } + private void OnUIOpenAttempt(EntityUid uid, BorgChassisComponent component, ActivatableUIOpenAttemptEvent args) + { + // borgs can't view their own ui + if (args.User == uid) + args.Cancel(); + } + protected virtual void OnInserted(EntityUid uid, BorgChassisComponent component, EntInsertedIntoContainerMessage args) { diff --git a/Content.Shared/StatusEffect/StatusEffectPrototype.cs b/Content.Shared/StatusEffect/StatusEffectPrototype.cs index ae9e26879eb..8b1f84e4d81 100644 --- a/Content.Shared/StatusEffect/StatusEffectPrototype.cs +++ b/Content.Shared/StatusEffect/StatusEffectPrototype.cs @@ -10,7 +10,7 @@ public sealed partial class StatusEffectPrototype : IPrototype public string ID { get; private set; } = default!; [DataField("alert")] - public AlertType? Alert { get; private set; } + public ProtoId? Alert { get; private set; } /// /// Whether a status effect should be able to apply to any entity, diff --git a/Content.Shared/StatusEffect/StatusEffectsSystem.cs b/Content.Shared/StatusEffect/StatusEffectsSystem.cs index f3e3e12bd8c..9806077f9bb 100644 --- a/Content.Shared/StatusEffect/StatusEffectsSystem.cs +++ b/Content.Shared/StatusEffect/StatusEffectsSystem.cs @@ -219,7 +219,7 @@ public bool TryAddStatusEffect(EntityUid uid, string key, TimeSpan time, bool re /// This is mostly for stuns, since Stun and Knockdown share an alert key. Other times this pretty much /// will not be useful. /// - private (TimeSpan, TimeSpan)? GetAlertCooldown(EntityUid uid, AlertType alert, StatusEffectsComponent status) + private (TimeSpan, TimeSpan)? GetAlertCooldown(EntityUid uid, ProtoId alert, StatusEffectsComponent status) { (TimeSpan, TimeSpan)? maxCooldown = null; foreach (var kvp in status.ActiveEffects) diff --git a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs index 6dd7f9d4184..18a8f20afc7 100644 --- a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs +++ b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs @@ -2,17 +2,15 @@ using System.Diagnostics.CodeAnalysis; using System.Linq; using Content.Shared.ActionBlocker; -using Content.Shared.Administration; -using Content.Shared.Administration.Managers; using Content.Shared.Containers.ItemSlots; using Content.Shared.Destructible; using Content.Shared.DoAfter; -using Content.Shared.Ghost; using Content.Shared.Hands.Components; using Content.Shared.Hands.EntitySystems; using Content.Shared.Implants.Components; using Content.Shared.Input; using Content.Shared.Interaction; +using Content.Shared.Interaction.Components; using Content.Shared.Inventory; using Content.Shared.Item; using Content.Shared.Lock; @@ -23,6 +21,7 @@ using Content.Shared.Storage.Components; using Content.Shared.Timing; using Content.Shared.Verbs; +using Content.Shared.Whitelist; using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; using Robust.Shared.GameStates; @@ -40,7 +39,6 @@ public abstract class SharedStorageSystem : EntitySystem { [Dependency] private readonly IPrototypeManager _prototype = default!; [Dependency] protected readonly IRobustRandom Random = default!; - [Dependency] private readonly ISharedAdminManager _admin = default!; [Dependency] protected readonly ActionBlockerSystem ActionBlocker = default!; [Dependency] private readonly EntityLookupSystem _entityLookupSystem = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; @@ -154,7 +152,9 @@ private void OnStorageGetState(EntityUid uid, StorageComponent component, ref Co Grid = new List(component.Grid), MaxItemSize = component.MaxItemSize, StoredItems = storedItems, - SavedLocations = component.SavedLocations + SavedLocations = component.SavedLocations, + Whitelist = component.Whitelist, + Blacklist = component.Blacklist }; } @@ -166,6 +166,8 @@ private void OnStorageHandleState(EntityUid uid, StorageComponent component, ref component.Grid.Clear(); component.Grid.AddRange(state.Grid); component.MaxItemSize = state.MaxItemSize; + component.Whitelist = state.Whitelist; + component.Blacklist = state.Blacklist; component.StoredItems.Clear(); @@ -249,17 +251,8 @@ private void OnBoundUIClosed(EntityUid uid, StorageComponent storageComp, BoundU private void AddUiVerb(EntityUid uid, StorageComponent component, GetVerbsEvent args) { - var silent = false; - if (!args.CanAccess || !args.CanInteract || TryComp(uid, out var lockComponent) && lockComponent.Locked) - { - // we allow admins to open the storage anyways - if (!_admin.HasAdminFlag(args.User, AdminFlags.Admin)) - return; - - silent = true; - } - - silent |= HasComp(args.User); + if (!CanInteract(args.User, (uid, component), args.CanAccess && args.CanInteract)) + return; // Does this player currently have the storage UI open? var uiOpen = _ui.IsUiOpen(uid, StorageComponent.StorageUiKey.Key, args.User); @@ -274,7 +267,7 @@ private void AddUiVerb(EntityUid uid, StorageComponent component, GetVerbsEvent< } else { - OpenStorageUI(uid, args.User, component, silent); + OpenStorageUI(uid, args.User, component); } } }; @@ -298,13 +291,16 @@ private void AddUiVerb(EntityUid uid, StorageComponent component, GetVerbsEvent< /// Opens the storage UI for an entity /// /// The entity to open the UI for - public void OpenStorageUI(EntityUid uid, EntityUid entity, StorageComponent? storageComp = null, bool silent = false) + public void OpenStorageUI(EntityUid uid, EntityUid entity, StorageComponent? storageComp = null, bool silent = true) { if (!Resolve(uid, ref storageComp, false)) return; // prevent spamming bag open / honkerton honk sound silent |= TryComp(uid, out var useDelay) && UseDelay.IsDelayed((uid, useDelay)); + if (!CanInteract(entity, (uid, storageComp), silent: silent)) + return; + if (!silent) { if (!_ui.IsUiOpen(uid, StorageComponent.StorageUiKey.Key)) @@ -326,7 +322,7 @@ private void AddTransferVerbs(EntityUid uid, StorageComponent component, GetVerb var entities = component.Container.ContainedEntities; - if (entities.Count == 0 || TryComp(uid, out LockComponent? lockComponent) && lockComponent.Locked) + if (entities.Count == 0 || !CanInteract(args.User, (uid, component))) return; // if the target is storage, add a verb to transfer storage. @@ -337,7 +333,7 @@ private void AddTransferVerbs(EntityUid uid, StorageComponent component, GetVerb { Text = Loc.GetString("storage-component-transfer-verb"), IconEntity = GetNetEntity(args.Using), - Act = () => TransferEntities(uid, args.Target, args.User, component, lockComponent, targetStorage, targetLock) + Act = () => TransferEntities(uid, args.Target, args.User, component, null, targetStorage, targetLock) }; args.Verbs.Add(verb); @@ -350,7 +346,7 @@ private void AddTransferVerbs(EntityUid uid, StorageComponent component, GetVerb /// true if inserted, false otherwise private void OnInteractUsing(EntityUid uid, StorageComponent storageComp, InteractUsingEvent args) { - if (args.Handled || !storageComp.ClickInsert || TryComp(uid, out LockComponent? lockComponent) && lockComponent.Locked) + if (args.Handled || !CanInteract(args.User, (uid, storageComp), storageComp.ClickInsert, false)) return; if (HasComp(uid)) @@ -368,7 +364,7 @@ private void OnInteractUsing(EntityUid uid, StorageComponent storageComp, Intera /// private void OnActivate(EntityUid uid, StorageComponent storageComp, ActivateInWorldEvent args) { - if (args.Handled || TryComp(uid, out var lockComponent) && lockComponent.Locked) + if (args.Handled || !CanInteract(args.User, (uid, storageComp), storageComp.ClickInsert)) return; // Toggle @@ -378,7 +374,7 @@ private void OnActivate(EntityUid uid, StorageComponent storageComp, ActivateInW } else { - OpenStorageUI(uid, args.User, storageComp); + OpenStorageUI(uid, args.User, storageComp, false); } args.Handled = true; @@ -392,7 +388,7 @@ private void OnImplantActivate(EntityUid uid, StorageComponent storageComp, Open if (args.Handled) return; - OpenStorageUI(uid, args.Performer, storageComp); + OpenStorageUI(uid, args.Performer, storageComp, false); args.Handled = true; } @@ -1087,7 +1083,7 @@ public bool PlayerInsertHeldEntity(EntityUid uid, EntityUid player, StorageCompo /// true if inserted, false otherwise public bool PlayerInsertEntityInWorld(Entity uid, EntityUid player, EntityUid toInsert) { - if (!Resolve(uid, ref uid.Comp) || !_interactionSystem.InRangeUnobstructed(player, uid)) + if (!Resolve(uid, ref uid.Comp) || !_interactionSystem.InRangeUnobstructed(player, uid.Owner)) return false; if (!Insert(uid, toInsert, out _, user: player, uid.Comp)) @@ -1403,7 +1399,7 @@ public ItemSizePrototype GetMaxItemSize(Entity uid) } /// - /// Checks if a storage's UI is open by anyone when locked, and closes it unless they're an admin. + /// Checks if a storage's UI is open by anyone when locked, and closes it. /// private void OnLockToggled(EntityUid uid, StorageComponent component, ref LockToggledEvent args) { @@ -1413,11 +1409,8 @@ private void OnLockToggled(EntityUid uid, StorageComponent component, ref LockTo // Gets everyone looking at the UI foreach (var actor in _ui.GetActors(uid, StorageComponent.StorageUiKey.Key).ToList()) { - if (_admin.HasAdminFlag(actor, AdminFlags.Admin)) - continue; - - // And closes it unless they're an admin - _ui.CloseUi(uid, StorageComponent.StorageUiKey.Key, actor); + if (!CanInteract(actor, (uid, component))) + _ui.CloseUi(uid, StorageComponent.StorageUiKey.Key, actor); } } @@ -1457,7 +1450,7 @@ private void HandleToggleSlotUI(ICommonSession? session, string slot) if (!_ui.IsUiOpen(storageEnt.Value, StorageComponent.StorageUiKey.Key, playerEnt)) { - OpenStorageUI(storageEnt.Value, playerEnt); + OpenStorageUI(storageEnt.Value, playerEnt, silent: false); } else { @@ -1472,6 +1465,20 @@ protected void ClearCantFillReasons() #endif } + private bool CanInteract(EntityUid user, Entity storage, bool canInteract = true, bool silent = true) + { + if (HasComp(user)) + return true; + + if (!canInteract) + return false; + + var ev = new StorageInteractAttemptEvent(silent); + RaiseLocalEvent(storage, ref ev); + + return !ev.Cancelled; + } + /// /// Plays a clientside pickup animation for the specified uid. /// @@ -1488,5 +1495,9 @@ protected sealed class StorageComponentState : ComponentState public List Grid = new(); public ProtoId? MaxItemSize; + + public EntityWhitelist? Whitelist; + + public EntityWhitelist? Blacklist; } } diff --git a/Content.Shared/Storage/StorageComponent.cs b/Content.Shared/Storage/StorageComponent.cs index ef682dd4f94..2860f8dacfe 100644 --- a/Content.Shared/Storage/StorageComponent.cs +++ b/Content.Shared/Storage/StorageComponent.cs @@ -5,7 +5,6 @@ using Robust.Shared.Containers; using Robust.Shared.GameStates; using Robust.Shared.Map; -using Robust.Shared.Player; using Robust.Shared.Prototypes; using Robust.Shared.Serialization; @@ -228,6 +227,9 @@ public AnimateInsertingEntitiesEvent(NetEntity storage, List storedEn } } + [ByRefEvent] + public record struct StorageInteractAttemptEvent(bool Silent, bool Cancelled = false); + [NetSerializable] [Serializable] public enum StorageVisuals : byte diff --git a/Content.Shared/Strip/SharedStrippableSystem.cs b/Content.Shared/Strip/SharedStrippableSystem.cs index 59b24ec943e..075cf81a4cb 100644 --- a/Content.Shared/Strip/SharedStrippableSystem.cs +++ b/Content.Shared/Strip/SharedStrippableSystem.cs @@ -1,17 +1,31 @@ +using Content.Shared.CombatMode; using Content.Shared.DragDrop; using Content.Shared.Hands.Components; +using Content.Shared.Interaction; using Content.Shared.Strip.Components; namespace Content.Shared.Strip; public abstract class SharedStrippableSystem : EntitySystem { + [Dependency] private readonly SharedUserInterfaceSystem _ui = default!; + public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnCanDropOn); SubscribeLocalEvent(OnCanDrop); SubscribeLocalEvent(OnDragDrop); + SubscribeLocalEvent(OnActivateInWorld); + } + + private void OnActivateInWorld(EntityUid uid, StrippableComponent component, ActivateInWorldEvent args) + { + if (args.Handled || args.Target == args.User) + return; + + if (TryOpenStrippingUi(args.User, (uid, component))) + args.Handled = true; } public (TimeSpan Time, bool Stealth) GetStripTimeModifiers(EntityUid user, EntityUid target, TimeSpan initialTime) @@ -29,13 +43,20 @@ private void OnDragDrop(EntityUid uid, StrippableComponent component, ref DragDr if (args.Handled || args.Target != args.User) return; - StartOpeningStripper(args.User, (uid, component)); - args.Handled = true; + if (TryOpenStrippingUi(args.User, (uid, component))) + args.Handled = true; } - public virtual void StartOpeningStripper(EntityUid user, Entity component, bool openInCombat = false) + public bool TryOpenStrippingUi(EntityUid user, Entity target, bool openInCombat = false) { + if (!openInCombat && TryComp(user, out var mode) && mode.IsInCombatMode) + return false; + + if (!HasComp(user)) + return false; + _ui.OpenUi(target.Owner, StrippingUiKey.Key, user); + return true; } private void OnCanDropOn(EntityUid uid, StrippingComponent component, ref CanDropTargetEvent args) diff --git a/Content.Shared/UserInterface/ActivatableUIComponent.cs b/Content.Shared/UserInterface/ActivatableUIComponent.cs index 3f83816b7de..93f05acac05 100644 --- a/Content.Shared/UserInterface/ActivatableUIComponent.cs +++ b/Content.Shared/UserInterface/ActivatableUIComponent.cs @@ -57,7 +57,7 @@ public sealed partial class ActivatableUIComponent : Component /// [ViewVariables(VVAccess.ReadWrite)] [DataField] - public bool AllowSpectator = true; + public bool BlockSpectators; /// /// Whether the item must be in the user's currently selected/active hand. diff --git a/Content.Shared/UserInterface/ActivatableUISystem.cs b/Content.Shared/UserInterface/ActivatableUISystem.cs index a6d27ac5459..c1822c4ee33 100644 --- a/Content.Shared/UserInterface/ActivatableUISystem.cs +++ b/Content.Shared/UserInterface/ActivatableUISystem.cs @@ -8,7 +8,7 @@ using Content.Shared.Interaction.Events; using Content.Shared.Popups; using Content.Shared.Verbs; -using Robust.Shared.Containers; +using Robust.Shared.Utility; namespace Content.Shared.UserInterface; @@ -19,15 +19,12 @@ public sealed partial class ActivatableUISystem : EntitySystem [Dependency] private readonly SharedUserInterfaceSystem _uiSystem = default!; [Dependency] private readonly SharedPopupSystem _popupSystem = default!; [Dependency] private readonly SharedHandsSystem _hands = default!; - [Dependency] private readonly SharedContainerSystem _container = default!; - [Dependency] private readonly SharedInteractionSystem _interaction = default!; - - private readonly List _toClose = new(); public override void Initialize() { base.Initialize(); + SubscribeLocalEvent(OnStartup); SubscribeLocalEvent(OnUseInHand); SubscribeLocalEvent(OnActivate); SubscribeLocalEvent(OnInteractUsing); @@ -37,28 +34,24 @@ public override void Initialize() SubscribeLocalEvent>(GetActivationVerb); SubscribeLocalEvent>(GetVerb); - // TODO ActivatableUI - // Add UI-user component, and listen for user container changes. - // I.e., should lose a computer UI if a player gets shut into a locker. - SubscribeLocalEvent(OnGotInserted); - SubscribeLocalEvent(OnGotRemoved); - - SubscribeLocalEvent(OnBoundInterfaceInteractAttempt); SubscribeLocalEvent(OnActionPerform); InitializePower(); } - private void OnBoundInterfaceInteractAttempt(BoundUserInterfaceMessageAttempt ev) + private void OnStartup(Entity ent, ref ComponentStartup args) { - if (!TryComp(ev.Target, out ActivatableUIComponent? comp)) - return; - - if (!comp.RequireHands) + if (ent.Comp.Key == null) + { + Log.Error($"Missing UI Key for entity: {ToPrettyString(ent)}"); return; + } - if (!TryComp(ev.Actor, out HandsComponent? hands) || hands.Hands.Count == 0) - ev.Cancel(); + // TODO BUI + // set interaction range to zero to avoid constant range checks. + // + // if (ent.Comp.InHandsOnly && _uiSystem.TryGetInterfaceData(ent.Owner, ent.Comp.Key, out var data)) + // data.InteractionRange = 0; } private void OnActionPerform(EntityUid uid, UserInterfaceComponent component, OpenUiActionEvent args) @@ -77,9 +70,10 @@ private void GetActivationVerb(EntityUid uid, ActivatableUIComponent component, args.Verbs.Add(new ActivationVerb { - // TODO VERBS add "open UI" icon Act = () => InteractUI(args.User, uid, component), - Text = Loc.GetString(component.VerbText) + Text = Loc.GetString(component.VerbText), + // TODO VERB ICON find a better icon + Icon = new SpriteSpecifier.Texture(new ResPath("/Textures/Interface/VerbIcons/settings.svg.192dpi.png")), }); } @@ -90,9 +84,10 @@ private void GetVerb(EntityUid uid, ActivatableUIComponent component, GetVerbsEv args.Verbs.Add(new Verb { - // TODO VERBS add "open UI" icon Act = () => InteractUI(args.User, uid, component), - Text = Loc.GetString(component.VerbText) + Text = Loc.GetString(component.VerbText), + // TODO VERB ICON find a better icon + Icon = new SpriteSpecifier.Texture(new ResPath("/Textures/Interface/VerbIcons/settings.svg.192dpi.png")), }); } @@ -119,7 +114,7 @@ private bool ShouldAddVerb(EntityUid uid, ActivatableUIComponent component, G } } - return args.CanInteract || component.AllowSpectator && HasComp(args.User); + return args.CanInteract || HasComp(args.User) && !component.BlockSpectators; } private void OnUseInHand(EntityUid uid, ActivatableUIComponent component, UseInHandEvent args) @@ -191,7 +186,7 @@ private bool InteractUI(EntityUid user, EntityUid uiEntity, ActivatableUICompone return true; } - if (!_blockerSystem.CanInteract(user, uiEntity) && (!aui.AllowSpectator || !HasComp(user))) + if (!_blockerSystem.CanInteract(user, uiEntity) && (!HasComp(user) || aui.BlockSpectators)) return false; if (aui.RequireHands) @@ -286,47 +281,4 @@ private void OnHandUnequipped(Entity ent, ref GotUnequip if (ent.Comp.RequireHands && ent.Comp.InHandsOnly) CloseAll(ent, ent); } - - private void OnGotInserted(Entity ent, ref EntGotInsertedIntoContainerMessage args) - { - CheckAccess((ent, ent)); - } - - private void OnGotRemoved(Entity ent, ref EntGotRemovedFromContainerMessage args) - { - CheckAccess((ent, ent)); - } - - public void CheckAccess(Entity ent) - { - if (!Resolve(ent, ref ent.Comp)) - return; - - if (ent.Comp.Key == null) - { - Log.Error($"Encountered null key in activatable ui on entity {ToPrettyString(ent)}"); - return; - } - - foreach (var user in _uiSystem.GetActors(ent.Owner, ent.Comp.Key)) - { - if (!_container.IsInSameOrParentContainer(user, ent) - && !_interaction.CanAccessViaStorage(user, ent)) - { - _toClose.Add(user); - continue; - - } - - if (!_interaction.InRangeUnobstructed(user, ent)) - _toClose.Add(user); - } - - foreach (var user in _toClose) - { - _uiSystem.CloseUi(ent.Owner, ent.Comp.Key, user); - } - - _toClose.Clear(); - } } diff --git a/Content.Shared/Verbs/SharedVerbSystem.cs b/Content.Shared/Verbs/SharedVerbSystem.cs index 60714aea8f3..e78fe98f4c3 100644 --- a/Content.Shared/Verbs/SharedVerbSystem.cs +++ b/Content.Shared/Verbs/SharedVerbSystem.cs @@ -72,19 +72,7 @@ public SortedSet GetLocalVerbs(EntityUid target, EntityUid user, List @@ -343,23 +333,32 @@ private bool AttemptAttack(EntityUid user, EntityUid weaponUid, MeleeWeaponCompo if (!CombatMode.IsInCombatMode(user)) return false; + EntityUid? target = null; switch (attack) { case LightAttackEvent light: - var lightTarget = GetEntity(light.Target); + if (light.Target != null && !TryGetEntity(light.Target, out target)) + { + // Target was lightly attacked & deleted. + return false; + } - if (!Blocker.CanAttack(user, lightTarget, (weaponUid, weapon))) + if (!Blocker.CanAttack(user, target, (weaponUid, weapon))) return false; // Can't self-attack if you're the weapon - if (weaponUid == lightTarget) + if (weaponUid == target) return false; break; case DisarmAttackEvent disarm: - var disarmTarget = GetEntity(disarm.Target); + if (disarm.Target != null && !TryGetEntity(disarm.Target, out target)) + { + // Target was lightly attacked & deleted. + return false; + } - if (!Blocker.CanAttack(user, disarmTarget, (weaponUid, weapon), true)) + if (!Blocker.CanAttack(user, target, (weaponUid, weapon), true)) return false; break; default: diff --git a/Content.Shared/Weapons/Reflect/ReflectSystem.cs b/Content.Shared/Weapons/Reflect/ReflectSystem.cs index 36dbedb4cb1..03ad97edff2 100644 --- a/Content.Shared/Weapons/Reflect/ReflectSystem.cs +++ b/Content.Shared/Weapons/Reflect/ReflectSystem.cs @@ -42,6 +42,9 @@ public sealed class ReflectSystem : EntitySystem [Dependency] private readonly StandingStateSystem _standing = default!; [Dependency] private readonly AlertsSystem _alerts = default!; + [ValidatePrototypeId] + private const string DeflectingAlert = "Deflecting"; + public override void Initialize() { base.Initialize(); @@ -296,11 +299,11 @@ private void RefreshReflectUser(EntityUid user) private void EnableAlert(EntityUid alertee) { - _alerts.ShowAlert(alertee, AlertType.Deflecting); + _alerts.ShowAlert(alertee, DeflectingAlert); } private void DisableAlert(EntityUid alertee) { - _alerts.ClearAlert(alertee, AlertType.Deflecting); + _alerts.ClearAlert(alertee, DeflectingAlert); } } diff --git a/Content.Shared/Wieldable/WieldableSystem.cs b/Content.Shared/Wieldable/WieldableSystem.cs index cee6c65fa11..c09044f84b4 100644 --- a/Content.Shared/Wieldable/WieldableSystem.cs +++ b/Content.Shared/Wieldable/WieldableSystem.cs @@ -41,6 +41,7 @@ public override void Initialize() SubscribeLocalEvent(OnItemLeaveHand); SubscribeLocalEvent(OnVirtualItemDeleted); SubscribeLocalEvent>(AddToggleWieldVerb); + SubscribeLocalEvent(OnDeselectWieldable); SubscribeLocalEvent(OnMeleeAttempt); SubscribeLocalEvent(OnShootAttempt); @@ -91,6 +92,14 @@ private void OnGunWielded(EntityUid uid, GunWieldBonusComponent component, ref I _gun.RefreshModifiers(uid); } + private void OnDeselectWieldable(EntityUid uid, WieldableComponent component, HandDeselectedEvent args) + { + if (!component.Wielded) + return; + + TryUnwield(uid, component, args.User); + } + private void OnGunRefreshModifiers(Entity bonus, ref GunRefreshModifiersEvent args) { if (TryComp(bonus, out WieldableComponent? wield) && diff --git a/Content.Server/Wires/ActivatableUIRequiresPanelComponent.cs b/Content.Shared/Wires/ActivatableUIRequiresPanelComponent.cs similarity index 71% rename from Content.Server/Wires/ActivatableUIRequiresPanelComponent.cs rename to Content.Shared/Wires/ActivatableUIRequiresPanelComponent.cs index f92df3d3d59..6e8fff6e49c 100644 --- a/Content.Server/Wires/ActivatableUIRequiresPanelComponent.cs +++ b/Content.Shared/Wires/ActivatableUIRequiresPanelComponent.cs @@ -1,15 +1,17 @@ -namespace Content.Server.Wires; +using Robust.Shared.GameStates; + +namespace Content.Shared.Wires; /// /// This is used for activatable UIs that require the entity to have a panel in a certain state. /// -[RegisterComponent] +[RegisterComponent, NetworkedComponent, Access(typeof(SharedWiresSystem))] public sealed partial class ActivatableUIRequiresPanelComponent : Component { /// /// TRUE: the panel must be open to access the UI. /// FALSE: the panel must be closed to access the UI. /// - [DataField("requireOpen"), ViewVariables(VVAccess.ReadWrite)] + [DataField] public bool RequireOpen = true; } diff --git a/Content.Shared/Wires/SharedWiresSystem.cs b/Content.Shared/Wires/SharedWiresSystem.cs index b4b0768e0f7..d84766a5fc6 100644 --- a/Content.Shared/Wires/SharedWiresSystem.cs +++ b/Content.Shared/Wires/SharedWiresSystem.cs @@ -3,6 +3,7 @@ using Content.Shared.Examine; using Content.Shared.Interaction; using Content.Shared.Tools.Systems; +using Content.Shared.UserInterface; using Robust.Shared.Audio.Systems; namespace Content.Shared.Wires; @@ -10,6 +11,7 @@ namespace Content.Shared.Wires; public abstract class SharedWiresSystem : EntitySystem { [Dependency] protected readonly ISharedAdminLogManager AdminLogger = default!; + [Dependency] private readonly ActivatableUISystem _activatableUI = default!; [Dependency] protected readonly SharedAppearanceSystem Appearance = default!; [Dependency] protected readonly SharedAudioSystem Audio = default!; [Dependency] protected readonly SharedToolSystem Tool = default!; @@ -21,6 +23,9 @@ public override void Initialize() SubscribeLocalEvent(OnPanelDoAfter); SubscribeLocalEvent(OnInteractUsing); SubscribeLocalEvent(OnExamine); + + SubscribeLocalEvent(OnAttemptOpenActivatableUI); + SubscribeLocalEvent(OnActivatableUIPanelChanged); } private void OnPanelDoAfter(EntityUid uid, WiresPanelComponent panel, WirePanelDoAfterEvent args) @@ -132,4 +137,21 @@ public bool IsPanelOpen(Entity entity) return entity.Comp.Open; } + + private void OnAttemptOpenActivatableUI(EntityUid uid, ActivatableUIRequiresPanelComponent component, ActivatableUIOpenAttemptEvent args) + { + if (args.Cancelled || !TryComp(uid, out var wires)) + return; + + if (component.RequireOpen != wires.Open) + args.Cancel(); + } + + private void OnActivatableUIPanelChanged(EntityUid uid, ActivatableUIRequiresPanelComponent component, ref PanelChangedEvent args) + { + if (args.Open == component.RequireOpen) + return; + + _activatableUI.CloseAll(uid); + } } diff --git a/Content.Server/Zombies/PendingZombieComponent.cs b/Content.Shared/Zombies/PendingZombieComponent.cs similarity index 94% rename from Content.Server/Zombies/PendingZombieComponent.cs rename to Content.Shared/Zombies/PendingZombieComponent.cs index 811d3f96440..0fb61c84df1 100644 --- a/Content.Server/Zombies/PendingZombieComponent.cs +++ b/Content.Shared/Zombies/PendingZombieComponent.cs @@ -1,12 +1,13 @@ using Content.Shared.Damage; +using Robust.Shared.GameStates; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; -namespace Content.Server.Zombies; +namespace Content.Shared.Zombies; /// /// Temporary because diseases suck. /// -[RegisterComponent] +[RegisterComponent, NetworkedComponent] public sealed partial class PendingZombieComponent : Component { /// diff --git a/Content.Tests/Shared/Alert/AlertManagerTests.cs b/Content.Tests/Shared/Alert/AlertManagerTests.cs index 2d5f6af5a7f..c57df63d5b7 100644 --- a/Content.Tests/Shared/Alert/AlertManagerTests.cs +++ b/Content.Tests/Shared/Alert/AlertManagerTests.cs @@ -1,6 +1,5 @@ using System.IO; using Content.Client.Alerts; -using Content.Server.Alert; using Content.Shared.Alert; using NUnit.Framework; using Robust.Shared.GameObjects; @@ -45,15 +44,15 @@ public void TestAlertManager() prototypeManager.Initialize(); prototypeManager.LoadFromStream(new StringReader(PROTOTYPES)); - Assert.That(alertsSystem.TryGet(AlertType.LowPressure, out var lowPressure)); - Assert.That(lowPressure.Icons[0], Is.EqualTo(new SpriteSpecifier.Texture(new ("/Textures/Interface/Alerts/Pressure/lowpressure.png")))); - Assert.That(alertsSystem.TryGet(AlertType.HighPressure, out var highPressure)); - Assert.That(highPressure.Icons[0], Is.EqualTo(new SpriteSpecifier.Texture(new ("/Textures/Interface/Alerts/Pressure/highpressure.png")))); + Assert.That(alertsSystem.TryGet("LowPressure", out var lowPressure)); + Assert.That(lowPressure!.Icons[0], Is.EqualTo(new SpriteSpecifier.Texture(new ("/Textures/Interface/Alerts/Pressure/lowpressure.png")))); + Assert.That(alertsSystem.TryGet("HighPressure", out var highPressure)); + Assert.That(highPressure!.Icons[0], Is.EqualTo(new SpriteSpecifier.Texture(new ("/Textures/Interface/Alerts/Pressure/highpressure.png")))); - Assert.That(alertsSystem.TryGet(AlertType.LowPressure, out lowPressure)); - Assert.That(lowPressure.Icons[0], Is.EqualTo(new SpriteSpecifier.Texture(new ("/Textures/Interface/Alerts/Pressure/lowpressure.png")))); - Assert.That(alertsSystem.TryGet(AlertType.HighPressure, out highPressure)); - Assert.That(highPressure.Icons[0], Is.EqualTo(new SpriteSpecifier.Texture(new ("/Textures/Interface/Alerts/Pressure/highpressure.png")))); + Assert.That(alertsSystem.TryGet("LowPressure", out lowPressure)); + Assert.That(lowPressure!.Icons[0], Is.EqualTo(new SpriteSpecifier.Texture(new ("/Textures/Interface/Alerts/Pressure/lowpressure.png")))); + Assert.That(alertsSystem.TryGet("HighPressure", out highPressure)); + Assert.That(highPressure!.Icons[0], Is.EqualTo(new SpriteSpecifier.Texture(new ("/Textures/Interface/Alerts/Pressure/highpressure.png")))); } } } diff --git a/Content.Tests/Shared/Alert/AlertOrderPrototypeTests.cs b/Content.Tests/Shared/Alert/AlertOrderPrototypeTests.cs index 56f76d46a92..efcd59acbbb 100644 --- a/Content.Tests/Shared/Alert/AlertOrderPrototypeTests.cs +++ b/Content.Tests/Shared/Alert/AlertOrderPrototypeTests.cs @@ -85,24 +85,24 @@ public void TestAlertOrderPrototype() var alerts = prototypeManager.EnumeratePrototypes(); // ensure they sort according to our expected criteria - var expectedOrder = new List(); - expectedOrder.Add(AlertType.Handcuffed); - expectedOrder.Add(AlertType.Ensnared); - expectedOrder.Add(AlertType.HighPressure); + var expectedOrder = new List(); + expectedOrder.Add("Handcuffed"); + expectedOrder.Add("Ensnared"); + expectedOrder.Add("HighPressure"); // stuff with only category + same category ordered by enum value - expectedOrder.Add(AlertType.Peckish); - expectedOrder.Add(AlertType.Hot); - expectedOrder.Add(AlertType.Stun); - expectedOrder.Add(AlertType.LowPressure); - expectedOrder.Add(AlertType.Cold); - // stuff at end of list ordered by enum value - expectedOrder.Add(AlertType.Weightless); - expectedOrder.Add(AlertType.PilotingShuttle); + expectedOrder.Add("Peckish"); + expectedOrder.Add("Hot"); + expectedOrder.Add("Stun"); + expectedOrder.Add("LowPressure"); + expectedOrder.Add("Cold"); + // stuff at end of list ordered by ID + expectedOrder.Add("PilotingShuttle"); + expectedOrder.Add("Weightless"); var actual = alerts.ToList(); actual.Sort(alertOrder); - Assert.That(actual.Select(a => a.AlertType).ToList(), Is.EqualTo(expectedOrder)); + Assert.That(actual.Select(a => a.ID).ToList(), Is.EqualTo(expectedOrder)); } } } diff --git a/Content.Tests/Shared/Alert/AlertPrototypeTests.cs b/Content.Tests/Shared/Alert/AlertPrototypeTests.cs index d95acb8aff4..43ae98b452b 100644 --- a/Content.Tests/Shared/Alert/AlertPrototypeTests.cs +++ b/Content.Tests/Shared/Alert/AlertPrototypeTests.cs @@ -39,9 +39,9 @@ public void OneTimeSetUp() [Test] public void TestAlertKey() { - Assert.That(new AlertKey(AlertType.HumanHealth, null), Is.Not.EqualTo(AlertKey.ForCategory(AlertCategory.Health))); - Assert.That((new AlertKey(null, AlertCategory.Health)), Is.EqualTo(AlertKey.ForCategory(AlertCategory.Health))); - Assert.That((new AlertKey(AlertType.Buckled, AlertCategory.Health)), Is.EqualTo(AlertKey.ForCategory(AlertCategory.Health))); + Assert.That(new AlertKey("HumanHealth", null), Is.Not.EqualTo(AlertKey.ForCategory("Health"))); + Assert.That((new AlertKey(null, "Health")), Is.EqualTo(AlertKey.ForCategory("Health"))); + Assert.That((new AlertKey("Buckled", "Health")), Is.EqualTo(AlertKey.ForCategory("Health"))); } [TestCase(0, "/Textures/Interface/Alerts/Human/human.rsi/human0.png")] diff --git a/Content.Tests/Shared/Alert/ServerAlertsComponentTests.cs b/Content.Tests/Shared/Alert/ServerAlertsComponentTests.cs index 47ae3ef74a6..bcc32e13dee 100644 --- a/Content.Tests/Shared/Alert/ServerAlertsComponentTests.cs +++ b/Content.Tests/Shared/Alert/ServerAlertsComponentTests.cs @@ -15,6 +15,9 @@ namespace Content.Tests.Shared.Alert public sealed class ServerAlertsComponentTests : ContentUnitTest { const string PROTOTYPES = @" +- type: alertCategory + id: Pressure + - type: alert id: LowPressure category: Pressure @@ -49,10 +52,10 @@ public void ShowAlerts() var alertsComponent = new AlertsComponent(); alertsComponent = IoCManager.InjectDependencies(alertsComponent); - Assert.That(entManager.System().TryGet(AlertType.LowPressure, out var lowpressure)); - Assert.That(entManager.System().TryGet(AlertType.HighPressure, out var highpressure)); + Assert.That(entManager.System().TryGet("LowPressure", out var lowpressure)); + Assert.That(entManager.System().TryGet("HighPressure", out var highpressure)); - entManager.System().ShowAlert(alertsComponent.Owner, AlertType.LowPressure, null, null); + entManager.System().ShowAlert(alertsComponent.Owner, "LowPressure"); var getty = new ComponentGetState(); entManager.EventBus.RaiseComponentEvent(alertsComponent, getty); @@ -60,17 +63,17 @@ public void ShowAlerts() var alertState = (AlertsComponent.AlertsComponent_AutoState) getty.State!; Assert.That(alertState, Is.Not.Null); Assert.That(alertState.Alerts.Count, Is.EqualTo(1)); - Assert.That(alertState.Alerts.ContainsKey(lowpressure.AlertKey)); + Assert.That(alertState.Alerts.ContainsKey(lowpressure!.AlertKey)); - entManager.System().ShowAlert(alertsComponent.Owner, AlertType.HighPressure, null, null); + entManager.System().ShowAlert(alertsComponent.Owner, "HighPressure"); // Lazy entManager.EventBus.RaiseComponentEvent(alertsComponent, getty); alertState = (AlertsComponent.AlertsComponent_AutoState) getty.State!; Assert.That(alertState.Alerts.Count, Is.EqualTo(1)); - Assert.That(alertState.Alerts.ContainsKey(highpressure.AlertKey)); + Assert.That(alertState.Alerts.ContainsKey(highpressure!.AlertKey)); - entManager.System().ClearAlertCategory(alertsComponent.Owner, AlertCategory.Pressure); + entManager.System().ClearAlertCategory(alertsComponent.Owner, "Pressure"); entManager.EventBus.RaiseComponentEvent(alertsComponent, getty); alertState = (AlertsComponent.AlertsComponent_AutoState) getty.State!; diff --git a/Content.Tests/Shared/LocalizedDatasetPrototypeTest.cs b/Content.Tests/Shared/LocalizedDatasetPrototypeTest.cs new file mode 100644 index 00000000000..b07b18efa0a --- /dev/null +++ b/Content.Tests/Shared/LocalizedDatasetPrototypeTest.cs @@ -0,0 +1,59 @@ +using System; +using Content.Shared.Dataset; +using NUnit.Framework; +using Robust.Shared.Collections; +using Robust.Shared.IoC; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.Manager; + +namespace Content.Tests.Shared; + +[TestFixture] +[TestOf(typeof(LocalizedDatasetPrototype))] +public sealed class LocalizedDatasetPrototypeTest : ContentUnitTest +{ + private IPrototypeManager _prototypeManager; + + [OneTimeSetUp] + public void OneTimeSetup() + { + IoCManager.Resolve().Initialize(); + _prototypeManager = IoCManager.Resolve(); + _prototypeManager.Initialize(); + _prototypeManager.LoadString(TestPrototypes); + _prototypeManager.ResolveResults(); + } + + private const string TestPrototypes = @" +- type: localizedDataset + id: Test + values: + prefix: test-dataset- + count: 4 +"; + + [Test] + public void LocalizedDatasetTest() + { + var testPrototype = _prototypeManager.Index("Test"); + var values = new ValueList(); + foreach (var value in testPrototype.Values) + { + values.Add(value); + } + + // Make sure we get the right number of values + Assert.That(values, Has.Count.EqualTo(4)); + + // Make sure indexing works as expected + Assert.That(testPrototype.Values[0], Is.EqualTo("test-dataset-1")); + Assert.That(testPrototype.Values[1], Is.EqualTo("test-dataset-2")); + Assert.That(testPrototype.Values[2], Is.EqualTo("test-dataset-3")); + Assert.That(testPrototype.Values[3], Is.EqualTo("test-dataset-4")); + Assert.Throws(() => { var x = testPrototype.Values[4]; }); + Assert.Throws(() => { var x = testPrototype.Values[-1]; }); + + // Make sure that the enumerator gets all of the values + Assert.That(testPrototype.Values[^1], Is.EqualTo("test-dataset-4")); + } +} diff --git a/Resources/Audio/Effects/Gasp/attributions.yml b/Resources/Audio/Effects/Gasp/attributions.yml new file mode 100644 index 00000000000..fe8f817c5a3 --- /dev/null +++ b/Resources/Audio/Effects/Gasp/attributions.yml @@ -0,0 +1,26 @@ +- files: + - deathgasp_1.ogg + - deathgasp_2.ogg + - female_deathgasp_1.ogg + - female_deathgasp_2.ogg + - female_deathgasp_3.ogg + - female_deathgasp_4.ogg + - female_deathgasp_5.ogg + - male_deathgasp_1.ogg + - male_deathgasp_2.ogg + - male_deathgasp_3.ogg + - male_deathgasp_4.ogg + - male_deathgasp_5.ogg + license: "CC-BY-SA-3.0" + copyright: "Taken from Paradise at https://github.com/ParadiseSS13/Paradise/commit/4397f13c72998aa7e6ce192215c9f77b9d62eee2" + source: "https://github.com/ParadiseSS13/Paradise/tree/4397f13c72998aa7e6ce192215c9f77b9d62eee2/sound/goonstation/voice" + +- files: + - gasp_female1.ogg + - gasp_female2.ogg + - gasp_female3.ogg + - gasp_male1.ogg + - gasp_male2.ogg + license: "CC-BY-SA-3.0" + copyright: "Taken from tgstation at https://github.com/tgstation/tgstation/commit/f7a49c4068f1277e6857baf0892d355f1c055974" + source: "https://github.com/tgstation/tgstation/tree/f7a49c4068f1277e6857baf0892d355f1c055974/sound/voice/human" diff --git a/Resources/Audio/Effects/Gasp/deathgasp_1.ogg b/Resources/Audio/Effects/Gasp/deathgasp_1.ogg new file mode 100644 index 00000000000..d6e4f8a9e75 Binary files /dev/null and b/Resources/Audio/Effects/Gasp/deathgasp_1.ogg differ diff --git a/Resources/Audio/Effects/Gasp/deathgasp_2.ogg b/Resources/Audio/Effects/Gasp/deathgasp_2.ogg new file mode 100644 index 00000000000..77959ff8a84 Binary files /dev/null and b/Resources/Audio/Effects/Gasp/deathgasp_2.ogg differ diff --git a/Resources/Audio/Effects/Gasp/female_deathgasp_1.ogg b/Resources/Audio/Effects/Gasp/female_deathgasp_1.ogg new file mode 100644 index 00000000000..2139a26695c Binary files /dev/null and b/Resources/Audio/Effects/Gasp/female_deathgasp_1.ogg differ diff --git a/Resources/Audio/Effects/Gasp/female_deathgasp_2.ogg b/Resources/Audio/Effects/Gasp/female_deathgasp_2.ogg new file mode 100644 index 00000000000..713721d723d Binary files /dev/null and b/Resources/Audio/Effects/Gasp/female_deathgasp_2.ogg differ diff --git a/Resources/Audio/Effects/Gasp/female_deathgasp_3.ogg b/Resources/Audio/Effects/Gasp/female_deathgasp_3.ogg new file mode 100644 index 00000000000..eaf356db4b4 Binary files /dev/null and b/Resources/Audio/Effects/Gasp/female_deathgasp_3.ogg differ diff --git a/Resources/Audio/Effects/Gasp/female_deathgasp_4.ogg b/Resources/Audio/Effects/Gasp/female_deathgasp_4.ogg new file mode 100644 index 00000000000..b3c9a8045b5 Binary files /dev/null and b/Resources/Audio/Effects/Gasp/female_deathgasp_4.ogg differ diff --git a/Resources/Audio/Effects/Gasp/female_deathgasp_5.ogg b/Resources/Audio/Effects/Gasp/female_deathgasp_5.ogg new file mode 100644 index 00000000000..b9b45c92ad9 Binary files /dev/null and b/Resources/Audio/Effects/Gasp/female_deathgasp_5.ogg differ diff --git a/Resources/Audio/Effects/Gasp/gasp_female1.ogg b/Resources/Audio/Effects/Gasp/gasp_female1.ogg new file mode 100644 index 00000000000..ec9da07eba2 Binary files /dev/null and b/Resources/Audio/Effects/Gasp/gasp_female1.ogg differ diff --git a/Resources/Audio/Effects/Gasp/gasp_female2.ogg b/Resources/Audio/Effects/Gasp/gasp_female2.ogg new file mode 100644 index 00000000000..2db7d5109c9 Binary files /dev/null and b/Resources/Audio/Effects/Gasp/gasp_female2.ogg differ diff --git a/Resources/Audio/Effects/Gasp/gasp_female3.ogg b/Resources/Audio/Effects/Gasp/gasp_female3.ogg new file mode 100644 index 00000000000..af94ccba8fc Binary files /dev/null and b/Resources/Audio/Effects/Gasp/gasp_female3.ogg differ diff --git a/Resources/Audio/Effects/Gasp/gasp_male1.ogg b/Resources/Audio/Effects/Gasp/gasp_male1.ogg new file mode 100644 index 00000000000..657a2739cdf Binary files /dev/null and b/Resources/Audio/Effects/Gasp/gasp_male1.ogg differ diff --git a/Resources/Audio/Effects/Gasp/gasp_male2.ogg b/Resources/Audio/Effects/Gasp/gasp_male2.ogg new file mode 100644 index 00000000000..88ac0b77f4d Binary files /dev/null and b/Resources/Audio/Effects/Gasp/gasp_male2.ogg differ diff --git a/Resources/Audio/Effects/Gasp/male_deathgasp_1.ogg b/Resources/Audio/Effects/Gasp/male_deathgasp_1.ogg new file mode 100644 index 00000000000..341ac39fbc5 Binary files /dev/null and b/Resources/Audio/Effects/Gasp/male_deathgasp_1.ogg differ diff --git a/Resources/Audio/Effects/Gasp/male_deathgasp_2.ogg b/Resources/Audio/Effects/Gasp/male_deathgasp_2.ogg new file mode 100644 index 00000000000..15bab8b8486 Binary files /dev/null and b/Resources/Audio/Effects/Gasp/male_deathgasp_2.ogg differ diff --git a/Resources/Audio/Effects/Gasp/male_deathgasp_3.ogg b/Resources/Audio/Effects/Gasp/male_deathgasp_3.ogg new file mode 100644 index 00000000000..c5107366e3a Binary files /dev/null and b/Resources/Audio/Effects/Gasp/male_deathgasp_3.ogg differ diff --git a/Resources/Audio/Effects/Gasp/male_deathgasp_4.ogg b/Resources/Audio/Effects/Gasp/male_deathgasp_4.ogg new file mode 100644 index 00000000000..b306297917f Binary files /dev/null and b/Resources/Audio/Effects/Gasp/male_deathgasp_4.ogg differ diff --git a/Resources/Audio/Effects/Gasp/male_deathgasp_5.ogg b/Resources/Audio/Effects/Gasp/male_deathgasp_5.ogg new file mode 100644 index 00000000000..0f175b40884 Binary files /dev/null and b/Resources/Audio/Effects/Gasp/male_deathgasp_5.ogg differ diff --git a/Resources/Changelog/Admin.yml b/Resources/Changelog/Admin.yml index f0bb5671028..0c0c7aece81 100644 --- a/Resources/Changelog/Admin.yml +++ b/Resources/Changelog/Admin.yml @@ -235,5 +235,25 @@ Entries: id: 29 time: '2024-05-19T23:04:16.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/28107 +- author: Repo + changes: + - message: Added listgamerules command, lists all run game modes for the round. + type: Add + - message: Added admin anouncement for addgamerule + type: Add + - message: Gamemode now shows after starting round. + type: Fix + id: 30 + time: '2024-05-25T20:18:05.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28178 +- author: Repo + changes: + - message: Option to admin or play on observe for admins + type: Tweak + - message: de-admin on late join + type: Fix + id: 31 + time: '2024-05-28T18:00:42.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28319 Name: Admin Order: 1 diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 12da3a2a900..5dc65ddaf0e 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,228 +1,4 @@ Entries: -- author: TheShuEd - changes: - - message: Removed Hamlet, Smile and Pun Pun from Thief objectives - type: Remove - id: 6111 - time: '2024-03-07T23:53:36.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25921 -- author: MACMAN2003 - changes: - - message: Diagonal windows no longer space you when in a pressurized environment. - type: Fix - id: 6112 - time: '2024-03-08T07:50:34.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25926 -- author: mryikes - changes: - - message: New Nuke Detonation Song "Clearly Nuclear". - type: Add - id: 6113 - time: '2024-03-09T01:44:54.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25765 -- author: Plykiya - changes: - - message: Pre-filled syringes start in inject mode now. - type: Tweak - id: 6114 - time: '2024-03-09T10:19:03.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25881 -- author: EmoGarbage404 - changes: - - message: Added a new "colorblind friendly" toggle in the accessibility menu. This - allows you to toggle between a standard and colorblind-friendly palette for - things like progress bars and the medical HUD. - type: Add - - message: The medical HUD is now bright, even in low light levels. - type: Tweak - id: 6115 - time: '2024-03-09T11:43:20.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25318 -- author: metalgearsloth - changes: - - message: Fix NPC mouse movement. - type: Fix - id: 6116 - time: '2024-03-10T15:41:42.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25965 -- author: DoutorWhite - changes: - - message: Prevents rendering from crashing in certain scenarios - type: Fix - id: 6117 - time: '2024-03-10T17:07:24.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25960 -- author: nikthechampiongr - changes: - - message: Shields will no longer absorb asphyxiation damage, or any other damage - they themselves can't take. - type: Fix - id: 6118 - time: '2024-03-11T01:55:19.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25972 -- author: metalgearsloth - changes: - - message: Remove the buttons for generated debris from shuttle maps. - type: Tweak - id: 6119 - time: '2024-03-11T02:11:46.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25897 -- author: Errant - changes: - - message: Species info is now available in the Guidebook and in the character editor. - type: Add - id: 6120 - time: '2024-03-11T03:01:32.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25844 -- author: Dygon - changes: - - message: 'The following criminal record statuses have been added: Suspect, Discharged, - Paroled.' - type: Add - - message: Security huds now show an icon on entities that have a visible name linked - to a criminal record. - type: Add - id: 6121 - time: '2024-03-11T03:12:52.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25192 -- author: Lank - changes: - - message: The detective is no longer independent, and again works under Security. - type: Tweak - id: 6122 - time: '2024-03-11T03:33:08.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25986 -- author: pigeonpeas - changes: - - message: added new expedition ambience - type: Add - id: 6123 - time: '2024-03-11T06:56:01.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25983 -- author: Ilya246 - changes: - - message: The biomass reclaimer may now reclaim plants, and inserting smaller entities - into it is now faster. - type: Tweak - id: 6124 - time: '2024-03-11T21:59:21.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/23731 -- author: SlamBamActionman - changes: - - message: Moths eating lizard plushies will now start to Weh! - type: Tweak - id: 6125 - time: '2024-03-11T23:05:25.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26003 -- author: Ubaser - changes: - - message: Unpressurized areas now deal heat damage along with blunt. - type: Tweak - id: 6126 - time: '2024-03-12T02:38:40.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25770 -- author: nikthechampiongr - changes: - - message: Recyclers now leave logs when they gib people. - type: Add - - message: People sending a broadcast in the communications console now leave logs. - type: Add - id: 6127 - time: '2024-03-12T10:57:05.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26008 -- author: ShadowCommander - changes: - - message: Fixed arrivals shuttle not docking with the station when it was slowly - spinning. - type: Fix - id: 6128 - time: '2024-03-12T12:57:35.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26033 -- author: liltenhead - changes: - - message: Buffed the zombie virus to do purely poison damage, and more likely to - spread the infection per bite. - type: Tweak - id: 6129 - time: '2024-03-12T18:44:09.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25954 -- author: UnicornOnLSD - changes: - - message: brought back the classic crew cut as an alternative to the current one - ! - type: Add - id: 6130 - time: '2024-03-12T18:47:29.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25935 -- author: FungiFellow - changes: - - message: Added Improvised Shotgun Shell Recipe - type: Add - id: 6131 - time: '2024-03-12T23:52:32.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25545 -- author: NakataRin - changes: - - message: Skeletons can only spawn with 10 people on the server now. - type: Tweak - id: 6132 - time: '2024-03-13T01:00:15.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26050 -- author: SlamBamActionman - changes: - - message: Syndicate implanters can no longer be recycled. - type: Tweak - id: 6133 - time: '2024-03-13T02:02:36.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26047 -- author: Gyrandola - changes: - - message: Adding Sky Blue carpets to tables no longer results in red carpet ones. - type: Fix - id: 6134 - time: '2024-03-13T02:03:04.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26049 -- author: Gyrandola - changes: - - message: Clicking yourself with a knife no longer triggers a butchering popup - type: Fix - id: 6135 - time: '2024-03-13T03:52:20.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26051 -- author: maylokana - changes: - - message: Italicized whisper bubbles - type: Tweak - id: 6136 - time: '2024-03-13T08:03:32.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25602 -- author: Slava0135 - changes: - - message: Fixed pie bomb not detonating when eaten or sliced (remember to keep - hungry mice away from it)! - type: Fix - - message: Pie bomb now cannot be ejected or swapped (just hope there is no bomb - inside) - type: Tweak - id: 6137 - time: '2024-03-13T08:36:08.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25928 -- author: Cojoke-dot - changes: - - message: Senior uniforms have been added to the Uniform Printer, visit your local - hop today! - type: Add - id: 6138 - time: '2024-03-13T08:45:33.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25668 -- author: Plykiya - changes: - - message: Additional syringe doafter delay is now based on syringe contents rather - than transfer amount setting. - type: Tweak - id: 6139 - time: '2024-03-13T09:35:48.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25890 - author: SlamBamActionman changes: - message: Renamed Uplink categories and moved items to fit new category names. @@ -3870,3 +3646,222 @@ id: 6610 time: '2024-05-21T10:16:35.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/28160 +- author: TheShuEd + changes: + - message: Artifact portal lifespan reduced from 120 seconds to 1 second + type: Tweak + id: 6611 + time: '2024-05-22T07:52:58.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28200 +- author: nikthechampiongr + changes: + - message: Firelocks can now be pried by hand. + type: Tweak + - message: Firelocks will now not automatically close for 2 seconds after you pry + them open. + type: Tweak + - message: Firelocks are now properly predicted. + type: Fix + id: 6612 + time: '2024-05-22T11:16:20.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26582 +- author: blueDev2 + changes: + - message: Watermelon slices are now considered fruit + type: Fix + id: 6613 + time: '2024-05-23T20:27:45.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28226 +- author: ElectroJr + changes: + - message: Ghosts can once again open paper & other UIs + type: Fix + id: 6614 + time: '2024-05-24T05:03:03.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27999 +- author: nikthechampiongr + changes: + - message: Firelocks will no longer randomly pulse closing lights. + type: Fix + id: 6615 + time: '2024-05-24T14:44:42.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28227 +- author: ElectroJr + changes: + - message: Fixed modular grenade visuals getting stuck in an incorrect state. + type: Fix + id: 6616 + time: '2024-05-25T20:03:05.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28265 +- author: deltanedas + changes: + - message: Fixed ID Cards not updating the manifest when changed. + type: Fix + id: 6617 + time: '2024-05-25T20:08:16.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28237 +- author: TheShuEd + changes: + - message: 'Killer tomatoes got a small health and damage buff: 24 -> 35 hp and + 4->9 brute damage' + type: Tweak + - message: Killer tomatoes now die after 5 minutes of their existence + type: Tweak + - message: Killer tomatoes can now be profitably sold. + type: Add + id: 6618 + time: '2024-05-25T20:18:40.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28173 +- author: metalgearsloth + changes: + - message: Fix water shader getting stuck on sometimes. + type: Fix + id: 6619 + time: '2024-05-25T20:23:34.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28130 +- author: Errant + changes: + - message: Changing hands while wielding an item will now immediately unwield it. + type: Tweak + id: 6620 + time: '2024-05-26T01:17:01.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28161 +- author: ElectroJr + changes: + - message: Fixed being unable to interact with items via storage UIs + type: Fix + id: 6621 + time: '2024-05-26T02:11:37.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28291 +- author: EmoGarbage404 + changes: + - message: Properly fix magic mirrors + type: Fix + id: 6622 + time: '2024-05-26T04:46:41.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28282 +- author: deltanedas + changes: + - message: Fixed being picked for antag roles while in the lobby or not opted in. + type: Fix + id: 6623 + time: '2024-05-26T05:14:29.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28197 +- author: Dutch-VanDerLinde + changes: + - message: Fix hypodarts not injecting into people with outerclothing equipped. + type: Fix + id: 6624 + time: '2024-05-26T14:48:34.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28301 +- author: metalgearsloth + changes: + - message: Selectively revert pulling throwing for the short-term. + type: Tweak + id: 6625 + time: '2024-05-27T00:11:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28126 +- author: EmoGarbage404 + changes: + - message: Multiple pipes facing the same direction can no longer be placed on the + same tile. You can still have overlapping straight pipes or corners going in + opposite directions. + type: Fix + id: 6626 + time: '2024-05-27T22:37:27.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28308 +- author: Emisse + changes: + - message: Derotate Train temporarily + type: Tweak + id: 6627 + time: '2024-05-27T22:40:00.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28328 +- author: EmoGarbage404 + changes: + - message: Fixed not enough antags being selected for gamemodes. + type: Fix + id: 6628 + time: '2024-05-27T22:43:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28327 +- author: EmoGarbage404 + changes: + - message: Removed the fire-fighting remote. + type: Remove + id: 6629 + time: '2024-05-28T00:04:32.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28330 +- author: slarticodefast + changes: + - message: Corrected some cargo bounties. + type: Fix + id: 6630 + time: '2024-05-28T00:51:50.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28255 +- author: Repo + changes: + - message: NanoMed, wall vends will spawn items the correct direction. + type: Fix + id: 6631 + time: '2024-05-28T14:02:15.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28279 +- author: ShadowCommander + changes: + - message: Added pressure and temperature warnings to firelock examine text. + type: Add + id: 6632 + time: '2024-05-28T14:59:13.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28341 +- author: deltanedas + changes: + - message: Nukies will have ghost roles opened if not enough people can be picked. + type: Tweak + id: 6633 + time: '2024-05-28T15:35:08.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28316 +- author: WarMechanic + changes: + - message: Guns will now cycle when interacting with them in-hand after wielding. + type: Tweak + id: 6634 + time: '2024-05-28T18:17:33.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28002 +- author: lzk228 + changes: + - message: Gasp and deathgasp emotes now have a sound. + type: Tweak + id: 6635 + time: '2024-05-28T23:56:41.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27736 +- author: Cojoke-dot + changes: + - message: The syndicate Medical and Sabatour borgs now come with medical and diagnostics + HUDs respectively. + type: Tweak + id: 6636 + time: '2024-05-29T00:16:43.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27875 +- author: ShadowCommander + changes: + - message: Popups with the same message now stack together and append a x# to the + end. + type: Tweak + id: 6637 + time: '2024-05-29T04:05:40.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27978 +- author: notafet + changes: + - message: Slightly increase spacing speed to fix under-pressure lockout. + type: Tweak + - message: Fix vent under-pressure lockout. + type: Fix + id: 6638 + time: '2024-05-29T05:21:48.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28370 +- author: lzk228 + changes: + - message: Salvage access has been replaced with Cargo for the artifact container. + type: Tweak + id: 6639 + time: '2024-05-29T16:46:23.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28386 diff --git a/Resources/Credits/GitHub.txt b/Resources/Credits/GitHub.txt index 172dd2ad37a..b7ec22c0b0d 100644 --- a/Resources/Credits/GitHub.txt +++ b/Resources/Credits/GitHub.txt @@ -1 +1 @@ -0x6273, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 4dplanner, 612git, 778b, Ablankmann, Acruid, actioninja, adamsong, Admiral-Obvious-001, Adrian16199, Aerocrux, Aexxie, Afrokada, Agoichi, Ahion, AJCM-git, AjexRose, Alekshhh, AlexMorgan3817, AlexUm418, AlmondFlour, AlphaQwerty, Altoids1, amylizzle, ancientpower, ArchPigeon, Arendian, arimah, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, avghdev, AzzyIsNotHere, BananaFlambe, Baptr0b0t, BasedUser, beck-thompson, BellwetherLogic, BGare, bhenrich, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, Boaz1111, BobdaBiscuit, brainfood1183, Brandon-Huu, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CakeQ, Callmore, CaptainSqrBeard, Carbonhell, casperr04, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, Ciac32, clement-or, Clyybber, Cojoke-dot, ColdAutumnRain, collinlunn, ComicIronic, coolmankid12345, corentt, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, Daemon, daerSeebaer, dahnte, dakamakat, dakimasu, DamianX, DangerRevolution, daniel-cr, Darkenson, DawBla, dch-GH, Deahaka, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, deepdarkdepths, deepy, Delete69, deltanedas, DerbyX, DexlerXD, Doctor-Cpu, DoctorBeard, DogZeroX, dontbetank, Doru991, DoubleRiceEddiedd, DoutorWhite, DrMelon, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, DuskyJay, Dutch-VanDerLinde, Easypoller, eclips_e, EdenTheLiznerd, EEASAS, Efruit, ElectroSR, elthundercloud, Emisse, EmoGarbage404, Endecc, enumerate0, eoineoineoin, ERORR404V1, Errant-4, estacaoespacialpirata, exincore, exp111, Fahasor, FairlySadPanda, ficcialfaint, Fildrance, FillerVK, Fishfish458, Flareguy, FluffiestFloof, FluidRock, FoLoKe, fooberticus, Fortune117, freeman2651, Froffy025, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, Genkail, Ghagliiarghii, Git-Nivrak, github-actions[bot], gituhabu, GNF54, Golinth, GoodWheatley, Gotimanga, graevy, GreyMario, gusxyz, Gyrandola, h3half, Hanzdegloker, Hardly3D, harikattar, Hebiman, Henry12116, HerCoyote23, hitomishirichan, Hmeister-real, HoofedEar, hord-brayden, hubismal, Hugal31, Huxellberger, Hyenh, iacore, IamVelcroboy, icekot8, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, ItsMeThom, j-giebel, Jackal298, Jackrost, jamessimo, janekvap, Jark255, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JoeHammad1844, joelhed, JohnGinnane, johnku1, joshepvodka, jproads, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTether, JustinTrotter, K-Dynamic, KaiShibaa, kalane15, kalanosh, KEEYNy, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Ko4ergaPunk, komunre, koteq, Krunklehorn, Kukutis96513, kxvvv, Lamrr, LankLTE, lapatison, Leander-0, LetterN, Level10Cybermancer, lever1209, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, luckyshotpictures, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, Mangohydra, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, MishaUnity, MisterMecky, Mith-randalf, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, Nopey, notafet, notquitehadouken, noudoit, noverd, nuke-haus, NULL882, OctoRocket, OldDanceJacket, onoira, osjarw, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, pigeonpeas, pissdemon, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Psychpsyo, psykzz, PuroSlavKing, PursuitInAshes, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, RumiTiger, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, SethLafuente, ShadowCommander, Shadowtheprotogen546, shampunj, SignalWalker, Simyon264, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, slarticodefast, Slava0135, snebl, Snowni, snowsignal, SonicHDC, SoulFN, SoulSloth, SpaceManiac, SpeltIncorrectyl, SphiraI, spoogemonster, ssdaniel24, Stealthbomber16, StrawberryMoses, Subversionary, superjj18, SweptWasTaken, Szunti, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, Terraspark4941, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, Theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, tmtmtl30, TokenStyle, tom-leys, tomasalves8, Tomeno, tosatur, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UBlueberry, UKNOWH, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Vermidia, Verslebas, VigersRay, Visne, volundr-, Voomra, Vordenburg, vulppine, wafehling, waylon531, weaversam8, whateverusername0, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, Zealith-Gamer, ZelteHonor, zerorulez, zionnBE, zlodo, ZNixian, ZoldorfTheWizard, Zumorica, Zymem +0x6273, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 4dplanner, 612git, 778b, Ablankmann, Acruid, actioninja, adamsong, Admiral-Obvious-001, Adrian16199, Aerocrux, Aexxie, Afrokada, Agoichi, Ahion, AJCM-git, AjexRose, Alekshhh, AlexMorgan3817, AlexUm418, AlmondFlour, AlphaQwerty, Altoids1, amylizzle, ancientpower, ArchPigeon, Arendian, arimah, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, avghdev, AzzyIsNotHere, BananaFlambe, Baptr0b0t, BasedUser, beck-thompson, BellwetherLogic, BGare, bhenrich, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, blueDev2, Boaz1111, BobdaBiscuit, brainfood1183, Brandon-Huu, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CakeQ, Callmore, CaptainSqrBeard, Carbonhell, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, Ciac32, clement-or, Clyybber, Cojoke-dot, ColdAutumnRain, collinlunn, ComicIronic, coolmankid12345, corentt, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, Daemon, daerSeebaer, dahnte, dakamakat, dakimasu, DamianX, DangerRevolution, daniel-cr, Darkenson, DawBla, dch-GH, Deahaka, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, deepdarkdepths, deepy, Delete69, deltanedas, DerbyX, DexlerXD, Doctor-Cpu, DoctorBeard, DogZeroX, dontbetank, Doru991, DoubleRiceEddiedd, DoutorWhite, DrMelon, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, DuskyJay, Dutch-VanDerLinde, Easypoller, eclips_e, EdenTheLiznerd, EEASAS, Efruit, ElectroSR, elthundercloud, Emisse, EmoGarbage404, Endecc, enumerate0, eoineoineoin, ERORR404V1, Errant-4, estacaoespacialpirata, exincore, exp111, Fahasor, FairlySadPanda, ficcialfaint, Fildrance, FillerVK, Fishfish458, Flareguy, FluffiestFloof, FluidRock, FoLoKe, fooberticus, Fortune117, freeman2651, Froffy025, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, Genkail, Ghagliiarghii, Git-Nivrak, github-actions[bot], gituhabu, GNF54, Golinth, GoodWheatley, Gotimanga, graevy, GreyMario, gusxyz, Gyrandola, h3half, Hanzdegloker, Hardly3D, harikattar, Hebiman, Henry12116, HerCoyote23, hitomishirichan, Hmeister-real, HoofedEar, hord-brayden, hubismal, Hugal31, Huxellberger, Hyenh, iacore, IamVelcroboy, icekot8, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, ItsMeThom, j-giebel, Jackal298, Jackrost, jamessimo, janekvap, Jark255, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JoeHammad1844, joelhed, JohnGinnane, johnku1, joshepvodka, jproads, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTether, JustinTrotter, K-Dynamic, KaiShibaa, kalane15, kalanosh, KEEYNy, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Ko4ergaPunk, komunre, koteq, Krunklehorn, Kukutis96513, kxvvv, Lamrr, LankLTE, lapatison, Leander-0, LetterN, Level10Cybermancer, lever1209, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, luckyshotpictures, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, Mangohydra, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, MishaUnity, MisterMecky, Mith-randalf, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, Nopey, notafet, notquitehadouken, noudoit, noverd, nuke-haus, NULL882, OctoRocket, OldDanceJacket, onoira, osjarw, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, pigeonpeas, pissdemon, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Psychpsyo, psykzz, PuroSlavKing, PursuitInAshes, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, RumiTiger, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, SethLafuente, ShadowCommander, Shadowtheprotogen546, shampunj, SignalWalker, Simyon264, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, slarticodefast, Slava0135, snebl, Snowni, snowsignal, SonicHDC, SoulFN, SoulSloth, SpaceManiac, SpeltIncorrectyl, SphiraI, spoogemonster, ssdaniel24, Stealthbomber16, StrawberryMoses, Subversionary, superjj18, SweptWasTaken, Szunti, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, Terraspark4941, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, tmtmtl30, TokenStyle, tom-leys, tomasalves8, Tomeno, tosatur, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UBlueberry, UKNOWH, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Vermidia, Verslebas, VigersRay, Visne, volundr-, Voomra, Vordenburg, vulppine, wafehling, waylon531, weaversam8, whateverusername0, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, Zealith-Gamer, ZelteHonor, zerorulez, zionnBE, zlodo, ZNixian, ZoldorfTheWizard, Zumorica, Zymem diff --git a/Resources/Locale/en-US/atmos/firelock-component.ftl b/Resources/Locale/en-US/atmos/firelock-component.ftl index fc375183e97..81f7e58462a 100644 --- a/Resources/Locale/en-US/atmos/firelock-component.ftl +++ b/Resources/Locale/en-US/atmos/firelock-component.ftl @@ -1,2 +1,4 @@ firelock-component-is-holding-pressure-message = A gush of air blows in your face... Maybe you should reconsider. -firelock-component-is-holding-fire-message = A gush of warm air blows in your face... Maybe you should reconsider. \ No newline at end of file +firelock-component-is-holding-fire-message = A gush of warm air blows in your face... Maybe you should reconsider. +firelock-component-examine-pressure-warning = The [color=red]extreme pressure[/color] differential warning is active. +firelock-component-examine-temperature-warning = The [color=red]extreme temperature[/color] warning is active. diff --git a/Resources/Locale/en-US/body/behavior/behavior.ftl b/Resources/Locale/en-US/body/behavior/behavior.ftl deleted file mode 100644 index 6870fdb894f..00000000000 --- a/Resources/Locale/en-US/body/behavior/behavior.ftl +++ /dev/null @@ -1 +0,0 @@ -lung-behavior-gasp = Gasp \ No newline at end of file diff --git a/Resources/Locale/en-US/chat/emotes.ftl b/Resources/Locale/en-US/chat/emotes.ftl index e95cb2795db..cccb33a1f17 100644 --- a/Resources/Locale/en-US/chat/emotes.ftl +++ b/Resources/Locale/en-US/chat/emotes.ftl @@ -12,6 +12,7 @@ chat-emote-name-click = Click chat-emote-name-clap = Clap chat-emote-name-snap = Snap chat-emote-name-salute = Salute +chat-emote-name-gasp = Gasp chat-emote-name-deathgasp = Deathgasp chat-emote-name-buzz = Buzz chat-emote-name-weh = Weh @@ -43,9 +44,10 @@ chat-emote-msg-click = clicks. chat-emote-msg-clap = claps! chat-emote-msg-snap = snaps {POSS-ADJ($entity)} fingers. chat-emote-msg-salute = salutes. +chat-emote-msg-gasp = gasps. chat-emote-msg-deathgasp = seizes up and falls limp, {POSS-ADJ($entity)} eyes dead and lifeless... chat-emote-msg-deathgasp-monkey = lets out a faint chimper as {SUBJECT($entity)} collapses and stops moving... -chat-emote-msg-buzz = buzz! +chat-emote-msg-buzz = buzzes! chat-emote-msg-chirp = chirps! chat-emote-msg-beep = beeps. chat-emote-msg-chime = chimes. diff --git a/Resources/Locale/en-US/construction/conditions/no-unstackable-in-tile.ftl b/Resources/Locale/en-US/construction/conditions/no-unstackable-in-tile.ftl index 37ce0de9e8e..715825e801c 100644 --- a/Resources/Locale/en-US/construction/conditions/no-unstackable-in-tile.ftl +++ b/Resources/Locale/en-US/construction/conditions/no-unstackable-in-tile.ftl @@ -1 +1,2 @@ construction-step-condition-no-unstackable-in-tile = You cannot make a stack of similar devices. +pipe-restrict-overlap-popup-blocked = { CAPITALIZE(THE($pipe))} doesn't fit over the other pipes! diff --git a/Resources/Locale/en-US/game-ticking/game-rules/gamerule-admin.ftl b/Resources/Locale/en-US/game-ticking/game-rules/gamerule-admin.ftl new file mode 100644 index 00000000000..3b31fe46630 --- /dev/null +++ b/Resources/Locale/en-US/game-ticking/game-rules/gamerule-admin.ftl @@ -0,0 +1,6 @@ +#When an admin adds a game rule +add-gamerule-admin = Game rule({$rule}) added - {$admin} +list-gamerule-admin-header = | Time | Rule added +list-gamerule-admin-no-rules = No game rules have been added. +starting-rule-selected-preset = Current gamerules in use: {$preset} +listgamerules-command-help = Lists all rules that have been added for the round so far. diff --git a/Resources/Locale/en-US/game-ticking/game-rules/rule-secret.ftl b/Resources/Locale/en-US/game-ticking/game-rules/rule-secret.ftl deleted file mode 100644 index c38220cca1d..00000000000 --- a/Resources/Locale/en-US/game-ticking/game-rules/rule-secret.ftl +++ /dev/null @@ -1,2 +0,0 @@ -# Sent to admin chat -rule-secret-selected-preset = Selected {$preset} for secret. diff --git a/Resources/Locale/en-US/guidebook/chemistry/effects.ftl b/Resources/Locale/en-US/guidebook/chemistry/effects.ftl index 5579c95e9df..1dacebd1349 100644 --- a/Resources/Locale/en-US/guidebook/chemistry/effects.ftl +++ b/Resources/Locale/en-US/guidebook/chemistry/effects.ftl @@ -365,9 +365,9 @@ reagent-effect-guidebook-plant-cryoxadone = reagent-effect-guidebook-plant-phalanximine = { $chance -> - [1] Makes - *[other] make - } a plant not viable due to mutation viable again + [1] Restores + *[other] restore + } viability to a plant rendered nonviable by a mutation reagent-effect-guidebook-plant-diethylamine = { $chance -> diff --git a/Resources/Locale/en-US/interaction/interaction-popup-component.ftl b/Resources/Locale/en-US/interaction/interaction-popup-component.ftl index 4929b11b1cd..7db99c3d0ae 100644 --- a/Resources/Locale/en-US/interaction/interaction-popup-component.ftl +++ b/Resources/Locale/en-US/interaction/interaction-popup-component.ftl @@ -51,7 +51,7 @@ petting-failure-dragon = You raise your hand, but as {THE($target)} roars, you d petting-failure-hamster = You reach out to pet {THE($target)}, but {SUBJECT($target)} attempts to bite your finger and only your quick reflexes save you from an almost fatal injury. petting-failure-bear = You reach out to pet {THE($target)}, but {SUBJECT($target)} growls, making you think twice. petting-failure-monkey = You reach out to pet {THE($target)}, but {SUBJECT($target)} almost bites your fingers! -petting-failure-nymph = You reach out to pet {THE($target)}, but {POSS-ADJ($target)} moves their branches away. +petting-failure-nymph = You reach out to pet {THE($target)}, but {SUBJECT($target)} move their branches away. petting-failure-shadow = You're trying to pet {THE($target)}, but your hand passes through the cold darkness of his body. ## Petting silicons diff --git a/Resources/Locale/en-US/lobby/ui/observe-warning-window.ftl b/Resources/Locale/en-US/lobby/ui/observe-warning-window.ftl index 4f1c87f16a7..be07604c734 100644 --- a/Resources/Locale/en-US/lobby/ui/observe-warning-window.ftl +++ b/Resources/Locale/en-US/lobby/ui/observe-warning-window.ftl @@ -3,3 +3,5 @@ observe-confirm = Observe observe-warning-1 = Are you sure you want to observe? observe-warning-2 = You cannot play in the round if you do so. observe-warning-window-title = Warning +observe-as-admin = Admin Observe +observe-as-player = Player Observe diff --git a/Resources/Locale/en-US/objectives/round-end.ftl b/Resources/Locale/en-US/objectives/round-end.ftl index b4314b2caff..3da81fc9640 100644 --- a/Resources/Locale/en-US/objectives/round-end.ftl +++ b/Resources/Locale/en-US/objectives/round-end.ftl @@ -6,7 +6,6 @@ objectives-round-end-result = {$count -> objectives-round-end-result-in-custody = {$custody} out of {$count} {MAKEPLURAL($agent)} were in custody. objectives-player-user-named = [color=White]{$name}[/color] ([color=gray]{$user}[/color]) -objectives-player-user = [color=gray]{$user}[/color] objectives-player-named = [color=White]{$name}[/color] objectives-no-objectives = {$custody}{$title} was a {$agent}. diff --git a/Resources/Locale/en-US/popup/popup.ftl b/Resources/Locale/en-US/popup/popup.ftl new file mode 100644 index 00000000000..4bc677c6082 --- /dev/null +++ b/Resources/Locale/en-US/popup/popup.ftl @@ -0,0 +1 @@ +popup-system-repeated-popup-stacking-wrap = {$popup-message} x{$count} diff --git a/Resources/Locale/en-US/reagents/meta/botany.ftl b/Resources/Locale/en-US/reagents/meta/botany.ftl index 912ded5cf29..c7101c23279 100644 --- a/Resources/Locale/en-US/reagents/meta/botany.ftl +++ b/Resources/Locale/en-US/reagents/meta/botany.ftl @@ -11,7 +11,7 @@ reagent-name-plant-b-gone = plant-B-gone reagent-desc-plant-b-gone = A harmful toxic mixture to kill plantlife. Very effective against kudzu. reagent-name-robust-harvest = robust harvest -reagent-desc-robust-harvest = A highly effective fertilizer, with a limited potency-boosting effect on plants. Be careful with it's usage since using too much has a chance to reduce the plant yield. It has a positive effect on dionas. +reagent-desc-robust-harvest = A highly effective fertilizer with a limited potency-boosting effect on plants. Use it cautiously, as excessive application can reduce plant yield. It has a particularly beneficial effect on dionas. reagent-name-weed-killer = weed killer reagent-desc-weed-killer = A mixture that targets weeds. Very effective against kudzu. While useful it slowly poisons plants with toxins, be careful when using it. diff --git a/Resources/Locale/en-US/shuttles/emergency.ftl b/Resources/Locale/en-US/shuttles/emergency.ftl index c7162911351..2fa3a7a1240 100644 --- a/Resources/Locale/en-US/shuttles/emergency.ftl +++ b/Resources/Locale/en-US/shuttles/emergency.ftl @@ -13,9 +13,9 @@ emergency-shuttle-command-launch-desc = Early launches the emergency shuttle if # Emergency shuttle emergency-shuttle-left = The Emergency Shuttle has left the station. Estimate {$transitTime} seconds until the shuttle arrives at CentCom. emergency-shuttle-launch-time = The emergency shuttle will launch in {$consoleAccumulator} seconds. -emergency-shuttle-docked = The Emergency Shuttle has docked with the station on the {$direction} side. It will leave in {$time} seconds. +emergency-shuttle-docked = The Emergency Shuttle has docked {$direction} of the station, {$location}. It will leave in {$time} seconds. emergency-shuttle-good-luck = The Emergency Shuttle is unable to find a station. Good luck. -emergency-shuttle-nearby = The Emergency Shuttle is unable to find a valid docking port. It has warped {$direction}. +emergency-shuttle-nearby = The Emergency Shuttle is unable to find a valid docking port. It has warped in {$direction} of the station, {$location}. # Emergency shuttle console popup / announcement emergency-shuttle-console-no-early-launches = Early launch is disabled diff --git a/Resources/Locale/en-US/strip/strippable-component.ftl b/Resources/Locale/en-US/strip/strippable-component.ftl index 7654b20b03f..ee37a5e90c1 100644 --- a/Resources/Locale/en-US/strip/strippable-component.ftl +++ b/Resources/Locale/en-US/strip/strippable-component.ftl @@ -9,6 +9,7 @@ strippable-component-cannot-drop-message = {$owner} cannot drop that! strippable-component-alert-owner = {$user} is removing your {$item}! strippable-component-alert-owner-hidden = You feel someone fumbling in your {$slot}! strippable-component-alert-owner-insert = {$user} is putting {$item} on you! +strippable-component-alert-owner-insert-hand = {$user} is putting {$item} in your hand! # generic warning for when a user interacts with your equipped items. strippable-component-alert-owner-interact = {$user} is fumbling around with your {$item}! @@ -19,4 +20,4 @@ strip-verb-get-data-text = Strip ## UI strippable-bound-user-interface-stripping-menu-title = {$ownerName}'s inventory -strippable-bound-user-interface-stripping-menu-ensnare-button = Remove Leg Restraints \ No newline at end of file +strippable-bound-user-interface-stripping-menu-ensnare-button = Remove Leg Restraints diff --git a/Resources/Maps/atlas.yml b/Resources/Maps/atlas.yml index cfd5f3b5acd..cb7dc8e778b 100644 --- a/Resources/Maps/atlas.yml +++ b/Resources/Maps/atlas.yml @@ -89,7 +89,7 @@ entities: version: 6 0,1: ind: 0,1 - tiles: AwAAAAAAAwAAAAAAAwAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAeQAAAAAAdgAAAAAAdgAAAAAAeQAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAeQAAAAAAdgAAAAAAdgAAAAAAeQAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAeQAAAAAAdgAAAAAAdgAAAAAAeQAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAeQAAAAAAdgAAAAAAdgAAAAAAeQAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAdgAAAAAAdgAAAAAAdgAAAAAAdgAAAAAAHQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAALAAAAAAAeQAAAAAAeQAAAAAAdgAAAAAAdgAAAAAAdgAAAAAAdgAAAAAAHQAAAAAAeQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAdgAAAAAAdgAAAAAAdgAAAAAAdgAAAAAAHQAAAAAAeQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAPgAAAAAAdgAAAAAAdgAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAPgAAAAAAdgAAAAAAdgAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAPgAAAAAAdgAAAAAAdgAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAALgAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAAA + tiles: AwAAAAAAAwAAAAAAAwAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAeQAAAAAAdgAAAAAAdgAAAAAAeQAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAeQAAAAAAdgAAAAAAdgAAAAAAeQAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAeQAAAAAAdgAAAAAAdgAAAAAAeQAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAHQAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAeQAAAAAAdgAAAAAAdgAAAAAAeQAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAdgAAAAAAdgAAAAAAdgAAAAAAdgAAAAAAHQAAAAAAeQAAAAAAeQAAAAAAWQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAALAAAAAAAeQAAAAAAeQAAAAAAdgAAAAAAdgAAAAAAdgAAAAAAdgAAAAAAHQAAAAAAeQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAdgAAAAAAdgAAAAAAdgAAAAAAdgAAAAAAHQAAAAAAeQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAPgAAAAAAdgAAAAAAdgAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAPgAAAAAAdgAAAAAAdgAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAPgAAAAAAdgAAAAAAdgAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAALgAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAAA version: 6 1,1: ind: 1,1 @@ -3360,6 +3360,13 @@ entities: - type: Transform pos: -44.5,-15.5 parent: 30 +- proto: AirlockArmoryGlassLocked + entities: + - uid: 1448 + components: + - type: Transform + pos: 9.5,14.5 + parent: 30 - proto: AirlockAtmosphericsGlassLocked entities: - uid: 241 @@ -3940,6 +3947,9 @@ entities: - type: Transform pos: 18.5,-6.5 parent: 30 + - type: DeviceLinkSource + lastSignals: + DoorStatus: True - uid: 2282 components: - type: Transform @@ -4053,12 +4063,6 @@ entities: parent: 30 - proto: AirlockHeadOfSecurityGlassLocked entities: - - uid: 1448 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 9.5,14.5 - parent: 30 - uid: 7378 components: - type: Transform @@ -4239,6 +4243,9 @@ entities: - type: Transform pos: -6.5,17.5 parent: 30 + - type: DeviceLinkSource + lastSignals: + DoorStatus: True - proto: AirlockMedicalGlass entities: - uid: 2408 @@ -7082,7 +7089,7 @@ entities: - uid: 2074 components: - type: Transform - pos: -10.5,8.5 + pos: -7.5,8.5 parent: 30 - uid: 2075 components: @@ -23899,14 +23906,6 @@ entities: rot: 1.5707963267948966 rad pos: -44.5,-16.5 parent: 30 -- proto: EncryptionKeyCargo - entities: - - uid: 8041 - components: - - type: Transform - parent: 8035 - - type: Physics - canCollide: False - proto: EncryptionKeyCommand entities: - uid: 6716 @@ -23931,14 +23930,6 @@ entities: parent: 6972 - type: Physics canCollide: False -- proto: EncryptionKeyMedical - entities: - - uid: 7916 - components: - - type: Transform - parent: 7915 - - type: Physics - canCollide: False - proto: EncryptionKeyScience entities: - uid: 7393 @@ -38622,6 +38613,14 @@ entities: rot: -1.5707963267948966 rad pos: -11.5,-9.5 parent: 30 +- proto: HydroponicsToolClippers + entities: + - uid: 7916 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 2.368904,17.565664 + parent: 30 - proto: HydroponicsToolHatchet entities: - uid: 1498 @@ -41743,14 +41742,6 @@ entities: parent: 30 - type: ApcPowerReceiver powerLoad: 0 - - uid: 7438 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -30.5,-11.5 - parent: 30 - - type: ApcPowerReceiver - powerLoad: 0 - uid: 7439 components: - type: Transform @@ -41773,6 +41764,12 @@ entities: rot: 3.141592653589793 rad pos: 3.5,-15.5 parent: 30 + - uid: 8041 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -31.5,-11.5 + parent: 30 - uid: 8112 components: - type: Transform @@ -46316,6 +46313,14 @@ entities: - type: Transform pos: 10.5,15.5 parent: 30 +- proto: SpawnMobMonkeyPunpun + entities: + - uid: 8035 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -18.5,3.5 + parent: 30 - proto: SpawnMobMouse entities: - uid: 1570 @@ -48692,48 +48697,20 @@ entities: showEnts: False occludes: True ents: [] -- proto: TelecomServerFilled +- proto: TelecomServerFilledCargo entities: - - uid: 7915 + - uid: 7438 components: - type: Transform - pos: -47.5,6.5 + pos: -48.5,6.5 parent: 30 - - type: ContainerContainer - containers: - key_slots: !type:Container - showEnts: False - occludes: True - ents: - - 7916 - machine_board: !type:Container - showEnts: False - occludes: True - ents: [] - machine_parts: !type:Container - showEnts: False - occludes: True - ents: [] - - uid: 8035 +- proto: TelecomServerFilledMedical + entities: + - uid: 7915 components: - type: Transform - pos: -48.5,6.5 + pos: -47.5,6.5 parent: 30 - - type: ContainerContainer - containers: - key_slots: !type:Container - showEnts: False - occludes: True - ents: - - 8041 - machine_board: !type:Container - showEnts: False - occludes: True - ents: [] - machine_parts: !type:Container - showEnts: False - occludes: True - ents: [] - proto: ToiletDirtyWater entities: - uid: 7674 diff --git a/Resources/Maps/omega.yml b/Resources/Maps/omega.yml index bf3ee069976..07ebb24b9da 100644 --- a/Resources/Maps/omega.yml +++ b/Resources/Maps/omega.yml @@ -37,12 +37,13 @@ entities: - type: MetaData - type: Transform - type: Map + mapPaused: True - type: PhysicsMap + - type: GridTree + - type: MovedGrids - type: Broadphase - type: OccluderTree - type: LoadedMap - - type: GridTree - - type: MovedGrids - uid: 4812 components: - type: MetaData @@ -3786,7 +3787,8 @@ entities: -9,2: 0: 65535 -9,3: - 0: 65535 + 2: 1 + 0: 65534 -8,0: 0: 65535 -8,-2: @@ -4217,8 +4219,6 @@ entities: - 8806 - 5025 - 6554 - - type: AtmosDevice - joinedGrid: 4812 - uid: 4982 components: - type: Transform @@ -4229,16 +4229,12 @@ entities: devices: - 4941 - 4875 - - type: AtmosDevice - joinedGrid: 4812 - uid: 6692 components: - type: Transform rot: -1.5707963267948966 rad pos: -23.5,-26.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 7234 components: - type: Transform @@ -4249,8 +4245,6 @@ entities: devices: - 4890 - 4876 - - type: AtmosDevice - joinedGrid: 4812 - uid: 7236 components: - type: Transform @@ -4261,8 +4255,6 @@ entities: devices: - 8838 - 8836 - - type: AtmosDevice - joinedGrid: 4812 - uid: 7241 components: - type: Transform @@ -4272,16 +4264,12 @@ entities: devices: - 6686 - 7227 - - type: AtmosDevice - joinedGrid: 4812 - uid: 7249 components: - type: Transform rot: 1.5707963267948966 rad pos: -11.5,-27.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 7284 components: - type: Transform @@ -4292,8 +4280,6 @@ entities: - 12226 - 1853 - 1852 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12171 components: - type: Transform @@ -4305,8 +4291,6 @@ entities: - 12170 - 12027 - 12026 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12173 components: - type: Transform @@ -4318,8 +4302,6 @@ entities: - 12028 - 12025 - 12172 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12174 components: - type: Transform @@ -4331,8 +4313,6 @@ entities: - 12175 - 12029 - 12024 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12176 components: - type: Transform @@ -4343,8 +4323,6 @@ entities: - 12177 - 12032 - 12033 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12178 components: - type: Transform @@ -4361,8 +4339,6 @@ entities: - 10754 - 10755 - 10756 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12182 components: - type: Transform @@ -4371,8 +4347,6 @@ entities: - type: DeviceList devices: - 12181 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12183 components: - type: Transform @@ -4389,8 +4363,6 @@ entities: - 10754 - 10755 - 10756 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12186 components: - type: Transform @@ -4406,8 +4378,6 @@ entities: - 12185 - 3708 - 8787 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12190 components: - type: Transform @@ -4420,8 +4390,6 @@ entities: - 8691 - 12034 - 11962 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12193 components: - type: Transform @@ -4441,8 +4409,6 @@ entities: - 12189 - 12197 - 12196 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12198 components: - type: Transform @@ -4456,8 +4422,6 @@ entities: - 12197 - 1685 - 1686 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12202 components: - type: Transform @@ -4475,8 +4439,6 @@ entities: - 12204 - 12039 - 12040 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12206 components: - type: Transform @@ -4489,8 +4451,6 @@ entities: - 12205 - 8562 - 8563 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12209 components: - type: Transform @@ -4515,8 +4475,6 @@ entities: - 7873 - 7887 - 7886 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12213 components: - type: Transform @@ -4527,8 +4485,6 @@ entities: - 7905 - 7907 - 12214 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12215 components: - type: Transform @@ -4541,8 +4497,6 @@ entities: - 12212 - 7906 - 7908 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12219 components: - type: Transform @@ -4553,8 +4507,6 @@ entities: - 12218 - 7858 - 7856 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12220 components: - type: Transform @@ -4569,8 +4521,6 @@ entities: - 12222 - 8307 - 8306 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12223 components: - type: Transform @@ -4585,8 +4535,6 @@ entities: - 12225 - 1817 - 1816 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12228 components: - type: Transform @@ -4600,8 +4548,6 @@ entities: - 1928 - 2474 - 2441 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12232 components: - type: Transform @@ -4615,8 +4561,6 @@ entities: - 2472 - 2442 - 2475 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12234 components: - type: Transform @@ -4635,8 +4579,6 @@ entities: - 2448 - 2446 - 2445 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12240 components: - type: Transform @@ -4651,8 +4593,6 @@ entities: - 2071 - 2072 - 2073 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12245 components: - type: Transform @@ -4669,8 +4609,6 @@ entities: - 2782 - 1770 - 3782 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12249 components: - type: Transform @@ -4688,8 +4626,6 @@ entities: - 2786 - 4439 - 4440 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12252 components: - type: Transform @@ -4702,8 +4638,6 @@ entities: - 12254 - 3021 - 3024 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12256 components: - type: Transform @@ -4717,8 +4651,6 @@ entities: - 3017 - 3019 - 12257 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12258 components: - type: Transform @@ -4730,8 +4662,6 @@ entities: - 12259 - 3001 - 2983 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12260 components: - type: Transform @@ -4742,8 +4672,6 @@ entities: - 3814 - 12261 - 3944 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12262 components: - type: Transform @@ -4755,8 +4683,6 @@ entities: - 3816 - 12263 - 3841 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12265 components: - type: Transform @@ -4768,8 +4694,6 @@ entities: - 3813 - 12264 - 3835 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12266 components: - type: Transform @@ -4780,8 +4704,6 @@ entities: - 3815 - 3838 - 12267 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12272 components: - type: Transform @@ -4797,8 +4719,6 @@ entities: - 4117 - 4442 - 4441 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12275 components: - type: Transform @@ -4812,8 +4732,6 @@ entities: - 4425 - 4380 - 4381 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12278 components: - type: Transform @@ -4826,8 +4744,6 @@ entities: - 4424 - 4444 - 4443 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12282 components: - type: Transform @@ -4838,8 +4754,6 @@ entities: - 4226 - 12281 - 4231 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12283 components: - type: Transform @@ -4851,8 +4765,6 @@ entities: - 4205 - 12284 - 4203 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12285 components: - type: Transform @@ -4867,8 +4779,6 @@ entities: - 6414 - 6417 - 6416 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12289 components: - type: Transform @@ -4888,8 +4798,6 @@ entities: - 12288 - 6420 - 6419 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12293 components: - type: Transform @@ -4904,8 +4812,6 @@ entities: - 12295 - 12038 - 12037 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12296 components: - type: Transform @@ -4916,8 +4822,6 @@ entities: - 1511 - 12297 - 1512 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12299 components: - type: Transform @@ -4930,8 +4834,6 @@ entities: - 858 - 857 - 848 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12302 components: - type: Transform @@ -4958,8 +4860,6 @@ entities: - 817 - 816 - 864 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12304 components: - type: Transform @@ -4970,8 +4870,6 @@ entities: - 877 - 885 - 12303 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12307 components: - type: Transform @@ -4982,8 +4880,6 @@ entities: - 847 - 846 - 12306 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12308 components: - type: Transform @@ -4997,8 +4893,6 @@ entities: - 784 - 835 - 814 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12311 components: - type: Transform @@ -5013,8 +4907,6 @@ entities: - 1938 - 710 - 711 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12316 components: - type: Transform @@ -5044,8 +4936,6 @@ entities: - 328 - 3582 - 2759 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12319 components: - type: Transform @@ -5066,8 +4956,6 @@ entities: - 8591 - 8758 - 8770 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12322 components: - type: Transform @@ -5083,8 +4971,6 @@ entities: - 5222 - 5224 - 5225 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12325 components: - type: Transform @@ -5095,8 +4981,6 @@ entities: - 6842 - 6839 - 12326 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12327 components: - type: Transform @@ -5107,16 +4991,12 @@ entities: - 6841 - 6840 - 12328 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12330 components: - type: Transform rot: 3.141592653589793 rad pos: -9.5,-29.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12341 components: - type: Transform @@ -5129,8 +5009,6 @@ entities: - 12343 - 7380 - 7382 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12344 components: - type: Transform @@ -5141,8 +5019,6 @@ entities: - 7088 - 7087 - 12345 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12346 components: - type: Transform @@ -5153,8 +5029,6 @@ entities: - 5700 - 5697 - 12347 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12350 components: - type: Transform @@ -5165,8 +5039,6 @@ entities: - 5699 - 5698 - 12349 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12352 components: - type: Transform @@ -5177,8 +5049,6 @@ entities: - 5715 - 5716 - 12351 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12353 components: - type: Transform @@ -5191,8 +5061,6 @@ entities: - 12355 - 5718 - 5719 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12356 components: - type: Transform @@ -5202,8 +5070,6 @@ entities: - type: DeviceList devices: - 12357 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12358 components: - type: Transform @@ -5214,8 +5080,6 @@ entities: - 5765 - 5763 - 12359 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12361 components: - type: Transform @@ -5226,8 +5090,6 @@ entities: - 5766 - 5764 - 12360 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12362 components: - type: Transform @@ -5238,8 +5100,6 @@ entities: - 12363 - 9007 - 8991 - - type: AtmosDevice - joinedGrid: 4812 - proto: AirAlarmElectronics entities: - uid: 10719 @@ -5259,77 +5119,55 @@ entities: - type: Transform pos: 15.5,44.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9041 components: - type: Transform pos: -34.5,-37.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9671 components: - type: Transform pos: -31.5,4.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9672 components: - type: Transform pos: -31.5,5.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12398 components: - type: Transform pos: -34.5,-3.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12399 components: - type: Transform pos: -34.5,-2.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: Airlock entities: - uid: 1531 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,0.5 parent: 4812 - uid: 1534 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,3.5 parent: 4812 - uid: 4116 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,7.5 parent: 4812 - uid: 6694 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,-34.5 parent: 4812 - uid: 7025 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -26.5,-34.5 parent: 4812 @@ -5361,22 +5199,16 @@ entities: entities: - uid: 8862 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-36.5 parent: 4812 - uid: 9563 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,-0.5 parent: 4812 - uid: 9566 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,2.5 parent: 4812 @@ -5384,8 +5216,6 @@ entities: entities: - uid: 325 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,7.5 parent: 4812 @@ -5427,15 +5257,11 @@ entities: entities: - uid: 2419 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,26.5 parent: 4812 - uid: 2463 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,28.5 parent: 4812 @@ -5471,22 +5297,17 @@ entities: - uid: 329 components: - type: MetaData - flags: PvsPriority name: Chaplain's Room - type: Transform pos: -25.5,-36.5 parent: 4812 - uid: 6792 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,-36.5 parent: 4812 - uid: 6793 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-34.5 parent: 4812 @@ -5494,8 +5315,6 @@ entities: entities: - uid: 6617 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,-19.5 parent: 4812 @@ -5576,15 +5395,11 @@ entities: entities: - uid: 5174 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,23.5 parent: 4812 - uid: 11928 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,18.5 parent: 4812 @@ -5592,15 +5407,11 @@ entities: entities: - uid: 5358 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,-13.5 parent: 4812 - uid: 5359 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-17.5 parent: 4812 @@ -5630,106 +5441,76 @@ entities: entities: - uid: 901 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,9.5 parent: 4812 - uid: 3726 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,2.5 parent: 4812 - uid: 4370 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,0.5 parent: 4812 - uid: 4371 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,3.5 parent: 4812 - uid: 5912 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-32.5 parent: 4812 - uid: 6885 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,-32.5 parent: 4812 - uid: 7956 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,7.5 parent: 4812 - uid: 9564 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,-4.5 parent: 4812 - uid: 9663 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,-8.5 parent: 4812 - uid: 9664 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-8.5 parent: 4812 - uid: 9888 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-12.5 parent: 4812 - uid: 9958 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-20.5 parent: 4812 - uid: 10165 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,-23.5 parent: 4812 - uid: 11386 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 33.5,-37.5 parent: 4812 - uid: 11688 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 6.5,4.5 @@ -5919,50 +5700,36 @@ entities: entities: - uid: 2737 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,31.5 parent: 4812 - uid: 2814 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,33.5 parent: 4812 - uid: 3349 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,10.5 parent: 4812 - uid: 3350 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,10.5 parent: 4812 - uid: 3686 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,44.5 parent: 4812 - uid: 3687 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,45.5 parent: 4812 - uid: 10405 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,-22.5 parent: 4812 @@ -5970,8 +5737,6 @@ entities: entities: - uid: 3119 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,35.5 parent: 4812 @@ -5979,8 +5744,6 @@ entities: entities: - uid: 716 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,-4.5 parent: 4812 @@ -6147,15 +5910,11 @@ entities: entities: - uid: 2461 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,27.5 parent: 4812 - uid: 2462 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,28.5 parent: 4812 @@ -6170,22 +5929,16 @@ entities: entities: - uid: 7934 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,25.5 parent: 4812 - uid: 7936 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,21.5 parent: 4812 - uid: 8242 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,27.5 parent: 4812 @@ -6205,8 +5958,6 @@ entities: entities: - uid: 720 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,-10.5 parent: 4812 @@ -6221,15 +5972,11 @@ entities: entities: - uid: 7949 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,6.5 parent: 4812 - uid: 8686 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,0.5 parent: 4812 @@ -6237,8 +5984,6 @@ entities: entities: - uid: 324 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,7.5 parent: 4812 @@ -6246,8 +5991,6 @@ entities: entities: - uid: 2418 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,24.5 parent: 4812 @@ -6255,8 +5998,6 @@ entities: entities: - uid: 2741 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,24.5 parent: 4812 @@ -6264,15 +6005,11 @@ entities: entities: - uid: 6790 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-31.5 parent: 4812 - uid: 6791 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,-31.5 parent: 4812 @@ -6280,8 +6017,6 @@ entities: entities: - uid: 7932 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,21.5 parent: 4812 @@ -6289,29 +6024,21 @@ entities: entities: - uid: 8683 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -30.5,-10.5 parent: 4812 - uid: 8684 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,-10.5 parent: 4812 - uid: 8685 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,-6.5 parent: 4812 - uid: 9830 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -44.5,-15.5 parent: 4812 @@ -6331,8 +6058,6 @@ entities: entities: - uid: 309 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -10.5,-4.5 parent: 4812 @@ -6340,8 +6065,6 @@ entities: entities: - uid: 719 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-5.5 parent: 4812 @@ -6349,15 +6072,11 @@ entities: entities: - uid: 717 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-1.5 parent: 4812 - uid: 718 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-6.5 parent: 4812 @@ -6365,246 +6084,176 @@ entities: entities: - uid: 336 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,-8.5 parent: 4812 - uid: 337 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,-3.5 parent: 4812 - uid: 338 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,2.5 parent: 4812 - uid: 339 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -5.5,13.5 parent: 4812 - uid: 340 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 0.5,14.5 parent: 4812 - uid: 341 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,10.5 parent: 4812 - uid: 342 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-4.5 parent: 4812 - uid: 343 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-10.5 parent: 4812 - uid: 344 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,3.5 parent: 4812 - uid: 1252 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,2.5 parent: 4812 - uid: 2882 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,21.5 parent: 4812 - uid: 4372 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,3.5 parent: 4812 - uid: 4374 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,10.5 parent: 4812 - uid: 4375 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,0.5 parent: 4812 - uid: 4376 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,-7.5 parent: 4812 - uid: 4377 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-7.5 parent: 4812 - uid: 5392 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,-13.5 parent: 4812 - uid: 5399 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,-27.5 parent: 4812 - uid: 5838 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-30.5 parent: 4812 - uid: 6982 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -10.5,-33.5 parent: 4812 - uid: 7054 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,-21.5 parent: 4812 - uid: 7954 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,8.5 parent: 4812 - uid: 8681 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,-11.5 parent: 4812 - uid: 8848 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-31.5 parent: 4812 - uid: 8861 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,-26.5 parent: 4812 - uid: 8866 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -30.5,-34.5 parent: 4812 - uid: 8867 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,-39.5 parent: 4812 - uid: 10157 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -49.5,-22.5 parent: 4812 - uid: 10487 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,-26.5 parent: 4812 - uid: 11300 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,-35.5 parent: 4812 - uid: 11326 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 25.5,-34.5 parent: 4812 - uid: 11350 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 34.5,-34.5 parent: 4812 - uid: 11434 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 31.5,-35.5 parent: 4812 - uid: 11676 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 25.5,-37.5 parent: 4812 - uid: 11802 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,-2.5 parent: 4812 @@ -6612,15 +6261,11 @@ entities: entities: - uid: 6788 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-23.5 parent: 4812 - uid: 7336 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -10.5,-29.5 parent: 4812 @@ -6628,29 +6273,21 @@ entities: entities: - uid: 5497 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-15.5 parent: 4812 - uid: 5498 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,-29.5 parent: 4812 - uid: 5499 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-29.5 parent: 4812 - uid: 5787 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 33.5,-29.5 parent: 4812 @@ -6658,8 +6295,6 @@ entities: entities: - uid: 7806 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,9.5 parent: 4812 @@ -6667,8 +6302,6 @@ entities: entities: - uid: 714 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -8.5,10.5 parent: 4812 @@ -6708,29 +6341,21 @@ entities: entities: - uid: 7410 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,-26.5 parent: 4812 - uid: 7414 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,-17.5 parent: 4812 - uid: 7415 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-19.5 parent: 4812 - uid: 7416 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-13.5 parent: 4812 @@ -6745,8 +6370,6 @@ entities: entities: - uid: 2817 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,28.5 parent: 4812 @@ -6766,8 +6389,6 @@ entities: entities: - uid: 2921 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,14.5 parent: 4812 @@ -6832,36 +6453,26 @@ entities: entities: - uid: 5396 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-20.5 parent: 4812 - uid: 5484 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-21.5 parent: 4812 - uid: 5485 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,-21.5 parent: 4812 - uid: 5486 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,-20.5 parent: 4812 - uid: 5487 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,-24.5 parent: 4812 @@ -6916,8 +6527,6 @@ entities: entities: - uid: 6675 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,-20.5 parent: 4812 @@ -6925,15 +6534,11 @@ entities: entities: - uid: 713 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,-0.5 parent: 4812 - uid: 886 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -8.5,2.5 parent: 4812 @@ -6953,8 +6558,6 @@ entities: entities: - uid: 3771 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-33.5 parent: 4812 @@ -7638,3046 +7241,2176 @@ entities: entities: - uid: 2840 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,34.5 parent: 4812 - uid: 3012 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,37.5 parent: 4812 - uid: 3044 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,38.5 parent: 4812 - uid: 3045 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,38.5 parent: 4812 - uid: 3295 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,36.5 parent: 4812 - uid: 3353 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,34.5 parent: 4812 - uid: 3372 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,33.5 parent: 4812 - uid: 3373 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,31.5 parent: 4812 - uid: 3374 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,37.5 parent: 4812 - uid: 3375 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,35.5 parent: 4812 - uid: 3376 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,33.5 parent: 4812 - uid: 3394 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,32.5 parent: 4812 - uid: 3395 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,32.5 parent: 4812 - uid: 3396 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,33.5 parent: 4812 - uid: 3397 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,35.5 parent: 4812 - uid: 3398 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,38.5 parent: 4812 - uid: 3399 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,36.5 parent: 4812 - uid: 3400 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,34.5 parent: 4812 - uid: 3427 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,32.5 parent: 4812 - uid: 3433 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,36.5 parent: 4812 - uid: 3440 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,32.5 parent: 4812 - uid: 3450 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,32.5 parent: 4812 - uid: 3459 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,37.5 parent: 4812 - uid: 3460 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,38.5 parent: 4812 - uid: 3461 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,35.5 parent: 4812 - uid: 3579 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,37.5 parent: 4812 - uid: 3583 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,42.5 parent: 4812 - uid: 3584 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,42.5 parent: 4812 - uid: 3585 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,42.5 parent: 4812 - uid: 3586 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,41.5 parent: 4812 - uid: 3587 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,42.5 parent: 4812 - uid: 3588 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,41.5 parent: 4812 - uid: 3589 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,42.5 parent: 4812 - uid: 3590 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,41.5 parent: 4812 - uid: 3591 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,41.5 parent: 4812 - uid: 3592 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,41.5 parent: 4812 - uid: 3593 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,41.5 parent: 4812 - uid: 3594 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,41.5 parent: 4812 - uid: 3595 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,40.5 parent: 4812 - uid: 3596 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,40.5 parent: 4812 - uid: 3597 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,40.5 parent: 4812 - uid: 3598 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,43.5 parent: 4812 - uid: 3599 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,44.5 parent: 4812 - uid: 3600 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,45.5 parent: 4812 - uid: 3601 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,47.5 parent: 4812 - uid: 3602 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,47.5 parent: 4812 - uid: 3603 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,48.5 parent: 4812 - uid: 3604 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,49.5 parent: 4812 - uid: 3605 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,49.5 parent: 4812 - uid: 3606 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,48.5 parent: 4812 - uid: 3607 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,48.5 parent: 4812 - uid: 3608 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,48.5 parent: 4812 - uid: 3609 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,49.5 parent: 4812 - uid: 3610 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,49.5 parent: 4812 - uid: 3612 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,49.5 parent: 4812 - uid: 3613 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,50.5 parent: 4812 - uid: 3614 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,50.5 parent: 4812 - uid: 3615 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,51.5 parent: 4812 - uid: 3616 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,50.5 parent: 4812 - uid: 3617 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,51.5 parent: 4812 - uid: 3618 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,51.5 parent: 4812 - uid: 3619 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,51.5 parent: 4812 - uid: 3620 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,53.5 parent: 4812 - uid: 3621 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,52.5 parent: 4812 - uid: 3622 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,52.5 parent: 4812 - uid: 3623 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,50.5 parent: 4812 - uid: 3624 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,53.5 parent: 4812 - uid: 3625 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,53.5 parent: 4812 - uid: 3626 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,54.5 parent: 4812 - uid: 3627 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,54.5 parent: 4812 - uid: 3628 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,55.5 parent: 4812 - uid: 3629 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,56.5 parent: 4812 - uid: 3630 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,57.5 parent: 4812 - uid: 3631 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,57.5 parent: 4812 - uid: 3632 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,56.5 parent: 4812 - uid: 3633 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,57.5 parent: 4812 - uid: 3634 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,58.5 parent: 4812 - uid: 3635 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,58.5 parent: 4812 - uid: 3636 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,59.5 parent: 4812 - uid: 3637 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,59.5 parent: 4812 - uid: 3638 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,60.5 parent: 4812 - uid: 3639 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,59.5 parent: 4812 - uid: 3640 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,60.5 parent: 4812 - uid: 3641 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,59.5 parent: 4812 - uid: 3642 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,60.5 parent: 4812 - uid: 3643 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,59.5 parent: 4812 - uid: 3644 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,60.5 parent: 4812 - uid: 3645 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,59.5 parent: 4812 - uid: 3646 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,58.5 parent: 4812 - uid: 3647 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,59.5 parent: 4812 - uid: 3648 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,58.5 parent: 4812 - uid: 3649 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,58.5 parent: 4812 - uid: 3650 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,57.5 parent: 4812 - uid: 3651 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,57.5 parent: 4812 - uid: 3652 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,56.5 parent: 4812 - uid: 3653 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,56.5 parent: 4812 - uid: 3654 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,55.5 parent: 4812 - uid: 3655 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,54.5 parent: 4812 - uid: 3656 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,54.5 parent: 4812 - uid: 3657 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,53.5 parent: 4812 - uid: 3658 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,52.5 parent: 4812 - uid: 3659 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,52.5 parent: 4812 - uid: 3660 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,51.5 parent: 4812 - uid: 3661 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,50.5 parent: 4812 - uid: 3662 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,50.5 parent: 4812 - uid: 3663 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,49.5 parent: 4812 - uid: 3664 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 0.5,49.5 parent: 4812 - uid: 3665 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 0.5,48.5 parent: 4812 - uid: 3666 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 0.5,47.5 parent: 4812 - uid: 3667 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,47.5 parent: 4812 - uid: 3668 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,46.5 parent: 4812 - uid: 3669 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,48.5 parent: 4812 - uid: 3670 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,48.5 parent: 4812 - uid: 3671 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,48.5 parent: 4812 - uid: 3672 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,49.5 parent: 4812 - uid: 3673 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,51.5 parent: 4812 - uid: 3676 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,49.5 parent: 4812 - uid: 3679 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,52.5 parent: 4812 - uid: 3680 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,53.5 parent: 4812 - uid: 3681 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,54.5 parent: 4812 - uid: 3682 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,55.5 parent: 4812 - uid: 3683 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,55.5 parent: 4812 - uid: 3684 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,56.5 parent: 4812 - uid: 3685 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,57.5 parent: 4812 - uid: 3976 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,27.5 parent: 4812 - uid: 5032 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,32.5 parent: 4812 - uid: 5625 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,-18.5 parent: 4812 - uid: 5626 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 30.5,-20.5 parent: 4812 - uid: 5627 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 30.5,-19.5 parent: 4812 - uid: 5808 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 31.5,-20.5 parent: 4812 - uid: 5809 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 31.5,-21.5 parent: 4812 - uid: 5810 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 35.5,-21.5 parent: 4812 - uid: 5811 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 36.5,-20.5 parent: 4812 - uid: 5812 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 36.5,-21.5 parent: 4812 - uid: 5813 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 37.5,-22.5 parent: 4812 - uid: 5814 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 37.5,-23.5 parent: 4812 - uid: 5815 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 38.5,-23.5 parent: 4812 - uid: 5816 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 38.5,-24.5 parent: 4812 - uid: 5817 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 39.5,-24.5 parent: 4812 - uid: 5818 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 37.5,-24.5 parent: 4812 - uid: 5819 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 37.5,-29.5 parent: 4812 - uid: 5820 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 37.5,-28.5 parent: 4812 - uid: 5821 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 37.5,-27.5 parent: 4812 - uid: 5822 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 37.5,-26.5 parent: 4812 - uid: 5823 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 37.5,-25.5 parent: 4812 - uid: 5824 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 38.5,-28.5 parent: 4812 - uid: 5825 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 38.5,-27.5 parent: 4812 - uid: 5827 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 38.5,-25.5 parent: 4812 - uid: 5828 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 39.5,-25.5 parent: 4812 - uid: 5829 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 39.5,-26.5 parent: 4812 - uid: 5830 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 39.5,-27.5 parent: 4812 - uid: 5831 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 40.5,-27.5 parent: 4812 - uid: 5832 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 40.5,-26.5 parent: 4812 - uid: 5839 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,-17.5 parent: 4812 - uid: 6332 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 37.5,-21.5 parent: 4812 - uid: 8458 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,36.5 parent: 4812 - uid: 8459 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,35.5 parent: 4812 - uid: 8460 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,34.5 parent: 4812 - uid: 8461 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,33.5 parent: 4812 - uid: 8462 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,32.5 parent: 4812 - uid: 8463 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,30.5 parent: 4812 - uid: 8464 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,31.5 parent: 4812 - uid: 8465 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,31.5 parent: 4812 - uid: 8466 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,31.5 parent: 4812 - uid: 8467 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,31.5 parent: 4812 - uid: 8468 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,31.5 parent: 4812 - uid: 8469 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,31.5 parent: 4812 - uid: 8470 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,31.5 parent: 4812 - uid: 8471 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,31.5 parent: 4812 - uid: 8472 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,31.5 parent: 4812 - uid: 8473 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,32.5 parent: 4812 - uid: 8474 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,32.5 parent: 4812 - uid: 8475 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,32.5 parent: 4812 - uid: 8476 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,32.5 parent: 4812 - uid: 8479 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,32.5 parent: 4812 - uid: 8480 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,33.5 parent: 4812 - uid: 8483 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,33.5 parent: 4812 - uid: 8484 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,33.5 parent: 4812 - uid: 8485 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,34.5 parent: 4812 - uid: 8486 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,34.5 parent: 4812 - uid: 8487 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,34.5 parent: 4812 - uid: 8488 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,34.5 parent: 4812 - uid: 8489 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,34.5 parent: 4812 - uid: 8490 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,35.5 parent: 4812 - uid: 8491 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,35.5 parent: 4812 - uid: 8492 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,35.5 parent: 4812 - uid: 8493 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,36.5 parent: 4812 - uid: 8494 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,36.5 parent: 4812 - uid: 8495 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,37.5 parent: 4812 - uid: 8496 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,38.5 parent: 4812 - uid: 8497 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,38.5 parent: 4812 - uid: 8498 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,30.5 parent: 4812 - uid: 8499 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,33.5 parent: 4812 - uid: 8500 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -26.5,34.5 parent: 4812 - uid: 8501 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,34.5 parent: 4812 - uid: 8502 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,34.5 parent: 4812 - uid: 8503 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,34.5 parent: 4812 - uid: 8504 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,35.5 parent: 4812 - uid: 8505 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,35.5 parent: 4812 - uid: 8506 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,37.5 parent: 4812 - uid: 8507 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,37.5 parent: 4812 - uid: 8508 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,38.5 parent: 4812 - uid: 8509 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,38.5 parent: 4812 - uid: 8510 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,38.5 parent: 4812 - uid: 8511 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -26.5,38.5 parent: 4812 - uid: 8512 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,39.5 parent: 4812 - uid: 8513 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,39.5 parent: 4812 - uid: 8514 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -26.5,39.5 parent: 4812 - uid: 8515 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,39.5 parent: 4812 - uid: 8516 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -30.5,34.5 parent: 4812 - uid: 8517 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,34.5 parent: 4812 - uid: 8518 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,34.5 parent: 4812 - uid: 8519 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,34.5 parent: 4812 - uid: 8520 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,34.5 parent: 4812 - uid: 8521 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,35.5 parent: 4812 - uid: 8522 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,36.5 parent: 4812 - uid: 8523 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,36.5 parent: 4812 - uid: 8524 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,35.5 parent: 4812 - uid: 8525 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,35.5 parent: 4812 - uid: 9621 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -42.5,-34.5 parent: 4812 - uid: 9622 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -42.5,-33.5 parent: 4812 - uid: 9623 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -43.5,-33.5 parent: 4812 - uid: 9624 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -43.5,-32.5 parent: 4812 - uid: 9630 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-29.5 parent: 4812 - uid: 9631 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-30.5 parent: 4812 - uid: 9632 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -47.5,-29.5 parent: 4812 - uid: 9633 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-28.5 parent: 4812 - uid: 9637 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-26.5 parent: 4812 - uid: 9638 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,-38.5 parent: 4812 - uid: 9639 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,-39.5 parent: 4812 - uid: 9640 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,-39.5 parent: 4812 - uid: 9641 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,-39.5 parent: 4812 - uid: 9642 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-39.5 parent: 4812 - uid: 9643 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-40.5 parent: 4812 - uid: 10417 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -53.5,-20.5 parent: 4812 - uid: 10418 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -52.5,-20.5 parent: 4812 - uid: 10419 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,-20.5 parent: 4812 - uid: 10420 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,-20.5 parent: 4812 - uid: 10421 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -53.5,-19.5 parent: 4812 - uid: 10422 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,-19.5 parent: 4812 - uid: 10423 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,-19.5 parent: 4812 - uid: 10424 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,-18.5 parent: 4812 - uid: 10425 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,-18.5 parent: 4812 - uid: 10426 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -56.5,-18.5 parent: 4812 - uid: 10427 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -56.5,-17.5 parent: 4812 - uid: 10428 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -56.5,-16.5 parent: 4812 - uid: 10429 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -56.5,-15.5 parent: 4812 - uid: 10430 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,-15.5 parent: 4812 - uid: 10431 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,-15.5 parent: 4812 - uid: 10432 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -53.5,-15.5 parent: 4812 - uid: 10433 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -52.5,-15.5 parent: 4812 - uid: 10434 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,-15.5 parent: 4812 - uid: 10435 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,-15.5 parent: 4812 - uid: 10436 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -49.5,-15.5 parent: 4812 - uid: 10437 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -48.5,-15.5 parent: 4812 - uid: 10438 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -47.5,-15.5 parent: 4812 - uid: 10439 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -47.5,-16.5 parent: 4812 - uid: 10443 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,-16.5 parent: 4812 - uid: 10444 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -52.5,-16.5 parent: 4812 - uid: 10447 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,-16.5 parent: 4812 - uid: 10448 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,-17.5 parent: 4812 - uid: 10449 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,-17.5 parent: 4812 - uid: 10452 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,-17.5 parent: 4812 - uid: 10453 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,-17.5 parent: 4812 - uid: 10454 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -49.5,-17.5 parent: 4812 - uid: 10455 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -48.5,-17.5 parent: 4812 - uid: 10456 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -47.5,-17.5 parent: 4812 - uid: 10457 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,-18.5 parent: 4812 - uid: 10458 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,-18.5 parent: 4812 - uid: 10460 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,29.5 parent: 4812 - uid: 10461 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,-19.5 parent: 4812 - uid: 10462 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,-19.5 parent: 4812 - uid: 10463 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,28.5 parent: 4812 - uid: 10464 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -56.5,-14.5 parent: 4812 - uid: 10465 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -56.5,-13.5 parent: 4812 - uid: 10466 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -56.5,-12.5 parent: 4812 - uid: 10467 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -56.5,-11.5 parent: 4812 - uid: 10468 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -56.5,-10.5 parent: 4812 - uid: 10469 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -56.5,-9.5 parent: 4812 - uid: 10470 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -56.5,-8.5 parent: 4812 - uid: 10472 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -57.5,-10.5 parent: 4812 - uid: 10473 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -57.5,-11.5 parent: 4812 - uid: 10474 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,28.5 parent: 4812 - uid: 10475 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -57.5,-13.5 parent: 4812 - uid: 10476 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -57.5,-14.5 parent: 4812 - uid: 10477 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -57.5,-15.5 parent: 4812 - uid: 10478 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -58.5,-13.5 parent: 4812 - uid: 10479 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -58.5,-12.5 parent: 4812 - uid: 10480 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -58.5,-11.5 parent: 4812 - uid: 10481 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -58.5,-10.5 parent: 4812 - uid: 10482 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -58.5,-9.5 parent: 4812 - uid: 10483 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -56.5,-7.5 parent: 4812 - uid: 10484 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -57.5,-8.5 parent: 4812 - uid: 10485 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -58.5,-8.5 parent: 4812 - uid: 10486 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -49.5,-2.5 parent: 4812 - uid: 10926 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,14.5 parent: 4812 - uid: 10927 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,15.5 parent: 4812 - uid: 10928 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,16.5 parent: 4812 - uid: 10929 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,17.5 parent: 4812 - uid: 10941 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,24.5 parent: 4812 - uid: 10942 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,25.5 parent: 4812 - uid: 10943 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,26.5 parent: 4812 - uid: 10944 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,27.5 parent: 4812 - uid: 10945 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,24.5 parent: 4812 - uid: 10947 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,26.5 parent: 4812 - uid: 10948 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,27.5 parent: 4812 - uid: 10949 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,28.5 parent: 4812 - uid: 10950 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,29.5 parent: 4812 - uid: 10951 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,30.5 parent: 4812 - uid: 10952 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,31.5 parent: 4812 - uid: 10953 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,32.5 parent: 4812 - uid: 10954 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,33.5 parent: 4812 - uid: 10955 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,32.5 parent: 4812 - uid: 10956 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,31.5 parent: 4812 - uid: 10957 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,30.5 parent: 4812 - uid: 10963 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,24.5 parent: 4812 - uid: 10965 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,15.5 parent: 4812 - uid: 10966 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,16.5 parent: 4812 - uid: 10967 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,17.5 parent: 4812 - uid: 10969 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,19.5 parent: 4812 - uid: 10970 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,20.5 parent: 4812 - uid: 10971 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,21.5 parent: 4812 - uid: 10972 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,22.5 parent: 4812 - uid: 10973 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,23.5 parent: 4812 - uid: 10974 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,24.5 parent: 4812 - uid: 10975 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,24.5 parent: 4812 - uid: 10977 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,24.5 parent: 4812 - uid: 10982 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,23.5 parent: 4812 - uid: 10983 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,18.5 parent: 4812 - uid: 10984 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,31.5 parent: 4812 - uid: 10986 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,33.5 parent: 4812 - uid: 10987 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,33.5 parent: 4812 - uid: 10988 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,33.5 parent: 4812 - uid: 10990 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,32.5 parent: 4812 - uid: 10991 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,31.5 parent: 4812 - uid: 10992 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,30.5 parent: 4812 - uid: 10993 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,29.5 parent: 4812 - uid: 10994 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,28.5 parent: 4812 - uid: 10995 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,27.5 parent: 4812 - uid: 10999 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,26.5 parent: 4812 - uid: 11000 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,27.5 parent: 4812 - uid: 11001 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,28.5 parent: 4812 - uid: 11002 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,29.5 parent: 4812 - uid: 11003 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,30.5 parent: 4812 - uid: 11004 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,31.5 parent: 4812 - uid: 11005 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,32.5 parent: 4812 - uid: 11009 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,17.5 parent: 4812 - uid: 11010 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,18.5 parent: 4812 - uid: 11011 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,19.5 parent: 4812 - uid: 11012 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,20.5 parent: 4812 - uid: 11013 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,21.5 parent: 4812 - uid: 11014 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,24.5 parent: 4812 - uid: 11016 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,24.5 parent: 4812 - uid: 11017 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,25.5 parent: 4812 - uid: 11018 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,26.5 parent: 4812 - uid: 11019 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,21.5 parent: 4812 - uid: 11020 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,22.5 parent: 4812 - uid: 11021 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,23.5 parent: 4812 - uid: 11022 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,24.5 parent: 4812 - uid: 11023 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,25.5 parent: 4812 - uid: 11024 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,26.5 parent: 4812 - uid: 11025 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,25.5 parent: 4812 - uid: 11026 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,26.5 parent: 4812 - uid: 11027 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,27.5 parent: 4812 - uid: 11028 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,28.5 parent: 4812 - uid: 11029 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,29.5 parent: 4812 - uid: 11616 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 36.5,-30.5 parent: 4812 - uid: 11621 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 36.5,-39.5 parent: 4812 - uid: 11622 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 34.5,-41.5 parent: 4812 - uid: 11623 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 33.5,-41.5 parent: 4812 - uid: 11624 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 32.5,-41.5 parent: 4812 - uid: 11625 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 31.5,-41.5 parent: 4812 - uid: 11626 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,-39.5 parent: 4812 - uid: 11627 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 25.5,-39.5 parent: 4812 - uid: 11628 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,-40.5 parent: 4812 - uid: 11629 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-40.5 parent: 4812 - uid: 11630 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-41.5 parent: 4812 - uid: 11631 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-42.5 parent: 4812 - uid: 11632 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,-40.5 parent: 4812 - uid: 11633 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,-41.5 parent: 4812 - uid: 11634 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,-40.5 parent: 4812 - uid: 11635 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,-42.5 parent: 4812 - uid: 11636 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-42.5 parent: 4812 - uid: 11637 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,-43.5 parent: 4812 - uid: 11638 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-43.5 parent: 4812 - uid: 11639 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,-43.5 parent: 4812 - uid: 11640 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,-44.5 parent: 4812 - uid: 11641 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-44.5 parent: 4812 - uid: 11643 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-44.5 parent: 4812 - uid: 11644 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-44.5 parent: 4812 - uid: 11645 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,-44.5 parent: 4812 - uid: 11647 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,-45.5 parent: 4812 - uid: 11648 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,-45.5 parent: 4812 - uid: 11649 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-45.5 parent: 4812 - uid: 11650 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-45.5 parent: 4812 - uid: 11651 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,-45.5 parent: 4812 - uid: 11652 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-45.5 parent: 4812 - uid: 11653 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,-46.5 parent: 4812 - uid: 11654 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-46.5 parent: 4812 - uid: 11655 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-46.5 parent: 4812 - uid: 11656 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,-46.5 parent: 4812 - uid: 11657 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-46.5 parent: 4812 - uid: 11658 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,-46.5 parent: 4812 - uid: 11659 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,-44.5 parent: 4812 - uid: 11660 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-43.5 parent: 4812 - uid: 11663 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,-38.5 parent: 4812 - uid: 11664 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,-41.5 parent: 4812 - uid: 11665 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,-42.5 parent: 4812 - uid: 11666 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,-43.5 parent: 4812 - uid: 11667 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,-44.5 parent: 4812 - uid: 11668 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 25.5,-44.5 parent: 4812 - uid: 11669 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 25.5,-43.5 parent: 4812 - uid: 11670 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 25.5,-42.5 parent: 4812 - uid: 11679 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 25.5,-38.5 parent: 4812 - uid: 11680 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,-43.5 parent: 4812 - uid: 11681 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,-44.5 parent: 4812 - uid: 11682 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 27.5,-44.5 parent: 4812 - uid: 11683 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 27.5,-43.5 parent: 4812 - uid: 11684 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,-38.5 parent: 4812 - uid: 11686 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 28.5,-38.5 parent: 4812 - uid: 11689 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 28.5,-43.5 parent: 4812 - uid: 11690 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 28.5,-42.5 parent: 4812 - uid: 11691 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,-40.5 parent: 4812 - uid: 11695 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 29.5,-42.5 parent: 4812 - uid: 11696 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 30.5,-42.5 parent: 4812 - uid: 11697 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 29.5,-43.5 parent: 4812 - uid: 11698 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 30.5,-43.5 parent: 4812 - uid: 11699 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 31.5,-42.5 parent: 4812 - uid: 11700 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 32.5,-42.5 parent: 4812 - uid: 11701 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 33.5,-42.5 parent: 4812 - uid: 11702 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 36.5,-40.5 parent: 4812 - uid: 11703 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 37.5,-39.5 parent: 4812 - uid: 11704 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 38.5,-38.5 parent: 4812 - uid: 11705 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 35.5,-41.5 parent: 4812 - uid: 12144 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -48.5,-25.5 parent: 4812 @@ -10685,8 +9418,6 @@ entities: entities: - uid: 12146 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -52.5,-3.5 parent: 4812 @@ -11056,8 +9787,6 @@ entities: rot: 3.141592653589793 rad pos: -29.5,1.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: Beaker entities: - uid: 9030 @@ -11293,22 +10022,16 @@ entities: entities: - uid: 729 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,18.5 parent: 4812 - uid: 771 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,18.5 parent: 4812 - uid: 2864 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,24.5 parent: 4812 @@ -11317,8 +10040,6 @@ entities: - 2938 - uid: 2866 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,28.5 parent: 4812 @@ -11327,8 +10048,6 @@ entities: - 2938 - uid: 5573 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,-30.5 parent: 4812 @@ -11337,8 +10056,6 @@ entities: - 6690 - uid: 5574 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,-29.5 parent: 4812 @@ -11347,8 +10064,6 @@ entities: - 6690 - uid: 5575 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,-28.5 parent: 4812 @@ -11357,8 +10072,6 @@ entities: - 6690 - uid: 5794 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,-27.5 parent: 4812 @@ -11367,8 +10080,6 @@ entities: - 6218 - uid: 5795 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,-26.5 parent: 4812 @@ -11377,8 +10088,6 @@ entities: - 6218 - uid: 5796 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,-25.5 parent: 4812 @@ -11387,8 +10096,6 @@ entities: - 6218 - uid: 9496 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -44.5,18.5 parent: 4812 @@ -11402,22 +10109,30 @@ entities: - type: Transform pos: 27.5,-0.5 parent: 4812 + - type: SpamEmitSound + enabled: False - uid: 5026 components: - type: Transform rot: -1.5707963267948966 rad pos: -9.5,-47.5 parent: 4812 + - type: SpamEmitSound + enabled: False - uid: 8399 components: - type: Transform pos: -26.5,32.5 parent: 4812 + - type: SpamEmitSound + enabled: False - uid: 10853 components: - type: Transform pos: -22.5,5.5 parent: 4812 + - type: SpamEmitSound + enabled: False - proto: BookAtmosAirAlarms entities: - uid: 865 @@ -11446,33 +10161,29 @@ entities: - type: Transform pos: -25.436514,-18.48842 parent: 4812 -- proto: BookDetective +- proto: BookRandom entities: - - uid: 5387 + - uid: 7161 components: - type: Transform - pos: 17.568647,-11.417019 + pos: -30.557493,-18.387486 parent: 4812 -- proto: BookEscalation +- proto: BookRandomStory entities: - - uid: 12421 + - uid: 5387 components: - type: Transform - pos: -30.59653,-19.308746 + pos: 17.568647,-11.417019 parent: 4812 -- proto: BookEscalationSecurity - entities: - uid: 10446 components: - type: Transform pos: -30.424656,-19.480621 parent: 4812 -- proto: BookRandom - entities: - - uid: 7161 + - uid: 12421 components: - type: Transform - pos: -30.557493,-18.387486 + pos: -30.59653,-19.308746 parent: 4812 - proto: BooksBag entities: @@ -11485,78 +10196,56 @@ entities: entities: - uid: 1952 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,25.5 parent: 4812 - uid: 5374 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,-18.5 parent: 4812 - uid: 7000 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-32.5 parent: 4812 - uid: 7001 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-36.5 parent: 4812 - uid: 7005 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,-38.5 parent: 4812 - uid: 7130 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-22.5 parent: 4812 - uid: 7131 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-21.5 parent: 4812 - uid: 7172 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,-39.5 parent: 4812 - uid: 8391 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,32.5 parent: 4812 - uid: 8392 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,29.5 parent: 4812 - uid: 11352 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 36.5,-32.5 parent: 4812 @@ -11564,113 +10253,81 @@ entities: entities: - uid: 4816 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-20.5 parent: 4812 - uid: 4817 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-18.5 parent: 4812 - uid: 4818 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,-18.5 parent: 4812 - uid: 4819 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,-20.5 parent: 4812 - uid: 4820 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-20.5 parent: 4812 - uid: 4821 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,-20.5 parent: 4812 - uid: 4822 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-18.5 parent: 4812 - uid: 4823 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -26.5,-20.5 parent: 4812 - uid: 4824 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -26.5,-18.5 parent: 4812 - uid: 4825 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,-18.5 parent: 4812 - uid: 4835 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-14.5 parent: 4812 - uid: 4836 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,-14.5 parent: 4812 - uid: 4837 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,-16.5 parent: 4812 - uid: 4839 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,-19.5 parent: 4812 - uid: 4840 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,-18.5 parent: 4812 - uid: 4841 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,-17.5 parent: 4812 @@ -26916,8 +25573,6 @@ entities: - type: Transform pos: -53.5,5.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: Carpet entities: - uid: 1739 @@ -29683,18 +28338,6 @@ entities: - type: Transform pos: -17.5785,-25.512428 parent: 4812 -- proto: chem_master - entities: - - uid: 6606 - components: - - type: Transform - pos: -8.5,-15.5 - parent: 4812 - - uid: 6607 - components: - - type: Transform - pos: -12.5,-17.5 - parent: 4812 - proto: ChemDispenser entities: - uid: 6604 @@ -29726,6 +28369,18 @@ entities: - type: Transform pos: -10.5,-18.5 parent: 4812 +- proto: ChemMaster + entities: + - uid: 6606 + components: + - type: Transform + pos: -8.5,-15.5 + parent: 4812 + - uid: 6607 + components: + - type: Transform + pos: -12.5,-17.5 + parent: 4812 - proto: ChessBoard entities: - uid: 11880 @@ -31862,25 +30517,13 @@ entities: - type: Transform pos: -44.4085,-23.673323 parent: 4812 -- proto: ClothingHeadHatFlowerCrown +- proto: ClothingHeadHatFlowerWreath entities: - uid: 7254 components: - type: Transform pos: -24.594517,-34.532703 parent: 4812 -- proto: ClothingHeadHatHairflower - entities: - - uid: 2716 - components: - - type: Transform - pos: -5.180887,24.379204 - parent: 4812 - - uid: 12475 - components: - - type: Transform - pos: -24.401733,-34.40146 - parent: 4812 - proto: ClothingHeadHatHardhatOrange entities: - uid: 12119 @@ -31920,8 +30563,6 @@ entities: entities: - uid: 10924 components: - - type: MetaData - flags: InContainer - type: Transform parent: 10921 - type: Physics @@ -32159,8 +30800,6 @@ entities: entities: - uid: 10922 components: - - type: MetaData - flags: InContainer - type: Transform parent: 10921 - type: Physics @@ -32283,8 +30922,6 @@ entities: entities: - uid: 6765 components: - - type: MetaData - flags: InContainer - type: Transform parent: 3441 - type: Physics @@ -32481,8 +31118,6 @@ entities: entities: - uid: 10923 components: - - type: MetaData - flags: InContainer - type: Transform parent: 10921 - type: Physics @@ -33904,6 +32539,9 @@ entities: - type: Transform pos: -3.5,26.5 parent: 4812 + - type: SingletonDeviceNetServer + active: False + available: False - proto: Crowbar entities: - uid: 3469 @@ -33966,15 +32604,11 @@ entities: - type: Transform pos: -15.5,-25.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 7219 components: - type: Transform pos: -13.5,-25.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: CryoxadoneBeakerSmall entities: - uid: 3269 @@ -37321,8 +35955,6 @@ entities: entities: - uid: 4992 components: - - type: MetaData - flags: InContainer - type: Transform parent: 4991 - type: Physics @@ -37331,8 +35963,6 @@ entities: entities: - uid: 6663 components: - - type: MetaData - flags: InContainer - type: Transform parent: 6662 - type: Physics @@ -37341,8 +35971,6 @@ entities: entities: - uid: 7268 components: - - type: MetaData - flags: InContainer - type: Transform parent: 7267 - type: Physics @@ -37351,8 +35979,6 @@ entities: entities: - uid: 7291 components: - - type: MetaData - flags: InContainer - type: Transform parent: 7290 - type: Physics @@ -37361,8 +35987,6 @@ entities: entities: - uid: 331 components: - - type: MetaData - flags: InContainer - type: Transform parent: 330 - type: Physics @@ -37371,8 +35995,6 @@ entities: entities: - uid: 7248 components: - - type: MetaData - flags: InContainer - type: Transform parent: 7247 - type: Physics @@ -37381,8 +36003,6 @@ entities: entities: - uid: 7269 components: - - type: MetaData - flags: InContainer - type: Transform parent: 7267 - type: Physics @@ -37613,8 +36233,6 @@ entities: - type: DeviceList devices: - 5039 - - type: AtmosDevice - joinedGrid: 4812 - uid: 4979 components: - type: Transform @@ -37627,16 +36245,12 @@ entities: - 5047 - 6553 - 8806 - - type: AtmosDevice - joinedGrid: 4812 - uid: 6781 components: - type: Transform rot: -1.5707963267948966 rad pos: -7.5,-28.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 8804 components: - type: Transform @@ -37650,8 +36264,6 @@ entities: - 4920 - 8838 - 8836 - - type: AtmosDevice - joinedGrid: 4812 - uid: 10750 components: - type: Transform @@ -37666,8 +36278,6 @@ entities: - 10754 - 10755 - 10756 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12180 components: - type: Transform @@ -37682,8 +36292,6 @@ entities: - 10754 - 10755 - 10756 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12187 components: - type: Transform @@ -37697,8 +36305,6 @@ entities: - 12189 - 12188 - 12185 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12191 components: - type: Transform @@ -37709,8 +36315,6 @@ entities: devices: - 12192 - 8691 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12194 components: - type: Transform @@ -37728,8 +36332,6 @@ entities: - 12189 - 12197 - 12196 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12199 components: - type: Transform @@ -37741,8 +36343,6 @@ entities: - 12200 - 12196 - 12197 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12203 components: - type: Transform @@ -37759,8 +36359,6 @@ entities: - 8155 - 12205 - 12204 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12207 components: - type: Transform @@ -37771,8 +36369,6 @@ entities: - 12208 - 12204 - 12205 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12210 components: - type: Transform @@ -37785,8 +36381,6 @@ entities: - 12212 - 7782 - 7783 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12217 components: - type: Transform @@ -37797,8 +36391,6 @@ entities: devices: - 12216 - 12212 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12221 components: - type: Transform @@ -37811,8 +36403,6 @@ entities: - 2693 - 2695 - 12222 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12224 components: - type: Transform @@ -37825,8 +36415,6 @@ entities: - 2782 - 2783 - 12225 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12229 components: - type: Transform @@ -37838,8 +36426,6 @@ entities: - 12230 - 2231 - 1928 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12233 components: - type: Transform @@ -37851,8 +36437,6 @@ entities: - 12231 - 2473 - 2472 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12235 components: - type: Transform @@ -37866,8 +36450,6 @@ entities: - 2472 - 2231 - 1928 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12236 components: - type: Transform @@ -37881,8 +36463,6 @@ entities: - 2472 - 2231 - 1928 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12238 components: - type: Transform @@ -37894,8 +36474,6 @@ entities: - 2476 - 963 - 12239 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12241 components: - type: Transform @@ -37905,8 +36483,6 @@ entities: devices: - 12242 - 1927 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12244 components: - type: Transform @@ -37921,8 +36497,6 @@ entities: - 963 - 2783 - 2782 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12246 components: - type: Transform @@ -37935,8 +36509,6 @@ entities: - 2853 - 12247 - 3257 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12250 components: - type: Transform @@ -37952,8 +36524,6 @@ entities: - 2853 - 2787 - 2786 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12253 components: - type: Transform @@ -37964,8 +36534,6 @@ entities: devices: - 3257 - 12254 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12273 components: - type: Transform @@ -37979,8 +36547,6 @@ entities: - 12274 - 4122 - 4117 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12276 components: - type: Transform @@ -37991,8 +36557,6 @@ entities: - 12277 - 4424 - 4425 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12280 components: - type: Transform @@ -38004,8 +36568,6 @@ entities: - 12279 - 4425 - 4424 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12286 components: - type: Transform @@ -38019,8 +36581,6 @@ entities: - 4426 - 6415 - 6414 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12290 components: - type: Transform @@ -38038,8 +36598,6 @@ entities: - 6414 - 6415 - 12288 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12291 components: - type: Transform @@ -38052,8 +36610,6 @@ entities: - 12292 - 6494 - 6495 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12294 components: - type: Transform @@ -38067,8 +36623,6 @@ entities: - 6500 - 6499 - 12295 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12301 components: - type: Transform @@ -38090,8 +36644,6 @@ entities: - 353 - 352 - 350 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12305 components: - type: Transform @@ -38108,8 +36660,6 @@ entities: - 352 - 350 - 12306 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12310 components: - type: Transform @@ -38121,8 +36671,6 @@ entities: - 782 - 783 - 784 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12312 components: - type: Transform @@ -38135,8 +36683,6 @@ entities: - 1940 - 1939 - 1938 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12314 components: - type: Transform @@ -38168,8 +36714,6 @@ entities: - 6655 - 4980 - 7198 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12317 components: - type: Transform @@ -38188,8 +36732,6 @@ entities: - 8591 - 8758 - 8770 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12320 components: - type: Transform @@ -38201,8 +36743,6 @@ entities: - 12321 - 5072 - 5071 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12342 components: - type: Transform @@ -38214,8 +36754,6 @@ entities: - 6585 - 6584 - 12343 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12348 components: - type: Transform @@ -38227,8 +36765,6 @@ entities: - 12347 - 5791 - 5792 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12354 components: - type: Transform @@ -38240,8 +36776,6 @@ entities: - 5600 - 5599 - 12355 - - type: AtmosDevice - joinedGrid: 4812 - proto: FireAxeCabinetFilled entities: - uid: 6784 @@ -39705,6 +38239,18 @@ entities: - type: Transform pos: 9.469537,-39.368214 parent: 4812 +- proto: FoodPoppy + entities: + - uid: 2716 + components: + - type: Transform + pos: -5.180887,24.379204 + parent: 4812 + - uid: 12475 + components: + - type: Transform + pos: -24.401733,-34.40146 + parent: 4812 - proto: FoodSnackCheesie entities: - uid: 1775 @@ -39763,8 +38309,6 @@ entities: rot: 1.5707963267948966 rad pos: -13.5,-27.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - proto: GasFilterFlipped @@ -39774,8 +38318,6 @@ entities: - type: Transform pos: -47.5,1.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 9170 @@ -39783,36 +38325,26 @@ entities: - type: Transform pos: -47.5,3.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9171 components: - type: Transform pos: -47.5,5.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9172 components: - type: Transform pos: -47.5,7.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9173 components: - type: Transform pos: -47.5,9.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9174 components: - type: Transform pos: -47.5,11.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: GasMinerCarbonDioxide entities: - uid: 9452 @@ -39820,8 +38352,6 @@ entities: - type: Transform pos: -52.5,5.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: GasMinerNitrogen entities: - uid: 9449 @@ -39829,8 +38359,6 @@ entities: - type: Transform pos: -52.5,1.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: GasMinerOxygen entities: - uid: 9451 @@ -39838,8 +38366,6 @@ entities: - type: Transform pos: -52.5,3.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: GasMinerWaterVapor entities: - uid: 9454 @@ -39847,8 +38373,6 @@ entities: - type: Transform pos: -52.5,7.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: GasMixerFlipped entities: - uid: 8550 @@ -39856,8 +38380,6 @@ entities: - type: Transform pos: -45.5,5.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 8552 components: - type: Transform @@ -39867,8 +38389,6 @@ entities: - type: GasMixer inletTwoConcentration: 0.22000003 inletOneConcentration: 0.78 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#03FDC3FF' - uid: 9236 @@ -39876,29 +38396,21 @@ entities: - type: Transform pos: -45.5,8.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9237 components: - type: Transform pos: -45.5,10.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9247 components: - type: Transform pos: -45.5,6.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9261 components: - type: Transform pos: -45.5,12.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: GasOutletInjector entities: - uid: 4002 @@ -39907,56 +38419,42 @@ entities: rot: 1.5707963267948966 rad pos: 23.5,-30.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 4445 components: - type: Transform rot: 1.5707963267948966 rad pos: -51.5,1.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 4446 components: - type: Transform rot: 1.5707963267948966 rad pos: -51.5,3.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 4478 components: - type: Transform rot: 1.5707963267948966 rad pos: -51.5,5.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 4479 components: - type: Transform rot: 1.5707963267948966 rad pos: -51.5,7.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 4497 components: - type: Transform rot: 1.5707963267948966 rad pos: -51.5,9.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 4826 components: - type: Transform rot: 1.5707963267948966 rad pos: -51.5,11.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: GasPassiveGate entities: - uid: 5801 @@ -39965,8 +38463,6 @@ entities: rot: 3.141592653589793 rad pos: 12.5,-19.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 8979 @@ -39975,8 +38471,6 @@ entities: rot: -1.5707963267948966 rad pos: -31.5,-33.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - proto: GasPassiveVent @@ -39987,47 +38481,35 @@ entities: rot: 3.141592653589793 rad pos: 6.5,-7.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 863 components: - type: Transform rot: 3.141592653589793 rad pos: 7.5,-7.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 3817 components: - type: Transform rot: -1.5707963267948966 rad pos: 17.5,46.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 5596 components: - type: Transform rot: 1.5707963267948966 rad pos: 23.5,-28.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9005 components: - type: Transform rot: 3.141592653589793 rad pos: -40.5,-37.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9168 components: - type: Transform pos: -49.5,-0.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 9199 @@ -40036,69 +38518,51 @@ entities: rot: 3.141592653589793 rad pos: -53.5,1.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9200 components: - type: Transform rot: 3.141592653589793 rad pos: -53.5,3.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9201 components: - type: Transform rot: 3.141592653589793 rad pos: -53.5,5.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9202 components: - type: Transform rot: 3.141592653589793 rad pos: -53.5,7.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9203 components: - type: Transform rot: 3.141592653589793 rad pos: -53.5,9.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9204 components: - type: Transform rot: 3.141592653589793 rad pos: -53.5,11.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9264 components: - type: Transform pos: -47.5,14.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9494 components: - type: Transform pos: -45.5,16.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9495 components: - type: Transform pos: -43.5,16.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: GasPipeBend entities: - uid: 560 @@ -52101,16 +50565,12 @@ entities: - type: Transform pos: -29.5,2.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 3467 components: - type: Transform rot: 1.5707963267948966 rad pos: -34.5,-2.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 3710 @@ -52119,8 +50579,6 @@ entities: rot: 1.5707963267948966 rad pos: -34.5,-0.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 3711 @@ -52129,8 +50587,6 @@ entities: rot: 1.5707963267948966 rad pos: -34.5,-1.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 3712 @@ -52139,8 +50595,6 @@ entities: rot: 1.5707963267948966 rad pos: -34.5,-3.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 3839 @@ -52149,8 +50603,6 @@ entities: rot: -1.5707963267948966 rad pos: 15.5,44.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 5593 @@ -52159,40 +50611,30 @@ entities: rot: -1.5707963267948966 rad pos: 29.5,-28.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 5594 components: - type: Transform rot: -1.5707963267948966 rad pos: 29.5,-30.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 8839 components: - type: Transform rot: 3.141592653589793 rad pos: -12.5,-28.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9037 components: - type: Transform rot: 3.141592653589793 rad pos: -33.5,-37.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9548 components: - type: Transform rot: -1.5707963267948966 rad pos: -41.5,6.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#947507FF' - uid: 9549 @@ -52201,8 +50643,6 @@ entities: rot: -1.5707963267948966 rad pos: -41.5,7.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#947507FF' - uid: 9550 @@ -52211,8 +50651,6 @@ entities: rot: -1.5707963267948966 rad pos: -41.5,8.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#947507FF' - proto: GasPressurePump @@ -52223,8 +50661,6 @@ entities: rot: 1.5707963267948966 rad pos: 15.5,46.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 4929 @@ -52234,8 +50670,6 @@ entities: - type: Transform pos: -12.5,-25.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 5583 @@ -52244,24 +50678,18 @@ entities: rot: -1.5707963267948966 rad pos: 25.5,-30.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 5584 components: - type: Transform rot: 1.5707963267948966 rad pos: 25.5,-28.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 8773 components: - type: Transform rot: -1.5707963267948966 rad pos: -39.5,1.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 9115 @@ -52270,16 +50698,12 @@ entities: rot: 1.5707963267948966 rad pos: -47.5,2.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9131 components: - type: Transform rot: 1.5707963267948966 rad pos: -39.5,2.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 9206 @@ -52288,47 +50712,35 @@ entities: rot: 1.5707963267948966 rad pos: -47.5,4.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9212 components: - type: Transform rot: 1.5707963267948966 rad pos: -47.5,6.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9218 components: - type: Transform rot: 1.5707963267948966 rad pos: -47.5,8.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9224 components: - type: Transform rot: 1.5707963267948966 rad pos: -47.5,10.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9230 components: - type: Transform rot: 1.5707963267948966 rad pos: -47.5,12.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9513 components: - type: Transform pos: -43.5,12.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#947507FF' - uid: 9543 @@ -52336,8 +50748,6 @@ entities: - type: Transform pos: -42.5,4.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - proto: GasThermoMachineFreezer @@ -52347,30 +50757,22 @@ entities: - type: Transform pos: 7.5,-5.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 5803 components: - type: Transform pos: 12.5,-17.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 7245 components: - type: Transform rot: 3.141592653589793 rad pos: -14.5,-28.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9551 components: - type: Transform pos: -41.5,12.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: GasThermoMachineHeater entities: - uid: 9552 @@ -52378,8 +50780,6 @@ entities: - type: Transform pos: -41.5,11.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: GasValve entities: - uid: 5591 @@ -52388,16 +50788,12 @@ entities: rot: 1.5707963267948966 rad pos: 28.5,-30.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 5592 components: - type: Transform rot: 1.5707963267948966 rad pos: 28.5,-28.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9039 components: - type: Transform @@ -52406,8 +50802,6 @@ entities: parent: 4812 - type: GasValve open: False - - type: AtmosDevice - joinedGrid: 4812 - uid: 9164 components: - type: Transform @@ -52416,8 +50810,6 @@ entities: parent: 4812 - type: GasValve open: False - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 9544 @@ -52428,8 +50820,6 @@ entities: parent: 4812 - type: GasValve open: False - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#947507FF' - proto: GasVentPump @@ -52440,8 +50830,6 @@ entities: rot: 1.5707963267948966 rad pos: -27.5,-12.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 710 @@ -52450,8 +50838,6 @@ entities: rot: -1.5707963267948966 rad pos: -2.5,13.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 817 @@ -52460,8 +50846,6 @@ entities: rot: -1.5707963267948966 rad pos: -2.5,10.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 818 @@ -52470,8 +50854,6 @@ entities: rot: -1.5707963267948966 rad pos: -2.5,-7.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 835 @@ -52479,8 +50861,6 @@ entities: - type: Transform pos: 5.5,-1.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 838 @@ -52489,8 +50869,6 @@ entities: rot: 3.141592653589793 rad pos: 4.5,-6.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 846 @@ -52499,8 +50877,6 @@ entities: rot: 1.5707963267948966 rad pos: 2.5,7.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 847 @@ -52509,8 +50885,6 @@ entities: rot: -1.5707963267948966 rad pos: 6.5,7.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 848 @@ -52518,8 +50892,6 @@ entities: - type: Transform pos: -17.5,-6.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 849 @@ -52527,8 +50899,6 @@ entities: - type: Transform pos: -10.5,-6.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 864 @@ -52537,8 +50907,6 @@ entities: rot: 3.141592653589793 rad pos: -2.5,1.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 871 @@ -52547,8 +50915,6 @@ entities: rot: 1.5707963267948966 rad pos: -9.5,-0.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 877 @@ -52557,8 +50923,6 @@ entities: rot: 1.5707963267948966 rad pos: -9.5,4.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 1511 @@ -52566,8 +50930,6 @@ entities: - type: Transform pos: -22.5,-8.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 1685 @@ -52575,8 +50937,6 @@ entities: - type: Transform pos: -21.5,3.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 1770 @@ -52585,8 +50945,6 @@ entities: rot: 1.5707963267948966 rad pos: 11.5,19.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 1814 @@ -52595,8 +50953,6 @@ entities: rot: 3.141592653589793 rad pos: 8.5,16.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 1817 @@ -52605,8 +50961,6 @@ entities: rot: 3.141592653589793 rad pos: -0.5,18.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 1852 @@ -52614,8 +50968,6 @@ entities: - type: Transform pos: -3.5,23.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 2071 @@ -52624,8 +50976,6 @@ entities: rot: 3.141592653589793 rad pos: 8.5,24.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 2072 @@ -52633,8 +50983,6 @@ entities: - type: Transform pos: 8.5,29.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 2429 @@ -52643,8 +50991,6 @@ entities: rot: 1.5707963267948966 rad pos: -14.5,23.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 2430 @@ -52652,8 +50998,6 @@ entities: - type: Transform pos: -13.5,28.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 2443 @@ -52662,8 +51006,6 @@ entities: rot: 1.5707963267948966 rad pos: 2.5,29.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 2444 @@ -52672,8 +51014,6 @@ entities: rot: -1.5707963267948966 rad pos: -7.5,29.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 2445 @@ -52681,8 +51021,6 @@ entities: - type: Transform pos: -5.5,34.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 2446 @@ -52690,8 +51028,6 @@ entities: - type: Transform pos: 0.5,34.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 2474 @@ -52700,8 +51036,6 @@ entities: rot: -1.5707963267948966 rad pos: -7.5,22.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 2475 @@ -52710,8 +51044,6 @@ entities: rot: 1.5707963267948966 rad pos: 2.5,22.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 2842 @@ -52720,8 +51052,6 @@ entities: rot: -1.5707963267948966 rad pos: 22.5,27.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 2966 @@ -52730,8 +51060,6 @@ entities: rot: 1.5707963267948966 rad pos: 23.5,14.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 2969 @@ -52740,8 +51068,6 @@ entities: rot: -1.5707963267948966 rad pos: 26.5,14.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 2983 @@ -52749,8 +51075,6 @@ entities: - type: Transform pos: 15.5,29.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 3019 @@ -52759,8 +51083,6 @@ entities: rot: 3.141592653589793 rad pos: 14.5,25.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 3020 @@ -52769,8 +51091,6 @@ entities: rot: 3.141592653589793 rad pos: 19.5,25.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 3023 @@ -52779,8 +51099,6 @@ entities: rot: 1.5707963267948966 rad pos: 14.5,18.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 3024 @@ -52789,8 +51107,6 @@ entities: rot: 1.5707963267948966 rad pos: 14.5,20.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 3026 @@ -52799,8 +51115,6 @@ entities: rot: 3.141592653589793 rad pos: 15.5,13.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 3206 @@ -52809,8 +51123,6 @@ entities: rot: -1.5707963267948966 rad pos: 22.5,25.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 3708 @@ -52819,8 +51131,6 @@ entities: rot: -1.5707963267948966 rad pos: -31.5,-3.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 3781 @@ -52828,8 +51138,6 @@ entities: - type: Transform pos: -1.5,-34.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 3834 @@ -52838,8 +51146,6 @@ entities: rot: 1.5707963267948966 rad pos: 3.5,45.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 3835 @@ -52848,8 +51154,6 @@ entities: rot: 3.141592653589793 rad pos: 5.5,44.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 3838 @@ -52857,8 +51161,6 @@ entities: - type: Transform pos: 8.5,51.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 3841 @@ -52867,8 +51169,6 @@ entities: rot: -1.5707963267948966 rad pos: 15.5,45.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 3944 @@ -52877,8 +51177,6 @@ entities: rot: 3.141592653589793 rad pos: 9.5,43.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 4196 @@ -52886,8 +51184,6 @@ entities: - type: Transform pos: 30.5,3.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 4197 @@ -52896,8 +51192,6 @@ entities: rot: -1.5707963267948966 rad pos: 33.5,2.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 4198 @@ -52906,8 +51200,6 @@ entities: rot: -1.5707963267948966 rad pos: 33.5,0.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 4199 @@ -52916,8 +51208,6 @@ entities: rot: -1.5707963267948966 rad pos: 33.5,-5.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 4200 @@ -52926,8 +51216,6 @@ entities: rot: -1.5707963267948966 rad pos: 33.5,-7.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 4201 @@ -52936,8 +51224,6 @@ entities: rot: 3.141592653589793 rad pos: 30.5,-8.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 4203 @@ -52946,8 +51232,6 @@ entities: rot: 1.5707963267948966 rad pos: 28.5,-0.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 4231 @@ -52956,8 +51240,6 @@ entities: rot: 1.5707963267948966 rad pos: 22.5,4.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 4380 @@ -52966,8 +51248,6 @@ entities: rot: 3.141592653589793 rad pos: 19.5,-3.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 4440 @@ -52976,8 +51256,6 @@ entities: rot: 1.5707963267948966 rad pos: 11.5,2.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 4441 @@ -52986,8 +51264,6 @@ entities: rot: 1.5707963267948966 rad pos: 11.5,-8.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 4444 @@ -52996,8 +51272,6 @@ entities: rot: 1.5707963267948966 rad pos: 24.5,-1.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 4464 @@ -53006,8 +51280,6 @@ entities: rot: -1.5707963267948966 rad pos: 15.5,8.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 4890 @@ -53016,8 +51288,6 @@ entities: rot: 3.141592653589793 rad pos: -18.5,-18.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 4941 @@ -53026,8 +51296,6 @@ entities: rot: -1.5707963267948966 rad pos: -15.5,-17.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 5033 @@ -53036,8 +51304,6 @@ entities: rot: 3.141592653589793 rad pos: -24.5,-27.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 5222 @@ -53046,8 +51312,6 @@ entities: rot: 3.141592653589793 rad pos: -10.5,-52.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 5225 @@ -53056,8 +51320,6 @@ entities: rot: 1.5707963267948966 rad pos: -11.5,-41.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 5697 @@ -53065,8 +51327,6 @@ entities: - type: Transform pos: 4.5,-17.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 5698 @@ -53075,8 +51335,6 @@ entities: rot: 3.141592653589793 rad pos: 5.5,-24.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 5714 @@ -53085,8 +51343,6 @@ entities: rot: 3.141592653589793 rad pos: 9.5,-27.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 5715 @@ -53095,8 +51351,6 @@ entities: rot: -1.5707963267948966 rad pos: 12.5,-25.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 5718 @@ -53105,8 +51359,6 @@ entities: rot: -1.5707963267948966 rad pos: 10.5,-19.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 5734 @@ -53115,8 +51367,6 @@ entities: rot: -1.5707963267948966 rad pos: 25.5,-20.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 5763 @@ -53124,8 +51374,6 @@ entities: - type: Transform pos: 27.5,-24.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 5764 @@ -53134,8 +51382,6 @@ entities: rot: -1.5707963267948966 rad pos: 33.5,-25.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 5802 @@ -53144,15 +51390,11 @@ entities: rot: -1.5707963267948966 rad pos: 13.5,-18.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 6416 components: - type: Transform pos: 8.5,-11.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 6419 @@ -53161,8 +51403,6 @@ entities: rot: 3.141592653589793 rad pos: -3.5,-13.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 6461 @@ -53170,8 +51410,6 @@ entities: - type: Transform pos: -1.5,-31.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 6471 @@ -53179,8 +51417,6 @@ entities: - type: Transform pos: -2.5,-28.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 6554 @@ -53188,8 +51424,6 @@ entities: - type: Transform pos: -16.5,-20.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 6686 @@ -53198,8 +51432,6 @@ entities: rot: 1.5707963267948966 rad pos: -21.5,-27.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 6821 @@ -53208,8 +51440,6 @@ entities: rot: 1.5707963267948966 rad pos: -26.5,-35.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 6840 @@ -53218,8 +51448,6 @@ entities: rot: 3.141592653589793 rad pos: -23.5,-36.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 6842 @@ -53227,8 +51455,6 @@ entities: - type: Transform pos: -19.5,-34.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 7087 @@ -53237,8 +51463,6 @@ entities: rot: 3.141592653589793 rad pos: -25.5,-17.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 7323 @@ -53247,8 +51471,6 @@ entities: rot: 3.141592653589793 rad pos: -10.5,-26.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 7379 @@ -53257,8 +51479,6 @@ entities: rot: 1.5707963267948966 rad pos: -10.5,-20.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 7380 @@ -53266,8 +51486,6 @@ entities: - type: Transform pos: -9.5,-17.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 7856 @@ -53275,8 +51493,6 @@ entities: - type: Transform pos: -26.5,30.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 7857 @@ -53285,8 +51501,6 @@ entities: rot: 3.141592653589793 rad pos: -26.5,23.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 7871 @@ -53295,8 +51509,6 @@ entities: rot: -1.5707963267948966 rad pos: -26.5,17.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 7872 @@ -53305,8 +51517,6 @@ entities: rot: -1.5707963267948966 rad pos: -26.5,20.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 7886 @@ -53315,8 +51525,6 @@ entities: rot: -1.5707963267948966 rad pos: -26.5,10.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 7905 @@ -53325,8 +51533,6 @@ entities: rot: 1.5707963267948966 rad pos: -36.5,10.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 7906 @@ -53334,8 +51540,6 @@ entities: - type: Transform pos: -35.5,15.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 7910 @@ -53344,8 +51548,6 @@ entities: rot: -1.5707963267948966 rad pos: -28.5,15.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 7911 @@ -53354,8 +51556,6 @@ entities: rot: -1.5707963267948966 rad pos: -28.5,12.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 7912 @@ -53364,8 +51564,6 @@ entities: rot: -1.5707963267948966 rad pos: -28.5,18.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 8238 @@ -53373,8 +51571,6 @@ entities: - type: Transform pos: -23.5,27.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 8240 @@ -53383,8 +51579,6 @@ entities: rot: -1.5707963267948966 rad pos: -22.5,25.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 8300 @@ -53393,8 +51587,6 @@ entities: rot: -1.5707963267948966 rad pos: -19.5,16.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 8306 @@ -53403,8 +51595,6 @@ entities: rot: -1.5707963267948966 rad pos: -22.5,17.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 8318 @@ -53413,8 +51603,6 @@ entities: rot: 3.141592653589793 rad pos: -13.5,16.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 8562 @@ -53422,8 +51610,6 @@ entities: - type: Transform pos: -18.5,11.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 8838 @@ -53432,8 +51618,6 @@ entities: rot: 3.141592653589793 rad pos: -16.5,-28.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 8991 @@ -53442,31 +51626,23 @@ entities: rot: 3.141592653589793 rad pos: -39.5,-34.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 8992 components: - type: Transform rot: 3.141592653589793 rad pos: -36.5,-37.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 8993 components: - type: Transform rot: 3.141592653589793 rad pos: -34.5,-34.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 10757 components: - type: Transform pos: -38.5,3.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 11962 @@ -53475,8 +51651,6 @@ entities: rot: -1.5707963267948966 rad pos: -32.5,-8.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 12027 @@ -53485,8 +51659,6 @@ entities: rot: -1.5707963267948966 rad pos: -42.5,-12.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 12028 @@ -53495,8 +51667,6 @@ entities: rot: 3.141592653589793 rad pos: -49.5,-13.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 12029 @@ -53505,8 +51675,6 @@ entities: rot: 1.5707963267948966 rad pos: -53.5,-12.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 12030 @@ -53514,8 +51682,6 @@ entities: - type: Transform pos: -49.5,-9.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 12032 @@ -53523,8 +51689,6 @@ entities: - type: Transform pos: -44.5,-6.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 12035 @@ -53533,8 +51697,6 @@ entities: rot: -1.5707963267948966 rad pos: -32.5,2.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 12037 @@ -53542,8 +51704,6 @@ entities: - type: Transform pos: -16.5,-11.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 12039 @@ -53552,8 +51712,6 @@ entities: rot: 3.141592653589793 rad pos: -23.5,7.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 12041 @@ -53562,8 +51720,6 @@ entities: rot: -1.5707963267948966 rad pos: -25.5,0.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - proto: GasVentScrubber @@ -53574,8 +51730,6 @@ entities: rot: 1.5707963267948966 rad pos: -2.5,14.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 814 @@ -53584,8 +51738,6 @@ entities: rot: -1.5707963267948966 rad pos: 4.5,-1.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 815 @@ -53594,8 +51746,6 @@ entities: rot: 1.5707963267948966 rad pos: -2.5,-6.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 816 @@ -53604,8 +51754,6 @@ entities: rot: 1.5707963267948966 rad pos: -2.5,9.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 857 @@ -53614,8 +51762,6 @@ entities: rot: 1.5707963267948966 rad pos: -17.5,-8.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 858 @@ -53623,8 +51769,6 @@ entities: - type: Transform pos: -10.5,-8.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 885 @@ -53633,8 +51777,6 @@ entities: rot: 1.5707963267948966 rad pos: -9.5,8.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 1512 @@ -53643,8 +51785,6 @@ entities: rot: 3.141592653589793 rad pos: -21.5,-7.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 1686 @@ -53653,8 +51793,6 @@ entities: rot: 3.141592653589793 rad pos: -21.5,0.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 1813 @@ -53663,8 +51801,6 @@ entities: rot: 3.141592653589793 rad pos: 6.5,16.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 1816 @@ -53673,8 +51809,6 @@ entities: rot: 3.141592653589793 rad pos: -4.5,18.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 1853 @@ -53682,8 +51816,6 @@ entities: - type: Transform pos: -1.5,23.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 2073 @@ -53691,8 +51823,6 @@ entities: - type: Transform pos: 6.5,29.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 2074 @@ -53701,8 +51831,6 @@ entities: rot: -1.5707963267948966 rad pos: 7.5,24.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 2439 @@ -53711,8 +51839,6 @@ entities: rot: 3.141592653589793 rad pos: -12.5,23.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 2440 @@ -53720,8 +51846,6 @@ entities: - type: Transform pos: -12.5,28.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 2441 @@ -53730,8 +51854,6 @@ entities: rot: 1.5707963267948966 rad pos: -8.5,26.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 2442 @@ -53740,8 +51862,6 @@ entities: rot: -1.5707963267948966 rad pos: 3.5,26.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 2447 @@ -53750,8 +51870,6 @@ entities: rot: 3.141592653589793 rad pos: -5.5,31.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 2448 @@ -53760,8 +51878,6 @@ entities: rot: 3.141592653589793 rad pos: 0.5,31.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 2963 @@ -53770,8 +51886,6 @@ entities: rot: -1.5707963267948966 rad pos: 22.5,14.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 3001 @@ -53779,8 +51893,6 @@ entities: - type: Transform pos: 16.5,29.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 3016 @@ -53789,8 +51901,6 @@ entities: rot: -1.5707963267948966 rad pos: 20.5,25.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 3017 @@ -53799,8 +51909,6 @@ entities: rot: 1.5707963267948966 rad pos: 15.5,25.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 3021 @@ -53809,8 +51917,6 @@ entities: rot: -1.5707963267948966 rad pos: 20.5,20.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 3022 @@ -53819,8 +51925,6 @@ entities: rot: -1.5707963267948966 rad pos: 20.5,18.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 3027 @@ -53829,8 +51933,6 @@ entities: rot: 3.141592653589793 rad pos: 19.5,13.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 3782 @@ -53838,8 +51940,6 @@ entities: - type: Transform pos: 10.5,20.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 3813 @@ -53848,8 +51948,6 @@ entities: rot: 3.141592653589793 rad pos: 7.5,44.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 3814 @@ -53858,8 +51956,6 @@ entities: rot: 3.141592653589793 rad pos: 11.5,43.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 3815 @@ -53867,8 +51963,6 @@ entities: - type: Transform pos: 12.5,51.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 3816 @@ -53877,8 +51971,6 @@ entities: rot: 3.141592653589793 rad pos: 13.5,45.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 4205 @@ -53887,8 +51979,6 @@ entities: rot: 3.141592653589793 rad pos: 28.5,-4.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 4214 @@ -53897,8 +51987,6 @@ entities: rot: 3.141592653589793 rad pos: 28.5,-8.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 4226 @@ -53906,8 +51994,6 @@ entities: - type: Transform pos: 24.5,3.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 4381 @@ -53915,8 +52001,6 @@ entities: - type: Transform pos: 17.5,-2.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 4439 @@ -53925,8 +52009,6 @@ entities: rot: -1.5707963267948966 rad pos: 12.5,7.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 4442 @@ -53935,8 +52017,6 @@ entities: rot: -1.5707963267948966 rad pos: 12.5,-1.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 4443 @@ -53945,8 +52025,6 @@ entities: rot: -1.5707963267948966 rad pos: 25.5,-4.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 4465 @@ -53955,8 +52033,6 @@ entities: rot: -1.5707963267948966 rad pos: 15.5,6.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 4875 @@ -53964,8 +52040,6 @@ entities: - type: Transform pos: -15.5,-15.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 4876 @@ -53974,8 +52048,6 @@ entities: rot: 1.5707963267948966 rad pos: -19.5,-16.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 5025 @@ -53983,8 +52055,6 @@ entities: - type: Transform pos: -18.5,-20.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 5223 @@ -53993,8 +52063,6 @@ entities: rot: 3.141592653589793 rad pos: -11.5,-51.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 5224 @@ -54003,8 +52071,6 @@ entities: rot: -1.5707963267948966 rad pos: -10.5,-42.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 5699 @@ -54013,8 +52079,6 @@ entities: rot: 3.141592653589793 rad pos: 6.5,-24.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 5700 @@ -54022,8 +52086,6 @@ entities: - type: Transform pos: 3.5,-17.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 5716 @@ -54032,8 +52094,6 @@ entities: rot: -1.5707963267948966 rad pos: 12.5,-26.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 5717 @@ -54042,8 +52102,6 @@ entities: rot: 3.141592653589793 rad pos: 8.5,-27.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 5719 @@ -54052,8 +52110,6 @@ entities: rot: 1.5707963267948966 rad pos: 9.5,-18.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 5735 @@ -54061,8 +52117,6 @@ entities: - type: Transform pos: 27.5,-20.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 5765 @@ -54071,8 +52125,6 @@ entities: rot: 3.141592653589793 rad pos: 27.5,-27.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 5766 @@ -54081,8 +52133,6 @@ entities: rot: -1.5707963267948966 rad pos: 33.5,-26.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 5805 @@ -54091,8 +52141,6 @@ entities: rot: 1.5707963267948966 rad pos: 13.5,-17.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 6253 @@ -54101,8 +52149,6 @@ entities: rot: 3.141592653589793 rad pos: -26.5,-26.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 6417 @@ -54111,8 +52157,6 @@ entities: rot: 3.141592653589793 rad pos: 11.5,-12.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 6420 @@ -54121,8 +52165,6 @@ entities: rot: 3.141592653589793 rad pos: -1.5,-13.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 6455 @@ -54131,8 +52173,6 @@ entities: rot: 3.141592653589793 rad pos: -3.5,-35.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 6472 @@ -54141,8 +52181,6 @@ entities: rot: -1.5707963267948966 rad pos: -2.5,-25.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 6687 @@ -54151,8 +52189,6 @@ entities: rot: 3.141592653589793 rad pos: -3.5,-32.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 6838 @@ -54161,8 +52197,6 @@ entities: rot: 1.5707963267948966 rad pos: -26.5,-36.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 6839 @@ -54170,8 +52204,6 @@ entities: - type: Transform pos: -18.5,-33.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 6841 @@ -54180,8 +52212,6 @@ entities: rot: 3.141592653589793 rad pos: -22.5,-37.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 7088 @@ -54190,8 +52220,6 @@ entities: rot: 3.141592653589793 rad pos: -24.5,-17.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 7227 @@ -54200,8 +52228,6 @@ entities: rot: 1.5707963267948966 rad pos: -20.5,-26.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 7325 @@ -54210,8 +52236,6 @@ entities: rot: 3.141592653589793 rad pos: -8.5,-26.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 7381 @@ -54220,8 +52244,6 @@ entities: rot: 1.5707963267948966 rad pos: -12.5,-20.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 7382 @@ -54229,8 +52251,6 @@ entities: - type: Transform pos: -11.5,-17.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 7858 @@ -54238,8 +52258,6 @@ entities: - type: Transform pos: -30.5,30.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 7873 @@ -54248,8 +52266,6 @@ entities: rot: -1.5707963267948966 rad pos: -26.5,16.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 7874 @@ -54258,8 +52274,6 @@ entities: rot: -1.5707963267948966 rad pos: -26.5,19.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 7887 @@ -54268,8 +52282,6 @@ entities: rot: -1.5707963267948966 rad pos: -26.5,11.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 7907 @@ -54278,8 +52290,6 @@ entities: rot: 1.5707963267948966 rad pos: -36.5,11.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 7908 @@ -54287,8 +52297,6 @@ entities: - type: Transform pos: -34.5,15.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 7909 @@ -54297,8 +52305,6 @@ entities: rot: 1.5707963267948966 rad pos: -31.5,15.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 7913 @@ -54307,8 +52313,6 @@ entities: rot: 1.5707963267948966 rad pos: -31.5,18.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 7914 @@ -54317,8 +52321,6 @@ entities: rot: 1.5707963267948966 rad pos: -31.5,12.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 8239 @@ -54326,8 +52328,6 @@ entities: - type: Transform pos: -22.5,27.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 8241 @@ -54336,8 +52336,6 @@ entities: rot: 1.5707963267948966 rad pos: -23.5,22.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 8307 @@ -54345,8 +52343,6 @@ entities: - type: Transform pos: -21.5,20.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 8317 @@ -54355,8 +52351,6 @@ entities: rot: 3.141592653589793 rad pos: -11.5,16.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 8563 @@ -54365,8 +52359,6 @@ entities: rot: 3.141592653589793 rad pos: -18.5,8.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 8787 @@ -54375,8 +52367,6 @@ entities: rot: 1.5707963267948966 rad pos: -31.5,-2.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 8836 @@ -54385,8 +52375,6 @@ entities: rot: -1.5707963267948966 rad pos: -16.5,-25.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 8994 @@ -54395,32 +52383,24 @@ entities: rot: -1.5707963267948966 rad pos: -33.5,-34.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9006 components: - type: Transform rot: 3.141592653589793 rad pos: -37.5,-37.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9007 components: - type: Transform rot: 1.5707963267948966 rad pos: -38.5,-34.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 10758 components: - type: Transform rot: 3.141592653589793 rad pos: -38.5,0.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 12023 @@ -54428,8 +52408,6 @@ entities: - type: Transform pos: -48.5,-9.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 12024 @@ -54438,8 +52416,6 @@ entities: rot: 1.5707963267948966 rad pos: -53.5,-11.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 12025 @@ -54448,8 +52424,6 @@ entities: rot: 3.141592653589793 rad pos: -48.5,-13.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 12026 @@ -54458,8 +52432,6 @@ entities: rot: -1.5707963267948966 rad pos: -42.5,-11.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 12033 @@ -54467,8 +52439,6 @@ entities: - type: Transform pos: -40.5,-6.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 12034 @@ -54477,8 +52447,6 @@ entities: rot: 3.141592653589793 rad pos: -30.5,-6.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 12036 @@ -54486,8 +52454,6 @@ entities: - type: Transform pos: -30.5,2.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 12038 @@ -54496,8 +52462,6 @@ entities: rot: 3.141592653589793 rad pos: -14.5,-12.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 12040 @@ -54505,8 +52469,6 @@ entities: - type: Transform pos: -24.5,8.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 12042 @@ -54515,8 +52477,6 @@ entities: rot: 1.5707963267948966 rad pos: -26.5,-4.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 12044 @@ -54525,8 +52485,6 @@ entities: rot: 1.5707963267948966 rad pos: -26.5,-11.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 12418 @@ -54535,8 +52493,6 @@ entities: rot: 1.5707963267948966 rad pos: -2.5,4.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - proto: GeneratorBasic15kW @@ -57741,43 +55697,31 @@ entities: entities: - uid: 1846 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -2.5,21.5 parent: 4812 - uid: 3287 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,6.5 parent: 4812 - uid: 3688 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,45.5 parent: 4812 - uid: 3689 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,45.5 parent: 4812 - uid: 3690 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,47.5 parent: 4812 - uid: 9886 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,-12.5 parent: 4812 @@ -59707,16 +57651,14 @@ entities: - type: Transform pos: -35.5,12.5 parent: 4812 - - type: Lock - locked: False - type: EntityStorage air: volume: 200 immutable: False temperature: 293.14957 moles: - - 1.6033952 - - 6.031821 + - 1.8742619 + - 7.050795 - 0 - 0 - 0 @@ -60156,8 +58098,6 @@ entities: entities: - uid: 12381 components: - - type: MetaData - flags: InContainer - type: Transform parent: 9099 - type: Physics @@ -60288,43 +58228,31 @@ entities: - type: Transform pos: 15.5,11.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 6327 components: - type: Transform pos: 25.5,-22.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9448 components: - type: Transform pos: -53.5,1.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9667 components: - type: Transform pos: -33.5,4.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9668 components: - type: Transform pos: -33.5,5.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 11786 components: - type: Transform pos: 21.5,-32.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: NuclearBomb entities: - uid: 1854 @@ -60390,80 +58318,63 @@ entities: - type: Transform pos: 9.5,17.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 4603 components: - type: Transform pos: 14.5,11.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 6328 components: - type: Transform pos: 26.5,-22.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 8849 components: - type: Transform pos: -13.5,-28.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9450 components: - type: Transform pos: -53.5,3.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9669 components: - type: Transform pos: -32.5,4.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9670 components: - type: Transform pos: -32.5,5.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 10740 components: - type: Transform pos: -46.5,-9.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 10878 components: - type: Transform pos: -34.5,8.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 10917 components: - type: Transform pos: -47.5,-23.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 11787 components: - type: Transform pos: 20.5,-32.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: OxygenTankFilled entities: + - uid: 11791 + components: + - type: Transform + pos: 19.452671,-32.41012 + parent: 4812 - uid: 11792 components: - type: Transform @@ -60905,43 +58816,31 @@ entities: entities: - uid: 1767 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -2.5035148,7.4145155 parent: 4812 - uid: 3963 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 9.496426,48.542255 parent: 4812 - uid: 6307 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 26.432638,-19.383717 parent: 4812 - uid: 7142 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -28.490486,-14.614019 parent: 4812 - uid: 10864 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -22.475502,3.5391276 parent: 4812 - uid: 10865 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 6.426591,-28.501112 parent: 4812 @@ -61037,8 +58936,6 @@ entities: - type: Transform pos: -53.5,9.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: PlasticFlapsAirtightClear entities: - uid: 2779 @@ -61932,8 +59829,6 @@ entities: entities: - uid: 1515 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,-5.5 parent: 4812 @@ -61941,8 +59836,6 @@ entities: powerLoad: 0 - uid: 1516 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,-5.5 parent: 4812 @@ -61950,8 +59843,6 @@ entities: powerLoad: 0 - uid: 1517 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -7.5,-8.5 @@ -61960,8 +59851,6 @@ entities: powerLoad: 0 - uid: 1518 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -18.5,-8.5 @@ -61970,8 +59859,6 @@ entities: powerLoad: 0 - uid: 1665 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 0.5,10.5 @@ -61980,8 +59867,6 @@ entities: powerLoad: 0 - uid: 1666 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -5.5,10.5 @@ -61990,8 +59875,6 @@ entities: powerLoad: 0 - uid: 1667 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 0.5,1.5 @@ -62000,8 +59883,6 @@ entities: powerLoad: 0 - uid: 1668 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -5.5,1.5 @@ -62010,8 +59891,6 @@ entities: powerLoad: 0 - uid: 1669 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -5.5,-4.5 @@ -62020,8 +59899,6 @@ entities: powerLoad: 0 - uid: 1670 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 0.5,-4.5 @@ -62030,8 +59907,6 @@ entities: powerLoad: 0 - uid: 1671 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,9.5 parent: 4812 @@ -62039,8 +59914,6 @@ entities: powerLoad: 0 - uid: 1672 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 2.5,-3.5 @@ -62049,8 +59922,6 @@ entities: powerLoad: 0 - uid: 1673 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 7.5,0.5 @@ -62059,8 +59930,6 @@ entities: powerLoad: 0 - uid: 1975 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 5.5,15.5 @@ -62069,8 +59938,6 @@ entities: powerLoad: 0 - uid: 1983 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 9.5,15.5 @@ -62079,8 +59946,6 @@ entities: powerLoad: 0 - uid: 2541 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 10.5,29.5 @@ -62089,8 +59954,6 @@ entities: powerLoad: 0 - uid: 2542 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 8.5,29.5 @@ -62099,8 +59962,6 @@ entities: powerLoad: 0 - uid: 2543 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: -15.5,27.5 @@ -62109,8 +59970,6 @@ entities: powerLoad: 0 - uid: 2544 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,22.5 parent: 4812 @@ -62118,8 +59977,6 @@ entities: powerLoad: 0 - uid: 2545 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,26.5 parent: 4812 @@ -62127,8 +59984,6 @@ entities: powerLoad: 0 - uid: 2622 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -10.5,28.5 @@ -62137,8 +59992,6 @@ entities: powerLoad: 0 - uid: 2623 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,24.5 parent: 4812 @@ -62146,8 +59999,6 @@ entities: powerLoad: 0 - uid: 2624 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 3.5,28.5 @@ -62156,8 +60007,6 @@ entities: powerLoad: 0 - uid: 2625 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -8.5,28.5 @@ -62166,8 +60015,6 @@ entities: powerLoad: 0 - uid: 2626 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -7.5,23.5 @@ -62176,8 +60023,6 @@ entities: powerLoad: 0 - uid: 2627 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 2.5,23.5 @@ -62186,8 +60031,6 @@ entities: powerLoad: 0 - uid: 2628 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,34.5 parent: 4812 @@ -62195,8 +60038,6 @@ entities: powerLoad: 0 - uid: 2629 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,34.5 parent: 4812 @@ -62204,8 +60045,6 @@ entities: powerLoad: 0 - uid: 2630 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -0.5,35.5 parent: 4812 @@ -62213,8 +60052,6 @@ entities: powerLoad: 0 - uid: 2631 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -4.5,35.5 parent: 4812 @@ -62222,8 +60059,6 @@ entities: powerLoad: 0 - uid: 2687 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -5.5,31.5 @@ -62232,8 +60067,6 @@ entities: powerLoad: 0 - uid: 2688 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 0.5,31.5 @@ -62242,8 +60075,6 @@ entities: powerLoad: 0 - uid: 2689 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -5.5,18.5 @@ -62252,8 +60083,6 @@ entities: powerLoad: 0 - uid: 2690 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 0.5,18.5 @@ -62262,8 +60091,6 @@ entities: powerLoad: 0 - uid: 2691 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -0.5,13.5 @@ -62272,8 +60099,6 @@ entities: powerLoad: 0 - uid: 2692 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -4.5,14.5 @@ -62282,8 +60107,6 @@ entities: powerLoad: 0 - uid: 2694 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,20.5 parent: 4812 @@ -62291,8 +60114,6 @@ entities: powerLoad: 0 - uid: 2696 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,20.5 parent: 4812 @@ -62300,8 +60121,6 @@ entities: powerLoad: 0 - uid: 2733 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 0.5,24.5 @@ -62310,8 +60129,6 @@ entities: powerLoad: 0 - uid: 2734 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -5.5,24.5 @@ -62320,8 +60137,6 @@ entities: powerLoad: 0 - uid: 2776 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 15.5,31.5 @@ -62330,8 +60145,6 @@ entities: powerLoad: 0 - uid: 2784 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,20.5 parent: 4812 @@ -62339,8 +60152,6 @@ entities: powerLoad: 0 - uid: 2785 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,20.5 parent: 4812 @@ -62348,8 +60159,6 @@ entities: powerLoad: 0 - uid: 3216 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: 17.5,17.5 @@ -62358,8 +60167,6 @@ entities: powerLoad: 0 - uid: 3217 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: 17.5,13.5 @@ -62368,8 +60175,6 @@ entities: powerLoad: 0 - uid: 3218 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: 23.5,12.5 @@ -62378,8 +60183,6 @@ entities: powerLoad: 0 - uid: 3219 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,21.5 parent: 4812 @@ -62387,8 +60190,6 @@ entities: powerLoad: 0 - uid: 3220 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,27.5 parent: 4812 @@ -62396,8 +60197,6 @@ entities: powerLoad: 0 - uid: 3221 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: 17.5,23.5 @@ -62406,8 +60205,6 @@ entities: powerLoad: 0 - uid: 3965 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,56.5 parent: 4812 @@ -62415,8 +60212,6 @@ entities: powerLoad: 0 - uid: 3966 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,50.5 parent: 4812 @@ -62424,8 +60219,6 @@ entities: powerLoad: 0 - uid: 3967 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 13.5,54.5 @@ -62434,8 +60227,6 @@ entities: powerLoad: 0 - uid: 3968 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 13.5,50.5 @@ -62444,8 +60235,6 @@ entities: powerLoad: 0 - uid: 3969 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 7.5,50.5 @@ -62454,8 +60243,6 @@ entities: powerLoad: 0 - uid: 3970 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 7.5,54.5 @@ -62464,8 +60251,6 @@ entities: powerLoad: 0 - uid: 3971 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: 10.5,43.5 @@ -62474,8 +60259,6 @@ entities: powerLoad: 0 - uid: 3972 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,47.5 parent: 4812 @@ -62483,8 +60266,6 @@ entities: powerLoad: 0 - uid: 3973 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,47.5 parent: 4812 @@ -62492,8 +60273,6 @@ entities: powerLoad: 0 - uid: 4468 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 11.5,12.5 @@ -62502,8 +60281,6 @@ entities: powerLoad: 0 - uid: 4469 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 11.5,4.5 @@ -62512,8 +60289,6 @@ entities: powerLoad: 0 - uid: 4470 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 11.5,-5.5 @@ -62522,8 +60297,6 @@ entities: powerLoad: 0 - uid: 4471 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,-2.5 parent: 4812 @@ -62531,8 +60304,6 @@ entities: powerLoad: 0 - uid: 4472 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: 29.5,-9.5 @@ -62541,8 +60312,6 @@ entities: powerLoad: 0 - uid: 4473 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 29.5,4.5 parent: 4812 @@ -62550,8 +60319,6 @@ entities: powerLoad: 0 - uid: 4474 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 27.5,-5.5 @@ -62560,8 +60327,6 @@ entities: powerLoad: 0 - uid: 4475 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 27.5,0.5 @@ -62570,8 +60335,6 @@ entities: powerLoad: 0 - uid: 4476 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: 24.5,-7.5 @@ -62580,39 +60343,29 @@ entities: powerLoad: 0 - uid: 4952 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-25.5 parent: 4812 - uid: 4953 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: -19.5,-23.5 parent: 4812 - uid: 4954 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -10.5,-27.5 parent: 4812 - uid: 4986 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -12.5,-27.5 parent: 4812 - uid: 5067 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -10.5,-53.5 @@ -62621,8 +60374,6 @@ entities: powerLoad: 0 - uid: 5068 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -10.5,-40.5 @@ -62631,8 +60382,6 @@ entities: powerLoad: 0 - uid: 5069 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,-45.5 parent: 4812 @@ -62640,8 +60389,6 @@ entities: powerLoad: 0 - uid: 5070 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,-45.5 parent: 4812 @@ -62649,8 +60396,6 @@ entities: powerLoad: 0 - uid: 5283 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -4.5,-34.5 parent: 4812 @@ -62658,8 +60403,6 @@ entities: powerLoad: 0 - uid: 5284 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -0.5,-34.5 parent: 4812 @@ -62667,8 +60410,6 @@ entities: powerLoad: 0 - uid: 6258 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 7.5,-14.5 @@ -62677,8 +60418,6 @@ entities: powerLoad: 0 - uid: 6259 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 7.5,-18.5 @@ -62687,8 +60426,6 @@ entities: powerLoad: 0 - uid: 6260 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,-17.5 parent: 4812 @@ -62696,8 +60433,6 @@ entities: powerLoad: 0 - uid: 6261 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: 6.5,-28.5 @@ -62706,8 +60441,6 @@ entities: powerLoad: 0 - uid: 6262 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-23.5 parent: 4812 @@ -62715,8 +60448,6 @@ entities: powerLoad: 0 - uid: 6263 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 11.5,-27.5 @@ -62725,8 +60456,6 @@ entities: powerLoad: 0 - uid: 6264 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 16.5,-25.5 @@ -62735,8 +60464,6 @@ entities: powerLoad: 0 - uid: 6265 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 9.5,-27.5 @@ -62745,8 +60472,6 @@ entities: powerLoad: 0 - uid: 6266 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-20.5 parent: 4812 @@ -62754,8 +60479,6 @@ entities: powerLoad: 0 - uid: 6267 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,-20.5 parent: 4812 @@ -62763,8 +60486,6 @@ entities: powerLoad: 0 - uid: 6268 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 9.5,-16.5 @@ -62773,8 +60494,6 @@ entities: powerLoad: 0 - uid: 6269 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 23.5,-28.5 @@ -62783,8 +60502,6 @@ entities: powerLoad: 0 - uid: 6270 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: 28.5,-30.5 @@ -62793,8 +60510,6 @@ entities: powerLoad: 0 - uid: 6271 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 28.5,-22.5 parent: 4812 @@ -62802,8 +60517,6 @@ entities: powerLoad: 0 - uid: 6272 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 21.5,-26.5 @@ -62812,8 +60525,6 @@ entities: powerLoad: 0 - uid: 6273 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 21.5,-22.5 @@ -62822,8 +60533,6 @@ entities: powerLoad: 0 - uid: 6274 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 24.5,-19.5 @@ -62832,8 +60541,6 @@ entities: powerLoad: 0 - uid: 6275 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 28.5,-19.5 @@ -62842,8 +60549,6 @@ entities: powerLoad: 0 - uid: 6276 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 35.5,-23.5 parent: 4812 @@ -62851,8 +60556,6 @@ entities: powerLoad: 0 - uid: 6277 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: 31.5,-28.5 @@ -62861,8 +60564,6 @@ entities: powerLoad: 0 - uid: 6478 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -1.5,-26.5 @@ -62871,8 +60572,6 @@ entities: powerLoad: 0 - uid: 7019 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -19.5,-34.5 @@ -62881,8 +60580,6 @@ entities: powerLoad: 0 - uid: 7024 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -26.5,-32.5 @@ -62891,45 +60588,33 @@ entities: powerLoad: 0 - uid: 7028 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,-15.5 parent: 4812 - uid: 7053 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: -22.5,-28.5 parent: 4812 - uid: 7288 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,-20.5 parent: 4812 - uid: 7367 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -17.5,-25.5 parent: 4812 - uid: 7397 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,-22.5 parent: 4812 - uid: 7582 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -10.5,-20.5 parent: 4812 @@ -62937,8 +60622,6 @@ entities: powerLoad: 0 - uid: 7583 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: -10.5,-18.5 @@ -62947,8 +60630,6 @@ entities: powerLoad: 0 - uid: 7621 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -2.5,-21.5 parent: 4812 @@ -62956,8 +60637,6 @@ entities: powerLoad: 0 - uid: 7622 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: -2.5,-19.5 @@ -62966,8 +60645,6 @@ entities: powerLoad: 0 - uid: 7623 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -5.5,-11.5 parent: 4812 @@ -62975,8 +60652,6 @@ entities: powerLoad: 0 - uid: 7624 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 0.5,-11.5 parent: 4812 @@ -62984,8 +60659,6 @@ entities: powerLoad: 0 - uid: 7625 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 0.5,-30.5 @@ -62994,8 +60667,6 @@ entities: powerLoad: 0 - uid: 7626 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -5.5,-30.5 @@ -63004,8 +60675,6 @@ entities: powerLoad: 0 - uid: 7627 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 0.5,-23.5 @@ -63014,8 +60683,6 @@ entities: powerLoad: 0 - uid: 7628 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -5.5,-23.5 @@ -63024,8 +60691,6 @@ entities: powerLoad: 0 - uid: 7629 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-11.5 parent: 4812 @@ -63033,8 +60698,6 @@ entities: powerLoad: 0 - uid: 7630 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-11.5 parent: 4812 @@ -63042,8 +60705,6 @@ entities: powerLoad: 0 - uid: 7631 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,-11.5 parent: 4812 @@ -63051,8 +60712,6 @@ entities: powerLoad: 0 - uid: 7632 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-11.5 parent: 4812 @@ -63060,8 +60719,6 @@ entities: powerLoad: 0 - uid: 8141 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,12.5 parent: 4812 @@ -63069,8 +60726,6 @@ entities: powerLoad: 0 - uid: 8142 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -31.5,16.5 @@ -63079,8 +60734,6 @@ entities: powerLoad: 0 - uid: 8143 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -33.5,16.5 @@ -63089,8 +60742,6 @@ entities: powerLoad: 0 - uid: 8144 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -28.5,12.5 @@ -63099,8 +60750,6 @@ entities: powerLoad: 0 - uid: 8145 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: -36.5,19.5 @@ -63109,8 +60758,6 @@ entities: powerLoad: 0 - uid: 8247 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -19.5,28.5 @@ -63119,16 +60766,12 @@ entities: powerLoad: 0 - uid: 8251 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -24.5,-27.5 parent: 4812 - uid: 8269 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,25.5 parent: 4812 @@ -63136,8 +60779,6 @@ entities: powerLoad: 0 - uid: 8304 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -22.5,18.5 @@ -63146,8 +60787,6 @@ entities: powerLoad: 0 - uid: 8305 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -16.5,15.5 @@ -63156,8 +60795,6 @@ entities: powerLoad: 0 - uid: 8603 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,12.5 parent: 4812 @@ -63165,8 +60802,6 @@ entities: powerLoad: 0 - uid: 8604 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: -18.5,7.5 @@ -63175,8 +60810,6 @@ entities: powerLoad: 0 - uid: 9017 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,-33.5 parent: 4812 @@ -63184,8 +60817,6 @@ entities: powerLoad: 0 - uid: 9311 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -53.5,1.5 @@ -63194,8 +60825,6 @@ entities: powerLoad: 0 - uid: 9312 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -53.5,3.5 @@ -63204,8 +60833,6 @@ entities: powerLoad: 0 - uid: 9313 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -53.5,5.5 @@ -63214,8 +60841,6 @@ entities: powerLoad: 0 - uid: 9314 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -53.5,7.5 @@ -63224,8 +60849,6 @@ entities: powerLoad: 0 - uid: 9315 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -53.5,9.5 @@ -63234,8 +60857,6 @@ entities: powerLoad: 0 - uid: 9316 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -53.5,11.5 @@ -63244,8 +60865,6 @@ entities: powerLoad: 0 - uid: 9317 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -49.5,0.5 @@ -63254,8 +60873,6 @@ entities: powerLoad: 0 - uid: 9318 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -49.5,4.5 @@ -63264,8 +60881,6 @@ entities: powerLoad: 0 - uid: 9319 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -49.5,8.5 @@ -63274,8 +60889,6 @@ entities: powerLoad: 0 - uid: 9320 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -49.5,12.5 @@ -63284,8 +60897,6 @@ entities: powerLoad: 0 - uid: 9706 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,14.5 parent: 4812 @@ -63293,8 +60904,6 @@ entities: powerLoad: 0 - uid: 9707 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -42.5,14.5 parent: 4812 @@ -63302,8 +60911,6 @@ entities: powerLoad: 0 - uid: 9819 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,5.5 parent: 4812 @@ -63311,8 +60918,6 @@ entities: powerLoad: 0 - uid: 9820 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -41.5,10.5 @@ -63321,8 +60926,6 @@ entities: powerLoad: 0 - uid: 9821 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: -41.5,0.5 @@ -63331,8 +60934,6 @@ entities: powerLoad: 0 - uid: 9822 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: -28.5,1.5 @@ -63341,8 +60942,6 @@ entities: powerLoad: 0 - uid: 9823 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: -34.5,1.5 @@ -63351,8 +60950,6 @@ entities: powerLoad: 0 - uid: 10660 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -52.5,-10.5 @@ -63361,8 +60958,6 @@ entities: powerLoad: 0 - uid: 10661 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -54.5,-10.5 @@ -63371,8 +60966,6 @@ entities: powerLoad: 0 - uid: 10680 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -49.5,-6.5 parent: 4812 @@ -63380,8 +60973,6 @@ entities: powerLoad: 0 - uid: 10681 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -47.5,-11.5 parent: 4812 @@ -63389,8 +60980,6 @@ entities: powerLoad: 0 - uid: 10682 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,-10.5 parent: 4812 @@ -63398,8 +60987,6 @@ entities: powerLoad: 0 - uid: 10684 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: -42.5,-18.5 @@ -63408,8 +60995,6 @@ entities: powerLoad: 0 - uid: 10686 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -28.5,-5.5 @@ -63418,8 +61003,6 @@ entities: powerLoad: 0 - uid: 10687 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -28.5,-9.5 @@ -63428,8 +61011,6 @@ entities: powerLoad: 0 - uid: 10688 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -25.5,-2.5 @@ -63438,8 +61019,6 @@ entities: powerLoad: 0 - uid: 10689 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,-0.5 parent: 4812 @@ -63447,8 +61026,6 @@ entities: powerLoad: 0 - uid: 10690 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,8.5 parent: 4812 @@ -63456,8 +61033,6 @@ entities: powerLoad: 0 - uid: 10691 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -22.5,13.5 @@ -63466,8 +61041,6 @@ entities: powerLoad: 0 - uid: 10692 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -43.5,-1.5 parent: 4812 @@ -63475,8 +61048,6 @@ entities: powerLoad: 0 - uid: 10693 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,-5.5 parent: 4812 @@ -63484,8 +61055,6 @@ entities: powerLoad: 0 - uid: 10694 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-6.5 parent: 4812 @@ -63493,8 +61062,6 @@ entities: powerLoad: 0 - uid: 10695 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: -45.5,-14.5 @@ -63503,8 +61070,6 @@ entities: powerLoad: 0 - uid: 10920 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -25.5,-9.5 @@ -63513,8 +61078,6 @@ entities: powerLoad: 0 - uid: 11246 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 4.5,-37.5 @@ -63523,8 +61086,6 @@ entities: powerLoad: 0 - uid: 11247 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 4.5,-41.5 @@ -63533,8 +61094,6 @@ entities: powerLoad: 0 - uid: 11248 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 14.5,-37.5 @@ -63543,8 +61102,6 @@ entities: powerLoad: 0 - uid: 11916 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -17.5,1.5 @@ -63553,8 +61110,6 @@ entities: powerLoad: 0 - uid: 11917 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,5.5 parent: 4812 @@ -63562,8 +61117,6 @@ entities: powerLoad: 0 - uid: 11918 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: -21.5,-1.5 @@ -63572,8 +61125,6 @@ entities: powerLoad: 0 - uid: 11920 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: -9.5,-35.5 @@ -63582,8 +61133,6 @@ entities: powerLoad: 0 - uid: 11921 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,-14.5 parent: 4812 @@ -63591,8 +61140,6 @@ entities: powerLoad: 0 - uid: 11923 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -30.5,5.5 parent: 4812 @@ -63600,8 +61147,6 @@ entities: powerLoad: 0 - uid: 11924 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -33.5,-7.5 @@ -63610,8 +61155,6 @@ entities: powerLoad: 0 - uid: 11926 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -38.5,-7.5 @@ -63620,8 +61163,6 @@ entities: powerLoad: 0 - uid: 11961 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,17.5 parent: 4812 @@ -67594,8 +65135,6 @@ entities: parent: 4812 - uid: 11812 components: - - type: MetaData - flags: InContainer - type: Transform parent: 11811 - type: Physics @@ -69099,29 +66638,21 @@ entities: entities: - uid: 933 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -6.5,-7.5 parent: 4812 - uid: 7186 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -18.5,-26.5 parent: 4812 - uid: 9020 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -40.5,-33.5 parent: 4812 - uid: 11100 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 10.5,-43.5 parent: 4812 @@ -69190,7 +66721,7 @@ entities: - type: Transform pos: -15.503267,29.527489 parent: 4812 -- proto: soda_dispenser +- proto: SodaDispenser entities: - uid: 364 components: @@ -69739,23 +67270,6 @@ entities: - type: Transform pos: -43.5,6.5 parent: 4812 -- proto: SpawnMobDrone - entities: - - uid: 11933 - components: - - type: Transform - pos: -13.5,16.5 - parent: 4812 - - uid: 11934 - components: - - type: Transform - pos: -12.5,16.5 - parent: 4812 - - uid: 11935 - components: - - type: Transform - pos: -11.5,16.5 - parent: 4812 - proto: SpawnMobFoxRenault entities: - uid: 2621 @@ -70208,20 +67722,6 @@ entities: - type: Transform pos: -34.5,15.5 parent: 4812 -- proto: SpawnVehicleJanicart - entities: - - uid: 1481 - components: - - type: Transform - pos: -22.5,-6.5 - parent: 4812 -- proto: SpawnVehicleSecway - entities: - - uid: 8348 - components: - - type: Transform - pos: -31.5,19.5 - parent: 4812 - proto: Spoon entities: - uid: 1774 @@ -70413,57 +67913,41 @@ entities: - type: Transform pos: 23.5,-22.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 6326 components: - type: Transform pos: 24.5,-22.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9553 components: - type: Transform pos: -41.5,6.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9554 components: - type: Transform pos: -41.5,7.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9555 components: - type: Transform pos: -41.5,8.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9665 components: - type: Transform pos: -34.5,4.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9666 components: - type: Transform pos: -34.5,5.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12462 components: - type: Transform pos: -36.5,26.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: SubstationBasic entities: - uid: 897 @@ -73157,57 +70641,41 @@ entities: entities: - uid: 4859 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,-13.5 parent: 4812 - uid: 5015 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,-13.5 parent: 4812 - uid: 6679 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,-16.5 parent: 4812 - uid: 6693 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,-35.5 parent: 4812 - uid: 6757 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,-37.5 parent: 4812 - uid: 6758 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,-35.5 parent: 4812 - uid: 7192 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-17.5 parent: 4812 - uid: 7193 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-15.5 parent: 4812 @@ -73543,26 +71011,10 @@ entities: - type: Transform pos: -38.5,-33.5 parent: 4812 -- proto: VehicleKeyJanicart - entities: - - uid: 1482 - components: - - type: Transform - pos: -22.528929,-6.6977267 - parent: 4812 -- proto: VehicleKeySecway - entities: - - uid: 8349 - components: - - type: Transform - pos: -31.5,20.5 - parent: 4812 - proto: VendingBarDrobe entities: - uid: 1647 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 5.5,6.5 parent: 4812 @@ -73570,8 +71022,6 @@ entities: entities: - uid: 9572 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -28.5,2.5 parent: 4812 @@ -73579,22 +71029,16 @@ entities: entities: - uid: 12 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 4.5,6.5 parent: 4812 - uid: 2606 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -15.5,25.5 parent: 4812 - uid: 10494 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -38.5,-22.5 parent: 4812 @@ -73602,8 +71046,6 @@ entities: entities: - uid: 3230 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 14.5,19.5 parent: 4812 @@ -73611,8 +71053,6 @@ entities: entities: - uid: 2510 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 10.5,26.5 parent: 4812 @@ -73620,22 +71060,16 @@ entities: entities: - uid: 923 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 0.5,-6.5 parent: 4812 - uid: 4538 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 23.5,-6.5 parent: 4812 - uid: 6422 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 2.5,-32.5 parent: 4812 @@ -73643,8 +71077,6 @@ entities: entities: - uid: 7036 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -27.5,-35.5 parent: 4812 @@ -73652,8 +71084,6 @@ entities: entities: - uid: 1539 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 7.5,-3.5 parent: 4812 @@ -73661,8 +71091,6 @@ entities: entities: - uid: 1124 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 3.5,-3.5 parent: 4812 @@ -73670,8 +71098,6 @@ entities: entities: - uid: 6608 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -12.5,-15.5 parent: 4812 @@ -73679,8 +71105,6 @@ entities: entities: - uid: 741 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -10.5,-14.5 parent: 4812 @@ -73689,7 +71113,6 @@ entities: - uid: 917 components: - type: MetaData - flags: SessionSpecific name: cigarette machine - type: Transform pos: -6.5,9.5 @@ -73697,7 +71120,6 @@ entities: - uid: 2672 components: - type: MetaData - flags: SessionSpecific name: cigarette machine - type: Transform pos: 0.5,28.5 @@ -73705,7 +71127,6 @@ entities: - uid: 4536 components: - type: MetaData - flags: SessionSpecific name: cigarette machine - type: Transform pos: 21.5,-4.5 @@ -73713,7 +71134,6 @@ entities: - uid: 5372 components: - type: MetaData - flags: SessionSpecific name: cigarette machine - type: Transform pos: 18.5,-18.5 @@ -73721,7 +71141,6 @@ entities: - uid: 8268 components: - type: MetaData - flags: SessionSpecific name: cigarette machine - type: Transform pos: -23.5,25.5 @@ -73729,7 +71148,6 @@ entities: - uid: 9077 components: - type: MetaData - flags: SessionSpecific name: cigarette machine - type: Transform pos: -30.5,-28.5 @@ -73737,7 +71155,6 @@ entities: - uid: 10873 components: - type: MetaData - flags: SessionSpecific name: cigarette machine - type: Transform pos: -27.5,7.5 @@ -73746,8 +71163,6 @@ entities: entities: - uid: 10850 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -23.5,-1.5 parent: 4812 @@ -73756,7 +71171,6 @@ entities: - uid: 918 components: - type: MetaData - flags: SessionSpecific name: Hot drinks machine - type: Transform pos: 0.5,10.5 @@ -73764,7 +71178,6 @@ entities: - uid: 1797 components: - type: MetaData - flags: SessionSpecific name: Hot drinks machine - type: Transform pos: -5.5,16.5 @@ -73772,7 +71185,6 @@ entities: - uid: 2671 components: - type: MetaData - flags: SessionSpecific name: Hot drinks machine - type: Transform pos: -5.5,28.5 @@ -73780,7 +71192,6 @@ entities: - uid: 4537 components: - type: MetaData - flags: SessionSpecific name: Hot drinks machine - type: Transform pos: 23.5,-5.5 @@ -73788,7 +71199,6 @@ entities: - uid: 6356 components: - type: MetaData - flags: SessionSpecific name: Hot drinks machine - type: Transform pos: 9.5,-28.5 @@ -73796,7 +71206,6 @@ entities: - uid: 10741 components: - type: MetaData - flags: SessionSpecific name: Hot drinks machine - type: Transform pos: -45.5,-5.5 @@ -73804,7 +71213,6 @@ entities: - uid: 12150 components: - type: MetaData - flags: SessionSpecific name: Hot drinks machine - type: Transform pos: -27.5,-12.5 @@ -73813,15 +71221,11 @@ entities: entities: - uid: 4533 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 13.5,2.5 parent: 4812 - uid: 5061 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -9.5,-46.5 parent: 4812 @@ -73829,8 +71233,6 @@ entities: entities: - uid: 9584 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 0.5,-3.5 parent: 4812 @@ -73845,8 +71247,6 @@ entities: entities: - uid: 5361 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 20.5,-14.5 parent: 4812 @@ -73855,7 +71255,6 @@ entities: - uid: 1552 components: - type: MetaData - flags: SessionSpecific name: Dinnerware - type: Transform pos: 2.5,-3.5 @@ -73864,8 +71263,6 @@ entities: entities: - uid: 919 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 0.5,11.5 parent: 4812 @@ -73873,8 +71270,6 @@ entities: entities: - uid: 12516 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -38.5,-7.5 parent: 4812 @@ -73882,8 +71277,6 @@ entities: entities: - uid: 9722 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -31.5,-5.5 parent: 4812 @@ -73891,8 +71284,6 @@ entities: entities: - uid: 7070 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -30.5,-14.5 parent: 4812 @@ -73900,8 +71291,6 @@ entities: entities: - uid: 2607 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -14.5,-18.5 parent: 4812 @@ -73909,8 +71298,6 @@ entities: entities: - uid: 1565 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 6.5,-3.5 parent: 4812 @@ -73918,8 +71305,6 @@ entities: entities: - uid: 1094 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -18.5,-7.5 parent: 4812 @@ -73927,8 +71312,6 @@ entities: entities: - uid: 1480 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -20.5,-9.5 parent: 4812 @@ -73936,8 +71319,6 @@ entities: entities: - uid: 8275 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -16.5,17.5 parent: 4812 @@ -73945,8 +71326,6 @@ entities: entities: - uid: 7188 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -8.5,-28.5 parent: 4812 @@ -73954,8 +71333,6 @@ entities: entities: - uid: 7399 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -8.5,-25.5 parent: 4812 @@ -73963,15 +71340,11 @@ entities: entities: - uid: 1092 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -7.5,-5.5 parent: 4812 - uid: 11785 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 25.5,-32.5 parent: 4812 @@ -73979,8 +71352,6 @@ entities: entities: - uid: 6223 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 11.5,-26.5 parent: 4812 @@ -73988,8 +71359,6 @@ entities: entities: - uid: 737 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 4.5,-23.5 parent: 4812 @@ -73998,7 +71367,6 @@ entities: - uid: 3434 components: - type: MetaData - flags: SessionSpecific name: Salvage Equipment - type: Transform pos: 23.5,16.5 @@ -74007,8 +71375,6 @@ entities: entities: - uid: 5513 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 25.5,-26.5 parent: 4812 @@ -74016,15 +71382,11 @@ entities: entities: - uid: 8342 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -31.5,13.5 parent: 4812 - uid: 8420 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -36.5,12.5 parent: 4812 @@ -74032,15 +71394,11 @@ entities: entities: - uid: 6439 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -3.5,-29.5 parent: 4812 - uid: 12506 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -34.5,10.5 parent: 4812 @@ -74048,8 +71406,6 @@ entities: entities: - uid: 1091 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -8.5,-5.5 parent: 4812 @@ -74057,8 +71413,6 @@ entities: entities: - uid: 6240 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -29.5,32.5 parent: 4812 @@ -74066,22 +71420,16 @@ entities: entities: - uid: 920 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 0.5,-7.5 parent: 4812 - uid: 4530 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 13.5,1.5 parent: 4812 - uid: 5060 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -9.5,-45.5 parent: 4812 @@ -74089,8 +71437,6 @@ entities: entities: - uid: 11780 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 29.5,-32.5 parent: 4812 @@ -74098,8 +71444,6 @@ entities: entities: - uid: 6165 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -28.5,32.5 parent: 4812 @@ -74108,7 +71452,6 @@ entities: - uid: 739 components: - type: MetaData - flags: SessionSpecific name: tank dispenser - type: Transform pos: 7.5,15.5 @@ -74116,7 +71459,6 @@ entities: - uid: 9577 components: - type: MetaData - flags: SessionSpecific name: tank dispenser - type: Transform pos: -31.5,1.5 @@ -74125,15 +71467,12 @@ entities: entities: - uid: 732 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 9.5,14.5 parent: 4812 - uid: 6312 components: - type: MetaData - flags: SessionSpecific name: tank dispenser - type: Transform pos: 26.5,-26.5 @@ -74141,7 +71480,6 @@ entities: - uid: 10708 components: - type: MetaData - flags: SessionSpecific name: tank dispenser - type: Transform pos: -35.5,-9.5 @@ -74149,7 +71487,6 @@ entities: - uid: 12113 components: - type: MetaData - flags: SessionSpecific name: tank dispenser - type: Transform pos: -42.5,-3.5 @@ -74158,15 +71495,11 @@ entities: entities: - uid: 1692 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -7.5,1.5 parent: 4812 - uid: 9045 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -26.5,-39.5 parent: 4812 @@ -74174,8 +71507,6 @@ entities: entities: - uid: 8578 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -18.5,7.5 parent: 4812 @@ -74183,8 +71514,6 @@ entities: entities: - uid: 8871 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -37.5,-33.5 parent: 4812 @@ -74192,15 +71521,11 @@ entities: entities: - uid: 8577 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -19.5,7.5 parent: 4812 - uid: 9723 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -32.5,-5.5 parent: 4812 @@ -74243,6848 +71568,4894 @@ entities: entities: - uid: 32 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,15.5 parent: 4812 - uid: 35 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,15.5 parent: 4812 - uid: 122 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,18.5 parent: 4812 - uid: 123 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,18.5 parent: 4812 - uid: 124 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,15.5 parent: 4812 - uid: 125 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,18.5 parent: 4812 - uid: 126 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,18.5 parent: 4812 - uid: 127 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,15.5 parent: 4812 - uid: 138 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,18.5 parent: 4812 - uid: 160 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -10.5,18.5 parent: 4812 - uid: 170 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,17.5 parent: 4812 - uid: 171 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,16.5 parent: 4812 - uid: 172 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,15.5 parent: 4812 - uid: 173 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,14.5 parent: 4812 - uid: 174 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,13.5 parent: 4812 - uid: 176 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,18.5 parent: 4812 - uid: 297 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,17.5 parent: 4812 - uid: 298 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,16.5 parent: 4812 - uid: 299 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,15.5 parent: 4812 - uid: 300 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,14.5 parent: 4812 - uid: 301 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,14.5 parent: 4812 - uid: 302 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -10.5,14.5 parent: 4812 - uid: 303 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,14.5 parent: 4812 - uid: 304 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,14.5 parent: 4812 - uid: 305 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,14.5 parent: 4812 - uid: 306 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,14.5 parent: 4812 - uid: 721 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,14.5 parent: 4812 - uid: 722 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,13.5 parent: 4812 - uid: 724 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,13.5 parent: 4812 - uid: 725 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,13.5 parent: 4812 - uid: 726 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,13.5 parent: 4812 - uid: 727 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,13.5 parent: 4812 - uid: 728 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,13.5 parent: 4812 - uid: 772 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,18.5 parent: 4812 - uid: 773 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,18.5 parent: 4812 - uid: 1819 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -3.5,21.5 parent: 4812 - uid: 1820 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -4.5,21.5 parent: 4812 - uid: 1821 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -5.5,21.5 parent: 4812 - uid: 1822 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,21.5 parent: 4812 - uid: 1823 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,22.5 parent: 4812 - uid: 1824 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,23.5 parent: 4812 - uid: 1825 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,24.5 parent: 4812 - uid: 1826 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,25.5 parent: 4812 - uid: 1827 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,26.5 parent: 4812 - uid: 1828 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,27.5 parent: 4812 - uid: 1829 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -1.5,21.5 parent: 4812 - uid: 1830 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -0.5,21.5 parent: 4812 - uid: 1831 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 0.5,21.5 parent: 4812 - uid: 1832 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,21.5 parent: 4812 - uid: 1833 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,22.5 parent: 4812 - uid: 1834 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,23.5 parent: 4812 - uid: 1836 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,25.5 parent: 4812 - uid: 1837 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,26.5 parent: 4812 - uid: 1838 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,27.5 parent: 4812 - uid: 1839 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 0.5,27.5 parent: 4812 - uid: 1840 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -1.5,27.5 parent: 4812 - uid: 1841 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -3.5,27.5 parent: 4812 - uid: 1842 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -5.5,27.5 parent: 4812 - uid: 1857 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,31.5 parent: 4812 - uid: 1859 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,31.5 parent: 4812 - uid: 1861 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,31.5 parent: 4812 - uid: 1862 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,31.5 parent: 4812 - uid: 1863 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,33.5 parent: 4812 - uid: 1864 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,33.5 parent: 4812 - uid: 1865 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,35.5 parent: 4812 - uid: 1866 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,35.5 parent: 4812 - uid: 1867 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -4.5,36.5 parent: 4812 - uid: 1868 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -0.5,36.5 parent: 4812 - uid: 1885 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,33.5 parent: 4812 - uid: 1886 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,33.5 parent: 4812 - uid: 1887 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,32.5 parent: 4812 - uid: 1888 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,31.5 parent: 4812 - uid: 1889 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,30.5 parent: 4812 - uid: 1890 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,30.5 parent: 4812 - uid: 1891 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,30.5 parent: 4812 - uid: 1892 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,30.5 parent: 4812 - uid: 1893 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,21.5 parent: 4812 - uid: 1894 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,22.5 parent: 4812 - uid: 1895 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,23.5 parent: 4812 - uid: 1896 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,21.5 parent: 4812 - uid: 1899 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,27.5 parent: 4812 - uid: 1900 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,28.5 parent: 4812 - uid: 1901 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,29.5 parent: 4812 - uid: 1903 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,22.5 parent: 4812 - uid: 1904 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,23.5 parent: 4812 - uid: 1905 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,24.5 parent: 4812 - uid: 1906 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,25.5 parent: 4812 - uid: 1907 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,26.5 parent: 4812 - uid: 1908 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,27.5 parent: 4812 - uid: 1909 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,28.5 parent: 4812 - uid: 1910 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,29.5 parent: 4812 - uid: 1911 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,30.5 parent: 4812 - uid: 1912 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,31.5 parent: 4812 - uid: 1913 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,31.5 parent: 4812 - uid: 1914 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,31.5 parent: 4812 - uid: 1915 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,30.5 parent: 4812 - uid: 1916 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,30.5 parent: 4812 - uid: 1920 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,23.5 parent: 4812 - uid: 1921 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,23.5 parent: 4812 - uid: 1922 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,23.5 parent: 4812 - uid: 1923 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,21.5 parent: 4812 - uid: 1946 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,25.5 parent: 4812 - uid: 1947 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,26.5 parent: 4812 - uid: 1948 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,21.5 parent: 4812 - uid: 1949 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -10.5,21.5 parent: 4812 - uid: 1950 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,21.5 parent: 4812 - uid: 1951 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,21.5 parent: 4812 - uid: 1954 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,21.5 parent: 4812 - uid: 1955 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,21.5 parent: 4812 - uid: 1956 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,30.5 parent: 4812 - uid: 1957 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -10.5,30.5 parent: 4812 - uid: 1958 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,30.5 parent: 4812 - uid: 1959 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,30.5 parent: 4812 - uid: 1960 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,30.5 parent: 4812 - uid: 1961 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,30.5 parent: 4812 - uid: 1967 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,27.5 parent: 4812 - uid: 1968 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,28.5 parent: 4812 - uid: 1969 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,29.5 parent: 4812 - uid: 1970 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,29.5 parent: 4812 - uid: 1971 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,28.5 parent: 4812 - uid: 1972 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,27.5 parent: 4812 - uid: 1973 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,26.5 parent: 4812 - uid: 1974 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,25.5 parent: 4812 - uid: 1976 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,23.5 parent: 4812 - uid: 1977 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,22.5 parent: 4812 - uid: 2075 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,24.5 parent: 4812 - uid: 2609 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,21.5 parent: 4812 - uid: 2612 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,21.5 parent: 4812 - uid: 2746 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,36.5 parent: 4812 - uid: 2747 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,28.5 parent: 4812 - uid: 2748 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,29.5 parent: 4812 - uid: 2749 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,30.5 parent: 4812 - uid: 2750 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,31.5 parent: 4812 - uid: 2753 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,33.5 parent: 4812 - uid: 2755 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,23.5 parent: 4812 - uid: 2756 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,36.5 parent: 4812 - uid: 2757 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,32.5 parent: 4812 - uid: 2758 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,33.5 parent: 4812 - uid: 2766 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,32.5 parent: 4812 - uid: 2767 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,35.5 parent: 4812 - uid: 2769 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,32.5 parent: 4812 - uid: 2774 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,29.5 parent: 4812 - uid: 2778 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,34.5 parent: 4812 - uid: 2820 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,33.5 parent: 4812 - uid: 2822 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,22.5 parent: 4812 - uid: 2824 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,28.5 parent: 4812 - uid: 2825 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,29.5 parent: 4812 - uid: 2828 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,28.5 parent: 4812 - uid: 2829 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,20.5 parent: 4812 - uid: 2830 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,18.5 parent: 4812 - uid: 2831 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,17.5 parent: 4812 - uid: 2841 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,35.5 parent: 4812 - uid: 2896 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 25.5,12.5 parent: 4812 - uid: 2897 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 25.5,11.5 parent: 4812 - uid: 2898 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,11.5 parent: 4812 - uid: 2899 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,11.5 parent: 4812 - uid: 2900 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,11.5 parent: 4812 - uid: 2901 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,11.5 parent: 4812 - uid: 2903 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 25.5,16.5 parent: 4812 - uid: 2904 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 25.5,17.5 parent: 4812 - uid: 2905 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,17.5 parent: 4812 - uid: 2906 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,17.5 parent: 4812 - uid: 2942 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,29.5 parent: 4812 - uid: 3006 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,22.5 parent: 4812 - uid: 3042 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,23.5 parent: 4812 - uid: 3118 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,34.5 parent: 4812 - uid: 3150 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,33.5 parent: 4812 - uid: 3189 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,36.5 parent: 4812 - uid: 3193 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,33.5 parent: 4812 - uid: 3212 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,9.5 parent: 4812 - uid: 3288 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,6.5 parent: 4812 - uid: 3352 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,9.5 parent: 4812 - uid: 3355 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,9.5 parent: 4812 - uid: 3356 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,9.5 parent: 4812 - uid: 3357 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,9.5 parent: 4812 - uid: 3391 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,6.5 parent: 4812 - uid: 3428 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,37.5 parent: 4812 - uid: 3429 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,37.5 parent: 4812 - uid: 3430 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,36.5 parent: 4812 - uid: 3431 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,36.5 parent: 4812 - uid: 3432 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,37.5 parent: 4812 - uid: 3436 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,33.5 parent: 4812 - uid: 3437 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,31.5 parent: 4812 - uid: 3486 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,43.5 parent: 4812 - uid: 3487 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,44.5 parent: 4812 - uid: 3488 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,45.5 parent: 4812 - uid: 3489 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,46.5 parent: 4812 - uid: 3490 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,47.5 parent: 4812 - uid: 3491 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,48.5 parent: 4812 - uid: 3492 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,43.5 parent: 4812 - uid: 3493 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,43.5 parent: 4812 - uid: 3494 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,43.5 parent: 4812 - uid: 3495 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,43.5 parent: 4812 - uid: 3496 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,42.5 parent: 4812 - uid: 3497 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,42.5 parent: 4812 - uid: 3498 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,42.5 parent: 4812 - uid: 3499 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,42.5 parent: 4812 - uid: 3500 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,42.5 parent: 4812 - uid: 3501 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,43.5 parent: 4812 - uid: 3502 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,43.5 parent: 4812 - uid: 3504 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,43.5 parent: 4812 - uid: 3505 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,43.5 parent: 4812 - uid: 3506 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,44.5 parent: 4812 - uid: 3507 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,46.5 parent: 4812 - uid: 3508 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,44.5 parent: 4812 - uid: 3509 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,45.5 parent: 4812 - uid: 3510 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,46.5 parent: 4812 - uid: 3511 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,47.5 parent: 4812 - uid: 3512 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,47.5 parent: 4812 - uid: 3513 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,47.5 parent: 4812 - uid: 3514 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,48.5 parent: 4812 - uid: 3515 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,48.5 parent: 4812 - uid: 3516 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,49.5 parent: 4812 - uid: 3517 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,50.5 parent: 4812 - uid: 3518 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,51.5 parent: 4812 - uid: 3519 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,52.5 parent: 4812 - uid: 3520 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,53.5 parent: 4812 - uid: 3521 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,54.5 parent: 4812 - uid: 3522 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,55.5 parent: 4812 - uid: 3523 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,55.5 parent: 4812 - uid: 3524 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,56.5 parent: 4812 - uid: 3525 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,56.5 parent: 4812 - uid: 3526 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,57.5 parent: 4812 - uid: 3527 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,57.5 parent: 4812 - uid: 3528 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,58.5 parent: 4812 - uid: 3529 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,58.5 parent: 4812 - uid: 3530 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,58.5 parent: 4812 - uid: 3531 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,58.5 parent: 4812 - uid: 3532 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,58.5 parent: 4812 - uid: 3533 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,57.5 parent: 4812 - uid: 3534 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,57.5 parent: 4812 - uid: 3535 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,56.5 parent: 4812 - uid: 3536 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,56.5 parent: 4812 - uid: 3537 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,55.5 parent: 4812 - uid: 3538 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,55.5 parent: 4812 - uid: 3539 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,55.5 parent: 4812 - uid: 3540 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,54.5 parent: 4812 - uid: 3541 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,53.5 parent: 4812 - uid: 3542 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,52.5 parent: 4812 - uid: 3543 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,51.5 parent: 4812 - uid: 3544 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,50.5 parent: 4812 - uid: 3545 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,49.5 parent: 4812 - uid: 3546 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,48.5 parent: 4812 - uid: 3547 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,57.5 parent: 4812 - uid: 3548 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,57.5 parent: 4812 - uid: 3549 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,57.5 parent: 4812 - uid: 3550 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,56.5 parent: 4812 - uid: 3551 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,56.5 parent: 4812 - uid: 3552 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,48.5 parent: 4812 - uid: 3553 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,48.5 parent: 4812 - uid: 3554 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,48.5 parent: 4812 - uid: 3555 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,48.5 parent: 4812 - uid: 3556 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,48.5 parent: 4812 - uid: 3557 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,48.5 parent: 4812 - uid: 3558 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,47.5 parent: 4812 - uid: 3559 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,47.5 parent: 4812 - uid: 3560 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,44.5 parent: 4812 - uid: 3561 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,46.5 parent: 4812 - uid: 3562 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,47.5 parent: 4812 - uid: 3563 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,46.5 parent: 4812 - uid: 3564 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,44.5 parent: 4812 - uid: 3565 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,47.5 parent: 4812 - uid: 3566 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,49.5 parent: 4812 - uid: 3567 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,50.5 parent: 4812 - uid: 3568 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,51.5 parent: 4812 - uid: 3569 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,52.5 parent: 4812 - uid: 3570 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,53.5 parent: 4812 - uid: 3571 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,54.5 parent: 4812 - uid: 3572 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,54.5 parent: 4812 - uid: 3573 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,53.5 parent: 4812 - uid: 3574 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,52.5 parent: 4812 - uid: 3575 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,51.5 parent: 4812 - uid: 3576 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,50.5 parent: 4812 - uid: 3577 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,49.5 parent: 4812 - uid: 3691 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,54.5 parent: 4812 - uid: 3692 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,54.5 parent: 4812 - uid: 3693 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,52.5 parent: 4812 - uid: 3694 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,51.5 parent: 4812 - uid: 3695 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,51.5 parent: 4812 - uid: 3696 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,51.5 parent: 4812 - uid: 3697 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,52.5 parent: 4812 - uid: 3717 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,3.5 parent: 4812 - uid: 3718 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,3.5 parent: 4812 - uid: 3719 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,4.5 parent: 4812 - uid: 3720 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,5.5 parent: 4812 - uid: 3721 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,2.5 parent: 4812 - uid: 3722 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,7.5 parent: 4812 - uid: 3723 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,2.5 parent: 4812 - uid: 3724 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,3.5 parent: 4812 - uid: 3725 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,4.5 parent: 4812 - uid: 3727 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 25.5,2.5 parent: 4812 - uid: 3728 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,8.5 parent: 4812 - uid: 3729 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,6.5 parent: 4812 - uid: 3730 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,2.5 parent: 4812 - uid: 3731 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,2.5 parent: 4812 - uid: 3990 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,8.5 parent: 4812 - uid: 3991 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,7.5 parent: 4812 - uid: 3992 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,6.5 parent: 4812 - uid: 3993 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,5.5 parent: 4812 - uid: 3994 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 25.5,5.5 parent: 4812 - uid: 3995 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,5.5 parent: 4812 - uid: 3996 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 32.5,5.5 parent: 4812 - uid: 3997 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 31.5,5.5 parent: 4812 - uid: 3998 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 30.5,5.5 parent: 4812 - uid: 3999 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 29.5,5.5 parent: 4812 - uid: 4000 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 28.5,5.5 parent: 4812 - uid: 4001 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 27.5,5.5 parent: 4812 - uid: 4081 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-4.5 parent: 4812 - uid: 4082 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,-4.5 parent: 4812 - uid: 4083 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,-4.5 parent: 4812 - uid: 4084 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,-5.5 parent: 4812 - uid: 4085 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,-5.5 parent: 4812 - uid: 4086 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,-4.5 parent: 4812 - uid: 4087 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 32.5,-10.5 parent: 4812 - uid: 4088 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 31.5,-10.5 parent: 4812 - uid: 4089 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 30.5,-10.5 parent: 4812 - uid: 4090 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 29.5,-10.5 parent: 4812 - uid: 4091 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 28.5,-10.5 parent: 4812 - uid: 4092 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,-10.5 parent: 4812 - uid: 4093 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,-9.5 parent: 4812 - uid: 4094 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,-8.5 parent: 4812 - uid: 4095 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 25.5,-8.5 parent: 4812 - uid: 4096 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,-8.5 parent: 4812 - uid: 4097 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-8.5 parent: 4812 - uid: 4098 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,-8.5 parent: 4812 - uid: 4101 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,-8.5 parent: 4812 - uid: 4102 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,-8.5 parent: 4812 - uid: 4103 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,-8.5 parent: 4812 - uid: 4104 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-8.5 parent: 4812 - uid: 4105 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-8.5 parent: 4812 - uid: 4106 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-9.5 parent: 4812 - uid: 4107 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-10.5 parent: 4812 - uid: 4108 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,-6.5 parent: 4812 - uid: 4109 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,-6.5 parent: 4812 - uid: 4638 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,-36.5 parent: 4812 - uid: 4639 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,-36.5 parent: 4812 - uid: 4640 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,-36.5 parent: 4812 - uid: 4641 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,-36.5 parent: 4812 - uid: 4642 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-36.5 parent: 4812 - uid: 4643 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,-36.5 parent: 4812 - uid: 4681 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,-40.5 parent: 4812 - uid: 4685 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,-53.5 parent: 4812 - uid: 4686 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,-53.5 parent: 4812 - uid: 4693 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,-39.5 parent: 4812 - uid: 4694 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,-37.5 parent: 4812 - uid: 4696 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,-40.5 parent: 4812 - uid: 4789 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,-29.5 parent: 4812 - uid: 4790 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -8.5,-29.5 parent: 4812 - uid: 4791 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,-30.5 parent: 4812 - uid: 4792 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,-31.5 parent: 4812 - uid: 4828 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,23.5 parent: 4812 - uid: 4829 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,23.5 parent: 4812 - uid: 4830 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,23.5 parent: 4812 - uid: 4831 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,23.5 parent: 4812 - uid: 4832 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,23.5 parent: 4812 - uid: 4886 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,23.5 parent: 4812 - uid: 4887 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,22.5 parent: 4812 - uid: 4898 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,21.5 parent: 4812 - uid: 4917 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-29.5 parent: 4812 - uid: 4936 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-27.5 parent: 4812 - uid: 5016 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-24.5 parent: 4812 - uid: 5027 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,19.5 parent: 4812 - uid: 5042 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,-59.5 parent: 4812 - uid: 5126 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,20.5 parent: 4812 - uid: 5285 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -4.5,-24.5 parent: 4812 - uid: 5286 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -4.5,-23.5 parent: 4812 - uid: 5287 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -3.5,-23.5 parent: 4812 - uid: 5288 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -1.5,-23.5 parent: 4812 - uid: 5289 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -0.5,-23.5 parent: 4812 - uid: 5290 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -0.5,-24.5 parent: 4812 - uid: 5291 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -0.5,-25.5 parent: 4812 - uid: 5292 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -0.5,-26.5 parent: 4812 - uid: 5293 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -3.5,-30.5 parent: 4812 - uid: 5294 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -4.5,-30.5 parent: 4812 - uid: 5295 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -4.5,-29.5 parent: 4812 - uid: 5296 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -1.5,-30.5 parent: 4812 - uid: 5297 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -0.5,-30.5 parent: 4812 - uid: 5298 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -0.5,-29.5 parent: 4812 - uid: 5299 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -0.5,-28.5 parent: 4812 - uid: 5312 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-13.5 parent: 4812 - uid: 5314 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,-13.5 parent: 4812 - uid: 5316 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,-13.5 parent: 4812 - uid: 5330 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,-13.5 parent: 4812 - uid: 5331 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,-19.5 parent: 4812 - uid: 5332 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,-19.5 parent: 4812 - uid: 5336 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,-19.5 parent: 4812 - uid: 5337 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,-19.5 parent: 4812 - uid: 5395 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-22.5 parent: 4812 - uid: 5397 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,-22.5 parent: 4812 - uid: 5398 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-18.5 parent: 4812 - uid: 5400 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-19.5 parent: 4812 - uid: 5401 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-17.5 parent: 4812 - uid: 5402 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-16.5 parent: 4812 - uid: 5403 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-16.5 parent: 4812 - uid: 5404 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-16.5 parent: 4812 - uid: 5405 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,-16.5 parent: 4812 - uid: 5406 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,-16.5 parent: 4812 - uid: 5407 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-13.5 parent: 4812 - uid: 5408 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-14.5 parent: 4812 - uid: 5409 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,-13.5 parent: 4812 - uid: 5410 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,-13.5 parent: 4812 - uid: 5411 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-13.5 parent: 4812 - uid: 5412 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,-17.5 parent: 4812 - uid: 5413 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,-19.5 parent: 4812 - uid: 5414 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,-22.5 parent: 4812 - uid: 5432 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,-24.5 parent: 4812 - uid: 5433 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,-28.5 parent: 4812 - uid: 5434 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,-29.5 parent: 4812 - uid: 5435 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-29.5 parent: 4812 - uid: 5436 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,-29.5 parent: 4812 - uid: 5437 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,-29.5 parent: 4812 - uid: 5438 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,-29.5 parent: 4812 - uid: 5439 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,-29.5 parent: 4812 - uid: 5440 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-29.5 parent: 4812 - uid: 5441 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-29.5 parent: 4812 - uid: 5442 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,-29.5 parent: 4812 - uid: 5443 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-29.5 parent: 4812 - uid: 5444 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-29.5 parent: 4812 - uid: 5445 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,-29.5 parent: 4812 - uid: 5446 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-29.5 parent: 4812 - uid: 5447 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-28.5 parent: 4812 - uid: 5448 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-27.5 parent: 4812 - uid: 5449 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-26.5 parent: 4812 - uid: 5450 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-25.5 parent: 4812 - uid: 5451 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,-26.5 parent: 4812 - uid: 5452 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-23.5 parent: 4812 - uid: 5453 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-22.5 parent: 4812 - uid: 5454 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,-22.5 parent: 4812 - uid: 5455 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,-22.5 parent: 4812 - uid: 5456 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-22.5 parent: 4812 - uid: 5469 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-17.5 parent: 4812 - uid: 5470 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-18.5 parent: 4812 - uid: 5471 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-19.5 parent: 4812 - uid: 5473 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-22.5 parent: 4812 - uid: 5479 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,-27.5 parent: 4812 - uid: 5480 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,-27.5 parent: 4812 - uid: 5500 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,-29.5 parent: 4812 - uid: 5501 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,-22.5 parent: 4812 - uid: 5502 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,-22.5 parent: 4812 - uid: 5505 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-21.5 parent: 4812 - uid: 5506 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,-21.5 parent: 4812 - uid: 5510 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 28.5,-21.5 parent: 4812 - uid: 5511 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-19.5 parent: 4812 - uid: 5512 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,-27.5 parent: 4812 - uid: 5515 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,-27.5 parent: 4812 - uid: 5516 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 25.5,-27.5 parent: 4812 - uid: 5517 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,-27.5 parent: 4812 - uid: 5518 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,-28.5 parent: 4812 - uid: 5519 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,-28.5 parent: 4812 - uid: 5520 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,-30.5 parent: 4812 - uid: 5521 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,-30.5 parent: 4812 - uid: 5522 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,-31.5 parent: 4812 - uid: 5523 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 25.5,-31.5 parent: 4812 - uid: 5524 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,-31.5 parent: 4812 - uid: 5525 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-31.5 parent: 4812 - uid: 5526 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,-31.5 parent: 4812 - uid: 5527 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,-31.5 parent: 4812 - uid: 5528 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,-31.5 parent: 4812 - uid: 5529 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,-31.5 parent: 4812 - uid: 5530 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 29.5,-21.5 parent: 4812 - uid: 5531 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 29.5,-20.5 parent: 4812 - uid: 5532 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 29.5,-19.5 parent: 4812 - uid: 5556 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 27.5,-31.5 parent: 4812 - uid: 5557 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 28.5,-31.5 parent: 4812 - uid: 5558 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 29.5,-31.5 parent: 4812 - uid: 5559 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 30.5,-31.5 parent: 4812 - uid: 5560 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 30.5,-30.5 parent: 4812 - uid: 5561 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 30.5,-29.5 parent: 4812 - uid: 5568 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 30.5,-22.5 parent: 4812 - uid: 5569 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 30.5,-21.5 parent: 4812 - uid: 5595 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,18.5 parent: 4812 - uid: 5769 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 31.5,-29.5 parent: 4812 - uid: 5770 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 32.5,-29.5 parent: 4812 - uid: 5772 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 34.5,-29.5 parent: 4812 - uid: 5773 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 35.5,-29.5 parent: 4812 - uid: 5774 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 36.5,-29.5 parent: 4812 - uid: 5775 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 36.5,-28.5 parent: 4812 - uid: 5776 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 36.5,-27.5 parent: 4812 - uid: 5777 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 36.5,-26.5 parent: 4812 - uid: 5778 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 36.5,-25.5 parent: 4812 - uid: 5779 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 36.5,-24.5 parent: 4812 - uid: 5780 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 36.5,-23.5 parent: 4812 - uid: 5781 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 36.5,-22.5 parent: 4812 - uid: 5785 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 31.5,-22.5 parent: 4812 - uid: 5786 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 35.5,-22.5 parent: 4812 - uid: 5826 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,-59.5 parent: 4812 - uid: 5904 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 13.5,-30.5 parent: 4812 - uid: 5905 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 13.5,-31.5 parent: 4812 - uid: 5906 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 17.5,-30.5 parent: 4812 - uid: 5907 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 17.5,-31.5 parent: 4812 - uid: 5908 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 17.5,-32.5 parent: 4812 - uid: 5909 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 16.5,-32.5 parent: 4812 - uid: 5910 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 13.5,-32.5 parent: 4812 - uid: 5911 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 14.5,-32.5 parent: 4812 - uid: 6546 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-26.5 parent: 4812 - uid: 6547 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-25.5 parent: 4812 - uid: 6559 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,-13.5 parent: 4812 - uid: 6560 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-18.5 parent: 4812 - uid: 6561 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-16.5 parent: 4812 - uid: 6562 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-14.5 parent: 4812 - uid: 6563 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-13.5 parent: 4812 - uid: 6564 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-19.5 parent: 4812 - uid: 6565 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -10.5,-19.5 parent: 4812 - uid: 6566 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,-19.5 parent: 4812 - uid: 6567 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,-17.5 parent: 4812 - uid: 6568 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,-15.5 parent: 4812 - uid: 6569 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,-13.5 parent: 4812 - uid: 6696 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-37.5 parent: 4812 - uid: 6697 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,-37.5 parent: 4812 - uid: 6698 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,-37.5 parent: 4812 - uid: 6699 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,-38.5 parent: 4812 - uid: 6700 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,-39.5 parent: 4812 - uid: 6701 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,-40.5 parent: 4812 - uid: 6702 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-40.5 parent: 4812 - uid: 6704 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,-40.5 parent: 4812 - uid: 6705 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-40.5 parent: 4812 - uid: 6706 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,-40.5 parent: 4812 - uid: 6707 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,-40.5 parent: 4812 - uid: 6759 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,-29.5 parent: 4812 - uid: 6760 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,-30.5 parent: 4812 - uid: 6761 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,-31.5 parent: 4812 - uid: 6762 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,-32.5 parent: 4812 - uid: 6763 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,-33.5 parent: 4812 - uid: 6900 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,-33.5 parent: 4812 - uid: 6901 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -8.5,-33.5 parent: 4812 - uid: 7281 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-28.5 parent: 4812 - uid: 7289 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,-29.5 parent: 4812 - uid: 7292 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-29.5 parent: 4812 - uid: 7293 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -26.5,-29.5 parent: 4812 - uid: 7294 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,-29.5 parent: 4812 - uid: 7337 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-24.5 parent: 4812 - uid: 7635 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,30.5 parent: 4812 - uid: 7636 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,29.5 parent: 4812 - uid: 7637 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,30.5 parent: 4812 - uid: 7638 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,30.5 parent: 4812 - uid: 7639 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,30.5 parent: 4812 - uid: 7640 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,29.5 parent: 4812 - uid: 7641 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,21.5 parent: 4812 - uid: 7642 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,22.5 parent: 4812 - uid: 7643 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,23.5 parent: 4812 - uid: 7644 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,24.5 parent: 4812 - uid: 7645 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,26.5 parent: 4812 - uid: 7646 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,27.5 parent: 4812 - uid: 7647 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,28.5 parent: 4812 - uid: 7648 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,30.5 parent: 4812 - uid: 7649 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,29.5 parent: 4812 - uid: 7650 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,29.5 parent: 4812 - uid: 7651 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,29.5 parent: 4812 - uid: 7652 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,21.5 parent: 4812 - uid: 7653 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,21.5 parent: 4812 - uid: 7654 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,22.5 parent: 4812 - uid: 7656 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,24.5 parent: 4812 - uid: 7657 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,25.5 parent: 4812 - uid: 7658 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,26.5 parent: 4812 - uid: 7659 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,27.5 parent: 4812 - uid: 7660 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,28.5 parent: 4812 - uid: 7661 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,32.5 parent: 4812 - uid: 7662 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,33.5 parent: 4812 - uid: 7663 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,33.5 parent: 4812 - uid: 7664 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -26.5,33.5 parent: 4812 - uid: 7670 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -30.5,33.5 parent: 4812 - uid: 7671 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,33.5 parent: 4812 - uid: 7672 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,33.5 parent: 4812 - uid: 7673 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,33.5 parent: 4812 - uid: 7674 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,28.5 parent: 4812 - uid: 7675 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,29.5 parent: 4812 - uid: 7676 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,30.5 parent: 4812 - uid: 7677 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,31.5 parent: 4812 - uid: 7678 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,32.5 parent: 4812 - uid: 7679 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,28.5 parent: 4812 - uid: 7680 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,21.5 parent: 4812 - uid: 7681 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,21.5 parent: 4812 - uid: 7686 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,21.5 parent: 4812 - uid: 7687 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -26.5,21.5 parent: 4812 - uid: 7688 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,21.5 parent: 4812 - uid: 7689 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,23.5 parent: 4812 - uid: 7690 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,25.5 parent: 4812 - uid: 7691 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,25.5 parent: 4812 - uid: 7692 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,22.5 parent: 4812 - uid: 7693 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,25.5 parent: 4812 - uid: 7694 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,25.5 parent: 4812 - uid: 7695 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,21.5 parent: 4812 - uid: 7696 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,27.5 parent: 4812 - uid: 7697 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,26.5 parent: 4812 - uid: 7698 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,25.5 parent: 4812 - uid: 7699 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,24.5 parent: 4812 - uid: 7700 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,25.5 parent: 4812 - uid: 7701 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,26.5 parent: 4812 - uid: 7702 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,27.5 parent: 4812 - uid: 7703 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,28.5 parent: 4812 - uid: 7704 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,28.5 parent: 4812 - uid: 7705 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,28.5 parent: 4812 - uid: 7706 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,28.5 parent: 4812 - uid: 7707 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,28.5 parent: 4812 - uid: 7712 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,9.5 parent: 4812 - uid: 7713 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,9.5 parent: 4812 - uid: 7714 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -26.5,9.5 parent: 4812 - uid: 7715 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,9.5 parent: 4812 - uid: 7718 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,18.5 parent: 4812 - uid: 7719 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,15.5 parent: 4812 - uid: 7720 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,15.5 parent: 4812 - uid: 7721 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -26.5,15.5 parent: 4812 - uid: 7722 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,15.5 parent: 4812 - uid: 7723 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,12.5 parent: 4812 - uid: 7724 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,12.5 parent: 4812 - uid: 7732 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,18.5 parent: 4812 - uid: 7733 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,22.5 parent: 4812 - uid: 7734 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,22.5 parent: 4812 - uid: 7735 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,22.5 parent: 4812 - uid: 7736 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,22.5 parent: 4812 - uid: 7737 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,18.5 parent: 4812 - uid: 7738 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,19.5 parent: 4812 - uid: 7739 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,20.5 parent: 4812 - uid: 7740 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,18.5 parent: 4812 - uid: 7743 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,16.5 parent: 4812 - uid: 7744 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,13.5 parent: 4812 - uid: 7749 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,9.5 parent: 4812 - uid: 7750 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,9.5 parent: 4812 - uid: 7751 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -30.5,9.5 parent: 4812 - uid: 7753 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,9.5 parent: 4812 - uid: 7754 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,9.5 parent: 4812 - uid: 7755 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,9.5 parent: 4812 - uid: 7756 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,21.5 parent: 4812 - uid: 7757 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,22.5 parent: 4812 - uid: 7758 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,17.5 parent: 4812 - uid: 7759 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,16.5 parent: 4812 - uid: 7760 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,15.5 parent: 4812 - uid: 7761 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,14.5 parent: 4812 - uid: 7762 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,13.5 parent: 4812 - uid: 7763 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,13.5 parent: 4812 - uid: 7765 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,13.5 parent: 4812 - uid: 7766 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,13.5 parent: 4812 - uid: 7767 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,13.5 parent: 4812 - uid: 7768 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,9.5 parent: 4812 - uid: 7769 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,9.5 parent: 4812 - uid: 7770 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,9.5 parent: 4812 - uid: 7771 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,9.5 parent: 4812 - uid: 7772 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,9.5 parent: 4812 - uid: 7773 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,9.5 parent: 4812 - uid: 7774 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,10.5 parent: 4812 - uid: 7775 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,11.5 parent: 4812 - uid: 7776 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,12.5 parent: 4812 - uid: 7937 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,6.5 parent: 4812 - uid: 7938 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,6.5 parent: 4812 - uid: 7939 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,6.5 parent: 4812 - uid: 7940 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -30.5,6.5 parent: 4812 - uid: 7941 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,6.5 parent: 4812 - uid: 7942 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,6.5 parent: 4812 - uid: 7943 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,6.5 parent: 4812 - uid: 7944 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,6.5 parent: 4812 - uid: 7945 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,6.5 parent: 4812 - uid: 7946 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,6.5 parent: 4812 - uid: 7947 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,6.5 parent: 4812 - uid: 7948 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,6.5 parent: 4812 - uid: 7950 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,6.5 parent: 4812 - uid: 7951 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,7.5 parent: 4812 - uid: 7952 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,8.5 parent: 4812 - uid: 7955 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,8.5 parent: 4812 - uid: 8621 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,0.5 parent: 4812 - uid: 8623 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,0.5 parent: 4812 - uid: 8624 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,0.5 parent: 4812 - uid: 8625 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,1.5 parent: 4812 - uid: 8626 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,5.5 parent: 4812 - uid: 8635 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,0.5 parent: 4812 - uid: 8639 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,4.5 parent: 4812 - uid: 8641 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-0.5 parent: 4812 - uid: 8642 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-1.5 parent: 4812 - uid: 8643 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-2.5 parent: 4812 - uid: 8644 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-3.5 parent: 4812 - uid: 8645 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-4.5 parent: 4812 - uid: 8646 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-5.5 parent: 4812 - uid: 8647 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-6.5 parent: 4812 - uid: 8648 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,-4.5 parent: 4812 - uid: 8649 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-4.5 parent: 4812 - uid: 8650 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,-4.5 parent: 4812 - uid: 8651 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-4.5 parent: 4812 - uid: 8652 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-5.5 parent: 4812 - uid: 8653 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-9.5 parent: 4812 - uid: 8654 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-10.5 parent: 4812 - uid: 8655 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,-10.5 parent: 4812 - uid: 8656 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,-10.5 parent: 4812 - uid: 8657 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,-10.5 parent: 4812 - uid: 8658 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-10.5 parent: 4812 - uid: 8659 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-10.5 parent: 4812 - uid: 8660 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,-10.5 parent: 4812 - uid: 8661 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,-9.5 parent: 4812 - uid: 8662 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,-7.5 parent: 4812 - uid: 8663 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,-6.5 parent: 4812 - uid: 8664 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-10.5 parent: 4812 - uid: 8665 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-10.5 parent: 4812 - uid: 8666 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-9.5 parent: 4812 - uid: 8667 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-7.5 parent: 4812 - uid: 8668 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-6.5 parent: 4812 - uid: 8669 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-5.5 parent: 4812 - uid: 8670 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-4.5 parent: 4812 - uid: 8671 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-3.5 parent: 4812 - uid: 8672 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-2.5 parent: 4812 - uid: 8673 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-1.5 parent: 4812 - uid: 8674 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-0.5 parent: 4812 - uid: 8675 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,0.5 parent: 4812 - uid: 8712 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,-0.5 parent: 4812 - uid: 8713 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,-0.5 parent: 4812 - uid: 8714 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,-0.5 parent: 4812 - uid: 8715 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,-1.5 parent: 4812 - uid: 8716 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,-2.5 parent: 4812 - uid: 8717 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,-3.5 parent: 4812 - uid: 8718 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,-4.5 parent: 4812 - uid: 8719 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,-4.5 parent: 4812 - uid: 8720 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,-4.5 parent: 4812 - uid: 8724 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-4.5 parent: 4812 - uid: 8726 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-2.5 parent: 4812 - uid: 8727 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-1.5 parent: 4812 - uid: 8728 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-0.5 parent: 4812 - uid: 8729 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -45.5,-0.5 parent: 4812 - uid: 8730 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -44.5,-0.5 parent: 4812 - uid: 8731 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -43.5,-0.5 parent: 4812 - uid: 8732 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -42.5,-0.5 parent: 4812 - uid: 8733 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -45.5,-4.5 parent: 4812 - uid: 8751 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-3.5 parent: 4812 - uid: 8789 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,-41.5 parent: 4812 - uid: 8790 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -26.5,-41.5 parent: 4812 - uid: 8791 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,-41.5 parent: 4812 - uid: 8793 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,-41.5 parent: 4812 - uid: 8794 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -30.5,-41.5 parent: 4812 - uid: 8795 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,-41.5 parent: 4812 - uid: 8796 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-41.5 parent: 4812 - uid: 8797 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-40.5 parent: 4812 - uid: 8798 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-39.5 parent: 4812 - uid: 8799 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-38.5 parent: 4812 - uid: 8800 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-38.5 parent: 4812 - uid: 8801 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,-38.5 parent: 4812 - uid: 8802 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-38.5 parent: 4812 - uid: 8809 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,-38.5 parent: 4812 - uid: 8811 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,-36.5 parent: 4812 - uid: 8812 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,-34.5 parent: 4812 - uid: 8813 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,-33.5 parent: 4812 - uid: 8814 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,-32.5 parent: 4812 - uid: 8815 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,-35.5 parent: 4812 - uid: 8816 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-37.5 parent: 4812 - uid: 8817 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-36.5 parent: 4812 - uid: 8818 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-35.5 parent: 4812 - uid: 8819 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-34.5 parent: 4812 - uid: 8820 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-35.5 parent: 4812 - uid: 8821 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-35.5 parent: 4812 - uid: 8822 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-34.5 parent: 4812 - uid: 8823 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-32.5 parent: 4812 - uid: 8824 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-32.5 parent: 4812 - uid: 8825 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,-32.5 parent: 4812 - uid: 8826 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-32.5 parent: 4812 - uid: 8827 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,-32.5 parent: 4812 - uid: 8828 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-32.5 parent: 4812 - uid: 8829 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,-32.5 parent: 4812 - uid: 8830 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,-32.5 parent: 4812 - uid: 8831 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,-32.5 parent: 4812 - uid: 8873 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-11.5 parent: 4812 - uid: 8874 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-12.5 parent: 4812 - uid: 8875 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-13.5 parent: 4812 - uid: 8876 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-14.5 parent: 4812 - uid: 8877 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-15.5 parent: 4812 - uid: 9022 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -53.5,2.5 parent: 4812 - uid: 9091 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,12.5 parent: 4812 - uid: 9092 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,11.5 parent: 4812 - uid: 9093 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,10.5 parent: 4812 - uid: 9094 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,9.5 parent: 4812 - uid: 9095 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,8.5 parent: 4812 - uid: 9096 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,7.5 parent: 4812 - uid: 9097 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,6.5 parent: 4812 - uid: 9098 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,5.5 parent: 4812 - uid: 9100 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,3.5 parent: 4812 - uid: 9101 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,2.5 parent: 4812 - uid: 9102 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,1.5 parent: 4812 - uid: 9103 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,12.5 parent: 4812 - uid: 9104 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,11.5 parent: 4812 - uid: 9105 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,10.5 parent: 4812 - uid: 9106 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,9.5 parent: 4812 - uid: 9107 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,8.5 parent: 4812 - uid: 9108 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,7.5 parent: 4812 - uid: 9109 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,6.5 parent: 4812 - uid: 9110 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,5.5 parent: 4812 - uid: 9111 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,4.5 parent: 4812 - uid: 9112 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,3.5 parent: 4812 - uid: 9113 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,2.5 parent: 4812 - uid: 9114 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,1.5 parent: 4812 - uid: 9139 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,0.5 parent: 4812 - uid: 9140 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,0.5 parent: 4812 - uid: 9141 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -52.5,0.5 parent: 4812 - uid: 9142 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -53.5,0.5 parent: 4812 - uid: 9143 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,0.5 parent: 4812 - uid: 9144 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,0.5 parent: 4812 - uid: 9239 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,6.5 parent: 4812 - uid: 9240 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,4.5 parent: 4812 - uid: 9242 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,2.5 parent: 4812 - uid: 9243 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,2.5 parent: 4812 - uid: 9244 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -52.5,6.5 parent: 4812 - uid: 9245 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -52.5,2.5 parent: 4812 - uid: 9248 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -53.5,6.5 parent: 4812 - uid: 9256 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -52.5,4.5 parent: 4812 - uid: 9258 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -53.5,4.5 parent: 4812 - uid: 9260 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,4.5 parent: 4812 - uid: 9265 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,6.5 parent: 4812 - uid: 9266 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,8.5 parent: 4812 - uid: 9267 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,8.5 parent: 4812 - uid: 9268 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -52.5,8.5 parent: 4812 - uid: 9269 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -53.5,8.5 parent: 4812 - uid: 9270 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -53.5,10.5 parent: 4812 - uid: 9271 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -52.5,10.5 parent: 4812 - uid: 9272 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,10.5 parent: 4812 - uid: 9273 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,10.5 parent: 4812 - uid: 9274 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,12.5 parent: 4812 - uid: 9275 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,12.5 parent: 4812 - uid: 9276 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -52.5,12.5 parent: 4812 - uid: 9277 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -53.5,12.5 parent: 4812 - uid: 9284 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-5.5 parent: 4812 - uid: 9285 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -48.5,-3.5 parent: 4812 - uid: 9286 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -48.5,-2.5 parent: 4812 - uid: 9469 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,18.5 parent: 4812 - uid: 9470 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -45.5,18.5 parent: 4812 - uid: 9471 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -43.5,18.5 parent: 4812 - uid: 9472 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -42.5,18.5 parent: 4812 - uid: 9473 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -42.5,15.5 parent: 4812 - uid: 9474 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,15.5 parent: 4812 - uid: 9511 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,13.5 parent: 4812 - uid: 9517 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -47.5,-5.5 parent: 4812 - uid: 9518 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -48.5,-5.5 parent: 4812 - uid: 9519 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -49.5,-5.5 parent: 4812 - uid: 9520 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -49.5,-3.5 parent: 4812 - uid: 9521 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,-5.5 parent: 4812 - uid: 9522 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,-3.5 parent: 4812 - uid: 9579 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -42.5,-32.5 parent: 4812 - uid: 9590 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-25.5 parent: 4812 - uid: 9591 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-24.5 parent: 4812 - uid: 9592 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -48.5,-24.5 parent: 4812 - uid: 9594 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -49.5,-24.5 parent: 4812 - uid: 9595 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -49.5,-25.5 parent: 4812 - uid: 9596 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -49.5,-26.5 parent: 4812 - uid: 9597 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,-26.5 parent: 4812 - uid: 9598 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,-26.5 parent: 4812 - uid: 9604 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,-24.5 parent: 4812 - uid: 9605 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,-24.5 parent: 4812 - uid: 9606 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -56.5,-24.5 parent: 4812 - uid: 9607 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -56.5,-21.5 parent: 4812 - uid: 9644 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,-56.5 parent: 4812 - uid: 9645 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,-56.5 parent: 4812 - uid: 9824 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-16.5 parent: 4812 - uid: 9825 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-17.5 parent: 4812 - uid: 9826 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-18.5 parent: 4812 - uid: 9827 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-19.5 parent: 4812 - uid: 9828 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,-19.5 parent: 4812 - uid: 9829 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -43.5,-15.5 parent: 4812 - uid: 9831 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -45.5,-15.5 parent: 4812 - uid: 9836 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-10.5 parent: 4812 - uid: 9837 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,-5.5 parent: 4812 - uid: 9840 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-14.5 parent: 4812 - uid: 9841 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-15.5 parent: 4812 - uid: 9842 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,-5.5 parent: 4812 - uid: 9844 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,-6.5 parent: 4812 - uid: 9845 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,-7.5 parent: 4812 - uid: 9846 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,-14.5 parent: 4812 - uid: 9847 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,-13.5 parent: 4812 - uid: 9848 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,-12.5 parent: 4812 - uid: 9849 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,-11.5 parent: 4812 - uid: 9850 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,-10.5 parent: 4812 - uid: 9851 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,-9.5 parent: 4812 - uid: 9852 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,-8.5 parent: 4812 - uid: 9853 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,-14.5 parent: 4812 - uid: 9854 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -53.5,-14.5 parent: 4812 - uid: 9855 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -52.5,-14.5 parent: 4812 - uid: 9856 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,-14.5 parent: 4812 - uid: 9857 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,-14.5 parent: 4812 - uid: 9858 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -49.5,-14.5 parent: 4812 - uid: 9859 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -48.5,-14.5 parent: 4812 - uid: 9860 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -47.5,-14.5 parent: 4812 - uid: 9864 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,-10.5 parent: 4812 - uid: 9865 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,-9.5 parent: 4812 - uid: 9866 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,-8.5 parent: 4812 - uid: 9867 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,-7.5 parent: 4812 - uid: 9868 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,-6.5 parent: 4812 - uid: 9873 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -47.5,-9.5 parent: 4812 - uid: 9876 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,-10.5 parent: 4812 - uid: 9890 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -43.5,-9.5 parent: 4812 - uid: 9891 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -43.5,-10.5 parent: 4812 - uid: 9895 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -43.5,-14.5 parent: 4812 - uid: 9896 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,-9.5 parent: 4812 - uid: 9900 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -42.5,-9.5 parent: 4812 - uid: 9901 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,-19.5 parent: 4812 - uid: 9902 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,-19.5 parent: 4812 - uid: 9903 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,-19.5 parent: 4812 - uid: 9904 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -42.5,-19.5 parent: 4812 - uid: 9905 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -43.5,-19.5 parent: 4812 - uid: 9906 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -43.5,-18.5 parent: 4812 - uid: 9907 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -43.5,-17.5 parent: 4812 - uid: 9908 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -43.5,-16.5 parent: 4812 - uid: 9939 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,-21.5 parent: 4812 - uid: 9940 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,-21.5 parent: 4812 - uid: 9941 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -53.5,-21.5 parent: 4812 - uid: 9942 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -52.5,-21.5 parent: 4812 - uid: 9943 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,-21.5 parent: 4812 - uid: 9944 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,-21.5 parent: 4812 - uid: 9945 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -49.5,-21.5 parent: 4812 - uid: 9946 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -48.5,-21.5 parent: 4812 - uid: 9947 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -47.5,-21.5 parent: 4812 - uid: 9948 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-21.5 parent: 4812 - uid: 9949 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-16.5 parent: 4812 - uid: 9950 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-17.5 parent: 4812 - uid: 9951 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-18.5 parent: 4812 - uid: 9952 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -47.5,-18.5 parent: 4812 - uid: 9953 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -48.5,-18.5 parent: 4812 - uid: 9954 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -49.5,-18.5 parent: 4812 - uid: 9955 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -49.5,-19.5 parent: 4812 - uid: 9956 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -49.5,-20.5 parent: 4812 - uid: 9957 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-19.5 parent: 4812 - uid: 10635 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -47.5,-10.5 parent: 4812 - uid: 10964 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-37.5 parent: 4812 - uid: 10989 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-41.5 parent: 4812 - uid: 11006 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-40.5 parent: 4812 - uid: 11007 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-39.5 parent: 4812 - uid: 11008 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-38.5 parent: 4812 - uid: 11030 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-42.5 parent: 4812 - uid: 11031 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-43.5 parent: 4812 - uid: 11032 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,-43.5 parent: 4812 - uid: 11033 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,-43.5 parent: 4812 - uid: 11034 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,-43.5 parent: 4812 - uid: 11035 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,-44.5 parent: 4812 - uid: 11036 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,-45.5 parent: 4812 - uid: 11037 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,-45.5 parent: 4812 - uid: 11038 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-45.5 parent: 4812 - uid: 11039 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,-45.5 parent: 4812 - uid: 11040 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-45.5 parent: 4812 - uid: 11041 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-45.5 parent: 4812 - uid: 11042 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,-43.5 parent: 4812 - uid: 11043 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-44.5 parent: 4812 - uid: 11044 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-43.5 parent: 4812 - uid: 11045 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,-43.5 parent: 4812 - uid: 11046 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-43.5 parent: 4812 - uid: 11110 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-43.5 parent: 4812 - uid: 11111 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-42.5 parent: 4812 - uid: 11112 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-41.5 parent: 4812 - uid: 11113 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-40.5 parent: 4812 - uid: 11114 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-39.5 parent: 4812 - uid: 11115 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-38.5 parent: 4812 - uid: 11116 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-37.5 parent: 4812 - uid: 11117 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-36.5 parent: 4812 - uid: 11118 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-35.5 parent: 4812 - uid: 11119 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 34.5,-30.5 parent: 4812 - uid: 11120 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 34.5,-31.5 parent: 4812 - uid: 11125 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,-39.5 parent: 4812 - uid: 11128 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,-39.5 parent: 4812 - uid: 11131 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,-39.5 parent: 4812 - uid: 11132 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,-37.5 parent: 4812 - uid: 11133 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-37.5 parent: 4812 - uid: 11134 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-38.5 parent: 4812 - uid: 11135 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 27.5,-35.5 parent: 4812 - uid: 11136 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 36.5,-38.5 parent: 4812 - uid: 11137 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 37.5,-38.5 parent: 4812 - uid: 11138 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 37.5,-37.5 parent: 4812 - uid: 11140 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 38.5,-37.5 parent: 4812 - uid: 11142 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-39.5 parent: 4812 - uid: 11263 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,-37.5 parent: 4812 - uid: 11264 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 27.5,-37.5 parent: 4812 - uid: 11265 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 27.5,-36.5 parent: 4812 - uid: 11340 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 38.5,-35.5 parent: 4812 - uid: 11341 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 38.5,-34.5 parent: 4812 - uid: 11342 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 38.5,-33.5 parent: 4812 - uid: 11344 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 36.5,-31.5 parent: 4812 - uid: 11345 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 35.5,-31.5 parent: 4812 - uid: 11371 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 35.5,-39.5 parent: 4812 - uid: 11372 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 35.5,-40.5 parent: 4812 - uid: 11373 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 34.5,-40.5 parent: 4812 - uid: 11374 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 33.5,-40.5 parent: 4812 - uid: 11375 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 32.5,-40.5 parent: 4812 - uid: 11376 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 31.5,-40.5 parent: 4812 - uid: 11377 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 30.5,-40.5 parent: 4812 - uid: 11378 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 29.5,-40.5 parent: 4812 - uid: 11379 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 29.5,-39.5 parent: 4812 - uid: 11380 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 29.5,-38.5 parent: 4812 - uid: 11381 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 29.5,-37.5 parent: 4812 - uid: 11382 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 28.5,-37.5 parent: 4812 @@ -81092,4217 +76463,3013 @@ entities: entities: - uid: 1 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 0.5,-9.5 parent: 4812 - uid: 2 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 0.5,-10.5 parent: 4812 - uid: 3 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,-4.5 parent: 4812 - uid: 4 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,-3.5 parent: 4812 - uid: 5 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,0.5 parent: 4812 - uid: 6 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,1.5 parent: 4812 - uid: 7 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,1.5 parent: 4812 - uid: 8 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,3.5 parent: 4812 - uid: 9 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,9.5 parent: 4812 - uid: 10 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,8.5 parent: 4812 - uid: 11 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,4.5 parent: 4812 - uid: 13 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,5.5 parent: 4812 - uid: 14 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,5.5 parent: 4812 - uid: 15 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,5.5 parent: 4812 - uid: 16 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,5.5 parent: 4812 - uid: 17 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,5.5 parent: 4812 - uid: 18 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,6.5 parent: 4812 - uid: 19 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,8.5 parent: 4812 - uid: 20 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,9.5 parent: 4812 - uid: 21 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,10.5 parent: 4812 - uid: 22 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,10.5 parent: 4812 - uid: 23 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,10.5 parent: 4812 - uid: 24 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,10.5 parent: 4812 - uid: 25 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,10.5 parent: 4812 - uid: 26 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,10.5 parent: 4812 - uid: 27 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,10.5 parent: 4812 - uid: 28 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,10.5 parent: 4812 - uid: 29 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,11.5 parent: 4812 - uid: 30 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,12.5 parent: 4812 - uid: 31 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -5.5,12.5 parent: 4812 - uid: 33 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -5.5,15.5 parent: 4812 - uid: 34 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -5.5,14.5 parent: 4812 - uid: 36 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 0.5,15.5 parent: 4812 - uid: 37 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 0.5,13.5 parent: 4812 - uid: 38 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 0.5,12.5 parent: 4812 - uid: 39 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,12.5 parent: 4812 - uid: 40 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,11.5 parent: 4812 - uid: 41 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,10.5 parent: 4812 - uid: 42 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,-9.5 parent: 4812 - uid: 43 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,-9.5 parent: 4812 - uid: 44 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,-10.5 parent: 4812 - uid: 45 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,-7.5 parent: 4812 - uid: 46 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,-6.5 parent: 4812 - uid: 47 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,-5.5 parent: 4812 - uid: 48 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -5.5,-10.5 parent: 4812 - uid: 49 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -5.5,-9.5 parent: 4812 - uid: 50 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -5.5,-8.5 parent: 4812 - uid: 51 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,-8.5 parent: 4812 - uid: 52 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,-4.5 parent: 4812 - uid: 53 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,-2.5 parent: 4812 - uid: 54 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,-1.5 parent: 4812 - uid: 55 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,0.5 parent: 4812 - uid: 56 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,1.5 parent: 4812 - uid: 57 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,2.5 parent: 4812 - uid: 58 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,2.5 parent: 4812 - uid: 59 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,10.5 parent: 4812 - uid: 60 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,10.5 parent: 4812 - uid: 61 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -10.5,10.5 parent: 4812 - uid: 62 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,10.5 parent: 4812 - uid: 63 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,9.5 parent: 4812 - uid: 64 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,8.5 parent: 4812 - uid: 65 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,7.5 parent: 4812 - uid: 66 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,6.5 parent: 4812 - uid: 67 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,5.5 parent: 4812 - uid: 68 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,4.5 parent: 4812 - uid: 69 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,3.5 parent: 4812 - uid: 70 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,2.5 parent: 4812 - uid: 71 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,1.5 parent: 4812 - uid: 72 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,0.5 parent: 4812 - uid: 73 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,-0.5 parent: 4812 - uid: 74 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,-1.5 parent: 4812 - uid: 75 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,-2.5 parent: 4812 - uid: 76 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,-2.5 parent: 4812 - uid: 77 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -8.5,-2.5 parent: 4812 - uid: 78 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,-2.5 parent: 4812 - uid: 79 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -10.5,-2.5 parent: 4812 - uid: 80 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,2.5 parent: 4812 - uid: 81 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -10.5,2.5 parent: 4812 - uid: 82 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-0.5 parent: 4812 - uid: 83 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,0.5 parent: 4812 - uid: 84 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,1.5 parent: 4812 - uid: 85 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,1.5 parent: 4812 - uid: 86 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,1.5 parent: 4812 - uid: 87 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,1.5 parent: 4812 - uid: 88 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-2.5 parent: 4812 - uid: 89 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-3.5 parent: 4812 - uid: 90 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-4.5 parent: 4812 - uid: 91 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,-4.5 parent: 4812 - uid: 92 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,-4.5 parent: 4812 - uid: 93 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,-4.5 parent: 4812 - uid: 94 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-4.5 parent: 4812 - uid: 95 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,-4.5 parent: 4812 - uid: 96 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,-7.5 parent: 4812 - uid: 97 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-7.5 parent: 4812 - uid: 98 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,-7.5 parent: 4812 - uid: 99 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,-8.5 parent: 4812 - uid: 100 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,-8.5 parent: 4812 - uid: 101 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,-8.5 parent: 4812 - uid: 102 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-8.5 parent: 4812 - uid: 103 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,-8.5 parent: 4812 - uid: 104 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-7.5 parent: 4812 - uid: 105 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-5.5 parent: 4812 - uid: 139 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-10.5 parent: 4812 - uid: 140 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,-10.5 parent: 4812 - uid: 141 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,-10.5 parent: 4812 - uid: 142 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,-10.5 parent: 4812 - uid: 143 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,-10.5 parent: 4812 - uid: 145 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,-10.5 parent: 4812 - uid: 146 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-10.5 parent: 4812 - uid: 147 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-9.5 parent: 4812 - uid: 148 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-8.5 parent: 4812 - uid: 149 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-7.5 parent: 4812 - uid: 150 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-6.5 parent: 4812 - uid: 151 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-5.5 parent: 4812 - uid: 152 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-4.5 parent: 4812 - uid: 153 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-3.5 parent: 4812 - uid: 154 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-2.5 parent: 4812 - uid: 155 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-1.5 parent: 4812 - uid: 156 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-0.5 parent: 4812 - uid: 157 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,0.5 parent: 4812 - uid: 158 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,1.5 parent: 4812 - uid: 159 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,2.5 parent: 4812 - uid: 161 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,4.5 parent: 4812 - uid: 162 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,5.5 parent: 4812 - uid: 163 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,6.5 parent: 4812 - uid: 164 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,7.5 parent: 4812 - uid: 165 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,8.5 parent: 4812 - uid: 166 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,9.5 parent: 4812 - uid: 167 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,10.5 parent: 4812 - uid: 168 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,11.5 parent: 4812 - uid: 169 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,12.5 parent: 4812 - uid: 177 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,13.5 parent: 4812 - uid: 180 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,15.5 parent: 4812 - uid: 181 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,18.5 parent: 4812 - uid: 182 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,17.5 parent: 4812 - uid: 183 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,18.5 parent: 4812 - uid: 185 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,18.5 parent: 4812 - uid: 186 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,12.5 parent: 4812 - uid: 189 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,7.5 parent: 4812 - uid: 190 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,6.5 parent: 4812 - uid: 191 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,6.5 parent: 4812 - uid: 192 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,6.5 parent: 4812 - uid: 193 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,6.5 parent: 4812 - uid: 194 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,5.5 parent: 4812 - uid: 195 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,-1.5 parent: 4812 - uid: 196 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,-2.5 parent: 4812 - uid: 197 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-2.5 parent: 4812 - uid: 198 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-3.5 parent: 4812 - uid: 199 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-5.5 parent: 4812 - uid: 200 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,-6.5 parent: 4812 - uid: 201 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,-5.5 parent: 4812 - uid: 202 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,-7.5 parent: 4812 - uid: 203 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,-8.5 parent: 4812 - uid: 204 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,-9.5 parent: 4812 - uid: 205 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,-10.5 parent: 4812 - uid: 206 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-10.5 parent: 4812 - uid: 207 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-10.5 parent: 4812 - uid: 208 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,-10.5 parent: 4812 - uid: 209 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-10.5 parent: 4812 - uid: 210 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,-10.5 parent: 4812 - uid: 211 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,-10.5 parent: 4812 - uid: 212 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,-10.5 parent: 4812 - uid: 213 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-10.5 parent: 4812 - uid: 214 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,-10.5 parent: 4812 - uid: 225 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-9.5 parent: 4812 - uid: 226 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-8.5 parent: 4812 - uid: 227 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-7.5 parent: 4812 - uid: 228 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-6.5 parent: 4812 - uid: 229 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-5.5 parent: 4812 - uid: 230 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,-5.5 parent: 4812 - uid: 231 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,-5.5 parent: 4812 - uid: 232 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,-4.5 parent: 4812 - uid: 233 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -8.5,-4.5 parent: 4812 - uid: 234 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,-4.5 parent: 4812 - uid: 235 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,-4.5 parent: 4812 - uid: 236 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,-4.5 parent: 4812 - uid: 237 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-4.5 parent: 4812 - uid: 238 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,-4.5 parent: 4812 - uid: 239 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,-4.5 parent: 4812 - uid: 240 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,-4.5 parent: 4812 - uid: 241 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,-4.5 parent: 4812 - uid: 242 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,-4.5 parent: 4812 - uid: 243 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-4.5 parent: 4812 - uid: 244 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,-2.5 parent: 4812 - uid: 245 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-2.5 parent: 4812 - uid: 246 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,-2.5 parent: 4812 - uid: 247 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-2.5 parent: 4812 - uid: 248 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,-2.5 parent: 4812 - uid: 249 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,-2.5 parent: 4812 - uid: 250 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,-2.5 parent: 4812 - uid: 262 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,6.5 parent: 4812 - uid: 263 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,6.5 parent: 4812 - uid: 264 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,6.5 parent: 4812 - uid: 265 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,6.5 parent: 4812 - uid: 266 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,6.5 parent: 4812 - uid: 267 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,6.5 parent: 4812 - uid: 268 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,6.5 parent: 4812 - uid: 269 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,6.5 parent: 4812 - uid: 270 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,3.5 parent: 4812 - uid: 271 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,4.5 parent: 4812 - uid: 272 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,5.5 parent: 4812 - uid: 273 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,3.5 parent: 4812 - uid: 274 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,3.5 parent: 4812 - uid: 275 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,4.5 parent: 4812 - uid: 276 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,5.5 parent: 4812 - uid: 279 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,-1.5 parent: 4812 - uid: 280 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,-0.5 parent: 4812 - uid: 281 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,0.5 parent: 4812 - uid: 282 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,0.5 parent: 4812 - uid: 283 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-1.5 parent: 4812 - uid: 284 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-0.5 parent: 4812 - uid: 285 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,0.5 parent: 4812 - uid: 286 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,7.5 parent: 4812 - uid: 287 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,8.5 parent: 4812 - uid: 288 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,9.5 parent: 4812 - uid: 289 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,11.5 parent: 4812 - uid: 290 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,12.5 parent: 4812 - uid: 291 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,13.5 parent: 4812 - uid: 292 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,13.5 parent: 4812 - uid: 293 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,13.5 parent: 4812 - uid: 294 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,13.5 parent: 4812 - uid: 295 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,13.5 parent: 4812 - uid: 296 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,13.5 parent: 4812 - uid: 318 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,4.5 parent: 4812 - uid: 429 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,9.5 parent: 4812 - uid: 898 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,7.5 parent: 4812 - uid: 899 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,8.5 parent: 4812 - uid: 900 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,9.5 parent: 4812 - uid: 1253 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,1.5 parent: 4812 - uid: 1917 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,29.5 parent: 4812 - uid: 1918 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,27.5 parent: 4812 - uid: 1919 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,27.5 parent: 4812 - uid: 1978 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,26.5 parent: 4812 - uid: 1979 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,26.5 parent: 4812 - uid: 1980 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,25.5 parent: 4812 - uid: 1981 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,27.5 parent: 4812 - uid: 1982 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,29.5 parent: 4812 - uid: 2738 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,21.5 parent: 4812 - uid: 2739 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,22.5 parent: 4812 - uid: 2740 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,23.5 parent: 4812 - uid: 2742 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,25.5 parent: 4812 - uid: 2743 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,26.5 parent: 4812 - uid: 2744 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,27.5 parent: 4812 - uid: 2745 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,28.5 parent: 4812 - uid: 2788 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,16.5 parent: 4812 - uid: 2789 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,18.5 parent: 4812 - uid: 2790 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,16.5 parent: 4812 - uid: 2791 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,16.5 parent: 4812 - uid: 2792 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,12.5 parent: 4812 - uid: 2793 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,12.5 parent: 4812 - uid: 2794 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,12.5 parent: 4812 - uid: 2795 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,12.5 parent: 4812 - uid: 2796 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,12.5 parent: 4812 - uid: 2797 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,12.5 parent: 4812 - uid: 2798 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,12.5 parent: 4812 - uid: 2799 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,12.5 parent: 4812 - uid: 2800 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,12.5 parent: 4812 - uid: 2851 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,22.5 parent: 4812 - uid: 3348 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,11.5 parent: 4812 - uid: 3351 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,11.5 parent: 4812 - uid: 3354 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,9.5 parent: 4812 - uid: 3435 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,33.5 parent: 4812 - uid: 3462 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,34.5 parent: 4812 - uid: 3463 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,33.5 parent: 4812 - uid: 3474 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,44.5 parent: 4812 - uid: 3475 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,41.5 parent: 4812 - uid: 3476 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,40.5 parent: 4812 - uid: 3980 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,37.5 parent: 4812 - uid: 3981 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,33.5 parent: 4812 - uid: 3983 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,8.5 parent: 4812 - uid: 3984 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,6.5 parent: 4812 - uid: 3985 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,5.5 parent: 4812 - uid: 3986 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,9.5 parent: 4812 - uid: 3987 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,9.5 parent: 4812 - uid: 3988 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,9.5 parent: 4812 - uid: 3989 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,9.5 parent: 4812 - uid: 4006 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,5.5 parent: 4812 - uid: 4013 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -44.5,-31.5 parent: 4812 - uid: 4014 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -43.5,-31.5 parent: 4812 - uid: 4015 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,3.5 parent: 4812 - uid: 4016 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,1.5 parent: 4812 - uid: 4017 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,1.5 parent: 4812 - uid: 4018 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,0.5 parent: 4812 - uid: 4019 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,0.5 parent: 4812 - uid: 4020 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,0.5 parent: 4812 - uid: 4021 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,0.5 parent: 4812 - uid: 4022 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,1.5 parent: 4812 - uid: 4023 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,2.5 parent: 4812 - uid: 4024 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,3.5 parent: 4812 - uid: 4025 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,4.5 parent: 4812 - uid: 4026 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,5.5 parent: 4812 - uid: 4027 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,5.5 parent: 4812 - uid: 4028 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,5.5 parent: 4812 - uid: 4029 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,5.5 parent: 4812 - uid: 4030 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,6.5 parent: 4812 - uid: 4031 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,7.5 parent: 4812 - uid: 4032 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,8.5 parent: 4812 - uid: 4033 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,2.5 parent: 4812 - uid: 4034 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,1.5 parent: 4812 - uid: 4035 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,0.5 parent: 4812 - uid: 4036 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-0.5 parent: 4812 - uid: 4037 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-1.5 parent: 4812 - uid: 4038 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-0.5 parent: 4812 - uid: 4039 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-1.5 parent: 4812 - uid: 4040 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,-1.5 parent: 4812 - uid: 4041 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,-1.5 parent: 4812 - uid: 4042 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,-1.5 parent: 4812 - uid: 4043 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,-1.5 parent: 4812 - uid: 4044 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,-1.5 parent: 4812 - uid: 4045 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-1.5 parent: 4812 - uid: 4046 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,-1.5 parent: 4812 - uid: 4047 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-1.5 parent: 4812 - uid: 4049 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,0.5 parent: 4812 - uid: 4118 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,-6.5 parent: 4812 - uid: 4119 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,-5.5 parent: 4812 - uid: 4120 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,0.5 parent: 4812 - uid: 4121 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,1.5 parent: 4812 - uid: 4123 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-4.5 parent: 4812 - uid: 4124 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,-4.5 parent: 4812 - uid: 4125 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,-5.5 parent: 4812 - uid: 4126 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,-5.5 parent: 4812 - uid: 4127 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,-6.5 parent: 4812 - uid: 4128 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,-5.5 parent: 4812 - uid: 4129 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-5.5 parent: 4812 - uid: 4130 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-4.5 parent: 4812 - uid: 4131 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-4.5 parent: 4812 - uid: 4132 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-6.5 parent: 4812 - uid: 4133 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,-10.5 parent: 4812 - uid: 4649 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -4.5,-14.5 parent: 4812 - uid: 4650 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -0.5,-14.5 parent: 4812 - uid: 4651 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -0.5,-20.5 parent: 4812 - uid: 4652 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -1.5,-20.5 parent: 4812 - uid: 4653 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -2.5,-20.5 parent: 4812 - uid: 4654 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -3.5,-20.5 parent: 4812 - uid: 4655 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -4.5,-20.5 parent: 4812 - uid: 4717 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -45.5,-26.5 parent: 4812 - uid: 4756 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -45.5,-28.5 parent: 4812 - uid: 4757 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -45.5,-29.5 parent: 4812 - uid: 4783 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-35.5 parent: 4812 - uid: 4784 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-34.5 parent: 4812 - uid: 4785 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-33.5 parent: 4812 - uid: 4786 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,-33.5 parent: 4812 - uid: 4787 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -0.5,-33.5 parent: 4812 - uid: 4788 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -4.5,-33.5 parent: 4812 - uid: 4793 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,-33.5 parent: 4812 - uid: 4794 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,-33.5 parent: 4812 - uid: 4795 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,-36.5 parent: 4812 - uid: 4797 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -44.5,-29.5 parent: 4812 - uid: 4814 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,-28.5 parent: 4812 - uid: 4916 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,-24.5 parent: 4812 - uid: 4918 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-25.5 parent: 4812 - uid: 4919 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-26.5 parent: 4812 - uid: 4922 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-28.5 parent: 4812 - uid: 4937 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,-29.5 parent: 4812 - uid: 5024 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,-19.5 parent: 4812 - uid: 5050 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,-25.5 parent: 4812 - uid: 5333 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-13.5 parent: 4812 - uid: 5334 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-14.5 parent: 4812 - uid: 5335 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,-13.5 parent: 4812 - uid: 5338 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,-19.5 parent: 4812 - uid: 5339 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-19.5 parent: 4812 - uid: 5340 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-18.5 parent: 4812 - uid: 5341 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-16.5 parent: 4812 - uid: 5342 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-15.5 parent: 4812 - uid: 5390 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,-13.5 parent: 4812 - uid: 5425 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,-19.5 parent: 4812 - uid: 5426 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,-19.5 parent: 4812 - uid: 5427 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-19.5 parent: 4812 - uid: 5430 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-14.5 parent: 4812 - uid: 5457 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,-27.5 parent: 4812 - uid: 5465 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,-22.5 parent: 4812 - uid: 5466 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-22.5 parent: 4812 - uid: 5467 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-22.5 parent: 4812 - uid: 5468 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-27.5 parent: 4812 - uid: 5562 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 30.5,-23.5 parent: 4812 - uid: 5563 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 30.5,-27.5 parent: 4812 - uid: 5567 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 30.5,-28.5 parent: 4812 - uid: 5619 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-16.5 parent: 4812 - uid: 5620 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-18.5 parent: 4812 - uid: 5836 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-32.5 parent: 4812 - uid: 5837 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-31.5 parent: 4812 - uid: 6498 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,-12.5 parent: 4812 - uid: 6501 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,-13.5 parent: 4812 - uid: 6502 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-13.5 parent: 4812 - uid: 6503 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-13.5 parent: 4812 - uid: 6504 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,-13.5 parent: 4812 - uid: 6505 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-14.5 parent: 4812 - uid: 6506 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-15.5 parent: 4812 - uid: 6507 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-16.5 parent: 4812 - uid: 6508 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-17.5 parent: 4812 - uid: 6509 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-18.5 parent: 4812 - uid: 6510 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-19.5 parent: 4812 - uid: 6511 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-20.5 parent: 4812 - uid: 6512 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-21.5 parent: 4812 - uid: 6513 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,-21.5 parent: 4812 - uid: 6514 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-21.5 parent: 4812 - uid: 6515 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,-21.5 parent: 4812 - uid: 6516 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,-21.5 parent: 4812 - uid: 6517 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -26.5,-21.5 parent: 4812 - uid: 6518 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-21.5 parent: 4812 - uid: 6520 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,-21.5 parent: 4812 - uid: 6521 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,-20.5 parent: 4812 - uid: 6522 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -30.5,-20.5 parent: 4812 - uid: 6523 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,-22.5 parent: 4812 - uid: 6524 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,-23.5 parent: 4812 - uid: 6525 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,-24.5 parent: 4812 - uid: 6526 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -30.5,-24.5 parent: 4812 - uid: 6527 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,-24.5 parent: 4812 - uid: 6528 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-24.5 parent: 4812 - uid: 6529 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-24.5 parent: 4812 - uid: 6530 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-23.5 parent: 4812 - uid: 6531 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-22.5 parent: 4812 - uid: 6532 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-21.5 parent: 4812 - uid: 6533 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-20.5 parent: 4812 - uid: 6534 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-19.5 parent: 4812 - uid: 6535 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-18.5 parent: 4812 - uid: 6536 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-17.5 parent: 4812 - uid: 6537 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-16.5 parent: 4812 - uid: 6538 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-15.5 parent: 4812 - uid: 6539 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-14.5 parent: 4812 - uid: 6540 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-13.5 parent: 4812 - uid: 6541 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-13.5 parent: 4812 - uid: 6542 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,-13.5 parent: 4812 - uid: 6543 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -30.5,-13.5 parent: 4812 - uid: 6544 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,-13.5 parent: 4812 - uid: 6545 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-20.5 parent: 4812 - uid: 6549 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,-13.5 parent: 4812 - uid: 6654 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,-24.5 parent: 4812 - uid: 6683 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,-24.5 parent: 4812 - uid: 6711 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,-37.5 parent: 4812 - uid: 6712 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-37.5 parent: 4812 - uid: 6713 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-38.5 parent: 4812 - uid: 6714 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,-39.5 parent: 4812 - uid: 6715 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,-38.5 parent: 4812 - uid: 6716 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -26.5,-38.5 parent: 4812 - uid: 6717 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-38.5 parent: 4812 - uid: 6718 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,-38.5 parent: 4812 - uid: 6719 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,-37.5 parent: 4812 - uid: 6720 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,-36.5 parent: 4812 - uid: 6721 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,-35.5 parent: 4812 - uid: 6722 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,-34.5 parent: 4812 - uid: 6723 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,-35.5 parent: 4812 - uid: 6724 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,-34.5 parent: 4812 - uid: 6725 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,-33.5 parent: 4812 - uid: 6726 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,-32.5 parent: 4812 - uid: 6727 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,-34.5 parent: 4812 - uid: 6728 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-34.5 parent: 4812 - uid: 6729 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,-33.5 parent: 4812 - uid: 6730 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,-34.5 parent: 4812 - uid: 6731 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-34.5 parent: 4812 - uid: 6732 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-33.5 parent: 4812 - uid: 6733 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-32.5 parent: 4812 - uid: 6734 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-31.5 parent: 4812 - uid: 6739 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,-32.5 parent: 4812 - uid: 6740 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,-33.5 parent: 4812 - uid: 6741 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-33.5 parent: 4812 - uid: 6742 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-32.5 parent: 4812 - uid: 6743 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-31.5 parent: 4812 - uid: 6744 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,-31.5 parent: 4812 - uid: 6745 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,-31.5 parent: 4812 - uid: 6746 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-31.5 parent: 4812 - uid: 6747 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,-32.5 parent: 4812 - uid: 6748 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,-31.5 parent: 4812 - uid: 6749 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-31.5 parent: 4812 - uid: 6750 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,-31.5 parent: 4812 - uid: 6751 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,-31.5 parent: 4812 - uid: 6752 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,-31.5 parent: 4812 - uid: 6753 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,-31.5 parent: 4812 - uid: 6766 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,-29.5 parent: 4812 - uid: 6767 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-29.5 parent: 4812 - uid: 6768 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,-29.5 parent: 4812 - uid: 6769 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,-29.5 parent: 4812 - uid: 6770 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,-29.5 parent: 4812 - uid: 6771 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,-29.5 parent: 4812 - uid: 6772 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,-29.5 parent: 4812 - uid: 6773 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-29.5 parent: 4812 - uid: 6774 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,-29.5 parent: 4812 - uid: 6775 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-29.5 parent: 4812 - uid: 6776 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,-29.5 parent: 4812 - uid: 6789 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-22.5 parent: 4812 - uid: 7060 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,-19.5 parent: 4812 - uid: 7063 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,-15.5 parent: 4812 - uid: 7184 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,-23.5 parent: 4812 - uid: 7185 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-24.5 parent: 4812 - uid: 7187 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -26.5,-31.5 parent: 4812 - uid: 7194 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-27.5 parent: 4812 - uid: 7195 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,-28.5 parent: 4812 - uid: 7212 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-24.5 parent: 4812 - uid: 7213 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,-24.5 parent: 4812 - uid: 7215 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,-25.5 parent: 4812 - uid: 7217 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,-27.5 parent: 4812 - uid: 7218 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,-28.5 parent: 4812 - uid: 7235 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,-19.5 parent: 4812 - uid: 7246 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,-18.5 parent: 4812 - uid: 7314 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,-25.5 parent: 4812 - uid: 7315 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -44.5,-25.5 parent: 4812 - uid: 7317 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,-29.5 parent: 4812 - uid: 7318 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -42.5,-31.5 parent: 4812 - uid: 7319 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,-14.5 parent: 4812 - uid: 7320 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,-14.5 parent: 4812 - uid: 7321 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,-14.5 parent: 4812 - uid: 7322 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,-14.5 parent: 4812 - uid: 7727 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,18.5 parent: 4812 - uid: 7728 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -26.5,18.5 parent: 4812 - uid: 7729 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,18.5 parent: 4812 - uid: 7953 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,7.5 parent: 4812 - uid: 8162 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,26.5 parent: 4812 - uid: 8163 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,26.5 parent: 4812 - uid: 8164 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,28.5 parent: 4812 - uid: 8456 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,37.5 parent: 4812 - uid: 8457 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -26.5,37.5 parent: 4812 - uid: 8833 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-37.5 parent: 4812 - uid: 8834 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,-34.5 parent: 4812 - uid: 8835 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,-34.5 parent: 4812 - uid: 8837 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,-32.5 parent: 4812 - uid: 8840 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,-40.5 parent: 4812 - uid: 8852 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,-28.5 parent: 4812 - uid: 8854 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,-26.5 parent: 4812 - uid: 8855 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-26.5 parent: 4812 - uid: 8856 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-26.5 parent: 4812 - uid: 8857 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-26.5 parent: 4812 - uid: 8903 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,-26.5 parent: 4812 - uid: 8904 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,-27.5 parent: 4812 - uid: 8905 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,-25.5 parent: 4812 - uid: 8907 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,-23.5 parent: 4812 - uid: 9968 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,-29.5 parent: 4812 - uid: 9969 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,-30.5 parent: 4812 - uid: 9970 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,-30.5 parent: 4812 - uid: 9973 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-30.5 parent: 4812 - uid: 9985 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,-22.5 parent: 4812 - uid: 9986 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,-21.5 parent: 4812 - uid: 9987 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-25.5 parent: 4812 - uid: 9988 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-24.5 parent: 4812 - uid: 9989 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-23.5 parent: 4812 - uid: 9994 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,-21.5 parent: 4812 - uid: 10153 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,-23.5 parent: 4812 - uid: 10155 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -49.5,-23.5 parent: 4812 - uid: 10156 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,-23.5 parent: 4812 - uid: 10224 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -42.5,-22.5 parent: 4812 - uid: 10404 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -47.5,-28.5 parent: 4812 - uid: 10613 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -42.5,-24.5 parent: 4812 - uid: 10614 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -42.5,-23.5 parent: 4812 - uid: 11049 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,-39.5 parent: 4812 - uid: 11050 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,-39.5 parent: 4812 - uid: 11051 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,-39.5 parent: 4812 - uid: 11052 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,-39.5 parent: 4812 - uid: 11053 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,-35.5 parent: 4812 - uid: 11054 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,-35.5 parent: 4812 - uid: 11055 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,-35.5 parent: 4812 - uid: 11056 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,-35.5 parent: 4812 - uid: 11057 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,-31.5 parent: 4812 - uid: 11058 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,-31.5 parent: 4812 - uid: 11059 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,-31.5 parent: 4812 - uid: 11060 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,-31.5 parent: 4812 - uid: 11061 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-35.5 parent: 4812 - uid: 11062 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-35.5 parent: 4812 - uid: 11063 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,-35.5 parent: 4812 - uid: 11064 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,-35.5 parent: 4812 - uid: 11066 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-39.5 parent: 4812 - uid: 11067 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-39.5 parent: 4812 - uid: 11068 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,-39.5 parent: 4812 - uid: 11069 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,-39.5 parent: 4812 - uid: 11070 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-39.5 parent: 4812 - uid: 11121 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 35.5,-35.5 parent: 4812 - uid: 11122 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 36.5,-35.5 parent: 4812 - uid: 11123 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 37.5,-35.5 parent: 4812 - uid: 11124 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 34.5,-35.5 parent: 4812 - uid: 11266 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-36.5 parent: 4812 - uid: 11267 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-35.5 parent: 4812 - uid: 11268 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,-35.5 parent: 4812 - uid: 11269 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,-35.5 parent: 4812 - uid: 11270 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,-35.5 parent: 4812 - uid: 11271 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,-35.5 parent: 4812 - uid: 11272 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-35.5 parent: 4812 - uid: 11273 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,-35.5 parent: 4812 - uid: 11302 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 27.5,-34.5 parent: 4812 - uid: 11303 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,-34.5 parent: 4812 - uid: 11304 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-34.5 parent: 4812 - uid: 11305 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,-34.5 parent: 4812 - uid: 11348 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 34.5,-33.5 parent: 4812 - uid: 11349 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 34.5,-32.5 parent: 4812 - uid: 11366 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 35.5,-38.5 parent: 4812 - uid: 11367 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 35.5,-37.5 parent: 4812 - uid: 11368 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 33.5,-35.5 parent: 4812 - uid: 11369 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 32.5,-35.5 parent: 4812 - uid: 11370 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 29.5,-36.5 parent: 4812 - uid: 11383 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 29.5,-35.5 parent: 4812 - uid: 11384 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 30.5,-35.5 parent: 4812 - uid: 11385 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 34.5,-37.5 parent: 4812 - uid: 11389 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 30.5,-37.5 parent: 4812 - uid: 11475 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 5.5,3.5 parent: 4812 - uid: 11646 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 6.5,3.5 parent: 4812 - uid: 11706 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 37.5,-42.5 parent: 4812 - uid: 11794 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,1.5 parent: 4812 - uid: 11795 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,1.5 parent: 4812 - uid: 11796 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,1.5 parent: 4812 - uid: 11797 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,0.5 parent: 4812 - uid: 11798 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-0.5 parent: 4812 - uid: 11799 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-1.5 parent: 4812 - uid: 11800 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-2.5 parent: 4812 - uid: 11801 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,-2.5 parent: 4812 - uid: 11848 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,12.5 parent: 4812 @@ -85310,148 +79477,106 @@ entities: entities: - uid: 7302 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -42.5,-29.5 parent: 4812 - uid: 7305 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,-26.5 parent: 4812 - uid: 7312 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -42.5,-25.5 parent: 4812 - uid: 7313 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -42.5,-30.5 parent: 4812 - uid: 7316 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -45.5,-25.5 parent: 4812 - uid: 7335 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,-31.5 parent: 4812 - uid: 7350 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,-33.5 parent: 4812 - uid: 7351 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,-32.5 parent: 4812 - uid: 7353 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-30.5 parent: 4812 - uid: 7354 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-30.5 parent: 4812 - uid: 7355 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,-29.5 parent: 4812 - uid: 7356 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,-27.5 parent: 4812 - uid: 7357 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,-30.5 parent: 4812 - uid: 7358 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,-28.5 parent: 4812 - uid: 7359 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,-24.5 parent: 4812 - uid: 7360 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-30.5 parent: 4812 - uid: 7361 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,-30.5 parent: 4812 - uid: 7362 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-22.5 parent: 4812 - uid: 7363 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,-21.5 parent: 4812 - uid: 7364 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-21.5 parent: 4812 - uid: 7365 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,-13.5 parent: 4812 @@ -85880,8 +80005,6 @@ entities: - type: Transform pos: -53.5,7.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: WeaponCapacitorRecharger entities: - uid: 2515 @@ -86820,15 +80943,11 @@ entities: entities: - uid: 6795 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-37.5 parent: 4812 - uid: 6796 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-39.5 parent: 4812 @@ -86874,11 +80993,4 @@ entities: - type: Transform pos: 26.494213,-35.426273 parent: 4812 -- proto: YellowOxygenTankFilled - entities: - - uid: 11791 - components: - - type: Transform - pos: 19.452671,-32.41012 - parent: 4812 ... diff --git a/Resources/Maps/saltern.yml b/Resources/Maps/saltern.yml index b9690eb37d2..3f2bd76d4fc 100644 --- a/Resources/Maps/saltern.yml +++ b/Resources/Maps/saltern.yml @@ -241,1071 +241,1144 @@ entities: data: tiles: -4,-4: - 0: 65535 + 0: 61695 + -4,-5: + 0: 62457 + -5,-4: + 0: 61695 -4,-3: - 0: 65535 + 0: 47871 -4,-2: - 0: 16383 + 0: 12731 1: 49152 + -5,-2: + 0: 47935 + -5,-1: + 0: 65528 -4,-1: - 0: 65523 + 0: 61056 1: 12 + -4,0: + 0: 61695 -3,-4: - 0: 65535 + 0: 54527 -3,-3: - 0: 65535 + 0: 3581 -3,-2: - 0: 36863 + 0: 247 1: 28672 -3,-1: 1: 7 - 0: 65528 + 0: 65280 + -3,-5: + 0: 61695 + -3,0: + 0: 61695 -2,-4: - 0: 65535 + 0: 53503 -2,-3: - 0: 65535 + 0: 65529 -2,-2: - 0: 65535 + 0: 65520 -2,-1: 0: 65535 + -2,-5: + 0: 64541 + -2,0: + 0: 63487 -1,-4: - 0: 65535 + 0: 53503 -1,-3: - 0: 65535 + 0: 48124 -1,-2: - 0: 65535 + 0: 65520 -1,-1: 0: 65535 - -4,0: - 0: 65535 + -1,-5: + 0: 65285 + -1,0: + 0: 61695 + 0,-4: + 0: 52991 + 0,-3: + 0: 56573 + 0,-2: + 0: 56796 + 0,-1: + 0: 65533 + -5,0: + 0: 63743 -4,1: - 0: 65535 + 0: 49407 + -5,1: + 0: 255 -4,2: - 0: 65535 + 0: 57245 + -5,2: + 0: 53247 -4,3: - 0: 65535 - -3,0: - 0: 65535 + 0: 61424 + -5,3: + 0: 16241 + -4,4: + 0: 61070 -3,1: - 0: 65535 + 0: 41215 -3,2: - 0: 65535 + 0: 65450 -3,3: - 0: 65535 - -2,0: - 0: 65535 + 0: 64988 + -3,4: + 0: 55757 -2,1: - 0: 65535 + 0: 56575 -2,2: - 0: 65535 + 0: 65485 -2,3: - 0: 65535 - -1,0: - 0: 65535 + 0: 32767 + -2,4: + 0: 4215 -1,1: - 0: 65535 + 0: 58623 -1,2: - 0: 65535 + 0: 16142 -1,3: - 0: 65535 - 0,-4: - 0: 65535 - 0,-3: - 0: 65535 - 0,-2: - 0: 65535 - 0,-1: - 0: 65535 + 0: 3003 + -1,4: + 0: 4095 + 0,0: + 0: 64733 + 0,1: + 0: 56575 + 0,2: + 0: 56797 + 0,3: + 0: 52701 + 0,-5: + 0: 65263 1,-4: - 0: 65535 + 0: 7099 1,-3: - 0: 65535 + 0: 53725 1,-2: - 0: 65535 + 0: 56605 1,-1: - 0: 65535 + 0: 65533 + 1,-5: + 0: 47935 + 1,0: + 0: 61917 2,-4: - 0: 65535 + 0: 10231 2,-3: - 0: 65535 + 0: 65278 2,-2: - 0: 65535 + 0: 65390 2,-1: 0: 65535 + 2,-5: + 0: 30511 + 2,0: + 0: 61695 3,-4: - 0: 65535 + 0: 4095 3,-3: - 0: 65535 + 0: 57309 3,-2: - 0: 65535 + 0: 56781 3,-1: + 0: 64985 + 3,-5: + 0: 65295 + 3,0: + 0: 61661 + 4,-4: + 0: 61007 + 4,-3: 0: 65535 - 0,0: - 0: 65535 - 0,1: - 0: 65535 - 0,2: - 0: 65535 - 0,3: - 0: 65535 - 1,0: + 4,-2: 0: 65535 + 4,-1: + 0: 65523 + 0,4: + 0: 61166 1,1: - 0: 65535 + 0: 55807 1,2: - 0: 65535 + 0: 56797 1,3: - 0: 65535 - 2,0: - 0: 65535 + 0: 7665 + 1,4: + 0: 48123 2,1: - 0: 65535 + 0: 29439 2,2: - 0: 65535 + 0: 30583 2,3: - 0: 65535 - 3,0: - 0: 65535 + 0: 3953 + 2,4: + 0: 63351 3,1: 0: 65535 3,2: - 0: 65535 + 0: 65530 3,3: - 0: 65535 + 0: 65295 + 3,4: + 0: 32767 4,0: - 0: 65535 + 0: 61695 4,1: - 0: 65535 + 0: 53759 4,2: - 0: 65535 + 0: 65500 4,3: - 0: 65535 + 0: 53709 + 4,4: + 0: 4573 + 2: 16384 5,0: - 0: 65535 + 0: 62190 5,1: - 0: 65535 + 0: 61695 5,2: 0: 65535 5,3: - 0: 65535 + 0: 62463 + 5,4: + 0: 30719 + 5,-1: + 0: 61152 6,0: - 0: 65535 + 0: 63726 6,1: - 0: 65535 + 0: 3839 6,2: - 0: 65535 + 0: 7677 6,3: - 0: 65535 + 0: 54495 + 6,4: + 0: 64767 7,0: - 0: 65535 + 0: 63547 7,1: - 0: 65535 + 0: 3067 7,2: - 0: 65535 + 0: 35771 7,3: + 0: 40159 + 7,4: + 0: 55739 + 7,-1: + 0: 36590 + 8,0: + 0: 65327 + 8,1: + 0: 12287 + 8,2: 0: 65535 - 0,4: + 8,3: 0: 65535 0,5: - 0: 65535 + 0: 55535 + -1,5: + 0: 58623 0,6: - 0: 65535 + 0: 51711 + -1,6: + 0: 3822 0,7: - 0: 65535 - 1,4: - 0: 65535 + 0: 65503 + -1,7: + 0: 61166 + 0,8: + 0: 15 + 2: 3840 1,5: - 0: 65535 + 0: 53439 1,6: - 0: 65535 + 0: 7421 1,7: - 0: 65535 - 2,4: - 0: 65535 + 0: 65503 + 1,8: + 0: 15 + 2: 40704 2,5: - 0: 65535 + 0: 53367 2,6: - 0: 65535 + 0: 1405 2,7: - 0: 65535 - 3,4: - 0: 65535 + 0: 4915 + 2: 34944 + 2,8: + 2: 36 3,5: - 0: 32767 + 0: 4181 3,6: - 0: 30583 + 0: 4881 + 4,5: + 0: 273 + 2: 17476 -8,0: - 0: 65535 + 0: 61678 + -9,0: + 0: 64413 -8,1: - 0: 65535 + 0: 53503 + -9,1: + 0: 46079 -8,2: - 0: 65535 + 0: 56796 + -9,2: + 0: 35835 -8,3: - 0: 65535 + 0: 4081 + -9,3: + 0: 16315 + -8,4: + 0: 477 + 2: 49152 -7,0: - 0: 65535 + 0: 64671 -7,1: - 0: 65535 + 0: 40191 -7,2: - 0: 65535 + 0: 49087 -7,3: - 0: 65535 + 0: 20472 + -7,4: + 0: 58983 + -7,-1: + 0: 52732 -6,0: - 0: 65535 + 0: 62363 -6,1: - 0: 65535 + 0: 5119 -6,2: - 0: 65535 + 0: 6007 -6,3: - 0: 65535 - -5,0: - 0: 65535 - -5,1: - 0: 65535 - -5,2: - 0: 65535 - -5,3: - 0: 65535 - 4,-4: - 0: 65535 - 4,-3: - 0: 65535 - 4,-2: - 0: 65535 - 4,-1: - 0: 65535 + 0: 4092 + -6,-1: + 0: 48051 + -6,4: + 0: 61567 + -5,4: + 0: 30527 + 4,-5: + 0: 61152 5,-4: - 0: 65535 + 0: 3777 5,-3: - 0: 65535 + 0: 3823 5,-2: - 0: 65535 - 5,-1: - 0: 65535 + 0: 61182 + 5,-5: + 0: 56774 6,-4: - 0: 65535 + 0: 53230 6,-3: - 0: 65535 + 0: 35769 6,-2: - 0: 65535 + 0: 56797 6,-1: - 0: 65535 + 0: 4092 + 6,-5: + 0: 65524 + 7,-2: + 0: 57599 7,-4: - 0: 13107 + 2: 8738 7,-3: - 0: 65535 - 7,-2: - 0: 65535 - 7,-1: + 0: 3808 + 8,-3: + 0: 4024 + 8,-2: + 0: 62207 + 8,-1: 0: 65535 0,-8: - 0: 65535 + 0: 64977 + -1,-8: + 0: 61166 0,-7: - 0: 65535 + 0: 56829 + -1,-7: + 0: 53247 0,-6: - 0: 65535 - 0,-5: - 0: 65535 + 0: 65532 + 0,-9: + 0: 53192 + 2: 39 1,-8: - 0: 65535 + 0: 56784 1,-7: - 0: 65535 + 0: 57343 1,-6: - 0: 65535 - 1,-5: - 0: 65535 + 0: 45981 + 1,-9: + 0: 5937 2,-8: - 0: 65535 + 0: 15353 2,-7: 0: 65535 2,-6: - 0: 65535 - 2,-5: - 0: 65535 + 0: 61695 + 2,-9: + 0: 13107 + 2: 128 3,-8: - 0: 65535 + 0: 52637 3,-7: - 0: 65535 + 0: 64925 3,-6: - 0: 65535 - 3,-5: - 0: 65535 + 0: 64733 + 4,-8: + 0: 39299 + 2: 17484 4,-7: - 0: 65535 + 0: 65289 + 2: 4 4,-6: - 0: 65535 - 4,-5: - 0: 65535 + 0: 61152 + 4,-9: + 2: 17476 + 0: 34952 + 5,-8: + 2: 21855 + 0: 43680 5,-7: - 0: 65535 + 2: 5 + 0: 63242 + 5,-9: + 2: 21845 + 0: 43690 5,-6: - 0: 65535 - 5,-5: - 0: 65535 - 6,-5: - 0: 65535 + 0: 26214 + 6,-8: + 2: 21855 + 0: 43680 + 6,-7: + 2: 5 + 0: 56586 + 6,-6: + 0: 61919 + 6,-9: + 2: 21845 + 0: 43690 + 7,-8: + 2: 4383 + 0: 8736 + 7,-7: + 2: 8749 + 0: 2 7,-5: - 0: 65535 - -4,4: - 0: 65535 + 0: 3846 + 7,-9: + 2: 4369 + 0: 8738 + 7,-6: + 2: 1570 + 8,-8: + 2: 1 + 8,-7: + 2: 15 + 0: 65280 + 8,-6: + 0: 13119 + 2: 2048 + 8,-5: + 0: 3891 -4,5: - 0: 65535 + 0: 238 -4,6: - 0: 65535 - -3,4: - 0: 65535 + 0: 255 + 2: 61440 + -5,6: + 0: 238 + 2: 61440 + -4,7: + 2: 2289 + -5,7: + 2: 240 -3,5: - 0: 65535 + 0: 3295 -3,6: - 0: 49151 - -2,4: - 0: 65535 + 0: 255 + 2: 12288 + -3,7: + 2: 8816 + -3,8: + 2: 3086 -2,5: - 0: 65535 + 0: 52701 -2,6: - 0: 65535 - -1,4: - 0: 65535 - -1,5: - 0: 65535 - -1,6: - 0: 65535 - -1,7: - 0: 65535 - -5,4: - 0: 65535 - -5,5: - 0: 65535 - -5,6: - 0: 65535 + 0: 63743 + -2,7: + 0: 255 -1,8: - 0: 36847 - 4,4: - 0: 65535 - 0,8: - 0: 4095 - 1,8: - 0: 40959 - 2,8: - 0: 55 - 8,0: - 0: 65535 - 8,1: - 0: 65535 - 8,2: - 0: 65535 - 8,3: - 0: 65535 + 0: 8 + 2: 36640 + -9,4: + 0: 7400 + -8,5: + 2: 8879 + 0: 21840 + -9,5: + 2: 43692 + 0: 21840 + -8,6: + 2: 41519 + 0: 21840 + -9,6: + 2: 43695 + 0: 21840 + -8,7: + 2: 242 + -9,7: + 2: 240 + -7,6: + 2: 62465 + 0: 14 + -7,7: + 2: 16 + -7,5: + 0: 1038 + -6,5: + 0: 65319 + -6,6: + 0: 255 + -6,7: + 2: 240 + -5,5: + 0: 26215 + -2,8: + 2: 7967 + -1,9: + 2: 142 + 0,9: + 2: 15 + 4,6: + 2: 4 + 0: 34816 + 5,5: + 0: 30583 + 5,6: + 0: 65319 + 5,7: + 0: 5 + 6,5: + 0: 255 + 2: 53248 + 6,6: + 2: 35049 + 7,5: + 0: 36063 + 2: 4096 + 7,6: + 2: 53196 + 7,7: + 2: 12 + 8,4: + 0: 4351 + 2: 57344 + 8,5: + 0: 272 + 4: 17472 + 8,6: + 2: 65345 + 8,7: + 2: 61167 + 1,9: + 2: 15 + 2,9: + 2: 1 9,0: - 0: 65535 + 0: 65102 9,1: - 0: 65535 + 0: 3839 9,2: - 0: 65535 + 0: 61917 9,3: 0: 65535 + 9,4: + 0: 255 + 2: 61440 + 9,-1: + 0: 60942 10,0: - 0: 65535 + 0: 65481 10,1: - 0: 65535 + 0: 53247 10,2: - 0: 65535 + 0: 62717 10,3: 0: 65535 + 10,-1: + 0: 48015 + 10,4: + 0: 255 + 2: 61440 11,0: - 0: 65535 + 0: 65520 11,1: - 0: 65535 + 0: 53759 11,2: - 0: 16383 - 2: 49152 + 0: 4319 + 3: 49152 11,3: - 0: 65331 - 2: 204 + 0: 61457 + 3: 204 + 11,-1: + 0: 30583 + 11,4: + 0: 255 + 2: 61440 12,0: - 0: 65535 + 0: 65527 12,1: - 0: 65535 + 0: 28791 12,2: - 0: 4095 - 2: 61440 + 0: 119 + 3: 28672 12,3: - 2: 255 - 0: 65280 - 8,-3: - 0: 65535 - 8,-2: - 0: 65535 - 8,-1: + 3: 119 + 0: 61440 + 12,-1: + 0: 29311 + 12,4: + 0: 255 + 2: 61440 + 13,0: + 0: 49080 + 13,1: + 0: 48058 + 13,2: + 2: 13104 + 0: 34826 + 13,3: + 2: 35059 + 0: 12288 + 13,-1: + 0: 14119 + 13,4: + 0: 51 + 2: 63624 + 14,0: 0: 65535 + 14,1: + 0: 64319 + 14,2: + 0: 15235 + 14,3: + 2: 248 + 15,0: + 0: 7441 + 15,1: + 0: 12545 + 2: 49344 + 15,2: + 0: 272 + 15,3: + 2: 9023 + 15,4: + 2: 8754 + 16,0: + 0: 256 + 2: 40601 + 16,1: + 2: 40857 + 16,3: + 2: 255 + 8,-4: + 2: 8738 + 0: 34952 + 9,-4: + 0: 56789 9,-3: - 0: 65535 + 0: 26485 9,-2: - 0: 65535 - 9,-1: - 0: 65535 - 10,-2: - 0: 65535 - 10,-1: - 0: 65535 + 0: 58999 + 9,-5: + 0: 18176 10,-4: - 0: 65521 + 0: 65024 10,-3: - 0: 65535 + 0: 65520 + 10,-2: + 0: 63743 11,-4: - 0: 63472 + 0: 13056 + 2: 128 11,-3: - 0: 65535 + 0: 43946 11,-2: + 0: 30250 + 12,-4: + 2: 1265 + 12,-3: 0: 65535 - 11,-1: - 0: 65535 + 12,-2: + 0: 65359 + -4,-8: + 0: 4016 + -4,-9: + 2: 28672 + 0: 127 + -5,-8: + 0: 7091 -4,-7: - 0: 65535 + 0: 32631 + -5,-7: + 0: 7647 -4,-6: - 0: 65535 - -4,-5: - 0: 65535 - -4,-8: - 0: 65535 + 0: 14193 + -5,-6: + 0: 56797 + -5,-5: + 0: 64729 -3,-8: 0: 65535 -3,-7: - 0: 65535 + 0: 16383 -3,-6: - 0: 65535 - -3,-5: - 0: 65535 + 0: 65530 + -3,-9: + 0: 50519 -2,-8: - 0: 65535 + 0: 32767 -2,-7: - 0: 65535 + 0: 1919 -2,-6: - 0: 65535 - -2,-5: - 0: 65535 - -1,-8: - 0: 65535 - -1,-7: - 0: 65535 + 0: 57309 + -2,-9: + 0: 61440 + 2: 47 -1,-6: - 0: 65535 - -1,-5: - 0: 65535 + 0: 5489 + -8,-8: + 0: 3 + 2: 8 + -8,-9: + 0: 12288 + 2: 35056 + -9,-8: + 0: 65356 + 2: 1 + -8,-7: + 0: 240 + -9,-7: + 0: 13311 + 2: 32768 + -8,-6: + 2: 1520 + -9,-6: + 2: 29832 + 0: 3 + -8,-5: + 0: 48123 + -9,-5: + 0: 43008 + 2: 4 + -8,-4: + 0: 35771 + -7,-7: + 0: 33008 + 2: 8192 -7,-5: - 0: 65535 + 0: 61951 + -7,-4: + 0: 36317 + -7,-6: + 2: 546 + 0: 2184 + -7,-8: + 2: 68 + -7,-9: + 2: 17408 + 0: 32768 + -6,-8: + 0: 34955 + 2: 8704 + -6,-7: + 0: 47352 + -6,-6: + 0: 35835 -6,-5: - 0: 65535 - -5,-5: - 0: 65535 - -5,-7: - 0: 65535 - -5,-6: - 0: 65535 - -8,-4: - 0: 65535 + 0: 61691 + -6,-9: + 0: 61440 + 2: 34 + -6,-4: + 0: 62463 + -5,-9: + 0: 12799 + 2: 32768 + -9,-4: + 0: 34952 + 2: 800 -8,-3: - 0: 65535 + 0: 65039 + -9,-3: + 0: 56797 -8,-2: - 0: 65535 + 0: 60942 + -9,-2: + 0: 56829 + -9,-1: + 0: 56797 -8,-1: - 0: 65535 - -7,-4: - 0: 65535 + 0: 3808 -7,-3: - 0: 65535 + 0: 64907 -7,-2: - 0: 65535 - -7,-1: - 0: 65535 - -6,-4: - 0: 65535 + 0: 57293 -6,-3: - 0: 65535 + 0: 63291 -6,-2: - 0: 65535 - -6,-1: - 0: 65535 - -5,-4: - 0: 65535 + 0: 30583 -5,-3: - 0: 65535 - -5,-2: - 0: 65535 - -5,-1: - 0: 65535 + 0: 28791 + -12,0: + 0: 2056 -11,0: - 0: 65535 - -11,1: - 0: 65262 + 0: 3855 + -12,1: + 2: 2056 + -12,2: + 0: 2056 -11,2: - 0: 65535 + 0: 3855 + -12,3: + 2: 136 + -11,1: + 2: 546 + 0: 2184 + -11,3: + 2: 58030 + -11,4: + 2: 70 -10,0: 0: 65535 -10,1: 0: 65535 -10,2: - 0: 65535 - -9,0: - 0: 65535 - -9,1: - 0: 65535 - -9,2: - 0: 65535 - -9,3: - 0: 65535 - -10,-2: - 0: 65535 + 0: 36863 + -10,3: + 0: 61166 -10,-1: - 0: 65535 - -10,-3: - 0: 65535 - -9,-3: - 0: 65535 - -9,-2: - 0: 65535 - -9,-1: - 0: 65535 - -9,-4: - 0: 65519 - 12,-4: - 0: 62705 - 12,-3: - 0: 65535 - 12,-2: - 0: 65535 - 12,-1: - 0: 65535 - 13,-4: - 0: 63720 + 0: 61134 + -10,4: + 0: 61154 + -12,-3: + 0: 4095 + -13,-3: + 0: 4095 + -12,-4: + 0: 32768 + -11,-3: + 0: 4095 + -12,-2: + 2: 136 + -11,-2: + 2: 15 + 0: 60928 + -12,-1: + 2: 2184 + -11,-1: + 0: 14 + 2: 3584 + -10,-3: + 0: 53247 + -10,-2: + 2: 1 + 0: 65228 + -10,-4: + 2: 3720 + -10,-5: + 2: 32776 + 12,-5: + 2: 61440 + 0: 127 13,-3: - 0: 65535 + 0: 48059 13,-2: - 0: 65535 - 13,-1: - 0: 65535 - 10,-8: - 0: 34816 + 0: 63243 + 13,-4: + 2: 2280 + 13,-5: + 2: 35304 + 14,-4: + 2: 1039 + 14,-3: + 0: 13107 + 2: 128 + 14,-2: + 0: 65283 + 14,-1: + 0: 4095 + 14,-5: + 2: 17476 + 15,-4: + 2: 8739 + 15,-3: + 2: 12914 + 15,-2: + 0: 4352 + 2: 14 + 15,-1: + 0: 273 + 2: 52224 + 15,-5: + 2: 8704 + 16,-2: + 2: 61455 + 16,-1: + 2: 40857 + 9,-7: + 2: 15 + 0: 65280 + 9,-6: + 0: 15 + 2: 3840 10,-7: - 0: 65535 + 2: 7 + 0: 65280 10,-6: - 0: 36863 - 10,-5: - 0: 8 - 11,-8: - 0: 65532 + 0: 15 + 2: 34560 + 10,-8: + 2: 34816 11,-7: - 0: 65535 + 0: 65534 11,-6: - 0: 65535 + 0: 61183 + 10,-5: + 2: 8 + 11,-8: + 2: 52 + 0: 59392 11,-5: - 0: 36095 + 2: 33840 + 0: 8 12,-8: - 0: 65535 + 0: 65392 12,-7: 0: 65535 12,-6: 0: 65535 - 12,-5: - 0: 65535 + 20,-2: + 2: 8739 + 19,-2: + 2: 28687 + 20,-1: + 2: 26146 + 20,0: + 2: 8230 + 19,0: + 2: 20292 + 20,1: + 2: 9830 + 20,2: + 2: 8738 + 20,3: + 2: 3 + 19,3: + 2: 127 13,-8: - 0: 65393 + 2: 34913 + 0: 12288 13,-7: - 0: 65535 + 0: 65395 13,-6: - 0: 65535 - 13,-5: - 0: 35327 - 14,-8: - 0: 17476 + 0: 13183 + 2: 32768 14,-7: - 0: 30581 + 2: 26213 14,-6: - 0: 17783 - 14,-5: - 0: 17476 + 2: 17766 + 14,-8: + 2: 17476 14,-9: - 0: 17476 - 6,-7: - 0: 65535 - 6,-6: - 0: 65535 - 7,-7: - 0: 48063 - 7,-6: - 0: 65467 - -7,4: - 0: 65535 - -7,5: - 0: 61183 - -6,4: - 0: 65535 - -6,5: - 0: 65535 - 4,5: - 0: 53247 - 4,-8: - 0: 65535 - 5,-8: - 0: 65535 - 6,-8: - 0: 65535 - 7,-8: - 0: 13119 - -8,4: - 0: 65535 - -8,5: - 0: 30719 - -8,6: - 0: 63359 - -7,6: - 0: 64751 - -6,6: - 0: 4095 + 2: 17476 + -11,5: + 2: 35916 -10,5: - 0: 56799 + 2: 39296 + 0: 17488 + -11,6: + 2: 2184 -10,6: - 0: 56799 - -9,5: - 0: 65535 - -9,6: - 0: 65535 - -9,4: - 0: 65535 - 3,-9: - 0: 62836 - 4,-9: - 0: 64716 - 6,4: - 0: 65535 - 7,4: - 0: 65535 - 7,5: - 0: 65535 - 7,6: - 0: 53196 - 8,4: - 0: 65535 - 8,5: - 0: 48063 - 3: 17472 - 8,6: - 0: 65359 - 9,4: - 0: 65535 - 9,5: - 0: 43695 - 4: 4368 - 2: 17472 - 9,6: - 0: 7951 - 10,4: - 0: 65535 - 10,5: - 0: 43695 - 2: 4368 - 5: 17472 - 11,4: - 0: 65535 - 11,5: - 0: 43695 - 2: 21840 - 12,4: - 0: 65535 - 12,5: - 0: 13183 - 13,4: - 0: 65535 - 13,5: - 0: 1 - -8,7: - 0: 242 - 8,-8: - 0: 1 - 8,-7: - 0: 65535 - 8,-10: - 0: 240 - -10,4: - 0: 65535 + 0: 21569 + 2: 35230 -10,7: - 0: 192 - -9,7: - 0: 240 + 2: 192 + 0,-12: + 2: 79 + 0: 12288 + -1,-12: + 2: 79 + 0: 32768 + 0,-11: + 0: 29107 + -1,-11: + 0: 2047 + 0,-10: + 0: 247 + 2: 16384 + -1,-10: + 0: 255 + 2: 36864 + -1,-9: + 2: 313 + 1,-12: + 2: 4375 + 1,-11: + 0: 3536 + 1,-10: + 0: 3831 + 2,-11: + 0: 65520 + 2,-10: + 0: 14196 + 2,-12: + 2: 44800 + 3,-12: + 2: 768 + 3,-10: + 2: 18240 + 3,-9: + 2: 1396 5,-10: - 0: 17648 - 5,-9: - 0: 65535 + 2: 17648 6,-10: - 0: 240 - 6,-9: - 0: 65535 + 2: 240 7,-10: - 0: 240 - 7,-9: - 0: 13107 + 2: 240 + 8,-10: + 2: 240 + 8,8: + 2: 65534 + 9,5: + 5: 4368 + 3: 17472 + 9,6: + 2: 7936 + 10,5: + 3: 4368 + 6: 17472 10,6: - 0: 3855 + 2: 3840 + 11,5: + 3: 21840 11,6: - 0: 3871 + 2: 3856 + 12,5: + 2: 65535 12,6: - 0: 15 - 6,5: - 0: 57343 - 14,-4: - 0: 29711 - 14,-3: - 0: 30711 - 14,-2: - 0: 65527 - 5,4: - 0: 65535 - 5,5: - 0: 65535 - 5,7: - 0: 15 - 5,6: - 0: 65535 - 6,7: - 0: 1 - 6,6: - 0: 39417 - 2,-9: - 0: 63479 - 15,-4: - 0: 8739 - 15,-5: - 0: 8704 - 3,7: - 0: 3 - -4,7: - 0: 2289 - -3,7: - 0: 11000 - -2,7: - 0: 4095 - -7,7: - 0: 16 - -6,7: - 0: 240 - -5,7: - 0: 240 - -1,9: - 0: 142 - 0,9: - 0: 15 - 1,9: - 0: 15 - 13,0: - 0: 65535 - 13,1: - 0: 65535 - 13,2: - 0: 65535 - 13,3: - 0: 65535 - 14,0: - 0: 65535 - 14,2: - 0: 65535 - 14,1: - 0: 65535 - 14,3: - 0: 255 - -8,-5: - 0: 65535 - -5,-8: - 0: 65535 - -11,3: - 0: 58030 - -10,3: - 0: 65535 - 14,-1: - 0: 65535 - 15,-3: - 0: 12914 - -11,4: - 0: 70 - 0,-9: - 0: 65519 - 1,-9: - 0: 65535 + 2: 15 + 13,5: + 2: 39321 13,6: - 0: 15 - 14,6: - 0: 7 + 2: 15 14,4: - 0: 28672 + 2: 28672 + 14,6: + 2: 7 14,5: - 0: 17476 - -1,-9: - 0: 61753 - 15,0: - 0: 16179 - 15,1: - 0: 62451 - 15,2: - 0: 62259 - 8,-4: - 0: 61166 - 9,-4: - 0: 65535 - 15,-2: - 0: 13310 - 15,-1: - 0: 65331 - 8,-6: - 0: 32767 - 8,-5: - 0: 65527 - 9,-7: - 0: 65535 - 9,-6: - 0: 4095 - 9,-5: - 0: 65520 - 20,-2: - 0: 13107 - 20,-1: - 0: 30515 - 20,0: - 0: 12599 - 20,1: - 0: 14199 - 20,2: - 0: 13107 - 2,-10: - 0: 65535 - 3,-10: - 0: 18241 + 2: 17484 + 15,5: + 2: 35 + -4,-10: + 0: 6143 + -5,-10: + 0: 14472 + 2: 2 + -3,-10: + 0: 29949 + -3,-11: + 2: 304 + 0: 34944 -2,-10: - 0: 32767 - -2,-9: - 0: 65327 - -1,-10: - 0: 40959 - 16,-2: - 0: 61695 - 16,-1: - 0: 40857 + 0: 1019 + -2,-11: + 2: 544 + 0: 2176 + 16,-3: + 2: 61440 17,-2: - 0: 63731 + 2: 63491 17,-1: - 0: 36744 + 2: 36744 18,-2: - 0: 61694 + 2: 61454 18,-1: - 0: 36744 - 19,-2: - 0: 28927 + 2: 36744 + 17,0: + 2: 36744 + 18,-3: + 2: 32768 + 19,-3: + 2: 28672 19,-1: - 0: 18244 - 16,0: - 0: 40857 - 16,1: - 0: 40857 + 2: 18244 + 18,0: + 2: 36744 16,2: - 0: 61689 - 17,0: - 0: 36744 + 2: 249 17,1: - 0: 36744 + 2: 36744 17,2: - 0: 63736 - 18,0: - 0: 36744 + 2: 2296 + 17,3: + 2: 3 18,1: - 0: 36744 + 2: 36744 18,2: - 0: 61688 - 19,0: - 0: 20292 + 2: 248 + 18,3: + 2: 142 19,1: - 0: 18244 + 2: 18244 19,2: - 0: 61556 + 2: 116 14,-10: - 0: 17520 + 2: 17520 9,-10: - 0: 16 - -8,-8: - 0: 4479 - -8,-7: - 0: 4095 - -7,-7: - 0: 61439 - -6,-7: - 0: 65535 - -6,-8: - 0: 61183 - -6,-6: - 0: 65535 + 2: 16 -11,-8: - 0: 60074 + 2: 60074 -11,-7: - 0: 2730 + 2: 2730 -10,-8: - 0: 65262 + 2: 12846 + 0: 34816 -10,-7: - 0: 61166 + 2: 8738 + 0: 34952 -10,-6: - 0: 58094 - -9,-8: - 0: 65535 - -9,-7: - 0: 65535 - -9,-6: - 0: 62719 - -9,-10: - 0: 63728 + 2: 57890 + 0: 8 -9,-9: - 0: 65528 + 2: 4600 + 0: 49152 + -9,-10: + 2: 63728 -8,-10: - 0: 28784 - -8,-9: - 0: 65520 - -8,-6: - 0: 62960 - -6,-9: - 0: 65450 - -5,-9: - 0: 65535 - -7,-6: - 0: 65262 - -12,0: - 0: 34952 - -12,1: - 0: 34824 - -12,2: - 0: 34952 - -12,3: - 0: 136 - -12,-1: - 0: 34952 - -11,-1: - 0: 65279 - -11,-4: - 0: 61440 - -11,-3: - 0: 65535 - -11,-2: - 0: 65535 - -10,-4: - 0: 65160 - 0,-10: - 0: 20479 - 1,-10: - 0: 65535 - -5,-10: - 0: 65486 - -7,-8: - 0: 204 - -4,-9: - 0: 65535 - -3,-9: - 0: 65535 - -7,-9: - 0: 52224 - 7,7: - 0: 12 - 8,7: - 0: 61167 - 8,8: - 0: 65534 - 8,9: - 0: 3839 - 4,6: - 0: 52428 - 4,7: - 0: 12 - -3,8: - 0: 3086 - -2,8: - 0: 7967 - -11,5: - 0: 35916 - -11,6: - 0: 2184 - -12,-4: - 0: 61440 - -12,-3: - 0: 65535 - -12,-2: - 0: 136 - -10,-5: - 0: 32776 - -9,-5: - 0: 65484 - 0,-12: - 0: 30543 - 0,-11: - 0: 65535 - 1,-12: - 0: 4375 - 1,-11: - 0: 65535 - 2,-12: - 0: 44800 - 2,-11: - 0: 65535 - 3,-12: - 0: 768 - 3,-11: - 0: 4369 - -4,-11: - 0: 61440 - -4,-10: - 0: 65535 - -3,-11: - 0: 65008 - -3,-10: - 0: 65535 - -2,-12: - 0: 32768 - -2,-11: - 0: 65532 - -1,-12: - 0: 64591 - -1,-11: - 0: 65535 + 2: 28784 -6,-11: - 0: 8192 + 2: 8192 -6,-10: - 0: 60078 - -5,-11: - 0: 49152 + 2: 25262 + 8,9: + 2: 2815 9,8: - 0: 4368 + 2: 4368 9,9: - 0: 17 - 2,9: - 0: 1 + 2: 17 -14,-3: - 0: 61166 - -14,-4: - 0: 49152 + 0: 3272 -13,-4: - 0: 61440 - -13,-3: - 0: 65535 - 15,3: - 0: 31 - 20,3: - 0: 3 - 16,-3: - 0: 61440 - 18,-3: - 0: 32768 - 19,-3: - 0: 28672 - 16,3: - 0: 255 - 17,3: - 0: 3 - 18,3: - 0: 142 - 19,3: - 0: 127 + 0: 4096 uniqueMixes: - volume: 2500 temperature: 293.15 @@ -1337,6 +1410,21 @@ entities: - 0 - 0 - 0 + - volume: 2500 + immutable: True + moles: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 - volume: 2500 temperature: 293.15 moles: @@ -26130,18 +26218,6 @@ entities: - type: Transform pos: -48.183727,-9.500211 parent: 31 -- proto: chem_master - entities: - - uid: 606 - components: - - type: Transform - pos: 19.5,-0.5 - parent: 31 - - uid: 5075 - components: - - type: Transform - pos: 15.5,1.5 - parent: 31 - proto: ChemDispenser entities: - uid: 5076 @@ -26161,6 +26237,18 @@ entities: - type: Transform pos: 18.5,1.5 parent: 31 +- proto: ChemMaster + entities: + - uid: 606 + components: + - type: Transform + pos: 19.5,-0.5 + parent: 31 + - uid: 5075 + components: + - type: Transform + pos: 15.5,1.5 + parent: 31 - proto: ChessBoard entities: - uid: 841 @@ -27734,14 +27822,6 @@ entities: - type: Transform pos: 8.5,30.5 parent: 31 -- proto: ComputerFrame - entities: - - uid: 7085 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 10.5,-16.5 - parent: 31 - proto: ComputerId entities: - uid: 810 @@ -34314,12 +34394,6 @@ entities: parent: 31 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 2227 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 9.5,-17.5 - parent: 31 - uid: 2417 components: - type: Transform @@ -42265,6 +42339,12 @@ entities: parent: 31 - type: AtmosPipeColor color: '#0055CCFF' + - uid: 2227 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 9.5,-17.5 + parent: 31 - uid: 2282 components: - type: Transform @@ -43171,11 +43251,15 @@ entities: - uid: 10912 components: - type: Transform + anchored: False rot: 1.5707963267948966 rad pos: 53.5,-7.5 parent: 31 - type: AtmosPipeColor color: '#990000FF' + - type: Physics + canCollide: True + bodyType: Dynamic - uid: 10931 components: - type: Transform @@ -43473,9 +43557,11 @@ entities: - uid: 2215 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 7.5,-17.5 + rot: -1.5707963267948966 rad + pos: 10.5,-17.5 parent: 31 + - type: GasThermoMachine + targetTemperature: 150 - proto: GasThermoMachineHeater entities: - uid: 8861 @@ -49186,13 +49272,6 @@ entities: - type: Transform pos: 14.5,0.5 parent: 31 -- proto: MachineFrame - entities: - - uid: 7464 - components: - - type: Transform - pos: 10.5,-17.5 - parent: 31 - proto: MachineFrameDestroyed entities: - uid: 9667 @@ -57149,7 +57228,7 @@ entities: - type: Transform pos: -6.517076,-41.294003 parent: 31 -- proto: soda_dispenser +- proto: SodaDispenser entities: - uid: 1418 components: @@ -60963,13 +61042,6 @@ entities: - type: Transform pos: 48.60447,5.4525433 parent: 31 -- proto: UnfinishedMachineFrame - entities: - - uid: 7105 - components: - - type: Transform - pos: 10.5,-15.5 - parent: 31 - proto: UniformPrinter entities: - uid: 8408 diff --git a/Resources/Prototypes/Access/engineering.yml b/Resources/Prototypes/Access/engineering.yml index 94901fdf7af..f2f79fa805f 100644 --- a/Resources/Prototypes/Access/engineering.yml +++ b/Resources/Prototypes/Access/engineering.yml @@ -16,9 +16,3 @@ - ChiefEngineer - Engineering - Atmospherics - -- type: accessGroup - id: FireFight - tags: - - Engineering - - Atmospherics diff --git a/Resources/Prototypes/Alerts/categories.yml b/Resources/Prototypes/Alerts/categories.yml new file mode 100644 index 00000000000..2365422ed91 --- /dev/null +++ b/Resources/Prototypes/Alerts/categories.yml @@ -0,0 +1,35 @@ +- type: alertCategory + id: Pressure + +- type: alertCategory + id: Temperature + +- type: alertCategory + id: Breathing + +- type: alertCategory + id: Buckled + +- type: alertCategory + id: Health + +- type: alertCategory + id: Internals + +- type: alertCategory + id: Stamina + +- type: alertCategory + id: Piloting + +- type: alertCategory + id: Hunger + +- type: alertCategory + id: Thirst + +- type: alertCategory + id: Toxins + +- type: alertCategory + id: Battery diff --git a/Resources/Prototypes/Catalog/Bounties/bounties.yml b/Resources/Prototypes/Catalog/Bounties/bounties.yml index 3c1bd02fcfc..bedfe442872 100644 --- a/Resources/Prototypes/Catalog/Bounties/bounties.yml +++ b/Resources/Prototypes/Catalog/Bounties/bounties.yml @@ -309,6 +309,9 @@ whitelist: tags: - Pie + blacklist: + tags: + - Slice - type: cargoBounty id: BountyPrisonUniform @@ -541,6 +544,12 @@ whitelist: tags: - Fruit + blacklist: + tags: + - Slice + - Cake + - Pie + - Bread - type: cargoBounty id: BountyVegetable @@ -552,6 +561,12 @@ whitelist: tags: - Vegetable + blacklist: + tags: + - Slice + - Cake + - Pie + - Bread - type: cargoBounty id: BountyChili diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_engineering.yml b/Resources/Prototypes/Catalog/Cargo/cargo_engineering.yml index 754e30f133a..7ca6af84518 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_engineering.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_engineering.yml @@ -133,7 +133,7 @@ icon: sprite: Structures/Piping/Atmospherics/Portable/portable_sheater.rsi state: sheaterOff - product: SpaceHeaterAnchored + product: CrateEngineeringSpaceHeater cost: 300 category: cargoproduct-category-name-engineering group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_service.yml b/Resources/Prototypes/Catalog/Cargo/cargo_service.yml index ebcd9dfc5e6..d2ca08e1166 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_service.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_service.yml @@ -173,7 +173,7 @@ icon: sprite: Clothing/Head/Helmets/janitor_bombsuit.rsi state: icon - product: CrateJanitorExplosive + product: ClosetJanitorBombFilled cost: 1000 category: cargoproduct-category-name-service group: market diff --git a/Resources/Prototypes/Catalog/Fills/Crates/engineering.yml b/Resources/Prototypes/Catalog/Fills/Crates/engineering.yml index 03c870fa580..26a8910c735 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/engineering.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/engineering.yml @@ -194,3 +194,13 @@ contents: - id: WeaponParticleDecelerator amount: 3 + +- type: entity + id: CrateEngineeringSpaceHeater + parent: CrateEngineering + name: space heater crate + description: Contains a space heater for climate control. + components: + - type: StorageFill + contents: + - id: SpaceHeaterFlatpack diff --git a/Resources/Prototypes/Catalog/Fills/Crates/engines.yml b/Resources/Prototypes/Catalog/Fills/Crates/engines.yml index 79698b550a7..c37b7b7535a 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/engines.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/engines.yml @@ -42,7 +42,7 @@ components: - type: StorageFill contents: - - id: EmitterFlatpack # TODO change to flatpack + - id: EmitterFlatpack - type: entity id: CrateEngineeringSingularityCollector diff --git a/Resources/Prototypes/Catalog/Fills/Crates/service.yml b/Resources/Prototypes/Catalog/Fills/Crates/service.yml index 35e66ac4d35..5b16b91f8b4 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/service.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/service.yml @@ -321,16 +321,3 @@ prob: 0.1 - id: ShardGlassPlasma prob: 0.1 - -- type: entity - id: CrateJanitorExplosive - parent: ClosetJanitorBomb - name: janitorial bomb suit crate - description: Supplies a bomb suit for cleaning up any explosive compounds, buy one today! - components: - - type: StorageFill - contents: - - id: ClothingOuterSuitJanitorBomb - amount: 1 - - id: ClothingHeadHelmetJanitorBombSuit - amount: 1 diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/engineer.yml b/Resources/Prototypes/Catalog/Fills/Lockers/engineer.yml index d9d9071d444..1bf7a9443b5 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/engineer.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/engineer.yml @@ -94,7 +94,6 @@ - id: GasAnalyzer - id: MedkitOxygenFilled - id: HolofanProjector - - id: DoorRemoteFirefight - id: RCD - id: RCDAmmo @@ -111,7 +110,6 @@ - id: GasAnalyzer - id: MedkitOxygenFilled - id: HolofanProjector - - id: DoorRemoteFirefight - id: RCD - id: RCDAmmo diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/service.yml b/Resources/Prototypes/Catalog/Fills/Lockers/service.yml index 945ae0dd7b8..6d0577a16eb 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/service.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/service.yml @@ -130,7 +130,7 @@ - type: entity id: ClosetJanitorBombFilled parent: ClosetJanitorBomb - suffix: Filled + suffix: DO NOT MAP, Filled components: - type: StorageFill contents: diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/softsuits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/softsuits.yml index 58faf268470..9db1ea2216c 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/softsuits.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/softsuits.yml @@ -37,7 +37,7 @@ parent: ClothingOuterEVASuitBase id: ClothingOuterSuitEmergency name: emergency EVA suit - description: An emergency EVA suit with a built-in helmet. It's horribly slow and lacking in temperature protection, but enough to bide you time from the harsh vaccuum of space. + description: An emergency EVA suit with a built-in helmet. It's horribly slow and lacking in temperature protection, but enough to buy you time from the harsh vaccuum of space. components: - type: Sprite sprite: Clothing/OuterClothing/Suits/eva_emergency.rsi diff --git a/Resources/Prototypes/Entities/Effects/mobspawn.yml b/Resources/Prototypes/Entities/Effects/mobspawn.yml index fb59aa3fc46..2fad68d7f2c 100644 --- a/Resources/Prototypes/Entities/Effects/mobspawn.yml +++ b/Resources/Prototypes/Entities/Effects/mobspawn.yml @@ -1,6 +1,7 @@ - type: entity id: MobSpawnCrabQuartz name: mobspawner quartzcrab + noSpawn: True components: - type: Transform anchored: True @@ -30,6 +31,7 @@ id: MobSpawnCrabIron parent: MobSpawnCrabQuartz name: mobspawner ironcrab + noSpawn: True components: - type: Sprite sprite: /Textures/Effects/mobspawn.rsi @@ -41,6 +43,7 @@ id: MobSpawnCrabSilver parent: MobSpawnCrabQuartz name: mobspawner silvercrab + noSpawn: True components: - type: Sprite sprite: /Textures/Effects/mobspawn.rsi @@ -52,6 +55,7 @@ id: MobSpawnCrabUranium parent: MobSpawnCrabQuartz name: mobspawner uraniumcrab + noSpawn: True components: - type: Sprite sprite: /Textures/Effects/mobspawn.rsi diff --git a/Resources/Prototypes/Entities/Effects/portal.yml b/Resources/Prototypes/Entities/Effects/portal.yml index eb69ac821f5..75300693cd9 100644 --- a/Resources/Prototypes/Entities/Effects/portal.yml +++ b/Resources/Prototypes/Entities/Effects/portal.yml @@ -65,7 +65,7 @@ energy: 1 netsync: false - type: TimedDespawn - lifetime: 120 + lifetime: 1 - type: Portal canTeleportToOtherMaps: true diff --git a/Resources/Prototypes/Entities/Effects/wallspawn.yml b/Resources/Prototypes/Entities/Effects/wallspawn.yml index f1bd236a8ab..7213763c469 100644 --- a/Resources/Prototypes/Entities/Effects/wallspawn.yml +++ b/Resources/Prototypes/Entities/Effects/wallspawn.yml @@ -1,5 +1,6 @@ - type: entity id: WallSpawnAsteroid + noSpawn: True components: - type: Transform anchored: True @@ -28,6 +29,7 @@ - type: entity id: WallSpawnAsteroidUraniumCrab parent: WallSpawnAsteroid + noSpawn: True components: - type: SpawnOnDespawn prototype: AsteroidRockUraniumCrab @@ -35,6 +37,7 @@ - type: entity id: WallSpawnAsteroidUranium parent: WallSpawnAsteroid + noSpawn: True components: - type: SpawnOnDespawn prototype: AsteroidRockUranium @@ -42,6 +45,7 @@ - type: entity id: WallSpawnAsteroidQuartzCrab parent: WallSpawnAsteroid + noSpawn: True components: - type: SpawnOnDespawn prototype: AsteroidRockQuartzCrab @@ -49,6 +53,7 @@ - type: entity id: WallSpawnAsteroidQuartz parent: WallSpawnAsteroid + noSpawn: True components: - type: SpawnOnDespawn prototype: AsteroidRockQuartz @@ -56,6 +61,7 @@ - type: entity id: WallSpawnAsteroidSilverCrab parent: WallSpawnAsteroid + noSpawn: True components: - type: SpawnOnDespawn prototype: AsteroidRockSilverCrab @@ -63,6 +69,7 @@ - type: entity id: WallSpawnAsteroidSilver parent: WallSpawnAsteroid + noSpawn: True components: - type: SpawnOnDespawn prototype: AsteroidRockSilver @@ -70,6 +77,7 @@ - type: entity id: WallSpawnAsteroidIronCrab parent: WallSpawnAsteroid + noSpawn: True components: - type: SpawnOnDespawn prototype: AsteroidRockTinCrab @@ -77,6 +85,7 @@ - type: entity id: WallSpawnAsteroidIron parent: WallSpawnAsteroid + noSpawn: True components: - type: SpawnOnDespawn prototype: AsteroidRockTin \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml b/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml index 25d1330d06b..7942d26f321 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml @@ -102,6 +102,33 @@ - sprite: Structures/Wallmounts/signs.rsi state: radiation +- type: entity + noSpawn: true + parent: SpawnPointLoneNukeOperative + id: SpawnPointNukeopsCommander + components: + - type: GhostRole + name: roles-antag-nuclear-operative-commander-name + description: roles-antag-nuclear-operative-commander-objective + +- type: entity + noSpawn: true + parent: SpawnPointLoneNukeOperative + id: SpawnPointNukeopsMedic + components: + - type: GhostRole + name: roles-antag-nuclear-operative-agent-name + description: roles-antag-nuclear-operative-agent-objective + +- type: entity + noSpawn: true + parent: SpawnPointLoneNukeOperative + id: SpawnPointNukeopsOperative + components: + - type: GhostRole + name: roles-antag-nuclear-operative-name + description: roles-antag-nuclear-operative-objective + - type: entity parent: MarkerBase id: SpawnPointGhostDragon diff --git a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml index 2d0677b681d..7e98e36dbe6 100644 --- a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml +++ b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml @@ -287,3 +287,5 @@ - type: Vocal sounds: Unsexed: UnisexSiliconSyndicate + - type: PointLight + color: "#dd200b" diff --git a/Resources/Prototypes/Entities/Mobs/Cyborgs/borg_chassis.yml b/Resources/Prototypes/Entities/Mobs/Cyborgs/borg_chassis.yml index 7bad3bd09c9..c7cfdf68462 100644 --- a/Resources/Prototypes/Entities/Mobs/Cyborgs/borg_chassis.yml +++ b/Resources/Prototypes/Entities/Mobs/Cyborgs/borg_chassis.yml @@ -316,8 +316,6 @@ shader: unshaded map: ["light"] visible: false - - type: PointLight - color: "#dd200b" - type: BorgChassis maxModules: 3 moduleWhitelist: @@ -358,6 +356,9 @@ noMindState: synd_medical - type: Construction node: syndicatemedical + - type: ShowHealthBars + damageContainers: + - Biological - type: entity id: BorgChassisSyndicateSaboteur @@ -387,3 +388,7 @@ noMindState: synd_engi - type: Construction node: syndicatesaboteur + - type: ShowHealthBars + damageContainers: + - Inorganic + - Silicon diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/miscellaneous.yml b/Resources/Prototypes/Entities/Mobs/NPCs/miscellaneous.yml index f77429d5978..e09d3917c75 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/miscellaneous.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/miscellaneous.yml @@ -114,13 +114,22 @@ - trigger: !type:DamageTypeTrigger damageType: Blunt - damage: 100 + damage: 40 behaviors: - - !type:GibBehavior { } + - !type:SpawnEntitiesBehavior + spawn: + FoodMeatTomato: + min: 1 + max: 2 + - !type:DoActsBehavior + acts: ["Destruction"] + - !type:PlaySoundBehavior + sound: + collection: gib - type: MobThresholds thresholds: 0: Alive - 24: Dead + 35: Dead - type: Fixtures fixtures: fix1: @@ -136,7 +145,7 @@ hidden: true damage: groups: - Brute: 4 + Brute: 9 animation: WeaponArcBite - type: Climbing - type: NameIdentifier @@ -156,3 +165,13 @@ - type: Appearance - type: Produce seedId: killerTomato + - type: PassiveDamage # Slight passive damage. 35 hp \ 5 min \ 60 sec = 0.08 + allowedStates: + - Alive + - Dead + damageCap: 50 + damage: + types: + Blunt: 0.11 + - type: StaticPrice + price: 400 diff --git a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml index 3d9814be68c..f786bafddf7 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml @@ -90,6 +90,7 @@ - type: InventorySlots - type: Loadout prototypes: [ MobAghostGear ] + - type: BypassInteractionChecks - type: entity id: ActionAGhostShowSolar diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/bread.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/bread.yml index 7600882925a..12a6e2a246b 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/bread.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/bread.yml @@ -34,7 +34,9 @@ flavors: - bread - type: Tag - tags: [] #override bread + tags: + - Bread + - Slice - type: SolutionContainerManager solutions: food: @@ -116,6 +118,8 @@ - type: Tag tags: - Fruit + - Bread + - Slice - type: entity name: cornbread @@ -274,6 +278,8 @@ - type: Tag tags: - Meat + - Bread + - Slice - type: entity name: mimana bread @@ -418,6 +424,8 @@ - type: Tag tags: - Meat + - Bread + - Slice - type: entity name: spider meat bread @@ -476,6 +484,8 @@ - type: Tag tags: - Meat + - Bread + - Slice - type: entity name: tofu bread @@ -585,6 +595,8 @@ - type: Tag tags: - Meat + - Bread + - Slice # Other than bread/slices @@ -594,9 +606,6 @@ id: FoodBreadBaguette description: Bon appétit! components: - - type: Tag - tags: - - Baguette - type: Sprite state: baguette - type: SliceableFood @@ -824,6 +833,7 @@ tags: - VimPilot - DoorBumpOpener + - Bread - type: CanEscapeInventory baseResistTime: 2 - type: Puller diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml index c939dec52c6..922d4938885 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml @@ -23,6 +23,9 @@ Quantity: 5 - type: Item size: Normal + - type: Tag + tags: + - Cake - type: entity parent: FoodCakeBase @@ -45,6 +48,10 @@ Quantity: 1 - type: Item size: Tiny + - type: Tag + tags: + - Cake + - Slice # Custom Cake Example @@ -63,6 +70,7 @@ slice: FoodCakeBlueberrySlice - type: Tag tags: + - Cake - Fruit - type: entity @@ -78,7 +86,9 @@ color: blue - type: Tag tags: + - Cake - Fruit + - Slice # Cake @@ -203,6 +213,7 @@ slice: FoodCakeOrangeSlice - type: Tag tags: + - Cake - Fruit - type: entity @@ -214,7 +225,9 @@ state: orange-slice - type: Tag tags: + - Cake - Fruit + - Slice # Tastes like sweetness, cake, oranges. - type: entity @@ -229,6 +242,7 @@ slice: FoodCakeLimeSlice - type: Tag tags: + - Cake - Fruit - type: entity @@ -240,7 +254,9 @@ state: lime-slice - type: Tag tags: + - Cake - Fruit + - Slice # Tastes like sweetness, cake, limes. - type: entity @@ -255,6 +271,7 @@ slice: FoodCakeLemonSlice - type: Tag tags: + - Cake - Fruit - type: entity @@ -266,7 +283,9 @@ state: lemon-slice - type: Tag tags: + - Cake - Fruit + - Slice # Tastes like sweetness, cake, lemons. - type: entity @@ -296,6 +315,7 @@ Quantity: 5 - type: Tag tags: + - Cake - Fruit - type: entity @@ -323,7 +343,9 @@ Quantity: 1 - type: Tag tags: + - Cake - Fruit + - Slice - type: entity name: chocolate cake @@ -379,6 +401,7 @@ slice: FoodCakeAppleSlice - type: Tag tags: + - Cake - Fruit - type: entity @@ -391,7 +414,9 @@ state: apple-slice - type: Tag tags: + - Cake - Fruit + - Slice # Tastes like sweetness, cake, slime. - type: entity @@ -436,6 +461,7 @@ Quantity: 11 - type: Tag tags: + - Cake - Fruit - type: entity @@ -457,7 +483,9 @@ Quantity: 2.2 - type: Tag tags: + - Cake - Fruit + - Slice # Tastes like sweetness, cake, pumpkin. - type: entity @@ -686,6 +714,7 @@ tags: - VimPilot - DoorBumpOpener + - Cake - type: CanEscapeInventory baseResistTime: 2 - type: Puller @@ -752,3 +781,6 @@ color: "#FFFF00" radius: 1.4 energy: 1.4 + - type: Tag + tags: + - Slice diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/misc.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/misc.yml index b1bbdfb5305..fde181d8b9b 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/misc.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/misc.yml @@ -163,9 +163,6 @@ # Nuggets -- type: Tag - id: Nugget - - type: entity name: chicken nugget parent: FoodBakedBase @@ -530,6 +527,9 @@ Quantity: 5 - ReagentId: Theobromine Quantity: 3 + - type: Tag + tags: + - Slice - type: entity name: special brownies @@ -585,6 +585,9 @@ Quantity: 3 - ReagentId: THC Quantity: 25 + - type: Tag + tags: + - Slice - type: entity name: onion rings diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pie.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pie.yml index 8cd1c5dfab6..f97d87a9c50 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pie.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pie.yml @@ -52,6 +52,10 @@ Quantity: 1.2 - ReagentId: Vitamin Quantity: 1 + - type: Tag + tags: + - Pie + - Slice # Pie @@ -94,6 +98,7 @@ tags: - Fruit - Pie + - Slice # Tastes like pie, apple. - type: entity @@ -182,6 +187,7 @@ tags: - Fruit - Pie + - Slice # Tastes like pie, cream, banana. - type: entity @@ -224,6 +230,7 @@ tags: - Fruit - Pie + - Slice # Tastes like pie, blackberries. - type: entity @@ -263,6 +270,7 @@ tags: - Fruit - Pie + - Slice # Tastes like pie, cherries. - type: entity @@ -302,6 +310,7 @@ tags: - Meat - Pie + - Slice # Tastes like pie, meat. - type: entity @@ -342,6 +351,7 @@ tags: - Meat - Pie + - Slice # Tastes like pie, meat, acid. - type: entity diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pizza.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pizza.yml index bdce1d44086..154f34063c8 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pizza.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pizza.yml @@ -59,6 +59,7 @@ tags: - Pizza - ReptilianFood + - Slice # Pizza @@ -135,6 +136,7 @@ tags: - Meat - Pizza + - Slice # Tastes like crust, tomato, cheese, meat. - type: entity @@ -291,6 +293,7 @@ tags: - Meat - Pizza + - Slice # Tastes like crust, tomato, cheese, meat, laziness. - type: entity @@ -391,6 +394,7 @@ tags: - Meat - Pizza + - Slice # Tastes like crust, tomato, cheese, sausage, sass. - type: entity @@ -411,9 +415,13 @@ - state: pineapple - type: SliceableFood slice: FoodPizzaPineappleSlice + - type: Tag + tags: + - Meat + - Pizza - type: entity - name: slice of pineapple pizza + name: slice of Hawaiian pizza parent: FoodPizzaSliceBase id: FoodPizzaPineappleSlice description: A slice of joy/sin. @@ -432,6 +440,7 @@ tags: - Meat - Pizza + - Slice # Tastes like crust, tomato, cheese, pineapple, ham. #TODO: This is a meme pizza from /tg/. It has specially coded mechanics. @@ -504,6 +513,7 @@ tags: - Meat - Pizza + - Slice # Tastes like crust, tomato, cheese, pepperoni, 9 millimeter bullets. #TODO: Make this do poison damage and make cut pizza slices eventually rot into this. diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/ingredients.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/ingredients.yml index 1df6615a9fb..dcf2f3355ce 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/ingredients.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/ingredients.yml @@ -302,6 +302,9 @@ - dough - type: Sprite state: dough-slice + - type: Tag + tags: + - Slice - type: entity name: cornmeal dough @@ -331,6 +334,9 @@ - dough - type: Sprite state: cornmealdough-slice + - type: Tag + tags: + - Slice - type: entity name: tortilla dough @@ -363,6 +369,9 @@ - type: Construction graph: Tortilla node: start + - type: Tag + tags: + - Slice - type: entity name: flattened tortilla dough @@ -503,6 +512,9 @@ reagents: - ReagentId: Nutriment Quantity: 5 + - type: Tag + tags: + - Slice - type: entity name: chèvre log @@ -550,6 +562,9 @@ Quantity: 1 - ReagentId: Vitamin Quantity: 0.2 + - type: Tag + tags: + - Slice - type: entity name: tofu @@ -595,6 +610,9 @@ Quantity: 3 - ReagentId: Nutriment Quantity: 2 + - type: Tag + tags: + - Slice - type: entity name: burned mess diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml index 81c98750dc2..bb0f05c1814 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml @@ -599,6 +599,8 @@ - type: SliceableFood count: 3 slice: FoodMeatTomatoCutlet + - type: StaticPrice + price: 100 - type: entity name: salami @@ -1270,6 +1272,8 @@ - type: Sprite state: salami-slice color: red + - type: StaticPrice + price: 30 - type: entity name: salami slice diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml index 1bd895829bd..a74e3450e94 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml @@ -1065,6 +1065,9 @@ state: slice - type: Extractable grindableSolutionName: food + - type: Tag + tags: + - Slice - type: entity name: pineapple slice @@ -1085,6 +1088,7 @@ - type: Tag tags: - Fruit + - Slice - type: entity name: onion slice @@ -1108,6 +1112,10 @@ Quantity: 1 - ReagentId: Vitamin Quantity: 1 + - type: Tag + tags: + - Vegetable + - Slice - type: entity name: red onion slice @@ -1131,6 +1139,10 @@ Quantity: 1 - ReagentId: Vitamin Quantity: 1 + - type: Tag + tags: + - Vegetable + - Slice - type: entity name: chili pepper @@ -1647,6 +1659,10 @@ reagents: - ReagentId: JuiceWatermelon Quantity: 4 + - type: Tag + tags: + - Fruit + - Slice - type: entity name: grapes diff --git a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/cannons.yml b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/cannons.yml new file mode 100644 index 00000000000..6db7f4b385e --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/cannons.yml @@ -0,0 +1,92 @@ +# Most of these have DO NOT MAP, since stations are completely unequipped to deal with ship combat + these are basically placeholder. + +- type: entity + id: ShuttleGunSvalinnMachineGunCircuitboard + parent: BaseMachineCircuitboard + name: LSE-400c "Svalinn machine gun" machine board + description: A machine printed circuit board for an LSE-400c "Svalinn machine gun" + suffix: DO NOT MAP, Machine Board + components: + - type: Sprite + state: security + - type: MachineBoard + prototype: ShuttleGunSvalinnMachineGun + requirements: + MatterBin: 2 + Manipulator: 4 + materialRequirements: + Steel: 5 + CableHV: 5 + +- type: entity + id: ShuttleGunPerforatorCircuitboard + parent: BaseMachineCircuitboard + name: LSE-1200c "Perforator" machine board + description: A machine printed circuit board for an LSE-1200c "Perforator" + suffix: DO NOT MAP, Machine Board + components: + - type: Sprite + state: security + - type: MachineBoard + prototype: ShuttleGunPerforator + requirements: + MatterBin: 4 + Manipulator: 6 + materialRequirements: + Steel: 10 + CableHV: 5 + +- type: entity + id: ShuttleGunFriendshipCircuitboard + parent: BaseMachineCircuitboard + name: EXP-320g "Friendship" machine board + description: A machine printed circuit board for an EXP-320g "Friendship" + suffix: DO NOT MAP, Machine Board + components: + - type: Sprite + state: security + - type: MachineBoard + prototype: ShuttleGunFriendship + requirements: + MatterBin: 3 + Manipulator: 2 + materialRequirements: + Steel: 7 + CableHV: 5 + +- type: entity + id: ShuttleGunDusterCircuitboard + parent: BaseMachineCircuitboard + name: EXP-2100g "Duster" machine board + description: A machine printed circuit board for an EXP-2100g "Duster" + suffix: DO NOT MAP, Machine Board + components: + - type: Sprite + state: security + - type: MachineBoard + prototype: ShuttleGunDuster + requirements: + MatterBin: 6 + Manipulator: 4 + materialRequirements: + Steel: 10 + CableHV: 5 + Uranium: 2 + +- type: entity + id: ShuttleGunKineticCircuitboard + parent: BaseMachineCircuitboard + name: PTK-800 "Matter Dematerializer" machine board + description: A machine printed circuit board for an PTK-800 "Matter Dematerializer" + suffix: DO NOT MAP, Machine Board + components: + - type: Sprite + state: security + - type: MachineBoard + prototype: ShuttleGunKinetic + requirements: + MatterBin: 2 + Manipulator: 3 + materialRequirements: + Steel: 5 + CableHV: 2 \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml index 7f25d00a05f..587e56865b4 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml @@ -1277,92 +1277,6 @@ CableHV: 5 Uranium: 2 -- type: entity - id: ShuttleGunSvalinnMachineGunCircuitboard - parent: BaseMachineCircuitboard - name: LSE-400c "Svalinn machine gun" machine board - description: A machine printed circuit board for an LSE-400c "Svalinn machine gun" - components: - - type: Sprite - state: security - - type: MachineBoard - prototype: ShuttleGunSvalinnMachineGun - requirements: - MatterBin: 2 - Manipulator: 4 - materialRequirements: - Steel: 5 - CableHV: 5 - -- type: entity - id: ShuttleGunPerforatorCircuitboard - parent: BaseMachineCircuitboard - name: LSE-1200c "Perforator" machine board - description: A machine printed circuit board for an LSE-1200c "Perforator" - components: - - type: Sprite - state: security - - type: MachineBoard - prototype: ShuttleGunPerforator - requirements: - MatterBin: 4 - Manipulator: 6 - materialRequirements: - Steel: 10 - CableHV: 5 - -- type: entity - id: ShuttleGunFriendshipCircuitboard - parent: BaseMachineCircuitboard - name: EXP-320g "Friendship" machine board - description: A machine printed circuit board for an EXP-320g "Friendship" - components: - - type: Sprite - state: security - - type: MachineBoard - prototype: ShuttleGunFriendship - requirements: - MatterBin: 3 - Manipulator: 2 - materialRequirements: - Steel: 7 - CableHV: 5 - -- type: entity - id: ShuttleGunDusterCircuitboard - parent: BaseMachineCircuitboard - name: EXP-2100g "Duster" machine board - description: A machine printed circuit board for an EXP-2100g "Duster" - components: - - type: Sprite - state: security - - type: MachineBoard - prototype: ShuttleGunDuster - requirements: - MatterBin: 6 - Manipulator: 4 - materialRequirements: - Steel: 10 - CableHV: 5 - Uranium: 2 - -- type: entity - id: ShuttleGunKineticCircuitboard - parent: BaseMachineCircuitboard - name: PTK-800 "Matter Dematerializer" machine board - description: A machine printed circuit board for an PTK-800 "Matter Dematerializer" - components: - - type: Sprite - state: security - - type: MachineBoard - prototype: ShuttleGunKinetic - requirements: - MatterBin: 2 - Manipulator: 3 - materialRequirements: - Steel: 5 - CableHV: 2 - - type: entity parent: BaseMachineCircuitboard id: ReagentGrinderIndustrialMachineCircuitboard diff --git a/Resources/Prototypes/Entities/Objects/Devices/door_remote.yml b/Resources/Prototypes/Entities/Objects/Devices/door_remote.yml index 25ac56a6dab..a368ec2b65d 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/door_remote.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/door_remote.yml @@ -142,24 +142,6 @@ groups: - Engineering -- type: entity - parent: DoorRemoteDefault - id: DoorRemoteFirefight - name: fire-fighting door remote - description: A gadget which can open and bolt FireDoors remotely. - components: - - type: Sprite - layers: - - state: door_remotebase - - state: door_remotelightscolour - color: "#ff9900" - - state: door_remotescreencolour - color: "#e02020" - - - type: Access - groups: - - FireFight - - type: entity parent: DoorRemoteDefault id: DoorRemoteAll diff --git a/Resources/Prototypes/Entities/Objects/Devices/flatpack.yml b/Resources/Prototypes/Entities/Objects/Devices/flatpack.yml index 2aecd132880..e3e77d5c88e 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/flatpack.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/flatpack.yml @@ -195,3 +195,12 @@ - state: overlay color: "#cec8ac" - state: icon-default + +- type: entity + parent: BaseFlatpack + id: SpaceHeaterFlatpack + name: space heater flatpack + description: A flatpack used for constructing a space heater. + components: + - type: Flatpack + entity: SpaceHeaterAnchored diff --git a/Resources/Prototypes/Entities/Objects/Fun/Instruments/base_instruments.yml b/Resources/Prototypes/Entities/Objects/Fun/Instruments/base_instruments.yml index 684260b737f..122ff42eb20 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/Instruments/base_instruments.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/Instruments/base_instruments.yml @@ -29,7 +29,7 @@ components: - type: Instrument - type: ActivatableUI - allowSpectator: false # otherwise they can play client-side music + blockSpectators: true # otherwise they can play client-side music inHandsOnly: false singleUser: true requireHands: true diff --git a/Resources/Prototypes/Entities/Objects/Fun/darts.yml b/Resources/Prototypes/Entities/Objects/Fun/darts.yml index 4c7ae68420b..36c841995e5 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/darts.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/darts.yml @@ -126,6 +126,7 @@ maxVol: 7 - type: SolutionInjectOnEmbed transferAmount: 7 + blockSlots: NONE solution: melee - type: SolutionTransfer maxTransferAmount: 7 diff --git a/Resources/Prototypes/Entities/Objects/Misc/implanters.yml b/Resources/Prototypes/Entities/Objects/Misc/implanters.yml index 9ab3f356acd..09d345b1792 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/implanters.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/implanters.yml @@ -248,7 +248,7 @@ - type: entity id: MindShieldImplanter - name: mind-shield implanter + name: mindshield implanter parent: BaseImplantOnlyImplanter components: - type: Implanter diff --git a/Resources/Prototypes/Entities/Objects/Misc/paper.yml b/Resources/Prototypes/Entities/Objects/Misc/paper.yml index ba9663cd807..7a20c4e95e5 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/paper.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/paper.yml @@ -85,9 +85,14 @@ description: 'A crumpled up piece of white paper.' components: - type: Sprite - sprite: Objects/Misc/bureaucracy.rsi layers: - state: scrap + - state: paper_words + map: ["enum.PaperVisualLayers.Writing"] + visible: false + - state: paper_stamp-generic + map: ["enum.PaperVisualLayers.Stamp"] + visible: false - type: entity name: office paper @@ -108,7 +113,6 @@ description: 'The readout of a device forgotten to time' components: - type: Sprite - sprite: Objects/Misc/bureaucracy.rsi layers: - state: paper_dotmatrix - state: paper_dotmatrix_words @@ -139,7 +143,6 @@ description: "A page of the captain's journal. In luxurious lavender." components: - type: Sprite - sprite: Objects/Misc/bureaucracy.rsi layers: - state: paper color: "#e6e6fa" @@ -166,7 +169,6 @@ description: 'A single unit of bureaucracy.' components: - type: Sprite - sprite: Objects/Misc/bureaucracy.rsi layers: - state: paper color: "#9ef5ff" @@ -196,7 +198,6 @@ description: A paper label designating a crate as containing a bounty. Selling a crate with this label will fulfill the bounty. components: - type: Sprite - sprite: Objects/Misc/bureaucracy.rsi layers: - state: paper color: "#f7e574" @@ -236,7 +237,6 @@ escapeFormatting: false content: book-cnc-sheet - type: Sprite - sprite: Objects/Misc/bureaucracy.rsi layers: - state: paper color: "#cccccc" @@ -260,18 +260,11 @@ id: PaperWritten noSpawn: true components: - - type: Paper - type: Sprite layers: # Changing it here is fine - if the PaperStatus key is actually added, # something happened, so that ought to override this either way. - state: paper_words - - type: ActivatableUI - key: enum.PaperUiKey.Key - - type: UserInterface - interfaces: - enum.PaperUiKey.Key: - type: PaperBoundUserInterface - type: entity parent: Paper @@ -280,7 +273,6 @@ components: - type: NukeCodePaper allNukesAvailable: true - - type: Paper - type: entity parent: NukeCodePaper @@ -352,7 +344,6 @@ suffix: Red components: - type: Sprite - sprite: Objects/Misc/bureaucracy.rsi layers: - state: folder-colormap color: "#cc2323" @@ -364,7 +355,6 @@ suffix: Blue components: - type: Sprite - sprite: Objects/Misc/bureaucracy.rsi layers: - state: folder-colormap color: "#355d99" @@ -376,7 +366,6 @@ suffix: Yellow components: - type: Sprite - sprite: Objects/Misc/bureaucracy.rsi layers: - state: folder-colormap color: "#b38e3c" @@ -388,7 +377,6 @@ suffix: White components: - type: Sprite - sprite: Objects/Misc/bureaucracy.rsi layers: - state: folder-white - state: folder-base @@ -399,7 +387,6 @@ suffix: Grey components: - type: Sprite - sprite: Objects/Misc/bureaucracy.rsi layers: - state: folder-colormap color: "#999999" @@ -411,7 +398,6 @@ suffix: Black components: - type: Sprite - sprite: Objects/Misc/bureaucracy.rsi layers: - state: folder-colormap color: "#3f3f3f" @@ -423,7 +409,6 @@ suffix: Green components: - type: Sprite - sprite: Objects/Misc/bureaucracy.rsi layers: - state: folder-colormap color: "#43bc38" @@ -437,7 +422,6 @@ description: CentCom's miserable little pile of secrets! components: - type: Sprite - sprite: Objects/Misc/bureaucracy.rsi layers: - state: folder-centcom - state: folder-base @@ -520,15 +504,12 @@ - state: clipboard_over - type: Item sprite: Objects/Misc/cc-clipboard.rsi - size: Small - type: Clothing - slots: [belt] - quickEquip: false sprite: Objects/Misc/cc-clipboard.rsi - type: entity id: BoxFolderQmClipboard - parent: BoxFolderBase + parent: BoxFolderClipboard name: requisition digi-board description: A bulky electric clipboard, filled with shipping orders and financing details. With so many compromising documents, you ought to keep this safe. components: @@ -543,11 +524,6 @@ map: ["qm_clipboard_pen"] visible: false - state: qm_clipboard_over - - type: ContainerContainer - containers: - storagebase: !type:Container - ents: [] - pen_slot: !type:ContainerSlot {} - type: ItemSlots slots: pen_slot: @@ -560,18 +536,13 @@ sprite: Objects/Misc/qm_clipboard.rsi size: Normal - type: Clothing - slots: [belt] - quickEquip: false sprite: Objects/Misc/qm_clipboard.rsi - type: Storage grid: - 0,0,4,3 quickInsert: true - whitelist: - tags: - - Document - type: StorageFill - contents: [] #to override base folder fill + contents: [] #to override base clipboard fill - type: ItemMapper mapLayers: qm_clipboard_paper: @@ -593,7 +564,6 @@ enum.StorageUiKey.Key: type: StorageBoundUserInterface - type: MeleeWeapon - wideAnimationRotation: 180 damage: types: Blunt: 10 diff --git a/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml b/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml index a0f5e254d5f..c92985c2cba 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml @@ -317,7 +317,7 @@ - type: entity parent: BaseSubdermalImplant id: MindShieldImplant - name: mind-shield implant + name: mindshield implant description: This implant will ensure loyalty to Nanotrasen and prevent mind control devices. noSpawn: true components: diff --git a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/artifact_equipment.yml b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/artifact_equipment.yml index e1716f08439..f2f1cb8ac02 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/artifact_equipment.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/artifact_equipment.yml @@ -7,7 +7,7 @@ - type: Transform noRot: true - type: AccessReader - access: [["Research"], ["Salvage"]] + access: [["Research"], ["Cargo"]] - type: Lock - type: ResistLocker - type: Sprite diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_wieldable.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_wieldable.yml index cf858e17374..690658d0c70 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_wieldable.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_wieldable.yml @@ -4,6 +4,7 @@ abstract: true components: - type: Wieldable + unwieldOnUse: false - type: GunWieldBonus minAngle: -20 maxAngle: -30 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml index 7bcd5b496fc..5cd1dcefb13 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml @@ -212,7 +212,7 @@ deconstructionTarget: null - type: entity - name: sawn-off shogun + name: sawn-off shotgun parent: WeaponShotgunSawn id: WeaponShotgunSawnEmpty description: Groovy! Uses .50 shotgun shells. diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml index 0261bd8cadd..b1d260c3276 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml @@ -320,11 +320,12 @@ emptyCase: { state: empty } wiredCase: { state: wired } caseWithTrigger: { state: no-payload } + caseWithPayload: { state: no-trigger } grenade: { state: complete } enum.Trigger.TriggerVisuals.VisualState: enum.ConstructionVisuals.Layer: Primed: { state: primed } - Unprimed: { state: complete } + # Unprimed: - type: StaticPrice price: 25 diff --git a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml index fcdb432dce6..c098409f3aa 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml @@ -105,9 +105,8 @@ arc: 360 - type: StaticPrice price: 150 - - type: DoorBolt - - type: AccessReader - access: [ [ "Engineering" ] ] + - type: PryUnpowered + pryModifier: 0.5 - type: entity id: Firelock diff --git a/Resources/Prototypes/Entities/Structures/Machines/hotplate.yml b/Resources/Prototypes/Entities/Structures/Machines/hotplate.yml index 05cbb60ed30..3764f135915 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/hotplate.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/hotplate.yml @@ -15,7 +15,9 @@ mask: - TabletopMachineMask layer: - - TabletopMachineLayer + - Impassable + - MidImpassable + - LowImpassable hard: false - type: ApcPowerReceiver powerLoad: 300 diff --git a/Resources/Prototypes/Entities/Structures/Machines/microwave.yml b/Resources/Prototypes/Entities/Structures/Machines/microwave.yml index d78960030d6..fe4eb145183 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/microwave.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/microwave.yml @@ -58,7 +58,6 @@ - TabletopMachineMask layer: - TabletopMachineLayer - hard: false - type: Sprite sprite: Structures/Machines/microwave.rsi drawdepth: SmallObjects diff --git a/Resources/Prototypes/Entities/Structures/Machines/reagent_grinder.yml b/Resources/Prototypes/Entities/Structures/Machines/reagent_grinder.yml index 9894a2691fe..d6e73333133 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/reagent_grinder.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/reagent_grinder.yml @@ -32,7 +32,6 @@ - TabletopMachineMask layer: - TabletopMachineLayer - hard: false - type: Sprite sprite: Structures/Machines/juicer.rsi drawdepth: SmallObjects diff --git a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/binary.yml b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/binary.yml index fa5804c6452..213b0b893d9 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/binary.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/binary.yml @@ -358,6 +358,7 @@ - type: PipeColorVisuals - type: Rotatable - type: GasRecycler + - type: PipeRestrictOverlap - type: NodeContainer nodes: inlet: diff --git a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/pipes.yml b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/pipes.yml index 0025fc5ae1b..c2fc4e0565b 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/pipes.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/pipes.yml @@ -51,6 +51,7 @@ - type: Appearance - type: PipeColorVisuals - type: NodeContainer + - type: PipeRestrictOverlap - type: AtmosUnsafeUnanchor - type: AtmosPipeColor - type: Tag diff --git a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml index c0664602b49..d301f43c788 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml @@ -246,6 +246,7 @@ key: enum.ThermomachineUiKey.Key - type: WiresPanel - type: WiresVisuals + - type: PipeRestrictOverlap - type: NodeContainer nodes: pipe: @@ -420,6 +421,7 @@ - type: GasCondenser - type: AtmosPipeColor - type: AtmosDevice + - type: PipeRestrictOverlap - type: ApcPowerReceiver powerLoad: 10000 - type: Machine diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/teg.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/teg.yml index 9a378c26a44..78d979ab8eb 100644 --- a/Resources/Prototypes/Entities/Structures/Power/Generation/teg.yml +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/teg.yml @@ -176,6 +176,7 @@ nodeGroupID: Teg - type: AtmosUnsafeUnanchor + - type: PipeRestrictOverlap - type: TegCirculator - type: StealTarget stealGroup: Teg diff --git a/Resources/Prototypes/Entities/Structures/Shuttles/cannons.yml b/Resources/Prototypes/Entities/Structures/Shuttles/cannons.yml index 3368e2d7ee0..08eff29c81b 100644 --- a/Resources/Prototypes/Entities/Structures/Shuttles/cannons.yml +++ b/Resources/Prototypes/Entities/Structures/Shuttles/cannons.yml @@ -1,3 +1,5 @@ +# Most of these have DO NOT MAP, since stations are completely unequipped to deal with ship combat + these are basically placeholder. + - type: entity id: ShuttleGunBase name: shittle gun @@ -58,7 +60,8 @@ id: ShuttleGunSvalinnMachineGun parent: [ ShuttleGunBase, ConstructibleMachine] name: LSE-400c "Svalinn machine gun" - description: Basic stationary laser unit. Effective against live targets and electronics. Uses regular power cells to fire, and has an extremely high rate of fire + description: Basic stationary laser unit. Effective against live targets and electronics. Uses regular power cells to fire, and has an extremely high rate of fire. + suffix: DO NOT MAP components: - type: Sprite sprite: Objects/Weapons/Guns/Shuttles/laser.rsi @@ -112,6 +115,7 @@ parent: [ ShuttleGunBase, ConstructibleMachine] name: LSE-1200c "Perforator" description: Advanced stationary laser unit. Annihilates electronics and is extremely dangerous to health! Uses the power cage to fire. + suffix: DO NOT MAP components: - type: Sprite sprite: Objects/Weapons/Guns/Shuttles/laser.rsi @@ -167,6 +171,7 @@ parent: [ShuttleGunBase, ConstructibleMachine] name: EXP-320g "Friendship" description: A small stationary grenade launcher that holds 2 grenades. + suffix: DO NOT MAP components: - type: Sprite sprite: Objects/Weapons/Guns/Shuttles/launcher.rsi @@ -220,6 +225,7 @@ parent: [ShuttleGunBase, ConstructibleMachine] name: EXP-2100g "Duster" description: A powerful stationary grenade launcher. A cartridge is required for use. + suffix: DO NOT MAP components: - type: Sprite sprite: Objects/Weapons/Guns/Shuttles/launcher.rsi @@ -317,6 +323,7 @@ parent: [ ShuttleGunBase, ConstructibleMachine] name: PTK-800 "Matter Dematerializer" description: Salvage stationary mining turret. Gradually accumulates charges on its own, extremely effective for asteroid excavation. + suffix: DO NOT MAP components: - type: Sprite sprite: Objects/Weapons/Guns/Shuttles/kinetic.rsi diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/mirror.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/mirror.yml index 1fe3318ef55..27b8390add2 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/mirror.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/mirror.yml @@ -19,6 +19,7 @@ changeSlotTime: 0 - type: ActivatableUI key: enum.MagicMirrorUiKey.Key + singleUser: true - type: UserInterface interfaces: enum.MagicMirrorUiKey.Key: diff --git a/Resources/Prototypes/GameRules/events.yml b/Resources/Prototypes/GameRules/events.yml index cfcedbe0ef1..acc11b50e47 100644 --- a/Resources/Prototypes/GameRules/events.yml +++ b/Resources/Prototypes/GameRules/events.yml @@ -402,9 +402,9 @@ prototype: InitialInfected - type: entity - id: LoneOpsSpawn - parent: BaseGameRule noSpawn: true + parent: BaseNukeopsRule + id: LoneOpsSpawn components: - type: StationEvent earliestStart: 35 @@ -436,9 +436,9 @@ prototype: Nukeops - type: entity - id: SleeperAgentsRule - parent: BaseGameRule noSpawn: true + parent: BaseTraitorRule + id: SleeperAgentsRule components: - type: StationEvent earliestStart: 30 @@ -449,7 +449,6 @@ startAudio: path: /Audio/Announcements/announce.ogg # Sunrise-TTS - type: AlertLevelInterceptionRule - - type: TraitorRule - type: AntagSelection definitions: - prefRoles: [ Traitor ] diff --git a/Resources/Prototypes/GameRules/midround.yml b/Resources/Prototypes/GameRules/midround.yml index 2aef8cdb441..c8823ab2bd1 100644 --- a/Resources/Prototypes/GameRules/midround.yml +++ b/Resources/Prototypes/GameRules/midround.yml @@ -35,7 +35,19 @@ id: Thief components: - type: ThiefRule + - type: AntagObjectives + objectives: + - EscapeThiefShuttleObjective + - type: AntagRandomObjectives + sets: + - groups: ThiefBigObjectiveGroups + prob: 0.7 + maxPicks: 1 + - groups: ThiefObjectiveGroups + maxPicks: 10 + maxDifficulty: 2.5 - type: AntagSelection + agentName: thief-round-end-agent-name definitions: - prefRoles: [ Thief ] maxRange: @@ -53,14 +65,3 @@ prototype: Thief briefing: sound: "/Audio/Misc/thief_greeting.ogg" - -#- type: entity -# noSpawn: true -# parent: BaseGameRule -# id: Exterminator -# components: -# - type: GenericAntagRule -# agentName: terminator-round-end-agent-name -# objectives: -# - TerminateObjective -# - ShutDownObjective diff --git a/Resources/Prototypes/GameRules/roundstart.yml b/Resources/Prototypes/GameRules/roundstart.yml index d87e7ccbe76..93350163f68 100644 --- a/Resources/Prototypes/GameRules/roundstart.yml +++ b/Resources/Prototypes/GameRules/roundstart.yml @@ -64,17 +64,25 @@ roundEndDelay: 10 - type: entity - id: Nukeops + abstract: true parent: BaseGameRule - noSpawn: true + id: BaseNukeopsRule components: - - type: GameRule - minPlayers: 20 - type: RandomMetadata #this generates the random operation name cuz it's cool. nameSegments: - operationPrefix - operationSuffix - type: NukeopsRule + - type: AntagSelection + - type: AntagLoadProfileRule + +- type: entity + noSpawn: true + parent: BaseNukeopsRule + id: Nukeops + components: + - type: GameRule + minPlayers: 20 - type: LoadMapRule gameMap: NukieOutpost - type: AntagSelection @@ -82,8 +90,7 @@ definitions: - prefRoles: [ NukeopsCommander ] fallbackRoles: [ Nukeops, NukeopsMedic ] - max: 1 - playerRatio: 10 + spawnerPrototype: SpawnPointNukeopsCommander startingGear: SyndicateCommanderGearFull components: - type: NukeOperative @@ -99,8 +106,7 @@ prototype: NukeopsCommander - prefRoles: [ NukeopsMedic ] fallbackRoles: [ Nukeops, NukeopsCommander ] - max: 1 - playerRatio: 10 + spawnerPrototype: SpawnPointNukeopsMedic startingGear: SyndicateOperativeMedicFull components: - type: NukeOperative @@ -116,7 +122,7 @@ prototype: NukeopsMedic - prefRoles: [ Nukeops ] fallbackRoles: [ NukeopsCommander, NukeopsMedic ] - min: 0 + spawnerPrototype: SpawnPointNukeopsOperative max: 3 playerRatio: 10 startingGear: SyndicateOperativeGearFull @@ -134,16 +140,30 @@ prototype: Nukeops - type: entity - id: Traitor + abstract: true parent: BaseGameRule + id: BaseTraitorRule + components: + - type: TraitorRule + # TODO: codewords in yml + # TODO: uplink in yml + - type: AntagRandomObjectives + sets: + - groups: TraitorObjectiveGroups + maxDifficulty: 5 + - type: AntagSelection + agentName: traitor-round-end-agent-name + +- type: entity noSpawn: true + parent: BaseTraitorRule + id: Traitor components: - type: GameRule minPlayers: 5 delay: min: 240 max: 420 - - type: TraitorRule - type: AntagSelection definitions: - prefRoles: [ Traitor ] diff --git a/Resources/Prototypes/Maps/Pools/default.yml b/Resources/Prototypes/Maps/Pools/default.yml index 245ccce4b7b..5c6b0eee0d7 100644 --- a/Resources/Prototypes/Maps/Pools/default.yml +++ b/Resources/Prototypes/Maps/Pools/default.yml @@ -15,4 +15,4 @@ - Saltern - Packed - Reach - - Train + #- Train diff --git a/Resources/Prototypes/Objectives/ninja.yml b/Resources/Prototypes/Objectives/ninja.yml index de3849c9449..90896fdb1df 100644 --- a/Resources/Prototypes/Objectives/ninja.yml +++ b/Resources/Prototypes/Objectives/ninja.yml @@ -4,7 +4,7 @@ id: BaseNinjaObjective components: - type: Objective - # difficulty isn't used all since objectives are picked + # difficulty isn't used since all objectives are picked difficulty: 1.5 issuer: spiderclan - type: RoleRequirement diff --git a/Resources/Prototypes/Objectives/objectiveGroups.yml b/Resources/Prototypes/Objectives/objectiveGroups.yml index ce28163fb55..f0704704631 100644 --- a/Resources/Prototypes/Objectives/objectiveGroups.yml +++ b/Resources/Prototypes/Objectives/objectiveGroups.yml @@ -55,13 +55,6 @@ ThiefObjectiveGroupStructure: 0 #Temporarily disabled until obvious ways to steal structures are added ThiefObjectiveGroupAnimal: 2 -- type: weightedRandom - id: ThiefEscapeObjectiveGroups - weights: - ThiefObjectiveGroupEscape: 1 - - - - type: weightedRandom id: ThiefObjectiveGroupCollection weights: diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/weapons/modular_grenade.yml b/Resources/Prototypes/Recipes/Construction/Graphs/weapons/modular_grenade.yml index 020be4e09c3..243a030c981 100644 --- a/Resources/Prototypes/Recipes/Construction/Graphs/weapons/modular_grenade.yml +++ b/Resources/Prototypes/Recipes/Construction/Graphs/weapons/modular_grenade.yml @@ -12,7 +12,7 @@ doAfter: 1 - node: emptyCase - entity: ModularGrenade + entity: ModularGrenade actions: - !type:AppearanceChange edges: @@ -31,7 +31,7 @@ doAfter: 2 - node: wiredCase - entity: ModularGrenade + entity: ModularGrenade actions: - !type:AppearanceChange - !type:PlaySound @@ -50,6 +50,12 @@ store: payloadTrigger name: Trigger doAfter: 0.5 + - to: caseWithPayload + steps: + - tag: Payload + store: payload + name: Payload + doAfter: 0.5 - node: caseWithTrigger actions: @@ -71,6 +77,26 @@ name: Payload doAfter: 0.5 + - node: caseWithPayload + actions: + - !type:AppearanceChange + - !type:PlaySound + sound: /Audio/Machines/button.ogg + edges: + - to: wiredCase + steps: + - tool: Prying + doAfter: 0.5 + completed: + - !type:EmptyContainer + container: payload + - to: grenade + steps: + - component: PayloadTrigger + store: payloadTrigger + name: Trigger + doAfter: 0.5 + - node: grenade actions: - !type:AppearanceChange diff --git a/Resources/Prototypes/SoundCollections/deathgasp.yml b/Resources/Prototypes/SoundCollections/deathgasp.yml new file mode 100644 index 00000000000..28c33c1fb45 --- /dev/null +++ b/Resources/Prototypes/SoundCollections/deathgasp.yml @@ -0,0 +1,23 @@ +- type: soundCollection + id: MaleDeathGasp + files: + - /Audio/Effects/Gasp/male_deathgasp_1.ogg + - /Audio/Effects/Gasp/male_deathgasp_2.ogg + - /Audio/Effects/Gasp/male_deathgasp_3.ogg + - /Audio/Effects/Gasp/male_deathgasp_4.ogg + - /Audio/Effects/Gasp/male_deathgasp_5.ogg + +- type: soundCollection + id: FemaleDeathGasp + files: + - /Audio/Effects/Gasp/female_deathgasp_1.ogg + - /Audio/Effects/Gasp/female_deathgasp_2.ogg + - /Audio/Effects/Gasp/female_deathgasp_3.ogg + - /Audio/Effects/Gasp/female_deathgasp_4.ogg + - /Audio/Effects/Gasp/female_deathgasp_5.ogg + +- type: soundCollection + id: DeathGasp + files: + - /Audio/Effects/Gasp/deathgasp_1.ogg + - /Audio/Effects/Gasp/deathgasp_2.ogg diff --git a/Resources/Prototypes/SoundCollections/gasp.yml b/Resources/Prototypes/SoundCollections/gasp.yml new file mode 100644 index 00000000000..0f1ec51eda0 --- /dev/null +++ b/Resources/Prototypes/SoundCollections/gasp.yml @@ -0,0 +1,12 @@ +- type: soundCollection + id: MaleGasp + files: + - /Audio/Effects/Gasp/gasp_male1.ogg + - /Audio/Effects/Gasp/gasp_male2.ogg + +- type: soundCollection + id: FemaleGasp + files: + - /Audio/Effects/Gasp/gasp_female1.ogg + - /Audio/Effects/Gasp/gasp_female2.ogg + - /Audio/Effects/Gasp/gasp_female3.ogg diff --git a/Resources/Prototypes/Voice/speech_emote_sounds.yml b/Resources/Prototypes/Voice/speech_emote_sounds.yml index e86b05f4c88..3358d5be678 100644 --- a/Resources/Prototypes/Voice/speech_emote_sounds.yml +++ b/Resources/Prototypes/Voice/speech_emote_sounds.yml @@ -34,6 +34,10 @@ collection: Whistles Weh: collection: Weh + Gasp: + collection: MaleGasp + DefaultDeathgasp: + collection: MaleDeathGasp - type: emoteSounds id: FemaleHuman @@ -70,6 +74,10 @@ collection: Whistles Weh: collection: Weh + Gasp: + collection: FemaleGasp + DefaultDeathgasp: + collection: FemaleDeathGasp - type: emoteSounds id: MaleReptilian @@ -88,6 +96,10 @@ collection: MaleCry Weh: collection: Weh + Gasp: + collection: MaleGasp + DefaultDeathgasp: + collection: DeathGasp - type: emoteSounds id: FemaleReptilian @@ -142,6 +154,10 @@ collection: Whistles Weh: collection: Weh + Gasp: + collection: MaleGasp + DefaultDeathgasp: + collection: MaleDeathGasp params: variation: 0.125 @@ -180,6 +196,10 @@ collection: Whistles Weh: collection: Weh + Gasp: + collection: FemaleGasp + DefaultDeathgasp: + collection: FemaleDeathGasp params: variation: 0.125 @@ -205,6 +225,10 @@ collection: BikeHorn Weh: collection: Weh + Gasp: + collection: MaleGasp + DefaultDeathgasp: + collection: DeathGasp params: variation: 0.125 @@ -223,6 +247,10 @@ path: /Audio/Voice/Arachnid/arachnid_click.ogg Weh: collection: Weh + Gasp: + collection: MaleGasp + DefaultDeathgasp: + collection: DeathGasp - type: emoteSounds id: UnisexDwarf @@ -257,6 +285,10 @@ collection: Whistles Weh: collection: Weh + Gasp: + collection: MaleGasp + DefaultDeathgasp: + collection: MaleDeathGasp params: variation: 0.125 pitch: 0.75 @@ -294,6 +326,10 @@ collection: Whistles Weh: collection: Weh + Gasp: + collection: FemaleGasp + DefaultDeathgasp: + collection: FemaleDeathGasp params: variation: 0.125 pitch: 0.75 @@ -315,6 +351,10 @@ path: /Audio/Voice/Moth/moth_squeak.ogg Weh: collection: Weh + Gasp: + collection: MaleGasp + DefaultDeathgasp: + collection: DeathGasp - type: emoteSounds id: UnisexSilicon diff --git a/Resources/Prototypes/Voice/speech_emotes.yml b/Resources/Prototypes/Voice/speech_emotes.yml index 6216f4bfadf..e5aec677a7b 100644 --- a/Resources/Prototypes/Voice/speech_emotes.yml +++ b/Resources/Prototypes/Voice/speech_emotes.yml @@ -1,4 +1,4 @@ -# vocal emotes +# vocal emotes - type: emote id: Scream name: chat-emote-name-scream @@ -469,6 +469,14 @@ - отдала честь! # Corvax-Localization-End +- type: emote + id: Gasp + name: chat-emote-name-gasp + whitelist: + components: + - Respirator + chatMessages: ["chat-emote-msg-gasp"] + - type: emote id: DefaultDeathgasp name: chat-emote-name-deathgasp diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index 253aa485653..439ad47c0f8 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -27,9 +27,6 @@ - type: Tag id: ATVKeys -- type: Tag - id: Baguette - - type: Tag id: Balloon @@ -258,6 +255,9 @@ - type: Tag id: CableCoil +- type: Tag + id: Cake + - type: Tag id: CaneBlade @@ -926,6 +926,9 @@ - type: Tag id: NozzleBackTank +- type: Tag + id: Nugget # for chicken nuggets + - type: Tag id: NukeOpsUplink @@ -1122,6 +1125,9 @@ - type: Tag id: Skewer +- type: Tag + id: Slice # sliced fruit, vegetables, pizza etc. + - type: Tag id: SmallAIChip diff --git a/Resources/Textures/Objects/Weapons/Grenades/modular.rsi/meta.json b/Resources/Textures/Objects/Weapons/Grenades/modular.rsi/meta.json index 3d80b59cf22..b0b12127c59 100644 --- a/Resources/Textures/Objects/Weapons/Grenades/modular.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Grenades/modular.rsi/meta.json @@ -1,34 +1,38 @@ { - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/d91390a4474e511279b6ee7525c5982266b9a858 ", - "size": { - "x": 32, - "y": 32 + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/29c0ed1b000619cb5398ef921000a8d4502ba0b6 and modified by Swept & ElectroSR", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "empty", + "directions": 1 }, - "states": [ - { - "name": "empty", - "directions": 1 - }, - { - "name": "wired", - "directions": 1 - }, - { - "name": "no-payload", - "directions": 1 - }, - { - "name": "complete", - "directions": 1 - }, - { - "name": "primed", - "directions": 1, - "delays": [ - [ 0.2, 0.2 ] - ] - } - ] + { + "name": "wired", + "directions": 1 + }, + { + "name": "no-payload", + "directions": 1 + }, + { + "name": "no-trigger", + "directions": 1 + }, + { + "name": "complete", + "directions": 1 + }, + { + "name": "primed", + "directions": 1, + "delays": [ + [ 0.2, 0.2 ] + ] + } + ] } diff --git a/Resources/Textures/Objects/Weapons/Grenades/modular.rsi/no-trigger.png b/Resources/Textures/Objects/Weapons/Grenades/modular.rsi/no-trigger.png new file mode 100644 index 00000000000..1be2cbc421b Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Grenades/modular.rsi/no-trigger.png differ diff --git a/Resources/migration.yml b/Resources/migration.yml index 28d63be9920..cf1a0f7a602 100644 --- a/Resources/migration.yml +++ b/Resources/migration.yml @@ -339,3 +339,9 @@ DrinkBottleGoldschlager: DrinkBottleGildlager # 2024-05-14 soda_dispenser: SodaDispenser chem_master: ChemMaster + +# 2024-05-21 +CrateJanitorExplosive: ClosetJanitorBombFilled + +# 2024-05-27 +DoorRemoteFirefight: null diff --git a/RobustToolbox b/RobustToolbox index ec794ce4e46..c89c529ba4f 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit ec794ce4e4693069d3b3ebf7a88ead5ff2f860e0 +Subproject commit c89c529ba4fa7516e2265f3c47549da35ab6c3d8